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);