src/hg/hgTracks/bamTrack.c 1.20

1.20 2009/12/14 23:19:57 angie
For pairSearchRange, don't do two bamFetch's -- very inefficient. Just expand the search range up front.
Index: src/hg/hgTracks/bamTrack.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/hg/hgTracks/bamTrack.c,v
retrieving revision 1.19
retrieving revision 1.20
diff -b -B -U 4 -r1.19 -r1.20
--- src/hg/hgTracks/bamTrack.c	10 Dec 2009 15:02:12 -0000	1.19
+++ src/hg/hgTracks/bamTrack.c	14 Dec 2009 23:19:57 -0000	1.20
@@ -19,9 +19,8 @@
 struct bamTrackData
     {
     struct track *tg;
     struct hash *pairHash;
-    struct hash *nameHash;
     int minAliQual;
     char *colorMode;
     char *grayMode;
     char *userTag;
@@ -251,10 +250,8 @@
  * 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;
@@ -342,9 +339,9 @@
 int minAliQual = atoi(cartOrTdbClosest(tg->tdb, BAM_MIN_ALI_QUAL, BAM_MIN_ALI_QUAL_DEFAULT));
 char *colorMode = cartOrTdbClosest(tg->tdb, BAM_COLOR_MODE, BAM_COLOR_MODE_DEFAULT);
 char *grayMode = cartOrTdbClosest(tg->tdb, BAM_GRAY_MODE, BAM_GRAY_MODE_DEFAULT);
 char *userTag = cartOrTdbClosest(tg->tdb, BAM_COLOR_TAG, BAM_COLOR_TAG_DEFAULT);
-struct bamTrackData btd = {tg, pairHash, NULL, minAliQual, colorMode, grayMode, userTag};
+struct bamTrackData btd = {tg, pairHash, minAliQual, colorMode, grayMode, userTag};
 char *fileName;
 if (tg->customPt)
     {
     fileName = trackDbSettingClosestToHome(tg->tdb, "bigDataUrl");
@@ -352,30 +349,26 @@
 	errAbort("bamLoadItemsCore: can't find bigDataUrl for custom track %s", tg->mapName);
     }
 else
     fileName = bamFileNameFromTable(database, tg->mapName, chromName);
-bamFetch(fileName, position, (isPaired ? addBamPaired : addBam), &btd);
-if (isPaired)
+if (!isPaired)
+    bamFetch(fileName, position, addBam, &btd);
+else
     {
+    char posForBam[512];
+    safecpy(posForBam, sizeof(posForBam), position);
     char *setting = trackDbSettingClosestToHomeOrDefault(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;
-	char posForBam[512];
+    if (pairSearchRange > 0)
 	safef(posForBam, sizeof(posForBam), "%s:%d-%d", chromName,
 	      max(0, winStart-pairSearchRange), winEnd+pairSearchRange);
 	bamFetch(fileName, posForBam, addBamPaired, &btd);
-	}
     struct hashEl *hel;
     struct hashCookie cookie = hashFirst(btd.pairHash);
     while ((hel = hashNext(&cookie)) != NULL)
 	{
 	struct linkedFeatures *lf = hel->val;
+	if (lf->start < winEnd && lf->end > winStart)
 	slAddHead(&(tg->items), lfsFromLf(lf));
 	}
     }
 if (tg->visibility != tvDense)