Python 当 运行 rdkit.Chem.SaltRemover() 时出现参数错误。 (Python 参数类型与 C++ 签名不匹配)

Python argument error occurs when running rdkit.Chem.SaltRemover(). (Python argument types did not match C++ signature)

我正在使用 RDKit 处理一些任务,但遇到了一些问题。 我正在尝试使用 SaltRemover() 函数清理我的数据集,但是 ArgumentError 发生了,我无法弄清楚它。

使用的代码是这样的:

from rdkit import Chem
from rdkit.Chem import AllChem
from rdkit.Chem.PandasTools import LoadSDF

A1 = LoadSDF('finaldata_A1.sdf', smilesName='SMILES')
A1 = A1['SMILES']

for mol in A1:
A1_mol = Chem.MolFromSmiles(mol)
if mol is None: continue

from rdkit.Chem import SaltRemover
remover = SaltRemover.SaltRemover(defnFormat='smiles')
A1_mol_SR = remover.StripMol(A1_mol)

运行代码后的错误信息是:

ArgumentError: Python argument types in rdkit.Chem.rdmolops.DeleteSubstructs(Mol, NoneType, bool) did not match C++ signature: DeleteSubstructs(class RDKit::ROMol mol, class RDKit::ROMol query, bool onlyFrags=False, bool useChirality=False)

我认为您对这里的一些事情感到困惑。

至于SaltRemover,你想用defnFormat论点达到什么目的?使用此参数时,还应提供 defnData,定义要删除的盐,即

from rdkit import Chem
from rdkit.Chem import SaltRemover

remover = SaltRemover(defnFormat='smarts', defnData="[Cl]")
mol = Chem.MolFromSmiles('CN(C)C.Cl')
res = remover.StripMol(mol)

# We have stripped the Cl
res.GetNumAtoms()
[Out]: 4

如果您初始化 SaltRemover,没有这些参数,salt 定义将从 file 中读取,该 file 被读取为一组 SMARTS 查询。当您将 defnFormat 设置为 'smiles' 时,您是在告诉移除器将文件读取为一系列 SMILES 字符串。当然,由于注释和格式不正确,此文件不能作为 SMILES 字符串读取。在定义的盐中随后有 'None' 个对象,这就是您收到 ArgumentError 的原因。在内部 rdkit 正在使用函数 DeleteSubstructs 传递给您的查询分子和要移除的盐,现在可能是 'None'.

您可能不需要定义自己的盐。如果不只是使用默认参数:

remover = SaltRemover()

# We can have a look at some of the salts
Chem.MolToSmarts(remover.salts[0])

[Out]: '[Cl,Br,I]'

# Use to strip salts
mol = Chem.MolFromSmiles('CN(C)C.Cl')
res = remover.StripMol(mol)
print(Chem.MolToSmiles(res))

[Out]: 'CN(C)C'

您的另一个问题似乎与您处理数据的方式有关。您似乎在计算 Mol 个对象两次?当您使用 'LoadSDF' 函数时,除非在 molColName 参数中指定,否则会将 Mols 添加到名称为 'ROMol' 的列中。你也只是想剥离一个分子?您可能应该考虑尝试将去除剂应用于 A1 数据框中的分子列。