69e65f45d0db6e87a72aa22c5aa61c3c4f6f2412
braney
  Mon Jul 18 14:33:48 2016 -0700
fix up some problems in table browser with CRAM output #17698

diff --git src/hg/hgTables/bam.c src/hg/hgTables/bam.c
index b26dbc9..e547308 100644
--- src/hg/hgTables/bam.c
+++ src/hg/hgTables/bam.c
@@ -239,32 +239,35 @@
 	case 'P': // P="silent deletion from padded reference sequence" -- ignore these.
 	    break;
 	default:
 	    errAbort("cigarWidth: unrecognized CIGAR op %c -- update me", op);
 	}
     }
 return tLength;
 }
 
 static void addFilteredBedsOnRegion(char *fileName, struct region *region,
 	char *table, struct asFilter *filter, struct lm *bedLm, struct bed **pBedList,
 	struct hash *idHash, int *pMaxOut)
 /* Add relevant beds in reverse order to pBedList */
 {
 struct lm *lm = lmInit(0);
-struct samAlignment *sam, *samList = bamFetchSamAlignment(fileName, region->chrom,
-    	region->start, region->end, lm);
+struct trackDb *tdb = findTdbForTable(database, curTrack, curTable, ctLookupName);
+char *cacheDir =  cfgOption("cramRef");
+char *refUrl = trackDbSetting(tdb, "refUrl");
+struct samAlignment *sam, *samList = bamFetchSamAlignmentPlus(fileName, region->chrom,
+    	region->start, region->end, lm, refUrl, cacheDir);
 char *row[SAMALIGNMENT_NUM_COLS];
 char numBuf[BAM_NUM_BUF_SIZE];
 for (sam = samList; sam != NULL; sam = sam->next)
     {
     samAlignmentToRow(sam, numBuf, row);
     if (asFilterOnRow(filter, row))
         {
 	if ((idHash != NULL) && (hashLookup(idHash, sam->qName) == NULL))
 	    continue;
 
 	struct bed *bed;
 	lmAllocVar(bedLm, bed);
 	bed->chrom = lmCloneString(bedLm, sam->rName);
 	bed->chromStart = sam->pos - 1;
 	bed->chromEnd = bed->chromStart + cigarWidth(sam->cigar, strlen(sam->cigar));
@@ -307,30 +310,37 @@
 slReverse(&bedList);
 return bedList;
 }
 
 struct slName *randomBamIds(char *table, struct sqlConnection *conn, int count)
 /* Return some semi-random qName based IDs from a BAM file. */
 {
 /* Read 10000 items from bam file,  or if they ask for a big list, then 4x what they ask for. */
 char *fileName = bamFileName(table, conn, NULL);
 samfile_t *fh = bamOpen(fileName, NULL);
 struct lm *lm = lmInit(0);
 int orderedCount = count * 4;
 if (orderedCount < 10000)
     orderedCount = 10000;
 bam_hdr_t *header = sam_hdr_read(fh);
+if (fh->format.format == cram) 
+    {
+    char *cacheDir =  cfgOption("cramRef");
+    struct trackDb *tdb = findTdbForTable(database, curTrack, table, ctLookupName);
+    char *refUrl = trackDbSetting(tdb, "refUrl");
+    cram_set_cache_url(fh, cacheDir, refUrl);  
+    }
 struct samAlignment *sam, *samList = bamReadNextSamAlignments(fh, header, orderedCount, lm);
 
 /* Shuffle list and extract qNames from first count of them. */
 shuffleList(&samList);
 struct slName *randomIdList = NULL;
 int i;
 for (i=0, sam = samList; i<count && sam != NULL; ++i, sam = sam->next)
      slNameAddHead(&randomIdList, sam->qName);
 
 /* Clean up and go home. */
 lmCleanup(&lm);
 bamClose(&fh);
 freez(&fileName);
 return randomIdList;
 }
@@ -373,30 +383,37 @@
 
 /* Print field names as column headers for example */
 hPrintf("<TR>");
 int colIx = 0;
 for (col = as->columnList; col != NULL; col = col->next)
     {
     hPrintf("<TH>%s</TH>", col->name);
     ++colIx;
     }
 hPrintf("</TR>\n");
 
 /* Fetch sample rows. */
 samfile_t *fh = bamOpen(fileName, NULL);
 struct lm *lm = lmInit(0);
 bam_hdr_t *header = sam_hdr_read(fh);
+if (fh->format.format == cram) 
+    {
+    char *cacheDir =  cfgOption("cramRef");
+    struct trackDb *tdb = findTdbForTable(database, curTrack, table, ctLookupName);
+    char *refUrl = trackDbSetting(tdb, "refUrl");
+    cram_set_cache_url(fh, cacheDir, refUrl);  
+    }
 struct samAlignment *sam, *samList = bamReadNextSamAlignments(fh, header, 10, lm);
 
 /* Print sample lines. */
 char *row[SAMALIGNMENT_NUM_COLS];
 char numBuf[BAM_NUM_BUF_SIZE];
 for (sam=samList; sam != NULL; sam = sam->next)
     {
     samAlignmentToRow(sam, numBuf, row);
     hPrintf("<TR>");
     for (colIx=0; colIx<colCount; ++colIx)
         {
         hPrintf("<TD>");
         xmlEscapeStringToFile(row[colIx], stdout);
         hPrintf("</TD>");
 	}