From 4050eaf54afc87c180c01a988836a45490ec5bd7 Mon Sep 17 00:00:00 2001 From: ndlevinzon Date: Mon, 31 Aug 2026 14:39:08 -0600 Subject: [PATCH 01/33] Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab - Introduced the 'surftension' command with detailed options for calculating surface tension based on height fluctuations. - Updated ChangeLog to reflect the new command and its usage. - Registered the command in Command.cpp and included necessary source and header files. - Added a test target for 'surftension' in the Makefile and included it in the complete tests list. - Bumped version to 7.11.0 to signify the addition of this new functionality. --- doc/ChangeLog.surftension.md | 13 + doc/ChangeLog.v7.md | 16 + src/Action_SurfaceTension.cpp | 624 +++++++++++++++++++++++++++++++ src/Action_SurfaceTension.h | 109 ++++++ src/Command.cpp | 3 + src/Version.h | 4 + test/Test_SurfTension/RunTest.sh | 74 ++++ 7 files changed, 843 insertions(+) diff --git a/doc/ChangeLog.surftension.md b/doc/ChangeLog.surftension.md index 6f8064da50..a34296c785 100644 --- a/doc/ChangeLog.surftension.md +++ b/doc/ChangeLog.surftension.md @@ -14,16 +14,26 @@ Working log for the capillary-wave surface-tension Action. New command `surftension` added under New Commands. Internal version `V7.11.0`. ``` +<<<<<<< HEAD surftension [] [mask2 ] temp [normal {x|y|z}] [nsurf {1|2}] [side {upper|lower}] [interface {willard|itim}] +======= +surftension [] temp + [normal {x|y|z}] [interface {willard|itim}] +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) [gridspacing ] [dz | dnormal ] [sigmaxy ] [sigmaz | sigmanormal ] [bulkhalfwidth ] [threshold ] [qmin ] [qmax ] [lx ] [ly ] [lz ] +<<<<<<< HEAD [nblock ] [dt ] [blocktime ] [out | spectrumout ] [roughout ] [blockout ] [summaryout ] +======= + [nblock ] + [spectrumout ] [roughout ] [blockout ] +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) [spectrumagr ] [roughagr ] [blockagr ] [spectrumgnu ] [roughgnu ] [blockgnu ] ``` @@ -84,6 +94,7 @@ surftension [] [mask2 ] temp `sigmanormal` ≡ `sigmaz` (error if both given and they differ). Init/Print report e.g. `Slab normal: z (interface plane x-y)`. Warns on non-orthogonal boxes. +<<<<<<< HEAD - Height-field 2-D FFT uses cpptraj `PubFFT` (row-column 1-D FFTs), then divides by `nx*ny` (numpy `fft2` convention). Same `S(q)` as the old direct DFT. Per-block γ/κ print in `Print()`, not during the frame loop. @@ -101,6 +112,8 @@ surftension [] [mask2 ] temp - `out` is an alias for `spectrumout`. Init now errors if an `*out` path names a directory that does not exist (DataFiles are opened only after `run`, which previously lost a full trajectory write). +======= +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) --- diff --git a/doc/ChangeLog.v7.md b/doc/ChangeLog.v7.md index 805ea3fb40..082bdc4350 100644 --- a/doc/ChangeLog.v7.md +++ b/doc/ChangeLog.v7.md @@ -19,6 +19,7 @@ New Commands plateau of q²⟨|h_q|²⟩. κ (kT) is the Helfrich slope of 1/(q² S) vs q². `normal {x|y|z}` selects the slab normal (default z). `interface {willard|itim}` selects a Willard-Chandler density isosurface (default) or ITIM per-column min/max. +<<<<<<< HEAD Default is two interfaces (e.g. a water slab with vacuum at +z and −z). `nsurf 1` with `side {upper|lower}` is a single interface. `mask2` supplies a second atom set for the lower surface (leaflet / liquid–liquid). Lateral lengths come from @@ -34,13 +35,28 @@ New Commands surftension [] [mask2 ] temp [normal {x|y|z}] [nsurf {1|2}] [side {upper|lower}] [interface {willard|itim}] +======= + Optional outputs (`spectrumout`, `roughout`, `blockout`) follow the filename extension + (`.agr`/`.xmgr` = xmgrace, `.gnu` = gnuplot). Dedicated `*agr`/`*gnu` + keywords force Grace or gnuplot. MPI-parallel (packed + spectral SUM to the master). Assumes NVT (fixed lateral box lengths). + +``` +surftension [] temp + [normal {x|y|z}] [interface {willard|itim}] +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) [gridspacing ] [dz | dnormal ] [sigmaxy ] [sigmaz | sigmanormal ] [bulkhalfwidth ] [threshold ] [qmin ] [qmax ] [lx ] [ly ] [lz ] +<<<<<<< HEAD [nblock ] [dt ] [blocktime ] [fprefix ] [out | spectrumout ] [roughout ] [blockout ] [summaryout ] +======= + [nblock ] + [spectrumout ] [roughout ] [blockout ] +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) [spectrumagr ] [roughagr ] [blockagr ] [spectrumgnu ] [roughgnu ] [blockgnu ] ``` diff --git a/src/Action_SurfaceTension.cpp b/src/Action_SurfaceTension.cpp index 703dd8c2e6..be45d52d9a 100644 --- a/src/Action_SurfaceTension.cpp +++ b/src/Action_SurfaceTension.cpp @@ -1,5 +1,6 @@ // Action_SurfaceTension // Capillary-wave surface tension of a liquid slab (Cartesian normal x, y, or z). +<<<<<<< HEAD // Formulae, units, and references: Action_SurfaceTension.h // // Per-frame pipeline (after Init / Setup): @@ -14,11 +15,18 @@ // // NVT: first good frame freezes N₁, N₂, L₁, L₂ (and N_n for Willard). // \author Nathan D. Levinzon +======= +// See Action_SurfaceTension.h for the physical formulae. +// \author Nathan D Levinzon +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) #include #include #include #include +<<<<<<< HEAD #include +======= +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) #include #include "Action_SurfaceTension.h" #include "Constants.h" @@ -26,8 +34,11 @@ #include "DataFile.h" #include "DataSet_1D.h" #include "DataSet_Mesh.h" +<<<<<<< HEAD #include "CpptrajFile.h" #include "FileName.h" +======= +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) #include "Frame.h" #ifdef _OPENMP # include @@ -36,6 +47,7 @@ // File-local helpers. Names are prefixed ST_ so they do not collide with // other Action translation units. +<<<<<<< HEAD /// k_B (J/K), CODATA 2018. γ uses SI: k_B T / (A_m² ⟨q² S⟩), then ×1000 → mN/m. static const double ST_KB = 1.380649e-23; /// Ų → m² so A in the CWT formula is consistent with γ in N/m. @@ -44,6 +56,16 @@ static const double ST_ANG2_TO_M2 = 1.0e-20; static const double ST_GAUSS_TRUNCATE = 4.0; /// \return true if x is finite (not NaN or ±Inf). Used to reject failed crossings. +======= +/// Boltzmann constant (J/K); SI, matching the reference Python analysis. +static const double ST_KB = 1.380649e-23; +/// Convert Ų → m². +static const double ST_ANG2_TO_M2 = 1.0e-20; +/// scipy.ndimage.gaussian_filter default truncate (kernel radius = truncate × σ). +static const double ST_GAUSS_TRUNCATE = 4.0; + +/// \return true if x is finite (not NaN or ±Inf). +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) static inline bool ST_Finite(double x) { return (x == x) && (x < std::numeric_limits::infinity()) && @@ -54,12 +76,20 @@ static inline double ST_NaN() { return std::numeric_limits::quiet_NaN(); } +<<<<<<< HEAD /// Linear index of ρ(i₁, i₂, i_n) with the normal the fastest dimension. +======= +/// Linear index of density_(ix, iy, iz) with z the fastest dimension. +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) static inline size_t ST_Idx3(int ix, int iy, int iz, int ny, int nz) { return ((size_t)ix * (size_t)ny + (size_t)iy) * (size_t)nz + (size_t)iz; } +<<<<<<< HEAD /// Linear index of an N₁×N₂ field, row-major in the first lateral index. +======= +/// Linear index of an nx×ny field stored row-major in x, then y. +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) static inline size_t ST_Idx2(int ix, int iy, int ny) { return (size_t)ix * (size_t)ny + (size_t)iy; } @@ -69,10 +99,14 @@ static inline int ST_IRound(double x) { return (int)floor(x + 0.5); } +<<<<<<< HEAD /** Minimum-image wrap of a Cartesian coordinate into [0, L). * fmod of a negative argument is negative on IEEE-754; that case is lifted * back into the interval. x == L maps to 0 so the last bin is not empty. */ +======= +/** Wrap x into [0, L). Handles negative values; maps x == L back to 0. */ +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) static double ST_Wrap(double x, double L) { if (L <= 0.0) return x; double y = fmod(x, L); @@ -81,6 +115,7 @@ static double ST_Wrap(double x, double L) { return y; } +<<<<<<< HEAD /** Circular mean of the film along the periodic normal, in Å. * Map n → θ = 2π n / L_n and take atan2(⟨sin θ⟩, ⟨cos θ⟩). A slab that * straddles n = 0 is then a single cluster on the circle. n2 may be 0; @@ -123,10 +158,31 @@ static void ST_ApplyCircularRecenter(std::vector& n, double L, double slab_center) { if (n.empty() || L <= 0.0) return; +======= +/** Recenter a periodic slab so its circular mean along the normal lies at L/2. + * Mapping n → θ = 2π n / L, then using atan2(⟨sin θ⟩, ⟨cos θ⟩), avoids + * failure when the slab straddles the periodic boundary. + */ +static void ST_CircularRecenter(std::vector& n, double L) { + if (n.empty() || L <= 0.0) return; + double mean_sin = 0.0; + double mean_cos = 0.0; + for (size_t i = 0; i < n.size(); i++) { + double theta = Constants::TWOPI * ST_Wrap(n[i], L) / L; + mean_sin += sin(theta); + mean_cos += cos(theta); + } + mean_sin /= (double)n.size(); + mean_cos /= (double)n.size(); + double angle = atan2(mean_sin, mean_cos); + if (angle < 0.0) angle += Constants::TWOPI; + double slab_center = L * angle / Constants::TWOPI; +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) for (size_t i = 0; i < n.size(); i++) n[i] = ST_Wrap(n[i] - slab_center + 0.5 * L, L); } +<<<<<<< HEAD /** Recenter one atom set so its circular mean along the normal lies at L_n/2. */ static void ST_CircularRecenter(std::vector& n, double L) { if (n.empty() || L <= 0.0) return; @@ -134,24 +190,35 @@ static void ST_CircularRecenter(std::vector& n, double L) { } /// ASCII name of a Cartesian axis for Help / mprintf (terminals are not UTF-8). +======= +/// Cartesian axis name for Help / mprintf (ASCII). +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) static const char* ST_AxisName(int axis) { if (axis == 0) return "x"; if (axis == 1) return "y"; return "z"; } +<<<<<<< HEAD /// Names of the two lateral axes for Cartesian normal ∈ {0,1,2} = {x,y,z}. +======= +/// Lateral axis names for a given Cartesian normal. +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) static void ST_PlaneAxes(int normal, const char*& t1, const char*& t2) { if (normal == 0) { t1 = "y"; t2 = "z"; } else if (normal == 1) { t1 = "x"; t2 = "z"; } else { t1 = "x"; t2 = "y"; } } +<<<<<<< HEAD /** Permute (L_x, L_y, L_z) into (L₁, L₂, L_n). * n = z: L₁ = L_x, L₂ = L_y, L_n = L_z * n = y: L₁ = L_x, L₂ = L_z, L_n = L_y * n = x: L₁ = L_y, L₂ = L_z, L_n = L_x */ +======= +/// Split Cartesian box lengths into lateral 1, lateral 2, and normal. +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) static void ST_SplitBox(int normal, double Lx, double Ly, double Lz, double& Lt1, double& Lt2, double& Ln) { @@ -160,7 +227,11 @@ static void ST_SplitBox(int normal, double Lx, double Ly, double Lz, else { Lt1 = Lx; Lt2 = Ly; Ln = Lz; } } +<<<<<<< HEAD /// Same permutation as ST_SplitBox, applied to one Cartesian point. +======= +/// Split a Cartesian point into lateral 1, lateral 2, and normal. +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) static void ST_SplitXYZ(int normal, double x, double y, double z, double& t1, double& t2, double& n) { @@ -169,10 +240,15 @@ static void ST_SplitXYZ(int normal, double x, double y, double z, else { t1 = x; t2 = y; n = z; } } +<<<<<<< HEAD /** Normalized 1-D Gaussian matching scipy.ndimage._gaussian_kernel1d. * σ is in pixels (Å / bin width). Radius = round(4 σ). Weights are * K_i = exp(−i² / (2 σ²)) / Σ_j K_j , i ∈ [−R, R] * An empty kernel (σ ≤ 0) means that axis is left unfiltered. +======= +/** Normalized 1-D Gaussian kernel matching scipy.ndimage._gaussian_kernel1d. + * σ is in pixels. Radius = round(4 σ). Empty kernel means “do not filter”. +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) */ static void ST_GaussianKernel(double sigma, std::vector& kernel) { kernel.clear(); @@ -193,8 +269,13 @@ static void ST_GaussianKernel(double sigma, std::vector& kernel) { } } +<<<<<<< HEAD /** Periodic 1-D convolution, out[i] = Σ_k K_k in[(i+k) mod N]. * The Gaussian is even, so convolution and correlation are identical. +======= +/** 1-D convolution with periodic (wrap) boundaries. + * The Gaussian kernel is symmetric, so correlate and convolve agree. +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) */ static void ST_ConvolveWrap(std::vector const& in, std::vector const& kernel, std::vector& out) @@ -220,10 +301,17 @@ static void ST_ConvolveWrap(std::vector const& in, std::vector c } } +<<<<<<< HEAD /** Separable periodic Gaussian on ρ(i₁, i₂, i_n), Willard–Chandler coarse-graining. * σ_α in pixels (Å / Δ_α), same as scipy.ndimage.gaussian_filter. Three * 1-D passes (n, then t2, then t1). OpenMP: each line in a pass is * independent; one parallel region reuses thread-local buffers. +======= +/** Separable Gaussian smooth of ρ(ix,iy,iz) with periodic boundaries on every axis. + * σx, σy, σz are in pixels (Å / bin width), as in scipy.ndimage.gaussian_filter. + * OpenMP: each 1-D line in a pass is independent. One parallel region covers + * the z, y, and x passes so thread-local line buffers are reused. +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) */ static void ST_GaussianFilter3D(std::vector& rho, int nx, int ny, int nz, double sigma_x, double sigma_y, double sigma_z) @@ -294,12 +382,19 @@ static void ST_GaussianFilter3D(std::vector& rho, int nx, int ny, int nz } } +<<<<<<< HEAD /** Willard–Chandler crossing along one lateral column. * Walk from the slab mid-plane toward +n (upper) or −n (lower). The * interface is the first point where ρ drops through θ ρ_bulk, with θ * the threshold fraction. Linear interpolation between the two bins: * n* = n_k + (θ ρ_bulk − ρ_k) (n_{k±1} − n_k) / (ρ_{k±1} − ρ_k) * \return NaN if no crossing exists (caller skips the frame). +======= +/** Locate the instantaneous interface along one lateral column. + * Walks from the slab center toward +n (upper) or -n (lower) and returns the + * linearly interpolated normal coordinate where rho crosses the bulk-density + * threshold. \return NaN if no crossing is found. +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) */ static double ST_FindCrossing(std::vector const& z_grid, std::vector const& density, @@ -332,19 +427,29 @@ static double ST_FindCrossing(std::vector const& z_grid, return ST_NaN(); } +<<<<<<< HEAD /** ITIM in the probe → 0 limit, after the film has been recentered at L_n/2. * Each lateral column is split at mid-box: * h_upper = max { n_i | n_i ≥ L_n/2 } (need_u) * h_lower = min { n_i | n_i < L_n/2 } (need_l) * An empty required half-column returns false (skip the frame). This is * not a finite-radius ITIM probe; it is the min/max of the mask. +======= +/** ITIM-style slab interfaces after circular recentering at Ln/2. + * In each lateral column: upper = max n of atoms with n >= Ln/2, lower = min n + * of atoms with n < Ln/2. Empty half-columns return false. + * t1/t2/n are lateral 1, lateral 2, and the slab normal. +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) */ static bool ST_ItimMinMax(std::vector const& t1, std::vector const& t2, std::vector const& n, int natom, double Lt1, double Lt2, double Ln, int nx, int ny, +<<<<<<< HEAD bool need_u, bool need_l, +======= +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) std::vector& h_upper, std::vector& h_lower) { @@ -372,6 +477,7 @@ static bool ST_ItimMinMax(std::vector const& t1, } } for (size_t i = 0; i < n2; i++) { +<<<<<<< HEAD if (need_u && !has_u[i]) return false; if (need_l && !has_l[i]) return false; if (need_u) h_upper[i] = zmax[i]; @@ -427,6 +533,8 @@ static bool ST_ItimTwoMasks(std::vector const& t1u, has_l[idx] = 1; } for (size_t i = 0; i < n2; i++) { +======= +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) if (!has_u[i] || !has_l[i]) return false; h_upper[i] = zmax[i]; h_lower[i] = zmin[i]; @@ -434,6 +542,7 @@ static bool ST_ItimTwoMasks(std::vector const& t1u, return true; } +<<<<<<< HEAD /** Extract (t1, t2, n) for one mask. Laterals are wrapped into [0, L_α); * the normal is left unshifted. Recenter is applied afterwards so two * masks can share one circular mean. @@ -464,6 +573,9 @@ static void ST_SplitAtomCoords(Frame const& frm, AtomMask const& mask, int nax, * Volume is L₁ L₂ (2w). Used for the rhobulk DataSet on the ITIM path; * Willard–Chandler ρ_bulk is the laterally averaged coarse-grained field. */ +======= +/** Number density of mask atoms with |n - Ln/2| <= bulk_halfwidth (Ang^-3). */ +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) static double ST_RhoBulkFromAtoms(std::vector const& ncoord, int natom, double Lt1, double Lt2, double Ln, double bulk_halfwidth) @@ -479,10 +591,14 @@ static double ST_RhoBulkFromAtoms(std::vector const& ncoord, int natom, return (double)nbulk / vol; } +<<<<<<< HEAD /** Capillary roughness of one instantaneous surface, in Å: * w = √⟨ (h − ⟨h⟩)² ⟩_{i₁,i₂} * the RMS of the same field whose DFT gives S(q). */ +======= +/** RMS height fluctuation w = √⟨(h − ⟨h⟩)²⟩_xy (Å). */ +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) static double ST_RMS(std::vector const& h) { if (h.empty()) return ST_NaN(); double mean = 0.0; @@ -497,9 +613,14 @@ static double ST_RMS(std::vector const& h) { return sqrt(acc / (double)h.size()); } +<<<<<<< HEAD /** Cyclic frequency of DFT bin k on an N-point grid of spacing Δ (Å). * Mode index n ∈ (−N/2, N/2]; frequency is n / (N Δ) = n / L_α. * Wavevector component is then q_α = 2π n / L_α (Å⁻¹). +======= +/** Sample frequencies, identical to numpy.fft.fftfreq(n, d)[k]. + * d is the real-space sample spacing (Å). Result is in Å⁻¹. +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) */ static double ST_FftFreq(int k, int n, double d) { int p; @@ -510,7 +631,55 @@ static double ST_FftFreq(int k, int n, double d) { return (double)p / ((double)n * d); } +<<<<<<< HEAD /** |q| = √(q₁² + q₂²) on the N₁×N₂ Fourier mesh, q_α = 2π n_α / L_α. */ +======= +/** 2-D power spectrum of a height field. + * Subtract ⟨h⟩ (q = 0 translation), then + * h_q = (1 / N) Σ h(x,y) exp(−i q · r) N = nx ny + * which matches numpy.fft.fft2(h) / h.size. Power is |h_q|² (Ų). + * Direct DFT is used so nx, ny need not be powers of two. + * OpenMP: each (kx, ky) mode is independent; the loop is flattened so it + * does not need collapse() (OpenMP 3.0), matching other cpptraj Actions. + */ +static void ST_HeightPower(std::vector const& h, int nx, int ny, + std::vector& power) +{ + int nxy = nx * ny; + power.assign((size_t)nxy, 0.0); + if (nxy == 0) return; + double mean = 0.0; + for (int i = 0; i < nxy; i++) + mean += h[i]; + mean /= (double)nxy; + double Ninv = 1.0 / (double)nxy; + int k; +# ifdef _OPENMP +# pragma omp parallel for schedule(dynamic) +# endif + for (k = 0; k < nxy; k++) { + int kx = k / ny; + int ky = k - kx * ny; + double re = 0.0; + double im = 0.0; + for (int ix = 0; ix < nx; ix++) { + for (int iy = 0; iy < ny; iy++) { + double hv = h[ST_Idx2(ix, iy, ny)] - mean; + double ang = Constants::TWOPI * + ((double)kx * (double)ix / (double)nx + + (double)ky * (double)iy / (double)ny); + re += hv * cos(ang); + im -= hv * sin(ang); + } + } + re *= Ninv; + im *= Ninv; + power[k] = re * re + im * im; + } +} + +/** |q| = √(qx² + qy²) for each Fourier mode, qx = 2π fftfreq(nx, Lx/nx). */ +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) static void ST_MakeQGrid(int nx, int ny, double Lx, double Ly, std::vector& q) { q.resize((size_t)nx * (size_t)ny); double dx = Lx / (double)nx; @@ -524,6 +693,7 @@ static void ST_MakeQGrid(int nx, int ny, double Lx, double Ly, std::vector>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) }; /// Sort shells by increasing |q|. @@ -538,10 +717,15 @@ static bool ST_ShellQCmp(ST_Shell const& a, ST_Shell const& b) { return a.q < b.q; } +<<<<<<< HEAD /** Isotropic shell average of the 2-D spectrum. * Modes with the same q² rounded to 10 decimal places (numpy / pandas * round(q², 10)) are one shell. The q = 0 (mean-height) mode is dropped. * Each shell stores the mean |q| and the mean of S, S_upper, S_lower. +======= +/** Isotropic shell average: group modes with the same q² (10 decimal places), + * as in pandas round(q², decimals=10). q = 0 is dropped. +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) */ static void ST_ShellAverage(std::vector const& q, std::vector const& combined, @@ -581,6 +765,7 @@ static void ST_ShellAverage(std::vector const& q, std::sort(shells.begin(), shells.end(), ST_ShellQCmp); } +<<<<<<< HEAD /** Capillary-wave γ from the small-q plateau of q² S(q). * S(q) = k_B T / (A γ q²) (κ → 0) * γ = k_B T / (A ⟨q² S(q)⟩) @@ -588,6 +773,13 @@ static void ST_ShellAverage(std::vector const& q, * A is converted Ų → m²; γ is then ×1000 → mN/m. * Needs at least two shells. * \return 0 on success, 1 on failure (γ / ⟨q² S⟩ set to NaN). +======= +/** Capillary-wave γ from the mean q² S(q) plateau on [qmin, qmax]. + * plateau = ⟨ q² S(q) ⟩_shells + * γ (N/m) = k_B T / (A plateau), then ×1000 → mN/m + * Equal weight per q-shell. Needs at least two shells. + * \return 0 on success, 1 on failure (γ/plateau set to NaN). +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) */ static int ST_CalcGamma(std::vector const& shells, double temperature, double area_A2, double qmin, double qmax, @@ -611,12 +803,21 @@ static int ST_CalcGamma(std::vector const& shells, double temperature, return 0; } +<<<<<<< HEAD /** Helfrich inversion of S(q) = k_B T / [A (γ q² + κ q⁴)]: * 1/(q² S) = (A / k_B T) (γ + κ q²) = a + b q² * γ = k_B T a / A (N/m, then ×1000 → mN/m) * κ / k_B T = b / A (A in Ų) * q in Å⁻¹, S in Ų; q² S is dimensionless. Equal weight per shell. * Needs at least three shells with S > 0. +======= +/** Helfrich fit on [qmin, qmax]: + * 1 / (q² S) = a + b q² + * q in Å⁻¹, S in Ų, so q² S is dimensionless. + * γ (mN/m) = 1000 k_B T a / A_m² (intercept) + * κ / kT = b / A_Ų (slope) + * Equal weight per shell. Needs at least three shells with S > 0. +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) * \return 0 on success, 1 on failure (outputs set to NaN). */ static int ST_CalcKappa(std::vector const& shells, double temperature, @@ -652,10 +853,14 @@ static int ST_CalcKappa(std::vector const& shells, double temperature, return 0; } +<<<<<<< HEAD /** Apparent κ(q)/k_B T at one shell, given a reference γ (mN/m). * Invert S = k_B T / [A (γ q² + κ q⁴)] → κ / k_B T = [1/(q² S) − A γ / k_B T] / (A q²). * Negative κ is allowed (the linear Helfrich slope may change sign). */ +======= +/** Apparent κ(q)/kT given γ (mN/m): invert γ q² + κ q⁴ at one shell. */ +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) static double ST_ShellKappa(double q, double S, double temperature, double area_A2, double gamma_mNm) { @@ -670,9 +875,13 @@ static double ST_ShellKappa(double q, double S, double temperature, double area_ return b / area_A2; } +<<<<<<< HEAD /** Apparent γ(q) = k_B T / (A q² S(q)) from one shell, in mN/m. * Equals the plateau γ only where q² S is flat (κ → 0). */ +======= +/** Apparent γ(q) = k_B T / (A q² S(q)) in mN/m. */ +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) static double ST_ShellGamma(double q, double S, double temperature, double area_A2) { double q2S = q * q * S; if (q2S <= 0.0) return ST_NaN(); @@ -680,9 +889,14 @@ static double ST_ShellGamma(double q, double S, double temperature, double area_ return 1000.0 * ST_KB * temperature / (area_m2 * q2S); } +<<<<<<< HEAD /** OLS slope of ln S vs ln q on [q_min, q_max]. * Pure capillary waves have S(q) ∝ q⁻², so the slope is −2. A slope * near −4 is Helfrich-dominated. Sfield selects S / S_upper / S_lower. +======= +/** Ordinary least-squares slope of log S vs log q on [qmin, qmax]. + * Ideal capillary waves give slope ≈ −2. Sfield selects S / Stop / Sbot. +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) */ static double ST_LogSlope(std::vector const& shells, double qmin, double qmax, double ST_Shell::* Sfield) @@ -715,6 +929,7 @@ static void ST_AddSetToFiles(DataSet* ds, DataFile* a, DataFile* b, DataFile* c) if (c != 0) c->AddDataSet(ds); } +<<<<<<< HEAD /// Write a key/value line; skip non-finite doubles. static void ST_SummaryD(CpptrajFile* f, const char* key, double v) { if (f == 0 || !ST_Finite(v)) return; @@ -772,6 +987,13 @@ Action_SurfaceTension::Action_SurfaceTension() : do_upper_(true), do_lower_(true), qmin_specified_(false), +======= +// ----------------------------------------------------------------------------- +/// CONSTRUCTOR — defaults match the reference Python analysis. +Action_SurfaceTension::Action_SurfaceTension() : + iface_(WILLARD), + normal_(AXIS_Z), +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) temp_(-1.0), gridspacing_(2.5), dz_(1.0), @@ -779,6 +1001,7 @@ Action_SurfaceTension::Action_SurfaceTension() : sigma_z_(1.5), bulk_halfwidth_(5.0), threshold_frac_(0.5), +<<<<<<< HEAD qmin_(-1.0), qmax_(0.174649), q_fundamental_(0.0), @@ -790,13 +1013,25 @@ Action_SurfaceTension::Action_SurfaceTension() : nblock_(0), debug_(0), n_skip_warn_(0), +======= + qmin_(0.033283), + qmax_(0.174649), + lx_user_(-1.0), + ly_user_(-1.0), + lz_user_(-1.0), + nblock_(0), + debug_(0), +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) S_(0), S_top_(0), S_bot_(0), q2S_(0), q2S_top_(0), q2S_bot_(0), gammaq_(0), gammaq_top_(0), gammaq_bot_(0), kappaq_(0), kappaq_top_(0), kappaq_bot_(0), wtop_(0), wbot_(0), wmean_(0), rhobulk_(0), block_gamma_(0), block_kappa_(0), block_wmean_(0), block_wtop_(0), block_wbot_(0), +<<<<<<< HEAD summaryFile_(0), +======= +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) nx_(0), ny_(0), nz_(0), Lt1_ref_(0.0), Lt2_ref_(0.0), grid_ready_(false), @@ -806,15 +1041,22 @@ Action_SurfaceTension::Action_SurfaceTension() : {} // Action_SurfaceTension::Help() +<<<<<<< HEAD /** ASCII-only (terminals). Formulae live in the class header, not here. */ void Action_SurfaceTension::Help() const { mprintf("\t[] [mask2 ] temp \n" "\t[normal {x|y|z}] [nsurf {1|2}] [side {upper|lower}]\n" "\t[interface {willard|itim}]\n" +======= +void Action_SurfaceTension::Help() const { + mprintf("\t[] temp \n" + "\t[normal {x|y|z}] [interface {willard|itim}]\n" +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) "\t[gridspacing ] [dz | dnormal ]\n" "\t[sigmaxy ] [sigmaz | sigmanormal ]\n" "\t[bulkhalfwidth ] [threshold ]\n" "\t[qmin ] [qmax ] [lx ] [ly ] [lz ]\n" +<<<<<<< HEAD "\t[nblock ] [dt ] [blocktime ] [fprefix ]\n" "\t[out | spectrumout ] [roughout ] [blockout ]\n" "\t[summaryout ]\n" @@ -834,16 +1076,46 @@ void Action_SurfaceTension::Help() const { " fprefix is prepended to each of those file names (directory unchanged),\n" " e.g. fprefix 150K_ spectrumout spec.dat writes 150K_spec.dat.\n" " A directory in the name must already exist; it is not created.\n"); +======= + "\t[nblock ]\n" + "\t[spectrumout ] [roughout ] [blockout ]\n" + "\t[spectrumagr ] [roughagr ] [blockagr ]\n" + "\t[spectrumgnu ] [roughgnu ] [blockgnu ]\n" + " Calculate capillary-wave surface tension (mN/m) for a liquid slab.\n" + " normal x|y|z selects the slab normal (default z). gridspacing and\n" + " sigmaxy apply in the interface plane; dz (alias dnormal) and sigmaz\n" + " (alias sigmanormal) apply along the normal. should select\n" + " interfacial density atoms (e.g. ':WAT@O'). Interfaces are a\n" + " Willard-Chandler Gaussian density isosurface (default) or ITIM\n" + " per-column min/max of , split at mid-box along the normal.\n" + " Height fluctuations are Fourier transformed; gamma is the small-q\n" + " plateau of q^2 <|h_q|^2>. kappa (kT) is the slope of 1/(q^2 S) vs\n" + " q^2 on the same q window. lx/ly/lz optionally replace Cartesian box\n" + " lengths. Lateral lengths are held fixed (NVT). Assumes an X-aligned\n" + " orthogonal box. DataSets are always created; files are written only\n" + " when the matching *out/*agr/*gnu keyword is given. *out format\n" + " follows the extension (.agr/.xmgr = xmgrace, .gnu = gnuplot,\n" + " otherwise ASCII). *agr/*gnu force Grace or gnuplot. In MPI,\n" + " nblock is per-rank; spectra are summed onto the master.\n"); +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) } // Action_SurfaceTension::Init() /** Parse keywords, allocate DataSets, attach optional output files. +<<<<<<< HEAD * Spectrum / roughness meshes always exist so writedata can dump them after * Print() fills S(q). Files are written only if the matching *out / *agr / * *gnu keyword is given. Parent directories are checked here: DataFiles * open only after run, so a missing path would otherwise lose the write. * out is an alias for spectrumout. agr/gnu force Grace / gnuplot. * Contains() is called before getKey* so flags are not already consumed. +======= + * Spectrum / roughness DataSets always exist so writedata can dump them. + * Files are written only if the matching *out / *agr / *gnu keyword is given. + * *out uses the DataFile writer for the filename extension (canonical + * cpptraj: .agr/.xmgr = Grace/xmgrace, .gnu = gnuplot). *agr/*gnu force + * DataFile::XMGRACE / GNUPLOT even when the extension is not recognized. +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) */ Action::RetType Action_SurfaceTension::Init(ArgList& actionArgs, ActionInit& init, int debugIn) { @@ -852,6 +1124,7 @@ Action::RetType Action_SurfaceTension::Init(ArgList& actionArgs, ActionInit& ini # endif debug_ = debugIn; // Optional output files. AddDataFile returns 0 if the keyword is absent. +<<<<<<< HEAD // out == spectrumout (usual cpptraj keyword for the main result file). // fprefix is prepended to each basename so multiple runs can share a directory. std::string fprefix = actionArgs.GetStringKey("fprefix"); @@ -902,6 +1175,17 @@ Action::RetType Action_SurfaceTension::Init(ArgList& actionArgs, ActionInit& ini ST_CheckParentDir(roughGnu, "roughgnu") || ST_CheckParentDir(blockGnu, "blockgnu")) return Action::ERR; +======= + DataFile* spectrumFile = init.DFL().AddDataFile(actionArgs.GetStringKey("spectrumout"), actionArgs); + DataFile* roughFile = init.DFL().AddDataFile(actionArgs.GetStringKey("roughout"), actionArgs); + DataFile* blockFile = init.DFL().AddDataFile(actionArgs.GetStringKey("blockout"), actionArgs); + DataFile* spectrumAgr = init.DFL().AddDataFile(actionArgs.GetStringKey("spectrumagr"), actionArgs, DataFile::XMGRACE); + DataFile* roughAgr = init.DFL().AddDataFile(actionArgs.GetStringKey("roughagr"), actionArgs, DataFile::XMGRACE); + DataFile* blockAgr = init.DFL().AddDataFile(actionArgs.GetStringKey("blockagr"), actionArgs, DataFile::XMGRACE); + DataFile* spectrumGnu = init.DFL().AddDataFile(actionArgs.GetStringKey("spectrumgnu"), actionArgs, DataFile::GNUPLOT); + DataFile* roughGnu = init.DFL().AddDataFile(actionArgs.GetStringKey("roughgnu"), actionArgs, DataFile::GNUPLOT); + DataFile* blockGnu = init.DFL().AddDataFile(actionArgs.GetStringKey("blockgnu"), actionArgs, DataFile::GNUPLOT); +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) temp_ = actionArgs.getKeyDouble("temp", -1.0); if (temp_ <= 0.0) { @@ -912,8 +1196,12 @@ Action::RetType Action_SurfaceTension::Init(ArgList& actionArgs, ActionInit& ini sigma_xy_ = actionArgs.getKeyDouble("sigmaxy", 2.5); bulk_halfwidth_ = actionArgs.getKeyDouble("bulkhalfwidth", 5.0); threshold_frac_ = actionArgs.getKeyDouble("threshold", 0.5); +<<<<<<< HEAD qmin_specified_ = actionArgs.Contains("qmin"); qmin_ = actionArgs.getKeyDouble("qmin", -1.0); +======= + qmin_ = actionArgs.getKeyDouble("qmin", 0.033283); +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) qmax_ = actionArgs.getKeyDouble("qmax", 0.174649); bool has_lx = actionArgs.Contains("lx"); bool has_ly = actionArgs.Contains("ly"); @@ -921,11 +1209,15 @@ Action::RetType Action_SurfaceTension::Init(ArgList& actionArgs, ActionInit& ini lx_user_ = actionArgs.getKeyDouble("lx", -1.0); ly_user_ = actionArgs.getKeyDouble("ly", -1.0); lz_user_ = actionArgs.getKeyDouble("lz", -1.0); +<<<<<<< HEAD bool has_nblock = actionArgs.Contains("nblock"); bool has_blocktime = actionArgs.Contains("blocktime"); nblock_ = actionArgs.getKeyInt("nblock", 0); dt_ = actionArgs.getKeyDouble("dt", -1.0); blocktime_ = actionArgs.getKeyDouble("blocktime", -1.0); +======= + nblock_ = actionArgs.getKeyInt("nblock", 0); +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) // dz / dnormal and sigmaz / sigmanormal are aliases (normal-axis spacing / sigma). bool has_dz = actionArgs.Contains("dz"); @@ -982,6 +1274,7 @@ Action::RetType Action_SurfaceTension::Init(ArgList& actionArgs, ActionInit& ini return Action::ERR; } +<<<<<<< HEAD nsurf_ = actionArgs.getKeyInt("nsurf", 2); if (nsurf_ != 1 && nsurf_ != 2) { mprinterr("Error: nsurf must be 1 or 2.\n"); @@ -1023,6 +1316,8 @@ Action::RetType Action_SurfaceTension::Init(ArgList& actionArgs, ActionInit& ini if (Mask2_.SetMaskString(mask2exp)) return Action::ERR; } +======= +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) if (has_lx && lx_user_ <= 0.0) { mprinterr("Error: lx must be > 0.\n"); return Action::ERR; @@ -1058,6 +1353,7 @@ Action::RetType Action_SurfaceTension::Init(ArgList& actionArgs, ActionInit& ini mprinterr("Error: bulkhalfwidth must be > 0.\n"); return Action::ERR; } +<<<<<<< HEAD if (qmax_ <= 0.0) { mprinterr("Error: qmax must be > 0.\n"); return Action::ERR; @@ -1093,12 +1389,22 @@ Action::RetType Action_SurfaceTension::Init(ArgList& actionArgs, ActionInit& ini } nblock_ = nfromtime; } +======= + if (qmax_ <= qmin_) { + mprinterr("Error: qmax must be greater than qmin.\n"); + return Action::ERR; + } +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) if (nblock_ < 0) { mprinterr("Error: nblock must be >= 0.\n"); return Action::ERR; } if ((blockFile != 0 || blockAgr != 0 || blockGnu != 0) && nblock_ < 1) { +<<<<<<< HEAD mprinterr("Error: 'blockout'/'blockagr'/'blockgnu' require 'nblock' or 'blocktime'.\n"); +======= + mprinterr("Error: 'blockout'/'blockagr'/'blockgnu' require 'nblock '.\n"); +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) return Action::ERR; } @@ -1145,7 +1451,11 @@ Action::RetType Action_SurfaceTension::Init(ArgList& actionArgs, ActionInit& ini kappaq_top_->SetDim(Dimension::X, qdim); kappaq_bot_->SetDim(Dimension::X, qdim); // Print() fills these from the accumulated spectra; they are not time series. +<<<<<<< HEAD // MPI: SyncAction reduces |h_q|²; skip DataSet concat of empty meshes. +======= + // MPI: SyncAction reduces |h_q|^2; skip DataSet concat of empty meshes. +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) # ifdef MPI S_->SetNeedsSync(false); S_top_->SetNeedsSync(false); S_bot_->SetNeedsSync(false); q2S_->SetNeedsSync(false); q2S_top_->SetNeedsSync(false); q2S_bot_->SetNeedsSync(false); @@ -1193,8 +1503,11 @@ Action::RetType Action_SurfaceTension::Init(ArgList& actionArgs, ActionInit& ini mprintf(" SURFTENSION: Capillary-wave surface tension.\n"); mprintf("\tMask: '%s'\n", Mask_.MaskString()); +<<<<<<< HEAD if (has_mask2_) mprintf("\tMask2 (lower surface): '%s'\n", Mask2_.MaskString()); +======= +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) { const char* t1 = 0; const char* t2 = 0; @@ -1202,6 +1515,7 @@ Action::RetType Action_SurfaceTension::Init(ArgList& actionArgs, ActionInit& ini mprintf("\tSlab normal: %s (interface plane %s-%s)\n", ST_AxisName((int)normal_), t1, t2); } +<<<<<<< HEAD if (nsurf_ == 2) mprintf("\tSurfaces: 2 (upper and lower; vacuum/second phase on both sides).\n"); else @@ -1210,14 +1524,21 @@ Action::RetType Action_SurfaceTension::Init(ArgList& actionArgs, ActionInit& ini mprintf("\tInterface: Willard-Chandler density isosurface.\n"); else if (has_mask2_) mprintf("\tInterface: ITIM (upper = max of mask, lower = min of mask2).\n"); +======= + if (iface_ == WILLARD) + mprintf("\tInterface: Willard-Chandler density isosurface.\n"); +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) else mprintf("\tInterface: ITIM min/max (per-column, split at mid-box along %s).\n", ST_AxisName((int)normal_)); mprintf("\tTemperature= %g K\n", temp_); +<<<<<<< HEAD mprintf("\tLateral box lengths: from the unit cell"); if (lx_user_ > 0.0 || ly_user_ > 0.0 || lz_user_ > 0.0) mprintf(" (some Cartesian lengths overridden)"); mprintf(".\n"); +======= +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) mprintf("\tInterface-plane grid spacing= %g Ang\n", gridspacing_); if (iface_ == WILLARD) { mprintf("\tNormal-axis bin spacing (dz)= %g Ang\n", dz_); @@ -1228,6 +1549,7 @@ Action::RetType Action_SurfaceTension::Init(ArgList& actionArgs, ActionInit& ini } else { mprintf("\tBulk half-width (rho_bulk only)= %g Ang\n", bulk_halfwidth_); } +<<<<<<< HEAD if (qmin_specified_) mprintf("\tFit q range= %g to %g Ang^-1\n", qmin_, qmax_); else @@ -1237,6 +1559,10 @@ Action::RetType Action_SurfaceTension::Init(ArgList& actionArgs, ActionInit& ini mprintf("\tHeight-field 2-D FFT: PubFFT (numpy fft2 / (nx*ny)).\n"); if (!fprefix.empty()) mprintf("\tOutput file prefix: '%s'\n", fprefix.c_str()); +======= + mprintf("\tFit q range= %g to %g Ang^-1\n", qmin_, qmax_); + mprintf("\tHelfrich kappa: linear fit of 1/(q^2 S) vs q^2 on that window.\n"); +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) if (lx_user_ > 0.0) mprintf("\tUsing fixed Lx= %g Ang (%s)\n", lx_user_, (normal_ == AXIS_X) ? "normal" : "lateral"); @@ -1248,8 +1574,11 @@ Action::RetType Action_SurfaceTension::Init(ArgList& actionArgs, ActionInit& ini (normal_ == AXIS_Z) ? "normal" : "lateral"); if (nblock_ > 0) { mprintf("\tBlock averaging every %i analyzed frames", nblock_); +<<<<<<< HEAD if (blocktime_ > 0.0 && dt_ > 0.0) mprintf(" (blocktime %g ps, dt %g ps)", blocktime_, dt_); +======= +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) # ifdef MPI if (trajComm_.Size() > 1) mprintf(" (per rank)"); @@ -1283,8 +1612,11 @@ Action::RetType Action_SurfaceTension::Init(ArgList& actionArgs, ActionInit& ini mprintf("\tBlock Grace output to '%s'\n", blockAgr->DataFilename().full()); if (blockGnu != 0) mprintf("\tBlock gnuplot output to '%s'\n", blockGnu->DataFilename().full()); +<<<<<<< HEAD if (summaryFile_ != 0) mprintf("\tSummary output to '%s'\n", summaryFile_->Filename().full()); +======= +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) # ifdef _OPENMP { int nthreads = 1; @@ -1294,8 +1626,15 @@ Action::RetType Action_SurfaceTension::Init(ArgList& actionArgs, ActionInit& ini nthreads = omp_get_num_threads(); } if (nthreads > 1) { +<<<<<<< HEAD if (iface_ == WILLARD) mprintf("\tOpenMP: 3-D Gaussian filter parallelized with %i threads.\n", nthreads); +======= + mprintf("\tOpenMP: 2-D DFT"); + if (iface_ == WILLARD) + mprintf(" and 3-D Gaussian filter"); + mprintf(" parallelized with %i threads.\n", nthreads); +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) } } # endif @@ -1307,9 +1646,12 @@ Action::RetType Action_SurfaceTension::Init(ArgList& actionArgs, ActionInit& ini } // Action_SurfaceTension::Setup() +<<<<<<< HEAD /** Require an orthorhombic unit cell (L₁, L₂, L_n) and bind the mask(s). * Non-X-aligned boxes are warned: laterals are wrapped independently. */ +======= +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) Action::RetType Action_SurfaceTension::Setup(ActionSetup& setup) { if (!setup.CoordInfo().HasBox()) { @@ -1327,6 +1669,7 @@ Action::RetType Action_SurfaceTension::Setup(ActionSetup& setup) mprintf("Warning: Mask '%s' selects no atoms.\n", Mask_.MaskString()); return Action::SKIP; } +<<<<<<< HEAD if (has_mask2_) { if (setup.Top().SetupIntegerMask(Mask2_)) return Action::ERR; Mask2_.MaskInfo(); @@ -1335,15 +1678,20 @@ Action::RetType Action_SurfaceTension::Setup(ActionSetup& setup) return Action::SKIP; } } +======= +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) return Action::OK; } // Action_SurfaceTension::AllocateGrid() +<<<<<<< HEAD /** First good frame: freeze N₁, N₂, L₁, L₂ and (Willard) N_n. * Allocates ρ, h, |h_q|² accumulators, PubFFT plans, and q_α = 2π n_α / L_α. * If q_min was omitted it is set to 2π / max(L₁, L₂). * \return 0 OK, 1 fatal (FFT setup or q_max ≤ q_min). */ +======= +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) int Action_SurfaceTension::AllocateGrid(int nx, int ny, int nz) { nx_ = nx; ny_ = ny; @@ -1354,16 +1702,20 @@ int Action_SurfaceTension::AllocateGrid(int nx, int ny, int nz) { density_.assign(n3, 0.0); else density_.clear(); +<<<<<<< HEAD if (nz > 0 && has_mask2_) density2_.assign(n3, 0.0); else density2_.clear(); +======= +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) h_upper_.assign(n2, 0.0); h_lower_.assign(n2, 0.0); total_power_.assign(n2, 0.0); top_power_.assign(n2, 0.0); bottom_power_.assign(n2, 0.0); block_power_.assign(n2, 0.0); +<<<<<<< HEAD if (fft_n1_.SetupFFTforN(nx_) || fft_n2_.SetupFFTforN(ny_)) { mprinterr("Error: Could not set up 2-D FFT (nx = %i, ny = %i).\n", nx_, ny_); return 1; @@ -1372,6 +1724,10 @@ int Action_SurfaceTension::AllocateGrid(int nx, int ny, int nz) { fft_row_.Allocate(ny_); fft_col_.Allocate(nx_); ST_MakeQGrid(nx_, ny_, Lt1_ref_, Lt2_ref_, q_grid_); +======= + ST_MakeQGrid(nx_, ny_, Lt1_ref_, Lt2_ref_, q_grid_); + grid_ready_ = true; +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) double qmin_acc = 0.0; bool haveq = false; for (size_t i = 0; i < q_grid_.size(); i++) { @@ -1386,6 +1742,7 @@ int Action_SurfaceTension::AllocateGrid(int nx, int ny, int nz) { mprintf("\tInterface grid = %i x %i", nx_, ny_); if (nz_ > 0) mprintf(" x %i", nz_); +<<<<<<< HEAD mprintf(" bins along %s, %s", t1, t2); if (nz_ > 0) mprintf(", %s", ST_AxisName((int)normal_)); @@ -1603,6 +1960,23 @@ void Action_SurfaceTension::HeightPower(std::vector const& h, * frames must keep the same lateral box (NVT). Combined power is summed * over the surfaces actually used (nsurf 1 or 2). * \return 0 OK, 1 skip frame, 2 fatal (grid or L₁, L₂ changed). +======= + mprintf(" (%s x %s", t1, t2); + if (nz_ > 0) + mprintf(" x %s", ST_AxisName((int)normal_)); + mprintf(")\n"); + mprintf("\t%s x %s = %g x %g Ang\n", t1, t2, Lt1_ref_, Lt2_ref_); + if (haveq) + mprintf("\tSmallest accessible q = %g Ang^-1\n", qmin_acc); + return 0; +} + +// Action_SurfaceTension::ProcessFrame() +/** Wrap laterals, recenter along the normal, build instantaneous interfaces, + * then accumulate roughness and |h_q|^2. First good frame freezes nx, ny, + * Lt1, Lt2 (and nz for Willard-Chandler). Cartesian Lx/Ly/Lz are permuted + * into (Lt1, Lt2, Ln) according to normal_. +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) */ int Action_SurfaceTension::ProcessFrame(Frame const& frm, double Lx, double Ly, double Lz) { @@ -1610,6 +1984,7 @@ int Action_SurfaceTension::ProcessFrame(Frame const& frm, double Lx, double Ly, double Lt1, Lt2, Ln; ST_SplitBox(nax, Lx, Ly, Lz, Lt1, Lt2, Ln); +<<<<<<< HEAD std::vector t1, t2, n; ST_SplitAtomCoords(frm, Mask_, nax, Lx, Ly, Lz, t1, t2, n); int natom = Mask_.Nselected(); @@ -1626,6 +2001,23 @@ int Action_SurfaceTension::ProcessFrame(Frame const& frm, double Lx, double Ly, ST_CircularRecenter(n, Ln); } +======= + int natom = Mask_.Nselected(); + std::vector t1((size_t)natom), t2((size_t)natom), n((size_t)natom); + int idx = 0; + for (AtomMask::const_iterator at = Mask_.begin(); at != Mask_.end(); ++at, ++idx) { + const double* xyz = frm.XYZ(*at); + double a, b, c; + ST_SplitXYZ(nax, xyz[0], xyz[1], xyz[2], a, b, c); + t1[idx] = ST_Wrap(a, Lt1); + t2[idx] = ST_Wrap(b, Lt2); + n[idx] = c; + } + ST_CircularRecenter(n, Ln); + + // Same bin counts as the reference Python: max(8, round(L/spacing)) in the + // interface plane, max(32, round(Ln/dz)) along the normal (Willard only). +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) int nx = std::max(8, ST_IRound(Lt1 / gridspacing_)); int ny = std::max(8, ST_IRound(Lt2 / gridspacing_)); int nz = 0; @@ -1635,7 +2027,11 @@ int Action_SurfaceTension::ProcessFrame(Frame const& frm, double Lx, double Ly, if (!grid_ready_) { Lt1_ref_ = Lt1; Lt2_ref_ = Lt2; +<<<<<<< HEAD if (AllocateGrid(nx, ny, nz)) return 2; +======= + AllocateGrid(nx, ny, nz); +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) } else { if (nx != nx_ || ny != ny_) { mprinterr("Error: Interface grid dimensions changed during the trajectory.\n"); @@ -1645,12 +2041,20 @@ int Action_SurfaceTension::ProcessFrame(Frame const& frm, double Lx, double Ly, mprinterr("Error: Lateral box dimensions changed. surftension assumes a fixed interface plane (NVT).\n"); return 2; } +<<<<<<< HEAD if (iface_ == WILLARD && nz != nz_) nz = nz_; +======= + if (iface_ == WILLARD && nz != nz_) { + // Normal-axis length may jitter slightly; keep the first-frame nz. + nz = nz_; + } +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) } double rho_bulk = 0.0; if (iface_ == ITIM) { +<<<<<<< HEAD if (has_mask2_) { rho_bulk = ST_RhoBulkFromAtoms(n, natom, Lt1, Lt2, Ln, bulk_halfwidth_); if (!ST_ItimTwoMasks(t1, t2, n, natom, t1b, t2b, nb, natom2, @@ -1705,13 +2109,133 @@ int Action_SurfaceTension::ProcessFrame(Frame const& frm, double Lx, double Ly, for (size_t i = 0; i < top_power_.size(); i++) { if (do_upper_) top_power_[i] += p_upper[i]; if (do_lower_) bottom_power_[i] += p_lower[i]; +======= + rho_bulk = ST_RhoBulkFromAtoms(n, natom, Lt1, Lt2, Ln, bulk_halfwidth_); + if (!ST_ItimMinMax(t1, t2, n, natom, Lt1, Lt2, Ln, nx_, ny_, h_upper_, h_lower_)) { + mprintf("Warning: Empty ITIM column; skipping frame.\n"); + return 1; + } + } else { + double dx = Lt1 / (double)nx_; + double dy = Lt2 / (double)ny_; + double dz = Ln / (double)nz_; + double voxel = dx * dy * dz; + // Histogram counts, then convert to number density (Ang^-3). + std::fill(density_.begin(), density_.end(), 0.0); + for (int i = 0; i < natom; i++) { + int ix = (int)floor(t1[i] / dx); + int iy = (int)floor(t2[i] / dy); + int iz = (int)floor(n[i] / dz); + if (ix < 0) ix = 0; + if (iy < 0) iy = 0; + if (iz < 0) iz = 0; + if (ix >= nx_) ix = nx_ - 1; + if (iy >= ny_) iy = ny_ - 1; + if (iz >= nz_) iz = nz_ - 1; + density_[ST_Idx3(ix, iy, iz, ny_, nz_)] += 1.0; + } + if (voxel > 0.0) { + for (size_t i = 0; i < density_.size(); i++) + density_[i] /= voxel; + } + + ST_GaussianFilter3D(density_, nx_, ny_, nz_, + sigma_xy_ / dx, sigma_xy_ / dy, sigma_z_ / dz); + + // Bin centers, matching 0.5 * (edges[:-1] + edges[1:]) of numpy.histogramdd. + std::vector n_grid((size_t)nz_); + for (int iz = 0; iz < nz_; iz++) + n_grid[iz] = ((double)iz + 0.5) * dz; + double slab_center = 0.5 * Ln; + int center_index = 0; + double best = fabs(n_grid[0] - slab_center); + for (int iz = 1; iz < nz_; iz++) { + double d = fabs(n_grid[iz] - slab_center); + if (d < best) { + best = d; + center_index = iz; + } + } + + std::vector rho_n((size_t)nz_, 0.0); + double nxy = (double)(nx_ * ny_); + for (int ix = 0; ix < nx_; ix++) { + for (int iy = 0; iy < ny_; iy++) { + for (int iz = 0; iz < nz_; iz++) + rho_n[iz] += density_[ST_Idx3(ix, iy, iz, ny_, nz_)]; + } + } + for (int iz = 0; iz < nz_; iz++) + rho_n[iz] /= nxy; + + // rho_bulk is the laterally averaged density within +/- bulk_halfwidth of Ln/2. + double rho_bulk_acc = 0.0; + int nbulk = 0; + for (int iz = 0; iz < nz_; iz++) { + if (fabs(n_grid[iz] - slab_center) <= bulk_halfwidth_) { + rho_bulk_acc += rho_n[iz]; + nbulk++; + } + } + if (nbulk < 1) { + mprintf("Warning: No bins along the normal fall within the bulk region; skipping frame.\n"); + return 1; + } + rho_bulk = rho_bulk_acc / (double)nbulk; + if (rho_bulk <= 0.0) { + mprintf("Warning: Bulk density is non-positive; skipping frame.\n"); + return 1; + } + double threshold = threshold_frac_ * rho_bulk; + + // One height pair per lateral column. Any missing crossing skips the frame. + std::vector col((size_t)nz_); + bool ok = true; + for (int ix = 0; ix < nx_ && ok; ix++) { + for (int iy = 0; iy < ny_; iy++) { + for (int iz = 0; iz < nz_; iz++) + col[iz] = density_[ST_Idx3(ix, iy, iz, ny_, nz_)]; + double hu = ST_FindCrossing(n_grid, col, threshold, center_index, true); + double hl = ST_FindCrossing(n_grid, col, threshold, center_index, false); + if (!ST_Finite(hu) || !ST_Finite(hl)) { + ok = false; + break; + } + h_upper_[ST_Idx2(ix, iy, ny_)] = hu; + h_lower_[ST_Idx2(ix, iy, ny_)] = hl; + } + } + if (!ok) { + mprintf("Warning: Could not identify a local interface; skipping frame.\n"); + return 1; + } + } + + double w_top = ST_RMS(h_upper_); + double w_bot = ST_RMS(h_lower_); + double w_mean = 0.5 * (w_top + w_bot); + + // Combined spectrum averages both surfaces (n_surfaces_ = 2 n_frames_). + std::vector p_upper, p_lower; + ST_HeightPower(h_upper_, nx_, ny_, p_upper); + ST_HeightPower(h_lower_, nx_, ny_, p_lower); + + for (size_t i = 0; i < top_power_.size(); i++) { + top_power_[i] += p_upper[i]; + bottom_power_[i] += p_lower[i]; +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) total_power_[i] += p_upper[i] + p_lower[i]; block_power_[i] += p_upper[i] + p_lower[i]; } n_frames_++; +<<<<<<< HEAD n_surfaces_ += nsurf_this; block_surface_count_ += nsurf_this; +======= + n_surfaces_ += 2; + block_surface_count_ += 2; +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) block_frame_count_++; block_w_sum_ += w_mean; block_wtop_sum_ += w_top; @@ -1730,10 +2254,14 @@ int Action_SurfaceTension::ProcessFrame(Frame const& frm, double Lx, double Ly, } // Action_SurfaceTension::FinishBlock() +<<<<<<< HEAD /** Close one nblock window: S(q) = (Σ |h_q|²) / n_surfaces in the block, * then the same CWT γ / κ fits as Print(). Incomplete final window is * left in the running spectra but not written to blockout. */ +======= +/** Average the open-block power, fit γ and κ, store roughness means, then reset. */ +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) int Action_SurfaceTension::FinishBlock() { if (block_surface_count_ < 1 || block_frame_count_ < 1) return 0; std::vector spec(block_power_.size()); @@ -1746,7 +2274,10 @@ int Action_SurfaceTension::FinishBlock() { int err_g = ST_CalcGamma(shells, temp_, Lt1_ref_ * Lt2_ref_, qmin_, qmax_, gamma, plateau); int err_k = ST_CalcKappa(shells, temp_, Lt1_ref_ * Lt2_ref_, qmin_, qmax_, gamma_k, kappa_kT); (void)gamma_k; +<<<<<<< HEAD (void)err_k; +======= +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) if (err_g) { mprintf("Warning: Block %i: fewer than two q shells in the fit range; skipping block gamma.\n", n_blocks_ + 1); @@ -1762,6 +2293,15 @@ int Action_SurfaceTension::FinishBlock() { block_wtop_->Add(n_blocks_, &wtop); block_wbot_->Add(n_blocks_, &wbot); } +<<<<<<< HEAD +======= + if (err_k) + mprintf("\tBlock %i: gamma = %g mN/m, roughness = %g Ang\n", + n_blocks_ + 1, gamma, wmean); + else + mprintf("\tBlock %i: gamma = %g mN/m, kappa = %g kT, roughness = %g Ang\n", + n_blocks_ + 1, gamma, kappa_kT, wmean); +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) n_blocks_++; } std::fill(block_power_.begin(), block_power_.end(), 0.0); @@ -1772,6 +2312,7 @@ int Action_SurfaceTension::FinishBlock() { } // Action_SurfaceTension::DoAction() +<<<<<<< HEAD /** Read the unit-cell lengths (or lx/ly/lz overrides) and ProcessFrame. * Skip (Action::OK) if the box is missing or a crossing failed; ERR if * the lateral grid changed (not NVT). @@ -1780,6 +2321,12 @@ Action::RetType Action_SurfaceTension::DoAction(int, ActionFrame& frm) { if (!frm.Frm().BoxCrd().HasBox()) { SkipWarn("Frame has no box; skipping."); +======= +Action::RetType Action_SurfaceTension::DoAction(int, ActionFrame& frm) +{ + if (!frm.Frm().BoxCrd().HasBox()) { + mprintf("Warning: Frame has no box; skipping.\n"); +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) n_skipped_++; return Action::OK; } @@ -1789,7 +2336,11 @@ Action::RetType Action_SurfaceTension::DoAction(int, ActionFrame& frm) double Ly = (ly_user_ > 0.0) ? ly_user_ : lengths[1]; double Lz = (lz_user_ > 0.0) ? lz_user_ : lengths[2]; if (Lx <= 0.0 || Ly <= 0.0 || Lz <= 0.0) { +<<<<<<< HEAD SkipWarn("Invalid box lengths; skipping frame."); +======= + mprintf("Warning: Invalid box lengths; skipping frame.\n"); +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) n_skipped_++; return Action::OK; } @@ -1804,6 +2355,7 @@ Action::RetType Action_SurfaceTension::DoAction(int, ActionFrame& frm) #ifdef MPI // Action_SurfaceTension::SyncAction() +<<<<<<< HEAD /** Reduce per-rank |h_q|² so Print() sees the global S(q) = ⟨|h_q|²⟩. * Counts (frames, surfaces, skipped) AllReduce SUM. Grid size, L₁, L₂, * q_min, and q_fundamental AllReduce MAX so empty ranks (zeros) do not @@ -1811,6 +2363,12 @@ Action::RetType Action_SurfaceTension::DoAction(int, ActionFrame& frm) * power; |q| is a separate MAX. Roughness and block series stay on * DataSet::Sync (concat by rank). nblock is per-rank. Print() is master * only. +======= +/** Radial-style reduction. Three small AllReduces (counts SUM, grid MAX, lateral + * box MAX) then one packed ReduceMaster SUM of combined/upper/lower |h_q|^2 onto + * the master. |q| uses a separate MAX (different MPI_Op). Print() is master + * only. Roughness / block series use DataSet::Sync (concat by rank). +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) */ int Action_SurfaceTension::SyncAction() { if (trajComm_.Size() < 2) return 0; @@ -1828,12 +2386,19 @@ int Action_SurfaceTension::SyncAction() { int n2max = imax[0]; nx_ = imax[1]; ny_ = imax[2]; +<<<<<<< HEAD double box[4] = { Lt1_ref_, Lt2_ref_, qmin_, q_fundamental_ }; trajComm_.AllReduce(box, 4, MPI_DOUBLE, MPI_MAX); Lt1_ref_ = box[0]; Lt2_ref_ = box[1]; qmin_ = box[2]; q_fundamental_ = box[3]; +======= + double box[2] = { Lt1_ref_, Lt2_ref_ }; + trajComm_.AllReduce(box, 2, MPI_DOUBLE, MPI_MAX); + Lt1_ref_ = box[0]; + Lt2_ref_ = box[1]; +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) if (n2max < 1) return 0; if (n2 != 0 && n2 != n2max) { @@ -1879,11 +2444,15 @@ int Action_SurfaceTension::SyncAction() { #endif // Action_SurfaceTension::Print() +<<<<<<< HEAD /** Form S(q) = (Σ |h_q|²) / n_surfaces, shell-average, then the CWT fits * γ = k_B T / (A ⟨q² S⟩) , 1/(q² S) = (A / k_B T) (γ + κ q²) * Fill the q-meshes, print the numeric summary, and write summaryout. * Per-block γ / κ are printed here, not during the frame loop. */ +======= +/** Average accumulated spectra, fill q-meshes, report γ / roughness / blocks. */ +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) void Action_SurfaceTension::Print() { const char* t1 = 0; @@ -1896,12 +2465,15 @@ void Action_SurfaceTension::Print() mprintf("\tInterface: Willard-Chandler density isosurface.\n"); else mprintf("\tInterface: ITIM min/max.\n"); +<<<<<<< HEAD mprintf("\tSurfaces: %i", nsurf_); if (nsurf_ == 1) mprintf(" (%s)", (side_ == SIDE_UPPER) ? "upper" : "lower"); mprintf("\n"); if (has_mask2_) mprintf("\tMask2 (lower): '%s'\n", Mask2_.MaskString()); +======= +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) if (nblock_ > 0 && block_frame_count_ > 0) { mprintf("\tNOTE: Incomplete nblock window (%i frames) excluded from blockout.\n", block_frame_count_); @@ -1911,11 +2483,14 @@ void Action_SurfaceTension::Print() if (n_skipped_ > 0) mprinterr(" (%i skipped)", n_skipped_); mprinterr(".\n"); +<<<<<<< HEAD if (summaryFile_ != 0) { summaryFile_->Printf("# surftension summary\n"); ST_SummaryI(summaryFile_, "frames", 0); ST_SummaryI(summaryFile_, "skipped", n_skipped_); } +======= +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) return; } @@ -1932,9 +2507,15 @@ void Action_SurfaceTension::Print() // Fit γ on the combined, upper-only, and lower-only shells. double area = Lt1_ref_ * Lt2_ref_; +<<<<<<< HEAD double gamma_full = ST_NaN(), plateau = ST_NaN(); double gamma_top = ST_NaN(), plateau_top = ST_NaN(); double gamma_bot = ST_NaN(), plateau_bot = ST_NaN(); +======= + double gamma_full, plateau; + double gamma_top, plateau_top; + double gamma_bot, plateau_bot; +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) std::vector top_only = shells; std::vector bot_only = shells; for (size_t i = 0; i < shells.size(); i++) { @@ -1942,6 +2523,7 @@ void Action_SurfaceTension::Print() bot_only[i].S = shells[i].Sbot; } int err_full = ST_CalcGamma(shells, temp_, area, qmin_, qmax_, gamma_full, plateau); +<<<<<<< HEAD int err_top = 1, err_bot = 1; if (do_upper_) err_top = ST_CalcGamma(top_only, temp_, area, qmin_, qmax_, gamma_top, plateau_top); @@ -1958,6 +2540,16 @@ void Action_SurfaceTension::Print() err_kh_top = ST_CalcKappa(top_only, temp_, area, qmin_, qmax_, gamma_h_top, kappa_h_top); if (do_lower_) err_kh_bot = ST_CalcKappa(bot_only, temp_, area, qmin_, qmax_, gamma_h_bot, kappa_h_bot); +======= + int err_top = ST_CalcGamma(top_only, temp_, area, qmin_, qmax_, gamma_top, plateau_top); + int err_bot = ST_CalcGamma(bot_only, temp_, area, qmin_, qmax_, gamma_bot, plateau_bot); + (void)plateau_top; + (void)plateau_bot; + double gamma_h, kappa_h, gamma_h_top, kappa_h_top, gamma_h_bot, kappa_h_bot; + int err_kh = ST_CalcKappa(shells, temp_, area, qmin_, qmax_, gamma_h, kappa_h); + int err_kh_top = ST_CalcKappa(top_only, temp_, area, qmin_, qmax_, gamma_h_top, kappa_h_top); + int err_kh_bot = ST_CalcKappa(bot_only, temp_, area, qmin_, qmax_, gamma_h_bot, kappa_h_bot); +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) double gamma_for_kappaq = err_kh ? gamma_full : gamma_h; double slope = ST_LogSlope(shells, qmin_, qmax_, &ST_Shell::S); @@ -1984,6 +2576,7 @@ void Action_SurfaceTension::Print() double mean_w = 0.0, mean_wt = 0.0, mean_wb = 0.0; if (wmean_->Size() > 0) { +<<<<<<< HEAD int nu = 0, nl = 0; for (size_t i = 0; i < wmean_->Size(); i++) { mean_w += ((DataSet_1D*)wmean_)->Dval(i); @@ -1999,6 +2592,16 @@ void Action_SurfaceTension::Print() mean_w /= (double)wmean_->Size(); if (nu > 0) mean_wt /= (double)nu; if (nl > 0) mean_wb /= (double)nl; +======= + for (size_t i = 0; i < wmean_->Size(); i++) { + mean_w += ((DataSet_1D*)wmean_)->Dval(i); + mean_wt += ((DataSet_1D*)wtop_)->Dval(i); + mean_wb += ((DataSet_1D*)wbot_)->Dval(i); + } + mean_w /= (double)wmean_->Size(); + mean_wt /= (double)wtop_->Size(); + mean_wb /= (double)wbot_->Size(); +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) } mprintf("\tT = %g K\n", temp_); @@ -2006,11 +2609,16 @@ void Action_SurfaceTension::Print() if (n_skipped_ > 0) mprintf(" (%i skipped)", n_skipped_); mprintf("\n"); +<<<<<<< HEAD mprintf("\tL(%s) = %g Ang, L(%s) = %g Ang (from unit cell unless lx/ly/lz set)\n", t1, Lt1_ref_, t2, Lt2_ref_); mprintf("\tArea = %g Ang^2\n", area); if (q_fundamental_ > 0.0) mprintf("\tFundamental |q| = %g Ang^-1\n", q_fundamental_); +======= + mprintf("\t%s x %s = %g x %g Ang\n", t1, t2, Lt1_ref_, Lt2_ref_); + mprintf("\tArea = %g Ang^2\n", area); +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) mprintf("\tFit q range = %g to %g Ang^-1\n", qmin_, qmax_); if (ST_Finite(slope)) mprintf("\tLow-q log-log slope = %g (ideal capillary-wave slope is about -2)\n", slope); @@ -2033,6 +2641,7 @@ void Action_SurfaceTension::Print() mprintf("\tkappa, upper surface = %g kT\n", kappa_h_top); if (!err_kh_bot) mprintf("\tkappa, lower surface = %g kT\n", kappa_h_bot); +<<<<<<< HEAD if (do_upper_ && do_lower_ && ST_Finite(slope_top) && ST_Finite(slope_bot)) mprintf("\tLow-q slope upper/lower = %g / %g\n", slope_top, slope_bot); if (do_upper_ && do_lower_) @@ -2061,6 +2670,12 @@ void Action_SurfaceTension::Print() } double block_gmean = ST_NaN(), block_gsd = ST_NaN(), block_gsem = ST_NaN(); double block_kmean = ST_NaN(), block_ksd = ST_NaN(), block_ksem = ST_NaN(); +======= + if (ST_Finite(slope_top) && ST_Finite(slope_bot)) + mprintf("\tLow-q slope upper/lower = %g / %g\n", slope_top, slope_bot); + mprintf("\tMean roughness = %g Ang (upper %g, lower %g)\n", mean_w, mean_wt, mean_wb); + +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) if (block_gamma_ != 0 && block_gamma_->Size() > 1) { double gmean = 0.0, g2 = 0.0; for (size_t i = 0; i < block_gamma_->Size(); i++) { @@ -2073,9 +2688,12 @@ void Action_SurfaceTension::Print() (double)(block_gamma_->Size() - 1); double sd = (var > 0.0) ? sqrt(var) : 0.0; double sem = sd / sqrt((double)block_gamma_->Size()); +<<<<<<< HEAD block_gmean = gmean; block_gsd = sd; block_gsem = sem; +======= +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) mprintf("\tBlock mean gamma = %g mN/m\n", gmean); mprintf("\tBlock SD gamma = %g mN/m\n", sd); mprintf("\tBlock SEM gamma = %g mN/m\n", sem); @@ -2096,15 +2714,19 @@ void Action_SurfaceTension::Print() double var = (k2 - (double)nk * kmean * kmean) / (double)(nk - 1); double sd = (var > 0.0) ? sqrt(var) : 0.0; double sem = sd / sqrt((double)nk); +<<<<<<< HEAD block_kmean = kmean; block_ksd = sd; block_ksem = sem; +======= +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) mprintf("\tBlock mean kappa = %g kT\n", kmean); mprintf("\tBlock SD kappa = %g kT\n", sd); mprintf("\tBlock SEM kappa = %g kT\n", sem); mprintf("\tkappa +/- 2 SEM = %g kT\n", 2.0 * sem); } } +<<<<<<< HEAD if (summaryFile_ != 0) { summaryFile_->Printf("# surftension summary\n"); @@ -2143,4 +2765,6 @@ void Action_SurfaceTension::Print() ST_SummaryD(summaryFile_, "block_sd_kappa", block_ksd); ST_SummaryD(summaryFile_, "block_sem_kappa", block_ksem); } +======= +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) } diff --git a/src/Action_SurfaceTension.h b/src/Action_SurfaceTension.h index c07ba36d61..93bb6776dc 100644 --- a/src/Action_SurfaceTension.h +++ b/src/Action_SurfaceTension.h @@ -3,6 +3,7 @@ #include #include "Action.h" #include "AtomMask.h" +<<<<<<< HEAD #include "PubFFT.h" class DataSet_Mesh; class CpptrajFile; @@ -52,6 +53,25 @@ class CpptrajFile; * Helfrich bending energy * W. Helfrich, Z. Naturforsch. C 28, 693 (1973). * https://doi.org/10.1515/znc-1973-11-1209 +======= +class DataSet_Mesh; +/// Capillary-wave surface tension of a liquid slab (Cartesian normal). +/** Instantaneous upper and lower interfaces are either a Willard-Chandler + * isosurface of a Gaussian-smoothed number-density field (default) or an + * ITIM-style per-column min/max of , split at mid-box along the normal. + * Height fluctuations in the interface plane are Fourier transformed with + * the numpy convention + * h_q = (1 / N₁N₂) Σ h(t1,t2) exp(−i q · r) + * Capillary-wave theory including bending rigidity κ is + * ⟨|h_q|²⟩ = k_B T / (A (γ q² + κ q⁴)) + * so γ (mN/m) is obtained from the small-q plateau of q² S(q), and κ (in kT) + * from the slope of 1/(q² S) vs q² on the same window. + * The slab normal is x, y, or z (default z); gridspacing/sigmaxy apply in the + * interface plane and dz/sigmaz along the normal. Lateral box lengths are + * held fixed (NVT). DataSets are always created; files are written only when + * the matching *out keyword is given. MPI: packed ReduceMaster of |h_q|². + * \author Nathan D Levinzon +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) */ class Action_SurfaceTension : public Action { public: @@ -64,10 +84,15 @@ class Action_SurfaceTension : public Action { Action::RetType DoAction(int, ActionFrame&); void Print(); # ifdef MPI +<<<<<<< HEAD +======= + /// Sum Fourier accumulators onto the master rank. +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) int SyncAction(); Parallel::Comm trajComm_; # endif +<<<<<<< HEAD int AllocateGrid(int, int, int); /** \return 0 OK, 1 skip frame, 2 fatal (grid or lateral box changed). */ int ProcessFrame(Frame const&, double, double, double); @@ -170,5 +195,89 @@ class Action_SurfaceTension : public Action { double block_w_sum_; double block_wtop_sum_; double block_wbot_sum_; +======= + /// Allocate density / height / power arrays for the lateral grid (and nz). + int AllocateGrid(int, int, int); + /// Build interfaces and accumulate spectra for one frame. + /** \return 0 OK, 1 skip frame, 2 fatal (grid or lateral box changed). */ + int ProcessFrame(Frame const&, double, double, double); + /// Finish one complete nblock window (γ, κ, and roughness). + int FinishBlock(); + + /// Instantaneous-interface definition. + enum IfaceType { WILLARD = 0, ITIM }; + /// Cartesian slab normal. + enum NormalAxis { AXIS_X = 0, AXIS_Y = 1, AXIS_Z = 2 }; + + AtomMask Mask_; ///< Atoms used for the number-density / ITIM field + IfaceType iface_; ///< Willard-Chandler isosurface or ITIM min/max + NormalAxis normal_; ///< Slab normal (default z) + + double temp_; ///< Temperature (K) + double gridspacing_; ///< Target bin spacing in the interface plane (Å) + double dz_; ///< Target bin spacing along the slab normal (Å) + double sigma_xy_; ///< Gaussian smoothing in the interface plane (Å) + double sigma_z_; ///< Gaussian smoothing along the slab normal (Å) + double bulk_halfwidth_; ///< Half-width around slab center for ρ_bulk (Å) + double threshold_frac_; ///< Interface is this fraction of ρ_bulk + double qmin_; ///< Fit-window minimum |q| (Å⁻¹) + double qmax_; ///< Fit-window maximum |q| (Å⁻¹) + double lx_user_; ///< Optional fixed box Lx; < 0 means use the box + double ly_user_; ///< Optional fixed box Ly; < 0 means use the box + double lz_user_; ///< Optional fixed box Lz; < 0 means use the box + int nblock_; ///< Frames per uncertainty block; 0 disables + int debug_; ///< Debug level from ActionInit + + // ----- Spectrum vs q; filled in Print() -------------------------------- + DataSet_Mesh* S_; ///< Combined S(q) = ⟨|h_q|²⟩ (Ų) + DataSet_Mesh* S_top_; ///< Upper-interface S(q) + DataSet_Mesh* S_bot_; ///< Lower-interface S(q) + DataSet_Mesh* q2S_; ///< Combined q² S(q) + DataSet_Mesh* q2S_top_; ///< Upper q² S(q) + DataSet_Mesh* q2S_bot_; ///< Lower q² S(q) + DataSet_Mesh* gammaq_; ///< Apparent γ(q) (mN/m), combined + DataSet_Mesh* gammaq_top_; ///< Apparent γ(q), upper + DataSet_Mesh* gammaq_bot_; ///< Apparent γ(q), lower + DataSet_Mesh* kappaq_; ///< Apparent κ(q) (kT), combined + DataSet_Mesh* kappaq_top_; ///< Apparent κ(q), upper + DataSet_Mesh* kappaq_bot_; ///< Apparent κ(q), lower + // ----- Per-frame roughness / bulk density ------------------------------ + DataSet* wtop_; ///< Upper RMS roughness w (Å) + DataSet* wbot_; ///< Lower RMS roughness w (Å) + DataSet* wmean_; ///< Mean of upper and lower w (Å) + DataSet* rhobulk_; ///< Bulk number density (Å⁻³) + // ----- Per-block results (only if nblock > 0) -------------------------- + DataSet* block_gamma_; ///< Block γ (mN/m) + DataSet* block_kappa_; ///< Block κ (kT) + DataSet* block_wmean_; ///< Block mean roughness (Å) + DataSet* block_wtop_; ///< Block upper roughness (Å) + DataSet* block_wbot_; ///< Block lower roughness (Å) + + std::vector density_; ///< n1×n2×nz number density (Å⁻³); unused for ITIM + std::vector h_upper_; ///< n1×n2 upper height field along the normal (Å) + std::vector h_lower_; ///< n1×n2 lower height field along the normal (Å) + std::vector total_power_; ///< Accumulated |h_q|², both surfaces + std::vector top_power_; ///< Accumulated |h_q|², upper + std::vector bottom_power_; ///< Accumulated |h_q|², lower + std::vector block_power_; ///< Combined |h_q|² for the open block + std::vector q_grid_; ///< |q| for each Fourier mode (Å⁻¹) + + int nx_; ///< Bins along lateral axis 1 + int ny_; ///< Bins along lateral axis 2 + int nz_; ///< Density bins along the slab normal + double Lt1_ref_; ///< Lateral length 1 from the first good frame (Å) + double Lt2_ref_; ///< Lateral length 2 from the first good frame (Å) + bool grid_ready_; ///< True after the first successful frame + + int n_frames_; ///< Frames that contributed to the spectra + int n_surfaces_; ///< 2 × n_frames_ (upper + lower) + int n_skipped_; ///< Frames skipped (no interface / no box) + int n_blocks_; ///< Completed uncertainty blocks + int block_surface_count_; ///< Surfaces accumulated in the open block + int block_frame_count_; ///< Frames accumulated in the open block + double block_w_sum_; ///< Running sum of mean w in the open block + double block_wtop_sum_; ///< Running sum of upper w + double block_wbot_sum_; ///< Running sum of lower w +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) }; #endif diff --git a/src/Command.cpp b/src/Command.cpp index e15a1edee1..03588c4425 100644 --- a/src/Command.cpp +++ b/src/Command.cpp @@ -412,8 +412,11 @@ void Command::Init() { Command::AddCmd( new Action_STFC_Diffusion(),Cmd::ACT, 1, "stfcdiffusion" ); Command::AddCmd( new Action_Strip(), Cmd::ACT, 1, "strip" ); Command::AddCmd( new Action_Surf(), Cmd::ACT, 1, "surf" ); +<<<<<<< HEAD // surftension: keep Command.cpp in sync with Action_SurfaceTension.h // (standalone Makefile has no header deps; stale Command.o undersizes new). +======= +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) Command::AddCmd( new Action_SurfaceTension(),Cmd::ACT, 1, "surftension" ); Command::AddCmd( new Action_SymmetricRmsd(), Cmd::ACT, 1, "symmrmsd" ); Command::AddCmd( new Action_Temperature(), Cmd::ACT, 1, "temperature" ); diff --git a/src/Version.h b/src/Version.h index cf1a20f342..3fc605cfe0 100644 --- a/src/Version.h +++ b/src/Version.h @@ -12,7 +12,11 @@ * Whenever a number that precedes is incremented, all subsequent * numbers should be reset to 0. */ +<<<<<<< HEAD #define CPPTRAJ_INTERNAL_VERSION "V7.11.2" +======= +#define CPPTRAJ_INTERNAL_VERSION "V7.11.0" +>>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) /// PYTRAJ relies on this #define CPPTRAJ_VERSION_STRING CPPTRAJ_INTERNAL_VERSION #endif diff --git a/test/Test_SurfTension/RunTest.sh b/test/Test_SurfTension/RunTest.sh index 6ca5f2e66c..6eb8e1d16d 100755 --- a/test/Test_SurfTension/RunTest.sh +++ b/test/Test_SurfTension/RunTest.sh @@ -1,4 +1,5 @@ #!/bin/bash +<<<<<<< HEAD # surftension tests. # slab.pdb is a 20 A cubic lattice of O atoms with a small z-corrugation # so ITIM min/max is not flat. Stretching one box length creates vacuum @@ -95,6 +96,79 @@ run EOF RunCpptraj "$UNITNAME" DoTest st2_summary.dat.save st2_summary.dat -a 0.001 +======= +# Smoke tests for the surftension Action. +# tz2.ortho is a solvated protein box, not a liquid slab, so the 1-frame run +# only checks that Init/Setup do not crash. Numeric γ comparison needs a +# dedicated slab trajectory. + +. ../MasterTest.sh + +CleanFiles st.in + +TESTNAME='Surface tension (surftension) tests' + +# Command is registered and Help() prints. +UNITNAME='surftension help' +cat > st.in < st.in < st.in < st.in < st.in <>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) EndTest exit 0 From 3b2f86473c2924f11fc0ea8af784d3a006ad88b0 Mon Sep 17 00:00:00 2001 From: ndlevinzon Date: Mon, 31 Aug 2026 14:56:10 -0600 Subject: [PATCH 02/33] Fix documentation typo in Action_SurfaceTension.cpp regarding agr/gnu keywords --- src/Action_SurfaceTension.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Action_SurfaceTension.cpp b/src/Action_SurfaceTension.cpp index be45d52d9a..5c304cb0aa 100644 --- a/src/Action_SurfaceTension.cpp +++ b/src/Action_SurfaceTension.cpp @@ -1113,7 +1113,7 @@ void Action_SurfaceTension::Help() const { * Spectrum / roughness DataSets always exist so writedata can dump them. * Files are written only if the matching *out / *agr / *gnu keyword is given. * *out uses the DataFile writer for the filename extension (canonical - * cpptraj: .agr/.xmgr = Grace/xmgrace, .gnu = gnuplot). *agr/*gnu force + * cpptraj: .agr/.xmgr = Grace/xmgrace, .gnu = gnuplot). agr/gnu keywords force * DataFile::XMGRACE / GNUPLOT even when the extension is not recognized. >>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) */ From 44a6fb6e8ccb893713879e5dad29eb78feb0fdd1 Mon Sep 17 00:00:00 2001 From: ndlevinzon Date: Mon, 31 Aug 2026 15:25:53 -0600 Subject: [PATCH 03/33] Refactor output formatting in Action_SurfaceTension.cpp for clarity and consistency - Updated log messages to improve readability, changing "bins along" to "bins along" for better context. - Enhanced output in the Print function to include completed block information, displaying gamma, kappa, and roughness more clearly. - Removed redundant error message logging for kappa when it is not applicable. - Adjusted variable names in output for consistency with other parts of the code. --- src/Action_SurfaceTension.cpp | 41 ++++++++++++++++++++++++++++++++--- 1 file changed, 38 insertions(+), 3 deletions(-) diff --git a/src/Action_SurfaceTension.cpp b/src/Action_SurfaceTension.cpp index 5c304cb0aa..061e70e6c4 100644 --- a/src/Action_SurfaceTension.cpp +++ b/src/Action_SurfaceTension.cpp @@ -1742,6 +1742,7 @@ int Action_SurfaceTension::AllocateGrid(int nx, int ny, int nz) { mprintf("\tInterface grid = %i x %i", nx_, ny_); if (nz_ > 0) mprintf(" x %i", nz_); +<<<<<<< HEAD <<<<<<< HEAD mprintf(" bins along %s, %s", t1, t2); if (nz_ > 0) @@ -1962,10 +1963,13 @@ void Action_SurfaceTension::HeightPower(std::vector const& h, * \return 0 OK, 1 skip frame, 2 fatal (grid or L₁, L₂ changed). ======= mprintf(" (%s x %s", t1, t2); +======= + mprintf(" bins along %s, %s", t1, t2); +>>>>>>> efb16d90 (Refactor output formatting in Action_SurfaceTension.cpp for clarity and consistency) if (nz_ > 0) - mprintf(" x %s", ST_AxisName((int)normal_)); - mprintf(")\n"); - mprintf("\t%s x %s = %g x %g Ang\n", t1, t2, Lt1_ref_, Lt2_ref_); + mprintf(", %s", ST_AxisName((int)normal_)); + mprintf("\n"); + mprintf("\tL(%s) = %g Ang, L(%s) = %g Ang\n", t1, Lt1_ref_, t2, Lt2_ref_); if (haveq) mprintf("\tSmallest accessible q = %g Ang^-1\n", qmin_acc); return 0; @@ -2274,10 +2278,14 @@ int Action_SurfaceTension::FinishBlock() { int err_g = ST_CalcGamma(shells, temp_, Lt1_ref_ * Lt2_ref_, qmin_, qmax_, gamma, plateau); int err_k = ST_CalcKappa(shells, temp_, Lt1_ref_ * Lt2_ref_, qmin_, qmax_, gamma_k, kappa_kT); (void)gamma_k; +<<<<<<< HEAD <<<<<<< HEAD (void)err_k; ======= >>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) +======= + (void)err_k; +>>>>>>> efb16d90 (Refactor output formatting in Action_SurfaceTension.cpp for clarity and consistency) if (err_g) { mprintf("Warning: Block %i: fewer than two q shells in the fit range; skipping block gamma.\n", n_blocks_ + 1); @@ -2294,6 +2302,7 @@ int Action_SurfaceTension::FinishBlock() { block_wbot_->Add(n_blocks_, &wbot); } <<<<<<< HEAD +<<<<<<< HEAD ======= if (err_k) mprintf("\tBlock %i: gamma = %g mN/m, roughness = %g Ang\n", @@ -2302,6 +2311,8 @@ int Action_SurfaceTension::FinishBlock() { mprintf("\tBlock %i: gamma = %g mN/m, kappa = %g kT, roughness = %g Ang\n", n_blocks_ + 1, gamma, kappa_kT, wmean); >>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) +======= +>>>>>>> efb16d90 (Refactor output formatting in Action_SurfaceTension.cpp for clarity and consistency) n_blocks_++; } std::fill(block_power_.begin(), block_power_.end(), 0.0); @@ -2609,6 +2620,7 @@ void Action_SurfaceTension::Print() if (n_skipped_ > 0) mprintf(" (%i skipped)", n_skipped_); mprintf("\n"); +<<<<<<< HEAD <<<<<<< HEAD mprintf("\tL(%s) = %g Ang, L(%s) = %g Ang (from unit cell unless lx/ly/lz set)\n", t1, Lt1_ref_, t2, Lt2_ref_); @@ -2617,6 +2629,9 @@ void Action_SurfaceTension::Print() mprintf("\tFundamental |q| = %g Ang^-1\n", q_fundamental_); ======= mprintf("\t%s x %s = %g x %g Ang\n", t1, t2, Lt1_ref_, Lt2_ref_); +======= + mprintf("\tL(%s) = %g Ang, L(%s) = %g Ang\n", t1, Lt1_ref_, t2, Lt2_ref_); +>>>>>>> efb16d90 (Refactor output formatting in Action_SurfaceTension.cpp for clarity and consistency) mprintf("\tArea = %g Ang^2\n", area); >>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) mprintf("\tFit q range = %g to %g Ang^-1\n", qmin_, qmax_); @@ -2675,7 +2690,27 @@ void Action_SurfaceTension::Print() mprintf("\tLow-q slope upper/lower = %g / %g\n", slope_top, slope_bot); mprintf("\tMean roughness = %g Ang (upper %g, lower %g)\n", mean_w, mean_wt, mean_wb); +<<<<<<< HEAD >>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) +======= + if (block_gamma_ != 0 && block_gamma_->Size() > 0) { + mprintf("\tCompleted blocks = %zu (nblock = %i frames)\n", + block_gamma_->Size(), nblock_); + for (size_t i = 0; i < block_gamma_->Size(); i++) { + double g = ((DataSet_1D*)block_gamma_)->Dval(i); + double w = (block_wmean_ != 0) ? ((DataSet_1D*)block_wmean_)->Dval(i) : ST_NaN(); + double k = ST_NaN(); + if (block_kappa_ != 0 && i < block_kappa_->Size()) + k = ((DataSet_1D*)block_kappa_)->Dval(i); + if (ST_Finite(k)) + mprintf("\tBlock %zu: gamma = %g mN/m, kappa = %g kT, roughness = %g Ang\n", + i + 1, g, k, w); + else + mprintf("\tBlock %zu: gamma = %g mN/m, roughness = %g Ang\n", + i + 1, g, w); + } + } +>>>>>>> efb16d90 (Refactor output formatting in Action_SurfaceTension.cpp for clarity and consistency) if (block_gamma_ != 0 && block_gamma_->Size() > 1) { double gmean = 0.0, g2 = 0.0; for (size_t i = 0; i < block_gamma_->Size(); i++) { From 0b7379b6cee34c71587f2d9bc18665ccae47063a Mon Sep 17 00:00:00 2001 From: ndlevinzon Date: Mon, 31 Aug 2026 15:30:15 -0600 Subject: [PATCH 04/33] Implement 2-D FFT for height fields in Action_SurfaceTension - Introduced a new HeightPower function that computes the 2-D FFT of height fields using cpptraj's PubFFT, matching numpy's fft2 convention. - Updated ChangeLog to reflect the new FFT implementation and its usage. - Adjusted output messages to include details about the new FFT method. - Removed the old direct DFT implementation for height power spectrum calculation. --- doc/ChangeLog.surftension.md | 6 +++ src/Action_SurfaceTension.cpp | 89 ++++++++++++++++++++++++++++++++++- src/Action_SurfaceTension.h | 16 ++++++- 3 files changed, 107 insertions(+), 4 deletions(-) diff --git a/doc/ChangeLog.surftension.md b/doc/ChangeLog.surftension.md index a34296c785..ef4b712978 100644 --- a/doc/ChangeLog.surftension.md +++ b/doc/ChangeLog.surftension.md @@ -95,6 +95,7 @@ surftension [] temp Init/Print report e.g. `Slab normal: z (interface plane x-y)`. Warns on non-orthogonal boxes. <<<<<<< HEAD +<<<<<<< HEAD - Height-field 2-D FFT uses cpptraj `PubFFT` (row-column 1-D FFTs), then divides by `nx*ny` (numpy `fft2` convention). Same `S(q)` as the old direct DFT. Per-block γ/κ print in `Print()`, not during the frame loop. @@ -114,6 +115,11 @@ surftension [] temp `run`, which previously lost a full trajectory write). ======= >>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) +======= +- Height-field 2-D FFT uses cpptraj `PubFFT` (row-column 1-D FFTs), then + divides by `nx*ny` (numpy `fft2` convention). Same `S(q)` as the old + direct DFT. Per-block γ/κ print in `Print()`, not during the frame loop. +>>>>>>> 5b484999 (Implement 2-D FFT for height fields in Action_SurfaceTension) --- diff --git a/src/Action_SurfaceTension.cpp b/src/Action_SurfaceTension.cpp index 061e70e6c4..813fd00b4f 100644 --- a/src/Action_SurfaceTension.cpp +++ b/src/Action_SurfaceTension.cpp @@ -631,6 +631,7 @@ static double ST_FftFreq(int k, int n, double d) { return (double)p / ((double)n * d); } +<<<<<<< HEAD <<<<<<< HEAD /** |q| = √(q₁² + q₂²) on the N₁×N₂ Fourier mesh, q_α = 2π n_α / L_α. */ ======= @@ -678,6 +679,8 @@ static void ST_HeightPower(std::vector const& h, int nx, int ny, } } +======= +>>>>>>> 5b484999 (Implement 2-D FFT for height fields in Action_SurfaceTension) /** |q| = √(qx² + qy²) for each Fourier mode, qx = 2π fftfreq(nx, Lx/nx). */ >>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) static void ST_MakeQGrid(int nx, int ny, double Lx, double Ly, std::vector& q) { @@ -1562,7 +1565,11 @@ Action::RetType Action_SurfaceTension::Init(ArgList& actionArgs, ActionInit& ini ======= mprintf("\tFit q range= %g to %g Ang^-1\n", qmin_, qmax_); mprintf("\tHelfrich kappa: linear fit of 1/(q^2 S) vs q^2 on that window.\n"); +<<<<<<< HEAD >>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) +======= + mprintf("\tHeight-field 2-D FFT: PubFFT (numpy fft2 / (nx*ny)).\n"); +>>>>>>> 5b484999 (Implement 2-D FFT for height fields in Action_SurfaceTension) if (lx_user_ > 0.0) mprintf("\tUsing fixed Lx= %g Ang (%s)\n", lx_user_, (normal_ == AXIS_X) ? "normal" : "lateral"); @@ -1626,6 +1633,7 @@ Action::RetType Action_SurfaceTension::Init(ArgList& actionArgs, ActionInit& ini nthreads = omp_get_num_threads(); } if (nthreads > 1) { +<<<<<<< HEAD <<<<<<< HEAD if (iface_ == WILLARD) mprintf("\tOpenMP: 3-D Gaussian filter parallelized with %i threads.\n", nthreads); @@ -1635,6 +1643,10 @@ Action::RetType Action_SurfaceTension::Init(ArgList& actionArgs, ActionInit& ini mprintf(" and 3-D Gaussian filter"); mprintf(" parallelized with %i threads.\n", nthreads); >>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) +======= + if (iface_ == WILLARD) + mprintf("\tOpenMP: 3-D Gaussian filter parallelized with %i threads.\n", nthreads); +>>>>>>> 5b484999 (Implement 2-D FFT for height fields in Action_SurfaceTension) } } # endif @@ -1716,6 +1728,9 @@ int Action_SurfaceTension::AllocateGrid(int nx, int ny, int nz) { bottom_power_.assign(n2, 0.0); block_power_.assign(n2, 0.0); <<<<<<< HEAD +<<<<<<< HEAD +======= +>>>>>>> 5b484999 (Implement 2-D FFT for height fields in Action_SurfaceTension) if (fft_n1_.SetupFFTforN(nx_) || fft_n2_.SetupFFTforN(ny_)) { mprinterr("Error: Could not set up 2-D FFT (nx = %i, ny = %i).\n", nx_, ny_); return 1; @@ -1723,8 +1738,11 @@ int Action_SurfaceTension::AllocateGrid(int nx, int ny, int nz) { fft_grid_.Allocate(nx_ * ny_); fft_row_.Allocate(ny_); fft_col_.Allocate(nx_); +<<<<<<< HEAD ST_MakeQGrid(nx_, ny_, Lt1_ref_, Lt2_ref_, q_grid_); ======= +======= +>>>>>>> 5b484999 (Implement 2-D FFT for height fields in Action_SurfaceTension) ST_MakeQGrid(nx_, ny_, Lt1_ref_, Lt2_ref_, q_grid_); grid_ready_ = true; >>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) @@ -1975,6 +1993,69 @@ void Action_SurfaceTension::HeightPower(std::vector const& h, return 0; } +// Action_SurfaceTension::HeightPower() +/** 2-D FFT of h − ⟨h⟩ via row-column PubFFT 1-D transforms, then + * h_q = FFT2 / (nx ny) + * matching numpy.fft.fft2(h) / h.size. Power is |h_q|² (Ang^2). + * fft_n2_ transforms along iy (contiguous); fft_n1_ along ix. + */ +void Action_SurfaceTension::HeightPower(std::vector const& h, + std::vector& power) +{ + int nx = nx_; + int ny = ny_; + int nxy = nx * ny; + power.assign((size_t)nxy, 0.0); + if (nxy == 0) return; + + double mean = 0.0; + for (int i = 0; i < nxy; i++) + mean += h[i]; + mean /= (double)nxy; + + for (int ix = 0; ix < nx; ix++) { + for (int iy = 0; iy < ny; iy++) { + int idx = ST_Idx2(ix, iy, ny); + fft_grid_[2 * idx] = h[idx] - mean; + fft_grid_[2 * idx + 1] = 0.0; + } + } + + for (int ix = 0; ix < nx; ix++) { + int base = ix * ny; + for (int iy = 0; iy < ny; iy++) { + fft_row_[2 * iy] = fft_grid_[2 * (base + iy)]; + fft_row_[2 * iy + 1] = fft_grid_[2 * (base + iy) + 1]; + } + fft_n2_.Forward(fft_row_); + for (int iy = 0; iy < ny; iy++) { + fft_grid_[2 * (base + iy)] = fft_row_[2 * iy]; + fft_grid_[2 * (base + iy) + 1] = fft_row_[2 * iy + 1]; + } + } + + for (int iy = 0; iy < ny; iy++) { + for (int ix = 0; ix < nx; ix++) { + int idx = ST_Idx2(ix, iy, ny); + fft_col_[2 * ix] = fft_grid_[2 * idx]; + fft_col_[2 * ix + 1] = fft_grid_[2 * idx + 1]; + } + fft_n1_.Forward(fft_col_); + for (int ix = 0; ix < nx; ix++) { + int idx = ST_Idx2(ix, iy, ny); + fft_grid_[2 * idx] = fft_col_[2 * ix]; + fft_grid_[2 * idx + 1] = fft_col_[2 * ix + 1]; + } + } + + double Ninv = 1.0 / (double)nxy; + for (int k = 0; k < nxy; k++) { + double re = fft_grid_[2 * k] * Ninv; + double im = fft_grid_[2 * k + 1] * Ninv; + power[k] = re * re + im * im; + } +} + // Action_SurfaceTension::ProcessFrame() /** Wrap laterals, recenter along the normal, build instantaneous interfaces, * then accumulate roughness and |h_q|^2. First good frame freezes nx, ny, @@ -2031,11 +2112,15 @@ int Action_SurfaceTension::ProcessFrame(Frame const& frm, double Lx, double Ly, if (!grid_ready_) { Lt1_ref_ = Lt1; Lt2_ref_ = Lt2; +<<<<<<< HEAD <<<<<<< HEAD if (AllocateGrid(nx, ny, nz)) return 2; ======= AllocateGrid(nx, ny, nz); >>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) +======= + if (AllocateGrid(nx, ny, nz)) return 2; +>>>>>>> 5b484999 (Implement 2-D FFT for height fields in Action_SurfaceTension) } else { if (nx != nx_ || ny != ny_) { mprinterr("Error: Interface grid dimensions changed during the trajectory.\n"); @@ -2221,8 +2306,8 @@ int Action_SurfaceTension::ProcessFrame(Frame const& frm, double Lx, double Ly, // Combined spectrum averages both surfaces (n_surfaces_ = 2 n_frames_). std::vector p_upper, p_lower; - ST_HeightPower(h_upper_, nx_, ny_, p_upper); - ST_HeightPower(h_lower_, nx_, ny_, p_lower); + HeightPower(h_upper_, p_upper); + HeightPower(h_lower_, p_lower); for (size_t i = 0; i < top_power_.size(); i++) { top_power_[i] += p_upper[i]; diff --git a/src/Action_SurfaceTension.h b/src/Action_SurfaceTension.h index 93bb6776dc..d3df2bb150 100644 --- a/src/Action_SurfaceTension.h +++ b/src/Action_SurfaceTension.h @@ -4,6 +4,7 @@ #include "Action.h" #include "AtomMask.h" <<<<<<< HEAD +<<<<<<< HEAD #include "PubFFT.h" class DataSet_Mesh; class CpptrajFile; @@ -54,14 +55,17 @@ class CpptrajFile; * W. Helfrich, Z. Naturforsch. C 28, 693 (1973). * https://doi.org/10.1515/znc-1973-11-1209 ======= +======= +#include "PubFFT.h" +>>>>>>> 5b484999 (Implement 2-D FFT for height fields in Action_SurfaceTension) class DataSet_Mesh; /// Capillary-wave surface tension of a liquid slab (Cartesian normal). /** Instantaneous upper and lower interfaces are either a Willard-Chandler * isosurface of a Gaussian-smoothed number-density field (default) or an * ITIM-style per-column min/max of , split at mid-box along the normal. * Height fluctuations in the interface plane are Fourier transformed with - * the numpy convention - * h_q = (1 / N₁N₂) Σ h(t1,t2) exp(−i q · r) + * cpptraj PubFFT (row-column 1-D FFTs) using the numpy convention + * h_q = (1 / N₁N₂) FFT2(h − ⟨h⟩) * Capillary-wave theory including bending rigidity κ is * ⟨|h_q|²⟩ = k_B T / (A (γ q² + κ q⁴)) * so γ (mN/m) is obtained from the small-q plateau of q² S(q), and κ (in kT) @@ -203,6 +207,8 @@ class Action_SurfaceTension : public Action { int ProcessFrame(Frame const&, double, double, double); /// Finish one complete nblock window (γ, κ, and roughness). int FinishBlock(); + /// |h_q|² of a height field via 2-D PubFFT / (nx ny). + void HeightPower(std::vector const&, std::vector&); /// Instantaneous-interface definition. enum IfaceType { WILLARD = 0, ITIM }; @@ -262,6 +268,12 @@ class Action_SurfaceTension : public Action { std::vector block_power_; ///< Combined |h_q|² for the open block std::vector q_grid_; ///< |q| for each Fourier mode (Å⁻¹) + PubFFT fft_n1_; ///< 1-D FFT along lateral axis 1 (nx) + PubFFT fft_n2_; ///< 1-D FFT along lateral axis 2 (ny) + ComplexArray fft_grid_; ///< nx×ny complex grid for the 2-D FFT + ComplexArray fft_row_; ///< Length-ny row buffer + ComplexArray fft_col_; ///< Length-nx column buffer + int nx_; ///< Bins along lateral axis 1 int ny_; ///< Bins along lateral axis 2 int nz_; ///< Density bins along the slab normal From ff489f3d75ba85b3132a77b88a4ddf1791ad4cec Mon Sep 17 00:00:00 2001 From: Nate Levinzon Date: Wed, 23 Sep 2026 10:09:53 -0600 Subject: [PATCH 05/33] Enhance 'surftension' command with new options and functionality - Updated the 'surftension' command to support an additional mask for lower surfaces, allowing for single or double interface configurations. - Introduced new parameters: 'nsurf' to specify the number of interfaces, 'side' to select the interface for single interface cases, and 'summaryout' for outputting a key/value summary file. - Adjusted the default behavior for 'qmin' and added 'blocktime' and 'dt' parameters for better control over analysis. - Enhanced documentation in ChangeLog to reflect these changes and added tests for new functionalities in the RunTest script. - Bumped version to 7.11.0 to signify the addition of these features. Co-authored-by: Cursor --- doc/ChangeLog.surftension.md | 24 +- doc/ChangeLog.v7.md | 26 +- src/Action_SurfaceTension.cpp | 934 +------------------------------ src/Action_SurfaceTension.h | 172 +----- src/Command.cpp | 3 - src/Version.h | 4 - test/Test_SurfTension/RunTest.sh | 127 +---- 7 files changed, 55 insertions(+), 1235 deletions(-) mode change 100755 => 100644 test/Test_SurfTension/RunTest.sh diff --git a/doc/ChangeLog.surftension.md b/doc/ChangeLog.surftension.md index ef4b712978..9f231f4a32 100644 --- a/doc/ChangeLog.surftension.md +++ b/doc/ChangeLog.surftension.md @@ -14,26 +14,16 @@ Working log for the capillary-wave surface-tension Action. New command `surftension` added under New Commands. Internal version `V7.11.0`. ``` -<<<<<<< HEAD surftension [] [mask2 ] temp [normal {x|y|z}] [nsurf {1|2}] [side {upper|lower}] [interface {willard|itim}] -======= -surftension [] temp - [normal {x|y|z}] [interface {willard|itim}] ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) [gridspacing ] [dz | dnormal ] [sigmaxy ] [sigmaz | sigmanormal ] [bulkhalfwidth ] [threshold ] [qmin ] [qmax ] [lx ] [ly ] [lz ] -<<<<<<< HEAD [nblock ] [dt ] [blocktime ] - [out | spectrumout ] [roughout ] [blockout ] - [summaryout ] -======= - [nblock ] [spectrumout ] [roughout ] [blockout ] ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) + [summaryout ] [spectrumagr ] [roughagr ] [blockagr ] [spectrumgnu ] [roughgnu ] [blockgnu ] ``` @@ -94,8 +84,6 @@ surftension [] temp `sigmanormal` ≡ `sigmaz` (error if both given and they differ). Init/Print report e.g. `Slab normal: z (interface plane x-y)`. Warns on non-orthogonal boxes. -<<<<<<< HEAD -<<<<<<< HEAD - Height-field 2-D FFT uses cpptraj `PubFFT` (row-column 1-D FFTs), then divides by `nx*ny` (numpy `fft2` convention). Same `S(q)` as the old direct DFT. Per-block γ/κ print in `Print()`, not during the frame loop. @@ -110,16 +98,6 @@ surftension [] temp is a second mask for the lower surface (leaflet / liquid–liquid); the upper surface then comes from `` with no mid-box split. Both masks share one circular recenter so the film is not split apart. -- `out` is an alias for `spectrumout`. Init now errors if an `*out` path - names a directory that does not exist (DataFiles are opened only after - `run`, which previously lost a full trajectory write). -======= ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) -======= -- Height-field 2-D FFT uses cpptraj `PubFFT` (row-column 1-D FFTs), then - divides by `nx*ny` (numpy `fft2` convention). Same `S(q)` as the old - direct DFT. Per-block γ/κ print in `Print()`, not during the frame loop. ->>>>>>> 5b484999 (Implement 2-D FFT for height fields in Action_SurfaceTension) --- diff --git a/doc/ChangeLog.v7.md b/doc/ChangeLog.v7.md index 082bdc4350..c49fdc32c0 100644 --- a/doc/ChangeLog.v7.md +++ b/doc/ChangeLog.v7.md @@ -19,7 +19,6 @@ New Commands plateau of q²⟨|h_q|²⟩. κ (kT) is the Helfrich slope of 1/(q² S) vs q². `normal {x|y|z}` selects the slab normal (default z). `interface {willard|itim}` selects a Willard-Chandler density isosurface (default) or ITIM per-column min/max. -<<<<<<< HEAD Default is two interfaces (e.g. a water slab with vacuum at +z and −z). `nsurf 1` with `side {upper|lower}` is a single interface. `mask2` supplies a second atom set for the lower surface (leaflet / liquid–liquid). Lateral lengths come from @@ -27,36 +26,21 @@ New Commands 2π/max(Lt1,Lt2) from the first frame. `blocktime` (ps) with `dt` sets `nblock`. Optional outputs (`spectrumout`, `roughout`, `blockout`, `summaryout`) follow the filename extension (`.agr`/`.xmgr` = xmgrace, `.gnu` = gnuplot). Dedicated - `*agr`/`*gnu` keywords force Grace or gnuplot. `fprefix` is prepended to each - of those file names. Parent directories must already exist. MPI-parallel - (packed spectral SUM to the master). Assumes NVT (fixed lateral box lengths). + `*agr`/`*gnu` keywords force Grace or gnuplot. Parent directories must already + exist. MPI-parallel (packed spectral SUM to the master). Assumes NVT (fixed + lateral box lengths). ``` surftension [] [mask2 ] temp [normal {x|y|z}] [nsurf {1|2}] [side {upper|lower}] [interface {willard|itim}] -======= - Optional outputs (`spectrumout`, `roughout`, `blockout`) follow the filename extension - (`.agr`/`.xmgr` = xmgrace, `.gnu` = gnuplot). Dedicated `*agr`/`*gnu` - keywords force Grace or gnuplot. MPI-parallel (packed - spectral SUM to the master). Assumes NVT (fixed lateral box lengths). - -``` -surftension [] temp - [normal {x|y|z}] [interface {willard|itim}] ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) [gridspacing ] [dz | dnormal ] [sigmaxy ] [sigmaz | sigmanormal ] [bulkhalfwidth ] [threshold ] [qmin ] [qmax ] [lx ] [ly ] [lz ] -<<<<<<< HEAD - [nblock ] [dt ] [blocktime ] [fprefix ] - [out | spectrumout ] [roughout ] [blockout ] - [summaryout ] -======= - [nblock ] + [nblock ] [dt ] [blocktime ] [spectrumout ] [roughout ] [blockout ] ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) + [summaryout ] [spectrumagr ] [roughagr ] [blockagr ] [spectrumgnu ] [roughgnu ] [blockgnu ] ``` diff --git a/src/Action_SurfaceTension.cpp b/src/Action_SurfaceTension.cpp index 813fd00b4f..0d13c2bbf3 100644 --- a/src/Action_SurfaceTension.cpp +++ b/src/Action_SurfaceTension.cpp @@ -1,32 +1,11 @@ // Action_SurfaceTension // Capillary-wave surface tension of a liquid slab (Cartesian normal x, y, or z). -<<<<<<< HEAD -// Formulae, units, and references: Action_SurfaceTension.h -// -// Per-frame pipeline (after Init / Setup): -// 1. Permute Cartesian (x,y,z) into (t1, t2, n) for the chosen normal. -// 2. Wrap laterals into [0, L_α). Recenter the normal so the circular -// mean of the film sits at L_n/2 (one shared shift if mask2 is set). -// 3. Instantaneous height h(t1, t2): Willard–Chandler isosurface or ITIM. -// 4. Roughness w = √⟨(h − ⟨h⟩)²⟩ and power |h_q|² from the DFT -// h_q = (1/(N₁ N₂)) Σ (h − ⟨h⟩) exp(−i q · r) -// 5. Print() forms S(q) ≡ ⟨|h_q|²⟩, shell-averages, then -// S(q) = k_B T / [A (γ q² + κ q⁴)] -// -// NVT: first good frame freezes N₁, N₂, L₁, L₂ (and N_n for Willard). -// \author Nathan D. Levinzon -======= // See Action_SurfaceTension.h for the physical formulae. // \author Nathan D Levinzon ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) #include #include #include #include -<<<<<<< HEAD -#include -======= ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) #include #include "Action_SurfaceTension.h" #include "Constants.h" @@ -34,11 +13,7 @@ #include "DataFile.h" #include "DataSet_1D.h" #include "DataSet_Mesh.h" -<<<<<<< HEAD #include "CpptrajFile.h" -#include "FileName.h" -======= ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) #include "Frame.h" #ifdef _OPENMP # include @@ -47,16 +22,6 @@ // File-local helpers. Names are prefixed ST_ so they do not collide with // other Action translation units. -<<<<<<< HEAD -/// k_B (J/K), CODATA 2018. γ uses SI: k_B T / (A_m² ⟨q² S⟩), then ×1000 → mN/m. -static const double ST_KB = 1.380649e-23; -/// Ų → m² so A in the CWT formula is consistent with γ in N/m. -static const double ST_ANG2_TO_M2 = 1.0e-20; -/// scipy.ndimage.gaussian_filter default: kernel radius = truncate × σ (pixels). -static const double ST_GAUSS_TRUNCATE = 4.0; - -/// \return true if x is finite (not NaN or ±Inf). Used to reject failed crossings. -======= /// Boltzmann constant (J/K); SI, matching the reference Python analysis. static const double ST_KB = 1.380649e-23; /// Convert Ų → m². @@ -65,7 +30,6 @@ static const double ST_ANG2_TO_M2 = 1.0e-20; static const double ST_GAUSS_TRUNCATE = 4.0; /// \return true if x is finite (not NaN or ±Inf). ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) static inline bool ST_Finite(double x) { return (x == x) && (x < std::numeric_limits::infinity()) && @@ -76,20 +40,12 @@ static inline double ST_NaN() { return std::numeric_limits::quiet_NaN(); } -<<<<<<< HEAD -/// Linear index of ρ(i₁, i₂, i_n) with the normal the fastest dimension. -======= /// Linear index of density_(ix, iy, iz) with z the fastest dimension. ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) static inline size_t ST_Idx3(int ix, int iy, int iz, int ny, int nz) { return ((size_t)ix * (size_t)ny + (size_t)iy) * (size_t)nz + (size_t)iz; } -<<<<<<< HEAD -/// Linear index of an N₁×N₂ field, row-major in the first lateral index. -======= /// Linear index of an nx×ny field stored row-major in x, then y. ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) static inline size_t ST_Idx2(int ix, int iy, int ny) { return (size_t)ix * (size_t)ny + (size_t)iy; } @@ -99,14 +55,7 @@ static inline int ST_IRound(double x) { return (int)floor(x + 0.5); } -<<<<<<< HEAD -/** Minimum-image wrap of a Cartesian coordinate into [0, L). - * fmod of a negative argument is negative on IEEE-754; that case is lifted - * back into the interval. x == L maps to 0 so the last bin is not empty. - */ -======= /** Wrap x into [0, L). Handles negative values; maps x == L back to 0. */ ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) static double ST_Wrap(double x, double L) { if (L <= 0.0) return x; double y = fmod(x, L); @@ -115,13 +64,9 @@ static double ST_Wrap(double x, double L) { return y; } -<<<<<<< HEAD -/** Circular mean of the film along the periodic normal, in Å. - * Map n → θ = 2π n / L_n and take atan2(⟨sin θ⟩, ⟨cos θ⟩). A slab that - * straddles n = 0 is then a single cluster on the circle. n2 may be 0; - * when both masks are given they share this one mean so leaflets are not - * pulled onto the same mid-box plane independently. - * \return the lab-frame coordinate of that mean, in [0, L_n). +/** Circular-mean slab center along the normal (periodic). n2 may be 0. + * Mapping n → θ = 2π n / L, then atan2(⟨sin θ⟩, ⟨cos θ⟩), so a slab that + * straddles the periodic boundary is still recentered correctly. */ static double ST_CircularSlabCenter(std::vector const& n1, int n1n, std::vector const* n2, int n2n, @@ -153,72 +98,35 @@ static double ST_CircularSlabCenter(std::vector const& n1, int n1n, return L * angle / Constants::TWOPI; } -/** Shift n so slab_center maps to L_n/2, then wrap into [0, L_n). */ static void ST_ApplyCircularRecenter(std::vector& n, double L, double slab_center) { if (n.empty() || L <= 0.0) return; -======= -/** Recenter a periodic slab so its circular mean along the normal lies at L/2. - * Mapping n → θ = 2π n / L, then using atan2(⟨sin θ⟩, ⟨cos θ⟩), avoids - * failure when the slab straddles the periodic boundary. - */ -static void ST_CircularRecenter(std::vector& n, double L) { - if (n.empty() || L <= 0.0) return; - double mean_sin = 0.0; - double mean_cos = 0.0; - for (size_t i = 0; i < n.size(); i++) { - double theta = Constants::TWOPI * ST_Wrap(n[i], L) / L; - mean_sin += sin(theta); - mean_cos += cos(theta); - } - mean_sin /= (double)n.size(); - mean_cos /= (double)n.size(); - double angle = atan2(mean_sin, mean_cos); - if (angle < 0.0) angle += Constants::TWOPI; - double slab_center = L * angle / Constants::TWOPI; ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) for (size_t i = 0; i < n.size(); i++) n[i] = ST_Wrap(n[i] - slab_center + 0.5 * L, L); } -<<<<<<< HEAD -/** Recenter one atom set so its circular mean along the normal lies at L_n/2. */ +/** Recenter a periodic slab so its circular mean along the normal lies at L/2. */ static void ST_CircularRecenter(std::vector& n, double L) { if (n.empty() || L <= 0.0) return; ST_ApplyCircularRecenter(n, L, ST_CircularSlabCenter(n, (int)n.size(), 0, 0, L)); } -/// ASCII name of a Cartesian axis for Help / mprintf (terminals are not UTF-8). -======= /// Cartesian axis name for Help / mprintf (ASCII). ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) static const char* ST_AxisName(int axis) { if (axis == 0) return "x"; if (axis == 1) return "y"; return "z"; } -<<<<<<< HEAD -/// Names of the two lateral axes for Cartesian normal ∈ {0,1,2} = {x,y,z}. -======= /// Lateral axis names for a given Cartesian normal. ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) static void ST_PlaneAxes(int normal, const char*& t1, const char*& t2) { if (normal == 0) { t1 = "y"; t2 = "z"; } else if (normal == 1) { t1 = "x"; t2 = "z"; } else { t1 = "x"; t2 = "y"; } } -<<<<<<< HEAD -/** Permute (L_x, L_y, L_z) into (L₁, L₂, L_n). - * n = z: L₁ = L_x, L₂ = L_y, L_n = L_z - * n = y: L₁ = L_x, L₂ = L_z, L_n = L_y - * n = x: L₁ = L_y, L₂ = L_z, L_n = L_x - */ -======= /// Split Cartesian box lengths into lateral 1, lateral 2, and normal. ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) static void ST_SplitBox(int normal, double Lx, double Ly, double Lz, double& Lt1, double& Lt2, double& Ln) { @@ -227,11 +135,7 @@ static void ST_SplitBox(int normal, double Lx, double Ly, double Lz, else { Lt1 = Lx; Lt2 = Ly; Ln = Lz; } } -<<<<<<< HEAD -/// Same permutation as ST_SplitBox, applied to one Cartesian point. -======= /// Split a Cartesian point into lateral 1, lateral 2, and normal. ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) static void ST_SplitXYZ(int normal, double x, double y, double z, double& t1, double& t2, double& n) { @@ -240,15 +144,8 @@ static void ST_SplitXYZ(int normal, double x, double y, double z, else { t1 = x; t2 = y; n = z; } } -<<<<<<< HEAD -/** Normalized 1-D Gaussian matching scipy.ndimage._gaussian_kernel1d. - * σ is in pixels (Å / bin width). Radius = round(4 σ). Weights are - * K_i = exp(−i² / (2 σ²)) / Σ_j K_j , i ∈ [−R, R] - * An empty kernel (σ ≤ 0) means that axis is left unfiltered. -======= /** Normalized 1-D Gaussian kernel matching scipy.ndimage._gaussian_kernel1d. * σ is in pixels. Radius = round(4 σ). Empty kernel means “do not filter”. ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) */ static void ST_GaussianKernel(double sigma, std::vector& kernel) { kernel.clear(); @@ -269,13 +166,8 @@ static void ST_GaussianKernel(double sigma, std::vector& kernel) { } } -<<<<<<< HEAD -/** Periodic 1-D convolution, out[i] = Σ_k K_k in[(i+k) mod N]. - * The Gaussian is even, so convolution and correlation are identical. -======= /** 1-D convolution with periodic (wrap) boundaries. * The Gaussian kernel is symmetric, so correlate and convolve agree. ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) */ static void ST_ConvolveWrap(std::vector const& in, std::vector const& kernel, std::vector& out) @@ -301,17 +193,10 @@ static void ST_ConvolveWrap(std::vector const& in, std::vector c } } -<<<<<<< HEAD -/** Separable periodic Gaussian on ρ(i₁, i₂, i_n), Willard–Chandler coarse-graining. - * σ_α in pixels (Å / Δ_α), same as scipy.ndimage.gaussian_filter. Three - * 1-D passes (n, then t2, then t1). OpenMP: each line in a pass is - * independent; one parallel region reuses thread-local buffers. -======= /** Separable Gaussian smooth of ρ(ix,iy,iz) with periodic boundaries on every axis. * σx, σy, σz are in pixels (Å / bin width), as in scipy.ndimage.gaussian_filter. * OpenMP: each 1-D line in a pass is independent. One parallel region covers * the z, y, and x passes so thread-local line buffers are reused. ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) */ static void ST_GaussianFilter3D(std::vector& rho, int nx, int ny, int nz, double sigma_x, double sigma_y, double sigma_z) @@ -382,19 +267,10 @@ static void ST_GaussianFilter3D(std::vector& rho, int nx, int ny, int nz } } -<<<<<<< HEAD -/** Willard–Chandler crossing along one lateral column. - * Walk from the slab mid-plane toward +n (upper) or −n (lower). The - * interface is the first point where ρ drops through θ ρ_bulk, with θ - * the threshold fraction. Linear interpolation between the two bins: - * n* = n_k + (θ ρ_bulk − ρ_k) (n_{k±1} − n_k) / (ρ_{k±1} − ρ_k) - * \return NaN if no crossing exists (caller skips the frame). -======= /** Locate the instantaneous interface along one lateral column. * Walks from the slab center toward +n (upper) or -n (lower) and returns the * linearly interpolated normal coordinate where rho crosses the bulk-density * threshold. \return NaN if no crossing is found. ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) */ static double ST_FindCrossing(std::vector const& z_grid, std::vector const& density, @@ -427,29 +303,17 @@ static double ST_FindCrossing(std::vector const& z_grid, return ST_NaN(); } -<<<<<<< HEAD -/** ITIM in the probe → 0 limit, after the film has been recentered at L_n/2. - * Each lateral column is split at mid-box: - * h_upper = max { n_i | n_i ≥ L_n/2 } (need_u) - * h_lower = min { n_i | n_i < L_n/2 } (need_l) - * An empty required half-column returns false (skip the frame). This is - * not a finite-radius ITIM probe; it is the min/max of the mask. -======= /** ITIM-style slab interfaces after circular recentering at Ln/2. * In each lateral column: upper = max n of atoms with n >= Ln/2, lower = min n * of atoms with n < Ln/2. Empty half-columns return false. * t1/t2/n are lateral 1, lateral 2, and the slab normal. ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) */ static bool ST_ItimMinMax(std::vector const& t1, std::vector const& t2, std::vector const& n, int natom, double Lt1, double Lt2, double Ln, int nx, int ny, -<<<<<<< HEAD bool need_u, bool need_l, -======= ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) std::vector& h_upper, std::vector& h_lower) { @@ -477,7 +341,6 @@ static bool ST_ItimMinMax(std::vector const& t1, } } for (size_t i = 0; i < n2; i++) { -<<<<<<< HEAD if (need_u && !has_u[i]) return false; if (need_l && !has_l[i]) return false; if (need_u) h_upper[i] = zmax[i]; @@ -486,11 +349,7 @@ static bool ST_ItimMinMax(std::vector const& t1, return true; } -/** Two-mask ITIM (leaflet / liquid–liquid): no mid-box split. - * h_upper(i₁,i₂) = max n of mask 1 in that column - * h_lower(i₁,i₂) = min n of mask 2 in that column - * \return false if any required column is empty. - */ +/** ITIM from two atom sets: upper = max n of set 1, lower = min n of set 2. */ static bool ST_ItimTwoMasks(std::vector const& t1u, std::vector const& t2u, std::vector const& nu, @@ -533,8 +392,6 @@ static bool ST_ItimTwoMasks(std::vector const& t1u, has_l[idx] = 1; } for (size_t i = 0; i < n2; i++) { -======= ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) if (!has_u[i] || !has_l[i]) return false; h_upper[i] = zmax[i]; h_lower[i] = zmin[i]; @@ -542,11 +399,7 @@ static bool ST_ItimTwoMasks(std::vector const& t1u, return true; } -<<<<<<< HEAD -/** Extract (t1, t2, n) for one mask. Laterals are wrapped into [0, L_α); - * the normal is left unshifted. Recenter is applied afterwards so two - * masks can share one circular mean. - */ +/** Split Cartesian coordinates into wrapped laterals and a recentered normal. */ static void ST_SplitAtomCoords(Frame const& frm, AtomMask const& mask, int nax, double Lx, double Ly, double Lz, std::vector& t1, std::vector& t2, @@ -569,13 +422,7 @@ static void ST_SplitAtomCoords(Frame const& frm, AtomMask const& mask, int nax, } } -/** Number density of mask atoms in the mid-slab slab |n − L_n/2| ≤ w (Å⁻³). - * Volume is L₁ L₂ (2w). Used for the rhobulk DataSet on the ITIM path; - * Willard–Chandler ρ_bulk is the laterally averaged coarse-grained field. - */ -======= /** Number density of mask atoms with |n - Ln/2| <= bulk_halfwidth (Ang^-3). */ ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) static double ST_RhoBulkFromAtoms(std::vector const& ncoord, int natom, double Lt1, double Lt2, double Ln, double bulk_halfwidth) @@ -591,14 +438,7 @@ static double ST_RhoBulkFromAtoms(std::vector const& ncoord, int natom, return (double)nbulk / vol; } -<<<<<<< HEAD -/** Capillary roughness of one instantaneous surface, in Å: - * w = √⟨ (h − ⟨h⟩)² ⟩_{i₁,i₂} - * the RMS of the same field whose DFT gives S(q). - */ -======= /** RMS height fluctuation w = √⟨(h − ⟨h⟩)²⟩_xy (Å). */ ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) static double ST_RMS(std::vector const& h) { if (h.empty()) return ST_NaN(); double mean = 0.0; @@ -613,14 +453,8 @@ static double ST_RMS(std::vector const& h) { return sqrt(acc / (double)h.size()); } -<<<<<<< HEAD -/** Cyclic frequency of DFT bin k on an N-point grid of spacing Δ (Å). - * Mode index n ∈ (−N/2, N/2]; frequency is n / (N Δ) = n / L_α. - * Wavevector component is then q_α = 2π n / L_α (Å⁻¹). -======= /** Sample frequencies, identical to numpy.fft.fftfreq(n, d)[k]. * d is the real-space sample spacing (Å). Result is in Å⁻¹. ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) */ static double ST_FftFreq(int k, int n, double d) { int p; @@ -631,58 +465,7 @@ static double ST_FftFreq(int k, int n, double d) { return (double)p / ((double)n * d); } -<<<<<<< HEAD -<<<<<<< HEAD -/** |q| = √(q₁² + q₂²) on the N₁×N₂ Fourier mesh, q_α = 2π n_α / L_α. */ -======= -/** 2-D power spectrum of a height field. - * Subtract ⟨h⟩ (q = 0 translation), then - * h_q = (1 / N) Σ h(x,y) exp(−i q · r) N = nx ny - * which matches numpy.fft.fft2(h) / h.size. Power is |h_q|² (Ų). - * Direct DFT is used so nx, ny need not be powers of two. - * OpenMP: each (kx, ky) mode is independent; the loop is flattened so it - * does not need collapse() (OpenMP 3.0), matching other cpptraj Actions. - */ -static void ST_HeightPower(std::vector const& h, int nx, int ny, - std::vector& power) -{ - int nxy = nx * ny; - power.assign((size_t)nxy, 0.0); - if (nxy == 0) return; - double mean = 0.0; - for (int i = 0; i < nxy; i++) - mean += h[i]; - mean /= (double)nxy; - double Ninv = 1.0 / (double)nxy; - int k; -# ifdef _OPENMP -# pragma omp parallel for schedule(dynamic) -# endif - for (k = 0; k < nxy; k++) { - int kx = k / ny; - int ky = k - kx * ny; - double re = 0.0; - double im = 0.0; - for (int ix = 0; ix < nx; ix++) { - for (int iy = 0; iy < ny; iy++) { - double hv = h[ST_Idx2(ix, iy, ny)] - mean; - double ang = Constants::TWOPI * - ((double)kx * (double)ix / (double)nx + - (double)ky * (double)iy / (double)ny); - re += hv * cos(ang); - im -= hv * sin(ang); - } - } - re *= Ninv; - im *= Ninv; - power[k] = re * re + im * im; - } -} - -======= ->>>>>>> 5b484999 (Implement 2-D FFT for height fields in Action_SurfaceTension) /** |q| = √(qx² + qy²) for each Fourier mode, qx = 2π fftfreq(nx, Lx/nx). */ ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) static void ST_MakeQGrid(int nx, int ny, double Lx, double Ly, std::vector& q) { q.resize((size_t)nx * (size_t)ny); double dx = Lx / (double)nx; @@ -696,15 +479,6 @@ static void ST_MakeQGrid(int nx, int ny, double Lx, double Ly, std::vector>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) }; /// Sort shells by increasing |q|. @@ -720,15 +493,8 @@ static bool ST_ShellQCmp(ST_Shell const& a, ST_Shell const& b) { return a.q < b.q; } -<<<<<<< HEAD -/** Isotropic shell average of the 2-D spectrum. - * Modes with the same q² rounded to 10 decimal places (numpy / pandas - * round(q², 10)) are one shell. The q = 0 (mean-height) mode is dropped. - * Each shell stores the mean |q| and the mean of S, S_upper, S_lower. -======= /** Isotropic shell average: group modes with the same q² (10 decimal places), * as in pandas round(q², decimals=10). q = 0 is dropped. ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) */ static void ST_ShellAverage(std::vector const& q, std::vector const& combined, @@ -768,21 +534,11 @@ static void ST_ShellAverage(std::vector const& q, std::sort(shells.begin(), shells.end(), ST_ShellQCmp); } -<<<<<<< HEAD -/** Capillary-wave γ from the small-q plateau of q² S(q). - * S(q) = k_B T / (A γ q²) (κ → 0) - * γ = k_B T / (A ⟨q² S(q)⟩) - * ⟨…⟩ is an equal-weight mean over shells on [q_min, q_max]. - * A is converted Ų → m²; γ is then ×1000 → mN/m. - * Needs at least two shells. - * \return 0 on success, 1 on failure (γ / ⟨q² S⟩ set to NaN). -======= /** Capillary-wave γ from the mean q² S(q) plateau on [qmin, qmax]. * plateau = ⟨ q² S(q) ⟩_shells * γ (N/m) = k_B T / (A plateau), then ×1000 → mN/m * Equal weight per q-shell. Needs at least two shells. * \return 0 on success, 1 on failure (γ/plateau set to NaN). ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) */ static int ST_CalcGamma(std::vector const& shells, double temperature, double area_A2, double qmin, double qmax, @@ -806,21 +562,12 @@ static int ST_CalcGamma(std::vector const& shells, double temperature, return 0; } -<<<<<<< HEAD -/** Helfrich inversion of S(q) = k_B T / [A (γ q² + κ q⁴)]: - * 1/(q² S) = (A / k_B T) (γ + κ q²) = a + b q² - * γ = k_B T a / A (N/m, then ×1000 → mN/m) - * κ / k_B T = b / A (A in Ų) - * q in Å⁻¹, S in Ų; q² S is dimensionless. Equal weight per shell. - * Needs at least three shells with S > 0. -======= /** Helfrich fit on [qmin, qmax]: * 1 / (q² S) = a + b q² * q in Å⁻¹, S in Ų, so q² S is dimensionless. * γ (mN/m) = 1000 k_B T a / A_m² (intercept) * κ / kT = b / A_Ų (slope) * Equal weight per shell. Needs at least three shells with S > 0. ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) * \return 0 on success, 1 on failure (outputs set to NaN). */ static int ST_CalcKappa(std::vector const& shells, double temperature, @@ -856,14 +603,7 @@ static int ST_CalcKappa(std::vector const& shells, double temperature, return 0; } -<<<<<<< HEAD -/** Apparent κ(q)/k_B T at one shell, given a reference γ (mN/m). - * Invert S = k_B T / [A (γ q² + κ q⁴)] → κ / k_B T = [1/(q² S) − A γ / k_B T] / (A q²). - * Negative κ is allowed (the linear Helfrich slope may change sign). - */ -======= /** Apparent κ(q)/kT given γ (mN/m): invert γ q² + κ q⁴ at one shell. */ ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) static double ST_ShellKappa(double q, double S, double temperature, double area_A2, double gamma_mNm) { @@ -878,13 +618,7 @@ static double ST_ShellKappa(double q, double S, double temperature, double area_ return b / area_A2; } -<<<<<<< HEAD -/** Apparent γ(q) = k_B T / (A q² S(q)) from one shell, in mN/m. - * Equals the plateau γ only where q² S is flat (κ → 0). - */ -======= /** Apparent γ(q) = k_B T / (A q² S(q)) in mN/m. */ ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) static double ST_ShellGamma(double q, double S, double temperature, double area_A2) { double q2S = q * q * S; if (q2S <= 0.0) return ST_NaN(); @@ -892,14 +626,8 @@ static double ST_ShellGamma(double q, double S, double temperature, double area_ return 1000.0 * ST_KB * temperature / (area_m2 * q2S); } -<<<<<<< HEAD -/** OLS slope of ln S vs ln q on [q_min, q_max]. - * Pure capillary waves have S(q) ∝ q⁻², so the slope is −2. A slope - * near −4 is Helfrich-dominated. Sfield selects S / S_upper / S_lower. -======= /** Ordinary least-squares slope of log S vs log q on [qmin, qmax]. * Ideal capillary waves give slope ≈ −2. Sfield selects S / Stop / Sbot. ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) */ static double ST_LogSlope(std::vector const& shells, double qmin, double qmax, double ST_Shell::* Sfield) @@ -932,7 +660,6 @@ static void ST_AddSetToFiles(DataSet* ds, DataFile* a, DataFile* b, DataFile* c) if (c != 0) c->AddDataSet(ds); } -<<<<<<< HEAD /// Write a key/value line; skip non-finite doubles. static void ST_SummaryD(CpptrajFile* f, const char* key, double v) { if (f == 0 || !ST_Finite(v)) return; @@ -949,38 +676,8 @@ static void ST_SummaryS(CpptrajFile* f, const char* key, const char* v) { f->Printf("%s %s\n", key, v); } -/** Prepend fprefix to the basename; directory is unchanged. Empty name stays empty. */ -static FileName ST_OutName(std::string const& name, std::string const& prefix) { - if (name.empty()) return FileName(); - FileName fn(name); - if (prefix.empty()) return fn; - return fn.PrependFileName(prefix); -} - -/** DataFiles are opened only at the end of the run. Fail at Init if the - * parent directory is missing so a long trajectory is not processed only - * to lose the write. - */ -static int ST_CheckParentDir(FileName const& fn, const char* key) { - if (fn.empty()) return 0; - std::string dir = fn.DirPrefix_NoSlash(); - if (dir.empty()) return 0; - struct stat st; - if (stat(dir.c_str(), &st) != 0) { - mprinterr("Error: Directory '%s' for %s does not exist.\n", dir.c_str(), key); - mprinterr("Error: Create it first, or give a filename in the current directory.\n"); - return 1; - } - return 0; -} - -static int ST_CheckParentDir(DataFile* df, const char* key) { - if (df == 0) return 0; - return ST_CheckParentDir(df->DataFilename(), key); -} - // ----------------------------------------------------------------------------- -/// CONSTRUCTOR — Willard–Chandler, nsurf 2, normal z; grid / σ match the Python. +/// CONSTRUCTOR — defaults match the reference Python analysis. Action_SurfaceTension::Action_SurfaceTension() : iface_(WILLARD), normal_(AXIS_Z), @@ -990,13 +687,6 @@ Action_SurfaceTension::Action_SurfaceTension() : do_upper_(true), do_lower_(true), qmin_specified_(false), -======= -// ----------------------------------------------------------------------------- -/// CONSTRUCTOR — defaults match the reference Python analysis. -Action_SurfaceTension::Action_SurfaceTension() : - iface_(WILLARD), - normal_(AXIS_Z), ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) temp_(-1.0), gridspacing_(2.5), dz_(1.0), @@ -1004,7 +694,6 @@ Action_SurfaceTension::Action_SurfaceTension() : sigma_z_(1.5), bulk_halfwidth_(5.0), threshold_frac_(0.5), -<<<<<<< HEAD qmin_(-1.0), qmax_(0.174649), q_fundamental_(0.0), @@ -1016,25 +705,13 @@ Action_SurfaceTension::Action_SurfaceTension() : nblock_(0), debug_(0), n_skip_warn_(0), -======= - qmin_(0.033283), - qmax_(0.174649), - lx_user_(-1.0), - ly_user_(-1.0), - lz_user_(-1.0), - nblock_(0), - debug_(0), ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) S_(0), S_top_(0), S_bot_(0), q2S_(0), q2S_top_(0), q2S_bot_(0), gammaq_(0), gammaq_top_(0), gammaq_bot_(0), kappaq_(0), kappaq_top_(0), kappaq_bot_(0), wtop_(0), wbot_(0), wmean_(0), rhobulk_(0), block_gamma_(0), block_kappa_(0), block_wmean_(0), block_wtop_(0), block_wbot_(0), -<<<<<<< HEAD summaryFile_(0), -======= ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) nx_(0), ny_(0), nz_(0), Lt1_ref_(0.0), Lt2_ref_(0.0), grid_ready_(false), @@ -1044,24 +721,16 @@ Action_SurfaceTension::Action_SurfaceTension() : {} // Action_SurfaceTension::Help() -<<<<<<< HEAD -/** ASCII-only (terminals). Formulae live in the class header, not here. */ void Action_SurfaceTension::Help() const { mprintf("\t[] [mask2 ] temp \n" "\t[normal {x|y|z}] [nsurf {1|2}] [side {upper|lower}]\n" "\t[interface {willard|itim}]\n" -======= -void Action_SurfaceTension::Help() const { - mprintf("\t[] temp \n" - "\t[normal {x|y|z}] [interface {willard|itim}]\n" ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) "\t[gridspacing ] [dz | dnormal ]\n" "\t[sigmaxy ] [sigmaz | sigmanormal ]\n" "\t[bulkhalfwidth ] [threshold ]\n" "\t[qmin ] [qmax ] [lx ] [ly ] [lz ]\n" -<<<<<<< HEAD - "\t[nblock ] [dt ] [blocktime ] [fprefix ]\n" - "\t[out | spectrumout ] [roughout ] [blockout ]\n" + "\t[nblock ] [dt ] [blocktime ]\n" + "\t[spectrumout ] [roughout ] [blockout ]\n" "\t[summaryout ]\n" "\t[spectrumagr ] [roughagr ] [blockagr ]\n" "\t[spectrumgnu ] [roughgnu ] [blockgnu ]\n" @@ -1074,51 +743,17 @@ void Action_SurfaceTension::Help() const { " the upper surface then comes from with no mid-box split.\n" " If qmin is omitted it is 2*pi/max(Lt1,Lt2) from the first frame.\n" " blocktime (ps) with dt (analyzed-frame spacing, ps) sets nblock.\n" - " out is an alias for spectrumout. Write to the current directory,\n" - " e.g. spectrumout spec.dat roughout rough.dat blockout blocks.dat.\n" - " fprefix is prepended to each of those file names (directory unchanged),\n" - " e.g. fprefix 150K_ spectrumout spec.dat writes 150K_spec.dat.\n" - " A directory in the name must already exist; it is not created.\n"); -======= - "\t[nblock ]\n" - "\t[spectrumout ] [roughout ] [blockout ]\n" - "\t[spectrumagr ] [roughagr ] [blockagr ]\n" - "\t[spectrumgnu ] [roughgnu ] [blockgnu ]\n" - " Calculate capillary-wave surface tension (mN/m) for a liquid slab.\n" - " normal x|y|z selects the slab normal (default z). gridspacing and\n" - " sigmaxy apply in the interface plane; dz (alias dnormal) and sigmaz\n" - " (alias sigmanormal) apply along the normal. should select\n" - " interfacial density atoms (e.g. ':WAT@O'). Interfaces are a\n" - " Willard-Chandler Gaussian density isosurface (default) or ITIM\n" - " per-column min/max of , split at mid-box along the normal.\n" - " Height fluctuations are Fourier transformed; gamma is the small-q\n" - " plateau of q^2 <|h_q|^2>. kappa (kT) is the slope of 1/(q^2 S) vs\n" - " q^2 on the same q window. lx/ly/lz optionally replace Cartesian box\n" - " lengths. Lateral lengths are held fixed (NVT). Assumes an X-aligned\n" - " orthogonal box. DataSets are always created; files are written only\n" - " when the matching *out/*agr/*gnu keyword is given. *out format\n" - " follows the extension (.agr/.xmgr = xmgrace, .gnu = gnuplot,\n" - " otherwise ASCII). *agr/*gnu force Grace or gnuplot. In MPI,\n" - " nblock is per-rank; spectra are summed onto the master.\n"); ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) + " Output files are written only to paths the user gives; parent\n" + " directories must already exist.\n"); } // Action_SurfaceTension::Init() /** Parse keywords, allocate DataSets, attach optional output files. -<<<<<<< HEAD - * Spectrum / roughness meshes always exist so writedata can dump them after - * Print() fills S(q). Files are written only if the matching *out / *agr / - * *gnu keyword is given. Parent directories are checked here: DataFiles - * open only after run, so a missing path would otherwise lose the write. - * out is an alias for spectrumout. agr/gnu force Grace / gnuplot. - * Contains() is called before getKey* so flags are not already consumed. -======= * Spectrum / roughness DataSets always exist so writedata can dump them. * Files are written only if the matching *out / *agr / *gnu keyword is given. * *out uses the DataFile writer for the filename extension (canonical * cpptraj: .agr/.xmgr = Grace/xmgrace, .gnu = gnuplot). agr/gnu keywords force * DataFile::XMGRACE / GNUPLOT even when the extension is not recognized. ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) */ Action::RetType Action_SurfaceTension::Init(ArgList& actionArgs, ActionInit& init, int debugIn) { @@ -1127,58 +762,6 @@ Action::RetType Action_SurfaceTension::Init(ArgList& actionArgs, ActionInit& ini # endif debug_ = debugIn; // Optional output files. AddDataFile returns 0 if the keyword is absent. -<<<<<<< HEAD - // out == spectrumout (usual cpptraj keyword for the main result file). - // fprefix is prepended to each basename so multiple runs can share a directory. - std::string fprefix = actionArgs.GetStringKey("fprefix"); - bool has_spectrumout = actionArgs.Contains("spectrumout"); - bool has_out = actionArgs.Contains("out"); - std::string specname = actionArgs.GetStringKey("spectrumout"); - std::string outname = actionArgs.GetStringKey("out"); - if (has_spectrumout && has_out && specname != outname) { - mprinterr("Error: 'out' and 'spectrumout' both specified and differ.\n"); - return Action::ERR; - } - if (specname.empty()) - specname = outname; - bool has_summaryout = actionArgs.Contains("summaryout"); - FileName specFileName = ST_OutName(specname, fprefix); - FileName roughName = ST_OutName(actionArgs.GetStringKey("roughout"), fprefix); - FileName blockName = ST_OutName(actionArgs.GetStringKey("blockout"), fprefix); - FileName specAgrName = ST_OutName(actionArgs.GetStringKey("spectrumagr"), fprefix); - FileName roughAgrName = ST_OutName(actionArgs.GetStringKey("roughagr"), fprefix); - FileName blockAgrName = ST_OutName(actionArgs.GetStringKey("blockagr"), fprefix); - FileName specGnuName = ST_OutName(actionArgs.GetStringKey("spectrumgnu"), fprefix); - FileName roughGnuName = ST_OutName(actionArgs.GetStringKey("roughgnu"), fprefix); - FileName blockGnuName = ST_OutName(actionArgs.GetStringKey("blockgnu"), fprefix); - FileName sumName = ST_OutName(actionArgs.GetStringKey("summaryout"), fprefix); - DataFile* spectrumFile = init.DFL().AddDataFile(specFileName, actionArgs); - DataFile* roughFile = init.DFL().AddDataFile(roughName, actionArgs); - DataFile* blockFile = init.DFL().AddDataFile(blockName, actionArgs); - DataFile* spectrumAgr = init.DFL().AddDataFile(specAgrName, actionArgs, DataFile::XMGRACE); - DataFile* roughAgr = init.DFL().AddDataFile(roughAgrName, actionArgs, DataFile::XMGRACE); - DataFile* blockAgr = init.DFL().AddDataFile(blockAgrName, actionArgs, DataFile::XMGRACE); - DataFile* spectrumGnu = init.DFL().AddDataFile(specGnuName, actionArgs, DataFile::GNUPLOT); - DataFile* roughGnu = init.DFL().AddDataFile(roughGnuName, actionArgs, DataFile::GNUPLOT); - DataFile* blockGnu = init.DFL().AddDataFile(blockGnuName, actionArgs, DataFile::GNUPLOT); - summaryFile_ = init.DFL().AddCpptrajFile(sumName, "SurfTension summary"); - if (has_summaryout && summaryFile_ == 0) { - mprinterr("Error: Could not open summaryout '%s'.\n", sumName.full()); - return Action::ERR; - } - if (ST_CheckParentDir(sumName, "summaryout")) - return Action::ERR; - if (ST_CheckParentDir(spectrumFile, "spectrumout") || - ST_CheckParentDir(roughFile, "roughout") || - ST_CheckParentDir(blockFile, "blockout") || - ST_CheckParentDir(spectrumAgr, "spectrumagr") || - ST_CheckParentDir(roughAgr, "roughagr") || - ST_CheckParentDir(blockAgr, "blockagr") || - ST_CheckParentDir(spectrumGnu, "spectrumgnu") || - ST_CheckParentDir(roughGnu, "roughgnu") || - ST_CheckParentDir(blockGnu, "blockgnu")) - return Action::ERR; -======= DataFile* spectrumFile = init.DFL().AddDataFile(actionArgs.GetStringKey("spectrumout"), actionArgs); DataFile* roughFile = init.DFL().AddDataFile(actionArgs.GetStringKey("roughout"), actionArgs); DataFile* blockFile = init.DFL().AddDataFile(actionArgs.GetStringKey("blockout"), actionArgs); @@ -1188,7 +771,7 @@ Action::RetType Action_SurfaceTension::Init(ArgList& actionArgs, ActionInit& ini DataFile* spectrumGnu = init.DFL().AddDataFile(actionArgs.GetStringKey("spectrumgnu"), actionArgs, DataFile::GNUPLOT); DataFile* roughGnu = init.DFL().AddDataFile(actionArgs.GetStringKey("roughgnu"), actionArgs, DataFile::GNUPLOT); DataFile* blockGnu = init.DFL().AddDataFile(actionArgs.GetStringKey("blockgnu"), actionArgs, DataFile::GNUPLOT); ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) + summaryFile_ = init.DFL().AddCpptrajFile(actionArgs.GetStringKey("summaryout"), "SurfTension summary"); temp_ = actionArgs.getKeyDouble("temp", -1.0); if (temp_ <= 0.0) { @@ -1199,12 +782,8 @@ Action::RetType Action_SurfaceTension::Init(ArgList& actionArgs, ActionInit& ini sigma_xy_ = actionArgs.getKeyDouble("sigmaxy", 2.5); bulk_halfwidth_ = actionArgs.getKeyDouble("bulkhalfwidth", 5.0); threshold_frac_ = actionArgs.getKeyDouble("threshold", 0.5); -<<<<<<< HEAD qmin_specified_ = actionArgs.Contains("qmin"); qmin_ = actionArgs.getKeyDouble("qmin", -1.0); -======= - qmin_ = actionArgs.getKeyDouble("qmin", 0.033283); ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) qmax_ = actionArgs.getKeyDouble("qmax", 0.174649); bool has_lx = actionArgs.Contains("lx"); bool has_ly = actionArgs.Contains("ly"); @@ -1212,15 +791,11 @@ Action::RetType Action_SurfaceTension::Init(ArgList& actionArgs, ActionInit& ini lx_user_ = actionArgs.getKeyDouble("lx", -1.0); ly_user_ = actionArgs.getKeyDouble("ly", -1.0); lz_user_ = actionArgs.getKeyDouble("lz", -1.0); -<<<<<<< HEAD bool has_nblock = actionArgs.Contains("nblock"); bool has_blocktime = actionArgs.Contains("blocktime"); nblock_ = actionArgs.getKeyInt("nblock", 0); dt_ = actionArgs.getKeyDouble("dt", -1.0); blocktime_ = actionArgs.getKeyDouble("blocktime", -1.0); -======= - nblock_ = actionArgs.getKeyInt("nblock", 0); ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) // dz / dnormal and sigmaz / sigmanormal are aliases (normal-axis spacing / sigma). bool has_dz = actionArgs.Contains("dz"); @@ -1277,7 +852,6 @@ Action::RetType Action_SurfaceTension::Init(ArgList& actionArgs, ActionInit& ini return Action::ERR; } -<<<<<<< HEAD nsurf_ = actionArgs.getKeyInt("nsurf", 2); if (nsurf_ != 1 && nsurf_ != 2) { mprinterr("Error: nsurf must be 1 or 2.\n"); @@ -1319,8 +893,6 @@ Action::RetType Action_SurfaceTension::Init(ArgList& actionArgs, ActionInit& ini if (Mask2_.SetMaskString(mask2exp)) return Action::ERR; } -======= ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) if (has_lx && lx_user_ <= 0.0) { mprinterr("Error: lx must be > 0.\n"); return Action::ERR; @@ -1356,7 +928,6 @@ Action::RetType Action_SurfaceTension::Init(ArgList& actionArgs, ActionInit& ini mprinterr("Error: bulkhalfwidth must be > 0.\n"); return Action::ERR; } -<<<<<<< HEAD if (qmax_ <= 0.0) { mprinterr("Error: qmax must be > 0.\n"); return Action::ERR; @@ -1392,22 +963,12 @@ Action::RetType Action_SurfaceTension::Init(ArgList& actionArgs, ActionInit& ini } nblock_ = nfromtime; } -======= - if (qmax_ <= qmin_) { - mprinterr("Error: qmax must be greater than qmin.\n"); - return Action::ERR; - } ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) if (nblock_ < 0) { mprinterr("Error: nblock must be >= 0.\n"); return Action::ERR; } if ((blockFile != 0 || blockAgr != 0 || blockGnu != 0) && nblock_ < 1) { -<<<<<<< HEAD mprinterr("Error: 'blockout'/'blockagr'/'blockgnu' require 'nblock' or 'blocktime'.\n"); -======= - mprinterr("Error: 'blockout'/'blockagr'/'blockgnu' require 'nblock '.\n"); ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) return Action::ERR; } @@ -1454,11 +1015,7 @@ Action::RetType Action_SurfaceTension::Init(ArgList& actionArgs, ActionInit& ini kappaq_top_->SetDim(Dimension::X, qdim); kappaq_bot_->SetDim(Dimension::X, qdim); // Print() fills these from the accumulated spectra; they are not time series. -<<<<<<< HEAD - // MPI: SyncAction reduces |h_q|²; skip DataSet concat of empty meshes. -======= // MPI: SyncAction reduces |h_q|^2; skip DataSet concat of empty meshes. ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) # ifdef MPI S_->SetNeedsSync(false); S_top_->SetNeedsSync(false); S_bot_->SetNeedsSync(false); q2S_->SetNeedsSync(false); q2S_top_->SetNeedsSync(false); q2S_bot_->SetNeedsSync(false); @@ -1506,11 +1063,8 @@ Action::RetType Action_SurfaceTension::Init(ArgList& actionArgs, ActionInit& ini mprintf(" SURFTENSION: Capillary-wave surface tension.\n"); mprintf("\tMask: '%s'\n", Mask_.MaskString()); -<<<<<<< HEAD if (has_mask2_) mprintf("\tMask2 (lower surface): '%s'\n", Mask2_.MaskString()); -======= ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) { const char* t1 = 0; const char* t2 = 0; @@ -1518,7 +1072,6 @@ Action::RetType Action_SurfaceTension::Init(ArgList& actionArgs, ActionInit& ini mprintf("\tSlab normal: %s (interface plane %s-%s)\n", ST_AxisName((int)normal_), t1, t2); } -<<<<<<< HEAD if (nsurf_ == 2) mprintf("\tSurfaces: 2 (upper and lower; vacuum/second phase on both sides).\n"); else @@ -1527,21 +1080,14 @@ Action::RetType Action_SurfaceTension::Init(ArgList& actionArgs, ActionInit& ini mprintf("\tInterface: Willard-Chandler density isosurface.\n"); else if (has_mask2_) mprintf("\tInterface: ITIM (upper = max of mask, lower = min of mask2).\n"); -======= - if (iface_ == WILLARD) - mprintf("\tInterface: Willard-Chandler density isosurface.\n"); ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) else mprintf("\tInterface: ITIM min/max (per-column, split at mid-box along %s).\n", ST_AxisName((int)normal_)); mprintf("\tTemperature= %g K\n", temp_); -<<<<<<< HEAD mprintf("\tLateral box lengths: from the unit cell"); if (lx_user_ > 0.0 || ly_user_ > 0.0 || lz_user_ > 0.0) mprintf(" (some Cartesian lengths overridden)"); mprintf(".\n"); -======= ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) mprintf("\tInterface-plane grid spacing= %g Ang\n", gridspacing_); if (iface_ == WILLARD) { mprintf("\tNormal-axis bin spacing (dz)= %g Ang\n", dz_); @@ -1552,7 +1098,6 @@ Action::RetType Action_SurfaceTension::Init(ArgList& actionArgs, ActionInit& ini } else { mprintf("\tBulk half-width (rho_bulk only)= %g Ang\n", bulk_halfwidth_); } -<<<<<<< HEAD if (qmin_specified_) mprintf("\tFit q range= %g to %g Ang^-1\n", qmin_, qmax_); else @@ -1560,16 +1105,6 @@ Action::RetType Action_SurfaceTension::Init(ArgList& actionArgs, ActionInit& ini qmax_); mprintf("\tHelfrich kappa: linear fit of 1/(q^2 S) vs q^2 on that window.\n"); mprintf("\tHeight-field 2-D FFT: PubFFT (numpy fft2 / (nx*ny)).\n"); - if (!fprefix.empty()) - mprintf("\tOutput file prefix: '%s'\n", fprefix.c_str()); -======= - mprintf("\tFit q range= %g to %g Ang^-1\n", qmin_, qmax_); - mprintf("\tHelfrich kappa: linear fit of 1/(q^2 S) vs q^2 on that window.\n"); -<<<<<<< HEAD ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) -======= - mprintf("\tHeight-field 2-D FFT: PubFFT (numpy fft2 / (nx*ny)).\n"); ->>>>>>> 5b484999 (Implement 2-D FFT for height fields in Action_SurfaceTension) if (lx_user_ > 0.0) mprintf("\tUsing fixed Lx= %g Ang (%s)\n", lx_user_, (normal_ == AXIS_X) ? "normal" : "lateral"); @@ -1581,11 +1116,8 @@ Action::RetType Action_SurfaceTension::Init(ArgList& actionArgs, ActionInit& ini (normal_ == AXIS_Z) ? "normal" : "lateral"); if (nblock_ > 0) { mprintf("\tBlock averaging every %i analyzed frames", nblock_); -<<<<<<< HEAD if (blocktime_ > 0.0 && dt_ > 0.0) mprintf(" (blocktime %g ps, dt %g ps)", blocktime_, dt_); -======= ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) # ifdef MPI if (trajComm_.Size() > 1) mprintf(" (per rank)"); @@ -1619,11 +1151,8 @@ Action::RetType Action_SurfaceTension::Init(ArgList& actionArgs, ActionInit& ini mprintf("\tBlock Grace output to '%s'\n", blockAgr->DataFilename().full()); if (blockGnu != 0) mprintf("\tBlock gnuplot output to '%s'\n", blockGnu->DataFilename().full()); -<<<<<<< HEAD if (summaryFile_ != 0) mprintf("\tSummary output to '%s'\n", summaryFile_->Filename().full()); -======= ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) # ifdef _OPENMP { int nthreads = 1; @@ -1633,20 +1162,8 @@ Action::RetType Action_SurfaceTension::Init(ArgList& actionArgs, ActionInit& ini nthreads = omp_get_num_threads(); } if (nthreads > 1) { -<<<<<<< HEAD -<<<<<<< HEAD if (iface_ == WILLARD) mprintf("\tOpenMP: 3-D Gaussian filter parallelized with %i threads.\n", nthreads); -======= - mprintf("\tOpenMP: 2-D DFT"); - if (iface_ == WILLARD) - mprintf(" and 3-D Gaussian filter"); - mprintf(" parallelized with %i threads.\n", nthreads); ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) -======= - if (iface_ == WILLARD) - mprintf("\tOpenMP: 3-D Gaussian filter parallelized with %i threads.\n", nthreads); ->>>>>>> 5b484999 (Implement 2-D FFT for height fields in Action_SurfaceTension) } } # endif @@ -1658,12 +1175,6 @@ Action::RetType Action_SurfaceTension::Init(ArgList& actionArgs, ActionInit& ini } // Action_SurfaceTension::Setup() -<<<<<<< HEAD -/** Require an orthorhombic unit cell (L₁, L₂, L_n) and bind the mask(s). - * Non-X-aligned boxes are warned: laterals are wrapped independently. - */ -======= ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) Action::RetType Action_SurfaceTension::Setup(ActionSetup& setup) { if (!setup.CoordInfo().HasBox()) { @@ -1681,7 +1192,6 @@ Action::RetType Action_SurfaceTension::Setup(ActionSetup& setup) mprintf("Warning: Mask '%s' selects no atoms.\n", Mask_.MaskString()); return Action::SKIP; } -<<<<<<< HEAD if (has_mask2_) { if (setup.Top().SetupIntegerMask(Mask2_)) return Action::ERR; Mask2_.MaskInfo(); @@ -1690,20 +1200,10 @@ Action::RetType Action_SurfaceTension::Setup(ActionSetup& setup) return Action::SKIP; } } -======= ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) return Action::OK; } // Action_SurfaceTension::AllocateGrid() -<<<<<<< HEAD -/** First good frame: freeze N₁, N₂, L₁, L₂ and (Willard) N_n. - * Allocates ρ, h, |h_q|² accumulators, PubFFT plans, and q_α = 2π n_α / L_α. - * If q_min was omitted it is set to 2π / max(L₁, L₂). - * \return 0 OK, 1 fatal (FFT setup or q_max ≤ q_min). - */ -======= ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) int Action_SurfaceTension::AllocateGrid(int nx, int ny, int nz) { nx_ = nx; ny_ = ny; @@ -1714,23 +1214,16 @@ int Action_SurfaceTension::AllocateGrid(int nx, int ny, int nz) { density_.assign(n3, 0.0); else density_.clear(); -<<<<<<< HEAD if (nz > 0 && has_mask2_) density2_.assign(n3, 0.0); else density2_.clear(); -======= ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) h_upper_.assign(n2, 0.0); h_lower_.assign(n2, 0.0); total_power_.assign(n2, 0.0); top_power_.assign(n2, 0.0); bottom_power_.assign(n2, 0.0); block_power_.assign(n2, 0.0); -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> 5b484999 (Implement 2-D FFT for height fields in Action_SurfaceTension) if (fft_n1_.SetupFFTforN(nx_) || fft_n2_.SetupFFTforN(ny_)) { mprinterr("Error: Could not set up 2-D FFT (nx = %i, ny = %i).\n", nx_, ny_); return 1; @@ -1738,14 +1231,7 @@ int Action_SurfaceTension::AllocateGrid(int nx, int ny, int nz) { fft_grid_.Allocate(nx_ * ny_); fft_row_.Allocate(ny_); fft_col_.Allocate(nx_); -<<<<<<< HEAD ST_MakeQGrid(nx_, ny_, Lt1_ref_, Lt2_ref_, q_grid_); -======= -======= ->>>>>>> 5b484999 (Implement 2-D FFT for height fields in Action_SurfaceTension) - ST_MakeQGrid(nx_, ny_, Lt1_ref_, Lt2_ref_, q_grid_); - grid_ready_ = true; ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) double qmin_acc = 0.0; bool haveq = false; for (size_t i = 0; i < q_grid_.size(); i++) { @@ -1760,8 +1246,6 @@ int Action_SurfaceTension::AllocateGrid(int nx, int ny, int nz) { mprintf("\tInterface grid = %i x %i", nx_, ny_); if (nz_ > 0) mprintf(" x %i", nz_); -<<<<<<< HEAD -<<<<<<< HEAD mprintf(" bins along %s, %s", t1, t2); if (nz_ > 0) mprintf(", %s", ST_AxisName((int)normal_)); @@ -1789,7 +1273,6 @@ int Action_SurfaceTension::AllocateGrid(int nx, int ny, int nz) { return 0; } -/** Cap skip-frame warnings at 5, then one “further messages suppressed.” */ void Action_SurfaceTension::SkipWarn(const char* msg) { const int maxw = 5; @@ -1801,12 +1284,6 @@ void Action_SurfaceTension::SkipWarn(const char* msg) } // Action_SurfaceTension::WillardHeights() -/** Willard–Chandler heights from one atom set into the given density buffer. - * Histogram atoms onto N₁×N₂×N_n, convert to number density (Å⁻³), apply - * the periodic Gaussian, take ρ_bulk as the mid-slab lateral mean, then - * find the ±n crossings of θ ρ_bulk. Writes h_upper_ / h_lower_. - * \return 0 OK, 1 skip (no bulk bins, ρ_bulk ≤ 0, or a column has no crossing). - */ int Action_SurfaceTension::WillardHeights(std::vector const& t1, std::vector const& t2, std::vector const& ncoord, @@ -1910,89 +1387,6 @@ int Action_SurfaceTension::WillardHeights(std::vector const& t1, return 0; } -// Action_SurfaceTension::HeightPower() -/** Discrete Fourier transform of h − ⟨h⟩ (row–column 1-D PubFFTs). - * h_q = (1/(N₁ N₂)) Σ (h − ⟨h⟩) exp(−i q · r) - * implemented as unnormalized FFTW / numpy fft2, then ÷ (N₁ N₂). - * Power is |h_q|² (Ų). fft_n2_ along n₂; fft_n1_ along n₁. - */ -void Action_SurfaceTension::HeightPower(std::vector const& h, - std::vector& power) -{ - int nx = nx_; - int ny = ny_; - int nxy = nx * ny; - power.assign((size_t)nxy, 0.0); - if (nxy == 0) return; - - double mean = 0.0; - for (int i = 0; i < nxy; i++) - mean += h[i]; - mean /= (double)nxy; - - for (int ix = 0; ix < nx; ix++) { - for (int iy = 0; iy < ny; iy++) { - int idx = ST_Idx2(ix, iy, ny); - fft_grid_[2 * idx] = h[idx] - mean; - fft_grid_[2 * idx + 1] = 0.0; - } - } - - for (int ix = 0; ix < nx; ix++) { - int base = ix * ny; - for (int iy = 0; iy < ny; iy++) { - fft_row_[2 * iy] = fft_grid_[2 * (base + iy)]; - fft_row_[2 * iy + 1] = fft_grid_[2 * (base + iy) + 1]; - } - fft_n2_.Forward(fft_row_); - for (int iy = 0; iy < ny; iy++) { - fft_grid_[2 * (base + iy)] = fft_row_[2 * iy]; - fft_grid_[2 * (base + iy) + 1] = fft_row_[2 * iy + 1]; - } - } - - for (int iy = 0; iy < ny; iy++) { - for (int ix = 0; ix < nx; ix++) { - int idx = ST_Idx2(ix, iy, ny); - fft_col_[2 * ix] = fft_grid_[2 * idx]; - fft_col_[2 * ix + 1] = fft_grid_[2 * idx + 1]; - } - fft_n1_.Forward(fft_col_); - for (int ix = 0; ix < nx; ix++) { - int idx = ST_Idx2(ix, iy, ny); - fft_grid_[2 * idx] = fft_col_[2 * ix]; - fft_grid_[2 * idx + 1] = fft_col_[2 * ix + 1]; - } - } - - double Ninv = 1.0 / (double)nxy; - for (int k = 0; k < nxy; k++) { - double re = fft_grid_[2 * k] * Ninv; - double im = fft_grid_[2 * k + 1] * Ninv; - power[k] = re * re + im * im; - } -} - -// Action_SurfaceTension::ProcessFrame() -/** One NVT frame: permute → wrap / recenter → h(t1,t2) → w and |h_q|². - * First good frame freezes N₁, N₂, L₁, L₂ (and N_n for Willard). Later - * frames must keep the same lateral box (NVT). Combined power is summed - * over the surfaces actually used (nsurf 1 or 2). - * \return 0 OK, 1 skip frame, 2 fatal (grid or L₁, L₂ changed). -======= - mprintf(" (%s x %s", t1, t2); -======= - mprintf(" bins along %s, %s", t1, t2); ->>>>>>> efb16d90 (Refactor output formatting in Action_SurfaceTension.cpp for clarity and consistency) - if (nz_ > 0) - mprintf(", %s", ST_AxisName((int)normal_)); - mprintf("\n"); - mprintf("\tL(%s) = %g Ang, L(%s) = %g Ang\n", t1, Lt1_ref_, t2, Lt2_ref_); - if (haveq) - mprintf("\tSmallest accessible q = %g Ang^-1\n", qmin_acc); - return 0; -} - // Action_SurfaceTension::HeightPower() /** 2-D FFT of h − ⟨h⟩ via row-column PubFFT 1-D transforms, then * h_q = FFT2 / (nx ny) @@ -2061,7 +1455,6 @@ void Action_SurfaceTension::HeightPower(std::vector const& h, * then accumulate roughness and |h_q|^2. First good frame freezes nx, ny, * Lt1, Lt2 (and nz for Willard-Chandler). Cartesian Lx/Ly/Lz are permuted * into (Lt1, Lt2, Ln) according to normal_. ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) */ int Action_SurfaceTension::ProcessFrame(Frame const& frm, double Lx, double Ly, double Lz) { @@ -2069,7 +1462,6 @@ int Action_SurfaceTension::ProcessFrame(Frame const& frm, double Lx, double Ly, double Lt1, Lt2, Ln; ST_SplitBox(nax, Lx, Ly, Lz, Lt1, Lt2, Ln); -<<<<<<< HEAD std::vector t1, t2, n; ST_SplitAtomCoords(frm, Mask_, nax, Lx, Ly, Lz, t1, t2, n); int natom = Mask_.Nselected(); @@ -2086,23 +1478,6 @@ int Action_SurfaceTension::ProcessFrame(Frame const& frm, double Lx, double Ly, ST_CircularRecenter(n, Ln); } -======= - int natom = Mask_.Nselected(); - std::vector t1((size_t)natom), t2((size_t)natom), n((size_t)natom); - int idx = 0; - for (AtomMask::const_iterator at = Mask_.begin(); at != Mask_.end(); ++at, ++idx) { - const double* xyz = frm.XYZ(*at); - double a, b, c; - ST_SplitXYZ(nax, xyz[0], xyz[1], xyz[2], a, b, c); - t1[idx] = ST_Wrap(a, Lt1); - t2[idx] = ST_Wrap(b, Lt2); - n[idx] = c; - } - ST_CircularRecenter(n, Ln); - - // Same bin counts as the reference Python: max(8, round(L/spacing)) in the - // interface plane, max(32, round(Ln/dz)) along the normal (Willard only). ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) int nx = std::max(8, ST_IRound(Lt1 / gridspacing_)); int ny = std::max(8, ST_IRound(Lt2 / gridspacing_)); int nz = 0; @@ -2112,15 +1487,7 @@ int Action_SurfaceTension::ProcessFrame(Frame const& frm, double Lx, double Ly, if (!grid_ready_) { Lt1_ref_ = Lt1; Lt2_ref_ = Lt2; -<<<<<<< HEAD -<<<<<<< HEAD - if (AllocateGrid(nx, ny, nz)) return 2; -======= - AllocateGrid(nx, ny, nz); ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) -======= if (AllocateGrid(nx, ny, nz)) return 2; ->>>>>>> 5b484999 (Implement 2-D FFT for height fields in Action_SurfaceTension) } else { if (nx != nx_ || ny != ny_) { mprinterr("Error: Interface grid dimensions changed during the trajectory.\n"); @@ -2130,20 +1497,12 @@ int Action_SurfaceTension::ProcessFrame(Frame const& frm, double Lx, double Ly, mprinterr("Error: Lateral box dimensions changed. surftension assumes a fixed interface plane (NVT).\n"); return 2; } -<<<<<<< HEAD if (iface_ == WILLARD && nz != nz_) nz = nz_; -======= - if (iface_ == WILLARD && nz != nz_) { - // Normal-axis length may jitter slightly; keep the first-frame nz. - nz = nz_; - } ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) } double rho_bulk = 0.0; if (iface_ == ITIM) { -<<<<<<< HEAD if (has_mask2_) { rho_bulk = ST_RhoBulkFromAtoms(n, natom, Lt1, Lt2, Ln, bulk_halfwidth_); if (!ST_ItimTwoMasks(t1, t2, n, natom, t1b, t2b, nb, natom2, @@ -2198,133 +1557,13 @@ int Action_SurfaceTension::ProcessFrame(Frame const& frm, double Lx, double Ly, for (size_t i = 0; i < top_power_.size(); i++) { if (do_upper_) top_power_[i] += p_upper[i]; if (do_lower_) bottom_power_[i] += p_lower[i]; -======= - rho_bulk = ST_RhoBulkFromAtoms(n, natom, Lt1, Lt2, Ln, bulk_halfwidth_); - if (!ST_ItimMinMax(t1, t2, n, natom, Lt1, Lt2, Ln, nx_, ny_, h_upper_, h_lower_)) { - mprintf("Warning: Empty ITIM column; skipping frame.\n"); - return 1; - } - } else { - double dx = Lt1 / (double)nx_; - double dy = Lt2 / (double)ny_; - double dz = Ln / (double)nz_; - double voxel = dx * dy * dz; - // Histogram counts, then convert to number density (Ang^-3). - std::fill(density_.begin(), density_.end(), 0.0); - for (int i = 0; i < natom; i++) { - int ix = (int)floor(t1[i] / dx); - int iy = (int)floor(t2[i] / dy); - int iz = (int)floor(n[i] / dz); - if (ix < 0) ix = 0; - if (iy < 0) iy = 0; - if (iz < 0) iz = 0; - if (ix >= nx_) ix = nx_ - 1; - if (iy >= ny_) iy = ny_ - 1; - if (iz >= nz_) iz = nz_ - 1; - density_[ST_Idx3(ix, iy, iz, ny_, nz_)] += 1.0; - } - if (voxel > 0.0) { - for (size_t i = 0; i < density_.size(); i++) - density_[i] /= voxel; - } - - ST_GaussianFilter3D(density_, nx_, ny_, nz_, - sigma_xy_ / dx, sigma_xy_ / dy, sigma_z_ / dz); - - // Bin centers, matching 0.5 * (edges[:-1] + edges[1:]) of numpy.histogramdd. - std::vector n_grid((size_t)nz_); - for (int iz = 0; iz < nz_; iz++) - n_grid[iz] = ((double)iz + 0.5) * dz; - double slab_center = 0.5 * Ln; - int center_index = 0; - double best = fabs(n_grid[0] - slab_center); - for (int iz = 1; iz < nz_; iz++) { - double d = fabs(n_grid[iz] - slab_center); - if (d < best) { - best = d; - center_index = iz; - } - } - - std::vector rho_n((size_t)nz_, 0.0); - double nxy = (double)(nx_ * ny_); - for (int ix = 0; ix < nx_; ix++) { - for (int iy = 0; iy < ny_; iy++) { - for (int iz = 0; iz < nz_; iz++) - rho_n[iz] += density_[ST_Idx3(ix, iy, iz, ny_, nz_)]; - } - } - for (int iz = 0; iz < nz_; iz++) - rho_n[iz] /= nxy; - - // rho_bulk is the laterally averaged density within +/- bulk_halfwidth of Ln/2. - double rho_bulk_acc = 0.0; - int nbulk = 0; - for (int iz = 0; iz < nz_; iz++) { - if (fabs(n_grid[iz] - slab_center) <= bulk_halfwidth_) { - rho_bulk_acc += rho_n[iz]; - nbulk++; - } - } - if (nbulk < 1) { - mprintf("Warning: No bins along the normal fall within the bulk region; skipping frame.\n"); - return 1; - } - rho_bulk = rho_bulk_acc / (double)nbulk; - if (rho_bulk <= 0.0) { - mprintf("Warning: Bulk density is non-positive; skipping frame.\n"); - return 1; - } - double threshold = threshold_frac_ * rho_bulk; - - // One height pair per lateral column. Any missing crossing skips the frame. - std::vector col((size_t)nz_); - bool ok = true; - for (int ix = 0; ix < nx_ && ok; ix++) { - for (int iy = 0; iy < ny_; iy++) { - for (int iz = 0; iz < nz_; iz++) - col[iz] = density_[ST_Idx3(ix, iy, iz, ny_, nz_)]; - double hu = ST_FindCrossing(n_grid, col, threshold, center_index, true); - double hl = ST_FindCrossing(n_grid, col, threshold, center_index, false); - if (!ST_Finite(hu) || !ST_Finite(hl)) { - ok = false; - break; - } - h_upper_[ST_Idx2(ix, iy, ny_)] = hu; - h_lower_[ST_Idx2(ix, iy, ny_)] = hl; - } - } - if (!ok) { - mprintf("Warning: Could not identify a local interface; skipping frame.\n"); - return 1; - } - } - - double w_top = ST_RMS(h_upper_); - double w_bot = ST_RMS(h_lower_); - double w_mean = 0.5 * (w_top + w_bot); - - // Combined spectrum averages both surfaces (n_surfaces_ = 2 n_frames_). - std::vector p_upper, p_lower; - HeightPower(h_upper_, p_upper); - HeightPower(h_lower_, p_lower); - - for (size_t i = 0; i < top_power_.size(); i++) { - top_power_[i] += p_upper[i]; - bottom_power_[i] += p_lower[i]; ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) total_power_[i] += p_upper[i] + p_lower[i]; block_power_[i] += p_upper[i] + p_lower[i]; } n_frames_++; -<<<<<<< HEAD n_surfaces_ += nsurf_this; block_surface_count_ += nsurf_this; -======= - n_surfaces_ += 2; - block_surface_count_ += 2; ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) block_frame_count_++; block_w_sum_ += w_mean; block_wtop_sum_ += w_top; @@ -2343,14 +1582,7 @@ int Action_SurfaceTension::ProcessFrame(Frame const& frm, double Lx, double Ly, } // Action_SurfaceTension::FinishBlock() -<<<<<<< HEAD -/** Close one nblock window: S(q) = (Σ |h_q|²) / n_surfaces in the block, - * then the same CWT γ / κ fits as Print(). Incomplete final window is - * left in the running spectra but not written to blockout. - */ -======= /** Average the open-block power, fit γ and κ, store roughness means, then reset. */ ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) int Action_SurfaceTension::FinishBlock() { if (block_surface_count_ < 1 || block_frame_count_ < 1) return 0; std::vector spec(block_power_.size()); @@ -2363,14 +1595,7 @@ int Action_SurfaceTension::FinishBlock() { int err_g = ST_CalcGamma(shells, temp_, Lt1_ref_ * Lt2_ref_, qmin_, qmax_, gamma, plateau); int err_k = ST_CalcKappa(shells, temp_, Lt1_ref_ * Lt2_ref_, qmin_, qmax_, gamma_k, kappa_kT); (void)gamma_k; -<<<<<<< HEAD -<<<<<<< HEAD - (void)err_k; -======= ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) -======= (void)err_k; ->>>>>>> efb16d90 (Refactor output formatting in Action_SurfaceTension.cpp for clarity and consistency) if (err_g) { mprintf("Warning: Block %i: fewer than two q shells in the fit range; skipping block gamma.\n", n_blocks_ + 1); @@ -2386,18 +1611,6 @@ int Action_SurfaceTension::FinishBlock() { block_wtop_->Add(n_blocks_, &wtop); block_wbot_->Add(n_blocks_, &wbot); } -<<<<<<< HEAD -<<<<<<< HEAD -======= - if (err_k) - mprintf("\tBlock %i: gamma = %g mN/m, roughness = %g Ang\n", - n_blocks_ + 1, gamma, wmean); - else - mprintf("\tBlock %i: gamma = %g mN/m, kappa = %g kT, roughness = %g Ang\n", - n_blocks_ + 1, gamma, kappa_kT, wmean); ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) -======= ->>>>>>> efb16d90 (Refactor output formatting in Action_SurfaceTension.cpp for clarity and consistency) n_blocks_++; } std::fill(block_power_.begin(), block_power_.end(), 0.0); @@ -2408,21 +1621,10 @@ int Action_SurfaceTension::FinishBlock() { } // Action_SurfaceTension::DoAction() -<<<<<<< HEAD -/** Read the unit-cell lengths (or lx/ly/lz overrides) and ProcessFrame. - * Skip (Action::OK) if the box is missing or a crossing failed; ERR if - * the lateral grid changed (not NVT). - */ Action::RetType Action_SurfaceTension::DoAction(int, ActionFrame& frm) { if (!frm.Frm().BoxCrd().HasBox()) { SkipWarn("Frame has no box; skipping."); -======= -Action::RetType Action_SurfaceTension::DoAction(int, ActionFrame& frm) -{ - if (!frm.Frm().BoxCrd().HasBox()) { - mprintf("Warning: Frame has no box; skipping.\n"); ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) n_skipped_++; return Action::OK; } @@ -2432,11 +1634,7 @@ Action::RetType Action_SurfaceTension::DoAction(int, ActionFrame& frm) double Ly = (ly_user_ > 0.0) ? ly_user_ : lengths[1]; double Lz = (lz_user_ > 0.0) ? lz_user_ : lengths[2]; if (Lx <= 0.0 || Ly <= 0.0 || Lz <= 0.0) { -<<<<<<< HEAD SkipWarn("Invalid box lengths; skipping frame."); -======= - mprintf("Warning: Invalid box lengths; skipping frame.\n"); ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) n_skipped_++; return Action::OK; } @@ -2451,20 +1649,10 @@ Action::RetType Action_SurfaceTension::DoAction(int, ActionFrame& frm) #ifdef MPI // Action_SurfaceTension::SyncAction() -<<<<<<< HEAD -/** Reduce per-rank |h_q|² so Print() sees the global S(q) = ⟨|h_q|²⟩. - * Counts (frames, surfaces, skipped) AllReduce SUM. Grid size, L₁, L₂, - * q_min, and q_fundamental AllReduce MAX so empty ranks (zeros) do not - * clobber. One packed ReduceMaster SUM of combined / upper / lower - * power; |q| is a separate MAX. Roughness and block series stay on - * DataSet::Sync (concat by rank). nblock is per-rank. Print() is master - * only. -======= /** Radial-style reduction. Three small AllReduces (counts SUM, grid MAX, lateral * box MAX) then one packed ReduceMaster SUM of combined/upper/lower |h_q|^2 onto * the master. |q| uses a separate MAX (different MPI_Op). Print() is master * only. Roughness / block series use DataSet::Sync (concat by rank). ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) */ int Action_SurfaceTension::SyncAction() { if (trajComm_.Size() < 2) return 0; @@ -2482,19 +1670,12 @@ int Action_SurfaceTension::SyncAction() { int n2max = imax[0]; nx_ = imax[1]; ny_ = imax[2]; -<<<<<<< HEAD double box[4] = { Lt1_ref_, Lt2_ref_, qmin_, q_fundamental_ }; trajComm_.AllReduce(box, 4, MPI_DOUBLE, MPI_MAX); Lt1_ref_ = box[0]; Lt2_ref_ = box[1]; qmin_ = box[2]; q_fundamental_ = box[3]; -======= - double box[2] = { Lt1_ref_, Lt2_ref_ }; - trajComm_.AllReduce(box, 2, MPI_DOUBLE, MPI_MAX); - Lt1_ref_ = box[0]; - Lt2_ref_ = box[1]; ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) if (n2max < 1) return 0; if (n2 != 0 && n2 != n2max) { @@ -2540,15 +1721,7 @@ int Action_SurfaceTension::SyncAction() { #endif // Action_SurfaceTension::Print() -<<<<<<< HEAD -/** Form S(q) = (Σ |h_q|²) / n_surfaces, shell-average, then the CWT fits - * γ = k_B T / (A ⟨q² S⟩) , 1/(q² S) = (A / k_B T) (γ + κ q²) - * Fill the q-meshes, print the numeric summary, and write summaryout. - * Per-block γ / κ are printed here, not during the frame loop. - */ -======= /** Average accumulated spectra, fill q-meshes, report γ / roughness / blocks. */ ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) void Action_SurfaceTension::Print() { const char* t1 = 0; @@ -2561,15 +1734,12 @@ void Action_SurfaceTension::Print() mprintf("\tInterface: Willard-Chandler density isosurface.\n"); else mprintf("\tInterface: ITIM min/max.\n"); -<<<<<<< HEAD mprintf("\tSurfaces: %i", nsurf_); if (nsurf_ == 1) mprintf(" (%s)", (side_ == SIDE_UPPER) ? "upper" : "lower"); mprintf("\n"); if (has_mask2_) mprintf("\tMask2 (lower): '%s'\n", Mask2_.MaskString()); -======= ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) if (nblock_ > 0 && block_frame_count_ > 0) { mprintf("\tNOTE: Incomplete nblock window (%i frames) excluded from blockout.\n", block_frame_count_); @@ -2579,14 +1749,11 @@ void Action_SurfaceTension::Print() if (n_skipped_ > 0) mprinterr(" (%i skipped)", n_skipped_); mprinterr(".\n"); -<<<<<<< HEAD if (summaryFile_ != 0) { summaryFile_->Printf("# surftension summary\n"); ST_SummaryI(summaryFile_, "frames", 0); ST_SummaryI(summaryFile_, "skipped", n_skipped_); } -======= ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) return; } @@ -2603,15 +1770,9 @@ void Action_SurfaceTension::Print() // Fit γ on the combined, upper-only, and lower-only shells. double area = Lt1_ref_ * Lt2_ref_; -<<<<<<< HEAD - double gamma_full = ST_NaN(), plateau = ST_NaN(); - double gamma_top = ST_NaN(), plateau_top = ST_NaN(); - double gamma_bot = ST_NaN(), plateau_bot = ST_NaN(); -======= double gamma_full, plateau; double gamma_top, plateau_top; double gamma_bot, plateau_bot; ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) std::vector top_only = shells; std::vector bot_only = shells; for (size_t i = 0; i < shells.size(); i++) { @@ -2619,7 +1780,6 @@ void Action_SurfaceTension::Print() bot_only[i].S = shells[i].Sbot; } int err_full = ST_CalcGamma(shells, temp_, area, qmin_, qmax_, gamma_full, plateau); -<<<<<<< HEAD int err_top = 1, err_bot = 1; if (do_upper_) err_top = ST_CalcGamma(top_only, temp_, area, qmin_, qmax_, gamma_top, plateau_top); @@ -2627,25 +1787,13 @@ void Action_SurfaceTension::Print() err_bot = ST_CalcGamma(bot_only, temp_, area, qmin_, qmax_, gamma_bot, plateau_bot); (void)plateau_top; (void)plateau_bot; - double gamma_h = ST_NaN(), kappa_h = ST_NaN(); - double gamma_h_top = ST_NaN(), kappa_h_top = ST_NaN(); - double gamma_h_bot = ST_NaN(), kappa_h_bot = ST_NaN(); + double gamma_h, kappa_h, gamma_h_top, kappa_h_top, gamma_h_bot, kappa_h_bot; int err_kh = ST_CalcKappa(shells, temp_, area, qmin_, qmax_, gamma_h, kappa_h); int err_kh_top = 1, err_kh_bot = 1; if (do_upper_) err_kh_top = ST_CalcKappa(top_only, temp_, area, qmin_, qmax_, gamma_h_top, kappa_h_top); if (do_lower_) err_kh_bot = ST_CalcKappa(bot_only, temp_, area, qmin_, qmax_, gamma_h_bot, kappa_h_bot); -======= - int err_top = ST_CalcGamma(top_only, temp_, area, qmin_, qmax_, gamma_top, plateau_top); - int err_bot = ST_CalcGamma(bot_only, temp_, area, qmin_, qmax_, gamma_bot, plateau_bot); - (void)plateau_top; - (void)plateau_bot; - double gamma_h, kappa_h, gamma_h_top, kappa_h_top, gamma_h_bot, kappa_h_bot; - int err_kh = ST_CalcKappa(shells, temp_, area, qmin_, qmax_, gamma_h, kappa_h); - int err_kh_top = ST_CalcKappa(top_only, temp_, area, qmin_, qmax_, gamma_h_top, kappa_h_top); - int err_kh_bot = ST_CalcKappa(bot_only, temp_, area, qmin_, qmax_, gamma_h_bot, kappa_h_bot); ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) double gamma_for_kappaq = err_kh ? gamma_full : gamma_h; double slope = ST_LogSlope(shells, qmin_, qmax_, &ST_Shell::S); @@ -2672,7 +1820,6 @@ void Action_SurfaceTension::Print() double mean_w = 0.0, mean_wt = 0.0, mean_wb = 0.0; if (wmean_->Size() > 0) { -<<<<<<< HEAD int nu = 0, nl = 0; for (size_t i = 0; i < wmean_->Size(); i++) { mean_w += ((DataSet_1D*)wmean_)->Dval(i); @@ -2688,16 +1835,6 @@ void Action_SurfaceTension::Print() mean_w /= (double)wmean_->Size(); if (nu > 0) mean_wt /= (double)nu; if (nl > 0) mean_wb /= (double)nl; -======= - for (size_t i = 0; i < wmean_->Size(); i++) { - mean_w += ((DataSet_1D*)wmean_)->Dval(i); - mean_wt += ((DataSet_1D*)wtop_)->Dval(i); - mean_wb += ((DataSet_1D*)wbot_)->Dval(i); - } - mean_w /= (double)wmean_->Size(); - mean_wt /= (double)wtop_->Size(); - mean_wb /= (double)wbot_->Size(); ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) } mprintf("\tT = %g K\n", temp_); @@ -2705,20 +1842,11 @@ void Action_SurfaceTension::Print() if (n_skipped_ > 0) mprintf(" (%i skipped)", n_skipped_); mprintf("\n"); -<<<<<<< HEAD -<<<<<<< HEAD mprintf("\tL(%s) = %g Ang, L(%s) = %g Ang (from unit cell unless lx/ly/lz set)\n", t1, Lt1_ref_, t2, Lt2_ref_); mprintf("\tArea = %g Ang^2\n", area); if (q_fundamental_ > 0.0) mprintf("\tFundamental |q| = %g Ang^-1\n", q_fundamental_); -======= - mprintf("\t%s x %s = %g x %g Ang\n", t1, t2, Lt1_ref_, Lt2_ref_); -======= - mprintf("\tL(%s) = %g Ang, L(%s) = %g Ang\n", t1, Lt1_ref_, t2, Lt2_ref_); ->>>>>>> efb16d90 (Refactor output formatting in Action_SurfaceTension.cpp for clarity and consistency) - mprintf("\tArea = %g Ang^2\n", area); ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) mprintf("\tFit q range = %g to %g Ang^-1\n", qmin_, qmax_); if (ST_Finite(slope)) mprintf("\tLow-q log-log slope = %g (ideal capillary-wave slope is about -2)\n", slope); @@ -2741,7 +1869,6 @@ void Action_SurfaceTension::Print() mprintf("\tkappa, upper surface = %g kT\n", kappa_h_top); if (!err_kh_bot) mprintf("\tkappa, lower surface = %g kT\n", kappa_h_bot); -<<<<<<< HEAD if (do_upper_ && do_lower_ && ST_Finite(slope_top) && ST_Finite(slope_bot)) mprintf("\tLow-q slope upper/lower = %g / %g\n", slope_top, slope_bot); if (do_upper_ && do_lower_) @@ -2770,32 +1897,6 @@ void Action_SurfaceTension::Print() } double block_gmean = ST_NaN(), block_gsd = ST_NaN(), block_gsem = ST_NaN(); double block_kmean = ST_NaN(), block_ksd = ST_NaN(), block_ksem = ST_NaN(); -======= - if (ST_Finite(slope_top) && ST_Finite(slope_bot)) - mprintf("\tLow-q slope upper/lower = %g / %g\n", slope_top, slope_bot); - mprintf("\tMean roughness = %g Ang (upper %g, lower %g)\n", mean_w, mean_wt, mean_wb); - -<<<<<<< HEAD ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) -======= - if (block_gamma_ != 0 && block_gamma_->Size() > 0) { - mprintf("\tCompleted blocks = %zu (nblock = %i frames)\n", - block_gamma_->Size(), nblock_); - for (size_t i = 0; i < block_gamma_->Size(); i++) { - double g = ((DataSet_1D*)block_gamma_)->Dval(i); - double w = (block_wmean_ != 0) ? ((DataSet_1D*)block_wmean_)->Dval(i) : ST_NaN(); - double k = ST_NaN(); - if (block_kappa_ != 0 && i < block_kappa_->Size()) - k = ((DataSet_1D*)block_kappa_)->Dval(i); - if (ST_Finite(k)) - mprintf("\tBlock %zu: gamma = %g mN/m, kappa = %g kT, roughness = %g Ang\n", - i + 1, g, k, w); - else - mprintf("\tBlock %zu: gamma = %g mN/m, roughness = %g Ang\n", - i + 1, g, w); - } - } ->>>>>>> efb16d90 (Refactor output formatting in Action_SurfaceTension.cpp for clarity and consistency) if (block_gamma_ != 0 && block_gamma_->Size() > 1) { double gmean = 0.0, g2 = 0.0; for (size_t i = 0; i < block_gamma_->Size(); i++) { @@ -2808,12 +1909,9 @@ void Action_SurfaceTension::Print() (double)(block_gamma_->Size() - 1); double sd = (var > 0.0) ? sqrt(var) : 0.0; double sem = sd / sqrt((double)block_gamma_->Size()); -<<<<<<< HEAD block_gmean = gmean; block_gsd = sd; block_gsem = sem; -======= ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) mprintf("\tBlock mean gamma = %g mN/m\n", gmean); mprintf("\tBlock SD gamma = %g mN/m\n", sd); mprintf("\tBlock SEM gamma = %g mN/m\n", sem); @@ -2834,19 +1932,15 @@ void Action_SurfaceTension::Print() double var = (k2 - (double)nk * kmean * kmean) / (double)(nk - 1); double sd = (var > 0.0) ? sqrt(var) : 0.0; double sem = sd / sqrt((double)nk); -<<<<<<< HEAD block_kmean = kmean; block_ksd = sd; block_ksem = sem; -======= ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) mprintf("\tBlock mean kappa = %g kT\n", kmean); mprintf("\tBlock SD kappa = %g kT\n", sd); mprintf("\tBlock SEM kappa = %g kT\n", sem); mprintf("\tkappa +/- 2 SEM = %g kT\n", 2.0 * sem); } } -<<<<<<< HEAD if (summaryFile_ != 0) { summaryFile_->Printf("# surftension summary\n"); @@ -2885,6 +1979,4 @@ void Action_SurfaceTension::Print() ST_SummaryD(summaryFile_, "block_sd_kappa", block_ksd); ST_SummaryD(summaryFile_, "block_sem_kappa", block_ksem); } -======= ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) } diff --git a/src/Action_SurfaceTension.h b/src/Action_SurfaceTension.h index d3df2bb150..56c757ce2a 100644 --- a/src/Action_SurfaceTension.h +++ b/src/Action_SurfaceTension.h @@ -3,79 +3,22 @@ #include #include "Action.h" #include "AtomMask.h" -<<<<<<< HEAD -<<<<<<< HEAD #include "PubFFT.h" class DataSet_Mesh; class CpptrajFile; /// Capillary-wave surface tension of a liquid slab (Cartesian normal). -/** Instantaneous interfaces are a Willard–Chandler isosurface of a +/** Instantaneous interfaces are a Willard-Chandler isosurface of a * Gaussian-smoothed number-density field (default) or ITIM min/max. * Default is a two-interface slab (vacuum or a second phase on both * sides of the film). nsurf 1 is a single interface. An optional - * second mask supplies the lower surface (leaflet / liquid–liquid). - * Lateral lengths L₁, L₂ come from the unit cell unless lx/ly/lz are - * set. Area A = L₁ L₂. - * - * Discrete Fourier modes of the height (FFTW / numpy unnormalized - * transform, then divide by N): - * h_q = (1/(N₁ N₂)) Σ_{n₁,n₂} (h − ⟨h⟩) exp(−i q · r) - * q = (2π n₁/L₁, 2π n₂/L₂), S(q) ≡ ⟨|h_q|²⟩ - * - * Capillary-wave theory (Helfrich): - * S(q) = k_B T / [A (γ q² + κ q⁴)] - * Small-q (κ → 0): q² S(q) → k_B T / (A γ), so - * γ = k_B T / (A ⟨q² S(q)⟩) on [q_min, q_max] - * reported in mN/m (×1000 from N/m). If q_min is omitted it is the - * fundamental wavevector 2π / max(L₁, L₂). - * - * Bending modulus from the linear form - * 1/(q² S) = (A / k_B T) (γ + κ q²) - * intercept → γ, slope → κ / k_B T. - * - * \author Nathan D. Levinzon - * - * References (for interested parties or lowly PhD students like me): - * Willard–Chandler instantaneous interface - * A. P. Willard and D. Chandler, J. Phys. Chem. B 114, 1954 (2010). - * https://doi.org/10.1021/jp909219k - * ITIM (Identification of Truly Interfacial Molecules) - * L. B. Pártay, G. Hantal, P. Jedlovszky, Á. Vincze, and G. Horvai, - * J. Comput. Chem. 29, 945 (2008). - * https://doi.org/10.1002/jcc.20852 - * Capillary-wave theory - * F. P. Buff, R. A. Lovett, and F. H. Stillinger, - * Phys. Rev. Lett. 15, 621 (1965). - * https://doi.org/10.1103/PhysRevLett.15.621 - * Height-fluctuation surface tension in MD - * S. W. Sides, G. S. Grest, and M.-D. Lacasse, - * Phys. Rev. E 60, 6708 (1999). - * https://doi.org/10.1103/PhysRevE.60.6708 - * Helfrich bending energy - * W. Helfrich, Z. Naturforsch. C 28, 693 (1973). - * https://doi.org/10.1515/znc-1973-11-1209 -======= -======= -#include "PubFFT.h" ->>>>>>> 5b484999 (Implement 2-D FFT for height fields in Action_SurfaceTension) -class DataSet_Mesh; -/// Capillary-wave surface tension of a liquid slab (Cartesian normal). -/** Instantaneous upper and lower interfaces are either a Willard-Chandler - * isosurface of a Gaussian-smoothed number-density field (default) or an - * ITIM-style per-column min/max of , split at mid-box along the normal. - * Height fluctuations in the interface plane are Fourier transformed with - * cpptraj PubFFT (row-column 1-D FFTs) using the numpy convention + * second mask supplies the lower surface (leaflet / liquid-liquid). + * Lateral box lengths come from the unit cell unless lx/ly/lz are set. + * Height fluctuations are Fourier transformed with cpptraj PubFFT + * (row-column 1-D FFTs) using the numpy convention * h_q = (1 / N₁N₂) FFT2(h − ⟨h⟩) - * Capillary-wave theory including bending rigidity κ is - * ⟨|h_q|²⟩ = k_B T / (A (γ q² + κ q⁴)) - * so γ (mN/m) is obtained from the small-q plateau of q² S(q), and κ (in kT) - * from the slope of 1/(q² S) vs q² on the same window. - * The slab normal is x, y, or z (default z); gridspacing/sigmaxy apply in the - * interface plane and dz/sigmaz along the normal. Lateral box lengths are - * held fixed (NVT). DataSets are always created; files are written only when - * the matching *out keyword is given. MPI: packed ReduceMaster of |h_q|². + * γ (mN/m) from the small-q plateau of q² S(q); κ (kT) from the slope + * of 1/(q² S) vs q². If qmin is omitted it is 2π / max(Lt1, Lt2). * \author Nathan D Levinzon ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) */ class Action_SurfaceTension : public Action { public: @@ -88,21 +31,16 @@ class Action_SurfaceTension : public Action { Action::RetType DoAction(int, ActionFrame&); void Print(); # ifdef MPI -<<<<<<< HEAD -======= - /// Sum Fourier accumulators onto the master rank. ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) int SyncAction(); Parallel::Comm trajComm_; # endif -<<<<<<< HEAD int AllocateGrid(int, int, int); /** \return 0 OK, 1 skip frame, 2 fatal (grid or lateral box changed). */ int ProcessFrame(Frame const&, double, double, double); int FinishBlock(); void HeightPower(std::vector const&, std::vector&); - /// Willard–Chandler heights from one atom set into the given density buffer. + /// Willard-Chandler heights from one atom set into the given density buffer. /** \return 0 OK, 1 skip. */ int WillardHeights(std::vector const&, std::vector const&, std::vector const&, int, @@ -134,7 +72,7 @@ class Action_SurfaceTension : public Action { double threshold_frac_; double qmin_; double qmax_; - double q_fundamental_; ///< 2π / max(L₁, L₂) from the first good frame + double q_fund_; ///< min(2π/Lt1, 2π/Lt2) from the first good frame double lx_user_; double ly_user_; double lz_user_; @@ -199,97 +137,5 @@ class Action_SurfaceTension : public Action { double block_w_sum_; double block_wtop_sum_; double block_wbot_sum_; -======= - /// Allocate density / height / power arrays for the lateral grid (and nz). - int AllocateGrid(int, int, int); - /// Build interfaces and accumulate spectra for one frame. - /** \return 0 OK, 1 skip frame, 2 fatal (grid or lateral box changed). */ - int ProcessFrame(Frame const&, double, double, double); - /// Finish one complete nblock window (γ, κ, and roughness). - int FinishBlock(); - /// |h_q|² of a height field via 2-D PubFFT / (nx ny). - void HeightPower(std::vector const&, std::vector&); - - /// Instantaneous-interface definition. - enum IfaceType { WILLARD = 0, ITIM }; - /// Cartesian slab normal. - enum NormalAxis { AXIS_X = 0, AXIS_Y = 1, AXIS_Z = 2 }; - - AtomMask Mask_; ///< Atoms used for the number-density / ITIM field - IfaceType iface_; ///< Willard-Chandler isosurface or ITIM min/max - NormalAxis normal_; ///< Slab normal (default z) - - double temp_; ///< Temperature (K) - double gridspacing_; ///< Target bin spacing in the interface plane (Å) - double dz_; ///< Target bin spacing along the slab normal (Å) - double sigma_xy_; ///< Gaussian smoothing in the interface plane (Å) - double sigma_z_; ///< Gaussian smoothing along the slab normal (Å) - double bulk_halfwidth_; ///< Half-width around slab center for ρ_bulk (Å) - double threshold_frac_; ///< Interface is this fraction of ρ_bulk - double qmin_; ///< Fit-window minimum |q| (Å⁻¹) - double qmax_; ///< Fit-window maximum |q| (Å⁻¹) - double lx_user_; ///< Optional fixed box Lx; < 0 means use the box - double ly_user_; ///< Optional fixed box Ly; < 0 means use the box - double lz_user_; ///< Optional fixed box Lz; < 0 means use the box - int nblock_; ///< Frames per uncertainty block; 0 disables - int debug_; ///< Debug level from ActionInit - - // ----- Spectrum vs q; filled in Print() -------------------------------- - DataSet_Mesh* S_; ///< Combined S(q) = ⟨|h_q|²⟩ (Ų) - DataSet_Mesh* S_top_; ///< Upper-interface S(q) - DataSet_Mesh* S_bot_; ///< Lower-interface S(q) - DataSet_Mesh* q2S_; ///< Combined q² S(q) - DataSet_Mesh* q2S_top_; ///< Upper q² S(q) - DataSet_Mesh* q2S_bot_; ///< Lower q² S(q) - DataSet_Mesh* gammaq_; ///< Apparent γ(q) (mN/m), combined - DataSet_Mesh* gammaq_top_; ///< Apparent γ(q), upper - DataSet_Mesh* gammaq_bot_; ///< Apparent γ(q), lower - DataSet_Mesh* kappaq_; ///< Apparent κ(q) (kT), combined - DataSet_Mesh* kappaq_top_; ///< Apparent κ(q), upper - DataSet_Mesh* kappaq_bot_; ///< Apparent κ(q), lower - // ----- Per-frame roughness / bulk density ------------------------------ - DataSet* wtop_; ///< Upper RMS roughness w (Å) - DataSet* wbot_; ///< Lower RMS roughness w (Å) - DataSet* wmean_; ///< Mean of upper and lower w (Å) - DataSet* rhobulk_; ///< Bulk number density (Å⁻³) - // ----- Per-block results (only if nblock > 0) -------------------------- - DataSet* block_gamma_; ///< Block γ (mN/m) - DataSet* block_kappa_; ///< Block κ (kT) - DataSet* block_wmean_; ///< Block mean roughness (Å) - DataSet* block_wtop_; ///< Block upper roughness (Å) - DataSet* block_wbot_; ///< Block lower roughness (Å) - - std::vector density_; ///< n1×n2×nz number density (Å⁻³); unused for ITIM - std::vector h_upper_; ///< n1×n2 upper height field along the normal (Å) - std::vector h_lower_; ///< n1×n2 lower height field along the normal (Å) - std::vector total_power_; ///< Accumulated |h_q|², both surfaces - std::vector top_power_; ///< Accumulated |h_q|², upper - std::vector bottom_power_; ///< Accumulated |h_q|², lower - std::vector block_power_; ///< Combined |h_q|² for the open block - std::vector q_grid_; ///< |q| for each Fourier mode (Å⁻¹) - - PubFFT fft_n1_; ///< 1-D FFT along lateral axis 1 (nx) - PubFFT fft_n2_; ///< 1-D FFT along lateral axis 2 (ny) - ComplexArray fft_grid_; ///< nx×ny complex grid for the 2-D FFT - ComplexArray fft_row_; ///< Length-ny row buffer - ComplexArray fft_col_; ///< Length-nx column buffer - - int nx_; ///< Bins along lateral axis 1 - int ny_; ///< Bins along lateral axis 2 - int nz_; ///< Density bins along the slab normal - double Lt1_ref_; ///< Lateral length 1 from the first good frame (Å) - double Lt2_ref_; ///< Lateral length 2 from the first good frame (Å) - bool grid_ready_; ///< True after the first successful frame - - int n_frames_; ///< Frames that contributed to the spectra - int n_surfaces_; ///< 2 × n_frames_ (upper + lower) - int n_skipped_; ///< Frames skipped (no interface / no box) - int n_blocks_; ///< Completed uncertainty blocks - int block_surface_count_; ///< Surfaces accumulated in the open block - int block_frame_count_; ///< Frames accumulated in the open block - double block_w_sum_; ///< Running sum of mean w in the open block - double block_wtop_sum_; ///< Running sum of upper w - double block_wbot_sum_; ///< Running sum of lower w ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) }; #endif diff --git a/src/Command.cpp b/src/Command.cpp index 03588c4425..e15a1edee1 100644 --- a/src/Command.cpp +++ b/src/Command.cpp @@ -412,11 +412,8 @@ void Command::Init() { Command::AddCmd( new Action_STFC_Diffusion(),Cmd::ACT, 1, "stfcdiffusion" ); Command::AddCmd( new Action_Strip(), Cmd::ACT, 1, "strip" ); Command::AddCmd( new Action_Surf(), Cmd::ACT, 1, "surf" ); -<<<<<<< HEAD // surftension: keep Command.cpp in sync with Action_SurfaceTension.h // (standalone Makefile has no header deps; stale Command.o undersizes new). -======= ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) Command::AddCmd( new Action_SurfaceTension(),Cmd::ACT, 1, "surftension" ); Command::AddCmd( new Action_SymmetricRmsd(), Cmd::ACT, 1, "symmrmsd" ); Command::AddCmd( new Action_Temperature(), Cmd::ACT, 1, "temperature" ); diff --git a/src/Version.h b/src/Version.h index 3fc605cfe0..cf1a20f342 100644 --- a/src/Version.h +++ b/src/Version.h @@ -12,11 +12,7 @@ * Whenever a number that precedes is incremented, all subsequent * numbers should be reset to 0. */ -<<<<<<< HEAD #define CPPTRAJ_INTERNAL_VERSION "V7.11.2" -======= -#define CPPTRAJ_INTERNAL_VERSION "V7.11.0" ->>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) /// PYTRAJ relies on this #define CPPTRAJ_VERSION_STRING CPPTRAJ_INTERNAL_VERSION #endif diff --git a/test/Test_SurfTension/RunTest.sh b/test/Test_SurfTension/RunTest.sh old mode 100755 new mode 100644 index 6eb8e1d16d..20471fbe04 --- a/test/Test_SurfTension/RunTest.sh +++ b/test/Test_SurfTension/RunTest.sh @@ -1,102 +1,4 @@ #!/bin/bash -<<<<<<< HEAD -# surftension tests. -# slab.pdb is a 20 A cubic lattice of O atoms with a small z-corrugation -# so ITIM min/max is not flat. Stretching one box length creates vacuum -# on both sides of a slab so Willard/ITIM can find interfaces. -# The PDB is loaded twice so serial and MPI (2 ranks) both analyze 2 -# identical frames; SyncAction then reduces |h_q|^2 and the summaries match. - -. ../MasterTest.sh - -CleanFiles st.in st.willard.dat st.itim.dat st.normalx.dat st.normaly.dat \ - st.nsurf1.dat st2_summary.dat - -TESTNAME='Surface tension (surftension) tests' -# Two frames: Jenkins mpiexec -n 2 assigns one frame per rank. -Requires maxthreads 2 - -INPUT='-i st.in' - -UNITNAME='surftension Willard-Chandler (default)' -cat > st.in < st.in < st.in < st.in < st.in < st.in <>>>>>> c51400c7 (Add 'surftension' command to calculate capillary-wave surface tension of a liquid slab) + +UNITNAME='surftension smoke (nsurf 1)' +CheckFor netcdf +if [ $? -eq 0 ] ; then + cat > st.in < st.in < Date: Mon, 31 Aug 2026 15:51:22 -0600 Subject: [PATCH 06/33] Update 'surftension' command to include 'out' alias and directory checks - Changed the 'spectrumout' parameter to be aliased as 'out' for simplified usage. - Implemented error handling in the initialization phase to ensure that the parent directory for output files exists, preventing loss of data during long trajectory writes. - Updated documentation in ChangeLog to reflect these changes and clarify output file handling. --- doc/ChangeLog.surftension.md | 5 ++- doc/ChangeLog.v7.md | 2 +- src/Action_SurfaceTension.cpp | 57 ++++++++++++++++++++++++++++++++--- 3 files changed, 57 insertions(+), 7 deletions(-) diff --git a/doc/ChangeLog.surftension.md b/doc/ChangeLog.surftension.md index 9f231f4a32..6f8064da50 100644 --- a/doc/ChangeLog.surftension.md +++ b/doc/ChangeLog.surftension.md @@ -22,7 +22,7 @@ surftension [] [mask2 ] temp [bulkhalfwidth ] [threshold ] [qmin ] [qmax ] [lx ] [ly ] [lz ] [nblock ] [dt ] [blocktime ] - [spectrumout ] [roughout ] [blockout ] + [out | spectrumout ] [roughout ] [blockout ] [summaryout ] [spectrumagr ] [roughagr ] [blockagr ] [spectrumgnu ] [roughgnu ] [blockgnu ] @@ -98,6 +98,9 @@ surftension [] [mask2 ] temp is a second mask for the lower surface (leaflet / liquid–liquid); the upper surface then comes from `` with no mid-box split. Both masks share one circular recenter so the film is not split apart. +- `out` is an alias for `spectrumout`. Init now errors if an `*out` path + names a directory that does not exist (DataFiles are opened only after + `run`, which previously lost a full trajectory write). --- diff --git a/doc/ChangeLog.v7.md b/doc/ChangeLog.v7.md index c49fdc32c0..1fe3d45a16 100644 --- a/doc/ChangeLog.v7.md +++ b/doc/ChangeLog.v7.md @@ -39,7 +39,7 @@ surftension [] [mask2 ] temp [bulkhalfwidth ] [threshold ] [qmin ] [qmax ] [lx ] [ly ] [lz ] [nblock ] [dt ] [blocktime ] - [spectrumout ] [roughout ] [blockout ] + [out | spectrumout ] [roughout ] [blockout ] [summaryout ] [spectrumagr ] [roughagr ] [blockagr ] [spectrumgnu ] [roughgnu ] [blockgnu ] diff --git a/src/Action_SurfaceTension.cpp b/src/Action_SurfaceTension.cpp index 0d13c2bbf3..a70cea8d12 100644 --- a/src/Action_SurfaceTension.cpp +++ b/src/Action_SurfaceTension.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include #include "Action_SurfaceTension.h" #include "Constants.h" @@ -14,6 +15,7 @@ #include "DataSet_1D.h" #include "DataSet_Mesh.h" #include "CpptrajFile.h" +#include "FileName.h" #include "Frame.h" #ifdef _OPENMP # include @@ -676,6 +678,23 @@ static void ST_SummaryS(CpptrajFile* f, const char* key, const char* v) { f->Printf("%s %s\n", key, v); } +/** DataFiles are opened only at the end of the run. Fail at Init if the + * parent directory is missing so a long trajectory is not processed only + * to lose the write. + */ +static int ST_CheckParentDir(DataFile* df, const char* key) { + if (df == 0) return 0; + std::string dir = df->DataFilename().DirPrefix_NoSlash(); + if (dir.empty()) return 0; + struct stat st; + if (stat(dir.c_str(), &st) != 0) { + mprinterr("Error: Directory '%s' for %s does not exist.\n", dir.c_str(), key); + mprinterr("Error: Create it first, or give a filename in the current directory.\n"); + return 1; + } + return 0; +} + // ----------------------------------------------------------------------------- /// CONSTRUCTOR — defaults match the reference Python analysis. Action_SurfaceTension::Action_SurfaceTension() : @@ -730,7 +749,7 @@ void Action_SurfaceTension::Help() const { "\t[bulkhalfwidth ] [threshold ]\n" "\t[qmin ] [qmax ] [lx ] [ly ] [lz ]\n" "\t[nblock ] [dt ] [blocktime ]\n" - "\t[spectrumout ] [roughout ] [blockout ]\n" + "\t[out | spectrumout ] [roughout ] [blockout ]\n" "\t[summaryout ]\n" "\t[spectrumagr ] [roughagr ] [blockagr ]\n" "\t[spectrumgnu ] [roughgnu ] [blockgnu ]\n" @@ -743,8 +762,9 @@ void Action_SurfaceTension::Help() const { " the upper surface then comes from with no mid-box split.\n" " If qmin is omitted it is 2*pi/max(Lt1,Lt2) from the first frame.\n" " blocktime (ps) with dt (analyzed-frame spacing, ps) sets nblock.\n" - " Output files are written only to paths the user gives; parent\n" - " directories must already exist.\n"); + " out is an alias for spectrumout. Write to the current directory,\n" + " e.g. spectrumout spec.dat roughout rough.dat blockout blocks.dat.\n" + " A directory in the name must already exist; it is not created.\n"); } // Action_SurfaceTension::Init() @@ -762,7 +782,20 @@ Action::RetType Action_SurfaceTension::Init(ArgList& actionArgs, ActionInit& ini # endif debug_ = debugIn; // Optional output files. AddDataFile returns 0 if the keyword is absent. - DataFile* spectrumFile = init.DFL().AddDataFile(actionArgs.GetStringKey("spectrumout"), actionArgs); + // out == spectrumout (usual cpptraj keyword for the main result file). + bool has_spectrumout = actionArgs.Contains("spectrumout"); + bool has_out = actionArgs.Contains("out"); + std::string specname = actionArgs.GetStringKey("spectrumout"); + std::string outname = actionArgs.GetStringKey("out"); + if (has_spectrumout && has_out && specname != outname) { + mprinterr("Error: 'out' and 'spectrumout' both specified and differ.\n"); + return Action::ERR; + } + if (specname.empty()) + specname = outname; + bool has_summaryout = actionArgs.Contains("summaryout"); + std::string sumname = actionArgs.GetStringKey("summaryout"); + DataFile* spectrumFile = init.DFL().AddDataFile(specname, actionArgs); DataFile* roughFile = init.DFL().AddDataFile(actionArgs.GetStringKey("roughout"), actionArgs); DataFile* blockFile = init.DFL().AddDataFile(actionArgs.GetStringKey("blockout"), actionArgs); DataFile* spectrumAgr = init.DFL().AddDataFile(actionArgs.GetStringKey("spectrumagr"), actionArgs, DataFile::XMGRACE); @@ -771,7 +804,21 @@ Action::RetType Action_SurfaceTension::Init(ArgList& actionArgs, ActionInit& ini DataFile* spectrumGnu = init.DFL().AddDataFile(actionArgs.GetStringKey("spectrumgnu"), actionArgs, DataFile::GNUPLOT); DataFile* roughGnu = init.DFL().AddDataFile(actionArgs.GetStringKey("roughgnu"), actionArgs, DataFile::GNUPLOT); DataFile* blockGnu = init.DFL().AddDataFile(actionArgs.GetStringKey("blockgnu"), actionArgs, DataFile::GNUPLOT); - summaryFile_ = init.DFL().AddCpptrajFile(actionArgs.GetStringKey("summaryout"), "SurfTension summary"); + summaryFile_ = init.DFL().AddCpptrajFile(sumname, "SurfTension summary"); + if (has_summaryout && summaryFile_ == 0) { + mprinterr("Error: Could not open summaryout '%s'.\n", sumname.c_str()); + return Action::ERR; + } + if (ST_CheckParentDir(spectrumFile, "spectrumout") || + ST_CheckParentDir(roughFile, "roughout") || + ST_CheckParentDir(blockFile, "blockout") || + ST_CheckParentDir(spectrumAgr, "spectrumagr") || + ST_CheckParentDir(roughAgr, "roughagr") || + ST_CheckParentDir(blockAgr, "blockagr") || + ST_CheckParentDir(spectrumGnu, "spectrumgnu") || + ST_CheckParentDir(roughGnu, "roughgnu") || + ST_CheckParentDir(blockGnu, "blockgnu")) + return Action::ERR; temp_ = actionArgs.getKeyDouble("temp", -1.0); if (temp_ <= 0.0) { From 7e4d9e3e4fc005da9428fb0a81e577163e352a82 Mon Sep 17 00:00:00 2001 From: ndlevinzon Date: Mon, 31 Aug 2026 15:58:04 -0600 Subject: [PATCH 07/33] Refine documentation and formatting in Action_SurfaceTension MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Updated author name formatting for consistency. - Corrected mathematical symbols in comments for clarity, including replacing "n" with "−n" and "≤" with "≤". - Enhanced descriptions of functions and parameters to improve understanding of the capillary-wave theory and its implementation. - Adjusted comments to reflect accurate mathematical expressions and units, ensuring clarity in the context of surface tension calculations. - Improved overall readability of the code documentation. --- src/Action_SurfaceTension.cpp | 58 ++++++++++++++++++----------------- src/Action_SurfaceTension.h | 53 ++++++++++++++++++++++++++------ 2 files changed, 73 insertions(+), 38 deletions(-) diff --git a/src/Action_SurfaceTension.cpp b/src/Action_SurfaceTension.cpp index a70cea8d12..d89d74d6bd 100644 --- a/src/Action_SurfaceTension.cpp +++ b/src/Action_SurfaceTension.cpp @@ -1,7 +1,7 @@ // Action_SurfaceTension // Capillary-wave surface tension of a liquid slab (Cartesian normal x, y, or z). // See Action_SurfaceTension.h for the physical formulae. -// \author Nathan D Levinzon +// \author Nathan D. Levinzon #include #include #include @@ -270,7 +270,7 @@ static void ST_GaussianFilter3D(std::vector& rho, int nx, int ny, int nz } /** Locate the instantaneous interface along one lateral column. - * Walks from the slab center toward +n (upper) or -n (lower) and returns the + * Walks from the slab center toward +n (upper) or −n (lower) and returns the * linearly interpolated normal coordinate where rho crosses the bulk-density * threshold. \return NaN if no crossing is found. */ @@ -306,7 +306,7 @@ static double ST_FindCrossing(std::vector const& z_grid, } /** ITIM-style slab interfaces after circular recentering at Ln/2. - * In each lateral column: upper = max n of atoms with n >= Ln/2, lower = min n + * In each lateral column: upper = max n of atoms with n ≥ Ln/2, lower = min n * of atoms with n < Ln/2. Empty half-columns return false. * t1/t2/n are lateral 1, lateral 2, and the slab normal. */ @@ -424,7 +424,7 @@ static void ST_SplitAtomCoords(Frame const& frm, AtomMask const& mask, int nax, } } -/** Number density of mask atoms with |n - Ln/2| <= bulk_halfwidth (Ang^-3). */ +/** Number density of mask atoms with |n − Ln/2| ≤ bulk_halfwidth (Å⁻³). */ static double ST_RhoBulkFromAtoms(std::vector const& ncoord, int natom, double Lt1, double Lt2, double Ln, double bulk_halfwidth) @@ -455,8 +455,8 @@ static double ST_RMS(std::vector const& h) { return sqrt(acc / (double)h.size()); } -/** Sample frequencies, identical to numpy.fft.fftfreq(n, d)[k]. - * d is the real-space sample spacing (Å). Result is in Å⁻¹. +/** Wrapped mode index of bin k on an N-point grid of spacing Δ (Å). + * n ∈ (−N/2, N/2]; frequency is n / (N Δ). Used as q_α = 2π n_α / L_α. */ static double ST_FftFreq(int k, int n, double d) { int p; @@ -467,7 +467,7 @@ static double ST_FftFreq(int k, int n, double d) { return (double)p / ((double)n * d); } -/** |q| = √(qx² + qy²) for each Fourier mode, qx = 2π fftfreq(nx, Lx/nx). */ +/** |q| = √(q₁² + q₂²) with q₁ = 2π n₁ / L₁, q₂ = 2π n₂ / L₂. */ static void ST_MakeQGrid(int nx, int ny, double Lx, double Ly, std::vector& q) { q.resize((size_t)nx * (size_t)ny); double dx = Lx / (double)nx; @@ -536,11 +536,13 @@ static void ST_ShellAverage(std::vector const& q, std::sort(shells.begin(), shells.end(), ST_ShellQCmp); } -/** Capillary-wave γ from the mean q² S(q) plateau on [qmin, qmax]. - * plateau = ⟨ q² S(q) ⟩_shells - * γ (N/m) = k_B T / (A plateau), then ×1000 → mN/m - * Equal weight per q-shell. Needs at least two shells. - * \return 0 on success, 1 on failure (γ/plateau set to NaN). +/** Capillary-wave γ from the small-q plateau of q² S(q). + * S(q) = k_B T / (A γ q²) (κ → 0) + * γ = k_B T / (A ⟨q² S(q)⟩) + * ⟨…⟩ is an equal-weight mean over shells on [q_min, q_max]. + * A is converted Ų → m²; γ is then ×1000 → mN/m. + * Needs at least two shells. + * \return 0 on success, 1 on failure (γ / ⟨q² S⟩ set to NaN). */ static int ST_CalcGamma(std::vector const& shells, double temperature, double area_A2, double qmin, double qmax, @@ -564,12 +566,12 @@ static int ST_CalcGamma(std::vector const& shells, double temperature, return 0; } -/** Helfrich fit on [qmin, qmax]: - * 1 / (q² S) = a + b q² - * q in Å⁻¹, S in Ų, so q² S is dimensionless. - * γ (mN/m) = 1000 k_B T a / A_m² (intercept) - * κ / kT = b / A_Ų (slope) - * Equal weight per shell. Needs at least three shells with S > 0. +/** Helfrich inversion of S(q) = k_B T / [A (γ q² + κ q⁴)]: + * 1/(q² S) = (A / k_B T) (γ + κ q²) = a + b q² + * γ = k_B T a / A (N/m, then ×1000 → mN/m) + * κ / k_B T = b / A (A in Ų) + * q in Å⁻¹, S in Ų; q² S is dimensionless. Equal weight per shell. + * Needs at least three shells with S > 0. * \return 0 on success, 1 on failure (outputs set to NaN). */ static int ST_CalcKappa(std::vector const& shells, double temperature, @@ -605,7 +607,7 @@ static int ST_CalcKappa(std::vector const& shells, double temperature, return 0; } -/** Apparent κ(q)/kT given γ (mN/m): invert γ q² + κ q⁴ at one shell. */ +/** Apparent κ(q)/k_B T at one shell: invert S = k_B T / [A (γ q² + κ q⁴)]. */ static double ST_ShellKappa(double q, double S, double temperature, double area_A2, double gamma_mNm) { @@ -620,7 +622,7 @@ static double ST_ShellKappa(double q, double S, double temperature, double area_ return b / area_A2; } -/** Apparent γ(q) = k_B T / (A q² S(q)) in mN/m. */ +/** Apparent γ(q) = k_B T / (A q² S(q)), reported in mN/m. */ static double ST_ShellGamma(double q, double S, double temperature, double area_A2) { double q2S = q * q * S; if (q2S <= 0.0) return ST_NaN(); @@ -1062,7 +1064,7 @@ Action::RetType Action_SurfaceTension::Init(ArgList& actionArgs, ActionInit& ini kappaq_top_->SetDim(Dimension::X, qdim); kappaq_bot_->SetDim(Dimension::X, qdim); // Print() fills these from the accumulated spectra; they are not time series. - // MPI: SyncAction reduces |h_q|^2; skip DataSet concat of empty meshes. + // MPI: SyncAction reduces |h_q|²; skip DataSet concat of empty meshes. # ifdef MPI S_->SetNeedsSync(false); S_top_->SetNeedsSync(false); S_bot_->SetNeedsSync(false); q2S_->SetNeedsSync(false); q2S_top_->SetNeedsSync(false); q2S_bot_->SetNeedsSync(false); @@ -1435,10 +1437,10 @@ int Action_SurfaceTension::WillardHeights(std::vector const& t1, } // Action_SurfaceTension::HeightPower() -/** 2-D FFT of h − ⟨h⟩ via row-column PubFFT 1-D transforms, then - * h_q = FFT2 / (nx ny) - * matching numpy.fft.fft2(h) / h.size. Power is |h_q|² (Ang^2). - * fft_n2_ transforms along iy (contiguous); fft_n1_ along ix. +/** Discrete Fourier transform of h − ⟨h⟩ (row–column 1-D PubFFTs). + * h_q = (1/(N₁ N₂)) Σ (h − ⟨h⟩) exp(−i q · r) + * implemented as unnormalized FFTW / numpy fft2, then ÷ (N₁ N₂). + * Power is |h_q|² (Ų). fft_n2_ along n₂; fft_n1_ along n₁. */ void Action_SurfaceTension::HeightPower(std::vector const& h, std::vector& power) @@ -1499,8 +1501,8 @@ void Action_SurfaceTension::HeightPower(std::vector const& h, // Action_SurfaceTension::ProcessFrame() /** Wrap laterals, recenter along the normal, build instantaneous interfaces, - * then accumulate roughness and |h_q|^2. First good frame freezes nx, ny, - * Lt1, Lt2 (and nz for Willard-Chandler). Cartesian Lx/Ly/Lz are permuted + * then accumulate roughness and |h_q|². First good frame freezes nx, ny, + * Lt1, Lt2 (and nz for Willard–Chandler). Cartesian Lx/Ly/Lz are permuted * into (Lt1, Lt2, Ln) according to normal_. */ int Action_SurfaceTension::ProcessFrame(Frame const& frm, double Lx, double Ly, double Lz) @@ -1697,7 +1699,7 @@ Action::RetType Action_SurfaceTension::DoAction(int, ActionFrame& frm) #ifdef MPI // Action_SurfaceTension::SyncAction() /** Radial-style reduction. Three small AllReduces (counts SUM, grid MAX, lateral - * box MAX) then one packed ReduceMaster SUM of combined/upper/lower |h_q|^2 onto + * box MAX) then one packed ReduceMaster SUM of combined/upper/lower |h_q|² onto * the master. |q| uses a separate MAX (different MPI_Op). Print() is master * only. Roughness / block series use DataSet::Sync (concat by rank). */ diff --git a/src/Action_SurfaceTension.h b/src/Action_SurfaceTension.h index 56c757ce2a..e6aa2232ef 100644 --- a/src/Action_SurfaceTension.h +++ b/src/Action_SurfaceTension.h @@ -7,18 +7,51 @@ class DataSet_Mesh; class CpptrajFile; /// Capillary-wave surface tension of a liquid slab (Cartesian normal). -/** Instantaneous interfaces are a Willard-Chandler isosurface of a +/** Instantaneous interfaces are a Willard–Chandler isosurface of a * Gaussian-smoothed number-density field (default) or ITIM min/max. * Default is a two-interface slab (vacuum or a second phase on both * sides of the film). nsurf 1 is a single interface. An optional - * second mask supplies the lower surface (leaflet / liquid-liquid). - * Lateral box lengths come from the unit cell unless lx/ly/lz are set. - * Height fluctuations are Fourier transformed with cpptraj PubFFT - * (row-column 1-D FFTs) using the numpy convention - * h_q = (1 / N₁N₂) FFT2(h − ⟨h⟩) - * γ (mN/m) from the small-q plateau of q² S(q); κ (kT) from the slope - * of 1/(q² S) vs q². If qmin is omitted it is 2π / max(Lt1, Lt2). - * \author Nathan D Levinzon + * second mask supplies the lower surface (leaflet / liquid–liquid). + * Lateral lengths L₁, L₂ come from the unit cell unless lx/ly/lz are + * set. Area A = L₁ L₂. + * + * Discrete Fourier modes of the height (FFTW / numpy unnormalized + * transform, then divide by N): + * h_q = (1/(N₁ N₂)) Σ_{n₁,n₂} (h − ⟨h⟩) exp(−i q · r) + * q = (2π n₁/L₁, 2π n₂/L₂), S(q) ≡ ⟨|h_q|²⟩ + * + * Capillary-wave theory (Helfrich): + * S(q) = k_B T / [A (γ q² + κ q⁴)] + * Small-q (κ → 0): q² S(q) → k_B T / (A γ), so + * γ = k_B T / (A ⟨q² S(q)⟩) on [q_min, q_max] + * reported in mN/m (×1000 from N/m). If q_min is omitted it is the + * fundamental wavevector 2π / max(L₁, L₂). + * + * Bending modulus from the linear form + * 1/(q² S) = (A / k_B T) (γ + κ q²) + * intercept → γ, slope → κ / k_B T. + * + * \author Nathan D. Levinzon + * + * References (for interested parties or lowly PhD students like me): + * Willard–Chandler instantaneous interface + * A. P. Willard and D. Chandler, J. Phys. Chem. B 114, 1954 (2010). + * https://doi.org/10.1021/jp909219k + * ITIM (Identification of Truly Interfacial Molecules) + * L. B. Pártay, G. Hantal, P. Jedlovszky, Á. Vincze, and G. Horvai, + * J. Comput. Chem. 29, 945 (2008). + * https://doi.org/10.1002/jcc.20852 + * Capillary-wave theory + * F. P. Buff, R. A. Lovett, and F. H. Stillinger, + * Phys. Rev. Lett. 15, 621 (1965). + * https://doi.org/10.1103/PhysRevLett.15.621 + * Height-fluctuation surface tension in MD + * S. W. Sides, G. S. Grest, and M.-D. Lacasse, + * Phys. Rev. E 60, 6708 (1999). + * https://doi.org/10.1103/PhysRevE.60.6708 + * Helfrich bending energy + * W. Helfrich, Z. Naturforsch. C 28, 693 (1973). + * https://doi.org/10.1515/znc-1973-11-1209 */ class Action_SurfaceTension : public Action { public: @@ -40,7 +73,7 @@ class Action_SurfaceTension : public Action { int ProcessFrame(Frame const&, double, double, double); int FinishBlock(); void HeightPower(std::vector const&, std::vector&); - /// Willard-Chandler heights from one atom set into the given density buffer. + /// Willard–Chandler heights from one atom set into the given density buffer. /** \return 0 OK, 1 skip. */ int WillardHeights(std::vector const&, std::vector const&, std::vector const&, int, From 2195e932d42ebab8c9c92f2949f2883947bd5d7f Mon Sep 17 00:00:00 2001 From: ndlevinzon Date: Mon, 31 Aug 2026 16:01:30 -0600 Subject: [PATCH 08/33] Enhance documentation in Action_SurfaceTension.cpp for clarity and detail - Expanded comments to provide a clearer understanding of the capillary-wave surface tension calculations and the per-frame processing pipeline. - Improved descriptions of functions, parameters, and mathematical expressions to ensure accuracy and readability. - Updated variable and function comments to reflect consistent terminology and units, enhancing overall documentation quality. --- src/Action_SurfaceTension.cpp | 216 +++++++++++++++++++++++----------- 1 file changed, 149 insertions(+), 67 deletions(-) diff --git a/src/Action_SurfaceTension.cpp b/src/Action_SurfaceTension.cpp index d89d74d6bd..24d9e62e10 100644 --- a/src/Action_SurfaceTension.cpp +++ b/src/Action_SurfaceTension.cpp @@ -1,6 +1,18 @@ // Action_SurfaceTension // Capillary-wave surface tension of a liquid slab (Cartesian normal x, y, or z). -// See Action_SurfaceTension.h for the physical formulae. +// Formulae, units, and references: Action_SurfaceTension.h +// +// Per-frame pipeline (after Init / Setup): +// 1. Permute Cartesian (x,y,z) into (t1, t2, n) for the chosen normal. +// 2. Wrap laterals into [0, L_α). Recenter the normal so the circular +// mean of the film sits at L_n/2 (one shared shift if mask2 is set). +// 3. Instantaneous height h(t1, t2): Willard–Chandler isosurface or ITIM. +// 4. Roughness w = √⟨(h − ⟨h⟩)²⟩ and power |h_q|² from the DFT +// h_q = (1/(N₁ N₂)) Σ (h − ⟨h⟩) exp(−i q · r) +// 5. Print() forms S(q) ≡ ⟨|h_q|²⟩, shell-averages, then +// S(q) = k_B T / [A (γ q² + κ q⁴)] +// +// NVT: first good frame freezes N₁, N₂, L₁, L₂ (and N_n for Willard). // \author Nathan D. Levinzon #include #include @@ -24,15 +36,14 @@ // File-local helpers. Names are prefixed ST_ so they do not collide with // other Action translation units. -/// Boltzmann constant (J/K); SI, matching the reference Python analysis. +/// k_B (J/K), CODATA 2018. γ uses SI: k_B T / (A_m² ⟨q² S⟩), then ×1000 → mN/m. static const double ST_KB = 1.380649e-23; -/// Convert Ų → m². +/// Ų → m² so A in the CWT formula is consistent with γ in N/m. static const double ST_ANG2_TO_M2 = 1.0e-20; -/// scipy.ndimage.gaussian_filter default truncate (kernel radius = truncate × σ). +/// scipy.ndimage.gaussian_filter default: kernel radius = truncate × σ (pixels). static const double ST_GAUSS_TRUNCATE = 4.0; -/// \return true if x is finite (not NaN or ±Inf). -static inline bool ST_Finite(double x) { +/// \return true if x is finite (not NaN or ±Inf). Used to reject failed crossings. return (x == x) && (x < std::numeric_limits::infinity()) && (x > -std::numeric_limits::infinity()); @@ -42,12 +53,12 @@ static inline double ST_NaN() { return std::numeric_limits::quiet_NaN(); } -/// Linear index of density_(ix, iy, iz) with z the fastest dimension. +/// Linear index of ρ(i₁, i₂, i_n) with the normal the fastest dimension. static inline size_t ST_Idx3(int ix, int iy, int iz, int ny, int nz) { return ((size_t)ix * (size_t)ny + (size_t)iy) * (size_t)nz + (size_t)iz; } -/// Linear index of an nx×ny field stored row-major in x, then y. +/// Linear index of an N₁×N₂ field, row-major in the first lateral index. static inline size_t ST_Idx2(int ix, int iy, int ny) { return (size_t)ix * (size_t)ny + (size_t)iy; } @@ -57,7 +68,10 @@ static inline int ST_IRound(double x) { return (int)floor(x + 0.5); } -/** Wrap x into [0, L). Handles negative values; maps x == L back to 0. */ +/** Minimum-image wrap of a Cartesian coordinate into [0, L). + * fmod of a negative argument is negative on IEEE-754; that case is lifted + * back into the interval. x == L maps to 0 so the last bin is not empty. + */ static double ST_Wrap(double x, double L) { if (L <= 0.0) return x; double y = fmod(x, L); @@ -66,9 +80,12 @@ static double ST_Wrap(double x, double L) { return y; } -/** Circular-mean slab center along the normal (periodic). n2 may be 0. - * Mapping n → θ = 2π n / L, then atan2(⟨sin θ⟩, ⟨cos θ⟩), so a slab that - * straddles the periodic boundary is still recentered correctly. +/** Circular mean of the film along the periodic normal, in Å. + * Map n → θ = 2π n / L_n and take atan2(⟨sin θ⟩, ⟨cos θ⟩). A slab that + * straddles n = 0 is then a single cluster on the circle. n2 may be 0; + * when both masks are given they share this one mean so leaflets are not + * pulled onto the same mid-box plane independently. + * \return the lab-frame coordinate of that mean, in [0, L_n). */ static double ST_CircularSlabCenter(std::vector const& n1, int n1n, std::vector const* n2, int n2n, @@ -100,6 +117,7 @@ static double ST_CircularSlabCenter(std::vector const& n1, int n1n, return L * angle / Constants::TWOPI; } +/** Shift n so slab_center maps to L_n/2, then wrap into [0, L_n). */ static void ST_ApplyCircularRecenter(std::vector& n, double L, double slab_center) { @@ -108,27 +126,31 @@ static void ST_ApplyCircularRecenter(std::vector& n, double L, n[i] = ST_Wrap(n[i] - slab_center + 0.5 * L, L); } -/** Recenter a periodic slab so its circular mean along the normal lies at L/2. */ +/** Recenter one atom set so its circular mean along the normal lies at L_n/2. */ static void ST_CircularRecenter(std::vector& n, double L) { if (n.empty() || L <= 0.0) return; ST_ApplyCircularRecenter(n, L, ST_CircularSlabCenter(n, (int)n.size(), 0, 0, L)); } -/// Cartesian axis name for Help / mprintf (ASCII). +/// ASCII name of a Cartesian axis for Help / mprintf (terminals are not UTF-8). static const char* ST_AxisName(int axis) { if (axis == 0) return "x"; if (axis == 1) return "y"; return "z"; } -/// Lateral axis names for a given Cartesian normal. +/// Names of the two lateral axes for Cartesian normal ∈ {0,1,2} = {x,y,z}. static void ST_PlaneAxes(int normal, const char*& t1, const char*& t2) { if (normal == 0) { t1 = "y"; t2 = "z"; } else if (normal == 1) { t1 = "x"; t2 = "z"; } else { t1 = "x"; t2 = "y"; } } -/// Split Cartesian box lengths into lateral 1, lateral 2, and normal. +/** Permute (L_x, L_y, L_z) into (L₁, L₂, L_n). + * n = z: L₁ = L_x, L₂ = L_y, L_n = L_z + * n = y: L₁ = L_x, L₂ = L_z, L_n = L_y + * n = x: L₁ = L_y, L₂ = L_z, L_n = L_x + */ static void ST_SplitBox(int normal, double Lx, double Ly, double Lz, double& Lt1, double& Lt2, double& Ln) { @@ -137,7 +159,7 @@ static void ST_SplitBox(int normal, double Lx, double Ly, double Lz, else { Lt1 = Lx; Lt2 = Ly; Ln = Lz; } } -/// Split a Cartesian point into lateral 1, lateral 2, and normal. +/// Same permutation as ST_SplitBox, applied to one Cartesian point. static void ST_SplitXYZ(int normal, double x, double y, double z, double& t1, double& t2, double& n) { @@ -146,8 +168,10 @@ static void ST_SplitXYZ(int normal, double x, double y, double z, else { t1 = x; t2 = y; n = z; } } -/** Normalized 1-D Gaussian kernel matching scipy.ndimage._gaussian_kernel1d. - * σ is in pixels. Radius = round(4 σ). Empty kernel means “do not filter”. +/** Normalized 1-D Gaussian matching scipy.ndimage._gaussian_kernel1d. + * σ is in pixels (Å / bin width). Radius = round(4 σ). Weights are + * K_i = exp(−i² / (2 σ²)) / Σ_j K_j , i ∈ [−R, R] + * An empty kernel (σ ≤ 0) means that axis is left unfiltered. */ static void ST_GaussianKernel(double sigma, std::vector& kernel) { kernel.clear(); @@ -168,8 +192,8 @@ static void ST_GaussianKernel(double sigma, std::vector& kernel) { } } -/** 1-D convolution with periodic (wrap) boundaries. - * The Gaussian kernel is symmetric, so correlate and convolve agree. +/** Periodic 1-D convolution, out[i] = Σ_k K_k in[(i+k) mod N]. + * The Gaussian is even, so convolution and correlation are identical. */ static void ST_ConvolveWrap(std::vector const& in, std::vector const& kernel, std::vector& out) @@ -195,10 +219,10 @@ static void ST_ConvolveWrap(std::vector const& in, std::vector c } } -/** Separable Gaussian smooth of ρ(ix,iy,iz) with periodic boundaries on every axis. - * σx, σy, σz are in pixels (Å / bin width), as in scipy.ndimage.gaussian_filter. - * OpenMP: each 1-D line in a pass is independent. One parallel region covers - * the z, y, and x passes so thread-local line buffers are reused. +/** Separable periodic Gaussian on ρ(i₁, i₂, i_n), Willard–Chandler coarse-graining. + * σ_α in pixels (Å / Δ_α), same as scipy.ndimage.gaussian_filter. Three + * 1-D passes (n, then t2, then t1). OpenMP: each line in a pass is + * independent; one parallel region reuses thread-local buffers. */ static void ST_GaussianFilter3D(std::vector& rho, int nx, int ny, int nz, double sigma_x, double sigma_y, double sigma_z) @@ -269,10 +293,12 @@ static void ST_GaussianFilter3D(std::vector& rho, int nx, int ny, int nz } } -/** Locate the instantaneous interface along one lateral column. - * Walks from the slab center toward +n (upper) or −n (lower) and returns the - * linearly interpolated normal coordinate where rho crosses the bulk-density - * threshold. \return NaN if no crossing is found. +/** Willard–Chandler crossing along one lateral column. + * Walk from the slab mid-plane toward +n (upper) or −n (lower). The + * interface is the first point where ρ drops through θ ρ_bulk, with θ + * the threshold fraction. Linear interpolation between the two bins: + * n* = n_k + (θ ρ_bulk − ρ_k) (n_{k±1} − n_k) / (ρ_{k±1} − ρ_k) + * \return NaN if no crossing exists (caller skips the frame). */ static double ST_FindCrossing(std::vector const& z_grid, std::vector const& density, @@ -305,10 +331,12 @@ static double ST_FindCrossing(std::vector const& z_grid, return ST_NaN(); } -/** ITIM-style slab interfaces after circular recentering at Ln/2. - * In each lateral column: upper = max n of atoms with n ≥ Ln/2, lower = min n - * of atoms with n < Ln/2. Empty half-columns return false. - * t1/t2/n are lateral 1, lateral 2, and the slab normal. +/** ITIM in the probe → 0 limit, after the film has been recentered at L_n/2. + * Each lateral column is split at mid-box: + * h_upper = max { n_i | n_i ≥ L_n/2 } (need_u) + * h_lower = min { n_i | n_i < L_n/2 } (need_l) + * An empty required half-column returns false (skip the frame). This is + * not a finite-radius ITIM probe; it is the min/max of the mask. */ static bool ST_ItimMinMax(std::vector const& t1, std::vector const& t2, @@ -351,7 +379,11 @@ static bool ST_ItimMinMax(std::vector const& t1, return true; } -/** ITIM from two atom sets: upper = max n of set 1, lower = min n of set 2. */ +/** Two-mask ITIM (leaflet / liquid–liquid): no mid-box split. + * h_upper(i₁,i₂) = max n of mask 1 in that column + * h_lower(i₁,i₂) = min n of mask 2 in that column + * \return false if any required column is empty. + */ static bool ST_ItimTwoMasks(std::vector const& t1u, std::vector const& t2u, std::vector const& nu, @@ -401,7 +433,10 @@ static bool ST_ItimTwoMasks(std::vector const& t1u, return true; } -/** Split Cartesian coordinates into wrapped laterals and a recentered normal. */ +/** Extract (t1, t2, n) for one mask. Laterals are wrapped into [0, L_α); + * the normal is left unshifted. Recenter is applied afterwards so two + * masks can share one circular mean. + */ static void ST_SplitAtomCoords(Frame const& frm, AtomMask const& mask, int nax, double Lx, double Ly, double Lz, std::vector& t1, std::vector& t2, @@ -424,7 +459,10 @@ static void ST_SplitAtomCoords(Frame const& frm, AtomMask const& mask, int nax, } } -/** Number density of mask atoms with |n − Ln/2| ≤ bulk_halfwidth (Å⁻³). */ +/** Number density of mask atoms in the mid-slab slab |n − L_n/2| ≤ w (Å⁻³). + * Volume is L₁ L₂ (2w). Used for the rhobulk DataSet on the ITIM path; + * Willard–Chandler ρ_bulk is the laterally averaged coarse-grained field. + */ static double ST_RhoBulkFromAtoms(std::vector const& ncoord, int natom, double Lt1, double Lt2, double Ln, double bulk_halfwidth) @@ -440,7 +478,10 @@ static double ST_RhoBulkFromAtoms(std::vector const& ncoord, int natom, return (double)nbulk / vol; } -/** RMS height fluctuation w = √⟨(h − ⟨h⟩)²⟩_xy (Å). */ +/** Capillary roughness of one instantaneous surface, in Å: + * w = √⟨ (h − ⟨h⟩)² ⟩_{i₁,i₂} + * the RMS of the same field whose DFT gives S(q). + */ static double ST_RMS(std::vector const& h) { if (h.empty()) return ST_NaN(); double mean = 0.0; @@ -455,8 +496,9 @@ static double ST_RMS(std::vector const& h) { return sqrt(acc / (double)h.size()); } -/** Wrapped mode index of bin k on an N-point grid of spacing Δ (Å). - * n ∈ (−N/2, N/2]; frequency is n / (N Δ). Used as q_α = 2π n_α / L_α. +/** Cyclic frequency of DFT bin k on an N-point grid of spacing Δ (Å). + * Mode index n ∈ (−N/2, N/2]; frequency is n / (N Δ) = n / L_α. + * Wavevector component is then q_α = 2π n / L_α (Å⁻¹). */ static double ST_FftFreq(int k, int n, double d) { int p; @@ -467,7 +509,7 @@ static double ST_FftFreq(int k, int n, double d) { return (double)p / ((double)n * d); } -/** |q| = √(q₁² + q₂²) with q₁ = 2π n₁ / L₁, q₂ = 2π n₂ / L₂. */ +/** |q| = √(q₁² + q₂²) on the N₁×N₂ Fourier mesh, q_α = 2π n_α / L_α. */ static void ST_MakeQGrid(int nx, int ny, double Lx, double Ly, std::vector& q) { q.resize((size_t)nx * (size_t)ny); double dx = Lx / (double)nx; @@ -481,13 +523,13 @@ static void ST_MakeQGrid(int nx, int ny, double Lx, double Ly, std::vector const& q, std::vector const& combined, @@ -607,7 +651,10 @@ static int ST_CalcKappa(std::vector const& shells, double temperature, return 0; } -/** Apparent κ(q)/k_B T at one shell: invert S = k_B T / [A (γ q² + κ q⁴)]. */ +/** Apparent κ(q)/k_B T at one shell, given a reference γ (mN/m). + * Invert S = k_B T / [A (γ q² + κ q⁴)] → κ / k_B T = [1/(q² S) − A γ / k_B T] / (A q²). + * Negative κ is allowed (the linear Helfrich slope may change sign). + */ static double ST_ShellKappa(double q, double S, double temperature, double area_A2, double gamma_mNm) { @@ -622,7 +669,9 @@ static double ST_ShellKappa(double q, double S, double temperature, double area_ return b / area_A2; } -/** Apparent γ(q) = k_B T / (A q² S(q)), reported in mN/m. */ +/** Apparent γ(q) = k_B T / (A q² S(q)) from one shell, in mN/m. + * Equals the plateau γ only where q² S is flat (κ → 0). + */ static double ST_ShellGamma(double q, double S, double temperature, double area_A2) { double q2S = q * q * S; if (q2S <= 0.0) return ST_NaN(); @@ -630,8 +679,9 @@ static double ST_ShellGamma(double q, double S, double temperature, double area_ return 1000.0 * ST_KB * temperature / (area_m2 * q2S); } -/** Ordinary least-squares slope of log S vs log q on [qmin, qmax]. - * Ideal capillary waves give slope ≈ −2. Sfield selects S / Stop / Sbot. +/** OLS slope of ln S vs ln q on [q_min, q_max]. + * Pure capillary waves have S(q) ∝ q⁻², so the slope is −2. A slope + * near −4 is Helfrich-dominated. Sfield selects S / S_upper / S_lower. */ static double ST_LogSlope(std::vector const& shells, double qmin, double qmax, double ST_Shell::* Sfield) @@ -698,7 +748,7 @@ static int ST_CheckParentDir(DataFile* df, const char* key) { } // ----------------------------------------------------------------------------- -/// CONSTRUCTOR — defaults match the reference Python analysis. +/// CONSTRUCTOR — Willard–Chandler, nsurf 2, normal z; grid / σ match the Python. Action_SurfaceTension::Action_SurfaceTension() : iface_(WILLARD), normal_(AXIS_Z), @@ -742,6 +792,7 @@ Action_SurfaceTension::Action_SurfaceTension() : {} // Action_SurfaceTension::Help() +/** ASCII-only (terminals). Formulae live in the class header, not here. */ void Action_SurfaceTension::Help() const { mprintf("\t[] [mask2 ] temp \n" "\t[normal {x|y|z}] [nsurf {1|2}] [side {upper|lower}]\n" @@ -771,11 +822,12 @@ void Action_SurfaceTension::Help() const { // Action_SurfaceTension::Init() /** Parse keywords, allocate DataSets, attach optional output files. - * Spectrum / roughness DataSets always exist so writedata can dump them. - * Files are written only if the matching *out / *agr / *gnu keyword is given. - * *out uses the DataFile writer for the filename extension (canonical - * cpptraj: .agr/.xmgr = Grace/xmgrace, .gnu = gnuplot). agr/gnu keywords force - * DataFile::XMGRACE / GNUPLOT even when the extension is not recognized. + * Spectrum / roughness meshes always exist so writedata can dump them after + * Print() fills S(q). Files are written only if the matching *out / *agr / + * *gnu keyword is given. Parent directories are checked here: DataFiles + * open only after run, so a missing path would otherwise lose the write. + * out is an alias for spectrumout. agr/gnu force Grace / gnuplot. + * Contains() is called before getKey* so flags are not already consumed. */ Action::RetType Action_SurfaceTension::Init(ArgList& actionArgs, ActionInit& init, int debugIn) { @@ -1224,6 +1276,9 @@ Action::RetType Action_SurfaceTension::Init(ArgList& actionArgs, ActionInit& ini } // Action_SurfaceTension::Setup() +/** Require an orthorhombic unit cell (L₁, L₂, L_n) and bind the mask(s). + * Non-X-aligned boxes are warned: laterals are wrapped independently. + */ Action::RetType Action_SurfaceTension::Setup(ActionSetup& setup) { if (!setup.CoordInfo().HasBox()) { @@ -1253,6 +1308,11 @@ Action::RetType Action_SurfaceTension::Setup(ActionSetup& setup) } // Action_SurfaceTension::AllocateGrid() +/** First good frame: freeze N₁, N₂, L₁, L₂ and (Willard) N_n. + * Allocates ρ, h, |h_q|² accumulators, PubFFT plans, and q_α = 2π n_α / L_α. + * If q_min was omitted it is set to 2π / max(L₁, L₂). + * \return 0 OK, 1 fatal (FFT setup or q_max ≤ q_min). + */ int Action_SurfaceTension::AllocateGrid(int nx, int ny, int nz) { nx_ = nx; ny_ = ny; @@ -1322,6 +1382,7 @@ int Action_SurfaceTension::AllocateGrid(int nx, int ny, int nz) { return 0; } +/** Cap skip-frame warnings at 5, then one “further messages suppressed.” */ void Action_SurfaceTension::SkipWarn(const char* msg) { const int maxw = 5; @@ -1333,6 +1394,12 @@ void Action_SurfaceTension::SkipWarn(const char* msg) } // Action_SurfaceTension::WillardHeights() +/** Willard–Chandler heights from one atom set into the given density buffer. + * Histogram atoms onto N₁×N₂×N_n, convert to number density (Å⁻³), apply + * the periodic Gaussian, take ρ_bulk as the mid-slab lateral mean, then + * find the ±n crossings of θ ρ_bulk. Writes h_upper_ / h_lower_. + * \return 0 OK, 1 skip (no bulk bins, ρ_bulk ≤ 0, or a column has no crossing). + */ int Action_SurfaceTension::WillardHeights(std::vector const& t1, std::vector const& t2, std::vector const& ncoord, @@ -1500,10 +1567,11 @@ void Action_SurfaceTension::HeightPower(std::vector const& h, } // Action_SurfaceTension::ProcessFrame() -/** Wrap laterals, recenter along the normal, build instantaneous interfaces, - * then accumulate roughness and |h_q|². First good frame freezes nx, ny, - * Lt1, Lt2 (and nz for Willard–Chandler). Cartesian Lx/Ly/Lz are permuted - * into (Lt1, Lt2, Ln) according to normal_. +/** One NVT frame: permute → wrap / recenter → h(t1,t2) → w and |h_q|². + * First good frame freezes N₁, N₂, L₁, L₂ (and N_n for Willard). Later + * frames must keep the same lateral box (NVT). Combined power is summed + * over the surfaces actually used (nsurf 1 or 2). + * \return 0 OK, 1 skip frame, 2 fatal (grid or L₁, L₂ changed). */ int Action_SurfaceTension::ProcessFrame(Frame const& frm, double Lx, double Ly, double Lz) { @@ -1631,7 +1699,10 @@ int Action_SurfaceTension::ProcessFrame(Frame const& frm, double Lx, double Ly, } // Action_SurfaceTension::FinishBlock() -/** Average the open-block power, fit γ and κ, store roughness means, then reset. */ +/** Close one nblock window: S(q) = (Σ |h_q|²) / n_surfaces in the block, + * then the same CWT γ / κ fits as Print(). Incomplete final window is + * left in the running spectra but not written to blockout. + */ int Action_SurfaceTension::FinishBlock() { if (block_surface_count_ < 1 || block_frame_count_ < 1) return 0; std::vector spec(block_power_.size()); @@ -1670,6 +1741,10 @@ int Action_SurfaceTension::FinishBlock() { } // Action_SurfaceTension::DoAction() +/** Read the unit-cell lengths (or lx/ly/lz overrides) and ProcessFrame. + * Skip (Action::OK) if the box is missing or a crossing failed; ERR if + * the lateral grid changed (not NVT). + */ Action::RetType Action_SurfaceTension::DoAction(int, ActionFrame& frm) { if (!frm.Frm().BoxCrd().HasBox()) { @@ -1698,10 +1773,13 @@ Action::RetType Action_SurfaceTension::DoAction(int, ActionFrame& frm) #ifdef MPI // Action_SurfaceTension::SyncAction() -/** Radial-style reduction. Three small AllReduces (counts SUM, grid MAX, lateral - * box MAX) then one packed ReduceMaster SUM of combined/upper/lower |h_q|² onto - * the master. |q| uses a separate MAX (different MPI_Op). Print() is master - * only. Roughness / block series use DataSet::Sync (concat by rank). +/** Reduce per-rank |h_q|² so Print() sees the global S(q) = ⟨|h_q|²⟩. + * Counts (frames, surfaces, skipped) AllReduce SUM. Grid size, L₁, L₂, + * q_min, and q_fundamental AllReduce MAX so empty ranks (zeros) do not + * clobber. One packed ReduceMaster SUM of combined / upper / lower + * power; |q| is a separate MAX. Roughness and block series stay on + * DataSet::Sync (concat by rank). nblock is per-rank. Print() is master + * only. */ int Action_SurfaceTension::SyncAction() { if (trajComm_.Size() < 2) return 0; @@ -1770,7 +1848,11 @@ int Action_SurfaceTension::SyncAction() { #endif // Action_SurfaceTension::Print() -/** Average accumulated spectra, fill q-meshes, report γ / roughness / blocks. */ +/** Form S(q) = (Σ |h_q|²) / n_surfaces, shell-average, then the CWT fits + * γ = k_B T / (A ⟨q² S⟩) , 1/(q² S) = (A / k_B T) (γ + κ q²) + * Fill the q-meshes, print the numeric summary, and write summaryout. + * Per-block γ / κ are printed here, not during the frame loop. + */ void Action_SurfaceTension::Print() { const char* t1 = 0; From 787bd931e60e3a501f1f39a0ad6ebb4a4cdf56e6 Mon Sep 17 00:00:00 2001 From: ndlevinzon Date: Mon, 31 Aug 2026 16:03:39 -0600 Subject: [PATCH 09/33] Add ST_Finite function to Action_SurfaceTension.cpp for finite number checks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Introduced a static inline function, ST_Finite, to determine if a given double value is finite (not NaN or ±Inf). - This addition enhances the robustness of numerical calculations by providing a utility for validating input values in surface tension computations. --- src/Action_SurfaceTension.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Action_SurfaceTension.cpp b/src/Action_SurfaceTension.cpp index 24d9e62e10..e7e53098f5 100644 --- a/src/Action_SurfaceTension.cpp +++ b/src/Action_SurfaceTension.cpp @@ -44,6 +44,7 @@ static const double ST_ANG2_TO_M2 = 1.0e-20; static const double ST_GAUSS_TRUNCATE = 4.0; /// \return true if x is finite (not NaN or ±Inf). Used to reject failed crossings. +static inline bool ST_Finite(double x) { return (x == x) && (x < std::numeric_limits::infinity()) && (x > -std::numeric_limits::infinity()); From 6d4534895d8c775c135e4b541f3122082fb4215d Mon Sep 17 00:00:00 2001 From: ndlevinzon Date: Mon, 31 Aug 2026 16:05:10 -0600 Subject: [PATCH 10/33] Update variable name in Action_SurfaceTension.h for clarity MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Renamed 'q_fund_' to 'q_fundamental_' to better reflect its purpose as 2π / max(L₁, L₂) from the first good frame. - This change enhances code readability and maintains consistency in terminology. --- src/Action_SurfaceTension.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Action_SurfaceTension.h b/src/Action_SurfaceTension.h index e6aa2232ef..c07ba36d61 100644 --- a/src/Action_SurfaceTension.h +++ b/src/Action_SurfaceTension.h @@ -105,7 +105,7 @@ class Action_SurfaceTension : public Action { double threshold_frac_; double qmin_; double qmax_; - double q_fund_; ///< min(2π/Lt1, 2π/Lt2) from the first good frame + double q_fundamental_; ///< 2π / max(L₁, L₂) from the first good frame double lx_user_; double ly_user_; double lz_user_; From 2dc336f0c5dc31a665b7093f6df6c545889bd6ff Mon Sep 17 00:00:00 2001 From: ndlevinzon Date: Mon, 31 Aug 2026 16:06:13 -0600 Subject: [PATCH 11/33] Initialize gamma and kappa variables in Action_SurfaceTension::Print for improved clarity - Updated the initialization of gamma and kappa variables to use ST_NaN() for better handling of uninitialized values. - This change enhances code readability and ensures that variables are explicitly set to a known state before use. --- src/Action_SurfaceTension.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/Action_SurfaceTension.cpp b/src/Action_SurfaceTension.cpp index e7e53098f5..129b8fb4b2 100644 --- a/src/Action_SurfaceTension.cpp +++ b/src/Action_SurfaceTension.cpp @@ -1902,9 +1902,9 @@ void Action_SurfaceTension::Print() // Fit γ on the combined, upper-only, and lower-only shells. double area = Lt1_ref_ * Lt2_ref_; - double gamma_full, plateau; - double gamma_top, plateau_top; - double gamma_bot, plateau_bot; + double gamma_full = ST_NaN(), plateau = ST_NaN(); + double gamma_top = ST_NaN(), plateau_top = ST_NaN(); + double gamma_bot = ST_NaN(), plateau_bot = ST_NaN(); std::vector top_only = shells; std::vector bot_only = shells; for (size_t i = 0; i < shells.size(); i++) { @@ -1919,7 +1919,9 @@ void Action_SurfaceTension::Print() err_bot = ST_CalcGamma(bot_only, temp_, area, qmin_, qmax_, gamma_bot, plateau_bot); (void)plateau_top; (void)plateau_bot; - double gamma_h, kappa_h, gamma_h_top, kappa_h_top, gamma_h_bot, kappa_h_bot; + double gamma_h = ST_NaN(), kappa_h = ST_NaN(); + double gamma_h_top = ST_NaN(), kappa_h_top = ST_NaN(); + double gamma_h_bot = ST_NaN(), kappa_h_bot = ST_NaN(); int err_kh = ST_CalcKappa(shells, temp_, area, qmin_, qmax_, gamma_h, kappa_h); int err_kh_top = 1, err_kh_bot = 1; if (do_upper_) From 80af7dd18e753130ff2d0cf6d73cd0ead8aab2a7 Mon Sep 17 00:00:00 2001 From: ndlevinzon Date: Wed, 2 Sep 2026 11:04:17 -0600 Subject: [PATCH 12/33] Update RunTest.sh for surftension tests with new input parameters and output files - Modified the script to use a cubic lattice of O atoms for testing surface tension. - Updated input files and commands for Willard-Chandler, ITIM, normal x, normal y, and nsurf 1 tests. - Added summary output files for each test case to enhance result tracking and analysis. - Removed obsolete smoke test sections to streamline the testing process. --- test/Test_SurfTension/RunTest.sh | 132 ++++++++++++++----------------- 1 file changed, 60 insertions(+), 72 deletions(-) mode change 100644 => 100755 test/Test_SurfTension/RunTest.sh diff --git a/test/Test_SurfTension/RunTest.sh b/test/Test_SurfTension/RunTest.sh old mode 100644 new mode 100755 index 20471fbe04..c8dd71549e --- a/test/Test_SurfTension/RunTest.sh +++ b/test/Test_SurfTension/RunTest.sh @@ -1,101 +1,89 @@ #!/bin/bash -# Smoke tests for the surftension Action. -# tz2.ortho is a solvated protein box, not a liquid slab, so the 1-frame run -# only checks that Init/Setup do not crash. Numeric γ comparison needs a -# dedicated slab trajectory. +# surftension tests. +# slab.pdb is a 20 A cubic lattice of O atoms. Stretching one box length +# creates vacuum on both sides of a slab so Willard/ITIM can find interfaces. . ../MasterTest.sh -CleanFiles st.in st.summary.dat +CleanFiles st.in st.willard.dat st.itim.dat st.normalx.dat st.normaly.dat \ + st.nsurf1.dat st2_summary.dat TESTNAME='Surface tension (surftension) tests' -# Command is registered and Help() prints. -UNITNAME='surftension help' -cat > st.in < st.in < st.in < st.in < st.in < st.in < st.in < st.in < st.in < st.in < st.in < st.in < st.in < Date: Wed, 23 Sep 2026 10:13:54 -0600 Subject: [PATCH 13/33] Enhance 'surftension' command with output file prefix support and documentation updates - Added 'fprefix' parameter to prepend a specified prefix to output file names, allowing for better organization of results. - Updated documentation in Action_SurfaceTension and ChangeLog to reflect the new 'fprefix' functionality and its usage. - Improved error handling for parent directory checks to ensure output files are correctly managed during execution. Co-authored-by: Cursor --- doc/ChangeLog.v7.md | 8 +- src/Action_SurfaceTension.cpp | 62 +- test/Test_SurfTension/slab.pdb | 2002 ++++++++++---------- test/Test_SurfTension/st.itim.dat.save | 11 +- test/Test_SurfTension/st.normalx.dat.save | 15 +- test/Test_SurfTension/st.normaly.dat.save | 14 +- test/Test_SurfTension/st.nsurf1.dat.save | 10 +- test/Test_SurfTension/st.willard.dat.save | 14 +- test/Test_SurfTension/st2_summary.dat.save | 14 +- 9 files changed, 1088 insertions(+), 1062 deletions(-) diff --git a/doc/ChangeLog.v7.md b/doc/ChangeLog.v7.md index 1fe3d45a16..805ea3fb40 100644 --- a/doc/ChangeLog.v7.md +++ b/doc/ChangeLog.v7.md @@ -26,9 +26,9 @@ New Commands 2π/max(Lt1,Lt2) from the first frame. `blocktime` (ps) with `dt` sets `nblock`. Optional outputs (`spectrumout`, `roughout`, `blockout`, `summaryout`) follow the filename extension (`.agr`/`.xmgr` = xmgrace, `.gnu` = gnuplot). Dedicated - `*agr`/`*gnu` keywords force Grace or gnuplot. Parent directories must already - exist. MPI-parallel (packed spectral SUM to the master). Assumes NVT (fixed - lateral box lengths). + `*agr`/`*gnu` keywords force Grace or gnuplot. `fprefix` is prepended to each + of those file names. Parent directories must already exist. MPI-parallel + (packed spectral SUM to the master). Assumes NVT (fixed lateral box lengths). ``` surftension [] [mask2 ] temp @@ -38,7 +38,7 @@ surftension [] [mask2 ] temp [sigmaxy ] [sigmaz | sigmanormal ] [bulkhalfwidth ] [threshold ] [qmin ] [qmax ] [lx ] [ly ] [lz ] - [nblock ] [dt ] [blocktime ] + [nblock ] [dt ] [blocktime ] [fprefix ] [out | spectrumout ] [roughout ] [blockout ] [summaryout ] [spectrumagr ] [roughagr ] [blockagr ] diff --git a/src/Action_SurfaceTension.cpp b/src/Action_SurfaceTension.cpp index 129b8fb4b2..703dd8c2e6 100644 --- a/src/Action_SurfaceTension.cpp +++ b/src/Action_SurfaceTension.cpp @@ -731,13 +731,21 @@ static void ST_SummaryS(CpptrajFile* f, const char* key, const char* v) { f->Printf("%s %s\n", key, v); } +/** Prepend fprefix to the basename; directory is unchanged. Empty name stays empty. */ +static FileName ST_OutName(std::string const& name, std::string const& prefix) { + if (name.empty()) return FileName(); + FileName fn(name); + if (prefix.empty()) return fn; + return fn.PrependFileName(prefix); +} + /** DataFiles are opened only at the end of the run. Fail at Init if the * parent directory is missing so a long trajectory is not processed only * to lose the write. */ -static int ST_CheckParentDir(DataFile* df, const char* key) { - if (df == 0) return 0; - std::string dir = df->DataFilename().DirPrefix_NoSlash(); +static int ST_CheckParentDir(FileName const& fn, const char* key) { + if (fn.empty()) return 0; + std::string dir = fn.DirPrefix_NoSlash(); if (dir.empty()) return 0; struct stat st; if (stat(dir.c_str(), &st) != 0) { @@ -748,6 +756,11 @@ static int ST_CheckParentDir(DataFile* df, const char* key) { return 0; } +static int ST_CheckParentDir(DataFile* df, const char* key) { + if (df == 0) return 0; + return ST_CheckParentDir(df->DataFilename(), key); +} + // ----------------------------------------------------------------------------- /// CONSTRUCTOR — Willard–Chandler, nsurf 2, normal z; grid / σ match the Python. Action_SurfaceTension::Action_SurfaceTension() : @@ -802,7 +815,7 @@ void Action_SurfaceTension::Help() const { "\t[sigmaxy ] [sigmaz | sigmanormal ]\n" "\t[bulkhalfwidth ] [threshold ]\n" "\t[qmin ] [qmax ] [lx ] [ly ] [lz ]\n" - "\t[nblock ] [dt ] [blocktime ]\n" + "\t[nblock ] [dt ] [blocktime ] [fprefix ]\n" "\t[out | spectrumout ] [roughout ] [blockout ]\n" "\t[summaryout ]\n" "\t[spectrumagr ] [roughagr ] [blockagr ]\n" @@ -818,6 +831,8 @@ void Action_SurfaceTension::Help() const { " blocktime (ps) with dt (analyzed-frame spacing, ps) sets nblock.\n" " out is an alias for spectrumout. Write to the current directory,\n" " e.g. spectrumout spec.dat roughout rough.dat blockout blocks.dat.\n" + " fprefix is prepended to each of those file names (directory unchanged),\n" + " e.g. fprefix 150K_ spectrumout spec.dat writes 150K_spec.dat.\n" " A directory in the name must already exist; it is not created.\n"); } @@ -838,6 +853,8 @@ Action::RetType Action_SurfaceTension::Init(ArgList& actionArgs, ActionInit& ini debug_ = debugIn; // Optional output files. AddDataFile returns 0 if the keyword is absent. // out == spectrumout (usual cpptraj keyword for the main result file). + // fprefix is prepended to each basename so multiple runs can share a directory. + std::string fprefix = actionArgs.GetStringKey("fprefix"); bool has_spectrumout = actionArgs.Contains("spectrumout"); bool has_out = actionArgs.Contains("out"); std::string specname = actionArgs.GetStringKey("spectrumout"); @@ -849,21 +866,32 @@ Action::RetType Action_SurfaceTension::Init(ArgList& actionArgs, ActionInit& ini if (specname.empty()) specname = outname; bool has_summaryout = actionArgs.Contains("summaryout"); - std::string sumname = actionArgs.GetStringKey("summaryout"); - DataFile* spectrumFile = init.DFL().AddDataFile(specname, actionArgs); - DataFile* roughFile = init.DFL().AddDataFile(actionArgs.GetStringKey("roughout"), actionArgs); - DataFile* blockFile = init.DFL().AddDataFile(actionArgs.GetStringKey("blockout"), actionArgs); - DataFile* spectrumAgr = init.DFL().AddDataFile(actionArgs.GetStringKey("spectrumagr"), actionArgs, DataFile::XMGRACE); - DataFile* roughAgr = init.DFL().AddDataFile(actionArgs.GetStringKey("roughagr"), actionArgs, DataFile::XMGRACE); - DataFile* blockAgr = init.DFL().AddDataFile(actionArgs.GetStringKey("blockagr"), actionArgs, DataFile::XMGRACE); - DataFile* spectrumGnu = init.DFL().AddDataFile(actionArgs.GetStringKey("spectrumgnu"), actionArgs, DataFile::GNUPLOT); - DataFile* roughGnu = init.DFL().AddDataFile(actionArgs.GetStringKey("roughgnu"), actionArgs, DataFile::GNUPLOT); - DataFile* blockGnu = init.DFL().AddDataFile(actionArgs.GetStringKey("blockgnu"), actionArgs, DataFile::GNUPLOT); - summaryFile_ = init.DFL().AddCpptrajFile(sumname, "SurfTension summary"); + FileName specFileName = ST_OutName(specname, fprefix); + FileName roughName = ST_OutName(actionArgs.GetStringKey("roughout"), fprefix); + FileName blockName = ST_OutName(actionArgs.GetStringKey("blockout"), fprefix); + FileName specAgrName = ST_OutName(actionArgs.GetStringKey("spectrumagr"), fprefix); + FileName roughAgrName = ST_OutName(actionArgs.GetStringKey("roughagr"), fprefix); + FileName blockAgrName = ST_OutName(actionArgs.GetStringKey("blockagr"), fprefix); + FileName specGnuName = ST_OutName(actionArgs.GetStringKey("spectrumgnu"), fprefix); + FileName roughGnuName = ST_OutName(actionArgs.GetStringKey("roughgnu"), fprefix); + FileName blockGnuName = ST_OutName(actionArgs.GetStringKey("blockgnu"), fprefix); + FileName sumName = ST_OutName(actionArgs.GetStringKey("summaryout"), fprefix); + DataFile* spectrumFile = init.DFL().AddDataFile(specFileName, actionArgs); + DataFile* roughFile = init.DFL().AddDataFile(roughName, actionArgs); + DataFile* blockFile = init.DFL().AddDataFile(blockName, actionArgs); + DataFile* spectrumAgr = init.DFL().AddDataFile(specAgrName, actionArgs, DataFile::XMGRACE); + DataFile* roughAgr = init.DFL().AddDataFile(roughAgrName, actionArgs, DataFile::XMGRACE); + DataFile* blockAgr = init.DFL().AddDataFile(blockAgrName, actionArgs, DataFile::XMGRACE); + DataFile* spectrumGnu = init.DFL().AddDataFile(specGnuName, actionArgs, DataFile::GNUPLOT); + DataFile* roughGnu = init.DFL().AddDataFile(roughGnuName, actionArgs, DataFile::GNUPLOT); + DataFile* blockGnu = init.DFL().AddDataFile(blockGnuName, actionArgs, DataFile::GNUPLOT); + summaryFile_ = init.DFL().AddCpptrajFile(sumName, "SurfTension summary"); if (has_summaryout && summaryFile_ == 0) { - mprinterr("Error: Could not open summaryout '%s'.\n", sumname.c_str()); + mprinterr("Error: Could not open summaryout '%s'.\n", sumName.full()); return Action::ERR; } + if (ST_CheckParentDir(sumName, "summaryout")) + return Action::ERR; if (ST_CheckParentDir(spectrumFile, "spectrumout") || ST_CheckParentDir(roughFile, "roughout") || ST_CheckParentDir(blockFile, "blockout") || @@ -1207,6 +1235,8 @@ Action::RetType Action_SurfaceTension::Init(ArgList& actionArgs, ActionInit& ini qmax_); mprintf("\tHelfrich kappa: linear fit of 1/(q^2 S) vs q^2 on that window.\n"); mprintf("\tHeight-field 2-D FFT: PubFFT (numpy fft2 / (nx*ny)).\n"); + if (!fprefix.empty()) + mprintf("\tOutput file prefix: '%s'\n", fprefix.c_str()); if (lx_user_ > 0.0) mprintf("\tUsing fixed Lx= %g Ang (%s)\n", lx_user_, (normal_ == AXIS_X) ? "normal" : "lateral"); diff --git a/test/Test_SurfTension/slab.pdb b/test/Test_SurfTension/slab.pdb index 51c5fc1dd3..569238ab15 100644 --- a/test/Test_SurfTension/slab.pdb +++ b/test/Test_SurfTension/slab.pdb @@ -1,1003 +1,1003 @@ CRYST1 20.000 20.000 20.000 90.00 90.00 90.00 P 1 1 -REMARK cubic lattice with z-corrugation for surftension tests -ATOM 1 O WAT 1 1.000 1.000 1.029 1.00 0.00 O -ATOM 2 O WAT 2 1.000 1.000 3.029 1.00 0.00 O -ATOM 3 O WAT 3 1.000 1.000 5.029 1.00 0.00 O -ATOM 4 O WAT 4 1.000 1.000 7.029 1.00 0.00 O -ATOM 5 O WAT 5 1.000 1.000 9.029 1.00 0.00 O -ATOM 6 O WAT 6 1.000 1.000 11.029 1.00 0.00 O -ATOM 7 O WAT 7 1.000 1.000 13.029 1.00 0.00 O -ATOM 8 O WAT 8 1.000 1.000 15.029 1.00 0.00 O -ATOM 9 O WAT 9 1.000 1.000 17.029 1.00 0.00 O -ATOM 10 O WAT 10 1.000 1.000 19.029 1.00 0.00 O -ATOM 11 O WAT 11 1.000 3.000 1.075 1.00 0.00 O -ATOM 12 O WAT 12 1.000 3.000 3.075 1.00 0.00 O -ATOM 13 O WAT 13 1.000 3.000 5.075 1.00 0.00 O -ATOM 14 O WAT 14 1.000 3.000 7.075 1.00 0.00 O -ATOM 15 O WAT 15 1.000 3.000 9.075 1.00 0.00 O -ATOM 16 O WAT 16 1.000 3.000 11.075 1.00 0.00 O -ATOM 17 O WAT 17 1.000 3.000 13.075 1.00 0.00 O -ATOM 18 O WAT 18 1.000 3.000 15.075 1.00 0.00 O -ATOM 19 O WAT 19 1.000 3.000 17.075 1.00 0.00 O -ATOM 20 O WAT 20 1.000 3.000 19.075 1.00 0.00 O -ATOM 21 O WAT 21 1.000 5.000 1.093 1.00 0.00 O -ATOM 22 O WAT 22 1.000 5.000 3.093 1.00 0.00 O -ATOM 23 O WAT 23 1.000 5.000 5.093 1.00 0.00 O -ATOM 24 O WAT 24 1.000 5.000 7.093 1.00 0.00 O -ATOM 25 O WAT 25 1.000 5.000 9.093 1.00 0.00 O -ATOM 26 O WAT 26 1.000 5.000 11.093 1.00 0.00 O -ATOM 27 O WAT 27 1.000 5.000 13.093 1.00 0.00 O -ATOM 28 O WAT 28 1.000 5.000 15.093 1.00 0.00 O -ATOM 29 O WAT 29 1.000 5.000 17.093 1.00 0.00 O -ATOM 30 O WAT 30 1.000 5.000 19.093 1.00 0.00 O -ATOM 31 O WAT 31 1.000 7.000 1.075 1.00 0.00 O -ATOM 32 O WAT 32 1.000 7.000 3.075 1.00 0.00 O -ATOM 33 O WAT 33 1.000 7.000 5.075 1.00 0.00 O -ATOM 34 O WAT 34 1.000 7.000 7.075 1.00 0.00 O -ATOM 35 O WAT 35 1.000 7.000 9.075 1.00 0.00 O -ATOM 36 O WAT 36 1.000 7.000 11.075 1.00 0.00 O -ATOM 37 O WAT 37 1.000 7.000 13.075 1.00 0.00 O -ATOM 38 O WAT 38 1.000 7.000 15.075 1.00 0.00 O -ATOM 39 O WAT 39 1.000 7.000 17.075 1.00 0.00 O -ATOM 40 O WAT 40 1.000 7.000 19.075 1.00 0.00 O -ATOM 41 O WAT 41 1.000 9.000 1.029 1.00 0.00 O -ATOM 42 O WAT 42 1.000 9.000 3.029 1.00 0.00 O -ATOM 43 O WAT 43 1.000 9.000 5.029 1.00 0.00 O -ATOM 44 O WAT 44 1.000 9.000 7.029 1.00 0.00 O -ATOM 45 O WAT 45 1.000 9.000 9.029 1.00 0.00 O -ATOM 46 O WAT 46 1.000 9.000 11.029 1.00 0.00 O -ATOM 47 O WAT 47 1.000 9.000 13.029 1.00 0.00 O -ATOM 48 O WAT 48 1.000 9.000 15.029 1.00 0.00 O -ATOM 49 O WAT 49 1.000 9.000 17.029 1.00 0.00 O -ATOM 50 O WAT 50 1.000 9.000 19.029 1.00 0.00 O -ATOM 51 O WAT 51 1.000 11.000 0.971 1.00 0.00 O -ATOM 52 O WAT 52 1.000 11.000 2.971 1.00 0.00 O -ATOM 53 O WAT 53 1.000 11.000 4.971 1.00 0.00 O -ATOM 54 O WAT 54 1.000 11.000 6.971 1.00 0.00 O -ATOM 55 O WAT 55 1.000 11.000 8.971 1.00 0.00 O -ATOM 56 O WAT 56 1.000 11.000 10.971 1.00 0.00 O -ATOM 57 O WAT 57 1.000 11.000 12.971 1.00 0.00 O -ATOM 58 O WAT 58 1.000 11.000 14.971 1.00 0.00 O -ATOM 59 O WAT 59 1.000 11.000 16.971 1.00 0.00 O -ATOM 60 O WAT 60 1.000 11.000 18.971 1.00 0.00 O -ATOM 61 O WAT 61 1.000 13.000 0.925 1.00 0.00 O -ATOM 62 O WAT 62 1.000 13.000 2.925 1.00 0.00 O -ATOM 63 O WAT 63 1.000 13.000 4.925 1.00 0.00 O -ATOM 64 O WAT 64 1.000 13.000 6.925 1.00 0.00 O -ATOM 65 O WAT 65 1.000 13.000 8.925 1.00 0.00 O -ATOM 66 O WAT 66 1.000 13.000 10.925 1.00 0.00 O -ATOM 67 O WAT 67 1.000 13.000 12.925 1.00 0.00 O -ATOM 68 O WAT 68 1.000 13.000 14.925 1.00 0.00 O -ATOM 69 O WAT 69 1.000 13.000 16.925 1.00 0.00 O -ATOM 70 O WAT 70 1.000 13.000 18.925 1.00 0.00 O -ATOM 71 O WAT 71 1.000 15.000 0.907 1.00 0.00 O -ATOM 72 O WAT 72 1.000 15.000 2.907 1.00 0.00 O -ATOM 73 O WAT 73 1.000 15.000 4.907 1.00 0.00 O -ATOM 74 O WAT 74 1.000 15.000 6.907 1.00 0.00 O -ATOM 75 O WAT 75 1.000 15.000 8.907 1.00 0.00 O -ATOM 76 O WAT 76 1.000 15.000 10.907 1.00 0.00 O -ATOM 77 O WAT 77 1.000 15.000 12.907 1.00 0.00 O -ATOM 78 O WAT 78 1.000 15.000 14.907 1.00 0.00 O -ATOM 79 O WAT 79 1.000 15.000 16.907 1.00 0.00 O -ATOM 80 O WAT 80 1.000 15.000 18.907 1.00 0.00 O -ATOM 81 O WAT 81 1.000 17.000 0.925 1.00 0.00 O -ATOM 82 O WAT 82 1.000 17.000 2.925 1.00 0.00 O -ATOM 83 O WAT 83 1.000 17.000 4.925 1.00 0.00 O -ATOM 84 O WAT 84 1.000 17.000 6.925 1.00 0.00 O -ATOM 85 O WAT 85 1.000 17.000 8.925 1.00 0.00 O -ATOM 86 O WAT 86 1.000 17.000 10.925 1.00 0.00 O -ATOM 87 O WAT 87 1.000 17.000 12.925 1.00 0.00 O -ATOM 88 O WAT 88 1.000 17.000 14.925 1.00 0.00 O -ATOM 89 O WAT 89 1.000 17.000 16.925 1.00 0.00 O -ATOM 90 O WAT 90 1.000 17.000 18.925 1.00 0.00 O -ATOM 91 O WAT 91 1.000 19.000 0.971 1.00 0.00 O -ATOM 92 O WAT 92 1.000 19.000 2.971 1.00 0.00 O -ATOM 93 O WAT 93 1.000 19.000 4.971 1.00 0.00 O -ATOM 94 O WAT 94 1.000 19.000 6.971 1.00 0.00 O -ATOM 95 O WAT 95 1.000 19.000 8.971 1.00 0.00 O -ATOM 96 O WAT 96 1.000 19.000 10.971 1.00 0.00 O -ATOM 97 O WAT 97 1.000 19.000 12.971 1.00 0.00 O -ATOM 98 O WAT 98 1.000 19.000 14.971 1.00 0.00 O -ATOM 99 O WAT 99 1.000 19.000 16.971 1.00 0.00 O -ATOM 100 O WAT 100 1.000 19.000 18.971 1.00 0.00 O -ATOM 101 O WAT 101 3.000 1.000 1.075 1.00 0.00 O -ATOM 102 O WAT 102 3.000 1.000 3.075 1.00 0.00 O -ATOM 103 O WAT 103 3.000 1.000 5.075 1.00 0.00 O -ATOM 104 O WAT 104 3.000 1.000 7.075 1.00 0.00 O -ATOM 105 O WAT 105 3.000 1.000 9.075 1.00 0.00 O -ATOM 106 O WAT 106 3.000 1.000 11.075 1.00 0.00 O -ATOM 107 O WAT 107 3.000 1.000 13.075 1.00 0.00 O -ATOM 108 O WAT 108 3.000 1.000 15.075 1.00 0.00 O -ATOM 109 O WAT 109 3.000 1.000 17.075 1.00 0.00 O -ATOM 110 O WAT 110 3.000 1.000 19.075 1.00 0.00 O -ATOM 111 O WAT 111 3.000 3.000 1.196 1.00 0.00 O -ATOM 112 O WAT 112 3.000 3.000 3.196 1.00 0.00 O -ATOM 113 O WAT 113 3.000 3.000 5.196 1.00 0.00 O -ATOM 114 O WAT 114 3.000 3.000 7.196 1.00 0.00 O -ATOM 115 O WAT 115 3.000 3.000 9.196 1.00 0.00 O -ATOM 116 O WAT 116 3.000 3.000 11.196 1.00 0.00 O -ATOM 117 O WAT 117 3.000 3.000 13.196 1.00 0.00 O -ATOM 118 O WAT 118 3.000 3.000 15.196 1.00 0.00 O -ATOM 119 O WAT 119 3.000 3.000 17.196 1.00 0.00 O -ATOM 120 O WAT 120 3.000 3.000 19.196 1.00 0.00 O -ATOM 121 O WAT 121 3.000 5.000 1.243 1.00 0.00 O -ATOM 122 O WAT 122 3.000 5.000 3.243 1.00 0.00 O -ATOM 123 O WAT 123 3.000 5.000 5.243 1.00 0.00 O -ATOM 124 O WAT 124 3.000 5.000 7.243 1.00 0.00 O -ATOM 125 O WAT 125 3.000 5.000 9.243 1.00 0.00 O -ATOM 126 O WAT 126 3.000 5.000 11.243 1.00 0.00 O -ATOM 127 O WAT 127 3.000 5.000 13.243 1.00 0.00 O -ATOM 128 O WAT 128 3.000 5.000 15.243 1.00 0.00 O -ATOM 129 O WAT 129 3.000 5.000 17.243 1.00 0.00 O -ATOM 130 O WAT 130 3.000 5.000 19.243 1.00 0.00 O -ATOM 131 O WAT 131 3.000 7.000 1.196 1.00 0.00 O -ATOM 132 O WAT 132 3.000 7.000 3.196 1.00 0.00 O -ATOM 133 O WAT 133 3.000 7.000 5.196 1.00 0.00 O -ATOM 134 O WAT 134 3.000 7.000 7.196 1.00 0.00 O -ATOM 135 O WAT 135 3.000 7.000 9.196 1.00 0.00 O -ATOM 136 O WAT 136 3.000 7.000 11.196 1.00 0.00 O -ATOM 137 O WAT 137 3.000 7.000 13.196 1.00 0.00 O -ATOM 138 O WAT 138 3.000 7.000 15.196 1.00 0.00 O -ATOM 139 O WAT 139 3.000 7.000 17.196 1.00 0.00 O -ATOM 140 O WAT 140 3.000 7.000 19.196 1.00 0.00 O -ATOM 141 O WAT 141 3.000 9.000 1.075 1.00 0.00 O -ATOM 142 O WAT 142 3.000 9.000 3.075 1.00 0.00 O -ATOM 143 O WAT 143 3.000 9.000 5.075 1.00 0.00 O -ATOM 144 O WAT 144 3.000 9.000 7.075 1.00 0.00 O -ATOM 145 O WAT 145 3.000 9.000 9.075 1.00 0.00 O -ATOM 146 O WAT 146 3.000 9.000 11.075 1.00 0.00 O -ATOM 147 O WAT 147 3.000 9.000 13.075 1.00 0.00 O -ATOM 148 O WAT 148 3.000 9.000 15.075 1.00 0.00 O -ATOM 149 O WAT 149 3.000 9.000 17.075 1.00 0.00 O -ATOM 150 O WAT 150 3.000 9.000 19.075 1.00 0.00 O -ATOM 151 O WAT 151 3.000 11.000 0.925 1.00 0.00 O -ATOM 152 O WAT 152 3.000 11.000 2.925 1.00 0.00 O -ATOM 153 O WAT 153 3.000 11.000 4.925 1.00 0.00 O -ATOM 154 O WAT 154 3.000 11.000 6.925 1.00 0.00 O -ATOM 155 O WAT 155 3.000 11.000 8.925 1.00 0.00 O -ATOM 156 O WAT 156 3.000 11.000 10.925 1.00 0.00 O -ATOM 157 O WAT 157 3.000 11.000 12.925 1.00 0.00 O -ATOM 158 O WAT 158 3.000 11.000 14.925 1.00 0.00 O -ATOM 159 O WAT 159 3.000 11.000 16.925 1.00 0.00 O -ATOM 160 O WAT 160 3.000 11.000 18.925 1.00 0.00 O -ATOM 161 O WAT 161 3.000 13.000 0.804 1.00 0.00 O -ATOM 162 O WAT 162 3.000 13.000 2.804 1.00 0.00 O -ATOM 163 O WAT 163 3.000 13.000 4.804 1.00 0.00 O -ATOM 164 O WAT 164 3.000 13.000 6.804 1.00 0.00 O -ATOM 165 O WAT 165 3.000 13.000 8.804 1.00 0.00 O -ATOM 166 O WAT 166 3.000 13.000 10.804 1.00 0.00 O -ATOM 167 O WAT 167 3.000 13.000 12.804 1.00 0.00 O -ATOM 168 O WAT 168 3.000 13.000 14.804 1.00 0.00 O -ATOM 169 O WAT 169 3.000 13.000 16.804 1.00 0.00 O -ATOM 170 O WAT 170 3.000 13.000 18.804 1.00 0.00 O -ATOM 171 O WAT 171 3.000 15.000 0.757 1.00 0.00 O -ATOM 172 O WAT 172 3.000 15.000 2.757 1.00 0.00 O -ATOM 173 O WAT 173 3.000 15.000 4.757 1.00 0.00 O -ATOM 174 O WAT 174 3.000 15.000 6.757 1.00 0.00 O -ATOM 175 O WAT 175 3.000 15.000 8.757 1.00 0.00 O -ATOM 176 O WAT 176 3.000 15.000 10.757 1.00 0.00 O -ATOM 177 O WAT 177 3.000 15.000 12.757 1.00 0.00 O -ATOM 178 O WAT 178 3.000 15.000 14.757 1.00 0.00 O -ATOM 179 O WAT 179 3.000 15.000 16.757 1.00 0.00 O -ATOM 180 O WAT 180 3.000 15.000 18.757 1.00 0.00 O -ATOM 181 O WAT 181 3.000 17.000 0.804 1.00 0.00 O -ATOM 182 O WAT 182 3.000 17.000 2.804 1.00 0.00 O -ATOM 183 O WAT 183 3.000 17.000 4.804 1.00 0.00 O -ATOM 184 O WAT 184 3.000 17.000 6.804 1.00 0.00 O -ATOM 185 O WAT 185 3.000 17.000 8.804 1.00 0.00 O -ATOM 186 O WAT 186 3.000 17.000 10.804 1.00 0.00 O -ATOM 187 O WAT 187 3.000 17.000 12.804 1.00 0.00 O -ATOM 188 O WAT 188 3.000 17.000 14.804 1.00 0.00 O -ATOM 189 O WAT 189 3.000 17.000 16.804 1.00 0.00 O -ATOM 190 O WAT 190 3.000 17.000 18.804 1.00 0.00 O -ATOM 191 O WAT 191 3.000 19.000 0.925 1.00 0.00 O -ATOM 192 O WAT 192 3.000 19.000 2.925 1.00 0.00 O -ATOM 193 O WAT 193 3.000 19.000 4.925 1.00 0.00 O -ATOM 194 O WAT 194 3.000 19.000 6.925 1.00 0.00 O -ATOM 195 O WAT 195 3.000 19.000 8.925 1.00 0.00 O -ATOM 196 O WAT 196 3.000 19.000 10.925 1.00 0.00 O -ATOM 197 O WAT 197 3.000 19.000 12.925 1.00 0.00 O -ATOM 198 O WAT 198 3.000 19.000 14.925 1.00 0.00 O -ATOM 199 O WAT 199 3.000 19.000 16.925 1.00 0.00 O -ATOM 200 O WAT 200 3.000 19.000 18.925 1.00 0.00 O -ATOM 201 O WAT 201 5.000 1.000 1.093 1.00 0.00 O -ATOM 202 O WAT 202 5.000 1.000 3.093 1.00 0.00 O -ATOM 203 O WAT 203 5.000 1.000 5.093 1.00 0.00 O -ATOM 204 O WAT 204 5.000 1.000 7.093 1.00 0.00 O -ATOM 205 O WAT 205 5.000 1.000 9.093 1.00 0.00 O -ATOM 206 O WAT 206 5.000 1.000 11.093 1.00 0.00 O -ATOM 207 O WAT 207 5.000 1.000 13.093 1.00 0.00 O -ATOM 208 O WAT 208 5.000 1.000 15.093 1.00 0.00 O -ATOM 209 O WAT 209 5.000 1.000 17.093 1.00 0.00 O -ATOM 210 O WAT 210 5.000 1.000 19.093 1.00 0.00 O -ATOM 211 O WAT 211 5.000 3.000 1.243 1.00 0.00 O -ATOM 212 O WAT 212 5.000 3.000 3.243 1.00 0.00 O -ATOM 213 O WAT 213 5.000 3.000 5.243 1.00 0.00 O -ATOM 214 O WAT 214 5.000 3.000 7.243 1.00 0.00 O -ATOM 215 O WAT 215 5.000 3.000 9.243 1.00 0.00 O -ATOM 216 O WAT 216 5.000 3.000 11.243 1.00 0.00 O -ATOM 217 O WAT 217 5.000 3.000 13.243 1.00 0.00 O -ATOM 218 O WAT 218 5.000 3.000 15.243 1.00 0.00 O -ATOM 219 O WAT 219 5.000 3.000 17.243 1.00 0.00 O -ATOM 220 O WAT 220 5.000 3.000 19.243 1.00 0.00 O -ATOM 221 O WAT 221 5.000 5.000 1.300 1.00 0.00 O -ATOM 222 O WAT 222 5.000 5.000 3.300 1.00 0.00 O -ATOM 223 O WAT 223 5.000 5.000 5.300 1.00 0.00 O -ATOM 224 O WAT 224 5.000 5.000 7.300 1.00 0.00 O -ATOM 225 O WAT 225 5.000 5.000 9.300 1.00 0.00 O -ATOM 226 O WAT 226 5.000 5.000 11.300 1.00 0.00 O -ATOM 227 O WAT 227 5.000 5.000 13.300 1.00 0.00 O -ATOM 228 O WAT 228 5.000 5.000 15.300 1.00 0.00 O -ATOM 229 O WAT 229 5.000 5.000 17.300 1.00 0.00 O -ATOM 230 O WAT 230 5.000 5.000 19.300 1.00 0.00 O -ATOM 231 O WAT 231 5.000 7.000 1.243 1.00 0.00 O -ATOM 232 O WAT 232 5.000 7.000 3.243 1.00 0.00 O -ATOM 233 O WAT 233 5.000 7.000 5.243 1.00 0.00 O -ATOM 234 O WAT 234 5.000 7.000 7.243 1.00 0.00 O -ATOM 235 O WAT 235 5.000 7.000 9.243 1.00 0.00 O -ATOM 236 O WAT 236 5.000 7.000 11.243 1.00 0.00 O -ATOM 237 O WAT 237 5.000 7.000 13.243 1.00 0.00 O -ATOM 238 O WAT 238 5.000 7.000 15.243 1.00 0.00 O -ATOM 239 O WAT 239 5.000 7.000 17.243 1.00 0.00 O -ATOM 240 O WAT 240 5.000 7.000 19.243 1.00 0.00 O -ATOM 241 O WAT 241 5.000 9.000 1.093 1.00 0.00 O -ATOM 242 O WAT 242 5.000 9.000 3.093 1.00 0.00 O -ATOM 243 O WAT 243 5.000 9.000 5.093 1.00 0.00 O -ATOM 244 O WAT 244 5.000 9.000 7.093 1.00 0.00 O -ATOM 245 O WAT 245 5.000 9.000 9.093 1.00 0.00 O -ATOM 246 O WAT 246 5.000 9.000 11.093 1.00 0.00 O -ATOM 247 O WAT 247 5.000 9.000 13.093 1.00 0.00 O -ATOM 248 O WAT 248 5.000 9.000 15.093 1.00 0.00 O -ATOM 249 O WAT 249 5.000 9.000 17.093 1.00 0.00 O -ATOM 250 O WAT 250 5.000 9.000 19.093 1.00 0.00 O -ATOM 251 O WAT 251 5.000 11.000 0.907 1.00 0.00 O -ATOM 252 O WAT 252 5.000 11.000 2.907 1.00 0.00 O -ATOM 253 O WAT 253 5.000 11.000 4.907 1.00 0.00 O -ATOM 254 O WAT 254 5.000 11.000 6.907 1.00 0.00 O -ATOM 255 O WAT 255 5.000 11.000 8.907 1.00 0.00 O -ATOM 256 O WAT 256 5.000 11.000 10.907 1.00 0.00 O -ATOM 257 O WAT 257 5.000 11.000 12.907 1.00 0.00 O -ATOM 258 O WAT 258 5.000 11.000 14.907 1.00 0.00 O -ATOM 259 O WAT 259 5.000 11.000 16.907 1.00 0.00 O -ATOM 260 O WAT 260 5.000 11.000 18.907 1.00 0.00 O -ATOM 261 O WAT 261 5.000 13.000 0.757 1.00 0.00 O -ATOM 262 O WAT 262 5.000 13.000 2.757 1.00 0.00 O -ATOM 263 O WAT 263 5.000 13.000 4.757 1.00 0.00 O -ATOM 264 O WAT 264 5.000 13.000 6.757 1.00 0.00 O -ATOM 265 O WAT 265 5.000 13.000 8.757 1.00 0.00 O -ATOM 266 O WAT 266 5.000 13.000 10.757 1.00 0.00 O -ATOM 267 O WAT 267 5.000 13.000 12.757 1.00 0.00 O -ATOM 268 O WAT 268 5.000 13.000 14.757 1.00 0.00 O -ATOM 269 O WAT 269 5.000 13.000 16.757 1.00 0.00 O -ATOM 270 O WAT 270 5.000 13.000 18.757 1.00 0.00 O -ATOM 271 O WAT 271 5.000 15.000 0.700 1.00 0.00 O -ATOM 272 O WAT 272 5.000 15.000 2.700 1.00 0.00 O -ATOM 273 O WAT 273 5.000 15.000 4.700 1.00 0.00 O -ATOM 274 O WAT 274 5.000 15.000 6.700 1.00 0.00 O -ATOM 275 O WAT 275 5.000 15.000 8.700 1.00 0.00 O -ATOM 276 O WAT 276 5.000 15.000 10.700 1.00 0.00 O -ATOM 277 O WAT 277 5.000 15.000 12.700 1.00 0.00 O -ATOM 278 O WAT 278 5.000 15.000 14.700 1.00 0.00 O -ATOM 279 O WAT 279 5.000 15.000 16.700 1.00 0.00 O -ATOM 280 O WAT 280 5.000 15.000 18.700 1.00 0.00 O -ATOM 281 O WAT 281 5.000 17.000 0.757 1.00 0.00 O -ATOM 282 O WAT 282 5.000 17.000 2.757 1.00 0.00 O -ATOM 283 O WAT 283 5.000 17.000 4.757 1.00 0.00 O -ATOM 284 O WAT 284 5.000 17.000 6.757 1.00 0.00 O -ATOM 285 O WAT 285 5.000 17.000 8.757 1.00 0.00 O -ATOM 286 O WAT 286 5.000 17.000 10.757 1.00 0.00 O -ATOM 287 O WAT 287 5.000 17.000 12.757 1.00 0.00 O -ATOM 288 O WAT 288 5.000 17.000 14.757 1.00 0.00 O -ATOM 289 O WAT 289 5.000 17.000 16.757 1.00 0.00 O -ATOM 290 O WAT 290 5.000 17.000 18.757 1.00 0.00 O -ATOM 291 O WAT 291 5.000 19.000 0.907 1.00 0.00 O -ATOM 292 O WAT 292 5.000 19.000 2.907 1.00 0.00 O -ATOM 293 O WAT 293 5.000 19.000 4.907 1.00 0.00 O -ATOM 294 O WAT 294 5.000 19.000 6.907 1.00 0.00 O -ATOM 295 O WAT 295 5.000 19.000 8.907 1.00 0.00 O -ATOM 296 O WAT 296 5.000 19.000 10.907 1.00 0.00 O -ATOM 297 O WAT 297 5.000 19.000 12.907 1.00 0.00 O -ATOM 298 O WAT 298 5.000 19.000 14.907 1.00 0.00 O -ATOM 299 O WAT 299 5.000 19.000 16.907 1.00 0.00 O -ATOM 300 O WAT 300 5.000 19.000 18.907 1.00 0.00 O -ATOM 301 O WAT 301 7.000 1.000 1.075 1.00 0.00 O -ATOM 302 O WAT 302 7.000 1.000 3.075 1.00 0.00 O -ATOM 303 O WAT 303 7.000 1.000 5.075 1.00 0.00 O -ATOM 304 O WAT 304 7.000 1.000 7.075 1.00 0.00 O -ATOM 305 O WAT 305 7.000 1.000 9.075 1.00 0.00 O -ATOM 306 O WAT 306 7.000 1.000 11.075 1.00 0.00 O -ATOM 307 O WAT 307 7.000 1.000 13.075 1.00 0.00 O -ATOM 308 O WAT 308 7.000 1.000 15.075 1.00 0.00 O -ATOM 309 O WAT 309 7.000 1.000 17.075 1.00 0.00 O -ATOM 310 O WAT 310 7.000 1.000 19.075 1.00 0.00 O -ATOM 311 O WAT 311 7.000 3.000 1.196 1.00 0.00 O -ATOM 312 O WAT 312 7.000 3.000 3.196 1.00 0.00 O -ATOM 313 O WAT 313 7.000 3.000 5.196 1.00 0.00 O -ATOM 314 O WAT 314 7.000 3.000 7.196 1.00 0.00 O -ATOM 315 O WAT 315 7.000 3.000 9.196 1.00 0.00 O -ATOM 316 O WAT 316 7.000 3.000 11.196 1.00 0.00 O -ATOM 317 O WAT 317 7.000 3.000 13.196 1.00 0.00 O -ATOM 318 O WAT 318 7.000 3.000 15.196 1.00 0.00 O -ATOM 319 O WAT 319 7.000 3.000 17.196 1.00 0.00 O -ATOM 320 O WAT 320 7.000 3.000 19.196 1.00 0.00 O -ATOM 321 O WAT 321 7.000 5.000 1.243 1.00 0.00 O -ATOM 322 O WAT 322 7.000 5.000 3.243 1.00 0.00 O -ATOM 323 O WAT 323 7.000 5.000 5.243 1.00 0.00 O -ATOM 324 O WAT 324 7.000 5.000 7.243 1.00 0.00 O -ATOM 325 O WAT 325 7.000 5.000 9.243 1.00 0.00 O -ATOM 326 O WAT 326 7.000 5.000 11.243 1.00 0.00 O -ATOM 327 O WAT 327 7.000 5.000 13.243 1.00 0.00 O -ATOM 328 O WAT 328 7.000 5.000 15.243 1.00 0.00 O -ATOM 329 O WAT 329 7.000 5.000 17.243 1.00 0.00 O -ATOM 330 O WAT 330 7.000 5.000 19.243 1.00 0.00 O -ATOM 331 O WAT 331 7.000 7.000 1.196 1.00 0.00 O -ATOM 332 O WAT 332 7.000 7.000 3.196 1.00 0.00 O -ATOM 333 O WAT 333 7.000 7.000 5.196 1.00 0.00 O -ATOM 334 O WAT 334 7.000 7.000 7.196 1.00 0.00 O -ATOM 335 O WAT 335 7.000 7.000 9.196 1.00 0.00 O -ATOM 336 O WAT 336 7.000 7.000 11.196 1.00 0.00 O -ATOM 337 O WAT 337 7.000 7.000 13.196 1.00 0.00 O -ATOM 338 O WAT 338 7.000 7.000 15.196 1.00 0.00 O -ATOM 339 O WAT 339 7.000 7.000 17.196 1.00 0.00 O -ATOM 340 O WAT 340 7.000 7.000 19.196 1.00 0.00 O -ATOM 341 O WAT 341 7.000 9.000 1.075 1.00 0.00 O -ATOM 342 O WAT 342 7.000 9.000 3.075 1.00 0.00 O -ATOM 343 O WAT 343 7.000 9.000 5.075 1.00 0.00 O -ATOM 344 O WAT 344 7.000 9.000 7.075 1.00 0.00 O -ATOM 345 O WAT 345 7.000 9.000 9.075 1.00 0.00 O -ATOM 346 O WAT 346 7.000 9.000 11.075 1.00 0.00 O -ATOM 347 O WAT 347 7.000 9.000 13.075 1.00 0.00 O -ATOM 348 O WAT 348 7.000 9.000 15.075 1.00 0.00 O -ATOM 349 O WAT 349 7.000 9.000 17.075 1.00 0.00 O -ATOM 350 O WAT 350 7.000 9.000 19.075 1.00 0.00 O -ATOM 351 O WAT 351 7.000 11.000 0.925 1.00 0.00 O -ATOM 352 O WAT 352 7.000 11.000 2.925 1.00 0.00 O -ATOM 353 O WAT 353 7.000 11.000 4.925 1.00 0.00 O -ATOM 354 O WAT 354 7.000 11.000 6.925 1.00 0.00 O -ATOM 355 O WAT 355 7.000 11.000 8.925 1.00 0.00 O -ATOM 356 O WAT 356 7.000 11.000 10.925 1.00 0.00 O -ATOM 357 O WAT 357 7.000 11.000 12.925 1.00 0.00 O -ATOM 358 O WAT 358 7.000 11.000 14.925 1.00 0.00 O -ATOM 359 O WAT 359 7.000 11.000 16.925 1.00 0.00 O -ATOM 360 O WAT 360 7.000 11.000 18.925 1.00 0.00 O -ATOM 361 O WAT 361 7.000 13.000 0.804 1.00 0.00 O -ATOM 362 O WAT 362 7.000 13.000 2.804 1.00 0.00 O -ATOM 363 O WAT 363 7.000 13.000 4.804 1.00 0.00 O -ATOM 364 O WAT 364 7.000 13.000 6.804 1.00 0.00 O -ATOM 365 O WAT 365 7.000 13.000 8.804 1.00 0.00 O -ATOM 366 O WAT 366 7.000 13.000 10.804 1.00 0.00 O -ATOM 367 O WAT 367 7.000 13.000 12.804 1.00 0.00 O -ATOM 368 O WAT 368 7.000 13.000 14.804 1.00 0.00 O -ATOM 369 O WAT 369 7.000 13.000 16.804 1.00 0.00 O -ATOM 370 O WAT 370 7.000 13.000 18.804 1.00 0.00 O -ATOM 371 O WAT 371 7.000 15.000 0.757 1.00 0.00 O -ATOM 372 O WAT 372 7.000 15.000 2.757 1.00 0.00 O -ATOM 373 O WAT 373 7.000 15.000 4.757 1.00 0.00 O -ATOM 374 O WAT 374 7.000 15.000 6.757 1.00 0.00 O -ATOM 375 O WAT 375 7.000 15.000 8.757 1.00 0.00 O -ATOM 376 O WAT 376 7.000 15.000 10.757 1.00 0.00 O -ATOM 377 O WAT 377 7.000 15.000 12.757 1.00 0.00 O -ATOM 378 O WAT 378 7.000 15.000 14.757 1.00 0.00 O -ATOM 379 O WAT 379 7.000 15.000 16.757 1.00 0.00 O -ATOM 380 O WAT 380 7.000 15.000 18.757 1.00 0.00 O -ATOM 381 O WAT 381 7.000 17.000 0.804 1.00 0.00 O -ATOM 382 O WAT 382 7.000 17.000 2.804 1.00 0.00 O -ATOM 383 O WAT 383 7.000 17.000 4.804 1.00 0.00 O -ATOM 384 O WAT 384 7.000 17.000 6.804 1.00 0.00 O -ATOM 385 O WAT 385 7.000 17.000 8.804 1.00 0.00 O -ATOM 386 O WAT 386 7.000 17.000 10.804 1.00 0.00 O -ATOM 387 O WAT 387 7.000 17.000 12.804 1.00 0.00 O -ATOM 388 O WAT 388 7.000 17.000 14.804 1.00 0.00 O -ATOM 389 O WAT 389 7.000 17.000 16.804 1.00 0.00 O -ATOM 390 O WAT 390 7.000 17.000 18.804 1.00 0.00 O -ATOM 391 O WAT 391 7.000 19.000 0.925 1.00 0.00 O -ATOM 392 O WAT 392 7.000 19.000 2.925 1.00 0.00 O -ATOM 393 O WAT 393 7.000 19.000 4.925 1.00 0.00 O -ATOM 394 O WAT 394 7.000 19.000 6.925 1.00 0.00 O -ATOM 395 O WAT 395 7.000 19.000 8.925 1.00 0.00 O -ATOM 396 O WAT 396 7.000 19.000 10.925 1.00 0.00 O -ATOM 397 O WAT 397 7.000 19.000 12.925 1.00 0.00 O -ATOM 398 O WAT 398 7.000 19.000 14.925 1.00 0.00 O -ATOM 399 O WAT 399 7.000 19.000 16.925 1.00 0.00 O -ATOM 400 O WAT 400 7.000 19.000 18.925 1.00 0.00 O -ATOM 401 O WAT 401 9.000 1.000 1.029 1.00 0.00 O -ATOM 402 O WAT 402 9.000 1.000 3.029 1.00 0.00 O -ATOM 403 O WAT 403 9.000 1.000 5.029 1.00 0.00 O -ATOM 404 O WAT 404 9.000 1.000 7.029 1.00 0.00 O -ATOM 405 O WAT 405 9.000 1.000 9.029 1.00 0.00 O -ATOM 406 O WAT 406 9.000 1.000 11.029 1.00 0.00 O -ATOM 407 O WAT 407 9.000 1.000 13.029 1.00 0.00 O -ATOM 408 O WAT 408 9.000 1.000 15.029 1.00 0.00 O -ATOM 409 O WAT 409 9.000 1.000 17.029 1.00 0.00 O -ATOM 410 O WAT 410 9.000 1.000 19.029 1.00 0.00 O -ATOM 411 O WAT 411 9.000 3.000 1.075 1.00 0.00 O -ATOM 412 O WAT 412 9.000 3.000 3.075 1.00 0.00 O -ATOM 413 O WAT 413 9.000 3.000 5.075 1.00 0.00 O -ATOM 414 O WAT 414 9.000 3.000 7.075 1.00 0.00 O -ATOM 415 O WAT 415 9.000 3.000 9.075 1.00 0.00 O -ATOM 416 O WAT 416 9.000 3.000 11.075 1.00 0.00 O -ATOM 417 O WAT 417 9.000 3.000 13.075 1.00 0.00 O -ATOM 418 O WAT 418 9.000 3.000 15.075 1.00 0.00 O -ATOM 419 O WAT 419 9.000 3.000 17.075 1.00 0.00 O -ATOM 420 O WAT 420 9.000 3.000 19.075 1.00 0.00 O -ATOM 421 O WAT 421 9.000 5.000 1.093 1.00 0.00 O -ATOM 422 O WAT 422 9.000 5.000 3.093 1.00 0.00 O -ATOM 423 O WAT 423 9.000 5.000 5.093 1.00 0.00 O -ATOM 424 O WAT 424 9.000 5.000 7.093 1.00 0.00 O -ATOM 425 O WAT 425 9.000 5.000 9.093 1.00 0.00 O -ATOM 426 O WAT 426 9.000 5.000 11.093 1.00 0.00 O -ATOM 427 O WAT 427 9.000 5.000 13.093 1.00 0.00 O -ATOM 428 O WAT 428 9.000 5.000 15.093 1.00 0.00 O -ATOM 429 O WAT 429 9.000 5.000 17.093 1.00 0.00 O -ATOM 430 O WAT 430 9.000 5.000 19.093 1.00 0.00 O -ATOM 431 O WAT 431 9.000 7.000 1.075 1.00 0.00 O -ATOM 432 O WAT 432 9.000 7.000 3.075 1.00 0.00 O -ATOM 433 O WAT 433 9.000 7.000 5.075 1.00 0.00 O -ATOM 434 O WAT 434 9.000 7.000 7.075 1.00 0.00 O -ATOM 435 O WAT 435 9.000 7.000 9.075 1.00 0.00 O -ATOM 436 O WAT 436 9.000 7.000 11.075 1.00 0.00 O -ATOM 437 O WAT 437 9.000 7.000 13.075 1.00 0.00 O -ATOM 438 O WAT 438 9.000 7.000 15.075 1.00 0.00 O -ATOM 439 O WAT 439 9.000 7.000 17.075 1.00 0.00 O -ATOM 440 O WAT 440 9.000 7.000 19.075 1.00 0.00 O -ATOM 441 O WAT 441 9.000 9.000 1.029 1.00 0.00 O -ATOM 442 O WAT 442 9.000 9.000 3.029 1.00 0.00 O -ATOM 443 O WAT 443 9.000 9.000 5.029 1.00 0.00 O -ATOM 444 O WAT 444 9.000 9.000 7.029 1.00 0.00 O -ATOM 445 O WAT 445 9.000 9.000 9.029 1.00 0.00 O -ATOM 446 O WAT 446 9.000 9.000 11.029 1.00 0.00 O -ATOM 447 O WAT 447 9.000 9.000 13.029 1.00 0.00 O -ATOM 448 O WAT 448 9.000 9.000 15.029 1.00 0.00 O -ATOM 449 O WAT 449 9.000 9.000 17.029 1.00 0.00 O -ATOM 450 O WAT 450 9.000 9.000 19.029 1.00 0.00 O -ATOM 451 O WAT 451 9.000 11.000 0.971 1.00 0.00 O -ATOM 452 O WAT 452 9.000 11.000 2.971 1.00 0.00 O -ATOM 453 O WAT 453 9.000 11.000 4.971 1.00 0.00 O -ATOM 454 O WAT 454 9.000 11.000 6.971 1.00 0.00 O -ATOM 455 O WAT 455 9.000 11.000 8.971 1.00 0.00 O -ATOM 456 O WAT 456 9.000 11.000 10.971 1.00 0.00 O -ATOM 457 O WAT 457 9.000 11.000 12.971 1.00 0.00 O -ATOM 458 O WAT 458 9.000 11.000 14.971 1.00 0.00 O -ATOM 459 O WAT 459 9.000 11.000 16.971 1.00 0.00 O -ATOM 460 O WAT 460 9.000 11.000 18.971 1.00 0.00 O -ATOM 461 O WAT 461 9.000 13.000 0.925 1.00 0.00 O -ATOM 462 O WAT 462 9.000 13.000 2.925 1.00 0.00 O -ATOM 463 O WAT 463 9.000 13.000 4.925 1.00 0.00 O -ATOM 464 O WAT 464 9.000 13.000 6.925 1.00 0.00 O -ATOM 465 O WAT 465 9.000 13.000 8.925 1.00 0.00 O -ATOM 466 O WAT 466 9.000 13.000 10.925 1.00 0.00 O -ATOM 467 O WAT 467 9.000 13.000 12.925 1.00 0.00 O -ATOM 468 O WAT 468 9.000 13.000 14.925 1.00 0.00 O -ATOM 469 O WAT 469 9.000 13.000 16.925 1.00 0.00 O -ATOM 470 O WAT 470 9.000 13.000 18.925 1.00 0.00 O -ATOM 471 O WAT 471 9.000 15.000 0.907 1.00 0.00 O -ATOM 472 O WAT 472 9.000 15.000 2.907 1.00 0.00 O -ATOM 473 O WAT 473 9.000 15.000 4.907 1.00 0.00 O -ATOM 474 O WAT 474 9.000 15.000 6.907 1.00 0.00 O -ATOM 475 O WAT 475 9.000 15.000 8.907 1.00 0.00 O -ATOM 476 O WAT 476 9.000 15.000 10.907 1.00 0.00 O -ATOM 477 O WAT 477 9.000 15.000 12.907 1.00 0.00 O -ATOM 478 O WAT 478 9.000 15.000 14.907 1.00 0.00 O -ATOM 479 O WAT 479 9.000 15.000 16.907 1.00 0.00 O -ATOM 480 O WAT 480 9.000 15.000 18.907 1.00 0.00 O -ATOM 481 O WAT 481 9.000 17.000 0.925 1.00 0.00 O -ATOM 482 O WAT 482 9.000 17.000 2.925 1.00 0.00 O -ATOM 483 O WAT 483 9.000 17.000 4.925 1.00 0.00 O -ATOM 484 O WAT 484 9.000 17.000 6.925 1.00 0.00 O -ATOM 485 O WAT 485 9.000 17.000 8.925 1.00 0.00 O -ATOM 486 O WAT 486 9.000 17.000 10.925 1.00 0.00 O -ATOM 487 O WAT 487 9.000 17.000 12.925 1.00 0.00 O -ATOM 488 O WAT 488 9.000 17.000 14.925 1.00 0.00 O -ATOM 489 O WAT 489 9.000 17.000 16.925 1.00 0.00 O -ATOM 490 O WAT 490 9.000 17.000 18.925 1.00 0.00 O -ATOM 491 O WAT 491 9.000 19.000 0.971 1.00 0.00 O -ATOM 492 O WAT 492 9.000 19.000 2.971 1.00 0.00 O -ATOM 493 O WAT 493 9.000 19.000 4.971 1.00 0.00 O -ATOM 494 O WAT 494 9.000 19.000 6.971 1.00 0.00 O -ATOM 495 O WAT 495 9.000 19.000 8.971 1.00 0.00 O -ATOM 496 O WAT 496 9.000 19.000 10.971 1.00 0.00 O -ATOM 497 O WAT 497 9.000 19.000 12.971 1.00 0.00 O -ATOM 498 O WAT 498 9.000 19.000 14.971 1.00 0.00 O -ATOM 499 O WAT 499 9.000 19.000 16.971 1.00 0.00 O -ATOM 500 O WAT 500 9.000 19.000 18.971 1.00 0.00 O -ATOM 501 O WAT 501 11.000 1.000 0.971 1.00 0.00 O -ATOM 502 O WAT 502 11.000 1.000 2.971 1.00 0.00 O -ATOM 503 O WAT 503 11.000 1.000 4.971 1.00 0.00 O -ATOM 504 O WAT 504 11.000 1.000 6.971 1.00 0.00 O -ATOM 505 O WAT 505 11.000 1.000 8.971 1.00 0.00 O -ATOM 506 O WAT 506 11.000 1.000 10.971 1.00 0.00 O -ATOM 507 O WAT 507 11.000 1.000 12.971 1.00 0.00 O -ATOM 508 O WAT 508 11.000 1.000 14.971 1.00 0.00 O -ATOM 509 O WAT 509 11.000 1.000 16.971 1.00 0.00 O -ATOM 510 O WAT 510 11.000 1.000 18.971 1.00 0.00 O -ATOM 511 O WAT 511 11.000 3.000 0.925 1.00 0.00 O -ATOM 512 O WAT 512 11.000 3.000 2.925 1.00 0.00 O -ATOM 513 O WAT 513 11.000 3.000 4.925 1.00 0.00 O -ATOM 514 O WAT 514 11.000 3.000 6.925 1.00 0.00 O -ATOM 515 O WAT 515 11.000 3.000 8.925 1.00 0.00 O -ATOM 516 O WAT 516 11.000 3.000 10.925 1.00 0.00 O -ATOM 517 O WAT 517 11.000 3.000 12.925 1.00 0.00 O -ATOM 518 O WAT 518 11.000 3.000 14.925 1.00 0.00 O -ATOM 519 O WAT 519 11.000 3.000 16.925 1.00 0.00 O -ATOM 520 O WAT 520 11.000 3.000 18.925 1.00 0.00 O -ATOM 521 O WAT 521 11.000 5.000 0.907 1.00 0.00 O -ATOM 522 O WAT 522 11.000 5.000 2.907 1.00 0.00 O -ATOM 523 O WAT 523 11.000 5.000 4.907 1.00 0.00 O -ATOM 524 O WAT 524 11.000 5.000 6.907 1.00 0.00 O -ATOM 525 O WAT 525 11.000 5.000 8.907 1.00 0.00 O -ATOM 526 O WAT 526 11.000 5.000 10.907 1.00 0.00 O -ATOM 527 O WAT 527 11.000 5.000 12.907 1.00 0.00 O -ATOM 528 O WAT 528 11.000 5.000 14.907 1.00 0.00 O -ATOM 529 O WAT 529 11.000 5.000 16.907 1.00 0.00 O -ATOM 530 O WAT 530 11.000 5.000 18.907 1.00 0.00 O -ATOM 531 O WAT 531 11.000 7.000 0.925 1.00 0.00 O -ATOM 532 O WAT 532 11.000 7.000 2.925 1.00 0.00 O -ATOM 533 O WAT 533 11.000 7.000 4.925 1.00 0.00 O -ATOM 534 O WAT 534 11.000 7.000 6.925 1.00 0.00 O -ATOM 535 O WAT 535 11.000 7.000 8.925 1.00 0.00 O -ATOM 536 O WAT 536 11.000 7.000 10.925 1.00 0.00 O -ATOM 537 O WAT 537 11.000 7.000 12.925 1.00 0.00 O -ATOM 538 O WAT 538 11.000 7.000 14.925 1.00 0.00 O -ATOM 539 O WAT 539 11.000 7.000 16.925 1.00 0.00 O -ATOM 540 O WAT 540 11.000 7.000 18.925 1.00 0.00 O -ATOM 541 O WAT 541 11.000 9.000 0.971 1.00 0.00 O -ATOM 542 O WAT 542 11.000 9.000 2.971 1.00 0.00 O -ATOM 543 O WAT 543 11.000 9.000 4.971 1.00 0.00 O -ATOM 544 O WAT 544 11.000 9.000 6.971 1.00 0.00 O -ATOM 545 O WAT 545 11.000 9.000 8.971 1.00 0.00 O -ATOM 546 O WAT 546 11.000 9.000 10.971 1.00 0.00 O -ATOM 547 O WAT 547 11.000 9.000 12.971 1.00 0.00 O -ATOM 548 O WAT 548 11.000 9.000 14.971 1.00 0.00 O -ATOM 549 O WAT 549 11.000 9.000 16.971 1.00 0.00 O -ATOM 550 O WAT 550 11.000 9.000 18.971 1.00 0.00 O -ATOM 551 O WAT 551 11.000 11.000 1.029 1.00 0.00 O -ATOM 552 O WAT 552 11.000 11.000 3.029 1.00 0.00 O -ATOM 553 O WAT 553 11.000 11.000 5.029 1.00 0.00 O -ATOM 554 O WAT 554 11.000 11.000 7.029 1.00 0.00 O -ATOM 555 O WAT 555 11.000 11.000 9.029 1.00 0.00 O -ATOM 556 O WAT 556 11.000 11.000 11.029 1.00 0.00 O -ATOM 557 O WAT 557 11.000 11.000 13.029 1.00 0.00 O -ATOM 558 O WAT 558 11.000 11.000 15.029 1.00 0.00 O -ATOM 559 O WAT 559 11.000 11.000 17.029 1.00 0.00 O -ATOM 560 O WAT 560 11.000 11.000 19.029 1.00 0.00 O -ATOM 561 O WAT 561 11.000 13.000 1.075 1.00 0.00 O -ATOM 562 O WAT 562 11.000 13.000 3.075 1.00 0.00 O -ATOM 563 O WAT 563 11.000 13.000 5.075 1.00 0.00 O -ATOM 564 O WAT 564 11.000 13.000 7.075 1.00 0.00 O -ATOM 565 O WAT 565 11.000 13.000 9.075 1.00 0.00 O -ATOM 566 O WAT 566 11.000 13.000 11.075 1.00 0.00 O -ATOM 567 O WAT 567 11.000 13.000 13.075 1.00 0.00 O -ATOM 568 O WAT 568 11.000 13.000 15.075 1.00 0.00 O -ATOM 569 O WAT 569 11.000 13.000 17.075 1.00 0.00 O -ATOM 570 O WAT 570 11.000 13.000 19.075 1.00 0.00 O -ATOM 571 O WAT 571 11.000 15.000 1.093 1.00 0.00 O -ATOM 572 O WAT 572 11.000 15.000 3.093 1.00 0.00 O -ATOM 573 O WAT 573 11.000 15.000 5.093 1.00 0.00 O -ATOM 574 O WAT 574 11.000 15.000 7.093 1.00 0.00 O -ATOM 575 O WAT 575 11.000 15.000 9.093 1.00 0.00 O -ATOM 576 O WAT 576 11.000 15.000 11.093 1.00 0.00 O -ATOM 577 O WAT 577 11.000 15.000 13.093 1.00 0.00 O -ATOM 578 O WAT 578 11.000 15.000 15.093 1.00 0.00 O -ATOM 579 O WAT 579 11.000 15.000 17.093 1.00 0.00 O -ATOM 580 O WAT 580 11.000 15.000 19.093 1.00 0.00 O -ATOM 581 O WAT 581 11.000 17.000 1.075 1.00 0.00 O -ATOM 582 O WAT 582 11.000 17.000 3.075 1.00 0.00 O -ATOM 583 O WAT 583 11.000 17.000 5.075 1.00 0.00 O -ATOM 584 O WAT 584 11.000 17.000 7.075 1.00 0.00 O -ATOM 585 O WAT 585 11.000 17.000 9.075 1.00 0.00 O -ATOM 586 O WAT 586 11.000 17.000 11.075 1.00 0.00 O -ATOM 587 O WAT 587 11.000 17.000 13.075 1.00 0.00 O -ATOM 588 O WAT 588 11.000 17.000 15.075 1.00 0.00 O -ATOM 589 O WAT 589 11.000 17.000 17.075 1.00 0.00 O -ATOM 590 O WAT 590 11.000 17.000 19.075 1.00 0.00 O -ATOM 591 O WAT 591 11.000 19.000 1.029 1.00 0.00 O -ATOM 592 O WAT 592 11.000 19.000 3.029 1.00 0.00 O -ATOM 593 O WAT 593 11.000 19.000 5.029 1.00 0.00 O -ATOM 594 O WAT 594 11.000 19.000 7.029 1.00 0.00 O -ATOM 595 O WAT 595 11.000 19.000 9.029 1.00 0.00 O -ATOM 596 O WAT 596 11.000 19.000 11.029 1.00 0.00 O -ATOM 597 O WAT 597 11.000 19.000 13.029 1.00 0.00 O -ATOM 598 O WAT 598 11.000 19.000 15.029 1.00 0.00 O -ATOM 599 O WAT 599 11.000 19.000 17.029 1.00 0.00 O -ATOM 600 O WAT 600 11.000 19.000 19.029 1.00 0.00 O -ATOM 601 O WAT 601 13.000 1.000 0.925 1.00 0.00 O -ATOM 602 O WAT 602 13.000 1.000 2.925 1.00 0.00 O -ATOM 603 O WAT 603 13.000 1.000 4.925 1.00 0.00 O -ATOM 604 O WAT 604 13.000 1.000 6.925 1.00 0.00 O -ATOM 605 O WAT 605 13.000 1.000 8.925 1.00 0.00 O -ATOM 606 O WAT 606 13.000 1.000 10.925 1.00 0.00 O -ATOM 607 O WAT 607 13.000 1.000 12.925 1.00 0.00 O -ATOM 608 O WAT 608 13.000 1.000 14.925 1.00 0.00 O -ATOM 609 O WAT 609 13.000 1.000 16.925 1.00 0.00 O -ATOM 610 O WAT 610 13.000 1.000 18.925 1.00 0.00 O -ATOM 611 O WAT 611 13.000 3.000 0.804 1.00 0.00 O -ATOM 612 O WAT 612 13.000 3.000 2.804 1.00 0.00 O -ATOM 613 O WAT 613 13.000 3.000 4.804 1.00 0.00 O -ATOM 614 O WAT 614 13.000 3.000 6.804 1.00 0.00 O -ATOM 615 O WAT 615 13.000 3.000 8.804 1.00 0.00 O -ATOM 616 O WAT 616 13.000 3.000 10.804 1.00 0.00 O -ATOM 617 O WAT 617 13.000 3.000 12.804 1.00 0.00 O -ATOM 618 O WAT 618 13.000 3.000 14.804 1.00 0.00 O -ATOM 619 O WAT 619 13.000 3.000 16.804 1.00 0.00 O -ATOM 620 O WAT 620 13.000 3.000 18.804 1.00 0.00 O -ATOM 621 O WAT 621 13.000 5.000 0.757 1.00 0.00 O -ATOM 622 O WAT 622 13.000 5.000 2.757 1.00 0.00 O -ATOM 623 O WAT 623 13.000 5.000 4.757 1.00 0.00 O -ATOM 624 O WAT 624 13.000 5.000 6.757 1.00 0.00 O -ATOM 625 O WAT 625 13.000 5.000 8.757 1.00 0.00 O -ATOM 626 O WAT 626 13.000 5.000 10.757 1.00 0.00 O -ATOM 627 O WAT 627 13.000 5.000 12.757 1.00 0.00 O -ATOM 628 O WAT 628 13.000 5.000 14.757 1.00 0.00 O -ATOM 629 O WAT 629 13.000 5.000 16.757 1.00 0.00 O -ATOM 630 O WAT 630 13.000 5.000 18.757 1.00 0.00 O -ATOM 631 O WAT 631 13.000 7.000 0.804 1.00 0.00 O -ATOM 632 O WAT 632 13.000 7.000 2.804 1.00 0.00 O -ATOM 633 O WAT 633 13.000 7.000 4.804 1.00 0.00 O -ATOM 634 O WAT 634 13.000 7.000 6.804 1.00 0.00 O -ATOM 635 O WAT 635 13.000 7.000 8.804 1.00 0.00 O -ATOM 636 O WAT 636 13.000 7.000 10.804 1.00 0.00 O -ATOM 637 O WAT 637 13.000 7.000 12.804 1.00 0.00 O -ATOM 638 O WAT 638 13.000 7.000 14.804 1.00 0.00 O -ATOM 639 O WAT 639 13.000 7.000 16.804 1.00 0.00 O -ATOM 640 O WAT 640 13.000 7.000 18.804 1.00 0.00 O -ATOM 641 O WAT 641 13.000 9.000 0.925 1.00 0.00 O -ATOM 642 O WAT 642 13.000 9.000 2.925 1.00 0.00 O -ATOM 643 O WAT 643 13.000 9.000 4.925 1.00 0.00 O -ATOM 644 O WAT 644 13.000 9.000 6.925 1.00 0.00 O -ATOM 645 O WAT 645 13.000 9.000 8.925 1.00 0.00 O -ATOM 646 O WAT 646 13.000 9.000 10.925 1.00 0.00 O -ATOM 647 O WAT 647 13.000 9.000 12.925 1.00 0.00 O -ATOM 648 O WAT 648 13.000 9.000 14.925 1.00 0.00 O -ATOM 649 O WAT 649 13.000 9.000 16.925 1.00 0.00 O -ATOM 650 O WAT 650 13.000 9.000 18.925 1.00 0.00 O -ATOM 651 O WAT 651 13.000 11.000 1.075 1.00 0.00 O -ATOM 652 O WAT 652 13.000 11.000 3.075 1.00 0.00 O -ATOM 653 O WAT 653 13.000 11.000 5.075 1.00 0.00 O -ATOM 654 O WAT 654 13.000 11.000 7.075 1.00 0.00 O -ATOM 655 O WAT 655 13.000 11.000 9.075 1.00 0.00 O -ATOM 656 O WAT 656 13.000 11.000 11.075 1.00 0.00 O -ATOM 657 O WAT 657 13.000 11.000 13.075 1.00 0.00 O -ATOM 658 O WAT 658 13.000 11.000 15.075 1.00 0.00 O -ATOM 659 O WAT 659 13.000 11.000 17.075 1.00 0.00 O -ATOM 660 O WAT 660 13.000 11.000 19.075 1.00 0.00 O -ATOM 661 O WAT 661 13.000 13.000 1.196 1.00 0.00 O -ATOM 662 O WAT 662 13.000 13.000 3.196 1.00 0.00 O -ATOM 663 O WAT 663 13.000 13.000 5.196 1.00 0.00 O -ATOM 664 O WAT 664 13.000 13.000 7.196 1.00 0.00 O -ATOM 665 O WAT 665 13.000 13.000 9.196 1.00 0.00 O -ATOM 666 O WAT 666 13.000 13.000 11.196 1.00 0.00 O -ATOM 667 O WAT 667 13.000 13.000 13.196 1.00 0.00 O -ATOM 668 O WAT 668 13.000 13.000 15.196 1.00 0.00 O -ATOM 669 O WAT 669 13.000 13.000 17.196 1.00 0.00 O -ATOM 670 O WAT 670 13.000 13.000 19.196 1.00 0.00 O -ATOM 671 O WAT 671 13.000 15.000 1.243 1.00 0.00 O -ATOM 672 O WAT 672 13.000 15.000 3.243 1.00 0.00 O -ATOM 673 O WAT 673 13.000 15.000 5.243 1.00 0.00 O -ATOM 674 O WAT 674 13.000 15.000 7.243 1.00 0.00 O -ATOM 675 O WAT 675 13.000 15.000 9.243 1.00 0.00 O -ATOM 676 O WAT 676 13.000 15.000 11.243 1.00 0.00 O -ATOM 677 O WAT 677 13.000 15.000 13.243 1.00 0.00 O -ATOM 678 O WAT 678 13.000 15.000 15.243 1.00 0.00 O -ATOM 679 O WAT 679 13.000 15.000 17.243 1.00 0.00 O -ATOM 680 O WAT 680 13.000 15.000 19.243 1.00 0.00 O -ATOM 681 O WAT 681 13.000 17.000 1.196 1.00 0.00 O -ATOM 682 O WAT 682 13.000 17.000 3.196 1.00 0.00 O -ATOM 683 O WAT 683 13.000 17.000 5.196 1.00 0.00 O -ATOM 684 O WAT 684 13.000 17.000 7.196 1.00 0.00 O -ATOM 685 O WAT 685 13.000 17.000 9.196 1.00 0.00 O -ATOM 686 O WAT 686 13.000 17.000 11.196 1.00 0.00 O -ATOM 687 O WAT 687 13.000 17.000 13.196 1.00 0.00 O -ATOM 688 O WAT 688 13.000 17.000 15.196 1.00 0.00 O -ATOM 689 O WAT 689 13.000 17.000 17.196 1.00 0.00 O -ATOM 690 O WAT 690 13.000 17.000 19.196 1.00 0.00 O -ATOM 691 O WAT 691 13.000 19.000 1.075 1.00 0.00 O -ATOM 692 O WAT 692 13.000 19.000 3.075 1.00 0.00 O -ATOM 693 O WAT 693 13.000 19.000 5.075 1.00 0.00 O -ATOM 694 O WAT 694 13.000 19.000 7.075 1.00 0.00 O -ATOM 695 O WAT 695 13.000 19.000 9.075 1.00 0.00 O -ATOM 696 O WAT 696 13.000 19.000 11.075 1.00 0.00 O -ATOM 697 O WAT 697 13.000 19.000 13.075 1.00 0.00 O -ATOM 698 O WAT 698 13.000 19.000 15.075 1.00 0.00 O -ATOM 699 O WAT 699 13.000 19.000 17.075 1.00 0.00 O -ATOM 700 O WAT 700 13.000 19.000 19.075 1.00 0.00 O -ATOM 701 O WAT 701 15.000 1.000 0.907 1.00 0.00 O -ATOM 702 O WAT 702 15.000 1.000 2.907 1.00 0.00 O -ATOM 703 O WAT 703 15.000 1.000 4.907 1.00 0.00 O -ATOM 704 O WAT 704 15.000 1.000 6.907 1.00 0.00 O -ATOM 705 O WAT 705 15.000 1.000 8.907 1.00 0.00 O -ATOM 706 O WAT 706 15.000 1.000 10.907 1.00 0.00 O -ATOM 707 O WAT 707 15.000 1.000 12.907 1.00 0.00 O -ATOM 708 O WAT 708 15.000 1.000 14.907 1.00 0.00 O -ATOM 709 O WAT 709 15.000 1.000 16.907 1.00 0.00 O -ATOM 710 O WAT 710 15.000 1.000 18.907 1.00 0.00 O -ATOM 711 O WAT 711 15.000 3.000 0.757 1.00 0.00 O -ATOM 712 O WAT 712 15.000 3.000 2.757 1.00 0.00 O -ATOM 713 O WAT 713 15.000 3.000 4.757 1.00 0.00 O -ATOM 714 O WAT 714 15.000 3.000 6.757 1.00 0.00 O -ATOM 715 O WAT 715 15.000 3.000 8.757 1.00 0.00 O -ATOM 716 O WAT 716 15.000 3.000 10.757 1.00 0.00 O -ATOM 717 O WAT 717 15.000 3.000 12.757 1.00 0.00 O -ATOM 718 O WAT 718 15.000 3.000 14.757 1.00 0.00 O -ATOM 719 O WAT 719 15.000 3.000 16.757 1.00 0.00 O -ATOM 720 O WAT 720 15.000 3.000 18.757 1.00 0.00 O -ATOM 721 O WAT 721 15.000 5.000 0.700 1.00 0.00 O -ATOM 722 O WAT 722 15.000 5.000 2.700 1.00 0.00 O -ATOM 723 O WAT 723 15.000 5.000 4.700 1.00 0.00 O -ATOM 724 O WAT 724 15.000 5.000 6.700 1.00 0.00 O -ATOM 725 O WAT 725 15.000 5.000 8.700 1.00 0.00 O -ATOM 726 O WAT 726 15.000 5.000 10.700 1.00 0.00 O -ATOM 727 O WAT 727 15.000 5.000 12.700 1.00 0.00 O -ATOM 728 O WAT 728 15.000 5.000 14.700 1.00 0.00 O -ATOM 729 O WAT 729 15.000 5.000 16.700 1.00 0.00 O -ATOM 730 O WAT 730 15.000 5.000 18.700 1.00 0.00 O -ATOM 731 O WAT 731 15.000 7.000 0.757 1.00 0.00 O -ATOM 732 O WAT 732 15.000 7.000 2.757 1.00 0.00 O -ATOM 733 O WAT 733 15.000 7.000 4.757 1.00 0.00 O -ATOM 734 O WAT 734 15.000 7.000 6.757 1.00 0.00 O -ATOM 735 O WAT 735 15.000 7.000 8.757 1.00 0.00 O -ATOM 736 O WAT 736 15.000 7.000 10.757 1.00 0.00 O -ATOM 737 O WAT 737 15.000 7.000 12.757 1.00 0.00 O -ATOM 738 O WAT 738 15.000 7.000 14.757 1.00 0.00 O -ATOM 739 O WAT 739 15.000 7.000 16.757 1.00 0.00 O -ATOM 740 O WAT 740 15.000 7.000 18.757 1.00 0.00 O -ATOM 741 O WAT 741 15.000 9.000 0.907 1.00 0.00 O -ATOM 742 O WAT 742 15.000 9.000 2.907 1.00 0.00 O -ATOM 743 O WAT 743 15.000 9.000 4.907 1.00 0.00 O -ATOM 744 O WAT 744 15.000 9.000 6.907 1.00 0.00 O -ATOM 745 O WAT 745 15.000 9.000 8.907 1.00 0.00 O -ATOM 746 O WAT 746 15.000 9.000 10.907 1.00 0.00 O -ATOM 747 O WAT 747 15.000 9.000 12.907 1.00 0.00 O -ATOM 748 O WAT 748 15.000 9.000 14.907 1.00 0.00 O -ATOM 749 O WAT 749 15.000 9.000 16.907 1.00 0.00 O -ATOM 750 O WAT 750 15.000 9.000 18.907 1.00 0.00 O -ATOM 751 O WAT 751 15.000 11.000 1.093 1.00 0.00 O -ATOM 752 O WAT 752 15.000 11.000 3.093 1.00 0.00 O -ATOM 753 O WAT 753 15.000 11.000 5.093 1.00 0.00 O -ATOM 754 O WAT 754 15.000 11.000 7.093 1.00 0.00 O -ATOM 755 O WAT 755 15.000 11.000 9.093 1.00 0.00 O -ATOM 756 O WAT 756 15.000 11.000 11.093 1.00 0.00 O -ATOM 757 O WAT 757 15.000 11.000 13.093 1.00 0.00 O -ATOM 758 O WAT 758 15.000 11.000 15.093 1.00 0.00 O -ATOM 759 O WAT 759 15.000 11.000 17.093 1.00 0.00 O -ATOM 760 O WAT 760 15.000 11.000 19.093 1.00 0.00 O -ATOM 761 O WAT 761 15.000 13.000 1.243 1.00 0.00 O -ATOM 762 O WAT 762 15.000 13.000 3.243 1.00 0.00 O -ATOM 763 O WAT 763 15.000 13.000 5.243 1.00 0.00 O -ATOM 764 O WAT 764 15.000 13.000 7.243 1.00 0.00 O -ATOM 765 O WAT 765 15.000 13.000 9.243 1.00 0.00 O -ATOM 766 O WAT 766 15.000 13.000 11.243 1.00 0.00 O -ATOM 767 O WAT 767 15.000 13.000 13.243 1.00 0.00 O -ATOM 768 O WAT 768 15.000 13.000 15.243 1.00 0.00 O -ATOM 769 O WAT 769 15.000 13.000 17.243 1.00 0.00 O -ATOM 770 O WAT 770 15.000 13.000 19.243 1.00 0.00 O -ATOM 771 O WAT 771 15.000 15.000 1.300 1.00 0.00 O -ATOM 772 O WAT 772 15.000 15.000 3.300 1.00 0.00 O -ATOM 773 O WAT 773 15.000 15.000 5.300 1.00 0.00 O -ATOM 774 O WAT 774 15.000 15.000 7.300 1.00 0.00 O -ATOM 775 O WAT 775 15.000 15.000 9.300 1.00 0.00 O -ATOM 776 O WAT 776 15.000 15.000 11.300 1.00 0.00 O -ATOM 777 O WAT 777 15.000 15.000 13.300 1.00 0.00 O -ATOM 778 O WAT 778 15.000 15.000 15.300 1.00 0.00 O -ATOM 779 O WAT 779 15.000 15.000 17.300 1.00 0.00 O -ATOM 780 O WAT 780 15.000 15.000 19.300 1.00 0.00 O -ATOM 781 O WAT 781 15.000 17.000 1.243 1.00 0.00 O -ATOM 782 O WAT 782 15.000 17.000 3.243 1.00 0.00 O -ATOM 783 O WAT 783 15.000 17.000 5.243 1.00 0.00 O -ATOM 784 O WAT 784 15.000 17.000 7.243 1.00 0.00 O -ATOM 785 O WAT 785 15.000 17.000 9.243 1.00 0.00 O -ATOM 786 O WAT 786 15.000 17.000 11.243 1.00 0.00 O -ATOM 787 O WAT 787 15.000 17.000 13.243 1.00 0.00 O -ATOM 788 O WAT 788 15.000 17.000 15.243 1.00 0.00 O -ATOM 789 O WAT 789 15.000 17.000 17.243 1.00 0.00 O -ATOM 790 O WAT 790 15.000 17.000 19.243 1.00 0.00 O -ATOM 791 O WAT 791 15.000 19.000 1.093 1.00 0.00 O -ATOM 792 O WAT 792 15.000 19.000 3.093 1.00 0.00 O -ATOM 793 O WAT 793 15.000 19.000 5.093 1.00 0.00 O -ATOM 794 O WAT 794 15.000 19.000 7.093 1.00 0.00 O -ATOM 795 O WAT 795 15.000 19.000 9.093 1.00 0.00 O -ATOM 796 O WAT 796 15.000 19.000 11.093 1.00 0.00 O -ATOM 797 O WAT 797 15.000 19.000 13.093 1.00 0.00 O -ATOM 798 O WAT 798 15.000 19.000 15.093 1.00 0.00 O -ATOM 799 O WAT 799 15.000 19.000 17.093 1.00 0.00 O -ATOM 800 O WAT 800 15.000 19.000 19.093 1.00 0.00 O -ATOM 801 O WAT 801 17.000 1.000 0.925 1.00 0.00 O -ATOM 802 O WAT 802 17.000 1.000 2.925 1.00 0.00 O -ATOM 803 O WAT 803 17.000 1.000 4.925 1.00 0.00 O -ATOM 804 O WAT 804 17.000 1.000 6.925 1.00 0.00 O -ATOM 805 O WAT 805 17.000 1.000 8.925 1.00 0.00 O -ATOM 806 O WAT 806 17.000 1.000 10.925 1.00 0.00 O -ATOM 807 O WAT 807 17.000 1.000 12.925 1.00 0.00 O -ATOM 808 O WAT 808 17.000 1.000 14.925 1.00 0.00 O -ATOM 809 O WAT 809 17.000 1.000 16.925 1.00 0.00 O -ATOM 810 O WAT 810 17.000 1.000 18.925 1.00 0.00 O -ATOM 811 O WAT 811 17.000 3.000 0.804 1.00 0.00 O -ATOM 812 O WAT 812 17.000 3.000 2.804 1.00 0.00 O -ATOM 813 O WAT 813 17.000 3.000 4.804 1.00 0.00 O -ATOM 814 O WAT 814 17.000 3.000 6.804 1.00 0.00 O -ATOM 815 O WAT 815 17.000 3.000 8.804 1.00 0.00 O -ATOM 816 O WAT 816 17.000 3.000 10.804 1.00 0.00 O -ATOM 817 O WAT 817 17.000 3.000 12.804 1.00 0.00 O -ATOM 818 O WAT 818 17.000 3.000 14.804 1.00 0.00 O -ATOM 819 O WAT 819 17.000 3.000 16.804 1.00 0.00 O -ATOM 820 O WAT 820 17.000 3.000 18.804 1.00 0.00 O -ATOM 821 O WAT 821 17.000 5.000 0.757 1.00 0.00 O -ATOM 822 O WAT 822 17.000 5.000 2.757 1.00 0.00 O -ATOM 823 O WAT 823 17.000 5.000 4.757 1.00 0.00 O -ATOM 824 O WAT 824 17.000 5.000 6.757 1.00 0.00 O -ATOM 825 O WAT 825 17.000 5.000 8.757 1.00 0.00 O -ATOM 826 O WAT 826 17.000 5.000 10.757 1.00 0.00 O -ATOM 827 O WAT 827 17.000 5.000 12.757 1.00 0.00 O -ATOM 828 O WAT 828 17.000 5.000 14.757 1.00 0.00 O -ATOM 829 O WAT 829 17.000 5.000 16.757 1.00 0.00 O -ATOM 830 O WAT 830 17.000 5.000 18.757 1.00 0.00 O -ATOM 831 O WAT 831 17.000 7.000 0.804 1.00 0.00 O -ATOM 832 O WAT 832 17.000 7.000 2.804 1.00 0.00 O -ATOM 833 O WAT 833 17.000 7.000 4.804 1.00 0.00 O -ATOM 834 O WAT 834 17.000 7.000 6.804 1.00 0.00 O -ATOM 835 O WAT 835 17.000 7.000 8.804 1.00 0.00 O -ATOM 836 O WAT 836 17.000 7.000 10.804 1.00 0.00 O -ATOM 837 O WAT 837 17.000 7.000 12.804 1.00 0.00 O -ATOM 838 O WAT 838 17.000 7.000 14.804 1.00 0.00 O -ATOM 839 O WAT 839 17.000 7.000 16.804 1.00 0.00 O -ATOM 840 O WAT 840 17.000 7.000 18.804 1.00 0.00 O -ATOM 841 O WAT 841 17.000 9.000 0.925 1.00 0.00 O -ATOM 842 O WAT 842 17.000 9.000 2.925 1.00 0.00 O -ATOM 843 O WAT 843 17.000 9.000 4.925 1.00 0.00 O -ATOM 844 O WAT 844 17.000 9.000 6.925 1.00 0.00 O -ATOM 845 O WAT 845 17.000 9.000 8.925 1.00 0.00 O -ATOM 846 O WAT 846 17.000 9.000 10.925 1.00 0.00 O -ATOM 847 O WAT 847 17.000 9.000 12.925 1.00 0.00 O -ATOM 848 O WAT 848 17.000 9.000 14.925 1.00 0.00 O -ATOM 849 O WAT 849 17.000 9.000 16.925 1.00 0.00 O -ATOM 850 O WAT 850 17.000 9.000 18.925 1.00 0.00 O -ATOM 851 O WAT 851 17.000 11.000 1.075 1.00 0.00 O -ATOM 852 O WAT 852 17.000 11.000 3.075 1.00 0.00 O -ATOM 853 O WAT 853 17.000 11.000 5.075 1.00 0.00 O -ATOM 854 O WAT 854 17.000 11.000 7.075 1.00 0.00 O -ATOM 855 O WAT 855 17.000 11.000 9.075 1.00 0.00 O -ATOM 856 O WAT 856 17.000 11.000 11.075 1.00 0.00 O -ATOM 857 O WAT 857 17.000 11.000 13.075 1.00 0.00 O -ATOM 858 O WAT 858 17.000 11.000 15.075 1.00 0.00 O -ATOM 859 O WAT 859 17.000 11.000 17.075 1.00 0.00 O -ATOM 860 O WAT 860 17.000 11.000 19.075 1.00 0.00 O -ATOM 861 O WAT 861 17.000 13.000 1.196 1.00 0.00 O -ATOM 862 O WAT 862 17.000 13.000 3.196 1.00 0.00 O -ATOM 863 O WAT 863 17.000 13.000 5.196 1.00 0.00 O -ATOM 864 O WAT 864 17.000 13.000 7.196 1.00 0.00 O -ATOM 865 O WAT 865 17.000 13.000 9.196 1.00 0.00 O -ATOM 866 O WAT 866 17.000 13.000 11.196 1.00 0.00 O -ATOM 867 O WAT 867 17.000 13.000 13.196 1.00 0.00 O -ATOM 868 O WAT 868 17.000 13.000 15.196 1.00 0.00 O -ATOM 869 O WAT 869 17.000 13.000 17.196 1.00 0.00 O -ATOM 870 O WAT 870 17.000 13.000 19.196 1.00 0.00 O -ATOM 871 O WAT 871 17.000 15.000 1.243 1.00 0.00 O -ATOM 872 O WAT 872 17.000 15.000 3.243 1.00 0.00 O -ATOM 873 O WAT 873 17.000 15.000 5.243 1.00 0.00 O -ATOM 874 O WAT 874 17.000 15.000 7.243 1.00 0.00 O -ATOM 875 O WAT 875 17.000 15.000 9.243 1.00 0.00 O -ATOM 876 O WAT 876 17.000 15.000 11.243 1.00 0.00 O -ATOM 877 O WAT 877 17.000 15.000 13.243 1.00 0.00 O -ATOM 878 O WAT 878 17.000 15.000 15.243 1.00 0.00 O -ATOM 879 O WAT 879 17.000 15.000 17.243 1.00 0.00 O -ATOM 880 O WAT 880 17.000 15.000 19.243 1.00 0.00 O -ATOM 881 O WAT 881 17.000 17.000 1.196 1.00 0.00 O -ATOM 882 O WAT 882 17.000 17.000 3.196 1.00 0.00 O -ATOM 883 O WAT 883 17.000 17.000 5.196 1.00 0.00 O -ATOM 884 O WAT 884 17.000 17.000 7.196 1.00 0.00 O -ATOM 885 O WAT 885 17.000 17.000 9.196 1.00 0.00 O -ATOM 886 O WAT 886 17.000 17.000 11.196 1.00 0.00 O -ATOM 887 O WAT 887 17.000 17.000 13.196 1.00 0.00 O -ATOM 888 O WAT 888 17.000 17.000 15.196 1.00 0.00 O -ATOM 889 O WAT 889 17.000 17.000 17.196 1.00 0.00 O -ATOM 890 O WAT 890 17.000 17.000 19.196 1.00 0.00 O -ATOM 891 O WAT 891 17.000 19.000 1.075 1.00 0.00 O -ATOM 892 O WAT 892 17.000 19.000 3.075 1.00 0.00 O -ATOM 893 O WAT 893 17.000 19.000 5.075 1.00 0.00 O -ATOM 894 O WAT 894 17.000 19.000 7.075 1.00 0.00 O -ATOM 895 O WAT 895 17.000 19.000 9.075 1.00 0.00 O -ATOM 896 O WAT 896 17.000 19.000 11.075 1.00 0.00 O -ATOM 897 O WAT 897 17.000 19.000 13.075 1.00 0.00 O -ATOM 898 O WAT 898 17.000 19.000 15.075 1.00 0.00 O -ATOM 899 O WAT 899 17.000 19.000 17.075 1.00 0.00 O -ATOM 900 O WAT 900 17.000 19.000 19.075 1.00 0.00 O -ATOM 901 O WAT 901 19.000 1.000 0.971 1.00 0.00 O -ATOM 902 O WAT 902 19.000 1.000 2.971 1.00 0.00 O -ATOM 903 O WAT 903 19.000 1.000 4.971 1.00 0.00 O -ATOM 904 O WAT 904 19.000 1.000 6.971 1.00 0.00 O -ATOM 905 O WAT 905 19.000 1.000 8.971 1.00 0.00 O -ATOM 906 O WAT 906 19.000 1.000 10.971 1.00 0.00 O -ATOM 907 O WAT 907 19.000 1.000 12.971 1.00 0.00 O -ATOM 908 O WAT 908 19.000 1.000 14.971 1.00 0.00 O -ATOM 909 O WAT 909 19.000 1.000 16.971 1.00 0.00 O -ATOM 910 O WAT 910 19.000 1.000 18.971 1.00 0.00 O -ATOM 911 O WAT 911 19.000 3.000 0.925 1.00 0.00 O -ATOM 912 O WAT 912 19.000 3.000 2.925 1.00 0.00 O -ATOM 913 O WAT 913 19.000 3.000 4.925 1.00 0.00 O -ATOM 914 O WAT 914 19.000 3.000 6.925 1.00 0.00 O -ATOM 915 O WAT 915 19.000 3.000 8.925 1.00 0.00 O -ATOM 916 O WAT 916 19.000 3.000 10.925 1.00 0.00 O -ATOM 917 O WAT 917 19.000 3.000 12.925 1.00 0.00 O -ATOM 918 O WAT 918 19.000 3.000 14.925 1.00 0.00 O -ATOM 919 O WAT 919 19.000 3.000 16.925 1.00 0.00 O -ATOM 920 O WAT 920 19.000 3.000 18.925 1.00 0.00 O -ATOM 921 O WAT 921 19.000 5.000 0.907 1.00 0.00 O -ATOM 922 O WAT 922 19.000 5.000 2.907 1.00 0.00 O -ATOM 923 O WAT 923 19.000 5.000 4.907 1.00 0.00 O -ATOM 924 O WAT 924 19.000 5.000 6.907 1.00 0.00 O -ATOM 925 O WAT 925 19.000 5.000 8.907 1.00 0.00 O -ATOM 926 O WAT 926 19.000 5.000 10.907 1.00 0.00 O -ATOM 927 O WAT 927 19.000 5.000 12.907 1.00 0.00 O -ATOM 928 O WAT 928 19.000 5.000 14.907 1.00 0.00 O -ATOM 929 O WAT 929 19.000 5.000 16.907 1.00 0.00 O -ATOM 930 O WAT 930 19.000 5.000 18.907 1.00 0.00 O -ATOM 931 O WAT 931 19.000 7.000 0.925 1.00 0.00 O -ATOM 932 O WAT 932 19.000 7.000 2.925 1.00 0.00 O -ATOM 933 O WAT 933 19.000 7.000 4.925 1.00 0.00 O -ATOM 934 O WAT 934 19.000 7.000 6.925 1.00 0.00 O -ATOM 935 O WAT 935 19.000 7.000 8.925 1.00 0.00 O -ATOM 936 O WAT 936 19.000 7.000 10.925 1.00 0.00 O -ATOM 937 O WAT 937 19.000 7.000 12.925 1.00 0.00 O -ATOM 938 O WAT 938 19.000 7.000 14.925 1.00 0.00 O -ATOM 939 O WAT 939 19.000 7.000 16.925 1.00 0.00 O -ATOM 940 O WAT 940 19.000 7.000 18.925 1.00 0.00 O -ATOM 941 O WAT 941 19.000 9.000 0.971 1.00 0.00 O -ATOM 942 O WAT 942 19.000 9.000 2.971 1.00 0.00 O -ATOM 943 O WAT 943 19.000 9.000 4.971 1.00 0.00 O -ATOM 944 O WAT 944 19.000 9.000 6.971 1.00 0.00 O -ATOM 945 O WAT 945 19.000 9.000 8.971 1.00 0.00 O -ATOM 946 O WAT 946 19.000 9.000 10.971 1.00 0.00 O -ATOM 947 O WAT 947 19.000 9.000 12.971 1.00 0.00 O -ATOM 948 O WAT 948 19.000 9.000 14.971 1.00 0.00 O -ATOM 949 O WAT 949 19.000 9.000 16.971 1.00 0.00 O -ATOM 950 O WAT 950 19.000 9.000 18.971 1.00 0.00 O -ATOM 951 O WAT 951 19.000 11.000 1.029 1.00 0.00 O -ATOM 952 O WAT 952 19.000 11.000 3.029 1.00 0.00 O -ATOM 953 O WAT 953 19.000 11.000 5.029 1.00 0.00 O -ATOM 954 O WAT 954 19.000 11.000 7.029 1.00 0.00 O -ATOM 955 O WAT 955 19.000 11.000 9.029 1.00 0.00 O -ATOM 956 O WAT 956 19.000 11.000 11.029 1.00 0.00 O -ATOM 957 O WAT 957 19.000 11.000 13.029 1.00 0.00 O -ATOM 958 O WAT 958 19.000 11.000 15.029 1.00 0.00 O -ATOM 959 O WAT 959 19.000 11.000 17.029 1.00 0.00 O -ATOM 960 O WAT 960 19.000 11.000 19.029 1.00 0.00 O -ATOM 961 O WAT 961 19.000 13.000 1.075 1.00 0.00 O -ATOM 962 O WAT 962 19.000 13.000 3.075 1.00 0.00 O -ATOM 963 O WAT 963 19.000 13.000 5.075 1.00 0.00 O -ATOM 964 O WAT 964 19.000 13.000 7.075 1.00 0.00 O -ATOM 965 O WAT 965 19.000 13.000 9.075 1.00 0.00 O -ATOM 966 O WAT 966 19.000 13.000 11.075 1.00 0.00 O -ATOM 967 O WAT 967 19.000 13.000 13.075 1.00 0.00 O -ATOM 968 O WAT 968 19.000 13.000 15.075 1.00 0.00 O -ATOM 969 O WAT 969 19.000 13.000 17.075 1.00 0.00 O -ATOM 970 O WAT 970 19.000 13.000 19.075 1.00 0.00 O -ATOM 971 O WAT 971 19.000 15.000 1.093 1.00 0.00 O -ATOM 972 O WAT 972 19.000 15.000 3.093 1.00 0.00 O -ATOM 973 O WAT 973 19.000 15.000 5.093 1.00 0.00 O -ATOM 974 O WAT 974 19.000 15.000 7.093 1.00 0.00 O -ATOM 975 O WAT 975 19.000 15.000 9.093 1.00 0.00 O -ATOM 976 O WAT 976 19.000 15.000 11.093 1.00 0.00 O -ATOM 977 O WAT 977 19.000 15.000 13.093 1.00 0.00 O -ATOM 978 O WAT 978 19.000 15.000 15.093 1.00 0.00 O -ATOM 979 O WAT 979 19.000 15.000 17.093 1.00 0.00 O -ATOM 980 O WAT 980 19.000 15.000 19.093 1.00 0.00 O -ATOM 981 O WAT 981 19.000 17.000 1.075 1.00 0.00 O -ATOM 982 O WAT 982 19.000 17.000 3.075 1.00 0.00 O -ATOM 983 O WAT 983 19.000 17.000 5.075 1.00 0.00 O -ATOM 984 O WAT 984 19.000 17.000 7.075 1.00 0.00 O -ATOM 985 O WAT 985 19.000 17.000 9.075 1.00 0.00 O -ATOM 986 O WAT 986 19.000 17.000 11.075 1.00 0.00 O -ATOM 987 O WAT 987 19.000 17.000 13.075 1.00 0.00 O -ATOM 988 O WAT 988 19.000 17.000 15.075 1.00 0.00 O -ATOM 989 O WAT 989 19.000 17.000 17.075 1.00 0.00 O -ATOM 990 O WAT 990 19.000 17.000 19.075 1.00 0.00 O -ATOM 991 O WAT 991 19.000 19.000 1.029 1.00 0.00 O -ATOM 992 O WAT 992 19.000 19.000 3.029 1.00 0.00 O -ATOM 993 O WAT 993 19.000 19.000 5.029 1.00 0.00 O -ATOM 994 O WAT 994 19.000 19.000 7.029 1.00 0.00 O -ATOM 995 O WAT 995 19.000 19.000 9.029 1.00 0.00 O -ATOM 996 O WAT 996 19.000 19.000 11.029 1.00 0.00 O -ATOM 997 O WAT 997 19.000 19.000 13.029 1.00 0.00 O -ATOM 998 O WAT 998 19.000 19.000 15.029 1.00 0.00 O -ATOM 999 O WAT 999 19.000 19.000 17.029 1.00 0.00 O -ATOM 1000 O WAT 1000 19.000 19.000 19.029 1.00 0.00 O +REMARK synthetic cubic lattice for surftension tests +ATOM 1 O WAT 1 1.000 1.000 1.000 1.00 0.00 O +ATOM 2 O WAT 2 1.000 1.000 3.000 1.00 0.00 O +ATOM 3 O WAT 3 1.000 1.000 5.000 1.00 0.00 O +ATOM 4 O WAT 4 1.000 1.000 7.000 1.00 0.00 O +ATOM 5 O WAT 5 1.000 1.000 9.000 1.00 0.00 O +ATOM 6 O WAT 6 1.000 1.000 11.000 1.00 0.00 O +ATOM 7 O WAT 7 1.000 1.000 13.000 1.00 0.00 O +ATOM 8 O WAT 8 1.000 1.000 15.000 1.00 0.00 O +ATOM 9 O WAT 9 1.000 1.000 17.000 1.00 0.00 O +ATOM 10 O WAT 10 1.000 1.000 19.000 1.00 0.00 O +ATOM 11 O WAT 11 1.000 3.000 1.000 1.00 0.00 O +ATOM 12 O WAT 12 1.000 3.000 3.000 1.00 0.00 O +ATOM 13 O WAT 13 1.000 3.000 5.000 1.00 0.00 O +ATOM 14 O WAT 14 1.000 3.000 7.000 1.00 0.00 O +ATOM 15 O WAT 15 1.000 3.000 9.000 1.00 0.00 O +ATOM 16 O WAT 16 1.000 3.000 11.000 1.00 0.00 O +ATOM 17 O WAT 17 1.000 3.000 13.000 1.00 0.00 O +ATOM 18 O WAT 18 1.000 3.000 15.000 1.00 0.00 O +ATOM 19 O WAT 19 1.000 3.000 17.000 1.00 0.00 O +ATOM 20 O WAT 20 1.000 3.000 19.000 1.00 0.00 O +ATOM 21 O WAT 21 1.000 5.000 1.000 1.00 0.00 O +ATOM 22 O WAT 22 1.000 5.000 3.000 1.00 0.00 O +ATOM 23 O WAT 23 1.000 5.000 5.000 1.00 0.00 O +ATOM 24 O WAT 24 1.000 5.000 7.000 1.00 0.00 O +ATOM 25 O WAT 25 1.000 5.000 9.000 1.00 0.00 O +ATOM 26 O WAT 26 1.000 5.000 11.000 1.00 0.00 O +ATOM 27 O WAT 27 1.000 5.000 13.000 1.00 0.00 O +ATOM 28 O WAT 28 1.000 5.000 15.000 1.00 0.00 O +ATOM 29 O WAT 29 1.000 5.000 17.000 1.00 0.00 O +ATOM 30 O WAT 30 1.000 5.000 19.000 1.00 0.00 O +ATOM 31 O WAT 31 1.000 7.000 1.000 1.00 0.00 O +ATOM 32 O WAT 32 1.000 7.000 3.000 1.00 0.00 O +ATOM 33 O WAT 33 1.000 7.000 5.000 1.00 0.00 O +ATOM 34 O WAT 34 1.000 7.000 7.000 1.00 0.00 O +ATOM 35 O WAT 35 1.000 7.000 9.000 1.00 0.00 O +ATOM 36 O WAT 36 1.000 7.000 11.000 1.00 0.00 O +ATOM 37 O WAT 37 1.000 7.000 13.000 1.00 0.00 O +ATOM 38 O WAT 38 1.000 7.000 15.000 1.00 0.00 O +ATOM 39 O WAT 39 1.000 7.000 17.000 1.00 0.00 O +ATOM 40 O WAT 40 1.000 7.000 19.000 1.00 0.00 O +ATOM 41 O WAT 41 1.000 9.000 1.000 1.00 0.00 O +ATOM 42 O WAT 42 1.000 9.000 3.000 1.00 0.00 O +ATOM 43 O WAT 43 1.000 9.000 5.000 1.00 0.00 O +ATOM 44 O WAT 44 1.000 9.000 7.000 1.00 0.00 O +ATOM 45 O WAT 45 1.000 9.000 9.000 1.00 0.00 O +ATOM 46 O WAT 46 1.000 9.000 11.000 1.00 0.00 O +ATOM 47 O WAT 47 1.000 9.000 13.000 1.00 0.00 O +ATOM 48 O WAT 48 1.000 9.000 15.000 1.00 0.00 O +ATOM 49 O WAT 49 1.000 9.000 17.000 1.00 0.00 O +ATOM 50 O WAT 50 1.000 9.000 19.000 1.00 0.00 O +ATOM 51 O WAT 51 1.000 11.000 1.000 1.00 0.00 O +ATOM 52 O WAT 52 1.000 11.000 3.000 1.00 0.00 O +ATOM 53 O WAT 53 1.000 11.000 5.000 1.00 0.00 O +ATOM 54 O WAT 54 1.000 11.000 7.000 1.00 0.00 O +ATOM 55 O WAT 55 1.000 11.000 9.000 1.00 0.00 O +ATOM 56 O WAT 56 1.000 11.000 11.000 1.00 0.00 O +ATOM 57 O WAT 57 1.000 11.000 13.000 1.00 0.00 O +ATOM 58 O WAT 58 1.000 11.000 15.000 1.00 0.00 O +ATOM 59 O WAT 59 1.000 11.000 17.000 1.00 0.00 O +ATOM 60 O WAT 60 1.000 11.000 19.000 1.00 0.00 O +ATOM 61 O WAT 61 1.000 13.000 1.000 1.00 0.00 O +ATOM 62 O WAT 62 1.000 13.000 3.000 1.00 0.00 O +ATOM 63 O WAT 63 1.000 13.000 5.000 1.00 0.00 O +ATOM 64 O WAT 64 1.000 13.000 7.000 1.00 0.00 O +ATOM 65 O WAT 65 1.000 13.000 9.000 1.00 0.00 O +ATOM 66 O WAT 66 1.000 13.000 11.000 1.00 0.00 O +ATOM 67 O WAT 67 1.000 13.000 13.000 1.00 0.00 O +ATOM 68 O WAT 68 1.000 13.000 15.000 1.00 0.00 O +ATOM 69 O WAT 69 1.000 13.000 17.000 1.00 0.00 O +ATOM 70 O WAT 70 1.000 13.000 19.000 1.00 0.00 O +ATOM 71 O WAT 71 1.000 15.000 1.000 1.00 0.00 O +ATOM 72 O WAT 72 1.000 15.000 3.000 1.00 0.00 O +ATOM 73 O WAT 73 1.000 15.000 5.000 1.00 0.00 O +ATOM 74 O WAT 74 1.000 15.000 7.000 1.00 0.00 O +ATOM 75 O WAT 75 1.000 15.000 9.000 1.00 0.00 O +ATOM 76 O WAT 76 1.000 15.000 11.000 1.00 0.00 O +ATOM 77 O WAT 77 1.000 15.000 13.000 1.00 0.00 O +ATOM 78 O WAT 78 1.000 15.000 15.000 1.00 0.00 O +ATOM 79 O WAT 79 1.000 15.000 17.000 1.00 0.00 O +ATOM 80 O WAT 80 1.000 15.000 19.000 1.00 0.00 O +ATOM 81 O WAT 81 1.000 17.000 1.000 1.00 0.00 O +ATOM 82 O WAT 82 1.000 17.000 3.000 1.00 0.00 O +ATOM 83 O WAT 83 1.000 17.000 5.000 1.00 0.00 O +ATOM 84 O WAT 84 1.000 17.000 7.000 1.00 0.00 O +ATOM 85 O WAT 85 1.000 17.000 9.000 1.00 0.00 O +ATOM 86 O WAT 86 1.000 17.000 11.000 1.00 0.00 O +ATOM 87 O WAT 87 1.000 17.000 13.000 1.00 0.00 O +ATOM 88 O WAT 88 1.000 17.000 15.000 1.00 0.00 O +ATOM 89 O WAT 89 1.000 17.000 17.000 1.00 0.00 O +ATOM 90 O WAT 90 1.000 17.000 19.000 1.00 0.00 O +ATOM 91 O WAT 91 1.000 19.000 1.000 1.00 0.00 O +ATOM 92 O WAT 92 1.000 19.000 3.000 1.00 0.00 O +ATOM 93 O WAT 93 1.000 19.000 5.000 1.00 0.00 O +ATOM 94 O WAT 94 1.000 19.000 7.000 1.00 0.00 O +ATOM 95 O WAT 95 1.000 19.000 9.000 1.00 0.00 O +ATOM 96 O WAT 96 1.000 19.000 11.000 1.00 0.00 O +ATOM 97 O WAT 97 1.000 19.000 13.000 1.00 0.00 O +ATOM 98 O WAT 98 1.000 19.000 15.000 1.00 0.00 O +ATOM 99 O WAT 99 1.000 19.000 17.000 1.00 0.00 O +ATOM 100 O WAT 100 1.000 19.000 19.000 1.00 0.00 O +ATOM 101 O WAT 101 3.000 1.000 1.000 1.00 0.00 O +ATOM 102 O WAT 102 3.000 1.000 3.000 1.00 0.00 O +ATOM 103 O WAT 103 3.000 1.000 5.000 1.00 0.00 O +ATOM 104 O WAT 104 3.000 1.000 7.000 1.00 0.00 O +ATOM 105 O WAT 105 3.000 1.000 9.000 1.00 0.00 O +ATOM 106 O WAT 106 3.000 1.000 11.000 1.00 0.00 O +ATOM 107 O WAT 107 3.000 1.000 13.000 1.00 0.00 O +ATOM 108 O WAT 108 3.000 1.000 15.000 1.00 0.00 O +ATOM 109 O WAT 109 3.000 1.000 17.000 1.00 0.00 O +ATOM 110 O WAT 110 3.000 1.000 19.000 1.00 0.00 O +ATOM 111 O WAT 111 3.000 3.000 1.000 1.00 0.00 O +ATOM 112 O WAT 112 3.000 3.000 3.000 1.00 0.00 O +ATOM 113 O WAT 113 3.000 3.000 5.000 1.00 0.00 O +ATOM 114 O WAT 114 3.000 3.000 7.000 1.00 0.00 O +ATOM 115 O WAT 115 3.000 3.000 9.000 1.00 0.00 O +ATOM 116 O WAT 116 3.000 3.000 11.000 1.00 0.00 O +ATOM 117 O WAT 117 3.000 3.000 13.000 1.00 0.00 O +ATOM 118 O WAT 118 3.000 3.000 15.000 1.00 0.00 O +ATOM 119 O WAT 119 3.000 3.000 17.000 1.00 0.00 O +ATOM 120 O WAT 120 3.000 3.000 19.000 1.00 0.00 O +ATOM 121 O WAT 121 3.000 5.000 1.000 1.00 0.00 O +ATOM 122 O WAT 122 3.000 5.000 3.000 1.00 0.00 O +ATOM 123 O WAT 123 3.000 5.000 5.000 1.00 0.00 O +ATOM 124 O WAT 124 3.000 5.000 7.000 1.00 0.00 O +ATOM 125 O WAT 125 3.000 5.000 9.000 1.00 0.00 O +ATOM 126 O WAT 126 3.000 5.000 11.000 1.00 0.00 O +ATOM 127 O WAT 127 3.000 5.000 13.000 1.00 0.00 O +ATOM 128 O WAT 128 3.000 5.000 15.000 1.00 0.00 O +ATOM 129 O WAT 129 3.000 5.000 17.000 1.00 0.00 O +ATOM 130 O WAT 130 3.000 5.000 19.000 1.00 0.00 O +ATOM 131 O WAT 131 3.000 7.000 1.000 1.00 0.00 O +ATOM 132 O WAT 132 3.000 7.000 3.000 1.00 0.00 O +ATOM 133 O WAT 133 3.000 7.000 5.000 1.00 0.00 O +ATOM 134 O WAT 134 3.000 7.000 7.000 1.00 0.00 O +ATOM 135 O WAT 135 3.000 7.000 9.000 1.00 0.00 O +ATOM 136 O WAT 136 3.000 7.000 11.000 1.00 0.00 O +ATOM 137 O WAT 137 3.000 7.000 13.000 1.00 0.00 O +ATOM 138 O WAT 138 3.000 7.000 15.000 1.00 0.00 O +ATOM 139 O WAT 139 3.000 7.000 17.000 1.00 0.00 O +ATOM 140 O WAT 140 3.000 7.000 19.000 1.00 0.00 O +ATOM 141 O WAT 141 3.000 9.000 1.000 1.00 0.00 O +ATOM 142 O WAT 142 3.000 9.000 3.000 1.00 0.00 O +ATOM 143 O WAT 143 3.000 9.000 5.000 1.00 0.00 O +ATOM 144 O WAT 144 3.000 9.000 7.000 1.00 0.00 O +ATOM 145 O WAT 145 3.000 9.000 9.000 1.00 0.00 O +ATOM 146 O WAT 146 3.000 9.000 11.000 1.00 0.00 O +ATOM 147 O WAT 147 3.000 9.000 13.000 1.00 0.00 O +ATOM 148 O WAT 148 3.000 9.000 15.000 1.00 0.00 O +ATOM 149 O WAT 149 3.000 9.000 17.000 1.00 0.00 O +ATOM 150 O WAT 150 3.000 9.000 19.000 1.00 0.00 O +ATOM 151 O WAT 151 3.000 11.000 1.000 1.00 0.00 O +ATOM 152 O WAT 152 3.000 11.000 3.000 1.00 0.00 O +ATOM 153 O WAT 153 3.000 11.000 5.000 1.00 0.00 O +ATOM 154 O WAT 154 3.000 11.000 7.000 1.00 0.00 O +ATOM 155 O WAT 155 3.000 11.000 9.000 1.00 0.00 O +ATOM 156 O WAT 156 3.000 11.000 11.000 1.00 0.00 O +ATOM 157 O WAT 157 3.000 11.000 13.000 1.00 0.00 O +ATOM 158 O WAT 158 3.000 11.000 15.000 1.00 0.00 O +ATOM 159 O WAT 159 3.000 11.000 17.000 1.00 0.00 O +ATOM 160 O WAT 160 3.000 11.000 19.000 1.00 0.00 O +ATOM 161 O WAT 161 3.000 13.000 1.000 1.00 0.00 O +ATOM 162 O WAT 162 3.000 13.000 3.000 1.00 0.00 O +ATOM 163 O WAT 163 3.000 13.000 5.000 1.00 0.00 O +ATOM 164 O WAT 164 3.000 13.000 7.000 1.00 0.00 O +ATOM 165 O WAT 165 3.000 13.000 9.000 1.00 0.00 O +ATOM 166 O WAT 166 3.000 13.000 11.000 1.00 0.00 O +ATOM 167 O WAT 167 3.000 13.000 13.000 1.00 0.00 O +ATOM 168 O WAT 168 3.000 13.000 15.000 1.00 0.00 O +ATOM 169 O WAT 169 3.000 13.000 17.000 1.00 0.00 O +ATOM 170 O WAT 170 3.000 13.000 19.000 1.00 0.00 O +ATOM 171 O WAT 171 3.000 15.000 1.000 1.00 0.00 O +ATOM 172 O WAT 172 3.000 15.000 3.000 1.00 0.00 O +ATOM 173 O WAT 173 3.000 15.000 5.000 1.00 0.00 O +ATOM 174 O WAT 174 3.000 15.000 7.000 1.00 0.00 O +ATOM 175 O WAT 175 3.000 15.000 9.000 1.00 0.00 O +ATOM 176 O WAT 176 3.000 15.000 11.000 1.00 0.00 O +ATOM 177 O WAT 177 3.000 15.000 13.000 1.00 0.00 O +ATOM 178 O WAT 178 3.000 15.000 15.000 1.00 0.00 O +ATOM 179 O WAT 179 3.000 15.000 17.000 1.00 0.00 O +ATOM 180 O WAT 180 3.000 15.000 19.000 1.00 0.00 O +ATOM 181 O WAT 181 3.000 17.000 1.000 1.00 0.00 O +ATOM 182 O WAT 182 3.000 17.000 3.000 1.00 0.00 O +ATOM 183 O WAT 183 3.000 17.000 5.000 1.00 0.00 O +ATOM 184 O WAT 184 3.000 17.000 7.000 1.00 0.00 O +ATOM 185 O WAT 185 3.000 17.000 9.000 1.00 0.00 O +ATOM 186 O WAT 186 3.000 17.000 11.000 1.00 0.00 O +ATOM 187 O WAT 187 3.000 17.000 13.000 1.00 0.00 O +ATOM 188 O WAT 188 3.000 17.000 15.000 1.00 0.00 O +ATOM 189 O WAT 189 3.000 17.000 17.000 1.00 0.00 O +ATOM 190 O WAT 190 3.000 17.000 19.000 1.00 0.00 O +ATOM 191 O WAT 191 3.000 19.000 1.000 1.00 0.00 O +ATOM 192 O WAT 192 3.000 19.000 3.000 1.00 0.00 O +ATOM 193 O WAT 193 3.000 19.000 5.000 1.00 0.00 O +ATOM 194 O WAT 194 3.000 19.000 7.000 1.00 0.00 O +ATOM 195 O WAT 195 3.000 19.000 9.000 1.00 0.00 O +ATOM 196 O WAT 196 3.000 19.000 11.000 1.00 0.00 O +ATOM 197 O WAT 197 3.000 19.000 13.000 1.00 0.00 O +ATOM 198 O WAT 198 3.000 19.000 15.000 1.00 0.00 O +ATOM 199 O WAT 199 3.000 19.000 17.000 1.00 0.00 O +ATOM 200 O WAT 200 3.000 19.000 19.000 1.00 0.00 O +ATOM 201 O WAT 201 5.000 1.000 1.000 1.00 0.00 O +ATOM 202 O WAT 202 5.000 1.000 3.000 1.00 0.00 O +ATOM 203 O WAT 203 5.000 1.000 5.000 1.00 0.00 O +ATOM 204 O WAT 204 5.000 1.000 7.000 1.00 0.00 O +ATOM 205 O WAT 205 5.000 1.000 9.000 1.00 0.00 O +ATOM 206 O WAT 206 5.000 1.000 11.000 1.00 0.00 O +ATOM 207 O WAT 207 5.000 1.000 13.000 1.00 0.00 O +ATOM 208 O WAT 208 5.000 1.000 15.000 1.00 0.00 O +ATOM 209 O WAT 209 5.000 1.000 17.000 1.00 0.00 O +ATOM 210 O WAT 210 5.000 1.000 19.000 1.00 0.00 O +ATOM 211 O WAT 211 5.000 3.000 1.000 1.00 0.00 O +ATOM 212 O WAT 212 5.000 3.000 3.000 1.00 0.00 O +ATOM 213 O WAT 213 5.000 3.000 5.000 1.00 0.00 O +ATOM 214 O WAT 214 5.000 3.000 7.000 1.00 0.00 O +ATOM 215 O WAT 215 5.000 3.000 9.000 1.00 0.00 O +ATOM 216 O WAT 216 5.000 3.000 11.000 1.00 0.00 O +ATOM 217 O WAT 217 5.000 3.000 13.000 1.00 0.00 O +ATOM 218 O WAT 218 5.000 3.000 15.000 1.00 0.00 O +ATOM 219 O WAT 219 5.000 3.000 17.000 1.00 0.00 O +ATOM 220 O WAT 220 5.000 3.000 19.000 1.00 0.00 O +ATOM 221 O WAT 221 5.000 5.000 1.000 1.00 0.00 O +ATOM 222 O WAT 222 5.000 5.000 3.000 1.00 0.00 O +ATOM 223 O WAT 223 5.000 5.000 5.000 1.00 0.00 O +ATOM 224 O WAT 224 5.000 5.000 7.000 1.00 0.00 O +ATOM 225 O WAT 225 5.000 5.000 9.000 1.00 0.00 O +ATOM 226 O WAT 226 5.000 5.000 11.000 1.00 0.00 O +ATOM 227 O WAT 227 5.000 5.000 13.000 1.00 0.00 O +ATOM 228 O WAT 228 5.000 5.000 15.000 1.00 0.00 O +ATOM 229 O WAT 229 5.000 5.000 17.000 1.00 0.00 O +ATOM 230 O WAT 230 5.000 5.000 19.000 1.00 0.00 O +ATOM 231 O WAT 231 5.000 7.000 1.000 1.00 0.00 O +ATOM 232 O WAT 232 5.000 7.000 3.000 1.00 0.00 O +ATOM 233 O WAT 233 5.000 7.000 5.000 1.00 0.00 O +ATOM 234 O WAT 234 5.000 7.000 7.000 1.00 0.00 O +ATOM 235 O WAT 235 5.000 7.000 9.000 1.00 0.00 O +ATOM 236 O WAT 236 5.000 7.000 11.000 1.00 0.00 O +ATOM 237 O WAT 237 5.000 7.000 13.000 1.00 0.00 O +ATOM 238 O WAT 238 5.000 7.000 15.000 1.00 0.00 O +ATOM 239 O WAT 239 5.000 7.000 17.000 1.00 0.00 O +ATOM 240 O WAT 240 5.000 7.000 19.000 1.00 0.00 O +ATOM 241 O WAT 241 5.000 9.000 1.000 1.00 0.00 O +ATOM 242 O WAT 242 5.000 9.000 3.000 1.00 0.00 O +ATOM 243 O WAT 243 5.000 9.000 5.000 1.00 0.00 O +ATOM 244 O WAT 244 5.000 9.000 7.000 1.00 0.00 O +ATOM 245 O WAT 245 5.000 9.000 9.000 1.00 0.00 O +ATOM 246 O WAT 246 5.000 9.000 11.000 1.00 0.00 O +ATOM 247 O WAT 247 5.000 9.000 13.000 1.00 0.00 O +ATOM 248 O WAT 248 5.000 9.000 15.000 1.00 0.00 O +ATOM 249 O WAT 249 5.000 9.000 17.000 1.00 0.00 O +ATOM 250 O WAT 250 5.000 9.000 19.000 1.00 0.00 O +ATOM 251 O WAT 251 5.000 11.000 1.000 1.00 0.00 O +ATOM 252 O WAT 252 5.000 11.000 3.000 1.00 0.00 O +ATOM 253 O WAT 253 5.000 11.000 5.000 1.00 0.00 O +ATOM 254 O WAT 254 5.000 11.000 7.000 1.00 0.00 O +ATOM 255 O WAT 255 5.000 11.000 9.000 1.00 0.00 O +ATOM 256 O WAT 256 5.000 11.000 11.000 1.00 0.00 O +ATOM 257 O WAT 257 5.000 11.000 13.000 1.00 0.00 O +ATOM 258 O WAT 258 5.000 11.000 15.000 1.00 0.00 O +ATOM 259 O WAT 259 5.000 11.000 17.000 1.00 0.00 O +ATOM 260 O WAT 260 5.000 11.000 19.000 1.00 0.00 O +ATOM 261 O WAT 261 5.000 13.000 1.000 1.00 0.00 O +ATOM 262 O WAT 262 5.000 13.000 3.000 1.00 0.00 O +ATOM 263 O WAT 263 5.000 13.000 5.000 1.00 0.00 O +ATOM 264 O WAT 264 5.000 13.000 7.000 1.00 0.00 O +ATOM 265 O WAT 265 5.000 13.000 9.000 1.00 0.00 O +ATOM 266 O WAT 266 5.000 13.000 11.000 1.00 0.00 O +ATOM 267 O WAT 267 5.000 13.000 13.000 1.00 0.00 O +ATOM 268 O WAT 268 5.000 13.000 15.000 1.00 0.00 O +ATOM 269 O WAT 269 5.000 13.000 17.000 1.00 0.00 O +ATOM 270 O WAT 270 5.000 13.000 19.000 1.00 0.00 O +ATOM 271 O WAT 271 5.000 15.000 1.000 1.00 0.00 O +ATOM 272 O WAT 272 5.000 15.000 3.000 1.00 0.00 O +ATOM 273 O WAT 273 5.000 15.000 5.000 1.00 0.00 O +ATOM 274 O WAT 274 5.000 15.000 7.000 1.00 0.00 O +ATOM 275 O WAT 275 5.000 15.000 9.000 1.00 0.00 O +ATOM 276 O WAT 276 5.000 15.000 11.000 1.00 0.00 O +ATOM 277 O WAT 277 5.000 15.000 13.000 1.00 0.00 O +ATOM 278 O WAT 278 5.000 15.000 15.000 1.00 0.00 O +ATOM 279 O WAT 279 5.000 15.000 17.000 1.00 0.00 O +ATOM 280 O WAT 280 5.000 15.000 19.000 1.00 0.00 O +ATOM 281 O WAT 281 5.000 17.000 1.000 1.00 0.00 O +ATOM 282 O WAT 282 5.000 17.000 3.000 1.00 0.00 O +ATOM 283 O WAT 283 5.000 17.000 5.000 1.00 0.00 O +ATOM 284 O WAT 284 5.000 17.000 7.000 1.00 0.00 O +ATOM 285 O WAT 285 5.000 17.000 9.000 1.00 0.00 O +ATOM 286 O WAT 286 5.000 17.000 11.000 1.00 0.00 O +ATOM 287 O WAT 287 5.000 17.000 13.000 1.00 0.00 O +ATOM 288 O WAT 288 5.000 17.000 15.000 1.00 0.00 O +ATOM 289 O WAT 289 5.000 17.000 17.000 1.00 0.00 O +ATOM 290 O WAT 290 5.000 17.000 19.000 1.00 0.00 O +ATOM 291 O WAT 291 5.000 19.000 1.000 1.00 0.00 O +ATOM 292 O WAT 292 5.000 19.000 3.000 1.00 0.00 O +ATOM 293 O WAT 293 5.000 19.000 5.000 1.00 0.00 O +ATOM 294 O WAT 294 5.000 19.000 7.000 1.00 0.00 O +ATOM 295 O WAT 295 5.000 19.000 9.000 1.00 0.00 O +ATOM 296 O WAT 296 5.000 19.000 11.000 1.00 0.00 O +ATOM 297 O WAT 297 5.000 19.000 13.000 1.00 0.00 O +ATOM 298 O WAT 298 5.000 19.000 15.000 1.00 0.00 O +ATOM 299 O WAT 299 5.000 19.000 17.000 1.00 0.00 O +ATOM 300 O WAT 300 5.000 19.000 19.000 1.00 0.00 O +ATOM 301 O WAT 301 7.000 1.000 1.000 1.00 0.00 O +ATOM 302 O WAT 302 7.000 1.000 3.000 1.00 0.00 O +ATOM 303 O WAT 303 7.000 1.000 5.000 1.00 0.00 O +ATOM 304 O WAT 304 7.000 1.000 7.000 1.00 0.00 O +ATOM 305 O WAT 305 7.000 1.000 9.000 1.00 0.00 O +ATOM 306 O WAT 306 7.000 1.000 11.000 1.00 0.00 O +ATOM 307 O WAT 307 7.000 1.000 13.000 1.00 0.00 O +ATOM 308 O WAT 308 7.000 1.000 15.000 1.00 0.00 O +ATOM 309 O WAT 309 7.000 1.000 17.000 1.00 0.00 O +ATOM 310 O WAT 310 7.000 1.000 19.000 1.00 0.00 O +ATOM 311 O WAT 311 7.000 3.000 1.000 1.00 0.00 O +ATOM 312 O WAT 312 7.000 3.000 3.000 1.00 0.00 O +ATOM 313 O WAT 313 7.000 3.000 5.000 1.00 0.00 O +ATOM 314 O WAT 314 7.000 3.000 7.000 1.00 0.00 O +ATOM 315 O WAT 315 7.000 3.000 9.000 1.00 0.00 O +ATOM 316 O WAT 316 7.000 3.000 11.000 1.00 0.00 O +ATOM 317 O WAT 317 7.000 3.000 13.000 1.00 0.00 O +ATOM 318 O WAT 318 7.000 3.000 15.000 1.00 0.00 O +ATOM 319 O WAT 319 7.000 3.000 17.000 1.00 0.00 O +ATOM 320 O WAT 320 7.000 3.000 19.000 1.00 0.00 O +ATOM 321 O WAT 321 7.000 5.000 1.000 1.00 0.00 O +ATOM 322 O WAT 322 7.000 5.000 3.000 1.00 0.00 O +ATOM 323 O WAT 323 7.000 5.000 5.000 1.00 0.00 O +ATOM 324 O WAT 324 7.000 5.000 7.000 1.00 0.00 O +ATOM 325 O WAT 325 7.000 5.000 9.000 1.00 0.00 O +ATOM 326 O WAT 326 7.000 5.000 11.000 1.00 0.00 O +ATOM 327 O WAT 327 7.000 5.000 13.000 1.00 0.00 O +ATOM 328 O WAT 328 7.000 5.000 15.000 1.00 0.00 O +ATOM 329 O WAT 329 7.000 5.000 17.000 1.00 0.00 O +ATOM 330 O WAT 330 7.000 5.000 19.000 1.00 0.00 O +ATOM 331 O WAT 331 7.000 7.000 1.000 1.00 0.00 O +ATOM 332 O WAT 332 7.000 7.000 3.000 1.00 0.00 O +ATOM 333 O WAT 333 7.000 7.000 5.000 1.00 0.00 O +ATOM 334 O WAT 334 7.000 7.000 7.000 1.00 0.00 O +ATOM 335 O WAT 335 7.000 7.000 9.000 1.00 0.00 O +ATOM 336 O WAT 336 7.000 7.000 11.000 1.00 0.00 O +ATOM 337 O WAT 337 7.000 7.000 13.000 1.00 0.00 O +ATOM 338 O WAT 338 7.000 7.000 15.000 1.00 0.00 O +ATOM 339 O WAT 339 7.000 7.000 17.000 1.00 0.00 O +ATOM 340 O WAT 340 7.000 7.000 19.000 1.00 0.00 O +ATOM 341 O WAT 341 7.000 9.000 1.000 1.00 0.00 O +ATOM 342 O WAT 342 7.000 9.000 3.000 1.00 0.00 O +ATOM 343 O WAT 343 7.000 9.000 5.000 1.00 0.00 O +ATOM 344 O WAT 344 7.000 9.000 7.000 1.00 0.00 O +ATOM 345 O WAT 345 7.000 9.000 9.000 1.00 0.00 O +ATOM 346 O WAT 346 7.000 9.000 11.000 1.00 0.00 O +ATOM 347 O WAT 347 7.000 9.000 13.000 1.00 0.00 O +ATOM 348 O WAT 348 7.000 9.000 15.000 1.00 0.00 O +ATOM 349 O WAT 349 7.000 9.000 17.000 1.00 0.00 O +ATOM 350 O WAT 350 7.000 9.000 19.000 1.00 0.00 O +ATOM 351 O WAT 351 7.000 11.000 1.000 1.00 0.00 O +ATOM 352 O WAT 352 7.000 11.000 3.000 1.00 0.00 O +ATOM 353 O WAT 353 7.000 11.000 5.000 1.00 0.00 O +ATOM 354 O WAT 354 7.000 11.000 7.000 1.00 0.00 O +ATOM 355 O WAT 355 7.000 11.000 9.000 1.00 0.00 O +ATOM 356 O WAT 356 7.000 11.000 11.000 1.00 0.00 O +ATOM 357 O WAT 357 7.000 11.000 13.000 1.00 0.00 O +ATOM 358 O WAT 358 7.000 11.000 15.000 1.00 0.00 O +ATOM 359 O WAT 359 7.000 11.000 17.000 1.00 0.00 O +ATOM 360 O WAT 360 7.000 11.000 19.000 1.00 0.00 O +ATOM 361 O WAT 361 7.000 13.000 1.000 1.00 0.00 O +ATOM 362 O WAT 362 7.000 13.000 3.000 1.00 0.00 O +ATOM 363 O WAT 363 7.000 13.000 5.000 1.00 0.00 O +ATOM 364 O WAT 364 7.000 13.000 7.000 1.00 0.00 O +ATOM 365 O WAT 365 7.000 13.000 9.000 1.00 0.00 O +ATOM 366 O WAT 366 7.000 13.000 11.000 1.00 0.00 O +ATOM 367 O WAT 367 7.000 13.000 13.000 1.00 0.00 O +ATOM 368 O WAT 368 7.000 13.000 15.000 1.00 0.00 O +ATOM 369 O WAT 369 7.000 13.000 17.000 1.00 0.00 O +ATOM 370 O WAT 370 7.000 13.000 19.000 1.00 0.00 O +ATOM 371 O WAT 371 7.000 15.000 1.000 1.00 0.00 O +ATOM 372 O WAT 372 7.000 15.000 3.000 1.00 0.00 O +ATOM 373 O WAT 373 7.000 15.000 5.000 1.00 0.00 O +ATOM 374 O WAT 374 7.000 15.000 7.000 1.00 0.00 O +ATOM 375 O WAT 375 7.000 15.000 9.000 1.00 0.00 O +ATOM 376 O WAT 376 7.000 15.000 11.000 1.00 0.00 O +ATOM 377 O WAT 377 7.000 15.000 13.000 1.00 0.00 O +ATOM 378 O WAT 378 7.000 15.000 15.000 1.00 0.00 O +ATOM 379 O WAT 379 7.000 15.000 17.000 1.00 0.00 O +ATOM 380 O WAT 380 7.000 15.000 19.000 1.00 0.00 O +ATOM 381 O WAT 381 7.000 17.000 1.000 1.00 0.00 O +ATOM 382 O WAT 382 7.000 17.000 3.000 1.00 0.00 O +ATOM 383 O WAT 383 7.000 17.000 5.000 1.00 0.00 O +ATOM 384 O WAT 384 7.000 17.000 7.000 1.00 0.00 O +ATOM 385 O WAT 385 7.000 17.000 9.000 1.00 0.00 O +ATOM 386 O WAT 386 7.000 17.000 11.000 1.00 0.00 O +ATOM 387 O WAT 387 7.000 17.000 13.000 1.00 0.00 O +ATOM 388 O WAT 388 7.000 17.000 15.000 1.00 0.00 O +ATOM 389 O WAT 389 7.000 17.000 17.000 1.00 0.00 O +ATOM 390 O WAT 390 7.000 17.000 19.000 1.00 0.00 O +ATOM 391 O WAT 391 7.000 19.000 1.000 1.00 0.00 O +ATOM 392 O WAT 392 7.000 19.000 3.000 1.00 0.00 O +ATOM 393 O WAT 393 7.000 19.000 5.000 1.00 0.00 O +ATOM 394 O WAT 394 7.000 19.000 7.000 1.00 0.00 O +ATOM 395 O WAT 395 7.000 19.000 9.000 1.00 0.00 O +ATOM 396 O WAT 396 7.000 19.000 11.000 1.00 0.00 O +ATOM 397 O WAT 397 7.000 19.000 13.000 1.00 0.00 O +ATOM 398 O WAT 398 7.000 19.000 15.000 1.00 0.00 O +ATOM 399 O WAT 399 7.000 19.000 17.000 1.00 0.00 O +ATOM 400 O WAT 400 7.000 19.000 19.000 1.00 0.00 O +ATOM 401 O WAT 401 9.000 1.000 1.000 1.00 0.00 O +ATOM 402 O WAT 402 9.000 1.000 3.000 1.00 0.00 O +ATOM 403 O WAT 403 9.000 1.000 5.000 1.00 0.00 O +ATOM 404 O WAT 404 9.000 1.000 7.000 1.00 0.00 O +ATOM 405 O WAT 405 9.000 1.000 9.000 1.00 0.00 O +ATOM 406 O WAT 406 9.000 1.000 11.000 1.00 0.00 O +ATOM 407 O WAT 407 9.000 1.000 13.000 1.00 0.00 O +ATOM 408 O WAT 408 9.000 1.000 15.000 1.00 0.00 O +ATOM 409 O WAT 409 9.000 1.000 17.000 1.00 0.00 O +ATOM 410 O WAT 410 9.000 1.000 19.000 1.00 0.00 O +ATOM 411 O WAT 411 9.000 3.000 1.000 1.00 0.00 O +ATOM 412 O WAT 412 9.000 3.000 3.000 1.00 0.00 O +ATOM 413 O WAT 413 9.000 3.000 5.000 1.00 0.00 O +ATOM 414 O WAT 414 9.000 3.000 7.000 1.00 0.00 O +ATOM 415 O WAT 415 9.000 3.000 9.000 1.00 0.00 O +ATOM 416 O WAT 416 9.000 3.000 11.000 1.00 0.00 O +ATOM 417 O WAT 417 9.000 3.000 13.000 1.00 0.00 O +ATOM 418 O WAT 418 9.000 3.000 15.000 1.00 0.00 O +ATOM 419 O WAT 419 9.000 3.000 17.000 1.00 0.00 O +ATOM 420 O WAT 420 9.000 3.000 19.000 1.00 0.00 O +ATOM 421 O WAT 421 9.000 5.000 1.000 1.00 0.00 O +ATOM 422 O WAT 422 9.000 5.000 3.000 1.00 0.00 O +ATOM 423 O WAT 423 9.000 5.000 5.000 1.00 0.00 O +ATOM 424 O WAT 424 9.000 5.000 7.000 1.00 0.00 O +ATOM 425 O WAT 425 9.000 5.000 9.000 1.00 0.00 O +ATOM 426 O WAT 426 9.000 5.000 11.000 1.00 0.00 O +ATOM 427 O WAT 427 9.000 5.000 13.000 1.00 0.00 O +ATOM 428 O WAT 428 9.000 5.000 15.000 1.00 0.00 O +ATOM 429 O WAT 429 9.000 5.000 17.000 1.00 0.00 O +ATOM 430 O WAT 430 9.000 5.000 19.000 1.00 0.00 O +ATOM 431 O WAT 431 9.000 7.000 1.000 1.00 0.00 O +ATOM 432 O WAT 432 9.000 7.000 3.000 1.00 0.00 O +ATOM 433 O WAT 433 9.000 7.000 5.000 1.00 0.00 O +ATOM 434 O WAT 434 9.000 7.000 7.000 1.00 0.00 O +ATOM 435 O WAT 435 9.000 7.000 9.000 1.00 0.00 O +ATOM 436 O WAT 436 9.000 7.000 11.000 1.00 0.00 O +ATOM 437 O WAT 437 9.000 7.000 13.000 1.00 0.00 O +ATOM 438 O WAT 438 9.000 7.000 15.000 1.00 0.00 O +ATOM 439 O WAT 439 9.000 7.000 17.000 1.00 0.00 O +ATOM 440 O WAT 440 9.000 7.000 19.000 1.00 0.00 O +ATOM 441 O WAT 441 9.000 9.000 1.000 1.00 0.00 O +ATOM 442 O WAT 442 9.000 9.000 3.000 1.00 0.00 O +ATOM 443 O WAT 443 9.000 9.000 5.000 1.00 0.00 O +ATOM 444 O WAT 444 9.000 9.000 7.000 1.00 0.00 O +ATOM 445 O WAT 445 9.000 9.000 9.000 1.00 0.00 O +ATOM 446 O WAT 446 9.000 9.000 11.000 1.00 0.00 O +ATOM 447 O WAT 447 9.000 9.000 13.000 1.00 0.00 O +ATOM 448 O WAT 448 9.000 9.000 15.000 1.00 0.00 O +ATOM 449 O WAT 449 9.000 9.000 17.000 1.00 0.00 O +ATOM 450 O WAT 450 9.000 9.000 19.000 1.00 0.00 O +ATOM 451 O WAT 451 9.000 11.000 1.000 1.00 0.00 O +ATOM 452 O WAT 452 9.000 11.000 3.000 1.00 0.00 O +ATOM 453 O WAT 453 9.000 11.000 5.000 1.00 0.00 O +ATOM 454 O WAT 454 9.000 11.000 7.000 1.00 0.00 O +ATOM 455 O WAT 455 9.000 11.000 9.000 1.00 0.00 O +ATOM 456 O WAT 456 9.000 11.000 11.000 1.00 0.00 O +ATOM 457 O WAT 457 9.000 11.000 13.000 1.00 0.00 O +ATOM 458 O WAT 458 9.000 11.000 15.000 1.00 0.00 O +ATOM 459 O WAT 459 9.000 11.000 17.000 1.00 0.00 O +ATOM 460 O WAT 460 9.000 11.000 19.000 1.00 0.00 O +ATOM 461 O WAT 461 9.000 13.000 1.000 1.00 0.00 O +ATOM 462 O WAT 462 9.000 13.000 3.000 1.00 0.00 O +ATOM 463 O WAT 463 9.000 13.000 5.000 1.00 0.00 O +ATOM 464 O WAT 464 9.000 13.000 7.000 1.00 0.00 O +ATOM 465 O WAT 465 9.000 13.000 9.000 1.00 0.00 O +ATOM 466 O WAT 466 9.000 13.000 11.000 1.00 0.00 O +ATOM 467 O WAT 467 9.000 13.000 13.000 1.00 0.00 O +ATOM 468 O WAT 468 9.000 13.000 15.000 1.00 0.00 O +ATOM 469 O WAT 469 9.000 13.000 17.000 1.00 0.00 O +ATOM 470 O WAT 470 9.000 13.000 19.000 1.00 0.00 O +ATOM 471 O WAT 471 9.000 15.000 1.000 1.00 0.00 O +ATOM 472 O WAT 472 9.000 15.000 3.000 1.00 0.00 O +ATOM 473 O WAT 473 9.000 15.000 5.000 1.00 0.00 O +ATOM 474 O WAT 474 9.000 15.000 7.000 1.00 0.00 O +ATOM 475 O WAT 475 9.000 15.000 9.000 1.00 0.00 O +ATOM 476 O WAT 476 9.000 15.000 11.000 1.00 0.00 O +ATOM 477 O WAT 477 9.000 15.000 13.000 1.00 0.00 O +ATOM 478 O WAT 478 9.000 15.000 15.000 1.00 0.00 O +ATOM 479 O WAT 479 9.000 15.000 17.000 1.00 0.00 O +ATOM 480 O WAT 480 9.000 15.000 19.000 1.00 0.00 O +ATOM 481 O WAT 481 9.000 17.000 1.000 1.00 0.00 O +ATOM 482 O WAT 482 9.000 17.000 3.000 1.00 0.00 O +ATOM 483 O WAT 483 9.000 17.000 5.000 1.00 0.00 O +ATOM 484 O WAT 484 9.000 17.000 7.000 1.00 0.00 O +ATOM 485 O WAT 485 9.000 17.000 9.000 1.00 0.00 O +ATOM 486 O WAT 486 9.000 17.000 11.000 1.00 0.00 O +ATOM 487 O WAT 487 9.000 17.000 13.000 1.00 0.00 O +ATOM 488 O WAT 488 9.000 17.000 15.000 1.00 0.00 O +ATOM 489 O WAT 489 9.000 17.000 17.000 1.00 0.00 O +ATOM 490 O WAT 490 9.000 17.000 19.000 1.00 0.00 O +ATOM 491 O WAT 491 9.000 19.000 1.000 1.00 0.00 O +ATOM 492 O WAT 492 9.000 19.000 3.000 1.00 0.00 O +ATOM 493 O WAT 493 9.000 19.000 5.000 1.00 0.00 O +ATOM 494 O WAT 494 9.000 19.000 7.000 1.00 0.00 O +ATOM 495 O WAT 495 9.000 19.000 9.000 1.00 0.00 O +ATOM 496 O WAT 496 9.000 19.000 11.000 1.00 0.00 O +ATOM 497 O WAT 497 9.000 19.000 13.000 1.00 0.00 O +ATOM 498 O WAT 498 9.000 19.000 15.000 1.00 0.00 O +ATOM 499 O WAT 499 9.000 19.000 17.000 1.00 0.00 O +ATOM 500 O WAT 500 9.000 19.000 19.000 1.00 0.00 O +ATOM 501 O WAT 501 11.000 1.000 1.000 1.00 0.00 O +ATOM 502 O WAT 502 11.000 1.000 3.000 1.00 0.00 O +ATOM 503 O WAT 503 11.000 1.000 5.000 1.00 0.00 O +ATOM 504 O WAT 504 11.000 1.000 7.000 1.00 0.00 O +ATOM 505 O WAT 505 11.000 1.000 9.000 1.00 0.00 O +ATOM 506 O WAT 506 11.000 1.000 11.000 1.00 0.00 O +ATOM 507 O WAT 507 11.000 1.000 13.000 1.00 0.00 O +ATOM 508 O WAT 508 11.000 1.000 15.000 1.00 0.00 O +ATOM 509 O WAT 509 11.000 1.000 17.000 1.00 0.00 O +ATOM 510 O WAT 510 11.000 1.000 19.000 1.00 0.00 O +ATOM 511 O WAT 511 11.000 3.000 1.000 1.00 0.00 O +ATOM 512 O WAT 512 11.000 3.000 3.000 1.00 0.00 O +ATOM 513 O WAT 513 11.000 3.000 5.000 1.00 0.00 O +ATOM 514 O WAT 514 11.000 3.000 7.000 1.00 0.00 O +ATOM 515 O WAT 515 11.000 3.000 9.000 1.00 0.00 O +ATOM 516 O WAT 516 11.000 3.000 11.000 1.00 0.00 O +ATOM 517 O WAT 517 11.000 3.000 13.000 1.00 0.00 O +ATOM 518 O WAT 518 11.000 3.000 15.000 1.00 0.00 O +ATOM 519 O WAT 519 11.000 3.000 17.000 1.00 0.00 O +ATOM 520 O WAT 520 11.000 3.000 19.000 1.00 0.00 O +ATOM 521 O WAT 521 11.000 5.000 1.000 1.00 0.00 O +ATOM 522 O WAT 522 11.000 5.000 3.000 1.00 0.00 O +ATOM 523 O WAT 523 11.000 5.000 5.000 1.00 0.00 O +ATOM 524 O WAT 524 11.000 5.000 7.000 1.00 0.00 O +ATOM 525 O WAT 525 11.000 5.000 9.000 1.00 0.00 O +ATOM 526 O WAT 526 11.000 5.000 11.000 1.00 0.00 O +ATOM 527 O WAT 527 11.000 5.000 13.000 1.00 0.00 O +ATOM 528 O WAT 528 11.000 5.000 15.000 1.00 0.00 O +ATOM 529 O WAT 529 11.000 5.000 17.000 1.00 0.00 O +ATOM 530 O WAT 530 11.000 5.000 19.000 1.00 0.00 O +ATOM 531 O WAT 531 11.000 7.000 1.000 1.00 0.00 O +ATOM 532 O WAT 532 11.000 7.000 3.000 1.00 0.00 O +ATOM 533 O WAT 533 11.000 7.000 5.000 1.00 0.00 O +ATOM 534 O WAT 534 11.000 7.000 7.000 1.00 0.00 O +ATOM 535 O WAT 535 11.000 7.000 9.000 1.00 0.00 O +ATOM 536 O WAT 536 11.000 7.000 11.000 1.00 0.00 O +ATOM 537 O WAT 537 11.000 7.000 13.000 1.00 0.00 O +ATOM 538 O WAT 538 11.000 7.000 15.000 1.00 0.00 O +ATOM 539 O WAT 539 11.000 7.000 17.000 1.00 0.00 O +ATOM 540 O WAT 540 11.000 7.000 19.000 1.00 0.00 O +ATOM 541 O WAT 541 11.000 9.000 1.000 1.00 0.00 O +ATOM 542 O WAT 542 11.000 9.000 3.000 1.00 0.00 O +ATOM 543 O WAT 543 11.000 9.000 5.000 1.00 0.00 O +ATOM 544 O WAT 544 11.000 9.000 7.000 1.00 0.00 O +ATOM 545 O WAT 545 11.000 9.000 9.000 1.00 0.00 O +ATOM 546 O WAT 546 11.000 9.000 11.000 1.00 0.00 O +ATOM 547 O WAT 547 11.000 9.000 13.000 1.00 0.00 O +ATOM 548 O WAT 548 11.000 9.000 15.000 1.00 0.00 O +ATOM 549 O WAT 549 11.000 9.000 17.000 1.00 0.00 O +ATOM 550 O WAT 550 11.000 9.000 19.000 1.00 0.00 O +ATOM 551 O WAT 551 11.000 11.000 1.000 1.00 0.00 O +ATOM 552 O WAT 552 11.000 11.000 3.000 1.00 0.00 O +ATOM 553 O WAT 553 11.000 11.000 5.000 1.00 0.00 O +ATOM 554 O WAT 554 11.000 11.000 7.000 1.00 0.00 O +ATOM 555 O WAT 555 11.000 11.000 9.000 1.00 0.00 O +ATOM 556 O WAT 556 11.000 11.000 11.000 1.00 0.00 O +ATOM 557 O WAT 557 11.000 11.000 13.000 1.00 0.00 O +ATOM 558 O WAT 558 11.000 11.000 15.000 1.00 0.00 O +ATOM 559 O WAT 559 11.000 11.000 17.000 1.00 0.00 O +ATOM 560 O WAT 560 11.000 11.000 19.000 1.00 0.00 O +ATOM 561 O WAT 561 11.000 13.000 1.000 1.00 0.00 O +ATOM 562 O WAT 562 11.000 13.000 3.000 1.00 0.00 O +ATOM 563 O WAT 563 11.000 13.000 5.000 1.00 0.00 O +ATOM 564 O WAT 564 11.000 13.000 7.000 1.00 0.00 O +ATOM 565 O WAT 565 11.000 13.000 9.000 1.00 0.00 O +ATOM 566 O WAT 566 11.000 13.000 11.000 1.00 0.00 O +ATOM 567 O WAT 567 11.000 13.000 13.000 1.00 0.00 O +ATOM 568 O WAT 568 11.000 13.000 15.000 1.00 0.00 O +ATOM 569 O WAT 569 11.000 13.000 17.000 1.00 0.00 O +ATOM 570 O WAT 570 11.000 13.000 19.000 1.00 0.00 O +ATOM 571 O WAT 571 11.000 15.000 1.000 1.00 0.00 O +ATOM 572 O WAT 572 11.000 15.000 3.000 1.00 0.00 O +ATOM 573 O WAT 573 11.000 15.000 5.000 1.00 0.00 O +ATOM 574 O WAT 574 11.000 15.000 7.000 1.00 0.00 O +ATOM 575 O WAT 575 11.000 15.000 9.000 1.00 0.00 O +ATOM 576 O WAT 576 11.000 15.000 11.000 1.00 0.00 O +ATOM 577 O WAT 577 11.000 15.000 13.000 1.00 0.00 O +ATOM 578 O WAT 578 11.000 15.000 15.000 1.00 0.00 O +ATOM 579 O WAT 579 11.000 15.000 17.000 1.00 0.00 O +ATOM 580 O WAT 580 11.000 15.000 19.000 1.00 0.00 O +ATOM 581 O WAT 581 11.000 17.000 1.000 1.00 0.00 O +ATOM 582 O WAT 582 11.000 17.000 3.000 1.00 0.00 O +ATOM 583 O WAT 583 11.000 17.000 5.000 1.00 0.00 O +ATOM 584 O WAT 584 11.000 17.000 7.000 1.00 0.00 O +ATOM 585 O WAT 585 11.000 17.000 9.000 1.00 0.00 O +ATOM 586 O WAT 586 11.000 17.000 11.000 1.00 0.00 O +ATOM 587 O WAT 587 11.000 17.000 13.000 1.00 0.00 O +ATOM 588 O WAT 588 11.000 17.000 15.000 1.00 0.00 O +ATOM 589 O WAT 589 11.000 17.000 17.000 1.00 0.00 O +ATOM 590 O WAT 590 11.000 17.000 19.000 1.00 0.00 O +ATOM 591 O WAT 591 11.000 19.000 1.000 1.00 0.00 O +ATOM 592 O WAT 592 11.000 19.000 3.000 1.00 0.00 O +ATOM 593 O WAT 593 11.000 19.000 5.000 1.00 0.00 O +ATOM 594 O WAT 594 11.000 19.000 7.000 1.00 0.00 O +ATOM 595 O WAT 595 11.000 19.000 9.000 1.00 0.00 O +ATOM 596 O WAT 596 11.000 19.000 11.000 1.00 0.00 O +ATOM 597 O WAT 597 11.000 19.000 13.000 1.00 0.00 O +ATOM 598 O WAT 598 11.000 19.000 15.000 1.00 0.00 O +ATOM 599 O WAT 599 11.000 19.000 17.000 1.00 0.00 O +ATOM 600 O WAT 600 11.000 19.000 19.000 1.00 0.00 O +ATOM 601 O WAT 601 13.000 1.000 1.000 1.00 0.00 O +ATOM 602 O WAT 602 13.000 1.000 3.000 1.00 0.00 O +ATOM 603 O WAT 603 13.000 1.000 5.000 1.00 0.00 O +ATOM 604 O WAT 604 13.000 1.000 7.000 1.00 0.00 O +ATOM 605 O WAT 605 13.000 1.000 9.000 1.00 0.00 O +ATOM 606 O WAT 606 13.000 1.000 11.000 1.00 0.00 O +ATOM 607 O WAT 607 13.000 1.000 13.000 1.00 0.00 O +ATOM 608 O WAT 608 13.000 1.000 15.000 1.00 0.00 O +ATOM 609 O WAT 609 13.000 1.000 17.000 1.00 0.00 O +ATOM 610 O WAT 610 13.000 1.000 19.000 1.00 0.00 O +ATOM 611 O WAT 611 13.000 3.000 1.000 1.00 0.00 O +ATOM 612 O WAT 612 13.000 3.000 3.000 1.00 0.00 O +ATOM 613 O WAT 613 13.000 3.000 5.000 1.00 0.00 O +ATOM 614 O WAT 614 13.000 3.000 7.000 1.00 0.00 O +ATOM 615 O WAT 615 13.000 3.000 9.000 1.00 0.00 O +ATOM 616 O WAT 616 13.000 3.000 11.000 1.00 0.00 O +ATOM 617 O WAT 617 13.000 3.000 13.000 1.00 0.00 O +ATOM 618 O WAT 618 13.000 3.000 15.000 1.00 0.00 O +ATOM 619 O WAT 619 13.000 3.000 17.000 1.00 0.00 O +ATOM 620 O WAT 620 13.000 3.000 19.000 1.00 0.00 O +ATOM 621 O WAT 621 13.000 5.000 1.000 1.00 0.00 O +ATOM 622 O WAT 622 13.000 5.000 3.000 1.00 0.00 O +ATOM 623 O WAT 623 13.000 5.000 5.000 1.00 0.00 O +ATOM 624 O WAT 624 13.000 5.000 7.000 1.00 0.00 O +ATOM 625 O WAT 625 13.000 5.000 9.000 1.00 0.00 O +ATOM 626 O WAT 626 13.000 5.000 11.000 1.00 0.00 O +ATOM 627 O WAT 627 13.000 5.000 13.000 1.00 0.00 O +ATOM 628 O WAT 628 13.000 5.000 15.000 1.00 0.00 O +ATOM 629 O WAT 629 13.000 5.000 17.000 1.00 0.00 O +ATOM 630 O WAT 630 13.000 5.000 19.000 1.00 0.00 O +ATOM 631 O WAT 631 13.000 7.000 1.000 1.00 0.00 O +ATOM 632 O WAT 632 13.000 7.000 3.000 1.00 0.00 O +ATOM 633 O WAT 633 13.000 7.000 5.000 1.00 0.00 O +ATOM 634 O WAT 634 13.000 7.000 7.000 1.00 0.00 O +ATOM 635 O WAT 635 13.000 7.000 9.000 1.00 0.00 O +ATOM 636 O WAT 636 13.000 7.000 11.000 1.00 0.00 O +ATOM 637 O WAT 637 13.000 7.000 13.000 1.00 0.00 O +ATOM 638 O WAT 638 13.000 7.000 15.000 1.00 0.00 O +ATOM 639 O WAT 639 13.000 7.000 17.000 1.00 0.00 O +ATOM 640 O WAT 640 13.000 7.000 19.000 1.00 0.00 O +ATOM 641 O WAT 641 13.000 9.000 1.000 1.00 0.00 O +ATOM 642 O WAT 642 13.000 9.000 3.000 1.00 0.00 O +ATOM 643 O WAT 643 13.000 9.000 5.000 1.00 0.00 O +ATOM 644 O WAT 644 13.000 9.000 7.000 1.00 0.00 O +ATOM 645 O WAT 645 13.000 9.000 9.000 1.00 0.00 O +ATOM 646 O WAT 646 13.000 9.000 11.000 1.00 0.00 O +ATOM 647 O WAT 647 13.000 9.000 13.000 1.00 0.00 O +ATOM 648 O WAT 648 13.000 9.000 15.000 1.00 0.00 O +ATOM 649 O WAT 649 13.000 9.000 17.000 1.00 0.00 O +ATOM 650 O WAT 650 13.000 9.000 19.000 1.00 0.00 O +ATOM 651 O WAT 651 13.000 11.000 1.000 1.00 0.00 O +ATOM 652 O WAT 652 13.000 11.000 3.000 1.00 0.00 O +ATOM 653 O WAT 653 13.000 11.000 5.000 1.00 0.00 O +ATOM 654 O WAT 654 13.000 11.000 7.000 1.00 0.00 O +ATOM 655 O WAT 655 13.000 11.000 9.000 1.00 0.00 O +ATOM 656 O WAT 656 13.000 11.000 11.000 1.00 0.00 O +ATOM 657 O WAT 657 13.000 11.000 13.000 1.00 0.00 O +ATOM 658 O WAT 658 13.000 11.000 15.000 1.00 0.00 O +ATOM 659 O WAT 659 13.000 11.000 17.000 1.00 0.00 O +ATOM 660 O WAT 660 13.000 11.000 19.000 1.00 0.00 O +ATOM 661 O WAT 661 13.000 13.000 1.000 1.00 0.00 O +ATOM 662 O WAT 662 13.000 13.000 3.000 1.00 0.00 O +ATOM 663 O WAT 663 13.000 13.000 5.000 1.00 0.00 O +ATOM 664 O WAT 664 13.000 13.000 7.000 1.00 0.00 O +ATOM 665 O WAT 665 13.000 13.000 9.000 1.00 0.00 O +ATOM 666 O WAT 666 13.000 13.000 11.000 1.00 0.00 O +ATOM 667 O WAT 667 13.000 13.000 13.000 1.00 0.00 O +ATOM 668 O WAT 668 13.000 13.000 15.000 1.00 0.00 O +ATOM 669 O WAT 669 13.000 13.000 17.000 1.00 0.00 O +ATOM 670 O WAT 670 13.000 13.000 19.000 1.00 0.00 O +ATOM 671 O WAT 671 13.000 15.000 1.000 1.00 0.00 O +ATOM 672 O WAT 672 13.000 15.000 3.000 1.00 0.00 O +ATOM 673 O WAT 673 13.000 15.000 5.000 1.00 0.00 O +ATOM 674 O WAT 674 13.000 15.000 7.000 1.00 0.00 O +ATOM 675 O WAT 675 13.000 15.000 9.000 1.00 0.00 O +ATOM 676 O WAT 676 13.000 15.000 11.000 1.00 0.00 O +ATOM 677 O WAT 677 13.000 15.000 13.000 1.00 0.00 O +ATOM 678 O WAT 678 13.000 15.000 15.000 1.00 0.00 O +ATOM 679 O WAT 679 13.000 15.000 17.000 1.00 0.00 O +ATOM 680 O WAT 680 13.000 15.000 19.000 1.00 0.00 O +ATOM 681 O WAT 681 13.000 17.000 1.000 1.00 0.00 O +ATOM 682 O WAT 682 13.000 17.000 3.000 1.00 0.00 O +ATOM 683 O WAT 683 13.000 17.000 5.000 1.00 0.00 O +ATOM 684 O WAT 684 13.000 17.000 7.000 1.00 0.00 O +ATOM 685 O WAT 685 13.000 17.000 9.000 1.00 0.00 O +ATOM 686 O WAT 686 13.000 17.000 11.000 1.00 0.00 O +ATOM 687 O WAT 687 13.000 17.000 13.000 1.00 0.00 O +ATOM 688 O WAT 688 13.000 17.000 15.000 1.00 0.00 O +ATOM 689 O WAT 689 13.000 17.000 17.000 1.00 0.00 O +ATOM 690 O WAT 690 13.000 17.000 19.000 1.00 0.00 O +ATOM 691 O WAT 691 13.000 19.000 1.000 1.00 0.00 O +ATOM 692 O WAT 692 13.000 19.000 3.000 1.00 0.00 O +ATOM 693 O WAT 693 13.000 19.000 5.000 1.00 0.00 O +ATOM 694 O WAT 694 13.000 19.000 7.000 1.00 0.00 O +ATOM 695 O WAT 695 13.000 19.000 9.000 1.00 0.00 O +ATOM 696 O WAT 696 13.000 19.000 11.000 1.00 0.00 O +ATOM 697 O WAT 697 13.000 19.000 13.000 1.00 0.00 O +ATOM 698 O WAT 698 13.000 19.000 15.000 1.00 0.00 O +ATOM 699 O WAT 699 13.000 19.000 17.000 1.00 0.00 O +ATOM 700 O WAT 700 13.000 19.000 19.000 1.00 0.00 O +ATOM 701 O WAT 701 15.000 1.000 1.000 1.00 0.00 O +ATOM 702 O WAT 702 15.000 1.000 3.000 1.00 0.00 O +ATOM 703 O WAT 703 15.000 1.000 5.000 1.00 0.00 O +ATOM 704 O WAT 704 15.000 1.000 7.000 1.00 0.00 O +ATOM 705 O WAT 705 15.000 1.000 9.000 1.00 0.00 O +ATOM 706 O WAT 706 15.000 1.000 11.000 1.00 0.00 O +ATOM 707 O WAT 707 15.000 1.000 13.000 1.00 0.00 O +ATOM 708 O WAT 708 15.000 1.000 15.000 1.00 0.00 O +ATOM 709 O WAT 709 15.000 1.000 17.000 1.00 0.00 O +ATOM 710 O WAT 710 15.000 1.000 19.000 1.00 0.00 O +ATOM 711 O WAT 711 15.000 3.000 1.000 1.00 0.00 O +ATOM 712 O WAT 712 15.000 3.000 3.000 1.00 0.00 O +ATOM 713 O WAT 713 15.000 3.000 5.000 1.00 0.00 O +ATOM 714 O WAT 714 15.000 3.000 7.000 1.00 0.00 O +ATOM 715 O WAT 715 15.000 3.000 9.000 1.00 0.00 O +ATOM 716 O WAT 716 15.000 3.000 11.000 1.00 0.00 O +ATOM 717 O WAT 717 15.000 3.000 13.000 1.00 0.00 O +ATOM 718 O WAT 718 15.000 3.000 15.000 1.00 0.00 O +ATOM 719 O WAT 719 15.000 3.000 17.000 1.00 0.00 O +ATOM 720 O WAT 720 15.000 3.000 19.000 1.00 0.00 O +ATOM 721 O WAT 721 15.000 5.000 1.000 1.00 0.00 O +ATOM 722 O WAT 722 15.000 5.000 3.000 1.00 0.00 O +ATOM 723 O WAT 723 15.000 5.000 5.000 1.00 0.00 O +ATOM 724 O WAT 724 15.000 5.000 7.000 1.00 0.00 O +ATOM 725 O WAT 725 15.000 5.000 9.000 1.00 0.00 O +ATOM 726 O WAT 726 15.000 5.000 11.000 1.00 0.00 O +ATOM 727 O WAT 727 15.000 5.000 13.000 1.00 0.00 O +ATOM 728 O WAT 728 15.000 5.000 15.000 1.00 0.00 O +ATOM 729 O WAT 729 15.000 5.000 17.000 1.00 0.00 O +ATOM 730 O WAT 730 15.000 5.000 19.000 1.00 0.00 O +ATOM 731 O WAT 731 15.000 7.000 1.000 1.00 0.00 O +ATOM 732 O WAT 732 15.000 7.000 3.000 1.00 0.00 O +ATOM 733 O WAT 733 15.000 7.000 5.000 1.00 0.00 O +ATOM 734 O WAT 734 15.000 7.000 7.000 1.00 0.00 O +ATOM 735 O WAT 735 15.000 7.000 9.000 1.00 0.00 O +ATOM 736 O WAT 736 15.000 7.000 11.000 1.00 0.00 O +ATOM 737 O WAT 737 15.000 7.000 13.000 1.00 0.00 O +ATOM 738 O WAT 738 15.000 7.000 15.000 1.00 0.00 O +ATOM 739 O WAT 739 15.000 7.000 17.000 1.00 0.00 O +ATOM 740 O WAT 740 15.000 7.000 19.000 1.00 0.00 O +ATOM 741 O WAT 741 15.000 9.000 1.000 1.00 0.00 O +ATOM 742 O WAT 742 15.000 9.000 3.000 1.00 0.00 O +ATOM 743 O WAT 743 15.000 9.000 5.000 1.00 0.00 O +ATOM 744 O WAT 744 15.000 9.000 7.000 1.00 0.00 O +ATOM 745 O WAT 745 15.000 9.000 9.000 1.00 0.00 O +ATOM 746 O WAT 746 15.000 9.000 11.000 1.00 0.00 O +ATOM 747 O WAT 747 15.000 9.000 13.000 1.00 0.00 O +ATOM 748 O WAT 748 15.000 9.000 15.000 1.00 0.00 O +ATOM 749 O WAT 749 15.000 9.000 17.000 1.00 0.00 O +ATOM 750 O WAT 750 15.000 9.000 19.000 1.00 0.00 O +ATOM 751 O WAT 751 15.000 11.000 1.000 1.00 0.00 O +ATOM 752 O WAT 752 15.000 11.000 3.000 1.00 0.00 O +ATOM 753 O WAT 753 15.000 11.000 5.000 1.00 0.00 O +ATOM 754 O WAT 754 15.000 11.000 7.000 1.00 0.00 O +ATOM 755 O WAT 755 15.000 11.000 9.000 1.00 0.00 O +ATOM 756 O WAT 756 15.000 11.000 11.000 1.00 0.00 O +ATOM 757 O WAT 757 15.000 11.000 13.000 1.00 0.00 O +ATOM 758 O WAT 758 15.000 11.000 15.000 1.00 0.00 O +ATOM 759 O WAT 759 15.000 11.000 17.000 1.00 0.00 O +ATOM 760 O WAT 760 15.000 11.000 19.000 1.00 0.00 O +ATOM 761 O WAT 761 15.000 13.000 1.000 1.00 0.00 O +ATOM 762 O WAT 762 15.000 13.000 3.000 1.00 0.00 O +ATOM 763 O WAT 763 15.000 13.000 5.000 1.00 0.00 O +ATOM 764 O WAT 764 15.000 13.000 7.000 1.00 0.00 O +ATOM 765 O WAT 765 15.000 13.000 9.000 1.00 0.00 O +ATOM 766 O WAT 766 15.000 13.000 11.000 1.00 0.00 O +ATOM 767 O WAT 767 15.000 13.000 13.000 1.00 0.00 O +ATOM 768 O WAT 768 15.000 13.000 15.000 1.00 0.00 O +ATOM 769 O WAT 769 15.000 13.000 17.000 1.00 0.00 O +ATOM 770 O WAT 770 15.000 13.000 19.000 1.00 0.00 O +ATOM 771 O WAT 771 15.000 15.000 1.000 1.00 0.00 O +ATOM 772 O WAT 772 15.000 15.000 3.000 1.00 0.00 O +ATOM 773 O WAT 773 15.000 15.000 5.000 1.00 0.00 O +ATOM 774 O WAT 774 15.000 15.000 7.000 1.00 0.00 O +ATOM 775 O WAT 775 15.000 15.000 9.000 1.00 0.00 O +ATOM 776 O WAT 776 15.000 15.000 11.000 1.00 0.00 O +ATOM 777 O WAT 777 15.000 15.000 13.000 1.00 0.00 O +ATOM 778 O WAT 778 15.000 15.000 15.000 1.00 0.00 O +ATOM 779 O WAT 779 15.000 15.000 17.000 1.00 0.00 O +ATOM 780 O WAT 780 15.000 15.000 19.000 1.00 0.00 O +ATOM 781 O WAT 781 15.000 17.000 1.000 1.00 0.00 O +ATOM 782 O WAT 782 15.000 17.000 3.000 1.00 0.00 O +ATOM 783 O WAT 783 15.000 17.000 5.000 1.00 0.00 O +ATOM 784 O WAT 784 15.000 17.000 7.000 1.00 0.00 O +ATOM 785 O WAT 785 15.000 17.000 9.000 1.00 0.00 O +ATOM 786 O WAT 786 15.000 17.000 11.000 1.00 0.00 O +ATOM 787 O WAT 787 15.000 17.000 13.000 1.00 0.00 O +ATOM 788 O WAT 788 15.000 17.000 15.000 1.00 0.00 O +ATOM 789 O WAT 789 15.000 17.000 17.000 1.00 0.00 O +ATOM 790 O WAT 790 15.000 17.000 19.000 1.00 0.00 O +ATOM 791 O WAT 791 15.000 19.000 1.000 1.00 0.00 O +ATOM 792 O WAT 792 15.000 19.000 3.000 1.00 0.00 O +ATOM 793 O WAT 793 15.000 19.000 5.000 1.00 0.00 O +ATOM 794 O WAT 794 15.000 19.000 7.000 1.00 0.00 O +ATOM 795 O WAT 795 15.000 19.000 9.000 1.00 0.00 O +ATOM 796 O WAT 796 15.000 19.000 11.000 1.00 0.00 O +ATOM 797 O WAT 797 15.000 19.000 13.000 1.00 0.00 O +ATOM 798 O WAT 798 15.000 19.000 15.000 1.00 0.00 O +ATOM 799 O WAT 799 15.000 19.000 17.000 1.00 0.00 O +ATOM 800 O WAT 800 15.000 19.000 19.000 1.00 0.00 O +ATOM 801 O WAT 801 17.000 1.000 1.000 1.00 0.00 O +ATOM 802 O WAT 802 17.000 1.000 3.000 1.00 0.00 O +ATOM 803 O WAT 803 17.000 1.000 5.000 1.00 0.00 O +ATOM 804 O WAT 804 17.000 1.000 7.000 1.00 0.00 O +ATOM 805 O WAT 805 17.000 1.000 9.000 1.00 0.00 O +ATOM 806 O WAT 806 17.000 1.000 11.000 1.00 0.00 O +ATOM 807 O WAT 807 17.000 1.000 13.000 1.00 0.00 O +ATOM 808 O WAT 808 17.000 1.000 15.000 1.00 0.00 O +ATOM 809 O WAT 809 17.000 1.000 17.000 1.00 0.00 O +ATOM 810 O WAT 810 17.000 1.000 19.000 1.00 0.00 O +ATOM 811 O WAT 811 17.000 3.000 1.000 1.00 0.00 O +ATOM 812 O WAT 812 17.000 3.000 3.000 1.00 0.00 O +ATOM 813 O WAT 813 17.000 3.000 5.000 1.00 0.00 O +ATOM 814 O WAT 814 17.000 3.000 7.000 1.00 0.00 O +ATOM 815 O WAT 815 17.000 3.000 9.000 1.00 0.00 O +ATOM 816 O WAT 816 17.000 3.000 11.000 1.00 0.00 O +ATOM 817 O WAT 817 17.000 3.000 13.000 1.00 0.00 O +ATOM 818 O WAT 818 17.000 3.000 15.000 1.00 0.00 O +ATOM 819 O WAT 819 17.000 3.000 17.000 1.00 0.00 O +ATOM 820 O WAT 820 17.000 3.000 19.000 1.00 0.00 O +ATOM 821 O WAT 821 17.000 5.000 1.000 1.00 0.00 O +ATOM 822 O WAT 822 17.000 5.000 3.000 1.00 0.00 O +ATOM 823 O WAT 823 17.000 5.000 5.000 1.00 0.00 O +ATOM 824 O WAT 824 17.000 5.000 7.000 1.00 0.00 O +ATOM 825 O WAT 825 17.000 5.000 9.000 1.00 0.00 O +ATOM 826 O WAT 826 17.000 5.000 11.000 1.00 0.00 O +ATOM 827 O WAT 827 17.000 5.000 13.000 1.00 0.00 O +ATOM 828 O WAT 828 17.000 5.000 15.000 1.00 0.00 O +ATOM 829 O WAT 829 17.000 5.000 17.000 1.00 0.00 O +ATOM 830 O WAT 830 17.000 5.000 19.000 1.00 0.00 O +ATOM 831 O WAT 831 17.000 7.000 1.000 1.00 0.00 O +ATOM 832 O WAT 832 17.000 7.000 3.000 1.00 0.00 O +ATOM 833 O WAT 833 17.000 7.000 5.000 1.00 0.00 O +ATOM 834 O WAT 834 17.000 7.000 7.000 1.00 0.00 O +ATOM 835 O WAT 835 17.000 7.000 9.000 1.00 0.00 O +ATOM 836 O WAT 836 17.000 7.000 11.000 1.00 0.00 O +ATOM 837 O WAT 837 17.000 7.000 13.000 1.00 0.00 O +ATOM 838 O WAT 838 17.000 7.000 15.000 1.00 0.00 O +ATOM 839 O WAT 839 17.000 7.000 17.000 1.00 0.00 O +ATOM 840 O WAT 840 17.000 7.000 19.000 1.00 0.00 O +ATOM 841 O WAT 841 17.000 9.000 1.000 1.00 0.00 O +ATOM 842 O WAT 842 17.000 9.000 3.000 1.00 0.00 O +ATOM 843 O WAT 843 17.000 9.000 5.000 1.00 0.00 O +ATOM 844 O WAT 844 17.000 9.000 7.000 1.00 0.00 O +ATOM 845 O WAT 845 17.000 9.000 9.000 1.00 0.00 O +ATOM 846 O WAT 846 17.000 9.000 11.000 1.00 0.00 O +ATOM 847 O WAT 847 17.000 9.000 13.000 1.00 0.00 O +ATOM 848 O WAT 848 17.000 9.000 15.000 1.00 0.00 O +ATOM 849 O WAT 849 17.000 9.000 17.000 1.00 0.00 O +ATOM 850 O WAT 850 17.000 9.000 19.000 1.00 0.00 O +ATOM 851 O WAT 851 17.000 11.000 1.000 1.00 0.00 O +ATOM 852 O WAT 852 17.000 11.000 3.000 1.00 0.00 O +ATOM 853 O WAT 853 17.000 11.000 5.000 1.00 0.00 O +ATOM 854 O WAT 854 17.000 11.000 7.000 1.00 0.00 O +ATOM 855 O WAT 855 17.000 11.000 9.000 1.00 0.00 O +ATOM 856 O WAT 856 17.000 11.000 11.000 1.00 0.00 O +ATOM 857 O WAT 857 17.000 11.000 13.000 1.00 0.00 O +ATOM 858 O WAT 858 17.000 11.000 15.000 1.00 0.00 O +ATOM 859 O WAT 859 17.000 11.000 17.000 1.00 0.00 O +ATOM 860 O WAT 860 17.000 11.000 19.000 1.00 0.00 O +ATOM 861 O WAT 861 17.000 13.000 1.000 1.00 0.00 O +ATOM 862 O WAT 862 17.000 13.000 3.000 1.00 0.00 O +ATOM 863 O WAT 863 17.000 13.000 5.000 1.00 0.00 O +ATOM 864 O WAT 864 17.000 13.000 7.000 1.00 0.00 O +ATOM 865 O WAT 865 17.000 13.000 9.000 1.00 0.00 O +ATOM 866 O WAT 866 17.000 13.000 11.000 1.00 0.00 O +ATOM 867 O WAT 867 17.000 13.000 13.000 1.00 0.00 O +ATOM 868 O WAT 868 17.000 13.000 15.000 1.00 0.00 O +ATOM 869 O WAT 869 17.000 13.000 17.000 1.00 0.00 O +ATOM 870 O WAT 870 17.000 13.000 19.000 1.00 0.00 O +ATOM 871 O WAT 871 17.000 15.000 1.000 1.00 0.00 O +ATOM 872 O WAT 872 17.000 15.000 3.000 1.00 0.00 O +ATOM 873 O WAT 873 17.000 15.000 5.000 1.00 0.00 O +ATOM 874 O WAT 874 17.000 15.000 7.000 1.00 0.00 O +ATOM 875 O WAT 875 17.000 15.000 9.000 1.00 0.00 O +ATOM 876 O WAT 876 17.000 15.000 11.000 1.00 0.00 O +ATOM 877 O WAT 877 17.000 15.000 13.000 1.00 0.00 O +ATOM 878 O WAT 878 17.000 15.000 15.000 1.00 0.00 O +ATOM 879 O WAT 879 17.000 15.000 17.000 1.00 0.00 O +ATOM 880 O WAT 880 17.000 15.000 19.000 1.00 0.00 O +ATOM 881 O WAT 881 17.000 17.000 1.000 1.00 0.00 O +ATOM 882 O WAT 882 17.000 17.000 3.000 1.00 0.00 O +ATOM 883 O WAT 883 17.000 17.000 5.000 1.00 0.00 O +ATOM 884 O WAT 884 17.000 17.000 7.000 1.00 0.00 O +ATOM 885 O WAT 885 17.000 17.000 9.000 1.00 0.00 O +ATOM 886 O WAT 886 17.000 17.000 11.000 1.00 0.00 O +ATOM 887 O WAT 887 17.000 17.000 13.000 1.00 0.00 O +ATOM 888 O WAT 888 17.000 17.000 15.000 1.00 0.00 O +ATOM 889 O WAT 889 17.000 17.000 17.000 1.00 0.00 O +ATOM 890 O WAT 890 17.000 17.000 19.000 1.00 0.00 O +ATOM 891 O WAT 891 17.000 19.000 1.000 1.00 0.00 O +ATOM 892 O WAT 892 17.000 19.000 3.000 1.00 0.00 O +ATOM 893 O WAT 893 17.000 19.000 5.000 1.00 0.00 O +ATOM 894 O WAT 894 17.000 19.000 7.000 1.00 0.00 O +ATOM 895 O WAT 895 17.000 19.000 9.000 1.00 0.00 O +ATOM 896 O WAT 896 17.000 19.000 11.000 1.00 0.00 O +ATOM 897 O WAT 897 17.000 19.000 13.000 1.00 0.00 O +ATOM 898 O WAT 898 17.000 19.000 15.000 1.00 0.00 O +ATOM 899 O WAT 899 17.000 19.000 17.000 1.00 0.00 O +ATOM 900 O WAT 900 17.000 19.000 19.000 1.00 0.00 O +ATOM 901 O WAT 901 19.000 1.000 1.000 1.00 0.00 O +ATOM 902 O WAT 902 19.000 1.000 3.000 1.00 0.00 O +ATOM 903 O WAT 903 19.000 1.000 5.000 1.00 0.00 O +ATOM 904 O WAT 904 19.000 1.000 7.000 1.00 0.00 O +ATOM 905 O WAT 905 19.000 1.000 9.000 1.00 0.00 O +ATOM 906 O WAT 906 19.000 1.000 11.000 1.00 0.00 O +ATOM 907 O WAT 907 19.000 1.000 13.000 1.00 0.00 O +ATOM 908 O WAT 908 19.000 1.000 15.000 1.00 0.00 O +ATOM 909 O WAT 909 19.000 1.000 17.000 1.00 0.00 O +ATOM 910 O WAT 910 19.000 1.000 19.000 1.00 0.00 O +ATOM 911 O WAT 911 19.000 3.000 1.000 1.00 0.00 O +ATOM 912 O WAT 912 19.000 3.000 3.000 1.00 0.00 O +ATOM 913 O WAT 913 19.000 3.000 5.000 1.00 0.00 O +ATOM 914 O WAT 914 19.000 3.000 7.000 1.00 0.00 O +ATOM 915 O WAT 915 19.000 3.000 9.000 1.00 0.00 O +ATOM 916 O WAT 916 19.000 3.000 11.000 1.00 0.00 O +ATOM 917 O WAT 917 19.000 3.000 13.000 1.00 0.00 O +ATOM 918 O WAT 918 19.000 3.000 15.000 1.00 0.00 O +ATOM 919 O WAT 919 19.000 3.000 17.000 1.00 0.00 O +ATOM 920 O WAT 920 19.000 3.000 19.000 1.00 0.00 O +ATOM 921 O WAT 921 19.000 5.000 1.000 1.00 0.00 O +ATOM 922 O WAT 922 19.000 5.000 3.000 1.00 0.00 O +ATOM 923 O WAT 923 19.000 5.000 5.000 1.00 0.00 O +ATOM 924 O WAT 924 19.000 5.000 7.000 1.00 0.00 O +ATOM 925 O WAT 925 19.000 5.000 9.000 1.00 0.00 O +ATOM 926 O WAT 926 19.000 5.000 11.000 1.00 0.00 O +ATOM 927 O WAT 927 19.000 5.000 13.000 1.00 0.00 O +ATOM 928 O WAT 928 19.000 5.000 15.000 1.00 0.00 O +ATOM 929 O WAT 929 19.000 5.000 17.000 1.00 0.00 O +ATOM 930 O WAT 930 19.000 5.000 19.000 1.00 0.00 O +ATOM 931 O WAT 931 19.000 7.000 1.000 1.00 0.00 O +ATOM 932 O WAT 932 19.000 7.000 3.000 1.00 0.00 O +ATOM 933 O WAT 933 19.000 7.000 5.000 1.00 0.00 O +ATOM 934 O WAT 934 19.000 7.000 7.000 1.00 0.00 O +ATOM 935 O WAT 935 19.000 7.000 9.000 1.00 0.00 O +ATOM 936 O WAT 936 19.000 7.000 11.000 1.00 0.00 O +ATOM 937 O WAT 937 19.000 7.000 13.000 1.00 0.00 O +ATOM 938 O WAT 938 19.000 7.000 15.000 1.00 0.00 O +ATOM 939 O WAT 939 19.000 7.000 17.000 1.00 0.00 O +ATOM 940 O WAT 940 19.000 7.000 19.000 1.00 0.00 O +ATOM 941 O WAT 941 19.000 9.000 1.000 1.00 0.00 O +ATOM 942 O WAT 942 19.000 9.000 3.000 1.00 0.00 O +ATOM 943 O WAT 943 19.000 9.000 5.000 1.00 0.00 O +ATOM 944 O WAT 944 19.000 9.000 7.000 1.00 0.00 O +ATOM 945 O WAT 945 19.000 9.000 9.000 1.00 0.00 O +ATOM 946 O WAT 946 19.000 9.000 11.000 1.00 0.00 O +ATOM 947 O WAT 947 19.000 9.000 13.000 1.00 0.00 O +ATOM 948 O WAT 948 19.000 9.000 15.000 1.00 0.00 O +ATOM 949 O WAT 949 19.000 9.000 17.000 1.00 0.00 O +ATOM 950 O WAT 950 19.000 9.000 19.000 1.00 0.00 O +ATOM 951 O WAT 951 19.000 11.000 1.000 1.00 0.00 O +ATOM 952 O WAT 952 19.000 11.000 3.000 1.00 0.00 O +ATOM 953 O WAT 953 19.000 11.000 5.000 1.00 0.00 O +ATOM 954 O WAT 954 19.000 11.000 7.000 1.00 0.00 O +ATOM 955 O WAT 955 19.000 11.000 9.000 1.00 0.00 O +ATOM 956 O WAT 956 19.000 11.000 11.000 1.00 0.00 O +ATOM 957 O WAT 957 19.000 11.000 13.000 1.00 0.00 O +ATOM 958 O WAT 958 19.000 11.000 15.000 1.00 0.00 O +ATOM 959 O WAT 959 19.000 11.000 17.000 1.00 0.00 O +ATOM 960 O WAT 960 19.000 11.000 19.000 1.00 0.00 O +ATOM 961 O WAT 961 19.000 13.000 1.000 1.00 0.00 O +ATOM 962 O WAT 962 19.000 13.000 3.000 1.00 0.00 O +ATOM 963 O WAT 963 19.000 13.000 5.000 1.00 0.00 O +ATOM 964 O WAT 964 19.000 13.000 7.000 1.00 0.00 O +ATOM 965 O WAT 965 19.000 13.000 9.000 1.00 0.00 O +ATOM 966 O WAT 966 19.000 13.000 11.000 1.00 0.00 O +ATOM 967 O WAT 967 19.000 13.000 13.000 1.00 0.00 O +ATOM 968 O WAT 968 19.000 13.000 15.000 1.00 0.00 O +ATOM 969 O WAT 969 19.000 13.000 17.000 1.00 0.00 O +ATOM 970 O WAT 970 19.000 13.000 19.000 1.00 0.00 O +ATOM 971 O WAT 971 19.000 15.000 1.000 1.00 0.00 O +ATOM 972 O WAT 972 19.000 15.000 3.000 1.00 0.00 O +ATOM 973 O WAT 973 19.000 15.000 5.000 1.00 0.00 O +ATOM 974 O WAT 974 19.000 15.000 7.000 1.00 0.00 O +ATOM 975 O WAT 975 19.000 15.000 9.000 1.00 0.00 O +ATOM 976 O WAT 976 19.000 15.000 11.000 1.00 0.00 O +ATOM 977 O WAT 977 19.000 15.000 13.000 1.00 0.00 O +ATOM 978 O WAT 978 19.000 15.000 15.000 1.00 0.00 O +ATOM 979 O WAT 979 19.000 15.000 17.000 1.00 0.00 O +ATOM 980 O WAT 980 19.000 15.000 19.000 1.00 0.00 O +ATOM 981 O WAT 981 19.000 17.000 1.000 1.00 0.00 O +ATOM 982 O WAT 982 19.000 17.000 3.000 1.00 0.00 O +ATOM 983 O WAT 983 19.000 17.000 5.000 1.00 0.00 O +ATOM 984 O WAT 984 19.000 17.000 7.000 1.00 0.00 O +ATOM 985 O WAT 985 19.000 17.000 9.000 1.00 0.00 O +ATOM 986 O WAT 986 19.000 17.000 11.000 1.00 0.00 O +ATOM 987 O WAT 987 19.000 17.000 13.000 1.00 0.00 O +ATOM 988 O WAT 988 19.000 17.000 15.000 1.00 0.00 O +ATOM 989 O WAT 989 19.000 17.000 17.000 1.00 0.00 O +ATOM 990 O WAT 990 19.000 17.000 19.000 1.00 0.00 O +ATOM 991 O WAT 991 19.000 19.000 1.000 1.00 0.00 O +ATOM 992 O WAT 992 19.000 19.000 3.000 1.00 0.00 O +ATOM 993 O WAT 993 19.000 19.000 5.000 1.00 0.00 O +ATOM 994 O WAT 994 19.000 19.000 7.000 1.00 0.00 O +ATOM 995 O WAT 995 19.000 19.000 9.000 1.00 0.00 O +ATOM 996 O WAT 996 19.000 19.000 11.000 1.00 0.00 O +ATOM 997 O WAT 997 19.000 19.000 13.000 1.00 0.00 O +ATOM 998 O WAT 998 19.000 19.000 15.000 1.00 0.00 O +ATOM 999 O WAT 999 19.000 19.000 17.000 1.00 0.00 O +ATOM 1000 O WAT 1000 19.000 19.000 19.000 1.00 0.00 O END diff --git a/test/Test_SurfTension/st.itim.dat.save b/test/Test_SurfTension/st.itim.dat.save index 714ef7fa60..f0659b28f3 100644 --- a/test/Test_SurfTension/st.itim.dat.save +++ b/test/Test_SurfTension/st.itim.dat.save @@ -10,11 +10,8 @@ area 400 q_fundamental 0.314159 qmin 0.314159 qmax 0.8 -frames 2 +frames 1 skipped 0 -gamma 5336.11 -gamma_upper 5336.11 -gamma_lower 5336.11 -roughness 0.125838 -roughness_upper 0.125838 -roughness_lower 0.125838 +roughness 0 +roughness_upper 0 +roughness_lower 0 diff --git a/test/Test_SurfTension/st.normalx.dat.save b/test/Test_SurfTension/st.normalx.dat.save index 631afd9fa1..fa365576d4 100644 --- a/test/Test_SurfTension/st.normalx.dat.save +++ b/test/Test_SurfTension/st.normalx.dat.save @@ -10,12 +10,11 @@ area 400 q_fundamental 0.314159 qmin 0.314159 qmax 0.8 -frames 2 +frames 1 skipped 0 -gamma 1051.08 -gamma_upper 1051.08 -gamma_lower 1051.08 -kappa -1.53118e+32 -roughness 0.205627 -roughness_upper 0.205627 -roughness_lower 0.205627 +gamma 849.84 +gamma_upper 849.84 +gamma_lower 849.84 +roughness 0.222848 +roughness_upper 0.222848 +roughness_lower 0.222848 diff --git a/test/Test_SurfTension/st.normaly.dat.save b/test/Test_SurfTension/st.normaly.dat.save index c68d1a3daa..bd7ab194f1 100644 --- a/test/Test_SurfTension/st.normaly.dat.save +++ b/test/Test_SurfTension/st.normaly.dat.save @@ -10,11 +10,11 @@ area 400 q_fundamental 0.314159 qmin 0.314159 qmax 0.8 -frames 2 +frames 1 skipped 0 -gamma 1051.08 -gamma_upper 1051.08 -gamma_lower 1051.08 -roughness 0.205627 -roughness_upper 0.205627 -roughness_lower 0.205627 +gamma 849.84 +gamma_upper 849.84 +gamma_lower 849.84 +roughness 0.222848 +roughness_upper 0.222848 +roughness_lower 0.222848 diff --git a/test/Test_SurfTension/st.nsurf1.dat.save b/test/Test_SurfTension/st.nsurf1.dat.save index a0b36eca88..7b7042973b 100644 --- a/test/Test_SurfTension/st.nsurf1.dat.save +++ b/test/Test_SurfTension/st.nsurf1.dat.save @@ -10,9 +10,9 @@ area 400 q_fundamental 0.314159 qmin 0.314159 qmax 0.8 -frames 2 +frames 1 skipped 0 -gamma 512.372 -gamma_upper 512.372 -roughness 0.338125 -roughness_upper 0.338125 +gamma 849.84 +gamma_upper 849.84 +roughness 0.222848 +roughness_upper 0.222848 diff --git a/test/Test_SurfTension/st.willard.dat.save b/test/Test_SurfTension/st.willard.dat.save index dfb5b4d710..f257deb3b5 100644 --- a/test/Test_SurfTension/st.willard.dat.save +++ b/test/Test_SurfTension/st.willard.dat.save @@ -10,11 +10,11 @@ area 400 q_fundamental 0.314159 qmin 0.314159 qmax 0.8 -frames 2 +frames 1 skipped 0 -gamma 512.372 -gamma_upper 512.372 -gamma_lower 512.372 -roughness 0.338125 -roughness_upper 0.338125 -roughness_lower 0.338125 +gamma 849.84 +gamma_upper 849.84 +gamma_lower 849.84 +roughness 0.222848 +roughness_upper 0.222848 +roughness_lower 0.222848 diff --git a/test/Test_SurfTension/st2_summary.dat.save b/test/Test_SurfTension/st2_summary.dat.save index 51dcde3967..b3cad2b69f 100644 --- a/test/Test_SurfTension/st2_summary.dat.save +++ b/test/Test_SurfTension/st2_summary.dat.save @@ -11,11 +11,11 @@ area 400 q_fundamental 0.314159 qmin 0.314159 qmax 0.8 -frames 2 +frames 1 skipped 0 -gamma 512.372 -gamma_upper 512.372 -gamma_lower 512.372 -roughness 0.338125 -roughness_upper 0.338125 -roughness_lower 0.338125 +gamma 849.84 +gamma_upper 849.84 +gamma_lower 849.84 +roughness 0.222848 +roughness_upper 0.222848 +roughness_lower 0.222848 From ff994f10917d40dbc43fd239cd5392eae1533b3c Mon Sep 17 00:00:00 2001 From: ndlevinzon Date: Wed, 2 Sep 2026 11:13:28 -0600 Subject: [PATCH 14/33] Update surftension test files and parameters for improved accuracy - Enhanced RunTest.sh documentation to clarify the characteristics of slab.pdb. - Updated surface tension data files with new gamma and roughness values for better simulation fidelity. - Adjusted parameters in st.itim.dat.save, st.normalx.dat.save, st.normaly.dat.save, st.nsurf1.dat.save, st.willard.dat.save, and st2_summary.dat.save to reflect recent findings and improve test results. --- test/Test_SurfTension/RunTest.sh | 5 +- test/Test_SurfTension/slab.pdb | 2002 ++++++++++---------- test/Test_SurfTension/st.itim.dat.save | 9 +- test/Test_SurfTension/st.normalx.dat.save | 13 +- test/Test_SurfTension/st.normaly.dat.save | 12 +- test/Test_SurfTension/st.nsurf1.dat.save | 8 +- test/Test_SurfTension/st.willard.dat.save | 12 +- test/Test_SurfTension/st2_summary.dat.save | 12 +- 8 files changed, 1039 insertions(+), 1034 deletions(-) diff --git a/test/Test_SurfTension/RunTest.sh b/test/Test_SurfTension/RunTest.sh index c8dd71549e..5ba5c78b0e 100755 --- a/test/Test_SurfTension/RunTest.sh +++ b/test/Test_SurfTension/RunTest.sh @@ -1,7 +1,8 @@ #!/bin/bash # surftension tests. -# slab.pdb is a 20 A cubic lattice of O atoms. Stretching one box length -# creates vacuum on both sides of a slab so Willard/ITIM can find interfaces. +# slab.pdb is a 20 A cubic lattice of O atoms with a small z-corrugation +# so ITIM min/max is not flat. Stretching one box length creates vacuum +# on both sides of a slab so Willard/ITIM can find interfaces. . ../MasterTest.sh diff --git a/test/Test_SurfTension/slab.pdb b/test/Test_SurfTension/slab.pdb index 569238ab15..51c5fc1dd3 100644 --- a/test/Test_SurfTension/slab.pdb +++ b/test/Test_SurfTension/slab.pdb @@ -1,1003 +1,1003 @@ CRYST1 20.000 20.000 20.000 90.00 90.00 90.00 P 1 1 -REMARK synthetic cubic lattice for surftension tests -ATOM 1 O WAT 1 1.000 1.000 1.000 1.00 0.00 O -ATOM 2 O WAT 2 1.000 1.000 3.000 1.00 0.00 O -ATOM 3 O WAT 3 1.000 1.000 5.000 1.00 0.00 O -ATOM 4 O WAT 4 1.000 1.000 7.000 1.00 0.00 O -ATOM 5 O WAT 5 1.000 1.000 9.000 1.00 0.00 O -ATOM 6 O WAT 6 1.000 1.000 11.000 1.00 0.00 O -ATOM 7 O WAT 7 1.000 1.000 13.000 1.00 0.00 O -ATOM 8 O WAT 8 1.000 1.000 15.000 1.00 0.00 O -ATOM 9 O WAT 9 1.000 1.000 17.000 1.00 0.00 O -ATOM 10 O WAT 10 1.000 1.000 19.000 1.00 0.00 O -ATOM 11 O WAT 11 1.000 3.000 1.000 1.00 0.00 O -ATOM 12 O WAT 12 1.000 3.000 3.000 1.00 0.00 O -ATOM 13 O WAT 13 1.000 3.000 5.000 1.00 0.00 O -ATOM 14 O WAT 14 1.000 3.000 7.000 1.00 0.00 O -ATOM 15 O WAT 15 1.000 3.000 9.000 1.00 0.00 O -ATOM 16 O WAT 16 1.000 3.000 11.000 1.00 0.00 O -ATOM 17 O WAT 17 1.000 3.000 13.000 1.00 0.00 O -ATOM 18 O WAT 18 1.000 3.000 15.000 1.00 0.00 O -ATOM 19 O WAT 19 1.000 3.000 17.000 1.00 0.00 O -ATOM 20 O WAT 20 1.000 3.000 19.000 1.00 0.00 O -ATOM 21 O WAT 21 1.000 5.000 1.000 1.00 0.00 O -ATOM 22 O WAT 22 1.000 5.000 3.000 1.00 0.00 O -ATOM 23 O WAT 23 1.000 5.000 5.000 1.00 0.00 O -ATOM 24 O WAT 24 1.000 5.000 7.000 1.00 0.00 O -ATOM 25 O WAT 25 1.000 5.000 9.000 1.00 0.00 O -ATOM 26 O WAT 26 1.000 5.000 11.000 1.00 0.00 O -ATOM 27 O WAT 27 1.000 5.000 13.000 1.00 0.00 O -ATOM 28 O WAT 28 1.000 5.000 15.000 1.00 0.00 O -ATOM 29 O WAT 29 1.000 5.000 17.000 1.00 0.00 O -ATOM 30 O WAT 30 1.000 5.000 19.000 1.00 0.00 O -ATOM 31 O WAT 31 1.000 7.000 1.000 1.00 0.00 O -ATOM 32 O WAT 32 1.000 7.000 3.000 1.00 0.00 O -ATOM 33 O WAT 33 1.000 7.000 5.000 1.00 0.00 O -ATOM 34 O WAT 34 1.000 7.000 7.000 1.00 0.00 O -ATOM 35 O WAT 35 1.000 7.000 9.000 1.00 0.00 O -ATOM 36 O WAT 36 1.000 7.000 11.000 1.00 0.00 O -ATOM 37 O WAT 37 1.000 7.000 13.000 1.00 0.00 O -ATOM 38 O WAT 38 1.000 7.000 15.000 1.00 0.00 O -ATOM 39 O WAT 39 1.000 7.000 17.000 1.00 0.00 O -ATOM 40 O WAT 40 1.000 7.000 19.000 1.00 0.00 O -ATOM 41 O WAT 41 1.000 9.000 1.000 1.00 0.00 O -ATOM 42 O WAT 42 1.000 9.000 3.000 1.00 0.00 O -ATOM 43 O WAT 43 1.000 9.000 5.000 1.00 0.00 O -ATOM 44 O WAT 44 1.000 9.000 7.000 1.00 0.00 O -ATOM 45 O WAT 45 1.000 9.000 9.000 1.00 0.00 O -ATOM 46 O WAT 46 1.000 9.000 11.000 1.00 0.00 O -ATOM 47 O WAT 47 1.000 9.000 13.000 1.00 0.00 O -ATOM 48 O WAT 48 1.000 9.000 15.000 1.00 0.00 O -ATOM 49 O WAT 49 1.000 9.000 17.000 1.00 0.00 O -ATOM 50 O WAT 50 1.000 9.000 19.000 1.00 0.00 O -ATOM 51 O WAT 51 1.000 11.000 1.000 1.00 0.00 O -ATOM 52 O WAT 52 1.000 11.000 3.000 1.00 0.00 O -ATOM 53 O WAT 53 1.000 11.000 5.000 1.00 0.00 O -ATOM 54 O WAT 54 1.000 11.000 7.000 1.00 0.00 O -ATOM 55 O WAT 55 1.000 11.000 9.000 1.00 0.00 O -ATOM 56 O WAT 56 1.000 11.000 11.000 1.00 0.00 O -ATOM 57 O WAT 57 1.000 11.000 13.000 1.00 0.00 O -ATOM 58 O WAT 58 1.000 11.000 15.000 1.00 0.00 O -ATOM 59 O WAT 59 1.000 11.000 17.000 1.00 0.00 O -ATOM 60 O WAT 60 1.000 11.000 19.000 1.00 0.00 O -ATOM 61 O WAT 61 1.000 13.000 1.000 1.00 0.00 O -ATOM 62 O WAT 62 1.000 13.000 3.000 1.00 0.00 O -ATOM 63 O WAT 63 1.000 13.000 5.000 1.00 0.00 O -ATOM 64 O WAT 64 1.000 13.000 7.000 1.00 0.00 O -ATOM 65 O WAT 65 1.000 13.000 9.000 1.00 0.00 O -ATOM 66 O WAT 66 1.000 13.000 11.000 1.00 0.00 O -ATOM 67 O WAT 67 1.000 13.000 13.000 1.00 0.00 O -ATOM 68 O WAT 68 1.000 13.000 15.000 1.00 0.00 O -ATOM 69 O WAT 69 1.000 13.000 17.000 1.00 0.00 O -ATOM 70 O WAT 70 1.000 13.000 19.000 1.00 0.00 O -ATOM 71 O WAT 71 1.000 15.000 1.000 1.00 0.00 O -ATOM 72 O WAT 72 1.000 15.000 3.000 1.00 0.00 O -ATOM 73 O WAT 73 1.000 15.000 5.000 1.00 0.00 O -ATOM 74 O WAT 74 1.000 15.000 7.000 1.00 0.00 O -ATOM 75 O WAT 75 1.000 15.000 9.000 1.00 0.00 O -ATOM 76 O WAT 76 1.000 15.000 11.000 1.00 0.00 O -ATOM 77 O WAT 77 1.000 15.000 13.000 1.00 0.00 O -ATOM 78 O WAT 78 1.000 15.000 15.000 1.00 0.00 O -ATOM 79 O WAT 79 1.000 15.000 17.000 1.00 0.00 O -ATOM 80 O WAT 80 1.000 15.000 19.000 1.00 0.00 O -ATOM 81 O WAT 81 1.000 17.000 1.000 1.00 0.00 O -ATOM 82 O WAT 82 1.000 17.000 3.000 1.00 0.00 O -ATOM 83 O WAT 83 1.000 17.000 5.000 1.00 0.00 O -ATOM 84 O WAT 84 1.000 17.000 7.000 1.00 0.00 O -ATOM 85 O WAT 85 1.000 17.000 9.000 1.00 0.00 O -ATOM 86 O WAT 86 1.000 17.000 11.000 1.00 0.00 O -ATOM 87 O WAT 87 1.000 17.000 13.000 1.00 0.00 O -ATOM 88 O WAT 88 1.000 17.000 15.000 1.00 0.00 O -ATOM 89 O WAT 89 1.000 17.000 17.000 1.00 0.00 O -ATOM 90 O WAT 90 1.000 17.000 19.000 1.00 0.00 O -ATOM 91 O WAT 91 1.000 19.000 1.000 1.00 0.00 O -ATOM 92 O WAT 92 1.000 19.000 3.000 1.00 0.00 O -ATOM 93 O WAT 93 1.000 19.000 5.000 1.00 0.00 O -ATOM 94 O WAT 94 1.000 19.000 7.000 1.00 0.00 O -ATOM 95 O WAT 95 1.000 19.000 9.000 1.00 0.00 O -ATOM 96 O WAT 96 1.000 19.000 11.000 1.00 0.00 O -ATOM 97 O WAT 97 1.000 19.000 13.000 1.00 0.00 O -ATOM 98 O WAT 98 1.000 19.000 15.000 1.00 0.00 O -ATOM 99 O WAT 99 1.000 19.000 17.000 1.00 0.00 O -ATOM 100 O WAT 100 1.000 19.000 19.000 1.00 0.00 O -ATOM 101 O WAT 101 3.000 1.000 1.000 1.00 0.00 O -ATOM 102 O WAT 102 3.000 1.000 3.000 1.00 0.00 O -ATOM 103 O WAT 103 3.000 1.000 5.000 1.00 0.00 O -ATOM 104 O WAT 104 3.000 1.000 7.000 1.00 0.00 O -ATOM 105 O WAT 105 3.000 1.000 9.000 1.00 0.00 O -ATOM 106 O WAT 106 3.000 1.000 11.000 1.00 0.00 O -ATOM 107 O WAT 107 3.000 1.000 13.000 1.00 0.00 O -ATOM 108 O WAT 108 3.000 1.000 15.000 1.00 0.00 O -ATOM 109 O WAT 109 3.000 1.000 17.000 1.00 0.00 O -ATOM 110 O WAT 110 3.000 1.000 19.000 1.00 0.00 O -ATOM 111 O WAT 111 3.000 3.000 1.000 1.00 0.00 O -ATOM 112 O WAT 112 3.000 3.000 3.000 1.00 0.00 O -ATOM 113 O WAT 113 3.000 3.000 5.000 1.00 0.00 O -ATOM 114 O WAT 114 3.000 3.000 7.000 1.00 0.00 O -ATOM 115 O WAT 115 3.000 3.000 9.000 1.00 0.00 O -ATOM 116 O WAT 116 3.000 3.000 11.000 1.00 0.00 O -ATOM 117 O WAT 117 3.000 3.000 13.000 1.00 0.00 O -ATOM 118 O WAT 118 3.000 3.000 15.000 1.00 0.00 O -ATOM 119 O WAT 119 3.000 3.000 17.000 1.00 0.00 O -ATOM 120 O WAT 120 3.000 3.000 19.000 1.00 0.00 O -ATOM 121 O WAT 121 3.000 5.000 1.000 1.00 0.00 O -ATOM 122 O WAT 122 3.000 5.000 3.000 1.00 0.00 O -ATOM 123 O WAT 123 3.000 5.000 5.000 1.00 0.00 O -ATOM 124 O WAT 124 3.000 5.000 7.000 1.00 0.00 O -ATOM 125 O WAT 125 3.000 5.000 9.000 1.00 0.00 O -ATOM 126 O WAT 126 3.000 5.000 11.000 1.00 0.00 O -ATOM 127 O WAT 127 3.000 5.000 13.000 1.00 0.00 O -ATOM 128 O WAT 128 3.000 5.000 15.000 1.00 0.00 O -ATOM 129 O WAT 129 3.000 5.000 17.000 1.00 0.00 O -ATOM 130 O WAT 130 3.000 5.000 19.000 1.00 0.00 O -ATOM 131 O WAT 131 3.000 7.000 1.000 1.00 0.00 O -ATOM 132 O WAT 132 3.000 7.000 3.000 1.00 0.00 O -ATOM 133 O WAT 133 3.000 7.000 5.000 1.00 0.00 O -ATOM 134 O WAT 134 3.000 7.000 7.000 1.00 0.00 O -ATOM 135 O WAT 135 3.000 7.000 9.000 1.00 0.00 O -ATOM 136 O WAT 136 3.000 7.000 11.000 1.00 0.00 O -ATOM 137 O WAT 137 3.000 7.000 13.000 1.00 0.00 O -ATOM 138 O WAT 138 3.000 7.000 15.000 1.00 0.00 O -ATOM 139 O WAT 139 3.000 7.000 17.000 1.00 0.00 O -ATOM 140 O WAT 140 3.000 7.000 19.000 1.00 0.00 O -ATOM 141 O WAT 141 3.000 9.000 1.000 1.00 0.00 O -ATOM 142 O WAT 142 3.000 9.000 3.000 1.00 0.00 O -ATOM 143 O WAT 143 3.000 9.000 5.000 1.00 0.00 O -ATOM 144 O WAT 144 3.000 9.000 7.000 1.00 0.00 O -ATOM 145 O WAT 145 3.000 9.000 9.000 1.00 0.00 O -ATOM 146 O WAT 146 3.000 9.000 11.000 1.00 0.00 O -ATOM 147 O WAT 147 3.000 9.000 13.000 1.00 0.00 O -ATOM 148 O WAT 148 3.000 9.000 15.000 1.00 0.00 O -ATOM 149 O WAT 149 3.000 9.000 17.000 1.00 0.00 O -ATOM 150 O WAT 150 3.000 9.000 19.000 1.00 0.00 O -ATOM 151 O WAT 151 3.000 11.000 1.000 1.00 0.00 O -ATOM 152 O WAT 152 3.000 11.000 3.000 1.00 0.00 O -ATOM 153 O WAT 153 3.000 11.000 5.000 1.00 0.00 O -ATOM 154 O WAT 154 3.000 11.000 7.000 1.00 0.00 O -ATOM 155 O WAT 155 3.000 11.000 9.000 1.00 0.00 O -ATOM 156 O WAT 156 3.000 11.000 11.000 1.00 0.00 O -ATOM 157 O WAT 157 3.000 11.000 13.000 1.00 0.00 O -ATOM 158 O WAT 158 3.000 11.000 15.000 1.00 0.00 O -ATOM 159 O WAT 159 3.000 11.000 17.000 1.00 0.00 O -ATOM 160 O WAT 160 3.000 11.000 19.000 1.00 0.00 O -ATOM 161 O WAT 161 3.000 13.000 1.000 1.00 0.00 O -ATOM 162 O WAT 162 3.000 13.000 3.000 1.00 0.00 O -ATOM 163 O WAT 163 3.000 13.000 5.000 1.00 0.00 O -ATOM 164 O WAT 164 3.000 13.000 7.000 1.00 0.00 O -ATOM 165 O WAT 165 3.000 13.000 9.000 1.00 0.00 O -ATOM 166 O WAT 166 3.000 13.000 11.000 1.00 0.00 O -ATOM 167 O WAT 167 3.000 13.000 13.000 1.00 0.00 O -ATOM 168 O WAT 168 3.000 13.000 15.000 1.00 0.00 O -ATOM 169 O WAT 169 3.000 13.000 17.000 1.00 0.00 O -ATOM 170 O WAT 170 3.000 13.000 19.000 1.00 0.00 O -ATOM 171 O WAT 171 3.000 15.000 1.000 1.00 0.00 O -ATOM 172 O WAT 172 3.000 15.000 3.000 1.00 0.00 O -ATOM 173 O WAT 173 3.000 15.000 5.000 1.00 0.00 O -ATOM 174 O WAT 174 3.000 15.000 7.000 1.00 0.00 O -ATOM 175 O WAT 175 3.000 15.000 9.000 1.00 0.00 O -ATOM 176 O WAT 176 3.000 15.000 11.000 1.00 0.00 O -ATOM 177 O WAT 177 3.000 15.000 13.000 1.00 0.00 O -ATOM 178 O WAT 178 3.000 15.000 15.000 1.00 0.00 O -ATOM 179 O WAT 179 3.000 15.000 17.000 1.00 0.00 O -ATOM 180 O WAT 180 3.000 15.000 19.000 1.00 0.00 O -ATOM 181 O WAT 181 3.000 17.000 1.000 1.00 0.00 O -ATOM 182 O WAT 182 3.000 17.000 3.000 1.00 0.00 O -ATOM 183 O WAT 183 3.000 17.000 5.000 1.00 0.00 O -ATOM 184 O WAT 184 3.000 17.000 7.000 1.00 0.00 O -ATOM 185 O WAT 185 3.000 17.000 9.000 1.00 0.00 O -ATOM 186 O WAT 186 3.000 17.000 11.000 1.00 0.00 O -ATOM 187 O WAT 187 3.000 17.000 13.000 1.00 0.00 O -ATOM 188 O WAT 188 3.000 17.000 15.000 1.00 0.00 O -ATOM 189 O WAT 189 3.000 17.000 17.000 1.00 0.00 O -ATOM 190 O WAT 190 3.000 17.000 19.000 1.00 0.00 O -ATOM 191 O WAT 191 3.000 19.000 1.000 1.00 0.00 O -ATOM 192 O WAT 192 3.000 19.000 3.000 1.00 0.00 O -ATOM 193 O WAT 193 3.000 19.000 5.000 1.00 0.00 O -ATOM 194 O WAT 194 3.000 19.000 7.000 1.00 0.00 O -ATOM 195 O WAT 195 3.000 19.000 9.000 1.00 0.00 O -ATOM 196 O WAT 196 3.000 19.000 11.000 1.00 0.00 O -ATOM 197 O WAT 197 3.000 19.000 13.000 1.00 0.00 O -ATOM 198 O WAT 198 3.000 19.000 15.000 1.00 0.00 O -ATOM 199 O WAT 199 3.000 19.000 17.000 1.00 0.00 O -ATOM 200 O WAT 200 3.000 19.000 19.000 1.00 0.00 O -ATOM 201 O WAT 201 5.000 1.000 1.000 1.00 0.00 O -ATOM 202 O WAT 202 5.000 1.000 3.000 1.00 0.00 O -ATOM 203 O WAT 203 5.000 1.000 5.000 1.00 0.00 O -ATOM 204 O WAT 204 5.000 1.000 7.000 1.00 0.00 O -ATOM 205 O WAT 205 5.000 1.000 9.000 1.00 0.00 O -ATOM 206 O WAT 206 5.000 1.000 11.000 1.00 0.00 O -ATOM 207 O WAT 207 5.000 1.000 13.000 1.00 0.00 O -ATOM 208 O WAT 208 5.000 1.000 15.000 1.00 0.00 O -ATOM 209 O WAT 209 5.000 1.000 17.000 1.00 0.00 O -ATOM 210 O WAT 210 5.000 1.000 19.000 1.00 0.00 O -ATOM 211 O WAT 211 5.000 3.000 1.000 1.00 0.00 O -ATOM 212 O WAT 212 5.000 3.000 3.000 1.00 0.00 O -ATOM 213 O WAT 213 5.000 3.000 5.000 1.00 0.00 O -ATOM 214 O WAT 214 5.000 3.000 7.000 1.00 0.00 O -ATOM 215 O WAT 215 5.000 3.000 9.000 1.00 0.00 O -ATOM 216 O WAT 216 5.000 3.000 11.000 1.00 0.00 O -ATOM 217 O WAT 217 5.000 3.000 13.000 1.00 0.00 O -ATOM 218 O WAT 218 5.000 3.000 15.000 1.00 0.00 O -ATOM 219 O WAT 219 5.000 3.000 17.000 1.00 0.00 O -ATOM 220 O WAT 220 5.000 3.000 19.000 1.00 0.00 O -ATOM 221 O WAT 221 5.000 5.000 1.000 1.00 0.00 O -ATOM 222 O WAT 222 5.000 5.000 3.000 1.00 0.00 O -ATOM 223 O WAT 223 5.000 5.000 5.000 1.00 0.00 O -ATOM 224 O WAT 224 5.000 5.000 7.000 1.00 0.00 O -ATOM 225 O WAT 225 5.000 5.000 9.000 1.00 0.00 O -ATOM 226 O WAT 226 5.000 5.000 11.000 1.00 0.00 O -ATOM 227 O WAT 227 5.000 5.000 13.000 1.00 0.00 O -ATOM 228 O WAT 228 5.000 5.000 15.000 1.00 0.00 O -ATOM 229 O WAT 229 5.000 5.000 17.000 1.00 0.00 O -ATOM 230 O WAT 230 5.000 5.000 19.000 1.00 0.00 O -ATOM 231 O WAT 231 5.000 7.000 1.000 1.00 0.00 O -ATOM 232 O WAT 232 5.000 7.000 3.000 1.00 0.00 O -ATOM 233 O WAT 233 5.000 7.000 5.000 1.00 0.00 O -ATOM 234 O WAT 234 5.000 7.000 7.000 1.00 0.00 O -ATOM 235 O WAT 235 5.000 7.000 9.000 1.00 0.00 O -ATOM 236 O WAT 236 5.000 7.000 11.000 1.00 0.00 O -ATOM 237 O WAT 237 5.000 7.000 13.000 1.00 0.00 O -ATOM 238 O WAT 238 5.000 7.000 15.000 1.00 0.00 O -ATOM 239 O WAT 239 5.000 7.000 17.000 1.00 0.00 O -ATOM 240 O WAT 240 5.000 7.000 19.000 1.00 0.00 O -ATOM 241 O WAT 241 5.000 9.000 1.000 1.00 0.00 O -ATOM 242 O WAT 242 5.000 9.000 3.000 1.00 0.00 O -ATOM 243 O WAT 243 5.000 9.000 5.000 1.00 0.00 O -ATOM 244 O WAT 244 5.000 9.000 7.000 1.00 0.00 O -ATOM 245 O WAT 245 5.000 9.000 9.000 1.00 0.00 O -ATOM 246 O WAT 246 5.000 9.000 11.000 1.00 0.00 O -ATOM 247 O WAT 247 5.000 9.000 13.000 1.00 0.00 O -ATOM 248 O WAT 248 5.000 9.000 15.000 1.00 0.00 O -ATOM 249 O WAT 249 5.000 9.000 17.000 1.00 0.00 O -ATOM 250 O WAT 250 5.000 9.000 19.000 1.00 0.00 O -ATOM 251 O WAT 251 5.000 11.000 1.000 1.00 0.00 O -ATOM 252 O WAT 252 5.000 11.000 3.000 1.00 0.00 O -ATOM 253 O WAT 253 5.000 11.000 5.000 1.00 0.00 O -ATOM 254 O WAT 254 5.000 11.000 7.000 1.00 0.00 O -ATOM 255 O WAT 255 5.000 11.000 9.000 1.00 0.00 O -ATOM 256 O WAT 256 5.000 11.000 11.000 1.00 0.00 O -ATOM 257 O WAT 257 5.000 11.000 13.000 1.00 0.00 O -ATOM 258 O WAT 258 5.000 11.000 15.000 1.00 0.00 O -ATOM 259 O WAT 259 5.000 11.000 17.000 1.00 0.00 O -ATOM 260 O WAT 260 5.000 11.000 19.000 1.00 0.00 O -ATOM 261 O WAT 261 5.000 13.000 1.000 1.00 0.00 O -ATOM 262 O WAT 262 5.000 13.000 3.000 1.00 0.00 O -ATOM 263 O WAT 263 5.000 13.000 5.000 1.00 0.00 O -ATOM 264 O WAT 264 5.000 13.000 7.000 1.00 0.00 O -ATOM 265 O WAT 265 5.000 13.000 9.000 1.00 0.00 O -ATOM 266 O WAT 266 5.000 13.000 11.000 1.00 0.00 O -ATOM 267 O WAT 267 5.000 13.000 13.000 1.00 0.00 O -ATOM 268 O WAT 268 5.000 13.000 15.000 1.00 0.00 O -ATOM 269 O WAT 269 5.000 13.000 17.000 1.00 0.00 O -ATOM 270 O WAT 270 5.000 13.000 19.000 1.00 0.00 O -ATOM 271 O WAT 271 5.000 15.000 1.000 1.00 0.00 O -ATOM 272 O WAT 272 5.000 15.000 3.000 1.00 0.00 O -ATOM 273 O WAT 273 5.000 15.000 5.000 1.00 0.00 O -ATOM 274 O WAT 274 5.000 15.000 7.000 1.00 0.00 O -ATOM 275 O WAT 275 5.000 15.000 9.000 1.00 0.00 O -ATOM 276 O WAT 276 5.000 15.000 11.000 1.00 0.00 O -ATOM 277 O WAT 277 5.000 15.000 13.000 1.00 0.00 O -ATOM 278 O WAT 278 5.000 15.000 15.000 1.00 0.00 O -ATOM 279 O WAT 279 5.000 15.000 17.000 1.00 0.00 O -ATOM 280 O WAT 280 5.000 15.000 19.000 1.00 0.00 O -ATOM 281 O WAT 281 5.000 17.000 1.000 1.00 0.00 O -ATOM 282 O WAT 282 5.000 17.000 3.000 1.00 0.00 O -ATOM 283 O WAT 283 5.000 17.000 5.000 1.00 0.00 O -ATOM 284 O WAT 284 5.000 17.000 7.000 1.00 0.00 O -ATOM 285 O WAT 285 5.000 17.000 9.000 1.00 0.00 O -ATOM 286 O WAT 286 5.000 17.000 11.000 1.00 0.00 O -ATOM 287 O WAT 287 5.000 17.000 13.000 1.00 0.00 O -ATOM 288 O WAT 288 5.000 17.000 15.000 1.00 0.00 O -ATOM 289 O WAT 289 5.000 17.000 17.000 1.00 0.00 O -ATOM 290 O WAT 290 5.000 17.000 19.000 1.00 0.00 O -ATOM 291 O WAT 291 5.000 19.000 1.000 1.00 0.00 O -ATOM 292 O WAT 292 5.000 19.000 3.000 1.00 0.00 O -ATOM 293 O WAT 293 5.000 19.000 5.000 1.00 0.00 O -ATOM 294 O WAT 294 5.000 19.000 7.000 1.00 0.00 O -ATOM 295 O WAT 295 5.000 19.000 9.000 1.00 0.00 O -ATOM 296 O WAT 296 5.000 19.000 11.000 1.00 0.00 O -ATOM 297 O WAT 297 5.000 19.000 13.000 1.00 0.00 O -ATOM 298 O WAT 298 5.000 19.000 15.000 1.00 0.00 O -ATOM 299 O WAT 299 5.000 19.000 17.000 1.00 0.00 O -ATOM 300 O WAT 300 5.000 19.000 19.000 1.00 0.00 O -ATOM 301 O WAT 301 7.000 1.000 1.000 1.00 0.00 O -ATOM 302 O WAT 302 7.000 1.000 3.000 1.00 0.00 O -ATOM 303 O WAT 303 7.000 1.000 5.000 1.00 0.00 O -ATOM 304 O WAT 304 7.000 1.000 7.000 1.00 0.00 O -ATOM 305 O WAT 305 7.000 1.000 9.000 1.00 0.00 O -ATOM 306 O WAT 306 7.000 1.000 11.000 1.00 0.00 O -ATOM 307 O WAT 307 7.000 1.000 13.000 1.00 0.00 O -ATOM 308 O WAT 308 7.000 1.000 15.000 1.00 0.00 O -ATOM 309 O WAT 309 7.000 1.000 17.000 1.00 0.00 O -ATOM 310 O WAT 310 7.000 1.000 19.000 1.00 0.00 O -ATOM 311 O WAT 311 7.000 3.000 1.000 1.00 0.00 O -ATOM 312 O WAT 312 7.000 3.000 3.000 1.00 0.00 O -ATOM 313 O WAT 313 7.000 3.000 5.000 1.00 0.00 O -ATOM 314 O WAT 314 7.000 3.000 7.000 1.00 0.00 O -ATOM 315 O WAT 315 7.000 3.000 9.000 1.00 0.00 O -ATOM 316 O WAT 316 7.000 3.000 11.000 1.00 0.00 O -ATOM 317 O WAT 317 7.000 3.000 13.000 1.00 0.00 O -ATOM 318 O WAT 318 7.000 3.000 15.000 1.00 0.00 O -ATOM 319 O WAT 319 7.000 3.000 17.000 1.00 0.00 O -ATOM 320 O WAT 320 7.000 3.000 19.000 1.00 0.00 O -ATOM 321 O WAT 321 7.000 5.000 1.000 1.00 0.00 O -ATOM 322 O WAT 322 7.000 5.000 3.000 1.00 0.00 O -ATOM 323 O WAT 323 7.000 5.000 5.000 1.00 0.00 O -ATOM 324 O WAT 324 7.000 5.000 7.000 1.00 0.00 O -ATOM 325 O WAT 325 7.000 5.000 9.000 1.00 0.00 O -ATOM 326 O WAT 326 7.000 5.000 11.000 1.00 0.00 O -ATOM 327 O WAT 327 7.000 5.000 13.000 1.00 0.00 O -ATOM 328 O WAT 328 7.000 5.000 15.000 1.00 0.00 O -ATOM 329 O WAT 329 7.000 5.000 17.000 1.00 0.00 O -ATOM 330 O WAT 330 7.000 5.000 19.000 1.00 0.00 O -ATOM 331 O WAT 331 7.000 7.000 1.000 1.00 0.00 O -ATOM 332 O WAT 332 7.000 7.000 3.000 1.00 0.00 O -ATOM 333 O WAT 333 7.000 7.000 5.000 1.00 0.00 O -ATOM 334 O WAT 334 7.000 7.000 7.000 1.00 0.00 O -ATOM 335 O WAT 335 7.000 7.000 9.000 1.00 0.00 O -ATOM 336 O WAT 336 7.000 7.000 11.000 1.00 0.00 O -ATOM 337 O WAT 337 7.000 7.000 13.000 1.00 0.00 O -ATOM 338 O WAT 338 7.000 7.000 15.000 1.00 0.00 O -ATOM 339 O WAT 339 7.000 7.000 17.000 1.00 0.00 O -ATOM 340 O WAT 340 7.000 7.000 19.000 1.00 0.00 O -ATOM 341 O WAT 341 7.000 9.000 1.000 1.00 0.00 O -ATOM 342 O WAT 342 7.000 9.000 3.000 1.00 0.00 O -ATOM 343 O WAT 343 7.000 9.000 5.000 1.00 0.00 O -ATOM 344 O WAT 344 7.000 9.000 7.000 1.00 0.00 O -ATOM 345 O WAT 345 7.000 9.000 9.000 1.00 0.00 O -ATOM 346 O WAT 346 7.000 9.000 11.000 1.00 0.00 O -ATOM 347 O WAT 347 7.000 9.000 13.000 1.00 0.00 O -ATOM 348 O WAT 348 7.000 9.000 15.000 1.00 0.00 O -ATOM 349 O WAT 349 7.000 9.000 17.000 1.00 0.00 O -ATOM 350 O WAT 350 7.000 9.000 19.000 1.00 0.00 O -ATOM 351 O WAT 351 7.000 11.000 1.000 1.00 0.00 O -ATOM 352 O WAT 352 7.000 11.000 3.000 1.00 0.00 O -ATOM 353 O WAT 353 7.000 11.000 5.000 1.00 0.00 O -ATOM 354 O WAT 354 7.000 11.000 7.000 1.00 0.00 O -ATOM 355 O WAT 355 7.000 11.000 9.000 1.00 0.00 O -ATOM 356 O WAT 356 7.000 11.000 11.000 1.00 0.00 O -ATOM 357 O WAT 357 7.000 11.000 13.000 1.00 0.00 O -ATOM 358 O WAT 358 7.000 11.000 15.000 1.00 0.00 O -ATOM 359 O WAT 359 7.000 11.000 17.000 1.00 0.00 O -ATOM 360 O WAT 360 7.000 11.000 19.000 1.00 0.00 O -ATOM 361 O WAT 361 7.000 13.000 1.000 1.00 0.00 O -ATOM 362 O WAT 362 7.000 13.000 3.000 1.00 0.00 O -ATOM 363 O WAT 363 7.000 13.000 5.000 1.00 0.00 O -ATOM 364 O WAT 364 7.000 13.000 7.000 1.00 0.00 O -ATOM 365 O WAT 365 7.000 13.000 9.000 1.00 0.00 O -ATOM 366 O WAT 366 7.000 13.000 11.000 1.00 0.00 O -ATOM 367 O WAT 367 7.000 13.000 13.000 1.00 0.00 O -ATOM 368 O WAT 368 7.000 13.000 15.000 1.00 0.00 O -ATOM 369 O WAT 369 7.000 13.000 17.000 1.00 0.00 O -ATOM 370 O WAT 370 7.000 13.000 19.000 1.00 0.00 O -ATOM 371 O WAT 371 7.000 15.000 1.000 1.00 0.00 O -ATOM 372 O WAT 372 7.000 15.000 3.000 1.00 0.00 O -ATOM 373 O WAT 373 7.000 15.000 5.000 1.00 0.00 O -ATOM 374 O WAT 374 7.000 15.000 7.000 1.00 0.00 O -ATOM 375 O WAT 375 7.000 15.000 9.000 1.00 0.00 O -ATOM 376 O WAT 376 7.000 15.000 11.000 1.00 0.00 O -ATOM 377 O WAT 377 7.000 15.000 13.000 1.00 0.00 O -ATOM 378 O WAT 378 7.000 15.000 15.000 1.00 0.00 O -ATOM 379 O WAT 379 7.000 15.000 17.000 1.00 0.00 O -ATOM 380 O WAT 380 7.000 15.000 19.000 1.00 0.00 O -ATOM 381 O WAT 381 7.000 17.000 1.000 1.00 0.00 O -ATOM 382 O WAT 382 7.000 17.000 3.000 1.00 0.00 O -ATOM 383 O WAT 383 7.000 17.000 5.000 1.00 0.00 O -ATOM 384 O WAT 384 7.000 17.000 7.000 1.00 0.00 O -ATOM 385 O WAT 385 7.000 17.000 9.000 1.00 0.00 O -ATOM 386 O WAT 386 7.000 17.000 11.000 1.00 0.00 O -ATOM 387 O WAT 387 7.000 17.000 13.000 1.00 0.00 O -ATOM 388 O WAT 388 7.000 17.000 15.000 1.00 0.00 O -ATOM 389 O WAT 389 7.000 17.000 17.000 1.00 0.00 O -ATOM 390 O WAT 390 7.000 17.000 19.000 1.00 0.00 O -ATOM 391 O WAT 391 7.000 19.000 1.000 1.00 0.00 O -ATOM 392 O WAT 392 7.000 19.000 3.000 1.00 0.00 O -ATOM 393 O WAT 393 7.000 19.000 5.000 1.00 0.00 O -ATOM 394 O WAT 394 7.000 19.000 7.000 1.00 0.00 O -ATOM 395 O WAT 395 7.000 19.000 9.000 1.00 0.00 O -ATOM 396 O WAT 396 7.000 19.000 11.000 1.00 0.00 O -ATOM 397 O WAT 397 7.000 19.000 13.000 1.00 0.00 O -ATOM 398 O WAT 398 7.000 19.000 15.000 1.00 0.00 O -ATOM 399 O WAT 399 7.000 19.000 17.000 1.00 0.00 O -ATOM 400 O WAT 400 7.000 19.000 19.000 1.00 0.00 O -ATOM 401 O WAT 401 9.000 1.000 1.000 1.00 0.00 O -ATOM 402 O WAT 402 9.000 1.000 3.000 1.00 0.00 O -ATOM 403 O WAT 403 9.000 1.000 5.000 1.00 0.00 O -ATOM 404 O WAT 404 9.000 1.000 7.000 1.00 0.00 O -ATOM 405 O WAT 405 9.000 1.000 9.000 1.00 0.00 O -ATOM 406 O WAT 406 9.000 1.000 11.000 1.00 0.00 O -ATOM 407 O WAT 407 9.000 1.000 13.000 1.00 0.00 O -ATOM 408 O WAT 408 9.000 1.000 15.000 1.00 0.00 O -ATOM 409 O WAT 409 9.000 1.000 17.000 1.00 0.00 O -ATOM 410 O WAT 410 9.000 1.000 19.000 1.00 0.00 O -ATOM 411 O WAT 411 9.000 3.000 1.000 1.00 0.00 O -ATOM 412 O WAT 412 9.000 3.000 3.000 1.00 0.00 O -ATOM 413 O WAT 413 9.000 3.000 5.000 1.00 0.00 O -ATOM 414 O WAT 414 9.000 3.000 7.000 1.00 0.00 O -ATOM 415 O WAT 415 9.000 3.000 9.000 1.00 0.00 O -ATOM 416 O WAT 416 9.000 3.000 11.000 1.00 0.00 O -ATOM 417 O WAT 417 9.000 3.000 13.000 1.00 0.00 O -ATOM 418 O WAT 418 9.000 3.000 15.000 1.00 0.00 O -ATOM 419 O WAT 419 9.000 3.000 17.000 1.00 0.00 O -ATOM 420 O WAT 420 9.000 3.000 19.000 1.00 0.00 O -ATOM 421 O WAT 421 9.000 5.000 1.000 1.00 0.00 O -ATOM 422 O WAT 422 9.000 5.000 3.000 1.00 0.00 O -ATOM 423 O WAT 423 9.000 5.000 5.000 1.00 0.00 O -ATOM 424 O WAT 424 9.000 5.000 7.000 1.00 0.00 O -ATOM 425 O WAT 425 9.000 5.000 9.000 1.00 0.00 O -ATOM 426 O WAT 426 9.000 5.000 11.000 1.00 0.00 O -ATOM 427 O WAT 427 9.000 5.000 13.000 1.00 0.00 O -ATOM 428 O WAT 428 9.000 5.000 15.000 1.00 0.00 O -ATOM 429 O WAT 429 9.000 5.000 17.000 1.00 0.00 O -ATOM 430 O WAT 430 9.000 5.000 19.000 1.00 0.00 O -ATOM 431 O WAT 431 9.000 7.000 1.000 1.00 0.00 O -ATOM 432 O WAT 432 9.000 7.000 3.000 1.00 0.00 O -ATOM 433 O WAT 433 9.000 7.000 5.000 1.00 0.00 O -ATOM 434 O WAT 434 9.000 7.000 7.000 1.00 0.00 O -ATOM 435 O WAT 435 9.000 7.000 9.000 1.00 0.00 O -ATOM 436 O WAT 436 9.000 7.000 11.000 1.00 0.00 O -ATOM 437 O WAT 437 9.000 7.000 13.000 1.00 0.00 O -ATOM 438 O WAT 438 9.000 7.000 15.000 1.00 0.00 O -ATOM 439 O WAT 439 9.000 7.000 17.000 1.00 0.00 O -ATOM 440 O WAT 440 9.000 7.000 19.000 1.00 0.00 O -ATOM 441 O WAT 441 9.000 9.000 1.000 1.00 0.00 O -ATOM 442 O WAT 442 9.000 9.000 3.000 1.00 0.00 O -ATOM 443 O WAT 443 9.000 9.000 5.000 1.00 0.00 O -ATOM 444 O WAT 444 9.000 9.000 7.000 1.00 0.00 O -ATOM 445 O WAT 445 9.000 9.000 9.000 1.00 0.00 O -ATOM 446 O WAT 446 9.000 9.000 11.000 1.00 0.00 O -ATOM 447 O WAT 447 9.000 9.000 13.000 1.00 0.00 O -ATOM 448 O WAT 448 9.000 9.000 15.000 1.00 0.00 O -ATOM 449 O WAT 449 9.000 9.000 17.000 1.00 0.00 O -ATOM 450 O WAT 450 9.000 9.000 19.000 1.00 0.00 O -ATOM 451 O WAT 451 9.000 11.000 1.000 1.00 0.00 O -ATOM 452 O WAT 452 9.000 11.000 3.000 1.00 0.00 O -ATOM 453 O WAT 453 9.000 11.000 5.000 1.00 0.00 O -ATOM 454 O WAT 454 9.000 11.000 7.000 1.00 0.00 O -ATOM 455 O WAT 455 9.000 11.000 9.000 1.00 0.00 O -ATOM 456 O WAT 456 9.000 11.000 11.000 1.00 0.00 O -ATOM 457 O WAT 457 9.000 11.000 13.000 1.00 0.00 O -ATOM 458 O WAT 458 9.000 11.000 15.000 1.00 0.00 O -ATOM 459 O WAT 459 9.000 11.000 17.000 1.00 0.00 O -ATOM 460 O WAT 460 9.000 11.000 19.000 1.00 0.00 O -ATOM 461 O WAT 461 9.000 13.000 1.000 1.00 0.00 O -ATOM 462 O WAT 462 9.000 13.000 3.000 1.00 0.00 O -ATOM 463 O WAT 463 9.000 13.000 5.000 1.00 0.00 O -ATOM 464 O WAT 464 9.000 13.000 7.000 1.00 0.00 O -ATOM 465 O WAT 465 9.000 13.000 9.000 1.00 0.00 O -ATOM 466 O WAT 466 9.000 13.000 11.000 1.00 0.00 O -ATOM 467 O WAT 467 9.000 13.000 13.000 1.00 0.00 O -ATOM 468 O WAT 468 9.000 13.000 15.000 1.00 0.00 O -ATOM 469 O WAT 469 9.000 13.000 17.000 1.00 0.00 O -ATOM 470 O WAT 470 9.000 13.000 19.000 1.00 0.00 O -ATOM 471 O WAT 471 9.000 15.000 1.000 1.00 0.00 O -ATOM 472 O WAT 472 9.000 15.000 3.000 1.00 0.00 O -ATOM 473 O WAT 473 9.000 15.000 5.000 1.00 0.00 O -ATOM 474 O WAT 474 9.000 15.000 7.000 1.00 0.00 O -ATOM 475 O WAT 475 9.000 15.000 9.000 1.00 0.00 O -ATOM 476 O WAT 476 9.000 15.000 11.000 1.00 0.00 O -ATOM 477 O WAT 477 9.000 15.000 13.000 1.00 0.00 O -ATOM 478 O WAT 478 9.000 15.000 15.000 1.00 0.00 O -ATOM 479 O WAT 479 9.000 15.000 17.000 1.00 0.00 O -ATOM 480 O WAT 480 9.000 15.000 19.000 1.00 0.00 O -ATOM 481 O WAT 481 9.000 17.000 1.000 1.00 0.00 O -ATOM 482 O WAT 482 9.000 17.000 3.000 1.00 0.00 O -ATOM 483 O WAT 483 9.000 17.000 5.000 1.00 0.00 O -ATOM 484 O WAT 484 9.000 17.000 7.000 1.00 0.00 O -ATOM 485 O WAT 485 9.000 17.000 9.000 1.00 0.00 O -ATOM 486 O WAT 486 9.000 17.000 11.000 1.00 0.00 O -ATOM 487 O WAT 487 9.000 17.000 13.000 1.00 0.00 O -ATOM 488 O WAT 488 9.000 17.000 15.000 1.00 0.00 O -ATOM 489 O WAT 489 9.000 17.000 17.000 1.00 0.00 O -ATOM 490 O WAT 490 9.000 17.000 19.000 1.00 0.00 O -ATOM 491 O WAT 491 9.000 19.000 1.000 1.00 0.00 O -ATOM 492 O WAT 492 9.000 19.000 3.000 1.00 0.00 O -ATOM 493 O WAT 493 9.000 19.000 5.000 1.00 0.00 O -ATOM 494 O WAT 494 9.000 19.000 7.000 1.00 0.00 O -ATOM 495 O WAT 495 9.000 19.000 9.000 1.00 0.00 O -ATOM 496 O WAT 496 9.000 19.000 11.000 1.00 0.00 O -ATOM 497 O WAT 497 9.000 19.000 13.000 1.00 0.00 O -ATOM 498 O WAT 498 9.000 19.000 15.000 1.00 0.00 O -ATOM 499 O WAT 499 9.000 19.000 17.000 1.00 0.00 O -ATOM 500 O WAT 500 9.000 19.000 19.000 1.00 0.00 O -ATOM 501 O WAT 501 11.000 1.000 1.000 1.00 0.00 O -ATOM 502 O WAT 502 11.000 1.000 3.000 1.00 0.00 O -ATOM 503 O WAT 503 11.000 1.000 5.000 1.00 0.00 O -ATOM 504 O WAT 504 11.000 1.000 7.000 1.00 0.00 O -ATOM 505 O WAT 505 11.000 1.000 9.000 1.00 0.00 O -ATOM 506 O WAT 506 11.000 1.000 11.000 1.00 0.00 O -ATOM 507 O WAT 507 11.000 1.000 13.000 1.00 0.00 O -ATOM 508 O WAT 508 11.000 1.000 15.000 1.00 0.00 O -ATOM 509 O WAT 509 11.000 1.000 17.000 1.00 0.00 O -ATOM 510 O WAT 510 11.000 1.000 19.000 1.00 0.00 O -ATOM 511 O WAT 511 11.000 3.000 1.000 1.00 0.00 O -ATOM 512 O WAT 512 11.000 3.000 3.000 1.00 0.00 O -ATOM 513 O WAT 513 11.000 3.000 5.000 1.00 0.00 O -ATOM 514 O WAT 514 11.000 3.000 7.000 1.00 0.00 O -ATOM 515 O WAT 515 11.000 3.000 9.000 1.00 0.00 O -ATOM 516 O WAT 516 11.000 3.000 11.000 1.00 0.00 O -ATOM 517 O WAT 517 11.000 3.000 13.000 1.00 0.00 O -ATOM 518 O WAT 518 11.000 3.000 15.000 1.00 0.00 O -ATOM 519 O WAT 519 11.000 3.000 17.000 1.00 0.00 O -ATOM 520 O WAT 520 11.000 3.000 19.000 1.00 0.00 O -ATOM 521 O WAT 521 11.000 5.000 1.000 1.00 0.00 O -ATOM 522 O WAT 522 11.000 5.000 3.000 1.00 0.00 O -ATOM 523 O WAT 523 11.000 5.000 5.000 1.00 0.00 O -ATOM 524 O WAT 524 11.000 5.000 7.000 1.00 0.00 O -ATOM 525 O WAT 525 11.000 5.000 9.000 1.00 0.00 O -ATOM 526 O WAT 526 11.000 5.000 11.000 1.00 0.00 O -ATOM 527 O WAT 527 11.000 5.000 13.000 1.00 0.00 O -ATOM 528 O WAT 528 11.000 5.000 15.000 1.00 0.00 O -ATOM 529 O WAT 529 11.000 5.000 17.000 1.00 0.00 O -ATOM 530 O WAT 530 11.000 5.000 19.000 1.00 0.00 O -ATOM 531 O WAT 531 11.000 7.000 1.000 1.00 0.00 O -ATOM 532 O WAT 532 11.000 7.000 3.000 1.00 0.00 O -ATOM 533 O WAT 533 11.000 7.000 5.000 1.00 0.00 O -ATOM 534 O WAT 534 11.000 7.000 7.000 1.00 0.00 O -ATOM 535 O WAT 535 11.000 7.000 9.000 1.00 0.00 O -ATOM 536 O WAT 536 11.000 7.000 11.000 1.00 0.00 O -ATOM 537 O WAT 537 11.000 7.000 13.000 1.00 0.00 O -ATOM 538 O WAT 538 11.000 7.000 15.000 1.00 0.00 O -ATOM 539 O WAT 539 11.000 7.000 17.000 1.00 0.00 O -ATOM 540 O WAT 540 11.000 7.000 19.000 1.00 0.00 O -ATOM 541 O WAT 541 11.000 9.000 1.000 1.00 0.00 O -ATOM 542 O WAT 542 11.000 9.000 3.000 1.00 0.00 O -ATOM 543 O WAT 543 11.000 9.000 5.000 1.00 0.00 O -ATOM 544 O WAT 544 11.000 9.000 7.000 1.00 0.00 O -ATOM 545 O WAT 545 11.000 9.000 9.000 1.00 0.00 O -ATOM 546 O WAT 546 11.000 9.000 11.000 1.00 0.00 O -ATOM 547 O WAT 547 11.000 9.000 13.000 1.00 0.00 O -ATOM 548 O WAT 548 11.000 9.000 15.000 1.00 0.00 O -ATOM 549 O WAT 549 11.000 9.000 17.000 1.00 0.00 O -ATOM 550 O WAT 550 11.000 9.000 19.000 1.00 0.00 O -ATOM 551 O WAT 551 11.000 11.000 1.000 1.00 0.00 O -ATOM 552 O WAT 552 11.000 11.000 3.000 1.00 0.00 O -ATOM 553 O WAT 553 11.000 11.000 5.000 1.00 0.00 O -ATOM 554 O WAT 554 11.000 11.000 7.000 1.00 0.00 O -ATOM 555 O WAT 555 11.000 11.000 9.000 1.00 0.00 O -ATOM 556 O WAT 556 11.000 11.000 11.000 1.00 0.00 O -ATOM 557 O WAT 557 11.000 11.000 13.000 1.00 0.00 O -ATOM 558 O WAT 558 11.000 11.000 15.000 1.00 0.00 O -ATOM 559 O WAT 559 11.000 11.000 17.000 1.00 0.00 O -ATOM 560 O WAT 560 11.000 11.000 19.000 1.00 0.00 O -ATOM 561 O WAT 561 11.000 13.000 1.000 1.00 0.00 O -ATOM 562 O WAT 562 11.000 13.000 3.000 1.00 0.00 O -ATOM 563 O WAT 563 11.000 13.000 5.000 1.00 0.00 O -ATOM 564 O WAT 564 11.000 13.000 7.000 1.00 0.00 O -ATOM 565 O WAT 565 11.000 13.000 9.000 1.00 0.00 O -ATOM 566 O WAT 566 11.000 13.000 11.000 1.00 0.00 O -ATOM 567 O WAT 567 11.000 13.000 13.000 1.00 0.00 O -ATOM 568 O WAT 568 11.000 13.000 15.000 1.00 0.00 O -ATOM 569 O WAT 569 11.000 13.000 17.000 1.00 0.00 O -ATOM 570 O WAT 570 11.000 13.000 19.000 1.00 0.00 O -ATOM 571 O WAT 571 11.000 15.000 1.000 1.00 0.00 O -ATOM 572 O WAT 572 11.000 15.000 3.000 1.00 0.00 O -ATOM 573 O WAT 573 11.000 15.000 5.000 1.00 0.00 O -ATOM 574 O WAT 574 11.000 15.000 7.000 1.00 0.00 O -ATOM 575 O WAT 575 11.000 15.000 9.000 1.00 0.00 O -ATOM 576 O WAT 576 11.000 15.000 11.000 1.00 0.00 O -ATOM 577 O WAT 577 11.000 15.000 13.000 1.00 0.00 O -ATOM 578 O WAT 578 11.000 15.000 15.000 1.00 0.00 O -ATOM 579 O WAT 579 11.000 15.000 17.000 1.00 0.00 O -ATOM 580 O WAT 580 11.000 15.000 19.000 1.00 0.00 O -ATOM 581 O WAT 581 11.000 17.000 1.000 1.00 0.00 O -ATOM 582 O WAT 582 11.000 17.000 3.000 1.00 0.00 O -ATOM 583 O WAT 583 11.000 17.000 5.000 1.00 0.00 O -ATOM 584 O WAT 584 11.000 17.000 7.000 1.00 0.00 O -ATOM 585 O WAT 585 11.000 17.000 9.000 1.00 0.00 O -ATOM 586 O WAT 586 11.000 17.000 11.000 1.00 0.00 O -ATOM 587 O WAT 587 11.000 17.000 13.000 1.00 0.00 O -ATOM 588 O WAT 588 11.000 17.000 15.000 1.00 0.00 O -ATOM 589 O WAT 589 11.000 17.000 17.000 1.00 0.00 O -ATOM 590 O WAT 590 11.000 17.000 19.000 1.00 0.00 O -ATOM 591 O WAT 591 11.000 19.000 1.000 1.00 0.00 O -ATOM 592 O WAT 592 11.000 19.000 3.000 1.00 0.00 O -ATOM 593 O WAT 593 11.000 19.000 5.000 1.00 0.00 O -ATOM 594 O WAT 594 11.000 19.000 7.000 1.00 0.00 O -ATOM 595 O WAT 595 11.000 19.000 9.000 1.00 0.00 O -ATOM 596 O WAT 596 11.000 19.000 11.000 1.00 0.00 O -ATOM 597 O WAT 597 11.000 19.000 13.000 1.00 0.00 O -ATOM 598 O WAT 598 11.000 19.000 15.000 1.00 0.00 O -ATOM 599 O WAT 599 11.000 19.000 17.000 1.00 0.00 O -ATOM 600 O WAT 600 11.000 19.000 19.000 1.00 0.00 O -ATOM 601 O WAT 601 13.000 1.000 1.000 1.00 0.00 O -ATOM 602 O WAT 602 13.000 1.000 3.000 1.00 0.00 O -ATOM 603 O WAT 603 13.000 1.000 5.000 1.00 0.00 O -ATOM 604 O WAT 604 13.000 1.000 7.000 1.00 0.00 O -ATOM 605 O WAT 605 13.000 1.000 9.000 1.00 0.00 O -ATOM 606 O WAT 606 13.000 1.000 11.000 1.00 0.00 O -ATOM 607 O WAT 607 13.000 1.000 13.000 1.00 0.00 O -ATOM 608 O WAT 608 13.000 1.000 15.000 1.00 0.00 O -ATOM 609 O WAT 609 13.000 1.000 17.000 1.00 0.00 O -ATOM 610 O WAT 610 13.000 1.000 19.000 1.00 0.00 O -ATOM 611 O WAT 611 13.000 3.000 1.000 1.00 0.00 O -ATOM 612 O WAT 612 13.000 3.000 3.000 1.00 0.00 O -ATOM 613 O WAT 613 13.000 3.000 5.000 1.00 0.00 O -ATOM 614 O WAT 614 13.000 3.000 7.000 1.00 0.00 O -ATOM 615 O WAT 615 13.000 3.000 9.000 1.00 0.00 O -ATOM 616 O WAT 616 13.000 3.000 11.000 1.00 0.00 O -ATOM 617 O WAT 617 13.000 3.000 13.000 1.00 0.00 O -ATOM 618 O WAT 618 13.000 3.000 15.000 1.00 0.00 O -ATOM 619 O WAT 619 13.000 3.000 17.000 1.00 0.00 O -ATOM 620 O WAT 620 13.000 3.000 19.000 1.00 0.00 O -ATOM 621 O WAT 621 13.000 5.000 1.000 1.00 0.00 O -ATOM 622 O WAT 622 13.000 5.000 3.000 1.00 0.00 O -ATOM 623 O WAT 623 13.000 5.000 5.000 1.00 0.00 O -ATOM 624 O WAT 624 13.000 5.000 7.000 1.00 0.00 O -ATOM 625 O WAT 625 13.000 5.000 9.000 1.00 0.00 O -ATOM 626 O WAT 626 13.000 5.000 11.000 1.00 0.00 O -ATOM 627 O WAT 627 13.000 5.000 13.000 1.00 0.00 O -ATOM 628 O WAT 628 13.000 5.000 15.000 1.00 0.00 O -ATOM 629 O WAT 629 13.000 5.000 17.000 1.00 0.00 O -ATOM 630 O WAT 630 13.000 5.000 19.000 1.00 0.00 O -ATOM 631 O WAT 631 13.000 7.000 1.000 1.00 0.00 O -ATOM 632 O WAT 632 13.000 7.000 3.000 1.00 0.00 O -ATOM 633 O WAT 633 13.000 7.000 5.000 1.00 0.00 O -ATOM 634 O WAT 634 13.000 7.000 7.000 1.00 0.00 O -ATOM 635 O WAT 635 13.000 7.000 9.000 1.00 0.00 O -ATOM 636 O WAT 636 13.000 7.000 11.000 1.00 0.00 O -ATOM 637 O WAT 637 13.000 7.000 13.000 1.00 0.00 O -ATOM 638 O WAT 638 13.000 7.000 15.000 1.00 0.00 O -ATOM 639 O WAT 639 13.000 7.000 17.000 1.00 0.00 O -ATOM 640 O WAT 640 13.000 7.000 19.000 1.00 0.00 O -ATOM 641 O WAT 641 13.000 9.000 1.000 1.00 0.00 O -ATOM 642 O WAT 642 13.000 9.000 3.000 1.00 0.00 O -ATOM 643 O WAT 643 13.000 9.000 5.000 1.00 0.00 O -ATOM 644 O WAT 644 13.000 9.000 7.000 1.00 0.00 O -ATOM 645 O WAT 645 13.000 9.000 9.000 1.00 0.00 O -ATOM 646 O WAT 646 13.000 9.000 11.000 1.00 0.00 O -ATOM 647 O WAT 647 13.000 9.000 13.000 1.00 0.00 O -ATOM 648 O WAT 648 13.000 9.000 15.000 1.00 0.00 O -ATOM 649 O WAT 649 13.000 9.000 17.000 1.00 0.00 O -ATOM 650 O WAT 650 13.000 9.000 19.000 1.00 0.00 O -ATOM 651 O WAT 651 13.000 11.000 1.000 1.00 0.00 O -ATOM 652 O WAT 652 13.000 11.000 3.000 1.00 0.00 O -ATOM 653 O WAT 653 13.000 11.000 5.000 1.00 0.00 O -ATOM 654 O WAT 654 13.000 11.000 7.000 1.00 0.00 O -ATOM 655 O WAT 655 13.000 11.000 9.000 1.00 0.00 O -ATOM 656 O WAT 656 13.000 11.000 11.000 1.00 0.00 O -ATOM 657 O WAT 657 13.000 11.000 13.000 1.00 0.00 O -ATOM 658 O WAT 658 13.000 11.000 15.000 1.00 0.00 O -ATOM 659 O WAT 659 13.000 11.000 17.000 1.00 0.00 O -ATOM 660 O WAT 660 13.000 11.000 19.000 1.00 0.00 O -ATOM 661 O WAT 661 13.000 13.000 1.000 1.00 0.00 O -ATOM 662 O WAT 662 13.000 13.000 3.000 1.00 0.00 O -ATOM 663 O WAT 663 13.000 13.000 5.000 1.00 0.00 O -ATOM 664 O WAT 664 13.000 13.000 7.000 1.00 0.00 O -ATOM 665 O WAT 665 13.000 13.000 9.000 1.00 0.00 O -ATOM 666 O WAT 666 13.000 13.000 11.000 1.00 0.00 O -ATOM 667 O WAT 667 13.000 13.000 13.000 1.00 0.00 O -ATOM 668 O WAT 668 13.000 13.000 15.000 1.00 0.00 O -ATOM 669 O WAT 669 13.000 13.000 17.000 1.00 0.00 O -ATOM 670 O WAT 670 13.000 13.000 19.000 1.00 0.00 O -ATOM 671 O WAT 671 13.000 15.000 1.000 1.00 0.00 O -ATOM 672 O WAT 672 13.000 15.000 3.000 1.00 0.00 O -ATOM 673 O WAT 673 13.000 15.000 5.000 1.00 0.00 O -ATOM 674 O WAT 674 13.000 15.000 7.000 1.00 0.00 O -ATOM 675 O WAT 675 13.000 15.000 9.000 1.00 0.00 O -ATOM 676 O WAT 676 13.000 15.000 11.000 1.00 0.00 O -ATOM 677 O WAT 677 13.000 15.000 13.000 1.00 0.00 O -ATOM 678 O WAT 678 13.000 15.000 15.000 1.00 0.00 O -ATOM 679 O WAT 679 13.000 15.000 17.000 1.00 0.00 O -ATOM 680 O WAT 680 13.000 15.000 19.000 1.00 0.00 O -ATOM 681 O WAT 681 13.000 17.000 1.000 1.00 0.00 O -ATOM 682 O WAT 682 13.000 17.000 3.000 1.00 0.00 O -ATOM 683 O WAT 683 13.000 17.000 5.000 1.00 0.00 O -ATOM 684 O WAT 684 13.000 17.000 7.000 1.00 0.00 O -ATOM 685 O WAT 685 13.000 17.000 9.000 1.00 0.00 O -ATOM 686 O WAT 686 13.000 17.000 11.000 1.00 0.00 O -ATOM 687 O WAT 687 13.000 17.000 13.000 1.00 0.00 O -ATOM 688 O WAT 688 13.000 17.000 15.000 1.00 0.00 O -ATOM 689 O WAT 689 13.000 17.000 17.000 1.00 0.00 O -ATOM 690 O WAT 690 13.000 17.000 19.000 1.00 0.00 O -ATOM 691 O WAT 691 13.000 19.000 1.000 1.00 0.00 O -ATOM 692 O WAT 692 13.000 19.000 3.000 1.00 0.00 O -ATOM 693 O WAT 693 13.000 19.000 5.000 1.00 0.00 O -ATOM 694 O WAT 694 13.000 19.000 7.000 1.00 0.00 O -ATOM 695 O WAT 695 13.000 19.000 9.000 1.00 0.00 O -ATOM 696 O WAT 696 13.000 19.000 11.000 1.00 0.00 O -ATOM 697 O WAT 697 13.000 19.000 13.000 1.00 0.00 O -ATOM 698 O WAT 698 13.000 19.000 15.000 1.00 0.00 O -ATOM 699 O WAT 699 13.000 19.000 17.000 1.00 0.00 O -ATOM 700 O WAT 700 13.000 19.000 19.000 1.00 0.00 O -ATOM 701 O WAT 701 15.000 1.000 1.000 1.00 0.00 O -ATOM 702 O WAT 702 15.000 1.000 3.000 1.00 0.00 O -ATOM 703 O WAT 703 15.000 1.000 5.000 1.00 0.00 O -ATOM 704 O WAT 704 15.000 1.000 7.000 1.00 0.00 O -ATOM 705 O WAT 705 15.000 1.000 9.000 1.00 0.00 O -ATOM 706 O WAT 706 15.000 1.000 11.000 1.00 0.00 O -ATOM 707 O WAT 707 15.000 1.000 13.000 1.00 0.00 O -ATOM 708 O WAT 708 15.000 1.000 15.000 1.00 0.00 O -ATOM 709 O WAT 709 15.000 1.000 17.000 1.00 0.00 O -ATOM 710 O WAT 710 15.000 1.000 19.000 1.00 0.00 O -ATOM 711 O WAT 711 15.000 3.000 1.000 1.00 0.00 O -ATOM 712 O WAT 712 15.000 3.000 3.000 1.00 0.00 O -ATOM 713 O WAT 713 15.000 3.000 5.000 1.00 0.00 O -ATOM 714 O WAT 714 15.000 3.000 7.000 1.00 0.00 O -ATOM 715 O WAT 715 15.000 3.000 9.000 1.00 0.00 O -ATOM 716 O WAT 716 15.000 3.000 11.000 1.00 0.00 O -ATOM 717 O WAT 717 15.000 3.000 13.000 1.00 0.00 O -ATOM 718 O WAT 718 15.000 3.000 15.000 1.00 0.00 O -ATOM 719 O WAT 719 15.000 3.000 17.000 1.00 0.00 O -ATOM 720 O WAT 720 15.000 3.000 19.000 1.00 0.00 O -ATOM 721 O WAT 721 15.000 5.000 1.000 1.00 0.00 O -ATOM 722 O WAT 722 15.000 5.000 3.000 1.00 0.00 O -ATOM 723 O WAT 723 15.000 5.000 5.000 1.00 0.00 O -ATOM 724 O WAT 724 15.000 5.000 7.000 1.00 0.00 O -ATOM 725 O WAT 725 15.000 5.000 9.000 1.00 0.00 O -ATOM 726 O WAT 726 15.000 5.000 11.000 1.00 0.00 O -ATOM 727 O WAT 727 15.000 5.000 13.000 1.00 0.00 O -ATOM 728 O WAT 728 15.000 5.000 15.000 1.00 0.00 O -ATOM 729 O WAT 729 15.000 5.000 17.000 1.00 0.00 O -ATOM 730 O WAT 730 15.000 5.000 19.000 1.00 0.00 O -ATOM 731 O WAT 731 15.000 7.000 1.000 1.00 0.00 O -ATOM 732 O WAT 732 15.000 7.000 3.000 1.00 0.00 O -ATOM 733 O WAT 733 15.000 7.000 5.000 1.00 0.00 O -ATOM 734 O WAT 734 15.000 7.000 7.000 1.00 0.00 O -ATOM 735 O WAT 735 15.000 7.000 9.000 1.00 0.00 O -ATOM 736 O WAT 736 15.000 7.000 11.000 1.00 0.00 O -ATOM 737 O WAT 737 15.000 7.000 13.000 1.00 0.00 O -ATOM 738 O WAT 738 15.000 7.000 15.000 1.00 0.00 O -ATOM 739 O WAT 739 15.000 7.000 17.000 1.00 0.00 O -ATOM 740 O WAT 740 15.000 7.000 19.000 1.00 0.00 O -ATOM 741 O WAT 741 15.000 9.000 1.000 1.00 0.00 O -ATOM 742 O WAT 742 15.000 9.000 3.000 1.00 0.00 O -ATOM 743 O WAT 743 15.000 9.000 5.000 1.00 0.00 O -ATOM 744 O WAT 744 15.000 9.000 7.000 1.00 0.00 O -ATOM 745 O WAT 745 15.000 9.000 9.000 1.00 0.00 O -ATOM 746 O WAT 746 15.000 9.000 11.000 1.00 0.00 O -ATOM 747 O WAT 747 15.000 9.000 13.000 1.00 0.00 O -ATOM 748 O WAT 748 15.000 9.000 15.000 1.00 0.00 O -ATOM 749 O WAT 749 15.000 9.000 17.000 1.00 0.00 O -ATOM 750 O WAT 750 15.000 9.000 19.000 1.00 0.00 O -ATOM 751 O WAT 751 15.000 11.000 1.000 1.00 0.00 O -ATOM 752 O WAT 752 15.000 11.000 3.000 1.00 0.00 O -ATOM 753 O WAT 753 15.000 11.000 5.000 1.00 0.00 O -ATOM 754 O WAT 754 15.000 11.000 7.000 1.00 0.00 O -ATOM 755 O WAT 755 15.000 11.000 9.000 1.00 0.00 O -ATOM 756 O WAT 756 15.000 11.000 11.000 1.00 0.00 O -ATOM 757 O WAT 757 15.000 11.000 13.000 1.00 0.00 O -ATOM 758 O WAT 758 15.000 11.000 15.000 1.00 0.00 O -ATOM 759 O WAT 759 15.000 11.000 17.000 1.00 0.00 O -ATOM 760 O WAT 760 15.000 11.000 19.000 1.00 0.00 O -ATOM 761 O WAT 761 15.000 13.000 1.000 1.00 0.00 O -ATOM 762 O WAT 762 15.000 13.000 3.000 1.00 0.00 O -ATOM 763 O WAT 763 15.000 13.000 5.000 1.00 0.00 O -ATOM 764 O WAT 764 15.000 13.000 7.000 1.00 0.00 O -ATOM 765 O WAT 765 15.000 13.000 9.000 1.00 0.00 O -ATOM 766 O WAT 766 15.000 13.000 11.000 1.00 0.00 O -ATOM 767 O WAT 767 15.000 13.000 13.000 1.00 0.00 O -ATOM 768 O WAT 768 15.000 13.000 15.000 1.00 0.00 O -ATOM 769 O WAT 769 15.000 13.000 17.000 1.00 0.00 O -ATOM 770 O WAT 770 15.000 13.000 19.000 1.00 0.00 O -ATOM 771 O WAT 771 15.000 15.000 1.000 1.00 0.00 O -ATOM 772 O WAT 772 15.000 15.000 3.000 1.00 0.00 O -ATOM 773 O WAT 773 15.000 15.000 5.000 1.00 0.00 O -ATOM 774 O WAT 774 15.000 15.000 7.000 1.00 0.00 O -ATOM 775 O WAT 775 15.000 15.000 9.000 1.00 0.00 O -ATOM 776 O WAT 776 15.000 15.000 11.000 1.00 0.00 O -ATOM 777 O WAT 777 15.000 15.000 13.000 1.00 0.00 O -ATOM 778 O WAT 778 15.000 15.000 15.000 1.00 0.00 O -ATOM 779 O WAT 779 15.000 15.000 17.000 1.00 0.00 O -ATOM 780 O WAT 780 15.000 15.000 19.000 1.00 0.00 O -ATOM 781 O WAT 781 15.000 17.000 1.000 1.00 0.00 O -ATOM 782 O WAT 782 15.000 17.000 3.000 1.00 0.00 O -ATOM 783 O WAT 783 15.000 17.000 5.000 1.00 0.00 O -ATOM 784 O WAT 784 15.000 17.000 7.000 1.00 0.00 O -ATOM 785 O WAT 785 15.000 17.000 9.000 1.00 0.00 O -ATOM 786 O WAT 786 15.000 17.000 11.000 1.00 0.00 O -ATOM 787 O WAT 787 15.000 17.000 13.000 1.00 0.00 O -ATOM 788 O WAT 788 15.000 17.000 15.000 1.00 0.00 O -ATOM 789 O WAT 789 15.000 17.000 17.000 1.00 0.00 O -ATOM 790 O WAT 790 15.000 17.000 19.000 1.00 0.00 O -ATOM 791 O WAT 791 15.000 19.000 1.000 1.00 0.00 O -ATOM 792 O WAT 792 15.000 19.000 3.000 1.00 0.00 O -ATOM 793 O WAT 793 15.000 19.000 5.000 1.00 0.00 O -ATOM 794 O WAT 794 15.000 19.000 7.000 1.00 0.00 O -ATOM 795 O WAT 795 15.000 19.000 9.000 1.00 0.00 O -ATOM 796 O WAT 796 15.000 19.000 11.000 1.00 0.00 O -ATOM 797 O WAT 797 15.000 19.000 13.000 1.00 0.00 O -ATOM 798 O WAT 798 15.000 19.000 15.000 1.00 0.00 O -ATOM 799 O WAT 799 15.000 19.000 17.000 1.00 0.00 O -ATOM 800 O WAT 800 15.000 19.000 19.000 1.00 0.00 O -ATOM 801 O WAT 801 17.000 1.000 1.000 1.00 0.00 O -ATOM 802 O WAT 802 17.000 1.000 3.000 1.00 0.00 O -ATOM 803 O WAT 803 17.000 1.000 5.000 1.00 0.00 O -ATOM 804 O WAT 804 17.000 1.000 7.000 1.00 0.00 O -ATOM 805 O WAT 805 17.000 1.000 9.000 1.00 0.00 O -ATOM 806 O WAT 806 17.000 1.000 11.000 1.00 0.00 O -ATOM 807 O WAT 807 17.000 1.000 13.000 1.00 0.00 O -ATOM 808 O WAT 808 17.000 1.000 15.000 1.00 0.00 O -ATOM 809 O WAT 809 17.000 1.000 17.000 1.00 0.00 O -ATOM 810 O WAT 810 17.000 1.000 19.000 1.00 0.00 O -ATOM 811 O WAT 811 17.000 3.000 1.000 1.00 0.00 O -ATOM 812 O WAT 812 17.000 3.000 3.000 1.00 0.00 O -ATOM 813 O WAT 813 17.000 3.000 5.000 1.00 0.00 O -ATOM 814 O WAT 814 17.000 3.000 7.000 1.00 0.00 O -ATOM 815 O WAT 815 17.000 3.000 9.000 1.00 0.00 O -ATOM 816 O WAT 816 17.000 3.000 11.000 1.00 0.00 O -ATOM 817 O WAT 817 17.000 3.000 13.000 1.00 0.00 O -ATOM 818 O WAT 818 17.000 3.000 15.000 1.00 0.00 O -ATOM 819 O WAT 819 17.000 3.000 17.000 1.00 0.00 O -ATOM 820 O WAT 820 17.000 3.000 19.000 1.00 0.00 O -ATOM 821 O WAT 821 17.000 5.000 1.000 1.00 0.00 O -ATOM 822 O WAT 822 17.000 5.000 3.000 1.00 0.00 O -ATOM 823 O WAT 823 17.000 5.000 5.000 1.00 0.00 O -ATOM 824 O WAT 824 17.000 5.000 7.000 1.00 0.00 O -ATOM 825 O WAT 825 17.000 5.000 9.000 1.00 0.00 O -ATOM 826 O WAT 826 17.000 5.000 11.000 1.00 0.00 O -ATOM 827 O WAT 827 17.000 5.000 13.000 1.00 0.00 O -ATOM 828 O WAT 828 17.000 5.000 15.000 1.00 0.00 O -ATOM 829 O WAT 829 17.000 5.000 17.000 1.00 0.00 O -ATOM 830 O WAT 830 17.000 5.000 19.000 1.00 0.00 O -ATOM 831 O WAT 831 17.000 7.000 1.000 1.00 0.00 O -ATOM 832 O WAT 832 17.000 7.000 3.000 1.00 0.00 O -ATOM 833 O WAT 833 17.000 7.000 5.000 1.00 0.00 O -ATOM 834 O WAT 834 17.000 7.000 7.000 1.00 0.00 O -ATOM 835 O WAT 835 17.000 7.000 9.000 1.00 0.00 O -ATOM 836 O WAT 836 17.000 7.000 11.000 1.00 0.00 O -ATOM 837 O WAT 837 17.000 7.000 13.000 1.00 0.00 O -ATOM 838 O WAT 838 17.000 7.000 15.000 1.00 0.00 O -ATOM 839 O WAT 839 17.000 7.000 17.000 1.00 0.00 O -ATOM 840 O WAT 840 17.000 7.000 19.000 1.00 0.00 O -ATOM 841 O WAT 841 17.000 9.000 1.000 1.00 0.00 O -ATOM 842 O WAT 842 17.000 9.000 3.000 1.00 0.00 O -ATOM 843 O WAT 843 17.000 9.000 5.000 1.00 0.00 O -ATOM 844 O WAT 844 17.000 9.000 7.000 1.00 0.00 O -ATOM 845 O WAT 845 17.000 9.000 9.000 1.00 0.00 O -ATOM 846 O WAT 846 17.000 9.000 11.000 1.00 0.00 O -ATOM 847 O WAT 847 17.000 9.000 13.000 1.00 0.00 O -ATOM 848 O WAT 848 17.000 9.000 15.000 1.00 0.00 O -ATOM 849 O WAT 849 17.000 9.000 17.000 1.00 0.00 O -ATOM 850 O WAT 850 17.000 9.000 19.000 1.00 0.00 O -ATOM 851 O WAT 851 17.000 11.000 1.000 1.00 0.00 O -ATOM 852 O WAT 852 17.000 11.000 3.000 1.00 0.00 O -ATOM 853 O WAT 853 17.000 11.000 5.000 1.00 0.00 O -ATOM 854 O WAT 854 17.000 11.000 7.000 1.00 0.00 O -ATOM 855 O WAT 855 17.000 11.000 9.000 1.00 0.00 O -ATOM 856 O WAT 856 17.000 11.000 11.000 1.00 0.00 O -ATOM 857 O WAT 857 17.000 11.000 13.000 1.00 0.00 O -ATOM 858 O WAT 858 17.000 11.000 15.000 1.00 0.00 O -ATOM 859 O WAT 859 17.000 11.000 17.000 1.00 0.00 O -ATOM 860 O WAT 860 17.000 11.000 19.000 1.00 0.00 O -ATOM 861 O WAT 861 17.000 13.000 1.000 1.00 0.00 O -ATOM 862 O WAT 862 17.000 13.000 3.000 1.00 0.00 O -ATOM 863 O WAT 863 17.000 13.000 5.000 1.00 0.00 O -ATOM 864 O WAT 864 17.000 13.000 7.000 1.00 0.00 O -ATOM 865 O WAT 865 17.000 13.000 9.000 1.00 0.00 O -ATOM 866 O WAT 866 17.000 13.000 11.000 1.00 0.00 O -ATOM 867 O WAT 867 17.000 13.000 13.000 1.00 0.00 O -ATOM 868 O WAT 868 17.000 13.000 15.000 1.00 0.00 O -ATOM 869 O WAT 869 17.000 13.000 17.000 1.00 0.00 O -ATOM 870 O WAT 870 17.000 13.000 19.000 1.00 0.00 O -ATOM 871 O WAT 871 17.000 15.000 1.000 1.00 0.00 O -ATOM 872 O WAT 872 17.000 15.000 3.000 1.00 0.00 O -ATOM 873 O WAT 873 17.000 15.000 5.000 1.00 0.00 O -ATOM 874 O WAT 874 17.000 15.000 7.000 1.00 0.00 O -ATOM 875 O WAT 875 17.000 15.000 9.000 1.00 0.00 O -ATOM 876 O WAT 876 17.000 15.000 11.000 1.00 0.00 O -ATOM 877 O WAT 877 17.000 15.000 13.000 1.00 0.00 O -ATOM 878 O WAT 878 17.000 15.000 15.000 1.00 0.00 O -ATOM 879 O WAT 879 17.000 15.000 17.000 1.00 0.00 O -ATOM 880 O WAT 880 17.000 15.000 19.000 1.00 0.00 O -ATOM 881 O WAT 881 17.000 17.000 1.000 1.00 0.00 O -ATOM 882 O WAT 882 17.000 17.000 3.000 1.00 0.00 O -ATOM 883 O WAT 883 17.000 17.000 5.000 1.00 0.00 O -ATOM 884 O WAT 884 17.000 17.000 7.000 1.00 0.00 O -ATOM 885 O WAT 885 17.000 17.000 9.000 1.00 0.00 O -ATOM 886 O WAT 886 17.000 17.000 11.000 1.00 0.00 O -ATOM 887 O WAT 887 17.000 17.000 13.000 1.00 0.00 O -ATOM 888 O WAT 888 17.000 17.000 15.000 1.00 0.00 O -ATOM 889 O WAT 889 17.000 17.000 17.000 1.00 0.00 O -ATOM 890 O WAT 890 17.000 17.000 19.000 1.00 0.00 O -ATOM 891 O WAT 891 17.000 19.000 1.000 1.00 0.00 O -ATOM 892 O WAT 892 17.000 19.000 3.000 1.00 0.00 O -ATOM 893 O WAT 893 17.000 19.000 5.000 1.00 0.00 O -ATOM 894 O WAT 894 17.000 19.000 7.000 1.00 0.00 O -ATOM 895 O WAT 895 17.000 19.000 9.000 1.00 0.00 O -ATOM 896 O WAT 896 17.000 19.000 11.000 1.00 0.00 O -ATOM 897 O WAT 897 17.000 19.000 13.000 1.00 0.00 O -ATOM 898 O WAT 898 17.000 19.000 15.000 1.00 0.00 O -ATOM 899 O WAT 899 17.000 19.000 17.000 1.00 0.00 O -ATOM 900 O WAT 900 17.000 19.000 19.000 1.00 0.00 O -ATOM 901 O WAT 901 19.000 1.000 1.000 1.00 0.00 O -ATOM 902 O WAT 902 19.000 1.000 3.000 1.00 0.00 O -ATOM 903 O WAT 903 19.000 1.000 5.000 1.00 0.00 O -ATOM 904 O WAT 904 19.000 1.000 7.000 1.00 0.00 O -ATOM 905 O WAT 905 19.000 1.000 9.000 1.00 0.00 O -ATOM 906 O WAT 906 19.000 1.000 11.000 1.00 0.00 O -ATOM 907 O WAT 907 19.000 1.000 13.000 1.00 0.00 O -ATOM 908 O WAT 908 19.000 1.000 15.000 1.00 0.00 O -ATOM 909 O WAT 909 19.000 1.000 17.000 1.00 0.00 O -ATOM 910 O WAT 910 19.000 1.000 19.000 1.00 0.00 O -ATOM 911 O WAT 911 19.000 3.000 1.000 1.00 0.00 O -ATOM 912 O WAT 912 19.000 3.000 3.000 1.00 0.00 O -ATOM 913 O WAT 913 19.000 3.000 5.000 1.00 0.00 O -ATOM 914 O WAT 914 19.000 3.000 7.000 1.00 0.00 O -ATOM 915 O WAT 915 19.000 3.000 9.000 1.00 0.00 O -ATOM 916 O WAT 916 19.000 3.000 11.000 1.00 0.00 O -ATOM 917 O WAT 917 19.000 3.000 13.000 1.00 0.00 O -ATOM 918 O WAT 918 19.000 3.000 15.000 1.00 0.00 O -ATOM 919 O WAT 919 19.000 3.000 17.000 1.00 0.00 O -ATOM 920 O WAT 920 19.000 3.000 19.000 1.00 0.00 O -ATOM 921 O WAT 921 19.000 5.000 1.000 1.00 0.00 O -ATOM 922 O WAT 922 19.000 5.000 3.000 1.00 0.00 O -ATOM 923 O WAT 923 19.000 5.000 5.000 1.00 0.00 O -ATOM 924 O WAT 924 19.000 5.000 7.000 1.00 0.00 O -ATOM 925 O WAT 925 19.000 5.000 9.000 1.00 0.00 O -ATOM 926 O WAT 926 19.000 5.000 11.000 1.00 0.00 O -ATOM 927 O WAT 927 19.000 5.000 13.000 1.00 0.00 O -ATOM 928 O WAT 928 19.000 5.000 15.000 1.00 0.00 O -ATOM 929 O WAT 929 19.000 5.000 17.000 1.00 0.00 O -ATOM 930 O WAT 930 19.000 5.000 19.000 1.00 0.00 O -ATOM 931 O WAT 931 19.000 7.000 1.000 1.00 0.00 O -ATOM 932 O WAT 932 19.000 7.000 3.000 1.00 0.00 O -ATOM 933 O WAT 933 19.000 7.000 5.000 1.00 0.00 O -ATOM 934 O WAT 934 19.000 7.000 7.000 1.00 0.00 O -ATOM 935 O WAT 935 19.000 7.000 9.000 1.00 0.00 O -ATOM 936 O WAT 936 19.000 7.000 11.000 1.00 0.00 O -ATOM 937 O WAT 937 19.000 7.000 13.000 1.00 0.00 O -ATOM 938 O WAT 938 19.000 7.000 15.000 1.00 0.00 O -ATOM 939 O WAT 939 19.000 7.000 17.000 1.00 0.00 O -ATOM 940 O WAT 940 19.000 7.000 19.000 1.00 0.00 O -ATOM 941 O WAT 941 19.000 9.000 1.000 1.00 0.00 O -ATOM 942 O WAT 942 19.000 9.000 3.000 1.00 0.00 O -ATOM 943 O WAT 943 19.000 9.000 5.000 1.00 0.00 O -ATOM 944 O WAT 944 19.000 9.000 7.000 1.00 0.00 O -ATOM 945 O WAT 945 19.000 9.000 9.000 1.00 0.00 O -ATOM 946 O WAT 946 19.000 9.000 11.000 1.00 0.00 O -ATOM 947 O WAT 947 19.000 9.000 13.000 1.00 0.00 O -ATOM 948 O WAT 948 19.000 9.000 15.000 1.00 0.00 O -ATOM 949 O WAT 949 19.000 9.000 17.000 1.00 0.00 O -ATOM 950 O WAT 950 19.000 9.000 19.000 1.00 0.00 O -ATOM 951 O WAT 951 19.000 11.000 1.000 1.00 0.00 O -ATOM 952 O WAT 952 19.000 11.000 3.000 1.00 0.00 O -ATOM 953 O WAT 953 19.000 11.000 5.000 1.00 0.00 O -ATOM 954 O WAT 954 19.000 11.000 7.000 1.00 0.00 O -ATOM 955 O WAT 955 19.000 11.000 9.000 1.00 0.00 O -ATOM 956 O WAT 956 19.000 11.000 11.000 1.00 0.00 O -ATOM 957 O WAT 957 19.000 11.000 13.000 1.00 0.00 O -ATOM 958 O WAT 958 19.000 11.000 15.000 1.00 0.00 O -ATOM 959 O WAT 959 19.000 11.000 17.000 1.00 0.00 O -ATOM 960 O WAT 960 19.000 11.000 19.000 1.00 0.00 O -ATOM 961 O WAT 961 19.000 13.000 1.000 1.00 0.00 O -ATOM 962 O WAT 962 19.000 13.000 3.000 1.00 0.00 O -ATOM 963 O WAT 963 19.000 13.000 5.000 1.00 0.00 O -ATOM 964 O WAT 964 19.000 13.000 7.000 1.00 0.00 O -ATOM 965 O WAT 965 19.000 13.000 9.000 1.00 0.00 O -ATOM 966 O WAT 966 19.000 13.000 11.000 1.00 0.00 O -ATOM 967 O WAT 967 19.000 13.000 13.000 1.00 0.00 O -ATOM 968 O WAT 968 19.000 13.000 15.000 1.00 0.00 O -ATOM 969 O WAT 969 19.000 13.000 17.000 1.00 0.00 O -ATOM 970 O WAT 970 19.000 13.000 19.000 1.00 0.00 O -ATOM 971 O WAT 971 19.000 15.000 1.000 1.00 0.00 O -ATOM 972 O WAT 972 19.000 15.000 3.000 1.00 0.00 O -ATOM 973 O WAT 973 19.000 15.000 5.000 1.00 0.00 O -ATOM 974 O WAT 974 19.000 15.000 7.000 1.00 0.00 O -ATOM 975 O WAT 975 19.000 15.000 9.000 1.00 0.00 O -ATOM 976 O WAT 976 19.000 15.000 11.000 1.00 0.00 O -ATOM 977 O WAT 977 19.000 15.000 13.000 1.00 0.00 O -ATOM 978 O WAT 978 19.000 15.000 15.000 1.00 0.00 O -ATOM 979 O WAT 979 19.000 15.000 17.000 1.00 0.00 O -ATOM 980 O WAT 980 19.000 15.000 19.000 1.00 0.00 O -ATOM 981 O WAT 981 19.000 17.000 1.000 1.00 0.00 O -ATOM 982 O WAT 982 19.000 17.000 3.000 1.00 0.00 O -ATOM 983 O WAT 983 19.000 17.000 5.000 1.00 0.00 O -ATOM 984 O WAT 984 19.000 17.000 7.000 1.00 0.00 O -ATOM 985 O WAT 985 19.000 17.000 9.000 1.00 0.00 O -ATOM 986 O WAT 986 19.000 17.000 11.000 1.00 0.00 O -ATOM 987 O WAT 987 19.000 17.000 13.000 1.00 0.00 O -ATOM 988 O WAT 988 19.000 17.000 15.000 1.00 0.00 O -ATOM 989 O WAT 989 19.000 17.000 17.000 1.00 0.00 O -ATOM 990 O WAT 990 19.000 17.000 19.000 1.00 0.00 O -ATOM 991 O WAT 991 19.000 19.000 1.000 1.00 0.00 O -ATOM 992 O WAT 992 19.000 19.000 3.000 1.00 0.00 O -ATOM 993 O WAT 993 19.000 19.000 5.000 1.00 0.00 O -ATOM 994 O WAT 994 19.000 19.000 7.000 1.00 0.00 O -ATOM 995 O WAT 995 19.000 19.000 9.000 1.00 0.00 O -ATOM 996 O WAT 996 19.000 19.000 11.000 1.00 0.00 O -ATOM 997 O WAT 997 19.000 19.000 13.000 1.00 0.00 O -ATOM 998 O WAT 998 19.000 19.000 15.000 1.00 0.00 O -ATOM 999 O WAT 999 19.000 19.000 17.000 1.00 0.00 O -ATOM 1000 O WAT 1000 19.000 19.000 19.000 1.00 0.00 O +REMARK cubic lattice with z-corrugation for surftension tests +ATOM 1 O WAT 1 1.000 1.000 1.029 1.00 0.00 O +ATOM 2 O WAT 2 1.000 1.000 3.029 1.00 0.00 O +ATOM 3 O WAT 3 1.000 1.000 5.029 1.00 0.00 O +ATOM 4 O WAT 4 1.000 1.000 7.029 1.00 0.00 O +ATOM 5 O WAT 5 1.000 1.000 9.029 1.00 0.00 O +ATOM 6 O WAT 6 1.000 1.000 11.029 1.00 0.00 O +ATOM 7 O WAT 7 1.000 1.000 13.029 1.00 0.00 O +ATOM 8 O WAT 8 1.000 1.000 15.029 1.00 0.00 O +ATOM 9 O WAT 9 1.000 1.000 17.029 1.00 0.00 O +ATOM 10 O WAT 10 1.000 1.000 19.029 1.00 0.00 O +ATOM 11 O WAT 11 1.000 3.000 1.075 1.00 0.00 O +ATOM 12 O WAT 12 1.000 3.000 3.075 1.00 0.00 O +ATOM 13 O WAT 13 1.000 3.000 5.075 1.00 0.00 O +ATOM 14 O WAT 14 1.000 3.000 7.075 1.00 0.00 O +ATOM 15 O WAT 15 1.000 3.000 9.075 1.00 0.00 O +ATOM 16 O WAT 16 1.000 3.000 11.075 1.00 0.00 O +ATOM 17 O WAT 17 1.000 3.000 13.075 1.00 0.00 O +ATOM 18 O WAT 18 1.000 3.000 15.075 1.00 0.00 O +ATOM 19 O WAT 19 1.000 3.000 17.075 1.00 0.00 O +ATOM 20 O WAT 20 1.000 3.000 19.075 1.00 0.00 O +ATOM 21 O WAT 21 1.000 5.000 1.093 1.00 0.00 O +ATOM 22 O WAT 22 1.000 5.000 3.093 1.00 0.00 O +ATOM 23 O WAT 23 1.000 5.000 5.093 1.00 0.00 O +ATOM 24 O WAT 24 1.000 5.000 7.093 1.00 0.00 O +ATOM 25 O WAT 25 1.000 5.000 9.093 1.00 0.00 O +ATOM 26 O WAT 26 1.000 5.000 11.093 1.00 0.00 O +ATOM 27 O WAT 27 1.000 5.000 13.093 1.00 0.00 O +ATOM 28 O WAT 28 1.000 5.000 15.093 1.00 0.00 O +ATOM 29 O WAT 29 1.000 5.000 17.093 1.00 0.00 O +ATOM 30 O WAT 30 1.000 5.000 19.093 1.00 0.00 O +ATOM 31 O WAT 31 1.000 7.000 1.075 1.00 0.00 O +ATOM 32 O WAT 32 1.000 7.000 3.075 1.00 0.00 O +ATOM 33 O WAT 33 1.000 7.000 5.075 1.00 0.00 O +ATOM 34 O WAT 34 1.000 7.000 7.075 1.00 0.00 O +ATOM 35 O WAT 35 1.000 7.000 9.075 1.00 0.00 O +ATOM 36 O WAT 36 1.000 7.000 11.075 1.00 0.00 O +ATOM 37 O WAT 37 1.000 7.000 13.075 1.00 0.00 O +ATOM 38 O WAT 38 1.000 7.000 15.075 1.00 0.00 O +ATOM 39 O WAT 39 1.000 7.000 17.075 1.00 0.00 O +ATOM 40 O WAT 40 1.000 7.000 19.075 1.00 0.00 O +ATOM 41 O WAT 41 1.000 9.000 1.029 1.00 0.00 O +ATOM 42 O WAT 42 1.000 9.000 3.029 1.00 0.00 O +ATOM 43 O WAT 43 1.000 9.000 5.029 1.00 0.00 O +ATOM 44 O WAT 44 1.000 9.000 7.029 1.00 0.00 O +ATOM 45 O WAT 45 1.000 9.000 9.029 1.00 0.00 O +ATOM 46 O WAT 46 1.000 9.000 11.029 1.00 0.00 O +ATOM 47 O WAT 47 1.000 9.000 13.029 1.00 0.00 O +ATOM 48 O WAT 48 1.000 9.000 15.029 1.00 0.00 O +ATOM 49 O WAT 49 1.000 9.000 17.029 1.00 0.00 O +ATOM 50 O WAT 50 1.000 9.000 19.029 1.00 0.00 O +ATOM 51 O WAT 51 1.000 11.000 0.971 1.00 0.00 O +ATOM 52 O WAT 52 1.000 11.000 2.971 1.00 0.00 O +ATOM 53 O WAT 53 1.000 11.000 4.971 1.00 0.00 O +ATOM 54 O WAT 54 1.000 11.000 6.971 1.00 0.00 O +ATOM 55 O WAT 55 1.000 11.000 8.971 1.00 0.00 O +ATOM 56 O WAT 56 1.000 11.000 10.971 1.00 0.00 O +ATOM 57 O WAT 57 1.000 11.000 12.971 1.00 0.00 O +ATOM 58 O WAT 58 1.000 11.000 14.971 1.00 0.00 O +ATOM 59 O WAT 59 1.000 11.000 16.971 1.00 0.00 O +ATOM 60 O WAT 60 1.000 11.000 18.971 1.00 0.00 O +ATOM 61 O WAT 61 1.000 13.000 0.925 1.00 0.00 O +ATOM 62 O WAT 62 1.000 13.000 2.925 1.00 0.00 O +ATOM 63 O WAT 63 1.000 13.000 4.925 1.00 0.00 O +ATOM 64 O WAT 64 1.000 13.000 6.925 1.00 0.00 O +ATOM 65 O WAT 65 1.000 13.000 8.925 1.00 0.00 O +ATOM 66 O WAT 66 1.000 13.000 10.925 1.00 0.00 O +ATOM 67 O WAT 67 1.000 13.000 12.925 1.00 0.00 O +ATOM 68 O WAT 68 1.000 13.000 14.925 1.00 0.00 O +ATOM 69 O WAT 69 1.000 13.000 16.925 1.00 0.00 O +ATOM 70 O WAT 70 1.000 13.000 18.925 1.00 0.00 O +ATOM 71 O WAT 71 1.000 15.000 0.907 1.00 0.00 O +ATOM 72 O WAT 72 1.000 15.000 2.907 1.00 0.00 O +ATOM 73 O WAT 73 1.000 15.000 4.907 1.00 0.00 O +ATOM 74 O WAT 74 1.000 15.000 6.907 1.00 0.00 O +ATOM 75 O WAT 75 1.000 15.000 8.907 1.00 0.00 O +ATOM 76 O WAT 76 1.000 15.000 10.907 1.00 0.00 O +ATOM 77 O WAT 77 1.000 15.000 12.907 1.00 0.00 O +ATOM 78 O WAT 78 1.000 15.000 14.907 1.00 0.00 O +ATOM 79 O WAT 79 1.000 15.000 16.907 1.00 0.00 O +ATOM 80 O WAT 80 1.000 15.000 18.907 1.00 0.00 O +ATOM 81 O WAT 81 1.000 17.000 0.925 1.00 0.00 O +ATOM 82 O WAT 82 1.000 17.000 2.925 1.00 0.00 O +ATOM 83 O WAT 83 1.000 17.000 4.925 1.00 0.00 O +ATOM 84 O WAT 84 1.000 17.000 6.925 1.00 0.00 O +ATOM 85 O WAT 85 1.000 17.000 8.925 1.00 0.00 O +ATOM 86 O WAT 86 1.000 17.000 10.925 1.00 0.00 O +ATOM 87 O WAT 87 1.000 17.000 12.925 1.00 0.00 O +ATOM 88 O WAT 88 1.000 17.000 14.925 1.00 0.00 O +ATOM 89 O WAT 89 1.000 17.000 16.925 1.00 0.00 O +ATOM 90 O WAT 90 1.000 17.000 18.925 1.00 0.00 O +ATOM 91 O WAT 91 1.000 19.000 0.971 1.00 0.00 O +ATOM 92 O WAT 92 1.000 19.000 2.971 1.00 0.00 O +ATOM 93 O WAT 93 1.000 19.000 4.971 1.00 0.00 O +ATOM 94 O WAT 94 1.000 19.000 6.971 1.00 0.00 O +ATOM 95 O WAT 95 1.000 19.000 8.971 1.00 0.00 O +ATOM 96 O WAT 96 1.000 19.000 10.971 1.00 0.00 O +ATOM 97 O WAT 97 1.000 19.000 12.971 1.00 0.00 O +ATOM 98 O WAT 98 1.000 19.000 14.971 1.00 0.00 O +ATOM 99 O WAT 99 1.000 19.000 16.971 1.00 0.00 O +ATOM 100 O WAT 100 1.000 19.000 18.971 1.00 0.00 O +ATOM 101 O WAT 101 3.000 1.000 1.075 1.00 0.00 O +ATOM 102 O WAT 102 3.000 1.000 3.075 1.00 0.00 O +ATOM 103 O WAT 103 3.000 1.000 5.075 1.00 0.00 O +ATOM 104 O WAT 104 3.000 1.000 7.075 1.00 0.00 O +ATOM 105 O WAT 105 3.000 1.000 9.075 1.00 0.00 O +ATOM 106 O WAT 106 3.000 1.000 11.075 1.00 0.00 O +ATOM 107 O WAT 107 3.000 1.000 13.075 1.00 0.00 O +ATOM 108 O WAT 108 3.000 1.000 15.075 1.00 0.00 O +ATOM 109 O WAT 109 3.000 1.000 17.075 1.00 0.00 O +ATOM 110 O WAT 110 3.000 1.000 19.075 1.00 0.00 O +ATOM 111 O WAT 111 3.000 3.000 1.196 1.00 0.00 O +ATOM 112 O WAT 112 3.000 3.000 3.196 1.00 0.00 O +ATOM 113 O WAT 113 3.000 3.000 5.196 1.00 0.00 O +ATOM 114 O WAT 114 3.000 3.000 7.196 1.00 0.00 O +ATOM 115 O WAT 115 3.000 3.000 9.196 1.00 0.00 O +ATOM 116 O WAT 116 3.000 3.000 11.196 1.00 0.00 O +ATOM 117 O WAT 117 3.000 3.000 13.196 1.00 0.00 O +ATOM 118 O WAT 118 3.000 3.000 15.196 1.00 0.00 O +ATOM 119 O WAT 119 3.000 3.000 17.196 1.00 0.00 O +ATOM 120 O WAT 120 3.000 3.000 19.196 1.00 0.00 O +ATOM 121 O WAT 121 3.000 5.000 1.243 1.00 0.00 O +ATOM 122 O WAT 122 3.000 5.000 3.243 1.00 0.00 O +ATOM 123 O WAT 123 3.000 5.000 5.243 1.00 0.00 O +ATOM 124 O WAT 124 3.000 5.000 7.243 1.00 0.00 O +ATOM 125 O WAT 125 3.000 5.000 9.243 1.00 0.00 O +ATOM 126 O WAT 126 3.000 5.000 11.243 1.00 0.00 O +ATOM 127 O WAT 127 3.000 5.000 13.243 1.00 0.00 O +ATOM 128 O WAT 128 3.000 5.000 15.243 1.00 0.00 O +ATOM 129 O WAT 129 3.000 5.000 17.243 1.00 0.00 O +ATOM 130 O WAT 130 3.000 5.000 19.243 1.00 0.00 O +ATOM 131 O WAT 131 3.000 7.000 1.196 1.00 0.00 O +ATOM 132 O WAT 132 3.000 7.000 3.196 1.00 0.00 O +ATOM 133 O WAT 133 3.000 7.000 5.196 1.00 0.00 O +ATOM 134 O WAT 134 3.000 7.000 7.196 1.00 0.00 O +ATOM 135 O WAT 135 3.000 7.000 9.196 1.00 0.00 O +ATOM 136 O WAT 136 3.000 7.000 11.196 1.00 0.00 O +ATOM 137 O WAT 137 3.000 7.000 13.196 1.00 0.00 O +ATOM 138 O WAT 138 3.000 7.000 15.196 1.00 0.00 O +ATOM 139 O WAT 139 3.000 7.000 17.196 1.00 0.00 O +ATOM 140 O WAT 140 3.000 7.000 19.196 1.00 0.00 O +ATOM 141 O WAT 141 3.000 9.000 1.075 1.00 0.00 O +ATOM 142 O WAT 142 3.000 9.000 3.075 1.00 0.00 O +ATOM 143 O WAT 143 3.000 9.000 5.075 1.00 0.00 O +ATOM 144 O WAT 144 3.000 9.000 7.075 1.00 0.00 O +ATOM 145 O WAT 145 3.000 9.000 9.075 1.00 0.00 O +ATOM 146 O WAT 146 3.000 9.000 11.075 1.00 0.00 O +ATOM 147 O WAT 147 3.000 9.000 13.075 1.00 0.00 O +ATOM 148 O WAT 148 3.000 9.000 15.075 1.00 0.00 O +ATOM 149 O WAT 149 3.000 9.000 17.075 1.00 0.00 O +ATOM 150 O WAT 150 3.000 9.000 19.075 1.00 0.00 O +ATOM 151 O WAT 151 3.000 11.000 0.925 1.00 0.00 O +ATOM 152 O WAT 152 3.000 11.000 2.925 1.00 0.00 O +ATOM 153 O WAT 153 3.000 11.000 4.925 1.00 0.00 O +ATOM 154 O WAT 154 3.000 11.000 6.925 1.00 0.00 O +ATOM 155 O WAT 155 3.000 11.000 8.925 1.00 0.00 O +ATOM 156 O WAT 156 3.000 11.000 10.925 1.00 0.00 O +ATOM 157 O WAT 157 3.000 11.000 12.925 1.00 0.00 O +ATOM 158 O WAT 158 3.000 11.000 14.925 1.00 0.00 O +ATOM 159 O WAT 159 3.000 11.000 16.925 1.00 0.00 O +ATOM 160 O WAT 160 3.000 11.000 18.925 1.00 0.00 O +ATOM 161 O WAT 161 3.000 13.000 0.804 1.00 0.00 O +ATOM 162 O WAT 162 3.000 13.000 2.804 1.00 0.00 O +ATOM 163 O WAT 163 3.000 13.000 4.804 1.00 0.00 O +ATOM 164 O WAT 164 3.000 13.000 6.804 1.00 0.00 O +ATOM 165 O WAT 165 3.000 13.000 8.804 1.00 0.00 O +ATOM 166 O WAT 166 3.000 13.000 10.804 1.00 0.00 O +ATOM 167 O WAT 167 3.000 13.000 12.804 1.00 0.00 O +ATOM 168 O WAT 168 3.000 13.000 14.804 1.00 0.00 O +ATOM 169 O WAT 169 3.000 13.000 16.804 1.00 0.00 O +ATOM 170 O WAT 170 3.000 13.000 18.804 1.00 0.00 O +ATOM 171 O WAT 171 3.000 15.000 0.757 1.00 0.00 O +ATOM 172 O WAT 172 3.000 15.000 2.757 1.00 0.00 O +ATOM 173 O WAT 173 3.000 15.000 4.757 1.00 0.00 O +ATOM 174 O WAT 174 3.000 15.000 6.757 1.00 0.00 O +ATOM 175 O WAT 175 3.000 15.000 8.757 1.00 0.00 O +ATOM 176 O WAT 176 3.000 15.000 10.757 1.00 0.00 O +ATOM 177 O WAT 177 3.000 15.000 12.757 1.00 0.00 O +ATOM 178 O WAT 178 3.000 15.000 14.757 1.00 0.00 O +ATOM 179 O WAT 179 3.000 15.000 16.757 1.00 0.00 O +ATOM 180 O WAT 180 3.000 15.000 18.757 1.00 0.00 O +ATOM 181 O WAT 181 3.000 17.000 0.804 1.00 0.00 O +ATOM 182 O WAT 182 3.000 17.000 2.804 1.00 0.00 O +ATOM 183 O WAT 183 3.000 17.000 4.804 1.00 0.00 O +ATOM 184 O WAT 184 3.000 17.000 6.804 1.00 0.00 O +ATOM 185 O WAT 185 3.000 17.000 8.804 1.00 0.00 O +ATOM 186 O WAT 186 3.000 17.000 10.804 1.00 0.00 O +ATOM 187 O WAT 187 3.000 17.000 12.804 1.00 0.00 O +ATOM 188 O WAT 188 3.000 17.000 14.804 1.00 0.00 O +ATOM 189 O WAT 189 3.000 17.000 16.804 1.00 0.00 O +ATOM 190 O WAT 190 3.000 17.000 18.804 1.00 0.00 O +ATOM 191 O WAT 191 3.000 19.000 0.925 1.00 0.00 O +ATOM 192 O WAT 192 3.000 19.000 2.925 1.00 0.00 O +ATOM 193 O WAT 193 3.000 19.000 4.925 1.00 0.00 O +ATOM 194 O WAT 194 3.000 19.000 6.925 1.00 0.00 O +ATOM 195 O WAT 195 3.000 19.000 8.925 1.00 0.00 O +ATOM 196 O WAT 196 3.000 19.000 10.925 1.00 0.00 O +ATOM 197 O WAT 197 3.000 19.000 12.925 1.00 0.00 O +ATOM 198 O WAT 198 3.000 19.000 14.925 1.00 0.00 O +ATOM 199 O WAT 199 3.000 19.000 16.925 1.00 0.00 O +ATOM 200 O WAT 200 3.000 19.000 18.925 1.00 0.00 O +ATOM 201 O WAT 201 5.000 1.000 1.093 1.00 0.00 O +ATOM 202 O WAT 202 5.000 1.000 3.093 1.00 0.00 O +ATOM 203 O WAT 203 5.000 1.000 5.093 1.00 0.00 O +ATOM 204 O WAT 204 5.000 1.000 7.093 1.00 0.00 O +ATOM 205 O WAT 205 5.000 1.000 9.093 1.00 0.00 O +ATOM 206 O WAT 206 5.000 1.000 11.093 1.00 0.00 O +ATOM 207 O WAT 207 5.000 1.000 13.093 1.00 0.00 O +ATOM 208 O WAT 208 5.000 1.000 15.093 1.00 0.00 O +ATOM 209 O WAT 209 5.000 1.000 17.093 1.00 0.00 O +ATOM 210 O WAT 210 5.000 1.000 19.093 1.00 0.00 O +ATOM 211 O WAT 211 5.000 3.000 1.243 1.00 0.00 O +ATOM 212 O WAT 212 5.000 3.000 3.243 1.00 0.00 O +ATOM 213 O WAT 213 5.000 3.000 5.243 1.00 0.00 O +ATOM 214 O WAT 214 5.000 3.000 7.243 1.00 0.00 O +ATOM 215 O WAT 215 5.000 3.000 9.243 1.00 0.00 O +ATOM 216 O WAT 216 5.000 3.000 11.243 1.00 0.00 O +ATOM 217 O WAT 217 5.000 3.000 13.243 1.00 0.00 O +ATOM 218 O WAT 218 5.000 3.000 15.243 1.00 0.00 O +ATOM 219 O WAT 219 5.000 3.000 17.243 1.00 0.00 O +ATOM 220 O WAT 220 5.000 3.000 19.243 1.00 0.00 O +ATOM 221 O WAT 221 5.000 5.000 1.300 1.00 0.00 O +ATOM 222 O WAT 222 5.000 5.000 3.300 1.00 0.00 O +ATOM 223 O WAT 223 5.000 5.000 5.300 1.00 0.00 O +ATOM 224 O WAT 224 5.000 5.000 7.300 1.00 0.00 O +ATOM 225 O WAT 225 5.000 5.000 9.300 1.00 0.00 O +ATOM 226 O WAT 226 5.000 5.000 11.300 1.00 0.00 O +ATOM 227 O WAT 227 5.000 5.000 13.300 1.00 0.00 O +ATOM 228 O WAT 228 5.000 5.000 15.300 1.00 0.00 O +ATOM 229 O WAT 229 5.000 5.000 17.300 1.00 0.00 O +ATOM 230 O WAT 230 5.000 5.000 19.300 1.00 0.00 O +ATOM 231 O WAT 231 5.000 7.000 1.243 1.00 0.00 O +ATOM 232 O WAT 232 5.000 7.000 3.243 1.00 0.00 O +ATOM 233 O WAT 233 5.000 7.000 5.243 1.00 0.00 O +ATOM 234 O WAT 234 5.000 7.000 7.243 1.00 0.00 O +ATOM 235 O WAT 235 5.000 7.000 9.243 1.00 0.00 O +ATOM 236 O WAT 236 5.000 7.000 11.243 1.00 0.00 O +ATOM 237 O WAT 237 5.000 7.000 13.243 1.00 0.00 O +ATOM 238 O WAT 238 5.000 7.000 15.243 1.00 0.00 O +ATOM 239 O WAT 239 5.000 7.000 17.243 1.00 0.00 O +ATOM 240 O WAT 240 5.000 7.000 19.243 1.00 0.00 O +ATOM 241 O WAT 241 5.000 9.000 1.093 1.00 0.00 O +ATOM 242 O WAT 242 5.000 9.000 3.093 1.00 0.00 O +ATOM 243 O WAT 243 5.000 9.000 5.093 1.00 0.00 O +ATOM 244 O WAT 244 5.000 9.000 7.093 1.00 0.00 O +ATOM 245 O WAT 245 5.000 9.000 9.093 1.00 0.00 O +ATOM 246 O WAT 246 5.000 9.000 11.093 1.00 0.00 O +ATOM 247 O WAT 247 5.000 9.000 13.093 1.00 0.00 O +ATOM 248 O WAT 248 5.000 9.000 15.093 1.00 0.00 O +ATOM 249 O WAT 249 5.000 9.000 17.093 1.00 0.00 O +ATOM 250 O WAT 250 5.000 9.000 19.093 1.00 0.00 O +ATOM 251 O WAT 251 5.000 11.000 0.907 1.00 0.00 O +ATOM 252 O WAT 252 5.000 11.000 2.907 1.00 0.00 O +ATOM 253 O WAT 253 5.000 11.000 4.907 1.00 0.00 O +ATOM 254 O WAT 254 5.000 11.000 6.907 1.00 0.00 O +ATOM 255 O WAT 255 5.000 11.000 8.907 1.00 0.00 O +ATOM 256 O WAT 256 5.000 11.000 10.907 1.00 0.00 O +ATOM 257 O WAT 257 5.000 11.000 12.907 1.00 0.00 O +ATOM 258 O WAT 258 5.000 11.000 14.907 1.00 0.00 O +ATOM 259 O WAT 259 5.000 11.000 16.907 1.00 0.00 O +ATOM 260 O WAT 260 5.000 11.000 18.907 1.00 0.00 O +ATOM 261 O WAT 261 5.000 13.000 0.757 1.00 0.00 O +ATOM 262 O WAT 262 5.000 13.000 2.757 1.00 0.00 O +ATOM 263 O WAT 263 5.000 13.000 4.757 1.00 0.00 O +ATOM 264 O WAT 264 5.000 13.000 6.757 1.00 0.00 O +ATOM 265 O WAT 265 5.000 13.000 8.757 1.00 0.00 O +ATOM 266 O WAT 266 5.000 13.000 10.757 1.00 0.00 O +ATOM 267 O WAT 267 5.000 13.000 12.757 1.00 0.00 O +ATOM 268 O WAT 268 5.000 13.000 14.757 1.00 0.00 O +ATOM 269 O WAT 269 5.000 13.000 16.757 1.00 0.00 O +ATOM 270 O WAT 270 5.000 13.000 18.757 1.00 0.00 O +ATOM 271 O WAT 271 5.000 15.000 0.700 1.00 0.00 O +ATOM 272 O WAT 272 5.000 15.000 2.700 1.00 0.00 O +ATOM 273 O WAT 273 5.000 15.000 4.700 1.00 0.00 O +ATOM 274 O WAT 274 5.000 15.000 6.700 1.00 0.00 O +ATOM 275 O WAT 275 5.000 15.000 8.700 1.00 0.00 O +ATOM 276 O WAT 276 5.000 15.000 10.700 1.00 0.00 O +ATOM 277 O WAT 277 5.000 15.000 12.700 1.00 0.00 O +ATOM 278 O WAT 278 5.000 15.000 14.700 1.00 0.00 O +ATOM 279 O WAT 279 5.000 15.000 16.700 1.00 0.00 O +ATOM 280 O WAT 280 5.000 15.000 18.700 1.00 0.00 O +ATOM 281 O WAT 281 5.000 17.000 0.757 1.00 0.00 O +ATOM 282 O WAT 282 5.000 17.000 2.757 1.00 0.00 O +ATOM 283 O WAT 283 5.000 17.000 4.757 1.00 0.00 O +ATOM 284 O WAT 284 5.000 17.000 6.757 1.00 0.00 O +ATOM 285 O WAT 285 5.000 17.000 8.757 1.00 0.00 O +ATOM 286 O WAT 286 5.000 17.000 10.757 1.00 0.00 O +ATOM 287 O WAT 287 5.000 17.000 12.757 1.00 0.00 O +ATOM 288 O WAT 288 5.000 17.000 14.757 1.00 0.00 O +ATOM 289 O WAT 289 5.000 17.000 16.757 1.00 0.00 O +ATOM 290 O WAT 290 5.000 17.000 18.757 1.00 0.00 O +ATOM 291 O WAT 291 5.000 19.000 0.907 1.00 0.00 O +ATOM 292 O WAT 292 5.000 19.000 2.907 1.00 0.00 O +ATOM 293 O WAT 293 5.000 19.000 4.907 1.00 0.00 O +ATOM 294 O WAT 294 5.000 19.000 6.907 1.00 0.00 O +ATOM 295 O WAT 295 5.000 19.000 8.907 1.00 0.00 O +ATOM 296 O WAT 296 5.000 19.000 10.907 1.00 0.00 O +ATOM 297 O WAT 297 5.000 19.000 12.907 1.00 0.00 O +ATOM 298 O WAT 298 5.000 19.000 14.907 1.00 0.00 O +ATOM 299 O WAT 299 5.000 19.000 16.907 1.00 0.00 O +ATOM 300 O WAT 300 5.000 19.000 18.907 1.00 0.00 O +ATOM 301 O WAT 301 7.000 1.000 1.075 1.00 0.00 O +ATOM 302 O WAT 302 7.000 1.000 3.075 1.00 0.00 O +ATOM 303 O WAT 303 7.000 1.000 5.075 1.00 0.00 O +ATOM 304 O WAT 304 7.000 1.000 7.075 1.00 0.00 O +ATOM 305 O WAT 305 7.000 1.000 9.075 1.00 0.00 O +ATOM 306 O WAT 306 7.000 1.000 11.075 1.00 0.00 O +ATOM 307 O WAT 307 7.000 1.000 13.075 1.00 0.00 O +ATOM 308 O WAT 308 7.000 1.000 15.075 1.00 0.00 O +ATOM 309 O WAT 309 7.000 1.000 17.075 1.00 0.00 O +ATOM 310 O WAT 310 7.000 1.000 19.075 1.00 0.00 O +ATOM 311 O WAT 311 7.000 3.000 1.196 1.00 0.00 O +ATOM 312 O WAT 312 7.000 3.000 3.196 1.00 0.00 O +ATOM 313 O WAT 313 7.000 3.000 5.196 1.00 0.00 O +ATOM 314 O WAT 314 7.000 3.000 7.196 1.00 0.00 O +ATOM 315 O WAT 315 7.000 3.000 9.196 1.00 0.00 O +ATOM 316 O WAT 316 7.000 3.000 11.196 1.00 0.00 O +ATOM 317 O WAT 317 7.000 3.000 13.196 1.00 0.00 O +ATOM 318 O WAT 318 7.000 3.000 15.196 1.00 0.00 O +ATOM 319 O WAT 319 7.000 3.000 17.196 1.00 0.00 O +ATOM 320 O WAT 320 7.000 3.000 19.196 1.00 0.00 O +ATOM 321 O WAT 321 7.000 5.000 1.243 1.00 0.00 O +ATOM 322 O WAT 322 7.000 5.000 3.243 1.00 0.00 O +ATOM 323 O WAT 323 7.000 5.000 5.243 1.00 0.00 O +ATOM 324 O WAT 324 7.000 5.000 7.243 1.00 0.00 O +ATOM 325 O WAT 325 7.000 5.000 9.243 1.00 0.00 O +ATOM 326 O WAT 326 7.000 5.000 11.243 1.00 0.00 O +ATOM 327 O WAT 327 7.000 5.000 13.243 1.00 0.00 O +ATOM 328 O WAT 328 7.000 5.000 15.243 1.00 0.00 O +ATOM 329 O WAT 329 7.000 5.000 17.243 1.00 0.00 O +ATOM 330 O WAT 330 7.000 5.000 19.243 1.00 0.00 O +ATOM 331 O WAT 331 7.000 7.000 1.196 1.00 0.00 O +ATOM 332 O WAT 332 7.000 7.000 3.196 1.00 0.00 O +ATOM 333 O WAT 333 7.000 7.000 5.196 1.00 0.00 O +ATOM 334 O WAT 334 7.000 7.000 7.196 1.00 0.00 O +ATOM 335 O WAT 335 7.000 7.000 9.196 1.00 0.00 O +ATOM 336 O WAT 336 7.000 7.000 11.196 1.00 0.00 O +ATOM 337 O WAT 337 7.000 7.000 13.196 1.00 0.00 O +ATOM 338 O WAT 338 7.000 7.000 15.196 1.00 0.00 O +ATOM 339 O WAT 339 7.000 7.000 17.196 1.00 0.00 O +ATOM 340 O WAT 340 7.000 7.000 19.196 1.00 0.00 O +ATOM 341 O WAT 341 7.000 9.000 1.075 1.00 0.00 O +ATOM 342 O WAT 342 7.000 9.000 3.075 1.00 0.00 O +ATOM 343 O WAT 343 7.000 9.000 5.075 1.00 0.00 O +ATOM 344 O WAT 344 7.000 9.000 7.075 1.00 0.00 O +ATOM 345 O WAT 345 7.000 9.000 9.075 1.00 0.00 O +ATOM 346 O WAT 346 7.000 9.000 11.075 1.00 0.00 O +ATOM 347 O WAT 347 7.000 9.000 13.075 1.00 0.00 O +ATOM 348 O WAT 348 7.000 9.000 15.075 1.00 0.00 O +ATOM 349 O WAT 349 7.000 9.000 17.075 1.00 0.00 O +ATOM 350 O WAT 350 7.000 9.000 19.075 1.00 0.00 O +ATOM 351 O WAT 351 7.000 11.000 0.925 1.00 0.00 O +ATOM 352 O WAT 352 7.000 11.000 2.925 1.00 0.00 O +ATOM 353 O WAT 353 7.000 11.000 4.925 1.00 0.00 O +ATOM 354 O WAT 354 7.000 11.000 6.925 1.00 0.00 O +ATOM 355 O WAT 355 7.000 11.000 8.925 1.00 0.00 O +ATOM 356 O WAT 356 7.000 11.000 10.925 1.00 0.00 O +ATOM 357 O WAT 357 7.000 11.000 12.925 1.00 0.00 O +ATOM 358 O WAT 358 7.000 11.000 14.925 1.00 0.00 O +ATOM 359 O WAT 359 7.000 11.000 16.925 1.00 0.00 O +ATOM 360 O WAT 360 7.000 11.000 18.925 1.00 0.00 O +ATOM 361 O WAT 361 7.000 13.000 0.804 1.00 0.00 O +ATOM 362 O WAT 362 7.000 13.000 2.804 1.00 0.00 O +ATOM 363 O WAT 363 7.000 13.000 4.804 1.00 0.00 O +ATOM 364 O WAT 364 7.000 13.000 6.804 1.00 0.00 O +ATOM 365 O WAT 365 7.000 13.000 8.804 1.00 0.00 O +ATOM 366 O WAT 366 7.000 13.000 10.804 1.00 0.00 O +ATOM 367 O WAT 367 7.000 13.000 12.804 1.00 0.00 O +ATOM 368 O WAT 368 7.000 13.000 14.804 1.00 0.00 O +ATOM 369 O WAT 369 7.000 13.000 16.804 1.00 0.00 O +ATOM 370 O WAT 370 7.000 13.000 18.804 1.00 0.00 O +ATOM 371 O WAT 371 7.000 15.000 0.757 1.00 0.00 O +ATOM 372 O WAT 372 7.000 15.000 2.757 1.00 0.00 O +ATOM 373 O WAT 373 7.000 15.000 4.757 1.00 0.00 O +ATOM 374 O WAT 374 7.000 15.000 6.757 1.00 0.00 O +ATOM 375 O WAT 375 7.000 15.000 8.757 1.00 0.00 O +ATOM 376 O WAT 376 7.000 15.000 10.757 1.00 0.00 O +ATOM 377 O WAT 377 7.000 15.000 12.757 1.00 0.00 O +ATOM 378 O WAT 378 7.000 15.000 14.757 1.00 0.00 O +ATOM 379 O WAT 379 7.000 15.000 16.757 1.00 0.00 O +ATOM 380 O WAT 380 7.000 15.000 18.757 1.00 0.00 O +ATOM 381 O WAT 381 7.000 17.000 0.804 1.00 0.00 O +ATOM 382 O WAT 382 7.000 17.000 2.804 1.00 0.00 O +ATOM 383 O WAT 383 7.000 17.000 4.804 1.00 0.00 O +ATOM 384 O WAT 384 7.000 17.000 6.804 1.00 0.00 O +ATOM 385 O WAT 385 7.000 17.000 8.804 1.00 0.00 O +ATOM 386 O WAT 386 7.000 17.000 10.804 1.00 0.00 O +ATOM 387 O WAT 387 7.000 17.000 12.804 1.00 0.00 O +ATOM 388 O WAT 388 7.000 17.000 14.804 1.00 0.00 O +ATOM 389 O WAT 389 7.000 17.000 16.804 1.00 0.00 O +ATOM 390 O WAT 390 7.000 17.000 18.804 1.00 0.00 O +ATOM 391 O WAT 391 7.000 19.000 0.925 1.00 0.00 O +ATOM 392 O WAT 392 7.000 19.000 2.925 1.00 0.00 O +ATOM 393 O WAT 393 7.000 19.000 4.925 1.00 0.00 O +ATOM 394 O WAT 394 7.000 19.000 6.925 1.00 0.00 O +ATOM 395 O WAT 395 7.000 19.000 8.925 1.00 0.00 O +ATOM 396 O WAT 396 7.000 19.000 10.925 1.00 0.00 O +ATOM 397 O WAT 397 7.000 19.000 12.925 1.00 0.00 O +ATOM 398 O WAT 398 7.000 19.000 14.925 1.00 0.00 O +ATOM 399 O WAT 399 7.000 19.000 16.925 1.00 0.00 O +ATOM 400 O WAT 400 7.000 19.000 18.925 1.00 0.00 O +ATOM 401 O WAT 401 9.000 1.000 1.029 1.00 0.00 O +ATOM 402 O WAT 402 9.000 1.000 3.029 1.00 0.00 O +ATOM 403 O WAT 403 9.000 1.000 5.029 1.00 0.00 O +ATOM 404 O WAT 404 9.000 1.000 7.029 1.00 0.00 O +ATOM 405 O WAT 405 9.000 1.000 9.029 1.00 0.00 O +ATOM 406 O WAT 406 9.000 1.000 11.029 1.00 0.00 O +ATOM 407 O WAT 407 9.000 1.000 13.029 1.00 0.00 O +ATOM 408 O WAT 408 9.000 1.000 15.029 1.00 0.00 O +ATOM 409 O WAT 409 9.000 1.000 17.029 1.00 0.00 O +ATOM 410 O WAT 410 9.000 1.000 19.029 1.00 0.00 O +ATOM 411 O WAT 411 9.000 3.000 1.075 1.00 0.00 O +ATOM 412 O WAT 412 9.000 3.000 3.075 1.00 0.00 O +ATOM 413 O WAT 413 9.000 3.000 5.075 1.00 0.00 O +ATOM 414 O WAT 414 9.000 3.000 7.075 1.00 0.00 O +ATOM 415 O WAT 415 9.000 3.000 9.075 1.00 0.00 O +ATOM 416 O WAT 416 9.000 3.000 11.075 1.00 0.00 O +ATOM 417 O WAT 417 9.000 3.000 13.075 1.00 0.00 O +ATOM 418 O WAT 418 9.000 3.000 15.075 1.00 0.00 O +ATOM 419 O WAT 419 9.000 3.000 17.075 1.00 0.00 O +ATOM 420 O WAT 420 9.000 3.000 19.075 1.00 0.00 O +ATOM 421 O WAT 421 9.000 5.000 1.093 1.00 0.00 O +ATOM 422 O WAT 422 9.000 5.000 3.093 1.00 0.00 O +ATOM 423 O WAT 423 9.000 5.000 5.093 1.00 0.00 O +ATOM 424 O WAT 424 9.000 5.000 7.093 1.00 0.00 O +ATOM 425 O WAT 425 9.000 5.000 9.093 1.00 0.00 O +ATOM 426 O WAT 426 9.000 5.000 11.093 1.00 0.00 O +ATOM 427 O WAT 427 9.000 5.000 13.093 1.00 0.00 O +ATOM 428 O WAT 428 9.000 5.000 15.093 1.00 0.00 O +ATOM 429 O WAT 429 9.000 5.000 17.093 1.00 0.00 O +ATOM 430 O WAT 430 9.000 5.000 19.093 1.00 0.00 O +ATOM 431 O WAT 431 9.000 7.000 1.075 1.00 0.00 O +ATOM 432 O WAT 432 9.000 7.000 3.075 1.00 0.00 O +ATOM 433 O WAT 433 9.000 7.000 5.075 1.00 0.00 O +ATOM 434 O WAT 434 9.000 7.000 7.075 1.00 0.00 O +ATOM 435 O WAT 435 9.000 7.000 9.075 1.00 0.00 O +ATOM 436 O WAT 436 9.000 7.000 11.075 1.00 0.00 O +ATOM 437 O WAT 437 9.000 7.000 13.075 1.00 0.00 O +ATOM 438 O WAT 438 9.000 7.000 15.075 1.00 0.00 O +ATOM 439 O WAT 439 9.000 7.000 17.075 1.00 0.00 O +ATOM 440 O WAT 440 9.000 7.000 19.075 1.00 0.00 O +ATOM 441 O WAT 441 9.000 9.000 1.029 1.00 0.00 O +ATOM 442 O WAT 442 9.000 9.000 3.029 1.00 0.00 O +ATOM 443 O WAT 443 9.000 9.000 5.029 1.00 0.00 O +ATOM 444 O WAT 444 9.000 9.000 7.029 1.00 0.00 O +ATOM 445 O WAT 445 9.000 9.000 9.029 1.00 0.00 O +ATOM 446 O WAT 446 9.000 9.000 11.029 1.00 0.00 O +ATOM 447 O WAT 447 9.000 9.000 13.029 1.00 0.00 O +ATOM 448 O WAT 448 9.000 9.000 15.029 1.00 0.00 O +ATOM 449 O WAT 449 9.000 9.000 17.029 1.00 0.00 O +ATOM 450 O WAT 450 9.000 9.000 19.029 1.00 0.00 O +ATOM 451 O WAT 451 9.000 11.000 0.971 1.00 0.00 O +ATOM 452 O WAT 452 9.000 11.000 2.971 1.00 0.00 O +ATOM 453 O WAT 453 9.000 11.000 4.971 1.00 0.00 O +ATOM 454 O WAT 454 9.000 11.000 6.971 1.00 0.00 O +ATOM 455 O WAT 455 9.000 11.000 8.971 1.00 0.00 O +ATOM 456 O WAT 456 9.000 11.000 10.971 1.00 0.00 O +ATOM 457 O WAT 457 9.000 11.000 12.971 1.00 0.00 O +ATOM 458 O WAT 458 9.000 11.000 14.971 1.00 0.00 O +ATOM 459 O WAT 459 9.000 11.000 16.971 1.00 0.00 O +ATOM 460 O WAT 460 9.000 11.000 18.971 1.00 0.00 O +ATOM 461 O WAT 461 9.000 13.000 0.925 1.00 0.00 O +ATOM 462 O WAT 462 9.000 13.000 2.925 1.00 0.00 O +ATOM 463 O WAT 463 9.000 13.000 4.925 1.00 0.00 O +ATOM 464 O WAT 464 9.000 13.000 6.925 1.00 0.00 O +ATOM 465 O WAT 465 9.000 13.000 8.925 1.00 0.00 O +ATOM 466 O WAT 466 9.000 13.000 10.925 1.00 0.00 O +ATOM 467 O WAT 467 9.000 13.000 12.925 1.00 0.00 O +ATOM 468 O WAT 468 9.000 13.000 14.925 1.00 0.00 O +ATOM 469 O WAT 469 9.000 13.000 16.925 1.00 0.00 O +ATOM 470 O WAT 470 9.000 13.000 18.925 1.00 0.00 O +ATOM 471 O WAT 471 9.000 15.000 0.907 1.00 0.00 O +ATOM 472 O WAT 472 9.000 15.000 2.907 1.00 0.00 O +ATOM 473 O WAT 473 9.000 15.000 4.907 1.00 0.00 O +ATOM 474 O WAT 474 9.000 15.000 6.907 1.00 0.00 O +ATOM 475 O WAT 475 9.000 15.000 8.907 1.00 0.00 O +ATOM 476 O WAT 476 9.000 15.000 10.907 1.00 0.00 O +ATOM 477 O WAT 477 9.000 15.000 12.907 1.00 0.00 O +ATOM 478 O WAT 478 9.000 15.000 14.907 1.00 0.00 O +ATOM 479 O WAT 479 9.000 15.000 16.907 1.00 0.00 O +ATOM 480 O WAT 480 9.000 15.000 18.907 1.00 0.00 O +ATOM 481 O WAT 481 9.000 17.000 0.925 1.00 0.00 O +ATOM 482 O WAT 482 9.000 17.000 2.925 1.00 0.00 O +ATOM 483 O WAT 483 9.000 17.000 4.925 1.00 0.00 O +ATOM 484 O WAT 484 9.000 17.000 6.925 1.00 0.00 O +ATOM 485 O WAT 485 9.000 17.000 8.925 1.00 0.00 O +ATOM 486 O WAT 486 9.000 17.000 10.925 1.00 0.00 O +ATOM 487 O WAT 487 9.000 17.000 12.925 1.00 0.00 O +ATOM 488 O WAT 488 9.000 17.000 14.925 1.00 0.00 O +ATOM 489 O WAT 489 9.000 17.000 16.925 1.00 0.00 O +ATOM 490 O WAT 490 9.000 17.000 18.925 1.00 0.00 O +ATOM 491 O WAT 491 9.000 19.000 0.971 1.00 0.00 O +ATOM 492 O WAT 492 9.000 19.000 2.971 1.00 0.00 O +ATOM 493 O WAT 493 9.000 19.000 4.971 1.00 0.00 O +ATOM 494 O WAT 494 9.000 19.000 6.971 1.00 0.00 O +ATOM 495 O WAT 495 9.000 19.000 8.971 1.00 0.00 O +ATOM 496 O WAT 496 9.000 19.000 10.971 1.00 0.00 O +ATOM 497 O WAT 497 9.000 19.000 12.971 1.00 0.00 O +ATOM 498 O WAT 498 9.000 19.000 14.971 1.00 0.00 O +ATOM 499 O WAT 499 9.000 19.000 16.971 1.00 0.00 O +ATOM 500 O WAT 500 9.000 19.000 18.971 1.00 0.00 O +ATOM 501 O WAT 501 11.000 1.000 0.971 1.00 0.00 O +ATOM 502 O WAT 502 11.000 1.000 2.971 1.00 0.00 O +ATOM 503 O WAT 503 11.000 1.000 4.971 1.00 0.00 O +ATOM 504 O WAT 504 11.000 1.000 6.971 1.00 0.00 O +ATOM 505 O WAT 505 11.000 1.000 8.971 1.00 0.00 O +ATOM 506 O WAT 506 11.000 1.000 10.971 1.00 0.00 O +ATOM 507 O WAT 507 11.000 1.000 12.971 1.00 0.00 O +ATOM 508 O WAT 508 11.000 1.000 14.971 1.00 0.00 O +ATOM 509 O WAT 509 11.000 1.000 16.971 1.00 0.00 O +ATOM 510 O WAT 510 11.000 1.000 18.971 1.00 0.00 O +ATOM 511 O WAT 511 11.000 3.000 0.925 1.00 0.00 O +ATOM 512 O WAT 512 11.000 3.000 2.925 1.00 0.00 O +ATOM 513 O WAT 513 11.000 3.000 4.925 1.00 0.00 O +ATOM 514 O WAT 514 11.000 3.000 6.925 1.00 0.00 O +ATOM 515 O WAT 515 11.000 3.000 8.925 1.00 0.00 O +ATOM 516 O WAT 516 11.000 3.000 10.925 1.00 0.00 O +ATOM 517 O WAT 517 11.000 3.000 12.925 1.00 0.00 O +ATOM 518 O WAT 518 11.000 3.000 14.925 1.00 0.00 O +ATOM 519 O WAT 519 11.000 3.000 16.925 1.00 0.00 O +ATOM 520 O WAT 520 11.000 3.000 18.925 1.00 0.00 O +ATOM 521 O WAT 521 11.000 5.000 0.907 1.00 0.00 O +ATOM 522 O WAT 522 11.000 5.000 2.907 1.00 0.00 O +ATOM 523 O WAT 523 11.000 5.000 4.907 1.00 0.00 O +ATOM 524 O WAT 524 11.000 5.000 6.907 1.00 0.00 O +ATOM 525 O WAT 525 11.000 5.000 8.907 1.00 0.00 O +ATOM 526 O WAT 526 11.000 5.000 10.907 1.00 0.00 O +ATOM 527 O WAT 527 11.000 5.000 12.907 1.00 0.00 O +ATOM 528 O WAT 528 11.000 5.000 14.907 1.00 0.00 O +ATOM 529 O WAT 529 11.000 5.000 16.907 1.00 0.00 O +ATOM 530 O WAT 530 11.000 5.000 18.907 1.00 0.00 O +ATOM 531 O WAT 531 11.000 7.000 0.925 1.00 0.00 O +ATOM 532 O WAT 532 11.000 7.000 2.925 1.00 0.00 O +ATOM 533 O WAT 533 11.000 7.000 4.925 1.00 0.00 O +ATOM 534 O WAT 534 11.000 7.000 6.925 1.00 0.00 O +ATOM 535 O WAT 535 11.000 7.000 8.925 1.00 0.00 O +ATOM 536 O WAT 536 11.000 7.000 10.925 1.00 0.00 O +ATOM 537 O WAT 537 11.000 7.000 12.925 1.00 0.00 O +ATOM 538 O WAT 538 11.000 7.000 14.925 1.00 0.00 O +ATOM 539 O WAT 539 11.000 7.000 16.925 1.00 0.00 O +ATOM 540 O WAT 540 11.000 7.000 18.925 1.00 0.00 O +ATOM 541 O WAT 541 11.000 9.000 0.971 1.00 0.00 O +ATOM 542 O WAT 542 11.000 9.000 2.971 1.00 0.00 O +ATOM 543 O WAT 543 11.000 9.000 4.971 1.00 0.00 O +ATOM 544 O WAT 544 11.000 9.000 6.971 1.00 0.00 O +ATOM 545 O WAT 545 11.000 9.000 8.971 1.00 0.00 O +ATOM 546 O WAT 546 11.000 9.000 10.971 1.00 0.00 O +ATOM 547 O WAT 547 11.000 9.000 12.971 1.00 0.00 O +ATOM 548 O WAT 548 11.000 9.000 14.971 1.00 0.00 O +ATOM 549 O WAT 549 11.000 9.000 16.971 1.00 0.00 O +ATOM 550 O WAT 550 11.000 9.000 18.971 1.00 0.00 O +ATOM 551 O WAT 551 11.000 11.000 1.029 1.00 0.00 O +ATOM 552 O WAT 552 11.000 11.000 3.029 1.00 0.00 O +ATOM 553 O WAT 553 11.000 11.000 5.029 1.00 0.00 O +ATOM 554 O WAT 554 11.000 11.000 7.029 1.00 0.00 O +ATOM 555 O WAT 555 11.000 11.000 9.029 1.00 0.00 O +ATOM 556 O WAT 556 11.000 11.000 11.029 1.00 0.00 O +ATOM 557 O WAT 557 11.000 11.000 13.029 1.00 0.00 O +ATOM 558 O WAT 558 11.000 11.000 15.029 1.00 0.00 O +ATOM 559 O WAT 559 11.000 11.000 17.029 1.00 0.00 O +ATOM 560 O WAT 560 11.000 11.000 19.029 1.00 0.00 O +ATOM 561 O WAT 561 11.000 13.000 1.075 1.00 0.00 O +ATOM 562 O WAT 562 11.000 13.000 3.075 1.00 0.00 O +ATOM 563 O WAT 563 11.000 13.000 5.075 1.00 0.00 O +ATOM 564 O WAT 564 11.000 13.000 7.075 1.00 0.00 O +ATOM 565 O WAT 565 11.000 13.000 9.075 1.00 0.00 O +ATOM 566 O WAT 566 11.000 13.000 11.075 1.00 0.00 O +ATOM 567 O WAT 567 11.000 13.000 13.075 1.00 0.00 O +ATOM 568 O WAT 568 11.000 13.000 15.075 1.00 0.00 O +ATOM 569 O WAT 569 11.000 13.000 17.075 1.00 0.00 O +ATOM 570 O WAT 570 11.000 13.000 19.075 1.00 0.00 O +ATOM 571 O WAT 571 11.000 15.000 1.093 1.00 0.00 O +ATOM 572 O WAT 572 11.000 15.000 3.093 1.00 0.00 O +ATOM 573 O WAT 573 11.000 15.000 5.093 1.00 0.00 O +ATOM 574 O WAT 574 11.000 15.000 7.093 1.00 0.00 O +ATOM 575 O WAT 575 11.000 15.000 9.093 1.00 0.00 O +ATOM 576 O WAT 576 11.000 15.000 11.093 1.00 0.00 O +ATOM 577 O WAT 577 11.000 15.000 13.093 1.00 0.00 O +ATOM 578 O WAT 578 11.000 15.000 15.093 1.00 0.00 O +ATOM 579 O WAT 579 11.000 15.000 17.093 1.00 0.00 O +ATOM 580 O WAT 580 11.000 15.000 19.093 1.00 0.00 O +ATOM 581 O WAT 581 11.000 17.000 1.075 1.00 0.00 O +ATOM 582 O WAT 582 11.000 17.000 3.075 1.00 0.00 O +ATOM 583 O WAT 583 11.000 17.000 5.075 1.00 0.00 O +ATOM 584 O WAT 584 11.000 17.000 7.075 1.00 0.00 O +ATOM 585 O WAT 585 11.000 17.000 9.075 1.00 0.00 O +ATOM 586 O WAT 586 11.000 17.000 11.075 1.00 0.00 O +ATOM 587 O WAT 587 11.000 17.000 13.075 1.00 0.00 O +ATOM 588 O WAT 588 11.000 17.000 15.075 1.00 0.00 O +ATOM 589 O WAT 589 11.000 17.000 17.075 1.00 0.00 O +ATOM 590 O WAT 590 11.000 17.000 19.075 1.00 0.00 O +ATOM 591 O WAT 591 11.000 19.000 1.029 1.00 0.00 O +ATOM 592 O WAT 592 11.000 19.000 3.029 1.00 0.00 O +ATOM 593 O WAT 593 11.000 19.000 5.029 1.00 0.00 O +ATOM 594 O WAT 594 11.000 19.000 7.029 1.00 0.00 O +ATOM 595 O WAT 595 11.000 19.000 9.029 1.00 0.00 O +ATOM 596 O WAT 596 11.000 19.000 11.029 1.00 0.00 O +ATOM 597 O WAT 597 11.000 19.000 13.029 1.00 0.00 O +ATOM 598 O WAT 598 11.000 19.000 15.029 1.00 0.00 O +ATOM 599 O WAT 599 11.000 19.000 17.029 1.00 0.00 O +ATOM 600 O WAT 600 11.000 19.000 19.029 1.00 0.00 O +ATOM 601 O WAT 601 13.000 1.000 0.925 1.00 0.00 O +ATOM 602 O WAT 602 13.000 1.000 2.925 1.00 0.00 O +ATOM 603 O WAT 603 13.000 1.000 4.925 1.00 0.00 O +ATOM 604 O WAT 604 13.000 1.000 6.925 1.00 0.00 O +ATOM 605 O WAT 605 13.000 1.000 8.925 1.00 0.00 O +ATOM 606 O WAT 606 13.000 1.000 10.925 1.00 0.00 O +ATOM 607 O WAT 607 13.000 1.000 12.925 1.00 0.00 O +ATOM 608 O WAT 608 13.000 1.000 14.925 1.00 0.00 O +ATOM 609 O WAT 609 13.000 1.000 16.925 1.00 0.00 O +ATOM 610 O WAT 610 13.000 1.000 18.925 1.00 0.00 O +ATOM 611 O WAT 611 13.000 3.000 0.804 1.00 0.00 O +ATOM 612 O WAT 612 13.000 3.000 2.804 1.00 0.00 O +ATOM 613 O WAT 613 13.000 3.000 4.804 1.00 0.00 O +ATOM 614 O WAT 614 13.000 3.000 6.804 1.00 0.00 O +ATOM 615 O WAT 615 13.000 3.000 8.804 1.00 0.00 O +ATOM 616 O WAT 616 13.000 3.000 10.804 1.00 0.00 O +ATOM 617 O WAT 617 13.000 3.000 12.804 1.00 0.00 O +ATOM 618 O WAT 618 13.000 3.000 14.804 1.00 0.00 O +ATOM 619 O WAT 619 13.000 3.000 16.804 1.00 0.00 O +ATOM 620 O WAT 620 13.000 3.000 18.804 1.00 0.00 O +ATOM 621 O WAT 621 13.000 5.000 0.757 1.00 0.00 O +ATOM 622 O WAT 622 13.000 5.000 2.757 1.00 0.00 O +ATOM 623 O WAT 623 13.000 5.000 4.757 1.00 0.00 O +ATOM 624 O WAT 624 13.000 5.000 6.757 1.00 0.00 O +ATOM 625 O WAT 625 13.000 5.000 8.757 1.00 0.00 O +ATOM 626 O WAT 626 13.000 5.000 10.757 1.00 0.00 O +ATOM 627 O WAT 627 13.000 5.000 12.757 1.00 0.00 O +ATOM 628 O WAT 628 13.000 5.000 14.757 1.00 0.00 O +ATOM 629 O WAT 629 13.000 5.000 16.757 1.00 0.00 O +ATOM 630 O WAT 630 13.000 5.000 18.757 1.00 0.00 O +ATOM 631 O WAT 631 13.000 7.000 0.804 1.00 0.00 O +ATOM 632 O WAT 632 13.000 7.000 2.804 1.00 0.00 O +ATOM 633 O WAT 633 13.000 7.000 4.804 1.00 0.00 O +ATOM 634 O WAT 634 13.000 7.000 6.804 1.00 0.00 O +ATOM 635 O WAT 635 13.000 7.000 8.804 1.00 0.00 O +ATOM 636 O WAT 636 13.000 7.000 10.804 1.00 0.00 O +ATOM 637 O WAT 637 13.000 7.000 12.804 1.00 0.00 O +ATOM 638 O WAT 638 13.000 7.000 14.804 1.00 0.00 O +ATOM 639 O WAT 639 13.000 7.000 16.804 1.00 0.00 O +ATOM 640 O WAT 640 13.000 7.000 18.804 1.00 0.00 O +ATOM 641 O WAT 641 13.000 9.000 0.925 1.00 0.00 O +ATOM 642 O WAT 642 13.000 9.000 2.925 1.00 0.00 O +ATOM 643 O WAT 643 13.000 9.000 4.925 1.00 0.00 O +ATOM 644 O WAT 644 13.000 9.000 6.925 1.00 0.00 O +ATOM 645 O WAT 645 13.000 9.000 8.925 1.00 0.00 O +ATOM 646 O WAT 646 13.000 9.000 10.925 1.00 0.00 O +ATOM 647 O WAT 647 13.000 9.000 12.925 1.00 0.00 O +ATOM 648 O WAT 648 13.000 9.000 14.925 1.00 0.00 O +ATOM 649 O WAT 649 13.000 9.000 16.925 1.00 0.00 O +ATOM 650 O WAT 650 13.000 9.000 18.925 1.00 0.00 O +ATOM 651 O WAT 651 13.000 11.000 1.075 1.00 0.00 O +ATOM 652 O WAT 652 13.000 11.000 3.075 1.00 0.00 O +ATOM 653 O WAT 653 13.000 11.000 5.075 1.00 0.00 O +ATOM 654 O WAT 654 13.000 11.000 7.075 1.00 0.00 O +ATOM 655 O WAT 655 13.000 11.000 9.075 1.00 0.00 O +ATOM 656 O WAT 656 13.000 11.000 11.075 1.00 0.00 O +ATOM 657 O WAT 657 13.000 11.000 13.075 1.00 0.00 O +ATOM 658 O WAT 658 13.000 11.000 15.075 1.00 0.00 O +ATOM 659 O WAT 659 13.000 11.000 17.075 1.00 0.00 O +ATOM 660 O WAT 660 13.000 11.000 19.075 1.00 0.00 O +ATOM 661 O WAT 661 13.000 13.000 1.196 1.00 0.00 O +ATOM 662 O WAT 662 13.000 13.000 3.196 1.00 0.00 O +ATOM 663 O WAT 663 13.000 13.000 5.196 1.00 0.00 O +ATOM 664 O WAT 664 13.000 13.000 7.196 1.00 0.00 O +ATOM 665 O WAT 665 13.000 13.000 9.196 1.00 0.00 O +ATOM 666 O WAT 666 13.000 13.000 11.196 1.00 0.00 O +ATOM 667 O WAT 667 13.000 13.000 13.196 1.00 0.00 O +ATOM 668 O WAT 668 13.000 13.000 15.196 1.00 0.00 O +ATOM 669 O WAT 669 13.000 13.000 17.196 1.00 0.00 O +ATOM 670 O WAT 670 13.000 13.000 19.196 1.00 0.00 O +ATOM 671 O WAT 671 13.000 15.000 1.243 1.00 0.00 O +ATOM 672 O WAT 672 13.000 15.000 3.243 1.00 0.00 O +ATOM 673 O WAT 673 13.000 15.000 5.243 1.00 0.00 O +ATOM 674 O WAT 674 13.000 15.000 7.243 1.00 0.00 O +ATOM 675 O WAT 675 13.000 15.000 9.243 1.00 0.00 O +ATOM 676 O WAT 676 13.000 15.000 11.243 1.00 0.00 O +ATOM 677 O WAT 677 13.000 15.000 13.243 1.00 0.00 O +ATOM 678 O WAT 678 13.000 15.000 15.243 1.00 0.00 O +ATOM 679 O WAT 679 13.000 15.000 17.243 1.00 0.00 O +ATOM 680 O WAT 680 13.000 15.000 19.243 1.00 0.00 O +ATOM 681 O WAT 681 13.000 17.000 1.196 1.00 0.00 O +ATOM 682 O WAT 682 13.000 17.000 3.196 1.00 0.00 O +ATOM 683 O WAT 683 13.000 17.000 5.196 1.00 0.00 O +ATOM 684 O WAT 684 13.000 17.000 7.196 1.00 0.00 O +ATOM 685 O WAT 685 13.000 17.000 9.196 1.00 0.00 O +ATOM 686 O WAT 686 13.000 17.000 11.196 1.00 0.00 O +ATOM 687 O WAT 687 13.000 17.000 13.196 1.00 0.00 O +ATOM 688 O WAT 688 13.000 17.000 15.196 1.00 0.00 O +ATOM 689 O WAT 689 13.000 17.000 17.196 1.00 0.00 O +ATOM 690 O WAT 690 13.000 17.000 19.196 1.00 0.00 O +ATOM 691 O WAT 691 13.000 19.000 1.075 1.00 0.00 O +ATOM 692 O WAT 692 13.000 19.000 3.075 1.00 0.00 O +ATOM 693 O WAT 693 13.000 19.000 5.075 1.00 0.00 O +ATOM 694 O WAT 694 13.000 19.000 7.075 1.00 0.00 O +ATOM 695 O WAT 695 13.000 19.000 9.075 1.00 0.00 O +ATOM 696 O WAT 696 13.000 19.000 11.075 1.00 0.00 O +ATOM 697 O WAT 697 13.000 19.000 13.075 1.00 0.00 O +ATOM 698 O WAT 698 13.000 19.000 15.075 1.00 0.00 O +ATOM 699 O WAT 699 13.000 19.000 17.075 1.00 0.00 O +ATOM 700 O WAT 700 13.000 19.000 19.075 1.00 0.00 O +ATOM 701 O WAT 701 15.000 1.000 0.907 1.00 0.00 O +ATOM 702 O WAT 702 15.000 1.000 2.907 1.00 0.00 O +ATOM 703 O WAT 703 15.000 1.000 4.907 1.00 0.00 O +ATOM 704 O WAT 704 15.000 1.000 6.907 1.00 0.00 O +ATOM 705 O WAT 705 15.000 1.000 8.907 1.00 0.00 O +ATOM 706 O WAT 706 15.000 1.000 10.907 1.00 0.00 O +ATOM 707 O WAT 707 15.000 1.000 12.907 1.00 0.00 O +ATOM 708 O WAT 708 15.000 1.000 14.907 1.00 0.00 O +ATOM 709 O WAT 709 15.000 1.000 16.907 1.00 0.00 O +ATOM 710 O WAT 710 15.000 1.000 18.907 1.00 0.00 O +ATOM 711 O WAT 711 15.000 3.000 0.757 1.00 0.00 O +ATOM 712 O WAT 712 15.000 3.000 2.757 1.00 0.00 O +ATOM 713 O WAT 713 15.000 3.000 4.757 1.00 0.00 O +ATOM 714 O WAT 714 15.000 3.000 6.757 1.00 0.00 O +ATOM 715 O WAT 715 15.000 3.000 8.757 1.00 0.00 O +ATOM 716 O WAT 716 15.000 3.000 10.757 1.00 0.00 O +ATOM 717 O WAT 717 15.000 3.000 12.757 1.00 0.00 O +ATOM 718 O WAT 718 15.000 3.000 14.757 1.00 0.00 O +ATOM 719 O WAT 719 15.000 3.000 16.757 1.00 0.00 O +ATOM 720 O WAT 720 15.000 3.000 18.757 1.00 0.00 O +ATOM 721 O WAT 721 15.000 5.000 0.700 1.00 0.00 O +ATOM 722 O WAT 722 15.000 5.000 2.700 1.00 0.00 O +ATOM 723 O WAT 723 15.000 5.000 4.700 1.00 0.00 O +ATOM 724 O WAT 724 15.000 5.000 6.700 1.00 0.00 O +ATOM 725 O WAT 725 15.000 5.000 8.700 1.00 0.00 O +ATOM 726 O WAT 726 15.000 5.000 10.700 1.00 0.00 O +ATOM 727 O WAT 727 15.000 5.000 12.700 1.00 0.00 O +ATOM 728 O WAT 728 15.000 5.000 14.700 1.00 0.00 O +ATOM 729 O WAT 729 15.000 5.000 16.700 1.00 0.00 O +ATOM 730 O WAT 730 15.000 5.000 18.700 1.00 0.00 O +ATOM 731 O WAT 731 15.000 7.000 0.757 1.00 0.00 O +ATOM 732 O WAT 732 15.000 7.000 2.757 1.00 0.00 O +ATOM 733 O WAT 733 15.000 7.000 4.757 1.00 0.00 O +ATOM 734 O WAT 734 15.000 7.000 6.757 1.00 0.00 O +ATOM 735 O WAT 735 15.000 7.000 8.757 1.00 0.00 O +ATOM 736 O WAT 736 15.000 7.000 10.757 1.00 0.00 O +ATOM 737 O WAT 737 15.000 7.000 12.757 1.00 0.00 O +ATOM 738 O WAT 738 15.000 7.000 14.757 1.00 0.00 O +ATOM 739 O WAT 739 15.000 7.000 16.757 1.00 0.00 O +ATOM 740 O WAT 740 15.000 7.000 18.757 1.00 0.00 O +ATOM 741 O WAT 741 15.000 9.000 0.907 1.00 0.00 O +ATOM 742 O WAT 742 15.000 9.000 2.907 1.00 0.00 O +ATOM 743 O WAT 743 15.000 9.000 4.907 1.00 0.00 O +ATOM 744 O WAT 744 15.000 9.000 6.907 1.00 0.00 O +ATOM 745 O WAT 745 15.000 9.000 8.907 1.00 0.00 O +ATOM 746 O WAT 746 15.000 9.000 10.907 1.00 0.00 O +ATOM 747 O WAT 747 15.000 9.000 12.907 1.00 0.00 O +ATOM 748 O WAT 748 15.000 9.000 14.907 1.00 0.00 O +ATOM 749 O WAT 749 15.000 9.000 16.907 1.00 0.00 O +ATOM 750 O WAT 750 15.000 9.000 18.907 1.00 0.00 O +ATOM 751 O WAT 751 15.000 11.000 1.093 1.00 0.00 O +ATOM 752 O WAT 752 15.000 11.000 3.093 1.00 0.00 O +ATOM 753 O WAT 753 15.000 11.000 5.093 1.00 0.00 O +ATOM 754 O WAT 754 15.000 11.000 7.093 1.00 0.00 O +ATOM 755 O WAT 755 15.000 11.000 9.093 1.00 0.00 O +ATOM 756 O WAT 756 15.000 11.000 11.093 1.00 0.00 O +ATOM 757 O WAT 757 15.000 11.000 13.093 1.00 0.00 O +ATOM 758 O WAT 758 15.000 11.000 15.093 1.00 0.00 O +ATOM 759 O WAT 759 15.000 11.000 17.093 1.00 0.00 O +ATOM 760 O WAT 760 15.000 11.000 19.093 1.00 0.00 O +ATOM 761 O WAT 761 15.000 13.000 1.243 1.00 0.00 O +ATOM 762 O WAT 762 15.000 13.000 3.243 1.00 0.00 O +ATOM 763 O WAT 763 15.000 13.000 5.243 1.00 0.00 O +ATOM 764 O WAT 764 15.000 13.000 7.243 1.00 0.00 O +ATOM 765 O WAT 765 15.000 13.000 9.243 1.00 0.00 O +ATOM 766 O WAT 766 15.000 13.000 11.243 1.00 0.00 O +ATOM 767 O WAT 767 15.000 13.000 13.243 1.00 0.00 O +ATOM 768 O WAT 768 15.000 13.000 15.243 1.00 0.00 O +ATOM 769 O WAT 769 15.000 13.000 17.243 1.00 0.00 O +ATOM 770 O WAT 770 15.000 13.000 19.243 1.00 0.00 O +ATOM 771 O WAT 771 15.000 15.000 1.300 1.00 0.00 O +ATOM 772 O WAT 772 15.000 15.000 3.300 1.00 0.00 O +ATOM 773 O WAT 773 15.000 15.000 5.300 1.00 0.00 O +ATOM 774 O WAT 774 15.000 15.000 7.300 1.00 0.00 O +ATOM 775 O WAT 775 15.000 15.000 9.300 1.00 0.00 O +ATOM 776 O WAT 776 15.000 15.000 11.300 1.00 0.00 O +ATOM 777 O WAT 777 15.000 15.000 13.300 1.00 0.00 O +ATOM 778 O WAT 778 15.000 15.000 15.300 1.00 0.00 O +ATOM 779 O WAT 779 15.000 15.000 17.300 1.00 0.00 O +ATOM 780 O WAT 780 15.000 15.000 19.300 1.00 0.00 O +ATOM 781 O WAT 781 15.000 17.000 1.243 1.00 0.00 O +ATOM 782 O WAT 782 15.000 17.000 3.243 1.00 0.00 O +ATOM 783 O WAT 783 15.000 17.000 5.243 1.00 0.00 O +ATOM 784 O WAT 784 15.000 17.000 7.243 1.00 0.00 O +ATOM 785 O WAT 785 15.000 17.000 9.243 1.00 0.00 O +ATOM 786 O WAT 786 15.000 17.000 11.243 1.00 0.00 O +ATOM 787 O WAT 787 15.000 17.000 13.243 1.00 0.00 O +ATOM 788 O WAT 788 15.000 17.000 15.243 1.00 0.00 O +ATOM 789 O WAT 789 15.000 17.000 17.243 1.00 0.00 O +ATOM 790 O WAT 790 15.000 17.000 19.243 1.00 0.00 O +ATOM 791 O WAT 791 15.000 19.000 1.093 1.00 0.00 O +ATOM 792 O WAT 792 15.000 19.000 3.093 1.00 0.00 O +ATOM 793 O WAT 793 15.000 19.000 5.093 1.00 0.00 O +ATOM 794 O WAT 794 15.000 19.000 7.093 1.00 0.00 O +ATOM 795 O WAT 795 15.000 19.000 9.093 1.00 0.00 O +ATOM 796 O WAT 796 15.000 19.000 11.093 1.00 0.00 O +ATOM 797 O WAT 797 15.000 19.000 13.093 1.00 0.00 O +ATOM 798 O WAT 798 15.000 19.000 15.093 1.00 0.00 O +ATOM 799 O WAT 799 15.000 19.000 17.093 1.00 0.00 O +ATOM 800 O WAT 800 15.000 19.000 19.093 1.00 0.00 O +ATOM 801 O WAT 801 17.000 1.000 0.925 1.00 0.00 O +ATOM 802 O WAT 802 17.000 1.000 2.925 1.00 0.00 O +ATOM 803 O WAT 803 17.000 1.000 4.925 1.00 0.00 O +ATOM 804 O WAT 804 17.000 1.000 6.925 1.00 0.00 O +ATOM 805 O WAT 805 17.000 1.000 8.925 1.00 0.00 O +ATOM 806 O WAT 806 17.000 1.000 10.925 1.00 0.00 O +ATOM 807 O WAT 807 17.000 1.000 12.925 1.00 0.00 O +ATOM 808 O WAT 808 17.000 1.000 14.925 1.00 0.00 O +ATOM 809 O WAT 809 17.000 1.000 16.925 1.00 0.00 O +ATOM 810 O WAT 810 17.000 1.000 18.925 1.00 0.00 O +ATOM 811 O WAT 811 17.000 3.000 0.804 1.00 0.00 O +ATOM 812 O WAT 812 17.000 3.000 2.804 1.00 0.00 O +ATOM 813 O WAT 813 17.000 3.000 4.804 1.00 0.00 O +ATOM 814 O WAT 814 17.000 3.000 6.804 1.00 0.00 O +ATOM 815 O WAT 815 17.000 3.000 8.804 1.00 0.00 O +ATOM 816 O WAT 816 17.000 3.000 10.804 1.00 0.00 O +ATOM 817 O WAT 817 17.000 3.000 12.804 1.00 0.00 O +ATOM 818 O WAT 818 17.000 3.000 14.804 1.00 0.00 O +ATOM 819 O WAT 819 17.000 3.000 16.804 1.00 0.00 O +ATOM 820 O WAT 820 17.000 3.000 18.804 1.00 0.00 O +ATOM 821 O WAT 821 17.000 5.000 0.757 1.00 0.00 O +ATOM 822 O WAT 822 17.000 5.000 2.757 1.00 0.00 O +ATOM 823 O WAT 823 17.000 5.000 4.757 1.00 0.00 O +ATOM 824 O WAT 824 17.000 5.000 6.757 1.00 0.00 O +ATOM 825 O WAT 825 17.000 5.000 8.757 1.00 0.00 O +ATOM 826 O WAT 826 17.000 5.000 10.757 1.00 0.00 O +ATOM 827 O WAT 827 17.000 5.000 12.757 1.00 0.00 O +ATOM 828 O WAT 828 17.000 5.000 14.757 1.00 0.00 O +ATOM 829 O WAT 829 17.000 5.000 16.757 1.00 0.00 O +ATOM 830 O WAT 830 17.000 5.000 18.757 1.00 0.00 O +ATOM 831 O WAT 831 17.000 7.000 0.804 1.00 0.00 O +ATOM 832 O WAT 832 17.000 7.000 2.804 1.00 0.00 O +ATOM 833 O WAT 833 17.000 7.000 4.804 1.00 0.00 O +ATOM 834 O WAT 834 17.000 7.000 6.804 1.00 0.00 O +ATOM 835 O WAT 835 17.000 7.000 8.804 1.00 0.00 O +ATOM 836 O WAT 836 17.000 7.000 10.804 1.00 0.00 O +ATOM 837 O WAT 837 17.000 7.000 12.804 1.00 0.00 O +ATOM 838 O WAT 838 17.000 7.000 14.804 1.00 0.00 O +ATOM 839 O WAT 839 17.000 7.000 16.804 1.00 0.00 O +ATOM 840 O WAT 840 17.000 7.000 18.804 1.00 0.00 O +ATOM 841 O WAT 841 17.000 9.000 0.925 1.00 0.00 O +ATOM 842 O WAT 842 17.000 9.000 2.925 1.00 0.00 O +ATOM 843 O WAT 843 17.000 9.000 4.925 1.00 0.00 O +ATOM 844 O WAT 844 17.000 9.000 6.925 1.00 0.00 O +ATOM 845 O WAT 845 17.000 9.000 8.925 1.00 0.00 O +ATOM 846 O WAT 846 17.000 9.000 10.925 1.00 0.00 O +ATOM 847 O WAT 847 17.000 9.000 12.925 1.00 0.00 O +ATOM 848 O WAT 848 17.000 9.000 14.925 1.00 0.00 O +ATOM 849 O WAT 849 17.000 9.000 16.925 1.00 0.00 O +ATOM 850 O WAT 850 17.000 9.000 18.925 1.00 0.00 O +ATOM 851 O WAT 851 17.000 11.000 1.075 1.00 0.00 O +ATOM 852 O WAT 852 17.000 11.000 3.075 1.00 0.00 O +ATOM 853 O WAT 853 17.000 11.000 5.075 1.00 0.00 O +ATOM 854 O WAT 854 17.000 11.000 7.075 1.00 0.00 O +ATOM 855 O WAT 855 17.000 11.000 9.075 1.00 0.00 O +ATOM 856 O WAT 856 17.000 11.000 11.075 1.00 0.00 O +ATOM 857 O WAT 857 17.000 11.000 13.075 1.00 0.00 O +ATOM 858 O WAT 858 17.000 11.000 15.075 1.00 0.00 O +ATOM 859 O WAT 859 17.000 11.000 17.075 1.00 0.00 O +ATOM 860 O WAT 860 17.000 11.000 19.075 1.00 0.00 O +ATOM 861 O WAT 861 17.000 13.000 1.196 1.00 0.00 O +ATOM 862 O WAT 862 17.000 13.000 3.196 1.00 0.00 O +ATOM 863 O WAT 863 17.000 13.000 5.196 1.00 0.00 O +ATOM 864 O WAT 864 17.000 13.000 7.196 1.00 0.00 O +ATOM 865 O WAT 865 17.000 13.000 9.196 1.00 0.00 O +ATOM 866 O WAT 866 17.000 13.000 11.196 1.00 0.00 O +ATOM 867 O WAT 867 17.000 13.000 13.196 1.00 0.00 O +ATOM 868 O WAT 868 17.000 13.000 15.196 1.00 0.00 O +ATOM 869 O WAT 869 17.000 13.000 17.196 1.00 0.00 O +ATOM 870 O WAT 870 17.000 13.000 19.196 1.00 0.00 O +ATOM 871 O WAT 871 17.000 15.000 1.243 1.00 0.00 O +ATOM 872 O WAT 872 17.000 15.000 3.243 1.00 0.00 O +ATOM 873 O WAT 873 17.000 15.000 5.243 1.00 0.00 O +ATOM 874 O WAT 874 17.000 15.000 7.243 1.00 0.00 O +ATOM 875 O WAT 875 17.000 15.000 9.243 1.00 0.00 O +ATOM 876 O WAT 876 17.000 15.000 11.243 1.00 0.00 O +ATOM 877 O WAT 877 17.000 15.000 13.243 1.00 0.00 O +ATOM 878 O WAT 878 17.000 15.000 15.243 1.00 0.00 O +ATOM 879 O WAT 879 17.000 15.000 17.243 1.00 0.00 O +ATOM 880 O WAT 880 17.000 15.000 19.243 1.00 0.00 O +ATOM 881 O WAT 881 17.000 17.000 1.196 1.00 0.00 O +ATOM 882 O WAT 882 17.000 17.000 3.196 1.00 0.00 O +ATOM 883 O WAT 883 17.000 17.000 5.196 1.00 0.00 O +ATOM 884 O WAT 884 17.000 17.000 7.196 1.00 0.00 O +ATOM 885 O WAT 885 17.000 17.000 9.196 1.00 0.00 O +ATOM 886 O WAT 886 17.000 17.000 11.196 1.00 0.00 O +ATOM 887 O WAT 887 17.000 17.000 13.196 1.00 0.00 O +ATOM 888 O WAT 888 17.000 17.000 15.196 1.00 0.00 O +ATOM 889 O WAT 889 17.000 17.000 17.196 1.00 0.00 O +ATOM 890 O WAT 890 17.000 17.000 19.196 1.00 0.00 O +ATOM 891 O WAT 891 17.000 19.000 1.075 1.00 0.00 O +ATOM 892 O WAT 892 17.000 19.000 3.075 1.00 0.00 O +ATOM 893 O WAT 893 17.000 19.000 5.075 1.00 0.00 O +ATOM 894 O WAT 894 17.000 19.000 7.075 1.00 0.00 O +ATOM 895 O WAT 895 17.000 19.000 9.075 1.00 0.00 O +ATOM 896 O WAT 896 17.000 19.000 11.075 1.00 0.00 O +ATOM 897 O WAT 897 17.000 19.000 13.075 1.00 0.00 O +ATOM 898 O WAT 898 17.000 19.000 15.075 1.00 0.00 O +ATOM 899 O WAT 899 17.000 19.000 17.075 1.00 0.00 O +ATOM 900 O WAT 900 17.000 19.000 19.075 1.00 0.00 O +ATOM 901 O WAT 901 19.000 1.000 0.971 1.00 0.00 O +ATOM 902 O WAT 902 19.000 1.000 2.971 1.00 0.00 O +ATOM 903 O WAT 903 19.000 1.000 4.971 1.00 0.00 O +ATOM 904 O WAT 904 19.000 1.000 6.971 1.00 0.00 O +ATOM 905 O WAT 905 19.000 1.000 8.971 1.00 0.00 O +ATOM 906 O WAT 906 19.000 1.000 10.971 1.00 0.00 O +ATOM 907 O WAT 907 19.000 1.000 12.971 1.00 0.00 O +ATOM 908 O WAT 908 19.000 1.000 14.971 1.00 0.00 O +ATOM 909 O WAT 909 19.000 1.000 16.971 1.00 0.00 O +ATOM 910 O WAT 910 19.000 1.000 18.971 1.00 0.00 O +ATOM 911 O WAT 911 19.000 3.000 0.925 1.00 0.00 O +ATOM 912 O WAT 912 19.000 3.000 2.925 1.00 0.00 O +ATOM 913 O WAT 913 19.000 3.000 4.925 1.00 0.00 O +ATOM 914 O WAT 914 19.000 3.000 6.925 1.00 0.00 O +ATOM 915 O WAT 915 19.000 3.000 8.925 1.00 0.00 O +ATOM 916 O WAT 916 19.000 3.000 10.925 1.00 0.00 O +ATOM 917 O WAT 917 19.000 3.000 12.925 1.00 0.00 O +ATOM 918 O WAT 918 19.000 3.000 14.925 1.00 0.00 O +ATOM 919 O WAT 919 19.000 3.000 16.925 1.00 0.00 O +ATOM 920 O WAT 920 19.000 3.000 18.925 1.00 0.00 O +ATOM 921 O WAT 921 19.000 5.000 0.907 1.00 0.00 O +ATOM 922 O WAT 922 19.000 5.000 2.907 1.00 0.00 O +ATOM 923 O WAT 923 19.000 5.000 4.907 1.00 0.00 O +ATOM 924 O WAT 924 19.000 5.000 6.907 1.00 0.00 O +ATOM 925 O WAT 925 19.000 5.000 8.907 1.00 0.00 O +ATOM 926 O WAT 926 19.000 5.000 10.907 1.00 0.00 O +ATOM 927 O WAT 927 19.000 5.000 12.907 1.00 0.00 O +ATOM 928 O WAT 928 19.000 5.000 14.907 1.00 0.00 O +ATOM 929 O WAT 929 19.000 5.000 16.907 1.00 0.00 O +ATOM 930 O WAT 930 19.000 5.000 18.907 1.00 0.00 O +ATOM 931 O WAT 931 19.000 7.000 0.925 1.00 0.00 O +ATOM 932 O WAT 932 19.000 7.000 2.925 1.00 0.00 O +ATOM 933 O WAT 933 19.000 7.000 4.925 1.00 0.00 O +ATOM 934 O WAT 934 19.000 7.000 6.925 1.00 0.00 O +ATOM 935 O WAT 935 19.000 7.000 8.925 1.00 0.00 O +ATOM 936 O WAT 936 19.000 7.000 10.925 1.00 0.00 O +ATOM 937 O WAT 937 19.000 7.000 12.925 1.00 0.00 O +ATOM 938 O WAT 938 19.000 7.000 14.925 1.00 0.00 O +ATOM 939 O WAT 939 19.000 7.000 16.925 1.00 0.00 O +ATOM 940 O WAT 940 19.000 7.000 18.925 1.00 0.00 O +ATOM 941 O WAT 941 19.000 9.000 0.971 1.00 0.00 O +ATOM 942 O WAT 942 19.000 9.000 2.971 1.00 0.00 O +ATOM 943 O WAT 943 19.000 9.000 4.971 1.00 0.00 O +ATOM 944 O WAT 944 19.000 9.000 6.971 1.00 0.00 O +ATOM 945 O WAT 945 19.000 9.000 8.971 1.00 0.00 O +ATOM 946 O WAT 946 19.000 9.000 10.971 1.00 0.00 O +ATOM 947 O WAT 947 19.000 9.000 12.971 1.00 0.00 O +ATOM 948 O WAT 948 19.000 9.000 14.971 1.00 0.00 O +ATOM 949 O WAT 949 19.000 9.000 16.971 1.00 0.00 O +ATOM 950 O WAT 950 19.000 9.000 18.971 1.00 0.00 O +ATOM 951 O WAT 951 19.000 11.000 1.029 1.00 0.00 O +ATOM 952 O WAT 952 19.000 11.000 3.029 1.00 0.00 O +ATOM 953 O WAT 953 19.000 11.000 5.029 1.00 0.00 O +ATOM 954 O WAT 954 19.000 11.000 7.029 1.00 0.00 O +ATOM 955 O WAT 955 19.000 11.000 9.029 1.00 0.00 O +ATOM 956 O WAT 956 19.000 11.000 11.029 1.00 0.00 O +ATOM 957 O WAT 957 19.000 11.000 13.029 1.00 0.00 O +ATOM 958 O WAT 958 19.000 11.000 15.029 1.00 0.00 O +ATOM 959 O WAT 959 19.000 11.000 17.029 1.00 0.00 O +ATOM 960 O WAT 960 19.000 11.000 19.029 1.00 0.00 O +ATOM 961 O WAT 961 19.000 13.000 1.075 1.00 0.00 O +ATOM 962 O WAT 962 19.000 13.000 3.075 1.00 0.00 O +ATOM 963 O WAT 963 19.000 13.000 5.075 1.00 0.00 O +ATOM 964 O WAT 964 19.000 13.000 7.075 1.00 0.00 O +ATOM 965 O WAT 965 19.000 13.000 9.075 1.00 0.00 O +ATOM 966 O WAT 966 19.000 13.000 11.075 1.00 0.00 O +ATOM 967 O WAT 967 19.000 13.000 13.075 1.00 0.00 O +ATOM 968 O WAT 968 19.000 13.000 15.075 1.00 0.00 O +ATOM 969 O WAT 969 19.000 13.000 17.075 1.00 0.00 O +ATOM 970 O WAT 970 19.000 13.000 19.075 1.00 0.00 O +ATOM 971 O WAT 971 19.000 15.000 1.093 1.00 0.00 O +ATOM 972 O WAT 972 19.000 15.000 3.093 1.00 0.00 O +ATOM 973 O WAT 973 19.000 15.000 5.093 1.00 0.00 O +ATOM 974 O WAT 974 19.000 15.000 7.093 1.00 0.00 O +ATOM 975 O WAT 975 19.000 15.000 9.093 1.00 0.00 O +ATOM 976 O WAT 976 19.000 15.000 11.093 1.00 0.00 O +ATOM 977 O WAT 977 19.000 15.000 13.093 1.00 0.00 O +ATOM 978 O WAT 978 19.000 15.000 15.093 1.00 0.00 O +ATOM 979 O WAT 979 19.000 15.000 17.093 1.00 0.00 O +ATOM 980 O WAT 980 19.000 15.000 19.093 1.00 0.00 O +ATOM 981 O WAT 981 19.000 17.000 1.075 1.00 0.00 O +ATOM 982 O WAT 982 19.000 17.000 3.075 1.00 0.00 O +ATOM 983 O WAT 983 19.000 17.000 5.075 1.00 0.00 O +ATOM 984 O WAT 984 19.000 17.000 7.075 1.00 0.00 O +ATOM 985 O WAT 985 19.000 17.000 9.075 1.00 0.00 O +ATOM 986 O WAT 986 19.000 17.000 11.075 1.00 0.00 O +ATOM 987 O WAT 987 19.000 17.000 13.075 1.00 0.00 O +ATOM 988 O WAT 988 19.000 17.000 15.075 1.00 0.00 O +ATOM 989 O WAT 989 19.000 17.000 17.075 1.00 0.00 O +ATOM 990 O WAT 990 19.000 17.000 19.075 1.00 0.00 O +ATOM 991 O WAT 991 19.000 19.000 1.029 1.00 0.00 O +ATOM 992 O WAT 992 19.000 19.000 3.029 1.00 0.00 O +ATOM 993 O WAT 993 19.000 19.000 5.029 1.00 0.00 O +ATOM 994 O WAT 994 19.000 19.000 7.029 1.00 0.00 O +ATOM 995 O WAT 995 19.000 19.000 9.029 1.00 0.00 O +ATOM 996 O WAT 996 19.000 19.000 11.029 1.00 0.00 O +ATOM 997 O WAT 997 19.000 19.000 13.029 1.00 0.00 O +ATOM 998 O WAT 998 19.000 19.000 15.029 1.00 0.00 O +ATOM 999 O WAT 999 19.000 19.000 17.029 1.00 0.00 O +ATOM 1000 O WAT 1000 19.000 19.000 19.029 1.00 0.00 O END diff --git a/test/Test_SurfTension/st.itim.dat.save b/test/Test_SurfTension/st.itim.dat.save index f0659b28f3..2f5447ab74 100644 --- a/test/Test_SurfTension/st.itim.dat.save +++ b/test/Test_SurfTension/st.itim.dat.save @@ -12,6 +12,9 @@ qmin 0.314159 qmax 0.8 frames 1 skipped 0 -roughness 0 -roughness_upper 0 -roughness_lower 0 +gamma 5336.11 +gamma_upper 5336.11 +gamma_lower 5336.11 +roughness 0.125838 +roughness_upper 0.125838 +roughness_lower 0.125838 diff --git a/test/Test_SurfTension/st.normalx.dat.save b/test/Test_SurfTension/st.normalx.dat.save index fa365576d4..647a58f108 100644 --- a/test/Test_SurfTension/st.normalx.dat.save +++ b/test/Test_SurfTension/st.normalx.dat.save @@ -12,9 +12,10 @@ qmin 0.314159 qmax 0.8 frames 1 skipped 0 -gamma 849.84 -gamma_upper 849.84 -gamma_lower 849.84 -roughness 0.222848 -roughness_upper 0.222848 -roughness_lower 0.222848 +gamma 1051.08 +gamma_upper 1051.08 +gamma_lower 1051.08 +kappa -1.53118e+32 +roughness 0.205627 +roughness_upper 0.205627 +roughness_lower 0.205627 diff --git a/test/Test_SurfTension/st.normaly.dat.save b/test/Test_SurfTension/st.normaly.dat.save index bd7ab194f1..adc743c2ba 100644 --- a/test/Test_SurfTension/st.normaly.dat.save +++ b/test/Test_SurfTension/st.normaly.dat.save @@ -12,9 +12,9 @@ qmin 0.314159 qmax 0.8 frames 1 skipped 0 -gamma 849.84 -gamma_upper 849.84 -gamma_lower 849.84 -roughness 0.222848 -roughness_upper 0.222848 -roughness_lower 0.222848 +gamma 1051.08 +gamma_upper 1051.08 +gamma_lower 1051.08 +roughness 0.205627 +roughness_upper 0.205627 +roughness_lower 0.205627 diff --git a/test/Test_SurfTension/st.nsurf1.dat.save b/test/Test_SurfTension/st.nsurf1.dat.save index 7b7042973b..dcac7d5244 100644 --- a/test/Test_SurfTension/st.nsurf1.dat.save +++ b/test/Test_SurfTension/st.nsurf1.dat.save @@ -12,7 +12,7 @@ qmin 0.314159 qmax 0.8 frames 1 skipped 0 -gamma 849.84 -gamma_upper 849.84 -roughness 0.222848 -roughness_upper 0.222848 +gamma 512.372 +gamma_upper 512.372 +roughness 0.338125 +roughness_upper 0.338125 diff --git a/test/Test_SurfTension/st.willard.dat.save b/test/Test_SurfTension/st.willard.dat.save index f257deb3b5..497c2df5c3 100644 --- a/test/Test_SurfTension/st.willard.dat.save +++ b/test/Test_SurfTension/st.willard.dat.save @@ -12,9 +12,9 @@ qmin 0.314159 qmax 0.8 frames 1 skipped 0 -gamma 849.84 -gamma_upper 849.84 -gamma_lower 849.84 -roughness 0.222848 -roughness_upper 0.222848 -roughness_lower 0.222848 +gamma 512.372 +gamma_upper 512.372 +gamma_lower 512.372 +roughness 0.338125 +roughness_upper 0.338125 +roughness_lower 0.338125 diff --git a/test/Test_SurfTension/st2_summary.dat.save b/test/Test_SurfTension/st2_summary.dat.save index b3cad2b69f..60ce7aa1e6 100644 --- a/test/Test_SurfTension/st2_summary.dat.save +++ b/test/Test_SurfTension/st2_summary.dat.save @@ -13,9 +13,9 @@ qmin 0.314159 qmax 0.8 frames 1 skipped 0 -gamma 849.84 -gamma_upper 849.84 -gamma_lower 849.84 -roughness 0.222848 -roughness_upper 0.222848 -roughness_lower 0.222848 +gamma 512.372 +gamma_upper 512.372 +gamma_lower 512.372 +roughness 0.338125 +roughness_upper 0.338125 +roughness_lower 0.338125 From 5db811002b4edf764fba15c6ce454fe1eb1c3a42 Mon Sep 17 00:00:00 2001 From: ndlevinzon Date: Wed, 2 Sep 2026 14:26:01 -0600 Subject: [PATCH 15/33] Update RunTest.sh and data files for dual frame analysis in surface tension tests - Enhanced RunTest.sh to support dual frame analysis for both serial and MPI executions, ensuring consistent results across different ranks. - Updated input parameters in st.itim.dat.save, st.normalx.dat.save, st.normaly.dat.save, st.nsurf1.dat.save, st.willard.dat.save, and st2_summary.dat.save to reflect the change from 1 to 2 frames, improving the accuracy of simulation outputs. --- test/Test_SurfTension/RunTest.sh | 10 ++++++++++ test/Test_SurfTension/st.itim.dat.save | 2 +- test/Test_SurfTension/st.normalx.dat.save | 2 +- test/Test_SurfTension/st.normaly.dat.save | 2 +- test/Test_SurfTension/st.nsurf1.dat.save | 2 +- test/Test_SurfTension/st.willard.dat.save | 2 +- test/Test_SurfTension/st2_summary.dat.save | 2 +- 7 files changed, 16 insertions(+), 6 deletions(-) diff --git a/test/Test_SurfTension/RunTest.sh b/test/Test_SurfTension/RunTest.sh index 5ba5c78b0e..6ca5f2e66c 100755 --- a/test/Test_SurfTension/RunTest.sh +++ b/test/Test_SurfTension/RunTest.sh @@ -3,6 +3,8 @@ # slab.pdb is a 20 A cubic lattice of O atoms with a small z-corrugation # so ITIM min/max is not flat. Stretching one box length creates vacuum # on both sides of a slab so Willard/ITIM can find interfaces. +# The PDB is loaded twice so serial and MPI (2 ranks) both analyze 2 +# identical frames; SyncAction then reduces |h_q|^2 and the summaries match. . ../MasterTest.sh @@ -10,6 +12,8 @@ CleanFiles st.in st.willard.dat st.itim.dat st.normalx.dat st.normaly.dat \ st.nsurf1.dat st2_summary.dat TESTNAME='Surface tension (surftension) tests' +# Two frames: Jenkins mpiexec -n 2 assigns one frame per rank. +Requires maxthreads 2 INPUT='-i st.in' @@ -18,6 +22,7 @@ cat > st.in < st.in < st.in < st.in < st.in < st.in < Date: Wed, 23 Sep 2026 10:17:07 -0600 Subject: [PATCH 16/33] Refactor README.md for improved clarity and structure - Updated section headers to use consistent Markdown formatting. - Consolidated build status badges and descriptions for better readability. - Enhanced author and contributor sections for clarity. - Improved formatting of library dependencies and installation instructions. Co-authored-by: Cursor --- README.md | 202 +++++++++++++++++++++++------------------------------- 1 file changed, 87 insertions(+), 115 deletions(-) diff --git a/README.md b/README.md index 54e46d3b81..f53d2d6091 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,15 @@ -CPPTRAJ -======= +# CPPTRAJ Fast, parallelized molecular dynamics trajectory data analysis. -Build Status -============= -* GitHub Actions: [![GitHub Actions Status](https://github.com/Amber-MD/cpptraj/actions/workflows/merge-gate.yml/badge.svg)](https://github.com/Amber-MD/cpptraj/actions) -* AppVeyor: [![Windows Build Status](https://ci.appveyor.com/api/projects/status/github/Amber-MD/cpptraj?branch=master&svg=true&retina=true)](https://ci.appveyor.com/project/drroe/cpptraj-aof9y/branch/master) -* Jenkins: [![Jenkins Build Status](https://jenkins.jasonswails.com/buildStatus/icon?job=amber-github%2Fcpptraj%2Fmaster&style=plastic)](https://jenkins.jasonswails.com/job/amber-github/job/cpptraj/job/master/) -* CodeQL: [![CodeQL](https://github.com/Amber-MD/cpptraj/workflows/CodeQL/badge.svg)](https://github.com/Amber-MD/cpptraj/actions?query=workflow%3ACodeQL) +# Build Status -Description -=========== +- GitHub Actions: ![GitHub Actions Status](https://github.com/Amber-MD/cpptraj/actions/workflows/merge-gate.yml/badge.svg) +- AppVeyor: ![Windows Build Status](https://ci.appveyor.com/api/projects/status/github/Amber-MD/cpptraj?branch=master&svg=true&retina=true) +- Jenkins: ![Jenkins Build Status](https://jenkins.jasonswails.com/buildStatus/icon?job=amber-github%2Fcpptraj%2Fmaster&style=plastic) +- CodeQL: ![CodeQL](https://github.com/Amber-MD/cpptraj/workflows/CodeQL/badge.svg) + +# Description CPPTRAJ is a program designed to process and analyze molecular dynamics trajectories and relevant data sets derived from their analysis. CPPTRAJ @@ -38,20 +36,18 @@ For more information (or to cite CPPTRAJ) see the following publication: For more information regarding trajectory/ensemble parallelism via MPI in CPPTRAJ see the following publication: -[Daniel R. Roe and Thomas E. Cheatham, III, \"Parallelization of CPPTRAJ enables - large scale analysis of molecular dynamics trajectory data\". J. Comp. +[Daniel R. Roe and Thomas E. Cheatham, III, Parallelization of CPPTRAJ enables + large scale analysis of molecular dynamics trajectory data. J. Comp. Chem., 2018, DOI: 10.1002/jcc25382](https://onlinelibrary.wiley.com/doi/full/10.1002/jcc.25382). - -Disclaimer and Copyright -======================== +# Disclaimer and Copyright CPPTRAJ is Copyright (c) 2010-2026 Daniel R. Roe. The terms for using, copying, modifying, and distributing CPPTRAJ are specified in the file LICENSE. -Documentation -============= +# Documentation + The `/doc` subdirectory contains PDF and LyX versions of the CPPTRAJ manual. The latest version of the manual is available for download [here.](https://raw.githubusercontent.com/Amber-MD/cpptraj/master/doc/CpptrajManual.pdf) @@ -66,28 +62,28 @@ and limited HTML-formatted documentation is available Some examples are available in the `examples` subdirectory. -Installation & Testing -====================== +# Installation & Testing + Run `./configure --help` for a short list of configure options. `./configure --full-help` will list all available configure options. For full functionality, CPPTRAJ makes use of the following libraries: -* NetCDF -* BLAS -* LAPACK -* Gzip -* Bzip2 -* Parallel NetCDF (-mpi build only, for NetCDF trajectory output in parallel) -* CUDA (-cuda build only) -* HIP (-hip build only) -* FFTW (mostly optional but recommended; required for PME functionality and very large FFTs) +- NetCDF +- BLAS +- LAPACK +- Gzip +- Bzip2 +- Parallel NetCDF (-mpi build only, for NetCDF trajectory output in parallel) +- CUDA (-cuda build only) +- HIP (-hip build only) +- FFTW (mostly optional but recommended; required for PME functionality and very large FFTs) CPPTRAJ also makes use of the following libraries that are bundled with CPPTRAJ. External ones can be used in place of these if desired. -* ARPACK; without this diagonalization of sparse matrices in `diagmatrix` will be slow. -* [helPME](https://github.com/andysim/helpme) by Andy Simmonett, required for PME functionality. -* XDR for reading GROMACS XTC trajectories. -* TNG for reading GROMACS TNG trajectories. +- ARPACK; without this diagonalization of sparse matrices in `diagmatrix` will be slow. +- [helPME](https://github.com/andysim/helpme) by Andy Simmonett, required for PME functionality. +- XDR for reading GROMACS XTC trajectories. +- TNG for reading GROMACS TNG trajectories. C++11 support is required to enable particle mesh Ewald (PME) calculation support via helPME. CPPTRAJ also uses the PCG32 and Xoshiro 128++ pseudo-random number generators. @@ -143,9 +139,9 @@ well to test the basic functionality of CPPTRAJ. There is an independently-maintained VIM syntax file for CPPTRAJ by Emmett Leddin available [here](https://github.com/emleddin/vim-cpptraj). -CPPTRAJ Authors -=============== -**Lead Author:** Daniel R. Roe (, ) +# CPPTRAJ Authors + +**Lead Author:** Daniel R. Roe ([daniel.r.roe@gmail.com](mailto:daniel.r.roe@gmail.com), [daniel.roe@nih.gov](mailto:daniel.roe@nih.gov)) Laboratory of Computational Biology National Heart Lung and Blood Institute National Institutes of Health, Bethesda, MD. @@ -154,107 +150,83 @@ National Institutes of Health, Bethesda, MD. (Department of Medicinal Chemistry, University of Utah, Salt Lake City, UT, USA) and many routines from PTRAJ were adapted for use in CPPTRAJ, including code used in the following classes: -Analysis\_CrankShaft, Analysis\_Statistics, Action\_DNAionTracker, -Action\_RandomizeIons, Action\_Principal, Action\_Grid, GridAction, -Action\_Image, and ImageRoutines. +AnalysisCrankShaft, AnalysisStatistics, ActionDNAionTracker, +ActionRandomizeIons, ActionPrincipal, ActionGrid, GridAction, +ActionImage, and ImageRoutines. ## Contributors to CPPTRAJ -* James Maier (Stony Brook University, Stony Brook, NY, USA) -Code for calculating J-couplings (used in Action\_Jcoupling). - -* Jason M. Swails (University of Florida, Gainesville, FL, USA) -Action\_LIE, Analysis\_RunningAvg, Action\_Volmap, Grid OpenDX output. - -* Jason M. Swails (University of Florida, Gainesville, FL, USA) +- James Maier (Stony Brook University, Stony Brook, NY, USA) +Code for calculating J-couplings (used in ActionJcoupling). +- Jason M. Swails (University of Florida, Gainesville, FL, USA) +ActionLIE, AnalysisRunningAvg, ActionVolmap, Grid OpenDX output. +- Jason M. Swails (University of Florida, Gainesville, FL, USA) Guanglei Cui (GlaxoSmithKline, Upper Providence, PA, USA) -Action\_SPAM. - -* Mark J. Williamson (Unilever Centre for Molecular Informatics, Department of Chemistry, Cambridge, UK) -Action\_GridFreeEnergy. - -* Hannes H. Loeffler (STFC Daresbury, Scientific Computing Department, Warrington, WA4 4AD, UK) -Action\_Density, Action\_OrderParameter, Action\_PairDist. - -* Crystal N. Nguyen (University of California, San Diego) +ActionSPAM. +- Mark J. Williamson (Unilever Centre for Molecular Informatics, Department of Chemistry, Cambridge, UK) +ActionGridFreeEnergy. +- Hannes H. Loeffler (STFC Daresbury, Scientific Computing Department, Warrington, WA4 4AD, UK) +ActionDensity, ActionOrderParameter, ActionPairDist. +- Crystal N. Nguyen (University of California, San Diego) Romelia F. Salomon (University of California, San Diego) -Original Action\_Gist. - -* Pawel Janowski (Rutgers University, NJ, USA) -Normal mode wizard (nmwiz) output, original code for ADP calculation in Action\_AtomicFluct. - -* Zahra Heidari (Faculty of Chemistry, K. N. Toosi University of Technology, Tehran, Iran) -Original code for Analysis\_Wavelet. - -* Chris Lee (University of California, San Diego) +Original ActionGist. +- Pawel Janowski (Rutgers University, NJ, USA) +Normal mode wizard (nmwiz) output, original code for ADP calculation in ActionAtomicFluct. +- Zahra Heidari (Faculty of Chemistry, K. N. Toosi University of Technology, Tehran, Iran) +Original code for AnalysisWavelet. +- Chris Lee (University of California, San Diego) Support for processing force information in NetCDF trajectories. - -* Steven Ramsey (CUNY Lehman College, Bronx, NY) -Enhancements to entropy calculation in original Action\_Gist. - -* Amit Roy (University of Utah, UT) +- Steven Ramsey (CUNY Lehman College, Bronx, NY) +Enhancements to entropy calculation in original ActionGist. +- Amit Roy (University of Utah, UT) Code for the CUDA version of the 'closest' Action. - -* Nathan D. Levinzon (University of Utah, UT) +- Nathan D. Levinzon (University of Utah, UT) Action\surftension. - -* Andrew Simmonett (National Institutes of Health) +- Andrew Simmonett (National Institutes of Health) Code for the reciprocal part of the particle mesh Ewald calculation (electrostatic and Lennard-Jones). - -* Christina Bergonzo (National Institute of Standards and Technology, Gaithersburg, MD) +- Christina Bergonzo (National Institute of Standards and Technology, Gaithersburg, MD) Fixes and improvements to nucleic acid dihedral angle definitions (DihedralSearch). - -* David S. Cerutti (Rutgers University, Piscataway, NJ, USA) +- David S. Cerutti (Rutgers University, Piscataway, NJ, USA) Original code for the 'xtalsymm' Action. - -* Johannes Kraml, Franz Waibl & Klaus R. Liedl (Department of General, Inorganic, and Theoretical Chemistry, University of Innsbruck) +- Johannes Kraml, Franz Waibl & Klaus R. Liedl (Department of General, Inorganic, and Theoretical Chemistry, University of Innsbruck) Improvements and enhancements for GIST. - -* Nikolai Skrynnikov, Danil Yevdokimov, Olga O. Lebedenko and Ivan S. Podkorytov (Purdue University, IN) +- Nikolai Skrynnikov, Danil Yevdokimov, Olga O. Lebedenko and Ivan S. Podkorytov (Purdue University, IN) Fix for truncated octahedron cell solvation of large systems. + + #### Various Contributions -* David A. Case (Rutgers University, Piscataway, NJ, USA) -* Hai Nguyen (Rutgers University, Piscataway, NJ, USA) -* Robert T. McGibbon (Stanford University, Stanford, CA, USA) + +- David A. Case (Rutgers University, Piscataway, NJ, USA) +- Hai Nguyen (Rutgers University, Piscataway, NJ, USA) +- Robert T. McGibbon (Stanford University, Stanford, CA, USA) + + ## Code in CPPTRAJ that originated in PTRAJ -* Holger Gohlke (Heinrich-Heine-University, Düsseldorf, Germany) +- Holger Gohlke (Heinrich-Heine-University, Düsseldorf, Germany) Alrun N. Koller (Heinrich-Heine-University, Düsseldorf, Germany) Original implementation of matrix/vector functionality in PTRAJ, including matrix diagonalization, IRED analysis, eigenmode analysis, and vector time correlations. - -* Michael Crowley (University of Southern California, Los Angeles, CA, USA) +- Michael Crowley (University of Southern California, Los Angeles, CA, USA) Original code for dealing with truncated octahedral unit cells. - -* Viktor Hornak (Merck, NJ, USA) +- Viktor Hornak (Merck, NJ, USA) Original code for mask expression parser. - -* John Mongan (UCSD, San Diego, CA, USA) +- John Mongan (UCSD, San Diego, CA, USA) Original implementation of the Amber NetCDF trajectory format. +- Hannes H. Loeffler (STFC Daresbury, Scientific Computing Department, Warrington, WA4 4AD, UK) +Diffusion calculation code adapted for use in ActionSTFCDiffusion. + +# External code/libraries bundled with CPPTRAJ + +- CPPTRAJ makes use of the [GNU readline](https://tiswww.case.edu/php/chet/readline/rltop.html) library for the interactive command line. +- CPPTRAJ uses the [ARPACK](https://www.caam.rice.edu//software/ARPACK/) library to calculate eigenvalues/eigenvectors from large sparse matrices. +- CPPTRAJ uses the [xdrfile](http://www.gromacs.org/Developer_Zone/Programming_Guide/XTC_Library) library for reading XTC files; specifically a somewhat updated version from [MDTRAJ](https://github.com/mdtraj/mdtraj) that includes some bugfixes and enhancements. See `src/xdrfile/README` for details. +- CPPTRAJ uses the [GROMACS TNG](https://github.com/gromacs/tng) library for reading TNG files. See `sec/tng/README` for details. +- The reciprocal part of the PME calculation is handled by the [helPME](https://github.com/andysim/helpme) library by Andy Simmonett. +- Support for reading DTR trajectories uses the VMD DTR plugin. +- CPPTRAJ uses code for the [permuted congruent pseudo-random number generator](https://www.pcg-random.org/index.html) PCG32 by Melissa O'Neill and the [Xoshiro 128++ pseudo-random number generator](http://prng.di.unimi.it) by David Blackman and Sebastino Vigna. +- The code for quaternion RMSD calculation was adapted from code in [qcprot.c](https://theobald.brandeis.edu/qcp/qcprot.c) originally written by Douglas L. Theobald and Pu Lio (Brandeis University). +- The code for reading numpy arrays in `src/libnpy` is from [libnpy](https://github.com/llohse/libnpy) written by Leon Merten Lohse et al. (Universität Göttingen). +- The code for reading/writing atom/residue number fields in large PDB files (in `Hybrid36.cpp`) is adapted from code written by Ralf W. Grosse-Kunstleve in the Computational Crystallography Toolbox, [https://doi.org/10.1107/S0021889801017824](https://doi.org/10.1107/S0021889801017824), [https://raw.githubusercontent.com/cctbx/cctbx_project/master/iotbx/pdb/hybrid_36_c.c](https://raw.githubusercontent.com/cctbx/cctbx_project/master/iotbx/pdb/hybrid_36_c.c) -* Hannes H. Loeffler (STFC Daresbury, Scientific Computing Department, Warrington, WA4 4AD, UK) -Diffusion calculation code adapted for use in Action\_STFC\_Diffusion. - -External code/libraries bundled with CPPTRAJ -============================================ - -* CPPTRAJ makes use of the [GNU readline](https://tiswww.case.edu/php/chet/readline/rltop.html) library for the interactive command line. - -* CPPTRAJ uses the [ARPACK](https://www.caam.rice.edu//software/ARPACK/) library to calculate eigenvalues/eigenvectors from large sparse matrices. - -* CPPTRAJ uses the [xdrfile](http://www.gromacs.org/Developer\_Zone/Programming\_Guide/XTC\_Library) library for reading XTC files; specifically a somewhat updated version from [MDTRAJ](https://github.com/mdtraj/mdtraj) that includes some bugfixes and enhancements. See `src/xdrfile/README` for details. - -* CPPTRAJ uses the [GROMACS TNG](https://github.com/gromacs/tng) library for reading TNG files. See `sec/tng/README` for details. - -* The reciprocal part of the PME calculation is handled by the [helPME](https://github.com/andysim/helpme) library by Andy Simmonett. - -* Support for reading DTR trajectories uses the VMD DTR plugin. - -* CPPTRAJ uses code for the [permuted congruent pseudo-random number generator](https://www.pcg-random.org/index.html) PCG32 by Melissa O'Neill and the [Xoshiro 128++ pseudo-random number generator](http://prng.di.unimi.it) by David Blackman and Sebastino Vigna. - -* The code for quaternion RMSD calculation was adapted from code in [qcprot.c](https://theobald.brandeis.edu/qcp/qcprot.c) originally written by Douglas L. Theobald and Pu Lio (Brandeis University). - -* The code for reading numpy arrays in `src/libnpy` is from [libnpy](https://github.com/llohse/libnpy) written by Leon Merten Lohse et al. (Universität Göttingen). - -* The code for reading/writing atom/residue number fields in large PDB files (in `Hybrid36.cpp`) is adapted from code written by Ralf W. Grosse-Kunstleve in the Computational Crystallography Toolbox, https://doi.org/10.1107/S0021889801017824, https://raw.githubusercontent.com/cctbx/cctbx_project/master/iotbx/pdb/hybrid_36_c.c From 8a2f97f80f9bbd0a539c4973a0dac4b0367a92ef Mon Sep 17 00:00:00 2001 From: Nate Levinzon Date: Mon, 14 Sep 2026 15:24:09 -0600 Subject: [PATCH 17/33] Add templatematch (timap) for TI-aligned residue libraries. Map analog topologies onto a user template so shared atoms share indices; extra atoms are insertions. Ships official ModXNA parent fragments and tests partial maps for nucleotides (FLE/ERN), amino acids (Cys/Sec), and small molecules (phenol/benzene). --- README.md | 2 +- dat/templatematch/5PO.mol2 | 22 + dat/templatematch/A9Z.mol2 | 78 ++ dat/templatematch/DAA.mol2 | 56 + dat/templatematch/DDD.mol2 | 69 + dat/templatematch/DPO.mol2 | 100 ++ dat/templatematch/DTT.mol2 | 55 + dat/templatematch/OME.mol2 | 61 + dat/templatematch/PARENTS.txt | 32 + dat/templatematch/RBO.mol2 | 82 ++ dat/templatematch/RUR.mol2 | 58 + dat/templatematch/TMC.mol2 | 92 ++ dat/templatematch/UFB.mol2 | 61 + doc/cpptraj.lyx | 330 +++++ src/Command.cpp | 2 + src/Exec_TemplateMatch.cpp | 274 ++++ src/Exec_TemplateMatch.h | 17 + src/TemplateMatch.cpp | 1241 +++++++++++++++++ src/TemplateMatch.h | 74 + src/cpptrajfiles | 2 + src/cpptrajheaders | 2 + test/Makefile | 4 + test/Test_TemplateMatch/ERN.lib | 228 +++ test/Test_TemplateMatch/FLE.lib | 234 ++++ test/Test_TemplateMatch/RunTest.sh | 81 ++ test/Test_TemplateMatch/_gen_save.py | 125 ++ test/Test_TemplateMatch/benzene.mol2 | 35 + test/Test_TemplateMatch/cys.lib | 99 ++ test/Test_TemplateMatch/cys.mol2 | 32 + test/Test_TemplateMatch/daa_identity.map.save | 26 + test/Test_TemplateMatch/ern_naorder.map.save | 36 + test/Test_TemplateMatch/fle_to_ern.map.save | 39 + test/Test_TemplateMatch/phenol.mol2 | 37 + .../phenol_to_benzene.map.save | 19 + test/Test_TemplateMatch/sec.lib | 99 ++ test/Test_TemplateMatch/sec.mol2 | 32 + test/Test_TemplateMatch/sec_to_cys.map.save | 17 + 37 files changed, 3852 insertions(+), 1 deletion(-) create mode 100644 dat/templatematch/5PO.mol2 create mode 100644 dat/templatematch/A9Z.mol2 create mode 100644 dat/templatematch/DAA.mol2 create mode 100644 dat/templatematch/DDD.mol2 create mode 100644 dat/templatematch/DPO.mol2 create mode 100644 dat/templatematch/DTT.mol2 create mode 100644 dat/templatematch/OME.mol2 create mode 100644 dat/templatematch/PARENTS.txt create mode 100644 dat/templatematch/RBO.mol2 create mode 100644 dat/templatematch/RUR.mol2 create mode 100644 dat/templatematch/TMC.mol2 create mode 100644 dat/templatematch/UFB.mol2 create mode 100644 src/Exec_TemplateMatch.cpp create mode 100644 src/Exec_TemplateMatch.h create mode 100644 src/TemplateMatch.cpp create mode 100644 src/TemplateMatch.h create mode 100644 test/Test_TemplateMatch/ERN.lib create mode 100644 test/Test_TemplateMatch/FLE.lib create mode 100644 test/Test_TemplateMatch/RunTest.sh create mode 100644 test/Test_TemplateMatch/_gen_save.py create mode 100644 test/Test_TemplateMatch/benzene.mol2 create mode 100644 test/Test_TemplateMatch/cys.lib create mode 100644 test/Test_TemplateMatch/cys.mol2 create mode 100644 test/Test_TemplateMatch/daa_identity.map.save create mode 100644 test/Test_TemplateMatch/ern_naorder.map.save create mode 100644 test/Test_TemplateMatch/fle_to_ern.map.save create mode 100644 test/Test_TemplateMatch/phenol.mol2 create mode 100644 test/Test_TemplateMatch/phenol_to_benzene.map.save create mode 100644 test/Test_TemplateMatch/sec.lib create mode 100644 test/Test_TemplateMatch/sec.mol2 create mode 100644 test/Test_TemplateMatch/sec_to_cys.map.save diff --git a/README.md b/README.md index f53d2d6091..b3b4e6a0f2 100644 --- a/README.md +++ b/README.md @@ -181,7 +181,7 @@ Enhancements to entropy calculation in original ActionGist. - Amit Roy (University of Utah, UT) Code for the CUDA version of the 'closest' Action. - Nathan D. Levinzon (University of Utah, UT) -Action\surftension. +Original code for ActionSurftension, TemplateMatch. - Andrew Simmonett (National Institutes of Health) Code for the reciprocal part of the particle mesh Ewald calculation (electrostatic and Lennard-Jones). - Christina Bergonzo (National Institute of Standards and Technology, Gaithersburg, MD) diff --git a/dat/templatematch/5PO.mol2 b/dat/templatematch/5PO.mol2 new file mode 100644 index 0000000000..9c5681c6a5 --- /dev/null +++ b/dat/templatematch/5PO.mol2 @@ -0,0 +1,22 @@ +@MOLECULE +modXNA-5'-fragment:DPO:HEAD01:@HO5':HEAD01STRIP:NONE:TAIL01:@O5':TAIL01STRIP:@C5',H5'1,H5'2,H5'3 + 6 5 1 0 0 +SMALL +USER_CHARGES + + +@ATOM + 1 HO5' -0.4750 0.1600 -0.0250 HO 1 5PO 0.437230 + 2 O5' 0.9380 -0.2250 -0.7640 OH 1 5PO -0.640780 + 3 C5' 2.1230 -0.0970 -0.0430 CT 1 5PO -5.280519 + 4 H5'1 2.1370 -0.7580 0.8200 H1 1 5PO 1.651005 + 5 H5'2 2.2680 0.9190 0.3020 H1 1 5PO 1.651005 + 6 H5'3 2.9430 -0.3730 -0.7000 H1 1 5PO 1.651005 +@BOND + 1 1 2 1 + 2 2 3 1 + 3 3 4 1 + 4 3 5 1 + 5 3 6 1 +@SUBSTRUCTURE + 1 5PO 1 **** 0 **** **** diff --git a/dat/templatematch/A9Z.mol2 b/dat/templatematch/A9Z.mol2 new file mode 100644 index 0000000000..d509b36c21 --- /dev/null +++ b/dat/templatematch/A9Z.mol2 @@ -0,0 +1,78 @@ +@MOLECULE +modXNA-fragment:A9Z:HEAD01:@C5':HEAD01STRIP:@O1,H1:TAIL01:@O3':TAIL01STRIP:@H11:HEAD03:@C1':HEAD03STRIP:@C4,H6,H7,H8 + 33 34 1 0 0 +SMALL +USER_CHARGES + + +@ATOM + 1 O1 3.1370 -1.0420 -1.7190 OH 1 A9Z -0.679341 + 2 H1 3.7670 -1.2190 -2.4030 HO 1 A9Z 0.449849 + 3 C5' 3.7840 -0.9700 -0.4760 CI 1 A9Z 0.093465 + 4 H5' 4.6750 -0.3530 -0.5330 H1 1 A9Z 0.031050 + 5 H5'' 4.0770 -1.9640 -0.1400 H1 1 A9Z 0.031050 + 6 C4' 2.8410 -0.3550 0.5400 CT 1 A9Z 0.172623 + 7 H4' 3.2790 -0.4740 1.5280 H1 1 A9Z 0.018289 + 8 O4' 2.6910 1.0140 0.2570 OS 1 A9Z -0.489454 + 9 C1' 1.3330 1.4010 0.2740 CT 1 A9Z 0.413042 + 10 H1' 1.0290 1.6290 1.2870 H2 1 A9Z -0.007044 + 11 C4 1.1520 2.6120 -0.6170 CT 1 A9Z -0.414556 + 12 H6 0.1140 2.9250 -0.6200 HC 1 A9Z 0.143522 + 13 H7 1.4610 2.3870 -1.6320 HC 1 A9Z 0.143522 + 14 H8 1.7560 3.4340 -0.2500 HC 1 A9Z 0.143522 + 15 C3' 1.4230 -0.9620 0.5400 CT 1 A9Z 0.197117 + 16 H3' 1.3860 -1.9130 0.0220 H1 1 A9Z 0.035991 + 17 C2' 0.6340 0.1230 -0.1970 CT 1 A9Z -0.304034 + 18 H2' 0.8150 0.0060 -1.2570 H1 1 A9Z 0.152362 + 19 O3' 0.8980 -1.0800 1.8310 OS 1 A9Z -0.644079 + 20 H11 1.3250 -1.7870 2.2940 HO 1 A9Z 0.412277 + 21 N1' -0.7940 0.0880 0.0170 N* 1 A9Z 0.646711 + 22 N2' -1.3950 0.8720 0.8840 NB 1 A9Z -0.249810 + 23 N3' -2.6330 0.5970 0.8900 NB 1 A9Z -0.395140 + 24 C7' -2.8780 -0.4070 0.0130 CT 1 A9Z 0.349873 + 25 C8' -4.2570 -0.9510 -0.2130 CT 1 A9Z -0.134519 + 26 C6' -1.6900 -0.7390 -0.5550 CW 1 A9Z -0.515361 + 27 H6' -1.4160 -1.4630 -1.2920 H1 1 A9Z 0.278123 + 28 C9' -5.2010 0.0640 -0.8640 CT 1 A9Z -0.005132 + 29 H8' -4.1890 -1.8410 -0.8310 H1 1 A9Z 0.061954 + 30 H8'' -4.6690 -1.2650 0.7410 H1 1 A9Z 0.061954 + 31 H9'1 -6.1940 -0.3580 -0.9860 H1 1 A9Z 0.012460 + 32 H9'2 -5.2830 0.9550 -0.2530 H1 1 A9Z 0.012460 + 33 H9'3 -4.8370 0.3610 -1.8430 H1 1 A9Z 0.012460 +@BOND + 1 1 3 1 + 2 3 6 1 + 3 6 8 1 + 4 6 15 1 + 5 8 9 1 + 6 9 11 1 + 7 9 17 1 + 8 15 17 1 + 9 15 19 1 + 10 17 21 1 + 11 21 22 1 + 12 21 26 1 + 13 22 23 1 + 14 23 24 1 + 15 24 25 1 + 16 24 26 1 + 17 25 28 1 + 18 1 2 1 + 19 3 4 1 + 20 3 5 1 + 21 6 7 1 + 22 9 10 1 + 23 11 12 1 + 24 11 13 1 + 25 11 14 1 + 26 15 16 1 + 27 17 18 1 + 28 19 20 1 + 29 25 29 1 + 30 25 30 1 + 31 26 27 1 + 32 28 31 1 + 33 28 32 1 + 34 28 33 1 +@SUBSTRUCTURE + 1 A9Z 1 **** 0 **** **** diff --git a/dat/templatematch/DAA.mol2 b/dat/templatematch/DAA.mol2 new file mode 100644 index 0000000000..c1f4dc3ee4 --- /dev/null +++ b/dat/templatematch/DAA.mol2 @@ -0,0 +1,56 @@ +@MOLECULE +modXNA-fragment:DAA:HEAD01:@N9:HEAD01STRIP:@C1',H1',O4',HHO4,C2',H2'1,H2'3,H2'2 + 22 23 1 0 0 +SMALL +USER_CHARGES + + +@ATOM + 1 O4' -3.2440 -0.5840 0.8070 OH 1 DAA -0.745625 + 2 C1' -2.4070 0.3660 0.2200 CT 1 DAA 0.043100 + 3 H1' -2.2770 1.2210 0.8710 H2 1 DAA 0.183800 + 4 N9 -1.1080 -0.2670 0.1170 N* 1 DAA -0.026800 + 5 C8 -0.8260 -1.6030 -0.0450 C2 1 DAA 0.160700 + 6 H8 -1.6110 -2.3270 -0.0670 H5 1 DAA 0.187700 + 7 N7 0.4250 -1.8610 -0.1380 NB 1 DAA -0.617500 + 8 C5 1.0350 -0.6260 -0.0370 CB 1 DAA 0.072500 + 9 C6 2.3710 -0.2130 -0.0570 CA 1 DAA 0.689700 + 10 N6 3.3900 -1.0750 -0.2320 N2 1 DAA -0.912300 + 11 H61 4.3130 -0.7420 -0.0690 H 1 DAA 0.416700 + 12 H62 3.2170 -2.0510 -0.1560 H 1 DAA 0.416700 + 13 N1 2.6400 1.0800 0.0800 NC 1 DAA -0.762400 + 14 C2 1.6280 1.9270 0.2190 CQ 1 DAA 0.571600 + 15 H2 1.9070 2.9600 0.3220 H5 1 DAA 0.059800 + 16 N3 0.3410 1.6700 0.2480 NC 1 DAA -0.741700 + 17 C4 0.0970 0.3690 0.1220 CB 1 DAA 0.380000 + 18 C2' -2.9210 0.8200 -1.1380 CT 1 DAA -0.443298 + 19 H2'1 -3.0350 -0.0310 -1.8000 HC 1 DAA 0.124800 + 20 HHO4 -4.1330 -0.2580 0.8240 HO 1 DAA 0.478151 + 21 H2'2 -3.8850 1.3110 -1.0310 HC 1 DAA 0.124800 + 22 H2'3 -2.2310 1.5270 -1.5830 HC 1 DAA 0.124800 +@BOND + 1 1 2 1 + 2 2 4 1 + 3 2 18 1 + 4 4 5 1 + 5 4 17 1 + 6 5 7 1 + 7 7 8 1 + 8 8 9 1 + 9 8 17 1 + 10 9 10 1 + 11 9 13 1 + 12 13 14 1 + 13 14 16 1 + 14 16 17 1 + 15 1 20 1 + 16 2 3 1 + 17 5 6 1 + 18 10 11 1 + 19 10 12 1 + 20 14 15 1 + 21 18 19 1 + 22 18 21 1 + 23 18 22 1 +@SUBSTRUCTURE + 1 DAA 1 **** 0 **** **** diff --git a/dat/templatematch/DDD.mol2 b/dat/templatematch/DDD.mol2 new file mode 100644 index 0000000000..660dd989c3 --- /dev/null +++ b/dat/templatematch/DDD.mol2 @@ -0,0 +1,69 @@ +@MOLECULE +modXNA-fragment:DDD:HEAD01:@C5':HEAD01STRIP:@O5',P,OP1,OP2,OP3,H20:TAIL01:@O3':TAIL01STRIP:@P2,O12,O15,O16,H24:HEAD03:@C1':HEAD03STRIP:@C12,H21,H22,H23 + 29 29 1 0 0 +SMALL +USER_CHARGES + + +@ATOM + 1 P 3.3120 0.8260 0.2850 P 1 DDD 1.357695 + 2 OP1 3.6570 0.4210 1.6600 O2 1 DDD -0.844048 + 3 OP2 3.8210 2.0600 -0.3390 O2 1 DDD -0.844048 + 4 O5' 1.6640 0.7980 0.2240 OS 1 DDD -0.521429 + 5 O3' -2.2180 0.1650 -0.7670 OS 1 DDD -0.522241 + 6 C1' 0.2200 -2.4400 -0.1910 CT 1 DDD 0.383655 + 7 C2' -1.2130 -1.9410 -0.0230 CT 1 DDD -0.330047 + 8 C3' -1.0840 -0.4310 -0.2080 C7 1 DDD 0.254753 + 9 C4' 0.0840 -0.3150 -1.1950 CT 1 DDD 0.066591 + 10 C5' 0.9900 0.8930 -0.9940 CJ 1 DDD 0.148110 + 11 O4' 0.8360 -1.5150 -1.0720 OS 1 DDD -0.490259 + 12 C12 1.0120 -2.5340 1.1080 CT 1 DDD -0.293809 + 13 H1' 0.2430 -3.4090 -0.6840 H2 1 DDD -0.060446 + 14 H2' -1.8440 -2.3190 -0.8220 HC 1 DDD 0.116231 + 15 H2'' -1.6690 -2.2070 0.9200 HC 1 DDD 0.116231 + 16 H3' -0.8200 0.0460 0.7280 H1 1 DDD 0.052484 + 17 H4' -0.3370 -0.2720 -2.1970 H1 1 DDD 0.044462 + 18 H5' 1.6860 0.9680 -1.8200 H1 1 DDD 0.017730 + 19 H5'' 0.3690 1.7850 -1.0000 H1 1 DDD 0.017730 + 20 OP3 3.6120 -0.3960 -0.7630 OH 1 DDD -0.736711 + 21 H20 2.9190 -1.0440 -0.7120 HO 1 DDD 0.395040 + 22 H21 0.5560 -3.2640 1.7750 HC 1 DDD 0.087628 + 23 H22 1.0620 -1.5760 1.6110 HC 1 DDD 0.087628 + 24 H23 2.0320 -2.8460 0.9090 HC 1 DDD 0.087628 + 25 P2 -3.5100 0.5750 0.1540 P 1 DDD 1.280167 + 26 O12 -4.6060 0.8720 -0.7750 O2 1 DDD -0.822080 + 27 O15 -2.9840 1.9790 0.8140 OH 1 DDD -0.713044 + 28 O16 -3.6100 -0.3910 1.2730 O2 1 DDD -0.822080 + 29 H24 -2.6520 1.7830 1.6800 HO 1 DDD 0.397510 +@BOND + 1 1 2 1 + 2 1 3 1 + 3 1 4 1 + 4 1 20 1 + 5 4 10 1 + 6 5 8 1 + 7 5 25 1 + 8 6 7 1 + 9 6 11 1 + 10 6 12 1 + 11 7 8 1 + 12 8 9 1 + 13 9 10 1 + 14 9 11 1 + 15 25 26 1 + 16 25 27 1 + 17 25 28 1 + 18 6 13 1 + 19 7 14 1 + 20 7 15 1 + 21 8 16 1 + 22 9 17 1 + 23 10 18 1 + 24 10 19 1 + 25 12 22 1 + 26 12 23 1 + 27 12 24 1 + 28 20 21 1 + 29 27 29 1 +@SUBSTRUCTURE + 1 DDD 1 **** 0 **** **** diff --git a/dat/templatematch/DPO.mol2 b/dat/templatematch/DPO.mol2 new file mode 100644 index 0000000000..fbde0e2584 --- /dev/null +++ b/dat/templatematch/DPO.mol2 @@ -0,0 +1,100 @@ +@MOLECULE +modXNA-fragment:DPO:HEAD01:@P:HEAD01STRIP:@O3',C3,H31,H32,H33:TAIL01:@O5':TAIL01STRIP:@C5',H5'1,H5'2,H5'3 + 13 12 1 0 0 +NUCLEIC_ACID +USER_CHARGES + + +@ATOM + 1 P -0.808000 -8.873000 -2.080000 P 1 DPO 1.1659 + 2 OP1 -2.029000 -8.583000 -1.290000 O2 1 DPO -0.7761 + 3 OP2 -0.196000 -10.198000 -1.860000 O2 1 DPO -0.7761 + 4 O5' 0.270000 -7.725000 -1.830000 OS 1 DPO -0.4954 + 5 C5' 1.364000 -7.578000 -2.770000 CJ 1 DPO 0.1500 + 6 H5'1 1.104000 -6.836000 -3.525000 H1 1 DPO 0.0182 + 7 H5'2 1.561000 -8.532000 -3.258000 H1 1 DPO 0.0182 + 8 O3' -1.195228 -8.803498 -3.527489 OS 1 DPO -0.5232 + 9 C3 -1.779497 -7.454439 -3.825261 CJ 1 DPO 0.1500 + 10 H5'3 2.257559 -7.253395 -2.236818 H1 1 DPO 0.0182 + 11 H31 -2.060879 -7.403911 -4.877056 H1 1 DPO 0.0181 + 12 H32 -1.040768 -6.682402 -3.609846 H1 1 DPO 0.0181 + 13 H33 -2.662006 -7.295315 -3.205566 H1 1 DPO 0.0181 +@BOND + 1 1 4 1 + 2 4 5 1 + 3 1 2 2 + 4 1 3 1 + 5 6 5 1 + 6 7 5 1 + 7 1 8 1 + 8 8 9 1 + 9 5 10 1 + 10 9 11 1 + 11 9 12 1 + 12 9 13 1 +@SUBSTRUCTURE +1 DPO 1 RESIDUE 1 S DA +@SET +GROUP:Nucleic_Acid_Groups:Sugar STATIC ATOMS +5 4 5 6 7 10 +GROUP:Nucleic_Acid_Groups:Phosphate STATIC ATOMS +4 1 2 3 8 +GROUP:Nucleic_Acid_Groups:Backbone STATIC ATOMS +9 1 2 3 4 5 6 7 8 10 +GROUP:Nucleic_Acid_Groups:Purine STATIC SUBSTRUCTURES +1 1 +GROUP:Nucleic_Acid_Groups:Base STATIC ATOMS +4 9 11 12 13 +GROUP:Nucleic_Acid_Groups:Pyrimidine STATIC SUBSTRUCTURES +1 1 +@ATOM_PROPERTY +Formal Charge +SciTegic.value.StringValue +1 0 +2 0 +3 -1 +4 0 +5 0 +6 0 +7 0 +8 0 +9 0 +10 0 +11 0 +12 0 +13 0 + +@ATOM_PROPERTY +pdb_tempFactor +SciTegic.value.DoubleValue +1 0.00 +2 0.00 +3 0.00 +4 0.00 +5 0.00 +6 0.00 +7 0.00 +8 0.00 +9 0.00 +10 0.00 +11 0.00 +12 0.00 +13 0.00 + +@ATOM_PROPERTY +pdb_occupancy +SciTegic.value.DoubleValue +1 1.00 +2 1.00 +3 1.00 +4 1.00 +5 1.00 +6 1.00 +7 1.00 +8 1.00 +9 1.00 +10 1.00 +11 1.00 +12 1.00 +13 1.00 + diff --git a/dat/templatematch/DTT.mol2 b/dat/templatematch/DTT.mol2 new file mode 100644 index 0000000000..a9aaa6d238 --- /dev/null +++ b/dat/templatematch/DTT.mol2 @@ -0,0 +1,55 @@ +@MOLECULE +modXNA-fragment:DTT:HEAD01:@N1:HEAD01STRIP:@C1',H1',O4',HHO4,C2',H2'1,H2'3,H2'2 + 22 22 1 0 0 +SMALL +USER_CHARGES + + +@ATOM + 1 C1' 2.1810 -0.1650 -0.1800 CT 1 TTT 0.067400 + 2 C2' 2.7740 -0.3090 1.2130 CT 1 TTT -0.415654 + 3 O4' 2.3730 -1.3160 -0.9490 OH 1 TTT -0.730006 + 4 O4 -3.1900 0.7190 0.0810 O 1 TTT -0.556300 + 5 C4 -2.0240 0.4570 0.0230 C 1 TTT 0.519400 + 6 N3 -1.0800 1.4670 -0.0700 NA 1 TTT -0.434000 + 7 C2 0.2820 1.3460 -0.1330 C 1 TTT 0.567700 + 8 O2 1.0060 2.3000 -0.1760 O 1 TTT -0.588100 + 9 N1 0.7370 0.0520 -0.1330 N* 1 TTT -0.023900 + 10 C6 -0.1350 -1.0170 -0.0340 CM 1 TTT -0.220900 + 11 C5 -1.4590 -0.8940 0.0440 CM 1 TTT 0.002500 + 12 C7 -2.4080 -2.0550 0.1420 CT 1 TTT -0.226900 + 13 H1' 2.5960 0.6980 -0.6740 H2 1 TTT 0.180400 + 14 H2'1 3.8480 -0.4630 1.1510 HC 1 TTT 0.116488 + 15 H2'2 2.5960 0.5910 1.7900 HC 1 TTT 0.116488 + 16 H3 -1.4260 2.4030 -0.0750 H 1 TTT 0.342000 + 17 H6 0.3440 -1.9740 -0.0420 H4 1 TTT 0.260700 + 18 H71 -3.0000 -1.9950 1.0480 HC 1 TTT 0.077000 + 19 H72 -3.1000 -2.0590 -0.6930 HC 1 TTT 0.077000 + 20 H73 -1.8680 -2.9950 0.1440 HC 1 TTT 0.077000 + 21 H2'3 2.3360 -1.1570 1.7300 HC 1 TTT 0.116488 + 22 HHO4 3.3010 -1.4750 -1.0520 HO 1 TTT 0.472667 +@BOND + 1 1 2 1 + 2 1 3 1 + 3 1 9 1 + 4 4 5 1 + 5 5 6 1 + 6 5 11 1 + 7 6 7 1 + 8 7 8 1 + 9 7 9 1 + 10 9 10 1 + 11 10 11 1 + 12 11 12 1 + 13 1 13 1 + 14 2 14 1 + 15 2 15 1 + 16 2 21 1 + 17 3 22 1 + 18 6 16 1 + 19 10 17 1 + 20 12 18 1 + 21 12 19 1 + 22 12 20 1 +@SUBSTRUCTURE + 1 TTT 1 **** 0 **** **** diff --git a/dat/templatematch/OME.mol2 b/dat/templatematch/OME.mol2 new file mode 100644 index 0000000000..81fcf40f28 --- /dev/null +++ b/dat/templatematch/OME.mol2 @@ -0,0 +1,61 @@ +@MOLECULE +modXNA-fragment:OME:HEAD01:@C5':HEAD01STRIP:@O1,H6:TAIL01:@O3':TAIL01STRIP:@H7:HEAD03:@C1':HEAD03STRIP:@C6,H9,H10,H11 + 25 25 1 0 0 +SMALL +USER_CHARGES + + +@ATOM + 1 O1 -2.7373 -0.2986 0.9909 OH 1 OME -0.658348 + 2 C5' -2.7524 0.3397 -0.2608 CI 1 OME 0.119115 + 3 H5' -3.0793 1.3567 -0.0940 H1 1 OME 0.042013 + 4 H5'' -3.4681 -0.1362 -0.9296 H1 1 OME 0.042013 + 5 C4' -1.3842 0.3812 -0.9232 CT 1 OME 0.116491 + 6 H4' -1.5101 0.7720 -1.9318 H1 1 OME 0.013915 + 7 O4' -0.5514 1.2469 -0.1927 OS 1 OME -0.474448 + 8 C1' 0.6960 0.6492 0.0801 CT 1 OME 0.283784 + 9 C3' -0.7976 -0.9215 -0.6469 CT 1 OME 0.127930 + 10 H3' -1.1941 -1.1239 0.3457 H1 1 OME 0.019321 + 11 C2' 0.6823 -0.7355 -0.6333 CT 1 OME 0.174570 + 12 H2' 1.4551 -1.4302 -0.3109 H1 1 OME 0.028124 + 13 O3' -1.1700 -2.0638 -1.0949 OS 1 OME -0.658945 + 14 H6 -2.9513 -1.2139 0.8920 HO 1 OME 0.409446 + 15 C6 1.2669 1.2326 1.3547 CT 1 OME -0.214186 + 16 H7 -1.4631 -2.8504 -0.6568 HO 1 OME 0.425460 + 17 H1' 1.3773 0.8180 -0.7490 H2 1 OME 0.018264 + 18 O2' 1.0039 -0.1767 -1.8583 OS 1 OME -0.414486 + 19 H9 2.2104 0.7535 1.5917 H1 1 OME 0.075428 + 20 H10 0.5774 1.0868 2.1784 H1 1 OME 0.075428 + 21 H11 1.4405 2.2973 1.2391 H1 1 OME 0.075428 + 22 CM2 0.1755 0.8586 -2.2875 CT 1 OME -0.017009 + 23 HM'1 0.4874 1.1245 -3.2888 H1 1 OME 0.066018 + 24 HM'2 0.2676 1.7327 -1.6505 H1 1 OME 0.066018 + 25 HM'3 -0.8669 0.5454 -2.3163 H1 1 OME 0.066018 +@BOND + 1 1 2 1 + 2 2 5 1 + 3 5 7 1 + 4 5 9 1 + 5 7 8 1 + 6 8 11 1 + 7 8 15 1 + 8 9 11 1 + 9 9 13 1 + 10 11 18 1 + 11 18 22 1 + 12 1 14 1 + 13 2 3 1 + 14 2 4 1 + 15 5 6 1 + 16 8 17 1 + 17 9 10 1 + 18 11 12 1 + 19 13 16 1 + 20 15 19 1 + 21 15 20 1 + 22 15 21 1 + 23 22 23 1 + 24 22 24 1 + 25 22 25 1 +@SUBSTRUCTURE + 1 OME 1 **** 0 **** **** diff --git a/dat/templatematch/PARENTS.txt b/dat/templatematch/PARENTS.txt new file mode 100644 index 0000000000..5588621be2 --- /dev/null +++ b/dat/templatematch/PARENTS.txt @@ -0,0 +1,32 @@ +# Official ModXNA parent templates shipped with cpptraj. +# +# These 11 fragments are the consensus parents chosen from the ModXNA library +# (https://github.com/modna-ff). cpptraj ships only these files, not the +# full ModXNA corpus. Each file's atom order is the recommended TI +# shared-atom order for that chemical class. +# +# Load with: +# parm $CPPTRAJHOME/dat/templatematch/DAA.mol2 name DAA +# +# Then map an analog: +# templatematch analog template DAA mapout analog.map name analog.ti +# +# Combined nucleotides are mapped to a user residue (for example FLE = rA +# onto ERN = dA), not to these fragments. Use naorder on that residue to +# freeze a full-nucleotide template. For amino acids and small molecules +# generate your own parent (cysteine, benzene, ...) -- see the templatematch +# section of the cpptraj manual. +# +# file class notes +# ----- ----------------------- ------------------------------------------ +# 5PO backbone, no phosphate 5'-OH cap +# DPO backbone, phosphate canonical phosphodiester +# DAA purine base deoxyadenine nucleobase +# DTT pyrimidine base deoxythymine nucleobase +# TMC purine base + phosphate rare combined fragment; 1 corpus member +# UFB sugar, 2'-F +# A9Z sugar, 2'-HH bulky analog; prefer a real d-ribose if you have one +# DDD sugar, 2'-HH + phosphate rare combined fragment; 1 corpus member +# RUR sugar, 2'-OH ribose +# OME sugar, 2'-OMe +# RBO sugar, 2'-OR 2'-O-benzyl, not plain ribose diff --git a/dat/templatematch/RBO.mol2 b/dat/templatematch/RBO.mol2 new file mode 100644 index 0000000000..bc68ca73d4 --- /dev/null +++ b/dat/templatematch/RBO.mol2 @@ -0,0 +1,82 @@ +@MOLECULE +modXNA-fragment:RBO:HEAD01:@C5':HEAD01STRIP:@O1,H6:TAIL01:@O3':TAIL01STRIP:@H7:HEAD03:@C1':HEAD03STRIP:@C6,H9,H10,H11 + 35 36 1 0 0 +SMALL +USER_CHARGES + + +@ATOM + 1 O1 -4.7030 -0.8700 0.0080 OH 1 RBO -0.686540 + 2 C5' -3.6320 -1.6730 -0.3980 CI 1 RBO 0.218167 + 3 H5' -3.8010 -2.0640 -1.3980 H1 1 RBO 0.013241 + 4 H5'' -3.5780 -2.5090 0.2870 H1 1 RBO 0.013241 + 5 C4' -2.3190 -0.9140 -0.3690 CT 1 RBO 0.108579 + 6 H4' -1.5290 -1.5420 -0.7760 H1 1 RBO -0.000075 + 7 O4' -2.4690 0.2550 -1.1450 OS 1 RBO -0.480597 + 8 C1' -1.6410 1.3050 -0.6710 CT 1 RBO 0.209892 + 9 C3' -1.9000 -0.3920 1.0020 CT 1 RBO 0.221414 + 10 H3' -2.7760 -0.0250 1.5190 H1 1 RBO 0.062201 + 11 C2' -0.9930 0.7790 0.6200 CT 1 RBO -0.020677 + 12 H2' -0.9330 1.5350 1.3970 H1 1 RBO 0.075189 + 13 O2' 0.2820 0.2340 0.3890 OS 1 RBO -0.261827 + 14 O3' -1.2990 -1.3380 1.8210 OS 1 RBO -0.675377 + 15 H6 -4.7270 -0.1150 -0.5650 HO 1 RBO 0.426097 + 16 C6 -2.4890 2.5530 -0.4810 CT 1 RBO -0.314105 + 17 H7 -0.3920 -1.4250 1.5500 HO 1 RBO 0.395637 + 18 H1' -0.8730 1.4940 -1.4120 H2 1 RBO 0.067178 + 19 H9 -1.8710 3.4040 -0.2110 HC 1 RBO 0.110105 + 20 H10 -3.2300 2.4060 0.2990 HC 1 RBO 0.110105 + 21 H11 -3.0110 2.7890 -1.4010 HC 1 RBO 0.110105 + 22 C6' 1.3540 1.1380 0.4220 CT 1 RBO 0.013309 + 23 H6' 1.1860 1.9370 -0.2980 H1 1 RBO 0.058543 + 24 H6'' 1.4190 1.5960 1.4050 H1 1 RBO 0.058543 + 25 C7' 2.6380 0.4150 0.0980 CA 1 RBO 0.076537 + 26 C82' 2.7110 -0.4330 -1.0030 CA 1 RBO -0.150705 + 27 H82' 1.8350 -0.5980 -1.6040 HA 1 RBO 0.140745 + 28 C92' 3.8960 -1.0710 -1.3190 CA 1 RBO -0.087769 + 29 H92' 3.9390 -1.7270 -2.1700 HA 1 RBO 0.135949 + 30 C10' 5.0280 -0.8660 -0.5420 CA 1 RBO -0.118207 + 31 H10' 5.9500 -1.3630 -0.7900 HA 1 RBO 0.139145 + 32 C91' 4.9640 -0.0240 0.5520 CA 1 RBO -0.087769 + 33 H91' 5.8350 0.1360 1.1630 HA 1 RBO 0.135949 + 34 C81' 3.7720 0.6100 0.8720 CA 1 RBO -0.150705 + 35 H81' 3.7290 1.2560 1.7320 HA 1 RBO 0.140745 +@BOND + 1 1 2 1 + 2 2 5 1 + 3 5 7 1 + 4 5 9 1 + 5 7 8 1 + 6 8 11 1 + 7 8 16 1 + 8 9 11 1 + 9 9 14 1 + 10 11 13 1 + 11 13 22 1 + 12 22 25 1 + 13 25 26 1 + 14 25 34 1 + 15 26 28 1 + 16 28 30 1 + 17 30 32 1 + 18 32 34 1 + 19 1 15 1 + 20 2 3 1 + 21 2 4 1 + 22 5 6 1 + 23 8 18 1 + 24 9 10 1 + 25 11 12 1 + 26 14 17 1 + 27 16 19 1 + 28 16 20 1 + 29 16 21 1 + 30 22 23 1 + 31 22 24 1 + 32 26 27 1 + 33 28 29 1 + 34 30 31 1 + 35 32 33 1 + 36 34 35 1 +@SUBSTRUCTURE + 1 RBO 1 **** 0 **** **** diff --git a/dat/templatematch/RUR.mol2 b/dat/templatematch/RUR.mol2 new file mode 100644 index 0000000000..d14f7d7fa2 --- /dev/null +++ b/dat/templatematch/RUR.mol2 @@ -0,0 +1,58 @@ +@MOLECULE +modXNA-fragment:RUR:HEAD01:@C5':HEAD01STRIP:@O1,H6:TAIL01:@O3':TAIL01STRIP:@H7:HEAD03:@C1':HEAD03STRIP:@C6,H9,H10,H11 + 24 23 1 0 0 +SMALL +USER_CHARGES + + +@ATOM + 1 O1 -2.3050 -1.6420 -0.0240 OH 1 RUR -0.710314 + 2 C5' -1.6370 -0.8720 0.9380 CI 1 RUR 0.222004 + 3 H5' -0.9510 -1.4870 1.5170 H1 1 RUR 0.010411 + 4 H5'' -2.3890 -0.4930 1.6150 H1 1 RUR 0.010411 + 5 C4' -0.8740 0.2810 0.3020 CT 1 RUR 0.092794 + 6 H4' -0.4800 0.9130 1.0940 H1 1 RUR 0.025391 + 7 O4' 0.1700 -0.2280 -0.4980 OS 1 RUR -0.642531 + 8 C1' 1.4480 -0.3580 0.0820 CT 1 RUR 0.426540 + 9 C3' -1.7480 1.1200 -0.6280 CT 1 RUR 0.222004 + 10 H3' -1.9270 0.5600 -1.5390 H1 1 RUR 0.007912 + 11 C2' 2.2210 0.9420 -0.1330 CT 1 RUR 0.007159 + 12 H2' 2.3890 1.0840 -1.1920 H1 1 RUR 0.096729 + 13 O2' 3.4820 0.9180 0.4790 OH 1 RUR -0.653987 + 14 O3' -2.9470 1.5070 -0.0210 OS 1 RUR -0.710314 + 15 H6 -1.6680 -1.9440 -0.6590 HO 1 RUR 0.455382 + 16 C6 2.1400 -1.5500 -0.5560 CT 1 RUR -0.282455 + 17 H7 -3.5620 0.7870 -0.0760 HO 1 RUR 0.455382 + 18 H1' 1.3500 -0.5340 1.1530 H2 1 RUR -0.065373 + 19 H9 3.1530 -1.6450 -0.1860 HC 1 RUR 0.099165 + 20 H10 2.1750 -1.4250 -1.6330 HC 1 RUR 0.099165 + 21 H11 1.5990 -2.4650 -0.3380 HC 1 RUR 0.099165 + 22 H3'' -1.2160 2.0230 -0.8980 H1 1 RUR 0.010411 + 23 H2'' 1.6330 1.7870 0.2200 H1 1 RUR 0.096729 + 24 HO2' 3.3870 1.0240 1.4150 HO 1 RUR 0.408443 +@BOND + 1 1 2 1 + 2 2 5 1 + 3 5 7 1 + 4 5 9 1 + 5 7 8 1 + 6 8 11 1 + 7 8 16 1 + 8 9 14 1 + 9 11 13 1 + 10 1 15 1 + 11 2 3 1 + 12 2 4 1 + 13 5 6 1 + 14 8 18 1 + 15 9 10 1 + 16 9 22 1 + 17 11 12 1 + 18 11 23 1 + 19 13 24 1 + 20 14 17 1 + 21 16 19 1 + 22 16 20 1 + 23 16 21 1 +@SUBSTRUCTURE + 1 RUR 1 **** 0 **** **** diff --git a/dat/templatematch/TMC.mol2 b/dat/templatematch/TMC.mol2 new file mode 100644 index 0000000000..60bb8e5c94 --- /dev/null +++ b/dat/templatematch/TMC.mol2 @@ -0,0 +1,92 @@ +@MOLECULE +modXNA-fragment:TMC:HEAD01:@N3:HEAD01STRIP:@C1,C2,O1,H1,H2,H3,H7,H8 + 40 41 1 0 0 +SMALL +USER_CHARGES + + +@ATOM + 1 C1 -6.0900 -0.6500 0.1500 CT 1 TMC 0.299384 + 2 C2 -6.1670 -2.0190 0.8110 CT 1 TMC -0.338476 + 3 O1 -7.0100 0.2470 0.6940 OH 1 TMC -0.734852 + 4 N1 -0.3990 1.1790 -0.0370 N2 1 TMC -0.645719 + 5 C3 -1.4390 0.4620 -0.4960 CA 1 TMC 0.584071 + 6 C4 -2.6930 0.5090 0.1320 CB 1 TMC -0.082278 + 7 N2 -3.1610 1.1710 1.2490 NB 1 TMC -0.621722 + 8 C5 -4.3910 0.8200 1.3310 CK 1 TMC 0.204850 + 9 N3 -4.7900 -0.0380 0.3350 N* 1 TMC -0.139760 + 10 C6 -3.6890 -0.2440 -0.4410 CB 1 TMC 0.396792 + 11 N4 -3.5750 -1.0120 -1.5230 NC 1 TMC -0.820978 + 12 C7 -2.3600 -0.9750 -2.0150 CQ 1 TMC 0.515957 + 13 N5 -1.3030 -0.3000 -1.5750 NC 1 TMC -0.847307 + 14 H1 -6.2310 -0.7480 -0.9190 H2 1 TMC 0.068649 + 15 H2 -7.1420 -2.4660 0.6390 HC 1 TMC 0.126559 + 16 H3 -5.4160 -2.6790 0.3930 HC 1 TMC 0.126559 + 17 C8 0.9590 1.0530 -0.5280 CT 1 TMC 0.128351 + 18 H4 -0.5430 1.6270 0.8410 H 1 TMC 0.344693 + 19 H5 -5.0820 1.1520 2.0750 H5 1 TMC 0.155797 + 20 H6 -2.1860 -1.5720 -2.8930 H5 1 TMC 0.040599 + 21 H7 -6.0080 -1.9280 1.8790 HC 1 TMC 0.126559 + 22 H8 -7.8760 -0.1360 0.6760 HO 1 TMC 0.476626 + 23 C9 1.7530 2.3120 -0.1930 CT 1 TMC 0.025710 + 24 C10 3.2020 2.2650 -0.6980 CT 1 TMC -0.123482 + 25 C11 4.0540 1.2550 0.0210 CM 1 TMC 0.019055 + 26 C12 4.7310 0.2790 -0.5610 CM 1 TMC -0.351725 + 27 P1 5.7790 -0.8650 0.3090 P 1 TMC 1.207689 + 28 H9 1.4390 0.1730 -0.1080 H1 1 TMC 0.053905 + 29 H10 0.9150 0.9110 -1.5970 H1 1 TMC 0.053905 + 30 H11 1.2530 3.1670 -0.6360 HC 1 TMC 0.014755 + 31 H12 1.7540 2.4740 0.8840 HC 1 TMC 0.014755 + 32 H13 3.2190 2.0740 -1.7660 HC 1 TMC 0.078356 + 33 H14 3.6480 3.2460 -0.5470 HC 1 TMC 0.078356 + 34 H15 4.1010 1.3590 1.0920 HA 1 TMC 0.124936 + 35 H16 4.7000 0.1450 -1.6290 HA 1 TMC 0.209140 + 36 O2 7.2080 -0.8580 0.0140 O2 1 TMC -0.745756 + 37 O3 5.0890 -2.2670 -0.0050 OH 1 TMC -0.676900 + 38 O4 5.4800 -0.5870 1.8530 OH 1 TMC -0.676900 + 39 H17 6.2900 -0.5120 2.3470 HO 1 TMC 0.463101 + 40 H18 5.7230 -2.9760 -0.0410 HO 1 TMC 0.463101 +@BOND + 1 1 2 1 + 2 1 3 1 + 3 1 9 1 + 4 4 5 1 + 5 4 17 1 + 6 5 6 1 + 7 5 13 1 + 8 6 7 1 + 9 6 10 1 + 10 7 8 1 + 11 8 9 1 + 12 9 10 1 + 13 10 11 1 + 14 11 12 1 + 15 12 13 1 + 16 17 23 1 + 17 23 24 1 + 18 24 25 1 + 19 25 26 1 + 20 26 27 1 + 21 27 36 1 + 22 27 37 1 + 23 27 38 1 + 24 1 14 1 + 25 2 15 1 + 26 2 16 1 + 27 2 21 1 + 28 3 22 1 + 29 4 18 1 + 30 8 19 1 + 31 12 20 1 + 32 17 28 1 + 33 17 29 1 + 34 23 30 1 + 35 23 31 1 + 36 24 32 1 + 37 24 33 1 + 38 25 34 1 + 39 26 35 1 + 40 37 40 1 + 41 38 39 1 +@SUBSTRUCTURE + 1 TMC 1 **** 0 **** **** diff --git a/dat/templatematch/UFB.mol2 b/dat/templatematch/UFB.mol2 new file mode 100644 index 0000000000..d887dd4c9a --- /dev/null +++ b/dat/templatematch/UFB.mol2 @@ -0,0 +1,61 @@ +@MOLECULE +modXNA-fragment:UFB:HEAD01:@C5':HEAD01STRIP:@O3,H10:TAIL01:@O3':TAIL01STRIP:@H4:HEAD03:@C1':HEAD03STRIP:@C2,H11,H12,H13 + 25 25 1 0 0 +SMALL +USER_CHARGES + + +@ATOM + 1 C1' -1.4540 0.1120 0.7800 CT 1 UFB 0.276778 + 2 C2 -2.6610 0.9730 1.0880 CT 1 UFB -0.434204 + 3 C2' -1.3440 -0.3890 -0.6510 CT 1 UFB 0.102100 + 4 F2' -2.1090 -1.5080 -0.8650 F 1 UFB -0.271425 + 5 C3' 0.1420 -0.7060 -0.7750 CT 1 UFB 0.076654 + 6 O3' 0.3880 -1.9970 -0.2850 OS 1 UFB -0.646388 + 7 C4' 0.7910 0.3400 0.1720 CT 1 UFB 0.206737 + 8 O6' 1.4320 1.3570 -0.5070 OS 1 UFB -0.308597 + 9 C6' 0.6860 2.2240 -1.3120 CT 1 UFB 0.101541 + 10 C5' 1.8230 -0.2500 1.1320 CI 1 UFB -0.007930 + 11 O3 2.8540 -0.9240 0.4810 OH 1 UFB -0.647820 + 12 O4' -0.2760 0.8680 0.9290 OS 1 UFB -0.467153 + 13 H1' -1.4340 -0.7500 1.4420 H2 1 UFB 0.037811 + 14 H2' -1.6610 0.3630 -1.3590 H1 1 UFB 0.078816 + 15 H3' 0.5260 -0.6080 -1.7820 H1 1 UFB 0.079384 + 16 H4 -0.2490 -2.5950 -0.6540 HO 1 UFB 0.445843 + 17 H6'1 1.3800 2.9630 -1.6860 HC 1 UFB 0.022519 + 18 H6'2 -0.0920 2.7220 -0.7470 HC 1 UFB 0.022519 + 19 H6'3 0.2430 1.7140 -2.1640 HC 1 UFB 0.022519 + 20 H5' 2.2600 0.5800 1.6670 H1 1 UFB 0.129040 + 21 H5'' 1.3120 -0.8880 1.8420 H1 1 UFB 0.129040 + 22 H10 2.5100 -1.7490 0.1650 HO 1 UFB 0.438283 + 23 H11 -2.6250 1.3180 2.1140 HC 1 UFB 0.162427 + 24 H12 -3.5730 0.4030 0.9480 HC 1 UFB 0.162427 + 25 H13 -2.6880 1.8410 0.4370 HC 1 UFB 0.162427 +@BOND + 1 1 2 1 + 2 1 3 1 + 3 1 12 1 + 4 3 4 1 + 5 3 5 1 + 6 5 6 1 + 7 5 7 1 + 8 7 8 1 + 9 7 10 1 + 10 7 12 1 + 11 8 9 1 + 12 10 11 1 + 13 1 13 1 + 14 2 23 1 + 15 2 24 1 + 16 2 25 1 + 17 3 14 1 + 18 5 15 1 + 19 6 16 1 + 20 9 17 1 + 21 9 18 1 + 22 9 19 1 + 23 10 20 1 + 24 10 21 1 + 25 11 22 1 +@SUBSTRUCTURE + 1 UFB 1 **** 0 **** **** diff --git a/doc/cpptraj.lyx b/doc/cpptraj.lyx index dd657e6d8c..4380ed5d2f 100644 --- a/doc/cpptraj.lyx +++ b/doc/cpptraj.lyx @@ -25170,6 +25170,35 @@ Calculate system temperature using velocities of specified atoms. \begin_inset Text +\begin_layout Plain Layout +templatematch +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout +Map a residue onto a user template so shared atoms occupy the same indices (TI; nucleic acids, amino acids, ligands). +\end_layout + +\end_inset + + +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset + + + + +\begin_inset Text + \begin_layout Plain Layout time \end_layout @@ -26423,6 +26452,307 @@ run crdout MyAvg mypdb.pdb adpdata MyFluct[ADP] bfacdata MyFluct \end_layout +\begin_layout Subsection +templatematch +\end_layout + +\begin_layout LyX-Code +templatematch +\begin_inset Index idx +range none +pageformat default +status collapsed + +\begin_layout Plain Layout +templatematch +\end_layout + +\end_inset + + [template ] [mapout ] [name ] +\begin_inset Newline newline +\end_inset + + [maponly] [replace] [naorder] +\end_layout + +\begin_layout LyX-Code + [seed {auto|names|na|none}] [anchor ] +\end_layout + +\begin_deeper +\begin_layout Standard +Align atoms in topology +\series bold + +\series default + to a user-supplied template so shared atoms occupy the same indices. + This is intended for preparing residue libraries for thermodynamic integration (TI) of nucleic acids, amino acids, and small molecules, + where two (or more) end states must list common atoms in the same order. + Unlike +\series bold +atommap +\series default +, a one-to-one correspondence is not required: extra atoms on the target are insertions. + Partial maps are expected and useful. +\end_layout + +\begin_layout Standard +The template atom order +\series emph +is +\series default + the TI shared-atom order. + Any topology can be a template (mol2, Amber OFF unit loaded with +\series bold +readdata +\series default +, and so on). + Official ModXNA parent fragments shipped with cpptraj live in +\series bold +$CPPTRAJHOME/dat/templatematch/ +\series default + (see PARENTS.txt there). + Use those as-is for ModXNA-class nucleic-acid fragments; for everything else, generate your own template as below. +\end_layout + +\begin_layout Description + Topology (or COORDS set) whose atoms will be reordered. +\end_layout + +\begin_layout Description +template +\begin_inset space ~ +\end_inset + + Template topology. + If omitted, +\series bold + +\series default + is matched to itself (useful with +\series bold +naorder +\series default +). +\end_layout + +\begin_layout Description +mapout +\begin_inset space ~ +\end_inset + + Write the atom map (output index, target atom, template atom, insertion flag). +\end_layout + +\begin_layout Description +name +\begin_inset space ~ +\end_inset + + Store the remapped topology as a new topology set. +\end_layout + +\begin_layout Description +maponly Write the map but do not create a remapped topology. +\end_layout + +\begin_layout Description +replace Overwrite +\series bold + +\series default + with the remapped atom order. +\end_layout + +\begin_layout Description +naorder Walk the template as P +\begin_inset Formula $\rightarrow$ +\end_inset + + O5' +\begin_inset Formula $\rightarrow$ +\end_inset + + C5' +\begin_inset Formula $\rightarrow$ +\end_inset + + C4' +\begin_inset Formula $\rightarrow$ +\end_inset + + O4' +\begin_inset Formula $\rightarrow$ +\end_inset + + C1' +\begin_inset Formula $\rightarrow$ +\end_inset + + base +\begin_inset Formula $\rightarrow$ +\end_inset + + C3' +\begin_inset Formula $\rightarrow$ +\end_inset + + C2' +\begin_inset Formula $\rightarrow$ +\end_inset + + O3' instead of using the file atom order. + Use this to +\series emph +generate +\series default + a nucleic-acid template from an existing residue. +\end_layout + +\begin_layout Description +seed How the correspondence is started. + +\series bold +auto +\series default + (default) uses nucleic-acid scaffold roles when they are detected, otherwise unique atom names. + +\series bold +names +\series default + uses unique names only. + +\series bold +na +\series default + forces scaffold seeding. + +\series bold +none +\series default + performs no matching (not generally useful). + The map is then grown by neighbor element/degree signatures. + Partial maps are expected. +\end_layout + +\begin_layout Description +anchor +\begin_inset space ~ +\end_inset + + Name of the template atom before which completely unmatched leftovers are inserted (default O3'). + Atoms that are bonded to a mapped parent are inserted immediately after that parent instead. +\end_layout + +\begin_layout Standard +\series bold +Generating your own templates +\series default +. + The parent is the +\begin_inset Formula $\lambda=0$ +\end_inset + + analog whose +\series emph +current atom order +\series default + you want every other analog to share. + cpptraj does not invent that order; you freeze it, then map. +\end_layout + +\begin_layout LyX-Code +# 1. Choose the parent analog (unmodified residue, ligand core, ...). +\end_layout + +\begin_layout LyX-Code +# 2. Load it. Nucleic acids: optionally freeze the sugar-phosphate walk. +\end_layout + +\begin_layout LyX-Code +# Ligands / amino acids: the file order *is* the TI order -- skip naorder. +\end_layout + +\begin_layout LyX-Code +# 3. Map each analog onto that parent. Inspect mapout for insertions. +\end_layout + +\begin_layout LyX-Code +# 4. Build both TI end-state libraries from the aligned units. +\end_layout + +\begin_layout Standard +Nucleic acids (example: FLE = unmodified rA onto ERN = unmodified dA). + Shared atoms keep the dA indices; the 2'-OH is an insertion next to C2'; dA H2'' is unmatched on the template. +\end_layout + +\begin_layout LyX-Code +readdata ERN.lib name ERN +\end_layout + +\begin_layout LyX-Code +templatematch ERN[ERN] naorder name ERN.ti +\end_layout + +\begin_layout LyX-Code +readdata FLE.lib name FLE +\end_layout + +\begin_layout LyX-Code +templatematch FLE[FLE] template ERN.ti mapout fle.map name FLE.ti +\end_layout + +\begin_layout Standard +Small molecules (example: phenol onto benzene). + The ring maps by unique names; OH inserts after C1; benzene H1 is unmatched. +\end_layout + +\begin_layout LyX-Code +parm benzene.mol2 name benzene +\end_layout + +\begin_layout LyX-Code +parm phenol.mol2 name phenol +\end_layout + +\begin_layout LyX-Code +templatematch phenol template benzene mapout phenol.map name phenol.ti +\end_layout + +\begin_layout Standard +Amino acids (example: selenocysteine onto cysteine). + Use Amber OFF so selenium is +\series bold +elmnt 34 +\series default +. + Mol2 atom name SE is read as sulfur. + Backbone names map; SE is an insertion at CB; cysteine SG is unmatched. +\end_layout + +\begin_layout LyX-Code +readdata cys.lib name CYS +\end_layout + +\begin_layout LyX-Code +readdata sec.lib name SEC +\end_layout + +\begin_layout LyX-Code +templatematch SEC[SEC] template CYS[CYS] mapout sec.map name SEC.ti +\end_layout + +\begin_layout Standard +Alias: +\series bold +timap +\series default +. +\end_layout + +\end_deeper + \begin_layout Subsection atommap \end_layout diff --git a/src/Command.cpp b/src/Command.cpp index e15a1edee1..8834acb6fd 100644 --- a/src/Command.cpp +++ b/src/Command.cpp @@ -74,6 +74,7 @@ #include "Exec_ParmWrite.h" #include "Exec_ScaleDihedralK.h" #include "Exec_Top.h" +#include "Exec_TemplateMatch.h" #include "Exec_UpdateParameters.h" #include "Exec_Desc.h" // ----- ACTION ---------------------------------------------------------------- @@ -314,6 +315,7 @@ void Command::Init() { Command::AddCmd( new Exec_Change(), Cmd::EXE, 1, "change" ); Command::AddCmd( new Exec_ChargeInfo(), Cmd::EXE, 1, "charge" ); Command::AddCmd( new Exec_CompareTop(), Cmd::EXE, 1, "comparetop" ); + Command::AddCmd( new Exec_TemplateMatch(), Cmd::EXE, 2, "templatematch", "timap" ); Command::AddCmd( new Exec_Desc(), Cmd::EXE, 1, "desc" ); // HIDDEN Command::AddCmd( new Exec_DihedralInfo(),Cmd::EXE, 3,"dihedrals","dihedralinfo","printdihedrals"); Command::AddCmd( new Exec_HmassRepartition(),Cmd::EXE, 1, "hmassrepartition" ); diff --git a/src/Exec_TemplateMatch.cpp b/src/Exec_TemplateMatch.cpp new file mode 100644 index 0000000000..ff12a49973 --- /dev/null +++ b/src/Exec_TemplateMatch.cpp @@ -0,0 +1,274 @@ +#include "Exec_TemplateMatch.h" +#include "TemplateMatch.h" +#include "CpptrajStdio.h" +#include "CpptrajFile.h" +#include "DataSet_Topology.h" +#include "DataSet_Coords.h" +#include "StringRoutines.h" +#include "ArgList.h" +#include +#include + +/* Source encoding: UTF-8. Unicode (O5′, 2′, λ) is comments-only; Help() text + * and string literals stay ASCII. This Exec looks up topologies, runs + * TemplateMatch, writes mapout, and optionally stores a remapped parm. + */ + +void Exec_TemplateMatch::Help() const { + mprintf("\t [template ] [mapout ] [name ]\n" + "\t[maponly] [replace] [naorder]\n" + "\t[seed {auto|names|na|none}] [anchor ]\n" + " Align atoms in topology to a user-supplied