соединить молекулы объектов в пиматгене - PullRequest
0 голосов
/ 10 апреля 2020

У меня есть две молекулы в двух отдельных файлах xyz: benzene.xyz и methane.xyz . Я хотел бы создать молекулу метилбензола (C7H8) из этих двух, используя pymatgen.

Сначала я определил функцию, которая использует pybel для чтения объекта pymatgen и возврата из него строки SMILES.

from IPython.core.display import SVG, display_svg
from pymatgen.io.babel import BabelMolAdaptor
import pybel as pb

def quick_print_pmg( pmg_obj ):

    bma_obj = BabelMolAdaptor(pmg_obj)
    pbm_obj = pb.Molecule(bma_obj.openbabel_mol)
    smi_obj = pb.readstring('smi', pbm_obj.write("can"))
    print("Canonical SMILES = {}".format(smi_obj.write("can")))

    #lines below are to show the result
    #smi_obj.make3D()
    #svg_obj = SVG(smi_obj.write("svg"))
    #display_svg(svg_obj)

Теперь мы можем открыть два текстовых файла и прочитать молекулы

from pymatgen import Molecule

benz_pmg = Molecule.from_file("benzene.xyz")
meth_pmg = Molecule.from_file("methane.xyz")

Два атома водорода должны быть удалены (и выброшены). Я попытался просто удалить два атома водорода и сделать для l oop до append() атомов от метана до бензола, но это не дает гарантии, что результат правильный, плюс я должен убедиться, что атомы не перекрываются .

benz_pmg.pop(-1)
meth_pmg.pop(-1)

for atom in meth_pmg:
    benz_pmg.append(atom.specie, atom.coords + [1,1,1])

quick_print_pmg( benz_pmg )
Canonical SMILES = [CH]=[C][CH]C=[CH].[CH2][CH2]    

Другой вариант, который я попробовал, - это метод substitute() класса Molecule от pymatgen, который выглядит как то, что я ищу, но я не могу заставить его работать прямо.

# read coordinates from files again

benz_pmg = Molecule.from_file("benzene.xyz")
meth_pmg = Molecule.from_file("methane.xyz")

benz_pmg.substitute(0, meth_pmg)
quick_print_pmg( benz_pmg )
Canonical SMILES = [CH]/C=C\[CH].C.[H].[H]  

Канонические улыбки, которые я ищу, скорее C1=CC=CC=C1C. Может ли кто-нибудь объяснить мне, как использовать это правильно?

Спасибо.

Марко

...