【问题标题】:Python argument error occurs when running rdkit.Chem.SaltRemover(). (Python argument types did not match C++ signature)运行 rdkit.Chem.SaltRemover() 时出现 Python 参数错误。 (Python 参数类型与 C++ 签名不匹配)
【发布时间】:2019-12-03 04:13:14
【问题描述】:

我正在使用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 参数类型在 rdkit.Chem.rdmolops.DeleteSubstructs(Mol, NoneType, bool) 与 C++ 签名不匹配: DeleteSubstructs(class RDKit::ROMol mol, class RDKit::ROMol query, bool onlyFrags=False, bool useChirality=False)

【问题讨论】:

    标签: python rdkit argument-error


    【解决方案1】:

    我认为您在这里感到困惑。

    至于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,如果没有这些参数,盐定义将从file 中读取,该file 被读取为一组SMARTS 查询。当您将defnFormat 设置为'smiles' 时,您是在告诉remover 将文件作为一系列SMILES 字符串读取。当然,由于 cmets 和不正确的格式,这个文件不能被读取为 SMILES 字符串。在定义的盐中,随后有“无”对象,这就是您收到ArgumentError 的原因。在内部,rdkit 正在使用函数DeleteSubstructs,它正在传递您的查询分子和要删除的盐,现在可能是“无”。

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

    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 数据框中的分子列。

    【讨论】:

    • 非常感谢您的详细解释!它帮助我解决了ArgumentError。无论如何,我遇到了SaltRemover 函数的另一个问题...我尝试使用 for-loop 和A1.iloc[:]['ROMol'] 替换“ROMol”列。但是运行代码后,我发现“ROMol”中的所有分子都被替换为同一个(数据集中的第一个分子)。我对 Python 和 RDKit 完全陌生,所以我自己很难解决这些问题 :(
    • 很高兴我能帮上忙!如果它对您有帮助,您可以将其标记为已接受的答案吗?至于你的其他问题,你应该看看apply 函数。像A1 ['ROMol']这样的东西在我的头顶上。申请(卸妆.StripMol)
    猜你喜欢
    • 1970-01-01
    • 2021-02-04
    • 2023-03-26
    • 1970-01-01
    • 2022-10-19
    • 1970-01-01
    • 1970-01-01
    • 2013-09-26
    • 1970-01-01
    相关资源
    最近更新 更多