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, **kwargs):
self.check_meso = True
super(ChiralFilter, self).__init__(**kwargs)
@property
def columns(self):
return pd.Index(['is_chiral'])
def _is_meso(self, mol):
""" Determines whether the molecule is meso (i.e. has 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():
return InchiInfo(mol.to_inchi()).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