Source code for schrodinger.application.steps.transformers
from rdkit import Chem
from schrodinger.infra import mmerr
from schrodinger.models.parameters import CompoundParam
from schrodinger.structutils.build import desalt_structure
from schrodinger.structutils.build import neutralize_structure
from schrodinger.stepper import ReduceStep
from schrodinger.utils import license
from . import utils
from .basesteps import MolMapStep
from .dataclasses import ScoredSmiles
from .dataclasses import ScoredSmilesIOMixin
STANDARDIZER_MMERR_LEVEL = mmerr.MMERR_OFF
[docs]class Standardizer(MolMapStep):
"""
Creates a coordinate-less molecule that is neutralized and desalted.
This involves a conversion to a `schrodinger.structure.Structure`.
"""
[docs] def getLicenseRequirements(self):
return {license.LIGPREP_MAIN: 1}
[docs] def mapFunction(self, mol):
st = utils.mol_to_structure(mol, self, generate_coordinates=False)
if st is not None:
with mmerr.Level(STANDARDIZER_MMERR_LEVEL):
st = desalt_structure(neutralize_structure(st))
mol = utils.structure_to_mol(st, self, mol)
if mol is not None:
yield mol
[docs]class ScoredSmilesStandardizer(ScoredSmilesIOMixin, ReduceStep):
"""
Standardizes the SMILES.
If more than one input has the same standardized SMILES `keep_lowest` in the
settings determines whether the lowest value is retained or the highest.
"""
[docs] class Settings(CompoundParam):
keep_lowest: bool = True
[docs] def getLicenseRequirements(self):
return {license.LIGPREP_MAIN: 1}
[docs] def reduceFunction(self, inputs):
standardizer = Standardizer()
scored_smiles = dict()
for input in inputs:
if mol := Chem.MolFromSmiles(input.smiles):
try:
mol = next(standardizer.mapFunction(mol))
except StopIteration:
continue
smiles = Chem.MolToSmiles(mol)
score = scored_smiles.get(smiles)
if score is None:
score = input.score
elif self.settings.keep_lowest:
score = min(input.score, score)
else:
score = max(input.score, score)
scored_smiles[smiles] = score
for smiles, score in scored_smiles.items():
yield ScoredSmiles(smiles=smiles, score=score)
[docs]class StereoChemistryRemover(MolMapStep):
"""
Removes the stereo chemistry from a molecule.
"""
[docs] def mapFunction(self, mol):
Chem.RemoveStereochemistry(mol)
yield mol