Source code for matchms.filtering.derive_adduct_from_name
import logging
from ..metadata_utils import clean_adduct, looks_like_adduct
from ..typing import SpectrumType
logger = logging.getLogger("matchms")
[docs]def derive_adduct_from_name(spectrum_in: SpectrumType,
remove_adduct_from_name: bool = True) -> SpectrumType:
"""Find adduct in compound name and add to metadata (if not present yet).
Method to interpret the given compound name to find the adduct.
Parameters
----------
spectrum_in:
Input spectrum.
remove_adduct_from_name:
Remove found adducts from compound name if set to True. Default is True.
"""
if spectrum_in is None:
return None
spectrum = spectrum_in.clone()
if spectrum.get("compound_name", None) is not None:
name = spectrum.get("compound_name")
else:
assert spectrum.get("name", None) in [None, ""], ("Found 'name' but not 'compound_name' in metadata",
"Apply 'add_compound_name' filter first.")
return spectrum
# Detect adduct in compound name
adduct_from_name = None
name_split = name.split(" ")
for name_part in name_split[::-1][:2]:
if looks_like_adduct(name_part):
adduct_from_name = name_part
break
if adduct_from_name and remove_adduct_from_name:
name_adduct_removed = " ".join([x for x in name_split if x != adduct_from_name])
name_adduct_removed = name_adduct_removed.strip("; ")
spectrum.set("compound_name", name_adduct_removed)
logger.info("Removed adduct %s from compound name.", adduct_from_name)
# Add found adduct to metadata (if not present yet)
if adduct_from_name and not looks_like_adduct(spectrum.get("adduct")):
adduct_cleaned = clean_adduct(adduct_from_name)
spectrum.set("adduct", adduct_cleaned)
logger.info("Added adduct %s to metadata.", adduct_cleaned)
return spectrum