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"