src/hg/instinct/hgPathways/hgCircleMaps.c 1.15

1.15 2009/09/15 00:08:14 sbenz
Fixed gene sorting in cgi, need to add to interface
Index: src/hg/instinct/hgPathways/hgCircleMaps.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/hg/instinct/hgPathways/hgCircleMaps.c,v
retrieving revision 1.14
retrieving revision 1.15
diff -b -B -U 4 -r1.14 -r1.15
--- src/hg/instinct/hgPathways/hgCircleMaps.c	18 Aug 2009 20:57:31 -0000	1.14
+++ src/hg/instinct/hgPathways/hgCircleMaps.c	15 Sep 2009 00:08:14 -0000	1.15
@@ -1090,15 +1089,72 @@
 struct sqlConnection *conn = hAllocConnProfile(heatMapDbProfile, database);
 if (!conn)
 	errAbort("Couldn't connect to database");
 
+char *sortGene = cartOptionalString(cart, hgh2SortGene);
+
 struct slName *sl, *slList = slNameListFromComma(datasets);
 for (sl = slList; sl; sl = sl->next)
     {
 	char query[1024];
 	struct sqlResult *sr = NULL;
 	char **row = NULL;
 
+	if(sl == slList && !sameString(sortGene,"")) // first time
+		{
+	    struct ring *sortRg = addRingToCircleMap(cm, sortGene, sl->name, FALSE);
+		if (!sortRg->data)
+		    sortRg->data = hashNew(0);
+		if(sameStringN(sl->name,"factorGraph_",12) || sameStringN(sl->name,"fg_",3) )
+			{
+			safef(query, sizeof(query), "select DISTINCT samples.name,val from %s data inner join entities_ncipid on entities_ncipid.entity_id = data.feature_id left join samples on samples.id = data.sample_id where data.pathway_id = \"%s\" AND entities_ncipid.entity_name LIKE(\"%s\") ORDER BY samples.id",
+				sl->name,pathwayID,sortGene);
+			}
+		else
+			{
+			safef(query, sizeof(query), "select DISTINCT samples.name,val from %s data inner join analysisFeatures on analysisFeatures.id = data.feature_id left join samples on samples.id = data.sample_id where analysisFeatures.feature_name LIKE(\"%s\") ORDER BY samples.id",
+				sl->name,sortGene);
+			}
+		sr = sqlGetResult(conn, query);
+		struct slDouble *ad, *allData = NULL;
+		while ((row = sqlNextRow(sr)) != NULL)
+			{
+			if(!slNameInList(validSamples,row[0]))
+				continue;
+				
+			double val = strtod(row[1],NULL);
+			struct slDouble *sd, *sdList = NULL;
+			
+			if (val > sortRg->maxVal)
+				sortRg->maxVal = val;
+	
+			/* Store copy of all data in list to determine median value */
+			ad = slDoubleNew(val);
+			slAddHead(&allData, ad);
+		
+			sd = slDoubleNew(val);
+			slAddHead(&sdList, sd);
+		
+			if (slNameInList(cm->samples, row[0]))
+				continue;
+			slNameAddHead(&cm->samples, row[0]);
+			hashAdd(sortRg->data, row[0], sdList);
+			sortRg->numSamples += 1;
+			//printf("%s %s",row[0],row[1]);
+			}	
+		if(sortRg->numSamples > 0)
+			sortRg->median = slDoubleMedian(allData);
+		else
+			sortRg->median = 0;
+		//printf("%d\n",rg->numSamples);
+		sortRg->numElements = 1;  // number of probes matching 'gene'
+		slFreeList(&allData);
+		slReverse(&cm->samples);
+		sqlFreeResult(&sr);
+			
+		}
+		
+
     struct ring *rg = addRingToCircleMap(cm, gene, sl->name, TRUE);
 
 	if (!rg->data)
 	    rg->data = hashNew(0);
@@ -1114,8 +1170,9 @@
 			sl->name,gene);
 		}
 	//errAbort(query);
 	//printf("%s",query);
+	slReverse(&cm->samples);
 	sr = sqlGetResult(conn, query);
 	struct slDouble *ad, *allData = NULL;
 	while ((row = sqlNextRow(sr)) != NULL)
 		{
@@ -1134,13 +1191,13 @@
 	
 		sd = slDoubleNew(val);
 		slAddHead(&sdList, sd);
 	
-		if (slNameInList(cm->samples, row[0]))
-			continue;
+		if (!slNameInList(cm->samples, row[0]))
 		slNameAddHead(&cm->samples, row[0]);
-	    hashAdd(rg->data, row[0], sdList);
+
 	    rg->numSamples += 1;
+	    hashAdd(rg->data, row[0], sdList);
 		//printf("%s %s",row[0],row[1]);
 		}	
 	if(rg->numSamples > 0)
 		rg->median = slDoubleMedian(allData);