1753574db04394981a56fae1ca4154fdd9d7f03c
braney
  Mon Jan 5 13:41:42 2015 -0800
stop putting stuff in the cart when displaying wigMaf tracks.  #14622
diff --git src/hg/hgTracks/wigMafTrack.c src/hg/hgTracks/wigMafTrack.c
index 1b25480..0779527 100644
--- src/hg/hgTracks/wigMafTrack.c
+++ src/hg/hgTracks/wigMafTrack.c
@@ -144,37 +144,34 @@
 
 	    mi->height = tl.fontHeight;
 	    slAddHead(&miList, mi);
 	    hashAdd(hash, mi->db, mi);
 	    }
 	}
     }
 hashFree(&hash);
 
 return miList;
 }
 
 struct wigMafItem *newSpeciesItems(struct track *track, int height)
 /* Make up item list for all species configured in track settings */
 {
-struct dyString *order = dyStringNew(256);
-char option[MAX_SP_SIZE];
 char *species[MAX_SP_SIZE];
 char *groups[20];
 char *defaultOff[MAX_SP_SIZE];
 char sGroup[MAX_SP_SIZE];
-struct wigMafItem *mi = NULL, *miList = NULL;
 int group;
 int i;
 int speciesCt = 0, groupCt = 1;
 int speciesOffCt = 0;
 struct hash *speciesOffHash = newHash(0);
 char *speciesUseFile = trackDbSetting(track->tdb, SPECIES_USE_FILE);
 char *msaTable = NULL;
 
 /* either speciesOrder or speciesGroup is specified in trackDb */
 char *speciesOrder = trackDbSetting(track->tdb, SPECIES_ORDER_VAR);
 char *speciesGroup = trackDbSetting(track->tdb, SPECIES_GROUP_VAR);
 char *speciesOff = trackDbSetting(track->tdb, SPECIES_DEFAULT_OFF_VAR);
 
 bool lowerFirstChar = TRUE;
 char *firstCase;
@@ -216,66 +213,52 @@
 
 /* keep track of species configured off initially for track */
 if (speciesOff)
     {
     speciesOffCt = chopLine(cloneString(speciesOff), defaultOff);
     for (i = 0; i < speciesOffCt; i++)
         hashAdd(speciesOffHash, defaultOff[i], NULL);
     }
 
 char *prefix = track->track; // use when setting things to the cart
 if (tdbIsContainerChild(track->tdb))
     prefix = tdbGetContainer(track->tdb)->track;
 
 /* Make up items for other organisms by scanning through group & species
    track settings */
+struct wigMafItem *mi = NULL, *miList = NULL;
 for (group = 0; group < groupCt; group++)
     {
     if (groupCt != 1 || !speciesOrder)
         {
         safef(sGroup, sizeof sGroup, "%s%s",
                                 SPECIES_GROUP_PREFIX, groups[group]);
         speciesOrder = trackDbRequiredSetting(track->tdb, sGroup);
         }
     speciesCt = chopLine(cloneString(speciesOrder), species);
     for (i = 0; i < speciesCt; i++)
         {
-        /* skip this species if UI checkbox was unchecked */
-        if (!cartVarExistsAnyLevel(cart, track->tdb,FALSE,species[i]))
-            {
-            if (hashLookup(speciesOffHash, species[i]))
+	boolean defaultOn = (hashLookup(speciesOffHash, species[i]) == NULL);
+
+	if (cartUsualBooleanClosestToHome(cart, track->tdb, FALSE, species[i],defaultOn))
 	    {
-                safef(option, sizeof(option), "%s.%s", prefix, species[i]);
-                cartSetBoolean(cart, option, FALSE);
-                }
-            }
-        if (!cartUsualBooleanClosestToHome(cart, track->tdb, FALSE, species[i],TRUE))
-            continue;
 	    mi = newMafItem(species[i], group, lowerFirstChar);
+	    mi->height = height;
 	    slAddHead(&miList, mi);
 	    }
         }
-
-slReverse(&miList);
-for (mi = miList; mi != NULL; mi = mi->next)
-    {
-    mi->height = height;
-    dyStringPrintf(order, "%s ",mi->db);
     }
-safef(option, sizeof(option), "%s.speciesOrder", prefix);
-cartSetString(cart, option, order->string);
-slReverse(&miList);
 
 return miList;
 }
 
 static struct wigMafItem *scoreItem(int scoreHeight, char *label)
 /* Make up item that will show the score */
 {
 struct wigMafItem *mi;
 
 AllocVar(mi);
 mi->name = cloneString(label);
 mi->height = scoreHeight;
 return mi;
 }
 
@@ -1135,52 +1118,49 @@
 {
 /* Draw pairwise display for this multiple alignment */
 char *summary;
 struct wigMafItem *miList = track->items, *mi = miList;
 struct sqlConnection *conn;
 struct sqlResult *sr = NULL;
 char **row = NULL;
 int rowOffset = 0;
 struct mafSummary *ms, *summaryList;
 struct hash *componentHash = newHash(6);
 struct hashEl *hel;
 struct hashCookie cookie;
 struct dyString *where = dyStringNew(256);
 char *whereClause = NULL;
 boolean useIrowChains = TRUE;
-char option[64];
 
 if (miList == NULL)
     return FALSE;
 
 char *prefix = track->track; // use when setting things to the cart
 if (tdbIsContainerChild(track->tdb))
     prefix = tdbGetContainer(track->tdb)->track;
 
 /* get summary table name from trackDb */
 if ((summary = summarySetting(track)) == NULL)
     return FALSE;
 
 if (cartVarExistsAnyLevel(cart, track->tdb,FALSE,MAF_CHAIN_VAR))
     useIrowChains = cartUsualBooleanClosestToHome(cart, track->tdb, FALSE, MAF_CHAIN_VAR,TRUE);
 else
     {
     char *irowString = trackDbSetting(track->tdb, "irows");
     if (irowString && sameString(irowString, "off"))
 	useIrowChains = FALSE;
-    safef(option, sizeof(option), "%s.%s", prefix, MAF_CHAIN_VAR);
-    cartSetBoolean(cart, option, useIrowChains);
     }
 
 /* Create SQL where clause that will load up just the
  * summaries for the species that we are including. */
 conn = hAllocConn(database);
 dyStringAppend(where, "src in (");
 for (mi = miList; mi != NULL; mi = mi->next)
     {
     if (!isPairwiseItem(mi))
 	/* exclude non-species items (e.g. conservation wiggle */
 	continue;
     dyStringPrintf(where, "'%s'", mi->db);
     if (mi->next != NULL)
 	dyStringAppend(where, ",");
     }
@@ -1363,50 +1343,47 @@
 }
 
 static boolean drawPairsFromMultipleMaf(struct track *track,
         int seqStart, int seqEnd,
         struct hvGfx *hvg, int xOff, int yOff, int width, MgFont *font,
         Color color, enum trackVisibility vis)
 /* Draw pairwise display from maf of multiple alignment.
  * Extract pairwise alignments from maf and rescore.
  * This is used only when zoomed-in.
  */
 {
 struct wigMafItem *miList = track->items, *mi = miList;
 int graphHeight = 0;
 Color pairColor = (vis == tvFull ? track->ixAltColor : color);
 boolean useIrowChains = TRUE;
-char option[64];
 boolean doSnpMode = (vis == tvPack) &&(trackDbSetting(track->tdb, "snpMode") != NULL);
 
 char *prefix = track->track; // use when setting things to the cart
 if (tdbIsContainerChild(track->tdb))
     prefix = track->tdb->parent->track;
 
 struct mafPriv *mp = getMafPriv(track);
 if (miList == NULL || mp->list == NULL)
     return FALSE;
 
 if (cartVarExistsAnyLevel(cart, track->tdb,FALSE,MAF_CHAIN_VAR))
     useIrowChains = cartUsualBooleanClosestToHome(cart, track->tdb, FALSE, MAF_CHAIN_VAR,TRUE);
 else
     {
     char *irowString = trackDbSetting(track->tdb, "irows");
     if (irowString && sameString(irowString, "off"))
 	useIrowChains = FALSE;
-    safef(option, sizeof(option), "%s.%s", prefix, MAF_CHAIN_VAR);
-    cartSetBoolean(cart, option, useIrowChains);
     }
 
 if (vis == tvFull)
     graphHeight = pairwiseWigHeight(track);
 
 /* display pairwise items */
 for (mi = miList; mi != NULL; mi = mi->next)
     {
     struct mafAli *mafList = NULL, *maf, *pairMaf;
     struct mafComp *mcThis, *mcPair = NULL, *mcMaster = NULL;
 
     if (mi->ix < 0)
         /* ignore item for the score */
         continue;
 
@@ -1835,31 +1812,30 @@
         MgFont *font, Color color, enum trackVisibility vis,
 	struct wigMafItem *miList)
 /* Draw base-by-base view, return new Y offset. */
 {
 struct wigMafItem *mi;
 struct mafAli *mafList, *maf, *sub;
 struct mafComp *mc, *mcMaster;
 int lineCount = slCount(miList);
 char **lines = NULL, *selfLine, *insertLine;
 int *insertCounts;
 int i, x = xOff, y = yOff;
 struct dnaSeq *seq = NULL;
 struct hash *miHash = newHash(9);
 struct hash *srcHash = newHash(0);
 char dbChrom[64];
-char option[64];
 int alignLineLength = winBaseCount * 2;
         /* doubled to allow space for insert counts */
 boolean complementBases = cartUsualBooleanDb(cart, database, COMPLEMENT_BASES_VAR, FALSE);
 bool dots = FALSE;         /* configuration option */
 /* this line must be longer than the longest base-level display */
 char noAlignment[2000];
 boolean useIrowChains = TRUE;
 int offset;
 char *framesTable = NULL;
 char *defaultCodonSpecies = cartUsualString(cart, SPECIES_CODON_DEFAULT, NULL);
 char *codonTransMode = NULL;
 boolean startSub2 = FALSE;
 
 int mafOrig = 0;
 int mafOrigOffset = 0;
@@ -1913,32 +1889,30 @@
     startSub2 = TRUE;
     seqStart -=2;
     }
 seqEnd +=2;
 if (seqEnd > seqBaseCount)
     seqEnd = seqBaseCount;
 
 if (cartVarExistsAnyLevel(cart, track->tdb,FALSE,MAF_DOT_VAR))
     dots = cartUsualBooleanClosestToHome(cart, track->tdb, FALSE, MAF_DOT_VAR,TRUE);
 else
     {
     char *dotString = trackDbSetting(track->tdb, MAF_DOT_VAR);
     if (dotString && sameString(dotString, "on"))
 	{
 	dots = TRUE;
-        safef(option, sizeof(option), "%s.%s", prefix, MAF_DOT_VAR);
-	cartSetBoolean(cart, option, TRUE);
 	}
     }
 
 if (cartVarExistsAnyLevel(cart, track->tdb,FALSE,"frames"))
     framesTable = cartOptionalStringClosestToHome(cart, track->tdb,FALSE,"frames");
 else
     framesTable = trackDbSetting(track->tdb, "frames");
 
 if (framesTable)
     {
     codonTransMode = cartUsualStringClosestToHome(cart, track->tdb,FALSE,"codons", "codonDefault");
     if (sameString("codonNone", codonTransMode))
 	framesTable = NULL;
     }
 
@@ -1947,32 +1921,30 @@
 if (framesTable != NULL)
     newTableType = hHasField(database, framesTable, "isExonStart");
 
 /* initialize "no alignment" string to o's */
 for (i = 0; i < sizeof noAlignment - 1; i++)
     noAlignment[i] = UNALIGNED_SEQ;
 
 
 if (cartVarExistsAnyLevel(cart, track->tdb,FALSE,MAF_CHAIN_VAR))
     useIrowChains = cartUsualBooleanClosestToHome(cart, track->tdb, FALSE, MAF_CHAIN_VAR,TRUE);
 else
     {
     char *irowString = trackDbSetting(track->tdb, "irows");
     if (irowString && sameString(irowString, "off"))
 	useIrowChains = FALSE;
-    safef(option, sizeof(option), "%s.%s", prefix, MAF_CHAIN_VAR);
-    cartSetBoolean(cart, option, useIrowChains);
     }
 
 /* Allocate a line of characters for each item. */
 AllocArray(lines, lineCount);
 lines[0] = needMem(alignLineLength);
 for (i=1; i<lineCount; ++i)
     {
     lines[i] = needMem(alignLineLength);
     memset(lines[i], ' ', alignLineLength - 1);
     }
 
 /* Give nice names to first two. */
 insertLine = lines[0];
 selfLine = lines[1];