6dcef0d057b21be3cb1cbe699998764883543c84 kate Thu Apr 6 16:46:22 2017 -0700 First cut bigBarChart track type for hubs. Basic function on hgTracks, hgTrackUi, and hgc. Lacks boxplot on details page, custom track support, extra fields diff --git src/hg/hgTracks/bedTrack.c src/hg/hgTracks/bedTrack.c index da2759d..17ad9c4 100644 --- src/hg/hgTracks/bedTrack.c +++ src/hg/hgTracks/bedTrack.c @@ -82,62 +82,46 @@ } struct slPair *thisLabel = labelList; for(; thisLabel; thisLabel = thisLabel->next) { if (hashLookup(onHash, thisLabel->name)) { // put this column number in the list of columns to use to make label slAddHead(&track->labelColumns, slIntNew(ptToInt(thisLabel->val))); } } slReverse(&track->labelColumns); } } -void loadSimpleBed(struct track *tg) -/* Load the items in one track - just move beds in - * window... */ +char *bedName(struct track *tg, void *item); + +void loadSimpleBedWithLoader(struct track *tg, bedItemLoader loader) +/* Load the items in one track using specified loader - just move beds in window... */ { -struct bed *(*loader)(char **row); struct bed *bed, *list = NULL; char **row; int rowOffset; char *words[3]; int wordCt; char query[128]; -char *setting = NULL; bool doScoreCtFilter = FALSE; int scoreFilterCt = 0; +char *setting; char *topTable = NULL; -if (tg->bedSize <= 3) - loader = bedLoad3; -else if (tg->bedSize == 4) - loader = bedLoad; -else if (tg->bedSize == 5) - loader = bedLoad5; -else - loader = bedLoad6; - -// pairedTagAlign loader is required for base coloring using sequence from seq1 & seq2 -// after removing optional bin column, this loader assumes seq1 and seq2 are in -// row[6] and row[7] respectively of the sql result. -if ((setting = trackDbSetting(tg->tdb, BASE_COLOR_USE_SEQUENCE)) - && sameString(setting, "seq1Seq2")) - loader = bedLoadPairedTagAlign; - /* limit to a specified count of top scoring items. * If this is selected, it overrides selecting item by specified score */ if ((setting = trackDbSettingClosestToHome(tg->tdb, "filterTopScorers")) != NULL) { wordCt = chopLine(cloneString(setting), words); if (wordCt >= 3) { doScoreCtFilter = cartUsualBooleanClosestToHome(cart, tg->tdb, FALSE, "filterTopScorersOn",sameString(words[0], "on")); scoreFilterCt = cartUsualIntClosestToHome(cart, tg->tdb, FALSE, "filterTopScorersCt", atoi(words[1])); topTable = words[2]; /* if there are not too many rows in the table then can define */ /* top table as the track or subtrack table */ if (sameWord(topTable, "self")) @@ -153,31 +137,31 @@ struct bedTabixFile *btf = bedTabixFileMayOpen(bigDataUrl, NULL, 0, 0); list = bedTabixReadBeds(btf, chromName, winStart, winEnd, loader); bedTabixFileClose(&btf); } else if (tg->isBigBed) { // avoid opening an unneeded db connection for bigBed; required not to use mysql for parallel fetch tracks char *scoreFilter = cartOrTdbString(cart, tg->tdb, "scoreFilter", NULL); struct lm *lm = lmInit(0); struct bigBedInterval *bb, *bbList = bigBedSelectRange(tg, chromName, winStart, winEnd, lm); char *bedRow[32]; char startBuf[16], endBuf[16]; int minScore = 0; if (scoreFilter) minScore = atoi(scoreFilter); - if (!trackDbSettingClosestToHomeOn(tg->tdb, "linkIdInName")) + if (tg->itemName == bedName && !trackDbSettingClosestToHomeOn(tg->tdb, "linkIdInName")) tg->itemName = bigBedItemName; calculateLabelFields(tg); for (bb = bbList; bb != NULL; bb = bb->next) { bigBedIntervalToRow(bb, chromName, startBuf, endBuf, bedRow, ArraySize(bedRow)); bed = loader(bedRow); bed->label = makeLabel(tg, bb); if (scoreFilter == NULL || bed->score >= minScore) slAddHead(&list, bed); } lmCleanup(&lm); } else { @@ -208,30 +192,54 @@ } sqlFreeResult(&sr); hFreeConn(&conn); } if (doScoreCtFilter) { /* filter out items not in this window */ struct bed *newList = bedFilterListInRange(list, NULL, chromName, winStart, winEnd); list = newList; } slReverse(&list); tg->items = list; } +void loadSimpleBed(struct track *tg) +/* Load the items in one track - just move beds in + * window... */ +{ +struct bed *(*loader)(char **row); +if (tg->bedSize <= 3) + loader = bedLoad3; +else if (tg->bedSize == 4) + loader = bedLoad; +else if (tg->bedSize == 5) + loader = bedLoad5; +else + loader = bedLoad6; + +char *setting = NULL; +// pairedTagAlign loader is required for base coloring using sequence from seq1 & seq2 +// after removing optional bin column, this loader assumes seq1 and seq2 are in +// row[6] and row[7] respectively of the sql result. +if ((setting = trackDbSetting(tg->tdb, BASE_COLOR_USE_SEQUENCE)) + && sameString(setting, "seq1Seq2")) + loader = bedLoadPairedTagAlign; +loadSimpleBedWithLoader(tg, loader); +} + void bed8To12(struct bed *bed) /* Turn a bed 8 into a bed 12 by defining one block. */ { // Make up a block: the whole thing. bed->blockCount = 1; bed->blockSizes = needMem(bed->blockCount * sizeof(int)); bed->chromStarts = needMem(bed->blockCount * sizeof(int)); bed->blockSizes[0] = bed->chromEnd - bed->chromStart; bed->chromStarts[0] = 0; // Some tracks overload thickStart and thickEnd -- catch garbage here. if ((bed->thickStart != 0) && ((bed->thickStart < bed->chromStart) || (bed->thickStart > bed->chromEnd))) bed->thickStart = bed->chromStart; if ((bed->thickEnd != 0) &&