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