Source code for skchem.filters.stereo

#! /usr/bin/env python
#
# Copyright (C) 2016 Rich Lewis <rl403@cam.ac.uk>
# License: 3-clause BSD

"""
# skchem.filters.stereo

Stereo filters for scikit-chem.
"""

from rdkit.Chem.MolKey.InchiInfo import InchiInfo
import pandas as pd

from .base import Filter
from ..utils import Suppressor


[docs]class ChiralFilter(Filter): """ Filter chiral compounds. Examples: >>> import skchem >>> cf = skchem.filters.ChiralFilter() >>> ms = [ ... skchem.Mol.from_smiles('F[C@@H](F)[C@H](F)F', name='achiral'), ... skchem.Mol.from_smiles('F[C@@H](Br)[C@H](Br)F', name='chiral'), ... skchem.Mol.from_smiles('F[C@H](Br)[C@H](Br)F', name='meso'), ... skchem.Mol.from_smiles('FC(Br)C(Br)F', name='racemic') ... ] >>> cf.transform(ms) achiral False chiral True meso False racemic False Name: is_chiral, dtype: bool """ def __init__(self, check_meso=True, n_jobs=1, verbose=True): """ Initialize a `ChiralFilter` object. Args: check_meso (bool): Whether to include a check for meso compounds. n_jobs (int): The number of procesess to run the filter in. verbose (bool): Whether to output a progress bar. """ self.check_meso = check_meso super(ChiralFilter, self).__init__(agg='any', n_jobs=n_jobs, verbose=verbose) @property def columns(self): return pd.Index(['is_chiral']) @staticmethod
[docs] def is_meso(mol): """ Determines whether the molecule is meso. Meso compounds have chiral centres, but has a mirror plane allowing superposition. Examples: >>> import skchem >>> cf = skchem.filters.ChiralFilter() >>> meso = skchem.Mol.from_smiles('F[C@H](Br)[C@H](Br)F') >>> cf.is_meso(meso) True >>> non_meso = skchem.Mol.from_smiles('F[C@H](Br)[C@@H](Br)F') >>> cf.is_meso(non_meso) False """ with Suppressor(): info = InchiInfo(mol.to_inchi()) return info.get_sp3_stereo()['main']['non-isotopic'][2]
def _transform_mol(self, mol): is_meso = self.is_meso(mol) if self.check_meso else False return any(atom.GetChiralTag() for atom in mol.atoms) and not is_meso