4d72ed9554069edb885ff2f793add75e422a5459 hiram Thu Mar 21 15:58:39 2019 -0700 error catch aroung bbi file open and better sample getData links refs #18869 diff --git src/hg/hubApi/hubApi.c src/hg/hubApi/hubApi.c index e03035b..410a905 100644 --- src/hg/hubApi/hubApi.c +++ src/hg/hubApi/hubApi.c @@ -192,93 +192,101 @@ hashIncInt(countTracks, "superTrack child"); hashIncInt(countTracks, stripType); hashIncInt(countTracks, "track count"); } else if (isEmpty(tdb->type)) hashIncInt(countTracks, "no type specified"); else { hashIncInt(countTracks, stripType); hashIncInt(countTracks, "track count"); } freeMem(stripType); // showCounts(countTracks); } -static void sampleUrl(struct trackHub *hub, char *db, struct trackDb *tdb, char *chrom, long long chromSize) +static void sampleUrl(struct trackHub *hub, char *db, struct trackDb *tdb, char *chrom, long long chromSize, char *errorString) /* print out a sample getData URL */ { +char errorPrint[2048]; +errorPrint[0] = 0; + +if (isNotEmpty(errorString)) + { + safef(errorPrint, sizeof(errorPrint), " <font color='red'>ERROR: %s</font>", errorString); + } + unsigned start = chromSize / 4; unsigned end = start + 10000; if (end > chromSize) end = chromSize; char *genome = NULL; if (hub) genome = hub->genomeList->name; if (db) { if (hub) { if (tdb->parent) - hPrintf("<li>%s : %s subtrack of parent: %s <a href='%s/getData/track?hubUrl=%s&genome=%s&chrom=%s&track=%s&start=%u&end=%u' target=_blank>(sample getData)</a></li>\n", tdb->track, tdb->type, tdb->parent->track, urlPrefix, hub->url, genome, chrom, tdb->track, start, end ); + hPrintf("<li>%s : %s subtrack of parent: %s <a href='%s/getData/track?hubUrl=%s&genome=%s&chrom=%s&track=%s&start=%u&end=%u' target=_blank>(sample getData)%s</a></li>\n", tdb->track, tdb->type, tdb->parent->track, urlPrefix, hub->url, genome, chrom, tdb->track, start, end, errorPrint); else - hPrintf("<li>%s : %s <a href='%s/getData/track?hubUrl=%s&genome=%s&chrom=%s&track=%s&start=%u&end=%u' target=_blank>(sample getData)</a></li>\n", tdb->track, tdb->type, urlPrefix, hub->url, genome, chrom, tdb->track, start, end ); + hPrintf("<li>%s : %s <a href='%s/getData/track?hubUrl=%s&genome=%s&chrom=%s&track=%s&start=%u&end=%u' target=_blank>(sample getData)%s</a></li>\n", tdb->track, tdb->type, urlPrefix, hub->url, genome, chrom, tdb->track, start, end, errorPrint); } else { 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 ); + 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)%s</a></li>\n", tdb->track, tdb->type, tdb->parent->track, urlPrefix, db, chrom, tdb->track, start, end, errorPrint); 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 ); + hPrintf("<li>%s : %s <a href='%s/getData/track?db=%s&chrom=%s&track=%s&start=%u&end=%u' target=_blank>(sample getData)%s</a></li>\n", tdb->track, tdb->type, urlPrefix, db, chrom, tdb->track, start, end, errorPrint); } } else if (hub) { if (tdb->parent) - hPrintf("<li>%s : %s subtrack of parent: %s <a href='%s/getData/track?hubUrl=%s&genome=%s&chrom=%s&track=%s&start=%u&end=%u' target=_blank>(sample getData)</a></li>\n", tdb->track, tdb->type, tdb->parent->track, urlPrefix, hub->url, genome, chrom, tdb->track, start, end ); + hPrintf("<li>%s : %s subtrack of parent: %s <a href='%s/getData/track?hubUrl=%s&genome=%s&chrom=%s&track=%s&start=%u&end=%u' target=_blank>(sample getData)%s</a></li>\n", tdb->track, tdb->type, tdb->parent->track, urlPrefix, hub->url, genome, chrom, tdb->track, start, end, errorPrint); else - hPrintf("<li>%s : %s <a href='%s/getData/track?hubUrl=%s&genome=%s&chrom=%s&track=%s&start=%u&end=%u' target=_blank>(sample getData)</a></li>\n", tdb->track, tdb->type, urlPrefix, hub->url, genome, chrom, tdb->track, start, end ); + hPrintf("<li>%s : %s <a href='%s/getData/track?hubUrl=%s&genome=%s&chrom=%s&track=%s&start=%u&end=%u' target=_blank>(sample getData)%s</a></li>\n", tdb->track, tdb->type, urlPrefix, hub->url, genome, chrom, tdb->track, start, end, errorPrint); } else hPrintf("<li>%s : %s not db hub track ?</li>\n", tdb->track, tdb->type); } static void showSubTracks(struct trackHub *hub, char *db, struct trackDb *tdb, struct hash *countTracks, - char *chromName, long long chromSize) + char *chromName, long long chromSize, char *errorString) /* tdb has subtracks, show only subTracks, no details */ { hPrintf(" <li><ul>\n"); if (debug) 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); else { if (isSupportedType(tdbEl->type)) - sampleUrl(hub, db, tdbEl, chromName, chromSize); + sampleUrl(hub, db, tdbEl, chromName, chromSize, errorString); 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(hub, db, tdbEl, countTracks, chromName, chromSize); + showSubTracks(hub, db, tdbEl, countTracks, chromName, chromSize, errorString); } } hPrintf(" </ul></li>\n"); } static void trackSettings(struct trackDb *tdb, struct hash *countTracks) /* process the settingsHash for a trackDb, recursive when subtracks */ { hPrintf(" <li><ul>\n"); // if (tdb->children) haven't yet seen a track with children ? // hPrintf(" <li>%s: has children</li>\n", tdb->track); // else // hPrintf(" <li>%s: NO children</li>\n", tdb->track); struct hashEl *hel; struct hashCookie hc = hashFirst(tdb->settingsHash); @@ -419,171 +427,189 @@ } errCatchEnd(errCatch); if (errCatch->gotError) { retVal = 1; dyStringPrintf(errors, "%s", errCatch->message->string); } errCatchFree(&errCatch); return retVal; } /* static int bbiBriefMeasure() */ static void hubSampleUrl(struct trackHub *hub, struct trackDb *tdb, long chromCount, long itemCount, char *chromName, unsigned chromSize, - char *genome) + char *genome, char *errorString) { unsigned start = chromSize / 4; unsigned end = start + 10000; if (end > chromSize) end = chromSize; +char errorPrint[2048]; +errorPrint[0] = 0; + +if (isNotEmpty(errorString)) + { + safef(errorPrint, sizeof(errorPrint), " : <font color='red'>ERROR: %s</font>", errorString); + } + if (isSupportedType(tdb->type)) { if (startsWithWord("bigBed", tdb->type)) - hPrintf(" <li>%s : %s : %ld chroms : %ld item count <a href='%s/getData/track?hubUrl=%s&genome=%s&track=%s&chrom=%s&start=%u&end=%u' target=_blank>(Xsample getData)</a></li>\n", tdb->track, tdb->type, chromCount, itemCount, urlPrefix, hub->url, genome, tdb->track, chromName, start, end); + hPrintf(" <li>%s : %s : %ld chroms : %ld item count <a href='%s/getData/track?hubUrl=%s&genome=%s&track=%s&chrom=%s&start=%u&end=%u' target=_blank>(sample getData)%s</a></li>\n", tdb->track, tdb->type, chromCount, itemCount, urlPrefix, hub->url, genome, tdb->track, chromName, start, end, errorPrint); else if (startsWithWord("bigWig", tdb->type)) - 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>(Xsample getData)</a></li>\n", tdb->track, tdb->type, chromCount, itemCount, urlPrefix, hub->url, genome, tdb->track, chromName, start, end); + 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)%s</a></li>\n", tdb->track, tdb->type, chromCount, itemCount, urlPrefix, hub->url, genome, tdb->track, chromName, start, end, errorPrint); 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>(Xsample getData)</a></li>\n", tdb->track, tdb->type, chromCount, itemCount, urlPrefix, hub->url, genome, tdb->track, chromName, start, end); + 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)%s</a></li>\n", tdb->track, tdb->type, chromCount, itemCount, urlPrefix, hub->url, genome, tdb->track, chromName, start, end, errorPrint); } 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 hubSampleUrl(struct trackHub *hub, struct trackDb *tdb, + * long chromCount, long itemCount, char *chromName, unsigned chromSize, + * char *genome) + */ 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); char *longName = NULL; unsigned longSize = 0; long chromCount = 0; long itemCount = 0; -if (! (compositeContainer || compositeView) ) - { 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); - } + +if (! (compositeContainer || compositeView) ) + (void) bbiBriefMeasure(tdb->type, bigDataUrl, bigDataIndex, &chromCount, &itemCount, errors, &longName, &longSize); if (depthSearch && bigDataUrl) { if (isSupportedType(tdb->type)) { if (chromSize > 0) - hubSampleUrl(hub, tdb, chromCount, itemCount, chromName, chromSize, genome); + hubSampleUrl(hub, tdb, chromCount, itemCount, chromName, chromSize, genome, errors->string); else - hubSampleUrl(hub, tdb, chromCount, itemCount, longName, longSize, genome); + hubSampleUrl(hub, tdb, chromCount, itemCount, longName, longSize, genome, errors->string); } } 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); else if (superChild) hPrintf(" <li>%s : %s : superTrack child of parent: %s (sample getData)</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); + { + if (isSupportedType(tdb->type)) + { + if (chromSize > 0) + hubSampleUrl(hub, tdb, chromCount, itemCount, chromName, chromSize, genome, errors->string); + else + hubSampleUrl(hub, tdb, chromCount, itemCount, longName, longSize, genome, errors->string); + } + // hPrintf(" <li>%s : %s : %s (maybe sample ?)</li>\n", tdb->track, tdb->type, bigDataUrl); + } else { if (isSupportedType(tdb->type)) { if (chromSize > 0) - hubSampleUrl(hub, tdb, chromCount, itemCount, chromName, chromSize, genome); + hubSampleUrl(hub, tdb, chromCount, itemCount, chromName, chromSize, genome, errors->string); else - hubSampleUrl(hub, tdb, chromCount, itemCount, longName, longSize, genome); + hubSampleUrl(hub, tdb, chromCount, itemCount, longName, longSize, genome, errors->string); } else - hPrintf(" <li>%s : %s</li>\n", tdb->track, tdb->type); + hPrintf(" <li>%s : %s (what is this)</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(hub, db, tdb, countTracks, chromName, chromSize); + showSubTracks(hub, db, tdb, countTracks, chromName, chromSize, errors->string); } return; } /* static void hubCountOneTdb(char *db, struct trackDb *tdb, * char *bigDataIndex, struct hash *countTracks, * char *chromName, long long chromSize) */ static void countOneTdb(char *db, struct trackDb *tdb, - struct hash *countTracks, char *chromName, unsigned chromSize) + struct hash *countTracks, char *chromName, unsigned chromSize, + char *errorString) /* for this tdb in this db, count it up and provide a sample */ { 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 (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); 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(NULL, db, tdb, chromName, chromSize); + sampleUrl(NULL, db, tdb, chromName, chromSize, errorString); 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(NULL, db, tdb, countTracks, chromName, chromSize); + showSubTracks(NULL, db, tdb, countTracks, chromName, chromSize, NULL); } return; } /* static void countOneTdb(char *db, struct trackDb *tdb, * struct hash *countTracks, char *chromName, * unsigned 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); sqlSafef(query, sizeof(query), "select chrom,size from chromInfo order by size desc limit 1"); @@ -819,31 +845,31 @@ } 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(db, tdb, countTracks, chromName, chromSize); + countOneTdb(db, tdb, countTracks, chromName, chromSize, NULL); if (timeOutReached()) break; } int trackCount = ptToInt(hashFindVal(countTracks, "track count")); /* elCount - 1 since the 'track count' element isn't a track */ hPrintf(" <li>%d total tracks counted, %d different track types</li>\n", trackCount, countTracks->elCount - 1); if (countTracks->elCount) { hPrintf(" <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;