Source code for chemFilters.chem.utils
# -*- coding: utf-8 -*-
"""Utility functions to be used by the chemFilters.chem subpackage."""
from contextlib import contextmanager
from rdkit import Chem, RDLogger, rdBase
from rdkit.Chem import inchi
from ..logger import logger
[docs]
@contextmanager
def rdkit_log_controller(level):
"""Context manager for controlling the RDKit logger level.
Args:
level: desired logging level. One of `debug, info, warning, error, critical`.
"""
lg = RDLogger.logger()
lvl = level.upper()
# in case no logging is enable, it will be set to critical
lvl_list = rdBase.LogStatus().split("\n") + ["rdApp.critical:enabled"]
lg.setLevel(getattr(RDLogger, lvl))
init_lvl = [lev.split(":")[0] for lev in lvl_list if "enabled" in lev.lower()][0]
yield
lg.setLevel(getattr(RDLogger, init_lvl.split(".")[1].upper())) # restore the level
[docs]
def molToConnectivity(mol: Chem.Mol):
"""Converts a SMILES string to a connectivity string."""
try:
connectivity = Chem.MolToInchiKey(mol).split("-")[0]
except TypeError as e:
logger.error(f"Could not convert mol to connectivity. Message:\n {e}")
connectivity = None
return connectivity
[docs]
def molToInchiKey(mol: Chem.Mol):
"""Converts a SMILES string to an InChI string."""
try:
inchi_key = Chem.MolToInchiKey(mol)
except TypeError as e:
logger.error(f"Could not convert mol to inchikey. Message:\n {e}")
inchi_key = None
return inchi_key
[docs]
def molToInchi(mol: Chem.Mol):
"""Converts a SMILES string to an InChI string."""
try:
inchi_str = inchi.MolToInchi(mol)
except TypeError as e:
logger.error(f"Could not convert mol to inchi. Message:\n {e}")
inchi_str = None
return inchi_str
[docs]
def molToCanon(mol, isomeric: bool = True):
return Chem.MolToSmiles(mol, canonical=True, isomericSmiles=isomeric)