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)