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 
     {