f998ca175cbeb8b9761a6452468c365699fe2723
braney
  Thu Apr 24 12:04:37 2025 -0700
add quickLift support for narrowPeak

diff --git src/hg/hgTracks/encode.c src/hg/hgTracks/encode.c
index 79761a628b6..f836e3bc093 100644
--- src/hg/hgTracks/encode.c
+++ src/hg/hgTracks/encode.c
@@ -1,30 +1,31 @@
 /* encode.c - hgTracks routines that are specific to the ENCODE project */
 
 /* Copyright (C) 2012 The Regents of the University of California 
  * See kent/LICENSE or http://genome.ucsc.edu/license/ for licensing information. */
 
 #include "common.h"
 #include "hCommon.h"
 #include "hdb.h"
 #include "hui.h"
 #include "hgTracks.h"
 #include "customTrack.h"
 #include "encode.h"
 #include "encode/encodeRna.h"
 #include "encode/encodePeak.h"
 #include "bigBedFilter.h"
+#include "quickLift.h"
 
 extern struct trackLayout tl;
 
 
 char *encodeErgeName(struct track *tg, void *item)
 /* return the actual data name, in form xx/yyyy cut off xx/ return yyyy */
 {
 char *name;
 struct linkedFeatures *lf = item;
 name = strstr(lf->name, "/");
 if (name != NULL)
     name ++;
 if (name != NULL)
     return name;
 return "unknown";
@@ -230,54 +231,97 @@
 }
 
 static void encodePeakLoadItemsBoth(struct track *tg, struct customTrack *ct)
 /* Load up an encodePeak table from the regular database or the customTrash one. */
 {
 char *db, *table;
 struct sqlConnection *conn;
 struct sqlResult *sr = NULL;
 char **row;
 char *filterConstraints = NULL;
 int rowOffset;
 struct linkedFeatures *lfList = NULL;
 enum encodePeakType pt = 0;
 int scoreMin = atoi(trackDbSettingClosestToHomeOrDefault(tg->tdb, "scoreMin", "0"));
 int scoreMax = atoi(trackDbSettingClosestToHomeOrDefault(tg->tdb, "scoreMax", "1000"));
+char *liftDb = cloneString(trackDbSetting(tg->tdb, "quickLiftDb"));
 if (ct)
     {
     db = CUSTOM_TRASH;
     table = ct->dbTableName;
     }
 else
     {
+
     db = database;
+    if (liftDb != NULL)
+        db = liftDb;
     table = tg->tdb->table;
     }
 conn = hAllocConn(db);
 pt = encodePeakInferTypeFromTable(db, table, tg->tdb->type);
 tg->customInt = pt;
 filterConstraints = encodePeakFilter(tg->tdb->track, tg->tdb, (ct!=NULL));
+if (liftDb == NULL)
+    {
     sr = hRangeQuery(conn, table, chromName, winStart, winEnd, filterConstraints, &rowOffset);
     while ((row = sqlNextRow(sr)) != NULL)
         {
         struct encodePeak *peak = encodePeakGeneralLoad(row + rowOffset, pt);
         struct linkedFeatures *lf = lfFromEncodePeak((struct slList *)peak, tg->tdb, scoreMin, scoreMax);
 
         if (lf)
             slAddHead(&lfList, lf);
         }
     sqlFreeResult(&sr);
+    }
+else
+    {
+    struct hash *chainHash = newHash(12);
+    char *quickLiftFile = cloneString(trackDbSetting(tg->tdb, "quickLiftUrl"));
+
+    ItemLoader2 loader;
+    switch(pt)
+    {
+    case narrowPeak:
+        loader = (ItemLoader2)narrowPeakLoad;
+        break;
+    case broadPeak:
+        loader = (ItemLoader2)broadPeakLoad;
+        break;
+    case gappedPeak:
+        loader = (ItemLoader2)gappedPeakLoad;
+        break;
+    case encodePeak:
+        loader =  (ItemLoader2)encodePeakLoad;
+        break;
+    default:
+        errAbort("bad value for peak type %d\n", pt);
+        break;
+    }
+
+    struct encodePeak *peakList = (struct encodePeak *)quickLiftSql(conn, quickLiftFile, table, chromName, winStart, winEnd,  NULL, NULL, (ItemLoader2)loader, 0, chainHash);
+    struct encodePeak *liftedPeaks = (struct encodePeak *)quickLiftBeds((struct bed *)peakList, chainHash, FALSE);
+
+    for(; liftedPeaks; liftedPeaks = liftedPeaks->next)
+        {
+        struct linkedFeatures *lf = lfFromEncodePeak((struct slList *)liftedPeaks, tg->tdb, scoreMin, scoreMax);
+
+        if (lf)
+            slAddHead(&lfList, lf);
+        }
+    }
 hFreeConn(&conn);
 slReverse(&lfList);
 slSort(&lfList, linkedFeaturesCmp);
 tg->items = lfList;
 }
 
 static void encodePeakLoadItemsNormal(struct track *tg)
 /* Load the encodePeak table form the database. */
 {
 encodePeakLoadItemsBoth(tg, NULL);
 }
 
 static void encodePeakLoadItemsCt(struct track *tg)
 /* Load the encodePeak table form the customTrash database. */
 {