b30cdeb86d8532e8a41afa61aef02f988d957aeb max Fri May 9 14:46:48 2014 -0700 making some changes to bacEnds tracks code to allow change of tablename. Removing some code which is not necessary anymore as a result. diff --git src/hg/hgTracks/simpleTracks.c src/hg/hgTracks/simpleTracks.c index 3d41fd6..fc44902 100644 --- src/hg/hgTracks/simpleTracks.c +++ src/hg/hgTracks/simpleTracks.c @@ -3652,113 +3652,122 @@ lf->extra = (void *)USE_ITEM_RGB; lf->filterColor = (unsigned)bed->expIds[i]; slAddHead(&lfList, lf); } slReverse(&lfList); lfs->features = lfList; lfs->noLine = FALSE; return lfs; } struct linkedFeatures *lfFromBed(struct bed *bed) { return lfFromBedExtra(bed, 0, 1000); } -struct linkedFeaturesSeries *lfsFromBed(struct lfs *lfsbed) +struct linkedFeaturesSeries *lfsFromBed(struct lfs *lfsbed, char *tdbPslTable) /* Create linked feature series object from database bed record */ { struct sqlConnection *conn = hAllocConn(database); struct sqlResult *sr = NULL; char **row, rest[64]; int rowOffset, i; struct linkedFeaturesSeries *lfs; struct linkedFeatures *lfList = NULL, *lf; AllocVar(lfs); lfs->name = cloneString(lfsbed->name); lfs->start = lfsbed->chromStart; lfs->end = lfsbed->chromEnd; lfs->orientation = orientFromChar(lfsbed->strand[0]); /* Get linked features */ for (i = 0; i < lfsbed->lfCount; i++) { AllocVar(lf); sqlSafefFrag(rest, sizeof rest, "qName = '%s'", lfsbed->lfNames[i]); - sr = hRangeQuery(conn, lfsbed->pslTable, lfsbed->chrom, lfsbed->lfStarts[i], + + // use psl table from trackDb, if specified there + char *pslTable = lfsbed->pslTable; + if (tdbPslTable != NULL) + pslTable = tdbPslTable; + + sr = hRangeQuery(conn, pslTable, lfsbed->chrom, lfsbed->lfStarts[i], lfsbed->lfStarts[i] + lfsbed->lfSizes[i], rest, &rowOffset); if ((row = sqlNextRow(sr)) != NULL) { struct psl *psl = pslLoad(row+rowOffset); lf = lfFromPsl(psl, FALSE); slAddHead(&lfList, lf); } sqlFreeResult(&sr); } slReverse(&lfList); sqlFreeResult(&sr); hFreeConn(&conn); lfs->features = lfList; return lfs; } -static struct linkedFeaturesSeries *lfsFromBedsInRange(char *table, int start, int end, +static struct linkedFeaturesSeries *lfsFromBedsInRange(struct track *tg, int start, int end, char *chromName) /* Return linked features from range of table. */ { +char *table = tg->track; struct sqlConnection *conn = hAllocConn(database); struct sqlResult *sr = NULL; char **row; int rowOffset; struct linkedFeaturesSeries *lfsList = NULL, *lfs; char optionScoreStr[256]; /* Option - score filter */ // Special case where getScoreFilterClause is too much trouble safef(optionScoreStr, sizeof(optionScoreStr), "%s.%s", table,SCORE_FILTER); // Special case where CloserToHome not appropriate int optionScore = cartUsualInt(cart, optionScoreStr, 0); if (optionScore > 0) { char extraWhere[128]; safef(extraWhere, sizeof(extraWhere), "score >= %d", optionScore); sr = hOrderedRangeQuery(conn, table, chromName, start, end, extraWhere, &rowOffset); } else { sr = hOrderedRangeQuery(conn, table, chromName, start, end, NULL, &rowOffset); } + +char *pslTable = trackDbSetting(tg->tdb, "lfPslTable"); while ((row = sqlNextRow(sr)) != NULL) { struct lfs *lfsbed = lfsLoad(row+rowOffset); - lfs = lfsFromBed(lfsbed); + lfs = lfsFromBed(lfsbed, pslTable); slAddHead(&lfsList, lfs); lfsFree(&lfsbed); } slReverse(&lfsList); sqlFreeResult(&sr); hFreeConn(&conn); return lfsList; } #ifndef GBROWSE void loadBacEndPairs(struct track *tg) /* Load up bac end pairs from table into track items. */ { -tg->items = lfsFromBedsInRange("bacEndPairs", winStart, winEnd, chromName); +tg->items = lfsFromBedsInRange(tg, winStart, winEnd, chromName); } static Color dbRIPColor(struct track *tg, void *item, struct hvGfx *hvg) /* Return color to draw dbRIP item */ { struct dbRIP *thisItem = item; if (startsWith("Other", thisItem->polySource)) return tg->ixAltColor; else return MG_BLUE; } static void loadDbRIP(struct track *tg) /* retroposons tracks load methods */ @@ -3909,140 +3918,30 @@ { bedMethods(tg); tg->loadItems = loadDbRIP; tg->itemColor = dbRIPColor; tg->itemNameColor = dbRIPColor; tg->itemLabelColor = dbRIPColor; } void bacEndPairsMethods(struct track *tg) /* Fill in track methods for linked features.series */ { linkedFeaturesSeriesMethods(tg); tg->loadItems = loadBacEndPairs; } - -void loadBacEndPairsBad(struct track *tg) -/* Load up fosmid end pairs from table into track items. */ -{ -tg->items = lfsFromBedsInRange("bacEndPairsBad", winStart, winEnd, chromName); -} - - -void bacEndPairsBadMethods(struct track *tg) -/* Fill in track methods for linked features.series */ -{ -linkedFeaturesSeriesMethods(tg); -tg->loadItems = loadBacEndPairsBad; -} - -void loadBacEndPairsLong(struct track *tg) -/* Load up BAC end pairs from table into track items. */ -{ -tg->items = lfsFromBedsInRange("bacEndPairsLong", winStart, winEnd, chromName); -} - - -void bacEndPairsLongMethods(struct track *tg) -/* Fill in track methods for linked features.series */ -{ -linkedFeaturesSeriesMethods(tg); -tg->loadItems = loadBacEndPairsLong; -} - -void loadBacEndSingles(struct track *tg) -/* Load up BAC end pairs from table into track items. */ -{ -tg->items = lfsFromBedsInRange("bacEndSingles", winStart, winEnd, chromName); -} - -void bacEndSinglesMethods(struct track *tg) -/* Fill in track methods for linked features.series */ -{ -linkedFeaturesSeriesMethods(tg); -tg->loadItems = loadBacEndSingles; -} - -void loadFosEndPairs(struct track *tg) -/* Load up fosmid end pairs from table into track items. */ -{ -tg->items = lfsFromBedsInRange("fosEndPairs", winStart, winEnd, chromName); -} - -void fosEndPairsMethods(struct track *tg) -/* Fill in track methods for linked features.series */ -{ -linkedFeaturesSeriesMethods(tg); -tg->loadItems = loadFosEndPairs; -} - -void loadFosEndPairsBad(struct track *tg) -/* Load up fosmid end pairs from table into track items. */ -{ -tg->items = lfsFromBedsInRange("fosEndPairsBad", winStart, winEnd, chromName); -} - - -void fosEndPairsBadMethods(struct track *tg) -/* Fill in track methods for linked features.series */ -{ -linkedFeaturesSeriesMethods(tg); -tg->loadItems = loadFosEndPairsBad; -} - -void loadFosEndPairsLong(struct track *tg) -/* Load up fosmid end pairs from table into track items. */ -{ -tg->items = lfsFromBedsInRange("fosEndPairsLong", winStart, winEnd, chromName); -} - - -void fosEndPairsLongMethods(struct track *tg) -/* Fill in track methods for linked features.series */ -{ -linkedFeaturesSeriesMethods(tg); -tg->loadItems = loadFosEndPairsLong; -} - -void loadEarlyRep(struct track *tg) -/* Load up early replication cosmid pairs from table into track items. */ -{ -tg->items = lfsFromBedsInRange("earlyRep", winStart, winEnd, chromName); -} - -void earlyRepMethods(struct track *tg) -/* Fill in track methods for linked features.series */ -{ -linkedFeaturesSeriesMethods(tg); -tg->loadItems = loadEarlyRep; -} - - -void loadEarlyRepBad(struct track *tg) -/* Load up bad early replication pairs from table into track items. */ -{ -tg->items = lfsFromBedsInRange("earlyRepBad", winStart, winEnd, chromName); -} - - -void earlyRepBadMethods(struct track *tg) -/* Fill in track methods for linked features.series */ -{ -linkedFeaturesSeriesMethods(tg); -tg->loadItems = loadEarlyRepBad; -} #endif /* GBROWSE */ // The following few functions are shared by GAD, OMIM, DECIPHER, Superfamily. // Those tracks need an extra label derived from item name -- the extra label // is used as mouseover text for each item, and appears to the immediate left // of the feature in full mode. struct bedPlusLabel { struct bed bed; // inline, so struct bedPlusLabel * can be cast to struct bed *. char *label; }; typedef char *labelFromNameFunction(char *name); @@ -12672,50 +12571,64 @@ } TrackHandler lookupTrackHandlerClosestToHome(struct trackDb *tdb) /* Lookup handler for track of give name. Try parents if * subtrack has a NULL handler. Return NULL if none. */ { TrackHandler handler = lookupTrackHandler(tdb->table); // while handler is NULL and we have a parent, use the parent's handler for( ; (handler == NULL) && (tdb->parent != NULL); ) { tdb = tdb->parent; handler = lookupTrackHandler(tdb->table); } +// if nothing found, try the "trackHandler" statement +if (handler == NULL) + { + char *handlerName = trackDbSetting(tdb, "trackHandler"); + if (handlerName != NULL) + { + handler = lookupTrackHandler(handlerName); + if (handler==NULL) + errAbort("track %s defined a trackHandler in trackDb which does not exist", tdb->track); + } + } + return handler; } void registerTrackHandlers() /* Register tracks that include some non-standard methods. */ { #ifndef GBROWSE registerTrackHandler("rgdGene", rgdGeneMethods); registerTrackHandler("cgapSage", cgapSageMethods); registerTrackHandler("cytoBand", cytoBandMethods); registerTrackHandler("cytoBandIdeo", cytoBandIdeoMethods); + registerTrackHandler("bacEndPairs", bacEndPairsMethods); -registerTrackHandler("bacEndPairsBad", bacEndPairsBadMethods); -registerTrackHandler("bacEndPairsLong", bacEndPairsLongMethods); -registerTrackHandler("bacEndSingles", bacEndSinglesMethods); -registerTrackHandler("fosEndPairs", fosEndPairsMethods); -registerTrackHandler("fosEndPairsBad", fosEndPairsBadMethods); -registerTrackHandler("fosEndPairsLong", fosEndPairsLongMethods); -registerTrackHandler("earlyRep", earlyRepMethods); -registerTrackHandler("earlyRepBad", earlyRepBadMethods); +registerTrackHandler("bacEndPairsBad", bacEndPairsMethods); +registerTrackHandler("bacEndPairsLong", bacEndPairsMethods); +registerTrackHandler("bacEndSingles", bacEndPairsMethods); +registerTrackHandler("fosEndPairs", bacEndPairsMethods); +registerTrackHandler("fosEndPairsBad", bacEndPairsMethods); +registerTrackHandler("fosEndPairsLong", bacEndPairsMethods); +registerTrackHandler("earlyRep", bacEndPairsMethods); +registerTrackHandler("earlyRepBad", bacEndPairsMethods); + registerTrackHandler("genMapDb", genMapDbMethods); registerTrackHandler("cgh", cghMethods); registerTrackHandler("mcnBreakpoints", mcnBreakpointsMethods); registerTrackHandler("fishClones", fishClonesMethods); registerTrackHandler("mapGenethon", genethonMethods); registerTrackHandler("stsMarker", stsMarkerMethods); registerTrackHandler("stsMap", stsMapMethods); registerTrackHandler("stsMapMouseNew", stsMapMouseMethods); registerTrackHandler("stsMapRat", stsMapRatMethods); registerTrackHandler("snpMap", snpMapMethods); registerTrackHandler("snp", snpMethods); registerTrackHandler("snp125", snp125Methods); registerTrackHandler("snp126", snp125Methods); registerTrackHandler("snp127", snp125Methods); registerTrackHandler("snp128", snp125Methods);