Вопрос или проблема
Я попытался использовать CDPL Chem для чтения файла SDF, сгенерированного RDKit, следуя этой кодовой базе. Однако я столкнулся с ошибкой:
mol = CDPL_readSDF(temp_file)
File "~/csv2sdf.py", line 462, in CDPL_readSDF
reader = CDPLChem.MoleculeReader(input_sd_file)
Boost.Python.ArgumentError: Python argument types in
MoleculeReader.__init__(MoleculeReader, str)
did not match C++ signature:
__init__(_object* self, std::istream {lvalue} is, CDPL::Base::DataFormat fmt)
__init__(_object* self, std::istream {lvalue} is, std::string fmt)
__init__(_object* self, std::string file_name, CDPL::Base::DataFormat fmt, std::_Ios_Openmode mode=CDPL.Base._base.OpenMode(12))
__init__(_object* self, std::string file_name, std::string fmt, std::_Ios_Openmode mode=CDPL.Base._base.OpenMode(12))
__init__(_object* self, std::string file_name, std::_Ios_Openmode mode=CDPL.Base._base.OpenMode(12))
Мой импорт:
import CDPL.Chem as CDPLChem
import CDPL.ConfGen as CCfGen
from rdkit import Chem
from rdkit.Chem import AllChem
Мой выходной файл SDF RDKit:
def prepare_mol_for_SDPL(smiles:str, columns: list, row: pd.Series, temp_file: str):
"""
Добавляет водороды в предоставленную строку SMILES.
"""
mol = Chem.MolFromSmiles(smiles)
mol = Chem.AddHs(mol)
AllChem.Compute2DCoords(mol)
for col in columns:
mol.SetProp(col, str(row[col]))
mol.SetProp("_InputInChIKey", str(Chem.inchi.InchiToInchiKey(Chem.inchi.MolToInchi(Chem.MolFromSmiles(smiles)))))
mol.SetProp("_SMILES", str(Chem.MolToSmiles(mol)))
mol.SetProp("_InChIKey", str(Chem.inchi.InchiToInchiKey(Chem.inchi.MolToInchi(mol))))
writer = Chem.SDWriter(temp_file)
writer.write(mol)
writer.close()
Моя функция чтения:
def CDPL_readSDF(input_sd_file: str) -> None:
"""
Извлекает структуру данных каждой молекулы из предоставленного SD файла и выводит ее в консоль.
Параметры:
- input_sd_file (str): Путь к входному SD файлу.
Референсы:
- https://cdpkit.org/cdpl_python_tutorial/cdpl_python_tutorial.html#retrieving-structure-data-from-mdl-sd-files
"""
# Создаем считыватель для MDL SD-файлов
# reader = CDPLChem.FileSDFMoleculeReader(input_sd_file)
reader = CDPLChem.MoleculeReader(input_sd_file)
# создаем экземпляр стандартной реализации интерфейса Chem.Molecule
mol = CDPLChem.BasicMolecule()
# Проходим по каждой молекуле в файле и извлекаем данные структуры
try:
while reader.read(mol):
return mol
# try:
# if not CDPLChem.hasStructureData(mol):
# raise Exception('Ошибка: нет доступных данных структуры для молекулы', Chem.getName(mol))
# return mol
# except Exception as e:
# raise Exception('Ошибка: обработка молекулы завершилась неудачей: ' + str(e))
except Exception as e: # обрабатываем исключение, возникшее в случае серьезных ошибок чтения
raise Exception('Ошибка: чтение молекулы завершилось неудачей: ' + str(e))
Моя главная функция:
for ind in df.index:
smiles = df.loc[ind, args.smi_column]
mol = None
try:
try:
os.remove(temp_file)
except:
print()
temp_file = output_file.replace('.sdf', '_temp.sdf')
prepare_mol_for_SDPL(smiles, df.columns, df.loc[ind], temp_file)
mol = CDPL_readSDF(temp_file)
os.remove(temp_file)
п/с: Я посмотрел некоторые референсы:
Обе работают:
Пожалуйста, помогите мне решить эту проблему. Большое спасибо.
Ответ или решение
Ошибка при использовании MoleculeReader в CDPKit: Подробный анализ и способ её устранения
Вам была предоставлена ошибка, связанная с использованием класса MoleculeReader
из библиотеки CDPKit, когда вы пытались получить доступ к данным молекул из SDF файлов, созданных библиотекой RDKit. Давайте детально разберёмся с причиной этой ошибки и возможными способами её устранения.
Ошибка
Вы получили следующее сообщение об ошибке:
Boost.Python.ArgumentError: Python argument types in
MoleculeReader.__init__(MoleculeReader, str)
did not match C++ signature:
__init__(_object* self, std::istream {lvalue} is, ...
Это означает, что при вызове метода __init__
для объекта MoleculeReader
были переданы аргументы, которые не соответствуют ожидаемым параметрам C++ функции инициализации. Конкретно, библиотека ожидает, что вы передадите либо поток (stream) данных, либо строку, указывающую на имя файла, а также формат данных.
Диагностика проблемы
Рассмотрим ваш код:
reader = CDPLChem.MoleculeReader(input_sd_file)
Здесь вы передаёте только один параметр – путь к файлу input_sd_file
. Ошибка указывает на то, что необходимо передать дополнительный параметр, который будет обозначать формат данных.
Решение
Для решения этой проблемы вам нужно изменить ваш код для правильного создания объекта MoleculeReader
. Вам потребуется указать формат файла (например, "sdf") при инициализации, как это описано в документации к CDPKit. Вот пример, как вы можете это сделать:
def CDPL_readSDF(input_sd_file: str) -> None:
"""
Retrieves the structure data of each molecule in the provided SD file and outputs it to the console.
Parameters:
- input_sd_file (str): Path to the input SD file.
"""
# Задайте формат данных, подходящий для SDF
data_format = "sdf" # или используйте, если доступно, CDPL.Base.DataFormat.SDF
# Создайте объект MoleculeReader с правильными аргументами
reader = CDPLChem.MoleculeReader(input_sd_file, data_format)
# Создайте экземпляр базового класса Molecule
mol = CDPLChem.BasicMolecule()
# Итерация по молекулам и получение их свойств
try:
while reader.read(mol):
return mol
except Exception as e:
raise Exception('Ошибка: чтение молекулы не удалось: ' + str(e))
Как проверить правильность кода
- Убедитесь, что установлены все зависимости. Проверьте, что версии
CDPKit
,RDKit
и, возможно,Boost.Python
совместимы. - Недоступные форматы. Убедитесь, что формат, который вы передаёте в
MoleculeReader
, поддерживается библиотекой. - Тестирование кода. Запустите код с минимальным требованием к файлу (например, с одной молекулой) для проверки корректности.
Заключение
Данная ошибка может возникнуть из-за того, что вы не передали достаточное количество параметров в конструктор MoleculeReader
. Убедившись в том, что вы передаёте все необходимые аргументы, вы можете устранить эту проблему и успешно читать SDF файлы. Если ошибка продолжит возникать, проверьте другую документацию на предмет изменений в API или другим рекомендациям, предоставленным разработчиками CDPKit.
Если будут дополнительные вопросы или появятся новые ошибки, не стесняйтесь обращаться за помощью. Удачи в работе с библиотеками!