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