Skip to content

Commit

Permalink
issue SACGF/variantgrid_private#3634 - handle multiple aliases etc fo…
Browse files Browse the repository at this point in the history
…r symbols
  • Loading branch information
davmlaw committed Jul 5, 2024
1 parent b2327d8 commit 8c8db49
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 29 deletions.
15 changes: 9 additions & 6 deletions genes/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -2615,17 +2615,20 @@ def has_mane_transcripts() -> bool:
return MANE.objects.exists()

@staticmethod
def get_from_symbol_or_alias(gene_symbol_str: str) -> tuple[Optional['MANE'], Optional[GeneSymbolAlias]]:
def get_mane_and_aliases_list_from_symbol(gene_symbol_str: str) -> list[tuple['MANE', Optional[GeneSymbolAlias]]]:
if not MANE.has_mane_transcripts():
raise ValueError("MANE transcripts are not loaded")

if mane := MANE.objects.filter(symbol=gene_symbol_str).first():
return mane, None
mane_and_aliases = []

if alias := GeneSymbolAlias.objects.filter(alias=gene_symbol_str, gene_symbol__mane__isnull=False).first():
for mane in MANE.objects.filter(symbol=gene_symbol_str):
mane_and_aliases.append((mane, None))

for alias in GeneSymbolAlias.objects.filter(alias=gene_symbol_str, gene_symbol__mane__isnull=False):
if mane := MANE.objects.filter(symbol=alias.gene_symbol).first():
return mane, alias
return None, None
mane_and_aliases.append((mane, alias))

return mane_and_aliases

def get_transcript_version(self, annotation_consortium: AnnotationConsortium) -> TranscriptVersion:
transcript_version = None
Expand Down
50 changes: 27 additions & 23 deletions snpdb/signals/variant_search.py
Original file line number Diff line number Diff line change
Expand Up @@ -501,28 +501,31 @@ def _search_hgvs(hgvs_string: str, user: User, genome_build: GenomeBuild, visibl
# contig triggered from g.HGVS from another genome build - can't do anything just return no results
pass
except (ValueError, NotImplementedError) as hgvs_error:
try:
if gene_symbol_str := hgvs_matcher.get_gene_symbol_if_no_transcript(hgvs_string):
has_results = False
if gene_symbol_str := hgvs_matcher.get_gene_symbol_if_no_transcript(hgvs_string):
has_results = False

if settings.SEARCH_HGVS_GENE_SYMBOL:
msg_hgvs_given_symbol = "Searching without transcript is only supported for coordinates resolved against MANE transcripts."
if settings.SEARCH_HGVS_GENE_SYMBOL:
msg_hgvs_given_symbol = "Searching without transcript is only supported for coordinates resolved against MANE transcripts."

mane, alias = MANE.get_from_symbol_or_alias(gene_symbol_str)
if alias:
msg_hgvs_given_symbol += f" Matched to MANE gene symbol '{alias.gene_symbol}' via alias " \
f" {alias.alias} ({alias.get_source_display()})."
mane_and_aliases = MANE.get_mane_and_aliases_list_from_symbol(gene_symbol_str)
if not mane_and_aliases:
raise ValueError(
msg_hgvs_given_symbol + f" {gene_symbol_str} (or any aliases) have no MANE transcripts")

if not mane:
raise ValueError(msg_hgvs_given_symbol + f" {gene_symbol_str} (or any aliases) have no MANE transcripts")
transcript_versions = set()
mane_status_by_transcript = {}
for mane, alias in mane_and_aliases:
msg_hgvs_gene_search = msg_hgvs_given_symbol + f" Matched to MANE gene symbol '{alias.gene_symbol}' " + \
f"via alias {alias.alias} ({alias.get_source_display()})."

transcript_versions, mane_status_by_transcript = _get_search_hgvs_gene_symbol_transcripts(mane.symbol, genome_build)
gene_tvs, gene_mane_status = _get_search_hgvs_gene_symbol_transcripts(mane.symbol, genome_build)
transcript_versions.update(gene_tvs)
mane_status_by_transcript.update(gene_mane_status)

tv_qs = TranscriptVersion.objects.filter(genome_build=genome_build,
gene_version__gene__in=mane.symbol.genes)
transcripts = [tv.transcript for tv in transcript_versions]

msg_hgvs_gene_search = msg_hgvs_given_symbol
if tv_qs.exclude(transcript__in=transcripts).distinct("transcript_id").exists():
# We want to make the messages the same for both genome builds, so they are collected into 1
msg_hgvs_gene_search += f" {mane.symbol} has non-MANE transcripts that may resolve " \
Expand All @@ -531,6 +534,7 @@ def _search_hgvs(hgvs_string: str, user: User, genome_build: GenomeBuild, visibl

yield SearchMessageOverall(msg_hgvs_gene_search, severity=LogLevel.INFO)

try:
for result in _search_hgvs_using_gene_symbol(transcript_versions, mane_status_by_transcript,
hgvs_matcher, search_messages,
hgvs_string, user, genome_build, variant_qs):
Expand All @@ -540,17 +544,17 @@ def _search_hgvs(hgvs_string: str, user: User, genome_build: GenomeBuild, visibl
# FIXME - not sure what a SearchMessage of the alias is meant to accomplish by itself?
# result.messages.append(SearchMessage(str(alias)))
yield result
else:
yield SearchMessageOverall("HGVS search requires a transcript")

if has_results:
return
else: # Valid - just no results
hgvs_error = None
except HGVSException as e:
logging.error(e)
# might just not be a HGVS name at all
pass
else:
yield SearchMessageOverall("HGVS search requires a transcript")

except HGVSException:
# might just not be a HGVS name at all
pass
if has_results:
return
else: # Valid - just no results
hgvs_error = None

if variant_coordinate is None:
if classify:
Expand Down

0 comments on commit 8c8db49

Please sign in to comment.