7a16880260a6d93d0616bd8a1660fde60ac0bb3b
chmalee
  Fri May 22 16:13:56 2020 -0700
Use cart*ClosestToHome functions for setting trackUi vars so composite level track settings work correctly, refs #25585

diff --git src/hg/lib/vcfUi.c src/hg/lib/vcfUi.c
index 4847cfa..e2a5759 100644
--- src/hg/lib/vcfUi.c
+++ src/hg/lib/vcfUi.c
@@ -419,106 +419,107 @@
     if (val != NULL)
         {
         if (foundAlias != gotAlias)
             errAbort("Either all samples have aliases or none.");
         else
             *val++ = 0;
         }
     char *name = samples[i];
     struct slPair *temp = slPairNew(cloneString(name), cloneString(val));
     slAddHead(&ret, temp);
     }
 slReverse(&ret);
 return ret;
 }
 
-struct slPair *vcfPhasedGetSampleOrder(struct cart *cart, struct trackDb *tdb)
+struct slPair *vcfPhasedGetSampleOrder(struct cart *cart, struct trackDb *tdb, boolean parentLevel)
 /* Parse out a trio sample order from either trackDb or the cart */
 {
 char sampleOrderVar[1028],hideParentsVar[1028];
 safef(sampleOrderVar, sizeof(sampleOrderVar), "%s.%s", tdb->track, VCF_PHASED_SAMPLE_ORDER_VAR);
 safef(hideParentsVar, sizeof(hideParentsVar), "%s.%s", tdb->track, VCF_PHASED_HIDE_OTHER_VAR);
-boolean hideOtherSamples = cartUsualBoolean(cart, hideParentsVar, FALSE);
+boolean hideOtherSamples = cartUsualBooleanClosestToHome(cart, tdb, parentLevel, VCF_PHASED_HIDE_OTHER_VAR, FALSE);
 char *cartOrder = cartOptionalString(cart, sampleOrderVar);
 struct slPair *tdbOrder = vcfPhasedGetSamplesFromTdb(tdb, hideOtherSamples);
 if (cartOrder != NULL && !hideOtherSamples)
     {
     struct slName *name;
     struct slName *fromCart = slNameListFromComma(cartOrder);
     struct slPair *ret = NULL;
     for (name = fromCart; name != NULL; name = name->next)
         {
         struct slPair *temp = slPairFind(tdbOrder, name->name);
         slAddHead(&ret, temp);
         }
     slReverse(ret);
     return ret;
     }
 else
     return tdbOrder;
 }
 
 static boolean hasSampleAliases(struct trackDb *tdb)
 /* Check whether trackDb has aliases for the sample names  */
 {
 struct slPair *nameVals = vcfPhasedGetSamplesFromTdb(tdb,FALSE);
 return nameVals->val != NULL;
 }
 
-static void vcfCfgPhasedTrioUi(struct cart *cart, struct trackDb *tdb, struct vcfFile *vcff, char *name)
+static void vcfCfgPhasedTrioUi(struct cart *cart, struct trackDb *tdb, struct vcfFile *vcff, char *name,
+                                boolean parentLevel)
 /* Put up the phased trio specific config settings */
 {
 if (hasSampleAliases(tdb))
     {
     printf("<b>Label samples by:</b>");
     char defaultLabel[1024], aliasLabel[1024];
-    safef(defaultLabel, sizeof(defaultLabel), "%s.%s", tdb->track, VCF_PHASED_DEFAULT_LABEL_VAR);
-    safef(aliasLabel, sizeof(aliasLabel), "%s.%s", tdb->track, VCF_PHASED_ALIAS_LABEL_VAR);
-    boolean isDefaultChecked = cartUsualBoolean(cart, defaultLabel, TRUE);
-    boolean isAliasChecked = cartUsualBoolean(cart, aliasLabel, FALSE);
+    safef(defaultLabel, sizeof(defaultLabel), "%s.%s", name, VCF_PHASED_DEFAULT_LABEL_VAR);
+    safef(aliasLabel, sizeof(aliasLabel), "%s.%s", name, VCF_PHASED_ALIAS_LABEL_VAR);
+    boolean isDefaultChecked = cartUsualBooleanClosestToHome(cart, tdb, parentLevel, VCF_PHASED_DEFAULT_LABEL_VAR, TRUE);
+    boolean isAliasChecked = cartUsualBooleanClosestToHome(cart, tdb, parentLevel, VCF_PHASED_ALIAS_LABEL_VAR, FALSE);
     cgiMakeCheckBox(defaultLabel, isDefaultChecked);
     printf("VCF file sample names &nbsp;");
     cgiMakeCheckBox(aliasLabel, isAliasChecked);
     printf("aliases");
     printf("<br>");
     }
 if (trackDbSetting(tdb,VCF_PHASED_PARENTS_SAMPLE_SETTING))
     {
     printf("<b>Hide parent/other sample(s)");
     char hideVarName[1024];
-    safef(hideVarName, sizeof(hideVarName), "%s.%s", tdb->track, VCF_PHASED_HIDE_OTHER_VAR);
-    boolean hidingOtherSamples = cartUsualBoolean(cart, hideVarName, FALSE);
+    safef(hideVarName, sizeof(hideVarName), "%s.%s", name, VCF_PHASED_HIDE_OTHER_VAR);
+    boolean hidingOtherSamples = cartUsualBooleanClosestToHome(cart, tdb, parentLevel, VCF_PHASED_HIDE_OTHER_VAR, FALSE);
     cgiMakeCheckBox(hideVarName, hidingOtherSamples);
     }
 }
 
 void vcfCfgUi(struct cart *cart, struct trackDb *tdb, char *name, char *title, boolean boxed)
 /* VCF: Variant Call Format.  redmine #3710 */
 {
 boxed = cfgBeginBoxAndTitle(tdb, boxed, title);
 printf("<TABLE%s><TR><TD>", boxed ? " width='100%'" : "");
 struct vcfFile *vcff = vcfHopefullyOpenHeader(cart, tdb);
 if (vcff != NULL)
     {
     boolean parentLevel = isNameAtParentLevel(tdb, name);
     if (vcff->genotypeCount > 1 && !sameString(tdb->type, "vcfPhasedTrio"))
 	{
 	vcfCfgHapCluster(cart, tdb, vcff, name, parentLevel);
 	}
     if (sameString(tdb->type, "vcfPhasedTrio"))
         {
-        vcfCfgPhasedTrioUi(cart, tdb, vcff, name);
+        vcfCfgPhasedTrioUi(cart, tdb, vcff, name, parentLevel);
         }
     if (differentString(tdb->track,"evsEsp6500"))
         {
         puts("<H3>Filters</H3>");
         vcfCfgMinQual(cart, tdb, vcff, name, parentLevel);
         vcfCfgFilterColumn(cart, tdb, vcff, name, parentLevel);
         }
     vcfCfgMinAlleleFreq(cart, tdb, vcff, name, parentLevel);
     }
 else
     {
     printf("Sorry, couldn't access VCF file.<BR>\n");
     }
 
 puts("</TD>");