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. */ {