src/hg/instinct/hgPathways/hgPathways.c 1.6

1.6 2009/11/07 00:35:49 sbenz
Bunch of updates to make this work, and slightly change the UI
Index: src/hg/instinct/hgPathways/hgPathways.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/hg/instinct/hgPathways/hgPathways.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -b -B -U 1000000 -r1.5 -r1.6
--- src/hg/instinct/hgPathways/hgPathways.c	15 Sep 2009 00:08:14 -0000	1.5
+++ src/hg/instinct/hgPathways/hgPathways.c	7 Nov 2009 00:35:49 -0000	1.6
@@ -1,374 +1,374 @@
 /*
 Web front-end to the new circle maps
 This file is copyright 2009 Stephen Benz.  All rights reserved.
 */
 
 #include "common.h"
 #include "cheapcgi.h"
 #include "hdb.h"
 #include "jksql.h"
 #include "hgConfig.h"
 #include "customTrack.h"
 #include "customFactory.h"
 #include "errabort.h"
 #include "errCatch.h"
 #include "trashDir.h"
 #include "cart.h"
 #include "web.h"
 #include "hui.h"
 #include "htmshell.h"
 #include "json.h"
 #include "hgHeatmapLib.h"
 #include "heatmapUtility.h"
 #include "hPrint.h"
 #include "hgPathways.h"
 
 struct hash *oldVars;	         /* Old cart hash. */
 struct cart *cart;	         /* This holds cgi and other variables between clicks. */
 
 char *database;
 static char *heatMapDbProfile = "localDb";  // database profile to use
 
 struct hash *ghHash;	         /* Hash of active heatmaps */
 
 char *excludeVars[] = {"Submit", "submit", NULL};
 
 void modeGetPathways()
 {
 char query[256];
 struct sqlResult *sr = NULL;
 char **row = NULL;
 struct json *js = newJson();
 struct json *set = NULL, *group = jsonAddContainerList(js, "pathways");
 
 struct sqlConnection *conn = hAllocConnProfile(heatMapDbProfile, database);
 if (!conn)
     errAbort("Couldn't connect to database");
 
 safef(query, sizeof(query), "SELECT pathway_id,pathway_name FROM %s WHERE 1 ORDER BY pathway_id ASC",
       "entityPathways_ncipid");
 
 sr = sqlGetResult(conn, query);
 while ((row = sqlNextRow(sr)) != NULL)
 {
 	if(set == NULL)
 		set = group;
 	else
     	set = jsonAddContainerToList(&group);
 	jsonAddString(set,"id", row[0]);
 	jsonAddString(set,"name", row[1]);
 }
  
 hPrintf("%s", js->print(js));
 sqlFreeResult(&sr);
 hFreeConn(&conn);
 }
 
 void modeGetLinks()
 {
 char query[512];
 struct sqlResult *sr = NULL;
 char **row = NULL;
 struct json *js = newJson();
 struct json *set = NULL, *group = jsonAddContainerList(js, "pathwayLinks");
 
 char *pathway_id = cartOptionalString(cart, hgh2PathwayID);
 if(!pathway_id)
 	errAbort("Must send hgh2_pathwayID");
 
 struct sqlConnection *conn = hAllocConnProfile(heatMapDbProfile, database);
 if (!conn)
     errAbort("Couldn't connect to database");
 
 safef(query, sizeof(query), "SELECT e1.entity_name,e1.dot_pos,elt.link_name,e2.entity_name,e2.dot_pos FROM entityLinks_ncipid INNER JOIN entityLinkTypes_ncipid elt ON link_type = elt.id INNER JOIN entities_ncipid e1 ON parent_entity = e1.entity_id INNER JOIN entities_ncipid e2 ON child_entity = e2.entity_id  WHERE pathway = '%s'",
       pathway_id);
 
 sr = sqlGetResult(conn, query);
 while ((row = sqlNextRow(sr)) != NULL)
 {
 	if(set == NULL)
 		set = group;
 	else
     	set = jsonAddContainerToList(&group);
 	jsonAddString(set,"parent", row[0]);
 	jsonAddString(set,"parent_pos", row[1]);
 	jsonAddString(set,"link", row[2]);
 	jsonAddString(set,"child", row[3]);
 	jsonAddString(set,"child_pos", row[4]);
 }
  
 hPrintf("%s", js->print(js));
 sqlFreeResult(&sr);
 hFreeConn(&conn);
 }
 
 void modeGetFactorAnalyses()
 {
 char query[256];
 struct sqlResult *sr = NULL;
 char **row = NULL;
 struct json *js = newJson();
 struct json *set = NULL, *group = jsonAddContainerList(js, "analyses");
 
 struct sqlConnection *conn = hAllocConnProfile(heatMapDbProfile, database);
 if (!conn)
     errAbort("Couldn't connect to database");
 
 safef(query, sizeof(query), "SELECT analyses.id,cohorts.name,analyses.result_table,analyses.input_tables FROM analyses LEFT JOIN cohorts on cohorts.id = analyses.cohort_id WHERE module_id = %d ORDER BY analyses.id DESC",
       hghPathwayModuleID);
 
 sr = sqlGetResult(conn, query);
 while ((row = sqlNextRow(sr)) != NULL)
 {
 	if(set == NULL)
 		set = group;
 	else
     	set = jsonAddContainerToList(&group);
 	jsonAddString(set,"id", row[0]);
 	jsonAddString(set,"name", row[1]);
 	jsonAddString(set,"resultTable",row[2]);
 	jsonAddString(set,"inputTables",row[3]);
 }
  
 hPrintf("%s", js->print(js));
 sqlFreeResult(&sr);
 hFreeConn(&conn);
 
 }
 
 int main(int argc, char *argv[])
 /* Process command line. */
 {
 
 
 htmlPushEarlyHandlers();
 cgiSpoof(&argc, argv);
 
+printf("Content-Type:text/html\r\n\r\n");
 //printf("Content-Type:application/json\r\n\r\n");
-printf("Content-Type:application/json\r\n\r\n");
-database = "bioInt";
+database = "bioIntTCGAOV";
 
 oldVars = hashNew(12);
 
 cart = cartForSession(hUserCookie(), excludeVars, oldVars);
 
 char *mode = cartOptionalString(cart, hgh2Mode);
 if (!mode)
     errAbort("%s is required.", hgh2Mode);
 
 if (sameString(mode, "getPathways"))
     modeGetPathways();
 else if (sameString(mode, "getLinks"))
     modeGetLinks();
 else if (sameString(mode, "getCircleMap"))
     modeGetCircleMap();
 else if (sameString(mode, "getAnalyses"))
 	modeGetFactorAnalyses();
 else
 	errAbort("%s is not a valid mode..", mode);
 
 cartRemove(cart,hgh2Mode);
 cartCheckout(&cart);
 
 return 0;
 }
 
 /******************* BEGIN helper routines ***************************/
 
 char *cartSettingsString(char *prefix, char *functionName)
 {
 if (!prefix || !functionName)
     return NULL;
 
 struct hashEl *hEl = cartFindPrefix(cart, prefix);
 if (!hEl)
     return NULL;
 
 struct dyString *dy = newDyString(1000);
 while (hEl)
     {
     char *name = hEl->name;
     char *val = hEl->val;
     dyStringPrintf(dy, "%s=%s,", name, val);
 
     hEl = hEl->next;
     }
 dyStringPrintf(dy, "%s,%s", functionName, VERSION);
 
 return dy->string;
 } 
 void vgMakeColorGradient(struct vGfx *vg,
     struct rgbColor *start, struct rgbColor *end,
     int steps, Color *colorIxs)
 /* Make a color gradient that goes smoothly from start
  * to end colors in given number of steps.  Put indicesgl->chromLis
  * in color table in colorIxs */
 {
 double scale = 0, invScale;
 double invStep;
 int i; int r,g,b;
 
 steps -= 1;     /* Easier to do the calculation in an inclusive way. */
 invStep = 1.0/steps;
 for (i=0; i<=steps; ++i)
     {
     invScale = 1.0 - scale;
     r = invScale * start->r + scale * end->r;
     g = invScale * start->g + scale * end->g;
     b = invScale * start->b + scale * end->b;
     colorIxs[i] = vgFindColorIx(vg, r, g, b);
     scale += invStep;
     }
 }
 
 char *getId(struct sqlConnection *conn, char *table, char *key, char *sample, char *value)
 /* get patient ID from sample (or experiment) Id */
 {
 char query[512]; 
 safef(query, sizeof(query), "select %s from %s where %s = '%s' ", key, table, value, sample);
 return sqlQuickString(conn, query);
 }
 
 
 
 
 void setupMinMaxSubgroupCartVars(struct genoHeatmap *gh, struct slName *features, 
 				 struct slName *mins, struct slName *maxs, int subsetNum)
 {
 int i = 0;
 struct slName *f = features;
 struct slName *mn = mins;
 struct slName *mx = maxs;
 
 for (i = 0; i < slCount(features); i++)
     {
     char minName[128];
     safef(minName, sizeof(minName), "%s.%s.%s.%s.%d",
 	  advFilterPrefix, f->name, "min", gh->patDb, subsetNum);
 
     char maxName[128];
     safef(maxName, sizeof(maxName), "%s.%s.%s.%s.%d",
 	  advFilterPrefix, f->name, "max", gh->patDb, subsetNum);
 
     cartSetString(cart, minName, mn->name);
     cartSetString(cart, maxName, mx->name);
 
     f = f->next;
     mn = mn->next;
     mx = mx->next;
     }
 } 
 
 void setMinMaxSubgroups(struct genoHeatmap *gh)
 {
 char *subgroup1Features = cartOptionalString(cart, hgh2Subgroup1Features);
 char *subgroup2Features = cartOptionalString(cart, hgh2Subgroup2Features);
 
 if (!subgroup1Features || !subgroup2Features)
     return;
 
 char *subgroup1Mins = cartOptionalString(cart, hgh2Subgroup1Mins);
 char *subgroup1Maxs = cartOptionalString(cart, hgh2Subgroup1Maxs);
 
 char *subgroup2Mins = cartOptionalString(cart, hgh2Subgroup2Mins);
 char *subgroup2Maxs = cartOptionalString(cart, hgh2Subgroup2Maxs);
 
 if (!subgroup1Mins || !subgroup1Maxs
     || !subgroup2Mins || !subgroup2Maxs )
     return;
 
 struct slName *features1 = slNameListFromComma(subgroup1Features);
 struct slName *features2 = slNameListFromComma(subgroup2Features);
 
 struct slName *mins1 = slNameListFromComma(subgroup1Mins);
 struct slName *maxs1 = slNameListFromComma(subgroup1Maxs);
 
 struct slName *mins2 = slNameListFromComma(subgroup2Mins);
 struct slName *maxs2 = slNameListFromComma(subgroup2Maxs);
 
 if (slCount(features1) != slCount(features2))
     return;
 if (slCount(mins1) != slCount(maxs1))
     return;
 if (slCount(mins2) != slCount(maxs2))
     return;
 if ((slCount(features1) != slCount(mins1)) || (slCount(features1) != slCount(mins2)))
     return;
 
 setupMinMaxSubgroupCartVars(gh, features1, mins1, maxs1, 0);
 setupMinMaxSubgroupCartVars(gh, features2, mins2, maxs2, 1);
 }
 
 void setupCodedSubgroupCartVars(struct genoHeatmap *gh, struct slName *features, 
 				struct slName *codes, int subsetNum)
 {
 int i = 0;
 struct slName *ft = features;
 struct slName *cd = codes;
 
 struct hash *codeHash = hashNew(0);
 for (i = 0; i < slCount(features); i++)
     {
     hashAdd(codeHash, ft->name, cd->name);
     
     ft = ft->next;
     cd = cd->next;
     }
 
 char *name;
 struct hashCookie hc = hashFirst(codeHash);
 while ((name = hashNextName(&hc)) != NULL)
     {
     char code[128];
     safef(code, sizeof(code), "%s.%s.%s.%s.%d",
 	  advFilterPrefix, name, "codes", gh->patDb, subsetNum);
 
     struct dyString *dy = dyStringNew(100);
 
     struct hashEl *el = hashLookup(codeHash, name);
     while (el)
 	{
 	char *codedVal = el->val;
 	dyStringPrintf(dy, "%s", codedVal);
 	if (el->next)
 	    dyStringPrintf(dy, ",");
 	el = el->next;
 	}
     cartSetString(cart, code, dy->string);
     dyStringFree(&dy);
     }
 } 
 
 void setCodedSubgroup(struct genoHeatmap *gh, char *features, char *codes, int subset)
 {
 if (!features || !codes)
     return;
 
 struct slName *slFeatures = slNameListFromComma(features);
 struct slName *slCodes = slNameListFromComma(codes);
 
 if (!slFeatures || !slCodes)
     return;
 if (slCount(slFeatures) != slCount(slCodes))
     return;
 
 setupCodedSubgroupCartVars(gh, slFeatures, slCodes, subset);
 }
 
 
 void setCodedSubgroups(struct genoHeatmap *gh)
 {
 char *subgroup1Features = cartOptionalString(cart, hgh2Subgroup1CodedFeatures);
 char *subgroup1Codes = cartOptionalString(cart, hgh2Subgroup1Codes);
 setCodedSubgroup(gh, subgroup1Features, subgroup1Codes, 0);
 
 char *subgroup2Features = cartOptionalString(cart, hgh2Subgroup2CodedFeatures);
 char *subgroup2Codes = cartOptionalString(cart, hgh2Subgroup2Codes);
 setCodedSubgroup(gh, subgroup2Features, subgroup2Codes, 1);
 }
 
 void setSubgroups(struct genoHeatmap *gh)
 {
 setMinMaxSubgroups(gh);
 setCodedSubgroups(gh);
 }