e72cf0100e06d6fadb7282d4e7eb2c592f320951
galt
  Mon Jul 4 13:08:35 2011 -0700
Adding parallel-fetch loading of remote bigDataUrl tracks using pthreads
diff --git src/hg/hgTracks/bamTrack.c src/hg/hgTracks/bamTrack.c
index 2e95eee..37ad195 100644
--- src/hg/hgTracks/bamTrack.c
+++ src/hg/hgTracks/bamTrack.c
@@ -809,44 +809,30 @@
 track->nextItemButtonable = track->nextExonButtonable = FALSE;
 track->nextPrevItem = NULL;
 track->nextPrevExon = NULL;
 if (differentString(colorMode, "off"))
     track->colorShades = shadesOfGray;
 }
 
 struct bamWigTrackData
 {
 struct preDrawElement *preDraw;
 double scale;
 int width;
 int preDrawZero;
 };
 
-static void bamWigLoadItems(struct track *tg)
-{
-/* Figure out bigWig file name. */
-struct sqlConnection *conn = hAllocConnTrack(database, tg->tdb);
-/* this should call bamFileNameFromTable with logic from bamLoadItemsCore to 
- * check the bigDataUrl setting.  Fix this if bamWigs end up being
- * a supported type.   It may be that this code gets rolled into
- * normal BAM display... since that's the plan ;-).
- */
-char *fileName = bbiNameFromSettingOrTable(tg->tdb, conn, tg->table);
-tg->customPt = fileName;
-hFreeConn(&conn);
-}
-
 static int countBam(const bam1_t *bam, void *data)
 /* bam_fetch() calls this on each bam alignment retrieved.  */
 {
 struct bamWigTrackData *btd = (struct bamWigTrackData *)data;
 const bam1_core_t *core = &bam->core;
 
 int tLength=0, tPos = core->pos, qPos = 0;
 unsigned int *cigar = bam1_cigar(bam);
 int i;
 double scale = btd->scale;
 for (i = 0;  i < core->n_cigar;  i++)
     {
     char op;
     int n = bamUnpackCigarElement(cigar[i], &op);
     switch (op)
@@ -870,68 +856,88 @@
 	    tPos += n;
 	    tLength += n;
 	    break;
 	case 'S': // skipped query bases at beginning or end ("soft clipping")
 	case 'H': // skipped query bases not stored in record's query sequence ("hard clipping")
 	case 'P': // P="silent deletion from padded reference sequence" -- ignore these.
 	    break;
 	default:
 	    errAbort("countBam: unrecognized CIGAR op %c -- update me", op);
 	}
 
     }
 return 0;
 }
 
-static void bamWigDrawItems(struct track *tg, int seqStart, int seqEnd,
-	struct hvGfx *hvg, int xOff, int yOff, int width,
-	MgFont *font, Color color, enum trackVisibility vis)
+static void bamWigLoadItems(struct track *tg)
+{
+char *fileName = NULL;
+/* Figure out bigWig file name. */
+if (tg->parallelLoading)
 {
+    /* do not use mysql during parallel-fetch load */
+    fileName = trackDbSetting(tg->tdb, "bigDataUrl");
+    }
+else
+    {
+    struct sqlConnection *conn = hAllocConnTrack(database, tg->tdb);
+    /* this should call bamFileNameFromTable with logic from bamLoadItemsCore to 
+     * check the bigDataUrl setting.  Fix this if bamWigs end up being
+     * a supported type.   It may be that this code gets rolled into
+     * normal BAM display... since that's the plan ;-).
+     */
+    fileName = bbiNameFromSettingOrTable(tg->tdb, conn, tg->table);
+    hFreeConn(&conn);
+    }
+
 /* Allocate predraw area. */
 struct bamWigTrackData *bwData;
-double scale = (double)width/(winEnd - winStart);
+double scale = (double)insideWidth/(winEnd - winStart);
 
-struct preDrawContainer *pre = tg->preDrawContainer = initPreDrawContainer(width);
+struct preDrawContainer *pre = tg->preDrawContainer = initPreDrawContainer(insideWidth);
 AllocVar(bwData);
 bwData->preDraw = pre->preDraw;
 bwData->scale = scale;
-bwData->width = width;
+bwData->width = insideWidth;
 bwData->preDrawZero = pre->preDrawZero;
 
 char posForBam[512];
 safef(posForBam, sizeof(posForBam), "%s:%d-%d", chromName, winStart, winEnd);
 
-char *fileName = tg->customPt;
-tg->customPt = NULL;
-
 bamFetch(fileName, posForBam, countBam, bwData, NULL);
 
 /* fill in rest of predraw */
 int preDrawZero = pre->preDrawZero;
 int i;
-for (i=0; i<width; ++i)
+for (i=0; i<insideWidth; ++i)
     {
     struct preDrawElement *pe = &bwData->preDraw[i + preDrawZero];
     pe->min = pe->count;
     pe->max = pe->count;
     pe->sumData = pe->count / scale;
     pe->sumSquares = (pe->count * pe->count)/scale;
     }
 
+}
+
+static void bamWigDrawItems(struct track *tg, int seqStart, int seqEnd,
+	struct hvGfx *hvg, int xOff, int yOff, int width,
+	MgFont *font, Color color, enum trackVisibility vis)
+{
 /* Call actual graphing routine. */
 wigDrawPredraw(tg, seqStart, seqEnd, hvg, xOff, yOff, width, font, color, vis,
-	       pre, pre->preDrawZero, pre->preDrawSize, &tg->graphUpperLimit, &tg->graphLowerLimit);
+	       tg->preDrawContainer, tg->preDrawContainer->preDrawZero, tg->preDrawContainer->preDrawSize, &tg->graphUpperLimit, &tg->graphLowerLimit);
 
 }
 
 void bamWigMethods(struct track *track, struct trackDb *tdb, 
 	int wordCount, char *words[])
 /* Set up bamWig methods. */
 {
 bedGraphMethods(track, tdb, wordCount, words);
 track->loadItems = bamWigLoadItems;
 track->drawItems = bamWigDrawItems;
 }
 #else /* no USE_BAM */
 
 #include "common.h"
 #include "hgTracks.h"