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);