src/hg/instinct/bioInt2/bioIntUI.c 1.2

1.2 2009/03/27 21:56:27 jsanborn
updated
Index: src/hg/instinct/bioInt2/bioIntUI.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/hg/instinct/bioInt2/bioIntUI.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -b -B -U 4 -r1.1 -r1.2
--- src/hg/instinct/bioInt2/bioIntUI.c	27 Mar 2009 20:15:52 -0000	1.1
+++ src/hg/instinct/bioInt2/bioIntUI.c	27 Mar 2009 21:56:27 -0000	1.2
@@ -17,10 +17,13 @@
 #include "ra.h"
 #include "hgStatsLib.h"
 #include "featuresLib.h" 
 #include "json.h"
+#include "bioIntDb.h"
+#include "bioIntDriver.h"
 #include "bioIntUI.h"
 
+
 static char const rcsid[] = "$Id$";
 /* ---- Global variables. ---- */
 struct cart *cart;	         /* This holds cgi and other variables between clicks. */
 struct hash *oldVars;	         /* Old cart hash. */
@@ -24,8 +27,10 @@
 /* ---- Global variables. ---- */
 struct cart *cart;	         /* This holds cgi and other variables between clicks. */
 struct hash *oldVars;	         /* Old cart hash. */
 
+char *db = "bioInt";
+char *localDb = "localDb";
 
 void usage()
 /* Explain usage and exit. */
 {
@@ -39,32 +44,223 @@
 /* get a list of the current analyses */
 void getAnalyses()
 {
 char query[256];
-struct sqlResult *sr = NULL;
-char **row = NULL;
-
 safef(query, sizeof(query),
       "select * from analyses;");
 
-struct sqlConnection *conn = hAllocConnProfile("localDb", "bioInt");
-sr = sqlGetResult(conn,query);
+struct sqlConnection *conn = hAllocConnProfile(localDb, db);
+struct analyses *an, *anList = analysesLoadByQuery(conn, query);
+
 struct json *js = newJson();
 struct json *analysis, *analyses = jsonAddContainerList(js, "analyses");
 analysis = analyses;
-while((row = sqlNextRow(sr)))
-{
-	jsonAddString(analysis, "analysisId", row[0]);
-	jsonAddString(analysis, "analysisName", row[3]);
+for (an = anList; an; an = an->next)
+    {
+    jsonAddInt(analysis, "id", an->id);
+    jsonAddInt(analysis, "cohort_id", an->cohort_id);
+    jsonAddInt(analysis, "module_id", an->module_id);
+    jsonAddString(analysis, "result_table", an->result_table);
+    jsonAddString(analysis, "input_tables", an->input_tables);
+    
+    if (an->next)
 	analysis = jsonAddContainerToList(&analyses);
-}
+    }
+
+if (js)
+    hPrintf("%s\n", js->print(js));
+
 hFreeConn(&conn);
+}
+
+struct analyses *getAnalysesById(struct sqlConnection *conn, int analysis_id)
+{
+char query[256];
+safef(query, sizeof(query), 
+      "select * from %s where id = %d;", 
+      AN_TABLE, analysis_id);
+
+return analysesLoadByQuery(conn, query);
+}
+
+struct analysisFeatures *getAnalysisFeaturesByName(struct sqlConnection *conn, 
+						   char *name)
+{
+char query[256];
+safef(query, sizeof(query), 
+      "select * from %s where feature_name = \"%s\"", 
+      AF_TABLE, name);
+
+return analysisFeaturesLoadByQuery(conn, query);
+}
+
+struct analysisFeatures *getAnalysisFeaturesById(struct sqlConnection *conn, 
+						 int id)
+{
+char query[256];
+safef(query, sizeof(query), 
+      "select * from %s where id = %d", 
+      AF_TABLE, id);
+
+return analysisFeaturesLoadByQuery(conn, query);
+}
+
+
+struct features *getFeaturesByName(struct sqlConnection *conn, 
+				   char *name)
+{
+char query[256];
+safef(query, sizeof(query), 
+      "select * from %s where name = \"%s\"", 
+      FE_TABLE, name);
+
+return featuresLoadByQuery(conn, query);
+}
+
+struct features *getFeaturesById(struct sqlConnection *conn, 
+				 int id)
+{
+char query[256];
+safef(query, sizeof(query), 
+      "select * from %s where id = %d", 
+      FE_TABLE, id);
+
+return featuresLoadByQuery(conn, query);
+}
+
+
+void getFeatureData()
+{
+int analysis_id = cartUsualInt(cart, bioIntAnalysisId, -1);
+if (analysis_id == -1)
+    analysis_id = 0;  // hard code for first analysis during testing!
+
+int feature_id = cartUsualInt(cart, bioIntFeatureId, -1);
+char *feature_name = cartOptionalString(cart, bioIntFeatureName);
+if (!feature_name && feature_id == -1)
+    errAbort("%s or %s must be set for mode=getFeatureData\n", bioIntFeature, bioIntFeatureId);
+
+struct sqlConnection *conn = hAllocConnProfile(localDb, db);
+
+struct analysisFeatures *af = NULL;
+if (feature_id == -1)
+    af = getAnalysisFeaturesByName(conn, feature_name);
+else
+    af = getAnalysisFeaturesById(conn, feature_id);
+
+if (!af)
+    {
+    hFreeConn(&conn);
+    errAbort("Could not find analysisFeature in db");
+    }
+
+struct analyses *an = getAnalysesById(conn, analysis_id);
+if (!an)
+    {
+    hFreeConn(&conn);
+    errAbort("No analysis with id = %d.\n", analysis_id);
+    }
+
+char query[512];
+safef(query, sizeof(query), 
+      "select %s.name, %s.val from %s join %s on %s.sample_id = %s.id "
+      "where %s.feature_id = %d;",
+      SA_TABLE, an->result_table, an->result_table, SA_TABLE, an->result_table, SA_TABLE,
+      an->result_table, af->id);
+
+struct json *js = newJson();
+struct sqlResult *sr = sqlGetResult(conn, query);
+char **row = NULL;
+while ((row = sqlNextRow(sr)) != NULL)
+    { 
+    char *name = row[0];
+    double val = atof(row[1]);
+    jsonAddDouble(js, name, val);
+    }
 
 if (js)
     hPrintf("%s\n", js->print(js));
+
+hFreeConn(&conn);
 }
 
 
+struct datasets *getDatasetsByCohortId(struct sqlConnection *conn, int cohort_id)
+{
+char query[256];
+safef(query, sizeof(query), 
+      "select %s.* from %s join %s on %s.id = %s.dataset_id "
+      "where %s.cohort_id = %d",
+      DA_TABLE, DA_TABLE, DC_TABLE, DA_TABLE, DC_TABLE, DC_TABLE, cohort_id);
+
+return datasetsLoadByQuery(conn, query);
+}
+
+
+void getClinicalData()
+{
+int cohort_id = cartUsualInt(cart, bioIntCohortId, -1);
+if (cohort_id == -1)
+    cohort_id = 0;  // hard code for first analysis during testing!
+
+int feature_id = cartUsualInt(cart, bioIntFeatureId, -1);
+char *feature_name = cartOptionalString(cart, bioIntFeatureName);
+if (!feature_name && feature_id == -1)
+    errAbort("%s or %s must be set for mode=getClinicalData\n", bioIntFeature, bioIntFeatureId);
+
+struct sqlConnection *conn = hAllocConnProfile(localDb, db);
+
+struct features *fe = NULL;
+if (feature_id == -1)
+    fe = getFeaturesByName(conn, feature_name);
+else
+    fe = getFeaturesById(conn, feature_id);
+
+if (!fe)
+    {
+    hFreeConn(&conn);
+    errAbort("Could not find clinical feature in db");
+    }
+
+struct datasets *da, *daList = getDatasetsByCohortId(conn, cohort_id);
+if (!daList)
+    {
+    hFreeConn(&conn);
+    errAbort("No datasets matching cohort_id = %d", cohort_id);
+    }
+
+struct dyString *dy = dyStringNew(100);
+dyStringPrintf(dy, 
+	       "select DISTINCT %s.name, %s.val from %s join %s on %s.sample_id = %s.id ", 
+	       SA_TABLE, CD_TABLE, CD_TABLE, SA_TABLE, CD_TABLE, SA_TABLE);
+dyStringPrintf(dy, 
+	       "where %s.feature_id = %d and %s.dataset_id in (", 
+	       CD_TABLE, fe->id, SA_TABLE);
+
+for (da = daList; da; da = da->next)
+    {
+    dyStringPrintf(dy, "%d", da->id);
+    if (da->next)
+	dyStringPrintf(dy, ",");
+    }
+dyStringPrintf(dy, ")");
+
+char *query = dyStringCannibalize(&dy);
+struct json *js = newJson();
+struct sqlResult *sr = sqlGetResult(conn, query);
+char **row = NULL;
+while ((row = sqlNextRow(sr)) != NULL)
+    { 
+    char *name = row[0];
+    double val = atof(row[1]);
+    jsonAddDouble(js, name, val);
+    }
+
+if (js)
+    hPrintf("%s\n", js->print(js));
+
+hFreeConn(&conn);
+}
 
 void dispatchRoutines()
 /* Look at command variables in cart and figure out which
  * page to draw. */
@@ -75,8 +271,12 @@
     errAbort("%s is required.", bioIntMode);
 
 if (sameString(mode, "getAnalyses"))
     getAnalyses();
+else if (sameString(mode, "getFeatureData"))
+    getFeatureData();
+else if (sameString(mode, "getClinicalData"))
+    getClinicalData();
 else
     errAbort("Incorrect mode = %s", mode);
 
 cartRemovePrefix(cart, bioIntPrefix);