110f5e12a634db49ea9aa1ea23ff4965f1c2befe galt Tue Aug 14 13:48:57 2018 -0700 changing cse to soe in domains, sometimes gi. ref #21876 diff --git src/hg/sageVisCGI/sageVisCGI.c src/hg/sageVisCGI/sageVisCGI.c index a5a4551..62608cb 100644 --- src/hg/sageVisCGI/sageVisCGI.c +++ src/hg/sageVisCGI/sageVisCGI.c @@ -1,280 +1,280 @@ /* Copyright (C) 2013 The Regents of the University of California * See README in this or parent directory for licensing information. */ /** \page sageVisCGI.doxp sageVisCGI cgi program for viewing graphs of sage data used standalone or called by the hgc.c program in ~kent/src/hg/hgc/. <p>sageVisCGI creates graphs on the fly for the sage data of different uniGene clusters. The clusters to be graphed are passed via cgi (or command line) in the form u=<uniGene number>. There is also an optional 'md' parameter which specifies a maximum tag count to go up to, default is 50. <p>Example <br><pre><code> sageVisCGI md=20 u=202 u=122566 > out.html </code></pre> -or http://genome-test.cse.ucsc.edu/cgi-bin/sageVisCGI?md=20&u=202&u=122566 . +or http://genome-test.soe.ucsc.edu/cgi-bin/sageVisCGI?md=20&u=202&u=122566 . \sa sageVisCGI.c */ #include "common.h" #include "hCommon.h" #include "dystring.h" #include "sage.h" #include "sageExp.h" #include "gnuPlot2D.h" #include "portable.h" #include "jksql.h" #include "dnautil.h" #include "cheapcgi.h" #include "htmshell.h" #include "knownMore.h" #include "hdb.h" #include "genePred.h" #include "hgConfig.h" int maxDataVal =0; int dataValCeiling; /** Just prints out the <img> tag and filename */ void doPlotPrintOut(char *fileName) { printf( "<img src=\"%s\">\n", fileName); } /** * Appends one string to another without having to * worry about going over. Assumes that the total length * of dest is the strlen(dest) + 1. Wasteful if you want to * use it lots of times in a row as it reallocates memory every time */ void dynamicStrncat(char **dest, const char *src) { ExpandArray(*dest, (strlen(*dest)+1), (strlen(*dest) +strlen(src) + 1)); strncat(*dest, src, strlen(src)); } /** Construct a graphPoint from data in sage and current index. Assumes that the experiments are stored in order. */ struct graphPoint2D*createSageGraphPoint(struct sage *sg, int i) { struct graphPoint2D *gp = NULL; char name[128]; sprintf(name, "Hs.%d", sg->uni); AllocVar(gp); gp->y = sg->meds[i-1]; if(gp->y > maxDataVal && gp->y < dataValCeiling) maxDataVal = gp->y; gp->x = i; gp->name = cloneString(name); gp->hName = cloneString(name); gp->groupName = cloneString(name); return gp; } /** Uses the sage experiment data (sageExp) and sage data itself (sage) to construct the basic gnuPlot2D data type, specifically creating the graphPoint2D data lists for each element in sgList */ struct gnuPlot2D *createSagePlot(struct sageExp *seList, struct sage *sgList) { struct gnuPlot2D *gp = createGnuPlot2D(); struct sage *sg = NULL; int i; for(sg = sgList; sg != NULL; sg = sg->next) { struct graphPoint2D *gList = NULL; for (i=0; i< sg->numExps; i++) { struct graphPoint2D *gTemp = NULL; gTemp = createSageGraphPoint(sg, i+1); slAddHead(&gList, gTemp); } gptAddGraphPointList(gp, gList, "linesp"); } return gp; } /* Creates a string which tells gnuPlot what label to put on xTics and where to put them. Will Chop "SAGE" from name if present */ char * constructXticsFromExps(struct sageExp *seList) { char *ret = cloneString("set xtics rotate("); static char buff[256]; int count =1; struct sageExp *se; for(se = seList; se != NULL; se = se->next) { if(se->next == NULL) sprintf(buff, " \"%d)%s\" %d ", count, strstr(se->exp,"SAGE_") ? strstr(se->exp,"_") : se->exp , count); else sprintf(buff, " \"%d)%s\" %d, ", count, strstr(se->exp,"SAGE_") ? strstr(se->exp, "_") : se->exp, count); dynamicStrncat(&ret, buff); count++; } dynamicStrncat(&ret, ")\n"); return ret; } /* Prints the header appropriate for the title * passed in. Links html to chucks stylesheet for * easier maintaince */ void chuckHtmlStart(char *title) { printf("<html><head>\n%s", getCspMetaHeader()); //FIXME blueStyle should not be absolute to genome-test and should bae called by: // webIncludeResourceFile("blueStyle.css"); -printf("<LINK REL=STYLESHEET TYPE=\"text/css\" href=\"http://genome-test.cse.ucsc.edu/style/blueStyle.css\" title=\"Chuck Style\">\n"); +printf("<LINK REL=STYLESHEET TYPE=\"text/css\" href=\"http://genome-test.soe.ucsc.edu/style/blueStyle.css\" title=\"Chuck Style\">\n"); printf("<title>%s</title>\n</head><body bgcolor=\"#f3f3ff\">",title); } /** Generates the data plot and associated html */ void doCountsPage(struct sageExp *seList, struct sage *sgList) { struct gnuPlot2D *gp = needMem(sizeof(struct gnuPlot2D*)); char *cmd = NULL; double xSize; double ySize; char *title = NULL; char *xTics = NULL; char plotSize[256]; // = cloneString("set size .75,.75\n"); struct tempName pngTn; chuckHtmlStart("Sage Graph"); printf("<center>"); makeTempName(&pngTn, "sageDat", ".png"); gp = createSagePlot(seList, sgList); gp->fileName = pngTn.forCgi; xTics = constructXticsFromExps(seList); title = cloneString("Sage Data for Unigene Clusters"); xSize = 0.020*slCount(gp->gpList[0]); ySize = 0.075*slCount(sgList); if(ySize < 1.25) ySize = 1.25; if(xSize <.75) xSize = .75; sprintf(plotSize, "set size %g, %g\n", xSize,ySize); gp->other = cloneString(plotSize); dynamicStrncat(&gp->other, xTics); gp->ylabel = cloneString("Median Counts"); gp->xlabel = cloneString("Experiment"); gp->title = cloneString(title); gp->xMax = slCount(gp->gpList[0]); gp->yMax = maxDataVal; cmd = gptGenerateCmd(gp); gptPlotFromCmd(cmd); doPlotPrintOut(pngTn.forHtml); htmlEnd(); } /** load the sage data by constructing a query based on the names in nmList */ struct sage *loadSageData(char *table, struct slName *nmList) { char *user = cfgOption("db.user"); char *password = cfgOption("db.password"); struct sqlConnection *sc = NULL; struct dyString *query = newDyString(2048); struct sage *sgList = NULL, *sg=NULL; struct slName *nm =NULL; char *db = cgiUsualString("db", "hgFixed"); char **row; int count=0; struct sqlResult *sr = NULL; sc = sqlConnectRemote("localhost", user, password, db); sqlDyStringPrintf(query, "select * from sage where "); for(nm=nmList;nm!=NULL;nm=nm->next) { if (count++) { sqlDyStringPrintf(query," or uni=%s ", nm->name ); } else { sqlDyStringPrintf(query," uni=%s ", nm->name); } } sr = sqlGetResult(sc,query->string); while((row = sqlNextRow(sr)) != NULL) { sg = sageLoad(row); slAddHead(&sgList,sg); } sqlFreeResult(&sr); sqlDisconnect(&sc); slReverse(&sgList); freeDyString(&query); return sgList; } /** load the sage experiment data */ struct sageExp *loadSageExps(char *tableName, struct slName *nmList) { char *user = cfgOption("db.user"); char *password = cfgOption("db.password"); struct sqlConnection *sc = NULL; char query[256]; struct sageExp *seList = NULL, *se=NULL; char **row; struct sqlResult *sr = NULL; char *db = cgiUsualString("db", "hgFixed"); sc = sqlConnectRemote("localhost", user, password, db); sqlSafef(query, sizeof query, "select * from sageExp order by num"); sr = sqlGetResult(sc,query); while((row = sqlNextRow(sr)) != NULL) { se = sageExpLoad(row); slAddHead(&seList,se); } sqlFreeResult(&sr); sqlDisconnect(&sc); slReverse(&seList); return seList; } /** print usage and quit */ void usage() { errAbort("sageVisCGI - create a graph of median sage counts\n" "usage:\n\t sageVisCGI u=<uniGeneNum> u=<uniGeneNum2> u=<uniGeneNum3> etc. \n"); } /** main html generating function for htmShell */ void doHtml() { struct sageExp *seList; struct sage *sgList; struct slName *unis = cgiStringList("u"); if(unis == NULL) usage(); dataValCeiling = cgiOptionalInt("md",50); seList = loadSageExps("sageExp", unis); sgList = loadSageData("sage", unis); doCountsPage(seList, sgList); sageExpFreeList(&seList); sageFreeList(&sgList); slFreeList(&unis); } int main(int argc, char *argv[]) { cgiSpoof(&argc, argv); printf("Content-Type: text/html\n\n"); htmEmptyShell(doHtml, NULL); return 0; }