Source code for schrodinger.application.steps.dataclasses
"""
Data classes to be used as input/output objects for steps and their associated
serializers which may be used when batching those steps.
"""
import warnings
from rdkit import Chem
from schrodinger import structure
from schrodinger.models import parameters
from schrodinger import stepper
[docs]class StepsError(RuntimeError):
pass
[docs]class MolToSmilesSerializer(stepper.Serializer):
"""
A serializer using RDKit's canonical SMILES of the Mol as the serialized
form.
"""
DataType = Chem.Mol
[docs] def deserialize(self, fname):
with open(fname, 'r') as infile:
for line in infile:
line = line.strip()
inp = self.fromString(line)
if inp is None:
warning_msg = f'ERROR: FAILED TO PARSE SMILES - "{line.strip()}"'
warnings.warn(RuntimeWarning(warning_msg))
else:
yield inp
[docs] def fromString(self, smiles_str):
return Chem.MolFromSmiles(smiles_str)
[docs] def toString(self, output_mol):
return Chem.MolToSmiles(output_mol)
[docs]class MolInMixin:
Input = Chem.Mol
InputSerializer = MolToSmilesSerializer
[docs]class MolOutMixin:
Output = Chem.Mol
OutputSerializer = MolToSmilesSerializer
[docs]class MolMolMixin(MolInMixin, MolOutMixin):
pass
[docs]class ScoredMol(parameters.CompoundParam):
mol: Chem.Mol
score: float = None
def __str__(self):
return f'{Chem.MolToSmiles(self.mol)} {self.score}'
[docs]class ScoredMolSerializer(stepper.Serializer):
"""
A serializer using RDKit's canonical SMILES of the Mol and the score value
string separated by a ',' as the serialized form.
"""
DataType = ScoredMol
SEPARATOR = ','
[docs] def toString(self, scored_mol):
smiles = Chem.MolToSmiles(scored_mol.mol)
return smiles + self.SEPARATOR + str(scored_mol.score)
[docs] def fromString(self, scored_mol_str):
smiles, score = scored_mol_str.split(self.SEPARATOR)
mol = Chem.MolFromSmiles(smiles)
score = float(score)
return ScoredMol(mol=mol, score=score)
[docs]class ScoredMolInMixin:
Input = ScoredMol
InputSerializer = ScoredMolSerializer
[docs]class ScoredMolOutMixin:
Output = ScoredMol
OutputSerializer = ScoredMolSerializer
[docs]class ScorerMixin:
Input = Chem.Mol
InputSerializer = MolToSmilesSerializer
Output = ScoredMol
OutputSerializer = ScoredMolSerializer
[docs]class ScoredSmiles(parameters.CompoundParam):
smiles: str
score: float = None
def __str__(self):
return f'{self.smiles} {self.score}'
[docs]class ScoredSmilesSerializer(stepper.Serializer):
"""
A serializer using the smiles and score value strings separated by a ',' as
the serialized form
"""
DataType = ScoredSmiles
SEPARATOR = ','
[docs] def fromString(self, input_str):
smiles, score = input_str.split(self.SEPARATOR)
return ScoredSmiles(smiles=smiles, score=float(score))
[docs] def toString(self, scored_smiles):
return f'{scored_smiles.smiles}{self.SEPARATOR}{scored_smiles.score}'
[docs]class ScoredSmilesInMixin:
Input = ScoredSmiles
InputSerializer = ScoredSmilesSerializer
[docs]class ScoredSmilesOutMixin:
Output = ScoredSmiles
OutputSerializer = ScoredSmilesSerializer
[docs]class MaeInMixin:
# the default serializer for structure objects will be used
Input = structure.Structure
[docs]class MaeOutMixin:
# the default serializer for structure objects will be used
Output = structure.Structure
[docs]class MaeMaeMixin(MaeInMixin, MaeOutMixin):
pass
[docs]class FileInMixin:
Input = stepper.StepperFile
[docs]class ScoredSmilesIOMixin:
Input = ScoredSmiles
InputSerializer = ScoredSmilesSerializer
Output = ScoredSmiles
OutputSerializer = ScoredSmilesSerializer