a1c329068ad18aa4093972b501e6324f8bcdb398 angie Fri Sep 16 17:19:30 2016 -0700 Parse HGVS position ranges and coding terms' UTR and intron coordinates. When the chromAlias table is present, this also now supports NC_*:g. terms. The sequence change part is no longer parsed -- it's not necessary for mapping to genomic ranges, although it will be necessary in order for hgVai to take HGVS input. This does not yet support ranges-of-ranges but neither does Mutalyzer. This also doesn't support uncertain positions ('?'). Like complex sequence changes, those can wait until we have a sophisticated parser. We also support some new not-quite-HGVS forms: geneSymbol and protein pos only, or geneSymbol and c.. refs #15071 diff --git src/hg/lib/hgFind.c src/hg/lib/hgFind.c index 78da647..5e4bdbb 100644 --- src/hg/lib/hgFind.c +++ src/hg/lib/hgFind.c @@ -3079,42 +3079,48 @@ warn("Can't find accession for HGVS term '%s'", term); else { int hgvsVersion = getDotVersion(hgvs->seqAcc); char foundAccWithV[strlen(foundAcc)+20]; if (foundVersion) safef(foundAccWithV, sizeof(foundAccWithV), "%s.%d", foundAcc, foundVersion); else safecpy(foundAccWithV, sizeof(foundAccWithV), foundAcc); if (hgvsVersion && hgvsVersion != foundVersion) warn("HGVS term '%s' is based on %s but UCSC has version %s", term, hgvs->seqAcc, foundAccWithV); if (! coordsOk) warn("HGVS term '%s' has coordinates outside the bounds of %s", term, foundAccWithV); else if (diffRefAllele != NULL) - warn ("HGVS term '%s' reference value '%s' does not match %s value '%s'", - term, hgvs->refAllele, foundAccWithV, diffRefAllele); + warn ("HGVS term '%s' reference value does not match %s value '%s'", + term, foundAccWithV, diffRefAllele); if (coordsOk) { char *pslTable = NULL; - struct psl *mapping = hgvsMapToGenome(db, hgvs, &pslTable); + struct bed3 *mapping = hgvsMapToGenome(db, hgvs, &pslTable); if (mapping) { int padding = 5; - char *trackTable = startsWith("lrg", pslTable) ? "lrgTranscriptAli" : "refGene"; + char *trackTable; + if (isEmpty(pslTable)) + trackTable = "chromInfo"; + else if (startsWith("lrg", pslTable)) + trackTable = "lrgTranscriptAli"; + else + trackTable = "refGene"; singlePos(hgp, "HGVS", NULL, trackTable, term, "", - mapping->tName, mapping->tStart-padding, mapping->tEnd+padding); + mapping->chrom, mapping->chromStart-padding, mapping->chromEnd+padding); foundIt = TRUE; } } } } return foundIt; } struct hgPositions *hgPositionsFind(char *db, char *term, char *extraCgi, char *hgAppNameIn, struct cart *cart, boolean multiTerm) /* Return table of positions that match term or NULL if none such. */ { struct hgPositions *hgp = NULL, *hgpItem = NULL; regmatch_t substrs[4]; boolean canonicalSpec = FALSE;