fdb4b5d215ff23b0f066a9b7d7a96ae31045a347
braney
  Fri Jan 15 12:27:29 2016 -0800
yet more work on support CRAM under htslib

diff --git src/hg/hgTracks/bamTrack.c src/hg/hgTracks/bamTrack.c
index a124a9e..892ddac 100644
--- src/hg/hgTracks/bamTrack.c
+++ src/hg/hgTracks/bamTrack.c
@@ -9,30 +9,31 @@
 #include "common.h"
 #include "hCommon.h"
 #include "hash.h"
 #include "linefile.h"
 #include "htmshell.h"
 #include "jksql.h"
 #include "hdb.h"
 #include "hgTracks.h"
 #include "cds.h"
 #include "hgBam.h"
 #include "wigCommon.h"
 #include "knetUdc.h"
 #include "udc.h"
 #include "bigWarn.h"
 #include "errCatch.h"
+#include "hgConfig.h"
 
 
 struct bamTrackData
     {
     struct track *tg;
     struct hash *pairHash;
     int minAliQual;
     char *colorMode;
     char *grayMode;
     char *userTag;
     int aliQualShadeMin;
     int aliQualShadeMax;
     int baseQualShadeMin;
     int baseQualShadeMax;
     };
@@ -487,61 +488,62 @@
 {
 /* protect against temporary network error */
 struct errCatch *errCatch = errCatchNew();
 if (errCatchStart(errCatch))
     {
     struct hash *pairHash = isPaired ? hashNew(18) : NULL;
     int minAliQual = atoi(cartOrTdbString(cart, tg->tdb, BAM_MIN_ALI_QUAL, BAM_MIN_ALI_QUAL_DEFAULT));
     char *colorMode = cartOrTdbString(cart, tg->tdb, BAM_COLOR_MODE, BAM_COLOR_MODE_DEFAULT);
     char *grayMode = cartOrTdbString(cart, tg->tdb, BAM_GRAY_MODE, BAM_GRAY_MODE_DEFAULT);
     char *userTag = cartOrTdbString(cart, tg->tdb, BAM_COLOR_TAG, BAM_COLOR_TAG_DEFAULT);
     int aliQualShadeMin = 0, aliQualShadeMax = 99, baseQualShadeMin = 0, baseQualShadeMax = 40;
     parseIntRangeSetting(tg->tdb, "aliQualRange", &aliQualShadeMin, &aliQualShadeMax);
     parseIntRangeSetting(tg->tdb, "baseQualRange", &baseQualShadeMin, &baseQualShadeMax);
     struct bamTrackData btd = {tg, pairHash, minAliQual, colorMode, grayMode, userTag,
 			       aliQualShadeMin, aliQualShadeMax, baseQualShadeMin, baseQualShadeMax};
-    cramInit(tg->tdb);
 
     char *fileName = trackDbSetting(tg->tdb, "bigDataUrl");
     if (fileName == NULL)
 	{
 	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 posForBam[512];
     safef(posForBam, sizeof(posForBam), "%s:%d-%d", chromName, winStart, winEnd);
+    char *cacheDir =  cfgOption("cramRef");
+    char *refUrl = trackDbSetting(tg->tdb, "refUrl");
     if (!isPaired)
-	bamFetch(fileName2, posForBam, addBam, &btd, NULL);
+	bamFetchPlus(fileName2, 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);
-	bamFetch(fileName2, posForBam, addBamPaired, &btd, NULL);
+	bamFetchPlus(fileName2, 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)