Source code for rxn.chemutils.rdf.reaction_smiles_extractor

from typing import Iterable, List, Optional

from rxn.chemutils.reaction_equation import ReactionEquation

from ..conversion import mdl_to_smiles
from .rdf_reaction import RdfReaction
from .reaction_properties import ReactionProperties


[docs]class ReactionSmilesExtractor: """Extract reaction SMILES from RdfReaction instances."""
[docs] def __init__(self, fragment_bond: Optional[str] = None, sanitize: bool = True): self.fragment_bond = fragment_bond self.sanitize = sanitize
[docs] def to_reaction_smiles(self, reaction: RdfReaction) -> str: """Extract the reaction SMILES. Args: reaction: RdfReaction to extract the reaction equation from. """ return self.to_string(self.to_reaction_equation(reaction))
[docs] def to_reaction_equation(self, reaction: RdfReaction) -> ReactionEquation: """Extract the reaction equation. Args: reaction: RdfReaction to extract the reaction equation from. """ # NB: reaction.reagents should actually always be an empty list reagents = reaction.reagents.copy() reagents.extend( c.mol_structure for c in ReactionProperties(reaction.meta).get_compounds() ) return ReactionEquation( reactants=self._to_smiles_group(reaction.reactants), agents=self._to_smiles_group(reagents), products=self._to_smiles_group(reaction.products), )
[docs] def to_string(self, reaction_equation: ReactionEquation) -> str: """Convert a ReactionEquation to a reaction SMILES. Useful function as it automatically uses the correct fragment bond.""" return reaction_equation.to_string(fragment_bond=self.fragment_bond)
def _to_smiles(self, mdl: str) -> str: return mdl_to_smiles(mdl, sanitize=self.sanitize, canonicalize=True) def _to_smiles_group(self, mdl_iterable: Iterable[str]) -> List[str]: return [self._to_smiles(m) for m in mdl_iterable]