Index: src/hg/hgTables/maf.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/hg/hgTables/maf.c,v
retrieving revision 1.17
retrieving revision 1.18
diff -b -B -U 1000000 -r1.17 -r1.18
--- src/hg/hgTables/maf.c	20 May 2009 20:59:56 -0000	1.17
+++ src/hg/hgTables/maf.c	4 Jan 2010 19:12:22 -0000	1.18
@@ -1,123 +1,126 @@
 /* maf - stuff to process maf tracks.  */
 
 #include "common.h"
 #include "hash.h"
 #include "linefile.h"
 #include "dystring.h"
 #include "portable.h"
 #include "obscure.h"
 #include "jksql.h"
 #include "cheapcgi.h"
 #include "cart.h"
 #include "web.h"
 #include "trackDb.h"
 #include "maf.h"
 #include "hgMaf.h"
 #include "hgTables.h"
 
 static char const rcsid[] = "$Id$";
 
 boolean isMafTable(char *database, struct trackDb *track, char *table)
 /* Return TRUE if table is maf. */
 {
 if (track == NULL)
     return FALSE;
 if (isEmpty(track->type))
     return FALSE;
 
 if (sameString(track->tableName, table))
     {
     if (startsWithWord("maf",track->type) || startsWithWord("wigMaf",track->type))
         return TRUE;
     }
 else
     {
-    struct trackDb *childTdb;
-    for (childTdb = track->subtracks;childTdb;childTdb=childTdb->next)
+    struct slRef *tdbRefList = trackDbListGetRefsToDescendantLeaves(track->subtracks);
+    struct slRef *tdbRef;
+    for (tdbRef = tdbRefList; tdbRef != NULL; tdbRef = tdbRef->next)
         {
+	struct trackDb *childTdb = tdbRef->val;
         if(sameString(childTdb->tableName, table))
             {
             if (startsWithWord("maf",childTdb->type) || startsWithWord("wigMaf",childTdb->type))
                 return TRUE;
             break;
             }
         }
+    slFreeList(&tdbRefList);
     }
 return FALSE;
 }
 
 void doOutMaf(struct trackDb *track, char *table, struct sqlConnection *conn)
 /* Output regions as MAF.  maf tables look bed-like enough for
  * cookedBedsOnRegions to handle intersections. */
 {
 struct region *region = NULL, *regionList = getRegions();
 struct lm *lm = lmInit(64*1024);
 textOpen();
 
 struct sqlConnection *ctConn = NULL;
 struct sqlConnection *ctConn2 = NULL;
 struct customTrack *ct = NULL;
 char *mafFile = NULL;
 
 if (isCustomTrack(table))
     {
     ctConn = hAllocConn(CUSTOM_TRASH);
     ctConn2 = hAllocConn(CUSTOM_TRASH);
     ct = ctLookupName(table);
     struct hash *settings = track->settingsHash;
     if ((mafFile = hashFindVal(settings, "mafFile")) == NULL)
 	{
 	/* this shouldn't happen */
 	printf("cannot find custom track file %s\n", mafFile);
 	return;
 	}
     }
 
 mafWriteStart(stdout, NULL);
 for (region = regionList; region != NULL; region = region->next)
     {
     struct bed *bedList = cookedBedList(conn, table, region, lm, NULL);
     struct bed *bed = NULL;
     for (bed = bedList;  bed != NULL;  bed = bed->next)
 	{
 	struct mafAli *mafList = NULL, *maf = NULL;
 	char dbChrom[64];
 	safef(dbChrom, sizeof(dbChrom), "%s.%s", database, bed->chrom);
 	/* For MAF, we clip to viewing window (region) instead of showing
 	 * entire items that happen to overlap the window/region, which is
 	 * what we get from cookedBedList. */
 	if (bed->chromStart < region->start)
 	    bed->chromStart = region->start;
 	if (bed->chromEnd > region->end)
 	    bed->chromEnd = region->end;
 	if (bed->chromStart >= bed->chromEnd)
 	    continue;
 	if (ct == NULL)
 	    mafList = mafLoadInRegion(conn, table, bed->chrom,
 				      bed->chromStart, bed->chromEnd);
 	else
 	    mafList = mafLoadInRegion2(ctConn, ctConn2, ct->dbTableName,
 		    bed->chrom, bed->chromStart, bed->chromEnd, mafFile);
 	for (maf = mafList; maf != NULL; maf = maf->next)
 	    {
 	    struct mafAli *subset = mafSubset(maf, dbChrom,
 					      bed->chromStart, bed->chromEnd);
 	    if (subset != NULL)
 		{
 		subset->score = mafScoreMultiz(subset);
 		mafWrite(stdout, subset);
 		mafAliFree(&subset);
 		}
 	    }
 	mafAliFreeList(&mafList);
 	}
     }
 mafWriteEnd(stdout);
 lmCleanup(&lm);
 
 if (isCustomTrack(table))
     {
     hFreeConn(&ctConn);
     hFreeConn(&ctConn2);
     }
 }

