4e4629ec70e0b6635441790483d6d24bb30df91b braney Fri May 13 17:00:35 2016 -0700 first cut at long range interaction track diff --git src/hg/hgTracks/bedTrack.c src/hg/hgTracks/bedTrack.c index a9ae26d..31949b4 100644 --- src/hg/hgTracks/bedTrack.c +++ src/hg/hgTracks/bedTrack.c @@ -1,29 +1,30 @@ /* bedTrack - handle most aspects of a bed-format track (or bigBed). */ /* Copyright (C) 2013 The Regents of the University of California * See README in this or parent directory for licensing information. */ #include "common.h" #include "jksql.h" #include "bed.h" #include "hdb.h" #include "bedCart.h" #include "bbiFile.h" #include "bigBed.h" #include "hgTracks.h" #include "cds.h" +#include "bedTabix.h" #define SEQ_DELIM '~' struct bed *bedLoadPairedTagAlign(char **row) /* Load first six fields of bed. * Add ~seq1~seq2 to end of name * Then remove the sequence to extra field when we convert to linkedFeature. * Assumes seq1 and seq2 are in row[6] and row[7], as they would be with a * pairedTagAlign type (hg/lib/encode/pairedTagAlign.as). It would be good to be * able to check these columns exist but we dont have the sqlResult here. */ { char buf[1024]; struct bed *ret = bedLoad6(row); safef(buf, sizeof(buf), "%s%c%s%c%s", ret->name, SEQ_DELIM, row[6], SEQ_DELIM, row[7]); freez(&(ret->name)); @@ -71,31 +72,43 @@ if (wordCt >= 3) { doScoreCtFilter = cartUsualBooleanClosestToHome(cart, tg->tdb, FALSE, "filterTopScorersOn",sameString(words[0], "on")); scoreFilterCt = cartUsualIntClosestToHome(cart, tg->tdb, FALSE, "filterTopScorersCt", atoi(words[1])); topTable = words[2]; /* if there are not too many rows in the table then can define */ /* top table as the track or subtrack table */ if (sameWord(topTable, "self")) topTable = cloneString(tg->table); } } /* Get list of items */ -if (tg->isBigBed) +if (startsWith("bedTabix", tg->tdb->type ) || startsWith("longTabix", tg->tdb->type )) + { + struct hash *settings = tg->tdb->settingsHash; + char *bigDataUrl = hashFindVal(settings, "bigDataUrl"); + char *scoreFilter = cartOrTdbString(cart, tg->tdb, "scoreFilter", NULL); + int minScore = 0; + if (scoreFilter) + minScore = atoi(scoreFilter); + struct bedTabixFile *btf = bedTabixFileMayOpen(bigDataUrl, NULL, 0, 0); + list = bedTabixReadBeds(btf, chromName, winStart, winEnd, loader, minScore); + bedTabixFileClose(btf); + } +else if (tg->isBigBed) { // avoid opening an unneeded db connection for bigBed; required not to use mysql for parallel fetch tracks char *scoreFilter = cartOrTdbString(cart, tg->tdb, "scoreFilter", NULL); struct lm *lm = lmInit(0); struct bigBedInterval *bb, *bbList = bigBedSelectRange(tg, chromName, winStart, winEnd, lm); char *bedRow[32]; char startBuf[16], endBuf[16]; int minScore = 0; if (scoreFilter) minScore = atoi(scoreFilter); for (bb = bbList; bb != NULL; bb = bb->next) { bigBedIntervalToRow(bb, chromName, startBuf, endBuf, bedRow, ArraySize(bedRow)); bed = loader(bedRow); if (scoreFilter == NULL || bed->score >= minScore)