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

diff --git src/hg/hgc/bamClick.c src/hg/hgc/bamClick.c
index c620c97..2587052 100644
--- src/hg/hgc/bamClick.c
+++ src/hg/hgc/bamClick.c
@@ -3,30 +3,31 @@
 
 /* Copyright (C) 2014 The Regents of the University of California 
  * See README in this or parent directory for licensing information. */
 #ifdef USE_BAM
 
 #include "common.h"
 #include "hash.h"
 #include "hdb.h"
 #include "hgBam.h"
 #include "hgc.h"
 #include "knetUdc.h"
 #include "udc.h"
 
 
 #include "hgBam.h"
+#include "hgConfig.h"
 
 struct bamTrackData
     {
     int itemStart;
     char *itemName;
     struct hash *pairHash;
     };
 
 /* Maybe make this an option someday -- for now, I find it too confusing to deal with
  * CIGAR that is anchored to positive strand while showing rc'd sequence.  I think
  * to do it right, we would need to reverse the CIGAR string for display. */
 static boolean useStrand = FALSE;
 static boolean skipQualityScore = FALSE;
 static void singleBamDetails(const bam1_t *bam)
 /* Print out the properties of this alignment. */
@@ -160,32 +161,30 @@
 	if (firstBam == NULL)
 	    hashAdd(btd->pairHash, btd->itemName, bamClone(bam));
 	else
 	    {
 	    bamPairDetails(firstBam, bam);
 	    hashRemove(btd->pairHash, btd->itemName);
 	    }
 	}
     }
 return 0;
 }
 
 void doBamDetails(struct trackDb *tdb, char *item)
 /* Show details of an alignment from a BAM file. */
 {
-cramInit(tdb);
-
 if (item == NULL)
     errAbort("doBamDetails: NULL item name");
 int start = cartInt(cart, "o");
 if (!tdb || !trackDbSetting(tdb, "bamSkipPrintQualScore"))
    skipQualityScore = FALSE;
 else
    skipQualityScore = TRUE;
 // TODO: libify tdb settings table_pairEndsByName, stripPrefix and pairSearchRange
 
 knetUdcInstall();
 if (udcCacheTimeout() < 300)
     udcSetCacheTimeout(300);
 
 if (sameString(item, "zoom in"))
     printf("Zoom in to a region with fewer items to enable 'detail page' links for individual items.<BR>");
@@ -201,31 +200,33 @@
 char *fileName = hReplaceGbdb(trackDbSetting(tdb, "bigDataUrl"));
 if (fileName == NULL)
     {
     if (isCustomTrack(tdb->table))
 	{
 	errAbort("bamLoadItemsCore: can't find bigDataUrl for custom track %s", tdb->track);
 	}
     else
 	{
 	struct sqlConnection *conn = hAllocConnTrack(database, tdb);
 	fileName = hReplaceGbdb(bamFileNameFromTable(conn, tdb->table, seqName));
 	hFreeConn(&conn);
 	}
     }
 
-bamFetch(fileName, position, oneBam, &btd, NULL);
+char *cacheDir =  cfgOption("cramRef");
+char *refUrl = trackDbSetting(tdb, "refUrl");
+bamFetchPlus(fileName, position, oneBam, &btd, NULL, refUrl, cacheDir);
 if (isPaired)
     {
     char *setting = trackDbSettingOrDefault(tdb, "pairSearchRange", "20000");
     int pairSearchRange = atoi(setting);
     if (pairSearchRange > 0 && hashNumEntries(pairHash) > 0)
 	{
 	// Repeat the search for item in a larger window:
 	struct hash *newPairHash = hashNew(0);
 	btd.pairHash = newPairHash;
 	safef(position, sizeof(position), "%s:%d-%d", seqName,
 	      max(0, winStart-pairSearchRange), winEnd+pairSearchRange);
 	bamFetch(fileName, position, oneBam, &btd, NULL);
 	}
     struct hashEl *hel;
     struct hashCookie cookie = hashFirst(btd.pairHash);