Python 寻找手性中心

Python 寻找手性中心,python,python-3.x,rdkit,Python,Python 3.x,Rdkit,对于某些分子和反应,似乎在应用反应后,smiles中可能找不到手性中心 对一个分子进行一些反应后,我得到的是这样的微笑:C[C](C)[C]1[CH+]/C=C(\\C)CC/C=C(\\C)CC1 它实际上似乎在碳3中有一个手性中心。如果我使用Chem.findMolchiralCenter(n,force=True,includeUnassigned=True)我得到一个空列表,这意味着没有手性中心 问题是,如果我把H加到碳3中,它就变成了手性中心,但它的类型是未赋值的(R或S)。我尝试使用

对于某些分子和反应,似乎在应用反应后,smiles中可能找不到手性中心

对一个分子进行一些反应后,我得到的是这样的微笑:
C[C](C)[C]1[CH+]/C=C(\\C)CC/C=C(\\C)CC1

它实际上似乎在碳3中有一个手性中心。如果我使用
Chem.findMolchiralCenter(n,force=True,includeUnassigned=True)
我得到一个空列表,这意味着没有手性中心

问题是,如果我把H加到碳3中,它就变成了手性中心,但它的类型是未赋值的(R或S)。我尝试使用
Chem.AddHs(mol)
添加Hs,然后再次尝试
Chem.findMolchiralCenter()
,但没有得到任何手性中心

我想知道是否有一种方法可以识别这个手性中心,即使它们不加H,并按照某种规则设置合适的手性标记

在对我的初始摩尔(
Chem.mol('C/C1=C\\C)施加两个1,2氢化物位移后[C@H]([C+](C)C)CC/C(C)=C/CC1'))
我得到了前面提到的微笑。考虑到我有一些初始的手性标签,我想知道是否有一种方法可以恢复反应后失去的手性

用于1,2氢化物移位的智能体:
[Ch:1]-[C+1:2]>>[C+1:1]-[Ch+0:2]

mol = Chem.MolFromSmiles('C/C1=C\\C[C@H]([C+](C)C)CC/C(C)=C/CC1')
rxn  = AllChem.ReactionFromSmarts('[Ch:1]-[C+1:2]>>[C+1:1]-[Ch+0:2]')
products = list()
for product in rxn.RunReactant(mol, 0):
    Chem.SanitizeMol(product[0])
    products.append(product[0])
print(Chem.MolToSmiles(products[0]))
在将这种反应应用于产品两次后,我最终得到了这个微笑

Output:
'C[C](C)[C]1[CH+]/C=C(\\C)CC/C=C(\\C)CC1'
这实际上是碳3中的手性中心


有什么想法吗?或者我应该把它报告为bug吗?

这不是bug。我认为您没有指定希望在
moltomiles
函数中使用规范的微笑。因此,当我尝试:

mol = Chem.MolFromSmiles('C/C1=C\\C[C@H]([C+](C)C)CC/C(C)=C/CC1')
rxn  = AllChem.ReactionFromSmarts('[Ch:1]-[C+1:2]>>[C+1:1]-[Ch+0:2]')
products = list()
for product in rxn.RunReactant(mol, 0):
    Chem.SanitizeMol(product[0])
    products.append(product[0])
print(Chem.MolToSmiles(products[0]))
Chem.MolToSmiles(ps[0][0])
我得到了与你完全相同的结果:

'C[C](C)[CH+]1CC=C(C)CCC=C(C)CC1'
'CC1=CC[CH](CCC(C)=CCC1)=C(C)C'
但是当你用这个的时候:

Chem.MolToSmiles(ps[0][0], True)
您可以获得以下结果:

'CC(C)=[C@H]1C/C=C(\\C)CC/C=C(\\C)CC1'

这不是一个bug。我认为您没有指定希望在
moltomiles
函数中使用规范的微笑。因此,当我尝试:

mol = Chem.MolFromSmiles('C/C1=C\\C[C@H]([C+](C)C)CC/C(C)=C/CC1')
rxn  = AllChem.ReactionFromSmarts('[Ch:1]-[C+1:2]>>[C+1:1]-[Ch+0:2]')
products = list()
for product in rxn.RunReactant(mol, 0):
    Chem.SanitizeMol(product[0])
    products.append(product[0])
print(Chem.MolToSmiles(products[0]))
Chem.MolToSmiles(ps[0][0])
我得到了与你完全相同的结果:

'C[C](C)[CH+]1CC=C(C)CCC=C(C)CC1'
'CC1=CC[CH](CCC(C)=CCC1)=C(C)C'
但是当你用这个的时候:

Chem.MolToSmiles(ps[0][0], True)
您可以获得以下结果:

'CC(C)=[C@H]1C/C=C(\\C)CC/C=C(\\C)CC1'

我现在没有能力尝试这一点,但您是否尝试过在reaction smarts产品中指定手性?我现在没有能力尝试这一点,但您是否尝试过在reaction smarts产品中指定手性?