У меня есть две молекулы в двух отдельных файлах 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
. Может ли кто-нибудь объяснить мне, как использовать это правильно?
Спасибо.
Марко