ca1497842a28959b779f82251283f5cb8954466c braney Wed Oct 14 07:03:07 2020 -0700 finalizing hgc page for Clinvar Submissions Summary track diff --git src/hg/hgc/clinvarSubLolly.c src/hg/hgc/clinvarSubLolly.c index f99b50a..77f8f78 100644 --- src/hg/hgc/clinvarSubLolly.c +++ src/hg/hgc/clinvarSubLolly.c @@ -1,133 +1,101 @@ #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 "clinvarSub.h" #include "clinvarSubLolly.h" -static void printVariant(struct trackDb *tdb, struct bbiFile *bbi, struct bigBedInterval *bbList, char *variant) -{ -struct bigBedInterval *bb; -for (bb = bbList; bb != NULL; bb = bb->next) + +char *statusByScore[] = { - char *fields[bbi->fieldCount]; - int restCount = chopTabs(cloneString(bb->rest), fields); - if (differentString(fields[36], variant)) - continue; - int restBedFields = 12 - 3; - char **extraFields = (fields + restBedFields); - int extraFieldCount = restCount - restBedFields; - extraFieldsPrint(tdb,NULL,extraFields, extraFieldCount); - } -} +"Other", +"Benign", +"Likely Benign", +"Uncertain significance", +"Likely pathogenic", +"Pathogenic", +}; -static void printVariants(struct trackDb *tdb, char *variants, char *chrom, int start, int end) +void printSubmissions(struct trackDb *tdb, char *chrom, int start, int end, unsigned wantScore, int numSubs, boolean not) { -int count = chopByChar(variants, ',', NULL, 0); -char *words[count]; -chopByChar(variants, ',', words, count); char *xrefTrack = trackDbSetting(tdb, "xrefTrack"); struct trackDb *mainTdb = hashFindVal(trackHash, xrefTrack); char *mainBigBedFile = trackDbSetting(mainTdb, "bigDataUrl"); struct bbiFile *bbi = bigBedFileOpen(mainBigBedFile); struct lm *lm = lmInit(0); struct bigBedInterval *bbList = bigBedIntervalQuery(bbi, chrom, start, end, 0, lm); -printf("There are %d variants at this position.\n", count); -int ii; -for(ii=0; ii < count; ii++) +int count; +char *extra = ""; +if (not) { - printVariant(mainTdb, bbi, bbList, words[ii]); - } + count = slCount(bbList) - numSubs; + extra = "other than "; } +else + count = numSubs; +if (count == 0) + return; -static char *subFields[] = -{ -"VariationID", -"ClinicalSignificance", -"DateLastEvaluated", -"Description", -"SubmittedPhenotypeInfo", -"ReportedPhenotypeInfo", -"ReviewStatus", -"CollectionMethod", -"OriginCounts", -"Submitter", -"SCV", -"SubmittedGeneSymbol", -}; +printf("<B>There are %d submissions at this position with status %s '%s'</B><BR>\n", count, extra, statusByScore[wantScore]); -static void printSub(struct sqlConnection *conn, char *sub) -{ -char query[4096]; -sqlSafef(query, sizeof(query), "select * from clinvarSub where scv = '%s'", sub); -struct sqlResult *sr; -sr = sqlGetResult(conn, query); -char **row; -while ((row = sqlNextRow(sr)) != NULL) - { - printf("<br><table class='bedExtraTbl'>"); - int ii; - for(ii=0; ii < ArraySize(subFields); ii++) - printf("<tr><td>%s</td><td>%s</td>", subFields[ii], row[ii]); - printf("</table>\n"); - } -} -static void printSubs(struct sqlConnection *conn, char *subs, char *chrom, int start, int end) +struct bigBedInterval *bb; +for (bb = bbList; bb != NULL; bb = bb->next) { -int count = chopByChar(subs, ',', NULL, 0); -char *words[count]; -chopByChar(subs, ',', words, count); + char *fields[bbi->fieldCount]; + int restCount = chopTabs(cloneString(bb->rest), fields); + int score = atoi(fields[1]); + if (not ^ (score != wantScore)) + continue; -printf("There are %d submissions at this position.\n", count); -int ii; -for(ii=0; ii < count; ii++) - { - printSub(conn, words[ii]); + int restBedFields = 6; + char **extraFields = (fields + restBedFields); + int extraFieldCount = restCount - restBedFields; + extraFieldsPrint(mainTdb,NULL,extraFields, extraFieldCount); } +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 = bigBedFileOpen(fileName); struct lm *lm = lmInit(0); struct bigBedInterval *bbList = bigBedIntervalQuery(bbi, chrom, start, end, 0, lm); -int bedSize = bbi->definedFieldCount; +//int bedSize = bbi->definedFieldCount; struct bigBedInterval *bb; char *fields[bbi->fieldCount]; for (bb = bbList; bb != NULL; bb = bb->next) { if (!(bb->start == start && bb->end == end)) continue; char *name = cloneFirstWordByDelimiterNoSkip(bb->rest, '\t'); 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); - struct bed *bed = bedLoadN(fields, bedSize); - bedPrintPos(bed, bedSize, tdb); - printSubs(conn, fields[12], chrom, start, end); - printVariants(tdb, fields[11], chrom, start, end); + int numSubs = chopString(fields[12], ",", NULL, 0); + + printSubmissions(tdb, chrom, start, end, atoi(fields[4]), numSubs, FALSE); + printSubmissions(tdb, chrom, start, end, atoi(fields[4]), numSubs, TRUE); break; } }