src/hg/instinct/hgPathways/hgPathways.c 1.5
1.5 2009/09/15 00:08:14 sbenz
Fixed gene sorting in cgi, need to add to interface
Index: src/hg/instinct/hgPathways/hgPathways.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/hg/instinct/hgPathways/hgPathways.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -b -B -U 1000000 -r1.4 -r1.5
--- src/hg/instinct/hgPathways/hgPathways.c 12 Aug 2009 13:32:57 -0000 1.4
+++ src/hg/instinct/hgPathways/hgPathways.c 15 Sep 2009 00:08:14 -0000 1.5
@@ -1,373 +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:application/json\r\n\r\n");
printf("Content-Type:application/json\r\n\r\n");
database = "bioInt";
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);
}