b29f1fbf93c9df5aa65fed050d9f8132dc6a2c73
braney
  Tue Nov 24 14:20:10 2015 -0800
support htslib for sam/bam/cram/tabix support  #14717

diff --git src/hg/hgTracks/bamTrack.c src/hg/hgTracks/bamTrack.c
index b00d2d7..ff1ae25 100644
--- src/hg/hgTracks/bamTrack.c
+++ src/hg/hgTracks/bamTrack.c
@@ -289,31 +289,35 @@
 
 boolean passesFilters(const bam1_t *bam, struct bamTrackData *btd)
 /* Return TRUE if bam passes hgTrackUi-set filters. */
 {
 if (bam == NULL)
     return FALSE;
 const bam1_core_t *core = &bam->core;
 // Always reject unmapped items -- nowhere to draw them.
 if (core->flag & BAM_FUNMAP)
     return FALSE;
 if (core->qual < btd->minAliQual)
     return FALSE;
 return TRUE;
 }
 
+#ifdef USE_HTS
+int addBam(const bam1_t *bam, void *data, bam_hdr_t *hdr)
+#else
 int addBam(const bam1_t *bam, void *data)
+#endif
 /* bam_fetch() calls this on each bam alignment retrieved.  Translate each bam
  * into a linkedFeatures item, and add it to tg->items. */
 {
 struct bamTrackData *btd = (struct bamTrackData *)data;
 if (!passesFilters(bam, btd))
     return 0;
 struct linkedFeatures *lf = bamToLf(bam, data);
 if (lf)
     {
     struct track *tg = btd->tg;
     slAddHead(&(tg->items), lf);
     }
 return 0;
 }
 
@@ -338,31 +342,35 @@
 /* Make a linkedFeaturesSeries from one or two linkedFeatures elements. */
 {
 struct linkedFeaturesSeries *lfs;
 AllocVar(lfs);
 lfs->name = cloneString(lf->name);
 lfs->grayIx = lf->grayIx;
 if (lf->next != NULL)
     slSort(&lf, linkedFeaturesCmpStart);
 lfs->orientation = 0;
 lfs->start = lf->start;
 lfs->end = lf->next ? max(lf->next->end, lf->end) : lf->end;
 lfs->features = lf;
 return lfs;
 }
 
+#ifdef USE_HTS
+int addBamPaired(const bam1_t *bam, void *data, bam_hdr_t *header)
+#else
 int addBamPaired(const bam1_t *bam, void *data)
+#endif
 /* bam_fetch() calls this on each bam alignment retrieved.  Translate each bam
  * into a linkedFeaturesSeries item, and either store it until we find its mate
  * or add it to tg->items. */
 {
 const bam1_core_t *core = &bam->core;
 struct bamTrackData *btd = (struct bamTrackData *)data;
 if (! passesFilters(bam, btd))
     return 0;
 struct linkedFeatures *lf = bamToLf(bam, data);
 struct track *tg = btd->tg;
 if (!(core->flag & BAM_FPAIRED) || (core->flag & BAM_FMUNMAP))
     {
     if (lf->start < winEnd && lf->end > winStart)
 	slAddHead(&(tg->items), lfsFromLf(lf));
     if ((core->flag & BAM_FMUNMAP) && sameString(btd->colorMode, BAM_COLOR_MODE_GRAY) &&
@@ -856,31 +864,35 @@
 track->nextItemButtonable = track->nextExonButtonable = FALSE;
 track->nextPrevItem = NULL;
 track->nextPrevExon = NULL;
 if (sameString(colorMode, BAM_COLOR_MODE_GRAY))
     track->colorShades = shadesOfGray;
 }
 
 struct bamWigTrackData
 {
 struct preDrawElement *preDraw;
 double scale;
 int width;
 int preDrawZero;
 };
 
+#ifdef USE_HTS
+static int countBam(const bam1_t *bam, void *data, bam_hdr_t *header)
+#else
 static int countBam(const bam1_t *bam, void *data)
+#endif
 /* bam_fetch() calls this on each bam alignment retrieved.  */
 {
 struct bamWigTrackData *btd = (struct bamWigTrackData *)data;
 const bam1_core_t *core = &bam->core;
 
 int tLength=0, tPos = core->pos, qPos = 0;
 unsigned int *cigar = bam1_cigar(bam);
 int i;
 double scale = btd->scale;
 for (i = 0;  i < core->n_cigar;  i++)
     {
     char op;
     int n = bamUnpackCigarElement(cigar[i], &op);
     switch (op)
 	{