Source code for schrodinger.application.steps.converters
from rdkit import Chem
from schrodinger import structure
from schrodinger.models import parameters
from schrodinger import stepper
from schrodinger.utils import fileutils
from . import utils
from .dataclasses import MaeInMixin
from .dataclasses import MaeOutMixin
from .dataclasses import MolInMixin
from .dataclasses import MolOutMixin
[docs]class SmilesToMolConverter(MolOutMixin, stepper.MapStep):
"""
Creates a molecule from the first word in the input string, interpreted as
SMILES.
"""
Input = str
[docs] def mapFunction(self, string):
smiles = string.split()[0]
mol = Chem.MolFromSmiles(smiles)
# we need to handle errors in the conversion PYAPP-7691
if mol is not None:
yield mol
[docs]class MolToSmilesConverter(MolInMixin, stepper.MapStep):
"""
Creates the canonical smiles string for the molecule.
"""
Output = str
[docs] def mapFunction(self, mol):
yield Chem.MolToSmiles(mol)
[docs]class MolToStructureConverter(MolInMixin, MaeOutMixin, stepper.MapStep):
"""
Step for converting Chem.Mol to structure.Structure objects.
"""
[docs] class Settings(parameters.CompoundParam):
generate_coordinates: bool = False
[docs] def mapFunction(self, mol):
yield utils.mol_to_structure(mol, self,
self.settings.generate_coordinates)
[docs]class StructureToMolConverter(MaeInMixin, MolOutMixin, stepper.MapStep):
"""
Step for converting structure.Structure to Chem.Mol objects.
"""
[docs] def mapFunction(self, st):
yield utils.structure_to_mol(st, self)
[docs]class MaeFiler(MaeInMixin, stepper.ReduceStep):
"""
A class to write the input `Structure` objects to a Maestro file.
"""
Output = stepper.StepperFile
[docs] class Settings(parameters.CompoundParam):
filename: str
[docs] def validateSettings(self):
filename = self.settings.filename
if not filename:
return [stepper.SettingsError(self, 'filename is not defined')]
if not fileutils.is_maestro_file(filename):
return [
stepper.SettingsError(
self, f'"{filename}" is not a proper Maestro file name')
]
return []
[docs] def reduceFunction(self, strucs):
with structure.StructureWriter(self.settings.filename) as writer:
for struc in strucs:
writer.append(struc)
yield stepper.StepperFile(self.settings.filename)