12cb5e1c3222732f385e0509c646b5cd14c53f5c
braney
  Wed Mar 13 13:29:21 2024 -0700
another place where we try to find a linkDataUrl if the trackDb doesn't
specify it

diff --git src/hg/hgc/hgc.c src/hg/hgc/hgc.c
index 7ce5d10..2a31441 100644
--- src/hg/hgc/hgc.c
+++ src/hg/hgc/hgc.c
@@ -3576,30 +3576,42 @@
     puts(html);
     puts("</div>");
     }
 hPrintf("<BR>\n");
 }
 
 struct chain *chainLoadItemInRange(struct trackDb *tdb, char *item)
 /* Load up parts of chain that intersect seqName:winStart-winEnd */
 {
 struct chain *chain = NULL;
 int id = sqlUnsigned(item);
 if (startsWith("big", tdb->type))
     {
     char *fileName = trackDbSetting(tdb, "bigDataUrl");
     char *linkFileName = trackDbSetting(tdb, "linkDataUrl");
+    if (linkFileName == NULL)
+        {
+        char *bigDataUrl = cloneString(trackDbSetting(tdb, "bigDataUrl"));
+        char *dot = strrchr(bigDataUrl, '.');
+        if (dot == NULL)
+            errAbort("No linkDataUrl in track %s", tdb->track);
+        *dot = 0;
+        char buffer[4096];
+        safef(buffer, sizeof buffer, "%s.link.bb", bigDataUrl);
+        linkFileName = buffer;
+        }
+
     chain = chainLoadIdRangeHub(database, fileName, linkFileName, seqName, winStart, winEnd, id);
     }
 else
     {
     chain = chainLoadIdRange(database, tdb->table, seqName, winStart, winEnd, id);
     }
 return chain;
 }
 
 
 void qChainRangePlusStrand(struct chain *chain, int *retQs, int *retQe)
 /* Return range of bases covered by chain on q side on the plus
  * strand. */
 {
 if (chain == NULL)