int addBam(const bam1_t *bam, void *data) /* 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); struct track *tg = btd->tg; slAddHead(&(tg->items), lf); return 0; }
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) && sameString(btd->grayMode, BAM_GRAY_MODE_UNPAIRED)) // not properly paired: make it a lighter shade. lf->grayIx -= 4; } else { struct linkedFeatures *lfMate = (struct linkedFeatures *)hashFindVal(btd->pairHash, lf->name); if (lfMate == NULL) { if (core->flag & BAM_FPROPER_PAIR) { // If we know that this is properly paired, but don't have the mate, // make a bogus item off the edge of the window so that if we don't // encounter its mate later, we can at least draw an arrow off the // edge of the window. struct linkedFeatures *stub; // don't link to pair that's not on the same chrom if ((core->mpos < 0) || (core->tid != core->mtid)) { int offscreen; if (lf->orientation > 0) offscreen = max(winEnd, lf->end) + 10; else offscreen = min(winStart, lf->start) - 10; if (offscreen < 0) offscreen = 0; stub = lfStub(offscreen, -lf->orientation); } else { stub = lfStub(core->mpos, -lf->orientation); } lf->next = stub; } else if (sameString(btd->colorMode, BAM_COLOR_MODE_GRAY) && sameString(btd->grayMode, BAM_GRAY_MODE_UNPAIRED)) // not properly paired: make it a lighter shade. lf->grayIx -= 4; hashAdd(btd->pairHash, lf->name, lf); } else { lfMate->next = lf; if (min(lfMate->start, lf->start) < winEnd && max(lfMate->end, lf->end) > winStart) slAddHead(&(tg->items), lfsFromLf(lfMate)); hashRemove(btd->pairHash, lf->name); } } return 0; }