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 数据框中的分子列。
我正在使用 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 数据框中的分子列。