a3c746b6fdc1ec51c6fbb5ced6ec4f85c2bb3f7c angie Fri Oct 8 11:40:04 2010 -0700 Branched first cut at Redmine Feature #1093 (BAM: range settings foralignment quality and base quality). I think it works, will test more before merging and pushing. diff --git src/hg/hgTracks/bamTrack.c src/hg/hgTracks/bamTrack.c index c0875b9..acc39f6 100644 --- src/hg/hgTracks/bamTrack.c +++ src/hg/hgTracks/bamTrack.c @@ -28,6 +28,10 @@ char *colorMode; char *grayMode; char *userTag; + int aliQualShadeMin; + int aliQualShadeMax; + int baseQualShadeMin; + int baseQualShadeMax; }; struct psl *pslFromBam(const bam1_t *bam) @@ -157,7 +161,7 @@ } static struct simpleFeature *expandSfQuals(struct simpleFeature *blocksIn, UBYTE *quals, - int orientation, int qLen) + int orientation, int qLen, int minQual, int maxQual) /* Chop up blocksIn into one sf per query base, with sf->grayIx set according to * base quality score. */ { @@ -174,8 +178,7 @@ newSf->qStart = i; newSf->qEnd = i + 1; int offset = (orientation < 0) ? (qLen - i - 1) : i; - // hardcode min & max for now; if user demand, make into tdb/cart vars. - newSf->grayIx = shadeTransform(0, 40, quals[offset]); + newSf->grayIx = shadeTransform(minQual, maxQual, quals[offset]); if (blocksOut == NULL) blocksOut = tail = newSf; else @@ -223,14 +226,14 @@ if (sameString(btd->colorMode, BAM_COLOR_MODE_GRAY) && sameString(btd->grayMode, BAM_GRAY_MODE_ALI_QUAL)) { - // hardcode min & max for now; if user demand, make into tdb/cart vars. - lf->grayIx = shadeTransform(0, 99, core->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); + 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)) @@ -420,6 +423,34 @@ return ret; } +static void parseIntRangeSetting(struct trackDb *tdb, char *settingName, + int *retMin, int *retMax) +/* If setting is an integer range, store the values into retMin and retMax */ + +// This must be duplicating somebody else's code. + +{ +char *range = trackDbSetting(tdb, settingName); +if (range != NULL) + { + char rangeCopy[16]; // if it's longer than this, there's a problem. + safecpy(rangeCopy, sizeof(rangeCopy), range); + char *words[3]; + int wordCount = chopByChar(rangeCopy, ':', words, ArraySize(words)); + if (wordCount == 2) + { + if (retMin != NULL) + *retMin = sqlUnsigned(words[0]); + if (retMax != NULL) + *retMax = sqlUnsigned(words[1]); + return; + } + else + warn("track %s table %s: setting %s should be integer range min:max but is %s", + tdb->track, tdb->table, settingName, range); + } +} + void bamLoadItemsCore(struct track *tg, boolean isPaired) /* Load BAM data into tg->items item list, unless zoomed out so far * that the data would just end up in dense mode and be super-slow. */ @@ -429,7 +460,11 @@ char *colorMode = cartOrTdbString(cart, tg->tdb, BAM_COLOR_MODE, BAM_COLOR_MODE_DEFAULT); char *grayMode = cartOrTdbString(cart, tg->tdb, BAM_GRAY_MODE, BAM_GRAY_MODE_DEFAULT); char *userTag = cartOrTdbString(cart, tg->tdb, BAM_COLOR_TAG, BAM_COLOR_TAG_DEFAULT); -struct bamTrackData btd = {tg, pairHash, minAliQual, colorMode, grayMode, userTag}; +int aliQualShadeMin = 0, aliQualShadeMax = 99, baseQualShadeMin = 0, baseQualShadeMax = 40; +parseIntRangeSetting(tg->tdb, "aliQualRange", &aliQualShadeMin, &aliQualShadeMax); +parseIntRangeSetting(tg->tdb, "baseQualRange", &baseQualShadeMin, &baseQualShadeMax); +struct bamTrackData btd = {tg, pairHash, minAliQual, colorMode, grayMode, userTag, + aliQualShadeMin, aliQualShadeMax, baseQualShadeMin, baseQualShadeMax}; char *fileName; if (tg->customPt) {