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