80ab15c036bf35894b59df383c03c51cbeff30be
chmalee
  Thu May 14 10:29:53 2026 -0700
Stop myVariants from clobbering regular custom tracks by giving it its own cart variable (mvCtfile_<db>) instead of overloading ctfile_<db>, refs #37553

diff --git src/hg/hgCustom/hgCustom.c src/hg/hgCustom/hgCustom.c
index 17a20d0acd8..2bd4b1564d3 100644
--- src/hg/hgCustom/hgCustom.c
+++ src/hg/hgCustom/hgCustom.c
@@ -1208,51 +1208,52 @@
 struct customTrack *replacedCts = NULL;
 char *err = NULL, *warnMsg = NULL;
 char *selectedTable = NULL;
 struct customTrack *ct = NULL;
 boolean ctUpdated = FALSE;
 char *initialDb = NULL;
 
 long thisTime = clock1000();
 
 cart = theCart;
 measureTiming = isNotEmpty(cartOptionalString(cart, "measureTiming"));
 initialDb = cloneString(cartUsualString(cart, "db", ""));
 getDbAndGenome(cart, &database, &organism, oldVars);
 chromAliasSetup(database);
 
-/* Ensure myVariants CT is registered in this cart if user has items for current db */
+/* Ensure myVariants CT is registered in this cart if user has items for current db.
+ * Uses a dedicated cart variable (mvCtfile_<db>) so regular custom tracks at
+ * ctfile_<db> are untouched. */
 if (cfgOptionBooleanDefault("doMyVariants", FALSE))
     {
     char *user = wikiLinkUserName();
     if (isNotEmpty(user))
         {
         char *dbTable = myVariantsTableExists(user);
         if (isNotEmpty(dbTable))
             {
             struct sqlConnection *conn = hAllocConn(CUSTOM_TRASH);
             char query[512];
             sqlSafef(query, sizeof query, "select count(*) from %s where db='%s'", dbTable, database);
             int ctCount = sqlQuickNum(conn, query);
             if (ctCount > 0)
                 {
-                /* Prefer writing a concrete CT file to trash to ensure CT is recognized immediately */
                 char *ctFile = myVariantsWriteCtFile(user, database, cart);
                 if (isNotEmpty(ctFile))
                     {
                     char varName[256];
-                    safef(varName, sizeof varName, CT_FILE_VAR_PREFIX "%s", database);
+                    safef(varName, sizeof varName, MYVARIANTS_FILE_VAR_PREFIX "%s", database);
                     cartSetString(cart, varName, ctFile);
                     freeMem(ctFile);
                     }
                 }
             hFreeConn(&conn);
             }
         }
     }
 
 /* Special endpoint: stream a custom track generated from the user's myVariants table */
 char *op = cgiOptionalString("op");
 if (cfgOptionBooleanDefault("doMyVariants", FALSE) && op && sameString(op, "myVariantsCt"))
     {
     char *user = wikiLinkUserName();
     if (isEmpty(user))