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) {