0c1d13ef4e3214c4029e098ed5ef708d15e6096f
max
  Mon Nov 21 16:34:53 2016 -0800
CIRM: As per Jim: adding the trackDb tag 'bigDataIndex'. It allows to
specify the URL of the .tbi or .bai file, in case you cannot put it
alongside the .bam or .vcf.gz file.

diff --git src/hg/hgTracks/bamTrack.c src/hg/hgTracks/bamTrack.c
index 22e1dd4..f05de2c 100644
--- src/hg/hgTracks/bamTrack.c
+++ src/hg/hgTracks/bamTrack.c
@@ -497,44 +497,46 @@
 	{
 	if (tg->customPt)
 	    {
 	    errAbort("bamLoadItemsCore: can't find bigDataUrl for custom track %s", tg->track);
 	    }
 	else
 	    {
 	    struct sqlConnection *conn = hAllocConnTrack(database, tg->tdb);
 	    fileName = bamFileNameFromTable(conn, tg->table, chromName);
 	    hFreeConn(&conn);
 	    }
 	}
 
     char *fileName2 = hReplaceGbdb(fileName);
 
+    char *baiFileOrUrl = hReplaceGbdb(trackDbSetting(tg->tdb, "bigDataIndex"));
+
     char posForBam[512];
     safef(posForBam, sizeof(posForBam), "%s:%d-%d", chromName, winStart, winEnd);
     char *cacheDir =  cfgOption("cramRef");
     char *refUrl = trackDbSetting(tg->tdb, "refUrl");
     if (!isPaired)
-	bamFetchPlus(fileName2, posForBam, addBam, &btd, NULL, refUrl, cacheDir);
+	bamAndIndexFetchPlus(fileName2, baiFileOrUrl, posForBam, addBam, &btd, NULL, refUrl, cacheDir);
     else
 	{
 	char *setting = trackDbSettingClosestToHomeOrDefault(tg->tdb, "pairSearchRange", "20000");
 	int pairSearchRange = atoi(setting);
 	if (pairSearchRange > 0)
 	    safef(posForBam, sizeof(posForBam), "%s:%d-%d", chromName,
 		  max(0, winStart-pairSearchRange), winEnd+pairSearchRange);
-	bamFetchPlus(fileName2, posForBam, addBamPaired, &btd, NULL, refUrl, cacheDir);
+	bamAndIndexFetchPlus(fileName2, baiFileOrUrl, posForBam, addBamPaired, &btd, NULL, refUrl, cacheDir);
 	struct hashEl *hel;
 	struct hashCookie cookie = hashFirst(btd.pairHash);
 	while ((hel = hashNext(&cookie)) != NULL)
 	    {
 	    struct linkedFeatures *lf = hel->val;
 	    if (lf->start < winEnd && lf->end > winStart)
 		slAddHead(&(tg->items), lfsFromLf(lf));
 	    }
 	}
     freez(&fileName2);
 
     if (tg->visibility != tvDense)
 	{
 	slReverse(&(tg->items));
 	if (isPaired)