5e88a1196c6be3d47f925d8d31e401ef0a65c1fc braney Fri Nov 10 14:40:51 2017 -0800 add support for bigNarrowPeak in hubs and custom tracks diff --git src/hg/hgTracks/encode.c src/hg/hgTracks/encode.c index 2124499..f09a61a 100644 --- src/hg/hgTracks/encode.c +++ src/hg/hgTracks/encode.c @@ -160,30 +160,102 @@ static char *encodePeakFilter(char *trackName, struct trackDb *tdb, boolean isCustom) { struct dyString *extraWhere = newDyString(128); boolean and = FALSE; extraWhere = dyAddFilterAsInt(cart,tdb,extraWhere,SCORE_FILTER,"0:1000","score",&and); extraWhere = dyAddFilterAsDouble(cart,tdb,extraWhere,SIGNAL_FILTER,NULL,"signalValue",&and); extraWhere = dyAddFilterAsDouble(cart,tdb,extraWhere,PVALUE_FILTER,NULL,"pValue",&and); extraWhere = dyAddFilterAsDouble(cart,tdb,extraWhere,QVALUE_FILTER,NULL,"qValue",&and); if (sameString(extraWhere->string, "")) return NULL; return dyStringCannibalize(&extraWhere); } +struct bigBedFilter +/* Filter on a field in a bigBed file. */ +{ +struct bigBedFilter *next; +int field; // the field number +enum {COMPARE_DOUBLE, COMPARE_INT} comparisonType; // the type of the comparison +union // the value to compare to + { + double dvalue; + int ivalue; + }; +}; + +struct bigBedFilter *bigBedMakeFilter(struct cart *cart, struct trackDb *tdb, char *tdbName, char *fieldName) +/* Make a filter on this column if the trackDb or cart wants us to. */ +{ +return NULL; +} + +boolean bigBedFilterInterval(char **bedRow, struct bigBedFilter *filters) +/* Go through a row and filter based on filters. Return TRUE if all filters are passed. */ +{ +return TRUE; +} + +void bigNarrowPeakLoadItems(struct track *tg) +/* Load a set of narrowPeaks from a bigNarrowPeak file. */ +{ +struct linkedFeatures *lfList = NULL; +enum encodePeakType pt = 0; +int scoreMin = atoi(trackDbSettingClosestToHomeOrDefault(tg->tdb, "scoreMin", "0")); +int scoreMax = atoi(trackDbSettingClosestToHomeOrDefault(tg->tdb, "scoreMax", "1000")); +pt = narrowPeak; + +tg->customInt = pt; +struct bbiFile *bbi = fetchBbiForTrack(tg); + +struct lm *lm = lmInit(0); +struct bigBedInterval *bb, *bbList = bigBedIntervalQuery(bbi, chromName, winStart, winEnd, 0, lm); +int fieldCount = 10; +char *bedRow[fieldCount]; +char startBuf[16], endBuf[16]; +struct bigBedFilter *filters = NULL; +struct bigBedFilter *filter; + +if ((filter = bigBedMakeFilter(cart, tg->tdb, SCORE_FILTER, "score")) != NULL) + slAddHead(&filters, filter); +if ((filter = bigBedMakeFilter(cart, tg->tdb, SIGNAL_FILTER, "signalValue")) != NULL) + slAddHead(&filters, filter); +if ((filter = bigBedMakeFilter(cart, tg->tdb, PVALUE_FILTER, "pValue")) != NULL) + slAddHead(&filters, filter); +if ((filter = bigBedMakeFilter(cart, tg->tdb, QVALUE_FILTER, "qValue")) != NULL) + slAddHead(&filters, filter); + +for (bb = bbList; bb != NULL; bb = bb->next) + { + bigBedIntervalToRow(bb, chromName, startBuf, endBuf, bedRow, ArraySize(bedRow)); + if (bigBedFilterInterval(bedRow, filters)) + { + struct encodePeak *peak = encodePeakGeneralLoad(bedRow, pt); + struct linkedFeatures *lf = lfFromEncodePeak((struct slList *)peak, tg->tdb, scoreMin, scoreMax); + + if (lf) + slAddHead(&lfList, lf); + } + } + +slReverse(&lfList); +slSort(&lfList, linkedFeaturesCmp); +tg->items = lfList; +} + static void encodePeakLoadItemsBoth(struct track *tg, struct customTrack *ct) /* Load up an encodePeak table from the regular database or the customTrash one. */ { char *db, *table; struct sqlConnection *conn; struct sqlResult *sr = NULL; char **row; char *filterConstraints = NULL; int rowOffset; struct linkedFeatures *lfList = NULL; enum encodePeakType pt = 0; int scoreMin = atoi(trackDbSettingClosestToHomeOrDefault(tg->tdb, "scoreMin", "0")); int scoreMax = atoi(trackDbSettingClosestToHomeOrDefault(tg->tdb, "scoreMax", "1000")); if (ct) {