c1e66c5c9d45f0965156318e2782714ee93b04ab braney Mon Oct 19 16:08:32 2015 -0700 more work on bigMaf. Works in hgc and hgTables now. #15935 diff --git src/hg/hgTracks/wigMafTrack.c src/hg/hgTracks/wigMafTrack.c index 94148c7..4142e52 100644 --- src/hg/hgTracks/wigMafTrack.c +++ src/hg/hgTracks/wigMafTrack.c @@ -275,80 +275,61 @@ char *getTrackMafFile(struct track *track) /* look up MAF file name in track setting, return NULL if not found */ { return hashFindVal(track->tdb->settingsHash, "mafFile"); } char *getCustomMafFile(struct track *track) { char *fileName = getTrackMafFile(track); if (fileName == NULL) errAbort("cannot find custom maf setting"); return fileName; } -static struct mafAli *bigMafLoadInRegion( struct track *track, char *chrom, int start, int end) -/* Read in MAF blocks from bigBed. */ -{ -struct lm *lm = lmInit(0); -struct bigBedInterval *bb, *bbList = bigBedSelectRange(track, chrom, start, end, lm); -struct mafAli *mafList = NULL; -for (bb = bbList; bb != NULL; bb = bb->next) - { - // the MAF block in the record as \001 instead of newlines - char *mafText = replaceChars(bb->rest, "\001","\n"); - - struct mafFile mf; - mf.lf = lineFileOnString(NULL, TRUE, mafText); - - struct mafAli *maf = mafNext(&mf); - slAddHead(&mafList, maf); - } -return mafList; -} static void loadMafsToTrack(struct track *track) /* load mafs in region to track custom pointer */ { struct sqlConnection *conn; struct sqlConnection *conn2; struct mafPriv *mp = getMafPriv(track); if (inSummaryMode(cart, track->tdb, winBaseCount)) return; int begin = winStart - 2; if (begin < 0) begin = 0; +if (track->isBigBed) + { + mp->list = bigMafLoadInRegion(fetchBbiForTrack(track), chromName, begin, winEnd+2); + } +else if (mp->ct) + { /* we open two connections to the database * that has the maf track in it. One is * for the scoredRefs, the other to access * the extFile database. We could get away * with just one connection, but then we'd * have to allocate more memory to hold * the scoredRefs (whereas now we just use * one statically loaded scoredRef). */ -if (track->isBigBed) - { - mp->list = bigMafLoadInRegion(track, chromName, begin, winEnd+2); - } -else if (mp->ct) - { char *fileName = getCustomMafFile(track); conn = hAllocConn(CUSTOM_TRASH); conn2 = hAllocConn(CUSTOM_TRASH); mp->list = wigMafLoadInRegion(conn, conn2, mp->ct->dbTableName, chromName, begin, winEnd + 2, fileName); hFreeConn(&conn); hFreeConn(&conn2); } else { char *fileName = getTrackMafFile(track); // optional conn = hAllocConn(database); conn2 = hAllocConn(database); mp->list = wigMafLoadInRegion(conn, conn2, track->table, @@ -524,31 +505,31 @@ char *snpTable = trackDbSetting(track->tdb, "snpTable"); boolean doSnpTable = FALSE; if ( (track->limitedVis == tvPack) && (snpTable != NULL) && cartOrTdbBoolean(cart, track->tdb, MAF_SHOW_SNP,FALSE)) doSnpTable = TRUE; // the maf's only get loaded if we're not in summary or snpTable views if (!doSnpTable && !inSummaryMode(cart, track->tdb, winBaseCount)) { /* "close in" display uses actual alignments from file */ struct mafPriv *mp = getMafPriv(track); struct sqlConnection *conn, *conn2; if (track->isBigBed) { - mp->list = bigMafLoadInRegion(track, chromName, winStart, winEnd); + mp->list = bigMafLoadInRegion(fetchBbiForTrack(track), chromName, winStart, winEnd); } else if (mp->ct) { char *fileName = getCustomMafFile(track); conn = hAllocConn(CUSTOM_TRASH); conn2 = hAllocConn(CUSTOM_TRASH); mp->list = wigMafLoadInRegion(conn, conn2, mp->ct->dbTableName, chromName, winStart, winEnd, fileName); hFreeConn(&conn); hFreeConn(&conn2); } else { char *fileName = getTrackMafFile(track); // optional conn = hAllocConn(database); @@ -1172,31 +1153,33 @@ if ((summary = summarySetting(track)) == NULL) return FALSE; if (cartVarExistsAnyLevel(cart, track->tdb,FALSE,MAF_CHAIN_VAR)) useIrowChains = cartUsualBooleanClosestToHome(cart, track->tdb, FALSE, MAF_CHAIN_VAR,TRUE); else { char *irowString = trackDbSetting(track->tdb, "irows"); if (irowString && sameString(irowString, "off")) useIrowChains = FALSE; } if (track->isBigBed) { struct lm *lm = lmInit(0); - struct bigBedInterval *bb, *bbList = bigBedSelectRangeExtra(track, chromName, seqStart, seqEnd, lm, "summary"); + char *fileName = trackDbSetting(track->tdb, "summary"); + struct bbiFile *bbi = bigBedFileOpen(fileName); + struct bigBedInterval *bb, *bbList = bigBedIntervalQuery(bbi, chromName, seqStart, seqEnd, 0, lm); char *bedRow[7]; char startBuf[16], endBuf[16]; for (bb = bbList; bb != NULL; bb = bb->next) { bigBedIntervalToRow(bb, chromName, startBuf, endBuf, bedRow, ArraySize(bedRow)); ms = mafSummaryLoad(bedRow); if ((hel = hashLookup(componentHash, ms->src)) == NULL) hashAdd(componentHash, ms->src, ms); else slAddHead(&(hel->val), ms); } } else {