static void showOverlap(const bam1_t *leftBam, const bam1_t *rightBam) /* If the two reads overlap, show how. */ { const bam1_core_t *leftCore = &(leftBam->core), *rightCore = &(rightBam->core); int leftStart = leftCore->pos, rightStart = rightCore->pos; int leftLen = bamGetTargetLength(leftBam), rightLen = bamGetTargetLength(rightBam); char *leftSeq = bamGetQuerySequence(leftBam, useStrand); char *rightSeq = bamGetQuerySequence(rightBam, useStrand); if (useStrand && bamIsRc(leftBam)) reverseComplement(leftSeq, strlen(leftSeq)); if (useStrand && bamIsRc(rightBam)) reverseComplement(rightSeq, strlen(rightSeq)); if ((rightStart > leftStart && leftStart + leftLen > rightStart) || (leftStart > rightStart && rightStart+rightLen > leftStart)) { int leftClipLow, rightClipLow; bamGetSoftClipping(leftBam, &leftClipLow, NULL, NULL); bamGetSoftClipping(rightBam, &rightClipLow, NULL, NULL); leftStart -= leftClipLow; rightStart -= rightClipLow; printf("<B>Note: End read alignments overlap:</B><BR>\n<PRE><TT>"); int i = leftStart - rightStart; while (i-- > 0) putc(' ', stdout); puts(leftSeq); i = rightStart - leftStart; while (i-- > 0) putc(' ', stdout); puts(rightSeq); puts("</TT></PRE>"); } }
struct linkedFeatures *bamToLf(const bam1_t *bam, void *data) /* Translate a BAM record into a linkedFeatures item. */ { struct bamTrackData *btd = (struct bamTrackData *)data; const bam1_core_t *core = &bam->core; struct linkedFeatures *lf; struct psl *original = pslFromBam(bam); if (original == NULL) return NULL; AllocVar(lf); lf->score = core->qual; lf->name = cloneString(bam1_qname(bam)); lf->orientation = (core->flag & BAM_FREVERSE) ? -1 : 1; int length; lf->components = sfFromNumericCigar(bam, &length); lf->start = lf->tallStart = core->pos; lf->end = lf->tallEnd = core->pos + length; lf->extra = bamGetQuerySequence(bam, FALSE); // cds.c reverses if psl != NULL lf->original = original; int clippedQLen; bamGetSoftClipping(bam, NULL, NULL, &clippedQLen); if (sameString(btd->colorMode, BAM_COLOR_MODE_GRAY) && sameString(btd->grayMode, BAM_GRAY_MODE_ALI_QUAL)) { lf->grayIx = shadeTransform(btd->aliQualShadeMin, btd->aliQualShadeMax, core->qual); } else if (sameString(btd->colorMode, BAM_COLOR_MODE_GRAY) && sameString(btd->grayMode, BAM_GRAY_MODE_BASE_QUAL)) { UBYTE *quals = bamGetQueryQuals(bam, TRUE); lf->components = expandSfQuals(lf->components, quals, lf->orientation, clippedQLen, btd->baseQualShadeMin, btd->baseQualShadeMax); lf->grayIx = maxShade - 3; } else if (sameString(btd->colorMode, BAM_COLOR_MODE_TAG) && isNotEmpty(btd->userTag)) { char buf[16]; char *rgb = bamGetTagString(bam, btd->userTag, buf, sizeof(buf)); if (rgb != NULL) { // We don't have access to hvg at loadtime, so can't allocate color here. // Instead, pack RGB values into lf->filterColor which fortunately is an int. unsigned char r, g, b; if (parseRgb(rgb, &r, &g, &b)) lf->filterColor = MAKECOLOR_32(r,g,b); else { static boolean already = FALSE; if (! already) { warn("%s: At least one BAM tag value for %s (%s) is not in the expected " "RGB format: N,N,N where each N is from 0 to 255.", btd->tg->tdb->shortLabel, btd->userTag, htmlEncode(rgb)); already = TRUE; btd->userTag = NULL; } } } else lf->grayIx = maxShade; } else lf->grayIx = maxShade; return lf; }