CDPKit MoleculeReader.__init__(MoleculeReader, str, str) не соответствует подписи C++

Вопрос или проблема

Я попытался использовать 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))

Как проверить правильность кода

  1. Убедитесь, что установлены все зависимости. Проверьте, что версии CDPKit, RDKit и, возможно, Boost.Python совместимы.
  2. Недоступные форматы. Убедитесь, что формат, который вы передаёте в MoleculeReader, поддерживается библиотекой.
  3. Тестирование кода. Запустите код с минимальным требованием к файлу (например, с одной молекулой) для проверки корректности.

Заключение

Данная ошибка может возникнуть из-за того, что вы не передали достаточное количество параметров в конструктор MoleculeReader. Убедившись в том, что вы передаёте все необходимые аргументы, вы можете устранить эту проблему и успешно читать SDF файлы. Если ошибка продолжит возникать, проверьте другую документацию на предмет изменений в API или другим рекомендациям, предоставленным разработчиками CDPKit.

Если будут дополнительные вопросы или появятся новые ошибки, не стесняйтесь обращаться за помощью. Удачи в работе с библиотеками!

Оцените материал
Добавить комментарий

Капча загружается...