3e70e7601a08e28667531d5abe3fe8b04ee95ded chmalee Fri Jul 16 11:23:58 2021 -0700 Return multiple transcripts for pseudo hgvs search, refs #15554 diff --git src/hg/lib/tests/hgvsTester.c src/hg/lib/tests/hgvsTester.c index 821efe1..2051ad7 100644 --- src/hg/lib/tests/hgvsTester.c +++ src/hg/lib/tests/hgvsTester.c @@ -18,57 +18,77 @@ void usage() /* explain usage and exit */ { errAbort( "hgvsTester - test program for lib/hgHgvs.c\n\n" "usage:\n" " hgvsTester db inputFile\n" //"options:\n" "Each line of inputFile is either a \"#\"-comment line or an HGVS(-like) term.\n" ); } int testHgvsTerms(char *db, char *inputFile) { // Each line of input is an HGVS term. Map it to reference assembly coords and print position. +struct dyString *dy = dyStringNew(0); struct lineFile *lf = lineFileOpen(inputFile, TRUE); printf("# db: %s\n" "# inputFile: %s\n", db, inputFile); char *line; while (lineFileNext(lf, &line, NULL)) { char *term = trimSpaces(line); if (term[0] == '\0' || term[0] == '#') { puts(line); continue; } - struct hgvsVariant *hgvs = hgvsParseTerm(term); - if (hgvs == NULL) - hgvs = hgvsParsePseudoHgvs(db, term); - if (hgvs == NULL) + struct hgvsVariant *hgvsList = hgvsParseTerm(term); + if (hgvsList == NULL) + hgvsList = hgvsParsePseudoHgvs(db, term); + if (hgvsList == NULL) printf("# Failed to parse '%s' as HGVS\n", term); else { + struct hgvsVariant *hgvs = NULL; + struct hash *bedHash = hashNew(0); + for (hgvs = hgvsList; hgvs != NULL; hgvs = hgvs->next) + { struct bed *region = hgvsMapToGenome(db, hgvs, NULL); if (region == NULL) printf("# Failed to map '%s' to %s assembly\n", term, db); else + { + // Now that hgvsParsePsuedoHgvs returns a list of valid positions + // we only want to print the unique ones in the list + dyStringClear(dy);; + dyStringPrintf(dy, "%s\t%d\t%d\t%s\t0\t%c\n", + region->chrom, region->chromStart, region->chromEnd, term, region->strand[0]); + if (hashFindVal(bedHash, dy->string) == NULL) + hashAdd(bedHash, cloneString(dy->string), region); + } + } + struct hashEl *hel, *helList = hashElListHash(bedHash); + for (hel = helList; hel != NULL; hel = hel->next) + { + struct bed *region = (struct bed *)hel->val; printf("%s\t%d\t%d\t%s\t0\t%c\n", region->chrom, region->chromStart, region->chromEnd, term, region->strand[0]); } } + } lineFileClose(&lf); carefulCheckHeap(); return 0; } int main(int argc, char *argv[]) { // Check args optionInit(&argc, argv, optionSpecs); if (argc != 3) usage(); char *db = argv[1]; char *inputFile = argv[2]; // Set up environment pushCarefulMemHandler(LIMIT_2or6GB);