diff --git a/.githooks/commit-msg b/.githooks/commit-msg index 4a797199..d29021e8 100755 --- a/.githooks/commit-msg +++ b/.githooks/commit-msg @@ -96,6 +96,24 @@ if [[ "$lowercase_message" =~ ^ci(\(.+\))?: ]]; then group="CI" fi +#pylint +if [[ "$lowercase_message" =~ ^pylint(\(.+\))?: ]]; then + matched=true + group="Pylint" +fi + +if [[ "$lowercase_message" =~ ^admin(\(.+\))?: ]]; then + matched=true + group="Administrative" +fi + +#random stuff that doesn't fit into any of the above categories +#starting with a $ +if [[ "$lowercase_message" =~ ^\$ ]]; then + matched=true + group="Random" +fi + # ... (similar checks for other patterns in the list) # No match found @@ -120,6 +138,9 @@ if ! $matched; then echo " - Example: example:, examples:" echo " - Dependency: deps:" echo " - CI: ci:" + echo " - Pylint: pylint:" + echo " - Administrative: admin:" + echo " - Random: $" # ... (similar output for other patterns in the list) echo " - --------------------------------------------\n" diff --git a/.github/.pylint_cache/PQAnalysis_1.stats b/.github/.pylint_cache/PQAnalysis_1.stats index 1e305c7e..c172a63d 100644 Binary files a/.github/.pylint_cache/PQAnalysis_1.stats and b/.github/.pylint_cache/PQAnalysis_1.stats differ diff --git a/.gitignore b/.gitignore index 46077241..a59a74fa 100644 --- a/.gitignore +++ b/.gitignore @@ -6,7 +6,7 @@ build/ _version.py **/*.ipynb -.github/.pylint_cache +.github/.pylint_cache/__* .coverage coverage.xml diff --git a/PQAnalysis/io/base.py b/PQAnalysis/io/base.py index 7ba0a90b..e0e6eb1c 100644 --- a/PQAnalysis/io/base.py +++ b/PQAnalysis/io/base.py @@ -78,6 +78,7 @@ def __init__( self.filename = filename self.mode = FileWritingMode(mode) + self.original_mode = FileWritingMode(mode) def open(self) -> None: """ @@ -144,13 +145,15 @@ class :py:class:`~PQAnalysis.io.formats.FileWritingMode`. """ mode = FileWritingMode(mode) - if (mode == FileWritingMode.WRITE and self.filename is not None - and os.path.isfile(self.filename)): + if ( + mode == FileWritingMode.WRITE and self.filename is not None and + os.path.isfile(self.filename) + ): self.logger.error( ( - f"File {self.filename} already exists. " - "Use mode \'a\' to append to the file or mode " - "\'o\' to overwrite the file." + f"File {self.filename} already exists. " + "Use mode \'a\' to append to the file or mode " + "\'o\' to overwrite the file." ), exception=FileWritingModeError ) @@ -211,8 +214,8 @@ def __init__(self, filename: str | List[str]) -> None: if not os.path.isfile(_filename): self.logger.error( ( - "At least one of the given files does not exist. " - f"File {_filename} not found." + "At least one of the given files does not exist. " + f"File {_filename} not found." ), exception=PQFileNotFoundError ) diff --git a/PQAnalysis/io/topology_file/__init__.py b/PQAnalysis/io/topology_file/__init__.py index b3c51ef2..0d792854 100644 --- a/PQAnalysis/io/topology_file/__init__.py +++ b/PQAnalysis/io/topology_file/__init__.py @@ -2,5 +2,7 @@ A subpackage to handle trajectory files. """ +from .exceptions import TopologyFileError + from .topology_file_reader import TopologyFileReader from .topology_file_writer import TopologyFileWriter diff --git a/PQAnalysis/io/topology_file/topology_file_reader.py b/PQAnalysis/io/topology_file/topology_file_reader.py index cc27ee88..79ba6782 100644 --- a/PQAnalysis/io/topology_file/topology_file_reader.py +++ b/PQAnalysis/io/topology_file/topology_file_reader.py @@ -6,13 +6,14 @@ import logging -from beartype.typing import List +from beartype.typing import List, Tuple from PQAnalysis.io.base import BaseReader from PQAnalysis.topology import Bond, BondedTopology, Angle, Dihedral from PQAnalysis.utils.custom_logging import setup_logger -from PQAnalysis import __package_name__ +from PQAnalysis.utils.string import is_comment_line from PQAnalysis.type_checking import runtime_type_checking +from PQAnalysis import __package_name__ from .exceptions import TopologyFileError @@ -83,14 +84,14 @@ def _get_definitions(self) -> dict[str, List[str]]: with open(self.filename, "r", encoding="utf-8") as file: lines = file.readlines() - # remove all #.... parts from all lines - lines = [line.split("#")[0] for line in lines] - - # remove all empty lines - lines = [line for line in lines if line.strip()] + # remove all comment lines and empty lines + no_comment_lines = [ + line for line in lines if + not is_comment_line(line, comment_token="#", empty_line=True) + ] # check if last line is END else raise error - if lines[-1].strip().lower() != "end": + if no_comment_lines[-1].strip().lower() != "end": self.logger.error( "Something went wrong. Each block should end with 'END'", exception=TopologyFileError, @@ -101,9 +102,12 @@ def _get_definitions(self) -> dict[str, List[str]]: block = [] for line in lines: if line.strip().lower() == "end": + block.append(line) blocks.append(block) block = [] - else: + elif not is_comment_line( + line, comment_token="#", empty_line=True + ): block.append(line) # make a dictionary for each block with the key @@ -201,7 +205,10 @@ def _parse_bonds(self, block: List[str]) -> List[Bond]: If the number of columns in the block is not 3 or 4. """ bonds = [] - for line in block: + for line in block[:-1]: # [-1] to avoid the "END" line of the block + + line, comment = self._get_data_line_comment(line) + if len(line.split()) == 4: index, target_index, bond_type, _ = line.split() is_linker = True @@ -220,6 +227,7 @@ def _parse_bonds(self, block: List[str]) -> List[Bond]: index2=int(target_index), bond_type=int(bond_type), is_linker=is_linker, + comment=comment ) ) @@ -251,7 +259,10 @@ def _parse_angles(self, block: List[str]) -> List[Angle]: If the number of columns in the block is not 4 or 5. """ angles = [] - for line in block: + for line in block[:-1]: # [-1] to avoid the "END" line of the block + + line, comment = self._get_data_line_comment(line) + if len(line.split()) == 5: index1, index2, index3, angle_type, _ = line.split() is_linker = True @@ -271,6 +282,7 @@ def _parse_angles(self, block: List[str]) -> List[Angle]: index3=int(index3), angle_type=int(angle_type), is_linker=is_linker, + comment=comment ) ) @@ -302,7 +314,10 @@ def _parse_dihedrals(self, block: List[str]) -> List[Dihedral]: If the number of columns in the block is not 5 or 6. """ dihedrals = [] - for line in block: + for line in block[:-1]: # [-1] to avoid the "END" line of the block + + line, comment = self._get_data_line_comment(line) + if len(line.split()) == 6: index1, index2, index3, index4, dihedral_type, _ = line.split() is_linker = True @@ -323,6 +338,7 @@ def _parse_dihedrals(self, block: List[str]) -> List[Dihedral]: index4=int(index4), dihedral_type=int(dihedral_type), is_linker=is_linker, + comment=comment ) ) @@ -354,7 +370,10 @@ def _parse_impropers(self, block: List[str]) -> List[Dihedral]: If the number of columns in the block is not 5 or 6. """ dihedrals = [] - for line in block: + for line in block[:-1]: # [-1] to avoid the "END" line of the block + + line, comment = self._get_data_line_comment(line) + if len(line.split()) == 6: index1, index2, index3, index4, dihedral_type, _ = line.split() is_linker = True @@ -376,6 +395,7 @@ def _parse_impropers(self, block: List[str]) -> List[Dihedral]: dihedral_type=int(dihedral_type), is_linker=is_linker, is_improper=True, + comment=comment ) ) @@ -407,7 +427,10 @@ def _parse_shake(self, block: List[str]) -> List[Bond]: If the number of columns in the block is not 3 or 4. """ shake_bonds = [] - for line in block: + for line in block[:-1]: # [-1] to avoid the "END" line of the block + + line, comment = self._get_data_line_comment(line) + if len(line.split()) == 4: index, target_index, distance, _ = line.split() is_linker = True @@ -422,7 +445,33 @@ def _parse_shake(self, block: List[str]) -> List[Bond]: equilibrium_distance=float(distance), is_linker=is_linker, is_shake=True, + comment=comment ) ) return shake_bonds + + @staticmethod + def _get_data_line_comment(line: str) -> Tuple[str, str | None]: + """ + Get the data and the comment from a line. + + Parameters + ---------- + line : str + A line from the topology file. + + Returns + ------- + tuple[str, str] + A tuple with the data and the comment. + """ + splitted_line = line.split("#") + data = splitted_line[0].strip() + + if len(splitted_line) > 1: + comment = "#".join(splitted_line[1:]).strip() + else: + comment = None + + return data, comment diff --git a/PQAnalysis/io/topology_file/topology_file_writer.py b/PQAnalysis/io/topology_file/topology_file_writer.py index 1c55bea1..690d9798 100644 --- a/PQAnalysis/io/topology_file/topology_file_writer.py +++ b/PQAnalysis/io/topology_file/topology_file_writer.py @@ -10,12 +10,17 @@ from beartype.typing import List +from PQAnalysis import __package_name__ from PQAnalysis.io.base import BaseWriter from PQAnalysis.io.formats import FileWritingMode -from PQAnalysis.topology import BondedTopology, Topology from PQAnalysis.utils.custom_logging import setup_logger -from PQAnalysis import __package_name__ from PQAnalysis.type_checking import runtime_type_checking +from PQAnalysis.topology import BondedTopology, Topology +from PQAnalysis.topology.bonded_topology import ( + Bond, + Angle, + Dihedral, +) from .exceptions import TopologyFileError @@ -35,15 +40,16 @@ class TopologyFileWriter(BaseWriter): @runtime_type_checking def __init__( self, - filename: str, - mode: str | FileWritingMode = "w" + filename: str | None = None, + mode: str | FileWritingMode = "w", ) -> None: """ Parameters ---------- - filename : str - The name of the topology file - mode: str | FileWritingMode + filename : str, optional + The name of the topology file, Default is None, which means that the + output is printed to stdout. + mode: str | FileWritingMode, optional The writing mode. Default is "w". The writing mode can be either a string or a FileWritingMode enum value. Possible values are: @@ -79,13 +85,13 @@ def write(self, bonded_topology: Topology | BondedTopology) -> None: If the bonded topology is not a Topology or BondedTopology object. """ - if isinstance(bonded_topology, - Topology) and bonded_topology.bonded_topology is not None: + if isinstance( + bonded_topology, Topology + ) and bonded_topology.bonded_topology is not None: bonded_topology = bonded_topology.bonded_topology elif not isinstance(bonded_topology, BondedTopology): self.logger.error( - "Invalid bonded topology.", - exception=TopologyFileError + "Invalid bonded topology.", exception=TopologyFileError ) self.open() @@ -102,9 +108,7 @@ def write(self, bonded_topology: Topology | BondedTopology) -> None: @classmethod def _write_bond_info( - cls, - bonded_topology: BondedTopology, - file: File + cls, bonded_topology: BondedTopology, file: File ) -> None: """ Determines if the bonded topology contains bonds and @@ -116,7 +120,15 @@ def _write_bond_info( The bonded topology object containing the bond information. file : File The file object to write the bond information to. + + Raises + ------ + TopologyFileError + If any bond in the bonded topology does not have a bond type defined. """ + + cls._check_type_given(bonded_topology.bonds, "bond") + if len(bonded_topology.bonds) != 0: lines = cls._get_bond_lines(bonded_topology) for line in lines: @@ -124,9 +136,7 @@ def _write_bond_info( @classmethod def _write_angle_info( - cls, - bonded_topology: BondedTopology, - file: File + cls, bonded_topology: BondedTopology, file: File ) -> None: """ Determines if the bonded topology contains angles and @@ -138,7 +148,15 @@ def _write_angle_info( The bonded topology object containing the angle information. file : File The file object to write the angle information to. + + Raises + ------ + TopologyFileError + If any angle in the bonded topology does not have an angle type defined. """ + + cls._check_type_given(bonded_topology.angles, "angle") + if len(bonded_topology.angles) != 0: lines = cls._get_angle_lines(bonded_topology) for line in lines: @@ -146,9 +164,7 @@ def _write_angle_info( @classmethod def _write_dihedral_info( - cls, - bonded_topology: BondedTopology, - file: File + cls, bonded_topology: BondedTopology, file: File ) -> None: """ Determines if the bonded topology contains dihedrals and @@ -160,7 +176,15 @@ def _write_dihedral_info( The bonded topology object containing the dihedral information. file : File The file object to write the dihedral information to. + + Raises + ------ + TopologyFileError + If any dihedral in the bonded topology does not have a dihedral type defined. """ + + cls._check_type_given(bonded_topology.dihedrals, "dihedral") + if len(bonded_topology.dihedrals) != 0: lines = cls._get_dihedral_lines(bonded_topology) for line in lines: @@ -168,9 +192,7 @@ def _write_dihedral_info( @classmethod def _write_improper_info( - cls, - bonded_topology: BondedTopology, - file: File + cls, bonded_topology: BondedTopology, file: File ) -> None: """ Writes the improper information to the file. @@ -182,6 +204,9 @@ def _write_improper_info( file : File The file object to write the improper information to. """ + + cls._check_type_given(bonded_topology.impropers, "improper") + if len(bonded_topology.impropers) != 0: lines = cls._get_improper_lines(bonded_topology) for line in lines: @@ -189,9 +214,7 @@ def _write_improper_info( @classmethod def _write_shake_info( - cls, - bonded_topology: BondedTopology, - file: File + cls, bonded_topology: BondedTopology, file: File ) -> None: """ Writes the shake information to the file. @@ -208,6 +231,40 @@ def _write_shake_info( for line in lines: print(line, file=file) + @classmethod + def _check_type_given( + cls, types: List[Bond | Angle | Dihedral], type_name: str + ) -> None: + """ + Check if the type is given for each bond, angle, or dihedral. + + Parameters + ---------- + types : List[Bond | Angle | Dihedral] + The list of bonds, angles, or dihedrals to check. + type_name : str + The name of the type to check. + """ + + def get_type(type_: Bond | Angle | Dihedral) -> int | None: + + if isinstance(type_, Bond): + return type_.bond_type + + if isinstance(type_, Angle): + return type_.angle_type + + return type_.dihedral_type + + if any(get_type(type_) is None for type_ in types): + cls.logger.error( + ( + f"In order to write the {type_name} information in 'PQ' topology format, " + f"all {type_name}s must have a {type_name} type defined." + ), + exception=TopologyFileError + ) + @staticmethod def _get_bond_lines(bonded_topology: BondedTopology) -> List[str]: """ @@ -233,7 +290,7 @@ def _get_bond_lines(bonded_topology: BondedTopology) -> List[str]: """ n_unique_indices = len(bonded_topology.unique_bond1_indices) n_unique_target_indices = len(bonded_topology.unique_bond2_indices) - n_linkers = len(bonded_topology.linkers) + n_linkers = len(bonded_topology.bond_linkers) lines = [] @@ -242,7 +299,15 @@ def _get_bond_lines(bonded_topology: BondedTopology) -> List[str]: ) for bond in bonded_topology.bonds: - lines.append(f"{bond.index1} {bond.index2} {bond.bond_type}") + line = f"{bond.index1:>5d} {bond.index2:>5d} {bond.bond_type:>5d}" + + if bond.is_linker: + line += " *" + + if bond.comment is not None: + line += f" # {bond.comment}" + + lines.append(line) lines.append("END") @@ -273,7 +338,7 @@ def _get_angle_lines(bonded_topology: BondedTopology) -> List[str]: """ n_unique_indices1 = len(bonded_topology.unique_angle1_indices) n_unique_indices2 = len(bonded_topology.unique_angle2_indices) - n_unique_indices3 = len(bonded_topology.unique_angle_target_indices) + n_unique_indices3 = len(bonded_topology.unique_angle3_indices) n_linkers = len(bonded_topology.angle_linkers) lines = [] @@ -284,11 +349,19 @@ def _get_angle_lines(bonded_topology: BondedTopology) -> List[str]: ) for angle in bonded_topology.angles: - lines.append( - f"{angle.index1} {angle.index2} " - f"{angle.index3} {angle.angle_type}" + line = ( + f"{angle.index1:>5d} {angle.index2:>5d} " + f"{angle.index3:>5d} {angle.angle_type:>5d}" ) + if angle.is_linker: + line += " *" + + if angle.comment is not None: + line += f" # {angle.comment}" + + lines.append(line) + lines.append("END") return lines @@ -329,11 +402,20 @@ def _get_dihedral_lines(bonded_topology: BondedTopology) -> List[str]: ) for dihedral in bonded_topology.dihedrals: - lines.append( - f"{dihedral.index1} {dihedral.index2} {dihedral.index3} " - f"{dihedral.index4} {dihedral.dihedral_type}" + line = ( + f"{dihedral.index1:>5d} {dihedral.index2:>5d} " + f"{dihedral.index3:>5d} {dihedral.index4:>5d} " + f"{dihedral.dihedral_type:>5d}" ) + if dihedral.is_linker: + line += " *" + + if dihedral.comment is not None: + line += f" # {dihedral.comment}" + + lines.append(line) + lines.append("END") return lines @@ -374,11 +456,21 @@ def _get_improper_lines(bonded_topology: BondedTopology) -> List[str]: ) for improper in bonded_topology.impropers: - lines.append( - f"{improper.index1} {improper.index2} {improper.index3} " - f"{improper.index4} {improper.improper_type}" + + line = ( + f"{improper.index1:>5d} {improper.index2:>5d} " + f"{improper.index3:>5d} {improper.index4:>5d} " + f"{improper.dihedral_type:>5d}" ) + if improper.is_linker: + line += " *" + + if improper.comment is not None: + line += f" # {improper.comment}" + + lines.append(line) + lines.append("END") return lines @@ -420,11 +512,17 @@ def _get_shake_lines(bonded_topology: BondedTopology) -> List[str]: for bond in bonded_topology.shake_bonds: linker = "*" if bond.is_linker else "" - lines.append( - f"{bond.index1} {bond.index2} " - f"{bond.equilibrium_distance} {linker}" + + line = ( + f"{bond.index1:>5d} {bond.index2:>5d} " + f"{bond.equilibrium_distance:16.12f}\t{linker}" ) + if bond.comment is not None: + line += f" # {bond.comment}" + + lines.append(line) + lines.append("END") return lines diff --git a/PQAnalysis/io/traj_file/frame_reader.py b/PQAnalysis/io/traj_file/frame_reader.py index 1a615ce7..ebdb00d3 100644 --- a/PQAnalysis/io/traj_file/frame_reader.py +++ b/PQAnalysis/io/traj_file/frame_reader.py @@ -251,7 +251,9 @@ def _check_qmcfc( return value, atoms def _get_topology( - self, atoms: List[str], topology: Topology | None + self, + atoms: List[str], + topology: Topology | None, ) -> Topology: """ Returns the topology of the frame. diff --git a/PQAnalysis/io/traj_file/trajectory_reader.py b/PQAnalysis/io/traj_file/trajectory_reader.py index bc3ddb83..e1fa84b9 100644 --- a/PQAnalysis/io/traj_file/trajectory_reader.py +++ b/PQAnalysis/io/traj_file/trajectory_reader.py @@ -222,6 +222,10 @@ def frame_generator( # Read the lines of the file using tqdm for progress bar for line in self.file: + # Break the generator if the trajectory_stop is reached + if trajectory_stop <= frame_index: + return + stripped_line = line.strip() if stripped_line == "" or not stripped_line[0].isdigit(): frame_lines.append(line) @@ -239,10 +243,7 @@ def frame_generator( # Check if the number of frames yielded is equal to the # total number of frames - if not ( - frame_index < trajectory_start or - frame_index >= trajectory_stop - ): + if frame_index >= trajectory_start: yield frame # only yield the frame if it is within the range progress_bar.update( 1 @@ -251,7 +252,7 @@ def frame_generator( # then increment the frame index frame_index += 1 - if self.constant_topology and self.topology is not None: + if self.constant_topology and self.topology is None: self.topology = frame.topology frame_lines = [line] @@ -267,18 +268,16 @@ def frame_generator( last_cell = frame.cell - # Check if the number of frames yielded is equal to the total number of frames - if not ( - frame_index < trajectory_start or - frame_index >= trajectory_stop - ): + # Check if the number of frames yielded is equal to the + # total number of frames + if frame_index >= trajectory_start: yield frame # only yield the frame if it is within the range progress_bar.update(1) # update the progress bar # then increment the frame index frame_index += 1 - if self.constant_topology and self.topology is not None: + if self.constant_topology and self.topology is None: self.topology = frame.topology @runtime_type_checking diff --git a/PQAnalysis/topology/bonded_topology/__init__.py b/PQAnalysis/topology/bonded_topology/__init__.py index 816e255f..3387e867 100644 --- a/PQAnalysis/topology/bonded_topology/__init__.py +++ b/PQAnalysis/topology/bonded_topology/__init__.py @@ -1,3 +1,8 @@ """ A subpackage for the bonded topology of an atomic system. """ + +from .bond import Bond +from .angle import Angle +from .dihedral import Dihedral +from .bonded_topology import BondedTopology diff --git a/PQAnalysis/topology/bonded_topology/angle.py b/PQAnalysis/topology/bonded_topology/angle.py index c3c38c12..e1f34377 100644 --- a/PQAnalysis/topology/bonded_topology/angle.py +++ b/PQAnalysis/topology/bonded_topology/angle.py @@ -22,6 +22,7 @@ def __init__( equilibrium_angle: PositiveReal | None = None, angle_type: PositiveInt | None = None, is_linker: bool = False, + comment: str | None = None ) -> None: """ Parameters @@ -38,6 +39,8 @@ def __init__( The type of the angle, by default None. is_linker : bool, optional A flag to indicate if the angle is a linker, by default False. + comment : str, optional + A comment for the angle, by default None. """ self.index1 = index1 @@ -46,6 +49,7 @@ def __init__( self.equilibrium_angle = equilibrium_angle self.angle_type = angle_type self.is_linker = is_linker + self.comment = comment def copy(self) -> "Angle": """ @@ -63,6 +67,7 @@ def copy(self) -> "Angle": equilibrium_angle=self.equilibrium_angle, angle_type=self.angle_type, is_linker=self.is_linker, + comment=self.comment ) def __eq__(self, value: object) -> bool: diff --git a/PQAnalysis/topology/bonded_topology/bond.py b/PQAnalysis/topology/bonded_topology/bond.py index dff5bf94..280f5f3b 100644 --- a/PQAnalysis/topology/bonded_topology/bond.py +++ b/PQAnalysis/topology/bonded_topology/bond.py @@ -22,6 +22,7 @@ def __init__( bond_type: PositiveInt | None = None, is_linker: bool = False, is_shake: bool = False, + comment: str | None = None ) -> None: """ Parameters @@ -38,6 +39,8 @@ def __init__( A flag to indicate if the bond is a linker, by default False. is_shake : bool, optional A flag to indicate if the bond is a shake bond, by default False. + comment : str, optional + A comment for the bond, by default None. """ self.index1 = index1 @@ -46,6 +49,7 @@ def __init__( self.bond_type = bond_type self.is_linker = is_linker self.is_shake = is_shake + self.comment = comment def copy(self) -> "Bond": """ @@ -63,6 +67,7 @@ def copy(self) -> "Bond": bond_type=self.bond_type, is_linker=self.is_linker, is_shake=self.is_shake, + comment=self.comment ) def __eq__(self, value: object) -> bool: diff --git a/PQAnalysis/topology/bonded_topology/bonded_topology.py b/PQAnalysis/topology/bonded_topology/bonded_topology.py index 698f95dd..6c2beba8 100644 --- a/PQAnalysis/topology/bonded_topology/bonded_topology.py +++ b/PQAnalysis/topology/bonded_topology/bonded_topology.py @@ -112,7 +112,7 @@ def extend_shake_bonds( max_index_shake_bonds = max( [bond.index1 - for bond in shake_bonds] + [bond.index2 for bond in shake_bonds] + for bond in shake_bonds] + [bond.index2 for bond in shake_bonds] ) if n_atoms_per_extension is None: @@ -120,8 +120,8 @@ def extend_shake_bonds( elif n_atoms_per_extension < max_index_shake_bonds: self.logger.error( ( - "n_atoms_per_extension must be greater or equal " - "than the highest index in the provided shake bonds." + "n_atoms_per_extension must be greater or equal " + "than the highest index in the provided shake bonds." ), exception=PQValueError ) diff --git a/PQAnalysis/topology/bonded_topology/dihedral.py b/PQAnalysis/topology/bonded_topology/dihedral.py index 83bd4858..2a4a93d3 100644 --- a/PQAnalysis/topology/bonded_topology/dihedral.py +++ b/PQAnalysis/topology/bonded_topology/dihedral.py @@ -24,6 +24,7 @@ def __init__( dihedral_type: int | None = None, is_linker: bool = False, is_improper: bool = False, + comment: str | None = None ) -> None: """ Parameters @@ -44,6 +45,8 @@ def __init__( A flag to indicate if the dihedral is a linker, by default False. is_improper : bool, optional A flag to indicate if the dihedral is an improper dihedral, by default False. + comment : str, optional + A comment for the dihedral, by default None. """ self.index1 = index1 @@ -54,6 +57,7 @@ def __init__( self.dihedral_type = dihedral_type self.is_linker = is_linker self.is_improper = is_improper + self.comment = comment def copy(self) -> "Dihedral": """ @@ -72,7 +76,8 @@ def copy(self) -> "Dihedral": equilibrium_angle=self.equilibrium_angle, dihedral_type=self.dihedral_type, is_linker=self.is_linker, - is_improper=self.is_improper + is_improper=self.is_improper, + comment=self.comment ) def __eq__(self, value: object) -> bool: diff --git a/PQAnalysis/topology/shake_topology.py b/PQAnalysis/topology/shake_topology.py index bb3df741..da3d6bf4 100644 --- a/PQAnalysis/topology/shake_topology.py +++ b/PQAnalysis/topology/shake_topology.py @@ -7,15 +7,19 @@ from beartype.typing import List +from PQAnalysis import __package_name__ from PQAnalysis.traj import Trajectory from PQAnalysis.types import Np1DIntArray, Np2DIntArray -from PQAnalysis.io import BaseWriter, FileWritingMode from PQAnalysis.type_checking import runtime_type_checking from PQAnalysis.utils.custom_logging import setup_logger from PQAnalysis.exceptions import PQValueError -from PQAnalysis import __package_name__ +from PQAnalysis.io import ( + FileWritingMode, + TopologyFileWriter, +) from .selection import SelectionCompatible, Selection +from .bonded_topology import BondedTopology, Bond @@ -192,33 +196,32 @@ def write_topology( - "o": overwrite """ - writer = BaseWriter(filename, mode=mode) - writer.open() - - print( - ( - f"SHAKE {len(self.indices)} " - f"{len(np.unique(self.target_indices))} 0" - ), - file=writer.file - ) + shake_bonds = [] + if self.line_comments is None: + comments = [None] * len(self.indices) + else: + comments = self.line_comments for i, index in enumerate(self.indices): - target_index = self.target_indices[i] + index = index + 1 + target_index = self.target_indices[i] + 1 distance = self.distances[i] - - print( - f"{index+1} {target_index+1} {distance}", - end="", - file=writer.file + comment = comments[i] + + bond = Bond( + index1=index, + index2=target_index, + equilibrium_distance=distance, + is_shake=True, + comment=comment ) - if self.line_comments is not None: - print(f" # {self.line_comments[i]}", file=writer.file) - else: - print("", file=writer.file) + shake_bonds.append(bond) + + topology = BondedTopology(shake_bonds=shake_bonds) - print("END", file=writer.file) + writer = TopologyFileWriter(filename, mode) + writer.write(topology) @property def selection_object(self) -> SelectionCompatible: diff --git a/PQAnalysis/types.py b/PQAnalysis/types.py index db172695..e99facf5 100644 --- a/PQAnalysis/types.py +++ b/PQAnalysis/types.py @@ -12,7 +12,7 @@ #: A type hint for positive integers PositiveInt = NewType( "PositiveInt", - Annotated[int, Is[lambda int: int > 0]], + Annotated[int | np.int_, Is[lambda int: int > 0]], ) # :A type hint for positive real numbers diff --git a/PQAnalysis/utils/string.py b/PQAnalysis/utils/string.py new file mode 100644 index 00000000..a7daea6c --- /dev/null +++ b/PQAnalysis/utils/string.py @@ -0,0 +1,29 @@ +""" +This module contains utility functions for string manipulation. +""" + + + +def is_comment_line(line: str, comment_token="#", empty_line=False) -> bool: + """ + Returns whether the line is a comment line. + + Parameters + ---------- + line : str + The line to be checked. + comment_token : str, optional + The token that indicates a comment line, by default "#". + empty_line : bool, optional + Whether an empty line should be considered a comment line, by default False. + + Returns + ------- + bool + Whether the line is a comment line. + """ + + if empty_line and not line.strip(): + return True + + return line.strip().startswith(comment_token) diff --git a/examples/add_molecules/shake_perylene.top b/examples/add_molecules/shake_perylene.top index 1e86d4cb..84089b9e 100644 --- a/examples/add_molecules/shake_perylene.top +++ b/examples/add_molecules/shake_perylene.top @@ -1,5 +1,5 @@ SHAKE 12 12 0 -7 1 1.1007868486266905 +7 1 1.1007868486266905 # put here some comment 10 5 1.102015725191353 11 6 1.102015725191353 14 9 1.102015725191353 diff --git a/pytest.ini b/pytest.ini index 88269560..48192988 100644 --- a/pytest.ini +++ b/pytest.ini @@ -7,6 +7,7 @@ markers = io analysis utils + integration testpaths = tests diff --git a/tests/__init__.py b/tests/__init__.py index aece9ef9..41442810 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -4,5 +4,7 @@ import os -__beartype_level__ = os.environ.get("PQANALYSIS_BEARTYPE_LEVEL", "DEBUG") +__beartype_level__ = os.environ.get("PQANALYSIS_BEARTYPE_LEVEL", "RELEASE") __beartype_level__ = __beartype_level__.upper() + +os.environ['CONSTANT_SEED'] = '42' diff --git a/tests/conftest.py b/tests/conftest.py index db4df2e4..03038e32 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -6,9 +6,10 @@ import shutil import logging +from contextlib import contextmanager + import pytest -from contextlib import contextmanager from _pytest.logging import LogCaptureHandler, _remove_ansi_escape_sequences from beartype.roar import BeartypeCallHintParamViolation @@ -37,6 +38,25 @@ def tmpdir(): +@pytest.fixture(scope="function") +def test_integration_folder(example_dir): + + tmpdir = "tmpdir" + + if os.path.exists(tmpdir) and os.path.isdir(tmpdir): + shutil.rmtree(tmpdir) + + shutil.copytree(os.path.join("examples", example_dir), tmpdir) + + os.chdir(tmpdir) + + yield tmpdir + + os.chdir("..") + shutil.rmtree(tmpdir) + + + @pytest.fixture(scope="function") def test_with_data_dir(example_dir): @@ -69,9 +89,7 @@ def text(self) -> str: @contextmanager def catch_logs( - self, - level: int, - logger: logging.Logger + self, level: int, logger: logging.Logger ) -> LogCaptureHandler: """Set the level for capturing of logs. After the end of the 'with' statement, the level is restored to its original value. @@ -119,15 +137,16 @@ def assert_logging_with_exception( **kwargs ): - with caplog_for_logger(caplog, - __package_name__ + "." + logging_name, - logging_level): + with caplog_for_logger( + caplog, __package_name__ + "." + logging_name, logging_level + ): result = None try: result = function(*args, **kwargs) except (PQException, BeartypeCallHintParamViolation) as e: - if isinstance(e, - BeartypeCallHintParamViolation) and exception is PQTypeError: + if isinstance( + e, BeartypeCallHintParamViolation + ) and exception is PQTypeError: return result if not isinstance(e, PQException): raise e diff --git a/tests/integration_tests/__init__.py b/tests/integration_tests/__init__.py new file mode 100644 index 00000000..cc022fb5 --- /dev/null +++ b/tests/integration_tests/__init__.py @@ -0,0 +1,3 @@ +""" +This module contains the integration tests for the application. +""" diff --git a/tests/integration_tests/add_molecules/__init__.py b/tests/integration_tests/add_molecules/__init__.py new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/tests/integration_tests/add_molecules/__init__.py @@ -0,0 +1 @@ + diff --git a/tests/integration_tests/add_molecules/ref_data/combined.rst b/tests/integration_tests/add_molecules/ref_data/combined.rst new file mode 100644 index 00000000..d8ecafc2 --- /dev/null +++ b/tests/integration_tests/add_molecules/ref_data/combined.rst @@ -0,0 +1,717 @@ +Box 21.8331 37.4863 20.122 90.0 90.0 90.0 +Ga 0 0 10.80180897 0.00975971 -3.2581555 1855100390000.0 1192624970000.0 3479765000000.0 2.10811445 0.91532024 -8.8107464 +Ga 0 0 -10.00852663 0.0171062 -6.63482266 -914432764000.0 960647365000.0 783691959000.0 -6.3484452 4.24061483 23.77383879 +Ga 0 0 -0.25119966 18.49209298 -3.37035417 -4140365530000.0 2317662510000.0 3338414420000.0 1.53860776 20.85514935 -10.23482177 +Ga 0 0 0.19389451 -18.6884281 -6.87031187 1061890680000.0 924732476000.0 -3492013120000.0 4.60335062 3.30309762 35.02192063 +Ga 0 0 -5.67236851 9.63479532 -3.81921114 -1773479950000.0 3792433400000.0 560673898000.0 -0.72561935 9.15585803 -18.46583344 +Ga 0 0 5.8264204 -9.33516104 -2.97949364 152052222000.0 83663154100.0 -2521120950000.0 -3.42815343 -4.78510848 -25.35489163 +Ga 0 0 5.29545723 -9.28658872 -6.45167027 -517253154000.0 2010810960000.0 693764835000.0 23.56759928 -13.16129087 18.45378663 +Ga 0 0 -5.34498931 9.36692639 -7.10859633 -59200910600.0 -1344951060000.0 -2896319550000.0 -25.69345199 2.11504613 -35.68257443 +Ga 0 0 5.2404986 8.94645198 -6.97120605 1399209180000.0 1248331080000.0 490018339000.0 2.32351986 5.83401867 -7.47667174 +Ga 0 0 -5.58704881 -9.70620955 -6.2543066 -864400598000.0 -2269529430000.0 813476500000.0 -16.43830653 -19.94019105 53.06638642 +Ga 0 0 -5.55246037 -9.37500959 -2.86440637 -1077486800000.0 484770404000.0 2450078570000.0 2.39312376 6.4253436 4.55025905 +Ga 0 0 5.5248715 9.826137 -3.6157943 5022731290000.0 -160573762000.0 -2058457980000.0 7.45440514 1.56214276 1.59212331 +Ga 0 0 -10.73909253 0.09385009 3.39987992 2485740470000.0 -382762848000.0 -632000351000.0 1.78832072 -11.33363456 8.33202039 +Ga 0 0 -10.01126369 -0.04013755 0.00732452 49080864100.0 12402901000.0 2050274250000.0 -15.03437942 -9.31300032 14.65296003 +Ga 0 0 -0.1751843 -18.64887938 3.26645348 2103027930000.0 1313237240000.0 -41287434600.0 12.03955627 -4.0905736 16.30725307 +Ga 0 0 0.65986627 -18.67446035 -0.04307119 229411003000.0 58604233400.0 111372221000.0 13.77796601 -1.23263423 -13.52262883 +Ga 0 0 -5.55451364 9.65298115 2.81936898 -215919606000.0 -623091258000.0 -636743373000.0 12.83855751 1.88938607 -6.816387 +Ga 0 0 5.67092109 -9.26323113 3.72333637 -9155927110.0 -1182562090000.0 1223590400000.0 12.88414263 -28.70932096 -13.72512832 +Ga 0 0 5.2053977 -9.0044597 0.37088505 -1114545730000.0 -1806647610000.0 -1619044800000.0 8.39233032 2.65767113 -10.03018692 +Ga 0 0 -5.3197898 9.38297287 -0.5964403 -2355395040.0 -467356579000.0 -700338412000.0 -6.5416521 0.88050758 31.42710457 +Ga 0 0 5.38919719 9.1243628 -0.21776152 3475497760000.0 -872567792000.0 -232101066000.0 -7.02636338 11.99330723 -7.38144393 +Ga 0 0 -5.2163702 -9.93538657 0.53397083 -1461077960000.0 561314783000.0 2049464080000.0 -15.84142469 15.79958786 42.3084276 +Ga 0 0 -5.76975177 -9.2812608 3.84003504 -209226771000.0 -401588908000.0 1174897840000.0 18.77879613 -4.52709797 8.21128961 +Ga 0 0 5.36484363 9.11813848 3.26759985 -3004539240000.0 2309071760000.0 -1731060070000.0 -7.75572173 -4.8474037 -42.55698861 +Ga 0 0 -10.81212816 0.00335306 -9.94061966 -1013857700000.0 955352056000.0 43319684500.0 24.82694406 -18.58165342 -31.4619932 +Ga 0 0 -10.18383431 0.03981347 6.71603848 -286697260000.0 -3230816880000.0 -223602238000.0 7.88220616 -13.79380151 3.84167321 +Ga 0 0 -0.5979212 -18.71395573 9.94830166 -1999941350000.0 1938140310000.0 330575336000.0 -12.98026154 -10.82986025 15.31499491 +Ga 0 0 0.11530883 18.62583605 6.59901297 -479416351000.0 -1859700330000.0 -1428398230000.0 -10.57647307 18.15511632 12.95197496 +Ga 0 0 -5.65346768 9.43753966 9.5639714 -66385889800.0 1177191990000.0 -51101201900.0 -0.33752754 4.68760838 -0.28453876 +Ga 0 0 5.34979375 -9.10077759 -9.79612284 1173116980000.0 -479084101000.0 -943188958000.0 19.496744 -5.47233902 -21.19680301 +Ga 0 0 5.04705583 -9.22698358 7.06814836 -1084572540000.0 -656747729000.0 4416000030000.0 -5.84441314 7.31347362 -26.40350844 +Ga 0 0 -5.81788039 9.44694591 6.16971256 152995982000.0 1673846360000.0 700904154000.0 -8.48166247 15.17714673 -22.53948703 +Ga 0 0 4.99913477 9.17591168 6.50663889 -2604424670000.0 1530191640000.0 -1756144250000.0 1.39496161 0.56859535 -15.30427589 +Ga 0 0 -5.61202125 -9.93795136 7.10113387 1375133870000.0 -543318319000.0 -876263674000.0 -23.84144224 -7.70682659 35.33058407 +Ga 0 0 -5.73257068 -9.48578969 -9.53612904 -40961915900.0 -10943042400.0 1364852330000.0 2.18376603 -10.73500281 -30.15649768 +Ga 0 0 5.68401873 9.58095378 9.72484742 -1588604360000.0 -212255081000.0 132751586000.0 11.97646761 7.90403636 38.73567059 +O 0 0 -10.83235933 0.77452627 -5.07484435 6158856250000.0 4061831090000.0 -4410316900000.0 10.01352109 -29.70655815 -11.74353744 +H 0 0 10.19689987 1.18014997 -5.419189 19604500100000.0 29019619400000.0 -6398721940000.0 -3.71470616 7.10377184 5.93227831 +O 0 0 -10.73748342 -0.81021653 -1.52821917 4548661780000.0 2644294440000.0 726174495000.0 -9.01322197 4.3759084 -4.04488865 +H 0 0 10.43960876 -1.47219892 -1.28185128 -2957897830000.0 8632100440000.0 -3172650240000.0 0.06101422 -2.11021876 -3.12325809 +O 0 0 0.06084055 -18.09980354 -5.02164775 3065523610000.0 -718575908000.0 61567766200.0 0.38380999 -5.0026525 5.32688653 +H 0 0 0.36063394 -17.19066219 -4.90828558 9892470350000.0 -4140843360000.0 9453160770000.0 1.70659275 -1.05717616 1.49827544 +O 0 0 0.49948721 17.93663023 -1.7310239 3014114650000.0 897214236000.0 2342565200000.0 -12.76430391 -1.56903104 -17.77378384 +H 0 0 1.05357389 17.15223595 -1.81456205 16174928400000.0 10673423300000.0 -2160418320000.0 1.07760248 3.1225731 0.37236285 +O 0 0 -5.10493117 8.69055526 -5.36980967 -5010642330000.0 2315055810000.0 5093705560000.0 5.1242951 9.15377224 5.13216414 +H 0 0 -4.99506327 7.73693257 -5.28150417 13652909900000.0 5728697850000.0 18737264700000.0 -2.34348794 3.4358325 0.15965548 +O 0 0 4.969171 -8.57033671 -1.49155422 313664176000.0 3833722270000.0 -2482354930000.0 -1.24022654 4.08918941 13.81123206 +H 0 0 4.31414607 -7.93648074 -1.80529616 999330609000.0 5277544480000.0 -996908958000.0 -1.65995627 -1.4408503 8.7001672 +O 0 0 4.76588862 8.93734475 -5.11485605 1918744280000.0 -904571417000.0 -6437269640000.0 3.516854 -3.80168453 4.8356195 +H 0 0 4.2873759 8.19644526 -4.72580776 14781540500000.0 -9124722860000.0 -6270952060000.0 -1.25485214 -4.12158533 -11.1979824 +O 0 0 -4.81534187 -9.16128433 -1.11804966 -2172987780000.0 4383439850000.0 -2114734370000.0 7.11422762 17.55090028 -18.58060728 +H 0 0 -4.16388521 -8.46773054 -0.9636074 3702639380000.0 -358957808000.0 -5602177550000.0 -2.20683383 -0.12971608 -5.71113794 +O 0 0 5.87975683 -10.11481867 -4.74272609 1151584230000.0 -1040216740000.0 -3441832870000.0 -6.73953016 14.73565797 -2.2901304 +H 0 0 6.35918489 -10.95065891 -4.77074206 7206295250000.0 2497645410000.0 -5379630070000.0 -1.82124841 1.45402874 -3.36164746 +O 0 0 -6.20068563 10.09090139 -2.08320503 1999522290000.0 5347572160000.0 -2747526120000.0 1.45606946 0.85044542 -14.97067938 +H 0 0 -7.09862269 10.43655549 -2.0240668 -3489462090000.0 -6843162930000.0 -14837590300000.0 3.53392038 -1.38675527 5.57381775 +O 0 0 -5.98622642 -10.39478653 -4.41045578 958900417000.0 4035469700000.0 -3173000130000.0 3.88563522 26.37230422 -13.64247904 +H 0 0 -5.72091036 -11.32032138 -4.36294062 26526544600000.0 11375143700000.0 -2970590690000.0 0.9019128 -0.61558475 1.89768741 +O 0 0 6.13354918 9.80987801 -1.82402827 -2316766970000.0 2041883940000.0 -1542702590000.0 0.67044504 12.53867633 -4.4416958 +H 0 0 6.94806465 10.29484955 -1.64900769 -5528762330000.0 8124887550000.0 -3450270870000.0 -0.96785132 -2.96592612 -3.68717077 +O 0 0 -10.85596815 0.54800297 1.59390249 5516964630000.0 1123273030000.0 2637503730000.0 2.09680635 16.53559724 -36.55980087 +H 0 0 10.38217513 1.29673334 1.47268565 9289781180000.0 8954881810000.0 32493899700000.0 0.61325206 -2.34962924 -4.79497377 +O 0 0 -10.57319597 -0.76999341 5.06660642 5236628580000.0 -579014162000.0 -1372298660000.0 5.81188801 -7.9851246 5.1649448 +H 0 0 10.76059428 -1.59301327 5.01569063 31186524200000.0 -16128412900000.0 -4506709510000.0 0.57244805 1.3705689 8.25505533 +O 0 0 0.3837975 -17.90256705 1.65465445 -771576073000.0 2781978790000.0 305498438000.0 13.15749712 3.56937605 -30.00526825 +H 0 0 0.85968661 -17.06436358 1.64017816 5514085660000.0 -635214245000.0 9076735320000.0 -4.20129839 -2.65927397 12.42341028 +O 0 0 0.29685041 17.92473293 4.86771586 1244244620000.0 2463001800000.0 -3762122310000.0 -8.23173596 -3.26983702 -16.80989368 +H 0 0 0.7922884 17.10945363 4.72941933 -22990764400000.0 -11038495800000.0 -10989003100000.0 0.81252676 3.60277246 0.26696901 +O 0 0 -5.29800324 8.72507002 1.18353268 -1867423780000.0 793927060000.0 -2649219670000.0 0.46015945 -7.27340555 -3.87082727 +H 0 0 -5.51323357 7.78816767 1.25533063 28600843200000.0 -4967644350000.0 13502572600000.0 0.83353036 2.66573954 -2.26535511 +O 0 0 5.00363323 -8.52061784 5.3093751 -4163284690000.0 -4914316350000.0 5009515150000.0 5.43247765 6.06454673 13.34431237 +H 0 0 4.96183607 -7.56534106 5.18704631 -11435666100000.0 -5722071280000.0 1186501540000.0 -2.04309144 -2.70172521 9.04295104 +O 0 0 5.0610435 8.40713778 1.49709077 -2643945320000.0 -2348494050000.0 -310663017000.0 8.62446514 -4.14365054 24.12576508 +H 0 0 5.48262597 7.54222587 1.43826327 18094444900000.0 6094747070000.0 24172479400000.0 -4.10857559 -1.65629871 5.36533277 +O 0 0 -5.02089219 -9.01127675 5.58572584 2811607140000.0 -4024228970000.0 -2814899780000.0 -3.22043516 -2.11199694 -24.02019388 +H 0 0 -4.15686264 -8.58505575 5.61818612 2615561220000.0 -3433949800000.0 -5347222470000.0 -1.20026708 -2.02947895 0.68553296 +O 0 0 6.04491336 -9.75983967 1.93257805 8210181460000.0 351478742000.0 -5769038850000.0 -12.58372431 -3.58206257 -12.85324796 +H 0 0 6.26265173 -10.65077124 1.63576834 -8179977520000.0 -8508600570000.0 8802444570000.0 3.03747663 -1.6161709 12.25185 +O 0 0 -5.79131508 10.39256944 4.53629929 -1438627810000.0 -3610826330000.0 -3397052420000.0 -1.42112569 0.48111523 5.85273978 +H 0 0 -6.24302335 11.24199964 4.47552893 -1430669700000.0 -2759300660000.0 8446170370000.0 2.79902206 -3.8750387 7.69854801 +O 0 0 -5.77717475 -10.44212021 2.34273041 -3406369210000.0 -462143685000.0 5438111290000.0 8.08366659 27.56104401 -3.65124257 +H 0 0 -5.92980365 -11.35061367 2.62664785 -4314324810000.0 5841544000000.0 25120871400000.0 1.66894463 -4.07337985 -5.25572819 +O 0 0 5.86202586 9.77893615 4.93874457 -2457666680000.0 -2420991530000.0 1119125840000.0 2.18065731 -5.66719761 24.51664775 +H 0 0 6.80038042 9.99272006 4.99399137 -1782774280000.0 -5062747800000.0 -121188187000.0 -0.48473874 2.07118986 4.45328204 +O 0 0 -10.67589614 0.75827 8.37474942 -2071244680000.0 496515832000.0 -211433326000.0 -4.69161171 8.41218812 8.72632592 +H 0 0 10.5220303 1.46461806 8.21076441 10201621600000.0 14229197600000.0 11403310900000.0 -0.59354041 -0.30468821 3.74678412 +O 0 0 -10.46632627 -0.79602641 -8.24750209 -841275981000.0 1717308550000.0 -6607048970000.0 -9.41998173 -4.67389159 11.7424009 +H 0 0 -10.73344344 -1.71237656 -8.11253588 6713104200000.0 370630179000.0 -799108246000.0 -1.27074678 2.1880155 -4.59619206 +O 0 0 -0.05252548 -18.03698101 8.33046381 -7841997910000.0 -3103870660000.0 -2397041500000.0 5.61999566 14.89869816 -19.71498997 +H 0 0 0.37511911 -17.17402386 8.37157471 16296124000000.0 -14557250900000.0 -13069656600000.0 0.3939062 -3.06541659 2.23406645 +O 0 0 -0.02406425 18.01409082 -8.5578818 -1776559410000.0 -288944150000.0 1990536340000.0 -0.38312354 -12.35209966 -7.59836148 +H 0 0 0.60764191 17.29437602 -8.66843945 -5751662860000.0 -2196963300000.0 -8301540000000.0 -1.41716117 -0.31496855 -4.26345419 +O 0 0 -5.08198487 8.97602588 7.7934394 -3863191030000.0 -3037865040000.0 482550053000.0 13.7210237 -4.63335809 23.70633755 +H 0 0 -4.17555531 8.6849885 7.64195424 -4652918710000.0 550968470000.0 -11137844100000.0 -0.91537316 0.00471708 6.27669728 +O 0 0 4.87106114 -8.46058465 -8.12337522 4534112920000.0 3339421560000.0 4465995460000.0 -13.84345141 7.96398883 21.81912414 +H 0 0 3.93607312 -8.22699702 -8.14571994 2684703390000.0 -4789471480000.0 -3125644990000.0 3.60871422 2.1460884 3.77693964 +O 0 0 5.23543396 8.57910966 8.25757326 4096036790000.0 -1084595420000.0 -2773181450000.0 -13.5410049 -24.87124544 -24.94176309 +H 0 0 4.89553572 7.68980374 8.40879898 20872287000000.0 -6376881340000.0 3811391180000.0 3.62435691 2.52151227 1.36590931 +O 0 0 -4.91623139 -9.14069745 -7.87405797 4795597430000.0 -2495609130000.0 2732201660000.0 0.24663676 14.49939916 -26.38527998 +H 0 0 -4.01532762 -8.79912172 -7.90509813 3489285000000.0 1115960810000.0 4560892830000.0 -2.99825137 -4.0381024 1.30116852 +O 0 0 5.82371063 -9.83606141 8.63390812 6841650380000.0 1278709820000.0 -6195279950000.0 -1.24858449 1.92507189 22.37033062 +H 0 0 6.69692849 -10.23661669 8.55446569 -5044660050000.0 -24943359700000.0 -4633776160000.0 -1.71894387 2.59392113 -0.44026808 +O 0 0 -6.16601485 10.03583116 -8.82063301 -3508662770000.0 83840136900.0 -2086030840000.0 5.03034119 -5.97160674 21.05001465 +H 0 0 -6.60185282 10.87816605 -8.64805766 -3803862700000.0 -589540193000.0 455191882000.0 0.17709992 -0.5800964 -6.47001593 +O 0 0 -5.7806622 -10.53801519 8.94892816 1807690870000.0 -3469936340000.0 5781845580000.0 -7.65291754 23.21084309 -4.90055702 +H 0 0 -5.53565163 -11.46631997 9.03544469 -14118327200000.0 -8921384140000.0 -7609378840000.0 -0.89938524 1.20434056 2.46005967 +O 0 0 5.52763011 10.00592246 -8.57581948 4510024240000.0 1821460110000.0 2758423550000.0 -0.33016676 -9.02875529 4.84087015 +H 0 0 5.2649504 10.93342667 -8.57520599 4877308910000.0 1918567360000.0 13208237500000.0 -0.0119547 -0.85471857 13.93134336 +O 0 0 -9.5585705 1.40815589 -2.91709509 -2205982790000.0 -943496830000.0 2620034680000.0 11.27733813 2.54563574 9.88070654 +O 0 0 -9.05781067 1.41824203 -0.68790682 -1733244240000.0 -965727287000.0 3680473030000.0 26.59504072 21.73752278 -32.98242899 +C 0 0 -8.9066559 1.83861912 -1.93540893 -3298277790000.0 -2102191750000.0 7034443450000.0 -11.15269573 20.24082242 17.0110383 +C 0 0 -8.05610653 3.10388972 -2.12044606 -2506744070000.0 -4928521640000.0 -955887802000.0 -0.84194132 -27.03338109 27.66730537 +C 0 0 -8.04961286 3.8359312 -3.32090387 -1001915940000.0 938218941000.0 -6075206030000.0 -6.2786064 20.46985769 12.32665929 +H 0 0 -8.75583431 3.60521776 -4.13800667 -2129069310000.0 -15009275200000.0 -598145907000.0 7.81524905 -9.32530933 1.19057381 +C 0 0 -7.37925525 5.07777214 -3.3679327 7134078850000.0 1364912910000.0 857118693000.0 -21.14370977 -15.23334466 -12.04197249 +H 0 0 -7.5065327 5.73548017 -4.24591621 -31919505700000.0 828781633000.0 6116924560000.0 5.26841699 -4.08150633 -0.22165741 +C 0 0 -6.73017754 5.57337866 -2.24506907 7163400930000.0 8467956650000.0 -8205177220000.0 2.41619654 14.71328816 -11.51299271 +C 0 0 -6.71766713 4.81248988 -1.07840196 -5416372820000.0 -3937336320000.0 -8190375840000.0 12.27919008 7.90911595 23.22916905 +H 0 0 -6.21706115 5.25864326 -0.20091964 -25234319600000.0 -22307603900000.0 12456125000000.0 0.51799523 -2.97744638 -0.86263573 +C 0 0 -7.34820918 3.58745106 -0.97354214 1757369520000.0 -2565060580000.0 2485735980000.0 1.14115849 -9.5785853 -30.53008158 +H 0 0 -7.15397445 2.99089844 -0.06467898 24576038100000.0 3553871370000.0 1625416080000.0 -13.94797665 -0.87875863 -4.35656061 +C 0 0 -6.18504567 6.99090342 -2.25573408 -4396586890000.0 -1750431920000.0 4958540490000.0 -12.53797787 -45.40547049 57.65671549 +O 0 0 -6.11884349 7.57108918 -3.34777235 -2569040890000.0 -38438064200.0 5038969780000.0 7.58803067 27.30929169 -27.77389654 +O 0 0 -5.90984816 7.42152302 -1.06648158 -5969721190000.0 429337809000.0 274778509000.0 -1.12053167 12.51418041 -16.99741164 +O 0 0 9.7150628 -1.5224372 -3.77777164 1694093850000.0 -884401381000.0 905359952000.0 6.03015069 10.416106 -8.26455104 +O 0 0 9.97770879 -1.7352291 -6.07192652 -938338245000.0 752832842000.0 8229685220000.0 -2.94067614 13.4503205 17.16575655 +C 0 0 9.55490782 -2.0907498 -4.92976968 -2452947970000.0 -3491051610000.0 4868988730000.0 2.83628722 -33.16463619 -8.28790773 +C 0 0 8.86132458 -3.44831847 -4.85982074 -462945826.0 -256539058000.0 -2256054800000.0 -6.51997659 27.67218498 -2.43135889 +C 0 0 8.6793067 -4.10410856 -3.62078932 -8439063870000.0 -5905385300000.0 -3888778710000.0 1.61116893 -33.99827822 -8.69258601 +H 0 0 9.24079535 -3.89406794 -2.69329384 -12949771400000.0 -23468381600000.0 2819236410000.0 -3.07624464 16.95003233 -6.43065882 +C 0 0 7.93386657 -5.29814319 -3.5827971 -2358832770000.0 -1201679660000.0 441519046000.0 -6.84725354 20.1126299 -14.24719176 +H 0 0 7.7297088 -5.79539403 -2.61807142 19291837700000.0 -7009702670000.0 2029647470000.0 -0.19779191 -0.31751813 -5.15039698 +C 0 0 7.39700658 -5.79783224 -4.79281016 -3872340030000.0 8227851730000.0 -1911629740000.0 25.86830548 -12.63659323 29.66581544 +C 0 0 7.76454815 -5.22434229 -6.01084964 -1106067470000.0 1374566110000.0 3969872500000.0 -21.14121951 -27.61974832 -10.16691444 +H 0 0 7.55172693 -5.86649525 -6.88376495 -1223867160000.0 -28584103100000.0 26037441300000.0 -7.10890298 12.39391252 -5.95027632 +C 0 0 8.33685889 -3.97509321 -6.06645123 -2925776590000.0 3079930490000.0 -6265249620000.0 6.28803419 14.30098182 17.53844414 +H 0 0 8.25887576 -3.39703647 -7.00421637 18627181100000.0 -4546021040000.0 -12758346300000.0 16.78563156 -0.74501832 3.7183814 +C 0 0 6.65222953 -7.07841748 -4.79112087 5404955410000.0 1972728810000.0 2509146550000.0 -26.16744249 -18.98323384 -8.94551928 +O 0 0 6.1285838 -7.48659979 -3.68869652 -311648526000.0 -1413138950000.0 1202262500000.0 8.26743609 7.73966329 -10.11830041 +O 0 0 6.45774594 -7.65805594 -5.93180975 9191453200000.0 1424510850000.0 1892170520000.0 2.58216188 4.01097026 10.60808947 +O 0 0 10.02294201 1.73751536 -0.79607164 2298430810000.0 3420774170000.0 -3355435340000.0 21.88912145 -0.22458288 35.08891076 +O 0 0 9.37672437 1.25124341 -2.85078967 6283045800000.0 -8243004090000.0 -3176110400000.0 4.00564551 14.4824723 -17.45617001 +C 0 0 9.52838749 2.10925628 -1.87026305 76127138100.0 -1173935160000.0 8350509470000.0 -16.9508249 -6.7196125 6.30143893 +C 0 0 8.83767572 3.44507983 -1.91492886 901247714000.0 -2711755670000.0 -1623092370000.0 3.16356914 -27.72644744 -7.39069039 +C 0 0 8.56217104 4.11488282 -0.71014664 5340912610000.0 -1865190350000.0 1603345050000.0 36.41323428 -25.45366945 -10.11088514 +H 0 0 9.16583245 3.81962517 0.16623811 -14283407900000.0 -9675124900000.0 12489547600000.0 -8.25993425 -2.02970451 1.68124339 +C 0 0 7.68258437 5.16299947 -0.67338366 -4610888450000.0 -2621696100000.0 1801926260000.0 -0.68467881 9.32750925 7.8115062 +H 0 0 7.55498786 5.57006387 0.34526846 11847228200000.0 1103882290000.0 2374690820000.0 -12.81326037 13.93592636 -10.07859688 +C 0 0 7.07066819 5.56778468 -1.86690476 724667402000.0 6220600590000.0 -4582854330000.0 -12.39702057 8.71172844 -37.82378984 +C 0 0 7.34912156 4.90666475 -3.11575882 -9880032300000.0 8071423530000.0 -464626016000.0 -8.13933794 2.06085515 48.18115804 +H 0 0 6.68017906 5.23360268 -3.93139474 -5497269620000.0 19260481200000.0 425858484000.0 11.58379942 -3.52277418 -6.52496772 +C 0 0 8.21330367 3.79140778 -3.11068962 -2638114420000.0 -2204972320000.0 696745709000.0 -26.04075848 26.32318653 -8.29208278 +H 0 0 8.36054925 3.1408261 -3.99085815 -3481459930000.0 -12114914000000.0 7880651370000.0 0.61151755 5.21265909 0.11452687 +C 0 0 6.12802625 6.78856264 -1.89058477 2371734060000.0 -5116417160000.0 -2616503230000.0 17.56594718 -37.34230614 -62.59419512 +O 0 0 5.95899983 7.34235727 -0.78980185 -2388808270000.0 1875526890000.0 -6109315170000.0 -9.48260847 21.2780302 61.94976692 +O 0 0 5.61578848 7.14900218 -3.00225723 1357897480000.0 2359896750000.0 -1743678510000.0 1.25624419 3.89135181 6.57423156 +O 0 0 -9.09837197 -1.53868312 -5.91163184 2447811560000.0 1730951700000.0 -289979192000.0 -10.75881521 16.3238171 -17.46670211 +O 0 0 -9.14219331 -1.18205874 -3.67572309 -671400040000.0 -5635196890000.0 5086534580000.0 -0.15172442 -38.46567125 -28.43432578 +C 0 0 -8.92413344 -1.9243199 -4.70498741 226591502000.0 1220421450000.0 1020067500000.0 49.34237475 8.72663594 31.62670074 +C 0 0 -8.03296828 -3.23163875 -4.63161928 46513775700.0 6827785420000.0 1581083330000.0 -51.39437328 24.3830113 -44.92816429 +C 0 0 -7.82458241 -3.88749788 -5.86642327 -5014311630000.0 -4987500820000.0 3793109230000.0 -23.85313649 13.61143109 6.36844696 +H 0 0 -8.32537492 -3.50706943 -6.77423133 -25955988500000.0 3280446440000.0 18810377600000.0 7.11317952 5.27789558 1.99573717 +C 0 0 -7.19646057 -5.11492404 -5.91323384 -1876914070000.0 -1781905170000.0 5733883590000.0 -4.18186066 -15.80347007 3.43403606 +H 0 0 -7.21778929 -5.7000476 -6.84961513 9880462720000.0 1801893180000.0 3226641480000.0 10.18815976 1.98907488 3.11645169 +C 0 0 -6.74644271 -5.67329613 -4.71284679 -5519020900000.0 -2581446400000.0 -1236285310000.0 16.64740678 -7.34705199 43.16103527 +C 0 0 -6.96458774 -5.01604879 -3.44914956 -6281596470000.0 -2709615450000.0 806285738000.0 15.90398529 -15.61362116 -27.79523928 +H 0 0 -6.52869593 -5.37614688 -2.50048623 19960666000000.0 9463218020000.0 -6630887250000.0 -2.6421276 -8.17218692 -7.33344388 +C 0 0 -7.66763065 -3.83235081 -3.43769919 -4874579410000.0 2638514000000.0 6039767540000.0 8.35516819 46.56779251 5.47790735 +H 0 0 -7.73352615 -3.06173612 -2.64938123 1157722430000.0 -6114687820000.0 15100638800000.0 -2.62889685 -21.39525318 20.50058981 +C 0 0 -6.02952715 -6.99741493 -4.62337724 6835789460000.0 948033155000.0 5212877820000.0 -26.43622762 -7.21174666 -56.43073301 +O 0 0 -5.88877008 -7.72387094 -5.70166361 -1633243860000.0 1917026970000.0 -6011511390000.0 -2.90510822 15.66720418 19.59353918 +O 0 0 -5.71846144 -7.36882006 -3.47183179 104304768000.0 2567163550000.0 3257985750000.0 18.55551707 -43.07570623 42.14675604 +O 0 0 1.27592594 -16.89971865 -2.80035045 691140483000.0 3123190970000.0 -635036826000.0 -4.48352476 7.05001966 -13.26441944 +O 0 0 1.99139502 -17.39952127 -0.73712228 -6244056410000.0 4738126450000.0 -2731788340000.0 -1.26119135 10.59054796 13.31348946 +C 0 0 1.85337645 -16.5624592 -1.74283808 -3178223620000.0 3249580600000.0 -464647315000.0 -2.6640426 -10.32497056 9.4384464 +C 0 0 2.45861745 -15.18470541 -1.58125665 990738928000.0 23565083700.0 3933320030000.0 4.41566371 5.43426118 -45.19678134 +C 0 0 2.75059327 -14.37218138 -2.7261479 -1126664990000.0 -3654490910000.0 -11345746000000.0 -22.41635256 -8.23292757 29.22837065 +H 0 0 2.16148638 -14.6457055 -3.61932875 -16110180700000.0 -3364868080000.0 -1551902340000.0 15.75474796 4.76371249 -7.81076057 +C 0 0 3.49425478 -13.21432866 -2.54085405 -809921484000.0 6409665180000.0 1774987930000.0 -5.42927489 10.87900761 9.68923829 +H 0 0 3.6103757 -12.49880059 -3.37402266 -20731011200000.0 11229173200000.0 3137542750000.0 6.87259678 -5.32210745 -0.6557812 +C 0 0 3.99390393 -12.80974377 -1.24695369 3020274510000.0 -383478051000.0 -4417748250000.0 -15.36986197 21.20192662 -79.80213267 +C 0 0 3.53248432 -13.51127699 -0.16225151 2792110300000.0 8399423470000.0 1447132810000.0 35.65930338 -8.88014011 32.66433426 +H 0 0 4.06680099 -13.34015228 0.78898792 -6248392590000.0 12481915400000.0 5790809150000.0 -14.373657 5.24521444 5.65741024 +C 0 0 2.84087515 -14.70112017 -0.35288579 -5141546800000.0 -1287156780000.0 2167649290000.0 -2.70191769 -37.91625312 24.78021705 +H 0 0 2.69769213 -15.45865664 0.43785535 11619488300000.0 -2998678610000.0 3562992540000.0 -1.32583913 11.61585775 12.54345815 +C 0 0 4.8136557 -11.53418082 -1.26599864 -3259074770000.0 -1460232520000.0 -1233027430000.0 5.13800064 -17.95354727 55.5151646 +O 0 0 5.31839583 -11.17669052 -2.36353815 -4413024390000.0 -2782181700000.0 -1487416360000.0 -2.79388988 1.12654412 0.62872088 +O 0 0 5.05883499 -11.00922143 -0.08051595 535463151000.0 -1211860620000.0 -2936195160000.0 -10.84518231 -7.83068261 -39.9631158 +O 0 0 -1.36608343 17.07618809 -3.99725241 -5202612490000.0 3331159710000.0 -6994739390000.0 3.52779864 -1.50901442 39.22541727 +O 0 0 -1.07650438 17.1199642 -6.20738393 -1518123730000.0 4479662700000.0 2421167310000.0 7.78000942 4.75763207 -18.43164912 +C 0 0 -1.51537634 16.59681572 -5.16417509 1581280850000.0 -2472242230000.0 8400302600000.0 -30.04716997 -10.13763121 -34.1569431 +C 0 0 -2.41700228 15.38206363 -5.36569028 1377381930000.0 -1900683680000.0 -872306790000.0 -0.50657196 -35.03534896 37.4505122 +C 0 0 -2.70958937 14.53995012 -4.21625426 -106160386000.0 2006896260000.0 10408029100000.0 26.37853552 62.31318123 -13.39560705 +H 0 0 -2.41778425 14.898964 -3.21346155 18912667400000.0 -9551941600000.0 9011919920000.0 5.65497159 -0.97349426 -3.6220573 +C 0 0 -3.45999693 13.42082784 -4.31738773 -176631450000.0 1568908520000.0 3830844340000.0 -7.21283953 -36.68585766 -18.80740475 +H 0 0 -3.56498912 12.73968802 -3.45445111 -12572266400000.0 -1069290270000.0 240282713000.0 -9.13909741 5.67403616 -2.62568526 +C 0 0 -3.92439296 13.00922729 -5.60325985 -2130839500000.0 -7029225370000.0 3156955260000.0 -27.02855715 -17.31908436 19.75273791 +C 0 0 -3.61923793 13.7030587 -6.74152852 -1045522440000.0 -3798512750000.0 94374405800.0 27.28699424 72.29017906 -13.16017739 +H 0 0 -4.08724757 13.43119545 -7.70417683 14070867300000.0 -15782405700000.0 -3870350730000.0 5.3421446 -1.28778739 2.23910422 +C 0 0 -2.85316368 14.93208243 -6.61663785 -4201700270000.0 4885550800000.0 -2762725190000.0 -16.56401534 -18.78773754 2.90939427 +H 0 0 -2.70243677 15.62397011 -7.46410896 42658518900000.0 14968868200000.0 13803761800000.0 2.10309224 -8.85874097 -3.32309902 +C 0 0 -4.92264358 11.87959063 -5.64999569 -1421379320000.0 365142727000.0 -4493805580000.0 44.00868593 0.49009142 21.80554736 +O 0 0 -5.25793323 11.515949 -4.45715766 -2634615670000.0 1788224940000.0 3076389230000.0 -17.71047901 -27.23345046 -18.73395745 +O 0 0 -5.16642707 11.32952813 -6.77921662 375643423000.0 -8112400470000.0 -2614230130000.0 -12.36646009 -0.18380215 23.0564443 +O 0 0 -0.73432837 -17.17137914 -0.69479328 1568187270000.0 -2110262210000.0 1085387490000.0 17.09512368 -20.83969657 19.153921 +O 0 0 -1.56467948 -17.56500048 -2.79526586 3951916400000.0 581687445000.0 -3913192210000.0 23.92302914 -17.52277085 8.24384486 +C 0 0 -1.38080606 -16.85605645 -1.71155454 4374557180000.0 1760889120000.0 -2024497440000.0 -12.14772304 -6.01879619 -24.73114381 +C 0 0 -2.1072104 -15.58184864 -1.63969947 2849948660000.0 225277420000.0 -483063162000.0 -22.49298257 54.47463855 2.66207254 +C 0 0 -2.22217086 -14.90431978 -0.38310676 -3454232280000.0 -2122215780000.0 -2576790610000.0 9.82872289 -36.40441499 -31.44309976 +H 0 0 -1.67449563 -15.44518859 0.40881949 14492754400000.0 21003146600000.0 805680178000.0 -6.24410417 10.92735793 9.61813235 +C 0 0 -3.06332621 -13.81656367 -0.23623565 2086330030000.0 -905977822000.0 3548664710000.0 -30.71941874 9.55409685 -17.46754576 +H 0 0 -3.41892363 -13.50624594 0.76220704 476230337000.0 -7370368180000.0 4984368230000.0 11.67147224 7.37260084 -0.51696909 +C 0 0 -3.75670289 -13.26195102 -1.36801241 1379443240000.0 64506146400.0 -5359433770000.0 23.14894591 -49.97900968 22.19556822 +C 0 0 -3.5864248 -13.91230559 -2.6227791 2224219540000.0 -3067841120000.0 10462291600000.0 5.60169657 38.12850137 13.59952421 +H 0 0 -3.99381848 -13.44305709 -3.53572524 6992484660000.0 -9110358190000.0 5228682560000.0 -7.17003179 -3.4142819 4.47503345 +C 0 0 -2.74106329 -15.00565549 -2.76482022 -401497965000.0 -128461455000.0 999640922000.0 -9.29019894 -24.45925111 10.81566267 +H 0 0 -2.80575913 -15.57068305 -3.71149478 -11178211400000.0 31844890000000.0 -17347336000000.0 10.45352679 2.78197842 1.0464484 +C 0 0 -4.70775809 -12.14910434 -1.14450426 -8607592980000.0 -1048348680000.0 1840064600000.0 11.04682509 14.21486305 11.86884206 +O 0 0 -4.97243636 -11.75121894 0.09583073 -3382045080000.0 -1653805360000.0 -2756360940000.0 12.4598177 -32.6556917 -20.25191237 +O 0 0 -5.13826722 -11.5642353 -2.14810435 -9138720020000.0 -1536414020000.0 1295556550000.0 -20.17901768 5.59503754 -20.62343147 +O 0 0 1.65899816 17.49504423 -6.37138326 -2506214360000.0 -2398783410000.0 -2384299360000.0 6.74929886 -4.02502708 -16.60302435 +O 0 0 1.71857735 17.20738437 -4.1376925 -2778868240000.0 4733591400000.0 3579696590000.0 -9.57080006 1.76919608 6.64272022 +C 0 0 2.11538611 16.8980875 -5.31466188 2160552090000.0 4573619250000.0 -4690649760000.0 -38.77649973 53.68231602 11.22286945 +C 0 0 3.07706287 15.82646095 -5.41408259 -5879410740000.0 4278226760000.0 -2160502020000.0 44.6034644 -50.66861092 9.70342058 +C 0 0 3.43440303 15.22906 -6.66003924 1653582440000.0 1679462870000.0 -2978269550000.0 2.05327859 2.69250044 29.42463121 +H 0 0 3.26848267 15.825539 -7.5745433 244479431000.0 -10487960300000.0 -10658731400000.0 -6.80570736 -9.3607043 -0.24311641 +C 0 0 4.10694424 13.98932129 -6.64228944 511682336000.0 -11236084300000.0 6913280280000.0 -5.75029168 40.84552469 -37.60682345 +H 0 0 4.53599814 13.50536292 -7.53746064 -6105225720000.0 -2020632190000.0 -1240361680000.0 -11.55094823 1.12887159 -3.47778031 +C 0 0 4.47622262 13.46152536 -5.43858537 217742373000.0 -5243534980000.0 -3324766420000.0 29.16636736 -55.85751183 35.75425685 +C 0 0 4.31309995 14.12336022 -4.21849326 9219392380000.0 -423308633000.0 -7247056850000.0 -5.20702312 13.96266622 11.21904832 +H 0 0 4.84018524 13.5781654 -3.41563702 6368598150000.0 19126843500000.0 7900428930000.0 -8.15230799 11.45777007 11.75816577 +C 0 0 3.59397974 15.3286421 -4.15201695 -629480625000.0 -7215386830000.0 6494292370000.0 2.24698241 -7.03843518 -55.92005702 +H 0 0 3.47799169 16.01271167 -3.29281381 15988110300000.0 4539630800000.0 -621379672000.0 -1.75425814 -13.05087043 2.72954057 +C 0 0 5.13644339 12.06307959 -5.40770915 1613269930000.0 2511327760000.0 -1016724190000.0 -5.26987415 18.49561954 5.6465791 +O 0 0 5.18791145 11.43134277 -6.48952324 -262940745000.0 -2120886480000.0 3498994380000.0 0.0085427 -4.52094351 6.65214614 +O 0 0 5.60196561 11.63897561 -4.24804747 -1765313860000.0 592475099000.0 1002845470000.0 -12.20168597 5.94706128 -13.77654112 +O 0 0 -3.36617124 9.49710915 -3.32883821 2203327510000.0 -3547614390000.0 -2956062530000.0 -16.68387055 -14.3294401 15.23487354 +O 0 0 -3.60995161 8.78624804 -1.17951093 3666501170000.0 -4846453880000.0 5032149600000.0 7.68393021 -5.25197805 5.78409475 +C 0 0 -2.91700609 9.07944304 -2.19904635 3530577490000.0 5679002720000.0 7147294820000.0 26.00945955 40.96971544 -19.22493629 +C 0 0 -1.40284638 9.18389445 -2.04332868 4939671980000.0 -3340189700000.0 656508340000.0 4.42022728 18.16103106 12.02561484 +C 0 0 -0.61958277 9.36588745 -3.20196059 -370792073000.0 13010298000.0 -3280394160000.0 -9.87123957 -10.02671722 -10.50138112 +H 0 0 -1.08919568 9.48457603 -4.19443787 -9475487950000.0 -24803598900000.0 -1940076700000.0 -7.39456542 -7.22410988 5.35015036 +C 0 0 0.76347783 9.38809466 -3.20193229 -532394449000.0 1491567050000.0 -5612802420000.0 7.5385873 11.51280798 34.63018393 +H 0 0 1.16895585 9.5211285 -4.22052151 -5618822770000.0 29613747400000.0 -3964673270000.0 18.43074577 -0.81315249 12.41494596 +C 0 0 1.46250228 9.34223776 -1.93582932 1940746380000.0 -876846122000.0 -6408989560000.0 -42.59635285 -6.24141617 -32.91395078 +C 0 0 0.67907766 9.25902851 -0.76282379 -1092656490000.0 -1456259070000.0 5746932760000.0 -5.23278974 22.96281807 -9.31140786 +H 0 0 1.14322222 9.2690784 0.23922573 -18762839500000.0 12717252100000.0 13789526300000.0 4.76000629 0.10000007 -5.81055552 +C 0 0 -0.72256086 9.37957163 -0.80964964 -7934610050000.0 7156942820000.0 2723546060000.0 0.37389516 -41.45379812 -8.41667226 +H 0 0 -1.23389846 9.32270237 0.16755769 -15777503900000.0 2102098700000.0 -1674529560000.0 -6.57492049 1.74787202 -6.20897458 +C 0 0 2.92495406 9.4012029 -1.87445696 2259115410000.0 -5749412840000.0 -7978740630000.0 42.77772825 16.40291809 -31.43802744 +O 0 0 3.50512262 8.94137952 -0.84806694 2075959080000.0 -894966003000.0 -3873458110000.0 6.52388666 -0.60061079 9.39617361 +O 0 0 3.56300484 9.95659554 -2.89146372 6256525830000.0 870983782000.0 -2745560550000.0 -18.15968662 -17.87475579 22.90445577 +O 0 0 3.40735765 -9.0329805 -3.5643254 -1542277800000.0 3026196110000.0 -4798776200000.0 5.66645338 3.82274625 -9.82324535 +O 0 0 3.5529056 -8.84472515 -5.82737203 -1934313930000.0 -2885179340000.0 2055002560000.0 -31.73390424 7.9281611 13.31014371 +C 0 0 2.88210719 -9.0247975 -4.71705643 -7328479760000.0 9741674240000.0 3053263260000.0 24.79061661 -15.42277199 7.04035765 +C 0 0 1.4122565 -9.25585026 -4.77068016 -1847233410000.0 -3707628160000.0 -4345076020000.0 -0.85266922 5.73155274 9.62287033 +C 0 0 0.73947712 -9.33215187 -3.52635814 3186639650000.0 13957502500000.0 -5005019850000.0 11.83387204 18.28752011 1.11213233 +H 0 0 1.34274052 -9.28319496 -2.60260985 17552194100000.0 -15740533500000.0 -12812654700000.0 2.68874856 -4.31688196 -4.5485566 +C 0 0 -0.63665669 -9.25856168 -3.39580239 7701869460000.0 4890402150000.0 -3920410830000.0 -18.11737571 -4.50849342 -14.50640755 +H 0 0 -1.07779458 -9.28103993 -2.38361342 -12939793600000.0 -2472507500000.0 -13080088800000.0 -2.99846622 -1.23945434 -5.4887529 +C 0 0 -1.43889887 -9.17533485 -4.56396485 -355179583000.0 -2161568390000.0 3146476200000.0 52.8300935 -4.85450301 -41.69539683 +C 0 0 -0.73849364 -9.15727958 -5.82533733 -961024875000.0 -6343490120000.0 -4219793270000.0 5.59029983 -8.33908813 13.86228088 +H 0 0 -1.29860797 -9.13574532 -6.77688483 -8890067540000.0 9683637910000.0 810226490000.0 -6.54287055 -0.82214129 6.2888845 +C 0 0 0.67068234 -9.23076639 -5.95418061 -1351648280000.0 8265032240000.0 4666298100000.0 -44.57198653 -1.76744983 9.73857113 +H 0 0 1.09537189 -9.36778544 -6.96437811 -24250542200000.0 -33026563800000.0 640168677000.0 4.90528979 8.86356048 6.19753653 +C 0 0 -2.89787344 -9.38169114 -4.60591832 4934041480000.0 -5957056980000.0 -1562033450000.0 -29.86767593 -6.93545644 10.82976458 +O 0 0 -3.48806309 -9.46674011 -5.75133389 -1007695310000.0 1987151290000.0 1061033580000.0 5.89152273 5.25148214 17.47945038 +O 0 0 -3.48057883 -9.57099404 -3.46587486 2254040630000.0 -1233423640000.0 5764309600000.0 -3.04294304 11.27569099 -8.75017908 +O 0 0 7.65827447 -9.40978526 -2.48265966 -4686158370000.0 -5371302080000.0 3675262000000.0 24.87290667 -6.25651035 30.31302362 +O 0 0 7.38735263 -9.35507792 -0.23262651 137762328000.0 -3543800660000.0 -1401372660000.0 21.68466269 -0.88386548 1.6569932 +C 0 0 8.13919393 -9.4313765 -1.22758475 59654178000.0 6405455330000.0 327917388000.0 -32.76326068 7.46396499 -52.11858358 +C 0 0 9.61341528 -9.53290864 -1.16607682 9111688970000.0 -3762274920000.0 -2587082410000.0 20.23642779 -6.65241871 8.83201372 +C 0 0 10.4586061 -9.45211701 -2.29225092 -33399863500.0 -12258317400000.0 2535269200000.0 -8.64870252 2.44555061 4.31523605 +H 0 0 10.05746059 -9.24554769 -3.3002419 -6925307480000.0 -1315288290000.0 7520583480000.0 -3.07089324 -3.93504021 4.8633386 +C 0 0 -9.98784776 -9.49300869 -2.12106147 -2193293610000.0 3845267970000.0 -1728116660000.0 -29.89489844 7.21553133 -47.03695459 +H 0 0 -9.35741876 -9.36268578 -3.0183962 5443043090000.0 28084473900000.0 7157187350000.0 1.8156731 -0.5668001 5.42807002 +C 0 0 -9.41830599 -9.64922265 -0.88653353 2783679680000.0 -1047013490000.0 2919126550000.0 37.29916584 -23.17658072 43.43616044 +C 0 0 -10.2423463 -9.82700265 0.24965803 -1595059340000.0 -2185718900000.0 -346431894000.0 -3.54223796 9.90801363 -5.75957841 +H 0 0 -9.78259468 -9.91955004 1.24950696 -37314573100000.0 8803612020000.0 17095341300000.0 -1.76026275 0.04201106 -3.12645851 +C 0 0 10.19761081 -9.7412858 0.10087952 2849580660000.0 1613031160000.0 5687684190000.0 11.09678046 25.51628011 1.31261596 +H 0 0 9.5507519 -9.44483835 0.94546633 -9907624410000.0 4506114980000.0 -5098370090000.0 1.27023068 -19.64006012 5.55570661 +C 0 0 -7.88992979 -9.64560606 -0.85468724 1505991470000.0 982558402000.0 3908744620000.0 -3.72439737 26.78912097 -14.65264019 +O 0 0 -7.26094906 -9.69402663 0.25133286 -1623662160000.0 4953328410000.0 -3480112550000.0 -7.15014521 -9.27412119 -17.49270384 +O 0 0 -7.36594412 -9.39066908 -2.0293712 -7015993720000.0 4127543030000.0 3199652660000.0 2.12063381 -12.22286486 18.63525811 +O 0 0 7.19419947 9.15434039 -6.35610426 -1635947190000.0 -1601145010000.0 1442471740000.0 16.78882848 14.76180001 6.45486605 +O 0 0 7.47401632 9.50514463 -4.11373603 -1279237930000.0 -2604056950000.0 3858549230000.0 -5.17222616 4.08238669 -27.39957609 +C 0 0 7.91973701 9.43934481 -5.34216934 359281969000.0 305136400000.0 3027460130000.0 -19.21112554 -12.61330212 7.58666669 +C 0 0 9.40543675 9.54713786 -5.46366516 -3427230060000.0 -5962098500000.0 -3422664650000.0 10.12115253 1.61686808 11.50617568 +C 0 0 10.1461655 9.59166089 -6.64498341 3480187170000.0 -6712506210000.0 6316019580000.0 -29.34095672 -13.76442585 -16.92116469 +H 0 0 9.55973445 9.49566917 -7.57585323 4858745080000.0 -11818370100000.0 5974072180000.0 7.4551334 6.0388218 -3.55583356 +C 0 0 -10.2970896 9.52661325 -6.60294552 10459393400000.0 -1145933960000.0 6267966760000.0 -2.25718685 6.92012409 -28.35824985 +H 0 0 -9.55930733 9.5115641 -7.42458125 12228822100000.0 25062222500000.0 7376782480000.0 -15.50594193 0.08737112 -12.51832658 +C 0 0 -9.66468128 9.52234492 -5.39531746 -3244362600000.0 -8792210610000.0 -3421882300000.0 39.33385444 -12.14975224 41.29957014 +C 0 0 -10.39417115 9.45244775 -4.18664224 891888192000.0 -4011731890000.0 -5011631450000.0 56.51730542 7.56165683 11.82209383 +H 0 0 -9.87001722 9.4165897 -3.21524568 960671620000.0 34303234700000.0 -3634390740000.0 2.19562441 -1.55278936 -3.82042555 +C 0 0 10.09414731 9.49443901 -4.22533538 4306379230000.0 507928776000.0 1200614900000.0 -71.04524324 -6.32860475 -15.53847674 +H 0 0 9.3625824 9.3558946 -3.40970516 1369710480000.0 -13445855800000.0 -3803592400000.0 15.28941041 4.28804379 12.66668098 +C 0 0 -8.15425774 9.50673769 -5.42543228 -7656031740000.0 -7816193350000.0 5451609080000.0 5.36252831 11.59435188 -30.9318398 +O 0 0 -7.56638851 9.90643829 -4.34728889 -5539831240000.0 -1869639410000.0 -4528252100000.0 5.9542579 -14.14768216 -10.8841366 +O 0 0 -7.5804288 9.26977249 -6.58052048 2500293630000.0 -5218398590000.0 7206586890000.0 -15.04206888 8.39565827 49.1521882 +O 0 0 -9.33211473 1.44484604 3.73179157 581649034000.0 271532115000.0 51955559400.0 -2.99886717 6.21266225 -25.54623255 +O 0 0 -9.09113597 1.44175588 5.92528265 9793233290.0 -150815898000.0 -3575509490000.0 1.3970088 -6.60882335 45.49378279 +C 0 0 -8.96163687 1.99346471 4.80292247 -5500774690000.0 -4465821400000.0 -2131518890000.0 13.44209999 -1.678681 -3.12283836 +C 0 0 -8.21592788 3.2862033 4.74686771 4598352080000.0 3508851580000.0 -45757668000.0 -0.41936421 2.93359929 -72.12776662 +C 0 0 -8.05597928 3.90678212 3.45983687 29633759900.0 -6628337760000.0 1251472010000.0 -14.56458877 -1.38523962 14.36644644 +H 0 0 -8.53529842 3.45475472 2.57351931 21087562200000.0 1899038500000.0 -14485636900000.0 1.91415028 -3.40028946 4.58974682 +C 0 0 -7.46486106 5.15905948 3.31950542 -5023101340000.0 -2101530180000.0 1616636040000.0 1.18631582 10.37911103 29.12813954 +H 0 0 -7.51878345 5.73766448 2.3803872 24911434800000.0 -15904146800000.0 -8606150100000.0 5.36413536 -6.28442573 1.54424875 +C 0 0 -6.95257146 5.78622995 4.4917353 -3121053930000.0 2584912380000.0 -2952418040000.0 -0.91274225 -31.20148081 22.97958374 +C 0 0 -6.99475705 5.09981814 5.73770842 5354892240000.0 -5300626400000.0 191224317000.0 -6.29987542 -3.51998957 -7.64508959 +H 0 0 -6.6239816 5.55776116 6.67175778 -33774526000000.0 13977222000000.0 6272349960000.0 3.76955021 4.3695747 -8.15121823 +C 0 0 -7.61840973 3.85169787 5.84996364 2441551910000.0 -2986691400000.0 -4935419590000.0 0.32991354 2.44559735 14.32254926 +H 0 0 -7.737773 3.24273987 6.76350455 -30145171100000.0 7603846540000.0 -2133645770000.0 6.21170667 12.56522494 6.51774175 +C 0 0 -6.38032935 7.14716786 4.54379764 -1228793930000.0 864385028000.0 -1736958330000.0 -7.87946385 21.64035833 -19.99499931 +O 0 0 -6.4399524 7.8620853 3.48425095 -4017832810000.0 1497672070000.0 1283508310000.0 6.26501729 -11.50798092 0.40652966 +O 0 0 -5.94941565 7.57549938 5.66937158 2346863370000.0 364768979000.0 5050310290000.0 -5.17830793 -3.58416115 -2.71274634 +O 0 0 9.98827244 -1.59881431 3.05075358 -834457825000.0 499533764000.0 2498343910000.0 0.48006245 1.09432065 -9.2465339 +O 0 0 10.34337573 -1.93141187 0.80283203 -500969406000.0 4053857260000.0 -1680778390000.0 11.3584864 10.09813322 -6.91023666 +C 0 0 9.82956374 -2.20813695 1.91516188 3712349550000.0 1729247720000.0 3571860660000.0 -17.44385562 -5.20746721 1.86081529 +C 0 0 8.89250096 -3.38272065 1.92492188 -6422251170000.0 -4013671890000.0 -3444490150000.0 1.38355397 -2.61586665 0.54355616 +C 0 0 8.4624817 -3.91969565 3.16108383 1572957310000.0 3248879170000.0 3404466980000.0 21.30361161 -10.78956417 -25.68103482 +H 0 0 8.84994904 -3.44248574 4.07856635 8540703300000.0 -3540026210000.0 3992989280000.0 -6.02256098 -3.3458792 -0.43100881 +C 0 0 7.78723725 -5.14409863 3.13824622 2844368040000.0 -2633011600000.0 -8505424440000.0 -19.71965179 38.53654395 28.69548583 +H 0 0 7.38179859 -5.50818602 4.09881599 33920959000000.0 -26629411400000.0 -4483993430000.0 3.31771562 -8.34929805 -3.32368905 +C 0 0 7.27796132 -5.63603614 1.93874071 4476105470000.0 -1126260630000.0 881589042000.0 -19.45883354 -43.72457927 16.20608206 +C 0 0 7.74222809 -5.14905762 0.72211226 -570431483000.0 -528202671000.0 4599063670000.0 17.69246191 8.02508795 -13.51847074 +H 0 0 7.60609992 -5.75696143 -0.18978494 -14791153500000.0 3554926900000.0 3999972880000.0 -10.42763306 8.1734636 -0.0076241 +C 0 0 8.57191134 -4.01675088 0.70345056 -7854328010000.0 -63067019000.0 -857503295000.0 -17.01043502 -12.3332508 8.4739866 +H 0 0 8.85019097 -3.62960537 -0.29269864 9293797130000.0 8186636690000.0 7139099640000.0 9.07898911 3.86000635 8.82839752 +C 0 0 6.33012658 -6.82725076 2.02045304 -2375354390000.0 9485750990000.0 1807407580000.0 14.292215 -8.72829821 -29.59396573 +O 0 0 6.18988176 -7.4367837 3.1346571 4358171340000.0 3374001650000.0 1116692680000.0 1.09940665 22.4158351 -5.82897257 +O 0 0 5.78895843 -7.18946139 0.89063745 960965303000.0 -4288080430000.0 -10660043200000.0 6.29956798 9.17809956 25.48484709 +O 0 0 9.9989378 1.49555627 6.12465817 -6185312610000.0 -1539648620000.0 1170789660000.0 -3.19764393 12.79497909 -0.92479827 +O 0 0 9.78107447 1.44417145 3.88206122 -169002001000.0 6924193190000.0 -2574486550000.0 0.64471113 2.416695 -10.21684856 +C 0 0 9.60667985 2.00243852 5.0254943 7583093350000.0 11576470400000.0 -5887621690000.0 -3.57171696 -13.13419554 24.51829514 +C 0 0 8.78120384 3.24780163 5.04179511 -4264779900000.0 3214719300000.0 -367021052000.0 -0.82394191 -26.07813125 -33.54074214 +C 0 0 8.1903725 3.75097638 6.2012999 2791025080000.0 -3276636340000.0 -2333992770000.0 32.80905532 -9.28118748 -7.91351427 +H 0 0 8.48887859 3.22212147 7.12371034 -23211082400000.0 -12983521600000.0 515339052000.0 -6.2791853 9.22917161 4.19439558 +C 0 0 7.4631949 4.92950089 6.11787567 -6532360400000.0 -1717809130000.0 2360945270000.0 -20.2221444 -17.06818461 9.88365715 +H 0 0 7.03525385 5.27910332 7.07405505 21896278400000.0 -7877217470000.0 17336300400000.0 -1.92571329 12.09686269 -8.88833218 +C 0 0 7.06888478 5.39917933 4.85679912 2005737260000.0 3110988260000.0 4454366540000.0 3.08569966 12.31219687 -11.44611164 +C 0 0 7.582556 4.7910624 3.66009191 3927000830000.0 -5300440710000.0 10329057800000.0 -35.09550092 46.73185337 32.76273978 +H 0 0 7.25250691 5.30823264 2.74181256 35696948400000.0 25845066300000.0 16451255100000.0 5.29743973 -11.40605246 -5.24198052 +C 0 0 8.43221338 3.71507029 3.75163125 2331669020000.0 -2608795370000.0 3061025560000.0 7.87789061 12.83967788 3.2577286 +H 0 0 8.8843112 3.3294413 2.82075409 3451576790000.0 -1036625030000.0 2953635900000.0 0.22655377 -6.52522984 8.12431715 +C 0 0 6.13862256 6.61200775 4.85039999 2482255750000.0 -11732775100000.0 2575211950000.0 6.34327338 -24.15907791 51.09640443 +O 0 0 5.73105302 7.01524422 6.01544234 -3275633430000.0 85883760900.0 4785466280000.0 8.43888223 9.877916 -5.17454822 +O 0 0 5.72845933 7.10299718 3.78158352 -4679534230000.0 -807746327000.0 -1723909830000.0 -5.39492319 22.30556151 -46.5883395 +O 0 0 -8.6971866 -1.30464697 0.54724259 -547032966000.0 5385218820000.0 -6577057430000.0 -0.44566099 -3.38267872 5.49682278 +O 0 0 -9.06164331 -1.21180455 2.76081406 6661813570000.0 -6451008220000.0 -1475326170000.0 7.9548338 -18.07962849 7.7934533 +C 0 0 -8.63365386 -1.81516201 1.75637147 5762474050000.0 3939143840000.0 -5344156160000.0 23.9314912 -6.21151957 -26.08493748 +C 0 0 -7.84767029 -3.15274558 1.81885561 -5186687320000.0 -1022888630000.0 5657454900.0 -57.20839236 51.57679416 27.74850077 +C 0 0 -7.27061332 -3.69910814 0.6903194 2121680610000.0 3504338440000.0 2699959440000.0 -7.51349493 27.09571452 -26.78311826 +H 0 0 -7.40260074 -3.11223842 -0.23585427 -11203872400000.0 -10379801100000.0 -4198720530000.0 8.85449577 -4.63157649 -1.7489253 +C 0 0 -6.62703141 -4.90314338 0.76623231 -2015282130000.0 -532985140000.0 5909128450000.0 35.8760958 -17.61164453 -8.12767666 +H 0 0 -5.91823731 -5.2123929 -0.0221902 1962739670000.0 26201350900000.0 -1000849540000.0 -12.28156331 -6.57306346 -4.82483576 +C 0 0 -6.57208709 -5.58757156 1.98810355 6705117570000.0 204797979000.0 1350024880000.0 -6.96042875 -15.00483535 -7.90207159 +C 0 0 -7.30212725 -5.12087095 3.06557535 -5217296340000.0 5254177820000.0 -5770846440000.0 2.57151137 40.60690056 42.3181144 +H 0 0 -7.06175676 -5.55754613 4.05105556 4978537580000.0 -20328042000000.0 -19593445800000.0 -14.27260834 -9.18137527 -1.97661632 +C 0 0 -7.89748192 -3.83663077 3.02557511 2973345780000.0 -7522582450000.0 6691634360000.0 5.23702917 -27.73257465 -1.57620393 +H 0 0 -8.50067386 -3.38314277 3.83188928 -4663515460000.0 -4268749540000.0 -851414745000.0 8.51406528 -5.27778414 3.83699115 +C 0 0 -5.98836472 -6.95399618 2.06325387 2489251040000.0 -2227621050000.0 205511338000.0 21.1982244 -14.25659897 -15.56231289 +O 0 0 -5.58413497 -7.47027133 0.96889784 -551843004000.0 4320456390000.0 -335822558000.0 -9.98697634 -2.61709586 31.80522909 +O 0 0 -5.91947707 -7.49766418 3.26486036 -4839030180000.0 -3225491520000.0 -522034155000.0 -4.3204927 16.73539167 -27.98794706 +O 0 0 1.4457335 -17.28377878 3.97334403 -5543144560000.0 4899251960000.0 2793155650000.0 10.1494816 21.73331616 16.45741579 +O 0 0 1.37217735 -17.35621742 6.24252748 975289583000.0 -1433939620000.0 2095231950000.0 5.06456528 12.34517744 -8.45382326 +C 0 0 1.65126436 -16.749268 5.11952632 139810876000.0 6800659260000.0 2051298900000.0 -5.85309627 -32.98300794 7.61119029 +C 0 0 2.28144693 -15.40538899 5.21047035 -3158368670000.0 4318635940000.0 -1371486120000.0 -5.1293988 12.75511921 -70.61214973 +C 0 0 2.50839039 -14.76471593 3.93903629 3101236960000.0 -7285237860000.0 2305591160000.0 21.61143943 57.26386426 40.24559905 +H 0 0 2.41023061 -15.2306977 2.94261265 -38762106300000.0 16654375700000.0 -4765825610000.0 -7.53708021 -4.97759895 9.67456649 +C 0 0 3.00442775 -13.42279556 3.99416506 676700751000.0 1182428580000.0 5189244730000.0 -1.66899482 -11.00644562 13.26377221 +H 0 0 3.16260488 -12.75840431 3.12629486 13524235500000.0 -3846394270000.0 3681047230000.0 -0.83296103 -12.49697623 -7.27257838 +C 0 0 3.37405615 -12.80310988 5.22546508 1737285750000.0 -1420830080000.0 -2718785180000.0 7.42549723 -19.38477296 -24.92666187 +C 0 0 3.22708547 -13.52808809 6.4012742 -1430243010000.0 -3732650540000.0 5797386650000.0 -5.28619382 16.1621624 19.36228403 +H 0 0 3.59648776 -12.99536994 7.29535907 5802124220000.0 -18224599900000.0 11443910400000.0 -3.42674621 -9.88003383 5.77681438 +C 0 0 2.56060972 -14.7414853 6.40728974 3287832670000.0 1892954580000.0 -4966240020000.0 4.48257712 -38.56481471 1.46299465 +H 0 0 2.45469007 -15.42881809 7.26518781 14111459800000.0 13709176900000.0 5837038500000.0 -1.20003086 14.42711486 10.41601711 +C 0 0 4.25484897 -11.58307941 5.32120424 -1445108190000.0 2326786760000.0 -9383080760000.0 5.563913 7.94276325 -48.18267344 +O 0 0 4.76397218 -11.15302386 4.18966654 208095768000.0 -521891351000.0 -3503593240000.0 -12.89299125 -5.08125198 35.83326578 +O 0 0 4.49381797 -11.13261521 6.48642797 -2073228450000.0 -6462807750000.0 -2121939590000.0 2.47300384 13.64472767 -1.63986147 +O 0 0 -1.35336479 17.42704039 2.73394237 538656459000.0 2903326720000.0 -1820388120000.0 -7.39804517 -10.3743611 -6.04269341 +O 0 0 -1.12968782 17.42318849 0.49858375 706408737000.0 12378968000000.0 -3184944850000.0 15.68686531 11.64936084 -32.54335944 +C 0 0 -1.5505668 16.92708395 1.54469623 619292052000.0 -5870113070000.0 -2883133870000.0 -27.43580363 -20.55924948 34.49121052 +C 0 0 -2.43575942 15.67305303 1.46703856 825947461000.0 -732296956000.0 -5402034260000.0 -0.23571978 4.35667556 -6.02086931 +C 0 0 -2.94009411 14.96996273 2.58317111 152963901000.0 2959082710000.0 -2115852300000.0 21.17291053 -12.57732816 -35.19517598 +H 0 0 -2.58106392 15.1619925 3.60974615 -3790188720000.0 -10672617000000.0 1813137630000.0 -8.07482353 7.89776317 -3.86300228 +C 0 0 -3.60787854 13.75735702 2.32218707 110172582000.0 2899838250000.0 -3325821030000.0 -20.45996653 20.09900312 16.8957183 +H 0 0 -4.05542639 13.37528298 3.2567216 28922099500000.0 6842129200000.0 12083949800000.0 1.77072172 -20.32144422 -8.60001611 +C 0 0 -3.96620426 13.27254083 1.03806747 1506098150000.0 -10393031100000.0 5798893420000.0 26.63290806 8.99140973 13.27350222 +C 0 0 -3.43799153 14.02380813 -0.05499824 -4853911820000.0 -1871625780000.0 -2417795050000.0 -50.10101516 -31.64415787 -1.30069917 +H 0 0 -3.78903098 13.83907884 -1.08566832 -17436730900000.0 -3896207160000.0 2230700500000.0 8.06898046 -11.74665629 1.50438665 +C 0 0 -2.79507716 15.20506955 0.16655528 -1528111670000.0 5162986950000.0 6511241980000.0 48.19387285 36.61413615 25.21898081 +H 0 0 -2.27275482 15.71724032 -0.66078679 -3987174230000.0 -6288405570000.0 -2130276520000.0 -10.22932554 3.21520822 -2.86421786 +C 0 0 -4.54364976 11.87386556 1.01408782 1224690270000.0 1547440770000.0 4007064520000.0 -5.37116531 -6.53015947 -22.33091359 +O 0 0 -4.71202481 11.35495007 2.16084596 -149198806000.0 -4405801860000.0 -1159910770000.0 -6.81548989 -1.57479391 -3.33645645 +O 0 0 -4.78895179 11.26859984 -0.11562046 4371553890000.0 -3810925930000.0 518802347000.0 14.98020314 17.84186592 23.24395469 +O 0 0 -1.38107305 -17.41631323 5.90103153 3579228890000.0 -3312836850000.0 3829913790000.0 -2.85882112 8.28556498 -25.00240941 +O 0 0 -1.23678132 -17.09075433 3.61041231 -721702097000.0 -2500591660000.0 2629748550000.0 -23.03493508 4.26037033 46.28172968 +C 0 0 -1.67022872 -16.7931594 4.8326528 10629713200000.0 4644678830000.0 -807228416000.0 5.43208305 -3.08013505 -4.46049944 +C 0 0 -2.59271697 -15.61340257 4.96746021 265949529000.0 -3888528270000.0 -3027380270000.0 1.93349336 -7.99545581 23.40323655 +C 0 0 -3.11074926 -15.24095861 6.22683444 -130399344000.0 -7036473640000.0 -1773988400000.0 21.93807792 -58.29690493 -6.56056701 +H 0 0 -2.90971213 -15.93839367 7.05918222 -12302936400000.0 -7184167180000.0 1042292720000.0 4.58342928 8.95987116 3.45540298 +C 0 0 -3.98544705 -14.20133831 6.33870483 95176389700.0 -896304426000.0 6409928730000.0 16.99486198 14.78656661 34.5871219 +H 0 0 -4.13430326 -13.81255855 7.36160588 2058089650000.0 21501189700000.0 -1817162840000.0 -17.11926608 0.07575759 -5.61469391 +C 0 0 -4.32403644 -13.46860231 5.21629091 -1044411700000.0 2687297530000.0 8272424810000.0 -23.70832688 43.82681355 1.57927467 +C 0 0 -3.87335928 -13.79233331 3.94217776 -2260132930000.0 3241208510000.0 2413863970000.0 -3.52855684 -15.78562572 4.29221846 +H 0 0 -4.31307595 -13.30056137 3.05648932 5395028880000.0 -10337828300000.0 -8926344500000.0 10.04089224 1.91653679 2.5929452 +C 0 0 -2.98704985 -14.86419037 3.88018978 4165130020000.0 4293673490000.0 -1168906900000.0 10.35806977 0.97971115 -54.99666109 +H 0 0 -2.53459894 -15.14994224 2.91413157 -2976304300000.0 20065061800000.0 -9178623290000.0 -4.01358498 0.77417266 -2.31959289 +C 0 0 -5.11831085 -12.23031103 5.43388962 -2548774480000.0 -3417757590000.0 -2520195130000.0 -26.55502636 10.97173251 35.07575249 +O 0 0 -5.30623657 -11.80264985 6.68712893 -7413000710000.0 84294385500.0 -2548940620000.0 24.61203862 -16.98559992 -25.33205447 +O 0 0 -5.70207759 -11.6575641 4.49385592 -2150738990000.0 2671862450000.0 2846582320000.0 1.89184314 -1.12147879 -15.44005479 +O 0 0 1.8316711 17.31229472 0.48250909 1571254330000.0 2683544680000.0 6403479360000.0 -16.40328547 29.86224889 -42.10511622 +O 0 0 1.63041413 17.24762314 2.70575895 -3910365180000.0 3255975060000.0 -999555133000.0 -11.8839758 4.73927811 28.02274912 +C 0 0 1.92924735 16.75007139 1.61094328 1567366360000.0 -1376226950000.0 -9784808120.0 26.64767135 -42.59506449 -2.02612295 +C 0 0 2.58361388 15.36002364 1.53987401 -368477426000.0 2527196280000.0 -916948367000.0 -26.67705146 12.13394143 20.56593288 +C 0 0 2.88519451 14.75305918 0.3241292 9590642680000.0 -6240350920000.0 -2649130930000.0 14.6580826 -18.98451997 8.72164211 +H 0 0 2.53440551 15.30479752 -0.56590804 9516835930000.0 -16746174100000.0 -9132651650000.0 11.31986962 -6.25408167 -4.77590815 +C 0 0 3.58483543 13.50158899 0.32164598 -7360031740000.0 -7850818570000.0 -3567991190000.0 -35.15586841 39.19233563 -33.6838662 +H 0 0 3.8442885 13.05033349 -0.65235967 20299611200000.0 24596089800000.0 -11232696900000.0 0.84532005 -2.40482146 4.82117338 +C 0 0 3.81824022 12.84954558 1.51196409 2168478000000.0 -2622617320000.0 -909209135000.0 26.23228089 -5.21992295 11.83067707 +C 0 0 3.49016247 13.51555583 2.72214066 4313082190000.0 3698652400000.0 -2539723050000.0 6.8103643 -62.76662275 8.27267633 +H 0 0 3.69810946 12.91094533 3.62260644 -7823514410000.0 4772362690000.0 983947970000.0 0.36824058 6.84537481 4.76350972 +C 0 0 2.76769956 14.66920213 2.76194745 6727731030000.0 -2188522260000.0 -5954117310000.0 10.5493751 37.72513777 -12.06627166 +H 0 0 2.54587288 15.20884715 3.69960976 8142689380000.0 -6398898390000.0 -3196211840000.0 -2.29459386 -5.3756684 -1.4461834 +C 0 0 4.61932587 11.54548229 1.53377314 -8132996260000.0 -1953790280000.0 -1118617120000.0 -12.60848129 18.70324798 -20.88397319 +O 0 0 4.96196196 11.0058428 0.4299798 3094100340000.0 -2329789770000.0 -1153936930000.0 -7.92522376 7.62707924 -12.73373172 +O 0 0 4.93744904 11.0976643 2.6563088 4375721760000.0 -2537786700000.0 -2273462130000.0 7.91363549 -23.34621614 40.20367003 +O 0 0 -3.55842148 9.08354885 3.27436293 -3007818890000.0 1889824880000.0 1340632210000.0 -18.23387664 -3.166473 22.68644292 +O 0 0 -3.63481095 9.03501127 5.61047147 1296073960000.0 2423010970000.0 2967737950000.0 1.04889926 -0.82284073 -19.34575659 +C 0 0 -3.07196693 8.96260785 4.46441603 2804737830000.0 -5729217450000.0 -5012114930000.0 15.60399895 2.33104298 -12.72395088 +C 0 0 -1.57392191 8.78508111 4.47126398 1828532710000.0 4432510780000.0 5924948360000.0 40.6705331 3.35022468 61.27416088 +C 0 0 -0.74325918 8.86311621 3.34054788 -2876912840000.0 2478342550000.0 -6137805930000.0 -33.35525165 -14.62052387 -18.97702927 +H 0 0 -1.20666281 8.75654701 2.34378588 -19301480600000.0 10050601400000.0 688532532000.0 -3.75744735 9.46411422 1.50861968 +C 0 0 0.63549369 8.84101186 3.39787925 3744443540000.0 7070273520000.0 6192614240000.0 13.0227854 -2.7189646 33.08655401 +H 0 0 1.2504643 8.84266318 2.48057731 27810101300000.0 -9350286810000.0 22296969600000.0 -1.03477305 1.71071294 5.72357117 +C 0 0 1.23104026 8.77329288 4.68260942 561708516000.0 -2363003020000.0 -3761247210000.0 27.57425872 -2.93699674 -14.10699621 +C 0 0 0.46330675 8.67270402 5.86492951 -975282781000.0 1126713570000.0 -8043606720000.0 1.85437527 7.22894866 -12.2786023 +H 0 0 0.97320822 8.63653365 6.84387109 37144957700000.0 -22165894100000.0 -28759928600000.0 -1.12631074 -2.06791013 -3.8844781 +C 0 0 -0.92050541 8.71274519 5.77139009 -118616692000.0 5265753150000.0 26855254600.0 -25.82418564 -1.87490116 -42.16907481 +H 0 0 -1.56360732 8.63055982 6.66542584 -25177321200000.0 12975516000000.0 -17289757900000.0 2.69109917 2.32597371 -2.13425083 +C 0 0 2.73902392 8.77055673 4.74245088 2190720840000.0 148868364000.0 5024354970000.0 -11.66922073 -4.32093791 29.42541651 +O 0 0 3.28247641 8.5147451 5.91159722 -1513661490000.0 -118278983000.0 -7509536170000.0 1.68541644 15.05382721 -4.98260716 +O 0 0 3.40414084 9.01839882 3.71266298 11394623100000.0 1541788680000.0 8340054260000.0 6.45715003 0.69657062 -12.33279788 +O 0 0 3.61531042 -8.84160547 3.07396486 954083882000.0 -7422339000000.0 1078642990000.0 -12.45988862 0.10119258 -7.52174694 +O 0 0 3.35535329 -8.79843969 0.82004978 2209757430000.0 -387668880000.0 1276440350000.0 1.58759869 -2.38642045 0.86452351 +C 0 0 2.8993325 -8.81190782 2.02916057 1115218670000.0 -4158509320000.0 3461357580000.0 12.07305656 9.02038288 5.34968349 +C 0 0 1.42768866 -8.71172747 2.12914283 -253591114000.0 620908613000.0 -6110606010000.0 -31.34700323 0.14102674 2.71359426 +C 0 0 0.77441406 -8.77145807 3.3815905 3791743310000.0 -4800217830000.0 7545942060000.0 17.98810362 -22.54224103 -1.19733608 +H 0 0 1.42203306 -9.03661547 4.23594149 44042747000000.0 18112555100000.0 -15854069900000.0 -2.40915105 11.19604465 4.07135822 +C 0 0 -0.60763892 -8.87148639 3.48174684 312893808000.0 -4875442900000.0 6099510770000.0 -24.48381946 15.63450527 -58.43532522 +H 0 0 -1.15559215 -8.94585649 4.43770227 7512832750000.0 -3518936630000.0 10332044100000.0 3.86056757 -1.84445221 -4.13223564 +C 0 0 -1.35501314 -8.81748515 2.24205266 1723671610000.0 2765788910000.0 -4124699850000.0 4.12578507 -14.99082885 6.25645613 +C 0 0 -0.70973252 -8.72708227 0.96096994 1448580590000.0 -3227900240000.0 -1062569190000.0 -29.02378859 -21.15794812 45.38387914 +H 0 0 -1.28955683 -8.99533621 0.0601492 5091339720000.0 9757440930000.0 -7274159370000.0 -0.76965673 13.52159953 0.97375025 +C 0 0 0.66549721 -8.68045215 0.93653492 4215091870000.0 2936110810000.0 -2660117010000.0 33.70875348 10.7871954 4.53662881 +H 0 0 1.24207146 -8.57593686 0.00044031 -19683592100000.0 15533766900000.0 -15973641000000.0 -4.84063034 -5.87100585 -0.92311129 +C 0 0 -2.85873871 -9.06480968 2.29808538 -2417904230000.0 -3325865710000.0 -106436160000.0 5.96623369 23.09234869 27.05198126 +O 0 0 -3.50354164 -9.16232163 1.19452655 917253106000.0 -5743286540000.0 3558031140000.0 2.90388561 -15.9846093 -10.8804802 +O 0 0 -3.39701034 -9.0257878 3.46298449 4265791440000.0 -3121839540000.0 -6275360940000.0 0.43502901 -10.43586054 -15.23742956 +O 0 0 7.46336199 -9.9156941 4.31614927 1951153850000.0 3749150260000.0 -1950713650000.0 -20.64783202 4.40651614 14.33488358 +O 0 0 7.23235348 -9.92718627 6.58213491 3340212330000.0 -898041718000.0 606841535000.0 -14.70710438 -2.59307697 23.85775274 +C 0 0 7.91056136 -9.94423237 5.55286845 2918032930000.0 -1974215120000.0 -1084102180000.0 20.20260495 9.91181823 -54.73342356 +C 0 0 9.40515709 -9.89966152 5.58668084 -1883256320000.0 -4193713540000.0 5422251630000.0 10.339715 -5.86195993 11.04974549 +C 0 0 10.09783867 -9.78290146 4.37420181 4378314000000.0 -10040346300000.0 -458822990000.0 21.79594067 -5.93669498 -21.04072909 +H 0 0 9.58869911 -9.8555186 3.39689015 -4772045000000.0 -1070114220000.0 3641626540000.0 -9.08829336 7.28516506 7.25805991 +C 0 0 -10.32604206 -9.75672717 4.30658259 5044187830000.0 756589128000.0 2883448360000.0 -2.23586924 5.44178658 26.18460998 +H 0 0 -9.68458462 -9.53741516 3.43476321 12114280500000.0 -13550041700000.0 4486472580000.0 -13.59358213 -7.34159691 -7.61685592 +C 0 0 -9.60960428 -9.8698771 5.50244115 7443143390000.0 -7075710330000.0 -2220585770000.0 -49.52716901 6.03304395 36.71173505 +C 0 0 -10.31760913 -9.95022668 6.75279636 -3288342030000.0 336722726000.0 7032813800000.0 37.38796082 8.82537723 -26.06575636 +H 0 0 -9.80524092 -9.92415131 7.73077045 21245511600000.0 -2424821770000.0 -5747032270000.0 8.17015653 -6.06382579 -8.70593627 +C 0 0 10.14838222 -9.928728 6.79418398 -1066144600000.0 499644875000.0 4429898570000.0 -14.44753852 -20.09212444 -1.55387833 +H 0 0 9.78141879 -10.21989262 7.79428169 -9626882080000.0 -2065288440000.0 541982991000.0 -20.33705017 13.30453995 -6.59623056 +C 0 0 -8.1620684 -9.82300062 5.53595409 4378935560000.0 169275794000.0 6941327050000.0 31.69071305 2.7790543 -2.06323414 +O 0 0 -7.58123595 -10.14322841 6.60829058 1600487330000.0 6158857030000.0 2758297850000.0 18.26772674 -3.29940223 17.06276026 +O 0 0 -7.55373161 -9.4427063 4.47659262 -7048480480000.0 -61933748900.0 -5741605930000.0 -9.47605527 2.07295506 -14.87883072 +O 0 0 7.47655015 9.56756508 0.58024485 3653246410000.0 -2419504470000.0 -6389923370000.0 8.42850718 6.29863917 12.14343019 +O 0 0 7.47434698 9.3315404 2.82656755 5561251500000.0 4227621520000.0 10871534900000.0 -1.52802171 6.13068302 19.71309746 +C 0 0 8.08490394 9.53151981 1.72419453 4589663040000.0 -405906720000.0 -4097375400000.0 -16.57850806 -28.53090969 -44.42548211 +C 0 0 9.59097816 9.50473608 1.64809753 3704504480000.0 7674702050000.0 421114695000.0 -54.78021059 1.67402575 56.43520046 +C 0 0 10.1757067 9.38240176 0.42848702 1289738540000.0 989905801000.0 -1288479380000.0 75.21833111 -0.81090689 -51.05843784 +H 0 0 9.60895452 9.11457382 -0.48074044 264463060000.0 19393241100000.0 -6070396460000.0 -3.55073545 6.92612982 5.71509481 +C 0 0 -10.23864405 9.58341449 0.31405618 -105693484000.0 -2089363270000.0 -2696541430000.0 -39.01904086 -13.98910074 -6.44320186 +H 0 0 -9.73359704 9.50496623 -0.66492687 -17687009000000.0 5733476520000.0 -12393419100000.0 -2.11776843 1.62202569 2.62606181 +C 0 0 -9.49935513 9.89072111 1.44685561 9313288710000.0 5506174430000.0 2078129760000.0 5.04959387 -4.33474284 19.18357195 +C 0 0 -10.14092242 9.87448906 2.72146099 2312074170000.0 2831559880000.0 -1651073140000.0 -3.26013843 22.70774185 -2.91337202 +H 0 0 -9.61101786 10.36739201 3.55565657 13533472200000.0 -20034252500000.0 4731550250000.0 5.36811901 -14.88389744 3.07491632 +C 0 0 10.31780526 9.65736409 2.8475389 -3107359330000.0 1750920130000.0 5315578340000.0 19.98414105 22.57627161 -19.32680127 +H 0 0 9.76814143 9.88494196 3.77797558 14572781500000.0 -18572994700000.0 20731358500000.0 4.24757848 -7.78164343 -0.95747671 +C 0 0 -8.00821544 10.0989657 1.38145626 -2262209310000.0 3214150330000.0 -2826242090000.0 11.83031351 -6.19683797 -34.50497252 +O 0 0 -7.40548834 10.24454993 2.50255894 -4152611450000.0 -4181158070000.0 -6661536660000.0 -2.28308068 5.28316277 -5.98975328 +O 0 0 -7.39439899 10.07359165 0.22900491 -8239643700000.0 -421130118000.0 1083417010000.0 -35.57586711 2.91551137 32.8351685 +O 0 0 -9.17199025 1.31989152 -9.64603775 -1248703010000.0 10900134800.0 -1918247420000.0 4.09529643 17.49974676 13.59405832 +O 0 0 -8.90358786 1.3965734 -7.38644268 215447670000.0 -1717933850000.0 3630230180000.0 6.67890789 11.34916191 -13.46104439 +C 0 0 -8.82865299 1.93136525 -8.59392456 -4580927800000.0 1546939210000.0 2335251380000.0 2.27237476 -17.3654731 24.96123643 +C 0 0 -8.17236241 3.29472115 -8.67624784 -1621493220000.0 2458438750000.0 4369153820000.0 0.36360002 -56.45151695 66.79383241 +C 0 0 -7.99454671 3.81495505 -9.90288823 11386262200000.0 659281304000.0 -1480490310000.0 34.69975776 63.52467464 -45.97320937 +H 0 0 -8.33556338 3.16863397 9.39106027 -5381476500000.0 -3079015240000.0 8343250520000.0 -0.73955215 13.40253861 -6.62088953 +C 0 0 -7.29001383 5.08681281 -10.00911702 -2849279580000.0 434642298000.0 3938048540000.0 -35.61817756 -32.69067899 -26.82769261 +H 0 0 -7.28712038 5.68726606 9.18598111 -5013530870000.0 1910410130000.0 4887340830000.0 7.1872446 -10.59532057 -4.58738323 +C 0 0 -6.83906652 5.70893684 -8.87518776 2731903560000.0 591527241000.0 892355048000.0 -1.33735839 3.4170938 37.38720172 +C 0 0 -7.08449964 5.10755382 -7.60445533 -1765109630000.0 -2178152530000.0 -121339244000.0 44.6558209 74.9994737 -10.38892927 +H 0 0 -6.76986567 5.7859987 -6.7918346 23145853500000.0 12782591800000.0 -22256973700000.0 0.54236962 -12.96782861 10.1101077 +C 0 0 -7.61988481 3.89343853 -7.48847481 4130329370000.0 -2098409150000.0 -4884126190000.0 -57.03549984 -52.74695338 -4.90359 +H 0 0 -7.86603354 3.46561454 -6.50054169 -11734111900000.0 8977020220000.0 -4040625440000.0 3.46575981 -2.63645022 -4.36011583 +C 0 0 -6.11984355 7.02860715 -8.8575135 -9691309530000.0 -2931864620000.0 -178672539000.0 7.08269146 -4.68154828 6.607523 +O 0 0 -5.92693141 7.56406991 -9.98418709 -1074550340000.0 -4533040700000.0 624971308000.0 -2.09517847 3.84758967 -8.0157333 +O 0 0 -5.64270583 7.45595292 -7.72512207 -2325408560000.0 -758292290000.0 2489858470000.0 -12.01947007 -6.61531796 -17.37501579 +O 0 0 9.86601989 -1.40892263 9.51099928 -3673065100000.0 1028563920000.0 -7115933310000.0 -16.28200116 -4.37001062 0.2116435 +O 0 0 9.99623485 -1.47718435 7.2476487 2984470170000.0 3368266170000.0 3302902000000.0 -8.18449987 -7.40315901 -0.39287669 +C 0 0 9.57094639 -1.91790218 8.3538614 6946479620000.0 5133433140000.0 -5777686730000.0 18.88969159 -2.57978714 8.22927354 +C 0 0 8.75481014 -3.17353298 8.40296743 -988487760000.0 3085852350000.0 -330908950000.0 -12.04246701 -15.34693872 -42.31352101 +C 0 0 8.14383618 -3.57766165 9.5835136 -3423380980000.0 6595686650000.0 5430212040000.0 26.74294526 40.27070527 35.55427995 +H 0 0 8.32917035 -3.03738876 -9.5932577 -3244943090000.0 18433384300000.0 -1371207290000.0 4.44044042 6.85467363 -5.57734448 +C 0 0 7.34106374 -4.66116362 9.69453335 1789474570000.0 -3846823440000.0 -8854208870000.0 -43.46458547 -50.03278365 -23.56518054 +H 0 0 6.86551638 -4.87722133 -9.45439083 14595118800000.0 -31095004300000.0 -8646087380000.0 2.96230896 -6.09334609 -5.44828988 +C 0 0 7.00600696 -5.41218403 8.52888501 6995964580000.0 -8906030220000.0 -2175717860000.0 34.77534745 33.48026003 -7.84226983 +C 0 0 7.56414325 -5.02802208 7.27582563 480435420000.0 -2343151550000.0 2838287500000.0 9.71638625 -1.32058281 33.11093339 +H 0 0 7.38126456 -5.66626097 6.39330599 18091849400000.0 14645640500000.0 -13097516700000.0 -1.621058 5.78345894 1.62615275 +C 0 0 8.46832648 -3.95843321 7.24387343 -8278300250000.0 328791728000.0 5970513950000.0 -4.76470364 19.11010819 3.11427263 +H 0 0 8.86810323 -3.62987021 6.26824065 -46698757200000.0 -21782749100000.0 -17219194600000.0 3.26846779 -1.3760539 3.00285876 +C 0 0 6.21665978 -6.63001568 8.62486129 4202105630000.0 -247485690000.0 -2461947030000.0 -38.15771034 -29.02110868 6.56118028 +O 0 0 5.84680824 -7.02150473 9.78346287 -3470080350000.0 -7856152690000.0 3312012540000.0 0.87053829 -15.3176486 15.61511203 +O 0 0 5.81581024 -7.22535674 7.56321057 -257558264000.0 808664794000.0 5527697470000.0 4.92675097 -2.37673302 -20.39323775 +O 0 0 10.19774777 1.82323621 -7.20435783 4456517930000.0 515831145000.0 -930305197000.0 -33.24626129 2.97120787 -45.59754524 +O 0 0 9.76293883 1.28166665 -9.39190465 8309308440000.0 5790005100000.0 945474953000.0 -36.00716049 41.44539985 28.46745347 +C 0 0 9.51785729 1.97329995 -8.3015117 -1426826380000.0 -940449255000.0 -854908621000.0 28.84336112 -9.89424312 16.34421865 +C 0 0 8.51447597 3.10946841 -8.3649897 -72885323200.0 -3641720060000.0 -1380712140000.0 43.28268578 -33.64144616 5.96468326 +C 0 0 8.15813802 3.76510632 -7.19173255 5942297810000.0 -713740237000.0 5070459180000.0 -37.40914045 34.05498009 15.8061745 +H 0 0 8.32332932 3.36747691 -6.17475806 10762748700000.0 13852342700000.0 9982683110000.0 6.8459348 -4.13857607 -7.92741756 +C 0 0 7.39914859 4.94692315 -7.27815657 -8262454920000.0 3822364990000.0 1475020920000.0 -7.32724777 4.83509136 1.71438025 +H 0 0 6.99039897 5.39464785 -6.35506354 18780627200000.0 17556965200000.0 6788168990000.0 6.88760514 2.00845523 -0.5728631 +C 0 0 7.05540682 5.57699255 -8.50713894 -5092411970000.0 13937831700000.0 -2361814230000.0 57.25679482 -90.86281226 -19.88557743 +C 0 0 7.45368825 4.88966393 -9.66794712 -3733797810000.0 1826877120000.0 -1753407200000.0 23.72726396 -38.12516038 -4.50050681 +H 0 0 7.20121009 5.21348461 9.42882052 4936760230000.0 26151118700000.0 3794370220000.0 -0.55477993 9.15251462 6.91065723 +C 0 0 8.2041805 3.67817262 -9.58438723 3131863960000.0 -1279387700000.0 -649623573000.0 -35.3769796 37.75301992 -29.82995725 +H 0 0 8.47343347 3.18466025 9.58700792 -4622828290000.0 13308787300000.0 -10419994500000.0 2.5935249 -1.54268434 5.26962955 +C 0 0 6.47184548 6.87367253 -8.6410165 -6143052630000.0 -12352597800000.0 273099273000.0 -21.60005004 31.51336991 12.44778485 +O 0 0 5.89696157 7.22273212 -7.55692633 3661295090000.0 -528880210000.0 -1145701270000.0 -34.05642467 36.55005268 27.08741716 +O 0 0 6.55274431 7.53820635 -9.70879467 -450973116000.0 -423278750000.0 7064262520000.0 -4.28768983 11.12889985 -13.15086628 +O 0 0 -8.89239778 -1.23745744 7.47340453 -2685098600000.0 -3298931590000.0 3386869970000.0 2.98349872 6.07975353 -28.98472825 +O 0 0 -9.32873854 -1.44492309 9.65375146 -3363767970000.0 1450355790000.0 -352112904000.0 4.36911958 4.13044025 15.12635905 +C 0 0 -8.83508296 -1.87302353 8.5837477 -2044064940000.0 -958257501000.0 1167825060000.0 -12.44557424 -4.68539019 3.99721137 +C 0 0 -8.22225252 -3.23512184 8.62649182 2918766730000.0 6827158740000.0 -1426693400000.0 -2.02295471 -1.2217194 16.93993055 +C 0 0 -7.95358479 -3.95526859 7.48089579 6836888310000.0 991034771000.0 127102903000.0 0.86541166 4.71479663 -30.32848459 +H 0 0 -8.25189076 -3.45264727 6.54386869 2724001080000.0 -2268159490000.0 -311776275000.0 9.21959857 -7.15137592 -4.89973772 +C 0 0 -7.38877317 -5.22643609 7.54931472 -3552612360000.0 -4278463680000.0 -1017374110000.0 6.90207775 -1.2015269 -27.83479735 +H 0 0 -6.97361894 -5.74420506 6.66659354 16226882600000.0 12267787500000.0 -1420212960000.0 -13.07814582 0.23842979 -3.41020758 +C 0 0 -7.15925122 -5.83823616 8.76701135 -10274883300000.0 433323521000.0 -2638267270000.0 10.84867142 -38.83243655 36.47335704 +C 0 0 -7.42015256 -5.13706567 9.94219409 -7550055410000.0 -7482640900000.0 -4107267140000.0 -9.66340709 23.06921078 16.39581188 +H 0 0 -7.16907323 -5.50928569 -9.1707882 34433707700000.0 32376601500000.0 149647768000.0 -2.75203889 -8.38633364 -6.31404621 +C 0 0 -7.95961418 -3.85595177 9.85489191 4914570970000.0 -1253668150000.0 1588500700000.0 -2.92743644 12.11992019 15.2342772 +H 0 0 -8.23730073 -3.27812959 -9.36782543 -28149978000000.0 -390955478000.0 -9176138210000.0 5.19031803 -3.32731798 1.88566668 +C 0 0 -6.66974833 -7.29265772 8.86467662 5847774880000.0 8774877300.0 4734143040000.0 13.6142954 31.54092749 -58.48740413 +O 0 0 -6.60614084 -7.8601286 7.7076444 2243948980000.0 -5065861770000.0 -1407285700000.0 5.24641102 -12.55733483 36.25333743 +O 0 0 -6.19506351 -7.69101897 9.98291882 225425329000.0 -940363411000.0 -1187038380000.0 -2.91180723 -10.70207855 3.07704557 +O 0 0 0.90866728 -16.96884053 -9.60667153 4569594750000.0 -4474104900000.0 2166698020000.0 6.68221598 6.89609961 1.82024651 +O 0 0 1.19486668 -17.10005308 -7.36127725 -2993596270000.0 1913083640000.0 9771694480.0 11.07660633 7.6930664 -5.72716906 +C 0 0 1.36927087 -16.51486921 -8.51851111 -1894801010000.0 -8854963960000.0 -766009697000.0 -14.07941594 -22.30356312 3.83265283 +C 0 0 2.12906982 -15.24967937 -8.50449389 775231035000.0 792733408000.0 3933297290000.0 18.85659637 23.07482079 5.56967132 +C 0 0 2.39971783 -14.50183326 -9.66932592 1450349440000.0 -4424104540000.0 3057113240000.0 -33.41052874 -48.09754531 25.23257198 +H 0 0 2.006856 -14.81700147 9.46980478 -9182067300000.0 3201201160000.0 4861910750000.0 2.71874504 0.81570325 4.36610659 +C 0 0 3.03081901 -13.30818365 -9.49433686 -3910305930000.0 9416099040000.0 -423028185000.0 5.42973516 40.13652556 -56.25531729 +H 0 0 3.00908982 -12.70194729 9.70478471 -1140055670000.0 11001723800000.0 553376031000.0 14.51575972 9.79581929 5.0859414 +C 0 0 3.56618746 -12.83473654 -8.31629316 4562985370000.0 2659199420000.0 1202426930000.0 -6.45515082 -6.11289029 44.89403887 +C 0 0 3.4009199 -13.630229 -7.13643702 14251973200000.0 -5072890510000.0 1286437370000.0 -4.44082839 24.48285415 -28.75557479 +H 0 0 3.8064123 -13.19973087 -6.20376254 -11966616500000.0 -12456415200000.0 16093353300000.0 -2.60015524 -10.1478987 0.6412993 +C 0 0 2.61029269 -14.76656589 -7.2529327 5673495770000.0 6346363020000.0 -5141151470000.0 5.77998216 -33.74980352 -13.76761663 +H 0 0 2.49783775 -15.55715312 -6.49006958 -16383072600000.0 19142865400000.0 4869008070000.0 -1.80744239 13.92311823 13.4445898 +C 0 0 4.21731336 -11.49395873 -8.23692994 1893616620000.0 -4411789290000.0 -8132813400000.0 26.12497469 -2.00031491 -13.87348501 +O 0 0 4.59618105 -10.93688764 -9.33547554 -1811631310000.0 2415601060000.0 -4315942850000.0 -10.72896305 -7.24145255 7.54230517 +O 0 0 4.51155382 -11.0644637 -7.08004081 409478903000.0 2096239580000.0 4936807470000.0 -3.60242966 4.8219957 10.6350088 +O 0 0 -2.04468869 17.61600764 9.24707734 -4872239910000.0 1628820830000.0 -5560348110000.0 13.75353861 -5.26402318 21.00264726 +O 0 0 -1.54588014 17.54810072 7.05477476 -2006290480000.0 7047842250000.0 -692196236000.0 -10.52730788 -25.73974341 16.40500089 +C 0 0 -2.02151954 16.99937401 8.13478775 -888464510000.0 -3957649470000.0 545558321000.0 11.02445296 16.92163463 -45.74178756 +C 0 0 -2.70133329 15.67019635 8.00125569 -3165336940000.0 -4595495820000.0 5741713900000.0 -10.89839246 6.41449155 -8.10579459 +C 0 0 -3.18702733 15.05614383 9.13306244 4099762610000.0 -1009696870000.0 -1444883110000.0 -32.01617532 -14.59780511 75.69800932 +H 0 0 -2.96957144 15.51657488 -10.00892763 17022697600000.0 4296011110000.0 -6805307840000.0 6.37064965 6.28170435 -1.70552968 +C 0 0 -4.095141 13.9659738 9.2379689 -1120708050000.0 6702279430000.0 -3427979960000.0 30.78349375 5.85821189 -49.74192771 +H 0 0 -4.47755815 13.60744576 -9.91196243 -8684629590000.0 -9177897550000.0 -12261072400000.0 2.53878009 1.68359931 -5.80032415 +C 0 0 -4.32837143 13.30110777 8.01125509 -775878706000.0 -4712532850000.0 -6931625770000.0 12.77053266 33.52584986 -5.88134289 +C 0 0 -3.79656709 13.90757238 6.80278682 -8792719420000.0 -3050720640000.0 3769818420000.0 -18.39933551 -35.39608573 23.68984441 +H 0 0 -3.97981312 13.25479203 5.93104539 -16908302000000.0 -4670954230000.0 6689038350000.0 -0.6742585 11.94615669 -8.04178705 +C 0 0 -3.07526066 15.09574967 6.76946855 8626400820000.0 9874312420000.0 6540174970000.0 7.77357329 7.20760994 7.07548858 +H 0 0 -2.75340925 15.6918811 5.89730262 28033232300000.0 10260213200000.0 13965555200000.0 -3.86369105 -15.0008557 -8.41762934 +C 0 0 -5.112044 12.00168455 7.8909672 -4820383110000.0 4141768820000.0 5339921900000.0 27.90693739 27.25301055 6.79363671 +O 0 0 -5.37354996 11.38312767 8.97801546 772074004000.0 -3739351950000.0 182351184000.0 -8.50316982 -2.65740978 11.26510753 +O 0 0 -5.34331192 11.65434299 6.7130184 -2336573560000.0 -6208857520000.0 3496109370000.0 -15.09208731 -20.82483848 -12.54518305 +O 0 0 -1.43314721 -17.55020509 -7.28258938 -5061181160000.0 549634581000.0 -1367886160000.0 -19.90602807 14.20937002 -1.30807424 +O 0 0 -1.79234383 -17.38663754 -9.51064639 -207773440000.0 -1006405320000.0 2240614930000.0 -6.62633441 -0.70936362 3.72743721 +C 0 0 -1.90477404 -16.9529336 -8.30089563 881185733000.0 -2482769080000.0 -327958591000.0 9.14365285 2.50909143 -14.28308471 +C 0 0 -2.60236293 -15.62664396 -8.19317226 4484487500000.0 2610928110000.0 -6873401810000.0 25.41516898 -31.04799098 -2.51089701 +C 0 0 -2.66182271 -15.05284182 -6.9334908 7118246260000.0 -686188338000.0 71390005600.0 -3.25418097 45.08470858 14.32140754 +H 0 0 -1.95751751 -15.38104828 -6.1487175 1321292840000.0 -7221505310000.0 2540754340000.0 -13.91380477 -8.25631996 3.1033274 +C 0 0 -3.40508385 -13.86327226 -6.79911098 -6391008770000.0 779559347000.0 -3903587180000.0 26.92493471 -6.09959359 19.35224031 +H 0 0 -3.39660221 -13.2742073 -5.86499912 -26633642300000.0 -1463780790000.0 -2305102200000.0 -6.21684634 -9.0473457 3.31882278 +C 0 0 -3.9939573 -13.25596756 -7.89679696 -4141749910000.0 -1159772020000.0 -1221637800000.0 3.04053919 1.26058094 -44.27266136 +C 0 0 -3.72333583 -13.72516687 -9.21171861 -7670622040000.0 -184722873000.0 3154272060000.0 5.54960503 -34.10850203 18.0346774 +H 0 0 -4.17041793 -13.32412064 9.98347015 -3444019030000.0 -14293488900000.0 -4989988390000.0 0.41855769 9.63905776 9.90504995 +C 0 0 -3.01416635 -14.93450564 -9.33754142 6931512830000.0 3985222860000.0 846660327000.0 -38.56904385 6.92844621 -5.26531543 +H 0 0 -3.09715053 -15.45945596 9.81634535 13431697800000.0 -17948658400000.0 12183333800000.0 14.45251053 1.44359598 1.59197893 +C 0 0 -4.90885592 -12.09028677 -7.79126018 5843650120000.0 1480362530000.0 -2185194970000.0 9.72165904 -16.59860602 46.90978962 +O 0 0 -5.19699617 -11.66898773 -6.58642547 2727566670000.0 2456851830000.0 5189572510000.0 0.45823091 12.25543204 -3.22927805 +O 0 0 -5.42056449 -11.69422146 -8.83254528 -805725939000.0 -5154762950000.0 2534792560000.0 -23.23235703 26.35241977 -42.48842185 +O 0 0 1.21060452 17.23470114 7.32776049 -6591821940000.0 4084292530000.0 -6496220060000.0 13.91782534 -20.65527894 -6.47776377 +O 0 0 1.12682986 17.15720573 9.57680244 -7890191880000.0 -1646270390000.0 3416656030000.0 15.15438189 -28.97271983 -27.60976471 +C 0 0 1.44935236 16.64847687 8.43717689 -1371397450000.0 -190714806000.0 3459726870000.0 -0.50253532 3.59450052 10.28076947 +C 0 0 2.17197747 15.29658841 8.32165133 -1973503510000.0 416215739000.0 401322473000.0 -29.25284685 14.88975644 6.60641922 +C 0 0 2.05811056 14.53333679 7.1218806 6427266900000.0 -4554126620000.0 -8004670660000.0 22.46043707 23.46806907 34.61972993 +H 0 0 1.48477591 15.06407925 6.341346 -15224860900000.0 5434599480000.0 14691768700000.0 4.96778485 -13.7704576 -7.89987245 +C 0 0 2.8142111 13.35751969 7.0218429 984415627000.0 -5185062290000.0 6845861460000.0 -34.6163589 19.71480308 -37.48004059 +H 0 0 2.79768404 12.84478873 6.04385095 -6804489460000.0 -8558374830000.0 8746009460000.0 4.48093073 -5.99828804 5.62731038 +C 0 0 3.46879553 12.8397753 8.12977116 -4954241350000.0 1577495020000.0 5417395970000.0 1.04351606 -1.08947151 26.74201812 +C 0 0 3.46454742 13.53101311 9.34109786 -3676696720000.0 5010885750000.0 -8829145230000.0 -30.66651491 45.74238148 22.93605459 +H 0 0 3.9058561 13.01034962 -9.91265586 -110252362000.0 22565845900000.0 -114302108000.0 2.4425232 6.80949038 -0.45912682 +C 0 0 2.78911212 14.80095705 9.47239614 -6151044340000.0 8115496950000.0 1461615090000.0 36.2663996 -44.70751131 -22.50158784 +H 0 0 2.87930967 15.47156967 -9.77677004 21327051200000.0 10750340300000.0 -3402526130000.0 -2.36024689 -9.59928264 1.31910426 +C 0 0 4.19884483 11.5430555 8.1155635 -7651153950000.0 -326095751000.0 -3803510500000.0 2.63285702 43.34621272 18.48688161 +O 0 0 4.39432708 11.0467133 6.9941446 499252844000.0 -2944791590000.0 -1273924560000.0 6.2809883 -50.97618458 -37.83954865 +O 0 0 4.70688165 11.19378242 9.23635435 -6572286420000.0 1802812820000.0 -4684635500000.0 3.36728925 -16.02639311 3.09408423 +O 0 0 -3.76463669 9.22080288 -9.92516472 -4812840910000.0 -1661864820000.0 -8828299270000.0 44.43876071 8.70115884 0.55905024 +O 0 0 -3.52494988 9.34500993 -7.71407558 -4046434400000.0 -2845505750000.0 4653366750000.0 -0.59473603 8.73777884 19.01798314 +C 0 0 -3.02047847 9.34150204 -8.8803749 2165653680000.0 508070860000.0 970159053000.0 -17.11829867 -20.25415594 -5.5112604 +C 0 0 -1.5241347 9.22671399 -8.83516914 6665971820000.0 -2118218770000.0 -3042497100000.0 7.20820518 -18.68178344 -43.03607876 +C 0 0 -0.77306242 8.69473712 -9.93642817 -3938977740000.0 2379399350000.0 -1287766310000.0 -59.48565796 27.43552936 14.51459241 +H 0 0 -1.40675518 8.62589929 9.283689 23749228800000.0 -18414098000000.0 -19156012700000.0 13.91246677 -9.94004459 -7.09914432 +C 0 0 0.58200524 8.5305451 -9.85233689 -516743487000.0 -5807117670000.0 1441162590000.0 27.55412922 14.55543702 -4.00986678 +H 0 0 1.18855932 8.40928149 9.35473908 -3126635700000.0 18484380000000.0 -3508854240000.0 -1.86937134 -10.76979729 2.73358471 +C 0 0 1.27636174 8.83981179 -8.65559161 -861729910000.0 -1358646710000.0 -11076722700000.0 -10.54052931 5.48898448 -23.00483513 +C 0 0 0.54252184 9.26242894 -7.54059089 4380260090000.0 -3781753970000.0 6004324750000.0 -0.37921506 4.6914483 -10.40485374 +H 0 0 1.08081256 9.54362159 -6.61819824 26012820400000.0 5190368410000.0 -9355187640000.0 -3.24010001 -2.69181889 -2.06856557 +C 0 0 -0.84353893 9.4807649 -7.66139938 4705805620000.0 4048415310000.0 -5092051110000.0 22.87450139 2.81948186 37.74382111 +H 0 0 -1.33736409 9.8678722 -6.75259849 -11845083600000.0 -30966479300000.0 829241452000.0 -6.99820482 -0.55481929 -6.73423186 +C 0 0 2.77231897 8.83451917 -8.69446678 -1973663610000.0 -256487645000.0 -4442383070000.0 10.4767054 -28.46690146 15.37642331 +O 0 0 3.28648575 8.79479058 -7.49463659 3783840300000.0 4907161810000.0 6352604500000.0 17.58706949 7.80530541 -3.78407535 +O 0 0 3.41718954 8.67544341 -9.78327026 -5407587340000.0 2092715140000.0 -609447200000.0 -11.12058247 10.90213712 12.14195018 +O 0 0 3.30826883 -8.7988944 9.7095316 1380749050000.0 -4885311490000.0 -2635415030000.0 -3.95693851 -2.43423585 -13.50240924 +O 0 0 3.20426701 -8.81961952 7.43562278 -3016514750000.0 -1333146920000.0 -2677514850000.0 -17.59487934 -8.369275 23.02797772 +C 0 0 2.64619626 -8.91009155 8.61356433 3779243990000.0 8643005930000.0 90732615700.0 31.34027998 18.71318652 15.74358719 +C 0 0 1.17207809 -9.00820374 8.74245015 -11702767400000.0 -5043451600000.0 764781468000.0 26.53721081 -11.4070755 -28.82908894 +C 0 0 0.55518551 -8.96384435 9.98867598 290954825000.0 1758411460000.0 -2564477130000.0 10.3193764 19.08535803 12.94782432 +H 0 0 1.05178313 -8.60224814 -9.21553434 -1077825310000.0 -5900368000000.0 1193737510000.0 10.68476382 -11.25035416 -5.61576765 +C 0 0 -0.80464517 -9.09753624 10.06067284 -3311192500000.0 179628519000.0 -84877730300.0 -66.31484056 19.05955042 -25.09731798 +H 0 0 -1.34077281 -8.85687469 -9.1262607 3009714590000.0 29062418100000.0 -3894551250000.0 2.52456416 -10.17008715 1.17890066 +C 0 0 -1.60231953 -9.16520893 8.87211215 325785631000.0 -2891634110000.0 -4806403910000.0 53.61153725 -15.39444217 -11.13784007 +C 0 0 -0.9265259 -9.29582481 7.60711142 -3503086060000.0 374143330000.0 7214779940000.0 -25.17936847 -3.82493469 29.96639368 +H 0 0 -1.54588218 -9.49468578 6.71465047 18964494100000.0 -15649211700000.0 -4807053800000.0 3.01859126 3.99782459 0.88448408 +C 0 0 0.45922391 -9.25371386 7.55499872 -505888995000.0 5660054950000.0 7579460650000.0 -3.14951743 -1.93117695 8.64170966 +H 0 0 1.05157985 -9.42770085 6.6393146 8173449780000.0 7083733860000.0 12923613900000.0 -6.3275252 4.71283538 -0.23171765 +C 0 0 -3.07472796 -9.29497776 8.90269026 3433036680000.0 6662183330000.0 1197709450000.0 -23.68521279 -2.81031305 33.14766955 +O 0 0 -3.6818379 -9.35226181 7.79623298 -3259773520000.0 273120177000.0 -5788952320000.0 -0.25574977 1.84941664 -19.24752907 +O 0 0 -3.66449287 -9.36800361 -10.05876584 3032047280000.0 5960389290000.0 -8273593310.0 23.57370618 7.26322625 -18.04859982 +O 0 0 7.26735977 -9.39044868 -9.24365133 1980202310000.0 -4133467180000.0 -4726316540000.0 9.66998052 0.42694008 5.53135162 +O 0 0 7.17347154 -10.18007776 -7.14775906 -3160592910000.0 3055310200000.0 -884983472000.0 -12.65057062 -2.06119499 30.15410593 +C 0 0 7.8140314 -9.71399902 -8.10373565 480875028000.0 -6472835440000.0 2883882010000.0 12.13501575 4.1072237 -40.99308156 +C 0 0 9.33305105 -9.65723139 -8.04912642 -6352517360000.0 2497299240000.0 347446884000.0 -4.53214607 -1.03965236 48.35446215 +C 0 0 10.0952698 -9.69981314 -9.19049511 -4884550130000.0 -1939508070000.0 -4047880600000.0 53.19424402 -17.73497259 -46.81677789 +H 0 0 9.55145672 -9.93024838 9.99830237 -18581693500000.0 -5113837560000.0 4718138470000.0 5.06923417 9.46479083 -4.43770458 +C 0 0 -10.30745395 -9.74458855 -9.14606731 5078310040000.0 944407078000.0 -11394832800.0 -38.06215859 25.33005251 25.45988856 +H 0 0 -9.64394702 -9.74551288 -10.02889919 29984917600000.0 -2767649380000.0 18711465300000.0 -8.65911339 -4.07472502 -1.09315303 +C 0 0 -9.66505615 -9.57516091 -7.8875562 -1852096320000.0 13508438500000.0 -5760097480000.0 22.83162194 -21.55838051 -62.20582258 +C 0 0 -10.37250762 -9.62743126 -6.70643658 5028679640000.0 8065305500000.0 4507168160000.0 -63.92562446 -10.45860474 2.10077159 +H 0 0 -9.84117002 -9.78740236 -5.75159417 -16169673000000.0 -19719048600000.0 11648439000000.0 -4.95936039 8.18314446 -2.09036046 +C 0 0 10.03502954 -9.69158363 -6.8229966 1262702810000.0 2741996840000.0 4592874380000.0 23.06687738 7.13893875 26.11306323 +H 0 0 9.47314792 -9.76955234 -5.87545011 25753766400000.0 -1018646410000.0 18806283300000.0 -3.78635125 1.05272355 -3.59458603 +C 0 0 -8.16802338 -9.71079506 -7.90608921 1259940000000.0 6363222660000.0 -4147340830000.0 -15.07205622 4.56019717 -23.9588991 +O 0 0 -7.63895809 -9.78037272 -6.77693311 -2132229700000.0 982807107000.0 -5909959850000.0 42.15633043 0.07273102 23.65396059 +O 0 0 -7.57536714 -9.78680836 -9.06386071 1277900430000.0 -6258569000000.0 -262727505000.0 -15.03984305 3.00331588 26.09930964 +O 0 0 7.25185325 10.18696474 7.18183357 -958404412000.0 -6276837850000.0 -40033708700.0 -34.58139663 -7.84081794 -21.74159083 +O 0 0 7.47681743 10.2220846 9.43137571 2717071790000.0 1604850460000.0 1994953930000.0 -35.70203244 -7.40393081 34.87812796 +C 0 0 7.88960178 10.27010378 8.2422105 699131241000.0 6643080590000.0 -6656017790000.0 64.56900736 20.45094278 -22.53536737 +C 0 0 9.39420972 10.43768866 8.09313218 -3678070070000.0 1059875970000.0 -2320510870000.0 5.29617093 -0.6418428 95.27953425 +C 0 0 9.94051989 10.14712031 6.89075079 3225575560000.0 -5969113500000.0 3532372400000.0 60.10771589 -1.79208605 -66.24255813 +H 0 0 9.31702053 10.10653463 5.98012695 18292783500000.0 12044131800000.0 -7586899760000.0 -3.10913754 -2.71489965 4.26840769 +C 0 0 -10.48084887 9.98725323 6.74215145 -1077596580000.0 -1239284100000.0 -4244891750000.0 -35.54730908 -1.12590382 15.38440364 +H 0 0 -10.029661 9.78021517 5.75564286 39767517400000.0 -14892658500000.0 17301386100000.0 -0.18183561 1.29087187 5.60113114 +C 0 0 -9.71896024 9.96683502 7.91539818 1820009650000.0 222793591000.0 6453299160000.0 53.89575082 -1.05154214 -51.44830796 +C 0 0 -10.22910993 10.21236931 9.17262456 1639249080000.0 -3581416150000.0 -191841189000.0 -34.95865665 21.23467512 25.02145296 +H 0 0 -9.51437082 10.24077749 10.0140373 -12698971500000.0 20740588300000.0 11166607200000.0 -6.95834112 -3.49358499 1.23768719 +C 0 0 10.24709068 10.52780194 9.28306934 782791121000.0 4535810300000.0 -6738378140000.0 -28.61698291 -30.04321618 -34.4416234 +H 0 0 9.72031891 10.47923294 -9.86946942 -636578884000.0 18925050200000.0 -6788730670000.0 4.60222098 12.43303046 -0.30716996 +C 0 0 -8.22479503 9.72727554 7.82319017 -7160903210000.0 -446248967000.0 -1641880300000.0 -8.46886792 -4.494951 -31.29107336 +O 0 0 -7.64875361 9.4079774 8.89050721 5291137160000.0 -2452438050000.0 -4044741270000.0 14.29248269 3.56644782 4.76838909 +O 0 0 -7.66820463 9.79268204 6.62295065 555379931000.0 4395868420000.0 -6621933330000.0 -15.77579942 -2.53568076 33.77051061 +C 1 1 1.605846441158572 -0.3602646460763928 -7.577483132476427 1236717970000.0 1224116220000.0 338326586000.0 -11.55341825 14.8000441 -13.21174127 +C 1 1 2.590891026720609 0.28894926487554184 -8.318995645493766 -1326253080000.0 2179934530000.0 4177177420000.0 11.26464447 -11.75635565 -13.14017761 +C 1 1 2.235681342104381 1.3926711604859783 -9.161213289054569 -1304124020000.0 1702453310000.0 -1657679840000.0 -9.46298032 -42.41455579 -4.46861174 +C 1 1 0.8994989527685839 1.798629691828753 -9.164401489248009 -1354747480000.0 3383975520000.0 -1444727660000.0 -10.51861943 16.99333105 16.23209428 +C 1 1 -0.04489549881196231 1.2138476258858049 -8.298800953433101 -3777896110000.0 -1470698910000.0 -3463867480000.0 19.71270558 22.27891846 14.68887522 +C 1 1 0.2721754638922531 0.10225957428099264 -7.56408075012718 108394265000.0 -7128769410000.0 -3196104480000.0 -10.40941217 2.26726852 -5.82602159 +H 1 1 1.831426128547755 -1.1581633807585252 -6.853464434751198 -19332628600000.0 18721932700000.0 -6786942490000.0 6.43867441 -4.57088505 5.15898359 +C 1 1 3.24829595200126 2.113474669212253 -9.890712536052671 -254119252000.0 -2025384150000.0 -3662445550000.0 15.80972826 32.88743733 -12.75037465 +C 1 1 0.5019921108774428 2.887912615468955 -9.9812598226771 1286408160000.0 -1696385210000.0 -1705360400000.0 13.46036065 3.75799475 6.22430267 +H 1 1 -1.0536619237418638 1.6254511942448377 -8.464365014317496 11666878500000.0 -5325027490000.0 28616282900000.0 -6.86655077 0.0882926 -16.13101693 +H 1 1 -0.5106945077160108 -0.3091185497204383 -6.9065693067378335 11832251100000.0 -120716840000.0 -934406218000.0 4.64911999 -8.78263014 -2.23614105 +C 1 1 1.4382818421892902 3.5097787527552824 9.337181436529043 -2491763650000.0 3108736950000.0 1701555840000.0 3.26783908 -6.83797932 4.69763367 +C 1 1 2.7991487509370048 3.1243641424426736 9.356030783457495 8199873380000.0 -4229177250000.0 7119511330000.0 -7.55577562 -0.88131795 -7.53672876 +H 1 1 -0.5792154909646214 3.061938444093588 10.017680030350618 1244074130000.0 -2596074100000.0 -16640120000000.0 -9.08409792 -1.93017848 4.62311789 +H 1 1 1.1651715452532452 4.325273891790182 8.648111707633669 12310924600000.0 -8458874790000.0 7508479620000.0 0.5236497 2.42377242 -5.18123242 +H 1 1 3.443076523191551 3.6736830682422457 8.652228651418802 -24130822400000.0 22320582900000.0 22471153000000.0 -2.76360632 -7.60020923 -5.65247797 +C 1 1 5.677273424012226 -1.7193334052713505 -7.334051456174594 -3848105630000.0 2406965790000.0 1894339960000.0 6.4971463 -5.96538012 13.60565132 +C 1 1 6.6656727337323005 -1.070320292097532 -8.05583884814226 -1226623200000.0 -5005969930000.0 -7982986910000.0 -13.65013511 14.5011109 8.70832447 +C 1 1 6.293222608135971 0.06131672426264223 -8.857593096864697 6671466820000.0 -2253848910000.0 5110412860000.0 -11.32101115 -35.90621981 20.52351436 +C 1 1 4.968811285037943 0.5344239069690542 -8.912276898646866 -7818435870000.0 6477834270000.0 6332402760000.0 21.97492 19.07416658 -0.94804285 +C 1 1 3.9685331128632337 -0.22859718287102032 -8.263095138006614 -595705743000.0 -2257899770000.0 -4251089850000.0 -23.64439533 24.61941245 -8.04096639 +C 1 1 4.334082412936518 -1.2936311185503797 -7.439260352130235 8836940320000.0 2938287740000.0 2955214230000.0 7.97747427 -16.63984572 -15.91408935 +H 1 1 8.348229258808317 0.6325842103457731 -9.419309200988033 -12208601300000.0 -2220047410000.0 3315195850000.0 7.58874537 -0.94676218 -9.27079699 +H 1 1 5.977315324028 -2.598472718410276 -6.74115385598917 13590208300000.0 5266478590000.0 1572132930000.0 -4.3280707 8.19055038 -0.5331399 +H 1 1 7.722992199537577 -1.3090155009821274 -7.856995162229546 -324866069000.0 -5284774800000.0 -1664103400000.0 8.22789207 3.20525264 4.80469574 +C 1 1 7.273243399993871 0.8281684392700843 -9.56280437796654 2151597580000.0 -3456291440000.0 -2337768720000.0 -7.30532789 -30.43067745 -0.34155179 +C 1 1 4.602057500869574 1.6319717456560687 -9.754094736270892 -1918899740000.0 3226218160000.0 -2039864850000.0 0.33659435 -39.28014721 51.82400385 +H 1 1 3.642637015999492 -1.9056789672888417 -6.840067237885839 -8806113800000.0 2809154770000.0 3113242410000.0 0.11507431 10.23505594 7.39341915 +C 1 1 5.629066701132033 2.2822742884586122 9.621951810617784 5506008430000.0 1850544660000.0 -1321751130000.0 -11.91202608 4.92861303 -19.85174295 +C 1 1 6.993882672817679 1.9297859544891134 9.775423242536291 -8115646060000.0 -168357552000.0 261289099000.0 20.3696735 39.48831335 -7.48573004 +H 1 1 5.383421367281398 3.154505006551511 8.996968907336482 -4265292790000.0 -8279285290000.0 3510465970000.0 2.9263743 0.20899196 -3.13615507 +H 1 1 7.7082918664474125 2.388861742903921 9.073064664377602 18840013700000.0 -2608933020000.0 -6266672470000.0 -10.76518955 -6.00538234 -6.82787691 diff --git a/tests/integration_tests/add_molecules/ref_data/mil68ga-md-01.rst b/tests/integration_tests/add_molecules/ref_data/mil68ga-md-01.rst new file mode 120000 index 00000000..d0285d5e --- /dev/null +++ b/tests/integration_tests/add_molecules/ref_data/mil68ga-md-01.rst @@ -0,0 +1 @@ +../../../../examples/add_molecules/mil68ga-md-01.rst \ No newline at end of file diff --git a/tests/integration_tests/add_molecules/ref_data/perylene-md-05.rst b/tests/integration_tests/add_molecules/ref_data/perylene-md-05.rst new file mode 120000 index 00000000..c28f05ff --- /dev/null +++ b/tests/integration_tests/add_molecules/ref_data/perylene-md-05.rst @@ -0,0 +1 @@ +../../../../examples/add_molecules/perylene-md-05.rst \ No newline at end of file diff --git a/tests/integration_tests/add_molecules/ref_data/perylene-md-05.xyz b/tests/integration_tests/add_molecules/ref_data/perylene-md-05.xyz new file mode 120000 index 00000000..b8e32fc2 --- /dev/null +++ b/tests/integration_tests/add_molecules/ref_data/perylene-md-05.xyz @@ -0,0 +1 @@ +../../../../examples/add_molecules/perylene-md-05.xyz \ No newline at end of file diff --git a/tests/integration_tests/add_molecules/ref_data/shake_mil.top b/tests/integration_tests/add_molecules/ref_data/shake_mil.top new file mode 120000 index 00000000..3ca6b08a --- /dev/null +++ b/tests/integration_tests/add_molecules/ref_data/shake_mil.top @@ -0,0 +1 @@ +../../../../examples/add_molecules/shake_mil.top \ No newline at end of file diff --git a/tests/integration_tests/add_molecules/ref_data/shake_perylene.top b/tests/integration_tests/add_molecules/ref_data/shake_perylene.top new file mode 120000 index 00000000..e6cb421a --- /dev/null +++ b/tests/integration_tests/add_molecules/ref_data/shake_perylene.top @@ -0,0 +1 @@ +../../../../examples/add_molecules/shake_perylene.top \ No newline at end of file diff --git a/tests/integration_tests/add_molecules/ref_data/top.top b/tests/integration_tests/add_molecules/ref_data/top.top new file mode 100644 index 00000000..4ce2bb02 --- /dev/null +++ b/tests/integration_tests/add_molecules/ref_data/top.top @@ -0,0 +1,194 @@ +SHAKE 192 192 0 + 37 38 0.963983951706 + 39 40 0.963983951706 + 41 42 0.963983951706 + 43 44 0.963983951706 + 45 46 0.963983951706 + 47 48 0.963983951706 + 49 50 0.963983951706 + 51 52 0.963983951706 + 53 54 0.963983951706 + 55 56 0.963983951706 + 57 58 0.963983951706 + 59 60 0.963983951706 + 61 62 0.963983951706 + 63 64 0.963983951706 + 65 66 0.963983951706 + 67 68 0.963983951706 + 69 70 0.963983951706 + 71 72 0.963983951706 + 73 74 0.963983951706 + 75 76 0.963983951706 + 77 78 0.963983951706 + 79 80 0.963983951706 + 81 82 0.963983951706 + 83 84 0.963983951706 + 85 86 0.963983951706 + 87 88 0.963983951706 + 89 90 0.963983951706 + 91 92 0.963983951706 + 93 94 0.963983951706 + 95 96 0.963983951706 + 97 98 0.963983951706 + 99 100 0.963983951706 + 101 102 0.963983951706 + 103 104 0.963983951706 + 105 106 0.963983951706 + 107 108 0.963983951706 + 113 114 1.104370602120 + 115 116 1.104370602120 + 118 119 1.104370602120 + 120 121 1.104370602120 + 129 130 1.104370602120 + 131 132 1.104370602120 + 134 135 1.104370602120 + 136 137 1.104370602120 + 145 146 1.104370602120 + 147 148 1.104370602120 + 150 151 1.104370602120 + 152 153 1.104370602120 + 161 162 1.104370602120 + 163 164 1.104370602120 + 166 167 1.104370602120 + 168 169 1.104370602120 + 177 178 1.104370602120 + 179 180 1.104370602120 + 182 183 1.104370602120 + 184 185 1.104370602120 + 193 194 1.104370602120 + 195 196 1.104370602120 + 198 199 1.104370602120 + 200 201 1.104370602120 + 209 210 1.104370602120 + 211 212 1.104370602120 + 214 215 1.104370602120 + 216 217 1.104370602120 + 225 226 1.104370602120 + 227 228 1.104370602120 + 230 231 1.104370602120 + 232 233 1.104370602120 + 241 242 1.104370602120 + 243 244 1.104370602120 + 246 247 1.104370602120 + 248 249 1.104370602120 + 257 258 1.104370602120 + 259 260 1.104370602120 + 262 263 1.104370602120 + 264 265 1.104370602120 + 273 274 1.104370602120 + 275 276 1.104370602120 + 278 279 1.104370602120 + 280 281 1.104370602120 + 289 290 1.104370602120 + 291 292 1.104370602120 + 294 295 1.104370602120 + 296 297 1.104370602120 + 305 306 1.104370602120 + 307 308 1.104370602120 + 310 311 1.104370602120 + 312 313 1.104370602120 + 321 322 1.104370602120 + 323 324 1.104370602120 + 326 327 1.104370602120 + 328 329 1.104370602120 + 337 338 1.104370602120 + 339 340 1.104370602120 + 342 343 1.104370602120 + 344 345 1.104370602120 + 353 354 1.104370602120 + 355 356 1.104370602120 + 358 359 1.104370602120 + 360 361 1.104370602120 + 369 370 1.104370602120 + 371 372 1.104370602120 + 374 375 1.104370602120 + 376 377 1.104370602120 + 385 386 1.104370602120 + 387 388 1.104370602120 + 390 391 1.104370602120 + 392 393 1.104370602120 + 401 402 1.104370602120 + 403 404 1.104370602120 + 406 407 1.104370602120 + 408 409 1.104370602120 + 417 418 1.104370602120 + 419 420 1.104370602120 + 422 423 1.104370602120 + 424 425 1.104370602120 + 433 434 1.104370602120 + 435 436 1.104370602120 + 438 439 1.104370602120 + 440 441 1.104370602120 + 449 450 1.104370602120 + 451 452 1.104370602120 + 454 455 1.104370602120 + 456 457 1.104370602120 + 465 466 1.104370602120 + 467 468 1.104370602120 + 470 471 1.104370602120 + 472 473 1.104370602120 + 481 482 1.104370602120 + 483 484 1.104370602120 + 486 487 1.104370602120 + 488 489 1.104370602120 + 497 498 1.104370602120 + 499 500 1.104370602120 + 502 503 1.104370602120 + 504 505 1.104370602120 + 513 514 1.104370602120 + 515 516 1.104370602120 + 518 519 1.104370602120 + 520 521 1.104370602120 + 529 530 1.104370602120 + 531 532 1.104370602120 + 534 535 1.104370602120 + 536 537 1.104370602120 + 545 546 1.104370602120 + 547 548 1.104370602120 + 550 551 1.104370602120 + 552 553 1.104370602120 + 561 562 1.104370602120 + 563 564 1.104370602120 + 566 567 1.104370602120 + 568 569 1.104370602120 + 577 578 1.104370602120 + 579 580 1.104370602120 + 582 583 1.104370602120 + 584 585 1.104370602120 + 593 594 1.104370602120 + 595 596 1.104370602120 + 598 599 1.104370602120 + 600 601 1.104370602120 + 609 610 1.104370602120 + 611 612 1.104370602120 + 614 615 1.104370602120 + 616 617 1.104370602120 + 625 626 1.104370602120 + 627 628 1.104370602120 + 630 631 1.104370602120 + 632 633 1.104370602120 + 641 642 1.104370602120 + 643 644 1.104370602120 + 646 647 1.104370602120 + 648 649 1.104370602120 + 657 658 1.104370602120 + 659 660 1.104370602120 + 662 663 1.104370602120 + 664 665 1.104370602120 + 673 674 1.104370602120 + 675 676 1.104370602120 + 678 679 1.104370602120 + 680 681 1.104370602120 + 691 685 1.100786848627 # put here some comment + 694 689 1.102015725191 + 695 690 1.102015725191 + 698 693 1.102015725191 + 699 696 1.102015725191 + 700 697 1.100786848627 + 707 710 1.102015725191 + 708 701 1.102015725191 + 709 702 1.102015725191 + 712 706 1.100786848627 + 715 713 1.100786848627 + 716 714 1.102015725191 +END diff --git a/tests/integration_tests/add_molecules/test_add_molecules.py b/tests/integration_tests/add_molecules/test_add_molecules.py new file mode 100644 index 00000000..78511080 --- /dev/null +++ b/tests/integration_tests/add_molecules/test_add_molecules.py @@ -0,0 +1,68 @@ +import pathlib +import pytest + +from unittest.mock import patch +from filecmp import cmp as filecmp + +pytestmark = pytest.mark.integration + +from PQAnalysis.cli.add_molecules import main + +__path__ = pathlib.Path(__file__).parent.absolute() + + + +class TestAddMolecules: + + """ + Test the add_molecules function. + """ + + @pytest.mark.parametrize("example_dir", ["add_molecules"], indirect=False) + def test_add_molecules_no_topology(self, test_integration_folder): + """ + Test the add_molecules function when no topology is given. + """ + # test command line tool with certain arguments + + with patch( + 'argparse._sys.argv', + [ + 'add_molecules', + 'mil68ga-md-01.rst', + 'perylene-md-05.xyz', + '-o', + 'combined.rst' + ] + ): + main() + + filecmp("combined.rst", str(__path__ / "ref_data" / "combined.rst")) + + @pytest.mark.parametrize("example_dir", ["add_molecules"], indirect=False) + def test_add_molecules(self, test_integration_folder): + """ + Test the add_molecules function when no topology is given. + """ + # test command line tool with certain arguments + + with patch( + 'argparse._sys.argv', + [ + 'add_molecules', + 'mil68ga-md-01.rst', + 'perylene-md-05.xyz', + '--top-file', + 'shake_mil.top', + '--added-topology-file', + 'shake_perylene.top', + '-o', + 'combined.rst', + '--output-topology-file', + 'top.top' + ] + ): + main() + + filecmp("combined.rst", str(__path__ / "ref_data" / "combined.rst")) + filecmp("top.top", str(__path__ / "ref_data" / "top.top")) diff --git a/tests/io/test_topology_writer.py b/tests/io/test_topology_writer.py new file mode 100644 index 00000000..ecacab79 --- /dev/null +++ b/tests/io/test_topology_writer.py @@ -0,0 +1,330 @@ +""" +Unit tests for the topologyWriter module. +""" + +import pytest + +from PQAnalysis.io.topology_file import TopologyFileWriter, TopologyFileError +from PQAnalysis.topology import BondedTopology +from PQAnalysis.topology.bonded_topology import ( + Bond, + Angle, + Dihedral, +) + +from . import pytestmark # pylint: disable=unused-import + +# pylint: disable=protected-access + + + +class TestTopologyFileWriter: + + """ + Test cases for the TopologyFileWriter class. + """ + + def test__check_type_given(self): + """ + Test the _check_type_given method. + """ + bonds = [Bond(index1=1, index2=2, bond_type=1)] + + TopologyFileWriter._check_type_given(bonds, "bond") + + bonds.append(Bond(index1=2, index2=3)) + + with pytest.raises(TopologyFileError) as exception: + TopologyFileWriter._check_type_given(bonds, "bond") + assert str(exception.value) == ( + "In order to write the bond information in 'PQ' topology format, " + "all bonds must have a bond type defined." + ) + + angles = [Angle(index1=1, index2=2, index3=3, angle_type=1)] + + TopologyFileWriter._check_type_given(angles, "angle") + + angles.append(Angle(index1=2, index2=3, index3=4)) + + with pytest.raises(TopologyFileError) as exception: + TopologyFileWriter._check_type_given(angles, "angle") + assert str(exception.value) == ( + "In order to write the angle information in 'PQ' topology format, " + "all angles must have a angle type defined." + ) + + dihedrals = [ + Dihedral(index1=1, index2=2, index3=3, index4=4, dihedral_type=1) + ] + + TopologyFileWriter._check_type_given(dihedrals, "dihedral") + + dihedrals.append(Dihedral(index1=2, index2=3, index3=4, index4=5)) + + with pytest.raises(TopologyFileError) as exception: + TopologyFileWriter._check_type_given(dihedrals, "dihedral") + assert str(exception.value) == ( + "In order to write the dihedral information in 'PQ' topology format, " + "all dihedrals must have a dihedral type defined." + ) + + def test__get_bond_lines(self): + """ + Test the _get_bond_lines method. + """ + topology = BondedTopology() + + lines = TopologyFileWriter._get_bond_lines(topology) + assert lines[0] == "BONDS 0 0 0" + assert lines[1] == "END" + + bond1 = Bond(index1=1, index2=2, bond_type=1) + bond2 = Bond(index1=2, index2=3, bond_type=1, is_linker=True) + bond3 = Bond( + index1=5, + index2=2, + bond_type=1, + comment="This is a comment.", + ) + bond4 = Bond( + index1=5, + index2=2, + bond_type=1, + is_linker=True, + comment="This is a comment." + ) + + topology.bonds = [bond1, bond2, bond3, bond4] + + lines = TopologyFileWriter._get_bond_lines(topology) + assert lines[0] == "BONDS 3 2 2" + assert lines[1] == f"{1:>5d} {2:>5d} {1:>5d}" + assert lines[2] == f"{2:>5d} {3:>5d} {1:>5d} *" + assert lines[3] == f"{5:>5d} {2:>5d} {1:>5d} # This is a comment." + assert lines[4] == f"{5:>5d} {2:>5d} {1:>5d} * # This is a comment." + assert lines[5] == "END" + + def test__get_angle_lines(self): + """ + Test the _get_angle_lines method. + """ + topology = BondedTopology() + + lines = TopologyFileWriter._get_angle_lines(topology) + assert lines[0] == "ANGLES 0 0 0 0" + assert lines[1] == "END" + + angle1 = Angle(index1=1, index2=2, index3=3, angle_type=1) + angle2 = Angle( + index1=2, + index2=3, + index3=4, + angle_type=1, + is_linker=True, + ) + angle3 = Angle( + index1=5, + index2=2, + index3=3, + angle_type=1, + comment="This is a comment.", + ) + angle4 = Angle( + index1=5, + index2=2, + index3=3, + angle_type=1, + is_linker=True, + comment="This is a comment." + ) + + topology.angles = [angle1, angle2, angle3, angle4] + + lines = TopologyFileWriter._get_angle_lines(topology) + assert lines[0] == "ANGLES 3 2 2 2" + assert lines[1] == f"{1:>5d} {2:>5d} {3:>5d} {1:>5d}" + assert lines[2] == f"{2:>5d} {3:>5d} {4:>5d} {1:>5d} *" + assert lines[3] == ( + f"{5:>5d} {2:>5d} {3:>5d} {1:>5d} " + "# This is a comment." + ) + assert lines[4] == ( + f"{5:>5d} {2:>5d} {3:>5d} {1:>5d} * # " + "This is a comment." + ) + assert lines[5] == "END" + + def test__get_dihedral_lines(self): + """ + Test the _get_dihedral_lines method. + """ + topology = BondedTopology() + + lines = TopologyFileWriter._get_dihedral_lines(topology) + assert lines[0] == "DIHEDRALS 0 0 0 0" + assert lines[1] == "END" + + dihedral1 = Dihedral( + index1=1, index2=2, index3=3, index4=4, dihedral_type=1 + ) + dihedral2 = Dihedral( + index1=2, + index2=3, + index3=4, + index4=5, + dihedral_type=1, + is_linker=True, + ) + dihedral3 = Dihedral( + index1=5, + index2=2, + index3=3, + index4=4, + dihedral_type=1, + comment="This is a comment.", + ) + dihedral4 = Dihedral( + index1=5, + index2=2, + index3=3, + index4=4, + dihedral_type=1, + is_linker=True, + comment="This is a comment." + ) + + topology.dihedrals = [dihedral1, dihedral2, dihedral3, dihedral4] + + lines = TopologyFileWriter._get_dihedral_lines(topology) + assert lines[0] == "DIHEDRALS 3 2 2 2" + assert lines[1] == f"{1:>5d} {2:>5d} {3:>5d} {4:>5d} {1:>5d}" + assert lines[2] == f"{2:>5d} {3:>5d} {4:>5d} {5:>5d} {1:>5d} *" + assert lines[3] == ( + f"{5:>5d} {2:>5d} {3:>5d} {4:>5d} {1:>5d} " + "# This is a comment." + ) + assert lines[4] == ( + f"{5:>5d} {2:>5d} {3:>5d} {4:>5d} {1:>5d} * # " + "This is a comment." + ) + assert lines[5] == "END" + + def test__get_improper_lines(self): + """ + Test the _get_improper_lines method. + """ + topology = BondedTopology() + + lines = TopologyFileWriter._get_improper_lines(topology) + assert lines[0] == "IMPROPERS 0 0 0 0" + assert lines[1] == "END" + + improper1 = Dihedral( + index1=1, + index2=2, + index3=3, + index4=4, + dihedral_type=1, + is_improper=True + ) + improper2 = Dihedral( + index1=2, + index2=3, + index3=4, + index4=5, + dihedral_type=1, + is_linker=True, + is_improper=True, + ) + improper3 = Dihedral( + index1=5, + index2=2, + index3=3, + index4=4, + dihedral_type=1, + is_improper=True, + comment="This is a comment.", + ) + improper4 = Dihedral( + index1=5, + index2=2, + index3=3, + index4=4, + dihedral_type=1, + is_linker=True, + is_improper=True, + comment="This is a comment." + ) + + topology.impropers = [improper1, improper2, improper3, improper4] + + lines = TopologyFileWriter._get_improper_lines(topology) + assert lines[0] == "IMPROPERS 3 2 2 2" + assert lines[1] == f"{1:>5d} {2:>5d} {3:>5d} {4:>5d} {1:>5d}" + assert lines[2] == f"{2:>5d} {3:>5d} {4:>5d} {5:>5d} {1:>5d} *" + assert lines[3] == ( + f"{5:>5d} {2:>5d} {3:>5d} {4:>5d} {1:>5d} " + "# This is a comment." + ) + assert lines[4] == ( + f"{5:>5d} {2:>5d} {3:>5d} {4:>5d} {1:>5d} * # " + "This is a comment." + ) + assert lines[5] == "END" + + def test__get_shake_lines(self): + """ + Test the _get_shake_lines method. + """ + + topology = BondedTopology() + + lines = TopologyFileWriter._get_shake_lines(topology) + assert lines[0] == "SHAKE 0 0 0" + assert lines[1] == "END" + + bond1 = Bond( + index1=1, + index2=2, + equilibrium_distance=1.4, + is_shake=True, + ) + bond2 = Bond( + index1=2, + index2=3, + equilibrium_distance=1.4, + is_linker=True, + is_shake=True + ) + bond3 = Bond( + index1=5, + index2=2, + equilibrium_distance=1.5, + is_shake=True, + comment="This is a comment.", + ) + bond4 = Bond( + index1=5, + index2=2, + equilibrium_distance=1.5, + is_linker=True, + is_shake=True, + comment="This is a comment." + ) + + topology.shake_bonds = [bond1, bond2, bond3, bond4] + + lines = TopologyFileWriter._get_shake_lines(topology) + assert lines[0] == "SHAKE 3 2 2" + assert lines[1] == f"{1:>5d} {2:>5d} {1.4:>16.12f}\t" + assert lines[2] == f"{2:>5d} {3:>5d} {1.4:>16.12f}\t*" + assert lines[3] == ( + f"{5:>5d} {2:>5d} {1.5:>16.12f}\t " + "# This is a comment." + ) + assert lines[4] == ( + f"{5:>5d} {2:>5d} {1.5:>16.12f}\t* # " + "This is a comment." + ) + assert lines[5] == "END" diff --git a/tests/topology/test_shakeTopology.py b/tests/topology/test_shakeTopology.py index 8655c53b..4627e01d 100644 --- a/tests/topology/test_shakeTopology.py +++ b/tests/topology/test_shakeTopology.py @@ -127,10 +127,10 @@ def test_write_topology(self, capsys): captured = capsys.readouterr() assert captured.out == """ -SHAKE 3 2 0 -2 1 0.8035533905932738 -3 4 0.8035533905932737 -5 4 1.290569415042095 +SHAKE 3 2 0 + 2 1 0.803553390593\t + 3 4 0.803553390593\t + 5 4 1.290569415042\t END """ @@ -141,10 +141,10 @@ def test_write_topology(self, capsys): captured = capsys.readouterr() assert captured.out == """ -SHAKE 3 2 0 -2 1 0.8035533905932738 # test -3 4 0.8035533905932737 # test2 -5 4 1.290569415042095 # test3 +SHAKE 3 2 0 + 2 1 0.803553390593\t # test + 3 4 0.803553390593\t # test2 + 5 4 1.290569415042\t # test3 END """ @@ -158,9 +158,9 @@ def test_write_topology(self, capsys): captured = capsys.readouterr() assert captured.out == """ -SHAKE 3 2 0 -2 1 0.8035533905932738 # test -3 4 1.0470614028176843 # test2 -5 4 1.0470614028176843 # test2 +SHAKE 3 2 0 + 2 1 0.803553390593\t # test + 3 4 1.047061402818\t # test2 + 5 4 1.047061402818\t # test2 END """ diff --git a/tests/utils/__init__.py b/tests/utils/__init__.py index 0901e3ed..7e3dd4ae 100644 --- a/tests/utils/__init__.py +++ b/tests/utils/__init__.py @@ -1,3 +1,7 @@ +""" +This module is used to test the utils module. +""" + import pytest pytestmark = pytest.mark.utils diff --git a/tests/utils/test_string.py b/tests/utils/test_string.py new file mode 100644 index 00000000..d050b07b --- /dev/null +++ b/tests/utils/test_string.py @@ -0,0 +1,24 @@ +""" +Test cases for the string utility functions. +""" + +from PQAnalysis.utils.string import is_comment_line + +from . import pytestmark # pylint: disable=unused-import + + + +def test_is_comment_line(): + """ + Test the is_comment_line function. + """ + + assert not is_comment_line("This is not a comment line.") + + assert is_comment_line("# This is a comment line.") + assert not is_comment_line(" ") + assert is_comment_line(" ", empty_line=True) + + assert not is_comment_line("# This is a comment line.", comment_token="!") + assert is_comment_line("! This is a comment line.", comment_token="!") + assert is_comment_line(" !", comment_token="!", empty_line=False)