From fb47b927d587020a87997f109745ea2024b564f8 Mon Sep 17 00:00:00 2001 From: Benjamin Mayer Date: Wed, 24 Aug 2022 09:43:18 +0200 Subject: [PATCH 01/37] XYZFile working with single model, some change with regards to model in get_structure function needed. MOL2File and SDFFile prepared now ... --- .gitignore | 1 + notes_ben.txt | 9 ++ src/biotite/structure/io/general.py | 28 ++++ src/biotite/structure/io/mol2/__init__.py | 18 +++ src/biotite/structure/io/mol2/convert.py | 49 ++++++ src/biotite/structure/io/mol2/file.py | 174 ++++++++++++++++++++++ src/biotite/structure/io/sdf/__init__.py | 18 +++ src/biotite/structure/io/sdf/convert.py | 49 ++++++ src/biotite/structure/io/sdf/file.py | 174 ++++++++++++++++++++++ src/biotite/structure/io/trajfile.py | 2 +- src/biotite/structure/io/xyz/__init__.py | 18 +++ src/biotite/structure/io/xyz/convert.py | 49 ++++++ src/biotite/structure/io/xyz/file.py | 174 ++++++++++++++++++++++ tests/structure/data/molecules/BENZ.xyz | 14 ++ tests/structure/test_mol2.py | 51 +++++++ tests/structure/test_sdf.py | 51 +++++++ tests/structure/test_xyz.py | 51 +++++++ 17 files changed, 929 insertions(+), 1 deletion(-) create mode 100644 notes_ben.txt create mode 100644 src/biotite/structure/io/mol2/__init__.py create mode 100644 src/biotite/structure/io/mol2/convert.py create mode 100644 src/biotite/structure/io/mol2/file.py create mode 100644 src/biotite/structure/io/sdf/__init__.py create mode 100644 src/biotite/structure/io/sdf/convert.py create mode 100644 src/biotite/structure/io/sdf/file.py create mode 100644 src/biotite/structure/io/xyz/__init__.py create mode 100644 src/biotite/structure/io/xyz/convert.py create mode 100644 src/biotite/structure/io/xyz/file.py create mode 100644 tests/structure/data/molecules/BENZ.xyz create mode 100644 tests/structure/test_mol2.py create mode 100644 tests/structure/test_sdf.py create mode 100644 tests/structure/test_xyz.py diff --git a/.gitignore b/.gitignore index 63c64825e..14350d357 100644 --- a/.gitignore +++ b/.gitignore @@ -55,3 +55,4 @@ biotite.egg-info # Ignore fuse_hidden files on Linux systems *.fuse_hidden* + diff --git a/notes_ben.txt b/notes_ben.txt new file mode 100644 index 000000000..5ebb87617 --- /dev/null +++ b/notes_ben.txt @@ -0,0 +1,9 @@ +import biotite.structure.io as strucio +from biotite.structure.io.xyz import XYZFile +from biotite.structure.io.mol import MOLFile +benz_mol = MOLFile.read("/home/mayer/Downloads/benzene-3D-structure-CT1001419667.sdf") +benz_xyz = XYZFile() +benz_struct=benz_mol.get_structure() +benz_xyz.set_structure(benz_struct) +print(benz_xyz) +benz_xyz_example = strucio.load_structure("/home/mayer/Dev/biotite/tests/structure/data/molecules/BENZ.xyz") diff --git a/src/biotite/structure/io/general.py b/src/biotite/structure/io/general.py index 509f0f8d6..32f8057b0 100644 --- a/src/biotite/structure/io/general.py +++ b/src/biotite/structure/io/general.py @@ -79,6 +79,34 @@ def load_structure(file_path, template=None, **kwargs): return array[0] else: return array + elif suffix == ".xyz": + from .xyz import XYZFile + file = XYZFile.read(file_path) + array = file.get_structure(**kwargs) + if isinstance(array, AtomArrayStack) and array.stack_depth() == 1: + # Stack containing only one model -> return as atom array + return array[0] + else: + return array + elif suffix == ".mol2": + from .mol2 import MOL2File + file = MOL2File.read(file_path) + array = file.get_structure(**kwargs) + if isinstance(array, AtomArrayStack) and array.stack_depth() == 1: + # Stack containing only one model -> return as atom array + return array[0] + else: + return array + elif suffix == ".sdf": + from .sdf import SDFFile + file = SDFFile.read(file_path) + array = file.get_structure(**kwargs) + if isinstance(array, AtomArrayStack) and array.stack_depth() == 1: + # Stack containing only one model -> return as atom array + return array[0] + else: + return array + elif suffix == ".cif" or suffix == ".pdbx": from .pdbx import PDBxFile, get_structure file = PDBxFile.read(file_path) diff --git a/src/biotite/structure/io/mol2/__init__.py b/src/biotite/structure/io/mol2/__init__.py new file mode 100644 index 000000000..06949382b --- /dev/null +++ b/src/biotite/structure/io/mol2/__init__.py @@ -0,0 +1,18 @@ +# This source code is part of the Biotite package and is distributed +# under the 3-Clause BSD License. Please see 'LICENSE.rst' for further +# information. + +""" +The MOL format is used to depict atom positions and bonds for small +molecules. +This subpackage is used for reading and writing an :class:`AtomArray` +in this format. +Additionally, reading data from the SDF format, which is a wrapper +around MOL, is also supported. +""" + +__name__ = "biotite.structure.io.mol2" +__author__ = "Benjamin E. Mayer" + +from .file import * +from .convert import * diff --git a/src/biotite/structure/io/mol2/convert.py b/src/biotite/structure/io/mol2/convert.py new file mode 100644 index 000000000..acd81e6bf --- /dev/null +++ b/src/biotite/structure/io/mol2/convert.py @@ -0,0 +1,49 @@ +# This source code is part of the Biotite package and is distributed +# under the 3-Clause BSD License. Please see 'LICENSE.rst' for further +# information. + +__name__ = "biotite.structure.io.mol2" +__author__ = "Benjamin E. Mayer" +__all__ = ["get_structure", "set_structure"] + + + +def get_structure(mol2_file): + """ + Get an :class:`AtomArray` from the XYZ File. + + Ths function is a thin wrapper around + :meth:`XYZFile.get_structure()`. + + Parameters + ---------- + xyz_file : XYZFile + The XYZ File. + + Returns + ------- + array : AtomArray + This :class:`AtomArray` contains the optional ``charge`` + annotation and has an associated :class:`BondList`. + All other annotation categories, except ``element`` are + empty. + """ + return mol2_file.get_structure() + + +def set_structure(mol2_file, atoms): + """ + Set the :class:`AtomArray` for the XYZ File. + + Ths function is a thin wrapper around + :meth:`XYZFile.set_structure()`. + + Parameters + ---------- + xyz_file : XYZFile + The XYZ File. + array : AtomArray + The array to be saved into this file. + Must have an associated :class:`BondList`. + """ + mol2_file.set_structure(atoms) diff --git a/src/biotite/structure/io/mol2/file.py b/src/biotite/structure/io/mol2/file.py new file mode 100644 index 000000000..df028a8ad --- /dev/null +++ b/src/biotite/structure/io/mol2/file.py @@ -0,0 +1,174 @@ +# This source code is part of the Biotite package and is distributed +# under the 3-Clause BSD License. Please see 'LICENSE.rst' for further +# information. + +__name__ = "biotite.structure.io.mol2" +__author__ = "Benjamin E. Mayer" +__all__ = ["MOL2File"] + +import numpy as np +from ...atoms import AtomArray, Atom +from ....file import TextFile + + +# Number of header lines +N_HEADER = 2 + + +class MOL2File(TextFile): + """ + This class represents a file in MOL2 format, + + References + ---------- + + .. footbibliography:: + + Examples + -------- + + >>> from os.path import join + >>> mol_file = MOL2File.read(join(path_to_structures, "molecules", "BENZ.mol2")) + >>> atom_array = mol2_file.get_structure() + >>> print(atom_array) + 0 C 0.000 1.403 0.000 + 0 H 0.000 2.490 0.000 + 0 C -1.215 0.701 0.000 + 0 H -2.157 1.245 0.000 + 0 C -1.215 -0.701 0.000 + 0 H -2.157 -1.245 0.000 + 0 C 0.000 -1.403 0.000 + 0 H 0.000 -2.490 0.000 + 0 C 1.215 -0.701 0.000 + 0 H 2.157 -1.245 0.000 + 0 C 1.215 0.701 0.000 + 0 H 2.157 1.245 0.000 + + """ + + def __init__(self): + super().__init__() + # empty header lines + self.lines = [""] * N_HEADER + + def get_header(self): + """ + Get the header from the MOL2 file. + + Returns + ------- + mol_name : str + The name of the molecule. + initials : str + The author's initials. + program : str + The program name. + time : datetime + The time of file creation. + dimensions : str + Dimensional codes. + scaling_factors : str + Scaling factors. + energy : str + Energy from modeling program. + registry_number : str + MDL registry number. + comments : str + Additional comments. + """ + atom_number = int(self.lines[0].strip()) + mol_name = self.lines[1].strip() + return atom_number, mol_name + + + def set_header(self, mol_name): + """ + Set the header for the MOL2 file. + + Parameters + ---------- + mol_name : str + The name of the molecule. + + """ + + if(len(self.lines) > 2): + + self.lines[1] = str(mol_name) + "\n" + self.lines[0] = str(len(self.lines)-2)+ "\n" + + else: + raise ValueError( + "Can not set header of an empty MOL2File" + "Use set_structure first, so that number of atoms" + "can be derived from set structure" + ) + + + def get_structure(self): + """ + Get an :class:`AtomArray` from the MOL2 file. + + Returns + ------- + array : AtomArray + This :class:`AtomArray` contains the optional ``charge`` + annotation and has an associated :class:`BondList`. + All other annotation categories, except ``element`` are + empty. + """ + + if len(self.lines) > 2: + + + array = AtomArray(len(self.lines)-2) + + for i, line in enumerate(self.lines[2:]): + line_parsed = [x for x in line.strip().split(" ") if x!= ''] + + atom = Atom( + [ + float(line_parsed[1]), + float(line_parsed[2]), + float(line_parsed[3]), + ] + ) + atom.element = line_parsed[0] + array[i] = atom + + return array + + + + else: + + raise ValueError( + "Trying to get_structure from empty MOL2File" + ) + + + + def set_structure(self, atoms): + """ + Set the :class:`AtomArray` for the file. + + Parameters + ---------- + array : AtomArray + The array to be saved into this file. + Must have an associated :class:`BondList`. + """ + + n_atoms = atoms.shape[0] + self.lines += [""] * n_atoms + + + for i, atom in enumerate(atoms): + line = " " + atom.element + line += " " + "{: .{}f}".format(atom.coord[0], 5) + line += " " + "{: .{}f}".format(atom.coord[1], 5) + line += " " + "{: .{}f}".format(atom.coord[2], 5) + line += " " + self.lines[i+2] = line + + diff --git a/src/biotite/structure/io/sdf/__init__.py b/src/biotite/structure/io/sdf/__init__.py new file mode 100644 index 000000000..2d6f11027 --- /dev/null +++ b/src/biotite/structure/io/sdf/__init__.py @@ -0,0 +1,18 @@ +# This source code is part of the Biotite package and is distributed +# under the 3-Clause BSD License. Please see 'LICENSE.rst' for further +# information. + +""" +The MOL format is used to depict atom positions and bonds for small +molecules. +This subpackage is used for reading and writing an :class:`AtomArray` +in this format. +Additionally, reading data from the SDF format, which is a wrapper +around MOL, is also supported. +""" + +__name__ = "biotite.structure.io.sdf" +__author__ = "Benjamin E. Mayer" + +from .file import * +from .convert import * diff --git a/src/biotite/structure/io/sdf/convert.py b/src/biotite/structure/io/sdf/convert.py new file mode 100644 index 000000000..5792ed55f --- /dev/null +++ b/src/biotite/structure/io/sdf/convert.py @@ -0,0 +1,49 @@ +# This source code is part of the Biotite package and is distributed +# under the 3-Clause BSD License. Please see 'LICENSE.rst' for further +# information. + +__name__ = "biotite.structure.io.sdf" +__author__ = "Benjamin E. Mayer" +__all__ = ["get_structure", "set_structure"] + + + +def get_structure(sdf_file): + """ + Get an :class:`AtomArray` from the SDF File. + + Ths function is a thin wrapper around + :meth:`SDFFile.get_structure()`. + + Parameters + ---------- + sdf_file : SDFFile + The SDF File. + + Returns + ------- + array : AtomArray + This :class:`AtomArray` contains the optional ``charge`` + annotation and has an associated :class:`BondList`. + All other annotation categories, except ``element`` are + empty. + """ + return sdf_file.get_structure() + + +def set_structure(sdf_file, atoms): + """ + Set the :class:`AtomArray` for the SDF File. + + Ths function is a thin wrapper around + :meth:`SDFFile.set_structure()`. + + Parameters + ---------- + sdf_file : SDFFile + The SDF File. + array : AtomArray + The array to be saved into this file. + Must have an associated :class:`BondList`. + """ + sdf_file.set_structure(atoms) diff --git a/src/biotite/structure/io/sdf/file.py b/src/biotite/structure/io/sdf/file.py new file mode 100644 index 000000000..f94bb3174 --- /dev/null +++ b/src/biotite/structure/io/sdf/file.py @@ -0,0 +1,174 @@ +# This source code is part of the Biotite package and is distributed +# under the 3-Clause BSD License. Please see 'LICENSE.rst' for further +# information. + +__name__ = "biotite.structure.io.sdf" +__author__ = "Benjamin E. Mayer" +__all__ = ["SDFFile"] + +import numpy as np +from ...atoms import AtomArray, Atom +from ....file import TextFile + + +# Number of header lines +N_HEADER = 2 + + +class SDFFile(TextFile): + """ + This class represents a file in SDF format, + + References + ---------- + + .. footbibliography:: + + Examples + -------- + + >>> from os.path import join + >>> mol_file = SDFFile.read(join(path_to_structures, "molecules", "BENZ.sdf")) + >>> atom_array = sdf_file.get_structure() + >>> print(atom_array) + 0 C 0.000 1.403 0.000 + 0 H 0.000 2.490 0.000 + 0 C -1.215 0.701 0.000 + 0 H -2.157 1.245 0.000 + 0 C -1.215 -0.701 0.000 + 0 H -2.157 -1.245 0.000 + 0 C 0.000 -1.403 0.000 + 0 H 0.000 -2.490 0.000 + 0 C 1.215 -0.701 0.000 + 0 H 2.157 -1.245 0.000 + 0 C 1.215 0.701 0.000 + 0 H 2.157 1.245 0.000 + + """ + + def __init__(self): + super().__init__() + # empty header lines + self.lines = [""] * N_HEADER + + def get_header(self): + """ + Get the header from the SDF file. + + Returns + ------- + mol_name : str + The name of the molecule. + initials : str + The author's initials. + program : str + The program name. + time : datetime + The time of file creation. + dimensions : str + Dimensional codes. + scaling_factors : str + Scaling factors. + energy : str + Energy from modeling program. + registry_number : str + MDL registry number. + comments : str + Additional comments. + """ + atom_number = int(self.lines[0].strip()) + mol_name = self.lines[1].strip() + return atom_number, mol_name + + + def set_header(self, mol_name): + """ + Set the header for the SDF file. + + Parameters + ---------- + mol_name : str + The name of the molecule. + + """ + + if(len(self.lines) > 2): + + self.lines[1] = str(mol_name) + "\n" + self.lines[0] = str(len(self.lines)-2)+ "\n" + + else: + raise ValueError( + "Can not set header of an empty SDFFile" + "Use set_structure first, so that number of atoms" + "can be derived from set structure" + ) + + + def get_structure(self): + """ + Get an :class:`AtomArray` from the SDF file. + + Returns + ------- + array : AtomArray + This :class:`AtomArray` contains the optional ``charge`` + annotation and has an associated :class:`BondList`. + All other annotation categories, except ``element`` are + empty. + """ + + if len(self.lines) > 2: + + + array = AtomArray(len(self.lines)-2) + + for i, line in enumerate(self.lines[2:]): + line_parsed = [x for x in line.strip().split(" ") if x!= ''] + + atom = Atom( + [ + float(line_parsed[1]), + float(line_parsed[2]), + float(line_parsed[3]), + ] + ) + atom.element = line_parsed[0] + array[i] = atom + + return array + + + + else: + + raise ValueError( + "Trying to get_structure from empty SDFFile" + ) + + + + def set_structure(self, atoms): + """ + Set the :class:`AtomArray` for the file. + + Parameters + ---------- + array : AtomArray + The array to be saved into this file. + Must have an associated :class:`BondList`. + """ + + n_atoms = atoms.shape[0] + self.lines += [""] * n_atoms + + + for i, atom in enumerate(atoms): + line = " " + atom.element + line += " " + "{: .{}f}".format(atom.coord[0], 5) + line += " " + "{: .{}f}".format(atom.coord[1], 5) + line += " " + "{: .{}f}".format(atom.coord[2], 5) + line += " " + self.lines[i+2] = line + + diff --git a/src/biotite/structure/io/trajfile.py b/src/biotite/structure/io/trajfile.py index 84b298e91..f925b7b23 100644 --- a/src/biotite/structure/io/trajfile.py +++ b/src/biotite/structure/io/trajfile.py @@ -616,4 +616,4 @@ def _read_chunk_wise(file, n_frames, step, atom_i, chunk_size, result[i] = None return tuple(result) else: - return None \ No newline at end of file + return None diff --git a/src/biotite/structure/io/xyz/__init__.py b/src/biotite/structure/io/xyz/__init__.py new file mode 100644 index 000000000..3867d24a7 --- /dev/null +++ b/src/biotite/structure/io/xyz/__init__.py @@ -0,0 +1,18 @@ +# This source code is part of the Biotite package and is distributed +# under the 3-Clause BSD License. Please see 'LICENSE.rst' for further +# information. + +""" +The MOL format is used to depict atom positions and bonds for small +molecules. +This subpackage is used for reading and writing an :class:`AtomArray` +in this format. +Additionally, reading data from the SDF format, which is a wrapper +around MOL, is also supported. +""" + +__name__ = "biotite.structure.io.xyz" +__author__ = "Benjamin E. Mayer" + +from .file import * +from .convert import * diff --git a/src/biotite/structure/io/xyz/convert.py b/src/biotite/structure/io/xyz/convert.py new file mode 100644 index 000000000..e0a90a8ce --- /dev/null +++ b/src/biotite/structure/io/xyz/convert.py @@ -0,0 +1,49 @@ +# This source code is part of the Biotite package and is distributed +# under the 3-Clause BSD License. Please see 'LICENSE.rst' for further +# information. + +__name__ = "biotite.structure.io.xyz" +__author__ = "Benjamin E. Mayer" +__all__ = ["get_structure", "set_structure"] + + + +def get_structure(xyz_file): + """ + Get an :class:`AtomArray` from the XYZ File. + + Ths function is a thin wrapper around + :meth:`XYZFile.get_structure()`. + + Parameters + ---------- + xyz_file : XYZFile + The XYZ File. + + Returns + ------- + array : AtomArray + This :class:`AtomArray` contains the optional ``charge`` + annotation and has an associated :class:`BondList`. + All other annotation categories, except ``element`` are + empty. + """ + return xyz_file.get_structure() + + +def set_structure(xyz_file, atoms): + """ + Set the :class:`AtomArray` for the XYZ File. + + Ths function is a thin wrapper around + :meth:`XYZFile.set_structure()`. + + Parameters + ---------- + xyz_file : XYZFile + The XYZ File. + array : AtomArray + The array to be saved into this file. + Must have an associated :class:`BondList`. + """ + xyz_file.set_structure(atoms) diff --git a/src/biotite/structure/io/xyz/file.py b/src/biotite/structure/io/xyz/file.py new file mode 100644 index 000000000..942e46680 --- /dev/null +++ b/src/biotite/structure/io/xyz/file.py @@ -0,0 +1,174 @@ +# This source code is part of the Biotite package and is distributed +# under the 3-Clause BSD License. Please see 'LICENSE.rst' for further +# information. + +__name__ = "biotite.structure.io.xyz" +__author__ = "Benjamin E. Mayer" +__all__ = ["XYZFile"] + +import numpy as np +from ...atoms import AtomArray, Atom +from ....file import TextFile + + +# Number of header lines +N_HEADER = 2 + + +class XYZFile(TextFile): + """ + This class represents a file in XYZ format, + + References + ---------- + + .. footbibliography:: + + Examples + -------- + + >>> from os.path import join + >>> mol_file = XYZFile.read(join(path_to_structures, "molecules", "BENZ.xyz")) + >>> atom_array = xyz_file.get_structure() + >>> print(atom_array) + 0 C 0.000 1.403 0.000 + 0 H 0.000 2.490 0.000 + 0 C -1.215 0.701 0.000 + 0 H -2.157 1.245 0.000 + 0 C -1.215 -0.701 0.000 + 0 H -2.157 -1.245 0.000 + 0 C 0.000 -1.403 0.000 + 0 H 0.000 -2.490 0.000 + 0 C 1.215 -0.701 0.000 + 0 H 2.157 -1.245 0.000 + 0 C 1.215 0.701 0.000 + 0 H 2.157 1.245 0.000 + + """ + + def __init__(self): + super().__init__() + # empty header lines + self.lines = [""] * N_HEADER + + def get_header(self): + """ + Get the header from the XYZ file. + + Returns + ------- + mol_name : str + The name of the molecule. + initials : str + The author's initials. + program : str + The program name. + time : datetime + The time of file creation. + dimensions : str + Dimensional codes. + scaling_factors : str + Scaling factors. + energy : str + Energy from modeling program. + registry_number : str + MDL registry number. + comments : str + Additional comments. + """ + atom_number = int(self.lines[0].strip()) + mol_name = self.lines[1].strip() + return atom_number, mol_name + + + def set_header(self, mol_name): + """ + Set the header for the XYZ file. + + Parameters + ---------- + mol_name : str + The name of the molecule. + + """ + + if(len(self.lines) > 2): + + self.lines[1] = str(mol_name) + "\n" + self.lines[0] = str(len(self.lines)-2)+ "\n" + + else: + raise ValueError( + "Can not set header of an empty XYZFile" + "Use set_structure first, so that number of atoms" + "can be derived from set structure" + ) + + + def get_structure(self): + """ + Get an :class:`AtomArray` from the XYZ file. + + Returns + ------- + array : AtomArray + This :class:`AtomArray` contains the optional ``charge`` + annotation and has an associated :class:`BondList`. + All other annotation categories, except ``element`` are + empty. + """ + + if len(self.lines) > 2: + + + array = AtomArray(len(self.lines)-2) + + for i, line in enumerate(self.lines[2:]): + line_parsed = [x for x in line.strip().split(" ") if x!= ''] + + atom = Atom( + [ + float(line_parsed[1]), + float(line_parsed[2]), + float(line_parsed[3]), + ] + ) + atom.element = line_parsed[0] + array[i] = atom + + return array + + + + else: + + raise ValueError( + "Trying to get_structure from empty XYZFile" + ) + + + + def set_structure(self, atoms): + """ + Set the :class:`AtomArray` for the file. + + Parameters + ---------- + array : AtomArray + The array to be saved into this file. + Must have an associated :class:`BondList`. + """ + + n_atoms = atoms.shape[0] + self.lines += [""] * n_atoms + + + for i, atom in enumerate(atoms): + line = " " + atom.element + line += " " + "{: .{}f}".format(atom.coord[0], 5) + line += " " + "{: .{}f}".format(atom.coord[1], 5) + line += " " + "{: .{}f}".format(atom.coord[2], 5) + line += " " + self.lines[i+2] = line + + diff --git a/tests/structure/data/molecules/BENZ.xyz b/tests/structure/data/molecules/BENZ.xyz new file mode 100644 index 000000000..440886d5e --- /dev/null +++ b/tests/structure/data/molecules/BENZ.xyz @@ -0,0 +1,14 @@ +12 +benzene example + C 0.00000 1.40272 0.00000 + H 0.00000 2.49029 0.00000 + C -1.21479 0.70136 0.00000 + H -2.15666 1.24515 0.00000 + C -1.21479 -0.70136 0.00000 + H -2.15666 -1.24515 0.00000 + C 0.00000 -1.40272 0.00000 + H 0.00000 -2.49029 0.00000 + C 1.21479 -0.70136 0.00000 + H 2.15666 -1.24515 0.00000 + C 1.21479 0.70136 0.00000 + H 2.15666 1.24515 0.00000 diff --git a/tests/structure/test_mol2.py b/tests/structure/test_mol2.py new file mode 100644 index 000000000..74ed48b08 --- /dev/null +++ b/tests/structure/test_mol2.py @@ -0,0 +1,51 @@ +# This source code is part of the Biotite package and is distributed +# under the 3-Clause BSD License. Please see 'LICENSE.rst' for further +# information. + +import warnings +from tempfile import TemporaryFile +import glob +from os.path import join +import pytest +import numpy as np +import biotite.structure as struc +import biotite.structure.io.mol2 as mol2 +import biotite.structure.io.pdbx as pdbx +from ..util import data_dir + + +@pytest.mark.parametrize( + "path", glob.glob(join(data_dir("structure"), "*.cif")) +) +def test_array_conversion(path): + pdbx_file = pdbx.PDBxFile.read(path) + ref_structure = pdbx.get_structure( + pdbx_file, model=1, extra_fields=["charge"] + ) + ref_structure.bonds = struc.connect_via_residue_names(ref_structure) + + mol2_file = mol2.MOL2File() + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + # Ignore warnings about atoms not parametrized s + mask = mol2.set_structure(mol2_file, ref_structure) + ref_structure = ref_structure[mask] + temp = TemporaryFile("r+") + mol2_file.write(temp) + + temp.seek(0) + mol2_file = mol2.MOL2File.read(temp) + test_structure = mol2.get_structure(mol2_file, model=1) + temp.close() + + assert np.allclose(test_structure.coord, ref_structure.coord) + for category in test_structure.get_annotation_categories(): + + try: + assert np.array_equal( + test_structure.get_annotation(category), + ref_structure.get_annotation(category) + ) + except AssertionError: + print(f"Inequality in '{category}' category") + raise diff --git a/tests/structure/test_sdf.py b/tests/structure/test_sdf.py new file mode 100644 index 000000000..3f8887393 --- /dev/null +++ b/tests/structure/test_sdf.py @@ -0,0 +1,51 @@ +# This source code is part of the Biotite package and is distributed +# under the 3-Clause BSD License. Please see 'LICENSE.rst' for further +# information. + +import warnings +from tempfile import TemporaryFile +import glob +from os.path import join +import pytest +import numpy as np +import biotite.structure as struc +import biotite.structure.io.sdf as sdf +import biotite.structure.io.pdbx as pdbx +from ..util import data_dir + + +@pytest.mark.parametrize( + "path", glob.glob(join(data_dir("structure"), "*.cif")) +) +def test_array_conversion(path): + pdbx_file = pdbx.PDBxFile.read(path) + ref_structure = pdbx.get_structure( + pdbx_file, model=1, extra_fields=["charge"] + ) + ref_structure.bonds = struc.connect_via_residue_names(ref_structure) + + sdf_file = sdf.SDFFile() + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + # Ignore warnings about atoms not parametrized s + mask = sdf.set_structure(sdf_file, ref_structure) + ref_structure = ref_structure[mask] + temp = TemporaryFile("r+") + sdf_file.write(temp) + + temp.seek(0) + sdf_file = sdf.SDFFile.read(temp) + test_structure = sdf.get_structure(sdf_file, model=1) + temp.close() + + assert np.allclose(test_structure.coord, ref_structure.coord) + for category in test_structure.get_annotation_categories(): + + try: + assert np.array_equal( + test_structure.get_annotation(category), + ref_structure.get_annotation(category) + ) + except AssertionError: + print(f"Inequality in '{category}' category") + raise diff --git a/tests/structure/test_xyz.py b/tests/structure/test_xyz.py new file mode 100644 index 000000000..9c6bf4dc4 --- /dev/null +++ b/tests/structure/test_xyz.py @@ -0,0 +1,51 @@ +# This source code is part of the Biotite package and is distributed +# under the 3-Clause BSD License. Please see 'LICENSE.rst' for further +# information. + +import warnings +from tempfile import TemporaryFile +import glob +from os.path import join +import pytest +import numpy as np +import biotite.structure as struc +import biotite.structure.io.xyz as xyz +import biotite.structure.io.pdbx as pdbx +from ..util import data_dir + + +@pytest.mark.parametrize( + "path", glob.glob(join(data_dir("structure"), "*.cif")) +) +def test_array_conversion(path): + pdbx_file = pdbx.PDBxFile.read(path) + ref_structure = pdbx.get_structure( + pdbx_file, model=1, extra_fields=["charge"] + ) + ref_structure.bonds = struc.connect_via_residue_names(ref_structure) + + xyz_file = xyz.XYZFile() + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + # Ignore warnings about atoms not parametrized s + mask = xyz.set_structure(xyz_file, ref_structure) + ref_structure = ref_structure[mask] + temp = TemporaryFile("r+") + xyz_file.write(temp) + + temp.seek(0) + xyz_file = xyz.XYZFile.read(temp) + test_structure = xyz.get_structure(xyz_file, model=1) + temp.close() + + assert np.allclose(test_structure.coord, ref_structure.coord) + for category in test_structure.get_annotation_categories(): + + try: + assert np.array_equal( + test_structure.get_annotation(category), + ref_structure.get_annotation(category) + ) + except AssertionError: + print(f"Inequality in '{category}' category") + raise From b0b811d4d4671a64c8412b7c3b8a857124fbd635 Mon Sep 17 00:00:00 2001 From: Benjamin Mayer Date: Thu, 25 Aug 2022 02:29:56 +0200 Subject: [PATCH 02/37] XYZFile get_structure so far working (yet tests are not passing ...) --- tests/structure/data/molecules/CO2.xyz | 30 ++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 tests/structure/data/molecules/CO2.xyz diff --git a/tests/structure/data/molecules/CO2.xyz b/tests/structure/data/molecules/CO2.xyz new file mode 100644 index 000000000..5ea419a11 --- /dev/null +++ b/tests/structure/data/molecules/CO2.xyz @@ -0,0 +1,30 @@ +3 + 0 + C 0.000000 0.000000 0.000000 + O 0.000000 0.000000 1.159076 + O 0.000000 0.000000 -1.159076 +3 + 1 + C 0.000000 0.000000 0.000000 + O 0.000000 0.000000 1.200000 + O 0.000000 0.000000 -1.159076 +3 + 2 + C 0.000000 0.000000 0.000000 + O 0.000000 0.000000 1.300000 + O 0.000000 0.000000 -1.159076 +3 + 3 + C 0.000000 0.000000 0.000000 + O 0.000000 0.000000 1.400000 + O 0.000000 0.000000 -1.159076 +3 + 4 + C 0.000000 0.000000 0.000000 + O 0.000000 0.000000 1.500000 + O 0.000000 0.000000 -1.159076 +3 + 5 + C 0.000000 0.000000 0.000000 + O 0.000000 0.000000 1.600000 + O 0.000000 0.000000 -1.159076 From a1e069980afb620102ed5362bfe582354e10678c Mon Sep 17 00:00:00 2001 From: Benjamin Mayer Date: Fri, 26 Aug 2022 16:49:09 +0200 Subject: [PATCH 03/37] xyz file working with reading multiple models --- notes_ben.txt | 9 - src/biotite/structure/io/xyz/convert.py | 4 +- src/biotite/structure/io/xyz/file.py | 259 +++++++++++++++++++----- tests/structure/test_mol2.py | 51 ----- tests/structure/test_sdf.py | 51 ----- tests/structure/test_xyz.py | 143 ++++++++++--- 6 files changed, 323 insertions(+), 194 deletions(-) delete mode 100644 notes_ben.txt delete mode 100644 tests/structure/test_mol2.py delete mode 100644 tests/structure/test_sdf.py diff --git a/notes_ben.txt b/notes_ben.txt deleted file mode 100644 index 5ebb87617..000000000 --- a/notes_ben.txt +++ /dev/null @@ -1,9 +0,0 @@ -import biotite.structure.io as strucio -from biotite.structure.io.xyz import XYZFile -from biotite.structure.io.mol import MOLFile -benz_mol = MOLFile.read("/home/mayer/Downloads/benzene-3D-structure-CT1001419667.sdf") -benz_xyz = XYZFile() -benz_struct=benz_mol.get_structure() -benz_xyz.set_structure(benz_struct) -print(benz_xyz) -benz_xyz_example = strucio.load_structure("/home/mayer/Dev/biotite/tests/structure/data/molecules/BENZ.xyz") diff --git a/src/biotite/structure/io/xyz/convert.py b/src/biotite/structure/io/xyz/convert.py index e0a90a8ce..2b29d853d 100644 --- a/src/biotite/structure/io/xyz/convert.py +++ b/src/biotite/structure/io/xyz/convert.py @@ -8,7 +8,7 @@ -def get_structure(xyz_file): +def get_structure(xyz_file, model=None): """ Get an :class:`AtomArray` from the XYZ File. @@ -28,7 +28,7 @@ def get_structure(xyz_file): All other annotation categories, except ``element`` are empty. """ - return xyz_file.get_structure() + return xyz_file.get_structure(model) def set_structure(xyz_file, atoms): diff --git a/src/biotite/structure/io/xyz/file.py b/src/biotite/structure/io/xyz/file.py index 942e46680..a8f3bb6c0 100644 --- a/src/biotite/structure/io/xyz/file.py +++ b/src/biotite/structure/io/xyz/file.py @@ -7,7 +7,8 @@ __all__ = ["XYZFile"] import numpy as np -from ...atoms import AtomArray, Atom +from ...atoms import AtomArray, AtomArrayStack, Atom +import biotite.structure as struc from ....file import TextFile @@ -50,35 +51,82 @@ def __init__(self): super().__init__() # empty header lines self.lines = [""] * N_HEADER + self.mol_names = None + self.atom_numbers = None + self.model_start_inds = None + self.structures = None + + def update_start_lines(self): + + # Line indices where a new model starts -> where number of atoms + # is written down as number + + self.model_start_inds = np.array( + [i for i in range(len(self.lines)) + if self.lines[i].strip().isdigit()], + dtype=int + ) +# +# print(" ... pre processing ... ") +# print("|model_start_inds| :: " + str(self.model_start_inds)) + + if self.model_start_inds.shape[0] > 1: + # if the mol name line only contains an integer + # these lines will appear in model_start_inds + # if calculated as above, therfore we purge all + # indices that have a distance of 1 to their previous index + # (this will not work with a file containing multiple models + # with solely one coordinate / atom per model ) + self.model_start_inds = self.model_start_inds[ + np.concatenate( + ( + np.array([0],dtype=int), + np.where( + self.model_start_inds[:-1] + - + self.model_start_inds[1:] + != + -1 + )[0]+1 + ) + ) + ] + elif self.model_start_inds.shape[0] == 2: + self.model_start_inds = self.model_start_inds[:1] + + def get_header(self, model=None): - def get_header(self): """ Get the header from the XYZ file. Returns ------- + atom_number: int + The number of atoms per model mol_name : str - The name of the molecule. - initials : str - The author's initials. - program : str - The program name. - time : datetime - The time of file creation. - dimensions : str - Dimensional codes. - scaling_factors : str - Scaling factors. - energy : str - Energy from modeling program. - registry_number : str - MDL registry number. - comments : str - Additional comments. + The name of the molecule or the names of the multiple models """ - atom_number = int(self.lines[0].strip()) - mol_name = self.lines[1].strip() - return atom_number, mol_name + + # Line indices where a new model starts -> where number of atoms + # is written down as number + self.update_start_lines() + + # parse all atom_numbers into integers + if self.atom_numbers is None: + self.atom_numbers = [ + int( + self.lines[i].strip().strip(" ") + ) for i in self.model_start_inds + ] + + # parse all lines containing names + if self.mol_names is None: + self.mol_names = [ + self.lines[i+1].strip() for i in self.model_start_inds + ] + + + return self.atom_numbers, self.mol_names def set_header(self, mol_name): @@ -94,8 +142,13 @@ def set_header(self, mol_name): if(len(self.lines) > 2): - self.lines[1] = str(mol_name) + "\n" - self.lines[0] = str(len(self.lines)-2)+ "\n" + self.lines[1] = str(mol_name) + self.lines[0] = str(len(self.lines)-2) + + self.mol_names = [mol_name] + self.atom_numbers = [int(self.lines[0])] + + self.update_start_lines() else: raise ValueError( @@ -105,46 +158,141 @@ def set_header(self, mol_name): ) - def get_structure(self): + def get_structure(self, model=None): """ - Get an :class:`AtomArray` from the XYZ file. + Get an :class:`AtomArray` or :class:`AtomArrayStack` from the XYZ file. + + Parameters + ---------- + model : int, optional + If this parameter is given, the function will return an + :class:`AtomArray` from the atoms corresponding to the given + model number (starting at 1). + Negative values are used to index models starting from the + last model insted of the first model. + If this parameter is omitted, an :class:`AtomArrayStack` + containing all models will be returned, even if the + structure contains only one model. Returns ------- - array : AtomArray - This :class:`AtomArray` contains the optional ``charge`` - annotation and has an associated :class:`BondList`. - All other annotation categories, except ``element`` are - empty. - """ - - if len(self.lines) > 2: - + array : AtomArray or AtomArrayStack + The return type depends on the `model` parameter. + """ - array = AtomArray(len(self.lines)-2) + if len(self.lines) <= 2: + raise ValueError( + "Trying to get_structure from empty XYZFile" + ) + + atom_number, names = self.get_header() +# print("atom_numbers :: " + str(atom_number) + " :: " +str(len(atom_number))) +# print("names :: " + str(names)+ " :: " +str(len(names))) +# + # set a default head if non present since + # the number of lines will be calculated from the number + # of atoms field in the file (counts how many lines with numbers + # there are within the file which are not name lines) + if len(names) == 0 or len(atom_number) == 0: +# print("self.set_header('[MOLNAME]')") + self.set_header("[MOLNAME]") +# print(self.lines) + + self.update_start_lines() + + + # parse all atom_numbers into integers + if self.atom_numbers is None: + self.atom_numbers = [ + int( + self.lines[i].strip().strip(" ") + ) for i in self.model_start_inds + ] + + # parse all lines containing names + if self.mol_names is None: + self.mol_names = [ + self.lines[i+1].strip() for i in self.model_start_inds + ] + + + # parse all coordinates + if self.structures is None: - for i, line in enumerate(self.lines[2:]): - line_parsed = [x for x in line.strip().split(" ") if x!= ''] + + + array_stack = [] + +# print("|model_start_inds| :: " + str(self.model_start_inds)) +# print(self.atom_numbers) +# print("") + + for i, ind in enumerate(self.model_start_inds): + ind_end = ind+2 + self.atom_numbers[i] +# print("self.lines ::") +# print(self.lines) +# print("") +# print("ind :: " +str(ind)) +# print("ind_end :: " +str(ind_end)) + lines_cut = self.lines[ind:ind_end] +# print("lines_cut ::") +# print("") +# print(lines_cut) + array = AtomArray(self.atom_numbers[i]) +# print("empty array ::") +# print(array) + + if self.atom_numbers[i]+2 != len(lines_cut): + raise ValueError( + "Number of Atoms not matching with coordinate lines" + + "" + + " atom_number :: " + str(self.atom_numbers[i]) + + "" + + "" + + " |lines_cut| :: " + str(len(lines_cut)) + + " lines_cut :: " + str(lines_cut) + ) - atom = Atom( - [ - float(line_parsed[1]), - float(line_parsed[2]), - float(line_parsed[3]), + for j, line in enumerate(lines_cut[2:]): +# print(line) + line_parsed = [ + x for x in line.strip().split(" ") if x!= '' ] - ) - atom.element = line_parsed[0] - array[i] = atom + + x = float(line_parsed[1]) + y = float(line_parsed[2]) + z = float(line_parsed[3]) + + if np.isnan(x) or np.isnan(y) or np.isnan(z): + + raise ValueError( + "At least one of the coordinates is NaN" + "" + "(" + str(x) + "," + str(y) + "," +str(z) + ")" + "" + ) + + atom = Atom([x,y,z]) + atom.element = line_parsed[0] + array[j] = atom + + + +# print("filled array ::") +# print(array) - return array + array_stack.append(array) + self.structures = struc.stack(array_stack) + + - - else: + - raise ValueError( - "Trying to get_structure from empty XYZFile" - ) + if model is None: + return self.structures + else: + return self.structures[model] @@ -162,9 +310,14 @@ def set_structure(self, atoms): n_atoms = atoms.shape[0] self.lines += [""] * n_atoms +# print(" trying atoms :: ") +# print(atoms) +# print() + for i, atom in enumerate(atoms): - line = " " + atom.element + line = " " + str(atom.element) + #print(atom.coord) line += " " + "{: .{}f}".format(atom.coord[0], 5) line += " " + "{: .{}f}".format(atom.coord[1], 5) line += " " + "{: .{}f}".format(atom.coord[2], 5) diff --git a/tests/structure/test_mol2.py b/tests/structure/test_mol2.py deleted file mode 100644 index 74ed48b08..000000000 --- a/tests/structure/test_mol2.py +++ /dev/null @@ -1,51 +0,0 @@ -# This source code is part of the Biotite package and is distributed -# under the 3-Clause BSD License. Please see 'LICENSE.rst' for further -# information. - -import warnings -from tempfile import TemporaryFile -import glob -from os.path import join -import pytest -import numpy as np -import biotite.structure as struc -import biotite.structure.io.mol2 as mol2 -import biotite.structure.io.pdbx as pdbx -from ..util import data_dir - - -@pytest.mark.parametrize( - "path", glob.glob(join(data_dir("structure"), "*.cif")) -) -def test_array_conversion(path): - pdbx_file = pdbx.PDBxFile.read(path) - ref_structure = pdbx.get_structure( - pdbx_file, model=1, extra_fields=["charge"] - ) - ref_structure.bonds = struc.connect_via_residue_names(ref_structure) - - mol2_file = mol2.MOL2File() - with warnings.catch_warnings(): - warnings.simplefilter("ignore") - # Ignore warnings about atoms not parametrized s - mask = mol2.set_structure(mol2_file, ref_structure) - ref_structure = ref_structure[mask] - temp = TemporaryFile("r+") - mol2_file.write(temp) - - temp.seek(0) - mol2_file = mol2.MOL2File.read(temp) - test_structure = mol2.get_structure(mol2_file, model=1) - temp.close() - - assert np.allclose(test_structure.coord, ref_structure.coord) - for category in test_structure.get_annotation_categories(): - - try: - assert np.array_equal( - test_structure.get_annotation(category), - ref_structure.get_annotation(category) - ) - except AssertionError: - print(f"Inequality in '{category}' category") - raise diff --git a/tests/structure/test_sdf.py b/tests/structure/test_sdf.py deleted file mode 100644 index 3f8887393..000000000 --- a/tests/structure/test_sdf.py +++ /dev/null @@ -1,51 +0,0 @@ -# This source code is part of the Biotite package and is distributed -# under the 3-Clause BSD License. Please see 'LICENSE.rst' for further -# information. - -import warnings -from tempfile import TemporaryFile -import glob -from os.path import join -import pytest -import numpy as np -import biotite.structure as struc -import biotite.structure.io.sdf as sdf -import biotite.structure.io.pdbx as pdbx -from ..util import data_dir - - -@pytest.mark.parametrize( - "path", glob.glob(join(data_dir("structure"), "*.cif")) -) -def test_array_conversion(path): - pdbx_file = pdbx.PDBxFile.read(path) - ref_structure = pdbx.get_structure( - pdbx_file, model=1, extra_fields=["charge"] - ) - ref_structure.bonds = struc.connect_via_residue_names(ref_structure) - - sdf_file = sdf.SDFFile() - with warnings.catch_warnings(): - warnings.simplefilter("ignore") - # Ignore warnings about atoms not parametrized s - mask = sdf.set_structure(sdf_file, ref_structure) - ref_structure = ref_structure[mask] - temp = TemporaryFile("r+") - sdf_file.write(temp) - - temp.seek(0) - sdf_file = sdf.SDFFile.read(temp) - test_structure = sdf.get_structure(sdf_file, model=1) - temp.close() - - assert np.allclose(test_structure.coord, ref_structure.coord) - for category in test_structure.get_annotation_categories(): - - try: - assert np.array_equal( - test_structure.get_annotation(category), - ref_structure.get_annotation(category) - ) - except AssertionError: - print(f"Inequality in '{category}' category") - raise diff --git a/tests/structure/test_xyz.py b/tests/structure/test_xyz.py index 9c6bf4dc4..183cf87be 100644 --- a/tests/structure/test_xyz.py +++ b/tests/structure/test_xyz.py @@ -2,50 +2,137 @@ # under the 3-Clause BSD License. Please see 'LICENSE.rst' for further # information. -import warnings +import itertools +import datetime from tempfile import TemporaryFile import glob -from os.path import join +from os.path import join, split, splitext import pytest import numpy as np import biotite.structure as struc +from biotite.structure import Atom +import biotite.structure.info as info import biotite.structure.io.xyz as xyz -import biotite.structure.io.pdbx as pdbx from ..util import data_dir +def draw_random_struct(N_atoms): + + return struc.array( + [ + Atom( + [ + float(np.random.rand()) for _ in range(3) + ], + element="C" + ) for _ in range(N_atoms) + ] + ) + + +def test_header_conversion(): + """ + Write known example data to the header of a xyz file and expect + to retrieve the same information when reading the file again. + """ + ref_names = ( + "Testxyz", "JD", "Biotite", + str(datetime.datetime.now().replace(second=0, microsecond=0)), + "3D", "Lorem", "Ipsum", "123", "Lorem ipsum dolor sit amet" + ) + + # draw this many random Atoms for structure + # necessary as header should only exist for a non empty XYZFile + N_sample = 10 + + for name in ref_names: + + xyz_file = xyz.XYZFile() + xyz_file.set_structure(draw_random_struct(N_sample)) + xyz_file.set_header(name) + print(xyz_file) + temp = TemporaryFile("w+") + xyz_file.write(temp) + + temp.seek(0) + xyz_file = xyz.XYZFile.read(temp) + atom_numbers, mol_names = xyz_file.get_header() + + temp.close() + + assert mol_names[0] == name + assert atom_numbers[0] == N_sample + + @pytest.mark.parametrize( - "path", glob.glob(join(data_dir("structure"), "*.cif")) + "path", + [x for x in glob.glob(join(data_dir("structure"), "molecules", "*.xyz")) if "CO" not in x], ) -def test_array_conversion(path): - pdbx_file = pdbx.PDBxFile.read(path) - ref_structure = pdbx.get_structure( - pdbx_file, model=1, extra_fields=["charge"] - ) - ref_structure.bonds = struc.connect_via_residue_names(ref_structure) +def test_structure_conversion(path): + """ + After reading a xyz file, writing the structure back to a new file + and reading it again should give the same structure. + + In this case an SDF file is used, but it is compatible with the + xyz format. + """ + xyz_file = xyz.XYZFile.read(path) + + + + ref_atoms = xyz.get_structure(xyz_file) + xyz_file = xyz.XYZFile() - with warnings.catch_warnings(): - warnings.simplefilter("ignore") - # Ignore warnings about atoms not parametrized s - mask = xyz.set_structure(xyz_file, ref_structure) - ref_structure = ref_structure[mask] - temp = TemporaryFile("r+") + xyz.set_structure(xyz_file, ref_atoms[0]) + temp = TemporaryFile("w+") xyz_file.write(temp) temp.seek(0) xyz_file = xyz.XYZFile.read(temp) - test_structure = xyz.get_structure(xyz_file, model=1) + test_atoms = xyz.get_structure(xyz_file) temp.close() + + print("test_atoms ::") + print(test_atoms) + print("") + print("") + print("") + + print("ref_atoms ::") + print(ref_atoms) + print("") + print("") + print("") + + assert test_atoms == ref_atoms + + +#@pytest.mark.parametrize( +# "path", glob.glob(join(data_dir("structure"), "xyzecules", "*.sdf")), +#) +#def test_pdbx_consistency(path): +# """ +# Check if the structure parsed from a xyz file is equal to the same +# structure read from the *Chemical Component Dictionary* in PDBx +# format. + +# In this case an SDF file is used, but it is compatible with the +# xyz format. +# """ +# xyz_name = split(splitext(path)[0])[1] +# ref_atoms = info.residue(xyz_name) +# # The CCD contains information about aromatic bond types, +# # but the SDF test files do not +# ref_atoms.bonds.remove_aromaticity() + +# xyz_file = xyz.XYZFile.read(path) +# test_atoms = xyz_file.get_structure() - assert np.allclose(test_structure.coord, ref_structure.coord) - for category in test_structure.get_annotation_categories(): - - try: - assert np.array_equal( - test_structure.get_annotation(category), - ref_structure.get_annotation(category) - ) - except AssertionError: - print(f"Inequality in '{category}' category") - raise +# assert test_atoms.coord.shape == ref_atoms.coord.shape +# assert test_atoms.coord.flatten().tolist() \ +# == ref_atoms.coord.flatten().tolist() +# assert test_atoms.element.tolist() == ref_atoms.element.tolist() +# assert test_atoms.charge.tolist() == ref_atoms.charge.tolist() +# assert set(tuple(bond) for bond in test_atoms.bonds.as_array()) \ +# == set(tuple(bond) for bond in ref_atoms.bonds.as_array()) From 68ca7495808e92bc64017277aa9b231fd900aa1c Mon Sep 17 00:00:00 2001 From: Benjamin Mayer Date: Fri, 26 Aug 2022 17:51:46 +0200 Subject: [PATCH 04/37] XYZFile finally fully working with tests --- src/biotite/structure/io/xyz/convert.py | 10 +-- src/biotite/structure/io/xyz/file.py | 55 ++++++++++----- .../data/molecules/paulbourkeDOTnet.xyz | 49 +++++++++++++ tests/structure/test_xyz.py | 68 ++++++------------- 4 files changed, 114 insertions(+), 68 deletions(-) create mode 100644 tests/structure/data/molecules/paulbourkeDOTnet.xyz diff --git a/src/biotite/structure/io/xyz/convert.py b/src/biotite/structure/io/xyz/convert.py index 2b29d853d..dd90615cc 100644 --- a/src/biotite/structure/io/xyz/convert.py +++ b/src/biotite/structure/io/xyz/convert.py @@ -33,7 +33,8 @@ def get_structure(xyz_file, model=None): def set_structure(xyz_file, atoms): """ - Set the :class:`AtomArray` for the XYZ File. + Set the :class:`AtomArray` for the XYZ File + or :class:`AtomArrayStack for a XYZ File with multiple states. Ths function is a thin wrapper around :meth:`XYZFile.set_structure()`. @@ -42,8 +43,9 @@ def set_structure(xyz_file, atoms): ---------- xyz_file : XYZFile The XYZ File. - array : AtomArray - The array to be saved into this file. - Must have an associated :class:`BondList`. + array : AtomArray or AtomArrayStack + The array to be saved into this file. If a stack is given, each array in + the stack will be in a separate model and the names of the + model will be set to an index enumerating them. """ xyz_file.set_structure(atoms) diff --git a/src/biotite/structure/io/xyz/file.py b/src/biotite/structure/io/xyz/file.py index a8f3bb6c0..8aa4961d4 100644 --- a/src/biotite/structure/io/xyz/file.py +++ b/src/biotite/structure/io/xyz/file.py @@ -302,26 +302,47 @@ def set_structure(self, atoms): Parameters ---------- - array : AtomArray + atoms : AtomArray The array to be saved into this file. - Must have an associated :class:`BondList`. """ - n_atoms = atoms.shape[0] - self.lines += [""] * n_atoms + if isinstance(atoms, AtomArray): -# print(" trying atoms :: ") -# print(atoms) -# print() - - - for i, atom in enumerate(atoms): - line = " " + str(atom.element) - #print(atom.coord) - line += " " + "{: .{}f}".format(atom.coord[0], 5) - line += " " + "{: .{}f}".format(atom.coord[1], 5) - line += " " + "{: .{}f}".format(atom.coord[2], 5) - line += " " - self.lines[i+2] = line + n_atoms = atoms.shape[0] + self.lines[0] = str(n_atoms) + if len(self.lines[1]) == 0: + self.lines[1] = str("[MOLNAME]") + self.lines += [""] * n_atoms + + + for i, atom in enumerate(atoms): + line = " " + str(atom.element) + #print(atom.coord) + line += " " + "{: .{}f}".format(atom.coord[0], 5) + line += " " + "{: .{}f}".format(atom.coord[1], 5) + line += " " + "{: .{}f}".format(atom.coord[2], 5) + line += " " + self.lines[i+2] = line + + elif isinstance(atoms, AtomArrayStack): + n_lines_per_model = atoms[0].shape[0]+2 + + + self.lines += [""] * n_lines_per_model*atoms.shape[0] + + for i, atoms_i in enumerate(atoms): + + self.lines[i*n_lines_per_model] = str(atoms[0].shape[0]) + self.lines[i*n_lines_per_model+1] = " " + str(i) + + for j, atom in enumerate(atoms_i): + line = " " + str(atom.element) + #print(atom.coord) + line += " " + "{: .{}f}".format(atom.coord[0], 5) + line += " " + "{: .{}f}".format(atom.coord[1], 5) + line += " " + "{: .{}f}".format(atom.coord[2], 5) + line += " " + self.lines[i*n_lines_per_model+j+2] = line + diff --git a/tests/structure/data/molecules/paulbourkeDOTnet.xyz b/tests/structure/data/molecules/paulbourkeDOTnet.xyz new file mode 100644 index 000000000..1e83ee9b3 --- /dev/null +++ b/tests/structure/data/molecules/paulbourkeDOTnet.xyz @@ -0,0 +1,49 @@ +47 +xyz File randomly downloaded from http://paulbourke.net/dataformats/xyz/ +H -1.14937 -3.04328 -3.67266 +C -0.34354 -2.64179 -3.04915 +C 1.70961 -1.65418 -1.47979 +C -0.60766 -1.56214 -2.20086 +C 0.92269 -3.21090 -3.10934 +C 1.96759 -2.72261 -2.32098 +C 0.42293 -1.07194 -1.42089 +H -1.60973 -1.12145 -2.15064 +H 1.10566 -4.05612 -3.78129 +H 2.96477 -3.17298 -2.36242 +H 1.83912 1.62859 1.58965 +C 2.58144 -0.95071 -0.54135 +C 3.75749 0.63359 1.39456 +C 1.83367 0.06956 0.09322 +C 3.90949 -1.16740 -0.21924 +C 4.49358 -0.35755 0.75785 +C 2.41546 0.85640 1.06981 +H 4.22900 1.24681 2.16992 +H 4.48209 -1.95974 -0.71231 +H 5.54258 -0.51492 1.03005 +C 0.41263 0.08890 -0.44036 +C -0.00556 1.40901 -1.16296 +C -0.63464 -0.05891 0.64344 +C -1.47378 0.99799 0.68064 +C -0.68372 -1.24894 1.52606 +C -2.59805 1.24208 1.62903 +N -1.23204 3.29961 -0.01051 +H -0.42261 1.15524 -2.17274 +N -1.18662 1.95036 -0.37375 +C 1.08189 2.40346 -1.37512 +C -0.30043 4.12637 -0.38410 +C 0.91564 3.69413 -1.05765 +H 2.00908 2.02137 -1.81810 +H -0.45447 5.18029 -0.12432 +H 1.68550 4.44722 -1.25358 +O 0.15946 -1.63921 2.30422 +O -1.85645 -1.94582 1.38988 +O -2.50683 1.63964 2.76815 +O -3.90254 1.00262 1.31638 +C -2.05174 -3.09560 2.18550 +C -4.22748 0.53549 0.02760 +H -3.61380 -0.32008 -0.27896 +H -4.14453 1.33657 -0.71435 +H -5.27210 0.23153 0.13488 +H -1.99335 -2.87058 3.25594 +H -1.33502 -3.88407 1.93295 +H -3.06617 -3.39783 1.91314 diff --git a/tests/structure/test_xyz.py b/tests/structure/test_xyz.py index 183cf87be..59547fcbb 100644 --- a/tests/structure/test_xyz.py +++ b/tests/structure/test_xyz.py @@ -10,7 +10,7 @@ import pytest import numpy as np import biotite.structure as struc -from biotite.structure import Atom +from biotite.structure import Atom, AtomArray, AtomArrayStack import biotite.structure.info as info import biotite.structure.io.xyz as xyz from ..util import data_dir @@ -66,7 +66,8 @@ def test_header_conversion(): @pytest.mark.parametrize( "path", - [x for x in glob.glob(join(data_dir("structure"), "molecules", "*.xyz")) if "CO" not in x], + glob.glob(join(data_dir("structure"), "molecules", "*.xyz")) +# [x for x in glob.glob(join(data_dir("structure"), "molecules", "*.xyz")) if "CO" not in x], ) def test_structure_conversion(path): """ @@ -84,55 +85,28 @@ def test_structure_conversion(path): xyz_file = xyz.XYZFile() - xyz.set_structure(xyz_file, ref_atoms[0]) + xyz.set_structure(xyz_file, ref_atoms) temp = TemporaryFile("w+") xyz_file.write(temp) + temp.seek(0) - xyz_file = xyz.XYZFile.read(temp) + xyz_file = xyz.XYZFile.read(temp) test_atoms = xyz.get_structure(xyz_file) temp.close() - print("test_atoms ::") - print(test_atoms) - print("") - print("") - print("") - - print("ref_atoms ::") - print(ref_atoms) - print("") - print("") - print("") - - assert test_atoms == ref_atoms - - -#@pytest.mark.parametrize( -# "path", glob.glob(join(data_dir("structure"), "xyzecules", "*.sdf")), -#) -#def test_pdbx_consistency(path): -# """ -# Check if the structure parsed from a xyz file is equal to the same -# structure read from the *Chemical Component Dictionary* in PDBx -# format. - -# In this case an SDF file is used, but it is compatible with the -# xyz format. -# """ -# xyz_name = split(splitext(path)[0])[1] -# ref_atoms = info.residue(xyz_name) -# # The CCD contains information about aromatic bond types, -# # but the SDF test files do not -# ref_atoms.bonds.remove_aromaticity() - -# xyz_file = xyz.XYZFile.read(path) -# test_atoms = xyz_file.get_structure() - -# assert test_atoms.coord.shape == ref_atoms.coord.shape -# assert test_atoms.coord.flatten().tolist() \ -# == ref_atoms.coord.flatten().tolist() -# assert test_atoms.element.tolist() == ref_atoms.element.tolist() -# assert test_atoms.charge.tolist() == ref_atoms.charge.tolist() -# assert set(tuple(bond) for bond in test_atoms.bonds.as_array()) \ -# == set(tuple(bond) for bond in ref_atoms.bonds.as_array()) + + instance_cond = isinstance(ref_atoms, AtomArray) + instance_cond = instance_cond | isinstance(ref_atoms, AtomArrayStack) + assert instance_cond + + if isinstance(ref_atoms, AtomArray): + # actually no idea why we can assume that this works + # since floating point comparison is not safe! + assert test_atoms == ref_atoms + elif isinstance(ref_atoms, AtomArrayStack): + for i in range(ref_atoms.shape[0]): + assert np.all(np.isclose(ref_atoms[i].coord, test_atoms[i].coord)) + assert np.all(ref_atoms[i].element == test_atoms[i].element) + + From 9767d04f571ec7e9075af2d9090df82a81c384b4 Mon Sep 17 00:00:00 2001 From: Benjamin Mayer Date: Sat, 27 Aug 2022 21:43:55 +0200 Subject: [PATCH 05/37] XYZFile cleaning up for production code ... --- src/biotite/structure/io/xyz/file.py | 36 ++++------------------------ 1 file changed, 5 insertions(+), 31 deletions(-) diff --git a/src/biotite/structure/io/xyz/file.py b/src/biotite/structure/io/xyz/file.py index 8aa4961d4..088df2e8b 100644 --- a/src/biotite/structure/io/xyz/file.py +++ b/src/biotite/structure/io/xyz/file.py @@ -186,17 +186,14 @@ def get_structure(self, model=None): ) atom_number, names = self.get_header() -# print("atom_numbers :: " + str(atom_number) + " :: " +str(len(atom_number))) -# print("names :: " + str(names)+ " :: " +str(len(names))) -# + + # set a default head if non present since # the number of lines will be calculated from the number # of atoms field in the file (counts how many lines with numbers # there are within the file which are not name lines) if len(names) == 0 or len(atom_number) == 0: -# print("self.set_header('[MOLNAME]')") self.set_header("[MOLNAME]") -# print(self.lines) self.update_start_lines() @@ -218,29 +215,13 @@ def get_structure(self, model=None): # parse all coordinates if self.structures is None: - - - + array_stack = [] - -# print("|model_start_inds| :: " + str(self.model_start_inds)) -# print(self.atom_numbers) -# print("") for i, ind in enumerate(self.model_start_inds): ind_end = ind+2 + self.atom_numbers[i] -# print("self.lines ::") -# print(self.lines) -# print("") -# print("ind :: " +str(ind)) -# print("ind_end :: " +str(ind_end)) lines_cut = self.lines[ind:ind_end] -# print("lines_cut ::") -# print("") -# print(lines_cut) array = AtomArray(self.atom_numbers[i]) -# print("empty array ::") -# print(array) if self.atom_numbers[i]+2 != len(lines_cut): raise ValueError( @@ -254,11 +235,10 @@ def get_structure(self, model=None): ) for j, line in enumerate(lines_cut[2:]): -# print(line) + line_parsed = [ x for x in line.strip().split(" ") if x!= '' - ] - + ] x = float(line_parsed[1]) y = float(line_parsed[2]) z = float(line_parsed[3]) @@ -276,10 +256,6 @@ def get_structure(self, model=None): atom.element = line_parsed[0] array[j] = atom - - -# print("filled array ::") -# print(array) array_stack.append(array) self.structures = struc.stack(array_stack) @@ -317,7 +293,6 @@ def set_structure(self, atoms): for i, atom in enumerate(atoms): line = " " + str(atom.element) - #print(atom.coord) line += " " + "{: .{}f}".format(atom.coord[0], 5) line += " " + "{: .{}f}".format(atom.coord[1], 5) line += " " + "{: .{}f}".format(atom.coord[2], 5) @@ -337,7 +312,6 @@ def set_structure(self, atoms): for j, atom in enumerate(atoms_i): line = " " + str(atom.element) - #print(atom.coord) line += " " + "{: .{}f}".format(atom.coord[0], 5) line += " " + "{: .{}f}".format(atom.coord[1], 5) line += " " + "{: .{}f}".format(atom.coord[2], 5) From 977616a3060774b75809554562c5296acb8edc66 Mon Sep 17 00:00:00 2001 From: Benjamin Mayer Date: Sat, 27 Aug 2022 21:46:15 +0200 Subject: [PATCH 06/37] Added some small molecule files for testing, specifically files with multiple models gained from conversion via openbabel --- src/biotite/structure/io/mol2/file.py | 316 ++++++++-- .../structure/data/molecules/10000_docked.mol | 422 +++++++++++++ .../data/molecules/10000_docked.mol2 | 441 +++++++++++++ .../data/molecules/10000_docked.pdbqt | 378 +++++++++++ .../structure/data/molecules/10000_docked.sdf | 594 ++++++++++++++++++ .../structure/data/molecules/10000_docked.xyz | 198 ++++++ tests/structure/data/molecules/ADP.mol2 | 104 +++ tests/structure/data/molecules/nu7026.mol2 | 53 ++ 8 files changed, 2462 insertions(+), 44 deletions(-) create mode 100644 tests/structure/data/molecules/10000_docked.mol create mode 100644 tests/structure/data/molecules/10000_docked.mol2 create mode 100644 tests/structure/data/molecules/10000_docked.pdbqt create mode 100644 tests/structure/data/molecules/10000_docked.sdf create mode 100644 tests/structure/data/molecules/10000_docked.xyz create mode 100644 tests/structure/data/molecules/ADP.mol2 create mode 100644 tests/structure/data/molecules/nu7026.mol2 diff --git a/src/biotite/structure/io/mol2/file.py b/src/biotite/structure/io/mol2/file.py index df028a8ad..d0f1e25b0 100644 --- a/src/biotite/structure/io/mol2/file.py +++ b/src/biotite/structure/io/mol2/file.py @@ -7,12 +7,28 @@ __all__ = ["MOL2File"] import numpy as np -from ...atoms import AtomArray, Atom +import biotite.structure as struc +from ...atoms import AtomArray, Atom, BondList from ....file import TextFile -# Number of header lines -N_HEADER = 2 + + + +sybyl_to_biotite_bonds = { + + "1": struc.BondType.SINGLE, + "2": struc.BondType.DOUBLE, + "3": struc.BondType.TRIPLE, + "am": None, # amide not really supported in biotite yet + "ar": struc.BondType.AROMATIC_SINGLE, # questionable if this is okay since we have up to 3 formats for aromatic bonds + "du": None, # no idea what dummy is + "un": struc.BondType.ANY, + "nc": None, +} + + + class MOL2File(TextFile): @@ -28,28 +44,73 @@ class MOL2File(TextFile): -------- >>> from os.path import join - >>> mol_file = MOL2File.read(join(path_to_structures, "molecules", "BENZ.mol2")) + >>> mol_file = MOL2File.read(join(path_to_structures, "molecules", "nu7026.mol2")) >>> atom_array = mol2_file.get_structure() >>> print(atom_array) - 0 C 0.000 1.403 0.000 - 0 H 0.000 2.490 0.000 - 0 C -1.215 0.701 0.000 - 0 H -2.157 1.245 0.000 - 0 C -1.215 -0.701 0.000 - 0 H -2.157 -1.245 0.000 - 0 C 0.000 -1.403 0.000 - 0 H 0.000 -2.490 0.000 - 0 C 1.215 -0.701 0.000 - 0 H 2.157 -1.245 0.000 - 0 C 1.215 0.701 0.000 - 0 H 2.157 1.245 0.000 + + """ def __init__(self): super().__init__() - # empty header lines - self.lines = [""] * N_HEADER + self.mol_name = "" + self.num_atoms = -1 + self.num_bonds = -1 + self.num_subst = -1 + self.num_feat = -1 + self.num_sets = -1 + self.mol_type = "" + self.charge_type = "" + self.status_bits = "" + self.mol_comment = "" + + self.ind_molecule = -1 + self.ind_atoms = -1 + self.ind_bonds = -1 + + + def check_valid_mol2(self): + + #self.ind_molecule = np.where("@MOLECULE" in self.lines)[0] + self.ind_molecule = [ + i for i, x in enumerate(self.lines) if "@MOLECULE" in x + ] + if len(self.ind_molecule) != 1: + raise ValueError( + "Mol2 File doesn't contain a MOLECULE section, therefore" + "it is not possibe to parse this file" + ) + else: + self.ind_molecule = self.ind_molecule[0] + + + self.ind_atoms = [ + i for i, x in enumerate(self.lines) if "@ATOM" in x + ] + if len(self.ind_atoms) != 1: + raise ValueError( + "Mol2 File doesn't contain a ATOM section, therefore" + "it is not possibe to parse this file" + ) + else: + self.ind_atoms = self.ind_atoms[0] + + self.ind_bonds = [ + i for i, x in enumerate(self.lines) if "@BOND" in x + ] + if len(self.ind_bonds) != 1: + raise ValueError( + "Mol2 File doesn't contain a BOND section, therefore" + "it is not possibe to parse this file" + ) + else: + self.ind_bonds = self.ind_bonds[0] + +# print(self.ind_molecule) +# print(self.ind_atoms) +# print(self.ind_bonds) + def get_header(self): """ @@ -76,22 +137,117 @@ def get_header(self): comments : str Additional comments. """ - atom_number = int(self.lines[0].strip()) - mol_name = self.lines[1].strip() - return atom_number, mol_name + +# if self.record_inds is None: +# self.record_inds = [ +# i for i, x in enumerate(self.lines) if "@" in x +# ] +# #print(self.record_inds) +# + + self.check_valid_mol2() + + + #print(ind_molecule) + self.mol_name = self.lines[self.ind_molecule+1] + + numbers_line = self.lines[self.ind_molecule+2] + numbers_parsed = [int(x) for x in numbers_line.strip().split(" ")] - def set_header(self, mol_name): + self.num_atoms = numbers_parsed[0] + self.num_bonds = numbers_parsed[1] + self.num_subst = numbers_parsed[2] + self.num_feat = numbers_parsed[3] + self.num_sets = numbers_parsed[4] + + + self.mol_type = self.lines[self.ind_molecule+3] + self.charge_type = self.lines[self.ind_molecule+4] + self.status_bits = self.lines[self.ind_molecule+5] + + if "@" not in self.lines[self.ind_molecule+6]: + self.mol_comment = self.lines[self.ind_molecule+6] + + return ( + self.mol_name, + self.num_atoms, self.num_bonds, self.num_subst, + self.num_feat, self.num_sets, + self.mol_type, self.charge_type, self.status_bits, + self.mol_comment + ) + + + + + def set_header(self, mol_name, num_atoms, mol_type, charge_type + num_bonds=-1, num_subst=-1, num_feat=-1, num_sets=-1, + status_bits="", mol_comment=""): """ - Set the header for the MOL2 file. + Set the header for the MOL2 file according the following structure: + + mol_name + num_atoms [num_bonds [num_subst [num_feat[num_sets]]]] + mol_type + charge_type + [status_bits + [mol_comment]] + + taken from https://chemicbook.com/2021/02/20/mol2-file-format-explained-for-beginners-part-2.html Parameters ---------- mol_name : str The name of the molecule. + num_atoms: int + The number of atoms in the molecule. + mol_type: str + The molecule type given as a string may be either SMALL, + BIOPOLYMER, PROTEIN, NUCLEIC_ACID or SACCHARIDE + charge_type: str + Specifies the used method for calculating the charges if any + are given. May be either NO_CHARGES, DEL_RE, GASTEIGER, + GAST_HUCK, HUCKEL, PULLMAN, GAUSS80_CHARGES, AMPAC_CHARGES, + MULLIKEN_CHARGES, DICT_CHARGES, MMFF94_CHARGES or USER_CHARGES. + If charget_type is NO_CHARGES the according charge column + will be ignored even if charges are given. + num_bonds: int, optional + Number of bonds given as integer, if any. + num_subst: int, optional + + num_feat: int, optional + + num_sets: int, optional + + status_bits: str, optional + + mol_comment: str, optional + """ + self.mol_name = mol_name + self.num_atoms = num_atoms + self.num_bonds = num_bonds + self.num_subst = num_subst + self.num_feat = num_feat + self.num_sets = num_sets + self.mol_type = mol_type + self.charge_type = charge_type + self.status_bits = status_bits + self.mol_comment = mol_comment + + if len(self.lines)==0: + if self.mol_comment == "": + self.lines = [""]*5 + self.lines[4] = self.status_bits + else: + self.lines = [""]*6 + self.lines[4] = self.status_bits + self.lines[5] = self.mol_comment + + + if(len(self.lines) > 2): self.lines[1] = str(mol_name) + "\n" @@ -118,34 +274,106 @@ def get_structure(self): empty. """ - if len(self.lines) > 2: +# self.check_valid_mol2() + self.get_header() + # instantiate atom array and bonds based on number of atoms information + atoms = AtomArray(self.num_atoms) + bonds = BondList(self.num_atoms) - array = AtomArray(len(self.lines)-2) + # + # Iterate through all the atom lines by stating from line after + # @ATOM until line starting with @ is reached. + # All lines in between are assumed to be atom lines and are parsed + # into atoms accodringly. + # + index = self.ind_atoms+1 + i = 0 +# print(" start index :: " +str(index)) + while "@" not in self.lines[index]: + + + line = [x for x in self.lines[index].strip().split(" ") if x != ''] + - for i, line in enumerate(self.lines[2:]): - line_parsed = [x for x in line.strip().split(" ") if x!= ''] - - atom = Atom( - [ - float(line_parsed[1]), - float(line_parsed[2]), - float(line_parsed[3]), - ] - ) - atom.element = line_parsed[0] - array[i] = atom - - return array + atom_id = int(line[0]) + atom_name = line[1] + x_coord = float(line[2]) + y_coord = float(line[3]) + z_coord = float(line[4]) + atom_type_sybl = line[5] + subst_id = -1 + subst_name = "" + charge = 0.0 + status_bits = "" + + if len(line) > 6: + subst_id = int(line[6]) + if len(line) > 7: + subst_name = line[7] + if len(line) > 8: + charge = float(line[8]) + if len(line) > 9: + status_bits = line[9] + atom_i = Atom( + [x_coord, y_coord, z_coord], + ) + atom_i.atom_id = atom_id + if self.charge_type != "NO_CHARGES": + atom_i.charge = charge + atom_i.element = atom_name + atom_i.res_id = subst_id + atom_i.res_name = subst_name - else: - - raise ValueError( - "Trying to get_structure from empty MOL2File" - ) + atoms[i] = atom_i + index += 1 + i += 1 + + + # + # Iterate through all the bond lines by stating from line after + # @BOND until line starting with @ is reached. + # All lines in between are assumed to be atom lines and are parsed + # into atoms accodringly. + # + index = self.ind_bonds +1 + while index < len(self.lines) and "@" not in self.lines[index]: + line = [x for x in self.lines[index].strip().split(" ") if x != ''] + + bond_id = int(line[0]) + origin_atom_id = int(line[1]) + target_atom_id = int(line[2]) + bond_typ = sybyl_to_biotite_bonds[str(line[3])] + status_bits = "" + + if len(line) > 4: + status_bits = str(line[4]) + + if bond_typ is not None: +# print( +# " adding bond ( " +# + str(origin_atom_id-1) + ", " +# + str(target_atom_id-1) + ", " +# + str(bond_typ) +# + ")" +# ) + + bonds.add_bond( + origin_atom_id-1, + target_atom_id-1, + bond_typ + ) + + index += 1 + + + atoms.bond_list = bonds + return atoms + + def set_structure(self, atoms): diff --git a/tests/structure/data/molecules/10000_docked.mol b/tests/structure/data/molecules/10000_docked.mol new file mode 100644 index 000000000..2f9ebb1de --- /dev/null +++ b/tests/structure/data/molecules/10000_docked.mol @@ -0,0 +1,422 @@ += + OpenBabel08272221323D + + 20 21 0 0 1 0 0 0 0 0999 V2000 + 119.4990 101.0650 20.8750 C 0 0 0 0 0 1 0 0 0 0 0 0 + 119.4350 102.1420 21.9770 C 0 0 2 0 0 3 0 0 0 0 0 0 + 119.2020 101.5020 23.3840 C 0 0 1 0 0 3 0 0 0 0 0 0 + 119.6390 102.3180 24.6640 C 0 0 1 0 0 3 0 0 0 0 0 0 + 120.7430 103.2410 24.3530 N 0 0 0 0 0 0 0 0 0 0 0 0 + 121.5620 103.1630 24.9500 H 0 0 0 0 0 0 0 0 0 0 0 0 + 120.5530 104.4350 23.7520 C 0 0 0 0 0 0 0 0 0 0 0 0 + 121.5970 105.2980 23.8510 O 0 0 0 0 0 0 0 0 0 0 0 0 + 121.2620 106.4230 23.1640 C 0 0 0 0 0 0 0 0 0 0 0 0 + 119.9900 106.3010 22.6540 C 0 0 0 0 0 3 0 0 0 0 0 0 + 122.2830 107.4830 23.0840 C 0 0 0 0 0 1 0 0 0 0 0 0 + 119.5370 104.9950 22.9920 C 0 0 0 0 0 0 0 0 0 0 0 0 + 118.2470 104.3800 22.5600 C 0 0 0 0 0 2 0 0 0 0 0 0 + 118.4230 103.2320 21.5680 C 0 0 0 0 0 2 0 0 0 0 0 0 + 117.8520 100.8950 23.4530 C 0 0 0 0 0 0 0 0 0 0 0 0 + 116.7320 100.4570 23.4640 C 0 0 0 0 0 3 0 0 0 0 0 0 + 118.6440 103.0300 25.6500 C 0 0 0 0 0 2 0 0 0 0 0 0 + 118.9190 103.0440 27.0840 N 0 0 0 0 0 0 0 0 0 0 0 0 + 118.1850 102.5250 27.5670 H 0 0 0 0 0 0 0 0 0 0 0 0 + 118.8240 104.0010 27.4240 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2 1 1 6 0 0 0 + 2 3 1 0 0 0 0 + 3 15 1 1 0 0 0 + 3 4 1 0 0 0 0 + 4 17 1 6 0 0 0 + 5 4 1 0 0 0 0 + 5 6 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 5 1 0 0 0 0 + 9 8 1 0 0 0 0 + 10 12 1 0 0 0 0 + 10 9 2 0 0 0 0 + 11 9 1 0 0 0 0 + 12 7 2 0 0 0 0 + 13 12 1 0 0 0 0 + 14 2 1 0 0 0 0 + 14 13 1 0 0 0 0 + 15 16 3 0 0 0 0 + 17 18 1 0 0 0 0 + 18 20 1 0 0 0 0 + 18 19 1 0 0 0 0 +M END +$$$$ += + OpenBabel08272221323D + + 20 21 0 0 1 0 0 0 0 0999 V2000 + 115.7020 100.0510 22.7360 C 0 0 0 0 0 1 0 0 0 0 0 0 + 116.4880 101.3780 22.7420 C 0 0 2 0 0 3 0 0 0 0 0 0 + 115.5360 102.6000 22.9560 C 0 0 1 0 0 3 0 0 0 0 0 0 + 116.1490 103.9390 23.5290 C 0 0 1 0 0 3 0 0 0 0 0 0 + 117.3390 103.6680 24.3530 N 0 0 0 0 0 0 0 0 0 0 0 0 + 117.3240 104.0650 25.2890 H 0 0 0 0 0 0 0 0 0 0 0 0 + 118.5570 103.4280 23.8240 C 0 0 0 0 0 0 0 0 0 0 0 0 + 119.5920 103.5430 24.6960 O 0 0 0 0 0 0 0 0 0 0 0 0 + 120.7300 103.2310 24.0200 C 0 0 0 0 0 0 0 0 0 0 0 0 + 120.4360 102.9510 22.7060 C 0 0 0 0 0 3 0 0 0 0 0 0 + 121.9850 103.2290 24.7950 C 0 0 0 0 0 1 0 0 0 0 0 0 + 119.0210 103.0320 22.5780 C 0 0 0 0 0 0 0 0 0 0 0 0 + 118.2350 102.7060 21.3510 C 0 0 0 0 0 2 0 0 0 0 0 0 + 117.3840 101.4460 21.4890 C 0 0 0 0 0 2 0 0 0 0 0 0 + 114.6430 102.7640 21.7860 C 0 0 0 0 0 0 0 0 0 0 0 0 + 113.8780 102.9450 20.8760 C 0 0 0 0 0 3 0 0 0 0 0 0 + 116.4030 105.2360 22.6810 C 0 0 0 0 0 2 0 0 0 0 0 0 + 115.7260 106.4830 23.0290 N 0 0 0 0 0 0 0 0 0 0 0 0 + 114.7800 106.2690 23.3450 H 0 0 0 0 0 0 0 0 0 0 0 0 + 115.5960 107.0310 22.1780 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2 1 1 6 0 0 0 + 2 3 1 0 0 0 0 + 3 15 1 6 0 0 0 + 3 4 1 0 0 0 0 + 4 17 1 6 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 + 7 5 1 0 0 0 0 + 7 8 1 0 0 0 0 + 9 8 1 0 0 0 0 + 9 11 1 0 0 0 0 + 10 9 2 0 0 0 0 + 12 10 1 0 0 0 0 + 12 7 2 0 0 0 0 + 13 14 1 0 0 0 0 + 13 12 1 0 0 0 0 + 14 2 1 0 0 0 0 + 16 15 3 0 0 0 0 + 17 18 1 0 0 0 0 + 18 19 1 0 0 0 0 + 20 18 1 0 0 0 0 +M END +$$$$ += + OpenBabel08272221323D + + 20 21 0 0 1 0 0 0 0 0999 V2000 + 114.0540 102.4250 21.9980 C 0 0 0 0 0 1 0 0 0 0 0 0 + 115.5770 102.3110 22.2110 C 0 0 2 0 0 3 0 0 0 0 0 0 + 116.0470 103.1800 23.4230 C 0 0 1 0 0 3 0 0 0 0 0 0 + 117.4030 102.8010 24.1400 C 0 0 1 0 0 3 0 0 0 0 0 0 + 117.6970 101.3650 23.9930 N 0 0 0 0 0 0 0 0 0 0 0 0 + 117.8810 100.8640 24.8580 H 0 0 0 0 0 0 0 0 0 0 0 0 + 118.2320 100.8380 22.8710 C 0 0 0 0 0 0 0 0 0 0 0 0 + 118.7570 99.5940 23.0190 O 0 0 0 0 0 0 0 0 0 0 0 0 + 119.2110 99.1970 21.8000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 119.0130 100.1960 20.8750 C 0 0 0 0 0 3 0 0 0 0 0 0 + 119.7710 97.8360 21.7080 C 0 0 0 0 0 1 0 0 0 0 0 0 + 118.3380 101.2510 21.5510 C 0 0 0 0 0 0 0 0 0 0 0 0 + 117.8260 102.5040 20.9230 C 0 0 0 0 0 2 0 0 0 0 0 0 + 116.3020 102.5850 20.8780 C 0 0 0 0 0 2 0 0 0 0 0 0 + 115.8750 104.6190 23.1170 C 0 0 0 0 0 0 0 0 0 0 0 0 + 115.7780 105.7780 22.8090 C 0 0 0 0 0 3 0 0 0 0 0 0 + 118.7420 103.6110 23.9990 C 0 0 0 0 0 2 0 0 0 0 0 0 + 119.4710 104.0330 25.1920 N 0 0 0 0 0 0 0 0 0 0 0 0 + 118.8000 104.2950 25.9150 H 0 0 0 0 0 0 0 0 0 0 0 0 + 119.9700 104.8960 24.9790 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2 1 1 6 0 0 0 + 2 3 1 0 0 0 0 + 3 15 1 6 0 0 0 + 3 4 1 0 0 0 0 + 4 17 1 6 0 0 0 + 5 4 1 0 0 0 0 + 5 6 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 5 1 0 0 0 0 + 9 8 1 0 0 0 0 + 10 12 1 0 0 0 0 + 10 9 2 0 0 0 0 + 11 9 1 0 0 0 0 + 12 7 2 0 0 0 0 + 13 12 1 0 0 0 0 + 14 13 1 0 0 0 0 + 14 2 1 0 0 0 0 + 16 15 3 0 0 0 0 + 17 18 1 0 0 0 0 + 18 19 1 0 0 0 0 + 20 18 1 0 0 0 0 +M END +$$$$ += + OpenBabel08272221323D + + 20 21 0 0 1 0 0 0 0 0999 V2000 + 116.5070 103.3700 20.8750 C 0 0 0 0 0 1 0 0 0 0 0 0 + 117.5500 102.6260 21.7330 C 0 0 2 0 0 3 0 0 0 0 0 0 + 117.7100 101.1400 21.2720 C 0 0 1 0 0 3 0 0 0 0 0 0 + 119.0530 100.3850 21.6190 C 0 0 1 0 0 3 0 0 0 0 0 0 + 120.1740 101.3300 21.7520 N 0 0 0 0 0 0 0 0 0 0 0 0 + 120.9930 101.1230 21.1860 H 0 0 0 0 0 0 0 0 0 0 0 0 + 120.3880 102.0610 22.8670 C 0 0 0 0 0 0 0 0 0 0 0 0 + 121.6280 102.6050 22.9650 O 0 0 0 0 0 0 0 0 0 0 0 0 + 121.6620 103.3360 24.1110 C 0 0 0 0 0 0 0 0 0 0 0 0 + 120.4600 103.2340 24.7710 C 0 0 0 0 0 3 0 0 0 0 0 0 + 122.9070 104.0760 24.3920 C 0 0 0 0 0 1 0 0 0 0 0 0 + 119.6080 102.4430 23.9490 C 0 0 0 0 0 0 0 0 0 0 0 0 + 118.1690 102.1480 24.2120 C 0 0 0 0 0 2 0 0 0 0 0 0 + 117.2190 102.8250 23.2260 C 0 0 0 0 0 2 0 0 0 0 0 0 + 116.4680 100.3830 21.5500 C 0 0 0 0 0 0 0 0 0 0 0 0 + 115.4700 99.7810 21.8490 C 0 0 0 0 0 3 0 0 0 0 0 0 + 119.1910 99.2740 22.7210 C 0 0 0 0 0 2 0 0 0 0 0 0 + 119.0140 97.8670 22.3700 N 0 0 0 0 0 0 0 0 0 0 0 0 + 119.4640 97.2900 23.0800 H 0 0 0 0 0 0 0 0 0 0 0 0 + 119.5370 97.6780 21.5140 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2 1 1 6 0 0 0 + 2 14 1 0 0 0 0 + 3 15 1 1 0 0 0 + 3 4 1 0 0 0 0 + 3 2 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 17 1 1 0 0 0 + 5 7 1 0 0 0 0 + 6 5 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 12 2 0 0 0 0 + 8 9 1 0 0 0 0 + 9 11 1 0 0 0 0 + 9 10 2 0 0 0 0 + 12 13 1 0 0 0 0 + 12 10 1 0 0 0 0 + 14 13 1 0 0 0 0 + 15 16 3 0 0 0 0 + 18 17 1 0 0 0 0 + 18 19 1 0 0 0 0 + 20 18 1 0 0 0 0 +M END +$$$$ += + OpenBabel08272221323D + + 20 21 0 0 1 0 0 0 0 0999 V2000 + 116.8190 104.4660 23.1950 C 0 0 0 0 0 1 0 0 0 0 0 0 + 118.0090 103.5100 22.9750 C 0 0 2 0 0 3 0 0 0 0 0 0 + 119.2690 103.9800 23.7730 C 0 0 1 0 0 3 0 0 0 0 0 0 + 120.3760 102.9100 24.1280 C 0 0 1 0 0 3 0 0 0 0 0 0 + 119.7970 101.5590 24.2240 N 0 0 0 0 0 0 0 0 0 0 0 0 + 119.9930 101.0580 25.0860 H 0 0 0 0 0 0 0 0 0 0 0 0 + 119.5220 100.8020 23.1410 C 0 0 0 0 0 0 0 0 0 0 0 0 + 119.3280 99.4830 23.4010 O 0 0 0 0 0 0 0 0 0 0 0 0 + 119.0230 98.8770 22.2220 C 0 0 0 0 0 0 0 0 0 0 0 0 + 119.0560 99.7940 21.1980 C 0 0 0 0 0 3 0 0 0 0 0 0 + 118.7070 97.4370 22.2760 C 0 0 0 0 0 1 0 0 0 0 0 0 + 119.3360 101.0580 21.7910 C 0 0 0 0 0 0 0 0 0 0 0 0 + 119.3680 102.3690 21.0770 C 0 0 0 0 0 2 0 0 0 0 0 0 + 118.2210 103.3000 21.4620 C 0 0 0 0 0 2 0 0 0 0 0 0 + 119.7780 105.2560 23.2200 C 0 0 0 0 0 0 0 0 0 0 0 0 + 120.1940 106.3190 22.8400 C 0 0 0 0 0 3 0 0 0 0 0 0 + 121.7780 102.8130 23.4270 C 0 0 0 0 0 2 0 0 0 0 0 0 + 122.8990 103.6130 23.9160 N 0 0 0 0 0 0 0 0 0 0 0 0 + 123.5390 103.0060 24.4280 H 0 0 0 0 0 0 0 0 0 0 0 0 + 122.5490 104.2680 24.6150 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2 1 1 6 0 0 0 + 2 3 1 0 0 0 0 + 3 15 1 6 0 0 0 + 3 4 1 0 0 0 0 + 4 17 1 6 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 5 1 0 0 0 0 + 9 11 1 0 0 0 0 + 9 8 1 0 0 0 0 + 10 12 1 0 0 0 0 + 10 9 2 0 0 0 0 + 12 7 2 0 0 0 0 + 13 14 1 0 0 0 0 + 13 12 1 0 0 0 0 + 14 2 1 0 0 0 0 + 16 15 3 0 0 0 0 + 17 18 1 0 0 0 0 + 18 19 1 0 0 0 0 + 18 20 1 0 0 0 0 +M END +$$$$ += + OpenBabel08272221323D + + 20 21 0 0 1 0 0 0 0 0999 V2000 + 118.3830 105.7440 22.1080 C 0 0 0 0 0 1 0 0 0 0 0 0 + 118.6990 104.3500 22.6880 C 0 0 2 0 0 3 0 0 0 0 0 0 + 119.5220 104.4590 24.0130 C 0 0 1 0 0 3 0 0 0 0 0 0 + 119.4790 103.2480 25.0270 C 0 0 1 0 0 3 0 0 0 0 0 0 + 118.2200 102.4930 24.8990 N 0 0 0 0 0 0 0 0 0 0 0 0 + 117.6990 102.3600 25.7620 H 0 0 0 0 0 0 0 0 0 0 0 0 + 118.0070 101.5840 23.9240 C 0 0 0 0 0 0 0 0 0 0 0 0 + 116.9640 100.7430 24.1460 O 0 0 0 0 0 0 0 0 0 0 0 0 + 116.8620 99.9280 23.0620 C 0 0 0 0 0 0 0 0 0 0 0 0 + 117.8580 100.2170 22.1590 C 0 0 0 0 0 3 0 0 0 0 0 0 + 115.7460 98.9640 23.0570 C 0 0 0 0 0 1 0 0 0 0 0 0 + 118.5820 101.3220 22.6890 C 0 0 0 0 0 0 0 0 0 0 0 0 + 119.6930 102.0480 22.0050 C 0 0 0 0 0 2 0 0 0 0 0 0 + 119.3250 103.4700 21.5870 C 0 0 0 0 0 2 0 0 0 0 0 0 + 120.8710 105.0010 23.7330 C 0 0 0 0 0 0 0 0 0 0 0 0 + 121.9590 105.4860 23.5640 C 0 0 0 0 0 3 0 0 0 0 0 0 + 120.6570 102.2350 25.2550 C 0 0 0 0 0 2 0 0 0 0 0 0 + 121.4160 102.2640 26.5030 N 0 0 0 0 0 0 0 0 0 0 0 0 + 122.4110 102.2010 26.2860 H 0 0 0 0 0 0 0 0 0 0 0 0 + 121.2120 101.4120 27.0260 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2 1 1 6 0 0 0 + 2 3 1 0 0 0 0 + 3 15 1 6 0 0 0 + 3 4 1 0 0 0 0 + 4 17 1 6 0 0 0 + 5 4 1 0 0 0 0 + 5 6 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 5 1 0 0 0 0 + 9 8 1 0 0 0 0 + 10 12 1 0 0 0 0 + 10 9 2 0 0 0 0 + 11 9 1 0 0 0 0 + 12 7 2 0 0 0 0 + 13 12 1 0 0 0 0 + 14 13 1 0 0 0 0 + 14 2 1 0 0 0 0 + 16 15 3 0 0 0 0 + 17 18 1 0 0 0 0 + 18 20 1 0 0 0 0 + 19 18 1 0 0 0 0 +M END +$$$$ += + OpenBabel08272221323D + + 20 21 0 0 1 0 0 0 0 0999 V2000 + 119.4170 103.2430 26.1760 C 0 0 0 0 0 1 0 0 0 0 0 0 + 119.0830 102.8690 24.7170 C 0 0 2 0 0 3 0 0 0 0 0 0 + 120.1910 101.9560 24.0980 C 0 0 1 0 0 3 0 0 0 0 0 0 + 119.8100 101.0390 22.8700 C 0 0 1 0 0 3 0 0 0 0 0 0 + 118.3760 100.6990 22.8860 N 0 0 0 0 0 0 0 0 0 0 0 0 + 118.1600 99.7070 22.8320 H 0 0 0 0 0 0 0 0 0 0 0 0 + 117.4180 101.5440 22.4530 C 0 0 0 0 0 0 0 0 0 0 0 0 + 116.2130 100.9670 22.2100 O 0 0 0 0 0 0 0 0 0 0 0 0 + 115.3590 101.9530 21.8260 C 0 0 0 0 0 0 0 0 0 0 0 0 + 116.0190 103.1590 21.7860 C 0 0 0 0 0 3 0 0 0 0 0 0 + 113.9610 101.5600 21.5690 C 0 0 0 0 0 1 0 0 0 0 0 0 + 117.3480 102.9120 22.2350 C 0 0 0 0 0 0 0 0 0 0 0 0 + 118.4010 103.9470 22.4530 C 0 0 0 0 0 2 0 0 0 0 0 0 + 118.7590 104.1510 23.9230 C 0 0 0 0 0 2 0 0 0 0 0 0 + 121.4550 102.7130 23.9520 C 0 0 0 0 0 0 0 0 0 0 0 0 + 122.4660 103.3630 23.8980 C 0 0 0 0 0 3 0 0 0 0 0 0 + 120.2510 101.3070 21.3860 C 0 0 0 0 0 2 0 0 0 0 0 0 + 121.4920 100.7310 20.8750 N 0 0 0 0 0 0 0 0 0 0 0 0 + 122.2170 100.8250 21.5860 H 0 0 0 0 0 0 0 0 0 0 0 0 + 121.8180 101.3020 20.0960 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2 1 1 1 0 0 0 + 3 15 1 6 0 0 0 + 3 2 1 0 0 0 0 + 4 17 1 6 0 0 0 + 4 5 1 0 0 0 0 + 4 3 1 0 0 0 0 + 6 5 1 0 0 0 0 + 7 5 1 0 0 0 0 + 8 7 1 0 0 0 0 + 9 8 1 0 0 0 0 + 10 9 2 0 0 0 0 + 10 12 1 0 0 0 0 + 11 9 1 0 0 0 0 + 12 7 2 0 0 0 0 + 12 13 1 0 0 0 0 + 13 14 1 0 0 0 0 + 14 2 1 0 0 0 0 + 16 15 3 0 0 0 0 + 18 17 1 0 0 0 0 + 18 19 1 0 0 0 0 + 20 18 1 0 0 0 0 +M END +$$$$ += + OpenBabel08272221323D + + 20 21 0 0 1 0 0 0 0 0999 V2000 + 115.7920 103.4600 24.1910 C 0 0 0 0 0 1 0 0 0 0 0 0 + 116.6880 102.5430 23.3330 C 0 0 2 0 0 3 0 0 0 0 0 0 + 118.1790 103.0130 23.3680 C 0 0 1 0 0 3 0 0 0 0 0 0 + 119.3070 101.9580 23.0370 C 0 0 1 0 0 3 0 0 0 0 0 0 + 118.8670 100.5910 23.3610 N 0 0 0 0 0 0 0 0 0 0 0 0 + 119.4890 100.0620 23.9670 H 0 0 0 0 0 0 0 0 0 0 0 0 + 118.0630 99.8690 22.5520 C 0 0 0 0 0 0 0 0 0 0 0 0 + 118.0360 98.5370 22.8140 O 0 0 0 0 0 0 0 0 0 0 0 0 + 117.1560 97.9690 21.9460 C 0 0 0 0 0 0 0 0 0 0 0 0 + 116.6440 98.9260 21.1020 C 0 0 0 0 0 3 0 0 0 0 0 0 + 116.9180 96.5210 22.0920 C 0 0 0 0 0 1 0 0 0 0 0 0 + 117.1930 100.1730 21.5160 C 0 0 0 0 0 0 0 0 0 0 0 0 + 116.8430 101.5100 20.9530 C 0 0 0 0 0 2 0 0 0 0 0 0 + 116.0710 102.3970 21.9270 C 0 0 0 0 0 2 0 0 0 0 0 0 + 118.3190 104.3220 22.6890 C 0 0 0 0 0 0 0 0 0 0 0 0 + 118.3600 105.3970 22.1510 C 0 0 0 0 0 3 0 0 0 0 0 0 + 120.1290 101.9230 21.6990 C 0 0 0 0 0 2 0 0 0 0 0 0 + 121.3880 101.1840 21.6310 N 0 0 0 0 0 0 0 0 0 0 0 0 + 121.3520 100.5430 20.8380 H 0 0 0 0 0 0 0 0 0 0 0 0 + 121.4520 100.5780 22.4490 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2 3 1 0 0 0 0 + 2 1 1 1 0 0 0 + 3 15 1 6 0 0 0 + 4 17 1 6 0 0 0 + 4 5 1 0 0 0 0 + 4 3 1 0 0 0 0 + 5 6 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 5 1 0 0 0 0 + 9 11 1 0 0 0 0 + 9 8 1 0 0 0 0 + 10 12 1 0 0 0 0 + 10 9 2 0 0 0 0 + 12 7 2 0 0 0 0 + 13 12 1 0 0 0 0 + 13 14 1 0 0 0 0 + 14 2 1 0 0 0 0 + 16 15 3 0 0 0 0 + 18 17 1 0 0 0 0 + 18 20 1 0 0 0 0 + 19 18 1 0 0 0 0 +M END +$$$$ += + OpenBabel08272221323D + + 20 21 0 0 1 0 0 0 0 0999 V2000 + 119.7310 99.9290 23.0800 C 0 0 0 0 0 1 0 0 0 0 0 0 + 119.0280 101.3010 23.1200 C 0 0 2 0 0 3 0 0 0 0 0 0 + 120.0630 102.4720 23.0510 C 0 0 1 0 0 3 0 0 0 0 0 0 + 119.5700 103.8820 22.5390 C 0 0 1 0 0 3 0 0 0 0 0 0 + 118.4220 103.7440 21.6270 N 0 0 0 0 0 0 0 0 0 0 0 0 + 118.5210 104.2010 20.7240 H 0 0 0 0 0 0 0 0 0 0 0 0 + 117.1600 103.5480 22.0630 C 0 0 0 0 0 0 0 0 0 0 0 0 + 116.1920 103.7880 21.1400 O 0 0 0 0 0 0 0 0 0 0 0 0 + 114.9960 103.5050 21.7220 C 0 0 0 0 0 0 0 0 0 0 0 0 + 115.1870 103.1180 23.0290 C 0 0 0 0 0 3 0 0 0 0 0 0 + 113.7960 103.6350 20.8750 C 0 0 0 0 0 1 0 0 0 0 0 0 + 116.5940 103.1000 23.2480 C 0 0 0 0 0 0 0 0 0 0 0 0 + 117.2770 102.6430 24.4940 C 0 0 0 0 0 2 0 0 0 0 0 0 + 118.0580 101.3430 24.3180 C 0 0 0 0 0 2 0 0 0 0 0 0 + 120.8860 102.4980 24.2820 C 0 0 0 0 0 0 0 0 0 0 0 0 + 121.5210 102.5840 25.3000 C 0 0 0 0 0 3 0 0 0 0 0 0 + 119.3400 105.1330 23.4600 C 0 0 0 0 0 2 0 0 0 0 0 0 + 120.3530 106.1830 23.5370 N 0 0 0 0 0 0 0 0 0 0 0 0 + 121.1760 105.8870 23.0120 H 0 0 0 0 0 0 0 0 0 0 0 0 + 120.6750 106.2530 24.5020 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2 1 1 1 0 0 0 + 2 14 1 0 0 0 0 + 3 2 1 0 0 0 0 + 3 15 1 1 0 0 0 + 4 3 1 0 0 0 0 + 4 17 1 1 0 0 0 + 5 7 1 0 0 0 0 + 5 4 1 0 0 0 0 + 6 5 1 0 0 0 0 + 7 12 2 0 0 0 0 + 8 9 1 0 0 0 0 + 8 7 1 0 0 0 0 + 9 10 2 0 0 0 0 + 10 12 1 0 0 0 0 + 11 9 1 0 0 0 0 + 12 13 1 0 0 0 0 + 14 13 1 0 0 0 0 + 15 16 3 0 0 0 0 + 17 18 1 0 0 0 0 + 18 20 1 0 0 0 0 + 19 18 1 0 0 0 0 +M END diff --git a/tests/structure/data/molecules/10000_docked.mol2 b/tests/structure/data/molecules/10000_docked.mol2 new file mode 100644 index 000000000..9cda8b03d --- /dev/null +++ b/tests/structure/data/molecules/10000_docked.mol2 @@ -0,0 +1,441 @@ +@MOLECULE += + 20 21 0 0 0 +SMALL +GASTEIGER + +@ATOM + 1 C 119.4990 101.0650 20.8750 C.3 1 UNL1 0.0090 + 2 C 119.4350 102.1420 21.9770 C.3 1 UNL1 0.0030 + 3 C 119.2020 101.5020 23.3840 C.3 1 UNL1 0.0880 + 4 C 119.6390 102.3180 24.6640 C.3 1 UNL1 0.1020 + 5 N 120.7430 103.2410 24.3530 N.pl3 1 UNL1 -0.3100 + 6 H 121.5620 103.1630 24.9500 H 1 UNL1 0.1490 + 7 C 120.5530 104.4350 23.7520 C.2 1 UNL1 0.1900 + 8 O 121.5970 105.2980 23.8510 O.2 1 UNL1 -0.4460 + 9 C 121.2620 106.4230 23.1640 C.2 1 UNL1 0.1050 + 10 C 119.9900 106.3010 22.6540 C.2 1 UNL1 0.0500 + 11 C 122.2830 107.4830 23.0840 C.3 1 UNL1 0.0860 + 12 C 119.5370 104.9950 22.9920 C.2 1 UNL1 0.0130 + 13 C 118.2470 104.3800 22.5600 C.3 1 UNL1 0.0400 + 14 C 118.4230 103.2320 21.5680 C.3 1 UNL1 0.0090 + 15 C 117.8520 100.8950 23.4530 C.1 1 UNL1 -0.1000 + 16 C 116.7320 100.4570 23.4640 C.1 1 UNL1 0.0040 + 17 C 118.6440 103.0300 25.6500 C.3 1 UNL1 0.1010 + 18 N 118.9190 103.0440 27.0840 N.3 1 UNL1 -0.3280 + 19 H 118.1850 102.5250 27.5670 H 1 UNL1 0.1180 + 20 H 118.8240 104.0010 27.4240 H 1 UNL1 0.1180 +@BOND + 1 1 2 1 + 2 14 2 1 + 3 14 13 1 + 4 2 3 1 + 5 13 12 1 + 6 10 12 1 + 7 10 9 2 + 8 12 7 2 + 9 11 9 1 + 10 9 8 1 + 11 3 15 1 + 12 3 4 1 + 13 15 16 3 + 14 7 8 1 + 15 7 5 1 + 16 5 4 1 + 17 5 6 1 + 18 4 17 1 + 19 17 18 1 + 20 18 20 1 + 21 18 19 1 +@MOLECULE += + 20 21 0 0 0 +SMALL +GASTEIGER + +@ATOM + 1 C 115.7020 100.0510 22.7360 C.3 1 UNL1 0.0090 + 2 C 116.4880 101.3780 22.7420 C.3 1 UNL1 0.0030 + 3 C 115.5360 102.6000 22.9560 C.3 1 UNL1 0.0880 + 4 C 116.1490 103.9390 23.5290 C.3 1 UNL1 0.1020 + 5 N 117.3390 103.6680 24.3530 N.pl3 1 UNL1 -0.3100 + 6 H 117.3240 104.0650 25.2890 H 1 UNL1 0.1490 + 7 C 118.5570 103.4280 23.8240 C.2 1 UNL1 0.1900 + 8 O 119.5920 103.5430 24.6960 O.2 1 UNL1 -0.4460 + 9 C 120.7300 103.2310 24.0200 C.2 1 UNL1 0.1050 + 10 C 120.4360 102.9510 22.7060 C.2 1 UNL1 0.0500 + 11 C 121.9850 103.2290 24.7950 C.3 1 UNL1 0.0860 + 12 C 119.0210 103.0320 22.5780 C.2 1 UNL1 0.0130 + 13 C 118.2350 102.7060 21.3510 C.3 1 UNL1 0.0400 + 14 C 117.3840 101.4460 21.4890 C.3 1 UNL1 0.0090 + 15 C 114.6430 102.7640 21.7860 C.1 1 UNL1 -0.1000 + 16 C 113.8780 102.9450 20.8760 C.1 1 UNL1 0.0040 + 17 C 116.4030 105.2360 22.6810 C.3 1 UNL1 0.1010 + 18 N 115.7260 106.4830 23.0290 N.3 1 UNL1 -0.3280 + 19 H 114.7800 106.2690 23.3450 H 1 UNL1 0.1180 + 20 H 115.5960 107.0310 22.1780 H 1 UNL1 0.1180 +@BOND + 1 16 15 3 + 2 13 14 1 + 3 13 12 1 + 4 14 2 1 + 5 15 3 1 + 6 20 18 1 + 7 12 10 1 + 8 12 7 2 + 9 17 18 1 + 10 17 4 1 + 11 10 9 2 + 12 1 2 1 + 13 2 3 1 + 14 3 4 1 + 15 18 19 1 + 16 4 5 1 + 17 7 5 1 + 18 7 8 1 + 19 9 8 1 + 20 9 11 1 + 21 5 6 1 +@MOLECULE += + 20 21 0 0 0 +SMALL +GASTEIGER + +@ATOM + 1 C 114.0540 102.4250 21.9980 C.3 1 UNL1 0.0090 + 2 C 115.5770 102.3110 22.2110 C.3 1 UNL1 0.0030 + 3 C 116.0470 103.1800 23.4230 C.3 1 UNL1 0.0880 + 4 C 117.4030 102.8010 24.1400 C.3 1 UNL1 0.1020 + 5 N 117.6970 101.3650 23.9930 N.pl3 1 UNL1 -0.3100 + 6 H 117.8810 100.8640 24.8580 H 1 UNL1 0.1490 + 7 C 118.2320 100.8380 22.8710 C.2 1 UNL1 0.1900 + 8 O 118.7570 99.5940 23.0190 O.2 1 UNL1 -0.4460 + 9 C 119.2110 99.1970 21.8000 C.2 1 UNL1 0.1050 + 10 C 119.0130 100.1960 20.8750 C.2 1 UNL1 0.0500 + 11 C 119.7710 97.8360 21.7080 C.3 1 UNL1 0.0860 + 12 C 118.3380 101.2510 21.5510 C.2 1 UNL1 0.0130 + 13 C 117.8260 102.5040 20.9230 C.3 1 UNL1 0.0400 + 14 C 116.3020 102.5850 20.8780 C.3 1 UNL1 0.0090 + 15 C 115.8750 104.6190 23.1170 C.1 1 UNL1 -0.1000 + 16 C 115.7780 105.7780 22.8090 C.1 1 UNL1 0.0040 + 17 C 118.7420 103.6110 23.9990 C.3 1 UNL1 0.1010 + 18 N 119.4710 104.0330 25.1920 N.3 1 UNL1 -0.3280 + 19 H 118.8000 104.2950 25.9150 H 1 UNL1 0.1180 + 20 H 119.9700 104.8960 24.9790 H 1 UNL1 0.1180 +@BOND + 1 10 12 1 + 2 10 9 2 + 3 14 13 1 + 4 14 2 1 + 5 13 12 1 + 6 12 7 2 + 7 11 9 1 + 8 9 8 1 + 9 1 2 1 + 10 2 3 1 + 11 16 15 3 + 12 7 8 1 + 13 7 5 1 + 14 15 3 1 + 15 3 4 1 + 16 5 4 1 + 17 5 6 1 + 18 17 4 1 + 19 17 18 1 + 20 20 18 1 + 21 18 19 1 +@MOLECULE += + 20 21 0 0 0 +SMALL +GASTEIGER + +@ATOM + 1 C 116.5070 103.3700 20.8750 C.3 1 UNL1 0.0090 + 2 C 117.5500 102.6260 21.7330 C.3 1 UNL1 0.0030 + 3 C 117.7100 101.1400 21.2720 C.3 1 UNL1 0.0880 + 4 C 119.0530 100.3850 21.6190 C.3 1 UNL1 0.1020 + 5 N 120.1740 101.3300 21.7520 N.pl3 1 UNL1 -0.3100 + 6 H 120.9930 101.1230 21.1860 H 1 UNL1 0.1490 + 7 C 120.3880 102.0610 22.8670 C.2 1 UNL1 0.1900 + 8 O 121.6280 102.6050 22.9650 O.2 1 UNL1 -0.4460 + 9 C 121.6620 103.3360 24.1110 C.2 1 UNL1 0.1050 + 10 C 120.4600 103.2340 24.7710 C.2 1 UNL1 0.0500 + 11 C 122.9070 104.0760 24.3920 C.3 1 UNL1 0.0860 + 12 C 119.6080 102.4430 23.9490 C.2 1 UNL1 0.0130 + 13 C 118.1690 102.1480 24.2120 C.3 1 UNL1 0.0400 + 14 C 117.2190 102.8250 23.2260 C.3 1 UNL1 0.0090 + 15 C 116.4680 100.3830 21.5500 C.1 1 UNL1 -0.1000 + 16 C 115.4700 99.7810 21.8490 C.1 1 UNL1 0.0040 + 17 C 119.1910 99.2740 22.7210 C.3 1 UNL1 0.1010 + 18 N 119.0140 97.8670 22.3700 N.3 1 UNL1 -0.3280 + 19 H 119.4640 97.2900 23.0800 H 1 UNL1 0.1180 + 20 H 119.5370 97.6780 21.5140 H 1 UNL1 0.1180 +@BOND + 1 1 2 1 + 2 6 5 1 + 3 3 15 1 + 4 3 4 1 + 5 3 2 1 + 6 20 18 1 + 7 15 16 3 + 8 4 5 1 + 9 4 17 1 + 10 2 14 1 + 11 5 7 1 + 12 18 17 1 + 13 18 19 1 + 14 7 8 1 + 15 7 12 2 + 16 8 9 1 + 17 14 13 1 + 18 12 13 1 + 19 12 10 1 + 20 9 11 1 + 21 9 10 2 +@MOLECULE += + 20 21 0 0 0 +SMALL +GASTEIGER + +@ATOM + 1 C 116.8190 104.4660 23.1950 C.3 1 UNL1 0.0090 + 2 C 118.0090 103.5100 22.9750 C.3 1 UNL1 0.0030 + 3 C 119.2690 103.9800 23.7730 C.3 1 UNL1 0.0880 + 4 C 120.3760 102.9100 24.1280 C.3 1 UNL1 0.1020 + 5 N 119.7970 101.5590 24.2240 N.pl3 1 UNL1 -0.3100 + 6 H 119.9930 101.0580 25.0860 H 1 UNL1 0.1490 + 7 C 119.5220 100.8020 23.1410 C.2 1 UNL1 0.1900 + 8 O 119.3280 99.4830 23.4010 O.2 1 UNL1 -0.4460 + 9 C 119.0230 98.8770 22.2220 C.2 1 UNL1 0.1050 + 10 C 119.0560 99.7940 21.1980 C.2 1 UNL1 0.0500 + 11 C 118.7070 97.4370 22.2760 C.3 1 UNL1 0.0860 + 12 C 119.3360 101.0580 21.7910 C.2 1 UNL1 0.0130 + 13 C 119.3680 102.3690 21.0770 C.3 1 UNL1 0.0400 + 14 C 118.2210 103.3000 21.4620 C.3 1 UNL1 0.0090 + 15 C 119.7780 105.2560 23.2200 C.1 1 UNL1 -0.1000 + 16 C 120.1940 106.3190 22.8400 C.1 1 UNL1 0.0040 + 17 C 121.7780 102.8130 23.4270 C.3 1 UNL1 0.1010 + 18 N 122.8990 103.6130 23.9160 N.3 1 UNL1 -0.3280 + 19 H 123.5390 103.0060 24.4280 H 1 UNL1 0.1180 + 20 H 122.5490 104.2680 24.6150 H 1 UNL1 0.1180 +@BOND + 1 13 14 1 + 2 13 12 1 + 3 10 12 1 + 4 10 9 2 + 5 14 2 1 + 6 12 7 2 + 7 9 11 1 + 8 9 8 1 + 9 16 15 3 + 10 2 1 1 + 11 2 3 1 + 12 7 8 1 + 13 7 5 1 + 14 15 3 1 + 15 17 18 1 + 16 17 4 1 + 17 3 4 1 + 18 18 19 1 + 19 18 20 1 + 20 4 5 1 + 21 5 6 1 +@MOLECULE += + 20 21 0 0 0 +SMALL +GASTEIGER + +@ATOM + 1 C 118.3830 105.7440 22.1080 C.3 1 UNL1 0.0090 + 2 C 118.6990 104.3500 22.6880 C.3 1 UNL1 0.0030 + 3 C 119.5220 104.4590 24.0130 C.3 1 UNL1 0.0880 + 4 C 119.4790 103.2480 25.0270 C.3 1 UNL1 0.1020 + 5 N 118.2200 102.4930 24.8990 N.pl3 1 UNL1 -0.3100 + 6 H 117.6990 102.3600 25.7620 H 1 UNL1 0.1490 + 7 C 118.0070 101.5840 23.9240 C.2 1 UNL1 0.1900 + 8 O 116.9640 100.7430 24.1460 O.2 1 UNL1 -0.4460 + 9 C 116.8620 99.9280 23.0620 C.2 1 UNL1 0.1050 + 10 C 117.8580 100.2170 22.1590 C.2 1 UNL1 0.0500 + 11 C 115.7460 98.9640 23.0570 C.3 1 UNL1 0.0860 + 12 C 118.5820 101.3220 22.6890 C.2 1 UNL1 0.0130 + 13 C 119.6930 102.0480 22.0050 C.3 1 UNL1 0.0400 + 14 C 119.3250 103.4700 21.5870 C.3 1 UNL1 0.0090 + 15 C 120.8710 105.0010 23.7330 C.1 1 UNL1 -0.1000 + 16 C 121.9590 105.4860 23.5640 C.1 1 UNL1 0.0040 + 17 C 120.6570 102.2350 25.2550 C.3 1 UNL1 0.1010 + 18 N 121.4160 102.2640 26.5030 N.3 1 UNL1 -0.3280 + 19 H 122.4110 102.2010 26.2860 H 1 UNL1 0.1180 + 20 H 121.2120 101.4120 27.0260 H 1 UNL1 0.1180 +@BOND + 1 14 13 1 + 2 14 2 1 + 3 13 12 1 + 4 1 2 1 + 5 10 12 1 + 6 10 9 2 + 7 2 3 1 + 8 12 7 2 + 9 11 9 1 + 10 9 8 1 + 11 16 15 3 + 12 15 3 1 + 13 7 8 1 + 14 7 5 1 + 15 3 4 1 + 16 5 4 1 + 17 5 6 1 + 18 4 17 1 + 19 17 18 1 + 20 19 18 1 + 21 18 20 1 +@MOLECULE += + 20 21 0 0 0 +SMALL +GASTEIGER + +@ATOM + 1 C 119.4170 103.2430 26.1760 C.3 1 UNL1 0.0090 + 2 C 119.0830 102.8690 24.7170 C.3 1 UNL1 0.0030 + 3 C 120.1910 101.9560 24.0980 C.3 1 UNL1 0.0880 + 4 C 119.8100 101.0390 22.8700 C.3 1 UNL1 0.1020 + 5 N 118.3760 100.6990 22.8860 N.pl3 1 UNL1 -0.3100 + 6 H 118.1600 99.7070 22.8320 H 1 UNL1 0.1490 + 7 C 117.4180 101.5440 22.4530 C.2 1 UNL1 0.1900 + 8 O 116.2130 100.9670 22.2100 O.2 1 UNL1 -0.4460 + 9 C 115.3590 101.9530 21.8260 C.2 1 UNL1 0.1050 + 10 C 116.0190 103.1590 21.7860 C.2 1 UNL1 0.0500 + 11 C 113.9610 101.5600 21.5690 C.3 1 UNL1 0.0860 + 12 C 117.3480 102.9120 22.2350 C.2 1 UNL1 0.0130 + 13 C 118.4010 103.9470 22.4530 C.3 1 UNL1 0.0400 + 14 C 118.7590 104.1510 23.9230 C.3 1 UNL1 0.0090 + 15 C 121.4550 102.7130 23.9520 C.1 1 UNL1 -0.1000 + 16 C 122.4660 103.3630 23.8980 C.1 1 UNL1 0.0040 + 17 C 120.2510 101.3070 21.3860 C.3 1 UNL1 0.1010 + 18 N 121.4920 100.7310 20.8750 N.3 1 UNL1 -0.3280 + 19 H 122.2170 100.8250 21.5860 H 1 UNL1 0.1180 + 20 H 121.8180 101.3020 20.0960 H 1 UNL1 0.1180 +@BOND + 1 20 18 1 + 2 18 17 1 + 3 18 19 1 + 4 17 4 1 + 5 11 9 1 + 6 10 9 2 + 7 10 12 1 + 8 9 8 1 + 9 8 7 1 + 10 12 7 2 + 11 12 13 1 + 12 7 5 1 + 13 13 14 1 + 14 6 5 1 + 15 4 5 1 + 16 4 3 1 + 17 16 15 3 + 18 14 2 1 + 19 15 3 1 + 20 3 2 1 + 21 2 1 1 +@MOLECULE += + 20 21 0 0 0 +SMALL +GASTEIGER + +@ATOM + 1 C 115.7920 103.4600 24.1910 C.3 1 UNL1 0.0090 + 2 C 116.6880 102.5430 23.3330 C.3 1 UNL1 0.0030 + 3 C 118.1790 103.0130 23.3680 C.3 1 UNL1 0.0880 + 4 C 119.3070 101.9580 23.0370 C.3 1 UNL1 0.1020 + 5 N 118.8670 100.5910 23.3610 N.pl3 1 UNL1 -0.3100 + 6 H 119.4890 100.0620 23.9670 H 1 UNL1 0.1490 + 7 C 118.0630 99.8690 22.5520 C.2 1 UNL1 0.1900 + 8 O 118.0360 98.5370 22.8140 O.2 1 UNL1 -0.4460 + 9 C 117.1560 97.9690 21.9460 C.2 1 UNL1 0.1050 + 10 C 116.6440 98.9260 21.1020 C.2 1 UNL1 0.0500 + 11 C 116.9180 96.5210 22.0920 C.3 1 UNL1 0.0860 + 12 C 117.1930 100.1730 21.5160 C.2 1 UNL1 0.0130 + 13 C 116.8430 101.5100 20.9530 C.3 1 UNL1 0.0400 + 14 C 116.0710 102.3970 21.9270 C.3 1 UNL1 0.0090 + 15 C 118.3190 104.3220 22.6890 C.1 1 UNL1 -0.1000 + 16 C 118.3600 105.3970 22.1510 C.1 1 UNL1 0.0040 + 17 C 120.1290 101.9230 21.6990 C.3 1 UNL1 0.1010 + 18 N 121.3880 101.1840 21.6310 N.3 1 UNL1 -0.3280 + 19 H 121.3520 100.5430 20.8380 H 1 UNL1 0.1180 + 20 H 121.4520 100.5780 22.4490 H 1 UNL1 0.1180 +@BOND + 1 19 18 1 + 2 13 12 1 + 3 13 14 1 + 4 10 12 1 + 5 10 9 2 + 6 12 7 2 + 7 18 17 1 + 8 18 20 1 + 9 17 4 1 + 10 14 2 1 + 11 9 11 1 + 12 9 8 1 + 13 16 15 3 + 14 7 8 1 + 15 7 5 1 + 16 15 3 1 + 17 4 5 1 + 18 4 3 1 + 19 2 3 1 + 20 2 1 1 + 21 5 6 1 +@MOLECULE += + 20 21 0 0 0 +SMALL +GASTEIGER + +@ATOM + 1 C 119.7310 99.9290 23.0800 C.3 1 UNL1 0.0090 + 2 C 119.0280 101.3010 23.1200 C.3 1 UNL1 0.0030 + 3 C 120.0630 102.4720 23.0510 C.3 1 UNL1 0.0880 + 4 C 119.5700 103.8820 22.5390 C.3 1 UNL1 0.1020 + 5 N 118.4220 103.7440 21.6270 N.pl3 1 UNL1 -0.3100 + 6 H 118.5210 104.2010 20.7240 H 1 UNL1 0.1490 + 7 C 117.1600 103.5480 22.0630 C.2 1 UNL1 0.1900 + 8 O 116.1920 103.7880 21.1400 O.2 1 UNL1 -0.4460 + 9 C 114.9960 103.5050 21.7220 C.2 1 UNL1 0.1050 + 10 C 115.1870 103.1180 23.0290 C.2 1 UNL1 0.0500 + 11 C 113.7960 103.6350 20.8750 C.3 1 UNL1 0.0860 + 12 C 116.5940 103.1000 23.2480 C.2 1 UNL1 0.0130 + 13 C 117.2770 102.6430 24.4940 C.3 1 UNL1 0.0400 + 14 C 118.0580 101.3430 24.3180 C.3 1 UNL1 0.0090 + 15 C 120.8860 102.4980 24.2820 C.1 1 UNL1 -0.1000 + 16 C 121.5210 102.5840 25.3000 C.1 1 UNL1 0.0040 + 17 C 119.3400 105.1330 23.4600 C.3 1 UNL1 0.1010 + 18 N 120.3530 106.1830 23.5370 N.3 1 UNL1 -0.3280 + 19 H 121.1760 105.8870 23.0120 H 1 UNL1 0.1180 + 20 H 120.6750 106.2530 24.5020 H 1 UNL1 0.1180 +@BOND + 1 6 5 1 + 2 11 9 1 + 3 8 9 1 + 4 8 7 1 + 5 5 7 1 + 6 5 4 1 + 7 9 10 2 + 8 7 12 2 + 9 4 3 1 + 10 4 17 1 + 11 19 18 1 + 12 10 12 1 + 13 3 2 1 + 14 3 15 1 + 15 1 2 1 + 16 2 14 1 + 17 12 13 1 + 18 17 18 1 + 19 18 20 1 + 20 15 16 3 + 21 14 13 1 diff --git a/tests/structure/data/molecules/10000_docked.pdbqt b/tests/structure/data/molecules/10000_docked.pdbqt new file mode 100644 index 000000000..9b6bbf45d --- /dev/null +++ b/tests/structure/data/molecules/10000_docked.pdbqt @@ -0,0 +1,378 @@ +MODEL 1 +REMARK VINA RESULT: -6.5 0.000 0.000 +REMARK Name = +REMARK 5 active torsions: +REMARK status: ('A' for Active; 'I' for Inactive) +REMARK 1 A between atoms: C_1 and C_2 +REMARK 2 A between atoms: C_8 and C_9 +REMARK 3 A between atoms: C_9 and N_10 +REMARK 4 A between atoms: C_11 and C_12 +REMARK 5 A between atoms: C_15 and C_16 +REMARK x y z vdW Elec q Type +REMARK _______ _______ _______ _____ _____ ______ ____ +ROOT +ATOM 1 C UNL 1 119.499 101.065 20.875 0.00 0.00 +0.009 C +ATOM 2 C UNL 1 119.435 102.142 21.977 0.00 0.00 +0.003 C +ATOM 3 C UNL 1 119.202 101.502 23.384 0.00 0.00 +0.088 C +ATOM 4 C UNL 1 119.639 102.318 24.664 0.00 0.00 +0.102 C +ATOM 5 N UNL 1 120.743 103.241 24.353 0.00 0.00 -0.310 N +ATOM 6 H UNL 1 121.562 103.163 24.950 0.00 0.00 +0.149 HD +ATOM 7 C UNL 1 120.553 104.435 23.752 0.00 0.00 +0.190 A +ATOM 8 O UNL 1 121.597 105.298 23.851 0.00 0.00 -0.446 OA +ATOM 9 C UNL 1 121.262 106.423 23.164 0.00 0.00 +0.105 A +ATOM 10 C UNL 1 119.990 106.301 22.654 0.00 0.00 +0.050 A +ATOM 11 C UNL 1 122.283 107.483 23.084 0.00 0.00 +0.086 C +ATOM 12 C UNL 1 119.537 104.995 22.992 0.00 0.00 +0.013 A +ATOM 13 C UNL 1 118.247 104.380 22.560 0.00 0.00 +0.040 C +ATOM 14 C UNL 1 118.423 103.232 21.568 0.00 0.00 +0.009 C +ENDROOT +BRANCH 3 15 +ATOM 15 C UNL 1 117.852 100.895 23.453 0.00 0.00 -0.100 C +ATOM 16 C UNL 1 116.732 100.457 23.464 0.00 0.00 +0.004 C +ENDBRANCH 3 15 +BRANCH 4 17 +ATOM 17 C UNL 1 118.644 103.030 25.650 0.00 0.00 +0.101 C +BRANCH 17 18 +ATOM 18 N UNL 1 118.919 103.044 27.084 0.00 0.00 -0.328 NA +ATOM 19 H UNL 1 118.185 102.525 27.567 0.00 0.00 +0.118 HD +ATOM 20 H UNL 1 118.824 104.001 27.424 0.00 0.00 +0.118 HD +ENDBRANCH 17 18 +ENDBRANCH 4 17 +TORSDOF 3 +ENDMDL +MODEL 2 +REMARK VINA RESULT: -6.2 2.713 3.723 +REMARK Name = +REMARK 5 active torsions: +REMARK status: ('A' for Active; 'I' for Inactive) +REMARK 1 A between atoms: C_1 and C_2 +REMARK 2 A between atoms: C_8 and C_9 +REMARK 3 A between atoms: C_9 and N_10 +REMARK 4 A between atoms: C_11 and C_12 +REMARK 5 A between atoms: C_15 and C_16 +REMARK x y z vdW Elec q Type +REMARK _______ _______ _______ _____ _____ ______ ____ +ROOT +ATOM 1 C UNL 1 115.702 100.051 22.736 0.00 0.00 +0.009 C +ATOM 2 C UNL 1 116.488 101.378 22.742 0.00 0.00 +0.003 C +ATOM 3 C UNL 1 115.536 102.600 22.956 0.00 0.00 +0.088 C +ATOM 4 C UNL 1 116.149 103.939 23.529 0.00 0.00 +0.102 C +ATOM 5 N UNL 1 117.339 103.668 24.353 0.00 0.00 -0.310 N +ATOM 6 H UNL 1 117.324 104.065 25.289 0.00 0.00 +0.149 HD +ATOM 7 C UNL 1 118.557 103.428 23.824 0.00 0.00 +0.190 A +ATOM 8 O UNL 1 119.592 103.543 24.696 0.00 0.00 -0.446 OA +ATOM 9 C UNL 1 120.730 103.231 24.020 0.00 0.00 +0.105 A +ATOM 10 C UNL 1 120.436 102.951 22.706 0.00 0.00 +0.050 A +ATOM 11 C UNL 1 121.985 103.229 24.795 0.00 0.00 +0.086 C +ATOM 12 C UNL 1 119.021 103.032 22.578 0.00 0.00 +0.013 A +ATOM 13 C UNL 1 118.235 102.706 21.351 0.00 0.00 +0.040 C +ATOM 14 C UNL 1 117.384 101.446 21.489 0.00 0.00 +0.009 C +ENDROOT +BRANCH 3 15 +ATOM 15 C UNL 1 114.643 102.764 21.786 0.00 0.00 -0.100 C +ATOM 16 C UNL 1 113.878 102.945 20.876 0.00 0.00 +0.004 C +ENDBRANCH 3 15 +BRANCH 4 17 +ATOM 17 C UNL 1 116.403 105.236 22.681 0.00 0.00 +0.101 C +BRANCH 17 18 +ATOM 18 N UNL 1 115.726 106.483 23.029 0.00 0.00 -0.328 NA +ATOM 19 H UNL 1 114.780 106.269 23.345 0.00 0.00 +0.118 HD +ATOM 20 H UNL 1 115.596 107.031 22.178 0.00 0.00 +0.118 HD +ENDBRANCH 17 18 +ENDBRANCH 4 17 +TORSDOF 3 +ENDMDL +MODEL 3 +REMARK VINA RESULT: -5.6 2.768 5.000 +REMARK Name = +REMARK 5 active torsions: +REMARK status: ('A' for Active; 'I' for Inactive) +REMARK 1 A between atoms: C_1 and C_2 +REMARK 2 A between atoms: C_8 and C_9 +REMARK 3 A between atoms: C_9 and N_10 +REMARK 4 A between atoms: C_11 and C_12 +REMARK 5 A between atoms: C_15 and C_16 +REMARK x y z vdW Elec q Type +REMARK _______ _______ _______ _____ _____ ______ ____ +ROOT +ATOM 1 C UNL 1 114.054 102.425 21.998 0.00 0.00 +0.009 C +ATOM 2 C UNL 1 115.577 102.311 22.211 0.00 0.00 +0.003 C +ATOM 3 C UNL 1 116.047 103.180 23.423 0.00 0.00 +0.088 C +ATOM 4 C UNL 1 117.403 102.801 24.140 0.00 0.00 +0.102 C +ATOM 5 N UNL 1 117.697 101.365 23.993 0.00 0.00 -0.310 N +ATOM 6 H UNL 1 117.881 100.864 24.858 0.00 0.00 +0.149 HD +ATOM 7 C UNL 1 118.232 100.838 22.871 0.00 0.00 +0.190 A +ATOM 8 O UNL 1 118.757 99.594 23.019 0.00 0.00 -0.446 OA +ATOM 9 C UNL 1 119.211 99.197 21.800 0.00 0.00 +0.105 A +ATOM 10 C UNL 1 119.013 100.196 20.875 0.00 0.00 +0.050 A +ATOM 11 C UNL 1 119.771 97.836 21.708 0.00 0.00 +0.086 C +ATOM 12 C UNL 1 118.338 101.251 21.551 0.00 0.00 +0.013 A +ATOM 13 C UNL 1 117.826 102.504 20.923 0.00 0.00 +0.040 C +ATOM 14 C UNL 1 116.302 102.585 20.878 0.00 0.00 +0.009 C +ENDROOT +BRANCH 3 15 +ATOM 15 C UNL 1 115.875 104.619 23.117 0.00 0.00 -0.100 C +ATOM 16 C UNL 1 115.778 105.778 22.809 0.00 0.00 +0.004 C +ENDBRANCH 3 15 +BRANCH 4 17 +ATOM 17 C UNL 1 118.742 103.611 23.999 0.00 0.00 +0.101 C +BRANCH 17 18 +ATOM 18 N UNL 1 119.471 104.033 25.192 0.00 0.00 -0.328 NA +ATOM 19 H UNL 1 118.800 104.295 25.915 0.00 0.00 +0.118 HD +ATOM 20 H UNL 1 119.970 104.896 24.979 0.00 0.00 +0.118 HD +ENDBRANCH 17 18 +ENDBRANCH 4 17 +TORSDOF 3 +ENDMDL +MODEL 4 +REMARK VINA RESULT: -5.5 2.628 3.463 +REMARK Name = +REMARK 5 active torsions: +REMARK status: ('A' for Active; 'I' for Inactive) +REMARK 1 A between atoms: C_1 and C_2 +REMARK 2 A between atoms: C_8 and C_9 +REMARK 3 A between atoms: C_9 and N_10 +REMARK 4 A between atoms: C_11 and C_12 +REMARK 5 A between atoms: C_15 and C_16 +REMARK x y z vdW Elec q Type +REMARK _______ _______ _______ _____ _____ ______ ____ +ROOT +ATOM 1 C UNL 1 116.507 103.370 20.875 0.00 0.00 +0.009 C +ATOM 2 C UNL 1 117.550 102.626 21.733 0.00 0.00 +0.003 C +ATOM 3 C UNL 1 117.710 101.140 21.272 0.00 0.00 +0.088 C +ATOM 4 C UNL 1 119.053 100.385 21.619 0.00 0.00 +0.102 C +ATOM 5 N UNL 1 120.174 101.330 21.752 0.00 0.00 -0.310 N +ATOM 6 H UNL 1 120.993 101.123 21.186 0.00 0.00 +0.149 HD +ATOM 7 C UNL 1 120.388 102.061 22.867 0.00 0.00 +0.190 A +ATOM 8 O UNL 1 121.628 102.605 22.965 0.00 0.00 -0.446 OA +ATOM 9 C UNL 1 121.662 103.336 24.111 0.00 0.00 +0.105 A +ATOM 10 C UNL 1 120.460 103.234 24.771 0.00 0.00 +0.050 A +ATOM 11 C UNL 1 122.907 104.076 24.392 0.00 0.00 +0.086 C +ATOM 12 C UNL 1 119.608 102.443 23.949 0.00 0.00 +0.013 A +ATOM 13 C UNL 1 118.169 102.148 24.212 0.00 0.00 +0.040 C +ATOM 14 C UNL 1 117.219 102.825 23.226 0.00 0.00 +0.009 C +ENDROOT +BRANCH 3 15 +ATOM 15 C UNL 1 116.468 100.383 21.550 0.00 0.00 -0.100 C +ATOM 16 C UNL 1 115.470 99.781 21.849 0.00 0.00 +0.004 C +ENDBRANCH 3 15 +BRANCH 4 17 +ATOM 17 C UNL 1 119.191 99.274 22.721 0.00 0.00 +0.101 C +BRANCH 17 18 +ATOM 18 N UNL 1 119.014 97.867 22.370 0.00 0.00 -0.328 NA +ATOM 19 H UNL 1 119.464 97.290 23.080 0.00 0.00 +0.118 HD +ATOM 20 H UNL 1 119.537 97.678 21.514 0.00 0.00 +0.118 HD +ENDBRANCH 17 18 +ENDBRANCH 4 17 +TORSDOF 3 +ENDMDL +MODEL 5 +REMARK VINA RESULT: -5.3 2.222 5.154 +REMARK Name = +REMARK 5 active torsions: +REMARK status: ('A' for Active; 'I' for Inactive) +REMARK 1 A between atoms: C_1 and C_2 +REMARK 2 A between atoms: C_8 and C_9 +REMARK 3 A between atoms: C_9 and N_10 +REMARK 4 A between atoms: C_11 and C_12 +REMARK 5 A between atoms: C_15 and C_16 +REMARK x y z vdW Elec q Type +REMARK _______ _______ _______ _____ _____ ______ ____ +ROOT +ATOM 1 C UNL 1 116.819 104.466 23.195 0.00 0.00 +0.009 C +ATOM 2 C UNL 1 118.009 103.510 22.975 0.00 0.00 +0.003 C +ATOM 3 C UNL 1 119.269 103.980 23.773 0.00 0.00 +0.088 C +ATOM 4 C UNL 1 120.376 102.910 24.128 0.00 0.00 +0.102 C +ATOM 5 N UNL 1 119.797 101.559 24.224 0.00 0.00 -0.310 N +ATOM 6 H UNL 1 119.993 101.058 25.086 0.00 0.00 +0.149 HD +ATOM 7 C UNL 1 119.522 100.802 23.141 0.00 0.00 +0.190 A +ATOM 8 O UNL 1 119.328 99.483 23.401 0.00 0.00 -0.446 OA +ATOM 9 C UNL 1 119.023 98.877 22.222 0.00 0.00 +0.105 A +ATOM 10 C UNL 1 119.056 99.794 21.198 0.00 0.00 +0.050 A +ATOM 11 C UNL 1 118.707 97.437 22.276 0.00 0.00 +0.086 C +ATOM 12 C UNL 1 119.336 101.058 21.791 0.00 0.00 +0.013 A +ATOM 13 C UNL 1 119.368 102.369 21.077 0.00 0.00 +0.040 C +ATOM 14 C UNL 1 118.221 103.300 21.462 0.00 0.00 +0.009 C +ENDROOT +BRANCH 3 15 +ATOM 15 C UNL 1 119.778 105.256 23.220 0.00 0.00 -0.100 C +ATOM 16 C UNL 1 120.194 106.319 22.840 0.00 0.00 +0.004 C +ENDBRANCH 3 15 +BRANCH 4 17 +ATOM 17 C UNL 1 121.778 102.813 23.427 0.00 0.00 +0.101 C +BRANCH 17 18 +ATOM 18 N UNL 1 122.899 103.613 23.916 0.00 0.00 -0.328 NA +ATOM 19 H UNL 1 123.539 103.006 24.428 0.00 0.00 +0.118 HD +ATOM 20 H UNL 1 122.549 104.268 24.615 0.00 0.00 +0.118 HD +ENDBRANCH 17 18 +ENDBRANCH 4 17 +TORSDOF 3 +ENDMDL +MODEL 6 +REMARK VINA RESULT: -5.3 2.061 5.073 +REMARK Name = +REMARK 5 active torsions: +REMARK status: ('A' for Active; 'I' for Inactive) +REMARK 1 A between atoms: C_1 and C_2 +REMARK 2 A between atoms: C_8 and C_9 +REMARK 3 A between atoms: C_9 and N_10 +REMARK 4 A between atoms: C_11 and C_12 +REMARK 5 A between atoms: C_15 and C_16 +REMARK x y z vdW Elec q Type +REMARK _______ _______ _______ _____ _____ ______ ____ +ROOT +ATOM 1 C UNL 1 118.383 105.744 22.108 0.00 0.00 +0.009 C +ATOM 2 C UNL 1 118.699 104.350 22.688 0.00 0.00 +0.003 C +ATOM 3 C UNL 1 119.522 104.459 24.013 0.00 0.00 +0.088 C +ATOM 4 C UNL 1 119.479 103.248 25.027 0.00 0.00 +0.102 C +ATOM 5 N UNL 1 118.220 102.493 24.899 0.00 0.00 -0.310 N +ATOM 6 H UNL 1 117.699 102.360 25.762 0.00 0.00 +0.149 HD +ATOM 7 C UNL 1 118.007 101.584 23.924 0.00 0.00 +0.190 A +ATOM 8 O UNL 1 116.964 100.743 24.146 0.00 0.00 -0.446 OA +ATOM 9 C UNL 1 116.862 99.928 23.062 0.00 0.00 +0.105 A +ATOM 10 C UNL 1 117.858 100.217 22.159 0.00 0.00 +0.050 A +ATOM 11 C UNL 1 115.746 98.964 23.057 0.00 0.00 +0.086 C +ATOM 12 C UNL 1 118.582 101.322 22.689 0.00 0.00 +0.013 A +ATOM 13 C UNL 1 119.693 102.048 22.005 0.00 0.00 +0.040 C +ATOM 14 C UNL 1 119.325 103.470 21.587 0.00 0.00 +0.009 C +ENDROOT +BRANCH 3 15 +ATOM 15 C UNL 1 120.871 105.001 23.733 0.00 0.00 -0.100 C +ATOM 16 C UNL 1 121.959 105.486 23.564 0.00 0.00 +0.004 C +ENDBRANCH 3 15 +BRANCH 4 17 +ATOM 17 C UNL 1 120.657 102.235 25.255 0.00 0.00 +0.101 C +BRANCH 17 18 +ATOM 18 N UNL 1 121.416 102.264 26.503 0.00 0.00 -0.328 NA +ATOM 19 H UNL 1 122.411 102.201 26.286 0.00 0.00 +0.118 HD +ATOM 20 H UNL 1 121.212 101.412 27.026 0.00 0.00 +0.118 HD +ENDBRANCH 17 18 +ENDBRANCH 4 17 +TORSDOF 3 +ENDMDL +MODEL 7 +REMARK VINA RESULT: -5.2 2.881 5.261 +REMARK Name = +REMARK 5 active torsions: +REMARK status: ('A' for Active; 'I' for Inactive) +REMARK 1 A between atoms: C_1 and C_2 +REMARK 2 A between atoms: C_8 and C_9 +REMARK 3 A between atoms: C_9 and N_10 +REMARK 4 A between atoms: C_11 and C_12 +REMARK 5 A between atoms: C_15 and C_16 +REMARK x y z vdW Elec q Type +REMARK _______ _______ _______ _____ _____ ______ ____ +ROOT +ATOM 1 C UNL 1 119.417 103.243 26.176 0.00 0.00 +0.009 C +ATOM 2 C UNL 1 119.083 102.869 24.717 0.00 0.00 +0.003 C +ATOM 3 C UNL 1 120.191 101.956 24.098 0.00 0.00 +0.088 C +ATOM 4 C UNL 1 119.810 101.039 22.870 0.00 0.00 +0.102 C +ATOM 5 N UNL 1 118.376 100.699 22.886 0.00 0.00 -0.310 N +ATOM 6 H UNL 1 118.160 99.707 22.832 0.00 0.00 +0.149 HD +ATOM 7 C UNL 1 117.418 101.544 22.453 0.00 0.00 +0.190 A +ATOM 8 O UNL 1 116.213 100.967 22.210 0.00 0.00 -0.446 OA +ATOM 9 C UNL 1 115.359 101.953 21.826 0.00 0.00 +0.105 A +ATOM 10 C UNL 1 116.019 103.159 21.786 0.00 0.00 +0.050 A +ATOM 11 C UNL 1 113.961 101.560 21.569 0.00 0.00 +0.086 C +ATOM 12 C UNL 1 117.348 102.912 22.235 0.00 0.00 +0.013 A +ATOM 13 C UNL 1 118.401 103.947 22.453 0.00 0.00 +0.040 C +ATOM 14 C UNL 1 118.759 104.151 23.923 0.00 0.00 +0.009 C +ENDROOT +BRANCH 3 15 +ATOM 15 C UNL 1 121.455 102.713 23.952 0.00 0.00 -0.100 C +ATOM 16 C UNL 1 122.466 103.363 23.898 0.00 0.00 +0.004 C +ENDBRANCH 3 15 +BRANCH 4 17 +ATOM 17 C UNL 1 120.251 101.307 21.386 0.00 0.00 +0.101 C +BRANCH 17 18 +ATOM 18 N UNL 1 121.492 100.731 20.875 0.00 0.00 -0.328 NA +ATOM 19 H UNL 1 122.217 100.825 21.586 0.00 0.00 +0.118 HD +ATOM 20 H UNL 1 121.818 101.302 20.096 0.00 0.00 +0.118 HD +ENDBRANCH 17 18 +ENDBRANCH 4 17 +TORSDOF 3 +ENDMDL +MODEL 8 +REMARK VINA RESULT: -5.1 3.006 5.957 +REMARK Name = +REMARK 5 active torsions: +REMARK status: ('A' for Active; 'I' for Inactive) +REMARK 1 A between atoms: C_1 and C_2 +REMARK 2 A between atoms: C_8 and C_9 +REMARK 3 A between atoms: C_9 and N_10 +REMARK 4 A between atoms: C_11 and C_12 +REMARK 5 A between atoms: C_15 and C_16 +REMARK x y z vdW Elec q Type +REMARK _______ _______ _______ _____ _____ ______ ____ +ROOT +ATOM 1 C UNL 1 115.792 103.460 24.191 0.00 0.00 +0.009 C +ATOM 2 C UNL 1 116.688 102.543 23.333 0.00 0.00 +0.003 C +ATOM 3 C UNL 1 118.179 103.013 23.368 0.00 0.00 +0.088 C +ATOM 4 C UNL 1 119.307 101.958 23.037 0.00 0.00 +0.102 C +ATOM 5 N UNL 1 118.867 100.591 23.361 0.00 0.00 -0.310 N +ATOM 6 H UNL 1 119.489 100.062 23.967 0.00 0.00 +0.149 HD +ATOM 7 C UNL 1 118.063 99.869 22.552 0.00 0.00 +0.190 A +ATOM 8 O UNL 1 118.036 98.537 22.814 0.00 0.00 -0.446 OA +ATOM 9 C UNL 1 117.156 97.969 21.946 0.00 0.00 +0.105 A +ATOM 10 C UNL 1 116.644 98.926 21.102 0.00 0.00 +0.050 A +ATOM 11 C UNL 1 116.918 96.521 22.092 0.00 0.00 +0.086 C +ATOM 12 C UNL 1 117.193 100.173 21.516 0.00 0.00 +0.013 A +ATOM 13 C UNL 1 116.843 101.510 20.953 0.00 0.00 +0.040 C +ATOM 14 C UNL 1 116.071 102.397 21.927 0.00 0.00 +0.009 C +ENDROOT +BRANCH 3 15 +ATOM 15 C UNL 1 118.319 104.322 22.689 0.00 0.00 -0.100 C +ATOM 16 C UNL 1 118.360 105.397 22.151 0.00 0.00 +0.004 C +ENDBRANCH 3 15 +BRANCH 4 17 +ATOM 17 C UNL 1 120.129 101.923 21.699 0.00 0.00 +0.101 C +BRANCH 17 18 +ATOM 18 N UNL 1 121.388 101.184 21.631 0.00 0.00 -0.328 NA +ATOM 19 H UNL 1 121.352 100.543 20.838 0.00 0.00 +0.118 HD +ATOM 20 H UNL 1 121.452 100.578 22.449 0.00 0.00 +0.118 HD +ENDBRANCH 17 18 +ENDBRANCH 4 17 +TORSDOF 3 +ENDMDL +MODEL 9 +REMARK VINA RESULT: -4.9 2.746 4.652 +REMARK Name = +REMARK 5 active torsions: +REMARK status: ('A' for Active; 'I' for Inactive) +REMARK 1 A between atoms: C_1 and C_2 +REMARK 2 A between atoms: C_8 and C_9 +REMARK 3 A between atoms: C_9 and N_10 +REMARK 4 A between atoms: C_11 and C_12 +REMARK 5 A between atoms: C_15 and C_16 +REMARK x y z vdW Elec q Type +REMARK _______ _______ _______ _____ _____ ______ ____ +ROOT +ATOM 1 C UNL 1 119.731 99.929 23.080 0.00 0.00 +0.009 C +ATOM 2 C UNL 1 119.028 101.301 23.120 0.00 0.00 +0.003 C +ATOM 3 C UNL 1 120.063 102.472 23.051 0.00 0.00 +0.088 C +ATOM 4 C UNL 1 119.570 103.882 22.539 0.00 0.00 +0.102 C +ATOM 5 N UNL 1 118.422 103.744 21.627 0.00 0.00 -0.310 N +ATOM 6 H UNL 1 118.521 104.201 20.724 0.00 0.00 +0.149 HD +ATOM 7 C UNL 1 117.160 103.548 22.063 0.00 0.00 +0.190 A +ATOM 8 O UNL 1 116.192 103.788 21.140 0.00 0.00 -0.446 OA +ATOM 9 C UNL 1 114.996 103.505 21.722 0.00 0.00 +0.105 A +ATOM 10 C UNL 1 115.187 103.118 23.029 0.00 0.00 +0.050 A +ATOM 11 C UNL 1 113.796 103.635 20.875 0.00 0.00 +0.086 C +ATOM 12 C UNL 1 116.594 103.100 23.248 0.00 0.00 +0.013 A +ATOM 13 C UNL 1 117.277 102.643 24.494 0.00 0.00 +0.040 C +ATOM 14 C UNL 1 118.058 101.343 24.318 0.00 0.00 +0.009 C +ENDROOT +BRANCH 3 15 +ATOM 15 C UNL 1 120.886 102.498 24.282 0.00 0.00 -0.100 C +ATOM 16 C UNL 1 121.521 102.584 25.300 0.00 0.00 +0.004 C +ENDBRANCH 3 15 +BRANCH 4 17 +ATOM 17 C UNL 1 119.340 105.133 23.460 0.00 0.00 +0.101 C +BRANCH 17 18 +ATOM 18 N UNL 1 120.353 106.183 23.537 0.00 0.00 -0.328 NA +ATOM 19 H UNL 1 121.176 105.887 23.012 0.00 0.00 +0.118 HD +ATOM 20 H UNL 1 120.675 106.253 24.502 0.00 0.00 +0.118 HD +ENDBRANCH 17 18 +ENDBRANCH 4 17 +TORSDOF 3 +ENDMDL diff --git a/tests/structure/data/molecules/10000_docked.sdf b/tests/structure/data/molecules/10000_docked.sdf new file mode 100644 index 000000000..118940134 --- /dev/null +++ b/tests/structure/data/molecules/10000_docked.sdf @@ -0,0 +1,594 @@ += + OpenBabel08272221333D + + 20 21 0 0 1 0 0 0 0 0999 V2000 + 119.4990 101.0650 20.8750 C 0 0 0 0 0 1 0 0 0 0 0 0 + 119.4350 102.1420 21.9770 C 0 0 2 0 0 3 0 0 0 0 0 0 + 119.2020 101.5020 23.3840 C 0 0 1 0 0 3 0 0 0 0 0 0 + 119.6390 102.3180 24.6640 C 0 0 1 0 0 3 0 0 0 0 0 0 + 120.7430 103.2410 24.3530 N 0 0 0 0 0 0 0 0 0 0 0 0 + 121.5620 103.1630 24.9500 H 0 0 0 0 0 0 0 0 0 0 0 0 + 120.5530 104.4350 23.7520 C 0 0 0 0 0 0 0 0 0 0 0 0 + 121.5970 105.2980 23.8510 O 0 0 0 0 0 0 0 0 0 0 0 0 + 121.2620 106.4230 23.1640 C 0 0 0 0 0 0 0 0 0 0 0 0 + 119.9900 106.3010 22.6540 C 0 0 0 0 0 3 0 0 0 0 0 0 + 122.2830 107.4830 23.0840 C 0 0 0 0 0 1 0 0 0 0 0 0 + 119.5370 104.9950 22.9920 C 0 0 0 0 0 0 0 0 0 0 0 0 + 118.2470 104.3800 22.5600 C 0 0 0 0 0 2 0 0 0 0 0 0 + 118.4230 103.2320 21.5680 C 0 0 0 0 0 2 0 0 0 0 0 0 + 117.8520 100.8950 23.4530 C 0 0 0 0 0 0 0 0 0 0 0 0 + 116.7320 100.4570 23.4640 C 0 0 0 0 0 3 0 0 0 0 0 0 + 118.6440 103.0300 25.6500 C 0 0 0 0 0 2 0 0 0 0 0 0 + 118.9190 103.0440 27.0840 N 0 0 0 0 0 0 0 0 0 0 0 0 + 118.1850 102.5250 27.5670 H 0 0 0 0 0 0 0 0 0 0 0 0 + 118.8240 104.0010 27.4240 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2 1 1 6 0 0 0 + 2 3 1 0 0 0 0 + 3 15 1 1 0 0 0 + 3 4 1 0 0 0 0 + 4 17 1 6 0 0 0 + 5 4 1 0 0 0 0 + 5 6 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 5 1 0 0 0 0 + 9 8 1 0 0 0 0 + 10 12 1 0 0 0 0 + 10 9 2 0 0 0 0 + 11 9 1 0 0 0 0 + 12 7 2 0 0 0 0 + 13 12 1 0 0 0 0 + 14 2 1 0 0 0 0 + 14 13 1 0 0 0 0 + 15 16 3 0 0 0 0 + 17 18 1 0 0 0 0 + 18 20 1 0 0 0 0 + 18 19 1 0 0 0 0 +M END +> +1 + +> + VINA RESULT: -6.5 0.000 0.000 + Name = + 5 active torsions: + status: ('A' for Active; 'I' for Inactive) + 1 A between atoms: C_1 and C_2 + 2 A between atoms: C_8 and C_9 + 3 A between atoms: C_9 and N_10 + 4 A between atoms: C_11 and C_12 + 5 A between atoms: C_15 and C_16 + x y z vdW Elec q Type + _______ _______ _______ _____ _____ ______ ____ + +> +F 3 + +$$$$ += + OpenBabel08272221333D + + 20 21 0 0 1 0 0 0 0 0999 V2000 + 115.7020 100.0510 22.7360 C 0 0 0 0 0 1 0 0 0 0 0 0 + 116.4880 101.3780 22.7420 C 0 0 2 0 0 3 0 0 0 0 0 0 + 115.5360 102.6000 22.9560 C 0 0 1 0 0 3 0 0 0 0 0 0 + 116.1490 103.9390 23.5290 C 0 0 1 0 0 3 0 0 0 0 0 0 + 117.3390 103.6680 24.3530 N 0 0 0 0 0 0 0 0 0 0 0 0 + 117.3240 104.0650 25.2890 H 0 0 0 0 0 0 0 0 0 0 0 0 + 118.5570 103.4280 23.8240 C 0 0 0 0 0 0 0 0 0 0 0 0 + 119.5920 103.5430 24.6960 O 0 0 0 0 0 0 0 0 0 0 0 0 + 120.7300 103.2310 24.0200 C 0 0 0 0 0 0 0 0 0 0 0 0 + 120.4360 102.9510 22.7060 C 0 0 0 0 0 3 0 0 0 0 0 0 + 121.9850 103.2290 24.7950 C 0 0 0 0 0 1 0 0 0 0 0 0 + 119.0210 103.0320 22.5780 C 0 0 0 0 0 0 0 0 0 0 0 0 + 118.2350 102.7060 21.3510 C 0 0 0 0 0 2 0 0 0 0 0 0 + 117.3840 101.4460 21.4890 C 0 0 0 0 0 2 0 0 0 0 0 0 + 114.6430 102.7640 21.7860 C 0 0 0 0 0 0 0 0 0 0 0 0 + 113.8780 102.9450 20.8760 C 0 0 0 0 0 3 0 0 0 0 0 0 + 116.4030 105.2360 22.6810 C 0 0 0 0 0 2 0 0 0 0 0 0 + 115.7260 106.4830 23.0290 N 0 0 0 0 0 0 0 0 0 0 0 0 + 114.7800 106.2690 23.3450 H 0 0 0 0 0 0 0 0 0 0 0 0 + 115.5960 107.0310 22.1780 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2 1 1 6 0 0 0 + 2 3 1 0 0 0 0 + 3 15 1 6 0 0 0 + 3 4 1 0 0 0 0 + 4 17 1 6 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 + 7 5 1 0 0 0 0 + 7 8 1 0 0 0 0 + 9 8 1 0 0 0 0 + 9 11 1 0 0 0 0 + 10 9 2 0 0 0 0 + 12 10 1 0 0 0 0 + 12 7 2 0 0 0 0 + 13 14 1 0 0 0 0 + 13 12 1 0 0 0 0 + 14 2 1 0 0 0 0 + 16 15 3 0 0 0 0 + 17 18 1 0 0 0 0 + 18 19 1 0 0 0 0 + 20 18 1 0 0 0 0 +M END +> +2 + +> + VINA RESULT: -6.2 2.713 3.723 + Name = + 5 active torsions: + status: ('A' for Active; 'I' for Inactive) + 1 A between atoms: C_1 and C_2 + 2 A between atoms: C_8 and C_9 + 3 A between atoms: C_9 and N_10 + 4 A between atoms: C_11 and C_12 + 5 A between atoms: C_15 and C_16 + x y z vdW Elec q Type + _______ _______ _______ _____ _____ ______ ____ + +> +F 3 + +$$$$ += + OpenBabel08272221333D + + 20 21 0 0 1 0 0 0 0 0999 V2000 + 114.0540 102.4250 21.9980 C 0 0 0 0 0 1 0 0 0 0 0 0 + 115.5770 102.3110 22.2110 C 0 0 2 0 0 3 0 0 0 0 0 0 + 116.0470 103.1800 23.4230 C 0 0 1 0 0 3 0 0 0 0 0 0 + 117.4030 102.8010 24.1400 C 0 0 1 0 0 3 0 0 0 0 0 0 + 117.6970 101.3650 23.9930 N 0 0 0 0 0 0 0 0 0 0 0 0 + 117.8810 100.8640 24.8580 H 0 0 0 0 0 0 0 0 0 0 0 0 + 118.2320 100.8380 22.8710 C 0 0 0 0 0 0 0 0 0 0 0 0 + 118.7570 99.5940 23.0190 O 0 0 0 0 0 0 0 0 0 0 0 0 + 119.2110 99.1970 21.8000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 119.0130 100.1960 20.8750 C 0 0 0 0 0 3 0 0 0 0 0 0 + 119.7710 97.8360 21.7080 C 0 0 0 0 0 1 0 0 0 0 0 0 + 118.3380 101.2510 21.5510 C 0 0 0 0 0 0 0 0 0 0 0 0 + 117.8260 102.5040 20.9230 C 0 0 0 0 0 2 0 0 0 0 0 0 + 116.3020 102.5850 20.8780 C 0 0 0 0 0 2 0 0 0 0 0 0 + 115.8750 104.6190 23.1170 C 0 0 0 0 0 0 0 0 0 0 0 0 + 115.7780 105.7780 22.8090 C 0 0 0 0 0 3 0 0 0 0 0 0 + 118.7420 103.6110 23.9990 C 0 0 0 0 0 2 0 0 0 0 0 0 + 119.4710 104.0330 25.1920 N 0 0 0 0 0 0 0 0 0 0 0 0 + 118.8000 104.2950 25.9150 H 0 0 0 0 0 0 0 0 0 0 0 0 + 119.9700 104.8960 24.9790 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2 1 1 6 0 0 0 + 2 3 1 0 0 0 0 + 3 15 1 6 0 0 0 + 3 4 1 0 0 0 0 + 4 17 1 6 0 0 0 + 5 4 1 0 0 0 0 + 5 6 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 5 1 0 0 0 0 + 9 8 1 0 0 0 0 + 10 12 1 0 0 0 0 + 10 9 2 0 0 0 0 + 11 9 1 0 0 0 0 + 12 7 2 0 0 0 0 + 13 12 1 0 0 0 0 + 14 13 1 0 0 0 0 + 14 2 1 0 0 0 0 + 16 15 3 0 0 0 0 + 17 18 1 0 0 0 0 + 18 19 1 0 0 0 0 + 20 18 1 0 0 0 0 +M END +> +3 + +> + VINA RESULT: -5.6 2.768 5.000 + Name = + 5 active torsions: + status: ('A' for Active; 'I' for Inactive) + 1 A between atoms: C_1 and C_2 + 2 A between atoms: C_8 and C_9 + 3 A between atoms: C_9 and N_10 + 4 A between atoms: C_11 and C_12 + 5 A between atoms: C_15 and C_16 + x y z vdW Elec q Type + _______ _______ _______ _____ _____ ______ ____ + +> +F 3 + +$$$$ += + OpenBabel08272221333D + + 20 21 0 0 1 0 0 0 0 0999 V2000 + 116.5070 103.3700 20.8750 C 0 0 0 0 0 1 0 0 0 0 0 0 + 117.5500 102.6260 21.7330 C 0 0 2 0 0 3 0 0 0 0 0 0 + 117.7100 101.1400 21.2720 C 0 0 1 0 0 3 0 0 0 0 0 0 + 119.0530 100.3850 21.6190 C 0 0 1 0 0 3 0 0 0 0 0 0 + 120.1740 101.3300 21.7520 N 0 0 0 0 0 0 0 0 0 0 0 0 + 120.9930 101.1230 21.1860 H 0 0 0 0 0 0 0 0 0 0 0 0 + 120.3880 102.0610 22.8670 C 0 0 0 0 0 0 0 0 0 0 0 0 + 121.6280 102.6050 22.9650 O 0 0 0 0 0 0 0 0 0 0 0 0 + 121.6620 103.3360 24.1110 C 0 0 0 0 0 0 0 0 0 0 0 0 + 120.4600 103.2340 24.7710 C 0 0 0 0 0 3 0 0 0 0 0 0 + 122.9070 104.0760 24.3920 C 0 0 0 0 0 1 0 0 0 0 0 0 + 119.6080 102.4430 23.9490 C 0 0 0 0 0 0 0 0 0 0 0 0 + 118.1690 102.1480 24.2120 C 0 0 0 0 0 2 0 0 0 0 0 0 + 117.2190 102.8250 23.2260 C 0 0 0 0 0 2 0 0 0 0 0 0 + 116.4680 100.3830 21.5500 C 0 0 0 0 0 0 0 0 0 0 0 0 + 115.4700 99.7810 21.8490 C 0 0 0 0 0 3 0 0 0 0 0 0 + 119.1910 99.2740 22.7210 C 0 0 0 0 0 2 0 0 0 0 0 0 + 119.0140 97.8670 22.3700 N 0 0 0 0 0 0 0 0 0 0 0 0 + 119.4640 97.2900 23.0800 H 0 0 0 0 0 0 0 0 0 0 0 0 + 119.5370 97.6780 21.5140 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2 1 1 6 0 0 0 + 2 14 1 0 0 0 0 + 3 15 1 1 0 0 0 + 3 4 1 0 0 0 0 + 3 2 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 17 1 1 0 0 0 + 5 7 1 0 0 0 0 + 6 5 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 12 2 0 0 0 0 + 8 9 1 0 0 0 0 + 9 11 1 0 0 0 0 + 9 10 2 0 0 0 0 + 12 13 1 0 0 0 0 + 12 10 1 0 0 0 0 + 14 13 1 0 0 0 0 + 15 16 3 0 0 0 0 + 18 17 1 0 0 0 0 + 18 19 1 0 0 0 0 + 20 18 1 0 0 0 0 +M END +> +4 + +> + VINA RESULT: -5.5 2.628 3.463 + Name = + 5 active torsions: + status: ('A' for Active; 'I' for Inactive) + 1 A between atoms: C_1 and C_2 + 2 A between atoms: C_8 and C_9 + 3 A between atoms: C_9 and N_10 + 4 A between atoms: C_11 and C_12 + 5 A between atoms: C_15 and C_16 + x y z vdW Elec q Type + _______ _______ _______ _____ _____ ______ ____ + +> +F 3 + +$$$$ += + OpenBabel08272221333D + + 20 21 0 0 1 0 0 0 0 0999 V2000 + 116.8190 104.4660 23.1950 C 0 0 0 0 0 1 0 0 0 0 0 0 + 118.0090 103.5100 22.9750 C 0 0 2 0 0 3 0 0 0 0 0 0 + 119.2690 103.9800 23.7730 C 0 0 1 0 0 3 0 0 0 0 0 0 + 120.3760 102.9100 24.1280 C 0 0 1 0 0 3 0 0 0 0 0 0 + 119.7970 101.5590 24.2240 N 0 0 0 0 0 0 0 0 0 0 0 0 + 119.9930 101.0580 25.0860 H 0 0 0 0 0 0 0 0 0 0 0 0 + 119.5220 100.8020 23.1410 C 0 0 0 0 0 0 0 0 0 0 0 0 + 119.3280 99.4830 23.4010 O 0 0 0 0 0 0 0 0 0 0 0 0 + 119.0230 98.8770 22.2220 C 0 0 0 0 0 0 0 0 0 0 0 0 + 119.0560 99.7940 21.1980 C 0 0 0 0 0 3 0 0 0 0 0 0 + 118.7070 97.4370 22.2760 C 0 0 0 0 0 1 0 0 0 0 0 0 + 119.3360 101.0580 21.7910 C 0 0 0 0 0 0 0 0 0 0 0 0 + 119.3680 102.3690 21.0770 C 0 0 0 0 0 2 0 0 0 0 0 0 + 118.2210 103.3000 21.4620 C 0 0 0 0 0 2 0 0 0 0 0 0 + 119.7780 105.2560 23.2200 C 0 0 0 0 0 0 0 0 0 0 0 0 + 120.1940 106.3190 22.8400 C 0 0 0 0 0 3 0 0 0 0 0 0 + 121.7780 102.8130 23.4270 C 0 0 0 0 0 2 0 0 0 0 0 0 + 122.8990 103.6130 23.9160 N 0 0 0 0 0 0 0 0 0 0 0 0 + 123.5390 103.0060 24.4280 H 0 0 0 0 0 0 0 0 0 0 0 0 + 122.5490 104.2680 24.6150 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2 1 1 6 0 0 0 + 2 3 1 0 0 0 0 + 3 15 1 6 0 0 0 + 3 4 1 0 0 0 0 + 4 17 1 6 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 5 1 0 0 0 0 + 9 11 1 0 0 0 0 + 9 8 1 0 0 0 0 + 10 12 1 0 0 0 0 + 10 9 2 0 0 0 0 + 12 7 2 0 0 0 0 + 13 14 1 0 0 0 0 + 13 12 1 0 0 0 0 + 14 2 1 0 0 0 0 + 16 15 3 0 0 0 0 + 17 18 1 0 0 0 0 + 18 19 1 0 0 0 0 + 18 20 1 0 0 0 0 +M END +> +5 + +> + VINA RESULT: -5.3 2.222 5.154 + Name = + 5 active torsions: + status: ('A' for Active; 'I' for Inactive) + 1 A between atoms: C_1 and C_2 + 2 A between atoms: C_8 and C_9 + 3 A between atoms: C_9 and N_10 + 4 A between atoms: C_11 and C_12 + 5 A between atoms: C_15 and C_16 + x y z vdW Elec q Type + _______ _______ _______ _____ _____ ______ ____ + +> +F 3 + +$$$$ += + OpenBabel08272221333D + + 20 21 0 0 1 0 0 0 0 0999 V2000 + 118.3830 105.7440 22.1080 C 0 0 0 0 0 1 0 0 0 0 0 0 + 118.6990 104.3500 22.6880 C 0 0 2 0 0 3 0 0 0 0 0 0 + 119.5220 104.4590 24.0130 C 0 0 1 0 0 3 0 0 0 0 0 0 + 119.4790 103.2480 25.0270 C 0 0 1 0 0 3 0 0 0 0 0 0 + 118.2200 102.4930 24.8990 N 0 0 0 0 0 0 0 0 0 0 0 0 + 117.6990 102.3600 25.7620 H 0 0 0 0 0 0 0 0 0 0 0 0 + 118.0070 101.5840 23.9240 C 0 0 0 0 0 0 0 0 0 0 0 0 + 116.9640 100.7430 24.1460 O 0 0 0 0 0 0 0 0 0 0 0 0 + 116.8620 99.9280 23.0620 C 0 0 0 0 0 0 0 0 0 0 0 0 + 117.8580 100.2170 22.1590 C 0 0 0 0 0 3 0 0 0 0 0 0 + 115.7460 98.9640 23.0570 C 0 0 0 0 0 1 0 0 0 0 0 0 + 118.5820 101.3220 22.6890 C 0 0 0 0 0 0 0 0 0 0 0 0 + 119.6930 102.0480 22.0050 C 0 0 0 0 0 2 0 0 0 0 0 0 + 119.3250 103.4700 21.5870 C 0 0 0 0 0 2 0 0 0 0 0 0 + 120.8710 105.0010 23.7330 C 0 0 0 0 0 0 0 0 0 0 0 0 + 121.9590 105.4860 23.5640 C 0 0 0 0 0 3 0 0 0 0 0 0 + 120.6570 102.2350 25.2550 C 0 0 0 0 0 2 0 0 0 0 0 0 + 121.4160 102.2640 26.5030 N 0 0 0 0 0 0 0 0 0 0 0 0 + 122.4110 102.2010 26.2860 H 0 0 0 0 0 0 0 0 0 0 0 0 + 121.2120 101.4120 27.0260 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2 1 1 6 0 0 0 + 2 3 1 0 0 0 0 + 3 15 1 6 0 0 0 + 3 4 1 0 0 0 0 + 4 17 1 6 0 0 0 + 5 4 1 0 0 0 0 + 5 6 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 5 1 0 0 0 0 + 9 8 1 0 0 0 0 + 10 12 1 0 0 0 0 + 10 9 2 0 0 0 0 + 11 9 1 0 0 0 0 + 12 7 2 0 0 0 0 + 13 12 1 0 0 0 0 + 14 13 1 0 0 0 0 + 14 2 1 0 0 0 0 + 16 15 3 0 0 0 0 + 17 18 1 0 0 0 0 + 18 20 1 0 0 0 0 + 19 18 1 0 0 0 0 +M END +> +6 + +> + VINA RESULT: -5.3 2.061 5.073 + Name = + 5 active torsions: + status: ('A' for Active; 'I' for Inactive) + 1 A between atoms: C_1 and C_2 + 2 A between atoms: C_8 and C_9 + 3 A between atoms: C_9 and N_10 + 4 A between atoms: C_11 and C_12 + 5 A between atoms: C_15 and C_16 + x y z vdW Elec q Type + _______ _______ _______ _____ _____ ______ ____ + +> +F 3 + +$$$$ += + OpenBabel08272221333D + + 20 21 0 0 1 0 0 0 0 0999 V2000 + 119.4170 103.2430 26.1760 C 0 0 0 0 0 1 0 0 0 0 0 0 + 119.0830 102.8690 24.7170 C 0 0 2 0 0 3 0 0 0 0 0 0 + 120.1910 101.9560 24.0980 C 0 0 1 0 0 3 0 0 0 0 0 0 + 119.8100 101.0390 22.8700 C 0 0 1 0 0 3 0 0 0 0 0 0 + 118.3760 100.6990 22.8860 N 0 0 0 0 0 0 0 0 0 0 0 0 + 118.1600 99.7070 22.8320 H 0 0 0 0 0 0 0 0 0 0 0 0 + 117.4180 101.5440 22.4530 C 0 0 0 0 0 0 0 0 0 0 0 0 + 116.2130 100.9670 22.2100 O 0 0 0 0 0 0 0 0 0 0 0 0 + 115.3590 101.9530 21.8260 C 0 0 0 0 0 0 0 0 0 0 0 0 + 116.0190 103.1590 21.7860 C 0 0 0 0 0 3 0 0 0 0 0 0 + 113.9610 101.5600 21.5690 C 0 0 0 0 0 1 0 0 0 0 0 0 + 117.3480 102.9120 22.2350 C 0 0 0 0 0 0 0 0 0 0 0 0 + 118.4010 103.9470 22.4530 C 0 0 0 0 0 2 0 0 0 0 0 0 + 118.7590 104.1510 23.9230 C 0 0 0 0 0 2 0 0 0 0 0 0 + 121.4550 102.7130 23.9520 C 0 0 0 0 0 0 0 0 0 0 0 0 + 122.4660 103.3630 23.8980 C 0 0 0 0 0 3 0 0 0 0 0 0 + 120.2510 101.3070 21.3860 C 0 0 0 0 0 2 0 0 0 0 0 0 + 121.4920 100.7310 20.8750 N 0 0 0 0 0 0 0 0 0 0 0 0 + 122.2170 100.8250 21.5860 H 0 0 0 0 0 0 0 0 0 0 0 0 + 121.8180 101.3020 20.0960 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2 1 1 1 0 0 0 + 3 15 1 6 0 0 0 + 3 2 1 0 0 0 0 + 4 17 1 6 0 0 0 + 4 5 1 0 0 0 0 + 4 3 1 0 0 0 0 + 6 5 1 0 0 0 0 + 7 5 1 0 0 0 0 + 8 7 1 0 0 0 0 + 9 8 1 0 0 0 0 + 10 9 2 0 0 0 0 + 10 12 1 0 0 0 0 + 11 9 1 0 0 0 0 + 12 7 2 0 0 0 0 + 12 13 1 0 0 0 0 + 13 14 1 0 0 0 0 + 14 2 1 0 0 0 0 + 16 15 3 0 0 0 0 + 18 17 1 0 0 0 0 + 18 19 1 0 0 0 0 + 20 18 1 0 0 0 0 +M END +> +7 + +> + VINA RESULT: -5.2 2.881 5.261 + Name = + 5 active torsions: + status: ('A' for Active; 'I' for Inactive) + 1 A between atoms: C_1 and C_2 + 2 A between atoms: C_8 and C_9 + 3 A between atoms: C_9 and N_10 + 4 A between atoms: C_11 and C_12 + 5 A between atoms: C_15 and C_16 + x y z vdW Elec q Type + _______ _______ _______ _____ _____ ______ ____ + +> +F 3 + +$$$$ += + OpenBabel08272221333D + + 20 21 0 0 1 0 0 0 0 0999 V2000 + 115.7920 103.4600 24.1910 C 0 0 0 0 0 1 0 0 0 0 0 0 + 116.6880 102.5430 23.3330 C 0 0 2 0 0 3 0 0 0 0 0 0 + 118.1790 103.0130 23.3680 C 0 0 1 0 0 3 0 0 0 0 0 0 + 119.3070 101.9580 23.0370 C 0 0 1 0 0 3 0 0 0 0 0 0 + 118.8670 100.5910 23.3610 N 0 0 0 0 0 0 0 0 0 0 0 0 + 119.4890 100.0620 23.9670 H 0 0 0 0 0 0 0 0 0 0 0 0 + 118.0630 99.8690 22.5520 C 0 0 0 0 0 0 0 0 0 0 0 0 + 118.0360 98.5370 22.8140 O 0 0 0 0 0 0 0 0 0 0 0 0 + 117.1560 97.9690 21.9460 C 0 0 0 0 0 0 0 0 0 0 0 0 + 116.6440 98.9260 21.1020 C 0 0 0 0 0 3 0 0 0 0 0 0 + 116.9180 96.5210 22.0920 C 0 0 0 0 0 1 0 0 0 0 0 0 + 117.1930 100.1730 21.5160 C 0 0 0 0 0 0 0 0 0 0 0 0 + 116.8430 101.5100 20.9530 C 0 0 0 0 0 2 0 0 0 0 0 0 + 116.0710 102.3970 21.9270 C 0 0 0 0 0 2 0 0 0 0 0 0 + 118.3190 104.3220 22.6890 C 0 0 0 0 0 0 0 0 0 0 0 0 + 118.3600 105.3970 22.1510 C 0 0 0 0 0 3 0 0 0 0 0 0 + 120.1290 101.9230 21.6990 C 0 0 0 0 0 2 0 0 0 0 0 0 + 121.3880 101.1840 21.6310 N 0 0 0 0 0 0 0 0 0 0 0 0 + 121.3520 100.5430 20.8380 H 0 0 0 0 0 0 0 0 0 0 0 0 + 121.4520 100.5780 22.4490 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2 3 1 0 0 0 0 + 2 1 1 1 0 0 0 + 3 15 1 6 0 0 0 + 4 17 1 6 0 0 0 + 4 5 1 0 0 0 0 + 4 3 1 0 0 0 0 + 5 6 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 5 1 0 0 0 0 + 9 11 1 0 0 0 0 + 9 8 1 0 0 0 0 + 10 12 1 0 0 0 0 + 10 9 2 0 0 0 0 + 12 7 2 0 0 0 0 + 13 12 1 0 0 0 0 + 13 14 1 0 0 0 0 + 14 2 1 0 0 0 0 + 16 15 3 0 0 0 0 + 18 17 1 0 0 0 0 + 18 20 1 0 0 0 0 + 19 18 1 0 0 0 0 +M END +> +8 + +> + VINA RESULT: -5.1 3.006 5.957 + Name = + 5 active torsions: + status: ('A' for Active; 'I' for Inactive) + 1 A between atoms: C_1 and C_2 + 2 A between atoms: C_8 and C_9 + 3 A between atoms: C_9 and N_10 + 4 A between atoms: C_11 and C_12 + 5 A between atoms: C_15 and C_16 + x y z vdW Elec q Type + _______ _______ _______ _____ _____ ______ ____ + +> +F 3 + +$$$$ += + OpenBabel08272221333D + + 20 21 0 0 1 0 0 0 0 0999 V2000 + 119.7310 99.9290 23.0800 C 0 0 0 0 0 1 0 0 0 0 0 0 + 119.0280 101.3010 23.1200 C 0 0 2 0 0 3 0 0 0 0 0 0 + 120.0630 102.4720 23.0510 C 0 0 1 0 0 3 0 0 0 0 0 0 + 119.5700 103.8820 22.5390 C 0 0 1 0 0 3 0 0 0 0 0 0 + 118.4220 103.7440 21.6270 N 0 0 0 0 0 0 0 0 0 0 0 0 + 118.5210 104.2010 20.7240 H 0 0 0 0 0 0 0 0 0 0 0 0 + 117.1600 103.5480 22.0630 C 0 0 0 0 0 0 0 0 0 0 0 0 + 116.1920 103.7880 21.1400 O 0 0 0 0 0 0 0 0 0 0 0 0 + 114.9960 103.5050 21.7220 C 0 0 0 0 0 0 0 0 0 0 0 0 + 115.1870 103.1180 23.0290 C 0 0 0 0 0 3 0 0 0 0 0 0 + 113.7960 103.6350 20.8750 C 0 0 0 0 0 1 0 0 0 0 0 0 + 116.5940 103.1000 23.2480 C 0 0 0 0 0 0 0 0 0 0 0 0 + 117.2770 102.6430 24.4940 C 0 0 0 0 0 2 0 0 0 0 0 0 + 118.0580 101.3430 24.3180 C 0 0 0 0 0 2 0 0 0 0 0 0 + 120.8860 102.4980 24.2820 C 0 0 0 0 0 0 0 0 0 0 0 0 + 121.5210 102.5840 25.3000 C 0 0 0 0 0 3 0 0 0 0 0 0 + 119.3400 105.1330 23.4600 C 0 0 0 0 0 2 0 0 0 0 0 0 + 120.3530 106.1830 23.5370 N 0 0 0 0 0 0 0 0 0 0 0 0 + 121.1760 105.8870 23.0120 H 0 0 0 0 0 0 0 0 0 0 0 0 + 120.6750 106.2530 24.5020 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2 1 1 1 0 0 0 + 2 14 1 0 0 0 0 + 3 2 1 0 0 0 0 + 3 15 1 1 0 0 0 + 4 3 1 0 0 0 0 + 4 17 1 1 0 0 0 + 5 7 1 0 0 0 0 + 5 4 1 0 0 0 0 + 6 5 1 0 0 0 0 + 7 12 2 0 0 0 0 + 8 9 1 0 0 0 0 + 8 7 1 0 0 0 0 + 9 10 2 0 0 0 0 + 10 12 1 0 0 0 0 + 11 9 1 0 0 0 0 + 12 13 1 0 0 0 0 + 14 13 1 0 0 0 0 + 15 16 3 0 0 0 0 + 17 18 1 0 0 0 0 + 18 20 1 0 0 0 0 + 19 18 1 0 0 0 0 +M END +> +9 + +> + VINA RESULT: -4.9 2.746 4.652 + Name = + 5 active torsions: + status: ('A' for Active; 'I' for Inactive) + 1 A between atoms: C_1 and C_2 + 2 A between atoms: C_8 and C_9 + 3 A between atoms: C_9 and N_10 + 4 A between atoms: C_11 and C_12 + 5 A between atoms: C_15 and C_16 + x y z vdW Elec q Type + _______ _______ _______ _____ _____ ______ ____ + +> +F 3 + +$$$$ diff --git a/tests/structure/data/molecules/10000_docked.xyz b/tests/structure/data/molecules/10000_docked.xyz new file mode 100644 index 000000000..51e56b41e --- /dev/null +++ b/tests/structure/data/molecules/10000_docked.xyz @@ -0,0 +1,198 @@ +20 += +C 119.49900 101.06500 20.87500 +C 119.43500 102.14200 21.97700 +C 119.20200 101.50200 23.38400 +C 119.63900 102.31800 24.66400 +N 120.74300 103.24100 24.35300 +H 121.56200 103.16300 24.95000 +C 120.55300 104.43500 23.75200 +O 121.59700 105.29800 23.85100 +C 121.26200 106.42300 23.16400 +C 119.99000 106.30100 22.65400 +C 122.28300 107.48300 23.08400 +C 119.53700 104.99500 22.99200 +C 118.24700 104.38000 22.56000 +C 118.42300 103.23200 21.56800 +C 117.85200 100.89500 23.45300 +C 116.73200 100.45700 23.46400 +C 118.64400 103.03000 25.65000 +N 118.91900 103.04400 27.08400 +H 118.18500 102.52500 27.56700 +H 118.82400 104.00100 27.42400 +20 += +C 115.70200 100.05100 22.73600 +C 116.48800 101.37800 22.74200 +C 115.53600 102.60000 22.95600 +C 116.14900 103.93900 23.52900 +N 117.33900 103.66800 24.35300 +H 117.32400 104.06500 25.28900 +C 118.55700 103.42800 23.82400 +O 119.59200 103.54300 24.69600 +C 120.73000 103.23100 24.02000 +C 120.43600 102.95100 22.70600 +C 121.98500 103.22900 24.79500 +C 119.02100 103.03200 22.57800 +C 118.23500 102.70600 21.35100 +C 117.38400 101.44600 21.48900 +C 114.64300 102.76400 21.78600 +C 113.87800 102.94500 20.87600 +C 116.40300 105.23600 22.68100 +N 115.72600 106.48300 23.02900 +H 114.78000 106.26900 23.34500 +H 115.59600 107.03100 22.17800 +20 += +C 114.05400 102.42500 21.99800 +C 115.57700 102.31100 22.21100 +C 116.04700 103.18000 23.42300 +C 117.40300 102.80100 24.14000 +N 117.69700 101.36500 23.99300 +H 117.88100 100.86400 24.85800 +C 118.23200 100.83800 22.87100 +O 118.75700 99.59400 23.01900 +C 119.21100 99.19700 21.80000 +C 119.01300 100.19600 20.87500 +C 119.77100 97.83600 21.70800 +C 118.33800 101.25100 21.55100 +C 117.82600 102.50400 20.92300 +C 116.30200 102.58500 20.87800 +C 115.87500 104.61900 23.11700 +C 115.77800 105.77800 22.80900 +C 118.74200 103.61100 23.99900 +N 119.47100 104.03300 25.19200 +H 118.80000 104.29500 25.91500 +H 119.97000 104.89600 24.97900 +20 += +C 116.50700 103.37000 20.87500 +C 117.55000 102.62600 21.73300 +C 117.71000 101.14000 21.27200 +C 119.05300 100.38500 21.61900 +N 120.17400 101.33000 21.75200 +H 120.99300 101.12300 21.18600 +C 120.38800 102.06100 22.86700 +O 121.62800 102.60500 22.96500 +C 121.66200 103.33600 24.11100 +C 120.46000 103.23400 24.77100 +C 122.90700 104.07600 24.39200 +C 119.60800 102.44300 23.94900 +C 118.16900 102.14800 24.21200 +C 117.21900 102.82500 23.22600 +C 116.46800 100.38300 21.55000 +C 115.47000 99.78100 21.84900 +C 119.19100 99.27400 22.72100 +N 119.01400 97.86700 22.37000 +H 119.46400 97.29000 23.08000 +H 119.53700 97.67800 21.51400 +20 += +C 116.81900 104.46600 23.19500 +C 118.00900 103.51000 22.97500 +C 119.26900 103.98000 23.77300 +C 120.37600 102.91000 24.12800 +N 119.79700 101.55900 24.22400 +H 119.99300 101.05800 25.08600 +C 119.52200 100.80200 23.14100 +O 119.32800 99.48300 23.40100 +C 119.02300 98.87700 22.22200 +C 119.05600 99.79400 21.19800 +C 118.70700 97.43700 22.27600 +C 119.33600 101.05800 21.79100 +C 119.36800 102.36900 21.07700 +C 118.22100 103.30000 21.46200 +C 119.77800 105.25600 23.22000 +C 120.19400 106.31900 22.84000 +C 121.77800 102.81300 23.42700 +N 122.89900 103.61300 23.91600 +H 123.53900 103.00600 24.42800 +H 122.54900 104.26800 24.61500 +20 += +C 118.38300 105.74400 22.10800 +C 118.69900 104.35000 22.68800 +C 119.52200 104.45900 24.01300 +C 119.47900 103.24800 25.02700 +N 118.22000 102.49300 24.89900 +H 117.69900 102.36000 25.76200 +C 118.00700 101.58400 23.92400 +O 116.96400 100.74300 24.14600 +C 116.86200 99.92800 23.06200 +C 117.85800 100.21700 22.15900 +C 115.74600 98.96400 23.05700 +C 118.58200 101.32200 22.68900 +C 119.69300 102.04800 22.00500 +C 119.32500 103.47000 21.58700 +C 120.87100 105.00100 23.73300 +C 121.95900 105.48600 23.56400 +C 120.65700 102.23500 25.25500 +N 121.41600 102.26400 26.50300 +H 122.41100 102.20100 26.28600 +H 121.21200 101.41200 27.02600 +20 += +C 119.41700 103.24300 26.17600 +C 119.08300 102.86900 24.71700 +C 120.19100 101.95600 24.09800 +C 119.81000 101.03900 22.87000 +N 118.37600 100.69900 22.88600 +H 118.16000 99.70700 22.83200 +C 117.41800 101.54400 22.45300 +O 116.21300 100.96700 22.21000 +C 115.35900 101.95300 21.82600 +C 116.01900 103.15900 21.78600 +C 113.96100 101.56000 21.56900 +C 117.34800 102.91200 22.23500 +C 118.40100 103.94700 22.45300 +C 118.75900 104.15100 23.92300 +C 121.45500 102.71300 23.95200 +C 122.46600 103.36300 23.89800 +C 120.25100 101.30700 21.38600 +N 121.49200 100.73100 20.87500 +H 122.21700 100.82500 21.58600 +H 121.81800 101.30200 20.09600 +20 += +C 115.79200 103.46000 24.19100 +C 116.68800 102.54300 23.33300 +C 118.17900 103.01300 23.36800 +C 119.30700 101.95800 23.03700 +N 118.86700 100.59100 23.36100 +H 119.48900 100.06200 23.96700 +C 118.06300 99.86900 22.55200 +O 118.03600 98.53700 22.81400 +C 117.15600 97.96900 21.94600 +C 116.64400 98.92600 21.10200 +C 116.91800 96.52100 22.09200 +C 117.19300 100.17300 21.51600 +C 116.84300 101.51000 20.95300 +C 116.07100 102.39700 21.92700 +C 118.31900 104.32200 22.68900 +C 118.36000 105.39700 22.15100 +C 120.12900 101.92300 21.69900 +N 121.38800 101.18400 21.63100 +H 121.35200 100.54300 20.83800 +H 121.45200 100.57800 22.44900 +20 += +C 119.73100 99.92900 23.08000 +C 119.02800 101.30100 23.12000 +C 120.06300 102.47200 23.05100 +C 119.57000 103.88200 22.53900 +N 118.42200 103.74400 21.62700 +H 118.52100 104.20100 20.72400 +C 117.16000 103.54800 22.06300 +O 116.19200 103.78800 21.14000 +C 114.99600 103.50500 21.72200 +C 115.18700 103.11800 23.02900 +C 113.79600 103.63500 20.87500 +C 116.59400 103.10000 23.24800 +C 117.27700 102.64300 24.49400 +C 118.05800 101.34300 24.31800 +C 120.88600 102.49800 24.28200 +C 121.52100 102.58400 25.30000 +C 119.34000 105.13300 23.46000 +N 120.35300 106.18300 23.53700 +H 121.17600 105.88700 23.01200 +H 120.67500 106.25300 24.50200 diff --git a/tests/structure/data/molecules/ADP.mol2 b/tests/structure/data/molecules/ADP.mol2 new file mode 100644 index 000000000..f97794ee7 --- /dev/null +++ b/tests/structure/data/molecules/ADP.mol2 @@ -0,0 +1,104 @@ +@MOLECULE +***** + 47 49 0 0 0 +SMALL +GASTEIGER + +@ATOM + 1 O 0.7784 -2.1987 -2.8482 O.2 1 UNL1 -0.2271 + 2 P 0.8604 -1.6339 -1.4089 P.3 1 UNL1 0.4808 + 3 O 1.5615 -0.2674 -1.9434 O.3 1 UNL1 -0.3023 + 4 O -0.6825 -1.0988 -1.4421 O.3 1 UNL1 -0.3023 + 5 O 0.9520 -1.0028 0.1993 O.3 1 UNL1 -0.1859 + 6 P 2.6081 -0.9200 0.6928 P.3 1 UNL1 0.4918 + 7 O 2.6189 0.6065 0.5282 O.2 1 UNL1 -0.2265 + 8 O 2.0429 -1.0082 2.2396 O.3 1 UNL1 -0.3019 + 9 O 4.2641 -0.8371 1.1863 O.3 1 UNL1 -0.1858 + 10 P 4.4377 -1.5630 2.7470 P.3 1 UNL1 0.4835 + 11 O 4.1470 -2.9165 2.0736 O.2 1 UNL1 -0.2269 + 12 O 6.0553 -1.3296 2.6506 O.3 1 UNL1 -0.3022 + 13 O 4.6114 -2.2890 4.3077 O.3 1 UNL1 -0.2837 + 14 C 5.2793 -3.5595 4.3498 C.3 1 UNL1 0.0879 + 15 C 5.4179 -4.0599 5.7832 C.3 1 UNL1 0.1134 + 16 H 5.9702 -3.3230 6.3793 H 1 UNL1 0.0647 + 17 O 4.1182 -4.2218 6.3858 O.3 1 UNL1 -0.3456 + 18 C 4.3033 -5.1583 7.4584 C.3 1 UNL1 0.1667 + 19 H 4.6419 -4.6075 8.3449 H 1 UNL1 0.0866 + 20 N 3.0301 -5.7633 7.7940 N.ar 1 UNL1 -0.2855 + 21 C 1.8311 -5.5893 7.1634 C.ar 1 UNL1 0.1004 + 22 N 0.8634 -6.2639 7.7537 N.ar 1 UNL1 -0.2306 + 23 C 1.4733 -6.8981 8.8162 C.ar 1 UNL1 0.1473 + 24 C 0.9806 -7.7406 9.8242 C.ar 1 UNL1 0.1472 + 25 N 1.8410 -8.1759 10.7749 N.ar 1 UNL1 -0.2188 + 26 C 3.1378 -7.8144 10.6813 C.ar 1 UNL1 0.1205 + 27 N 3.7334 -7.0362 9.7451 N.ar 1 UNL1 -0.2159 + 28 C 2.8232 -6.6007 8.8564 C.ar 1 UNL1 0.1674 + 29 N -0.3546 -8.1171 9.9161 N.pl3 1 UNL1 -0.3413 + 30 C 5.3476 -6.1697 6.9753 C.3 1 UNL1 0.1285 + 31 H 4.8788 -7.0780 6.5770 H 1 UNL1 0.0665 + 32 O 6.2688 -6.5734 7.9933 O.3 1 UNL1 -0.3847 + 33 C 6.0723 -5.4420 5.8391 C.3 1 UNL1 0.1135 + 34 H 5.9108 -5.9922 4.9040 H 1 UNL1 0.0647 + 35 O 7.4778 -5.3478 6.0461 O.3 1 UNL1 -0.3864 + 36 H 1.2185 -0.0516 -2.8292 H 1 UNL1 0.2220 + 37 H -1.0667 -1.3467 -2.3048 H 1 UNL1 0.2220 + 38 H 1.6300 -0.1353 2.4121 H 1 UNL1 0.2220 + 39 H 6.3220 -0.4258 2.8858 H 1 UNL1 0.2220 + 40 H 6.2669 -3.4722 3.8864 H 1 UNL1 0.0592 + 41 H 4.6795 -4.2893 3.7970 H 1 UNL1 0.0592 + 42 H 1.7121 -4.9593 6.2889 H 1 UNL1 0.1030 + 43 H 3.7869 -8.1961 11.4649 H 1 UNL1 0.1048 + 44 H -0.9807 -7.4996 9.4038 H 1 UNL1 0.1438 + 45 H -0.6172 -8.3788 10.8558 H 1 UNL1 0.1438 + 46 H 5.7343 -6.9507 8.7244 H 1 UNL1 0.2101 + 47 H 7.6922 -6.0171 6.7299 H 1 UNL1 0.2100 +@BOND + 1 1 2 2 + 2 2 3 1 + 3 2 4 1 + 4 2 5 1 + 5 5 6 1 + 6 6 7 2 + 7 6 8 1 + 8 6 9 1 + 9 9 10 1 + 10 10 11 2 + 11 10 12 1 + 12 10 13 1 + 13 13 14 1 + 14 14 15 1 + 15 15 16 1 + 16 15 17 1 + 17 17 18 1 + 18 20 21 ar + 19 21 22 ar + 20 22 23 ar + 21 23 24 ar + 22 24 25 ar + 23 25 26 ar + 24 26 27 ar + 25 27 28 ar + 26 23 28 ar + 27 20 28 ar + 28 24 29 1 + 29 18 30 1 + 30 30 31 1 + 31 30 32 1 + 32 30 33 1 + 33 33 34 1 + 34 15 33 1 + 35 33 35 1 + 36 18 20 1 + 37 18 19 1 + 38 3 36 1 + 39 4 37 1 + 40 8 38 1 + 41 12 39 1 + 42 14 40 1 + 43 14 41 1 + 44 21 42 1 + 45 26 43 1 + 46 29 44 1 + 47 29 45 1 + 48 32 46 1 + 49 35 47 1 diff --git a/tests/structure/data/molecules/nu7026.mol2 b/tests/structure/data/molecules/nu7026.mol2 new file mode 100644 index 000000000..defaa5cc9 --- /dev/null +++ b/tests/structure/data/molecules/nu7026.mol2 @@ -0,0 +1,53 @@ +@MOLECULE += + 21 24 0 0 0 +SMALL +GASTEIGER + +@ATOM + 1 O 0.8670 0.1340 0.2110 O.2 1 UNL1 -0.2870 + 2 C 2.0900 0.0960 0.1470 C.ar 1 UNL1 0.1940 + 3 C 2.8350 -1.1640 0.0710 C.ar 1 UNL1 0.0650 + 4 C 2.1560 -2.3820 0.0960 C.ar 1 UNL1 0.0160 + 5 C 2.8790 -3.5720 0.0630 C.ar 1 UNL1 0.0090 + 6 C 4.2820 -3.5580 0.0210 C.ar 1 UNL1 -0.0140 + 7 C 4.9740 -2.3210 -0.0130 C.ar 1 UNL1 0.0250 + 8 C 6.3850 -2.3470 -0.0400 C.ar 1 UNL1 0.0120 + 9 C 7.0890 -3.5530 -0.0300 C.ar 1 UNL1 0.0010 + 10 C 6.3990 -4.7590 -0.0020 C.ar 1 UNL1 0.0010 + 11 C 5.0040 -4.7620 0.0200 C.ar 1 UNL1 0.0080 + 12 C 4.2250 -1.1210 -0.0060 C.ar 1 UNL1 0.1480 + 13 O 4.9090 0.0730 -0.0870 O.2 1 UNL1 -0.4400 + 14 C 4.2180 1.2770 0.0180 C.ar 1 UNL1 0.1930 + 15 C 2.8840 1.3280 0.1470 C.ar 1 UNL1 0.1140 + 16 N 5.0010 2.4230 -0.0690 N.pl3 1 UNL1 -0.2970 + 17 C 4.8200 3.6090 0.7900 C.3 1 UNL1 0.1360 + 18 C 4.9740 4.8860 -0.0480 C.3 1 UNL1 0.1790 + 19 O 6.2380 4.9180 -0.7330 O.3 1 UNL1 -0.3770 + 20 C 6.3690 3.7720 -1.5930 C.3 1 UNL1 0.1790 + 21 C 6.2820 2.4570 -0.7990 C.3 1 UNL1 0.1360 +@BOND + 1 20 21 1 + 2 20 19 1 + 3 21 16 1 + 4 19 18 1 + 5 13 12 ar + 6 13 14 ar + 7 16 14 1 + 8 16 17 1 + 9 18 17 1 + 10 8 9 ar + 11 8 7 ar + 12 9 10 ar + 13 7 12 ar + 14 7 6 ar + 15 12 3 ar + 16 10 11 ar + 17 14 15 ar + 18 11 6 ar + 19 6 5 ar + 20 5 4 ar + 21 3 4 ar + 22 3 2 ar + 23 15 2 ar + 24 2 1 2 From 34c9d4c5873a86d1df5f0e53f713bab7d6a4aca8 Mon Sep 17 00:00:00 2001 From: Benjamin Mayer Date: Mon, 29 Aug 2022 11:47:21 +0200 Subject: [PATCH 07/37] Finally fucking (somewhat) finished the MOL2File class. sybly atom types heuristic doesn't yet work though ... --- src/biotite/structure/io/mol2/file.py | 582 +++++++++++++----- .../structure/data/molecules/10000_docked.mol | 422 ------------- .../molecules/10000_docked_single_state.mol2 | 49 ++ tests/structure/test_mol2.py | 148 +++++ 4 files changed, 613 insertions(+), 588 deletions(-) delete mode 100644 tests/structure/data/molecules/10000_docked.mol create mode 100644 tests/structure/data/molecules/10000_docked_single_state.mol2 create mode 100644 tests/structure/test_mol2.py diff --git a/src/biotite/structure/io/mol2/file.py b/src/biotite/structure/io/mol2/file.py index d0f1e25b0..4fbe5835c 100644 --- a/src/biotite/structure/io/mol2/file.py +++ b/src/biotite/structure/io/mol2/file.py @@ -4,11 +4,12 @@ __name__ = "biotite.structure.io.mol2" __author__ = "Benjamin E. Mayer" -__all__ = ["MOL2File"] +__all__ = ["MOL2File","supported_charge_types", "supported_mol_types"] import numpy as np import biotite.structure as struc -from ...atoms import AtomArray, Atom, BondList +from biotite.structure.error import BadStructureError +from ...atoms import AtomArray,AtomArrayStack, Atom, BondList from ....file import TextFile @@ -26,27 +27,132 @@ "un": struc.BondType.ANY, "nc": None, } +biotite_bonds_to_sybyl = { + 1: "1", + 2: "2", + 3: "3", + 5: "ar", + 0: "un", +} + +supported_charge_types = [ + "NO_CHARGES", "DEL_RE", "GASTEIGER", + "GAST_HUCK", "HUCKEL", "PULLMAN", + "GAUSS80_CHARGES", "AMPAC_CHARGES", + "MULLIKEN_CHARGES", "DICT_CHARGES", + "MMFF94_CHARGES", "USER_CHARGES" +] + + +supported_mol_types = [ + "SMALL", "BIOPOLYMER", "PROTEIN", "NUCLEIC_ACID", "SACCHARIDE" +] +sybyl_status_bit_types = [ + "system", "invalid_charges", "analyzed", "substituted", "altered", "ref_angle" +] +def get_sybyl_atom_type(atom, bonds, atom_id): + """ + This function is meant to translate all occuring atoms into sybyl atom + types based on their element and bonds. This does however not work yet, + therefore which is why currently the sybyl column is simply filled with + a static content in order to not mess up rereading from a file written + from the MOL2File class. + Parameters + ---------- + atom : Atom + The Atom object which is to be translated + into sybyl atom_type notation + + bonds: BondList + The BondList object of the respective bonds in the AtomArray. + Necessary as the sybyl atom types depend on the hybridiziation + heuristic. + + atom_id: int + The id of the current atom that is used in the bond list. + + Returns + ------- + sybyl_atom_type : str + The name of the atom based on hybridization and element according + to the sybyl atom types. + + """ + + if atom.element == "C": + atom_bonds, types = bonds.get_bonds(atom_id) + + + + if 5 in types: + return "C.ar" + else: + if len(atom_bonds) == 2: + return "C.1" + elif len(atom_bonds) == 3: + return "C.2" + elif len(atom_bonds) == 4: + return "C.3" + else: + msg = "No supported sybyl Atom type for Atom " + str(atom) + raise ValueError(msg) + + class MOL2File(TextFile): """ - This class represents a file in MOL2 format, + This class represents a file in MOL2 format. + + Notes: + - For multiple models the same header for all models is assumed. + - As biotites charge field in the AtomArray and AtomArrayStack class + is typed as int this class adds a field charges containing the + real valued charges contained in MOL2 files. + - The heuristic function for deriving sybyl atom types doesn't work + yet, for now we only write C.ar in the according column as the + sybyl atom type is one of the necessary fields for a complete + MOL2File. References ---------- .. footbibliography:: + + Examples -------- >>> from os.path import join >>> mol_file = MOL2File.read(join(path_to_structures, "molecules", "nu7026.mol2")) >>> atom_array = mol2_file.get_structure() - >>> print(atom_array) + >>> print(atom_array) + 1 UNL O 0.867 0.134 0.211 + 1 UNL C 2.090 0.096 0.147 + 1 UNL C 2.835 -1.164 0.071 + 1 UNL C 2.156 -2.382 0.096 + 1 UNL C 2.879 -3.572 0.063 + 1 UNL C 4.282 -3.558 0.021 + 1 UNL C 4.974 -2.321 -0.013 + 1 UNL C 6.385 -2.347 -0.040 + 1 UNL C 7.089 -3.553 -0.030 + 1 UNL C 6.399 -4.759 -0.002 + 1 UNL C 5.004 -4.762 0.020 + 1 UNL C 4.225 -1.121 -0.006 + 1 UNL O 4.909 0.073 -0.087 + 1 UNL C 4.218 1.277 0.018 + 1 UNL C 2.884 1.328 0.147 + 1 UNL N 5.001 2.423 -0.069 + 1 UNL C 4.820 3.609 0.790 + 1 UNL C 4.974 4.886 -0.048 + 1 UNL O 6.238 4.918 -0.733 + 1 UNL C 6.369 3.772 -1.593 + 1 UNL C 6.282 2.457 -0.799 + @@ -76,45 +182,58 @@ def check_valid_mol2(self): self.ind_molecule = [ i for i, x in enumerate(self.lines) if "@MOLECULE" in x ] - if len(self.ind_molecule) != 1: + if len(self.ind_molecule) == 0: raise ValueError( "Mol2 File doesn't contain a MOLECULE section, therefore" "it is not possibe to parse this file" ) - else: - self.ind_molecule = self.ind_molecule[0] self.ind_atoms = [ i for i, x in enumerate(self.lines) if "@ATOM" in x ] - if len(self.ind_atoms) != 1: + if len(self.ind_atoms) == 0: raise ValueError( "Mol2 File doesn't contain a ATOM section, therefore" "it is not possibe to parse this file" ) - else: - self.ind_atoms = self.ind_atoms[0] + self.ind_bonds = [ i for i, x in enumerate(self.lines) if "@BOND" in x ] - if len(self.ind_bonds) != 1: + if len(self.ind_bonds) == 0: raise ValueError( "Mol2 File doesn't contain a BOND section, therefore" "it is not possibe to parse this file" ) - else: - self.ind_bonds = self.ind_bonds[0] -# print(self.ind_molecule) -# print(self.ind_atoms) -# print(self.ind_bonds) + if len(self.ind_molecule) != len(self.ind_atoms): + raise ValueError( + "Mol2 File doesn't contain as many MOLECULE sections as it does" + "contain ATOM sections" + + ) + if len(self.ind_molecule) != len(self.ind_bonds): + raise ValueError( + "Mol2 File doesn't contain as many MOLECULE sections as it does" + "contain BOND sections" + + ) + if len(self.ind_bonds) != len(self.ind_atoms): + raise ValueError( + "Mol2 File doesn't contain as many BOND sections as it does" + "contain ATOM sections" + + ) + def get_header(self): """ - Get the header from the MOL2 file. + Get the header from the MOL2 file, if the file contains multiple + models the assumption is made that those all have the same header + as a AtomArrayStack of different molecules can't be buil anyways. Returns ------- @@ -136,38 +255,31 @@ def get_header(self): MDL registry number. comments : str Additional comments. - """ - -# if self.record_inds is None: - -# self.record_inds = [ -# i for i, x in enumerate(self.lines) if "@" in x -# ] -# #print(self.record_inds) -# + """ - self.check_valid_mol2() - - - #print(ind_molecule) - self.mol_name = self.lines[self.ind_molecule+1] - - numbers_line = self.lines[self.ind_molecule+2] + self.check_valid_mol2() + self.mol_name = self.lines[self.ind_molecule[0]+1] + + numbers_line = self.lines[self.ind_molecule[0]+2] numbers_parsed = [int(x) for x in numbers_line.strip().split(" ")] self.num_atoms = numbers_parsed[0] - self.num_bonds = numbers_parsed[1] - self.num_subst = numbers_parsed[2] - self.num_feat = numbers_parsed[3] - self.num_sets = numbers_parsed[4] + if len(numbers_parsed) > 1: + self.num_bonds = numbers_parsed[1] + if len(numbers_parsed) > 2: + self.num_subst = numbers_parsed[2] + if len(numbers_parsed) > 3: + self.num_feat = numbers_parsed[3] + if len(numbers_parsed) > 4: + self.num_sets = numbers_parsed[4] - self.mol_type = self.lines[self.ind_molecule+3] - self.charge_type = self.lines[self.ind_molecule+4] - self.status_bits = self.lines[self.ind_molecule+5] + self.mol_type = self.lines[self.ind_molecule[0]+3] + self.charge_type = self.lines[self.ind_molecule[0]+4] + self.status_bits = self.lines[self.ind_molecule[0]+5] - if "@" not in self.lines[self.ind_molecule+6]: - self.mol_comment = self.lines[self.ind_molecule+6] + if "@" not in self.lines[self.ind_molecule[0]+6]: + self.mol_comment = self.lines[self.ind_molecule[0]+6] return ( self.mol_name, @@ -180,7 +292,7 @@ def get_header(self): - def set_header(self, mol_name, num_atoms, mol_type, charge_type + def set_header(self, mol_name, num_atoms, mol_type, charge_type, num_bonds=-1, num_subst=-1, num_feat=-1, num_sets=-1, status_bits="", mol_comment=""): """ @@ -209,7 +321,7 @@ def set_header(self, mol_name, num_atoms, mol_type, charge_type are given. May be either NO_CHARGES, DEL_RE, GASTEIGER, GAST_HUCK, HUCKEL, PULLMAN, GAUSS80_CHARGES, AMPAC_CHARGES, MULLIKEN_CHARGES, DICT_CHARGES, MMFF94_CHARGES or USER_CHARGES. - If charget_type is NO_CHARGES the according charge column + If charge_type is NO_CHARGES the according charge column will be ignored even if charges are given. num_bonds: int, optional Number of bonds given as integer, if any. @@ -232,34 +344,66 @@ def set_header(self, mol_name, num_atoms, mol_type, charge_type self.num_subst = num_subst self.num_feat = num_feat self.num_sets = num_sets + + if mol_type != "": + cond = mol_type in supported_mol_types + if not cond: + msg = "The specified molecule type ["+str(charge_type) +"] \n" + msg += " is not among the supported molecule types: \n" + msg += "" + str(supported_mol_types) + "\n" + raise ValueError(msg) + self.mol_type = mol_type + + if charge_type != "": + cond = charge_type in supported_charge_types + if not cond: + msg = "The specified charge type ["+str(charge_type) +"] " + msg += " is not among the supported charge types: \n" + msg += str(supported_charge_types) + "\n" + raise ValueError(msg) + self.charge_type = charge_type + self.status_bits = status_bits self.mol_comment = mol_comment - if len(self.lines)==0: - if self.mol_comment == "": - self.lines = [""]*5 - self.lines[4] = self.status_bits - else: - self.lines = [""]*6 - self.lines[4] = self.status_bits - self.lines[5] = self.mol_comment - + #if len(self.lines)==0: + if self.status_bits != "": + self.lines = [""]*5 + self.lines[4] = self.status_bits + else: + self.lines = [""]*6 + self.lines[4] = self.status_bits + self.lines[5] = self.mol_comment + + self.lines[0] = "@MOLECULE" + self.ind_molecule = [0] + self.lines[1] = self.mol_name + + line = str(self.num_atoms) + if self.num_bonds >= 0: + line += " " + str(self.num_bonds) + + if self.num_subst >= 0: + line += " " + str(self.num_subst) + if self.num_feat >= 0: + line += " " + str(self.num_feat) + + if self.num_sets >= 0: + line += " " + str(self.num_sets) + + self.lines[2] = line + self.lines[3] = self.mol_type + self.lines[4] = self.charge_type - if(len(self.lines) > 2): - - self.lines[1] = str(mol_name) + "\n" - self.lines[0] = str(len(self.lines)-2)+ "\n" + self.lines[5] = self.status_bits + if self.status_bits != "": + self.lines[6] = self.mol_comment + + self.ind_atoms = [len(self.lines)] - else: - raise ValueError( - "Can not set header of an empty MOL2File" - "Use set_structure first, so that number of atoms" - "can be derived from set structure" - ) - def get_structure(self): """ @@ -267,136 +411,242 @@ def get_structure(self): Returns ------- - array : AtomArray + array : AtomArray or AtomArrayStack This :class:`AtomArray` contains the optional ``charge`` annotation and has an associated :class:`BondList`. All other annotation categories, except ``element`` are empty. """ - -# self.check_valid_mol2() + self.get_header() - + atom_array_stack = [] # instantiate atom array and bonds based on number of atoms information - atoms = AtomArray(self.num_atoms) - bonds = BondList(self.num_atoms) - - # - # Iterate through all the atom lines by stating from line after - # @ATOM until line starting with @ is reached. - # All lines in between are assumed to be atom lines and are parsed - # into atoms accodringly. - # - index = self.ind_atoms+1 - i = 0 -# print(" start index :: " +str(index)) - while "@" not in self.lines[index]: - - - line = [x for x in self.lines[index].strip().split(" ") if x != ''] - + + for i in range(len(self.ind_atoms)): + + atoms = AtomArray(self.num_atoms) + + if self.charge_type != "NO_CHARGES": + atoms.add_annotation("charges", float) + + bonds = BondList(self.num_atoms) + + # + # Iterate through all the atom lines by stating from line after + # @ATOM until line starting with @ is reached. + # All lines in between are assumed to be atom lines and are parsed + # into atoms accodringly. + # + index = self.ind_atoms[i]+1 + j = 0 + while "@" not in self.lines[index]: - atom_id = int(line[0]) - atom_name = line[1] - x_coord = float(line[2]) - y_coord = float(line[3]) - z_coord = float(line[4]) - atom_type_sybl = line[5] - subst_id = -1 - subst_name = "" - charge = 0.0 - status_bits = "" - if len(line) > 6: - subst_id = int(line[6]) - if len(line) > 7: - subst_name = line[7] - if len(line) > 8: - charge = float(line[8]) - if len(line) > 9: - status_bits = line[9] + line = [x for x in self.lines[index].strip().split(" ") if x != ''] + - atom_i = Atom( - [x_coord, y_coord, z_coord], + atom_id = int(line[0]) + atom_name = line[1] + x_coord = float(line[2]) + y_coord = float(line[3]) + z_coord = float(line[4]) + atom_type_sybl = line[5] + subst_id = -1 + subst_name = "" + charge = 0.0 + status_bits = "" - ) - atom_i.atom_id = atom_id - if self.charge_type != "NO_CHARGES": - atom_i.charge = charge - atom_i.element = atom_name - atom_i.res_id = subst_id - atom_i.res_name = subst_name + if len(line) > 6: + subst_id = int(line[6]) + if len(line) > 7: + subst_name = line[7] + if len(line) > 8: + charge = float(line[8]) + if len(line) > 9: + status_bits = line[9] + + if self.charge_type != "NO_CHARGES": + atom_i = Atom( + [x_coord, y_coord, z_coord], + charges=charge + ) + else: + atom_i = Atom( + [x_coord, y_coord, z_coord], + ) + + atom_i.atom_id = atom_id + atom_i.element = atom_name + atom_i.res_id = subst_id + atom_i.res_name = subst_name + + atoms[j] = atom_i + index += 1 + j += 1 + + + # + # Iterate through all the bond lines by stating from line after + # @BOND until line starting with @ is reached. + # All lines in between are assumed to be atom lines and are parsed + # into atoms accodringly. + # + index = self.ind_bonds[i] +1 + while index < len(self.lines) and "@" not in self.lines[index]: - atoms[i] = atom_i - index += 1 - i += 1 + line = [x for x in self.lines[index].strip().split(" ") if x != ''] + + bond_id = int(line[0]) + origin_atom_id = int(line[1]) + target_atom_id = int(line[2]) + bond_typ = sybyl_to_biotite_bonds[str(line[3])] + status_bits = "" + + if len(line) > 4: + status_bits = str(line[4]) + + if bond_typ is not None: + bonds.add_bond( + origin_atom_id-1, + target_atom_id-1, + bond_typ + ) + + index += 1 + + atoms.bonds = bonds + atom_array_stack.append(atoms) - - # - # Iterate through all the bond lines by stating from line after - # @BOND until line starting with @ is reached. - # All lines in between are assumed to be atom lines and are parsed - # into atoms accodringly. - # - index = self.ind_bonds +1 - while index < len(self.lines) and "@" not in self.lines[index]: - - line = [x for x in self.lines[index].strip().split(" ") if x != ''] + if len(atom_array_stack) == 1: + return atom_array_stack[0] + else: + return struc.stack(atom_array_stack) + - bond_id = int(line[0]) - origin_atom_id = int(line[1]) - target_atom_id = int(line[2]) - bond_typ = sybyl_to_biotite_bonds[str(line[3])] - status_bits = "" + def append_atom_array(self, atoms): - if len(line) > 4: - status_bits = str(line[4]) + n_atoms = atoms.shape[0] + + self.lines.append("@ATOM") + atoms_has_atom_ids = hasattr(atoms, "atom_id") - if bond_typ is not None: -# print( -# " adding bond ( " -# + str(origin_atom_id-1) + ", " -# + str(target_atom_id-1) + ", " -# + str(bond_typ) -# + ")" -# ) - - bonds.add_bond( - origin_atom_id-1, - target_atom_id-1, - bond_typ - ) - - index += 1 - - - atoms.bond_list = bonds - return atoms - + for i, atom in enumerate(atoms): + atom_id = i+1 + if atoms_has_atom_ids: + atom_id = atom.atom_id + + line = "{:>7}".format(atom_id) + line += " " + atom.element + line += "{:>16.4f}".format(atom.coord[0]) + line += "{:>10.4f}".format(atom.coord[1]) + line += "{:>10.4f}".format(atom.coord[2]) + line += " {:<8}".format( + #get_sybyl_atom_type( + # atom, atoms.bonds, atom_id + #) + "C.ar" + ) + if atom.res_id != 0: + line += str(atom.res_id) + + if atom.res_name != "": + line += " " + str(atom.res_name) + + if self.charge_type != "NO_CHARGES": + line += " " + " {: .{}f}".format(atom.charges, 4) + + self.lines.append(line) - + + self.lines.append("@BOND") + for i, bond in enumerate(atoms.bonds.as_array()): + line = "{:>6}".format(i+1) + line += "{:>6}".format(bond[0]+1) + line += "{:>6}".format(bond[1]+1) + line += "{:>5}".format(biotite_bonds_to_sybyl[bond[2]]) + self.lines.append(line) + + + def set_structure(self, atoms): """ Set the :class:`AtomArray` for the file. Parameters ---------- - array : AtomArray + array : AtomArray or The array to be saved into this file. Must have an associated :class:`BondList`. - """ + """ - n_atoms = atoms.shape[0] - self.lines += [""] * n_atoms + if len(self.lines) < 5: + msg = "Header not valid, less then the minimum amount of lines in" + msg += "header :: " +str(self.lines) + raise ValueError(msg) + + header_lines = self.lines[:self.ind_atoms[0]] + + # since setting new structure delete all previously stored + # structure information if any + self.lines = self.lines[:self.ind_atoms[0]] + if isinstance(atoms, AtomArray): + + + if atoms.bonds is None: + raise BadStructureError( + "Input AtomArrayStack has no associated BondList" + ) + + if self.charge_type != "NO_CHARGES" and atoms.charges is None: + + msg = "Specified charge type " + str(self.charge_type) + ".\n" + msg += "but given AtomArray has no charges" + raise ValueError(msg) + + if self.num_atoms != atoms.shape[0]: + msg = "Mismatch between number of atoms in header [" + msg += str(self.num_atoms) + "] and number of atoms in given" + msg += "AtomArray [" + str(atoms.shape[0]) + "]" + raise ValueError(msg) + + + self.append_atom_array(atoms) + - for i, atom in enumerate(atoms): - line = " " + atom.element - line += " " + "{: .{}f}".format(atom.coord[0], 5) - line += " " + "{: .{}f}".format(atom.coord[1], 5) - line += " " + "{: .{}f}".format(atom.coord[2], 5) - line += " " - self.lines[i+2] = line + elif isinstance(atoms, AtomArrayStack): + + if atoms.bonds is None: + raise BadStructureError( + "Input AtomArrayStack has no associated BondList" + ) + if self.charge_type != "NO_CHARGES" and atoms.charges is None: + + msg = "Specified charge type " + str(self.charge_type) + ".\n" + msg += "but one of given AtomArrays has no charges" + raise ValueError(msg) + + if self.num_atoms != atoms.shape[1]: + msg = "Mismatch between number of atoms in header [" + msg += str(self.num_atoms) + "] and number of atoms in given" + msg += "AtomArrayStack [" + str(atoms.shape[1]) + "]" + raise ValueError(msg) + + n_models = atoms.shape[0] + n_atoms = atoms[0].shape[0] + n_bonds = atoms[0].bonds.as_array().shape[0] + + + for i, atoms_i in enumerate(atoms): + + + if i > 0: + for l in header_lines: + self.lines.append(l) + + self.append_atom_array(atoms_i) + + diff --git a/tests/structure/data/molecules/10000_docked.mol b/tests/structure/data/molecules/10000_docked.mol deleted file mode 100644 index 2f9ebb1de..000000000 --- a/tests/structure/data/molecules/10000_docked.mol +++ /dev/null @@ -1,422 +0,0 @@ -= - OpenBabel08272221323D - - 20 21 0 0 1 0 0 0 0 0999 V2000 - 119.4990 101.0650 20.8750 C 0 0 0 0 0 1 0 0 0 0 0 0 - 119.4350 102.1420 21.9770 C 0 0 2 0 0 3 0 0 0 0 0 0 - 119.2020 101.5020 23.3840 C 0 0 1 0 0 3 0 0 0 0 0 0 - 119.6390 102.3180 24.6640 C 0 0 1 0 0 3 0 0 0 0 0 0 - 120.7430 103.2410 24.3530 N 0 0 0 0 0 0 0 0 0 0 0 0 - 121.5620 103.1630 24.9500 H 0 0 0 0 0 0 0 0 0 0 0 0 - 120.5530 104.4350 23.7520 C 0 0 0 0 0 0 0 0 0 0 0 0 - 121.5970 105.2980 23.8510 O 0 0 0 0 0 0 0 0 0 0 0 0 - 121.2620 106.4230 23.1640 C 0 0 0 0 0 0 0 0 0 0 0 0 - 119.9900 106.3010 22.6540 C 0 0 0 0 0 3 0 0 0 0 0 0 - 122.2830 107.4830 23.0840 C 0 0 0 0 0 1 0 0 0 0 0 0 - 119.5370 104.9950 22.9920 C 0 0 0 0 0 0 0 0 0 0 0 0 - 118.2470 104.3800 22.5600 C 0 0 0 0 0 2 0 0 0 0 0 0 - 118.4230 103.2320 21.5680 C 0 0 0 0 0 2 0 0 0 0 0 0 - 117.8520 100.8950 23.4530 C 0 0 0 0 0 0 0 0 0 0 0 0 - 116.7320 100.4570 23.4640 C 0 0 0 0 0 3 0 0 0 0 0 0 - 118.6440 103.0300 25.6500 C 0 0 0 0 0 2 0 0 0 0 0 0 - 118.9190 103.0440 27.0840 N 0 0 0 0 0 0 0 0 0 0 0 0 - 118.1850 102.5250 27.5670 H 0 0 0 0 0 0 0 0 0 0 0 0 - 118.8240 104.0010 27.4240 H 0 0 0 0 0 0 0 0 0 0 0 0 - 2 1 1 6 0 0 0 - 2 3 1 0 0 0 0 - 3 15 1 1 0 0 0 - 3 4 1 0 0 0 0 - 4 17 1 6 0 0 0 - 5 4 1 0 0 0 0 - 5 6 1 0 0 0 0 - 7 8 1 0 0 0 0 - 7 5 1 0 0 0 0 - 9 8 1 0 0 0 0 - 10 12 1 0 0 0 0 - 10 9 2 0 0 0 0 - 11 9 1 0 0 0 0 - 12 7 2 0 0 0 0 - 13 12 1 0 0 0 0 - 14 2 1 0 0 0 0 - 14 13 1 0 0 0 0 - 15 16 3 0 0 0 0 - 17 18 1 0 0 0 0 - 18 20 1 0 0 0 0 - 18 19 1 0 0 0 0 -M END -$$$$ -= - OpenBabel08272221323D - - 20 21 0 0 1 0 0 0 0 0999 V2000 - 115.7020 100.0510 22.7360 C 0 0 0 0 0 1 0 0 0 0 0 0 - 116.4880 101.3780 22.7420 C 0 0 2 0 0 3 0 0 0 0 0 0 - 115.5360 102.6000 22.9560 C 0 0 1 0 0 3 0 0 0 0 0 0 - 116.1490 103.9390 23.5290 C 0 0 1 0 0 3 0 0 0 0 0 0 - 117.3390 103.6680 24.3530 N 0 0 0 0 0 0 0 0 0 0 0 0 - 117.3240 104.0650 25.2890 H 0 0 0 0 0 0 0 0 0 0 0 0 - 118.5570 103.4280 23.8240 C 0 0 0 0 0 0 0 0 0 0 0 0 - 119.5920 103.5430 24.6960 O 0 0 0 0 0 0 0 0 0 0 0 0 - 120.7300 103.2310 24.0200 C 0 0 0 0 0 0 0 0 0 0 0 0 - 120.4360 102.9510 22.7060 C 0 0 0 0 0 3 0 0 0 0 0 0 - 121.9850 103.2290 24.7950 C 0 0 0 0 0 1 0 0 0 0 0 0 - 119.0210 103.0320 22.5780 C 0 0 0 0 0 0 0 0 0 0 0 0 - 118.2350 102.7060 21.3510 C 0 0 0 0 0 2 0 0 0 0 0 0 - 117.3840 101.4460 21.4890 C 0 0 0 0 0 2 0 0 0 0 0 0 - 114.6430 102.7640 21.7860 C 0 0 0 0 0 0 0 0 0 0 0 0 - 113.8780 102.9450 20.8760 C 0 0 0 0 0 3 0 0 0 0 0 0 - 116.4030 105.2360 22.6810 C 0 0 0 0 0 2 0 0 0 0 0 0 - 115.7260 106.4830 23.0290 N 0 0 0 0 0 0 0 0 0 0 0 0 - 114.7800 106.2690 23.3450 H 0 0 0 0 0 0 0 0 0 0 0 0 - 115.5960 107.0310 22.1780 H 0 0 0 0 0 0 0 0 0 0 0 0 - 2 1 1 6 0 0 0 - 2 3 1 0 0 0 0 - 3 15 1 6 0 0 0 - 3 4 1 0 0 0 0 - 4 17 1 6 0 0 0 - 4 5 1 0 0 0 0 - 5 6 1 0 0 0 0 - 7 5 1 0 0 0 0 - 7 8 1 0 0 0 0 - 9 8 1 0 0 0 0 - 9 11 1 0 0 0 0 - 10 9 2 0 0 0 0 - 12 10 1 0 0 0 0 - 12 7 2 0 0 0 0 - 13 14 1 0 0 0 0 - 13 12 1 0 0 0 0 - 14 2 1 0 0 0 0 - 16 15 3 0 0 0 0 - 17 18 1 0 0 0 0 - 18 19 1 0 0 0 0 - 20 18 1 0 0 0 0 -M END -$$$$ -= - OpenBabel08272221323D - - 20 21 0 0 1 0 0 0 0 0999 V2000 - 114.0540 102.4250 21.9980 C 0 0 0 0 0 1 0 0 0 0 0 0 - 115.5770 102.3110 22.2110 C 0 0 2 0 0 3 0 0 0 0 0 0 - 116.0470 103.1800 23.4230 C 0 0 1 0 0 3 0 0 0 0 0 0 - 117.4030 102.8010 24.1400 C 0 0 1 0 0 3 0 0 0 0 0 0 - 117.6970 101.3650 23.9930 N 0 0 0 0 0 0 0 0 0 0 0 0 - 117.8810 100.8640 24.8580 H 0 0 0 0 0 0 0 0 0 0 0 0 - 118.2320 100.8380 22.8710 C 0 0 0 0 0 0 0 0 0 0 0 0 - 118.7570 99.5940 23.0190 O 0 0 0 0 0 0 0 0 0 0 0 0 - 119.2110 99.1970 21.8000 C 0 0 0 0 0 0 0 0 0 0 0 0 - 119.0130 100.1960 20.8750 C 0 0 0 0 0 3 0 0 0 0 0 0 - 119.7710 97.8360 21.7080 C 0 0 0 0 0 1 0 0 0 0 0 0 - 118.3380 101.2510 21.5510 C 0 0 0 0 0 0 0 0 0 0 0 0 - 117.8260 102.5040 20.9230 C 0 0 0 0 0 2 0 0 0 0 0 0 - 116.3020 102.5850 20.8780 C 0 0 0 0 0 2 0 0 0 0 0 0 - 115.8750 104.6190 23.1170 C 0 0 0 0 0 0 0 0 0 0 0 0 - 115.7780 105.7780 22.8090 C 0 0 0 0 0 3 0 0 0 0 0 0 - 118.7420 103.6110 23.9990 C 0 0 0 0 0 2 0 0 0 0 0 0 - 119.4710 104.0330 25.1920 N 0 0 0 0 0 0 0 0 0 0 0 0 - 118.8000 104.2950 25.9150 H 0 0 0 0 0 0 0 0 0 0 0 0 - 119.9700 104.8960 24.9790 H 0 0 0 0 0 0 0 0 0 0 0 0 - 2 1 1 6 0 0 0 - 2 3 1 0 0 0 0 - 3 15 1 6 0 0 0 - 3 4 1 0 0 0 0 - 4 17 1 6 0 0 0 - 5 4 1 0 0 0 0 - 5 6 1 0 0 0 0 - 7 8 1 0 0 0 0 - 7 5 1 0 0 0 0 - 9 8 1 0 0 0 0 - 10 12 1 0 0 0 0 - 10 9 2 0 0 0 0 - 11 9 1 0 0 0 0 - 12 7 2 0 0 0 0 - 13 12 1 0 0 0 0 - 14 13 1 0 0 0 0 - 14 2 1 0 0 0 0 - 16 15 3 0 0 0 0 - 17 18 1 0 0 0 0 - 18 19 1 0 0 0 0 - 20 18 1 0 0 0 0 -M END -$$$$ -= - OpenBabel08272221323D - - 20 21 0 0 1 0 0 0 0 0999 V2000 - 116.5070 103.3700 20.8750 C 0 0 0 0 0 1 0 0 0 0 0 0 - 117.5500 102.6260 21.7330 C 0 0 2 0 0 3 0 0 0 0 0 0 - 117.7100 101.1400 21.2720 C 0 0 1 0 0 3 0 0 0 0 0 0 - 119.0530 100.3850 21.6190 C 0 0 1 0 0 3 0 0 0 0 0 0 - 120.1740 101.3300 21.7520 N 0 0 0 0 0 0 0 0 0 0 0 0 - 120.9930 101.1230 21.1860 H 0 0 0 0 0 0 0 0 0 0 0 0 - 120.3880 102.0610 22.8670 C 0 0 0 0 0 0 0 0 0 0 0 0 - 121.6280 102.6050 22.9650 O 0 0 0 0 0 0 0 0 0 0 0 0 - 121.6620 103.3360 24.1110 C 0 0 0 0 0 0 0 0 0 0 0 0 - 120.4600 103.2340 24.7710 C 0 0 0 0 0 3 0 0 0 0 0 0 - 122.9070 104.0760 24.3920 C 0 0 0 0 0 1 0 0 0 0 0 0 - 119.6080 102.4430 23.9490 C 0 0 0 0 0 0 0 0 0 0 0 0 - 118.1690 102.1480 24.2120 C 0 0 0 0 0 2 0 0 0 0 0 0 - 117.2190 102.8250 23.2260 C 0 0 0 0 0 2 0 0 0 0 0 0 - 116.4680 100.3830 21.5500 C 0 0 0 0 0 0 0 0 0 0 0 0 - 115.4700 99.7810 21.8490 C 0 0 0 0 0 3 0 0 0 0 0 0 - 119.1910 99.2740 22.7210 C 0 0 0 0 0 2 0 0 0 0 0 0 - 119.0140 97.8670 22.3700 N 0 0 0 0 0 0 0 0 0 0 0 0 - 119.4640 97.2900 23.0800 H 0 0 0 0 0 0 0 0 0 0 0 0 - 119.5370 97.6780 21.5140 H 0 0 0 0 0 0 0 0 0 0 0 0 - 2 1 1 6 0 0 0 - 2 14 1 0 0 0 0 - 3 15 1 1 0 0 0 - 3 4 1 0 0 0 0 - 3 2 1 0 0 0 0 - 4 5 1 0 0 0 0 - 4 17 1 1 0 0 0 - 5 7 1 0 0 0 0 - 6 5 1 0 0 0 0 - 7 8 1 0 0 0 0 - 7 12 2 0 0 0 0 - 8 9 1 0 0 0 0 - 9 11 1 0 0 0 0 - 9 10 2 0 0 0 0 - 12 13 1 0 0 0 0 - 12 10 1 0 0 0 0 - 14 13 1 0 0 0 0 - 15 16 3 0 0 0 0 - 18 17 1 0 0 0 0 - 18 19 1 0 0 0 0 - 20 18 1 0 0 0 0 -M END -$$$$ -= - OpenBabel08272221323D - - 20 21 0 0 1 0 0 0 0 0999 V2000 - 116.8190 104.4660 23.1950 C 0 0 0 0 0 1 0 0 0 0 0 0 - 118.0090 103.5100 22.9750 C 0 0 2 0 0 3 0 0 0 0 0 0 - 119.2690 103.9800 23.7730 C 0 0 1 0 0 3 0 0 0 0 0 0 - 120.3760 102.9100 24.1280 C 0 0 1 0 0 3 0 0 0 0 0 0 - 119.7970 101.5590 24.2240 N 0 0 0 0 0 0 0 0 0 0 0 0 - 119.9930 101.0580 25.0860 H 0 0 0 0 0 0 0 0 0 0 0 0 - 119.5220 100.8020 23.1410 C 0 0 0 0 0 0 0 0 0 0 0 0 - 119.3280 99.4830 23.4010 O 0 0 0 0 0 0 0 0 0 0 0 0 - 119.0230 98.8770 22.2220 C 0 0 0 0 0 0 0 0 0 0 0 0 - 119.0560 99.7940 21.1980 C 0 0 0 0 0 3 0 0 0 0 0 0 - 118.7070 97.4370 22.2760 C 0 0 0 0 0 1 0 0 0 0 0 0 - 119.3360 101.0580 21.7910 C 0 0 0 0 0 0 0 0 0 0 0 0 - 119.3680 102.3690 21.0770 C 0 0 0 0 0 2 0 0 0 0 0 0 - 118.2210 103.3000 21.4620 C 0 0 0 0 0 2 0 0 0 0 0 0 - 119.7780 105.2560 23.2200 C 0 0 0 0 0 0 0 0 0 0 0 0 - 120.1940 106.3190 22.8400 C 0 0 0 0 0 3 0 0 0 0 0 0 - 121.7780 102.8130 23.4270 C 0 0 0 0 0 2 0 0 0 0 0 0 - 122.8990 103.6130 23.9160 N 0 0 0 0 0 0 0 0 0 0 0 0 - 123.5390 103.0060 24.4280 H 0 0 0 0 0 0 0 0 0 0 0 0 - 122.5490 104.2680 24.6150 H 0 0 0 0 0 0 0 0 0 0 0 0 - 2 1 1 6 0 0 0 - 2 3 1 0 0 0 0 - 3 15 1 6 0 0 0 - 3 4 1 0 0 0 0 - 4 17 1 6 0 0 0 - 4 5 1 0 0 0 0 - 5 6 1 0 0 0 0 - 7 8 1 0 0 0 0 - 7 5 1 0 0 0 0 - 9 11 1 0 0 0 0 - 9 8 1 0 0 0 0 - 10 12 1 0 0 0 0 - 10 9 2 0 0 0 0 - 12 7 2 0 0 0 0 - 13 14 1 0 0 0 0 - 13 12 1 0 0 0 0 - 14 2 1 0 0 0 0 - 16 15 3 0 0 0 0 - 17 18 1 0 0 0 0 - 18 19 1 0 0 0 0 - 18 20 1 0 0 0 0 -M END -$$$$ -= - OpenBabel08272221323D - - 20 21 0 0 1 0 0 0 0 0999 V2000 - 118.3830 105.7440 22.1080 C 0 0 0 0 0 1 0 0 0 0 0 0 - 118.6990 104.3500 22.6880 C 0 0 2 0 0 3 0 0 0 0 0 0 - 119.5220 104.4590 24.0130 C 0 0 1 0 0 3 0 0 0 0 0 0 - 119.4790 103.2480 25.0270 C 0 0 1 0 0 3 0 0 0 0 0 0 - 118.2200 102.4930 24.8990 N 0 0 0 0 0 0 0 0 0 0 0 0 - 117.6990 102.3600 25.7620 H 0 0 0 0 0 0 0 0 0 0 0 0 - 118.0070 101.5840 23.9240 C 0 0 0 0 0 0 0 0 0 0 0 0 - 116.9640 100.7430 24.1460 O 0 0 0 0 0 0 0 0 0 0 0 0 - 116.8620 99.9280 23.0620 C 0 0 0 0 0 0 0 0 0 0 0 0 - 117.8580 100.2170 22.1590 C 0 0 0 0 0 3 0 0 0 0 0 0 - 115.7460 98.9640 23.0570 C 0 0 0 0 0 1 0 0 0 0 0 0 - 118.5820 101.3220 22.6890 C 0 0 0 0 0 0 0 0 0 0 0 0 - 119.6930 102.0480 22.0050 C 0 0 0 0 0 2 0 0 0 0 0 0 - 119.3250 103.4700 21.5870 C 0 0 0 0 0 2 0 0 0 0 0 0 - 120.8710 105.0010 23.7330 C 0 0 0 0 0 0 0 0 0 0 0 0 - 121.9590 105.4860 23.5640 C 0 0 0 0 0 3 0 0 0 0 0 0 - 120.6570 102.2350 25.2550 C 0 0 0 0 0 2 0 0 0 0 0 0 - 121.4160 102.2640 26.5030 N 0 0 0 0 0 0 0 0 0 0 0 0 - 122.4110 102.2010 26.2860 H 0 0 0 0 0 0 0 0 0 0 0 0 - 121.2120 101.4120 27.0260 H 0 0 0 0 0 0 0 0 0 0 0 0 - 2 1 1 6 0 0 0 - 2 3 1 0 0 0 0 - 3 15 1 6 0 0 0 - 3 4 1 0 0 0 0 - 4 17 1 6 0 0 0 - 5 4 1 0 0 0 0 - 5 6 1 0 0 0 0 - 7 8 1 0 0 0 0 - 7 5 1 0 0 0 0 - 9 8 1 0 0 0 0 - 10 12 1 0 0 0 0 - 10 9 2 0 0 0 0 - 11 9 1 0 0 0 0 - 12 7 2 0 0 0 0 - 13 12 1 0 0 0 0 - 14 13 1 0 0 0 0 - 14 2 1 0 0 0 0 - 16 15 3 0 0 0 0 - 17 18 1 0 0 0 0 - 18 20 1 0 0 0 0 - 19 18 1 0 0 0 0 -M END -$$$$ -= - OpenBabel08272221323D - - 20 21 0 0 1 0 0 0 0 0999 V2000 - 119.4170 103.2430 26.1760 C 0 0 0 0 0 1 0 0 0 0 0 0 - 119.0830 102.8690 24.7170 C 0 0 2 0 0 3 0 0 0 0 0 0 - 120.1910 101.9560 24.0980 C 0 0 1 0 0 3 0 0 0 0 0 0 - 119.8100 101.0390 22.8700 C 0 0 1 0 0 3 0 0 0 0 0 0 - 118.3760 100.6990 22.8860 N 0 0 0 0 0 0 0 0 0 0 0 0 - 118.1600 99.7070 22.8320 H 0 0 0 0 0 0 0 0 0 0 0 0 - 117.4180 101.5440 22.4530 C 0 0 0 0 0 0 0 0 0 0 0 0 - 116.2130 100.9670 22.2100 O 0 0 0 0 0 0 0 0 0 0 0 0 - 115.3590 101.9530 21.8260 C 0 0 0 0 0 0 0 0 0 0 0 0 - 116.0190 103.1590 21.7860 C 0 0 0 0 0 3 0 0 0 0 0 0 - 113.9610 101.5600 21.5690 C 0 0 0 0 0 1 0 0 0 0 0 0 - 117.3480 102.9120 22.2350 C 0 0 0 0 0 0 0 0 0 0 0 0 - 118.4010 103.9470 22.4530 C 0 0 0 0 0 2 0 0 0 0 0 0 - 118.7590 104.1510 23.9230 C 0 0 0 0 0 2 0 0 0 0 0 0 - 121.4550 102.7130 23.9520 C 0 0 0 0 0 0 0 0 0 0 0 0 - 122.4660 103.3630 23.8980 C 0 0 0 0 0 3 0 0 0 0 0 0 - 120.2510 101.3070 21.3860 C 0 0 0 0 0 2 0 0 0 0 0 0 - 121.4920 100.7310 20.8750 N 0 0 0 0 0 0 0 0 0 0 0 0 - 122.2170 100.8250 21.5860 H 0 0 0 0 0 0 0 0 0 0 0 0 - 121.8180 101.3020 20.0960 H 0 0 0 0 0 0 0 0 0 0 0 0 - 2 1 1 1 0 0 0 - 3 15 1 6 0 0 0 - 3 2 1 0 0 0 0 - 4 17 1 6 0 0 0 - 4 5 1 0 0 0 0 - 4 3 1 0 0 0 0 - 6 5 1 0 0 0 0 - 7 5 1 0 0 0 0 - 8 7 1 0 0 0 0 - 9 8 1 0 0 0 0 - 10 9 2 0 0 0 0 - 10 12 1 0 0 0 0 - 11 9 1 0 0 0 0 - 12 7 2 0 0 0 0 - 12 13 1 0 0 0 0 - 13 14 1 0 0 0 0 - 14 2 1 0 0 0 0 - 16 15 3 0 0 0 0 - 18 17 1 0 0 0 0 - 18 19 1 0 0 0 0 - 20 18 1 0 0 0 0 -M END -$$$$ -= - OpenBabel08272221323D - - 20 21 0 0 1 0 0 0 0 0999 V2000 - 115.7920 103.4600 24.1910 C 0 0 0 0 0 1 0 0 0 0 0 0 - 116.6880 102.5430 23.3330 C 0 0 2 0 0 3 0 0 0 0 0 0 - 118.1790 103.0130 23.3680 C 0 0 1 0 0 3 0 0 0 0 0 0 - 119.3070 101.9580 23.0370 C 0 0 1 0 0 3 0 0 0 0 0 0 - 118.8670 100.5910 23.3610 N 0 0 0 0 0 0 0 0 0 0 0 0 - 119.4890 100.0620 23.9670 H 0 0 0 0 0 0 0 0 0 0 0 0 - 118.0630 99.8690 22.5520 C 0 0 0 0 0 0 0 0 0 0 0 0 - 118.0360 98.5370 22.8140 O 0 0 0 0 0 0 0 0 0 0 0 0 - 117.1560 97.9690 21.9460 C 0 0 0 0 0 0 0 0 0 0 0 0 - 116.6440 98.9260 21.1020 C 0 0 0 0 0 3 0 0 0 0 0 0 - 116.9180 96.5210 22.0920 C 0 0 0 0 0 1 0 0 0 0 0 0 - 117.1930 100.1730 21.5160 C 0 0 0 0 0 0 0 0 0 0 0 0 - 116.8430 101.5100 20.9530 C 0 0 0 0 0 2 0 0 0 0 0 0 - 116.0710 102.3970 21.9270 C 0 0 0 0 0 2 0 0 0 0 0 0 - 118.3190 104.3220 22.6890 C 0 0 0 0 0 0 0 0 0 0 0 0 - 118.3600 105.3970 22.1510 C 0 0 0 0 0 3 0 0 0 0 0 0 - 120.1290 101.9230 21.6990 C 0 0 0 0 0 2 0 0 0 0 0 0 - 121.3880 101.1840 21.6310 N 0 0 0 0 0 0 0 0 0 0 0 0 - 121.3520 100.5430 20.8380 H 0 0 0 0 0 0 0 0 0 0 0 0 - 121.4520 100.5780 22.4490 H 0 0 0 0 0 0 0 0 0 0 0 0 - 2 3 1 0 0 0 0 - 2 1 1 1 0 0 0 - 3 15 1 6 0 0 0 - 4 17 1 6 0 0 0 - 4 5 1 0 0 0 0 - 4 3 1 0 0 0 0 - 5 6 1 0 0 0 0 - 7 8 1 0 0 0 0 - 7 5 1 0 0 0 0 - 9 11 1 0 0 0 0 - 9 8 1 0 0 0 0 - 10 12 1 0 0 0 0 - 10 9 2 0 0 0 0 - 12 7 2 0 0 0 0 - 13 12 1 0 0 0 0 - 13 14 1 0 0 0 0 - 14 2 1 0 0 0 0 - 16 15 3 0 0 0 0 - 18 17 1 0 0 0 0 - 18 20 1 0 0 0 0 - 19 18 1 0 0 0 0 -M END -$$$$ -= - OpenBabel08272221323D - - 20 21 0 0 1 0 0 0 0 0999 V2000 - 119.7310 99.9290 23.0800 C 0 0 0 0 0 1 0 0 0 0 0 0 - 119.0280 101.3010 23.1200 C 0 0 2 0 0 3 0 0 0 0 0 0 - 120.0630 102.4720 23.0510 C 0 0 1 0 0 3 0 0 0 0 0 0 - 119.5700 103.8820 22.5390 C 0 0 1 0 0 3 0 0 0 0 0 0 - 118.4220 103.7440 21.6270 N 0 0 0 0 0 0 0 0 0 0 0 0 - 118.5210 104.2010 20.7240 H 0 0 0 0 0 0 0 0 0 0 0 0 - 117.1600 103.5480 22.0630 C 0 0 0 0 0 0 0 0 0 0 0 0 - 116.1920 103.7880 21.1400 O 0 0 0 0 0 0 0 0 0 0 0 0 - 114.9960 103.5050 21.7220 C 0 0 0 0 0 0 0 0 0 0 0 0 - 115.1870 103.1180 23.0290 C 0 0 0 0 0 3 0 0 0 0 0 0 - 113.7960 103.6350 20.8750 C 0 0 0 0 0 1 0 0 0 0 0 0 - 116.5940 103.1000 23.2480 C 0 0 0 0 0 0 0 0 0 0 0 0 - 117.2770 102.6430 24.4940 C 0 0 0 0 0 2 0 0 0 0 0 0 - 118.0580 101.3430 24.3180 C 0 0 0 0 0 2 0 0 0 0 0 0 - 120.8860 102.4980 24.2820 C 0 0 0 0 0 0 0 0 0 0 0 0 - 121.5210 102.5840 25.3000 C 0 0 0 0 0 3 0 0 0 0 0 0 - 119.3400 105.1330 23.4600 C 0 0 0 0 0 2 0 0 0 0 0 0 - 120.3530 106.1830 23.5370 N 0 0 0 0 0 0 0 0 0 0 0 0 - 121.1760 105.8870 23.0120 H 0 0 0 0 0 0 0 0 0 0 0 0 - 120.6750 106.2530 24.5020 H 0 0 0 0 0 0 0 0 0 0 0 0 - 2 1 1 1 0 0 0 - 2 14 1 0 0 0 0 - 3 2 1 0 0 0 0 - 3 15 1 1 0 0 0 - 4 3 1 0 0 0 0 - 4 17 1 1 0 0 0 - 5 7 1 0 0 0 0 - 5 4 1 0 0 0 0 - 6 5 1 0 0 0 0 - 7 12 2 0 0 0 0 - 8 9 1 0 0 0 0 - 8 7 1 0 0 0 0 - 9 10 2 0 0 0 0 - 10 12 1 0 0 0 0 - 11 9 1 0 0 0 0 - 12 13 1 0 0 0 0 - 14 13 1 0 0 0 0 - 15 16 3 0 0 0 0 - 17 18 1 0 0 0 0 - 18 20 1 0 0 0 0 - 19 18 1 0 0 0 0 -M END diff --git a/tests/structure/data/molecules/10000_docked_single_state.mol2 b/tests/structure/data/molecules/10000_docked_single_state.mol2 new file mode 100644 index 000000000..f00dfd134 --- /dev/null +++ b/tests/structure/data/molecules/10000_docked_single_state.mol2 @@ -0,0 +1,49 @@ +@MOLECULE += + 20 21 0 0 0 +SMALL +GASTEIGER + +@ATOM + 1 C 116.5070 103.3700 20.8750 C.3 1 UNL1 0.0090 + 2 C 117.5500 102.6260 21.7330 C.3 1 UNL1 0.0030 + 3 C 117.7100 101.1400 21.2720 C.3 1 UNL1 0.0880 + 4 C 119.0530 100.3850 21.6190 C.3 1 UNL1 0.1020 + 5 N 120.1740 101.3300 21.7520 N.pl3 1 UNL1 -0.3100 + 6 H 120.9930 101.1230 21.1860 H 1 UNL1 0.1490 + 7 C 120.3880 102.0610 22.8670 C.2 1 UNL1 0.1900 + 8 O 121.6280 102.6050 22.9650 O.2 1 UNL1 -0.4460 + 9 C 121.6620 103.3360 24.1110 C.2 1 UNL1 0.1050 + 10 C 120.4600 103.2340 24.7710 C.2 1 UNL1 0.0500 + 11 C 122.9070 104.0760 24.3920 C.3 1 UNL1 0.0860 + 12 C 119.6080 102.4430 23.9490 C.2 1 UNL1 0.0130 + 13 C 118.1690 102.1480 24.2120 C.3 1 UNL1 0.0400 + 14 C 117.2190 102.8250 23.2260 C.3 1 UNL1 0.0090 + 15 C 116.4680 100.3830 21.5500 C.1 1 UNL1 -0.1000 + 16 C 115.4700 99.7810 21.8490 C.1 1 UNL1 0.0040 + 17 C 119.1910 99.2740 22.7210 C.3 1 UNL1 0.1010 + 18 N 119.0140 97.8670 22.3700 N.3 1 UNL1 -0.3280 + 19 H 119.4640 97.2900 23.0800 H 1 UNL1 0.1180 + 20 H 119.5370 97.6780 21.5140 H 1 UNL1 0.1180 +@BOND + 1 1 2 1 + 2 6 5 1 + 3 3 15 1 + 4 3 4 1 + 5 3 2 1 + 6 20 18 1 + 7 15 16 3 + 8 4 5 1 + 9 4 17 1 + 10 2 14 1 + 11 5 7 1 + 12 18 17 1 + 13 18 19 1 + 14 7 8 1 + 15 7 12 2 + 16 8 9 1 + 17 14 13 1 + 18 12 13 1 + 19 12 10 1 + 20 9 11 1 + 21 9 10 2 diff --git a/tests/structure/test_mol2.py b/tests/structure/test_mol2.py new file mode 100644 index 000000000..353669ec3 --- /dev/null +++ b/tests/structure/test_mol2.py @@ -0,0 +1,148 @@ +# This source code is part of the Biotite package and is distributed +# under the 3-Clause BSD License. Please see 'LICENSE.rst' for further +# information. + +import itertools +import datetime +from tempfile import TemporaryFile +import glob +from os.path import join, split, splitext +import pytest +import numpy as np +import biotite.structure as struc +from biotite.structure import Atom, AtomArray, AtomArrayStack, BondList +import biotite.structure.info as info +import biotite.structure.io.mol2 as mol2 +from ..util import data_dir + +def draw_random_struct(N_atoms, charges=False): + + arr= struc.array( + [ + Atom( + [ + float(np.random.rand()) for _ in range(3) + ], + element="C", + charges=np.random.rand() + ) for _ in range(N_atoms) + ] + ) + + arr.bonds=BondList(N_atoms) + + for i in range(1,N_atoms): + arr.bonds.add_bond(i-1, i, 1) + + + return arr + + + + +def test_header_conversion(): + """ + Write known example data to the header of a Mol2 file and expect + to retrieve the same information when reading the file again. + """ + ref_names = ( + "Testxyz", "JD", "Biotite", + str(datetime.datetime.now().replace(second=0, microsecond=0)), + "3D", "Lorem", "Ipsum", "123", "Lorem ipsum dolor sit amet" + ) + + ref_nums = np.random.randint(1, 10, len(ref_names)) + ref_mol_type = [ + mol2.supported_mol_types[x] for x in np.random.randint( + 0,5,len(ref_names) + ).astype(int) + ] + + ref_charge_type = [ + mol2.supported_charge_types[x] for x in np.random.randint( + 0,12,len(ref_names) + ).astype(int) + ] + + + # draw this many random Atoms for structure + # necessary as header should only exist for a non empty XYZFile + N_sample = 10 + + for i, name in enumerate(ref_names): + mol2_file = mol2.MOL2File() + mol2_file.set_header( + mol_name = name, + num_atoms = ref_nums[i], + mol_type = ref_mol_type[i], + charge_type = ref_charge_type[i] + ) + # need to set some structure for file writing + rand_struct = draw_random_struct( + ref_nums[i], + charges = (ref_charge_type[i] != "NO_CHARGES"), + ) + mol2_file.set_structure(rand_struct) + + + temp = TemporaryFile("w+") + mol2_file.write(temp) + + temp.seek(0) + mol2_file = mol2.MOL2File.read(temp) + test_header = mol2_file.get_header() + temp.close() + + assert len(test_header) > 0 + assert test_header[0] == name + assert test_header[1] == ref_nums[i] + assert test_header[6] == ref_mol_type[i] + assert test_header[7] == ref_charge_type[i] + + +@pytest.mark.parametrize( + "path", + glob.glob(join(data_dir("structure"), "molecules", "*.mol2")) +) +def test_structure_conversion(path): + """ + After reading a mol2 file, writing the structure back to a new file + and reading it again should give the same structure. + """ + mol2_file = mol2.MOL2File.read(path) + + ref_header = mol2_file.get_header() + ref_atoms = mol2.get_structure(mol2_file) + + + mol2_file = mol2.MOL2File() + mol2_file.set_header( + ref_header[0], ref_header[1], ref_header[6], ref_header[7] + ) + mol2.set_structure(mol2_file, ref_atoms) + temp = TemporaryFile("w+") + mol2_file.write(temp) + + + temp.seek(0) + mol2_file = mol2.MOL2File.read(temp) + test_atoms = mol2.get_structure(mol2_file) + temp.close() + + + instance_cond = isinstance(ref_atoms, AtomArray) + instance_cond = instance_cond | isinstance(ref_atoms, AtomArrayStack) + assert instance_cond + + if isinstance(ref_atoms, AtomArray): + # actually no idea why we can assume that this works + # since floating point comparison is not safe! + assert test_atoms == ref_atoms + assert test_atoms.bonds == ref_atoms.bonds + elif isinstance(ref_atoms, AtomArrayStack): + for i in range(ref_atoms.shape[0]): + assert np.all(np.isclose(ref_atoms[i].coord, test_atoms[i].coord)) + assert np.all(ref_atoms[i].element == test_atoms[i].element) + assert np.all(ref_atoms.bonds == test_atoms.bonds) + + From 9d613264c88539cc1711937d1d7390e363bfd6e6 Mon Sep 17 00:00:00 2001 From: Benjamin Mayer Date: Tue, 30 Aug 2022 21:36:31 +0200 Subject: [PATCH 08/37] mol2 tests working again --- src/biotite/structure/io/mol2/file.py | 175 +++++++++++++++++++++----- tests/structure/test_mol2.py | 71 +++++++++-- 2 files changed, 203 insertions(+), 43 deletions(-) diff --git a/src/biotite/structure/io/mol2/file.py b/src/biotite/structure/io/mol2/file.py index 4fbe5835c..92d489c99 100644 --- a/src/biotite/structure/io/mol2/file.py +++ b/src/biotite/structure/io/mol2/file.py @@ -81,24 +81,67 @@ def get_sybyl_atom_type(atom, bonds, atom_id): to the sybyl atom types. """ - if atom.element == "C": atom_bonds, types = bonds.get_bonds(atom_id) - - - + if 5 in types: return "C.ar" else: - if len(atom_bonds) == 2: - return "C.1" - elif len(atom_bonds) == 3: - return "C.2" - elif len(atom_bonds) == 4: - return "C.3" - else: - msg = "No supported sybyl Atom type for Atom " + str(atom) - raise ValueError(msg) +# if len(atom_bonds) == 2: +# return "C.1" +# elif len(atom_bonds) == 3: +# return "C.2" +# elif len(atom_bonds) == 4: +# return "C.3" +# else: +# msg = "No supported sybyl Atom type for Atom " + str(atom) +# raise ValueError(msg) + return "C.3" + if atom.element == "N": + atom_bonds, types = bonds.get_bonds(atom_id) + + if 5 in types: + return "N.ar" + else: + return "N.3" + + if atom.element == "O": + return "O.3" + + if atom.element == "S": + return "S.3" + if atom.element == "P": + return "P.3" + if atom.element == "F": + return "F" + if atom.element == "H": + return "H" + if atom.element == "Li": + return "Li" + if atom.element == "Na": + return "Na" + if atom.element == "Mg": + return "Mg" + if atom.element == "Al": + return "Al" + if atom.element == "Si": + return "Si" + if atom.element == "K": + return "K" + if atom.element == "Ca": + return "Ca" + if atom.element == "Cr": + return "Cr.th" + if atom.element == "Mn": + return "Mn" + if atom.element == "Fe": + return "Fe" + if atom.element == "Co": + return "Co.oh" + if atom.element == "Cu": + return "Cu" + + @@ -170,6 +213,7 @@ def __init__(self): self.charge_type = "" self.status_bits = "" self.mol_comment = "" + self.charges = None self.ind_molecule = -1 self.ind_atoms = -1 @@ -282,10 +326,9 @@ def get_header(self): self.mol_comment = self.lines[self.ind_molecule[0]+6] return ( - self.mol_name, - self.num_atoms, self.num_bonds, self.num_subst, - self.num_feat, self.num_sets, - self.mol_type, self.charge_type, self.status_bits, + self.mol_name, self.num_atoms, self.mol_type, + self.charge_type, self.num_bonds, self.num_subst, + self.num_feat, self.num_sets, self.status_bits, self.mol_comment ) @@ -340,17 +383,32 @@ def set_header(self, mol_name, num_atoms, mol_type, charge_type, self.mol_name = mol_name self.num_atoms = num_atoms - self.num_bonds = num_bonds - self.num_subst = num_subst - self.num_feat = num_feat - self.num_sets = num_sets + + if num_bonds >= 0: + self.num_bonds = num_bonds + if num_subst >= 0: + self.num_subst = num_subst + + if num_feat >= 0: + self.num_feat = num_feat + + if num_sets >=0: + self.num_sets = num_sets + + header = [ + mol_name, num_atoms, mol_type, charge_type, + num_bonds, num_subst, num_feat, num_sets, + status_bits, mol_comment + ] + print(header) if mol_type != "": cond = mol_type in supported_mol_types if not cond: msg = "The specified molecule type ["+str(charge_type) +"] \n" msg += " is not among the supported molecule types: \n" - msg += "" + str(supported_mol_types) + "\n" + msg += "" + str(supported_mol_types) + "\n" + msg += "header :: " + str(header) + " \n" raise ValueError(msg) self.mol_type = mol_type @@ -427,7 +485,21 @@ def get_structure(self): atoms = AtomArray(self.num_atoms) if self.charge_type != "NO_CHARGES": - atoms.add_annotation("charges", float) + atoms.add_annotation("charge", int) + if self.charges is None: + self.charges = np.zeros( + self.num_atoms + ).reshape( + (1, self.num_atoms) + ) + + else: + self.charges = np.vstack( + ( + self.charges, + np.zeros(self.num_atoms) + ) + ) bonds = BondList(self.num_atoms) @@ -465,10 +537,11 @@ def get_structure(self): if len(line) > 9: status_bits = line[9] - if self.charge_type != "NO_CHARGES": + if self.charge_type != "NO_CHARGES": + self.charges[i][j] = charge atom_i = Atom( [x_coord, y_coord, z_coord], - charges=charge + charge=int(np.rint(charge)) ) else: atom_i = Atom( @@ -540,12 +613,12 @@ def append_atom_array(self, atoms): line += " " + atom.element line += "{:>16.4f}".format(atom.coord[0]) line += "{:>10.4f}".format(atom.coord[1]) - line += "{:>10.4f}".format(atom.coord[2]) + line += "{:>10.4f}".format(atom.coord[2]) line += " {:<8}".format( - #get_sybyl_atom_type( - # atom, atoms.bonds, atom_id - #) - "C.ar" + get_sybyl_atom_type( + atom, atoms.bonds, i + ) +# "C.ar" ) if atom.res_id != 0: line += str(atom.res_id) @@ -554,7 +627,15 @@ def append_atom_array(self, atoms): line += " " + str(atom.res_name) if self.charge_type != "NO_CHARGES": - line += " " + " {: .{}f}".format(atom.charges, 4) + line += " " + cond = not self.charges is None + cond = cond and len(self.charges) != 0 + cond = cond and len(self.charges[i]) !=0 + if cond: + line += " {: .{}f}".format(self.charges[i][j], 4) + else: + line += " {: .{}f}".format(atom.charge, 4) + self.lines.append(line) @@ -566,7 +647,35 @@ def append_atom_array(self, atoms): line += "{:>6}".format(bond[1]+1) line += "{:>5}".format(biotite_bonds_to_sybyl[bond[2]]) self.lines.append(line) + + def set_charges(self, charges): + """ + Set a partial charges array that will be used for writing the mol2 file. + + """ + +# if not self.charges is None and self.charges.shape != charges.shape: +# msg = "Can only assign charges of same shape as already within" +# msg += "Mol2 file +# raise ValueError(msg) +# +# +# if self.num_atoms != -1: + + self.charges = charges + + def get_charges(self): + + if self.charge_type == "NO_CHARGES": + raise ValueError( + "Can not get charges from mol2 file where NO_CHARGES set." + ) + + if self.charges is None: + _ = self.get_structure() + + return self.charges def set_structure(self, atoms): @@ -599,7 +708,7 @@ def set_structure(self, atoms): "Input AtomArrayStack has no associated BondList" ) - if self.charge_type != "NO_CHARGES" and atoms.charges is None: + if self.charge_type != "NO_CHARGES" and atoms.charge is None: msg = "Specified charge type " + str(self.charge_type) + ".\n" msg += "but given AtomArray has no charges" @@ -621,7 +730,7 @@ def set_structure(self, atoms): raise BadStructureError( "Input AtomArrayStack has no associated BondList" ) - if self.charge_type != "NO_CHARGES" and atoms.charges is None: + if self.charge_type != "NO_CHARGES" and atoms.charge is None: msg = "Specified charge type " + str(self.charge_type) + ".\n" msg += "but one of given AtomArrays has no charges" diff --git a/tests/structure/test_mol2.py b/tests/structure/test_mol2.py index 353669ec3..42fd2f255 100644 --- a/tests/structure/test_mol2.py +++ b/tests/structure/test_mol2.py @@ -15,7 +15,7 @@ import biotite.structure.io.mol2 as mol2 from ..util import data_dir -def draw_random_struct(N_atoms, charges=False): +def draw_random_struct(N_atoms, charge=False): arr= struc.array( [ @@ -24,7 +24,7 @@ def draw_random_struct(N_atoms, charges=False): float(np.random.rand()) for _ in range(3) ], element="C", - charges=np.random.rand() + charge=int(np.random.randint(-5,5)) ) for _ in range(N_atoms) ] ) @@ -72,15 +72,16 @@ def test_header_conversion(): for i, name in enumerate(ref_names): mol2_file = mol2.MOL2File() mol2_file.set_header( - mol_name = name, - num_atoms = ref_nums[i], - mol_type = ref_mol_type[i], - charge_type = ref_charge_type[i] + name, + ref_nums[i], + ref_mol_type[i], + ref_charge_type[i] + ) # need to set some structure for file writing rand_struct = draw_random_struct( ref_nums[i], - charges = (ref_charge_type[i] != "NO_CHARGES"), + charge = (ref_charge_type[i] != "NO_CHARGES"), ) mol2_file.set_structure(rand_struct) @@ -96,8 +97,8 @@ def test_header_conversion(): assert len(test_header) > 0 assert test_header[0] == name assert test_header[1] == ref_nums[i] - assert test_header[6] == ref_mol_type[i] - assert test_header[7] == ref_charge_type[i] + assert test_header[2] == ref_mol_type[i] + assert test_header[3] == ref_charge_type[i] @pytest.mark.parametrize( @@ -117,7 +118,7 @@ def test_structure_conversion(path): mol2_file = mol2.MOL2File() mol2_file.set_header( - ref_header[0], ref_header[1], ref_header[6], ref_header[7] + ref_header[0], ref_header[1], ref_header[2], ref_header[3] ) mol2.set_structure(mol2_file, ref_atoms) temp = TemporaryFile("w+") @@ -145,4 +146,54 @@ def test_structure_conversion(path): assert np.all(ref_atoms[i].element == test_atoms[i].element) assert np.all(ref_atoms.bonds == test_atoms.bonds) +#@pytest.mark.parametrize( +# "path", +# glob.glob(join(data_dir("structure"), "molecules", "*.mol2")) +#) +#def test_charge_rounding(path): +# """ +# After reading a mol2 file, writing the structure back to a new file +# and reading it again should give us a file where the partial_charges are +# identical to the rounded charges as without changing them manually this +# is what will be written to the charge column. +# """ +# mol2_file = mol2.MOL2File.read(path) +# +# ref_header = mol2_file.get_header() +# ref_atoms = mol2.get_structure(mol2_file) +# + +# mol2_file = mol2.MOL2File() +# mol2_file.set_header( +# ref_header[0], ref_header[1], ref_header[2], ref_header[3] +# ) +# mol2.set_structure(mol2_file, ref_atoms) +# +# ref_charges = ref_atoms.charge +# +# temp = TemporaryFile("w+") +# mol2_file.write(temp) +# + +# temp.seek(0) +# mol2_file = mol2.MOL2File.read(temp) +# test_atoms = mol2.get_structure(mol2_file) +# temp.close() +# + +# instance_cond = isinstance(ref_atoms, AtomArray) +# instance_cond = instance_cond | isinstance(ref_atoms, AtomArrayStack) +# assert instance_cond + +# if isinstance(ref_atoms, AtomArray): +# # actually no idea why we can assume that this works +# # since floating point comparison is not safe! +# assert test_atoms == ref_atoms +# assert test_atoms.bonds == ref_atoms.bonds +# elif isinstance(ref_atoms, AtomArrayStack): +# for i in range(ref_atoms.shape[0]): +# assert np.all(np.isclose(ref_atoms[i].coord, test_atoms[i].coord)) +# assert np.all(ref_atoms[i].element == test_atoms[i].element) +# assert np.all(ref_atoms.bonds == test_atoms.bonds) +# From 6103a1aef288926ba0fece4f1c21268edd6d5d33 Mon Sep 17 00:00:00 2001 From: Benjamin Mayer Date: Tue, 30 Aug 2022 23:51:27 +0200 Subject: [PATCH 09/37] Mol2File test expanded, charges and sybyl_atom type reading now seems to work. Also covering all elements in sybyl_atom_type now, although heuristic not fully working. --- tests/structure/test_mol2.py | 135 ++++++++++++++++++++++------------- 1 file changed, 85 insertions(+), 50 deletions(-) diff --git a/tests/structure/test_mol2.py b/tests/structure/test_mol2.py index 42fd2f255..2cbcc69b1 100644 --- a/tests/structure/test_mol2.py +++ b/tests/structure/test_mol2.py @@ -146,54 +146,89 @@ def test_structure_conversion(path): assert np.all(ref_atoms[i].element == test_atoms[i].element) assert np.all(ref_atoms.bonds == test_atoms.bonds) -#@pytest.mark.parametrize( -# "path", -# glob.glob(join(data_dir("structure"), "molecules", "*.mol2")) -#) -#def test_charge_rounding(path): -# """ -# After reading a mol2 file, writing the structure back to a new file -# and reading it again should give us a file where the partial_charges are -# identical to the rounded charges as without changing them manually this -# is what will be written to the charge column. -# """ -# mol2_file = mol2.MOL2File.read(path) -# -# ref_header = mol2_file.get_header() -# ref_atoms = mol2.get_structure(mol2_file) -# - -# mol2_file = mol2.MOL2File() -# mol2_file.set_header( -# ref_header[0], ref_header[1], ref_header[2], ref_header[3] -# ) -# mol2.set_structure(mol2_file, ref_atoms) -# -# ref_charges = ref_atoms.charge -# -# temp = TemporaryFile("w+") -# mol2_file.write(temp) -# - -# temp.seek(0) -# mol2_file = mol2.MOL2File.read(temp) -# test_atoms = mol2.get_structure(mol2_file) -# temp.close() -# - -# instance_cond = isinstance(ref_atoms, AtomArray) -# instance_cond = instance_cond | isinstance(ref_atoms, AtomArrayStack) -# assert instance_cond - -# if isinstance(ref_atoms, AtomArray): -# # actually no idea why we can assume that this works -# # since floating point comparison is not safe! -# assert test_atoms == ref_atoms -# assert test_atoms.bonds == ref_atoms.bonds -# elif isinstance(ref_atoms, AtomArrayStack): -# for i in range(ref_atoms.shape[0]): -# assert np.all(np.isclose(ref_atoms[i].coord, test_atoms[i].coord)) -# assert np.all(ref_atoms[i].element == test_atoms[i].element) -# assert np.all(ref_atoms.bonds == test_atoms.bonds) -# +@pytest.mark.parametrize( + "path", + glob.glob(join(data_dir("structure"), "molecules", "*.mol2")) +) +def test_charge_rounding(path): + """ + After reading a mol2 file, writing the structure back to a new file + and reading it again should give us a file where the partial_charges are + identical to the rounded charges as without changing them manually this + is what will be written to the charge column. Also setting the charges + specifically before setting the structure will lead to the partial_charges + being used in the set_structure function. + """ + mol2_file = mol2.MOL2File.read(path) + + ref_header = mol2_file.get_header() + ref_atoms = mol2.get_structure(mol2_file) + ref_partial_charges = mol2.get_charges(mol2_file) + ref_charges = ref_atoms.charge + + + mol2_file = mol2.MOL2File() + mol2_file.set_header( + ref_header[0], ref_header[1], ref_header[2], ref_header[3] + ) + mol2.set_structure(mol2_file, ref_atoms) + temp = TemporaryFile("w+") + mol2_file.write(temp) + + + temp.seek(0) + mol2_file = mol2.MOL2File.read(temp) + test_atoms = mol2.get_structure(mol2_file) + test_charges = mol2.get_charges(mol2_file) + temp.close() + + mol2_file = mol2.MOL2File() + mol2_file.set_header( + ref_header[0], ref_header[1], ref_header[2], ref_header[3] + ) + mol2.set_charges(mol2_file, ref_partial_charges) + mol2.set_structure(mol2_file, ref_atoms) + temp = TemporaryFile("w+") + mol2_file.write(temp) + + temp.seek(0) + mol2_file = mol2.MOL2File.read(temp) + test2_atoms = mol2.get_structure(mol2_file) + test2_charges = mol2.get_charges(mol2_file) + temp.close() + + + instance_cond = isinstance(ref_atoms, AtomArray) + instance_cond = instance_cond | isinstance(ref_atoms, AtomArrayStack) + assert instance_cond + + if isinstance(ref_atoms, AtomArray): + # actually no idea why we can assume that this works + # since floating point comparison is not safe! + print(ref_partial_charges) + print(np.rint(ref_partial_charges)) + assert test_atoms == ref_atoms + assert test2_atoms == ref_atoms + + assert test_atoms.bonds == ref_atoms.bonds + assert test2_atoms.bonds == ref_atoms.bonds + + assert np.all(np.rint(ref_partial_charges) == test_charges) + assert np.all(ref_partial_charges == test2_charges) + + elif isinstance(ref_atoms, AtomArrayStack): + for i in range(ref_atoms.shape[0]): + assert np.all(np.isclose(ref_atoms[i].coord, test_atoms[i].coord)) + assert np.all(np.isclose(ref_atoms[i].coord, test2_atoms[i].coord)) + assert np.all(ref_atoms[i].element == test_atoms[i].element) + assert np.all(ref_atoms[i].element == test2_atoms[i].element) + assert np.all(ref_atoms.bonds == test_atoms.bonds) + assert np.all(ref_atoms.bonds == test2_atoms.bonds) + assert np.all( + np.isclose(np.rint(ref_partial_charges[i]), test_charges[i]) + ) + assert np.all( + np.isclose(ref_partial_charges[i], test2_charges[i]) + ) + From 7292457f42d9d86280f1b9a0c5ed9de4a14e3bc3 Mon Sep 17 00:00:00 2001 From: Benjamin Mayer Date: Tue, 30 Aug 2022 23:53:42 +0200 Subject: [PATCH 10/37] forgot to commit changes on MOL2File before only pushed changed tests ^^ --- src/biotite/structure/io/mol2/convert.py | 71 +++++++-- src/biotite/structure/io/mol2/file.py | 175 +++++++++++++++-------- 2 files changed, 178 insertions(+), 68 deletions(-) diff --git a/src/biotite/structure/io/mol2/convert.py b/src/biotite/structure/io/mol2/convert.py index acd81e6bf..2d8a063c5 100644 --- a/src/biotite/structure/io/mol2/convert.py +++ b/src/biotite/structure/io/mol2/convert.py @@ -4,11 +4,59 @@ __name__ = "biotite.structure.io.mol2" __author__ = "Benjamin E. Mayer" -__all__ = ["get_structure", "set_structure"] +__all__ = [ + "get_structure", "set_structure", + "get_charges", "set_charges" +] def get_structure(mol2_file): + """ + Get an :class:`AtomArray` from the MOL2 File. + + Ths function is a thin wrapper around + :meth:`MOL2File.get_structure()`. + + Parameters + ---------- + mol2_file : MOL2File + The MOL2File. + + Returns + ------- + array : AtomArray, AtomArrayStack + Return an AtomArray or AtomArrayStack containing the structure or + structures depending on if file contains single or multiple models. + If something other then `NO_CHARGE` is set in the charge_type field + of the according mol2 file, the AtomArray or AtomArrayStack will + contain the charge field. + """ + return mol2_file.get_structure() + + +def set_structure(mol2_file, atoms): + """ + Set the :class:`AtomArray` for the MOL2 File. + + Ths function is a thin wrapper around + :meth:`MOL2File.set_structure(atoms)`. + + Parameters + ---------- + mol2_file : MOL2File + The XYZ File. + array : AtomArray + The array to be saved into this file. + Must have an associated :class:`BondList`. + If charge field set this is used for storage within the according + MOL2 charge column. + """ + mol2_file.set_structure(atoms) + + + +def get_charges(mol2_file): """ Get an :class:`AtomArray` from the XYZ File. @@ -28,22 +76,27 @@ def get_structure(mol2_file): All other annotation categories, except ``element`` are empty. """ - return mol2_file.get_structure() + return mol2_file.get_charges() -def set_structure(mol2_file, atoms): +def set_charges(mol2_file, charges): """ - Set the :class:`AtomArray` for the XYZ File. + Get an :class:`AtomArray` from the XYZ File. Ths function is a thin wrapper around - :meth:`XYZFile.set_structure()`. - + :meth:`XYZFile.get_structure()`. + Parameters ---------- xyz_file : XYZFile The XYZ File. + + Returns + ------- array : AtomArray - The array to be saved into this file. - Must have an associated :class:`BondList`. + This :class:`AtomArray` contains the optional ``charge`` + annotation and has an associated :class:`BondList`. + All other annotation categories, except ``element`` are + empty. """ - mol2_file.set_structure(atoms) + return mol2_file.set_charges(charges) diff --git a/src/biotite/structure/io/mol2/file.py b/src/biotite/structure/io/mol2/file.py index 92d489c99..400419982 100644 --- a/src/biotite/structure/io/mol2/file.py +++ b/src/biotite/structure/io/mol2/file.py @@ -81,32 +81,37 @@ def get_sybyl_atom_type(atom, bonds, atom_id): to the sybyl atom types. """ - if atom.element == "C": - atom_bonds, types = bonds.get_bonds(atom_id) - + atom_bonds, types = bonds.get_bonds(atom_id) + + if atom.element == "C": if 5 in types: return "C.ar" else: -# if len(atom_bonds) == 2: -# return "C.1" -# elif len(atom_bonds) == 3: -# return "C.2" -# elif len(atom_bonds) == 4: -# return "C.3" + if len(atom_bonds) == 3: + return "C.1" + elif len(atom_bonds) == 2: + return "C.2" + elif len(atom_bonds) == 1: + return "C.3" # else: # msg = "No supported sybyl Atom type for Atom " + str(atom) # raise ValueError(msg) return "C.3" - if atom.element == "N": - atom_bonds, types = bonds.get_bonds(atom_id) - + if atom.element == "N": if 5 in types: return "N.ar" else: - return "N.3" - + if len(atom_bonds) == 3: + return "N.1" + elif len(atom_bonds) == 2: + return "N.2" + elif len(atom_bonds) == 1: + return "N.3" if atom.element == "O": - return "O.3" + if len(atom_bonds) == 2: + return "O.3" + elif len(atom_bonds) == 1: + return "O.2" if atom.element == "S": return "S.3" @@ -139,7 +144,27 @@ def get_sybyl_atom_type(atom, bonds, atom_id): if atom.element == "Co": return "Co.oh" if atom.element == "Cu": - return "Cu" + return "Cu" + if atom.element == "Cl": + return "Cl" + if atom.element == "Br": + return "Br" + if atom.element == "I": + return "I" + if atom.element == "Zn": + return "Zn" + if atom.element == "Se": + return "Se" + if atom.element == "Mo": + return "Mo" + if atom.element == "Sn": + return "Sn" + + + + + + @@ -218,6 +243,7 @@ def __init__(self): self.ind_molecule = -1 self.ind_atoms = -1 self.ind_bonds = -1 + self.sybyl_atom_types = None def check_valid_mol2(self): @@ -439,7 +465,7 @@ def set_header(self, mol_name, num_atoms, mol_type, charge_type, self.ind_molecule = [0] self.lines[1] = self.mol_name - line = str(self.num_atoms) + line = " " + str(self.num_atoms) if self.num_bonds >= 0: line += " " + str(self.num_bonds) @@ -480,6 +506,7 @@ def get_structure(self): atom_array_stack = [] # instantiate atom array and bonds based on number of atoms information + self.sybyl_atom_types = [] for i in range(len(self.ind_atoms)): atoms = AtomArray(self.num_atoms) @@ -511,6 +538,7 @@ def get_structure(self): # index = self.ind_atoms[i]+1 j = 0 + atom_type_sybl_row = [""]*self.num_atoms while "@" not in self.lines[index]: @@ -534,8 +562,12 @@ def get_structure(self): subst_name = line[7] if len(line) > 8: charge = float(line[8]) +# print(line) +# print(charge) if len(line) > 9: status_bits = line[9] + + if self.charge_type != "NO_CHARGES": self.charges[i][j] = charge @@ -553,7 +585,8 @@ def get_structure(self): atom_i.res_id = subst_id atom_i.res_name = subst_name - atoms[j] = atom_i + atoms[j] = atom_i + atom_type_sybl_row[j] = atom_type_sybl index += 1 j += 1 @@ -589,6 +622,7 @@ def get_structure(self): atoms.bonds = bonds atom_array_stack.append(atoms) + self.sybyl_atom_types.append(atom_type_sybl_row) if len(atom_array_stack) == 1: return atom_array_stack[0] @@ -596,12 +630,15 @@ def get_structure(self): return struc.stack(atom_array_stack) - def append_atom_array(self, atoms): + def append_atom_array(self, atoms, charges=None): n_atoms = atoms.shape[0] self.lines.append("@ATOM") atoms_has_atom_ids = hasattr(atoms, "atom_id") + + if charges is not None: + assert len(charges) == len(atoms) for i, atom in enumerate(atoms): @@ -627,12 +664,13 @@ def append_atom_array(self, atoms): line += " " + str(atom.res_name) if self.charge_type != "NO_CHARGES": - line += " " - cond = not self.charges is None - cond = cond and len(self.charges) != 0 - cond = cond and len(self.charges[i]) !=0 - if cond: - line += " {: .{}f}".format(self.charges[i][j], 4) + line += " " +# print("charged") + if charges is not None: +# print( +# " using user defined charges " +str(charges[i]) +# ) + line += " {: .{}f}".format(charges[i], 4) else: line += " {: .{}f}".format(atom.charge, 4) @@ -648,36 +686,6 @@ def append_atom_array(self, atoms): line += "{:>5}".format(biotite_bonds_to_sybyl[bond[2]]) self.lines.append(line) - def set_charges(self, charges): - """ - Set a partial charges array that will be used for writing the mol2 file. - - """ - -# if not self.charges is None and self.charges.shape != charges.shape: -# msg = "Can only assign charges of same shape as already within" -# msg += "Mol2 file -# raise ValueError(msg) -# -# -# if self.num_atoms != -1: - - self.charges = charges - - - def get_charges(self): - - if self.charge_type == "NO_CHARGES": - raise ValueError( - "Can not get charges from mol2 file where NO_CHARGES set." - ) - - if self.charges is None: - _ = self.get_structure() - - return self.charges - - def set_structure(self, atoms): """ Set the :class:`AtomArray` for the file. @@ -719,9 +727,14 @@ def set_structure(self, atoms): msg += str(self.num_atoms) + "] and number of atoms in given" msg += "AtomArray [" + str(atoms.shape[0]) + "]" raise ValueError(msg) - - - self.append_atom_array(atoms) + +# print(" charges ::") +# print(self.charges) +# print("") + if self.charges is not None: + self.append_atom_array(atoms, self.charges) + else: + self.append_atom_array(atoms) elif isinstance(atoms, AtomArrayStack): @@ -754,8 +767,52 @@ def set_structure(self, atoms): for l in header_lines: self.lines.append(l) - self.append_atom_array(atoms_i) +# print(" charges ::") +# print(self.charges) +# print("") + if self.charges is not None: + self.append_atom_array(atoms_i, self.charges[i]) + else: + self.append_atom_array(atoms_i) + + def set_charges(self, charges): + """ + Set a partial charges array that will be used for writing the mol2 file. + + """ + +# if not self.charges is None and self.charges.shape != charges.shape: +# msg = "Can only assign charges of same shape as already within" +# msg += "Mol2 file +# raise ValueError(msg) +# +# +# if self.num_atoms != -1: + +# print("setting self.charges :: " + str(self.charges)) +# print("to :: " + str(charges)) + + self.charges = charges + + + def get_charges(self): + + if self.charge_type == "NO_CHARGES": + raise ValueError( + "Can not get charges from mol2 file where NO_CHARGES set." + ) + + if self.charges is None: + _ = self.get_structure() + if len(self.charges) == 1: + return self.charges[0] + else: + return self.charges + + + + From 36e0645814844d8d8ef847511c0a972455c65828 Mon Sep 17 00:00:00 2001 From: Benjamin Mayer Date: Wed, 31 Aug 2022 00:11:48 +0200 Subject: [PATCH 11/37] Modified test_mol so that only pdbx residues are tested for pdbx residue consistency --- tests/structure/test_mol.py | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/tests/structure/test_mol.py b/tests/structure/test_mol.py index 5c64b9914..fd1e94f22 100644 --- a/tests/structure/test_mol.py +++ b/tests/structure/test_mol.py @@ -42,7 +42,7 @@ def test_header_conversion(): @pytest.mark.parametrize( "path, omit_charge", itertools.product( - glob.glob(join(data_dir("structure"), "molecules", "*.sdf")), + glob.glob(join(data_dir("structure"), "molecules", "*.mol")), [False, True] ) ) @@ -77,7 +77,14 @@ def test_structure_conversion(path, omit_charge): @pytest.mark.parametrize( - "path", glob.glob(join(data_dir("structure"), "molecules", "*.sdf")), + "path", + [ + x for x in glob.glob( + join( + data_dir("structure"), "molecules", "*.mol" + ) + ) if x.split(".")[0].upper() in info.all_residues() + ], ) def test_pdbx_consistency(path): """ @@ -89,6 +96,7 @@ def test_pdbx_consistency(path): MOL format. """ mol_name = split(splitext(path)[0])[1] + ref_atoms = info.residue(mol_name) # The CCD contains information about aromatic bond types, # but the SDF test files do not @@ -103,4 +111,13 @@ def test_pdbx_consistency(path): assert test_atoms.element.tolist() == ref_atoms.element.tolist() assert test_atoms.charge.tolist() == ref_atoms.charge.tolist() assert set(tuple(bond) for bond in test_atoms.bonds.as_array()) \ - == set(tuple(bond) for bond in ref_atoms.bonds.as_array()) \ No newline at end of file + == set(tuple(bond) for bond in ref_atoms.bonds.as_array()) + + #header = mol_file.get_header() + + try: + header = mol_file.get_header() + except: + assert False, "Could not get_header for SDFile [" +str(path) + + From fc81ec916623d4eda4ccda451c53dab4c395c56d Mon Sep 17 00:00:00 2001 From: Benjamin Mayer Date: Wed, 31 Aug 2022 09:08:07 +0200 Subject: [PATCH 12/37] all file formats somewhat working, at least reading works for xyz and sdf files. For mol2 files it works as long as the atom_name represents the element and not an atom_name like "CA" --- src/biotite/structure/io/ctab.py | 8 +- src/biotite/structure/io/mol/file.py | 19 +- src/biotite/structure/io/mol2/file.py | 79 +- src/biotite/structure/io/sdf/__init__.py | 11 +- src/biotite/structure/io/sdf/convert.py | 35 +- src/biotite/structure/io/sdf/file.py | 405 +- .../data/molecules/10000_docked.mol2 | 714 ++-- .../data/molecules/10000_docked_1.mol | 47 + .../data/molecules/10000_docked_1.mol2 | 49 + .../data/molecules/10000_docked_1.xyz | 22 + .../data/molecules/10000_docked_2.mol | 47 + .../data/molecules/10000_docked_2.mol2 | 49 + .../data/molecules/10000_docked_2.xyz | 22 + .../molecules/10000_docked_single_state.mol2 | 49 - tests/structure/data/molecules/ADP.sdf | 102 + tests/structure/data/molecules/ADP.xyz | 49 + tests/structure/data/molecules/BENZ.mol | 29 + tests/structure/data/molecules/BENZ.mol2 | 32 + tests/structure/data/molecules/CO2.mol | 65 + tests/structure/data/molecules/CO2.mol2 | 78 + .../data/molecules/{CYN.sdf => CYN.mol} | 0 tests/structure/data/molecules/CYN.mol2 | 14 + tests/structure/data/molecules/CYN.xyz | 4 + .../data/molecules/{HWB.sdf => HWB.mol} | 0 tests/structure/data/molecules/HWB.mol2 | 77 + tests/structure/data/molecules/HWB.xyz | 34 + tests/structure/data/molecules/README.rst | 10 + .../data/molecules/{TYR.sdf => TYR.mol} | 0 tests/structure/data/molecules/TYR.mol2 | 56 + tests/structure/data/molecules/TYR.xyz | 26 + tests/structure/data/molecules/aspirin_2d.mol | 47 + .../structure/data/molecules/aspirin_2d.mol2 | 50 + tests/structure/data/molecules/aspirin_2d.sdf | 157 + tests/structure/data/molecules/aspirin_2d.xyz | 23 + tests/structure/data/molecules/aspirin_3d.mol | 47 + .../structure/data/molecules/aspirin_3d.mol2 | 50 + tests/structure/data/molecules/aspirin_3d.sdf | 197 + tests/structure/data/molecules/aspirin_3d.xyz | 23 + tests/structure/data/molecules/lorazepam.mol | 70 + tests/structure/data/molecules/lorazepam.mol2 | 72 + tests/structure/data/molecules/lorazepam.xyz | 33 + .../data/molecules/nu7026_conformers.mol2 | 498 +++ .../data/molecules/nu7026_conformers.sdf | 486 +++ .../data/molecules/nu7026_conformers.xyz | 228 + .../data/molecules/paulbourkeDOTnet.xyz | 49 - tests/structure/data/molecules/zinc_33.mol | 120 + .../data/molecules/zinc_33_conformers.mol2 | 3660 +++++++++++++++++ .../data/molecules/zinc_33_conformers.sdf | 3600 ++++++++++++++++ .../data/molecules/zinc_33_conformers.xyz | 1710 ++++++++ tests/structure/test_sdf.py | 150 + 50 files changed, 12843 insertions(+), 559 deletions(-) create mode 100644 tests/structure/data/molecules/10000_docked_1.mol create mode 100644 tests/structure/data/molecules/10000_docked_1.mol2 create mode 100644 tests/structure/data/molecules/10000_docked_1.xyz create mode 100644 tests/structure/data/molecules/10000_docked_2.mol create mode 100644 tests/structure/data/molecules/10000_docked_2.mol2 create mode 100644 tests/structure/data/molecules/10000_docked_2.xyz delete mode 100644 tests/structure/data/molecules/10000_docked_single_state.mol2 create mode 100644 tests/structure/data/molecules/ADP.sdf create mode 100644 tests/structure/data/molecules/ADP.xyz create mode 100644 tests/structure/data/molecules/BENZ.mol create mode 100644 tests/structure/data/molecules/BENZ.mol2 create mode 100644 tests/structure/data/molecules/CO2.mol create mode 100644 tests/structure/data/molecules/CO2.mol2 rename tests/structure/data/molecules/{CYN.sdf => CYN.mol} (100%) create mode 100644 tests/structure/data/molecules/CYN.mol2 create mode 100644 tests/structure/data/molecules/CYN.xyz rename tests/structure/data/molecules/{HWB.sdf => HWB.mol} (100%) create mode 100644 tests/structure/data/molecules/HWB.mol2 create mode 100644 tests/structure/data/molecules/HWB.xyz rename tests/structure/data/molecules/{TYR.sdf => TYR.mol} (100%) create mode 100644 tests/structure/data/molecules/TYR.mol2 create mode 100644 tests/structure/data/molecules/TYR.xyz create mode 100644 tests/structure/data/molecules/aspirin_2d.mol create mode 100644 tests/structure/data/molecules/aspirin_2d.mol2 create mode 100644 tests/structure/data/molecules/aspirin_2d.sdf create mode 100644 tests/structure/data/molecules/aspirin_2d.xyz create mode 100644 tests/structure/data/molecules/aspirin_3d.mol create mode 100644 tests/structure/data/molecules/aspirin_3d.mol2 create mode 100644 tests/structure/data/molecules/aspirin_3d.sdf create mode 100644 tests/structure/data/molecules/aspirin_3d.xyz create mode 100644 tests/structure/data/molecules/lorazepam.mol create mode 100644 tests/structure/data/molecules/lorazepam.mol2 create mode 100644 tests/structure/data/molecules/lorazepam.xyz create mode 100644 tests/structure/data/molecules/nu7026_conformers.mol2 create mode 100644 tests/structure/data/molecules/nu7026_conformers.sdf create mode 100644 tests/structure/data/molecules/nu7026_conformers.xyz delete mode 100644 tests/structure/data/molecules/paulbourkeDOTnet.xyz create mode 100644 tests/structure/data/molecules/zinc_33.mol create mode 100644 tests/structure/data/molecules/zinc_33_conformers.mol2 create mode 100644 tests/structure/data/molecules/zinc_33_conformers.sdf create mode 100644 tests/structure/data/molecules/zinc_33_conformers.xyz create mode 100644 tests/structure/test_sdf.py diff --git a/src/biotite/structure/io/ctab.py b/src/biotite/structure/io/ctab.py index d98c176b3..07ad4bcf9 100644 --- a/src/biotite/structure/io/ctab.py +++ b/src/biotite/structure/io/ctab.py @@ -11,6 +11,8 @@ __author__ = "Patrick Kunzmann" __all__ = ["read_structure_from_ctab", "write_structure_to_ctab"] +import traceback + import warnings import numpy as np @@ -71,6 +73,8 @@ def read_structure_from_ctab(ctab_lines): .. footbibliography:: """ n_atoms, n_bonds = _get_counts(ctab_lines[0]) + + atom_lines = ctab_lines[1 : 1 + n_atoms] bond_lines = ctab_lines[1 + n_atoms : 1 + n_atoms + n_bonds] @@ -165,5 +169,5 @@ def write_structure_to_ctab(atoms): def _get_counts(counts_line): - elements = counts_line.split() - return int(elements[0]), int(elements[1]) \ No newline at end of file + elements = counts_line.strip().split() + return int(elements[0]), int(elements[1]) diff --git a/src/biotite/structure/io/mol/file.py b/src/biotite/structure/io/mol/file.py index 814a2c59f..2492bfe07 100644 --- a/src/biotite/structure/io/mol/file.py +++ b/src/biotite/structure/io/mol/file.py @@ -90,7 +90,8 @@ def get_header(self): program : str The program name. time : datetime - The time of file creation. + The time of file creation. Returns None in this field if not + able to parse according entry in MOLFile as datetime string. dimensions : str Dimensional codes. scaling_factors : str @@ -105,8 +106,18 @@ def get_header(self): mol_name = self.lines[0].strip() initials = self.lines[1][0:2].strip() program = self.lines[1][2:10].strip() - time = datetime.datetime.strptime(self.lines[1][10:20], - DATE_FORMAT) + + time = None + try: + time = datetime.datetime.strptime( + self.lines[1][10:20], + DATE_FORMAT + ) + except: + line = format(self.lines[1][10:20]) + warn("{} could not be interpreted as datetime".format(line)) + + dimensions = self.lines[1][20:22].strip() scaling_factors = self.lines[1][22:34].strip() energy = self.lines[1][34:46].strip() @@ -195,4 +206,4 @@ def _get_ctab_lines(lines): for i, line in enumerate(lines): if line.startswith("M END"): return lines[N_HEADER:i+1] - return lines[N_HEADER:] \ No newline at end of file + return lines[N_HEADER:] diff --git a/src/biotite/structure/io/mol2/file.py b/src/biotite/structure/io/mol2/file.py index 400419982..34b9ee881 100644 --- a/src/biotite/structure/io/mol2/file.py +++ b/src/biotite/structure/io/mol2/file.py @@ -133,7 +133,7 @@ def get_sybyl_atom_type(atom, bonds, atom_id): return "Si" if atom.element == "K": return "K" - if atom.element == "Ca": + if atom.element == "CA": return "Ca" if atom.element == "Cr": return "Cr.th" @@ -145,7 +145,7 @@ def get_sybyl_atom_type(atom, bonds, atom_id): return "Co.oh" if atom.element == "Cu": return "Cu" - if atom.element == "Cl": + if atom.element == "CL": return "Cl" if atom.element == "Br": return "Br" @@ -159,12 +159,44 @@ def get_sybyl_atom_type(atom, bonds, atom_id): return "Mo" if atom.element == "Sn": return "Sn" + else: + msg = "sybyl_atom_type not implemented for element ["+str(atom.element) + msg += "] " + str(atom) + raise ValueError(msg) +def atom_name_to_element(atom_name, sybyl_atom_type): + + if len(atom_name) == 1: + return atom_name + else: + + if atom_name == "CA": + if sybyl_atom_type == "Ca": + return atom_name + elif sybyl_atom_type in ["C.ar", "C.1", "C.2", "C.3"]: + return "C" + + + - + + +def filter_atom_name(atom_name, sybyl_name): + """ + Used to filter if any of the atom_names needs special handling or + if we are simply seeing element names and not specific + atom names + """ + + element = atom_name_to_element(atom_name, sybyl_name) + + cond = len(atom_name) > 2 + cond = cond or len(element) != len(atom_name) + + return cond @@ -539,6 +571,7 @@ def get_structure(self): index = self.ind_atoms[i]+1 j = 0 atom_type_sybl_row = [""]*self.num_atoms + atom_names = [] while "@" not in self.lines[index]: @@ -580,8 +613,10 @@ def get_structure(self): [x_coord, y_coord, z_coord], ) - atom_i.atom_id = atom_id + atom_i.atom_id = atom_id + #if len(atom_name) atom_i.element = atom_name + #atom_names.append(atom_name) atom_i.res_id = subst_id atom_i.res_name = subst_name @@ -589,7 +624,43 @@ def get_structure(self): atom_type_sybl_row[j] = atom_type_sybl index += 1 j += 1 + + print(j) + print(atom_names) + print(atom_type_sybl_row) +# filtered = np.array( +# [ +# filter_atom_name( +# atom_names[k], atom_type_sybl_row[k] +# ) for k in range(len(atom_names)) +# ] +# ) +# + +# index = self.ind_atoms[i]+1 +# j = 0 +# while "@" not in self.lines[index]: +# print("["+str(j)+ "]") +# print(" "+str(atoms[j])) +# print(" "+str(atom_names[j])) +# print(" "+str(atom_type_sybl_row[j])) +# +# +# if np.any(np.array(filtered)): +# +# atoms[j].atom_name = atom_names[j] +# atoms[j].element = atom_name_to_element( +# atom_names[j], +# atom_type_sybl_row[j] +# ) +# else: +# atoms[j].element = atom_names[j] +# +# index += 1 +# j += 1 + + # # Iterate through all the bond lines by stating from line after diff --git a/src/biotite/structure/io/sdf/__init__.py b/src/biotite/structure/io/sdf/__init__.py index 2d6f11027..0b3b9f529 100644 --- a/src/biotite/structure/io/sdf/__init__.py +++ b/src/biotite/structure/io/sdf/__init__.py @@ -3,12 +3,11 @@ # information. """ -The MOL format is used to depict atom positions and bonds for small -molecules. -This subpackage is used for reading and writing an :class:`AtomArray` -in this format. -Additionally, reading data from the SDF format, which is a wrapper -around MOL, is also supported. +The SDF format is used to depict atom positions and bonds for small +molecules as well as multiple meta informations. +Also there can be multiple models within one file. +This subpackage leans on the ctab modle implemented for the MOL file +but also produces a dict containing the meta information. """ __name__ = "biotite.structure.io.sdf" diff --git a/src/biotite/structure/io/sdf/convert.py b/src/biotite/structure/io/sdf/convert.py index 5792ed55f..f4c66394c 100644 --- a/src/biotite/structure/io/sdf/convert.py +++ b/src/biotite/structure/io/sdf/convert.py @@ -4,46 +4,61 @@ __name__ = "biotite.structure.io.sdf" __author__ = "Benjamin E. Mayer" -__all__ = ["get_structure", "set_structure"] +__all__ = [ + "get_structure", "set_structure", + "get_metainformation", "set_metainformation" +] def get_structure(sdf_file): """ - Get an :class:`AtomArray` from the SDF File. + Get an :class:`AtomArray` from the MOL file. Ths function is a thin wrapper around - :meth:`SDFFile.get_structure()`. + :meth:`SDFile.get_structure()`. Parameters ---------- - sdf_file : SDFFile - The SDF File. + sdf_file : SDFile + The MOL file. Returns ------- - array : AtomArray + array : AtomArray, AtomArrayStack This :class:`AtomArray` contains the optional ``charge`` annotation and has an associated :class:`BondList`. All other annotation categories, except ``element`` are empty. + annotations: dict + This annotationa dictionary contains all the metainformation from + the sdf file parsed as key:value pairs with the annotation tag + defined via '> ' being the key and the lines until the next + annotation tag or end of file being the value. """ return sdf_file.get_structure() def set_structure(sdf_file, atoms): """ - Set the :class:`AtomArray` for the SDF File. + Set the :class:`AtomArray` for the MOL file. Ths function is a thin wrapper around - :meth:`SDFFile.set_structure()`. + :meth:`SDFile.set_structure()`. Parameters ---------- - sdf_file : SDFFile - The SDF File. + sdf_file : SDFile + The MOL file. array : AtomArray The array to be saved into this file. Must have an associated :class:`BondList`. """ sdf_file.set_structure(atoms) + + +def get_metainformation(sdf_file): + return sdf_file.get_metainformation() + +def set_metainformation(sdf_file, meta_information): + sdf_file.set_metainformation(meta_information) diff --git a/src/biotite/structure/io/sdf/file.py b/src/biotite/structure/io/sdf/file.py index f94bb3174..000f50021 100644 --- a/src/biotite/structure/io/sdf/file.py +++ b/src/biotite/structure/io/sdf/file.py @@ -4,20 +4,31 @@ __name__ = "biotite.structure.io.sdf" __author__ = "Benjamin E. Mayer" -__all__ = ["SDFFile"] +__all__ = ["SDFile"] +import datetime +from warnings import warn import numpy as np -from ...atoms import AtomArray, Atom -from ....file import TextFile +from ...atoms import AtomArray, AtomArrayStack +import biotite.structure as struc +from ....file import TextFile, InvalidFileError +from ...error import BadStructureError +from ..ctab import read_structure_from_ctab, write_structure_to_ctab # Number of header lines -N_HEADER = 2 +N_HEADER = 3 +DATE_FORMAT = "%d%m%y%H%M" -class SDFFile(TextFile): +class SDFile(TextFile): """ - This class represents a file in SDF format, + This class represents a file in SDF format, that is used to store + structure information for small molecules. :footcite:`Dalby1992` + The implementation here is based on the MOLFile and is basically an + extension of the MOLFile to als cover multiple models and meta information + in the form of a dictionary. + References ---------- @@ -28,22 +39,33 @@ class SDFFile(TextFile): -------- >>> from os.path import join - >>> mol_file = SDFFile.read(join(path_to_structures, "molecules", "BENZ.sdf")) - >>> atom_array = sdf_file.get_structure() - >>> print(atom_array) - 0 C 0.000 1.403 0.000 - 0 H 0.000 2.490 0.000 - 0 C -1.215 0.701 0.000 - 0 H -2.157 1.245 0.000 - 0 C -1.215 -0.701 0.000 - 0 H -2.157 -1.245 0.000 - 0 C 0.000 -1.403 0.000 - 0 H 0.000 -2.490 0.000 - 0 C 1.215 -0.701 0.000 - 0 H 2.157 -1.245 0.000 - 0 C 1.215 0.701 0.000 - 0 H 2.157 1.245 0.000 - + >>> mol_file = MOLFile.read(join(path_to_structures, "molecules", "TYR.sdf")) + >>> atom_array = mol_file.get_structure() + >>> print(atom_array) + 0 N 1.320 0.952 1.428 + 0 C -0.018 0.429 1.734 + 0 C -0.103 0.094 3.201 + 0 O 0.886 -0.254 3.799 + 0 C -0.274 -0.831 0.907 + 0 C -0.189 -0.496 -0.559 + 0 C 1.022 -0.589 -1.219 + 0 C -1.324 -0.102 -1.244 + 0 C 1.103 -0.282 -2.563 + 0 C -1.247 0.210 -2.587 + 0 C -0.032 0.118 -3.252 + 0 O 0.044 0.420 -4.574 + 0 O -1.279 0.184 3.842 + 0 H 1.977 0.225 1.669 + 0 H 1.365 1.063 0.426 + 0 H -0.767 1.183 1.489 + 0 H 0.473 -1.585 1.152 + 0 H -1.268 -1.219 1.134 + 0 H 1.905 -0.902 -0.683 + 0 H -2.269 -0.031 -0.727 + 0 H 2.049 -0.354 -3.078 + 0 H -2.132 0.523 -3.121 + 0 H -0.123 -0.399 -5.059 + 0 H -1.333 -0.030 4.784 """ def __init__(self): @@ -54,6 +76,8 @@ def __init__(self): def get_header(self): """ Get the header from the SDF file. + This is identical to the MOL file header as the basic information + per model is the same. Returns ------- @@ -76,77 +100,143 @@ def get_header(self): comments : str Additional comments. """ - atom_number = int(self.lines[0].strip()) - mol_name = self.lines[1].strip() - return atom_number, mol_name + mol_name = self.lines[0].strip() + initials = self.lines[1][0:2].strip() + program = self.lines[1][2:10].strip() + + time = None + try: + time = datetime.datetime.strptime( + self.lines[1][10:20], + DATE_FORMAT + ) + except: + line = format(self.lines[1][10:20]) + warn("{} could not be interpreted as datetime".format(line)) + + dimensions = self.lines[1][20:22].strip() + scaling_factors = self.lines[1][22:34].strip() + energy = self.lines[1][34:46].strip() + registry_number = self.lines[1][46:52].strip() + comments = self.lines[2].strip() + return mol_name, initials, program, time, dimensions, \ + scaling_factors, energy, registry_number, comments - def set_header(self, mol_name): + def set_header(self, mol_name, initials="", program="", time=None, + dimensions="", scaling_factors="", energy="", + registry_number="", comments=""): """ - Set the header for the SDF file. + Set the header from the SDF file. + This is identical to the MOL file header as the basic information + per model is the same. Parameters ---------- mol_name : str The name of the molecule. - + initials : str, optional + The author's initials. Maximum length is 2. + program : str, optional + The program name. Maximum length is 8. + time : datetime or date, optional + The time of file creation. + dimensions : str, optional + Dimensional codes. Maximum length is 2. + scaling_factors : str, optional + Scaling factors. Maximum length is 12. + energy : str, optional + Energy from modeling program. Maximum length is 12. + registry_number : str, optional + MDL registry number. Maximum length is 6. + comments : str, optional + Additional comments. """ - - if(len(self.lines) > 2): - - self.lines[1] = str(mol_name) + "\n" - self.lines[0] = str(len(self.lines)-2)+ "\n" - - else: - raise ValueError( - "Can not set header of an empty SDFFile" - "Use set_structure first, so that number of atoms" - "can be derived from set structure" - ) + if time is None: + time = datetime.datetime.now() + time_str = time.strftime(DATE_FORMAT) + + self.lines[0] = str(mol_name) + self.lines[1] = ( + f"{initials:>2}" + f"{program:>8}" + f"{time_str:>10}" + f"{dimensions:>2}" + f"{scaling_factors:>12}" + f"{energy:>12}" + f"{registry_number:>6}" + ) + self.lines[2] = str(comments) def get_structure(self): """ - Get an :class:`AtomArray` from the SDF file. + Get an :class:`AtomArray` if it only contains one model + or an :class:'AtomArrayStack' if it contains multiple models. Returns ------- - array : AtomArray - This :class:`AtomArray` contains the optional ``charge`` + array : AtomArray, AtomArrayStack + This :class: contains the optional ``charge`` annotation and has an associated :class:`BondList`. All other annotation categories, except ``element`` are empty. + """ - if len(self.lines) > 2: + + + model_end_lines = [ + i for i in range(len(self.lines)) if '$$$$' == self.lines[i] + ] + assert(len(model_end_lines) < len(self.lines)) - array = AtomArray(len(self.lines)-2) - - for i, line in enumerate(self.lines[2:]): - line_parsed = [x for x in line.strip().split(" ") if x!= ''] - - atom = Atom( - [ - float(line_parsed[1]), - float(line_parsed[2]), - float(line_parsed[3]), - ] - ) - atom.element = line_parsed[0] - array[i] = atom - - return array - - - - else: + m_end_lines = [ + i for i in range( + len(self.lines) + ) if self.lines[i].startswith("M END") + ] + + # if only $$$$ is forgotten in mol file add it + if len(model_end_lines) == 0 and len(m_end_lines) !=0: + self.lines.append("$$$$") + model_end_lines = [ + i for i in range(len(self.lines)) if '$$$$' == self.lines[i] + ] - raise ValueError( - "Trying to get_structure from empty SDFFile" - ) + model_start_lines = [0] + [x+1 for x in model_end_lines[:-1]] + if len(model_end_lines) == 0 and len(m_end_lines) == 0: + msg = "Trying to get structure from empty file, or" + msg += "M_END line is missing. \n" + msg += "Lines where :: \n" + str(self.lines) + "\n\n" + raise BadStructureError(msg) + + array_stack = [] + i_start = 0 + for i in range(len(model_end_lines)): + + ctab_lines = self.lines[ + int(model_start_lines[i]+3):int(m_end_lines[i]) + ] + + if len(ctab_lines) == 0: + msg = "File does not contain structure data" + msg += "in model " + str(i) + "." + raise InvalidFileError(msg) + + + atom_array = read_structure_from_ctab(ctab_lines) + array_stack.append(atom_array) + + + if len(model_end_lines) == 1: + return array_stack[0] + else: + return struc.stack(array_stack) + def set_structure(self, atoms): """ @@ -154,21 +244,180 @@ def set_structure(self, atoms): Parameters ---------- - array : AtomArray - The array to be saved into this file. + array : AtomArray, AtomArrayStack + The array or stack to be saved into this file. Must have an associated :class:`BondList`. """ - n_atoms = atoms.shape[0] - self.lines += [""] * n_atoms + header_lines = [] + header_lines.append(self.lines[0]) + header_lines.append(self.lines[1]) + header_lines.append(self.lines[2]) + print("header_lines ::") + print(header_lines) + + + header_lines = self.lines[:N_HEADER] + print("header_lines ::") + print(header_lines) + + + if isinstance(atoms, AtomArray): + print(self.lines) + self.lines = header_lines + write_structure_to_ctab(atoms) + self.lines += ["$$$$"] + print(self.lines) + + elif isinstance(atoms, AtomArrayStack): + for i, atoms_i in enumerate(atoms): + + header_lines = self.lines[:N_HEADER] + print("header_lines ::") + print(header_lines) + + + if i == 0: + self.lines = header_lines + else: + self.lines += header_lines + print("struct to ctab on structure : atoms_i :: ") + print(atoms_i) + print("") + processed_lines = write_structure_to_ctab(atoms_i) + print("|processed_lines| :: " + str(len(processed_lines))) + print("") + print(processed_lines) + self.lines += processed_lines + self.lines += ["$$$$"] + - for i, atom in enumerate(atoms): - line = " " + atom.element - line += " " + "{: .{}f}".format(atom.coord[0], 5) - line += " " + "{: .{}f}".format(atom.coord[1], 5) - line += " " + "{: .{}f}".format(atom.coord[2], 5) - line += " " - self.lines[i+2] = line + + def get_metainformation(self): + """ + Set the :class:`AtomArray` for the file. + + Parameters + ---------- + annotations: dict + This dictionary contains all the metainformation given in lines + like: + > + 1 + """ + + meta_info = {} + + model_end_lines = [ + i for i in range(len(self.lines)) if '$$$$' in self.lines[i] + ] + m_end_lines = [ + i for i in range( + len(self.lines) + ) if self.lines[i].startswith("M END") + ] + model_start_lines = [0] + [x+1 for x in model_end_lines[:-1]] + + + i_start = 0 + for i in range(len(model_end_lines)): + + sub_meta_info = {} + + line_sub_model = self.lines[ + model_start_lines[i]:model_end_lines[i]+1 + ] + + annotation_line_indices = [ + i for i in range(len(line_sub_model)) if ">" in line_sub_model[i] + ] + + + for j, indx in enumerate(annotation_line_indices): + annotation_line = line_sub_model[indx] + + if "<" not in annotation_line or ">" not in annotation_line: + msg = "The annotation tag is not defined in the expected" + msg += " format . Can not parse metainformation." + msg += " Line was :: \n\n " +str(annotation_line) + raise BadStructureError(msg) + + annotation_line = annotation_line.strip().strip(">") + annotation_tag = annotation_line.strip().strip("<").strip() + + + + annotation_content = "" + if j < len(annotation_line_indices)-1: + annotation_content = line_sub_model[int(indx+1):annotation_line_indices[j+1]] + else: + annotation_content = line_sub_model[int(indx+1):] + + line_filter = lambda x: len(x) != 0 and "$$$$" not in x + annotation_content = [ + x for x in annotation_content if line_filter(x) + ] + annotation_content = '\n'.join(annotation_content) + sub_meta_info[annotation_tag] = annotation_content + + + meta_info["model_"+str(i)]=sub_meta_info + + if len(list(meta_info.keys()))==1: + return meta_info["model_0"] + else: + return meta_info + + def set_metainformation(self, meta_information): + """ + Set the :class:`AtomArray` for the file. + + Parameters + ---------- + annotations: dict + This dictionary contains all the metainformation given in lines + like: + > + 1 + Either a single dictionary with MODEL:value pairs or a dictionary + of dictionary where each key indicates a model and the value is the + according model specific dictionary: + + { + "model_0": {"Tag1":Value1,.... }, + "model_1": {"Tag1":Value1',.... }, + ... + } + """ + + + header_lines = self.lines[:N_HEADER] + + model_end_lines = [ + i for i in range(len(self.lines)) if '$$$$' in self.lines[i] + ] + + if len(model_end_lines) == 1: + + if meta_information is not None: + for x in meta_information.keys(): + self.lines.append("> <" +str(x) + "> ") + self.lines.append(meta_information[x]) + + else: + if meta_information is not None: + for key in meta_information.keys(): + sub_annotations = meta_information[key] + for subkey in meta_information[key]: + self.lines.append("> <" +str(subkey) + "> ") + self.lines.append(sub_annotations[subkey]) + + + +def _get_ctab_lines(lines): + for i, line in enumerate(lines): + if line.startswith("M END"): + return lines[N_HEADER:i+1] + return lines[N_HEADER:] diff --git a/tests/structure/data/molecules/10000_docked.mol2 b/tests/structure/data/molecules/10000_docked.mol2 index 9cda8b03d..ab0a5d99d 100644 --- a/tests/structure/data/molecules/10000_docked.mol2 +++ b/tests/structure/data/molecules/10000_docked.mol2 @@ -5,45 +5,45 @@ SMALL GASTEIGER @ATOM - 1 C 119.4990 101.0650 20.8750 C.3 1 UNL1 0.0090 - 2 C 119.4350 102.1420 21.9770 C.3 1 UNL1 0.0030 - 3 C 119.2020 101.5020 23.3840 C.3 1 UNL1 0.0880 - 4 C 119.6390 102.3180 24.6640 C.3 1 UNL1 0.1020 - 5 N 120.7430 103.2410 24.3530 N.pl3 1 UNL1 -0.3100 - 6 H 121.5620 103.1630 24.9500 H 1 UNL1 0.1490 - 7 C 120.5530 104.4350 23.7520 C.2 1 UNL1 0.1900 - 8 O 121.5970 105.2980 23.8510 O.2 1 UNL1 -0.4460 - 9 C 121.2620 106.4230 23.1640 C.2 1 UNL1 0.1050 - 10 C 119.9900 106.3010 22.6540 C.2 1 UNL1 0.0500 - 11 C 122.2830 107.4830 23.0840 C.3 1 UNL1 0.0860 - 12 C 119.5370 104.9950 22.9920 C.2 1 UNL1 0.0130 - 13 C 118.2470 104.3800 22.5600 C.3 1 UNL1 0.0400 - 14 C 118.4230 103.2320 21.5680 C.3 1 UNL1 0.0090 - 15 C 117.8520 100.8950 23.4530 C.1 1 UNL1 -0.1000 - 16 C 116.7320 100.4570 23.4640 C.1 1 UNL1 0.0040 - 17 C 118.6440 103.0300 25.6500 C.3 1 UNL1 0.1010 - 18 N 118.9190 103.0440 27.0840 N.3 1 UNL1 -0.3280 - 19 H 118.1850 102.5250 27.5670 H 1 UNL1 0.1180 - 20 H 118.8240 104.0010 27.4240 H 1 UNL1 0.1180 + 1 C 119.4990 101.0650 20.8750 C.3 1 UNL1 0.0011 + 2 C 119.4350 102.1420 21.9770 C.3 1 UNL1 0.0140 + 3 C 119.2020 101.5020 23.3840 C.3 1 UNL1 0.0843 + 4 C 119.6390 102.3180 24.6640 C.3 1 UNL1 0.0991 + 5 N 120.7430 103.2410 24.3530 N.pl3 1 UNL1 -0.3038 + 6 H 121.5620 103.1630 24.9500 H 1 UNL1 0.1496 + 7 C 120.5530 104.4350 23.7520 C.2 1 UNL1 0.1914 + 8 O 121.5970 105.2980 23.8510 O.2 1 UNL1 -0.4448 + 9 C 121.2620 106.4230 23.1640 C.2 1 UNL1 0.1246 + 10 C 119.9900 106.3010 22.6540 C.2 1 UNL1 0.0331 + 11 C 122.2830 107.4830 23.0840 C.3 1 UNL1 0.0725 + 12 C 119.5370 104.9950 22.9920 C.2 1 UNL1 0.0295 + 13 C 118.2470 104.3800 22.5600 C.3 1 UNL1 0.0309 + 14 C 118.4230 103.2320 21.5680 C.3 1 UNL1 0.0059 + 15 C 117.8520 100.8950 23.4530 C.1 1 UNL1 -0.0772 + 16 C 116.7320 100.4570 23.4640 C.1 1 UNL1 -0.0141 + 17 C 118.6440 103.0300 25.6500 C.3 1 UNL1 0.0859 + 18 N 118.9190 103.0440 27.0840 N.3 1 UNL1 -0.3197 + 19 H 118.1850 102.5250 27.5670 H 1 UNL1 0.1189 + 20 H 118.8240 104.0010 27.4240 H 1 UNL1 0.1189 @BOND - 1 1 2 1 - 2 14 2 1 - 3 14 13 1 - 4 2 3 1 - 5 13 12 1 - 6 10 12 1 - 7 10 9 2 - 8 12 7 2 - 9 11 9 1 + 1 2 1 1 + 2 2 3 1 + 3 3 15 1 + 4 3 4 1 + 5 4 17 1 + 6 5 4 1 + 7 5 6 1 + 8 7 8 1 + 9 7 5 1 10 9 8 1 - 11 3 15 1 - 12 3 4 1 - 13 15 16 3 - 14 7 8 1 - 15 7 5 1 - 16 5 4 1 - 17 5 6 1 - 18 4 17 1 + 11 10 12 1 + 12 10 9 2 + 13 11 9 1 + 14 12 7 2 + 15 13 12 1 + 16 14 2 1 + 17 14 13 1 + 18 15 16 3 19 17 18 1 20 18 20 1 21 18 19 1 @@ -54,48 +54,48 @@ SMALL GASTEIGER @ATOM - 1 C 115.7020 100.0510 22.7360 C.3 1 UNL1 0.0090 - 2 C 116.4880 101.3780 22.7420 C.3 1 UNL1 0.0030 - 3 C 115.5360 102.6000 22.9560 C.3 1 UNL1 0.0880 - 4 C 116.1490 103.9390 23.5290 C.3 1 UNL1 0.1020 - 5 N 117.3390 103.6680 24.3530 N.pl3 1 UNL1 -0.3100 - 6 H 117.3240 104.0650 25.2890 H 1 UNL1 0.1490 - 7 C 118.5570 103.4280 23.8240 C.2 1 UNL1 0.1900 - 8 O 119.5920 103.5430 24.6960 O.2 1 UNL1 -0.4460 - 9 C 120.7300 103.2310 24.0200 C.2 1 UNL1 0.1050 - 10 C 120.4360 102.9510 22.7060 C.2 1 UNL1 0.0500 - 11 C 121.9850 103.2290 24.7950 C.3 1 UNL1 0.0860 - 12 C 119.0210 103.0320 22.5780 C.2 1 UNL1 0.0130 - 13 C 118.2350 102.7060 21.3510 C.3 1 UNL1 0.0400 - 14 C 117.3840 101.4460 21.4890 C.3 1 UNL1 0.0090 - 15 C 114.6430 102.7640 21.7860 C.1 1 UNL1 -0.1000 - 16 C 113.8780 102.9450 20.8760 C.1 1 UNL1 0.0040 - 17 C 116.4030 105.2360 22.6810 C.3 1 UNL1 0.1010 - 18 N 115.7260 106.4830 23.0290 N.3 1 UNL1 -0.3280 - 19 H 114.7800 106.2690 23.3450 H 1 UNL1 0.1180 - 20 H 115.5960 107.0310 22.1780 H 1 UNL1 0.1180 + 1 C 115.7020 100.0510 22.7360 C.3 1 UNL1 0.0011 + 2 C 116.4880 101.3780 22.7420 C.3 1 UNL1 0.0140 + 3 C 115.5360 102.6000 22.9560 C.3 1 UNL1 0.0843 + 4 C 116.1490 103.9390 23.5290 C.3 1 UNL1 0.0991 + 5 N 117.3390 103.6680 24.3530 N.pl3 1 UNL1 -0.3038 + 6 H 117.3240 104.0650 25.2890 H 1 UNL1 0.1496 + 7 C 118.5570 103.4280 23.8240 C.2 1 UNL1 0.1914 + 8 O 119.5920 103.5430 24.6960 O.2 1 UNL1 -0.4448 + 9 C 120.7300 103.2310 24.0200 C.2 1 UNL1 0.1246 + 10 C 120.4360 102.9510 22.7060 C.2 1 UNL1 0.0331 + 11 C 121.9850 103.2290 24.7950 C.3 1 UNL1 0.0725 + 12 C 119.0210 103.0320 22.5780 C.2 1 UNL1 0.0295 + 13 C 118.2350 102.7060 21.3510 C.3 1 UNL1 0.0309 + 14 C 117.3840 101.4460 21.4890 C.3 1 UNL1 0.0059 + 15 C 114.6430 102.7640 21.7860 C.1 1 UNL1 -0.0772 + 16 C 113.8780 102.9450 20.8760 C.1 1 UNL1 -0.0141 + 17 C 116.4030 105.2360 22.6810 C.3 1 UNL1 0.0859 + 18 N 115.7260 106.4830 23.0290 N.3 1 UNL1 -0.3197 + 19 H 114.7800 106.2690 23.3450 H 1 UNL1 0.1189 + 20 H 115.5960 107.0310 22.1780 H 1 UNL1 0.1189 @BOND - 1 16 15 3 - 2 13 14 1 - 3 13 12 1 - 4 14 2 1 - 5 15 3 1 - 6 20 18 1 - 7 12 10 1 - 8 12 7 2 - 9 17 18 1 - 10 17 4 1 - 11 10 9 2 - 12 1 2 1 - 13 2 3 1 - 14 3 4 1 - 15 18 19 1 - 16 4 5 1 - 17 7 5 1 - 18 7 8 1 - 19 9 8 1 - 20 9 11 1 - 21 5 6 1 + 1 2 1 1 + 2 2 3 1 + 3 3 15 1 + 4 3 4 1 + 5 4 17 1 + 6 4 5 1 + 7 5 6 1 + 8 7 5 1 + 9 7 8 1 + 10 9 8 1 + 11 9 11 1 + 12 10 9 2 + 13 12 10 1 + 14 12 7 2 + 15 13 14 1 + 16 13 12 1 + 17 14 2 1 + 18 16 15 3 + 19 17 18 1 + 20 18 19 1 + 21 20 18 1 @MOLECULE = 20 21 0 0 0 @@ -103,48 +103,48 @@ SMALL GASTEIGER @ATOM - 1 C 114.0540 102.4250 21.9980 C.3 1 UNL1 0.0090 - 2 C 115.5770 102.3110 22.2110 C.3 1 UNL1 0.0030 - 3 C 116.0470 103.1800 23.4230 C.3 1 UNL1 0.0880 - 4 C 117.4030 102.8010 24.1400 C.3 1 UNL1 0.1020 - 5 N 117.6970 101.3650 23.9930 N.pl3 1 UNL1 -0.3100 - 6 H 117.8810 100.8640 24.8580 H 1 UNL1 0.1490 - 7 C 118.2320 100.8380 22.8710 C.2 1 UNL1 0.1900 - 8 O 118.7570 99.5940 23.0190 O.2 1 UNL1 -0.4460 - 9 C 119.2110 99.1970 21.8000 C.2 1 UNL1 0.1050 - 10 C 119.0130 100.1960 20.8750 C.2 1 UNL1 0.0500 - 11 C 119.7710 97.8360 21.7080 C.3 1 UNL1 0.0860 - 12 C 118.3380 101.2510 21.5510 C.2 1 UNL1 0.0130 - 13 C 117.8260 102.5040 20.9230 C.3 1 UNL1 0.0400 - 14 C 116.3020 102.5850 20.8780 C.3 1 UNL1 0.0090 - 15 C 115.8750 104.6190 23.1170 C.1 1 UNL1 -0.1000 - 16 C 115.7780 105.7780 22.8090 C.1 1 UNL1 0.0040 - 17 C 118.7420 103.6110 23.9990 C.3 1 UNL1 0.1010 - 18 N 119.4710 104.0330 25.1920 N.3 1 UNL1 -0.3280 - 19 H 118.8000 104.2950 25.9150 H 1 UNL1 0.1180 - 20 H 119.9700 104.8960 24.9790 H 1 UNL1 0.1180 + 1 C 114.0540 102.4250 21.9980 C.3 1 UNL1 0.0011 + 2 C 115.5770 102.3110 22.2110 C.3 1 UNL1 0.0140 + 3 C 116.0470 103.1800 23.4230 C.3 1 UNL1 0.0843 + 4 C 117.4030 102.8010 24.1400 C.3 1 UNL1 0.0991 + 5 N 117.6970 101.3650 23.9930 N.pl3 1 UNL1 -0.3038 + 6 H 117.8810 100.8640 24.8580 H 1 UNL1 0.1496 + 7 C 118.2320 100.8380 22.8710 C.2 1 UNL1 0.1914 + 8 O 118.7570 99.5940 23.0190 O.2 1 UNL1 -0.4448 + 9 C 119.2110 99.1970 21.8000 C.2 1 UNL1 0.1246 + 10 C 119.0130 100.1960 20.8750 C.2 1 UNL1 0.0331 + 11 C 119.7710 97.8360 21.7080 C.3 1 UNL1 0.0725 + 12 C 118.3380 101.2510 21.5510 C.2 1 UNL1 0.0295 + 13 C 117.8260 102.5040 20.9230 C.3 1 UNL1 0.0309 + 14 C 116.3020 102.5850 20.8780 C.3 1 UNL1 0.0059 + 15 C 115.8750 104.6190 23.1170 C.1 1 UNL1 -0.0772 + 16 C 115.7780 105.7780 22.8090 C.1 1 UNL1 -0.0141 + 17 C 118.7420 103.6110 23.9990 C.3 1 UNL1 0.0859 + 18 N 119.4710 104.0330 25.1920 N.3 1 UNL1 -0.3197 + 19 H 118.8000 104.2950 25.9150 H 1 UNL1 0.1189 + 20 H 119.9700 104.8960 24.9790 H 1 UNL1 0.1189 @BOND - 1 10 12 1 - 2 10 9 2 - 3 14 13 1 - 4 14 2 1 - 5 13 12 1 - 6 12 7 2 - 7 11 9 1 - 8 9 8 1 - 9 1 2 1 - 10 2 3 1 - 11 16 15 3 - 12 7 8 1 - 13 7 5 1 - 14 15 3 1 - 15 3 4 1 - 16 5 4 1 - 17 5 6 1 - 18 17 4 1 + 1 2 1 1 + 2 2 3 1 + 3 3 15 1 + 4 3 4 1 + 5 4 17 1 + 6 5 4 1 + 7 5 6 1 + 8 7 8 1 + 9 7 5 1 + 10 9 8 1 + 11 10 12 1 + 12 10 9 2 + 13 11 9 1 + 14 12 7 2 + 15 13 12 1 + 16 14 13 1 + 17 14 2 1 + 18 16 15 3 19 17 18 1 - 20 20 18 1 - 21 18 19 1 + 20 18 19 1 + 21 20 18 1 @MOLECULE = 20 21 0 0 0 @@ -152,48 +152,48 @@ SMALL GASTEIGER @ATOM - 1 C 116.5070 103.3700 20.8750 C.3 1 UNL1 0.0090 - 2 C 117.5500 102.6260 21.7330 C.3 1 UNL1 0.0030 - 3 C 117.7100 101.1400 21.2720 C.3 1 UNL1 0.0880 - 4 C 119.0530 100.3850 21.6190 C.3 1 UNL1 0.1020 - 5 N 120.1740 101.3300 21.7520 N.pl3 1 UNL1 -0.3100 - 6 H 120.9930 101.1230 21.1860 H 1 UNL1 0.1490 - 7 C 120.3880 102.0610 22.8670 C.2 1 UNL1 0.1900 - 8 O 121.6280 102.6050 22.9650 O.2 1 UNL1 -0.4460 - 9 C 121.6620 103.3360 24.1110 C.2 1 UNL1 0.1050 - 10 C 120.4600 103.2340 24.7710 C.2 1 UNL1 0.0500 - 11 C 122.9070 104.0760 24.3920 C.3 1 UNL1 0.0860 - 12 C 119.6080 102.4430 23.9490 C.2 1 UNL1 0.0130 - 13 C 118.1690 102.1480 24.2120 C.3 1 UNL1 0.0400 - 14 C 117.2190 102.8250 23.2260 C.3 1 UNL1 0.0090 - 15 C 116.4680 100.3830 21.5500 C.1 1 UNL1 -0.1000 - 16 C 115.4700 99.7810 21.8490 C.1 1 UNL1 0.0040 - 17 C 119.1910 99.2740 22.7210 C.3 1 UNL1 0.1010 - 18 N 119.0140 97.8670 22.3700 N.3 1 UNL1 -0.3280 - 19 H 119.4640 97.2900 23.0800 H 1 UNL1 0.1180 - 20 H 119.5370 97.6780 21.5140 H 1 UNL1 0.1180 + 1 C 116.5070 103.3700 20.8750 C.3 1 UNL1 0.0011 + 2 C 117.5500 102.6260 21.7330 C.3 1 UNL1 0.0140 + 3 C 117.7100 101.1400 21.2720 C.3 1 UNL1 0.0843 + 4 C 119.0530 100.3850 21.6190 C.3 1 UNL1 0.0991 + 5 N 120.1740 101.3300 21.7520 N.pl3 1 UNL1 -0.3038 + 6 H 120.9930 101.1230 21.1860 H 1 UNL1 0.1496 + 7 C 120.3880 102.0610 22.8670 C.2 1 UNL1 0.1914 + 8 O 121.6280 102.6050 22.9650 O.2 1 UNL1 -0.4448 + 9 C 121.6620 103.3360 24.1110 C.2 1 UNL1 0.1246 + 10 C 120.4600 103.2340 24.7710 C.2 1 UNL1 0.0331 + 11 C 122.9070 104.0760 24.3920 C.3 1 UNL1 0.0725 + 12 C 119.6080 102.4430 23.9490 C.2 1 UNL1 0.0295 + 13 C 118.1690 102.1480 24.2120 C.3 1 UNL1 0.0309 + 14 C 117.2190 102.8250 23.2260 C.3 1 UNL1 0.0059 + 15 C 116.4680 100.3830 21.5500 C.1 1 UNL1 -0.0772 + 16 C 115.4700 99.7810 21.8490 C.1 1 UNL1 -0.0141 + 17 C 119.1910 99.2740 22.7210 C.3 1 UNL1 0.0859 + 18 N 119.0140 97.8670 22.3700 N.3 1 UNL1 -0.3197 + 19 H 119.4640 97.2900 23.0800 H 1 UNL1 0.1189 + 20 H 119.5370 97.6780 21.5140 H 1 UNL1 0.1189 @BOND - 1 1 2 1 - 2 6 5 1 + 1 2 1 1 + 2 2 14 1 3 3 15 1 4 3 4 1 5 3 2 1 - 6 20 18 1 - 7 15 16 3 - 8 4 5 1 - 9 4 17 1 - 10 2 14 1 - 11 5 7 1 - 12 18 17 1 - 13 18 19 1 - 14 7 8 1 - 15 7 12 2 - 16 8 9 1 + 6 4 5 1 + 7 4 17 1 + 8 5 7 1 + 9 6 5 1 + 10 7 8 1 + 11 7 12 2 + 12 8 9 1 + 13 9 11 1 + 14 9 10 2 + 15 12 13 1 + 16 12 10 1 17 14 13 1 - 18 12 13 1 - 19 12 10 1 - 20 9 11 1 - 21 9 10 2 + 18 15 16 3 + 19 18 17 1 + 20 18 19 1 + 21 20 18 1 @MOLECULE = 20 21 0 0 0 @@ -201,48 +201,48 @@ SMALL GASTEIGER @ATOM - 1 C 116.8190 104.4660 23.1950 C.3 1 UNL1 0.0090 - 2 C 118.0090 103.5100 22.9750 C.3 1 UNL1 0.0030 - 3 C 119.2690 103.9800 23.7730 C.3 1 UNL1 0.0880 - 4 C 120.3760 102.9100 24.1280 C.3 1 UNL1 0.1020 - 5 N 119.7970 101.5590 24.2240 N.pl3 1 UNL1 -0.3100 - 6 H 119.9930 101.0580 25.0860 H 1 UNL1 0.1490 - 7 C 119.5220 100.8020 23.1410 C.2 1 UNL1 0.1900 - 8 O 119.3280 99.4830 23.4010 O.2 1 UNL1 -0.4460 - 9 C 119.0230 98.8770 22.2220 C.2 1 UNL1 0.1050 - 10 C 119.0560 99.7940 21.1980 C.2 1 UNL1 0.0500 - 11 C 118.7070 97.4370 22.2760 C.3 1 UNL1 0.0860 - 12 C 119.3360 101.0580 21.7910 C.2 1 UNL1 0.0130 - 13 C 119.3680 102.3690 21.0770 C.3 1 UNL1 0.0400 - 14 C 118.2210 103.3000 21.4620 C.3 1 UNL1 0.0090 - 15 C 119.7780 105.2560 23.2200 C.1 1 UNL1 -0.1000 - 16 C 120.1940 106.3190 22.8400 C.1 1 UNL1 0.0040 - 17 C 121.7780 102.8130 23.4270 C.3 1 UNL1 0.1010 - 18 N 122.8990 103.6130 23.9160 N.3 1 UNL1 -0.3280 - 19 H 123.5390 103.0060 24.4280 H 1 UNL1 0.1180 - 20 H 122.5490 104.2680 24.6150 H 1 UNL1 0.1180 + 1 C 116.8190 104.4660 23.1950 C.3 1 UNL1 0.0011 + 2 C 118.0090 103.5100 22.9750 C.3 1 UNL1 0.0140 + 3 C 119.2690 103.9800 23.7730 C.3 1 UNL1 0.0843 + 4 C 120.3760 102.9100 24.1280 C.3 1 UNL1 0.0991 + 5 N 119.7970 101.5590 24.2240 N.pl3 1 UNL1 -0.3038 + 6 H 119.9930 101.0580 25.0860 H 1 UNL1 0.1496 + 7 C 119.5220 100.8020 23.1410 C.2 1 UNL1 0.1914 + 8 O 119.3280 99.4830 23.4010 O.2 1 UNL1 -0.4448 + 9 C 119.0230 98.8770 22.2220 C.2 1 UNL1 0.1246 + 10 C 119.0560 99.7940 21.1980 C.2 1 UNL1 0.0331 + 11 C 118.7070 97.4370 22.2760 C.3 1 UNL1 0.0725 + 12 C 119.3360 101.0580 21.7910 C.2 1 UNL1 0.0295 + 13 C 119.3680 102.3690 21.0770 C.3 1 UNL1 0.0309 + 14 C 118.2210 103.3000 21.4620 C.3 1 UNL1 0.0059 + 15 C 119.7780 105.2560 23.2200 C.1 1 UNL1 -0.0772 + 16 C 120.1940 106.3190 22.8400 C.1 1 UNL1 -0.0141 + 17 C 121.7780 102.8130 23.4270 C.3 1 UNL1 0.0859 + 18 N 122.8990 103.6130 23.9160 N.3 1 UNL1 -0.3197 + 19 H 123.5390 103.0060 24.4280 H 1 UNL1 0.1189 + 20 H 122.5490 104.2680 24.6150 H 1 UNL1 0.1189 @BOND - 1 13 14 1 - 2 13 12 1 - 3 10 12 1 - 4 10 9 2 - 5 14 2 1 - 6 12 7 2 - 7 9 11 1 - 8 9 8 1 - 9 16 15 3 - 10 2 1 1 - 11 2 3 1 - 12 7 8 1 - 13 7 5 1 - 14 15 3 1 - 15 17 18 1 - 16 17 4 1 - 17 3 4 1 - 18 18 19 1 - 19 18 20 1 - 20 4 5 1 - 21 5 6 1 + 1 2 1 1 + 2 2 3 1 + 3 3 15 1 + 4 3 4 1 + 5 4 17 1 + 6 4 5 1 + 7 5 6 1 + 8 7 8 1 + 9 7 5 1 + 10 9 11 1 + 11 9 8 1 + 12 10 12 1 + 13 10 9 2 + 14 12 7 2 + 15 13 14 1 + 16 13 12 1 + 17 14 2 1 + 18 16 15 3 + 19 17 18 1 + 20 18 19 1 + 21 18 20 1 @MOLECULE = 20 21 0 0 0 @@ -250,48 +250,48 @@ SMALL GASTEIGER @ATOM - 1 C 118.3830 105.7440 22.1080 C.3 1 UNL1 0.0090 - 2 C 118.6990 104.3500 22.6880 C.3 1 UNL1 0.0030 - 3 C 119.5220 104.4590 24.0130 C.3 1 UNL1 0.0880 - 4 C 119.4790 103.2480 25.0270 C.3 1 UNL1 0.1020 - 5 N 118.2200 102.4930 24.8990 N.pl3 1 UNL1 -0.3100 - 6 H 117.6990 102.3600 25.7620 H 1 UNL1 0.1490 - 7 C 118.0070 101.5840 23.9240 C.2 1 UNL1 0.1900 - 8 O 116.9640 100.7430 24.1460 O.2 1 UNL1 -0.4460 - 9 C 116.8620 99.9280 23.0620 C.2 1 UNL1 0.1050 - 10 C 117.8580 100.2170 22.1590 C.2 1 UNL1 0.0500 - 11 C 115.7460 98.9640 23.0570 C.3 1 UNL1 0.0860 - 12 C 118.5820 101.3220 22.6890 C.2 1 UNL1 0.0130 - 13 C 119.6930 102.0480 22.0050 C.3 1 UNL1 0.0400 - 14 C 119.3250 103.4700 21.5870 C.3 1 UNL1 0.0090 - 15 C 120.8710 105.0010 23.7330 C.1 1 UNL1 -0.1000 - 16 C 121.9590 105.4860 23.5640 C.1 1 UNL1 0.0040 - 17 C 120.6570 102.2350 25.2550 C.3 1 UNL1 0.1010 - 18 N 121.4160 102.2640 26.5030 N.3 1 UNL1 -0.3280 - 19 H 122.4110 102.2010 26.2860 H 1 UNL1 0.1180 - 20 H 121.2120 101.4120 27.0260 H 1 UNL1 0.1180 + 1 C 118.3830 105.7440 22.1080 C.3 1 UNL1 0.0011 + 2 C 118.6990 104.3500 22.6880 C.3 1 UNL1 0.0140 + 3 C 119.5220 104.4590 24.0130 C.3 1 UNL1 0.0843 + 4 C 119.4790 103.2480 25.0270 C.3 1 UNL1 0.0991 + 5 N 118.2200 102.4930 24.8990 N.pl3 1 UNL1 -0.3038 + 6 H 117.6990 102.3600 25.7620 H 1 UNL1 0.1496 + 7 C 118.0070 101.5840 23.9240 C.2 1 UNL1 0.1914 + 8 O 116.9640 100.7430 24.1460 O.2 1 UNL1 -0.4448 + 9 C 116.8620 99.9280 23.0620 C.2 1 UNL1 0.1246 + 10 C 117.8580 100.2170 22.1590 C.2 1 UNL1 0.0331 + 11 C 115.7460 98.9640 23.0570 C.3 1 UNL1 0.0725 + 12 C 118.5820 101.3220 22.6890 C.2 1 UNL1 0.0295 + 13 C 119.6930 102.0480 22.0050 C.3 1 UNL1 0.0309 + 14 C 119.3250 103.4700 21.5870 C.3 1 UNL1 0.0059 + 15 C 120.8710 105.0010 23.7330 C.1 1 UNL1 -0.0772 + 16 C 121.9590 105.4860 23.5640 C.1 1 UNL1 -0.0141 + 17 C 120.6570 102.2350 25.2550 C.3 1 UNL1 0.0859 + 18 N 121.4160 102.2640 26.5030 N.3 1 UNL1 -0.3197 + 19 H 122.4110 102.2010 26.2860 H 1 UNL1 0.1189 + 20 H 121.2120 101.4120 27.0260 H 1 UNL1 0.1189 @BOND - 1 14 13 1 - 2 14 2 1 - 3 13 12 1 - 4 1 2 1 - 5 10 12 1 - 6 10 9 2 - 7 2 3 1 - 8 12 7 2 - 9 11 9 1 + 1 2 1 1 + 2 2 3 1 + 3 3 15 1 + 4 3 4 1 + 5 4 17 1 + 6 5 4 1 + 7 5 6 1 + 8 7 8 1 + 9 7 5 1 10 9 8 1 - 11 16 15 3 - 12 15 3 1 - 13 7 8 1 - 14 7 5 1 - 15 3 4 1 - 16 5 4 1 - 17 5 6 1 - 18 4 17 1 + 11 10 12 1 + 12 10 9 2 + 13 11 9 1 + 14 12 7 2 + 15 13 12 1 + 16 14 13 1 + 17 14 2 1 + 18 16 15 3 19 17 18 1 - 20 19 18 1 - 21 18 20 1 + 20 18 20 1 + 21 19 18 1 @MOLECULE = 20 21 0 0 0 @@ -299,48 +299,48 @@ SMALL GASTEIGER @ATOM - 1 C 119.4170 103.2430 26.1760 C.3 1 UNL1 0.0090 - 2 C 119.0830 102.8690 24.7170 C.3 1 UNL1 0.0030 - 3 C 120.1910 101.9560 24.0980 C.3 1 UNL1 0.0880 - 4 C 119.8100 101.0390 22.8700 C.3 1 UNL1 0.1020 - 5 N 118.3760 100.6990 22.8860 N.pl3 1 UNL1 -0.3100 - 6 H 118.1600 99.7070 22.8320 H 1 UNL1 0.1490 - 7 C 117.4180 101.5440 22.4530 C.2 1 UNL1 0.1900 - 8 O 116.2130 100.9670 22.2100 O.2 1 UNL1 -0.4460 - 9 C 115.3590 101.9530 21.8260 C.2 1 UNL1 0.1050 - 10 C 116.0190 103.1590 21.7860 C.2 1 UNL1 0.0500 - 11 C 113.9610 101.5600 21.5690 C.3 1 UNL1 0.0860 - 12 C 117.3480 102.9120 22.2350 C.2 1 UNL1 0.0130 - 13 C 118.4010 103.9470 22.4530 C.3 1 UNL1 0.0400 - 14 C 118.7590 104.1510 23.9230 C.3 1 UNL1 0.0090 - 15 C 121.4550 102.7130 23.9520 C.1 1 UNL1 -0.1000 - 16 C 122.4660 103.3630 23.8980 C.1 1 UNL1 0.0040 - 17 C 120.2510 101.3070 21.3860 C.3 1 UNL1 0.1010 - 18 N 121.4920 100.7310 20.8750 N.3 1 UNL1 -0.3280 - 19 H 122.2170 100.8250 21.5860 H 1 UNL1 0.1180 - 20 H 121.8180 101.3020 20.0960 H 1 UNL1 0.1180 + 1 C 119.4170 103.2430 26.1760 C.3 1 UNL1 0.0011 + 2 C 119.0830 102.8690 24.7170 C.3 1 UNL1 0.0140 + 3 C 120.1910 101.9560 24.0980 C.3 1 UNL1 0.0843 + 4 C 119.8100 101.0390 22.8700 C.3 1 UNL1 0.0991 + 5 N 118.3760 100.6990 22.8860 N.pl3 1 UNL1 -0.3038 + 6 H 118.1600 99.7070 22.8320 H 1 UNL1 0.1496 + 7 C 117.4180 101.5440 22.4530 C.2 1 UNL1 0.1914 + 8 O 116.2130 100.9670 22.2100 O.2 1 UNL1 -0.4448 + 9 C 115.3590 101.9530 21.8260 C.2 1 UNL1 0.1246 + 10 C 116.0190 103.1590 21.7860 C.2 1 UNL1 0.0331 + 11 C 113.9610 101.5600 21.5690 C.3 1 UNL1 0.0725 + 12 C 117.3480 102.9120 22.2350 C.2 1 UNL1 0.0295 + 13 C 118.4010 103.9470 22.4530 C.3 1 UNL1 0.0309 + 14 C 118.7590 104.1510 23.9230 C.3 1 UNL1 0.0059 + 15 C 121.4550 102.7130 23.9520 C.1 1 UNL1 -0.0772 + 16 C 122.4660 103.3630 23.8980 C.1 1 UNL1 -0.0141 + 17 C 120.2510 101.3070 21.3860 C.3 1 UNL1 0.0859 + 18 N 121.4920 100.7310 20.8750 N.3 1 UNL1 -0.3197 + 19 H 122.2170 100.8250 21.5860 H 1 UNL1 0.1189 + 20 H 121.8180 101.3020 20.0960 H 1 UNL1 0.1189 @BOND - 1 20 18 1 - 2 18 17 1 - 3 18 19 1 - 4 17 4 1 - 5 11 9 1 - 6 10 9 2 - 7 10 12 1 - 8 9 8 1 + 1 2 1 1 + 2 3 15 1 + 3 3 2 1 + 4 4 17 1 + 5 4 5 1 + 6 4 3 1 + 7 6 5 1 + 8 7 5 1 9 8 7 1 - 10 12 7 2 - 11 12 13 1 - 12 7 5 1 - 13 13 14 1 - 14 6 5 1 - 15 4 5 1 - 16 4 3 1 - 17 16 15 3 - 18 14 2 1 - 19 15 3 1 - 20 3 2 1 - 21 2 1 1 + 10 9 8 1 + 11 10 9 2 + 12 10 12 1 + 13 11 9 1 + 14 12 7 2 + 15 12 13 1 + 16 13 14 1 + 17 14 2 1 + 18 16 15 3 + 19 18 17 1 + 20 18 19 1 + 21 20 18 1 @MOLECULE = 20 21 0 0 0 @@ -348,48 +348,48 @@ SMALL GASTEIGER @ATOM - 1 C 115.7920 103.4600 24.1910 C.3 1 UNL1 0.0090 - 2 C 116.6880 102.5430 23.3330 C.3 1 UNL1 0.0030 - 3 C 118.1790 103.0130 23.3680 C.3 1 UNL1 0.0880 - 4 C 119.3070 101.9580 23.0370 C.3 1 UNL1 0.1020 - 5 N 118.8670 100.5910 23.3610 N.pl3 1 UNL1 -0.3100 - 6 H 119.4890 100.0620 23.9670 H 1 UNL1 0.1490 - 7 C 118.0630 99.8690 22.5520 C.2 1 UNL1 0.1900 - 8 O 118.0360 98.5370 22.8140 O.2 1 UNL1 -0.4460 - 9 C 117.1560 97.9690 21.9460 C.2 1 UNL1 0.1050 - 10 C 116.6440 98.9260 21.1020 C.2 1 UNL1 0.0500 - 11 C 116.9180 96.5210 22.0920 C.3 1 UNL1 0.0860 - 12 C 117.1930 100.1730 21.5160 C.2 1 UNL1 0.0130 - 13 C 116.8430 101.5100 20.9530 C.3 1 UNL1 0.0400 - 14 C 116.0710 102.3970 21.9270 C.3 1 UNL1 0.0090 - 15 C 118.3190 104.3220 22.6890 C.1 1 UNL1 -0.1000 - 16 C 118.3600 105.3970 22.1510 C.1 1 UNL1 0.0040 - 17 C 120.1290 101.9230 21.6990 C.3 1 UNL1 0.1010 - 18 N 121.3880 101.1840 21.6310 N.3 1 UNL1 -0.3280 - 19 H 121.3520 100.5430 20.8380 H 1 UNL1 0.1180 - 20 H 121.4520 100.5780 22.4490 H 1 UNL1 0.1180 + 1 C 115.7920 103.4600 24.1910 C.3 1 UNL1 0.0011 + 2 C 116.6880 102.5430 23.3330 C.3 1 UNL1 0.0140 + 3 C 118.1790 103.0130 23.3680 C.3 1 UNL1 0.0843 + 4 C 119.3070 101.9580 23.0370 C.3 1 UNL1 0.0991 + 5 N 118.8670 100.5910 23.3610 N.pl3 1 UNL1 -0.3038 + 6 H 119.4890 100.0620 23.9670 H 1 UNL1 0.1496 + 7 C 118.0630 99.8690 22.5520 C.2 1 UNL1 0.1914 + 8 O 118.0360 98.5370 22.8140 O.2 1 UNL1 -0.4448 + 9 C 117.1560 97.9690 21.9460 C.2 1 UNL1 0.1246 + 10 C 116.6440 98.9260 21.1020 C.2 1 UNL1 0.0331 + 11 C 116.9180 96.5210 22.0920 C.3 1 UNL1 0.0725 + 12 C 117.1930 100.1730 21.5160 C.2 1 UNL1 0.0295 + 13 C 116.8430 101.5100 20.9530 C.3 1 UNL1 0.0309 + 14 C 116.0710 102.3970 21.9270 C.3 1 UNL1 0.0059 + 15 C 118.3190 104.3220 22.6890 C.1 1 UNL1 -0.0772 + 16 C 118.3600 105.3970 22.1510 C.1 1 UNL1 -0.0141 + 17 C 120.1290 101.9230 21.6990 C.3 1 UNL1 0.0859 + 18 N 121.3880 101.1840 21.6310 N.3 1 UNL1 -0.3197 + 19 H 121.3520 100.5430 20.8380 H 1 UNL1 0.1189 + 20 H 121.4520 100.5780 22.4490 H 1 UNL1 0.1189 @BOND - 1 19 18 1 - 2 13 12 1 - 3 13 14 1 - 4 10 12 1 - 5 10 9 2 - 6 12 7 2 - 7 18 17 1 - 8 18 20 1 - 9 17 4 1 - 10 14 2 1 - 11 9 11 1 - 12 9 8 1 - 13 16 15 3 - 14 7 8 1 - 15 7 5 1 - 16 15 3 1 - 17 4 5 1 - 18 4 3 1 - 19 2 3 1 - 20 2 1 1 - 21 5 6 1 + 1 2 3 1 + 2 2 1 1 + 3 3 15 1 + 4 4 17 1 + 5 4 5 1 + 6 4 3 1 + 7 5 6 1 + 8 7 8 1 + 9 7 5 1 + 10 9 11 1 + 11 9 8 1 + 12 10 12 1 + 13 10 9 2 + 14 12 7 2 + 15 13 12 1 + 16 13 14 1 + 17 14 2 1 + 18 16 15 3 + 19 18 17 1 + 20 18 20 1 + 21 19 18 1 @MOLECULE = 20 21 0 0 0 @@ -397,45 +397,45 @@ SMALL GASTEIGER @ATOM - 1 C 119.7310 99.9290 23.0800 C.3 1 UNL1 0.0090 - 2 C 119.0280 101.3010 23.1200 C.3 1 UNL1 0.0030 - 3 C 120.0630 102.4720 23.0510 C.3 1 UNL1 0.0880 - 4 C 119.5700 103.8820 22.5390 C.3 1 UNL1 0.1020 - 5 N 118.4220 103.7440 21.6270 N.pl3 1 UNL1 -0.3100 - 6 H 118.5210 104.2010 20.7240 H 1 UNL1 0.1490 - 7 C 117.1600 103.5480 22.0630 C.2 1 UNL1 0.1900 - 8 O 116.1920 103.7880 21.1400 O.2 1 UNL1 -0.4460 - 9 C 114.9960 103.5050 21.7220 C.2 1 UNL1 0.1050 - 10 C 115.1870 103.1180 23.0290 C.2 1 UNL1 0.0500 - 11 C 113.7960 103.6350 20.8750 C.3 1 UNL1 0.0860 - 12 C 116.5940 103.1000 23.2480 C.2 1 UNL1 0.0130 - 13 C 117.2770 102.6430 24.4940 C.3 1 UNL1 0.0400 - 14 C 118.0580 101.3430 24.3180 C.3 1 UNL1 0.0090 - 15 C 120.8860 102.4980 24.2820 C.1 1 UNL1 -0.1000 - 16 C 121.5210 102.5840 25.3000 C.1 1 UNL1 0.0040 - 17 C 119.3400 105.1330 23.4600 C.3 1 UNL1 0.1010 - 18 N 120.3530 106.1830 23.5370 N.3 1 UNL1 -0.3280 - 19 H 121.1760 105.8870 23.0120 H 1 UNL1 0.1180 - 20 H 120.6750 106.2530 24.5020 H 1 UNL1 0.1180 + 1 C 119.7310 99.9290 23.0800 C.3 1 UNL1 0.0011 + 2 C 119.0280 101.3010 23.1200 C.3 1 UNL1 0.0140 + 3 C 120.0630 102.4720 23.0510 C.3 1 UNL1 0.0843 + 4 C 119.5700 103.8820 22.5390 C.3 1 UNL1 0.0991 + 5 N 118.4220 103.7440 21.6270 N.pl3 1 UNL1 -0.3038 + 6 H 118.5210 104.2010 20.7240 H 1 UNL1 0.1496 + 7 C 117.1600 103.5480 22.0630 C.2 1 UNL1 0.1914 + 8 O 116.1920 103.7880 21.1400 O.2 1 UNL1 -0.4448 + 9 C 114.9960 103.5050 21.7220 C.2 1 UNL1 0.1246 + 10 C 115.1870 103.1180 23.0290 C.2 1 UNL1 0.0331 + 11 C 113.7960 103.6350 20.8750 C.3 1 UNL1 0.0725 + 12 C 116.5940 103.1000 23.2480 C.2 1 UNL1 0.0295 + 13 C 117.2770 102.6430 24.4940 C.3 1 UNL1 0.0309 + 14 C 118.0580 101.3430 24.3180 C.3 1 UNL1 0.0059 + 15 C 120.8860 102.4980 24.2820 C.1 1 UNL1 -0.0772 + 16 C 121.5210 102.5840 25.3000 C.1 1 UNL1 -0.0141 + 17 C 119.3400 105.1330 23.4600 C.3 1 UNL1 0.0859 + 18 N 120.3530 106.1830 23.5370 N.3 1 UNL1 -0.3197 + 19 H 121.1760 105.8870 23.0120 H 1 UNL1 0.1189 + 20 H 120.6750 106.2530 24.5020 H 1 UNL1 0.1189 @BOND - 1 6 5 1 - 2 11 9 1 - 3 8 9 1 - 4 8 7 1 - 5 5 7 1 - 6 5 4 1 - 7 9 10 2 - 8 7 12 2 - 9 4 3 1 - 10 4 17 1 - 11 19 18 1 - 12 10 12 1 - 13 3 2 1 - 14 3 15 1 - 15 1 2 1 - 16 2 14 1 - 17 12 13 1 - 18 17 18 1 - 19 18 20 1 - 20 15 16 3 - 21 14 13 1 + 1 2 1 1 + 2 2 14 1 + 3 3 2 1 + 4 3 15 1 + 5 4 3 1 + 6 4 17 1 + 7 5 7 1 + 8 5 4 1 + 9 6 5 1 + 10 7 12 2 + 11 8 9 1 + 12 8 7 1 + 13 9 10 2 + 14 10 12 1 + 15 11 9 1 + 16 12 13 1 + 17 14 13 1 + 18 15 16 3 + 19 17 18 1 + 20 18 20 1 + 21 19 18 1 diff --git a/tests/structure/data/molecules/10000_docked_1.mol b/tests/structure/data/molecules/10000_docked_1.mol new file mode 100644 index 000000000..1d0f214f1 --- /dev/null +++ b/tests/structure/data/molecules/10000_docked_1.mol @@ -0,0 +1,47 @@ += + PyMOL2.5 3D 0 + + 20 21 0 0 0 0 0 0 0 0999 V2000 + 119.4990 101.0650 20.8750 C 0 0 0 0 0 0 0 0 0 0 0 0 + 119.4350 102.1420 21.9770 C 0 0 0 0 0 0 0 0 0 0 0 0 + 119.2020 101.5020 23.3840 C 0 0 0 0 0 0 0 0 0 0 0 0 + 119.6390 102.3180 24.6640 C 0 0 0 0 0 0 0 0 0 0 0 0 + 120.7430 103.2410 24.3530 N 0 0 0 0 0 0 0 0 0 0 0 0 + 121.5620 103.1630 24.9500 H 0 0 0 0 0 0 0 0 0 0 0 0 + 120.5530 104.4350 23.7520 C 0 0 0 0 0 0 0 0 0 0 0 0 + 121.5970 105.2980 23.8510 O 0 0 0 0 0 0 0 0 0 0 0 0 + 121.2620 106.4230 23.1640 C 0 0 0 0 0 0 0 0 0 0 0 0 + 119.9900 106.3010 22.6540 C 0 0 0 0 0 0 0 0 0 0 0 0 + 122.2830 107.4830 23.0840 C 0 0 0 0 0 0 0 0 0 0 0 0 + 119.5370 104.9950 22.9920 C 0 0 0 0 0 0 0 0 0 0 0 0 + 118.2470 104.3800 22.5600 C 0 0 0 0 0 0 0 0 0 0 0 0 + 118.4230 103.2320 21.5680 C 0 0 0 0 0 0 0 0 0 0 0 0 + 117.8520 100.8950 23.4530 C 0 0 0 0 0 0 0 0 0 0 0 0 + 116.7320 100.4570 23.4640 C 0 0 0 0 0 0 0 0 0 0 0 0 + 118.6440 103.0300 25.6500 C 0 0 0 0 0 0 0 0 0 0 0 0 + 118.9190 103.0440 27.0840 N 0 0 0 0 0 0 0 0 0 0 0 0 + 118.1850 102.5250 27.5670 H 0 0 0 0 0 0 0 0 0 0 0 0 + 118.8240 104.0010 27.4240 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 14 1 0 0 0 0 + 13 14 1 0 0 0 0 + 2 3 1 0 0 0 0 + 12 13 1 0 0 0 0 + 10 12 1 0 0 0 0 + 9 10 2 0 0 0 0 + 7 12 2 0 0 0 0 + 9 11 1 0 0 0 0 + 8 9 1 0 0 0 0 + 3 15 1 0 0 0 0 + 3 4 1 0 0 0 0 + 15 16 3 0 0 0 0 + 7 8 1 0 0 0 0 + 5 7 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 6 1 0 0 0 0 + 4 17 1 0 0 0 0 + 17 18 1 0 0 0 0 + 18 20 1 0 0 0 0 + 18 19 1 0 0 0 0 +M END +$$$$ diff --git a/tests/structure/data/molecules/10000_docked_1.mol2 b/tests/structure/data/molecules/10000_docked_1.mol2 new file mode 100644 index 000000000..e93309630 --- /dev/null +++ b/tests/structure/data/molecules/10000_docked_1.mol2 @@ -0,0 +1,49 @@ +@MOLECULE += + 20 21 0 0 0 +SMALL +GASTEIGER + +@ATOM + 1 C 119.4990 101.0650 20.8750 C.3 1 UNL1 0.0011 + 2 C 119.4350 102.1420 21.9770 C.3 1 UNL1 0.0140 + 3 C 119.2020 101.5020 23.3840 C.3 1 UNL1 0.0843 + 4 C 119.6390 102.3180 24.6640 C.3 1 UNL1 0.0991 + 5 N 120.7430 103.2410 24.3530 N.pl3 1 UNL1 -0.3038 + 6 H 121.5620 103.1630 24.9500 H 1 UNL1 0.1496 + 7 C 120.5530 104.4350 23.7520 C.ar 1 UNL1 0.1914 + 8 O 121.5970 105.2980 23.8510 O.2 1 UNL1 -0.4448 + 9 C 121.2620 106.4230 23.1640 C.ar 1 UNL1 0.1246 + 10 C 119.9900 106.3010 22.6540 C.ar 1 UNL1 0.0331 + 11 C 122.2830 107.4830 23.0840 C.3 1 UNL1 0.0725 + 12 C 119.5370 104.9950 22.9920 C.ar 1 UNL1 0.0295 + 13 C 118.2470 104.3800 22.5600 C.3 1 UNL1 0.0309 + 14 C 118.4230 103.2320 21.5680 C.3 1 UNL1 0.0059 + 15 C 117.8520 100.8950 23.4530 C.1 1 UNL1 -0.0772 + 16 C 116.7320 100.4570 23.4640 C.1 1 UNL1 -0.0141 + 17 C 118.6440 103.0300 25.6500 C.3 1 UNL1 0.0859 + 18 N 118.9190 103.0440 27.0840 N.3 1 UNL1 -0.3197 + 19 H 118.1850 102.5250 27.5670 H 1 UNL1 0.1189 + 20 H 118.8240 104.0010 27.4240 H 1 UNL1 0.1189 +@BOND + 1 1 2 1 + 2 2 14 1 + 3 13 14 1 + 4 2 3 1 + 5 12 13 1 + 6 10 12 ar + 7 9 10 ar + 8 7 12 ar + 9 9 11 1 + 10 8 9 ar + 11 3 15 1 + 12 3 4 1 + 13 15 16 3 + 14 7 8 ar + 15 5 7 1 + 16 4 5 1 + 17 5 6 1 + 18 4 17 1 + 19 17 18 1 + 20 18 20 1 + 21 18 19 1 diff --git a/tests/structure/data/molecules/10000_docked_1.xyz b/tests/structure/data/molecules/10000_docked_1.xyz new file mode 100644 index 000000000..be4898cff --- /dev/null +++ b/tests/structure/data/molecules/10000_docked_1.xyz @@ -0,0 +1,22 @@ +20 += +C 119.49900 101.06500 20.87500 +C 119.43500 102.14200 21.97700 +C 119.20200 101.50200 23.38400 +C 119.63900 102.31800 24.66400 +N 120.74300 103.24100 24.35300 +H 121.56200 103.16300 24.95000 +C 120.55300 104.43500 23.75200 +O 121.59700 105.29800 23.85100 +C 121.26200 106.42300 23.16400 +C 119.99000 106.30100 22.65400 +C 122.28300 107.48300 23.08400 +C 119.53700 104.99500 22.99200 +C 118.24700 104.38000 22.56000 +C 118.42300 103.23200 21.56800 +C 117.85200 100.89500 23.45300 +C 116.73200 100.45700 23.46400 +C 118.64400 103.03000 25.65000 +N 118.91900 103.04400 27.08400 +H 118.18500 102.52500 27.56700 +H 118.82400 104.00100 27.42400 diff --git a/tests/structure/data/molecules/10000_docked_2.mol b/tests/structure/data/molecules/10000_docked_2.mol new file mode 100644 index 000000000..f92f5f801 --- /dev/null +++ b/tests/structure/data/molecules/10000_docked_2.mol @@ -0,0 +1,47 @@ += + PyMOL2.5 3D 0 + + 20 21 0 0 0 0 0 0 0 0999 V2000 + 115.7020 100.0510 22.7360 C 0 0 0 0 0 0 0 0 0 0 0 0 + 116.4880 101.3780 22.7420 C 0 0 0 0 0 0 0 0 0 0 0 0 + 115.5360 102.6000 22.9560 C 0 0 0 0 0 0 0 0 0 0 0 0 + 116.1490 103.9390 23.5290 C 0 0 0 0 0 0 0 0 0 0 0 0 + 117.3390 103.6680 24.3530 N 0 0 0 0 0 0 0 0 0 0 0 0 + 117.3240 104.0650 25.2890 H 0 0 0 0 0 0 0 0 0 0 0 0 + 118.5570 103.4280 23.8240 C 0 0 0 0 0 0 0 0 0 0 0 0 + 119.5920 103.5430 24.6960 O 0 0 0 0 0 0 0 0 0 0 0 0 + 120.7300 103.2310 24.0200 C 0 0 0 0 0 0 0 0 0 0 0 0 + 120.4360 102.9510 22.7060 C 0 0 0 0 0 0 0 0 0 0 0 0 + 121.9850 103.2290 24.7950 C 0 0 0 0 0 0 0 0 0 0 0 0 + 119.0210 103.0320 22.5780 C 0 0 0 0 0 0 0 0 0 0 0 0 + 118.2350 102.7060 21.3510 C 0 0 0 0 0 0 0 0 0 0 0 0 + 117.3840 101.4460 21.4890 C 0 0 0 0 0 0 0 0 0 0 0 0 + 114.6430 102.7640 21.7860 C 0 0 0 0 0 0 0 0 0 0 0 0 + 113.8780 102.9450 20.8760 C 0 0 0 0 0 0 0 0 0 0 0 0 + 116.4030 105.2360 22.6810 C 0 0 0 0 0 0 0 0 0 0 0 0 + 115.7260 106.4830 23.0290 N 0 0 0 0 0 0 0 0 0 0 0 0 + 114.7800 106.2690 23.3450 H 0 0 0 0 0 0 0 0 0 0 0 0 + 115.5960 107.0310 22.1780 H 0 0 0 0 0 0 0 0 0 0 0 0 + 15 16 3 0 0 0 0 + 13 14 1 0 0 0 0 + 12 13 1 0 0 0 0 + 2 14 1 0 0 0 0 + 3 15 1 0 0 0 0 + 18 20 1 0 0 0 0 + 10 12 1 0 0 0 0 + 7 12 2 0 0 0 0 + 17 18 1 0 0 0 0 + 4 17 1 0 0 0 0 + 9 10 2 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 + 3 4 1 0 0 0 0 + 18 19 1 0 0 0 0 + 4 5 1 0 0 0 0 + 5 7 1 0 0 0 0 + 7 8 1 0 0 0 0 + 8 9 1 0 0 0 0 + 9 11 1 0 0 0 0 + 5 6 1 0 0 0 0 +M END +$$$$ diff --git a/tests/structure/data/molecules/10000_docked_2.mol2 b/tests/structure/data/molecules/10000_docked_2.mol2 new file mode 100644 index 000000000..253d2d2d1 --- /dev/null +++ b/tests/structure/data/molecules/10000_docked_2.mol2 @@ -0,0 +1,49 @@ +@MOLECULE += + 20 21 0 0 0 +SMALL +GASTEIGER + +@ATOM + 1 C 115.7020 100.0510 22.7360 C.3 1 UNL1 0.0011 + 2 C 116.4880 101.3780 22.7420 C.3 1 UNL1 0.0140 + 3 C 115.5360 102.6000 22.9560 C.3 1 UNL1 0.0843 + 4 C 116.1490 103.9390 23.5290 C.3 1 UNL1 0.0991 + 5 N 117.3390 103.6680 24.3530 N.pl3 1 UNL1 -0.3038 + 6 H 117.3240 104.0650 25.2890 H 1 UNL1 0.1496 + 7 C 118.5570 103.4280 23.8240 C.ar 1 UNL1 0.1914 + 8 O 119.5920 103.5430 24.6960 O.2 1 UNL1 -0.4448 + 9 C 120.7300 103.2310 24.0200 C.ar 1 UNL1 0.1246 + 10 C 120.4360 102.9510 22.7060 C.ar 1 UNL1 0.0331 + 11 C 121.9850 103.2290 24.7950 C.3 1 UNL1 0.0725 + 12 C 119.0210 103.0320 22.5780 C.ar 1 UNL1 0.0295 + 13 C 118.2350 102.7060 21.3510 C.3 1 UNL1 0.0309 + 14 C 117.3840 101.4460 21.4890 C.3 1 UNL1 0.0059 + 15 C 114.6430 102.7640 21.7860 C.1 1 UNL1 -0.0772 + 16 C 113.8780 102.9450 20.8760 C.1 1 UNL1 -0.0141 + 17 C 116.4030 105.2360 22.6810 C.3 1 UNL1 0.0859 + 18 N 115.7260 106.4830 23.0290 N.3 1 UNL1 -0.3197 + 19 H 114.7800 106.2690 23.3450 H 1 UNL1 0.1189 + 20 H 115.5960 107.0310 22.1780 H 1 UNL1 0.1189 +@BOND + 1 15 16 3 + 2 13 14 1 + 3 12 13 1 + 4 2 14 1 + 5 3 15 1 + 6 18 20 1 + 7 10 12 ar + 8 7 12 ar + 9 17 18 1 + 10 4 17 1 + 11 9 10 ar + 12 1 2 1 + 13 2 3 1 + 14 3 4 1 + 15 18 19 1 + 16 4 5 1 + 17 5 7 1 + 18 7 8 ar + 19 8 9 ar + 20 9 11 1 + 21 5 6 1 diff --git a/tests/structure/data/molecules/10000_docked_2.xyz b/tests/structure/data/molecules/10000_docked_2.xyz new file mode 100644 index 000000000..bc7108466 --- /dev/null +++ b/tests/structure/data/molecules/10000_docked_2.xyz @@ -0,0 +1,22 @@ +20 += +C 115.70200 100.05100 22.73600 +C 116.48800 101.37800 22.74200 +C 115.53600 102.60000 22.95600 +C 116.14900 103.93900 23.52900 +N 117.33900 103.66800 24.35300 +H 117.32400 104.06500 25.28900 +C 118.55700 103.42800 23.82400 +O 119.59200 103.54300 24.69600 +C 120.73000 103.23100 24.02000 +C 120.43600 102.95100 22.70600 +C 121.98500 103.22900 24.79500 +C 119.02100 103.03200 22.57800 +C 118.23500 102.70600 21.35100 +C 117.38400 101.44600 21.48900 +C 114.64300 102.76400 21.78600 +C 113.87800 102.94500 20.87600 +C 116.40300 105.23600 22.68100 +N 115.72600 106.48300 23.02900 +H 114.78000 106.26900 23.34500 +H 115.59600 107.03100 22.17800 diff --git a/tests/structure/data/molecules/10000_docked_single_state.mol2 b/tests/structure/data/molecules/10000_docked_single_state.mol2 deleted file mode 100644 index f00dfd134..000000000 --- a/tests/structure/data/molecules/10000_docked_single_state.mol2 +++ /dev/null @@ -1,49 +0,0 @@ -@MOLECULE -= - 20 21 0 0 0 -SMALL -GASTEIGER - -@ATOM - 1 C 116.5070 103.3700 20.8750 C.3 1 UNL1 0.0090 - 2 C 117.5500 102.6260 21.7330 C.3 1 UNL1 0.0030 - 3 C 117.7100 101.1400 21.2720 C.3 1 UNL1 0.0880 - 4 C 119.0530 100.3850 21.6190 C.3 1 UNL1 0.1020 - 5 N 120.1740 101.3300 21.7520 N.pl3 1 UNL1 -0.3100 - 6 H 120.9930 101.1230 21.1860 H 1 UNL1 0.1490 - 7 C 120.3880 102.0610 22.8670 C.2 1 UNL1 0.1900 - 8 O 121.6280 102.6050 22.9650 O.2 1 UNL1 -0.4460 - 9 C 121.6620 103.3360 24.1110 C.2 1 UNL1 0.1050 - 10 C 120.4600 103.2340 24.7710 C.2 1 UNL1 0.0500 - 11 C 122.9070 104.0760 24.3920 C.3 1 UNL1 0.0860 - 12 C 119.6080 102.4430 23.9490 C.2 1 UNL1 0.0130 - 13 C 118.1690 102.1480 24.2120 C.3 1 UNL1 0.0400 - 14 C 117.2190 102.8250 23.2260 C.3 1 UNL1 0.0090 - 15 C 116.4680 100.3830 21.5500 C.1 1 UNL1 -0.1000 - 16 C 115.4700 99.7810 21.8490 C.1 1 UNL1 0.0040 - 17 C 119.1910 99.2740 22.7210 C.3 1 UNL1 0.1010 - 18 N 119.0140 97.8670 22.3700 N.3 1 UNL1 -0.3280 - 19 H 119.4640 97.2900 23.0800 H 1 UNL1 0.1180 - 20 H 119.5370 97.6780 21.5140 H 1 UNL1 0.1180 -@BOND - 1 1 2 1 - 2 6 5 1 - 3 3 15 1 - 4 3 4 1 - 5 3 2 1 - 6 20 18 1 - 7 15 16 3 - 8 4 5 1 - 9 4 17 1 - 10 2 14 1 - 11 5 7 1 - 12 18 17 1 - 13 18 19 1 - 14 7 8 1 - 15 7 12 2 - 16 8 9 1 - 17 14 13 1 - 18 12 13 1 - 19 12 10 1 - 20 9 11 1 - 21 9 10 2 diff --git a/tests/structure/data/molecules/ADP.sdf b/tests/structure/data/molecules/ADP.sdf new file mode 100644 index 000000000..d4726403a --- /dev/null +++ b/tests/structure/data/molecules/ADP.sdf @@ -0,0 +1,102 @@ +***** + OpenBabel08312206363D + + 47 49 0 0 1 0 0 0 0 0999 V2000 + 0.7784 -2.1987 -2.8482 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8604 -1.6339 -1.4089 P 0 0 0 0 0 0 0 0 0 0 0 0 + 1.5615 -0.2674 -1.9434 O 0 0 0 0 0 0 0 0 0 0 0 0 + -0.6825 -1.0988 -1.4421 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.9520 -1.0028 0.1993 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6081 -0.9200 0.6928 P 0 0 1 0 0 0 0 0 0 0 0 0 + 2.6189 0.6065 0.5282 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0429 -1.0082 2.2396 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2641 -0.8371 1.1863 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4377 -1.5630 2.7470 P 0 0 1 0 0 0 0 0 0 0 0 0 + 4.1470 -2.9165 2.0736 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0553 -1.3296 2.6506 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6114 -2.2890 4.3077 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2793 -3.5595 4.3498 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4179 -4.0599 5.7832 C 0 0 1 0 0 0 0 0 0 0 0 0 + 5.9702 -3.3230 6.3793 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1182 -4.2218 6.3858 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3033 -5.1583 7.4584 C 0 0 1 0 0 0 0 0 0 0 0 0 + 4.6419 -4.6075 8.3449 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0301 -5.7633 7.7940 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.8311 -5.5893 7.1634 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8634 -6.2639 7.7537 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4733 -6.8981 8.8162 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.9806 -7.7406 9.8242 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.8410 -8.1759 10.7749 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1378 -7.8144 10.6813 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7334 -7.0362 9.7451 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8232 -6.6007 8.8564 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.3546 -8.1171 9.9161 N 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3476 -6.1697 6.9753 C 0 0 2 0 0 0 0 0 0 0 0 0 + 4.8788 -7.0780 6.5770 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2688 -6.5734 7.9933 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0723 -5.4420 5.8391 C 0 0 2 0 0 0 0 0 0 0 0 0 + 5.9108 -5.9922 4.9040 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.4778 -5.3478 6.0461 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2185 -0.0516 -2.8292 H 0 0 0 0 0 0 0 0 0 0 0 0 + -1.0667 -1.3467 -2.3048 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.6300 -0.1353 2.4121 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3220 -0.4258 2.8858 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2669 -3.4722 3.8864 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6795 -4.2893 3.7970 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7121 -4.9593 6.2889 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7869 -8.1961 11.4649 H 0 0 0 0 0 0 0 0 0 0 0 0 + -0.9807 -7.4996 9.4038 H 0 0 0 0 0 0 0 0 0 0 0 0 + -0.6172 -8.3788 10.8558 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7343 -6.9507 8.7244 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.6922 -6.0171 6.7299 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 2 4 1 0 0 0 0 + 2 5 1 0 0 0 0 + 3 36 1 0 0 0 0 + 4 37 1 0 0 0 0 + 5 6 1 0 0 0 0 + 6 7 2 1 0 0 0 + 6 8 1 0 0 0 0 + 6 9 1 0 0 0 0 + 8 38 1 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 2 6 0 0 0 + 10 12 1 0 0 0 0 + 10 13 1 0 0 0 0 + 12 39 1 0 0 0 0 + 13 14 1 0 0 0 0 + 14 15 1 0 0 0 0 + 14 40 1 0 0 0 0 + 14 41 1 0 0 0 0 + 15 16 1 1 0 0 0 + 15 17 1 0 0 0 0 + 15 33 1 0 0 0 0 + 17 18 1 0 0 0 0 + 18 30 1 0 0 0 0 + 18 20 1 0 0 0 0 + 18 19 1 1 0 0 0 + 20 21 1 0 0 0 0 + 20 28 1 0 0 0 0 + 21 22 2 0 0 0 0 + 21 42 1 0 0 0 0 + 22 23 1 0 0 0 0 + 23 24 2 0 0 0 0 + 23 28 1 0 0 0 0 + 24 25 1 0 0 0 0 + 24 29 1 0 0 0 0 + 25 26 2 0 0 0 0 + 26 27 1 0 0 0 0 + 26 43 1 0 0 0 0 + 27 28 2 0 0 0 0 + 29 44 1 0 0 0 0 + 29 45 1 0 0 0 0 + 30 31 1 6 0 0 0 + 30 32 1 0 0 0 0 + 30 33 1 0 0 0 0 + 32 46 1 0 0 0 0 + 33 34 1 6 0 0 0 + 33 35 1 0 0 0 0 + 35 47 1 0 0 0 0 +M END +$$$$ diff --git a/tests/structure/data/molecules/ADP.xyz b/tests/structure/data/molecules/ADP.xyz new file mode 100644 index 000000000..70051e5a0 --- /dev/null +++ b/tests/structure/data/molecules/ADP.xyz @@ -0,0 +1,49 @@ +47 +***** +O 0.77840 -2.19870 -2.84820 +P 0.86040 -1.63390 -1.40890 +O 1.56150 -0.26740 -1.94340 +O -0.68250 -1.09880 -1.44210 +O 0.95200 -1.00280 0.19930 +P 2.60810 -0.92000 0.69280 +O 2.61890 0.60650 0.52820 +O 2.04290 -1.00820 2.23960 +O 4.26410 -0.83710 1.18630 +P 4.43770 -1.56300 2.74700 +O 4.14700 -2.91650 2.07360 +O 6.05530 -1.32960 2.65060 +O 4.61140 -2.28900 4.30770 +C 5.27930 -3.55950 4.34980 +C 5.41790 -4.05990 5.78320 +H 5.97020 -3.32300 6.37930 +O 4.11820 -4.22180 6.38580 +C 4.30330 -5.15830 7.45840 +H 4.64190 -4.60750 8.34490 +N 3.03010 -5.76330 7.79400 +C 1.83110 -5.58930 7.16340 +N 0.86340 -6.26390 7.75370 +C 1.47330 -6.89810 8.81620 +C 0.98060 -7.74060 9.82420 +N 1.84100 -8.17590 10.77490 +C 3.13780 -7.81440 10.68130 +N 3.73340 -7.03620 9.74510 +C 2.82320 -6.60070 8.85640 +N -0.35460 -8.11710 9.91610 +C 5.34760 -6.16970 6.97530 +H 4.87880 -7.07800 6.57700 +O 6.26880 -6.57340 7.99330 +C 6.07230 -5.44200 5.83910 +H 5.91080 -5.99220 4.90400 +O 7.47780 -5.34780 6.04610 +H 1.21850 -0.05160 -2.82920 +H -1.06670 -1.34670 -2.30480 +H 1.63000 -0.13530 2.41210 +H 6.32200 -0.42580 2.88580 +H 6.26690 -3.47220 3.88640 +H 4.67950 -4.28930 3.79700 +H 1.71210 -4.95930 6.28890 +H 3.78690 -8.19610 11.46490 +H -0.98070 -7.49960 9.40380 +H -0.61720 -8.37880 10.85580 +H 5.73430 -6.95070 8.72440 +H 7.69220 -6.01710 6.72990 diff --git a/tests/structure/data/molecules/BENZ.mol b/tests/structure/data/molecules/BENZ.mol new file mode 100644 index 000000000..d10f36949 --- /dev/null +++ b/tests/structure/data/molecules/BENZ.mol @@ -0,0 +1,29 @@ +benzene example + OpenBabel08312206463D + + 12 12 0 0 0 0 0 0 0 0999 V2000 + 0.0000 1.4027 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 2.4903 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + -1.2148 0.7014 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -2.1567 1.2451 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + -1.2148 -0.7014 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -2.1567 -1.2451 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.4027 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -2.4903 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2148 -0.7014 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1567 -1.2451 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2148 0.7014 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1567 1.2451 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 3 2 0 0 0 0 + 1 11 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 5 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 7 2 0 0 0 0 + 7 8 1 0 0 0 0 + 7 9 1 0 0 0 0 + 9 10 1 0 0 0 0 + 9 11 2 0 0 0 0 + 11 12 1 0 0 0 0 +M END diff --git a/tests/structure/data/molecules/BENZ.mol2 b/tests/structure/data/molecules/BENZ.mol2 new file mode 100644 index 000000000..64706563d --- /dev/null +++ b/tests/structure/data/molecules/BENZ.mol2 @@ -0,0 +1,32 @@ +@MOLECULE +benzene example + 12 12 0 0 0 +SMALL +GASTEIGER + +@ATOM + 1 C 0.0000 1.4027 0.0000 C.ar 1 UNL1 -0.0618 + 2 H 0.0000 2.4903 0.0000 H 1 UNL1 0.0618 + 3 C -1.2148 0.7014 0.0000 C.ar 1 UNL1 -0.0618 + 4 H -2.1567 1.2451 0.0000 H 1 UNL1 0.0618 + 5 C -1.2148 -0.7014 0.0000 C.ar 1 UNL1 -0.0618 + 6 H -2.1567 -1.2451 0.0000 H 1 UNL1 0.0618 + 7 C 0.0000 -1.4027 0.0000 C.ar 1 UNL1 -0.0618 + 8 H 0.0000 -2.4903 0.0000 H 1 UNL1 0.0618 + 9 C 1.2148 -0.7014 0.0000 C.ar 1 UNL1 -0.0618 + 10 H 2.1567 -1.2451 0.0000 H 1 UNL1 0.0618 + 11 C 1.2148 0.7014 0.0000 C.ar 1 UNL1 -0.0618 + 12 H 2.1567 1.2451 0.0000 H 1 UNL1 0.0618 +@BOND + 1 1 2 1 + 2 1 3 ar + 3 1 11 ar + 4 3 4 1 + 5 3 5 ar + 6 5 6 1 + 7 5 7 ar + 8 7 8 1 + 9 7 9 ar + 10 9 10 1 + 11 9 11 ar + 12 11 12 1 diff --git a/tests/structure/data/molecules/CO2.mol b/tests/structure/data/molecules/CO2.mol new file mode 100644 index 000000000..ec2d1e7e8 --- /dev/null +++ b/tests/structure/data/molecules/CO2.mol @@ -0,0 +1,65 @@ +0 + OpenBabel08312206473D + + 3 2 0 0 0 0 0 0 0 0999 V2000 + 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 0.0000 1.1591 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 0.0000 -1.1591 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 3 1 2 0 0 0 0 +M END +$$$$ +1 + OpenBabel08312206473D + + 3 2 0 0 0 0 0 0 0 0999 V2000 + 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 0.0000 1.2000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 0.0000 -1.1591 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 3 1 2 0 0 0 0 +M END +$$$$ +2 + OpenBabel08312206473D + + 3 2 0 0 0 0 0 0 0 0999 V2000 + 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 0.0000 1.3000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 0.0000 -1.1591 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 3 1 2 0 0 0 0 +M END +$$$$ +3 + OpenBabel08312206473D + + 3 2 0 0 0 0 0 0 0 0999 V2000 + 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 0.0000 1.4000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 0.0000 -1.1591 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 3 1 2 0 0 0 0 +M END +$$$$ +4 + OpenBabel08312206473D + + 3 2 0 0 0 0 0 0 0 0999 V2000 + 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 0.0000 1.5000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 0.0000 -1.1591 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 3 1 2 0 0 0 0 +M END +$$$$ +5 + OpenBabel08312206473D + + 3 2 0 0 0 0 0 0 0 0999 V2000 + 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 0.0000 1.6000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 0.0000 -1.1591 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 3 1 2 0 0 0 0 +M END diff --git a/tests/structure/data/molecules/CO2.mol2 b/tests/structure/data/molecules/CO2.mol2 new file mode 100644 index 000000000..d1761a962 --- /dev/null +++ b/tests/structure/data/molecules/CO2.mol2 @@ -0,0 +1,78 @@ +@MOLECULE +0 + 3 2 0 0 0 +SMALL +GASTEIGER + +@ATOM + 1 C 0.0000 0.0000 0.0000 C.1 1 UNL1 0.3722 + 2 O 0.0000 0.0000 1.1591 O.2 1 UNL1 -0.1861 + 3 O 0.0000 0.0000 -1.1591 O.2 1 UNL1 -0.1861 +@BOND + 1 3 1 2 + 2 1 2 2 +@MOLECULE +1 + 3 2 0 0 0 +SMALL +GASTEIGER + +@ATOM + 1 C 0.0000 0.0000 0.0000 C.1 1 UNL1 0.3722 + 2 O 0.0000 0.0000 1.2000 O.2 1 UNL1 -0.1861 + 3 O 0.0000 0.0000 -1.1591 O.2 1 UNL1 -0.1861 +@BOND + 1 3 1 2 + 2 1 2 2 +@MOLECULE +2 + 3 2 0 0 0 +SMALL +GASTEIGER + +@ATOM + 1 C 0.0000 0.0000 0.0000 C.1 1 UNL1 0.3722 + 2 O 0.0000 0.0000 1.3000 O.2 1 UNL1 -0.1861 + 3 O 0.0000 0.0000 -1.1591 O.2 1 UNL1 -0.1861 +@BOND + 1 3 1 2 + 2 1 2 2 +@MOLECULE +3 + 3 2 0 0 0 +SMALL +GASTEIGER + +@ATOM + 1 C 0.0000 0.0000 0.0000 C.1 1 UNL1 0.3722 + 2 O 0.0000 0.0000 1.4000 O.2 1 UNL1 -0.1861 + 3 O 0.0000 0.0000 -1.1591 O.2 1 UNL1 -0.1861 +@BOND + 1 3 1 2 + 2 1 2 2 +@MOLECULE +4 + 3 2 0 0 0 +SMALL +GASTEIGER + +@ATOM + 1 C 0.0000 0.0000 0.0000 C.1 1 UNL1 0.3722 + 2 O 0.0000 0.0000 1.5000 O.2 1 UNL1 -0.1861 + 3 O 0.0000 0.0000 -1.1591 O.2 1 UNL1 -0.1861 +@BOND + 1 3 1 2 + 2 1 2 2 +@MOLECULE +5 + 3 2 0 0 0 +SMALL +GASTEIGER + +@ATOM + 1 C 0.0000 0.0000 0.0000 C.1 1 UNL1 0.3722 + 2 O 0.0000 0.0000 1.6000 O.2 1 UNL1 -0.1861 + 3 O 0.0000 0.0000 -1.1591 O.2 1 UNL1 -0.1861 +@BOND + 1 3 1 2 + 2 1 2 2 diff --git a/tests/structure/data/molecules/CYN.sdf b/tests/structure/data/molecules/CYN.mol similarity index 100% rename from tests/structure/data/molecules/CYN.sdf rename to tests/structure/data/molecules/CYN.mol diff --git a/tests/structure/data/molecules/CYN.mol2 b/tests/structure/data/molecules/CYN.mol2 new file mode 100644 index 000000000..26933c523 --- /dev/null +++ b/tests/structure/data/molecules/CYN.mol2 @@ -0,0 +1,14 @@ +@MOLECULE +CYN - Ideal conformer + 2 1 0 0 0 +SMALL +GASTEIGER + +@ATOM + 1 C 0.0000 0.0000 -0.6110 C.2 1 UNL1 -0.5149 + 2 N 0.0000 0.0000 0.5240 N.1 1 UNL1 -0.4851 +@UNITY_ATOM_ATTR +1 1 +charge -1 +@BOND + 1 1 2 3 diff --git a/tests/structure/data/molecules/CYN.xyz b/tests/structure/data/molecules/CYN.xyz new file mode 100644 index 000000000..2e7505c0a --- /dev/null +++ b/tests/structure/data/molecules/CYN.xyz @@ -0,0 +1,4 @@ +2 +CYN - Ideal conformer +C 0.00000 0.00000 -0.61100 +N 0.00000 0.00000 0.52400 diff --git a/tests/structure/data/molecules/HWB.sdf b/tests/structure/data/molecules/HWB.mol similarity index 100% rename from tests/structure/data/molecules/HWB.sdf rename to tests/structure/data/molecules/HWB.mol diff --git a/tests/structure/data/molecules/HWB.mol2 b/tests/structure/data/molecules/HWB.mol2 new file mode 100644 index 000000000..c6ffbf5dd --- /dev/null +++ b/tests/structure/data/molecules/HWB.mol2 @@ -0,0 +1,77 @@ +@MOLECULE +HWB - Ideal conformer + 32 34 0 0 0 +SMALL +GASTEIGER + +@ATOM + 1 O -4.6520 -2.7320 0.0690 O.3 1 UNL1 -0.5063 + 2 C -3.8920 -1.6070 0.0300 C.ar 1 UNL1 0.1293 + 3 C -4.5120 -0.3630 -0.0940 C.ar 1 UNL1 0.0225 + 4 C -3.7680 0.7840 -0.1350 C.ar 1 UNL1 0.1366 + 5 O -4.3790 1.9900 -0.2540 O.3 1 UNL1 -0.5057 + 6 C -2.3660 0.7060 -0.0520 C.ar 1 UNL1 0.1241 + 7 C -1.5590 1.8620 -0.0890 C.ar 1 UNL1 0.0090 + 8 C -0.2020 1.6430 0.0030 C.ar 1 UNL1 0.2238 + 9 O 0.6790 2.6780 -0.0210 O.3 1 UNL1 -0.4995 + 10 C 0.2420 0.3130 0.1220 C.ar 1 UNL1 0.4043 + 11 O -0.5150 -0.6300 0.1470 O.2 1 UNL1 -0.1997 + 12 C -1.7280 -0.5540 0.0740 C.ar 1 UNL1 0.3708 + 13 C -2.5200 -1.7110 0.1180 C.ar 1 UNL1 0.0847 + 14 C 1.6960 0.0580 0.2210 C.ar 1 UNL1 0.0865 + 15 C 2.3140 0.0130 1.4710 C.ar 1 UNL1 -0.0418 + 16 C 3.6700 -0.2260 1.5620 C.ar 1 UNL1 -0.0157 + 17 C 4.4220 -0.4200 0.4120 C.ar 1 UNL1 0.1583 + 18 O 5.7570 -0.6540 0.5070 O.3 1 UNL1 -0.5033 + 19 C 3.8100 -0.3750 -0.8390 C.ar 1 UNL1 0.1591 + 20 O 4.5490 -0.5660 -1.9650 O.3 1 UNL1 -0.5033 + 21 C 2.4510 -0.1430 -0.9360 C.ar 1 UNL1 -0.0003 + 22 H -4.8230 -3.1210 -0.8000 H 1 UNL1 0.2921 + 23 H -5.5890 -0.3050 -0.1570 H 1 UNL1 0.0691 + 24 H -4.6040 2.4020 0.5910 H 1 UNL1 0.2922 + 25 H -1.9770 2.8540 -0.1830 H 1 UNL1 0.0667 + 26 H 0.8850 3.0390 0.8520 H 1 UNL1 0.2925 + 27 H -2.0560 -2.6810 0.2130 H 1 UNL1 0.0749 + 28 H 1.7320 0.1640 2.3680 H 1 UNL1 0.0628 + 29 H 4.1470 -0.2600 2.5300 H 1 UNL1 0.0655 + 30 H 5.9870 -1.5910 0.5790 H 1 UNL1 0.2923 + 31 H 4.6080 -1.4900 -2.2450 H 1 UNL1 0.2923 + 32 H 1.9760 -0.1090 -1.9050 H 1 UNL1 0.0664 +@UNITY_ATOM_ATTR +11 1 +charge 1 +@BOND + 1 9 8 1 + 2 8 7 ar + 3 8 10 ar + 4 7 6 ar + 5 5 4 1 + 6 20 19 1 + 7 21 19 ar + 8 21 14 ar + 9 10 14 1 + 10 10 11 ar + 11 6 4 ar + 12 6 12 ar + 13 19 17 ar + 14 4 3 ar + 15 14 15 ar + 16 11 12 ar + 17 17 18 1 + 18 17 16 ar + 19 12 13 ar + 20 15 16 ar + 21 3 2 ar + 22 13 2 ar + 23 2 1 1 + 24 1 22 1 + 25 3 23 1 + 26 5 24 1 + 27 7 25 1 + 28 9 26 1 + 29 13 27 1 + 30 15 28 1 + 31 16 29 1 + 32 18 30 1 + 33 20 31 1 + 34 21 32 1 diff --git a/tests/structure/data/molecules/HWB.xyz b/tests/structure/data/molecules/HWB.xyz new file mode 100644 index 000000000..fe110a029 --- /dev/null +++ b/tests/structure/data/molecules/HWB.xyz @@ -0,0 +1,34 @@ +32 +HWB - Ideal conformer +O -4.65200 -2.73200 0.06900 +C -3.89200 -1.60700 0.03000 +C -4.51200 -0.36300 -0.09400 +C -3.76800 0.78400 -0.13500 +O -4.37900 1.99000 -0.25400 +C -2.36600 0.70600 -0.05200 +C -1.55900 1.86200 -0.08900 +C -0.20200 1.64300 0.00300 +O 0.67900 2.67800 -0.02100 +C 0.24200 0.31300 0.12200 +O -0.51500 -0.63000 0.14700 +C -1.72800 -0.55400 0.07400 +C -2.52000 -1.71100 0.11800 +C 1.69600 0.05800 0.22100 +C 2.31400 0.01300 1.47100 +C 3.67000 -0.22600 1.56200 +C 4.42200 -0.42000 0.41200 +O 5.75700 -0.65400 0.50700 +C 3.81000 -0.37500 -0.83900 +O 4.54900 -0.56600 -1.96500 +C 2.45100 -0.14300 -0.93600 +H -4.82300 -3.12100 -0.80000 +H -5.58900 -0.30500 -0.15700 +H -4.60400 2.40200 0.59100 +H -1.97700 2.85400 -0.18300 +H 0.88500 3.03900 0.85200 +H -2.05600 -2.68100 0.21300 +H 1.73200 0.16400 2.36800 +H 4.14700 -0.26000 2.53000 +H 5.98700 -1.59100 0.57900 +H 4.60800 -1.49000 -2.24500 +H 1.97600 -0.10900 -1.90500 diff --git a/tests/structure/data/molecules/README.rst b/tests/structure/data/molecules/README.rst index a83437ff1..6d12ecf81 100644 --- a/tests/structure/data/molecules/README.rst +++ b/tests/structure/data/molecules/README.rst @@ -4,3 +4,13 @@ Test structures CYN: Caynide - Contains negatively charged atom and triple bond HWB: Cyanidin - Contains positively charged atom TYR: Tyrosine - common amino acid + +aspirin_*: - Aspirin with coordinates either in 2D or 3D. +10000_docked: - Output from docking the gbt15 molecule with id 10000 to the + DNA-PKcs kinase active site. +zinc_33: - A more complex example taken from zinc database: + https://zinc20.docking.org/substances/ZINC000000000033/ +nu7026: - A known inhibitor for DNA-PKcs. +CO2: - Carbon Dioxide +BENZ: - benzene as example fom + diff --git a/tests/structure/data/molecules/TYR.sdf b/tests/structure/data/molecules/TYR.mol similarity index 100% rename from tests/structure/data/molecules/TYR.sdf rename to tests/structure/data/molecules/TYR.mol diff --git a/tests/structure/data/molecules/TYR.mol2 b/tests/structure/data/molecules/TYR.mol2 new file mode 100644 index 000000000..4f0ec1a05 --- /dev/null +++ b/tests/structure/data/molecules/TYR.mol2 @@ -0,0 +1,56 @@ +@MOLECULE +TYR - Ideal conformer + 24 24 0 0 0 +SMALL +GASTEIGER + +@ATOM + 1 N 1.3200 0.9520 1.4280 N.3 1 TYR1 -0.3181 + 2 CA -0.0180 0.4290 1.7340 C.3 1 TYR1 0.1072 + 3 C -0.1030 0.0940 3.2010 C.2 1 TYR1 0.3220 + 4 O 0.8860 -0.2540 3.7990 O.2 1 TYR1 -0.2492 + 5 CB -0.2740 -0.8310 0.9070 C.3 1 TYR1 -0.0020 + 6 CG -0.1890 -0.4960 -0.5590 C.ar 1 TYR1 -0.0451 + 7 CD1 1.0220 -0.5890 -1.2190 C.ar 1 TYR1 -0.0551 + 8 CD2 -1.3240 -0.1020 -1.2440 C.ar 1 TYR1 -0.0551 + 9 CE1 1.1030 -0.2820 -2.5630 C.ar 1 TYR1 -0.0199 + 10 CE2 -1.2470 0.2100 -2.5870 C.ar 1 TYR1 -0.0199 + 11 CZ -0.0320 0.1180 -3.2520 C.ar 1 TYR1 0.1169 + 12 OH 0.0440 0.4200 -4.5740 O.3 1 TYR1 -0.5068 + 13 OXT -1.2790 0.1840 3.8420 O.3 1 TYR1 -0.4795 + 14 H1 1.9770 0.2250 1.6690 H 1 TYR1 0.1190 + 15 H2 1.3650 1.0630 0.4260 H 1 TYR1 0.1190 + 16 HA -0.7670 1.1830 1.4890 H 1 TYR1 0.0577 + 17 HB1 0.4730 -1.5850 1.1520 H 1 TYR1 0.0334 + 18 HB2 -1.2680 -1.2190 1.1340 H 1 TYR1 0.0334 + 19 HD1 1.9050 -0.9020 -0.6830 H 1 TYR1 0.0621 + 20 HD2 -2.2690 -0.0310 -0.7270 H 1 TYR1 0.0621 + 21 HE1 2.0490 -0.3540 -3.0780 H 1 TYR1 0.0654 + 22 HE2 -2.1320 0.5230 -3.1210 H 1 TYR1 0.0654 + 23 HH -0.1230 -0.3990 -5.0590 H 1 TYR1 0.2921 + 24 HXT -1.3330 -0.0300 4.7840 H 1 TYR1 0.2951 +@BOND + 1 1 2 1 + 2 1 14 1 + 3 1 15 1 + 4 2 3 1 + 5 2 5 1 + 6 2 16 1 + 7 3 4 2 + 8 3 13 1 + 9 5 6 1 + 10 5 17 1 + 11 5 18 1 + 12 6 7 ar + 13 6 8 ar + 14 7 9 ar + 15 7 19 1 + 16 8 10 ar + 17 8 20 1 + 18 9 11 ar + 19 9 21 1 + 20 10 11 ar + 21 10 22 1 + 22 11 12 1 + 23 12 23 1 + 24 13 24 1 diff --git a/tests/structure/data/molecules/TYR.xyz b/tests/structure/data/molecules/TYR.xyz new file mode 100644 index 000000000..bc8805eeb --- /dev/null +++ b/tests/structure/data/molecules/TYR.xyz @@ -0,0 +1,26 @@ +24 +TYR - Ideal conformer +N 1.32000 0.95200 1.42800 +C -0.01800 0.42900 1.73400 +C -0.10300 0.09400 3.20100 +O 0.88600 -0.25400 3.79900 +C -0.27400 -0.83100 0.90700 +C -0.18900 -0.49600 -0.55900 +C 1.02200 -0.58900 -1.21900 +C -1.32400 -0.10200 -1.24400 +C 1.10300 -0.28200 -2.56300 +C -1.24700 0.21000 -2.58700 +C -0.03200 0.11800 -3.25200 +O 0.04400 0.42000 -4.57400 +O -1.27900 0.18400 3.84200 +H 1.97700 0.22500 1.66900 +H 1.36500 1.06300 0.42600 +H -0.76700 1.18300 1.48900 +H 0.47300 -1.58500 1.15200 +H -1.26800 -1.21900 1.13400 +H 1.90500 -0.90200 -0.68300 +H -2.26900 -0.03100 -0.72700 +H 2.04900 -0.35400 -3.07800 +H -2.13200 0.52300 -3.12100 +H -0.12300 -0.39900 -5.05900 +H -1.33300 -0.03000 4.78400 diff --git a/tests/structure/data/molecules/aspirin_2d.mol b/tests/structure/data/molecules/aspirin_2d.mol new file mode 100644 index 000000000..d9a790fa5 --- /dev/null +++ b/tests/structure/data/molecules/aspirin_2d.mol @@ -0,0 +1,47 @@ +2244 + OpenBabel08312206513D + + 21 21 0 0 0 0 0 0 0 0999 V2000 + 3.7320 -0.0600 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3301 1.4400 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5981 1.4400 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8660 -1.5600 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5981 -0.5600 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4641 -0.0600 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5981 -1.5600 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3301 -0.5600 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4641 -2.0600 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3301 -1.5600 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4641 0.9400 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8660 -0.5600 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0000 -0.0600 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0611 -1.8700 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8671 -0.2500 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4641 -2.6800 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8671 -1.8700 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3100 0.4769 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4631 0.2500 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.6900 -0.5969 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3301 2.0600 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 5 1 0 0 0 0 + 1 12 1 0 0 0 0 + 2 11 1 0 0 0 0 + 2 21 1 0 0 0 0 + 3 11 2 0 0 0 0 + 4 12 2 0 0 0 0 + 5 6 2 0 0 0 0 + 5 7 1 0 0 0 0 + 6 8 1 0 0 0 0 + 6 11 1 0 0 0 0 + 7 9 2 0 0 0 0 + 7 14 1 0 0 0 0 + 8 10 2 0 0 0 0 + 8 15 1 0 0 0 0 + 9 10 1 0 0 0 0 + 9 16 1 0 0 0 0 + 10 17 1 0 0 0 0 + 12 13 1 0 0 0 0 + 13 18 1 0 0 0 0 + 13 19 1 0 0 0 0 + 13 20 1 0 0 0 0 +M END diff --git a/tests/structure/data/molecules/aspirin_2d.mol2 b/tests/structure/data/molecules/aspirin_2d.mol2 new file mode 100644 index 000000000..571d01a65 --- /dev/null +++ b/tests/structure/data/molecules/aspirin_2d.mol2 @@ -0,0 +1,50 @@ +@MOLECULE +2244 + 21 21 0 0 0 +SMALL +GASTEIGER + +@ATOM + 1 O 3.7320 -0.0600 0.0000 O.3 1 UNL1 -0.4252 + 2 O 6.3301 1.4400 0.0000 O.3 1 UNL1 -0.4770 + 3 O 4.5981 1.4400 0.0000 O.2 1 UNL1 -0.2450 + 4 O 2.8660 -1.5600 0.0000 O.2 1 UNL1 -0.2507 + 5 C 4.5981 -0.5600 0.0000 C.ar 1 UNL1 0.1456 + 6 C 5.4641 -0.0600 0.0000 C.ar 1 UNL1 0.1010 + 7 C 4.5981 -1.5600 0.0000 C.ar 1 UNL1 -0.0184 + 8 C 6.3301 -0.5600 0.0000 C.ar 1 UNL1 -0.0442 + 9 C 5.4641 -2.0600 0.0000 C.ar 1 UNL1 -0.0582 + 10 C 6.3301 -1.5600 0.0000 C.ar 1 UNL1 -0.0608 + 11 C 5.4641 0.9400 0.0000 C.2 1 UNL1 0.3404 + 12 C 2.8660 -0.5600 0.0000 C.2 1 UNL1 0.3092 + 13 C 2.0000 -0.0600 0.0000 C.3 1 UNL1 0.0336 + 14 H 4.0611 -1.8700 0.0000 H 1 UNL1 0.0654 + 15 H 6.8671 -0.2500 0.0000 H 1 UNL1 0.0627 + 16 H 5.4641 -2.6800 0.0000 H 1 UNL1 0.0619 + 17 H 6.8671 -1.8700 0.0000 H 1 UNL1 0.0618 + 18 H 2.3100 0.4769 0.0000 H 1 UNL1 0.0342 + 19 H 1.4631 0.2500 0.0000 H 1 UNL1 0.0342 + 20 H 1.6900 -0.5969 0.0000 H 1 UNL1 0.0342 + 21 H 6.3301 2.0600 0.0000 H 1 UNL1 0.2954 +@BOND + 1 1 5 1 + 2 1 12 1 + 3 2 11 1 + 4 2 21 1 + 5 3 11 2 + 6 4 12 2 + 7 5 6 ar + 8 5 7 ar + 9 6 8 ar + 10 6 11 1 + 11 7 9 ar + 12 7 14 1 + 13 8 10 ar + 14 8 15 1 + 15 9 10 ar + 16 9 16 1 + 17 10 17 1 + 18 12 13 1 + 19 13 18 1 + 20 13 19 1 + 21 13 20 1 diff --git a/tests/structure/data/molecules/aspirin_2d.sdf b/tests/structure/data/molecules/aspirin_2d.sdf new file mode 100644 index 000000000..65f381a7f --- /dev/null +++ b/tests/structure/data/molecules/aspirin_2d.sdf @@ -0,0 +1,157 @@ +2244 + -OEChem-08302211122D + + 21 21 0 0 0 0 0 0 0999 V2000 + 3.7320 -0.0600 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3301 1.4400 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5981 1.4400 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8660 -1.5600 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5981 -0.5600 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4641 -0.0600 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5981 -1.5600 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3301 -0.5600 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4641 -2.0600 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3301 -1.5600 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4641 0.9400 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8660 -0.5600 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0000 -0.0600 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0611 -1.8700 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8671 -0.2500 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4641 -2.6800 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8671 -1.8700 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3100 0.4769 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4631 0.2500 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.6900 -0.5969 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3301 2.0600 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 5 1 0 0 0 0 + 1 12 1 0 0 0 0 + 2 11 1 0 0 0 0 + 2 21 1 0 0 0 0 + 3 11 2 0 0 0 0 + 4 12 2 0 0 0 0 + 5 6 1 0 0 0 0 + 5 7 2 0 0 0 0 + 6 8 2 0 0 0 0 + 6 11 1 0 0 0 0 + 7 9 1 0 0 0 0 + 7 14 1 0 0 0 0 + 8 10 1 0 0 0 0 + 8 15 1 0 0 0 0 + 9 10 2 0 0 0 0 + 9 16 1 0 0 0 0 + 10 17 1 0 0 0 0 + 12 13 1 0 0 0 0 + 13 18 1 0 0 0 0 + 13 19 1 0 0 0 0 + 13 20 1 0 0 0 0 +M END +> +2244 + +> +1 + +> +212 + +> +4 + +> +1 + +> +3 + +> +AAADccBwOAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAABAAAAGgAACAAADASAmAAyDoAABgCIAiDSCAACCAAkIAAIiAEGCMgMJzaENRqCe2Cl4BEIuYeIyCCOAAAAAAAIAAAAAAAAABAAAAAAAAAAAA== + +> +2-acetoxybenzoic acid + +> +2-acetyloxybenzoic acid + +> +2-acetyloxybenzoic acid + +> +2-acetyloxybenzoic acid + +> +2-acetyloxybenzoic acid + +> +2-acetoxybenzoic acid + +> +InChI=1S/C9H8O4/c1-6(10)13-8-5-3-2-4-7(8)9(11)12/h2-5H,1H3,(H,11,12) + +> +BSYNRYMUTXBXSQ-UHFFFAOYSA-N + +> +1.2 + +> +180.04225873 + +> +C9H8O4 + +> +180.16 + +> +CC(=O)OC1=CC=CC=C1C(=O)O + +> +CC(=O)OC1=CC=CC=C1C(=O)O + +> +63.6 + +> +180.04225873 + +> +0 + +> +13 + +> +0 + +> +0 + +> +0 + +> +0 + +> +0 + +> +1 + +> +-1 + +> +1 +5 +255 + +> +5 6 8 +5 7 8 +6 8 8 +7 9 8 +8 10 8 +9 10 8 + +$$$$ diff --git a/tests/structure/data/molecules/aspirin_2d.xyz b/tests/structure/data/molecules/aspirin_2d.xyz new file mode 100644 index 000000000..badaeecd4 --- /dev/null +++ b/tests/structure/data/molecules/aspirin_2d.xyz @@ -0,0 +1,23 @@ +21 +2244 +O 3.73200 -0.06000 0.00000 +O 6.33010 1.44000 0.00000 +O 4.59810 1.44000 0.00000 +O 2.86600 -1.56000 0.00000 +C 4.59810 -0.56000 0.00000 +C 5.46410 -0.06000 0.00000 +C 4.59810 -1.56000 0.00000 +C 6.33010 -0.56000 0.00000 +C 5.46410 -2.06000 0.00000 +C 6.33010 -1.56000 0.00000 +C 5.46410 0.94000 0.00000 +C 2.86600 -0.56000 0.00000 +C 2.00000 -0.06000 0.00000 +H 4.06110 -1.87000 0.00000 +H 6.86710 -0.25000 0.00000 +H 5.46410 -2.68000 0.00000 +H 6.86710 -1.87000 0.00000 +H 2.31000 0.47690 0.00000 +H 1.46310 0.25000 0.00000 +H 1.69000 -0.59690 0.00000 +H 6.33010 2.06000 0.00000 diff --git a/tests/structure/data/molecules/aspirin_3d.mol b/tests/structure/data/molecules/aspirin_3d.mol new file mode 100644 index 000000000..b48fbd11a --- /dev/null +++ b/tests/structure/data/molecules/aspirin_3d.mol @@ -0,0 +1,47 @@ +2244 + OpenBabel08312206253D + + 21 21 0 0 0 0 0 0 0 0999 V2000 + 1.2333 0.5540 0.7792 O 0 0 0 0 0 0 0 0 0 0 0 0 + -0.6952 -2.7148 -0.7502 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7958 -2.1843 0.8685 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7813 0.8105 -1.4821 O 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0857 0.6088 0.4403 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.7927 -0.5515 0.1244 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.7288 1.8464 0.4133 C 0 0 0 0 0 0 0 0 0 0 0 0 + -2.1426 -0.4741 -0.2184 C 0 0 0 0 0 0 0 0 0 0 0 0 + -2.0787 1.9238 0.0706 C 0 0 0 0 0 0 0 0 0 0 0 0 + -2.7855 0.7636 -0.2453 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.1409 -1.8536 0.1477 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1094 0.6715 -0.3113 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5305 0.5996 0.1635 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.1851 2.7545 0.6593 H 0 0 0 0 0 0 0 0 0 0 0 0 + -2.7247 -1.3605 -0.4564 H 0 0 0 0 0 0 0 0 0 0 0 0 + -2.5797 2.8872 0.0506 H 0 0 0 0 0 0 0 0 0 0 0 0 + -3.8374 0.8238 -0.5090 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7290 1.4184 0.8593 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2045 0.6969 -0.6924 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7105 -0.3659 0.6426 H 0 0 0 0 0 0 0 0 0 0 0 0 + -0.2555 -3.5916 -0.7337 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 5 1 0 0 0 0 + 1 12 1 0 0 0 0 + 2 11 1 0 0 0 0 + 2 21 1 0 0 0 0 + 3 11 2 0 0 0 0 + 4 12 2 0 0 0 0 + 5 6 1 0 0 0 0 + 5 7 2 0 0 0 0 + 6 8 2 0 0 0 0 + 6 11 1 0 0 0 0 + 7 9 1 0 0 0 0 + 7 14 1 0 0 0 0 + 8 10 1 0 0 0 0 + 8 15 1 0 0 0 0 + 9 10 2 0 0 0 0 + 9 16 1 0 0 0 0 + 10 17 1 0 0 0 0 + 12 13 1 0 0 0 0 + 13 18 1 0 0 0 0 + 13 19 1 0 0 0 0 + 13 20 1 0 0 0 0 +M END diff --git a/tests/structure/data/molecules/aspirin_3d.mol2 b/tests/structure/data/molecules/aspirin_3d.mol2 new file mode 100644 index 000000000..ea10501e7 --- /dev/null +++ b/tests/structure/data/molecules/aspirin_3d.mol2 @@ -0,0 +1,50 @@ +@MOLECULE +2244 + 21 21 0 0 0 +SMALL +GASTEIGER + +@ATOM + 1 O 1.2333 0.5540 0.7792 O.3 1 UNL1 -0.4252 + 2 O -0.6952 -2.7148 -0.7502 O.3 1 UNL1 -0.4770 + 3 O 0.7958 -2.1843 0.8685 O.2 1 UNL1 -0.2450 + 4 O 1.7813 0.8105 -1.4821 O.2 1 UNL1 -0.2507 + 5 C -0.0857 0.6088 0.4403 C.ar 1 UNL1 0.1456 + 6 C -0.7927 -0.5515 0.1244 C.ar 1 UNL1 0.1010 + 7 C -0.7288 1.8464 0.4133 C.ar 1 UNL1 -0.0184 + 8 C -2.1426 -0.4741 -0.2184 C.ar 1 UNL1 -0.0442 + 9 C -2.0787 1.9238 0.0706 C.ar 1 UNL1 -0.0582 + 10 C -2.7855 0.7636 -0.2453 C.ar 1 UNL1 -0.0608 + 11 C -0.1409 -1.8536 0.1477 C.2 1 UNL1 0.3404 + 12 C 2.1094 0.6715 -0.3113 C.2 1 UNL1 0.3092 + 13 C 3.5305 0.5996 0.1635 C.3 1 UNL1 0.0336 + 14 H -0.1851 2.7545 0.6593 H 1 UNL1 0.0654 + 15 H -2.7247 -1.3605 -0.4564 H 1 UNL1 0.0627 + 16 H -2.5797 2.8872 0.0506 H 1 UNL1 0.0619 + 17 H -3.8374 0.8238 -0.5090 H 1 UNL1 0.0618 + 18 H 3.7290 1.4184 0.8593 H 1 UNL1 0.0342 + 19 H 4.2045 0.6969 -0.6924 H 1 UNL1 0.0342 + 20 H 3.7105 -0.3659 0.6426 H 1 UNL1 0.0342 + 21 H -0.2555 -3.5916 -0.7337 H 1 UNL1 0.2954 +@BOND + 1 1 5 1 + 2 1 12 1 + 3 2 11 1 + 4 2 21 1 + 5 3 11 2 + 6 4 12 2 + 7 5 6 ar + 8 5 7 ar + 9 6 8 ar + 10 6 11 1 + 11 7 9 ar + 12 7 14 1 + 13 8 10 ar + 14 8 15 1 + 15 9 10 ar + 16 9 16 1 + 17 10 17 1 + 18 12 13 1 + 19 13 18 1 + 20 13 19 1 + 21 13 20 1 diff --git a/tests/structure/data/molecules/aspirin_3d.sdf b/tests/structure/data/molecules/aspirin_3d.sdf new file mode 100644 index 000000000..5049bf427 --- /dev/null +++ b/tests/structure/data/molecules/aspirin_3d.sdf @@ -0,0 +1,197 @@ +2244 + -OEChem-08302211123D + + 21 21 0 0 0 0 0 0 0999 V2000 + 1.2333 0.5540 0.7792 O 0 0 0 0 0 0 0 0 0 0 0 0 + -0.6952 -2.7148 -0.7502 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7958 -2.1843 0.8685 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7813 0.8105 -1.4821 O 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0857 0.6088 0.4403 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.7927 -0.5515 0.1244 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.7288 1.8464 0.4133 C 0 0 0 0 0 0 0 0 0 0 0 0 + -2.1426 -0.4741 -0.2184 C 0 0 0 0 0 0 0 0 0 0 0 0 + -2.0787 1.9238 0.0706 C 0 0 0 0 0 0 0 0 0 0 0 0 + -2.7855 0.7636 -0.2453 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.1409 -1.8536 0.1477 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1094 0.6715 -0.3113 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5305 0.5996 0.1635 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.1851 2.7545 0.6593 H 0 0 0 0 0 0 0 0 0 0 0 0 + -2.7247 -1.3605 -0.4564 H 0 0 0 0 0 0 0 0 0 0 0 0 + -2.5797 2.8872 0.0506 H 0 0 0 0 0 0 0 0 0 0 0 0 + -3.8374 0.8238 -0.5090 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7290 1.4184 0.8593 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2045 0.6969 -0.6924 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7105 -0.3659 0.6426 H 0 0 0 0 0 0 0 0 0 0 0 0 + -0.2555 -3.5916 -0.7337 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 5 1 0 0 0 0 + 1 12 1 0 0 0 0 + 2 11 1 0 0 0 0 + 2 21 1 0 0 0 0 + 3 11 2 0 0 0 0 + 4 12 2 0 0 0 0 + 5 6 1 0 0 0 0 + 5 7 2 0 0 0 0 + 6 8 2 0 0 0 0 + 6 11 1 0 0 0 0 + 7 9 1 0 0 0 0 + 7 14 1 0 0 0 0 + 8 10 1 0 0 0 0 + 8 15 1 0 0 0 0 + 9 10 2 0 0 0 0 + 9 16 1 0 0 0 0 + 10 17 1 0 0 0 0 + 12 13 1 0 0 0 0 + 13 18 1 0 0 0 0 + 13 19 1 0 0 0 0 + 13 20 1 0 0 0 0 +M END +> +2244 + +> +0.6 + +> +1 +11 +10 +3 +15 +17 +13 +5 +16 +7 +14 +9 +8 +4 +18 +6 +12 +2 + +> +18 +1 -0.23 +10 -0.15 +11 0.63 +12 0.66 +13 0.06 +14 0.15 +15 0.15 +16 0.15 +17 0.15 +2 -0.65 +21 0.5 +3 -0.57 +4 -0.57 +5 0.08 +6 0.09 +7 -0.15 +8 -0.15 +9 -0.15 + +> +3 + +> +5 +1 2 acceptor +1 3 acceptor +1 4 acceptor +3 2 3 11 anion +6 5 6 7 8 9 10 rings + +> +13 + +> +0 + +> +0 + +> +0 + +> +0 + +> +0 + +> +1 + +> +1 + +> +000008C400000001 + +> +39.5952 + +> +25.432 + +> +1 1 18265615372930943622 +100427 49 16967750034970055351 +12138202 97 18271247217817981012 +12423570 1 16692715976000295083 +12524768 44 16753525617747228747 +12716758 59 18341332292274886536 +13024252 1 17968377969333732145 +14181834 199 17830728755827362645 +14614273 12 18262232214645093005 +15207287 21 17703787037639964108 +15775835 57 18340488876329928641 +16945 1 18271533103414939405 +193761 8 17907860604865584321 +20645476 183 17677348215414174190 +20871998 184 18198632231250704846 +21040471 1 18411412921197846465 +21501502 16 18123463883164380929 +23402539 116 18271795865171824860 +23419403 2 13539898140662769886 +23552423 10 18048876295495619569 +23559900 14 18272369794190581304 +241688 4 16179044415907240795 +257057 1 17478316999871287486 +2748010 2 18339085878070479087 +305870 269 18263645056784260212 +528862 383 18117272558388284091 +53812653 8 18410289211719108569 +7364860 26 17910392788380644719 +81228 2 18050568744116491203 + +> +244.06 +3.86 +2.45 +0.89 +1.95 +1.58 +0.15 +-1.85 +0.38 +-0.61 +-0.02 +0.29 +0.01 +-0.33 + +> +513.037 + +> +136 + +> +2 +5 +10 + +$$$$ diff --git a/tests/structure/data/molecules/aspirin_3d.xyz b/tests/structure/data/molecules/aspirin_3d.xyz new file mode 100644 index 000000000..6580fa163 --- /dev/null +++ b/tests/structure/data/molecules/aspirin_3d.xyz @@ -0,0 +1,23 @@ +21 +2244 +O 1.23330 0.55400 0.77920 +O -0.69520 -2.71480 -0.75020 +O 0.79580 -2.18430 0.86850 +O 1.78130 0.81050 -1.48210 +C -0.08570 0.60880 0.44030 +C -0.79270 -0.55150 0.12440 +C -0.72880 1.84640 0.41330 +C -2.14260 -0.47410 -0.21840 +C -2.07870 1.92380 0.07060 +C -2.78550 0.76360 -0.24530 +C -0.14090 -1.85360 0.14770 +C 2.10940 0.67150 -0.31130 +C 3.53050 0.59960 0.16350 +H -0.18510 2.75450 0.65930 +H -2.72470 -1.36050 -0.45640 +H -2.57970 2.88720 0.05060 +H -3.83740 0.82380 -0.50900 +H 3.72900 1.41840 0.85930 +H 4.20450 0.69690 -0.69240 +H 3.71050 -0.36590 0.64260 +H -0.25550 -3.59160 -0.73370 diff --git a/tests/structure/data/molecules/lorazepam.mol b/tests/structure/data/molecules/lorazepam.mol new file mode 100644 index 000000000..8b54e39df --- /dev/null +++ b/tests/structure/data/molecules/lorazepam.mol @@ -0,0 +1,70 @@ + + OpenBabel08312206533D + + 31 33 0 0 1 0 0 0 0 0999 V2000 + 1.0458 0.0653 0.0656 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2774 0.0282 -0.0046 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0026 1.0929 0.4733 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4002 1.2132 0.5140 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9007 2.5214 0.4851 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2770 2.7574 0.4793 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1597 1.6822 0.5029 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.8540 1.9752 0.5220 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6818 0.3746 0.5564 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2985 0.1303 0.6017 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8283 -1.2660 0.9101 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5626 -2.0603 1.9642 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0622 -1.3814 3.0933 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7570 -2.0648 4.0948 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9254 -3.4420 4.0076 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4099 -4.1342 2.9130 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7406 -3.4531 1.8855 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2403 -4.4195 0.5410 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7966 -1.8174 0.3690 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0635 -1.1224 -0.6734 C 0 0 3 0 0 0 0 0 0 0 0 0 + 2.1845 -1.9789 -1.3825 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4244 1.8962 0.6847 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2255 3.3749 0.4387 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6489 3.7786 0.4499 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3921 -0.4473 0.6011 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9171 -0.3104 3.2166 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1587 -1.5212 4.9470 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.4551 -3.9794 4.7908 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.5410 -5.2130 2.8584 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7339 -0.7016 -1.4316 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.6224 -2.3606 -0.6862 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 0 0 0 + 2 3 1 0 0 0 0 + 2 20 1 0 0 0 0 + 3 4 1 0 0 0 0 + 3 22 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 10 2 0 0 0 0 + 5 6 2 0 0 0 0 + 5 23 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 24 1 0 0 0 0 + 7 8 1 0 0 0 0 + 7 9 2 0 0 0 0 + 9 10 1 0 0 0 0 + 9 25 1 0 0 0 0 + 10 11 1 0 0 0 0 + 11 12 1 0 0 0 0 + 11 19 2 0 0 0 0 + 12 13 1 0 0 0 0 + 12 17 2 0 0 0 0 + 13 14 2 0 0 0 0 + 13 26 1 0 0 0 0 + 14 15 1 0 0 0 0 + 14 27 1 0 0 0 0 + 15 16 2 0 0 0 0 + 15 28 1 0 0 0 0 + 16 17 1 0 0 0 0 + 16 29 1 0 0 0 0 + 17 18 1 0 0 0 0 + 19 20 1 0 0 0 0 + 20 21 1 0 0 0 0 + 20 30 1 0 0 0 0 + 21 31 1 0 0 0 0 +M END +$$$$ diff --git a/tests/structure/data/molecules/lorazepam.mol2 b/tests/structure/data/molecules/lorazepam.mol2 new file mode 100644 index 000000000..a8a274322 --- /dev/null +++ b/tests/structure/data/molecules/lorazepam.mol2 @@ -0,0 +1,72 @@ +@MOLECULE +***** + 31 33 0 0 0 +SMALL +GASTEIGER + +@ATOM + 1 O 1.0458 0.0653 0.0656 O.2 1 UNL1 -0.2705 + 2 C 2.2774 0.0282 -0.0046 C.2 1 UNL1 0.2686 + 3 N 3.0026 1.0929 0.4733 N.am 1 UNL1 -0.2812 + 4 C 4.4002 1.2132 0.5140 C.ar 1 UNL1 0.0428 + 5 C 4.9007 2.5214 0.4851 C.ar 1 UNL1 -0.0385 + 6 C 6.2770 2.7574 0.4793 C.ar 1 UNL1 -0.0416 + 7 C 7.1597 1.6822 0.5029 C.ar 1 UNL1 0.0417 + 8 CL 8.8540 1.9752 0.5220 Cl 1 UNL1 -0.0835 + 9 C 6.6818 0.3746 0.5564 C.ar 1 UNL1 -0.0324 + 10 C 5.2985 0.1303 0.6017 C.ar 1 UNL1 0.0232 + 11 C 4.8283 -1.2660 0.9101 C.2 1 UNL1 0.0793 + 12 C 5.5626 -2.0603 1.9642 C.ar 1 UNL1 0.0190 + 13 C 6.0622 -1.3814 3.0933 C.ar 1 UNL1 -0.0512 + 14 C 6.7570 -2.0648 4.0948 C.ar 1 UNL1 -0.0611 + 15 C 6.9254 -3.4420 4.0076 C.ar 1 UNL1 -0.0603 + 16 C 6.4099 -4.1342 2.9130 C.ar 1 UNL1 -0.0427 + 17 C 5.7406 -3.4531 1.8855 C.ar 1 UNL1 0.0501 + 18 CL 5.2403 -4.4195 0.5410 Cl 1 UNL1 -0.0829 + 19 N 3.7966 -1.8174 0.3690 N.2 1 UNL1 -0.2428 + 20 C 3.0635 -1.1224 -0.6734 C.3 1 UNL1 0.2246 + 21 O 2.1845 -1.9789 -1.3825 O.3 1 UNL1 -0.3636 + 22 H 2.4244 1.8962 0.6847 H 1 UNL1 0.1550 + 23 H 4.2255 3.3749 0.4387 H 1 UNL1 0.0637 + 24 H 6.6489 3.7786 0.4499 H 1 UNL1 0.0633 + 25 H 7.3921 -0.4473 0.6011 H 1 UNL1 0.0639 + 26 H 5.9171 -0.3104 3.2166 H 1 UNL1 0.0625 + 27 H 7.1587 -1.5212 4.9470 H 1 UNL1 0.0618 + 28 H 7.4551 -3.9794 4.7908 H 1 UNL1 0.0618 + 29 H 6.5410 -5.2130 2.8584 H 1 UNL1 0.0632 + 30 H 3.7339 -0.7016 -1.4316 H 1 UNL1 0.0952 + 31 H 1.6224 -2.3606 -0.6862 H 1 UNL1 0.2125 +@BOND + 1 1 2 2 + 2 2 3 am + 3 2 20 1 + 4 3 4 1 + 5 3 22 1 + 6 4 5 ar + 7 4 10 ar + 8 5 6 ar + 9 5 23 1 + 10 6 7 ar + 11 6 24 1 + 12 7 8 1 + 13 7 9 ar + 14 9 10 ar + 15 9 25 1 + 16 10 11 1 + 17 11 12 1 + 18 11 19 2 + 19 12 13 ar + 20 12 17 ar + 21 13 14 ar + 22 13 26 1 + 23 14 15 ar + 24 14 27 1 + 25 15 16 ar + 26 15 28 1 + 27 16 17 ar + 28 16 29 1 + 29 17 18 1 + 30 19 20 1 + 31 20 21 1 + 32 20 30 1 + 33 21 31 1 diff --git a/tests/structure/data/molecules/lorazepam.xyz b/tests/structure/data/molecules/lorazepam.xyz new file mode 100644 index 000000000..fe7be883d --- /dev/null +++ b/tests/structure/data/molecules/lorazepam.xyz @@ -0,0 +1,33 @@ +31 + +O 1.04580 0.06530 0.06560 +C 2.27740 0.02820 -0.00460 +N 3.00260 1.09290 0.47330 +C 4.40020 1.21320 0.51400 +C 4.90070 2.52140 0.48510 +C 6.27700 2.75740 0.47930 +C 7.15970 1.68220 0.50290 +Cl 8.85400 1.97520 0.52200 +C 6.68180 0.37460 0.55640 +C 5.29850 0.13030 0.60170 +C 4.82830 -1.26600 0.91010 +C 5.56260 -2.06030 1.96420 +C 6.06220 -1.38140 3.09330 +C 6.75700 -2.06480 4.09480 +C 6.92540 -3.44200 4.00760 +C 6.40990 -4.13420 2.91300 +C 5.74060 -3.45310 1.88550 +Cl 5.24030 -4.41950 0.54100 +N 3.79660 -1.81740 0.36900 +C 3.06350 -1.12240 -0.67340 +O 2.18450 -1.97890 -1.38250 +H 2.42440 1.89620 0.68470 +H 4.22550 3.37490 0.43870 +H 6.64890 3.77860 0.44990 +H 7.39210 -0.44730 0.60110 +H 5.91710 -0.31040 3.21660 +H 7.15870 -1.52120 4.94700 +H 7.45510 -3.97940 4.79080 +H 6.54100 -5.21300 2.85840 +H 3.73390 -0.70160 -1.43160 +H 1.62240 -2.36060 -0.68620 diff --git a/tests/structure/data/molecules/nu7026_conformers.mol2 b/tests/structure/data/molecules/nu7026_conformers.mol2 new file mode 100644 index 000000000..002060a96 --- /dev/null +++ b/tests/structure/data/molecules/nu7026_conformers.mol2 @@ -0,0 +1,498 @@ +@MOLECULE += + 36 39 0 0 0 +SMALL +GASTEIGER + +@ATOM + 1 O 0.8670 0.1340 0.2110 O.2 1 UNL1 -0.2870 + 2 C 2.0900 0.0960 0.1470 C.ar 1 UNL1 0.1944 + 3 C 2.8350 -1.1640 0.0710 C.ar 1 UNL1 0.0647 + 4 C 2.1560 -2.3820 0.0960 C.ar 1 UNL1 -0.0468 + 5 C 2.8790 -3.5720 0.0630 C.ar 1 UNL1 -0.0531 + 6 C 4.2820 -3.5580 0.0210 C.ar 1 UNL1 -0.0143 + 7 C 4.9740 -2.3210 -0.0130 C.ar 1 UNL1 0.0252 + 8 C 6.3850 -2.3470 -0.0400 C.ar 1 UNL1 -0.0505 + 9 C 7.0890 -3.5530 -0.0300 C.ar 1 UNL1 -0.0611 + 10 C 6.3990 -4.7590 -0.0020 C.ar 1 UNL1 -0.0612 + 11 C 5.0040 -4.7620 0.0200 C.ar 1 UNL1 -0.0539 + 12 C 4.2250 -1.1210 -0.0060 C.ar 1 UNL1 0.1485 + 13 O 4.9090 0.0730 -0.0870 O.2 1 UNL1 -0.4405 + 14 C 4.2180 1.2770 0.0180 C.ar 1 UNL1 0.1931 + 15 C 2.8840 1.3280 0.1470 C.ar 1 UNL1 0.0434 + 16 N 5.0010 2.4230 -0.0690 N.pl3 1 UNL1 -0.2969 + 17 C 4.5206 3.7069 -0.6149 C.3 1 UNL1 0.0383 + 18 C 5.6118 4.3408 -1.4890 C.3 1 UNL1 0.0635 + 19 O 6.8418 4.5033 -0.7619 O.3 1 UNL1 -0.3767 + 20 C 7.3070 3.2310 -0.2771 C.3 1 UNL1 0.0635 + 21 C 6.2768 2.5710 0.6558 C.3 1 UNL1 0.0383 + 22 H 1.1251 -2.4014 0.1387 H 1 UNL1 0.0626 + 23 H 2.3777 -4.4740 0.0695 H 1 UNL1 0.0624 + 24 H 6.9068 -1.4570 -0.0677 H 1 UNL1 0.0625 + 25 H 8.1209 -3.5487 -0.0434 H 1 UNL1 0.0618 + 26 H 6.9178 -5.6511 0.0025 H 1 UNL1 0.0618 + 27 H 4.4965 -5.6605 0.0357 H 1 UNL1 0.0624 + 28 H 2.4134 2.2410 0.2469 H 1 UNL1 0.0707 + 29 H 4.2821 4.3688 0.1914 H 1 UNL1 0.0487 + 30 H 3.6478 3.5338 -1.2092 H 1 UNL1 0.0487 + 31 H 5.2760 5.3004 -1.8228 H 1 UNL1 0.0575 + 32 H 5.7960 3.6915 -2.3192 H 1 UNL1 0.0575 + 33 H 7.4844 2.5850 -1.1114 H 1 UNL1 0.0575 + 34 H 8.2072 3.3926 0.2783 H 1 UNL1 0.0575 + 35 H 6.1298 3.1847 1.5199 H 1 UNL1 0.0487 + 36 H 6.6315 1.6100 0.9650 H 1 UNL1 0.0487 +@BOND + 1 2 1 2 + 2 3 4 ar + 3 3 2 ar + 4 4 22 1 + 5 5 4 ar + 6 5 23 1 + 7 6 5 ar + 8 7 12 ar + 9 7 6 ar + 10 8 9 ar + 11 8 7 ar + 12 8 24 1 + 13 9 10 ar + 14 9 25 1 + 15 10 11 ar + 16 10 26 1 + 17 11 6 ar + 18 11 27 1 + 19 12 3 ar + 20 13 12 ar + 21 13 14 ar + 22 14 15 ar + 23 15 2 ar + 24 15 28 1 + 25 16 14 1 + 26 16 17 1 + 27 17 29 1 + 28 17 30 1 + 29 18 17 1 + 30 18 31 1 + 31 18 32 1 + 32 19 18 1 + 33 20 21 1 + 34 20 19 1 + 35 20 33 1 + 36 20 34 1 + 37 21 16 1 + 38 21 35 1 + 39 21 36 1 +@MOLECULE += + 36 39 0 0 0 +SMALL +GASTEIGER + +@ATOM + 1 O 0.8670 0.1340 0.2110 O.2 1 UNL1 -0.2870 + 2 C 2.0900 0.0960 0.1470 C.ar 1 UNL1 0.1944 + 3 C 2.8350 -1.1640 0.0710 C.ar 1 UNL1 0.0647 + 4 C 2.1560 -2.3820 0.0960 C.ar 1 UNL1 -0.0468 + 5 C 2.8790 -3.5720 0.0630 C.ar 1 UNL1 -0.0531 + 6 C 4.2820 -3.5580 0.0210 C.ar 1 UNL1 -0.0143 + 7 C 4.9740 -2.3210 -0.0130 C.ar 1 UNL1 0.0252 + 8 C 6.3850 -2.3470 -0.0400 C.ar 1 UNL1 -0.0505 + 9 C 7.0890 -3.5530 -0.0300 C.ar 1 UNL1 -0.0611 + 10 C 6.3990 -4.7590 -0.0020 C.ar 1 UNL1 -0.0612 + 11 C 5.0040 -4.7620 0.0200 C.ar 1 UNL1 -0.0539 + 12 C 4.2250 -1.1210 -0.0060 C.ar 1 UNL1 0.1485 + 13 O 4.9090 0.0730 -0.0870 O.2 1 UNL1 -0.4405 + 14 C 4.2180 1.2770 0.0180 C.ar 1 UNL1 0.1931 + 15 C 2.8840 1.3280 0.1470 C.ar 1 UNL1 0.0434 + 16 N 5.0010 2.4230 -0.0690 N.pl3 1 UNL1 -0.2969 + 17 C 4.6800 3.6913 0.6134 C.3 1 UNL1 0.0383 + 18 C 4.9628 4.8726 -0.3254 C.3 1 UNL1 0.0635 + 19 O 6.3206 4.8565 -0.7987 O.3 1 UNL1 -0.3767 + 20 C 6.5924 3.6269 -1.4945 C.3 1 UNL1 0.0635 + 21 C 6.3828 2.4044 -0.5840 C.3 1 UNL1 0.0383 + 22 H 1.1251 -2.4014 0.1387 H 1 UNL1 0.0626 + 23 H 2.3777 -4.4740 0.0695 H 1 UNL1 0.0624 + 24 H 6.9068 -1.4570 -0.0677 H 1 UNL1 0.0625 + 25 H 8.1209 -3.5487 -0.0434 H 1 UNL1 0.0618 + 26 H 6.9178 -5.6511 0.0025 H 1 UNL1 0.0618 + 27 H 4.4965 -5.6605 0.0357 H 1 UNL1 0.0624 + 28 H 2.4134 2.2410 0.2469 H 1 UNL1 0.0707 + 29 H 5.2825 3.7840 1.4927 H 1 UNL1 0.0487 + 30 H 3.6447 3.6949 0.8839 H 1 UNL1 0.0487 + 31 H 4.7900 5.7863 0.2039 H 1 UNL1 0.0575 + 32 H 4.3118 4.7928 -1.1707 H 1 UNL1 0.0575 + 33 H 5.9349 3.5507 -2.3353 H 1 UNL1 0.0575 + 34 H 7.6148 3.6388 -1.8097 H 1 UNL1 0.0575 + 35 H 7.0715 2.4437 0.2340 H 1 UNL1 0.0487 + 36 H 6.5502 1.5056 -1.1399 H 1 UNL1 0.0487 +@BOND + 1 2 1 2 + 2 3 4 ar + 3 3 2 ar + 4 4 22 1 + 5 5 4 ar + 6 5 23 1 + 7 6 5 ar + 8 7 12 ar + 9 7 6 ar + 10 8 9 ar + 11 8 7 ar + 12 8 24 1 + 13 9 10 ar + 14 9 25 1 + 15 10 11 ar + 16 10 26 1 + 17 11 6 ar + 18 11 27 1 + 19 12 3 ar + 20 13 12 ar + 21 13 14 ar + 22 14 15 ar + 23 15 2 ar + 24 15 28 1 + 25 16 14 1 + 26 16 17 1 + 27 17 29 1 + 28 17 30 1 + 29 18 17 1 + 30 18 31 1 + 31 18 32 1 + 32 19 18 1 + 33 20 21 1 + 34 20 19 1 + 35 20 33 1 + 36 20 34 1 + 37 21 16 1 + 38 21 35 1 + 39 21 36 1 +@MOLECULE += + 36 39 0 0 0 +SMALL +GASTEIGER + +@ATOM + 1 O 0.8670 0.1340 0.2110 O.2 1 UNL1 -0.2870 + 2 C 2.0900 0.0960 0.1470 C.ar 1 UNL1 0.1944 + 3 C 2.8350 -1.1640 0.0710 C.ar 1 UNL1 0.0647 + 4 C 2.1560 -2.3820 0.0960 C.ar 1 UNL1 -0.0468 + 5 C 2.8790 -3.5720 0.0630 C.ar 1 UNL1 -0.0531 + 6 C 4.2820 -3.5580 0.0210 C.ar 1 UNL1 -0.0143 + 7 C 4.9740 -2.3210 -0.0130 C.ar 1 UNL1 0.0252 + 8 C 6.3850 -2.3470 -0.0400 C.ar 1 UNL1 -0.0505 + 9 C 7.0890 -3.5530 -0.0300 C.ar 1 UNL1 -0.0611 + 10 C 6.3990 -4.7590 -0.0020 C.ar 1 UNL1 -0.0612 + 11 C 5.0040 -4.7620 0.0200 C.ar 1 UNL1 -0.0539 + 12 C 4.2250 -1.1210 -0.0060 C.ar 1 UNL1 0.1485 + 13 O 4.9090 0.0730 -0.0870 O.2 1 UNL1 -0.4405 + 14 C 4.2180 1.2770 0.0180 C.ar 1 UNL1 0.1931 + 15 C 2.8840 1.3280 0.1470 C.ar 1 UNL1 0.0434 + 16 N 5.0010 2.4230 -0.0690 N.pl3 1 UNL1 -0.2969 + 17 C 4.4651 3.7940 0.0332 C.3 1 UNL1 0.0383 + 18 C 5.1449 4.6965 -1.0061 C.3 1 UNL1 0.0635 + 19 O 6.5760 4.6770 -0.8659 O.3 1 UNL1 -0.3767 + 20 C 7.0736 3.3348 -1.0107 C.3 1 UNL1 0.0635 + 21 C 6.4710 2.3919 0.0453 C.3 1 UNL1 0.0383 + 22 H 1.1251 -2.4014 0.1387 H 1 UNL1 0.0626 + 23 H 2.3777 -4.4740 0.0695 H 1 UNL1 0.0624 + 24 H 6.9068 -1.4570 -0.0677 H 1 UNL1 0.0625 + 25 H 8.1209 -3.5487 -0.0434 H 1 UNL1 0.0618 + 26 H 6.9178 -5.6511 0.0025 H 1 UNL1 0.0618 + 27 H 4.4965 -5.6605 0.0357 H 1 UNL1 0.0624 + 28 H 2.4134 2.2410 0.2469 H 1 UNL1 0.0707 + 29 H 4.6541 4.1771 1.0143 H 1 UNL1 0.0487 + 30 H 3.4111 3.7760 -0.1498 H 1 UNL1 0.0487 + 31 H 4.7966 5.6998 -0.8762 H 1 UNL1 0.0575 + 32 H 4.8982 4.3306 -1.9808 H 1 UNL1 0.0575 + 33 H 6.8193 2.9731 -1.9850 H 1 UNL1 0.0575 + 34 H 8.1349 3.3544 -0.8761 H 1 UNL1 0.0575 + 35 H 6.7621 2.7150 1.0230 H 1 UNL1 0.0487 + 36 H 6.8259 1.3952 -0.1142 H 1 UNL1 0.0487 +@BOND + 1 2 1 2 + 2 3 4 ar + 3 3 2 ar + 4 4 22 1 + 5 5 4 ar + 6 5 23 1 + 7 6 5 ar + 8 7 12 ar + 9 7 6 ar + 10 8 9 ar + 11 8 7 ar + 12 8 24 1 + 13 9 10 ar + 14 9 25 1 + 15 10 11 ar + 16 10 26 1 + 17 11 6 ar + 18 11 27 1 + 19 12 3 ar + 20 13 12 ar + 21 13 14 ar + 22 14 15 ar + 23 15 2 ar + 24 15 28 1 + 25 16 14 1 + 26 16 17 1 + 27 17 29 1 + 28 17 30 1 + 29 18 17 1 + 30 18 31 1 + 31 18 32 1 + 32 19 18 1 + 33 20 21 1 + 34 20 19 1 + 35 20 33 1 + 36 20 34 1 + 37 21 16 1 + 38 21 35 1 + 39 21 36 1 +@MOLECULE += + 36 39 0 0 0 +SMALL +GASTEIGER + +@ATOM + 1 O 0.8670 0.1340 0.2110 O.2 1 UNL1 -0.2870 + 2 C 2.0900 0.0960 0.1470 C.ar 1 UNL1 0.1944 + 3 C 2.8350 -1.1640 0.0710 C.ar 1 UNL1 0.0647 + 4 C 2.1560 -2.3820 0.0960 C.ar 1 UNL1 -0.0468 + 5 C 2.8790 -3.5720 0.0630 C.ar 1 UNL1 -0.0531 + 6 C 4.2820 -3.5580 0.0210 C.ar 1 UNL1 -0.0143 + 7 C 4.9740 -2.3210 -0.0130 C.ar 1 UNL1 0.0252 + 8 C 6.3850 -2.3470 -0.0400 C.ar 1 UNL1 -0.0505 + 9 C 7.0890 -3.5530 -0.0300 C.ar 1 UNL1 -0.0611 + 10 C 6.3990 -4.7590 -0.0020 C.ar 1 UNL1 -0.0612 + 11 C 5.0040 -4.7620 0.0200 C.ar 1 UNL1 -0.0539 + 12 C 4.2250 -1.1210 -0.0060 C.ar 1 UNL1 0.1485 + 13 O 4.9090 0.0730 -0.0870 O.2 1 UNL1 -0.4405 + 14 C 4.2180 1.2770 0.0180 C.ar 1 UNL1 0.1931 + 15 C 2.8840 1.3280 0.1470 C.ar 1 UNL1 0.0434 + 16 N 5.0010 2.4230 -0.0690 N.pl3 1 UNL1 -0.2969 + 17 C 6.4112 2.4892 0.3602 C.3 1 UNL1 0.0383 + 18 C 6.6700 3.8137 1.0919 C.3 1 UNL1 0.0635 + 19 O 6.3120 4.9442 0.2785 O.3 1 UNL1 -0.3767 + 20 C 4.9231 4.8740 -0.0905 C.3 1 UNL1 0.0635 + 21 C 4.6129 3.5912 -0.8813 C.3 1 UNL1 0.0383 + 22 H 1.1251 -2.4014 0.1387 H 1 UNL1 0.0626 + 23 H 2.3777 -4.4740 0.0695 H 1 UNL1 0.0624 + 24 H 6.9068 -1.4570 -0.0677 H 1 UNL1 0.0625 + 25 H 8.1209 -3.5487 -0.0434 H 1 UNL1 0.0618 + 26 H 6.9178 -5.6511 0.0025 H 1 UNL1 0.0618 + 27 H 4.4965 -5.6605 0.0357 H 1 UNL1 0.0624 + 28 H 2.4134 2.2410 0.2469 H 1 UNL1 0.0707 + 29 H 7.0471 2.4273 -0.4981 H 1 UNL1 0.0487 + 30 H 6.6180 1.6738 1.0215 H 1 UNL1 0.0487 + 31 H 7.7095 3.8777 1.3378 H 1 UNL1 0.0575 + 32 H 6.0675 3.8321 1.9759 H 1 UNL1 0.0575 + 33 H 4.3265 4.8875 0.7976 H 1 UNL1 0.0575 + 34 H 4.6988 5.7144 -0.7135 H 1 UNL1 0.0575 + 35 H 5.1661 3.5914 -1.7972 H 1 UNL1 0.0487 + 36 H 3.5672 3.5465 -1.1037 H 1 UNL1 0.0487 +@BOND + 1 2 1 2 + 2 3 4 ar + 3 3 2 ar + 4 4 22 1 + 5 5 4 ar + 6 5 23 1 + 7 6 5 ar + 8 7 12 ar + 9 7 6 ar + 10 8 9 ar + 11 8 7 ar + 12 8 24 1 + 13 9 10 ar + 14 9 25 1 + 15 10 11 ar + 16 10 26 1 + 17 11 6 ar + 18 11 27 1 + 19 12 3 ar + 20 13 12 ar + 21 13 14 ar + 22 14 15 ar + 23 15 2 ar + 24 15 28 1 + 25 16 14 1 + 26 16 17 1 + 27 17 29 1 + 28 17 30 1 + 29 18 17 1 + 30 18 31 1 + 31 18 32 1 + 32 19 18 1 + 33 20 21 1 + 34 20 19 1 + 35 20 33 1 + 36 20 34 1 + 37 21 16 1 + 38 21 35 1 + 39 21 36 1 +@MOLECULE += + 36 39 0 0 0 +SMALL +GASTEIGER + +@ATOM + 1 O 0.8670 0.1340 0.2110 O.2 1 UNL1 -0.2870 + 2 C 2.0900 0.0960 0.1470 C.ar 1 UNL1 0.1944 + 3 C 2.8350 -1.1640 0.0710 C.ar 1 UNL1 0.0647 + 4 C 2.1560 -2.3820 0.0960 C.ar 1 UNL1 -0.0468 + 5 C 2.8790 -3.5720 0.0630 C.ar 1 UNL1 -0.0531 + 6 C 4.2820 -3.5580 0.0210 C.ar 1 UNL1 -0.0143 + 7 C 4.9740 -2.3210 -0.0130 C.ar 1 UNL1 0.0252 + 8 C 6.3850 -2.3470 -0.0400 C.ar 1 UNL1 -0.0505 + 9 C 7.0890 -3.5530 -0.0300 C.ar 1 UNL1 -0.0611 + 10 C 6.3990 -4.7590 -0.0020 C.ar 1 UNL1 -0.0612 + 11 C 5.0040 -4.7620 0.0200 C.ar 1 UNL1 -0.0539 + 12 C 4.2250 -1.1210 -0.0060 C.ar 1 UNL1 0.1485 + 13 O 4.9090 0.0730 -0.0870 O.2 1 UNL1 -0.4405 + 14 C 4.2180 1.2770 0.0180 C.ar 1 UNL1 0.1931 + 15 C 2.8840 1.3280 0.1470 C.ar 1 UNL1 0.0434 + 16 N 5.0010 2.4230 -0.0690 N.pl3 1 UNL1 -0.2969 + 17 C 6.4642 2.4060 -0.2591 C.3 1 UNL1 0.0383 + 18 C 7.1162 3.4739 0.6304 C.3 1 UNL1 0.0635 + 19 O 6.5660 4.7783 0.3779 O.3 1 UNL1 -0.3767 + 20 C 5.1461 4.7748 0.6105 C.3 1 UNL1 0.0635 + 21 C 4.4273 3.7622 -0.2979 C.3 1 UNL1 0.0383 + 22 H 1.1251 -2.4014 0.1387 H 1 UNL1 0.0626 + 23 H 2.3777 -4.4740 0.0695 H 1 UNL1 0.0624 + 24 H 6.9068 -1.4570 -0.0677 H 1 UNL1 0.0625 + 25 H 8.1209 -3.5487 -0.0434 H 1 UNL1 0.0618 + 26 H 6.9178 -5.6511 0.0025 H 1 UNL1 0.0618 + 27 H 4.4965 -5.6605 0.0357 H 1 UNL1 0.0624 + 28 H 2.4134 2.2410 0.2469 H 1 UNL1 0.0707 + 29 H 6.6916 2.6105 -1.2844 H 1 UNL1 0.0487 + 30 H 6.8442 1.4424 0.0092 H 1 UNL1 0.0487 + 31 H 8.1676 3.4959 0.4331 H 1 UNL1 0.0575 + 32 H 6.9255 3.2213 1.6526 H 1 UNL1 0.0575 + 33 H 4.9620 4.5167 1.6325 H 1 UNL1 0.0575 + 34 H 4.7678 5.7510 0.3896 H 1 UNL1 0.0575 + 35 H 4.5619 4.0402 -1.3224 H 1 UNL1 0.0487 + 36 H 3.3814 3.7518 -0.0724 H 1 UNL1 0.0487 +@BOND + 1 2 1 2 + 2 3 4 ar + 3 3 2 ar + 4 4 22 1 + 5 5 4 ar + 6 5 23 1 + 7 6 5 ar + 8 7 12 ar + 9 7 6 ar + 10 8 9 ar + 11 8 7 ar + 12 8 24 1 + 13 9 10 ar + 14 9 25 1 + 15 10 11 ar + 16 10 26 1 + 17 11 6 ar + 18 11 27 1 + 19 12 3 ar + 20 13 12 ar + 21 13 14 ar + 22 14 15 ar + 23 15 2 ar + 24 15 28 1 + 25 16 14 1 + 26 16 17 1 + 27 17 29 1 + 28 17 30 1 + 29 18 17 1 + 30 18 31 1 + 31 18 32 1 + 32 19 18 1 + 33 20 21 1 + 34 20 19 1 + 35 20 33 1 + 36 20 34 1 + 37 21 16 1 + 38 21 35 1 + 39 21 36 1 +@MOLECULE += + 36 39 0 0 0 +SMALL +GASTEIGER + +@ATOM + 1 O 0.8670 0.1340 0.2110 O.2 1 UNL1 -0.2870 + 2 C 2.0900 0.0960 0.1470 C.ar 1 UNL1 0.1944 + 3 C 2.8350 -1.1640 0.0710 C.ar 1 UNL1 0.0647 + 4 C 2.1560 -2.3820 0.0960 C.ar 1 UNL1 -0.0468 + 5 C 2.8790 -3.5720 0.0630 C.ar 1 UNL1 -0.0531 + 6 C 4.2820 -3.5580 0.0210 C.ar 1 UNL1 -0.0143 + 7 C 4.9740 -2.3210 -0.0130 C.ar 1 UNL1 0.0252 + 8 C 6.3850 -2.3470 -0.0400 C.ar 1 UNL1 -0.0505 + 9 C 7.0890 -3.5530 -0.0300 C.ar 1 UNL1 -0.0611 + 10 C 6.3990 -4.7590 -0.0020 C.ar 1 UNL1 -0.0612 + 11 C 5.0040 -4.7620 0.0200 C.ar 1 UNL1 -0.0539 + 12 C 4.2250 -1.1210 -0.0060 C.ar 1 UNL1 0.1485 + 13 O 4.9090 0.0730 -0.0870 O.2 1 UNL1 -0.4405 + 14 C 4.2180 1.2770 0.0180 C.ar 1 UNL1 0.1931 + 15 C 2.8840 1.3280 0.1470 C.ar 1 UNL1 0.0434 + 16 N 5.0010 2.4230 -0.0690 N.pl3 1 UNL1 -0.2969 + 17 C 6.2552 2.5045 -0.8421 C.3 1 UNL1 0.0383 + 18 C 7.3053 3.2932 -0.0472 C.3 1 UNL1 0.0635 + 19 O 6.8221 4.5984 0.3146 O.3 1 UNL1 -0.3767 + 20 C 5.6226 4.4865 1.1012 C.3 1 UNL1 0.0635 + 21 C 4.5092 3.7542 0.3324 C.3 1 UNL1 0.0383 + 22 H 1.1251 -2.4014 0.1387 H 1 UNL1 0.0626 + 23 H 2.3777 -4.4740 0.0695 H 1 UNL1 0.0624 + 24 H 6.9068 -1.4570 -0.0677 H 1 UNL1 0.0625 + 25 H 8.1209 -3.5487 -0.0434 H 1 UNL1 0.0618 + 26 H 6.9178 -5.6511 0.0025 H 1 UNL1 0.0618 + 27 H 4.4965 -5.6605 0.0357 H 1 UNL1 0.0624 + 28 H 2.4134 2.2410 0.2469 H 1 UNL1 0.0707 + 29 H 6.0678 2.9997 -1.7719 H 1 UNL1 0.0487 + 30 H 6.6210 1.5162 -1.0274 H 1 UNL1 0.0487 + 31 H 8.1852 3.4020 -0.6462 H 1 UNL1 0.0575 + 32 H 7.5204 2.7540 0.8517 H 1 UNL1 0.0575 + 33 H 5.8432 3.9422 1.9956 H 1 UNL1 0.0575 + 34 H 5.2786 5.4734 1.3303 H 1 UNL1 0.0575 + 35 H 4.2443 4.3167 -0.5385 H 1 UNL1 0.0487 + 36 H 3.6467 3.6486 0.9568 H 1 UNL1 0.0487 +@BOND + 1 2 1 2 + 2 3 4 ar + 3 3 2 ar + 4 4 22 1 + 5 5 4 ar + 6 5 23 1 + 7 6 5 ar + 8 7 12 ar + 9 7 6 ar + 10 8 9 ar + 11 8 7 ar + 12 8 24 1 + 13 9 10 ar + 14 9 25 1 + 15 10 11 ar + 16 10 26 1 + 17 11 6 ar + 18 11 27 1 + 19 12 3 ar + 20 13 12 ar + 21 13 14 ar + 22 14 15 ar + 23 15 2 ar + 24 15 28 1 + 25 16 14 1 + 26 16 17 1 + 27 17 29 1 + 28 17 30 1 + 29 18 17 1 + 30 18 31 1 + 31 18 32 1 + 32 19 18 1 + 33 20 21 1 + 34 20 19 1 + 35 20 33 1 + 36 20 34 1 + 37 21 16 1 + 38 21 35 1 + 39 21 36 1 diff --git a/tests/structure/data/molecules/nu7026_conformers.sdf b/tests/structure/data/molecules/nu7026_conformers.sdf new file mode 100644 index 000000000..fa3dfa2bd --- /dev/null +++ b/tests/structure/data/molecules/nu7026_conformers.sdf @@ -0,0 +1,486 @@ += + OpenBabel08312206383D + + 36 39 0 0 0 0 0 0 0 0999 V2000 + 0.8670 0.1340 0.2110 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0900 0.0960 0.1470 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8350 -1.1640 0.0710 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1560 -2.3820 0.0960 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8790 -3.5720 0.0630 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2820 -3.5580 0.0210 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9740 -2.3210 -0.0130 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3850 -2.3470 -0.0400 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0890 -3.5530 -0.0300 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3990 -4.7590 -0.0020 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0040 -4.7620 0.0200 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2250 -1.1210 -0.0060 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9090 0.0730 -0.0870 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2180 1.2770 0.0180 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8840 1.3280 0.1470 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0010 2.4230 -0.0690 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5206 3.7069 -0.6149 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6118 4.3408 -1.4890 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8418 4.5033 -0.7619 O 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3070 3.2310 -0.2771 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2768 2.5710 0.6558 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1251 -2.4014 0.1387 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3777 -4.4740 0.0695 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9068 -1.4570 -0.0677 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.1209 -3.5487 -0.0434 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9178 -5.6511 0.0025 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4965 -5.6605 0.0357 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4134 2.2410 0.2469 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2821 4.3688 0.1914 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6478 3.5338 -1.2092 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2760 5.3004 -1.8228 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7960 3.6915 -2.3192 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.4844 2.5850 -1.1114 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.2072 3.3926 0.2783 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1298 3.1847 1.5199 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6315 1.6100 0.9650 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2 1 2 0 0 0 0 + 3 4 1 0 0 0 0 + 3 2 1 0 0 0 0 + 4 22 1 0 0 0 0 + 5 4 2 0 0 0 0 + 5 23 1 0 0 0 0 + 6 5 1 0 0 0 0 + 7 12 1 0 0 0 0 + 7 6 2 0 0 0 0 + 8 9 2 0 0 0 0 + 8 7 1 0 0 0 0 + 8 24 1 0 0 0 0 + 9 10 1 0 0 0 0 + 9 25 1 0 0 0 0 + 10 11 2 0 0 0 0 + 10 26 1 0 0 0 0 + 11 6 1 0 0 0 0 + 11 27 1 0 0 0 0 + 12 3 2 0 0 0 0 + 13 12 1 0 0 0 0 + 13 14 1 0 0 0 0 + 14 15 2 0 0 0 0 + 15 2 1 0 0 0 0 + 15 28 1 0 0 0 0 + 16 14 1 0 0 0 0 + 16 17 1 0 0 0 0 + 17 29 1 0 0 0 0 + 17 30 1 0 0 0 0 + 18 17 1 0 0 0 0 + 18 31 1 0 0 0 0 + 18 32 1 0 0 0 0 + 19 18 1 0 0 0 0 + 20 21 1 0 0 0 0 + 20 19 1 0 0 0 0 + 20 33 1 0 0 0 0 + 20 34 1 0 0 0 0 + 21 16 1 0 0 0 0 + 21 35 1 0 0 0 0 + 21 36 1 0 0 0 0 +M END +$$$$ += + OpenBabel08312206383D + + 36 39 0 0 0 0 0 0 0 0999 V2000 + 0.8670 0.1340 0.2110 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0900 0.0960 0.1470 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8350 -1.1640 0.0710 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1560 -2.3820 0.0960 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8790 -3.5720 0.0630 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2820 -3.5580 0.0210 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9740 -2.3210 -0.0130 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3850 -2.3470 -0.0400 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0890 -3.5530 -0.0300 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3990 -4.7590 -0.0020 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0040 -4.7620 0.0200 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2250 -1.1210 -0.0060 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9090 0.0730 -0.0870 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2180 1.2770 0.0180 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8840 1.3280 0.1470 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0010 2.4230 -0.0690 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6800 3.6913 0.6134 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9628 4.8726 -0.3254 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3206 4.8565 -0.7987 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.5924 3.6269 -1.4945 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3828 2.4044 -0.5840 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1251 -2.4014 0.1387 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3777 -4.4740 0.0695 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9068 -1.4570 -0.0677 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.1209 -3.5487 -0.0434 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9178 -5.6511 0.0025 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4965 -5.6605 0.0357 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4134 2.2410 0.2469 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2825 3.7840 1.4927 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6447 3.6949 0.8839 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7900 5.7863 0.2039 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3118 4.7928 -1.1707 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9349 3.5507 -2.3353 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.6148 3.6388 -1.8097 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0715 2.4437 0.2340 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.5502 1.5056 -1.1399 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2 1 2 0 0 0 0 + 3 4 1 0 0 0 0 + 3 2 1 0 0 0 0 + 4 22 1 0 0 0 0 + 5 4 2 0 0 0 0 + 5 23 1 0 0 0 0 + 6 5 1 0 0 0 0 + 7 12 1 0 0 0 0 + 7 6 2 0 0 0 0 + 8 9 2 0 0 0 0 + 8 7 1 0 0 0 0 + 8 24 1 0 0 0 0 + 9 10 1 0 0 0 0 + 9 25 1 0 0 0 0 + 10 11 2 0 0 0 0 + 10 26 1 0 0 0 0 + 11 6 1 0 0 0 0 + 11 27 1 0 0 0 0 + 12 3 2 0 0 0 0 + 13 12 1 0 0 0 0 + 13 14 1 0 0 0 0 + 14 15 2 0 0 0 0 + 15 2 1 0 0 0 0 + 15 28 1 0 0 0 0 + 16 14 1 0 0 0 0 + 16 17 1 0 0 0 0 + 17 29 1 0 0 0 0 + 17 30 1 0 0 0 0 + 18 17 1 0 0 0 0 + 18 31 1 0 0 0 0 + 18 32 1 0 0 0 0 + 19 18 1 0 0 0 0 + 20 21 1 0 0 0 0 + 20 19 1 0 0 0 0 + 20 33 1 0 0 0 0 + 20 34 1 0 0 0 0 + 21 16 1 0 0 0 0 + 21 35 1 0 0 0 0 + 21 36 1 0 0 0 0 +M END +$$$$ += + OpenBabel08312206383D + + 36 39 0 0 0 0 0 0 0 0999 V2000 + 0.8670 0.1340 0.2110 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0900 0.0960 0.1470 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8350 -1.1640 0.0710 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1560 -2.3820 0.0960 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8790 -3.5720 0.0630 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2820 -3.5580 0.0210 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9740 -2.3210 -0.0130 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3850 -2.3470 -0.0400 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0890 -3.5530 -0.0300 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3990 -4.7590 -0.0020 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0040 -4.7620 0.0200 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2250 -1.1210 -0.0060 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9090 0.0730 -0.0870 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2180 1.2770 0.0180 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8840 1.3280 0.1470 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0010 2.4230 -0.0690 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4651 3.7940 0.0332 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1449 4.6965 -1.0061 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.5760 4.6770 -0.8659 O 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0736 3.3348 -1.0107 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4710 2.3919 0.0453 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1251 -2.4014 0.1387 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3777 -4.4740 0.0695 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9068 -1.4570 -0.0677 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.1209 -3.5487 -0.0434 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9178 -5.6511 0.0025 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4965 -5.6605 0.0357 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4134 2.2410 0.2469 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6541 4.1771 1.0143 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4111 3.7760 -0.1498 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7966 5.6998 -0.8762 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8982 4.3306 -1.9808 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8193 2.9731 -1.9850 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.1349 3.3544 -0.8761 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7621 2.7150 1.0230 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8259 1.3952 -0.1142 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2 1 2 0 0 0 0 + 3 4 1 0 0 0 0 + 3 2 1 0 0 0 0 + 4 22 1 0 0 0 0 + 5 4 2 0 0 0 0 + 5 23 1 0 0 0 0 + 6 5 1 0 0 0 0 + 7 12 1 0 0 0 0 + 7 6 2 0 0 0 0 + 8 9 2 0 0 0 0 + 8 7 1 0 0 0 0 + 8 24 1 0 0 0 0 + 9 10 1 0 0 0 0 + 9 25 1 0 0 0 0 + 10 11 2 0 0 0 0 + 10 26 1 0 0 0 0 + 11 6 1 0 0 0 0 + 11 27 1 0 0 0 0 + 12 3 2 0 0 0 0 + 13 12 1 0 0 0 0 + 13 14 1 0 0 0 0 + 14 15 2 0 0 0 0 + 15 2 1 0 0 0 0 + 15 28 1 0 0 0 0 + 16 14 1 0 0 0 0 + 16 17 1 0 0 0 0 + 17 29 1 0 0 0 0 + 17 30 1 0 0 0 0 + 18 17 1 0 0 0 0 + 18 31 1 0 0 0 0 + 18 32 1 0 0 0 0 + 19 18 1 0 0 0 0 + 20 21 1 0 0 0 0 + 20 19 1 0 0 0 0 + 20 33 1 0 0 0 0 + 20 34 1 0 0 0 0 + 21 16 1 0 0 0 0 + 21 35 1 0 0 0 0 + 21 36 1 0 0 0 0 +M END +$$$$ += + OpenBabel08312206383D + + 36 39 0 0 0 0 0 0 0 0999 V2000 + 0.8670 0.1340 0.2110 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0900 0.0960 0.1470 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8350 -1.1640 0.0710 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1560 -2.3820 0.0960 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8790 -3.5720 0.0630 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2820 -3.5580 0.0210 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9740 -2.3210 -0.0130 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3850 -2.3470 -0.0400 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0890 -3.5530 -0.0300 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3990 -4.7590 -0.0020 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0040 -4.7620 0.0200 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2250 -1.1210 -0.0060 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9090 0.0730 -0.0870 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2180 1.2770 0.0180 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8840 1.3280 0.1470 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0010 2.4230 -0.0690 N 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4112 2.4892 0.3602 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6700 3.8137 1.0919 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3120 4.9442 0.2785 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9231 4.8740 -0.0905 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6129 3.5912 -0.8813 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1251 -2.4014 0.1387 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3777 -4.4740 0.0695 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9068 -1.4570 -0.0677 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.1209 -3.5487 -0.0434 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9178 -5.6511 0.0025 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4965 -5.6605 0.0357 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4134 2.2410 0.2469 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0471 2.4273 -0.4981 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6180 1.6738 1.0215 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.7095 3.8777 1.3378 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0675 3.8321 1.9759 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3265 4.8875 0.7976 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6988 5.7144 -0.7135 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1661 3.5914 -1.7972 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5672 3.5465 -1.1037 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2 1 2 0 0 0 0 + 3 4 1 0 0 0 0 + 3 2 1 0 0 0 0 + 4 22 1 0 0 0 0 + 5 4 2 0 0 0 0 + 5 23 1 0 0 0 0 + 6 5 1 0 0 0 0 + 7 12 1 0 0 0 0 + 7 6 2 0 0 0 0 + 8 9 2 0 0 0 0 + 8 7 1 0 0 0 0 + 8 24 1 0 0 0 0 + 9 10 1 0 0 0 0 + 9 25 1 0 0 0 0 + 10 11 2 0 0 0 0 + 10 26 1 0 0 0 0 + 11 6 1 0 0 0 0 + 11 27 1 0 0 0 0 + 12 3 2 0 0 0 0 + 13 12 1 0 0 0 0 + 13 14 1 0 0 0 0 + 14 15 2 0 0 0 0 + 15 2 1 0 0 0 0 + 15 28 1 0 0 0 0 + 16 14 1 0 0 0 0 + 16 17 1 0 0 0 0 + 17 29 1 0 0 0 0 + 17 30 1 0 0 0 0 + 18 17 1 0 0 0 0 + 18 31 1 0 0 0 0 + 18 32 1 0 0 0 0 + 19 18 1 0 0 0 0 + 20 21 1 0 0 0 0 + 20 19 1 0 0 0 0 + 20 33 1 0 0 0 0 + 20 34 1 0 0 0 0 + 21 16 1 0 0 0 0 + 21 35 1 0 0 0 0 + 21 36 1 0 0 0 0 +M END +$$$$ += + OpenBabel08312206383D + + 36 39 0 0 0 0 0 0 0 0999 V2000 + 0.8670 0.1340 0.2110 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0900 0.0960 0.1470 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8350 -1.1640 0.0710 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1560 -2.3820 0.0960 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8790 -3.5720 0.0630 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2820 -3.5580 0.0210 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9740 -2.3210 -0.0130 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3850 -2.3470 -0.0400 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0890 -3.5530 -0.0300 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3990 -4.7590 -0.0020 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0040 -4.7620 0.0200 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2250 -1.1210 -0.0060 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9090 0.0730 -0.0870 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2180 1.2770 0.0180 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8840 1.3280 0.1470 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0010 2.4230 -0.0690 N 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4642 2.4060 -0.2591 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1162 3.4739 0.6304 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.5660 4.7783 0.3779 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1461 4.7748 0.6105 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4273 3.7622 -0.2979 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1251 -2.4014 0.1387 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3777 -4.4740 0.0695 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9068 -1.4570 -0.0677 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.1209 -3.5487 -0.0434 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9178 -5.6511 0.0025 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4965 -5.6605 0.0357 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4134 2.2410 0.2469 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6916 2.6105 -1.2844 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8442 1.4424 0.0092 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.1676 3.4959 0.4331 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9255 3.2213 1.6526 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9620 4.5167 1.6325 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7678 5.7510 0.3896 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5619 4.0402 -1.3224 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3814 3.7518 -0.0724 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2 1 2 0 0 0 0 + 3 4 1 0 0 0 0 + 3 2 1 0 0 0 0 + 4 22 1 0 0 0 0 + 5 4 2 0 0 0 0 + 5 23 1 0 0 0 0 + 6 5 1 0 0 0 0 + 7 12 1 0 0 0 0 + 7 6 2 0 0 0 0 + 8 9 2 0 0 0 0 + 8 7 1 0 0 0 0 + 8 24 1 0 0 0 0 + 9 10 1 0 0 0 0 + 9 25 1 0 0 0 0 + 10 11 2 0 0 0 0 + 10 26 1 0 0 0 0 + 11 6 1 0 0 0 0 + 11 27 1 0 0 0 0 + 12 3 2 0 0 0 0 + 13 12 1 0 0 0 0 + 13 14 1 0 0 0 0 + 14 15 2 0 0 0 0 + 15 2 1 0 0 0 0 + 15 28 1 0 0 0 0 + 16 14 1 0 0 0 0 + 16 17 1 0 0 0 0 + 17 29 1 0 0 0 0 + 17 30 1 0 0 0 0 + 18 17 1 0 0 0 0 + 18 31 1 0 0 0 0 + 18 32 1 0 0 0 0 + 19 18 1 0 0 0 0 + 20 21 1 0 0 0 0 + 20 19 1 0 0 0 0 + 20 33 1 0 0 0 0 + 20 34 1 0 0 0 0 + 21 16 1 0 0 0 0 + 21 35 1 0 0 0 0 + 21 36 1 0 0 0 0 +M END +$$$$ += + OpenBabel08312206383D + + 36 39 0 0 0 0 0 0 0 0999 V2000 + 0.8670 0.1340 0.2110 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0900 0.0960 0.1470 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8350 -1.1640 0.0710 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1560 -2.3820 0.0960 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8790 -3.5720 0.0630 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2820 -3.5580 0.0210 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9740 -2.3210 -0.0130 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3850 -2.3470 -0.0400 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0890 -3.5530 -0.0300 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3990 -4.7590 -0.0020 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0040 -4.7620 0.0200 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2250 -1.1210 -0.0060 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9090 0.0730 -0.0870 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2180 1.2770 0.0180 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8840 1.3280 0.1470 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0010 2.4230 -0.0690 N 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2552 2.5045 -0.8421 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3053 3.2932 -0.0472 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8221 4.5984 0.3146 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6226 4.4865 1.1012 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5092 3.7542 0.3324 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1251 -2.4014 0.1387 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3777 -4.4740 0.0695 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9068 -1.4570 -0.0677 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.1209 -3.5487 -0.0434 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9178 -5.6511 0.0025 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4965 -5.6605 0.0357 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4134 2.2410 0.2469 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0678 2.9997 -1.7719 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6210 1.5162 -1.0274 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.1852 3.4020 -0.6462 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.5204 2.7540 0.8517 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8432 3.9422 1.9956 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2786 5.4734 1.3303 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2443 4.3167 -0.5385 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6467 3.6486 0.9568 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2 1 2 0 0 0 0 + 3 4 1 0 0 0 0 + 3 2 1 0 0 0 0 + 4 22 1 0 0 0 0 + 5 4 2 0 0 0 0 + 5 23 1 0 0 0 0 + 6 5 1 0 0 0 0 + 7 12 1 0 0 0 0 + 7 6 2 0 0 0 0 + 8 9 2 0 0 0 0 + 8 7 1 0 0 0 0 + 8 24 1 0 0 0 0 + 9 10 1 0 0 0 0 + 9 25 1 0 0 0 0 + 10 11 2 0 0 0 0 + 10 26 1 0 0 0 0 + 11 6 1 0 0 0 0 + 11 27 1 0 0 0 0 + 12 3 2 0 0 0 0 + 13 12 1 0 0 0 0 + 13 14 1 0 0 0 0 + 14 15 2 0 0 0 0 + 15 2 1 0 0 0 0 + 15 28 1 0 0 0 0 + 16 14 1 0 0 0 0 + 16 17 1 0 0 0 0 + 17 29 1 0 0 0 0 + 17 30 1 0 0 0 0 + 18 17 1 0 0 0 0 + 18 31 1 0 0 0 0 + 18 32 1 0 0 0 0 + 19 18 1 0 0 0 0 + 20 21 1 0 0 0 0 + 20 19 1 0 0 0 0 + 20 33 1 0 0 0 0 + 20 34 1 0 0 0 0 + 21 16 1 0 0 0 0 + 21 35 1 0 0 0 0 + 21 36 1 0 0 0 0 +M END +$$$$ diff --git a/tests/structure/data/molecules/nu7026_conformers.xyz b/tests/structure/data/molecules/nu7026_conformers.xyz new file mode 100644 index 000000000..6afdc26cc --- /dev/null +++ b/tests/structure/data/molecules/nu7026_conformers.xyz @@ -0,0 +1,228 @@ +36 += +O 0.86700 0.13400 0.21100 +C 2.09000 0.09600 0.14700 +C 2.83500 -1.16400 0.07100 +C 2.15600 -2.38200 0.09600 +C 2.87900 -3.57200 0.06300 +C 4.28200 -3.55800 0.02100 +C 4.97400 -2.32100 -0.01300 +C 6.38500 -2.34700 -0.04000 +C 7.08900 -3.55300 -0.03000 +C 6.39900 -4.75900 -0.00200 +C 5.00400 -4.76200 0.02000 +C 4.22500 -1.12100 -0.00600 +O 4.90900 0.07300 -0.08700 +C 4.21800 1.27700 0.01800 +C 2.88400 1.32800 0.14700 +N 5.00100 2.42300 -0.06900 +C 4.52060 3.70690 -0.61490 +C 5.61180 4.34080 -1.48900 +O 6.84180 4.50330 -0.76190 +C 7.30700 3.23100 -0.27710 +C 6.27680 2.57100 0.65580 +H 1.12510 -2.40140 0.13870 +H 2.37770 -4.47400 0.06950 +H 6.90680 -1.45700 -0.06770 +H 8.12090 -3.54870 -0.04340 +H 6.91780 -5.65110 0.00250 +H 4.49650 -5.66050 0.03570 +H 2.41340 2.24100 0.24690 +H 4.28210 4.36880 0.19140 +H 3.64780 3.53380 -1.20920 +H 5.27600 5.30040 -1.82280 +H 5.79600 3.69150 -2.31920 +H 7.48440 2.58500 -1.11140 +H 8.20720 3.39260 0.27830 +H 6.12980 3.18470 1.51990 +H 6.63150 1.61000 0.96500 +36 += +O 0.86700 0.13400 0.21100 +C 2.09000 0.09600 0.14700 +C 2.83500 -1.16400 0.07100 +C 2.15600 -2.38200 0.09600 +C 2.87900 -3.57200 0.06300 +C 4.28200 -3.55800 0.02100 +C 4.97400 -2.32100 -0.01300 +C 6.38500 -2.34700 -0.04000 +C 7.08900 -3.55300 -0.03000 +C 6.39900 -4.75900 -0.00200 +C 5.00400 -4.76200 0.02000 +C 4.22500 -1.12100 -0.00600 +O 4.90900 0.07300 -0.08700 +C 4.21800 1.27700 0.01800 +C 2.88400 1.32800 0.14700 +N 5.00100 2.42300 -0.06900 +C 4.68000 3.69130 0.61340 +C 4.96280 4.87260 -0.32540 +O 6.32060 4.85650 -0.79870 +C 6.59240 3.62690 -1.49450 +C 6.38280 2.40440 -0.58400 +H 1.12510 -2.40140 0.13870 +H 2.37770 -4.47400 0.06950 +H 6.90680 -1.45700 -0.06770 +H 8.12090 -3.54870 -0.04340 +H 6.91780 -5.65110 0.00250 +H 4.49650 -5.66050 0.03570 +H 2.41340 2.24100 0.24690 +H 5.28250 3.78400 1.49270 +H 3.64470 3.69490 0.88390 +H 4.79000 5.78630 0.20390 +H 4.31180 4.79280 -1.17070 +H 5.93490 3.55070 -2.33530 +H 7.61480 3.63880 -1.80970 +H 7.07150 2.44370 0.23400 +H 6.55020 1.50560 -1.13990 +36 += +O 0.86700 0.13400 0.21100 +C 2.09000 0.09600 0.14700 +C 2.83500 -1.16400 0.07100 +C 2.15600 -2.38200 0.09600 +C 2.87900 -3.57200 0.06300 +C 4.28200 -3.55800 0.02100 +C 4.97400 -2.32100 -0.01300 +C 6.38500 -2.34700 -0.04000 +C 7.08900 -3.55300 -0.03000 +C 6.39900 -4.75900 -0.00200 +C 5.00400 -4.76200 0.02000 +C 4.22500 -1.12100 -0.00600 +O 4.90900 0.07300 -0.08700 +C 4.21800 1.27700 0.01800 +C 2.88400 1.32800 0.14700 +N 5.00100 2.42300 -0.06900 +C 4.46510 3.79400 0.03320 +C 5.14490 4.69650 -1.00610 +O 6.57600 4.67700 -0.86590 +C 7.07360 3.33480 -1.01070 +C 6.47100 2.39190 0.04530 +H 1.12510 -2.40140 0.13870 +H 2.37770 -4.47400 0.06950 +H 6.90680 -1.45700 -0.06770 +H 8.12090 -3.54870 -0.04340 +H 6.91780 -5.65110 0.00250 +H 4.49650 -5.66050 0.03570 +H 2.41340 2.24100 0.24690 +H 4.65410 4.17710 1.01430 +H 3.41110 3.77600 -0.14980 +H 4.79660 5.69980 -0.87620 +H 4.89820 4.33060 -1.98080 +H 6.81930 2.97310 -1.98500 +H 8.13490 3.35440 -0.87610 +H 6.76210 2.71500 1.02300 +H 6.82590 1.39520 -0.11420 +36 += +O 0.86700 0.13400 0.21100 +C 2.09000 0.09600 0.14700 +C 2.83500 -1.16400 0.07100 +C 2.15600 -2.38200 0.09600 +C 2.87900 -3.57200 0.06300 +C 4.28200 -3.55800 0.02100 +C 4.97400 -2.32100 -0.01300 +C 6.38500 -2.34700 -0.04000 +C 7.08900 -3.55300 -0.03000 +C 6.39900 -4.75900 -0.00200 +C 5.00400 -4.76200 0.02000 +C 4.22500 -1.12100 -0.00600 +O 4.90900 0.07300 -0.08700 +C 4.21800 1.27700 0.01800 +C 2.88400 1.32800 0.14700 +N 5.00100 2.42300 -0.06900 +C 6.41120 2.48920 0.36020 +C 6.67000 3.81370 1.09190 +O 6.31200 4.94420 0.27850 +C 4.92310 4.87400 -0.09050 +C 4.61290 3.59120 -0.88130 +H 1.12510 -2.40140 0.13870 +H 2.37770 -4.47400 0.06950 +H 6.90680 -1.45700 -0.06770 +H 8.12090 -3.54870 -0.04340 +H 6.91780 -5.65110 0.00250 +H 4.49650 -5.66050 0.03570 +H 2.41340 2.24100 0.24690 +H 7.04710 2.42730 -0.49810 +H 6.61800 1.67380 1.02150 +H 7.70950 3.87770 1.33780 +H 6.06750 3.83210 1.97590 +H 4.32650 4.88750 0.79760 +H 4.69880 5.71440 -0.71350 +H 5.16610 3.59140 -1.79720 +H 3.56720 3.54650 -1.10370 +36 += +O 0.86700 0.13400 0.21100 +C 2.09000 0.09600 0.14700 +C 2.83500 -1.16400 0.07100 +C 2.15600 -2.38200 0.09600 +C 2.87900 -3.57200 0.06300 +C 4.28200 -3.55800 0.02100 +C 4.97400 -2.32100 -0.01300 +C 6.38500 -2.34700 -0.04000 +C 7.08900 -3.55300 -0.03000 +C 6.39900 -4.75900 -0.00200 +C 5.00400 -4.76200 0.02000 +C 4.22500 -1.12100 -0.00600 +O 4.90900 0.07300 -0.08700 +C 4.21800 1.27700 0.01800 +C 2.88400 1.32800 0.14700 +N 5.00100 2.42300 -0.06900 +C 6.46420 2.40600 -0.25910 +C 7.11620 3.47390 0.63040 +O 6.56600 4.77830 0.37790 +C 5.14610 4.77480 0.61050 +C 4.42730 3.76220 -0.29790 +H 1.12510 -2.40140 0.13870 +H 2.37770 -4.47400 0.06950 +H 6.90680 -1.45700 -0.06770 +H 8.12090 -3.54870 -0.04340 +H 6.91780 -5.65110 0.00250 +H 4.49650 -5.66050 0.03570 +H 2.41340 2.24100 0.24690 +H 6.69160 2.61050 -1.28440 +H 6.84420 1.44240 0.00920 +H 8.16760 3.49590 0.43310 +H 6.92550 3.22130 1.65260 +H 4.96200 4.51670 1.63250 +H 4.76780 5.75100 0.38960 +H 4.56190 4.04020 -1.32240 +H 3.38140 3.75180 -0.07240 +36 += +O 0.86700 0.13400 0.21100 +C 2.09000 0.09600 0.14700 +C 2.83500 -1.16400 0.07100 +C 2.15600 -2.38200 0.09600 +C 2.87900 -3.57200 0.06300 +C 4.28200 -3.55800 0.02100 +C 4.97400 -2.32100 -0.01300 +C 6.38500 -2.34700 -0.04000 +C 7.08900 -3.55300 -0.03000 +C 6.39900 -4.75900 -0.00200 +C 5.00400 -4.76200 0.02000 +C 4.22500 -1.12100 -0.00600 +O 4.90900 0.07300 -0.08700 +C 4.21800 1.27700 0.01800 +C 2.88400 1.32800 0.14700 +N 5.00100 2.42300 -0.06900 +C 6.25520 2.50450 -0.84210 +C 7.30530 3.29320 -0.04720 +O 6.82210 4.59840 0.31460 +C 5.62260 4.48650 1.10120 +C 4.50920 3.75420 0.33240 +H 1.12510 -2.40140 0.13870 +H 2.37770 -4.47400 0.06950 +H 6.90680 -1.45700 -0.06770 +H 8.12090 -3.54870 -0.04340 +H 6.91780 -5.65110 0.00250 +H 4.49650 -5.66050 0.03570 +H 2.41340 2.24100 0.24690 +H 6.06780 2.99970 -1.77190 +H 6.62100 1.51620 -1.02740 +H 8.18520 3.40200 -0.64620 +H 7.52040 2.75400 0.85170 +H 5.84320 3.94220 1.99560 +H 5.27860 5.47340 1.33030 +H 4.24430 4.31670 -0.53850 +H 3.64670 3.64860 0.95680 diff --git a/tests/structure/data/molecules/paulbourkeDOTnet.xyz b/tests/structure/data/molecules/paulbourkeDOTnet.xyz deleted file mode 100644 index 1e83ee9b3..000000000 --- a/tests/structure/data/molecules/paulbourkeDOTnet.xyz +++ /dev/null @@ -1,49 +0,0 @@ -47 -xyz File randomly downloaded from http://paulbourke.net/dataformats/xyz/ -H -1.14937 -3.04328 -3.67266 -C -0.34354 -2.64179 -3.04915 -C 1.70961 -1.65418 -1.47979 -C -0.60766 -1.56214 -2.20086 -C 0.92269 -3.21090 -3.10934 -C 1.96759 -2.72261 -2.32098 -C 0.42293 -1.07194 -1.42089 -H -1.60973 -1.12145 -2.15064 -H 1.10566 -4.05612 -3.78129 -H 2.96477 -3.17298 -2.36242 -H 1.83912 1.62859 1.58965 -C 2.58144 -0.95071 -0.54135 -C 3.75749 0.63359 1.39456 -C 1.83367 0.06956 0.09322 -C 3.90949 -1.16740 -0.21924 -C 4.49358 -0.35755 0.75785 -C 2.41546 0.85640 1.06981 -H 4.22900 1.24681 2.16992 -H 4.48209 -1.95974 -0.71231 -H 5.54258 -0.51492 1.03005 -C 0.41263 0.08890 -0.44036 -C -0.00556 1.40901 -1.16296 -C -0.63464 -0.05891 0.64344 -C -1.47378 0.99799 0.68064 -C -0.68372 -1.24894 1.52606 -C -2.59805 1.24208 1.62903 -N -1.23204 3.29961 -0.01051 -H -0.42261 1.15524 -2.17274 -N -1.18662 1.95036 -0.37375 -C 1.08189 2.40346 -1.37512 -C -0.30043 4.12637 -0.38410 -C 0.91564 3.69413 -1.05765 -H 2.00908 2.02137 -1.81810 -H -0.45447 5.18029 -0.12432 -H 1.68550 4.44722 -1.25358 -O 0.15946 -1.63921 2.30422 -O -1.85645 -1.94582 1.38988 -O -2.50683 1.63964 2.76815 -O -3.90254 1.00262 1.31638 -C -2.05174 -3.09560 2.18550 -C -4.22748 0.53549 0.02760 -H -3.61380 -0.32008 -0.27896 -H -4.14453 1.33657 -0.71435 -H -5.27210 0.23153 0.13488 -H -1.99335 -2.87058 3.25594 -H -1.33502 -3.88407 1.93295 -H -3.06617 -3.39783 1.91314 diff --git a/tests/structure/data/molecules/zinc_33.mol b/tests/structure/data/molecules/zinc_33.mol new file mode 100644 index 000000000..afce4ff83 --- /dev/null +++ b/tests/structure/data/molecules/zinc_33.mol @@ -0,0 +1,120 @@ + + OpenBabel08312206033D + + 55 59 0 0 1 0 0 0 0 0999 V2000 + 4.7360 -4.4353 4.3348 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0567 -2.9404 4.4026 C 0 0 2 0 0 0 0 0 0 0 0 0 + 3.9199 -2.2176 4.8385 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0479 -1.8957 3.8323 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.8006 -1.4359 4.2690 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8244 -1.0848 3.3441 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1046 -1.1837 1.9853 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3596 -1.6274 1.5470 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3534 -1.9957 2.4602 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6663 -2.3996 2.0595 N 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0739 -2.5301 0.6608 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4070 -3.6941 -0.1078 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4081 -3.4480 -0.7958 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8865 -4.9979 -0.0020 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2908 -6.0172 -0.8813 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0184 -7.3270 -0.1490 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2268 -7.8170 0.6416 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8081 -6.7000 1.5094 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1196 -5.4213 0.7111 C 0 0 1 0 0 0 0 0 0 0 0 0 + 7.2484 -5.6016 -0.2736 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.4095 -5.0613 -1.4554 N 0 0 0 0 0 0 0 0 0 0 0 0 + 8.5089 -5.7161 -1.9552 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.9404 -5.5269 -3.3245 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.2940 -4.5981 -4.1480 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.6627 -4.4728 -5.4846 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.6789 -5.2831 -5.9600 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.3417 -6.1801 -5.1975 N 0 0 0 0 0 0 0 0 0 0 0 0 + 9.9578 -6.2813 -3.8981 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.0596 -6.5818 -1.0825 N 0 0 0 0 0 0 0 0 0 0 0 0 + 8.2353 -6.4955 0.0394 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6330 -2.5449 3.0472 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8447 -2.5319 2.8347 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3871 -4.8127 5.2987 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6198 -5.0030 4.0266 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9411 -4.6416 3.6072 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8384 -2.7785 5.1538 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.5931 -1.3576 5.3334 H 0 0 0 0 0 0 0 0 0 0 0 0 + -0.1469 -0.7319 3.6812 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.3481 -0.9038 1.2546 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5258 -1.6464 0.4749 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1589 -2.6500 0.5785 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8513 -1.5910 0.1413 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9807 -6.1895 -1.7161 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3558 -5.6644 -1.3280 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7124 -8.0956 -0.8683 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1769 -7.1812 0.5387 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9903 -8.2015 -0.0442 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9258 -8.6561 1.2800 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6974 -7.0629 2.0367 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0635 -6.4609 2.2775 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4169 -4.6457 1.4177 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.4901 -3.9796 -3.7552 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.1602 -3.7666 -6.1359 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.9901 -5.2347 -6.9996 H 0 0 0 0 0 0 0 0 0 0 0 0 + 10.5097 -7.0243 -3.3271 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 33 1 0 0 0 0 + 1 34 1 0 0 0 0 + 1 35 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 31 1 0 0 0 0 + 2 1 1 0 0 0 0 + 2 36 1 1 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 9 2 0 0 0 0 + 5 6 2 0 0 0 0 + 5 37 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 38 1 0 0 0 0 + 7 8 2 0 0 0 0 + 7 39 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 40 1 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 1 0 0 0 0 + 10 31 1 0 0 0 0 + 11 12 1 0 0 0 0 + 11 41 1 0 0 0 0 + 11 42 1 0 0 0 0 + 12 13 2 0 0 0 0 + 12 14 1 0 0 0 0 + 14 15 1 0 0 0 0 + 14 19 1 0 0 0 0 + 15 16 1 0 0 0 0 + 15 43 1 0 0 0 0 + 15 44 1 0 0 0 0 + 16 17 1 0 0 0 0 + 16 45 1 0 0 0 0 + 16 46 1 0 0 0 0 + 17 18 1 0 0 0 0 + 17 47 1 0 0 0 0 + 17 48 1 0 0 0 0 + 18 19 1 0 0 0 0 + 18 49 1 0 0 0 0 + 18 50 1 0 0 0 0 + 19 20 1 0 0 0 0 + 19 51 1 1 0 0 0 + 20 21 2 0 0 0 0 + 20 30 1 0 0 0 0 + 21 22 1 0 0 0 0 + 22 23 1 0 0 0 0 + 22 29 2 0 0 0 0 + 23 24 1 0 0 0 0 + 23 28 2 0 0 0 0 + 24 25 2 0 0 0 0 + 24 52 1 0 0 0 0 + 25 26 1 0 0 0 0 + 25 53 1 0 0 0 0 + 26 27 2 0 0 0 0 + 26 54 1 0 0 0 0 + 27 28 1 0 0 0 0 + 28 55 1 0 0 0 0 + 29 30 1 0 0 0 0 + 31 32 2 0 0 0 0 +M END +$$$$ diff --git a/tests/structure/data/molecules/zinc_33_conformers.mol2 b/tests/structure/data/molecules/zinc_33_conformers.mol2 new file mode 100644 index 000000000..0f618e068 --- /dev/null +++ b/tests/structure/data/molecules/zinc_33_conformers.mol2 @@ -0,0 +1,3660 @@ +@MOLECULE +***** + 55 59 0 0 0 +SMALL +GASTEIGER + +@ATOM + 1 C 8.8436 -3.9435 1.1456 C.3 1 UNL1 -0.0190 + 2 C 8.3823 -3.0085 2.2659 C.3 1 UNL1 0.1732 + 3 O 8.1757 -3.7426 3.4589 O.3 1 UNL1 -0.4780 + 4 C 6.9361 -4.3186 3.5482 C.ar 1 UNL1 0.1429 + 5 C 6.8077 -5.2665 4.5694 C.ar 1 UNL1 -0.0180 + 6 C 5.6003 -5.9287 4.7579 C.ar 1 UNL1 -0.0582 + 7 C 4.5222 -5.6306 3.9312 C.ar 1 UNL1 -0.0598 + 8 C 4.6446 -4.6686 2.9195 C.ar 1 UNL1 -0.0367 + 9 C 5.8533 -3.9974 2.7053 C.ar 1 UNL1 0.0787 + 10 N 6.0077 -2.9686 1.7229 N.am 1 UNL1 -0.2563 + 11 C 4.9406 -2.5673 0.8065 C.3 1 UNL1 0.0965 + 12 C 4.4070 -3.6941 -0.1078 C.2 1 UNL1 0.2340 + 13 O 3.5119 -3.4197 -0.9172 O.2 1 UNL1 -0.2738 + 14 N 4.8865 -4.9979 -0.0020 N.am 1 UNL1 -0.2884 + 15 C 4.2908 -6.0172 -0.8813 C.3 1 UNL1 0.0155 + 16 C 4.0184 -7.3270 -0.1490 C.3 1 UNL1 -0.0371 + 17 C 5.2268 -7.8170 0.6416 C.3 1 UNL1 -0.0495 + 18 C 5.8081 -6.7000 1.5094 C.3 1 UNL1 -0.0255 + 19 C 6.1196 -5.4213 0.7111 C.3 1 UNL1 0.1048 + 20 C 7.2484 -5.6016 -0.2736 C.ar 1 UNL1 0.2482 + 21 N 7.9498 -6.6746 -0.5406 N.ar 1 UNL1 -0.1897 + 22 C 8.9357 -6.2080 -1.3759 C.ar 1 UNL1 0.2036 + 23 C 10.0355 -7.0544 -1.7894 C.ar 1 UNL1 0.0405 + 24 C 10.1167 -8.3779 -1.3419 C.ar 1 UNL1 -0.0481 + 25 C 11.2140 -9.1648 -1.6810 C.ar 1 UNL1 -0.0429 + 26 C 12.2027 -8.6013 -2.4685 C.ar 1 UNL1 0.0276 + 27 N 12.1575 -7.3349 -2.9371 N.ar 1 UNL1 -0.2626 + 28 C 11.0757 -6.5910 -2.5873 C.ar 1 UNL1 0.0383 + 29 N 8.8072 -4.9020 -1.6794 N.ar 1 UNL1 -0.0560 + 30 O 7.6795 -4.5016 -0.9628 O.2 1 UNL1 -0.3357 + 31 C 7.1844 -2.2294 1.7332 C.2 1 UNL1 0.2608 + 32 O 7.3089 -1.1221 1.2117 O.2 1 UNL1 -0.2712 + 33 H 9.7502 -4.4848 1.4255 H 1 UNL1 0.0270 + 34 H 9.0334 -3.3774 0.2281 H 1 UNL1 0.0270 + 35 H 8.0818 -4.6989 0.9155 H 1 UNL1 0.0270 + 36 H 9.1792 -2.2859 2.4763 H 1 UNL1 0.0829 + 37 H 7.6550 -5.4889 5.2133 H 1 UNL1 0.0655 + 38 H 5.4999 -6.6689 5.5475 H 1 UNL1 0.0619 + 39 H 3.5712 -6.1394 4.0769 H 1 UNL1 0.0618 + 40 H 3.7558 -4.4570 2.3342 H 1 UNL1 0.0637 + 41 H 5.2639 -1.7395 0.1673 H 1 UNL1 0.0564 + 42 H 4.1070 -2.1647 1.3934 H 1 UNL1 0.0564 + 43 H 4.9807 -6.1895 -1.7161 H 1 UNL1 0.0465 + 44 H 3.3558 -5.6644 -1.3280 H 1 UNL1 0.0465 + 45 H 3.7124 -8.0956 -0.8683 H 1 UNL1 0.0280 + 46 H 3.1769 -7.1812 0.5387 H 1 UNL1 0.0280 + 47 H 5.9903 -8.2015 -0.0442 H 1 UNL1 0.0266 + 48 H 4.9258 -8.6561 1.2800 H 1 UNL1 0.0266 + 49 H 6.6974 -7.0629 2.0367 H 1 UNL1 0.0288 + 50 H 5.0635 -6.4609 2.2775 H 1 UNL1 0.0288 + 51 H 6.4169 -4.6457 1.4177 H 1 UNL1 0.0599 + 52 H 9.3329 -8.7961 -0.7143 H 1 UNL1 0.0626 + 53 H 11.2949 -10.1870 -1.3290 H 1 UNL1 0.0633 + 54 H 13.0864 -9.1693 -2.7449 H 1 UNL1 0.0829 + 55 H 11.0888 -5.5754 -2.9760 H 1 UNL1 0.0837 +@BOND + 1 1 33 1 + 2 1 34 1 + 3 1 35 1 + 4 2 3 1 + 5 2 31 1 + 6 2 1 1 + 7 2 36 1 + 8 3 4 1 + 9 4 5 ar + 10 4 9 ar + 11 5 6 ar + 12 5 37 1 + 13 6 7 ar + 14 6 38 1 + 15 7 8 ar + 16 7 39 1 + 17 8 9 ar + 18 8 40 1 + 19 9 10 1 + 20 10 11 1 + 21 10 31 am + 22 11 12 1 + 23 11 41 1 + 24 11 42 1 + 25 12 13 2 + 26 12 14 am + 27 14 15 1 + 28 14 19 1 + 29 15 16 1 + 30 15 43 1 + 31 15 44 1 + 32 16 17 1 + 33 16 45 1 + 34 16 46 1 + 35 17 18 1 + 36 17 47 1 + 37 17 48 1 + 38 18 19 1 + 39 18 49 1 + 40 18 50 1 + 41 19 20 1 + 42 19 51 1 + 43 20 21 ar + 44 20 30 ar + 45 21 22 ar + 46 22 23 1 + 47 22 29 ar + 48 23 24 ar + 49 23 28 ar + 50 24 25 ar + 51 24 52 1 + 52 25 26 ar + 53 25 53 1 + 54 26 27 ar + 55 26 54 1 + 56 27 28 ar + 57 28 55 1 + 58 29 30 ar + 59 31 32 2 +@MOLECULE +***** + 55 59 0 0 0 +SMALL +GASTEIGER + +@ATOM + 1 C 3.1381 -1.3010 4.3264 C.3 1 UNL1 -0.0190 + 2 C 3.3428 -2.8129 4.2060 C.3 1 UNL1 0.1732 + 3 O 4.3871 -3.2329 5.0648 O.3 1 UNL1 -0.4780 + 4 C 5.6376 -3.1084 4.5196 C.ar 1 UNL1 0.1429 + 5 C 6.6871 -3.2488 5.4343 C.ar 1 UNL1 -0.0180 + 6 C 8.0045 -3.1349 5.0062 C.ar 1 UNL1 -0.0582 + 7 C 8.2668 -2.8931 3.6618 C.ar 1 UNL1 -0.0598 + 8 C 7.2167 -2.7698 2.7420 C.ar 1 UNL1 -0.0367 + 9 C 5.8831 -2.8707 3.1524 C.ar 1 UNL1 0.0787 + 10 N 4.7822 -2.8083 2.2405 N.am 1 UNL1 -0.2563 + 11 C 4.9406 -2.5673 0.8065 C.3 1 UNL1 0.0965 + 12 C 4.4070 -3.6941 -0.1078 C.2 1 UNL1 0.2340 + 13 O 3.5119 -3.4197 -0.9172 O.2 1 UNL1 -0.2738 + 14 N 4.8865 -4.9979 -0.0020 N.am 1 UNL1 -0.2884 + 15 C 4.2908 -6.0172 -0.8813 C.3 1 UNL1 0.0155 + 16 C 4.0184 -7.3270 -0.1490 C.3 1 UNL1 -0.0371 + 17 C 5.2268 -7.8170 0.6416 C.3 1 UNL1 -0.0495 + 18 C 5.8081 -6.7000 1.5094 C.3 1 UNL1 -0.0255 + 19 C 6.1196 -5.4213 0.7111 C.3 1 UNL1 0.1048 + 20 C 7.2484 -5.6016 -0.2736 C.ar 1 UNL1 0.2482 + 21 N 7.7931 -4.7233 -1.0776 N.ar 1 UNL1 -0.1897 + 22 C 8.6382 -5.4828 -1.8497 C.ar 1 UNL1 0.2036 + 23 C 9.3311 -4.9168 -2.9883 C.ar 1 UNL1 0.0405 + 24 C 9.1517 -3.5711 -3.3283 C.ar 1 UNL1 -0.0481 + 25 C 9.7606 -3.0502 -4.4667 C.ar 1 UNL1 -0.0429 + 26 C 10.5414 -3.8965 -5.2344 C.ar 1 UNL1 0.0276 + 27 N 10.7562 -5.1963 -4.9350 N.ar 1 UNL1 -0.2626 + 28 C 10.1469 -5.6764 -3.8195 C.ar 1 UNL1 0.0383 + 29 N 8.6748 -6.7796 -1.4874 N.ar 1 UNL1 -0.0560 + 30 O 7.7665 -6.8576 -0.4317 O.2 1 UNL1 -0.3357 + 31 C 3.5178 -3.1236 2.7233 C.2 1 UNL1 0.2608 + 32 O 2.5702 -3.4556 2.0123 O.2 1 UNL1 -0.2712 + 33 H 2.9290 -1.0075 5.3576 H 1 UNL1 0.0270 + 34 H 2.3121 -0.9742 3.6866 H 1 UNL1 0.0270 + 35 H 4.0343 -0.7496 4.0155 H 1 UNL1 0.0270 + 36 H 2.4335 -3.3226 4.5452 H 1 UNL1 0.0829 + 37 H 6.4717 -3.4426 6.4822 H 1 UNL1 0.0655 + 38 H 8.8212 -3.2389 5.7160 H 1 UNL1 0.0619 + 39 H 9.2958 -2.8098 3.3173 H 1 UNL1 0.0618 + 40 H 7.4905 -2.6184 1.7030 H 1 UNL1 0.0637 + 41 H 5.9914 -2.3960 0.5518 H 1 UNL1 0.0564 + 42 H 4.4295 -1.6325 0.5492 H 1 UNL1 0.0564 + 43 H 4.9807 -6.1895 -1.7161 H 1 UNL1 0.0465 + 44 H 3.3558 -5.6644 -1.3280 H 1 UNL1 0.0465 + 45 H 3.7124 -8.0956 -0.8683 H 1 UNL1 0.0280 + 46 H 3.1769 -7.1812 0.5387 H 1 UNL1 0.0280 + 47 H 5.9903 -8.2015 -0.0442 H 1 UNL1 0.0266 + 48 H 4.9258 -8.6561 1.2800 H 1 UNL1 0.0266 + 49 H 6.6974 -7.0629 2.0367 H 1 UNL1 0.0288 + 50 H 5.0635 -6.4609 2.2775 H 1 UNL1 0.0288 + 51 H 6.4169 -4.6457 1.4177 H 1 UNL1 0.0599 + 52 H 8.5242 -2.9274 -2.7159 H 1 UNL1 0.0626 + 53 H 9.6181 -2.0129 -4.7480 H 1 UNL1 0.0633 + 54 H 11.0226 -3.5413 -6.1412 H 1 UNL1 0.0829 + 55 H 10.3377 -6.7293 -3.6258 H 1 UNL1 0.0837 +@BOND + 1 1 33 1 + 2 1 34 1 + 3 1 35 1 + 4 2 3 1 + 5 2 31 1 + 6 2 1 1 + 7 2 36 1 + 8 3 4 1 + 9 4 5 ar + 10 4 9 ar + 11 5 6 ar + 12 5 37 1 + 13 6 7 ar + 14 6 38 1 + 15 7 8 ar + 16 7 39 1 + 17 8 9 ar + 18 8 40 1 + 19 9 10 1 + 20 10 11 1 + 21 10 31 am + 22 11 12 1 + 23 11 41 1 + 24 11 42 1 + 25 12 13 2 + 26 12 14 am + 27 14 15 1 + 28 14 19 1 + 29 15 16 1 + 30 15 43 1 + 31 15 44 1 + 32 16 17 1 + 33 16 45 1 + 34 16 46 1 + 35 17 18 1 + 36 17 47 1 + 37 17 48 1 + 38 18 19 1 + 39 18 49 1 + 40 18 50 1 + 41 19 20 1 + 42 19 51 1 + 43 20 21 ar + 44 20 30 ar + 45 21 22 ar + 46 22 23 1 + 47 22 29 ar + 48 23 24 ar + 49 23 28 ar + 50 24 25 ar + 51 24 52 1 + 52 25 26 ar + 53 25 53 1 + 54 26 27 ar + 55 26 54 1 + 56 27 28 ar + 57 28 55 1 + 58 29 30 ar + 59 31 32 2 +@MOLECULE +***** + 55 59 0 0 0 +SMALL +GASTEIGER + +@ATOM + 1 C 6.0210 -4.9489 4.0319 C.3 1 UNL1 -0.0190 + 2 C 5.7742 -3.4753 4.3633 C.3 1 UNL1 0.1732 + 3 O 4.5537 -3.3320 5.0666 O.3 1 UNL1 -0.4780 + 4 C 3.4533 -3.2434 4.2556 C.ar 1 UNL1 0.1429 + 5 C 2.2294 -3.3825 4.9194 C.ar 1 UNL1 -0.0180 + 6 C 1.0385 -3.3203 4.2056 C.ar 1 UNL1 -0.0582 + 7 C 1.0767 -3.1068 2.8317 C.ar 1 UNL1 -0.0598 + 8 C 2.3013 -2.9498 2.1688 C.ar 1 UNL1 -0.0367 + 9 C 3.5125 -3.0190 2.8656 C.ar 1 UNL1 0.0787 + 10 N 4.7822 -2.8083 2.2405 N.am 1 UNL1 -0.2563 + 11 C 4.9406 -2.5673 0.8065 C.3 1 UNL1 0.0965 + 12 C 4.4070 -3.6941 -0.1078 C.2 1 UNL1 0.2340 + 13 O 3.5119 -3.4197 -0.9172 O.2 1 UNL1 -0.2738 + 14 N 4.8865 -4.9979 -0.0020 N.am 1 UNL1 -0.2884 + 15 C 4.2908 -6.0172 -0.8813 C.3 1 UNL1 0.0155 + 16 C 4.0184 -7.3270 -0.1490 C.3 1 UNL1 -0.0371 + 17 C 5.2268 -7.8170 0.6416 C.3 1 UNL1 -0.0495 + 18 C 5.8081 -6.7000 1.5094 C.3 1 UNL1 -0.0255 + 19 C 6.1196 -5.4213 0.7111 C.3 1 UNL1 0.1048 + 20 C 7.2484 -5.6016 -0.2736 C.ar 1 UNL1 0.2482 + 21 N 8.5352 -5.4365 -0.0963 N.ar 1 UNL1 -0.1897 + 22 C 9.0485 -5.5683 -1.3637 C.ar 1 UNL1 0.2036 + 23 C 10.4434 -5.2983 -1.6434 C.ar 1 UNL1 0.0405 + 24 C 11.1482 -4.3581 -0.8832 C.ar 1 UNL1 -0.0481 + 25 C 12.4670 -4.0470 -1.2030 C.ar 1 UNL1 -0.0429 + 26 C 13.0477 -4.6950 -2.2792 C.ar 1 UNL1 0.0276 + 27 N 12.4115 -5.6212 -3.0293 N.ar 1 UNL1 -0.2626 + 28 C 11.1249 -5.9017 -2.6944 C.ar 1 UNL1 0.0383 + 29 N 8.1199 -5.8808 -2.2881 N.ar 1 UNL1 -0.0560 + 30 O 6.9279 -5.9197 -1.5647 O.2 1 UNL1 -0.3357 + 31 C 5.9003 -2.6965 3.0582 C.2 1 UNL1 0.2608 + 32 O 6.9592 -2.1743 2.7124 O.2 1 UNL1 -0.2712 + 33 H 6.0223 -5.5659 4.9334 H 1 UNL1 0.0270 + 34 H 6.9777 -5.0699 3.5137 H 1 UNL1 0.0270 + 35 H 5.2375 -5.3483 3.3757 H 1 UNL1 0.0270 + 36 H 6.5664 -3.1248 5.0349 H 1 UNL1 0.0829 + 37 H 2.2101 -3.5442 5.9944 H 1 UNL1 0.0655 + 38 H 0.0867 -3.4329 4.7185 H 1 UNL1 0.0619 + 39 H 0.1483 -3.0495 2.2666 H 1 UNL1 0.0618 + 40 H 2.2597 -2.7496 1.1031 H 1 UNL1 0.0637 + 41 H 5.9914 -2.3960 0.5518 H 1 UNL1 0.0564 + 42 H 4.4295 -1.6325 0.5492 H 1 UNL1 0.0564 + 43 H 4.9807 -6.1895 -1.7161 H 1 UNL1 0.0465 + 44 H 3.3558 -5.6644 -1.3280 H 1 UNL1 0.0465 + 45 H 3.7124 -8.0956 -0.8683 H 1 UNL1 0.0280 + 46 H 3.1769 -7.1812 0.5387 H 1 UNL1 0.0280 + 47 H 5.9903 -8.2015 -0.0442 H 1 UNL1 0.0266 + 48 H 4.9258 -8.6561 1.2800 H 1 UNL1 0.0266 + 49 H 6.6974 -7.0629 2.0367 H 1 UNL1 0.0288 + 50 H 5.0635 -6.4609 2.2775 H 1 UNL1 0.0288 + 51 H 6.4169 -4.6457 1.4177 H 1 UNL1 0.0599 + 52 H 10.6674 -3.8530 -0.0484 H 1 UNL1 0.0626 + 53 H 13.0189 -3.3105 -0.6301 H 1 UNL1 0.0633 + 54 H 14.0681 -4.4735 -2.5786 H 1 UNL1 0.0829 + 55 H 10.6497 -6.6425 -3.3332 H 1 UNL1 0.0837 +@BOND + 1 1 33 1 + 2 1 34 1 + 3 1 35 1 + 4 2 3 1 + 5 2 31 1 + 6 2 1 1 + 7 2 36 1 + 8 3 4 1 + 9 4 5 ar + 10 4 9 ar + 11 5 6 ar + 12 5 37 1 + 13 6 7 ar + 14 6 38 1 + 15 7 8 ar + 16 7 39 1 + 17 8 9 ar + 18 8 40 1 + 19 9 10 1 + 20 10 11 1 + 21 10 31 am + 22 11 12 1 + 23 11 41 1 + 24 11 42 1 + 25 12 13 2 + 26 12 14 am + 27 14 15 1 + 28 14 19 1 + 29 15 16 1 + 30 15 43 1 + 31 15 44 1 + 32 16 17 1 + 33 16 45 1 + 34 16 46 1 + 35 17 18 1 + 36 17 47 1 + 37 17 48 1 + 38 18 19 1 + 39 18 49 1 + 40 18 50 1 + 41 19 20 1 + 42 19 51 1 + 43 20 21 ar + 44 20 30 ar + 45 21 22 ar + 46 22 23 1 + 47 22 29 ar + 48 23 24 ar + 49 23 28 ar + 50 24 25 ar + 51 24 52 1 + 52 25 26 ar + 53 25 53 1 + 54 26 27 ar + 55 26 54 1 + 56 27 28 ar + 57 28 55 1 + 58 29 30 ar + 59 31 32 2 +@MOLECULE +***** + 55 59 0 0 0 +SMALL +GASTEIGER + +@ATOM + 1 C 4.1898 0.6137 -1.7547 C.3 1 UNL1 -0.0190 + 2 C 5.2621 0.8703 -0.6933 C.3 1 UNL1 0.1732 + 3 O 6.5457 0.8834 -1.2908 O.3 1 UNL1 -0.4780 + 4 C 7.1054 -0.3591 -1.4303 C.ar 1 UNL1 0.1429 + 5 C 8.2316 -0.3996 -2.2596 C.ar 1 UNL1 -0.0180 + 6 C 8.8855 -1.6044 -2.4885 C.ar 1 UNL1 -0.0582 + 7 C 8.4169 -2.7623 -1.8767 C.ar 1 UNL1 -0.0598 + 8 C 7.2996 -2.7196 -1.0319 C.ar 1 UNL1 -0.0367 + 9 C 6.6199 -1.5198 -0.7954 C.ar 1 UNL1 0.0787 + 10 N 5.5108 -1.4187 0.1029 N.am 1 UNL1 -0.2563 + 11 C 4.9406 -2.5673 0.8065 C.3 1 UNL1 0.0965 + 12 C 4.4070 -3.6941 -0.1078 C.2 1 UNL1 0.2340 + 13 O 3.5119 -3.4197 -0.9172 O.2 1 UNL1 -0.2738 + 14 N 4.8865 -4.9979 -0.0020 N.am 1 UNL1 -0.2884 + 15 C 4.2908 -6.0172 -0.8813 C.3 1 UNL1 0.0155 + 16 C 4.0184 -7.3270 -0.1490 C.3 1 UNL1 -0.0371 + 17 C 5.2268 -7.8170 0.6416 C.3 1 UNL1 -0.0495 + 18 C 5.8081 -6.7000 1.5094 C.3 1 UNL1 -0.0255 + 19 C 6.1196 -5.4213 0.7111 C.3 1 UNL1 0.1048 + 20 C 7.2484 -5.6016 -0.2736 C.ar 1 UNL1 0.2482 + 21 N 7.1985 -5.9525 -1.5341 N.ar 1 UNL1 -0.1897 + 22 C 8.5203 -6.1214 -1.8679 C.ar 1 UNL1 0.2036 + 23 C 8.9094 -6.6682 -3.1511 C.ar 1 UNL1 0.0405 + 24 C 8.0767 -7.5762 -3.8150 C.ar 1 UNL1 -0.0481 + 25 C 8.4881 -8.1564 -5.0118 C.ar 1 UNL1 -0.0429 + 26 C 9.7279 -7.8039 -5.5156 C.ar 1 UNL1 0.0276 + 27 N 10.5563 -6.9195 -4.9182 N.ar 1 UNL1 -0.2626 + 28 C 10.1284 -6.3720 -3.7507 C.ar 1 UNL1 0.0383 + 29 N 9.3690 -5.8120 -0.8687 N.ar 1 UNL1 -0.0560 + 30 O 8.5285 -5.4511 0.1843 O.2 1 UNL1 -0.3357 + 31 C 5.0426 -0.1491 0.4195 C.2 1 UNL1 0.2608 + 32 O 4.3645 0.1089 1.4130 O.2 1 UNL1 -0.2712 + 33 H 4.2339 1.3567 -2.5542 H 1 UNL1 0.0270 + 34 H 3.1925 0.6316 -1.3037 H 1 UNL1 0.0270 + 35 H 4.3208 -0.3680 -2.2269 H 1 UNL1 0.0270 + 36 H 5.1057 1.8667 -0.2640 H 1 UNL1 0.0829 + 37 H 8.5929 0.5120 -2.7294 H 1 UNL1 0.0655 + 38 H 9.7578 -1.6389 -3.1363 H 1 UNL1 0.0619 + 39 H 8.9277 -3.7085 -2.0450 H 1 UNL1 0.0618 + 40 H 7.0080 -3.6508 -0.5573 H 1 UNL1 0.0637 + 41 H 4.1259 -2.2563 1.4683 H 1 UNL1 0.0564 + 42 H 5.7042 -2.9853 1.4725 H 1 UNL1 0.0564 + 43 H 4.9807 -6.1895 -1.7161 H 1 UNL1 0.0465 + 44 H 3.3558 -5.6644 -1.3280 H 1 UNL1 0.0465 + 45 H 3.7124 -8.0956 -0.8683 H 1 UNL1 0.0280 + 46 H 3.1769 -7.1812 0.5387 H 1 UNL1 0.0280 + 47 H 5.9903 -8.2015 -0.0442 H 1 UNL1 0.0266 + 48 H 4.9258 -8.6561 1.2800 H 1 UNL1 0.0266 + 49 H 6.6974 -7.0629 2.0367 H 1 UNL1 0.0288 + 50 H 5.0635 -6.4609 2.2775 H 1 UNL1 0.0288 + 51 H 6.4169 -4.6457 1.4177 H 1 UNL1 0.0599 + 52 H 7.1109 -7.8468 -3.3942 H 1 UNL1 0.0626 + 53 H 7.8578 -8.8714 -5.5283 H 1 UNL1 0.0633 + 54 H 10.1004 -8.2428 -6.4368 H 1 UNL1 0.0829 + 55 H 10.8329 -5.6768 -3.3000 H 1 UNL1 0.0837 +@BOND + 1 1 33 1 + 2 1 34 1 + 3 1 35 1 + 4 2 3 1 + 5 2 31 1 + 6 2 1 1 + 7 2 36 1 + 8 3 4 1 + 9 4 5 ar + 10 4 9 ar + 11 5 6 ar + 12 5 37 1 + 13 6 7 ar + 14 6 38 1 + 15 7 8 ar + 16 7 39 1 + 17 8 9 ar + 18 8 40 1 + 19 9 10 1 + 20 10 11 1 + 21 10 31 am + 22 11 12 1 + 23 11 41 1 + 24 11 42 1 + 25 12 13 2 + 26 12 14 am + 27 14 15 1 + 28 14 19 1 + 29 15 16 1 + 30 15 43 1 + 31 15 44 1 + 32 16 17 1 + 33 16 45 1 + 34 16 46 1 + 35 17 18 1 + 36 17 47 1 + 37 17 48 1 + 38 18 19 1 + 39 18 49 1 + 40 18 50 1 + 41 19 20 1 + 42 19 51 1 + 43 20 21 ar + 44 20 30 ar + 45 21 22 ar + 46 22 23 1 + 47 22 29 ar + 48 23 24 ar + 49 23 28 ar + 50 24 25 ar + 51 24 52 1 + 52 25 26 ar + 53 25 53 1 + 54 26 27 ar + 55 26 54 1 + 56 27 28 ar + 57 28 55 1 + 58 29 30 ar + 59 31 32 2 +@MOLECULE +***** + 55 59 0 0 0 +SMALL +GASTEIGER + +@ATOM + 1 C 6.6330 -2.0259 4.5595 C.3 1 UNL1 -0.0190 + 2 C 6.7277 -3.4474 4.0005 C.3 1 UNL1 0.1732 + 3 O 8.0577 -3.7270 3.6032 O.3 1 UNL1 -0.4780 + 4 C 8.3590 -3.3025 2.3362 C.ar 1 UNL1 0.1429 + 5 C 9.7239 -3.3136 2.0286 C.ar 1 UNL1 -0.0180 + 6 C 10.1596 -2.8970 0.7763 C.ar 1 UNL1 -0.0582 + 7 C 9.2261 -2.4823 -0.1678 C.ar 1 UNL1 -0.0598 + 8 C 7.8575 -2.4875 0.1333 C.ar 1 UNL1 -0.0367 + 9 C 7.3974 -2.8931 1.3907 C.ar 1 UNL1 0.0787 + 10 N 6.0077 -2.9686 1.7229 N.am 1 UNL1 -0.2563 + 11 C 4.9406 -2.5673 0.8065 C.3 1 UNL1 0.0965 + 12 C 4.4070 -3.6941 -0.1078 C.2 1 UNL1 0.2340 + 13 O 3.5119 -3.4197 -0.9172 O.2 1 UNL1 -0.2738 + 14 N 4.8865 -4.9979 -0.0020 N.am 1 UNL1 -0.2884 + 15 C 4.2908 -6.0172 -0.8813 C.3 1 UNL1 0.0155 + 16 C 4.0184 -7.3270 -0.1490 C.3 1 UNL1 -0.0371 + 17 C 5.2268 -7.8170 0.6416 C.3 1 UNL1 -0.0495 + 18 C 5.8081 -6.7000 1.5094 C.3 1 UNL1 -0.0255 + 19 C 6.1196 -5.4213 0.7111 C.3 1 UNL1 0.1048 + 20 C 7.2484 -5.6016 -0.2736 C.ar 1 UNL1 0.2482 + 21 N 7.7931 -4.7233 -1.0776 N.ar 1 UNL1 -0.1897 + 22 C 8.6382 -5.4828 -1.8497 C.ar 1 UNL1 0.2036 + 23 C 9.3311 -4.9168 -2.9883 C.ar 1 UNL1 0.0405 + 24 C 9.1517 -3.5711 -3.3283 C.ar 1 UNL1 -0.0481 + 25 C 9.7606 -3.0502 -4.4667 C.ar 1 UNL1 -0.0429 + 26 C 10.5414 -3.8965 -5.2344 C.ar 1 UNL1 0.0276 + 27 N 10.7562 -5.1963 -4.9350 N.ar 1 UNL1 -0.2626 + 28 C 10.1469 -5.6764 -3.8195 C.ar 1 UNL1 0.0383 + 29 N 8.6748 -6.7796 -1.4874 N.ar 1 UNL1 -0.0560 + 30 O 7.7665 -6.8576 -0.4317 O.2 1 UNL1 -0.3357 + 31 C 5.6567 -3.5761 2.9225 C.2 1 UNL1 0.2608 + 32 O 4.5376 -4.0241 3.1681 O.2 1 UNL1 -0.2712 + 33 H 7.3223 -1.8785 5.3940 H 1 UNL1 0.0270 + 34 H 5.6131 -1.8137 4.8958 H 1 UNL1 0.0270 + 35 H 6.8919 -1.2786 3.7990 H 1 UNL1 0.0270 + 36 H 6.4819 -4.1594 4.7969 H 1 UNL1 0.0829 + 37 H 10.4453 -3.6442 2.7720 H 1 UNL1 0.0655 + 38 H 11.2199 -2.9003 0.5369 H 1 UNL1 0.0619 + 39 H 9.5585 -2.1614 -1.1533 H 1 UNL1 0.0618 + 40 H 7.1800 -2.1873 -0.6594 H 1 UNL1 0.0637 + 41 H 5.2639 -1.7395 0.1673 H 1 UNL1 0.0564 + 42 H 4.1070 -2.1647 1.3934 H 1 UNL1 0.0564 + 43 H 4.9807 -6.1895 -1.7161 H 1 UNL1 0.0465 + 44 H 3.3558 -5.6644 -1.3280 H 1 UNL1 0.0465 + 45 H 3.7124 -8.0956 -0.8683 H 1 UNL1 0.0280 + 46 H 3.1769 -7.1812 0.5387 H 1 UNL1 0.0280 + 47 H 5.9903 -8.2015 -0.0442 H 1 UNL1 0.0266 + 48 H 4.9258 -8.6561 1.2800 H 1 UNL1 0.0266 + 49 H 6.6974 -7.0629 2.0367 H 1 UNL1 0.0288 + 50 H 5.0635 -6.4609 2.2775 H 1 UNL1 0.0288 + 51 H 6.4169 -4.6457 1.4177 H 1 UNL1 0.0599 + 52 H 8.5242 -2.9274 -2.7159 H 1 UNL1 0.0626 + 53 H 9.6181 -2.0129 -4.7480 H 1 UNL1 0.0633 + 54 H 11.0226 -3.5413 -6.1412 H 1 UNL1 0.0829 + 55 H 10.3377 -6.7293 -3.6258 H 1 UNL1 0.0837 +@BOND + 1 1 33 1 + 2 1 34 1 + 3 1 35 1 + 4 2 3 1 + 5 2 31 1 + 6 2 1 1 + 7 2 36 1 + 8 3 4 1 + 9 4 5 ar + 10 4 9 ar + 11 5 6 ar + 12 5 37 1 + 13 6 7 ar + 14 6 38 1 + 15 7 8 ar + 16 7 39 1 + 17 8 9 ar + 18 8 40 1 + 19 9 10 1 + 20 10 11 1 + 21 10 31 am + 22 11 12 1 + 23 11 41 1 + 24 11 42 1 + 25 12 13 2 + 26 12 14 am + 27 14 15 1 + 28 14 19 1 + 29 15 16 1 + 30 15 43 1 + 31 15 44 1 + 32 16 17 1 + 33 16 45 1 + 34 16 46 1 + 35 17 18 1 + 36 17 47 1 + 37 17 48 1 + 38 18 19 1 + 39 18 49 1 + 40 18 50 1 + 41 19 20 1 + 42 19 51 1 + 43 20 21 ar + 44 20 30 ar + 45 21 22 ar + 46 22 23 1 + 47 22 29 ar + 48 23 24 ar + 49 23 28 ar + 50 24 25 ar + 51 24 52 1 + 52 25 26 ar + 53 25 53 1 + 54 26 27 ar + 55 26 54 1 + 56 27 28 ar + 57 28 55 1 + 58 29 30 ar + 59 31 32 2 +@MOLECULE +***** + 55 59 0 0 0 +SMALL +GASTEIGER + +@ATOM + 1 C 2.4524 -3.1498 -5.1919 C.3 1 UNL1 -0.0190 + 2 C 3.3531 -2.0294 -4.6671 C.3 1 UNL1 0.1732 + 3 O 4.6842 -2.2281 -5.1069 O.3 1 UNL1 -0.4780 + 4 C 5.4127 -3.0690 -4.3077 C.ar 1 UNL1 0.1429 + 5 C 6.6225 -3.4976 -4.8651 C.ar 1 UNL1 -0.0180 + 6 C 7.4492 -4.3611 -4.1563 C.ar 1 UNL1 -0.0582 + 7 C 7.0676 -4.7828 -2.8869 C.ar 1 UNL1 -0.0598 + 8 C 5.8645 -4.3402 -2.3207 C.ar 1 UNL1 -0.0367 + 9 C 5.0123 -3.4791 -3.0203 C.ar 1 UNL1 0.0787 + 10 N 3.8035 -2.9572 -2.4600 N.am 1 UNL1 -0.2563 + 11 C 3.3102 -3.3243 -1.1328 C.3 1 UNL1 0.0965 + 12 C 4.4070 -3.6941 -0.1078 C.2 1 UNL1 0.2340 + 13 O 4.8800 -2.7936 0.5973 O.2 1 UNL1 -0.2738 + 14 N 4.8865 -4.9979 -0.0020 N.am 1 UNL1 -0.2884 + 15 C 4.2908 -6.0172 -0.8813 C.3 1 UNL1 0.0155 + 16 C 4.0184 -7.3270 -0.1490 C.3 1 UNL1 -0.0371 + 17 C 5.2268 -7.8170 0.6416 C.3 1 UNL1 -0.0495 + 18 C 5.8081 -6.7000 1.5094 C.3 1 UNL1 -0.0255 + 19 C 6.1196 -5.4213 0.7111 C.3 1 UNL1 0.1048 + 20 C 7.2484 -5.6016 -0.2736 C.ar 1 UNL1 0.2482 + 21 N 7.9498 -6.6746 -0.5406 N.ar 1 UNL1 -0.1897 + 22 C 8.9357 -6.2080 -1.3759 C.ar 1 UNL1 0.2036 + 23 C 10.0355 -7.0544 -1.7894 C.ar 1 UNL1 0.0405 + 24 C 11.2896 -6.4991 -2.0680 C.ar 1 UNL1 -0.0481 + 25 C 12.3229 -7.3055 -2.5371 C.ar 1 UNL1 -0.0429 + 26 C 12.0705 -8.6552 -2.7097 C.ar 1 UNL1 0.0276 + 27 N 10.8819 -9.2367 -2.4372 N.ar 1 UNL1 -0.2626 + 28 C 9.8923 -8.4237 -1.9834 C.ar 1 UNL1 0.0383 + 29 N 8.8072 -4.9020 -1.6794 N.ar 1 UNL1 -0.0560 + 30 O 7.6795 -4.5016 -0.9628 O.2 1 UNL1 -0.3357 + 31 C 3.1413 -1.9550 -3.1587 C.2 1 UNL1 0.2608 + 32 O 2.3257 -1.1845 -2.6539 O.2 1 UNL1 -0.2712 + 33 H 2.4912 -3.2158 -6.2816 H 1 UNL1 0.0270 + 34 H 1.4160 -2.9860 -4.8797 H 1 UNL1 0.0270 + 35 H 2.7631 -4.1280 -4.8040 H 1 UNL1 0.0270 + 36 H 3.0204 -1.0765 -5.0947 H 1 UNL1 0.0829 + 37 H 6.9140 -3.1583 -5.8561 H 1 UNL1 0.0655 + 38 H 8.3872 -4.6991 -4.5894 H 1 UNL1 0.0619 + 39 H 7.7129 -5.4533 -2.3223 H 1 UNL1 0.0618 + 40 H 5.6437 -4.6772 -1.3132 H 1 UNL1 0.0637 + 41 H 2.6094 -4.1630 -1.1936 H 1 UNL1 0.0564 + 42 H 2.7216 -2.4901 -0.7341 H 1 UNL1 0.0564 + 43 H 4.9807 -6.1895 -1.7161 H 1 UNL1 0.0465 + 44 H 3.3558 -5.6644 -1.3280 H 1 UNL1 0.0465 + 45 H 3.7124 -8.0956 -0.8683 H 1 UNL1 0.0280 + 46 H 3.1769 -7.1812 0.5387 H 1 UNL1 0.0280 + 47 H 5.9903 -8.2015 -0.0442 H 1 UNL1 0.0266 + 48 H 4.9258 -8.6561 1.2800 H 1 UNL1 0.0266 + 49 H 6.6974 -7.0629 2.0367 H 1 UNL1 0.0288 + 50 H 5.0635 -6.4609 2.2775 H 1 UNL1 0.0288 + 51 H 6.4169 -4.6457 1.4177 H 1 UNL1 0.0599 + 52 H 11.4616 -5.4332 -1.9355 H 1 UNL1 0.0626 + 53 H 13.2947 -6.8846 -2.7694 H 1 UNL1 0.0633 + 54 H 12.8394 -9.3217 -3.0900 H 1 UNL1 0.0829 + 55 H 8.9510 -8.9329 -1.7902 H 1 UNL1 0.0837 +@BOND + 1 1 33 1 + 2 1 34 1 + 3 1 35 1 + 4 2 3 1 + 5 2 31 1 + 6 2 1 1 + 7 2 36 1 + 8 3 4 1 + 9 4 5 ar + 10 4 9 ar + 11 5 6 ar + 12 5 37 1 + 13 6 7 ar + 14 6 38 1 + 15 7 8 ar + 16 7 39 1 + 17 8 9 ar + 18 8 40 1 + 19 9 10 1 + 20 10 11 1 + 21 10 31 am + 22 11 12 1 + 23 11 41 1 + 24 11 42 1 + 25 12 13 2 + 26 12 14 am + 27 14 15 1 + 28 14 19 1 + 29 15 16 1 + 30 15 43 1 + 31 15 44 1 + 32 16 17 1 + 33 16 45 1 + 34 16 46 1 + 35 17 18 1 + 36 17 47 1 + 37 17 48 1 + 38 18 19 1 + 39 18 49 1 + 40 18 50 1 + 41 19 20 1 + 42 19 51 1 + 43 20 21 ar + 44 20 30 ar + 45 21 22 ar + 46 22 23 1 + 47 22 29 ar + 48 23 24 ar + 49 23 28 ar + 50 24 25 ar + 51 24 52 1 + 52 25 26 ar + 53 25 53 1 + 54 26 27 ar + 55 26 54 1 + 56 27 28 ar + 57 28 55 1 + 58 29 30 ar + 59 31 32 2 +@MOLECULE +***** + 55 59 0 0 0 +SMALL +GASTEIGER + +@ATOM + 1 C 5.5442 -0.6363 -3.3747 C.3 1 UNL1 -0.0190 + 2 C 4.0266 -0.4674 -3.4770 C.3 1 UNL1 0.1732 + 3 O 3.6165 0.6890 -2.7705 O.3 1 UNL1 -0.4780 + 4 C 3.4151 0.4790 -1.4320 C.ar 1 UNL1 0.1429 + 5 C 3.2851 1.6476 -0.6733 C.ar 1 UNL1 -0.0180 + 6 C 3.0856 1.5684 0.6998 C.ar 1 UNL1 -0.0582 + 7 C 3.0046 0.3195 1.3068 C.ar 1 UNL1 -0.0598 + 8 C 3.1171 -0.8515 0.5452 C.ar 1 UNL1 -0.0367 + 9 C 3.3284 -0.7954 -0.8366 C.ar 1 UNL1 0.0787 + 10 N 3.3924 -1.9629 -1.6614 N.am 1 UNL1 -0.2563 + 11 C 3.3102 -3.3243 -1.1328 C.3 1 UNL1 0.0965 + 12 C 4.4070 -3.6941 -0.1078 C.2 1 UNL1 0.2340 + 13 O 4.8800 -2.7936 0.5973 O.2 1 UNL1 -0.2738 + 14 N 4.8865 -4.9979 -0.0020 N.am 1 UNL1 -0.2884 + 15 C 4.2908 -6.0172 -0.8813 C.3 1 UNL1 0.0155 + 16 C 4.0184 -7.3270 -0.1490 C.3 1 UNL1 -0.0371 + 17 C 5.2268 -7.8170 0.6416 C.3 1 UNL1 -0.0495 + 18 C 5.8081 -6.7000 1.5094 C.3 1 UNL1 -0.0255 + 19 C 6.1196 -5.4213 0.7111 C.3 1 UNL1 0.1048 + 20 C 7.2484 -5.6016 -0.2736 C.ar 1 UNL1 0.2482 + 21 N 7.9498 -6.6746 -0.5406 N.ar 1 UNL1 -0.1897 + 22 C 8.9357 -6.2080 -1.3759 C.ar 1 UNL1 0.2036 + 23 C 10.0355 -7.0544 -1.7894 C.ar 1 UNL1 0.0405 + 24 C 11.0367 -6.5534 -2.6292 C.ar 1 UNL1 -0.0481 + 25 C 12.0513 -7.3908 -3.0846 C.ar 1 UNL1 -0.0429 + 26 C 12.0370 -8.7138 -2.6788 C.ar 1 UNL1 0.0276 + 27 N 11.1012 -9.2358 -1.8559 N.ar 1 UNL1 -0.2626 + 28 C 10.1227 -8.3947 -1.4301 C.ar 1 UNL1 0.0383 + 29 N 8.8072 -4.9020 -1.6794 N.ar 1 UNL1 -0.0560 + 30 O 7.6795 -4.5016 -0.9628 O.2 1 UNL1 -0.3357 + 31 C 3.3995 -1.7870 -3.0398 C.2 1 UNL1 0.2608 + 32 O 3.0973 -2.6629 -3.8492 O.2 1 UNL1 -0.2712 + 33 H 6.0698 0.2468 -3.7451 H 1 UNL1 0.0270 + 34 H 5.8713 -1.5125 -3.9436 H 1 UNL1 0.0270 + 35 H 5.8618 -0.7809 -2.3345 H 1 UNL1 0.0270 + 36 H 3.7571 -0.3056 -4.5271 H 1 UNL1 0.0829 + 37 H 3.3450 2.6190 -1.1580 H 1 UNL1 0.0655 + 38 H 2.9891 2.4750 1.2918 H 1 UNL1 0.0619 + 39 H 2.8412 0.2488 2.3805 H 1 UNL1 0.0618 + 40 H 3.0082 -1.7926 1.0742 H 1 UNL1 0.0637 + 41 H 3.3429 -4.0612 -1.9417 H 1 UNL1 0.0564 + 42 H 2.3289 -3.4601 -0.6639 H 1 UNL1 0.0564 + 43 H 4.9807 -6.1895 -1.7161 H 1 UNL1 0.0465 + 44 H 3.3558 -5.6644 -1.3280 H 1 UNL1 0.0465 + 45 H 3.7124 -8.0956 -0.8683 H 1 UNL1 0.0280 + 46 H 3.1769 -7.1812 0.5387 H 1 UNL1 0.0280 + 47 H 5.9903 -8.2015 -0.0442 H 1 UNL1 0.0266 + 48 H 4.9258 -8.6561 1.2800 H 1 UNL1 0.0266 + 49 H 6.6974 -7.0629 2.0367 H 1 UNL1 0.0288 + 50 H 5.0635 -6.4609 2.2775 H 1 UNL1 0.0288 + 51 H 6.4169 -4.6457 1.4177 H 1 UNL1 0.0599 + 52 H 11.0213 -5.5125 -2.9443 H 1 UNL1 0.0626 + 53 H 12.8248 -7.0178 -3.7465 H 1 UNL1 0.0633 + 54 H 12.7970 -9.4102 -3.0215 H 1 UNL1 0.0829 + 55 H 9.3854 -8.8615 -0.7811 H 1 UNL1 0.0837 +@BOND + 1 1 33 1 + 2 1 34 1 + 3 1 35 1 + 4 2 3 1 + 5 2 31 1 + 6 2 1 1 + 7 2 36 1 + 8 3 4 1 + 9 4 5 ar + 10 4 9 ar + 11 5 6 ar + 12 5 37 1 + 13 6 7 ar + 14 6 38 1 + 15 7 8 ar + 16 7 39 1 + 17 8 9 ar + 18 8 40 1 + 19 9 10 1 + 20 10 11 1 + 21 10 31 am + 22 11 12 1 + 23 11 41 1 + 24 11 42 1 + 25 12 13 2 + 26 12 14 am + 27 14 15 1 + 28 14 19 1 + 29 15 16 1 + 30 15 43 1 + 31 15 44 1 + 32 16 17 1 + 33 16 45 1 + 34 16 46 1 + 35 17 18 1 + 36 17 47 1 + 37 17 48 1 + 38 18 19 1 + 39 18 49 1 + 40 18 50 1 + 41 19 20 1 + 42 19 51 1 + 43 20 21 ar + 44 20 30 ar + 45 21 22 ar + 46 22 23 1 + 47 22 29 ar + 48 23 24 ar + 49 23 28 ar + 50 24 25 ar + 51 24 52 1 + 52 25 26 ar + 53 25 53 1 + 54 26 27 ar + 55 26 54 1 + 56 27 28 ar + 57 28 55 1 + 58 29 30 ar + 59 31 32 2 +@MOLECULE +***** + 55 59 0 0 0 +SMALL +GASTEIGER + +@ATOM + 1 C -0.8173 -2.9655 -1.4108 C.3 1 UNL1 -0.0190 + 2 C -0.2540 -2.9288 0.0117 C.3 1 UNL1 0.1732 + 3 O -0.3218 -1.6123 0.5286 O.3 1 UNL1 -0.4780 + 4 C 0.7430 -0.8241 0.1803 C.ar 1 UNL1 0.1429 + 5 C 0.5656 0.5397 0.4382 C.ar 1 UNL1 -0.0180 + 6 C 1.5711 1.4454 0.1214 C.ar 1 UNL1 -0.0582 + 7 C 2.7554 0.9811 -0.4412 C.ar 1 UNL1 -0.0598 + 8 C 2.9410 -0.3867 -0.6835 C.ar 1 UNL1 -0.0367 + 9 C 1.9385 -1.3148 -0.3820 C.ar 1 UNL1 0.0787 + 10 N 2.1056 -2.7248 -0.5594 N.am 1 UNL1 -0.2563 + 11 C 3.3102 -3.3243 -1.1328 C.3 1 UNL1 0.0965 + 12 C 4.4070 -3.6941 -0.1078 C.2 1 UNL1 0.2340 + 13 O 4.8800 -2.7936 0.5973 O.2 1 UNL1 -0.2738 + 14 N 4.8865 -4.9979 -0.0020 N.am 1 UNL1 -0.2884 + 15 C 4.2908 -6.0172 -0.8813 C.3 1 UNL1 0.0155 + 16 C 4.0184 -7.3270 -0.1490 C.3 1 UNL1 -0.0371 + 17 C 5.2268 -7.8170 0.6416 C.3 1 UNL1 -0.0495 + 18 C 5.8081 -6.7000 1.5094 C.3 1 UNL1 -0.0255 + 19 C 6.1196 -5.4213 0.7111 C.3 1 UNL1 0.1048 + 20 C 7.2484 -5.6016 -0.2736 C.ar 1 UNL1 0.2482 + 21 N 8.4049 -4.9900 -0.3274 N.ar 1 UNL1 -0.1897 + 22 C 8.9388 -5.4271 -1.5153 C.ar 1 UNL1 0.2036 + 23 C 10.1644 -4.8643 -2.0427 C.ar 1 UNL1 0.0405 + 24 C 10.6822 -5.3148 -3.2624 C.ar 1 UNL1 -0.0481 + 25 C 11.8989 -4.8250 -3.7292 C.ar 1 UNL1 -0.0429 + 26 C 12.5640 -3.8875 -2.9584 C.ar 1 UNL1 0.0276 + 27 N 12.0936 -3.4117 -1.7847 N.ar 1 UNL1 -0.2626 + 28 C 10.9053 -3.9103 -1.3541 C.ar 1 UNL1 0.0383 + 29 N 8.1728 -6.3397 -2.1434 N.ar 1 UNL1 -0.0560 + 30 O 7.0590 -6.4694 -1.3138 O.2 1 UNL1 -0.3357 + 31 C 1.1302 -3.5669 -0.0390 C.2 1 UNL1 0.2608 + 32 O 1.3047 -4.7611 0.1994 O.2 1 UNL1 -0.2712 + 33 H -1.8434 -2.5923 -1.4434 H 1 UNL1 0.0270 + 34 H -0.7948 -3.9864 -1.8054 H 1 UNL1 0.0270 + 35 H -0.2294 -2.3360 -2.0906 H 1 UNL1 0.0270 + 36 H -0.8817 -3.5525 0.6585 H 1 UNL1 0.0829 + 37 H -0.3620 0.8920 0.8826 H 1 UNL1 0.0655 + 38 H 1.4335 2.5059 0.3165 H 1 UNL1 0.0619 + 39 H 3.5506 1.6830 -0.6854 H 1 UNL1 0.0618 + 40 H 3.9014 -0.6867 -1.0897 H 1 UNL1 0.0637 + 41 H 3.7582 -2.6634 -1.8818 H 1 UNL1 0.0564 + 42 H 3.0243 -4.2271 -1.6847 H 1 UNL1 0.0564 + 43 H 4.9807 -6.1895 -1.7161 H 1 UNL1 0.0465 + 44 H 3.3558 -5.6644 -1.3280 H 1 UNL1 0.0465 + 45 H 3.7124 -8.0956 -0.8683 H 1 UNL1 0.0280 + 46 H 3.1769 -7.1812 0.5387 H 1 UNL1 0.0280 + 47 H 5.9903 -8.2015 -0.0442 H 1 UNL1 0.0266 + 48 H 4.9258 -8.6561 1.2800 H 1 UNL1 0.0266 + 49 H 6.6974 -7.0629 2.0367 H 1 UNL1 0.0288 + 50 H 5.0635 -6.4609 2.2775 H 1 UNL1 0.0288 + 51 H 6.4169 -4.6457 1.4177 H 1 UNL1 0.0599 + 52 H 10.1472 -6.0607 -3.8459 H 1 UNL1 0.0626 + 53 H 12.3170 -5.1763 -4.6658 H 1 UNL1 0.0633 + 54 H 13.5247 -3.4888 -3.2716 H 1 UNL1 0.0829 + 55 H 10.5731 -3.5084 -0.3997 H 1 UNL1 0.0837 +@BOND + 1 1 33 1 + 2 1 34 1 + 3 1 35 1 + 4 2 3 1 + 5 2 31 1 + 6 2 1 1 + 7 2 36 1 + 8 3 4 1 + 9 4 5 ar + 10 4 9 ar + 11 5 6 ar + 12 5 37 1 + 13 6 7 ar + 14 6 38 1 + 15 7 8 ar + 16 7 39 1 + 17 8 9 ar + 18 8 40 1 + 19 9 10 1 + 20 10 11 1 + 21 10 31 am + 22 11 12 1 + 23 11 41 1 + 24 11 42 1 + 25 12 13 2 + 26 12 14 am + 27 14 15 1 + 28 14 19 1 + 29 15 16 1 + 30 15 43 1 + 31 15 44 1 + 32 16 17 1 + 33 16 45 1 + 34 16 46 1 + 35 17 18 1 + 36 17 47 1 + 37 17 48 1 + 38 18 19 1 + 39 18 49 1 + 40 18 50 1 + 41 19 20 1 + 42 19 51 1 + 43 20 21 ar + 44 20 30 ar + 45 21 22 ar + 46 22 23 1 + 47 22 29 ar + 48 23 24 ar + 49 23 28 ar + 50 24 25 ar + 51 24 52 1 + 52 25 26 ar + 53 25 53 1 + 54 26 27 ar + 55 26 54 1 + 56 27 28 ar + 57 28 55 1 + 58 29 30 ar + 59 31 32 2 +@MOLECULE +***** + 55 59 0 0 0 +SMALL +GASTEIGER + +@ATOM + 1 C -0.7735 -3.7418 -0.5073 C.3 1 UNL1 -0.0190 + 2 C -0.0144 -3.0152 0.6053 C.3 1 UNL1 0.1732 + 3 O -0.3099 -1.6309 0.5730 O.3 1 UNL1 -0.4780 + 4 C 0.4665 -0.9183 -0.3021 C.ar 1 UNL1 0.1429 + 5 C 0.0132 0.3809 -0.5563 C.ar 1 UNL1 -0.0180 + 6 C 0.7098 1.2028 -1.4342 C.ar 1 UNL1 -0.0582 + 7 C 1.8646 0.7254 -2.0452 C.ar 1 UNL1 -0.0598 + 8 C 2.3291 -0.5695 -1.7778 C.ar 1 UNL1 -0.0367 + 9 C 1.6382 -1.4174 -0.9055 C.ar 1 UNL1 0.0787 + 10 N 2.1056 -2.7248 -0.5594 N.am 1 UNL1 -0.2563 + 11 C 3.3102 -3.3243 -1.1328 C.3 1 UNL1 0.0965 + 12 C 4.4070 -3.6941 -0.1078 C.2 1 UNL1 0.2340 + 13 O 4.8800 -2.7936 0.5973 O.2 1 UNL1 -0.2738 + 14 N 4.8865 -4.9979 -0.0020 N.am 1 UNL1 -0.2884 + 15 C 4.2908 -6.0172 -0.8813 C.3 1 UNL1 0.0155 + 16 C 4.0184 -7.3270 -0.1490 C.3 1 UNL1 -0.0371 + 17 C 5.2268 -7.8170 0.6416 C.3 1 UNL1 -0.0495 + 18 C 5.8081 -6.7000 1.5094 C.3 1 UNL1 -0.0255 + 19 C 6.1196 -5.4213 0.7111 C.3 1 UNL1 0.1048 + 20 C 7.2484 -5.6016 -0.2736 C.ar 1 UNL1 0.2482 + 21 N 7.7931 -4.7233 -1.0776 N.ar 1 UNL1 -0.1897 + 22 C 8.6382 -5.4828 -1.8497 C.ar 1 UNL1 0.2036 + 23 C 9.3311 -4.9168 -2.9883 C.ar 1 UNL1 0.0405 + 24 C 9.1517 -3.5711 -3.3283 C.ar 1 UNL1 -0.0481 + 25 C 9.7606 -3.0502 -4.4667 C.ar 1 UNL1 -0.0429 + 26 C 10.5414 -3.8965 -5.2344 C.ar 1 UNL1 0.0276 + 27 N 10.7562 -5.1963 -4.9350 N.ar 1 UNL1 -0.2626 + 28 C 10.1469 -5.6764 -3.8195 C.ar 1 UNL1 0.0383 + 29 N 8.6748 -6.7796 -1.4874 N.ar 1 UNL1 -0.0560 + 30 O 7.7665 -6.8576 -0.4317 O.2 1 UNL1 -0.3357 + 31 C 1.4553 -3.3983 0.4676 C.2 1 UNL1 0.2608 + 32 O 1.9451 -4.3342 1.0983 O.2 1 UNL1 -0.2712 + 33 H -1.8505 -3.5768 -0.4291 H 1 UNL1 0.0270 + 34 H -0.5722 -4.8171 -0.4693 H 1 UNL1 0.0270 + 35 H -0.4694 -3.3841 -1.4990 H 1 UNL1 0.0270 + 36 H -0.3633 -3.3879 1.5753 H 1 UNL1 0.0829 + 37 H -0.8879 0.7463 -0.0699 H 1 UNL1 0.0655 + 38 H 0.3568 2.2107 -1.6368 H 1 UNL1 0.0619 + 39 H 2.4199 1.3653 -2.7284 H 1 UNL1 0.0618 + 40 H 3.2553 -0.8670 -2.2584 H 1 UNL1 0.0637 + 41 H 3.7582 -2.6634 -1.8818 H 1 UNL1 0.0564 + 42 H 3.0243 -4.2271 -1.6847 H 1 UNL1 0.0564 + 43 H 4.9807 -6.1895 -1.7161 H 1 UNL1 0.0465 + 44 H 3.3558 -5.6644 -1.3280 H 1 UNL1 0.0465 + 45 H 3.7124 -8.0956 -0.8683 H 1 UNL1 0.0280 + 46 H 3.1769 -7.1812 0.5387 H 1 UNL1 0.0280 + 47 H 5.9903 -8.2015 -0.0442 H 1 UNL1 0.0266 + 48 H 4.9258 -8.6561 1.2800 H 1 UNL1 0.0266 + 49 H 6.6974 -7.0629 2.0367 H 1 UNL1 0.0288 + 50 H 5.0635 -6.4609 2.2775 H 1 UNL1 0.0288 + 51 H 6.4169 -4.6457 1.4177 H 1 UNL1 0.0599 + 52 H 8.5242 -2.9274 -2.7159 H 1 UNL1 0.0626 + 53 H 9.6181 -2.0129 -4.7480 H 1 UNL1 0.0633 + 54 H 11.0226 -3.5413 -6.1412 H 1 UNL1 0.0829 + 55 H 10.3377 -6.7293 -3.6258 H 1 UNL1 0.0837 +@BOND + 1 1 33 1 + 2 1 34 1 + 3 1 35 1 + 4 2 3 1 + 5 2 31 1 + 6 2 1 1 + 7 2 36 1 + 8 3 4 1 + 9 4 5 ar + 10 4 9 ar + 11 5 6 ar + 12 5 37 1 + 13 6 7 ar + 14 6 38 1 + 15 7 8 ar + 16 7 39 1 + 17 8 9 ar + 18 8 40 1 + 19 9 10 1 + 20 10 11 1 + 21 10 31 am + 22 11 12 1 + 23 11 41 1 + 24 11 42 1 + 25 12 13 2 + 26 12 14 am + 27 14 15 1 + 28 14 19 1 + 29 15 16 1 + 30 15 43 1 + 31 15 44 1 + 32 16 17 1 + 33 16 45 1 + 34 16 46 1 + 35 17 18 1 + 36 17 47 1 + 37 17 48 1 + 38 18 19 1 + 39 18 49 1 + 40 18 50 1 + 41 19 20 1 + 42 19 51 1 + 43 20 21 ar + 44 20 30 ar + 45 21 22 ar + 46 22 23 1 + 47 22 29 ar + 48 23 24 ar + 49 23 28 ar + 50 24 25 ar + 51 24 52 1 + 52 25 26 ar + 53 25 53 1 + 54 26 27 ar + 55 26 54 1 + 56 27 28 ar + 57 28 55 1 + 58 29 30 ar + 59 31 32 2 +@MOLECULE +***** + 55 59 0 0 0 +SMALL +GASTEIGER + +@ATOM + 1 C 6.9899 1.0441 0.8100 C.3 1 UNL1 -0.0190 + 2 C 7.8610 -0.1996 0.6189 C.3 1 UNL1 0.1732 + 3 O 8.3050 -0.2818 -0.7231 O.3 1 UNL1 -0.4780 + 4 C 7.4109 -0.8855 -1.5672 C.ar 1 UNL1 0.1429 + 5 C 7.6992 -0.7294 -2.9275 C.ar 1 UNL1 -0.0180 + 6 C 6.8621 -1.2882 -3.8859 C.ar 1 UNL1 -0.0582 + 7 C 5.7461 -2.0117 -3.4789 C.ar 1 UNL1 -0.0598 + 8 C 5.4662 -2.1834 -2.1165 C.ar 1 UNL1 -0.0367 + 9 C 6.2894 -1.6212 -1.1349 C.ar 1 UNL1 0.0787 + 10 N 6.0746 -1.8181 0.2660 N.am 1 UNL1 -0.2563 + 11 C 4.9406 -2.5673 0.8065 C.3 1 UNL1 0.0965 + 12 C 4.4070 -3.6941 -0.1078 C.2 1 UNL1 0.2340 + 13 O 3.5119 -3.4197 -0.9172 O.2 1 UNL1 -0.2738 + 14 N 4.8865 -4.9979 -0.0020 N.am 1 UNL1 -0.2884 + 15 C 4.2908 -6.0172 -0.8813 C.3 1 UNL1 0.0155 + 16 C 4.0184 -7.3270 -0.1490 C.3 1 UNL1 -0.0371 + 17 C 5.2268 -7.8170 0.6416 C.3 1 UNL1 -0.0495 + 18 C 5.8081 -6.7000 1.5094 C.3 1 UNL1 -0.0255 + 19 C 6.1196 -5.4213 0.7111 C.3 1 UNL1 0.1048 + 20 C 7.2484 -5.6016 -0.2736 C.ar 1 UNL1 0.2482 + 21 N 7.1985 -5.9525 -1.5341 N.ar 1 UNL1 -0.1897 + 22 C 8.5203 -6.1214 -1.8679 C.ar 1 UNL1 0.2036 + 23 C 8.9094 -6.6682 -3.1511 C.ar 1 UNL1 0.0405 + 24 C 10.0906 -7.4083 -3.2760 C.ar 1 UNL1 -0.0481 + 25 C 10.4990 -7.8681 -4.5250 C.ar 1 UNL1 -0.0429 + 26 C 9.7043 -7.5762 -5.6198 C.ar 1 UNL1 0.0276 + 27 N 8.5485 -6.8808 -5.5434 N.ar 1 UNL1 -0.2626 + 28 C 8.1776 -6.4432 -4.3118 C.ar 1 UNL1 0.0383 + 29 N 9.3690 -5.8120 -0.8687 N.ar 1 UNL1 -0.0560 + 30 O 8.5285 -5.4511 0.1843 O.2 1 UNL1 -0.3357 + 31 C 7.0633 -1.3889 1.1432 C.2 1 UNL1 0.2608 + 32 O 7.1866 -1.7964 2.2975 O.2 1 UNL1 -0.2712 + 33 H 7.5247 1.9533 0.5259 H 1 UNL1 0.0270 + 34 H 6.6675 1.1293 1.8527 H 1 UNL1 0.0270 + 35 H 6.0871 1.0000 0.1881 H 1 UNL1 0.0270 + 36 H 8.7584 -0.1038 1.2410 H 1 UNL1 0.0829 + 37 H 8.5768 -0.1661 -3.2353 H 1 UNL1 0.0655 + 38 H 7.0816 -1.1641 -4.9433 H 1 UNL1 0.0619 + 39 H 5.0895 -2.4586 -4.2231 H 1 UNL1 0.0618 + 40 H 4.6014 -2.7891 -1.8663 H 1 UNL1 0.0637 + 41 H 4.1054 -1.8993 1.0403 H 1 UNL1 0.0564 + 42 H 5.2343 -3.0029 1.7685 H 1 UNL1 0.0564 + 43 H 4.9807 -6.1895 -1.7161 H 1 UNL1 0.0465 + 44 H 3.3558 -5.6644 -1.3280 H 1 UNL1 0.0465 + 45 H 3.7124 -8.0956 -0.8683 H 1 UNL1 0.0280 + 46 H 3.1769 -7.1812 0.5387 H 1 UNL1 0.0280 + 47 H 5.9903 -8.2015 -0.0442 H 1 UNL1 0.0266 + 48 H 4.9258 -8.6561 1.2800 H 1 UNL1 0.0266 + 49 H 6.6974 -7.0629 2.0367 H 1 UNL1 0.0288 + 50 H 5.0635 -6.4609 2.2775 H 1 UNL1 0.0288 + 51 H 6.4169 -4.6457 1.4177 H 1 UNL1 0.0599 + 52 H 10.7051 -7.6160 -2.4029 H 1 UNL1 0.0626 + 53 H 11.4190 -8.4307 -4.6365 H 1 UNL1 0.0633 + 54 H 9.9898 -7.8980 -6.6172 H 1 UNL1 0.0829 + 55 H 7.2487 -5.8777 -4.3010 H 1 UNL1 0.0837 +@BOND + 1 1 33 1 + 2 1 34 1 + 3 1 35 1 + 4 2 3 1 + 5 2 31 1 + 6 2 1 1 + 7 2 36 1 + 8 3 4 1 + 9 4 5 ar + 10 4 9 ar + 11 5 6 ar + 12 5 37 1 + 13 6 7 ar + 14 6 38 1 + 15 7 8 ar + 16 7 39 1 + 17 8 9 ar + 18 8 40 1 + 19 9 10 1 + 20 10 11 1 + 21 10 31 am + 22 11 12 1 + 23 11 41 1 + 24 11 42 1 + 25 12 13 2 + 26 12 14 am + 27 14 15 1 + 28 14 19 1 + 29 15 16 1 + 30 15 43 1 + 31 15 44 1 + 32 16 17 1 + 33 16 45 1 + 34 16 46 1 + 35 17 18 1 + 36 17 47 1 + 37 17 48 1 + 38 18 19 1 + 39 18 49 1 + 40 18 50 1 + 41 19 20 1 + 42 19 51 1 + 43 20 21 ar + 44 20 30 ar + 45 21 22 ar + 46 22 23 1 + 47 22 29 ar + 48 23 24 ar + 49 23 28 ar + 50 24 25 ar + 51 24 52 1 + 52 25 26 ar + 53 25 53 1 + 54 26 27 ar + 55 26 54 1 + 56 27 28 ar + 57 28 55 1 + 58 29 30 ar + 59 31 32 2 +@MOLECULE +***** + 55 59 0 0 0 +SMALL +GASTEIGER + +@ATOM + 1 C 2.5853 -3.4326 -5.2200 C.3 1 UNL1 -0.0190 + 2 C 3.6902 -4.3707 -4.7287 C.3 1 UNL1 0.1732 + 3 O 3.2404 -5.7128 -4.7623 O.3 1 UNL1 -0.4780 + 4 C 2.5428 -6.0920 -3.6460 C.ar 1 UNL1 0.1429 + 5 C 1.8568 -7.3049 -3.7735 C.ar 1 UNL1 -0.0180 + 6 C 1.1042 -7.7947 -2.7127 C.ar 1 UNL1 -0.0582 + 7 C 1.0510 -7.0747 -1.5238 C.ar 1 UNL1 -0.0598 + 8 C 1.7520 -5.8687 -1.3892 C.ar 1 UNL1 -0.0367 + 9 C 2.5074 -5.3519 -2.4473 C.ar 1 UNL1 0.0787 + 10 N 3.2840 -4.1552 -2.3363 N.am 1 UNL1 -0.2563 + 11 C 3.3102 -3.3243 -1.1328 C.3 1 UNL1 0.0965 + 12 C 4.4070 -3.6941 -0.1078 C.2 1 UNL1 0.2340 + 13 O 4.8800 -2.7936 0.5973 O.2 1 UNL1 -0.2738 + 14 N 4.8865 -4.9979 -0.0020 N.am 1 UNL1 -0.2884 + 15 C 4.2908 -6.0172 -0.8813 C.3 1 UNL1 0.0155 + 16 C 4.0184 -7.3270 -0.1490 C.3 1 UNL1 -0.0371 + 17 C 5.2268 -7.8170 0.6416 C.3 1 UNL1 -0.0495 + 18 C 5.8081 -6.7000 1.5094 C.3 1 UNL1 -0.0255 + 19 C 6.1196 -5.4213 0.7111 C.3 1 UNL1 0.1048 + 20 C 7.2484 -5.6016 -0.2736 C.ar 1 UNL1 0.2482 + 21 N 7.9498 -6.6746 -0.5406 N.ar 1 UNL1 -0.1897 + 22 C 8.9357 -6.2080 -1.3759 C.ar 1 UNL1 0.2036 + 23 C 10.0355 -7.0544 -1.7894 C.ar 1 UNL1 0.0405 + 24 C 11.0367 -6.5534 -2.6292 C.ar 1 UNL1 -0.0481 + 25 C 12.0513 -7.3908 -3.0846 C.ar 1 UNL1 -0.0429 + 26 C 12.0370 -8.7138 -2.6788 C.ar 1 UNL1 0.0276 + 27 N 11.1012 -9.2358 -1.8559 N.ar 1 UNL1 -0.2626 + 28 C 10.1227 -8.3947 -1.4301 C.ar 1 UNL1 0.0383 + 29 N 8.8072 -4.9020 -1.6794 N.ar 1 UNL1 -0.0560 + 30 O 7.6795 -4.5016 -0.9628 O.2 1 UNL1 -0.3357 + 31 C 4.1539 -3.8445 -3.3745 C.2 1 UNL1 0.2608 + 32 O 5.1117 -3.0799 -3.2674 O.2 1 UNL1 -0.2712 + 33 H 2.2515 -3.7010 -6.2249 H 1 UNL1 0.0270 + 34 H 2.9368 -2.3959 -5.2244 H 1 UNL1 0.0270 + 35 H 1.7025 -3.4789 -4.5700 H 1 UNL1 0.0270 + 36 H 4.5414 -4.3078 -5.4165 H 1 UNL1 0.0829 + 37 H 1.9086 -7.8626 -4.7054 H 1 UNL1 0.0655 + 38 H 0.5666 -8.7343 -2.8112 H 1 UNL1 0.0619 + 39 H 0.4698 -7.4550 -0.6859 H 1 UNL1 0.0618 + 40 H 1.6983 -5.3756 -0.4242 H 1 UNL1 0.0637 + 41 H 2.3448 -3.3507 -0.6174 H 1 UNL1 0.0564 + 42 H 3.4447 -2.2783 -1.4314 H 1 UNL1 0.0564 + 43 H 4.9807 -6.1895 -1.7161 H 1 UNL1 0.0465 + 44 H 3.3558 -5.6644 -1.3280 H 1 UNL1 0.0465 + 45 H 3.7124 -8.0956 -0.8683 H 1 UNL1 0.0280 + 46 H 3.1769 -7.1812 0.5387 H 1 UNL1 0.0280 + 47 H 5.9903 -8.2015 -0.0442 H 1 UNL1 0.0266 + 48 H 4.9258 -8.6561 1.2800 H 1 UNL1 0.0266 + 49 H 6.6974 -7.0629 2.0367 H 1 UNL1 0.0288 + 50 H 5.0635 -6.4609 2.2775 H 1 UNL1 0.0288 + 51 H 6.4169 -4.6457 1.4177 H 1 UNL1 0.0599 + 52 H 11.0213 -5.5125 -2.9443 H 1 UNL1 0.0626 + 53 H 12.8248 -7.0178 -3.7465 H 1 UNL1 0.0633 + 54 H 12.7970 -9.4102 -3.0215 H 1 UNL1 0.0829 + 55 H 9.3854 -8.8615 -0.7811 H 1 UNL1 0.0837 +@BOND + 1 1 33 1 + 2 1 34 1 + 3 1 35 1 + 4 2 3 1 + 5 2 31 1 + 6 2 1 1 + 7 2 36 1 + 8 3 4 1 + 9 4 5 ar + 10 4 9 ar + 11 5 6 ar + 12 5 37 1 + 13 6 7 ar + 14 6 38 1 + 15 7 8 ar + 16 7 39 1 + 17 8 9 ar + 18 8 40 1 + 19 9 10 1 + 20 10 11 1 + 21 10 31 am + 22 11 12 1 + 23 11 41 1 + 24 11 42 1 + 25 12 13 2 + 26 12 14 am + 27 14 15 1 + 28 14 19 1 + 29 15 16 1 + 30 15 43 1 + 31 15 44 1 + 32 16 17 1 + 33 16 45 1 + 34 16 46 1 + 35 17 18 1 + 36 17 47 1 + 37 17 48 1 + 38 18 19 1 + 39 18 49 1 + 40 18 50 1 + 41 19 20 1 + 42 19 51 1 + 43 20 21 ar + 44 20 30 ar + 45 21 22 ar + 46 22 23 1 + 47 22 29 ar + 48 23 24 ar + 49 23 28 ar + 50 24 25 ar + 51 24 52 1 + 52 25 26 ar + 53 25 53 1 + 54 26 27 ar + 55 26 54 1 + 56 27 28 ar + 57 28 55 1 + 58 29 30 ar + 59 31 32 2 +@MOLECULE +***** + 55 59 0 0 0 +SMALL +GASTEIGER + +@ATOM + 1 C 3.6215 -0.3101 -3.9718 C.3 1 UNL1 -0.0190 + 2 C 4.8012 -1.2837 -3.9226 C.3 1 UNL1 0.1732 + 3 O 4.7732 -2.1404 -5.0496 O.3 1 UNL1 -0.4780 + 4 C 3.9720 -3.2400 -4.8906 C.ar 1 UNL1 0.1429 + 5 C 3.7094 -3.9435 -6.0713 C.ar 1 UNL1 -0.0180 + 6 C 2.9015 -5.0741 -6.0439 C.ar 1 UNL1 -0.0582 + 7 C 2.3694 -5.5034 -4.8326 C.ar 1 UNL1 -0.0598 + 8 C 2.6462 -4.8097 -3.6469 C.ar 1 UNL1 -0.0367 + 9 C 3.4483 -3.6635 -3.6526 C.ar 1 UNL1 0.0787 + 10 N 3.8035 -2.9572 -2.4600 N.am 1 UNL1 -0.2563 + 11 C 3.3102 -3.3243 -1.1328 C.3 1 UNL1 0.0965 + 12 C 4.4070 -3.6941 -0.1078 C.2 1 UNL1 0.2340 + 13 O 4.8800 -2.7936 0.5973 O.2 1 UNL1 -0.2738 + 14 N 4.8865 -4.9979 -0.0020 N.am 1 UNL1 -0.2884 + 15 C 4.2908 -6.0172 -0.8813 C.3 1 UNL1 0.0155 + 16 C 4.0184 -7.3270 -0.1490 C.3 1 UNL1 -0.0371 + 17 C 5.2268 -7.8170 0.6416 C.3 1 UNL1 -0.0495 + 18 C 5.8081 -6.7000 1.5094 C.3 1 UNL1 -0.0255 + 19 C 6.1196 -5.4213 0.7111 C.3 1 UNL1 0.1048 + 20 C 7.2484 -5.6016 -0.2736 C.ar 1 UNL1 0.2482 + 21 N 8.4841 -5.9760 -0.0560 N.ar 1 UNL1 -0.1897 + 22 C 9.0892 -5.7936 -1.2758 C.ar 1 UNL1 0.2036 + 23 C 10.5203 -5.9445 -1.4369 C.ar 1 UNL1 0.0405 + 24 C 11.3851 -5.6684 -0.3717 C.ar 1 UNL1 -0.0481 + 25 C 12.7635 -5.7424 -0.5527 C.ar 1 UNL1 -0.0429 + 26 C 13.2394 -6.0985 -1.8025 C.ar 1 UNL1 0.0276 + 27 N 12.4421 -6.3902 -2.8534 N.ar 1 UNL1 -0.2626 + 28 C 11.1018 -6.3069 -2.6468 C.ar 1 UNL1 0.0383 + 29 N 8.2397 -5.3909 -2.2405 N.ar 1 UNL1 -0.0560 + 30 O 7.0151 -5.2788 -1.5822 O.2 1 UNL1 -0.3357 + 31 C 4.7663 -1.9596 -2.5560 C.2 1 UNL1 0.2608 + 32 O 5.4139 -1.5309 -1.6019 O.2 1 UNL1 -0.2712 + 33 H 3.6223 0.2714 -4.8966 H 1 UNL1 0.0270 + 34 H 3.6541 0.3746 -3.1183 H 1 UNL1 0.0270 + 35 H 2.6622 -0.8411 -3.9323 H 1 UNL1 0.0270 + 36 H 5.7353 -0.7135 -3.9852 H 1 UNL1 0.0829 + 37 H 4.1341 -3.6025 -7.0123 H 1 UNL1 0.0655 + 38 H 2.6923 -5.6193 -6.9607 H 1 UNL1 0.0619 + 39 H 1.7417 -6.3920 -4.8015 H 1 UNL1 0.0618 + 40 H 2.2304 -5.2180 -2.7316 H 1 UNL1 0.0637 + 41 H 2.6094 -4.1630 -1.1936 H 1 UNL1 0.0564 + 42 H 2.7216 -2.4901 -0.7341 H 1 UNL1 0.0564 + 43 H 4.9807 -6.1895 -1.7161 H 1 UNL1 0.0465 + 44 H 3.3558 -5.6644 -1.3280 H 1 UNL1 0.0465 + 45 H 3.7124 -8.0956 -0.8683 H 1 UNL1 0.0280 + 46 H 3.1769 -7.1812 0.5387 H 1 UNL1 0.0280 + 47 H 5.9903 -8.2015 -0.0442 H 1 UNL1 0.0266 + 48 H 4.9258 -8.6561 1.2800 H 1 UNL1 0.0266 + 49 H 6.6974 -7.0629 2.0367 H 1 UNL1 0.0288 + 50 H 5.0635 -6.4609 2.2775 H 1 UNL1 0.0288 + 51 H 6.4169 -4.6457 1.4177 H 1 UNL1 0.0599 + 52 H 10.9884 -5.3795 0.5990 H 1 UNL1 0.0626 + 53 H 13.4437 -5.5176 0.2610 H 1 UNL1 0.0633 + 54 H 14.3066 -6.1527 -1.9978 H 1 UNL1 0.0829 + 55 H 10.5007 -6.5375 -3.5232 H 1 UNL1 0.0837 +@BOND + 1 1 33 1 + 2 1 34 1 + 3 1 35 1 + 4 2 3 1 + 5 2 31 1 + 6 2 1 1 + 7 2 36 1 + 8 3 4 1 + 9 4 5 ar + 10 4 9 ar + 11 5 6 ar + 12 5 37 1 + 13 6 7 ar + 14 6 38 1 + 15 7 8 ar + 16 7 39 1 + 17 8 9 ar + 18 8 40 1 + 19 9 10 1 + 20 10 11 1 + 21 10 31 am + 22 11 12 1 + 23 11 41 1 + 24 11 42 1 + 25 12 13 2 + 26 12 14 am + 27 14 15 1 + 28 14 19 1 + 29 15 16 1 + 30 15 43 1 + 31 15 44 1 + 32 16 17 1 + 33 16 45 1 + 34 16 46 1 + 35 17 18 1 + 36 17 47 1 + 37 17 48 1 + 38 18 19 1 + 39 18 49 1 + 40 18 50 1 + 41 19 20 1 + 42 19 51 1 + 43 20 21 ar + 44 20 30 ar + 45 21 22 ar + 46 22 23 1 + 47 22 29 ar + 48 23 24 ar + 49 23 28 ar + 50 24 25 ar + 51 24 52 1 + 52 25 26 ar + 53 25 53 1 + 54 26 27 ar + 55 26 54 1 + 56 27 28 ar + 57 28 55 1 + 58 29 30 ar + 59 31 32 2 +@MOLECULE +***** + 55 59 0 0 0 +SMALL +GASTEIGER + +@ATOM + 1 C 3.9626 1.4526 0.4517 C.3 1 UNL1 -0.0190 + 2 C 2.7722 0.4909 0.4674 C.3 1 UNL1 0.1732 + 3 O 2.0866 0.5846 1.7028 O.3 1 UNL1 -0.4780 + 4 C 2.6193 -0.1973 2.6934 C.ar 1 UNL1 0.1429 + 5 C 2.1414 0.0858 3.9776 C.ar 1 UNL1 -0.0180 + 6 C 2.6113 -0.6330 5.0704 C.ar 1 UNL1 -0.0582 + 7 C 3.5491 -1.6409 4.8720 C.ar 1 UNL1 -0.0598 + 8 C 4.0153 -1.9370 3.5840 C.ar 1 UNL1 -0.0367 + 9 C 3.5636 -1.2195 2.4711 C.ar 1 UNL1 0.0787 + 10 N 3.9685 -1.5242 1.1330 N.am 1 UNL1 -0.2563 + 11 C 4.9406 -2.5673 0.8065 C.3 1 UNL1 0.0965 + 12 C 4.4070 -3.6941 -0.1078 C.2 1 UNL1 0.2340 + 13 O 3.5119 -3.4197 -0.9172 O.2 1 UNL1 -0.2738 + 14 N 4.8865 -4.9979 -0.0020 N.am 1 UNL1 -0.2884 + 15 C 4.2908 -6.0172 -0.8813 C.3 1 UNL1 0.0155 + 16 C 4.0184 -7.3270 -0.1490 C.3 1 UNL1 -0.0371 + 17 C 5.2268 -7.8170 0.6416 C.3 1 UNL1 -0.0495 + 18 C 5.8081 -6.7000 1.5094 C.3 1 UNL1 -0.0255 + 19 C 6.1196 -5.4213 0.7111 C.3 1 UNL1 0.1048 + 20 C 7.2484 -5.6016 -0.2736 C.ar 1 UNL1 0.2482 + 21 N 7.9498 -6.6746 -0.5406 N.ar 1 UNL1 -0.1897 + 22 C 8.9357 -6.2080 -1.3759 C.ar 1 UNL1 0.2036 + 23 C 10.0355 -7.0544 -1.7894 C.ar 1 UNL1 0.0405 + 24 C 10.4928 -8.0792 -0.9531 C.ar 1 UNL1 -0.0481 + 25 C 11.5978 -8.8417 -1.3215 C.ar 1 UNL1 -0.0429 + 26 C 12.2140 -8.5577 -2.5276 C.ar 1 UNL1 0.0276 + 27 N 11.7967 -7.5905 -3.3736 N.ar 1 UNL1 -0.2626 + 28 C 10.7176 -6.8616 -2.9856 C.ar 1 UNL1 0.0383 + 29 N 8.8072 -4.9020 -1.6794 N.ar 1 UNL1 -0.0560 + 30 O 7.6795 -4.5016 -0.9628 O.2 1 UNL1 -0.3357 + 31 C 3.3058 -0.8871 0.0908 C.2 1 UNL1 0.2608 + 32 O 3.2898 -1.2957 -1.0695 O.2 1 UNL1 -0.2712 + 33 H 3.6469 2.4815 0.6389 H 1 UNL1 0.0270 + 34 H 4.4795 1.4064 -0.5121 H 1 UNL1 0.0270 + 35 H 4.6928 1.1986 1.2302 H 1 UNL1 0.0270 + 36 H 2.0609 0.7934 -0.3098 H 1 UNL1 0.0829 + 37 H 1.4047 0.8725 4.1216 H 1 UNL1 0.0655 + 38 H 2.2449 -0.4115 6.0695 H 1 UNL1 0.0619 + 39 H 3.9167 -2.2134 5.7215 H 1 UNL1 0.0618 + 40 H 4.7181 -2.7588 3.4939 H 1 UNL1 0.0637 + 41 H 5.3380 -3.0307 1.7152 H 1 UNL1 0.0564 + 42 H 5.8066 -2.1010 0.3229 H 1 UNL1 0.0564 + 43 H 4.9807 -6.1895 -1.7161 H 1 UNL1 0.0465 + 44 H 3.3558 -5.6644 -1.3280 H 1 UNL1 0.0465 + 45 H 3.7124 -8.0956 -0.8683 H 1 UNL1 0.0280 + 46 H 3.1769 -7.1812 0.5387 H 1 UNL1 0.0280 + 47 H 5.9903 -8.2015 -0.0442 H 1 UNL1 0.0266 + 48 H 4.9258 -8.6561 1.2800 H 1 UNL1 0.0266 + 49 H 6.6974 -7.0629 2.0367 H 1 UNL1 0.0288 + 50 H 5.0635 -6.4609 2.2775 H 1 UNL1 0.0288 + 51 H 6.4169 -4.6457 1.4177 H 1 UNL1 0.0599 + 52 H 9.9994 -8.2770 -0.0042 H 1 UNL1 0.0626 + 53 H 11.9698 -9.6293 -0.6758 H 1 UNL1 0.0633 + 54 H 13.0900 -9.1131 -2.8503 H 1 UNL1 0.0829 + 55 H 10.4262 -6.0870 -3.6911 H 1 UNL1 0.0837 +@BOND + 1 1 33 1 + 2 1 34 1 + 3 1 35 1 + 4 2 3 1 + 5 2 31 1 + 6 2 1 1 + 7 2 36 1 + 8 3 4 1 + 9 4 5 ar + 10 4 9 ar + 11 5 6 ar + 12 5 37 1 + 13 6 7 ar + 14 6 38 1 + 15 7 8 ar + 16 7 39 1 + 17 8 9 ar + 18 8 40 1 + 19 9 10 1 + 20 10 11 1 + 21 10 31 am + 22 11 12 1 + 23 11 41 1 + 24 11 42 1 + 25 12 13 2 + 26 12 14 am + 27 14 15 1 + 28 14 19 1 + 29 15 16 1 + 30 15 43 1 + 31 15 44 1 + 32 16 17 1 + 33 16 45 1 + 34 16 46 1 + 35 17 18 1 + 36 17 47 1 + 37 17 48 1 + 38 18 19 1 + 39 18 49 1 + 40 18 50 1 + 41 19 20 1 + 42 19 51 1 + 43 20 21 ar + 44 20 30 ar + 45 21 22 ar + 46 22 23 1 + 47 22 29 ar + 48 23 24 ar + 49 23 28 ar + 50 24 25 ar + 51 24 52 1 + 52 25 26 ar + 53 25 53 1 + 54 26 27 ar + 55 26 54 1 + 56 27 28 ar + 57 28 55 1 + 58 29 30 ar + 59 31 32 2 +@MOLECULE +***** + 55 59 0 0 0 +SMALL +GASTEIGER + +@ATOM + 1 C 3.6586 0.9131 2.6734 C.3 1 UNL1 -0.0190 + 2 C 2.5455 -0.0499 2.2542 C.3 1 UNL1 0.1732 + 3 O 1.9985 -0.6878 3.3938 O.3 1 UNL1 -0.4780 + 4 C 2.6911 -1.8003 3.7927 C.ar 1 UNL1 0.1429 + 5 C 2.3426 -2.2785 5.0607 C.ar 1 UNL1 -0.0180 + 6 C 2.9802 -3.3975 5.5830 C.ar 1 UNL1 -0.0582 + 7 C 3.9558 -4.0411 4.8290 C.ar 1 UNL1 -0.0598 + 8 C 4.2931 -3.5734 3.5517 C.ar 1 UNL1 -0.0367 + 9 C 3.6715 -2.4430 3.0105 C.ar 1 UNL1 0.0787 + 10 N 3.9429 -1.9639 1.6898 N.am 1 UNL1 -0.2563 + 11 C 4.9406 -2.5673 0.8065 C.3 1 UNL1 0.0965 + 12 C 4.4070 -3.6941 -0.1078 C.2 1 UNL1 0.2340 + 13 O 3.5119 -3.4197 -0.9172 O.2 1 UNL1 -0.2738 + 14 N 4.8865 -4.9979 -0.0020 N.am 1 UNL1 -0.2884 + 15 C 4.2908 -6.0172 -0.8813 C.3 1 UNL1 0.0155 + 16 C 4.0184 -7.3270 -0.1490 C.3 1 UNL1 -0.0371 + 17 C 5.2268 -7.8170 0.6416 C.3 1 UNL1 -0.0495 + 18 C 5.8081 -6.7000 1.5094 C.3 1 UNL1 -0.0255 + 19 C 6.1196 -5.4213 0.7111 C.3 1 UNL1 0.1048 + 20 C 7.2484 -5.6016 -0.2736 C.ar 1 UNL1 0.2482 + 21 N 8.5352 -5.4365 -0.0963 N.ar 1 UNL1 -0.1897 + 22 C 9.0485 -5.5683 -1.3637 C.ar 1 UNL1 0.2036 + 23 C 10.4434 -5.2983 -1.6434 C.ar 1 UNL1 0.0405 + 24 C 11.3051 -4.8935 -0.6176 C.ar 1 UNL1 -0.0481 + 25 C 12.6267 -4.5628 -0.9042 C.ar 1 UNL1 -0.0429 + 26 C 13.0518 -4.6529 -2.2181 C.ar 1 UNL1 0.0276 + 27 N 12.2604 -5.0552 -3.2365 N.ar 1 UNL1 -0.2626 + 28 C 10.9753 -5.3687 -2.9261 C.ar 1 UNL1 0.0383 + 29 N 8.1199 -5.8808 -2.2881 N.ar 1 UNL1 -0.0560 + 30 O 6.9279 -5.9197 -1.5647 O.2 1 UNL1 -0.3357 + 31 C 3.1255 -0.9628 1.1792 C.2 1 UNL1 0.2608 + 32 O 3.0068 -0.7127 -0.0195 O.2 1 UNL1 -0.2712 + 33 H 3.2969 1.6529 3.3912 H 1 UNL1 0.0270 + 34 H 4.0657 1.4315 1.7994 H 1 UNL1 0.0270 + 35 H 4.4872 0.3810 3.1570 H 1 UNL1 0.0270 + 36 H 1.7323 0.5248 1.7959 H 1 UNL1 0.0829 + 37 H 1.5752 -1.7711 5.6401 H 1 UNL1 0.0655 + 38 H 2.7143 -3.7678 6.5698 H 1 UNL1 0.0619 + 39 H 4.4547 -4.9224 5.2278 H 1 UNL1 0.0618 + 40 H 5.0355 -4.1424 3.0016 H 1 UNL1 0.0637 + 41 H 5.7808 -2.9696 1.3816 H 1 UNL1 0.0564 + 42 H 5.3758 -1.7806 0.1795 H 1 UNL1 0.0564 + 43 H 4.9807 -6.1895 -1.7161 H 1 UNL1 0.0465 + 44 H 3.3558 -5.6644 -1.3280 H 1 UNL1 0.0465 + 45 H 3.7124 -8.0956 -0.8683 H 1 UNL1 0.0280 + 46 H 3.1769 -7.1812 0.5387 H 1 UNL1 0.0280 + 47 H 5.9903 -8.2015 -0.0442 H 1 UNL1 0.0266 + 48 H 4.9258 -8.6561 1.2800 H 1 UNL1 0.0266 + 49 H 6.6974 -7.0629 2.0367 H 1 UNL1 0.0288 + 50 H 5.0635 -6.4609 2.2775 H 1 UNL1 0.0288 + 51 H 6.4169 -4.6457 1.4177 H 1 UNL1 0.0599 + 52 H 10.9457 -4.8192 0.4063 H 1 UNL1 0.0626 + 53 H 13.3001 -4.2348 -0.1203 H 1 UNL1 0.0633 + 54 H 14.0687 -4.3887 -2.4942 H 1 UNL1 0.0829 + 55 H 10.3730 -5.6743 -3.7785 H 1 UNL1 0.0837 +@BOND + 1 1 33 1 + 2 1 34 1 + 3 1 35 1 + 4 2 3 1 + 5 2 31 1 + 6 2 1 1 + 7 2 36 1 + 8 3 4 1 + 9 4 5 ar + 10 4 9 ar + 11 5 6 ar + 12 5 37 1 + 13 6 7 ar + 14 6 38 1 + 15 7 8 ar + 16 7 39 1 + 17 8 9 ar + 18 8 40 1 + 19 9 10 1 + 20 10 11 1 + 21 10 31 am + 22 11 12 1 + 23 11 41 1 + 24 11 42 1 + 25 12 13 2 + 26 12 14 am + 27 14 15 1 + 28 14 19 1 + 29 15 16 1 + 30 15 43 1 + 31 15 44 1 + 32 16 17 1 + 33 16 45 1 + 34 16 46 1 + 35 17 18 1 + 36 17 47 1 + 37 17 48 1 + 38 18 19 1 + 39 18 49 1 + 40 18 50 1 + 41 19 20 1 + 42 19 51 1 + 43 20 21 ar + 44 20 30 ar + 45 21 22 ar + 46 22 23 1 + 47 22 29 ar + 48 23 24 ar + 49 23 28 ar + 50 24 25 ar + 51 24 52 1 + 52 25 26 ar + 53 25 53 1 + 54 26 27 ar + 55 26 54 1 + 56 27 28 ar + 57 28 55 1 + 58 29 30 ar + 59 31 32 2 +@MOLECULE +***** + 55 59 0 0 0 +SMALL +GASTEIGER + +@ATOM + 1 C 2.7069 0.4682 -2.7124 C.3 1 UNL1 -0.0190 + 2 C 4.1481 -0.0428 -2.7760 C.3 1 UNL1 0.1732 + 3 O 4.4858 -0.3835 -4.1082 O.3 1 UNL1 -0.4780 + 4 C 4.1127 -1.6515 -4.4680 C.ar 1 UNL1 0.1429 + 5 C 4.1805 -1.9096 -5.8416 C.ar 1 UNL1 -0.0180 + 6 C 3.8195 -3.1578 -6.3348 C.ar 1 UNL1 -0.0582 + 7 C 3.4036 -4.1471 -5.4499 C.ar 1 UNL1 -0.0598 + 8 C 3.3522 -3.8950 -4.0723 C.ar 1 UNL1 -0.0367 + 9 C 3.7011 -2.6429 -3.5549 C.ar 1 UNL1 0.0787 + 10 N 3.7182 -2.3584 -2.1527 N.am 1 UNL1 -0.2563 + 11 C 3.3102 -3.3243 -1.1328 C.3 1 UNL1 0.0965 + 12 C 4.4070 -3.6941 -0.1078 C.2 1 UNL1 0.2340 + 13 O 4.8800 -2.7936 0.5973 O.2 1 UNL1 -0.2738 + 14 N 4.8865 -4.9979 -0.0020 N.am 1 UNL1 -0.2884 + 15 C 4.2908 -6.0172 -0.8813 C.3 1 UNL1 0.0155 + 16 C 4.0184 -7.3270 -0.1490 C.3 1 UNL1 -0.0371 + 17 C 5.2268 -7.8170 0.6416 C.3 1 UNL1 -0.0495 + 18 C 5.8081 -6.7000 1.5094 C.3 1 UNL1 -0.0255 + 19 C 6.1196 -5.4213 0.7111 C.3 1 UNL1 0.1048 + 20 C 7.2484 -5.6016 -0.2736 C.ar 1 UNL1 0.2482 + 21 N 7.6084 -6.6747 -0.9320 N.ar 1 UNL1 -0.1897 + 22 C 8.7854 -6.2976 -1.5318 C.ar 1 UNL1 0.2036 + 23 C 9.6094 -7.2538 -2.2414 C.ar 1 UNL1 0.0405 + 24 C 9.6186 -8.6003 -1.8599 C.ar 1 UNL1 -0.0481 + 25 C 10.4679 -9.5016 -2.4959 C.ar 1 UNL1 -0.0429 + 26 C 11.2854 -9.0263 -3.5063 C.ar 1 UNL1 0.0276 + 27 N 11.2971 -7.7398 -3.9188 N.ar 1 UNL1 -0.2626 + 28 C 10.4593 -6.8837 -3.2777 C.ar 1 UNL1 0.0383 + 29 N 9.1080 -5.0079 -1.3152 N.ar 1 UNL1 -0.0560 + 30 O 8.0817 -4.5397 -0.4948 O.2 1 UNL1 -0.3357 + 31 C 4.2745 -1.1540 -1.7391 C.2 1 UNL1 0.2608 + 32 O 4.6758 -0.9348 -0.5970 O.2 1 UNL1 -0.2712 + 33 H 2.5566 1.3219 -3.3772 H 1 UNL1 0.0270 + 34 H 2.4492 0.7611 -1.6896 H 1 UNL1 0.0270 + 35 H 1.9937 -0.3053 -3.0237 H 1 UNL1 0.0270 + 36 H 4.8253 0.7659 -2.4777 H 1 UNL1 0.0829 + 37 H 4.5116 -1.1311 -6.5246 H 1 UNL1 0.0655 + 38 H 3.8669 -3.3590 -7.4020 H 1 UNL1 0.0619 + 39 H 3.1261 -5.1295 -5.8273 H 1 UNL1 0.0618 + 40 H 3.0545 -4.7203 -3.4337 H 1 UNL1 0.0637 + 41 H 2.9521 -4.2512 -1.5921 H 1 UNL1 0.0564 + 42 H 2.4451 -2.9212 -0.5938 H 1 UNL1 0.0564 + 43 H 4.9807 -6.1895 -1.7161 H 1 UNL1 0.0465 + 44 H 3.3558 -5.6644 -1.3280 H 1 UNL1 0.0465 + 45 H 3.7124 -8.0956 -0.8683 H 1 UNL1 0.0280 + 46 H 3.1769 -7.1812 0.5387 H 1 UNL1 0.0280 + 47 H 5.9903 -8.2015 -0.0442 H 1 UNL1 0.0266 + 48 H 4.9258 -8.6561 1.2800 H 1 UNL1 0.0266 + 49 H 6.6974 -7.0629 2.0367 H 1 UNL1 0.0288 + 50 H 5.0635 -6.4609 2.2775 H 1 UNL1 0.0288 + 51 H 6.4169 -4.6457 1.4177 H 1 UNL1 0.0599 + 52 H 8.9753 -8.9490 -1.0552 H 1 UNL1 0.0626 + 53 H 10.4940 -10.5443 -2.2000 H 1 UNL1 0.0633 + 54 H 11.9778 -9.6870 -4.0202 H 1 UNL1 0.0829 + 55 H 10.5125 -5.8576 -3.6342 H 1 UNL1 0.0837 +@BOND + 1 1 33 1 + 2 1 34 1 + 3 1 35 1 + 4 2 3 1 + 5 2 31 1 + 6 2 1 1 + 7 2 36 1 + 8 3 4 1 + 9 4 5 ar + 10 4 9 ar + 11 5 6 ar + 12 5 37 1 + 13 6 7 ar + 14 6 38 1 + 15 7 8 ar + 16 7 39 1 + 17 8 9 ar + 18 8 40 1 + 19 9 10 1 + 20 10 11 1 + 21 10 31 am + 22 11 12 1 + 23 11 41 1 + 24 11 42 1 + 25 12 13 2 + 26 12 14 am + 27 14 15 1 + 28 14 19 1 + 29 15 16 1 + 30 15 43 1 + 31 15 44 1 + 32 16 17 1 + 33 16 45 1 + 34 16 46 1 + 35 17 18 1 + 36 17 47 1 + 37 17 48 1 + 38 18 19 1 + 39 18 49 1 + 40 18 50 1 + 41 19 20 1 + 42 19 51 1 + 43 20 21 ar + 44 20 30 ar + 45 21 22 ar + 46 22 23 1 + 47 22 29 ar + 48 23 24 ar + 49 23 28 ar + 50 24 25 ar + 51 24 52 1 + 52 25 26 ar + 53 25 53 1 + 54 26 27 ar + 55 26 54 1 + 56 27 28 ar + 57 28 55 1 + 58 29 30 ar + 59 31 32 2 +@MOLECULE +***** + 55 59 0 0 0 +SMALL +GASTEIGER + +@ATOM + 1 C 3.7079 -0.2636 -2.4208 C.3 1 UNL1 -0.0190 + 2 C 3.6398 0.4321 -1.0593 C.3 1 UNL1 0.1732 + 3 O 4.6708 1.3967 -0.9531 O.3 1 UNL1 -0.4780 + 4 C 5.8694 0.8835 -0.5331 C.ar 1 UNL1 0.1429 + 5 C 6.9583 1.7485 -0.6878 C.ar 1 UNL1 -0.0180 + 6 C 8.2314 1.3415 -0.3067 C.ar 1 UNL1 -0.0582 + 7 C 8.4079 0.0744 0.2393 C.ar 1 UNL1 -0.0598 + 8 C 7.3151 -0.7860 0.4109 C.ar 1 UNL1 -0.0367 + 9 C 6.0267 -0.4009 0.0250 C.ar 1 UNL1 0.0787 + 10 N 4.8743 -1.2232 0.2334 N.am 1 UNL1 -0.2563 + 11 C 4.9406 -2.5673 0.8065 C.3 1 UNL1 0.0965 + 12 C 4.4070 -3.6941 -0.1078 C.2 1 UNL1 0.2340 + 13 O 3.5119 -3.4197 -0.9172 O.2 1 UNL1 -0.2738 + 14 N 4.8865 -4.9979 -0.0020 N.am 1 UNL1 -0.2884 + 15 C 4.2908 -6.0172 -0.8813 C.3 1 UNL1 0.0155 + 16 C 4.0184 -7.3270 -0.1490 C.3 1 UNL1 -0.0371 + 17 C 5.2268 -7.8170 0.6416 C.3 1 UNL1 -0.0495 + 18 C 5.8081 -6.7000 1.5094 C.3 1 UNL1 -0.0255 + 19 C 6.1196 -5.4213 0.7111 C.3 1 UNL1 0.1048 + 20 C 7.2484 -5.6016 -0.2736 C.ar 1 UNL1 0.2482 + 21 N 8.4841 -5.9760 -0.0560 N.ar 1 UNL1 -0.1897 + 22 C 9.0892 -5.7936 -1.2758 C.ar 1 UNL1 0.2036 + 23 C 10.5203 -5.9445 -1.4369 C.ar 1 UNL1 0.0405 + 24 C 11.2062 -5.1980 -2.4018 C.ar 1 UNL1 -0.0481 + 25 C 12.5687 -5.4004 -2.6042 C.ar 1 UNL1 -0.0429 + 26 C 13.2106 -6.3473 -1.8254 C.ar 1 UNL1 0.0276 + 27 N 12.5927 -7.0776 -0.8714 N.ar 1 UNL1 -0.2626 + 28 C 11.2628 -6.8595 -0.6988 C.ar 1 UNL1 0.0383 + 29 N 8.2397 -5.3909 -2.2405 N.ar 1 UNL1 -0.0560 + 30 O 7.0151 -5.2788 -1.5822 O.2 1 UNL1 -0.3357 + 31 C 3.6238 -0.6630 0.0019 C.2 1 UNL1 0.2608 + 32 O 2.5729 -1.1049 0.4644 O.2 1 UNL1 -0.2712 + 33 H 3.6465 0.4562 -3.2402 H 1 UNL1 0.0270 + 34 H 2.8951 -0.9901 -2.5207 H 1 UNL1 0.0270 + 35 H 4.6530 -0.8066 -2.5461 H 1 UNL1 0.0270 + 36 H 2.6916 0.9771 -0.9858 H 1 UNL1 0.0829 + 37 H 6.8091 2.7388 -1.1112 H 1 UNL1 0.0655 + 38 H 9.0795 2.0101 -0.4305 H 1 UNL1 0.0619 + 39 H 9.4004 -0.2492 0.5470 H 1 UNL1 0.0618 + 40 H 7.5151 -1.7456 0.8762 H 1 UNL1 0.0637 + 41 H 4.3954 -2.6162 1.7545 H 1 UNL1 0.0564 + 42 H 5.9825 -2.7872 1.0660 H 1 UNL1 0.0564 + 43 H 4.9807 -6.1895 -1.7161 H 1 UNL1 0.0465 + 44 H 3.3558 -5.6644 -1.3280 H 1 UNL1 0.0465 + 45 H 3.7124 -8.0956 -0.8683 H 1 UNL1 0.0280 + 46 H 3.1769 -7.1812 0.5387 H 1 UNL1 0.0280 + 47 H 5.9903 -8.2015 -0.0442 H 1 UNL1 0.0266 + 48 H 4.9258 -8.6561 1.2800 H 1 UNL1 0.0266 + 49 H 6.6974 -7.0629 2.0367 H 1 UNL1 0.0288 + 50 H 5.0635 -6.4609 2.2775 H 1 UNL1 0.0288 + 51 H 6.4169 -4.6457 1.4177 H 1 UNL1 0.0599 + 52 H 10.6784 -4.4670 -3.0102 H 1 UNL1 0.0626 + 53 H 13.1081 -4.8381 -3.3580 H 1 UNL1 0.0633 + 54 H 14.2688 -6.5536 -1.9582 H 1 UNL1 0.0829 + 55 H 10.8059 -7.4785 0.0698 H 1 UNL1 0.0837 +@BOND + 1 1 33 1 + 2 1 34 1 + 3 1 35 1 + 4 2 3 1 + 5 2 31 1 + 6 2 1 1 + 7 2 36 1 + 8 3 4 1 + 9 4 5 ar + 10 4 9 ar + 11 5 6 ar + 12 5 37 1 + 13 6 7 ar + 14 6 38 1 + 15 7 8 ar + 16 7 39 1 + 17 8 9 ar + 18 8 40 1 + 19 9 10 1 + 20 10 11 1 + 21 10 31 am + 22 11 12 1 + 23 11 41 1 + 24 11 42 1 + 25 12 13 2 + 26 12 14 am + 27 14 15 1 + 28 14 19 1 + 29 15 16 1 + 30 15 43 1 + 31 15 44 1 + 32 16 17 1 + 33 16 45 1 + 34 16 46 1 + 35 17 18 1 + 36 17 47 1 + 37 17 48 1 + 38 18 19 1 + 39 18 49 1 + 40 18 50 1 + 41 19 20 1 + 42 19 51 1 + 43 20 21 ar + 44 20 30 ar + 45 21 22 ar + 46 22 23 1 + 47 22 29 ar + 48 23 24 ar + 49 23 28 ar + 50 24 25 ar + 51 24 52 1 + 52 25 26 ar + 53 25 53 1 + 54 26 27 ar + 55 26 54 1 + 56 27 28 ar + 57 28 55 1 + 58 29 30 ar + 59 31 32 2 +@MOLECULE +***** + 55 59 0 0 0 +SMALL +GASTEIGER + +@ATOM + 1 C 3.4488 0.7207 -0.2050 C.3 1 UNL1 -0.0190 + 2 C 4.2464 0.3084 -1.4444 C.3 1 UNL1 0.1732 + 3 O 3.5874 0.7504 -2.6170 O.3 1 UNL1 -0.4780 + 4 C 2.6167 -0.1064 -3.0642 C.ar 1 UNL1 0.1429 + 5 C 1.7724 0.4311 -4.0421 C.ar 1 UNL1 -0.0180 + 6 C 0.7412 -0.3362 -4.5707 C.ar 1 UNL1 -0.0582 + 7 C 0.5664 -1.6429 -4.1273 C.ar 1 UNL1 -0.0598 + 8 C 1.4224 -2.1879 -3.1607 C.ar 1 UNL1 -0.0367 + 9 C 2.4604 -1.4305 -2.6076 C.ar 1 UNL1 0.0787 + 10 N 3.3924 -1.9629 -1.6614 N.am 1 UNL1 -0.2563 + 11 C 3.3102 -3.3243 -1.1328 C.3 1 UNL1 0.0965 + 12 C 4.4070 -3.6941 -0.1078 C.2 1 UNL1 0.2340 + 13 O 4.8800 -2.7936 0.5973 O.2 1 UNL1 -0.2738 + 14 N 4.8865 -4.9979 -0.0020 N.am 1 UNL1 -0.2884 + 15 C 4.2908 -6.0172 -0.8813 C.3 1 UNL1 0.0155 + 16 C 4.0184 -7.3270 -0.1490 C.3 1 UNL1 -0.0371 + 17 C 5.2268 -7.8170 0.6416 C.3 1 UNL1 -0.0495 + 18 C 5.8081 -6.7000 1.5094 C.3 1 UNL1 -0.0255 + 19 C 6.1196 -5.4213 0.7111 C.3 1 UNL1 0.1048 + 20 C 7.2484 -5.6016 -0.2736 C.ar 1 UNL1 0.2482 + 21 N 7.9498 -6.6746 -0.5406 N.ar 1 UNL1 -0.1897 + 22 C 8.9357 -6.2080 -1.3759 C.ar 1 UNL1 0.2036 + 23 C 10.0355 -7.0544 -1.7894 C.ar 1 UNL1 0.0405 + 24 C 10.4928 -8.0792 -0.9531 C.ar 1 UNL1 -0.0481 + 25 C 11.5978 -8.8417 -1.3215 C.ar 1 UNL1 -0.0429 + 26 C 12.2140 -8.5577 -2.5276 C.ar 1 UNL1 0.0276 + 27 N 11.7967 -7.5905 -3.3736 N.ar 1 UNL1 -0.2626 + 28 C 10.7176 -6.8616 -2.9856 C.ar 1 UNL1 0.0383 + 29 N 8.8072 -4.9020 -1.6794 N.ar 1 UNL1 -0.0560 + 30 O 7.6795 -4.5016 -0.9628 O.2 1 UNL1 -0.3357 + 31 C 4.5007 -1.1912 -1.3338 C.2 1 UNL1 0.2608 + 32 O 5.5328 -1.6407 -0.8376 O.2 1 UNL1 -0.2712 + 33 H 3.2913 1.8012 -0.1731 H 1 UNL1 0.0270 + 34 H 3.9682 0.4075 0.7064 H 1 UNL1 0.0270 + 35 H 2.4553 0.2552 -0.1951 H 1 UNL1 0.0270 + 36 H 5.2203 0.8110 -1.4235 H 1 UNL1 0.0829 + 37 H 1.9204 1.4520 -4.3855 H 1 UNL1 0.0655 + 38 H 0.0812 0.0810 -5.3270 H 1 UNL1 0.0619 + 39 H -0.2343 -2.2528 -4.5415 H 1 UNL1 0.0618 + 40 H 1.2544 -3.2240 -2.8855 H 1 UNL1 0.0637 + 41 H 3.3429 -4.0612 -1.9417 H 1 UNL1 0.0564 + 42 H 2.3289 -3.4601 -0.6639 H 1 UNL1 0.0564 + 43 H 4.9807 -6.1895 -1.7161 H 1 UNL1 0.0465 + 44 H 3.3558 -5.6644 -1.3280 H 1 UNL1 0.0465 + 45 H 3.7124 -8.0956 -0.8683 H 1 UNL1 0.0280 + 46 H 3.1769 -7.1812 0.5387 H 1 UNL1 0.0280 + 47 H 5.9903 -8.2015 -0.0442 H 1 UNL1 0.0266 + 48 H 4.9258 -8.6561 1.2800 H 1 UNL1 0.0266 + 49 H 6.6974 -7.0629 2.0367 H 1 UNL1 0.0288 + 50 H 5.0635 -6.4609 2.2775 H 1 UNL1 0.0288 + 51 H 6.4169 -4.6457 1.4177 H 1 UNL1 0.0599 + 52 H 9.9994 -8.2770 -0.0042 H 1 UNL1 0.0626 + 53 H 11.9698 -9.6293 -0.6758 H 1 UNL1 0.0633 + 54 H 13.0900 -9.1131 -2.8503 H 1 UNL1 0.0829 + 55 H 10.4262 -6.0870 -3.6911 H 1 UNL1 0.0837 +@BOND + 1 1 33 1 + 2 1 34 1 + 3 1 35 1 + 4 2 3 1 + 5 2 31 1 + 6 2 1 1 + 7 2 36 1 + 8 3 4 1 + 9 4 5 ar + 10 4 9 ar + 11 5 6 ar + 12 5 37 1 + 13 6 7 ar + 14 6 38 1 + 15 7 8 ar + 16 7 39 1 + 17 8 9 ar + 18 8 40 1 + 19 9 10 1 + 20 10 11 1 + 21 10 31 am + 22 11 12 1 + 23 11 41 1 + 24 11 42 1 + 25 12 13 2 + 26 12 14 am + 27 14 15 1 + 28 14 19 1 + 29 15 16 1 + 30 15 43 1 + 31 15 44 1 + 32 16 17 1 + 33 16 45 1 + 34 16 46 1 + 35 17 18 1 + 36 17 47 1 + 37 17 48 1 + 38 18 19 1 + 39 18 49 1 + 40 18 50 1 + 41 19 20 1 + 42 19 51 1 + 43 20 21 ar + 44 20 30 ar + 45 21 22 ar + 46 22 23 1 + 47 22 29 ar + 48 23 24 ar + 49 23 28 ar + 50 24 25 ar + 51 24 52 1 + 52 25 26 ar + 53 25 53 1 + 54 26 27 ar + 55 26 54 1 + 56 27 28 ar + 57 28 55 1 + 58 29 30 ar + 59 31 32 2 +@MOLECULE +***** + 55 59 0 0 0 +SMALL +GASTEIGER + +@ATOM + 1 C 2.2570 0.6522 -0.5667 C.3 1 UNL1 -0.0190 + 2 C 3.6131 0.4263 -1.2391 C.3 1 UNL1 0.1732 + 3 O 3.5357 0.7546 -2.6143 O.3 1 UNL1 -0.4780 + 4 C 3.0731 -0.2655 -3.4029 C.ar 1 UNL1 0.1429 + 5 C 2.7257 0.1168 -4.7033 C.ar 1 UNL1 -0.0180 + 6 C 2.2345 -0.8256 -5.5990 C.ar 1 UNL1 -0.0582 + 7 C 2.1043 -2.1497 -5.1934 C.ar 1 UNL1 -0.0598 + 8 C 2.4685 -2.5368 -3.8967 C.ar 1 UNL1 -0.0367 + 9 C 2.9555 -1.6032 -2.9756 C.ar 1 UNL1 0.0787 + 10 N 3.3924 -1.9629 -1.6614 N.am 1 UNL1 -0.2563 + 11 C 3.3102 -3.3243 -1.1328 C.3 1 UNL1 0.0965 + 12 C 4.4070 -3.6941 -0.1078 C.2 1 UNL1 0.2340 + 13 O 4.8800 -2.7936 0.5973 O.2 1 UNL1 -0.2738 + 14 N 4.8865 -4.9979 -0.0020 N.am 1 UNL1 -0.2884 + 15 C 4.2908 -6.0172 -0.8813 C.3 1 UNL1 0.0155 + 16 C 4.0184 -7.3270 -0.1490 C.3 1 UNL1 -0.0371 + 17 C 5.2268 -7.8170 0.6416 C.3 1 UNL1 -0.0495 + 18 C 5.8081 -6.7000 1.5094 C.3 1 UNL1 -0.0255 + 19 C 6.1196 -5.4213 0.7111 C.3 1 UNL1 0.1048 + 20 C 7.2484 -5.6016 -0.2736 C.ar 1 UNL1 0.2482 + 21 N 7.9498 -6.6746 -0.5406 N.ar 1 UNL1 -0.1897 + 22 C 8.9357 -6.2080 -1.3759 C.ar 1 UNL1 0.2036 + 23 C 10.0355 -7.0544 -1.7894 C.ar 1 UNL1 0.0405 + 24 C 10.6432 -6.8660 -3.0360 C.ar 1 UNL1 -0.0481 + 25 C 11.6497 -7.7289 -3.4609 C.ar 1 UNL1 -0.0429 + 26 C 12.0252 -8.7594 -2.6169 C.ar 1 UNL1 0.0276 + 27 N 11.4788 -8.9683 -1.3991 N.ar 1 UNL1 -0.2626 + 28 C 10.4974 -8.1115 -1.0133 C.ar 1 UNL1 0.0383 + 29 N 8.8072 -4.9020 -1.6794 N.ar 1 UNL1 -0.0560 + 30 O 7.6795 -4.5016 -0.9628 O.2 1 UNL1 -0.3357 + 31 C 4.0460 -0.9974 -0.9052 C.2 1 UNL1 0.2608 + 32 O 4.7714 -1.2477 0.0564 O.2 1 UNL1 -0.2712 + 33 H 1.9133 1.6808 -0.6974 H 1 UNL1 0.0270 + 34 H 2.3179 0.4282 0.5031 H 1 UNL1 0.0270 + 35 H 1.4840 0.0028 -0.9963 H 1 UNL1 0.0270 + 36 H 4.3479 1.1077 -0.7948 H 1 UNL1 0.0829 + 37 H 2.8358 1.1535 -5.0121 H 1 UNL1 0.0655 + 38 H 1.9596 -0.5298 -6.6082 H 1 UNL1 0.0619 + 39 H 1.7273 -2.8951 -5.8911 H 1 UNL1 0.0618 + 40 H 2.3770 -3.5909 -3.6560 H 1 UNL1 0.0637 + 41 H 3.3429 -4.0612 -1.9417 H 1 UNL1 0.0564 + 42 H 2.3289 -3.4601 -0.6639 H 1 UNL1 0.0564 + 43 H 4.9807 -6.1895 -1.7161 H 1 UNL1 0.0465 + 44 H 3.3558 -5.6644 -1.3280 H 1 UNL1 0.0465 + 45 H 3.7124 -8.0956 -0.8683 H 1 UNL1 0.0280 + 46 H 3.1769 -7.1812 0.5387 H 1 UNL1 0.0280 + 47 H 5.9903 -8.2015 -0.0442 H 1 UNL1 0.0266 + 48 H 4.9258 -8.6561 1.2800 H 1 UNL1 0.0266 + 49 H 6.6974 -7.0629 2.0367 H 1 UNL1 0.0288 + 50 H 5.0635 -6.4609 2.2775 H 1 UNL1 0.0288 + 51 H 6.4169 -4.6457 1.4177 H 1 UNL1 0.0599 + 52 H 10.3238 -6.0557 -3.6874 H 1 UNL1 0.0626 + 53 H 12.1186 -7.6014 -4.4301 H 1 UNL1 0.0633 + 54 H 12.7933 -9.4689 -2.9112 H 1 UNL1 0.0829 + 55 H 10.0788 -8.3261 -0.0328 H 1 UNL1 0.0837 +@BOND + 1 1 33 1 + 2 1 34 1 + 3 1 35 1 + 4 2 3 1 + 5 2 31 1 + 6 2 1 1 + 7 2 36 1 + 8 3 4 1 + 9 4 5 ar + 10 4 9 ar + 11 5 6 ar + 12 5 37 1 + 13 6 7 ar + 14 6 38 1 + 15 7 8 ar + 16 7 39 1 + 17 8 9 ar + 18 8 40 1 + 19 9 10 1 + 20 10 11 1 + 21 10 31 am + 22 11 12 1 + 23 11 41 1 + 24 11 42 1 + 25 12 13 2 + 26 12 14 am + 27 14 15 1 + 28 14 19 1 + 29 15 16 1 + 30 15 43 1 + 31 15 44 1 + 32 16 17 1 + 33 16 45 1 + 34 16 46 1 + 35 17 18 1 + 36 17 47 1 + 37 17 48 1 + 38 18 19 1 + 39 18 49 1 + 40 18 50 1 + 41 19 20 1 + 42 19 51 1 + 43 20 21 ar + 44 20 30 ar + 45 21 22 ar + 46 22 23 1 + 47 22 29 ar + 48 23 24 ar + 49 23 28 ar + 50 24 25 ar + 51 24 52 1 + 52 25 26 ar + 53 25 53 1 + 54 26 27 ar + 55 26 54 1 + 56 27 28 ar + 57 28 55 1 + 58 29 30 ar + 59 31 32 2 +@MOLECULE +***** + 55 59 0 0 0 +SMALL +GASTEIGER + +@ATOM + 1 C 6.7229 -4.0146 4.2664 C.3 1 UNL1 -0.0190 + 2 C 5.7653 -2.8381 4.4693 C.3 1 UNL1 0.1732 + 3 O 4.5665 -3.2849 5.0759 O.3 1 UNL1 -0.4780 + 4 C 3.6430 -3.7702 4.1881 C.ar 1 UNL1 0.1429 + 5 C 2.5813 -4.4665 4.7761 C.ar 1 UNL1 -0.0180 + 6 C 1.5825 -5.0156 3.9808 C.ar 1 UNL1 -0.0582 + 7 C 1.6438 -4.8553 2.6005 C.ar 1 UNL1 -0.0598 + 8 C 2.6975 -4.1430 2.0120 C.ar 1 UNL1 -0.0367 + 9 C 3.7188 -3.5906 2.7924 C.ar 1 UNL1 0.0787 + 10 N 4.7822 -2.8083 2.2405 N.am 1 UNL1 -0.2563 + 11 C 4.9406 -2.5673 0.8065 C.3 1 UNL1 0.0965 + 12 C 4.4070 -3.6941 -0.1078 C.2 1 UNL1 0.2340 + 13 O 3.5119 -3.4197 -0.9172 O.2 1 UNL1 -0.2738 + 14 N 4.8865 -4.9979 -0.0020 N.am 1 UNL1 -0.2884 + 15 C 4.2908 -6.0172 -0.8813 C.3 1 UNL1 0.0155 + 16 C 4.0184 -7.3270 -0.1490 C.3 1 UNL1 -0.0371 + 17 C 5.2268 -7.8170 0.6416 C.3 1 UNL1 -0.0495 + 18 C 5.8081 -6.7000 1.5094 C.3 1 UNL1 -0.0255 + 19 C 6.1196 -5.4213 0.7111 C.3 1 UNL1 0.1048 + 20 C 7.2484 -5.6016 -0.2736 C.ar 1 UNL1 0.2482 + 21 N 7.4584 -4.9903 -1.4123 N.ar 1 UNL1 -0.1897 + 22 C 8.5221 -5.6754 -1.9475 C.ar 1 UNL1 0.2036 + 23 C 8.9829 -5.4172 -3.2958 C.ar 1 UNL1 0.0405 + 24 C 9.5694 -6.4392 -4.0509 C.ar 1 UNL1 -0.0481 + 25 C 10.0787 -6.1686 -5.3180 C.ar 1 UNL1 -0.0429 + 26 C 9.9804 -4.8743 -5.7980 C.ar 1 UNL1 0.0276 + 27 N 9.4073 -3.8614 -5.1118 N.ar 1 UNL1 -0.2626 + 28 C 8.9218 -4.1557 -3.8774 C.ar 1 UNL1 0.0383 + 29 N 9.0067 -6.6332 -1.1338 N.ar 1 UNL1 -0.0560 + 30 O 8.1741 -6.5751 -0.0162 O.2 1 UNL1 -0.3357 + 31 C 5.6237 -2.1394 3.1213 C.2 1 UNL1 0.2608 + 32 O 6.3265 -1.1789 2.8098 O.2 1 UNL1 -0.2712 + 33 H 6.9358 -4.5231 5.2095 H 1 UNL1 0.0270 + 34 H 7.6637 -3.6708 3.8246 H 1 UNL1 0.0270 + 35 H 6.2962 -4.7661 3.5905 H 1 UNL1 0.0270 + 36 H 6.2218 -2.1244 5.1649 H 1 UNL1 0.0829 + 37 H 2.5400 -4.5821 5.8564 H 1 UNL1 0.0655 + 38 H 0.7593 -5.5610 4.4352 H 1 UNL1 0.0619 + 39 H 0.8617 -5.2760 1.9713 H 1 UNL1 0.0618 + 40 H 2.6662 -4.0231 0.9340 H 1 UNL1 0.0637 + 41 H 5.9914 -2.3960 0.5518 H 1 UNL1 0.0564 + 42 H 4.4295 -1.6325 0.5492 H 1 UNL1 0.0564 + 43 H 4.9807 -6.1895 -1.7161 H 1 UNL1 0.0465 + 44 H 3.3558 -5.6644 -1.3280 H 1 UNL1 0.0465 + 45 H 3.7124 -8.0956 -0.8683 H 1 UNL1 0.0280 + 46 H 3.1769 -7.1812 0.5387 H 1 UNL1 0.0280 + 47 H 5.9903 -8.2015 -0.0442 H 1 UNL1 0.0266 + 48 H 4.9258 -8.6561 1.2800 H 1 UNL1 0.0266 + 49 H 6.6974 -7.0629 2.0367 H 1 UNL1 0.0288 + 50 H 5.0635 -6.4609 2.2775 H 1 UNL1 0.0288 + 51 H 6.4169 -4.6457 1.4177 H 1 UNL1 0.0599 + 52 H 9.6458 -7.4468 -3.6483 H 1 UNL1 0.0626 + 53 H 10.5475 -6.9488 -5.9069 H 1 UNL1 0.0633 + 54 H 10.3787 -4.6100 -6.7734 H 1 UNL1 0.0829 + 55 H 8.4820 -3.3077 -3.3578 H 1 UNL1 0.0837 +@BOND + 1 1 33 1 + 2 1 34 1 + 3 1 35 1 + 4 2 3 1 + 5 2 31 1 + 6 2 1 1 + 7 2 36 1 + 8 3 4 1 + 9 4 5 ar + 10 4 9 ar + 11 5 6 ar + 12 5 37 1 + 13 6 7 ar + 14 6 38 1 + 15 7 8 ar + 16 7 39 1 + 17 8 9 ar + 18 8 40 1 + 19 9 10 1 + 20 10 11 1 + 21 10 31 am + 22 11 12 1 + 23 11 41 1 + 24 11 42 1 + 25 12 13 2 + 26 12 14 am + 27 14 15 1 + 28 14 19 1 + 29 15 16 1 + 30 15 43 1 + 31 15 44 1 + 32 16 17 1 + 33 16 45 1 + 34 16 46 1 + 35 17 18 1 + 36 17 47 1 + 37 17 48 1 + 38 18 19 1 + 39 18 49 1 + 40 18 50 1 + 41 19 20 1 + 42 19 51 1 + 43 20 21 ar + 44 20 30 ar + 45 21 22 ar + 46 22 23 1 + 47 22 29 ar + 48 23 24 ar + 49 23 28 ar + 50 24 25 ar + 51 24 52 1 + 52 25 26 ar + 53 25 53 1 + 54 26 27 ar + 55 26 54 1 + 56 27 28 ar + 57 28 55 1 + 58 29 30 ar + 59 31 32 2 +@MOLECULE +***** + 55 59 0 0 0 +SMALL +GASTEIGER + +@ATOM + 1 C 5.2240 -1.3231 4.7580 C.3 1 UNL1 -0.0190 + 2 C 3.8495 -1.1344 4.1120 C.3 1 UNL1 0.1732 + 3 O 2.9336 -2.0818 4.6300 O.3 1 UNL1 -0.4780 + 4 C 2.9696 -3.2939 3.9929 C.ar 1 UNL1 0.1429 + 5 C 2.2866 -4.3196 4.6558 C.ar 1 UNL1 -0.0180 + 6 C 2.2565 -5.5996 4.1152 C.ar 1 UNL1 -0.0582 + 7 C 2.8998 -5.8455 2.9068 C.ar 1 UNL1 -0.0598 + 8 C 3.5692 -4.8148 2.2334 C.ar 1 UNL1 -0.0367 + 9 C 3.6210 -3.5214 2.7641 C.ar 1 UNL1 0.0787 + 10 N 4.2434 -2.4266 2.0847 N.am 1 UNL1 -0.2563 + 11 C 4.9406 -2.5673 0.8065 C.3 1 UNL1 0.0965 + 12 C 4.4070 -3.6941 -0.1078 C.2 1 UNL1 0.2340 + 13 O 3.5119 -3.4197 -0.9172 O.2 1 UNL1 -0.2738 + 14 N 4.8865 -4.9979 -0.0020 N.am 1 UNL1 -0.2884 + 15 C 4.2908 -6.0172 -0.8813 C.3 1 UNL1 0.0155 + 16 C 4.0184 -7.3270 -0.1490 C.3 1 UNL1 -0.0371 + 17 C 5.2268 -7.8170 0.6416 C.3 1 UNL1 -0.0495 + 18 C 5.8081 -6.7000 1.5094 C.3 1 UNL1 -0.0255 + 19 C 6.1196 -5.4213 0.7111 C.3 1 UNL1 0.1048 + 20 C 7.2484 -5.6016 -0.2736 C.ar 1 UNL1 0.2482 + 21 N 7.1985 -5.9525 -1.5341 N.ar 1 UNL1 -0.1897 + 22 C 8.5203 -6.1214 -1.8679 C.ar 1 UNL1 0.2036 + 23 C 8.9094 -6.6682 -3.1511 C.ar 1 UNL1 0.0405 + 24 C 10.0906 -7.4083 -3.2760 C.ar 1 UNL1 -0.0481 + 25 C 10.4990 -7.8681 -4.5250 C.ar 1 UNL1 -0.0429 + 26 C 9.7043 -7.5762 -5.6198 C.ar 1 UNL1 0.0276 + 27 N 8.5485 -6.8808 -5.5434 N.ar 1 UNL1 -0.2626 + 28 C 8.1776 -6.4432 -4.3118 C.ar 1 UNL1 0.0383 + 29 N 9.3690 -5.8120 -0.8687 N.ar 1 UNL1 -0.0560 + 30 O 8.5285 -5.4511 0.1843 O.2 1 UNL1 -0.3357 + 31 C 4.0595 -1.1498 2.6016 C.2 1 UNL1 0.2608 + 32 O 4.2184 -0.1143 1.9567 O.2 1 UNL1 -0.2712 + 33 H 5.1672 -1.2474 5.8462 H 1 UNL1 0.0270 + 34 H 5.9293 -0.5745 4.3832 H 1 UNL1 0.0270 + 35 H 5.6409 -2.3122 4.5304 H 1 UNL1 0.0270 + 36 H 3.4631 -0.1447 4.3816 H 1 UNL1 0.0829 + 37 H 1.7827 -4.1160 5.5975 H 1 UNL1 0.0655 + 38 H 1.7305 -6.3990 4.6310 H 1 UNL1 0.0619 + 39 H 2.8748 -6.8434 2.4732 H 1 UNL1 0.0618 + 40 H 4.0188 -5.0646 1.2779 H 1 UNL1 0.0637 + 41 H 6.0110 -2.7372 0.9608 H 1 UNL1 0.0564 + 42 H 4.8786 -1.6156 0.2663 H 1 UNL1 0.0564 + 43 H 4.9807 -6.1895 -1.7161 H 1 UNL1 0.0465 + 44 H 3.3558 -5.6644 -1.3280 H 1 UNL1 0.0465 + 45 H 3.7124 -8.0956 -0.8683 H 1 UNL1 0.0280 + 46 H 3.1769 -7.1812 0.5387 H 1 UNL1 0.0280 + 47 H 5.9903 -8.2015 -0.0442 H 1 UNL1 0.0266 + 48 H 4.9258 -8.6561 1.2800 H 1 UNL1 0.0266 + 49 H 6.6974 -7.0629 2.0367 H 1 UNL1 0.0288 + 50 H 5.0635 -6.4609 2.2775 H 1 UNL1 0.0288 + 51 H 6.4169 -4.6457 1.4177 H 1 UNL1 0.0599 + 52 H 10.7051 -7.6160 -2.4029 H 1 UNL1 0.0626 + 53 H 11.4190 -8.4307 -4.6365 H 1 UNL1 0.0633 + 54 H 9.9898 -7.8980 -6.6172 H 1 UNL1 0.0829 + 55 H 7.2487 -5.8777 -4.3010 H 1 UNL1 0.0837 +@BOND + 1 1 33 1 + 2 1 34 1 + 3 1 35 1 + 4 2 3 1 + 5 2 31 1 + 6 2 1 1 + 7 2 36 1 + 8 3 4 1 + 9 4 5 ar + 10 4 9 ar + 11 5 6 ar + 12 5 37 1 + 13 6 7 ar + 14 6 38 1 + 15 7 8 ar + 16 7 39 1 + 17 8 9 ar + 18 8 40 1 + 19 9 10 1 + 20 10 11 1 + 21 10 31 am + 22 11 12 1 + 23 11 41 1 + 24 11 42 1 + 25 12 13 2 + 26 12 14 am + 27 14 15 1 + 28 14 19 1 + 29 15 16 1 + 30 15 43 1 + 31 15 44 1 + 32 16 17 1 + 33 16 45 1 + 34 16 46 1 + 35 17 18 1 + 36 17 47 1 + 37 17 48 1 + 38 18 19 1 + 39 18 49 1 + 40 18 50 1 + 41 19 20 1 + 42 19 51 1 + 43 20 21 ar + 44 20 30 ar + 45 21 22 ar + 46 22 23 1 + 47 22 29 ar + 48 23 24 ar + 49 23 28 ar + 50 24 25 ar + 51 24 52 1 + 52 25 26 ar + 53 25 53 1 + 54 26 27 ar + 55 26 54 1 + 56 27 28 ar + 57 28 55 1 + 58 29 30 ar + 59 31 32 2 +@MOLECULE +***** + 55 59 0 0 0 +SMALL +GASTEIGER + +@ATOM + 1 C 0.0227 -0.9961 -2.1398 C.3 1 UNL1 -0.0190 + 2 C 0.2541 -1.1829 -0.6386 C.3 1 UNL1 0.1732 + 3 O 0.7440 0.0169 -0.0682 O.3 1 UNL1 -0.4780 + 4 C 2.1019 0.1655 -0.1701 C.ar 1 UNL1 0.1429 + 5 C 2.5701 1.4498 0.1287 C.ar 1 UNL1 -0.0180 + 6 C 3.9291 1.7311 0.0535 C.ar 1 UNL1 -0.0582 + 7 C 4.8158 0.7225 -0.3087 C.ar 1 UNL1 -0.0598 + 8 C 4.3496 -0.5686 -0.5910 C.ar 1 UNL1 -0.0367 + 9 C 2.9851 -0.8715 -0.5316 C.ar 1 UNL1 0.0787 + 10 N 2.4704 -2.1876 -0.7559 N.am 1 UNL1 -0.2563 + 11 C 3.3102 -3.3243 -1.1328 C.3 1 UNL1 0.0965 + 12 C 4.4070 -3.6941 -0.1078 C.2 1 UNL1 0.2340 + 13 O 4.8800 -2.7936 0.5973 O.2 1 UNL1 -0.2738 + 14 N 4.8865 -4.9979 -0.0020 N.am 1 UNL1 -0.2884 + 15 C 4.2908 -6.0172 -0.8813 C.3 1 UNL1 0.0155 + 16 C 4.0184 -7.3270 -0.1490 C.3 1 UNL1 -0.0371 + 17 C 5.2268 -7.8170 0.6416 C.3 1 UNL1 -0.0495 + 18 C 5.8081 -6.7000 1.5094 C.3 1 UNL1 -0.0255 + 19 C 6.1196 -5.4213 0.7111 C.3 1 UNL1 0.1048 + 20 C 7.2484 -5.6016 -0.2736 C.ar 1 UNL1 0.2482 + 21 N 7.9498 -6.6746 -0.5406 N.ar 1 UNL1 -0.1897 + 22 C 8.9357 -6.2080 -1.3759 C.ar 1 UNL1 0.2036 + 23 C 10.0355 -7.0544 -1.7894 C.ar 1 UNL1 0.0405 + 24 C 11.2896 -6.4991 -2.0680 C.ar 1 UNL1 -0.0481 + 25 C 12.3229 -7.3055 -2.5371 C.ar 1 UNL1 -0.0429 + 26 C 12.0705 -8.6552 -2.7097 C.ar 1 UNL1 0.0276 + 27 N 10.8819 -9.2367 -2.4372 N.ar 1 UNL1 -0.2626 + 28 C 9.8923 -8.4237 -1.9834 C.ar 1 UNL1 0.0383 + 29 N 8.8072 -4.9020 -1.6794 N.ar 1 UNL1 -0.0560 + 30 O 7.6795 -4.5016 -0.9628 O.2 1 UNL1 -0.3357 + 31 C 1.1301 -2.4201 -0.4718 C.2 1 UNL1 0.2608 + 32 O 0.6494 -3.5352 -0.2743 O.2 1 UNL1 -0.2712 + 33 H -0.6624 -0.1687 -2.3380 H 1 UNL1 0.0270 + 34 H -0.3840 -1.9114 -2.5815 H 1 UNL1 0.0270 + 35 H 0.9588 -0.7648 -2.6634 H 1 UNL1 0.0270 + 36 H -0.7070 -1.3910 -0.1542 H 1 UNL1 0.0829 + 37 H 1.8693 2.2300 0.4155 H 1 UNL1 0.0655 + 38 H 4.2945 2.7294 0.2806 H 1 UNL1 0.0619 + 39 H 5.8823 0.9327 -0.3628 H 1 UNL1 0.0618 + 40 H 5.0968 -1.3179 -0.8312 H 1 UNL1 0.0637 + 41 H 3.7964 -3.1491 -2.0979 H 1 UNL1 0.0564 + 42 H 2.6676 -4.1977 -1.2925 H 1 UNL1 0.0564 + 43 H 4.9807 -6.1895 -1.7161 H 1 UNL1 0.0465 + 44 H 3.3558 -5.6644 -1.3280 H 1 UNL1 0.0465 + 45 H 3.7124 -8.0956 -0.8683 H 1 UNL1 0.0280 + 46 H 3.1769 -7.1812 0.5387 H 1 UNL1 0.0280 + 47 H 5.9903 -8.2015 -0.0442 H 1 UNL1 0.0266 + 48 H 4.9258 -8.6561 1.2800 H 1 UNL1 0.0266 + 49 H 6.6974 -7.0629 2.0367 H 1 UNL1 0.0288 + 50 H 5.0635 -6.4609 2.2775 H 1 UNL1 0.0288 + 51 H 6.4169 -4.6457 1.4177 H 1 UNL1 0.0599 + 52 H 11.4616 -5.4332 -1.9355 H 1 UNL1 0.0626 + 53 H 13.2947 -6.8846 -2.7694 H 1 UNL1 0.0633 + 54 H 12.8394 -9.3217 -3.0900 H 1 UNL1 0.0829 + 55 H 8.9510 -8.9329 -1.7902 H 1 UNL1 0.0837 +@BOND + 1 1 33 1 + 2 1 34 1 + 3 1 35 1 + 4 2 3 1 + 5 2 31 1 + 6 2 1 1 + 7 2 36 1 + 8 3 4 1 + 9 4 5 ar + 10 4 9 ar + 11 5 6 ar + 12 5 37 1 + 13 6 7 ar + 14 6 38 1 + 15 7 8 ar + 16 7 39 1 + 17 8 9 ar + 18 8 40 1 + 19 9 10 1 + 20 10 11 1 + 21 10 31 am + 22 11 12 1 + 23 11 41 1 + 24 11 42 1 + 25 12 13 2 + 26 12 14 am + 27 14 15 1 + 28 14 19 1 + 29 15 16 1 + 30 15 43 1 + 31 15 44 1 + 32 16 17 1 + 33 16 45 1 + 34 16 46 1 + 35 17 18 1 + 36 17 47 1 + 37 17 48 1 + 38 18 19 1 + 39 18 49 1 + 40 18 50 1 + 41 19 20 1 + 42 19 51 1 + 43 20 21 ar + 44 20 30 ar + 45 21 22 ar + 46 22 23 1 + 47 22 29 ar + 48 23 24 ar + 49 23 28 ar + 50 24 25 ar + 51 24 52 1 + 52 25 26 ar + 53 25 53 1 + 54 26 27 ar + 55 26 54 1 + 56 27 28 ar + 57 28 55 1 + 58 29 30 ar + 59 31 32 2 +@MOLECULE +***** + 55 59 0 0 0 +SMALL +GASTEIGER + +@ATOM + 1 C 0.7962 -1.7159 1.7542 C.3 1 UNL1 -0.0190 + 2 C 1.6388 -0.6975 0.9828 C.3 1 UNL1 0.1732 + 3 O 0.8226 0.0259 0.0799 O.3 1 UNL1 -0.4780 + 4 C 0.6365 -0.6009 -1.1238 C.ar 1 UNL1 0.1429 + 5 C -0.3775 -0.0503 -1.9153 C.ar 1 UNL1 -0.0180 + 6 C -0.6699 -0.6023 -3.1568 C.ar 1 UNL1 -0.0582 + 7 C 0.0620 -1.6961 -3.6068 C.ar 1 UNL1 -0.0598 + 8 C 1.0895 -2.2374 -2.8224 C.ar 1 UNL1 -0.0367 + 9 C 1.3941 -1.7041 -1.5654 C.ar 1 UNL1 0.0787 + 10 N 2.4704 -2.1876 -0.7559 N.am 1 UNL1 -0.2563 + 11 C 3.3102 -3.3243 -1.1328 C.3 1 UNL1 0.0965 + 12 C 4.4070 -3.6941 -0.1078 C.2 1 UNL1 0.2340 + 13 O 4.8800 -2.7936 0.5973 O.2 1 UNL1 -0.2738 + 14 N 4.8865 -4.9979 -0.0020 N.am 1 UNL1 -0.2884 + 15 C 4.2908 -6.0172 -0.8813 C.3 1 UNL1 0.0155 + 16 C 4.0184 -7.3270 -0.1490 C.3 1 UNL1 -0.0371 + 17 C 5.2268 -7.8170 0.6416 C.3 1 UNL1 -0.0495 + 18 C 5.8081 -6.7000 1.5094 C.3 1 UNL1 -0.0255 + 19 C 6.1196 -5.4213 0.7111 C.3 1 UNL1 0.1048 + 20 C 7.2484 -5.6016 -0.2736 C.ar 1 UNL1 0.2482 + 21 N 7.2473 -5.4369 -1.5726 N.ar 1 UNL1 -0.1897 + 22 C 8.4814 -5.9061 -1.9519 C.ar 1 UNL1 0.2036 + 23 C 8.8358 -6.0506 -3.3485 C.ar 1 UNL1 0.0405 + 24 C 7.8503 -6.3240 -4.3038 C.ar 1 UNL1 -0.0481 + 25 C 8.2047 -6.5363 -5.6332 C.ar 1 UNL1 -0.0429 + 26 C 9.5447 -6.4628 -5.9711 C.ar 1 UNL1 0.0276 + 27 N 10.5271 -6.1846 -5.0863 N.ar 1 UNL1 -0.2626 + 28 C 10.1505 -5.9848 -3.7962 C.ar 1 UNL1 0.0383 + 29 N 9.2546 -6.2801 -0.9142 N.ar 1 UNL1 -0.0560 + 30 O 8.4452 -6.0636 0.2009 O.2 1 UNL1 -0.3357 + 31 C 2.8133 -1.4574 0.3757 C.2 1 UNL1 0.2608 + 32 O 3.9003 -1.5380 0.9463 O.2 1 UNL1 -0.2712 + 33 H -0.0279 -1.2326 2.2838 H 1 UNL1 0.0270 + 34 H 1.4161 -2.2583 2.4752 H 1 UNL1 0.0270 + 35 H 0.3485 -2.4573 1.0806 H 1 UNL1 0.0270 + 36 H 2.0482 0.0331 1.6900 H 1 UNL1 0.0829 + 37 H -0.9407 0.8078 -1.5566 H 1 UNL1 0.0655 + 38 H -1.4604 -0.1790 -3.7713 H 1 UNL1 0.0619 + 39 H -0.1558 -2.1297 -4.5810 H 1 UNL1 0.0618 + 40 H 1.6458 -3.0664 -3.2474 H 1 UNL1 0.0637 + 41 H 3.7964 -3.1491 -2.0979 H 1 UNL1 0.0564 + 42 H 2.6676 -4.1977 -1.2925 H 1 UNL1 0.0564 + 43 H 4.9807 -6.1895 -1.7161 H 1 UNL1 0.0465 + 44 H 3.3558 -5.6644 -1.3280 H 1 UNL1 0.0465 + 45 H 3.7124 -8.0956 -0.8683 H 1 UNL1 0.0280 + 46 H 3.1769 -7.1812 0.5387 H 1 UNL1 0.0280 + 47 H 5.9903 -8.2015 -0.0442 H 1 UNL1 0.0266 + 48 H 4.9258 -8.6561 1.2800 H 1 UNL1 0.0266 + 49 H 6.6974 -7.0629 2.0367 H 1 UNL1 0.0288 + 50 H 5.0635 -6.4609 2.2775 H 1 UNL1 0.0288 + 51 H 6.4169 -4.6457 1.4177 H 1 UNL1 0.0599 + 52 H 6.8042 -6.3881 -4.0129 H 1 UNL1 0.0626 + 53 H 7.4518 -6.7623 -6.3799 H 1 UNL1 0.0633 + 54 H 9.8726 -6.6382 -6.9918 H 1 UNL1 0.0829 + 55 H 10.9753 -5.7771 -3.1185 H 1 UNL1 0.0837 +@BOND + 1 1 33 1 + 2 1 34 1 + 3 1 35 1 + 4 2 3 1 + 5 2 31 1 + 6 2 1 1 + 7 2 36 1 + 8 3 4 1 + 9 4 5 ar + 10 4 9 ar + 11 5 6 ar + 12 5 37 1 + 13 6 7 ar + 14 6 38 1 + 15 7 8 ar + 16 7 39 1 + 17 8 9 ar + 18 8 40 1 + 19 9 10 1 + 20 10 11 1 + 21 10 31 am + 22 11 12 1 + 23 11 41 1 + 24 11 42 1 + 25 12 13 2 + 26 12 14 am + 27 14 15 1 + 28 14 19 1 + 29 15 16 1 + 30 15 43 1 + 31 15 44 1 + 32 16 17 1 + 33 16 45 1 + 34 16 46 1 + 35 17 18 1 + 36 17 47 1 + 37 17 48 1 + 38 18 19 1 + 39 18 49 1 + 40 18 50 1 + 41 19 20 1 + 42 19 51 1 + 43 20 21 ar + 44 20 30 ar + 45 21 22 ar + 46 22 23 1 + 47 22 29 ar + 48 23 24 ar + 49 23 28 ar + 50 24 25 ar + 51 24 52 1 + 52 25 26 ar + 53 25 53 1 + 54 26 27 ar + 55 26 54 1 + 56 27 28 ar + 57 28 55 1 + 58 29 30 ar + 59 31 32 2 +@MOLECULE +***** + 55 59 0 0 0 +SMALL +GASTEIGER + +@ATOM + 1 C 0.1398 -1.2615 0.5806 C.3 1 UNL1 -0.0190 + 2 C -0.2564 -2.3873 -0.3773 C.3 1 UNL1 0.1732 + 3 O -0.7709 -3.4875 0.3504 O.3 1 UNL1 -0.4780 + 4 C 0.1919 -4.3425 0.8178 C.ar 1 UNL1 0.1429 + 5 C -0.2623 -5.2685 1.7633 C.ar 1 UNL1 -0.0180 + 6 C 0.6207 -6.1858 2.3205 C.ar 1 UNL1 -0.0582 + 7 C 1.9528 -6.1807 1.9201 C.ar 1 UNL1 -0.0598 + 8 C 2.4048 -5.2651 0.9602 C.ar 1 UNL1 -0.0367 + 9 C 1.5358 -4.3264 0.3938 C.ar 1 UNL1 0.0787 + 10 N 1.9396 -3.4115 -0.6295 N.am 1 UNL1 -0.2563 + 11 C 3.3102 -3.3243 -1.1328 C.3 1 UNL1 0.0965 + 12 C 4.4070 -3.6941 -0.1078 C.2 1 UNL1 0.2340 + 13 O 4.8800 -2.7936 0.5973 O.2 1 UNL1 -0.2738 + 14 N 4.8865 -4.9979 -0.0020 N.am 1 UNL1 -0.2884 + 15 C 4.2908 -6.0172 -0.8813 C.3 1 UNL1 0.0155 + 16 C 4.0184 -7.3270 -0.1490 C.3 1 UNL1 -0.0371 + 17 C 5.2268 -7.8170 0.6416 C.3 1 UNL1 -0.0495 + 18 C 5.8081 -6.7000 1.5094 C.3 1 UNL1 -0.0255 + 19 C 6.1196 -5.4213 0.7111 C.3 1 UNL1 0.1048 + 20 C 7.2484 -5.6016 -0.2736 C.ar 1 UNL1 0.2482 + 21 N 7.1985 -5.9525 -1.5341 N.ar 1 UNL1 -0.1897 + 22 C 8.5203 -6.1214 -1.8679 C.ar 1 UNL1 0.2036 + 23 C 8.9094 -6.6682 -3.1511 C.ar 1 UNL1 0.0405 + 24 C 10.0906 -7.4083 -3.2760 C.ar 1 UNL1 -0.0481 + 25 C 10.4990 -7.8681 -4.5250 C.ar 1 UNL1 -0.0429 + 26 C 9.7043 -7.5762 -5.6198 C.ar 1 UNL1 0.0276 + 27 N 8.5485 -6.8808 -5.5434 N.ar 1 UNL1 -0.2626 + 28 C 8.1776 -6.4432 -4.3118 C.ar 1 UNL1 0.0383 + 29 N 9.3690 -5.8120 -0.8687 N.ar 1 UNL1 -0.0560 + 30 O 8.5285 -5.4511 0.1843 O.2 1 UNL1 -0.3357 + 31 C 0.9527 -2.6665 -1.2637 C.2 1 UNL1 0.2608 + 32 O 1.0912 -2.1302 -2.3623 O.2 1 UNL1 -0.2712 + 33 H -0.7033 -0.9508 1.2017 H 1 UNL1 0.0270 + 34 H 0.5111 -0.3963 0.0220 H 1 UNL1 0.0270 + 35 H 0.9369 -1.5795 1.2642 H 1 UNL1 0.0270 + 36 H -1.0665 -2.0336 -1.0255 H 1 UNL1 0.0829 + 37 H -1.3066 -5.2675 2.0660 H 1 UNL1 0.0655 + 38 H 0.2710 -6.9030 3.0587 H 1 UNL1 0.0619 + 39 H 2.6491 -6.9005 2.3462 H 1 UNL1 0.0618 + 40 H 3.4464 -5.3384 0.6653 H 1 UNL1 0.0637 + 41 H 3.5261 -2.3193 -1.5093 H 1 UNL1 0.0564 + 42 H 3.4064 -3.9814 -2.0048 H 1 UNL1 0.0564 + 43 H 4.9807 -6.1895 -1.7161 H 1 UNL1 0.0465 + 44 H 3.3558 -5.6644 -1.3280 H 1 UNL1 0.0465 + 45 H 3.7124 -8.0956 -0.8683 H 1 UNL1 0.0280 + 46 H 3.1769 -7.1812 0.5387 H 1 UNL1 0.0280 + 47 H 5.9903 -8.2015 -0.0442 H 1 UNL1 0.0266 + 48 H 4.9258 -8.6561 1.2800 H 1 UNL1 0.0266 + 49 H 6.6974 -7.0629 2.0367 H 1 UNL1 0.0288 + 50 H 5.0635 -6.4609 2.2775 H 1 UNL1 0.0288 + 51 H 6.4169 -4.6457 1.4177 H 1 UNL1 0.0599 + 52 H 10.7051 -7.6160 -2.4029 H 1 UNL1 0.0626 + 53 H 11.4190 -8.4307 -4.6365 H 1 UNL1 0.0633 + 54 H 9.9898 -7.8980 -6.6172 H 1 UNL1 0.0829 + 55 H 7.2487 -5.8777 -4.3010 H 1 UNL1 0.0837 +@BOND + 1 1 33 1 + 2 1 34 1 + 3 1 35 1 + 4 2 3 1 + 5 2 31 1 + 6 2 1 1 + 7 2 36 1 + 8 3 4 1 + 9 4 5 ar + 10 4 9 ar + 11 5 6 ar + 12 5 37 1 + 13 6 7 ar + 14 6 38 1 + 15 7 8 ar + 16 7 39 1 + 17 8 9 ar + 18 8 40 1 + 19 9 10 1 + 20 10 11 1 + 21 10 31 am + 22 11 12 1 + 23 11 41 1 + 24 11 42 1 + 25 12 13 2 + 26 12 14 am + 27 14 15 1 + 28 14 19 1 + 29 15 16 1 + 30 15 43 1 + 31 15 44 1 + 32 16 17 1 + 33 16 45 1 + 34 16 46 1 + 35 17 18 1 + 36 17 47 1 + 37 17 48 1 + 38 18 19 1 + 39 18 49 1 + 40 18 50 1 + 41 19 20 1 + 42 19 51 1 + 43 20 21 ar + 44 20 30 ar + 45 21 22 ar + 46 22 23 1 + 47 22 29 ar + 48 23 24 ar + 49 23 28 ar + 50 24 25 ar + 51 24 52 1 + 52 25 26 ar + 53 25 53 1 + 54 26 27 ar + 55 26 54 1 + 56 27 28 ar + 57 28 55 1 + 58 29 30 ar + 59 31 32 2 +@MOLECULE +***** + 55 59 0 0 0 +SMALL +GASTEIGER + +@ATOM + 1 C 5.8113 -2.5876 -4.3646 C.3 1 UNL1 -0.0190 + 2 C 4.4359 -1.9207 -4.4393 C.3 1 UNL1 0.1732 + 3 O 4.5572 -0.5277 -4.2162 O.3 1 UNL1 -0.4780 + 4 C 4.5589 -0.1761 -2.8922 C.ar 1 UNL1 0.1429 + 5 C 4.9542 1.1425 -2.6415 C.ar 1 UNL1 -0.0180 + 6 C 5.0058 1.6185 -1.3367 C.ar 1 UNL1 -0.0582 + 7 C 4.6497 0.7764 -0.2885 C.ar 1 UNL1 -0.0598 + 8 C 4.2367 -0.5390 -0.5400 C.ar 1 UNL1 -0.0367 + 9 C 4.1871 -1.0421 -1.8445 C.ar 1 UNL1 0.0787 + 10 N 3.7182 -2.3584 -2.1527 N.am 1 UNL1 -0.2563 + 11 C 3.3102 -3.3243 -1.1328 C.3 1 UNL1 0.0965 + 12 C 4.4070 -3.6941 -0.1078 C.2 1 UNL1 0.2340 + 13 O 4.8800 -2.7936 0.5973 O.2 1 UNL1 -0.2738 + 14 N 4.8865 -4.9979 -0.0020 N.am 1 UNL1 -0.2884 + 15 C 4.2908 -6.0172 -0.8813 C.3 1 UNL1 0.0155 + 16 C 4.0184 -7.3270 -0.1490 C.3 1 UNL1 -0.0371 + 17 C 5.2268 -7.8170 0.6416 C.3 1 UNL1 -0.0495 + 18 C 5.8081 -6.7000 1.5094 C.3 1 UNL1 -0.0255 + 19 C 6.1196 -5.4213 0.7111 C.3 1 UNL1 0.1048 + 20 C 7.2484 -5.6016 -0.2736 C.ar 1 UNL1 0.2482 + 21 N 8.2696 -6.4194 -0.2207 N.ar 1 UNL1 -0.1897 + 22 C 9.0466 -6.0240 -1.2824 C.ar 1 UNL1 0.2036 + 23 C 10.3682 -6.5762 -1.4956 C.ar 1 UNL1 0.0405 + 24 C 10.8854 -7.5335 -0.6154 C.ar 1 UNL1 -0.0481 + 25 C 12.1843 -8.0063 -0.7808 C.ar 1 UNL1 -0.0429 + 26 C 12.9313 -7.5074 -1.8336 C.ar 1 UNL1 0.0276 + 27 N 12.4672 -6.5967 -2.7171 N.ar 1 UNL1 -0.2626 + 28 C 11.1972 -6.1524 -2.5283 C.ar 1 UNL1 0.0383 + 29 N 8.4901 -5.0419 -2.0173 N.ar 1 UNL1 -0.0560 + 30 O 7.2899 -4.7715 -1.3600 O.2 1 UNL1 -0.3357 + 31 C 3.5177 -2.6821 -3.4892 C.2 1 UNL1 0.2608 + 32 O 2.8042 -3.6066 -3.8762 O.2 1 UNL1 -0.2712 + 33 H 6.5094 -2.1436 -5.0779 H 1 UNL1 0.0270 + 34 H 5.7281 -3.6605 -4.5654 H 1 UNL1 0.0270 + 35 H 6.2588 -2.4720 -3.3695 H 1 UNL1 0.0270 + 36 H 4.0367 -2.0424 -5.4528 H 1 UNL1 0.0829 + 37 H 5.2260 1.7943 -3.4682 H 1 UNL1 0.0655 + 38 H 5.3172 2.6410 -1.1393 H 1 UNL1 0.0619 + 39 H 4.6803 1.1437 0.7356 H 1 UNL1 0.0618 + 40 H 3.9376 -1.1314 0.3184 H 1 UNL1 0.0637 + 41 H 2.9521 -4.2512 -1.5921 H 1 UNL1 0.0564 + 42 H 2.4451 -2.9212 -0.5938 H 1 UNL1 0.0564 + 43 H 4.9807 -6.1895 -1.7161 H 1 UNL1 0.0465 + 44 H 3.3558 -5.6644 -1.3280 H 1 UNL1 0.0465 + 45 H 3.7124 -8.0956 -0.8683 H 1 UNL1 0.0280 + 46 H 3.1769 -7.1812 0.5387 H 1 UNL1 0.0280 + 47 H 5.9903 -8.2015 -0.0442 H 1 UNL1 0.0266 + 48 H 4.9258 -8.6561 1.2800 H 1 UNL1 0.0266 + 49 H 6.6974 -7.0629 2.0367 H 1 UNL1 0.0288 + 50 H 5.0635 -6.4609 2.2775 H 1 UNL1 0.0288 + 51 H 6.4169 -4.6457 1.4177 H 1 UNL1 0.0599 + 52 H 10.2836 -7.9029 0.2119 H 1 UNL1 0.0626 + 53 H 12.6008 -8.7377 -0.0974 H 1 UNL1 0.0633 + 54 H 13.9554 -7.8323 -1.9935 H 1 UNL1 0.0829 + 55 H 10.8717 -5.4116 -3.2549 H 1 UNL1 0.0837 +@BOND + 1 1 33 1 + 2 1 34 1 + 3 1 35 1 + 4 2 3 1 + 5 2 31 1 + 6 2 1 1 + 7 2 36 1 + 8 3 4 1 + 9 4 5 ar + 10 4 9 ar + 11 5 6 ar + 12 5 37 1 + 13 6 7 ar + 14 6 38 1 + 15 7 8 ar + 16 7 39 1 + 17 8 9 ar + 18 8 40 1 + 19 9 10 1 + 20 10 11 1 + 21 10 31 am + 22 11 12 1 + 23 11 41 1 + 24 11 42 1 + 25 12 13 2 + 26 12 14 am + 27 14 15 1 + 28 14 19 1 + 29 15 16 1 + 30 15 43 1 + 31 15 44 1 + 32 16 17 1 + 33 16 45 1 + 34 16 46 1 + 35 17 18 1 + 36 17 47 1 + 37 17 48 1 + 38 18 19 1 + 39 18 49 1 + 40 18 50 1 + 41 19 20 1 + 42 19 51 1 + 43 20 21 ar + 44 20 30 ar + 45 21 22 ar + 46 22 23 1 + 47 22 29 ar + 48 23 24 ar + 49 23 28 ar + 50 24 25 ar + 51 24 52 1 + 52 25 26 ar + 53 25 53 1 + 54 26 27 ar + 55 26 54 1 + 56 27 28 ar + 57 28 55 1 + 58 29 30 ar + 59 31 32 2 +@MOLECULE +***** + 55 59 0 0 0 +SMALL +GASTEIGER + +@ATOM + 1 C 1.4488 0.3780 -1.3988 C.3 1 UNL1 -0.0190 + 2 C 2.9781 0.4186 -1.3577 C.3 1 UNL1 0.1732 + 3 O 3.4912 0.7491 -2.6354 O.3 1 UNL1 -0.4780 + 4 C 3.6294 -0.3262 -3.4727 C.ar 1 UNL1 0.1429 + 5 C 3.8638 0.0061 -4.8116 C.ar 1 UNL1 -0.0180 + 6 C 4.0135 -0.9964 -5.7625 C.ar 1 UNL1 -0.0582 + 7 C 3.9400 -2.3281 -5.3676 C.ar 1 UNL1 -0.0598 + 8 C 3.7228 -2.6619 -4.0240 C.ar 1 UNL1 -0.0367 + 9 C 3.5592 -1.6693 -3.0518 C.ar 1 UNL1 0.0787 + 10 N 3.3924 -1.9629 -1.6614 N.am 1 UNL1 -0.2563 + 11 C 3.3102 -3.3243 -1.1328 C.3 1 UNL1 0.0965 + 12 C 4.4070 -3.6941 -0.1078 C.2 1 UNL1 0.2340 + 13 O 4.8800 -2.7936 0.5973 O.2 1 UNL1 -0.2738 + 14 N 4.8865 -4.9979 -0.0020 N.am 1 UNL1 -0.2884 + 15 C 4.2908 -6.0172 -0.8813 C.3 1 UNL1 0.0155 + 16 C 4.0184 -7.3270 -0.1490 C.3 1 UNL1 -0.0371 + 17 C 5.2268 -7.8170 0.6416 C.3 1 UNL1 -0.0495 + 18 C 5.8081 -6.7000 1.5094 C.3 1 UNL1 -0.0255 + 19 C 6.1196 -5.4213 0.7111 C.3 1 UNL1 0.1048 + 20 C 7.2484 -5.6016 -0.2736 C.ar 1 UNL1 0.2482 + 21 N 8.5352 -5.4365 -0.0963 N.ar 1 UNL1 -0.1897 + 22 C 9.0485 -5.5683 -1.3637 C.ar 1 UNL1 0.2036 + 23 C 10.4434 -5.2983 -1.6434 C.ar 1 UNL1 0.0405 + 24 C 11.1482 -4.3581 -0.8832 C.ar 1 UNL1 -0.0481 + 25 C 12.4670 -4.0470 -1.2030 C.ar 1 UNL1 -0.0429 + 26 C 13.0477 -4.6950 -2.2792 C.ar 1 UNL1 0.0276 + 27 N 12.4115 -5.6212 -3.0293 N.ar 1 UNL1 -0.2626 + 28 C 11.1249 -5.9017 -2.6944 C.ar 1 UNL1 0.0383 + 29 N 8.1199 -5.8808 -2.2881 N.ar 1 UNL1 -0.0560 + 30 O 6.9279 -5.9197 -1.5647 O.2 1 UNL1 -0.3357 + 31 C 3.4446 -0.9052 -0.7614 C.2 1 UNL1 0.2608 + 32 O 3.6731 -1.0322 0.4408 O.2 1 UNL1 -0.2712 + 33 H 1.0336 1.3269 -1.7459 H 1 UNL1 0.0270 + 34 H 1.0449 0.1518 -0.4068 H 1 UNL1 0.0270 + 35 H 1.0873 -0.3966 -2.0867 H 1 UNL1 0.0270 + 36 H 3.2941 1.2172 -0.6766 H 1 UNL1 0.0829 + 37 H 3.9243 1.0500 -5.1093 H 1 UNL1 0.0655 + 38 H 4.1909 -0.7405 -6.8039 H 1 UNL1 0.0619 + 39 H 4.0634 -3.1191 -6.1049 H 1 UNL1 0.0618 + 40 H 3.7130 -3.7184 -3.7768 H 1 UNL1 0.0637 + 41 H 3.3429 -4.0612 -1.9417 H 1 UNL1 0.0564 + 42 H 2.3289 -3.4601 -0.6639 H 1 UNL1 0.0564 + 43 H 4.9807 -6.1895 -1.7161 H 1 UNL1 0.0465 + 44 H 3.3558 -5.6644 -1.3280 H 1 UNL1 0.0465 + 45 H 3.7124 -8.0956 -0.8683 H 1 UNL1 0.0280 + 46 H 3.1769 -7.1812 0.5387 H 1 UNL1 0.0280 + 47 H 5.9903 -8.2015 -0.0442 H 1 UNL1 0.0266 + 48 H 4.9258 -8.6561 1.2800 H 1 UNL1 0.0266 + 49 H 6.6974 -7.0629 2.0367 H 1 UNL1 0.0288 + 50 H 5.0635 -6.4609 2.2775 H 1 UNL1 0.0288 + 51 H 6.4169 -4.6457 1.4177 H 1 UNL1 0.0599 + 52 H 10.6674 -3.8530 -0.0484 H 1 UNL1 0.0626 + 53 H 13.0189 -3.3105 -0.6301 H 1 UNL1 0.0633 + 54 H 14.0681 -4.4735 -2.5786 H 1 UNL1 0.0829 + 55 H 10.6497 -6.6425 -3.3332 H 1 UNL1 0.0837 +@BOND + 1 1 33 1 + 2 1 34 1 + 3 1 35 1 + 4 2 3 1 + 5 2 31 1 + 6 2 1 1 + 7 2 36 1 + 8 3 4 1 + 9 4 5 ar + 10 4 9 ar + 11 5 6 ar + 12 5 37 1 + 13 6 7 ar + 14 6 38 1 + 15 7 8 ar + 16 7 39 1 + 17 8 9 ar + 18 8 40 1 + 19 9 10 1 + 20 10 11 1 + 21 10 31 am + 22 11 12 1 + 23 11 41 1 + 24 11 42 1 + 25 12 13 2 + 26 12 14 am + 27 14 15 1 + 28 14 19 1 + 29 15 16 1 + 30 15 43 1 + 31 15 44 1 + 32 16 17 1 + 33 16 45 1 + 34 16 46 1 + 35 17 18 1 + 36 17 47 1 + 37 17 48 1 + 38 18 19 1 + 39 18 49 1 + 40 18 50 1 + 41 19 20 1 + 42 19 51 1 + 43 20 21 ar + 44 20 30 ar + 45 21 22 ar + 46 22 23 1 + 47 22 29 ar + 48 23 24 ar + 49 23 28 ar + 50 24 25 ar + 51 24 52 1 + 52 25 26 ar + 53 25 53 1 + 54 26 27 ar + 55 26 54 1 + 56 27 28 ar + 57 28 55 1 + 58 29 30 ar + 59 31 32 2 +@MOLECULE +***** + 55 59 0 0 0 +SMALL +GASTEIGER + +@ATOM + 1 C 1.4694 -1.9427 2.3233 C.3 1 UNL1 -0.0190 + 2 C 1.1037 -1.1877 1.0433 C.3 1 UNL1 0.1732 + 3 O -0.2161 -1.5125 0.6463 O.3 1 UNL1 -0.4780 + 4 C -0.3039 -2.6539 -0.1060 C.ar 1 UNL1 0.1429 + 5 C -1.6045 -3.1430 -0.2705 C.ar 1 UNL1 -0.0180 + 6 C -1.8257 -4.3009 -1.0068 C.ar 1 UNL1 -0.0582 + 7 C -0.7453 -4.9582 -1.5859 C.ar 1 UNL1 -0.0598 + 8 C 0.5557 -4.4593 -1.4364 C.ar 1 UNL1 -0.0367 + 9 C 0.8026 -3.3013 -0.6912 C.ar 1 UNL1 0.0787 + 10 N 2.1056 -2.7248 -0.5594 N.am 1 UNL1 -0.2563 + 11 C 3.3102 -3.3243 -1.1328 C.3 1 UNL1 0.0965 + 12 C 4.4070 -3.6941 -0.1078 C.2 1 UNL1 0.2340 + 13 O 4.8800 -2.7936 0.5973 O.2 1 UNL1 -0.2738 + 14 N 4.8865 -4.9979 -0.0020 N.am 1 UNL1 -0.2884 + 15 C 4.2908 -6.0172 -0.8813 C.3 1 UNL1 0.0155 + 16 C 4.0184 -7.3270 -0.1490 C.3 1 UNL1 -0.0371 + 17 C 5.2268 -7.8170 0.6416 C.3 1 UNL1 -0.0495 + 18 C 5.8081 -6.7000 1.5094 C.3 1 UNL1 -0.0255 + 19 C 6.1196 -5.4213 0.7111 C.3 1 UNL1 0.1048 + 20 C 7.2484 -5.6016 -0.2736 C.ar 1 UNL1 0.2482 + 21 N 8.4049 -4.9900 -0.3274 N.ar 1 UNL1 -0.1897 + 22 C 8.9388 -5.4271 -1.5153 C.ar 1 UNL1 0.2036 + 23 C 10.1644 -4.8643 -2.0427 C.ar 1 UNL1 0.0405 + 24 C 10.3772 -4.8025 -3.4246 C.ar 1 UNL1 -0.0481 + 25 C 11.5871 -4.3299 -3.9255 C.ar 1 UNL1 -0.0429 + 26 C 12.5538 -3.9248 -3.0218 C.ar 1 UNL1 0.0276 + 27 N 12.3854 -3.9505 -1.6816 N.ar 1 UNL1 -0.2626 + 28 C 11.1954 -4.4190 -1.2230 C.ar 1 UNL1 0.0383 + 29 N 8.1728 -6.3397 -2.1434 N.ar 1 UNL1 -0.0560 + 30 O 7.0590 -6.4694 -1.3138 O.2 1 UNL1 -0.3357 + 31 C 2.2059 -1.4692 0.0277 C.2 1 UNL1 0.2608 + 32 O 3.1694 -0.7169 -0.1113 O.2 1 UNL1 -0.2712 + 33 H 0.7625 -1.7293 3.1283 H 1 UNL1 0.0270 + 34 H 2.4783 -1.6732 2.6518 H 1 UNL1 0.0270 + 35 H 1.4525 -3.0284 2.1663 H 1 UNL1 0.0270 + 36 H 1.1128 -0.1114 1.2508 H 1 UNL1 0.0829 + 37 H -2.4428 -2.6192 0.1822 H 1 UNL1 0.0655 + 38 H -2.8348 -4.6853 -1.1318 H 1 UNL1 0.0619 + 39 H -0.9108 -5.8615 -2.1701 H 1 UNL1 0.0618 + 40 H 1.3488 -4.9986 -1.9438 H 1 UNL1 0.0637 + 41 H 3.7582 -2.6634 -1.8818 H 1 UNL1 0.0564 + 42 H 3.0243 -4.2271 -1.6847 H 1 UNL1 0.0564 + 43 H 4.9807 -6.1895 -1.7161 H 1 UNL1 0.0465 + 44 H 3.3558 -5.6644 -1.3280 H 1 UNL1 0.0465 + 45 H 3.7124 -8.0956 -0.8683 H 1 UNL1 0.0280 + 46 H 3.1769 -7.1812 0.5387 H 1 UNL1 0.0280 + 47 H 5.9903 -8.2015 -0.0442 H 1 UNL1 0.0266 + 48 H 4.9258 -8.6561 1.2800 H 1 UNL1 0.0266 + 49 H 6.6974 -7.0629 2.0367 H 1 UNL1 0.0288 + 50 H 5.0635 -6.4609 2.2775 H 1 UNL1 0.0288 + 51 H 6.4169 -4.6457 1.4177 H 1 UNL1 0.0599 + 52 H 9.6068 -5.1371 -4.1158 H 1 UNL1 0.0626 + 53 H 11.7689 -4.2901 -4.9935 H 1 UNL1 0.0633 + 54 H 13.5202 -3.5652 -3.3635 H 1 UNL1 0.0829 + 55 H 11.1102 -4.4334 -0.1389 H 1 UNL1 0.0837 +@BOND + 1 1 33 1 + 2 1 34 1 + 3 1 35 1 + 4 2 3 1 + 5 2 31 1 + 6 2 1 1 + 7 2 36 1 + 8 3 4 1 + 9 4 5 ar + 10 4 9 ar + 11 5 6 ar + 12 5 37 1 + 13 6 7 ar + 14 6 38 1 + 15 7 8 ar + 16 7 39 1 + 17 8 9 ar + 18 8 40 1 + 19 9 10 1 + 20 10 11 1 + 21 10 31 am + 22 11 12 1 + 23 11 41 1 + 24 11 42 1 + 25 12 13 2 + 26 12 14 am + 27 14 15 1 + 28 14 19 1 + 29 15 16 1 + 30 15 43 1 + 31 15 44 1 + 32 16 17 1 + 33 16 45 1 + 34 16 46 1 + 35 17 18 1 + 36 17 47 1 + 37 17 48 1 + 38 18 19 1 + 39 18 49 1 + 40 18 50 1 + 41 19 20 1 + 42 19 51 1 + 43 20 21 ar + 44 20 30 ar + 45 21 22 ar + 46 22 23 1 + 47 22 29 ar + 48 23 24 ar + 49 23 28 ar + 50 24 25 ar + 51 24 52 1 + 52 25 26 ar + 53 25 53 1 + 54 26 27 ar + 55 26 54 1 + 56 27 28 ar + 57 28 55 1 + 58 29 30 ar + 59 31 32 2 +@MOLECULE +***** + 55 59 0 0 0 +SMALL +GASTEIGER + +@ATOM + 1 C 3.4488 0.7207 -0.2050 C.3 1 UNL1 -0.0190 + 2 C 4.2464 0.3084 -1.4444 C.3 1 UNL1 0.1732 + 3 O 3.5874 0.7504 -2.6170 O.3 1 UNL1 -0.4780 + 4 C 2.6167 -0.1064 -3.0642 C.ar 1 UNL1 0.1429 + 5 C 1.7724 0.4311 -4.0421 C.ar 1 UNL1 -0.0180 + 6 C 0.7412 -0.3362 -4.5707 C.ar 1 UNL1 -0.0582 + 7 C 0.5664 -1.6429 -4.1273 C.ar 1 UNL1 -0.0598 + 8 C 1.4224 -2.1879 -3.1607 C.ar 1 UNL1 -0.0367 + 9 C 2.4604 -1.4305 -2.6076 C.ar 1 UNL1 0.0787 + 10 N 3.3924 -1.9629 -1.6614 N.am 1 UNL1 -0.2563 + 11 C 3.3102 -3.3243 -1.1328 C.3 1 UNL1 0.0965 + 12 C 4.4070 -3.6941 -0.1078 C.2 1 UNL1 0.2340 + 13 O 4.8800 -2.7936 0.5973 O.2 1 UNL1 -0.2738 + 14 N 4.8865 -4.9979 -0.0020 N.am 1 UNL1 -0.2884 + 15 C 4.2908 -6.0172 -0.8813 C.3 1 UNL1 0.0155 + 16 C 4.0184 -7.3270 -0.1490 C.3 1 UNL1 -0.0371 + 17 C 5.2268 -7.8170 0.6416 C.3 1 UNL1 -0.0495 + 18 C 5.8081 -6.7000 1.5094 C.3 1 UNL1 -0.0255 + 19 C 6.1196 -5.4213 0.7111 C.3 1 UNL1 0.1048 + 20 C 7.2484 -5.6016 -0.2736 C.ar 1 UNL1 0.2482 + 21 N 8.5352 -5.4365 -0.0963 N.ar 1 UNL1 -0.1897 + 22 C 9.0485 -5.5683 -1.3637 C.ar 1 UNL1 0.2036 + 23 C 10.4434 -5.2983 -1.6434 C.ar 1 UNL1 0.0405 + 24 C 11.1482 -4.3581 -0.8832 C.ar 1 UNL1 -0.0481 + 25 C 12.4670 -4.0470 -1.2030 C.ar 1 UNL1 -0.0429 + 26 C 13.0477 -4.6950 -2.2792 C.ar 1 UNL1 0.0276 + 27 N 12.4115 -5.6212 -3.0293 N.ar 1 UNL1 -0.2626 + 28 C 11.1249 -5.9017 -2.6944 C.ar 1 UNL1 0.0383 + 29 N 8.1199 -5.8808 -2.2881 N.ar 1 UNL1 -0.0560 + 30 O 6.9279 -5.9197 -1.5647 O.2 1 UNL1 -0.3357 + 31 C 4.5007 -1.1912 -1.3338 C.2 1 UNL1 0.2608 + 32 O 5.5328 -1.6407 -0.8376 O.2 1 UNL1 -0.2712 + 33 H 3.2913 1.8012 -0.1731 H 1 UNL1 0.0270 + 34 H 3.9682 0.4075 0.7064 H 1 UNL1 0.0270 + 35 H 2.4553 0.2552 -0.1951 H 1 UNL1 0.0270 + 36 H 5.2203 0.8110 -1.4235 H 1 UNL1 0.0829 + 37 H 1.9204 1.4520 -4.3855 H 1 UNL1 0.0655 + 38 H 0.0812 0.0810 -5.3270 H 1 UNL1 0.0619 + 39 H -0.2343 -2.2528 -4.5415 H 1 UNL1 0.0618 + 40 H 1.2544 -3.2240 -2.8855 H 1 UNL1 0.0637 + 41 H 3.3429 -4.0612 -1.9417 H 1 UNL1 0.0564 + 42 H 2.3289 -3.4601 -0.6639 H 1 UNL1 0.0564 + 43 H 4.9807 -6.1895 -1.7161 H 1 UNL1 0.0465 + 44 H 3.3558 -5.6644 -1.3280 H 1 UNL1 0.0465 + 45 H 3.7124 -8.0956 -0.8683 H 1 UNL1 0.0280 + 46 H 3.1769 -7.1812 0.5387 H 1 UNL1 0.0280 + 47 H 5.9903 -8.2015 -0.0442 H 1 UNL1 0.0266 + 48 H 4.9258 -8.6561 1.2800 H 1 UNL1 0.0266 + 49 H 6.6974 -7.0629 2.0367 H 1 UNL1 0.0288 + 50 H 5.0635 -6.4609 2.2775 H 1 UNL1 0.0288 + 51 H 6.4169 -4.6457 1.4177 H 1 UNL1 0.0599 + 52 H 10.6674 -3.8530 -0.0484 H 1 UNL1 0.0626 + 53 H 13.0189 -3.3105 -0.6301 H 1 UNL1 0.0633 + 54 H 14.0681 -4.4735 -2.5786 H 1 UNL1 0.0829 + 55 H 10.6497 -6.6425 -3.3332 H 1 UNL1 0.0837 +@BOND + 1 1 33 1 + 2 1 34 1 + 3 1 35 1 + 4 2 3 1 + 5 2 31 1 + 6 2 1 1 + 7 2 36 1 + 8 3 4 1 + 9 4 5 ar + 10 4 9 ar + 11 5 6 ar + 12 5 37 1 + 13 6 7 ar + 14 6 38 1 + 15 7 8 ar + 16 7 39 1 + 17 8 9 ar + 18 8 40 1 + 19 9 10 1 + 20 10 11 1 + 21 10 31 am + 22 11 12 1 + 23 11 41 1 + 24 11 42 1 + 25 12 13 2 + 26 12 14 am + 27 14 15 1 + 28 14 19 1 + 29 15 16 1 + 30 15 43 1 + 31 15 44 1 + 32 16 17 1 + 33 16 45 1 + 34 16 46 1 + 35 17 18 1 + 36 17 47 1 + 37 17 48 1 + 38 18 19 1 + 39 18 49 1 + 40 18 50 1 + 41 19 20 1 + 42 19 51 1 + 43 20 21 ar + 44 20 30 ar + 45 21 22 ar + 46 22 23 1 + 47 22 29 ar + 48 23 24 ar + 49 23 28 ar + 50 24 25 ar + 51 24 52 1 + 52 25 26 ar + 53 25 53 1 + 54 26 27 ar + 55 26 54 1 + 56 27 28 ar + 57 28 55 1 + 58 29 30 ar + 59 31 32 2 +@MOLECULE +***** + 55 59 0 0 0 +SMALL +GASTEIGER + +@ATOM + 1 C 2.6927 -7.1329 -2.6676 C.3 1 UNL1 -0.0190 + 2 C 2.2666 -5.9837 -3.5840 C.3 1 UNL1 0.1732 + 3 O 3.1765 -5.8568 -4.6614 O.3 1 UNL1 -0.4780 + 4 C 4.2796 -5.0990 -4.3695 C.ar 1 UNL1 0.1429 + 5 C 5.3124 -5.1897 -5.3093 C.ar 1 UNL1 -0.0180 + 6 C 6.4894 -4.4746 -5.1224 C.ar 1 UNL1 -0.0582 + 7 C 6.6235 -3.6618 -4.0017 C.ar 1 UNL1 -0.0598 + 8 C 5.5828 -3.5567 -3.0691 C.ar 1 UNL1 -0.0367 + 9 C 4.3936 -4.2752 -3.2318 C.ar 1 UNL1 0.0787 + 10 N 3.2840 -4.1552 -2.3363 N.am 1 UNL1 -0.2563 + 11 C 3.3102 -3.3243 -1.1328 C.3 1 UNL1 0.0965 + 12 C 4.4070 -3.6941 -0.1078 C.2 1 UNL1 0.2340 + 13 O 4.8800 -2.7936 0.5973 O.2 1 UNL1 -0.2738 + 14 N 4.8865 -4.9979 -0.0020 N.am 1 UNL1 -0.2884 + 15 C 4.2908 -6.0172 -0.8813 C.3 1 UNL1 0.0155 + 16 C 4.0184 -7.3270 -0.1490 C.3 1 UNL1 -0.0371 + 17 C 5.2268 -7.8170 0.6416 C.3 1 UNL1 -0.0495 + 18 C 5.8081 -6.7000 1.5094 C.3 1 UNL1 -0.0255 + 19 C 6.1196 -5.4213 0.7111 C.3 1 UNL1 0.1048 + 20 C 7.2484 -5.6016 -0.2736 C.ar 1 UNL1 0.2482 + 21 N 7.1985 -5.9525 -1.5341 N.ar 1 UNL1 -0.1897 + 22 C 8.5203 -6.1214 -1.8679 C.ar 1 UNL1 0.2036 + 23 C 8.9094 -6.6682 -3.1511 C.ar 1 UNL1 0.0405 + 24 C 7.9365 -7.0390 -4.0863 C.ar 1 UNL1 -0.0481 + 25 C 8.3121 -7.6333 -5.2880 C.ar 1 UNL1 -0.0429 + 26 C 9.6610 -7.8355 -5.5224 C.ar 1 UNL1 0.0276 + 27 N 10.6345 -7.4777 -4.6567 N.ar 1 UNL1 -0.2626 + 28 C 10.2369 -6.9024 -3.4918 C.ar 1 UNL1 0.0383 + 29 N 9.3690 -5.8120 -0.8687 N.ar 1 UNL1 -0.0560 + 30 O 8.5285 -5.4511 0.1843 O.2 1 UNL1 -0.3357 + 31 C 2.0840 -4.7529 -2.7022 C.2 1 UNL1 0.2608 + 32 O 0.9883 -4.4444 -2.2354 O.2 1 UNL1 -0.2712 + 33 H 2.7709 -8.0737 -3.2172 H 1 UNL1 0.0270 + 34 H 1.9768 -7.2552 -1.8485 H 1 UNL1 0.0270 + 35 H 3.6767 -6.9445 -2.2203 H 1 UNL1 0.0270 + 36 H 1.2913 -6.2227 -4.0235 H 1 UNL1 0.0829 + 37 H 5.1958 -5.8241 -6.1845 H 1 UNL1 0.0655 + 38 H 7.2948 -4.5473 -5.8488 H 1 UNL1 0.0619 + 39 H 7.5392 -3.0928 -3.8518 H 1 UNL1 0.0618 + 40 H 5.7371 -2.8775 -2.2370 H 1 UNL1 0.0637 + 41 H 2.3448 -3.3507 -0.6174 H 1 UNL1 0.0564 + 42 H 3.4447 -2.2783 -1.4314 H 1 UNL1 0.0564 + 43 H 4.9807 -6.1895 -1.7161 H 1 UNL1 0.0465 + 44 H 3.3558 -5.6644 -1.3280 H 1 UNL1 0.0465 + 45 H 3.7124 -8.0956 -0.8683 H 1 UNL1 0.0280 + 46 H 3.1769 -7.1812 0.5387 H 1 UNL1 0.0280 + 47 H 5.9903 -8.2015 -0.0442 H 1 UNL1 0.0266 + 48 H 4.9258 -8.6561 1.2800 H 1 UNL1 0.0266 + 49 H 6.6974 -7.0629 2.0367 H 1 UNL1 0.0288 + 50 H 5.0635 -6.4609 2.2775 H 1 UNL1 0.0288 + 51 H 6.4169 -4.6457 1.4177 H 1 UNL1 0.0599 + 52 H 6.8813 -6.8806 -3.8755 H 1 UNL1 0.0626 + 53 H 7.5670 -7.9374 -6.0144 H 1 UNL1 0.0633 + 54 H 10.0024 -8.3113 -6.4373 H 1 UNL1 0.0829 + 55 H 11.0531 -6.6435 -2.8214 H 1 UNL1 0.0837 +@BOND + 1 1 33 1 + 2 1 34 1 + 3 1 35 1 + 4 2 3 1 + 5 2 31 1 + 6 2 1 1 + 7 2 36 1 + 8 3 4 1 + 9 4 5 ar + 10 4 9 ar + 11 5 6 ar + 12 5 37 1 + 13 6 7 ar + 14 6 38 1 + 15 7 8 ar + 16 7 39 1 + 17 8 9 ar + 18 8 40 1 + 19 9 10 1 + 20 10 11 1 + 21 10 31 am + 22 11 12 1 + 23 11 41 1 + 24 11 42 1 + 25 12 13 2 + 26 12 14 am + 27 14 15 1 + 28 14 19 1 + 29 15 16 1 + 30 15 43 1 + 31 15 44 1 + 32 16 17 1 + 33 16 45 1 + 34 16 46 1 + 35 17 18 1 + 36 17 47 1 + 37 17 48 1 + 38 18 19 1 + 39 18 49 1 + 40 18 50 1 + 41 19 20 1 + 42 19 51 1 + 43 20 21 ar + 44 20 30 ar + 45 21 22 ar + 46 22 23 1 + 47 22 29 ar + 48 23 24 ar + 49 23 28 ar + 50 24 25 ar + 51 24 52 1 + 52 25 26 ar + 53 25 53 1 + 54 26 27 ar + 55 26 54 1 + 56 27 28 ar + 57 28 55 1 + 58 29 30 ar + 59 31 32 2 +@MOLECULE +***** + 55 59 0 0 0 +SMALL +GASTEIGER + +@ATOM + 1 C -0.5570 -4.2137 -2.3557 C.3 1 UNL1 -0.0190 + 2 C 0.5096 -5.2267 -2.7782 C.3 1 UNL1 0.1732 + 3 O 0.3839 -6.4130 -2.0155 O.3 1 UNL1 -0.4780 + 4 C 1.0301 -6.3676 -0.8086 C.ar 1 UNL1 0.1429 + 5 C 0.6928 -7.4024 0.0707 C.ar 1 UNL1 -0.0180 + 6 C 1.2744 -7.4630 1.3316 C.ar 1 UNL1 -0.0582 + 7 C 2.2007 -6.4943 1.7031 C.ar 1 UNL1 -0.0598 + 8 C 2.5524 -5.4675 0.8165 C.ar 1 UNL1 -0.0367 + 9 C 1.9719 -5.3812 -0.4535 C.ar 1 UNL1 0.0787 + 10 N 2.3421 -4.3848 -1.4113 N.am 1 UNL1 -0.2563 + 11 C 3.3102 -3.3243 -1.1328 C.3 1 UNL1 0.0965 + 12 C 4.4070 -3.6941 -0.1078 C.2 1 UNL1 0.2340 + 13 O 4.8800 -2.7936 0.5973 O.2 1 UNL1 -0.2738 + 14 N 4.8865 -4.9979 -0.0020 N.am 1 UNL1 -0.2884 + 15 C 4.2908 -6.0172 -0.8813 C.3 1 UNL1 0.0155 + 16 C 4.0184 -7.3270 -0.1490 C.3 1 UNL1 -0.0371 + 17 C 5.2268 -7.8170 0.6416 C.3 1 UNL1 -0.0495 + 18 C 5.8081 -6.7000 1.5094 C.3 1 UNL1 -0.0255 + 19 C 6.1196 -5.4213 0.7111 C.3 1 UNL1 0.1048 + 20 C 7.2484 -5.6016 -0.2736 C.ar 1 UNL1 0.2482 + 21 N 8.4049 -4.9900 -0.3274 N.ar 1 UNL1 -0.1897 + 22 C 8.9388 -5.4271 -1.5153 C.ar 1 UNL1 0.2036 + 23 C 10.1644 -4.8643 -2.0427 C.ar 1 UNL1 0.0405 + 24 C 10.3772 -4.8025 -3.4246 C.ar 1 UNL1 -0.0481 + 25 C 11.5871 -4.3299 -3.9255 C.ar 1 UNL1 -0.0429 + 26 C 12.5538 -3.9248 -3.0218 C.ar 1 UNL1 0.0276 + 27 N 12.3854 -3.9505 -1.6816 N.ar 1 UNL1 -0.2626 + 28 C 11.1954 -4.4190 -1.2230 C.ar 1 UNL1 0.0383 + 29 N 8.1728 -6.3397 -2.1434 N.ar 1 UNL1 -0.0560 + 30 O 7.0590 -6.4694 -1.3138 O.2 1 UNL1 -0.3357 + 31 C 1.8560 -4.5141 -2.7068 C.2 1 UNL1 0.2608 + 32 O 2.3551 -3.9673 -3.6894 O.2 1 UNL1 -0.2712 + 33 H -1.5627 -4.6289 -2.4538 H 1 UNL1 0.0270 + 34 H -0.4839 -3.3052 -2.9621 H 1 UNL1 0.0270 + 35 H -0.4365 -3.9200 -1.3055 H 1 UNL1 0.0270 + 36 H 0.3391 -5.5066 -3.8242 H 1 UNL1 0.0829 + 37 H -0.0289 -8.1576 -0.2310 H 1 UNL1 0.0655 + 38 H 1.0101 -8.2634 2.0180 H 1 UNL1 0.0619 + 39 H 2.6661 -6.5387 2.6859 H 1 UNL1 0.0618 + 40 H 3.3078 -4.7656 1.1543 H 1 UNL1 0.0637 + 41 H 2.8081 -2.4190 -0.7770 H 1 UNL1 0.0564 + 42 H 3.7907 -3.0319 -2.0736 H 1 UNL1 0.0564 + 43 H 4.9807 -6.1895 -1.7161 H 1 UNL1 0.0465 + 44 H 3.3558 -5.6644 -1.3280 H 1 UNL1 0.0465 + 45 H 3.7124 -8.0956 -0.8683 H 1 UNL1 0.0280 + 46 H 3.1769 -7.1812 0.5387 H 1 UNL1 0.0280 + 47 H 5.9903 -8.2015 -0.0442 H 1 UNL1 0.0266 + 48 H 4.9258 -8.6561 1.2800 H 1 UNL1 0.0266 + 49 H 6.6974 -7.0629 2.0367 H 1 UNL1 0.0288 + 50 H 5.0635 -6.4609 2.2775 H 1 UNL1 0.0288 + 51 H 6.4169 -4.6457 1.4177 H 1 UNL1 0.0599 + 52 H 9.6068 -5.1371 -4.1158 H 1 UNL1 0.0626 + 53 H 11.7689 -4.2901 -4.9935 H 1 UNL1 0.0633 + 54 H 13.5202 -3.5652 -3.3635 H 1 UNL1 0.0829 + 55 H 11.1102 -4.4334 -0.1389 H 1 UNL1 0.0837 +@BOND + 1 1 33 1 + 2 1 34 1 + 3 1 35 1 + 4 2 3 1 + 5 2 31 1 + 6 2 1 1 + 7 2 36 1 + 8 3 4 1 + 9 4 5 ar + 10 4 9 ar + 11 5 6 ar + 12 5 37 1 + 13 6 7 ar + 14 6 38 1 + 15 7 8 ar + 16 7 39 1 + 17 8 9 ar + 18 8 40 1 + 19 9 10 1 + 20 10 11 1 + 21 10 31 am + 22 11 12 1 + 23 11 41 1 + 24 11 42 1 + 25 12 13 2 + 26 12 14 am + 27 14 15 1 + 28 14 19 1 + 29 15 16 1 + 30 15 43 1 + 31 15 44 1 + 32 16 17 1 + 33 16 45 1 + 34 16 46 1 + 35 17 18 1 + 36 17 47 1 + 37 17 48 1 + 38 18 19 1 + 39 18 49 1 + 40 18 50 1 + 41 19 20 1 + 42 19 51 1 + 43 20 21 ar + 44 20 30 ar + 45 21 22 ar + 46 22 23 1 + 47 22 29 ar + 48 23 24 ar + 49 23 28 ar + 50 24 25 ar + 51 24 52 1 + 52 25 26 ar + 53 25 53 1 + 54 26 27 ar + 55 26 54 1 + 56 27 28 ar + 57 28 55 1 + 58 29 30 ar + 59 31 32 2 +@MOLECULE +***** + 55 59 0 0 0 +SMALL +GASTEIGER + +@ATOM + 1 C 6.6450 -2.9528 -3.5790 C.3 1 UNL1 -0.0190 + 2 C 5.3558 -3.3663 -4.2925 C.3 1 UNL1 0.1732 + 3 O 4.8555 -2.2863 -5.0593 O.3 1 UNL1 -0.4780 + 4 C 4.0773 -1.4133 -4.3462 C.ar 1 UNL1 0.1429 + 5 C 3.8070 -0.2069 -5.0014 C.ar 1 UNL1 -0.0180 + 6 C 3.0346 0.7665 -4.3789 C.ar 1 UNL1 -0.0582 + 7 C 2.5252 0.5237 -3.1076 C.ar 1 UNL1 -0.0598 + 8 C 2.7807 -0.6914 -2.4577 C.ar 1 UNL1 -0.0367 + 9 C 3.5641 -1.6810 -3.0613 C.ar 1 UNL1 0.0787 + 10 N 3.8035 -2.9572 -2.4600 N.am 1 UNL1 -0.2563 + 11 C 3.3102 -3.3243 -1.1328 C.3 1 UNL1 0.0965 + 12 C 4.4070 -3.6941 -0.1078 C.2 1 UNL1 0.2340 + 13 O 4.8800 -2.7936 0.5973 O.2 1 UNL1 -0.2738 + 14 N 4.8865 -4.9979 -0.0020 N.am 1 UNL1 -0.2884 + 15 C 4.2908 -6.0172 -0.8813 C.3 1 UNL1 0.0155 + 16 C 4.0184 -7.3270 -0.1490 C.3 1 UNL1 -0.0371 + 17 C 5.2268 -7.8170 0.6416 C.3 1 UNL1 -0.0495 + 18 C 5.8081 -6.7000 1.5094 C.3 1 UNL1 -0.0255 + 19 C 6.1196 -5.4213 0.7111 C.3 1 UNL1 0.1048 + 20 C 7.2484 -5.6016 -0.2736 C.ar 1 UNL1 0.2482 + 21 N 7.1985 -5.9525 -1.5341 N.ar 1 UNL1 -0.1897 + 22 C 8.5203 -6.1214 -1.8679 C.ar 1 UNL1 0.2036 + 23 C 8.9094 -6.6682 -3.1511 C.ar 1 UNL1 0.0405 + 24 C 10.2619 -6.8452 -3.4640 C.ar 1 UNL1 -0.0481 + 25 C 10.6341 -7.3005 -4.7259 C.ar 1 UNL1 -0.0429 + 26 C 9.6338 -7.5725 -5.6427 C.ar 1 UNL1 0.0276 + 27 N 8.3162 -7.4330 -5.3786 N.ar 1 UNL1 -0.2626 + 28 C 7.9843 -6.9845 -4.1397 C.ar 1 UNL1 0.0383 + 29 N 9.3690 -5.8120 -0.8687 N.ar 1 UNL1 -0.0560 + 30 O 8.5285 -5.4511 0.1843 O.2 1 UNL1 -0.3357 + 31 C 4.4201 -3.9352 -3.2311 C.2 1 UNL1 0.2608 + 32 O 4.3675 -5.1402 -2.9892 O.2 1 UNL1 -0.2712 + 33 H 7.3990 -2.6031 -4.2879 H 1 UNL1 0.0270 + 34 H 7.0529 -3.7927 -3.0076 H 1 UNL1 0.0270 + 35 H 6.4667 -2.1304 -2.8748 H 1 UNL1 0.0270 + 36 H 5.5838 -4.1733 -4.9985 H 1 UNL1 0.0829 + 37 H 4.2058 -0.0287 -5.9971 H 1 UNL1 0.0655 + 38 H 2.8274 1.7064 -4.8842 H 1 UNL1 0.0619 + 39 H 1.9134 1.2778 -2.6162 H 1 UNL1 0.0618 + 40 H 2.3237 -0.8319 -1.4837 H 1 UNL1 0.0637 + 41 H 2.6094 -4.1630 -1.1936 H 1 UNL1 0.0564 + 42 H 2.7216 -2.4901 -0.7341 H 1 UNL1 0.0564 + 43 H 4.9807 -6.1895 -1.7161 H 1 UNL1 0.0465 + 44 H 3.3558 -5.6644 -1.3280 H 1 UNL1 0.0465 + 45 H 3.7124 -8.0956 -0.8683 H 1 UNL1 0.0280 + 46 H 3.1769 -7.1812 0.5387 H 1 UNL1 0.0280 + 47 H 5.9903 -8.2015 -0.0442 H 1 UNL1 0.0266 + 48 H 4.9258 -8.6561 1.2800 H 1 UNL1 0.0266 + 49 H 6.6974 -7.0629 2.0367 H 1 UNL1 0.0288 + 50 H 5.0635 -6.4609 2.2775 H 1 UNL1 0.0288 + 51 H 6.4169 -4.6457 1.4177 H 1 UNL1 0.0599 + 52 H 11.0315 -6.6141 -2.7309 H 1 UNL1 0.0626 + 53 H 11.6791 -7.4285 -4.9846 H 1 UNL1 0.0633 + 54 H 9.8747 -7.9131 -6.6457 H 1 UNL1 0.0829 + 55 H 6.9145 -6.8755 -3.9772 H 1 UNL1 0.0837 +@BOND + 1 1 33 1 + 2 1 34 1 + 3 1 35 1 + 4 2 3 1 + 5 2 31 1 + 6 2 1 1 + 7 2 36 1 + 8 3 4 1 + 9 4 5 ar + 10 4 9 ar + 11 5 6 ar + 12 5 37 1 + 13 6 7 ar + 14 6 38 1 + 15 7 8 ar + 16 7 39 1 + 17 8 9 ar + 18 8 40 1 + 19 9 10 1 + 20 10 11 1 + 21 10 31 am + 22 11 12 1 + 23 11 41 1 + 24 11 42 1 + 25 12 13 2 + 26 12 14 am + 27 14 15 1 + 28 14 19 1 + 29 15 16 1 + 30 15 43 1 + 31 15 44 1 + 32 16 17 1 + 33 16 45 1 + 34 16 46 1 + 35 17 18 1 + 36 17 47 1 + 37 17 48 1 + 38 18 19 1 + 39 18 49 1 + 40 18 50 1 + 41 19 20 1 + 42 19 51 1 + 43 20 21 ar + 44 20 30 ar + 45 21 22 ar + 46 22 23 1 + 47 22 29 ar + 48 23 24 ar + 49 23 28 ar + 50 24 25 ar + 51 24 52 1 + 52 25 26 ar + 53 25 53 1 + 54 26 27 ar + 55 26 54 1 + 56 27 28 ar + 57 28 55 1 + 58 29 30 ar + 59 31 32 2 diff --git a/tests/structure/data/molecules/zinc_33_conformers.sdf b/tests/structure/data/molecules/zinc_33_conformers.sdf new file mode 100644 index 000000000..59f6b773f --- /dev/null +++ b/tests/structure/data/molecules/zinc_33_conformers.sdf @@ -0,0 +1,3600 @@ + + OpenBabel08312206043D + + 55 59 0 0 1 0 0 0 0 0999 V2000 + 8.8436 -3.9435 1.1456 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.3823 -3.0085 2.2659 C 0 0 2 0 0 0 0 0 0 0 0 0 + 8.1757 -3.7426 3.4589 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9361 -4.3186 3.5482 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8077 -5.2665 4.5694 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6003 -5.9287 4.7579 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5222 -5.6306 3.9312 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6446 -4.6686 2.9195 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8533 -3.9974 2.7053 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0077 -2.9686 1.7229 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9406 -2.5673 0.8065 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4070 -3.6941 -0.1078 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5119 -3.4197 -0.9172 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8865 -4.9979 -0.0020 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2908 -6.0172 -0.8813 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0184 -7.3270 -0.1490 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2268 -7.8170 0.6416 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8081 -6.7000 1.5094 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1196 -5.4213 0.7111 C 0 0 1 0 0 0 0 0 0 0 0 0 + 7.2484 -5.6016 -0.2736 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9498 -6.6746 -0.5406 N 0 0 0 0 0 0 0 0 0 0 0 0 + 8.9357 -6.2080 -1.3759 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.0355 -7.0544 -1.7894 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.1167 -8.3779 -1.3419 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.2140 -9.1648 -1.6810 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.2027 -8.6013 -2.4685 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.1575 -7.3349 -2.9371 N 0 0 0 0 0 0 0 0 0 0 0 0 + 11.0757 -6.5910 -2.5873 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.8072 -4.9020 -1.6794 N 0 0 0 0 0 0 0 0 0 0 0 0 + 7.6795 -4.5016 -0.9628 O 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1844 -2.2294 1.7332 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3089 -1.1221 1.2117 O 0 0 0 0 0 0 0 0 0 0 0 0 + 9.7502 -4.4848 1.4255 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.0334 -3.3774 0.2281 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0818 -4.6989 0.9155 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.1792 -2.2859 2.4763 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.6550 -5.4889 5.2133 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4999 -6.6689 5.5475 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5712 -6.1394 4.0769 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7558 -4.4570 2.3342 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2639 -1.7395 0.1673 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1070 -2.1647 1.3934 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9807 -6.1895 -1.7161 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3558 -5.6644 -1.3280 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7124 -8.0956 -0.8683 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1769 -7.1812 0.5387 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9903 -8.2015 -0.0442 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9258 -8.6561 1.2800 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6974 -7.0629 2.0367 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0635 -6.4609 2.2775 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4169 -4.6457 1.4177 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.3329 -8.7961 -0.7143 H 0 0 0 0 0 0 0 0 0 0 0 0 + 11.2949 -10.1870 -1.3290 H 0 0 0 0 0 0 0 0 0 0 0 0 + 13.0864 -9.1693 -2.7449 H 0 0 0 0 0 0 0 0 0 0 0 0 + 11.0888 -5.5754 -2.9760 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 33 1 0 0 0 0 + 1 34 1 0 0 0 0 + 1 35 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 31 1 0 0 0 0 + 2 1 1 0 0 0 0 + 2 36 1 1 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 9 2 0 0 0 0 + 5 6 2 0 0 0 0 + 5 37 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 38 1 0 0 0 0 + 7 8 2 0 0 0 0 + 7 39 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 40 1 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 1 0 0 0 0 + 10 31 1 0 0 0 0 + 11 12 1 0 0 0 0 + 11 41 1 0 0 0 0 + 11 42 1 0 0 0 0 + 12 13 2 0 0 0 0 + 12 14 1 0 0 0 0 + 14 15 1 0 0 0 0 + 14 19 1 0 0 0 0 + 15 16 1 0 0 0 0 + 15 43 1 0 0 0 0 + 15 44 1 0 0 0 0 + 16 17 1 0 0 0 0 + 16 45 1 0 0 0 0 + 16 46 1 0 0 0 0 + 17 18 1 0 0 0 0 + 17 47 1 0 0 0 0 + 17 48 1 0 0 0 0 + 18 19 1 0 0 0 0 + 18 49 1 0 0 0 0 + 18 50 1 0 0 0 0 + 19 20 1 0 0 0 0 + 19 51 1 1 0 0 0 + 20 21 2 0 0 0 0 + 20 30 1 0 0 0 0 + 21 22 1 0 0 0 0 + 22 23 1 0 0 0 0 + 22 29 2 0 0 0 0 + 23 24 1 0 0 0 0 + 23 28 2 0 0 0 0 + 24 25 2 0 0 0 0 + 24 52 1 0 0 0 0 + 25 26 1 0 0 0 0 + 25 53 1 0 0 0 0 + 26 27 2 0 0 0 0 + 26 54 1 0 0 0 0 + 27 28 1 0 0 0 0 + 28 55 1 0 0 0 0 + 29 30 1 0 0 0 0 + 31 32 2 0 0 0 0 +M END +$$$$ + + OpenBabel08312206043D + + 55 59 0 0 1 0 0 0 0 0999 V2000 + 3.1381 -1.3010 4.3264 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3428 -2.8129 4.2060 C 0 0 2 0 0 0 0 0 0 0 0 0 + 4.3871 -3.2329 5.0648 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6376 -3.1084 4.5196 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6871 -3.2488 5.4343 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0045 -3.1349 5.0062 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.2668 -2.8931 3.6618 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2167 -2.7698 2.7420 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8831 -2.8707 3.1524 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7822 -2.8083 2.2405 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9406 -2.5673 0.8065 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4070 -3.6941 -0.1078 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5119 -3.4197 -0.9172 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8865 -4.9979 -0.0020 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2908 -6.0172 -0.8813 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0184 -7.3270 -0.1490 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2268 -7.8170 0.6416 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8081 -6.7000 1.5094 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1196 -5.4213 0.7111 C 0 0 1 0 0 0 0 0 0 0 0 0 + 7.2484 -5.6016 -0.2736 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.7931 -4.7233 -1.0776 N 0 0 0 0 0 0 0 0 0 0 0 0 + 8.6382 -5.4828 -1.8497 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.3311 -4.9168 -2.9883 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.1517 -3.5711 -3.3283 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.7606 -3.0502 -4.4667 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.5414 -3.8965 -5.2344 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.7562 -5.1963 -4.9350 N 0 0 0 0 0 0 0 0 0 0 0 0 + 10.1469 -5.6764 -3.8195 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.6748 -6.7796 -1.4874 N 0 0 0 0 0 0 0 0 0 0 0 0 + 7.7665 -6.8576 -0.4317 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5178 -3.1236 2.7233 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5702 -3.4556 2.0123 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9290 -1.0075 5.3576 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3121 -0.9742 3.6866 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0343 -0.7496 4.0155 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4335 -3.3226 4.5452 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4717 -3.4426 6.4822 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.8212 -3.2389 5.7160 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2958 -2.8098 3.3173 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.4905 -2.6184 1.7030 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9914 -2.3960 0.5518 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4295 -1.6325 0.5492 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9807 -6.1895 -1.7161 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3558 -5.6644 -1.3280 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7124 -8.0956 -0.8683 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1769 -7.1812 0.5387 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9903 -8.2015 -0.0442 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9258 -8.6561 1.2800 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6974 -7.0629 2.0367 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0635 -6.4609 2.2775 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4169 -4.6457 1.4177 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.5242 -2.9274 -2.7159 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.6181 -2.0129 -4.7480 H 0 0 0 0 0 0 0 0 0 0 0 0 + 11.0226 -3.5413 -6.1412 H 0 0 0 0 0 0 0 0 0 0 0 0 + 10.3377 -6.7293 -3.6258 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 33 1 0 0 0 0 + 1 34 1 0 0 0 0 + 1 35 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 31 1 0 0 0 0 + 2 1 1 0 0 0 0 + 2 36 1 1 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 9 2 0 0 0 0 + 5 6 2 0 0 0 0 + 5 37 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 38 1 0 0 0 0 + 7 8 2 0 0 0 0 + 7 39 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 40 1 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 1 0 0 0 0 + 10 31 1 0 0 0 0 + 11 12 1 0 0 0 0 + 11 41 1 0 0 0 0 + 11 42 1 0 0 0 0 + 12 13 2 0 0 0 0 + 12 14 1 0 0 0 0 + 14 15 1 0 0 0 0 + 14 19 1 0 0 0 0 + 15 16 1 0 0 0 0 + 15 43 1 0 0 0 0 + 15 44 1 0 0 0 0 + 16 17 1 0 0 0 0 + 16 45 1 0 0 0 0 + 16 46 1 0 0 0 0 + 17 18 1 0 0 0 0 + 17 47 1 0 0 0 0 + 17 48 1 0 0 0 0 + 18 19 1 0 0 0 0 + 18 49 1 0 0 0 0 + 18 50 1 0 0 0 0 + 19 20 1 0 0 0 0 + 19 51 1 1 0 0 0 + 20 21 2 0 0 0 0 + 20 30 1 0 0 0 0 + 21 22 1 0 0 0 0 + 22 23 1 0 0 0 0 + 22 29 2 0 0 0 0 + 23 24 1 0 0 0 0 + 23 28 2 0 0 0 0 + 24 25 2 0 0 0 0 + 24 52 1 0 0 0 0 + 25 26 1 0 0 0 0 + 25 53 1 0 0 0 0 + 26 27 2 0 0 0 0 + 26 54 1 0 0 0 0 + 27 28 1 0 0 0 0 + 28 55 1 0 0 0 0 + 29 30 1 0 0 0 0 + 31 32 2 0 0 0 0 +M END +$$$$ + + OpenBabel08312206043D + + 55 59 0 0 1 0 0 0 0 0999 V2000 + 6.0210 -4.9489 4.0319 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7742 -3.4753 4.3633 C 0 0 2 0 0 0 0 0 0 0 0 0 + 4.5537 -3.3320 5.0666 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4533 -3.2434 4.2556 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2294 -3.3825 4.9194 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0385 -3.3203 4.2056 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0767 -3.1068 2.8317 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3013 -2.9498 2.1688 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5125 -3.0190 2.8656 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7822 -2.8083 2.2405 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9406 -2.5673 0.8065 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4070 -3.6941 -0.1078 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5119 -3.4197 -0.9172 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8865 -4.9979 -0.0020 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2908 -6.0172 -0.8813 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0184 -7.3270 -0.1490 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2268 -7.8170 0.6416 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8081 -6.7000 1.5094 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1196 -5.4213 0.7111 C 0 0 1 0 0 0 0 0 0 0 0 0 + 7.2484 -5.6016 -0.2736 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.5352 -5.4365 -0.0963 N 0 0 0 0 0 0 0 0 0 0 0 0 + 9.0485 -5.5683 -1.3637 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.4434 -5.2983 -1.6434 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.1482 -4.3581 -0.8832 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.4670 -4.0470 -1.2030 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.0477 -4.6950 -2.2792 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.4115 -5.6212 -3.0293 N 0 0 0 0 0 0 0 0 0 0 0 0 + 11.1249 -5.9017 -2.6944 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.1199 -5.8808 -2.2881 N 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9279 -5.9197 -1.5647 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9003 -2.6965 3.0582 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9592 -2.1743 2.7124 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0223 -5.5659 4.9334 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9777 -5.0699 3.5137 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2375 -5.3483 3.3757 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.5664 -3.1248 5.0349 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2101 -3.5442 5.9944 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0867 -3.4329 4.7185 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.1483 -3.0495 2.2666 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2597 -2.7496 1.1031 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9914 -2.3960 0.5518 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4295 -1.6325 0.5492 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9807 -6.1895 -1.7161 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3558 -5.6644 -1.3280 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7124 -8.0956 -0.8683 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1769 -7.1812 0.5387 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9903 -8.2015 -0.0442 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9258 -8.6561 1.2800 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6974 -7.0629 2.0367 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0635 -6.4609 2.2775 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4169 -4.6457 1.4177 H 0 0 0 0 0 0 0 0 0 0 0 0 + 10.6674 -3.8530 -0.0484 H 0 0 0 0 0 0 0 0 0 0 0 0 + 13.0189 -3.3105 -0.6301 H 0 0 0 0 0 0 0 0 0 0 0 0 + 14.0681 -4.4735 -2.5786 H 0 0 0 0 0 0 0 0 0 0 0 0 + 10.6497 -6.6425 -3.3332 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 33 1 0 0 0 0 + 1 34 1 0 0 0 0 + 1 35 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 31 1 0 0 0 0 + 2 1 1 0 0 0 0 + 2 36 1 1 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 9 2 0 0 0 0 + 5 6 2 0 0 0 0 + 5 37 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 38 1 0 0 0 0 + 7 8 2 0 0 0 0 + 7 39 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 40 1 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 1 0 0 0 0 + 10 31 1 0 0 0 0 + 11 12 1 0 0 0 0 + 11 41 1 0 0 0 0 + 11 42 1 0 0 0 0 + 12 13 2 0 0 0 0 + 12 14 1 0 0 0 0 + 14 15 1 0 0 0 0 + 14 19 1 0 0 0 0 + 15 16 1 0 0 0 0 + 15 43 1 0 0 0 0 + 15 44 1 0 0 0 0 + 16 17 1 0 0 0 0 + 16 45 1 0 0 0 0 + 16 46 1 0 0 0 0 + 17 18 1 0 0 0 0 + 17 47 1 0 0 0 0 + 17 48 1 0 0 0 0 + 18 19 1 0 0 0 0 + 18 49 1 0 0 0 0 + 18 50 1 0 0 0 0 + 19 20 1 0 0 0 0 + 19 51 1 1 0 0 0 + 20 21 2 0 0 0 0 + 20 30 1 0 0 0 0 + 21 22 1 0 0 0 0 + 22 23 1 0 0 0 0 + 22 29 2 0 0 0 0 + 23 24 1 0 0 0 0 + 23 28 2 0 0 0 0 + 24 25 2 0 0 0 0 + 24 52 1 0 0 0 0 + 25 26 1 0 0 0 0 + 25 53 1 0 0 0 0 + 26 27 2 0 0 0 0 + 26 54 1 0 0 0 0 + 27 28 1 0 0 0 0 + 28 55 1 0 0 0 0 + 29 30 1 0 0 0 0 + 31 32 2 0 0 0 0 +M END +$$$$ + + OpenBabel08312206043D + + 55 59 0 0 1 0 0 0 0 0999 V2000 + 4.1898 0.6137 -1.7547 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2621 0.8703 -0.6933 C 0 0 2 0 0 0 0 0 0 0 0 0 + 6.5457 0.8834 -1.2908 O 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1054 -0.3591 -1.4303 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.2316 -0.3996 -2.2596 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.8855 -1.6044 -2.4885 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.4169 -2.7623 -1.8767 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2996 -2.7196 -1.0319 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6199 -1.5198 -0.7954 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5108 -1.4187 0.1029 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9406 -2.5673 0.8065 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4070 -3.6941 -0.1078 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5119 -3.4197 -0.9172 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8865 -4.9979 -0.0020 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2908 -6.0172 -0.8813 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0184 -7.3270 -0.1490 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2268 -7.8170 0.6416 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8081 -6.7000 1.5094 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1196 -5.4213 0.7111 C 0 0 1 0 0 0 0 0 0 0 0 0 + 7.2484 -5.6016 -0.2736 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1985 -5.9525 -1.5341 N 0 0 0 0 0 0 0 0 0 0 0 0 + 8.5203 -6.1214 -1.8679 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.9094 -6.6682 -3.1511 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0767 -7.5762 -3.8150 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.4881 -8.1564 -5.0118 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.7279 -7.8039 -5.5156 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.5563 -6.9195 -4.9182 N 0 0 0 0 0 0 0 0 0 0 0 0 + 10.1284 -6.3720 -3.7507 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.3690 -5.8120 -0.8687 N 0 0 0 0 0 0 0 0 0 0 0 0 + 8.5285 -5.4511 0.1843 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0426 -0.1491 0.4195 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3645 0.1089 1.4130 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2339 1.3567 -2.5542 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1925 0.6316 -1.3037 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3208 -0.3680 -2.2269 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1057 1.8667 -0.2640 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.5929 0.5120 -2.7294 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.7578 -1.6389 -3.1363 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.9277 -3.7085 -2.0450 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0080 -3.6508 -0.5573 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1259 -2.2563 1.4683 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7042 -2.9853 1.4725 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9807 -6.1895 -1.7161 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3558 -5.6644 -1.3280 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7124 -8.0956 -0.8683 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1769 -7.1812 0.5387 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9903 -8.2015 -0.0442 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9258 -8.6561 1.2800 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6974 -7.0629 2.0367 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0635 -6.4609 2.2775 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4169 -4.6457 1.4177 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1109 -7.8468 -3.3942 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.8578 -8.8714 -5.5283 H 0 0 0 0 0 0 0 0 0 0 0 0 + 10.1004 -8.2428 -6.4368 H 0 0 0 0 0 0 0 0 0 0 0 0 + 10.8329 -5.6768 -3.3000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 33 1 0 0 0 0 + 1 34 1 0 0 0 0 + 1 35 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 31 1 0 0 0 0 + 2 1 1 0 0 0 0 + 2 36 1 1 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 9 2 0 0 0 0 + 5 6 2 0 0 0 0 + 5 37 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 38 1 0 0 0 0 + 7 8 2 0 0 0 0 + 7 39 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 40 1 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 1 0 0 0 0 + 10 31 1 0 0 0 0 + 11 12 1 0 0 0 0 + 11 41 1 0 0 0 0 + 11 42 1 0 0 0 0 + 12 13 2 0 0 0 0 + 12 14 1 0 0 0 0 + 14 15 1 0 0 0 0 + 14 19 1 0 0 0 0 + 15 16 1 0 0 0 0 + 15 43 1 0 0 0 0 + 15 44 1 0 0 0 0 + 16 17 1 0 0 0 0 + 16 45 1 0 0 0 0 + 16 46 1 0 0 0 0 + 17 18 1 0 0 0 0 + 17 47 1 0 0 0 0 + 17 48 1 0 0 0 0 + 18 19 1 0 0 0 0 + 18 49 1 0 0 0 0 + 18 50 1 0 0 0 0 + 19 20 1 0 0 0 0 + 19 51 1 1 0 0 0 + 20 21 2 0 0 0 0 + 20 30 1 0 0 0 0 + 21 22 1 0 0 0 0 + 22 23 1 0 0 0 0 + 22 29 2 0 0 0 0 + 23 24 1 0 0 0 0 + 23 28 2 0 0 0 0 + 24 25 2 0 0 0 0 + 24 52 1 0 0 0 0 + 25 26 1 0 0 0 0 + 25 53 1 0 0 0 0 + 26 27 2 0 0 0 0 + 26 54 1 0 0 0 0 + 27 28 1 0 0 0 0 + 28 55 1 0 0 0 0 + 29 30 1 0 0 0 0 + 31 32 2 0 0 0 0 +M END +$$$$ + + OpenBabel08312206043D + + 55 59 0 0 1 0 0 0 0 0999 V2000 + 6.6330 -2.0259 4.5595 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.7277 -3.4474 4.0005 C 0 0 2 0 0 0 0 0 0 0 0 0 + 8.0577 -3.7270 3.6032 O 0 0 0 0 0 0 0 0 0 0 0 0 + 8.3590 -3.3025 2.3362 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.7239 -3.3136 2.0286 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.1596 -2.8970 0.7763 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2261 -2.4823 -0.1678 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.8575 -2.4875 0.1333 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3974 -2.8931 1.3907 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0077 -2.9686 1.7229 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9406 -2.5673 0.8065 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4070 -3.6941 -0.1078 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5119 -3.4197 -0.9172 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8865 -4.9979 -0.0020 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2908 -6.0172 -0.8813 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0184 -7.3270 -0.1490 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2268 -7.8170 0.6416 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8081 -6.7000 1.5094 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1196 -5.4213 0.7111 C 0 0 1 0 0 0 0 0 0 0 0 0 + 7.2484 -5.6016 -0.2736 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.7931 -4.7233 -1.0776 N 0 0 0 0 0 0 0 0 0 0 0 0 + 8.6382 -5.4828 -1.8497 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.3311 -4.9168 -2.9883 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.1517 -3.5711 -3.3283 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.7606 -3.0502 -4.4667 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.5414 -3.8965 -5.2344 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.7562 -5.1963 -4.9350 N 0 0 0 0 0 0 0 0 0 0 0 0 + 10.1469 -5.6764 -3.8195 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.6748 -6.7796 -1.4874 N 0 0 0 0 0 0 0 0 0 0 0 0 + 7.7665 -6.8576 -0.4317 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6567 -3.5761 2.9225 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5376 -4.0241 3.1681 O 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3223 -1.8785 5.3940 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6131 -1.8137 4.8958 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8919 -1.2786 3.7990 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4819 -4.1594 4.7969 H 0 0 0 0 0 0 0 0 0 0 0 0 + 10.4453 -3.6442 2.7720 H 0 0 0 0 0 0 0 0 0 0 0 0 + 11.2199 -2.9003 0.5369 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.5585 -2.1614 -1.1533 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1800 -2.1873 -0.6594 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2639 -1.7395 0.1673 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1070 -2.1647 1.3934 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9807 -6.1895 -1.7161 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3558 -5.6644 -1.3280 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7124 -8.0956 -0.8683 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1769 -7.1812 0.5387 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9903 -8.2015 -0.0442 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9258 -8.6561 1.2800 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6974 -7.0629 2.0367 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0635 -6.4609 2.2775 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4169 -4.6457 1.4177 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.5242 -2.9274 -2.7159 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.6181 -2.0129 -4.7480 H 0 0 0 0 0 0 0 0 0 0 0 0 + 11.0226 -3.5413 -6.1412 H 0 0 0 0 0 0 0 0 0 0 0 0 + 10.3377 -6.7293 -3.6258 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 33 1 0 0 0 0 + 1 34 1 0 0 0 0 + 1 35 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 31 1 0 0 0 0 + 2 1 1 0 0 0 0 + 2 36 1 1 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 9 2 0 0 0 0 + 5 6 2 0 0 0 0 + 5 37 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 38 1 0 0 0 0 + 7 8 2 0 0 0 0 + 7 39 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 40 1 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 1 0 0 0 0 + 10 31 1 0 0 0 0 + 11 12 1 0 0 0 0 + 11 41 1 0 0 0 0 + 11 42 1 0 0 0 0 + 12 13 2 0 0 0 0 + 12 14 1 0 0 0 0 + 14 15 1 0 0 0 0 + 14 19 1 0 0 0 0 + 15 16 1 0 0 0 0 + 15 43 1 0 0 0 0 + 15 44 1 0 0 0 0 + 16 17 1 0 0 0 0 + 16 45 1 0 0 0 0 + 16 46 1 0 0 0 0 + 17 18 1 0 0 0 0 + 17 47 1 0 0 0 0 + 17 48 1 0 0 0 0 + 18 19 1 0 0 0 0 + 18 49 1 0 0 0 0 + 18 50 1 0 0 0 0 + 19 20 1 0 0 0 0 + 19 51 1 1 0 0 0 + 20 21 2 0 0 0 0 + 20 30 1 0 0 0 0 + 21 22 1 0 0 0 0 + 22 23 1 0 0 0 0 + 22 29 2 0 0 0 0 + 23 24 1 0 0 0 0 + 23 28 2 0 0 0 0 + 24 25 2 0 0 0 0 + 24 52 1 0 0 0 0 + 25 26 1 0 0 0 0 + 25 53 1 0 0 0 0 + 26 27 2 0 0 0 0 + 26 54 1 0 0 0 0 + 27 28 1 0 0 0 0 + 28 55 1 0 0 0 0 + 29 30 1 0 0 0 0 + 31 32 2 0 0 0 0 +M END +$$$$ + + OpenBabel08312206043D + + 55 59 0 0 1 0 0 0 0 0999 V2000 + 2.4524 -3.1498 -5.1919 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3531 -2.0294 -4.6671 C 0 0 2 0 0 0 0 0 0 0 0 0 + 4.6842 -2.2281 -5.1069 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4127 -3.0690 -4.3077 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6225 -3.4976 -4.8651 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.4492 -4.3611 -4.1563 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0676 -4.7828 -2.8869 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8645 -4.3402 -2.3207 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0123 -3.4791 -3.0203 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8035 -2.9572 -2.4600 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3102 -3.3243 -1.1328 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4070 -3.6941 -0.1078 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8800 -2.7936 0.5973 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8865 -4.9979 -0.0020 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2908 -6.0172 -0.8813 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0184 -7.3270 -0.1490 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2268 -7.8170 0.6416 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8081 -6.7000 1.5094 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1196 -5.4213 0.7111 C 0 0 1 0 0 0 0 0 0 0 0 0 + 7.2484 -5.6016 -0.2736 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9498 -6.6746 -0.5406 N 0 0 0 0 0 0 0 0 0 0 0 0 + 8.9357 -6.2080 -1.3759 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.0355 -7.0544 -1.7894 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.2896 -6.4991 -2.0680 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.3229 -7.3055 -2.5371 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.0705 -8.6552 -2.7097 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.8819 -9.2367 -2.4372 N 0 0 0 0 0 0 0 0 0 0 0 0 + 9.8923 -8.4237 -1.9834 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.8072 -4.9020 -1.6794 N 0 0 0 0 0 0 0 0 0 0 0 0 + 7.6795 -4.5016 -0.9628 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1413 -1.9550 -3.1587 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3257 -1.1845 -2.6539 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4912 -3.2158 -6.2816 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4160 -2.9860 -4.8797 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7631 -4.1280 -4.8040 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0204 -1.0765 -5.0947 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9140 -3.1583 -5.8561 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.3872 -4.6991 -4.5894 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.7129 -5.4533 -2.3223 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6437 -4.6772 -1.3132 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6094 -4.1630 -1.1936 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7216 -2.4901 -0.7341 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9807 -6.1895 -1.7161 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3558 -5.6644 -1.3280 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7124 -8.0956 -0.8683 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1769 -7.1812 0.5387 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9903 -8.2015 -0.0442 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9258 -8.6561 1.2800 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6974 -7.0629 2.0367 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0635 -6.4609 2.2775 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4169 -4.6457 1.4177 H 0 0 0 0 0 0 0 0 0 0 0 0 + 11.4616 -5.4332 -1.9355 H 0 0 0 0 0 0 0 0 0 0 0 0 + 13.2947 -6.8846 -2.7694 H 0 0 0 0 0 0 0 0 0 0 0 0 + 12.8394 -9.3217 -3.0900 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.9510 -8.9329 -1.7902 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 33 1 0 0 0 0 + 1 34 1 0 0 0 0 + 1 35 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 31 1 0 0 0 0 + 2 1 1 0 0 0 0 + 2 36 1 6 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 9 2 0 0 0 0 + 5 6 2 0 0 0 0 + 5 37 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 38 1 0 0 0 0 + 7 8 2 0 0 0 0 + 7 39 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 40 1 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 1 0 0 0 0 + 10 31 1 0 0 0 0 + 11 12 1 0 0 0 0 + 11 41 1 0 0 0 0 + 11 42 1 0 0 0 0 + 12 13 2 0 0 0 0 + 12 14 1 0 0 0 0 + 14 15 1 0 0 0 0 + 14 19 1 0 0 0 0 + 15 16 1 0 0 0 0 + 15 43 1 0 0 0 0 + 15 44 1 0 0 0 0 + 16 17 1 0 0 0 0 + 16 45 1 0 0 0 0 + 16 46 1 0 0 0 0 + 17 18 1 0 0 0 0 + 17 47 1 0 0 0 0 + 17 48 1 0 0 0 0 + 18 19 1 0 0 0 0 + 18 49 1 0 0 0 0 + 18 50 1 0 0 0 0 + 19 20 1 0 0 0 0 + 19 51 1 1 0 0 0 + 20 21 2 0 0 0 0 + 20 30 1 0 0 0 0 + 21 22 1 0 0 0 0 + 22 23 1 0 0 0 0 + 22 29 2 0 0 0 0 + 23 24 1 0 0 0 0 + 23 28 2 0 0 0 0 + 24 25 2 0 0 0 0 + 24 52 1 0 0 0 0 + 25 26 1 0 0 0 0 + 25 53 1 0 0 0 0 + 26 27 2 0 0 0 0 + 26 54 1 0 0 0 0 + 27 28 1 0 0 0 0 + 28 55 1 0 0 0 0 + 29 30 1 0 0 0 0 + 31 32 2 0 0 0 0 +M END +$$$$ + + OpenBabel08312206043D + + 55 59 0 0 1 0 0 0 0 0999 V2000 + 5.5442 -0.6363 -3.3747 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0266 -0.4674 -3.4770 C 0 0 2 0 0 0 0 0 0 0 0 0 + 3.6165 0.6890 -2.7705 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4151 0.4790 -1.4320 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2851 1.6476 -0.6733 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0856 1.5684 0.6998 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0046 0.3195 1.3068 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1171 -0.8515 0.5452 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3284 -0.7954 -0.8366 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3924 -1.9629 -1.6614 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3102 -3.3243 -1.1328 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4070 -3.6941 -0.1078 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8800 -2.7936 0.5973 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8865 -4.9979 -0.0020 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2908 -6.0172 -0.8813 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0184 -7.3270 -0.1490 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2268 -7.8170 0.6416 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8081 -6.7000 1.5094 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1196 -5.4213 0.7111 C 0 0 1 0 0 0 0 0 0 0 0 0 + 7.2484 -5.6016 -0.2736 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9498 -6.6746 -0.5406 N 0 0 0 0 0 0 0 0 0 0 0 0 + 8.9357 -6.2080 -1.3759 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.0355 -7.0544 -1.7894 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.0367 -6.5534 -2.6292 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.0513 -7.3908 -3.0846 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.0370 -8.7138 -2.6788 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.1012 -9.2358 -1.8559 N 0 0 0 0 0 0 0 0 0 0 0 0 + 10.1227 -8.3947 -1.4301 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.8072 -4.9020 -1.6794 N 0 0 0 0 0 0 0 0 0 0 0 0 + 7.6795 -4.5016 -0.9628 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3995 -1.7870 -3.0398 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0973 -2.6629 -3.8492 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0698 0.2468 -3.7451 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8713 -1.5125 -3.9436 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8618 -0.7809 -2.3345 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7571 -0.3056 -4.5271 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3450 2.6190 -1.1580 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9891 2.4750 1.2918 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8412 0.2488 2.3805 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0082 -1.7926 1.0742 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3429 -4.0612 -1.9417 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3289 -3.4601 -0.6639 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9807 -6.1895 -1.7161 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3558 -5.6644 -1.3280 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7124 -8.0956 -0.8683 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1769 -7.1812 0.5387 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9903 -8.2015 -0.0442 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9258 -8.6561 1.2800 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6974 -7.0629 2.0367 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0635 -6.4609 2.2775 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4169 -4.6457 1.4177 H 0 0 0 0 0 0 0 0 0 0 0 0 + 11.0213 -5.5125 -2.9443 H 0 0 0 0 0 0 0 0 0 0 0 0 + 12.8248 -7.0178 -3.7465 H 0 0 0 0 0 0 0 0 0 0 0 0 + 12.7970 -9.4102 -3.0215 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.3854 -8.8615 -0.7811 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 33 1 0 0 0 0 + 1 34 1 0 0 0 0 + 1 35 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 31 1 0 0 0 0 + 2 1 1 0 0 0 0 + 2 36 1 6 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 9 2 0 0 0 0 + 5 6 2 0 0 0 0 + 5 37 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 38 1 0 0 0 0 + 7 8 2 0 0 0 0 + 7 39 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 40 1 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 1 0 0 0 0 + 10 31 1 0 0 0 0 + 11 12 1 0 0 0 0 + 11 41 1 0 0 0 0 + 11 42 1 0 0 0 0 + 12 13 2 0 0 0 0 + 12 14 1 0 0 0 0 + 14 15 1 0 0 0 0 + 14 19 1 0 0 0 0 + 15 16 1 0 0 0 0 + 15 43 1 0 0 0 0 + 15 44 1 0 0 0 0 + 16 17 1 0 0 0 0 + 16 45 1 0 0 0 0 + 16 46 1 0 0 0 0 + 17 18 1 0 0 0 0 + 17 47 1 0 0 0 0 + 17 48 1 0 0 0 0 + 18 19 1 0 0 0 0 + 18 49 1 0 0 0 0 + 18 50 1 0 0 0 0 + 19 20 1 0 0 0 0 + 19 51 1 1 0 0 0 + 20 21 2 0 0 0 0 + 20 30 1 0 0 0 0 + 21 22 1 0 0 0 0 + 22 23 1 0 0 0 0 + 22 29 2 0 0 0 0 + 23 24 1 0 0 0 0 + 23 28 2 0 0 0 0 + 24 25 2 0 0 0 0 + 24 52 1 0 0 0 0 + 25 26 1 0 0 0 0 + 25 53 1 0 0 0 0 + 26 27 2 0 0 0 0 + 26 54 1 0 0 0 0 + 27 28 1 0 0 0 0 + 28 55 1 0 0 0 0 + 29 30 1 0 0 0 0 + 31 32 2 0 0 0 0 +M END +$$$$ + + OpenBabel08312206043D + + 55 59 0 0 1 0 0 0 0 0999 V2000 + -0.8173 -2.9655 -1.4108 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.2540 -2.9288 0.0117 C 0 0 2 0 0 0 0 0 0 0 0 0 + -0.3218 -1.6123 0.5286 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7430 -0.8241 0.1803 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.5656 0.5397 0.4382 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.5711 1.4454 0.1214 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7554 0.9811 -0.4412 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9410 -0.3867 -0.6835 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9385 -1.3148 -0.3820 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1056 -2.7248 -0.5594 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3102 -3.3243 -1.1328 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4070 -3.6941 -0.1078 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8800 -2.7936 0.5973 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8865 -4.9979 -0.0020 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2908 -6.0172 -0.8813 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0184 -7.3270 -0.1490 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2268 -7.8170 0.6416 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8081 -6.7000 1.5094 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1196 -5.4213 0.7111 C 0 0 1 0 0 0 0 0 0 0 0 0 + 7.2484 -5.6016 -0.2736 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.4049 -4.9900 -0.3274 N 0 0 0 0 0 0 0 0 0 0 0 0 + 8.9388 -5.4271 -1.5153 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.1644 -4.8643 -2.0427 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.6822 -5.3148 -3.2624 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.8989 -4.8250 -3.7292 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.5640 -3.8875 -2.9584 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.0936 -3.4117 -1.7847 N 0 0 0 0 0 0 0 0 0 0 0 0 + 10.9053 -3.9103 -1.3541 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.1728 -6.3397 -2.1434 N 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0590 -6.4694 -1.3138 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1302 -3.5669 -0.0390 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3047 -4.7611 0.1994 O 0 0 0 0 0 0 0 0 0 0 0 0 + -1.8434 -2.5923 -1.4434 H 0 0 0 0 0 0 0 0 0 0 0 0 + -0.7948 -3.9864 -1.8054 H 0 0 0 0 0 0 0 0 0 0 0 0 + -0.2294 -2.3360 -2.0906 H 0 0 0 0 0 0 0 0 0 0 0 0 + -0.8817 -3.5525 0.6585 H 0 0 0 0 0 0 0 0 0 0 0 0 + -0.3620 0.8920 0.8826 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4335 2.5059 0.3165 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5506 1.6830 -0.6854 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9014 -0.6867 -1.0897 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7582 -2.6634 -1.8818 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0243 -4.2271 -1.6847 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9807 -6.1895 -1.7161 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3558 -5.6644 -1.3280 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7124 -8.0956 -0.8683 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1769 -7.1812 0.5387 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9903 -8.2015 -0.0442 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9258 -8.6561 1.2800 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6974 -7.0629 2.0367 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0635 -6.4609 2.2775 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4169 -4.6457 1.4177 H 0 0 0 0 0 0 0 0 0 0 0 0 + 10.1472 -6.0607 -3.8459 H 0 0 0 0 0 0 0 0 0 0 0 0 + 12.3170 -5.1763 -4.6658 H 0 0 0 0 0 0 0 0 0 0 0 0 + 13.5247 -3.4888 -3.2716 H 0 0 0 0 0 0 0 0 0 0 0 0 + 10.5731 -3.5084 -0.3997 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 33 1 0 0 0 0 + 1 34 1 0 0 0 0 + 1 35 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 31 1 0 0 0 0 + 2 1 1 0 0 0 0 + 2 36 1 1 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 9 2 0 0 0 0 + 5 6 2 0 0 0 0 + 5 37 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 38 1 0 0 0 0 + 7 8 2 0 0 0 0 + 7 39 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 40 1 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 1 0 0 0 0 + 10 31 1 0 0 0 0 + 11 12 1 0 0 0 0 + 11 41 1 0 0 0 0 + 11 42 1 0 0 0 0 + 12 13 2 0 0 0 0 + 12 14 1 0 0 0 0 + 14 15 1 0 0 0 0 + 14 19 1 0 0 0 0 + 15 16 1 0 0 0 0 + 15 43 1 0 0 0 0 + 15 44 1 0 0 0 0 + 16 17 1 0 0 0 0 + 16 45 1 0 0 0 0 + 16 46 1 0 0 0 0 + 17 18 1 0 0 0 0 + 17 47 1 0 0 0 0 + 17 48 1 0 0 0 0 + 18 19 1 0 0 0 0 + 18 49 1 0 0 0 0 + 18 50 1 0 0 0 0 + 19 20 1 0 0 0 0 + 19 51 1 1 0 0 0 + 20 21 2 0 0 0 0 + 20 30 1 0 0 0 0 + 21 22 1 0 0 0 0 + 22 23 1 0 0 0 0 + 22 29 2 0 0 0 0 + 23 24 1 0 0 0 0 + 23 28 2 0 0 0 0 + 24 25 2 0 0 0 0 + 24 52 1 0 0 0 0 + 25 26 1 0 0 0 0 + 25 53 1 0 0 0 0 + 26 27 2 0 0 0 0 + 26 54 1 0 0 0 0 + 27 28 1 0 0 0 0 + 28 55 1 0 0 0 0 + 29 30 1 0 0 0 0 + 31 32 2 0 0 0 0 +M END +$$$$ + + OpenBabel08312206043D + + 55 59 0 0 1 0 0 0 0 0999 V2000 + -0.7735 -3.7418 -0.5073 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0144 -3.0152 0.6053 C 0 0 2 0 0 0 0 0 0 0 0 0 + -0.3099 -1.6309 0.5730 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.4665 -0.9183 -0.3021 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0132 0.3809 -0.5563 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7098 1.2028 -1.4342 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.8646 0.7254 -2.0452 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3291 -0.5695 -1.7778 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.6382 -1.4174 -0.9055 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1056 -2.7248 -0.5594 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3102 -3.3243 -1.1328 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4070 -3.6941 -0.1078 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8800 -2.7936 0.5973 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8865 -4.9979 -0.0020 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2908 -6.0172 -0.8813 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0184 -7.3270 -0.1490 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2268 -7.8170 0.6416 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8081 -6.7000 1.5094 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1196 -5.4213 0.7111 C 0 0 1 0 0 0 0 0 0 0 0 0 + 7.2484 -5.6016 -0.2736 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.7931 -4.7233 -1.0776 N 0 0 0 0 0 0 0 0 0 0 0 0 + 8.6382 -5.4828 -1.8497 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.3311 -4.9168 -2.9883 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.1517 -3.5711 -3.3283 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.7606 -3.0502 -4.4667 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.5414 -3.8965 -5.2344 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.7562 -5.1963 -4.9350 N 0 0 0 0 0 0 0 0 0 0 0 0 + 10.1469 -5.6764 -3.8195 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.6748 -6.7796 -1.4874 N 0 0 0 0 0 0 0 0 0 0 0 0 + 7.7665 -6.8576 -0.4317 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4553 -3.3983 0.4676 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9451 -4.3342 1.0983 O 0 0 0 0 0 0 0 0 0 0 0 0 + -1.8505 -3.5768 -0.4291 H 0 0 0 0 0 0 0 0 0 0 0 0 + -0.5722 -4.8171 -0.4693 H 0 0 0 0 0 0 0 0 0 0 0 0 + -0.4694 -3.3841 -1.4990 H 0 0 0 0 0 0 0 0 0 0 0 0 + -0.3633 -3.3879 1.5753 H 0 0 0 0 0 0 0 0 0 0 0 0 + -0.8879 0.7463 -0.0699 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.3568 2.2107 -1.6368 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4199 1.3653 -2.7284 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2553 -0.8670 -2.2584 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7582 -2.6634 -1.8818 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0243 -4.2271 -1.6847 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9807 -6.1895 -1.7161 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3558 -5.6644 -1.3280 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7124 -8.0956 -0.8683 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1769 -7.1812 0.5387 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9903 -8.2015 -0.0442 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9258 -8.6561 1.2800 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6974 -7.0629 2.0367 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0635 -6.4609 2.2775 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4169 -4.6457 1.4177 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.5242 -2.9274 -2.7159 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.6181 -2.0129 -4.7480 H 0 0 0 0 0 0 0 0 0 0 0 0 + 11.0226 -3.5413 -6.1412 H 0 0 0 0 0 0 0 0 0 0 0 0 + 10.3377 -6.7293 -3.6258 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 33 1 0 0 0 0 + 1 34 1 0 0 0 0 + 1 35 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 31 1 0 0 0 0 + 2 1 1 0 0 0 0 + 2 36 1 1 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 9 2 0 0 0 0 + 5 6 2 0 0 0 0 + 5 37 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 38 1 0 0 0 0 + 7 8 2 0 0 0 0 + 7 39 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 40 1 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 1 0 0 0 0 + 10 31 1 0 0 0 0 + 11 12 1 0 0 0 0 + 11 41 1 0 0 0 0 + 11 42 1 0 0 0 0 + 12 13 2 0 0 0 0 + 12 14 1 0 0 0 0 + 14 15 1 0 0 0 0 + 14 19 1 0 0 0 0 + 15 16 1 0 0 0 0 + 15 43 1 0 0 0 0 + 15 44 1 0 0 0 0 + 16 17 1 0 0 0 0 + 16 45 1 0 0 0 0 + 16 46 1 0 0 0 0 + 17 18 1 0 0 0 0 + 17 47 1 0 0 0 0 + 17 48 1 0 0 0 0 + 18 19 1 0 0 0 0 + 18 49 1 0 0 0 0 + 18 50 1 0 0 0 0 + 19 20 1 0 0 0 0 + 19 51 1 1 0 0 0 + 20 21 2 0 0 0 0 + 20 30 1 0 0 0 0 + 21 22 1 0 0 0 0 + 22 23 1 0 0 0 0 + 22 29 2 0 0 0 0 + 23 24 1 0 0 0 0 + 23 28 2 0 0 0 0 + 24 25 2 0 0 0 0 + 24 52 1 0 0 0 0 + 25 26 1 0 0 0 0 + 25 53 1 0 0 0 0 + 26 27 2 0 0 0 0 + 26 54 1 0 0 0 0 + 27 28 1 0 0 0 0 + 28 55 1 0 0 0 0 + 29 30 1 0 0 0 0 + 31 32 2 0 0 0 0 +M END +$$$$ + + OpenBabel08312206043D + + 55 59 0 0 1 0 0 0 0 0999 V2000 + 6.9899 1.0441 0.8100 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.8610 -0.1996 0.6189 C 0 0 2 0 0 0 0 0 0 0 0 0 + 8.3050 -0.2818 -0.7231 O 0 0 0 0 0 0 0 0 0 0 0 0 + 7.4109 -0.8855 -1.5672 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.6992 -0.7294 -2.9275 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8621 -1.2882 -3.8859 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7461 -2.0117 -3.4789 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4662 -2.1834 -2.1165 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2894 -1.6212 -1.1349 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0746 -1.8181 0.2660 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9406 -2.5673 0.8065 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4070 -3.6941 -0.1078 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5119 -3.4197 -0.9172 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8865 -4.9979 -0.0020 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2908 -6.0172 -0.8813 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0184 -7.3270 -0.1490 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2268 -7.8170 0.6416 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8081 -6.7000 1.5094 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1196 -5.4213 0.7111 C 0 0 1 0 0 0 0 0 0 0 0 0 + 7.2484 -5.6016 -0.2736 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1985 -5.9525 -1.5341 N 0 0 0 0 0 0 0 0 0 0 0 0 + 8.5203 -6.1214 -1.8679 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.9094 -6.6682 -3.1511 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.0906 -7.4083 -3.2760 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.4990 -7.8681 -4.5250 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.7043 -7.5762 -5.6198 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.5485 -6.8808 -5.5434 N 0 0 0 0 0 0 0 0 0 0 0 0 + 8.1776 -6.4432 -4.3118 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.3690 -5.8120 -0.8687 N 0 0 0 0 0 0 0 0 0 0 0 0 + 8.5285 -5.4511 0.1843 O 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0633 -1.3889 1.1432 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1866 -1.7964 2.2975 O 0 0 0 0 0 0 0 0 0 0 0 0 + 7.5247 1.9533 0.5259 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6675 1.1293 1.8527 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0871 1.0000 0.1881 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.7584 -0.1038 1.2410 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.5768 -0.1661 -3.2353 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0816 -1.1641 -4.9433 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0895 -2.4586 -4.2231 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6014 -2.7891 -1.8663 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1054 -1.8993 1.0403 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2343 -3.0029 1.7685 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9807 -6.1895 -1.7161 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3558 -5.6644 -1.3280 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7124 -8.0956 -0.8683 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1769 -7.1812 0.5387 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9903 -8.2015 -0.0442 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9258 -8.6561 1.2800 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6974 -7.0629 2.0367 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0635 -6.4609 2.2775 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4169 -4.6457 1.4177 H 0 0 0 0 0 0 0 0 0 0 0 0 + 10.7051 -7.6160 -2.4029 H 0 0 0 0 0 0 0 0 0 0 0 0 + 11.4190 -8.4307 -4.6365 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.9898 -7.8980 -6.6172 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2487 -5.8777 -4.3010 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 33 1 0 0 0 0 + 1 34 1 0 0 0 0 + 1 35 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 31 1 0 0 0 0 + 2 1 1 0 0 0 0 + 2 36 1 1 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 9 2 0 0 0 0 + 5 6 2 0 0 0 0 + 5 37 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 38 1 0 0 0 0 + 7 8 2 0 0 0 0 + 7 39 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 40 1 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 1 0 0 0 0 + 10 31 1 0 0 0 0 + 11 12 1 0 0 0 0 + 11 41 1 0 0 0 0 + 11 42 1 0 0 0 0 + 12 13 2 0 0 0 0 + 12 14 1 0 0 0 0 + 14 15 1 0 0 0 0 + 14 19 1 0 0 0 0 + 15 16 1 0 0 0 0 + 15 43 1 0 0 0 0 + 15 44 1 0 0 0 0 + 16 17 1 0 0 0 0 + 16 45 1 0 0 0 0 + 16 46 1 0 0 0 0 + 17 18 1 0 0 0 0 + 17 47 1 0 0 0 0 + 17 48 1 0 0 0 0 + 18 19 1 0 0 0 0 + 18 49 1 0 0 0 0 + 18 50 1 0 0 0 0 + 19 20 1 0 0 0 0 + 19 51 1 1 0 0 0 + 20 21 2 0 0 0 0 + 20 30 1 0 0 0 0 + 21 22 1 0 0 0 0 + 22 23 1 0 0 0 0 + 22 29 2 0 0 0 0 + 23 24 1 0 0 0 0 + 23 28 2 0 0 0 0 + 24 25 2 0 0 0 0 + 24 52 1 0 0 0 0 + 25 26 1 0 0 0 0 + 25 53 1 0 0 0 0 + 26 27 2 0 0 0 0 + 26 54 1 0 0 0 0 + 27 28 1 0 0 0 0 + 28 55 1 0 0 0 0 + 29 30 1 0 0 0 0 + 31 32 2 0 0 0 0 +M END +$$$$ + + OpenBabel08312206043D + + 55 59 0 0 1 0 0 0 0 0999 V2000 + 2.5853 -3.4326 -5.2200 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6902 -4.3707 -4.7287 C 0 0 2 0 0 0 0 0 0 0 0 0 + 3.2404 -5.7128 -4.7623 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5428 -6.0920 -3.6460 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.8568 -7.3049 -3.7735 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1042 -7.7947 -2.7127 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0510 -7.0747 -1.5238 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7520 -5.8687 -1.3892 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5074 -5.3519 -2.4473 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2840 -4.1552 -2.3363 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3102 -3.3243 -1.1328 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4070 -3.6941 -0.1078 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8800 -2.7936 0.5973 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8865 -4.9979 -0.0020 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2908 -6.0172 -0.8813 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0184 -7.3270 -0.1490 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2268 -7.8170 0.6416 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8081 -6.7000 1.5094 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1196 -5.4213 0.7111 C 0 0 1 0 0 0 0 0 0 0 0 0 + 7.2484 -5.6016 -0.2736 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9498 -6.6746 -0.5406 N 0 0 0 0 0 0 0 0 0 0 0 0 + 8.9357 -6.2080 -1.3759 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.0355 -7.0544 -1.7894 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.0367 -6.5534 -2.6292 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.0513 -7.3908 -3.0846 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.0370 -8.7138 -2.6788 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.1012 -9.2358 -1.8559 N 0 0 0 0 0 0 0 0 0 0 0 0 + 10.1227 -8.3947 -1.4301 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.8072 -4.9020 -1.6794 N 0 0 0 0 0 0 0 0 0 0 0 0 + 7.6795 -4.5016 -0.9628 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1539 -3.8445 -3.3745 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1117 -3.0799 -3.2674 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2515 -3.7010 -6.2249 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9368 -2.3959 -5.2244 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7025 -3.4789 -4.5700 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5414 -4.3078 -5.4165 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9086 -7.8626 -4.7054 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.5666 -8.7343 -2.8112 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.4698 -7.4550 -0.6859 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.6983 -5.3756 -0.4242 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3448 -3.3507 -0.6174 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4447 -2.2783 -1.4314 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9807 -6.1895 -1.7161 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3558 -5.6644 -1.3280 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7124 -8.0956 -0.8683 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1769 -7.1812 0.5387 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9903 -8.2015 -0.0442 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9258 -8.6561 1.2800 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6974 -7.0629 2.0367 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0635 -6.4609 2.2775 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4169 -4.6457 1.4177 H 0 0 0 0 0 0 0 0 0 0 0 0 + 11.0213 -5.5125 -2.9443 H 0 0 0 0 0 0 0 0 0 0 0 0 + 12.8248 -7.0178 -3.7465 H 0 0 0 0 0 0 0 0 0 0 0 0 + 12.7970 -9.4102 -3.0215 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.3854 -8.8615 -0.7811 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 33 1 0 0 0 0 + 1 34 1 0 0 0 0 + 1 35 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 31 1 0 0 0 0 + 2 1 1 0 0 0 0 + 2 36 1 6 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 9 2 0 0 0 0 + 5 6 2 0 0 0 0 + 5 37 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 38 1 0 0 0 0 + 7 8 2 0 0 0 0 + 7 39 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 40 1 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 1 0 0 0 0 + 10 31 1 0 0 0 0 + 11 12 1 0 0 0 0 + 11 41 1 0 0 0 0 + 11 42 1 0 0 0 0 + 12 13 2 0 0 0 0 + 12 14 1 0 0 0 0 + 14 15 1 0 0 0 0 + 14 19 1 0 0 0 0 + 15 16 1 0 0 0 0 + 15 43 1 0 0 0 0 + 15 44 1 0 0 0 0 + 16 17 1 0 0 0 0 + 16 45 1 0 0 0 0 + 16 46 1 0 0 0 0 + 17 18 1 0 0 0 0 + 17 47 1 0 0 0 0 + 17 48 1 0 0 0 0 + 18 19 1 0 0 0 0 + 18 49 1 0 0 0 0 + 18 50 1 0 0 0 0 + 19 20 1 0 0 0 0 + 19 51 1 1 0 0 0 + 20 21 2 0 0 0 0 + 20 30 1 0 0 0 0 + 21 22 1 0 0 0 0 + 22 23 1 0 0 0 0 + 22 29 2 0 0 0 0 + 23 24 1 0 0 0 0 + 23 28 2 0 0 0 0 + 24 25 2 0 0 0 0 + 24 52 1 0 0 0 0 + 25 26 1 0 0 0 0 + 25 53 1 0 0 0 0 + 26 27 2 0 0 0 0 + 26 54 1 0 0 0 0 + 27 28 1 0 0 0 0 + 28 55 1 0 0 0 0 + 29 30 1 0 0 0 0 + 31 32 2 0 0 0 0 +M END +$$$$ + + OpenBabel08312206043D + + 55 59 0 0 1 0 0 0 0 0999 V2000 + 3.6215 -0.3101 -3.9718 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8012 -1.2837 -3.9226 C 0 0 2 0 0 0 0 0 0 0 0 0 + 4.7732 -2.1404 -5.0496 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9720 -3.2400 -4.8906 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7094 -3.9435 -6.0713 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9015 -5.0741 -6.0439 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3694 -5.5034 -4.8326 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6462 -4.8097 -3.6469 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4483 -3.6635 -3.6526 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8035 -2.9572 -2.4600 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3102 -3.3243 -1.1328 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4070 -3.6941 -0.1078 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8800 -2.7936 0.5973 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8865 -4.9979 -0.0020 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2908 -6.0172 -0.8813 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0184 -7.3270 -0.1490 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2268 -7.8170 0.6416 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8081 -6.7000 1.5094 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1196 -5.4213 0.7111 C 0 0 1 0 0 0 0 0 0 0 0 0 + 7.2484 -5.6016 -0.2736 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.4841 -5.9760 -0.0560 N 0 0 0 0 0 0 0 0 0 0 0 0 + 9.0892 -5.7936 -1.2758 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.5203 -5.9445 -1.4369 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.3851 -5.6684 -0.3717 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.7635 -5.7424 -0.5527 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.2394 -6.0985 -1.8025 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.4421 -6.3902 -2.8534 N 0 0 0 0 0 0 0 0 0 0 0 0 + 11.1018 -6.3069 -2.6468 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.2397 -5.3909 -2.2405 N 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0151 -5.2788 -1.5822 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7663 -1.9596 -2.5560 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.4139 -1.5309 -1.6019 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6223 0.2714 -4.8966 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6541 0.3746 -3.1183 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6622 -0.8411 -3.9323 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7353 -0.7135 -3.9852 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1341 -3.6025 -7.0123 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6923 -5.6193 -6.9607 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7417 -6.3920 -4.8015 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2304 -5.2180 -2.7316 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6094 -4.1630 -1.1936 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7216 -2.4901 -0.7341 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9807 -6.1895 -1.7161 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3558 -5.6644 -1.3280 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7124 -8.0956 -0.8683 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1769 -7.1812 0.5387 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9903 -8.2015 -0.0442 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9258 -8.6561 1.2800 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6974 -7.0629 2.0367 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0635 -6.4609 2.2775 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4169 -4.6457 1.4177 H 0 0 0 0 0 0 0 0 0 0 0 0 + 10.9884 -5.3795 0.5990 H 0 0 0 0 0 0 0 0 0 0 0 0 + 13.4437 -5.5176 0.2610 H 0 0 0 0 0 0 0 0 0 0 0 0 + 14.3066 -6.1527 -1.9978 H 0 0 0 0 0 0 0 0 0 0 0 0 + 10.5007 -6.5375 -3.5232 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 33 1 0 0 0 0 + 1 34 1 0 0 0 0 + 1 35 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 31 1 0 0 0 0 + 2 1 1 0 0 0 0 + 2 36 1 6 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 9 2 0 0 0 0 + 5 6 2 0 0 0 0 + 5 37 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 38 1 0 0 0 0 + 7 8 2 0 0 0 0 + 7 39 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 40 1 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 1 0 0 0 0 + 10 31 1 0 0 0 0 + 11 12 1 0 0 0 0 + 11 41 1 0 0 0 0 + 11 42 1 0 0 0 0 + 12 13 2 0 0 0 0 + 12 14 1 0 0 0 0 + 14 15 1 0 0 0 0 + 14 19 1 0 0 0 0 + 15 16 1 0 0 0 0 + 15 43 1 0 0 0 0 + 15 44 1 0 0 0 0 + 16 17 1 0 0 0 0 + 16 45 1 0 0 0 0 + 16 46 1 0 0 0 0 + 17 18 1 0 0 0 0 + 17 47 1 0 0 0 0 + 17 48 1 0 0 0 0 + 18 19 1 0 0 0 0 + 18 49 1 0 0 0 0 + 18 50 1 0 0 0 0 + 19 20 1 0 0 0 0 + 19 51 1 1 0 0 0 + 20 21 2 0 0 0 0 + 20 30 1 0 0 0 0 + 21 22 1 0 0 0 0 + 22 23 1 0 0 0 0 + 22 29 2 0 0 0 0 + 23 24 1 0 0 0 0 + 23 28 2 0 0 0 0 + 24 25 2 0 0 0 0 + 24 52 1 0 0 0 0 + 25 26 1 0 0 0 0 + 25 53 1 0 0 0 0 + 26 27 2 0 0 0 0 + 26 54 1 0 0 0 0 + 27 28 1 0 0 0 0 + 28 55 1 0 0 0 0 + 29 30 1 0 0 0 0 + 31 32 2 0 0 0 0 +M END +$$$$ + + OpenBabel08312206043D + + 55 59 0 0 1 0 0 0 0 0999 V2000 + 3.9626 1.4526 0.4517 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7722 0.4909 0.4674 C 0 0 2 0 0 0 0 0 0 0 0 0 + 2.0866 0.5846 1.7028 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6193 -0.1973 2.6934 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1414 0.0858 3.9776 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6113 -0.6330 5.0704 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5491 -1.6409 4.8720 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0153 -1.9370 3.5840 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5636 -1.2195 2.4711 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9685 -1.5242 1.1330 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9406 -2.5673 0.8065 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4070 -3.6941 -0.1078 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5119 -3.4197 -0.9172 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8865 -4.9979 -0.0020 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2908 -6.0172 -0.8813 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0184 -7.3270 -0.1490 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2268 -7.8170 0.6416 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8081 -6.7000 1.5094 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1196 -5.4213 0.7111 C 0 0 1 0 0 0 0 0 0 0 0 0 + 7.2484 -5.6016 -0.2736 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9498 -6.6746 -0.5406 N 0 0 0 0 0 0 0 0 0 0 0 0 + 8.9357 -6.2080 -1.3759 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.0355 -7.0544 -1.7894 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.4928 -8.0792 -0.9531 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.5978 -8.8417 -1.3215 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.2140 -8.5577 -2.5276 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.7967 -7.5905 -3.3736 N 0 0 0 0 0 0 0 0 0 0 0 0 + 10.7176 -6.8616 -2.9856 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.8072 -4.9020 -1.6794 N 0 0 0 0 0 0 0 0 0 0 0 0 + 7.6795 -4.5016 -0.9628 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3058 -0.8871 0.0908 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2898 -1.2957 -1.0695 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6469 2.4815 0.6389 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4795 1.4064 -0.5121 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6928 1.1986 1.2302 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0609 0.7934 -0.3098 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4047 0.8725 4.1216 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2449 -0.4115 6.0695 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9167 -2.2134 5.7215 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7181 -2.7588 3.4939 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3380 -3.0307 1.7152 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8066 -2.1010 0.3229 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9807 -6.1895 -1.7161 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3558 -5.6644 -1.3280 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7124 -8.0956 -0.8683 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1769 -7.1812 0.5387 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9903 -8.2015 -0.0442 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9258 -8.6561 1.2800 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6974 -7.0629 2.0367 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0635 -6.4609 2.2775 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4169 -4.6457 1.4177 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.9994 -8.2770 -0.0042 H 0 0 0 0 0 0 0 0 0 0 0 0 + 11.9698 -9.6293 -0.6758 H 0 0 0 0 0 0 0 0 0 0 0 0 + 13.0900 -9.1131 -2.8503 H 0 0 0 0 0 0 0 0 0 0 0 0 + 10.4262 -6.0870 -3.6911 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 33 1 0 0 0 0 + 1 34 1 0 0 0 0 + 1 35 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 31 1 0 0 0 0 + 2 1 1 0 0 0 0 + 2 36 1 6 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 9 2 0 0 0 0 + 5 6 2 0 0 0 0 + 5 37 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 38 1 0 0 0 0 + 7 8 2 0 0 0 0 + 7 39 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 40 1 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 1 0 0 0 0 + 10 31 1 0 0 0 0 + 11 12 1 0 0 0 0 + 11 41 1 0 0 0 0 + 11 42 1 0 0 0 0 + 12 13 2 0 0 0 0 + 12 14 1 0 0 0 0 + 14 15 1 0 0 0 0 + 14 19 1 0 0 0 0 + 15 16 1 0 0 0 0 + 15 43 1 0 0 0 0 + 15 44 1 0 0 0 0 + 16 17 1 0 0 0 0 + 16 45 1 0 0 0 0 + 16 46 1 0 0 0 0 + 17 18 1 0 0 0 0 + 17 47 1 0 0 0 0 + 17 48 1 0 0 0 0 + 18 19 1 0 0 0 0 + 18 49 1 0 0 0 0 + 18 50 1 0 0 0 0 + 19 20 1 0 0 0 0 + 19 51 1 1 0 0 0 + 20 21 2 0 0 0 0 + 20 30 1 0 0 0 0 + 21 22 1 0 0 0 0 + 22 23 1 0 0 0 0 + 22 29 2 0 0 0 0 + 23 24 1 0 0 0 0 + 23 28 2 0 0 0 0 + 24 25 2 0 0 0 0 + 24 52 1 0 0 0 0 + 25 26 1 0 0 0 0 + 25 53 1 0 0 0 0 + 26 27 2 0 0 0 0 + 26 54 1 0 0 0 0 + 27 28 1 0 0 0 0 + 28 55 1 0 0 0 0 + 29 30 1 0 0 0 0 + 31 32 2 0 0 0 0 +M END +$$$$ + + OpenBabel08312206043D + + 55 59 0 0 1 0 0 0 0 0999 V2000 + 3.6586 0.9131 2.6734 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5455 -0.0499 2.2542 C 0 0 2 0 0 0 0 0 0 0 0 0 + 1.9985 -0.6878 3.3938 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6911 -1.8003 3.7927 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3426 -2.2785 5.0607 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9802 -3.3975 5.5830 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9558 -4.0411 4.8290 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2931 -3.5734 3.5517 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6715 -2.4430 3.0105 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9429 -1.9639 1.6898 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9406 -2.5673 0.8065 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4070 -3.6941 -0.1078 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5119 -3.4197 -0.9172 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8865 -4.9979 -0.0020 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2908 -6.0172 -0.8813 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0184 -7.3270 -0.1490 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2268 -7.8170 0.6416 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8081 -6.7000 1.5094 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1196 -5.4213 0.7111 C 0 0 1 0 0 0 0 0 0 0 0 0 + 7.2484 -5.6016 -0.2736 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.5352 -5.4365 -0.0963 N 0 0 0 0 0 0 0 0 0 0 0 0 + 9.0485 -5.5683 -1.3637 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.4434 -5.2983 -1.6434 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.3051 -4.8935 -0.6176 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.6267 -4.5628 -0.9042 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.0518 -4.6529 -2.2181 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.2604 -5.0552 -3.2365 N 0 0 0 0 0 0 0 0 0 0 0 0 + 10.9753 -5.3687 -2.9261 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.1199 -5.8808 -2.2881 N 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9279 -5.9197 -1.5647 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1255 -0.9628 1.1792 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0068 -0.7127 -0.0195 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2969 1.6529 3.3912 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0657 1.4315 1.7994 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4872 0.3810 3.1570 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7323 0.5248 1.7959 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.5752 -1.7711 5.6401 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7143 -3.7678 6.5698 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4547 -4.9224 5.2278 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0355 -4.1424 3.0016 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7808 -2.9696 1.3816 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3758 -1.7806 0.1795 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9807 -6.1895 -1.7161 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3558 -5.6644 -1.3280 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7124 -8.0956 -0.8683 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1769 -7.1812 0.5387 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9903 -8.2015 -0.0442 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9258 -8.6561 1.2800 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6974 -7.0629 2.0367 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0635 -6.4609 2.2775 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4169 -4.6457 1.4177 H 0 0 0 0 0 0 0 0 0 0 0 0 + 10.9457 -4.8192 0.4063 H 0 0 0 0 0 0 0 0 0 0 0 0 + 13.3001 -4.2348 -0.1203 H 0 0 0 0 0 0 0 0 0 0 0 0 + 14.0687 -4.3887 -2.4942 H 0 0 0 0 0 0 0 0 0 0 0 0 + 10.3730 -5.6743 -3.7785 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 33 1 0 0 0 0 + 1 34 1 0 0 0 0 + 1 35 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 31 1 0 0 0 0 + 2 1 1 0 0 0 0 + 2 36 1 6 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 9 2 0 0 0 0 + 5 6 2 0 0 0 0 + 5 37 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 38 1 0 0 0 0 + 7 8 2 0 0 0 0 + 7 39 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 40 1 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 1 0 0 0 0 + 10 31 1 0 0 0 0 + 11 12 1 0 0 0 0 + 11 41 1 0 0 0 0 + 11 42 1 0 0 0 0 + 12 13 2 0 0 0 0 + 12 14 1 0 0 0 0 + 14 15 1 0 0 0 0 + 14 19 1 0 0 0 0 + 15 16 1 0 0 0 0 + 15 43 1 0 0 0 0 + 15 44 1 0 0 0 0 + 16 17 1 0 0 0 0 + 16 45 1 0 0 0 0 + 16 46 1 0 0 0 0 + 17 18 1 0 0 0 0 + 17 47 1 0 0 0 0 + 17 48 1 0 0 0 0 + 18 19 1 0 0 0 0 + 18 49 1 0 0 0 0 + 18 50 1 0 0 0 0 + 19 20 1 0 0 0 0 + 19 51 1 1 0 0 0 + 20 21 2 0 0 0 0 + 20 30 1 0 0 0 0 + 21 22 1 0 0 0 0 + 22 23 1 0 0 0 0 + 22 29 2 0 0 0 0 + 23 24 1 0 0 0 0 + 23 28 2 0 0 0 0 + 24 25 2 0 0 0 0 + 24 52 1 0 0 0 0 + 25 26 1 0 0 0 0 + 25 53 1 0 0 0 0 + 26 27 2 0 0 0 0 + 26 54 1 0 0 0 0 + 27 28 1 0 0 0 0 + 28 55 1 0 0 0 0 + 29 30 1 0 0 0 0 + 31 32 2 0 0 0 0 +M END +$$$$ + + OpenBabel08312206043D + + 55 59 0 0 1 0 0 0 0 0999 V2000 + 2.7069 0.4682 -2.7124 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1481 -0.0428 -2.7760 C 0 0 2 0 0 0 0 0 0 0 0 0 + 4.4858 -0.3835 -4.1082 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1127 -1.6515 -4.4680 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1805 -1.9096 -5.8416 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8195 -3.1578 -6.3348 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4036 -4.1471 -5.4499 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3522 -3.8950 -4.0723 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7011 -2.6429 -3.5549 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7182 -2.3584 -2.1527 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3102 -3.3243 -1.1328 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4070 -3.6941 -0.1078 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8800 -2.7936 0.5973 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8865 -4.9979 -0.0020 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2908 -6.0172 -0.8813 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0184 -7.3270 -0.1490 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2268 -7.8170 0.6416 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8081 -6.7000 1.5094 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1196 -5.4213 0.7111 C 0 0 1 0 0 0 0 0 0 0 0 0 + 7.2484 -5.6016 -0.2736 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.6084 -6.6747 -0.9320 N 0 0 0 0 0 0 0 0 0 0 0 0 + 8.7854 -6.2976 -1.5318 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.6094 -7.2538 -2.2414 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.6186 -8.6003 -1.8599 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.4679 -9.5016 -2.4959 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.2854 -9.0263 -3.5063 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.2971 -7.7398 -3.9188 N 0 0 0 0 0 0 0 0 0 0 0 0 + 10.4593 -6.8837 -3.2777 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.1080 -5.0079 -1.3152 N 0 0 0 0 0 0 0 0 0 0 0 0 + 8.0817 -4.5397 -0.4948 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2745 -1.1540 -1.7391 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6758 -0.9348 -0.5970 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5566 1.3219 -3.3772 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4492 0.7611 -1.6896 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9937 -0.3053 -3.0237 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8253 0.7659 -2.4777 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5116 -1.1311 -6.5246 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8669 -3.3590 -7.4020 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1261 -5.1295 -5.8273 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0545 -4.7203 -3.4337 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9521 -4.2512 -1.5921 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4451 -2.9212 -0.5938 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9807 -6.1895 -1.7161 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3558 -5.6644 -1.3280 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7124 -8.0956 -0.8683 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1769 -7.1812 0.5387 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9903 -8.2015 -0.0442 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9258 -8.6561 1.2800 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6974 -7.0629 2.0367 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0635 -6.4609 2.2775 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4169 -4.6457 1.4177 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.9753 -8.9490 -1.0552 H 0 0 0 0 0 0 0 0 0 0 0 0 + 10.4940 -10.5443 -2.2000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 11.9778 -9.6870 -4.0202 H 0 0 0 0 0 0 0 0 0 0 0 0 + 10.5125 -5.8576 -3.6342 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 33 1 0 0 0 0 + 1 34 1 0 0 0 0 + 1 35 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 31 1 0 0 0 0 + 2 1 1 0 0 0 0 + 2 36 1 1 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 9 2 0 0 0 0 + 5 6 2 0 0 0 0 + 5 37 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 38 1 0 0 0 0 + 7 8 2 0 0 0 0 + 7 39 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 40 1 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 1 0 0 0 0 + 10 31 1 0 0 0 0 + 11 12 1 0 0 0 0 + 11 41 1 0 0 0 0 + 11 42 1 0 0 0 0 + 12 13 2 0 0 0 0 + 12 14 1 0 0 0 0 + 14 15 1 0 0 0 0 + 14 19 1 0 0 0 0 + 15 16 1 0 0 0 0 + 15 43 1 0 0 0 0 + 15 44 1 0 0 0 0 + 16 17 1 0 0 0 0 + 16 45 1 0 0 0 0 + 16 46 1 0 0 0 0 + 17 18 1 0 0 0 0 + 17 47 1 0 0 0 0 + 17 48 1 0 0 0 0 + 18 19 1 0 0 0 0 + 18 49 1 0 0 0 0 + 18 50 1 0 0 0 0 + 19 20 1 0 0 0 0 + 19 51 1 1 0 0 0 + 20 21 2 0 0 0 0 + 20 30 1 0 0 0 0 + 21 22 1 0 0 0 0 + 22 23 1 0 0 0 0 + 22 29 2 0 0 0 0 + 23 24 1 0 0 0 0 + 23 28 2 0 0 0 0 + 24 25 2 0 0 0 0 + 24 52 1 0 0 0 0 + 25 26 1 0 0 0 0 + 25 53 1 0 0 0 0 + 26 27 2 0 0 0 0 + 26 54 1 0 0 0 0 + 27 28 1 0 0 0 0 + 28 55 1 0 0 0 0 + 29 30 1 0 0 0 0 + 31 32 2 0 0 0 0 +M END +$$$$ + + OpenBabel08312206043D + + 55 59 0 0 1 0 0 0 0 0999 V2000 + 3.7079 -0.2636 -2.4208 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6398 0.4321 -1.0593 C 0 0 2 0 0 0 0 0 0 0 0 0 + 4.6708 1.3967 -0.9531 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8694 0.8835 -0.5331 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9583 1.7485 -0.6878 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.2314 1.3415 -0.3067 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.4079 0.0744 0.2393 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3151 -0.7860 0.4109 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0267 -0.4009 0.0250 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8743 -1.2232 0.2334 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9406 -2.5673 0.8065 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4070 -3.6941 -0.1078 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5119 -3.4197 -0.9172 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8865 -4.9979 -0.0020 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2908 -6.0172 -0.8813 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0184 -7.3270 -0.1490 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2268 -7.8170 0.6416 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8081 -6.7000 1.5094 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1196 -5.4213 0.7111 C 0 0 1 0 0 0 0 0 0 0 0 0 + 7.2484 -5.6016 -0.2736 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.4841 -5.9760 -0.0560 N 0 0 0 0 0 0 0 0 0 0 0 0 + 9.0892 -5.7936 -1.2758 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.5203 -5.9445 -1.4369 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.2062 -5.1980 -2.4018 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.5687 -5.4004 -2.6042 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.2106 -6.3473 -1.8254 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.5927 -7.0776 -0.8714 N 0 0 0 0 0 0 0 0 0 0 0 0 + 11.2628 -6.8595 -0.6988 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.2397 -5.3909 -2.2405 N 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0151 -5.2788 -1.5822 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6238 -0.6630 0.0019 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5729 -1.1049 0.4644 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6465 0.4562 -3.2402 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8951 -0.9901 -2.5207 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6530 -0.8066 -2.5461 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6916 0.9771 -0.9858 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8091 2.7388 -1.1112 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.0795 2.0101 -0.4305 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.4004 -0.2492 0.5470 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.5151 -1.7456 0.8762 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3954 -2.6162 1.7545 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9825 -2.7872 1.0660 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9807 -6.1895 -1.7161 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3558 -5.6644 -1.3280 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7124 -8.0956 -0.8683 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1769 -7.1812 0.5387 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9903 -8.2015 -0.0442 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9258 -8.6561 1.2800 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6974 -7.0629 2.0367 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0635 -6.4609 2.2775 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4169 -4.6457 1.4177 H 0 0 0 0 0 0 0 0 0 0 0 0 + 10.6784 -4.4670 -3.0102 H 0 0 0 0 0 0 0 0 0 0 0 0 + 13.1081 -4.8381 -3.3580 H 0 0 0 0 0 0 0 0 0 0 0 0 + 14.2688 -6.5536 -1.9582 H 0 0 0 0 0 0 0 0 0 0 0 0 + 10.8059 -7.4785 0.0698 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 33 1 0 0 0 0 + 1 34 1 0 0 0 0 + 1 35 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 31 1 0 0 0 0 + 2 1 1 0 0 0 0 + 2 36 1 1 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 9 2 0 0 0 0 + 5 6 2 0 0 0 0 + 5 37 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 38 1 0 0 0 0 + 7 8 2 0 0 0 0 + 7 39 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 40 1 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 1 0 0 0 0 + 10 31 1 0 0 0 0 + 11 12 1 0 0 0 0 + 11 41 1 0 0 0 0 + 11 42 1 0 0 0 0 + 12 13 2 0 0 0 0 + 12 14 1 0 0 0 0 + 14 15 1 0 0 0 0 + 14 19 1 0 0 0 0 + 15 16 1 0 0 0 0 + 15 43 1 0 0 0 0 + 15 44 1 0 0 0 0 + 16 17 1 0 0 0 0 + 16 45 1 0 0 0 0 + 16 46 1 0 0 0 0 + 17 18 1 0 0 0 0 + 17 47 1 0 0 0 0 + 17 48 1 0 0 0 0 + 18 19 1 0 0 0 0 + 18 49 1 0 0 0 0 + 18 50 1 0 0 0 0 + 19 20 1 0 0 0 0 + 19 51 1 1 0 0 0 + 20 21 2 0 0 0 0 + 20 30 1 0 0 0 0 + 21 22 1 0 0 0 0 + 22 23 1 0 0 0 0 + 22 29 2 0 0 0 0 + 23 24 1 0 0 0 0 + 23 28 2 0 0 0 0 + 24 25 2 0 0 0 0 + 24 52 1 0 0 0 0 + 25 26 1 0 0 0 0 + 25 53 1 0 0 0 0 + 26 27 2 0 0 0 0 + 26 54 1 0 0 0 0 + 27 28 1 0 0 0 0 + 28 55 1 0 0 0 0 + 29 30 1 0 0 0 0 + 31 32 2 0 0 0 0 +M END +$$$$ + + OpenBabel08312206043D + + 55 59 0 0 1 0 0 0 0 0999 V2000 + 3.4488 0.7207 -0.2050 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2464 0.3084 -1.4444 C 0 0 2 0 0 0 0 0 0 0 0 0 + 3.5874 0.7504 -2.6170 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6167 -0.1064 -3.0642 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7724 0.4311 -4.0421 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7412 -0.3362 -4.5707 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.5664 -1.6429 -4.1273 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4224 -2.1879 -3.1607 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4604 -1.4305 -2.6076 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3924 -1.9629 -1.6614 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3102 -3.3243 -1.1328 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4070 -3.6941 -0.1078 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8800 -2.7936 0.5973 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8865 -4.9979 -0.0020 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2908 -6.0172 -0.8813 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0184 -7.3270 -0.1490 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2268 -7.8170 0.6416 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8081 -6.7000 1.5094 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1196 -5.4213 0.7111 C 0 0 1 0 0 0 0 0 0 0 0 0 + 7.2484 -5.6016 -0.2736 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9498 -6.6746 -0.5406 N 0 0 0 0 0 0 0 0 0 0 0 0 + 8.9357 -6.2080 -1.3759 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.0355 -7.0544 -1.7894 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.4928 -8.0792 -0.9531 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.5978 -8.8417 -1.3215 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.2140 -8.5577 -2.5276 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.7967 -7.5905 -3.3736 N 0 0 0 0 0 0 0 0 0 0 0 0 + 10.7176 -6.8616 -2.9856 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.8072 -4.9020 -1.6794 N 0 0 0 0 0 0 0 0 0 0 0 0 + 7.6795 -4.5016 -0.9628 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5007 -1.1912 -1.3338 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5328 -1.6407 -0.8376 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2913 1.8012 -0.1731 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9682 0.4075 0.7064 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4553 0.2552 -0.1951 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2203 0.8110 -1.4235 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9204 1.4520 -4.3855 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0812 0.0810 -5.3270 H 0 0 0 0 0 0 0 0 0 0 0 0 + -0.2343 -2.2528 -4.5415 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2544 -3.2240 -2.8855 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3429 -4.0612 -1.9417 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3289 -3.4601 -0.6639 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9807 -6.1895 -1.7161 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3558 -5.6644 -1.3280 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7124 -8.0956 -0.8683 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1769 -7.1812 0.5387 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9903 -8.2015 -0.0442 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9258 -8.6561 1.2800 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6974 -7.0629 2.0367 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0635 -6.4609 2.2775 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4169 -4.6457 1.4177 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.9994 -8.2770 -0.0042 H 0 0 0 0 0 0 0 0 0 0 0 0 + 11.9698 -9.6293 -0.6758 H 0 0 0 0 0 0 0 0 0 0 0 0 + 13.0900 -9.1131 -2.8503 H 0 0 0 0 0 0 0 0 0 0 0 0 + 10.4262 -6.0870 -3.6911 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 33 1 0 0 0 0 + 1 34 1 0 0 0 0 + 1 35 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 31 1 0 0 0 0 + 2 1 1 0 0 0 0 + 2 36 1 1 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 9 2 0 0 0 0 + 5 6 2 0 0 0 0 + 5 37 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 38 1 0 0 0 0 + 7 8 2 0 0 0 0 + 7 39 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 40 1 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 1 0 0 0 0 + 10 31 1 0 0 0 0 + 11 12 1 0 0 0 0 + 11 41 1 0 0 0 0 + 11 42 1 0 0 0 0 + 12 13 2 0 0 0 0 + 12 14 1 0 0 0 0 + 14 15 1 0 0 0 0 + 14 19 1 0 0 0 0 + 15 16 1 0 0 0 0 + 15 43 1 0 0 0 0 + 15 44 1 0 0 0 0 + 16 17 1 0 0 0 0 + 16 45 1 0 0 0 0 + 16 46 1 0 0 0 0 + 17 18 1 0 0 0 0 + 17 47 1 0 0 0 0 + 17 48 1 0 0 0 0 + 18 19 1 0 0 0 0 + 18 49 1 0 0 0 0 + 18 50 1 0 0 0 0 + 19 20 1 0 0 0 0 + 19 51 1 1 0 0 0 + 20 21 2 0 0 0 0 + 20 30 1 0 0 0 0 + 21 22 1 0 0 0 0 + 22 23 1 0 0 0 0 + 22 29 2 0 0 0 0 + 23 24 1 0 0 0 0 + 23 28 2 0 0 0 0 + 24 25 2 0 0 0 0 + 24 52 1 0 0 0 0 + 25 26 1 0 0 0 0 + 25 53 1 0 0 0 0 + 26 27 2 0 0 0 0 + 26 54 1 0 0 0 0 + 27 28 1 0 0 0 0 + 28 55 1 0 0 0 0 + 29 30 1 0 0 0 0 + 31 32 2 0 0 0 0 +M END +$$$$ + + OpenBabel08312206043D + + 55 59 0 0 1 0 0 0 0 0999 V2000 + 2.2570 0.6522 -0.5667 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6131 0.4263 -1.2391 C 0 0 2 0 0 0 0 0 0 0 0 0 + 3.5357 0.7546 -2.6143 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0731 -0.2655 -3.4029 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7257 0.1168 -4.7033 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2345 -0.8256 -5.5990 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1043 -2.1497 -5.1934 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4685 -2.5368 -3.8967 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9555 -1.6032 -2.9756 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3924 -1.9629 -1.6614 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3102 -3.3243 -1.1328 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4070 -3.6941 -0.1078 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8800 -2.7936 0.5973 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8865 -4.9979 -0.0020 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2908 -6.0172 -0.8813 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0184 -7.3270 -0.1490 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2268 -7.8170 0.6416 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8081 -6.7000 1.5094 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1196 -5.4213 0.7111 C 0 0 1 0 0 0 0 0 0 0 0 0 + 7.2484 -5.6016 -0.2736 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9498 -6.6746 -0.5406 N 0 0 0 0 0 0 0 0 0 0 0 0 + 8.9357 -6.2080 -1.3759 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.0355 -7.0544 -1.7894 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.6432 -6.8660 -3.0360 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.6497 -7.7289 -3.4609 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.0252 -8.7594 -2.6169 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.4788 -8.9683 -1.3991 N 0 0 0 0 0 0 0 0 0 0 0 0 + 10.4974 -8.1115 -1.0133 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.8072 -4.9020 -1.6794 N 0 0 0 0 0 0 0 0 0 0 0 0 + 7.6795 -4.5016 -0.9628 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0460 -0.9974 -0.9052 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7714 -1.2477 0.0564 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9133 1.6808 -0.6974 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3179 0.4282 0.5031 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4840 0.0028 -0.9963 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3479 1.1077 -0.7948 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8358 1.1535 -5.0121 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9596 -0.5298 -6.6082 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7273 -2.8951 -5.8911 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3770 -3.5909 -3.6560 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3429 -4.0612 -1.9417 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3289 -3.4601 -0.6639 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9807 -6.1895 -1.7161 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3558 -5.6644 -1.3280 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7124 -8.0956 -0.8683 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1769 -7.1812 0.5387 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9903 -8.2015 -0.0442 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9258 -8.6561 1.2800 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6974 -7.0629 2.0367 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0635 -6.4609 2.2775 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4169 -4.6457 1.4177 H 0 0 0 0 0 0 0 0 0 0 0 0 + 10.3238 -6.0557 -3.6874 H 0 0 0 0 0 0 0 0 0 0 0 0 + 12.1186 -7.6014 -4.4301 H 0 0 0 0 0 0 0 0 0 0 0 0 + 12.7933 -9.4689 -2.9112 H 0 0 0 0 0 0 0 0 0 0 0 0 + 10.0788 -8.3261 -0.0328 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 33 1 0 0 0 0 + 1 34 1 0 0 0 0 + 1 35 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 31 1 0 0 0 0 + 2 1 1 0 0 0 0 + 2 36 1 1 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 9 2 0 0 0 0 + 5 6 2 0 0 0 0 + 5 37 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 38 1 0 0 0 0 + 7 8 2 0 0 0 0 + 7 39 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 40 1 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 1 0 0 0 0 + 10 31 1 0 0 0 0 + 11 12 1 0 0 0 0 + 11 41 1 0 0 0 0 + 11 42 1 0 0 0 0 + 12 13 2 0 0 0 0 + 12 14 1 0 0 0 0 + 14 15 1 0 0 0 0 + 14 19 1 0 0 0 0 + 15 16 1 0 0 0 0 + 15 43 1 0 0 0 0 + 15 44 1 0 0 0 0 + 16 17 1 0 0 0 0 + 16 45 1 0 0 0 0 + 16 46 1 0 0 0 0 + 17 18 1 0 0 0 0 + 17 47 1 0 0 0 0 + 17 48 1 0 0 0 0 + 18 19 1 0 0 0 0 + 18 49 1 0 0 0 0 + 18 50 1 0 0 0 0 + 19 20 1 0 0 0 0 + 19 51 1 1 0 0 0 + 20 21 2 0 0 0 0 + 20 30 1 0 0 0 0 + 21 22 1 0 0 0 0 + 22 23 1 0 0 0 0 + 22 29 2 0 0 0 0 + 23 24 1 0 0 0 0 + 23 28 2 0 0 0 0 + 24 25 2 0 0 0 0 + 24 52 1 0 0 0 0 + 25 26 1 0 0 0 0 + 25 53 1 0 0 0 0 + 26 27 2 0 0 0 0 + 26 54 1 0 0 0 0 + 27 28 1 0 0 0 0 + 28 55 1 0 0 0 0 + 29 30 1 0 0 0 0 + 31 32 2 0 0 0 0 +M END +$$$$ + + OpenBabel08312206043D + + 55 59 0 0 1 0 0 0 0 0999 V2000 + 6.7229 -4.0146 4.2664 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7653 -2.8381 4.4693 C 0 0 2 0 0 0 0 0 0 0 0 0 + 4.5665 -3.2849 5.0759 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6430 -3.7702 4.1881 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5813 -4.4665 4.7761 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.5825 -5.0156 3.9808 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.6438 -4.8553 2.6005 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6975 -4.1430 2.0120 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7188 -3.5906 2.7924 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7822 -2.8083 2.2405 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9406 -2.5673 0.8065 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4070 -3.6941 -0.1078 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5119 -3.4197 -0.9172 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8865 -4.9979 -0.0020 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2908 -6.0172 -0.8813 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0184 -7.3270 -0.1490 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2268 -7.8170 0.6416 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8081 -6.7000 1.5094 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1196 -5.4213 0.7111 C 0 0 1 0 0 0 0 0 0 0 0 0 + 7.2484 -5.6016 -0.2736 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.4584 -4.9903 -1.4123 N 0 0 0 0 0 0 0 0 0 0 0 0 + 8.5221 -5.6754 -1.9475 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.9829 -5.4172 -3.2958 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.5694 -6.4392 -4.0509 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.0787 -6.1686 -5.3180 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.9804 -4.8743 -5.7980 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.4073 -3.8614 -5.1118 N 0 0 0 0 0 0 0 0 0 0 0 0 + 8.9218 -4.1557 -3.8774 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.0067 -6.6332 -1.1338 N 0 0 0 0 0 0 0 0 0 0 0 0 + 8.1741 -6.5751 -0.0162 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6237 -2.1394 3.1213 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.3265 -1.1789 2.8098 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9358 -4.5231 5.2095 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.6637 -3.6708 3.8246 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2962 -4.7661 3.5905 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2218 -2.1244 5.1649 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5400 -4.5821 5.8564 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7593 -5.5610 4.4352 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8617 -5.2760 1.9713 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6662 -4.0231 0.9340 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9914 -2.3960 0.5518 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4295 -1.6325 0.5492 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9807 -6.1895 -1.7161 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3558 -5.6644 -1.3280 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7124 -8.0956 -0.8683 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1769 -7.1812 0.5387 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9903 -8.2015 -0.0442 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9258 -8.6561 1.2800 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6974 -7.0629 2.0367 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0635 -6.4609 2.2775 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4169 -4.6457 1.4177 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.6458 -7.4468 -3.6483 H 0 0 0 0 0 0 0 0 0 0 0 0 + 10.5475 -6.9488 -5.9069 H 0 0 0 0 0 0 0 0 0 0 0 0 + 10.3787 -4.6100 -6.7734 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.4820 -3.3077 -3.3578 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 33 1 0 0 0 0 + 1 34 1 0 0 0 0 + 1 35 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 31 1 0 0 0 0 + 2 1 1 0 0 0 0 + 2 36 1 1 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 9 2 0 0 0 0 + 5 6 2 0 0 0 0 + 5 37 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 38 1 0 0 0 0 + 7 8 2 0 0 0 0 + 7 39 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 40 1 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 1 0 0 0 0 + 10 31 1 0 0 0 0 + 11 12 1 0 0 0 0 + 11 41 1 0 0 0 0 + 11 42 1 0 0 0 0 + 12 13 2 0 0 0 0 + 12 14 1 0 0 0 0 + 14 15 1 0 0 0 0 + 14 19 1 0 0 0 0 + 15 16 1 0 0 0 0 + 15 43 1 0 0 0 0 + 15 44 1 0 0 0 0 + 16 17 1 0 0 0 0 + 16 45 1 0 0 0 0 + 16 46 1 0 0 0 0 + 17 18 1 0 0 0 0 + 17 47 1 0 0 0 0 + 17 48 1 0 0 0 0 + 18 19 1 0 0 0 0 + 18 49 1 0 0 0 0 + 18 50 1 0 0 0 0 + 19 20 1 0 0 0 0 + 19 51 1 1 0 0 0 + 20 21 2 0 0 0 0 + 20 30 1 0 0 0 0 + 21 22 1 0 0 0 0 + 22 23 1 0 0 0 0 + 22 29 2 0 0 0 0 + 23 24 1 0 0 0 0 + 23 28 2 0 0 0 0 + 24 25 2 0 0 0 0 + 24 52 1 0 0 0 0 + 25 26 1 0 0 0 0 + 25 53 1 0 0 0 0 + 26 27 2 0 0 0 0 + 26 54 1 0 0 0 0 + 27 28 1 0 0 0 0 + 28 55 1 0 0 0 0 + 29 30 1 0 0 0 0 + 31 32 2 0 0 0 0 +M END +$$$$ + + OpenBabel08312206043D + + 55 59 0 0 1 0 0 0 0 0999 V2000 + 5.2240 -1.3231 4.7580 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8495 -1.1344 4.1120 C 0 0 2 0 0 0 0 0 0 0 0 0 + 2.9336 -2.0818 4.6300 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9696 -3.2939 3.9929 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2866 -4.3196 4.6558 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2565 -5.5996 4.1152 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8998 -5.8455 2.9068 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5692 -4.8148 2.2334 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6210 -3.5214 2.7641 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2434 -2.4266 2.0847 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9406 -2.5673 0.8065 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4070 -3.6941 -0.1078 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5119 -3.4197 -0.9172 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8865 -4.9979 -0.0020 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2908 -6.0172 -0.8813 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0184 -7.3270 -0.1490 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2268 -7.8170 0.6416 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8081 -6.7000 1.5094 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1196 -5.4213 0.7111 C 0 0 1 0 0 0 0 0 0 0 0 0 + 7.2484 -5.6016 -0.2736 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1985 -5.9525 -1.5341 N 0 0 0 0 0 0 0 0 0 0 0 0 + 8.5203 -6.1214 -1.8679 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.9094 -6.6682 -3.1511 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.0906 -7.4083 -3.2760 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.4990 -7.8681 -4.5250 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.7043 -7.5762 -5.6198 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.5485 -6.8808 -5.5434 N 0 0 0 0 0 0 0 0 0 0 0 0 + 8.1776 -6.4432 -4.3118 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.3690 -5.8120 -0.8687 N 0 0 0 0 0 0 0 0 0 0 0 0 + 8.5285 -5.4511 0.1843 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0595 -1.1498 2.6016 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2184 -0.1143 1.9567 O 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1672 -1.2474 5.8462 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9293 -0.5745 4.3832 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6409 -2.3122 4.5304 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4631 -0.1447 4.3816 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7827 -4.1160 5.5975 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7305 -6.3990 4.6310 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8748 -6.8434 2.4732 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0188 -5.0646 1.2779 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.0110 -2.7372 0.9608 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8786 -1.6156 0.2663 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9807 -6.1895 -1.7161 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3558 -5.6644 -1.3280 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7124 -8.0956 -0.8683 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1769 -7.1812 0.5387 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9903 -8.2015 -0.0442 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9258 -8.6561 1.2800 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6974 -7.0629 2.0367 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0635 -6.4609 2.2775 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4169 -4.6457 1.4177 H 0 0 0 0 0 0 0 0 0 0 0 0 + 10.7051 -7.6160 -2.4029 H 0 0 0 0 0 0 0 0 0 0 0 0 + 11.4190 -8.4307 -4.6365 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.9898 -7.8980 -6.6172 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2487 -5.8777 -4.3010 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 33 1 0 0 0 0 + 1 34 1 0 0 0 0 + 1 35 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 31 1 0 0 0 0 + 2 1 1 0 0 0 0 + 2 36 1 1 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 9 2 0 0 0 0 + 5 6 2 0 0 0 0 + 5 37 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 38 1 0 0 0 0 + 7 8 2 0 0 0 0 + 7 39 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 40 1 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 1 0 0 0 0 + 10 31 1 0 0 0 0 + 11 12 1 0 0 0 0 + 11 41 1 0 0 0 0 + 11 42 1 0 0 0 0 + 12 13 2 0 0 0 0 + 12 14 1 0 0 0 0 + 14 15 1 0 0 0 0 + 14 19 1 0 0 0 0 + 15 16 1 0 0 0 0 + 15 43 1 0 0 0 0 + 15 44 1 0 0 0 0 + 16 17 1 0 0 0 0 + 16 45 1 0 0 0 0 + 16 46 1 0 0 0 0 + 17 18 1 0 0 0 0 + 17 47 1 0 0 0 0 + 17 48 1 0 0 0 0 + 18 19 1 0 0 0 0 + 18 49 1 0 0 0 0 + 18 50 1 0 0 0 0 + 19 20 1 0 0 0 0 + 19 51 1 1 0 0 0 + 20 21 2 0 0 0 0 + 20 30 1 0 0 0 0 + 21 22 1 0 0 0 0 + 22 23 1 0 0 0 0 + 22 29 2 0 0 0 0 + 23 24 1 0 0 0 0 + 23 28 2 0 0 0 0 + 24 25 2 0 0 0 0 + 24 52 1 0 0 0 0 + 25 26 1 0 0 0 0 + 25 53 1 0 0 0 0 + 26 27 2 0 0 0 0 + 26 54 1 0 0 0 0 + 27 28 1 0 0 0 0 + 28 55 1 0 0 0 0 + 29 30 1 0 0 0 0 + 31 32 2 0 0 0 0 +M END +$$$$ + + OpenBabel08312206043D + + 55 59 0 0 1 0 0 0 0 0999 V2000 + 0.0227 -0.9961 -2.1398 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.2541 -1.1829 -0.6386 C 0 0 2 0 0 0 0 0 0 0 0 0 + 0.7440 0.0169 -0.0682 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1019 0.1655 -0.1701 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5701 1.4498 0.1287 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9291 1.7311 0.0535 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8158 0.7225 -0.3087 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3496 -0.5686 -0.5910 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9851 -0.8715 -0.5316 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4704 -2.1876 -0.7559 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3102 -3.3243 -1.1328 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4070 -3.6941 -0.1078 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8800 -2.7936 0.5973 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8865 -4.9979 -0.0020 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2908 -6.0172 -0.8813 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0184 -7.3270 -0.1490 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2268 -7.8170 0.6416 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8081 -6.7000 1.5094 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1196 -5.4213 0.7111 C 0 0 1 0 0 0 0 0 0 0 0 0 + 7.2484 -5.6016 -0.2736 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9498 -6.6746 -0.5406 N 0 0 0 0 0 0 0 0 0 0 0 0 + 8.9357 -6.2080 -1.3759 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.0355 -7.0544 -1.7894 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.2896 -6.4991 -2.0680 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.3229 -7.3055 -2.5371 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.0705 -8.6552 -2.7097 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.8819 -9.2367 -2.4372 N 0 0 0 0 0 0 0 0 0 0 0 0 + 9.8923 -8.4237 -1.9834 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.8072 -4.9020 -1.6794 N 0 0 0 0 0 0 0 0 0 0 0 0 + 7.6795 -4.5016 -0.9628 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1301 -2.4201 -0.4718 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6494 -3.5352 -0.2743 O 0 0 0 0 0 0 0 0 0 0 0 0 + -0.6624 -0.1687 -2.3380 H 0 0 0 0 0 0 0 0 0 0 0 0 + -0.3840 -1.9114 -2.5815 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.9588 -0.7648 -2.6634 H 0 0 0 0 0 0 0 0 0 0 0 0 + -0.7070 -1.3910 -0.1542 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.8693 2.2300 0.4155 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2945 2.7294 0.2806 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8823 0.9327 -0.3628 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0968 -1.3179 -0.8312 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7964 -3.1491 -2.0979 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6676 -4.1977 -1.2925 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9807 -6.1895 -1.7161 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3558 -5.6644 -1.3280 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7124 -8.0956 -0.8683 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1769 -7.1812 0.5387 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9903 -8.2015 -0.0442 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9258 -8.6561 1.2800 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6974 -7.0629 2.0367 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0635 -6.4609 2.2775 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4169 -4.6457 1.4177 H 0 0 0 0 0 0 0 0 0 0 0 0 + 11.4616 -5.4332 -1.9355 H 0 0 0 0 0 0 0 0 0 0 0 0 + 13.2947 -6.8846 -2.7694 H 0 0 0 0 0 0 0 0 0 0 0 0 + 12.8394 -9.3217 -3.0900 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.9510 -8.9329 -1.7902 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 33 1 0 0 0 0 + 1 34 1 0 0 0 0 + 1 35 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 31 1 0 0 0 0 + 2 1 1 0 0 0 0 + 2 36 1 1 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 9 2 0 0 0 0 + 5 6 2 0 0 0 0 + 5 37 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 38 1 0 0 0 0 + 7 8 2 0 0 0 0 + 7 39 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 40 1 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 1 0 0 0 0 + 10 31 1 0 0 0 0 + 11 12 1 0 0 0 0 + 11 41 1 0 0 0 0 + 11 42 1 0 0 0 0 + 12 13 2 0 0 0 0 + 12 14 1 0 0 0 0 + 14 15 1 0 0 0 0 + 14 19 1 0 0 0 0 + 15 16 1 0 0 0 0 + 15 43 1 0 0 0 0 + 15 44 1 0 0 0 0 + 16 17 1 0 0 0 0 + 16 45 1 0 0 0 0 + 16 46 1 0 0 0 0 + 17 18 1 0 0 0 0 + 17 47 1 0 0 0 0 + 17 48 1 0 0 0 0 + 18 19 1 0 0 0 0 + 18 49 1 0 0 0 0 + 18 50 1 0 0 0 0 + 19 20 1 0 0 0 0 + 19 51 1 1 0 0 0 + 20 21 2 0 0 0 0 + 20 30 1 0 0 0 0 + 21 22 1 0 0 0 0 + 22 23 1 0 0 0 0 + 22 29 2 0 0 0 0 + 23 24 1 0 0 0 0 + 23 28 2 0 0 0 0 + 24 25 2 0 0 0 0 + 24 52 1 0 0 0 0 + 25 26 1 0 0 0 0 + 25 53 1 0 0 0 0 + 26 27 2 0 0 0 0 + 26 54 1 0 0 0 0 + 27 28 1 0 0 0 0 + 28 55 1 0 0 0 0 + 29 30 1 0 0 0 0 + 31 32 2 0 0 0 0 +M END +$$$$ + + OpenBabel08312206043D + + 55 59 0 0 1 0 0 0 0 0999 V2000 + 0.7962 -1.7159 1.7542 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.6388 -0.6975 0.9828 C 0 0 2 0 0 0 0 0 0 0 0 0 + 0.8226 0.0259 0.0799 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6365 -0.6009 -1.1238 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.3775 -0.0503 -1.9153 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.6699 -0.6023 -3.1568 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0620 -1.6961 -3.6068 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0895 -2.2374 -2.8224 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3941 -1.7041 -1.5654 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4704 -2.1876 -0.7559 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3102 -3.3243 -1.1328 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4070 -3.6941 -0.1078 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8800 -2.7936 0.5973 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8865 -4.9979 -0.0020 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2908 -6.0172 -0.8813 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0184 -7.3270 -0.1490 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2268 -7.8170 0.6416 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8081 -6.7000 1.5094 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1196 -5.4213 0.7111 C 0 0 1 0 0 0 0 0 0 0 0 0 + 7.2484 -5.6016 -0.2736 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2473 -5.4369 -1.5726 N 0 0 0 0 0 0 0 0 0 0 0 0 + 8.4814 -5.9061 -1.9519 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.8358 -6.0506 -3.3485 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.8503 -6.3240 -4.3038 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.2047 -6.5363 -5.6332 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.5447 -6.4628 -5.9711 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.5271 -6.1846 -5.0863 N 0 0 0 0 0 0 0 0 0 0 0 0 + 10.1505 -5.9848 -3.7962 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2546 -6.2801 -0.9142 N 0 0 0 0 0 0 0 0 0 0 0 0 + 8.4452 -6.0636 0.2009 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8133 -1.4574 0.3757 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9003 -1.5380 0.9463 O 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0279 -1.2326 2.2838 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4161 -2.2583 2.4752 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.3485 -2.4573 1.0806 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0482 0.0331 1.6900 H 0 0 0 0 0 0 0 0 0 0 0 0 + -0.9407 0.8078 -1.5566 H 0 0 0 0 0 0 0 0 0 0 0 0 + -1.4604 -0.1790 -3.7713 H 0 0 0 0 0 0 0 0 0 0 0 0 + -0.1558 -2.1297 -4.5810 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.6458 -3.0664 -3.2474 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7964 -3.1491 -2.0979 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6676 -4.1977 -1.2925 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9807 -6.1895 -1.7161 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3558 -5.6644 -1.3280 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7124 -8.0956 -0.8683 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1769 -7.1812 0.5387 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9903 -8.2015 -0.0442 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9258 -8.6561 1.2800 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6974 -7.0629 2.0367 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0635 -6.4609 2.2775 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4169 -4.6457 1.4177 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8042 -6.3881 -4.0129 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.4518 -6.7623 -6.3799 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.8726 -6.6382 -6.9918 H 0 0 0 0 0 0 0 0 0 0 0 0 + 10.9753 -5.7771 -3.1185 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 33 1 0 0 0 0 + 1 34 1 0 0 0 0 + 1 35 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 31 1 0 0 0 0 + 2 1 1 0 0 0 0 + 2 36 1 1 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 9 2 0 0 0 0 + 5 6 2 0 0 0 0 + 5 37 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 38 1 0 0 0 0 + 7 8 2 0 0 0 0 + 7 39 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 40 1 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 1 0 0 0 0 + 10 31 1 0 0 0 0 + 11 12 1 0 0 0 0 + 11 41 1 0 0 0 0 + 11 42 1 0 0 0 0 + 12 13 2 0 0 0 0 + 12 14 1 0 0 0 0 + 14 15 1 0 0 0 0 + 14 19 1 0 0 0 0 + 15 16 1 0 0 0 0 + 15 43 1 0 0 0 0 + 15 44 1 0 0 0 0 + 16 17 1 0 0 0 0 + 16 45 1 0 0 0 0 + 16 46 1 0 0 0 0 + 17 18 1 0 0 0 0 + 17 47 1 0 0 0 0 + 17 48 1 0 0 0 0 + 18 19 1 0 0 0 0 + 18 49 1 0 0 0 0 + 18 50 1 0 0 0 0 + 19 20 1 0 0 0 0 + 19 51 1 1 0 0 0 + 20 21 2 0 0 0 0 + 20 30 1 0 0 0 0 + 21 22 1 0 0 0 0 + 22 23 1 0 0 0 0 + 22 29 2 0 0 0 0 + 23 24 1 0 0 0 0 + 23 28 2 0 0 0 0 + 24 25 2 0 0 0 0 + 24 52 1 0 0 0 0 + 25 26 1 0 0 0 0 + 25 53 1 0 0 0 0 + 26 27 2 0 0 0 0 + 26 54 1 0 0 0 0 + 27 28 1 0 0 0 0 + 28 55 1 0 0 0 0 + 29 30 1 0 0 0 0 + 31 32 2 0 0 0 0 +M END +$$$$ + + OpenBabel08312206043D + + 55 59 0 0 1 0 0 0 0 0999 V2000 + 0.1398 -1.2615 0.5806 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.2564 -2.3873 -0.3773 C 0 0 2 0 0 0 0 0 0 0 0 0 + -0.7709 -3.4875 0.3504 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.1919 -4.3425 0.8178 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.2623 -5.2685 1.7633 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6207 -6.1858 2.3205 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9528 -6.1807 1.9201 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4048 -5.2651 0.9602 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.5358 -4.3264 0.3938 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9396 -3.4115 -0.6295 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3102 -3.3243 -1.1328 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4070 -3.6941 -0.1078 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8800 -2.7936 0.5973 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8865 -4.9979 -0.0020 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2908 -6.0172 -0.8813 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0184 -7.3270 -0.1490 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2268 -7.8170 0.6416 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8081 -6.7000 1.5094 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1196 -5.4213 0.7111 C 0 0 1 0 0 0 0 0 0 0 0 0 + 7.2484 -5.6016 -0.2736 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1985 -5.9525 -1.5341 N 0 0 0 0 0 0 0 0 0 0 0 0 + 8.5203 -6.1214 -1.8679 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.9094 -6.6682 -3.1511 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.0906 -7.4083 -3.2760 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.4990 -7.8681 -4.5250 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.7043 -7.5762 -5.6198 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.5485 -6.8808 -5.5434 N 0 0 0 0 0 0 0 0 0 0 0 0 + 8.1776 -6.4432 -4.3118 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.3690 -5.8120 -0.8687 N 0 0 0 0 0 0 0 0 0 0 0 0 + 8.5285 -5.4511 0.1843 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.9527 -2.6665 -1.2637 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0912 -2.1302 -2.3623 O 0 0 0 0 0 0 0 0 0 0 0 0 + -0.7033 -0.9508 1.2017 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.5111 -0.3963 0.0220 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.9369 -1.5795 1.2642 H 0 0 0 0 0 0 0 0 0 0 0 0 + -1.0665 -2.0336 -1.0255 H 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3066 -5.2675 2.0660 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.2710 -6.9030 3.0587 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6491 -6.9005 2.3462 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4464 -5.3384 0.6653 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5261 -2.3193 -1.5093 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4064 -3.9814 -2.0048 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9807 -6.1895 -1.7161 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3558 -5.6644 -1.3280 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7124 -8.0956 -0.8683 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1769 -7.1812 0.5387 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9903 -8.2015 -0.0442 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9258 -8.6561 1.2800 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6974 -7.0629 2.0367 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0635 -6.4609 2.2775 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4169 -4.6457 1.4177 H 0 0 0 0 0 0 0 0 0 0 0 0 + 10.7051 -7.6160 -2.4029 H 0 0 0 0 0 0 0 0 0 0 0 0 + 11.4190 -8.4307 -4.6365 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.9898 -7.8980 -6.6172 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2487 -5.8777 -4.3010 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 33 1 0 0 0 0 + 1 34 1 0 0 0 0 + 1 35 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 31 1 0 0 0 0 + 2 1 1 0 0 0 0 + 2 36 1 6 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 9 2 0 0 0 0 + 5 6 2 0 0 0 0 + 5 37 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 38 1 0 0 0 0 + 7 8 2 0 0 0 0 + 7 39 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 40 1 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 1 0 0 0 0 + 10 31 1 0 0 0 0 + 11 12 1 0 0 0 0 + 11 41 1 0 0 0 0 + 11 42 1 0 0 0 0 + 12 13 2 0 0 0 0 + 12 14 1 0 0 0 0 + 14 15 1 0 0 0 0 + 14 19 1 0 0 0 0 + 15 16 1 0 0 0 0 + 15 43 1 0 0 0 0 + 15 44 1 0 0 0 0 + 16 17 1 0 0 0 0 + 16 45 1 0 0 0 0 + 16 46 1 0 0 0 0 + 17 18 1 0 0 0 0 + 17 47 1 0 0 0 0 + 17 48 1 0 0 0 0 + 18 19 1 0 0 0 0 + 18 49 1 0 0 0 0 + 18 50 1 0 0 0 0 + 19 20 1 0 0 0 0 + 19 51 1 1 0 0 0 + 20 21 2 0 0 0 0 + 20 30 1 0 0 0 0 + 21 22 1 0 0 0 0 + 22 23 1 0 0 0 0 + 22 29 2 0 0 0 0 + 23 24 1 0 0 0 0 + 23 28 2 0 0 0 0 + 24 25 2 0 0 0 0 + 24 52 1 0 0 0 0 + 25 26 1 0 0 0 0 + 25 53 1 0 0 0 0 + 26 27 2 0 0 0 0 + 26 54 1 0 0 0 0 + 27 28 1 0 0 0 0 + 28 55 1 0 0 0 0 + 29 30 1 0 0 0 0 + 31 32 2 0 0 0 0 +M END +$$$$ + + OpenBabel08312206043D + + 55 59 0 0 1 0 0 0 0 0999 V2000 + 5.8113 -2.5876 -4.3646 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4359 -1.9207 -4.4393 C 0 0 2 0 0 0 0 0 0 0 0 0 + 4.5572 -0.5277 -4.2162 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5589 -0.1761 -2.8922 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9542 1.1425 -2.6415 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0058 1.6185 -1.3367 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6497 0.7764 -0.2885 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2367 -0.5390 -0.5400 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1871 -1.0421 -1.8445 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7182 -2.3584 -2.1527 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3102 -3.3243 -1.1328 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4070 -3.6941 -0.1078 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8800 -2.7936 0.5973 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8865 -4.9979 -0.0020 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2908 -6.0172 -0.8813 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0184 -7.3270 -0.1490 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2268 -7.8170 0.6416 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8081 -6.7000 1.5094 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1196 -5.4213 0.7111 C 0 0 1 0 0 0 0 0 0 0 0 0 + 7.2484 -5.6016 -0.2736 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.2696 -6.4194 -0.2207 N 0 0 0 0 0 0 0 0 0 0 0 0 + 9.0466 -6.0240 -1.2824 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.3682 -6.5762 -1.4956 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.8854 -7.5335 -0.6154 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.1843 -8.0063 -0.7808 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.9313 -7.5074 -1.8336 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.4672 -6.5967 -2.7171 N 0 0 0 0 0 0 0 0 0 0 0 0 + 11.1972 -6.1524 -2.5283 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.4901 -5.0419 -2.0173 N 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2899 -4.7715 -1.3600 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5177 -2.6821 -3.4892 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8042 -3.6066 -3.8762 O 0 0 0 0 0 0 0 0 0 0 0 0 + 6.5094 -2.1436 -5.0779 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7281 -3.6605 -4.5654 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2588 -2.4720 -3.3695 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0367 -2.0424 -5.4528 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2260 1.7943 -3.4682 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3172 2.6410 -1.1393 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.6803 1.1437 0.7356 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9376 -1.1314 0.3184 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9521 -4.2512 -1.5921 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4451 -2.9212 -0.5938 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9807 -6.1895 -1.7161 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3558 -5.6644 -1.3280 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7124 -8.0956 -0.8683 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1769 -7.1812 0.5387 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9903 -8.2015 -0.0442 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9258 -8.6561 1.2800 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6974 -7.0629 2.0367 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0635 -6.4609 2.2775 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4169 -4.6457 1.4177 H 0 0 0 0 0 0 0 0 0 0 0 0 + 10.2836 -7.9029 0.2119 H 0 0 0 0 0 0 0 0 0 0 0 0 + 12.6008 -8.7377 -0.0974 H 0 0 0 0 0 0 0 0 0 0 0 0 + 13.9554 -7.8323 -1.9935 H 0 0 0 0 0 0 0 0 0 0 0 0 + 10.8717 -5.4116 -3.2549 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 33 1 0 0 0 0 + 1 34 1 0 0 0 0 + 1 35 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 31 1 0 0 0 0 + 2 1 1 0 0 0 0 + 2 36 1 6 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 9 2 0 0 0 0 + 5 6 2 0 0 0 0 + 5 37 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 38 1 0 0 0 0 + 7 8 2 0 0 0 0 + 7 39 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 40 1 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 1 0 0 0 0 + 10 31 1 0 0 0 0 + 11 12 1 0 0 0 0 + 11 41 1 0 0 0 0 + 11 42 1 0 0 0 0 + 12 13 2 0 0 0 0 + 12 14 1 0 0 0 0 + 14 15 1 0 0 0 0 + 14 19 1 0 0 0 0 + 15 16 1 0 0 0 0 + 15 43 1 0 0 0 0 + 15 44 1 0 0 0 0 + 16 17 1 0 0 0 0 + 16 45 1 0 0 0 0 + 16 46 1 0 0 0 0 + 17 18 1 0 0 0 0 + 17 47 1 0 0 0 0 + 17 48 1 0 0 0 0 + 18 19 1 0 0 0 0 + 18 49 1 0 0 0 0 + 18 50 1 0 0 0 0 + 19 20 1 0 0 0 0 + 19 51 1 1 0 0 0 + 20 21 2 0 0 0 0 + 20 30 1 0 0 0 0 + 21 22 1 0 0 0 0 + 22 23 1 0 0 0 0 + 22 29 2 0 0 0 0 + 23 24 1 0 0 0 0 + 23 28 2 0 0 0 0 + 24 25 2 0 0 0 0 + 24 52 1 0 0 0 0 + 25 26 1 0 0 0 0 + 25 53 1 0 0 0 0 + 26 27 2 0 0 0 0 + 26 54 1 0 0 0 0 + 27 28 1 0 0 0 0 + 28 55 1 0 0 0 0 + 29 30 1 0 0 0 0 + 31 32 2 0 0 0 0 +M END +$$$$ + + OpenBabel08312206043D + + 55 59 0 0 1 0 0 0 0 0999 V2000 + 1.4488 0.3780 -1.3988 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.9781 0.4186 -1.3577 C 0 0 2 0 0 0 0 0 0 0 0 0 + 3.4912 0.7491 -2.6354 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6294 -0.3262 -3.4727 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8638 0.0061 -4.8116 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0135 -0.9964 -5.7625 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9400 -2.3281 -5.3676 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7228 -2.6619 -4.0240 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5592 -1.6693 -3.0518 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3924 -1.9629 -1.6614 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3102 -3.3243 -1.1328 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4070 -3.6941 -0.1078 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8800 -2.7936 0.5973 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8865 -4.9979 -0.0020 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2908 -6.0172 -0.8813 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0184 -7.3270 -0.1490 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2268 -7.8170 0.6416 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8081 -6.7000 1.5094 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1196 -5.4213 0.7111 C 0 0 1 0 0 0 0 0 0 0 0 0 + 7.2484 -5.6016 -0.2736 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.5352 -5.4365 -0.0963 N 0 0 0 0 0 0 0 0 0 0 0 0 + 9.0485 -5.5683 -1.3637 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.4434 -5.2983 -1.6434 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.1482 -4.3581 -0.8832 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.4670 -4.0470 -1.2030 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.0477 -4.6950 -2.2792 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.4115 -5.6212 -3.0293 N 0 0 0 0 0 0 0 0 0 0 0 0 + 11.1249 -5.9017 -2.6944 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.1199 -5.8808 -2.2881 N 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9279 -5.9197 -1.5647 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4446 -0.9052 -0.7614 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6731 -1.0322 0.4408 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0336 1.3269 -1.7459 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0449 0.1518 -0.4068 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0873 -0.3966 -2.0867 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2941 1.2172 -0.6766 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9243 1.0500 -5.1093 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.1909 -0.7405 -6.8039 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0634 -3.1191 -6.1049 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7130 -3.7184 -3.7768 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3429 -4.0612 -1.9417 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3289 -3.4601 -0.6639 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9807 -6.1895 -1.7161 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3558 -5.6644 -1.3280 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7124 -8.0956 -0.8683 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1769 -7.1812 0.5387 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9903 -8.2015 -0.0442 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9258 -8.6561 1.2800 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6974 -7.0629 2.0367 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0635 -6.4609 2.2775 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4169 -4.6457 1.4177 H 0 0 0 0 0 0 0 0 0 0 0 0 + 10.6674 -3.8530 -0.0484 H 0 0 0 0 0 0 0 0 0 0 0 0 + 13.0189 -3.3105 -0.6301 H 0 0 0 0 0 0 0 0 0 0 0 0 + 14.0681 -4.4735 -2.5786 H 0 0 0 0 0 0 0 0 0 0 0 0 + 10.6497 -6.6425 -3.3332 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 33 1 0 0 0 0 + 1 34 1 0 0 0 0 + 1 35 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 31 1 0 0 0 0 + 2 1 1 0 0 0 0 + 2 36 1 1 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 9 2 0 0 0 0 + 5 6 2 0 0 0 0 + 5 37 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 38 1 0 0 0 0 + 7 8 2 0 0 0 0 + 7 39 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 40 1 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 1 0 0 0 0 + 10 31 1 0 0 0 0 + 11 12 1 0 0 0 0 + 11 41 1 0 0 0 0 + 11 42 1 0 0 0 0 + 12 13 2 0 0 0 0 + 12 14 1 0 0 0 0 + 14 15 1 0 0 0 0 + 14 19 1 0 0 0 0 + 15 16 1 0 0 0 0 + 15 43 1 0 0 0 0 + 15 44 1 0 0 0 0 + 16 17 1 0 0 0 0 + 16 45 1 0 0 0 0 + 16 46 1 0 0 0 0 + 17 18 1 0 0 0 0 + 17 47 1 0 0 0 0 + 17 48 1 0 0 0 0 + 18 19 1 0 0 0 0 + 18 49 1 0 0 0 0 + 18 50 1 0 0 0 0 + 19 20 1 0 0 0 0 + 19 51 1 1 0 0 0 + 20 21 2 0 0 0 0 + 20 30 1 0 0 0 0 + 21 22 1 0 0 0 0 + 22 23 1 0 0 0 0 + 22 29 2 0 0 0 0 + 23 24 1 0 0 0 0 + 23 28 2 0 0 0 0 + 24 25 2 0 0 0 0 + 24 52 1 0 0 0 0 + 25 26 1 0 0 0 0 + 25 53 1 0 0 0 0 + 26 27 2 0 0 0 0 + 26 54 1 0 0 0 0 + 27 28 1 0 0 0 0 + 28 55 1 0 0 0 0 + 29 30 1 0 0 0 0 + 31 32 2 0 0 0 0 +M END +$$$$ + + OpenBabel08312206043D + + 55 59 0 0 1 0 0 0 0 0999 V2000 + 1.4694 -1.9427 2.3233 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1037 -1.1877 1.0433 C 0 0 2 0 0 0 0 0 0 0 0 0 + -0.2161 -1.5125 0.6463 O 0 0 0 0 0 0 0 0 0 0 0 0 + -0.3039 -2.6539 -0.1060 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.6045 -3.1430 -0.2705 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.8257 -4.3009 -1.0068 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.7453 -4.9582 -1.5859 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.5557 -4.4593 -1.4364 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8026 -3.3013 -0.6912 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1056 -2.7248 -0.5594 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3102 -3.3243 -1.1328 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4070 -3.6941 -0.1078 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8800 -2.7936 0.5973 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8865 -4.9979 -0.0020 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2908 -6.0172 -0.8813 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0184 -7.3270 -0.1490 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2268 -7.8170 0.6416 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8081 -6.7000 1.5094 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1196 -5.4213 0.7111 C 0 0 1 0 0 0 0 0 0 0 0 0 + 7.2484 -5.6016 -0.2736 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.4049 -4.9900 -0.3274 N 0 0 0 0 0 0 0 0 0 0 0 0 + 8.9388 -5.4271 -1.5153 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.1644 -4.8643 -2.0427 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.3772 -4.8025 -3.4246 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.5871 -4.3299 -3.9255 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.5538 -3.9248 -3.0218 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.3854 -3.9505 -1.6816 N 0 0 0 0 0 0 0 0 0 0 0 0 + 11.1954 -4.4190 -1.2230 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.1728 -6.3397 -2.1434 N 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0590 -6.4694 -1.3138 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2059 -1.4692 0.0277 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1694 -0.7169 -0.1113 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7625 -1.7293 3.1283 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4783 -1.6732 2.6518 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4525 -3.0284 2.1663 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.1128 -0.1114 1.2508 H 0 0 0 0 0 0 0 0 0 0 0 0 + -2.4428 -2.6192 0.1822 H 0 0 0 0 0 0 0 0 0 0 0 0 + -2.8348 -4.6853 -1.1318 H 0 0 0 0 0 0 0 0 0 0 0 0 + -0.9108 -5.8615 -2.1701 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3488 -4.9986 -1.9438 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7582 -2.6634 -1.8818 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0243 -4.2271 -1.6847 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9807 -6.1895 -1.7161 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3558 -5.6644 -1.3280 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7124 -8.0956 -0.8683 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1769 -7.1812 0.5387 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9903 -8.2015 -0.0442 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9258 -8.6561 1.2800 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6974 -7.0629 2.0367 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0635 -6.4609 2.2775 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4169 -4.6457 1.4177 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.6068 -5.1371 -4.1158 H 0 0 0 0 0 0 0 0 0 0 0 0 + 11.7689 -4.2901 -4.9935 H 0 0 0 0 0 0 0 0 0 0 0 0 + 13.5202 -3.5652 -3.3635 H 0 0 0 0 0 0 0 0 0 0 0 0 + 11.1102 -4.4334 -0.1389 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 33 1 0 0 0 0 + 1 34 1 0 0 0 0 + 1 35 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 31 1 0 0 0 0 + 2 1 1 0 0 0 0 + 2 36 1 1 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 9 2 0 0 0 0 + 5 6 2 0 0 0 0 + 5 37 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 38 1 0 0 0 0 + 7 8 2 0 0 0 0 + 7 39 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 40 1 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 1 0 0 0 0 + 10 31 1 0 0 0 0 + 11 12 1 0 0 0 0 + 11 41 1 0 0 0 0 + 11 42 1 0 0 0 0 + 12 13 2 0 0 0 0 + 12 14 1 0 0 0 0 + 14 15 1 0 0 0 0 + 14 19 1 0 0 0 0 + 15 16 1 0 0 0 0 + 15 43 1 0 0 0 0 + 15 44 1 0 0 0 0 + 16 17 1 0 0 0 0 + 16 45 1 0 0 0 0 + 16 46 1 0 0 0 0 + 17 18 1 0 0 0 0 + 17 47 1 0 0 0 0 + 17 48 1 0 0 0 0 + 18 19 1 0 0 0 0 + 18 49 1 0 0 0 0 + 18 50 1 0 0 0 0 + 19 20 1 0 0 0 0 + 19 51 1 1 0 0 0 + 20 21 2 0 0 0 0 + 20 30 1 0 0 0 0 + 21 22 1 0 0 0 0 + 22 23 1 0 0 0 0 + 22 29 2 0 0 0 0 + 23 24 1 0 0 0 0 + 23 28 2 0 0 0 0 + 24 25 2 0 0 0 0 + 24 52 1 0 0 0 0 + 25 26 1 0 0 0 0 + 25 53 1 0 0 0 0 + 26 27 2 0 0 0 0 + 26 54 1 0 0 0 0 + 27 28 1 0 0 0 0 + 28 55 1 0 0 0 0 + 29 30 1 0 0 0 0 + 31 32 2 0 0 0 0 +M END +$$$$ + + OpenBabel08312206043D + + 55 59 0 0 1 0 0 0 0 0999 V2000 + 3.4488 0.7207 -0.2050 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2464 0.3084 -1.4444 C 0 0 2 0 0 0 0 0 0 0 0 0 + 3.5874 0.7504 -2.6170 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6167 -0.1064 -3.0642 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7724 0.4311 -4.0421 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7412 -0.3362 -4.5707 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.5664 -1.6429 -4.1273 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.4224 -2.1879 -3.1607 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4604 -1.4305 -2.6076 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3924 -1.9629 -1.6614 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3102 -3.3243 -1.1328 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4070 -3.6941 -0.1078 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8800 -2.7936 0.5973 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8865 -4.9979 -0.0020 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2908 -6.0172 -0.8813 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0184 -7.3270 -0.1490 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2268 -7.8170 0.6416 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8081 -6.7000 1.5094 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1196 -5.4213 0.7111 C 0 0 1 0 0 0 0 0 0 0 0 0 + 7.2484 -5.6016 -0.2736 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.5352 -5.4365 -0.0963 N 0 0 0 0 0 0 0 0 0 0 0 0 + 9.0485 -5.5683 -1.3637 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.4434 -5.2983 -1.6434 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.1482 -4.3581 -0.8832 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.4670 -4.0470 -1.2030 C 0 0 0 0 0 0 0 0 0 0 0 0 + 13.0477 -4.6950 -2.2792 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.4115 -5.6212 -3.0293 N 0 0 0 0 0 0 0 0 0 0 0 0 + 11.1249 -5.9017 -2.6944 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.1199 -5.8808 -2.2881 N 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9279 -5.9197 -1.5647 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5007 -1.1912 -1.3338 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5328 -1.6407 -0.8376 O 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2913 1.8012 -0.1731 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9682 0.4075 0.7064 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4553 0.2552 -0.1951 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2203 0.8110 -1.4235 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9204 1.4520 -4.3855 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0812 0.0810 -5.3270 H 0 0 0 0 0 0 0 0 0 0 0 0 + -0.2343 -2.2528 -4.5415 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2544 -3.2240 -2.8855 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3429 -4.0612 -1.9417 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3289 -3.4601 -0.6639 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9807 -6.1895 -1.7161 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3558 -5.6644 -1.3280 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7124 -8.0956 -0.8683 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1769 -7.1812 0.5387 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9903 -8.2015 -0.0442 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9258 -8.6561 1.2800 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6974 -7.0629 2.0367 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0635 -6.4609 2.2775 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4169 -4.6457 1.4177 H 0 0 0 0 0 0 0 0 0 0 0 0 + 10.6674 -3.8530 -0.0484 H 0 0 0 0 0 0 0 0 0 0 0 0 + 13.0189 -3.3105 -0.6301 H 0 0 0 0 0 0 0 0 0 0 0 0 + 14.0681 -4.4735 -2.5786 H 0 0 0 0 0 0 0 0 0 0 0 0 + 10.6497 -6.6425 -3.3332 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 33 1 0 0 0 0 + 1 34 1 0 0 0 0 + 1 35 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 31 1 0 0 0 0 + 2 1 1 0 0 0 0 + 2 36 1 1 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 9 2 0 0 0 0 + 5 6 2 0 0 0 0 + 5 37 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 38 1 0 0 0 0 + 7 8 2 0 0 0 0 + 7 39 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 40 1 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 1 0 0 0 0 + 10 31 1 0 0 0 0 + 11 12 1 0 0 0 0 + 11 41 1 0 0 0 0 + 11 42 1 0 0 0 0 + 12 13 2 0 0 0 0 + 12 14 1 0 0 0 0 + 14 15 1 0 0 0 0 + 14 19 1 0 0 0 0 + 15 16 1 0 0 0 0 + 15 43 1 0 0 0 0 + 15 44 1 0 0 0 0 + 16 17 1 0 0 0 0 + 16 45 1 0 0 0 0 + 16 46 1 0 0 0 0 + 17 18 1 0 0 0 0 + 17 47 1 0 0 0 0 + 17 48 1 0 0 0 0 + 18 19 1 0 0 0 0 + 18 49 1 0 0 0 0 + 18 50 1 0 0 0 0 + 19 20 1 0 0 0 0 + 19 51 1 1 0 0 0 + 20 21 2 0 0 0 0 + 20 30 1 0 0 0 0 + 21 22 1 0 0 0 0 + 22 23 1 0 0 0 0 + 22 29 2 0 0 0 0 + 23 24 1 0 0 0 0 + 23 28 2 0 0 0 0 + 24 25 2 0 0 0 0 + 24 52 1 0 0 0 0 + 25 26 1 0 0 0 0 + 25 53 1 0 0 0 0 + 26 27 2 0 0 0 0 + 26 54 1 0 0 0 0 + 27 28 1 0 0 0 0 + 28 55 1 0 0 0 0 + 29 30 1 0 0 0 0 + 31 32 2 0 0 0 0 +M END +$$$$ + + OpenBabel08312206043D + + 55 59 0 0 1 0 0 0 0 0999 V2000 + 2.6927 -7.1329 -2.6676 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2666 -5.9837 -3.5840 C 0 0 2 0 0 0 0 0 0 0 0 0 + 3.1765 -5.8568 -4.6614 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2796 -5.0990 -4.3695 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3124 -5.1897 -5.3093 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4894 -4.4746 -5.1224 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6235 -3.6618 -4.0017 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5828 -3.5567 -3.0691 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3936 -4.2752 -3.2318 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2840 -4.1552 -2.3363 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3102 -3.3243 -1.1328 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4070 -3.6941 -0.1078 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8800 -2.7936 0.5973 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8865 -4.9979 -0.0020 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2908 -6.0172 -0.8813 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0184 -7.3270 -0.1490 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2268 -7.8170 0.6416 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8081 -6.7000 1.5094 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1196 -5.4213 0.7111 C 0 0 1 0 0 0 0 0 0 0 0 0 + 7.2484 -5.6016 -0.2736 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1985 -5.9525 -1.5341 N 0 0 0 0 0 0 0 0 0 0 0 0 + 8.5203 -6.1214 -1.8679 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.9094 -6.6682 -3.1511 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9365 -7.0390 -4.0863 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.3121 -7.6333 -5.2880 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.6610 -7.8355 -5.5224 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.6345 -7.4777 -4.6567 N 0 0 0 0 0 0 0 0 0 0 0 0 + 10.2369 -6.9024 -3.4918 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.3690 -5.8120 -0.8687 N 0 0 0 0 0 0 0 0 0 0 0 0 + 8.5285 -5.4511 0.1843 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.0840 -4.7529 -2.7022 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.9883 -4.4444 -2.2354 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7709 -8.0737 -3.2172 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9768 -7.2552 -1.8485 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.6767 -6.9445 -2.2203 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2913 -6.2227 -4.0235 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.1958 -5.8241 -6.1845 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.2948 -4.5473 -5.8488 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.5392 -3.0928 -3.8518 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.7371 -2.8775 -2.2370 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3448 -3.3507 -0.6174 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4447 -2.2783 -1.4314 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9807 -6.1895 -1.7161 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3558 -5.6644 -1.3280 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7124 -8.0956 -0.8683 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1769 -7.1812 0.5387 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9903 -8.2015 -0.0442 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9258 -8.6561 1.2800 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6974 -7.0629 2.0367 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0635 -6.4609 2.2775 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4169 -4.6457 1.4177 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.8813 -6.8806 -3.8755 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.5670 -7.9374 -6.0144 H 0 0 0 0 0 0 0 0 0 0 0 0 + 10.0024 -8.3113 -6.4373 H 0 0 0 0 0 0 0 0 0 0 0 0 + 11.0531 -6.6435 -2.8214 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 33 1 0 0 0 0 + 1 34 1 0 0 0 0 + 1 35 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 31 1 0 0 0 0 + 2 1 1 0 0 0 0 + 2 36 1 6 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 9 2 0 0 0 0 + 5 6 2 0 0 0 0 + 5 37 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 38 1 0 0 0 0 + 7 8 2 0 0 0 0 + 7 39 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 40 1 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 1 0 0 0 0 + 10 31 1 0 0 0 0 + 11 12 1 0 0 0 0 + 11 41 1 0 0 0 0 + 11 42 1 0 0 0 0 + 12 13 2 0 0 0 0 + 12 14 1 0 0 0 0 + 14 15 1 0 0 0 0 + 14 19 1 0 0 0 0 + 15 16 1 0 0 0 0 + 15 43 1 0 0 0 0 + 15 44 1 0 0 0 0 + 16 17 1 0 0 0 0 + 16 45 1 0 0 0 0 + 16 46 1 0 0 0 0 + 17 18 1 0 0 0 0 + 17 47 1 0 0 0 0 + 17 48 1 0 0 0 0 + 18 19 1 0 0 0 0 + 18 49 1 0 0 0 0 + 18 50 1 0 0 0 0 + 19 20 1 0 0 0 0 + 19 51 1 1 0 0 0 + 20 21 2 0 0 0 0 + 20 30 1 0 0 0 0 + 21 22 1 0 0 0 0 + 22 23 1 0 0 0 0 + 22 29 2 0 0 0 0 + 23 24 1 0 0 0 0 + 23 28 2 0 0 0 0 + 24 25 2 0 0 0 0 + 24 52 1 0 0 0 0 + 25 26 1 0 0 0 0 + 25 53 1 0 0 0 0 + 26 27 2 0 0 0 0 + 26 54 1 0 0 0 0 + 27 28 1 0 0 0 0 + 28 55 1 0 0 0 0 + 29 30 1 0 0 0 0 + 31 32 2 0 0 0 0 +M END +$$$$ + + OpenBabel08312206043D + + 55 59 0 0 1 0 0 0 0 0999 V2000 + -0.5570 -4.2137 -2.3557 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.5096 -5.2267 -2.7782 C 0 0 2 0 0 0 0 0 0 0 0 0 + 0.3839 -6.4130 -2.0155 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0301 -6.3676 -0.8086 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6928 -7.4024 0.0707 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2744 -7.4630 1.3316 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.2007 -6.4943 1.7031 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5524 -5.4675 0.8165 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9719 -5.3812 -0.4535 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3421 -4.3848 -1.4113 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3102 -3.3243 -1.1328 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4070 -3.6941 -0.1078 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8800 -2.7936 0.5973 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8865 -4.9979 -0.0020 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2908 -6.0172 -0.8813 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0184 -7.3270 -0.1490 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2268 -7.8170 0.6416 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8081 -6.7000 1.5094 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1196 -5.4213 0.7111 C 0 0 1 0 0 0 0 0 0 0 0 0 + 7.2484 -5.6016 -0.2736 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.4049 -4.9900 -0.3274 N 0 0 0 0 0 0 0 0 0 0 0 0 + 8.9388 -5.4271 -1.5153 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.1644 -4.8643 -2.0427 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.3772 -4.8025 -3.4246 C 0 0 0 0 0 0 0 0 0 0 0 0 + 11.5871 -4.3299 -3.9255 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.5538 -3.9248 -3.0218 C 0 0 0 0 0 0 0 0 0 0 0 0 + 12.3854 -3.9505 -1.6816 N 0 0 0 0 0 0 0 0 0 0 0 0 + 11.1954 -4.4190 -1.2230 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.1728 -6.3397 -2.1434 N 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0590 -6.4694 -1.3138 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1.8560 -4.5141 -2.7068 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3551 -3.9673 -3.6894 O 0 0 0 0 0 0 0 0 0 0 0 0 + -1.5627 -4.6289 -2.4538 H 0 0 0 0 0 0 0 0 0 0 0 0 + -0.4839 -3.3052 -2.9621 H 0 0 0 0 0 0 0 0 0 0 0 0 + -0.4365 -3.9200 -1.3055 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.3391 -5.5066 -3.8242 H 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0289 -8.1576 -0.2310 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.0101 -8.2634 2.0180 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6661 -6.5387 2.6859 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3078 -4.7656 1.1543 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8081 -2.4190 -0.7770 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7907 -3.0319 -2.0736 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9807 -6.1895 -1.7161 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3558 -5.6644 -1.3280 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7124 -8.0956 -0.8683 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1769 -7.1812 0.5387 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9903 -8.2015 -0.0442 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9258 -8.6561 1.2800 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6974 -7.0629 2.0367 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0635 -6.4609 2.2775 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4169 -4.6457 1.4177 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.6068 -5.1371 -4.1158 H 0 0 0 0 0 0 0 0 0 0 0 0 + 11.7689 -4.2901 -4.9935 H 0 0 0 0 0 0 0 0 0 0 0 0 + 13.5202 -3.5652 -3.3635 H 0 0 0 0 0 0 0 0 0 0 0 0 + 11.1102 -4.4334 -0.1389 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 33 1 0 0 0 0 + 1 34 1 0 0 0 0 + 1 35 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 31 1 0 0 0 0 + 2 1 1 0 0 0 0 + 2 36 1 6 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 9 2 0 0 0 0 + 5 6 2 0 0 0 0 + 5 37 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 38 1 0 0 0 0 + 7 8 2 0 0 0 0 + 7 39 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 40 1 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 1 0 0 0 0 + 10 31 1 0 0 0 0 + 11 12 1 0 0 0 0 + 11 41 1 0 0 0 0 + 11 42 1 0 0 0 0 + 12 13 2 0 0 0 0 + 12 14 1 0 0 0 0 + 14 15 1 0 0 0 0 + 14 19 1 0 0 0 0 + 15 16 1 0 0 0 0 + 15 43 1 0 0 0 0 + 15 44 1 0 0 0 0 + 16 17 1 0 0 0 0 + 16 45 1 0 0 0 0 + 16 46 1 0 0 0 0 + 17 18 1 0 0 0 0 + 17 47 1 0 0 0 0 + 17 48 1 0 0 0 0 + 18 19 1 0 0 0 0 + 18 49 1 0 0 0 0 + 18 50 1 0 0 0 0 + 19 20 1 0 0 0 0 + 19 51 1 1 0 0 0 + 20 21 2 0 0 0 0 + 20 30 1 0 0 0 0 + 21 22 1 0 0 0 0 + 22 23 1 0 0 0 0 + 22 29 2 0 0 0 0 + 23 24 1 0 0 0 0 + 23 28 2 0 0 0 0 + 24 25 2 0 0 0 0 + 24 52 1 0 0 0 0 + 25 26 1 0 0 0 0 + 25 53 1 0 0 0 0 + 26 27 2 0 0 0 0 + 26 54 1 0 0 0 0 + 27 28 1 0 0 0 0 + 28 55 1 0 0 0 0 + 29 30 1 0 0 0 0 + 31 32 2 0 0 0 0 +M END +$$$$ + + OpenBabel08312206043D + + 55 59 0 0 1 0 0 0 0 0999 V2000 + 6.6450 -2.9528 -3.5790 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3558 -3.3663 -4.2925 C 0 0 2 0 0 0 0 0 0 0 0 0 + 4.8555 -2.2863 -5.0593 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0773 -1.4133 -4.3462 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8070 -0.2069 -5.0014 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.0346 0.7665 -4.3789 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5252 0.5237 -3.1076 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7807 -0.6914 -2.4577 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5641 -1.6810 -3.0613 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8035 -2.9572 -2.4600 N 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3102 -3.3243 -1.1328 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4070 -3.6941 -0.1078 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8800 -2.7936 0.5973 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8865 -4.9979 -0.0020 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2908 -6.0172 -0.8813 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0184 -7.3270 -0.1490 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.2268 -7.8170 0.6416 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.8081 -6.7000 1.5094 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.1196 -5.4213 0.7111 C 0 0 1 0 0 0 0 0 0 0 0 0 + 7.2484 -5.6016 -0.2736 C 0 0 0 0 0 0 0 0 0 0 0 0 + 7.1985 -5.9525 -1.5341 N 0 0 0 0 0 0 0 0 0 0 0 0 + 8.5203 -6.1214 -1.8679 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.9094 -6.6682 -3.1511 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.2619 -6.8452 -3.4640 C 0 0 0 0 0 0 0 0 0 0 0 0 + 10.6341 -7.3005 -4.7259 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.6338 -7.5725 -5.6427 C 0 0 0 0 0 0 0 0 0 0 0 0 + 8.3162 -7.4330 -5.3786 N 0 0 0 0 0 0 0 0 0 0 0 0 + 7.9843 -6.9845 -4.1397 C 0 0 0 0 0 0 0 0 0 0 0 0 + 9.3690 -5.8120 -0.8687 N 0 0 0 0 0 0 0 0 0 0 0 0 + 8.5285 -5.4511 0.1843 O 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4201 -3.9352 -3.2311 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.3675 -5.1402 -2.9892 O 0 0 0 0 0 0 0 0 0 0 0 0 + 7.3990 -2.6031 -4.2879 H 0 0 0 0 0 0 0 0 0 0 0 0 + 7.0529 -3.7927 -3.0076 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4667 -2.1304 -2.8748 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5838 -4.1733 -4.9985 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2058 -0.0287 -5.9971 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.8274 1.7064 -4.8842 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.9134 1.2778 -2.6162 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3237 -0.8319 -1.4837 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6094 -4.1630 -1.1936 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7216 -2.4901 -0.7341 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9807 -6.1895 -1.7161 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.3558 -5.6644 -1.3280 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.7124 -8.0956 -0.8683 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1769 -7.1812 0.5387 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.9903 -8.2015 -0.0442 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.9258 -8.6561 1.2800 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.6974 -7.0629 2.0367 H 0 0 0 0 0 0 0 0 0 0 0 0 + 5.0635 -6.4609 2.2775 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.4169 -4.6457 1.4177 H 0 0 0 0 0 0 0 0 0 0 0 0 + 11.0315 -6.6141 -2.7309 H 0 0 0 0 0 0 0 0 0 0 0 0 + 11.6791 -7.4285 -4.9846 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.8747 -7.9131 -6.6457 H 0 0 0 0 0 0 0 0 0 0 0 0 + 6.9145 -6.8755 -3.9772 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 33 1 0 0 0 0 + 1 34 1 0 0 0 0 + 1 35 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 31 1 0 0 0 0 + 2 1 1 0 0 0 0 + 2 36 1 6 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 9 2 0 0 0 0 + 5 6 2 0 0 0 0 + 5 37 1 0 0 0 0 + 6 7 1 0 0 0 0 + 6 38 1 0 0 0 0 + 7 8 2 0 0 0 0 + 7 39 1 0 0 0 0 + 8 9 1 0 0 0 0 + 8 40 1 0 0 0 0 + 9 10 1 0 0 0 0 + 10 11 1 0 0 0 0 + 10 31 1 0 0 0 0 + 11 12 1 0 0 0 0 + 11 41 1 0 0 0 0 + 11 42 1 0 0 0 0 + 12 13 2 0 0 0 0 + 12 14 1 0 0 0 0 + 14 15 1 0 0 0 0 + 14 19 1 0 0 0 0 + 15 16 1 0 0 0 0 + 15 43 1 0 0 0 0 + 15 44 1 0 0 0 0 + 16 17 1 0 0 0 0 + 16 45 1 0 0 0 0 + 16 46 1 0 0 0 0 + 17 18 1 0 0 0 0 + 17 47 1 0 0 0 0 + 17 48 1 0 0 0 0 + 18 19 1 0 0 0 0 + 18 49 1 0 0 0 0 + 18 50 1 0 0 0 0 + 19 20 1 0 0 0 0 + 19 51 1 1 0 0 0 + 20 21 2 0 0 0 0 + 20 30 1 0 0 0 0 + 21 22 1 0 0 0 0 + 22 23 1 0 0 0 0 + 22 29 2 0 0 0 0 + 23 24 1 0 0 0 0 + 23 28 2 0 0 0 0 + 24 25 2 0 0 0 0 + 24 52 1 0 0 0 0 + 25 26 1 0 0 0 0 + 25 53 1 0 0 0 0 + 26 27 2 0 0 0 0 + 26 54 1 0 0 0 0 + 27 28 1 0 0 0 0 + 28 55 1 0 0 0 0 + 29 30 1 0 0 0 0 + 31 32 2 0 0 0 0 +M END +$$$$ diff --git a/tests/structure/data/molecules/zinc_33_conformers.xyz b/tests/structure/data/molecules/zinc_33_conformers.xyz new file mode 100644 index 000000000..351001669 --- /dev/null +++ b/tests/structure/data/molecules/zinc_33_conformers.xyz @@ -0,0 +1,1710 @@ +55 + +C 8.84360 -3.94350 1.14560 +C 8.38230 -3.00850 2.26590 +O 8.17570 -3.74260 3.45890 +C 6.93610 -4.31860 3.54820 +C 6.80770 -5.26650 4.56940 +C 5.60030 -5.92870 4.75790 +C 4.52220 -5.63060 3.93120 +C 4.64460 -4.66860 2.91950 +C 5.85330 -3.99740 2.70530 +N 6.00770 -2.96860 1.72290 +C 4.94060 -2.56730 0.80650 +C 4.40700 -3.69410 -0.10780 +O 3.51190 -3.41970 -0.91720 +N 4.88650 -4.99790 -0.00200 +C 4.29080 -6.01720 -0.88130 +C 4.01840 -7.32700 -0.14900 +C 5.22680 -7.81700 0.64160 +C 5.80810 -6.70000 1.50940 +C 6.11960 -5.42130 0.71110 +C 7.24840 -5.60160 -0.27360 +N 7.94980 -6.67460 -0.54060 +C 8.93570 -6.20800 -1.37590 +C 10.03550 -7.05440 -1.78940 +C 10.11670 -8.37790 -1.34190 +C 11.21400 -9.16480 -1.68100 +C 12.20270 -8.60130 -2.46850 +N 12.15750 -7.33490 -2.93710 +C 11.07570 -6.59100 -2.58730 +N 8.80720 -4.90200 -1.67940 +O 7.67950 -4.50160 -0.96280 +C 7.18440 -2.22940 1.73320 +O 7.30890 -1.12210 1.21170 +H 9.75020 -4.48480 1.42550 +H 9.03340 -3.37740 0.22810 +H 8.08180 -4.69890 0.91550 +H 9.17920 -2.28590 2.47630 +H 7.65500 -5.48890 5.21330 +H 5.49990 -6.66890 5.54750 +H 3.57120 -6.13940 4.07690 +H 3.75580 -4.45700 2.33420 +H 5.26390 -1.73950 0.16730 +H 4.10700 -2.16470 1.39340 +H 4.98070 -6.18950 -1.71610 +H 3.35580 -5.66440 -1.32800 +H 3.71240 -8.09560 -0.86830 +H 3.17690 -7.18120 0.53870 +H 5.99030 -8.20150 -0.04420 +H 4.92580 -8.65610 1.28000 +H 6.69740 -7.06290 2.03670 +H 5.06350 -6.46090 2.27750 +H 6.41690 -4.64570 1.41770 +H 9.33290 -8.79610 -0.71430 +H 11.29490 -10.18700 -1.32900 +H 13.08640 -9.16930 -2.74490 +H 11.08880 -5.57540 -2.97600 +55 + +C 3.13810 -1.30100 4.32640 +C 3.34280 -2.81290 4.20600 +O 4.38710 -3.23290 5.06480 +C 5.63760 -3.10840 4.51960 +C 6.68710 -3.24880 5.43430 +C 8.00450 -3.13490 5.00620 +C 8.26680 -2.89310 3.66180 +C 7.21670 -2.76980 2.74200 +C 5.88310 -2.87070 3.15240 +N 4.78220 -2.80830 2.24050 +C 4.94060 -2.56730 0.80650 +C 4.40700 -3.69410 -0.10780 +O 3.51190 -3.41970 -0.91720 +N 4.88650 -4.99790 -0.00200 +C 4.29080 -6.01720 -0.88130 +C 4.01840 -7.32700 -0.14900 +C 5.22680 -7.81700 0.64160 +C 5.80810 -6.70000 1.50940 +C 6.11960 -5.42130 0.71110 +C 7.24840 -5.60160 -0.27360 +N 7.79310 -4.72330 -1.07760 +C 8.63820 -5.48280 -1.84970 +C 9.33110 -4.91680 -2.98830 +C 9.15170 -3.57110 -3.32830 +C 9.76060 -3.05020 -4.46670 +C 10.54140 -3.89650 -5.23440 +N 10.75620 -5.19630 -4.93500 +C 10.14690 -5.67640 -3.81950 +N 8.67480 -6.77960 -1.48740 +O 7.76650 -6.85760 -0.43170 +C 3.51780 -3.12360 2.72330 +O 2.57020 -3.45560 2.01230 +H 2.92900 -1.00750 5.35760 +H 2.31210 -0.97420 3.68660 +H 4.03430 -0.74960 4.01550 +H 2.43350 -3.32260 4.54520 +H 6.47170 -3.44260 6.48220 +H 8.82120 -3.23890 5.71600 +H 9.29580 -2.80980 3.31730 +H 7.49050 -2.61840 1.70300 +H 5.99140 -2.39600 0.55180 +H 4.42950 -1.63250 0.54920 +H 4.98070 -6.18950 -1.71610 +H 3.35580 -5.66440 -1.32800 +H 3.71240 -8.09560 -0.86830 +H 3.17690 -7.18120 0.53870 +H 5.99030 -8.20150 -0.04420 +H 4.92580 -8.65610 1.28000 +H 6.69740 -7.06290 2.03670 +H 5.06350 -6.46090 2.27750 +H 6.41690 -4.64570 1.41770 +H 8.52420 -2.92740 -2.71590 +H 9.61810 -2.01290 -4.74800 +H 11.02260 -3.54130 -6.14120 +H 10.33770 -6.72930 -3.62580 +55 + +C 6.02100 -4.94890 4.03190 +C 5.77420 -3.47530 4.36330 +O 4.55370 -3.33200 5.06660 +C 3.45330 -3.24340 4.25560 +C 2.22940 -3.38250 4.91940 +C 1.03850 -3.32030 4.20560 +C 1.07670 -3.10680 2.83170 +C 2.30130 -2.94980 2.16880 +C 3.51250 -3.01900 2.86560 +N 4.78220 -2.80830 2.24050 +C 4.94060 -2.56730 0.80650 +C 4.40700 -3.69410 -0.10780 +O 3.51190 -3.41970 -0.91720 +N 4.88650 -4.99790 -0.00200 +C 4.29080 -6.01720 -0.88130 +C 4.01840 -7.32700 -0.14900 +C 5.22680 -7.81700 0.64160 +C 5.80810 -6.70000 1.50940 +C 6.11960 -5.42130 0.71110 +C 7.24840 -5.60160 -0.27360 +N 8.53520 -5.43650 -0.09630 +C 9.04850 -5.56830 -1.36370 +C 10.44340 -5.29830 -1.64340 +C 11.14820 -4.35810 -0.88320 +C 12.46700 -4.04700 -1.20300 +C 13.04770 -4.69500 -2.27920 +N 12.41150 -5.62120 -3.02930 +C 11.12490 -5.90170 -2.69440 +N 8.11990 -5.88080 -2.28810 +O 6.92790 -5.91970 -1.56470 +C 5.90030 -2.69650 3.05820 +O 6.95920 -2.17430 2.71240 +H 6.02230 -5.56590 4.93340 +H 6.97770 -5.06990 3.51370 +H 5.23750 -5.34830 3.37570 +H 6.56640 -3.12480 5.03490 +H 2.21010 -3.54420 5.99440 +H 0.08670 -3.43290 4.71850 +H 0.14830 -3.04950 2.26660 +H 2.25970 -2.74960 1.10310 +H 5.99140 -2.39600 0.55180 +H 4.42950 -1.63250 0.54920 +H 4.98070 -6.18950 -1.71610 +H 3.35580 -5.66440 -1.32800 +H 3.71240 -8.09560 -0.86830 +H 3.17690 -7.18120 0.53870 +H 5.99030 -8.20150 -0.04420 +H 4.92580 -8.65610 1.28000 +H 6.69740 -7.06290 2.03670 +H 5.06350 -6.46090 2.27750 +H 6.41690 -4.64570 1.41770 +H 10.66740 -3.85300 -0.04840 +H 13.01890 -3.31050 -0.63010 +H 14.06810 -4.47350 -2.57860 +H 10.64970 -6.64250 -3.33320 +55 + +C 4.18980 0.61370 -1.75470 +C 5.26210 0.87030 -0.69330 +O 6.54570 0.88340 -1.29080 +C 7.10540 -0.35910 -1.43030 +C 8.23160 -0.39960 -2.25960 +C 8.88550 -1.60440 -2.48850 +C 8.41690 -2.76230 -1.87670 +C 7.29960 -2.71960 -1.03190 +C 6.61990 -1.51980 -0.79540 +N 5.51080 -1.41870 0.10290 +C 4.94060 -2.56730 0.80650 +C 4.40700 -3.69410 -0.10780 +O 3.51190 -3.41970 -0.91720 +N 4.88650 -4.99790 -0.00200 +C 4.29080 -6.01720 -0.88130 +C 4.01840 -7.32700 -0.14900 +C 5.22680 -7.81700 0.64160 +C 5.80810 -6.70000 1.50940 +C 6.11960 -5.42130 0.71110 +C 7.24840 -5.60160 -0.27360 +N 7.19850 -5.95250 -1.53410 +C 8.52030 -6.12140 -1.86790 +C 8.90940 -6.66820 -3.15110 +C 8.07670 -7.57620 -3.81500 +C 8.48810 -8.15640 -5.01180 +C 9.72790 -7.80390 -5.51560 +N 10.55630 -6.91950 -4.91820 +C 10.12840 -6.37200 -3.75070 +N 9.36900 -5.81200 -0.86870 +O 8.52850 -5.45110 0.18430 +C 5.04260 -0.14910 0.41950 +O 4.36450 0.10890 1.41300 +H 4.23390 1.35670 -2.55420 +H 3.19250 0.63160 -1.30370 +H 4.32080 -0.36800 -2.22690 +H 5.10570 1.86670 -0.26400 +H 8.59290 0.51200 -2.72940 +H 9.75780 -1.63890 -3.13630 +H 8.92770 -3.70850 -2.04500 +H 7.00800 -3.65080 -0.55730 +H 4.12590 -2.25630 1.46830 +H 5.70420 -2.98530 1.47250 +H 4.98070 -6.18950 -1.71610 +H 3.35580 -5.66440 -1.32800 +H 3.71240 -8.09560 -0.86830 +H 3.17690 -7.18120 0.53870 +H 5.99030 -8.20150 -0.04420 +H 4.92580 -8.65610 1.28000 +H 6.69740 -7.06290 2.03670 +H 5.06350 -6.46090 2.27750 +H 6.41690 -4.64570 1.41770 +H 7.11090 -7.84680 -3.39420 +H 7.85780 -8.87140 -5.52830 +H 10.10040 -8.24280 -6.43680 +H 10.83290 -5.67680 -3.30000 +55 + +C 6.63300 -2.02590 4.55950 +C 6.72770 -3.44740 4.00050 +O 8.05770 -3.72700 3.60320 +C 8.35900 -3.30250 2.33620 +C 9.72390 -3.31360 2.02860 +C 10.15960 -2.89700 0.77630 +C 9.22610 -2.48230 -0.16780 +C 7.85750 -2.48750 0.13330 +C 7.39740 -2.89310 1.39070 +N 6.00770 -2.96860 1.72290 +C 4.94060 -2.56730 0.80650 +C 4.40700 -3.69410 -0.10780 +O 3.51190 -3.41970 -0.91720 +N 4.88650 -4.99790 -0.00200 +C 4.29080 -6.01720 -0.88130 +C 4.01840 -7.32700 -0.14900 +C 5.22680 -7.81700 0.64160 +C 5.80810 -6.70000 1.50940 +C 6.11960 -5.42130 0.71110 +C 7.24840 -5.60160 -0.27360 +N 7.79310 -4.72330 -1.07760 +C 8.63820 -5.48280 -1.84970 +C 9.33110 -4.91680 -2.98830 +C 9.15170 -3.57110 -3.32830 +C 9.76060 -3.05020 -4.46670 +C 10.54140 -3.89650 -5.23440 +N 10.75620 -5.19630 -4.93500 +C 10.14690 -5.67640 -3.81950 +N 8.67480 -6.77960 -1.48740 +O 7.76650 -6.85760 -0.43170 +C 5.65670 -3.57610 2.92250 +O 4.53760 -4.02410 3.16810 +H 7.32230 -1.87850 5.39400 +H 5.61310 -1.81370 4.89580 +H 6.89190 -1.27860 3.79900 +H 6.48190 -4.15940 4.79690 +H 10.44530 -3.64420 2.77200 +H 11.21990 -2.90030 0.53690 +H 9.55850 -2.16140 -1.15330 +H 7.18000 -2.18730 -0.65940 +H 5.26390 -1.73950 0.16730 +H 4.10700 -2.16470 1.39340 +H 4.98070 -6.18950 -1.71610 +H 3.35580 -5.66440 -1.32800 +H 3.71240 -8.09560 -0.86830 +H 3.17690 -7.18120 0.53870 +H 5.99030 -8.20150 -0.04420 +H 4.92580 -8.65610 1.28000 +H 6.69740 -7.06290 2.03670 +H 5.06350 -6.46090 2.27750 +H 6.41690 -4.64570 1.41770 +H 8.52420 -2.92740 -2.71590 +H 9.61810 -2.01290 -4.74800 +H 11.02260 -3.54130 -6.14120 +H 10.33770 -6.72930 -3.62580 +55 + +C 2.45240 -3.14980 -5.19190 +C 3.35310 -2.02940 -4.66710 +O 4.68420 -2.22810 -5.10690 +C 5.41270 -3.06900 -4.30770 +C 6.62250 -3.49760 -4.86510 +C 7.44920 -4.36110 -4.15630 +C 7.06760 -4.78280 -2.88690 +C 5.86450 -4.34020 -2.32070 +C 5.01230 -3.47910 -3.02030 +N 3.80350 -2.95720 -2.46000 +C 3.31020 -3.32430 -1.13280 +C 4.40700 -3.69410 -0.10780 +O 4.88000 -2.79360 0.59730 +N 4.88650 -4.99790 -0.00200 +C 4.29080 -6.01720 -0.88130 +C 4.01840 -7.32700 -0.14900 +C 5.22680 -7.81700 0.64160 +C 5.80810 -6.70000 1.50940 +C 6.11960 -5.42130 0.71110 +C 7.24840 -5.60160 -0.27360 +N 7.94980 -6.67460 -0.54060 +C 8.93570 -6.20800 -1.37590 +C 10.03550 -7.05440 -1.78940 +C 11.28960 -6.49910 -2.06800 +C 12.32290 -7.30550 -2.53710 +C 12.07050 -8.65520 -2.70970 +N 10.88190 -9.23670 -2.43720 +C 9.89230 -8.42370 -1.98340 +N 8.80720 -4.90200 -1.67940 +O 7.67950 -4.50160 -0.96280 +C 3.14130 -1.95500 -3.15870 +O 2.32570 -1.18450 -2.65390 +H 2.49120 -3.21580 -6.28160 +H 1.41600 -2.98600 -4.87970 +H 2.76310 -4.12800 -4.80400 +H 3.02040 -1.07650 -5.09470 +H 6.91400 -3.15830 -5.85610 +H 8.38720 -4.69910 -4.58940 +H 7.71290 -5.45330 -2.32230 +H 5.64370 -4.67720 -1.31320 +H 2.60940 -4.16300 -1.19360 +H 2.72160 -2.49010 -0.73410 +H 4.98070 -6.18950 -1.71610 +H 3.35580 -5.66440 -1.32800 +H 3.71240 -8.09560 -0.86830 +H 3.17690 -7.18120 0.53870 +H 5.99030 -8.20150 -0.04420 +H 4.92580 -8.65610 1.28000 +H 6.69740 -7.06290 2.03670 +H 5.06350 -6.46090 2.27750 +H 6.41690 -4.64570 1.41770 +H 11.46160 -5.43320 -1.93550 +H 13.29470 -6.88460 -2.76940 +H 12.83940 -9.32170 -3.09000 +H 8.95100 -8.93290 -1.79020 +55 + +C 5.54420 -0.63630 -3.37470 +C 4.02660 -0.46740 -3.47700 +O 3.61650 0.68900 -2.77050 +C 3.41510 0.47900 -1.43200 +C 3.28510 1.64760 -0.67330 +C 3.08560 1.56840 0.69980 +C 3.00460 0.31950 1.30680 +C 3.11710 -0.85150 0.54520 +C 3.32840 -0.79540 -0.83660 +N 3.39240 -1.96290 -1.66140 +C 3.31020 -3.32430 -1.13280 +C 4.40700 -3.69410 -0.10780 +O 4.88000 -2.79360 0.59730 +N 4.88650 -4.99790 -0.00200 +C 4.29080 -6.01720 -0.88130 +C 4.01840 -7.32700 -0.14900 +C 5.22680 -7.81700 0.64160 +C 5.80810 -6.70000 1.50940 +C 6.11960 -5.42130 0.71110 +C 7.24840 -5.60160 -0.27360 +N 7.94980 -6.67460 -0.54060 +C 8.93570 -6.20800 -1.37590 +C 10.03550 -7.05440 -1.78940 +C 11.03670 -6.55340 -2.62920 +C 12.05130 -7.39080 -3.08460 +C 12.03700 -8.71380 -2.67880 +N 11.10120 -9.23580 -1.85590 +C 10.12270 -8.39470 -1.43010 +N 8.80720 -4.90200 -1.67940 +O 7.67950 -4.50160 -0.96280 +C 3.39950 -1.78700 -3.03980 +O 3.09730 -2.66290 -3.84920 +H 6.06980 0.24680 -3.74510 +H 5.87130 -1.51250 -3.94360 +H 5.86180 -0.78090 -2.33450 +H 3.75710 -0.30560 -4.52710 +H 3.34500 2.61900 -1.15800 +H 2.98910 2.47500 1.29180 +H 2.84120 0.24880 2.38050 +H 3.00820 -1.79260 1.07420 +H 3.34290 -4.06120 -1.94170 +H 2.32890 -3.46010 -0.66390 +H 4.98070 -6.18950 -1.71610 +H 3.35580 -5.66440 -1.32800 +H 3.71240 -8.09560 -0.86830 +H 3.17690 -7.18120 0.53870 +H 5.99030 -8.20150 -0.04420 +H 4.92580 -8.65610 1.28000 +H 6.69740 -7.06290 2.03670 +H 5.06350 -6.46090 2.27750 +H 6.41690 -4.64570 1.41770 +H 11.02130 -5.51250 -2.94430 +H 12.82480 -7.01780 -3.74650 +H 12.79700 -9.41020 -3.02150 +H 9.38540 -8.86150 -0.78110 +55 + +C -0.81730 -2.96550 -1.41080 +C -0.25400 -2.92880 0.01170 +O -0.32180 -1.61230 0.52860 +C 0.74300 -0.82410 0.18030 +C 0.56560 0.53970 0.43820 +C 1.57110 1.44540 0.12140 +C 2.75540 0.98110 -0.44120 +C 2.94100 -0.38670 -0.68350 +C 1.93850 -1.31480 -0.38200 +N 2.10560 -2.72480 -0.55940 +C 3.31020 -3.32430 -1.13280 +C 4.40700 -3.69410 -0.10780 +O 4.88000 -2.79360 0.59730 +N 4.88650 -4.99790 -0.00200 +C 4.29080 -6.01720 -0.88130 +C 4.01840 -7.32700 -0.14900 +C 5.22680 -7.81700 0.64160 +C 5.80810 -6.70000 1.50940 +C 6.11960 -5.42130 0.71110 +C 7.24840 -5.60160 -0.27360 +N 8.40490 -4.99000 -0.32740 +C 8.93880 -5.42710 -1.51530 +C 10.16440 -4.86430 -2.04270 +C 10.68220 -5.31480 -3.26240 +C 11.89890 -4.82500 -3.72920 +C 12.56400 -3.88750 -2.95840 +N 12.09360 -3.41170 -1.78470 +C 10.90530 -3.91030 -1.35410 +N 8.17280 -6.33970 -2.14340 +O 7.05900 -6.46940 -1.31380 +C 1.13020 -3.56690 -0.03900 +O 1.30470 -4.76110 0.19940 +H -1.84340 -2.59230 -1.44340 +H -0.79480 -3.98640 -1.80540 +H -0.22940 -2.33600 -2.09060 +H -0.88170 -3.55250 0.65850 +H -0.36200 0.89200 0.88260 +H 1.43350 2.50590 0.31650 +H 3.55060 1.68300 -0.68540 +H 3.90140 -0.68670 -1.08970 +H 3.75820 -2.66340 -1.88180 +H 3.02430 -4.22710 -1.68470 +H 4.98070 -6.18950 -1.71610 +H 3.35580 -5.66440 -1.32800 +H 3.71240 -8.09560 -0.86830 +H 3.17690 -7.18120 0.53870 +H 5.99030 -8.20150 -0.04420 +H 4.92580 -8.65610 1.28000 +H 6.69740 -7.06290 2.03670 +H 5.06350 -6.46090 2.27750 +H 6.41690 -4.64570 1.41770 +H 10.14720 -6.06070 -3.84590 +H 12.31700 -5.17630 -4.66580 +H 13.52470 -3.48880 -3.27160 +H 10.57310 -3.50840 -0.39970 +55 + +C -0.77350 -3.74180 -0.50730 +C -0.01440 -3.01520 0.60530 +O -0.30990 -1.63090 0.57300 +C 0.46650 -0.91830 -0.30210 +C 0.01320 0.38090 -0.55630 +C 0.70980 1.20280 -1.43420 +C 1.86460 0.72540 -2.04520 +C 2.32910 -0.56950 -1.77780 +C 1.63820 -1.41740 -0.90550 +N 2.10560 -2.72480 -0.55940 +C 3.31020 -3.32430 -1.13280 +C 4.40700 -3.69410 -0.10780 +O 4.88000 -2.79360 0.59730 +N 4.88650 -4.99790 -0.00200 +C 4.29080 -6.01720 -0.88130 +C 4.01840 -7.32700 -0.14900 +C 5.22680 -7.81700 0.64160 +C 5.80810 -6.70000 1.50940 +C 6.11960 -5.42130 0.71110 +C 7.24840 -5.60160 -0.27360 +N 7.79310 -4.72330 -1.07760 +C 8.63820 -5.48280 -1.84970 +C 9.33110 -4.91680 -2.98830 +C 9.15170 -3.57110 -3.32830 +C 9.76060 -3.05020 -4.46670 +C 10.54140 -3.89650 -5.23440 +N 10.75620 -5.19630 -4.93500 +C 10.14690 -5.67640 -3.81950 +N 8.67480 -6.77960 -1.48740 +O 7.76650 -6.85760 -0.43170 +C 1.45530 -3.39830 0.46760 +O 1.94510 -4.33420 1.09830 +H -1.85050 -3.57680 -0.42910 +H -0.57220 -4.81710 -0.46930 +H -0.46940 -3.38410 -1.49900 +H -0.36330 -3.38790 1.57530 +H -0.88790 0.74630 -0.06990 +H 0.35680 2.21070 -1.63680 +H 2.41990 1.36530 -2.72840 +H 3.25530 -0.86700 -2.25840 +H 3.75820 -2.66340 -1.88180 +H 3.02430 -4.22710 -1.68470 +H 4.98070 -6.18950 -1.71610 +H 3.35580 -5.66440 -1.32800 +H 3.71240 -8.09560 -0.86830 +H 3.17690 -7.18120 0.53870 +H 5.99030 -8.20150 -0.04420 +H 4.92580 -8.65610 1.28000 +H 6.69740 -7.06290 2.03670 +H 5.06350 -6.46090 2.27750 +H 6.41690 -4.64570 1.41770 +H 8.52420 -2.92740 -2.71590 +H 9.61810 -2.01290 -4.74800 +H 11.02260 -3.54130 -6.14120 +H 10.33770 -6.72930 -3.62580 +55 + +C 6.98990 1.04410 0.81000 +C 7.86100 -0.19960 0.61890 +O 8.30500 -0.28180 -0.72310 +C 7.41090 -0.88550 -1.56720 +C 7.69920 -0.72940 -2.92750 +C 6.86210 -1.28820 -3.88590 +C 5.74610 -2.01170 -3.47890 +C 5.46620 -2.18340 -2.11650 +C 6.28940 -1.62120 -1.13490 +N 6.07460 -1.81810 0.26600 +C 4.94060 -2.56730 0.80650 +C 4.40700 -3.69410 -0.10780 +O 3.51190 -3.41970 -0.91720 +N 4.88650 -4.99790 -0.00200 +C 4.29080 -6.01720 -0.88130 +C 4.01840 -7.32700 -0.14900 +C 5.22680 -7.81700 0.64160 +C 5.80810 -6.70000 1.50940 +C 6.11960 -5.42130 0.71110 +C 7.24840 -5.60160 -0.27360 +N 7.19850 -5.95250 -1.53410 +C 8.52030 -6.12140 -1.86790 +C 8.90940 -6.66820 -3.15110 +C 10.09060 -7.40830 -3.27600 +C 10.49900 -7.86810 -4.52500 +C 9.70430 -7.57620 -5.61980 +N 8.54850 -6.88080 -5.54340 +C 8.17760 -6.44320 -4.31180 +N 9.36900 -5.81200 -0.86870 +O 8.52850 -5.45110 0.18430 +C 7.06330 -1.38890 1.14320 +O 7.18660 -1.79640 2.29750 +H 7.52470 1.95330 0.52590 +H 6.66750 1.12930 1.85270 +H 6.08710 1.00000 0.18810 +H 8.75840 -0.10380 1.24100 +H 8.57680 -0.16610 -3.23530 +H 7.08160 -1.16410 -4.94330 +H 5.08950 -2.45860 -4.22310 +H 4.60140 -2.78910 -1.86630 +H 4.10540 -1.89930 1.04030 +H 5.23430 -3.00290 1.76850 +H 4.98070 -6.18950 -1.71610 +H 3.35580 -5.66440 -1.32800 +H 3.71240 -8.09560 -0.86830 +H 3.17690 -7.18120 0.53870 +H 5.99030 -8.20150 -0.04420 +H 4.92580 -8.65610 1.28000 +H 6.69740 -7.06290 2.03670 +H 5.06350 -6.46090 2.27750 +H 6.41690 -4.64570 1.41770 +H 10.70510 -7.61600 -2.40290 +H 11.41900 -8.43070 -4.63650 +H 9.98980 -7.89800 -6.61720 +H 7.24870 -5.87770 -4.30100 +55 + +C 2.58530 -3.43260 -5.22000 +C 3.69020 -4.37070 -4.72870 +O 3.24040 -5.71280 -4.76230 +C 2.54280 -6.09200 -3.64600 +C 1.85680 -7.30490 -3.77350 +C 1.10420 -7.79470 -2.71270 +C 1.05100 -7.07470 -1.52380 +C 1.75200 -5.86870 -1.38920 +C 2.50740 -5.35190 -2.44730 +N 3.28400 -4.15520 -2.33630 +C 3.31020 -3.32430 -1.13280 +C 4.40700 -3.69410 -0.10780 +O 4.88000 -2.79360 0.59730 +N 4.88650 -4.99790 -0.00200 +C 4.29080 -6.01720 -0.88130 +C 4.01840 -7.32700 -0.14900 +C 5.22680 -7.81700 0.64160 +C 5.80810 -6.70000 1.50940 +C 6.11960 -5.42130 0.71110 +C 7.24840 -5.60160 -0.27360 +N 7.94980 -6.67460 -0.54060 +C 8.93570 -6.20800 -1.37590 +C 10.03550 -7.05440 -1.78940 +C 11.03670 -6.55340 -2.62920 +C 12.05130 -7.39080 -3.08460 +C 12.03700 -8.71380 -2.67880 +N 11.10120 -9.23580 -1.85590 +C 10.12270 -8.39470 -1.43010 +N 8.80720 -4.90200 -1.67940 +O 7.67950 -4.50160 -0.96280 +C 4.15390 -3.84450 -3.37450 +O 5.11170 -3.07990 -3.26740 +H 2.25150 -3.70100 -6.22490 +H 2.93680 -2.39590 -5.22440 +H 1.70250 -3.47890 -4.57000 +H 4.54140 -4.30780 -5.41650 +H 1.90860 -7.86260 -4.70540 +H 0.56660 -8.73430 -2.81120 +H 0.46980 -7.45500 -0.68590 +H 1.69830 -5.37560 -0.42420 +H 2.34480 -3.35070 -0.61740 +H 3.44470 -2.27830 -1.43140 +H 4.98070 -6.18950 -1.71610 +H 3.35580 -5.66440 -1.32800 +H 3.71240 -8.09560 -0.86830 +H 3.17690 -7.18120 0.53870 +H 5.99030 -8.20150 -0.04420 +H 4.92580 -8.65610 1.28000 +H 6.69740 -7.06290 2.03670 +H 5.06350 -6.46090 2.27750 +H 6.41690 -4.64570 1.41770 +H 11.02130 -5.51250 -2.94430 +H 12.82480 -7.01780 -3.74650 +H 12.79700 -9.41020 -3.02150 +H 9.38540 -8.86150 -0.78110 +55 + +C 3.62150 -0.31010 -3.97180 +C 4.80120 -1.28370 -3.92260 +O 4.77320 -2.14040 -5.04960 +C 3.97200 -3.24000 -4.89060 +C 3.70940 -3.94350 -6.07130 +C 2.90150 -5.07410 -6.04390 +C 2.36940 -5.50340 -4.83260 +C 2.64620 -4.80970 -3.64690 +C 3.44830 -3.66350 -3.65260 +N 3.80350 -2.95720 -2.46000 +C 3.31020 -3.32430 -1.13280 +C 4.40700 -3.69410 -0.10780 +O 4.88000 -2.79360 0.59730 +N 4.88650 -4.99790 -0.00200 +C 4.29080 -6.01720 -0.88130 +C 4.01840 -7.32700 -0.14900 +C 5.22680 -7.81700 0.64160 +C 5.80810 -6.70000 1.50940 +C 6.11960 -5.42130 0.71110 +C 7.24840 -5.60160 -0.27360 +N 8.48410 -5.97600 -0.05600 +C 9.08920 -5.79360 -1.27580 +C 10.52030 -5.94450 -1.43690 +C 11.38510 -5.66840 -0.37170 +C 12.76350 -5.74240 -0.55270 +C 13.23940 -6.09850 -1.80250 +N 12.44210 -6.39020 -2.85340 +C 11.10180 -6.30690 -2.64680 +N 8.23970 -5.39090 -2.24050 +O 7.01510 -5.27880 -1.58220 +C 4.76630 -1.95960 -2.55600 +O 5.41390 -1.53090 -1.60190 +H 3.62230 0.27140 -4.89660 +H 3.65410 0.37460 -3.11830 +H 2.66220 -0.84110 -3.93230 +H 5.73530 -0.71350 -3.98520 +H 4.13410 -3.60250 -7.01230 +H 2.69230 -5.61930 -6.96070 +H 1.74170 -6.39200 -4.80150 +H 2.23040 -5.21800 -2.73160 +H 2.60940 -4.16300 -1.19360 +H 2.72160 -2.49010 -0.73410 +H 4.98070 -6.18950 -1.71610 +H 3.35580 -5.66440 -1.32800 +H 3.71240 -8.09560 -0.86830 +H 3.17690 -7.18120 0.53870 +H 5.99030 -8.20150 -0.04420 +H 4.92580 -8.65610 1.28000 +H 6.69740 -7.06290 2.03670 +H 5.06350 -6.46090 2.27750 +H 6.41690 -4.64570 1.41770 +H 10.98840 -5.37950 0.59900 +H 13.44370 -5.51760 0.26100 +H 14.30660 -6.15270 -1.99780 +H 10.50070 -6.53750 -3.52320 +55 + +C 3.96260 1.45260 0.45170 +C 2.77220 0.49090 0.46740 +O 2.08660 0.58460 1.70280 +C 2.61930 -0.19730 2.69340 +C 2.14140 0.08580 3.97760 +C 2.61130 -0.63300 5.07040 +C 3.54910 -1.64090 4.87200 +C 4.01530 -1.93700 3.58400 +C 3.56360 -1.21950 2.47110 +N 3.96850 -1.52420 1.13300 +C 4.94060 -2.56730 0.80650 +C 4.40700 -3.69410 -0.10780 +O 3.51190 -3.41970 -0.91720 +N 4.88650 -4.99790 -0.00200 +C 4.29080 -6.01720 -0.88130 +C 4.01840 -7.32700 -0.14900 +C 5.22680 -7.81700 0.64160 +C 5.80810 -6.70000 1.50940 +C 6.11960 -5.42130 0.71110 +C 7.24840 -5.60160 -0.27360 +N 7.94980 -6.67460 -0.54060 +C 8.93570 -6.20800 -1.37590 +C 10.03550 -7.05440 -1.78940 +C 10.49280 -8.07920 -0.95310 +C 11.59780 -8.84170 -1.32150 +C 12.21400 -8.55770 -2.52760 +N 11.79670 -7.59050 -3.37360 +C 10.71760 -6.86160 -2.98560 +N 8.80720 -4.90200 -1.67940 +O 7.67950 -4.50160 -0.96280 +C 3.30580 -0.88710 0.09080 +O 3.28980 -1.29570 -1.06950 +H 3.64690 2.48150 0.63890 +H 4.47950 1.40640 -0.51210 +H 4.69280 1.19860 1.23020 +H 2.06090 0.79340 -0.30980 +H 1.40470 0.87250 4.12160 +H 2.24490 -0.41150 6.06950 +H 3.91670 -2.21340 5.72150 +H 4.71810 -2.75880 3.49390 +H 5.33800 -3.03070 1.71520 +H 5.80660 -2.10100 0.32290 +H 4.98070 -6.18950 -1.71610 +H 3.35580 -5.66440 -1.32800 +H 3.71240 -8.09560 -0.86830 +H 3.17690 -7.18120 0.53870 +H 5.99030 -8.20150 -0.04420 +H 4.92580 -8.65610 1.28000 +H 6.69740 -7.06290 2.03670 +H 5.06350 -6.46090 2.27750 +H 6.41690 -4.64570 1.41770 +H 9.99940 -8.27700 -0.00420 +H 11.96980 -9.62930 -0.67580 +H 13.09000 -9.11310 -2.85030 +H 10.42620 -6.08700 -3.69110 +55 + +C 3.65860 0.91310 2.67340 +C 2.54550 -0.04990 2.25420 +O 1.99850 -0.68780 3.39380 +C 2.69110 -1.80030 3.79270 +C 2.34260 -2.27850 5.06070 +C 2.98020 -3.39750 5.58300 +C 3.95580 -4.04110 4.82900 +C 4.29310 -3.57340 3.55170 +C 3.67150 -2.44300 3.01050 +N 3.94290 -1.96390 1.68980 +C 4.94060 -2.56730 0.80650 +C 4.40700 -3.69410 -0.10780 +O 3.51190 -3.41970 -0.91720 +N 4.88650 -4.99790 -0.00200 +C 4.29080 -6.01720 -0.88130 +C 4.01840 -7.32700 -0.14900 +C 5.22680 -7.81700 0.64160 +C 5.80810 -6.70000 1.50940 +C 6.11960 -5.42130 0.71110 +C 7.24840 -5.60160 -0.27360 +N 8.53520 -5.43650 -0.09630 +C 9.04850 -5.56830 -1.36370 +C 10.44340 -5.29830 -1.64340 +C 11.30510 -4.89350 -0.61760 +C 12.62670 -4.56280 -0.90420 +C 13.05180 -4.65290 -2.21810 +N 12.26040 -5.05520 -3.23650 +C 10.97530 -5.36870 -2.92610 +N 8.11990 -5.88080 -2.28810 +O 6.92790 -5.91970 -1.56470 +C 3.12550 -0.96280 1.17920 +O 3.00680 -0.71270 -0.01950 +H 3.29690 1.65290 3.39120 +H 4.06570 1.43150 1.79940 +H 4.48720 0.38100 3.15700 +H 1.73230 0.52480 1.79590 +H 1.57520 -1.77110 5.64010 +H 2.71430 -3.76780 6.56980 +H 4.45470 -4.92240 5.22780 +H 5.03550 -4.14240 3.00160 +H 5.78080 -2.96960 1.38160 +H 5.37580 -1.78060 0.17950 +H 4.98070 -6.18950 -1.71610 +H 3.35580 -5.66440 -1.32800 +H 3.71240 -8.09560 -0.86830 +H 3.17690 -7.18120 0.53870 +H 5.99030 -8.20150 -0.04420 +H 4.92580 -8.65610 1.28000 +H 6.69740 -7.06290 2.03670 +H 5.06350 -6.46090 2.27750 +H 6.41690 -4.64570 1.41770 +H 10.94570 -4.81920 0.40630 +H 13.30010 -4.23480 -0.12030 +H 14.06870 -4.38870 -2.49420 +H 10.37300 -5.67430 -3.77850 +55 + +C 2.70690 0.46820 -2.71240 +C 4.14810 -0.04280 -2.77600 +O 4.48580 -0.38350 -4.10820 +C 4.11270 -1.65150 -4.46800 +C 4.18050 -1.90960 -5.84160 +C 3.81950 -3.15780 -6.33480 +C 3.40360 -4.14710 -5.44990 +C 3.35220 -3.89500 -4.07230 +C 3.70110 -2.64290 -3.55490 +N 3.71820 -2.35840 -2.15270 +C 3.31020 -3.32430 -1.13280 +C 4.40700 -3.69410 -0.10780 +O 4.88000 -2.79360 0.59730 +N 4.88650 -4.99790 -0.00200 +C 4.29080 -6.01720 -0.88130 +C 4.01840 -7.32700 -0.14900 +C 5.22680 -7.81700 0.64160 +C 5.80810 -6.70000 1.50940 +C 6.11960 -5.42130 0.71110 +C 7.24840 -5.60160 -0.27360 +N 7.60840 -6.67470 -0.93200 +C 8.78540 -6.29760 -1.53180 +C 9.60940 -7.25380 -2.24140 +C 9.61860 -8.60030 -1.85990 +C 10.46790 -9.50160 -2.49590 +C 11.28540 -9.02630 -3.50630 +N 11.29710 -7.73980 -3.91880 +C 10.45930 -6.88370 -3.27770 +N 9.10800 -5.00790 -1.31520 +O 8.08170 -4.53970 -0.49480 +C 4.27450 -1.15400 -1.73910 +O 4.67580 -0.93480 -0.59700 +H 2.55660 1.32190 -3.37720 +H 2.44920 0.76110 -1.68960 +H 1.99370 -0.30530 -3.02370 +H 4.82530 0.76590 -2.47770 +H 4.51160 -1.13110 -6.52460 +H 3.86690 -3.35900 -7.40200 +H 3.12610 -5.12950 -5.82730 +H 3.05450 -4.72030 -3.43370 +H 2.95210 -4.25120 -1.59210 +H 2.44510 -2.92120 -0.59380 +H 4.98070 -6.18950 -1.71610 +H 3.35580 -5.66440 -1.32800 +H 3.71240 -8.09560 -0.86830 +H 3.17690 -7.18120 0.53870 +H 5.99030 -8.20150 -0.04420 +H 4.92580 -8.65610 1.28000 +H 6.69740 -7.06290 2.03670 +H 5.06350 -6.46090 2.27750 +H 6.41690 -4.64570 1.41770 +H 8.97530 -8.94900 -1.05520 +H 10.49400 -10.54430 -2.20000 +H 11.97780 -9.68700 -4.02020 +H 10.51250 -5.85760 -3.63420 +55 + +C 3.70790 -0.26360 -2.42080 +C 3.63980 0.43210 -1.05930 +O 4.67080 1.39670 -0.95310 +C 5.86940 0.88350 -0.53310 +C 6.95830 1.74850 -0.68780 +C 8.23140 1.34150 -0.30670 +C 8.40790 0.07440 0.23930 +C 7.31510 -0.78600 0.41090 +C 6.02670 -0.40090 0.02500 +N 4.87430 -1.22320 0.23340 +C 4.94060 -2.56730 0.80650 +C 4.40700 -3.69410 -0.10780 +O 3.51190 -3.41970 -0.91720 +N 4.88650 -4.99790 -0.00200 +C 4.29080 -6.01720 -0.88130 +C 4.01840 -7.32700 -0.14900 +C 5.22680 -7.81700 0.64160 +C 5.80810 -6.70000 1.50940 +C 6.11960 -5.42130 0.71110 +C 7.24840 -5.60160 -0.27360 +N 8.48410 -5.97600 -0.05600 +C 9.08920 -5.79360 -1.27580 +C 10.52030 -5.94450 -1.43690 +C 11.20620 -5.19800 -2.40180 +C 12.56870 -5.40040 -2.60420 +C 13.21060 -6.34730 -1.82540 +N 12.59270 -7.07760 -0.87140 +C 11.26280 -6.85950 -0.69880 +N 8.23970 -5.39090 -2.24050 +O 7.01510 -5.27880 -1.58220 +C 3.62380 -0.66300 0.00190 +O 2.57290 -1.10490 0.46440 +H 3.64650 0.45620 -3.24020 +H 2.89510 -0.99010 -2.52070 +H 4.65300 -0.80660 -2.54610 +H 2.69160 0.97710 -0.98580 +H 6.80910 2.73880 -1.11120 +H 9.07950 2.01010 -0.43050 +H 9.40040 -0.24920 0.54700 +H 7.51510 -1.74560 0.87620 +H 4.39540 -2.61620 1.75450 +H 5.98250 -2.78720 1.06600 +H 4.98070 -6.18950 -1.71610 +H 3.35580 -5.66440 -1.32800 +H 3.71240 -8.09560 -0.86830 +H 3.17690 -7.18120 0.53870 +H 5.99030 -8.20150 -0.04420 +H 4.92580 -8.65610 1.28000 +H 6.69740 -7.06290 2.03670 +H 5.06350 -6.46090 2.27750 +H 6.41690 -4.64570 1.41770 +H 10.67840 -4.46700 -3.01020 +H 13.10810 -4.83810 -3.35800 +H 14.26880 -6.55360 -1.95820 +H 10.80590 -7.47850 0.06980 +55 + +C 3.44880 0.72070 -0.20500 +C 4.24640 0.30840 -1.44440 +O 3.58740 0.75040 -2.61700 +C 2.61670 -0.10640 -3.06420 +C 1.77240 0.43110 -4.04210 +C 0.74120 -0.33620 -4.57070 +C 0.56640 -1.64290 -4.12730 +C 1.42240 -2.18790 -3.16070 +C 2.46040 -1.43050 -2.60760 +N 3.39240 -1.96290 -1.66140 +C 3.31020 -3.32430 -1.13280 +C 4.40700 -3.69410 -0.10780 +O 4.88000 -2.79360 0.59730 +N 4.88650 -4.99790 -0.00200 +C 4.29080 -6.01720 -0.88130 +C 4.01840 -7.32700 -0.14900 +C 5.22680 -7.81700 0.64160 +C 5.80810 -6.70000 1.50940 +C 6.11960 -5.42130 0.71110 +C 7.24840 -5.60160 -0.27360 +N 7.94980 -6.67460 -0.54060 +C 8.93570 -6.20800 -1.37590 +C 10.03550 -7.05440 -1.78940 +C 10.49280 -8.07920 -0.95310 +C 11.59780 -8.84170 -1.32150 +C 12.21400 -8.55770 -2.52760 +N 11.79670 -7.59050 -3.37360 +C 10.71760 -6.86160 -2.98560 +N 8.80720 -4.90200 -1.67940 +O 7.67950 -4.50160 -0.96280 +C 4.50070 -1.19120 -1.33380 +O 5.53280 -1.64070 -0.83760 +H 3.29130 1.80120 -0.17310 +H 3.96820 0.40750 0.70640 +H 2.45530 0.25520 -0.19510 +H 5.22030 0.81100 -1.42350 +H 1.92040 1.45200 -4.38550 +H 0.08120 0.08100 -5.32700 +H -0.23430 -2.25280 -4.54150 +H 1.25440 -3.22400 -2.88550 +H 3.34290 -4.06120 -1.94170 +H 2.32890 -3.46010 -0.66390 +H 4.98070 -6.18950 -1.71610 +H 3.35580 -5.66440 -1.32800 +H 3.71240 -8.09560 -0.86830 +H 3.17690 -7.18120 0.53870 +H 5.99030 -8.20150 -0.04420 +H 4.92580 -8.65610 1.28000 +H 6.69740 -7.06290 2.03670 +H 5.06350 -6.46090 2.27750 +H 6.41690 -4.64570 1.41770 +H 9.99940 -8.27700 -0.00420 +H 11.96980 -9.62930 -0.67580 +H 13.09000 -9.11310 -2.85030 +H 10.42620 -6.08700 -3.69110 +55 + +C 2.25700 0.65220 -0.56670 +C 3.61310 0.42630 -1.23910 +O 3.53570 0.75460 -2.61430 +C 3.07310 -0.26550 -3.40290 +C 2.72570 0.11680 -4.70330 +C 2.23450 -0.82560 -5.59900 +C 2.10430 -2.14970 -5.19340 +C 2.46850 -2.53680 -3.89670 +C 2.95550 -1.60320 -2.97560 +N 3.39240 -1.96290 -1.66140 +C 3.31020 -3.32430 -1.13280 +C 4.40700 -3.69410 -0.10780 +O 4.88000 -2.79360 0.59730 +N 4.88650 -4.99790 -0.00200 +C 4.29080 -6.01720 -0.88130 +C 4.01840 -7.32700 -0.14900 +C 5.22680 -7.81700 0.64160 +C 5.80810 -6.70000 1.50940 +C 6.11960 -5.42130 0.71110 +C 7.24840 -5.60160 -0.27360 +N 7.94980 -6.67460 -0.54060 +C 8.93570 -6.20800 -1.37590 +C 10.03550 -7.05440 -1.78940 +C 10.64320 -6.86600 -3.03600 +C 11.64970 -7.72890 -3.46090 +C 12.02520 -8.75940 -2.61690 +N 11.47880 -8.96830 -1.39910 +C 10.49740 -8.11150 -1.01330 +N 8.80720 -4.90200 -1.67940 +O 7.67950 -4.50160 -0.96280 +C 4.04600 -0.99740 -0.90520 +O 4.77140 -1.24770 0.05640 +H 1.91330 1.68080 -0.69740 +H 2.31790 0.42820 0.50310 +H 1.48400 0.00280 -0.99630 +H 4.34790 1.10770 -0.79480 +H 2.83580 1.15350 -5.01210 +H 1.95960 -0.52980 -6.60820 +H 1.72730 -2.89510 -5.89110 +H 2.37700 -3.59090 -3.65600 +H 3.34290 -4.06120 -1.94170 +H 2.32890 -3.46010 -0.66390 +H 4.98070 -6.18950 -1.71610 +H 3.35580 -5.66440 -1.32800 +H 3.71240 -8.09560 -0.86830 +H 3.17690 -7.18120 0.53870 +H 5.99030 -8.20150 -0.04420 +H 4.92580 -8.65610 1.28000 +H 6.69740 -7.06290 2.03670 +H 5.06350 -6.46090 2.27750 +H 6.41690 -4.64570 1.41770 +H 10.32380 -6.05570 -3.68740 +H 12.11860 -7.60140 -4.43010 +H 12.79330 -9.46890 -2.91120 +H 10.07880 -8.32610 -0.03280 +55 + +C 6.72290 -4.01460 4.26640 +C 5.76530 -2.83810 4.46930 +O 4.56650 -3.28490 5.07590 +C 3.64300 -3.77020 4.18810 +C 2.58130 -4.46650 4.77610 +C 1.58250 -5.01560 3.98080 +C 1.64380 -4.85530 2.60050 +C 2.69750 -4.14300 2.01200 +C 3.71880 -3.59060 2.79240 +N 4.78220 -2.80830 2.24050 +C 4.94060 -2.56730 0.80650 +C 4.40700 -3.69410 -0.10780 +O 3.51190 -3.41970 -0.91720 +N 4.88650 -4.99790 -0.00200 +C 4.29080 -6.01720 -0.88130 +C 4.01840 -7.32700 -0.14900 +C 5.22680 -7.81700 0.64160 +C 5.80810 -6.70000 1.50940 +C 6.11960 -5.42130 0.71110 +C 7.24840 -5.60160 -0.27360 +N 7.45840 -4.99030 -1.41230 +C 8.52210 -5.67540 -1.94750 +C 8.98290 -5.41720 -3.29580 +C 9.56940 -6.43920 -4.05090 +C 10.07870 -6.16860 -5.31800 +C 9.98040 -4.87430 -5.79800 +N 9.40730 -3.86140 -5.11180 +C 8.92180 -4.15570 -3.87740 +N 9.00670 -6.63320 -1.13380 +O 8.17410 -6.57510 -0.01620 +C 5.62370 -2.13940 3.12130 +O 6.32650 -1.17890 2.80980 +H 6.93580 -4.52310 5.20950 +H 7.66370 -3.67080 3.82460 +H 6.29620 -4.76610 3.59050 +H 6.22180 -2.12440 5.16490 +H 2.54000 -4.58210 5.85640 +H 0.75930 -5.56100 4.43520 +H 0.86170 -5.27600 1.97130 +H 2.66620 -4.02310 0.93400 +H 5.99140 -2.39600 0.55180 +H 4.42950 -1.63250 0.54920 +H 4.98070 -6.18950 -1.71610 +H 3.35580 -5.66440 -1.32800 +H 3.71240 -8.09560 -0.86830 +H 3.17690 -7.18120 0.53870 +H 5.99030 -8.20150 -0.04420 +H 4.92580 -8.65610 1.28000 +H 6.69740 -7.06290 2.03670 +H 5.06350 -6.46090 2.27750 +H 6.41690 -4.64570 1.41770 +H 9.64580 -7.44680 -3.64830 +H 10.54750 -6.94880 -5.90690 +H 10.37870 -4.61000 -6.77340 +H 8.48200 -3.30770 -3.35780 +55 + +C 5.22400 -1.32310 4.75800 +C 3.84950 -1.13440 4.11200 +O 2.93360 -2.08180 4.63000 +C 2.96960 -3.29390 3.99290 +C 2.28660 -4.31960 4.65580 +C 2.25650 -5.59960 4.11520 +C 2.89980 -5.84550 2.90680 +C 3.56920 -4.81480 2.23340 +C 3.62100 -3.52140 2.76410 +N 4.24340 -2.42660 2.08470 +C 4.94060 -2.56730 0.80650 +C 4.40700 -3.69410 -0.10780 +O 3.51190 -3.41970 -0.91720 +N 4.88650 -4.99790 -0.00200 +C 4.29080 -6.01720 -0.88130 +C 4.01840 -7.32700 -0.14900 +C 5.22680 -7.81700 0.64160 +C 5.80810 -6.70000 1.50940 +C 6.11960 -5.42130 0.71110 +C 7.24840 -5.60160 -0.27360 +N 7.19850 -5.95250 -1.53410 +C 8.52030 -6.12140 -1.86790 +C 8.90940 -6.66820 -3.15110 +C 10.09060 -7.40830 -3.27600 +C 10.49900 -7.86810 -4.52500 +C 9.70430 -7.57620 -5.61980 +N 8.54850 -6.88080 -5.54340 +C 8.17760 -6.44320 -4.31180 +N 9.36900 -5.81200 -0.86870 +O 8.52850 -5.45110 0.18430 +C 4.05950 -1.14980 2.60160 +O 4.21840 -0.11430 1.95670 +H 5.16720 -1.24740 5.84620 +H 5.92930 -0.57450 4.38320 +H 5.64090 -2.31220 4.53040 +H 3.46310 -0.14470 4.38160 +H 1.78270 -4.11600 5.59750 +H 1.73050 -6.39900 4.63100 +H 2.87480 -6.84340 2.47320 +H 4.01880 -5.06460 1.27790 +H 6.01100 -2.73720 0.96080 +H 4.87860 -1.61560 0.26630 +H 4.98070 -6.18950 -1.71610 +H 3.35580 -5.66440 -1.32800 +H 3.71240 -8.09560 -0.86830 +H 3.17690 -7.18120 0.53870 +H 5.99030 -8.20150 -0.04420 +H 4.92580 -8.65610 1.28000 +H 6.69740 -7.06290 2.03670 +H 5.06350 -6.46090 2.27750 +H 6.41690 -4.64570 1.41770 +H 10.70510 -7.61600 -2.40290 +H 11.41900 -8.43070 -4.63650 +H 9.98980 -7.89800 -6.61720 +H 7.24870 -5.87770 -4.30100 +55 + +C 0.02270 -0.99610 -2.13980 +C 0.25410 -1.18290 -0.63860 +O 0.74400 0.01690 -0.06820 +C 2.10190 0.16550 -0.17010 +C 2.57010 1.44980 0.12870 +C 3.92910 1.73110 0.05350 +C 4.81580 0.72250 -0.30870 +C 4.34960 -0.56860 -0.59100 +C 2.98510 -0.87150 -0.53160 +N 2.47040 -2.18760 -0.75590 +C 3.31020 -3.32430 -1.13280 +C 4.40700 -3.69410 -0.10780 +O 4.88000 -2.79360 0.59730 +N 4.88650 -4.99790 -0.00200 +C 4.29080 -6.01720 -0.88130 +C 4.01840 -7.32700 -0.14900 +C 5.22680 -7.81700 0.64160 +C 5.80810 -6.70000 1.50940 +C 6.11960 -5.42130 0.71110 +C 7.24840 -5.60160 -0.27360 +N 7.94980 -6.67460 -0.54060 +C 8.93570 -6.20800 -1.37590 +C 10.03550 -7.05440 -1.78940 +C 11.28960 -6.49910 -2.06800 +C 12.32290 -7.30550 -2.53710 +C 12.07050 -8.65520 -2.70970 +N 10.88190 -9.23670 -2.43720 +C 9.89230 -8.42370 -1.98340 +N 8.80720 -4.90200 -1.67940 +O 7.67950 -4.50160 -0.96280 +C 1.13010 -2.42010 -0.47180 +O 0.64940 -3.53520 -0.27430 +H -0.66240 -0.16870 -2.33800 +H -0.38400 -1.91140 -2.58150 +H 0.95880 -0.76480 -2.66340 +H -0.70700 -1.39100 -0.15420 +H 1.86930 2.23000 0.41550 +H 4.29450 2.72940 0.28060 +H 5.88230 0.93270 -0.36280 +H 5.09680 -1.31790 -0.83120 +H 3.79640 -3.14910 -2.09790 +H 2.66760 -4.19770 -1.29250 +H 4.98070 -6.18950 -1.71610 +H 3.35580 -5.66440 -1.32800 +H 3.71240 -8.09560 -0.86830 +H 3.17690 -7.18120 0.53870 +H 5.99030 -8.20150 -0.04420 +H 4.92580 -8.65610 1.28000 +H 6.69740 -7.06290 2.03670 +H 5.06350 -6.46090 2.27750 +H 6.41690 -4.64570 1.41770 +H 11.46160 -5.43320 -1.93550 +H 13.29470 -6.88460 -2.76940 +H 12.83940 -9.32170 -3.09000 +H 8.95100 -8.93290 -1.79020 +55 + +C 0.79620 -1.71590 1.75420 +C 1.63880 -0.69750 0.98280 +O 0.82260 0.02590 0.07990 +C 0.63650 -0.60090 -1.12380 +C -0.37750 -0.05030 -1.91530 +C -0.66990 -0.60230 -3.15680 +C 0.06200 -1.69610 -3.60680 +C 1.08950 -2.23740 -2.82240 +C 1.39410 -1.70410 -1.56540 +N 2.47040 -2.18760 -0.75590 +C 3.31020 -3.32430 -1.13280 +C 4.40700 -3.69410 -0.10780 +O 4.88000 -2.79360 0.59730 +N 4.88650 -4.99790 -0.00200 +C 4.29080 -6.01720 -0.88130 +C 4.01840 -7.32700 -0.14900 +C 5.22680 -7.81700 0.64160 +C 5.80810 -6.70000 1.50940 +C 6.11960 -5.42130 0.71110 +C 7.24840 -5.60160 -0.27360 +N 7.24730 -5.43690 -1.57260 +C 8.48140 -5.90610 -1.95190 +C 8.83580 -6.05060 -3.34850 +C 7.85030 -6.32400 -4.30380 +C 8.20470 -6.53630 -5.63320 +C 9.54470 -6.46280 -5.97110 +N 10.52710 -6.18460 -5.08630 +C 10.15050 -5.98480 -3.79620 +N 9.25460 -6.28010 -0.91420 +O 8.44520 -6.06360 0.20090 +C 2.81330 -1.45740 0.37570 +O 3.90030 -1.53800 0.94630 +H -0.02790 -1.23260 2.28380 +H 1.41610 -2.25830 2.47520 +H 0.34850 -2.45730 1.08060 +H 2.04820 0.03310 1.69000 +H -0.94070 0.80780 -1.55660 +H -1.46040 -0.17900 -3.77130 +H -0.15580 -2.12970 -4.58100 +H 1.64580 -3.06640 -3.24740 +H 3.79640 -3.14910 -2.09790 +H 2.66760 -4.19770 -1.29250 +H 4.98070 -6.18950 -1.71610 +H 3.35580 -5.66440 -1.32800 +H 3.71240 -8.09560 -0.86830 +H 3.17690 -7.18120 0.53870 +H 5.99030 -8.20150 -0.04420 +H 4.92580 -8.65610 1.28000 +H 6.69740 -7.06290 2.03670 +H 5.06350 -6.46090 2.27750 +H 6.41690 -4.64570 1.41770 +H 6.80420 -6.38810 -4.01290 +H 7.45180 -6.76230 -6.37990 +H 9.87260 -6.63820 -6.99180 +H 10.97530 -5.77710 -3.11850 +55 + +C 0.13980 -1.26150 0.58060 +C -0.25640 -2.38730 -0.37730 +O -0.77090 -3.48750 0.35040 +C 0.19190 -4.34250 0.81780 +C -0.26230 -5.26850 1.76330 +C 0.62070 -6.18580 2.32050 +C 1.95280 -6.18070 1.92010 +C 2.40480 -5.26510 0.96020 +C 1.53580 -4.32640 0.39380 +N 1.93960 -3.41150 -0.62950 +C 3.31020 -3.32430 -1.13280 +C 4.40700 -3.69410 -0.10780 +O 4.88000 -2.79360 0.59730 +N 4.88650 -4.99790 -0.00200 +C 4.29080 -6.01720 -0.88130 +C 4.01840 -7.32700 -0.14900 +C 5.22680 -7.81700 0.64160 +C 5.80810 -6.70000 1.50940 +C 6.11960 -5.42130 0.71110 +C 7.24840 -5.60160 -0.27360 +N 7.19850 -5.95250 -1.53410 +C 8.52030 -6.12140 -1.86790 +C 8.90940 -6.66820 -3.15110 +C 10.09060 -7.40830 -3.27600 +C 10.49900 -7.86810 -4.52500 +C 9.70430 -7.57620 -5.61980 +N 8.54850 -6.88080 -5.54340 +C 8.17760 -6.44320 -4.31180 +N 9.36900 -5.81200 -0.86870 +O 8.52850 -5.45110 0.18430 +C 0.95270 -2.66650 -1.26370 +O 1.09120 -2.13020 -2.36230 +H -0.70330 -0.95080 1.20170 +H 0.51110 -0.39630 0.02200 +H 0.93690 -1.57950 1.26420 +H -1.06650 -2.03360 -1.02550 +H -1.30660 -5.26750 2.06600 +H 0.27100 -6.90300 3.05870 +H 2.64910 -6.90050 2.34620 +H 3.44640 -5.33840 0.66530 +H 3.52610 -2.31930 -1.50930 +H 3.40640 -3.98140 -2.00480 +H 4.98070 -6.18950 -1.71610 +H 3.35580 -5.66440 -1.32800 +H 3.71240 -8.09560 -0.86830 +H 3.17690 -7.18120 0.53870 +H 5.99030 -8.20150 -0.04420 +H 4.92580 -8.65610 1.28000 +H 6.69740 -7.06290 2.03670 +H 5.06350 -6.46090 2.27750 +H 6.41690 -4.64570 1.41770 +H 10.70510 -7.61600 -2.40290 +H 11.41900 -8.43070 -4.63650 +H 9.98980 -7.89800 -6.61720 +H 7.24870 -5.87770 -4.30100 +55 + +C 5.81130 -2.58760 -4.36460 +C 4.43590 -1.92070 -4.43930 +O 4.55720 -0.52770 -4.21620 +C 4.55890 -0.17610 -2.89220 +C 4.95420 1.14250 -2.64150 +C 5.00580 1.61850 -1.33670 +C 4.64970 0.77640 -0.28850 +C 4.23670 -0.53900 -0.54000 +C 4.18710 -1.04210 -1.84450 +N 3.71820 -2.35840 -2.15270 +C 3.31020 -3.32430 -1.13280 +C 4.40700 -3.69410 -0.10780 +O 4.88000 -2.79360 0.59730 +N 4.88650 -4.99790 -0.00200 +C 4.29080 -6.01720 -0.88130 +C 4.01840 -7.32700 -0.14900 +C 5.22680 -7.81700 0.64160 +C 5.80810 -6.70000 1.50940 +C 6.11960 -5.42130 0.71110 +C 7.24840 -5.60160 -0.27360 +N 8.26960 -6.41940 -0.22070 +C 9.04660 -6.02400 -1.28240 +C 10.36820 -6.57620 -1.49560 +C 10.88540 -7.53350 -0.61540 +C 12.18430 -8.00630 -0.78080 +C 12.93130 -7.50740 -1.83360 +N 12.46720 -6.59670 -2.71710 +C 11.19720 -6.15240 -2.52830 +N 8.49010 -5.04190 -2.01730 +O 7.28990 -4.77150 -1.36000 +C 3.51770 -2.68210 -3.48920 +O 2.80420 -3.60660 -3.87620 +H 6.50940 -2.14360 -5.07790 +H 5.72810 -3.66050 -4.56540 +H 6.25880 -2.47200 -3.36950 +H 4.03670 -2.04240 -5.45280 +H 5.22600 1.79430 -3.46820 +H 5.31720 2.64100 -1.13930 +H 4.68030 1.14370 0.73560 +H 3.93760 -1.13140 0.31840 +H 2.95210 -4.25120 -1.59210 +H 2.44510 -2.92120 -0.59380 +H 4.98070 -6.18950 -1.71610 +H 3.35580 -5.66440 -1.32800 +H 3.71240 -8.09560 -0.86830 +H 3.17690 -7.18120 0.53870 +H 5.99030 -8.20150 -0.04420 +H 4.92580 -8.65610 1.28000 +H 6.69740 -7.06290 2.03670 +H 5.06350 -6.46090 2.27750 +H 6.41690 -4.64570 1.41770 +H 10.28360 -7.90290 0.21190 +H 12.60080 -8.73770 -0.09740 +H 13.95540 -7.83230 -1.99350 +H 10.87170 -5.41160 -3.25490 +55 + +C 1.44880 0.37800 -1.39880 +C 2.97810 0.41860 -1.35770 +O 3.49120 0.74910 -2.63540 +C 3.62940 -0.32620 -3.47270 +C 3.86380 0.00610 -4.81160 +C 4.01350 -0.99640 -5.76250 +C 3.94000 -2.32810 -5.36760 +C 3.72280 -2.66190 -4.02400 +C 3.55920 -1.66930 -3.05180 +N 3.39240 -1.96290 -1.66140 +C 3.31020 -3.32430 -1.13280 +C 4.40700 -3.69410 -0.10780 +O 4.88000 -2.79360 0.59730 +N 4.88650 -4.99790 -0.00200 +C 4.29080 -6.01720 -0.88130 +C 4.01840 -7.32700 -0.14900 +C 5.22680 -7.81700 0.64160 +C 5.80810 -6.70000 1.50940 +C 6.11960 -5.42130 0.71110 +C 7.24840 -5.60160 -0.27360 +N 8.53520 -5.43650 -0.09630 +C 9.04850 -5.56830 -1.36370 +C 10.44340 -5.29830 -1.64340 +C 11.14820 -4.35810 -0.88320 +C 12.46700 -4.04700 -1.20300 +C 13.04770 -4.69500 -2.27920 +N 12.41150 -5.62120 -3.02930 +C 11.12490 -5.90170 -2.69440 +N 8.11990 -5.88080 -2.28810 +O 6.92790 -5.91970 -1.56470 +C 3.44460 -0.90520 -0.76140 +O 3.67310 -1.03220 0.44080 +H 1.03360 1.32690 -1.74590 +H 1.04490 0.15180 -0.40680 +H 1.08730 -0.39660 -2.08670 +H 3.29410 1.21720 -0.67660 +H 3.92430 1.05000 -5.10930 +H 4.19090 -0.74050 -6.80390 +H 4.06340 -3.11910 -6.10490 +H 3.71300 -3.71840 -3.77680 +H 3.34290 -4.06120 -1.94170 +H 2.32890 -3.46010 -0.66390 +H 4.98070 -6.18950 -1.71610 +H 3.35580 -5.66440 -1.32800 +H 3.71240 -8.09560 -0.86830 +H 3.17690 -7.18120 0.53870 +H 5.99030 -8.20150 -0.04420 +H 4.92580 -8.65610 1.28000 +H 6.69740 -7.06290 2.03670 +H 5.06350 -6.46090 2.27750 +H 6.41690 -4.64570 1.41770 +H 10.66740 -3.85300 -0.04840 +H 13.01890 -3.31050 -0.63010 +H 14.06810 -4.47350 -2.57860 +H 10.64970 -6.64250 -3.33320 +55 + +C 1.46940 -1.94270 2.32330 +C 1.10370 -1.18770 1.04330 +O -0.21610 -1.51250 0.64630 +C -0.30390 -2.65390 -0.10600 +C -1.60450 -3.14300 -0.27050 +C -1.82570 -4.30090 -1.00680 +C -0.74530 -4.95820 -1.58590 +C 0.55570 -4.45930 -1.43640 +C 0.80260 -3.30130 -0.69120 +N 2.10560 -2.72480 -0.55940 +C 3.31020 -3.32430 -1.13280 +C 4.40700 -3.69410 -0.10780 +O 4.88000 -2.79360 0.59730 +N 4.88650 -4.99790 -0.00200 +C 4.29080 -6.01720 -0.88130 +C 4.01840 -7.32700 -0.14900 +C 5.22680 -7.81700 0.64160 +C 5.80810 -6.70000 1.50940 +C 6.11960 -5.42130 0.71110 +C 7.24840 -5.60160 -0.27360 +N 8.40490 -4.99000 -0.32740 +C 8.93880 -5.42710 -1.51530 +C 10.16440 -4.86430 -2.04270 +C 10.37720 -4.80250 -3.42460 +C 11.58710 -4.32990 -3.92550 +C 12.55380 -3.92480 -3.02180 +N 12.38540 -3.95050 -1.68160 +C 11.19540 -4.41900 -1.22300 +N 8.17280 -6.33970 -2.14340 +O 7.05900 -6.46940 -1.31380 +C 2.20590 -1.46920 0.02770 +O 3.16940 -0.71690 -0.11130 +H 0.76250 -1.72930 3.12830 +H 2.47830 -1.67320 2.65180 +H 1.45250 -3.02840 2.16630 +H 1.11280 -0.11140 1.25080 +H -2.44280 -2.61920 0.18220 +H -2.83480 -4.68530 -1.13180 +H -0.91080 -5.86150 -2.17010 +H 1.34880 -4.99860 -1.94380 +H 3.75820 -2.66340 -1.88180 +H 3.02430 -4.22710 -1.68470 +H 4.98070 -6.18950 -1.71610 +H 3.35580 -5.66440 -1.32800 +H 3.71240 -8.09560 -0.86830 +H 3.17690 -7.18120 0.53870 +H 5.99030 -8.20150 -0.04420 +H 4.92580 -8.65610 1.28000 +H 6.69740 -7.06290 2.03670 +H 5.06350 -6.46090 2.27750 +H 6.41690 -4.64570 1.41770 +H 9.60680 -5.13710 -4.11580 +H 11.76890 -4.29010 -4.99350 +H 13.52020 -3.56520 -3.36350 +H 11.11020 -4.43340 -0.13890 +55 + +C 3.44880 0.72070 -0.20500 +C 4.24640 0.30840 -1.44440 +O 3.58740 0.75040 -2.61700 +C 2.61670 -0.10640 -3.06420 +C 1.77240 0.43110 -4.04210 +C 0.74120 -0.33620 -4.57070 +C 0.56640 -1.64290 -4.12730 +C 1.42240 -2.18790 -3.16070 +C 2.46040 -1.43050 -2.60760 +N 3.39240 -1.96290 -1.66140 +C 3.31020 -3.32430 -1.13280 +C 4.40700 -3.69410 -0.10780 +O 4.88000 -2.79360 0.59730 +N 4.88650 -4.99790 -0.00200 +C 4.29080 -6.01720 -0.88130 +C 4.01840 -7.32700 -0.14900 +C 5.22680 -7.81700 0.64160 +C 5.80810 -6.70000 1.50940 +C 6.11960 -5.42130 0.71110 +C 7.24840 -5.60160 -0.27360 +N 8.53520 -5.43650 -0.09630 +C 9.04850 -5.56830 -1.36370 +C 10.44340 -5.29830 -1.64340 +C 11.14820 -4.35810 -0.88320 +C 12.46700 -4.04700 -1.20300 +C 13.04770 -4.69500 -2.27920 +N 12.41150 -5.62120 -3.02930 +C 11.12490 -5.90170 -2.69440 +N 8.11990 -5.88080 -2.28810 +O 6.92790 -5.91970 -1.56470 +C 4.50070 -1.19120 -1.33380 +O 5.53280 -1.64070 -0.83760 +H 3.29130 1.80120 -0.17310 +H 3.96820 0.40750 0.70640 +H 2.45530 0.25520 -0.19510 +H 5.22030 0.81100 -1.42350 +H 1.92040 1.45200 -4.38550 +H 0.08120 0.08100 -5.32700 +H -0.23430 -2.25280 -4.54150 +H 1.25440 -3.22400 -2.88550 +H 3.34290 -4.06120 -1.94170 +H 2.32890 -3.46010 -0.66390 +H 4.98070 -6.18950 -1.71610 +H 3.35580 -5.66440 -1.32800 +H 3.71240 -8.09560 -0.86830 +H 3.17690 -7.18120 0.53870 +H 5.99030 -8.20150 -0.04420 +H 4.92580 -8.65610 1.28000 +H 6.69740 -7.06290 2.03670 +H 5.06350 -6.46090 2.27750 +H 6.41690 -4.64570 1.41770 +H 10.66740 -3.85300 -0.04840 +H 13.01890 -3.31050 -0.63010 +H 14.06810 -4.47350 -2.57860 +H 10.64970 -6.64250 -3.33320 +55 + +C 2.69270 -7.13290 -2.66760 +C 2.26660 -5.98370 -3.58400 +O 3.17650 -5.85680 -4.66140 +C 4.27960 -5.09900 -4.36950 +C 5.31240 -5.18970 -5.30930 +C 6.48940 -4.47460 -5.12240 +C 6.62350 -3.66180 -4.00170 +C 5.58280 -3.55670 -3.06910 +C 4.39360 -4.27520 -3.23180 +N 3.28400 -4.15520 -2.33630 +C 3.31020 -3.32430 -1.13280 +C 4.40700 -3.69410 -0.10780 +O 4.88000 -2.79360 0.59730 +N 4.88650 -4.99790 -0.00200 +C 4.29080 -6.01720 -0.88130 +C 4.01840 -7.32700 -0.14900 +C 5.22680 -7.81700 0.64160 +C 5.80810 -6.70000 1.50940 +C 6.11960 -5.42130 0.71110 +C 7.24840 -5.60160 -0.27360 +N 7.19850 -5.95250 -1.53410 +C 8.52030 -6.12140 -1.86790 +C 8.90940 -6.66820 -3.15110 +C 7.93650 -7.03900 -4.08630 +C 8.31210 -7.63330 -5.28800 +C 9.66100 -7.83550 -5.52240 +N 10.63450 -7.47770 -4.65670 +C 10.23690 -6.90240 -3.49180 +N 9.36900 -5.81200 -0.86870 +O 8.52850 -5.45110 0.18430 +C 2.08400 -4.75290 -2.70220 +O 0.98830 -4.44440 -2.23540 +H 2.77090 -8.07370 -3.21720 +H 1.97680 -7.25520 -1.84850 +H 3.67670 -6.94450 -2.22030 +H 1.29130 -6.22270 -4.02350 +H 5.19580 -5.82410 -6.18450 +H 7.29480 -4.54730 -5.84880 +H 7.53920 -3.09280 -3.85180 +H 5.73710 -2.87750 -2.23700 +H 2.34480 -3.35070 -0.61740 +H 3.44470 -2.27830 -1.43140 +H 4.98070 -6.18950 -1.71610 +H 3.35580 -5.66440 -1.32800 +H 3.71240 -8.09560 -0.86830 +H 3.17690 -7.18120 0.53870 +H 5.99030 -8.20150 -0.04420 +H 4.92580 -8.65610 1.28000 +H 6.69740 -7.06290 2.03670 +H 5.06350 -6.46090 2.27750 +H 6.41690 -4.64570 1.41770 +H 6.88130 -6.88060 -3.87550 +H 7.56700 -7.93740 -6.01440 +H 10.00240 -8.31130 -6.43730 +H 11.05310 -6.64350 -2.82140 +55 + +C -0.55700 -4.21370 -2.35570 +C 0.50960 -5.22670 -2.77820 +O 0.38390 -6.41300 -2.01550 +C 1.03010 -6.36760 -0.80860 +C 0.69280 -7.40240 0.07070 +C 1.27440 -7.46300 1.33160 +C 2.20070 -6.49430 1.70310 +C 2.55240 -5.46750 0.81650 +C 1.97190 -5.38120 -0.45350 +N 2.34210 -4.38480 -1.41130 +C 3.31020 -3.32430 -1.13280 +C 4.40700 -3.69410 -0.10780 +O 4.88000 -2.79360 0.59730 +N 4.88650 -4.99790 -0.00200 +C 4.29080 -6.01720 -0.88130 +C 4.01840 -7.32700 -0.14900 +C 5.22680 -7.81700 0.64160 +C 5.80810 -6.70000 1.50940 +C 6.11960 -5.42130 0.71110 +C 7.24840 -5.60160 -0.27360 +N 8.40490 -4.99000 -0.32740 +C 8.93880 -5.42710 -1.51530 +C 10.16440 -4.86430 -2.04270 +C 10.37720 -4.80250 -3.42460 +C 11.58710 -4.32990 -3.92550 +C 12.55380 -3.92480 -3.02180 +N 12.38540 -3.95050 -1.68160 +C 11.19540 -4.41900 -1.22300 +N 8.17280 -6.33970 -2.14340 +O 7.05900 -6.46940 -1.31380 +C 1.85600 -4.51410 -2.70680 +O 2.35510 -3.96730 -3.68940 +H -1.56270 -4.62890 -2.45380 +H -0.48390 -3.30520 -2.96210 +H -0.43650 -3.92000 -1.30550 +H 0.33910 -5.50660 -3.82420 +H -0.02890 -8.15760 -0.23100 +H 1.01010 -8.26340 2.01800 +H 2.66610 -6.53870 2.68590 +H 3.30780 -4.76560 1.15430 +H 2.80810 -2.41900 -0.77700 +H 3.79070 -3.03190 -2.07360 +H 4.98070 -6.18950 -1.71610 +H 3.35580 -5.66440 -1.32800 +H 3.71240 -8.09560 -0.86830 +H 3.17690 -7.18120 0.53870 +H 5.99030 -8.20150 -0.04420 +H 4.92580 -8.65610 1.28000 +H 6.69740 -7.06290 2.03670 +H 5.06350 -6.46090 2.27750 +H 6.41690 -4.64570 1.41770 +H 9.60680 -5.13710 -4.11580 +H 11.76890 -4.29010 -4.99350 +H 13.52020 -3.56520 -3.36350 +H 11.11020 -4.43340 -0.13890 +55 + +C 6.64500 -2.95280 -3.57900 +C 5.35580 -3.36630 -4.29250 +O 4.85550 -2.28630 -5.05930 +C 4.07730 -1.41330 -4.34620 +C 3.80700 -0.20690 -5.00140 +C 3.03460 0.76650 -4.37890 +C 2.52520 0.52370 -3.10760 +C 2.78070 -0.69140 -2.45770 +C 3.56410 -1.68100 -3.06130 +N 3.80350 -2.95720 -2.46000 +C 3.31020 -3.32430 -1.13280 +C 4.40700 -3.69410 -0.10780 +O 4.88000 -2.79360 0.59730 +N 4.88650 -4.99790 -0.00200 +C 4.29080 -6.01720 -0.88130 +C 4.01840 -7.32700 -0.14900 +C 5.22680 -7.81700 0.64160 +C 5.80810 -6.70000 1.50940 +C 6.11960 -5.42130 0.71110 +C 7.24840 -5.60160 -0.27360 +N 7.19850 -5.95250 -1.53410 +C 8.52030 -6.12140 -1.86790 +C 8.90940 -6.66820 -3.15110 +C 10.26190 -6.84520 -3.46400 +C 10.63410 -7.30050 -4.72590 +C 9.63380 -7.57250 -5.64270 +N 8.31620 -7.43300 -5.37860 +C 7.98430 -6.98450 -4.13970 +N 9.36900 -5.81200 -0.86870 +O 8.52850 -5.45110 0.18430 +C 4.42010 -3.93520 -3.23110 +O 4.36750 -5.14020 -2.98920 +H 7.39900 -2.60310 -4.28790 +H 7.05290 -3.79270 -3.00760 +H 6.46670 -2.13040 -2.87480 +H 5.58380 -4.17330 -4.99850 +H 4.20580 -0.02870 -5.99710 +H 2.82740 1.70640 -4.88420 +H 1.91340 1.27780 -2.61620 +H 2.32370 -0.83190 -1.48370 +H 2.60940 -4.16300 -1.19360 +H 2.72160 -2.49010 -0.73410 +H 4.98070 -6.18950 -1.71610 +H 3.35580 -5.66440 -1.32800 +H 3.71240 -8.09560 -0.86830 +H 3.17690 -7.18120 0.53870 +H 5.99030 -8.20150 -0.04420 +H 4.92580 -8.65610 1.28000 +H 6.69740 -7.06290 2.03670 +H 5.06350 -6.46090 2.27750 +H 6.41690 -4.64570 1.41770 +H 11.03150 -6.61410 -2.73090 +H 11.67910 -7.42850 -4.98460 +H 9.87470 -7.91310 -6.64570 +H 6.91450 -6.87550 -3.97720 diff --git a/tests/structure/test_sdf.py b/tests/structure/test_sdf.py new file mode 100644 index 000000000..8aa15ec86 --- /dev/null +++ b/tests/structure/test_sdf.py @@ -0,0 +1,150 @@ +# This source code is part of the Biotite package and is distributed +# under the 3-Clause BSD License. Please see 'LICENSE.rst' for further +# information. + +import itertools +import datetime +from tempfile import TemporaryFile +import glob +from os.path import join, split, splitext +import pytest +import numpy as np +import biotite.structure.info as info +import biotite.structure.io.sdf as sdf +from ..util import data_dir + + +#def test_header_conversion(): +# """ +# Write known example data to the header of a SD file and expect +# to retrieve the same information when reading the file again. +# """ +# ref_header = ( +# "TestSD", "JD", "Biotite", +# datetime.datetime.now().replace(second=0, microsecond=0), +# "3D", "Lorem", "Ipsum", "123", "Lorem ipsum dolor sit amet" +# ) + +# sdf_file = sdf.SDFile() +# sdf_file.set_header(*ref_header) +# print(sdf_file) +# temp = TemporaryFile("w+") +# sdf_file.write(temp) + +# temp.seek(0) +# sdf_file = sdf.SDFile.read(temp) +# test_header = sdf_file.get_header() +# temp.close() + +# assert test_header == ref_header + + +@pytest.mark.parametrize( + "path, omit_charge", + itertools.product( + glob.glob( + join(data_dir("structure"), "molecules", "*.mol") + ) + + + glob.glob( + join(data_dir("structure"), "molecules", "*.sdf") + ), + [False, True] + ) +# itertools.product( +# glob.glob(join(data_dir("structure"), "molecules", "*.sdf")), +# [False, True] +# ) +) +def test_structure_conversion(path, omit_charge): + """ + After reading a SD file, writing the structure back to a new file + and reading it again should give the same structure. + + In this case an SDF file is used, but it is compatible with the + SD format. + """ + sdf_file = sdf.SDFile.read(path) + ref_atoms = sdf.get_structure(sdf_file) + #ref_annotations = sdf.get_metainformation(sdf_file) +# print(ref_atoms) +# print(ref_atoms.charge) + if omit_charge: + ref_atoms.del_annotation("charge") + + sdf_file = sdf.SDFile() + sdf.set_structure(sdf_file, ref_atoms) + #sdf.set_metainformation(sdf_file, ref_annotations) + temp = TemporaryFile("w+") + + + lines_to_be_written = sdf_file.lines + + + sdf_file.write(temp) + + temp.seek(0) + sdf_file = sdf.SDFile.read(temp) +# try: + test_atoms = sdf.get_structure(sdf_file) +# except: +# print("#######TEST#ON#"+str(path)+"###################") +# print("") +# print("") +# print("") +# print(sdf_file.lines) +# for l in sdf_file.lines: +# print(l) +# print("") +# print("") +# print("") +# print(lines_to_be_written) + + #test_annotation = sdf.get_metainformation(sdf_file) + if omit_charge: + assert np.all(test_atoms.charge == 0) + test_atoms.del_annotation("charge") + temp.close() + + cond = test_atoms == ref_atoms + assert cond + #assert test_annotation == ref_annotations + + +#@pytest.mark.parametrize( +# "path", glob.glob(join(data_dir("structure"), "SDecules", "*.SD")), +#) +#def test_pdbx_consistency(path): +# """ +# Check if the structure parsed from a SD file is equal to the same +# structure read from the *Chemical Component Dictionary* in PDBx +# format. + +# In this case an SDF file is used, but it is compatible with the +# SD format. +# """ +# sdf_name = split(splitext(path)[0])[1] +# ref_atoms = info.residue(sdf_name) +# # The CCD contains information about aromatic bond types, +# # but the SDF test files do not +# ref_atoms.bonds.remove_aromaticity() + +# sdf_file = sdf.SDFile.read(path) +# test_atoms = sdf_file.get_structure() + +# assert test_atoms.coord.shape == ref_atoms.coord.shape +# assert test_atoms.coord.flatten().tolist() \ +# == ref_atoms.coord.flatten().tolist() +# assert test_atoms.element.tolist() == ref_atoms.element.tolist() +# assert test_atoms.charge.tolist() == ref_atoms.charge.tolist() +# assert set(tuple(bond) for bond in test_atoms.bonds.as_array()) \ +# == set(tuple(bond) for bond in ref_atoms.bonds.as_array()) +# +# #header = sdf_file.get_header() +# +# try: +# header = sdf_file.get_header() +# except: +# assert False, "Could not get_header for SDFile [" +str(path) +# + From 6f3b551fd22155e9f329b6f49d8873d6451cf90c Mon Sep 17 00:00:00 2001 From: Benjamin Mayer Date: Thu, 1 Sep 2022 18:18:16 +0200 Subject: [PATCH 13/37] reading and writing of mol2 file now also works with atom_names that are actual atom_names and not elements. Specifically this works with amino acids where the atom_names are written to the atom_name column. See TYR.mol2 for example in test cases. --- src/biotite/structure/io/mol2/file.py | 290 +++++++++++++++++----- tests/structure/data/molecules/HArF.mol | 10 + tests/structure/data/molecules/HArF.mol2 | 13 + tests/structure/data/molecules/HArF.xyz | 5 + tests/structure/data/molecules/README.rst | 46 +++- 5 files changed, 286 insertions(+), 78 deletions(-) create mode 100644 tests/structure/data/molecules/HArF.mol create mode 100644 tests/structure/data/molecules/HArF.mol2 create mode 100644 tests/structure/data/molecules/HArF.xyz diff --git a/src/biotite/structure/io/mol2/file.py b/src/biotite/structure/io/mol2/file.py index 34b9ee881..890cfdb08 100644 --- a/src/biotite/structure/io/mol2/file.py +++ b/src/biotite/structure/io/mol2/file.py @@ -51,6 +51,20 @@ sybyl_status_bit_types = [ "system", "invalid_charges", "analyzed", "substituted", "altered", "ref_angle" ] + + +# field that contains all accepted two letter elements +# this is used for deriving if sperate atom_name and element +# columns should be generated. If only two letter atom_name entries in the +# mol2 file are found that are contained here, the atom_name entry will be +# assumed to only contain element names. +elements_twoLetters = [ + "LI", "NA", "MG", "AL", + "SI", "CA", "CR", "MN", + "FE", "CO", "CU", "CL", + "BR", "ZN", "SE", "MO", + "SN", "AR" +] def get_sybyl_atom_type(atom, bonds, atom_id): """ @@ -121,62 +135,94 @@ def get_sybyl_atom_type(atom, bonds, atom_id): return "F" if atom.element == "H": return "H" - if atom.element == "Li": + if atom.element == "LI": return "Li" - if atom.element == "Na": + if atom.element == "NA": return "Na" - if atom.element == "Mg": + if atom.element == "MG": return "Mg" - if atom.element == "Al": + if atom.element == "AL": return "Al" - if atom.element == "Si": + if atom.element == "SI": return "Si" if atom.element == "K": return "K" if atom.element == "CA": return "Ca" - if atom.element == "Cr": + if atom.element == "CR": return "Cr.th" - if atom.element == "Mn": + if atom.element == "MN": return "Mn" - if atom.element == "Fe": + if atom.element == "FE": return "Fe" - if atom.element == "Co": + if atom.element == "CO": return "Co.oh" - if atom.element == "Cu": + if atom.element == "CU": return "Cu" if atom.element == "CL": return "Cl" - if atom.element == "Br": + if atom.element == "BR": return "Br" if atom.element == "I": return "I" - if atom.element == "Zn": + if atom.element == "ZN": return "Zn" - if atom.element == "Se": + if atom.element == "SE": return "Se" - if atom.element == "Mo": + if atom.element == "MO": return "Mo" - if atom.element == "Sn": + if atom.element == "SN": return "Sn" + if atom.element == "AR": + return "Ar" else: msg = "sybyl_atom_type not implemented for element ["+str(atom.element) msg += "] " + str(atom) raise ValueError(msg) - - + +def get_error_msg(atom_name, sybyl_atom_type): + msg = "Not implemented for given atom_name :: " +str(atom_name)+". " + msg += "And given sybyl_atom_type :: " + msg += str(sybyl_atom_type) + "." + return msg + def atom_name_to_element(atom_name, sybyl_atom_type): + """ + This function gets a recorded atom name and sybyl_atom_type and returns + you the according element that this pair should have. + For example it is not possible to arrive from 'CA' if this should be + calcium or the c-alpha Atom of a protein backbone. However together + with the sybyl_atom_type it can be distinguished. + """ + + carbon_types = ["C.ar", "C.1", "C.2", "C.3"] + if len(atom_name) == 1: return atom_name else: - - if atom_name == "CA": + if atom_name in elements_twoLetters: + return atom_name + elif atom_name == "CA": if sybyl_atom_type == "Ca": return atom_name - elif sybyl_atom_type in ["C.ar", "C.1", "C.2", "C.3"]: - return "C" + elif sybyl_atom_type in carbon_types: + return "C" + else: + raise ValueError( + get_error_msg(atom_name, sybyl_atom_type) + ) + elif atom_name[:2] in ["CB","CG","CD","CE", "CZ"]: + return "C" + elif atom_name[0]=="H" and len(atom_name) > 1: + return sybyl_atom_type + elif atom_name[0]=="O": + return "O" + else: + raise ValueError( + get_error_msg(atom_name, sybyl_atom_type) + ) @@ -184,19 +230,19 @@ def atom_name_to_element(atom_name, sybyl_atom_type): -def filter_atom_name(atom_name, sybyl_name): - """ - Used to filter if any of the atom_names needs special handling or - if we are simply seeing element names and not specific - atom names - """ - - element = atom_name_to_element(atom_name, sybyl_name) - - cond = len(atom_name) > 2 - cond = cond or len(element) != len(atom_name) - - return cond +#def filter_atom_name(atom_name, sybyl_name): +# """ +# Used to filter if any of the atom_names needs special handling or +# if we are simply seeing element names and not specific +# atom names +# """ +# +# element = atom_name_to_element(atom_name, sybyl_name) +# +# cond = len(atom_name) > 2 +# cond = cond or len(element) != len(atom_name) +# +# return cond @@ -518,7 +564,8 @@ def set_header(self, mol_name, num_atoms, mol_type, charge_type, if self.status_bits != "": self.lines[6] = self.mol_comment - self.ind_atoms = [len(self.lines)] + self.ind_atoms = [len(self.lines)] + def get_structure(self): @@ -616,7 +663,7 @@ def get_structure(self): atom_i.atom_id = atom_id #if len(atom_name) atom_i.element = atom_name - #atom_names.append(atom_name) + atom_names.append(atom_name) atom_i.res_id = subst_id atom_i.res_name = subst_name @@ -625,42 +672,144 @@ def get_structure(self): index += 1 j += 1 - print(j) - print(atom_names) - print(atom_type_sybl_row) + print(atoms.element) + + filter_func = lambda e: len(e)==1 or e in elements_twoLetters + is_atom_names_only_element_names = np.all( + [filter_func(e) for e in atoms.element] + ) + print("is_atom_names_only_element_names :: " + str(is_atom_names_only_element_names)) + + # after first teration over structure we need a second pass + # to correctly infer atom_names and element if necessary from + # the atom_name and sybyl_atom_type columns +# print("###AT#SECOND#PASS#NOW######################################") +# +# +# print(atom_names) +# print(atom_type_sybl_row) + if not is_atom_names_only_element_names: + filtered = np.array( + [len(x) > 1 for x in atom_names] + # [ + # filter_atom_name( + # atom_names[k], atom_type_sybl_row[k] + # ) for k in range(len(atom_names)) + # ] + ) + is_atom_name_NOTEQUAL_element = np.any(filtered) + + index = self.ind_atoms[i]+1 + j = 0 + while "@" not in self.lines[index]: + # print("["+str(j)+ "]") + atom_j = atoms[j] + # print(" atom_j.element :: "+str(atom_j.element)) + # print(" atom_j.atom_name :: "+str(atom_j.atom_name)) + # print(" "+str(atom_names[j])) + # print(" "+str(atom_type_sybl_row[j])) + -# filtered = np.array( -# [ -# filter_atom_name( -# atom_names[k], atom_type_sybl_row[k] -# ) for k in range(len(atom_names)) -# ] -# ) -# + if is_atom_name_NOTEQUAL_element: + # print( + # "setting atoms[" + # +str(j)+"].atom_name=" + # +str(atom_names[j]) + # ) + atom_name = atom_names[j] + + element = atom_name_to_element( + atom_names[j], + atom_type_sybl_row[j] + ) + # print( + # "setting atoms[" + # +str(j)+"].element=" + # +element + # ) + + if self.charge_type != "NO_CHARGES": + atoms[j] = Atom( + [ + atoms[j].coord[0], + atoms[j].coord[1], + atoms[j].coord[2], + ], + charge=atoms[j].charge, + element=element, + atom_name=atom_name, + res_name=atoms[j].res_name, + res_id=atoms[j].res_id + ) + else: + atoms[j] = Atom( + [ + atoms[j].coord[0], + atoms[j].coord[1], + atoms[j].coord[2], + ], + element=element, + atom_name=atom_name, + res_name=atoms[j].res_name, + res_id=atoms[j].res_id + ) + + else: + assert len(atom_names[j]) <= 2 + atoms[j].element = atom_names[j] + + index += 1 + j += 1 + +# is_atom_name_column_unecessary = np.any( +# [len(x) >= 1 for x in atoms.atom_name] +# ) + +# print( +# "is_atom_name_column_unecessary :: " +# + str(is_atom_name_column_unecessary) +# ) +# # the added atom_name column seperate to the elements has +# # to be removed sometimes for example if one of the actual +# # two letter elements was contained # index = self.ind_atoms[i]+1 # j = 0 # while "@" not in self.lines[index]: -# print("["+str(j)+ "]") -# print(" "+str(atoms[j])) -# print(" "+str(atom_names[j])) -# print(" "+str(atom_type_sybl_row[j])) -# # -# if np.any(np.array(filtered)): -# -# atoms[j].atom_name = atom_names[j] -# atoms[j].element = atom_name_to_element( -# atom_names[j], -# atom_type_sybl_row[j] -# ) +# if self.charge_type != "NO_CHARGES": +# atoms[j] = Atom( +# [ +# atoms[j].coord[0], +# atoms[j].coord[1], +# atoms[j].coord[2], +# ], +# charge=atoms[j].charge, +# element=atoms[j].element, +# ) # else: -# atoms[j].element = atom_names[j] -# +# atoms[j] = Atom( +# [ +# atoms[j].coord[0], +# atoms[j].coord[1], +# atoms[j].coord[2], +# ], +# element=atoms[j].element, +# ) # index += 1 -# j += 1 - - +# j += 1 + +# print("###AFTER#SECOND#PASS#NOW###################################") +# print(atoms.element) +# print(atoms.atom_name) +# +# for atom in atoms: +# print(atom) +# +# print("") +# print("") +# print("") +# # # Iterate through all the bond lines by stating from line after @@ -689,7 +838,8 @@ def get_structure(self): bond_typ ) - index += 1 + index += 1 + atoms.bonds = bonds atom_array_stack.append(atoms) @@ -718,8 +868,14 @@ def append_atom_array(self, atoms, charges=None): atom_id = atom.atom_id line = "{:>7}".format(atom_id) - line += " " + atom.element - line += "{:>16.4f}".format(atom.coord[0]) + + if (atoms.atom_name is not None) and (len(atom.atom_name)!=0): + line += " {:<7}".format(atom.atom_name) + else: + print(" writing atom["+str(i)+"]:: " +str(atom.element)) + line += " {:<7}".format(atom.element) + #line += " " + atom.element + line += "{:>11.4f}".format(atom.coord[0]) line += "{:>10.4f}".format(atom.coord[1]) line += "{:>10.4f}".format(atom.coord[2]) line += " {:<8}".format( diff --git a/tests/structure/data/molecules/HArF.mol b/tests/structure/data/molecules/HArF.mol new file mode 100644 index 000000000..300a16dae --- /dev/null +++ b/tests/structure/data/molecules/HArF.mol @@ -0,0 +1,10 @@ + + OpenBabel09012218093D + + 3 2 0 0 0 0 0 0 0 0999 V2000 + 0.9791 0.0681 0.0317 F 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6767 0.0518 0.0504 Ar 0 0 0 0 0 0 0 0 0 0 0 0 + 4.0333 0.0387 0.0654 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 +M END diff --git a/tests/structure/data/molecules/HArF.mol2 b/tests/structure/data/molecules/HArF.mol2 new file mode 100644 index 000000000..9f865969b --- /dev/null +++ b/tests/structure/data/molecules/HArF.mol2 @@ -0,0 +1,13 @@ +@MOLECULE +***** + 3 2 0 0 0 +SMALL +GASTEIGER + +@ATOM + 1 F 0.8905 -0.0334 -0.0523 F 1 UNL1 0.0000 + 2 AR 2.5880 -0.0436 -0.0743 Ar 1 UNL1 0.0000 + 3 H 3.9446 -0.0517 -0.0920 H 1 UNL1 0.0000 +@BOND + 1 1 2 1 + 2 2 3 1 diff --git a/tests/structure/data/molecules/HArF.xyz b/tests/structure/data/molecules/HArF.xyz new file mode 100644 index 000000000..52ed8f7e1 --- /dev/null +++ b/tests/structure/data/molecules/HArF.xyz @@ -0,0 +1,5 @@ +3 + +F 0.81022 -0.00748 0.03260 +Ar 2.50819 -0.02190 0.02802 +H 3.86524 -0.03301 0.02449 diff --git a/tests/structure/data/molecules/README.rst b/tests/structure/data/molecules/README.rst index 6d12ecf81..443561b5f 100644 --- a/tests/structure/data/molecules/README.rst +++ b/tests/structure/data/molecules/README.rst @@ -1,16 +1,40 @@ Test structures =============== -CYN: Caynide - Contains negatively charged atom and triple bond -HWB: Cyanidin - Contains positively charged atom -TYR: Tyrosine - common amino acid +All test structures which where originally only downloaded in one format +have been translated to the other file formats using openbabel. +In the case of zinc_33 the open babel conformer generation has also been used +to generate a single SD File containing multiple models. +The two multimodel files here are 10000_docked and zinc_33_conformers. +For SD files and MOL files only the single model files that did have meta information +have been transformed to MOL files as well. Otherwise a single model MOL file +with no meta information is identical to an according SD File. -aspirin_*: - Aspirin with coordinates either in 2D or 3D. -10000_docked: - Output from docking the gbt15 molecule with id 10000 to the - DNA-PKcs kinase active site. -zinc_33: - A more complex example taken from zinc database: - https://zinc20.docking.org/substances/ZINC000000000033/ -nu7026: - A known inhibitor for DNA-PKcs. -CO2: - Carbon Dioxide -BENZ: - benzene as example fom + +CYN: Caynide - Contains negatively charged atom and triple bond +HWB: Cyanidin - Contains positively charged atom +TYR: Tyrosine - common amino acid + +aspirin_*: - Aspirin with coordinates either in 2D or 3D. +10000_docked: - Output from docking the gbt15 molecule with id 10000 to the + DNA-PKcs kinase active site. +10000_docked_1: - First model from the 10000_docked multi model file as a + single model file. +10000_docked_2: - Second model from the 10000_docked multi model file as a + single model file. +zinc_33: - A more complex example taken from zinc database: + https://zinc20.docking.org/substances/ZINC000000000033/ +zinc_33_conformers: - As described above a collection of conformers for the + ZINC000000000033 molecule. Has been generated with + obabel using the --conformer flag: + https://open-babel.readthedocs.io/en/latest/3DStructureGen/multipleconformers.html +nu7026: - A known inhibitor for DNA-PKcs. +nu7026_conformers - As before openbabel has been used to generated multiple + conformers of nu7026 to generate this multi model file. +CO2: - Carbon Dioxide +BENZ: - benzene as simple example for xyz, but translated to + other file formats +lorazepam: - A commonly known benzodiazepine medication, used to treat + e.g., anxiety or seizures. +HArF: - Inorganing compound ArHF From a8db20aa4f3c72cff8cf8d6a0ef7b07a74145758 Mon Sep 17 00:00:00 2001 From: Benjamin Mayer Date: Fri, 2 Sep 2022 16:33:26 +0200 Subject: [PATCH 14/37] Mol test now passing without skipped for amino acids. Before the logic for only doing that test when an amino acid in file name did create an empty list. --- tests/structure/test_mol.py | 82 ++++++++++++++++++++++++------------- 1 file changed, 54 insertions(+), 28 deletions(-) diff --git a/tests/structure/test_mol.py b/tests/structure/test_mol.py index fd1e94f22..2caa5ff9b 100644 --- a/tests/structure/test_mol.py +++ b/tests/structure/test_mol.py @@ -56,7 +56,7 @@ def test_structure_conversion(path, omit_charge): """ mol_file = mol.MOLFile.read(path) ref_atoms = mol.get_structure(mol_file) - print(ref_atoms.charge) +# print(ref_atoms.charge) if omit_charge: ref_atoms.del_annotation("charge") @@ -75,16 +75,28 @@ def test_structure_conversion(path, omit_charge): assert test_atoms == ref_atoms +def cond(x): + """ + This is used for filtering out only the amino acids from the + mol files since for all other molecules this test doesn't make sense. + """ + ignore_list=["CO2"] + mol_name = split(splitext(x)[0])[1] + + if mol_name in ignore_list: + return True + + cond = len(x.split()) < 1 + cond = cond or mol_name not in info.all_residues() + return cond + @pytest.mark.parametrize( "path", - [ - x for x in glob.glob( - join( - data_dir("structure"), "molecules", "*.mol" - ) - ) if x.split(".")[0].upper() in info.all_residues() - ], + itertools.filterfalse( + lambda x: cond(x), + glob.glob(join(data_dir("structure"), "molecules", "*.mol")), + ) ) def test_pdbx_consistency(path): """ @@ -95,29 +107,43 @@ def test_pdbx_consistency(path): In this case an SDF file is used, but it is compatible with the MOL format. """ +# print(path) mol_name = split(splitext(path)[0])[1] +# print(mol_name) - ref_atoms = info.residue(mol_name) - # The CCD contains information about aromatic bond types, - # but the SDF test files do not - ref_atoms.bonds.remove_aromaticity() + if mol_name in info.all_residues(): - mol_file = mol.MOLFile.read(path) - test_atoms = mol_file.get_structure() - - assert test_atoms.coord.shape == ref_atoms.coord.shape - assert test_atoms.coord.flatten().tolist() \ - == ref_atoms.coord.flatten().tolist() - assert test_atoms.element.tolist() == ref_atoms.element.tolist() - assert test_atoms.charge.tolist() == ref_atoms.charge.tolist() - assert set(tuple(bond) for bond in test_atoms.bonds.as_array()) \ - == set(tuple(bond) for bond in ref_atoms.bonds.as_array()) - #header = mol_file.get_header() - - try: - header = mol_file.get_header() - except: - assert False, "Could not get_header for SDFile [" +str(path) + ref_atoms = info.residue(mol_name) + # The CCD contains information about aromatic bond types, + # but the SDF test files do not + ref_atoms.bonds.remove_aromaticity() + + mol_file = mol.MOLFile.read(path) + test_atoms = mol_file.get_structure() + + assert test_atoms.coord.shape == ref_atoms.coord.shape + assert test_atoms.coord.flatten().tolist() \ + == ref_atoms.coord.flatten().tolist() + assert test_atoms.element.tolist() == ref_atoms.element.tolist() + assert test_atoms.charge.tolist() == ref_atoms.charge.tolist() + assert set(tuple(bond) for bond in test_atoms.bonds.as_array()) \ + == set(tuple(bond) for bond in ref_atoms.bonds.as_array()) + + header = mol_file.get_header() + try: + header = mol_file.get_header() + except RuntimeWarning as w: + if "could not be interpreted as datetime" in w.message: + assert True + else: + assert False, "Runtime Warning :: " + str(w.message) + except: + assert False, "Could not get_header for SDFile [" +str(path) + + + else: + pytest.skip("Skipped as not an amino acid based on name") + From e591fefb9335bd2b74419fe7aebb5094057e162a Mon Sep 17 00:00:00 2001 From: Benjamin Mayer Date: Fri, 2 Sep 2022 17:15:12 +0200 Subject: [PATCH 15/37] Small change in XYZFile and also added all docstrings for public functions. Internal functions and members have been made private. --- src/biotite/structure/io/mol/file.py | 5 +- src/biotite/structure/io/xyz/convert.py | 19 ++-- src/biotite/structure/io/xyz/file.py | 132 ++++++++++++++++-------- 3 files changed, 104 insertions(+), 52 deletions(-) diff --git a/src/biotite/structure/io/mol/file.py b/src/biotite/structure/io/mol/file.py index 2492bfe07..22f3c0a14 100644 --- a/src/biotite/structure/io/mol/file.py +++ b/src/biotite/structure/io/mol/file.py @@ -107,6 +107,9 @@ def get_header(self): initials = self.lines[1][0:2].strip() program = self.lines[1][2:10].strip() + + # sometimes the string can not be interpreted as datetime + # in those cases instead of failing simply warn the user time = None try: time = datetime.datetime.strptime( @@ -142,7 +145,7 @@ def set_header(self, mol_name, initials="", program="", time=None, program : str, optional The program name. Maximum length is 8. time : datetime or date, optional - The time of file creation. + The time of file creation, if none uses current time. dimensions : str, optional Dimensional codes. Maximum length is 2. scaling_factors : str, optional diff --git a/src/biotite/structure/io/xyz/convert.py b/src/biotite/structure/io/xyz/convert.py index dd90615cc..272b58c0c 100644 --- a/src/biotite/structure/io/xyz/convert.py +++ b/src/biotite/structure/io/xyz/convert.py @@ -13,7 +13,7 @@ def get_structure(xyz_file, model=None): Get an :class:`AtomArray` from the XYZ File. Ths function is a thin wrapper around - :meth:`XYZFile.get_structure()`. + :meth:`XYZFile.get_structure(xyz_file, model)`. Parameters ---------- @@ -22,11 +22,18 @@ def get_structure(xyz_file, model=None): Returns ------- - array : AtomArray - This :class:`AtomArray` contains the optional ``charge`` - annotation and has an associated :class:`BondList`. - All other annotation categories, except ``element`` are - empty. + array : AtomArray, AtomArrayStack + The return type depends on the `model` parameter. + In either case if only a single model is contained in the ``xyz_file``, + or the model parameter has been given, a class:`AtomArray` object + will be returned. This :class:`AtomArray` only contains the ``element`` + annotation category, all other annotations are empty, as only + element type and coordinates are contained for the atoms in an + *.xyz file. + Respectively if no model parameter has been specified and the + ``xyz_file`` contains multiple models a class:`AtomArrayStack` + object will be returned. Of course this class:`AtomArrayStack` + object also will only contain the ``element`` category. """ return xyz_file.get_structure(model) diff --git a/src/biotite/structure/io/xyz/file.py b/src/biotite/structure/io/xyz/file.py index 088df2e8b..f41fbf04e 100644 --- a/src/biotite/structure/io/xyz/file.py +++ b/src/biotite/structure/io/xyz/file.py @@ -18,7 +18,10 @@ class XYZFile(TextFile): """ - This class represents a file in XYZ format, + This class represents a file in XYZ format, which is a very simple + file format where only a molecule_name in form of a string and the + number of atoms is contained in the header. + Followed by as many lines containing atom element and 3D coordinates. References ---------- @@ -51,48 +54,54 @@ def __init__(self): super().__init__() # empty header lines self.lines = [""] * N_HEADER - self.mol_names = None - self.atom_numbers = None - self.model_start_inds = None - self.structures = None + self._mol_names = None + self._atom_numbers = None + self._model_start_inds = None + self._structures = None + self._model_start_inds = None - def update_start_lines(self): + def __update_start_lines(self): + """ + Internal function that is used to update the _model_start_inds + private member variable where the indices of where a new + model within the xyz file read starts is stored. + """ # Line indices where a new model starts -> where number of atoms # is written down as number - self.model_start_inds = np.array( + self._model_start_inds = np.array( [i for i in range(len(self.lines)) if self.lines[i].strip().isdigit()], dtype=int ) # # print(" ... pre processing ... ") -# print("|model_start_inds| :: " + str(self.model_start_inds)) +# print("|model_start_inds| :: " + str(self._model_start_inds)) - if self.model_start_inds.shape[0] > 1: + if self._model_start_inds.shape[0] > 1: # if the mol name line only contains an integer # these lines will appear in model_start_inds # if calculated as above, therfore we purge all # indices that have a distance of 1 to their previous index # (this will not work with a file containing multiple models # with solely one coordinate / atom per model ) - self.model_start_inds = self.model_start_inds[ + self._model_start_inds = self._model_start_inds[ np.concatenate( ( np.array([0],dtype=int), np.where( - self.model_start_inds[:-1] + self._model_start_inds[:-1] - - self.model_start_inds[1:] + self._model_start_inds[1:] != -1 )[0]+1 ) ) ] - elif self.model_start_inds.shape[0] == 2: - self.model_start_inds = self.model_start_inds[:1] + elif self._model_start_inds.shape[0] == 2: + self._model_start_inds = self._model_start_inds[:1] def get_header(self, model=None): @@ -109,29 +118,59 @@ def get_header(self, model=None): # Line indices where a new model starts -> where number of atoms # is written down as number - self.update_start_lines() + self.__update_start_lines() # parse all atom_numbers into integers - if self.atom_numbers is None: - self.atom_numbers = [ + if self._atom_numbers is None: + self._atom_numbers = [ int( self.lines[i].strip().strip(" ") - ) for i in self.model_start_inds + ) for i in self._model_start_inds ] # parse all lines containing names - if self.mol_names is None: - self.mol_names = [ - self.lines[i+1].strip() for i in self.model_start_inds + if self._mol_names is None: + self._mol_names = [ + self.lines[i+1].strip() for i in self._model_start_inds ] - return self.atom_numbers, self.mol_names + return self._atom_numbers, self._mol_names + def __get_number_of_atoms(self): + """ + This calculates the number of atoms from the previously read + file. + """ + lines_parsed = [x.split() for x in self.lines] + inds=np.array( + [ + i for i in range( + len(lines_parsed) + ) if len(lines_parsed[i]) != 4 + ] + ) + if inds.shape[0] == 2: + return int(len(self.lines[2:])) + else: + inds=inds[np.where(inds[1:]-inds[:-1]!=1)[0]] + line_lengths=np.unique(inds[1:]-inds[:-1]) + + if line_lengths.shape[0] > 1: + msg = "File contains different molecules." + msg += "Currently only multiple models of the same molecule" + msg += "are supported within one file" + raise BadStructureError(msg) + + return np.unique(inds[1:]-inds[:-1])[0] def set_header(self, mol_name): """ Set the header for the XYZ file. + As the header consist only out of the mol_name and the number + of atoms in the structure / structures this can only be + used after setting a structure. Since the second line + is calculated by counting the Parameters ---------- @@ -142,13 +181,13 @@ def set_header(self, mol_name): if(len(self.lines) > 2): - self.lines[1] = str(mol_name) - self.lines[0] = str(len(self.lines)-2) + self.lines[1] = str(mol_name) + self.lines[0] = str(self.__get_number_of_atoms()) - self.mol_names = [mol_name] - self.atom_numbers = [int(self.lines[0])] + self._mol_names = [mol_name] + self._atom_numbers = [int(self.lines[0])] - self.update_start_lines() + self.__update_start_lines() else: raise ValueError( @@ -195,39 +234,39 @@ def get_structure(self, model=None): if len(names) == 0 or len(atom_number) == 0: self.set_header("[MOLNAME]") - self.update_start_lines() + self.__update_start_lines() # parse all atom_numbers into integers - if self.atom_numbers is None: - self.atom_numbers = [ + if self._atom_numbers is None: + self._atom_numbers = [ int( self.lines[i].strip().strip(" ") - ) for i in self.model_start_inds + ) for i in self._model_start_inds ] # parse all lines containing names - if self.mol_names is None: - self.mol_names = [ - self.lines[i+1].strip() for i in self.model_start_inds + if self._mol_names is None: + self._mol_names = [ + self.lines[i+1].strip() for i in self._model_start_inds ] # parse all coordinates - if self.structures is None: + if self._structures is None: array_stack = [] - for i, ind in enumerate(self.model_start_inds): - ind_end = ind+2 + self.atom_numbers[i] + for i, ind in enumerate(self._model_start_inds): + ind_end = ind+2 + self._atom_numbers[i] lines_cut = self.lines[ind:ind_end] - array = AtomArray(self.atom_numbers[i]) + array = AtomArray(self._atom_numbers[i]) - if self.atom_numbers[i]+2 != len(lines_cut): + if self._atom_numbers[i]+2 != len(lines_cut): raise ValueError( "Number of Atoms not matching with coordinate lines" + "" - + " atom_number :: " + str(self.atom_numbers[i]) + + " atom_number :: " + str(self._atom_numbers[i]) + "" + "" + " |lines_cut| :: " + str(len(lines_cut)) @@ -258,7 +297,7 @@ def get_structure(self, model=None): array_stack.append(array) - self.structures = struc.stack(array_stack) + self._structures = struc.stack(array_stack) @@ -266,19 +305,22 @@ def get_structure(self, model=None): if model is None: - return self.structures + return self._structures else: - return self.structures[model] + return self._structures[model] def set_structure(self, atoms): """ - Set the :class:`AtomArray` for the file. + Set the :class:`AtomArray` :class:`AtomArrayStack` or for the file. + Based upon the given type of the atoms parameter either a single + model or multiple model XYZFile will be contained within the + lines member variable of this XYZFile instance. Parameters ---------- - atoms : AtomArray + atoms : AtomArray, AtomArrayStack The array to be saved into this file. """ From 88fd7e33255a06cf1396beba086feb481b00021c Mon Sep 17 00:00:00 2001 From: Benjamin Mayer Date: Fri, 2 Sep 2022 18:18:51 +0200 Subject: [PATCH 16/37] XYZFile and MOL2File ready. --- src/biotite/structure/io/mol2/__init__.py | 6 +- src/biotite/structure/io/mol2/convert.py | 23 +- src/biotite/structure/io/mol2/file.py | 695 ++++++++++------------ src/biotite/structure/io/xyz/__init__.py | 8 +- tests/structure/test_mol2.py | 129 ++-- 5 files changed, 398 insertions(+), 463 deletions(-) diff --git a/src/biotite/structure/io/mol2/__init__.py b/src/biotite/structure/io/mol2/__init__.py index 06949382b..a571bae75 100644 --- a/src/biotite/structure/io/mol2/__init__.py +++ b/src/biotite/structure/io/mol2/__init__.py @@ -5,10 +5,8 @@ """ The MOL format is used to depict atom positions and bonds for small molecules. -This subpackage is used for reading and writing an :class:`AtomArray` -in this format. -Additionally, reading data from the SDF format, which is a wrapper -around MOL, is also supported. +This subpackage is used for reading and writing an :class:`AtomArray` or +an :class:`AtomArrayStack` for a file containing multiple models in this format. """ __name__ = "biotite.structure.io.mol2" diff --git a/src/biotite/structure/io/mol2/convert.py b/src/biotite/structure/io/mol2/convert.py index 2d8a063c5..08da3cffa 100644 --- a/src/biotite/structure/io/mol2/convert.py +++ b/src/biotite/structure/io/mol2/convert.py @@ -58,10 +58,10 @@ def set_structure(mol2_file, atoms): def get_charges(mol2_file): """ - Get an :class:`AtomArray` from the XYZ File. + Get an ndarray containing the partial charges from the MOL2File Ths function is a thin wrapper around - :meth:`XYZFile.get_structure()`. + :meth:`MOL2File.get_charges()`. Parameters ---------- @@ -81,22 +81,19 @@ def get_charges(mol2_file): def set_charges(mol2_file, charges): """ - Get an :class:`AtomArray` from the XYZ File. + Set the partial charges in the MOL2File to an ndarray + specified as parameter here. Ths function is a thin wrapper around - :meth:`XYZFile.get_structure()`. + :meth:`MOL2File.set_charges(charges)`. Parameters ---------- - xyz_file : XYZFile - The XYZ File. + mol2_file: MOL2File + The MOL2File + charges: ndarray + A ndarray containing data with `float` type to be written as + partial charges. - Returns - ------- - array : AtomArray - This :class:`AtomArray` contains the optional ``charge`` - annotation and has an associated :class:`BondList`. - All other annotation categories, except ``element`` are - empty. """ return mol2_file.set_charges(charges) diff --git a/src/biotite/structure/io/mol2/file.py b/src/biotite/structure/io/mol2/file.py index 890cfdb08..210c9a448 100644 --- a/src/biotite/structure/io/mol2/file.py +++ b/src/biotite/structure/io/mol2/file.py @@ -4,7 +4,7 @@ __name__ = "biotite.structure.io.mol2" __author__ = "Benjamin E. Mayer" -__all__ = ["MOL2File","supported_charge_types", "supported_mol_types"] +__all__ = ["MOL2File"] import numpy as np import biotite.structure as struc @@ -16,239 +16,6 @@ -sybyl_to_biotite_bonds = { - - "1": struc.BondType.SINGLE, - "2": struc.BondType.DOUBLE, - "3": struc.BondType.TRIPLE, - "am": None, # amide not really supported in biotite yet - "ar": struc.BondType.AROMATIC_SINGLE, # questionable if this is okay since we have up to 3 formats for aromatic bonds - "du": None, # no idea what dummy is - "un": struc.BondType.ANY, - "nc": None, -} -biotite_bonds_to_sybyl = { - 1: "1", - 2: "2", - 3: "3", - 5: "ar", - 0: "un", -} - -supported_charge_types = [ - "NO_CHARGES", "DEL_RE", "GASTEIGER", - "GAST_HUCK", "HUCKEL", "PULLMAN", - "GAUSS80_CHARGES", "AMPAC_CHARGES", - "MULLIKEN_CHARGES", "DICT_CHARGES", - "MMFF94_CHARGES", "USER_CHARGES" -] - - -supported_mol_types = [ - "SMALL", "BIOPOLYMER", "PROTEIN", "NUCLEIC_ACID", "SACCHARIDE" -] - -sybyl_status_bit_types = [ - "system", "invalid_charges", "analyzed", "substituted", "altered", "ref_angle" -] - - -# field that contains all accepted two letter elements -# this is used for deriving if sperate atom_name and element -# columns should be generated. If only two letter atom_name entries in the -# mol2 file are found that are contained here, the atom_name entry will be -# assumed to only contain element names. -elements_twoLetters = [ - "LI", "NA", "MG", "AL", - "SI", "CA", "CR", "MN", - "FE", "CO", "CU", "CL", - "BR", "ZN", "SE", "MO", - "SN", "AR" -] - -def get_sybyl_atom_type(atom, bonds, atom_id): - """ - This function is meant to translate all occuring atoms into sybyl atom - types based on their element and bonds. This does however not work yet, - therefore which is why currently the sybyl column is simply filled with - a static content in order to not mess up rereading from a file written - from the MOL2File class. - - Parameters - ---------- - atom : Atom - The Atom object which is to be translated - into sybyl atom_type notation - - bonds: BondList - The BondList object of the respective bonds in the AtomArray. - Necessary as the sybyl atom types depend on the hybridiziation - heuristic. - - atom_id: int - The id of the current atom that is used in the bond list. - - Returns - ------- - sybyl_atom_type : str - The name of the atom based on hybridization and element according - to the sybyl atom types. - - """ - atom_bonds, types = bonds.get_bonds(atom_id) - - if atom.element == "C": - if 5 in types: - return "C.ar" - else: - if len(atom_bonds) == 3: - return "C.1" - elif len(atom_bonds) == 2: - return "C.2" - elif len(atom_bonds) == 1: - return "C.3" -# else: -# msg = "No supported sybyl Atom type for Atom " + str(atom) -# raise ValueError(msg) - return "C.3" - if atom.element == "N": - if 5 in types: - return "N.ar" - else: - if len(atom_bonds) == 3: - return "N.1" - elif len(atom_bonds) == 2: - return "N.2" - elif len(atom_bonds) == 1: - return "N.3" - if atom.element == "O": - if len(atom_bonds) == 2: - return "O.3" - elif len(atom_bonds) == 1: - return "O.2" - - if atom.element == "S": - return "S.3" - if atom.element == "P": - return "P.3" - if atom.element == "F": - return "F" - if atom.element == "H": - return "H" - if atom.element == "LI": - return "Li" - if atom.element == "NA": - return "Na" - if atom.element == "MG": - return "Mg" - if atom.element == "AL": - return "Al" - if atom.element == "SI": - return "Si" - if atom.element == "K": - return "K" - if atom.element == "CA": - return "Ca" - if atom.element == "CR": - return "Cr.th" - if atom.element == "MN": - return "Mn" - if atom.element == "FE": - return "Fe" - if atom.element == "CO": - return "Co.oh" - if atom.element == "CU": - return "Cu" - if atom.element == "CL": - return "Cl" - if atom.element == "BR": - return "Br" - if atom.element == "I": - return "I" - if atom.element == "ZN": - return "Zn" - if atom.element == "SE": - return "Se" - if atom.element == "MO": - return "Mo" - if atom.element == "SN": - return "Sn" - if atom.element == "AR": - return "Ar" - else: - msg = "sybyl_atom_type not implemented for element ["+str(atom.element) - msg += "] " + str(atom) - raise ValueError(msg) - - -def get_error_msg(atom_name, sybyl_atom_type): - msg = "Not implemented for given atom_name :: " +str(atom_name)+". " - msg += "And given sybyl_atom_type :: " - msg += str(sybyl_atom_type) + "." - return msg - -def atom_name_to_element(atom_name, sybyl_atom_type): - """ - This function gets a recorded atom name and sybyl_atom_type and returns - you the according element that this pair should have. - For example it is not possible to arrive from 'CA' if this should be - calcium or the c-alpha Atom of a protein backbone. However together - with the sybyl_atom_type it can be distinguished. - """ - - - carbon_types = ["C.ar", "C.1", "C.2", "C.3"] - - if len(atom_name) == 1: - return atom_name - else: - if atom_name in elements_twoLetters: - return atom_name - elif atom_name == "CA": - if sybyl_atom_type == "Ca": - return atom_name - elif sybyl_atom_type in carbon_types: - return "C" - else: - raise ValueError( - get_error_msg(atom_name, sybyl_atom_type) - ) - elif atom_name[:2] in ["CB","CG","CD","CE", "CZ"]: - return "C" - elif atom_name[0]=="H" and len(atom_name) > 1: - return sybyl_atom_type - elif atom_name[0]=="O": - return "O" - else: - raise ValueError( - get_error_msg(atom_name, sybyl_atom_type) - ) - - - - - - - -#def filter_atom_name(atom_name, sybyl_name): -# """ -# Used to filter if any of the atom_names needs special handling or -# if we are simply seeing element names and not specific -# atom names -# """ -# -# element = atom_name_to_element(atom_name, sybyl_name) -# -# cond = len(atom_name) > 2 -# cond = cond or len(element) != len(atom_name) -# -# return cond - - - - - - class MOL2File(TextFile): """ This class represents a file in MOL2 format. @@ -303,7 +70,221 @@ class MOL2File(TextFile): """ + + + sybyl_to_biotite_bonds = { + + "1": struc.BondType.SINGLE, + "2": struc.BondType.DOUBLE, + "3": struc.BondType.TRIPLE, + "am": None, # amide not really supported in biotite yet + "ar": struc.BondType.AROMATIC_SINGLE, # questionable if this is okay since we have up to 3 formats for aromatic bonds + "du": None, # no idea what dummy is + "un": struc.BondType.ANY, + "nc": None, + } + biotite_bonds_to_sybyl = { + 1: "1", + 2: "2", + 3: "3", + 5: "ar", + 0: "un", + } + + supported_charge_types = [ + "NO_CHARGES", "DEL_RE", "GASTEIGER", + "GAST_HUCK", "HUCKEL", "PULLMAN", + "GAUSS80_CHARGES", "AMPAC_CHARGES", + "MULLIKEN_CHARGES", "DICT_CHARGES", + "MMFF94_CHARGES", "USER_CHARGES" + ] + + + supported_mol_types = [ + "SMALL", "BIOPOLYMER", "PROTEIN", "NUCLEIC_ACID", "SACCHARIDE" + ] + + sybyl_status_bit_types = [ + "system", "invalid_charges", "analyzed", "substituted", "altered", "ref_angle" + ] + + + # field that contains all accepted two letter elements + # this is used for deriving if sperate atom_name and element + # columns should be generated. If only two letter atom_name entries in the + # mol2 file are found that are contained here, the atom_name entry will be + # assumed to only contain element names. + elements_twoLetters = [ + "LI", "NA", "MG", "AL", + "SI", "CA", "CR", "MN", + "FE", "CO", "CU", "CL", + "BR", "ZN", "SE", "MO", + "SN", "AR" + ] + @staticmethod + def get_sybyl_atom_type(atom, bonds, atom_id): + """ + This (horible horribel) function is meant to translate all occuring + atoms into sybyl atom types based on their element and bonds. This + mostly works now but some of the special cases are not implemented. + Also it is not clear if there is some further special handling for + the two letter element atoms or if their sybyl_atom_type is simply + the same string with the second letter to lower case. + + Parameters + ---------- + atom : Atom + The Atom object which is to be translated + into sybyl atom_type notation + + bonds: BondList + The BondList object of the respective bonds in the AtomArray. + Necessary as the sybyl atom types depend on the hybridiziation + heuristic. + + atom_id: int + The id of the current atom that is used in the bond list. + + Returns + ------- + sybyl_atom_type : str + The name of the atom based on hybridization and element according + to the sybyl atom types. + + """ + atom_bonds, types = bonds.get_bonds(atom_id) + + if atom.element == "C": + if 5 in types: + return "C.ar" + else: + if len(atom_bonds) == 3: + return "C.1" + elif len(atom_bonds) == 2: + return "C.2" + elif len(atom_bonds) == 1: + return "C.3" + # else: + # msg = "No supported sybyl Atom type for Atom " + str(atom) + # raise ValueError(msg) + return "C.3" + if atom.element == "N": + if 5 in types: + return "N.ar" + else: + if len(atom_bonds) == 3: + return "N.1" + elif len(atom_bonds) == 2: + return "N.2" + elif len(atom_bonds) == 1: + return "N.3" + if atom.element == "O": + if len(atom_bonds) == 2: + return "O.3" + elif len(atom_bonds) == 1: + return "O.2" + + if atom.element == "S": + return "S.3" + if atom.element == "P": + return "P.3" + if atom.element == "F": + return "F" + if atom.element == "H": + return "H" + if atom.element == "LI": + return "Li" + if atom.element == "NA": + return "Na" + if atom.element == "MG": + return "Mg" + if atom.element == "AL": + return "Al" + if atom.element == "SI": + return "Si" + if atom.element == "K": + return "K" + if atom.element == "CA": + return "Ca" + if atom.element == "CR": + return "Cr.th" + if atom.element == "MN": + return "Mn" + if atom.element == "FE": + return "Fe" + if atom.element == "CO": + return "Co.oh" + if atom.element == "CU": + return "Cu" + if atom.element == "CL": + return "Cl" + if atom.element == "BR": + return "Br" + if atom.element == "I": + return "I" + if atom.element == "ZN": + return "Zn" + if atom.element == "SE": + return "Se" + if atom.element == "MO": + return "Mo" + if atom.element == "SN": + return "Sn" + if atom.element == "AR": + return "Ar" + else: + msg = "sybyl_atom_type not implemented for element ["+str(atom.element) + msg += "] " + str(atom) + raise ValueError(msg) + + + @staticmethod + def atom_name_to_element(atom_name, sybyl_atom_type): + """ + This function gets a recorded atom name and sybyl_atom_type and returns + you the according element that this pair should have. + For example it is not possible to arrive from 'CA' if this should be + calcium or the c-alpha Atom of a protein backbone. However together + with the sybyl_atom_type it can be distinguished. + """ + + + # a local function for generating error messages + def get_error_msg(atom_name, sybyl_atom_type): + msg = "Not implemented for given atom_name :: " +str(atom_name)+". " + msg += "And given sybyl_atom_type :: " + msg += str(sybyl_atom_type) + "." + return msg + + carbon_types = ["C.ar", "C.1", "C.2", "C.3"] + + if len(atom_name) == 1: + return atom_name + else: + if atom_name in MOL2File.elements_twoLetters: + return atom_name + elif atom_name == "CA": + if sybyl_atom_type == "Ca": + return atom_name + elif sybyl_atom_type in carbon_types: + return "C" + else: + raise ValueError( + get_error_msg(atom_name, sybyl_atom_type) + ) + elif atom_name[:2] in ["CB","CG","CD","CE", "CZ"]: + return "C" + elif atom_name[0]=="H" and len(atom_name) > 1: + return sybyl_atom_type + elif atom_name[0]=="O": + return "O" + else: + raise ValueError( + get_error_msg(atom_name, sybyl_atom_type) + ) + + def __init__(self): super().__init__() self.mol_name = "" @@ -452,7 +433,8 @@ def set_header(self, mol_name, num_atoms, mol_type, charge_type, [status_bits [mol_comment]] - taken from https://chemicbook.com/2021/02/20/mol2-file-format-explained-for-beginners-part-2.html + taken from + https://chemicbook.com/2021/02/20/mol2-file-format-explained-for-beginners-part-2.html Parameters ---------- @@ -507,23 +489,23 @@ def set_header(self, mol_name, num_atoms, mol_type, charge_type, print(header) if mol_type != "": - cond = mol_type in supported_mol_types + cond = mol_type in MOL2File.supported_mol_types if not cond: msg = "The specified molecule type ["+str(charge_type) +"] \n" msg += " is not among the supported molecule types: \n" - msg += "" + str(supported_mol_types) + "\n" + msg += "" + str(MOL2File.supported_mol_types) + "\n" msg += "header :: " + str(header) + " \n" raise ValueError(msg) self.mol_type = mol_type if charge_type != "": - cond = charge_type in supported_charge_types + cond = charge_type in MOL2File.supported_charge_types if not cond: msg = "The specified charge type ["+str(charge_type) +"] " msg += " is not among the supported charge types: \n" - msg += str(supported_charge_types) + "\n" - raise ValueError(msg) + msg += str(MOL2File.supported_charge_types) + "\n" + raise ValueError(msg) self.charge_type = charge_type @@ -575,10 +557,15 @@ def get_structure(self): Returns ------- array : AtomArray or AtomArrayStack - This :class:`AtomArray` contains the optional ``charge`` - annotation and has an associated :class:`BondList`. - All other annotation categories, except ``element`` are - empty. + This :class:`AtomArray` contains the optional ``charge`` annotation + and has an associated :class:`BondList`. Furthermore the optional + ``atom_id`` will be set based upon the first column of the MOL2File. + If the atom_name column contains only element names, only the + ``element`` category will be filled. However, if the atom_name + column contains actual atom_names like, e.g., `CA` for a backbone + C-alpha atom, this will be used to set the ``atom_name`` category, + and according elements will be derived from the atom_name and + sybyl_atom_type. """ self.get_header() @@ -641,9 +628,7 @@ def get_structure(self): if len(line) > 7: subst_name = line[7] if len(line) > 8: - charge = float(line[8]) -# print(line) -# print(charge) + charge = float(line[8]) if len(line) > 9: status_bits = line[9] @@ -670,63 +655,38 @@ def get_structure(self): atoms[j] = atom_i atom_type_sybl_row[j] = atom_type_sybl index += 1 - j += 1 - - print(atoms.element) - - filter_func = lambda e: len(e)==1 or e in elements_twoLetters - is_atom_names_only_element_names = np.all( - [filter_func(e) for e in atoms.element] - ) - print("is_atom_names_only_element_names :: " + str(is_atom_names_only_element_names)) + j += 1 # after first teration over structure we need a second pass # to correctly infer atom_names and element if necessary from - # the atom_name and sybyl_atom_type columns -# print("###AT#SECOND#PASS#NOW######################################") -# -# -# print(atom_names) -# print(atom_type_sybl_row) + # the atom_name and sybyl_atom_type columns + def filter_func(e): + cond = len(e)==1 + cond = cond or e in MOL2File.elements_twoLetters + is_atom_names_only_element_names = np.all( + [filter_func(e) for e in atoms.element] + ) + if not is_atom_names_only_element_names: filtered = np.array( [len(x) > 1 for x in atom_names] - # [ - # filter_atom_name( - # atom_names[k], atom_type_sybl_row[k] - # ) for k in range(len(atom_names)) - # ] ) is_atom_name_NOTEQUAL_element = np.any(filtered) index = self.ind_atoms[i]+1 j = 0 while "@" not in self.lines[index]: - # print("["+str(j)+ "]") + atom_j = atoms[j] - # print(" atom_j.element :: "+str(atom_j.element)) - # print(" atom_j.atom_name :: "+str(atom_j.atom_name)) - # print(" "+str(atom_names[j])) - # print(" "+str(atom_type_sybl_row[j])) - if is_atom_name_NOTEQUAL_element: - # print( - # "setting atoms[" - # +str(j)+"].atom_name=" - # +str(atom_names[j]) - # ) atom_name = atom_names[j] - element = atom_name_to_element( + element = MOL2File.atom_name_to_element( atom_names[j], atom_type_sybl_row[j] ) - # print( - # "setting atoms[" - # +str(j)+"].element=" - # +element - # ) + if self.charge_type != "NO_CHARGES": atoms[j] = Atom( @@ -761,55 +721,6 @@ def get_structure(self): index += 1 j += 1 -# is_atom_name_column_unecessary = np.any( -# [len(x) >= 1 for x in atoms.atom_name] -# ) - -# print( -# "is_atom_name_column_unecessary :: " -# + str(is_atom_name_column_unecessary) -# ) - -# # the added atom_name column seperate to the elements has -# # to be removed sometimes for example if one of the actual -# # two letter elements was contained -# index = self.ind_atoms[i]+1 -# j = 0 -# while "@" not in self.lines[index]: -# -# if self.charge_type != "NO_CHARGES": -# atoms[j] = Atom( -# [ -# atoms[j].coord[0], -# atoms[j].coord[1], -# atoms[j].coord[2], -# ], -# charge=atoms[j].charge, -# element=atoms[j].element, -# ) -# else: -# atoms[j] = Atom( -# [ -# atoms[j].coord[0], -# atoms[j].coord[1], -# atoms[j].coord[2], -# ], -# element=atoms[j].element, -# ) -# index += 1 -# j += 1 - -# print("###AFTER#SECOND#PASS#NOW###################################") -# print(atoms.element) -# print(atoms.atom_name) -# -# for atom in atoms: -# print(atom) -# -# print("") -# print("") -# print("") -# # # Iterate through all the bond lines by stating from line after @@ -820,13 +731,15 @@ def get_structure(self): index = self.ind_bonds[i] +1 while index < len(self.lines) and "@" not in self.lines[index]: - line = [x for x in self.lines[index].strip().split(" ") if x != ''] + line = [ + x for x in self.lines[index].strip().split(" ") if x != '' + ] - bond_id = int(line[0]) - origin_atom_id = int(line[1]) - target_atom_id = int(line[2]) - bond_typ = sybyl_to_biotite_bonds[str(line[3])] - status_bits = "" + bond_id = int(line[0]) + origin_atom_id = int(line[1]) + target_atom_id = int(line[2]) + bond_typ = MOL2File.sybyl_to_biotite_bonds[str(line[3])] + status_bits = "" if len(line) > 4: status_bits = str(line[4]) @@ -851,7 +764,11 @@ def get_structure(self): return struc.stack(atom_array_stack) - def append_atom_array(self, atoms, charges=None): + def __append_atom_array(self, atoms, charges=None): + """ + Internal function that is used to write a single atom + to the lines member variable. + """ n_atoms = atoms.shape[0] @@ -879,10 +796,9 @@ def append_atom_array(self, atoms, charges=None): line += "{:>10.4f}".format(atom.coord[1]) line += "{:>10.4f}".format(atom.coord[2]) line += " {:<8}".format( - get_sybyl_atom_type( + MOL2File.get_sybyl_atom_type( atom, atoms.bonds, i ) -# "C.ar" ) if atom.res_id != 0: line += str(atom.res_id) @@ -892,11 +808,7 @@ def append_atom_array(self, atoms, charges=None): if self.charge_type != "NO_CHARGES": line += " " -# print("charged") if charges is not None: -# print( -# " using user defined charges " +str(charges[i]) -# ) line += " {: .{}f}".format(charges[i], 4) else: line += " {: .{}f}".format(atom.charge, 4) @@ -910,18 +822,31 @@ def append_atom_array(self, atoms, charges=None): line = "{:>6}".format(i+1) line += "{:>6}".format(bond[0]+1) line += "{:>6}".format(bond[1]+1) - line += "{:>5}".format(biotite_bonds_to_sybyl[bond[2]]) + line += "{:>5}".format(MOL2File.biotite_bonds_to_sybyl[bond[2]]) self.lines.append(line) def set_structure(self, atoms): """ - Set the :class:`AtomArray` for the file. + Set the :class:`AtomArray` or :class:`AtomArrayStack` for the file. + As a remark the heuristic for deriving the sybyl_atom_type is + currently not complete. It will mostly get it right regarding + hybridization and aromatic bonds. However, some special cases are + not covered yet and some two letter elements might produce an + error as they might not yet be added to the static + MOL2File.elements_twoLetters array. Parameters ---------- - array : AtomArray or - The array to be saved into this file. + array : AtomArray, AtomArrayStack + The array or stack of arrays to be saved into this file. Must have an associated :class:`BondList`. + Also if the header of this MOL2File has it's charge_type field + set to something other then 'NO_CHARGES' the AtomArray or + AtomArrayStack must have an associated charge category. + Furthermore, if patial_charges have been given via the + set_charges member function, the charge field will be ignored and + the set partial_charges will instead be written to the charge + column of the MOl2File. """ if len(self.lines) < 5: @@ -954,14 +879,11 @@ def set_structure(self, atoms): msg += str(self.num_atoms) + "] and number of atoms in given" msg += "AtomArray [" + str(atoms.shape[0]) + "]" raise ValueError(msg) - -# print(" charges ::") -# print(self.charges) -# print("") + if self.charges is not None: - self.append_atom_array(atoms, self.charges) + self.__append_atom_array(atoms, self.charges) else: - self.append_atom_array(atoms) + self.__append_atom_array(atoms) elif isinstance(atoms, AtomArrayStack): @@ -994,40 +916,57 @@ def set_structure(self, atoms): for l in header_lines: self.lines.append(l) -# print(" charges ::") -# print(self.charges) -# print("") if self.charges is not None: - self.append_atom_array(atoms_i, self.charges[i]) + self.__append_atom_array(atoms_i, self.charges[i]) else: - self.append_atom_array(atoms_i) + self.__append_atom_array(atoms_i) def set_charges(self, charges): """ - Set a partial charges array that will be used for writing the mol2 file. - + Set the partial charges. This function specifically does not check + if the ndarray dimension fit with a struture already contained as + this might make the process of setting charges to a new empty + MOL2File not containing a structure yet overly complicated. + It is left to the user to get this right, otherwise latest at the stage + of writing the file an error will occur. + + Parameters + ---------- + charges: ndarray + A ndarray containing data with `float` type to be written as + partial charges. + If ndarray has any other type an according error will be raised. """ -# if not self.charges is None and self.charges.shape != charges.shape: -# msg = "Can only assign charges of same shape as already within" -# msg += "Mol2 file -# raise ValueError(msg) -# -# -# if self.num_atoms != -1: - -# print("setting self.charges :: " + str(self.charges)) -# print("to :: " + str(charges)) - - self.charges = charges + if np.issubdtype(charges.dtype, np.floating): + self.charges = charges + else: + raise ValueError("Non floating type provided for charges") def get_charges(self): + """ + + The getter function for retrieving the partial charges from the read + MOL2File if it has any. If file with no charges was read and this + functoin is called a warning will be given. + Also if the charges member variable is still None this will invoke + the get_structure function, which in turn might raise a BadStructureError + if there is no structure contained. + + Returns + ------- + charges : ndarray, None + Either ndarray of type `float` or None if no partial_charges + where contained. + """ if self.charge_type == "NO_CHARGES": - raise ValueError( - "Can not get charges from mol2 file where NO_CHARGES set." - ) + msg = "The read MOl2File had NO_CHARGES set, therefore" + msg += "no partial charges where contained in the file." + warning.warn(msg) + + return None if self.charges is None: _ = self.get_structure() diff --git a/src/biotite/structure/io/xyz/__init__.py b/src/biotite/structure/io/xyz/__init__.py index 3867d24a7..f5f1dd1d5 100644 --- a/src/biotite/structure/io/xyz/__init__.py +++ b/src/biotite/structure/io/xyz/__init__.py @@ -3,12 +3,10 @@ # information. """ -The MOL format is used to depict atom positions and bonds for small +The XYZ format is used to depict only atom positions for small molecules. -This subpackage is used for reading and writing an :class:`AtomArray` -in this format. -Additionally, reading data from the SDF format, which is a wrapper -around MOL, is also supported. +This subpackage is used for reading and writing an :class:`AtomArray` or +an :class:`AtomArrayStack` for a file containing multiple models in this format. """ __name__ = "biotite.structure.io.xyz" diff --git a/tests/structure/test_mol2.py b/tests/structure/test_mol2.py index 2cbcc69b1..9d00a1c60 100644 --- a/tests/structure/test_mol2.py +++ b/tests/structure/test_mol2.py @@ -53,13 +53,13 @@ def test_header_conversion(): ref_nums = np.random.randint(1, 10, len(ref_names)) ref_mol_type = [ - mol2.supported_mol_types[x] for x in np.random.randint( + mol2.MOL2File.supported_mol_types[x] for x in np.random.randint( 0,5,len(ref_names) ).astype(int) ] ref_charge_type = [ - mol2.supported_charge_types[x] for x in np.random.randint( + mol2.MOL2File.supported_charge_types[x] for x in np.random.randint( 0,12,len(ref_names) ).astype(int) ] @@ -163,72 +163,75 @@ def test_charge_rounding(path): ref_header = mol2_file.get_header() ref_atoms = mol2.get_structure(mol2_file) - ref_partial_charges = mol2.get_charges(mol2_file) - ref_charges = ref_atoms.charge - - mol2_file = mol2.MOL2File() - mol2_file.set_header( - ref_header[0], ref_header[1], ref_header[2], ref_header[3] - ) - mol2.set_structure(mol2_file, ref_atoms) - temp = TemporaryFile("w+") - mol2_file.write(temp) - - - temp.seek(0) - mol2_file = mol2.MOL2File.read(temp) - test_atoms = mol2.get_structure(mol2_file) - test_charges = mol2.get_charges(mol2_file) - temp.close() - - mol2_file = mol2.MOL2File() - mol2_file.set_header( - ref_header[0], ref_header[1], ref_header[2], ref_header[3] - ) - mol2.set_charges(mol2_file, ref_partial_charges) - mol2.set_structure(mol2_file, ref_atoms) - temp = TemporaryFile("w+") - mol2_file.write(temp) - - temp.seek(0) - mol2_file = mol2.MOL2File.read(temp) - test2_atoms = mol2.get_structure(mol2_file) - test2_charges = mol2.get_charges(mol2_file) - temp.close() + if ref_header[3] == "NO_CHARGES": + assert mol2_file.get_charges() is None + else: + ref_partial_charges = mol2.get_charges(mol2_file) + ref_charges = ref_atoms.charge + - instance_cond = isinstance(ref_atoms, AtomArray) - instance_cond = instance_cond | isinstance(ref_atoms, AtomArrayStack) - assert instance_cond + mol2_file = mol2.MOL2File() + mol2_file.set_header( + ref_header[0], ref_header[1], ref_header[2], ref_header[3] + ) + mol2.set_structure(mol2_file, ref_atoms) + temp = TemporaryFile("w+") + mol2_file.write(temp) + - if isinstance(ref_atoms, AtomArray): - # actually no idea why we can assume that this works - # since floating point comparison is not safe! - print(ref_partial_charges) - print(np.rint(ref_partial_charges)) - assert test_atoms == ref_atoms - assert test2_atoms == ref_atoms - - assert test_atoms.bonds == ref_atoms.bonds - assert test2_atoms.bonds == ref_atoms.bonds + temp.seek(0) + mol2_file = mol2.MOL2File.read(temp) + test_atoms = mol2.get_structure(mol2_file) + test_charges = mol2.get_charges(mol2_file) + temp.close() - assert np.all(np.rint(ref_partial_charges) == test_charges) - assert np.all(ref_partial_charges == test2_charges) + mol2_file = mol2.MOL2File() + mol2_file.set_header( + ref_header[0], ref_header[1], ref_header[2], ref_header[3] + ) + mol2.set_charges(mol2_file, ref_partial_charges) + mol2.set_structure(mol2_file, ref_atoms) + temp = TemporaryFile("w+") + mol2_file.write(temp) - elif isinstance(ref_atoms, AtomArrayStack): - for i in range(ref_atoms.shape[0]): - assert np.all(np.isclose(ref_atoms[i].coord, test_atoms[i].coord)) - assert np.all(np.isclose(ref_atoms[i].coord, test2_atoms[i].coord)) - assert np.all(ref_atoms[i].element == test_atoms[i].element) - assert np.all(ref_atoms[i].element == test2_atoms[i].element) - assert np.all(ref_atoms.bonds == test_atoms.bonds) - assert np.all(ref_atoms.bonds == test2_atoms.bonds) - assert np.all( - np.isclose(np.rint(ref_partial_charges[i]), test_charges[i]) - ) - assert np.all( - np.isclose(ref_partial_charges[i], test2_charges[i]) - ) + temp.seek(0) + mol2_file = mol2.MOL2File.read(temp) + test2_atoms = mol2.get_structure(mol2_file) + test2_charges = mol2.get_charges(mol2_file) + temp.close() + + + instance_cond = isinstance(ref_atoms, AtomArray) + instance_cond = instance_cond | isinstance(ref_atoms, AtomArrayStack) + assert instance_cond + + if isinstance(ref_atoms, AtomArray): + # actually no idea why we can assume that this works + # since floating point comparison is not safe! + assert test_atoms == ref_atoms + assert test2_atoms == ref_atoms + + assert test_atoms.bonds == ref_atoms.bonds + assert test2_atoms.bonds == ref_atoms.bonds + + assert np.all(np.rint(ref_partial_charges) == test_charges) + assert np.all(ref_partial_charges == test2_charges) + elif isinstance(ref_atoms, AtomArrayStack): + for i in range(ref_atoms.shape[0]): + assert np.all(np.isclose(ref_atoms[i].coord, test_atoms[i].coord)) + assert np.all(np.isclose(ref_atoms[i].coord, test2_atoms[i].coord)) + assert np.all(ref_atoms[i].element == test_atoms[i].element) + assert np.all(ref_atoms[i].element == test2_atoms[i].element) + assert np.all(ref_atoms.bonds == test_atoms.bonds) + assert np.all(ref_atoms.bonds == test2_atoms.bonds) + assert np.all( + np.isclose(np.rint(ref_partial_charges[i]), test_charges[i]) + ) + assert np.all( + np.isclose(ref_partial_charges[i], test2_charges[i]) + ) + From 9128b089767c7ec7c442c79a3092c9272b0d2064 Mon Sep 17 00:00:00 2001 From: Benjamin Mayer Date: Fri, 2 Sep 2022 22:36:51 +0200 Subject: [PATCH 17/37] SD File read/write with AtomArray and AtomArrayStack, as well as meta_information dictionaries working. Reading of datetime from header working. But besides that problems with read/write of header. These seem to stem from the fact that programs such as openbabel to not adher to the Chemical table file standard .. Omitting this for now as one can in principle get the header by acessing lines[1] --- src/biotite/structure/io/sdf/convert.py | 58 ++++- src/biotite/structure/io/sdf/file.py | 304 ++++++++++++++++-------- tests/structure/test_sdf.py | 30 ++- 3 files changed, 282 insertions(+), 110 deletions(-) diff --git a/src/biotite/structure/io/sdf/convert.py b/src/biotite/structure/io/sdf/convert.py index f4c66394c..409e0575e 100644 --- a/src/biotite/structure/io/sdf/convert.py +++ b/src/biotite/structure/io/sdf/convert.py @@ -6,16 +6,33 @@ __author__ = "Benjamin E. Mayer" __all__ = [ "get_structure", "set_structure", + "get_header", "set_header", "get_metainformation", "set_metainformation" ] +def get_header(sdf_file): + """ + """ + return sdf_file.get_header() + +def set_header(sdf_file, mol_name, initials="", program="", time=None, + dimensions="", scaling_factors="", energy="", + registry_number="", comments=""): + """ + sdf + """ + sdf_file.set_header( + mol_name, initials="", program="", time=None, + dimensions="", scaling_factors="", energy="", + registry_number="", comments="" + ) def get_structure(sdf_file): """ Get an :class:`AtomArray` from the MOL file. - Ths function is a thin wrapper around + This function is a thin wrapper around :meth:`SDFile.get_structure()`. Parameters @@ -30,11 +47,6 @@ def get_structure(sdf_file): annotation and has an associated :class:`BondList`. All other annotation categories, except ``element`` are empty. - annotations: dict - This annotationa dictionary contains all the metainformation from - the sdf file parsed as key:value pairs with the annotation tag - defined via '> ' being the key and the lines until the next - annotation tag or end of file being the value. """ return sdf_file.get_structure() @@ -43,7 +55,7 @@ def set_structure(sdf_file, atoms): """ Set the :class:`AtomArray` for the MOL file. - Ths function is a thin wrapper around + This function is a thin wrapper around :meth:`SDFile.set_structure()`. Parameters @@ -58,7 +70,39 @@ def set_structure(sdf_file, atoms): def get_metainformation(sdf_file): + """ + Get the meta informatoin dictionary for the class SDFile. + + This function is a thin wrapper around + :meth:`SDFile.get_metainformation()`. + + Returns + ------- + meta_information: dict + This annotationa dictionary contains all the metainformation from + the SD file parsed as key:value pairs with the annotation tag + defined via '> ' being the key and the lines until the next + annotation tag or end of file being the value. + If a multi model file has been loaded a dictionary of such dictionaries + is returned respectively. With the sub-dictionaries containing the + read meta inforamtion of the sub models. + + """ return sdf_file.get_metainformation() def set_metainformation(sdf_file, meta_information): + """ + Set the :class:`AtomArray` for the MOL file. + + This function is a thin wrapper around + :meth:`SDFile.set_structure(meta_info)`. + + Parameters + ---------- + meta_information: dict + For a single model SDFile a simple dictionary is expected. + Otherwise a dictionary of dictionaries is expected having as many + sub dictionaries as there are models in the SD File. + + """ sdf_file.set_metainformation(meta_information) diff --git a/src/biotite/structure/io/sdf/file.py b/src/biotite/structure/io/sdf/file.py index 000f50021..97d140c2a 100644 --- a/src/biotite/structure/io/sdf/file.py +++ b/src/biotite/structure/io/sdf/file.py @@ -8,6 +8,7 @@ import datetime from warnings import warn +import re import numpy as np from ...atoms import AtomArray, AtomArrayStack import biotite.structure as struc @@ -18,7 +19,7 @@ # Number of header lines N_HEADER = 3 -DATE_FORMAT = "%d%m%y%H%M" +DATE_FORMATS = ["%d%m%y%H%M", "%m%d%y%H%M"] class SDFile(TextFile): @@ -78,13 +79,17 @@ def get_header(self): Get the header from the SDF file. This is identical to the MOL file header as the basic information per model is the same. + This doesn't seem to work properly with files generated by + openbabel. The datetime will be interpreted correctly but the + other fields might be of. If this information is realy wanted + one should access the acording line with sdf_file.lines[1]. Returns ------- mol_name : str The name of the molecule. initials : str - The author's initials. + The author's initialfilters. program : str The program name. time : datetime @@ -101,18 +106,40 @@ def get_header(self): Additional comments. """ mol_name = self.lines[0].strip() - initials = self.lines[1][0:2].strip() + initials = self.lines[1][:2].strip() + + line1_split = re.split(r'(\d+)',self.lines[1].strip()) program = self.lines[1][2:10].strip() + program = line1_split[0] - time = None - try: - time = datetime.datetime.strptime( - self.lines[1][10:20], - DATE_FORMAT - ) - except: - line = format(self.lines[1][10:20]) - warn("{} could not be interpreted as datetime".format(line)) + time = None + if len(line1_split) > 1: + + time_parsing_succesfull = False + msg_last = "" + for format_i in DATE_FORMATS: + try: + + time = datetime.datetime.strptime( + line1_split[1][:10], + + # ''.join([x for x in self.lines[1] if x.isdigit()])[ + # :10 + # ], +# self.lines[1][10:20].strip()[:len(format_i)], + format_i + ) + time_parsing_succesfull = True + except: + time_parsing_succesfull = False + #msg = str(self.lines[1]) + " | " + str(line1_split) + #msg += " | " + str(line1_split[1][:9]) + " | " + msg_last = self.lines[1][10:20].strip()[:len(format_i)] + msg_last += "could not be interpreted as datetime" + + if not time_parsing_succesfull: + warn(msg_last) + dimensions = self.lines[1][20:22].strip() scaling_factors = self.lines[1][22:34].strip() @@ -122,6 +149,27 @@ def get_header(self): return mol_name, initials, program, time, dimensions, \ scaling_factors, energy, registry_number, comments + def __get_model_lines(self): + """ + Internal function used to derive indices where models in file + start, loaction of M END directive as well as $$$$. + """ + + mod_end_lines = [ + i for i in range(len(self.lines)) if '$$$$' in self.lines[i] + ] + + mod_start_lines = [0] + [ + x + 1 for x in mod_end_lines[:-1] + ] + + m_end_lines = [ + i for i in range( + len(self.lines) + ) if self.lines[i].startswith("M END") + ] + + return mod_start_lines, m_end_lines, mod_end_lines def set_header(self, mol_name, initials="", program="", time=None, dimensions="", scaling_factors="", energy="", @@ -152,9 +200,31 @@ def set_header(self, mol_name, initials="", program="", time=None, comments : str, optional Additional comments. """ - if time is None: - time = datetime.datetime.now() - time_str = time.strftime(DATE_FORMAT) +# print("###START#SET#HEADER#TIME#SECTION###############################") + + time_str="" + for format_i in DATE_FORMATS: + try: + time_str = time.strftime(format_i) + +# if time is None or type(time) is type(datetime.datetime.now()): +# time = datetime.datetime.now() +# if self._format is not None: +# time_str = time.strftime(self._format) +# else: +# time_str = time.strftime(DATE_FORMATS[0]) + + except: + pass + + if len(time_str) == 0: + time = datetime.datetime.now() + time_str = time.strftime(DATE_FORMATS[0]) + +# print(time_str) + +# print("###END#SET#HEADER#TIME#SECTION#################################") + self.lines[0] = str(mol_name) self.lines[1] = ( @@ -183,31 +253,19 @@ def get_structure(self): empty. """ - - - model_end_lines = [ - i for i in range(len(self.lines)) if '$$$$' == self.lines[i] - ] - - assert(len(model_end_lines) < len(self.lines)) - - m_end_lines = [ - i for i in range( - len(self.lines) - ) if self.lines[i].startswith("M END") - ] + mod_start_lines, m_end_lines, mod_end_lines = self.__get_model_lines() + assert(len(mod_end_lines) < len(self.lines)) # if only $$$$ is forgotten in mol file add it - if len(model_end_lines) == 0 and len(m_end_lines) !=0: + if len(mod_end_lines) == 0 and len(m_end_lines) !=0: self.lines.append("$$$$") - model_end_lines = [ - i for i in range(len(self.lines)) if '$$$$' == self.lines[i] - ] + mod_lines = self.__get_model_lines() + mod_start_lines, m_end_lines, mod_end_lines = mod_lines - model_start_lines = [0] + [x+1 for x in model_end_lines[:-1]] +# mod_start_lines = [0] + [x+1 for x in mod_end_lines[:-1]] - if len(model_end_lines) == 0 and len(m_end_lines) == 0: + if len(mod_end_lines) == 0 and len(m_end_lines) == 0: msg = "Trying to get structure from empty file, or" msg += "M_END line is missing. \n" msg += "Lines where :: \n" + str(self.lines) + "\n\n" @@ -216,11 +274,14 @@ def get_structure(self): array_stack = [] i_start = 0 - for i in range(len(model_end_lines)): + for i in range(len(mod_end_lines)): + ctab_lines = self.lines[ - int(model_start_lines[i]+3):int(m_end_lines[i]) + int(mod_start_lines[i]+3):int(m_end_lines[i]) ] + + if len(ctab_lines) == 0: msg = "File does not contain structure data" @@ -232,7 +293,7 @@ def get_structure(self): array_stack.append(atom_array) - if len(model_end_lines) == 1: + if len(mod_end_lines) == 1: return array_stack[0] else: return struc.stack(array_stack) @@ -253,79 +314,57 @@ def set_structure(self, atoms): header_lines.append(self.lines[0]) header_lines.append(self.lines[1]) header_lines.append(self.lines[2]) - print("header_lines ::") - print(header_lines) + header_lines = self.lines[:N_HEADER] - print("header_lines ::") - print(header_lines) - + if isinstance(atoms, AtomArray): - print(self.lines) self.lines = header_lines + write_structure_to_ctab(atoms) self.lines += ["$$$$"] - print(self.lines) + elif isinstance(atoms, AtomArrayStack): for i, atoms_i in enumerate(atoms): - header_lines = self.lines[:N_HEADER] - print("header_lines ::") - print(header_lines) - - + header_lines = self.lines[:N_HEADER] + if i == 0: self.lines = header_lines else: self.lines += header_lines - print("struct to ctab on structure : atoms_i :: ") - print(atoms_i) - print("") + processed_lines = write_structure_to_ctab(atoms_i) - print("|processed_lines| :: " + str(len(processed_lines))) - print("") - print(processed_lines) self.lines += processed_lines - self.lines += ["$$$$"] - - + self.lines += ["$$$$"] def get_metainformation(self): """ Set the :class:`AtomArray` for the file. - Parameters - ---------- + Returns + ------- annotations: dict This dictionary contains all the metainformation given in lines like: > - 1 + 1 + Or it contains multiple dictionaries if a multi file model with + meta information entries has been loaded. """ - meta_info = {} + meta_info = {} + mod_start_lines, m_end_lines, mod_end_lines = self.__get_model_lines() - model_end_lines = [ - i for i in range(len(self.lines)) if '$$$$' in self.lines[i] - ] - m_end_lines = [ - i for i in range( - len(self.lines) - ) if self.lines[i].startswith("M END") - ] - model_start_lines = [0] + [x+1 for x in model_end_lines[:-1]] - - i_start = 0 - for i in range(len(model_end_lines)): + for i in range(len(mod_end_lines)): sub_meta_info = {} line_sub_model = self.lines[ - model_start_lines[i]:model_end_lines[i]+1 + mod_start_lines[i]:mod_end_lines[i]+1 ] annotation_line_indices = [ @@ -366,11 +405,12 @@ def get_metainformation(self): if len(list(meta_info.keys()))==1: return meta_info["model_0"] else: - return meta_info + return meta_info + def set_metainformation(self, meta_information): """ - Set the :class:`AtomArray` for the file. + Set the meta information for the SD File. Parameters ---------- @@ -379,9 +419,10 @@ def set_metainformation(self, meta_information): like: > 1 - Either a single dictionary with MODEL:value pairs or a dictionary - of dictionary where each key indicates a model and the value is the - according model specific dictionary: + Either a single dictionary with MODEL:value pairs (if only a single + structure is stored) or a dictionary of dictionaries where each key + indicates a model and the value is the according model specific + meta_information dictionary (which might also be empty): { "model_0": {"Tag1":Value1,.... }, @@ -390,30 +431,101 @@ def set_metainformation(self, meta_information): } """ + if len(self.lines) == N_HEADER: + msg = "Meta Information can only be written afte a structure has" + msg += "been set" + raise BadStructureError(msg) + - header_lines = self.lines[:N_HEADER] + header_lines = self.lines[:N_HEADER] + mod_start_lines, m_end_lines, mod_end_lines = self.__get_model_lines() - model_end_lines = [ - i for i in range(len(self.lines)) if '$$$$' in self.lines[i] - ] + if len(mod_end_lines) == 1: - if len(model_end_lines) == 1: - - if meta_information is not None: - for x in meta_information.keys(): - self.lines.append("> <" +str(x) + "> ") + # local helper function for checking the integrity + # of the given meta_information dictionary with regards + # to a multimodel file + def is_correct_meta_information_dict(x_dict): + cond = type(x_dict) is dict + return cond + + + if not is_correct_meta_information_dict(meta_information): + msg += "Provided meta_information variable of wrong type:\n" + msg += "Given :: "+str(meta_information) + raise ValueError(msg) + + if len(meta_information.keys()) != 0: + for i, x in enumerate(meta_information.keys()): + if i==0 and self.lines[-1] == "$$$$": + self.lines[-1]="> <" +str(x) + "> " + else: + self.lines.append("> <" +str(x) + "> ") self.lines.append(meta_information[x]) + self.lines.append("$$$$") else: - if meta_information is not None: - for key in meta_information.keys(): + if meta_information is not None: + + + # local helper function for checking the integrity + # of the given meta_information dictionary with regards + # to a multimodel file + def is_correct_meta_information_dict(x_dict): + cond = type(x_dict) is dict + cond = cond and (len(mod_end_lines) == len(x_dict.keys())) + n_keys = -1 + for k in x_dict.keys(): + + cond = cond and type(x_dict[k]) is dict + + if n_keys == -1: + n_keys = len(x_dict[k].keys()) + else: + sub_keys = x_dict[k].keys() + cond = cond and len(sub_keys) == n_keys + + return cond + + + if not is_correct_meta_information_dict(meta_information): + msg = "Provided meta information dictionary needs to have" + msg += "one key for each model stored in the SD File." + msg += "Where und each such key a dictionary containing the" + msg += "meta information for the according model is stored" + msg += "\nGiven dictionary was :: "+str(meta_information) + raise ValueError(msg) + + for i, key in enumerate(meta_information.keys()): sub_annotations = meta_information[key] - for subkey in meta_information[key]: - self.lines.append("> <" +str(subkey) + "> ") - self.lines.append(sub_annotations[subkey]) - + model_lines = self.__get_model_lines() + mod_start_lines, m_end_lines, mod_end_lines = model_lines - + i_model_start = mod_start_lines[i] + i_m_end = m_end_lines[i] + i_model_end = mod_end_lines[i] + + sub_dict = meta_information[key] + + if len(sub_dict.keys()) != 0: + sub_meta_info_lines = [] + for subkey in sub_dict.keys(): + sub_meta_info_lines.append("> <" +str(subkey) + "> ") + sub_meta_info_lines.append(sub_dict[subkey]) + + # need to add written meta information lines right + # after structure lines + lines_old = self.lines + structure_old = self.lines[i_model_start:i_m_end] + + self.lines = lines_old[:i] + self.lines = lines_old[:i_model_start] + self.lines += structure_old + self.lines += ["M END"] + self.lines += sub_meta_info_lines + + self.lines += lines_old[i_model_end:] + def _get_ctab_lines(lines): diff --git a/tests/structure/test_sdf.py b/tests/structure/test_sdf.py index 8aa15ec86..f24092a17 100644 --- a/tests/structure/test_sdf.py +++ b/tests/structure/test_sdf.py @@ -44,8 +44,8 @@ itertools.product( glob.glob( join(data_dir("structure"), "molecules", "*.mol") - ) - + + ) + + glob.glob( join(data_dir("structure"), "molecules", "*.sdf") ), @@ -65,16 +65,19 @@ def test_structure_conversion(path, omit_charge): SD format. """ sdf_file = sdf.SDFile.read(path) + ref_header = sdf.get_header(sdf_file) + ref_header_line = sdf_file.lines[1] ref_atoms = sdf.get_structure(sdf_file) - #ref_annotations = sdf.get_metainformation(sdf_file) + ref_meta_information = sdf.get_metainformation(sdf_file) # print(ref_atoms) # print(ref_atoms.charge) if omit_charge: ref_atoms.del_annotation("charge") sdf_file = sdf.SDFile() + sdf.set_header(sdf_file, *ref_header) sdf.set_structure(sdf_file, ref_atoms) - #sdf.set_metainformation(sdf_file, ref_annotations) + sdf.set_metainformation(sdf_file, ref_meta_information) temp = TemporaryFile("w+") @@ -87,6 +90,8 @@ def test_structure_conversion(path, omit_charge): sdf_file = sdf.SDFile.read(temp) # try: test_atoms = sdf.get_structure(sdf_file) + test_meta_information = sdf.get_metainformation(sdf_file) + test_header = sdf.get_header(sdf_file) # except: # print("#######TEST#ON#"+str(path)+"###################") # print("") @@ -105,10 +110,21 @@ def test_structure_conversion(path, omit_charge): assert np.all(test_atoms.charge == 0) test_atoms.del_annotation("charge") temp.close() + + +# cond_header = test_header == ref_header +# print("############TEST ["+str(path) + "]#################################") +# print("ref_header :: " + str(ref_header)) +# print("ref_header_line :: " +str(ref_header_line)) +# print("test_header :: " + str(test_header)) +# assert cond_header + + cond_atoms = test_atoms == ref_atoms + assert cond_atoms + + cond_meta = test_meta_information == ref_meta_information + assert cond_meta - cond = test_atoms == ref_atoms - assert cond - #assert test_annotation == ref_annotations #@pytest.mark.parametrize( From fb530c956c0c237516944e94dae0053bacdaf92d Mon Sep 17 00:00:00 2001 From: Benjamin Mayer Date: Fri, 2 Sep 2022 22:41:55 +0200 Subject: [PATCH 18/37] removed small previous change in test_mol --- tests/structure/test_mol.py | 59 ++++++++++++++++--------------------- 1 file changed, 26 insertions(+), 33 deletions(-) diff --git a/tests/structure/test_mol.py b/tests/structure/test_mol.py index 2caa5ff9b..91fbb1222 100644 --- a/tests/structure/test_mol.py +++ b/tests/structure/test_mol.py @@ -109,41 +109,34 @@ def test_pdbx_consistency(path): """ # print(path) mol_name = split(splitext(path)[0])[1] -# print(mol_name) - - if mol_name in info.all_residues(): + ref_atoms = info.residue(mol_name) + # The CCD contains information about aromatic bond types, + # but the SDF test files do not + ref_atoms.bonds.remove_aromaticity() + + mol_file = mol.MOLFile.read(path) + test_atoms = mol_file.get_structure() + + assert test_atoms.coord.shape == ref_atoms.coord.shape + assert test_atoms.coord.flatten().tolist() \ + == ref_atoms.coord.flatten().tolist() + assert test_atoms.element.tolist() == ref_atoms.element.tolist() + assert test_atoms.charge.tolist() == ref_atoms.charge.tolist() + assert set(tuple(bond) for bond in test_atoms.bonds.as_array()) \ + == set(tuple(bond) for bond in ref_atoms.bonds.as_array()) - ref_atoms = info.residue(mol_name) - # The CCD contains information about aromatic bond types, - # but the SDF test files do not - ref_atoms.bonds.remove_aromaticity() - - mol_file = mol.MOLFile.read(path) - test_atoms = mol_file.get_structure() - - assert test_atoms.coord.shape == ref_atoms.coord.shape - assert test_atoms.coord.flatten().tolist() \ - == ref_atoms.coord.flatten().tolist() - assert test_atoms.element.tolist() == ref_atoms.element.tolist() - assert test_atoms.charge.tolist() == ref_atoms.charge.tolist() - assert set(tuple(bond) for bond in test_atoms.bonds.as_array()) \ - == set(tuple(bond) for bond in ref_atoms.bonds.as_array()) - - header = mol_file.get_header() - - try: - header = mol_file.get_header() - except RuntimeWarning as w: - if "could not be interpreted as datetime" in w.message: - assert True - else: - assert False, "Runtime Warning :: " + str(w.message) - except: - assert False, "Could not get_header for SDFile [" +str(path) - + header = mol_file.get_header() - else: - pytest.skip("Skipped as not an amino acid based on name") + try: + header = mol_file.get_header() + except RuntimeWarning as w: + if "could not be interpreted as datetime" in w.message: + assert True + else: + assert False, "Runtime Warning :: " + str(w.message) + except: + assert False, "Could not get_header for SDFile [" +str(path) + From 18479a889048b8b1c06790a150af8b8ff3d10e7a Mon Sep 17 00:00:00 2001 From: Benjamin Mayer Date: Fri, 2 Sep 2022 23:05:27 +0200 Subject: [PATCH 19/37] removing get_header and set_header from test as apprently warning causes test suite to interpret this as failure.. --- tests/structure/test_sdf.py | 22 +++------------------- 1 file changed, 3 insertions(+), 19 deletions(-) diff --git a/tests/structure/test_sdf.py b/tests/structure/test_sdf.py index f24092a17..3f3cf951c 100644 --- a/tests/structure/test_sdf.py +++ b/tests/structure/test_sdf.py @@ -65,17 +65,15 @@ def test_structure_conversion(path, omit_charge): SD format. """ sdf_file = sdf.SDFile.read(path) - ref_header = sdf.get_header(sdf_file) +# ref_header = sdf.get_header(sdf_file) ref_header_line = sdf_file.lines[1] ref_atoms = sdf.get_structure(sdf_file) ref_meta_information = sdf.get_metainformation(sdf_file) -# print(ref_atoms) -# print(ref_atoms.charge) if omit_charge: ref_atoms.del_annotation("charge") sdf_file = sdf.SDFile() - sdf.set_header(sdf_file, *ref_header) +# sdf.set_header(sdf_file, *ref_header) sdf.set_structure(sdf_file, ref_atoms) sdf.set_metainformation(sdf_file, ref_meta_information) temp = TemporaryFile("w+") @@ -88,24 +86,10 @@ def test_structure_conversion(path, omit_charge): temp.seek(0) sdf_file = sdf.SDFile.read(temp) -# try: test_atoms = sdf.get_structure(sdf_file) test_meta_information = sdf.get_metainformation(sdf_file) test_header = sdf.get_header(sdf_file) -# except: -# print("#######TEST#ON#"+str(path)+"###################") -# print("") -# print("") -# print("") -# print(sdf_file.lines) -# for l in sdf_file.lines: -# print(l) -# print("") -# print("") -# print("") -# print(lines_to_be_written) - - #test_annotation = sdf.get_metainformation(sdf_file) + if omit_charge: assert np.all(test_atoms.charge == 0) test_atoms.del_annotation("charge") From 4ddd8b199aee1a3c7d61208ebdf0946c1c659834 Mon Sep 17 00:00:00 2001 From: Benjamin Mayer Date: Sat, 3 Sep 2022 01:06:13 +0200 Subject: [PATCH 20/37] Forgot to implement functionality in load_structure and save_structure. Cleaned up tests, also precision in XYZFiles did not match between loaded and stored. --- src/biotite/structure/io/general.py | 69 +++++++++++++++------------ src/biotite/structure/io/mol2/file.py | 14 ++++-- src/biotite/structure/io/xyz/file.py | 69 +++++++++++++++------------ tests/structure/test_generalio.py | 20 ++++++-- tests/structure/test_mol2.py | 47 ++++-------------- tests/structure/test_xyz.py | 19 +++----- 6 files changed, 120 insertions(+), 118 deletions(-) diff --git a/src/biotite/structure/io/general.py b/src/biotite/structure/io/general.py index 32f8057b0..b1f55de19 100644 --- a/src/biotite/structure/io/general.py +++ b/src/biotite/structure/io/general.py @@ -78,34 +78,7 @@ def load_structure(file_path, template=None, **kwargs): # Stack containing only one model -> return as atom array return array[0] else: - return array - elif suffix == ".xyz": - from .xyz import XYZFile - file = XYZFile.read(file_path) - array = file.get_structure(**kwargs) - if isinstance(array, AtomArrayStack) and array.stack_depth() == 1: - # Stack containing only one model -> return as atom array - return array[0] - else: - return array - elif suffix == ".mol2": - from .mol2 import MOL2File - file = MOL2File.read(file_path) - array = file.get_structure(**kwargs) - if isinstance(array, AtomArrayStack) and array.stack_depth() == 1: - # Stack containing only one model -> return as atom array - return array[0] - else: - return array - elif suffix == ".sdf": - from .sdf import SDFFile - file = SDFFile.read(file_path) - array = file.get_structure(**kwargs) - if isinstance(array, AtomArrayStack) and array.stack_depth() == 1: - # Stack containing only one model -> return as atom array - return array[0] - else: - return array + return array elif suffix == ".cif" or suffix == ".pdbx": from .pdbx import PDBxFile, get_structure @@ -143,12 +116,33 @@ def load_structure(file_path, template=None, **kwargs): return array[0] else: return array - elif suffix == ".mol" or suffix == ".sdf": + elif suffix == ".mol": from .mol import MOLFile file = MOLFile.read(file_path) array = file.get_structure(**kwargs) # MOL files only contain a single model return array + elif suffix == ".sdf": + from .sdf import SDFile + file = SDFile.read(file_path) + array = file.get_structure(**kwargs) + # SDFile automaticall detects if to return + # AomArray or AtomArrayStack + return array + elif suffix == ".xyz": + from .xyz import XYZFile + file = XYZFile.read(file_path) + array = file.get_structure(**kwargs) + # XYZFile automaticall detects if to return + # AomArray or AtomArrayStack + return array + elif suffix == ".mol2": + from .mol2 import MOL2File + file = MOL2File.read(file_path) + array = file.get_structure(**kwargs) + # MOL2File automaticall detects if to return + # AomArray or AtomArrayStack + return array elif suffix in [".trr", ".xtc", ".tng", ".dcd", ".netcdf"]: if template is None: raise TypeError("Template must be specified for trajectory files") @@ -232,11 +226,26 @@ def save_structure(file_path, array, **kwargs): file = NpzFile() file.set_structure(array, **kwargs) file.write(file_path) - elif suffix == ".mol" or suffix == ".sdf": + elif suffix == ".mol": from .mol import MOLFile file = MOLFile() file.set_structure(array, **kwargs) file.write(file_path) + elif suffix == ".sdf": + from .sdf import SDFile + file = SDFile() + file.set_structure(array, **kwargs) + file.write(file_path) + elif suffix == ".xyz": + from .xyz import XYZFile + file = XYZFile() + file.set_structure(array, **kwargs) + file.write(file_path) + elif suffix == ".mol2": + from .mol2 import MOL2File + file = MOL2File() + file.set_structure(array, **kwargs) + file.write(file_path) elif suffix in [".trr", ".xtc", ".tng", ".dcd", ".netcdf"]: from .trr import TRRFile from .xtc import XTCFile diff --git a/src/biotite/structure/io/mol2/file.py b/src/biotite/structure/io/mol2/file.py index 210c9a448..25cfc389f 100644 --- a/src/biotite/structure/io/mol2/file.py +++ b/src/biotite/structure/io/mol2/file.py @@ -850,10 +850,16 @@ def set_structure(self, atoms): """ if len(self.lines) < 5: - msg = "Header not valid, less then the minimum amount of lines in" - msg += "header :: " +str(self.lines) - raise ValueError(msg) - + + isArrayStack = lambda x: isinstance(x, AtomArrayStack) + # set skeleton header for file where set_header was not invoked + self.set_header( + "", + atoms.shape[1] if isArrayStack(atoms) else atoms.shape[0], + "SMALL", + "NO_CHARGES" if atoms.charge is None else "USER_CHARGES" + ) + header_lines = self.lines[:self.ind_atoms[0]] # since setting new structure delete all previously stored diff --git a/src/biotite/structure/io/xyz/file.py b/src/biotite/structure/io/xyz/file.py index f41fbf04e..9a64c790d 100644 --- a/src/biotite/structure/io/xyz/file.py +++ b/src/biotite/structure/io/xyz/file.py @@ -134,35 +134,41 @@ def get_header(self, model=None): self.lines[i+1].strip() for i in self._model_start_inds ] - - return self._atom_numbers, self._mol_names + if len(self._atom_numbers) == 1: + return self._atom_numbers[0], self._mol_names[0] + else: + return self._atom_numbers, self._mol_names def __get_number_of_atoms(self): """ This calculates the number of atoms from the previously read file. """ - lines_parsed = [x.split() for x in self.lines] - inds=np.array( - [ - i for i in range( - len(lines_parsed) - ) if len(lines_parsed[i]) != 4 - ] - ) - if inds.shape[0] == 2: - return int(len(self.lines[2:])) - else: - inds=inds[np.where(inds[1:]-inds[:-1]!=1)[0]] - line_lengths=np.unique(inds[1:]-inds[:-1]) - - if line_lengths.shape[0] > 1: - msg = "File contains different molecules." - msg += "Currently only multiple models of the same molecule" - msg += "are supported within one file" - raise BadStructureError(msg) - - return np.unique(inds[1:]-inds[:-1])[0] + if len(self.lines) > N_HEADER: + print(self.lines) + lines_parsed = [x.split() for x in self.lines] + inds=np.array( + [ + i for i in range( + len(lines_parsed) + ) if len(lines_parsed[i]) != 4 + ] + ) + if inds.shape[0] == 2: + return int(len(self.lines[2:])) + else: + inds=inds[np.where(inds[1:]-inds[:-1]!=1)[0]] + line_lengths=np.unique(inds[1:]-inds[:-1]) + + if line_lengths.shape[0] > 1: + msg = "File contains different molecules." + msg += "Currently only multiple models of the same molecule" + msg += "are supported within one file" + raise BadStructureError(msg) + + return np.unique(inds[1:]-inds[:-1])[0] + else: + return self._atom_numbers def set_header(self, mol_name): """ @@ -231,7 +237,7 @@ def get_structure(self, model=None): # the number of lines will be calculated from the number # of atoms field in the file (counts how many lines with numbers # there are within the file which are not name lines) - if len(names) == 0 or len(atom_number) == 0: + if names is None or atom_number is None: self.set_header("[MOLNAME]") self.__update_start_lines() @@ -335,9 +341,9 @@ def set_structure(self, atoms): for i, atom in enumerate(atoms): line = " " + str(atom.element) - line += " " + "{: .{}f}".format(atom.coord[0], 5) - line += " " + "{: .{}f}".format(atom.coord[1], 5) - line += " " + "{: .{}f}".format(atom.coord[2], 5) + line += " {:<11.{}f}".format(atom.coord[0], 6) + line += " {:<11.{}f}".format(atom.coord[1], 6) + line += " {:<11.{}f}".format(atom.coord[2], 6) line += " " self.lines[i+2] = line @@ -353,10 +359,11 @@ def set_structure(self, atoms): self.lines[i*n_lines_per_model+1] = " " + str(i) for j, atom in enumerate(atoms_i): - line = " " + str(atom.element) - line += " " + "{: .{}f}".format(atom.coord[0], 5) - line += " " + "{: .{}f}".format(atom.coord[1], 5) - line += " " + "{: .{}f}".format(atom.coord[2], 5) + line = " " + str(atom.element) + print(atom.coord) + line += " {:>11.{}f}".format(atom.coord[0], 6) + line += " {:>11.{}f}".format(atom.coord[1], 6) + line += " {:>11.{}f}".format(atom.coord[2], 6) line += " " self.lines[i*n_lines_per_model+j+2] = line diff --git a/tests/structure/test_generalio.py b/tests/structure/test_generalio.py index b844530c1..6fc71ccf6 100644 --- a/tests/structure/test_generalio.py +++ b/tests/structure/test_generalio.py @@ -155,15 +155,29 @@ def test_saving_with_extra_args(suffix): temp.close() -def test_small_molecule(): + +@pytest.mark.parametrize( + "path", + glob.glob(join(data_dir("structure"), "molecules", "*.sdf")) + + + glob.glob(join(data_dir("structure"), "molecules", "*.mol")) + + + glob.glob(join(data_dir("structure"), "molecules", "*.xyz")) + + + glob.glob(join(data_dir("structure"), "molecules", "*.mol2")) + +) +def test_small_molecule(path): """ Check if loading a small molecule file written via :func:`save_structure()` gives the same result as the input to :func:`save_structure()`. """ - path = join(data_dir("structure"), "molecules", "TYR.sdf") +# path = join(data_dir("structure"), "molecules", "TYR.sdf") + suffix = path.split(".")[-1] ref_array = strucio.load_structure(path) - temp = NamedTemporaryFile("w", suffix=".sdf", delete=False) + #temp = NamedTemporaryFile("w", suffix=".sdf", delete=False) + temp = NamedTemporaryFile("w", suffix=f".{suffix}", delete=False) strucio.save_structure(temp.name, ref_array) temp.close() diff --git a/tests/structure/test_mol2.py b/tests/structure/test_mol2.py index 9d00a1c60..3e4a1dbd2 100644 --- a/tests/structure/test_mol2.py +++ b/tests/structure/test_mol2.py @@ -134,17 +134,9 @@ def test_structure_conversion(path): instance_cond = isinstance(ref_atoms, AtomArray) instance_cond = instance_cond | isinstance(ref_atoms, AtomArrayStack) assert instance_cond + assert test_atoms == ref_atoms + assert test_atoms.bonds == ref_atoms.bonds - if isinstance(ref_atoms, AtomArray): - # actually no idea why we can assume that this works - # since floating point comparison is not safe! - assert test_atoms == ref_atoms - assert test_atoms.bonds == ref_atoms.bonds - elif isinstance(ref_atoms, AtomArrayStack): - for i in range(ref_atoms.shape[0]): - assert np.all(np.isclose(ref_atoms[i].coord, test_atoms[i].coord)) - assert np.all(ref_atoms[i].element == test_atoms[i].element) - assert np.all(ref_atoms.bonds == test_atoms.bonds) @pytest.mark.parametrize( "path", @@ -207,31 +199,12 @@ def test_charge_rounding(path): instance_cond = instance_cond | isinstance(ref_atoms, AtomArrayStack) assert instance_cond - if isinstance(ref_atoms, AtomArray): - # actually no idea why we can assume that this works - # since floating point comparison is not safe! - assert test_atoms == ref_atoms - assert test2_atoms == ref_atoms - - assert test_atoms.bonds == ref_atoms.bonds - assert test2_atoms.bonds == ref_atoms.bonds - - assert np.all(np.rint(ref_partial_charges) == test_charges) - assert np.all(ref_partial_charges == test2_charges) - - elif isinstance(ref_atoms, AtomArrayStack): - for i in range(ref_atoms.shape[0]): - assert np.all(np.isclose(ref_atoms[i].coord, test_atoms[i].coord)) - assert np.all(np.isclose(ref_atoms[i].coord, test2_atoms[i].coord)) - assert np.all(ref_atoms[i].element == test_atoms[i].element) - assert np.all(ref_atoms[i].element == test2_atoms[i].element) - assert np.all(ref_atoms.bonds == test_atoms.bonds) - assert np.all(ref_atoms.bonds == test2_atoms.bonds) - assert np.all( - np.isclose(np.rint(ref_partial_charges[i]), test_charges[i]) - ) - assert np.all( - np.isclose(ref_partial_charges[i], test2_charges[i]) - ) + assert test_atoms == ref_atoms + assert test2_atoms == ref_atoms - + assert test_atoms.bonds == ref_atoms.bonds + assert test2_atoms.bonds == ref_atoms.bonds + + assert np.all(np.rint(ref_partial_charges) == test_charges) + assert np.all(ref_partial_charges == test2_charges) + diff --git a/tests/structure/test_xyz.py b/tests/structure/test_xyz.py index 59547fcbb..98071299f 100644 --- a/tests/structure/test_xyz.py +++ b/tests/structure/test_xyz.py @@ -41,7 +41,7 @@ def test_header_conversion(): "3D", "Lorem", "Ipsum", "123", "Lorem ipsum dolor sit amet" ) - # draw this many random Atoms for structure + # draw this many random atoms for structure # necessary as header should only exist for a non empty XYZFile N_sample = 10 @@ -60,8 +60,8 @@ def test_header_conversion(): temp.close() - assert mol_names[0] == name - assert atom_numbers[0] == N_sample + assert mol_names == name + assert atom_numbers == N_sample @pytest.mark.parametrize( @@ -98,15 +98,8 @@ def test_structure_conversion(path): instance_cond = isinstance(ref_atoms, AtomArray) instance_cond = instance_cond | isinstance(ref_atoms, AtomArrayStack) - assert instance_cond - - if isinstance(ref_atoms, AtomArray): - # actually no idea why we can assume that this works - # since floating point comparison is not safe! - assert test_atoms == ref_atoms - elif isinstance(ref_atoms, AtomArrayStack): - for i in range(ref_atoms.shape[0]): - assert np.all(np.isclose(ref_atoms[i].coord, test_atoms[i].coord)) - assert np.all(ref_atoms[i].element == test_atoms[i].element) + assert instance_cond + assert test_atoms == ref_atoms + From dd19716107ab1e2dc717b7aff1aeb199b01674af Mon Sep 17 00:00:00 2001 From: entropybit Date: Sun, 4 Sep 2022 20:52:16 +0200 Subject: [PATCH 21/37] Update src/biotite/structure/io/ctab.py Co-authored-by: Patrick Kunzmann --- src/biotite/structure/io/ctab.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/biotite/structure/io/ctab.py b/src/biotite/structure/io/ctab.py index 6bf115a0f..e33d8c2d2 100644 --- a/src/biotite/structure/io/ctab.py +++ b/src/biotite/structure/io/ctab.py @@ -11,8 +11,6 @@ __author__ = "Patrick Kunzmann" __all__ = ["read_structure_from_ctab", "write_structure_to_ctab"] -import traceback - import warnings import numpy as np from biotite.structure.error import BadStructureError From 040f9c332ea49904feeeee74a0fa5abdbd25d371 Mon Sep 17 00:00:00 2001 From: entropybit Date: Sun, 4 Sep 2022 20:52:27 +0200 Subject: [PATCH 22/37] Update src/biotite/structure/io/ctab.py Co-authored-by: Patrick Kunzmann --- src/biotite/structure/io/ctab.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/biotite/structure/io/ctab.py b/src/biotite/structure/io/ctab.py index e33d8c2d2..a262ed94a 100644 --- a/src/biotite/structure/io/ctab.py +++ b/src/biotite/structure/io/ctab.py @@ -165,6 +165,5 @@ def write_structure_to_ctab(atoms, default_bond_type=BondType.ANY): def _get_counts(counts_line): - elements = counts_line.split() return int(elements[0]), int(elements[1]) From d979cec7c1d4a5c400eb96bd5b4e4bbc9f8e24f1 Mon Sep 17 00:00:00 2001 From: entropybit Date: Sun, 4 Sep 2022 20:52:39 +0200 Subject: [PATCH 23/37] Update src/biotite/structure/io/general.py Co-authored-by: Patrick Kunzmann --- src/biotite/structure/io/general.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/biotite/structure/io/general.py b/src/biotite/structure/io/general.py index b1f55de19..ccb2590d0 100644 --- a/src/biotite/structure/io/general.py +++ b/src/biotite/structure/io/general.py @@ -133,8 +133,8 @@ def load_structure(file_path, template=None, **kwargs): from .xyz import XYZFile file = XYZFile.read(file_path) array = file.get_structure(**kwargs) - # XYZFile automaticall detects if to return - # AomArray or AtomArrayStack + # XYZFile automatically detects if to return + # AtomArray or AtomArrayStack return array elif suffix == ".mol2": from .mol2 import MOL2File From ada8e760ca10aaf6d9e3f688e9900d8ae3ffb359 Mon Sep 17 00:00:00 2001 From: entropybit Date: Sun, 4 Sep 2022 20:52:47 +0200 Subject: [PATCH 24/37] Update src/biotite/structure/io/general.py Co-authored-by: Patrick Kunzmann --- src/biotite/structure/io/general.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/biotite/structure/io/general.py b/src/biotite/structure/io/general.py index ccb2590d0..14a9e70cc 100644 --- a/src/biotite/structure/io/general.py +++ b/src/biotite/structure/io/general.py @@ -126,8 +126,8 @@ def load_structure(file_path, template=None, **kwargs): from .sdf import SDFile file = SDFile.read(file_path) array = file.get_structure(**kwargs) - # SDFile automaticall detects if to return - # AomArray or AtomArrayStack + # SDFile automatically detects if to return + # AtomArray or AtomArrayStack return array elif suffix == ".xyz": from .xyz import XYZFile From d193ae7c7a0c7dcb70eabf13adfdda5bf7bcfeb0 Mon Sep 17 00:00:00 2001 From: entropybit Date: Sun, 4 Sep 2022 20:52:56 +0200 Subject: [PATCH 25/37] Update src/biotite/structure/io/general.py Co-authored-by: Patrick Kunzmann --- src/biotite/structure/io/general.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/biotite/structure/io/general.py b/src/biotite/structure/io/general.py index 14a9e70cc..565b70b44 100644 --- a/src/biotite/structure/io/general.py +++ b/src/biotite/structure/io/general.py @@ -140,8 +140,8 @@ def load_structure(file_path, template=None, **kwargs): from .mol2 import MOL2File file = MOL2File.read(file_path) array = file.get_structure(**kwargs) - # MOL2File automaticall detects if to return - # AomArray or AtomArrayStack + # MOL2File automatically detects if to return + # AtomArray or AtomArrayStack return array elif suffix in [".trr", ".xtc", ".tng", ".dcd", ".netcdf"]: if template is None: From 882a5bfeb256d2abfcbdc328aae8788fd57f3c18 Mon Sep 17 00:00:00 2001 From: entropybit Date: Sun, 4 Sep 2022 20:54:10 +0200 Subject: [PATCH 26/37] Update src/biotite/structure/io/mol2/file.py Co-authored-by: Patrick Kunzmann --- src/biotite/structure/io/mol2/file.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/biotite/structure/io/mol2/file.py b/src/biotite/structure/io/mol2/file.py index 25cfc389f..8d5a0f19a 100644 --- a/src/biotite/structure/io/mol2/file.py +++ b/src/biotite/structure/io/mol2/file.py @@ -165,9 +165,6 @@ def get_sybyl_atom_type(atom, bonds, atom_id): return "C.2" elif len(atom_bonds) == 1: return "C.3" - # else: - # msg = "No supported sybyl Atom type for Atom " + str(atom) - # raise ValueError(msg) return "C.3" if atom.element == "N": if 5 in types: From 92a5aa75b5e0c1806036190bb88c24f007bb9110 Mon Sep 17 00:00:00 2001 From: Benjamin Mayer Date: Sun, 4 Sep 2022 20:57:16 +0200 Subject: [PATCH 27/37] Bega pep8 checking + reformatting in file.py as well as adding get_model_count function. --- src/biotite/structure/io/xyz/convert.py | 22 ++++- src/biotite/structure/io/xyz/file.py | 109 +++++++++++++----------- 2 files changed, 79 insertions(+), 52 deletions(-) diff --git a/src/biotite/structure/io/xyz/convert.py b/src/biotite/structure/io/xyz/convert.py index 272b58c0c..2c41fb2fd 100644 --- a/src/biotite/structure/io/xyz/convert.py +++ b/src/biotite/structure/io/xyz/convert.py @@ -4,7 +4,7 @@ __name__ = "biotite.structure.io.xyz" __author__ = "Benjamin E. Mayer" -__all__ = ["get_structure", "set_structure"] +__all__ = ["get_structure", "set_structure", "get_model_count"] @@ -12,7 +12,7 @@ def get_structure(xyz_file, model=None): """ Get an :class:`AtomArray` from the XYZ File. - Ths function is a thin wrapper around + This function is a thin wrapper around :meth:`XYZFile.get_structure(xyz_file, model)`. Parameters @@ -43,7 +43,7 @@ def set_structure(xyz_file, atoms): Set the :class:`AtomArray` for the XYZ File or :class:`AtomArrayStack for a XYZ File with multiple states. - Ths function is a thin wrapper around + This function is a thin wrapper around :meth:`XYZFile.set_structure()`. Parameters @@ -56,3 +56,19 @@ def set_structure(xyz_file, atoms): model will be set to an index enumerating them. """ xyz_file.set_structure(atoms) + + +def get_model_count(xyz_file): + """ + Get the number of models contained in the xyz file. + + This function is a thin wrapper around + :meth:`XYZFile.get_model_count()`. + + Returns + ------- + model_count : int + The number of models. + """ + return xyz_file.get_model_count() + diff --git a/src/biotite/structure/io/xyz/file.py b/src/biotite/structure/io/xyz/file.py index 9a64c790d..c9173e7bd 100644 --- a/src/biotite/structure/io/xyz/file.py +++ b/src/biotite/structure/io/xyz/file.py @@ -48,36 +48,32 @@ class XYZFile(TextFile): 0 C 1.215 0.701 0.000 0 H 2.157 1.245 0.000 - """ - + """ def __init__(self): super().__init__() # empty header lines self.lines = [""] * N_HEADER + # internal variables for storing and writing the header self._mol_names = None - self._atom_numbers = None + self._atom_numbers = [-1] self._model_start_inds = None self._structures = None self._model_start_inds = None - + + def __update_start_lines(self): """ Internal function that is used to update the _model_start_inds private member variable where the indices of where a new model within the xyz file read starts is stored. """ - # Line indices where a new model starts -> where number of atoms - # is written down as number - + # is written down as number self._model_start_inds = np.array( [i for i in range(len(self.lines)) if self.lines[i].strip().isdigit()], dtype=int ) -# -# print(" ... pre processing ... ") -# print("|model_start_inds| :: " + str(self._model_start_inds)) if self._model_start_inds.shape[0] > 1: # if the mol name line only contains an integer @@ -99,12 +95,59 @@ def __update_start_lines(self): )[0]+1 ) ) - ] + ] elif self._model_start_inds.shape[0] == 2: self._model_start_inds = self._model_start_inds[:1] - - def get_header(self, model=None): - + + def __get_number_of_atoms(self): + """ + This calculates the number of atoms from the previously read + file. + """ + if len(self.lines) > N_HEADER: + lines_parsed = [x.split() for x in self.lines] + # All lines containing less then 4 elements after split() have to be + # header lines based upon the structure of an xyz file. + inds=np.array( + [ + i for i in range( + len(lines_parsed) + ) if len(lines_parsed[i]) != 4 + ] + ) + # If there is only one model contained we can simply count + # and return the number of lines after the header. + if inds.shape[0] == 2: + return [int(len(self.lines[2:]))] + # otherwise if there are multiple models we can derive the + # number of atoms per model by counting the lines between the + # headers and subtracting 2. + else: + # indices of second header lines + inds=inds[np.where(inds[1:]-inds[:-1]!=1)[0]] + line_lengths = inds[1:]-inds[:-1]-2 + if np.unique(line_lengths.shape)[0] > 1: + msg = "File contains different molecules." + msg += "Currently only multiple models of the same molecule" + msg += "are supported within one file" + raise BadStructureError(msg) + return line_lengths + else: + return self._atom_numbers + + def get_model_count(self): + """ + Get the number of models contained in the xyz file. + + Returns + ------- + model_count : int + The number of models. + """ + return len(self.__get_number_of_atoms) + + + def get_header(self, model=None): """ Get the header from the XYZ file. @@ -114,12 +157,10 @@ def get_header(self, model=None): The number of atoms per model mol_name : str The name of the molecule or the names of the multiple models - """ - + """ # Line indices where a new model starts -> where number of atoms # is written down as number self.__update_start_lines() - # parse all atom_numbers into integers if self._atom_numbers is None: self._atom_numbers = [ @@ -138,38 +179,8 @@ def get_header(self, model=None): return self._atom_numbers[0], self._mol_names[0] else: return self._atom_numbers, self._mol_names - - def __get_number_of_atoms(self): - """ - This calculates the number of atoms from the previously read - file. - """ - if len(self.lines) > N_HEADER: - print(self.lines) - lines_parsed = [x.split() for x in self.lines] - inds=np.array( - [ - i for i in range( - len(lines_parsed) - ) if len(lines_parsed[i]) != 4 - ] - ) - if inds.shape[0] == 2: - return int(len(self.lines[2:])) - else: - inds=inds[np.where(inds[1:]-inds[:-1]!=1)[0]] - line_lengths=np.unique(inds[1:]-inds[:-1]) - if line_lengths.shape[0] > 1: - msg = "File contains different molecules." - msg += "Currently only multiple models of the same molecule" - msg += "are supported within one file" - raise BadStructureError(msg) - - return np.unique(inds[1:]-inds[:-1])[0] - else: - return self._atom_numbers - + def set_header(self, mol_name): """ Set the header for the XYZ file. @@ -188,7 +199,7 @@ def set_header(self, mol_name): if(len(self.lines) > 2): self.lines[1] = str(mol_name) - self.lines[0] = str(self.__get_number_of_atoms()) + self.lines[0] = str(self.__get_number_of_atoms()[0]) self._mol_names = [mol_name] self._atom_numbers = [int(self.lines[0])] From 8e640677e8e7efdd2758ca2f0e6623467120a97b Mon Sep 17 00:00:00 2001 From: Benjamin Mayer Date: Mon, 12 Sep 2022 03:47:37 +0200 Subject: [PATCH 28/37] PEP8 checking on file.py in xyz, also added myself to contributors list --- src/biotite/structure/io/xyz/file.py | 252 ++++++++++++--------------- 1 file changed, 107 insertions(+), 145 deletions(-) diff --git a/src/biotite/structure/io/xyz/file.py b/src/biotite/structure/io/xyz/file.py index c9173e7bd..91a51795b 100644 --- a/src/biotite/structure/io/xyz/file.py +++ b/src/biotite/structure/io/xyz/file.py @@ -18,23 +18,25 @@ class XYZFile(TextFile): """ - This class represents a file in XYZ format, which is a very simple + This class represents a file in XYZ format, which is a very simple file format where only a molecule_name in form of a string and the - number of atoms is contained in the header. + number of atoms is contained in the header. Followed by as many lines containing atom element and 3D coordinates. - + References ---------- - + .. footbibliography:: - + Examples -------- >>> from os.path import join - >>> mol_file = XYZFile.read(join(path_to_structures, "molecules", "BENZ.xyz")) + >>> mol_file = XYZFile.read( + ... join(path_to_structures, "molecules", "BENZ.xyz") + ... ) >>> atom_array = xyz_file.get_structure() - >>> print(atom_array) + >>> print(atom_array) 0 C 0.000 1.403 0.000 0 H 0.000 2.490 0.000 0 C -1.215 0.701 0.000 @@ -48,118 +50,118 @@ class XYZFile(TextFile): 0 C 1.215 0.701 0.000 0 H 2.157 1.245 0.000 - """ + """ def __init__(self): super().__init__() # empty header lines self.lines = [""] * N_HEADER # internal variables for storing and writing the header self._mol_names = None - self._atom_numbers = [-1] + self._atom_numbers = None self._model_start_inds = None self._structures = None self._model_start_inds = None - def __update_start_lines(self): - """ + """ Internal function that is used to update the _model_start_inds - private member variable where the indices of where a new + private member variable where the indices of where a new model within the xyz file read starts is stored. """ # Line indices where a new model starts -> where number of atoms - # is written down as number + # is written down as number self._model_start_inds = np.array( - [i for i in range(len(self.lines)) - if self.lines[i].strip().isdigit()], - dtype=int + [ + i for i in range(len(self.lines)) + if self.lines[i].strip().isdigit() + ], + dtype=int ) - - if self._model_start_inds.shape[0] > 1: + + if self._model_start_inds.shape[0] > 1: # if the mol name line only contains an integer - # these lines will appear in model_start_inds - # if calculated as above, therfore we purge all + # these lines will appear in model_start_inds + # if calculated as above, therfore we purge all # indices that have a distance of 1 to their previous index # (this will not work with a file containing multiple models - # with solely one coordinate / atom per model ) + # with solely one coordinate / atom per model ) self._model_start_inds = self._model_start_inds[ np.concatenate( ( - np.array([0],dtype=int), + np.array([0], dtype=int), np.where( self._model_start_inds[:-1] - - - self._model_start_inds[1:] - != + - + self._model_start_inds[1:] + != -1 )[0]+1 ) ) ] - elif self._model_start_inds.shape[0] == 2: - self._model_start_inds = self._model_start_inds[:1] + elif self._model_start_inds.shape[0] == 2: + self._model_start_inds = self._model_start_inds[:1] def __get_number_of_atoms(self): """ - This calculates the number of atoms from the previously read + This calculates the number of atoms from the previously read file. """ - if len(self.lines) > N_HEADER: + if len(self.lines) > N_HEADER: lines_parsed = [x.split() for x in self.lines] - # All lines containing less then 4 elements after split() have to be - # header lines based upon the structure of an xyz file. - inds=np.array( + # All lines containing less then 4 elements after split() have + # to be header lines based upon the structure of an xyz file. + inds = np.array( [ i for i in range( len(lines_parsed) ) if len(lines_parsed[i]) != 4 ] - ) + ) # If there is only one model contained we can simply count - # and return the number of lines after the header. + # and return the number of lines after the header. if inds.shape[0] == 2: return [int(len(self.lines[2:]))] - # otherwise if there are multiple models we can derive the - # number of atoms per model by counting the lines between the + # otherwise if there are multiple models we can derive the + # number of atoms per model by counting the lines between the # headers and subtracting 2. - else: - # indices of second header lines - inds=inds[np.where(inds[1:]-inds[:-1]!=1)[0]] - line_lengths = inds[1:]-inds[:-1]-2 - if np.unique(line_lengths.shape)[0] > 1: - msg = "File contains different molecules." - msg += "Currently only multiple models of the same molecule" - msg += "are supported within one file" - raise BadStructureError(msg) + else: + # indices of second header lines + inds = inds[np.where(inds[1:]-inds[:-1] != 1)[0]] + line_lengths = inds[1:]-inds[:-1]-2 +# if np.unique(line_lengths.shape)[0] > 1: +# msg = "File contains different molecules." +# msg += "Currently only multiple models of the " +# msg += "same molecule are supported within one file." +# raise BadStructureError(msg) return line_lengths else: return self._atom_numbers - + def get_model_count(self): """ Get the number of models contained in the xyz file. - + Returns ------- model_count : int The number of models. - """ - return len(self.__get_number_of_atoms) - - - def get_header(self, model=None): + """ + return len(self.__get_number_of_atoms) + + def get_header(self, model=None): """ Get the header from the XYZ file. - + Returns ------- atom_number: int The number of atoms per model mol_name : str - The name of the molecule or the names of the multiple models - """ + The name of the molecule or the names of the multiple models + """ # Line indices where a new model starts -> where number of atoms - # is written down as number + # is written down as number self.__update_start_lines() # parse all atom_numbers into integers if self._atom_numbers is None: @@ -168,44 +170,39 @@ def get_header(self, model=None): self.lines[i].strip().strip(" ") ) for i in self._model_start_inds ] - - # parse all lines containing names + + # parse all lines containing names if self._mol_names is None: self._mol_names = [ self.lines[i+1].strip() for i in self._model_start_inds - ] - + ] + if len(self._atom_numbers) == 1: return self._atom_numbers[0], self._mol_names[0] - else: + else: return self._atom_numbers, self._mol_names - - + def set_header(self, mol_name): """ Set the header for the XYZ file. - As the header consist only out of the mol_name and the number - of atoms in the structure / structures this can only be - used after setting a structure. Since the second line - is calculated by counting the - + As the header consist only out of the mol_name and the number + of atoms in the structure / structures this can only be + used after setting a structure. Since the second line + is calculated by counting the + Parameters ---------- mol_name : str The name of the molecule. - + """ - - if(len(self.lines) > 2): - - self.lines[1] = str(mol_name) + + if (len(self.lines) > 2): + self.lines[1] = str(mol_name) self.lines[0] = str(self.__get_number_of_atoms()[0]) - self._mol_names = [mol_name] self._atom_numbers = [int(self.lines[0])] - self.__update_start_lines() - else: raise ValueError( "Can not set header of an empty XYZFile" @@ -213,11 +210,10 @@ def set_header(self, mol_name): "can be derived from set structure" ) - def get_structure(self, model=None): """ Get an :class:`AtomArray` or :class:`AtomArrayStack` from the XYZ file. - + Parameters ---------- model : int, optional @@ -228,32 +224,26 @@ def get_structure(self, model=None): last model insted of the first model. If this parameter is omitted, an :class:`AtomArrayStack` containing all models will be returned, even if the - structure contains only one model. - + structure contains only one model. + Returns ------- array : AtomArray or AtomArrayStack The return type depends on the `model` parameter. - """ - - if len(self.lines) <= 2: + """ + + if len(self.lines) <= 2: raise ValueError( "Trying to get_structure from empty XYZFile" - ) - + ) atom_number, names = self.get_header() - - # set a default head if non present since # the number of lines will be calculated from the number # of atoms field in the file (counts how many lines with numbers # there are within the file which are not name lines) if names is None or atom_number is None: - self.set_header("[MOLNAME]") - + self.set_header("[MOLNAME]") self.__update_start_lines() - - # parse all atom_numbers into integers if self._atom_numbers is None: self._atom_numbers = [ @@ -261,24 +251,18 @@ def get_structure(self, model=None): self.lines[i].strip().strip(" ") ) for i in self._model_start_inds ] - - # parse all lines containing names + # parse all lines containing names if self._mol_names is None: self._mol_names = [ self.lines[i+1].strip() for i in self._model_start_inds ] - - - # parse all coordinates - if self._structures is None: - + # parse all coordinates + if self._structures is None: array_stack = [] - for i, ind in enumerate(self._model_start_inds): ind_end = ind+2 + self._atom_numbers[i] - lines_cut = self.lines[ind:ind_end] + lines_cut = self.lines[ind:ind_end] array = AtomArray(self._atom_numbers[i]) - if self._atom_numbers[i]+2 != len(lines_cut): raise ValueError( "Number of Atoms not matching with coordinate lines" @@ -288,95 +272,73 @@ def get_structure(self, model=None): + "" + " |lines_cut| :: " + str(len(lines_cut)) + " lines_cut :: " + str(lines_cut) - ) - - for j, line in enumerate(lines_cut[2:]): + ) + for j, line in enumerate(lines_cut[2:]): line_parsed = [ - x for x in line.strip().split(" ") if x!= '' - ] + x for x in line.strip().split(" ") if x != '' + ] x = float(line_parsed[1]) y = float(line_parsed[2]) z = float(line_parsed[3]) - - if np.isnan(x) or np.isnan(y) or np.isnan(z): + if np.isnan(x) or np.isnan(y) or np.isnan(z): raise ValueError( "At least one of the coordinates is NaN" "" - "(" + str(x) + "," + str(y) + "," +str(z) + ")" + "(" + str(x) + "," + str(y) + "," + str(z) + ")" "" - ) - - atom = Atom([x,y,z]) - atom.element = line_parsed[0] + ) + atom = Atom([x, y, z]) + atom.element = line_parsed[0] array[j] = atom - - + array_stack.append(array) self._structures = struc.stack(array_stack) - - - - - - - if model is None: + + if model is None: return self._structures else: - return self._structures[model] - - + return self._structures[model] def set_structure(self, atoms): """ Set the :class:`AtomArray` :class:`AtomArrayStack` or for the file. - Based upon the given type of the atoms parameter either a single - model or multiple model XYZFile will be contained within the + Based upon the given type of the atoms parameter either a single + model or multiple model XYZFile will be contained within the lines member variable of this XYZFile instance. - + Parameters ---------- atoms : AtomArray, AtomArrayStack The array to be saved into this file. """ - + if isinstance(atoms, AtomArray): - n_atoms = atoms.shape[0] self.lines[0] = str(n_atoms) if len(self.lines[1]) == 0: self.lines[1] = str("[MOLNAME]") + self.lines += [""] * n_atoms - - for i, atom in enumerate(atoms): - line = " " + str(atom.element) + line = " " + str(atom.element) line += " {:<11.{}f}".format(atom.coord[0], 6) line += " {:<11.{}f}".format(atom.coord[1], 6) line += " {:<11.{}f}".format(atom.coord[2], 6) line += " " self.lines[i+2] = line - elif isinstance(atoms, AtomArrayStack): n_lines_per_model = atoms[0].shape[0]+2 - - self.lines += [""] * n_lines_per_model*atoms.shape[0] - for i, atoms_i in enumerate(atoms): - self.lines[i*n_lines_per_model] = str(atoms[0].shape[0]) self.lines[i*n_lines_per_model+1] = " " + str(i) - for j, atom in enumerate(atoms_i): - line = " " + str(atom.element) - print(atom.coord) + line = " " + str(atom.element) + print(atom.coord) line += " {:>11.{}f}".format(atom.coord[0], 6) line += " {:>11.{}f}".format(atom.coord[1], 6) line += " {:>11.{}f}".format(atom.coord[2], 6) line += " " - self.lines[i*n_lines_per_model+j+2] = line - - - + self.lines[i*n_lines_per_model+j+2] = line From a34a344dbb81bcb62cdb206b1cbd272158b61bb4 Mon Sep 17 00:00:00 2001 From: Benjamin Mayer Date: Mon, 12 Sep 2022 04:38:33 +0200 Subject: [PATCH 29/37] Added test for get_model_count in XYZFiles, found some missing functionality with this (was not working properly before). Also made test_xyz.py conforming with PEP8 codestyle. --- tests/structure/test_xyz.py | 65 +++++++++++++++++++++++-------------- 1 file changed, 41 insertions(+), 24 deletions(-) diff --git a/tests/structure/test_xyz.py b/tests/structure/test_xyz.py index 98071299f..f211ea712 100644 --- a/tests/structure/test_xyz.py +++ b/tests/structure/test_xyz.py @@ -1,7 +1,6 @@ # This source code is part of the Biotite package and is distributed # under the 3-Clause BSD License. Please see 'LICENSE.rst' for further # information. - import itertools import datetime from tempfile import TemporaryFile @@ -17,7 +16,14 @@ def draw_random_struct(N_atoms): + """ + This function is used to draw a randoms AtomArray with given + number of N_atoms + Parameters + --- + N_atoms: + """ return struc.array( [ Atom( @@ -40,26 +46,19 @@ def test_header_conversion(): str(datetime.datetime.now().replace(second=0, microsecond=0)), "3D", "Lorem", "Ipsum", "123", "Lorem ipsum dolor sit amet" ) - # draw this many random atoms for structure # necessary as header should only exist for a non empty XYZFile N_sample = 10 - for name in ref_names: - xyz_file = xyz.XYZFile() xyz_file.set_structure(draw_random_struct(N_sample)) - xyz_file.set_header(name) - print(xyz_file) + xyz_file.set_header(name) temp = TemporaryFile("w+") xyz_file.write(temp) - temp.seek(0) xyz_file = xyz.XYZFile.read(temp) atom_numbers, mol_names = xyz_file.get_header() - temp.close() - assert mol_names == name assert atom_numbers == N_sample @@ -67,7 +66,34 @@ def test_header_conversion(): @pytest.mark.parametrize( "path", glob.glob(join(data_dir("structure"), "molecules", "*.xyz")) -# [x for x in glob.glob(join(data_dir("structure"), "molecules", "*.xyz")) if "CO" not in x], +) +def test_model_count(path): + + model_counts = { + "10000_docked": 9, + "10000_docked_1": 1, + "10000_docked_2": 1, + "ADP": 1, + "aspirin_2d": 1, + "aspirin_3d": 1, + "BENZ": 1, + "CO2": 6, + "HArF": 1, + "HWB": 1, + "lorazepam": 1, + "nu7026_conformers": 6, + "TYR": 1, + "CYN": 1, + "zinc_33_conformers": 30, + } + name = path.split("/")[-1].split(".")[0] + xyz_file = xyz.XYZFile.read(path) + assert xyz.get_model_count(xyz_file) == model_counts[name] + + +@pytest.mark.parametrize( + "path", + glob.glob(join(data_dir("structure"), "molecules", "*.xyz")) ) def test_structure_conversion(path): """ @@ -78,28 +104,19 @@ def test_structure_conversion(path): xyz format. """ xyz_file = xyz.XYZFile.read(path) - - - ref_atoms = xyz.get_structure(xyz_file) - - xyz_file = xyz.XYZFile() xyz.set_structure(xyz_file, ref_atoms) temp = TemporaryFile("w+") xyz_file.write(temp) - - + # read previously written XYZFile temp.seek(0) - xyz_file = xyz.XYZFile.read(temp) + xyz_file = xyz.XYZFile.read(temp) test_atoms = xyz.get_structure(xyz_file) temp.close() - - + # test if correct instance instance_cond = isinstance(ref_atoms, AtomArray) instance_cond = instance_cond | isinstance(ref_atoms, AtomArrayStack) - assert instance_cond + assert instance_cond + # and if coordinates match assert test_atoms == ref_atoms - - - From a4e63a14bfcf50d427682c74bd079e0ca262507c Mon Sep 17 00:00:00 2001 From: Benjamin Mayer Date: Mon, 12 Sep 2022 05:23:32 +0200 Subject: [PATCH 30/37] Forgot contrib as well as changes to xyz file. Made some changes also in conver to expose header get/set Also added tests for this. --- CONTRIB.rst | 1 + src/biotite/structure/io/xyz/convert.py | 79 ++++++++++++---- src/biotite/structure/io/xyz/file.py | 100 +++++++++++++------- tests/structure/test_xyz.py | 119 ++++++++++++++++++++---- 4 files changed, 228 insertions(+), 71 deletions(-) diff --git a/CONTRIB.rst b/CONTRIB.rst index 99078a47d..dc385364f 100644 --- a/CONTRIB.rst +++ b/CONTRIB.rst @@ -9,3 +9,4 @@ CONTRIBUTORS - Thomas Nevolianis - Maximilian Greil - Claude J. Rogers +- Benjamin E. Mayer diff --git a/src/biotite/structure/io/xyz/convert.py b/src/biotite/structure/io/xyz/convert.py index 2c41fb2fd..103a72fb4 100644 --- a/src/biotite/structure/io/xyz/convert.py +++ b/src/biotite/structure/io/xyz/convert.py @@ -4,8 +4,11 @@ __name__ = "biotite.structure.io.xyz" __author__ = "Benjamin E. Mayer" -__all__ = ["get_structure", "set_structure", "get_model_count"] - +__all__ = [ + "get_structure", "set_structure", + "get_header", "set_header", + "get_model_count" +] def get_structure(xyz_file, model=None): @@ -19,24 +22,24 @@ def get_structure(xyz_file, model=None): ---------- xyz_file : XYZFile The XYZ File. - + Returns ------- array : AtomArray, AtomArrayStack The return type depends on the `model` parameter. In either case if only a single model is contained in the ``xyz_file``, - or the model parameter has been given, a class:`AtomArray` object + or the model parameter has been given, a class:`AtomArray` object will be returned. This :class:`AtomArray` only contains the ``element`` annotation category, all other annotations are empty, as only - element type and coordinates are contained for the atoms in an + element type and coordinates are contained for the atoms in an *.xyz file. - Respectively if no model parameter has been specified and the - ``xyz_file`` contains multiple models a class:`AtomArrayStack` - object will be returned. Of course this class:`AtomArrayStack` + Respectively if no model parameter has been specified and the + ``xyz_file`` contains multiple models a class:`AtomArrayStack` + object will be returned. Of course this class:`AtomArrayStack` object also will only contain the ``element`` category. """ return xyz_file.get_structure(model) - + def set_structure(xyz_file, atoms): """ @@ -45,25 +48,68 @@ def set_structure(xyz_file, atoms): This function is a thin wrapper around :meth:`XYZFile.set_structure()`. - + Parameters ---------- xyz_file : XYZFile The XYZ File. array : AtomArray or AtomArrayStack - The array to be saved into this file. If a stack is given, each array in - the stack will be in a separate model and the names of the + The array to be saved into this file. If a stack is given, each + array in the stack will be in a separate model and the names of the model will be set to an index enumerating them. """ xyz_file.set_structure(atoms) - - + + +def get_header(xyz_file, model=None): + """ + Get the header line / lines from the XYZFile. + + This function is a thin wrapper around + :meth:`XYZFile.get_header(model)`. + + Parameters + ---------- + xyz_file : XYZFile + The XYZ File. + + Returns + ------- + array : [int, str], [list(int), list(str)] + The return type depends on the `model` parameter. + """ + return xyz_file.get_header(model) + + +def set_header(xyz_file, mol_name, model=None): + """ + Set the header of the XYZFile,i.e., modifies the molecule name + contained in the files. Based on the model field this might mean + changing the molecule name of only single models to potentially different + names. + + This function is a thin wrapper around + :meth:`XYZFile.set_header(mol_name)`. + + Parameters + ---------- + xyz_file : XYZFile + The XYZ File. + mol_name : str + Molecule name that should be set in header. + model: int, optional + If given this specifies to which model in the XYZFile the header + modification should be done to. + """ + xyz_file.set_header(mol_name, model) + + def get_model_count(xyz_file): """ Get the number of models contained in the xyz file. - + This function is a thin wrapper around - :meth:`XYZFile.get_model_count()`. + :meth:`XYZFile.get_model_count()`. Returns ------- @@ -71,4 +117,3 @@ def get_model_count(xyz_file): The number of models. """ return xyz_file.get_model_count() - diff --git a/src/biotite/structure/io/xyz/file.py b/src/biotite/structure/io/xyz/file.py index 91a51795b..70d3aebb6 100644 --- a/src/biotite/structure/io/xyz/file.py +++ b/src/biotite/structure/io/xyz/file.py @@ -107,36 +107,31 @@ def __get_number_of_atoms(self): This calculates the number of atoms from the previously read file. """ - if len(self.lines) > N_HEADER: - lines_parsed = [x.split() for x in self.lines] - # All lines containing less then 4 elements after split() have - # to be header lines based upon the structure of an xyz file. - inds = np.array( - [ - i for i in range( - len(lines_parsed) - ) if len(lines_parsed[i]) != 4 - ] - ) - # If there is only one model contained we can simply count - # and return the number of lines after the header. - if inds.shape[0] == 2: - return [int(len(self.lines[2:]))] - # otherwise if there are multiple models we can derive the - # number of atoms per model by counting the lines between the - # headers and subtracting 2. - else: - # indices of second header lines - inds = inds[np.where(inds[1:]-inds[:-1] != 1)[0]] - line_lengths = inds[1:]-inds[:-1]-2 -# if np.unique(line_lengths.shape)[0] > 1: -# msg = "File contains different molecules." -# msg += "Currently only multiple models of the " -# msg += "same molecule are supported within one file." -# raise BadStructureError(msg) - return line_lengths + lines_parsed = [x.split() for x in self.lines] + # All lines containing less then 4 elements after split() have + # to be header lines based upon the structure of an xyz file. + inds = np.array( + [ + i for i in range( + len(lines_parsed) + ) if len(lines_parsed[i]) != 4 + ] + ) + print(inds.astype(int)) + print(np.array(self.lines)[inds.astype(int)]) + print(inds.shape[0]/2) + # If there is only one model contained we can simply count + # and return the number of lines after the header. + if inds.shape[0] <= 2: + return [int(len(self.lines[2:]))] + # otherwise if there are multiple models we can get atom + # count lines by only considering the first of the two lines + # per model else: - return self._atom_numbers + num_atoms = int(inds.shape[0]/2) + inds = np.array([inds[2*i] for i in range(num_atoms)]) + line_lengths = np.array(self.lines)[inds.astype(int)] + return line_lengths def get_model_count(self): """ @@ -147,12 +142,18 @@ def get_model_count(self): model_count : int The number of models. """ - return len(self.__get_number_of_atoms) + return len(self.__get_number_of_atoms()) def get_header(self, model=None): """ Get the header from the XYZ file. + Parameters + ---------- + model: int, optional + Specifies for which of the models contained in this XYZFile + the according header should be returned. + Returns ------- atom_number: int @@ -170,19 +171,26 @@ def get_header(self, model=None): self.lines[i].strip().strip(" ") ) for i in self._model_start_inds ] - # parse all lines containing names if self._mol_names is None: self._mol_names = [ self.lines[i+1].strip() for i in self._model_start_inds ] - if len(self._atom_numbers) == 1: + if model is not None: + if model > len(self._atom_numbers): + msg = "Tried to get header of model ["+str(model) + "]." + msg += " But has only " + str(len(self._atom_numbers)) + msg += " many models." + raise ValueError(msg) + else: + return self._atom_numbers[model], self._mol_names[model] + elif len(self._atom_numbers) == 1: return self._atom_numbers[0], self._mol_names[0] else: return self._atom_numbers, self._mol_names - def set_header(self, mol_name): + def set_header(self, mol_name, model=None): """ Set the header for the XYZ file. As the header consist only out of the mol_name and the number @@ -194,10 +202,27 @@ def set_header(self, mol_name): ---------- mol_name : str The name of the molecule. - + model: int, optional + If this parameter is set only the molecule name of the + specified models header will be modified. """ - if (len(self.lines) > 2): + # call get_header first if member variables are still None + # meaning if header hasn't been read yet + if self._mol_names is None: + self.get_header() + + if model is not None: + if len(self._mol_names) > model: + self._mol_names[model] = mol_name + else: + msg = "Specified model value [" + str(model) + "] is not" + msg += "compatible with number of models [" + msg += str(self.get_model_count()) + "]" + raise ValueError( + msg + ) + elif (len(self.lines) > 2): self.lines[1] = str(mol_name) self.lines[0] = str(self.__get_number_of_atoms()[0]) self._mol_names = [mol_name] @@ -297,7 +322,10 @@ def get_structure(self, model=None): self._structures = struc.stack(array_stack) if model is None: - return self._structures + if self._structures.shape[0] == 1: + return self._structures[0] + else: + return self._structures else: return self._structures[model] diff --git a/tests/structure/test_xyz.py b/tests/structure/test_xyz.py index f211ea712..2666dfca5 100644 --- a/tests/structure/test_xyz.py +++ b/tests/structure/test_xyz.py @@ -14,6 +14,26 @@ import biotite.structure.io.xyz as xyz from ..util import data_dir +# dictionary used for encoding prior knowledge regarding +# model count in different test cases +model_counts = { + "10000_docked": 9, + "10000_docked_1": 1, + "10000_docked_2": 1, + "ADP": 1, + "aspirin_2d": 1, + "aspirin_3d": 1, + "BENZ": 1, + "CO2": 6, + "HArF": 1, + "HWB": 1, + "lorazepam": 1, + "nu7026_conformers": 6, + "TYR": 1, + "CYN": 1, + "zinc_33_conformers": 30, +} + def draw_random_struct(N_atoms): """ @@ -68,29 +88,68 @@ def test_header_conversion(): glob.glob(join(data_dir("structure"), "molecules", "*.xyz")) ) def test_model_count(path): - - model_counts = { - "10000_docked": 9, - "10000_docked_1": 1, - "10000_docked_2": 1, - "ADP": 1, - "aspirin_2d": 1, - "aspirin_3d": 1, - "BENZ": 1, - "CO2": 6, - "HArF": 1, - "HWB": 1, - "lorazepam": 1, - "nu7026_conformers": 6, - "TYR": 1, - "CYN": 1, - "zinc_33_conformers": 30, - } + """ + Test the get_model_count function based on known number of models + from the test caes listed in the dictionary above. + """ name = path.split("/")[-1].split(".")[0] xyz_file = xyz.XYZFile.read(path) assert xyz.get_model_count(xyz_file) == model_counts[name] +@pytest.mark.parametrize( + "path", + glob.glob(join(data_dir("structure"), "molecules", "*.xyz")) +) +def test_get_header(path): + """ + Test the get_model_count function based on known number of models + from the test caes listed in the dictionary above. + """ + name = path.split("/")[-1].split(".")[0] + xyz_file = xyz.XYZFile.read(path) + + if model_counts[name] > 1: + atom_number, mol_name = xyz.get_header(xyz_file) + assert type(atom_number) == list + assert type(mol_name) == list + assert len(atom_number) == len(mol_name) + assert len(mol_name) == model_counts[name] + # test if single header retrieve by model + # yields same result + for i in range(model_counts[name]): + a_number_i, m_name_i = xyz.get_header(xyz_file, model=i) + assert a_number_i == atom_number[i] + assert m_name_i == mol_name[i] + else: + atom_number, mol_name = xyz.get_header(xyz_file) + assert type(atom_number) == int + assert type(mol_name) == str + + +@pytest.mark.parametrize( + "path", + glob.glob(join(data_dir("structure"), "molecules", "*.xyz")) +) +def test_set_header(path): + """ + Test if set header works on files with multiple models, based + on model + """ + name = path.split("/")[-1].split(".")[0] + xyz_file = xyz.XYZFile.read(path) + + if model_counts[name] > 1: + atom_number, mol_name = xyz.get_header(xyz_file) + # test if single header retrieve by model + # yields same result + for i in range(model_counts[name]): + xyz.set_header(xyz_file, str(i), model=i) + atom_number_new, mol_name_new = xyz.get_header(xyz_file) + assert atom_number_new[i] == atom_number[i] + assert mol_name_new[i] == str(i) + + @pytest.mark.parametrize( "path", glob.glob(join(data_dir("structure"), "molecules", "*.xyz")) @@ -120,3 +179,27 @@ def test_structure_conversion(path): assert instance_cond # and if coordinates match assert test_atoms == ref_atoms + + +@pytest.mark.parametrize( + "path", + glob.glob(join(data_dir("structure"), "molecules", "*.xyz")) +) +def test_get_structure(path): + """ + Test the get_structure function based on known number of models + from the test cases listed in the dictionary above. + """ + name = path.split("/")[-1].split(".")[0] + xyz_file = xyz.XYZFile.read(path) + + if model_counts[name] > 1: + struct = xyz.get_structure(xyz_file) + assert isinstance(struct, AtomArrayStack) + for i in range(model_counts[name]): + struct_i = xyz.get_structure(xyz_file, model=i) + assert type(struct_i) == AtomArray + assert np.all(struct[i].coord == struct_i.coord) + else: + struct = xyz.get_structure(xyz_file) + assert isinstance(struct, AtomArray) From dd54098ba405635e438e00666fae2d79e389195e Mon Sep 17 00:00:00 2001 From: Benjamin Mayer Date: Mon, 12 Sep 2022 11:50:52 +0200 Subject: [PATCH 31/37] Retrieving file name from absolute path now done in a way that it should also work with windows paths. --- tests/structure/test_xyz.py | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/tests/structure/test_xyz.py b/tests/structure/test_xyz.py index 2666dfca5..3a617dc74 100644 --- a/tests/structure/test_xyz.py +++ b/tests/structure/test_xyz.py @@ -35,6 +35,25 @@ } +def retrieve_file_name_from_path(path): + """ + Like the name says this function is a helper to get + the filename (without extension) from the absolute path. + In order to access the model_counts. + """ + if "/" in path: + name = path.split("/")[-1] + elif "\\" in path: + name = path.splot("\\")[-1] + else: + raise ValueError( + "Neither '/' nor '\\' used as path seperators" + ) + + name = name.split(".")[0] + return name + + def draw_random_struct(N_atoms): """ This function is used to draw a randoms AtomArray with given @@ -92,7 +111,7 @@ def test_model_count(path): Test the get_model_count function based on known number of models from the test caes listed in the dictionary above. """ - name = path.split("/")[-1].split(".")[0] + name = retrieve_file_name_from_path(path) xyz_file = xyz.XYZFile.read(path) assert xyz.get_model_count(xyz_file) == model_counts[name] @@ -106,7 +125,7 @@ def test_get_header(path): Test the get_model_count function based on known number of models from the test caes listed in the dictionary above. """ - name = path.split("/")[-1].split(".")[0] + name = retrieve_file_name_from_path(path) xyz_file = xyz.XYZFile.read(path) if model_counts[name] > 1: @@ -136,7 +155,7 @@ def test_set_header(path): Test if set header works on files with multiple models, based on model """ - name = path.split("/")[-1].split(".")[0] + name = retrieve_file_name_from_path(path) xyz_file = xyz.XYZFile.read(path) if model_counts[name] > 1: @@ -190,9 +209,8 @@ def test_get_structure(path): Test the get_structure function based on known number of models from the test cases listed in the dictionary above. """ - name = path.split("/")[-1].split(".")[0] + name = retrieve_file_name_from_path(path) xyz_file = xyz.XYZFile.read(path) - if model_counts[name] > 1: struct = xyz.get_structure(xyz_file) assert isinstance(struct, AtomArrayStack) From 501b07df98c297db3332c8c5dcd489e3696b94ee Mon Sep 17 00:00:00 2001 From: Benjamin Mayer Date: Mon, 12 Sep 2022 12:16:55 +0200 Subject: [PATCH 32/37] Typo in retrieve_file_name_from_path, hopefully working now with windows paths also... --- tests/structure/test_xyz.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/structure/test_xyz.py b/tests/structure/test_xyz.py index 3a617dc74..c1238fea6 100644 --- a/tests/structure/test_xyz.py +++ b/tests/structure/test_xyz.py @@ -44,7 +44,7 @@ def retrieve_file_name_from_path(path): if "/" in path: name = path.split("/")[-1] elif "\\" in path: - name = path.splot("\\")[-1] + name = path.split("\\")[-1] else: raise ValueError( "Neither '/' nor '\\' used as path seperators" From a0e05d7674cdf68c4b7e9cada32677a4462e63a6 Mon Sep 17 00:00:00 2001 From: Benjamin Mayer Date: Mon, 12 Sep 2022 13:26:59 +0200 Subject: [PATCH 33/37] MOL2File all files have conformity to PEP8 now. --- src/biotite/structure/io/mol2/__init__.py | 3 +- src/biotite/structure/io/mol2/convert.py | 30 +- src/biotite/structure/io/mol2/file.py | 796 ++++++++++------------ 3 files changed, 366 insertions(+), 463 deletions(-) diff --git a/src/biotite/structure/io/mol2/__init__.py b/src/biotite/structure/io/mol2/__init__.py index a571bae75..26ea5e32e 100644 --- a/src/biotite/structure/io/mol2/__init__.py +++ b/src/biotite/structure/io/mol2/__init__.py @@ -6,7 +6,8 @@ The MOL format is used to depict atom positions and bonds for small molecules. This subpackage is used for reading and writing an :class:`AtomArray` or -an :class:`AtomArrayStack` for a file containing multiple models in this format. +an :class:`AtomArrayStack` for a file containing multiple models +in this format. """ __name__ = "biotite.structure.io.mol2" diff --git a/src/biotite/structure/io/mol2/convert.py b/src/biotite/structure/io/mol2/convert.py index 08da3cffa..aeb9ada08 100644 --- a/src/biotite/structure/io/mol2/convert.py +++ b/src/biotite/structure/io/mol2/convert.py @@ -10,7 +10,6 @@ ] - def get_structure(mol2_file): """ Get an :class:`AtomArray` from the MOL2 File. @@ -22,18 +21,18 @@ def get_structure(mol2_file): ---------- mol2_file : MOL2File The MOL2File. - + Returns ------- array : AtomArray, AtomArrayStack Return an AtomArray or AtomArrayStack containing the structure or - structures depending on if file contains single or multiple models. + structures depending on if file contains single or multiple models. If something other then `NO_CHARGE` is set in the charge_type field - of the according mol2 file, the AtomArray or AtomArrayStack will + of the according mol2 file, the AtomArray or AtomArrayStack will contain the charge field. """ return mol2_file.get_structure() - + def set_structure(mol2_file, atoms): """ @@ -41,7 +40,7 @@ def set_structure(mol2_file, atoms): Ths function is a thin wrapper around :meth:`MOL2File.set_structure(atoms)`. - + Parameters ---------- mol2_file : MOL2File @@ -53,21 +52,20 @@ def set_structure(mol2_file, atoms): MOL2 charge column. """ mol2_file.set_structure(atoms) - - + def get_charges(mol2_file): """ Get an ndarray containing the partial charges from the MOL2File - Ths function is a thin wrapper around + This function is a thin wrapper around :meth:`MOL2File.get_charges()`. Parameters ---------- xyz_file : XYZFile The XYZ File. - + Returns ------- array : AtomArray @@ -76,8 +74,8 @@ def get_charges(mol2_file): All other annotation categories, except ``element`` are empty. """ - return mol2_file.get_charges() - + return mol2_file.get_charges() + def set_charges(mol2_file, charges): """ @@ -92,8 +90,8 @@ def set_charges(mol2_file, charges): mol2_file: MOL2File The MOL2File charges: ndarray - A ndarray containing data with `float` type to be written as - partial charges. - + A ndarray containing data with `float` type to be written as + partial charges. + """ - return mol2_file.set_charges(charges) + return mol2_file.set_charges(charges) diff --git a/src/biotite/structure/io/mol2/file.py b/src/biotite/structure/io/mol2/file.py index 8d5a0f19a..76b841a62 100644 --- a/src/biotite/structure/io/mol2/file.py +++ b/src/biotite/structure/io/mol2/file.py @@ -9,41 +9,37 @@ import numpy as np import biotite.structure as struc from biotite.structure.error import BadStructureError -from ...atoms import AtomArray,AtomArrayStack, Atom, BondList +from ...atoms import AtomArray, AtomArrayStack, Atom, BondList from ....file import TextFile - - - class MOL2File(TextFile): """ - This class represents a file in MOL2 format. - - Notes: + This class represents a file in MOL2 format. + + Notes: - For multiple models the same header for all models is assumed. - As biotites charge field in the AtomArray and AtomArrayStack class - is typed as int this class adds a field charges containing the + is typed as int this class adds a field charges containing the real valued charges contained in MOL2 files. - The heuristic function for deriving sybyl atom types doesn't work yet, for now we only write C.ar in the according column as the - sybyl atom type is one of the necessary fields for a complete - MOL2File. - + sybyl atom type is one of the necessary fields for a complete + MOL2File. + References ---------- - + .. footbibliography:: - - - + Examples -------- - >>> from os.path import join - >>> mol_file = MOL2File.read(join(path_to_structures, "molecules", "nu7026.mol2")) + >>> mol_file = MOL2File.read( + ... join(path_to_structures, "molecules", "nu7026.mol2") + ... ) >>> atom_array = mol2_file.get_structure() - >>> print(atom_array) + >>> print(atom_array) 1 UNL O 0.867 0.134 0.211 1 UNL C 2.090 0.096 0.147 1 UNL C 2.835 -1.164 0.071 @@ -65,97 +61,91 @@ class MOL2File(TextFile): 1 UNL O 6.238 4.918 -0.733 1 UNL C 6.369 3.772 -1.593 1 UNL C 6.282 2.457 -0.799 - - - - """ - - + # mapping to get biotite bonds based on entry in MOL2File bonds sybyl_to_biotite_bonds = { - "1": struc.BondType.SINGLE, "2": struc.BondType.DOUBLE, "3": struc.BondType.TRIPLE, - "am": None, # amide not really supported in biotite yet - "ar": struc.BondType.AROMATIC_SINGLE, # questionable if this is okay since we have up to 3 formats for aromatic bonds - "du": None, # no idea what dummy is + "am": None, # amide not really supported in biotite yet + # questionable if this is okay since we have + # up to 3 formats for aromatic bonds + "ar": struc.BondType.AROMATIC_SINGLE, + "du": None, # no idea what dummy is "un": struc.BondType.ANY, "nc": None, } + # revers of the mapping to write correct bonds biotite_bonds_to_sybyl = { 1: "1", - 2: "2", + 2: "2", 3: "3", 5: "ar", - 0: "un", + 0: "un", } - + # list of supported values for the charge_type supported_charge_types = [ - "NO_CHARGES", "DEL_RE", "GASTEIGER", - "GAST_HUCK", "HUCKEL", "PULLMAN", - "GAUSS80_CHARGES", "AMPAC_CHARGES", - "MULLIKEN_CHARGES", "DICT_CHARGES", + "NO_CHARGES", "DEL_RE", "GASTEIGER", + "GAST_HUCK", "HUCKEL", "PULLMAN", + "GAUSS80_CHARGES", "AMPAC_CHARGES", + "MULLIKEN_CHARGES", "DICT_CHARGES", "MMFF94_CHARGES", "USER_CHARGES" ] - - + # list of supporte molecule types supported_mol_types = [ "SMALL", "BIOPOLYMER", "PROTEIN", "NUCLEIC_ACID", "SACCHARIDE" - ] - + ] + # list of suppored sybyl bit types sybyl_status_bit_types = [ - "system", "invalid_charges", "analyzed", "substituted", "altered", "ref_angle" + "system", "invalid_charges", + "analyzed", "substituted", "altered", "ref_angle" ] - - # field that contains all accepted two letter elements - # this is used for deriving if sperate atom_name and element - # columns should be generated. If only two letter atom_name entries in the + # this is used for deriving if sperate atom_name and element + # columns should be generated. If only two letter atom_name entries in the # mol2 file are found that are contained here, the atom_name entry will be - # assumed to only contain element names. + # assumed to only contain element names. elements_twoLetters = [ "LI", "NA", "MG", "AL", "SI", "CA", "CR", "MN", "FE", "CO", "CU", "CL", "BR", "ZN", "SE", "MO", "SN", "AR" - ] - - @staticmethod + ] + + @staticmethod def get_sybyl_atom_type(atom, bonds, atom_id): """ - This (horible horribel) function is meant to translate all occuring + This function is meant to translate all occuring atoms into sybyl atom types based on their element and bonds. This mostly works now but some of the special cases are not implemented. Also it is not clear if there is some further special handling for the two letter element atoms or if their sybyl_atom_type is simply the same string with the second letter to lower case. - + Parameters ---------- atom : Atom - The Atom object which is to be translated + The Atom object which is to be translated into sybyl atom_type notation - + bonds: BondList The BondList object of the respective bonds in the AtomArray. - Necessary as the sybyl atom types depend on the hybridiziation + Necessary as the sybyl atom types depend on the hybridiziation heuristic. - + atom_id: int - The id of the current atom that is used in the bond list. - + The id of the current atom that is used in the bond list. + Returns - ------- + ------- sybyl_atom_type : str - The name of the atom based on hybridization and element according - to the sybyl atom types. - + The name of the atom based on hybridization and element + according to the sybyl atom types. + """ - atom_bonds, types = bonds.get_bonds(atom_id) - - if atom.element == "C": + atom_bonds, types = bonds.get_bonds(atom_id) + if atom.element == "C": if 5 in types: return "C.ar" else: @@ -164,24 +154,24 @@ def get_sybyl_atom_type(atom, bonds, atom_id): elif len(atom_bonds) == 2: return "C.2" elif len(atom_bonds) == 1: - return "C.3" + return "C.3" return "C.3" - if atom.element == "N": + if atom.element == "N": if 5 in types: return "N.ar" - else: + else: if len(atom_bonds) == 3: return "N.1" elif len(atom_bonds) == 2: return "N.2" elif len(atom_bonds) == 1: - return "N.3" + return "N.3" if atom.element == "O": if len(atom_bonds) == 2: return "O.3" elif len(atom_bonds) == 1: - return "O.2" - + return "O.2" + if atom.element == "S": return "S.3" if atom.element == "P": @@ -191,19 +181,19 @@ def get_sybyl_atom_type(atom, bonds, atom_id): if atom.element == "H": return "H" if atom.element == "LI": - return "Li" + return "Li" if atom.element == "NA": - return "Na" + return "Na" if atom.element == "MG": - return "Mg" + return "Mg" if atom.element == "AL": - return "Al" + return "Al" if atom.element == "SI": - return "Si" + return "Si" if atom.element == "K": - return "K" + return "K" if atom.element == "CA": - return "Ca" + return "Ca" if atom.element == "CR": return "Cr.th" if atom.element == "MN": @@ -213,7 +203,7 @@ def get_sybyl_atom_type(atom, bonds, atom_id): if atom.element == "CO": return "Co.oh" if atom.element == "CU": - return "Cu" + return "Cu" if atom.element == "CL": return "Cl" if atom.element == "BR": @@ -229,33 +219,31 @@ def get_sybyl_atom_type(atom, bonds, atom_id): if atom.element == "SN": return "Sn" if atom.element == "AR": - return "Ar" + return "Ar" else: - msg = "sybyl_atom_type not implemented for element ["+str(atom.element) + msg = "sybyl_atom_type not implemented for element [" + msg += str(atom.element) msg += "] " + str(atom) raise ValueError(msg) - @staticmethod def atom_name_to_element(atom_name, sybyl_atom_type): """ This function gets a recorded atom name and sybyl_atom_type and returns - you the according element that this pair should have. - For example it is not possible to arrive from 'CA' if this should be + you the according element that this pair should have. + For example it is not possible to arrive from 'CA' if this should be calcium or the c-alpha Atom of a protein backbone. However together - with the sybyl_atom_type it can be distinguished. + with the sybyl_atom_type it can be distinguished. """ - - # a local function for generating error messages def get_error_msg(atom_name, sybyl_atom_type): - msg = "Not implemented for given atom_name :: " +str(atom_name)+". " - msg += "And given sybyl_atom_type :: " - msg += str(sybyl_atom_type) + "." - return msg + msg = "Not implemented for given atom_name :: " + msg += str(atom_name)+". " + msg += "And given sybyl_atom_type :: " + msg += str(sybyl_atom_type) + "." + return msg carbon_types = ["C.ar", "C.1", "C.2", "C.3"] - if len(atom_name) == 1: return atom_name else: @@ -265,23 +253,22 @@ def get_error_msg(atom_name, sybyl_atom_type): if sybyl_atom_type == "Ca": return atom_name elif sybyl_atom_type in carbon_types: - return "C" - else: + return "C" + else: raise ValueError( get_error_msg(atom_name, sybyl_atom_type) - ) - elif atom_name[:2] in ["CB","CG","CD","CE", "CZ"]: + ) + elif atom_name[:2] in ["CB", "CG", "CD", "CE", "CZ"]: return "C" - elif atom_name[0]=="H" and len(atom_name) > 1: - return sybyl_atom_type - elif atom_name[0]=="O": - return "O" - else: + elif atom_name[0] == "H" and len(atom_name) > 1: + return sybyl_atom_type + elif atom_name[0] == "O": + return "O" + else: raise ValueError( get_error_msg(atom_name, sybyl_atom_type) - ) - - + ) + def __init__(self): super().__init__() self.mol_name = "" @@ -293,18 +280,14 @@ def __init__(self): self.mol_type = "" self.charge_type = "" self.status_bits = "" - self.mol_comment = "" + self.mol_comment = "" self.charges = None - self.ind_molecule = -1 self.ind_atoms = -1 self.ind_bonds = -1 self.sybyl_atom_types = None - def check_valid_mol2(self): - - #self.ind_molecule = np.where("@MOLECULE" in self.lines)[0] self.ind_molecule = [ i for i, x in enumerate(self.lines) if "@MOLECULE" in x ] @@ -313,8 +296,7 @@ def check_valid_mol2(self): "Mol2 File doesn't contain a MOLECULE section, therefore" "it is not possibe to parse this file" ) - - + self.ind_atoms = [ i for i, x in enumerate(self.lines) if "@ATOM" in x ] @@ -323,8 +305,7 @@ def check_valid_mol2(self): "Mol2 File doesn't contain a ATOM section, therefore" "it is not possibe to parse this file" ) - - + self.ind_bonds = [ i for i, x in enumerate(self.lines) if "@BOND" in x ] @@ -333,34 +314,31 @@ def check_valid_mol2(self): "Mol2 File doesn't contain a BOND section, therefore" "it is not possibe to parse this file" ) - + if len(self.ind_molecule) != len(self.ind_atoms): raise ValueError( - "Mol2 File doesn't contain as many MOLECULE sections as it does" - "contain ATOM sections" - - ) + "Mol2 File doesn't contain as many MOLECULE sections as " + "it does contain ATOM sections" + ) + if len(self.ind_molecule) != len(self.ind_bonds): raise ValueError( - "Mol2 File doesn't contain as many MOLECULE sections as it does" - "contain BOND sections" - - ) + "Mol2 File doesn't contain as many MOLECULE sections as " + "it does contain BOND sections" + ) + if len(self.ind_bonds) != len(self.ind_atoms): raise ValueError( "Mol2 File doesn't contain as many BOND sections as it does" "contain ATOM sections" - - ) - - - + ) + def get_header(self): """ Get the header from the MOL2 file, if the file contains multiple models the assumption is made that those all have the same header as a AtomArrayStack of different molecules can't be buil anyways. - + Returns ------- mol_name : str @@ -381,58 +359,53 @@ def get_header(self): MDL registry number. comments : str Additional comments. - """ - - self.check_valid_mol2() + """ + self.check_valid_mol2() self.mol_name = self.lines[self.ind_molecule[0]+1] - numbers_line = self.lines[self.ind_molecule[0]+2] numbers_parsed = [int(x) for x in numbers_line.strip().split(" ")] - self.num_atoms = numbers_parsed[0] if len(numbers_parsed) > 1: self.num_bonds = numbers_parsed[1] - if len(numbers_parsed) > 2: + if len(numbers_parsed) > 2: self.num_subst = numbers_parsed[2] - if len(numbers_parsed) > 3: - self.num_feat = numbers_parsed[3] - if len(numbers_parsed) > 4: - self.num_sets = numbers_parsed[4] - + if len(numbers_parsed) > 3: + self.num_feat = numbers_parsed[3] + if len(numbers_parsed) > 4: + self.num_sets = numbers_parsed[4] - self.mol_type = self.lines[self.ind_molecule[0]+3] + self.mol_type = self.lines[self.ind_molecule[0]+3] self.charge_type = self.lines[self.ind_molecule[0]+4] self.status_bits = self.lines[self.ind_molecule[0]+5] - + if "@" not in self.lines[self.ind_molecule[0]+6]: self.mol_comment = self.lines[self.ind_molecule[0]+6] - + return ( self.mol_name, self.num_atoms, self.mol_type, - self.charge_type, self.num_bonds, self.num_subst, + self.charge_type, self.num_bonds, self.num_subst, self.num_feat, self.num_sets, self.status_bits, self.mol_comment ) - - - - def set_header(self, mol_name, num_atoms, mol_type, charge_type, - num_bonds=-1, num_subst=-1, num_feat=-1, num_sets=-1, - status_bits="", mol_comment=""): + def set_header( + self, mol_name, num_atoms, mol_type, charge_type, + num_bonds=-1, num_subst=-1, num_feat=-1, num_sets=-1, + status_bits="", mol_comment="" + ): """ Set the header for the MOL2 file according the following structure: - + mol_name num_atoms [num_bonds [num_subst [num_feat[num_sets]]]] mol_type charge_type [status_bits [mol_comment]] - - taken from + + taken from https://chemicbook.com/2021/02/20/mol2-file-format-explained-for-beginners-part-2.html - + Parameters ---------- mol_name : str @@ -444,136 +417,120 @@ def set_header(self, mol_name, num_atoms, mol_type, charge_type, BIOPOLYMER, PROTEIN, NUCLEIC_ACID or SACCHARIDE charge_type: str Specifies the used method for calculating the charges if any - are given. May be either NO_CHARGES, DEL_RE, GASTEIGER, - GAST_HUCK, HUCKEL, PULLMAN, GAUSS80_CHARGES, AMPAC_CHARGES, + are given. May be either NO_CHARGES, DEL_RE, GASTEIGER, + GAST_HUCK, HUCKEL, PULLMAN, GAUSS80_CHARGES, AMPAC_CHARGES, MULLIKEN_CHARGES, DICT_CHARGES, MMFF94_CHARGES or USER_CHARGES. - If charge_type is NO_CHARGES the according charge column + If charge_type is NO_CHARGES the according charge column will be ignored even if charges are given. num_bonds: int, optional Number of bonds given as integer, if any. num_subst: int, optional - + num_feat: int, optional - + num_sets: int, optional - + status_bits: str, optional - - mol_comment: str, optional - - + + mol_comment: str, optional """ - - self.mol_name = mol_name - self.num_atoms = num_atoms - + self.mol_name = mol_name + self.num_atoms = num_atoms + if num_bonds >= 0: - self.num_bonds = num_bonds - if num_subst >= 0: - self.num_subst = num_subst - - if num_feat >= 0: - self.num_feat = num_feat - - if num_sets >=0: - self.num_sets = num_sets - + self.num_bonds = num_bonds + if num_subst >= 0: + self.num_subst = num_subst + + if num_feat >= 0: + self.num_feat = num_feat + + if num_sets >= 0: + self.num_sets = num_sets + header = [ mol_name, num_atoms, mol_type, charge_type, num_bonds, num_subst, num_feat, num_sets, status_bits, mol_comment ] - print(header) - + if mol_type != "": cond = mol_type in MOL2File.supported_mol_types if not cond: - msg = "The specified molecule type ["+str(charge_type) +"] \n" + msg = "The specified molecule type [" + msg += str(charge_type) + "] \n" msg += " is not among the supported molecule types: \n" - msg += "" + str(MOL2File.supported_mol_types) + "\n" - msg += "header :: " + str(header) + " \n" + msg += "" + str(MOL2File.supported_mol_types) + "\n" + msg += "header :: " + str(header) + " \n" raise ValueError(msg) - self.mol_type = mol_type - - if charge_type != "": + self.mol_type = mol_type + if charge_type != "": cond = charge_type in MOL2File.supported_charge_types if not cond: - msg = "The specified charge type ["+str(charge_type) +"] " + msg = "The specified charge type [" + msg += str(charge_type) + "] " msg += " is not among the supported charge types: \n" msg += str(MOL2File.supported_charge_types) + "\n" - raise ValueError(msg) - - self.charge_type = charge_type - - self.status_bits = status_bits - self.mol_comment = mol_comment - - #if len(self.lines)==0: + raise ValueError(msg) + + self.charge_type = charge_type + self.status_bits = status_bits + self.mol_comment = mol_comment if self.status_bits != "": self.lines = [""]*5 self.lines[4] = self.status_bits else: - self.lines = [""]*6 + self.lines = [""]*6 self.lines[4] = self.status_bits self.lines[5] = self.mol_comment - + self.lines[0] = "@MOLECULE" self.ind_molecule = [0] self.lines[1] = self.mol_name - line = " " + str(self.num_atoms) if self.num_bonds >= 0: line += " " + str(self.num_bonds) - if self.num_subst >= 0: line += " " + str(self.num_subst) - if self.num_feat >= 0: line += " " + str(self.num_feat) - if self.num_sets >= 0: line += " " + str(self.num_sets) - - self.lines[2] = line + + self.lines[2] = line self.lines[3] = self.mol_type self.lines[4] = self.charge_type - - self.lines[5] = self.status_bits + self.lines[5] = self.status_bits if self.status_bits != "": self.lines[6] = self.mol_comment - - self.ind_atoms = [len(self.lines)] - - + + self.ind_atoms = [len(self.lines)] def get_structure(self): """ Get an :class:`AtomArray` from the MOL2 file. - + Returns ------- array : AtomArray or AtomArrayStack - This :class:`AtomArray` contains the optional ``charge`` annotation - and has an associated :class:`BondList`. Furthermore the optional - ``atom_id`` will be set based upon the first column of the MOL2File. - If the atom_name column contains only element names, only the - ``element`` category will be filled. However, if the atom_name - column contains actual atom_names like, e.g., `CA` for a backbone - C-alpha atom, this will be used to set the ``atom_name`` category, - and according elements will be derived from the atom_name and - sybyl_atom_type. + This :class:`AtomArray` contains the optional ``charge`` annotation + and has an associated :class:`BondList`. Furthermore the optional + ``atom_id`` will be set based upon the first column of the + MOL2File. If the atom_name column contains only element names, + only the ``element`` category will be filled. However, if + the atom_name column contains actual atom_names like, e.g., + `CA` for a backbone C-alpha atom, this will be used to set the + ``atom_name`` category, and according elements will be derived + from the atom_name and sybyl_atom_type. """ - - self.get_header() + + self.get_header() atom_array_stack = [] # instantiate atom array and bonds based on number of atoms information - self.sybyl_atom_types = [] for i in range(len(self.ind_atoms)): - - atoms = AtomArray(self.num_atoms) - + atoms = AtomArray(self.num_atoms) if self.charge_type != "NO_CHARGES": atoms.add_annotation("charge", int) if self.charges is None: @@ -582,241 +539,212 @@ def get_structure(self): ).reshape( (1, self.num_atoms) ) - else: self.charges = np.vstack( ( - self.charges, + self.charges, np.zeros(self.num_atoms) - ) - ) - + ) + ) + bonds = BondList(self.num_atoms) - - # - # Iterate through all the atom lines by stating from line after - # @ATOM until line starting with @ is reached. - # All lines in between are assumed to be atom lines and are parsed - # into atoms accodringly. - # + # Iterate through all the atom lines by stating from line after + # @ATOM until line starting with @ is reached. + # All lines in between are assumed to be atom lines and are parsed + # into atoms accodringly. index = self.ind_atoms[i]+1 j = 0 atom_type_sybl_row = [""]*self.num_atoms atom_names = [] while "@" not in self.lines[index]: - - - line = [x for x in self.lines[index].strip().split(" ") if x != ''] - - - atom_id = int(line[0]) - atom_name = line[1] - x_coord = float(line[2]) - y_coord = float(line[3]) - z_coord = float(line[4]) - atom_type_sybl = line[5] - subst_id = -1 - subst_name = "" - charge = 0.0 - status_bits = "" - + line = [ + x for x in self.lines[index].strip().split(" ") if x != '' + ] + atom_id = int(line[0]) + atom_name = line[1] + x_coord = float(line[2]) + y_coord = float(line[3]) + z_coord = float(line[4]) + atom_type_sybl = line[5] + subst_id = -1 + subst_name = "" + charge = 0.0 + status_bits = "" if len(line) > 6: - subst_id = int(line[6]) - if len(line) > 7: - subst_name = line[7] - if len(line) > 8: - charge = float(line[8]) + subst_id = int(line[6]) + + if len(line) > 7: + subst_name = line[7] + + if len(line) > 8: + charge = float(line[8]) + if len(line) > 9: - status_bits = line[9] - - - - if self.charge_type != "NO_CHARGES": - self.charges[i][j] = charge + status_bits = line[9] + + if self.charge_type != "NO_CHARGES": + self.charges[i][j] = charge atom_i = Atom( [x_coord, y_coord, z_coord], charge=int(np.rint(charge)) - ) + ) else: atom_i = Atom( - [x_coord, y_coord, z_coord], - ) - - atom_i.atom_id = atom_id - #if len(atom_name) - atom_i.element = atom_name + [x_coord, y_coord, z_coord], + ) + + atom_i.atom_id = atom_id + atom_i.element = atom_name atom_names.append(atom_name) - atom_i.res_id = subst_id + atom_i.res_id = subst_id atom_i.res_name = subst_name - - atoms[j] = atom_i - atom_type_sybl_row[j] = atom_type_sybl - index += 1 - j += 1 - + atoms[j] = atom_i + atom_type_sybl_row[j] = atom_type_sybl + index += 1 + j += 1 + # after first teration over structure we need a second pass # to correctly infer atom_names and element if necessary from - # the atom_name and sybyl_atom_type columns + # the atom_name and sybyl_atom_type columns def filter_func(e): - cond = len(e)==1 + cond = len(e) == 1 cond = cond or e in MOL2File.elements_twoLetters + is_atom_names_only_element_names = np.all( [filter_func(e) for e in atoms.element] - ) - - if not is_atom_names_only_element_names: + ) + + if not is_atom_names_only_element_names: filtered = np.array( [len(x) > 1 for x in atom_names] - ) + ) is_atom_name_NOTEQUAL_element = np.any(filtered) - + index = self.ind_atoms[i]+1 j = 0 while "@" not in self.lines[index]: - atom_j = atoms[j] - if is_atom_name_NOTEQUAL_element: atom_name = atom_names[j] - element = MOL2File.atom_name_to_element( atom_names[j], atom_type_sybl_row[j] ) - - - if self.charge_type != "NO_CHARGES": + if self.charge_type != "NO_CHARGES": atoms[j] = Atom( - [ + [ atoms[j].coord[0], atoms[j].coord[1], - atoms[j].coord[2], + atoms[j].coord[2], ], charge=atoms[j].charge, element=element, - atom_name=atom_name, - res_name=atoms[j].res_name, - res_id=atoms[j].res_id - ) + atom_name=atom_name, + res_name=atoms[j].res_name, + res_id=atoms[j].res_id + ) else: atoms[j] = Atom( - [ + [ atoms[j].coord[0], atoms[j].coord[1], - atoms[j].coord[2], + atoms[j].coord[2], ], element=element, - atom_name=atom_name, + atom_name=atom_name, res_name=atoms[j].res_name, - res_id=atoms[j].res_id - ) - + res_id=atoms[j].res_id + ) + else: assert len(atom_names[j]) <= 2 - atoms[j].element = atom_names[j] - - index += 1 + atoms[j].element = atom_names[j] + + index += 1 j += 1 - - - # - # Iterate through all the bond lines by stating from line after - # @BOND until line starting with @ is reached. - # All lines in between are assumed to be atom lines and are parsed - # into atoms accodringly. - # - index = self.ind_bonds[i] +1 - while index < len(self.lines) and "@" not in self.lines[index]: - + + # Iterate through all the bond lines by stating from line after + # @BOND until line starting with @ is reached. + # All lines in between are assumed to be atom lines and are parsed + # into atoms accodringly. + index = self.ind_bonds[i] + 1 + while index < len(self.lines) and "@" not in self.lines[index]: line = [ x for x in self.lines[index].strip().split(" ") if x != '' ] - - bond_id = int(line[0]) - origin_atom_id = int(line[1]) - target_atom_id = int(line[2]) - bond_typ = MOL2File.sybyl_to_biotite_bonds[str(line[3])] - status_bits = "" - + bond_id = int(line[0]) + origin_atom_id = int(line[1]) + target_atom_id = int(line[2]) + bond_typ = MOL2File.sybyl_to_biotite_bonds[str(line[3])] + status_bits = "" if len(line) > 4: - status_bits = str(line[4]) - - if bond_typ is not None: + status_bits = str(line[4]) + + if bond_typ is not None: bonds.add_bond( origin_atom_id-1, target_atom_id-1, bond_typ - ) - - index += 1 + ) + + index += 1 - atoms.bonds = bonds atom_array_stack.append(atoms) self.sybyl_atom_types.append(atom_type_sybl_row) - + if len(atom_array_stack) == 1: return atom_array_stack[0] else: - return struc.stack(atom_array_stack) - - + return struc.stack(atom_array_stack) + def __append_atom_array(self, atoms, charges=None): """ Internal function that is used to write a single atom to the lines member variable. """ - - n_atoms = atoms.shape[0] - - self.lines.append("@ATOM") + n_atoms = atoms.shape[0] + self.lines.append("@ATOM") atoms_has_atom_ids = hasattr(atoms, "atom_id") - if charges is not None: assert len(charges) == len(atoms) - + for i, atom in enumerate(atoms): - atom_id = i+1 if atoms_has_atom_ids: atom_id = atom.atom_id - - line = "{:>7}".format(atom_id) - - if (atoms.atom_name is not None) and (len(atom.atom_name)!=0): + + line = "{:>7}".format(atom_id) + if (atoms.atom_name is not None) and (len(atom.atom_name) != 0): line += " {:<7}".format(atom.atom_name) else: - print(" writing atom["+str(i)+"]:: " +str(atom.element)) line += " {:<7}".format(atom.element) - #line += " " + atom.element line += "{:>11.4f}".format(atom.coord[0]) line += "{:>10.4f}".format(atom.coord[1]) - line += "{:>10.4f}".format(atom.coord[2]) + line += "{:>10.4f}".format(atom.coord[2]) line += " {:<8}".format( MOL2File.get_sybyl_atom_type( atom, atoms.bonds, i ) ) - if atom.res_id != 0: + if atom.res_id != 0: line += str(atom.res_id) - + if atom.res_name != "": line += " " + str(atom.res_name) - + if self.charge_type != "NO_CHARGES": - line += " " - if charges is not None: + line += " " + if charges is not None: line += " {: .{}f}".format(charges[i], 4) else: - line += " {: .{}f}".format(atom.charge, 4) - - - self.lines.append(line) - - - self.lines.append("@BOND") + line += " {: .{}f}".format(atom.charge, 4) + + self.lines.append(line) + + self.lines.append("@BOND") for i, bond in enumerate(atoms.bonds.as_array()): - line = "{:>6}".format(i+1) + line = "{:>6}".format(i+1) line += "{:>6}".format(bond[0]+1) line += "{:>6}".format(bond[1]+1) line += "{:>5}".format(MOL2File.biotite_bonds_to_sybyl[bond[2]]) @@ -825,163 +753,139 @@ def __append_atom_array(self, atoms, charges=None): def set_structure(self, atoms): """ Set the :class:`AtomArray` or :class:`AtomArrayStack` for the file. - As a remark the heuristic for deriving the sybyl_atom_type is - currently not complete. It will mostly get it right regarding + As a remark the heuristic for deriving the sybyl_atom_type is + currently not complete. It will mostly get it right regarding hybridization and aromatic bonds. However, some special cases are - not covered yet and some two letter elements might produce an + not covered yet and some two letter elements might produce an error as they might not yet be added to the static MOL2File.elements_twoLetters array. - + Parameters ---------- - array : AtomArray, AtomArrayStack + array : AtomArray, AtomArrayStack The array or stack of arrays to be saved into this file. Must have an associated :class:`BondList`. Also if the header of this MOL2File has it's charge_type field - set to something other then 'NO_CHARGES' the AtomArray or + set to something other then 'NO_CHARGES' the AtomArray or AtomArrayStack must have an associated charge category. - Furthermore, if patial_charges have been given via the + Furthermore, if patial_charges have been given via the set_charges member function, the charge field will be ignored and the set partial_charges will instead be written to the charge - column of the MOl2File. - """ - + column of the MOl2File. + """ if len(self.lines) < 5: - - isArrayStack = lambda x: isinstance(x, AtomArrayStack) - # set skeleton header for file where set_header was not invoked + def isArrayStack(x): + return isinstance(x, AtomArrayStack) + # set skeleton header for file where set_header was not invoked self.set_header( - "", - atoms.shape[1] if isArrayStack(atoms) else atoms.shape[0], - "SMALL", + "", + atoms.shape[1] if isArrayStack(atoms) else atoms.shape[0], + "SMALL", "NO_CHARGES" if atoms.charge is None else "USER_CHARGES" ) - - header_lines = self.lines[:self.ind_atoms[0]] + header_lines = self.lines[:self.ind_atoms[0]] # since setting new structure delete all previously stored # structure information if any - self.lines = self.lines[:self.ind_atoms[0]] - + self.lines = self.lines[:self.ind_atoms[0]] if isinstance(atoms, AtomArray): - - if atoms.bonds is None: raise BadStructureError( "Input AtomArrayStack has no associated BondList" ) - - if self.charge_type != "NO_CHARGES" and atoms.charge is None: - msg = "Specified charge type " + str(self.charge_type) + ".\n" + if self.charge_type != "NO_CHARGES" and atoms.charge is None: + msg = "Specified charge type " + str(self.charge_type) + ".\n" msg += "but given AtomArray has no charges" - raise ValueError(msg) - + raise ValueError if self.num_atoms != atoms.shape[0]: - msg = "Mismatch between number of atoms in header [" + msg = "Mismatch between number of atoms in header [" msg += str(self.num_atoms) + "] and number of atoms in given" msg += "AtomArray [" + str(atoms.shape[0]) + "]" - raise ValueError(msg) + raise ValueError(msg) - if self.charges is not None: - self.__append_atom_array(atoms, self.charges) + if self.charges is not None: + self.__append_atom_array(atoms, self.charges) else: - self.__append_atom_array(atoms) - - - elif isinstance(atoms, AtomArrayStack): - + self.__append_atom_array(atoms) + + elif isinstance(atoms, AtomArrayStack): if atoms.bonds is None: raise BadStructureError( "Input AtomArrayStack has no associated BondList" ) - if self.charge_type != "NO_CHARGES" and atoms.charge is None: - msg = "Specified charge type " + str(self.charge_type) + ".\n" + if self.charge_type != "NO_CHARGES" and atoms.charge is None: + msg = "Specified charge type " + msg += str(self.charge_type) + ".\n" msg += "but one of given AtomArrays has no charges" - raise ValueError(msg) - + raise ValueError(msg) + if self.num_atoms != atoms.shape[1]: - msg = "Mismatch between number of atoms in header [" + msg = "Mismatch between number of atoms in header [" msg += str(self.num_atoms) + "] and number of atoms in given" msg += "AtomArrayStack [" + str(atoms.shape[1]) + "]" - raise ValueError(msg) - - n_models = atoms.shape[0] - n_atoms = atoms[0].shape[0] - n_bonds = atoms[0].bonds.as_array().shape[0] - - - for i, atoms_i in enumerate(atoms): - - - if i > 0: - for l in header_lines: - self.lines.append(l) + raise ValueError(msg) + + n_models = atoms.shape[0] + n_atoms = atoms[0].shape[0] + n_bonds = atoms[0].bonds.as_array().shape[0] + for i, atoms_i in enumerate(atoms): + if i > 0: + for line in header_lines: + self.lines.append(line) if self.charges is not None: - self.__append_atom_array(atoms_i, self.charges[i]) + self.__append_atom_array(atoms_i, self.charges[i]) else: - self.__append_atom_array(atoms_i) + self.__append_atom_array(atoms_i) - def set_charges(self, charges): + def set_charges(self, charges): """ Set the partial charges. This function specifically does not check if the ndarray dimension fit with a struture already contained as - this might make the process of setting charges to a new empty + this might make the process of setting charges to a new empty MOL2File not containing a structure yet overly complicated. - It is left to the user to get this right, otherwise latest at the stage - of writing the file an error will occur. + It is left to the user to get this right, otherwise latest + at the stage of writing the file an error will occur. Parameters ---------- charges: ndarray - A ndarray containing data with `float` type to be written as - partial charges. - If ndarray has any other type an according error will be raised. + A ndarray containing data with `float` type to be written as + partial charges. + If ndarray has any other type an according error will be raised. """ - - if np.issubdtype(charges.dtype, np.floating): + if np.issubdtype(charges.dtype, np.floating): self.charges = charges else: - raise ValueError("Non floating type provided for charges") - + raise ValueError("Non floating type provided for charges") def get_charges(self): """ - The getter function for retrieving the partial charges from the read MOL2File if it has any. If file with no charges was read and this functoin is called a warning will be given. - Also if the charges member variable is still None this will invoke - the get_structure function, which in turn might raise a BadStructureError - if there is no structure contained. + Also if the charges member variable is still None this will invoke + the get_structure function, which in turn might + raise a BadStructureError if there is no structure contained. Returns ------- charges : ndarray, None Either ndarray of type `float` or None if no partial_charges - where contained. - """ - + where contained. + """ if self.charge_type == "NO_CHARGES": - msg = "The read MOl2File had NO_CHARGES set, therefore" + msg = "The read MOl2File had NO_CHARGES set, therefore" msg += "no partial charges where contained in the file." warning.warn(msg) - return None - + if self.charges is None: _ = self.get_structure() - - + if len(self.charges) == 1: return self.charges[0] - else: - return self.charges - - - - - - + else: + return self.charges From 473f50b7fc19d4a26a448b9fd2419a277a929f57 Mon Sep 17 00:00:00 2001 From: Benjamin Mayer Date: Tue, 13 Sep 2022 04:18:44 +0200 Subject: [PATCH 34/37] Changes in test_mol2 (now also covers using model parameter in get_structure for multi model files). Some cleanup... --- src/biotite/structure/io/mol2/convert.py | 22 +- src/biotite/structure/io/mol2/file.py | 614 +++++++++++++++-------- tests/structure/test_mol2.py | 173 ++++--- 3 files changed, 522 insertions(+), 287 deletions(-) diff --git a/src/biotite/structure/io/mol2/convert.py b/src/biotite/structure/io/mol2/convert.py index aeb9ada08..56bdca0ed 100644 --- a/src/biotite/structure/io/mol2/convert.py +++ b/src/biotite/structure/io/mol2/convert.py @@ -6,11 +6,12 @@ __author__ = "Benjamin E. Mayer" __all__ = [ "get_structure", "set_structure", - "get_charges", "set_charges" + "get_charges", "set_charges", + "get_model_count" ] -def get_structure(mol2_file): +def get_structure(mol2_file, model=None): """ Get an :class:`AtomArray` from the MOL2 File. @@ -31,7 +32,7 @@ def get_structure(mol2_file): of the according mol2 file, the AtomArray or AtomArrayStack will contain the charge field. """ - return mol2_file.get_structure() + return mol2_file.get_structure(model) def set_structure(mol2_file, atoms): @@ -95,3 +96,18 @@ def set_charges(mol2_file, charges): """ return mol2_file.set_charges(charges) + + +def get_model_count(mol2_file): + """ + Get the number of models contained in the xyz file. + + This function is a thin wrapper around + :meth:`MOL2File.get_model_count()`. + + Returns + ------- + model_count : int + The number of models. + """ + return mol2_file.get_model_count() diff --git a/src/biotite/structure/io/mol2/file.py b/src/biotite/structure/io/mol2/file.py index 76b841a62..23b5a57eb 100644 --- a/src/biotite/structure/io/mol2/file.py +++ b/src/biotite/structure/io/mol2/file.py @@ -16,16 +16,21 @@ class MOL2File(TextFile): """ This class represents a file in MOL2 format. + If a completly new instance of this file is to be filled from an + AtomArray or an AtomArrayStack, use set_structure first and modify + the header afterwards with set_header. The reason for this is as + follows: set_structure will assume a skeleton header and automatically + generates as many lines as necessary for the structure as well as a + header (ignoring the molecule_comment line) to be written. + Notes: - For multiple models the same header for all models is assumed. - As biotites charge field in the AtomArray and AtomArrayStack class is typed as int this class adds a field charges containing the real valued charges contained in MOL2 files. - - The heuristic function for deriving sybyl atom types doesn't work - yet, for now we only write C.ar in the according column as the - sybyl atom type is one of the necessary fields for a complete - MOL2File. + - The heuristic function for deriving sybyl might not fully work, + altough it does so for all the test cases. References ---------- @@ -114,7 +119,7 @@ class MOL2File(TextFile): ] @staticmethod - def get_sybyl_atom_type(atom, bonds, atom_id): + def transcribe_sybyl_atom_type(atom, atom_bonds, types, atom_id): """ This function is meant to translate all occuring atoms into sybyl atom types based on their element and bonds. This @@ -125,52 +130,61 @@ def get_sybyl_atom_type(atom, bonds, atom_id): Parameters ---------- - atom : Atom - The Atom object which is to be translated - into sybyl atom_type notation + atom : Atom + The Atom object which is to be translated + into sybyl atom_type notation - bonds: BondList - The BondList object of the respective bonds in the AtomArray. - Necessary as the sybyl atom types depend on the hybridiziation - heuristic. + bonds: BondList + The BondList object of the respective bonds in the AtomArray. + Necessary as the sybyl atom types depend on the hybridiziation + heuristic. - atom_id: int - The id of the current atom that is used in the bond list. + atom_id: int + The id of the current atom that is used in the bond list. Returns ------- - sybyl_atom_type : str - The name of the atom based on hybridization and element - according to the sybyl atom types. + sybyl_atom_type : str + The name of the atom based on hybridization and element + according to the sybyl atom types. """ - atom_bonds, types = bonds.get_bonds(atom_id) + N_bonds = np.where(atom_bonds != -1)[0].shape[0] if atom.element == "C": if 5 in types: return "C.ar" else: - if len(atom_bonds) == 3: + if N_bonds == 3: return "C.1" - elif len(atom_bonds) == 2: + elif N_bonds == 2: return "C.2" - elif len(atom_bonds) == 1: + elif N_bonds == 1: return "C.3" return "C.3" + if atom.element == "N": if 5 in types: return "N.ar" else: - if len(atom_bonds) == 3: + if N_bonds == 3: return "N.1" - elif len(atom_bonds) == 2: + elif N_bonds == 2: return "N.2" - elif len(atom_bonds) == 1: + elif N_bonds == 1: return "N.3" + if atom.element == "O": - if len(atom_bonds) == 2: + if N_bonds == 2: return "O.3" - elif len(atom_bonds) == 1: + elif N_bonds == 1: return "O.2" + else: + msg = "Not implemented for element ["+str(atom.element) + "]" + msg += " and bonds :: ["+str(atom_bonds)+"]" + msg += " | types :: ["+str(types) + "]." + msg += " | len(bonds) :: " + str(N_bonds) + msg += " | 5 in types :: " + str(5 in types) + raise ValueError(msg) if atom.element == "S": return "S.3" @@ -271,73 +285,103 @@ def get_error_msg(atom_name, sybyl_atom_type): def __init__(self): super().__init__() - self.mol_name = "" - self.num_atoms = -1 - self.num_bonds = -1 - self.num_subst = -1 - self.num_feat = -1 - self.num_sets = -1 - self.mol_type = "" - self.charge_type = "" - self.status_bits = "" - self.mol_comment = "" - self.charges = None - self.ind_molecule = -1 - self.ind_atoms = -1 - self.ind_bonds = -1 - self.sybyl_atom_types = None + self._mol_name = None + self._num_atoms = None + self._num_bonds = None + self._num_subst = None + self._num_feat = None + self._num_sets = None + self._mol_type = None + self._charge_type = None + self._status_bits = None + self._mol_comment = None + self._charges = None + self._ind_molecule = None + self._ind_atoms = None + self._ind_bonds = None + self._sybyl_atom_types = None + + def _get_number_of_molecules(self): + """ + Calculates the number of molecules from the lines variable and updates + the according self._ind_molecule variable. + """ + # check if MOL2File has previous content + if self._ind_molecule is None: + self._ind_molecule = [ + i for i, x in enumerate( + self.lines + ) if "@MOLECULE" in x + ] + if len(self._ind_molecule) == 0: + self._ind_molecule = [0] + # Only return 0 molecules if only @MOLECULE at index 0 + # and also less then 6 lines => no coordinates contained + cond = self._ind_molecule == [0] + cond = cond and len(self.lines) <= 6 + N_molecules = 0 if cond else len(self._ind_molecule) + return N_molecules def check_valid_mol2(self): - self.ind_molecule = [ + self._ind_molecule = [ i for i, x in enumerate(self.lines) if "@MOLECULE" in x ] - if len(self.ind_molecule) == 0: + if len(self._ind_molecule) == 0: raise ValueError( "Mol2 File doesn't contain a MOLECULE section, therefore" "it is not possibe to parse this file" ) - self.ind_atoms = [ + self._ind_atoms = [ i for i, x in enumerate(self.lines) if "@ATOM" in x ] - if len(self.ind_atoms) == 0: + if len(self._ind_atoms) == 0: raise ValueError( "Mol2 File doesn't contain a ATOM section, therefore" "it is not possibe to parse this file" ) - self.ind_bonds = [ + self._ind_bonds = [ i for i, x in enumerate(self.lines) if "@BOND" in x ] - if len(self.ind_bonds) == 0: + if len(self._ind_bonds) == 0: raise ValueError( "Mol2 File doesn't contain a BOND section, therefore" "it is not possibe to parse this file" ) - if len(self.ind_molecule) != len(self.ind_atoms): + if len(self._ind_molecule) != len(self._ind_atoms): raise ValueError( "Mol2 File doesn't contain as many MOLECULE sections as " "it does contain ATOM sections" ) - if len(self.ind_molecule) != len(self.ind_bonds): + if len(self._ind_molecule) != len(self._ind_bonds): raise ValueError( "Mol2 File doesn't contain as many MOLECULE sections as " "it does contain BOND sections" ) - if len(self.ind_bonds) != len(self.ind_atoms): + if len(self._ind_bonds) != len(self._ind_atoms): raise ValueError( "Mol2 File doesn't contain as many BOND sections as it does" "contain ATOM sections" ) - def get_header(self): + def get_header(self, model=None): """ Get the header from the MOL2 file, if the file contains multiple - models the assumption is made that those all have the same header - as a AtomArrayStack of different molecules can't be buil anyways. + models all headers are parsed and a list is returned for all + header fields. In this cases a single header can be retrieved by + specifying the model parameter. + + Parameters + ---------- + model: int, optional + Specifies for which of the models contained in this MOL2File + the according header should be returned. + If not specified this will return the header for all models,i.e., + the according returns will be lists. Returns ------- @@ -361,37 +405,131 @@ def get_header(self): Additional comments. """ self.check_valid_mol2() - self.mol_name = self.lines[self.ind_molecule[0]+1] - numbers_line = self.lines[self.ind_molecule[0]+2] - numbers_parsed = [int(x) for x in numbers_line.strip().split(" ")] - self.num_atoms = numbers_parsed[0] - if len(numbers_parsed) > 1: - self.num_bonds = numbers_parsed[1] - if len(numbers_parsed) > 2: - self.num_subst = numbers_parsed[2] - if len(numbers_parsed) > 3: - self.num_feat = numbers_parsed[3] - if len(numbers_parsed) > 4: - self.num_sets = numbers_parsed[4] - - self.mol_type = self.lines[self.ind_molecule[0]+3] - self.charge_type = self.lines[self.ind_molecule[0]+4] - self.status_bits = self.lines[self.ind_molecule[0]+5] - - if "@" not in self.lines[self.ind_molecule[0]+6]: - self.mol_comment = self.lines[self.ind_molecule[0]+6] - - return ( - self.mol_name, self.num_atoms, self.mol_type, - self.charge_type, self.num_bonds, self.num_subst, - self.num_feat, self.num_sets, self.status_bits, - self.mol_comment - ) + # first set all according fields to empty lists + self._mol_name = [] + self._num_atoms = [] + self._num_bonds = [] + self._num_subst = [] + self._num_feat = [] + self._num_sets = [] + self._mol_type = [] + self._charge_type = [] + self._status_bits = [] + self._mol_comment = [] + # iterate through molecules and read headers based on + # index of @MOLECULE, which is used as offset + # within the self.lines variable for parsing. + for ind_mol in self._ind_molecule: + self._mol_name.append(self.lines[ind_mol+1]) + numbers_line = self.lines[ind_mol+2] + numbers_parsed = [int(x) for x in numbers_line.strip().split(" ")] + self._num_atoms.append(numbers_parsed[0]) + num_bonds = -1 + num_subst = -1 + num_feat = -1 + num_sets = -1 + mol_comment = "" + if len(numbers_parsed) > 1: + num_bonds = numbers_parsed[1] + + if len(numbers_parsed) > 2: + num_subst = numbers_parsed[2] + + if len(numbers_parsed) > 3: + num_feat = numbers_parsed[3] + + if len(numbers_parsed) > 4: + num_sets = numbers_parsed[4] + + self._num_bonds.append(num_bonds) + self._num_subst.append(num_bonds) + self._num_feat.append(num_feat) + self._num_sets.append(num_sets) + + self._mol_type.append(self.lines[ind_mol + 3]) + self._charge_type.append(self.lines[ind_mol + 4]) + self._status_bits.append(self.lines[ind_mol + 5]) + if "@" not in self.lines[self._ind_molecule[0] + 6]: + mol_comment = self.lines[self._ind_molecule[0] + 6] + self._mol_comment.append(mol_comment) + + # if there is only one model in file abuse possibly unset + # model parameter to get return only the header entries for this + # However, if model is specified and not 0 in this situation we want + # to raise the ValueError below. + if len(self._ind_molecule) == 1 and model is None or model == 0: + model = 0 + + if model is None: + return ( + self._mol_name, self._num_atoms, self._mol_type, + self._charge_type, self._num_bonds, self._num_subst, + self._num_feat, self._num_sets, self._status_bits, + self._mol_comment + ) + elif model < len(self._ind_molecule): + return ( + self._mol_name[model], self._num_atoms[model], + self._mol_type[model], self._charge_type[model], + self._num_bonds[model], self._num_subst[model], + self._num_feat[model], self._num_sets[model], + self._status_bits[model], self._mol_comment[model] + ) + else: + msg = "model = " + str(model) + " is not compatible with file" + msg += " that has " + str(len(self._ind_molecule)) + " many " + msg += " models." + raise ValueError(msg) + + def _write_header( + self, mol_name, num_atoms, mol_type, charge_type, + num_bonds=-1, num_subst=-1, num_feat=-1, num_sets=-1, + status_bits="", mol_comment="", model=0 + ): + """ + Internal function used to write a single header after + self.lines has been either filled with as many empty lines + as needed before or is still filled from a loaded MOL2File. + """ + N_molecules = len(self._ind_molecule) + if model >= N_molecules: + msg = "Can not write header of model = " + str(model) + msg += " with MOL2File containing " + str(N_molecules) + msg += " models." + raise ValueError(msg) + else: + mol_index = self._ind_molecule[model] + if mol_index > len(self.lines): + msg = "Can not write header to empty file." + msg += " Use set_structure before set_header." + msg += "In set_structure a skeleton header will be" + msg += "generated, which can then be overwritten." + raise ValueError(msg) + + self.lines[mol_index] = "@MOLECULE" + self.lines[mol_index+1] = mol_name + line = " " + str(num_atoms) + if num_bonds >= 0: + line += " " + str(num_bonds) + if num_subst >= 0: + line += " " + str(num_subst) + if num_feat >= 0: + line += " " + str(num_feat) + if num_sets >= 0: + line += " " + str(num_sets) + + self.lines[mol_index+2] = line + self.lines[mol_index+3] = mol_type + self.lines[mol_index+4] = charge_type + self.lines[mol_index+5] = status_bits + if status_bits != "": + self.lines[mol_index+6] = mol_comment def set_header( self, mol_name, num_atoms, mol_type, charge_type, num_bonds=-1, num_subst=-1, num_feat=-1, num_sets=-1, - status_bits="", mol_comment="" + status_bits="", mol_comment="", + model=None, ): """ Set the header for the MOL2 file according the following structure: @@ -403,6 +541,13 @@ def set_header( [status_bits [mol_comment]] + For a file containing multiple different structures, the model + parameter can be used to set the header of the according model. For a + file containing multiple models of the same Atom, i.e, in the case + where an AtomArrayStack can be used, the same header is assumed for + all models. This will be assumed if the MOL2File contains multiple + models and now model parameter was given. + taken from https://chemicbook.com/2021/02/20/mol2-file-format-explained-for-beginners-part-2.html @@ -433,27 +578,20 @@ def set_header( status_bits: str, optional mol_comment: str, optional - """ - self.mol_name = mol_name - self.num_atoms = num_atoms - - if num_bonds >= 0: - self.num_bonds = num_bonds - if num_subst >= 0: - self.num_subst = num_subst - if num_feat >= 0: - self.num_feat = num_feat - - if num_sets >= 0: - self.num_sets = num_sets + model: int, optional + Specifies for which of the models contained in this MOL2File + the according header should be set. + If not specified the header of the first + """ + # define header for potential output via Exceptions header = [ mol_name, num_atoms, mol_type, charge_type, num_bonds, num_subst, num_feat, num_sets, status_bits, mol_comment ] - + # check if mol_type is valid if mol_type != "": cond = mol_type in MOL2File.supported_mol_types if not cond: @@ -464,7 +602,7 @@ def set_header( msg += "header :: " + str(header) + " \n" raise ValueError(msg) - self.mol_type = mol_type + # check if charge_type is valid if charge_type != "": cond = charge_type in MOL2File.supported_charge_types if not cond: @@ -474,46 +612,65 @@ def set_header( msg += str(MOL2File.supported_charge_types) + "\n" raise ValueError(msg) - self.charge_type = charge_type - self.status_bits = status_bits - self.mol_comment = mol_comment - if self.status_bits != "": - self.lines = [""]*5 - self.lines[4] = self.status_bits + N_molecules = self._get_number_of_molecules() + N_molecules = N_molecules if N_molecules != 0 else 1 + # no model given so simply overwrite member variables with list + # containing of same data and write said data to all the headers + if model is None: + self._mol_name = [mol_name]*N_molecules + self._num_atoms = [num_atoms]*N_molecules + self._num_bonds = [num_bonds]*N_molecules + self._num_subst = [num_subst]*N_molecules + self._num_feat = [num_feat]*N_molecules + self._num_sets = [num_sets]*N_molecules + self._mol_type = [mol_type]*N_molecules + self._charge_type = [charge_type]*N_molecules + self._status_bits = [status_bits]*N_molecules + self._mol_comment = [mol_comment]*N_molecules + for model in range(N_molecules): + self._write_header( + mol_name, num_atoms, mol_type, + charge_type, num_bonds, num_subst, + num_feat, num_sets, status_bits, + mol_comment, model=model + ) + elif model < N_molecules: + self._mol_name[model] = mol_name + self._num_atoms[model] = num_atoms + self._num_bonds[model] = num_bonds + self._num_subst[model] = num_subst + self._num_feat[model] = num_feat + self._num_sets[model] = num_sets + self._mol_type[model] = mol_type + self._charge_type[model] = charge_type + self._status_bits[model] = status_bits + self._mol_comment[model] = mol_comment + self._write_header( + mol_name, num_atoms, mol_type, + charge_type, num_bonds, num_subst, + num_feat, num_sets, status_bits, + mol_comment, model=model + ) else: - self.lines = [""]*6 - self.lines[4] = self.status_bits - self.lines[5] = self.mol_comment - - self.lines[0] = "@MOLECULE" - self.ind_molecule = [0] - self.lines[1] = self.mol_name - line = " " + str(self.num_atoms) - if self.num_bonds >= 0: - line += " " + str(self.num_bonds) - if self.num_subst >= 0: - line += " " + str(self.num_subst) - if self.num_feat >= 0: - line += " " + str(self.num_feat) - if self.num_sets >= 0: - line += " " + str(self.num_sets) - - self.lines[2] = line - self.lines[3] = self.mol_type - self.lines[4] = self.charge_type - self.lines[5] = self.status_bits - if self.status_bits != "": - self.lines[6] = self.mol_comment - - self.ind_atoms = [len(self.lines)] - - def get_structure(self): + msg = "Can not write header of model = " + str(model) + msg += " with MOL2File containing " + str(N_molecules) + msg += " models." + raise ValueError(msg) + + def get_structure(self, model=None): """ Get an :class:`AtomArray` from the MOL2 file. + Parameters + ---------- + model: int, optional + If this parameter is set, the according substructure will + be returned. This can be used to read single structures from + a multi model MOL2File, containing different molecules. + Returns ------- - array : AtomArray or AtomArrayStack + array: AtomArray or AtomArrayStack This :class:`AtomArray` contains the optional ``charge`` annotation and has an associated :class:`BondList`. Furthermore the optional ``atom_id`` will be set based upon the first column of the @@ -524,37 +681,38 @@ def get_structure(self): ``atom_name`` category, and according elements will be derived from the atom_name and sybyl_atom_type. """ - self.get_header() + N_molecules = self._get_number_of_molecules() atom_array_stack = [] # instantiate atom array and bonds based on number of atoms information - self.sybyl_atom_types = [] - for i in range(len(self.ind_atoms)): - atoms = AtomArray(self.num_atoms) - if self.charge_type != "NO_CHARGES": + self._sybyl_atom_types = [[] for i in range(N_molecules)] + for i in range(N_molecules): + N_atoms = self._num_atoms[i] + atoms = AtomArray(N_atoms) + if self._charge_type != "NO_CHARGES": atoms.add_annotation("charge", int) - if self.charges is None: - self.charges = np.zeros( - self.num_atoms + if self._charges is None: + self._charges = np.zeros( + N_atoms ).reshape( - (1, self.num_atoms) + (1, N_atoms) ) else: - self.charges = np.vstack( + self._charges = np.vstack( ( - self.charges, - np.zeros(self.num_atoms) + self._charges, + np.zeros(N_atoms) ) ) - bonds = BondList(self.num_atoms) + bonds = BondList(N_atoms) # Iterate through all the atom lines by stating from line after # @ATOM until line starting with @ is reached. # All lines in between are assumed to be atom lines and are parsed # into atoms accodringly. - index = self.ind_atoms[i]+1 + index = self._ind_atoms[i]+1 j = 0 - atom_type_sybl_row = [""]*self.num_atoms + atom_type_sybl_row = [""]*N_atoms atom_names = [] while "@" not in self.lines[index]: line = [ @@ -582,8 +740,8 @@ def get_structure(self): if len(line) > 9: status_bits = line[9] - if self.charge_type != "NO_CHARGES": - self.charges[i][j] = charge + if self._charge_type != "NO_CHARGES": + self._charges[i][j] = charge atom_i = Atom( [x_coord, y_coord, z_coord], charge=int(np.rint(charge)) @@ -620,7 +778,7 @@ def filter_func(e): ) is_atom_name_NOTEQUAL_element = np.any(filtered) - index = self.ind_atoms[i]+1 + index = self._ind_atoms[i]+1 j = 0 while "@" not in self.lines[index]: atom_j = atoms[j] @@ -630,7 +788,7 @@ def filter_func(e): atom_names[j], atom_type_sybl_row[j] ) - if self.charge_type != "NO_CHARGES": + if self._charge_type[i] != "NO_CHARGES": atoms[j] = Atom( [ atoms[j].coord[0], @@ -667,7 +825,7 @@ def filter_func(e): # @BOND until line starting with @ is reached. # All lines in between are assumed to be atom lines and are parsed # into atoms accodringly. - index = self.ind_bonds[i] + 1 + index = self._ind_bonds[i] + 1 while index < len(self.lines) and "@" not in self.lines[index]: line = [ x for x in self.lines[index].strip().split(" ") if x != '' @@ -691,16 +849,24 @@ def filter_func(e): atoms.bonds = bonds atom_array_stack.append(atoms) - self.sybyl_atom_types.append(atom_type_sybl_row) + self._sybyl_atom_types[i].append(atom_type_sybl_row) if len(atom_array_stack) == 1: return atom_array_stack[0] + elif model is not None: + if model < len(atom_array_stack): + return atom_array_stack[model] + else: + msg = "Given model = " + str(model) + " value, incompatible" + msg += " with MOL2File containing only " + msg += str(len(atom_array_stack)) + " many models." + raise ValueError(msg) else: return struc.stack(atom_array_stack) def __append_atom_array(self, atoms, charges=None): """ - Internal function that is used to write a single atom + Internal function that is used to append a single atom to the lines member variable. """ n_atoms = atoms.shape[0] @@ -709,6 +875,7 @@ def __append_atom_array(self, atoms, charges=None): if charges is not None: assert len(charges) == len(atoms) + bonds, types = atoms.bonds.get_all_bonds() for i, atom in enumerate(atoms): atom_id = i+1 if atoms_has_atom_ids: @@ -723,8 +890,8 @@ def __append_atom_array(self, atoms, charges=None): line += "{:>10.4f}".format(atom.coord[1]) line += "{:>10.4f}".format(atom.coord[2]) line += " {:<8}".format( - MOL2File.get_sybyl_atom_type( - atom, atoms.bonds, i + MOL2File.transcribe_sybyl_atom_type( + atom, bonds[i], types[i], i ) ) if atom.res_id != 0: @@ -733,7 +900,7 @@ def __append_atom_array(self, atoms, charges=None): if atom.res_name != "": line += " " + str(atom.res_name) - if self.charge_type != "NO_CHARGES": + if self._charge_type != "NO_CHARGES": line += " " if charges is not None: line += " {: .{}f}".format(charges[i], 4) @@ -759,6 +926,10 @@ def set_structure(self, atoms): not covered yet and some two letter elements might produce an error as they might not yet be added to the static MOL2File.elements_twoLetters array. + Also, this function doesn't support setting specific substructures in + an multi model MOL2File based on a model parameter yet. + This is reflected in self._charges which if previously read from + an MOL2File needs to be set self._charges[0,:]. Parameters ---------- @@ -777,6 +948,7 @@ def set_structure(self, atoms): def isArrayStack(x): return isinstance(x, AtomArrayStack) # set skeleton header for file where set_header was not invoked + self.lines = [""]*6 self.set_header( "", atoms.shape[1] if isArrayStack(atoms) else atoms.shape[0], @@ -784,59 +956,67 @@ def isArrayStack(x): "NO_CHARGES" if atoms.charge is None else "USER_CHARGES" ) - header_lines = self.lines[:self.ind_atoms[0]] + if self._ind_atoms is None: + # if _ind_atoms is None there was no content before + # this means a skeleton header has been written and we can set the + # maximum index consider to the number of lines + self._ind_atoms = [len(self.lines)] + + # if _ind_atoms was not None this will consider mol_comments + header_lines = self.lines[:self._ind_atoms[0]] # since setting new structure delete all previously stored # structure information if any - self.lines = self.lines[:self.ind_atoms[0]] - if isinstance(atoms, AtomArray): - if atoms.bonds is None: - raise BadStructureError( - "Input AtomArrayStack has no associated BondList" - ) + self.lines = self.lines[:self._ind_atoms[0]] - if self.charge_type != "NO_CHARGES" and atoms.charge is None: - msg = "Specified charge type " + str(self.charge_type) + ".\n" - msg += "but given AtomArray has no charges" - raise ValueError - if self.num_atoms != atoms.shape[0]: - msg = "Mismatch between number of atoms in header [" - msg += str(self.num_atoms) + "] and number of atoms in given" - msg += "AtomArray [" + str(atoms.shape[0]) + "]" - raise ValueError(msg) + # check if bonds given + if atoms.bonds is None: + raise BadStructureError( + "Input AtomArrayStack has no associated BondList" + ) + + # check charges type + if self._charge_type != "NO_CHARGES" and atoms.charge is None: + msg = "Specified charge type " + msg += str(self._charge_type) + ".\n" + msg += "but one of given AtomArrays has no charges" + raise ValueError(msg) - if self.charges is not None: - self.__append_atom_array(atoms, self.charges) + # if no partial charges set before set_structure + # use atoms.charge field instead + if self._charges is None and atoms.charge is not None: + self._charges = atoms.charge + elif self._charges is not None and len(self._charges.shape) == 2: + self._charges = self._charges[0, :] + + # check if number of atoms match with header + cond1 = isinstance(atoms, AtomArray) + cond1 = cond1 and (int(self._num_atoms[0]) == int(atoms.shape[0])) + cond2 = isinstance(atoms, AtomArrayStack) + cond2 = cond2 and (int(self._num_atoms[0]) == int(atoms.shape[1])) + if (not cond1) and (not cond2): + msg = "Mismatch between number of atoms in header :: " + msg += str(self._num_atoms[0]) + " and number of atoms in given" + if isinstance(atoms, AtomArray): + msg += " AtomArray :: " + str(atoms.shape[0]) + " " else: - self.__append_atom_array(atoms) + msg += " AtomArrayStack :: " + str(atoms.shape[1]) + " " + raise ValueError(msg) + if isinstance(atoms, AtomArray): + if self._charges is not None: + self.__append_atom_array(atoms, self._charges) + else: + self.__append_atom_array(atoms) elif isinstance(atoms, AtomArrayStack): - if atoms.bonds is None: - raise BadStructureError( - "Input AtomArrayStack has no associated BondList" - ) - - if self.charge_type != "NO_CHARGES" and atoms.charge is None: - msg = "Specified charge type " - msg += str(self.charge_type) + ".\n" - msg += "but one of given AtomArrays has no charges" - raise ValueError(msg) - - if self.num_atoms != atoms.shape[1]: - msg = "Mismatch between number of atoms in header [" - msg += str(self.num_atoms) + "] and number of atoms in given" - msg += "AtomArrayStack [" + str(atoms.shape[1]) + "]" - raise ValueError(msg) - n_models = atoms.shape[0] - n_atoms = atoms[0].shape[0] - n_bonds = atoms[0].bonds.as_array().shape[0] for i, atoms_i in enumerate(atoms): + # as mentioned the same header will be prepended to all + # the other models if i > 0: - for line in header_lines: - self.lines.append(line) + self.lines += header_lines - if self.charges is not None: - self.__append_atom_array(atoms_i, self.charges[i]) + if self._charges is not None: + self.__append_atom_array(atoms_i, self._charges) else: self.__append_atom_array(atoms_i) @@ -846,8 +1026,7 @@ def set_charges(self, charges): if the ndarray dimension fit with a struture already contained as this might make the process of setting charges to a new empty MOL2File not containing a structure yet overly complicated. - It is left to the user to get this right, otherwise latest - at the stage of writing the file an error will occur. + It is left to the user to get this right. Parameters ---------- @@ -857,7 +1036,17 @@ def set_charges(self, charges): If ndarray has any other type an according error will be raised. """ if np.issubdtype(charges.dtype, np.floating): - self.charges = charges + struct = None + header = None + N_molecules = self._get_number_of_molecules() + if N_molecules != 0: + header = self.get_header(model=0) + struct = self.get_structure() + + self._charges = charges + if N_molecules != 0: + self.set_structure(struct) + self.set_header(*header) else: raise ValueError("Non floating type provided for charges") @@ -876,16 +1065,31 @@ def get_charges(self): Either ndarray of type `float` or None if no partial_charges where contained. """ - if self.charge_type == "NO_CHARGES": + if self._charge_type == "NO_CHARGES": msg = "The read MOl2File had NO_CHARGES set, therefore" msg += "no partial charges where contained in the file." warning.warn(msg) return None - if self.charges is None: - _ = self.get_structure() + # If no charges read yet, call get_structure to read + # structure in, including charges. + if self._charges is None: + self.get_structure() - if len(self.charges) == 1: - return self.charges[0] + if len(self._charges) == 1: + return self._charges[0] else: - return self.charges + return self._charges + + def get_model_count(self): + """ + Get the number of models contained in the MOL2File. + + Returns + ------- + model_count : int + The number of models. + """ + if self._ind_molecule is None: + self.check_valid_mol2() + return len(self._ind_molecule) diff --git a/tests/structure/test_mol2.py b/tests/structure/test_mol2.py index 3e4a1dbd2..073a4e29a 100644 --- a/tests/structure/test_mol2.py +++ b/tests/structure/test_mol2.py @@ -15,29 +15,24 @@ import biotite.structure.io.mol2 as mol2 from ..util import data_dir -def draw_random_struct(N_atoms, charge=False): - arr= struc.array( +def draw_random_struct(N_atoms, charge=False): + arr = struc.array( [ Atom( [ float(np.random.rand()) for _ in range(3) ], element="C", - charge=int(np.random.randint(-5,5)) + charge=int(np.random.randint(-5, 5)) ) for _ in range(N_atoms) ] ) - - arr.bonds=BondList(N_atoms) - - for i in range(1,N_atoms): + arr.bonds = BondList(N_atoms) + for i in range(1, N_atoms): arr.bonds.add_bond(i-1, i, 1) - return arr - - def test_header_conversion(): @@ -50,52 +45,42 @@ def test_header_conversion(): str(datetime.datetime.now().replace(second=0, microsecond=0)), "3D", "Lorem", "Ipsum", "123", "Lorem ipsum dolor sit amet" ) - ref_nums = np.random.randint(1, 10, len(ref_names)) ref_mol_type = [ mol2.MOL2File.supported_mol_types[x] for x in np.random.randint( - 0,5,len(ref_names) + 0, 5, len(ref_names) ).astype(int) ] - ref_charge_type = [ mol2.MOL2File.supported_charge_types[x] for x in np.random.randint( - 0,12,len(ref_names) + 0, 12, len(ref_names) ).astype(int) - ] - - + ] # draw this many random Atoms for structure # necessary as header should only exist for a non empty XYZFile N_sample = 10 - for i, name in enumerate(ref_names): - mol2_file = mol2.MOL2File() - mol2_file.set_header( - name, - ref_nums[i], - ref_mol_type[i], - ref_charge_type[i] - - ) + mol2_file = mol2.MOL2File() # need to set some structure for file writing rand_struct = draw_random_struct( ref_nums[i], - charge = (ref_charge_type[i] != "NO_CHARGES"), + charge=(ref_charge_type[i] != "NO_CHARGES"), + ) + mol2_file.set_structure(rand_struct) + mol2_file.set_header( + name, + ref_nums[i], + ref_mol_type[i], + ref_charge_type[i] ) - mol2_file.set_structure(rand_struct) - - temp = TemporaryFile("w+") mol2_file.write(temp) - temp.seek(0) mol2_file = mol2.MOL2File.read(temp) - test_header = mol2_file.get_header() + test_header = mol2_file.get_header() temp.close() - assert len(test_header) > 0 - assert test_header[0] == name + assert test_header[0] == name assert test_header[1] == ref_nums[i] assert test_header[2] == ref_mol_type[i] assert test_header[3] == ref_charge_type[i] @@ -111,33 +96,54 @@ def test_structure_conversion(path): and reading it again should give the same structure. """ mol2_file = mol2.MOL2File.read(path) - - ref_header = mol2_file.get_header() ref_atoms = mol2.get_structure(mol2_file) - + ref_header = mol2_file.get_header() + ref_atoms_multi = [] + N_models = mol2.get_model_count(mol2_file) + if N_models > 1: + for i in range(N_models): + ref_atoms_multi.append( + mol2.get_structure(mol2_file, model=i) + ) + + # Instanciate new MOL2File object and set + # values to same as just read model mol2_file = mol2.MOL2File() - mol2_file.set_header( - ref_header[0], ref_header[1], ref_header[2], ref_header[3] - ) mol2.set_structure(mol2_file, ref_atoms) + if type(ref_header[0]) is list: + mol2_file.set_header( + ref_header[0][0], ref_header[1][0], + ref_header[2][0], ref_header[3][0] + ) + else: + mol2_file.set_header( + ref_header[0], ref_header[1], + ref_header[2], ref_header[3] + ) + + # write the new object temp = TemporaryFile("w+") mol2_file.write(temp) - - + # read the object from the just written file into + # another MOL2File object which will be used for comparison with + # reference. temp.seek(0) - mol2_file = mol2.MOL2File.read(temp) + mol2_file = mol2.MOL2File.read(temp) test_atoms = mol2.get_structure(mol2_file) temp.close() - - + # tests instance_cond = isinstance(ref_atoms, AtomArray) instance_cond = instance_cond | isinstance(ref_atoms, AtomArrayStack) assert instance_cond assert test_atoms == ref_atoms assert test_atoms.bonds == ref_atoms.bonds - + if len(ref_atoms_multi) > 0: + for i, atoms_i in enumerate(ref_atoms_multi): + assert atoms_i == ref_atoms[i] + + @pytest.mark.parametrize( "path", glob.glob(join(data_dir("structure"), "molecules", "*.mol2")) @@ -147,64 +153,73 @@ def test_charge_rounding(path): After reading a mol2 file, writing the structure back to a new file and reading it again should give us a file where the partial_charges are identical to the rounded charges as without changing them manually this - is what will be written to the charge column. Also setting the charges + is what will be written to the charge column. Also setting the charges specifically before setting the structure will lead to the partial_charges being used in the set_structure function. """ mol2_file = mol2.MOL2File.read(path) - ref_header = mol2_file.get_header() ref_atoms = mol2.get_structure(mol2_file) - - if ref_header[3] == "NO_CHARGES": - assert mol2_file.get_charges() is None + if ref_header[3] == "NO_CHARGES": + assert mol2_file.get_charges() is None else: - ref_partial_charges = mol2.get_charges(mol2_file) ref_charges = ref_atoms.charge - - + # make MOL2File where only ref_header and ref_structure is written + # since ref_atoms read from file with charges, the charge field + # is set to be the rounded partial_charges mol2_file = mol2.MOL2File() - mol2_file.set_header( - ref_header[0], ref_header[1], ref_header[2], ref_header[3] - ) - mol2.set_structure(mol2_file, ref_atoms) + mol2.set_structure(mol2_file, ref_atoms) + if type(ref_header[0]) is list: + mol2_file.set_header( + ref_header[0][0], ref_header[1][0], + ref_header[2][0], ref_header[3][0] + ) + else: + mol2_file.set_header( + ref_header[0], ref_header[1], + ref_header[2], ref_header[3] + ) temp = TemporaryFile("w+") mol2_file.write(temp) - - + # read in just written MOL2File temp.seek(0) - mol2_file = mol2.MOL2File.read(temp) + mol2_file = mol2.MOL2File.read(temp) test_atoms = mol2.get_structure(mol2_file) + # the partial charges returned from this MOL2File + # should be equal to the rounded partial charges from the initial file test_charges = mol2.get_charges(mol2_file) temp.close() - + # now write a new MOL2File where partial_charges have been + # specifically set before writing mol2_file = mol2.MOL2File() - mol2_file.set_header( - ref_header[0], ref_header[1], ref_header[2], ref_header[3] - ) + mol2.set_structure(mol2_file, ref_atoms) mol2.set_charges(mol2_file, ref_partial_charges) - mol2.set_structure(mol2_file, ref_atoms) - temp = TemporaryFile("w+") - mol2_file.write(temp) - + if type(ref_header[0]) is list: + mol2_file.set_header( + ref_header[0][0], ref_header[1][0], + ref_header[2][0], ref_header[3][0] + ) + else: + mol2_file.set_header( + ref_header[0], ref_header[1], + ref_header[2], ref_header[3] + ) + temp = TemporaryFile("w+") + # read in said file again + mol2_file.write(temp) temp.seek(0) - mol2_file = mol2.MOL2File.read(temp) + mol2_file = mol2.MOL2File.read(temp) test2_atoms = mol2.get_structure(mol2_file) + # the partial charges here should be identical to the reference test2_charges = mol2.get_charges(mol2_file) - temp.close() - - + temp.close() instance_cond = isinstance(ref_atoms, AtomArray) instance_cond = instance_cond | isinstance(ref_atoms, AtomArrayStack) assert instance_cond - assert test_atoms == ref_atoms assert test2_atoms == ref_atoms - assert test_atoms.bonds == ref_atoms.bonds - assert test2_atoms.bonds == ref_atoms.bonds - - assert np.all(np.rint(ref_partial_charges) == test_charges) + assert test2_atoms.bonds == ref_atoms.bonds + assert np.all(np.rint(ref_partial_charges) == test_charges) assert np.all(ref_partial_charges == test2_charges) - From 8725b4017ec58b41849b51f3f6d593d70e5b7f6d Mon Sep 17 00:00:00 2001 From: Benjamin Mayer Date: Tue, 13 Sep 2022 04:57:09 +0200 Subject: [PATCH 35/37] Changes in sybyl_atom_type heuristic --- src/biotite/structure/io/mol2/file.py | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/biotite/structure/io/mol2/file.py b/src/biotite/structure/io/mol2/file.py index 23b5a57eb..175635d80 100644 --- a/src/biotite/structure/io/mol2/file.py +++ b/src/biotite/structure/io/mol2/file.py @@ -154,11 +154,11 @@ def transcribe_sybyl_atom_type(atom, atom_bonds, types, atom_id): if 5 in types: return "C.ar" else: - if N_bonds == 3: + if N_bonds == 2: return "C.1" - elif N_bonds == 2: + elif N_bonds == 3: return "C.2" - elif N_bonds == 1: + elif N_bonds == 4: return "C.3" return "C.3" @@ -166,12 +166,16 @@ def transcribe_sybyl_atom_type(atom, atom_bonds, types, atom_id): if 5 in types: return "N.ar" else: - if N_bonds == 3: + if N_bonds == 1: return "N.1" elif N_bonds == 2: return "N.2" - elif N_bonds == 1: + elif N_bonds == 3: return "N.3" + else: + msg = str(N_bonds) + " bonds with element :: " + str("N") + msg += " not implemented." + raise ValueError(msg) if atom.element == "O": if N_bonds == 2: @@ -898,10 +902,11 @@ def __append_atom_array(self, atoms, charges=None): line += str(atom.res_id) if atom.res_name != "": - line += " " + str(atom.res_name) + line += " " + str(atom.res_name)+str(atom.res_id) + if self._charge_type != "NO_CHARGES": - line += " " + line += " " if charges is not None: line += " {: .{}f}".format(charges[i], 4) else: From 9ee1b20a073e8ea96f1df3bc62a701cca2e7896b Mon Sep 17 00:00:00 2001 From: Benjamin Mayer Date: Wed, 14 Sep 2022 01:54:46 +0200 Subject: [PATCH 36/37] Changed warning when MOLFile reads timestamp entry and datetime is not matching. Tried to negelect this warning in the test but somehow mark.filterwarnings has no effect. --- src/biotite/structure/io/mol/file.py | 9 +++++---- tests/structure/test_mol.py | 3 ++- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/biotite/structure/io/mol/file.py b/src/biotite/structure/io/mol/file.py index 31fc51712..d715472b8 100644 --- a/src/biotite/structure/io/mol/file.py +++ b/src/biotite/structure/io/mol/file.py @@ -21,7 +21,7 @@ DATE_FORMAT = "%d%m%y%H%M" -class MOLFile(TextFile): +class MOLFile(TextFile): """ This class represents a file in MOL format, that is used to store structure information for small molecules. :footcite:`Dalby1992` @@ -107,8 +107,6 @@ def get_header(self): mol_name = self.lines[0].strip() initials = self.lines[1][0:2].strip() program = self.lines[1][2:10].strip() - - # sometimes the string can not be interpreted as datetime # in those cases instead of failing simply warn the user time = None @@ -119,7 +117,10 @@ def get_header(self): ) except: line = format(self.lines[1][10:20]) - warn("{} could not be interpreted as datetime".format(line)) + msg = "The line: " + str(line) + " could not be interpreted" + msg += " as datetime. Storing it as string" + msg += " in the time field instead." + warn(UserWarning(msg)) dimensions = self.lines[1][20:22].strip() diff --git a/tests/structure/test_mol.py b/tests/structure/test_mol.py index ffc8153f1..0970bcb3a 100644 --- a/tests/structure/test_mol.py +++ b/tests/structure/test_mol.py @@ -48,11 +48,11 @@ def test_header_conversion(): [False, True] ) ) +@pytest.mark.filterwarnings("ignore:The line") def test_structure_conversion(path, omit_charge): """ After reading a MOL file, writing the structure back to a new file and reading it again should give the same structure. - In this case an SDF file is used, but it is compatible with the MOL format. """ @@ -101,6 +101,7 @@ def cond(x): glob.glob(join(data_dir("structure"), "molecules", "*.mol")), ) ) +@pytest.mark.filterwarnings() def test_pdbx_consistency(path): """ Check if the structure parsed from a MOL file is equal to the same From 13c5810f72732362974d67f3d64e23a24bdc690f Mon Sep 17 00:00:00 2001 From: Benjamin Mayer Date: Wed, 14 Sep 2022 03:58:33 +0200 Subject: [PATCH 37/37] Date parsing now works in header test. --- src/biotite/structure/io/mol/file.py | 76 +++++++++++++++++----------- tests/structure/test_mol.py | 40 +++++---------- 2 files changed, 60 insertions(+), 56 deletions(-) diff --git a/src/biotite/structure/io/mol/file.py b/src/biotite/structure/io/mol/file.py index d715472b8..f7c932091 100644 --- a/src/biotite/structure/io/mol/file.py +++ b/src/biotite/structure/io/mol/file.py @@ -18,10 +18,10 @@ # Number of header lines N_HEADER = 3 -DATE_FORMAT = "%d%m%y%H%M" +DATE_FORMATS = ["%d%m%y%H%M", "%m%d%y%H%M"] -class MOLFile(TextFile): +class MOLFile(TextFile): """ This class represents a file in MOL format, that is used to store structure information for small molecules. :footcite:`Dalby1992` @@ -44,7 +44,9 @@ class MOLFile(TextFile): -------- >>> from os.path import join - >>> mol_file = MOLFile.read(join(path_to_structures, "molecules", "TYR.sdf")) + >>> mol_file = MOLFile.read( + ... join(path_to_structures, "molecules", "TYR.sdf") + ... ) >>> atom_array = mol_file.get_structure() >>> print(atom_array) 0 N 1.320 0.952 1.428 @@ -104,33 +106,40 @@ def get_header(self): comments : str Additional comments. """ - mol_name = self.lines[0].strip() - initials = self.lines[1][0:2].strip() - program = self.lines[1][2:10].strip() + mol_name = self.lines[0].strip() + initials = self.lines[1][0:2].strip() + program = self.lines[1][2:10].strip() # sometimes the string can not be interpreted as datetime # in those cases instead of failing simply warn the user - time = None - try: - time = datetime.datetime.strptime( - self.lines[1][10:20], - DATE_FORMAT - ) - except: - line = format(self.lines[1][10:20]) - msg = "The line: " + str(line) + " could not be interpreted" - msg += " as datetime. Storing it as string" - msg += " in the time field instead." - warn(UserWarning(msg)) - - - dimensions = self.lines[1][20:22].strip() + time = None + if len(self.lines[1][10:20]) > 1: + time_parsing_succesfull = False + msg_last = "" + for format_i in DATE_FORMATS: + try: + time = datetime.datetime.strptime( + self.lines[1][10:20], + format_i + ) + time_parsing_succesfull = True + break + except ValueError: + msg_last = self.lines[1][10:20].strip()[:len(format_i)] + msg_last += " could not be interpreted as datetime" + + if not time_parsing_succesfull: + warn(UserWarning(msg_last)) + time = self.lines[1][10:20] + + dimensions = self.lines[1][20:22].strip() scaling_factors = self.lines[1][22:34].strip() - energy = self.lines[1][34:46].strip() + energy = self.lines[1][34:46].strip() registry_number = self.lines[1][46:52].strip() - comments = self.lines[2].strip() - return mol_name, initials, program, time, dimensions, \ - scaling_factors, energy, registry_number, comments - + comments = self.lines[2].strip() + return ( + mol_name, initials, program, time, dimensions, + scaling_factors, energy, registry_number, comments + ) def set_header(self, mol_name, initials="", program="", time=None, dimensions="", scaling_factors="", energy="", @@ -159,9 +168,18 @@ def set_header(self, mol_name, initials="", program="", time=None, comments : str, optional Additional comments. """ - if time is None: + time_str = "" + if time is not None and type(time) is datetime.datetime: + for format_i in DATE_FORMATS: + try: + time_str = time.strftime(format_i) + break + except ValueError: + time_str = time + # only fill with local time if nothing was provided via time + if len(time_str) == 0: time = datetime.datetime.now() - time_str = time.strftime(DATE_FORMAT) + time_str = time.strftime(DATE_FORMATS[0]) self.lines[0] = str(mol_name) self.lines[1] = ( @@ -175,7 +193,6 @@ def set_header(self, mol_name, initials="", program="", time=None, ) self.lines[2] = str(comments) - def get_structure(self): """ Get an :class:`AtomArray` from the MOL file. @@ -193,7 +210,6 @@ def get_structure(self): raise InvalidFileError("File does not contain structure data") return read_structure_from_ctab(ctab_lines) - def set_structure(self, atoms, default_bond_type=BondType.ANY): """ Set the :class:`AtomArray` for the file. diff --git a/tests/structure/test_mol.py b/tests/structure/test_mol.py index 0970bcb3a..b4c5ef420 100644 --- a/tests/structure/test_mol.py +++ b/tests/structure/test_mol.py @@ -26,18 +26,18 @@ def test_header_conversion(): datetime.datetime.now().replace(second=0, microsecond=0), "3D", "Lorem", "Ipsum", "123", "Lorem ipsum dolor sit amet" ) - mol_file = mol.MOLFile() mol_file.set_header(*ref_header) - print(mol_file) temp = TemporaryFile("w+") mol_file.write(temp) - temp.seek(0) mol_file = mol.MOLFile.read(temp) test_header = mol_file.get_header() temp.close() - + cond = test_header == ref_header + if not cond: + print(test_header) + print(ref_header) assert test_header == ref_header @@ -58,7 +58,6 @@ def test_structure_conversion(path, omit_charge): """ mol_file = mol.MOLFile.read(path) ref_atoms = mol.get_structure(mol_file) -# print(ref_atoms.charge) if omit_charge: ref_atoms.del_annotation("charge") @@ -66,7 +65,6 @@ def test_structure_conversion(path, omit_charge): mol.set_structure(mol_file, ref_atoms) temp = TemporaryFile("w+") mol_file.write(temp) - temp.seek(0) mol_file = mol.MOLFile.read(temp) test_atoms = mol.get_structure(mol_file) @@ -74,7 +72,6 @@ def test_structure_conversion(path, omit_charge): assert np.all(test_atoms.charge == 0) test_atoms.del_annotation("charge") temp.close() - assert test_atoms == ref_atoms @@ -83,19 +80,18 @@ def cond(x): This is used for filtering out only the amino acids from the mol files since for all other molecules this test doesn't make sense. """ - ignore_list=["CO2"] - + ignore_list = ["CO2"] mol_name = split(splitext(x)[0])[1] - if mol_name in ignore_list: return True - + cond = len(x.split()) < 1 cond = cond or mol_name not in info.all_residues() return cond - + + @pytest.mark.parametrize( - "path", + "path", itertools.filterfalse( lambda x: cond(x), glob.glob(join(data_dir("structure"), "molecules", "*.mol")), @@ -111,37 +107,30 @@ def test_pdbx_consistency(path): In this case an SDF file is used, but it is compatible with the MOL format. """ - mol_name = split(splitext(path)[0])[1] - ref_atoms = info.residue(mol_name) # The CCD contains information about aromatic bond types, # but the SDF test files do not ref_atoms.bonds.remove_aromaticity() - mol_file = mol.MOLFile.read(path) test_atoms = mol_file.get_structure() - assert test_atoms.coord.shape == ref_atoms.coord.shape assert test_atoms.coord.flatten().tolist() \ == ref_atoms.coord.flatten().tolist() assert test_atoms.element.tolist() == ref_atoms.element.tolist() assert test_atoms.charge.tolist() == ref_atoms.charge.tolist() assert set(tuple(bond) for bond in test_atoms.bonds.as_array()) \ - == set(tuple(bond) for bond in ref_atoms.bonds.as_array()) - + == set(tuple(bond) for bond in ref_atoms.bonds.as_array()) header = mol_file.get_header() - try: - header = mol_file.get_header() + header = mol_file.get_header() except RuntimeWarning as w: if "could not be interpreted as datetime" in w.message: assert True else: - assert False, "Runtime Warning :: " + str(w.message) + assert False, "Runtime Warning :: " + str(w.message) except: - assert False, "Could not get_header for SDFile [" +str(path) - + assert False, "Could not get_header for SDFile [" + str(path) @pytest.mark.parametrize( @@ -160,7 +149,7 @@ def test_structure_bond_type_fallback(path): # the default bond type ref_atoms.bonds.add_bond(0, 1, BondType.QUADRUPLE) updated_bond = ref_atoms.bonds.as_array()[ - np.all(ref_atoms.bonds.as_array()[:,[0,1]] == [0,1], axis=1) + np.all(ref_atoms.bonds.as_array()[:, [0, 1]] == [0, 1], axis=1) ] assert updated_bond.tolist()[0][2] == BondType.QUADRUPLE test_mol_file = mol.MOLFile() @@ -183,4 +172,3 @@ def test_structure_bond_type_fallback(path): ].pop() assert int(updated_line[8]) == \ BOND_TYPE_MAPPING_REV[BondType.SINGLE] -