Source code for TCT.node_normalizer
"""
This is a wrapper around the Node Normalizer API.
API docs: https://nodenorm.transltr.io/docs
"""
import urllib.parse
import requests
from .translator_node import TranslatorNode
URL = 'https://nodenorm.transltr.io/'
[docs]
def get_normalized_nodes(query: str | list[str],
return_equivalent_identifiers:bool=False,
**kwargs):
"""
A wrapper around the `get_normalized_nodes` api endpoint. Given a CURIE or a list of CURIEs, this returns a list of normalized identifiers.
Parameters
----------
query : str
Query CURIE
return_equivalent_identifiers : bool
Whether or not to return a list of equivalent identifiers along with the TranslatorNode. Default: False
**kwargs
Other arguments to `get_normalized_nodes` (e.g. `conflate` for gene-protein conflation, `drug_chemical_conflate` for drug-chemical conflation)
Returns
-------
If query is a single CURIE, returns a single TranslatorNode.
If query is a list of CURIEs, a dict of CURIE id to TranslatorNode for every node in the query.
Examples
--------
>>> get_normalized_nodes('MESH:D014867', return_equivalent_identifiers=False)
TranslatorNode(curie='CHEBI:15377', label='Water', types=['biolink:SmallMolecule', 'biolink:MolecularEntity', 'biolink:ChemicalEntity', 'biolink:PhysicalEssence', 'biolink:ChemicalOrDrugOrTreatment', 'biolink:ChemicalEntityOrGeneOrGeneProduct', 'biolink:ChemicalEntityOrProteinOrPolypeptide', 'biolink:NamedThing', 'biolink:PhysicalEssenceOrOccurrent'], synonyms=None, curie_synonyms=None)
"""
path = urllib.parse.urljoin(URL, 'get_normalized_nodes')
# default parameters: true for gene-protein conflation, false for drug-chemical conflation
response = requests.get(path, params={'curie': query, **kwargs})
if response.status_code == 200:
result = response.json()
if len(result) == 0:
raise LookupError('No matches found for the given input: ' + query)
else:
normalized_dict = {}
for k, node in result.items():
n = TranslatorNode(node['id']['identifier'])
if 'label' in node['id']:
n.label = node['id']['label']
if 'type' in node:
n.types = node['type']
if return_equivalent_identifiers and 'equivalent_identifiers' in node:
synonyms = []
curie_synonyms = []
for eq in node['equivalent_identifiers']:
if 'label' in eq:
synonyms.append(eq['label'])
else:
synonyms.append(None)
curie_synonyms.append(eq['identifier'])
n.synonyms = synonyms
n.curie_synonyms = curie_synonyms
normalized_dict[k] = n
if isinstance(query, str):
return normalized_dict[query]
return normalized_dict
else:
raise requests.RequestException('Response from server had error, code ' + str(response.status_code))