diff --git a/CHANGELOG.md b/CHANGELOG.md index 68961dbc..1931991f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,20 @@ # Changelog +## Release 0.1.5 + +- Split the Molecular Liquids benchmarks into four separately scored benchmarks: + `water_radial_distribution`, `water_density`, `solvent_radial_distribution`, and + `solvent_density`, all grouped under the `"Molecular Liquids"` category +- Add a `data_name` attribute (and `data_dir` property) to `Benchmark` so that + several benchmarks can share the same input data directory and HuggingFace archive. +- Add `Water density` and `Solvent density` UI pages showing the equilibrium-density + summary statistics and a per-frame density time series against the experimental + reference. +- Add the `nve_energy_conservation` benchmark, which runs short NVE (constant-energy) + MD simulations across a set of gas-phase and solvated systems and scores how well a + model conserves the total energy, quantified by the drift of the total energy over + the trajectory. + ## Release 0.1.4 - Add an Apache-2.0 `LICENSE` file and declare the license in `pyproject.toml`. diff --git a/docs/source/api_reference/benchmark.rst b/docs/source/api_reference/benchmark.rst index 10db1daa..d3b5eb80 100644 --- a/docs/source/api_reference/benchmark.rst +++ b/docs/source/api_reference/benchmark.rst @@ -9,6 +9,8 @@ Benchmark .. automethod:: __init__ + .. autoproperty:: data_dir + .. automethod:: run_model .. automethod:: analyze diff --git a/docs/source/api_reference/general/nve_energy_conservation.rst b/docs/source/api_reference/general/nve_energy_conservation.rst new file mode 100644 index 00000000..984b5138 --- /dev/null +++ b/docs/source/api_reference/general/nve_energy_conservation.rst @@ -0,0 +1,20 @@ +.. _nve_energy_conservation_api: + +NVE energy conservation +======================= + +.. module:: mlipaudit.benchmarks.nve_energy_conservation.nve_energy_conservation + +.. autoclass:: NVEEnergyConservationBenchmark + + .. automethod:: __init__ + + .. automethod:: run_model + + .. automethod:: analyze + +.. autoclass:: NVEEnergyConservationResult + +.. autoclass:: NVEStructureResult + +.. autoclass:: NVEEnergyConservationModelOutput diff --git a/docs/source/api_reference/index.rst b/docs/source/api_reference/index.rst index 34655795..5f8b996d 100644 --- a/docs/source/api_reference/index.rst +++ b/docs/source/api_reference/index.rst @@ -17,6 +17,7 @@ Base classes and utilities scoring utils/trajectory_helpers utils/inference_and_simulation + utils/molecular_liquids ui Benchmark implementations @@ -32,11 +33,14 @@ Benchmark implementations small_molecules/ring_planarity small_molecules/reference_geometry_stability small_molecules/bond_length_distribution - small_molecules/radial_distribution - small_molecules/solvent_radial_distribution small_molecules/reactivity small_molecules/nudged_elastic_band + molecular_liquids/water_radial_distribution + molecular_liquids/solvent_radial_distribution + molecular_liquids/water_density + molecular_liquids/solvent_density biomolecules/folding_stability biomolecules/sampling general/stability general/scaling + general/nve_energy_conservation diff --git a/docs/source/api_reference/molecular_liquids/solvent_density.rst b/docs/source/api_reference/molecular_liquids/solvent_density.rst new file mode 100644 index 00000000..20fb97eb --- /dev/null +++ b/docs/source/api_reference/molecular_liquids/solvent_density.rst @@ -0,0 +1,20 @@ +.. _solvent_density_api: + +Solvent Density +=============== + +.. module:: mlipaudit.benchmarks.solvent_density.solvent_density + +.. autoclass:: SolventDensityBenchmark + + .. automethod:: __init__ + + .. automethod:: run_model + + .. automethod:: analyze + +.. autoclass:: SolventDensityResult + +.. autoclass:: SolventDensityStructureResult + +.. autoclass:: SolventDensityModelOutput diff --git a/docs/source/api_reference/small_molecules/solvent_radial_distribution.rst b/docs/source/api_reference/molecular_liquids/solvent_radial_distribution.rst similarity index 100% rename from docs/source/api_reference/small_molecules/solvent_radial_distribution.rst rename to docs/source/api_reference/molecular_liquids/solvent_radial_distribution.rst diff --git a/docs/source/api_reference/molecular_liquids/water_density.rst b/docs/source/api_reference/molecular_liquids/water_density.rst new file mode 100644 index 00000000..4b70a99b --- /dev/null +++ b/docs/source/api_reference/molecular_liquids/water_density.rst @@ -0,0 +1,18 @@ +.. _water_density_api: + +Water Density +============= + +.. module:: mlipaudit.benchmarks.water_density.water_density + +.. autoclass:: WaterDensityBenchmark + + .. automethod:: __init__ + + .. automethod:: run_model + + .. automethod:: analyze + +.. autoclass:: WaterDensityResult + +.. autoclass:: WaterDensityModelOutput diff --git a/docs/source/api_reference/small_molecules/radial_distribution.rst b/docs/source/api_reference/molecular_liquids/water_radial_distribution.rst similarity index 100% rename from docs/source/api_reference/small_molecules/radial_distribution.rst rename to docs/source/api_reference/molecular_liquids/water_radial_distribution.rst diff --git a/docs/source/api_reference/utils/molecular_liquids.rst b/docs/source/api_reference/utils/molecular_liquids.rst new file mode 100644 index 00000000..4393f656 --- /dev/null +++ b/docs/source/api_reference/utils/molecular_liquids.rst @@ -0,0 +1,16 @@ +.. _molecular_liquids_helpers_api: + +Molecular Liquids Helpers +========================= + +.. module:: mlipaudit.utils.molecular_liquids + +.. autofunction:: compute_densities + +.. autofunction:: average_equilibrated_density + +.. autofunction:: run_water_npt_simulation + +.. autofunction:: run_solvent_npt_simulations + +.. autofunction:: get_solvent_system_names diff --git a/docs/source/benchmarks/general/index.rst b/docs/source/benchmarks/general/index.rst index c7cbb1ac..db6d08ad 100644 --- a/docs/source/benchmarks/general/index.rst +++ b/docs/source/benchmarks/general/index.rst @@ -11,3 +11,4 @@ applicable across molecular systems. Stability Scaling + NVE energy conservation diff --git a/docs/source/benchmarks/general/nve_energy_conservation.rst b/docs/source/benchmarks/general/nve_energy_conservation.rst new file mode 100644 index 00000000..33be2daa --- /dev/null +++ b/docs/source/benchmarks/general/nve_energy_conservation.rst @@ -0,0 +1,76 @@ +.. _nve_energy_conservation: + +NVE energy conservation +======================= + +Purpose +------- + +To assess how well a machine-learned interatomic potential (**MLIP**) conserves the total +mechanical energy during microcanonical (**NVE**) molecular dynamics (**MD**). Energy +conservation is a fundamental physical requirement: under **NVE** dynamics, with no +thermostat exchanging energy with the environment, the total energy +:math:`E(t) = \mathrm{PE}(t) + \mathrm{KE}(t)` should stay constant. A systematic drift +indicates unphysical forces or an inconsistency between the model's energy and its +gradient. + +Description +----------- + +For each system in the dataset, the benchmark runs a short **NVE** (velocity-Verlet, no +thermostat) **MD** simulation with the **MLIP**, with velocities initialized from a +Maxwell-Boltzmann distribution at **300 K**, leveraging +`jax-md `_ as integrated via the +`mlip `_ library. The potential and kinetic energies +are recorded at regular snapshots, and the total-energy drift relative to the first frame, +:math:`\Delta E(t) = E(t) - E(0)`, is fitted with a linear model. + +The **energy-conservation metric** is the magnitude of the fitted drift over the whole +trajectory, normalized by the kinetic-energy fluctuation scale: + +.. math:: + + r = \frac{\lvert \text{slope} \rvert \cdot T}{\sigma_{\mathrm{KE}}} + +where :math:`T` is the trajectory duration and :math:`\sigma_{\mathrm{KE}}` is the +standard deviation of the kinetic energy along the trajectory. This dimensionless ratio is +mapped to a score in :math:`[0, 1]` via the standard soft threshold: a ratio at or below +**1.0** scores **1.0**, and larger ratios decay exponentially. + +The threshold of **1.0** is set at the point where the systematic energy drift accumulated +over the whole trajectory reaches the same magnitude as the natural kinetic-energy +fluctuations: a ratio :math:`r \le 1` keeps the drift within the thermal noise floor, while +:math:`r > 1` means the drift dominates over those fluctuations. This is a deliberately +lenient threshold. Analogous energy-conservation tests for classical force fields typically +use a far tighter ratio, on the order of **0.01**; the more permissive value here reflects +a fundamental difference between the two. A classical force field is an analytic expression +whose potential-energy surface is smooth by construction, whereas an **MLIP** is a highly +parameterized model whose potential-energy surface is learned from finite training data. +While the model is trained to reproduce the training data, it is not guaranteed to be +smooth in between training points, as the interpolation between them can exhibit +high-frequency roughness. This roughness manifests as steep, sudden gradients, which the +MD integrator can struggle with. The resulting numerical error can accumulate and drive +larger integration drift compared to a classical force field. The threshold of **1.0** is +therefore chosen to be lenient enough to accommodate this behavior, while still being +strict enough to flag models that are clearly unphysical. + +Dataset +------- + +The dataset comprises four representative systems spanning vacuum, bulk liquid and solvated +regimes: + + - Small molecule (HCNO) in vacuum + - Bulk water (500 molecules) + - Solvated peptide (Oxytocin) + - Solvated peptide with counter-ions (Neurotensin) + +Systems whose elements the model cannot handle are skipped individually rather than +skipping the whole benchmark. + +Interpretation +-------------- + +A score of **1.0** indicates excellent energy conservation, i.e. the total-energy drift is +small relative to the natural kinetic-energy fluctuations. A score approaching **0.0** +indicates a strongly drifting, non-conservative trajectory. diff --git a/docs/source/benchmarks/molecular_liquids/density.rst b/docs/source/benchmarks/molecular_liquids/density.rst new file mode 100644 index 00000000..7a370437 --- /dev/null +++ b/docs/source/benchmarks/molecular_liquids/density.rst @@ -0,0 +1,65 @@ +.. _density: + +Density +======= + +Purpose +------- + +This benchmark assesses the ability of machine-learned interatomic potentials (**MLIP**) to +reproduce the **equilibrium density** of molecular liquids. Density is a fundamental +thermodynamic property: a model that predicts accurate local structure (see the +:ref:`radial_distribution` benchmark) may still get the density badly wrong if the simulation +box expands or collapses. Reproducing the correct density is therefore a complementary and +necessary check on the physical realism of a liquid-phase simulation. + +Description +----------- + +The benchmark runs the same **MD** simulation as the :ref:`radial_distribution` benchmark: an +**NPT** simulation using the **MLIP** model for **500,000 steps**, leveraging the +`jax-md `_ engine from the +`mlip `_ library. Water is run at **295.15 K** and **1 atm**, +while all other solvents are run at **293.15 K** and **1 atm**. Because the :ref:`radial_distribution` and density +benchmarks of a system share their input systems and simulation output, the simulation is only +run once when both benchmarks are run together. + +The density of each frame is computed from the (fluctuating) simulation cell volume: + +.. math:: + + \rho = \frac{N_\text{mol} \, M}{N_A \, V} + +where :math:`N_\text{mol}` is the number of molecules in the box, :math:`M` is the molecular +weight, :math:`N_A` is Avogadro's number and :math:`V` is the cell volume. The **equilibrium +density** is taken as the average density over the final four fifths of the trajectory (the +first fifth is discarded as equilibration). + +Dataset +------- + +The benchmark uses the same equilibrated input boxes as the :ref:`radial_distribution` benchmark +(a 500-molecule TIP3P water box, and methanol / acetonitrile / CCl4 boxes built with the GAFF +force field in OpenMM). + +Reference densities are the experimental values at the simulation conditions: water +:math:`0.9978\ \text{g/cm}^3` [#f1]_, CCl4 :math:`1.594\ \text{g/cm}^3` [#f2]_, methanol +:math:`0.792\ \text{g/cm}^3` [#f2]_ and acetonitrile :math:`0.787\ \text{g/cm}^3` [#f2]_. + +Interpretation +-------------- + +Performance is quantified by the **density deviation**, the absolute difference between the +equilibrium density and the experimental reference. The deviation should be **as low as +possible**. The score is derived from the *relative* deviation (deviation divided by the +reference density) so that it is comparable across liquids of very different densities: a +relative deviation within roughly **2%** scores close to 1, decaying gently beyond that. (The +ideal per-solvent target is ultimately set by the isothermal compressibility of the liquid.) A +large deviation typically indicates that the box has expanded or collapsed during the +simulation, and the density time series can be inspected on the results page to diagnose this. + +References +---------- + +.. [#f1] L. B. Skinner et al., J. Chem. Phys. 138, (2013). DOI: https://doi.org/10.1063/1.4790861 +.. [#f2] PubChem Compounds Collection https://pubchem.ncbi.nlm.nih.gov/compound diff --git a/docs/source/benchmarks/molecular_liquids/index.rst b/docs/source/benchmarks/molecular_liquids/index.rst index 3b809524..02c25991 100644 --- a/docs/source/benchmarks/molecular_liquids/index.rst +++ b/docs/source/benchmarks/molecular_liquids/index.rst @@ -4,10 +4,11 @@ Molecular Liquids ================= Molecular Liquids benchmarks are focused on the properties and dynamics of molecular liquids, -including as initial benchmark its radial distribution function. +including their radial distribution function and equilibrium density. .. toctree:: :maxdepth: 1 Radial distribution function + Density diff --git a/docs/source/benchmarks/molecular_liquids/radial_distribution.rst b/docs/source/benchmarks/molecular_liquids/radial_distribution.rst index bd8f3a5d..f1b78949 100644 --- a/docs/source/benchmarks/molecular_liquids/radial_distribution.rst +++ b/docs/source/benchmarks/molecular_liquids/radial_distribution.rst @@ -16,11 +16,13 @@ and emergent properties of liquid systems. Description ----------- -The benchmark performs an **MD** simulation using the **MLIP** model in the **NVT** ensemble at -**300 K** for **500,000 steps**, leveraging the `jax-md `_ engine -from the `mlip `_ library. The starting configuration is already +The benchmark performs an **MD** simulation using the **MLIP** model in the **NPT** ensemble for **500,000 steps**, +leveraging the `jax-md `_ engine from the +`mlip `_ library. Water is run at **295.15 K** and **1 atm**, +while all other solvents are run at **293.15 K** and **1 atm**. The starting configuration is already equilibrated. For every specific atom pair (e.g., **oxygen-oxygen** in water) the radial distribution -function (**RDF** or **g(r)**) is calculated from the simulation. +function (**RDF** or **g(r)**) is calculated from the simulation. The equilibrium +density of the same simulation is assessed separately in the :ref:`density` benchmark. .. figure:: img/rdf.png :figwidth: 35% @@ -44,17 +46,21 @@ where: - :math:`\delta` is the Dirac delta function, - and the angle brackets denote an ensemble average. -For each system, the benchmark compares **MLIP**-predicted **RDF** against -experimental reference data. Performance is quantified using the following metrics: +For each system, the benchmark compares the **MLIP**-predicted **RDF** against +reference data. The metric depends on what reference data is available: -- **Mean Absolute Error (MAE)** -- **Root Mean Square Error (RMSE)** +- For **water**, a full experimental **RDF** curve is available, so we compute the + **Mean Absolute Error (MAE)** and **Root Mean Square Error (RMSE)** of the predicted + **RDF** against it, together with the deviation of the first-shell peak position. +- For the **other solvents**, only the reference first-solvation-shell peak positions + are known, so performance is quantified by the **deviation of the predicted first-peak + position** from the reference (no MAE/RMSE). Dataset ------- -For the water radial distribution benchmark we set up a cubic box of 500 water molecules using OpenMM and the TIP3P water model. +For the :ref:`water radial distribution benchmark ` we set up a cubic box of 500 water molecules using OpenMM and the TIP3P water model. We equilibrated the box in the NPT ensemble at standard conditions and extracted the final snapshot as input for the benchmark. -For the solvent radial distribution benchmark, we initialized the solvent boxes (methanol, acetonitrile, CCl4) by stacking randomly rotated molecules +For the :ref:`solvent radial distribution benchmark `, we initialized the solvent boxes (methanol, acetonitrile, CCl4) by stacking randomly rotated molecules to yield a cubic box with a target side-length of 28 Å at the experimental density. We equilibrated the box in the NPT ensemble using the GAFF force field and OpenMM. We use the experimental water RDF profile of Skinner et al.\ [#f1]_ as reference data. For other solvents (methanol\ [#f2]_, acetonitrile\ [#f3]_, CCl4\ [#f4]_), we use the @@ -62,7 +68,8 @@ location of the first solvation shell peaks as reference data. Interpretation -------------- -The **MAE** and **RMSE** of the **RDF** should be **as low as possible**. These metrics +The relevant error — the **MAE**/**RMSE** of the **RDF** for water, or the first-peak +deviation for the other solvents — should be **as low as possible**. These metrics are likely to vary significantly for different molecular liquids and temperature conditions. **The error should be compared per liquid type and then examined in more detail for specific molecular interactions** to identify areas where the **MLIP** struggles to reproduce the correct diff --git a/pyproject.toml b/pyproject.toml index 01508969..07c40c85 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "mlipaudit" -version = "0.1.4" +version = "0.1.5" description = "Library and CLI tool for benchmarking ML Interatomic Potentials" readme = "README.md" authors = [ @@ -27,7 +27,7 @@ requires-python = ">=3.11" dependencies = [ "huggingface-hub>=0.33.4", "mdtraj>=1.10.3", - "mlip>=0.2.0,<0.3.0", + "mlip>=0.2.2,<0.3.0", "scikit-learn>=1.7.0", "streamlit>=1.46.1", "vl-convert-python>=1.8.0", @@ -45,7 +45,7 @@ build-backend = "hatchling.build" [project.optional-dependencies] cuda = [ - "mlip[cuda13]>=0.2.0,<0.3.0", + "mlip[cuda13]>=0.2.2,<0.3.0", ] [dependency-groups] diff --git a/src/mlipaudit/benchmark.py b/src/mlipaudit/benchmark.py index ed47c41d..f86a7bfc 100644 --- a/src/mlipaudit/benchmark.py +++ b/src/mlipaudit/benchmark.py @@ -30,8 +30,9 @@ RunModeAsString: TypeAlias = Literal["dev", "fast", "standard"] #: Default total charge applied to `atoms.info["charge"]` when a benchmark's -#: input data does not specify one. Represents a neutral system. -DEFAULT_CHARGE: float = 0.0 +#: input data does not specify one. Represents a neutral system. Kept as an int +#: since total charge is integral and some calculators (e.g. UMA) reject floats. +DEFAULT_CHARGE: int = 0 #: Default spin multiplicity applied to `atoms.info["spin"]`. All benchmarks #: currently treat systems as closed-shell singlets unless overridden. @@ -92,6 +93,10 @@ class Benchmark(ABC): If present, a user or the CLI can make use of this information to reuse cached model outputs from another benchmark carrying the same ID instead of rerunning simulations or inference. + data_name: An optional name of the input data directory (and HuggingFace + archive) to use instead of `name`. This lets several benchmarks share the + same input data without duplicating it. Defaults to None, in which case + `name` is used. """ name: str = "" @@ -104,6 +109,8 @@ class Benchmark(ABC): reusable_output_id: tuple[str, ...] | None = None + data_name: str | None = None + def __init__( self, force_field: ForceField | ASECalculator, @@ -133,9 +140,9 @@ def __init__( required elements. ValueError: If force field type is not compatible. """ - self.run_mode = run_mode - if not isinstance(self.run_mode, RunMode): - self.run_mode = RunMode(run_mode) + self.run_mode: RunMode = ( + run_mode if isinstance(run_mode, RunMode) else RunMode(run_mode) + ) self.force_field = force_field @@ -224,17 +231,27 @@ def check_can_run_model(cls, force_field: ForceField) -> bool: return True + @property + def data_dir(self) -> Path: + """The local directory holding this benchmark's input data. + + Uses `data_name` when set, otherwise `name`, so that benchmarks can share + input data. + """ + return self.data_input_dir / (self.data_name or self.name) + def _download_data(self) -> None: """Download the data from the data input directory if not already exists.""" - already_exists = (self.data_input_dir / self.name).exists() + data_name = self.data_name or self.name + already_exists = (self.data_input_dir / data_name).exists() if not already_exists: hf_hub_download( repo_id="InstaDeepAI/MLIPAudit-data", - filename=f"{self.name}.zip", + filename=f"{data_name}.zip", local_dir=self.data_input_dir, repo_type="dataset", ) - with zipfile.ZipFile(self.data_input_dir / f"{self.name}.zip", "r") as z: + with zipfile.ZipFile(self.data_input_dir / f"{data_name}.zip", "r") as z: z.extractall(self.data_input_dir) @abstractmethod diff --git a/src/mlipaudit/benchmarks/__init__.py b/src/mlipaudit/benchmarks/__init__.py index 5e899c38..6e897fe6 100644 --- a/src/mlipaudit/benchmarks/__init__.py +++ b/src/mlipaudit/benchmarks/__init__.py @@ -44,6 +44,12 @@ NEBResult, NudgedElasticBandBenchmark, ) +from mlipaudit.benchmarks.nve_energy_conservation.nve_energy_conservation import ( + NVEEnergyConservationBenchmark, + NVEEnergyConservationModelOutput, + NVEEnergyConservationResult, + NVEStructureResult, +) from mlipaudit.benchmarks.reactivity.reactivity import ( ReactivityBenchmark, ReactivityModelOutput, @@ -69,6 +75,12 @@ ScalingModelOutput, ScalingResult, ) +from mlipaudit.benchmarks.solvent_density.solvent_density import ( + SolventDensityBenchmark, + SolventDensityModelOutput, + SolventDensityResult, + SolventDensityStructureResult, +) from mlipaudit.benchmarks.solvent_radial_distribution.solvent_radial_distribution import ( # noqa: E501 SolventRadialDistributionBenchmark, SolventRadialDistributionModelOutput, @@ -85,6 +97,11 @@ TautomersModelOutput, TautomersResult, ) +from mlipaudit.benchmarks.water_density.water_density import ( + WaterDensityBenchmark, + WaterDensityModelOutput, + WaterDensityResult, +) from mlipaudit.benchmarks.water_radial_distribution.water_radial_distribution import ( WaterRadialDistributionBenchmark, WaterRadialDistributionModelOutput, diff --git a/src/mlipaudit/benchmarks/nve_energy_conservation/__init__.py b/src/mlipaudit/benchmarks/nve_energy_conservation/__init__.py new file mode 100644 index 00000000..3a45c9b6 --- /dev/null +++ b/src/mlipaudit/benchmarks/nve_energy_conservation/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2025 InstaDeep Ltd +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/src/mlipaudit/benchmarks/nve_energy_conservation/nve_energy_conservation.py b/src/mlipaudit/benchmarks/nve_energy_conservation/nve_energy_conservation.py new file mode 100644 index 00000000..ed8c9fad --- /dev/null +++ b/src/mlipaudit/benchmarks/nve_energy_conservation/nve_energy_conservation.py @@ -0,0 +1,481 @@ +# Copyright 2025 InstaDeep Ltd +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""NVE energy-conservation benchmark. + +Runs short microcanonical (NVE) molecular dynamics trajectories for a few +representative systems and measures how well the model conserves the total +mechanical energy ``E(t) = PE(t) + KE(t)``. The headline metric is the magnitude of +the total-energy drift over the trajectory divided by the standard deviation of the +kinetic energy: a conservative model keeps this dimensionless ratio small, while a +drifting one does not. +""" + +import functools +import logging +from dataclasses import dataclass +from typing import Any + +import numpy as np +from ase import Atoms +from ase.io import read as ase_read +from mlip.simulation.enums import MDIntegrator +from pydantic import BaseModel + +from mlipaudit.benchmark import ( + Benchmark, + BenchmarkResult, + ModelOutput, +) +from mlipaudit.benchmarks.stability.stability import BOX_SIZES +from mlipaudit.benchmarks.water_radial_distribution.water_radial_distribution import ( + WATERBOX_N500, +) +from mlipaudit.run_mode import RunMode +from mlipaudit.scoring import ALPHA, compute_metric_score +from mlipaudit.utils import run_simulation, skip_unallowed_elements + +logger = logging.getLogger("mlipaudit") + +# Cubic box length (Angstrom) of the bulk water system, matching the +# `water_radial_distribution` benchmark's equilibrated 500-molecule box. +WATER_BOX_LENGTH = 24.772 + +# Scoring threshold on the energy-drift / kinetic-energy-fluctuation ratio +# computed in `_analyze_structure`. +ENERGY_DRIFT_RATIO_THRESHOLD = 1.0 + +# Both validators of the JAX-MD config must hold: `num_episodes` evenly divides +# `num_steps`, and `snapshot_interval` evenly divides the steps per episode. +SIMULATION_CONFIG: dict[str, Any] = { + "num_steps": 50_000, + "num_episodes": 50, + "snapshot_interval": 50, + "timestep_fs": 1.0, + "temperature_kelvin": 300.0, +} +SIMULATION_CONFIG_DEV: dict[str, Any] = { + "num_steps": 100, + "num_episodes": 10, + "snapshot_interval": 10, + "timestep_fs": 1.0, + "temperature_kelvin": 300.0, +} + +# System classes, used for grouping in the UI / plots. +VACUUM = "vacuum" +BULK_WATER = "bulk_water" +SOLVATED = "solvated" + + +@dataclass(frozen=True) +class _SystemSpec: + """Static description of one NVE test system. + + Attributes: + name: Unique identifier for the system. + filename: Input structure file, relative to the benchmark data directory. + system_class: One of ``vacuum``, ``bulk_water`` or ``solvated``. + box: The periodic box. ``None`` for vacuum, a float for a cubic box, or a + list of three floats for an orthorhombic box (Angstrom). + description: Human-readable description of the system. + """ + + name: str + filename: str + system_class: str + box: float | list[float] | None + description: str + + +SYSTEMS: list[_SystemSpec] = [ + _SystemSpec( + name="Small_molecule_HCNO", + filename="small_molecule_HCNO.xyz", + system_class=VACUUM, + box=None, + description="Small molecule (HCNO) in vacuum", + ), + _SystemSpec( + name="Water_box_n500", + filename=WATERBOX_N500, + system_class=BULK_WATER, + box=WATER_BOX_LENGTH, + description="Bulk water (500 molecules)", + ), + _SystemSpec( + name="Peptide_solvated", + filename="peptide_solv.xyz", + system_class=SOLVATED, + box=BOX_SIZES["Peptide_solvated"], + description="Solvated Oxytocin (PDB: 7OFG)", + ), + _SystemSpec( + name="Peptide_solvated_ions", + filename="peptide_solv_ion.xyz", + system_class=SOLVATED, + box=BOX_SIZES["Peptide_solvated_ions"], + description="Solvated Neurotensin with counter-ions (PDB: 2LNF)", + ), +] + +SYSTEMS_BY_NAME: dict[str, _SystemSpec] = {spec.name: spec for spec in SYSTEMS} + + +class NVEStructureResult(BaseModel): + """Per-system result for the NVE energy-conservation benchmark. + + Attributes: + structure_name: The system identifier. + description: Human-readable description of the system. + system_class: One of ``vacuum``, ``bulk_water`` or ``solvated``. + num_atoms: The number of atoms in the system. + num_frames: The number of (finite) trajectory frames used for the fit. + times_ps: The snapshot times in picoseconds (x-axis of the drift plot). + energy_drift_ev: The total-energy drift in eV at each snapshot. + drift_slope_ev_per_ps: Slope of the linear fit to the drift (eV / ps). + total_drift_ev: Magnitude of the fitted total-energy drift over the whole + trajectory (eV), i.e. ``|slope| * duration``. + kinetic_energy_std_ev: Standard deviation of the kinetic energy along the + trajectory (eV); the fluctuation scale used to normalize the drift. + energy_drift_ratio: ``total_drift_ev / kinetic_energy_std_ev``, the + dimensionless energy-conservation metric used for scoring. + intercept_ev: Intercept of the linear fit (eV). + skipped: Whether the system was skipped because the model does not support + one of its elements. + failed: Whether the simulation ran but failed (e.g. it blew up). + score: The per-system score between 0 and 1, or None if skipped. + """ + + structure_name: str + description: str + system_class: str + num_atoms: int = 0 + num_frames: int = 0 + times_ps: list[float] = [] + energy_drift_ev: list[float] = [] + drift_slope_ev_per_ps: float | None = None + total_drift_ev: float | None = None + kinetic_energy_std_ev: float | None = None + energy_drift_ratio: float | None = None + intercept_ev: float | None = None + skipped: bool = False + failed: bool = False + score: float | None = None + + +class NVEEnergyConservationResult(BenchmarkResult): + """Result object for the NVE energy-conservation benchmark. + + Attributes: + structure_results: The list of per-system results. + n_skipped_unallowed_elements: How many systems were skipped because the + model does not support one of their elements. + failed: Whether all systems were skipped or failed. + score: The overall benchmark score between 0 and 1. + """ + + structure_results: list[NVEStructureResult] + n_skipped_unallowed_elements: int = 0 + + +class NVEEnergyConservationModelOutput(ModelOutput): + """Raw model outputs for the NVE energy-conservation benchmark. + + Per-system entries are aligned by index with ``structure_names``. Entries are + ``None`` for systems that were skipped or whose simulation failed. + + Attributes: + structure_names: The ordered list of system identifiers that were run. + num_atoms: The number of atoms per system. + times_ps: The snapshot times in picoseconds per system. + potential_energies_ev: The per-snapshot potential energies (eV) per system. + kinetic_energies_ev: The per-snapshot kinetic energies (eV) per system. + skipped_structures: Systems skipped due to unsupported elements. + n_skipped_unallowed_elements: Number of skipped systems. + """ + + structure_names: list[str] + num_atoms: list[int | None] + times_ps: list[list[float] | None] + potential_energies_ev: list[list[float] | None] + kinetic_energies_ev: list[list[float] | None] + skipped_structures: list[str] + n_skipped_unallowed_elements: int = 0 + + +class NVEEnergyConservationBenchmark(Benchmark): + """Benchmark measuring total-energy conservation under NVE dynamics. + + For each test system, a short NVE (velocity-Verlet, no thermostat) trajectory + is run with velocities initialized from a Maxwell-Boltzmann distribution. The + total mechanical energy ``PE + KE`` is tracked over the trajectory and its drift + relative to the first frame is fitted with a linear model; the fitted drift over + the run, divided by the standard deviation of the kinetic energy, is mapped to a + score. + + Attributes: + name: The unique benchmark name, ``nve_energy_conservation``. + category: The UI grouping category, ``General``. + result_class: The `NVEEnergyConservationResult` type. + model_output_class: The `NVEEnergyConservationModelOutput` type. + required_elements: The union of elements across all test systems. Used as + metadata only; per-system element gating is done in `run_model` (see + `skip_if_elements_missing`). + skip_if_elements_missing: Set to False so the benchmark is never skipped + wholesale; instead, individual systems whose elements the model cannot + handle are skipped within `run_model`. + """ + + name = "nve_energy_conservation" + category = "General" + result_class = NVEEnergyConservationResult + model_output_class = NVEEnergyConservationModelOutput + + required_elements = {"H", "C", "N", "O", "S", "Na", "Cl"} + skip_if_elements_missing = False + + def run_model(self) -> None: + """Run an NVE trajectory and record total energy for each system. + + Systems whose elements the model does not support are skipped. For the + rest, an NVE MD simulation is run and the per-snapshot potential and + kinetic energies are stored in `model_output`. + """ + systems = self._systems + + skipped = set( + skip_unallowed_elements( + self.force_field, + [ + (name, list(atoms.get_chemical_symbols())) + for name, atoms in systems.items() + ], + ) + ) + if skipped: + logger.info( + "Skipping %d systems with unallowed elements: %s", len(skipped), skipped + ) + + output = NVEEnergyConservationModelOutput( + structure_names=[], + num_atoms=[], + times_ps=[], + potential_energies_ev=[], + kinetic_energies_ev=[], + skipped_structures=sorted(skipped), + n_skipped_unallowed_elements=len(skipped), + ) + + for name, atoms in systems.items(): + spec = SYSTEMS_BY_NAME[name] + output.structure_names.append(name) + output.num_atoms.append(len(atoms)) + + if name in skipped: + output.times_ps.append(None) + output.potential_energies_ev.append(None) + output.kinetic_energies_ev.append(None) + continue + + logger.info("Running NVE MD for %s (%d atoms)", name, len(atoms)) + kwargs = dict(self._md_kwargs) + if spec.box is not None: + kwargs["box"] = spec.box + state = run_simulation( + atoms, + self.force_field, + md_integrator=MDIntegrator.NVE_VELOCITY_VERLET, + **kwargs, + ) + + if ( + state is None + or state.kinetic_energy is None + or state.potential_energy is None + ): + logger.info("Simulation failed for %s", name) + output.times_ps.append(None) + output.potential_energies_ev.append(None) + output.kinetic_energies_ev.append(None) + continue + + kinetic_energies = np.asarray(state.kinetic_energy, dtype=float) + potential_energies = np.asarray(state.potential_energy, dtype=float) + num_frames = min(len(kinetic_energies), len(potential_energies)) + times_ps = ( + np.arange(num_frames) + * self._md_kwargs["snapshot_interval"] + * self._md_kwargs["timestep_fs"] + / 1000.0 + ) + + output.times_ps.append(times_ps.tolist()) + output.potential_energies_ev.append( + potential_energies[:num_frames].tolist() + ) + output.kinetic_energies_ev.append(kinetic_energies[:num_frames].tolist()) + + self.model_output = output + + def analyze(self) -> NVEEnergyConservationResult: + """Compute the drift, fit its slope and score each system. + + Returns: + An `NVEEnergyConservationResult` with per-system drift curves, fitted + slopes and scores, plus the aggregate benchmark score. + + Raises: + RuntimeError: If called before `run_model()`. + """ + if self.model_output is None: + raise RuntimeError("Must call run_model() first.") + + output = self.model_output + structure_results: list[NVEStructureResult] = [] + + for index, name in enumerate(output.structure_names): + spec = SYSTEMS_BY_NAME[name] + num_atoms = output.num_atoms[index] or 0 + + if name in output.skipped_structures: + structure_results.append( + NVEStructureResult( + structure_name=name, + description=spec.description, + system_class=spec.system_class, + num_atoms=num_atoms, + skipped=True, + ) + ) + continue + + times = output.times_ps[index] + potential = output.potential_energies_ev[index] + kinetic = output.kinetic_energies_ev[index] + + result = self._analyze_structure(spec, num_atoms, times, potential, kinetic) + structure_results.append(result) + + scored = [ + r.score for r in structure_results if not r.skipped and r.score is not None + ] + if not scored: + return NVEEnergyConservationResult( + structure_results=structure_results, + n_skipped_unallowed_elements=output.n_skipped_unallowed_elements, + failed=True, + ) + + return NVEEnergyConservationResult( + structure_results=structure_results, + n_skipped_unallowed_elements=output.n_skipped_unallowed_elements, + score=float(np.mean(scored)), + ) + + def _analyze_structure( + self, + spec: _SystemSpec, + num_atoms: int, + times: list[float] | None, + potential: list[float] | None, + kinetic: list[float] | None, + ) -> NVEStructureResult: + """Compute the drift fit and score for a single system. + + Args: + spec: The system specification. + num_atoms: The number of atoms in the system. + times: The snapshot times in picoseconds, or None if skipped/failed. + potential: The per-snapshot potential energies (eV), or None. + kinetic: The per-snapshot kinetic energies (eV), or None. + + Returns: + The per-system result with the drift curve, fitted slope and score. + """ + base = { + "structure_name": spec.name, + "description": spec.description, + "system_class": spec.system_class, + "num_atoms": num_atoms, + } + + if times is None or potential is None or kinetic is None: + return NVEStructureResult(**base, failed=True, score=0.0) + + time_array = np.asarray(times, dtype=float) + total = np.asarray(potential, dtype=float) + np.asarray(kinetic, dtype=float) + + # A valid NVE trajectory has a finite energy at every snapshot; any non-finite + # value means the run diverged, so treat it as a failure. + # A linear fit also needs at least two points. + if total.size < 2 or not np.all(np.isfinite(total)): + return NVEStructureResult(**base, failed=True, score=0.0) + + drift = total - total[0] + slope, intercept = np.polyfit(time_array, drift, 1) + + kinetic_energy_std_ev = float(np.std(np.asarray(kinetic, dtype=float))) + if kinetic_energy_std_ev == 0.0: + # No kinetic-energy fluctuation means this is not a valid MD trajectory, + # and there is no fluctuation scale to normalize the drift against. + return NVEStructureResult(**base, failed=True, score=0.0) + + # Conservation metric: fitted total-energy drift over the run, normalized by + # the kinetic-energy fluctuation scale. + duration_ps = float(time_array[-1] - time_array[0]) + total_drift_ev = abs(float(slope) * duration_ps) + energy_drift_ratio = total_drift_ev / kinetic_energy_std_ev + score = float( + compute_metric_score( + np.array([energy_drift_ratio]), ENERGY_DRIFT_RATIO_THRESHOLD, ALPHA + )[0] + ) + + return NVEStructureResult( + **base, + num_frames=int(total.size), + times_ps=time_array.tolist(), + energy_drift_ev=drift.tolist(), + drift_slope_ev_per_ps=float(slope), + total_drift_ev=total_drift_ev, + kinetic_energy_std_ev=kinetic_energy_std_ev, + energy_drift_ratio=energy_drift_ratio, + intercept_ev=float(intercept), + score=score, + ) + + @functools.cached_property + def _systems(self) -> dict[str, Atoms]: + """Load the run-mode-selected test systems as ASE atoms (charge/spin set).""" + systems: dict[str, Atoms] = {} + for spec in self._selected_specs: + atoms = ase_read(self.data_input_dir / self.name / spec.filename) + systems[spec.name] = atoms + return systems + + @property + def _selected_specs(self) -> list[_SystemSpec]: + """The systems to run for the current run mode (dev runs only vacuum).""" + if self.run_mode == RunMode.DEV: + return [spec for spec in SYSTEMS if spec.system_class == VACUUM] + return SYSTEMS + + @functools.cached_property + def _md_kwargs(self) -> dict[str, Any]: + """The simulation configuration for the current run mode.""" + if self.run_mode == RunMode.DEV: + return SIMULATION_CONFIG_DEV + return SIMULATION_CONFIG diff --git a/src/mlipaudit/benchmarks/solvent_density/solvent_density.py b/src/mlipaudit/benchmarks/solvent_density/solvent_density.py new file mode 100644 index 00000000..40e14121 --- /dev/null +++ b/src/mlipaudit/benchmarks/solvent_density/solvent_density.py @@ -0,0 +1,209 @@ +# Copyright 2025 InstaDeep Ltd +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import logging +import statistics + +from mlip.simulation import SimulationState +from pydantic import BaseModel, ConfigDict, NonNegativeFloat + +from mlipaudit.benchmark import ( + Benchmark, + BenchmarkResult, + ModelOutput, +) +from mlipaudit.utils.molecular_liquids import ( + SOLVENT_DATA_NAME, + SOLVENT_MOLECULE_CONFIG, + SOLVENT_REFERENCE_DENSITIES, + SOLVENT_REUSABLE_OUTPUT_ID, + average_equilibrated_density, + compute_densities, + run_solvent_npt_simulations, + score_density, +) +from mlipaudit.utils.stability import is_simulation_stable + +logger = logging.getLogger("mlipaudit") + + +class SolventDensityModelOutput(ModelOutput): + """Model output containing the final simulation states for each structure. + + Shares its field signature with `SolventRadialDistributionModelOutput` so that the + NPT simulations can be reused between the two benchmarks (see `reusable_output_id`). + + Attributes: + structure_names: The names of the structures. + simulation_states: `SimulationState` or `None` object for each structure in + the same order as the structure names. `None` if the simulation failed. + """ + + structure_names: list[str] + simulation_states: list[SimulationState | None] + + model_config = ConfigDict(arbitrary_types_allowed=True) + + +class SolventDensityStructureResult(BaseModel): + """Stores the density result for a single structure. + + Attributes: + structure_name: The structure name. + densities: List of per-frame densities in g/cm3. + average_density: Average density over the final four fifths of the frames. + density_deviation: Absolute deviation of the average density from the reference. + reference_density: The reference density in g/cm3. + failed: Whether the simulation was successful. If unsuccessful, the other + attributes will be not be set. + score: The score for the molecule. + """ + + structure_name: str + densities: list[float] | None = None + average_density: float | None = None + density_deviation: NonNegativeFloat | None = None + reference_density: float | None = None + + failed: bool = False + score: float = 0.0 + + +class SolventDensityResult(BenchmarkResult): + """Result object for the solvent density benchmark. + + Attributes: + structure_names: The names of the structures. + structures: List of per structure results. + avg_density_deviation: The average density deviation across all structures. + failed: Whether all the simulations failed and no analysis could be + performed. Defaults to False. + score: The final score for the benchmark between 0 and 1. + """ + + structure_names: list[str] + structures: list[SolventDensityStructureResult] + avg_density_deviation: NonNegativeFloat | None = None + + +class SolventDensityBenchmark(Benchmark): + """Benchmark for the equilibrium density of molecular solvents. + + Runs the same NPT simulations as `SolventRadialDistributionBenchmark` (reusing + their output when both are run together) and scores how closely the equilibrium + density of each solvent matches its reference. + + Attributes: + name: The unique benchmark name. The name is `solvent_density`. + category: The benchmark's category, `"Molecular Liquids"`. + data_name: The input-data directory shared with the solvent RDF benchmark. + result_class: `SolventDensityResult`. + model_output_class: `SolventDensityModelOutput`. + required_elements: The set of atomic element types present in the input files. + reusable_output_id: Shared with `SolventRadialDistributionBenchmark` so the + solvent NPT simulations are only run once when both benchmarks are run + together. + """ + + name = "solvent_density" + category = "Molecular Liquids" + data_name = SOLVENT_DATA_NAME + result_class = SolventDensityResult + model_output_class = SolventDensityModelOutput + + required_elements = {"N", "H", "O", "C", "Cl"} + + reusable_output_id = SOLVENT_REUSABLE_OUTPUT_ID + + def run_model(self) -> None: + """Run an MD simulation for each structure using the NPT ensemble. + + The MD simulation is performed using the JAX MD engine and starts from + the reference structure. The NPT integrator uses Langevin dynamics with + a Monte Carlo barostat. + """ + structure_names, simulation_states = run_solvent_npt_simulations( + self.force_field, self.data_dir, self.run_mode + ) + self.model_output = SolventDensityModelOutput( + structure_names=structure_names, simulation_states=simulation_states + ) + + def analyze(self) -> SolventDensityResult: + """Compute the equilibrium density of each solvent and its deviation. + + Returns: + A `SolventDensityResult` object. + + Raises: + RuntimeError: If called before `run_model()`. + """ + if self.model_output is None: + raise RuntimeError("Must call run_model() first.") + + structure_results = [] + num_succeeded = 0 + + for system_name, simulation_state in zip( + self.model_output.structure_names, self.model_output.simulation_states + ): + if simulation_state is None or not is_simulation_stable(simulation_state): + structure_results.append( + SolventDensityStructureResult( + structure_name=system_name, + failed=True, + score=0.0, + ) + ) + continue + + num_succeeded += 1 + mol_config = SOLVENT_MOLECULE_CONFIG[system_name] + densities = compute_densities( + simulation_state, + mol_config["molecule_weight"], + int(mol_config["atoms_per_molecule"]), + ) + average_density = average_equilibrated_density(densities) + reference_density = SOLVENT_REFERENCE_DENSITIES[system_name] + density_deviation, score = score_density(average_density, reference_density) + + structure_results.append( + SolventDensityStructureResult( + structure_name=system_name, + densities=densities.tolist(), + average_density=average_density, + density_deviation=density_deviation, + reference_density=reference_density, + score=score, + ) + ) + + if num_succeeded == 0: + return SolventDensityResult( + structure_names=self.model_output.structure_names, + structures=structure_results, + failed=True, + score=0.0, + ) + + return SolventDensityResult( + structure_names=self.model_output.structure_names, + structures=structure_results, + avg_density_deviation=statistics.mean( + structure.density_deviation + for structure in structure_results + if structure.density_deviation is not None + ), + score=statistics.mean(r.score for r in structure_results), + ) diff --git a/src/mlipaudit/benchmarks/solvent_radial_distribution/solvent_radial_distribution.py b/src/mlipaudit/benchmarks/solvent_radial_distribution/solvent_radial_distribution.py index b8b72c32..b92cbcc5 100644 --- a/src/mlipaudit/benchmarks/solvent_radial_distribution/solvent_radial_distribution.py +++ b/src/mlipaudit/benchmarks/solvent_radial_distribution/solvent_radial_distribution.py @@ -17,55 +17,27 @@ import mdtraj as md import numpy as np -from ase import Atoms, units -from ase.io import read as ase_read +from ase import units from mlip.simulation import SimulationState from pydantic import BaseModel, ConfigDict, NonNegativeFloat from mlipaudit.benchmark import ( - DEFAULT_CHARGE, - DEFAULT_SPIN, Benchmark, BenchmarkResult, ModelOutput, ) -from mlipaudit.run_mode import RunMode from mlipaudit.scoring import ALPHA -from mlipaudit.utils import ( - create_mdtraj_trajectory_from_simulation_state, - run_simulation, +from mlipaudit.utils import create_mdtraj_trajectory_from_simulation_state +from mlipaudit.utils.molecular_liquids import ( + SOLVENT_REUSABLE_OUTPUT_ID, + get_solvent_pdb_file_name, + get_solvent_system_names, + run_solvent_npt_simulations, ) from mlipaudit.utils.stability import is_simulation_stable logger = logging.getLogger("mlipaudit") -SIMULATION_CONFIG = { - "num_steps": 500_000, - "snapshot_interval": 500, - "num_episodes": 1000, - "temperature_kelvin": 295.15, -} - -SIMULATION_CONFIG_DEV = { - "num_steps": 5, - "snapshot_interval": 1, - "num_episodes": 1, - "temperature_kelvin": 295.15, -} -SIMULATION_CONFIG_FAST = { - "num_steps": 250_000, - "snapshot_interval": 250, - "num_episodes": 1000, - "temperature_kelvin": 295.15, -} -NUM_DEV_SYSTEMS = 1 - -BOX_CONFIG = { # In Angstrom - "CCl4": 28.575, - "methanol": 29.592, - "acetonitrile": 27.816, -} - SYSTEM_ATOM_OF_INTEREST = { "CCl4": "C", "methanol": "O", @@ -109,12 +81,10 @@ class SolventRadialDistributionStructureResult(BaseModel): Attributes: structure_name: The structure name. radii: The radii values in Angstrom. - rdf: The radial distribution function values at the - radii. - first_solvent_peak: The first solvent peak, i.e. - the radius at which the rdf is the maximum. - peak_deviation: The deviation of the - first solvent peak from the reference. + rdf: The radial distribution function values at the radii. + first_solvent_peak: The first solvent peak, i.e. the radius at which the + rdf is the maximum. + peak_deviation: The deviation of the first solvent peak from the reference. failed: Whether the simulation was successful. If unsuccessful, the other attributes will be not be set. score: The score for the molecule. @@ -136,7 +106,7 @@ class SolventRadialDistributionResult(BenchmarkResult): Attributes: structure_names: The names of the structures. structures: List of per structure results. - avg_peak_deviation: The average deviation across all structures. + avg_peak_deviation: The average peak deviation across all structures. failed: Whether all the simulations failed and no analysis could be performed. Defaults to False. score: The final score for the benchmark between @@ -169,6 +139,8 @@ class SolventRadialDistributionBenchmark(Benchmark): if there are some atomic element types that the model cannot handle. If False, the benchmark must have its own custom logic to handle missing atomic element types. For this benchmark, the attribute is set to True. + reusable_output_id: Shared with `SolventDensityBenchmark` so that the solvent + NPT simulations are only run once when both benchmarks are run together. """ name = "solvent_radial_distribution" @@ -178,34 +150,20 @@ class SolventRadialDistributionBenchmark(Benchmark): required_elements = {"N", "H", "O", "C", "Cl"} + reusable_output_id = SOLVENT_REUSABLE_OUTPUT_ID + def run_model(self) -> None: - """Run an MD simulation for each structure. + """Run an MD simulation for each structure using the NPT ensemble. + The MD simulation is performed using the JAX MD engine and starts from - the reference structure. NOTE: This benchmark runs a simulation in the - NVT ensemble, which is not recommended for a water RDF calculation. + the reference structure. The NPT integrator uses Langevin dynamics with + a Monte Carlo barostat. """ - if self.run_mode == RunMode.DEV: - md_kwargs = SIMULATION_CONFIG_DEV - elif self.run_mode == RunMode.FAST: - md_kwargs = SIMULATION_CONFIG_FAST - else: - md_kwargs = SIMULATION_CONFIG - - simulation_states = [] - for system_name in self._system_names: - logger.info("Running MD for %s radial distribution function.", system_name) - - md_kwargs["box"] = BOX_CONFIG[system_name] - simulation_state = run_simulation( - atoms=self._load_system(system_name), - force_field=self.force_field, - **md_kwargs, - ) - - simulation_states.append(simulation_state) - + structure_names, simulation_states = run_solvent_npt_simulations( + self.force_field, self.data_dir, self.run_mode + ) self.model_output = SolventRadialDistributionModelOutput( - structure_names=self._system_names, simulation_states=simulation_states + structure_names=structure_names, simulation_states=simulation_states ) def analyze(self) -> SolventRadialDistributionResult: @@ -238,14 +196,9 @@ def analyze(self) -> SolventRadialDistributionResult: num_succeeded += 1 - box_length = BOX_CONFIG[system_name] - traj = create_mdtraj_trajectory_from_simulation_state( simulation_state=simulation_state, - topology_path=self.data_input_dir - / self.name - / self._get_pdb_file_name(system_name), - cell_lengths=(box_length, box_length, box_length), + topology_path=self.data_dir / get_solvent_pdb_file_name(system_name), ) pair_indices = traj.top.select( f"symbol == {SYSTEM_ATOM_OF_INTEREST[system_name]}" @@ -283,6 +236,7 @@ def analyze(self) -> SolventRadialDistributionResult: peak_deviation = abs( first_solvent_peak - REFERENCE_MAXIMA[system_name]["distance"] ) + score = math.exp( -ALPHA * peak_deviation / REFERENCE_MAXIMA[system_name]["distance"] ) @@ -314,27 +268,9 @@ def analyze(self) -> SolventRadialDistributionResult: for structure in structure_results if structure.peak_deviation is not None ), - score=statistics.mean( - r.score if r.score is not None else 0.0 for r in structure_results - ), + score=statistics.mean(r.score for r in structure_results), ) @property def _system_names(self) -> list[str]: - if self.run_mode == RunMode.STANDARD: - return list(BOX_CONFIG.keys()) - - # reduced number of cases for DEV and FAST run mode - return list(BOX_CONFIG.keys())[:NUM_DEV_SYSTEMS] - - def _load_system(self, system_name) -> Atoms: - atoms = ase_read( - self.data_input_dir / self.name / self._get_pdb_file_name(system_name) - ) - atoms.info["charge"] = DEFAULT_CHARGE - atoms.info["spin"] = DEFAULT_SPIN - return atoms - - @staticmethod - def _get_pdb_file_name(system_name: str) -> str: - return f"{system_name}_eq.pdb" + return get_solvent_system_names(self.run_mode) diff --git a/src/mlipaudit/benchmarks/water_density/water_density.py b/src/mlipaudit/benchmarks/water_density/water_density.py new file mode 100644 index 00000000..02b5be1b --- /dev/null +++ b/src/mlipaudit/benchmarks/water_density/water_density.py @@ -0,0 +1,150 @@ +# Copyright 2025 InstaDeep Ltd +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import logging + +from mlip.simulation import SimulationState +from pydantic import ConfigDict, NonNegativeFloat + +from mlipaudit.benchmark import ( + Benchmark, + BenchmarkResult, + ModelOutput, +) +from mlipaudit.utils.molecular_liquids import ( + WATER_ATOMS_PER_MOLECULE, + WATER_DATA_NAME, + WATER_MOLECULE_WEIGHT, + WATER_REFERENCE_DENSITY, + WATER_REUSABLE_OUTPUT_ID, + average_equilibrated_density, + compute_densities, + run_water_npt_simulation, + score_density, +) +from mlipaudit.utils.stability import is_simulation_stable + +logger = logging.getLogger("mlipaudit") + + +class WaterDensityModelOutput(ModelOutput): + """Model output containing the final simulation state of the water box. + + Shares its field signature with `WaterRadialDistributionModelOutput` so that the + NPT simulation can be reused between the two benchmarks (see `reusable_output_id`). + + Attributes: + simulation_state: The final simulation state of the water + box simulation. None if the simulation failed. + failed: Whether the simulation failed. Defaults to False. + """ + + model_config = ConfigDict(arbitrary_types_allowed=True) + + simulation_state: SimulationState | None = None + failed: bool = False + + +class WaterDensityResult(BenchmarkResult): + """Result object for the water density benchmark. + + Attributes: + densities: List of per-frame densities in g/cm3. + average_density: Average density over the final four fifths of the frames. + density_deviation: Absolute deviation of the average density from the + experimental reference. + reference_density: The experimental reference density in g/cm3. + failed: Whether the simulation failed and no analysis could be + performed. Defaults to False. + score: The final score for the benchmark between 0 and 1. + """ + + densities: list[float] | None = None + average_density: float | None = None + density_deviation: NonNegativeFloat | None = None + reference_density: float = WATER_REFERENCE_DENSITY + + +class WaterDensityBenchmark(Benchmark): + """Benchmark for the equilibrium density of liquid water. + + Runs the same water box NPT simulation as `WaterRadialDistributionBenchmark` + (reusing its output when both are run together) and scores how closely the + equilibrium density matches the experimental reference. + + Attributes: + name: The unique benchmark name. The name is `water_density`. + category: The benchmark's category, `"Molecular Liquids"`. + data_name: The input-data directory shared with the water RDF benchmark. + result_class: `WaterDensityResult`. + model_output_class: `WaterDensityModelOutput`. + required_elements: The set of atomic element types present in the input files. + reusable_output_id: Shared with `WaterRadialDistributionBenchmark` so the water + box NPT simulation is only run once when both benchmarks are run together. + """ + + name = "water_density" + category = "Molecular Liquids" + data_name = WATER_DATA_NAME + result_class = WaterDensityResult + model_output_class = WaterDensityModelOutput + + required_elements = {"H", "O"} + + reusable_output_id = WATER_REUSABLE_OUTPUT_ID + + def run_model(self) -> None: + """Run an MD simulation for the water box system using the NPT ensemble. + + The MD simulation is performed using the JAX MD engine and starts from + the reference structure. The NPT integrator uses Langevin dynamics with + a Monte Carlo barostat. + """ + simulation_state = run_water_npt_simulation( + self.force_field, self.data_dir, self.run_mode + ) + self.model_output = WaterDensityModelOutput( + simulation_state=simulation_state, failed=simulation_state is None + ) + + def analyze(self) -> WaterDensityResult: + """Compute the equilibrium density and how much it deviates from the reference. + + Returns: + A `WaterDensityResult` object. + + Raises: + RuntimeError: If called before `run_model()`. + """ + if self.model_output is None: + raise RuntimeError("Must call run_model() first.") + + simulation_state = self.model_output.simulation_state + + if self.model_output.failed or not is_simulation_stable(simulation_state): + return WaterDensityResult(failed=True, score=0.0) + + densities = compute_densities( + simulation_state, WATER_MOLECULE_WEIGHT, WATER_ATOMS_PER_MOLECULE + ) + average_density = average_equilibrated_density(densities) + density_deviation, score = score_density( + average_density, WATER_REFERENCE_DENSITY + ) + + return WaterDensityResult( + densities=densities.tolist(), + average_density=average_density, + density_deviation=density_deviation, + score=score, + ) diff --git a/src/mlipaudit/benchmarks/water_radial_distribution/water_radial_distribution.py b/src/mlipaudit/benchmarks/water_radial_distribution/water_radial_distribution.py index 23d1a0ac..0bbe6dfa 100644 --- a/src/mlipaudit/benchmarks/water_radial_distribution/water_radial_distribution.py +++ b/src/mlipaudit/benchmarks/water_radial_distribution/water_radial_distribution.py @@ -11,29 +11,27 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -import functools import logging import math -from typing import Any import mdtraj as md import numpy as np -from ase import Atoms, units -from ase.io import read as ase_read +from ase import units from mlip.simulation import SimulationState from pydantic import ConfigDict, NonNegativeFloat from sklearn.metrics import mean_absolute_error, root_mean_squared_error from mlipaudit.benchmark import ( - DEFAULT_CHARGE, - DEFAULT_SPIN, Benchmark, BenchmarkResult, ModelOutput, ) -from mlipaudit.run_mode import RunMode from mlipaudit.scoring import ALPHA, compute_metric_score -from mlipaudit.utils import run_simulation +from mlipaudit.utils.molecular_liquids import ( + WATER_REUSABLE_OUTPUT_ID, + WATERBOX_N500, + run_water_npt_simulation, +) from mlipaudit.utils.stability import is_simulation_stable from mlipaudit.utils.trajectory_helpers import ( create_mdtraj_trajectory_from_simulation_state, @@ -41,41 +39,15 @@ logger = logging.getLogger("mlipaudit") -SIMULATION_CONFIG = { - "num_steps": 500_000, - "snapshot_interval": 500, - "num_episodes": 1000, - "temperature_kelvin": 295.15, - "box": 24.772, -} - -SIMULATION_CONFIG_FAST = { - "num_steps": 250_000, - "snapshot_interval": 250, - "num_episodes": 1000, - "temperature_kelvin": 295.15, - "box": 24.772, -} - -SIMULATION_CONFIG_DEV = { - "num_steps": 5, - "snapshot_interval": 1, - "num_episodes": 1, - "temperature_kelvin": 295.15, - "box": 24.772, -} - -WATERBOX_N500 = "water_box_n500_eq.pdb" REFERENCE_DATA = "experimental_reference.npz" +REFERENCE_PEAK_DISTANCE = 2.80 # A RMSE_SCORE_THRESHOLD = 0.1 -SOLVENT_PEAK_RANGE = (2.8, 3.0) RADII_RANGE = (2.5, 10.0) class WaterRadialDistributionModelOutput(ModelOutput): - """Model output containing the final simulation state of - the water box. + """Model output containing the final simulation state of the water box. Attributes: simulation_state: The final simulation state of the water @@ -94,8 +66,7 @@ class WaterRadialDistributionResult(BenchmarkResult): Attributes: radii: The radii values in Angstrom. - rdf: The radial distribution function values at the - radii. + rdf: The radial distribution function values at the radii. mae: The MAE of the radial distribution function values. rmse: The RMSE of the radial distribution function values. first_solvent_peak: The first solvent peak, i.e. @@ -106,8 +77,7 @@ class WaterRadialDistributionResult(BenchmarkResult): radial distribution function error metrics. failed: Whether all the simulations failed and no analysis could be performed. Defaults to False. - score: The final score for the benchmark between - 0 and 1. + score: The final score for the benchmark between 0 and 1. """ radii: list[float] | None = None @@ -140,6 +110,8 @@ class WaterRadialDistributionBenchmark(Benchmark): if there are some atomic element types that the model cannot handle. If False, the benchmark must have its own custom logic to handle missing atomic element types. For this benchmark, the attribute is set to True. + reusable_output_id: Shared with `WaterDensityBenchmark` so that the water box + NPT simulation is only run once when both benchmarks are run together. """ name = "water_radial_distribution" @@ -149,21 +121,18 @@ class WaterRadialDistributionBenchmark(Benchmark): required_elements = {"H", "O"} + reusable_output_id = WATER_REUSABLE_OUTPUT_ID + def run_model(self) -> None: - """Run an MD simulation for each structure. + """Run an MD simulation for the water box system using the NPT ensemble. The MD simulation is performed using the JAX MD engine and starts from - the reference structure. NOTE: This benchmark runs a simulation in the - NVT ensemble, which is not recommended for a water RDF calculation. + the reference structure. The NPT integrator uses Langevin dynamics with + a Monte Carlo barostat. """ - logger.info("Running MD for for water radial distribution function.") - - simulation_state = run_simulation( - atoms=self._water_box_n500, - force_field=self.force_field, - **self._md_kwargs, + simulation_state = run_water_npt_simulation( + self.force_field, self.data_dir, self.run_mode ) - self.model_output = WaterRadialDistributionModelOutput( simulation_state=simulation_state, failed=simulation_state is None ) @@ -180,17 +149,14 @@ def analyze(self) -> WaterRadialDistributionResult: if self.model_output is None: raise RuntimeError("Must call run_model() first.") - if self.model_output.failed or not is_simulation_stable( - self.model_output.simulation_state - ): - return WaterRadialDistributionResult(failed=True, score=0.0) + simulation_state = self.model_output.simulation_state - box_length = self._md_kwargs["box"] + if self.model_output.failed or not is_simulation_stable(simulation_state): + return WaterRadialDistributionResult(failed=True, score=0.0) traj = create_mdtraj_trajectory_from_simulation_state( - self.model_output.simulation_state, - self.data_input_dir / self.name / WATERBOX_N500, - cell_lengths=(box_length, box_length, box_length), + simulation_state, + self.data_dir / WATERBOX_N500, ) oxygen_indices = traj.top.select("symbol == O") @@ -233,20 +199,16 @@ def analyze(self) -> WaterRadialDistributionResult: first_solvent_peak = radii[np.argmax(g_r)].item() - peak_deviation = max( - 0, - SOLVENT_PEAK_RANGE[0] - first_solvent_peak, - first_solvent_peak - SOLVENT_PEAK_RANGE[1], - ) + peak_deviation = abs(first_solvent_peak - REFERENCE_PEAK_DISTANCE) + peak_deviation_score = math.exp( - -ALPHA - * peak_deviation - / ((SOLVENT_PEAK_RANGE[0] + SOLVENT_PEAK_RANGE[1]) / 2) + -ALPHA * peak_deviation / REFERENCE_PEAK_DISTANCE ) rmse_score = compute_metric_score( np.array([rmse]), RMSE_SCORE_THRESHOLD, ALPHA ).item() + score = (peak_deviation_score + rmse_score) / 2 return WaterRadialDistributionResult( @@ -256,30 +218,14 @@ def analyze(self) -> WaterRadialDistributionResult: rmse=rmse, first_solvent_peak=first_solvent_peak, peak_deviation=peak_deviation, - range_of_interest=SOLVENT_PEAK_RANGE, score=score, ) - @functools.cached_property - def _md_kwargs(self) -> dict[str, Any]: - if self.run_mode == RunMode.DEV: - return SIMULATION_CONFIG_DEV - if self.run_mode == RunMode.FAST: - return SIMULATION_CONFIG_FAST - - return SIMULATION_CONFIG - - @functools.cached_property - def _water_box_n500(self) -> Atoms: - atoms = ase_read(self.data_input_dir / self.name / WATERBOX_N500) - atoms.info["charge"] = DEFAULT_CHARGE - atoms.info["spin"] = DEFAULT_SPIN - return atoms - - @functools.cached_property + @property def _reference_data(self): """The experimental reference data for the water RDF benchmark. + Contains keys 'r_OO' and 'g_OO', the radii and RDF values. The radii are in Angstrom. """ - return np.load(self.data_input_dir / self.name / REFERENCE_DATA) + return np.load(self.data_dir / REFERENCE_DATA) diff --git a/src/mlipaudit/ui/__init__.py b/src/mlipaudit/ui/__init__.py index b50c93e6..8f6394d0 100644 --- a/src/mlipaudit/ui/__init__.py +++ b/src/mlipaudit/ui/__init__.py @@ -19,12 +19,15 @@ from mlipaudit.ui.leaderboard import leaderboard_page from mlipaudit.ui.noncovalent_interactions import noncovalent_interactions_page from mlipaudit.ui.nudged_elastic_band import nudged_elastic_band_page +from mlipaudit.ui.nve_energy_conservation import nve_energy_conservation_page from mlipaudit.ui.reactivity import reactivity_page from mlipaudit.ui.reference_geometry_stability import reference_geometry_stability_page from mlipaudit.ui.ring_planarity import ring_planarity_page from mlipaudit.ui.sampling import sampling_page from mlipaudit.ui.scaling import scaling_page +from mlipaudit.ui.solvent_density import solvent_density_page from mlipaudit.ui.solvent_radial_distribution import solvent_radial_distribution_page from mlipaudit.ui.stability import stability_page from mlipaudit.ui.tautomers import tautomers_page +from mlipaudit.ui.water_density import water_density_page from mlipaudit.ui.water_radial_distribution import water_radial_distribution_page diff --git a/src/mlipaudit/ui/nve_energy_conservation.py b/src/mlipaudit/ui/nve_energy_conservation.py new file mode 100644 index 00000000..24db6959 --- /dev/null +++ b/src/mlipaudit/ui/nve_energy_conservation.py @@ -0,0 +1,264 @@ +# Copyright 2025 InstaDeep Ltd +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from typing import Callable, TypeAlias + +import altair as alt +import pandas as pd +import streamlit as st + +from mlipaudit.benchmarks import ( + NVEEnergyConservationBenchmark, + NVEEnergyConservationResult, +) +from mlipaudit.ui.page_wrapper import UIPageWrapper +from mlipaudit.ui.utils import ( + display_failed_models, + display_model_scores, + fetch_selected_models, + filter_failed_results, + get_failed_models, +) + +ModelName: TypeAlias = str +BenchmarkResultForMultipleModels: TypeAlias = dict[ + ModelName, NVEEnergyConservationResult +] + + +def _scores_dataframe( + data: BenchmarkResultForMultipleModels, selected_models: list[str] +) -> pd.DataFrame: + """Build the per-model summary score table. + + Args: + data: Mapping from model name to its benchmark result. + selected_models: The models currently selected in the sidebar. + + Returns: + A DataFrame indexed by model name with a ``Score`` column. + """ + rows = { + model_name: {"Score": result.score} + for model_name, result in data.items() + if model_name in selected_models + } + return pd.DataFrame.from_dict(rows, orient="index").rename_axis("Model name") + + +def _drift_dataframe( + data: BenchmarkResultForMultipleModels, + selected_models: list[str], + system_name: str, +) -> pd.DataFrame: + """Build the long-format drift curve + linear fit data for one system. + + Args: + data: Mapping from model name to its benchmark result. + selected_models: The models currently selected in the sidebar. + system_name: The system to extract drift curves for. + + Returns: + A long-format DataFrame with columns ``Time (ps)``, ``Drift (eV)``, + ``Model`` and ``Kind`` (either ``Drift`` or ``Linear fit``). + """ + records = [] + for model_name, result in data.items(): + if model_name not in selected_models: + continue + for structure in result.structure_results: + if structure.structure_name != system_name: + continue + if structure.skipped or structure.failed or len(structure.times_ps) < 2: + continue + slope = structure.drift_slope_ev_per_ps or 0.0 + intercept = structure.intercept_ev or 0.0 + for time_ps, drift in zip(structure.times_ps, structure.energy_drift_ev): + records.append({ + "Time (ps)": time_ps, + "Drift (eV)": drift, + "Model": model_name, + "Kind": "Drift", + }) + records.append({ + "Time (ps)": time_ps, + "Drift (eV)": slope * time_ps + intercept, + "Model": model_name, + "Kind": "Linear fit", + }) + return pd.DataFrame(records) + + +def _system_metrics_dataframe( + data: BenchmarkResultForMultipleModels, + selected_models: list[str], + system_name: str, +) -> pd.DataFrame: + """Build the per-model metrics table for one system. + + Args: + data: Mapping from model name to its benchmark result. + selected_models: The models currently selected in the sidebar. + system_name: The system to extract per-model metrics for. + + Returns: + A DataFrame indexed by model name with the drift metrics and score. + """ + rows = {} + for model_name, result in data.items(): + if model_name not in selected_models: + continue + for structure in result.structure_results: + if structure.structure_name != system_name: + continue + if structure.skipped or structure.failed: + continue + rows[model_name] = { + "Drift slope (eV/ps)": structure.drift_slope_ev_per_ps, + "Total drift (eV)": structure.total_drift_ev, + "Kinetic energy std (eV)": structure.kinetic_energy_std_ev, + "Energy drift ratio": structure.energy_drift_ratio, + "Score": structure.score, + } + return pd.DataFrame.from_dict(rows, orient="index").rename_axis("Model name") + + +def nve_energy_conservation_page( + data_func: Callable[[], BenchmarkResultForMultipleModels], +) -> None: + """Page for the visualization app for the NVE energy-conservation benchmark. + + Args: + data_func: A data function that delivers the results on request. It does + not take any arguments and returns a dictionary with model names as + keys and the benchmark results objects as values. + """ + st.markdown("# NVE energy conservation") + + st.markdown( + "This benchmark runs short microcanonical (NVE) molecular dynamics " + "trajectories and measures how well an MLIP conserves the total mechanical " + "energy, E(t) = PE(t) + KE(t). A good model keeps the total energy flat over " + "the trajectory; a poorly conserving one shows a systematic drift. The " + "headline metric is the magnitude of the fitted total-energy drift over the " + "run, divided by the standard deviation of the kinetic energy, so that a " + "smaller dimensionless ratio means better energy conservation." + ) + + st.markdown( + "For more information, see the [docs](https://instadeepai.github.io/mlipaudit" + "/benchmarks/general/nve_energy_conservation.html)." + ) + + if "nve_energy_conservation_cached_data" not in st.session_state: + st.session_state.nve_energy_conservation_cached_data = data_func() + + data: BenchmarkResultForMultipleModels = ( + st.session_state.nve_energy_conservation_cached_data + ) + + if not data: + st.markdown("**No results to display**.") + return + + selected_models = fetch_selected_models(available_models=list(data.keys())) + + if not selected_models: + st.markdown("**No results to display**.") + return + + failed_models = get_failed_models(data) + display_failed_models(failed_models) + data = filter_failed_results(data) + + if not data: + st.markdown("**No results to display**.") + return + + st.markdown("## Summary statistics") + df_scores = _scores_dataframe(data, selected_models) + if not df_scores.empty: + df_scores.sort_values("Score", ascending=False, inplace=True) + display_model_scores(df_scores) + + st.markdown("## Total-energy drift per system") + st.markdown( + "The solid line shows the total-energy drift relative to the first frame and " + "the dashed line its linear fit. The flatter the curve, the better the model " + "conserves energy." + ) + + available_systems = sorted({ + structure.structure_name + for result in data.values() + for structure in result.structure_results + if not structure.skipped and not structure.failed and structure.times_ps + }) + + if not available_systems: + st.markdown("**No drift curves to display**.") + return + + system_name = st.selectbox( + "Select a system", + available_systems, + format_func=lambda name: name.replace("_", " "), + ) + + df_drift = _drift_dataframe(data, selected_models, system_name) + if df_drift.empty: + st.markdown("**No drift curves to display for the selected models**.") + return + + chart = ( + alt.Chart(df_drift) + .mark_line() + .encode( + x=alt.X("Time (ps):Q", title="Time (ps)"), + y=alt.Y("Drift (eV):Q", title="Total-energy drift ΔE (eV)"), + color=alt.Color("Model:N", title="Model"), + # Solid = drift, dashed = linear fit (explained in the text above). No + # separate legend for this: a second stacked legend squeezes the + # "Time (ps)" x-axis title out under Streamlit's container-width autosize. + strokeDash=alt.StrokeDash("Kind:N", legend=None), + ) + .properties(width=800, height=400) + ) + st.altair_chart(chart, use_container_width=True) + + df_metrics = _system_metrics_dataframe(data, selected_models, system_name) + if not df_metrics.empty: + df_metrics.sort_values("Score", ascending=False, inplace=True) + st.dataframe( + df_metrics.style.format(precision=4), + column_config={ + "Score": st.column_config.ProgressColumn( + "Score", min_value=0, max_value=1, format="%.2f" + ) + }, + ) + + +class NVEEnergyConservationPageWrapper(UIPageWrapper): + """Page wrapper for the NVE energy-conservation benchmark.""" + + @classmethod + def get_page_func( # noqa: D102 + cls, + ) -> Callable[[Callable[[], BenchmarkResultForMultipleModels]], None]: + return nve_energy_conservation_page + + @classmethod + def get_benchmark_class(cls) -> type[NVEEnergyConservationBenchmark]: # noqa: D102 + return NVEEnergyConservationBenchmark diff --git a/src/mlipaudit/ui/solvent_density.py b/src/mlipaudit/ui/solvent_density.py new file mode 100644 index 00000000..32978337 --- /dev/null +++ b/src/mlipaudit/ui/solvent_density.py @@ -0,0 +1,187 @@ +# Copyright 2025 InstaDeep Ltd +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from typing import Callable, TypeAlias + +import altair as alt +import pandas as pd +import streamlit as st + +from mlipaudit.benchmarks import SolventDensityBenchmark, SolventDensityResult +from mlipaudit.ui.page_wrapper import UIPageWrapper +from mlipaudit.ui.utils import ( + display_failed_models, + display_model_scores, + fetch_selected_models, + filter_failed_results, + get_failed_models, + ordered_structure_names, +) + +ModelName: TypeAlias = str +BenchmarkResultForMultipleModels: TypeAlias = dict[ModelName, SolventDensityResult] + + +def _process_data_into_dataframe( + data: BenchmarkResultForMultipleModels, + selected_models: list[str], +) -> pd.DataFrame: + converted_data_scores = [] + for model_name, result in data.items(): + if model_name in selected_models: + model_data_converted = { + "Model name": model_name, + "Score": result.score, + "Average density deviation (g/cm3)": result.avg_density_deviation, + } + for structure_res in result.structures: + if structure_res.failed: + continue + + model_data_converted[ + f"{structure_res.structure_name} density (g/cm3)" + ] = structure_res.average_density + + model_data_converted[ + f"{structure_res.structure_name} density deviation (g/cm3)" + ] = structure_res.density_deviation + converted_data_scores.append(model_data_converted) + df = pd.DataFrame(converted_data_scores) + return df + + +def solvent_density_page( + data_func: Callable[[], BenchmarkResultForMultipleModels], +) -> None: + """Page for the visualization app for the solvent density benchmark. + + Args: + data_func: A data function that delivers the results on request. It does + not take any arguments and returns a dictionary with model names as + keys and the benchmark results objects as values. + """ + st.markdown("# Solvent density") + + st.markdown( + "Here we show the equilibrium density of each molecular solvent, obtained from " + "NPT simulations. The dashed lines show the reference density of each solvent. " + "A box that expands or collapses will show up as a large deviation from the " + "reference density." + ) + + st.markdown( + "For more information, see the [docs](https://instadeepai.github.io/mlipaudit/" + "benchmarks/molecular_liquids/density.html)." + ) + + if "solvent_density_cached_data" not in st.session_state: + st.session_state.solvent_density_cached_data = data_func() + + data: BenchmarkResultForMultipleModels = ( + st.session_state.solvent_density_cached_data + ) + + if not data: + st.markdown("**No results to display**.") + return + + selected_models = fetch_selected_models(available_models=list(data.keys())) + + if not selected_models: + st.markdown("**No results to display**.") + return + + failed_models = get_failed_models(data) + display_failed_models(failed_models) + data = filter_failed_results(data) + + st.markdown("## Summary statistics") + + df = _process_data_into_dataframe(data, selected_models) + df.sort_values("Score", ascending=False, inplace=True) + display_model_scores(df) + + st.markdown("## Density time series") + + for solvent in ordered_structure_names(data, selected_models): + plot_data_solvent = [] + reference_density = None + + for model_name, result in data.items(): + if model_name not in selected_models: + continue + structure_res = {s.structure_name: s for s in result.structures}.get( + solvent + ) + if ( + structure_res is None + or structure_res.failed + or structure_res.densities is None + ): + continue + + reference_density = structure_res.reference_density + for frame, density in enumerate(structure_res.densities): + plot_data_solvent.append({ + "Frame": frame, + "Density (g/cm3)": density, + "model": str(model_name), + }) + + if not plot_data_solvent: + st.warning(f"No data found for {solvent}") + continue + + st.subheader(f"Density of {solvent}") + + df_plot_solvent = pd.DataFrame(plot_data_solvent) + + chart_solvent = ( + alt.Chart(df_plot_solvent) + .mark_line(strokeWidth=2.0) + .encode( + x=alt.X("Frame:Q", title="Frame"), + y=alt.Y( + "Density (g/cm3):Q", + title="Density (g/cm³)", + scale=alt.Scale(zero=False), + ), + color=alt.Color("model:N", title="Model"), + ) + .properties(width=800, height=400) + ) + + if reference_density is not None: + reference_line = ( + alt.Chart(pd.DataFrame({"y": [reference_density]})) + .mark_rule(color="black", strokeDash=[6, 4], strokeWidth=2) + .encode(y="y:Q") + ) + chart_solvent = chart_solvent + reference_line + + st.altair_chart(chart_solvent, use_container_width=True) + + +class SolventDensityPageWrapper(UIPageWrapper): + """Page wrapper for the solvent density benchmark.""" + + @classmethod + def get_page_func( # noqa: D102 + cls, + ) -> Callable[[Callable[[], BenchmarkResultForMultipleModels]], None]: + return solvent_density_page + + @classmethod + def get_benchmark_class(cls) -> type[SolventDensityBenchmark]: # noqa: D102 + return SolventDensityBenchmark diff --git a/src/mlipaudit/ui/solvent_radial_distribution.py b/src/mlipaudit/ui/solvent_radial_distribution.py index 4a52ff4d..a688dcbf 100644 --- a/src/mlipaudit/ui/solvent_radial_distribution.py +++ b/src/mlipaudit/ui/solvent_radial_distribution.py @@ -33,6 +33,7 @@ fetch_selected_models, filter_failed_results, get_failed_models, + ordered_structure_names, ) APP_DATA_DIR = Path(__file__).parent.parent / "app_data" @@ -94,9 +95,9 @@ def solvent_radial_distribution_page( st.markdown("# Solvent Radial distribution function") st.markdown( - "Here we show the radial distribution function of the solvents CCl4, " - "methanol, and acetonitrile. The vertical lines show the reference " - "maximum of the radial distribution function for each solvent." + "Here we show the radial distribution function of each solvent. The vertical " + "lines show the reference maximum of the radial distribution function for each " + "solvent." ) st.markdown( @@ -138,25 +139,28 @@ def solvent_radial_distribution_page( st.markdown("## Radial distribution functions") - for solvent_index, solvent in enumerate(["CCl4", "methanol", "acetonitrile"]): + for solvent in ordered_structure_names(data, selected_models): rdf_data_solvent = {} for model_name, result in data.items(): - if ( - model_name in selected_models - and solvent in result.structure_names - and not result.structures[solvent_index].failed - ): - rdf_data_solvent[model_name] = { - "r": np.array(result.structures[solvent_index].radii), - "rdf": np.array(result.structures[solvent_index].rdf), - } + if model_name not in selected_models: + continue + structure_res = {s.structure_name: s for s in result.structures}.get( + solvent + ) + if structure_res is None or structure_res.failed: + continue + rdf_data_solvent[model_name] = { + "r": np.array(structure_res.radii), + "rdf": np.array(structure_res.rdf), + } if len(rdf_data_solvent) > 0: - st.subheader( - f"Radial distribution function of {solvent} " - f"({solvent_maxima[solvent]['type']})" - ) + maximum = solvent_maxima.get(solvent) + title = f"Radial distribution function of {solvent}" + if maximum is not None: + title += f" ({maximum['type']})" + st.subheader(title) # Convert to long format for Altair plotting plot_data_solvent = [] @@ -186,17 +190,16 @@ def solvent_radial_distribution_page( .properties(width=800, height=400) ) - # Add vertical line at experimental maximum - vline = ( - alt.Chart(pd.DataFrame({"x": [solvent_maxima[solvent]["distance"]]})) - .mark_rule(color="black", strokeWidth=2) - .encode(x="x:Q") - ) - - # Combine the line chart with the vertical line - combined_chart = chart_solvent + vline + # Add vertical line at experimental maximum, if available + if maximum is not None: + vline = ( + alt.Chart(pd.DataFrame({"x": [maximum["distance"]]})) + .mark_rule(color="black", strokeWidth=2) + .encode(x="x:Q") + ) + chart_solvent = chart_solvent + vline - st.altair_chart(combined_chart, use_container_width=True) + st.altair_chart(chart_solvent, use_container_width=True) else: st.warning(f"No data found for {solvent}") diff --git a/src/mlipaudit/ui/utils.py b/src/mlipaudit/ui/utils.py index 55cfdd50..3c9ede38 100644 --- a/src/mlipaudit/ui/utils.py +++ b/src/mlipaudit/ui/utils.py @@ -326,6 +326,31 @@ def display_failed_models(model_names: list[str]) -> None: st.markdown("Models that failed to run: \n" + markdown_list) +def ordered_structure_names( + data: BenchmarkResultForMultipleModels, selected_models: list[str] +) -> list[str]: + """Collect the de-duplicated structure names across the selected models' results. + + Systems are identified by name rather than by position, so the UI does not depend + on the order in which they were simulated. Names are returned in first-seen order. + + Args: + data: The dictionary of results for a given benchmark. + selected_models: The models to consider. + + Returns: + The structure names in first-seen order. + """ + names: list[str] = [] + for model_name, result in data.items(): + if model_name not in selected_models: + continue + for name in getattr(result, "structure_names", []): + if name not in names: + names.append(name) + return names + + def filter_failed_results( data: BenchmarkResultForMultipleModels, ) -> BenchmarkResultForMultipleModels: diff --git a/src/mlipaudit/ui/water_density.py b/src/mlipaudit/ui/water_density.py new file mode 100644 index 00000000..2ec91271 --- /dev/null +++ b/src/mlipaudit/ui/water_density.py @@ -0,0 +1,171 @@ +# Copyright 2025 InstaDeep Ltd +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from typing import Callable, TypeAlias + +import altair as alt +import pandas as pd +import streamlit as st + +from mlipaudit.benchmarks import WaterDensityBenchmark, WaterDensityResult +from mlipaudit.ui.page_wrapper import UIPageWrapper +from mlipaudit.ui.utils import ( + display_failed_models, + display_model_scores, + fetch_selected_models, + filter_failed_results, + get_failed_models, +) + +ModelName: TypeAlias = str +BenchmarkResultForMultipleModels: TypeAlias = dict[ModelName, WaterDensityResult] + + +def _process_data_into_dataframe( + data: BenchmarkResultForMultipleModels, + selected_models: list[str], +) -> pd.DataFrame: + converted_data_scores, model_names = [], [] + for model_name, result in data.items(): + if model_name in selected_models: + converted_data_scores.append({ + "Score": result.score, + "Equilibrium density (g/cm3)": result.average_density, + "Density deviation (g/cm3)": result.density_deviation, + "Reference density (g/cm3)": result.reference_density, + }) + model_names.append(model_name) + + df = pd.DataFrame(converted_data_scores, index=model_names) + return df + + +def water_density_page( + data_func: Callable[[], BenchmarkResultForMultipleModels], +) -> None: + """Page for the visualization app for the water density benchmark. + + Args: + data_func: A data function that delivers the results on request. It does + not take any arguments and returns a dictionary with model names as + keys and the benchmark results objects as values. + """ + st.markdown("# Water density") + + st.markdown( + "The equilibrium density of liquid water is a fundamental property that a " + "good MLIP should reproduce. We run an NPT simulation of a box of water " + "molecules and compare the resulting equilibrium density to the experimental " + "reference. A box that expands or collapses will show up as a large deviation " + "from the reference density." + ) + + st.markdown( + "For more information, see the [docs](https://instadeepai.github.io/mlipaudit" + "/benchmarks/molecular_liquids/density.html)." + ) + + if "water_density_cached_data" not in st.session_state: + st.session_state.water_density_cached_data = data_func() + + data: BenchmarkResultForMultipleModels = st.session_state.water_density_cached_data + + if not data: + st.markdown("**No results to display**.") + return + + selected_models = fetch_selected_models(available_models=list(data.keys())) + + if not selected_models: + st.markdown("**No results to display**.") + return + + failed_models = get_failed_models(data) + display_failed_models(failed_models) + data = filter_failed_results(data) + + st.markdown("## Summary statistics") + + df = _process_data_into_dataframe(data, selected_models) + df = df.rename_axis("Model name") + df.sort_values("Score", ascending=False, inplace=True) + display_model_scores(df) + + st.markdown("## Density time series") + st.markdown( + "Here we show the density of the water box over the course of the simulation. " + "The black dashed line shows the experimental reference density. A " + "well-behaved simulation should equilibrate close to this line." + ) + + plot_data = [] + reference_density = None + for model_name, result in data.items(): + if ( + model_name in selected_models + and not result.failed + and result.densities is not None + ): + reference_density = result.reference_density + for frame, density in enumerate(result.densities): + plot_data.append({ + "Frame": frame, + "Density (g/cm3)": density, + "model": str(model_name), + }) + + if not plot_data: + st.markdown("**No density time series to display**.") + return + + df_plot = pd.DataFrame(plot_data) + + chart = ( + alt.Chart(df_plot) + .mark_line(strokeWidth=2.0) + .encode( + x=alt.X("Frame:Q", title="Frame"), + y=alt.Y( + "Density (g/cm3):Q", + title="Density (g/cm³)", + scale=alt.Scale(zero=False), + ), + color=alt.Color("model:N", title="Model"), + ) + .properties(width=800, height=400) + ) + + if reference_density is not None: + reference_line = ( + alt.Chart(pd.DataFrame({"y": [reference_density]})) + .mark_rule(color="black", strokeDash=[6, 4], strokeWidth=2) + .encode(y="y:Q") + ) + chart = chart + reference_line + + st.altair_chart(chart, use_container_width=True) + + +class WaterDensityPageWrapper(UIPageWrapper): + """Page wrapper for the water density benchmark.""" + + @classmethod + def get_page_func( # noqa: D102 + cls, + ) -> Callable[[Callable[[], BenchmarkResultForMultipleModels]], None]: + return water_density_page + + @classmethod + def get_benchmark_class(cls) -> type[WaterDensityBenchmark]: # noqa: D102 + return WaterDensityBenchmark diff --git a/src/mlipaudit/ui/water_radial_distribution.py b/src/mlipaudit/ui/water_radial_distribution.py index d9a4b5bb..32e8dcc1 100644 --- a/src/mlipaudit/ui/water_radial_distribution.py +++ b/src/mlipaudit/ui/water_radial_distribution.py @@ -25,9 +25,6 @@ WaterRadialDistributionBenchmark, WaterRadialDistributionResult, ) -from mlipaudit.benchmarks.water_radial_distribution.water_radial_distribution import ( - SOLVENT_PEAK_RANGE, -) from mlipaudit.ui.page_wrapper import UIPageWrapper from mlipaudit.ui.utils import ( display_failed_models, @@ -74,8 +71,6 @@ def _process_data_into_dataframe( "RMSE (Å)": result.rmse, "MAE (Å)": result.mae, "First solvent peak (Å)": result.first_solvent_peak, - "Solvent peak acceptable minimum (Å)": SOLVENT_PEAK_RANGE[0], - "Solvent peak acceptable maximum (Å)": SOLVENT_PEAK_RANGE[1], "Peak deviation (Å)": result.peak_deviation, } converted_data_scores.append(model_data_converted) diff --git a/src/mlipaudit/utils/molecular_liquids.py b/src/mlipaudit/utils/molecular_liquids.py new file mode 100644 index 00000000..2f7d1ffb --- /dev/null +++ b/src/mlipaudit/utils/molecular_liquids.py @@ -0,0 +1,330 @@ +# Copyright 2025 InstaDeep Ltd +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import logging +import os +from pathlib import Path +from typing import Any + +import numpy as np +from ase import Atoms, units +from ase.calculators.calculator import Calculator as ASECalculator +from ase.io import read as ase_read +from mlip.models import ForceField +from mlip.simulation import SimulationState +from mlip.simulation.enums import MDIntegrator + +from mlipaudit.benchmark import DEFAULT_CHARGE, DEFAULT_SPIN +from mlipaudit.run_mode import RunMode +from mlipaudit.scoring import compute_metric_score +from mlipaudit.utils.simulation import run_simulation + +logger = logging.getLogger("mlipaudit") + +ANGSTROM3_TO_CM3 = 1e-24 + +DENSITY_RELATIVE_DEVIATION_THRESHOLD = 0.02 +DENSITY_SCORE_ALPHA = 0.1 + +#: Reusable output IDs shared by the RDF and density benchmarks of each system group. +WATER_REUSABLE_OUTPUT_ID = ("water_molecular_liquid",) +SOLVENT_REUSABLE_OUTPUT_ID = ("solvent_molecular_liquid",) + +# -------------------------------------------------------------------------------------- +# Water +# -------------------------------------------------------------------------------------- + +#: Input-data directory name shared by the water RDF and water density benchmarks. +WATER_DATA_NAME = "water_radial_distribution" +WATERBOX_N500 = "water_box_n500_eq.pdb" +WATER_MOLECULE_INDICES_PATH = "water_box_n500_molecule_indices.npy" + +WATER_MOLECULE_WEIGHT = 18.01528 # g/mol +WATER_ATOMS_PER_MOLECULE = 3 +WATER_REFERENCE_DENSITY = 0.997773 # g/cm3 + +WATER_SIMULATION_CONFIG = { + "num_steps": 500_000, + "snapshot_interval": 500, + "num_episodes": 1000, + "temperature_kelvin": 295.15, + "pressure_bar": 1.01325, +} +WATER_SIMULATION_CONFIG_FAST = { + "num_steps": 250_000, + "snapshot_interval": 250, + "num_episodes": 1000, + "temperature_kelvin": 295.15, + "pressure_bar": 1.01325, +} +WATER_SIMULATION_CONFIG_DEV = { + "num_steps": 5, + "snapshot_interval": 1, + "num_episodes": 1, + "temperature_kelvin": 295.15, + "pressure_bar": 1.01325, +} + +# -------------------------------------------------------------------------------------- +# Solvents +# -------------------------------------------------------------------------------------- + +#: Input-data directory name shared by the solvent RDF and solvent density benchmarks. +SOLVENT_DATA_NAME = "solvent_radial_distribution" +NUM_DEV_SYSTEMS = 1 + +#: Per-solvent molecular weight (g/mol) and number of atoms per molecule. +SOLVENT_MOLECULE_CONFIG = { + "CCl4": {"molecule_weight": 153.823, "atoms_per_molecule": 5}, + "methanol": {"molecule_weight": 32.042, "atoms_per_molecule": 6}, + "acetonitrile": {"molecule_weight": 41.053, "atoms_per_molecule": 6}, +} +SOLVENT_REFERENCE_DENSITIES = { # g/cm3 + "CCl4": 1.594, + "acetonitrile": 0.787, + "methanol": 0.792, +} + +SOLVENT_SIMULATION_CONFIG = { + "num_steps": 500_000, + "snapshot_interval": 500, + "num_episodes": 1000, + "temperature_kelvin": 293.15, + "pressure_bar": 1.01325, +} +SOLVENT_SIMULATION_CONFIG_FAST = { + "num_steps": 250_000, + "snapshot_interval": 250, + "num_episodes": 1000, + "temperature_kelvin": 293.15, + "pressure_bar": 1.01325, +} +SOLVENT_SIMULATION_CONFIG_DEV = { + "num_steps": 5, + "snapshot_interval": 1, + "num_episodes": 1, + "temperature_kelvin": 293.15, + "pressure_bar": 1.01325, +} + + +def compute_densities( + simulation_state: SimulationState, molecule_weight: float, atoms_per_molecule: int +) -> np.ndarray: + """Compute the density (g/cm3) for each frame of the simulation. + + Args: + simulation_state: The final simulation state. + molecule_weight: Molecular weight of each solvent molecule. + atoms_per_molecule: Number of atoms in each solvent molecule. + + Returns: + The computed density (g/cm3) for each frame of the simulation. + """ + n_molecules = simulation_state.positions.shape[1] / atoms_per_molecule + volumes = np.abs(np.linalg.det(simulation_state.cell)) + + density_numerator = molecule_weight * n_molecules + density_denominator = units.mol * volumes * ANGSTROM3_TO_CM3 + + densities = density_numerator / density_denominator + return densities + + +def average_equilibrated_density(densities: np.ndarray) -> float: + """Average the density over the final four fifths of the frames. + + The first fifth of the trajectory is treated as equilibration and discarded. + + Args: + densities: Per-frame densities (g/cm3). + + Returns: + The average equilibrated density (g/cm3). + """ + n_frames_equilibration = len(densities) // 5 + return float(np.mean(densities[n_frames_equilibration:])) + + +def score_density( + average_density: float, reference_density: float +) -> tuple[float, float]: + """Score an equilibrium density against its experimental reference. + + The score decays with the relative deviation from the reference density, using + the shared `DENSITY_RELATIVE_DEVIATION_THRESHOLD` and `DENSITY_SCORE_ALPHA`. + + Args: + average_density: The equilibrated average density (g/cm3). + reference_density: The experimental reference density (g/cm3). + + Returns: + A tuple of the absolute density deviation (g/cm3) and the score in [0, 1]. + """ + density_deviation = abs(average_density - reference_density) + relative_deviation = density_deviation / reference_density + score = compute_metric_score( + np.array([relative_deviation]), + DENSITY_RELATIVE_DEVIATION_THRESHOLD, + DENSITY_SCORE_ALPHA, + ).item() + return density_deviation, score + + +def _get_water_md_kwargs(run_mode: RunMode) -> dict[str, Any]: + """Return the water simulation configuration for the given run mode.""" + if run_mode == RunMode.DEV: + return WATER_SIMULATION_CONFIG_DEV + if run_mode == RunMode.FAST: + return WATER_SIMULATION_CONFIG_FAST + return WATER_SIMULATION_CONFIG + + +def _load_water_system(data_dir: str | os.PathLike) -> Atoms: + """Load the water box structure from the given data directory. + + Returns: + The water box as an `ase.Atoms` object with charge and spin set. + """ + atoms = ase_read(Path(data_dir) / WATERBOX_N500) + atoms.info["charge"] = DEFAULT_CHARGE + atoms.info["spin"] = DEFAULT_SPIN + return atoms + + +def _load_water_molecule_indices(data_dir: str | os.PathLike) -> np.ndarray: + """Load the per-molecule atom indices used by the NPT barostat. + + Returns: + The per-molecule atom indices. + """ + return np.load(Path(data_dir) / WATER_MOLECULE_INDICES_PATH) + + +def run_water_npt_simulation( + force_field: ForceField | ASECalculator, + data_dir: str | os.PathLike, + run_mode: RunMode, +) -> SimulationState | None: + """Run the water box NPT simulation. + + The MD simulation is performed using the JAX MD engine and starts from the + reference structure. The NPT integrator uses Langevin dynamics with a Monte Carlo + barostat. + + Args: + force_field: The force field to run the simulation with. + data_dir: The directory holding the water input data. + run_mode: The run mode controlling the simulation length. + + Returns: + The final simulation state, or None if the simulation failed. + """ + logger.info("Running water box NPT simulation.") + return run_simulation( + atoms=_load_water_system(data_dir), + force_field=force_field, + md_integrator=MDIntegrator.NPT_MC_LANGEVIN, + molecule_indices=_load_water_molecule_indices(data_dir), + **_get_water_md_kwargs(run_mode), + ) + + +def _get_solvent_md_kwargs(run_mode: RunMode) -> dict[str, Any]: + """Return the solvent simulation configuration for the given run mode.""" + if run_mode == RunMode.DEV: + return SOLVENT_SIMULATION_CONFIG_DEV + if run_mode == RunMode.FAST: + return SOLVENT_SIMULATION_CONFIG_FAST + return SOLVENT_SIMULATION_CONFIG + + +def get_solvent_system_names(run_mode: RunMode) -> list[str]: + """Return the solvent system names to run for the given run mode. + + Returns: + The solvent system names. + """ + system_names = list(SOLVENT_MOLECULE_CONFIG.keys()) + if run_mode == RunMode.STANDARD: + return system_names + # reduced number of cases for DEV and FAST run mode + return system_names[:NUM_DEV_SYSTEMS] + + +def get_solvent_pdb_file_name(system_name: str) -> str: + """Return the PDB file name for a solvent system.""" + return f"{system_name}_eq.pdb" + + +def get_solvent_molecule_indices_file_name(system_name: str) -> str: + """Return the molecule-indices file name for a solvent system.""" + return f"{system_name}_molecule_indices.npy" + + +def _load_solvent_system(data_dir: str | os.PathLike, system_name: str) -> Atoms: + """Load a solvent structure from the given data directory. + + Returns: + The solvent structure as an `ase.Atoms` object with charge and spin set. + """ + atoms = ase_read(Path(data_dir) / get_solvent_pdb_file_name(system_name)) + atoms.info["charge"] = DEFAULT_CHARGE + atoms.info["spin"] = DEFAULT_SPIN + return atoms + + +def _load_solvent_molecule_indices( + data_dir: str | os.PathLike, system_name: str +) -> np.ndarray: + """Load the per-molecule atom indices for a solvent system. + + Returns: + The per-molecule atom indices for the given solvent system. + """ + return np.load(Path(data_dir) / get_solvent_molecule_indices_file_name(system_name)) + + +def run_solvent_npt_simulations( + force_field: ForceField | ASECalculator, + data_dir: str | os.PathLike, + run_mode: RunMode, +) -> tuple[list[str], list[SimulationState | None]]: + """Run one NPT simulation per solvent system. + + Args: + force_field: The force field to run the simulations with. + data_dir: The directory holding the solvent input data. + run_mode: The run mode controlling the simulation length and system count. + + Returns: + A tuple of (system names, simulation states) in matching order. A simulation + state is None if the corresponding simulation failed. + """ + system_names = get_solvent_system_names(run_mode) + md_kwargs = _get_solvent_md_kwargs(run_mode) + + simulation_states: list[SimulationState | None] = [] + for system_name in system_names: + logger.info("Running NPT simulation for %s.", system_name) + simulation_state = run_simulation( + atoms=_load_solvent_system(data_dir, system_name), + force_field=force_field, + md_integrator=MDIntegrator.NPT_MC_LANGEVIN, + molecule_indices=_load_solvent_molecule_indices(data_dir, system_name), + **md_kwargs, + ) + simulation_states.append(simulation_state) + + return system_names, simulation_states diff --git a/src/mlipaudit/utils/trajectory_helpers.py b/src/mlipaudit/utils/trajectory_helpers.py index c43a9019..a6be14e1 100644 --- a/src/mlipaudit/utils/trajectory_helpers.py +++ b/src/mlipaudit/utils/trajectory_helpers.py @@ -19,6 +19,7 @@ import mdtraj as md import numpy as np from ase import Atoms, units +from ase.cell import Cell from ase.io import write as ase_write from mlip.simulation import SimulationState @@ -35,11 +36,16 @@ def create_mdtraj_trajectory_from_simulation_state( to save the trajectory as an xyz file. All input values should be in Angstrom units. Note that the resulting trajectory uses nm as units. + Note that if `simulation_state` carries `cell` information (e.g. in the case of an + NPT simulation), then the `cell_lengths` and `cell_angles` inputs are ignored. + Args: simulation_state: The state containing the trajectory. topology_path: The path towards the topology file. Typically, a pdb file. - cell_lengths: The lengths of the unit cell in Angstrom. Default is `None`. - cell_angles: The angles of the unit cell in degrees. Default is `(90, 90, 90)`. + cell_lengths: The lengths of the unit cell in Angstrom. Ignored if + `simulation_state` contains `cell` information. Default is `None`. + cell_angles: The angles of the unit cell in degrees. Ignored if + `simulation_state` contains `cell` information. Default is `(90, 90, 90)`. Returns: The converted trajectory. @@ -49,7 +55,12 @@ def create_mdtraj_trajectory_from_simulation_state( _tmp_path = Path(tmpdir) ase_write(_tmp_path / "traj.xyz", ase_traj) traj = md.load(_tmp_path / "traj.xyz", top=topology_path) - if cell_lengths is not None: + if simulation_state.cell is not None: + # cell shape: (n_frames, 3, 3) — extract cellpar per frame + cellpars = np.array([Cell(c).cellpar() for c in simulation_state.cell]) + traj.unitcell_lengths = cellpars[:, :3] * (units.Angstrom / units.nm) + traj.unitcell_angles = cellpars[:, 3:] + elif cell_lengths is not None: # converting length units to nm for mdtraj cell_lengths_converted = [ cell_length * (units.Angstrom / units.nm) @@ -76,10 +87,14 @@ def create_ase_trajectory_from_simulation_state( An ASE trajectory as a list of `ase.Atoms`. """ num_frames = simulation_state.positions.shape[0] + cell = simulation_state.cell + if cell is None: + cell = [None] * num_frames trajectory = [ Atoms( numbers=simulation_state.atomic_numbers, positions=simulation_state.positions[frame], + cell=cell[frame], ) for frame in range(num_frames) ] diff --git a/tests/conftest.py b/tests/conftest.py index c739978f..50a61bd0 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -128,6 +128,7 @@ def _factory(simulation_state: SimulationState | None = None): positions=np.random.rand(10, 2, 3), forces=np.random.rand(10, 2, 3), temperature=np.random.rand(10), + cell=np.abs(np.random.randn(10, 1, 1)) * np.eye(3), ) mock_engine.configure_mock(state=state) return mock_engine diff --git a/tests/data/nve_energy_conservation/peptide_solv.xyz b/tests/data/nve_energy_conservation/peptide_solv.xyz new file mode 100644 index 00000000..d5826fc2 --- /dev/null +++ b/tests/data/nve_energy_conservation/peptide_solv.xyz @@ -0,0 +1,1351 @@ +1349 +OXYTOCIN in water +N 12.56000 17.97000 15.00000 +H 13.44000 18.39000 15.37000 +H 11.98000 18.78000 14.66000 +H 12.01000 17.48000 15.75000 +C 12.89000 17.03000 13.89000 +H 13.16000 17.65000 13.04000 +C 14.11000 16.17000 14.31000 +H 13.81000 15.39000 15.04000 +H 14.84000 16.82000 14.83000 +S 15.04000 15.43000 12.94000 +C 11.65000 16.24000 13.48000 +O 10.59000 16.84000 13.37000 +N 11.71000 14.90000 13.24000 +H 12.56000 14.38000 13.24000 +C 10.49000 14.16000 12.93000 +H 9.67000 14.62000 13.46000 +C 10.23000 14.20000 11.39000 +H 10.81000 13.45000 10.81000 +H 10.54000 15.20000 11.02000 +C 8.77000 14.10000 11.03000 +C 8.33000 13.15000 10.10000 +H 9.03000 12.45000 9.67000 +C 6.98000 13.10000 9.71000 +H 6.65000 12.35000 9.02000 +C 6.08000 14.05000 10.21000 +O 4.73000 13.99000 9.83000 +H 4.57000 14.66000 9.14000 +C 7.85000 15.05000 11.52000 +H 8.19000 15.82000 12.20000 +C 6.52000 15.03000 11.10000 +H 5.82000 15.76000 11.49000 +C 10.56000 12.73000 13.50000 +O 10.17000 12.53000 14.65000 +N 11.05000 11.72000 12.75000 +H 11.39000 11.92000 11.83000 +C 11.09000 10.32000 13.19000 +H 10.46000 10.21000 14.06000 +C 10.58000 9.36000 12.11000 +H 11.26000 9.37000 11.24000 +C 10.47000 7.91000 12.65000 +H 10.08000 7.24000 11.86000 +H 11.45000 7.50000 12.98000 +H 9.77000 7.86000 13.50000 +C 9.20000 9.81000 11.55000 +H 8.86000 9.03000 10.84000 +H 9.35000 10.74000 10.95000 +C 8.10000 10.05000 12.59000 +H 7.18000 10.41000 12.09000 +H 7.87000 9.10000 13.12000 +H 8.40000 10.82000 13.33000 +C 12.50000 9.97000 13.67000 +O 12.90000 10.34000 14.77000 +N 13.33000 9.29000 12.84000 +H 12.97000 8.88000 11.99000 +C 14.76000 9.18000 13.03000 +H 15.04000 9.54000 14.01000 +C 15.31000 7.74000 12.85000 +H 16.42000 7.77000 12.92000 +H 15.05000 7.37000 11.84000 +C 14.80000 6.73000 13.92000 +H 13.73000 6.51000 13.77000 +H 14.93000 7.17000 14.93000 +C 15.59000 5.42000 13.90000 +O 16.07000 4.94000 14.93000 +N 15.74000 4.81000 12.71000 +H 15.34000 5.21000 11.88000 +H 16.30000 3.98000 12.67000 +C 15.46000 10.08000 12.02000 +O 16.68000 10.06000 11.87000 +N 14.66000 10.91000 11.31000 +H 13.68000 10.92000 11.50000 +C 15.12000 11.87000 10.35000 +H 16.11000 12.16000 10.65000 +C 15.08000 11.26000 8.92000 +H 14.05000 11.24000 8.52000 +H 15.44000 10.21000 9.00000 +C 15.99000 11.95000 7.91000 +O 15.63000 12.09000 6.74000 +N 17.19000 12.39000 8.35000 +H 17.44000 12.33000 9.31000 +H 17.87000 12.69000 7.67000 +C 14.21000 13.09000 10.50000 +O 13.19000 13.03000 11.17000 +N 14.59000 14.25000 9.92000 +H 15.43000 14.28000 9.38000 +C 13.85000 15.49000 10.03000 +H 13.26000 15.47000 10.93000 +C 14.84000 16.70000 10.09000 +H 14.35000 17.66000 9.82000 +H 15.61000 16.53000 9.30000 +S 15.67000 16.93000 11.71000 +C 12.83000 15.62000 8.90000 +O 12.90000 14.84000 7.95000 +N 11.84000 16.52000 8.94000 +C 11.65000 17.55000 9.98000 +H 11.82000 17.13000 10.99000 +H 12.35000 18.40000 9.79000 +C 10.84000 16.64000 7.90000 +H 10.66000 15.71000 7.38000 +C 9.63000 17.10000 8.74000 +H 9.21000 16.20000 9.23000 +H 8.81000 17.56000 8.16000 +C 10.21000 18.02000 9.82000 +H 9.63000 17.95000 10.77000 +H 10.21000 19.08000 9.48000 +C 11.32000 17.69000 6.90000 +O 12.48000 17.65000 6.49000 +N 10.47000 18.65000 6.51000 +H 9.52000 18.63000 6.81000 +C 10.86000 19.82000 5.76000 +H 11.38000 19.47000 4.88000 +C 9.60000 20.61000 5.29000 +H 8.88000 19.88000 4.88000 +H 9.92000 21.26000 4.45000 +C 8.86000 21.52000 6.31000 +H 9.55000 22.34000 6.60000 +C 7.64000 22.16000 5.64000 +H 7.15000 22.89000 6.32000 +H 7.93000 22.70000 4.71000 +H 6.89000 21.39000 5.37000 +C 8.38000 20.81000 7.58000 +H 7.79000 21.50000 8.22000 +H 7.72000 19.95000 7.32000 +H 9.24000 20.44000 8.18000 +C 11.86000 20.73000 6.52000 +O 11.74000 20.95000 7.73000 +N 12.87000 21.27000 5.81000 +H 12.98000 21.00000 4.85000 +C 13.91000 22.14000 6.34000 +H 14.04000 22.94000 5.61000 +H 13.64000 22.52000 7.31000 +C 15.28000 21.44000 6.47000 +O 15.76000 20.89000 5.44000 +O 15.92000 21.51000 7.56000 +O 2.48000 5.65000 0.70000 +H 2.21000 6.37000 1.27000 +H 1.70000 5.10000 0.62000 +O 1.92000 2.81000 9.83000 +H 2.43000 2.22000 10.38000 +H 1.06000 2.84000 10.25000 +O 0.18000 3.90000 5.64000 +H -0.57000 3.73000 6.20000 +H 0.14000 3.23000 4.97000 +O 4.23000 12.96000 12.43000 +H 4.40000 13.08000 11.49000 +H 5.06000 12.63000 12.78000 +O 15.21000 15.15000 6.63000 +H 14.46000 14.87000 7.16000 +H 14.85000 15.29000 5.76000 +O 11.51000 6.91000 6.73000 +H 11.94000 7.76000 6.67000 +H 10.91000 6.99000 7.47000 +O 17.63000 5.94000 2.05000 +H 17.05000 5.93000 1.29000 +H 17.36000 5.17000 2.56000 +O 8.92000 7.59000 18.40000 +H 9.57000 8.07000 18.91000 +H 8.74000 8.15000 17.65000 +O 6.77000 9.69000 6.13000 +H 7.50000 9.61000 6.75000 +H 6.17000 10.32000 6.54000 +O 7.19000 11.94000 17.90000 +H 7.19000 12.83000 17.56000 +H 6.27000 11.69000 17.93000 +O 4.68000 3.72000 14.66000 +H 5.28000 2.99000 14.82000 +H 3.87000 3.47000 15.10000 +O 15.65000 4.93000 7.39000 +H 14.77000 4.68000 7.12000 +H 16.00000 5.41000 6.64000 +O 1.99000 17.08000 4.10000 +H 2.10000 17.82000 4.69000 +H 2.85000 16.96000 3.70000 +O 11.54000 13.77000 16.76000 +H 12.34000 13.32000 16.48000 +H 10.83000 13.18000 16.52000 +O 2.39000 14.81000 5.88000 +H 1.79000 15.43000 5.47000 +H 1.82000 14.17000 6.31000 +O 3.00000 10.57000 9.04000 +H 2.95000 9.66000 9.33000 +H 2.24000 10.99000 9.44000 +O 6.19000 17.99000 14.46000 +H 5.30000 17.86000 14.76000 +H 6.29000 18.95000 14.42000 +O 5.60000 10.23000 0.89000 +H 6.18000 10.81000 0.40000 +H 5.93000 10.24000 1.78000 +O 16.36000 1.07000 14.69000 +H 16.77000 1.52000 13.96000 +H 16.21000 1.75000 15.35000 +O 1.31000 6.46000 5.24000 +H 0.91000 5.61000 5.42000 +H 1.04000 7.02000 5.97000 +O 18.46000 17.33000 3.81000 +H 18.70000 17.07000 4.70000 +H 18.85000 18.19000 3.70000 +O 0.06000 16.39000 2.22000 +H -0.03000 15.45000 2.39000 +H 0.72000 16.68000 2.84000 +O 16.96000 9.01000 6.22000 +H 17.51000 8.57000 5.56000 +H 16.66000 9.81000 5.79000 +O 16.64000 11.12000 4.46000 +H 17.45000 11.48000 4.11000 +H 16.37000 11.75000 5.14000 +O 1.49000 7.63000 15.46000 +H 2.43000 7.56000 15.62000 +H 1.24000 8.48000 15.84000 +O 6.00000 13.83000 6.77000 +H 5.66000 12.95000 6.94000 +H 5.90000 13.94000 5.82000 +O 8.24000 0.14000 4.01000 +H 8.63000 0.81000 4.56000 +H 7.37000 -0.00000 4.38000 +O 2.06000 9.50000 12.40000 +H 2.87000 9.02000 12.26000 +H 1.43000 8.84000 12.68000 +O 14.86000 10.22000 2.55000 +H 14.34000 9.58000 3.04000 +H 15.48000 10.57000 3.19000 +O 3.86000 2.60000 18.91000 +H 4.20000 3.47000 19.12000 +H 2.92000 2.74000 18.80000 +O 17.39000 16.76000 6.61000 +H 17.04000 17.59000 6.28000 +H 16.65000 16.15000 6.56000 +O 5.88000 7.33000 2.96000 +H 6.18000 8.22000 3.13000 +H 5.20000 7.18000 3.62000 +O 12.55000 3.65000 9.37000 +H 11.68000 3.24000 9.38000 +H 13.05000 3.15000 10.02000 +O 15.81000 16.92000 3.17000 +H 16.73000 16.79000 3.39000 +H 15.70000 16.51000 2.31000 +O 7.59000 6.75000 14.48000 +H 7.37000 6.30000 15.30000 +H 7.57000 6.06000 13.81000 +O 13.48000 4.74000 16.32000 +H 13.56000 5.15000 17.18000 +H 14.37000 4.45000 16.10000 +O 9.13000 8.67000 15.85000 +H 9.97000 8.21000 15.92000 +H 8.61000 8.12000 15.26000 +O 10.17000 4.25000 12.18000 +H 9.27000 4.41000 12.46000 +H 10.08000 3.94000 11.27000 +O 10.60000 6.87000 4.17000 +H 10.85000 6.86000 5.09000 +H 9.71000 6.52000 4.16000 +O 1.16000 8.04000 7.60000 +H 2.02000 7.94000 7.99000 +H 0.62000 8.41000 8.30000 +O 1.08000 18.58000 16.06000 +H 1.24000 18.16000 16.91000 +H 0.40000 18.03000 15.66000 +O 8.75000 3.45000 2.61000 +H 8.55000 4.07000 1.91000 +H 8.87000 2.61000 2.17000 +O 16.67000 5.90000 18.70000 +H 16.63000 6.69000 18.16000 +H 17.13000 5.26000 18.16000 +O 13.42000 11.41000 5.25000 +H 14.18000 11.82000 5.68000 +H 13.02000 12.13000 4.76000 +O 6.02000 2.19000 8.98000 +H 5.96000 2.31000 9.93000 +H 5.91000 3.06000 8.61000 +O 9.64000 14.40000 4.60000 +H 9.50000 15.14000 4.00000 +H 9.26000 14.69000 5.43000 +O 3.25000 18.19000 8.53000 +H 3.76000 17.40000 8.35000 +H 3.91000 18.87000 8.69000 +O 3.38000 9.44000 2.79000 +H 3.80000 9.56000 1.94000 +H 2.87000 8.64000 2.70000 +O 14.86000 8.03000 7.74000 +H 15.06000 7.11000 7.87000 +H 15.59000 8.37000 7.23000 +O 4.40000 11.80000 17.68000 +H 4.31000 12.19000 16.81000 +H 3.73000 12.23000 18.21000 +O 10.89000 17.89000 1.94000 +H 10.30000 17.38000 2.50000 +H 11.48000 17.24000 1.56000 +O 2.24000 3.13000 15.74000 +H 1.57000 3.56000 16.26000 +H 1.82000 2.31000 15.45000 +O 16.19000 13.64000 1.26000 +H 15.85000 14.51000 1.03000 +H 15.51000 13.04000 0.95000 +O 4.59000 17.24000 3.05000 +H 4.99000 17.76000 3.75000 +H 5.30000 17.11000 2.41000 +O 14.11000 0.59000 4.33000 +H 13.63000 -0.05000 3.81000 +H 15.01000 0.52000 4.03000 +O 2.42000 17.87000 12.39000 +H 2.68000 16.97000 12.58000 +H 1.83000 17.80000 11.64000 +O 4.04000 6.57000 4.84000 +H 4.23000 5.64000 4.96000 +H 3.09000 6.64000 4.96000 +O 15.32000 2.19000 17.08000 +H 15.34000 2.22000 18.04000 +H 14.77000 1.44000 16.88000 +O 6.44000 1.35000 0.63000 +H 7.31000 1.14000 0.96000 +H 6.56000 2.12000 0.09000 +O 7.62000 2.99000 17.38000 +H 8.41000 2.46000 17.47000 +H 7.26000 3.02000 18.27000 +O 9.33000 4.85000 9.10000 +H 9.06000 4.87000 8.18000 +H 9.49000 3.93000 9.29000 +O 5.55000 0.04000 4.68000 +H 4.80000 0.07000 5.28000 +H 5.52000 0.88000 4.22000 +O 14.19000 11.85000 0.45000 +H 14.43000 11.22000 1.13000 +H 13.37000 12.25000 0.77000 +O 2.84000 0.19000 2.71000 +H 3.12000 1.01000 2.29000 +H 3.31000 0.17000 3.54000 +O 9.68000 2.39000 5.02000 +H 9.32000 2.77000 4.22000 +H 10.63000 2.48000 4.92000 +O 4.88000 11.34000 7.22000 +H 4.24000 11.20000 7.92000 +H 4.36000 11.32000 6.42000 +O 10.68000 5.55000 0.37000 +H 9.80000 5.74000 0.70000 +H 11.19000 5.32000 1.15000 +O 1.32000 5.47000 13.77000 +H 2.26000 5.46000 13.60000 +H 1.20000 6.10000 14.48000 +O 5.81000 2.44000 11.79000 +H 6.22000 1.75000 12.32000 +H 4.87000 2.29000 11.88000 +O 8.74000 4.63000 6.48000 +H 8.36000 5.13000 5.75000 +H 8.98000 3.79000 6.09000 +O 9.44000 0.58000 7.42000 +H 9.57000 1.09000 6.62000 +H 9.85000 -0.26000 7.25000 +O 14.53000 5.56000 9.93000 +H 13.80000 4.96000 9.77000 +H 15.18000 5.34000 9.26000 +O 18.22000 7.81000 4.02000 +H 18.93000 7.34000 4.46000 +H 18.03000 7.30000 3.24000 +O 4.85000 14.26000 1.31000 +H 4.31000 14.04000 2.07000 +H 4.38000 13.88000 0.57000 +O 13.89000 5.40000 0.78000 +H 13.23000 5.24000 1.45000 +H 14.50000 4.67000 0.87000 +O 5.41000 2.32000 3.16000 +H 5.72000 1.90000 2.36000 +H 5.21000 3.22000 2.89000 +O 17.93000 12.25000 15.72000 +H 18.76000 11.90000 15.40000 +H 18.15000 13.11000 16.07000 +O 16.62000 16.06000 16.64000 +H 16.80000 16.76000 16.02000 +H 17.41000 15.52000 16.64000 +O 8.78000 0.67000 13.98000 +H 8.87000 0.50000 13.04000 +H 9.57000 1.16000 14.21000 +O 9.78000 11.13000 17.33000 +H 8.93000 11.44000 17.64000 +H 9.58000 10.64000 16.54000 +O 6.84000 10.12000 3.40000 +H 6.75000 10.03000 4.35000 +H 7.72000 9.78000 3.21000 +O 4.53000 8.18000 12.23000 +H 4.94000 8.51000 13.04000 +H 4.35000 7.26000 12.42000 +O 12.64000 3.84000 13.31000 +H 12.72000 4.34000 14.12000 +H 11.79000 4.09000 12.96000 +O 0.43000 15.29000 13.57000 +H 0.01000 15.98000 14.08000 +H 1.36000 15.51000 13.58000 +O 3.62000 11.26000 4.82000 +H 3.53000 12.08000 4.34000 +H 3.71000 10.59000 4.13000 +O 5.70000 4.93000 8.51000 +H 5.68000 5.52000 7.76000 +H 6.30000 5.34000 9.13000 +O 12.26000 13.64000 4.04000 +H 12.75000 14.44000 4.22000 +H 11.37000 13.83000 4.35000 +O 15.66000 6.44000 4.94000 +H 14.86000 6.81000 4.57000 +H 16.35000 7.06000 4.69000 +O 3.27000 15.40000 13.24000 +H 3.45000 14.51000 12.92000 +H 4.12000 15.71000 13.57000 +O 4.17000 7.27000 16.25000 +H 4.68000 7.81000 15.64000 +H 4.79000 6.59000 16.54000 +O 16.15000 8.23000 17.26000 +H 15.23000 8.51000 17.28000 +H 16.49000 8.58000 16.45000 +O 9.76000 1.23000 18.03000 +H 10.45000 1.80000 17.68000 +H 9.77000 0.46000 17.47000 +O 5.31000 0.58000 17.63000 +H 5.53000 0.88000 16.75000 +H 4.75000 1.28000 17.99000 +O 6.14000 8.94000 10.01000 +H 5.59000 9.57000 9.54000 +H 5.62000 8.69000 10.78000 +O 13.01000 7.88000 10.04000 +H 13.38000 8.31000 9.27000 +H 13.53000 7.08000 10.15000 +O 12.00000 4.95000 2.73000 +H 12.10000 4.20000 3.31000 +H 11.58000 5.61000 3.27000 +O 3.16000 1.70000 12.07000 +H 2.43000 2.23000 12.41000 +H 2.94000 0.80000 12.31000 +O 0.44000 12.93000 12.21000 +H 0.93000 12.42000 12.85000 +H 0.46000 13.83000 12.55000 +O 7.21000 6.35000 10.32000 +H 8.05000 6.21000 9.90000 +H 7.01000 7.27000 10.17000 +O 17.97000 9.99000 18.47000 +H 17.30000 9.33000 18.36000 +H 18.00000 10.14000 19.42000 +O 3.13000 0.53000 5.92000 +H 2.96000 1.37000 6.34000 +H 2.57000 -0.09000 6.39000 +O 16.43000 4.04000 3.77000 +H 16.80000 3.46000 4.44000 +H 16.08000 4.78000 4.27000 +O 10.30000 7.41000 9.17000 +H 11.13000 7.60000 9.61000 +H 10.14000 6.48000 9.33000 +O 10.65000 16.52000 16.52000 +H 9.70000 16.64000 16.53000 +H 10.76000 15.57000 16.52000 +O 18.98000 14.75000 16.06000 +H 19.21000 15.03000 15.17000 +H 19.76000 14.95000 16.58000 +O 3.41000 9.26000 18.12000 +H 3.94000 10.02000 17.87000 +H 3.75000 8.55000 17.58000 +O 15.38000 3.21000 1.38000 +H 14.80000 2.46000 1.47000 +H 15.73000 3.34000 2.26000 +O 13.27000 8.05000 0.81000 +H 13.45000 7.12000 0.66000 +H 13.79000 8.51000 0.15000 +O 3.48000 7.71000 8.99000 +H 4.24000 7.64000 8.41000 +H 3.55000 6.94000 9.56000 +O 3.54000 5.00000 10.14000 +H 2.99000 4.24000 9.95000 +H 4.29000 4.90000 9.56000 +O 11.23000 3.33000 16.97000 +H 10.77000 3.94000 17.54000 +H 12.06000 3.76000 16.78000 +O 11.11000 1.87000 14.63000 +H 11.14000 2.33000 15.47000 +H 11.77000 2.30000 14.09000 +O 0.59000 13.37000 2.59000 +H -0.35000 13.49000 2.54000 +H 0.71000 12.43000 2.73000 +O 0.92000 18.00000 10.08000 +H 0.42000 17.28000 9.68000 +H 1.67000 18.11000 9.50000 +O 1.23000 6.18000 11.07000 +H 2.10000 5.84000 10.86000 +H 1.10000 5.96000 12.00000 +O 1.74000 5.50000 17.35000 +H 2.64000 5.44000 17.03000 +H 1.40000 6.30000 16.94000 +O 13.64000 9.57000 17.28000 +H 13.83000 10.40000 17.72000 +H 13.38000 9.83000 16.39000 +O 8.06000 5.77000 4.04000 +H 8.16000 4.97000 3.52000 +H 7.39000 6.27000 3.59000 +O 2.90000 15.44000 17.11000 +H 2.39000 16.11000 17.57000 +H 2.76000 14.64000 17.63000 +O 7.41000 4.71000 12.51000 +H 6.83000 3.96000 12.37000 +H 7.25000 5.28000 11.75000 +O 4.74000 4.76000 2.02000 +H 5.27000 5.50000 2.33000 +H 4.01000 5.17000 1.55000 +O 1.86000 11.55000 14.25000 +H 1.58000 11.03000 15.00000 +H 2.05000 10.91000 13.57000 +O 13.49000 7.82000 3.58000 +H 12.58000 7.78000 3.85000 +H 13.46000 7.87000 2.62000 +O 0.36000 11.71000 9.77000 +H 0.48000 12.18000 10.60000 +H -0.59000 11.70000 9.63000 +O 7.54000 17.13000 16.70000 +H 7.02000 17.70000 17.27000 +H 7.23000 17.35000 15.82000 +O 8.99000 0.91000 1.50000 +H 9.77000 0.49000 1.15000 +H 8.83000 0.47000 2.33000 +O 17.66000 2.18000 5.43000 +H 18.31000 2.18000 4.72000 +H 17.22000 1.34000 5.36000 +O 13.59000 16.01000 4.56000 +H 14.26000 16.48000 4.06000 +H 13.23000 16.67000 5.15000 +O 1.47000 17.36000 18.48000 +H 0.87000 16.87000 19.04000 +H 1.98000 17.90000 19.09000 +O 12.63000 9.38000 6.83000 +H 13.48000 9.02000 7.07000 +H 12.83000 10.07000 6.19000 +O 6.26000 12.50000 14.40000 +H 6.90000 12.94000 14.96000 +H 5.41000 12.77000 14.75000 +O 6.72000 16.25000 1.39000 +H 6.59000 16.73000 0.58000 +H 6.14000 15.49000 1.32000 +O 17.37000 17.96000 14.46000 +H 17.45000 18.06000 13.51000 +H 16.66000 18.55000 14.71000 +O 18.55000 1.29000 9.24000 +H 18.27000 0.57000 9.81000 +H 17.76000 1.81000 9.10000 +O 2.43000 2.97000 7.09000 +H 1.65000 3.38000 6.72000 +H 2.25000 2.89000 8.02000 +O 12.33000 15.84000 0.66000 +H 12.20000 14.95000 0.97000 +H 12.11000 15.80000 -0.27000 +O 9.23000 9.01000 2.89000 +H 9.75000 9.27000 2.13000 +H 9.76000 8.36000 3.34000 +O 15.05000 16.16000 0.64000 +H 14.09000 16.06000 0.64000 +H 15.27000 16.25000 -0.29000 +O 3.78000 13.24000 15.43000 +H 3.32000 14.05000 15.63000 +H 3.19000 12.76000 14.85000 +O 16.29000 12.71000 13.56000 +H 17.03000 12.55000 14.14000 +H 15.53000 12.73000 14.14000 +O 10.77000 10.88000 8.38000 +H 9.92000 10.48000 8.17000 +H 11.38000 10.46000 7.78000 +O 10.12000 2.23000 9.63000 +H 9.90000 1.74000 8.84000 +H 10.00000 1.61000 10.34000 +O 6.04000 14.95000 4.24000 +H 6.46000 14.35000 3.63000 +H 5.36000 15.38000 3.72000 +O 3.17000 13.69000 3.45000 +H 2.30000 13.67000 3.07000 +H 3.06000 14.15000 4.29000 +O 1.21000 10.07000 16.60000 +H 0.71000 10.83000 16.90000 +H 1.82000 9.89000 17.31000 +O 6.52000 1.69000 15.24000 +H 7.28000 1.37000 14.76000 +H 6.90000 2.23000 15.94000 +O 0.55000 3.58000 0.60000 +H -0.41000 3.56000 0.67000 +H 0.72000 3.41000 -0.33000 +O 0.39000 1.56000 2.67000 +H 0.65000 2.22000 2.03000 +H 1.18000 1.06000 2.84000 +O 11.93000 13.19000 1.33000 +H 10.99000 13.23000 1.19000 +H 12.03000 13.20000 2.29000 +O 5.77000 8.80000 14.63000 +H 6.20000 9.66000 14.69000 +H 6.49000 8.18000 14.54000 +O 7.04000 5.77000 16.96000 +H 7.54000 6.19000 17.66000 +H 7.23000 4.83000 17.07000 +O 15.04000 12.67000 16.15000 +H 14.69000 12.37000 16.99000 +H 15.99000 12.52000 16.22000 +O 3.79000 17.66000 15.71000 +H 2.96000 18.08000 15.50000 +H 3.54000 16.83000 16.12000 +O 12.40000 2.89000 4.63000 +H 13.00000 2.15000 4.53000 +H 12.75000 3.39000 5.37000 +O 5.44000 7.37000 7.05000 +H 6.01000 8.09000 6.76000 +H 4.96000 7.12000 6.26000 +O 17.53000 3.86000 16.94000 +H 17.25000 4.32000 16.15000 +H 16.86000 3.20000 17.09000 +O 17.43000 9.50000 15.06000 +H 17.49000 10.37000 15.46000 +H 17.46000 9.67000 14.12000 +O 9.24000 13.82000 1.04000 +H 8.64000 13.47000 1.69000 +H 8.80000 14.61000 0.71000 +O 6.68000 18.50000 10.26000 +H 6.25000 19.00000 9.57000 +H 6.81000 17.63000 9.89000 +O 8.42000 9.26000 8.28000 +H 9.08000 8.63000 8.57000 +H 7.74000 9.22000 8.95000 +O 10.89000 9.44000 0.78000 +H 10.85000 9.54000 -0.17000 +H 11.71000 8.98000 0.93000 +O 18.81000 15.67000 8.92000 +H 18.30000 15.80000 8.12000 +H 18.25000 15.11000 9.46000 +O 2.19000 13.21000 18.63000 +H 1.53000 12.91000 18.01000 +H 1.71000 13.34000 19.45000 +O 0.99000 12.79000 7.14000 +H 0.85000 12.53000 8.05000 +H 0.92000 11.96000 6.65000 +O 6.70000 14.41000 16.74000 +H 5.76000 14.56000 16.75000 +H 7.08000 15.29000 16.77000 +O 17.82000 2.15000 12.55000 +H 18.64000 1.83000 12.92000 +H 18.07000 2.93000 12.05000 +O 4.38000 3.96000 5.36000 +H 4.73000 3.21000 4.88000 +H 3.81000 3.57000 6.02000 +O 17.62000 14.01000 10.98000 +H 17.00000 13.92000 11.71000 +H 18.47000 13.75000 11.36000 +O 3.91000 5.58000 12.86000 +H 4.31000 4.95000 13.46000 +H 3.99000 5.17000 11.99000 +O 7.85000 15.79000 6.25000 +H 7.27000 15.79000 5.49000 +H 7.46000 15.14000 6.84000 +O 14.05000 2.46000 11.32000 +H 13.86000 1.56000 11.60000 +H 13.77000 3.01000 12.05000 +O 9.34000 0.05000 11.28000 +H 8.61000 -0.10000 10.68000 +H 9.58000 -0.82000 11.60000 +O 7.67000 12.95000 3.14000 +H 7.46000 12.03000 3.30000 +H 8.39000 13.15000 3.74000 +O 13.69000 0.98000 0.82000 +H 14.17000 0.18000 1.01000 +H 12.78000 0.71000 0.75000 +O 13.00000 4.55000 6.80000 +H 12.50000 5.35000 6.68000 +H 12.73000 4.22000 7.65000 +O 16.01000 2.46000 9.24000 +H 15.34000 2.60000 9.92000 +H 15.80000 3.11000 8.57000 +O 0.90000 10.67000 3.11000 +H 1.76000 10.28000 2.95000 +H 0.74000 10.52000 4.05000 +O 8.74000 16.67000 3.26000 +H 8.05000 16.52000 2.62000 +H 8.34000 17.24000 3.92000 +O 0.06000 15.91000 20.32000 +H -0.03000 14.96000 20.35000 +H 0.04000 16.18000 21.24000 +O 5.96000 7.25000 0.18000 +H 5.97000 8.16000 -0.12000 +H 5.89000 7.31000 1.13000 +O 8.39000 3.15000 20.08000 +H 8.96000 3.74000 19.58000 +H 8.87000 2.32000 20.11000 +O 2.99000 9.93000 20.76000 +H 3.90000 10.13000 20.98000 +H 3.04000 9.58000 19.86000 +O 16.08000 14.17000 18.75000 +H 16.13000 14.85000 18.08000 +H 15.25000 13.73000 18.58000 +O 13.89000 12.04000 18.63000 +H 14.26000 11.90000 19.50000 +H 12.97000 12.22000 18.78000 +O 3.26000 0.09000 20.37000 +H 3.57000 0.97000 20.12000 +H 3.49000 0.01000 21.30000 +O 9.96000 5.05000 18.72000 +H 9.62000 5.91000 18.50000 +H 10.44000 5.18000 19.54000 +O 13.94000 5.64000 18.88000 +H 13.71000 5.53000 19.80000 +H 14.90000 5.74000 18.89000 +O 15.42000 1.97000 19.78000 +H 14.71000 1.56000 20.27000 +H 15.77000 2.63000 20.38000 +O 23.29000 13.13000 20.27000 +H 22.42000 13.04000 19.87000 +H 23.42000 12.32000 20.75000 +O 7.92000 5.36000 0.80000 +H 7.88000 4.68000 0.12000 +H 7.31000 6.03000 0.49000 +O 4.49000 5.22000 19.70000 +H 5.12000 5.88000 20.00000 +H 3.69000 5.41000 20.19000 +O 16.91000 0.14000 3.50000 +H 17.58000 0.72000 3.14000 +H 17.38000 -0.66000 3.72000 +O 11.89000 15.57000 18.88000 +H 11.81000 14.78000 18.35000 +H 11.44000 16.25000 18.38000 +O 1.14000 3.36000 18.87000 +H 0.48000 2.95000 18.30000 +H 1.31000 4.21000 18.46000 +O 11.15000 9.37000 18.90000 +H 10.73000 10.07000 18.39000 +H 11.97000 9.21000 18.44000 +O 0.30000 10.53000 0.40000 +H 1.19000 10.29000 0.14000 +H 0.31000 10.54000 1.35000 +O 2.49000 24.56000 0.47000 +H 2.27000 25.22000 1.13000 +H 2.29000 24.98000 -0.36000 +O 2.20000 21.32000 9.99000 +H 2.70000 20.91000 10.69000 +H 1.28000 21.20000 10.24000 +O 0.07000 22.28000 5.88000 +H -0.76000 22.29000 6.36000 +H -0.13000 21.85000 5.05000 +O 10.71000 27.09000 7.00000 +H 11.62000 27.34000 6.87000 +H 10.68000 26.73000 7.89000 +O 17.64000 24.67000 2.06000 +H 16.86000 24.83000 1.53000 +H 17.37000 23.98000 2.68000 +O 8.29000 26.33000 18.14000 +H 7.78000 26.87000 18.73000 +H 8.70000 26.95000 17.53000 +O 6.77000 28.65000 8.12000 +H 7.65000 28.86000 7.80000 +H 6.37000 29.50000 8.30000 +O 4.30000 22.45000 15.03000 +H 5.07000 21.90000 14.95000 +H 3.56000 21.83000 15.07000 +O 14.98000 19.43000 14.96000 +H 14.87000 19.80000 14.08000 +H 15.13000 20.19000 15.52000 +O 1.26000 24.89000 5.95000 +H 0.98000 23.98000 5.84000 +H 0.47000 25.41000 5.79000 +O 1.55000 26.10000 15.56000 +H 2.50000 26.16000 15.69000 +H 1.19000 26.80000 16.09000 +O 2.19000 28.20000 12.89000 +H 2.96000 27.67000 12.68000 +H 1.45000 27.61000 12.76000 +O 15.31000 27.85000 1.61000 +H 14.67000 27.40000 2.15000 +H 15.93000 28.23000 2.23000 +O 3.77000 21.06000 18.80000 +H 4.17000 21.89000 19.06000 +H 2.84000 21.27000 18.67000 +O 5.72000 26.12000 2.97000 +H 6.11000 26.97000 3.20000 +H 5.08000 25.96000 3.66000 +O 12.55000 22.63000 9.65000 +H 12.50000 21.95000 8.98000 +H 12.78000 22.15000 10.45000 +O 8.01000 24.88000 14.30000 +H 7.59000 24.65000 15.12000 +H 7.77000 24.17000 13.70000 +O 13.81000 23.22000 16.78000 +H 13.80000 23.77000 17.56000 +H 14.54000 22.62000 16.91000 +O 9.50000 28.03000 16.21000 +H 10.04000 27.33000 15.83000 +H 9.25000 28.57000 15.46000 +O 10.05000 22.67000 11.92000 +H 9.16000 22.67000 12.27000 +H 9.95000 22.96000 11.01000 +O 10.91000 25.95000 4.36000 +H 10.79000 26.31000 5.24000 +H 10.02000 25.74000 4.07000 +O 1.51000 28.00000 7.62000 +H 2.11000 27.34000 7.96000 +H 0.83000 28.07000 8.29000 +O 9.21000 22.48000 2.35000 +H 8.72000 22.87000 1.62000 +H 9.18000 21.54000 2.18000 +O 16.60000 24.14000 18.32000 +H 16.61000 25.01000 17.91000 +H 17.53000 23.90000 18.39000 +O 5.16000 20.34000 8.82000 +H 5.31000 20.77000 9.66000 +H 5.15000 21.06000 8.18000 +O 15.37000 26.23000 7.45000 +H 14.95000 25.68000 8.11000 +H 16.25000 26.39000 7.80000 +O 2.00000 20.95000 14.90000 +H 1.37000 21.63000 15.14000 +H 1.66000 20.15000 15.28000 +O 14.15000 19.94000 3.55000 +H 14.84000 19.75000 2.92000 +H 14.61000 20.18000 4.35000 +O 4.00000 25.48000 5.09000 +H 4.19000 24.54000 5.18000 +H 3.06000 25.55000 5.30000 +O 15.47000 20.82000 17.36000 +H 15.13000 21.06000 18.22000 +H 15.84000 19.94000 17.48000 +O 6.39000 19.65000 1.31000 +H 7.34000 19.67000 1.39000 +H 6.22000 19.81000 0.38000 +O 7.05000 21.72000 17.44000 +H 7.88000 21.27000 17.60000 +H 6.39000 21.17000 17.88000 +O 13.01000 24.47000 14.40000 +H 13.40000 24.14000 15.21000 +H 13.43000 25.31000 14.25000 +O 9.97000 23.48000 9.23000 +H 9.57000 22.97000 8.52000 +H 10.88000 23.19000 9.24000 +O 5.44000 18.99000 4.94000 +H 4.61000 19.00000 5.42000 +H 5.46000 19.82000 4.47000 +O 3.04000 19.45000 2.13000 +H 3.61000 20.12000 2.50000 +H 3.44000 18.62000 2.36000 +O 10.62000 25.89000 14.81000 +H 9.88000 25.29000 14.80000 +H 11.40000 25.33000 14.75000 +O 10.58000 24.33000 0.16000 +H 9.66000 24.39000 0.44000 +H 11.07000 24.19000 0.97000 +O 1.17000 24.01000 13.79000 +H 2.10000 23.88000 13.60000 +H 1.15000 24.64000 14.51000 +O 5.83000 20.88000 11.52000 +H 6.22000 20.01000 11.40000 +H 4.99000 20.71000 11.95000 +O 14.34000 24.77000 9.57000 +H 13.74000 24.03000 9.50000 +H 14.98000 24.49000 10.22000 +O 18.06000 26.66000 3.96000 +H 18.64000 26.24000 4.60000 +H 18.04000 26.05000 3.22000 +O 13.90000 23.97000 1.02000 +H 13.22000 23.83000 1.68000 +H 14.52000 23.25000 1.15000 +O 5.04000 21.12000 3.19000 +H 5.59000 20.66000 2.56000 +H 4.94000 22.00000 2.83000 +O 16.62000 0.15000 10.97000 +H 16.91000 0.81000 11.59000 +H 16.11000 0.64000 10.31000 +O 8.90000 19.72000 14.08000 +H 8.91000 18.92000 13.55000 +H 9.79000 20.05000 14.04000 +O 4.49000 26.77000 12.43000 +H 5.12000 26.96000 13.12000 +H 4.23000 25.87000 12.57000 +O 12.61000 22.31000 12.70000 +H 12.87000 23.09000 13.19000 +H 11.73000 22.49000 12.39000 +O 5.75000 23.58000 8.59000 +H 5.62000 24.28000 7.96000 +H 6.41000 23.92000 9.20000 +O 15.75000 25.31000 4.87000 +H 15.48000 25.58000 5.75000 +H 16.45000 25.92000 4.63000 +O 4.37000 25.91000 16.10000 +H 4.90000 26.46000 15.52000 +H 4.95000 25.20000 16.37000 +O 16.29000 26.70000 17.23000 +H 15.47000 27.19000 17.12000 +H 16.77000 26.84000 16.42000 +O 9.44000 20.31000 17.66000 +H 10.13000 20.87000 17.29000 +H 9.50000 19.50000 17.16000 +O 5.39000 19.05000 17.63000 +H 4.86000 18.62000 16.96000 +H 4.78000 19.65000 18.06000 +O 6.67000 27.41000 10.61000 +H 6.51000 27.81000 9.76000 +H 5.80000 27.36000 11.01000 +O 13.05000 27.11000 10.25000 +H 12.19000 26.86000 9.90000 +H 13.63000 26.39000 10.03000 +O 11.70000 23.82000 2.69000 +H 10.95000 23.23000 2.79000 +H 11.57000 24.48000 3.37000 +O 3.28000 20.42000 12.45000 +H 2.83000 20.75000 13.23000 +H 3.05000 19.50000 12.41000 +O 0.80000 2.95000 12.82000 +H 0.64000 2.29000 13.49000 +H 0.95000 3.76000 13.32000 +O 7.50000 24.80000 10.35000 +H 8.33000 24.83000 9.87000 +H 7.24000 25.72000 10.44000 +O 17.74000 28.41000 18.90000 +H 17.19000 27.75000 18.47000 +H 17.12000 29.02000 19.29000 +O 2.83000 19.07000 5.95000 +H 2.63000 19.98000 6.15000 +H 2.86000 18.63000 6.80000 +O 16.41000 22.90000 3.81000 +H 16.24000 22.18000 4.42000 +H 16.12000 23.68000 4.28000 +O 10.54000 26.13000 9.65000 +H 10.27000 26.25000 10.56000 +H 10.42000 25.19000 9.49000 +O 2.84000 27.32000 18.21000 +H 3.19000 27.86000 18.92000 +H 3.62000 27.01000 17.74000 +O 15.92000 21.94000 1.34000 +H 16.04000 20.99000 1.47000 +H 16.05000 22.32000 2.21000 +O 12.81000 26.53000 0.25000 +H 13.03000 25.68000 0.62000 +H 13.18000 26.51000 -0.64000 +O 3.12000 26.23000 9.03000 +H 3.91000 26.29000 8.50000 +H 3.25000 25.46000 9.58000 +O 3.59000 23.63000 10.21000 +H 3.08000 22.84000 10.04000 +H 4.35000 23.56000 9.63000 +O 11.23000 22.21000 16.74000 +H 10.75000 22.86000 17.25000 +H 12.14000 22.52000 16.75000 +O 11.54000 20.52000 14.55000 +H 11.37000 21.11000 15.28000 +H 11.91000 21.08000 13.87000 +O 9.67000 26.46000 12.28000 +H 10.22000 26.40000 13.06000 +H 8.86000 26.02000 12.51000 +O 1.35000 24.89000 11.16000 +H 2.18000 24.46000 10.95000 +H 1.16000 24.63000 12.06000 +O 2.06000 23.55000 16.84000 +H 2.94000 23.46000 16.49000 +H 1.80000 24.45000 16.63000 +O 14.48000 28.58000 16.13000 +H 15.12000 29.02000 15.57000 +H 14.01000 27.99000 15.53000 +O 8.51000 24.98000 3.45000 +H 8.64000 24.07000 3.16000 +H 7.61000 25.18000 3.20000 +O 16.16000 24.11000 11.53000 +H 16.22000 23.64000 12.36000 +H 17.05000 24.08000 11.18000 +O 7.35000 22.99000 12.41000 +H 6.81000 22.23000 12.21000 +H 7.24000 23.57000 11.66000 +O 4.65000 23.60000 2.13000 +H 5.09000 24.40000 2.40000 +H 3.89000 23.89000 1.64000 +O 0.99000 0.92000 14.71000 +H 0.77000 0.42000 15.50000 +H 1.43000 0.29000 14.15000 +O 12.96000 0.05000 12.16000 +H 13.06000 -0.58000 11.44000 +H 12.01000 0.17000 12.23000 +O 12.87000 27.44000 2.97000 +H 12.26000 26.96000 3.53000 +H 12.63000 27.18000 2.08000 +O 9.11000 19.89000 1.32000 +H 9.38000 20.34000 0.52000 +H 9.81000 19.25000 1.48000 +O 18.32000 20.25000 5.34000 +H 18.48000 20.28000 4.40000 +H 17.37000 20.36000 5.42000 +O 13.26000 27.86000 6.53000 +H 14.02000 27.36000 6.81000 +H 13.61000 28.47000 5.88000 +O 17.75000 20.39000 9.46000 +H 18.15000 19.61000 9.07000 +H 17.14000 20.71000 8.79000 +O 2.43000 21.53000 7.13000 +H 1.60000 21.89000 6.83000 +H 2.34000 21.48000 8.08000 +O 17.24000 22.59000 13.76000 +H 18.02000 23.15000 13.72000 +H 17.46000 21.83000 13.22000 +O 0.64000 28.34000 17.00000 +H 0.02000 28.72000 17.62000 +H 1.39000 28.07000 17.53000 +O 6.51000 20.79000 14.88000 +H 7.36000 20.57000 14.50000 +H 6.71000 21.13000 15.75000 +O 0.77000 22.34000 0.63000 +H 0.76000 22.09000 -0.29000 +H 1.38000 23.08000 0.67000 +O 14.01000 27.02000 13.86000 +H 13.60000 27.72000 13.35000 +H 14.85000 26.89000 13.44000 +O 0.45000 20.43000 2.61000 +H 0.47000 21.14000 1.97000 +H 1.31000 20.02000 2.53000 +O 6.32000 27.13000 14.46000 +H 6.79000 27.91000 14.74000 +H 6.98000 26.44000 14.41000 +O 6.78000 24.42000 16.70000 +H 7.26000 24.95000 17.34000 +H 6.83000 23.53000 17.04000 +O 16.36000 26.79000 12.46000 +H 16.35000 25.98000 11.95000 +H 16.46000 27.48000 11.81000 +O 5.40000 26.19000 7.45000 +H 5.88000 27.02000 7.47000 +H 5.06000 26.13000 6.56000 +O 17.90000 21.75000 16.34000 +H 17.65000 22.16000 15.51000 +H 17.07000 21.58000 16.78000 +O 17.46000 27.47000 14.86000 +H 17.25000 28.40000 14.85000 +H 17.14000 27.15000 14.01000 +O 11.15000 28.76000 0.16000 +H 10.88000 28.86000 -0.76000 +H 11.58000 27.90000 0.18000 +O 17.90000 20.36000 12.23000 +H 18.85000 20.34000 12.33000 +H 17.76000 20.37000 11.29000 +O 4.28000 22.79000 5.44000 +H 4.47000 22.14000 4.76000 +H 3.67000 22.34000 6.03000 +O 3.81000 24.17000 12.98000 +H 4.16000 23.59000 13.66000 +H 4.00000 23.70000 12.16000 +O 14.30000 20.16000 12.41000 +H 14.98000 20.35000 11.77000 +H 13.77000 20.95000 12.44000 +O 13.71000 19.04000 0.77000 +H 14.17000 18.23000 0.98000 +H 13.23000 19.26000 1.57000 +O 6.50000 28.10000 19.63000 +H 6.09000 28.51000 18.87000 +H 6.46000 28.77000 20.32000 +O 5.86000 25.74000 0.02000 +H 6.04000 26.55000 -0.46000 +H 5.70000 26.03000 0.93000 +O 9.15000 21.65000 20.02000 +H 9.59000 22.47000 19.81000 +H 9.24000 21.11000 19.24000 +O 2.86000 18.88000 20.28000 +H 3.22000 19.67000 19.87000 +H 2.81000 19.09000 21.21000 +O 10.02000 24.06000 18.42000 +H 9.46000 24.83000 18.27000 +H 10.45000 24.24000 19.26000 +O 14.04000 24.56000 19.19000 +H 13.92000 24.27000 20.09000 +H 14.97000 24.44000 19.02000 +O 14.69000 20.94000 19.93000 +H 14.24000 20.26000 20.43000 +H 15.13000 21.47000 20.60000 +O 7.84000 23.88000 0.45000 +H 7.70000 23.20000 -0.21000 +H 7.13000 24.51000 0.29000 +O 4.59000 23.49000 19.80000 +H 5.14000 24.25000 19.98000 +H 3.84000 23.60000 20.39000 +O 16.56000 19.42000 2.20000 +H 17.51000 19.48000 2.29000 +H 16.34000 18.55000 2.56000 +O 1.05000 21.87000 18.76000 +H 0.31000 21.41000 18.36000 +H 1.28000 22.54000 18.11000 +O 0.45000 0.21000 20.63000 +H 1.38000 0.13000 20.43000 +H 0.38000 -0.09000 21.53000 +O 20.16000 6.26000 0.86000 +H 19.32000 6.23000 1.33000 +H 20.08000 5.57000 0.20000 +O 20.81000 2.74000 9.76000 +H 20.97000 2.53000 10.68000 +H 20.04000 2.23000 9.53000 +O 18.85000 4.15000 6.87000 +H 18.24000 4.40000 7.56000 +H 18.43000 3.41000 6.42000 +O 1.16000 10.31000 5.86000 +H 2.10000 10.46000 5.72000 +H 1.12000 9.50000 6.37000 +O 21.77000 15.41000 10.59000 +H 21.05000 15.13000 10.02000 +H 22.15000 14.60000 10.92000 +O 21.07000 17.05000 5.29000 +H 21.17000 17.74000 5.95000 +H 21.32000 17.46000 4.47000 +O 21.01000 14.27000 5.33000 +H 20.99000 15.22000 5.45000 +H 20.55000 13.92000 6.09000 +O 20.98000 11.23000 9.66000 +H 20.86000 10.28000 9.72000 +H 20.56000 11.57000 10.45000 +O 19.96000 6.41000 5.66000 +H 19.70000 5.52000 5.92000 +H 19.76000 6.95000 6.42000 +O 18.79000 15.93000 1.45000 +H 18.81000 15.01000 1.73000 +H 18.78000 16.43000 2.26000 +O 19.53000 7.74000 15.79000 +H 20.01000 8.36000 16.33000 +H 18.73000 8.20000 15.55000 +O 20.80000 9.46000 12.65000 +H 21.66000 9.08000 12.83000 +H 20.52000 9.05000 11.83000 +O 1.56000 7.37000 2.65000 +H 0.64000 7.33000 2.40000 +H 1.58000 7.06000 3.56000 +O 19.20000 7.99000 7.70000 +H 19.61000 8.34000 8.50000 +H 18.46000 8.58000 7.54000 +O 20.00000 18.29000 15.47000 +H 19.98000 18.22000 16.43000 +H 19.08000 18.36000 15.22000 +O 23.43000 12.44000 17.21000 +H 23.12000 12.79000 16.37000 +H 22.72000 12.63000 17.82000 +O 20.68000 3.31000 15.18000 +H 20.10000 3.93000 14.72000 +H 20.21000 2.48000 15.15000 +O 20.71000 17.65000 11.76000 +H 21.28000 16.94000 11.47000 +H 20.30000 17.98000 10.96000 +O 21.98000 8.18000 4.91000 +H 22.34000 7.77000 4.12000 +H 21.35000 7.54000 5.24000 +O 21.31000 0.46000 2.89000 +H 22.18000 0.81000 2.73000 +H 21.29000 0.28000 3.83000 +O 19.57000 5.60000 13.94000 +H 20.42000 5.76000 13.54000 +H 19.44000 6.34000 14.53000 +O 23.17000 8.06000 13.17000 +H 23.53000 7.92000 14.05000 +H 22.77000 7.22000 12.94000 +O 19.45000 15.87000 13.57000 +H 18.89000 16.53000 13.99000 +H 20.00000 16.38000 12.97000 +O 21.05000 10.78000 5.03000 +H 21.78000 11.36000 4.82000 +H 21.44000 9.91000 5.08000 +O 0.03000 5.70000 8.66000 +H 0.42000 6.37000 8.09000 +H 0.48000 5.80000 9.50000 +O 0.10000 8.95000 10.00000 +H 0.28000 9.89000 10.06000 +H 0.50000 8.58000 10.78000 +O 20.98000 2.06000 12.41000 +H 21.22000 2.33000 13.30000 +H 20.97000 1.11000 12.44000 +O 19.80000 13.26000 12.51000 +H 19.85000 12.62000 13.22000 +H 19.76000 14.11000 12.95000 +O 21.49000 0.57000 5.62000 +H 21.46000 1.37000 6.14000 +H 22.06000 -0.02000 6.11000 +O 20.86000 8.33000 10.00000 +H 21.81000 8.48000 9.93000 +H 20.76000 7.38000 9.95000 +O 21.06000 5.46000 9.90000 +H 20.87000 4.52000 9.80000 +H 21.83000 5.60000 9.34000 +O 18.67000 13.22000 2.23000 +H 17.78000 13.33000 1.90000 +H 18.75000 12.29000 2.41000 +O 19.73000 18.24000 9.20000 +H 19.43000 17.35000 9.04000 +H 20.29000 18.44000 8.45000 +O 18.65000 4.58000 11.50000 +H 19.24000 5.04000 10.90000 +H 18.82000 4.98000 12.35000 +O 20.79000 5.49000 17.05000 +H 20.87000 4.81000 16.38000 +H 20.31000 6.20000 16.63000 +O 21.27000 15.52000 17.39000 +H 20.94000 16.22000 17.97000 +H 21.40000 14.77000 17.98000 +O 20.24000 11.29000 14.61000 +H 20.55000 10.89000 15.43000 +H 20.40000 10.62000 13.94000 +O 19.90000 17.98000 18.19000 +H 19.43000 17.32000 18.69000 +H 20.37000 18.50000 18.85000 +O 21.40000 2.99000 7.06000 +H 20.56000 3.43000 6.90000 +H 21.43000 2.87000 8.01000 +O 22.27000 13.35000 14.96000 +H 22.69000 13.92000 14.31000 +H 21.70000 12.78000 14.45000 +O 21.36000 13.63000 2.73000 +H 20.46000 13.54000 2.40000 +H 21.25000 13.87000 3.65000 +O 20.43000 10.24000 17.40000 +H 19.51000 10.23000 17.67000 +H 20.91000 9.96000 18.17000 +O 19.48000 3.09000 0.58000 +H 19.43000 2.14000 0.54000 +H 19.46000 3.37000 -0.34000 +O 19.16000 2.16000 3.19000 +H 19.18000 2.72000 2.41000 +H 19.96000 1.63000 3.13000 +O 22.42000 16.96000 15.29000 +H 21.64000 17.48000 15.14000 +H 22.16000 16.32000 15.96000 +O 21.03000 12.83000 18.61000 +H 20.81000 12.06000 18.08000 +H 20.21000 13.05000 19.05000 +O 19.95000 12.30000 7.15000 +H 20.39000 11.95000 7.92000 +H 20.26000 11.76000 6.43000 +O 21.92000 5.67000 12.53000 +H 22.47000 4.91000 12.71000 +H 21.68000 5.59000 11.61000 +O 4.30000 15.75000 7.68000 +H 5.04000 15.24000 7.34000 +H 3.57000 15.52000 7.11000 +O 19.09000 10.53000 3.03000 +H 19.79000 10.67000 3.66000 +H 18.69000 9.70000 3.30000 +O 19.01000 15.89000 19.63000 +H 18.81000 14.96000 19.54000 +H 18.94000 16.05000 20.58000 +O 21.35000 9.62000 20.10000 +H 22.16000 9.97000 20.47000 +H 21.31000 8.71000 20.39000 +O 22.35000 6.62000 2.47000 +H 22.30000 5.74000 2.84000 +H 21.62000 6.67000 1.85000 +O 21.68000 0.78000 19.10000 +H 20.98000 0.97000 19.73000 +H 22.44000 0.57000 19.64000 +O 18.52000 13.15000 19.66000 +H 17.61000 13.37000 19.47000 +H 18.47000 12.40000 20.26000 +O 19.61000 3.76000 18.84000 +H 18.87000 3.62000 18.24000 +H 20.17000 4.38000 18.38000 +O 18.88000 10.67000 0.16000 +H 19.74000 10.37000 -0.12000 +H 18.89000 10.57000 1.12000 +O 20.26000 24.84000 1.20000 +H 19.37000 24.82000 1.54000 +H 20.27000 24.18000 0.51000 +O 20.37000 21.44000 9.90000 +H 20.59000 21.03000 10.73000 +H 19.46000 21.17000 9.73000 +O 18.34000 22.62000 6.74000 +H 17.49000 22.53000 7.17000 +H 18.42000 21.84000 6.20000 +O 19.39000 25.16000 5.89000 +H 19.02000 24.31000 6.14000 +H 19.30000 25.70000 6.67000 +O 19.67000 26.15000 15.79000 +H 20.03000 26.81000 16.39000 +H 18.88000 26.55000 15.44000 +O 20.83000 28.25000 12.56000 +H 21.64000 27.82000 12.84000 +H 20.58000 27.81000 11.75000 +O 1.73000 26.56000 2.12000 +H 2.03000 27.39000 2.48000 +H 0.88000 26.41000 2.54000 +O 19.18000 26.99000 7.97000 +H 19.73000 26.86000 8.73000 +H 19.25000 27.92000 7.77000 +O 22.66000 2.50000 17.10000 +H 22.04000 2.78000 16.43000 +H 22.15000 1.96000 17.70000 +O 20.51000 21.31000 15.25000 +H 19.64000 21.41000 15.63000 +H 20.99000 20.77000 15.87000 +O 22.15000 25.80000 5.31000 +H 22.22000 25.70000 4.36000 +H 21.24000 25.57000 5.50000 +O 21.80000 18.64000 2.35000 +H 22.50000 19.28000 2.51000 +H 22.27000 17.81000 2.24000 +O 19.49000 24.22000 13.79000 +H 20.41000 24.14000 13.54000 +H 19.50000 24.89000 14.48000 +O 23.33000 20.48000 11.22000 +H 23.52000 19.57000 11.03000 +H 22.52000 20.45000 11.74000 +O 23.16000 26.76000 13.12000 +H 23.51000 26.67000 14.00000 +H 22.71000 25.93000 12.95000 +O 0.30000 24.34000 8.60000 +H 0.77000 24.66000 7.84000 +H 0.80000 24.67000 9.35000 +O 22.53000 20.22000 17.57000 +H 23.06000 19.53000 17.18000 +H 22.16000 19.82000 18.36000 +O 0.35000 27.41000 10.21000 +H 1.17000 26.95000 10.05000 +H 0.14000 27.24000 11.12000 +O 20.73000 20.35000 12.56000 +H 20.74000 20.67000 13.46000 +H 20.80000 19.40000 12.63000 +O 21.48000 19.11000 7.11000 +H 21.10000 19.97000 6.94000 +H 22.38000 19.29000 7.38000 +O 21.06000 26.74000 10.06000 +H 21.95000 27.06000 9.89000 +H 21.15000 25.78000 10.05000 +O 21.46000 23.94000 10.04000 +H 21.16000 23.04000 9.92000 +H 22.21000 24.02000 9.45000 +O 18.83000 24.19000 11.10000 +H 19.64000 24.15000 10.60000 +H 19.11000 24.29000 12.01000 +O 20.72000 23.77000 16.91000 +H 20.88000 23.19000 16.17000 +H 20.43000 24.59000 16.52000 +O 19.72000 0.76000 14.78000 +H 19.72000 0.31000 15.62000 +H 19.95000 0.08000 14.14000 +O 21.03000 21.87000 7.22000 +H 20.20000 22.27000 6.96000 +H 20.94000 21.74000 8.17000 +O 19.98000 28.48000 17.29000 +H 19.20000 28.46000 17.84000 +H 20.66000 28.86000 17.85000 +O 18.90000 21.69000 0.53000 +H 18.01000 21.97000 0.71000 +H 19.05000 21.91000 -0.39000 +O 19.29000 19.86000 2.64000 +H 19.27000 20.55000 1.98000 +H 20.16000 19.46000 2.53000 +O 22.02000 24.25000 12.76000 +H 22.82000 23.82000 13.07000 +H 21.97000 24.03000 11.83000 +O 22.59000 25.29000 2.60000 +H 22.97000 24.45000 2.37000 +H 21.76000 25.32000 2.12000 +O 21.42000 19.35000 20.07000 +H 21.07000 20.14000 20.48000 +H 21.72000 18.81000 20.80000 +O 19.20000 22.45000 18.77000 +H 18.76000 22.01000 18.04000 +H 19.91000 22.94000 18.35000 +O 3.08000 2.53000 1.27000 +H 2.32000 2.98000 0.92000 +H 3.73000 3.22000 1.42000 +O 19.68000 0.36000 0.59000 +H 20.19000 0.16000 1.38000 +H 19.25000 -0.47000 0.37000 diff --git a/tests/data/nve_energy_conservation/peptide_solv_ion.xyz b/tests/data/nve_energy_conservation/peptide_solv_ion.xyz new file mode 100644 index 00000000..67c77db8 --- /dev/null +++ b/tests/data/nve_energy_conservation/peptide_solv_ion.xyz @@ -0,0 +1,2644 @@ +2642 +NEUROTENSIN in water +N 9.82000 7.48000 26.44000 +H 9.51000 6.47000 26.41000 +H 9.24000 7.97000 27.18000 +H 9.63000 7.92000 25.53000 +C 11.26000 7.59000 26.81000 +H 11.42000 6.99000 27.70000 +C 12.16000 7.07000 25.65000 +H 11.86000 7.63000 24.73000 +H 11.95000 6.00000 25.47000 +C 13.69000 7.25000 25.85000 +H 14.05000 6.56000 26.64000 +H 13.96000 8.29000 26.15000 +C 14.49000 6.97000 24.59000 +O 13.88000 6.89000 23.49000 +O 15.74000 6.83000 24.68000 +C 11.59000 9.02000 27.15000 +O 11.15000 9.92000 26.45000 +N 12.32000 9.26000 28.26000 +H 12.71000 8.49000 28.79000 +C 12.52000 10.58000 28.83000 +H 11.55000 11.01000 29.02000 +C 13.29000 10.43000 30.17000 +H 13.43000 11.43000 30.63000 +H 14.30000 10.02000 29.97000 +C 12.60000 9.52000 31.20000 +H 12.41000 8.52000 30.74000 +C 13.52000 9.27000 32.40000 +H 13.03000 8.58000 33.12000 +H 14.48000 8.81000 32.07000 +H 13.75000 10.23000 32.91000 +C 11.25000 10.09000 31.65000 +H 10.79000 9.43000 32.41000 +H 11.37000 11.09000 32.09000 +H 10.54000 10.16000 30.79000 +C 13.25000 11.57000 27.93000 +O 12.82000 12.70000 27.74000 +N 14.37000 11.14000 27.30000 +H 14.68000 10.21000 27.42000 +C 15.19000 12.02000 26.49000 +H 15.14000 13.01000 26.92000 +C 16.68000 11.59000 26.48000 +H 17.26000 12.15000 25.71000 +H 16.78000 10.50000 26.26000 +C 17.28000 11.89000 27.82000 +C 17.28000 10.94000 28.85000 +H 16.88000 9.95000 28.67000 +C 17.73000 11.28000 30.14000 +H 17.67000 10.57000 30.94000 +C 18.20000 12.57000 30.39000 +O 18.55000 12.93000 31.70000 +H 18.97000 13.82000 31.68000 +C 17.81000 13.17000 28.07000 +H 17.82000 13.91000 27.28000 +C 18.27000 13.51000 29.35000 +H 18.65000 14.51000 29.54000 +C 14.66000 12.17000 25.08000 +O 14.69000 11.26000 24.25000 +N 14.19000 13.38000 24.74000 +H 14.09000 14.10000 25.44000 +C 13.71000 13.71000 23.42000 +H 13.20000 12.85000 23.01000 +C 12.73000 14.90000 23.46000 +H 12.46000 15.23000 22.43000 +H 13.25000 15.76000 23.94000 +C 11.44000 14.62000 24.27000 +H 11.07000 15.57000 24.71000 +H 11.68000 13.94000 25.12000 +C 10.29000 14.02000 23.49000 +O 10.29000 14.02000 22.24000 +O 9.32000 13.57000 24.17000 +C 14.89000 14.04000 22.52000 +O 15.38000 15.16000 22.48000 +N 15.39000 13.03000 21.79000 +H 15.03000 12.11000 21.95000 +C 16.44000 13.20000 20.79000 +H 17.16000 13.92000 21.16000 +C 17.15000 11.86000 20.46000 +H 18.11000 12.05000 19.94000 +H 16.52000 11.24000 19.78000 +C 17.42000 11.00000 21.69000 +O 16.97000 9.85000 21.71000 +N 18.08000 11.53000 22.73000 +H 18.45000 12.46000 22.69000 +H 18.20000 10.98000 23.55000 +C 15.82000 13.75000 19.51000 +O 14.65000 13.50000 19.23000 +N 16.57000 14.48000 18.67000 +H 17.52000 14.70000 18.86000 +C 16.01000 15.03000 17.44000 +H 15.18000 15.65000 17.75000 +C 17.00000 15.99000 16.74000 +H 16.56000 16.35000 15.78000 +H 17.93000 15.43000 16.49000 +C 17.33000 17.24000 17.59000 +H 17.85000 16.91000 18.51000 +H 16.38000 17.72000 17.91000 +C 18.20000 18.30000 16.88000 +H 17.58000 18.83000 16.13000 +H 18.51000 19.05000 17.64000 +C 19.44000 17.72000 16.20000 +H 19.16000 17.08000 15.33000 +H 19.99000 17.09000 16.93000 +N 20.37000 18.76000 15.71000 +H 21.15000 18.31000 15.18000 +H 19.90000 19.47000 15.13000 +H 20.80000 19.26000 16.53000 +C 15.37000 14.05000 16.43000 +O 14.28000 14.39000 15.96000 +N 15.85000 12.87000 16.03000 +C 17.13000 12.29000 16.45000 +H 17.97000 12.86000 15.98000 +H 17.25000 12.25000 17.55000 +C 15.23000 12.09000 14.95000 +H 14.98000 12.75000 14.13000 +C 16.33000 11.09000 14.58000 +H 17.02000 11.57000 13.86000 +H 15.96000 10.15000 14.13000 +C 17.07000 10.87000 15.89000 +H 18.07000 10.41000 15.72000 +H 16.48000 10.22000 16.56000 +C 13.95000 11.34000 15.33000 +O 13.48000 10.55000 14.51000 +N 13.33000 11.58000 16.50000 +H 13.75000 12.18000 17.18000 +C 11.98000 11.09000 16.75000 +H 11.74000 10.25000 16.11000 +C 11.83000 10.64000 18.23000 +H 12.66000 9.93000 18.44000 +H 10.88000 10.06000 18.33000 +C 11.80000 11.78000 19.28000 +H 10.83000 12.32000 19.19000 +H 12.59000 12.51000 19.04000 +C 11.94000 11.35000 20.75000 +H 11.08000 10.69000 21.00000 +H 11.92000 12.24000 21.41000 +N 13.25000 10.62000 20.91000 +H 13.92000 10.71000 20.18000 +C 13.40000 9.55000 21.68000 +N 12.51000 9.16000 22.56000 +H 11.74000 9.75000 22.77000 +H 12.78000 8.34000 23.09000 +N 14.47000 8.79000 21.59000 +H 15.37000 9.21000 21.42000 +H 14.47000 8.02000 22.25000 +C 10.99000 12.21000 16.45000 +O 9.78000 12.03000 16.46000 +N 11.52000 13.40000 16.11000 +H 12.52000 13.52000 16.07000 +C 10.76000 14.60000 15.89000 +H 9.85000 14.36000 15.36000 +C 10.41000 15.22000 17.27000 +H 9.75000 14.49000 17.79000 +H 9.80000 16.14000 17.13000 +C 11.62000 15.51000 18.20000 +H 12.18000 16.40000 17.82000 +H 12.33000 14.66000 18.19000 +C 11.23000 15.74000 19.66000 +H 12.12000 15.93000 20.30000 +H 10.70000 14.83000 20.03000 +N 10.34000 16.95000 19.68000 +H 10.43000 17.63000 18.96000 +C 9.14000 16.96000 20.25000 +N 8.74000 16.10000 21.15000 +H 9.36000 15.36000 21.46000 +H 7.75000 15.98000 21.27000 +N 8.32000 17.91000 19.84000 +H 8.65000 18.53000 19.13000 +H 7.41000 18.00000 20.24000 +C 11.52000 15.63000 15.04000 +O 11.61000 16.79000 15.43000 +N 12.09000 15.32000 13.87000 +C 11.93000 14.07000 13.11000 +H 12.29000 13.20000 13.70000 +H 10.87000 13.93000 12.82000 +C 12.94000 16.27000 13.17000 +H 13.51000 16.89000 13.86000 +C 13.81000 15.33000 12.32000 +H 14.59000 14.88000 12.98000 +H 14.31000 15.83000 11.47000 +C 12.84000 14.23000 11.88000 +H 13.35000 13.29000 11.61000 +H 12.24000 14.59000 11.02000 +C 12.06000 17.15000 12.30000 +O 10.84000 17.03000 12.36000 +N 12.64000 18.03000 11.47000 +H 13.64000 18.13000 11.40000 +C 11.86000 18.87000 10.58000 +H 10.98000 19.19000 11.12000 +C 12.68000 20.14000 10.21000 +H 13.45000 19.91000 9.44000 +H 13.19000 20.52000 11.12000 +C 11.76000 21.22000 9.70000 +C 11.19000 22.14000 10.59000 +H 11.40000 22.06000 11.65000 +C 10.31000 23.13000 10.13000 +H 9.85000 23.82000 10.82000 +C 10.01000 23.21000 8.77000 +O 9.13000 24.20000 8.29000 +H 8.79000 23.89000 7.42000 +C 11.46000 21.32000 8.33000 +H 11.88000 20.60000 7.64000 +C 10.58000 22.30000 7.87000 +H 10.34000 22.34000 6.82000 +C 11.39000 18.06000 9.37000 +O 11.95000 18.11000 8.27000 +N 10.33000 17.26000 9.58000 +H 10.05000 17.13000 10.53000 +C 9.61000 16.51000 8.56000 +H 9.67000 17.05000 7.62000 +C 10.21000 15.10000 8.40000 +H 11.32000 15.23000 8.40000 +C 9.85000 14.19000 9.60000 +H 10.46000 13.26000 9.58000 +H 10.03000 14.70000 10.56000 +H 8.78000 13.89000 9.55000 +C 9.85000 14.47000 7.04000 +H 10.11000 15.20000 6.23000 +H 8.75000 14.30000 6.98000 +C 10.58000 13.15000 6.76000 +H 10.32000 12.77000 5.74000 +H 11.68000 13.28000 6.82000 +H 10.28000 12.37000 7.49000 +C 8.15000 16.47000 9.00000 +O 7.30000 15.78000 8.43000 +N 7.82000 17.25000 10.05000 +H 8.45000 17.95000 10.37000 +C 6.56000 17.25000 10.77000 +H 5.83000 16.65000 10.24000 +C 6.74000 16.75000 12.23000 +H 5.75000 16.77000 12.74000 +H 7.41000 17.46000 12.77000 +C 7.35000 15.34000 12.39000 +H 8.38000 15.36000 11.96000 +C 7.47000 14.96000 13.87000 +H 7.91000 13.95000 13.99000 +H 8.11000 15.70000 14.40000 +H 6.47000 14.97000 14.36000 +C 6.54000 14.26000 11.66000 +H 7.04000 13.27000 11.76000 +H 5.52000 14.18000 12.07000 +H 6.47000 14.50000 10.58000 +C 6.02000 18.69000 10.84000 +O 6.79000 19.61000 11.25000 +O 4.83000 18.91000 10.51000 +O 2.76000 5.51000 1.33000 +H 2.20000 6.03000 1.91000 +H 2.35000 5.62000 0.46000 +O 2.22000 2.67000 9.92000 +H 2.42000 2.22000 10.74000 +H 1.27000 2.58000 9.82000 +O 0.40000 4.30000 5.91000 +H -0.55000 4.26000 5.92000 +H 0.67000 3.58000 5.34000 +O 16.24000 15.23000 6.97000 +H 15.78000 14.82000 7.70000 +H 15.61000 15.19000 6.25000 +O 11.53000 7.04000 6.91000 +H 12.02000 7.86000 6.81000 +H 10.97000 7.18000 7.67000 +O 17.96000 5.73000 1.87000 +H 17.60000 5.77000 0.98000 +H 17.54000 4.97000 2.27000 +O 6.99000 11.12000 10.00000 +H 6.96000 11.59000 10.83000 +H 6.75000 11.77000 9.35000 +O 8.86000 7.82000 18.92000 +H 8.02000 8.29000 18.92000 +H 9.25000 8.04000 18.08000 +O 6.85000 9.61000 6.31000 +H 7.56000 9.60000 6.94000 +H 6.21000 10.23000 6.67000 +O 6.84000 11.29000 18.16000 +H 7.61000 11.85000 18.05000 +H 6.14000 11.75000 17.70000 +O 3.25000 14.32000 10.31000 +H 2.49000 14.34000 9.73000 +H 3.95000 13.95000 9.77000 +O 4.45000 3.84000 13.99000 +H 5.26000 3.55000 14.40000 +H 4.07000 3.04000 13.62000 +O 15.82000 4.21000 7.47000 +H 15.08000 4.30000 6.87000 +H 15.76000 4.96000 8.06000 +O 2.19000 16.45000 3.89000 +H 1.76000 17.08000 4.47000 +H 3.02000 16.86000 3.65000 +O 3.03000 14.13000 5.07000 +H 2.61000 14.98000 4.91000 +H 2.56000 13.77000 5.82000 +O 2.82000 10.69000 8.91000 +H 2.88000 9.74000 9.03000 +H 2.34000 10.99000 9.69000 +O 5.50000 18.46000 15.41000 +H 4.67000 18.26000 14.97000 +H 5.74000 19.33000 15.10000 +O 5.72000 9.99000 1.37000 +H 6.28000 10.43000 0.72000 +H 6.08000 10.28000 2.21000 +O 14.90000 1.49000 14.41000 +H 15.15000 2.12000 13.73000 +H 14.97000 1.97000 15.23000 +O 1.27000 6.97000 5.61000 +H 1.02000 6.07000 5.78000 +H 1.04000 7.45000 6.41000 +O 18.64000 17.41000 3.17000 +H 19.38000 17.28000 3.77000 +H 18.76000 18.31000 2.85000 +O 0.10000 16.08000 2.12000 +H -0.04000 15.14000 2.15000 +H 0.81000 16.24000 2.75000 +O 16.91000 9.43000 6.54000 +H 17.76000 9.03000 6.37000 +H 16.74000 9.96000 5.76000 +O 16.57000 11.16000 4.29000 +H 17.37000 10.94000 3.80000 +H 16.85000 11.84000 4.91000 +O 2.06000 7.37000 15.86000 +H 3.02000 7.38000 15.92000 +H 1.81000 8.28000 16.01000 +O 6.28000 13.21000 8.40000 +H 5.93000 12.88000 7.57000 +H 6.63000 14.08000 8.19000 +O 8.25000 0.48000 3.95000 +H 8.79000 1.21000 4.25000 +H 7.45000 0.53000 4.48000 +O 1.72000 9.52000 12.91000 +H 2.62000 9.22000 12.85000 +H 1.57000 10.01000 12.11000 +O 15.20000 10.13000 2.09000 +H 14.50000 9.57000 2.43000 +H 15.66000 10.44000 2.87000 +O 3.30000 3.07000 17.58000 +H 3.93000 3.48000 18.17000 +H 2.57000 2.83000 18.15000 +O 15.02000 13.86000 9.11000 +H 14.20000 14.19000 9.48000 +H 14.80000 13.01000 8.74000 +O 16.21000 18.47000 5.38000 +H 16.12000 17.94000 4.59000 +H 16.32000 17.84000 6.09000 +O 6.17000 7.35000 2.83000 +H 6.28000 8.23000 2.47000 +H 5.43000 7.44000 3.43000 +O 12.71000 4.05000 9.33000 +H 11.79000 3.79000 9.43000 +H 13.20000 3.38000 9.80000 +O 15.95000 16.84000 3.16000 +H 16.91000 16.89000 3.08000 +H 15.64000 16.77000 2.26000 +O 7.92000 5.92000 14.31000 +H 7.59000 5.63000 15.16000 +H 7.63000 5.24000 13.71000 +O 13.86000 4.55000 17.16000 +H 14.06000 5.09000 17.92000 +H 14.46000 3.81000 17.23000 +O 9.74000 8.37000 16.43000 +H 10.15000 7.80000 15.79000 +H 9.26000 9.01000 15.91000 +O 10.10000 4.09000 12.17000 +H 9.16000 4.15000 12.35000 +H 10.15000 3.81000 11.25000 +O 10.93000 7.08000 4.20000 +H 11.12000 7.04000 5.14000 +H 10.05000 6.71000 4.12000 +O 0.54000 8.23000 8.09000 +H 1.41000 8.16000 8.48000 +H 0.02000 8.67000 8.75000 +O 0.86000 18.87000 16.22000 +H 1.01000 18.42000 17.05000 +H -0.08000 19.02000 16.19000 +O 8.57000 3.89000 2.07000 +H 9.16000 4.15000 1.36000 +H 7.72000 3.77000 1.64000 +O 17.45000 5.56000 18.00000 +H 16.97000 6.24000 17.53000 +H 17.67000 4.92000 17.32000 +O 13.94000 11.52000 5.22000 +H 14.80000 11.47000 4.80000 +H 13.43000 12.11000 4.66000 +O 5.96000 2.69000 8.63000 +H 5.74000 2.65000 9.57000 +H 5.71000 3.57000 8.36000 +O 3.77000 17.90000 8.36000 +H 4.45000 17.25000 8.19000 +H 4.07000 18.37000 9.13000 +O 18.09000 10.56000 8.84000 +H 17.50000 10.47000 8.09000 +H 17.53000 10.47000 9.61000 +O 3.13000 9.43000 2.69000 +H 3.88000 9.57000 2.11000 +H 3.29000 8.57000 3.09000 +O 15.11000 7.38000 6.88000 +H 14.93000 7.12000 7.79000 +H 15.77000 8.07000 6.96000 +O 4.93000 12.90000 16.99000 +H 4.62000 12.86000 16.08000 +H 4.14000 13.04000 17.50000 +O 11.36000 17.90000 1.93000 +H 10.69000 17.48000 2.46000 +H 11.69000 17.21000 1.36000 +O 1.72000 2.88000 14.96000 +H 1.69000 3.76000 14.60000 +H 2.39000 2.92000 15.65000 +O 16.42000 14.12000 1.01000 +H 16.05000 14.98000 0.82000 +H 15.69000 13.51000 0.89000 +O 4.70000 17.46000 3.08000 +H 5.13000 18.01000 3.73000 +H 5.42000 17.06000 2.59000 +O 14.55000 1.25000 4.32000 +H 14.42000 0.67000 3.57000 +H 15.50000 1.37000 4.37000 +O 1.60000 17.93000 11.93000 +H 2.53000 17.70000 12.04000 +H 1.39000 17.66000 11.04000 +O 3.77000 7.14000 4.36000 +H 3.90000 6.20000 4.40000 +H 2.96000 7.30000 4.84000 +O 15.45000 2.15000 17.13000 +H 15.45000 2.31000 18.07000 +H 15.59000 1.21000 17.04000 +O 6.17000 1.23000 0.98000 +H 6.87000 0.59000 1.12000 +H 5.61000 0.83000 0.32000 +O 7.75000 2.89000 17.60000 +H 8.52000 2.34000 17.47000 +H 7.21000 2.43000 18.24000 +O 13.14000 5.52000 14.67000 +H 13.37000 5.17000 15.53000 +H 13.61000 6.35000 14.62000 +O 9.27000 5.48000 8.84000 +H 9.09000 5.35000 7.91000 +H 9.47000 4.61000 9.18000 +O 5.63000 0.64000 4.82000 +H 4.84000 0.55000 5.35000 +H 5.53000 1.48000 4.37000 +O 14.35000 12.35000 0.64000 +H 14.58000 11.55000 1.11000 +H 13.44000 12.52000 0.88000 +O 3.31000 0.16000 2.03000 +H 3.27000 1.11000 2.08000 +H 4.08000 -0.07000 2.55000 +O 9.76000 2.78000 4.38000 +H 9.42000 3.16000 3.57000 +H 10.71000 2.92000 4.32000 +O 10.63000 6.78000 14.38000 +H 9.90000 6.16000 14.33000 +H 11.41000 6.23000 14.38000 +O 4.78000 11.24000 7.00000 +H 4.19000 11.08000 7.73000 +H 4.21000 11.19000 6.22000 +O 12.97000 17.51000 5.86000 +H 12.94000 18.36000 5.41000 +H 12.54000 17.67000 6.70000 +O 10.34000 5.02000 0.26000 +H 9.95000 5.86000 0.01000 +H 10.98000 5.24000 0.93000 +O 1.54000 5.49000 13.91000 +H 2.37000 5.66000 13.46000 +H 1.48000 6.17000 14.58000 +O 5.45000 2.33000 11.37000 +H 5.73000 1.43000 11.21000 +H 4.57000 2.25000 11.72000 +O 8.90000 4.70000 6.26000 +H 8.58000 5.29000 5.57000 +H 9.15000 3.90000 5.80000 +O 10.08000 0.92000 7.67000 +H 10.68000 0.90000 6.93000 +H 10.27000 0.11000 8.15000 +O 14.04000 11.60000 8.01000 +H 13.64000 10.76000 8.23000 +H 14.02000 11.62000 7.05000 +O 14.52000 6.23000 9.38000 +H 13.84000 5.56000 9.41000 +H 15.10000 6.02000 10.11000 +O 18.10000 7.67000 3.81000 +H 18.77000 7.29000 4.37000 +H 18.06000 7.09000 3.05000 +O 5.14000 14.11000 1.33000 +H 4.28000 13.87000 1.67000 +H 5.17000 13.72000 0.45000 +O 17.55000 12.82000 6.16000 +H 18.46000 12.69000 6.42000 +H 17.34000 13.69000 6.47000 +O 13.99000 5.65000 0.40000 +H 13.51000 5.41000 1.20000 +H 14.91000 5.53000 0.63000 +O 5.40000 2.77000 3.12000 +H 5.68000 2.16000 2.44000 +H 5.42000 3.63000 2.69000 +O 16.74000 10.60000 11.22000 +H 17.14000 11.27000 11.77000 +H 15.80000 10.72000 11.33000 +O 8.67000 1.26000 13.94000 +H 8.72000 1.34000 12.98000 +H 9.56000 1.42000 14.24000 +O 7.02000 10.42000 3.71000 +H 6.87000 10.20000 4.63000 +H 7.86000 10.02000 3.51000 +O 4.38000 8.69000 12.69000 +H 5.09000 8.74000 13.33000 +H 4.17000 7.76000 12.64000 +O 12.62000 3.39000 12.97000 +H 12.93000 4.14000 13.47000 +H 11.75000 3.65000 12.66000 +O 0.71000 15.89000 13.73000 +H 0.71000 16.72000 13.24000 +H 1.61000 15.58000 13.66000 +O 3.09000 11.20000 4.76000 +H 3.33000 12.03000 4.34000 +H 3.09000 10.56000 4.05000 +O 5.31000 5.36000 8.52000 +H 5.39000 5.94000 7.76000 +H 5.97000 5.67000 9.13000 +O 12.49000 13.58000 3.89000 +H 13.16000 14.19000 4.19000 +H 11.71000 13.80000 4.42000 +O 15.94000 5.98000 4.63000 +H 15.48000 6.35000 5.38000 +H 16.54000 6.67000 4.34000 +O 3.23000 15.10000 12.93000 +H 3.25000 14.85000 12.01000 +H 3.93000 15.74000 13.03000 +O 4.84000 7.24000 16.29000 +H 5.34000 7.68000 15.60000 +H 5.41000 6.52000 16.57000 +O 15.72000 7.67000 17.34000 +H 15.06000 7.27000 17.91000 +H 15.30000 7.75000 16.49000 +O 9.94000 1.17000 17.42000 +H 10.51000 1.94000 17.52000 +H 10.15000 0.83000 16.55000 +O 5.10000 0.66000 17.89000 +H 4.96000 -0.15000 17.41000 +H 4.48000 1.28000 17.51000 +O 5.64000 8.69000 10.20000 +H 6.08000 9.52000 10.02000 +H 5.21000 8.83000 11.04000 +O 13.12000 8.67000 10.09000 +H 12.21000 8.45000 9.88000 +H 13.62000 7.89000 9.83000 +O 12.12000 5.26000 2.45000 +H 12.30000 4.51000 3.02000 +H 11.80000 5.94000 3.03000 +O 2.97000 1.80000 12.58000 +H 2.36000 1.97000 13.30000 +H 3.30000 0.92000 12.74000 +O 25.38000 13.39000 12.99000 +H 25.76000 12.82000 13.65000 +H 25.67000 14.27000 13.23000 +O 7.10000 6.35000 10.38000 +H 7.86000 6.31000 9.80000 +H 6.74000 7.22000 10.25000 +O 17.82000 8.97000 18.72000 +H 17.13000 8.51000 18.23000 +H 17.79000 8.57000 19.59000 +O 3.22000 0.82000 6.18000 +H 3.21000 1.63000 6.70000 +H 2.74000 0.19000 6.72000 +O 16.22000 3.78000 2.99000 +H 16.60000 3.11000 3.57000 +H 15.99000 4.50000 3.58000 +O 10.46000 7.80000 9.68000 +H 10.16000 7.95000 10.57000 +H 10.09000 6.95000 9.44000 +O 3.93000 9.28000 17.93000 +H 4.64000 9.49000 18.54000 +H 4.28000 8.56000 17.40000 +O 15.57000 1.90000 0.98000 +H 15.04000 1.25000 1.44000 +H 15.77000 2.57000 1.64000 +O 12.72000 8.09000 0.32000 +H 13.15000 7.23000 0.27000 +H 13.13000 8.60000 -0.37000 +O 3.08000 7.96000 9.28000 +H 4.02000 8.13000 9.39000 +H 2.96000 7.05000 9.55000 +O 3.08000 5.24000 10.03000 +H 2.75000 4.34000 10.00000 +H 3.82000 5.25000 9.43000 +O 11.27000 3.59000 17.19000 +H 10.79000 4.20000 17.74000 +H 12.16000 3.93000 17.18000 +O 11.19000 1.93000 14.91000 +H 11.23000 2.59000 15.60000 +H 11.77000 2.25000 14.23000 +O 25.45000 13.30000 2.26000 +H 25.28000 13.32000 1.31000 +H 25.48000 12.37000 2.47000 +O 1.27000 17.01000 9.33000 +H 1.32000 16.10000 9.05000 +H 2.04000 17.43000 8.92000 +O 9.36000 7.95000 12.19000 +H 9.91000 7.69000 12.93000 +H 8.56000 7.43000 12.29000 +O 0.53000 5.73000 11.21000 +H 1.41000 5.69000 10.84000 +H 0.66000 5.65000 12.16000 +O 1.67000 5.43000 17.74000 +H 2.37000 4.84000 17.47000 +H 1.66000 6.11000 17.07000 +O 8.42000 6.01000 3.85000 +H 8.39000 5.27000 3.25000 +H 7.68000 6.57000 3.58000 +O 16.34000 5.60000 11.35000 +H 16.38000 5.00000 12.09000 +H 17.25000 5.74000 11.10000 +O 2.69000 15.83000 16.72000 +H 2.43000 16.36000 17.47000 +H 2.82000 14.95000 17.08000 +O 7.33000 4.27000 12.17000 +H 6.69000 3.59000 11.98000 +H 7.15000 4.96000 11.53000 +O 9.31000 18.43000 15.30000 +H 10.07000 17.98000 14.93000 +H 8.97000 18.96000 14.58000 +O 5.48000 5.01000 1.57000 +H 5.84000 5.83000 1.92000 +H 4.56000 5.21000 1.41000 +O 1.11000 11.57000 14.62000 +H 1.23000 11.18000 15.49000 +H 1.39000 10.89000 14.01000 +O 14.07000 10.69000 11.74000 +H 13.70000 10.04000 11.14000 +H 13.68000 10.49000 12.59000 +O 13.08000 8.62000 3.01000 +H 12.42000 8.19000 3.55000 +H 12.85000 8.39000 2.12000 +O 17.71000 17.02000 11.19000 +H 18.50000 17.26000 10.70000 +H 17.56000 16.10000 10.96000 +O 1.26000 11.52000 11.01000 +H 1.40000 12.37000 11.41000 +H 0.33000 11.50000 10.80000 +O 7.38000 16.89000 16.63000 +H 6.59000 17.30000 16.27000 +H 8.11000 17.34000 16.20000 +O 8.58000 -0.10000 1.29000 +H 9.20000 0.54000 0.95000 +H 8.61000 0.02000 2.24000 +O 17.37000 1.45000 4.15000 +H 18.00000 1.67000 3.46000 +H 17.52000 0.53000 4.34000 +O 14.34000 15.39000 4.89000 +H 14.88000 15.81000 4.22000 +H 13.80000 16.10000 5.24000 +O 1.15000 17.33000 18.53000 +H 0.62000 16.87000 19.19000 +H 1.76000 17.86000 19.04000 +O 13.06000 9.22000 6.47000 +H 13.83000 8.65000 6.41000 +H 13.26000 9.96000 5.90000 +O 6.78000 16.26000 1.64000 +H 6.96000 16.53000 0.74000 +H 6.28000 15.45000 1.55000 +O 17.60000 18.34000 13.60000 +H 17.38000 17.84000 12.82000 +H 16.79000 18.80000 13.82000 +O 18.45000 1.16000 9.59000 +H 18.71000 0.41000 9.05000 +H 17.56000 1.37000 9.29000 +O 2.73000 3.33000 7.22000 +H 1.90000 3.75000 6.98000 +H 2.63000 3.12000 8.15000 +O 12.36000 15.85000 0.35000 +H 12.24000 14.96000 0.69000 +H 11.61000 15.98000 -0.23000 +O 8.54000 10.22000 14.77000 +H 8.90000 10.46000 13.92000 +H 8.75000 10.96000 15.34000 +O 9.33000 9.19000 3.15000 +H 9.69000 9.30000 2.27000 +H 9.95000 8.61000 3.59000 +O 15.01000 16.67000 0.52000 +H 14.11000 16.38000 0.35000 +H 15.42000 16.73000 -0.34000 +O 3.58000 12.94000 14.62000 +H 3.48000 13.70000 14.05000 +H 2.71000 12.52000 14.61000 +O 10.06000 2.89000 9.63000 +H 10.10000 2.41000 8.80000 +H 9.58000 2.32000 10.22000 +O 5.75000 14.21000 4.56000 +H 5.64000 14.59000 3.69000 +H 4.87000 14.18000 4.92000 +O 17.41000 4.00000 13.56000 +H 18.19000 4.55000 13.55000 +H 17.67000 3.22000 13.06000 +O 2.61000 13.51000 2.41000 +H 1.65000 13.43000 2.44000 +H 2.84000 13.87000 3.27000 +O 1.53000 9.98000 16.81000 +H 0.92000 9.79000 17.52000 +H 2.40000 9.92000 17.21000 +O 6.73000 2.86000 15.05000 +H 7.38000 2.33000 14.58000 +H 7.02000 2.85000 15.96000 +O 0.57000 3.05000 37.17000 +H -0.35000 3.17000 37.40000 +H 0.83000 3.89000 36.78000 +O 14.50000 7.95000 14.83000 +H 13.99000 8.75000 14.73000 +H 15.09000 7.94000 14.09000 +O 0.49000 0.38000 2.38000 +H 0.63000 0.90000 3.17000 +H 1.32000 -0.07000 2.23000 +O 11.73000 13.24000 1.23000 +H 10.78000 13.17000 1.19000 +H 11.93000 13.27000 2.16000 +O 6.54000 8.33000 14.41000 +H 7.16000 9.04000 14.57000 +H 7.08000 7.55000 14.31000 +O 15.43000 18.49000 10.75000 +H 15.59000 19.06000 10.00000 +H 16.23000 17.97000 10.83000 +O 7.08000 5.56000 16.99000 +H 7.64000 6.01000 17.61000 +H 7.20000 4.63000 17.19000 +O 2.97000 17.71000 14.74000 +H 2.21000 18.21000 15.04000 +H 2.99000 16.94000 15.31000 +O 16.03000 8.10000 12.57000 +H 16.13000 7.29000 12.07000 +H 16.36000 8.79000 11.99000 +O 12.54000 3.27000 4.35000 +H 13.22000 2.59000 4.31000 +H 12.74000 3.76000 5.15000 +O 5.58000 7.19000 6.55000 +H 6.11000 7.99000 6.47000 +H 4.97000 7.23000 5.81000 +O 17.80000 3.36000 16.22000 +H 17.55000 3.63000 15.33000 +H 17.05000 2.86000 16.54000 +O 8.93000 13.56000 0.91000 +H 8.61000 13.49000 1.81000 +H 8.93000 14.49000 0.72000 +O 8.64000 9.56000 8.36000 +H 9.36000 9.10000 8.81000 +H 8.23000 10.08000 9.05000 +O 10.32000 9.34000 0.63000 +H 10.30000 10.07000 0.01000 +H 11.20000 8.96000 0.52000 +O 18.60000 15.86000 8.32000 +H 17.89000 15.79000 7.68000 +H 18.36000 15.23000 9.00000 +O 2.54000 13.49000 18.29000 +H 1.60000 13.35000 18.19000 +H 2.71000 13.37000 19.22000 +O 1.89000 12.34000 6.94000 +H 2.07000 11.73000 7.65000 +H 2.08000 11.84000 6.14000 +O 6.78000 14.65000 18.21000 +H 6.19000 14.12000 17.67000 +H 7.02000 15.39000 17.65000 +O 17.83000 1.58000 12.28000 +H 17.25000 0.82000 12.33000 +H 18.22000 1.54000 11.41000 +O 3.94000 4.46000 4.87000 +H 4.48000 3.78000 4.47000 +H 3.70000 4.10000 5.73000 +O 17.40000 14.42000 10.39000 +H 16.59000 14.12000 9.99000 +H 17.66000 13.71000 10.98000 +O 3.88000 6.04000 12.55000 +H 4.25000 5.30000 13.04000 +H 3.76000 5.70000 11.67000 +O 13.91000 2.07000 10.82000 +H 13.57000 1.18000 10.72000 +H 13.52000 2.39000 11.63000 +O 8.72000 1.02000 11.16000 +H 7.85000 0.75000 10.88000 +H 9.19000 0.20000 11.33000 +O 7.98000 13.05000 3.42000 +H 7.72000 12.14000 3.51000 +H 7.38000 13.54000 3.98000 +O 13.99000 27.63000 2.04000 +H 14.24000 26.83000 1.59000 +H 13.06000 27.51000 2.25000 +O 13.07000 4.69000 6.66000 +H 12.62000 5.53000 6.61000 +H 12.93000 4.39000 7.56000 +O 15.89000 1.70000 8.80000 +H 15.23000 1.83000 9.48000 +H 15.85000 2.51000 8.28000 +O 0.35000 10.58000 2.62000 +H 1.18000 10.20000 2.33000 +H 0.26000 10.29000 3.52000 +O 9.15000 16.84000 3.09000 +H 8.32000 16.58000 2.69000 +H 8.90000 17.40000 3.83000 +O 1.98000 7.25000 19.85000 +H 1.70000 6.74000 20.61000 +H 1.98000 6.63000 19.13000 +O 2.00000 2.61000 28.63000 +H 2.20000 2.19000 29.47000 +H 1.07000 2.45000 28.49000 +O 0.62000 4.17000 24.83000 +H -0.33000 4.10000 24.82000 +H 0.91000 3.54000 24.17000 +O 5.57000 13.09000 30.64000 +H 4.73000 13.12000 30.19000 +H 5.80000 14.01000 30.77000 +O 16.20000 16.15000 25.12000 +H 15.49000 16.00000 25.74000 +H 15.93000 15.67000 24.33000 +O 16.88000 6.29000 20.56000 +H 17.16000 5.95000 19.71000 +H 16.72000 5.52000 21.09000 +O 7.15000 11.04000 29.63000 +H 6.50000 11.54000 30.12000 +H 7.64000 11.70000 29.14000 +O 8.95000 7.29000 36.74000 +H 9.22000 7.96000 37.37000 +H 9.03000 7.71000 35.89000 +O 7.49000 9.83000 25.13000 +H 8.14000 10.48000 25.41000 +H 6.65000 10.23000 25.37000 +O 7.29000 11.62000 37.03000 +H 7.80000 12.31000 37.46000 +H 6.57000 12.08000 36.60000 +O 3.08000 14.04000 29.26000 +H 2.35000 14.01000 28.64000 +H 3.74000 14.59000 28.84000 +O 14.57000 15.49000 32.46000 +H 15.13000 16.25000 32.60000 +H 13.88000 15.58000 33.12000 +O 4.59000 3.78000 32.69000 +H 5.41000 3.54000 33.11000 +H 4.16000 2.94000 32.50000 +O 16.23000 4.45000 25.69000 +H 15.29000 4.31000 25.76000 +H 16.31000 5.36000 25.40000 +O 1.88000 16.53000 22.79000 +H 1.47000 17.14000 23.40000 +H 2.70000 16.96000 22.53000 +O 11.25000 13.41000 35.75000 +H 11.60000 13.29000 36.63000 +H 10.76000 12.60000 35.58000 +O 3.29000 14.33000 23.58000 +H 2.74000 15.10000 23.45000 +H 2.89000 13.87000 24.32000 +O 2.90000 10.60000 27.32000 +H 2.92000 9.65000 27.43000 +H 2.44000 10.92000 28.09000 +O 5.55000 18.23000 32.35000 +H 4.74000 18.08000 32.83000 +H 5.97000 18.96000 32.81000 +O 5.78000 9.73000 20.12000 +H 6.17000 10.29000 19.45000 +H 6.23000 9.98000 20.93000 +O 15.16000 1.83000 32.94000 +H 15.77000 2.42000 32.51000 +H 15.08000 2.18000 33.83000 +O 1.54000 6.75000 24.59000 +H 1.27000 5.87000 24.84000 +H 1.21000 7.31000 25.29000 +O 18.45000 17.45000 21.80000 +H 19.13000 17.08000 22.38000 +H 18.75000 18.34000 21.62000 +O 0.05000 16.09000 20.80000 +H 0.01000 15.13000 20.75000 +H 0.72000 16.27000 21.46000 +O 17.50000 8.80000 24.33000 +H 16.89000 8.09000 24.53000 +H 17.31000 9.04000 23.43000 +O 2.07000 7.44000 34.39000 +H 3.01000 7.41000 34.58000 +H 1.81000 8.34000 34.59000 +O 5.99000 13.53000 26.58000 +H 5.69000 12.67000 26.29000 +H 6.10000 14.03000 25.77000 +O 12.93000 12.77000 33.18000 +H 13.70000 12.70000 32.61000 +H 13.28000 12.59000 34.06000 +O 8.97000 0.28000 23.79000 +H 9.38000 1.08000 23.47000 +H 8.03000 0.43000 23.69000 +O 1.47000 9.52000 31.58000 +H 2.34000 9.12000 31.56000 +H 1.39000 9.98000 30.74000 +O 11.90000 18.29000 34.95000 +H 11.97000 18.82000 34.16000 +H 12.03000 17.39000 34.65000 +O 3.32000 2.94000 35.83000 +H 4.23000 3.06000 36.11000 +H 2.85000 2.78000 36.65000 +O 16.57000 18.48000 23.73000 +H 17.06000 18.02000 23.05000 +H 16.43000 17.83000 24.41000 +O 5.37000 6.98000 21.01000 +H 5.43000 7.89000 20.71000 +H 4.93000 7.04000 21.85000 +O 12.59000 4.31000 28.08000 +H 11.75000 3.85000 28.04000 +H 13.21000 3.66000 28.41000 +O 15.90000 17.13000 20.77000 +H 16.83000 17.26000 20.98000 +H 15.62000 16.43000 21.35000 +O 7.61000 5.91000 32.93000 +H 7.43000 5.63000 33.83000 +H 7.37000 5.15000 32.39000 +O 13.90000 4.71000 35.18000 +H 13.98000 5.19000 36.00000 +H 14.33000 3.87000 35.34000 +O 9.33000 8.66000 34.35000 +H 9.84000 8.00000 33.87000 +H 8.89000 9.16000 33.67000 +O 9.86000 4.05000 30.83000 +H 8.92000 4.14000 30.96000 +H 9.95000 3.67000 29.96000 +O 10.23000 6.56000 22.81000 +H 10.06000 6.06000 23.61000 +H 9.47000 6.41000 22.26000 +O 0.49000 8.19000 26.84000 +H 1.34000 8.11000 27.27000 +H -0.06000 8.64000 27.49000 +O 0.80000 18.64000 34.89000 +H 1.00000 18.29000 35.75000 +H -0.14000 18.84000 34.92000 +O 8.55000 3.54000 20.59000 +H 9.02000 3.95000 19.86000 +H 8.04000 2.84000 20.18000 +O 16.78000 5.59000 36.77000 +H 16.53000 6.38000 36.28000 +H 17.10000 4.99000 36.09000 +O 5.75000 2.36000 27.39000 +H 5.61000 2.39000 28.33000 +H 5.33000 3.15000 27.05000 +O 3.49000 18.08000 27.42000 +H 4.02000 17.30000 27.59000 +H 4.06000 18.81000 27.65000 +O 12.14000 15.62000 34.00000 +H 12.09000 14.89000 34.62000 +H 11.60000 15.34000 33.26000 +O 3.10000 9.50000 21.04000 +H 3.92000 9.72000 20.60000 +H 2.79000 8.72000 20.60000 +O 4.96000 12.89000 35.99000 +H 4.75000 12.88000 35.06000 +H 4.11000 12.86000 36.42000 +O 1.72000 2.86000 33.52000 +H 1.67000 3.76000 33.20000 +H 2.34000 2.91000 34.26000 +O 4.38000 17.36000 21.89000 +H 4.99000 17.87000 22.42000 +H 4.92000 16.64000 21.54000 +O 14.60000 1.28000 22.83000 +H 14.44000 0.68000 22.11000 +H 15.55000 1.36000 22.89000 +O 1.95000 17.73000 30.87000 +H 2.61000 17.07000 31.06000 +H 1.60000 17.50000 30.01000 +O 9.09000 17.05000 27.90000 +H 9.09000 16.43000 28.63000 +H 8.89000 16.51000 27.13000 +O 4.21000 6.78000 23.56000 +H 4.32000 5.83000 23.66000 +H 3.33000 6.96000 23.89000 +O 14.87000 2.18000 35.70000 +H 15.16000 2.25000 36.61000 +H 14.60000 1.26000 35.61000 +O 6.96000 1.33000 19.75000 +H 7.49000 0.61000 20.08000 +H 6.32000 0.92000 19.17000 +O 7.49000 2.92000 36.58000 +H 8.33000 2.45000 36.59000 +H 6.94000 2.43000 37.19000 +O 8.78000 15.34000 30.21000 +H 8.53000 14.60000 29.66000 +H 9.49000 15.01000 30.75000 +O 13.27000 5.57000 32.62000 +H 13.57000 5.38000 33.51000 +H 14.05000 5.87000 32.16000 +O 8.03000 13.39000 28.44000 +H 8.80000 13.25000 27.89000 +H 7.31000 13.54000 27.83000 +O 8.96000 5.07000 27.66000 +H 8.44000 4.58000 27.03000 +H 9.50000 4.41000 28.09000 +O 6.34000 0.69000 23.23000 +H 5.59000 0.66000 23.83000 +H 6.11000 1.39000 22.61000 +O 3.24000 0.47000 21.04000 +H 3.92000 1.12000 21.22000 +H 3.38000 -0.22000 21.69000 +O 10.00000 2.55000 22.73000 +H 9.51000 3.04000 22.07000 +H 10.88000 2.92000 22.71000 +O 10.70000 6.69000 32.87000 +H 10.17000 5.89000 32.84000 +H 11.60000 6.39000 32.75000 +O 13.93000 15.63000 26.61000 +H 13.48000 16.43000 26.35000 +H 13.47000 15.33000 27.39000 +O 5.06000 11.05000 25.60000 +H 4.39000 10.88000 26.25000 +H 4.59000 11.09000 24.77000 +O 12.79000 17.98000 25.65000 +H 13.09000 18.56000 24.95000 +H 11.97000 18.38000 25.96000 +O 10.16000 5.31000 19.09000 +H 9.73000 6.16000 19.10000 +H 10.88000 5.39000 19.72000 +O 1.49000 5.46000 32.53000 +H 2.30000 5.61000 32.05000 +H 1.44000 6.19000 33.15000 +O 5.40000 2.08000 30.11000 +H 5.66000 1.16000 30.06000 +H 4.50000 2.05000 30.43000 +O 8.79000 5.36000 24.78000 +H 7.93000 5.78000 24.67000 +H 8.58000 4.44000 24.95000 +O 9.65000 0.74000 26.43000 +H 9.54000 0.46000 25.52000 +H 9.89000 -0.06000 26.90000 +O 13.45000 6.69000 29.23000 +H 13.16000 5.86000 28.85000 +H 14.17000 6.45000 29.81000 +O 19.34000 7.45000 21.39000 +H 19.60000 6.97000 22.17000 +H 18.43000 7.19000 21.24000 +O 6.05000 15.26000 20.85000 +H 6.17000 15.07000 19.92000 +H 6.30000 14.45000 21.29000 +O 14.28000 6.28000 19.31000 +H 13.54000 6.11000 19.90000 +H 15.03000 6.37000 19.90000 +O 5.20000 2.49000 21.47000 +H 5.84000 2.15000 20.85000 +H 4.87000 3.29000 21.07000 +O 17.45000 12.42000 34.54000 +H 18.29000 12.05000 34.27000 +H 17.61000 13.36000 34.61000 +O 10.66000 13.97000 32.11000 +H 9.84000 13.55000 32.37000 +H 11.34000 13.42000 32.49000 +O 16.29000 16.62000 35.39000 +H 16.18000 17.03000 34.54000 +H 16.99000 15.99000 35.27000 +O 8.83000 1.15000 32.76000 +H 9.01000 1.29000 31.83000 +H 9.69000 1.13000 33.17000 +O 9.77000 11.01000 35.82000 +H 8.90000 11.21000 36.15000 +H 9.65000 10.23000 35.28000 +O 7.33000 10.36000 22.32000 +H 7.31000 10.17000 23.26000 +H 8.13000 9.93000 22.01000 +O 4.02000 8.49000 31.49000 +H 4.72000 8.54000 32.14000 +H 3.89000 7.55000 31.36000 +O 12.38000 3.19000 31.49000 +H 12.80000 3.97000 31.84000 +H 11.50000 3.47000 31.25000 +O 0.88000 15.82000 32.71000 +H 0.81000 16.68000 32.29000 +H 1.80000 15.59000 32.62000 +O 3.50000 11.19000 23.22000 +H 3.58000 11.94000 22.64000 +H 3.40000 10.44000 22.63000 +O 5.34000 5.13000 26.92000 +H 5.63000 5.62000 26.15000 +H 5.83000 5.51000 27.65000 +O 12.60000 15.30000 30.46000 +H 13.36000 15.23000 31.04000 +H 11.95000 14.72000 30.86000 +O 3.42000 15.29000 31.69000 +H 3.25000 14.83000 30.87000 +H 4.35000 15.51000 31.64000 +O 4.77000 7.19000 35.15000 +H 5.21000 7.65000 34.44000 +H 5.38000 6.51000 35.43000 +O 15.99000 7.96000 35.53000 +H 15.12000 8.36000 35.55000 +H 16.45000 8.43000 34.84000 +O 9.87000 1.45000 36.51000 +H 10.45000 2.19000 36.31000 +H 10.15000 0.76000 35.91000 +O 4.74000 0.39000 36.19000 +H 4.68000 -0.49000 35.82000 +H 4.14000 0.92000 35.66000 +O 5.44000 8.79000 29.16000 +H 5.97000 9.59000 29.18000 +H 4.94000 8.82000 29.97000 +O 12.17000 5.54000 21.03000 +H 12.48000 4.77000 21.50000 +H 11.74000 6.07000 21.70000 +O 2.85000 1.74000 31.20000 +H 2.29000 1.97000 31.94000 +H 3.18000 0.87000 31.41000 +O -0.22000 13.43000 31.84000 +H 0.24000 12.81000 32.41000 +H 0.12000 14.29000 32.09000 +O 6.65000 6.26000 29.01000 +H 7.58000 6.32000 28.79000 +H 6.36000 7.17000 29.08000 +O 17.30000 9.31000 0.25000 +H 16.81000 8.79000 -0.38000 +H 16.64000 9.60000 0.89000 +O 3.95000 0.90000 24.49000 +H 3.57000 1.25000 25.30000 +H 3.54000 0.04000 24.39000 +O 16.25000 4.03000 22.10000 +H 16.73000 3.29000 22.48000 +H 16.00000 4.57000 22.86000 +O 9.95000 15.80000 36.35000 +H 9.60000 16.32000 35.62000 +H 10.16000 14.95000 35.97000 +O 18.44000 15.05000 34.48000 +H 18.71000 15.18000 33.57000 +H 19.24000 15.16000 34.99000 +O 3.79000 9.00000 36.99000 +H 4.52000 9.35000 37.50000 +H 4.19000 8.35000 36.41000 +O 15.35000 2.43000 19.82000 +H 14.98000 1.64000 20.21000 +H 15.59000 2.98000 20.57000 +O 10.07000 12.90000 26.81000 +H 9.97000 13.07000 25.87000 +H 11.02000 12.85000 26.94000 +O 3.08000 7.90000 27.93000 +H 3.94000 8.14000 28.27000 +H 3.00000 6.97000 28.13000 +O 3.07000 5.13000 28.50000 +H 2.66000 4.27000 28.50000 +H 3.75000 5.07000 27.83000 +O 11.40000 3.55000 35.57000 +H 10.98000 4.09000 36.23000 +H 12.22000 4.00000 35.37000 +O 11.55000 1.58000 33.61000 +H 11.48000 2.25000 34.29000 +H 11.91000 2.04000 32.85000 +O 25.51000 13.28000 20.83000 +H 25.34000 13.33000 19.89000 +H 25.63000 12.35000 21.00000 +O 1.17000 16.80000 28.31000 +H 1.32000 15.94000 27.91000 +H 1.82000 17.37000 27.89000 +O 4.88000 15.63000 28.02000 +H 5.54000 16.32000 28.13000 +H 5.32000 14.96000 27.49000 +O 8.86000 7.53000 30.94000 +H 9.70000 7.46000 31.40000 +H 8.27000 6.97000 31.44000 +O 0.49000 5.67000 29.75000 +H 1.38000 5.61000 29.39000 +H 0.60000 5.58000 30.70000 +O 1.71000 5.32000 36.12000 +H 2.44000 4.88000 35.68000 +H 1.58000 6.13000 35.61000 +O 13.68000 9.52000 35.57000 +H 14.10000 10.38000 35.54000 +H 13.06000 9.53000 34.84000 +O 7.94000 6.06000 21.53000 +H 7.97000 5.13000 21.27000 +H 7.04000 6.33000 21.33000 +O 15.61000 5.72000 30.87000 +H 15.97000 4.94000 31.30000 +H 16.37000 6.11000 30.43000 +O 2.90000 15.69000 35.64000 +H 2.40000 16.16000 36.31000 +H 2.86000 14.78000 35.91000 +O 7.12000 4.18000 30.79000 +H 6.52000 3.45000 30.65000 +H 6.82000 4.85000 30.17000 +O 8.68000 17.17000 34.17000 +H 8.34000 16.57000 33.50000 +H 8.92000 17.96000 33.68000 +O 4.52000 4.60000 19.74000 +H 4.83000 5.46000 20.03000 +H 3.66000 4.50000 20.15000 +O 1.37000 11.65000 33.30000 +H 1.38000 11.23000 34.16000 +H 1.45000 10.93000 32.68000 +O 17.44000 17.21000 30.09000 +H 18.14000 17.33000 29.45000 +H 17.29000 16.26000 30.11000 +O 12.44000 17.95000 29.79000 +H 13.35000 18.13000 29.55000 +H 12.43000 17.01000 29.98000 +O 1.45000 11.44000 29.51000 +H 1.79000 12.29000 29.81000 +H 0.51000 11.58000 29.41000 +O 6.93000 16.92000 36.31000 +H 6.21000 17.53000 36.16000 +H 7.59000 17.17000 35.67000 +O 17.43000 1.45000 22.75000 +H 17.99000 1.60000 21.98000 +H 17.56000 0.52000 22.97000 +O 1.23000 17.29000 -0.10000 +H 0.72000 16.87000 0.59000 +H 1.86000 17.83000 0.38000 +O 7.99000 13.06000 32.74000 +H 7.77000 13.51000 33.55000 +H 7.23000 13.20000 32.17000 +O 16.32000 17.63000 32.73000 +H 16.74000 17.64000 31.88000 +H 16.05000 18.54000 32.88000 +O 18.58000 1.15000 28.28000 +H 18.79000 0.46000 27.65000 +H 17.74000 1.51000 27.97000 +O 2.90000 3.07000 26.08000 +H 2.11000 3.48000 25.73000 +H 2.65000 2.76000 26.94000 +O 8.01000 10.28000 32.48000 +H 7.99000 10.28000 31.53000 +H 8.06000 11.21000 32.72000 +O 9.49000 8.87000 21.48000 +H 9.31000 8.48000 20.63000 +H 9.84000 8.15000 22.00000 +O 3.76000 13.12000 33.56000 +H 3.67000 13.90000 33.01000 +H 2.94000 12.64000 33.43000 +O 15.38000 12.91000 31.94000 +H 16.33000 12.78000 32.01000 +H 15.25000 13.84000 32.10000 +O 10.29000 2.72000 28.34000 +H 10.08000 2.20000 27.57000 +H 10.37000 2.08000 29.05000 +O 5.96000 14.86000 24.18000 +H 6.43000 14.34000 23.53000 +H 5.05000 14.82000 23.91000 +O 17.26000 3.65000 32.26000 +H 17.98000 4.28000 32.24000 +H 17.57000 2.92000 31.74000 +O 2.72000 13.25000 21.08000 +H 1.77000 13.33000 21.18000 +H 3.08000 13.79000 21.79000 +O 1.57000 9.99000 35.51000 +H 1.02000 9.60000 36.19000 +H 2.45000 10.02000 35.89000 +O 6.89000 2.88000 33.84000 +H 7.54000 2.30000 33.45000 +H 7.10000 2.88000 34.77000 +O 0.61000 2.96000 18.66000 +H -0.27000 2.79000 18.99000 +H 0.56000 3.85000 18.31000 +O 0.46000 0.37000 21.30000 +H 0.20000 0.51000 22.22000 +H 1.41000 0.43000 21.31000 +O 6.22000 8.29000 33.12000 +H 6.81000 9.03000 32.98000 +H 6.77000 7.51000 33.02000 +O 15.09000 18.53000 29.28000 +H 15.38000 18.96000 28.47000 +H 15.87000 18.08000 29.60000 +O 7.00000 5.57000 35.70000 +H 7.62000 6.13000 36.17000 +H 7.13000 4.70000 36.08000 +O 14.75000 12.03000 35.29000 +H 14.72000 12.28000 36.21000 +H 15.65000 12.22000 35.02000 +O 3.32000 17.80000 33.96000 +H 2.46000 18.20000 34.05000 +H 3.24000 16.95000 34.38000 +O 12.69000 3.39000 22.77000 +H 13.30000 2.65000 22.74000 +H 12.94000 3.86000 23.56000 +O 6.58000 7.08000 25.03000 +H 6.81000 8.01000 25.09000 +H 5.79000 7.06000 24.48000 +O 17.72000 3.43000 35.06000 +H 17.42000 3.52000 34.15000 +H 17.36000 2.59000 35.34000 +O 17.08000 9.70000 33.71000 +H 16.95000 10.60000 34.01000 +H 17.89000 9.73000 33.21000 +O 6.43000 17.84000 28.09000 +H 6.23000 18.75000 27.88000 +H 7.38000 17.77000 27.96000 +O 8.57000 8.75000 28.55000 +H 8.70000 8.35000 29.41000 +H 8.12000 9.57000 28.73000 +O 2.46000 13.22000 37.03000 +H 1.53000 13.14000 36.84000 +H 2.51000 13.27000 37.99000 +O 2.25000 12.42000 25.36000 +H 2.35000 11.79000 26.08000 +H 2.52000 11.94000 24.58000 +O 7.11000 14.40000 34.99000 +H 6.33000 13.96000 35.33000 +H 7.14000 15.23000 35.47000 +O 17.89000 1.33000 30.96000 +H 17.28000 0.59000 30.95000 +H 18.30000 1.32000 30.10000 +O 4.54000 4.12000 23.99000 +H 4.83000 3.36000 23.47000 +H 4.10000 3.73000 24.75000 +O 3.79000 5.82000 31.10000 +H 4.21000 5.12000 31.60000 +H 3.74000 5.48000 30.21000 +O 8.30000 15.57000 25.69000 +H 7.48000 15.70000 25.21000 +H 8.73000 14.86000 25.22000 +O 13.93000 2.20000 29.26000 +H 13.71000 1.27000 29.15000 +H 13.56000 2.43000 30.11000 +O 10.47000 0.92000 30.36000 +H 10.09000 0.04000 30.33000 +H 11.33000 0.80000 30.76000 +O 7.28000 13.23000 22.39000 +H 7.26000 12.28000 22.25000 +H 8.11000 13.38000 22.85000 +O 6.17000 15.77000 31.23000 +H 6.04000 16.66000 31.55000 +H 7.04000 15.78000 30.84000 +O 14.11000 27.78000 20.49000 +H 14.35000 26.89000 20.24000 +H 13.18000 27.85000 20.28000 +O 16.22000 2.25000 27.55000 +H 15.45000 2.33000 28.11000 +H 16.25000 3.07000 27.07000 +O 0.60000 10.66000 21.41000 +H 1.51000 10.42000 21.25000 +H 0.40000 10.30000 22.28000 +O 2.64000 24.26000 1.14000 +H 2.06000 24.39000 1.89000 +H 2.62000 25.10000 0.68000 +O 1.94000 21.53000 9.86000 +H 2.22000 21.12000 10.68000 +H 1.00000 21.38000 9.83000 +O 0.37000 22.82000 6.10000 +H -0.59000 22.82000 6.07000 +H 0.63000 22.20000 5.41000 +O 11.69000 25.72000 6.63000 +H 12.23000 26.50000 6.46000 +H 11.28000 25.90000 7.47000 +O 17.95000 24.76000 2.06000 +H 17.60000 24.80000 1.17000 +H 17.44000 24.07000 2.48000 +O 8.84000 25.76000 18.82000 +H 8.78000 26.24000 19.64000 +H 9.08000 26.42000 18.17000 +O 7.27000 0.47000 7.82000 +H 8.19000 0.70000 7.64000 +H 6.83000 1.31000 7.91000 +O 4.17000 22.68000 14.84000 +H 5.03000 22.27000 14.94000 +H 3.64000 22.01000 14.40000 +O 15.79000 23.01000 7.56000 +H 14.96000 23.06000 7.09000 +H 15.99000 23.91000 7.81000 +O 15.82000 20.27000 14.47000 +H 15.75000 21.15000 14.08000 +H 15.53000 20.39000 15.37000 +O 1.70000 25.28000 5.84000 +H 1.15000 24.54000 6.09000 +H 1.58000 25.93000 6.53000 +O 2.10000 26.21000 15.98000 +H 3.05000 26.29000 16.10000 +H 1.74000 26.95000 16.46000 +O 8.41000 18.83000 4.90000 +H 8.81000 19.68000 4.71000 +H 7.47000 19.00000 4.85000 +O 2.78000 20.91000 17.73000 +H 3.03000 21.81000 17.54000 +H 1.92000 20.98000 18.15000 +O 6.03000 26.26000 3.03000 +H 6.46000 27.05000 3.34000 +H 5.39000 26.04000 3.70000 +O 8.20000 24.88000 14.77000 +H 7.79000 24.64000 15.60000 +H 7.87000 24.23000 14.14000 +O 13.61000 23.36000 17.55000 +H 13.66000 24.08000 18.17000 +H 14.28000 22.74000 17.85000 +O 10.77000 25.51000 3.95000 +H 10.93000 25.58000 4.89000 +H 9.84000 25.30000 3.88000 +O 1.78000 27.10000 8.00000 +H 2.40000 26.94000 8.71000 +H 0.92000 27.06000 8.42000 +O 8.73000 22.15000 1.90000 +H 9.22000 22.56000 1.19000 +H 8.69000 21.22000 1.65000 +O 16.85000 24.67000 18.29000 +H 16.51000 25.35000 17.70000 +H 17.08000 23.95000 17.70000 +O 15.42000 26.45000 7.63000 +H 15.09000 26.05000 8.43000 +H 15.98000 27.17000 7.93000 +O 1.66000 21.21000 14.96000 +H 1.81000 21.93000 15.57000 +H 1.63000 20.42000 15.51000 +O 13.92000 19.82000 4.49000 +H 13.93000 19.54000 3.58000 +H 14.72000 19.45000 4.86000 +O 4.29000 25.54000 4.97000 +H 4.51000 24.62000 5.11000 +H 3.36000 25.59000 5.19000 +O 15.14000 20.71000 17.14000 +H 15.25000 20.90000 18.07000 +H 14.29000 20.28000 17.08000 +O 6.31000 19.91000 0.85000 +H 7.17000 19.54000 1.04000 +H 5.91000 19.30000 0.23000 +O 7.84000 21.57000 17.44000 +H 8.48000 20.90000 17.19000 +H 7.84000 21.56000 18.40000 +O 12.88000 24.21000 15.02000 +H 13.16000 23.91000 15.89000 +H 13.37000 25.02000 14.87000 +O 5.72000 19.36000 4.80000 +H 4.96000 19.44000 5.38000 +H 5.67000 20.13000 4.23000 +O 2.83000 18.81000 1.56000 +H 3.03000 19.74000 1.64000 +H 3.54000 18.36000 2.01000 +O 9.51000 21.35000 4.41000 +H 9.22000 21.69000 3.56000 +H 10.45000 21.52000 4.42000 +O 10.73000 25.84000 14.26000 +H 9.88000 25.52000 14.53000 +H 11.34000 25.14000 14.50000 +O 10.28000 23.55000 0.09000 +H 9.76000 24.34000 -0.03000 +H 10.90000 23.78000 0.79000 +O 1.29000 25.48000 13.45000 +H 2.14000 25.17000 13.13000 +H 1.45000 25.71000 14.37000 +O 5.08000 21.53000 11.96000 +H 5.65000 20.85000 11.58000 +H 4.22000 21.12000 12.00000 +O 8.16000 23.32000 5.93000 +H 8.01000 23.85000 5.15000 +H 8.47000 22.48000 5.59000 +O 8.75000 19.49000 7.61000 +H 8.66000 19.16000 6.72000 +H 7.85000 19.54000 7.94000 +O 14.55000 25.08000 9.89000 +H 14.01000 24.28000 9.85000 +H 15.22000 24.88000 10.54000 +O 17.98000 26.60000 4.17000 +H 18.69000 26.20000 4.68000 +H 18.02000 26.15000 3.32000 +O 14.15000 25.02000 0.92000 +H 13.48000 24.54000 1.40000 +H 14.96000 24.55000 1.10000 +O 5.51000 21.42000 3.06000 +H 5.79000 20.91000 2.30000 +H 5.47000 22.33000 2.74000 +O 8.33000 20.16000 13.34000 +H 7.78000 19.92000 12.59000 +H 8.87000 20.88000 13.01000 +O 4.25000 27.36000 13.08000 +H 5.12000 27.35000 13.49000 +H 4.05000 26.43000 12.94000 +O 6.02000 23.96000 8.85000 +H 5.89000 24.66000 8.21000 +H 6.47000 23.27000 8.35000 +O 15.89000 25.06000 5.16000 +H 15.57000 25.51000 5.95000 +H 16.54000 25.66000 4.79000 +O 4.92000 26.25000 16.31000 +H 5.44000 26.58000 15.59000 +H 5.41000 25.50000 16.64000 +O 16.00000 26.84000 16.63000 +H 15.21000 26.75000 16.09000 +H 16.67000 27.13000 16.02000 +O 9.97000 19.23000 17.83000 +H 10.53000 20.00000 17.68000 +H 9.77000 18.91000 16.95000 +O 4.85000 19.12000 18.00000 +H 5.08000 18.80000 17.13000 +H 4.08000 19.67000 17.86000 +O 6.26000 27.75000 10.33000 +H 6.55000 27.89000 9.43000 +H 5.38000 27.39000 10.26000 +O 13.04000 27.40000 10.31000 +H 12.23000 27.19000 9.86000 +H 13.58000 26.61000 10.21000 +O 12.05000 23.84000 2.25000 +H 12.15000 23.08000 2.83000 +H 11.63000 24.50000 2.81000 +O 2.41000 20.57000 12.39000 +H 2.10000 20.80000 13.26000 +H 2.17000 19.65000 12.28000 +O 7.36000 25.23000 10.97000 +H 7.06000 24.71000 10.22000 +H 6.94000 26.08000 10.86000 +O 17.86000 0.55000 18.14000 +H 17.21000 -0.15000 18.08000 +H 17.94000 0.72000 19.08000 +O 3.37000 19.65000 6.26000 +H 3.23000 20.47000 6.73000 +H 3.48000 18.99000 6.94000 +O 16.17000 22.97000 3.31000 +H 16.60000 22.26000 3.79000 +H 15.93000 23.60000 3.98000 +O 10.54000 26.44000 9.12000 +H 10.35000 26.54000 10.06000 +H 9.99000 25.71000 8.84000 +O 14.99000 21.55000 1.16000 +H 14.60000 20.76000 1.55000 +H 15.38000 22.02000 1.90000 +O 3.95000 26.42000 9.59000 +H 4.42000 26.31000 8.76000 +H 3.77000 25.53000 9.90000 +O 3.59000 23.74000 10.21000 +H 3.14000 22.91000 10.08000 +H 4.45000 23.61000 9.81000 +O 11.30000 21.72000 17.35000 +H 10.74000 22.21000 17.95000 +H 12.12000 22.20000 17.33000 +O 11.25000 21.98000 14.44000 +H 11.08000 21.76000 15.35000 +H 11.83000 22.75000 14.48000 +O 9.76000 26.46000 11.74000 +H 10.15000 26.28000 12.59000 +H 9.00000 25.87000 11.69000 +O 0.80000 24.51000 10.74000 +H 1.72000 24.29000 10.58000 +H 0.80000 24.85000 11.63000 +O 2.18000 23.48000 16.59000 +H 2.97000 23.38000 16.06000 +H 1.97000 24.41000 16.55000 +O 8.21000 24.51000 3.43000 +H 8.17000 23.76000 2.83000 +H 7.48000 25.06000 3.16000 +O 16.49000 24.49000 11.76000 +H 16.53000 23.90000 12.51000 +H 17.36000 24.44000 11.37000 +O 7.06000 23.25000 12.90000 +H 6.40000 22.62000 12.62000 +H 7.13000 23.87000 12.17000 +O 5.29000 23.88000 1.82000 +H 5.59000 24.73000 2.12000 +H 4.39000 24.03000 1.52000 +O 9.02000 19.48000 1.14000 +H 9.40000 19.56000 0.26000 +H 9.65000 18.93000 1.61000 +O 17.57000 20.81000 4.46000 +H 18.16000 20.55000 3.76000 +H 17.18000 19.99000 4.77000 +O 13.29000 0.01000 6.46000 +H 14.05000 -0.37000 6.90000 +H 13.65000 0.54000 5.76000 +O 18.37000 20.12000 9.92000 +H 18.78000 19.28000 9.70000 +H 17.60000 20.17000 9.34000 +O 2.76000 22.06000 7.30000 +H 1.96000 22.46000 6.95000 +H 2.57000 21.91000 8.22000 +O 17.49000 22.81000 13.92000 +H 18.25000 23.39000 13.89000 +H 17.78000 22.02000 13.46000 +O 0.82000 0.39000 17.44000 +H -0.11000 0.32000 17.21000 +H 0.91000 1.27000 17.81000 +O 6.38000 21.08000 15.13000 +H 7.04000 20.92000 14.46000 +H 6.88000 21.29000 15.91000 +O 0.67000 21.69000 37.11000 +H -0.27000 21.75000 37.32000 +H 0.84000 22.45000 36.55000 +O 13.73000 26.92000 14.82000 +H 12.79000 27.02000 14.67000 +H 14.09000 27.79000 14.63000 +O 0.26000 19.40000 2.41000 +H 0.44000 19.82000 3.25000 +H 1.11000 19.06000 2.13000 +O 6.71000 27.17000 14.35000 +H 7.33000 27.90000 14.26000 +H 7.27000 26.40000 14.39000 +O 6.97000 24.33000 17.18000 +H 7.48000 24.73000 17.88000 +H 7.09000 23.39000 17.29000 +O 16.30000 27.16000 12.57000 +H 16.38000 26.27000 12.22000 +H 15.36000 27.31000 12.63000 +O 12.26000 22.01000 4.39000 +H 12.79000 21.21000 4.39000 +H 12.66000 22.56000 5.06000 +O 5.53000 26.23000 7.36000 +H 6.16000 26.95000 7.29000 +H 5.18000 26.13000 6.47000 +O 17.42000 22.35000 16.77000 +H 17.46000 22.51000 15.82000 +H 16.69000 21.74000 16.88000 +O 17.88000 -0.19000 14.76000 +H 18.31000 0.63000 14.51000 +H 17.35000 -0.42000 13.99000 +O 18.57000 20.67000 12.59000 +H 18.25000 19.86000 12.98000 +H 18.40000 20.58000 11.65000 +O 4.72000 22.93000 5.47000 +H 4.94000 22.22000 4.87000 +H 4.13000 22.53000 6.11000 +O 3.82000 24.62000 12.85000 +H 4.12000 23.99000 13.51000 +H 3.93000 24.16000 12.01000 +O 13.88000 19.06000 1.84000 +H 14.32000 18.33000 1.40000 +H 12.96000 18.79000 1.86000 +O 13.19000 23.40000 6.67000 +H 12.78000 24.25000 6.53000 +H 12.58000 22.94000 7.25000 +O 16.09000 20.30000 8.36000 +H 15.80000 19.89000 7.54000 +H 15.98000 21.24000 8.21000 +O 3.04000 24.33000 20.43000 +H 3.07000 24.76000 21.29000 +H 2.76000 25.02000 19.83000 +O 1.56000 21.41000 29.04000 +H 2.04000 20.96000 29.73000 +H 0.64000 21.36000 29.30000 +O 25.05000 22.27000 26.10000 +H 24.95000 23.05000 26.64000 +H 24.45000 22.41000 25.36000 +O 11.56000 25.81000 25.22000 +H 12.17000 26.52000 25.03000 +H 11.18000 26.03000 26.07000 +O 18.26000 24.65000 20.63000 +H 17.84000 24.77000 19.78000 +H 17.70000 24.02000 21.09000 +O 8.58000 25.67000 36.93000 +H 8.51000 26.29000 37.65000 +H 8.46000 26.21000 36.14000 +O 8.04000 3.00000 25.99000 +H 8.58000 2.21000 26.02000 +H 7.20000 2.72000 26.37000 +O 4.87000 22.50000 32.93000 +H 5.56000 21.84000 33.02000 +H 4.07000 22.05000 33.21000 +O 15.66000 23.04000 26.16000 +H 14.89000 23.08000 25.59000 +H 15.55000 23.76000 26.77000 +O 15.66000 20.21000 33.33000 +H 16.07000 21.00000 32.98000 +H 15.24000 20.50000 34.14000 +O 0.55000 25.27000 24.23000 +H 0.73000 25.37000 25.16000 +H 1.38000 25.46000 23.80000 +O 1.80000 26.36000 34.26000 +H 2.76000 26.30000 34.34000 +H 1.55000 27.06000 34.85000 +O 8.53000 19.42000 24.32000 +H 8.79000 20.05000 23.64000 +H 7.64000 19.17000 24.08000 +O 3.26000 20.97000 36.30000 +H 3.75000 21.58000 36.84000 +H 2.37000 21.00000 36.64000 +O 6.30000 25.94000 22.38000 +H 6.50000 26.86000 22.57000 +H 5.37000 25.84000 22.59000 +O 12.69000 22.78000 28.02000 +H 11.82000 22.39000 28.07000 +H 13.25000 22.21000 28.55000 +O 7.98000 24.58000 33.08000 +H 7.52000 24.27000 33.87000 +H 7.72000 23.95000 32.41000 +O 13.84000 23.74000 35.75000 +H 13.96000 24.28000 36.53000 +H 14.33000 22.93000 35.94000 +O 10.14000 22.79000 30.62000 +H 9.21000 22.84000 30.86000 +H 10.15000 22.34000 29.78000 +O 10.68000 25.31000 22.58000 +H 10.82000 25.53000 23.50000 +H 9.80000 24.94000 22.56000 +O 1.13000 26.33000 26.70000 +H 1.91000 26.45000 27.24000 +H 1.02000 27.18000 26.27000 +O 8.39000 21.37000 20.15000 +H 9.03000 22.03000 19.87000 +H 8.62000 21.18000 21.06000 +O 16.84000 24.64000 36.94000 +H 16.55000 25.33000 36.35000 +H 17.02000 23.89000 36.36000 +O 5.31000 20.36000 27.75000 +H 5.41000 20.62000 28.67000 +H 5.35000 21.18000 27.27000 +O 15.58000 26.32000 26.10000 +H 15.19000 25.94000 26.89000 +H 16.38000 26.74000 26.41000 +O 2.27000 21.53000 33.74000 +H 1.97000 22.42000 33.93000 +H 2.58000 21.20000 34.58000 +O 13.93000 19.58000 23.54000 +H 13.93000 19.48000 22.58000 +H 14.82000 19.32000 23.80000 +O 14.72000 20.98000 35.89000 +H 14.86000 21.12000 36.83000 +H 14.01000 20.34000 35.85000 +O 6.07000 19.74000 20.31000 +H 6.78000 20.33000 20.04000 +H 5.63000 19.50000 19.50000 +O 7.47000 21.30000 35.99000 +H 8.32000 20.87000 36.02000 +H 7.03000 20.99000 36.79000 +O 13.10000 24.72000 33.29000 +H 13.39000 24.37000 34.13000 +H 13.40000 25.63000 33.30000 +O 9.17000 23.83000 27.33000 +H 8.71000 23.56000 26.54000 +H 9.51000 23.01000 27.70000 +O 5.82000 19.15000 23.58000 +H 5.13000 19.18000 24.24000 +H 5.74000 19.98000 23.11000 +O 2.58000 18.82000 20.30000 +H 2.82000 19.74000 20.31000 +H 3.30000 18.37000 20.74000 +O 9.40000 21.59000 22.80000 +H 9.12000 22.50000 22.68000 +H 10.34000 21.65000 22.96000 +O 10.51000 25.74000 32.84000 +H 9.77000 25.19000 33.10000 +H 11.28000 25.22000 33.05000 +O 10.14000 23.31000 19.30000 +H 9.73000 24.16000 19.14000 +H 10.88000 23.50000 19.88000 +O 1.43000 24.41000 32.36000 +H 2.33000 24.42000 32.03000 +H 1.41000 25.08000 33.04000 +O 5.52000 20.79000 30.47000 +H 5.89000 20.02000 30.89000 +H 4.59000 20.79000 30.72000 +O 7.83000 22.74000 25.23000 +H 6.88000 22.61000 25.16000 +H 8.21000 22.07000 24.65000 +O 10.29000 19.12000 26.39000 +H 9.70000 19.20000 25.64000 +H 9.94000 18.39000 26.89000 +O 14.52000 24.93000 28.28000 +H 13.82000 24.28000 28.26000 +H 15.07000 24.66000 29.02000 +O 17.98000 26.57000 22.70000 +H 18.59000 26.18000 23.32000 +H 18.15000 26.11000 21.87000 +O 14.21000 25.06000 19.74000 +H 13.62000 24.54000 20.30000 +H 15.06000 24.64000 19.85000 +O 5.27000 21.52000 22.21000 +H 5.39000 20.86000 21.53000 +H 5.40000 22.35000 21.76000 +O 9.24000 19.38000 32.50000 +H 9.36000 19.25000 31.56000 +H 10.06000 19.78000 32.79000 +O 4.28000 27.39000 31.78000 +H 5.16000 27.38000 32.17000 +H 4.09000 26.47000 31.60000 +O 12.69000 22.52000 31.61000 +H 12.89000 23.30000 32.14000 +H 11.81000 22.69000 31.27000 +O 5.42000 23.33000 27.64000 +H 5.35000 23.67000 26.75000 +H 6.07000 23.89000 28.06000 +O 15.82000 25.04000 23.57000 +H 15.58000 25.36000 24.44000 +H 16.49000 25.66000 23.27000 +O 4.69000 25.96000 34.67000 +H 5.30000 26.33000 34.03000 +H 5.11000 25.15000 34.95000 +O 16.07000 26.77000 35.22000 +H 15.24000 26.81000 34.74000 +H 16.73000 26.97000 34.56000 +O 9.98000 20.00000 36.00000 +H 10.52000 20.76000 35.81000 +H 10.50000 19.25000 35.71000 +O 4.93000 18.78000 35.99000 +H 4.47000 18.34000 35.27000 +H 4.41000 19.57000 36.16000 +O 6.05000 27.57000 28.45000 +H 6.05000 28.34000 27.89000 +H 5.17000 27.20000 28.35000 +O 13.16000 27.38000 28.96000 +H 12.35000 27.24000 28.48000 +H 13.69000 26.60000 28.77000 +O 12.25000 23.67000 21.13000 +H 12.35000 22.94000 21.74000 +H 11.79000 24.34000 21.63000 +O 2.86000 20.34000 31.24000 +H 2.58000 20.66000 32.10000 +H 2.55000 19.43000 31.22000 +O 7.21000 25.05000 28.96000 +H 7.91000 24.89000 28.33000 +H 6.92000 25.94000 28.78000 +O 17.51000 0.94000 36.52000 +H 17.04000 0.15000 36.26000 +H 17.07000 1.23000 37.32000 +O 3.51000 19.57000 25.08000 +H 3.17000 20.34000 25.54000 +H 3.43000 18.86000 25.71000 +O 16.31000 22.99000 21.79000 +H 16.72000 22.31000 22.32000 +H 16.00000 23.63000 22.44000 +O 10.46000 26.23000 27.77000 +H 10.23000 26.34000 28.69000 +H 10.11000 25.38000 27.53000 +O 15.13000 21.53000 19.72000 +H 14.73000 20.81000 20.20000 +H 15.55000 22.07000 20.39000 +O 3.69000 26.22000 27.92000 +H 4.09000 25.91000 27.10000 +H 3.44000 25.42000 28.38000 +O 3.12000 23.67000 29.02000 +H 2.55000 22.90000 28.98000 +H 3.89000 23.42000 28.50000 +O 11.50000 22.24000 35.41000 +H 10.96000 22.68000 36.07000 +H 12.32000 22.74000 35.40000 +O 11.66000 20.52000 33.25000 +H 11.56000 21.13000 33.98000 +H 12.10000 21.02000 32.57000 +O 9.53000 26.27000 30.35000 +H 9.90000 26.03000 31.20000 +H 8.71000 25.77000 30.30000 +O 0.52000 24.62000 29.72000 +H 1.40000 24.45000 29.40000 +H 0.58000 24.51000 30.67000 +O 1.64000 23.84000 35.68000 +H 2.11000 24.11000 36.47000 +H 1.56000 24.64000 35.17000 +O 8.24000 24.01000 22.07000 +H 7.75000 23.58000 21.37000 +H 7.66000 24.70000 22.39000 +O 16.26000 24.27000 30.33000 +H 16.20000 23.56000 30.97000 +H 17.18000 24.28000 30.07000 +O 7.37000 23.00000 30.87000 +H 6.72000 22.30000 30.77000 +H 7.13000 23.65000 30.21000 +O 5.74000 23.78000 20.66000 +H 5.93000 24.62000 21.09000 +H 4.85000 23.88000 20.34000 +O 17.65000 20.96000 23.11000 +H 18.33000 20.64000 22.51000 +H 17.23000 20.16000 23.43000 +O 13.46000 27.73000 24.96000 +H 14.24000 27.34000 25.34000 +H 13.79000 28.31000 24.27000 +O 18.45000 20.11000 28.52000 +H 18.63000 19.22000 28.23000 +H 17.60000 20.32000 28.13000 +O 2.26000 21.69000 26.30000 +H 1.41000 21.95000 25.96000 +H 2.11000 21.52000 27.23000 +O 8.91000 27.60000 20.92000 +H 9.67000 28.18000 20.80000 +H 8.92000 27.38000 21.85000 +O 10.29000 21.29000 28.21000 +H 10.33000 20.79000 27.39000 +H 10.14000 20.62000 28.88000 +O 17.37000 22.32000 32.58000 +H 18.08000 22.97000 32.57000 +H 17.72000 21.58000 32.09000 +O 0.71000 0.52000 35.95000 +H -0.24000 0.43000 35.88000 +H 0.85000 1.38000 36.34000 +O 6.81000 20.46000 33.41000 +H 7.67000 20.19000 33.08000 +H 6.98000 20.75000 34.31000 +O 0.27000 22.16000 18.64000 +H -0.43000 22.66000 19.07000 +H 0.66000 22.78000 18.02000 +O 13.76000 27.46000 33.60000 +H 12.87000 27.82000 33.65000 +H 14.28000 28.17000 33.22000 +O 0.07000 19.44000 21.28000 +H 0.47000 19.79000 22.08000 +H 0.79000 19.02000 20.81000 +O 6.75000 27.07000 33.01000 +H 7.42000 27.76000 32.96000 +H 7.25000 26.26000 32.95000 +O 6.77000 23.99000 35.51000 +H 7.27000 24.42000 36.20000 +H 6.90000 23.05000 35.67000 +O 16.23000 26.94000 31.15000 +H 16.27000 26.04000 30.84000 +H 15.32000 27.20000 31.03000 +O 12.20000 21.81000 23.24000 +H 12.71000 21.01000 23.38000 +H 12.47000 22.39000 23.95000 +O 4.98000 25.40000 25.63000 +H 5.81000 25.59000 25.19000 +H 4.33000 25.41000 24.93000 +O 17.17000 22.28000 35.43000 +H 17.26000 22.31000 34.48000 +H 16.39000 21.75000 35.57000 +O 17.93000 27.45000 33.29000 +H 18.32000 28.26000 32.95000 +H 17.37000 27.14000 32.57000 +O 18.48000 20.22000 31.27000 +H 18.97000 19.42000 31.45000 +H 18.43000 20.26000 30.31000 +O 5.11000 22.32000 24.87000 +H 5.05000 22.06000 23.95000 +H 4.21000 22.29000 25.19000 +O 4.02000 24.65000 31.45000 +H 4.45000 23.95000 31.95000 +H 3.85000 24.26000 30.60000 +O 14.18000 21.20000 29.70000 +H 14.27000 20.27000 29.90000 +H 13.75000 21.58000 30.47000 +O 9.95000 19.03000 29.80000 +H 9.53000 18.40000 29.21000 +H 10.86000 18.72000 29.87000 +O 14.08000 19.16000 20.79000 +H 14.75000 18.48000 20.72000 +H 13.26000 18.73000 20.53000 +O 12.98000 23.43000 25.34000 +H 12.51000 24.25000 25.21000 +H 12.81000 23.19000 26.25000 +O 15.94000 20.68000 27.61000 +H 15.35000 20.96000 28.31000 +H 15.88000 21.38000 26.96000 +O 20.49000 6.80000 1.49000 +H 19.64000 6.42000 1.70000 +H 20.54000 6.75000 0.54000 +O 20.66000 2.70000 10.03000 +H 20.94000 2.36000 10.88000 +H 19.87000 2.21000 9.82000 +O 18.52000 3.95000 6.42000 +H 17.66000 4.10000 6.83000 +H 18.35000 3.28000 5.75000 +O 24.13000 12.00000 10.97000 +H 23.42000 12.56000 10.64000 +H 24.47000 12.47000 11.73000 +O 0.15000 9.19000 19.05000 +H 0.12000 9.75000 19.83000 +H 0.74000 8.48000 19.30000 +O 22.15000 13.89000 10.28000 +H 21.36000 13.37000 10.09000 +H 22.39000 14.28000 9.44000 +O 22.56000 3.82000 14.82000 +H 23.33000 3.26000 14.83000 +H 21.82000 3.23000 14.98000 +O 20.95000 17.28000 4.70000 +H 21.16000 17.98000 5.32000 +H 21.78000 17.11000 4.24000 +O 20.68000 14.50000 4.97000 +H 20.65000 15.44000 5.18000 +H 20.53000 14.07000 5.81000 +O 21.62000 10.62000 8.61000 +H 21.69000 9.71000 8.90000 +H 21.16000 11.07000 9.32000 +O 19.78000 6.43000 5.66000 +H 19.38000 5.61000 5.95000 +H 19.63000 7.04000 6.38000 +O 19.11000 15.71000 1.03000 +H 18.73000 14.83000 1.11000 +H 18.91000 16.12000 1.87000 +O 20.38000 7.77000 15.77000 +H 21.33000 7.89000 15.76000 +H 20.04000 8.57000 16.18000 +O 24.18000 14.39000 7.38000 +H 23.92000 13.47000 7.32000 +H 24.27000 14.67000 6.46000 +O 25.41000 0.18000 5.78000 +H 26.01000 0.85000 5.44000 +H 24.62000 0.29000 5.26000 +O 20.53000 9.46000 12.50000 +H 21.44000 9.17000 12.39000 +H 20.03000 8.95000 11.86000 +O 22.30000 2.86000 17.95000 +H 22.69000 3.49000 18.56000 +H 21.36000 2.88000 18.17000 +O 23.89000 7.36000 2.66000 +H 23.60000 8.20000 2.30000 +H 23.37000 7.26000 3.46000 +O 19.38000 8.33000 7.64000 +H 20.16000 8.14000 8.17000 +H 18.98000 9.09000 8.07000 +O 2.43000 2.83000 1.93000 +H 2.69000 3.75000 1.89000 +H 1.67000 2.77000 1.35000 +O 25.12000 2.70000 9.70000 +H 24.71000 2.54000 10.54000 +H 24.76000 3.54000 9.41000 +O 22.45000 18.78000 9.02000 +H 23.04000 18.04000 9.08000 +H 23.00000 19.55000 9.17000 +O 21.35000 9.30000 2.46000 +H 22.01000 9.58000 1.83000 +H 21.07000 8.44000 2.15000 +O 22.98000 12.20000 17.32000 +H 22.92000 12.44000 16.40000 +H 22.18000 12.55000 17.72000 +O 20.26000 2.25000 15.21000 +H 19.52000 2.74000 15.55000 +H 20.44000 1.58000 15.88000 +O 23.44000 17.21000 3.30000 +H 23.80000 17.91000 3.84000 +H 24.17000 16.92000 2.75000 +O 21.00000 17.70000 12.39000 +H 21.58000 16.95000 12.48000 +H 20.69000 17.67000 11.49000 +O 22.52000 6.67000 4.98000 +H 22.78000 5.77000 5.17000 +H 21.57000 6.68000 5.11000 +O 23.69000 0.91000 1.29000 +H 24.53000 0.64000 1.66000 +H 23.82000 0.85000 0.34000 +O 1.10000 14.39000 8.50000 +H 1.44000 13.68000 7.96000 +H 0.17000 14.44000 8.28000 +O 23.12000 0.49000 4.37000 +H 22.44000 0.36000 5.04000 +H 22.89000 1.32000 3.96000 +O 21.05000 27.92000 1.14000 +H 21.95000 28.13000 1.37000 +H 20.98000 26.98000 1.31000 +O 1.46000 2.06000 4.44000 +H 1.90000 2.44000 3.68000 +H 2.16000 1.66000 4.95000 +O 23.35000 11.84000 6.85000 +H 22.87000 11.32000 7.50000 +H 22.95000 11.59000 6.01000 +O 19.56000 5.86000 13.85000 +H 20.50000 5.80000 13.65000 +H 19.50000 6.58000 14.48000 +O 23.93000 1.92000 12.05000 +H 24.29000 2.01000 12.94000 +H 22.98000 1.93000 12.17000 +O 22.88000 2.89000 3.04000 +H 23.12000 2.24000 2.38000 +H 22.74000 3.70000 2.55000 +O 23.08000 8.38000 12.35000 +H 23.70000 8.67000 13.01000 +H 22.84000 7.49000 12.61000 +O 19.46000 15.29000 13.29000 +H 19.21000 16.18000 13.05000 +H 20.42000 15.28000 13.22000 +O 21.80000 11.15000 4.57000 +H 21.73000 11.85000 3.93000 +H 21.67000 10.34000 4.07000 +O 24.14000 5.27000 9.40000 +H 24.11000 5.93000 8.71000 +H 24.83000 5.57000 9.99000 +O 22.27000 15.18000 12.71000 +H 22.24000 14.72000 11.87000 +H 23.20000 15.26000 12.90000 +O 23.13000 8.00000 16.18000 +H 23.70000 8.44000 15.55000 +H 23.58000 7.18000 16.38000 +O 23.73000 0.69000 16.99000 +H 23.21000 -0.08000 16.74000 +H 23.08000 1.35000 17.22000 +O 24.51000 9.36000 10.07000 +H 24.29000 10.28000 10.22000 +H 24.02000 8.88000 10.74000 +O 21.22000 1.74000 12.58000 +H 20.78000 1.95000 13.40000 +H 21.37000 0.79000 12.63000 +O 18.63000 12.82000 12.43000 +H 19.07000 12.27000 13.07000 +H 18.81000 13.72000 12.72000 +O 21.47000 0.54000 6.57000 +H 21.45000 1.45000 6.85000 +H 21.84000 0.06000 7.31000 +O 22.38000 9.67000 18.57000 +H 22.82000 10.46000 18.26000 +H 22.77000 8.96000 18.04000 +O 21.60000 7.87000 9.21000 +H 22.36000 7.72000 8.65000 +H 21.56000 7.09000 9.76000 +O 21.61000 5.23000 10.38000 +H 21.25000 4.36000 10.21000 +H 22.49000 5.21000 10.00000 +O 18.73000 12.71000 1.49000 +H 17.85000 13.07000 1.33000 +H 18.56000 11.83000 1.83000 +O 19.97000 17.78000 9.72000 +H 19.69000 17.13000 9.08000 +H 20.80000 18.11000 9.39000 +O 24.09000 16.62000 9.08000 +H 25.01000 16.83000 9.22000 +H 24.11000 15.88000 8.47000 +O 19.02000 6.05000 11.16000 +H 19.86000 5.82000 10.76000 +H 19.20000 6.07000 12.10000 +O 20.65000 5.37000 17.08000 +H 21.30000 4.91000 16.55000 +H 20.44000 6.16000 16.57000 +O 0.96000 6.99000 2.82000 +H 1.11000 6.99000 3.77000 +H 0.00000 7.04000 2.73000 +O 21.36000 15.23000 17.69000 +H 21.01000 15.70000 18.45000 +H 20.96000 14.36000 17.75000 +O 22.71000 5.14000 1.45000 +H 23.36000 5.78000 1.75000 +H 21.87000 5.60000 1.51000 +O 20.11000 11.40000 14.35000 +H 20.07000 10.97000 15.20000 +H 20.29000 10.69000 13.73000 +O 19.93000 12.25000 10.04000 +H 19.50000 12.38000 10.89000 +H 19.28000 11.77000 9.52000 +O -0.32000 15.83000 16.33000 +H 0.35000 16.27000 16.86000 +H 0.07000 15.78000 15.45000 +O 20.22000 16.82000 19.64000 +H 19.56000 16.84000 20.32000 +H 20.85000 17.50000 19.89000 +O 21.13000 3.19000 7.29000 +H 20.27000 3.52000 7.02000 +H 21.07000 3.12000 8.24000 +O 22.25000 13.10000 14.83000 +H 22.26000 13.82000 14.20000 +H 21.49000 12.57000 14.58000 +O 24.34000 14.77000 4.64000 +H 24.55000 14.15000 3.94000 +H 23.86000 15.47000 4.20000 +O 21.18000 13.13000 2.73000 +H 20.28000 12.99000 2.42000 +H 21.09000 13.71000 3.49000 +O 19.95000 10.08000 17.38000 +H 19.23000 9.69000 17.88000 +H 20.73000 9.84000 17.87000 +O 24.76000 1.95000 14.70000 +H 25.65000 2.26000 14.85000 +H 24.52000 1.52000 15.52000 +O 19.45000 3.47000 37.30000 +H 18.77000 3.30000 36.65000 +H 19.77000 4.34000 37.08000 +O 19.15000 1.83000 2.14000 +H 19.22000 2.49000 1.44000 +H 19.78000 1.16000 1.89000 +O 24.89000 9.16000 14.31000 +H 24.99000 10.06000 14.63000 +H 25.71000 8.98000 13.84000 +O 22.73000 16.83000 15.99000 +H 22.21000 16.25000 16.53000 +H 23.61000 16.45000 15.99000 +O 23.64000 7.24000 7.50000 +H 24.48000 7.70000 7.49000 +H 23.38000 7.21000 6.58000 +O 20.27000 12.75000 18.12000 +H 20.08000 11.87000 17.80000 +H 20.36000 12.65000 19.07000 +O 20.22000 12.22000 6.66000 +H 20.57000 11.72000 7.40000 +H 20.66000 11.86000 5.89000 +O 25.29000 13.57000 18.09000 +H 24.57000 12.99000 17.82000 +H 25.23000 14.32000 17.50000 +O 23.22000 4.05000 5.57000 +H 23.07000 3.56000 4.77000 +H 22.57000 3.72000 6.19000 +O 22.20000 5.86000 13.04000 +H 22.48000 5.14000 13.61000 +H 22.15000 5.48000 12.17000 +O 18.77000 10.25000 2.96000 +H 19.70000 10.10000 2.77000 +H 18.43000 9.37000 3.16000 +O 21.22000 6.61000 19.54000 +H 20.50000 6.88000 20.11000 +H 20.80000 6.29000 18.74000 +O 20.64000 2.88000 28.73000 +H 20.99000 2.56000 29.56000 +H 19.91000 2.30000 28.53000 +O 18.79000 3.56000 24.78000 +H 18.00000 3.89000 25.21000 +H 18.51000 2.77000 24.33000 +O 24.38000 12.07000 29.67000 +H 23.70000 12.65000 29.32000 +H 24.65000 12.48000 30.49000 +O 1.17000 8.48000 0.44000 +H 1.09000 8.00000 1.27000 +H 2.11000 8.60000 0.33000 +O 22.60000 14.18000 29.04000 +H 22.09000 13.86000 28.29000 +H 23.11000 14.91000 28.70000 +O 22.79000 4.26000 33.51000 +H 23.52000 3.64000 33.49000 +H 22.03000 3.72000 33.71000 +O 20.71000 16.67000 23.24000 +H 20.79000 17.33000 23.93000 +H 21.59000 16.59000 22.87000 +O 19.74000 13.97000 22.98000 +H 20.02000 14.88000 23.12000 +H 19.81000 13.56000 23.84000 +O 20.69000 10.89000 27.58000 +H 20.95000 9.98000 27.70000 +H 20.11000 11.07000 28.32000 +O 20.01000 5.87000 23.59000 +H 19.66000 5.03000 23.88000 +H 19.86000 6.46000 24.33000 +O 20.02000 7.37000 34.20000 +H 20.94000 7.54000 34.03000 +H 19.72000 8.12000 34.71000 +O 24.37000 14.24000 25.91000 +H 23.90000 13.43000 26.12000 +H 24.33000 14.30000 24.95000 +O 0.87000 0.71000 25.18000 +H 1.29000 1.31000 24.56000 +H -0.04000 0.65000 24.87000 +O 20.38000 9.40000 31.75000 +H 21.29000 9.29000 31.47000 +H 19.89000 8.77000 31.23000 +O 22.25000 3.12000 36.91000 +H 22.46000 3.82000 37.54000 +H 21.30000 3.00000 37.01000 +O 24.14000 7.07000 21.34000 +H 23.69000 7.72000 20.81000 +H 23.61000 6.99000 22.14000 +O 19.67000 7.60000 25.60000 +H 20.07000 8.01000 26.37000 +H 18.96000 8.19000 25.36000 +O 19.46000 19.11000 34.67000 +H 19.60000 18.79000 35.56000 +H 18.54000 18.94000 34.49000 +O 2.16000 3.80000 20.85000 +H 1.66000 4.49000 21.28000 +H 1.55000 3.40000 20.23000 +O 24.86000 2.49000 28.33000 +H 24.60000 2.51000 29.25000 +H 24.54000 3.32000 27.98000 +O 22.05000 18.13000 27.65000 +H 22.70000 17.44000 27.74000 +H 22.56000 18.94000 27.71000 +O 21.19000 9.75000 21.24000 +H 21.60000 9.60000 20.39000 +H 20.57000 9.03000 21.34000 +O 23.16000 11.77000 36.29000 +H 23.02000 11.84000 35.35000 +H 22.42000 12.25000 36.68000 +O 20.53000 2.60000 33.93000 +H 19.79000 3.15000 34.16000 +H 20.54000 1.91000 34.59000 +O 23.39000 16.83000 22.21000 +H 23.66000 17.51000 22.83000 +H 24.15000 16.70000 21.65000 +O 21.19000 17.77000 31.34000 +H 21.48000 17.74000 32.25000 +H 21.84000 17.26000 30.86000 +O 22.73000 6.56000 23.64000 +H 23.06000 5.71000 23.93000 +H 21.78000 6.45000 23.59000 +O 24.12000 1.33000 19.76000 +H 24.81000 0.88000 20.26000 +H 24.11000 0.87000 18.92000 +O 1.23000 14.23000 27.18000 +H 1.69000 13.67000 26.55000 +H 0.32000 14.25000 26.86000 +O 24.26000 0.93000 23.54000 +H 23.63000 0.32000 23.91000 +H 23.74000 1.54000 23.03000 +O 21.50000 0.29000 19.83000 +H 22.24000 0.89000 19.84000 +H 21.82000 -0.49000 20.29000 +O 1.95000 2.35000 23.20000 +H 2.13000 2.75000 22.35000 +H 2.78000 1.94000 23.45000 +O 22.89000 11.97000 26.24000 +H 22.25000 11.54000 26.81000 +H 22.75000 11.58000 25.38000 +O 19.36000 5.48000 32.33000 +H 20.27000 5.50000 32.03000 +H 19.34000 6.12000 33.04000 +O 24.00000 2.45000 30.88000 +H 24.33000 2.37000 31.78000 +H 23.06000 2.33000 30.96000 +O 23.20000 2.88000 21.83000 +H 23.53000 2.26000 21.18000 +H 23.01000 3.68000 21.34000 +O 22.90000 8.48000 30.98000 +H 23.58000 8.60000 31.65000 +H 22.61000 7.57000 31.11000 +O 19.77000 15.38000 31.98000 +H 19.89000 16.29000 31.72000 +H 20.66000 15.04000 32.06000 +O 22.05000 11.28000 23.56000 +H 22.61000 11.91000 23.11000 +H 21.85000 10.62000 22.90000 +O 24.00000 5.19000 28.02000 +H 23.98000 5.90000 27.38000 +H 24.72000 5.43000 28.61000 +O 22.42000 14.50000 31.79000 +H 22.44000 14.31000 30.86000 +H 23.34000 14.47000 32.06000 +O 22.91000 7.05000 34.35000 +H 23.60000 7.53000 33.89000 +H 22.97000 6.16000 34.00000 +O 23.60000 1.00000 35.83000 +H 23.03000 0.29000 35.54000 +H 23.01000 1.69000 36.11000 +O 24.43000 9.40000 28.74000 +H 24.36000 10.33000 28.94000 +H 23.87000 8.96000 29.38000 +O 21.34000 1.93000 31.28000 +H 20.96000 2.10000 32.14000 +H 21.57000 1.00000 31.30000 +O 21.63000 0.36000 25.44000 +H 21.75000 1.28000 25.67000 +H 22.43000 -0.07000 25.73000 +O 22.03000 8.36000 36.68000 +H 22.76000 8.78000 37.15000 +H 22.45000 7.93000 35.94000 +O 21.36000 8.20000 27.79000 +H 22.17000 8.07000 27.29000 +H 21.23000 7.38000 28.26000 +O 21.38000 5.50000 28.76000 +H 20.99000 4.63000 28.69000 +H 22.26000 5.41000 28.42000 +O 19.32000 17.51000 28.01000 +H 19.19000 17.10000 27.15000 +H 20.26000 17.72000 28.03000 +O 24.04000 16.22000 27.84000 +H 24.89000 16.58000 28.07000 +H 24.21000 15.67000 27.07000 +O 18.23000 6.28000 29.94000 +H 18.89000 6.12000 29.27000 +H 18.65000 6.02000 30.76000 +O 20.61000 5.68000 36.26000 +H 21.52000 5.52000 36.00000 +H 20.26000 6.24000 35.57000 +O 0.92000 5.93000 21.99000 +H 1.14000 6.20000 22.88000 +H 0.05000 6.31000 21.84000 +O 20.91000 15.52000 35.67000 +H 20.69000 16.16000 36.34000 +H 21.13000 14.72000 36.16000 +O 23.26000 4.85000 19.81000 +H 23.89000 5.42000 20.25000 +H 22.49000 5.40000 19.67000 +O 19.85000 11.10000 33.87000 +H 19.80000 10.50000 34.61000 +H 20.05000 10.54000 33.12000 +O -0.21000 15.57000 35.28000 +H 0.23000 16.29000 35.73000 +H 0.10000 15.63000 34.38000 +O 20.03000 17.87000 -0.31000 +H 19.54000 17.18000 0.13000 +H 20.59000 18.24000 0.37000 +O 21.37000 3.10000 25.98000 +H 20.51000 3.32000 25.62000 +H 21.23000 3.08000 26.93000 +O 22.31000 12.37000 33.75000 +H 22.27000 13.09000 33.12000 +H 21.41000 12.02000 33.77000 +O 23.98000 14.14000 23.10000 +H 24.52000 13.84000 22.36000 +H 23.66000 15.00000 22.82000 +O 20.52000 12.44000 20.78000 +H 20.73000 11.57000 21.12000 +H 20.36000 12.97000 21.57000 +O 19.56000 9.40000 35.98000 +H 18.86000 9.45000 36.63000 +H 20.34000 9.13000 36.48000 +O 24.71000 2.16000 33.53000 +H 25.63000 2.39000 33.63000 +H 24.45000 1.83000 34.39000 +O 19.57000 3.27000 18.49000 +H 18.85000 2.99000 17.92000 +H 19.80000 4.14000 18.17000 +O 19.06000 1.50000 20.54000 +H 19.22000 2.25000 19.96000 +H 19.87000 0.98000 20.49000 +O 24.78000 8.77000 33.00000 +H 24.75000 9.57000 33.51000 +H 25.59000 8.83000 32.51000 +O 21.75000 17.63000 34.02000 +H 20.98000 18.15000 34.27000 +H 21.64000 16.80000 34.49000 +O 23.52000 7.32000 26.26000 +H 24.40000 7.71000 26.25000 +H 23.30000 7.21000 25.33000 +O 21.12000 13.27000 -0.02000 +H 20.21000 12.99000 0.06000 +H 21.42000 13.37000 0.89000 +O 20.02000 12.29000 25.17000 +H 20.08000 11.88000 26.03000 +H 20.70000 11.87000 24.65000 +O 25.32000 13.36000 36.88000 +H 24.61000 12.79000 36.59000 +H 25.26000 14.13000 36.31000 +O 23.47000 4.03000 24.39000 +H 23.32000 3.53000 23.59000 +H 22.82000 3.69000 25.01000 +O 21.95000 5.92000 31.43000 +H 22.42000 5.23000 31.90000 +H 21.92000 5.62000 30.53000 +O 23.68000 9.91000 0.98000 +H 23.58000 10.58000 0.30000 +H 24.52000 10.10000 1.39000 +O 20.61000 25.16000 1.33000 +H 19.74000 25.04000 1.71000 +H 20.56000 24.74000 0.48000 +O 20.66000 21.62000 9.74000 +H 21.15000 21.19000 10.44000 +H 19.78000 21.25000 9.79000 +O 18.32000 22.68000 6.35000 +H 17.48000 22.80000 6.80000 +H 18.14000 22.05000 5.65000 +O 2.26000 26.59000 19.13000 +H 2.66000 27.24000 19.71000 +H 1.69000 27.11000 18.56000 +O 22.70000 23.23000 15.50000 +H 23.53000 22.87000 15.20000 +H 22.05000 22.55000 15.30000 +O 19.63000 25.10000 5.86000 +H 19.19000 24.27000 6.00000 +H 19.46000 25.61000 6.66000 +O 19.86000 25.97000 15.60000 +H 20.59000 26.53000 15.89000 +H 19.16000 26.58000 15.39000 +O 0.88000 18.22000 5.45000 +H 1.41000 18.90000 5.87000 +H 0.02000 18.62000 5.35000 +O 21.58000 20.07000 17.85000 +H 22.31000 20.10000 18.47000 +H 20.89000 20.59000 18.26000 +O 24.07000 25.93000 3.30000 +H 24.07000 26.88000 3.29000 +H 23.50000 25.69000 4.03000 +O 19.40000 27.08000 7.85000 +H 20.17000 26.88000 8.39000 +H 19.74000 27.60000 7.13000 +O 2.48000 21.58000 1.84000 +H 2.77000 22.49000 1.77000 +H 1.71000 21.53000 1.27000 +O 23.98000 21.10000 9.43000 +H 23.93000 21.36000 10.35000 +H 24.16000 21.91000 8.96000 +O 20.22000 21.63000 15.32000 +H 20.05000 22.24000 14.61000 +H 20.06000 22.12000 16.12000 +O 22.41000 25.20000 5.37000 +H 22.63000 24.27000 5.48000 +H 21.46000 25.24000 5.46000 +O 23.92000 19.97000 0.66000 +H 24.67000 19.72000 1.20000 +H 24.13000 19.64000 -0.21000 +O 24.03000 19.37000 4.90000 +H 23.29000 19.36000 5.50000 +H 23.89000 20.13000 4.34000 +O 21.67000 18.78000 1.73000 +H 22.42000 19.24000 1.34000 +H 22.07000 18.12000 2.30000 +O 1.61000 20.96000 4.39000 +H 2.01000 21.28000 3.58000 +H 2.34000 20.55000 4.86000 +O 20.02000 23.97000 13.77000 +H 20.88000 24.06000 13.36000 +H 19.96000 24.70000 14.38000 +O 23.57000 21.89000 12.04000 +H 24.08000 21.75000 12.84000 +H 22.79000 21.35000 12.16000 +O 23.37000 21.42000 3.12000 +H 23.62000 20.89000 2.36000 +H 23.22000 22.29000 2.76000 +O 22.07000 27.05000 12.84000 +H 22.96000 27.13000 13.19000 +H 21.99000 26.13000 12.60000 +O 24.43000 23.84000 8.96000 +H 24.56000 24.46000 8.24000 +H 25.11000 24.06000 9.59000 +O 22.90000 26.09000 15.87000 +H 23.48000 26.38000 15.17000 +H 22.86000 25.14000 15.78000 +O 23.74000 19.37000 16.09000 +H 23.46000 18.46000 16.01000 +H 23.21000 19.72000 16.81000 +O 24.23000 0.06000 9.85000 +H 24.62000 0.80000 9.40000 +H 24.12000 0.35000 10.75000 +O 21.29000 20.44000 12.27000 +H 20.38000 20.66000 12.49000 +H 21.32000 19.48000 12.32000 +O 21.74000 19.27000 6.41000 +H 21.35000 20.14000 6.51000 +H 21.98000 19.02000 7.31000 +O 21.94000 26.81000 8.85000 +H 22.77000 27.15000 9.18000 +H 21.96000 25.88000 9.07000 +O 21.78000 24.11000 9.58000 +H 21.40000 23.24000 9.53000 +H 22.69000 23.98000 9.29000 +O 19.12000 24.29000 11.06000 +H 19.84000 24.38000 10.44000 +H 19.54000 24.18000 11.91000 +O 20.57000 23.84000 17.17000 +H 21.44000 23.75000 16.79000 +H 20.19000 24.60000 16.74000 +O 1.00000 24.84000 3.20000 +H 1.30000 24.99000 4.09000 +H 0.12000 25.21000 3.17000 +O 22.97000 23.82000 1.92000 +H 23.52000 24.52000 2.28000 +H 22.14000 24.25000 1.73000 +O 20.88000 21.79000 6.98000 +H 20.02000 22.15000 6.76000 +H 20.88000 21.77000 7.94000 +O 20.45000 0.40000 17.25000 +H 19.52000 0.43000 17.47000 +H 20.89000 0.31000 18.10000 +O 24.60000 21.48000 14.53000 +H 25.55000 21.46000 14.55000 +H 24.33000 20.69000 15.01000 +O 19.22000 21.62000 37.32000 +H 18.43000 21.65000 36.77000 +H 19.63000 22.47000 37.18000 +O 19.23000 20.02000 2.33000 +H 19.09000 20.58000 1.57000 +H 20.13000 19.71000 2.23000 +O 24.62000 26.99000 13.89000 +H 24.99000 27.87000 13.92000 +H 25.34000 26.43000 13.60000 +O 24.56000 25.79000 7.03000 +H 24.97000 26.58000 6.68000 +H 23.78000 25.66000 6.49000 +O 23.18000 22.57000 5.65000 +H 23.16000 22.13000 4.80000 +H 22.43000 22.23000 6.12000 +O 22.25000 24.33000 12.25000 +H 22.91000 23.65000 12.36000 +H 22.13000 24.41000 11.31000 +O 20.85000 23.64000 19.89000 +H 20.18000 24.15000 20.34000 +H 20.80000 23.93000 18.98000 +O 20.85000 21.43000 28.37000 +H 21.29000 21.07000 29.14000 +H 19.95000 21.11000 28.44000 +O 18.26000 22.69000 25.17000 +H 17.41000 22.84000 25.58000 +H 18.07000 22.11000 24.43000 +O 2.34000 26.62000 -0.09000 +H 2.80000 27.14000 0.57000 +H 1.70000 27.22000 -0.46000 +O 23.04000 22.88000 33.43000 +H 23.84000 22.38000 33.29000 +H 22.35000 22.22000 33.49000 +O 19.46000 25.10000 24.51000 +H 19.06000 24.27000 24.79000 +H 19.37000 25.68000 25.27000 +O 19.89000 25.87000 34.55000 +H 20.68000 26.40000 34.67000 +H 19.23000 26.51000 34.26000 +O 0.55000 18.32000 24.35000 +H 1.00000 19.15000 24.21000 +H -0.37000 18.54000 24.38000 +O 21.83000 20.99000 36.34000 +H 22.33000 21.01000 37.16000 +H 20.91000 21.01000 36.61000 +O 22.85000 26.24000 21.20000 +H 23.78000 26.00000 21.24000 +H 22.48000 25.89000 22.01000 +O 19.38000 27.07000 26.47000 +H 19.86000 26.68000 27.20000 +H 20.05000 27.54000 25.97000 +O 2.24000 21.71000 20.66000 +H 2.65000 22.58000 20.65000 +H 1.47000 21.80000 20.11000 +O 23.83000 20.24000 27.65000 +H 24.19000 20.45000 28.51000 +H 24.28000 20.82000 27.05000 +O 20.81000 21.21000 33.26000 +H 20.16000 21.91000 33.17000 +H 20.38000 20.54000 33.80000 +O 22.06000 25.10000 23.57000 +H 22.36000 24.23000 23.83000 +H 21.14000 25.12000 23.84000 +O 23.99000 20.05000 19.21000 +H 24.58000 19.67000 19.87000 +H 24.49000 20.78000 18.84000 +O 23.55000 19.03000 23.83000 +H 22.75000 19.01000 24.34000 +H 23.49000 19.85000 23.33000 +O 21.92000 18.73000 20.73000 +H 22.61000 19.27000 20.33000 +H 22.40000 18.10000 21.27000 +O 1.78000 20.50000 23.12000 +H 2.10000 21.04000 22.41000 +H 2.56000 20.30000 23.64000 +O 19.68000 23.84000 32.72000 +H 20.52000 24.04000 32.31000 +H 19.57000 24.51000 33.39000 +O 24.55000 20.93000 30.28000 +H 24.88000 21.00000 31.18000 +H 23.60000 20.84000 30.38000 +O 23.63000 21.18000 22.05000 +H 24.38000 20.66000 21.77000 +H 23.56000 21.87000 21.39000 +O 22.56000 27.32000 31.30000 +H 23.37000 27.25000 31.81000 +H 22.20000 26.43000 31.29000 +O 24.47000 24.54000 27.54000 +H 24.55000 25.36000 27.06000 +H 25.06000 24.65000 28.29000 +O 22.71000 26.45000 34.69000 +H 23.36000 26.70000 34.03000 +H 22.83000 25.51000 34.79000 +O 23.71000 19.39000 35.03000 +H 23.19000 18.69000 34.64000 +H 23.05000 20.02000 35.34000 +O 23.03000 0.18000 28.52000 +H 23.71000 0.81000 28.28000 +H 23.10000 0.09000 29.47000 +O 21.82000 20.44000 30.78000 +H 21.50000 20.82000 31.60000 +H 21.59000 19.51000 30.84000 +O 21.12000 18.71000 25.12000 +H 20.85000 19.63000 25.20000 +H 21.41000 18.47000 26.00000 +O 21.01000 26.14000 28.43000 +H 21.66000 26.85000 28.42000 +H 21.52000 25.34000 28.55000 +O 22.25000 23.75000 28.92000 +H 21.84000 22.95000 28.59000 +H 23.04000 23.86000 28.40000 +O 18.94000 24.42000 29.87000 +H 19.57000 24.90000 29.34000 +H 19.42000 24.20000 30.67000 +O 20.53000 23.83000 36.28000 +H 21.19000 23.33000 35.79000 +H 20.24000 24.51000 35.68000 +O -0.30000 25.00000 21.56000 +H 0.48000 25.43000 21.21000 +H -0.14000 24.94000 22.50000 +O 23.73000 23.21000 20.12000 +H 24.17000 23.90000 20.62000 +H 22.82000 23.51000 20.08000 +O 20.72000 21.41000 25.61000 +H 19.90000 21.89000 25.49000 +H 20.89000 21.46000 26.55000 +O 20.21000 0.75000 35.95000 +H 19.27000 0.82000 36.11000 +H 20.58000 0.49000 36.79000 +O 25.10000 21.00000 33.06000 +H 26.03000 21.07000 33.27000 +H 24.76000 20.36000 33.69000 +O 19.40000 21.47000 18.86000 +H 18.74000 21.84000 18.26000 +H 19.84000 22.24000 19.23000 +O 19.43000 19.91000 21.19000 +H 19.30000 20.46000 20.41000 +H 20.35000 19.66000 21.15000 +O 24.77000 27.23000 33.01000 +H 24.93000 28.18000 32.99000 +H 25.64000 26.84000 33.11000 +O 23.82000 26.47000 25.18000 +H 24.65000 26.13000 24.84000 +H 23.15000 25.99000 24.69000 +O 22.89000 22.58000 24.31000 +H 23.09000 22.08000 23.52000 +H 22.16000 22.11000 24.71000 +O 22.00000 24.58000 31.51000 +H 22.56000 24.06000 32.09000 +H 22.20000 24.26000 30.63000 +Cl 3.32000 26.00000 23.05000 diff --git a/tests/data/nve_energy_conservation/small_molecule_HCNO.xyz b/tests/data/nve_energy_conservation/small_molecule_HCNO.xyz new file mode 100644 index 00000000..e560b8fc --- /dev/null +++ b/tests/data/nve_energy_conservation/small_molecule_HCNO.xyz @@ -0,0 +1,48 @@ +46 +[H]OC(=O)C([H])([H])C([H])([H])n1c(=O)n(C([H])([H])c2c([H])c(C#N)c3c([H])c([H])c([H])c(C([H])([H])[H])n23)c2c([H])c([H])c([H])c([H])c21 +C -1.487400 3.285700 -0.907200 +C -1.943100 4.287600 0.110700 +C -2.918200 5.207800 -0.188800 +C -3.386400 6.157300 0.759000 +C -2.851900 6.156900 2.022900 +C -1.846900 5.223800 2.346800 +C -1.133200 4.998000 3.535600 +C -0.236900 3.934300 3.287700 +C -0.390700 3.501200 1.983800 +C 0.417200 2.389800 1.379900 +N 1.493400 2.802300 0.471300 +C 2.499900 3.700400 0.851100 +O 2.596400 4.311100 1.906900 +N 3.392000 3.745800 -0.224200 +C 4.632100 4.496100 -0.180200 +C 5.801300 3.623400 0.316400 +C 7.134400 4.329700 0.239200 +O 7.383700 4.796800 -1.019600 +O 7.919300 4.476800 1.152100 +C 3.032300 2.803700 -1.184500 +C 1.839400 2.191100 -0.739500 +C 1.237600 1.181800 -1.484000 +C 1.847300 0.804300 -2.692100 +C 3.023000 1.421400 -3.135300 +C 3.636600 2.434900 -2.381300 +N -1.387900 4.293900 1.386800 +C -1.311900 5.730000 4.736100 +N -1.479900 6.342200 5.716600 +H -1.715100 2.260300 -0.599800 +H -0.416600 3.356600 -1.103500 +H -2.010000 3.467600 -1.847600 +H -3.337700 5.190500 -1.189100 +H -4.158800 6.867200 0.480000 +H -3.170300 6.853700 2.791700 +H 0.490800 3.537800 3.982400 +H -0.195000 1.670200 0.838700 +H 0.861400 1.850300 2.222500 +H 4.476000 5.338100 0.496800 +H 4.841100 4.889500 -1.177500 +H 5.864500 2.721300 -0.302300 +H 5.637300 3.323000 1.351900 +H 8.258600 5.229800 -0.982600 +H 0.329300 0.689300 -1.151000 +H 1.396400 0.016000 -3.287700 +H 3.473500 1.109600 -4.073000 +H 4.553200 2.908000 -2.721200 diff --git a/tests/data/nve_energy_conservation/water_box_n500_eq.pdb b/tests/data/nve_energy_conservation/water_box_n500_eq.pdb new file mode 100644 index 00000000..c6423363 --- /dev/null +++ b/tests/data/nve_energy_conservation/water_box_n500_eq.pdb @@ -0,0 +1,1507 @@ +REMARK 1 CREATED WITH OPENMM 8.2, 2025-06-18 +CRYST1 24.772 24.772 24.772 90.00 90.00 90.00 P 1 1 +HETATM 1 O HOH A 1 -39.002 -29.943 -29.061 1.00 0.00 O +HETATM 2 H1 HOH A 1 -38.464 -29.279 -28.631 1.00 0.00 H +HETATM 3 H2 HOH A 1 -39.894 -29.758 -28.767 1.00 0.00 H +HETATM 4 O HOH A 2 -9.797 -10.749 -17.461 1.00 0.00 O +HETATM 5 H1 HOH A 2 -9.932 -11.694 -17.398 1.00 0.00 H +HETATM 6 H2 HOH A 2 -9.367 -10.623 -18.307 1.00 0.00 H +HETATM 7 O HOH A 3 19.938 -0.120 37.005 1.00 0.00 O +HETATM 8 H1 HOH A 3 19.294 -0.636 36.520 1.00 0.00 H +HETATM 9 H2 HOH A 3 20.553 0.185 36.338 1.00 0.00 H +HETATM 10 O HOH A 4 -11.451 45.486 3.501 1.00 0.00 O +HETATM 11 H1 HOH A 4 -11.272 46.414 3.351 1.00 0.00 H +HETATM 12 H2 HOH A 4 -11.857 45.456 4.367 1.00 0.00 H +HETATM 13 O HOH A 5 -30.253 -22.246 6.222 1.00 0.00 O +HETATM 14 H1 HOH A 5 -30.203 -23.011 6.796 1.00 0.00 H +HETATM 15 H2 HOH A 5 -30.620 -21.556 6.774 1.00 0.00 H +HETATM 16 O HOH A 6 -56.711 26.676 11.368 1.00 0.00 O +HETATM 17 H1 HOH A 6 -56.492 25.771 11.146 1.00 0.00 H +HETATM 18 H2 HOH A 6 -57.652 26.661 11.539 1.00 0.00 H +HETATM 19 O HOH A 7 61.760 32.041 -32.143 1.00 0.00 O +HETATM 20 H1 HOH A 7 61.699 32.094 -33.097 1.00 0.00 H +HETATM 21 H2 HOH A 7 62.693 31.919 -31.968 1.00 0.00 H +HETATM 22 O HOH A 8 -35.981 -13.569 -4.722 1.00 0.00 O +HETATM 23 H1 HOH A 8 -36.601 -12.847 -4.621 1.00 0.00 H +HETATM 24 H2 HOH A 8 -35.255 -13.346 -4.139 1.00 0.00 H +HETATM 25 O HOH A 9 23.147 -0.780 -10.856 1.00 0.00 O +HETATM 26 H1 HOH A 9 22.200 -0.915 -10.824 1.00 0.00 H +HETATM 27 H2 HOH A 9 23.309 -0.415 -11.726 1.00 0.00 H +HETATM 28 O HOH A 10 -22.444 0.524 50.795 1.00 0.00 O +HETATM 29 H1 HOH A 10 -23.160 -0.066 51.033 1.00 0.00 H +HETATM 30 H2 HOH A 10 -21.812 -0.036 50.346 1.00 0.00 H +HETATM 31 O HOH A 11 -5.375 21.989 -33.935 1.00 0.00 O +HETATM 32 H1 HOH A 11 -5.193 22.217 -33.024 1.00 0.00 H +HETATM 33 H2 HOH A 11 -5.365 21.032 -33.950 1.00 0.00 H +HETATM 34 O HOH A 12 7.680 -51.817 -21.181 1.00 0.00 O +HETATM 35 H1 HOH A 12 7.721 -51.449 -22.064 1.00 0.00 H +HETATM 36 H2 HOH A 12 6.983 -52.472 -21.226 1.00 0.00 H +HETATM 37 O HOH A 13 21.429 25.829 9.609 1.00 0.00 O +HETATM 38 H1 HOH A 13 22.182 25.559 10.135 1.00 0.00 H +HETATM 39 H2 HOH A 13 21.260 26.732 9.879 1.00 0.00 H +HETATM 40 O HOH A 14 -57.117 26.363 21.826 1.00 0.00 O +HETATM 41 H1 HOH A 14 -57.089 25.452 21.533 1.00 0.00 H +HETATM 42 H2 HOH A 14 -57.441 26.849 21.068 1.00 0.00 H +HETATM 43 O HOH A 15 30.982 33.320 -47.965 1.00 0.00 O +HETATM 44 H1 HOH A 15 30.289 32.774 -47.594 1.00 0.00 H +HETATM 45 H2 HOH A 15 31.205 33.934 -47.266 1.00 0.00 H +HETATM 46 O HOH A 16 1.665 16.351 -29.921 1.00 0.00 O +HETATM 47 H1 HOH A 16 0.831 16.478 -30.374 1.00 0.00 H +HETATM 48 H2 HOH A 16 2.283 16.906 -30.397 1.00 0.00 H +HETATM 49 O HOH A 17 -21.161 -6.534 -66.178 1.00 0.00 O +HETATM 50 H1 HOH A 17 -20.774 -6.026 -65.465 1.00 0.00 H +HETATM 51 H2 HOH A 17 -21.103 -7.443 -65.885 1.00 0.00 H +HETATM 52 O HOH A 18 16.276 -16.332 -4.758 1.00 0.00 O +HETATM 53 H1 HOH A 18 16.057 -15.409 -4.888 1.00 0.00 H +HETATM 54 H2 HOH A 18 16.260 -16.451 -3.808 1.00 0.00 H +HETATM 55 O HOH A 19 31.496 0.317 -35.009 1.00 0.00 O +HETATM 56 H1 HOH A 19 30.787 0.759 -35.476 1.00 0.00 H +HETATM 57 H2 HOH A 19 31.390 -0.608 -35.233 1.00 0.00 H +HETATM 58 O HOH A 20 12.168 -17.365 -38.008 1.00 0.00 O +HETATM 59 H1 HOH A 20 12.940 -17.163 -37.480 1.00 0.00 H +HETATM 60 H2 HOH A 20 12.349 -16.969 -38.860 1.00 0.00 H +HETATM 61 O HOH A 21 10.194 75.128 -61.453 1.00 0.00 O +HETATM 62 H1 HOH A 21 10.248 74.729 -62.322 1.00 0.00 H +HETATM 63 H2 HOH A 21 10.814 74.629 -60.921 1.00 0.00 H +HETATM 64 O HOH A 22 -18.067 -16.454 -27.142 1.00 0.00 O +HETATM 65 H1 HOH A 22 -18.690 -16.931 -26.594 1.00 0.00 H +HETATM 66 H2 HOH A 22 -17.921 -17.027 -27.895 1.00 0.00 H +HETATM 67 O HOH A 23 -53.084 -61.598 14.243 1.00 0.00 O +HETATM 68 H1 HOH A 23 -53.358 -61.063 14.987 1.00 0.00 H +HETATM 69 H2 HOH A 23 -52.247 -61.222 13.971 1.00 0.00 H +HETATM 70 O HOH A 24 0.186 -28.574 -11.216 1.00 0.00 O +HETATM 71 H1 HOH A 24 -0.093 -27.660 -11.268 1.00 0.00 H +HETATM 72 H2 HOH A 24 0.751 -28.610 -10.445 1.00 0.00 H +HETATM 73 O HOH A 25 42.900 -10.746 -26.132 1.00 0.00 O +HETATM 74 H1 HOH A 25 43.023 -10.082 -25.454 1.00 0.00 H +HETATM 75 H2 HOH A 25 42.154 -11.263 -25.828 1.00 0.00 H +HETATM 76 O HOH A 26 -4.656 -35.344 26.723 1.00 0.00 O +HETATM 77 H1 HOH A 26 -5.091 -34.526 26.484 1.00 0.00 H +HETATM 78 H2 HOH A 26 -5.321 -36.018 26.587 1.00 0.00 H +HETATM 79 O HOH A 27 51.984 -43.673 -33.076 1.00 0.00 O +HETATM 80 H1 HOH A 27 51.676 -44.578 -33.123 1.00 0.00 H +HETATM 81 H2 HOH A 27 52.865 -43.700 -33.450 1.00 0.00 H +HETATM 82 O HOH A 28 14.442 15.944 -27.564 1.00 0.00 O +HETATM 83 H1 HOH A 28 14.940 15.700 -26.784 1.00 0.00 H +HETATM 84 H2 HOH A 28 13.680 16.414 -27.224 1.00 0.00 H +HETATM 85 O HOH A 29 15.917 -38.283 16.971 1.00 0.00 O +HETATM 86 H1 HOH A 29 15.119 -38.797 16.848 1.00 0.00 H +HETATM 87 H2 HOH A 29 16.600 -38.934 17.130 1.00 0.00 H +HETATM 88 O HOH A 30 6.222 2.365 41.702 1.00 0.00 O +HETATM 89 H1 HOH A 30 5.493 2.388 41.082 1.00 0.00 H +HETATM 90 H2 HOH A 30 6.999 2.255 41.154 1.00 0.00 H +HETATM 91 O HOH A 31 50.915 19.336 -14.742 1.00 0.00 O +HETATM 92 H1 HOH A 31 51.518 18.815 -15.272 1.00 0.00 H +HETATM 93 H2 HOH A 31 50.712 18.779 -13.991 1.00 0.00 H +HETATM 94 O HOH A 32 10.379 -3.725 14.009 1.00 0.00 O +HETATM 95 H1 HOH A 32 9.776 -3.047 14.312 1.00 0.00 H +HETATM 96 H2 HOH A 32 10.269 -3.737 13.058 1.00 0.00 H +HETATM 97 O HOH A 33 44.108 -38.207 -2.668 1.00 0.00 O +HETATM 98 H1 HOH A 33 44.686 -37.550 -3.055 1.00 0.00 H +HETATM 99 H2 HOH A 33 44.235 -38.113 -1.724 1.00 0.00 H +HETATM 100 O HOH A 34 54.756 -47.789 37.766 1.00 0.00 O +HETATM 101 H1 HOH A 34 55.235 -46.999 37.517 1.00 0.00 H +HETATM 102 H2 HOH A 34 53.918 -47.716 37.308 1.00 0.00 H +HETATM 103 O HOH A 35 19.007 -13.483 -11.800 1.00 0.00 O +HETATM 104 H1 HOH A 35 19.683 -13.123 -11.226 1.00 0.00 H +HETATM 105 H2 HOH A 35 18.565 -14.143 -11.266 1.00 0.00 H +HETATM 106 O HOH A 36 -33.609 -6.623 -0.385 1.00 0.00 O +HETATM 107 H1 HOH A 36 -33.508 -5.726 -0.069 1.00 0.00 H +HETATM 108 H2 HOH A 36 -33.683 -6.536 -1.336 1.00 0.00 H +HETATM 109 O HOH A 37 12.076 -17.255 29.436 1.00 0.00 O +HETATM 110 H1 HOH A 37 12.423 -17.104 28.556 1.00 0.00 H +HETATM 111 H2 HOH A 37 11.179 -16.921 29.401 1.00 0.00 H +HETATM 112 O HOH A 38 8.335 -21.643 11.169 1.00 0.00 O +HETATM 113 H1 HOH A 38 8.993 -21.302 10.564 1.00 0.00 H +HETATM 114 H2 HOH A 38 8.841 -22.100 11.841 1.00 0.00 H +HETATM 115 O HOH A 39 -26.730 15.435 -44.891 1.00 0.00 O +HETATM 116 H1 HOH A 39 -27.441 14.795 -44.919 1.00 0.00 H +HETATM 117 H2 HOH A 39 -26.969 16.089 -45.548 1.00 0.00 H +HETATM 118 O HOH A 40 -2.603 -32.136 -17.320 1.00 0.00 O +HETATM 119 H1 HOH A 40 -3.238 -32.026 -18.028 1.00 0.00 H +HETATM 120 H2 HOH A 40 -2.867 -32.947 -16.886 1.00 0.00 H +HETATM 121 O HOH A 41 -65.327 13.839 -41.661 1.00 0.00 O +HETATM 122 H1 HOH A 41 -65.527 13.187 -40.989 1.00 0.00 H +HETATM 123 H2 HOH A 41 -65.130 14.637 -41.169 1.00 0.00 H +HETATM 124 O HOH A 42 -26.801 14.881 -24.259 1.00 0.00 O +HETATM 125 H1 HOH A 42 -27.489 14.719 -23.613 1.00 0.00 H +HETATM 126 H2 HOH A 42 -26.979 15.764 -24.583 1.00 0.00 H +HETATM 127 O HOH A 43 6.208 57.609 -7.096 1.00 0.00 O +HETATM 128 H1 HOH A 43 6.376 57.335 -6.194 1.00 0.00 H +HETATM 129 H2 HOH A 43 6.470 56.858 -7.628 1.00 0.00 H +HETATM 130 O HOH A 44 -9.506 5.833 11.362 1.00 0.00 O +HETATM 131 H1 HOH A 44 -9.672 5.816 12.305 1.00 0.00 H +HETATM 132 H2 HOH A 44 -8.675 6.300 11.273 1.00 0.00 H +HETATM 133 O HOH A 45 -13.782 -1.636 -23.859 1.00 0.00 O +HETATM 134 H1 HOH A 45 -13.505 -2.520 -23.617 1.00 0.00 H +HETATM 135 H2 HOH A 45 -14.738 -1.682 -23.881 1.00 0.00 H +HETATM 136 O HOH A 46 -45.282 14.343 18.783 1.00 0.00 O +HETATM 137 H1 HOH A 46 -44.565 13.716 18.686 1.00 0.00 H +HETATM 138 H2 HOH A 46 -45.018 14.898 19.517 1.00 0.00 H +HETATM 139 O HOH A 47 -9.158 10.552 38.371 1.00 0.00 O +HETATM 140 H1 HOH A 47 -8.889 11.471 38.356 1.00 0.00 H +HETATM 141 H2 HOH A 47 -8.360 10.072 38.593 1.00 0.00 H +HETATM 142 O HOH A 48 -22.060 20.892 -71.548 1.00 0.00 O +HETATM 143 H1 HOH A 48 -22.855 20.751 -71.033 1.00 0.00 H +HETATM 144 H2 HOH A 48 -22.318 21.526 -72.217 1.00 0.00 H +HETATM 145 O HOH A 49 -35.612 2.311 5.778 1.00 0.00 O +HETATM 146 H1 HOH A 49 -36.451 2.375 5.321 1.00 0.00 H +HETATM 147 H2 HOH A 49 -35.057 2.966 5.354 1.00 0.00 H +HETATM 148 O HOH A 50 15.809 -29.780 27.802 1.00 0.00 O +HETATM 149 H1 HOH A 50 16.190 -29.329 27.049 1.00 0.00 H +HETATM 150 H2 HOH A 50 15.001 -29.301 27.985 1.00 0.00 H +HETATM 151 O HOH A 51 41.471 23.381 -53.062 1.00 0.00 O +HETATM 152 H1 HOH A 51 42.302 22.915 -53.160 1.00 0.00 H +HETATM 153 H2 HOH A 51 40.965 23.136 -53.837 1.00 0.00 H +HETATM 154 O HOH A 52 13.166 36.728 -36.374 1.00 0.00 O +HETATM 155 H1 HOH A 52 14.113 36.605 -36.313 1.00 0.00 H +HETATM 156 H2 HOH A 52 12.871 36.031 -36.960 1.00 0.00 H +HETATM 157 O HOH A 53 16.142 -31.205 19.048 1.00 0.00 O +HETATM 158 H1 HOH A 53 15.938 -30.471 18.469 1.00 0.00 H +HETATM 159 H2 HOH A 53 15.944 -30.880 19.926 1.00 0.00 H +HETATM 160 O HOH A 54 -23.134 -30.314 -43.138 1.00 0.00 O +HETATM 161 H1 HOH A 54 -22.444 -30.245 -42.478 1.00 0.00 H +HETATM 162 H2 HOH A 54 -23.445 -31.217 -43.067 1.00 0.00 H +HETATM 163 O HOH A 55 -24.772 -21.987 3.382 1.00 0.00 O +HETATM 164 H1 HOH A 55 -24.690 -21.215 3.942 1.00 0.00 H +HETATM 165 H2 HOH A 55 -25.689 -21.990 3.109 1.00 0.00 H +HETATM 166 O HOH A 56 -16.225 6.038 6.741 1.00 0.00 O +HETATM 167 H1 HOH A 56 -16.963 6.226 6.162 1.00 0.00 H +HETATM 168 H2 HOH A 56 -16.627 5.698 7.540 1.00 0.00 H +HETATM 169 O HOH A 57 -20.100 -25.744 61.075 1.00 0.00 O +HETATM 170 H1 HOH A 57 -20.813 -26.379 61.015 1.00 0.00 H +HETATM 171 H2 HOH A 57 -20.537 -24.907 61.233 1.00 0.00 H +HETATM 172 O HOH A 58 63.186 33.919 26.021 1.00 0.00 O +HETATM 173 H1 HOH A 58 63.190 34.640 25.392 1.00 0.00 H +HETATM 174 H2 HOH A 58 62.459 33.362 25.743 1.00 0.00 H +HETATM 175 O HOH A 59 -20.757 22.573 -2.437 1.00 0.00 O +HETATM 176 H1 HOH A 59 -21.619 22.736 -2.052 1.00 0.00 H +HETATM 177 H2 HOH A 59 -20.875 22.743 -3.371 1.00 0.00 H +HETATM 178 O HOH A 60 21.574 2.906 -21.449 1.00 0.00 O +HETATM 179 H1 HOH A 60 21.726 2.342 -20.692 1.00 0.00 H +HETATM 180 H2 HOH A 60 20.644 3.128 -21.401 1.00 0.00 H +HETATM 181 O HOH A 61 32.603 34.619 6.168 1.00 0.00 O +HETATM 182 H1 HOH A 61 32.252 35.261 5.551 1.00 0.00 H +HETATM 183 H2 HOH A 61 32.585 35.065 7.014 1.00 0.00 H +HETATM 184 O HOH A 62 59.360 -25.069 -8.363 1.00 0.00 O +HETATM 185 H1 HOH A 62 59.971 -24.917 -7.642 1.00 0.00 H +HETATM 186 H2 HOH A 62 59.371 -24.253 -8.863 1.00 0.00 H +HETATM 187 O HOH A 63 -12.127 -50.141 -12.135 1.00 0.00 O +HETATM 188 H1 HOH A 63 -12.716 -50.563 -12.760 1.00 0.00 H +HETATM 189 H2 HOH A 63 -11.553 -50.846 -11.834 1.00 0.00 H +HETATM 190 O HOH A 64 -8.739 -4.710 -7.946 1.00 0.00 O +HETATM 191 H1 HOH A 64 -9.364 -5.350 -8.287 1.00 0.00 H +HETATM 192 H2 HOH A 64 -8.982 -3.887 -8.370 1.00 0.00 H +HETATM 193 O HOH A 65 18.799 -5.578 19.119 1.00 0.00 O +HETATM 194 H1 HOH A 65 17.905 -5.920 19.082 1.00 0.00 H +HETATM 195 H2 HOH A 65 19.352 -6.358 19.161 1.00 0.00 H +HETATM 196 O HOH A 66 -32.229 87.900 17.029 1.00 0.00 O +HETATM 197 H1 HOH A 66 -32.703 87.074 16.930 1.00 0.00 H +HETATM 198 H2 HOH A 66 -32.306 88.111 17.959 1.00 0.00 H +HETATM 199 O HOH A 67 -7.350 -57.165 -44.135 1.00 0.00 O +HETATM 200 H1 HOH A 67 -7.083 -57.617 -43.334 1.00 0.00 H +HETATM 201 H2 HOH A 67 -7.854 -56.411 -43.829 1.00 0.00 H +HETATM 202 O HOH A 68 -10.778 -8.165 6.015 1.00 0.00 O +HETATM 203 H1 HOH A 68 -10.491 -9.075 5.939 1.00 0.00 H +HETATM 204 H2 HOH A 68 -10.333 -7.837 6.796 1.00 0.00 H +HETATM 205 O HOH A 69 13.326 63.061 -14.925 1.00 0.00 O +HETATM 206 H1 HOH A 69 12.627 63.197 -15.565 1.00 0.00 H +HETATM 207 H2 HOH A 69 12.972 63.407 -14.106 1.00 0.00 H +HETATM 208 O HOH A 70 18.319 -34.362 38.481 1.00 0.00 O +HETATM 209 H1 HOH A 70 17.635 -34.955 38.171 1.00 0.00 H +HETATM 210 H2 HOH A 70 17.872 -33.525 38.606 1.00 0.00 H +HETATM 211 O HOH A 71 -39.472 23.201 30.610 1.00 0.00 O +HETATM 212 H1 HOH A 71 -40.017 23.970 30.442 1.00 0.00 H +HETATM 213 H2 HOH A 71 -39.881 22.778 31.364 1.00 0.00 H +HETATM 214 O HOH A 72 8.563 11.789 9.492 1.00 0.00 O +HETATM 215 H1 HOH A 72 9.405 11.396 9.724 1.00 0.00 H +HETATM 216 H2 HOH A 72 7.911 11.205 9.880 1.00 0.00 H +HETATM 217 O HOH A 73 -1.297 28.032 34.241 1.00 0.00 O +HETATM 218 H1 HOH A 73 -1.756 28.820 33.950 1.00 0.00 H +HETATM 219 H2 HOH A 73 -0.770 28.323 34.986 1.00 0.00 H +HETATM 220 O HOH A 74 0.861 -32.280 -13.127 1.00 0.00 O +HETATM 221 H1 HOH A 74 0.057 -32.218 -12.610 1.00 0.00 H +HETATM 222 H2 HOH A 74 0.686 -32.975 -13.761 1.00 0.00 H +HETATM 223 O HOH A 75 12.112 -59.521 -16.989 1.00 0.00 O +HETATM 224 H1 HOH A 75 12.950 -59.085 -17.143 1.00 0.00 H +HETATM 225 H2 HOH A 75 11.917 -59.964 -17.815 1.00 0.00 H +HETATM 226 O HOH A 76 -14.533 -8.585 -15.348 1.00 0.00 O +HETATM 227 H1 HOH A 76 -14.877 -8.006 -16.028 1.00 0.00 H +HETATM 228 H2 HOH A 76 -13.780 -9.013 -15.756 1.00 0.00 H +HETATM 229 O HOH A 77 16.185 -23.772 -5.339 1.00 0.00 O +HETATM 230 H1 HOH A 77 15.231 -23.845 -5.288 1.00 0.00 H +HETATM 231 H2 HOH A 77 16.454 -24.515 -5.879 1.00 0.00 H +HETATM 232 O HOH A 78 30.393 11.139 -12.612 1.00 0.00 O +HETATM 233 H1 HOH A 78 31.254 11.533 -12.751 1.00 0.00 H +HETATM 234 H2 HOH A 78 29.846 11.862 -12.305 1.00 0.00 H +HETATM 235 O HOH A 79 -8.252 -41.871 54.319 1.00 0.00 O +HETATM 236 H1 HOH A 79 -8.671 -41.018 54.214 1.00 0.00 H +HETATM 237 H2 HOH A 79 -8.142 -41.970 55.265 1.00 0.00 H +HETATM 238 O HOH A 80 -51.907 -39.359 38.469 1.00 0.00 O +HETATM 239 H1 HOH A 80 -52.472 -38.591 38.558 1.00 0.00 H +HETATM 240 H2 HOH A 80 -52.136 -39.913 39.215 1.00 0.00 H +HETATM 241 O HOH A 81 -4.093 6.423 64.188 1.00 0.00 O +HETATM 242 H1 HOH A 81 -3.707 7.284 64.349 1.00 0.00 H +HETATM 243 H2 HOH A 81 -4.498 6.181 65.021 1.00 0.00 H +HETATM 244 O HOH A 82 22.028 -32.505 -52.824 1.00 0.00 O +HETATM 245 H1 HOH A 82 22.554 -33.303 -52.874 1.00 0.00 H +HETATM 246 H2 HOH A 82 21.613 -32.438 -53.684 1.00 0.00 H +HETATM 247 O HOH A 83 60.653 24.253 -26.729 1.00 0.00 O +HETATM 248 H1 HOH A 83 60.807 23.914 -25.847 1.00 0.00 H +HETATM 249 H2 HOH A 83 59.988 24.932 -26.613 1.00 0.00 H +HETATM 250 O HOH A 84 -9.460 60.677 -14.558 1.00 0.00 O +HETATM 251 H1 HOH A 84 -10.193 61.265 -14.377 1.00 0.00 H +HETATM 252 H2 HOH A 84 -9.851 59.804 -14.577 1.00 0.00 H +HETATM 253 O HOH A 85 -30.404 -31.938 -15.470 1.00 0.00 O +HETATM 254 H1 HOH A 85 -30.626 -31.645 -14.586 1.00 0.00 H +HETATM 255 H2 HOH A 85 -31.183 -32.405 -15.771 1.00 0.00 H +HETATM 256 O HOH A 86 -30.378 33.237 57.122 1.00 0.00 O +HETATM 257 H1 HOH A 86 -31.333 33.214 57.051 1.00 0.00 H +HETATM 258 H2 HOH A 86 -30.080 32.502 56.587 1.00 0.00 H +HETATM 259 O HOH A 87 44.843 -29.416 33.439 1.00 0.00 O +HETATM 260 H1 HOH A 87 44.530 -30.285 33.189 1.00 0.00 H +HETATM 261 H2 HOH A 87 45.753 -29.555 33.703 1.00 0.00 H +HETATM 262 O HOH A 88 13.091 47.567 -56.112 1.00 0.00 O +HETATM 263 H1 HOH A 88 13.542 48.297 -56.536 1.00 0.00 H +HETATM 264 H2 HOH A 88 12.255 47.936 -55.826 1.00 0.00 H +HETATM 265 O HOH A 89 21.652 -5.258 18.775 1.00 0.00 O +HETATM 266 H1 HOH A 89 20.733 -5.515 18.851 1.00 0.00 H +HETATM 267 H2 HOH A 89 21.666 -4.628 18.054 1.00 0.00 H +HETATM 268 O HOH A 90 -78.874 -13.810 24.632 1.00 0.00 O +HETATM 269 H1 HOH A 90 -79.160 -13.862 25.544 1.00 0.00 H +HETATM 270 H2 HOH A 90 -78.118 -13.223 24.650 1.00 0.00 H +HETATM 271 O HOH A 91 45.682 37.600 60.621 1.00 0.00 O +HETATM 272 H1 HOH A 91 45.890 38.375 61.143 1.00 0.00 H +HETATM 273 H2 HOH A 91 44.841 37.298 60.963 1.00 0.00 H +HETATM 274 O HOH A 92 -36.037 -50.931 -20.689 1.00 0.00 O +HETATM 275 H1 HOH A 92 -36.753 -50.390 -21.021 1.00 0.00 H +HETATM 276 H2 HOH A 92 -35.293 -50.331 -20.625 1.00 0.00 H +HETATM 277 O HOH A 93 37.157 -4.844 -1.422 1.00 0.00 O +HETATM 278 H1 HOH A 93 37.948 -4.344 -1.624 1.00 0.00 H +HETATM 279 H2 HOH A 93 36.870 -4.505 -0.574 1.00 0.00 H +HETATM 280 O HOH A 94 9.755 -9.055 46.082 1.00 0.00 O +HETATM 281 H1 HOH A 94 9.035 -8.898 45.470 1.00 0.00 H +HETATM 282 H2 HOH A 94 10.541 -9.044 45.536 1.00 0.00 H +HETATM 283 O HOH A 95 -22.624 -10.697 59.235 1.00 0.00 O +HETATM 284 H1 HOH A 95 -23.074 -10.956 60.039 1.00 0.00 H +HETATM 285 H2 HOH A 95 -22.740 -11.441 58.645 1.00 0.00 H +HETATM 286 O HOH A 96 -17.826 -26.082 -52.492 1.00 0.00 O +HETATM 287 H1 HOH A 96 -18.123 -26.798 -51.931 1.00 0.00 H +HETATM 288 H2 HOH A 96 -17.038 -26.421 -52.917 1.00 0.00 H +HETATM 289 O HOH A 97 3.614 37.481 -11.436 1.00 0.00 O +HETATM 290 H1 HOH A 97 2.900 38.028 -11.764 1.00 0.00 H +HETATM 291 H2 HOH A 97 4.219 38.099 -11.024 1.00 0.00 H +HETATM 292 O HOH A 98 -11.156 -22.211 -26.038 1.00 0.00 O +HETATM 293 H1 HOH A 98 -11.847 -21.892 -25.458 1.00 0.00 H +HETATM 294 H2 HOH A 98 -10.569 -21.463 -26.145 1.00 0.00 H +HETATM 295 O HOH A 99 -9.869 32.058 -31.991 1.00 0.00 O +HETATM 296 H1 HOH A 99 -9.323 32.110 -31.206 1.00 0.00 H +HETATM 297 H2 HOH A 99 -9.354 31.540 -32.608 1.00 0.00 H +HETATM 298 O HOH A 100 20.146 11.259 -6.383 1.00 0.00 O +HETATM 299 H1 HOH A 100 19.891 12.103 -6.010 1.00 0.00 H +HETATM 300 H2 HOH A 100 21.103 11.290 -6.413 1.00 0.00 H +HETATM 301 O HOH A 101 41.225 28.695 -30.825 1.00 0.00 O +HETATM 302 H1 HOH A 101 40.768 29.118 -30.098 1.00 0.00 H +HETATM 303 H2 HOH A 101 40.900 27.794 -30.820 1.00 0.00 H +HETATM 304 O HOH A 102 -21.642 4.672 57.845 1.00 0.00 O +HETATM 305 H1 HOH A 102 -21.085 4.834 58.606 1.00 0.00 H +HETATM 306 H2 HOH A 102 -22.279 5.386 57.858 1.00 0.00 H +HETATM 307 O HOH A 103 32.348 -33.564 29.391 1.00 0.00 O +HETATM 308 H1 HOH A 103 32.827 -34.370 29.584 1.00 0.00 H +HETATM 309 H2 HOH A 103 31.786 -33.791 28.649 1.00 0.00 H +HETATM 310 O HOH A 104 -5.272 13.859 -54.996 1.00 0.00 O +HETATM 311 H1 HOH A 104 -4.576 13.796 -54.342 1.00 0.00 H +HETATM 312 H2 HOH A 104 -6.066 14.024 -54.486 1.00 0.00 H +HETATM 313 O HOH A 105 -29.367 -6.724 5.595 1.00 0.00 O +HETATM 314 H1 HOH A 105 -30.198 -6.846 5.136 1.00 0.00 H +HETATM 315 H2 HOH A 105 -29.452 -5.872 6.023 1.00 0.00 H +HETATM 316 O HOH A 106 -33.857 -30.251 -18.720 1.00 0.00 O +HETATM 317 H1 HOH A 106 -33.989 -30.473 -17.798 1.00 0.00 H +HETATM 318 H2 HOH A 106 -34.733 -30.044 -19.045 1.00 0.00 H +HETATM 319 O HOH A 107 27.868 -12.593 5.833 1.00 0.00 O +HETATM 320 H1 HOH A 107 28.666 -12.077 5.719 1.00 0.00 H +HETATM 321 H2 HOH A 107 28.135 -13.493 5.647 1.00 0.00 H +HETATM 322 O HOH A 108 -35.720 25.485 41.996 1.00 0.00 O +HETATM 323 H1 HOH A 108 -36.049 26.142 42.610 1.00 0.00 H +HETATM 324 H2 HOH A 108 -36.003 25.797 41.136 1.00 0.00 H +HETATM 325 O HOH A 109 28.133 75.597 41.421 1.00 0.00 O +HETATM 326 H1 HOH A 109 28.750 74.976 41.806 1.00 0.00 H +HETATM 327 H2 HOH A 109 27.316 75.452 41.898 1.00 0.00 H +HETATM 328 O HOH A 110 -44.897 61.413 -24.131 1.00 0.00 O +HETATM 329 H1 HOH A 110 -45.555 61.193 -24.791 1.00 0.00 H +HETATM 330 H2 HOH A 110 -45.392 61.492 -23.316 1.00 0.00 H +HETATM 331 O HOH A 111 -13.151 -24.023 -16.333 1.00 0.00 O +HETATM 332 H1 HOH A 111 -13.263 -24.837 -16.823 1.00 0.00 H +HETATM 333 H2 HOH A 111 -12.207 -23.869 -16.336 1.00 0.00 H +HETATM 334 O HOH A 112 -14.490 30.343 -62.468 1.00 0.00 O +HETATM 335 H1 HOH A 112 -14.546 29.974 -63.350 1.00 0.00 H +HETATM 336 H2 HOH A 112 -13.713 30.902 -62.491 1.00 0.00 H +HETATM 337 O HOH A 113 -16.737 -36.611 -44.151 1.00 0.00 O +HETATM 338 H1 HOH A 113 -16.367 -36.491 -43.277 1.00 0.00 H +HETATM 339 H2 HOH A 113 -16.114 -37.183 -44.599 1.00 0.00 H +HETATM 340 O HOH A 114 -59.608 -20.028 7.835 1.00 0.00 O +HETATM 341 H1 HOH A 114 -60.277 -20.053 8.520 1.00 0.00 H +HETATM 342 H2 HOH A 114 -60.067 -20.304 7.042 1.00 0.00 H +HETATM 343 O HOH A 115 -59.714 -2.400 -60.926 1.00 0.00 O +HETATM 344 H1 HOH A 115 -58.893 -2.537 -60.453 1.00 0.00 H +HETATM 345 H2 HOH A 115 -60.224 -3.192 -60.757 1.00 0.00 H +HETATM 346 O HOH A 116 -33.770 49.165 -16.481 1.00 0.00 O +HETATM 347 H1 HOH A 116 -32.983 48.628 -16.568 1.00 0.00 H +HETATM 348 H2 HOH A 116 -34.286 48.727 -15.804 1.00 0.00 H +HETATM 349 O HOH A 117 46.134 45.474 38.625 1.00 0.00 O +HETATM 350 H1 HOH A 117 45.523 44.794 38.911 1.00 0.00 H +HETATM 351 H2 HOH A 117 45.805 45.748 37.769 1.00 0.00 H +HETATM 352 O HOH A 118 8.208 26.095 1.636 1.00 0.00 O +HETATM 353 H1 HOH A 118 8.168 25.141 1.705 1.00 0.00 H +HETATM 354 H2 HOH A 118 7.450 26.403 2.133 1.00 0.00 H +HETATM 355 O HOH A 119 -35.695 -37.871 -26.134 1.00 0.00 O +HETATM 356 H1 HOH A 119 -36.464 -37.801 -26.700 1.00 0.00 H +HETATM 357 H2 HOH A 119 -36.031 -37.711 -25.252 1.00 0.00 H +HETATM 358 O HOH A 120 51.401 -22.241 -17.664 1.00 0.00 O +HETATM 359 H1 HOH A 120 50.929 -21.651 -18.251 1.00 0.00 H +HETATM 360 H2 HOH A 120 51.821 -21.663 -17.028 1.00 0.00 H +HETATM 361 O HOH A 121 12.003 -31.992 -27.272 1.00 0.00 O +HETATM 362 H1 HOH A 121 12.193 -31.271 -26.671 1.00 0.00 H +HETATM 363 H2 HOH A 121 11.732 -31.562 -28.084 1.00 0.00 H +HETATM 364 O HOH A 122 10.018 35.946 -69.519 1.00 0.00 O +HETATM 365 H1 HOH A 122 10.118 35.817 -68.576 1.00 0.00 H +HETATM 366 H2 HOH A 122 10.030 35.061 -69.885 1.00 0.00 H +HETATM 367 O HOH A 123 -31.848 -16.173 -27.030 1.00 0.00 O +HETATM 368 H1 HOH A 123 -31.214 -16.778 -27.416 1.00 0.00 H +HETATM 369 H2 HOH A 123 -31.374 -15.345 -26.956 1.00 0.00 H +HETATM 370 O HOH A 124 -4.645 1.957 48.457 1.00 0.00 O +HETATM 371 H1 HOH A 124 -3.936 2.528 48.753 1.00 0.00 H +HETATM 372 H2 HOH A 124 -5.438 2.349 48.824 1.00 0.00 H +HETATM 373 O HOH A 125 -25.667 -11.500 -10.507 1.00 0.00 O +HETATM 374 H1 HOH A 125 -25.464 -10.855 -9.830 1.00 0.00 H +HETATM 375 H2 HOH A 125 -25.520 -12.346 -10.083 1.00 0.00 H +HETATM 376 O HOH A 126 25.234 9.669 6.383 1.00 0.00 O +HETATM 377 H1 HOH A 126 24.994 9.990 5.514 1.00 0.00 H +HETATM 378 H2 HOH A 126 24.664 10.150 6.982 1.00 0.00 H +HETATM 379 O HOH A 127 1.264 -24.505 -34.904 1.00 0.00 O +HETATM 380 H1 HOH A 127 1.242 -24.593 -33.951 1.00 0.00 H +HETATM 381 H2 HOH A 127 0.379 -24.226 -35.139 1.00 0.00 H +HETATM 382 O HOH A 128 8.697 -2.580 -6.545 1.00 0.00 O +HETATM 383 H1 HOH A 128 9.076 -1.833 -7.008 1.00 0.00 H +HETATM 384 H2 HOH A 128 8.834 -2.384 -5.619 1.00 0.00 H +HETATM 385 O HOH A 129 49.547 -13.697 15.719 1.00 0.00 O +HETATM 386 H1 HOH A 129 50.480 -13.498 15.648 1.00 0.00 H +HETATM 387 H2 HOH A 129 49.517 -14.572 16.107 1.00 0.00 H +HETATM 388 O HOH A 130 55.045 3.522 -30.049 1.00 0.00 O +HETATM 389 H1 HOH A 130 55.217 3.321 -30.969 1.00 0.00 H +HETATM 390 H2 HOH A 130 55.645 2.956 -29.564 1.00 0.00 H +HETATM 391 O HOH A 131 -1.369 0.065 11.283 1.00 0.00 O +HETATM 392 H1 HOH A 131 -1.526 -0.752 10.809 1.00 0.00 H +HETATM 393 H2 HOH A 131 -0.459 0.287 11.083 1.00 0.00 H +HETATM 394 O HOH A 132 -21.480 -40.131 18.953 1.00 0.00 O +HETATM 395 H1 HOH A 132 -21.484 -40.085 17.997 1.00 0.00 H +HETATM 396 H2 HOH A 132 -20.562 -40.013 19.196 1.00 0.00 H +HETATM 397 O HOH A 133 16.432 16.411 -7.761 1.00 0.00 O +HETATM 398 H1 HOH A 133 15.998 15.587 -7.542 1.00 0.00 H +HETATM 399 H2 HOH A 133 16.255 16.982 -7.013 1.00 0.00 H +HETATM 400 O HOH A 134 -1.415 23.250 31.849 1.00 0.00 O +HETATM 401 H1 HOH A 134 -1.905 23.446 32.647 1.00 0.00 H +HETATM 402 H2 HOH A 134 -1.078 24.098 31.560 1.00 0.00 H +HETATM 403 O HOH A 135 4.833 -7.766 11.556 1.00 0.00 O +HETATM 404 H1 HOH A 135 4.288 -7.988 10.801 1.00 0.00 H +HETATM 405 H2 HOH A 135 4.537 -8.357 12.248 1.00 0.00 H +HETATM 406 O HOH A 136 -24.826 38.065 52.800 1.00 0.00 O +HETATM 407 H1 HOH A 136 -24.864 38.523 53.640 1.00 0.00 H +HETATM 408 H2 HOH A 136 -25.150 38.703 52.164 1.00 0.00 H +HETATM 409 O HOH A 137 -25.330 -42.451 22.134 1.00 0.00 O +HETATM 410 H1 HOH A 137 -24.572 -42.021 21.736 1.00 0.00 H +HETATM 411 H2 HOH A 137 -25.796 -41.746 22.584 1.00 0.00 H +HETATM 412 O HOH A 138 -11.444 -33.736 -9.438 1.00 0.00 O +HETATM 413 H1 HOH A 138 -12.324 -33.936 -9.757 1.00 0.00 H +HETATM 414 H2 HOH A 138 -11.290 -34.375 -8.742 1.00 0.00 H +HETATM 415 O HOH A 139 15.776 -9.808 -14.493 1.00 0.00 O +HETATM 416 H1 HOH A 139 16.479 -10.454 -14.427 1.00 0.00 H +HETATM 417 H2 HOH A 139 15.047 -10.287 -14.887 1.00 0.00 H +HETATM 418 O HOH A 140 -7.078 -15.524 39.436 1.00 0.00 O +HETATM 419 H1 HOH A 140 -6.884 -15.501 40.373 1.00 0.00 H +HETATM 420 H2 HOH A 140 -7.252 -16.446 39.249 1.00 0.00 H +HETATM 421 O HOH A 141 7.314 20.038 -91.814 1.00 0.00 O +HETATM 422 H1 HOH A 141 6.712 20.704 -91.484 1.00 0.00 H +HETATM 423 H2 HOH A 141 6.777 19.491 -92.388 1.00 0.00 H +HETATM 424 O HOH A 142 5.104 14.366 5.296 1.00 0.00 O +HETATM 425 H1 HOH A 142 4.334 14.930 5.232 1.00 0.00 H +HETATM 426 H2 HOH A 142 5.676 14.658 4.586 1.00 0.00 H +HETATM 427 O HOH A 143 -0.864 10.567 4.056 1.00 0.00 O +HETATM 428 H1 HOH A 143 -0.805 11.325 3.474 1.00 0.00 H +HETATM 429 H2 HOH A 143 -1.745 10.617 4.426 1.00 0.00 H +HETATM 430 O HOH A 144 -23.923 4.858 -35.759 1.00 0.00 O +HETATM 431 H1 HOH A 144 -24.668 5.445 -35.632 1.00 0.00 H +HETATM 432 H2 HOH A 144 -23.593 4.694 -34.875 1.00 0.00 H +HETATM 433 O HOH A 145 -27.233 12.436 -50.047 1.00 0.00 O +HETATM 434 H1 HOH A 145 -26.525 12.202 -50.647 1.00 0.00 H +HETATM 435 H2 HOH A 145 -27.010 13.316 -49.744 1.00 0.00 H +HETATM 436 O HOH A 146 33.453 -16.113 -49.714 1.00 0.00 O +HETATM 437 H1 HOH A 146 32.770 -16.215 -49.051 1.00 0.00 H +HETATM 438 H2 HOH A 146 33.052 -16.429 -50.523 1.00 0.00 H +HETATM 439 O HOH A 147 25.603 106.881 14.306 1.00 0.00 O +HETATM 440 H1 HOH A 147 25.821 106.821 15.236 1.00 0.00 H +HETATM 441 H2 HOH A 147 24.695 106.585 14.252 1.00 0.00 H +HETATM 442 O HOH A 148 55.988 -14.140 -21.271 1.00 0.00 O +HETATM 443 H1 HOH A 148 55.188 -13.827 -20.850 1.00 0.00 H +HETATM 444 H2 HOH A 148 56.323 -13.379 -21.745 1.00 0.00 H +HETATM 445 O HOH A 149 0.464 -2.089 -6.189 1.00 0.00 O +HETATM 446 H1 HOH A 149 0.115 -1.663 -5.407 1.00 0.00 H +HETATM 447 H2 HOH A 149 -0.090 -1.772 -6.903 1.00 0.00 H +HETATM 448 O HOH A 150 -11.042 61.570 4.310 1.00 0.00 O +HETATM 449 H1 HOH A 150 -10.468 61.588 5.076 1.00 0.00 H +HETATM 450 H2 HOH A 150 -11.467 62.428 4.308 1.00 0.00 H +HETATM 451 O HOH A 151 -20.157 44.247 -14.487 1.00 0.00 O +HETATM 452 H1 HOH A 151 -20.503 45.003 -14.012 1.00 0.00 H +HETATM 453 H2 HOH A 151 -20.016 43.584 -13.811 1.00 0.00 H +HETATM 454 O HOH A 152 27.945 33.386 41.110 1.00 0.00 O +HETATM 455 H1 HOH A 152 28.486 32.788 40.594 1.00 0.00 H +HETATM 456 H2 HOH A 152 27.161 32.879 41.321 1.00 0.00 H +HETATM 457 O HOH A 153 8.573 -22.187 -10.079 1.00 0.00 O +HETATM 458 H1 HOH A 153 8.148 -23.030 -10.234 1.00 0.00 H +HETATM 459 H2 HOH A 153 9.414 -22.255 -10.532 1.00 0.00 H +HETATM 460 O HOH A 154 13.301 4.203 -14.449 1.00 0.00 O +HETATM 461 H1 HOH A 154 13.931 4.886 -14.216 1.00 0.00 H +HETATM 462 H2 HOH A 154 13.674 3.399 -14.086 1.00 0.00 H +HETATM 463 O HOH A 155 -54.524 3.389 -38.443 1.00 0.00 O +HETATM 464 H1 HOH A 155 -54.287 3.584 -37.536 1.00 0.00 H +HETATM 465 H2 HOH A 155 -55.290 2.819 -38.374 1.00 0.00 H +HETATM 466 O HOH A 156 16.686 -0.601 54.852 1.00 0.00 O +HETATM 467 H1 HOH A 156 16.678 -0.263 55.747 1.00 0.00 H +HETATM 468 H2 HOH A 156 17.401 -1.238 54.842 1.00 0.00 H +HETATM 469 O HOH A 157 -31.998 -28.270 -68.274 1.00 0.00 O +HETATM 470 H1 HOH A 157 -32.615 -28.989 -68.414 1.00 0.00 H +HETATM 471 H2 HOH A 157 -31.545 -28.177 -69.112 1.00 0.00 H +HETATM 472 O HOH A 158 -6.418 13.479 8.237 1.00 0.00 O +HETATM 473 H1 HOH A 158 -6.733 13.146 9.078 1.00 0.00 H +HETATM 474 H2 HOH A 158 -5.559 13.070 8.125 1.00 0.00 H +HETATM 475 O HOH A 159 -34.344 -17.050 22.953 1.00 0.00 O +HETATM 476 H1 HOH A 159 -33.477 -16.737 22.695 1.00 0.00 H +HETATM 477 H2 HOH A 159 -34.185 -17.576 23.737 1.00 0.00 H +HETATM 478 O HOH A 160 49.700 11.915 23.301 1.00 0.00 O +HETATM 479 H1 HOH A 160 50.250 12.576 23.721 1.00 0.00 H +HETATM 480 H2 HOH A 160 50.157 11.704 22.487 1.00 0.00 H +HETATM 481 O HOH A 161 -1.467 23.707 27.879 1.00 0.00 O +HETATM 482 H1 HOH A 161 -2.039 24.328 27.428 1.00 0.00 H +HETATM 483 H2 HOH A 161 -2.061 23.169 28.402 1.00 0.00 H +HETATM 484 O HOH A 162 -51.270 19.640 9.490 1.00 0.00 O +HETATM 485 H1 HOH A 162 -51.576 18.874 9.004 1.00 0.00 H +HETATM 486 H2 HOH A 162 -50.495 19.332 9.961 1.00 0.00 H +HETATM 487 O HOH A 163 -9.158 -10.242 -44.789 1.00 0.00 O +HETATM 488 H1 HOH A 163 -8.313 -10.686 -44.709 1.00 0.00 H +HETATM 489 H2 HOH A 163 -8.959 -9.430 -45.255 1.00 0.00 H +HETATM 490 O HOH A 164 58.406 -2.509 57.667 1.00 0.00 O +HETATM 491 H1 HOH A 164 57.642 -2.159 58.125 1.00 0.00 H +HETATM 492 H2 HOH A 164 58.110 -3.346 57.310 1.00 0.00 H +HETATM 493 O HOH A 165 15.095 -19.464 20.658 1.00 0.00 O +HETATM 494 H1 HOH A 165 14.629 -19.568 21.488 1.00 0.00 H +HETATM 495 H2 HOH A 165 15.546 -18.624 20.741 1.00 0.00 H +HETATM 496 O HOH A 166 -1.883 32.351 56.477 1.00 0.00 O +HETATM 497 H1 HOH A 166 -1.873 32.268 55.523 1.00 0.00 H +HETATM 498 H2 HOH A 166 -1.703 33.277 56.638 1.00 0.00 H +HETATM 499 O HOH A 167 19.573 -25.417 -51.346 1.00 0.00 O +HETATM 500 H1 HOH A 167 19.781 -24.529 -51.055 1.00 0.00 H +HETATM 501 H2 HOH A 167 18.636 -25.512 -51.173 1.00 0.00 H +HETATM 502 O HOH A 168 -23.033 -15.447 -25.583 1.00 0.00 O +HETATM 503 H1 HOH A 168 -23.078 -15.251 -26.519 1.00 0.00 H +HETATM 504 H2 HOH A 168 -22.598 -16.299 -25.537 1.00 0.00 H +HETATM 505 O HOH A 169 39.023 -22.998 8.499 1.00 0.00 O +HETATM 506 H1 HOH A 169 38.943 -22.475 7.701 1.00 0.00 H +HETATM 507 H2 HOH A 169 39.524 -23.768 8.231 1.00 0.00 H +HETATM 508 O HOH A 170 21.188 37.212 -65.907 1.00 0.00 O +HETATM 509 H1 HOH A 170 21.848 37.863 -66.145 1.00 0.00 H +HETATM 510 H2 HOH A 170 21.002 37.386 -64.984 1.00 0.00 H +HETATM 511 O HOH A 171 -41.065 30.873 -35.703 1.00 0.00 O +HETATM 512 H1 HOH A 171 -41.075 31.822 -35.830 1.00 0.00 H +HETATM 513 H2 HOH A 171 -40.437 30.551 -36.349 1.00 0.00 H +HETATM 514 O HOH A 172 -8.779 7.463 32.602 1.00 0.00 O +HETATM 515 H1 HOH A 172 -8.914 6.540 32.818 1.00 0.00 H +HETATM 516 H2 HOH A 172 -9.410 7.932 33.148 1.00 0.00 H +HETATM 517 O HOH A 173 -48.175 -15.593 1.979 1.00 0.00 O +HETATM 518 H1 HOH A 173 -48.425 -14.738 2.329 1.00 0.00 H +HETATM 519 H2 HOH A 173 -47.774 -15.398 1.132 1.00 0.00 H +HETATM 520 O HOH A 174 -29.558 -1.993 18.282 1.00 0.00 O +HETATM 521 H1 HOH A 174 -29.551 -1.615 19.162 1.00 0.00 H +HETATM 522 H2 HOH A 174 -28.657 -2.284 18.139 1.00 0.00 H +HETATM 523 O HOH A 175 -12.475 1.957 -28.372 1.00 0.00 O +HETATM 524 H1 HOH A 175 -13.301 1.562 -28.094 1.00 0.00 H +HETATM 525 H2 HOH A 175 -12.123 2.360 -27.578 1.00 0.00 H +HETATM 526 O HOH A 176 34.379 -16.589 4.235 1.00 0.00 O +HETATM 527 H1 HOH A 176 33.851 -16.021 4.796 1.00 0.00 H +HETATM 528 H2 HOH A 176 33.931 -17.435 4.261 1.00 0.00 H +HETATM 529 O HOH A 177 -71.487 15.708 29.656 1.00 0.00 O +HETATM 530 H1 HOH A 177 -71.952 16.070 28.902 1.00 0.00 H +HETATM 531 H2 HOH A 177 -72.079 15.041 30.005 1.00 0.00 H +HETATM 532 O HOH A 178 -17.589 34.255 35.160 1.00 0.00 O +HETATM 533 H1 HOH A 178 -18.312 34.126 35.773 1.00 0.00 H +HETATM 534 H2 HOH A 178 -17.806 33.699 34.412 1.00 0.00 H +HETATM 535 O HOH A 179 -1.623 -5.560 47.604 1.00 0.00 O +HETATM 536 H1 HOH A 179 -1.699 -6.375 47.109 1.00 0.00 H +HETATM 537 H2 HOH A 179 -1.543 -4.880 46.935 1.00 0.00 H +HETATM 538 O HOH A 180 -30.231 17.970 -2.473 1.00 0.00 O +HETATM 539 H1 HOH A 180 -30.124 18.804 -2.016 1.00 0.00 H +HETATM 540 H2 HOH A 180 -29.347 17.733 -2.752 1.00 0.00 H +HETATM 541 O HOH A 181 -30.286 -2.910 28.613 1.00 0.00 O +HETATM 542 H1 HOH A 181 -29.410 -2.849 28.993 1.00 0.00 H +HETATM 543 H2 HOH A 181 -30.160 -2.703 27.687 1.00 0.00 H +HETATM 544 O HOH A 182 16.110 -38.418 -67.606 1.00 0.00 O +HETATM 545 H1 HOH A 182 16.720 -38.286 -66.880 1.00 0.00 H +HETATM 546 H2 HOH A 182 16.665 -38.427 -68.386 1.00 0.00 H +HETATM 547 O HOH A 183 4.280 -64.753 5.111 1.00 0.00 O +HETATM 548 H1 HOH A 183 4.238 -65.346 4.361 1.00 0.00 H +HETATM 549 H2 HOH A 183 4.666 -65.279 5.811 1.00 0.00 H +HETATM 550 O HOH A 184 -60.183 -3.592 -29.075 1.00 0.00 O +HETATM 551 H1 HOH A 184 -60.008 -2.899 -28.438 1.00 0.00 H +HETATM 552 H2 HOH A 184 -60.063 -3.172 -29.926 1.00 0.00 H +HETATM 553 O HOH A 185 -14.745 -19.653 2.325 1.00 0.00 O +HETATM 554 H1 HOH A 185 -15.601 -19.903 1.977 1.00 0.00 H +HETATM 555 H2 HOH A 185 -14.831 -19.755 3.273 1.00 0.00 H +HETATM 556 O HOH A 186 -1.221 -13.740 10.868 1.00 0.00 O +HETATM 557 H1 HOH A 186 -2.012 -13.855 11.395 1.00 0.00 H +HETATM 558 H2 HOH A 186 -0.807 -12.954 11.225 1.00 0.00 H +HETATM 559 O HOH A 187 -2.302 -31.954 0.106 1.00 0.00 O +HETATM 560 H1 HOH A 187 -2.199 -31.228 0.722 1.00 0.00 H +HETATM 561 H2 HOH A 187 -2.198 -31.553 -0.757 1.00 0.00 H +HETATM 562 O HOH A 188 36.454 -21.330 13.595 1.00 0.00 O +HETATM 563 H1 HOH A 188 36.023 -20.575 13.195 1.00 0.00 H +HETATM 564 H2 HOH A 188 36.632 -21.921 12.864 1.00 0.00 H +HETATM 565 O HOH A 189 -11.718 51.043 -9.947 1.00 0.00 O +HETATM 566 H1 HOH A 189 -12.004 50.519 -10.694 1.00 0.00 H +HETATM 567 H2 HOH A 189 -12.295 51.806 -9.953 1.00 0.00 H +HETATM 568 O HOH A 190 -46.509 -68.591 29.070 1.00 0.00 O +HETATM 569 H1 HOH A 190 -46.076 -69.326 29.503 1.00 0.00 H +HETATM 570 H2 HOH A 190 -47.002 -68.158 29.767 1.00 0.00 H +HETATM 571 O HOH A 191 17.214 -8.657 32.800 1.00 0.00 O +HETATM 572 H1 HOH A 191 16.471 -9.001 33.295 1.00 0.00 H +HETATM 573 H2 HOH A 191 17.861 -9.362 32.817 1.00 0.00 H +HETATM 574 O HOH A 192 7.049 -8.023 34.553 1.00 0.00 O +HETATM 575 H1 HOH A 192 6.173 -7.824 34.882 1.00 0.00 H +HETATM 576 H2 HOH A 192 6.926 -8.785 33.987 1.00 0.00 H +HETATM 577 O HOH A 193 -28.774 -35.777 -20.179 1.00 0.00 O +HETATM 578 H1 HOH A 193 -28.909 -35.398 -21.048 1.00 0.00 H +HETATM 579 H2 HOH A 193 -28.468 -36.667 -20.351 1.00 0.00 H +HETATM 580 O HOH A 194 43.766 53.366 -45.764 1.00 0.00 O +HETATM 581 H1 HOH A 194 43.757 53.118 -44.839 1.00 0.00 H +HETATM 582 H2 HOH A 194 43.587 54.306 -45.762 1.00 0.00 H +HETATM 583 O HOH A 195 6.142 -6.963 66.875 1.00 0.00 O +HETATM 584 H1 HOH A 195 6.155 -7.298 65.978 1.00 0.00 H +HETATM 585 H2 HOH A 195 6.441 -6.057 66.797 1.00 0.00 H +HETATM 586 O HOH A 196 -34.323 -5.844 -52.706 1.00 0.00 O +HETATM 587 H1 HOH A 196 -34.890 -6.616 -52.718 1.00 0.00 H +HETATM 588 H2 HOH A 196 -34.844 -5.157 -53.122 1.00 0.00 H +HETATM 589 O HOH A 197 33.005 -26.684 -23.988 1.00 0.00 O +HETATM 590 H1 HOH A 197 33.069 -27.601 -23.722 1.00 0.00 H +HETATM 591 H2 HOH A 197 32.602 -26.713 -24.855 1.00 0.00 H +HETATM 592 O HOH A 198 -65.222 36.518 -4.295 1.00 0.00 O +HETATM 593 H1 HOH A 198 -65.125 36.841 -5.191 1.00 0.00 H +HETATM 594 H2 HOH A 198 -64.481 35.925 -4.172 1.00 0.00 H +HETATM 595 O HOH A 199 -25.478 -48.085 56.836 1.00 0.00 O +HETATM 596 H1 HOH A 199 -24.674 -47.599 56.653 1.00 0.00 H +HETATM 597 H2 HOH A 199 -25.874 -47.624 57.576 1.00 0.00 H +HETATM 598 O HOH A 200 -45.608 -17.220 2.790 1.00 0.00 O +HETATM 599 H1 HOH A 200 -45.786 -18.001 3.314 1.00 0.00 H +HETATM 600 H2 HOH A 200 -46.468 -16.938 2.480 1.00 0.00 H +HETATM 601 O HOH A 201 8.919 36.481 24.210 1.00 0.00 O +HETATM 602 H1 HOH A 201 8.910 35.532 24.087 1.00 0.00 H +HETATM 603 H2 HOH A 201 9.778 36.757 23.890 1.00 0.00 H +HETATM 604 O HOH A 202 -21.259 -13.721 59.814 1.00 0.00 O +HETATM 605 H1 HOH A 202 -21.919 -14.179 60.334 1.00 0.00 H +HETATM 606 H2 HOH A 202 -20.536 -13.570 60.423 1.00 0.00 H +HETATM 607 O HOH A 203 -5.379 -20.072 -6.208 1.00 0.00 O +HETATM 608 H1 HOH A 203 -5.060 -20.671 -5.533 1.00 0.00 H +HETATM 609 H2 HOH A 203 -6.323 -20.021 -6.057 1.00 0.00 H +HETATM 610 O HOH A 204 11.140 7.648 1.167 1.00 0.00 O +HETATM 611 H1 HOH A 204 10.336 8.004 0.789 1.00 0.00 H +HETATM 612 H2 HOH A 204 10.849 6.899 1.688 1.00 0.00 H +HETATM 613 O HOH A 205 43.220 -9.010 -3.548 1.00 0.00 O +HETATM 614 H1 HOH A 205 42.868 -9.359 -2.728 1.00 0.00 H +HETATM 615 H2 HOH A 205 43.500 -8.122 -3.329 1.00 0.00 H +HETATM 616 O HOH A 206 15.367 -45.173 -26.348 1.00 0.00 O +HETATM 617 H1 HOH A 206 15.804 -44.534 -25.784 1.00 0.00 H +HETATM 618 H2 HOH A 206 16.065 -45.521 -26.902 1.00 0.00 H +HETATM 619 O HOH A 207 38.112 -14.791 17.476 1.00 0.00 O +HETATM 620 H1 HOH A 207 37.671 -15.633 17.369 1.00 0.00 H +HETATM 621 H2 HOH A 207 38.022 -14.590 18.408 1.00 0.00 H +HETATM 622 O HOH A 208 23.719 14.249 21.897 1.00 0.00 O +HETATM 623 H1 HOH A 208 24.292 14.729 22.495 1.00 0.00 H +HETATM 624 H2 HOH A 208 24.317 13.781 21.315 1.00 0.00 H +HETATM 625 O HOH A 209 -4.347 24.543 89.154 1.00 0.00 O +HETATM 626 H1 HOH A 209 -4.432 24.640 88.205 1.00 0.00 H +HETATM 627 H2 HOH A 209 -4.742 23.693 89.345 1.00 0.00 H +HETATM 628 O HOH A 210 -3.770 -60.852 -3.371 1.00 0.00 O +HETATM 629 H1 HOH A 210 -2.984 -60.358 -3.137 1.00 0.00 H +HETATM 630 H2 HOH A 210 -4.341 -60.770 -2.608 1.00 0.00 H +HETATM 631 O HOH A 211 4.229 -5.051 0.507 1.00 0.00 O +HETATM 632 H1 HOH A 211 3.478 -4.714 0.995 1.00 0.00 H +HETATM 633 H2 HOH A 211 4.590 -5.738 1.067 1.00 0.00 H +HETATM 634 O HOH A 212 10.925 -40.031 -42.714 1.00 0.00 O +HETATM 635 H1 HOH A 212 10.674 -40.846 -42.279 1.00 0.00 H +HETATM 636 H2 HOH A 212 11.754 -40.235 -43.147 1.00 0.00 H +HETATM 637 O HOH A 213 55.795 -7.466 -10.135 1.00 0.00 O +HETATM 638 H1 HOH A 213 55.085 -8.101 -10.231 1.00 0.00 H +HETATM 639 H2 HOH A 213 56.411 -7.689 -10.833 1.00 0.00 H +HETATM 640 O HOH A 214 17.648 -13.726 29.008 1.00 0.00 O +HETATM 641 H1 HOH A 214 17.703 -13.723 28.053 1.00 0.00 H +HETATM 642 H2 HOH A 214 17.779 -12.811 29.259 1.00 0.00 H +HETATM 643 O HOH A 215 4.566 14.968 -9.926 1.00 0.00 O +HETATM 644 H1 HOH A 215 5.279 14.574 -9.423 1.00 0.00 H +HETATM 645 H2 HOH A 215 3.787 14.829 -9.387 1.00 0.00 H +HETATM 646 O HOH A 216 -8.032 -34.995 -5.163 1.00 0.00 O +HETATM 647 H1 HOH A 216 -7.668 -34.291 -4.626 1.00 0.00 H +HETATM 648 H2 HOH A 216 -8.951 -34.755 -5.281 1.00 0.00 H +HETATM 649 O HOH A 217 -1.272 -30.188 55.699 1.00 0.00 O +HETATM 650 H1 HOH A 217 -1.558 -30.854 56.324 1.00 0.00 H +HETATM 651 H2 HOH A 217 -0.419 -29.902 56.027 1.00 0.00 H +HETATM 652 O HOH A 218 5.899 -23.098 27.932 1.00 0.00 O +HETATM 653 H1 HOH A 218 5.510 -22.439 27.357 1.00 0.00 H +HETATM 654 H2 HOH A 218 5.187 -23.358 28.515 1.00 0.00 H +HETATM 655 O HOH A 219 -43.610 14.995 27.040 1.00 0.00 O +HETATM 656 H1 HOH A 219 -43.486 15.703 26.409 1.00 0.00 H +HETATM 657 H2 HOH A 219 -43.135 14.253 26.665 1.00 0.00 H +HETATM 658 O HOH A 220 13.171 -85.346 -32.598 1.00 0.00 O +HETATM 659 H1 HOH A 220 13.699 -85.611 -31.845 1.00 0.00 H +HETATM 660 H2 HOH A 220 12.618 -86.105 -32.783 1.00 0.00 H +HETATM 661 O HOH A 221 30.445 -2.160 -10.418 1.00 0.00 O +HETATM 662 H1 HOH A 221 30.577 -3.028 -10.799 1.00 0.00 H +HETATM 663 H2 HOH A 221 29.607 -1.866 -10.776 1.00 0.00 H +HETATM 664 O HOH A 222 66.365 50.997 -21.037 1.00 0.00 O +HETATM 665 H1 HOH A 222 66.651 51.838 -20.680 1.00 0.00 H +HETATM 666 H2 HOH A 222 66.142 50.473 -20.267 1.00 0.00 H +HETATM 667 O HOH A 223 -43.476 26.052 21.323 1.00 0.00 O +HETATM 668 H1 HOH A 223 -43.216 25.270 21.811 1.00 0.00 H +HETATM 669 H2 HOH A 223 -44.375 25.875 21.046 1.00 0.00 H +HETATM 670 O HOH A 224 -4.516 -7.954 19.130 1.00 0.00 O +HETATM 671 H1 HOH A 224 -5.061 -8.672 19.452 1.00 0.00 H +HETATM 672 H2 HOH A 224 -4.547 -8.038 18.177 1.00 0.00 H +HETATM 673 O HOH A 225 -0.220 28.843 22.859 1.00 0.00 O +HETATM 674 H1 HOH A 225 0.672 28.544 23.040 1.00 0.00 H +HETATM 675 H2 HOH A 225 -0.138 29.791 22.753 1.00 0.00 H +HETATM 676 O HOH A 226 6.322 -45.163 12.418 1.00 0.00 O +HETATM 677 H1 HOH A 226 7.040 -45.656 12.021 1.00 0.00 H +HETATM 678 H2 HOH A 226 6.739 -44.378 12.775 1.00 0.00 H +HETATM 679 O HOH A 227 -5.387 -13.787 6.976 1.00 0.00 O +HETATM 680 H1 HOH A 227 -4.675 -13.382 7.470 1.00 0.00 H +HETATM 681 H2 HOH A 227 -5.307 -14.723 7.162 1.00 0.00 H +HETATM 682 O HOH A 228 -7.658 -75.551 -0.788 1.00 0.00 O +HETATM 683 H1 HOH A 228 -8.163 -74.827 -0.416 1.00 0.00 H +HETATM 684 H2 HOH A 228 -8.130 -75.786 -1.587 1.00 0.00 H +HETATM 685 O HOH A 229 -37.198 -14.272 10.877 1.00 0.00 O +HETATM 686 H1 HOH A 229 -38.046 -14.347 11.315 1.00 0.00 H +HETATM 687 H2 HOH A 229 -37.350 -13.649 10.166 1.00 0.00 H +HETATM 688 O HOH A 230 -29.048 7.545 -24.572 1.00 0.00 O +HETATM 689 H1 HOH A 230 -28.162 7.276 -24.330 1.00 0.00 H +HETATM 690 H2 HOH A 230 -28.924 8.148 -25.305 1.00 0.00 H +HETATM 691 O HOH A 231 -30.464 22.455 50.657 1.00 0.00 O +HETATM 692 H1 HOH A 231 -29.622 22.387 50.207 1.00 0.00 H +HETATM 693 H2 HOH A 231 -30.871 23.239 50.288 1.00 0.00 H +HETATM 694 O HOH A 232 25.071 15.855 -58.686 1.00 0.00 O +HETATM 695 H1 HOH A 232 25.855 15.305 -58.684 1.00 0.00 H +HETATM 696 H2 HOH A 232 25.068 16.271 -57.824 1.00 0.00 H +HETATM 697 O HOH A 233 2.098 27.762 26.286 1.00 0.00 O +HETATM 698 H1 HOH A 233 2.184 26.808 26.295 1.00 0.00 H +HETATM 699 H2 HOH A 233 1.490 27.955 27.000 1.00 0.00 H +HETATM 700 O HOH A 234 -12.639 -35.297 -20.620 1.00 0.00 O +HETATM 701 H1 HOH A 234 -13.209 -35.718 -21.263 1.00 0.00 H +HETATM 702 H2 HOH A 234 -12.502 -34.414 -20.963 1.00 0.00 H +HETATM 703 O HOH A 235 22.234 2.556 0.530 1.00 0.00 O +HETATM 704 H1 HOH A 235 22.063 2.482 1.469 1.00 0.00 H +HETATM 705 H2 HOH A 235 23.076 2.118 0.404 1.00 0.00 H +HETATM 706 O HOH A 236 47.564 19.825 1.727 1.00 0.00 O +HETATM 707 H1 HOH A 236 47.290 20.648 1.323 1.00 0.00 H +HETATM 708 H2 HOH A 236 48.258 20.077 2.337 1.00 0.00 H +HETATM 709 O HOH A 237 1.338 12.063 8.029 1.00 0.00 O +HETATM 710 H1 HOH A 237 0.963 11.190 8.142 1.00 0.00 H +HETATM 711 H2 HOH A 237 2.129 11.918 7.509 1.00 0.00 H +HETATM 712 O HOH A 238 1.490 24.313 10.499 1.00 0.00 O +HETATM 713 H1 HOH A 238 1.792 24.239 9.594 1.00 0.00 H +HETATM 714 H2 HOH A 238 1.666 23.453 10.881 1.00 0.00 H +HETATM 715 O HOH A 239 -14.496 -36.365 2.252 1.00 0.00 O +HETATM 716 H1 HOH A 239 -14.910 -35.657 1.759 1.00 0.00 H +HETATM 717 H2 HOH A 239 -15.200 -36.724 2.793 1.00 0.00 H +HETATM 718 O HOH A 240 -20.557 -25.996 57.231 1.00 0.00 O +HETATM 719 H1 HOH A 240 -21.404 -25.550 57.251 1.00 0.00 H +HETATM 720 H2 HOH A 240 -20.730 -26.818 56.772 1.00 0.00 H +HETATM 721 O HOH A 241 21.627 -9.483 -15.128 1.00 0.00 O +HETATM 722 H1 HOH A 241 21.115 -9.351 -14.330 1.00 0.00 H +HETATM 723 H2 HOH A 241 22.538 -9.456 -14.836 1.00 0.00 H +HETATM 724 O HOH A 242 11.187 -14.625 45.681 1.00 0.00 O +HETATM 725 H1 HOH A 242 11.745 -14.282 44.983 1.00 0.00 H +HETATM 726 H2 HOH A 242 11.758 -15.210 46.179 1.00 0.00 H +HETATM 727 O HOH A 243 -22.532 3.057 48.386 1.00 0.00 O +HETATM 728 H1 HOH A 243 -22.596 3.201 49.330 1.00 0.00 H +HETATM 729 H2 HOH A 243 -21.735 3.519 48.126 1.00 0.00 H +HETATM 730 O HOH A 244 -8.828 -85.768 14.439 1.00 0.00 O +HETATM 731 H1 HOH A 244 -9.525 -85.406 14.985 1.00 0.00 H +HETATM 732 H2 HOH A 244 -8.093 -85.894 15.039 1.00 0.00 H +HETATM 733 O HOH A 245 -49.404 16.480 -46.803 1.00 0.00 O +HETATM 734 H1 HOH A 245 -49.551 17.417 -46.932 1.00 0.00 H +HETATM 735 H2 HOH A 245 -50.226 16.156 -46.437 1.00 0.00 H +HETATM 736 O HOH A 246 80.152 16.470 -49.700 1.00 0.00 O +HETATM 737 H1 HOH A 246 81.040 16.473 -50.058 1.00 0.00 H +HETATM 738 H2 HOH A 246 79.652 15.920 -50.302 1.00 0.00 H +HETATM 739 O HOH A 247 -21.462 -6.927 -22.030 1.00 0.00 O +HETATM 740 H1 HOH A 247 -21.841 -6.143 -21.631 1.00 0.00 H +HETATM 741 H2 HOH A 247 -20.555 -6.938 -21.722 1.00 0.00 H +HETATM 742 O HOH A 248 19.521 4.941 25.186 1.00 0.00 O +HETATM 743 H1 HOH A 248 20.025 5.750 25.097 1.00 0.00 H +HETATM 744 H2 HOH A 248 19.526 4.757 26.126 1.00 0.00 H +HETATM 745 O HOH A 249 5.202 31.724 -74.686 1.00 0.00 O +HETATM 746 H1 HOH A 249 5.578 30.844 -74.706 1.00 0.00 H +HETATM 747 H2 HOH A 249 5.478 32.083 -73.843 1.00 0.00 H +HETATM 748 O HOH A 250 23.108 35.284 32.767 1.00 0.00 O +HETATM 749 H1 HOH A 250 23.291 35.164 33.699 1.00 0.00 H +HETATM 750 H2 HOH A 250 22.389 35.915 32.743 1.00 0.00 H +HETATM 751 O HOH A 251 19.815 16.924 1.723 1.00 0.00 O +HETATM 752 H1 HOH A 251 20.578 17.186 1.208 1.00 0.00 H +HETATM 753 H2 HOH A 251 19.826 17.509 2.481 1.00 0.00 H +HETATM 754 O HOH A 252 -19.667 28.400 -51.144 1.00 0.00 O +HETATM 755 H1 HOH A 252 -19.261 27.709 -51.666 1.00 0.00 H +HETATM 756 H2 HOH A 252 -18.946 28.990 -50.923 1.00 0.00 H +HETATM 757 O HOH A 253 5.232 6.824 31.062 1.00 0.00 O +HETATM 758 H1 HOH A 253 5.047 5.965 31.442 1.00 0.00 H +HETATM 759 H2 HOH A 253 4.977 7.447 31.741 1.00 0.00 H +HETATM 760 O HOH A 254 -7.745 23.134 18.025 1.00 0.00 O +HETATM 761 H1 HOH A 254 -8.059 23.068 17.124 1.00 0.00 H +HETATM 762 H2 HOH A 254 -7.164 22.381 18.133 1.00 0.00 H +HETATM 763 O HOH A 255 23.326 6.397 13.819 1.00 0.00 O +HETATM 764 H1 HOH A 255 22.503 6.262 14.288 1.00 0.00 H +HETATM 765 H2 HOH A 255 23.088 6.336 12.894 1.00 0.00 H +HETATM 766 O HOH A 256 -79.320 -10.461 -58.456 1.00 0.00 O +HETATM 767 H1 HOH A 256 -79.805 -10.258 -59.255 1.00 0.00 H +HETATM 768 H2 HOH A 256 -79.996 -10.679 -57.814 1.00 0.00 H +HETATM 769 O HOH A 257 -16.783 44.208 -14.264 1.00 0.00 O +HETATM 770 H1 HOH A 257 -16.950 43.312 -14.556 1.00 0.00 H +HETATM 771 H2 HOH A 257 -17.487 44.724 -14.659 1.00 0.00 H +HETATM 772 O HOH A 258 14.554 50.957 2.175 1.00 0.00 O +HETATM 773 H1 HOH A 258 13.759 50.887 2.704 1.00 0.00 H +HETATM 774 H2 HOH A 258 15.267 50.783 2.789 1.00 0.00 H +HETATM 775 O HOH A 259 11.514 11.467 8.470 1.00 0.00 O +HETATM 776 H1 HOH A 259 11.205 10.794 7.863 1.00 0.00 H +HETATM 777 H2 HOH A 259 12.321 11.795 8.074 1.00 0.00 H +HETATM 778 O HOH A 260 8.598 -56.454 -46.934 1.00 0.00 O +HETATM 779 H1 HOH A 260 8.773 -56.299 -46.006 1.00 0.00 H +HETATM 780 H2 HOH A 260 8.493 -57.403 -47.003 1.00 0.00 H +HETATM 781 O HOH A 261 50.184 15.995 -25.548 1.00 0.00 O +HETATM 782 H1 HOH A 261 49.582 15.875 -24.814 1.00 0.00 H +HETATM 783 H2 HOH A 261 50.889 15.369 -25.384 1.00 0.00 H +HETATM 784 O HOH A 262 -50.499 57.468 -21.267 1.00 0.00 O +HETATM 785 H1 HOH A 262 -49.906 56.885 -21.741 1.00 0.00 H +HETATM 786 H2 HOH A 262 -50.186 58.348 -21.473 1.00 0.00 H +HETATM 787 O HOH A 263 -14.821 18.470 29.798 1.00 0.00 O +HETATM 788 H1 HOH A 263 -14.192 18.050 29.210 1.00 0.00 H +HETATM 789 H2 HOH A 263 -14.657 19.407 29.693 1.00 0.00 H +HETATM 790 O HOH A 264 -39.220 45.826 -20.795 1.00 0.00 O +HETATM 791 H1 HOH A 264 -39.163 46.676 -20.359 1.00 0.00 H +HETATM 792 H2 HOH A 264 -40.070 45.840 -21.237 1.00 0.00 H +HETATM 793 O HOH A 265 46.097 7.144 18.277 1.00 0.00 O +HETATM 794 H1 HOH A 265 45.510 6.388 18.301 1.00 0.00 H +HETATM 795 H2 HOH A 265 46.908 6.832 18.678 1.00 0.00 H +HETATM 796 O HOH A 266 -21.489 -23.866 -27.526 1.00 0.00 O +HETATM 797 H1 HOH A 266 -21.898 -23.151 -27.039 1.00 0.00 H +HETATM 798 H2 HOH A 266 -21.968 -24.648 -27.250 1.00 0.00 H +HETATM 799 O HOH A 267 -82.529 -3.667 0.644 1.00 0.00 O +HETATM 800 H1 HOH A 267 -83.191 -3.101 0.246 1.00 0.00 H +HETATM 801 H2 HOH A 267 -81.733 -3.135 0.653 1.00 0.00 H +HETATM 802 O HOH A 268 -5.464 19.052 15.060 1.00 0.00 O +HETATM 803 H1 HOH A 268 -5.071 18.382 15.620 1.00 0.00 H +HETATM 804 H2 HOH A 268 -6.394 19.037 15.286 1.00 0.00 H +HETATM 805 O HOH A 269 -21.830 -23.118 11.570 1.00 0.00 O +HETATM 806 H1 HOH A 269 -22.419 -23.796 11.240 1.00 0.00 H +HETATM 807 H2 HOH A 269 -22.271 -22.294 11.362 1.00 0.00 H +HETATM 808 O HOH A 270 -41.485 49.709 4.752 1.00 0.00 O +HETATM 809 H1 HOH A 270 -42.081 50.458 4.758 1.00 0.00 H +HETATM 810 H2 HOH A 270 -42.012 48.985 4.415 1.00 0.00 H +HETATM 811 O HOH A 271 -53.957 24.426 -4.447 1.00 0.00 O +HETATM 812 H1 HOH A 271 -54.458 25.239 -4.519 1.00 0.00 H +HETATM 813 H2 HOH A 271 -54.210 24.063 -3.598 1.00 0.00 H +HETATM 814 O HOH A 272 -27.330 -27.127 -2.322 1.00 0.00 O +HETATM 815 H1 HOH A 272 -26.733 -27.549 -2.941 1.00 0.00 H +HETATM 816 H2 HOH A 272 -27.869 -26.551 -2.864 1.00 0.00 H +HETATM 817 O HOH A 273 -34.116 -7.653 -70.971 1.00 0.00 O +HETATM 818 H1 HOH A 273 -33.955 -6.776 -71.320 1.00 0.00 H +HETATM 819 H2 HOH A 273 -33.362 -7.828 -70.407 1.00 0.00 H +HETATM 820 O HOH A 274 -20.313 48.783 0.356 1.00 0.00 O +HETATM 821 H1 HOH A 274 -19.763 48.803 1.139 1.00 0.00 H +HETATM 822 H2 HOH A 274 -19.791 48.313 -0.293 1.00 0.00 H +HETATM 823 O HOH A 275 -64.908 64.832 -24.108 1.00 0.00 O +HETATM 824 H1 HOH A 275 -63.993 64.810 -24.385 1.00 0.00 H +HETATM 825 H2 HOH A 275 -65.294 65.549 -24.612 1.00 0.00 H +HETATM 826 O HOH A 276 -10.443 -8.543 25.715 1.00 0.00 O +HETATM 827 H1 HOH A 276 -10.245 -8.394 26.639 1.00 0.00 H +HETATM 828 H2 HOH A 276 -9.780 -8.039 25.243 1.00 0.00 H +HETATM 829 O HOH A 277 -18.415 39.579 32.519 1.00 0.00 O +HETATM 830 H1 HOH A 277 -18.456 39.367 31.587 1.00 0.00 H +HETATM 831 H2 HOH A 277 -17.732 39.005 32.866 1.00 0.00 H +HETATM 832 O HOH A 278 38.488 9.074 33.852 1.00 0.00 O +HETATM 833 H1 HOH A 278 37.948 9.528 34.499 1.00 0.00 H +HETATM 834 H2 HOH A 278 38.260 9.484 33.018 1.00 0.00 H +HETATM 835 O HOH A 279 27.400 46.156 -5.364 1.00 0.00 O +HETATM 836 H1 HOH A 279 26.567 46.480 -5.704 1.00 0.00 H +HETATM 837 H2 HOH A 279 27.955 46.934 -5.307 1.00 0.00 H +HETATM 838 O HOH A 280 -10.547 8.154 -11.585 1.00 0.00 O +HETATM 839 H1 HOH A 280 -10.329 9.075 -11.444 1.00 0.00 H +HETATM 840 H2 HOH A 280 -9.700 7.709 -11.620 1.00 0.00 H +HETATM 841 O HOH A 281 8.963 8.859 -10.575 1.00 0.00 O +HETATM 842 H1 HOH A 281 9.727 8.774 -10.005 1.00 0.00 H +HETATM 843 H2 HOH A 281 8.595 9.715 -10.357 1.00 0.00 H +HETATM 844 O HOH A 282 -2.679 -27.827 5.061 1.00 0.00 O +HETATM 845 H1 HOH A 282 -2.312 -27.246 5.726 1.00 0.00 H +HETATM 846 H2 HOH A 282 -2.412 -28.705 5.334 1.00 0.00 H +HETATM 847 O HOH A 283 -56.139 38.218 5.322 1.00 0.00 O +HETATM 848 H1 HOH A 283 -56.136 38.347 6.271 1.00 0.00 H +HETATM 849 H2 HOH A 283 -55.213 38.202 5.080 1.00 0.00 H +HETATM 850 O HOH A 284 22.431 39.252 17.415 1.00 0.00 O +HETATM 851 H1 HOH A 284 21.680 39.018 16.871 1.00 0.00 H +HETATM 852 H2 HOH A 284 22.724 38.421 17.790 1.00 0.00 H +HETATM 853 O HOH A 285 6.241 22.467 33.826 1.00 0.00 O +HETATM 854 H1 HOH A 285 5.664 22.975 33.256 1.00 0.00 H +HETATM 855 H2 HOH A 285 5.923 22.644 34.711 1.00 0.00 H +HETATM 856 O HOH A 286 -16.863 -50.016 -12.951 1.00 0.00 O +HETATM 857 H1 HOH A 286 -16.615 -49.428 -12.238 1.00 0.00 H +HETATM 858 H2 HOH A 286 -17.819 -50.044 -12.918 1.00 0.00 H +HETATM 859 O HOH A 287 54.036 -44.126 -14.298 1.00 0.00 O +HETATM 860 H1 HOH A 287 54.523 -44.366 -13.509 1.00 0.00 H +HETATM 861 H2 HOH A 287 53.476 -43.400 -14.023 1.00 0.00 H +HETATM 862 O HOH A 288 42.066 37.495 10.818 1.00 0.00 O +HETATM 863 H1 HOH A 288 42.400 37.062 11.603 1.00 0.00 H +HETATM 864 H2 HOH A 288 41.336 36.946 10.532 1.00 0.00 H +HETATM 865 O HOH A 289 -22.620 -7.217 22.027 1.00 0.00 O +HETATM 866 H1 HOH A 289 -23.175 -7.608 22.702 1.00 0.00 H +HETATM 867 H2 HOH A 289 -22.633 -7.850 21.309 1.00 0.00 H +HETATM 868 O HOH A 290 -0.808 -22.229 40.453 1.00 0.00 O +HETATM 869 H1 HOH A 290 -0.945 -21.805 39.605 1.00 0.00 H +HETATM 870 H2 HOH A 290 -1.620 -22.709 40.615 1.00 0.00 H +HETATM 871 O HOH A 291 0.609 21.214 24.096 1.00 0.00 O +HETATM 872 H1 HOH A 291 -0.063 20.561 24.291 1.00 0.00 H +HETATM 873 H2 HOH A 291 0.998 20.919 23.272 1.00 0.00 H +HETATM 874 O HOH A 292 56.976 29.663 -25.441 1.00 0.00 O +HETATM 875 H1 HOH A 292 57.874 29.627 -25.768 1.00 0.00 H +HETATM 876 H2 HOH A 292 57.068 29.836 -24.504 1.00 0.00 H +HETATM 877 O HOH A 293 -8.058 55.240 -32.850 1.00 0.00 O +HETATM 878 H1 HOH A 293 -7.699 54.775 -33.606 1.00 0.00 H +HETATM 879 H2 HOH A 293 -8.092 54.580 -32.157 1.00 0.00 H +HETATM 880 O HOH A 294 9.929 -23.028 5.995 1.00 0.00 O +HETATM 881 H1 HOH A 294 9.929 -23.434 6.862 1.00 0.00 H +HETATM 882 H2 HOH A 294 9.434 -23.636 5.446 1.00 0.00 H +HETATM 883 O HOH A 295 -38.677 3.015 9.712 1.00 0.00 O +HETATM 884 H1 HOH A 295 -38.486 2.146 9.358 1.00 0.00 H +HETATM 885 H2 HOH A 295 -37.840 3.477 9.678 1.00 0.00 H +HETATM 886 O HOH A 296 5.069 -48.460 6.170 1.00 0.00 O +HETATM 887 H1 HOH A 296 4.904 -49.119 6.844 1.00 0.00 H +HETATM 888 H2 HOH A 296 4.497 -48.710 5.444 1.00 0.00 H +HETATM 889 O HOH A 297 62.636 22.390 -40.454 1.00 0.00 O +HETATM 890 H1 HOH A 297 61.848 22.483 -39.918 1.00 0.00 H +HETATM 891 H2 HOH A 297 62.449 22.896 -41.245 1.00 0.00 H +HETATM 892 O HOH A 298 22.993 30.269 25.452 1.00 0.00 O +HETATM 893 H1 HOH A 298 23.157 29.357 25.214 1.00 0.00 H +HETATM 894 H2 HOH A 298 23.817 30.718 25.263 1.00 0.00 H +HETATM 895 O HOH A 299 -44.092 16.857 -29.398 1.00 0.00 O +HETATM 896 H1 HOH A 299 -43.897 17.370 -30.182 1.00 0.00 H +HETATM 897 H2 HOH A 299 -44.399 17.500 -28.759 1.00 0.00 H +HETATM 898 O HOH A 300 22.086 30.056 8.178 1.00 0.00 O +HETATM 899 H1 HOH A 300 21.169 29.956 7.923 1.00 0.00 H +HETATM 900 H2 HOH A 300 22.373 30.852 7.730 1.00 0.00 H +HETATM 901 O HOH A 301 47.102 -7.237 -21.497 1.00 0.00 O +HETATM 902 H1 HOH A 301 47.165 -6.452 -22.041 1.00 0.00 H +HETATM 903 H2 HOH A 301 46.536 -6.980 -20.769 1.00 0.00 H +HETATM 904 O HOH A 302 -10.166 -40.080 3.892 1.00 0.00 O +HETATM 905 H1 HOH A 302 -10.409 -39.161 4.007 1.00 0.00 H +HETATM 906 H2 HOH A 302 -10.583 -40.337 3.070 1.00 0.00 H +HETATM 907 O HOH A 303 0.423 71.720 30.018 1.00 0.00 O +HETATM 908 H1 HOH A 303 1.096 72.400 29.983 1.00 0.00 H +HETATM 909 H2 HOH A 303 -0.065 71.906 30.819 1.00 0.00 H +HETATM 910 O HOH A 304 -9.374 29.247 54.016 1.00 0.00 O +HETATM 911 H1 HOH A 304 -9.768 29.492 53.178 1.00 0.00 H +HETATM 912 H2 HOH A 304 -9.054 30.072 54.380 1.00 0.00 H +HETATM 913 O HOH A 305 20.279 9.096 11.137 1.00 0.00 O +HETATM 914 H1 HOH A 305 20.298 9.987 11.486 1.00 0.00 H +HETATM 915 H2 HOH A 305 20.217 9.210 10.189 1.00 0.00 H +HETATM 916 O HOH A 306 -13.214 -29.240 1.312 1.00 0.00 O +HETATM 917 H1 HOH A 306 -12.975 -30.121 1.023 1.00 0.00 H +HETATM 918 H2 HOH A 306 -12.620 -29.057 2.039 1.00 0.00 H +HETATM 919 O HOH A 307 -22.270 -18.125 -1.405 1.00 0.00 O +HETATM 920 H1 HOH A 307 -21.319 -18.019 -1.382 1.00 0.00 H +HETATM 921 H2 HOH A 307 -22.437 -18.611 -2.213 1.00 0.00 H +HETATM 922 O HOH A 308 9.625 23.582 20.717 1.00 0.00 O +HETATM 923 H1 HOH A 308 9.182 24.430 20.755 1.00 0.00 H +HETATM 924 H2 HOH A 308 10.316 23.643 21.377 1.00 0.00 H +HETATM 925 O HOH A 309 -22.866 13.712 20.143 1.00 0.00 O +HETATM 926 H1 HOH A 309 -23.015 14.648 20.008 1.00 0.00 H +HETATM 927 H2 HOH A 309 -22.031 13.536 19.710 1.00 0.00 H +HETATM 928 O HOH A 310 30.275 2.048 -16.116 1.00 0.00 O +HETATM 929 H1 HOH A 310 29.495 1.960 -15.568 1.00 0.00 H +HETATM 930 H2 HOH A 310 30.105 1.482 -16.868 1.00 0.00 H +HETATM 931 O HOH A 311 -21.208 -24.576 28.544 1.00 0.00 O +HETATM 932 H1 HOH A 311 -21.219 -24.538 27.588 1.00 0.00 H +HETATM 933 H2 HOH A 311 -22.132 -24.569 28.796 1.00 0.00 H +HETATM 934 O HOH A 312 -11.254 19.435 -11.667 1.00 0.00 O +HETATM 935 H1 HOH A 312 -11.658 19.128 -10.856 1.00 0.00 H +HETATM 936 H2 HOH A 312 -11.088 18.637 -12.169 1.00 0.00 H +HETATM 937 O HOH A 313 1.219 29.084 -63.154 1.00 0.00 O +HETATM 938 H1 HOH A 313 1.394 30.016 -63.283 1.00 0.00 H +HETATM 939 H2 HOH A 313 1.069 28.996 -62.212 1.00 0.00 H +HETATM 940 O HOH A 314 -9.767 42.417 -16.410 1.00 0.00 O +HETATM 941 H1 HOH A 314 -10.378 42.921 -15.873 1.00 0.00 H +HETATM 942 H2 HOH A 314 -9.041 42.212 -15.821 1.00 0.00 H +HETATM 943 O HOH A 315 33.514 -21.201 -55.672 1.00 0.00 O +HETATM 944 H1 HOH A 315 33.578 -20.247 -55.703 1.00 0.00 H +HETATM 945 H2 HOH A 315 33.658 -21.481 -56.576 1.00 0.00 H +HETATM 946 O HOH A 316 14.667 24.996 -25.317 1.00 0.00 O +HETATM 947 H1 HOH A 316 14.413 25.829 -25.715 1.00 0.00 H +HETATM 948 H2 HOH A 316 14.860 25.215 -24.405 1.00 0.00 H +HETATM 949 O HOH A 317 -24.701 -8.076 6.580 1.00 0.00 O +HETATM 950 H1 HOH A 317 -24.447 -8.915 6.196 1.00 0.00 H +HETATM 951 H2 HOH A 317 -25.652 -8.043 6.476 1.00 0.00 H +HETATM 952 O HOH A 318 10.947 -1.407 -14.291 1.00 0.00 O +HETATM 953 H1 HOH A 318 10.485 -0.575 -14.399 1.00 0.00 H +HETATM 954 H2 HOH A 318 10.289 -2.074 -14.488 1.00 0.00 H +HETATM 955 O HOH A 319 27.109 8.051 -15.235 1.00 0.00 O +HETATM 956 H1 HOH A 319 26.201 8.343 -15.152 1.00 0.00 H +HETATM 957 H2 HOH A 319 27.354 7.776 -14.352 1.00 0.00 H +HETATM 958 O HOH A 320 31.788 37.518 -2.365 1.00 0.00 O +HETATM 959 H1 HOH A 320 32.344 37.178 -1.663 1.00 0.00 H +HETATM 960 H2 HOH A 320 32.193 37.197 -3.170 1.00 0.00 H +HETATM 961 O HOH A 321 16.644 22.694 40.155 1.00 0.00 O +HETATM 962 H1 HOH A 321 17.542 22.399 40.006 1.00 0.00 H +HETATM 963 H2 HOH A 321 16.549 23.466 39.597 1.00 0.00 H +HETATM 964 O HOH A 322 -26.784 34.214 -5.558 1.00 0.00 O +HETATM 965 H1 HOH A 322 -27.610 33.742 -5.663 1.00 0.00 H +HETATM 966 H2 HOH A 322 -26.745 34.426 -4.625 1.00 0.00 H +HETATM 967 O HOH A 323 -27.437 46.959 0.533 1.00 0.00 O +HETATM 968 H1 HOH A 323 -27.565 47.838 0.889 1.00 0.00 H +HETATM 969 H2 HOH A 323 -27.283 47.099 -0.402 1.00 0.00 H +HETATM 970 O HOH A 324 -60.581 34.604 31.260 1.00 0.00 O +HETATM 971 H1 HOH A 324 -60.485 34.131 30.433 1.00 0.00 H +HETATM 972 H2 HOH A 324 -59.758 35.082 31.360 1.00 0.00 H +HETATM 973 O HOH A 325 19.580 -21.610 20.750 1.00 0.00 O +HETATM 974 H1 HOH A 325 20.303 -21.359 21.324 1.00 0.00 H +HETATM 975 H2 HOH A 325 18.899 -21.924 21.345 1.00 0.00 H +HETATM 976 O HOH A 326 34.057 42.477 -17.257 1.00 0.00 O +HETATM 977 H1 HOH A 326 33.102 42.436 -17.315 1.00 0.00 H +HETATM 978 H2 HOH A 326 34.350 42.526 -18.167 1.00 0.00 H +HETATM 979 O HOH A 327 39.956 22.744 -13.973 1.00 0.00 O +HETATM 980 H1 HOH A 327 39.234 22.318 -14.436 1.00 0.00 H +HETATM 981 H2 HOH A 327 39.624 22.884 -13.087 1.00 0.00 H +HETATM 982 O HOH A 328 21.502 -65.400 -8.752 1.00 0.00 O +HETATM 983 H1 HOH A 328 21.508 -64.478 -8.494 1.00 0.00 H +HETATM 984 H2 HOH A 328 21.256 -65.871 -7.956 1.00 0.00 H +HETATM 985 O HOH A 329 -87.159 -12.967 15.673 1.00 0.00 O +HETATM 986 H1 HOH A 329 -86.763 -13.742 16.071 1.00 0.00 H +HETATM 987 H2 HOH A 329 -86.762 -12.914 14.804 1.00 0.00 H +HETATM 988 O HOH A 330 33.785 -54.124 1.246 1.00 0.00 O +HETATM 989 H1 HOH A 330 34.737 -54.028 1.277 1.00 0.00 H +HETATM 990 H2 HOH A 330 33.627 -55.030 1.512 1.00 0.00 H +HETATM 991 O HOH A 331 33.594 -5.218 17.268 1.00 0.00 O +HETATM 992 H1 HOH A 331 34.439 -5.564 17.557 1.00 0.00 H +HETATM 993 H2 HOH A 331 33.596 -4.306 17.559 1.00 0.00 H +HETATM 994 O HOH A 332 7.757 -86.259 11.913 1.00 0.00 O +HETATM 995 H1 HOH A 332 8.116 -85.392 12.104 1.00 0.00 H +HETATM 996 H2 HOH A 332 8.251 -86.561 11.151 1.00 0.00 H +HETATM 997 O HOH A 333 0.606 -26.555 -47.967 1.00 0.00 O +HETATM 998 H1 HOH A 333 0.478 -27.169 -48.691 1.00 0.00 H +HETATM 999 H2 HOH A 333 -0.156 -26.685 -47.404 1.00 0.00 H +HETATM 1000 O HOH A 334 2.562 12.316 -21.972 1.00 0.00 O +HETATM 1001 H1 HOH A 334 3.107 13.082 -21.792 1.00 0.00 H +HETATM 1002 H2 HOH A 334 1.663 12.632 -21.876 1.00 0.00 H +HETATM 1003 O HOH A 335 -7.957 -15.424 -23.975 1.00 0.00 O +HETATM 1004 H1 HOH A 335 -7.852 -15.385 -24.925 1.00 0.00 H +HETATM 1005 H2 HOH A 335 -8.858 -15.721 -23.845 1.00 0.00 H +HETATM 1006 O HOH A 336 25.982 10.343 12.462 1.00 0.00 O +HETATM 1007 H1 HOH A 336 26.372 9.477 12.341 1.00 0.00 H +HETATM 1008 H2 HOH A 336 25.326 10.218 13.147 1.00 0.00 H +HETATM 1009 O HOH A 337 -12.242 14.403 -12.389 1.00 0.00 O +HETATM 1010 H1 HOH A 337 -11.967 13.569 -12.008 1.00 0.00 H +HETATM 1011 H2 HOH A 337 -12.936 14.715 -11.808 1.00 0.00 H +HETATM 1012 O HOH A 338 -45.720 -15.827 -61.156 1.00 0.00 O +HETATM 1013 H1 HOH A 338 -45.680 -14.892 -61.353 1.00 0.00 H +HETATM 1014 H2 HOH A 338 -45.165 -15.934 -60.383 1.00 0.00 H +HETATM 1015 O HOH A 339 0.179 15.893 9.267 1.00 0.00 O +HETATM 1016 H1 HOH A 339 0.935 15.306 9.295 1.00 0.00 H +HETATM 1017 H2 HOH A 339 0.318 16.427 8.485 1.00 0.00 H +HETATM 1018 O HOH A 340 0.507 -40.298 -31.858 1.00 0.00 O +HETATM 1019 H1 HOH A 340 -0.196 -40.860 -31.531 1.00 0.00 H +HETATM 1020 H2 HOH A 340 0.923 -39.951 -31.069 1.00 0.00 H +HETATM 1021 O HOH A 341 2.062 -21.445 15.639 1.00 0.00 O +HETATM 1022 H1 HOH A 341 2.688 -22.136 15.853 1.00 0.00 H +HETATM 1023 H2 HOH A 341 1.210 -21.882 15.652 1.00 0.00 H +HETATM 1024 O HOH A 342 -17.767 7.366 4.337 1.00 0.00 O +HETATM 1025 H1 HOH A 342 -17.780 8.319 4.419 1.00 0.00 H +HETATM 1026 H2 HOH A 342 -18.534 7.072 4.827 1.00 0.00 H +HETATM 1027 O HOH A 343 -11.955 48.161 6.676 1.00 0.00 O +HETATM 1028 H1 HOH A 343 -11.401 48.055 5.903 1.00 0.00 H +HETATM 1029 H2 HOH A 343 -12.834 47.932 6.374 1.00 0.00 H +HETATM 1030 O HOH A 344 34.558 10.024 -62.471 1.00 0.00 O +HETATM 1031 H1 HOH A 344 33.734 9.747 -62.871 1.00 0.00 H +HETATM 1032 H2 HOH A 344 34.694 9.409 -61.750 1.00 0.00 H +HETATM 1033 O HOH A 345 17.794 -0.782 -38.901 1.00 0.00 O +HETATM 1034 H1 HOH A 345 17.033 -1.287 -38.615 1.00 0.00 H +HETATM 1035 H2 HOH A 345 18.086 -1.220 -39.700 1.00 0.00 H +HETATM 1036 O HOH A 346 -24.758 -73.145 -0.175 1.00 0.00 O +HETATM 1037 H1 HOH A 346 -24.383 -73.711 -0.850 1.00 0.00 H +HETATM 1038 H2 HOH A 346 -24.030 -72.970 0.423 1.00 0.00 H +HETATM 1039 O HOH A 347 -26.801 16.538 -10.217 1.00 0.00 O +HETATM 1040 H1 HOH A 347 -26.737 17.465 -10.448 1.00 0.00 H +HETATM 1041 H2 HOH A 347 -25.951 16.327 -9.831 1.00 0.00 H +HETATM 1042 O HOH A 348 -28.288 -15.873 -2.187 1.00 0.00 O +HETATM 1043 H1 HOH A 348 -27.438 -15.787 -1.756 1.00 0.00 H +HETATM 1044 H2 HOH A 348 -28.670 -14.996 -2.142 1.00 0.00 H +HETATM 1045 O HOH A 349 -8.114 36.405 45.680 1.00 0.00 O +HETATM 1046 H1 HOH A 349 -8.124 37.244 45.220 1.00 0.00 H +HETATM 1047 H2 HOH A 349 -7.267 36.386 46.126 1.00 0.00 H +HETATM 1048 O HOH A 350 -1.118 9.220 -1.029 1.00 0.00 O +HETATM 1049 H1 HOH A 350 -0.714 10.036 -1.324 1.00 0.00 H +HETATM 1050 H2 HOH A 350 -0.875 9.153 -0.105 1.00 0.00 H +HETATM 1051 O HOH A 351 -32.356 -37.807 51.169 1.00 0.00 O +HETATM 1052 H1 HOH A 351 -32.754 -38.669 51.051 1.00 0.00 H +HETATM 1053 H2 HOH A 351 -32.883 -37.223 50.624 1.00 0.00 H +HETATM 1054 O HOH A 352 36.550 28.369 50.158 1.00 0.00 O +HETATM 1055 H1 HOH A 352 36.121 28.936 50.799 1.00 0.00 H +HETATM 1056 H2 HOH A 352 36.539 27.501 50.560 1.00 0.00 H +HETATM 1057 O HOH A 353 12.534 -41.132 -51.474 1.00 0.00 O +HETATM 1058 H1 HOH A 353 13.450 -41.365 -51.321 1.00 0.00 H +HETATM 1059 H2 HOH A 353 12.157 -41.054 -50.598 1.00 0.00 H +HETATM 1060 O HOH A 354 -80.098 3.265 16.235 1.00 0.00 O +HETATM 1061 H1 HOH A 354 -80.173 2.409 16.658 1.00 0.00 H +HETATM 1062 H2 HOH A 354 -79.921 3.872 16.954 1.00 0.00 H +HETATM 1063 O HOH A 355 29.500 33.391 8.453 1.00 0.00 O +HETATM 1064 H1 HOH A 355 28.714 32.954 8.783 1.00 0.00 H +HETATM 1065 H2 HOH A 355 29.297 34.324 8.509 1.00 0.00 H +HETATM 1066 O HOH A 356 -5.166 5.511 -42.165 1.00 0.00 O +HETATM 1067 H1 HOH A 356 -5.965 4.989 -42.097 1.00 0.00 H +HETATM 1068 H2 HOH A 356 -5.190 5.873 -43.051 1.00 0.00 H +HETATM 1069 O HOH A 357 16.652 28.928 38.834 1.00 0.00 O +HETATM 1070 H1 HOH A 357 17.307 28.562 38.239 1.00 0.00 H +HETATM 1071 H2 HOH A 357 16.459 28.216 39.445 1.00 0.00 H +HETATM 1072 O HOH A 358 -12.605 7.050 -10.041 1.00 0.00 O +HETATM 1073 H1 HOH A 358 -11.866 7.531 -10.412 1.00 0.00 H +HETATM 1074 H2 HOH A 358 -12.540 6.176 -10.426 1.00 0.00 H +HETATM 1075 O HOH A 359 2.533 31.623 -12.762 1.00 0.00 O +HETATM 1076 H1 HOH A 359 1.987 31.187 -12.108 1.00 0.00 H +HETATM 1077 H2 HOH A 359 2.924 32.361 -12.295 1.00 0.00 H +HETATM 1078 O HOH A 360 59.374 4.416 29.766 1.00 0.00 O +HETATM 1079 H1 HOH A 360 58.912 5.037 30.329 1.00 0.00 H +HETATM 1080 H2 HOH A 360 59.230 3.565 30.179 1.00 0.00 H +HETATM 1081 O HOH A 361 9.473 -18.441 68.181 1.00 0.00 O +HETATM 1082 H1 HOH A 361 10.374 -18.693 68.385 1.00 0.00 H +HETATM 1083 H2 HOH A 361 9.510 -18.130 67.277 1.00 0.00 H +HETATM 1084 O HOH A 362 49.469 3.239 -5.118 1.00 0.00 O +HETATM 1085 H1 HOH A 362 49.552 2.467 -4.558 1.00 0.00 H +HETATM 1086 H2 HOH A 362 48.545 3.481 -5.058 1.00 0.00 H +HETATM 1087 O HOH A 363 -6.654 -15.417 -7.206 1.00 0.00 O +HETATM 1088 H1 HOH A 363 -6.632 -16.111 -6.547 1.00 0.00 H +HETATM 1089 H2 HOH A 363 -6.144 -14.704 -6.821 1.00 0.00 H +HETATM 1090 O HOH A 364 27.886 11.507 -33.837 1.00 0.00 O +HETATM 1091 H1 HOH A 364 28.156 11.586 -34.752 1.00 0.00 H +HETATM 1092 H2 HOH A 364 28.332 10.720 -33.522 1.00 0.00 H +HETATM 1093 O HOH A 365 -18.869 49.089 42.015 1.00 0.00 O +HETATM 1094 H1 HOH A 365 -18.997 48.599 41.202 1.00 0.00 H +HETATM 1095 H2 HOH A 365 -18.234 49.768 41.788 1.00 0.00 H +HETATM 1096 O HOH A 366 -27.005 -2.060 -14.905 1.00 0.00 O +HETATM 1097 H1 HOH A 366 -27.692 -2.720 -14.995 1.00 0.00 H +HETATM 1098 H2 HOH A 366 -26.230 -2.464 -15.297 1.00 0.00 H +HETATM 1099 O HOH A 367 19.315 31.555 -19.690 1.00 0.00 O +HETATM 1100 H1 HOH A 367 19.847 31.486 -20.483 1.00 0.00 H +HETATM 1101 H2 HOH A 367 18.848 32.386 -19.786 1.00 0.00 H +HETATM 1102 O HOH A 368 -2.724 -3.586 -32.759 1.00 0.00 O +HETATM 1103 H1 HOH A 368 -2.167 -2.848 -33.006 1.00 0.00 H +HETATM 1104 H2 HOH A 368 -2.865 -4.064 -33.576 1.00 0.00 H +HETATM 1105 O HOH A 369 1.741 -4.295 -3.008 1.00 0.00 O +HETATM 1106 H1 HOH A 369 2.129 -4.072 -3.854 1.00 0.00 H +HETATM 1107 H2 HOH A 369 1.920 -5.229 -2.901 1.00 0.00 H +HETATM 1108 O HOH A 370 -22.339 14.269 -8.531 1.00 0.00 O +HETATM 1109 H1 HOH A 370 -22.308 13.312 -8.540 1.00 0.00 H +HETATM 1110 H2 HOH A 370 -21.904 14.516 -7.715 1.00 0.00 H +HETATM 1111 O HOH A 371 -13.568 0.311 43.524 1.00 0.00 O +HETATM 1112 H1 HOH A 371 -13.195 1.142 43.819 1.00 0.00 H +HETATM 1113 H2 HOH A 371 -14.198 0.077 44.205 1.00 0.00 H +HETATM 1114 O HOH A 372 -12.370 -69.040 6.222 1.00 0.00 O +HETATM 1115 H1 HOH A 372 -13.028 -69.610 5.825 1.00 0.00 H +HETATM 1116 H2 HOH A 372 -12.423 -68.227 5.719 1.00 0.00 H +HETATM 1117 O HOH A 373 -26.583 36.523 -56.636 1.00 0.00 O +HETATM 1118 H1 HOH A 373 -26.659 35.800 -56.014 1.00 0.00 H +HETATM 1119 H2 HOH A 373 -25.763 36.357 -57.100 1.00 0.00 H +HETATM 1120 O HOH A 374 -8.126 6.871 -11.243 1.00 0.00 O +HETATM 1121 H1 HOH A 374 -8.060 6.069 -10.725 1.00 0.00 H +HETATM 1122 H2 HOH A 374 -7.453 6.778 -11.916 1.00 0.00 H +HETATM 1123 O HOH A 375 25.573 -11.637 12.053 1.00 0.00 O +HETATM 1124 H1 HOH A 375 25.970 -12.503 12.144 1.00 0.00 H +HETATM 1125 H2 HOH A 375 24.887 -11.615 12.720 1.00 0.00 H +HETATM 1126 O HOH A 376 4.787 -45.726 26.377 1.00 0.00 O +HETATM 1127 H1 HOH A 376 4.171 -45.103 26.762 1.00 0.00 H +HETATM 1128 H2 HOH A 376 4.347 -46.040 25.586 1.00 0.00 H +HETATM 1129 O HOH A 377 21.914 -23.333 -19.361 1.00 0.00 O +HETATM 1130 H1 HOH A 377 21.213 -22.939 -18.843 1.00 0.00 H +HETATM 1131 H2 HOH A 377 22.644 -23.423 -18.749 1.00 0.00 H +HETATM 1132 O HOH A 378 -3.733 -34.083 12.624 1.00 0.00 O +HETATM 1133 H1 HOH A 378 -3.150 -33.670 13.261 1.00 0.00 H +HETATM 1134 H2 HOH A 378 -4.605 -34.005 13.011 1.00 0.00 H +HETATM 1135 O HOH A 379 28.182 -9.470 26.070 1.00 0.00 O +HETATM 1136 H1 HOH A 379 29.015 -9.729 26.463 1.00 0.00 H +HETATM 1137 H2 HOH A 379 27.962 -8.642 26.497 1.00 0.00 H +HETATM 1138 O HOH A 380 -40.465 1.302 48.304 1.00 0.00 O +HETATM 1139 H1 HOH A 380 -40.850 1.520 49.152 1.00 0.00 H +HETATM 1140 H2 HOH A 380 -40.278 2.149 47.900 1.00 0.00 H +HETATM 1141 O HOH A 381 2.402 22.101 -13.114 1.00 0.00 O +HETATM 1142 H1 HOH A 381 2.445 22.110 -12.158 1.00 0.00 H +HETATM 1143 H2 HOH A 381 1.781 21.401 -13.319 1.00 0.00 H +HETATM 1144 O HOH A 382 1.473 -28.259 65.369 1.00 0.00 O +HETATM 1145 H1 HOH A 382 2.196 -28.807 65.672 1.00 0.00 H +HETATM 1146 H2 HOH A 382 0.890 -28.192 66.125 1.00 0.00 H +HETATM 1147 O HOH A 383 -15.977 9.391 42.653 1.00 0.00 O +HETATM 1148 H1 HOH A 383 -16.922 9.478 42.779 1.00 0.00 H +HETATM 1149 H2 HOH A 383 -15.728 8.651 43.207 1.00 0.00 H +HETATM 1150 O HOH A 384 -14.785 11.678 -7.108 1.00 0.00 O +HETATM 1151 H1 HOH A 384 -14.203 11.636 -7.866 1.00 0.00 H +HETATM 1152 H2 HOH A 384 -15.285 10.863 -7.144 1.00 0.00 H +HETATM 1153 O HOH A 385 67.819 22.561 57.946 1.00 0.00 O +HETATM 1154 H1 HOH A 385 67.461 22.145 57.161 1.00 0.00 H +HETATM 1155 H2 HOH A 385 68.441 21.922 58.293 1.00 0.00 H +HETATM 1156 O HOH A 386 21.452 -0.091 26.003 1.00 0.00 O +HETATM 1157 H1 HOH A 386 20.741 0.192 26.578 1.00 0.00 H +HETATM 1158 H2 HOH A 386 21.280 0.354 25.173 1.00 0.00 H +HETATM 1159 O HOH A 387 -48.605 -10.766 -18.924 1.00 0.00 O +HETATM 1160 H1 HOH A 387 -48.793 -10.886 -17.993 1.00 0.00 H +HETATM 1161 H2 HOH A 387 -48.027 -11.496 -19.147 1.00 0.00 H +HETATM 1162 O HOH A 388 9.901 29.073 23.222 1.00 0.00 O +HETATM 1163 H1 HOH A 388 10.633 29.006 23.836 1.00 0.00 H +HETATM 1164 H2 HOH A 388 10.181 29.731 22.586 1.00 0.00 H +HETATM 1165 O HOH A 389 -20.254 53.504 5.896 1.00 0.00 O +HETATM 1166 H1 HOH A 389 -20.479 53.538 6.826 1.00 0.00 H +HETATM 1167 H2 HOH A 389 -19.902 52.624 5.766 1.00 0.00 H +HETATM 1168 O HOH A 390 -16.332 15.333 36.995 1.00 0.00 O +HETATM 1169 H1 HOH A 390 -16.499 15.985 36.314 1.00 0.00 H +HETATM 1170 H2 HOH A 390 -15.428 15.493 37.264 1.00 0.00 H +HETATM 1171 O HOH A 391 -16.180 -2.311 39.983 1.00 0.00 O +HETATM 1172 H1 HOH A 391 -15.954 -1.509 40.453 1.00 0.00 H +HETATM 1173 H2 HOH A 391 -17.031 -2.126 39.585 1.00 0.00 H +HETATM 1174 O HOH A 392 25.526 -2.861 -15.952 1.00 0.00 O +HETATM 1175 H1 HOH A 392 25.546 -3.058 -16.889 1.00 0.00 H +HETATM 1176 H2 HOH A 392 25.646 -3.710 -15.527 1.00 0.00 H +HETATM 1177 O HOH A 393 19.390 -49.262 7.970 1.00 0.00 O +HETATM 1178 H1 HOH A 393 20.082 -49.059 8.599 1.00 0.00 H +HETATM 1179 H2 HOH A 393 19.089 -50.136 8.218 1.00 0.00 H +HETATM 1180 O HOH A 394 7.118 -11.952 -23.466 1.00 0.00 O +HETATM 1181 H1 HOH A 394 7.794 -12.140 -24.118 1.00 0.00 H +HETATM 1182 H2 HOH A 394 6.334 -12.386 -23.802 1.00 0.00 H +HETATM 1183 O HOH A 395 1.513 7.594 20.382 1.00 0.00 O +HETATM 1184 H1 HOH A 395 1.865 6.733 20.608 1.00 0.00 H +HETATM 1185 H2 HOH A 395 2.215 8.019 19.890 1.00 0.00 H +HETATM 1186 O HOH A 396 30.830 -3.586 23.460 1.00 0.00 O +HETATM 1187 H1 HOH A 396 30.514 -4.177 24.144 1.00 0.00 H +HETATM 1188 H2 HOH A 396 30.035 -3.232 23.062 1.00 0.00 H +HETATM 1189 O HOH A 397 -0.896 -25.944 -8.311 1.00 0.00 O +HETATM 1190 H1 HOH A 397 -1.430 -25.185 -8.076 1.00 0.00 H +HETATM 1191 H2 HOH A 397 -0.904 -25.955 -9.268 1.00 0.00 H +HETATM 1192 O HOH A 398 5.743 17.949 30.978 1.00 0.00 O +HETATM 1193 H1 HOH A 398 5.002 18.223 31.518 1.00 0.00 H +HETATM 1194 H2 HOH A 398 6.079 17.164 31.411 1.00 0.00 H +HETATM 1195 O HOH A 399 36.502 -18.797 -27.707 1.00 0.00 O +HETATM 1196 H1 HOH A 399 36.928 -19.058 -28.524 1.00 0.00 H +HETATM 1197 H2 HOH A 399 36.787 -17.895 -27.565 1.00 0.00 H +HETATM 1198 O HOH A 400 18.032 4.987 -51.462 1.00 0.00 O +HETATM 1199 H1 HOH A 400 18.469 5.207 -50.640 1.00 0.00 H +HETATM 1200 H2 HOH A 400 18.470 5.528 -52.119 1.00 0.00 H +HETATM 1201 O HOH A 401 38.681 14.532 -29.862 1.00 0.00 O +HETATM 1202 H1 HOH A 401 37.791 14.179 -29.841 1.00 0.00 H +HETATM 1203 H2 HOH A 401 38.708 15.157 -29.138 1.00 0.00 H +HETATM 1204 O HOH A 402 13.652 -26.745 -1.843 1.00 0.00 O +HETATM 1205 H1 HOH A 402 14.050 -25.995 -1.401 1.00 0.00 H +HETATM 1206 H2 HOH A 402 12.764 -26.457 -2.054 1.00 0.00 H +HETATM 1207 O HOH A 403 60.967 38.218 -4.745 1.00 0.00 O +HETATM 1208 H1 HOH A 403 60.085 38.041 -4.418 1.00 0.00 H +HETATM 1209 H2 HOH A 403 60.828 38.676 -5.574 1.00 0.00 H +HETATM 1210 O HOH A 404 -34.589 -23.557 36.435 1.00 0.00 O +HETATM 1211 H1 HOH A 404 -34.900 -24.403 36.757 1.00 0.00 H +HETATM 1212 H2 HOH A 404 -34.683 -23.612 35.484 1.00 0.00 H +HETATM 1213 O HOH A 405 12.937 -37.580 -23.506 1.00 0.00 O +HETATM 1214 H1 HOH A 405 13.158 -37.435 -22.586 1.00 0.00 H +HETATM 1215 H2 HOH A 405 12.024 -37.302 -23.581 1.00 0.00 H +HETATM 1216 O HOH A 406 17.336 -22.737 -25.007 1.00 0.00 O +HETATM 1217 H1 HOH A 406 17.342 -22.883 -25.953 1.00 0.00 H +HETATM 1218 H2 HOH A 406 16.464 -22.387 -24.824 1.00 0.00 H +HETATM 1219 O HOH A 407 -48.315 7.039 31.023 1.00 0.00 O +HETATM 1220 H1 HOH A 407 -48.356 7.975 30.826 1.00 0.00 H +HETATM 1221 H2 HOH A 407 -48.427 6.988 31.972 1.00 0.00 H +HETATM 1222 O HOH A 408 11.029 -23.782 1.440 1.00 0.00 O +HETATM 1223 H1 HOH A 408 11.244 -24.714 1.470 1.00 0.00 H +HETATM 1224 H2 HOH A 408 10.088 -23.759 1.264 1.00 0.00 H +HETATM 1225 O HOH A 409 -25.725 -48.026 21.858 1.00 0.00 O +HETATM 1226 H1 HOH A 409 -26.650 -47.797 21.943 1.00 0.00 H +HETATM 1227 H2 HOH A 409 -25.263 -47.343 22.345 1.00 0.00 H +HETATM 1228 O HOH A 410 -33.779 19.242 -13.777 1.00 0.00 O +HETATM 1229 H1 HOH A 410 -34.543 19.371 -14.339 1.00 0.00 H +HETATM 1230 H2 HOH A 410 -34.076 19.507 -12.906 1.00 0.00 H +HETATM 1231 O HOH A 411 19.776 6.887 46.077 1.00 0.00 O +HETATM 1232 H1 HOH A 411 20.367 6.135 46.110 1.00 0.00 H +HETATM 1233 H2 HOH A 411 20.343 7.629 45.867 1.00 0.00 H +HETATM 1234 O HOH A 412 -20.298 4.583 14.898 1.00 0.00 O +HETATM 1235 H1 HOH A 412 -21.079 4.053 15.056 1.00 0.00 H +HETATM 1236 H2 HOH A 412 -20.036 4.362 14.004 1.00 0.00 H +HETATM 1237 O HOH A 413 24.811 -4.648 3.684 1.00 0.00 O +HETATM 1238 H1 HOH A 413 24.755 -4.036 4.418 1.00 0.00 H +HETATM 1239 H2 HOH A 413 24.504 -5.481 4.042 1.00 0.00 H +HETATM 1240 O HOH A 414 18.938 25.449 -7.716 1.00 0.00 O +HETATM 1241 H1 HOH A 414 19.328 25.245 -8.566 1.00 0.00 H +HETATM 1242 H2 HOH A 414 18.912 24.609 -7.256 1.00 0.00 H +HETATM 1243 O HOH A 415 19.419 -4.180 -1.379 1.00 0.00 O +HETATM 1244 H1 HOH A 415 18.991 -3.998 -0.542 1.00 0.00 H +HETATM 1245 H2 HOH A 415 20.337 -3.953 -1.233 1.00 0.00 H +HETATM 1246 O HOH A 416 42.650 -8.489 49.690 1.00 0.00 O +HETATM 1247 H1 HOH A 416 41.999 -7.804 49.541 1.00 0.00 H +HETATM 1248 H2 HOH A 416 43.366 -8.045 50.144 1.00 0.00 H +HETATM 1249 O HOH A 417 35.038 -54.018 -62.891 1.00 0.00 O +HETATM 1250 H1 HOH A 417 34.214 -54.259 -63.314 1.00 0.00 H +HETATM 1251 H2 HOH A 417 35.495 -54.850 -62.766 1.00 0.00 H +HETATM 1252 O HOH A 418 21.628 4.397 -2.579 1.00 0.00 O +HETATM 1253 H1 HOH A 418 22.557 4.482 -2.366 1.00 0.00 H +HETATM 1254 H2 HOH A 418 21.176 4.543 -1.748 1.00 0.00 H +HETATM 1255 O HOH A 419 41.462 -32.093 -35.185 1.00 0.00 O +HETATM 1256 H1 HOH A 419 41.302 -32.582 -34.378 1.00 0.00 H +HETATM 1257 H2 HOH A 419 40.589 -31.903 -35.528 1.00 0.00 H +HETATM 1258 O HOH A 420 69.388 -3.743 -38.087 1.00 0.00 O +HETATM 1259 H1 HOH A 420 68.800 -4.414 -37.743 1.00 0.00 H +HETATM 1260 H2 HOH A 420 69.464 -3.945 -39.020 1.00 0.00 H +HETATM 1261 O HOH A 421 6.896 -19.380 16.275 1.00 0.00 O +HETATM 1262 H1 HOH A 421 6.322 -19.745 15.601 1.00 0.00 H +HETATM 1263 H2 HOH A 421 7.756 -19.336 15.859 1.00 0.00 H +HETATM 1264 O HOH A 422 -20.756 -3.609 30.816 1.00 0.00 O +HETATM 1265 H1 HOH A 422 -20.095 -3.931 30.203 1.00 0.00 H +HETATM 1266 H2 HOH A 422 -21.574 -4.008 30.519 1.00 0.00 H +HETATM 1267 O HOH A 423 -2.594 -42.554 35.981 1.00 0.00 O +HETATM 1268 H1 HOH A 423 -2.910 -43.225 35.375 1.00 0.00 H +HETATM 1269 H2 HOH A 423 -3.358 -42.001 36.146 1.00 0.00 H +HETATM 1270 O HOH A 424 3.231 -31.528 42.401 1.00 0.00 O +HETATM 1271 H1 HOH A 424 2.926 -30.931 41.718 1.00 0.00 H +HETATM 1272 H2 HOH A 424 4.185 -31.503 42.335 1.00 0.00 H +HETATM 1273 O HOH A 425 29.604 18.284 -2.403 1.00 0.00 O +HETATM 1274 H1 HOH A 425 30.015 18.325 -1.540 1.00 0.00 H +HETATM 1275 H2 HOH A 425 28.719 17.963 -2.233 1.00 0.00 H +HETATM 1276 O HOH A 426 -31.027 -6.188 12.137 1.00 0.00 O +HETATM 1277 H1 HOH A 426 -31.015 -6.171 13.094 1.00 0.00 H +HETATM 1278 H2 HOH A 426 -31.905 -6.495 11.913 1.00 0.00 H +HETATM 1279 O HOH A 427 -12.698 20.415 -7.871 1.00 0.00 O +HETATM 1280 H1 HOH A 427 -12.264 21.197 -7.530 1.00 0.00 H +HETATM 1281 H2 HOH A 427 -13.006 20.672 -8.741 1.00 0.00 H +HETATM 1282 O HOH A 428 -5.844 25.528 1.704 1.00 0.00 O +HETATM 1283 H1 HOH A 428 -6.467 25.923 1.095 1.00 0.00 H +HETATM 1284 H2 HOH A 428 -6.255 25.622 2.563 1.00 0.00 H +HETATM 1285 O HOH A 429 10.386 -9.415 18.385 1.00 0.00 O +HETATM 1286 H1 HOH A 429 10.953 -8.647 18.314 1.00 0.00 H +HETATM 1287 H2 HOH A 429 9.534 -9.063 18.642 1.00 0.00 H +HETATM 1288 O HOH A 430 10.876 44.888 8.219 1.00 0.00 O +HETATM 1289 H1 HOH A 430 10.328 45.657 8.375 1.00 0.00 H +HETATM 1290 H2 HOH A 430 10.276 44.233 7.862 1.00 0.00 H +HETATM 1291 O HOH A 431 24.941 30.854 -16.134 1.00 0.00 O +HETATM 1292 H1 HOH A 431 24.070 30.531 -16.365 1.00 0.00 H +HETATM 1293 H2 HOH A 431 24.786 31.470 -15.417 1.00 0.00 H +HETATM 1294 O HOH A 432 2.997 5.121 -3.921 1.00 0.00 O +HETATM 1295 H1 HOH A 432 3.809 4.672 -4.158 1.00 0.00 H +HETATM 1296 H2 HOH A 432 2.332 4.730 -4.487 1.00 0.00 H +HETATM 1297 O HOH A 433 31.555 -20.155 -16.490 1.00 0.00 O +HETATM 1298 H1 HOH A 433 31.793 -21.082 -16.467 1.00 0.00 H +HETATM 1299 H2 HOH A 433 30.764 -20.096 -15.954 1.00 0.00 H +HETATM 1300 O HOH A 434 15.635 -18.529 -24.157 1.00 0.00 O +HETATM 1301 H1 HOH A 434 16.202 -18.434 -23.392 1.00 0.00 H +HETATM 1302 H2 HOH A 434 15.090 -19.291 -23.959 1.00 0.00 H +HETATM 1303 O HOH A 435 -26.159 5.917 -5.114 1.00 0.00 O +HETATM 1304 H1 HOH A 435 -25.864 6.200 -4.248 1.00 0.00 H +HETATM 1305 H2 HOH A 435 -25.490 5.297 -5.404 1.00 0.00 H +HETATM 1306 O HOH A 436 14.269 16.654 37.066 1.00 0.00 O +HETATM 1307 H1 HOH A 436 15.136 16.324 36.830 1.00 0.00 H +HETATM 1308 H2 HOH A 436 13.721 15.871 37.122 1.00 0.00 H +HETATM 1309 O HOH A 437 37.361 5.516 19.406 1.00 0.00 O +HETATM 1310 H1 HOH A 437 38.307 5.506 19.553 1.00 0.00 H +HETATM 1311 H2 HOH A 437 37.242 6.099 18.656 1.00 0.00 H +HETATM 1312 O HOH A 438 -36.146 -46.585 19.015 1.00 0.00 O +HETATM 1313 H1 HOH A 438 -36.488 -47.088 19.755 1.00 0.00 H +HETATM 1314 H2 HOH A 438 -36.600 -45.744 19.066 1.00 0.00 H +HETATM 1315 O HOH A 439 -19.049 -29.629 38.080 1.00 0.00 O +HETATM 1316 H1 HOH A 439 -18.560 -29.818 37.279 1.00 0.00 H +HETATM 1317 H2 HOH A 439 -18.910 -30.398 38.633 1.00 0.00 H +HETATM 1318 O HOH A 440 0.395 81.351 25.538 1.00 0.00 O +HETATM 1319 H1 HOH A 440 0.732 82.148 25.947 1.00 0.00 H +HETATM 1320 H2 HOH A 440 1.112 81.044 24.983 1.00 0.00 H +HETATM 1321 O HOH A 441 9.517 -10.649 16.153 1.00 0.00 O +HETATM 1322 H1 HOH A 441 9.586 -11.556 16.451 1.00 0.00 H +HETATM 1323 H2 HOH A 441 9.754 -10.125 16.918 1.00 0.00 H +HETATM 1324 O HOH A 442 -16.283 -32.467 -1.273 1.00 0.00 O +HETATM 1325 H1 HOH A 442 -15.944 -32.966 -2.016 1.00 0.00 H +HETATM 1326 H2 HOH A 442 -16.268 -31.557 -1.569 1.00 0.00 H +HETATM 1327 O HOH A 443 -5.613 -79.758 3.055 1.00 0.00 O +HETATM 1328 H1 HOH A 443 -5.580 -78.858 3.378 1.00 0.00 H +HETATM 1329 H2 HOH A 443 -6.329 -79.759 2.419 1.00 0.00 H +HETATM 1330 O HOH A 444 2.945 -26.616 14.134 1.00 0.00 O +HETATM 1331 H1 HOH A 444 2.466 -27.176 14.744 1.00 0.00 H +HETATM 1332 H2 HOH A 444 2.623 -25.733 14.315 1.00 0.00 H +HETATM 1333 O HOH A 445 -18.083 -35.550 16.260 1.00 0.00 O +HETATM 1334 H1 HOH A 445 -18.100 -36.241 16.922 1.00 0.00 H +HETATM 1335 H2 HOH A 445 -17.182 -35.226 16.275 1.00 0.00 H +HETATM 1336 O HOH A 446 9.514 -6.663 -10.208 1.00 0.00 O +HETATM 1337 H1 HOH A 446 8.942 -6.549 -9.448 1.00 0.00 H +HETATM 1338 H2 HOH A 446 9.609 -5.783 -10.572 1.00 0.00 H +HETATM 1339 O HOH A 447 8.915 75.755 20.458 1.00 0.00 O +HETATM 1340 H1 HOH A 447 8.938 76.546 19.920 1.00 0.00 H +HETATM 1341 H2 HOH A 447 8.027 75.732 20.815 1.00 0.00 H +HETATM 1342 O HOH A 448 10.792 15.485 -10.666 1.00 0.00 O +HETATM 1343 H1 HOH A 448 10.483 16.389 -10.607 1.00 0.00 H +HETATM 1344 H2 HOH A 448 10.305 15.020 -9.986 1.00 0.00 H +HETATM 1345 O HOH A 449 -38.240 13.116 -1.667 1.00 0.00 O +HETATM 1346 H1 HOH A 449 -38.347 13.154 -2.618 1.00 0.00 H +HETATM 1347 H2 HOH A 449 -38.130 14.029 -1.402 1.00 0.00 H +HETATM 1348 O HOH A 450 57.413 -37.980 -34.742 1.00 0.00 O +HETATM 1349 H1 HOH A 450 57.378 -37.145 -34.276 1.00 0.00 H +HETATM 1350 H2 HOH A 450 57.197 -37.758 -35.648 1.00 0.00 H +HETATM 1351 O HOH A 451 32.003 54.501 26.976 1.00 0.00 O +HETATM 1352 H1 HOH A 451 31.898 55.273 27.533 1.00 0.00 H +HETATM 1353 H2 HOH A 451 31.256 53.944 27.194 1.00 0.00 H +HETATM 1354 O HOH A 452 -30.034 -39.813 -22.283 1.00 0.00 O +HETATM 1355 H1 HOH A 452 -29.582 -40.499 -22.775 1.00 0.00 H +HETATM 1356 H2 HOH A 452 -30.964 -40.008 -22.398 1.00 0.00 H +HETATM 1357 O HOH A 453 11.960 15.582 49.184 1.00 0.00 O +HETATM 1358 H1 HOH A 453 12.731 15.815 49.700 1.00 0.00 H +HETATM 1359 H2 HOH A 453 11.836 16.323 48.590 1.00 0.00 H +HETATM 1360 O HOH A 454 -23.338 60.719 -3.960 1.00 0.00 O +HETATM 1361 H1 HOH A 454 -22.682 60.119 -4.316 1.00 0.00 H +HETATM 1362 H2 HOH A 454 -23.008 61.591 -4.176 1.00 0.00 H +HETATM 1363 O HOH A 455 51.828 -10.942 48.921 1.00 0.00 O +HETATM 1364 H1 HOH A 455 52.450 -10.707 48.233 1.00 0.00 H +HETATM 1365 H2 HOH A 455 52.184 -10.540 49.714 1.00 0.00 H +HETATM 1366 O HOH A 456 14.257 4.282 1.742 1.00 0.00 O +HETATM 1367 H1 HOH A 456 14.436 3.342 1.759 1.00 0.00 H +HETATM 1368 H2 HOH A 456 13.320 4.345 1.553 1.00 0.00 H +HETATM 1369 O HOH A 457 35.612 -42.350 -17.047 1.00 0.00 O +HETATM 1370 H1 HOH A 457 35.009 -42.971 -17.455 1.00 0.00 H +HETATM 1371 H2 HOH A 457 36.464 -42.785 -17.079 1.00 0.00 H +HETATM 1372 O HOH A 458 -3.279 31.275 -46.385 1.00 0.00 O +HETATM 1373 H1 HOH A 458 -2.734 31.957 -45.991 1.00 0.00 H +HETATM 1374 H2 HOH A 458 -2.666 30.734 -46.882 1.00 0.00 H +HETATM 1375 O HOH A 459 5.943 -14.139 16.423 1.00 0.00 O +HETATM 1376 H1 HOH A 459 6.706 -13.892 15.901 1.00 0.00 H +HETATM 1377 H2 HOH A 459 6.161 -15.004 16.771 1.00 0.00 H +HETATM 1378 O HOH A 460 24.700 -69.900 -43.548 1.00 0.00 O +HETATM 1379 H1 HOH A 460 23.971 -69.684 -42.966 1.00 0.00 H +HETATM 1380 H2 HOH A 460 25.174 -69.075 -43.654 1.00 0.00 H +HETATM 1381 O HOH A 461 0.953 25.893 -31.564 1.00 0.00 O +HETATM 1382 H1 HOH A 461 0.131 25.408 -31.639 1.00 0.00 H +HETATM 1383 H2 HOH A 461 0.714 26.701 -31.110 1.00 0.00 H +HETATM 1384 O HOH A 462 20.744 41.693 -33.321 1.00 0.00 O +HETATM 1385 H1 HOH A 462 21.683 41.626 -33.493 1.00 0.00 H +HETATM 1386 H2 HOH A 462 20.376 40.885 -33.678 1.00 0.00 H +HETATM 1387 O HOH A 463 -3.649 -13.745 -20.272 1.00 0.00 O +HETATM 1388 H1 HOH A 463 -4.135 -14.175 -20.975 1.00 0.00 H +HETATM 1389 H2 HOH A 463 -4.266 -13.713 -19.540 1.00 0.00 H +HETATM 1390 O HOH A 464 -2.746 0.805 -8.282 1.00 0.00 O +HETATM 1391 H1 HOH A 464 -3.266 0.465 -7.553 1.00 0.00 H +HETATM 1392 H2 HOH A 464 -3.141 0.414 -9.061 1.00 0.00 H +HETATM 1393 O HOH A 465 30.700 35.073 20.382 1.00 0.00 O +HETATM 1394 H1 HOH A 465 30.593 34.140 20.569 1.00 0.00 H +HETATM 1395 H2 HOH A 465 30.742 35.486 21.244 1.00 0.00 H +HETATM 1396 O HOH A 466 15.708 38.083 73.988 1.00 0.00 O +HETATM 1397 H1 HOH A 466 15.206 37.403 73.537 1.00 0.00 H +HETATM 1398 H2 HOH A 466 15.077 38.496 74.576 1.00 0.00 H +HETATM 1399 O HOH A 467 -11.362 -30.017 -15.631 1.00 0.00 O +HETATM 1400 H1 HOH A 467 -11.293 -29.086 -15.839 1.00 0.00 H +HETATM 1401 H2 HOH A 467 -12.303 -30.194 -15.635 1.00 0.00 H +HETATM 1402 O HOH A 468 29.616 23.417 -5.251 1.00 0.00 O +HETATM 1403 H1 HOH A 468 30.317 23.523 -4.608 1.00 0.00 H +HETATM 1404 H2 HOH A 468 30.023 23.638 -6.089 1.00 0.00 H +HETATM 1405 O HOH A 469 23.639 -3.935 -28.862 1.00 0.00 O +HETATM 1406 H1 HOH A 469 23.183 -4.612 -29.363 1.00 0.00 H +HETATM 1407 H2 HOH A 469 24.568 -4.119 -28.999 1.00 0.00 H +HETATM 1408 O HOH A 470 -7.830 0.302 -10.523 1.00 0.00 O +HETATM 1409 H1 HOH A 470 -7.816 0.628 -11.423 1.00 0.00 H +HETATM 1410 H2 HOH A 470 -8.171 1.034 -10.009 1.00 0.00 H +HETATM 1411 O HOH A 471 -16.707 -8.342 -5.849 1.00 0.00 O +HETATM 1412 H1 HOH A 471 -17.506 -8.082 -5.392 1.00 0.00 H +HETATM 1413 H2 HOH A 471 -16.704 -7.814 -6.647 1.00 0.00 H +HETATM 1414 O HOH A 472 -6.618 -18.428 -13.374 1.00 0.00 O +HETATM 1415 H1 HOH A 472 -6.459 -19.352 -13.566 1.00 0.00 H +HETATM 1416 H2 HOH A 472 -5.931 -17.961 -13.849 1.00 0.00 H +HETATM 1417 O HOH A 473 6.273 -12.369 -31.068 1.00 0.00 O +HETATM 1418 H1 HOH A 473 6.663 -12.644 -30.238 1.00 0.00 H +HETATM 1419 H2 HOH A 473 6.118 -13.186 -31.542 1.00 0.00 H +HETATM 1420 O HOH A 474 -55.757 -3.512 20.865 1.00 0.00 O +HETATM 1421 H1 HOH A 474 -55.757 -3.991 21.694 1.00 0.00 H +HETATM 1422 H2 HOH A 474 -55.544 -4.173 20.206 1.00 0.00 H +HETATM 1423 O HOH A 475 -23.848 49.807 28.858 1.00 0.00 O +HETATM 1424 H1 HOH A 475 -24.123 50.695 28.631 1.00 0.00 H +HETATM 1425 H2 HOH A 475 -24.600 49.258 28.635 1.00 0.00 H +HETATM 1426 O HOH A 476 31.140 45.417 -7.882 1.00 0.00 O +HETATM 1427 H1 HOH A 476 31.299 45.447 -6.938 1.00 0.00 H +HETATM 1428 H2 HOH A 476 32.004 45.538 -8.275 1.00 0.00 H +HETATM 1429 O HOH A 477 -17.806 56.209 -4.731 1.00 0.00 O +HETATM 1430 H1 HOH A 477 -16.900 55.905 -4.780 1.00 0.00 H +HETATM 1431 H2 HOH A 477 -18.328 55.408 -4.709 1.00 0.00 H +HETATM 1432 O HOH A 478 -19.159 20.177 -29.261 1.00 0.00 O +HETATM 1433 H1 HOH A 478 -19.914 20.726 -29.472 1.00 0.00 H +HETATM 1434 H2 HOH A 478 -19.416 19.710 -28.466 1.00 0.00 H +HETATM 1435 O HOH A 479 30.184 45.884 28.137 1.00 0.00 O +HETATM 1436 H1 HOH A 479 29.296 46.022 27.805 1.00 0.00 H +HETATM 1437 H2 HOH A 479 30.325 44.941 28.055 1.00 0.00 H +HETATM 1438 O HOH A 480 11.648 -31.717 35.839 1.00 0.00 O +HETATM 1439 H1 HOH A 480 12.483 -32.185 35.824 1.00 0.00 H +HETATM 1440 H2 HOH A 480 11.006 -32.362 35.542 1.00 0.00 H +HETATM 1441 O HOH A 481 12.424 -32.234 -21.099 1.00 0.00 O +HETATM 1442 H1 HOH A 481 12.741 -32.603 -20.275 1.00 0.00 H +HETATM 1443 H2 HOH A 481 13.110 -31.622 -21.368 1.00 0.00 H +HETATM 1444 O HOH A 482 29.822 -34.516 -27.072 1.00 0.00 O +HETATM 1445 H1 HOH A 482 30.447 -35.235 -27.163 1.00 0.00 H +HETATM 1446 H2 HOH A 482 29.987 -33.958 -27.833 1.00 0.00 H +HETATM 1447 O HOH A 483 -36.744 -5.196 6.230 1.00 0.00 O +HETATM 1448 H1 HOH A 483 -36.604 -6.088 6.550 1.00 0.00 H +HETATM 1449 H2 HOH A 483 -37.312 -4.793 6.886 1.00 0.00 H +HETATM 1450 O HOH A 484 -4.927 -20.715 -11.074 1.00 0.00 O +HETATM 1451 H1 HOH A 484 -4.831 -19.777 -10.909 1.00 0.00 H +HETATM 1452 H2 HOH A 484 -5.142 -21.089 -10.219 1.00 0.00 H +HETATM 1453 O HOH A 485 26.313 -50.503 -1.784 1.00 0.00 O +HETATM 1454 H1 HOH A 485 25.411 -50.657 -2.066 1.00 0.00 H +HETATM 1455 H2 HOH A 485 26.388 -50.969 -0.952 1.00 0.00 H +HETATM 1456 O HOH A 486 12.131 75.672 3.843 1.00 0.00 O +HETATM 1457 H1 HOH A 486 11.445 75.445 4.471 1.00 0.00 H +HETATM 1458 H2 HOH A 486 11.688 75.673 2.995 1.00 0.00 H +HETATM 1459 O HOH A 487 -45.220 15.907 -15.533 1.00 0.00 O +HETATM 1460 H1 HOH A 487 -44.577 15.419 -16.048 1.00 0.00 H +HETATM 1461 H2 HOH A 487 -46.004 15.357 -15.545 1.00 0.00 H +HETATM 1462 O HOH A 488 66.887 4.106 33.022 1.00 0.00 O +HETATM 1463 H1 HOH A 488 65.976 4.393 32.966 1.00 0.00 H +HETATM 1464 H2 HOH A 488 66.878 3.405 33.674 1.00 0.00 H +HETATM 1465 O HOH A 489 -20.628 -54.277 -33.943 1.00 0.00 O +HETATM 1466 H1 HOH A 489 -20.370 -54.280 -34.865 1.00 0.00 H +HETATM 1467 H2 HOH A 489 -19.813 -54.113 -33.468 1.00 0.00 H +HETATM 1468 O HOH A 490 -41.046 -24.146 9.490 1.00 0.00 O +HETATM 1469 H1 HOH A 490 -41.569 -23.360 9.648 1.00 0.00 H +HETATM 1470 H2 HOH A 490 -41.380 -24.786 10.119 1.00 0.00 H +HETATM 1471 O HOH A 491 24.473 -16.643 -14.319 1.00 0.00 O +HETATM 1472 H1 HOH A 491 24.523 -15.820 -13.834 1.00 0.00 H +HETATM 1473 H2 HOH A 491 23.663 -17.053 -14.016 1.00 0.00 H +HETATM 1474 O HOH A 492 2.759 -34.176 -36.979 1.00 0.00 O +HETATM 1475 H1 HOH A 492 2.527 -33.248 -36.989 1.00 0.00 H +HETATM 1476 H2 HOH A 492 1.919 -34.634 -36.948 1.00 0.00 H +HETATM 1477 O HOH A 493 -8.732 26.844 -8.750 1.00 0.00 O +HETATM 1478 H1 HOH A 493 -9.531 26.432 -8.420 1.00 0.00 H +HETATM 1479 H2 HOH A 493 -8.078 26.677 -8.071 1.00 0.00 H +HETATM 1480 O HOH A 494 -10.838 -31.006 65.579 1.00 0.00 O +HETATM 1481 H1 HOH A 494 -11.660 -30.755 66.001 1.00 0.00 H +HETATM 1482 H2 HOH A 494 -10.968 -31.920 65.326 1.00 0.00 H +HETATM 1483 O HOH A 495 -1.391 -55.465 -35.826 1.00 0.00 O +HETATM 1484 H1 HOH A 495 -0.623 -54.898 -35.751 1.00 0.00 H +HETATM 1485 H2 HOH A 495 -2.030 -54.939 -36.307 1.00 0.00 H +HETATM 1486 O HOH A 496 -43.789 -6.314 3.351 1.00 0.00 O +HETATM 1487 H1 HOH A 496 -43.047 -6.706 2.892 1.00 0.00 H +HETATM 1488 H2 HOH A 496 -43.608 -6.471 4.278 1.00 0.00 H +HETATM 1489 O HOH A 497 -66.391 19.733 21.881 1.00 0.00 O +HETATM 1490 H1 HOH A 497 -66.930 20.217 22.508 1.00 0.00 H +HETATM 1491 H2 HOH A 497 -66.890 19.761 21.065 1.00 0.00 H +HETATM 1492 O HOH A 498 -1.129 17.001 -80.601 1.00 0.00 O +HETATM 1493 H1 HOH A 498 -1.877 17.597 -80.623 1.00 0.00 H +HETATM 1494 H2 HOH A 498 -1.459 16.186 -80.978 1.00 0.00 H +HETATM 1495 O HOH A 499 -1.525 -74.301 69.103 1.00 0.00 O +HETATM 1496 H1 HOH A 499 -1.187 -73.974 69.937 1.00 0.00 H +HETATM 1497 H2 HOH A 499 -2.458 -74.089 69.123 1.00 0.00 H +HETATM 1498 O HOH A 500 -23.068 0.103 7.831 1.00 0.00 O +HETATM 1499 H1 HOH A 500 -24.011 0.131 7.671 1.00 0.00 H +HETATM 1500 H2 HOH A 500 -22.739 0.928 7.474 1.00 0.00 H +HETATM 1501 O HOH A 501 -13.715 -6.499 18.414 1.00 0.00 O +HETATM 1502 H1 HOH A 501 -13.246 -5.743 18.060 1.00 0.00 H +HETATM 1503 H2 HOH A 501 -13.973 -6.230 19.295 1.00 0.00 H +TER 1504 HOH A 501 +END diff --git a/tests/data/solvent_radial_distribution/CCl4_molecule_indices.npy b/tests/data/solvent_radial_distribution/CCl4_molecule_indices.npy new file mode 100644 index 00000000..07f37e11 Binary files /dev/null and b/tests/data/solvent_radial_distribution/CCl4_molecule_indices.npy differ diff --git a/tests/data/solvent_radial_distribution/acetonitrile_molecule_indices.npy b/tests/data/solvent_radial_distribution/acetonitrile_molecule_indices.npy new file mode 100644 index 00000000..29fad1c0 Binary files /dev/null and b/tests/data/solvent_radial_distribution/acetonitrile_molecule_indices.npy differ diff --git a/tests/data/solvent_radial_distribution/methanol_molecule_indices.npy b/tests/data/solvent_radial_distribution/methanol_molecule_indices.npy new file mode 100644 index 00000000..5abd8bf0 Binary files /dev/null and b/tests/data/solvent_radial_distribution/methanol_molecule_indices.npy differ diff --git a/tests/data/water_radial_distribution/water_box_n500_molecule_indices.npy b/tests/data/water_radial_distribution/water_box_n500_molecule_indices.npy new file mode 100644 index 00000000..b03b57ae Binary files /dev/null and b/tests/data/water_radial_distribution/water_box_n500_molecule_indices.npy differ diff --git a/tests/nve_energy_conservation/test_nve_energy_conservation.py b/tests/nve_energy_conservation/test_nve_energy_conservation.py new file mode 100644 index 00000000..93ebe4a9 --- /dev/null +++ b/tests/nve_energy_conservation/test_nve_energy_conservation.py @@ -0,0 +1,199 @@ +# Copyright 2025 InstaDeep Ltd +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from pathlib import Path +from unittest.mock import MagicMock, patch + +import numpy as np +import pytest +from ase.symbols import symbols2numbers +from mlip.models import ForceField +from mlip.simulation import SimulationState +from mlip.simulation.enums import MDIntegrator + +from mlipaudit.benchmarks.nve_energy_conservation.nve_energy_conservation import ( + SYSTEMS_BY_NAME, + NVEEnergyConservationBenchmark, + NVEEnergyConservationResult, +) +from mlipaudit.run_mode import RunMode + +DATA_DIR = Path(__file__).parent.parent / "data" + +# `run_simulation` is imported into the benchmark module's namespace, so patch it there. +RUN_SIMULATION_PATH = ( + "mlipaudit.benchmarks.nve_energy_conservation." + "nve_energy_conservation.run_simulation" +) + + +@pytest.fixture +def nve_benchmark( + mocked_benchmark_init, # prevents the HuggingFace data download + mock_force_field, # mock force field supporting H, C, N, O, ... +) -> NVEEnergyConservationBenchmark: + """Assemble an isolated NVE benchmark in dev mode (vacuum system only). + + Returns: + An initialized NVEEnergyConservationBenchmark instance. + """ + return NVEEnergyConservationBenchmark( + force_field=mock_force_field, + data_input_dir=DATA_DIR, + run_mode=RunMode.DEV, + ) + + +def test_analyze_raises_if_run_model_not_called(nve_benchmark): + """analyze() must fail if called before run_model().""" + with pytest.raises(RuntimeError): + nve_benchmark.analyze() + + +def test_full_run_dev_with_mocked_simulation(nve_benchmark): + """A dev run loads the vacuum system, runs NVE MD and analyzes it.""" + num_frames = 11 + kinetic = np.linspace(1.0, 1.2, num_frames) + potential = np.linspace(-5.0, -5.2, num_frames) + state = SimulationState( + atomic_numbers=np.array([1, 6, 7, 8]), + kinetic_energy=kinetic, + potential_energy=potential, + ) + + with patch(RUN_SIMULATION_PATH, return_value=state) as mock_run_simulation: + nve_benchmark.run_model() + + # A single (vacuum) system is run in dev mode, with the NVE integrator. + assert mock_run_simulation.call_count == 1 + _, kwargs = mock_run_simulation.call_args + assert kwargs["md_integrator"] == MDIntegrator.NVE_VELOCITY_VERLET + assert "box" not in kwargs # vacuum system has no periodic box + + output = nve_benchmark.model_output + assert output.structure_names == ["Small_molecule_HCNO"] + assert output.n_skipped_unallowed_elements == 0 + assert len(output.times_ps[0]) == num_frames + assert len(output.potential_energies_ev[0]) == num_frames + assert len(output.kinetic_energies_ev[0]) == num_frames + + result = nve_benchmark.analyze() + assert isinstance(result, NVEEnergyConservationResult) + assert not result.failed + assert len(result.structure_results) == 1 + structure_result = result.structure_results[0] + assert not structure_result.skipped + assert not structure_result.failed + assert structure_result.score is not None + assert result.score is not None + + +def test_failed_simulation_is_recorded(nve_benchmark): + """A failed simulation (None) yields a failed system that scores 0.0. + + The overall result is not flagged ``failed`` because a failed (non-skipped) + system still contributes a valid score of 0.0; the ``failed`` flag is reserved + for the case where no system produces a score at all. + """ + with patch(RUN_SIMULATION_PATH, return_value=None): + nve_benchmark.run_model() + + output = nve_benchmark.model_output + assert output.times_ps[0] is None + assert output.potential_energies_ev[0] is None + + result = nve_benchmark.analyze() + assert not result.failed + assert result.score == pytest.approx(0.0) + assert result.structure_results[0].failed + assert result.structure_results[0].score == pytest.approx(0.0) + + +def test_skips_systems_with_unallowed_elements(mocked_benchmark_init): + """Systems whose elements the model cannot handle are skipped, not simulated.""" + force_field = MagicMock(spec=ForceField) + # No carbon: the vacuum HCNO system cannot be simulated. + force_field.allowed_atomic_numbers = symbols2numbers({"H", "N", "O"}) + + benchmark = NVEEnergyConservationBenchmark( + force_field=force_field, + data_input_dir=DATA_DIR, + run_mode=RunMode.DEV, + ) + + with patch(RUN_SIMULATION_PATH) as mock_run_simulation: + benchmark.run_model() + + mock_run_simulation.assert_not_called() + output = benchmark.model_output + assert output.skipped_structures == ["Small_molecule_HCNO"] + assert output.n_skipped_unallowed_elements == 1 + + result = benchmark.analyze() + assert result.failed # every (selected) system was skipped + assert result.n_skipped_unallowed_elements == 1 + assert result.structure_results[0].skipped + + +def test_analyze_structure_conserved_energy_scores_high(nve_benchmark): + """A perfectly conserved trajectory (flat total energy) scores 1.0.""" + spec = SYSTEMS_BY_NAME["Small_molecule_HCNO"] + num_frames = 11 + times = (np.arange(num_frames) * 0.01).tolist() + kinetic = (1.0 + 0.1 * np.sin(np.arange(num_frames))).tolist() + # Choose the potential so the total energy is exactly constant. + potential = (-np.asarray(kinetic)).tolist() + + result = nve_benchmark._analyze_structure(spec, 4, times, potential, kinetic) + + assert not result.failed + assert result.total_drift_ev == pytest.approx(0.0, abs=1e-9) + assert result.energy_drift_ratio == pytest.approx(0.0, abs=1e-9) + assert result.score == pytest.approx(1.0) + + +def test_analyze_structure_drifting_energy_scores_low(nve_benchmark): + """A strongly drifting trajectory scores well below 1.0.""" + spec = SYSTEMS_BY_NAME["Small_molecule_HCNO"] + num_frames = 11 + times = np.arange(num_frames) * 0.01 + kinetic = 1.0 + 0.05 * np.sin(np.arange(num_frames)) # small fluctuation scale + total = 10.0 * times # large linear drift + potential = total - kinetic + + result = nve_benchmark._analyze_structure( + spec, 4, times.tolist(), potential.tolist(), kinetic.tolist() + ) + + assert not result.failed + assert result.drift_slope_ev_per_ps == pytest.approx(10.0, rel=1e-3) + assert result.energy_drift_ratio > 1.0 + assert result.score < 0.5 + + +@pytest.mark.parametrize( + "times, potential, kinetic", + [ + (None, None, None), # skipped / failed simulation + ([0.0], [1.0], [1.0]), # fewer than two points + ([0.0, 0.1, 0.2], [1.0, float("nan"), 1.0], [1.0, 1.0, 1.0]), # non-finite + ([0.0, 0.1, 0.2], [1.0, 2.0, 3.0], [1.0, 1.0, 1.0]), # zero KE fluctuation + ], +) +def test_analyze_structure_failure_cases(nve_benchmark, times, potential, kinetic): + """Degenerate trajectories are flagged as failed with a zero score.""" + spec = SYSTEMS_BY_NAME["Small_molecule_HCNO"] + result = nve_benchmark._analyze_structure(spec, 4, times, potential, kinetic) + assert result.failed + assert result.score == 0.0 diff --git a/tests/solvent_density/test_solvent_density.py b/tests/solvent_density/test_solvent_density.py new file mode 100644 index 00000000..87e95f9d --- /dev/null +++ b/tests/solvent_density/test_solvent_density.py @@ -0,0 +1,136 @@ +# Copyright 2025 InstaDeep Ltd +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import re +from pathlib import Path +from unittest.mock import patch + +import numpy as np +import pytest +from ase.io import read as ase_read +from mlip.simulation import SimulationState + +from mlipaudit.benchmarks import ( + SolventDensityBenchmark, + SolventDensityModelOutput, + SolventDensityResult, + SolventRadialDistributionBenchmark, + SolventRadialDistributionModelOutput, +) +from mlipaudit.benchmarks_cli import _transfer_model_output +from mlipaudit.run_mode import RunMode + +INPUT_DATA_DIR = Path(__file__).parent.parent / "data" +# The solvent density benchmark reuses the solvent RDF benchmark's input data. +SOLVENT_DATA_DIR = INPUT_DATA_DIR / "solvent_radial_distribution" + + +@pytest.fixture +def solvent_density_benchmark( + request, + mocked_benchmark_init, # Use the generic init mock + mock_force_field, # Use the generic force field mock +) -> SolventDensityBenchmark: + """Assembles a fully configured and isolated SolventDensityBenchmark instance. + + Returns: + An initialized SolventDensityBenchmark instance. + """ + is_fast_run = getattr(request, "param", False) + run_mode = RunMode.DEV if is_fast_run else RunMode.STANDARD + + return SolventDensityBenchmark( + force_field=mock_force_field, + data_input_dir=INPUT_DATA_DIR, + run_mode=run_mode, + ) + + +def _mock_ccl4_simulation_state() -> SimulationState: + """Build a stationary CCl4 trajectory from the equilibrated structure.""" + atoms = ase_read(SOLVENT_DATA_DIR / "CCl4_eq.pdb") + num_frames = 2 + positions = np.tile(np.array(atoms.positions), reps=(num_frames, 1, 1)) + cells = np.tile(np.array(atoms.get_cell()), reps=(num_frames, 1, 1)) + return SimulationState( + positions=positions, temperature=np.ones(num_frames), cell=cells + ) + + +def test_data_name_points_to_shared_data(solvent_density_benchmark): + """The density benchmark should read from the RDF benchmark's data directory.""" + assert solvent_density_benchmark.data_name == "solvent_radial_distribution" + assert solvent_density_benchmark.data_dir == SOLVENT_DATA_DIR + + +@pytest.mark.parametrize("solvent_density_benchmark", [True], indirect=True) +def test_full_run_with_mocked_engine( + solvent_density_benchmark, mock_jaxmd_simulation_engine +): + """Integration test testing a full run of the benchmark.""" + benchmark = solvent_density_benchmark + mock_engine = mock_jaxmd_simulation_engine() + with patch( + "mlipaudit.utils.simulation.JaxMDSimulationEngine", + return_value=mock_engine, + ) as mock_engine_class: + benchmark.run_model() + + assert mock_engine_class.call_count == 1 + assert isinstance(benchmark.model_output, SolventDensityModelOutput) + + benchmark.model_output = SolventDensityModelOutput( + structure_names=["CCl4"], + simulation_states=[_mock_ccl4_simulation_state()], + ) + + result = benchmark.analyze() + assert type(result) is SolventDensityResult + + assert len(result.structures) == 1 + assert result.structures[0].structure_name == "CCl4" + + # Target density = 1.594, initial density = 1.368 + assert 1.3 < result.structures[0].average_density < 1.6 + assert result.structures[0].density_deviation < 0.3 + assert 0.0 <= result.score <= 1.0 + + +def test_reuses_solvent_rdf_simulation_output(): + """The density benchmark must be able to reuse the RDF benchmark's model output. + + This mirrors the CLI reuse path in `benchmarks_cli.run_benchmarks`, where a + cached `ModelOutput` is transferred between benchmarks that share a + `reusable_output_id`. + """ + assert ( + SolventDensityBenchmark.reusable_output_id + == SolventRadialDistributionBenchmark.reusable_output_id + ) + + rdf_output = SolventRadialDistributionModelOutput( + structure_names=["CCl4"], + simulation_states=[_mock_ccl4_simulation_state()], + ) + transferred = _transfer_model_output(rdf_output, SolventDensityModelOutput) + + assert isinstance(transferred, SolventDensityModelOutput) + assert transferred.structure_names == ["CCl4"] + + +def test_analyze_raises_error_if_run_first(solvent_density_benchmark): + """Verifies the RuntimeError is raised when analyze is called first.""" + expected_message = "Must call run_model() first." + with pytest.raises(RuntimeError, match=re.escape(expected_message)): + solvent_density_benchmark.analyze() diff --git a/tests/solvent_radial_distribution/test_solvent_radial_distribution.py b/tests/solvent_radial_distribution/test_solvent_radial_distribution.py index 3f5f6b28..3bd2054d 100644 --- a/tests/solvent_radial_distribution/test_solvent_radial_distribution.py +++ b/tests/solvent_radial_distribution/test_solvent_radial_distribution.py @@ -73,15 +73,15 @@ def test_full_run_with_mocked_engine( atoms = ase_read(INPUT_DATA_DIR / benchmark.name / "CCl4_eq.pdb") num_frames = 2 - positions = np.tile( - np.array(atoms.positions), - reps=(num_frames, 1, 1), - ) + positions = np.tile(np.array(atoms.positions), reps=(num_frames, 1, 1)) + cells = np.tile(np.array(atoms.get_cell()), reps=(num_frames, 1, 1)) benchmark.model_output = SolventRadialDistributionModelOutput( structure_names=["CCl4"], simulation_states=[ - SimulationState(positions=positions, temperature=np.ones(10)) + SimulationState( + positions=positions, temperature=np.ones(num_frames), cell=cells + ) ], ) @@ -93,7 +93,6 @@ def test_full_run_with_mocked_engine( # Some leeway around the maximum of 5.9 assert 5.4 < result.structures[0].first_solvent_peak < 6.4 - assert result.structures[0].peak_deviation < 0.5 diff --git a/tests/test_ui_pages.py b/tests/test_ui_pages.py index 6570927b..559c0357 100644 --- a/tests/test_ui_pages.py +++ b/tests/test_ui_pages.py @@ -24,16 +24,22 @@ DihedralScanBenchmark, FoldingStabilityBenchmark, NoncovalentInteractionsBenchmark, + NVEEnergyConservationBenchmark, ReactivityBenchmark, ReferenceGeometryStabilityBenchmark, RingPlanarityBenchmark, SamplingBenchmark, ScalingBenchmark, + SolventDensityBenchmark, + SolventDensityResult, + SolventDensityStructureResult, SolventRadialDistributionBenchmark, SolventRadialDistributionResult, SolventRadialDistributionStructureResult, StabilityBenchmark, TautomersBenchmark, + WaterDensityBenchmark, + WaterDensityResult, WaterRadialDistributionBenchmark, ) from mlipaudit.benchmarks.bond_length_distribution.bond_length_distribution import ( @@ -63,14 +69,17 @@ folding_stability_page, leaderboard_page, noncovalent_interactions_page, + nve_energy_conservation_page, reactivity_page, reference_geometry_stability_page, ring_planarity_page, sampling_page, scaling_page, + solvent_density_page, solvent_radial_distribution_page, stability_page, tautomers_page, + water_density_page, water_radial_distribution_page, ) @@ -102,10 +111,12 @@ def _add_failed_molecule( elif benchmark_class in [ FoldingStabilityBenchmark, SamplingBenchmark, + SolventDensityBenchmark, SolventRadialDistributionBenchmark, StabilityBenchmark, ScalingBenchmark, NoncovalentInteractionsBenchmark, + NVEEnergyConservationBenchmark, ]: key_name = "structure_name" elif benchmark_class in [DihedralScanBenchmark]: @@ -121,6 +132,11 @@ def _add_failed_molecule( "num_steps": 1, "score": 0.0, }) + elif benchmark_class is NVEEnergyConservationBenchmark: + kwargs_for_failed.update({ + "description": "description", + "system_class": "vacuum", + }) elif benchmark_class is ScalingBenchmark: kwargs_for_failed.update({ "num_atoms": 10, @@ -214,6 +230,19 @@ def _add_failed_model(benchmark_class, model_results) -> dict[str, BenchmarkResu ) elif benchmark_class is WaterRadialDistributionBenchmark: model_results["model_3"] = WaterRadialDistributionResult(failed=True, score=0.0) + elif benchmark_class is SolventDensityBenchmark: + model_results["model_3"] = SolventDensityResult( + structure_names=["failed_mol"], + structures=[ + SolventDensityStructureResult( + structure_name="failed_mol", failed=True, score=0.0 + ) + ], + failed=True, + score=0.0, + ) + elif benchmark_class is WaterDensityBenchmark: + model_results["model_3"] = WaterDensityResult(failed=True, score=0.0) return model_results @@ -309,6 +338,7 @@ def data_func() -> BenchmarkResultForMultipleModels: # Manually add the score for the test if benchmark_class not in [ ScalingBenchmark, + SolventDensityBenchmark, SolventRadialDistributionBenchmark, ]: kwargs_for_result["score"] = 0.3 @@ -367,11 +397,14 @@ def _app_script(page_func, data_func, scores, is_public): (BondLengthDistributionBenchmark, bond_length_distribution_page), (FoldingStabilityBenchmark, folding_stability_page), (NoncovalentInteractionsBenchmark, noncovalent_interactions_page), + (NVEEnergyConservationBenchmark, nve_energy_conservation_page), (ReferenceGeometryStabilityBenchmark, reference_geometry_stability_page), (SolventRadialDistributionBenchmark, solvent_radial_distribution_page), + (SolventDensityBenchmark, solvent_density_page), (StabilityBenchmark, stability_page), (TautomersBenchmark, tautomers_page), (WaterRadialDistributionBenchmark, water_radial_distribution_page), + (WaterDensityBenchmark, water_density_page), (ScalingBenchmark, scaling_page), (SamplingBenchmark, sampling_page), (DihedralScanBenchmark, dihedral_scan_page), diff --git a/tests/water_density/test_water_density.py b/tests/water_density/test_water_density.py new file mode 100644 index 00000000..13797b6c --- /dev/null +++ b/tests/water_density/test_water_density.py @@ -0,0 +1,133 @@ +# Copyright 2025 InstaDeep Ltd +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import re +from pathlib import Path +from unittest.mock import patch + +import numpy as np +import pytest +from mlip.simulation import SimulationState + +from mlipaudit.benchmarks import ( + WaterDensityBenchmark, + WaterDensityModelOutput, + WaterDensityResult, + WaterRadialDistributionBenchmark, + WaterRadialDistributionModelOutput, +) +from mlipaudit.benchmarks_cli import _transfer_model_output +from mlipaudit.run_mode import RunMode + +INPUT_DATA_DIR = Path(__file__).parent.parent / "data" +# The water density benchmark reuses the water RDF benchmark's input data. +WATER_DATA_DIR = INPUT_DATA_DIR / "water_radial_distribution" + + +@pytest.fixture +def water_density_benchmark( + request, + mocked_benchmark_init, # Use the generic init mock + mock_force_field, # Use the generic force field mock +) -> WaterDensityBenchmark: + """Assembles a fully configured and isolated WaterDensityBenchmark instance. + + Returns: + An initialized WaterDensityBenchmark instance. + """ + is_fast_run = getattr(request, "param", False) + run_mode = RunMode.DEV if is_fast_run else RunMode.STANDARD + + return WaterDensityBenchmark( + force_field=mock_force_field, + data_input_dir=INPUT_DATA_DIR, + run_mode=run_mode, + ) + + +def _mock_simulation_state() -> SimulationState: + """Build a stationary water box trajectory with a fixed 24.772 Å box.""" + num_frames = 2 + positions = np.tile( + np.load(WATER_DATA_DIR / "positions.npy"), + reps=(num_frames, 1, 1), + ) + cells = np.tile(24.772 * np.eye(3), reps=(num_frames, 1, 1)) + return SimulationState( + positions=positions, temperature=np.ones(num_frames), cell=cells + ) + + +def test_data_name_points_to_shared_data(water_density_benchmark): + """The density benchmark should read from the RDF benchmark's data directory.""" + assert water_density_benchmark.data_name == "water_radial_distribution" + assert water_density_benchmark.data_dir == WATER_DATA_DIR + + +@pytest.mark.parametrize("water_density_benchmark", [True, False], indirect=True) +def test_full_run_with_mocked_engine( + water_density_benchmark, mock_jaxmd_simulation_engine +): + """Integration test testing a full run of the benchmark.""" + benchmark = water_density_benchmark + mock_engine = mock_jaxmd_simulation_engine() + with patch( + "mlipaudit.utils.simulation.JaxMDSimulationEngine", + return_value=mock_engine, + ) as mock_engine_class: + benchmark.run_model() + + assert mock_engine_class.call_count == 1 + assert isinstance(benchmark.model_output, WaterDensityModelOutput) + + benchmark.model_output = WaterDensityModelOutput( + simulation_state=_mock_simulation_state() + ) + + result = benchmark.analyze() + assert type(result) is WaterDensityResult + + # Target density = 0.997773, initial density = 0.9859266 + assert 0.9 < result.average_density < 1.1 + assert result.density_deviation < 0.1 + assert 0.0 <= result.score <= 1.0 + + +def test_reuses_water_rdf_simulation_output(): + """The density benchmark must be able to reuse the RDF benchmark's model output. + + This mirrors the CLI reuse path in `benchmarks_cli.run_benchmarks`, where a + cached `ModelOutput` is transferred between benchmarks that share a + `reusable_output_id`. + """ + assert ( + WaterDensityBenchmark.reusable_output_id + == WaterRadialDistributionBenchmark.reusable_output_id + ) + + rdf_output = WaterRadialDistributionModelOutput( + simulation_state=_mock_simulation_state(), failed=False + ) + transferred = _transfer_model_output(rdf_output, WaterDensityModelOutput) + + assert isinstance(transferred, WaterDensityModelOutput) + assert transferred.simulation_state is rdf_output.simulation_state + assert transferred.failed is False + + +def test_analyze_raises_error_if_run_first(water_density_benchmark): + """Verifies the RuntimeError is raised when analyze is called first.""" + expected_message = "Must call run_model() first." + with pytest.raises(RuntimeError, match=re.escape(expected_message)): + water_density_benchmark.analyze() diff --git a/tests/water_radial_distribution/test_water_radial_distribution.py b/tests/water_radial_distribution/test_water_radial_distribution.py index c60045e1..f3a9e473 100644 --- a/tests/water_radial_distribution/test_water_radial_distribution.py +++ b/tests/water_radial_distribution/test_water_radial_distribution.py @@ -77,10 +77,11 @@ def test_full_run_with_mocked_engine( np.load(INPUT_DATA_DIR / benchmark.name / "positions.npy"), reps=(num_frames, 1, 1), ) + cells = np.tile(24.772 * np.eye(3), reps=(num_frames, 1, 1)) benchmark.model_output = WaterRadialDistributionModelOutput( simulation_state=SimulationState( - positions=positions, temperature=np.ones(10) + positions=positions, temperature=np.ones(num_frames), cell=cells ) )