2fd02c5e1ce1bb989549b2e0069270ca8907efad braney Thu Apr 10 15:03:42 2025 -0700 add bigLolly to quickLift support diff --git src/hg/hgc/clinvarSubLolly.c src/hg/hgc/clinvarSubLolly.c index 55e311abd06..a20af50ee39 100644 --- src/hg/hgc/clinvarSubLolly.c +++ src/hg/hgc/clinvarSubLolly.c @@ -1,117 +1,137 @@ #include "common.h" #include "wiggle.h" #include "cart.h" #include "hgc.h" #include "hCommon.h" #include "hgColors.h" #include "bigBed.h" #include "hui.h" #include "subText.h" #include "trackHub.h" #include "clinvarSubLolly.h" #include "chromAlias.h" +#include "quickLift.h" char *statusByScore[] = { "Other", "Benign", "Likely Benign", "Uncertain significance", "Likely pathogenic", "Pathogenic", }; void printSubmissions(struct trackDb *tdb, char *chrom, int start, int end, unsigned wantScore, int numSubs, boolean not) /* Print out all the submissions at this position that match the * desired score (ie. clinical status). * If "not" is true, then print out all submissions that do NOT match score. * We're grabbing these records out of a second bigBed that's referenced by * "xrefDataUrl" in the trackDb. */ { char *xrefDataUrl = hReplaceGbdb(trackDbSetting(tdb, "xrefDataUrl")); struct bbiFile *bbi = bigBedFileOpenAlias(xrefDataUrl, chromAliasFindAliases); struct asObject *as = bigBedAsOrDefault(bbi); struct lm *lm = lmInit(0); struct bigBedInterval *bbList = bigBedIntervalQuery(bbi, chrom, start, end, 0, lm); int count; if (not) count = slCount(bbList) - numSubs; else count = numSubs; // nothing to print if (count == 0) return; if (!not) printf("<BR><B>There are %d submissions at this position with clinical significance '%s'.</B><BR>\n", count, statusByScore[wantScore]); else printf("<BR><B>There are %d submissions at this position with some other clinical significance.</B><BR>\n", count); // Step through intervals at the position to find ones that match the score we're looking for struct bigBedInterval *bb; for (bb = bbList; bb != NULL; bb = bb->next) { char *fields[bbi->fieldCount]; int restCount = chopTabs(cloneString(bb->rest), fields); int score = atoi(fields[1]); if (not ^ (score != wantScore)) continue; int restBedFields = 6; char **extraFields = (fields + restBedFields); int extraFieldCount = restCount - restBedFields; extraFieldsPrintAs(tdb, NULL, extraFields, extraFieldCount, as); } printf("<BR>"); } void doClinvarSubLolly(struct trackDb *tdb, char *item) /* Put up page for clinvarSubLolly track. */ { genericHeader(tdb, NULL); struct sqlConnection *conn = NULL; if (!trackHubDatabase(database)) conn = hAllocConnTrack(database, tdb); int start = cartInt(cart, "o"); int end = cartInt(cart, "t"); char *chrom = cartString(cart, "c"); char *fileName = bbiNameFromSettingOrTable(tdb, conn, tdb->table); struct bbiFile *bbi = bigBedFileOpenAlias(hReplaceGbdb(fileName), chromAliasFindAliases); struct lm *lm = lmInit(0); -struct bigBedInterval *bbList = bigBedIntervalQuery(bbi, chrom, start, end, 0, lm); +struct bigBedInterval *bb, *bbList; +char *quickLiftFile = cloneString(trackDbSetting(tdb, "quickLiftUrl")); +struct hash *chainHash = NULL; +if (quickLiftFile) + bbList = quickLiftGetIntervals(quickLiftFile, bbi, chrom, start, end, &chainHash); +else + bbList = bigBedIntervalQuery(bbi, chrom, start, end, 0, lm); -struct bigBedInterval *bb; char *fields[bbi->fieldCount]; for (bb = bbList; bb != NULL; bb = bb->next) { - if (!(bb->start == start && bb->end == end)) + struct bed *bed = NULL;; + char startBuf[16], endBuf[16]; + struct bed tempBed; + bigBedIntervalToRow(bb, chrom, startBuf, endBuf, fields, bbi->fieldCount); + if (quickLiftFile) + bed = quickLiftIntervalsToBed(bbi, chainHash, bb); + else + { + tempBed.chrom = chrom; + tempBed.chromStart = bb->start; + tempBed.chromEnd = bb->end; + tempBed.name = fields[3]; + bed = &tempBed; + } + + if (!(bed->chromStart == start && bed->chromEnd == end)) continue; // our names are unique - char *name = cloneFirstWordByDelimiterNoSkip(bb->rest, '\t'); + char *name = bed->name; boolean match = (isEmpty(name) && isEmpty(item)) || sameOk(name, item); if (!match) continue; - char startBuf[16], endBuf[16]; - bigBedIntervalToRow(bb, chrom, startBuf, endBuf, fields, bbi->fieldCount); int numSubs = chopString(fields[12], ",", NULL, 0); - printPos(chrom, bb->start, bb->end, NULL, FALSE, name); + printPos(bed->chrom, bed->chromStart, bed->chromEnd, NULL, FALSE, name); + // print all the submissions that match the clinical significance of the // bead that the user clicked on. - printSubmissions(tdb, chrom, start, end, atoi(fields[4]), numSubs, FALSE); + printSubmissions(tdb, chrom, bb->start, bb->end, atoi(fields[4]), numSubs, FALSE); - // no print the ones with a different clinical status - printSubmissions(tdb, chrom, start, end, atoi(fields[4]), numSubs, TRUE); + // now print the ones with a different clinical status + printSubmissions(tdb, chrom, bb->start, bb->end, atoi(fields[4]), numSubs, TRUE); // we found what we wanted break; } printTrackHtml(tdb); }