src/hg/hgTracks/bamTrack.c 1.17
1.17 2009/11/26 00:35:38 angie
Add pairSearchRange setting-controlled extra search for improperly paired items' mates that didn't happen to fall in the viewing window, a la hgc/bamClick.c.
Index: src/hg/hgTracks/bamTrack.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/hg/hgTracks/bamTrack.c,v
retrieving revision 1.16
retrieving revision 1.17
diff -b -B -U 4 -r1.16 -r1.17
--- src/hg/hgTracks/bamTrack.c 20 Nov 2009 20:45:54 -0000 1.16
+++ src/hg/hgTracks/bamTrack.c 26 Nov 2009 00:35:38 -0000 1.17
@@ -19,8 +19,9 @@
struct bamTrackData
{
struct track *tg;
struct hash *pairHash;
+ struct hash *nameHash;
int minAliQual;
char *colorMode;
char *grayMode;
char *userTag;
@@ -250,13 +251,15 @@
* or add it to tg->items. */
{
const bam1_core_t *core = &bam->core;
struct bamTrackData *btd = (struct bamTrackData *)data;
+if (btd->nameHash != NULL && hashLookup(btd->nameHash, bam1_qname(bam)) == NULL)
+ return 0;
if (! passesFilters(bam, btd))
return 0;
struct linkedFeatures *lf = bamToLf(bam, data);
struct track *tg = btd->tg;
-if (! (core->flag & BAM_FPAIRED))
+if (!(core->flag & BAM_FPAIRED) || (core->flag & BAM_FMUNMAP))
{
slAddHead(&(tg->items), lfsFromLf(lf));
}
else
@@ -346,9 +349,9 @@
trackDbSettingOrDefault(tg->tdb, BAM_GRAY_MODE, BAM_GRAY_MODE_DEFAULT));
safef(cartVarName, sizeof(cartVarName), "%s_" BAM_COLOR_TAG, tg->tdb->tableName);
char *userTag = cartUsualString(cart, cartVarName,
trackDbSettingOrDefault(tg->tdb, BAM_COLOR_TAG, BAM_COLOR_TAG_DEFAULT));
-struct bamTrackData btd = {tg, pairHash, minAliQual, colorMode, grayMode, userTag};
+struct bamTrackData btd = {tg, pairHash, NULL, minAliQual, colorMode, grayMode, userTag};
char *fileName;
if (tg->customPt)
{
fileName = trackDbSetting(tg->tdb, "bigDataUrl");
@@ -359,16 +362,27 @@
fileName = bamFileNameFromTable(database, tg->mapName, seqNameForBam);
bamFetch(fileName, posForBam, (isPaired ? addBamPaired : addBam), &btd);
if (isPaired)
{
+ char *setting = trackDbSettingOrDefault(tg->tdb, "pairSearchRange", "20000");
+ int pairSearchRange = atoi(setting);
+ if (pairSearchRange > 0 && hashNumEntries(pairHash) > 0)
+ {
+ // Search in a wider region, only for item names that are left over in pairHash
+ // (i.e. improperly paired reads whose mates aren't in the window)
+ struct hash *newPairHash = hashNew(12);
+ btd.nameHash = pairHash;
+ btd.pairHash = newPairHash;
+ safef(posForBam, sizeof(posForBam), "%s:%d-%d", seqNameForBam,
+ max(0, winStart-pairSearchRange), winEnd+pairSearchRange);
+ bamFetch(fileName, posForBam, addBamPaired, &btd);
+ }
struct hashEl *hel;
- struct hashCookie cookie = hashFirst(pairHash);
- int count = 0;
+ struct hashCookie cookie = hashFirst(btd.pairHash);
while ((hel = hashNext(&cookie)) != NULL)
{
struct linkedFeatures *lf = hel->val;
slAddHead(&(tg->items), lfsFromLf(lf));
- count++;
}
}
if (tg->visibility != tvDense)
{