4abb8b25cdc147ee22fb88f20ee7bf5e98962a41
angie
  Wed Sep 2 16:18:21 2015 -0700
Look for trackDbSetting "trackHandler" in lookupTrackHandler instead of looking it up at the end of lookupTrackHandlerClosestToHome after modifying tdb.  That was losing child trackHandler settings.

diff --git src/hg/hgTracks/simpleTracks.c src/hg/hgTracks/simpleTracks.c
index d4ec2d0..32d076e 100644
--- src/hg/hgTracks/simpleTracks.c
+++ src/hg/hgTracks/simpleTracks.c
@@ -13176,63 +13176,63 @@
     handlerHash = newHash(6);
 if (hashLookup(handlerHash, name))
     warn("handler duplicated for track %s", name);
 else
     hashAdd(handlerHash, name, handler);
 }
 
 #define registerTrackHandlerOnFamily(name, handler) registerTrackHandler(name, handler)
 // Marker to show that are actually registering subtracks as well.  I'd like to redo
 // this system a little.  It seems dangerous now.  There's no way to know in the .ra
 // file that there is a handler,  and as composite tracks start to allow multiple types
 // of subtracks,  the handler of the parent will still override _all_ of the children.
 // If parents and children put in different handlers, there's no way to know which one
 // the child will get.
 
-static TrackHandler lookupTrackHandler(char *name)
+static TrackHandler lookupTrackHandler(struct trackDb *tdb)
 /* Lookup handler for track of give name.  Return NULL if none. */
 {
 if (handlerHash == NULL)
     return NULL;
-return hashFindVal(handlerHash, name);
+TrackHandler handler = hashFindVal(handlerHash, tdb->table);
+// if nothing found, try the "trackHandler" statement
+if (handler == NULL)
+    {
+    char *handlerName = trackDbSetting(tdb, "trackHandler");
+    if (handlerName != NULL)
+        {
+        handler = hashFindVal(handlerHash, handlerName);
+        if (handler==NULL)
+            errAbort("track %s defined a trackHandler '%s' in trackDb which does not exist",
+                     tdb->track, handlerName);
+        }
+    }
+return handler;
 }
 
 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);
+TrackHandler handler = lookupTrackHandler(tdb);
 
 // 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);
+    handler = lookupTrackHandler(tdb);
     }
-
-// 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", bacEndPairsMethods);
 registerTrackHandler("bacEndPairsLong", bacEndPairsMethods);