9c28afc6ca0b8e2b4404ab7a894925e8f5fcf62b hiram Thu Mar 21 11:11:54 2019 -0700 begin round of consolidation and simplification refs #18869 diff --git src/hg/hubApi/hubApi.c src/hg/hubApi/hubApi.c index 6897631..76ff73b 100644 --- src/hg/hubApi/hubApi.c +++ src/hg/hubApi/hubApi.c @@ -203,44 +203,47 @@ static void sampleUrl(char *db, struct trackDb *tdb, char *chrom, long long chromSize) /* print out a sample getData URL */ { unsigned start = chromSize / 4; unsigned end = start + 10000; if (end > chromSize) end = chromSize; if (db) { if (tdb->parent) hPrintf("<li>%s : %s subtrack of parent: %s <a href='%s/getData/track?db=%s&chrom=%s&track=%s&start=%u&end=%u' target=_blank>(sample getData)</a></li>\n", tdb->track, tdb->type, tdb->parent->track, urlPrefix, db, chrom, tdb->track, start, end ); else hPrintf("<li>%s : %s <a href='%s/getData/track?db=%s&chrom=%s&track=%s&start=%u&end=%u' target=_blank>(sample getData)</a></li>\n", tdb->track, tdb->type, urlPrefix, db, chrom, tdb->track, start, end ); } +else + hPrintf("<li>%s : %s not db track</li>\n", tdb->track, tdb->type); } static void showSubTracks(char *db, struct trackDb *tdb, struct hash *countTracks, char *chromName, long long chromSize) /* tdb has subtracks, show only subTracks, no details */ { hPrintf(" <li><ul>\n"); +hPrintf(" <li>subtracks for '%s' db: '%s'</li>\n", tdb->track, db); if (tdb->subtracks) { struct trackDb *tdbEl = NULL; for (tdbEl = tdb->subtracks; tdbEl; tdbEl = tdbEl->next) { if (tdbIsCompositeView(tdbEl)) - hPrintf("<li>%s : %s : composite view of parent: %s</li>\n", tdbEl->track, tdbEl->type, tdbEl->parent->track); + hPrintf("<li>%s : %s : composite YYY view of parent: %s</li>\n", tdbEl->track, tdbEl->type, tdbEl->parent->track); else { if (isSupportedType(tdbEl->type)) { sampleUrl(db, tdbEl, chromName, chromSize); // hPrintf("<li>%s : %s : subtrack of parent: %s (with sample)</li>\n", tdbEl->track, tdbEl->type, tdbEl->parent->track, getData); } else hPrintf("<li>%s : %s : subtrack of parent: %s</li>\n", tdbEl->track, tdbEl->type, tdbEl->parent->track); } hashCountTrack(tdbEl, countTracks); if (tdbEl->subtracks) showSubTracks(db, tdbEl, countTracks, chromName, chromSize); } } @@ -421,224 +424,328 @@ hPrintf(" <li>%s : %s : %ld chroms : %ld bases covered <a href='%s/getData/track?hubUrl=%s&genome=%s&track=%s&chrom=%s&start=%u&end=%u' target=_blank>(sample getData)</a></li>\n", tdb->track, tdb->type, chromCount, itemCount, urlPrefix, hub->url, genome, tdb->track, chromName, start, end); else hPrintf(" <li>%s : %s : %ld chroms : %ld count <<a href='%s/getData/track?hubUrl=%s&genome=%s&track=%s&chrom=%s&start=%u&end=%u' target=_blank>(sample getData)</a></li>\n", tdb->track, tdb->type, chromCount, itemCount, urlPrefix, hub->url, genome, tdb->track, chromName, start, end); } else { if (startsWithWord("bigBed", tdb->type)) hPrintf(" <li>%s : %s : %ld chroms : %ld item count</li>\n", tdb->track, tdb->type, chromCount, itemCount); else if (startsWithWord("bigWig", tdb->type)) hPrintf(" <li>%s : %s : %ld chroms : %ld bases covered</li>\n", tdb->track, tdb->type, chromCount, itemCount); else hPrintf(" <li>%s : %s : %ld chroms : %ld count</li>\n", tdb->track, tdb->type, chromCount, itemCount); } } +static void hubCountOneTdb(struct trackHub *hub, char *db, struct trackDb *tdb, + char *bigDataIndex, struct hash *countTracks, char *chromName, + unsigned chromSize, char *genome) +{ +char *bigDataUrl = trackDbSetting(tdb, "bigDataUrl"); +// char *compositeTrack = trackDbSetting(tdb, "compositeTrack"); +boolean compositeContainer = tdbIsComposite(tdb); +boolean compositeView = tdbIsCompositeView(tdb); +// char *superTrack = trackDbSetting(tdb, "superTrack"); +boolean superChild = tdbIsSuperTrackChild(tdb); +boolean depthSearch = cartUsualBoolean(cart, "depthSearch", FALSE); +hashCountTrack(tdb, countTracks); + +if (depthSearch && bigDataUrl) + { + char *longName = NULL; + unsigned longSize = 0; + long chromCount = 0; + long itemCount = 0; + struct dyString *errors = newDyString(1024); + int retVal = bbiBriefMeasure(tdb->type, bigDataUrl, bigDataIndex, &chromCount, &itemCount, errors, &longName, &longSize); + if (retVal) + { + hPrintf(" <li>%s : %s : <font color='red'>ERROR: %s</font></li>\n", tdb->track, tdb->type, errors->string); + } + else + { + if (chromSize > 0) + hubSampleUrl(hub, tdb, chromCount, itemCount, chromName, chromSize, genome); + else + hubSampleUrl(hub, tdb, chromCount, itemCount, longName, longSize, genome); + } + } +else + { + if (compositeContainer) + hPrintf(" <li>%s : %s : composite track container has %d subtracks</li>\n", tdb->track, tdb->type, slCount(tdb->subtracks)); + else if (compositeView) + hPrintf(" <li>%s : %s : XXX composite view of parent: %s</li>\n", tdb->track, tdb->type, tdb->parent->track); + else if (superChild) + hPrintf(" <li>%s : %s : superTrack child of parent: %s</li>\n", tdb->track, tdb->type, tdb->parent->track); + else if (! depthSearch && bigDataUrl) + hPrintf(" <li>%s : %s : %s</li>\n", tdb->track, tdb->type, bigDataUrl); + else + { + if (isSupportedType(tdb->type)) + sampleUrl(db, tdb, chromName, chromSize); + else + hPrintf(" <li>%s : %s</li>\n", tdb->track, tdb->type); + } + } +if (allTrackSettings) + { + hPrintf(" <li><ul>\n"); + trackSettings(tdb, countTracks); /* show all settings */ + hPrintf(" </ul></li>\n"); + } +else if (tdb->subtracks) + { + showSubTracks(db, tdb, countTracks, chromName, chromSize); + } +return; +} /* static void hubCountOneTdb(char *db, struct trackDb *tdb, + * char *bigDataIndex, struct hash *countTracks, + * char *chromName, long long chromSize) + */ + + static void countOneTdb(struct trackHub *hub, char *db, struct trackDb *tdb, char *bigDataIndex, struct hash *countTracks, char *chromName, unsigned chromSize, char *genome) { char *bigDataUrl = trackDbSetting(tdb, "bigDataUrl"); // char *compositeTrack = trackDbSetting(tdb, "compositeTrack"); boolean compositeContainer = tdbIsComposite(tdb); boolean compositeView = tdbIsCompositeView(tdb); // char *superTrack = trackDbSetting(tdb, "superTrack"); boolean superChild = tdbIsSuperTrackChild(tdb); boolean depthSearch = cartUsualBoolean(cart, "depthSearch", FALSE); hashCountTrack(tdb, countTracks); if (depthSearch && bigDataUrl) { char *longName = NULL; unsigned longSize = 0; long chromCount = 0; long itemCount = 0; struct dyString *errors = newDyString(1024); int retVal = bbiBriefMeasure(tdb->type, bigDataUrl, bigDataIndex, &chromCount, &itemCount, errors, &longName, &longSize); if (retVal) { hPrintf(" <li>%s : %s : <font color='red'>ERROR: %s</font></li>\n", tdb->track, tdb->type, errors->string); } else + { + if (chromSize > 0) + hubSampleUrl(hub, tdb, chromCount, itemCount, chromName, chromSize, genome); + else hubSampleUrl(hub, tdb, chromCount, itemCount, longName, longSize, genome); } + } else { if (compositeContainer) hPrintf(" <li>%s : %s : composite track container has %d subtracks</li>\n", tdb->track, tdb->type, slCount(tdb->subtracks)); else if (compositeView) - hPrintf(" <li>%s : %s : composite view of parent: %s</li>\n", tdb->track, tdb->type, tdb->parent->track); + hPrintf(" <li>%s : %s : XXX composite view of parent: %s</li>\n", tdb->track, tdb->type, tdb->parent->track); else if (superChild) hPrintf(" <li>%s : %s : superTrack child of parent: %s</li>\n", tdb->track, tdb->type, tdb->parent->track); else if (! depthSearch && bigDataUrl) hPrintf(" <li>%s : %s : %s</li>\n", tdb->track, tdb->type, bigDataUrl); else { if (isSupportedType(tdb->type)) sampleUrl(db, tdb, chromName, chromSize); else hPrintf(" <li>%s : %s</li>\n", tdb->track, tdb->type); } } if (allTrackSettings) { hPrintf(" <li><ul>\n"); trackSettings(tdb, countTracks); /* show all settings */ hPrintf(" </ul></li>\n"); } else if (tdb->subtracks) { showSubTracks(db, tdb, countTracks, chromName, chromSize); } return; } /* static void countOneTdb(char *db, struct trackDb *tdb, * char *bigDataIndex, struct hash *countTracks, * char *chromName, long long chromSize) */ +static unsigned largestChrom(char *db, char **nameReturn) +/* return the length and get the chrom name for the largest chrom + * from chromInfo table. For use is sample getData URLs + */ +{ +char query[1024]; +struct sqlConnection *conn = hAllocConn(db); +// Build a query to select the hubUrl for the given shortLabel +sqlSafef(query, sizeof(query), "select chrom,size from chromInfo order by size desc limit 1"); +struct sqlResult *sr = sqlGetResult(conn, query); +char **row = sqlNextRow(sr); +unsigned length = 0; +if (row) + { + *nameReturn = cloneString(row[0]); + length = sqlLongLong(row[1]); + } +sqlFreeResult(&sr); +hFreeConn(&conn); +return length; +} + static void hubTrackList(struct trackHub *hub, struct trackDb *topTrackDb, struct trackHubGenome *genome) /* process the track list in a hub to show all tracks */ { hPrintf(" <li><ul>\n"); if (topTrackDb) { struct hash *countTracks = hashNew(0); struct trackDb *tdb = NULL; for ( tdb = topTrackDb; tdb; tdb = tdb->next ) { char *bigDataIndex = NULL; char *relIdxUrl = trackDbSetting(topTrackDb, "bigDataIndex"); if (relIdxUrl != NULL) bigDataIndex = trackHubRelativeUrl(genome->trackDbFile, relIdxUrl); char *defaultGenome = NULL; if (isNotEmpty(genome->name)) defaultGenome = genome->name; - countOneTdb(hub, NULL, tdb, bigDataIndex, countTracks, NULL, 0, defaultGenome); + char *chromName = NULL; + unsigned chromSize = 0; + if (isEmpty(genome->twoBitPath)) + chromSize = largestChrom(defaultGenome, &chromName); + hubCountOneTdb(hub, defaultGenome, tdb, bigDataIndex, countTracks, chromName, chromSize, defaultGenome); if (timeOutReached()) break; } /* for ( tdb = topTrackDb; tdb; tdb = tdb->next ) */ hPrintf(" <li>%d different track types</li>\n",countTracks->elCount - 1); /* add this single genome count to the overall multi-genome counts */ if (countTracks->elCount) { hPrintf(" <li><ol>\n"); struct hashEl *hel, *helList = hashElListHash(countTracks); slSort(&helList, hashElCmpIntValDesc); for (hel = helList; hel; hel = hel->next) { if (sameOk("track count", hel->name)) continue; int prevCount = ptToInt(hashFindVal(trackCounter, hel->name)); if (differentStringNullOk("track count", hel->name)) totalTracks += ptToInt(hel->val); hashReplace(trackCounter, hel->name, intToPt(prevCount + ptToInt(hel->val))); if (isSupportedType(hel->name)) hPrintf(" <li>%d - %s - supported</li>\n", ptToInt(hel->val), hel->name); else hPrintf(" <li>%d - %s</li>\n", ptToInt(hel->val), hel->name); } hPrintf(" </ol></li>\n"); } } else - hPrintf(" <li>no trackTopDb</li>\n"); + hPrintf(" <li>no trackTopDb ?</li>\n"); hPrintf(" </ul><li>\n"); } /* static struct trackDb *hubTrackList() */ -static struct trackDb *assemblySettings(struct trackHub *hub, struct trackHubGenome *genome) +static void hubAssemblySettings(struct trackHub *hub, struct trackHubGenome *genome) /* display all the assembly 'settingsHash' */ { struct trackDb *tdb = obtainTdb(genome, NULL); hPrintf(" <li><ul>\n"); struct hashEl *hel; struct hashCookie hc = hashFirst(genome->settingsHash); while ((hel = hashNext(&hc)) != NULL) { hPrintf(" <li>%s : %s</li>\n", hel->name, (char *)hel->val); if (sameWord("trackDb", hel->name)) /* examine the trackDb structure */ { hubTrackList(hub, tdb, genome); } if (timeOutReached()) break; } hPrintf(" </ul></li>\n"); -return tdb; } -struct slName *genomeList(struct trackHub *hubTop, struct trackDb **dbTrackList, char *selectGenome) +static void genomeList(struct trackHub *hubTop) /* follow the pointers from the trackHub to trackHubGenome and around * in a circle from one to the other to find all hub resources - * return slName list of the genomes in this track hub - * optionally, return the trackList from this hub for the specified genome */ { -struct slName *retList = NULL; - long totalAssemblyCount = 0; struct trackHubGenome *genome = hubTop->genomeList; hPrintf("<h4>genome sequences (and tracks) present in this track hub</h4>\n"); + +if (NULL == genome) + { + hPrintf("<h4>odd error, can not find a gnomeList ? at url: '%s'</h4>\n", hubTop->url); + return; + } + hPrintf("<ul>\n"); long lastTime = clock1000(); for ( ; genome; genome = genome->next ) { - if (selectGenome) /* is only one genome requested ? */ + ++totalAssemblyCount; +#ifdef NOT + char *twoBitPath; /* URL to twoBit. If not null, this is an assmebly hub*/ + struct twoBitFile *tbf; /* open handle to two bit file */ + char *groups; /* URL to group.txt file */ + char *defaultPos; /* default position */ + char *organism; /* organism name, like Human */ + char *description; /* description, also called freeze name */ + struct trackHub *trackHub; /* associated track hub */ +#endif + if (isNotEmpty(genome->twoBitPath)) { - if ( differentStringNullOk(selectGenome, genome->name) ) - continue; + hPrintf("<li>assembly hub twoBitFile: %s</li>\n", genome->twoBitPath); } - ++totalAssemblyCount; - struct slName *el = slNameNew(genome->name); - slAddHead(&retList, el); if (genome->organism) { hPrintf("<li>%s - %s - %s</li>\n", genome->organism, genome->name, genome->description); } else { /* can there be a description when organism is empty ? */ - hPrintf("<li>%s</li>\n", genome->name); + hPrintf("<li>name: %s</li>\n", genome->name); } - struct trackDb *tdb = assemblySettings(hubTop, genome); - if (dbTrackList) - *dbTrackList = tdb; + hubAssemblySettings(hubTop, genome); if (measureTiming) { long thisTime = clock1000(); hPrintf("<li><em>processing time %s: %ld millis</em></li>\n", genome->name, thisTime - lastTime); } if (timeOutReached()) break; } if (trackCounter->elCount) { hPrintf(" <li>total genome assembly count: %ld</li>\n", totalAssemblyCount); hPrintf(" <li>%ld total tracks counted, %d different track types:</li>\n", totalTracks, trackCounter->elCount); hPrintf(" <li><ol>\n"); struct hashEl *hel, *helList = hashElListHash(trackCounter); slSort(&helList, hashElCmpIntValDesc); for (hel = helList; hel; hel = hel->next) { hPrintf(" <li>%d - %s - total</li>\n", ptToInt(hel->val), hel->name); } hPrintf(" </ol></li>\n"); } hPrintf("</ul>\n"); -return retList; -} /* static struct slName *genomeList () */ +} /* static void genomeList (hubTop) */ static char *urlFromShortLabel(char *shortLabel) /* this is not a fair way to get the URL since shortLabel's are not * necessarily unique. This is temporary. TBD: need to always use URL * and then get the shortLabel */ { char hubUrl[1024]; char query[1024]; struct sqlConnection *conn = hConnectCentral(); // Build a query to select the hubUrl for the given shortLabel sqlSafef(query, sizeof(query), "select hubUrl from %s where shortLabel='%s'", hubPublicTableName(), shortLabel); if (! sqlQuickQuery(conn, query, hubUrl, sizeof(hubUrl))) hubUrl[0] = 0; @@ -692,52 +799,30 @@ * parse that and return a function pointer and the parsed words * Returns NULL if not recognized */ { char *tmp = cloneString(pathInfo); /* skip the first leading slash to simplify chopByChar parsing */ tmp += 1; int wordCount = chopByChar(tmp, '/', words, MAX_PATH_INFO); if (wordCount < 1) return NULL; struct hashEl *hel = hashLookup(apiFunctionHash, words[0]); return hel; } -static unsigned largestChrom(char *db, char **nameReturn) -/* return the length and get the chrom name for the largest chrom - * from chromInfo table. For use is sample getData URLs - */ -{ -char query[1024]; -struct sqlConnection *conn = hAllocConn(db); -// Build a query to select the hubUrl for the given shortLabel -sqlSafef(query, sizeof(query), "select chrom,size from chromInfo order by size desc limit 1"); -struct sqlResult *sr = sqlGetResult(conn, query); -char **row = sqlNextRow(sr); -unsigned length = 0; -if (row) - { - *nameReturn = cloneString(row[0]); - length = sqlLongLong(row[1]); - } -sqlFreeResult(&sr); -hFreeConn(&conn); -return length; -} - static void tracksForUcscDb(char *db) /* scan the specified database for all tracks */ { struct hash *countTracks = hashNew(0); char *chromName = NULL; unsigned chromSize = largestChrom(db, &chromName); hPrintf("<h4>Tracks in UCSC genome: '%s', longest chrom: %s:%u</h4>\n", db, chromName, chromSize); struct trackDb *tdbList = obtainTdb(NULL, db); struct trackDb *tdb; hPrintf("<ul>\n"); hPrintf("<li>%s:%u</li>\n", chromName, chromSize); for (tdb = tdbList; tdb != NULL; tdb = tdb->next ) { countOneTdb(NULL, db, tdb, NULL, countTracks, chromName, chromSize, NULL); if (timeOutReached()) @@ -935,53 +1020,58 @@ struct dbDb *el = dbList; int ucscDataBaseCount = 0; int maxDbNameWidth = 0; for ( ; el != NULL; el = el->next ) { ucscDbList[ucscDataBaseCount++] = el->name; if (strlen(el->name) > maxDbNameWidth) maxDbNameWidth = strlen(el->name); } maxDbNameWidth += 1; cartWebStart(cart, database, "UCSC JSON API interface"); if (debug) { - char *envVar = getenv("BROWSER_HOST"); hPrintf("<ul>\n"); + char *envVar = getenv("BROWSER_HOST"); hPrintf("<li>BROWSER_HOST:%s</li>\n", envVar); envVar = getenv("CONTEXT_DOCUMENT_ROOT"); hPrintf("<li>CONTEXT_DOCUMENT_ROOT:%s</li>\n", envVar); envVar = getenv("CONTEXT_PREFIX"); hPrintf("<li>CONTEXT_PREFIX:%s</li>\n", envVar); envVar = getenv("DOCUMENT_ROOT"); hPrintf("<li>DOCUMENT_ROOT:%s</li>\n", envVar); envVar = getenv("HTTP_HOST"); hPrintf("<li>HTTP_HOST:%s</li>\n", envVar); envVar = getenv("REQUEST_URI"); hPrintf("<li>REQUEST_URI:%s</li>\n", envVar); envVar = getenv("SCRIPT_FILENAME"); hPrintf("<li>SCRIPT_FILENAME:%s</li>\n", envVar); envVar = getenv("SCRIPT_NAME"); hPrintf("<li>SCRIPT_NAME:%s</li>\n", envVar); envVar = getenv("SCRIPT_URI"); hPrintf("<li>SCRIPT_URI:%s</li>\n", envVar); envVar = getenv("SCRIPT_URL"); hPrintf("<li>SCRIPT_URL:%s</li>\n", envVar); envVar = getenv("SERVER_NAME"); hPrintf("<li>SERVER_NAME:%s</li>\n", envVar); + envVar = getenv("PATH_INFO"); + if (isNotEmpty(envVar)) + hPrintf("<li>PATH_INFO:'%s'</li>\n", envVar); + else + hPrintf("<li>PATH_INFO:<empty></li>\n"); hPrintf("</ul>\n"); } char *goOtherHub = cartUsualString(cart, "goOtherHub", defaultHub); char *goUcscDb = cartUsualString(cart, "goUcscDb", ""); char *otherHubUrl = cartUsualString(cart, "urlHub", defaultHub); char *goPublicHub = cartUsualString(cart, "goPublicHub", defaultHub); char *hubDropDown = cartUsualString(cart, "publicHubs", defaultHub); char *urlDropDown = urlFromShortLabel(hubDropDown); char *ucscDb = cartUsualString(cart, "ucscGenomes", defaultDb); char *urlInput = urlDropDown; /* assume public hub */ if (sameWord("go", goOtherHub)) /* requested other hub URL */ urlInput = otherHubUrl; else if (isEmpty(otherHubUrl)) otherHubUrl = urlInput; @@ -1068,32 +1158,31 @@ hPrintf("<p>\n"); if (sameWord("go", goUcscDb)) /* requested UCSC db track list */ { tracksForUcscDb(ucscDb); } else { hPrintf("<h4>Examine %s at: %s</h4>\n", sameWord("go",goPublicHub) ? "public hub" : "other hub", urlInput); hPrintf("<ul>\n"); hPrintf("<li>%s</li>\n", hub->shortLabel); hPrintf("<li>%s</li>\n", hub->longLabel); if (isNotEmpty(hub->defaultDb)) hPrintf("<li>%s - default database</li>\n", hub->defaultDb); hPrintf("</ul>\n"); - if (hub->genomeList) - (void) genomeList(hub, NULL, NULL); /* ignore returned list */ + genomeList(hub); } if (timedOut) hPrintf("<h1>Reached time out %ld seconds</h1>", timeOutSeconds); if (measureTiming) hPrintf("<em>Overall total time: %ld millis</em><br>\n", clock1000() - enteredMainTime); hPrintf("</p>\n"); cartWebEnd(); } /* void doMiddle(struct cart *theCart) */ /* Null terminated list of CGI Variables we don't want to save * permanently. */ static char *excludeVars[] = {"Submit", "submit", "goOtherHub", "goPublicHub", "goUcscDb", "ucscGenomes", "publicHubs", NULL,};