diff --git a/.gitea/workflows/build_and_test.yml b/.gitea/workflows/build_and_test.yml index 48e6706ff..738fc2278 100644 --- a/.gitea/workflows/build_and_test.yml +++ b/.gitea/workflows/build_and_test.yml @@ -949,6 +949,27 @@ jobs: - name: Build documentation shell: bash run: bash make_doc.sh + # The Rugnux pages site is the gitea-pages branch of rugnux/gitea-pages, updated with a release. + # The HTML is pushed from a copy, so the checkout the release upload below works on is left as it was. + - name: Upload documentation to rugnux/gitea-pages + if: github.event_name == 'workflow_dispatch' && (github.event.inputs.create_release == 'true' || github.event.inputs.create_release == true) + shell: bash + env: + PAGES_TOKEN: ${{ secrets.RUGNUX_PAGES_TOKEN || secrets.PIP_REPOSITORY_API_TOKEN }} + PAGES_TOKEN_NAME: ${{ secrets.RUGNUX_PAGES_TOKEN && 'RUGNUX_PAGES_TOKEN' || 'PIP_REPOSITORY_API_TOKEN' }} + run: | + echo "Pushing with secret ${PAGES_TOKEN_NAME}" + rm -rf /tmp/rugnux-pages + mkdir /tmp/rugnux-pages + cp -a public/. /tmp/rugnux-pages/ + cd /tmp/rugnux-pages + git init -q + git checkout -q -b gitea-pages + git config user.email "filip.leonarski@psi.ch" + git config user.name "Filip Leonarski (Gitea)" + git add . + git commit -q -m "Deploy site from ${GITHUB_REF_NAME} ${GITHUB_SHA::9}" + git push -f "https://${PAGES_TOKEN}@gitea.psi.ch/rugnux/gitea-pages.git" gitea-pages - name: Upload documentation if: github.event_name == 'workflow_dispatch' && (github.event.inputs.create_release == 'true' || github.event.inputs.create_release == true) shell: bash diff --git a/.gitignore b/.gitignore index 69b687423..3ce9253bb 100644 --- a/.gitignore +++ b/.gitignore @@ -48,3 +48,5 @@ __pycache__/ # tools/battery: the local site config (paths of this machine, private manifest); site.example.json is the template tools/battery/site.json +# the restraint dictionary rugnux embeds (image_analysis/structure_refinement/monomers/update_monomers.py) +!image_analysis/structure_refinement/monomers/*.cif diff --git a/CLAUDE.md b/CLAUDE.md index 0bb1218a2..f717306ec 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -15,9 +15,10 @@ usage message is the source of truth, not the docs. ## Build Out-of-source CMake build, C++20, heavy use of `FetchContent` (spdlog, zstd, HDF5, -slsDetectorPackage, Catch2, cpp-httplib, libzmq, libtiff, FFTW, Ceres, fast-feedback-indexer, zlib-ng -and Eigen are downloaded and statically linked — the **first configure needs network access** and is -slow). **No library has to come from the host**: `zlib-devel`/`eigen3-devel` are no longer needed. +slsDetectorPackage, Catch2, cpp-httplib, libzmq, libtiff, FFTW, Ceres, zlib-ng and Eigen are +downloaded and statically linked — the **first configure needs network access** and is slow; the +fast-feedback indexer behind FFBIDX is vendored in `image_analysis/indexing/fast-feedback-indexer/`). +**No library has to come from the host**: `zlib-devel`/`eigen3-devel` are no longer needed. zlib (as zlib-ng in zlib-compat mode) is *built during the configure* into a prefix in the build tree and found there via `ZLIB_ROOT`; Eigen's headers are fetched and a generated `Eigen3Config.cmake` in the build tree is what every `find_package(Eigen3)` resolves — ours, Ceres' and ffbidx'. A copy diff --git a/CMakeLists.txt b/CMakeLists.txt index 54e09879b..aaff6cbdc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -40,8 +40,9 @@ ENDIF() # CUDA's CCCL headers (cub, thrust, libcu++) stop with an #error under MSVC's traditional # preprocessor, which miscompiles their macros. nvcc preprocesses and compiles host code with cl.exe, # so the standard-conforming preprocessor is switched on for .cu sources here, reaching every CUDA -# target, fetched ones included (VS 2019 16.5 or newer). ffbidx already sets the same for its own -# CUB-using kernel, which is why the other CUDA targets never needed it. C++ sources keep the +# target, fetched ones included (VS 2019 16.5 or newer). The vendored fast-feedback indexer +# (image_analysis/indexing/fast-feedback-indexer) sets the same on its own target for its CUB-using kernel, +# as upstream does, which is why the other CUDA targets never needed it. C++ sources keep the # default: none includes a CCCL header, and the switch would change the preprocessing of Qt, the # Windows SDK and every fetched dependency with nothing to gain. IF (MSVC) @@ -493,10 +494,10 @@ IF (CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64|arm64|ARM64") ENDIF() ADD_COMPILE_DEFINITIONS(JFJOCH_USE_FFTW) -# Eigen (header-only), consumed by the analysis libraries directly and by Ceres and ffbidx through -# their own find_package(Eigen3). The headers are fetched here and a two-file config package for +# Eigen (header-only), consumed by the analysis libraries (the vendored fast-feedback indexer among them) +# directly and by Ceres through its own find_package(Eigen3). The headers are fetched here and a two-file config package for # them is written into the build tree; Eigen3_DIR then points at it, so every find_package(Eigen3) -# in the build -- ours, Ceres', ffbidx' -- resolves through the ordinary config path and gets this +# in the build -- ours and Ceres' -- resolves through the ordinary config path and gets this # one copy. Nothing needs Eigen's own CMake, so the source is populated but never added. # # The obvious route, FetchContent_Declare(Eigen3 ... OVERRIDE_FIND_PACKAGE), IS BANNED and must not diff --git a/THIRD_PARTY_NOTICES.md b/THIRD_PARTY_NOTICES.md index 3093e081e..6b3a66af2 100644 --- a/THIRD_PARTY_NOTICES.md +++ b/THIRD_PARTY_NOTICES.md @@ -28,7 +28,6 @@ linked into the Jungfraujoch executables. | [FFTW](https://www.fftw.org/) | 3.3.10 | Matteo Frigo; MIT | GPL-2.0-or-later | [fftw.txt](licenses/fftw.txt) | | [Ceres Solver](https://github.com/ceres-solver/ceres-solver) | (pinned) | Google Inc. and contributors | BSD-3-Clause | [ceres-solver.txt](licenses/ceres-solver.txt) | | [Abseil](https://github.com/abseil/abseil-cpp) | 20250127 (required by Ceres) | Google Inc. | Apache-2.0 | [abseil.txt](licenses/abseil.txt) | -| [fast-feedback-indexer](https://github.com/paulscherrerinstitute/fast-feedback-indexer) | (pinned) | PSI | BSD-3-Clause | [fast-feedback-indexer.txt](licenses/fast-feedback-indexer.txt) | | [libjpeg-turbo](https://github.com/libjpeg-turbo/libjpeg-turbo) | 3.2.0 | D. R. Commander and others; IJG | IJG + BSD-3-Clause + Zlib | [libjpeg-turbo.txt](licenses/libjpeg-turbo.txt) | | [Mbed TLS](https://github.com/Mbed-TLS/mbedtls) (with TF-PSA-Crypto) | 4.2.0 | The Mbed TLS Contributors | Apache-2.0 OR GPL-2.0-or-later (used under Apache-2.0) | [mbedtls.txt](licenses/mbedtls.txt), [tf-psa-crypto.txt](licenses/tf-psa-crypto.txt) | | [Catch2](https://github.com/catchorg/Catch2) | 3.16.0 | Catch2 Authors | BSL-1.0 | [catch2.txt](licenses/catch2.txt) | @@ -60,7 +59,9 @@ These live in the source tree (see the path) rather than being fetched; traccc a | [Bitshuffle (h-perf)](https://github.com/kalcutter/bitshuffle) | `compression/bitshuffle_hperf/` | Kal Conley | Apache-2.0 | [bitshuffle-hperf.txt](licenses/bitshuffle-hperf.txt) | | [LZ4](https://github.com/lz4/lz4) | `compression/lz4/` | Yann Collet | BSD-2-Clause | [lz4.txt](licenses/lz4.txt) | | [HLS arbitrary-precision types](https://github.com/Xilinx/HLS_arbitrary_Precision_Types) | `fpga/include/` | Xilinx, Inc. | Apache-2.0 | [xilinx-hls-headers.txt](licenses/xilinx-hls-headers.txt) | +| [fast-feedback-indexer](https://github.com/paulscherrerinstitute/fast-feedback-indexer) (commit a94fd4f) | `image_analysis/indexing/fast-feedback-indexer/` | PSI | BSD-3-Clause | [fast-feedback-indexer.txt](licenses/fast-feedback-indexer.txt) | | [GEMMI](https://github.com/project-gemmi/gemmi) | `gemmi_gph/` | Global Phasing Ltd. | MPL-2.0 | [gemmi.txt](licenses/gemmi.txt) | +| [CCP4 Monomer Library](https://github.com/MonomerLibrary/monomers) (subset: restraint dictionary data) | `image_analysis/structure_refinement/monomers/` | CCP4 / the Monomer Library authors (Vagin et al.) | LGPL-3.0-only | [ccp4-monomer-library.txt](licenses/ccp4-monomer-library.txt) | | [PEGTL](https://github.com/taocpp/PEGTL) | `gemmi_gph/gemmi/third_party/tao/` | Dr. Colin Hirsch and Daniel Frey | MIT | [pegtl.txt](licenses/pegtl.txt) | | [sajson](https://github.com/chadaustin/sajson) | `gemmi_gph/gemmi/third_party/sajson.h` | Chad Austin | MIT | [sajson.txt](licenses/sajson.txt) | | [fast_float](https://github.com/fastfloat/fast_float) | `gemmi_gph/gemmi/third_party/fast_float.h` | The fast_float authors (Daniel Lemire et al.) | Apache-2.0 OR MIT OR BSL-1.0 | [fast-float.txt](licenses/fast-float.txt) | @@ -125,12 +126,19 @@ served frontend, so the shipped web UI carries its own attribution. its trust-region Levenberg-Marquardt minimiser, projected line search, polynomial step choice and sphere manifold for the crystal refinement, following its source. Both files name the origin at the top and are covered by `licenses/ceres-solver.txt`. -* **fast-feedback-indexer** is also fetched and linked in CUDA builds (table above); separately, +* **fast-feedback-indexer** is also vendored and linked in CUDA builds (table above); separately, `FFBIDXIndexerCPU.cpp` ports its CUDA kernels to the CPU. The file names the origin at the top and is covered by `licenses/fast-feedback-indexer.txt`. * **FFTW** is GPL-2.0-or-later — compatible with, and absorbed by, this project's GPL-3.0 license. * **Apache-2.0** components: where upstream ships a `NOTICE` file, it is reproduced in the corresponding `licenses/` text. +* **CCP4 Monomer Library (LGPL-3.0)** is data, not code: the restraint dictionaries of the compounds + rugnux's refinement restrains, copied unmodified per compound into + `image_analysis/structure_refinement/monomers/` (`links_and_mods.cif` and `ener_lib.cif` cut down to + the entries those compounds use, and the library's metal-site distances of `metals.json` for its ions as + `metals.cif`), with the library's own `COPYING`. The build embeds them in the binary + as text, and `monomers/update_monomers.py` regenerates the subset from the upstream library, so the + copy can be replaced by a user with a version of their own. * **Qt (LGPL-3.0)** and **NVIDIA CUDA (EULA)** carry redistribution conditions beyond a copyright notice; see their dedicated notice files. The verbatim LGPL-3.0 and CUDA EULA texts are bundled (`licenses/Qt6-LGPL-3.0.txt`, `licenses/NVIDIA-CUDA-EULA.txt`); the CUDA EULA is the one shipped diff --git a/VERSION b/VERSION index bfa826350..59f83b8bb 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.0.0-rc.179 +1.0.0-rc.180 diff --git a/broker/JFJochBrokerHttp.cpp b/broker/JFJochBrokerHttp.cpp index a6e7255a6..b417085ab 100644 --- a/broker/JFJochBrokerHttp.cpp +++ b/broker/JFJochBrokerHttp.cpp @@ -262,10 +262,16 @@ void JFJochBrokerHttp::register_routes(httplib::Server &server) { server.Put("/config/rugnux/model", bind_req(&JFJochBrokerHttp::config_rugnux_model_put)); server.Delete("/config/rugnux/model", bind_noarg(&JFJochBrokerHttp::config_rugnux_model_delete)); server.Get("/rugnux/status", bind_noarg(&JFJochBrokerHttp::rugnux_status_get)); - server.Get("/rugnux/model.cif", bind_noarg(&JFJochBrokerHttp::rugnux_model_cif_get)); + server.Get("/rugnux/model.cif", [this](const httplib::Request &req, httplib::Response &res) { + try { + rugnux_model_cif_get(parse_query_string(req, "stage"), res); + } catch (const std::exception &e) { + send_error(res, handleOperationException(e)); + } + }); server.Get("/rugnux/map.ccp4", [this](const httplib::Request &req, httplib::Response &res) { try { - rugnux_map_ccp4_get(parse_query_string(req, "type"), res); + rugnux_map_ccp4_get(parse_query_string(req, "type"), parse_query_string(req, "stage"), res); } catch (const std::exception &e) { send_error(res, handleOperationException(e)); } @@ -1036,8 +1042,26 @@ void JFJochBrokerHttp::rugnux_status_get(httplib::Response &response) { ProcessOutput(Convert(state_machine.GetRugnuxStatus()), response); } -void JFJochBrokerHttp::rugnux_model_cif_get(httplib::Response &response) { - const auto structure = state_machine.GetRugnuxStatus().structure; +// The structure a viewer route serves: `stage` placed or refined; by default the refined one where there is one. +// Null where there is none, or for an unknown stage (with the 400 already set). +static std::shared_ptr RugnuxStage(const RugnuxLiveSnapshot &s, + const std::optional &stage, + httplib::Response &response) { + if (!stage) + return s.refined_structure ? s.refined_structure : s.structure; + if (stage == "placed") + return s.structure; + if (stage == "refined") + return s.refined_structure; + response.status = 400; + response.set_content("Unknown stage " + stage.value(), "text/plain"); + return nullptr; +} + +void JFJochBrokerHttp::rugnux_model_cif_get(const std::optional &stage, httplib::Response &response) { + const auto structure = RugnuxStage(state_machine.GetRugnuxStatus(), stage, response); + if (response.status == 400) + return; if (!structure) { response.status = 404; return; @@ -1045,16 +1069,23 @@ void JFJochBrokerHttp::rugnux_model_cif_get(httplib::Response &response) { response.set_content(structure->ModelCif(), "chemical/x-mmcif"); } -void JFJochBrokerHttp::rugnux_map_ccp4_get(const std::optional &type, httplib::Response &response) { +void JFJochBrokerHttp::rugnux_map_ccp4_get(const std::optional &type, + const std::optional &stage, httplib::Response &response) { const std::string t = type.value_or("2fofc"); if (t != "2fofc" && t != "fofc" && t != "anom") { response.status = 400; response.set_content("Unknown map type " + t, "text/plain"); return; } - const auto structure = state_machine.GetRugnuxStatus().structure; + const RugnuxLiveSnapshot status = state_machine.GetRugnuxStatus(); + auto structure = RugnuxStage(status, stage, response); + if (response.status == 400) + return; const RugnuxMapType map_type = t == "2fofc" ? RugnuxMapType::TwoFoFc : t == "fofc" ? RugnuxMapType::FoFc : RugnuxMapType::Anomalous; + // The refined model's coefficients carry no anomalous map: it stays on the placed model's phases. + if (map_type == RugnuxMapType::Anomalous && structure) + structure = status.structure; const std::string map = structure ? structure->Map(map_type) : std::string(); if (map.empty()) { response.status = 404; diff --git a/broker/JFJochBrokerHttp.h b/broker/JFJochBrokerHttp.h index a5ff26c41..f5085c6cf 100644 --- a/broker/JFJochBrokerHttp.h +++ b/broker/JFJochBrokerHttp.h @@ -206,8 +206,9 @@ class JFJochBrokerHttp { void config_rugnux_model_put(const httplib::Request &request, httplib::Response &response); void config_rugnux_model_delete(httplib::Response &response); void rugnux_status_get(httplib::Response &response); - void rugnux_model_cif_get(httplib::Response &response); - void rugnux_map_ccp4_get(const std::optional &type, httplib::Response &response); + void rugnux_model_cif_get(const std::optional &stage, httplib::Response &response); + void rugnux_map_ccp4_get(const std::optional &type, const std::optional &stage, + httplib::Response &response); void config_bragg_integration_get(httplib::Response &response); void config_bragg_integration_put(const org::openapitools::server::model::Bragg_integration_settings &braggIntegrationSettings, httplib::Response &response); diff --git a/broker/OpenAPIConvert.cpp b/broker/OpenAPIConvert.cpp index 53168776a..c67f159a5 100644 --- a/broker/OpenAPIConvert.cpp +++ b/broker/OpenAPIConvert.cpp @@ -1278,7 +1278,70 @@ org::openapitools::server::model::Rugnux_live_status Convert(const RugnuxLiveSna ret.setSummary(summary); ret.setWarnings(input.warnings); ret.setPlacedModel(input.structure != nullptr); + ret.setRefinedModel(input.refined_structure != nullptr); ret.setAnomalousMap(input.structure != nullptr && input.structure->HasAnomalousMap()); + ret.setAnomalousSignal(input.anomalous_signal); + if (!input.space_group.empty()) + ret.setSpaceGroup(input.space_group); + if (input.d_min) + ret.setDMin(input.d_min.value()); + if (input.isa) + ret.setIsa(input.isa.value()); + if (input.model) { + const RugnuxLiveModel &m = input.model.value(); + org::openapitools::server::model::Rugnux_live_model model; + model.setPlacement(m.placement); + model.setModelName(m.model_name); + model.setPredicted(m.predicted); + model.setReason(m.reason); + if (m.r_work) model.setRWork(m.r_work.value()); + if (m.r_free) model.setRFree(m.r_free.value()); + if (m.cc_model) model.setCcModel(m.cc_model.value()); + if (m.fit_sigma) model.setFitSigma(m.fit_sigma.value()); + if (m.map_atom_sigma) model.setMapAtomSigma(m.map_atom_sigma.value()); + if (m.rigid_body_angle_deg) model.setRigidBodyAngleDeg(m.rigid_body_angle_deg.value()); + if (m.rigid_body_shift_A) model.setRigidBodyShiftA(m.rigid_body_shift_A.value()); + model.setMrDecision(m.mr_decision); + model.setMrSpaceGroup(m.mr_space_group); + if (m.copies) model.setCopies(m.copies.value()); + if (m.tf_z) model.setTfZ(m.tf_z.value()); + if (m.rf_z) model.setRfZ(m.rf_z.value()); + if (m.llg_z) model.setLlgZ(m.llg_z.value()); + if (m.mr_d_min) model.setMrDMin(m.mr_d_min.value()); + model.setAnomalousSite(m.anomalous_site); + if (m.anomalous_site_sigma) model.setAnomalousSiteSigma(m.anomalous_site_sigma.value()); + if (m.refinement) { + const RugnuxLiveRefinement &r = m.refinement.value(); + org::openapitools::server::model::Rugnux_live_refinement refinement; + refinement.setPerformed(r.performed); + refinement.setCancelled(r.cancelled); + refinement.setReason(r.reason); + refinement.setOnGpu(r.on_gpu); + refinement.setSeconds(r.seconds); + if (r.r_work) refinement.setRWork(r.r_work.value()); + if (r.r_free) refinement.setRFree(r.r_free.value()); + if (r.rmsd_bonds_A) refinement.setRmsdBondsA(r.rmsd_bonds_A.value()); + if (r.rmsd_angles_deg) refinement.setRmsdAnglesDeg(r.rmsd_angles_deg.value()); + refinement.setBlobCount(r.blob_count); + std::vector blobs; + for (const auto &b: r.blobs) { + org::openapitools::server::model::Rugnux_live_blob blob; + blob.setKind(b.kind); + blob.setX(b.x); + blob.setY(b.y); + blob.setZ(b.z); + blob.setPeakSigma(b.peak_sigma); + blob.setVolumeA3(b.volume_A3); + blob.setNearestAtom(b.nearest_atom); + if (b.nearest_atom_distance_A) + blob.setNearestAtomDistanceA(*b.nearest_atom_distance_A); + blobs.push_back(blob); + } + refinement.setBlobs(blobs); + model.setRefinement(refinement); + } + ret.setModel(model); + } return ret; } diff --git a/broker/gen/model/Azim_int_settings.cpp b/broker/gen/model/Azim_int_settings.cpp index 5eb181267..833512e64 100644 --- a/broker/gen/model/Azim_int_settings.cpp +++ b/broker/gen/model/Azim_int_settings.cpp @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Azim_int_settings.h b/broker/gen/model/Azim_int_settings.h index 632c8449f..5cfdbff2c 100644 --- a/broker/gen/model/Azim_int_settings.h +++ b/broker/gen/model/Azim_int_settings.h @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Bragg_integration_settings.cpp b/broker/gen/model/Bragg_integration_settings.cpp index ec0aa6078..6f0820d8c 100644 --- a/broker/gen/model/Bragg_integration_settings.cpp +++ b/broker/gen/model/Bragg_integration_settings.cpp @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Bragg_integration_settings.h b/broker/gen/model/Bragg_integration_settings.h index d0513f887..9b132c285 100644 --- a/broker/gen/model/Bragg_integration_settings.h +++ b/broker/gen/model/Bragg_integration_settings.h @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Broker_status.cpp b/broker/gen/model/Broker_status.cpp index 80436ccb5..a593da3ba 100644 --- a/broker/gen/model/Broker_status.cpp +++ b/broker/gen/model/Broker_status.cpp @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Broker_status.h b/broker/gen/model/Broker_status.h index d9c2b18f3..a5bc2ac71 100644 --- a/broker/gen/model/Broker_status.h +++ b/broker/gen/model/Broker_status.h @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Calibration_statistics_inner.cpp b/broker/gen/model/Calibration_statistics_inner.cpp index 985c2b623..7c3f96f85 100644 --- a/broker/gen/model/Calibration_statistics_inner.cpp +++ b/broker/gen/model/Calibration_statistics_inner.cpp @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Calibration_statistics_inner.h b/broker/gen/model/Calibration_statistics_inner.h index 80c17cc83..b84285fb2 100644 --- a/broker/gen/model/Calibration_statistics_inner.h +++ b/broker/gen/model/Calibration_statistics_inner.h @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Dark_mask_settings.cpp b/broker/gen/model/Dark_mask_settings.cpp index 3dac6d0e2..a5d35150d 100644 --- a/broker/gen/model/Dark_mask_settings.cpp +++ b/broker/gen/model/Dark_mask_settings.cpp @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Dark_mask_settings.h b/broker/gen/model/Dark_mask_settings.h index 84141189d..f7cc35de7 100644 --- a/broker/gen/model/Dark_mask_settings.h +++ b/broker/gen/model/Dark_mask_settings.h @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Dataset_settings.cpp b/broker/gen/model/Dataset_settings.cpp index e174f99c4..5da814adc 100644 --- a/broker/gen/model/Dataset_settings.cpp +++ b/broker/gen/model/Dataset_settings.cpp @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Dataset_settings.h b/broker/gen/model/Dataset_settings.h index 0afa4dc0c..723ea0b63 100644 --- a/broker/gen/model/Dataset_settings.h +++ b/broker/gen/model/Dataset_settings.h @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Dataset_settings_smargon.cpp b/broker/gen/model/Dataset_settings_smargon.cpp index 770d2487e..0c06c01ea 100644 --- a/broker/gen/model/Dataset_settings_smargon.cpp +++ b/broker/gen/model/Dataset_settings_smargon.cpp @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Dataset_settings_smargon.h b/broker/gen/model/Dataset_settings_smargon.h index e511a1caf..1da2e7c57 100644 --- a/broker/gen/model/Dataset_settings_smargon.h +++ b/broker/gen/model/Dataset_settings_smargon.h @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Dataset_settings_xray_fluorescence_spectrum.cpp b/broker/gen/model/Dataset_settings_xray_fluorescence_spectrum.cpp index 429df57f4..1a0a6671c 100644 --- a/broker/gen/model/Dataset_settings_xray_fluorescence_spectrum.cpp +++ b/broker/gen/model/Dataset_settings_xray_fluorescence_spectrum.cpp @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Dataset_settings_xray_fluorescence_spectrum.h b/broker/gen/model/Dataset_settings_xray_fluorescence_spectrum.h index 2c1417eb7..3f8df35f6 100644 --- a/broker/gen/model/Dataset_settings_xray_fluorescence_spectrum.h +++ b/broker/gen/model/Dataset_settings_xray_fluorescence_spectrum.h @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Detector.cpp b/broker/gen/model/Detector.cpp index 5eb85f5a5..4ca016935 100644 --- a/broker/gen/model/Detector.cpp +++ b/broker/gen/model/Detector.cpp @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Detector.h b/broker/gen/model/Detector.h index 728d690b4..23352e313 100644 --- a/broker/gen/model/Detector.h +++ b/broker/gen/model/Detector.h @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Detector_list.cpp b/broker/gen/model/Detector_list.cpp index 5237182e8..c2332e842 100644 --- a/broker/gen/model/Detector_list.cpp +++ b/broker/gen/model/Detector_list.cpp @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Detector_list.h b/broker/gen/model/Detector_list.h index 695bff2b8..32255b629 100644 --- a/broker/gen/model/Detector_list.h +++ b/broker/gen/model/Detector_list.h @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Detector_list_element.cpp b/broker/gen/model/Detector_list_element.cpp index 8c592213b..873771c2d 100644 --- a/broker/gen/model/Detector_list_element.cpp +++ b/broker/gen/model/Detector_list_element.cpp @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Detector_list_element.h b/broker/gen/model/Detector_list_element.h index 036fb8067..a2259f6fa 100644 --- a/broker/gen/model/Detector_list_element.h +++ b/broker/gen/model/Detector_list_element.h @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Detector_module.cpp b/broker/gen/model/Detector_module.cpp index c89209164..369fccac4 100644 --- a/broker/gen/model/Detector_module.cpp +++ b/broker/gen/model/Detector_module.cpp @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Detector_module.h b/broker/gen/model/Detector_module.h index 75ceca17f..1f24c1c11 100644 --- a/broker/gen/model/Detector_module.h +++ b/broker/gen/model/Detector_module.h @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Detector_module_direction.cpp b/broker/gen/model/Detector_module_direction.cpp index c8a982e96..55b0a505e 100644 --- a/broker/gen/model/Detector_module_direction.cpp +++ b/broker/gen/model/Detector_module_direction.cpp @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Detector_module_direction.h b/broker/gen/model/Detector_module_direction.h index ca0d0bbb1..8bf48a5d2 100644 --- a/broker/gen/model/Detector_module_direction.h +++ b/broker/gen/model/Detector_module_direction.h @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Detector_power_state.cpp b/broker/gen/model/Detector_power_state.cpp index fd07aa072..7c8bd783b 100644 --- a/broker/gen/model/Detector_power_state.cpp +++ b/broker/gen/model/Detector_power_state.cpp @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Detector_power_state.h b/broker/gen/model/Detector_power_state.h index 389f2d87e..4d5fce3d3 100644 --- a/broker/gen/model/Detector_power_state.h +++ b/broker/gen/model/Detector_power_state.h @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Detector_selection.cpp b/broker/gen/model/Detector_selection.cpp index 62efbcfaf..74e0d2c0e 100644 --- a/broker/gen/model/Detector_selection.cpp +++ b/broker/gen/model/Detector_selection.cpp @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Detector_selection.h b/broker/gen/model/Detector_selection.h index 36e6bd025..0a5dd6490 100644 --- a/broker/gen/model/Detector_selection.h +++ b/broker/gen/model/Detector_selection.h @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Detector_settings.cpp b/broker/gen/model/Detector_settings.cpp index a8703479e..2aa4a7c48 100644 --- a/broker/gen/model/Detector_settings.cpp +++ b/broker/gen/model/Detector_settings.cpp @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Detector_settings.h b/broker/gen/model/Detector_settings.h index cd3ccee68..ff8618dfa 100644 --- a/broker/gen/model/Detector_settings.h +++ b/broker/gen/model/Detector_settings.h @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Detector_state.cpp b/broker/gen/model/Detector_state.cpp index 35011d667..763d6c19e 100644 --- a/broker/gen/model/Detector_state.cpp +++ b/broker/gen/model/Detector_state.cpp @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Detector_state.h b/broker/gen/model/Detector_state.h index 31aeb57aa..11dc3d41f 100644 --- a/broker/gen/model/Detector_state.h +++ b/broker/gen/model/Detector_state.h @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Detector_status.cpp b/broker/gen/model/Detector_status.cpp index b6743070d..04f2f12a2 100644 --- a/broker/gen/model/Detector_status.cpp +++ b/broker/gen/model/Detector_status.cpp @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Detector_status.h b/broker/gen/model/Detector_status.h index c058d0766..1de1b46d9 100644 --- a/broker/gen/model/Detector_status.h +++ b/broker/gen/model/Detector_status.h @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Detector_timing.cpp b/broker/gen/model/Detector_timing.cpp index 3962b9671..db8a7d1d1 100644 --- a/broker/gen/model/Detector_timing.cpp +++ b/broker/gen/model/Detector_timing.cpp @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Detector_timing.h b/broker/gen/model/Detector_timing.h index a3fa4c3d8..81b54bd6f 100644 --- a/broker/gen/model/Detector_timing.h +++ b/broker/gen/model/Detector_timing.h @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Detector_type.cpp b/broker/gen/model/Detector_type.cpp index cccab64dc..3630540e2 100644 --- a/broker/gen/model/Detector_type.cpp +++ b/broker/gen/model/Detector_type.cpp @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Detector_type.h b/broker/gen/model/Detector_type.h index 6387098a7..39b3b049d 100644 --- a/broker/gen/model/Detector_type.h +++ b/broker/gen/model/Detector_type.h @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Error_message.cpp b/broker/gen/model/Error_message.cpp index a88e821c8..491a0b018 100644 --- a/broker/gen/model/Error_message.cpp +++ b/broker/gen/model/Error_message.cpp @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Error_message.h b/broker/gen/model/Error_message.h index bf408c53d..d0a72c33f 100644 --- a/broker/gen/model/Error_message.h +++ b/broker/gen/model/Error_message.h @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/File_writer_format.cpp b/broker/gen/model/File_writer_format.cpp index 573810eaa..bd9b04866 100644 --- a/broker/gen/model/File_writer_format.cpp +++ b/broker/gen/model/File_writer_format.cpp @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/File_writer_format.h b/broker/gen/model/File_writer_format.h index 554a025ef..5259ca938 100644 --- a/broker/gen/model/File_writer_format.h +++ b/broker/gen/model/File_writer_format.h @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/File_writer_settings.cpp b/broker/gen/model/File_writer_settings.cpp index 0032c7724..c71993006 100644 --- a/broker/gen/model/File_writer_settings.cpp +++ b/broker/gen/model/File_writer_settings.cpp @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/File_writer_settings.h b/broker/gen/model/File_writer_settings.h index d14cff05a..63e72ad39 100644 --- a/broker/gen/model/File_writer_settings.h +++ b/broker/gen/model/File_writer_settings.h @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Fpga_status_inner.cpp b/broker/gen/model/Fpga_status_inner.cpp index 3c6286c01..c07654f3c 100644 --- a/broker/gen/model/Fpga_status_inner.cpp +++ b/broker/gen/model/Fpga_status_inner.cpp @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Fpga_status_inner.h b/broker/gen/model/Fpga_status_inner.h index 61bbbbb40..b143f2215 100644 --- a/broker/gen/model/Fpga_status_inner.h +++ b/broker/gen/model/Fpga_status_inner.h @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Geom_refinement_algorithm.cpp b/broker/gen/model/Geom_refinement_algorithm.cpp index 3332c5e65..6dd36ca50 100644 --- a/broker/gen/model/Geom_refinement_algorithm.cpp +++ b/broker/gen/model/Geom_refinement_algorithm.cpp @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Geom_refinement_algorithm.h b/broker/gen/model/Geom_refinement_algorithm.h index 6cb37b28b..5e2c31473 100644 --- a/broker/gen/model/Geom_refinement_algorithm.h +++ b/broker/gen/model/Geom_refinement_algorithm.h @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Grid_scan.cpp b/broker/gen/model/Grid_scan.cpp index 1fd8e01bf..30f82608d 100644 --- a/broker/gen/model/Grid_scan.cpp +++ b/broker/gen/model/Grid_scan.cpp @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Grid_scan.h b/broker/gen/model/Grid_scan.h index cee76dea7..44aba0284 100644 --- a/broker/gen/model/Grid_scan.h +++ b/broker/gen/model/Grid_scan.h @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Helpers.cpp b/broker/gen/model/Helpers.cpp index 7ddfe3cde..1e173d751 100644 --- a/broker/gen/model/Helpers.cpp +++ b/broker/gen/model/Helpers.cpp @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Helpers.h b/broker/gen/model/Helpers.h index d0c3e01b9..d168f38df 100644 --- a/broker/gen/model/Helpers.h +++ b/broker/gen/model/Helpers.h @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Image_buffer_status.cpp b/broker/gen/model/Image_buffer_status.cpp index 3470aa238..2ea9ab1fe 100644 --- a/broker/gen/model/Image_buffer_status.cpp +++ b/broker/gen/model/Image_buffer_status.cpp @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Image_buffer_status.h b/broker/gen/model/Image_buffer_status.h index 975a44332..e505e17e4 100644 --- a/broker/gen/model/Image_buffer_status.h +++ b/broker/gen/model/Image_buffer_status.h @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Image_format_settings.cpp b/broker/gen/model/Image_format_settings.cpp index c0e8418f4..103a31df2 100644 --- a/broker/gen/model/Image_format_settings.cpp +++ b/broker/gen/model/Image_format_settings.cpp @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Image_format_settings.h b/broker/gen/model/Image_format_settings.h index a177753f6..52ba959c8 100644 --- a/broker/gen/model/Image_format_settings.h +++ b/broker/gen/model/Image_format_settings.h @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Image_pusher_status.cpp b/broker/gen/model/Image_pusher_status.cpp index 4371e6ac8..5c1f947c2 100644 --- a/broker/gen/model/Image_pusher_status.cpp +++ b/broker/gen/model/Image_pusher_status.cpp @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Image_pusher_status.h b/broker/gen/model/Image_pusher_status.h index 4b16c62cf..fb9df6a6d 100644 --- a/broker/gen/model/Image_pusher_status.h +++ b/broker/gen/model/Image_pusher_status.h @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Image_pusher_type.cpp b/broker/gen/model/Image_pusher_type.cpp index e425dc6c3..f444201b1 100644 --- a/broker/gen/model/Image_pusher_type.cpp +++ b/broker/gen/model/Image_pusher_type.cpp @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Image_pusher_type.h b/broker/gen/model/Image_pusher_type.h index 1fa5d7130..a2c79900a 100644 --- a/broker/gen/model/Image_pusher_type.h +++ b/broker/gen/model/Image_pusher_type.h @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Indexing_algorithm.cpp b/broker/gen/model/Indexing_algorithm.cpp index 1230d8a4b..486aaf2f6 100644 --- a/broker/gen/model/Indexing_algorithm.cpp +++ b/broker/gen/model/Indexing_algorithm.cpp @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Indexing_algorithm.h b/broker/gen/model/Indexing_algorithm.h index bae3bbf8d..6d8ea4b93 100644 --- a/broker/gen/model/Indexing_algorithm.h +++ b/broker/gen/model/Indexing_algorithm.h @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Indexing_settings.cpp b/broker/gen/model/Indexing_settings.cpp index dbee64636..38d02d692 100644 --- a/broker/gen/model/Indexing_settings.cpp +++ b/broker/gen/model/Indexing_settings.cpp @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Indexing_settings.h b/broker/gen/model/Indexing_settings.h index 61e0cba3e..e610d0830 100644 --- a/broker/gen/model/Indexing_settings.h +++ b/broker/gen/model/Indexing_settings.h @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Instrument_metadata.cpp b/broker/gen/model/Instrument_metadata.cpp index 5211c4cf2..243fb960f 100644 --- a/broker/gen/model/Instrument_metadata.cpp +++ b/broker/gen/model/Instrument_metadata.cpp @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Instrument_metadata.h b/broker/gen/model/Instrument_metadata.h index 89748a30a..1f9f43f67 100644 --- a/broker/gen/model/Instrument_metadata.h +++ b/broker/gen/model/Instrument_metadata.h @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Integration_model.cpp b/broker/gen/model/Integration_model.cpp index d8c3ffd3c..f427b9119 100644 --- a/broker/gen/model/Integration_model.cpp +++ b/broker/gen/model/Integration_model.cpp @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Integration_model.h b/broker/gen/model/Integration_model.h index 4445967f5..946e1d5ce 100644 --- a/broker/gen/model/Integration_model.h +++ b/broker/gen/model/Integration_model.h @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Jfjoch_settings.cpp b/broker/gen/model/Jfjoch_settings.cpp index a9075174e..cc348b97f 100644 --- a/broker/gen/model/Jfjoch_settings.cpp +++ b/broker/gen/model/Jfjoch_settings.cpp @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Jfjoch_settings.h b/broker/gen/model/Jfjoch_settings.h index f41050629..7e100951d 100644 --- a/broker/gen/model/Jfjoch_settings.h +++ b/broker/gen/model/Jfjoch_settings.h @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Jfjoch_statistics.cpp b/broker/gen/model/Jfjoch_statistics.cpp index 411fa0655..a112d02a7 100644 --- a/broker/gen/model/Jfjoch_statistics.cpp +++ b/broker/gen/model/Jfjoch_statistics.cpp @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Jfjoch_statistics.h b/broker/gen/model/Jfjoch_statistics.h index dcd06d807..494a90a06 100644 --- a/broker/gen/model/Jfjoch_statistics.h +++ b/broker/gen/model/Jfjoch_statistics.h @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Measurement_statistics.cpp b/broker/gen/model/Measurement_statistics.cpp index 40c6aa250..50360ea57 100644 --- a/broker/gen/model/Measurement_statistics.cpp +++ b/broker/gen/model/Measurement_statistics.cpp @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Measurement_statistics.h b/broker/gen/model/Measurement_statistics.h index b94d10cfd..2b5d850e6 100644 --- a/broker/gen/model/Measurement_statistics.h +++ b/broker/gen/model/Measurement_statistics.h @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Pcie_devices_inner.cpp b/broker/gen/model/Pcie_devices_inner.cpp index 45f112b23..8b5fd7696 100644 --- a/broker/gen/model/Pcie_devices_inner.cpp +++ b/broker/gen/model/Pcie_devices_inner.cpp @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Pcie_devices_inner.h b/broker/gen/model/Pcie_devices_inner.h index ccb6ea27c..7d727e0f4 100644 --- a/broker/gen/model/Pcie_devices_inner.h +++ b/broker/gen/model/Pcie_devices_inner.h @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Pixel_mask_statistics.cpp b/broker/gen/model/Pixel_mask_statistics.cpp index 4282a8564..49be9f5fc 100644 --- a/broker/gen/model/Pixel_mask_statistics.cpp +++ b/broker/gen/model/Pixel_mask_statistics.cpp @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Pixel_mask_statistics.h b/broker/gen/model/Pixel_mask_statistics.h index 3e4c0e063..02b40444c 100644 --- a/broker/gen/model/Pixel_mask_statistics.h +++ b/broker/gen/model/Pixel_mask_statistics.h @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Plot.cpp b/broker/gen/model/Plot.cpp index bdd1940c3..285961f49 100644 --- a/broker/gen/model/Plot.cpp +++ b/broker/gen/model/Plot.cpp @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Plot.h b/broker/gen/model/Plot.h index 74910c46f..66e3348c0 100644 --- a/broker/gen/model/Plot.h +++ b/broker/gen/model/Plot.h @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Plot_unit_x.cpp b/broker/gen/model/Plot_unit_x.cpp index bae5f1316..26b3ca835 100644 --- a/broker/gen/model/Plot_unit_x.cpp +++ b/broker/gen/model/Plot_unit_x.cpp @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Plot_unit_x.h b/broker/gen/model/Plot_unit_x.h index 115ec5e4a..dc16fa29f 100644 --- a/broker/gen/model/Plot_unit_x.h +++ b/broker/gen/model/Plot_unit_x.h @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Plots.cpp b/broker/gen/model/Plots.cpp index e51893833..58281b393 100644 --- a/broker/gen/model/Plots.cpp +++ b/broker/gen/model/Plots.cpp @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Plots.h b/broker/gen/model/Plots.h index 34147efb3..a58144f0c 100644 --- a/broker/gen/model/Plots.h +++ b/broker/gen/model/Plots.h @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Powder_calibration_fit_sigma.cpp b/broker/gen/model/Powder_calibration_fit_sigma.cpp index c1b72c27a..8c91ea91d 100644 --- a/broker/gen/model/Powder_calibration_fit_sigma.cpp +++ b/broker/gen/model/Powder_calibration_fit_sigma.cpp @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Powder_calibration_fit_sigma.h b/broker/gen/model/Powder_calibration_fit_sigma.h index fa7551dd3..38d42eaae 100644 --- a/broker/gen/model/Powder_calibration_fit_sigma.h +++ b/broker/gen/model/Powder_calibration_fit_sigma.h @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Powder_calibration_output.cpp b/broker/gen/model/Powder_calibration_output.cpp index 4180f05b2..ded107086 100644 --- a/broker/gen/model/Powder_calibration_output.cpp +++ b/broker/gen/model/Powder_calibration_output.cpp @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Powder_calibration_output.h b/broker/gen/model/Powder_calibration_output.h index 0ad009726..af0231874 100644 --- a/broker/gen/model/Powder_calibration_output.h +++ b/broker/gen/model/Powder_calibration_output.h @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Powder_calibration_quality.cpp b/broker/gen/model/Powder_calibration_quality.cpp index c0460f452..423b8e8ec 100644 --- a/broker/gen/model/Powder_calibration_quality.cpp +++ b/broker/gen/model/Powder_calibration_quality.cpp @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Powder_calibration_quality.h b/broker/gen/model/Powder_calibration_quality.h index 73dd89c28..a47f0e76f 100644 --- a/broker/gen/model/Powder_calibration_quality.h +++ b/broker/gen/model/Powder_calibration_quality.h @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Powder_calibration_spot_check.cpp b/broker/gen/model/Powder_calibration_spot_check.cpp index 25a144799..877de4041 100644 --- a/broker/gen/model/Powder_calibration_spot_check.cpp +++ b/broker/gen/model/Powder_calibration_spot_check.cpp @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Powder_calibration_spot_check.h b/broker/gen/model/Powder_calibration_spot_check.h index f05677c37..1ef1b75ba 100644 --- a/broker/gen/model/Powder_calibration_spot_check.h +++ b/broker/gen/model/Powder_calibration_spot_check.h @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Roi_azim_list.cpp b/broker/gen/model/Roi_azim_list.cpp index f2e91b20f..b13ffb7c5 100644 --- a/broker/gen/model/Roi_azim_list.cpp +++ b/broker/gen/model/Roi_azim_list.cpp @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Roi_azim_list.h b/broker/gen/model/Roi_azim_list.h index ba6d57169..8b7f915aa 100644 --- a/broker/gen/model/Roi_azim_list.h +++ b/broker/gen/model/Roi_azim_list.h @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Roi_azimuthal.cpp b/broker/gen/model/Roi_azimuthal.cpp index 29bf6b680..c8f319f3b 100644 --- a/broker/gen/model/Roi_azimuthal.cpp +++ b/broker/gen/model/Roi_azimuthal.cpp @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Roi_azimuthal.h b/broker/gen/model/Roi_azimuthal.h index 1fb9d96b3..b15885155 100644 --- a/broker/gen/model/Roi_azimuthal.h +++ b/broker/gen/model/Roi_azimuthal.h @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Roi_box.cpp b/broker/gen/model/Roi_box.cpp index 4d8c3d79b..ed20bbee3 100644 --- a/broker/gen/model/Roi_box.cpp +++ b/broker/gen/model/Roi_box.cpp @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Roi_box.h b/broker/gen/model/Roi_box.h index ba8617d43..aa92fb4f3 100644 --- a/broker/gen/model/Roi_box.h +++ b/broker/gen/model/Roi_box.h @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Roi_box_list.cpp b/broker/gen/model/Roi_box_list.cpp index 8b790af50..46401cc12 100644 --- a/broker/gen/model/Roi_box_list.cpp +++ b/broker/gen/model/Roi_box_list.cpp @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Roi_box_list.h b/broker/gen/model/Roi_box_list.h index 45750e5d1..90dfbcd42 100644 --- a/broker/gen/model/Roi_box_list.h +++ b/broker/gen/model/Roi_box_list.h @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Roi_circle.cpp b/broker/gen/model/Roi_circle.cpp index 81f517d53..f55912211 100644 --- a/broker/gen/model/Roi_circle.cpp +++ b/broker/gen/model/Roi_circle.cpp @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Roi_circle.h b/broker/gen/model/Roi_circle.h index 87ddb8905..e96562b6d 100644 --- a/broker/gen/model/Roi_circle.h +++ b/broker/gen/model/Roi_circle.h @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Roi_circle_list.cpp b/broker/gen/model/Roi_circle_list.cpp index 861c1179b..d6a2feb55 100644 --- a/broker/gen/model/Roi_circle_list.cpp +++ b/broker/gen/model/Roi_circle_list.cpp @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Roi_circle_list.h b/broker/gen/model/Roi_circle_list.h index ea219340e..f7276fcb7 100644 --- a/broker/gen/model/Roi_circle_list.h +++ b/broker/gen/model/Roi_circle_list.h @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Roi_definitions.cpp b/broker/gen/model/Roi_definitions.cpp index 82cde7be1..b6344bd10 100644 --- a/broker/gen/model/Roi_definitions.cpp +++ b/broker/gen/model/Roi_definitions.cpp @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Roi_definitions.h b/broker/gen/model/Roi_definitions.h index 3650b76db..6e6a9c266 100644 --- a/broker/gen/model/Roi_definitions.h +++ b/broker/gen/model/Roi_definitions.h @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Rotation_axis.cpp b/broker/gen/model/Rotation_axis.cpp index 99cc9739f..f3faf4e4e 100644 --- a/broker/gen/model/Rotation_axis.cpp +++ b/broker/gen/model/Rotation_axis.cpp @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Rotation_axis.h b/broker/gen/model/Rotation_axis.h index 83e78112c..124f40300 100644 --- a/broker/gen/model/Rotation_axis.h +++ b/broker/gen/model/Rotation_axis.h @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Rugnux_live_blob.cpp b/broker/gen/model/Rugnux_live_blob.cpp new file mode 100644 index 000000000..a3feb18f2 --- /dev/null +++ b/broker/gen/model/Rugnux_live_blob.cpp @@ -0,0 +1,204 @@ +/** +* Jungfraujoch +* API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. +* +* The version of the OpenAPI document: 1.0.0-rc.180 +* Contact: filip.leonarski@psi.ch +* +* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). +* https://openapi-generator.tech +* Do not edit the class manually. +*/ + + +#include "Rugnux_live_blob.h" +#include "Helpers.h" + +#include + +namespace org::openapitools::server::model +{ + +Rugnux_live_blob::Rugnux_live_blob() +{ + m_Kind = ""; + m_x = 0.0; + m_y = 0.0; + m_z = 0.0; + m_Peak_sigma = 0.0; + m_Volume_A3 = 0.0; + m_Nearest_atom = ""; + m_Nearest_atom_distance_A = 0.0; + m_Nearest_atom_distance_AIsSet = false; + +} + +void Rugnux_live_blob::validate() const +{ + std::stringstream msg; + if (!validate(msg)) + { + throw org::openapitools::server::helpers::ValidationException(msg.str()); + } +} + +bool Rugnux_live_blob::validate(std::stringstream& msg) const +{ + return validate(msg, ""); +} + +bool Rugnux_live_blob::validate(std::stringstream& msg, const std::string& pathPrefix) const +{ + bool success = true; + const std::string _pathPrefix = pathPrefix.empty() ? "Rugnux_live_blob" : pathPrefix; + + + return success; +} + +bool Rugnux_live_blob::operator==(const Rugnux_live_blob& rhs) const +{ + return + + + (getKind() == rhs.getKind()) + && + + (getX() == rhs.getX()) + && + + (getY() == rhs.getY()) + && + + (getZ() == rhs.getZ()) + && + + (getPeakSigma() == rhs.getPeakSigma()) + && + + (getVolumeA3() == rhs.getVolumeA3()) + && + + (getNearestAtom() == rhs.getNearestAtom()) + && + + + ((!nearestAtomDistanceAIsSet() && !rhs.nearestAtomDistanceAIsSet()) || (nearestAtomDistanceAIsSet() && rhs.nearestAtomDistanceAIsSet() && getNearestAtomDistanceA() == rhs.getNearestAtomDistanceA())) + + ; +} + +bool Rugnux_live_blob::operator!=(const Rugnux_live_blob& rhs) const +{ + return !(*this == rhs); +} + +void to_json(nlohmann::json& j, const Rugnux_live_blob& o) +{ + j = nlohmann::json::object(); + j["kind"] = o.m_Kind; + j["x"] = o.m_x; + j["y"] = o.m_y; + j["z"] = o.m_z; + j["peak_sigma"] = o.m_Peak_sigma; + j["volume_A3"] = o.m_Volume_A3; + j["nearest_atom"] = o.m_Nearest_atom; + if(o.nearestAtomDistanceAIsSet()) + j["nearest_atom_distance_A"] = o.m_Nearest_atom_distance_A; + +} + +void from_json(const nlohmann::json& j, Rugnux_live_blob& o) +{ + j.at("kind").get_to(o.m_Kind); + j.at("x").get_to(o.m_x); + j.at("y").get_to(o.m_y); + j.at("z").get_to(o.m_z); + j.at("peak_sigma").get_to(o.m_Peak_sigma); + j.at("volume_A3").get_to(o.m_Volume_A3); + j.at("nearest_atom").get_to(o.m_Nearest_atom); + if(j.find("nearest_atom_distance_A") != j.end()) + { + j.at("nearest_atom_distance_A").get_to(o.m_Nearest_atom_distance_A); + o.m_Nearest_atom_distance_AIsSet = true; + } + +} + +std::string Rugnux_live_blob::getKind() const +{ + return m_Kind; +} +void Rugnux_live_blob::setKind(std::string const& value) +{ + m_Kind = value; +} +double Rugnux_live_blob::getX() const +{ + return m_x; +} +void Rugnux_live_blob::setX(double const value) +{ + m_x = value; +} +double Rugnux_live_blob::getY() const +{ + return m_y; +} +void Rugnux_live_blob::setY(double const value) +{ + m_y = value; +} +double Rugnux_live_blob::getZ() const +{ + return m_z; +} +void Rugnux_live_blob::setZ(double const value) +{ + m_z = value; +} +double Rugnux_live_blob::getPeakSigma() const +{ + return m_Peak_sigma; +} +void Rugnux_live_blob::setPeakSigma(double const value) +{ + m_Peak_sigma = value; +} +double Rugnux_live_blob::getVolumeA3() const +{ + return m_Volume_A3; +} +void Rugnux_live_blob::setVolumeA3(double const value) +{ + m_Volume_A3 = value; +} +std::string Rugnux_live_blob::getNearestAtom() const +{ + return m_Nearest_atom; +} +void Rugnux_live_blob::setNearestAtom(std::string const& value) +{ + m_Nearest_atom = value; +} +double Rugnux_live_blob::getNearestAtomDistanceA() const +{ + return m_Nearest_atom_distance_A; +} +void Rugnux_live_blob::setNearestAtomDistanceA(double const value) +{ + m_Nearest_atom_distance_A = value; + m_Nearest_atom_distance_AIsSet = true; +} +bool Rugnux_live_blob::nearestAtomDistanceAIsSet() const +{ + return m_Nearest_atom_distance_AIsSet; +} +void Rugnux_live_blob::unsetNearest_atom_distance_A() +{ + m_Nearest_atom_distance_AIsSet = false; +} + + +} // namespace org::openapitools::server::model + diff --git a/broker/gen/model/Rugnux_live_blob.h b/broker/gen/model/Rugnux_live_blob.h new file mode 100644 index 000000000..20372f595 --- /dev/null +++ b/broker/gen/model/Rugnux_live_blob.h @@ -0,0 +1,128 @@ +/** +* Jungfraujoch +* API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. +* +* The version of the OpenAPI document: 1.0.0-rc.180 +* Contact: filip.leonarski@psi.ch +* +* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). +* https://openapi-generator.tech +* Do not edit the class manually. +*/ +/* + * Rugnux_live_blob.h + * + * A blob of positive mFo-DFc density the refined model leaves unexplained, with its likely reading: a rule on what is measured, to point a person at the density - not an identification. + */ + +#ifndef Rugnux_live_blob_H_ +#define Rugnux_live_blob_H_ + + +#include +#include + +namespace org::openapitools::server::model +{ + +/// +/// A blob of positive mFo-DFc density the refined model leaves unexplained, with its likely reading: a rule on what is measured, to point a person at the density - not an identification. +/// +class Rugnux_live_blob +{ +public: + Rugnux_live_blob(); + virtual ~Rugnux_live_blob() = default; + + + /// + /// Validate the current data in the model. Throws a ValidationException on failure. + /// + void validate() const; + + /// + /// Validate the current data in the model. Returns false on error and writes an error + /// message into the given stringstream. + /// + bool validate(std::stringstream& msg) const; + + /// + /// Helper overload for validate. Used when one model stores another model and calls it's validate. + /// Not meant to be called outside that case. + /// + bool validate(std::stringstream& msg, const std::string& pathPrefix) const; + + bool operator==(const Rugnux_live_blob& rhs) const; + bool operator!=(const Rugnux_live_blob& rhs) const; + + ///////////////////////////////////////////// + /// Rugnux_live_blob members + + /// + /// + /// + std::string getKind() const; + void setKind(std::string const& value); + /// + /// Centroid, Cartesian Angstrom, in the frame of the refined model (`/rugnux/model.cif`) + /// + double getX() const; + void setX(double const value); + /// + /// + /// + double getY() const; + void setY(double const value); + /// + /// + /// + double getZ() const; + void setZ(double const value); + /// + /// The highest point, in map sigma + /// + double getPeakSigma() const; + void setPeakSigma(double const value); + /// + /// Volume above 3 sigma, in cubic Angstrom + /// + double getVolumeA3() const; + void setVolumeA3(double const value); + /// + /// e.g. \"OG1 THR A42\" + /// + std::string getNearestAtom() const; + void setNearestAtom(std::string const& value); + /// + /// Absent where no atom is within 12 Angstrom + /// + double getNearestAtomDistanceA() const; + void setNearestAtomDistanceA(double const value); + bool nearestAtomDistanceAIsSet() const; + void unsetNearest_atom_distance_A(); + + friend void to_json(nlohmann::json& j, const Rugnux_live_blob& o); + friend void from_json(const nlohmann::json& j, Rugnux_live_blob& o); +protected: + std::string m_Kind; + + double m_x; + + double m_y; + + double m_z; + + double m_Peak_sigma; + + double m_Volume_A3; + + std::string m_Nearest_atom; + + double m_Nearest_atom_distance_A; + bool m_Nearest_atom_distance_AIsSet; + +}; + +} // namespace org::openapitools::server::model + +#endif /* Rugnux_live_blob_H_ */ diff --git a/broker/gen/model/Rugnux_live_model.cpp b/broker/gen/model/Rugnux_live_model.cpp new file mode 100644 index 000000000..da7ba982d --- /dev/null +++ b/broker/gen/model/Rugnux_live_model.cpp @@ -0,0 +1,580 @@ +/** +* Jungfraujoch +* API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. +* +* The version of the OpenAPI document: 1.0.0-rc.180 +* Contact: filip.leonarski@psi.ch +* +* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). +* https://openapi-generator.tech +* Do not edit the class manually. +*/ + + +#include "Rugnux_live_model.h" +#include "Helpers.h" + +#include + +namespace org::openapitools::server::model +{ + +Rugnux_live_model::Rugnux_live_model() +{ + m_Placement = ""; + m_Model_name = ""; + m_Predicted = false; + m_Reason = ""; + m_R_work = 0.0; + m_R_workIsSet = false; + m_R_free = 0.0; + m_R_freeIsSet = false; + m_Cc_model = 0.0; + m_Cc_modelIsSet = false; + m_Fit_sigma = 0.0; + m_Fit_sigmaIsSet = false; + m_Map_atom_sigma = 0.0; + m_Map_atom_sigmaIsSet = false; + m_Rigid_body_angle_deg = 0.0; + m_Rigid_body_angle_degIsSet = false; + m_Rigid_body_shift_A = 0.0; + m_Rigid_body_shift_AIsSet = false; + m_Mr_decision = ""; + m_Mr_space_group = ""; + m_Copies = 0L; + m_CopiesIsSet = false; + m_Tf_z = 0.0; + m_Tf_zIsSet = false; + m_Rf_z = 0.0; + m_Rf_zIsSet = false; + m_Llg_z = 0.0; + m_Llg_zIsSet = false; + m_Mr_d_min = 0.0; + m_Mr_d_minIsSet = false; + m_Anomalous_site = ""; + m_Anomalous_site_sigma = 0.0; + m_Anomalous_site_sigmaIsSet = false; + m_RefinementIsSet = false; + +} + +void Rugnux_live_model::validate() const +{ + std::stringstream msg; + if (!validate(msg)) + { + throw org::openapitools::server::helpers::ValidationException(msg.str()); + } +} + +bool Rugnux_live_model::validate(std::stringstream& msg) const +{ + return validate(msg, ""); +} + +bool Rugnux_live_model::validate(std::stringstream& msg, const std::string& pathPrefix) const +{ + bool success = true; + const std::string _pathPrefix = pathPrefix.empty() ? "Rugnux_live_model" : pathPrefix; + + + return success; +} + +bool Rugnux_live_model::operator==(const Rugnux_live_model& rhs) const +{ + return + + + (getPlacement() == rhs.getPlacement()) + && + + (getModelName() == rhs.getModelName()) + && + + (isPredicted() == rhs.isPredicted()) + && + + (getReason() == rhs.getReason()) + && + + + ((!rWorkIsSet() && !rhs.rWorkIsSet()) || (rWorkIsSet() && rhs.rWorkIsSet() && getRWork() == rhs.getRWork())) && + + + ((!rFreeIsSet() && !rhs.rFreeIsSet()) || (rFreeIsSet() && rhs.rFreeIsSet() && getRFree() == rhs.getRFree())) && + + + ((!ccModelIsSet() && !rhs.ccModelIsSet()) || (ccModelIsSet() && rhs.ccModelIsSet() && getCcModel() == rhs.getCcModel())) && + + + ((!fitSigmaIsSet() && !rhs.fitSigmaIsSet()) || (fitSigmaIsSet() && rhs.fitSigmaIsSet() && getFitSigma() == rhs.getFitSigma())) && + + + ((!mapAtomSigmaIsSet() && !rhs.mapAtomSigmaIsSet()) || (mapAtomSigmaIsSet() && rhs.mapAtomSigmaIsSet() && getMapAtomSigma() == rhs.getMapAtomSigma())) && + + + ((!rigidBodyAngleDegIsSet() && !rhs.rigidBodyAngleDegIsSet()) || (rigidBodyAngleDegIsSet() && rhs.rigidBodyAngleDegIsSet() && getRigidBodyAngleDeg() == rhs.getRigidBodyAngleDeg())) && + + + ((!rigidBodyShiftAIsSet() && !rhs.rigidBodyShiftAIsSet()) || (rigidBodyShiftAIsSet() && rhs.rigidBodyShiftAIsSet() && getRigidBodyShiftA() == rhs.getRigidBodyShiftA())) && + + (getMrDecision() == rhs.getMrDecision()) + && + + (getMrSpaceGroup() == rhs.getMrSpaceGroup()) + && + + + ((!copiesIsSet() && !rhs.copiesIsSet()) || (copiesIsSet() && rhs.copiesIsSet() && getCopies() == rhs.getCopies())) && + + + ((!tfZIsSet() && !rhs.tfZIsSet()) || (tfZIsSet() && rhs.tfZIsSet() && getTfZ() == rhs.getTfZ())) && + + + ((!rfZIsSet() && !rhs.rfZIsSet()) || (rfZIsSet() && rhs.rfZIsSet() && getRfZ() == rhs.getRfZ())) && + + + ((!llgZIsSet() && !rhs.llgZIsSet()) || (llgZIsSet() && rhs.llgZIsSet() && getLlgZ() == rhs.getLlgZ())) && + + + ((!mrDMinIsSet() && !rhs.mrDMinIsSet()) || (mrDMinIsSet() && rhs.mrDMinIsSet() && getMrDMin() == rhs.getMrDMin())) && + + (getAnomalousSite() == rhs.getAnomalousSite()) + && + + + ((!anomalousSiteSigmaIsSet() && !rhs.anomalousSiteSigmaIsSet()) || (anomalousSiteSigmaIsSet() && rhs.anomalousSiteSigmaIsSet() && getAnomalousSiteSigma() == rhs.getAnomalousSiteSigma())) && + + + ((!refinementIsSet() && !rhs.refinementIsSet()) || (refinementIsSet() && rhs.refinementIsSet() && getRefinement() == rhs.getRefinement())) + + ; +} + +bool Rugnux_live_model::operator!=(const Rugnux_live_model& rhs) const +{ + return !(*this == rhs); +} + +void to_json(nlohmann::json& j, const Rugnux_live_model& o) +{ + j = nlohmann::json::object(); + j["placement"] = o.m_Placement; + j["model_name"] = o.m_Model_name; + j["predicted"] = o.m_Predicted; + j["reason"] = o.m_Reason; + if(o.rWorkIsSet()) + j["r_work"] = o.m_R_work; + if(o.rFreeIsSet()) + j["r_free"] = o.m_R_free; + if(o.ccModelIsSet()) + j["cc_model"] = o.m_Cc_model; + if(o.fitSigmaIsSet()) + j["fit_sigma"] = o.m_Fit_sigma; + if(o.mapAtomSigmaIsSet()) + j["map_atom_sigma"] = o.m_Map_atom_sigma; + if(o.rigidBodyAngleDegIsSet()) + j["rigid_body_angle_deg"] = o.m_Rigid_body_angle_deg; + if(o.rigidBodyShiftAIsSet()) + j["rigid_body_shift_A"] = o.m_Rigid_body_shift_A; + j["mr_decision"] = o.m_Mr_decision; + j["mr_space_group"] = o.m_Mr_space_group; + if(o.copiesIsSet()) + j["copies"] = o.m_Copies; + if(o.tfZIsSet()) + j["tf_z"] = o.m_Tf_z; + if(o.rfZIsSet()) + j["rf_z"] = o.m_Rf_z; + if(o.llgZIsSet()) + j["llg_z"] = o.m_Llg_z; + if(o.mrDMinIsSet()) + j["mr_d_min"] = o.m_Mr_d_min; + j["anomalous_site"] = o.m_Anomalous_site; + if(o.anomalousSiteSigmaIsSet()) + j["anomalous_site_sigma"] = o.m_Anomalous_site_sigma; + if(o.refinementIsSet()) + j["refinement"] = o.m_Refinement; + +} + +void from_json(const nlohmann::json& j, Rugnux_live_model& o) +{ + j.at("placement").get_to(o.m_Placement); + j.at("model_name").get_to(o.m_Model_name); + j.at("predicted").get_to(o.m_Predicted); + j.at("reason").get_to(o.m_Reason); + if(j.find("r_work") != j.end()) + { + j.at("r_work").get_to(o.m_R_work); + o.m_R_workIsSet = true; + } + if(j.find("r_free") != j.end()) + { + j.at("r_free").get_to(o.m_R_free); + o.m_R_freeIsSet = true; + } + if(j.find("cc_model") != j.end()) + { + j.at("cc_model").get_to(o.m_Cc_model); + o.m_Cc_modelIsSet = true; + } + if(j.find("fit_sigma") != j.end()) + { + j.at("fit_sigma").get_to(o.m_Fit_sigma); + o.m_Fit_sigmaIsSet = true; + } + if(j.find("map_atom_sigma") != j.end()) + { + j.at("map_atom_sigma").get_to(o.m_Map_atom_sigma); + o.m_Map_atom_sigmaIsSet = true; + } + if(j.find("rigid_body_angle_deg") != j.end()) + { + j.at("rigid_body_angle_deg").get_to(o.m_Rigid_body_angle_deg); + o.m_Rigid_body_angle_degIsSet = true; + } + if(j.find("rigid_body_shift_A") != j.end()) + { + j.at("rigid_body_shift_A").get_to(o.m_Rigid_body_shift_A); + o.m_Rigid_body_shift_AIsSet = true; + } + j.at("mr_decision").get_to(o.m_Mr_decision); + j.at("mr_space_group").get_to(o.m_Mr_space_group); + if(j.find("copies") != j.end()) + { + j.at("copies").get_to(o.m_Copies); + o.m_CopiesIsSet = true; + } + if(j.find("tf_z") != j.end()) + { + j.at("tf_z").get_to(o.m_Tf_z); + o.m_Tf_zIsSet = true; + } + if(j.find("rf_z") != j.end()) + { + j.at("rf_z").get_to(o.m_Rf_z); + o.m_Rf_zIsSet = true; + } + if(j.find("llg_z") != j.end()) + { + j.at("llg_z").get_to(o.m_Llg_z); + o.m_Llg_zIsSet = true; + } + if(j.find("mr_d_min") != j.end()) + { + j.at("mr_d_min").get_to(o.m_Mr_d_min); + o.m_Mr_d_minIsSet = true; + } + j.at("anomalous_site").get_to(o.m_Anomalous_site); + if(j.find("anomalous_site_sigma") != j.end()) + { + j.at("anomalous_site_sigma").get_to(o.m_Anomalous_site_sigma); + o.m_Anomalous_site_sigmaIsSet = true; + } + if(j.find("refinement") != j.end()) + { + j.at("refinement").get_to(o.m_Refinement); + o.m_RefinementIsSet = true; + } + +} + +std::string Rugnux_live_model::getPlacement() const +{ + return m_Placement; +} +void Rugnux_live_model::setPlacement(std::string const& value) +{ + m_Placement = value; +} +std::string Rugnux_live_model::getModelName() const +{ + return m_Model_name; +} +void Rugnux_live_model::setModelName(std::string const& value) +{ + m_Model_name = value; +} +bool Rugnux_live_model::isPredicted() const +{ + return m_Predicted; +} +void Rugnux_live_model::setPredicted(bool const value) +{ + m_Predicted = value; +} +std::string Rugnux_live_model::getReason() const +{ + return m_Reason; +} +void Rugnux_live_model::setReason(std::string const& value) +{ + m_Reason = value; +} +double Rugnux_live_model::getRWork() const +{ + return m_R_work; +} +void Rugnux_live_model::setRWork(double const value) +{ + m_R_work = value; + m_R_workIsSet = true; +} +bool Rugnux_live_model::rWorkIsSet() const +{ + return m_R_workIsSet; +} +void Rugnux_live_model::unsetR_work() +{ + m_R_workIsSet = false; +} +double Rugnux_live_model::getRFree() const +{ + return m_R_free; +} +void Rugnux_live_model::setRFree(double const value) +{ + m_R_free = value; + m_R_freeIsSet = true; +} +bool Rugnux_live_model::rFreeIsSet() const +{ + return m_R_freeIsSet; +} +void Rugnux_live_model::unsetR_free() +{ + m_R_freeIsSet = false; +} +double Rugnux_live_model::getCcModel() const +{ + return m_Cc_model; +} +void Rugnux_live_model::setCcModel(double const value) +{ + m_Cc_model = value; + m_Cc_modelIsSet = true; +} +bool Rugnux_live_model::ccModelIsSet() const +{ + return m_Cc_modelIsSet; +} +void Rugnux_live_model::unsetCc_model() +{ + m_Cc_modelIsSet = false; +} +double Rugnux_live_model::getFitSigma() const +{ + return m_Fit_sigma; +} +void Rugnux_live_model::setFitSigma(double const value) +{ + m_Fit_sigma = value; + m_Fit_sigmaIsSet = true; +} +bool Rugnux_live_model::fitSigmaIsSet() const +{ + return m_Fit_sigmaIsSet; +} +void Rugnux_live_model::unsetFit_sigma() +{ + m_Fit_sigmaIsSet = false; +} +double Rugnux_live_model::getMapAtomSigma() const +{ + return m_Map_atom_sigma; +} +void Rugnux_live_model::setMapAtomSigma(double const value) +{ + m_Map_atom_sigma = value; + m_Map_atom_sigmaIsSet = true; +} +bool Rugnux_live_model::mapAtomSigmaIsSet() const +{ + return m_Map_atom_sigmaIsSet; +} +void Rugnux_live_model::unsetMap_atom_sigma() +{ + m_Map_atom_sigmaIsSet = false; +} +double Rugnux_live_model::getRigidBodyAngleDeg() const +{ + return m_Rigid_body_angle_deg; +} +void Rugnux_live_model::setRigidBodyAngleDeg(double const value) +{ + m_Rigid_body_angle_deg = value; + m_Rigid_body_angle_degIsSet = true; +} +bool Rugnux_live_model::rigidBodyAngleDegIsSet() const +{ + return m_Rigid_body_angle_degIsSet; +} +void Rugnux_live_model::unsetRigid_body_angle_deg() +{ + m_Rigid_body_angle_degIsSet = false; +} +double Rugnux_live_model::getRigidBodyShiftA() const +{ + return m_Rigid_body_shift_A; +} +void Rugnux_live_model::setRigidBodyShiftA(double const value) +{ + m_Rigid_body_shift_A = value; + m_Rigid_body_shift_AIsSet = true; +} +bool Rugnux_live_model::rigidBodyShiftAIsSet() const +{ + return m_Rigid_body_shift_AIsSet; +} +void Rugnux_live_model::unsetRigid_body_shift_A() +{ + m_Rigid_body_shift_AIsSet = false; +} +std::string Rugnux_live_model::getMrDecision() const +{ + return m_Mr_decision; +} +void Rugnux_live_model::setMrDecision(std::string const& value) +{ + m_Mr_decision = value; +} +std::string Rugnux_live_model::getMrSpaceGroup() const +{ + return m_Mr_space_group; +} +void Rugnux_live_model::setMrSpaceGroup(std::string const& value) +{ + m_Mr_space_group = value; +} +int64_t Rugnux_live_model::getCopies() const +{ + return m_Copies; +} +void Rugnux_live_model::setCopies(int64_t const value) +{ + m_Copies = value; + m_CopiesIsSet = true; +} +bool Rugnux_live_model::copiesIsSet() const +{ + return m_CopiesIsSet; +} +void Rugnux_live_model::unsetCopies() +{ + m_CopiesIsSet = false; +} +double Rugnux_live_model::getTfZ() const +{ + return m_Tf_z; +} +void Rugnux_live_model::setTfZ(double const value) +{ + m_Tf_z = value; + m_Tf_zIsSet = true; +} +bool Rugnux_live_model::tfZIsSet() const +{ + return m_Tf_zIsSet; +} +void Rugnux_live_model::unsetTf_z() +{ + m_Tf_zIsSet = false; +} +double Rugnux_live_model::getRfZ() const +{ + return m_Rf_z; +} +void Rugnux_live_model::setRfZ(double const value) +{ + m_Rf_z = value; + m_Rf_zIsSet = true; +} +bool Rugnux_live_model::rfZIsSet() const +{ + return m_Rf_zIsSet; +} +void Rugnux_live_model::unsetRf_z() +{ + m_Rf_zIsSet = false; +} +double Rugnux_live_model::getLlgZ() const +{ + return m_Llg_z; +} +void Rugnux_live_model::setLlgZ(double const value) +{ + m_Llg_z = value; + m_Llg_zIsSet = true; +} +bool Rugnux_live_model::llgZIsSet() const +{ + return m_Llg_zIsSet; +} +void Rugnux_live_model::unsetLlg_z() +{ + m_Llg_zIsSet = false; +} +double Rugnux_live_model::getMrDMin() const +{ + return m_Mr_d_min; +} +void Rugnux_live_model::setMrDMin(double const value) +{ + m_Mr_d_min = value; + m_Mr_d_minIsSet = true; +} +bool Rugnux_live_model::mrDMinIsSet() const +{ + return m_Mr_d_minIsSet; +} +void Rugnux_live_model::unsetMr_d_min() +{ + m_Mr_d_minIsSet = false; +} +std::string Rugnux_live_model::getAnomalousSite() const +{ + return m_Anomalous_site; +} +void Rugnux_live_model::setAnomalousSite(std::string const& value) +{ + m_Anomalous_site = value; +} +double Rugnux_live_model::getAnomalousSiteSigma() const +{ + return m_Anomalous_site_sigma; +} +void Rugnux_live_model::setAnomalousSiteSigma(double const value) +{ + m_Anomalous_site_sigma = value; + m_Anomalous_site_sigmaIsSet = true; +} +bool Rugnux_live_model::anomalousSiteSigmaIsSet() const +{ + return m_Anomalous_site_sigmaIsSet; +} +void Rugnux_live_model::unsetAnomalous_site_sigma() +{ + m_Anomalous_site_sigmaIsSet = false; +} +org::openapitools::server::model::Rugnux_live_refinement Rugnux_live_model::getRefinement() const +{ + return m_Refinement; +} +void Rugnux_live_model::setRefinement(org::openapitools::server::model::Rugnux_live_refinement const& value) +{ + m_Refinement = value; + m_RefinementIsSet = true; +} +bool Rugnux_live_model::refinementIsSet() const +{ + return m_RefinementIsSet; +} +void Rugnux_live_model::unsetRefinement() +{ + m_RefinementIsSet = false; +} + + +} // namespace org::openapitools::server::model + diff --git a/broker/gen/model/Rugnux_live_model.h b/broker/gen/model/Rugnux_live_model.h new file mode 100644 index 000000000..d8ce3ced3 --- /dev/null +++ b/broker/gen/model/Rugnux_live_model.h @@ -0,0 +1,246 @@ +/** +* Jungfraujoch +* API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. +* +* The version of the OpenAPI document: 1.0.0-rc.180 +* Contact: filip.leonarski@psi.ch +* +* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). +* https://openapi-generator.tech +* Do not edit the class manually. +*/ +/* + * Rugnux_live_model.h + * + * What the run made of the model it was given, as the report's MODEL VALIDATION section states it. The R-factors here are those of the placed model with its own coordinates and B factors; what refinement made of it is in `refinement`. A value that is absent was not computed - the model was not placed, or not by molecular replacement. + */ + +#ifndef Rugnux_live_model_H_ +#define Rugnux_live_model_H_ + + +#include +#include "Rugnux_live_refinement.h" +#include + +namespace org::openapitools::server::model +{ + +/// +/// What the run made of the model it was given, as the report's MODEL VALIDATION section states it. The R-factors here are those of the placed model with its own coordinates and B factors; what refinement made of it is in `refinement`. A value that is absent was not computed - the model was not placed, or not by molecular replacement. +/// +class Rugnux_live_model +{ +public: + Rugnux_live_model(); + virtual ~Rugnux_live_model() = default; + + + /// + /// Validate the current data in the model. Throws a ValidationException on failure. + /// + void validate() const; + + /// + /// Validate the current data in the model. Returns false on error and writes an error + /// message into the given stringstream. + /// + bool validate(std::stringstream& msg) const; + + /// + /// Helper overload for validate. Used when one model stores another model and calls it's validate. + /// Not meant to be called outside that case. + /// + bool validate(std::stringstream& msg, const std::string& pathPrefix) const; + + bool operator==(const Rugnux_live_model& rhs) const; + bool operator!=(const Rugnux_live_model& rhs) const; + + ///////////////////////////////////////////// + /// Rugnux_live_model members + + /// + /// RIGID_BODY (the model fits where it is), MR (molecular replacement placed it) or NOT_PLACED + /// + std::string getPlacement() const; + void setPlacement(std::string const& value); + /// + /// + /// + std::string getModelName() const; + void setModelName(std::string const& value); + /// + /// Searched for as a predicted model + /// + bool isPredicted() const; + void setPredicted(bool const value); + /// + /// Why the model could not be searched for or validated; empty otherwise + /// + std::string getReason() const; + void setReason(std::string const& value); + /// + /// + /// + double getRWork() const; + void setRWork(double const value); + bool rWorkIsSet() const; + void unsetR_work(); + /// + /// + /// + double getRFree() const; + void setRFree(double const value); + bool rFreeIsSet() const; + void unsetR_free(); + /// + /// Correlation of the merged intensities with the placed model's, over all reflections + /// + double getCcModel() const; + void setCcModel(double const value); + bool ccModelIsSet() const; + void unsetCc_model(); + /// + /// How far R-work stands below that of the same model in random orientations, in standard deviations + /// + double getFitSigma() const; + void setFitSigma(double const value); + bool fitSigmaIsSet() const; + void unsetFit_sigma(); + /// + /// Mean 2mFo-DFc value at the atom centres, in map sigma + /// + double getMapAtomSigma() const; + void setMapAtomSigma(double const value); + bool mapAtomSigmaIsSet() const; + void unsetMap_atom_sigma(); + /// + /// + /// + double getRigidBodyAngleDeg() const; + void setRigidBodyAngleDeg(double const value); + bool rigidBodyAngleDegIsSet() const; + void unsetRigid_body_angle_deg(); + /// + /// + /// + double getRigidBodyShiftA() const; + void setRigidBodyShiftA(double const value); + bool rigidBodyShiftAIsSet() const; + void unsetRigid_body_shift_A(); + /// + /// Molecular replacement's decision (AGREES, ENANTIOMORPH, SPACE_GROUP, TWIN_SUBGROUP, or why it placed nothing); empty where it did not run + /// + std::string getMrDecision() const; + void setMrDecision(std::string const& value); + /// + /// The group molecular replacement placed the model in; empty where it placed none + /// + std::string getMrSpaceGroup() const; + void setMrSpaceGroup(std::string const& value); + /// + /// Copies placed by molecular replacement + /// + int64_t getCopies() const; + void setCopies(int64_t const value); + bool copiesIsSet() const; + void unsetCopies(); + /// + /// Translation-function Z-score, the highest of the copies' + /// + double getTfZ() const; + void setTfZ(double const value); + bool tfZIsSet() const; + void unsetTf_z(); + /// + /// Rotation-function Z-score of the first copy's orientation + /// + double getRfZ() const; + void setRfZ(double const value); + bool rfZIsSet() const; + void unsetRf_z(); + /// + /// Likelihood Z-score after the rigid body, where a copy's translation function did not stand out + /// + double getLlgZ() const; + void setLlgZ(double const value); + bool llgZIsSet() const; + void unsetLlg_z(); + /// + /// High-resolution limit of the molecular-replacement search, in Angstrom + /// + double getMrDMin() const; + void setMrDMin(double const value); + bool mrDMinIsSet() const; + void unsetMr_d_min(); + /// + /// Atom with the strongest anomalous difference density, e.g. \"SG CYS A7\"; empty where there is no anomalous map + /// + std::string getAnomalousSite() const; + void setAnomalousSite(std::string const& value); + /// + /// Anomalous difference density at that atom, in map sigma + /// + double getAnomalousSiteSigma() const; + void setAnomalousSiteSigma(double const value); + bool anomalousSiteSigmaIsSet() const; + void unsetAnomalous_site_sigma(); + /// + /// + /// + org::openapitools::server::model::Rugnux_live_refinement getRefinement() const; + void setRefinement(org::openapitools::server::model::Rugnux_live_refinement const& value); + bool refinementIsSet() const; + void unsetRefinement(); + + friend void to_json(nlohmann::json& j, const Rugnux_live_model& o); + friend void from_json(const nlohmann::json& j, Rugnux_live_model& o); +protected: + std::string m_Placement; + + std::string m_Model_name; + + bool m_Predicted; + + std::string m_Reason; + + double m_R_work; + bool m_R_workIsSet; + double m_R_free; + bool m_R_freeIsSet; + double m_Cc_model; + bool m_Cc_modelIsSet; + double m_Fit_sigma; + bool m_Fit_sigmaIsSet; + double m_Map_atom_sigma; + bool m_Map_atom_sigmaIsSet; + double m_Rigid_body_angle_deg; + bool m_Rigid_body_angle_degIsSet; + double m_Rigid_body_shift_A; + bool m_Rigid_body_shift_AIsSet; + std::string m_Mr_decision; + + std::string m_Mr_space_group; + + int64_t m_Copies; + bool m_CopiesIsSet; + double m_Tf_z; + bool m_Tf_zIsSet; + double m_Rf_z; + bool m_Rf_zIsSet; + double m_Llg_z; + bool m_Llg_zIsSet; + double m_Mr_d_min; + bool m_Mr_d_minIsSet; + std::string m_Anomalous_site; + + double m_Anomalous_site_sigma; + bool m_Anomalous_site_sigmaIsSet; + org::openapitools::server::model::Rugnux_live_refinement m_Refinement; + bool m_RefinementIsSet; + +}; + +} // namespace org::openapitools::server::model + +#endif /* Rugnux_live_model_H_ */ diff --git a/broker/gen/model/Rugnux_live_refinement.cpp b/broker/gen/model/Rugnux_live_refinement.cpp new file mode 100644 index 000000000..952cc5821 --- /dev/null +++ b/broker/gen/model/Rugnux_live_refinement.cpp @@ -0,0 +1,311 @@ +/** +* Jungfraujoch +* API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. +* +* The version of the OpenAPI document: 1.0.0-rc.180 +* Contact: filip.leonarski@psi.ch +* +* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). +* https://openapi-generator.tech +* Do not edit the class manually. +*/ + + +#include "Rugnux_live_refinement.h" +#include "Helpers.h" + +#include + +namespace org::openapitools::server::model +{ + +Rugnux_live_refinement::Rugnux_live_refinement() +{ + m_Performed = false; + m_Cancelled = false; + m_Reason = ""; + m_On_gpu = false; + m_Seconds = 0.0; + m_R_work = 0.0; + m_R_workIsSet = false; + m_R_free = 0.0; + m_R_freeIsSet = false; + m_Rmsd_bonds_A = 0.0; + m_Rmsd_bonds_AIsSet = false; + m_Rmsd_angles_deg = 0.0; + m_Rmsd_angles_degIsSet = false; + m_Blob_count = 0L; + +} + +void Rugnux_live_refinement::validate() const +{ + std::stringstream msg; + if (!validate(msg)) + { + throw org::openapitools::server::helpers::ValidationException(msg.str()); + } +} + +bool Rugnux_live_refinement::validate(std::stringstream& msg) const +{ + return validate(msg, ""); +} + +bool Rugnux_live_refinement::validate(std::stringstream& msg, const std::string& pathPrefix) const +{ + bool success = true; + const std::string _pathPrefix = pathPrefix.empty() ? "Rugnux_live_refinement" : pathPrefix; + + + + /* Blobs */ { + const std::vector& value = m_Blobs; + const std::string currentValuePath = _pathPrefix + ".blobs"; + + + { // Recursive validation of array elements + const std::string oldValuePath = currentValuePath; + int i = 0; + for (const org::openapitools::server::model::Rugnux_live_blob& value : value) + { + const std::string currentValuePath = oldValuePath + "[" + std::to_string(i) + "]"; + + success = value.validate(msg, currentValuePath + ".blobs") && success; + + i++; + } + } + + } + + return success; +} + +bool Rugnux_live_refinement::operator==(const Rugnux_live_refinement& rhs) const +{ + return + + + (isPerformed() == rhs.isPerformed()) + && + + (isCancelled() == rhs.isCancelled()) + && + + (getReason() == rhs.getReason()) + && + + (isOnGpu() == rhs.isOnGpu()) + && + + (getSeconds() == rhs.getSeconds()) + && + + + ((!rWorkIsSet() && !rhs.rWorkIsSet()) || (rWorkIsSet() && rhs.rWorkIsSet() && getRWork() == rhs.getRWork())) && + + + ((!rFreeIsSet() && !rhs.rFreeIsSet()) || (rFreeIsSet() && rhs.rFreeIsSet() && getRFree() == rhs.getRFree())) && + + + ((!rmsdBondsAIsSet() && !rhs.rmsdBondsAIsSet()) || (rmsdBondsAIsSet() && rhs.rmsdBondsAIsSet() && getRmsdBondsA() == rhs.getRmsdBondsA())) && + + + ((!rmsdAnglesDegIsSet() && !rhs.rmsdAnglesDegIsSet()) || (rmsdAnglesDegIsSet() && rhs.rmsdAnglesDegIsSet() && getRmsdAnglesDeg() == rhs.getRmsdAnglesDeg())) && + + (getBlobCount() == rhs.getBlobCount()) + && + + (getBlobs() == rhs.getBlobs()) + + + ; +} + +bool Rugnux_live_refinement::operator!=(const Rugnux_live_refinement& rhs) const +{ + return !(*this == rhs); +} + +void to_json(nlohmann::json& j, const Rugnux_live_refinement& o) +{ + j = nlohmann::json::object(); + j["performed"] = o.m_Performed; + j["cancelled"] = o.m_Cancelled; + j["reason"] = o.m_Reason; + j["on_gpu"] = o.m_On_gpu; + j["seconds"] = o.m_Seconds; + if(o.rWorkIsSet()) + j["r_work"] = o.m_R_work; + if(o.rFreeIsSet()) + j["r_free"] = o.m_R_free; + if(o.rmsdBondsAIsSet()) + j["rmsd_bonds_A"] = o.m_Rmsd_bonds_A; + if(o.rmsdAnglesDegIsSet()) + j["rmsd_angles_deg"] = o.m_Rmsd_angles_deg; + j["blob_count"] = o.m_Blob_count; + j["blobs"] = o.m_Blobs; + +} + +void from_json(const nlohmann::json& j, Rugnux_live_refinement& o) +{ + j.at("performed").get_to(o.m_Performed); + j.at("cancelled").get_to(o.m_Cancelled); + j.at("reason").get_to(o.m_Reason); + j.at("on_gpu").get_to(o.m_On_gpu); + j.at("seconds").get_to(o.m_Seconds); + if(j.find("r_work") != j.end()) + { + j.at("r_work").get_to(o.m_R_work); + o.m_R_workIsSet = true; + } + if(j.find("r_free") != j.end()) + { + j.at("r_free").get_to(o.m_R_free); + o.m_R_freeIsSet = true; + } + if(j.find("rmsd_bonds_A") != j.end()) + { + j.at("rmsd_bonds_A").get_to(o.m_Rmsd_bonds_A); + o.m_Rmsd_bonds_AIsSet = true; + } + if(j.find("rmsd_angles_deg") != j.end()) + { + j.at("rmsd_angles_deg").get_to(o.m_Rmsd_angles_deg); + o.m_Rmsd_angles_degIsSet = true; + } + j.at("blob_count").get_to(o.m_Blob_count); + j.at("blobs").get_to(o.m_Blobs); + +} + +bool Rugnux_live_refinement::isPerformed() const +{ + return m_Performed; +} +void Rugnux_live_refinement::setPerformed(bool const value) +{ + m_Performed = value; +} +bool Rugnux_live_refinement::isCancelled() const +{ + return m_Cancelled; +} +void Rugnux_live_refinement::setCancelled(bool const value) +{ + m_Cancelled = value; +} +std::string Rugnux_live_refinement::getReason() const +{ + return m_Reason; +} +void Rugnux_live_refinement::setReason(std::string const& value) +{ + m_Reason = value; +} +bool Rugnux_live_refinement::isOnGpu() const +{ + return m_On_gpu; +} +void Rugnux_live_refinement::setOnGpu(bool const value) +{ + m_On_gpu = value; +} +double Rugnux_live_refinement::getSeconds() const +{ + return m_Seconds; +} +void Rugnux_live_refinement::setSeconds(double const value) +{ + m_Seconds = value; +} +double Rugnux_live_refinement::getRWork() const +{ + return m_R_work; +} +void Rugnux_live_refinement::setRWork(double const value) +{ + m_R_work = value; + m_R_workIsSet = true; +} +bool Rugnux_live_refinement::rWorkIsSet() const +{ + return m_R_workIsSet; +} +void Rugnux_live_refinement::unsetR_work() +{ + m_R_workIsSet = false; +} +double Rugnux_live_refinement::getRFree() const +{ + return m_R_free; +} +void Rugnux_live_refinement::setRFree(double const value) +{ + m_R_free = value; + m_R_freeIsSet = true; +} +bool Rugnux_live_refinement::rFreeIsSet() const +{ + return m_R_freeIsSet; +} +void Rugnux_live_refinement::unsetR_free() +{ + m_R_freeIsSet = false; +} +double Rugnux_live_refinement::getRmsdBondsA() const +{ + return m_Rmsd_bonds_A; +} +void Rugnux_live_refinement::setRmsdBondsA(double const value) +{ + m_Rmsd_bonds_A = value; + m_Rmsd_bonds_AIsSet = true; +} +bool Rugnux_live_refinement::rmsdBondsAIsSet() const +{ + return m_Rmsd_bonds_AIsSet; +} +void Rugnux_live_refinement::unsetRmsd_bonds_A() +{ + m_Rmsd_bonds_AIsSet = false; +} +double Rugnux_live_refinement::getRmsdAnglesDeg() const +{ + return m_Rmsd_angles_deg; +} +void Rugnux_live_refinement::setRmsdAnglesDeg(double const value) +{ + m_Rmsd_angles_deg = value; + m_Rmsd_angles_degIsSet = true; +} +bool Rugnux_live_refinement::rmsdAnglesDegIsSet() const +{ + return m_Rmsd_angles_degIsSet; +} +void Rugnux_live_refinement::unsetRmsd_angles_deg() +{ + m_Rmsd_angles_degIsSet = false; +} +int64_t Rugnux_live_refinement::getBlobCount() const +{ + return m_Blob_count; +} +void Rugnux_live_refinement::setBlobCount(int64_t const value) +{ + m_Blob_count = value; +} +std::vector Rugnux_live_refinement::getBlobs() const +{ + return m_Blobs; +} +void Rugnux_live_refinement::setBlobs(std::vector const& value) +{ + m_Blobs = value; +} + + +} // namespace org::openapitools::server::model + diff --git a/broker/gen/model/Rugnux_live_refinement.h b/broker/gen/model/Rugnux_live_refinement.h new file mode 100644 index 000000000..2f4f91802 --- /dev/null +++ b/broker/gen/model/Rugnux_live_refinement.h @@ -0,0 +1,157 @@ +/** +* Jungfraujoch +* API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. +* +* The version of the OpenAPI document: 1.0.0-rc.180 +* Contact: filip.leonarski@psi.ch +* +* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). +* https://openapi-generator.tech +* Do not edit the class manually. +*/ +/* + * Rugnux_live_refinement.h + * + * The placed model refined against the merge it was placed on, as the report's REFINE_ keys state it. Set where a placed model was refined or its refinement failed; absent where the model was not placed or refinement was skipped. On a machine without a GPU it runs on the CPU, slower, and the run's deadline or cancel can cut it. + */ + +#ifndef Rugnux_live_refinement_H_ +#define Rugnux_live_refinement_H_ + + +#include "Rugnux_live_blob.h" +#include +#include +#include + +namespace org::openapitools::server::model +{ + +/// +/// The placed model refined against the merge it was placed on, as the report's REFINE_ keys state it. Set where a placed model was refined or its refinement failed; absent where the model was not placed or refinement was skipped. On a machine without a GPU it runs on the CPU, slower, and the run's deadline or cancel can cut it. +/// +class Rugnux_live_refinement +{ +public: + Rugnux_live_refinement(); + virtual ~Rugnux_live_refinement() = default; + + + /// + /// Validate the current data in the model. Throws a ValidationException on failure. + /// + void validate() const; + + /// + /// Validate the current data in the model. Returns false on error and writes an error + /// message into the given stringstream. + /// + bool validate(std::stringstream& msg) const; + + /// + /// Helper overload for validate. Used when one model stores another model and calls it's validate. + /// Not meant to be called outside that case. + /// + bool validate(std::stringstream& msg, const std::string& pathPrefix) const; + + bool operator==(const Rugnux_live_refinement& rhs) const; + bool operator!=(const Rugnux_live_refinement& rhs) const; + + ///////////////////////////////////////////// + /// Rugnux_live_refinement members + + /// + /// Refinement ran; false with `reason` where it failed + /// + bool isPerformed() const; + void setPerformed(bool const value); + /// + /// The deadline or a cancel cut the refinement short: the weight trials that ran were chosen among, the rest left out (cut before the first, the model is the placement's) + /// + bool isCancelled() const; + void setCancelled(bool const value); + /// + /// Why refinement did not run to the end; empty otherwise + /// + std::string getReason() const; + void setReason(std::string const& value); + /// + /// + /// + bool isOnGpu() const; + void setOnGpu(bool const value); + /// + /// Wall time of the refinement + /// + double getSeconds() const; + void setSeconds(double const value); + /// + /// R-work of the refined model (after the restrained stage, else after the rigid body and grouped B) + /// + double getRWork() const; + void setRWork(double const value); + bool rWorkIsSet() const; + void unsetR_work(); + /// + /// R-free of the refined model, on the same reflections as `r_work` + /// + double getRFree() const; + void setRFree(double const value); + bool rFreeIsSet() const; + void unsetR_free(); + /// + /// RMS deviation of the bond lengths from the dictionary, where the restrained stage ran + /// + double getRmsdBondsA() const; + void setRmsdBondsA(double const value); + bool rmsdBondsAIsSet() const; + void unsetRmsd_bonds_A(); + /// + /// RMS deviation of the bond angles from the dictionary, where the restrained stage ran + /// + double getRmsdAnglesDeg() const; + void setRmsdAnglesDeg(double const value); + bool rmsdAnglesDegIsSet() const; + void unsetRmsd_angles_deg(); + /// + /// Unexplained blobs of the refined model's mFo-DFc map (above 3 sigma, peaking above 4) + /// + int64_t getBlobCount() const; + void setBlobCount(int64_t const value); + /// + /// The strongest blobs, at most 50, strongest first + /// + std::vector getBlobs() const; + void setBlobs(std::vector const& value); + + friend void to_json(nlohmann::json& j, const Rugnux_live_refinement& o); + friend void from_json(const nlohmann::json& j, Rugnux_live_refinement& o); +protected: + bool m_Performed; + + bool m_Cancelled; + + std::string m_Reason; + + bool m_On_gpu; + + double m_Seconds; + + double m_R_work; + bool m_R_workIsSet; + double m_R_free; + bool m_R_freeIsSet; + double m_Rmsd_bonds_A; + bool m_Rmsd_bonds_AIsSet; + double m_Rmsd_angles_deg; + bool m_Rmsd_angles_degIsSet; + int64_t m_Blob_count; + + std::vector m_Blobs; + + +}; + +} // namespace org::openapitools::server::model + +#endif /* Rugnux_live_refinement_H_ */ diff --git a/broker/gen/model/Rugnux_live_status.cpp b/broker/gen/model/Rugnux_live_status.cpp index d0382a3a2..8b5032085 100644 --- a/broker/gen/model/Rugnux_live_status.cpp +++ b/broker/gen/model/Rugnux_live_status.cpp @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). @@ -23,7 +23,16 @@ Rugnux_live_status::Rugnux_live_status() { m_State = ""; m_Placed_model = false; + m_Refined_model = false; m_Anomalous_map = false; + m_Anomalous_signal = false; + m_ModelIsSet = false; + m_Space_group = ""; + m_Space_groupIsSet = false; + m_D_min = 0.0; + m_D_minIsSet = false; + m_Isa = 0.0; + m_IsaIsSet = false; m_Probe = ""; m_Probe_s = 0.0; m_Probe_sIsSet = false; @@ -69,7 +78,7 @@ bool Rugnux_live_status::validate(std::stringstream& msg, const std::string& pat bool success = true; const std::string _pathPrefix = pathPrefix.empty() ? "Rugnux_live_status" : pathPrefix; - + if (stepProgressIsSet()) { const float& value = m_Step_progress; @@ -166,9 +175,27 @@ bool Rugnux_live_status::operator==(const Rugnux_live_status& rhs) const (isPlacedModel() == rhs.isPlacedModel()) && + (isRefinedModel() == rhs.isRefinedModel()) + && + (isAnomalousMap() == rhs.isAnomalousMap()) && + (isAnomalousSignal() == rhs.isAnomalousSignal()) + && + + + ((!modelIsSet() && !rhs.modelIsSet()) || (modelIsSet() && rhs.modelIsSet() && getModel() == rhs.getModel())) && + + + ((!spaceGroupIsSet() && !rhs.spaceGroupIsSet()) || (spaceGroupIsSet() && rhs.spaceGroupIsSet() && getSpaceGroup() == rhs.getSpaceGroup())) && + + + ((!dMinIsSet() && !rhs.dMinIsSet()) || (dMinIsSet() && rhs.dMinIsSet() && getDMin() == rhs.getDMin())) && + + + ((!isaIsSet() && !rhs.isaIsSet()) || (isaIsSet() && rhs.isaIsSet() && getIsa() == rhs.getIsa())) && + (getProbe() == rhs.getProbe()) && @@ -236,7 +263,17 @@ void to_json(nlohmann::json& j, const Rugnux_live_status& o) j = nlohmann::json::object(); j["state"] = o.m_State; j["placed_model"] = o.m_Placed_model; + j["refined_model"] = o.m_Refined_model; j["anomalous_map"] = o.m_Anomalous_map; + j["anomalous_signal"] = o.m_Anomalous_signal; + if(o.modelIsSet()) + j["model"] = o.m_Model; + if(o.spaceGroupIsSet()) + j["space_group"] = o.m_Space_group; + if(o.dMinIsSet()) + j["d_min"] = o.m_D_min; + if(o.isaIsSet()) + j["isa"] = o.m_Isa; j["probe"] = o.m_Probe; if(o.probeSIsSet()) j["probe_s"] = o.m_Probe_s; @@ -270,7 +307,29 @@ void from_json(const nlohmann::json& j, Rugnux_live_status& o) { j.at("state").get_to(o.m_State); j.at("placed_model").get_to(o.m_Placed_model); + j.at("refined_model").get_to(o.m_Refined_model); j.at("anomalous_map").get_to(o.m_Anomalous_map); + j.at("anomalous_signal").get_to(o.m_Anomalous_signal); + if(j.find("model") != j.end()) + { + j.at("model").get_to(o.m_Model); + o.m_ModelIsSet = true; + } + if(j.find("space_group") != j.end()) + { + j.at("space_group").get_to(o.m_Space_group); + o.m_Space_groupIsSet = true; + } + if(j.find("d_min") != j.end()) + { + j.at("d_min").get_to(o.m_D_min); + o.m_D_minIsSet = true; + } + if(j.find("isa") != j.end()) + { + j.at("isa").get_to(o.m_Isa); + o.m_IsaIsSet = true; + } j.at("probe").get_to(o.m_Probe); if(j.find("probe_s") != j.end()) { @@ -340,6 +399,14 @@ void Rugnux_live_status::setPlacedModel(bool const value) { m_Placed_model = value; } +bool Rugnux_live_status::isRefinedModel() const +{ + return m_Refined_model; +} +void Rugnux_live_status::setRefinedModel(bool const value) +{ + m_Refined_model = value; +} bool Rugnux_live_status::isAnomalousMap() const { return m_Anomalous_map; @@ -348,6 +415,82 @@ void Rugnux_live_status::setAnomalousMap(bool const value) { m_Anomalous_map = value; } +bool Rugnux_live_status::isAnomalousSignal() const +{ + return m_Anomalous_signal; +} +void Rugnux_live_status::setAnomalousSignal(bool const value) +{ + m_Anomalous_signal = value; +} +org::openapitools::server::model::Rugnux_live_model Rugnux_live_status::getModel() const +{ + return m_Model; +} +void Rugnux_live_status::setModel(org::openapitools::server::model::Rugnux_live_model const& value) +{ + m_Model = value; + m_ModelIsSet = true; +} +bool Rugnux_live_status::modelIsSet() const +{ + return m_ModelIsSet; +} +void Rugnux_live_status::unsetModel() +{ + m_ModelIsSet = false; +} +std::string Rugnux_live_status::getSpaceGroup() const +{ + return m_Space_group; +} +void Rugnux_live_status::setSpaceGroup(std::string const& value) +{ + m_Space_group = value; + m_Space_groupIsSet = true; +} +bool Rugnux_live_status::spaceGroupIsSet() const +{ + return m_Space_groupIsSet; +} +void Rugnux_live_status::unsetSpace_group() +{ + m_Space_groupIsSet = false; +} +double Rugnux_live_status::getDMin() const +{ + return m_D_min; +} +void Rugnux_live_status::setDMin(double const value) +{ + m_D_min = value; + m_D_minIsSet = true; +} +bool Rugnux_live_status::dMinIsSet() const +{ + return m_D_minIsSet; +} +void Rugnux_live_status::unsetD_min() +{ + m_D_minIsSet = false; +} +double Rugnux_live_status::getIsa() const +{ + return m_Isa; +} +void Rugnux_live_status::setIsa(double const value) +{ + m_Isa = value; + m_IsaIsSet = true; +} +bool Rugnux_live_status::isaIsSet() const +{ + return m_IsaIsSet; +} +void Rugnux_live_status::unsetIsa() +{ + m_IsaIsSet = false; +} std::string Rugnux_live_status::getProbe() const { return m_Probe; diff --git a/broker/gen/model/Rugnux_live_status.h b/broker/gen/model/Rugnux_live_status.h index 2dd4d359c..5bc63f942 100644 --- a/broker/gen/model/Rugnux_live_status.h +++ b/broker/gen/model/Rugnux_live_status.h @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). @@ -21,6 +21,7 @@ #include "Rugnux_summary_row.h" #include +#include "Rugnux_live_model.h" #include "Rugnux_live_step.h" #include #include @@ -72,11 +73,49 @@ public: bool isPlacedModel() const; void setPlacedModel(bool const value); /// + /// The run refined the placed model: `/rugnux/model.cif` and `/rugnux/map.ccp4` serve the refined model and its maps unless asked for `stage=placed`. + /// + bool isRefinedModel() const; + void setRefinedModel(bool const value); + /// /// The merge kept the Bijvoet pairs, so with the placed model there is an anomalous difference map (`/rugnux/map.ccp4?type=anom`). /// bool isAnomalousMap() const; void setAnomalousMap(bool const value); /// + /// The merged data carry usable anomalous signal (the summary's \"Anomalous\" row says so) + /// + bool isAnomalousSignal() const; + void setAnomalousSignal(bool const value); + /// + /// + /// + org::openapitools::server::model::Rugnux_live_model getModel() const; + void setModel(org::openapitools::server::model::Rugnux_live_model const& value); + bool modelIsSet() const; + void unsetModel(); + /// + /// Space group of the result (the summary's \"Space group\" row); absent until the run is over + /// + std::string getSpaceGroup() const; + void setSpaceGroup(std::string const& value); + bool spaceGroupIsSet() const; + void unsetSpace_group(); + /// + /// High-resolution limit of the merge, in Angstrom; absent until the run is over, or without a merge + /// + double getDMin() const; + void setDMin(double const value); + bool dMinIsSet() const; + void unsetD_min(); + /// + /// ISa of the error model; absent until the run is over, or where it was not determined + /// + double getIsa() const; + void setIsa(double const value); + bool isaIsSet() const; + void unsetIsa(); + /// /// Answer of the early lattice probe on the first 60 degrees; empty until it answers /// std::string getProbe() const; @@ -190,8 +229,20 @@ protected: bool m_Placed_model; + bool m_Refined_model; + bool m_Anomalous_map; + bool m_Anomalous_signal; + + org::openapitools::server::model::Rugnux_live_model m_Model; + bool m_ModelIsSet; + std::string m_Space_group; + bool m_Space_groupIsSet; + double m_D_min; + bool m_D_minIsSet; + double m_Isa; + bool m_IsaIsSet; std::string m_Probe; double m_Probe_s; diff --git a/broker/gen/model/Rugnux_live_step.cpp b/broker/gen/model/Rugnux_live_step.cpp index c1dd2b171..3db9278a6 100644 --- a/broker/gen/model/Rugnux_live_step.cpp +++ b/broker/gen/model/Rugnux_live_step.cpp @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Rugnux_live_step.h b/broker/gen/model/Rugnux_live_step.h index 7f4d1fe91..f60d957c7 100644 --- a/broker/gen/model/Rugnux_live_step.h +++ b/broker/gen/model/Rugnux_live_step.h @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Rugnux_settings.cpp b/broker/gen/model/Rugnux_settings.cpp index f70739811..65483eb9c 100644 --- a/broker/gen/model/Rugnux_settings.cpp +++ b/broker/gen/model/Rugnux_settings.cpp @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Rugnux_settings.h b/broker/gen/model/Rugnux_settings.h index 252dabe36..8a035fbfa 100644 --- a/broker/gen/model/Rugnux_settings.h +++ b/broker/gen/model/Rugnux_settings.h @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Rugnux_status.cpp b/broker/gen/model/Rugnux_status.cpp index f7624b0bc..31e566564 100644 --- a/broker/gen/model/Rugnux_status.cpp +++ b/broker/gen/model/Rugnux_status.cpp @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Rugnux_status.h b/broker/gen/model/Rugnux_status.h index cc187fbec..662f0c0fb 100644 --- a/broker/gen/model/Rugnux_status.h +++ b/broker/gen/model/Rugnux_status.h @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Rugnux_summary_row.cpp b/broker/gen/model/Rugnux_summary_row.cpp index 076d5e5cf..8db2fdf5f 100644 --- a/broker/gen/model/Rugnux_summary_row.cpp +++ b/broker/gen/model/Rugnux_summary_row.cpp @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Rugnux_summary_row.h b/broker/gen/model/Rugnux_summary_row.h index 0f933b8ec..cc9c31334 100644 --- a/broker/gen/model/Rugnux_summary_row.h +++ b/broker/gen/model/Rugnux_summary_row.h @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Scan_result.cpp b/broker/gen/model/Scan_result.cpp index b8f5b103e..bbfb6bc51 100644 --- a/broker/gen/model/Scan_result.cpp +++ b/broker/gen/model/Scan_result.cpp @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Scan_result.h b/broker/gen/model/Scan_result.h index a0bcc97e8..b57362156 100644 --- a/broker/gen/model/Scan_result.h +++ b/broker/gen/model/Scan_result.h @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Scan_result_images_inner.cpp b/broker/gen/model/Scan_result_images_inner.cpp index f4415e936..5d3683bd3 100644 --- a/broker/gen/model/Scan_result_images_inner.cpp +++ b/broker/gen/model/Scan_result_images_inner.cpp @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Scan_result_images_inner.h b/broker/gen/model/Scan_result_images_inner.h index e5a2748df..d0e019b56 100644 --- a/broker/gen/model/Scan_result_images_inner.h +++ b/broker/gen/model/Scan_result_images_inner.h @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Spot_finding_settings.cpp b/broker/gen/model/Spot_finding_settings.cpp index 72fb87a78..77f48415f 100644 --- a/broker/gen/model/Spot_finding_settings.cpp +++ b/broker/gen/model/Spot_finding_settings.cpp @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Spot_finding_settings.h b/broker/gen/model/Spot_finding_settings.h index 28f4e111a..9a0d4bbcd 100644 --- a/broker/gen/model/Spot_finding_settings.h +++ b/broker/gen/model/Spot_finding_settings.h @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Standard_detector_geometry.cpp b/broker/gen/model/Standard_detector_geometry.cpp index 36a08aab6..bd19b4e97 100644 --- a/broker/gen/model/Standard_detector_geometry.cpp +++ b/broker/gen/model/Standard_detector_geometry.cpp @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Standard_detector_geometry.h b/broker/gen/model/Standard_detector_geometry.h index ba628f8f0..1870ed6d3 100644 --- a/broker/gen/model/Standard_detector_geometry.h +++ b/broker/gen/model/Standard_detector_geometry.h @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Tcp_settings.cpp b/broker/gen/model/Tcp_settings.cpp index 907ffd0ec..1332d13e9 100644 --- a/broker/gen/model/Tcp_settings.cpp +++ b/broker/gen/model/Tcp_settings.cpp @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Tcp_settings.h b/broker/gen/model/Tcp_settings.h index 6f231af30..993ee4c7a 100644 --- a/broker/gen/model/Tcp_settings.h +++ b/broker/gen/model/Tcp_settings.h @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Unit_cell.cpp b/broker/gen/model/Unit_cell.cpp index 4bb1cf7cb..1406dcee7 100644 --- a/broker/gen/model/Unit_cell.cpp +++ b/broker/gen/model/Unit_cell.cpp @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Unit_cell.h b/broker/gen/model/Unit_cell.h index 08ae72199..66da75868 100644 --- a/broker/gen/model/Unit_cell.h +++ b/broker/gen/model/Unit_cell.h @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Zeromq_metadata_settings.cpp b/broker/gen/model/Zeromq_metadata_settings.cpp index cee6e9997..f122f102a 100644 --- a/broker/gen/model/Zeromq_metadata_settings.cpp +++ b/broker/gen/model/Zeromq_metadata_settings.cpp @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Zeromq_metadata_settings.h b/broker/gen/model/Zeromq_metadata_settings.h index 67c223389..1ab0704cc 100644 --- a/broker/gen/model/Zeromq_metadata_settings.h +++ b/broker/gen/model/Zeromq_metadata_settings.h @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Zeromq_preview_settings.cpp b/broker/gen/model/Zeromq_preview_settings.cpp index af833b377..b8d423fbd 100644 --- a/broker/gen/model/Zeromq_preview_settings.cpp +++ b/broker/gen/model/Zeromq_preview_settings.cpp @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Zeromq_preview_settings.h b/broker/gen/model/Zeromq_preview_settings.h index 60c759fff..c6bde3c38 100644 --- a/broker/gen/model/Zeromq_preview_settings.h +++ b/broker/gen/model/Zeromq_preview_settings.h @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Zeromq_settings.cpp b/broker/gen/model/Zeromq_settings.cpp index 5cf921e73..9f03f3680 100644 --- a/broker/gen/model/Zeromq_settings.cpp +++ b/broker/gen/model/Zeromq_settings.cpp @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/gen/model/Zeromq_settings.h b/broker/gen/model/Zeromq_settings.h index 0a7e25fc9..c2015aba8 100644 --- a/broker/gen/model/Zeromq_settings.h +++ b/broker/gen/model/Zeromq_settings.h @@ -2,7 +2,7 @@ * Jungfraujoch * API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates. # License Clarification While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing. This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL. This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. * -* The version of the OpenAPI document: 1.0.0-rc.179 +* The version of the OpenAPI document: 1.0.0-rc.180 * Contact: filip.leonarski@psi.ch * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/broker/jfjoch_api.yaml b/broker/jfjoch_api.yaml index ea8c7b01d..05174810f 100644 --- a/broker/jfjoch_api.yaml +++ b/broker/jfjoch_api.yaml @@ -22,7 +22,7 @@ info: requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms. - version: 1.0.0-rc.179 + version: 1.0.0-rc.180 contact: name: Filip Leonarski (Paul Scherrer Institute) email: filip.leonarski@psi.ch @@ -2767,6 +2767,192 @@ components: type: string value: type: string + rugnux_live_model: + type: object + description: | + What the run made of the model it was given, as the report's MODEL VALIDATION section states it. The + R-factors here are those of the placed model with its own coordinates and B factors; what refinement made + of it is in `refinement`. A value that is absent was not computed - the model was not placed, or not by + molecular replacement. + required: + - placement + - model_name + - predicted + - reason + - mr_decision + - mr_space_group + - anomalous_site + properties: + placement: + type: string + description: RIGID_BODY (the model fits where it is), MR (molecular replacement placed it) or NOT_PLACED + model_name: + type: string + predicted: + type: boolean + description: Searched for as a predicted model + reason: + type: string + description: Why the model could not be searched for or validated; empty otherwise + r_work: + type: number + format: double + r_free: + type: number + format: double + cc_model: + type: number + format: double + description: Correlation of the merged intensities with the placed model's, over all reflections + fit_sigma: + type: number + format: double + description: How far R-work stands below that of the same model in random orientations, in standard deviations + map_atom_sigma: + type: number + format: double + description: Mean 2mFo-DFc value at the atom centres, in map sigma + rigid_body_angle_deg: + type: number + format: double + rigid_body_shift_A: + type: number + format: double + mr_decision: + type: string + description: Molecular replacement's decision (AGREES, ENANTIOMORPH, SPACE_GROUP, TWIN_SUBGROUP, or why it placed nothing); empty where it did not run + mr_space_group: + type: string + description: The group molecular replacement placed the model in; empty where it placed none + copies: + type: integer + format: int64 + description: Copies placed by molecular replacement + tf_z: + type: number + format: double + description: Translation-function Z-score, the highest of the copies' + rf_z: + type: number + format: double + description: Rotation-function Z-score of the first copy's orientation + llg_z: + type: number + format: double + description: Likelihood Z-score after the rigid body, where a copy's translation function did not stand out + mr_d_min: + type: number + format: double + description: High-resolution limit of the molecular-replacement search, in Angstrom + anomalous_site: + type: string + description: Atom with the strongest anomalous difference density, e.g. "SG CYS A7"; empty where there is no anomalous map + anomalous_site_sigma: + type: number + format: double + description: Anomalous difference density at that atom, in map sigma + refinement: + $ref: '#/components/schemas/rugnux_live_refinement' + rugnux_live_refinement: + type: object + description: | + The placed model refined against the merge it was placed on, as the report's REFINE_ keys state it. Set + where a placed model was refined or its refinement failed; absent where the model was not placed or + refinement was skipped. On a machine without a GPU it runs on the CPU, slower, and the run's deadline + or cancel can cut it. + required: + - performed + - cancelled + - reason + - on_gpu + - seconds + - blob_count + - blobs + properties: + performed: + type: boolean + description: Refinement ran; false with `reason` where it failed + cancelled: + type: boolean + description: | + The deadline or a cancel cut the refinement short: the weight trials that ran were chosen among, the + rest left out (cut before the first, the model is the placement's) + reason: + type: string + description: Why refinement did not run to the end; empty otherwise + on_gpu: + type: boolean + seconds: + type: number + format: double + description: Wall time of the refinement + r_work: + type: number + format: double + description: R-work of the refined model (after the restrained stage, else after the rigid body and grouped B) + r_free: + type: number + format: double + description: R-free of the refined model, on the same reflections as `r_work` + rmsd_bonds_A: + type: number + format: double + description: RMS deviation of the bond lengths from the dictionary, where the restrained stage ran + rmsd_angles_deg: + type: number + format: double + description: RMS deviation of the bond angles from the dictionary, where the restrained stage ran + blob_count: + type: integer + format: int64 + description: Unexplained blobs of the refined model's mFo-DFc map (above 3 sigma, peaking above 4) + blobs: + type: array + description: The strongest blobs, at most 50, strongest first + items: + $ref: '#/components/schemas/rugnux_live_blob' + rugnux_live_blob: + type: object + description: | + A blob of positive mFo-DFc density the refined model leaves unexplained, with its likely reading: a rule on + what is measured, to point a person at the density - not an identification. + required: + - kind + - x + - y + - z + - peak_sigma + - volume_A3 + - nearest_atom + properties: + kind: + type: string + enum: [WATER, ION, LIGAND, MODEL_ERROR, UNASSIGNED] + x: + type: number + format: double + description: Centroid, Cartesian Angstrom, in the frame of the refined model (`/rugnux/model.cif`) + y: + type: number + format: double + z: + type: number + format: double + peak_sigma: + type: number + format: double + description: The highest point, in map sigma + volume_A3: + type: number + format: double + description: Volume above 3 sigma, in cubic Angstrom + nearest_atom: + type: string + description: e.g. "OG1 THR A42" + nearest_atom_distance_A: + type: number + format: double + description: Absent where no atom is within 12 Angstrom rugnux_live_status: type: object description: | @@ -2786,7 +2972,9 @@ components: - warnings - probe - placed_model + - refined_model - anomalous_map + - anomalous_signal properties: state: type: string @@ -2796,11 +2984,32 @@ components: description: | The run placed the model: it can be fetched from `/rugnux/model.cif` and its maps from `/rugnux/map.ccp4`. + refined_model: + type: boolean + description: | + The run refined the placed model: `/rugnux/model.cif` and `/rugnux/map.ccp4` serve the refined model and + its maps unless asked for `stage=placed`. anomalous_map: type: boolean description: | The merge kept the Bijvoet pairs, so with the placed model there is an anomalous difference map (`/rugnux/map.ccp4?type=anom`). + anomalous_signal: + type: boolean + description: The merged data carry usable anomalous signal (the summary's "Anomalous" row says so) + model: + $ref: '#/components/schemas/rugnux_live_model' + space_group: + type: string + description: Space group of the result (the summary's "Space group" row); absent until the run is over + d_min: + type: number + format: double + description: High-resolution limit of the merge, in Angstrom; absent until the run is over, or without a merge + isa: + type: number + format: double + description: ISa of the error model; absent until the run is over, or where it was not determined probe: type: string description: Answer of the early lattice probe on the first 60 degrees; empty until it answers @@ -3624,6 +3833,17 @@ paths: The model placed against the data by molecular replacement or validation, as mmCIF - the same text as the `_model.cif` file written beside the data: the data's cell and space group, with the input model's own metadata (entities, sequences, references, authors, software) kept. Kept as long as `/rugnux/status`. + Where the run refined the model, the refined model unless asked for `stage=placed`. + parameters: + - in: query + name: stage + required: false + schema: + type: string + enum: [placed, refined] + description: | + `placed`: the model as placed; `refined`: the model refined (`refined_model` in `/rugnux/status`). + Default: the refined model where there is one, otherwise the placed one. security: - bearerAuth: [] responses: @@ -3634,6 +3854,12 @@ paths: schema: type: string format: binary + "400": + description: Unknown stage + content: + text/plain: + schema: + type: string "401": description: The current dataset is protected and no valid bearer token was presented. content: @@ -3641,7 +3867,7 @@ paths: schema: type: string "404": - description: The last rugnux live run placed no model + description: The last rugnux live run placed no model, or (`stage=refined`) refined none /rugnux/map.ccp4: get: summary: Get an electron-density map of the last rugnux live run @@ -3649,7 +3875,9 @@ paths: The map of the placed model (`/rugnux/model.cif`) in CCP4 format (mode 2, float), made from the map coefficients written to `_maps.mtz` (FWT/PHWT, DELFWT/PHDELWT, ANOM/PHANOM). It covers one unit cell centred on the model - along an axis where the model reaches further than the cell, the model plus 5 A instead - sampled every d_min/3; the mean and - RMS in its header are those of the unit cell, so contour levels in sigma are the usual ones. + RMS in its header are those of the unit cell, so contour levels in sigma are the usual ones. Where the run + refined the model, the 2mFo-DFc and mFo-DFc maps are the refined model's unless asked for `stage=placed`; + the anomalous map stays on the placed model's phases. parameters: - in: query name: type @@ -3662,6 +3890,15 @@ paths: `2fofc`: the 2mFo-DFc map; `fofc`: the mFo-DFc difference map; `anom`: the anomalous difference map, (F(+) - F(-)) on the model phases less 90 degrees, where the merge kept the Bijvoet pairs (`anomalous_map` in `/rugnux/status`) + - in: query + name: stage + required: false + schema: + type: string + enum: [placed, refined] + description: | + `placed`: the model as placed; `refined`: the model refined (`refined_model` in `/rugnux/status`). + Default: the refined model where there is one, otherwise the placed one. security: - bearerAuth: [] responses: @@ -3673,7 +3910,7 @@ paths: type: string format: binary "400": - description: Unknown map type + description: Unknown map type or stage content: text/plain: schema: @@ -3685,7 +3922,7 @@ paths: schema: type: string "404": - description: The last rugnux live run placed no model or made no maps, or (`anom`) has no Bijvoet pairs + description: The last rugnux live run placed no model or made no maps, or (`anom`) has no Bijvoet pairs, or (`stage=refined`) refined none /config/zeromq_preview: put: summary: Set ZeroMQ preview settings diff --git a/broker/redoc-static.html b/broker/redoc-static.html index 04e0ab299..e315e3020 100644 --- a/broker/redoc-static.html +++ b/broker/redoc-static.html @@ -426,7 +426,7 @@ This format doesn't transmit information about X-axis, only values, so it i 55.627 l 55.6165,55.627 -231.245496,231.24803 c -127.185,127.1864 -231.5279,231.248 -231.873,231.248 -0.3451,0 -104.688, -104.0616 -231.873,-231.248 z - " fill="currentColor">

Jungfraujoch (1.0.0-rc.179)

Download OpenAPI specification:

Filip Leonarski (Paul Scherrer Institute): filip.leonarski@psi.ch License: GPL-3.0

API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). + " fill="currentColor">

Jungfraujoch (1.0.0-rc.180)

Download OpenAPI specification:

Filip Leonarski (Paul Scherrer Institute): filip.leonarski@psi.ch License: GPL-3.0

API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. Jungfraujoch uses FPGA boards to acquire data at high data rates.

License Clarification

While this API definition is licensed under GPL-3.0, the GPL copyleft provisions do not apply @@ -864,24 +864,32 @@ and validation of every following rugnux live collection, until it is removed wi

Authorizations:
bearerAuth

Responses

Response samples

Content type
application/json
{
  • "state": "Idle",
  • "placed_model": true,
  • "anomalous_map": true,
  • "probe": "string",
  • "probe_s": 0.1,
  • "start_to_first_image_s": 0.1,
  • "message": "string",
  • "images_expected": 0,
  • "expected_collection_s": 0.1,
  • "images_received": 0,
  • "elapsed_s": 0.1,
  • "step_progress": 1,
  • "steps": [
    ],
  • "last_image_s": 0.1,
  • "cut": "string",
  • "cut_s": 0.1,
  • "last_image_to_written_s": 0.1,
  • "verdict": "string",
  • "verdict_text": "string",
  • "summary": [
    ],
  • "warnings": [
    ]
}

Get the model as placed by the last rugnux live run

The model placed against the data by molecular replacement or validation, as mmCIF - the same text as the +

http://localhost:5232/rugnux/status

Response samples

Content type
application/json
{
  • "state": "Idle",
  • "placed_model": true,
  • "refined_model": true,
  • "anomalous_map": true,
  • "anomalous_signal": true,
  • "model": {
    },
  • "space_group": "string",
  • "d_min": 0.1,
  • "isa": 0.1,
  • "probe": "string",
  • "probe_s": 0.1,
  • "start_to_first_image_s": 0.1,
  • "message": "string",
  • "images_expected": 0,
  • "expected_collection_s": 0.1,
  • "images_received": 0,
  • "elapsed_s": 0.1,
  • "step_progress": 1,
  • "steps": [
    ],
  • "last_image_s": 0.1,
  • "cut": "string",
  • "cut_s": 0.1,
  • "last_image_to_written_s": 0.1,
  • "verdict": "string",
  • "verdict_text": "string",
  • "summary": [
    ],
  • "warnings": [
    ]
}

Get the model as placed by the last rugnux live run

The model placed against the data by molecular replacement or validation, as mmCIF - the same text as the _model.cif file written beside the data: the data's cell and space group, with the input model's own -metadata (entities, sequences, references, authors, software) kept. Kept as long as /rugnux/status.

-
Authorizations:
bearerAuth

Responses

Authorizations:
bearerAuth
query Parameters
stage
string
Enum: "placed" "refined"

placed: the model as placed; refined: the model refined (refined_model in /rugnux/status). +Default: the refined model where there is one, otherwise the placed one.

+

Responses

Get an electron-density map of the last rugnux live run

The map of the placed model (/rugnux/model.cif) in CCP4 format (mode 2, float), made from the map coefficients written to _maps.mtz (FWT/PHWT, DELFWT/PHDELWT, ANOM/PHANOM). It covers one unit cell centred on the model - along an axis where the model reaches further than the cell, the model plus 5 A instead - sampled every d_min/3; the mean and -RMS in its header are those of the unit cell, so contour levels in sigma are the usual ones.

-
Authorizations:
bearerAuth
query Parameters
type
string
Default: "2fofc"
Enum: "2fofc" "fofc" "anom"

2fofc: the 2mFo-DFc map; fofc: the mFo-DFc difference map; anom: the anomalous difference map, +RMS in its header are those of the unit cell, so contour levels in sigma are the usual ones. Where the run +refined the model, the 2mFo-DFc and mFo-DFc maps are the refined model's unless asked for stage=placed; +the anomalous map stays on the placed model's phases.

+
Authorizations:
bearerAuth
query Parameters
type
string
Default: "2fofc"
Enum: "2fofc" "fofc" "anom"

2fofc: the 2mFo-DFc map; fofc: the mFo-DFc difference map; anom: the anomalous difference map, (F(+) - F(-)) on the model phases less 90 degrees, where the merge kept the Bijvoet pairs (anomalous_map in /rugnux/status)

+
stage
string
Enum: "placed" "refined"

placed: the model as placed; refined: the model refined (refined_model in /rugnux/status). +Default: the refined model where there is one, otherwise the placed one.

Responses

Set ZeroMQ preview settings

Jungfraujoch can generate preview message stream on ZeroMQ SUB socket. Here settings of the socket can be adjusted. @@ -1115,7 +1123,7 @@ then image might be replaced in the buffer between calling /images and /image.cb

+ + + +
+ Jungfraujoch + + + +
+ +
+ +
+
+ A diffraction image beside the placed model in its electron density, over the timeline of the live analysis: the detector lane of an 18 s collection and the Rugnux lane ending 4.9 s after the last image + +
Cytochrome C at SLS X10SA: 1800 images at 100 Hz, merged and the AlphaFold model placed 4.9 s after the last image
+
+
+

Paul Scherrer Institute · open source

+

From the detector to merged data and structures.

+

Software for X-ray diffraction data: Rugnux takes a stored + dataset from the images to merged data with one command, and with a model on to a + structure and maps; the Viewer shows what is in it, and + Jungfraujoch acquires it from the detector at full speed.

+

All three are in user operation at the MX beamlines of the Swiss Light Source SLS 2.0.

+ +

rugnux <diffraction image file>rugnux <diffraction image file> <CIF/PDB model file>

+
+
+ +
+
+ +
+

Data processing

+

Rugnux

+

Takes a macromolecular diffraction dataset, a synchrotron rotation sweep or XFEL serial stills, from the + images to merged data: spot finding, indexing, integration, scaling and merging, with the + space group, cell and resolution decided from the data and a report that says on what + evidence. Writes .mtz, .cif and .hkl for the programs + that come next. Given an atomic model it goes on to a structure: the model is placed + (as a rigid body or by molecular replacement) and refined, and the maps and the unexplained + difference-density blobs are written beside it. Validated on public data: + over 200 rotation datasets and + eleven XFEL serial datasets.

+

Linux · macOS · Windows · command line · fast on an NVIDIA GPU, works without one

+ +
+ +
+

Desktop application

+

Jungfraujoch Viewer

+

Shows what is in a dataset: every image with its spots, predictions and resolution rings, + per-image statistics over the sweep, grid-scan maps, and the same processing pipeline as + Rugnux, run from a settings panel on the open file. Follows a live collection from a running + Jungfraujoch broker.

+

Linux · macOS · Windows · Qt 6

+ +
+ +
+

Data acquisition

+

Jungfraujoch

+

The acquisition and real-time analysis system for the PSI JUNGFRAU and EIGER detectors, + and for DECTRIS detectors through their control unit: an FPGA and GPU pipeline that takes + the detector's frames at full rate, analyses them on the fly, streams them to the NXmx HDF5 + writer and serves a web interface and REST API to the beamline.

+

Linux servers · AMD Alveo U55C FPGA · NVIDIA GPUs

+ +
+ +
+
+ +
+
+

Download

+

Pre-built, signed where the platform asks for it, nothing to install beside them. +

+
+ +
+

Rugnux

+

One self-contained executable. Unpack the archive into a directory of its own and run + bin/rugnux; no CUDA toolkit, no Qt, no service. On a machine with an NVIDIA GPU + take the GPU build, which also runs without one. Details, packages and building from source.

+ {{downloads:rugnux}} +
+ +
+

Jungfraujoch Viewer

+

A desktop application with the Qt runtime included: a portable archive on Linux, a + notarized disk image on macOS, an installer on Windows. Details and building from source.

+ {{downloads:viewer}} +
+ +
+

Jungfraujoch, the acquisition system

+

Installed on the beamline's Linux servers from the RPM and APT + repositories (jfjoch, jfjoch-writer, jfjoch-driver-dkms, + jfjoch-viewer, rugnux), with the FPGA firmware and the writer's + packages attached to every release. + Deployment is the step-by-step guide; Release contents says what each package needs on the machine.

+
+
+ +
+

Free to use, in academia and industry

+

Rugnux, the viewer and the Jungfraujoch services are free software under the + GNU General Public License v3; the FPGA design is released under the + CERN Open Hardware Licence v2, strongly reciprocal. Both let + anyone use, study and modify the software and the hardware design at no charge, commercial use + included; modified versions that are distributed must be released under the same licence. The released binaries bundle third-party components under GPL-compatible licences, and the + CUDA builds the NVIDIA CUDA runtime under NVIDIA's EULA: see the + third-party notices.

+

The software builds on many existing algorithms, reimplemented (see the + acknowledgements), many of them moved to the GPU and made faster + across a range of computing configurations; it was developed with the help of generative AI + (Claude Opus, Anthropic).

+
+ +
+ + + + + + + diff --git a/docs/landing/landing.css b/docs/landing/landing.css new file mode 100644 index 000000000..ce06d85b2 --- /dev/null +++ b/docs/landing/landing.css @@ -0,0 +1,388 @@ +/* The front page (docs/landing/index.html). Self-contained: system fonts, no framework, one + palette per theme. The download blocks use the same jfj-dl markup as the Sphinx download pages + (docs/_ext/jfjoch_downloads.py) and are styled here for this page. */ + +:root { + --bg: #fbfbfd; + --bg-raised: #ffffff; + --bg-tint: #eef0fa; + --fg: #1b1d2a; + --fg-muted: #5b6072; + --line: rgba(27, 29, 42, 0.12); + --primary: #3949ab; + --primary-strong: #2c3a8f; + --primary-soft: rgba(57, 73, 171, 0.1); + --on-primary: #ffffff; + --accent: #e9a23b; + --accent-soft: rgba(233, 162, 59, 0.16); + --shadow: 0 1px 2px rgba(27, 29, 42, 0.06), 0 8px 24px rgba(27, 29, 42, 0.06); +} + +@media (prefers-color-scheme: dark) { + :root:not([data-theme="light"]) { + --bg: #11131c; + --bg-raised: #181b27; + --bg-tint: #1d2130; + --fg: #e8e9f1; + --fg-muted: #9ea3b8; + --line: rgba(232, 233, 241, 0.12); + --primary: #8e9dff; + --primary-strong: #aab5ff; + --primary-soft: rgba(142, 157, 255, 0.14); + --on-primary: #0d1030; + --accent: #f0b65b; + --accent-soft: rgba(240, 182, 91, 0.16); + --shadow: 0 1px 2px rgba(0, 0, 0, 0.4), 0 8px 24px rgba(0, 0, 0, 0.35); + } +} + +:root[data-theme="dark"] { + --bg: #11131c; + --bg-raised: #181b27; + --bg-tint: #1d2130; + --fg: #e8e9f1; + --fg-muted: #9ea3b8; + --line: rgba(232, 233, 241, 0.12); + --primary: #8e9dff; + --primary-strong: #aab5ff; + --primary-soft: rgba(142, 157, 255, 0.14); + --on-primary: #0d1030; + --accent: #f0b65b; + --accent-soft: rgba(240, 182, 91, 0.16); + --shadow: 0 1px 2px rgba(0, 0, 0, 0.4), 0 8px 24px rgba(0, 0, 0, 0.35); +} + +* { box-sizing: border-box; } + +html { scroll-behavior: smooth; } + +body { + margin: 0; + background: var(--bg); + color: var(--fg); + font: 16px/1.55 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; + -webkit-font-smoothing: antialiased; +} + +a { color: var(--primary); text-decoration: none; } +a:hover { color: var(--primary-strong); text-decoration: underline; } + +code { + font-family: "SFMono-Regular", Menlo, Consolas, "Roboto Mono", monospace; + font-size: 0.92em; + background: var(--primary-soft); + padding: 0.1em 0.35em; + border-radius: 4px; +} + +h1, h2, h3 { line-height: 1.2; letter-spacing: -0.01em; margin: 0; } + +main > section, .top, .foot { + max-width: 1120px; + margin: 0 auto; + padding: 0 24px; +} + +/* ---- header ---------------------------------------------------------------------------------- */ + +.top { + display: flex; + align-items: center; + gap: 24px; + padding-top: 18px; + padding-bottom: 18px; +} + +.brand { + display: inline-flex; + align-items: center; + gap: 10px; + color: var(--fg); + font-weight: 600; + font-size: 1.05em; +} +.brand:hover { text-decoration: none; } +.brand img { display: block; } + +.top__nav { display: flex; gap: 22px; margin-left: auto; font-weight: 500; } +.top__nav a { color: var(--fg-muted); } +.top__nav a:hover { color: var(--primary); text-decoration: none; } + +.theme-toggle { + display: inline-flex; + align-items: center; + justify-content: center; + width: 38px; height: 38px; + border: 1px solid var(--line); + border-radius: 50%; + background: var(--bg-raised); + color: var(--fg-muted); + cursor: pointer; +} +.theme-toggle:hover { color: var(--primary); border-color: var(--primary); } + +/* The PSI logo is black only, so the dark theme shows it inverted (as the viewer does). */ +.psi-logo { display: inline-flex; } +.psi-logo img { display: block; } +:root[data-theme="dark"] .psi-logo img { filter: invert(1); } +@media (prefers-color-scheme: dark) { + :root:not([data-theme="light"]) .psi-logo img { filter: invert(1); } +} +.theme-toggle__moon { display: none; } +:root[data-theme="dark"] .theme-toggle__sun { display: none; } +:root[data-theme="dark"] .theme-toggle__moon { display: block; } +@media (prefers-color-scheme: dark) { + :root:not([data-theme="light"]) .theme-toggle__sun { display: none; } + :root:not([data-theme="light"]) .theme-toggle__moon { display: block; } +} + +/* ---- hero ------------------------------------------------------------------------------------ */ + +.hero { + position: relative; + display: grid; + grid-template-columns: minmax(0, 1fr) minmax(0, 560px); + align-items: center; + gap: 32px; + padding-top: 56px; + padding-bottom: 64px; +} + +.hero__art { + grid-column: 2; + grid-row: 1; + width: 100%; + max-width: 560px; + justify-self: end; + margin: 0; +} +/* A detector frame beside the placed model in its density, over the live analysis' timeline, drawn + on the page's own colours: one file per theme, shown by the same rules that pick the theme's tokens. */ +.hero__art img { + display: block; + width: 100%; + height: auto; +} +.hero__art .hero__art-dark { display: none; } +:root[data-theme="dark"] .hero__art .hero__art-light { display: none; } +:root[data-theme="dark"] .hero__art .hero__art-dark { display: block; } +@media (prefers-color-scheme: dark) { + :root:not([data-theme="light"]) .hero__art .hero__art-light { display: none; } + :root:not([data-theme="light"]) .hero__art .hero__art-dark { display: block; } +} +.hero__art figcaption { + margin-top: 10px; + font-size: 0.78em; + color: var(--fg-muted); + text-align: right; +} + +.hero__text { grid-column: 1; grid-row: 1; max-width: 600px; } + +.eyebrow { + margin: 0 0 14px; + font-size: 0.78em; + font-weight: 700; + letter-spacing: 0.1em; + text-transform: uppercase; + color: var(--primary); +} + +.hero h1 { + font-size: clamp(2.1rem, 4.6vw, 3.4rem); + font-weight: 700; + letter-spacing: -0.025em; + margin-bottom: 18px; +} + +.lede { font-size: 1.2em; color: var(--fg-muted); margin: 0 0 14px; } +.hero__ops { color: var(--fg-muted); margin: 0 0 26px; } +.lede strong { color: var(--fg); font-weight: 600; } + +.hero__actions { display: flex; flex-wrap: wrap; gap: 12px; margin-bottom: 26px; } + +.btn { + display: inline-block; + padding: 11px 20px; + border-radius: 8px; + font-weight: 600; + border: 1px solid transparent; + transition: transform 0.12s, box-shadow 0.12s, background 0.12s; +} +.btn:hover { text-decoration: none; transform: translateY(-1px); } +.btn--primary { background: var(--primary); color: var(--on-primary); box-shadow: var(--shadow); } +.btn--primary:hover { background: var(--primary-strong); color: var(--on-primary); } +.btn--ghost { border-color: var(--line); color: var(--fg); background: var(--bg-raised); } +.btn--ghost:hover { border-color: var(--primary); color: var(--primary); } + +.hero__run { + display: flex; + flex-direction: column; + align-items: flex-start; + gap: 8px; + margin: 0; + font-size: 0.95em; +} +.hero__run code { font-size: 1em; padding: 0.35em 0.7em; max-width: 100%; overflow-wrap: anywhere; } + +/* ---- programs -------------------------------------------------------------------------------- */ + +.programs { padding-bottom: 56px; } + +.programs__grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); + gap: 20px; +} + +.program { + display: flex; + flex-direction: column; + padding: 24px 24px 20px; + border: 1px solid var(--line); + border-radius: 14px; + background: var(--bg-raised); + box-shadow: var(--shadow); +} +.program__kicker { + margin: 0 0 8px; + font-size: 0.74em; + font-weight: 700; + letter-spacing: 0.1em; + text-transform: uppercase; + color: var(--primary); +} +.program h2 { font-size: 1.45em; font-weight: 650; margin-bottom: 12px; } +.program > p:not([class]) { margin: 0 0 14px; color: var(--fg); flex: 1 1 auto; } +.program__meta { margin: 0 0 14px; font-size: 0.82em; color: var(--fg-muted); } +.program__links { + margin: 0; + padding-top: 14px; + border-top: 1px solid var(--line); + display: flex; + flex-wrap: wrap; + gap: 6px 18px; + font-weight: 500; +} +.program__links a:first-child { font-weight: 700; } + +/* ---- download -------------------------------------------------------------------------------- */ + +.download { + padding-top: 48px; + padding-bottom: 24px; + border-top: 1px solid var(--line); +} +.download__head { max-width: 640px; margin-bottom: 28px; } +.download__head h2 { font-size: 2em; font-weight: 700; margin-bottom: 10px; } +.download__head p { margin: 0; color: var(--fg-muted); font-size: 1.05em; } +.download__head [data-os-note]:not(:empty) { color: var(--fg); font-weight: 500; } + +.download__program { margin-bottom: 36px; } +.download__program h3 { font-size: 1.3em; font-weight: 650; margin-bottom: 8px; } +.download__program > p { margin: 0 0 16px; max-width: 720px; color: var(--fg-muted); } +.download__program--text > p { color: var(--fg); } + +.jfj-dl__release { margin: 0 0 14px; font-size: 0.95em; color: var(--fg-muted); } +.jfj-dl__release strong { color: var(--fg); } + +.jfj-dl__grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); + gap: 16px; +} + +.jfj-dl__card { + position: relative; + padding: 18px 18px 8px; + border: 1px solid var(--line); + border-radius: 12px; + background: var(--bg-raised); +} +.jfj-dl__card.is-yours { + border-color: var(--accent); + box-shadow: 0 0 0 3px var(--accent-soft), var(--shadow); +} +.jfj-dl__card.is-yours::after { + content: "Your system"; + position: absolute; + top: -11px; right: 14px; + padding: 2px 10px; + border-radius: 999px; + background: var(--accent); + color: #1b1d2a; + font-size: 0.72em; + font-weight: 700; + letter-spacing: 0.04em; +} + +.jfj-dl__platform { font-size: 1.1em; font-weight: 650; margin-bottom: 12px; } + +a.jfj-dl__btn { + display: block; + margin-bottom: 10px; + padding: 10px 14px; + border: 1px solid var(--primary); + border-radius: 8px; + background: var(--primary); + color: var(--on-primary); + font-weight: 600; + line-height: 1.3; + transition: background 0.12s, box-shadow 0.12s; +} +a.jfj-dl__btn:hover { text-decoration: none; background: var(--primary-strong); box-shadow: var(--shadow); color: var(--on-primary); } +a.jfj-dl__btn--secondary { background: transparent; color: var(--primary); } +a.jfj-dl__btn--secondary:hover { background: var(--primary-soft); color: var(--primary-strong); } +a.jfj-dl__btn--missing, a.jfj-dl__btn--missing:hover { + background: transparent; + border-style: dashed; + border-color: var(--line); + color: var(--fg-muted); + box-shadow: none; + cursor: default; +} +.jfj-dl__file { + display: block; + margin-top: 2px; + font-family: "SFMono-Regular", Menlo, Consolas, "Roboto Mono", monospace; + font-size: 0.74em; + font-weight: 400; + opacity: 0.85; + word-break: break-all; +} +.jfj-dl__req { margin: 6px 0 8px; font-size: 0.82em; line-height: 1.45; color: var(--fg-muted); } +.jfj-dl__note { margin: 10px 0 0; font-size: 0.82em; color: var(--fg-muted); } +.jfj-dl__note:empty { display: none; } + +/* ---- licence, footer ------------------------------------------------------------------------- */ + +.licence { + padding-top: 40px; + padding-bottom: 48px; + border-top: 1px solid var(--line); +} +.licence h2 { font-size: 1.5em; font-weight: 650; margin-bottom: 12px; } +.licence p { margin: 0 0 12px; max-width: 760px; color: var(--fg-muted); } + +.foot { + padding-top: 24px; + padding-bottom: 40px; + border-top: 1px solid var(--line); + font-size: 0.88em; + color: var(--fg-muted); +} +.foot p { margin: 0 0 6px; } + +/* ---- small screens --------------------------------------------------------------------------- */ + +@media (max-width: 760px) { + body { font-size: 15px; } + .top { gap: 14px; flex-wrap: wrap; } + .top__nav { gap: 14px; margin-left: 0; order: 3; width: 100%; font-size: 0.95em; } + .theme-toggle { margin-left: auto; } + .hero { grid-template-columns: 1fr; padding-top: 28px; padding-bottom: 40px; } + .hero__art { grid-column: 1; grid-row: 1; max-width: 360px; justify-self: center; } + .hero__art figcaption { text-align: center; } + .hero__text { grid-row: 2; } + .programs__grid { grid-template-columns: 1fr; } +} diff --git a/docs/landing/landing.js b/docs/landing/landing.js new file mode 100644 index 000000000..ba94b5979 --- /dev/null +++ b/docs/landing/landing.js @@ -0,0 +1,29 @@ +// The front page: theme toggle and the download section's +// "your system" highlight. The download buttons themselves are repointed at the newest release by +// _static/jfjoch_downloads.js, shared with the Sphinx download pages. +(function () { + // ---- theme: follows the system until the toggle is used, then remembered ----------------- + var root = document.documentElement; + var toggle = document.querySelector(".theme-toggle"); + function isDark() { + var set = root.getAttribute("data-theme"); + if (set) return set === "dark"; + return window.matchMedia && window.matchMedia("(prefers-color-scheme: dark)").matches; + } + if (toggle) toggle.addEventListener("click", function () { + var next = isDark() ? "light" : "dark"; + root.setAttribute("data-theme", next); + try { localStorage.setItem("jfj-theme", next); } catch (e) {} + }); + + // ---- "your system": highlight the platform the browser runs on ---------------------------- + var ua = navigator.userAgent || "", platform = navigator.platform || ""; + var os = /Windows/.test(ua) ? "windows" : /Mac/.test(platform) || /Macintosh/.test(ua) ? "macos" : + /Linux|X11/.test(platform + ua) && !/Android/.test(ua) ? "linux" : null; + if (os) { + document.querySelectorAll('.jfj-dl__card[data-platform="' + os + '"]').forEach(function (c) { c.classList.add("is-yours"); }); + var note = document.querySelector("[data-os-note]"); + var names = { windows: "Windows", macos: "macOS", linux: "Linux" }; + if (note) note.textContent = "The " + names[os] + " builds are marked for you."; + } +})(); diff --git a/docs/landing/psi.png b/docs/landing/psi.png new file mode 100644 index 000000000..49bbde890 Binary files /dev/null and b/docs/landing/psi.png differ diff --git a/docs/python_client/README.md b/docs/python_client/README.md index e60e5ad0c..0d8aa2e67 100644 --- a/docs/python_client/README.md +++ b/docs/python_client/README.md @@ -22,8 +22,8 @@ communicate through network calls or other mechanisms. This Python package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project: -- API version: 1.0.0-rc.179 -- Package version: 1.0.0-rc.179 +- API version: 1.0.0-rc.180 +- Package version: 1.0.0-rc.180 - Generator version: 7.20.0 - Build package: org.openapitools.codegen.languages.PythonClientCodegen @@ -231,6 +231,9 @@ Class | Method | HTTP request | Description - [RoiCircleList](docs/RoiCircleList.md) - [RoiDefinitions](docs/RoiDefinitions.md) - [RotationAxis](docs/RotationAxis.md) + - [RugnuxLiveBlob](docs/RugnuxLiveBlob.md) + - [RugnuxLiveModel](docs/RugnuxLiveModel.md) + - [RugnuxLiveRefinement](docs/RugnuxLiveRefinement.md) - [RugnuxLiveStatus](docs/RugnuxLiveStatus.md) - [RugnuxLiveStep](docs/RugnuxLiveStep.md) - [RugnuxSettings](docs/RugnuxSettings.md) diff --git a/docs/python_client/docs/DefaultApi.md b/docs/python_client/docs/DefaultApi.md index 4b3be85e3..b733809a2 100644 --- a/docs/python_client/docs/DefaultApi.md +++ b/docs/python_client/docs/DefaultApi.md @@ -4076,14 +4076,16 @@ This endpoint does not need any parameter. [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) # **rugnux_map_ccp4_get** -> bytearray rugnux_map_ccp4_get(type=type) +> bytearray rugnux_map_ccp4_get(type=type, stage=stage) Get an electron-density map of the last rugnux live run The map of the placed model (`/rugnux/model.cif`) in CCP4 format (mode 2, float), made from the map coefficients written to `_maps.mtz` (FWT/PHWT, DELFWT/PHDELWT, ANOM/PHANOM). It covers one unit cell centred on the model - along an axis where the model reaches further than the cell, the model plus 5 A instead - sampled every d_min/3; the mean and -RMS in its header are those of the unit cell, so contour levels in sigma are the usual ones. +RMS in its header are those of the unit cell, so contour levels in sigma are the usual ones. Where the run +refined the model, the 2mFo-DFc and mFo-DFc maps are the refined model's unless asked for `stage=placed`; +the anomalous map stays on the placed model's phases. ### Example @@ -4116,10 +4118,11 @@ with jfjoch_client.ApiClient(configuration) as api_client: # Create an instance of the API class api_instance = jfjoch_client.DefaultApi(api_client) type = 2fofc # str | `2fofc`: the 2mFo-DFc map; `fofc`: the mFo-DFc difference map; `anom`: the anomalous difference map, (F(+) - F(-)) on the model phases less 90 degrees, where the merge kept the Bijvoet pairs (`anomalous_map` in `/rugnux/status`) (optional) (default to 2fofc) + stage = 'stage_example' # str | `placed`: the model as placed; `refined`: the model refined (`refined_model` in `/rugnux/status`). Default: the refined model where there is one, otherwise the placed one. (optional) try: # Get an electron-density map of the last rugnux live run - api_response = api_instance.rugnux_map_ccp4_get(type=type) + api_response = api_instance.rugnux_map_ccp4_get(type=type, stage=stage) print("The response of DefaultApi->rugnux_map_ccp4_get:\n") pprint(api_response) except Exception as e: @@ -4134,6 +4137,7 @@ with jfjoch_client.ApiClient(configuration) as api_client: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- **type** | **str**| `2fofc`: the 2mFo-DFc map; `fofc`: the mFo-DFc difference map; `anom`: the anomalous difference map, (F(+) - F(-)) on the model phases less 90 degrees, where the merge kept the Bijvoet pairs (`anomalous_map` in `/rugnux/status`) | [optional] [default to 2fofc] + **stage** | **str**| `placed`: the model as placed; `refined`: the model refined (`refined_model` in `/rugnux/status`). Default: the refined model where there is one, otherwise the placed one. | [optional] ### Return type @@ -4153,20 +4157,21 @@ Name | Type | Description | Notes | Status code | Description | Response headers | |-------------|-------------|------------------| **200** | Map | - | -**400** | Unknown map type | - | +**400** | Unknown map type or stage | - | **401** | The current dataset is protected and no valid bearer token was presented. | - | -**404** | The last rugnux live run placed no model or made no maps, or (`anom`) has no Bijvoet pairs | - | +**404** | The last rugnux live run placed no model or made no maps, or (`anom`) has no Bijvoet pairs, or (`stage=refined`) refined none | - | [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) # **rugnux_model_cif_get** -> bytearray rugnux_model_cif_get() +> bytearray rugnux_model_cif_get(stage=stage) Get the model as placed by the last rugnux live run The model placed against the data by molecular replacement or validation, as mmCIF - the same text as the `_model.cif` file written beside the data: the data's cell and space group, with the input model's own metadata (entities, sequences, references, authors, software) kept. Kept as long as `/rugnux/status`. +Where the run refined the model, the refined model unless asked for `stage=placed`. ### Example @@ -4198,10 +4203,11 @@ configuration = jfjoch_client.Configuration( with jfjoch_client.ApiClient(configuration) as api_client: # Create an instance of the API class api_instance = jfjoch_client.DefaultApi(api_client) + stage = 'stage_example' # str | `placed`: the model as placed; `refined`: the model refined (`refined_model` in `/rugnux/status`). Default: the refined model where there is one, otherwise the placed one. (optional) try: # Get the model as placed by the last rugnux live run - api_response = api_instance.rugnux_model_cif_get() + api_response = api_instance.rugnux_model_cif_get(stage=stage) print("The response of DefaultApi->rugnux_model_cif_get:\n") pprint(api_response) except Exception as e: @@ -4212,7 +4218,10 @@ with jfjoch_client.ApiClient(configuration) as api_client: ### Parameters -This endpoint does not need any parameter. + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **stage** | **str**| `placed`: the model as placed; `refined`: the model refined (`refined_model` in `/rugnux/status`). Default: the refined model where there is one, otherwise the placed one. | [optional] ### Return type @@ -4232,8 +4241,9 @@ This endpoint does not need any parameter. | Status code | Description | Response headers | |-------------|-------------|------------------| **200** | Placed model | - | +**400** | Unknown stage | - | **401** | The current dataset is protected and no valid bearer token was presented. | - | -**404** | The last rugnux live run placed no model | - | +**404** | The last rugnux live run placed no model, or (`stage=refined`) refined none | - | [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) diff --git a/docs/python_client/docs/RugnuxLiveBlob.md b/docs/python_client/docs/RugnuxLiveBlob.md new file mode 100644 index 000000000..25f8cee89 --- /dev/null +++ b/docs/python_client/docs/RugnuxLiveBlob.md @@ -0,0 +1,37 @@ +# RugnuxLiveBlob + +A blob of positive mFo-DFc density the refined model leaves unexplained, with its likely reading: a rule on what is measured, to point a person at the density - not an identification. + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**kind** | **str** | | +**x** | **float** | Centroid, Cartesian Angstrom, in the frame of the refined model (`/rugnux/model.cif`) | +**y** | **float** | | +**z** | **float** | | +**peak_sigma** | **float** | The highest point, in map sigma | +**volume_a3** | **float** | Volume above 3 sigma, in cubic Angstrom | +**nearest_atom** | **str** | e.g. \"OG1 THR A42\" | +**nearest_atom_distance_a** | **float** | | + +## Example + +```python +from jfjoch_client.models.rugnux_live_blob import RugnuxLiveBlob + +# TODO update the JSON string below +json = "{}" +# create an instance of RugnuxLiveBlob from a JSON string +rugnux_live_blob_instance = RugnuxLiveBlob.from_json(json) +# print the JSON string representation of the object +print(RugnuxLiveBlob.to_json()) + +# convert the object into a dict +rugnux_live_blob_dict = rugnux_live_blob_instance.to_dict() +# create an instance of RugnuxLiveBlob from a dict +rugnux_live_blob_from_dict = RugnuxLiveBlob.from_dict(rugnux_live_blob_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/docs/python_client/docs/RugnuxLiveModel.md b/docs/python_client/docs/RugnuxLiveModel.md new file mode 100644 index 000000000..a2e7171de --- /dev/null +++ b/docs/python_client/docs/RugnuxLiveModel.md @@ -0,0 +1,50 @@ +# RugnuxLiveModel + +What the run made of the model it was given, as the report's MODEL VALIDATION section states it. The R-factors here are those of the placed model with its own coordinates and B factors; what refinement made of it is in `refinement`. A value that is absent was not computed - the model was not placed, or not by molecular replacement. + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**placement** | **str** | RIGID_BODY (the model fits where it is), MR (molecular replacement placed it) or NOT_PLACED | +**model_name** | **str** | | +**predicted** | **bool** | Searched for as a predicted model | +**reason** | **str** | Why the model could not be searched for or validated; empty otherwise | +**r_work** | **float** | | [optional] +**r_free** | **float** | | [optional] +**cc_model** | **float** | Correlation of the merged intensities with the placed model's, over all reflections | [optional] +**fit_sigma** | **float** | How far R-work stands below that of the same model in random orientations, in standard deviations | [optional] +**map_atom_sigma** | **float** | Mean 2mFo-DFc value at the atom centres, in map sigma | [optional] +**rigid_body_angle_deg** | **float** | | [optional] +**rigid_body_shift_a** | **float** | | [optional] +**mr_decision** | **str** | Molecular replacement's decision (AGREES, ENANTIOMORPH, SPACE_GROUP, TWIN_SUBGROUP, or why it placed nothing); empty where it did not run | +**mr_space_group** | **str** | The group molecular replacement placed the model in; empty where it placed none | +**copies** | **int** | Copies placed by molecular replacement | [optional] +**tf_z** | **float** | Translation-function Z-score, the highest of the copies' | [optional] +**rf_z** | **float** | Rotation-function Z-score of the first copy's orientation | [optional] +**llg_z** | **float** | Likelihood Z-score after the rigid body, where a copy's translation function did not stand out | [optional] +**mr_d_min** | **float** | High-resolution limit of the molecular-replacement search, in Angstrom | [optional] +**anomalous_site** | **str** | Atom with the strongest anomalous difference density, e.g. \"SG CYS A7\"; empty where there is no anomalous map | +**anomalous_site_sigma** | **float** | Anomalous difference density at that atom, in map sigma | [optional] +**refinement** | [**RugnuxLiveRefinement**](RugnuxLiveRefinement.md) | | [optional] + +## Example + +```python +from jfjoch_client.models.rugnux_live_model import RugnuxLiveModel + +# TODO update the JSON string below +json = "{}" +# create an instance of RugnuxLiveModel from a JSON string +rugnux_live_model_instance = RugnuxLiveModel.from_json(json) +# print the JSON string representation of the object +print(RugnuxLiveModel.to_json()) + +# convert the object into a dict +rugnux_live_model_dict = rugnux_live_model_instance.to_dict() +# create an instance of RugnuxLiveModel from a dict +rugnux_live_model_from_dict = RugnuxLiveModel.from_dict(rugnux_live_model_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/docs/python_client/docs/RugnuxLiveRefinement.md b/docs/python_client/docs/RugnuxLiveRefinement.md new file mode 100644 index 000000000..8c71018ba --- /dev/null +++ b/docs/python_client/docs/RugnuxLiveRefinement.md @@ -0,0 +1,40 @@ +# RugnuxLiveRefinement + +The placed model refined against the merge it was placed on, as the report's REFINE_ keys state it. Set where a placed model was refined or its refinement failed; absent where the model was not placed or refinement was skipped. On a machine without a GPU it runs on the CPU, slower, and the run's deadline or cancel can cut it. + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**performed** | **bool** | Refinement ran; false with `reason` where it failed | +**cancelled** | **bool** | The deadline or a cancel cut the refinement short: the weight trials that ran were chosen among, the rest left out (cut before the first, the model is the placement's) | +**reason** | **str** | Why refinement did not run to the end; empty otherwise | +**on_gpu** | **bool** | | +**seconds** | **float** | Wall time of the refinement | +**r_work** | **float** | R-work of the refined model (after the restrained stage, else after the rigid body and grouped B) | [optional] +**r_free** | **float** | R-free of the refined model, on the same reflections as `r_work` | [optional] +**rmsd_bonds_a** | **float** | RMS deviation of the bond lengths from the dictionary, where the restrained stage ran | [optional] +**rmsd_angles_deg** | **float** | RMS deviation of the bond angles from the dictionary, where the restrained stage ran | [optional] +**blob_count** | **int** | Unexplained blobs of the refined model's mFo-DFc map (above 3 sigma, peaking above 4) | +**blobs** | [**List[RugnuxLiveBlob]**](RugnuxLiveBlob.md) | The strongest blobs, at most 50, strongest first | + +## Example + +```python +from jfjoch_client.models.rugnux_live_refinement import RugnuxLiveRefinement + +# TODO update the JSON string below +json = "{}" +# create an instance of RugnuxLiveRefinement from a JSON string +rugnux_live_refinement_instance = RugnuxLiveRefinement.from_json(json) +# print the JSON string representation of the object +print(RugnuxLiveRefinement.to_json()) + +# convert the object into a dict +rugnux_live_refinement_dict = rugnux_live_refinement_instance.to_dict() +# create an instance of RugnuxLiveRefinement from a dict +rugnux_live_refinement_from_dict = RugnuxLiveRefinement.from_dict(rugnux_live_refinement_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/docs/python_client/docs/RugnuxLiveStatus.md b/docs/python_client/docs/RugnuxLiveStatus.md index b3b127ddf..5b50a0d62 100644 --- a/docs/python_client/docs/RugnuxLiveStatus.md +++ b/docs/python_client/docs/RugnuxLiveStatus.md @@ -8,7 +8,13 @@ Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- **state** | **str** | | **placed_model** | **bool** | The run placed the model: it can be fetched from `/rugnux/model.cif` and its maps from `/rugnux/map.ccp4`. | +**refined_model** | **bool** | The run refined the placed model: `/rugnux/model.cif` and `/rugnux/map.ccp4` serve the refined model and its maps unless asked for `stage=placed`. | **anomalous_map** | **bool** | The merge kept the Bijvoet pairs, so with the placed model there is an anomalous difference map (`/rugnux/map.ccp4?type=anom`). | +**anomalous_signal** | **bool** | The merged data carry usable anomalous signal (the summary's \"Anomalous\" row says so) | +**model** | [**RugnuxLiveModel**](RugnuxLiveModel.md) | | [optional] +**space_group** | **str** | Space group of the result (the summary's \"Space group\" row); absent until the run is over | [optional] +**d_min** | **float** | High-resolution limit of the merge, in Angstrom; absent until the run is over, or without a merge | [optional] +**isa** | **float** | ISa of the error model; absent until the run is over, or where it was not determined | [optional] **probe** | **str** | Answer of the early lattice probe on the first 60 degrees; empty until it answers | **probe_s** | **float** | When the probe answered, since the first image | [optional] **start_to_first_image_s** | **float** | From the START message to the first image; set once the first image arrives | [optional] diff --git a/fpga/hdl/action_config.v b/fpga/hdl/action_config.v index d3dca7b94..309610924 100644 --- a/fpga/hdl/action_config.v +++ b/fpga/hdl/action_config.v @@ -10,7 +10,7 @@ localparam signed [31:0] INT32_MIN = 32'sh80000000; `define JFJOCH_FPGA_MAJOR_VERSION 8'd1 `define JFJOCH_FPGA_MINOR_VERSION 8'd0 `define JFJOCH_FPGA_PATCH_VERSION 8'd0 -`define JFJOCH_FPGA_PRERELEASE 64'h3937312E6372 +`define JFJOCH_FPGA_PRERELEASE 64'h3038312E6372 `define GIT_SHA1 32'h `define MAX_MODULES_FPGA 32'd16 diff --git a/fpga/pcie_driver/dkms.conf b/fpga/pcie_driver/dkms.conf index 0970e1089..11383e44a 100644 --- a/fpga/pcie_driver/dkms.conf +++ b/fpga/pcie_driver/dkms.conf @@ -1,5 +1,5 @@ PACKAGE_NAME=jfjoch -PACKAGE_VERSION=1.0.0-rc.179 +PACKAGE_VERSION=1.0.0-rc.180 DEST_MODULE_LOCATION=/extra BUILT_MODULE_NAME=jfjoch diff --git a/fpga/pcie_driver/install_dkms.sh b/fpga/pcie_driver/install_dkms.sh index 59fb39322..fdccdfbb5 100755 --- a/fpga/pcie_driver/install_dkms.sh +++ b/fpga/pcie_driver/install_dkms.sh @@ -2,7 +2,7 @@ # Copyright (2019-2024) Paul Scherrer Institute -VERSION=1.0.0-rc.179 +VERSION=1.0.0-rc.180 mkdir -p /usr/src/jfjoch-${VERSION}/src cp dkms.conf /usr/src/jfjoch-${VERSION} diff --git a/fpga/pcie_driver/jfjoch_drv.c b/fpga/pcie_driver/jfjoch_drv.c index b4980cc31..b464ece6f 100644 --- a/fpga/pcie_driver/jfjoch_drv.c +++ b/fpga/pcie_driver/jfjoch_drv.c @@ -12,7 +12,7 @@ MODULE_AUTHOR("Filip Leonarski; Paul Scherrer Institute"); MODULE_DESCRIPTION("Jungfraujoch device module"); MODULE_LICENSE("GPL"); -MODULE_VERSION("1.0.0-rc.179"); +MODULE_VERSION("1.0.0-rc.180"); #define PCI_DEV_ID_JUNGFRAUJOCH (0x3450) diff --git a/fpga/pcie_driver/postinstall.sh b/fpga/pcie_driver/postinstall.sh index dea2a44d1..f1a117f56 100755 --- a/fpga/pcie_driver/postinstall.sh +++ b/fpga/pcie_driver/postinstall.sh @@ -1,7 +1,7 @@ #!/bin/bash # Taken from https://schneide.blog/2015/08/10/packaging-kernel-modulesdrivers-using-dkms/ -VERSION=1.0.0-rc.179 +VERSION=1.0.0-rc.180 occurrences=`/usr/sbin/dkms status | grep jfjoch | grep ${VERSION} | wc -l` diff --git a/fpga/pcie_driver/preuninstall.sh b/fpga/pcie_driver/preuninstall.sh index 275e83800..85f7e1eee 100755 --- a/fpga/pcie_driver/preuninstall.sh +++ b/fpga/pcie_driver/preuninstall.sh @@ -1,7 +1,7 @@ #!/bin/bash # Taken from https://schneide.blog/2015/08/10/packaging-kernel-modulesdrivers-using-dkms/ -VERSION=1.0.0-rc.179 +VERSION=1.0.0-rc.180 /usr/sbin/dkms remove -m jfjoch -v ${VERSION} --all diff --git a/frame_serialize/CBORStream2Deserializer.cpp b/frame_serialize/CBORStream2Deserializer.cpp index d6f4e647e..f5e56cc52 100644 --- a/frame_serialize/CBORStream2Deserializer.cpp +++ b/frame_serialize/CBORStream2Deserializer.cpp @@ -1679,6 +1679,30 @@ namespace { return m; } + DensityBlobsMessage ProcessDensityBlobsElement(CborValue &value) { + DensityBlobsMessage b; + CborValue map_value; + cborErr(cbor_value_enter_container(&value, &map_value)); + while (!cbor_value_at_end(&map_value)) { + auto key = GetCBORString(map_value); + if (key == "kind") GetCBORStringArray(map_value, b.kind); + else if (key == "x") GetCBORDoubleArray(map_value, b.x); + else if (key == "y") GetCBORDoubleArray(map_value, b.y); + else if (key == "z") GetCBORDoubleArray(map_value, b.z); + else if (key == "peak_sigma") GetCBORDoubleArray(map_value, b.peak_sigma); + else if (key == "volume") GetCBORDoubleArray(map_value, b.volume); + else if (key == "score") GetCBORDoubleArray(map_value, b.score); + else if (key == "nearest_atom") GetCBORStringArray(map_value, b.nearest_atom); + else if (key == "nearest_atom_distance") GetCBORDoubleArray(map_value, b.nearest_atom_distance); + else if (key == "polar_contacts") GetCBORInt32Array(map_value, b.polar_contacts); + else if (key == "metal_contacts") GetCBORInt32Array(map_value, b.metal_contacts); + else if (key == "anomalous_sigma") GetCBORDoubleArray(map_value, b.anomalous_sigma); + else SkipCBORValue(map_value); + } + cborErr(cbor_value_leave_container(&value, &map_value)); + return b; + } + bool ProcessEndMessageElement(EndMessage &message, CborValue &value) { if (cbor_value_at_end(&value)) return false; @@ -1769,6 +1793,8 @@ namespace { GetCBORUInt8Array(value, message.niggli_class); else if (key == "unit_cell") message.unit_cell = ProcessUnitCellElement(value); + else if (key == "unit_cell_esd") + message.unit_cell_esd = ProcessUnitCellElement(value); else if (key == "space_group_name") message.space_group_name = GetCBORString(value); else if (key == "space_group_number") @@ -1781,6 +1807,12 @@ namespace { message.map_coefficients = ProcessMtzTableElement(value); else if (key == "placed_model") message.placed_model = ProcessPlacedModelElement(value); + else if (key == "refined_model") + message.refined_model = ProcessPlacedModelElement(value); + else if (key == "refined_map_coefficients") + message.refined_map_coefficients = ProcessMtzTableElement(value); + else if (key == "blobs") + message.blobs = ProcessDensityBlobsElement(value); else if (key == "rotation_lattice") { std::vector tmp; GetCBORFloatArray(value, tmp); diff --git a/frame_serialize/CBORStream2Serializer.cpp b/frame_serialize/CBORStream2Serializer.cpp index 4e9615615..ec07c26f3 100644 --- a/frame_serialize/CBORStream2Serializer.cpp +++ b/frame_serialize/CBORStream2Serializer.cpp @@ -630,6 +630,25 @@ inline void CBOR_ENC(CborEncoder &encoder, const char* key, const PlacedModelMes cborErr(cbor_encoder_close_container(&encoder, &mapEncoder)); } +inline void CBOR_ENC(CborEncoder &encoder, const char* key, const DensityBlobsMessage &b) { + CborEncoder mapEncoder; + cborErr(cbor_encode_text_stringz(&encoder, key)); + cborErr(cbor_encoder_create_map(&encoder, &mapEncoder, CborIndefiniteLength)); + CBOR_ENC(mapEncoder, "kind", b.kind); + CBOR_ENC(mapEncoder, "x", b.x); + CBOR_ENC(mapEncoder, "y", b.y); + CBOR_ENC(mapEncoder, "z", b.z); + CBOR_ENC(mapEncoder, "peak_sigma", b.peak_sigma); + CBOR_ENC(mapEncoder, "volume", b.volume); + CBOR_ENC(mapEncoder, "score", b.score); + CBOR_ENC(mapEncoder, "nearest_atom", b.nearest_atom); + CBOR_ENC(mapEncoder, "nearest_atom_distance", b.nearest_atom_distance); + CBOR_ENC(mapEncoder, "polar_contacts", b.polar_contacts); + CBOR_ENC(mapEncoder, "metal_contacts", b.metal_contacts); + CBOR_ENC(mapEncoder, "anomalous_sigma", b.anomalous_sigma); + cborErr(cbor_encoder_close_container(&encoder, &mapEncoder)); +} + // Add encoder for LatticeMessage inline void CBOR_ENC(CborEncoder &encoder, const char* key, const LatticeMessage &val) { CborEncoder mapEncoder; @@ -969,6 +988,7 @@ void CBORStream2Serializer::SerializeSequenceEnd(const EndMessage& message) { CBOR_ENC(mapEncoder, "niggli_class", message.niggli_class); CBOR_ENC(mapEncoder, "pixel_sum", message.pixel_sum); CBOR_ENC(mapEncoder, "unit_cell", message.unit_cell); + CBOR_ENC(mapEncoder, "unit_cell_esd", message.unit_cell_esd); // Both spellings of the determined group. The name carries the setting and is what a reader // should take; the number is beside it for a reader written before the name existed. CBOR_ENC(mapEncoder, "space_group_name", message.space_group_name); @@ -976,6 +996,9 @@ void CBORStream2Serializer::SerializeSequenceEnd(const EndMessage& message) { CBOR_ENC(mapEncoder, "merged", message.merged); CBOR_ENC(mapEncoder, "map_coefficients", message.map_coefficients); CBOR_ENC(mapEncoder, "placed_model", message.placed_model); + CBOR_ENC(mapEncoder, "refined_model", message.refined_model); + CBOR_ENC(mapEncoder, "refined_map_coefficients", message.refined_map_coefficients); + CBOR_ENC(mapEncoder, "blobs", message.blobs); cborErr(cbor_encoder_close_container(&encoder, &mapEncoder)); diff --git a/frontend/package-lock.json b/frontend/package-lock.json index d7a461143..af16ca536 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,12 +1,12 @@ { "name": "jungfraujoch-frontend", - "version": "1.0.0-rc.179", + "version": "1.0.0-rc.180", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "jungfraujoch-frontend", - "version": "1.0.0-rc.179", + "version": "1.0.0-rc.180", "license": "GPL-3.0", "dependencies": { "@emotion/react": "^11.10.4", diff --git a/frontend/package.json b/frontend/package.json index dab3160ea..f0ac6d5e6 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "jungfraujoch-frontend", - "version": "1.0.0-rc.179", + "version": "1.0.0-rc.180", "license": "GPL-3.0", "private": true, "homepage": "/frontend", diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index d24cf6086..3b6287ac6 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -105,8 +105,9 @@ function PanelColumns({ columns = 2, children }: { columns?: number; children: R // An item either renders a panel inside the app (render) or links out to an // external page in a new tab (href), e.g. the source repository. +// wide: the page uses the screen's width instead of the 1300 px reading column type NavItem = { id: string; label: string; icon: ReactNode; disabled?: boolean; - href?: string; render?: () => ReactNode }; + href?: string; render?: () => ReactNode; wide?: boolean }; type NavSection = { subheader?: string; items: NavItem[] }; /** Documentation / API reference shown inside the app area, with a new-tab escape hatch. */ @@ -192,7 +193,7 @@ function App() { { id: 'data-collection', label: 'Data collection', icon: , render: () => ( )}, - { id: 'rugnux', label: 'Rugnux live', icon: , render: () => ( + { id: 'rugnux', label: 'Rugnux live', icon: , wide: true, render: () => ( )}, ]}, @@ -253,7 +254,7 @@ function App() { )}, { id: 'documentation', label: 'Documentation', icon: , render: () => ( - + )}, { id: 'changelog', label: 'Changelog', icon: , render: () => ( @@ -308,7 +309,7 @@ function App() { - + {activeItem.render?.()} diff --git a/frontend/src/client/@tanstack/react-query.gen.ts b/frontend/src/client/@tanstack/react-query.gen.ts index 291d2a39a..f6c61c8af 100644 --- a/frontend/src/client/@tanstack/react-query.gen.ts +++ b/frontend/src/client/@tanstack/react-query.gen.ts @@ -793,6 +793,7 @@ export const getRugnuxModelCifQueryKey = (options?: Options) => queryOptions>({ @@ -816,7 +817,9 @@ export const getRugnuxMapCcp4QueryKey = (options?: Options * The map of the placed model (`/rugnux/model.cif`) in CCP4 format (mode 2, float), made from the map * coefficients written to `_maps.mtz` (FWT/PHWT, DELFWT/PHDELWT, ANOM/PHANOM). It covers one unit cell centred on the model - along an axis where * the model reaches further than the cell, the model plus 5 A instead - sampled every d_min/3; the mean and - * RMS in its header are those of the unit cell, so contour levels in sigma are the usual ones. + * RMS in its header are those of the unit cell, so contour levels in sigma are the usual ones. Where the run + * refined the model, the 2mFo-DFc and mFo-DFc maps are the refined model's unless asked for `stage=placed`; + * the anomalous map stays on the placed model's phases. * */ export const getRugnuxMapCcp4Options = (options?: Options) => queryOptions>({ diff --git a/frontend/src/client/index.ts b/frontend/src/client/index.ts index ad6640672..5d347e0f2 100644 --- a/frontend/src/client/index.ts +++ b/frontend/src/client/index.ts @@ -1,4 +1,4 @@ // This file is auto-generated by @hey-api/openapi-ts export { deleteConfigRugnuxModel, getConfigAzimInt, getConfigBraggIntegration, getConfigDarkMask, getConfigDetector, getConfigFileWriter, getConfigImageFormat, getConfigIndexing, getConfigInstrument, getConfigMask, getConfigMaskTiff, getConfigRoi, getConfigRugnux, getConfigSelectDetector, getConfigSpotFinding, getConfigUserMask, getConfigUserMaskTiff, getConfigZeromqMetadata, getConfigZeromqPreview, getDetectorStatus, getFpgaStatus, getImageBufferImageCbor, getImageBufferImageJpeg, getImageBufferImageTiff, getImageBufferStartCbor, getImageBufferStatus, getImagePusherStatus, getLiveEvents, getPreviewPedestalTiff, getPreviewPlot, getPreviewPlotBin, getResultScan, getRugnuxMapCcp4, getRugnuxModelCif, getRugnuxStatus, getStatistics, getStatisticsCalibration, getStatisticsDataCollection, getStatus, getVersion, getXfelEventCode, getXfelPulseId, type Options, postCancel, postConfigImageFormatConversion, postConfigImageFormatRaw, postDeactivate, postImageBufferClear, postInitialize, postPedestal, postStart, postTrigger, postWaitTillDone, postWaitUntilRunning, putConfigAzimInt, putConfigBraggIntegration, putConfigDarkMask, putConfigDetector, putConfigFileWriter, putConfigImageFormat, putConfigIndexing, putConfigInstrument, putConfigInternalGeneratorImage, putConfigInternalGeneratorImageTiff, putConfigRoi, putConfigRugnux, putConfigRugnuxModel, putConfigSelectDetector, putConfigSpotFinding, putConfigUserMask, putConfigUserMaskTiff, putConfigZeromqMetadata, putConfigZeromqPreview } from './sdk.gen'; -export { type azim_int_settings, azint_unit, type background, type binning, type bragg_integration_settings, type broker_status, type calibration_statistics, type ClientOptions, color_scale, type crystal_lattice, type dark_mask_settings, type dataset_settings, type dataset_settingsWritable, type deleteConfigRugnuxModelData, type deleteConfigRugnuxModelError, type deleteConfigRugnuxModelErrors, type deleteConfigRugnuxModelResponses, type detector, type detector_list, type detector_list_element, type detector_module, detector_module_direction, detector_power_state, type detector_selection, type detector_settings, detector_state, type detector_status, detector_timing, detector_type, type error_message, type experimental_coord, file_writer_format, type file_writer_settings, type fill_value, type fpga_status, geom_refinement_algorithm, type getConfigAzimIntData, type getConfigAzimIntResponse, type getConfigAzimIntResponses, type getConfigBraggIntegrationData, type getConfigBraggIntegrationResponse, type getConfigBraggIntegrationResponses, type getConfigDarkMaskData, type getConfigDarkMaskResponse, type getConfigDarkMaskResponses, type getConfigDetectorData, type getConfigDetectorResponse, type getConfigDetectorResponses, type getConfigFileWriterData, type getConfigFileWriterResponse, type getConfigFileWriterResponses, type getConfigImageFormatData, type getConfigImageFormatResponse, type getConfigImageFormatResponses, type getConfigIndexingData, type getConfigIndexingResponse, type getConfigIndexingResponses, type getConfigInstrumentData, type getConfigInstrumentResponse, type getConfigInstrumentResponses, type getConfigMaskData, type getConfigMaskResponse, type getConfigMaskResponses, type getConfigMaskTiffData, type getConfigMaskTiffResponse, type getConfigMaskTiffResponses, type getConfigRoiData, type getConfigRoiResponse, type getConfigRoiResponses, type getConfigRugnuxData, type getConfigRugnuxResponse, type getConfigRugnuxResponses, type getConfigSelectDetectorData, type getConfigSelectDetectorResponse, type getConfigSelectDetectorResponses, type getConfigSpotFindingData, type getConfigSpotFindingResponse, type getConfigSpotFindingResponses, type getConfigUserMaskData, type getConfigUserMaskResponse, type getConfigUserMaskResponses, type getConfigUserMaskTiffData, type getConfigUserMaskTiffResponse, type getConfigUserMaskTiffResponses, type getConfigZeromqMetadataData, type getConfigZeromqMetadataResponse, type getConfigZeromqMetadataResponses, type getConfigZeromqPreviewData, type getConfigZeromqPreviewResponse, type getConfigZeromqPreviewResponses, type getDetectorStatusData, type getDetectorStatusError, type getDetectorStatusErrors, type getDetectorStatusResponse, type getDetectorStatusResponses, type getFpgaStatusData, type getFpgaStatusResponse, type getFpgaStatusResponses, type getImageBufferImageCborData, type getImageBufferImageCborError, type getImageBufferImageCborErrors, type getImageBufferImageCborResponse, type getImageBufferImageCborResponses, type getImageBufferImageJpegData, type getImageBufferImageJpegError, type getImageBufferImageJpegErrors, type getImageBufferImageJpegResponse, type getImageBufferImageJpegResponses, type getImageBufferImageTiffData, type getImageBufferImageTiffError, type getImageBufferImageTiffErrors, type getImageBufferImageTiffResponse, type getImageBufferImageTiffResponses, type getImageBufferStartCborData, type getImageBufferStartCborError, type getImageBufferStartCborErrors, type getImageBufferStartCborResponse, type getImageBufferStartCborResponses, type getImageBufferStatusData, type getImageBufferStatusError, type getImageBufferStatusErrors, type getImageBufferStatusResponse, type getImageBufferStatusResponses, type getImagePusherStatusData, type getImagePusherStatusError, type getImagePusherStatusErrors, type getImagePusherStatusResponse, type getImagePusherStatusResponses, type getLiveEventsData, type getLiveEventsError, type getLiveEventsErrors, type getLiveEventsResponse, type getLiveEventsResponses, type getPreviewPedestalTiffData, type getPreviewPedestalTiffErrors, type getPreviewPedestalTiffResponse, type getPreviewPedestalTiffResponses, type getPreviewPlotBinData, type getPreviewPlotBinError, type getPreviewPlotBinErrors, type getPreviewPlotBinResponse, type getPreviewPlotBinResponses, type getPreviewPlotData, type getPreviewPlotError, type getPreviewPlotErrors, type getPreviewPlotResponse, type getPreviewPlotResponses, type getResultScanData, type getResultScanError, type getResultScanErrors, type getResultScanResponse, type getResultScanResponses, type getRugnuxMapCcp4Data, type getRugnuxMapCcp4Error, type getRugnuxMapCcp4Errors, type getRugnuxMapCcp4Response, type getRugnuxMapCcp4Responses, type getRugnuxModelCifData, type getRugnuxModelCifError, type getRugnuxModelCifErrors, type getRugnuxModelCifResponse, type getRugnuxModelCifResponses, type getRugnuxStatusData, type getRugnuxStatusError, type getRugnuxStatusErrors, type getRugnuxStatusResponse, type getRugnuxStatusResponses, type getStatisticsCalibrationData, type getStatisticsCalibrationResponse, type getStatisticsCalibrationResponses, type getStatisticsData, type getStatisticsDataCollectionData, type getStatisticsDataCollectionError, type getStatisticsDataCollectionErrors, type getStatisticsDataCollectionResponse, type getStatisticsDataCollectionResponses, type getStatisticsResponse, type getStatisticsResponses, type getStatusData, type getStatusResponse, type getStatusResponses, type getVersionData, type getVersionResponse, type getVersionResponses, type getXfelEventCodeData, type getXfelEventCodeErrors, type getXfelEventCodeResponse, type getXfelEventCodeResponses, type getXfelPulseIdData, type getXfelPulseIdErrors, type getXfelPulseIdResponse, type getXfelPulseIdResponses, type grid_scan, type image_buffer_status, type image_format_settings, type image_id, type image_pusher_status, image_pusher_type, indexing_algorithm, type indexing_settings, type instrument_metadata, integration_model, type jfjoch_settings, type jfjoch_statistics, type jpeg_quality, type measurement_statistics, type pcie_devices, type pixel_mask_statistics, type plot, plot_type, plot_unit_x, type plots, type postCancelData, type postCancelResponses, type postConfigImageFormatConversionData, type postConfigImageFormatConversionError, type postConfigImageFormatConversionErrors, type postConfigImageFormatConversionResponses, type postConfigImageFormatRawData, type postConfigImageFormatRawError, type postConfigImageFormatRawErrors, type postConfigImageFormatRawResponses, type postDeactivateData, type postDeactivateError, type postDeactivateErrors, type postDeactivateResponses, type postImageBufferClearData, type postImageBufferClearError, type postImageBufferClearErrors, type postImageBufferClearResponses, type postInitializeData, type postInitializeError, type postInitializeErrors, type postInitializeResponses, type postPedestalData, type postPedestalError, type postPedestalErrors, type postPedestalResponses, type postStartData, type postStartError, type postStartErrors, type postStartResponses, type postTriggerData, type postTriggerResponses, type postWaitTillDoneData, type postWaitTillDoneError, type postWaitTillDoneErrors, type postWaitTillDoneResponses, type postWaitUntilRunningData, type postWaitUntilRunningError, type postWaitUntilRunningErrors, type postWaitUntilRunningResponses, type powder_calibration_fit_sigma, type powder_calibration_output, type powder_calibration_outputWritable, type powder_calibration_quality, type powder_calibration_spot_check, type putConfigAzimIntData, type putConfigAzimIntError, type putConfigAzimIntErrors, type putConfigAzimIntResponses, type putConfigBraggIntegrationData, type putConfigBraggIntegrationError, type putConfigBraggIntegrationErrors, type putConfigBraggIntegrationResponses, type putConfigDarkMaskData, type putConfigDarkMaskError, type putConfigDarkMaskErrors, type putConfigDarkMaskResponses, type putConfigDetectorData, type putConfigDetectorError, type putConfigDetectorErrors, type putConfigDetectorResponses, type putConfigFileWriterData, type putConfigFileWriterError, type putConfigFileWriterErrors, type putConfigFileWriterResponses, type putConfigImageFormatData, type putConfigImageFormatError, type putConfigImageFormatErrors, type putConfigImageFormatResponses, type putConfigIndexingData, type putConfigIndexingError, type putConfigIndexingErrors, type putConfigIndexingResponses, type putConfigInstrumentData, type putConfigInstrumentError, type putConfigInstrumentErrors, type putConfigInstrumentResponses, type putConfigInternalGeneratorImageData, type putConfigInternalGeneratorImageError, type putConfigInternalGeneratorImageErrors, type putConfigInternalGeneratorImageResponses, type putConfigInternalGeneratorImageTiffData, type putConfigInternalGeneratorImageTiffError, type putConfigInternalGeneratorImageTiffErrors, type putConfigInternalGeneratorImageTiffResponses, type putConfigRoiData, type putConfigRoiError, type putConfigRoiErrors, type putConfigRoiResponses, type putConfigRugnuxData, type putConfigRugnuxError, type putConfigRugnuxErrors, type putConfigRugnuxModelData, type putConfigRugnuxModelError, type putConfigRugnuxModelErrors, type putConfigRugnuxModelResponses, type putConfigRugnuxResponses, type putConfigSelectDetectorData, type putConfigSelectDetectorError, type putConfigSelectDetectorErrors, type putConfigSelectDetectorResponses, type putConfigSpotFindingData, type putConfigSpotFindingError, type putConfigSpotFindingErrors, type putConfigSpotFindingResponses, type putConfigUserMaskData, type putConfigUserMaskError, type putConfigUserMaskErrors, type putConfigUserMaskResponses, type putConfigUserMaskTiffData, type putConfigUserMaskTiffError, type putConfigUserMaskTiffErrors, type putConfigUserMaskTiffResponses, type putConfigZeromqMetadataData, type putConfigZeromqMetadataError, type putConfigZeromqMetadataErrors, type putConfigZeromqMetadataResponses, type putConfigZeromqPreviewData, type putConfigZeromqPreviewError, type putConfigZeromqPreviewErrors, type putConfigZeromqPreviewResponses, type resolution_estimate, type resolution_ring, type roi, type roi_azim_list, type roi_azimuthal, type roi_box, type roi_box_list, type roi_circle, type roi_circle_list, type roi_definitions, type rotation_axis, type rugnux_live_status, type rugnux_live_step, type rugnux_settings, type rugnux_status, type rugnux_summary_row, type saturation, type scan_result, type show_beam_center, type show_predictions, type show_roi, type show_spots, type show_user_mask, type spot_finding_settings, type standard_detector_geometry, type tcp_settings, type unit_cell, type zeromq_metadata_settings, type zeromq_preview_settings, type zeromq_settings } from './types.gen'; +export { type azim_int_settings, azint_unit, type background, type binning, type bragg_integration_settings, type broker_status, type calibration_statistics, type ClientOptions, color_scale, type crystal_lattice, type dark_mask_settings, type dataset_settings, type dataset_settingsWritable, type deleteConfigRugnuxModelData, type deleteConfigRugnuxModelError, type deleteConfigRugnuxModelErrors, type deleteConfigRugnuxModelResponses, type detector, type detector_list, type detector_list_element, type detector_module, detector_module_direction, detector_power_state, type detector_selection, type detector_settings, detector_state, type detector_status, detector_timing, detector_type, type error_message, type experimental_coord, file_writer_format, type file_writer_settings, type fill_value, type fpga_status, geom_refinement_algorithm, type getConfigAzimIntData, type getConfigAzimIntResponse, type getConfigAzimIntResponses, type getConfigBraggIntegrationData, type getConfigBraggIntegrationResponse, type getConfigBraggIntegrationResponses, type getConfigDarkMaskData, type getConfigDarkMaskResponse, type getConfigDarkMaskResponses, type getConfigDetectorData, type getConfigDetectorResponse, type getConfigDetectorResponses, type getConfigFileWriterData, type getConfigFileWriterResponse, type getConfigFileWriterResponses, type getConfigImageFormatData, type getConfigImageFormatResponse, type getConfigImageFormatResponses, type getConfigIndexingData, type getConfigIndexingResponse, type getConfigIndexingResponses, type getConfigInstrumentData, type getConfigInstrumentResponse, type getConfigInstrumentResponses, type getConfigMaskData, type getConfigMaskResponse, type getConfigMaskResponses, type getConfigMaskTiffData, type getConfigMaskTiffResponse, type getConfigMaskTiffResponses, type getConfigRoiData, type getConfigRoiResponse, type getConfigRoiResponses, type getConfigRugnuxData, type getConfigRugnuxResponse, type getConfigRugnuxResponses, type getConfigSelectDetectorData, type getConfigSelectDetectorResponse, type getConfigSelectDetectorResponses, type getConfigSpotFindingData, type getConfigSpotFindingResponse, type getConfigSpotFindingResponses, type getConfigUserMaskData, type getConfigUserMaskResponse, type getConfigUserMaskResponses, type getConfigUserMaskTiffData, type getConfigUserMaskTiffResponse, type getConfigUserMaskTiffResponses, type getConfigZeromqMetadataData, type getConfigZeromqMetadataResponse, type getConfigZeromqMetadataResponses, type getConfigZeromqPreviewData, type getConfigZeromqPreviewResponse, type getConfigZeromqPreviewResponses, type getDetectorStatusData, type getDetectorStatusError, type getDetectorStatusErrors, type getDetectorStatusResponse, type getDetectorStatusResponses, type getFpgaStatusData, type getFpgaStatusResponse, type getFpgaStatusResponses, type getImageBufferImageCborData, type getImageBufferImageCborError, type getImageBufferImageCborErrors, type getImageBufferImageCborResponse, type getImageBufferImageCborResponses, type getImageBufferImageJpegData, type getImageBufferImageJpegError, type getImageBufferImageJpegErrors, type getImageBufferImageJpegResponse, type getImageBufferImageJpegResponses, type getImageBufferImageTiffData, type getImageBufferImageTiffError, type getImageBufferImageTiffErrors, type getImageBufferImageTiffResponse, type getImageBufferImageTiffResponses, type getImageBufferStartCborData, type getImageBufferStartCborError, type getImageBufferStartCborErrors, type getImageBufferStartCborResponse, type getImageBufferStartCborResponses, type getImageBufferStatusData, type getImageBufferStatusError, type getImageBufferStatusErrors, type getImageBufferStatusResponse, type getImageBufferStatusResponses, type getImagePusherStatusData, type getImagePusherStatusError, type getImagePusherStatusErrors, type getImagePusherStatusResponse, type getImagePusherStatusResponses, type getLiveEventsData, type getLiveEventsError, type getLiveEventsErrors, type getLiveEventsResponse, type getLiveEventsResponses, type getPreviewPedestalTiffData, type getPreviewPedestalTiffErrors, type getPreviewPedestalTiffResponse, type getPreviewPedestalTiffResponses, type getPreviewPlotBinData, type getPreviewPlotBinError, type getPreviewPlotBinErrors, type getPreviewPlotBinResponse, type getPreviewPlotBinResponses, type getPreviewPlotData, type getPreviewPlotError, type getPreviewPlotErrors, type getPreviewPlotResponse, type getPreviewPlotResponses, type getResultScanData, type getResultScanError, type getResultScanErrors, type getResultScanResponse, type getResultScanResponses, type getRugnuxMapCcp4Data, type getRugnuxMapCcp4Error, type getRugnuxMapCcp4Errors, type getRugnuxMapCcp4Response, type getRugnuxMapCcp4Responses, type getRugnuxModelCifData, type getRugnuxModelCifError, type getRugnuxModelCifErrors, type getRugnuxModelCifResponse, type getRugnuxModelCifResponses, type getRugnuxStatusData, type getRugnuxStatusError, type getRugnuxStatusErrors, type getRugnuxStatusResponse, type getRugnuxStatusResponses, type getStatisticsCalibrationData, type getStatisticsCalibrationResponse, type getStatisticsCalibrationResponses, type getStatisticsData, type getStatisticsDataCollectionData, type getStatisticsDataCollectionError, type getStatisticsDataCollectionErrors, type getStatisticsDataCollectionResponse, type getStatisticsDataCollectionResponses, type getStatisticsResponse, type getStatisticsResponses, type getStatusData, type getStatusResponse, type getStatusResponses, type getVersionData, type getVersionResponse, type getVersionResponses, type getXfelEventCodeData, type getXfelEventCodeErrors, type getXfelEventCodeResponse, type getXfelEventCodeResponses, type getXfelPulseIdData, type getXfelPulseIdErrors, type getXfelPulseIdResponse, type getXfelPulseIdResponses, type grid_scan, type image_buffer_status, type image_format_settings, type image_id, type image_pusher_status, image_pusher_type, indexing_algorithm, type indexing_settings, type instrument_metadata, integration_model, type jfjoch_settings, type jfjoch_statistics, type jpeg_quality, type measurement_statistics, type pcie_devices, type pixel_mask_statistics, type plot, plot_type, plot_unit_x, type plots, type postCancelData, type postCancelResponses, type postConfigImageFormatConversionData, type postConfigImageFormatConversionError, type postConfigImageFormatConversionErrors, type postConfigImageFormatConversionResponses, type postConfigImageFormatRawData, type postConfigImageFormatRawError, type postConfigImageFormatRawErrors, type postConfigImageFormatRawResponses, type postDeactivateData, type postDeactivateError, type postDeactivateErrors, type postDeactivateResponses, type postImageBufferClearData, type postImageBufferClearError, type postImageBufferClearErrors, type postImageBufferClearResponses, type postInitializeData, type postInitializeError, type postInitializeErrors, type postInitializeResponses, type postPedestalData, type postPedestalError, type postPedestalErrors, type postPedestalResponses, type postStartData, type postStartError, type postStartErrors, type postStartResponses, type postTriggerData, type postTriggerResponses, type postWaitTillDoneData, type postWaitTillDoneError, type postWaitTillDoneErrors, type postWaitTillDoneResponses, type postWaitUntilRunningData, type postWaitUntilRunningError, type postWaitUntilRunningErrors, type postWaitUntilRunningResponses, type powder_calibration_fit_sigma, type powder_calibration_output, type powder_calibration_outputWritable, type powder_calibration_quality, type powder_calibration_spot_check, type putConfigAzimIntData, type putConfigAzimIntError, type putConfigAzimIntErrors, type putConfigAzimIntResponses, type putConfigBraggIntegrationData, type putConfigBraggIntegrationError, type putConfigBraggIntegrationErrors, type putConfigBraggIntegrationResponses, type putConfigDarkMaskData, type putConfigDarkMaskError, type putConfigDarkMaskErrors, type putConfigDarkMaskResponses, type putConfigDetectorData, type putConfigDetectorError, type putConfigDetectorErrors, type putConfigDetectorResponses, type putConfigFileWriterData, type putConfigFileWriterError, type putConfigFileWriterErrors, type putConfigFileWriterResponses, type putConfigImageFormatData, type putConfigImageFormatError, type putConfigImageFormatErrors, type putConfigImageFormatResponses, type putConfigIndexingData, type putConfigIndexingError, type putConfigIndexingErrors, type putConfigIndexingResponses, type putConfigInstrumentData, type putConfigInstrumentError, type putConfigInstrumentErrors, type putConfigInstrumentResponses, type putConfigInternalGeneratorImageData, type putConfigInternalGeneratorImageError, type putConfigInternalGeneratorImageErrors, type putConfigInternalGeneratorImageResponses, type putConfigInternalGeneratorImageTiffData, type putConfigInternalGeneratorImageTiffError, type putConfigInternalGeneratorImageTiffErrors, type putConfigInternalGeneratorImageTiffResponses, type putConfigRoiData, type putConfigRoiError, type putConfigRoiErrors, type putConfigRoiResponses, type putConfigRugnuxData, type putConfigRugnuxError, type putConfigRugnuxErrors, type putConfigRugnuxModelData, type putConfigRugnuxModelError, type putConfigRugnuxModelErrors, type putConfigRugnuxModelResponses, type putConfigRugnuxResponses, type putConfigSelectDetectorData, type putConfigSelectDetectorError, type putConfigSelectDetectorErrors, type putConfigSelectDetectorResponses, type putConfigSpotFindingData, type putConfigSpotFindingError, type putConfigSpotFindingErrors, type putConfigSpotFindingResponses, type putConfigUserMaskData, type putConfigUserMaskError, type putConfigUserMaskErrors, type putConfigUserMaskResponses, type putConfigUserMaskTiffData, type putConfigUserMaskTiffError, type putConfigUserMaskTiffErrors, type putConfigUserMaskTiffResponses, type putConfigZeromqMetadataData, type putConfigZeromqMetadataError, type putConfigZeromqMetadataErrors, type putConfigZeromqMetadataResponses, type putConfigZeromqPreviewData, type putConfigZeromqPreviewError, type putConfigZeromqPreviewErrors, type putConfigZeromqPreviewResponses, type resolution_estimate, type resolution_ring, type roi, type roi_azim_list, type roi_azimuthal, type roi_box, type roi_box_list, type roi_circle, type roi_circle_list, type roi_definitions, type rotation_axis, type rugnux_live_blob, type rugnux_live_model, type rugnux_live_refinement, type rugnux_live_status, type rugnux_live_step, type rugnux_settings, type rugnux_status, type rugnux_summary_row, type saturation, type scan_result, type show_beam_center, type show_predictions, type show_roi, type show_spots, type show_user_mask, type spot_finding_settings, type standard_detector_geometry, type tcp_settings, type unit_cell, type zeromq_metadata_settings, type zeromq_preview_settings, type zeromq_settings } from './types.gen'; diff --git a/frontend/src/client/sdk.gen.ts b/frontend/src/client/sdk.gen.ts index 1dcd6afcf..8cb530076 100644 --- a/frontend/src/client/sdk.gen.ts +++ b/frontend/src/client/sdk.gen.ts @@ -444,6 +444,7 @@ export const getRugnuxStatus = (options?: * The model placed against the data by molecular replacement or validation, as mmCIF - the same text as the * `_model.cif` file written beside the data: the data's cell and space group, with the input model's own * metadata (entities, sequences, references, authors, software) kept. Kept as long as `/rugnux/status`. + * Where the run refined the model, the refined model unless asked for `stage=placed`. * */ export const getRugnuxModelCif = (options?: Options): RequestResult => (options?.client ?? client).get({ @@ -458,7 +459,9 @@ export const getRugnuxModelCif = (options? * The map of the placed model (`/rugnux/model.cif`) in CCP4 format (mode 2, float), made from the map * coefficients written to `_maps.mtz` (FWT/PHWT, DELFWT/PHDELWT, ANOM/PHANOM). It covers one unit cell centred on the model - along an axis where * the model reaches further than the cell, the model plus 5 A instead - sampled every d_min/3; the mean and - * RMS in its header are those of the unit cell, so contour levels in sigma are the usual ones. + * RMS in its header are those of the unit cell, so contour levels in sigma are the usual ones. Where the run + * refined the model, the 2mFo-DFc and mFo-DFc maps are the refined model's unless asked for `stage=placed`; + * the anomalous map stays on the placed model's phases. * */ export const getRugnuxMapCcp4 = (options?: Options): RequestResult => (options?.client ?? client).get({ diff --git a/frontend/src/client/types.gen.ts b/frontend/src/client/types.gen.ts index 8bc26b92d..fa85ac4ed 100644 --- a/frontend/src/client/types.gen.ts +++ b/frontend/src/client/types.gen.ts @@ -1942,6 +1942,166 @@ export type rugnux_summary_row = { value: string; }; +/** + * What the run made of the model it was given, as the report's MODEL VALIDATION section states it. The + * R-factors here are those of the placed model with its own coordinates and B factors; what refinement made + * of it is in `refinement`. A value that is absent was not computed - the model was not placed, or not by + * molecular replacement. + * + */ +export type rugnux_live_model = { + /** + * RIGID_BODY (the model fits where it is), MR (molecular replacement placed it) or NOT_PLACED + */ + placement: string; + model_name: string; + /** + * Searched for as a predicted model + */ + predicted: boolean; + /** + * Why the model could not be searched for or validated; empty otherwise + */ + reason: string; + r_work?: number; + r_free?: number; + /** + * Correlation of the merged intensities with the placed model's, over all reflections + */ + cc_model?: number; + /** + * How far R-work stands below that of the same model in random orientations, in standard deviations + */ + fit_sigma?: number; + /** + * Mean 2mFo-DFc value at the atom centres, in map sigma + */ + map_atom_sigma?: number; + rigid_body_angle_deg?: number; + rigid_body_shift_A?: number; + /** + * Molecular replacement's decision (AGREES, ENANTIOMORPH, SPACE_GROUP, TWIN_SUBGROUP, or why it placed nothing); empty where it did not run + */ + mr_decision: string; + /** + * The group molecular replacement placed the model in; empty where it placed none + */ + mr_space_group: string; + /** + * Copies placed by molecular replacement + */ + copies?: number; + /** + * Translation-function Z-score, the highest of the copies' + */ + tf_z?: number; + /** + * Rotation-function Z-score of the first copy's orientation + */ + rf_z?: number; + /** + * Likelihood Z-score after the rigid body, where a copy's translation function did not stand out + */ + llg_z?: number; + /** + * High-resolution limit of the molecular-replacement search, in Angstrom + */ + mr_d_min?: number; + /** + * Atom with the strongest anomalous difference density, e.g. "SG CYS A7"; empty where there is no anomalous map + */ + anomalous_site: string; + /** + * Anomalous difference density at that atom, in map sigma + */ + anomalous_site_sigma?: number; + refinement?: rugnux_live_refinement; +}; + +/** + * The placed model refined against the merge it was placed on, as the report's REFINE_ keys state it. Set + * where a placed model was refined or its refinement failed; absent where the model was not placed or + * refinement was skipped. On a machine without a GPU it runs on the CPU, slower, and the run's deadline + * or cancel can cut it. + * + */ +export type rugnux_live_refinement = { + /** + * Refinement ran; false with `reason` where it failed + */ + performed: boolean; + /** + * The deadline or a cancel cut the refinement short: the weight trials that ran were chosen among, the + * rest left out (cut before the first, the model is the placement's) + * + */ + cancelled: boolean; + /** + * Why refinement did not run to the end; empty otherwise + */ + reason: string; + on_gpu: boolean; + /** + * Wall time of the refinement + */ + seconds: number; + /** + * R-work of the refined model (after the restrained stage, else after the rigid body and grouped B) + */ + r_work?: number; + /** + * R-free of the refined model, on the same reflections as `r_work` + */ + r_free?: number; + /** + * RMS deviation of the bond lengths from the dictionary, where the restrained stage ran + */ + rmsd_bonds_A?: number; + /** + * RMS deviation of the bond angles from the dictionary, where the restrained stage ran + */ + rmsd_angles_deg?: number; + /** + * Unexplained blobs of the refined model's mFo-DFc map (above 3 sigma, peaking above 4) + */ + blob_count: number; + /** + * The strongest blobs, at most 50, strongest first + */ + blobs: Array; +}; + +/** + * A blob of positive mFo-DFc density the refined model leaves unexplained, with its likely reading: a rule on + * what is measured, to point a person at the density - not an identification. + * + */ +export type rugnux_live_blob = { + kind: 'WATER' | 'ION' | 'LIGAND' | 'MODEL_ERROR' | 'UNASSIGNED'; + /** + * Centroid, Cartesian Angstrom, in the frame of the refined model (`/rugnux/model.cif`) + */ + x: number; + y: number; + z: number; + /** + * The highest point, in map sigma + */ + peak_sigma: number; + /** + * Volume above 3 sigma, in cubic Angstrom + */ + volume_A3: number; + /** + * e.g. "OG1 THR A42" + */ + nearest_atom: string; + /** + * Absent where no atom is within 12 Angstrom + */ + nearest_atom_distance_A?: number; +}; + /** * Live rugnux processing of the last collection; kept until the next collection starts or `POST /initialize`. * Times are taken when the image puller received a message, and are in seconds since the first image @@ -1956,12 +2116,35 @@ export type rugnux_live_status = { * */ placed_model: boolean; + /** + * The run refined the placed model: `/rugnux/model.cif` and `/rugnux/map.ccp4` serve the refined model and + * its maps unless asked for `stage=placed`. + * + */ + refined_model: boolean; /** * The merge kept the Bijvoet pairs, so with the placed model there is an anomalous difference map * (`/rugnux/map.ccp4?type=anom`). * */ anomalous_map: boolean; + /** + * The merged data carry usable anomalous signal (the summary's "Anomalous" row says so) + */ + anomalous_signal: boolean; + model?: rugnux_live_model; + /** + * Space group of the result (the summary's "Space group" row); absent until the run is over + */ + space_group?: string; + /** + * High-resolution limit of the merge, in Angstrom; absent until the run is over, or without a merge + */ + d_min?: number; + /** + * ISa of the error model; absent until the run is over, or where it was not determined + */ + isa?: number; /** * Answer of the early lattice probe on the first 60 degrees; empty until it answers */ @@ -3327,17 +3510,28 @@ export type getRugnuxStatusResponse = getRugnuxStatusResponses[keyof getRugnuxSt export type getRugnuxModelCifData = { body?: never; path?: never; - query?: never; + query?: { + /** + * `placed`: the model as placed; `refined`: the model refined (`refined_model` in `/rugnux/status`). + * Default: the refined model where there is one, otherwise the placed one. + * + */ + stage?: 'placed' | 'refined'; + }; url: '/rugnux/model.cif'; }; export type getRugnuxModelCifErrors = { + /** + * Unknown stage + */ + 400: string; /** * The current dataset is protected and no valid bearer token was presented. */ 401: string; /** - * The last rugnux live run placed no model + * The last rugnux live run placed no model, or (`stage=refined`) refined none */ 404: unknown; }; @@ -3364,13 +3558,19 @@ export type getRugnuxMapCcp4Data = { * */ type?: '2fofc' | 'fofc' | 'anom'; + /** + * `placed`: the model as placed; `refined`: the model refined (`refined_model` in `/rugnux/status`). + * Default: the refined model where there is one, otherwise the placed one. + * + */ + stage?: 'placed' | 'refined'; }; url: '/rugnux/map.ccp4'; }; export type getRugnuxMapCcp4Errors = { /** - * Unknown map type + * Unknown map type or stage */ 400: string; /** @@ -3378,7 +3578,7 @@ export type getRugnuxMapCcp4Errors = { */ 401: string; /** - * The last rugnux live run placed no model or made no maps, or (`anom`) has no Bijvoet pairs + * The last rugnux live run placed no model or made no maps, or (`anom`) has no Bijvoet pairs, or (`stage=refined`) refined none */ 404: unknown; }; diff --git a/frontend/src/client/zod.gen.ts b/frontend/src/client/zod.gen.ts index c4f96eac8..62dbf0631 100644 --- a/frontend/src/client/zod.gen.ts +++ b/frontend/src/client/zod.gen.ts @@ -823,6 +823,80 @@ export const zRugnuxSummaryRow = z.object({ value: z.string() }); +/** + * A blob of positive mFo-DFc density the refined model leaves unexplained, with its likely reading: a rule on + * what is measured, to point a person at the density - not an identification. + * + */ +export const zRugnuxLiveBlob = z.object({ + kind: z.enum([ + 'WATER', + 'ION', + 'LIGAND', + 'MODEL_ERROR', + 'UNASSIGNED' + ]), + x: z.number(), + y: z.number(), + z: z.number(), + peak_sigma: z.number(), + volume_A3: z.number(), + nearest_atom: z.string(), + nearest_atom_distance_A: z.number().optional() +}); + +/** + * The placed model refined against the merge it was placed on, as the report's REFINE_ keys state it. Set + * where a placed model was refined or its refinement failed; absent where the model was not placed or + * refinement was skipped. On a machine without a GPU it runs on the CPU, slower, and the run's deadline + * or cancel can cut it. + * + */ +export const zRugnuxLiveRefinement = z.object({ + performed: z.boolean(), + cancelled: z.boolean(), + reason: z.string(), + on_gpu: z.boolean(), + seconds: z.number(), + r_work: z.number().optional(), + r_free: z.number().optional(), + rmsd_bonds_A: z.number().optional(), + rmsd_angles_deg: z.number().optional(), + blob_count: z.coerce.bigint().min(BigInt('-9223372036854775808'), { error: 'Invalid value: Expected int64 to be >= -9223372036854775808' }).max(BigInt('9223372036854775807'), { error: 'Invalid value: Expected int64 to be <= 9223372036854775807' }), + blobs: z.array(zRugnuxLiveBlob) +}); + +/** + * What the run made of the model it was given, as the report's MODEL VALIDATION section states it. The + * R-factors here are those of the placed model with its own coordinates and B factors; what refinement made + * of it is in `refinement`. A value that is absent was not computed - the model was not placed, or not by + * molecular replacement. + * + */ +export const zRugnuxLiveModel = z.object({ + placement: z.string(), + model_name: z.string(), + predicted: z.boolean(), + reason: z.string(), + r_work: z.number().optional(), + r_free: z.number().optional(), + cc_model: z.number().optional(), + fit_sigma: z.number().optional(), + map_atom_sigma: z.number().optional(), + rigid_body_angle_deg: z.number().optional(), + rigid_body_shift_A: z.number().optional(), + mr_decision: z.string(), + mr_space_group: z.string(), + copies: z.coerce.bigint().min(BigInt('-9223372036854775808'), { error: 'Invalid value: Expected int64 to be >= -9223372036854775808' }).max(BigInt('9223372036854775807'), { error: 'Invalid value: Expected int64 to be <= 9223372036854775807' }).optional(), + tf_z: z.number().optional(), + rf_z: z.number().optional(), + llg_z: z.number().optional(), + mr_d_min: z.number().optional(), + anomalous_site: z.string(), + anomalous_site_sigma: z.number().optional(), + refinement: zRugnuxLiveRefinement.optional() +}); + /** * Live rugnux processing of the last collection; kept until the next collection starts or `POST /initialize`. * Times are taken when the image puller received a message, and are in seconds since the first image @@ -839,7 +913,13 @@ export const zRugnuxLiveStatus = z.object({ 'Skipped' ]), placed_model: z.boolean(), + refined_model: z.boolean(), anomalous_map: z.boolean(), + anomalous_signal: z.boolean(), + model: zRugnuxLiveModel.optional(), + space_group: z.string().optional(), + d_min: z.number().optional(), + isa: z.number().optional(), probe: z.string(), probe_s: z.number().optional(), start_to_first_image_s: z.number().optional(), @@ -1269,6 +1349,10 @@ export const zPutConfigRugnuxModelBody = z.string(); */ export const zGetRugnuxStatusResponse = zRugnuxLiveStatus; +export const zGetRugnuxModelCifQuery = z.object({ + stage: z.enum(['placed', 'refined']).optional() +}); + /** * Placed model */ @@ -1279,7 +1363,8 @@ export const zGetRugnuxMapCcp4Query = z.object({ '2fofc', 'fofc', 'anom' - ]).optional().default('2fofc') + ]).optional().default('2fofc'), + stage: z.enum(['placed', 'refined']).optional() }); /** diff --git a/frontend/src/components/RugnuxHero.tsx b/frontend/src/components/RugnuxHero.tsx new file mode 100644 index 000000000..759c24c22 --- /dev/null +++ b/frontend/src/components/RugnuxHero.tsx @@ -0,0 +1,139 @@ +import {Box, Paper, Tooltip, Typography} from "@mui/material"; +import {green, grey, indigo, red} from "@mui/material/colors"; +import {keyframes} from "@mui/system"; +import {rugnux_live_status} from "../client"; + +// The headline of a rugnux live run as big numbers, as jfjoch_viewer's merge-statistics window opens: +// resolution, ISa, space group, and whether the model was placed. "—" until the run is over. + +const fadeIn = keyframes` + from { opacity: 0; transform: scale(.94); } + to { opacity: 1; transform: none; } +`; + +// The short Hermann-Mauguin symbol with screw axes subscripted and rotoinversions overlined, as the viewer +// writes it: "P 1 21 1" -> P2₁, "P 41 21 2" -> P4₁2₁2, "R 3 :H" -> H3. +function SpaceGroup({hm}: { hm: string }) { + const [symbol, setting] = hm.split(":").map(x => x.trim()); + let s = symbol; + // the monoclinic shortening: "P 1 21 1" -> "P 21" + const t = s.split(" "); + if (t.length === 4 && t[1] === "1" && t[3] === "1") + s = `${t[0]} ${t[2]}`; + if (setting === "H") + s = "H" + s.slice(1); + return <>{s.split(" ").filter(x => x).map((token, i) => { + if (token.length >= 2 && token[0] === "-") + return {token[1]}{token.slice(2)}; + if (token.length >= 2 && /\d/.test(token[0]) && /\d/.test(token[1])) + return {token[0]}{token[1]}{token.slice(2)}; + return {token}; + })}; +} + +type Tone = "plain" | "pending" | "good" | "bad" | "neutral"; + +const TONE: Record = { + plain: {bg: "#fff", border: indigo[100], value: indigo[900]}, + pending: {bg: grey[50], border: grey[200], value: indigo[200]}, + good: {bg: green[50], border: green[400], value: green[800]}, + bad: {bg: red[50], border: red[300], value: red[800]}, + neutral: {bg: grey[100], border: grey[300], value: grey[600]}, +}; + +function Card({value, caption, sub, tip, tone}: + { value: React.ReactNode, caption: string, sub?: string, tip: React.ReactNode, tone: Tone }) { + const c = TONE[tone]; + return ( + + + + {value} + + + {caption} + + + {sub ?? ""} + + + + ); +} + +const FIT_TIP = "Fit over random: how far the placed model's R-work stands below that of the same model refitted " + + "in random orientations, in standard deviations of those. It is the test rugnux places a model by, for " + + "molecular replacement and for a model that fits where it is alike. Green: rugnux placed the model; " + + "red: it did not."; + +const REFINED_TIP = "R-work and R-free of the placed model after rugnux refined it against these data (rigid bodies " + + "and grouped B, then every atom restrained by the dictionary), R-free on the merge's own free set."; + +// The model card: green where rugnux placed the model (by molecular replacement or where it was), red where it +// did not, grey where there was no model to place; once refined, the refined R-free is its context line. +// modelLoaded: a model is uploaded now. +function ModelCard({s, modelLoaded}: { s: rugnux_live_status, modelLoaded: boolean }) { + const m = s.model; + const fit = m?.fit_sigma != null ? `${m.fit_sigma >= 0 ? "+" : ""}${m.fit_sigma.toFixed(1)} σ` : undefined; + if (m && m.placement !== "NOT_PLACED") { + const how = m.placement === "MR" + ? `MR · ${m.copies ?? 1} ${m.copies === 1 || m.copies === undefined ? "copy" : "copies"}` + : "fits where it is"; + // Refined: its R-work / R-free are the headline, the card's green still says the model was placed + const rf = m.refinement?.performed ? m.refinement : undefined; + if (rf && rf.r_work != null && rf.r_free != null) + return {REFINED_TIP}{rf.cancelled && " The deadline cut the refinement short."}

{FIT_TIP}}/>; + return ; + } + if (m) { + // "NOT_PLACED: no group of ..." -> "no group of ..." + const why = m.reason || m.mr_decision.replace(/^[A-Z_]+: /, ""); + return {FIT_TIP}{why && <>

{why}}}/>; + } + if (s.state === "Running" && modelLoaded) { + const step = s.steps.length > 0 ? s.steps[s.steps.length - 1].title : ""; + const sub = step === "Molecular replacement" ? "searching…" : step === "Refinement" ? "refining…" + : "placed after merging"; + return ; + } + if (s.state === "Running" || !modelLoaded) + return ; + return ; +} + +function RugnuxHero({s, modelLoaded}: { s: rugnux_live_status, modelLoaded: boolean }) { + const pending = s.state === "Running"; + const later = pending ? "when the run is over" : undefined; + const tone: Tone = pending ? "pending" : "plain"; + const mrGroup = s.model?.mr_space_group; + return ( + + + + : "—"} caption="Space group" + sub={later ?? (mrGroup && s.space_group && mrGroup !== s.space_group ? `model placed in ${mrGroup}` : s.space_group)} + tone={s.space_group ? "plain" : tone} + tip="Space group rugnux determined from the data. Where molecular replacement placed the model in another group, the card says which."/> + + + ); +} + +export default RugnuxHero; diff --git a/frontend/src/components/RugnuxPage.tsx b/frontend/src/components/RugnuxPage.tsx index 9e062c3d8..4230cfa2d 100644 --- a/frontend/src/components/RugnuxPage.tsx +++ b/frontend/src/components/RugnuxPage.tsx @@ -7,21 +7,27 @@ import {useTokenRequired} from "../auth"; import EmptyState from "./EmptyState"; import RugnuxTimeline from "./RugnuxTimeline"; import RugnuxSettings from "./RugnuxSettings"; -import {CutAlert, lastImageTime, ProbeAlert, RunMessage, StateChip, StepTable, VerdictAlert} from "./RugnuxParts"; +import RugnuxHero from "./RugnuxHero"; +import {CutAlert, lastImageTime, ModelScores, ProbeAlert, RunMessage, StateChip, StepTable, VerdictAlert} from "./RugnuxParts"; import BoltIcon from "@mui/icons-material/Bolt"; import {lazy, Suspense} from "react"; +import {keyframes} from "@mui/system"; // Mol* is large: loaded only when there is a model to show. const RugnuxStructureViewer = lazy(() => import("./RugnuxStructureViewer")); -// The summary rows rugnux writes; the ones a crystallographer looks at first get a stronger tile, and -// space group and cell share a row. +// The summary rows rugnux writes; the ones a crystallographer looks at first get a stronger tile. const KEY_ROW = /unit cell|space group|resolution|signal|r-?free|model/i; -const PAIRED_ROW = /space group|unit cell/i; -function Section({title, children}: { title: string, children: React.ReactNode }) { +// The model section's entrance under the timeline, once the run has placed a model +const slideIn = keyframes` + from { opacity: 0; transform: translateY(24px); } + to { opacity: 1; transform: none; } +`; + +function Section({title, children, sx}: { title: string, children: React.ReactNode, sx?: object }) { return ( - + {title} @@ -86,12 +92,12 @@ function SummaryTiles({s}: { s: rugnux_live_status }) { if (s.summary.length === 0) return null; return ( - + {s.summary.map((row, i) => { const key = KEY_ROW.test(row.label); const short = row.value.length <= 24; return ( - step.title === "Molecular replacement")?.duration_s; + return ( +
+ + {s.placed_model && + Loading viewer...}> + + + } +
+ ); +} + function RugnuxPage({measuring}: { measuring: boolean }) { const {data: settings} = useQuery({...getConfigRugnuxOptions(), refetchInterval: 2000}); const enabled = settings?.enable === true; @@ -133,12 +157,15 @@ function RugnuxPage({measuring}: { measuring: boolean }) { live = (
+
- + {s.model && s.state !== 'Running' && } +
@@ -155,12 +182,6 @@ function RugnuxPage({measuring}: { measuring: boolean }) {
- {s.placed_model && s.state !== 'Running' && -
- Loading viewer...}> - - -
} ); diff --git a/frontend/src/components/RugnuxParts.tsx b/frontend/src/components/RugnuxParts.tsx index cbd6502a0..6a8a9105e 100644 --- a/frontend/src/components/RugnuxParts.tsx +++ b/frontend/src/components/RugnuxParts.tsx @@ -1,7 +1,7 @@ import {Alert, AlertTitle, Box, Chip, Paper, Table, TableBody, TableCell, TableContainer, TableRow, Typography} from "@mui/material"; import {indigo, lime, deepOrange, grey} from "@mui/material/colors"; import {SxProps, Theme} from "@mui/material/styles"; -import {rugnux_live_status, rugnux_live_step} from "../client"; +import {rugnux_live_model, rugnux_live_status, rugnux_live_step} from "../client"; // Pieces of the rugnux live status shared by the dashboard card and the Rugnux page. @@ -113,3 +113,73 @@ export function StepTable({steps}: { steps: rugnux_live_step[] }) { ); } + +function ScoreTile({label, value, sub, accent}: { label: string, value: string, sub?: string, accent?: boolean }) { + return ( + + {label} + + {value} + {sub && {sub}} + + ); +} + +const PLACEMENT: Record = {MR: "MR", RIGID_BODY: "Rigid body", NOT_PLACED: "Not placed"}; + +// What the run made of the model, in the numbers of the report's MODEL VALIDATION section; mrSeconds is how long +// the molecular-replacement step took. Nothing is refined, so the R-factors are those of the model as placed. +// The strongest anomalous peak is shown only where the data carry anomalous signal: without it, it is noise. +export function ModelScores({m, mrSeconds, anomalousSignal}: + { m: rugnux_live_model, mrSeconds?: number, anomalousSignal: boolean }) { + const tiles: { label: string, value: string, sub?: string, accent?: boolean }[] = []; + let placedSub = m.reason || m.mr_decision; + if (m.placement === "MR" && m.copies != null) + placedSub = `${m.copies} ${m.copies === 1 ? "copy" : "copies"} in ${m.mr_space_group}` + + (mrSeconds !== undefined ? `, found in ${mrSeconds.toFixed(1)} s` : ""); + else if (m.placement === "RIGID_BODY") + placedSub = m.rigid_body_shift_A != null + ? `moved ${m.rigid_body_angle_deg?.toFixed(1)}° and ${m.rigid_body_shift_A.toFixed(2)} Å` + : "fits where it is"; + tiles.push({label: "Placement", value: PLACEMENT[m.placement] ?? m.placement, sub: placedSub, + accent: m.placement !== "NOT_PLACED"}); + if (m.tf_z != null) + tiles.push({label: "TFZ", value: m.tf_z.toFixed(1), + sub: [m.rf_z != null && `RFZ ${m.rf_z.toFixed(1)}`, m.llg_z != null && `LLG-Z ${m.llg_z.toFixed(1)}`, + m.mr_d_min != null && `search to ${m.mr_d_min.toFixed(1)} Å`].filter(Boolean).join(" · ")}); + if (m.r_free != null) + tiles.push({label: "R-free", value: m.r_free.toFixed(3), accent: true, + sub: `R-work ${m.r_work?.toFixed(3)} · model as placed, unrefined`}); + if (m.cc_model != null) + tiles.push({label: "CC (model, data)", value: m.cc_model.toFixed(2), sub: "intensities, all reflections"}); + if (m.fit_sigma != null) + tiles.push({label: "Fit over random", value: `${m.fit_sigma >= 0 ? "+" : ""}${m.fit_sigma.toFixed(1)} σ`, + sub: "R-work against the model in random orientations"}); + if (m.map_atom_sigma != null) + tiles.push({label: "2Fo−Fc at atoms", value: `${m.map_atom_sigma.toFixed(1)} σ`, sub: "mean at the atom centres"}); + if (anomalousSignal && m.anomalous_site && m.anomalous_site_sigma != null) + tiles.push({label: "Anomalous peak", value: `${m.anomalous_site_sigma.toFixed(1)} σ`, sub: m.anomalous_site}); + const rf = m.refinement; + if (rf && rf.performed && rf.r_free != null) + tiles.push({label: "R-free, refined", value: rf.r_free.toFixed(3), accent: true, + sub: [`R-work ${rf.r_work?.toFixed(3)}`, rf.rmsd_bonds_A != null && `bonds ${rf.rmsd_bonds_A.toFixed(3)} Å`, + `${rf.seconds.toFixed(1)} s on ${rf.on_gpu ? "GPU" : "CPU"}`, rf.cancelled && "cut short"] + .filter(Boolean).join(" · ")}); + else if (rf) + tiles.push({label: "Refinement", value: "failed", sub: rf.reason}); + if (rf && rf.performed) { + const count = (kind: string) => rf.blobs.filter(b => b.kind === kind).length; + const kinds = ([["LIGAND", "ligand"], ["WATER", "water"], ["ION", "ion"], ["MODEL_ERROR", "model error"]] as const) + .map(([k, label]) => count(k) > 0 && `${count(k)} ${label}`).filter(Boolean).join(" · "); + tiles.push({label: "Unexplained blobs", value: String(rf.blob_count), + sub: (rf.blob_count > rf.blobs.length ? `strongest ${rf.blobs.length}: ` : "") + (kinds || "mFo−DFc above 4 σ")}); + } + return ( + + {tiles.map(t => )} + + ); +} diff --git a/frontend/src/components/RugnuxStructureViewer.tsx b/frontend/src/components/RugnuxStructureViewer.tsx index cd92d0108..c69c23445 100644 --- a/frontend/src/components/RugnuxStructureViewer.tsx +++ b/frontend/src/components/RugnuxStructureViewer.tsx @@ -7,11 +7,16 @@ import {applyModelDisplay, clearScene, getStructureAtoms, getStructureBox, Loade from "./structure/loadModel"; import {loadMapLayer, MAP_COLORS, MapLayer, setLayerVisible, updateLayerSigma} from "./structure/loadMaps"; import {fullCellFromCcp4, prepareMap} from "./structure/densityCrop"; +import {revealCamera} from "./structure/reveal"; +import {Blob, BLOB_COLORS, loadBlobs, setBlobsVisible} from "./structure/loadBlobs"; -// The model rugnux live placed, with its 2mFo-DFc, mFo-DFc and (where the merge kept the Bijvoet pairs) anomalous +// The model rugnux live placed - refined, where the run refined it, with the unexplained blobs of its difference map as +// markers (off at first) - with its 2mFo-DFc, mFo-DFc and (where the merge kept the Bijvoet pairs) anomalous // difference maps, in Mol*. Set up as aaredb's structure viewer (gitea.psi.ch/mx/aaredb, pages/StructureView.tsx // and components/Structure/, the PSI MX group's own code): its plugin, Coot mouse controls, model presets, map -// meshes, crop and carve, panel and defaults - on a black stage. Mol* is only loaded with this component +// meshes, crop and carve, panel and defaults - on a black stage. Departures for the live page: every map is carved +// within the same radius of the atoms (aaredb carves 2Fo-Fc only), Fo-Fc starts at +-3.5 sigma, the anomalous map +// is shown at first only where the data carry anomalous signal, and the first model makes an entrance (reveal.ts). Mol* is only loaded with this component // (React.lazy in RugnuxPage), and every Mol* import lives in ./structure. type Kind = 'twofofc' | 'fofc' | 'anom'; @@ -60,8 +65,19 @@ async function fetchBytes(path: string, signal: AbortSignal): Promise window.matchMedia?.('(prefers-reduced-motion: reduce)').matches ?? false; +const nextFrames = () => new Promise(r => requestAnimationFrame(() => requestAnimationFrame(r))); + +const BLOB_LABELS: [string, string][] = [['LIGAND', 'ligand'], ['WATER', 'water'], ['ION', 'ion'], + ['MODEL_ERROR', 'model error'], ['UNASSIGNED', 'other']]; + +// resultKey: changes when a new result is there to load; anomalous: it has an anomalous difference map; +// anomalousSignal: the data carry usable anomalous signal, so that map is worth showing from the start; +// refined: the broker serves the refined model and its maps; blobs: what the refined model leaves unexplained. +function RugnuxStructureViewer({resultKey, anomalous, anomalousSignal, refined, blobs}: + { resultKey: string, anomalous: boolean, anomalousSignal: boolean, + refined: boolean, blobs: Blob[] }) { const pluginRef = useRef(null); const [pluginReady, setPluginReady] = useState(0); const [error, setError] = useState(); @@ -73,22 +89,29 @@ function RugnuxStructureViewer({resultKey, anomalous}: { resultKey: string, anom // First load frames the molecule; later results keep the user's camera and clip (aaredb StructureView.tsx:117-121) const sceneLoadedRef = useRef(false); const [hasMap, setHasMap] = useState>({twofofc: false, fofc: false, anom: false}); + // The stage stays dark until the first model and its maps are in, then fades up as the camera eases in. + const [revealed, setRevealed] = useState(false); - // aaredb factory defaults (state/viewerDefaults.ts:16-23); anomalous as a difference map, +4 sigma - const [show, setShow] = useState>({twofofc: true, fofc: true, anom: true}); - const [sigma, setSigma] = useState>({twofofc: 1.0, fofc: 3.0, anom: 4.0}); + // aaredb factory defaults (state/viewerDefaults.ts:16-23), but Fo-Fc at +-3.5 sigma rather than 3: carved or not, + // a difference map at 3 sigma over a whole molecule shows dozens of noise peaks; anomalous as a difference map, + // +4 sigma + const [show, setShow] = useState>({twofofc: true, fofc: true, anom: anomalousSignal}); + const [sigma, setSigma] = useState>({twofofc: 1.0, fofc: 3.5, anom: 4.0}); const [reprMode, setReprMode] = useState('cartoon'); const [showWaters, setShowWaters] = useState(false); - const displayRef = useRef({show, sigma, reprMode, showWaters}); - displayRef.current = {show, sigma, reprMode, showWaters}; + // The blobs can be dozens of waters: off until asked for + const [showBlobs, setShowBlobs] = useState(false); + const blobRefsRef = useRef([]); + const displayRef = useRef({show, sigma, reprMode, showWaters, showBlobs}); + displayRef.current = {show, sigma, reprMode, showWaters, showBlobs}; const onPluginReady = useCallback((plugin: PluginContext) => { pluginRef.current = plugin; setPluginReady(n => n + 1); }, []); - // The model, then its maps (aaredb StructureView.tsx maybeLoad / computeAndAttachMaps, 212-295): 2Fo-Fc cropped - // to the model's box + 6 A and carved 4.5 A around the atoms; the difference maps cropped only. + // The model, then its maps (aaredb StructureView.tsx maybeLoad / computeAndAttachMaps, 212-295): each map cropped + // to the model's box + 6 A and carved 4.5 A around the atoms. useEffect(() => { const plugin = pluginRef.current; if (!plugin) @@ -101,6 +124,7 @@ function RugnuxStructureViewer({resultKey, anomalous}: { resultKey: string, anom try { await clearScene(plugin); layersRef.current = {}; + blobRefsRef.current = []; setHasMap({twofofc: false, fofc: false, anom: false}); const [cif, map2, map1, mapA] = await Promise.all([ fetchBytes("/rugnux/model.cif", abort.signal), @@ -113,7 +137,8 @@ function RugnuxStructureViewer({resultKey, anomalous}: { resultKey: string, anom setError("No placed model"); return; } - const loaded = await loadModel(plugin, cif, 'model', {resetCamera: !sceneLoadedRef.current, format: 'mmcif'}); + const firstScene = !sceneLoadedRef.current; + const loaded = await loadModel(plugin, cif, 'model', {resetCamera: firstScene, format: 'mmcif'}); sceneLoadedRef.current = true; modelRefsRef.current = loaded.refs; const d = displayRef.current; @@ -121,6 +146,8 @@ function RugnuxStructureViewer({resultKey, anomalous}: { resultKey: string, anom const box = getStructureBox(loaded.structure); const crop = box ? {...box, marginA: 6} : null; const atoms = getStructureAtoms(loaded.structure); + if (blobs.length > 0) + blobRefsRef.current = await loadBlobs(plugin, blobs, d.showBlobs); setModelLoading(false); setMapsLoading(true); const maps: [Kind, '2fofc' | 'fofc' | 'anom', ArrayBuffer | undefined][] = @@ -128,14 +155,18 @@ function RugnuxStructureViewer({resultKey, anomalous}: { resultKey: string, anom for (const [kind, name, bytes] of maps) { if (!bytes || abort.signal.aborted) continue; - const computed = prepareMap(name, fullCellFromCcp4(bytes), crop, - kind === 'twofofc' && atoms.length ? atoms : null); + const computed = prepareMap(name, fullCellFromCcp4(bytes), crop, atoms.length ? atoms : null); const layer = await loadMapLayer(plugin, computed, name, d.sigma[kind]); layersRef.current[kind] = layer; if (!displayRef.current.show[kind]) setLayerVisible(plugin, layer, false); setHasMap(h => ({...h, [kind]: true})); } + if (firstScene && !abort.signal.aborted) { + await nextFrames(); // the camera reset loadModel asked for is applied on a draw + if (!reducedMotion()) + revealCamera(plugin, REVEAL_MS); + } } catch (e) { if (!abort.signal.aborted) setError(e instanceof Error ? e.message : String(e)); @@ -143,6 +174,7 @@ function RugnuxStructureViewer({resultKey, anomalous}: { resultKey: string, anom if (!abort.signal.aborted) { setModelLoading(false); setMapsLoading(false); + setRevealed(true); } } })(); @@ -178,20 +210,31 @@ function RugnuxStructureViewer({resultKey, anomalous}: { resultKey: string, anom applyModelDisplay(plugin, modelRefsRef.current, mode, waters); }, []); + const toggleBlobs = useCallback((visible: boolean) => { + setShowBlobs(visible); + const plugin = pluginRef.current; + if (plugin) + setBlobsVisible(plugin, blobRefsRef.current, visible); + }, []); + const mapsDisabled = mapsLoading; return ( - - - {modelLoading && !error && + + + + {(modelLoading || (mapsLoading && !revealed)) && !error && - loading model… + + {modelLoading ? 'loading model…' : 'computing density maps…'} } {error && {error}} - Model + {refined ? 'Model · refined' : 'Model'} {(['cartoon', 'sticks', 'both'] as const).map((m) => ( No maps} + {blobs.length > 0 && <> + Unexplained blobs + + {blobs.length} in mFo−DFc + toggleBlobs(e.target.checked)}/> + + + {BLOB_LABELS.filter(([k]) => blobs.some(b => b.kind === k)).map(([k, label]) => ( + + + + {blobs.filter(b => b.kind === k).length} {label} + + ))} + + } + Controls {([ ['left drag', 'rotate'], diff --git a/frontend/src/components/structure/densityCrop.ts b/frontend/src/components/structure/densityCrop.ts index 36fb3bbf9..3cf1597fe 100644 --- a/frontend/src/components/structure/densityCrop.ts +++ b/frontend/src/components/structure/densityCrop.ts @@ -1,6 +1,6 @@ // The density preparation of aaredb's density worker (gitea.psi.ch/mx/aaredb, the PSI MX group's own code, // frontend/public/structure-worker/density-worker.js at 8ece2c2): crop the periodic map to the model's box plus a -// margin, carve the 2Fo-Fc map around the atoms, encode as CCP4 with the full cell's mean and RMS. aaredb computes +// margin, carve it around the atoms, encode as CCP4 with the full cell's mean and RMS. aaredb computes // the full-cell map from an MTZ with gemmi wasm; here the broker serves it (/rugnux/map.ccp4), so it is first read // back into aaredb's full-cell z-fastest grid (fullCellFromCcp4). @@ -226,8 +226,9 @@ function carveBlock(block: Float32Array, start: number[], dims: number[], n: num } } -/* One map as the worker's onmessage loop makes it: cropped to `crop`, carved around `carveAtoms` (2Fo-Fc only - - * never a difference map: unmodelled blobs sit away from every atom), with the full cell's mean and RMS. */ +/* One map as the worker's onmessage loop makes it: cropped to `crop`, carved around `carveAtoms`, with the full + * cell's mean and RMS. aaredb carves the 2Fo-Fc map only; the live page carves the difference maps as well, within + * the same radius, so what it shows is the density about the model - unmodelled blobs further away are left out. */ export function prepareMap(name: string, full: FullCellMap, crop: CropBox | null, carveAtoms: Float32Array | null, carveRadiusA = 4.5): ComputedMap { const [nx, ny, nz] = full.n; diff --git a/frontend/src/components/structure/loadBlobs.ts b/frontend/src/components/structure/loadBlobs.ts new file mode 100644 index 000000000..8083dbae2 --- /dev/null +++ b/frontend/src/components/structure/loadBlobs.ts @@ -0,0 +1,56 @@ +import { PluginContext } from 'molstar/lib/mol-plugin/context'; +import { setSubtreeVisibility } from 'molstar/lib/mol-plugin/behavior/static/state'; +import { Color } from 'molstar/lib/mol-util/color'; + +// The unexplained blobs of the refined model's difference map as small spheres, one structure per reading so each +// gets its own colour. Colours stay clear of the maps (blue 2Fo-Fc, green/red Fo-Fc, magenta anomalous) and of the +// chain palette (loadModel.ts). +export const BLOB_COLORS: Record = { + LIGAND: 0xffe000, // yellow + WATER: 0x40e0ff, // cyan + ION: 0xffffff, // white + MODEL_ERROR: 0xff8c00, // orange + UNASSIGNED: 0x9e9e9e, // grey +}; + +// What the hover label shows as the residue name +const RESIDUE: Record = {LIGAND: 'LIG', WATER: 'WAT', ION: 'ION', MODEL_ERROR: 'ERR', UNASSIGNED: 'UNK'}; + +export interface Blob { kind: string; x: number; y: number; z: number; peak_sigma: number; } + +// One PDB HETATM record (fixed columns): the peak height in sigma goes in the B column. +function hetatm(serial: number, b: Blob): string { + const num = (v: number, w: number, d: number) => v.toFixed(d).padStart(w); + return 'HETATM' + String(serial).padStart(5) + ' O ' + (RESIDUE[b.kind] ?? 'UNK') + ' X' + + String(serial).padStart(4) + ' ' + num(b.x, 8, 3) + num(b.y, 8, 3) + num(b.z, 8, 3) + + ' 1.00' + num(Math.min(b.peak_sigma, 999), 6, 2) + ' O'; +} + +/** Load the blobs; returns the refs to show or hide them by (setBlobsVisible). */ +export async function loadBlobs(plugin: PluginContext, blobs: Blob[], visible: boolean): Promise { + const refs: string[] = []; + for (const [kind, color] of Object.entries(BLOB_COLORS)) { + const mine = blobs.filter(b => b.kind === kind); + if (mine.length === 0) + continue; + const pdb = mine.map((b, i) => hetatm(i + 1, b)).join('\n') + '\nEND\n'; + const data = await plugin.builders.data.rawData({ data: pdb, label: `blobs ${kind}` }); + const trajectory = await plugin.builders.structure.parseTrajectory(data, 'pdb'); + const model = await plugin.builders.structure.createModel(trajectory); + const structure = await plugin.builders.structure.createStructure(model); + await plugin.builders.structure.representation.addRepresentation(structure, { + type: 'spacefill', + typeParams: { sizeFactor: 0.45 }, + color: 'uniform', + colorParams: { value: Color(color) }, + }); + refs.push(data.ref); + if (!visible) setSubtreeVisibility(plugin.state.data, data.ref, true); + } + return refs; +} + +export function setBlobsVisible(plugin: PluginContext, refs: string[], visible: boolean): void { + // setSubtreeVisibility's boolean is "isHidden" + for (const ref of refs) setSubtreeVisibility(plugin.state.data, ref, !visible); +} diff --git a/frontend/src/components/structure/reveal.ts b/frontend/src/components/structure/reveal.ts new file mode 100644 index 000000000..14a9e8103 --- /dev/null +++ b/frontend/src/components/structure/reveal.ts @@ -0,0 +1,16 @@ +import { PluginContext } from 'molstar/lib/mol-plugin/context'; +import { Quat, Vec3 } from 'molstar/lib/mol-math/linear-algebra'; + +// The entrance of a freshly placed model: the camera starts further out and turned a little about the vertical, +// then eases in to the view a plain reset frames. Only the camera moves, and it ends exactly where the reset put +// it, so nothing after the reveal differs from a viewer without one. +export function revealCamera(plugin: PluginContext, durationMs: number): void { + const camera = plugin.canvas3d?.camera; + if (!camera) return; + const end = camera.getSnapshot(); + const dir = Vec3.sub(Vec3(), end.position, end.target); + Vec3.transformQuat(dir, dir, Quat.setAxisAngle(Quat(), end.up, -0.6)); // about 35 degrees + Vec3.scale(dir, dir, 2.2); + camera.setState({ ...end, position: Vec3.add(Vec3(), end.target, dir) }, 0); + camera.setState(end, durationMs, { easing: 'cubic-out' }); +} diff --git a/frontend/src/version.ts b/frontend/src/version.ts index c4bf15db1..121287506 100644 --- a/frontend/src/version.ts +++ b/frontend/src/version.ts @@ -1 +1 @@ -export const JFJOCH_VERSION : string = "1.0.0-rc.179"; \ No newline at end of file +export const JFJOCH_VERSION : string = "1.0.0-rc.180"; \ No newline at end of file diff --git a/gemmi_gph/CMakeLists.txt b/gemmi_gph/CMakeLists.txt index c9c129ecf..c2e2b01ed 100644 --- a/gemmi_gph/CMakeLists.txt +++ b/gemmi_gph/CMakeLists.txt @@ -11,11 +11,15 @@ # against the data on disk. to_mmcif.cpp calls use_hetatm() out of to_pdb.cpp, so the two come together. # # assembly.cpp expands a deposited model's strict-NCS operators into the full asymmetric unit. +# +# monlib/topo/riding_h are the restraint side: a monomer library read from memory (MonLib) and the +# topology of a model built from it (prepare_topology), for rugnux's restrained refinement. ADD_LIBRARY(gemmi STATIC symmetry.cpp gz.cpp mtz.cpp sprintf.cpp xds_ascii.cpp pdb.cpp resinfo.cpp polyheur.cpp calculate.cpp eig3.cpp ccp4.cpp read_cif.cpp mmcif.cpp json.cpp mmread_gz.cpp to_mmcif.cpp to_pdb.cpp assembly.cpp + monlib.cpp topo.cpp riding_h.cpp gemmi/cellred.hpp gemmi/symmetry.hpp gemmi/fail.hpp diff --git a/gemmi_gph/monlib.cpp b/gemmi_gph/monlib.cpp new file mode 100644 index 000000000..887529b7f --- /dev/null +++ b/gemmi_gph/monlib.cpp @@ -0,0 +1,633 @@ +// Copyright 2018-2023 Global Phasing Ltd. + +#include +#include // for calculate_chiral_volume +#include // for rename_atom_names +#include // for read_cif_gz +#include // for as_number + +namespace gemmi { + +int ChemLink::calculate_score(const Residue& res1, const Residue* res2, + char alt, char alt2, + const ChemComp::Aliasing* aliasing1, + const ChemComp::Aliasing* aliasing2) const { + int link_score = side1.specificity() + side2.specificity(); + + auto get_from = [&](const Restraints::AtomId& atomid) { + const auto* aliasing = (atomid.comp != 2 || res2 == nullptr) ? aliasing1 : aliasing2; + if (aliasing) + if (const std::string* real_id = aliasing->name_from_alias(atomid.atom)) + return Restraints::AtomId{atomid.comp, *real_id}.get_from(res1, res2, alt, alt2); + return atomid.get_from(res1, res2, alt, alt2); + }; + + // check chirality + for (const Restraints::Chirality& chirality : rt.chirs) + if (chirality.sign != ChiralityType::Both) { + const Atom* a1 = get_from(chirality.id_ctr); + const Atom* a2 = get_from(chirality.id1); + const Atom* a3 = get_from(chirality.id2); + const Atom* a4 = get_from(chirality.id3); + if (a1 && a2 && a3 && a4) { + double vol = calculate_chiral_volume(a1->pos, a2->pos, + a3->pos, a4->pos); + if (chirality.is_wrong(vol)) + link_score -= 10; + } + } + // check fixed torsion angle (_chem_link_tor.period == 0) + for (const Restraints::Torsion& tor : rt.torsions) + if (tor.period == 0) { + const Atom* a1 = get_from(tor.id1); + const Atom* a2 = get_from(tor.id2); + const Atom* a3 = get_from(tor.id3); + const Atom* a4 = get_from(tor.id4); + double z = 10.; + if (a1 && a2 && a3 && a4) + z = angle_z(calculate_dihedral(a1->pos, a2->pos, a3->pos, a4->pos), + tor); + link_score -= (int) z; + } + return link_score; +} + +namespace { + +Restraints read_link_restraints(const cif::Block& block_) { + auto read_aid = [](cif::Table::Row& row, int n) { + return Restraints::AtomId{cif::as_int(row[n]), row.str(n+1)}; + }; + Restraints rt; + cif::Block& block = const_cast(block_); + for (auto row : block.find("_chem_link_bond.", + {"atom_1_comp_id", "atom_id_1", + "atom_2_comp_id", "atom_id_2", + "type", + "value_dist", "value_dist_esd"})) + rt.bonds.push_back({read_aid(row, 0), read_aid(row, 2), + bond_type_from_string(row[4]), false, + cif::as_number(row[5]), cif::as_number(row[6]), + NAN, NAN}); + for (auto row : block.find("_chem_link_angle.", + {"atom_1_comp_id", "atom_id_1", + "atom_2_comp_id", "atom_id_2", + "atom_3_comp_id", "atom_id_3", + "value_angle", "value_angle_esd"})) + rt.angles.push_back({read_aid(row, 0), read_aid(row, 2), read_aid(row, 4), + cif::as_number(row[6]), cif::as_number(row[7])}); + for (auto row : block.find("_chem_link_tor.", + {"id", + "atom_1_comp_id", "atom_id_1", + "atom_2_comp_id", "atom_id_2", + "atom_3_comp_id", "atom_id_3", + "atom_4_comp_id", "atom_id_4", + "value_angle", "value_angle_esd", + "period"})) + rt.torsions.push_back({row.str(0), + read_aid(row, 1), read_aid(row, 3), + read_aid(row, 5), read_aid(row, 7), + cif::as_number(row[9]), cif::as_number(row[10]), + cif::as_int(row[11])}); + for (auto row : block.find("_chem_link_chir.", + {"atom_centre_comp_id", "atom_id_centre", + "atom_1_comp_id", "atom_id_1", + "atom_2_comp_id", "atom_id_2", + "atom_3_comp_id", "atom_id_3", + "volume_sign"})) + if (row[4][0] != 'c') // ignore crossN + rt.chirs.push_back({read_aid(row, 0), read_aid(row, 2), + read_aid(row, 4), read_aid(row, 6), + chirality_from_string(row[8])}); + for (auto row : block.find("_chem_link_plane.", + {"plane_id", "atom_comp_id", "atom_id", + "dist_esd"})) { + Restraints::Plane& plane = rt.get_or_add_plane(row.str(0)); + if (plane.esd == 0.0) + plane.esd = cif::as_number(row[3]); + plane.ids.push_back(read_aid(row, 1)); + } + return rt; +} + +void insert_chemlinks_into(const cif::Document& doc, std::map& links) { + const cif::Block* list_block = doc.find_block("link_list"); + auto use_chem_link = [](const cif::Block& block, ChemLink& link) { + for (auto row : const_cast(block).find("_chem_link.", + {"id", "?name", + "?comp_id_1", "?mod_id_1", "?group_comp_1", + "?comp_id_2", "?mod_id_2", "?group_comp_2"})) { + if (row.str(0) == link.id) { + if (row.has2(1)) + link.name = row.str(1); + if (row.has2(2)) + link.side1.comp = row.str(2); + if (row.has2(3)) + link.side1.mod = row.str(3); + if (row.has2(4)) + link.side1.group = ChemComp::read_group(row[4]); + if (row.has2(5)) + link.side2.comp = row.str(5); + if (row.has2(6)) + link.side2.mod = row.str(6); + link.side2.group = ChemComp::read_group(row[7]); + break; + } + } + }; + for (const cif::Block& block : doc.blocks) + if (starts_with(block.name, "link_") && block.name != "link_list") { + ChemLink link; + link.id = block.name.substr(5); + if (list_block) + use_chem_link(*list_block, link); + use_chem_link(block, link); + link.rt = read_link_restraints(block); + link.block = block; + links.emplace(link.id, link); + } +} + +// Helper function. str is one of "add", "delete", "change". +int chem_mod_type(const std::string& str) { + char c = str[0] | 0x20; + if (c != 'a' && c != 'd' && c != 'c') + fail("Unexpected value of _chem_mod_*.function: " + str); + return c; +} + +Restraints read_restraint_modifications(const cif::Block& block_) { + Restraints rt; + cif::Block& block = const_cast(block_); + for (auto row : block.find("_chem_mod_bond.", + {"function", "atom_id_1", "atom_id_2", + "new_type", + "new_value_dist", "new_value_dist_esd", + "?new_value_dist_nucleus", "?new_value_dist_nucleus_esd"})) + rt.bonds.push_back({Restraints::AtomId{chem_mod_type(row[0]), row.str(1)}, + Restraints::AtomId{1, row.str(2)}, + bond_type_from_string(row[3]), false, + cif::as_number(row[4]), cif::as_number(row[5]), + row.has(6) ? cif::as_number(row[6]) : NAN, + row.has(7) ? cif::as_number(row[7]) : NAN}); + for (auto row : block.find("_chem_mod_angle.", + {"function", "atom_id_1", + "atom_id_2", "atom_id_3", + "new_value_angle", "new_value_angle_esd"})) + rt.angles.push_back({{chem_mod_type(row[0]), row.str(1)}, + {1, row.str(2)}, {1, row.str(3)}, + cif::as_number(row[4]), cif::as_number(row[5])}); + for (auto row : block.find("_chem_mod_tor.", + {"function", "?id", "atom_id_1", + "atom_id_2", "atom_id_3", "atom_id_4", + "new_value_angle", "new_value_angle_esd", + "?new_period"})) + rt.torsions.push_back({row.has(1) ? row.str(1) : "", + {chem_mod_type(row[0]), row.str(2)}, + {1, row.str(3)}, {1, row.str(4)}, {1, row.str(5)}, + cif::as_number(row[6]), cif::as_number(row[7]), + row.has(8) ? cif::as_int(row[8], 0) : -1}); + for (auto row : block.find("_chem_mod_chir.", + {"function", "atom_id_centre", "atom_id_1", + "atom_id_2", "atom_id_3", + "new_volume_sign"})) + rt.chirs.push_back({{1, row.str(1)}, {chem_mod_type(row[0]), row.str(2)}, + {1, row.str(3)}, {1, row.str(4)}, + chirality_from_string(row[5])}); + for (auto row : block.find("_chem_mod_plane_atom.", + {"function", "plane_id", "atom_id" , + "new_dist_esd"})) { + Restraints::Plane& plane = rt.get_or_add_plane(row.str(1)); + if (plane.esd == 0.0) + plane.esd = cif::as_number(row[3]); + plane.ids.push_back({chem_mod_type(row[0]), row.str(2)}); + } + return rt; +} + +void insert_chemmods_into(const cif::Document& doc, std::map& mods) { + const cif::Block* list_block = doc.find_block("mod_list"); + auto use_chem_mod = [](const cif::Block& block, ChemMod& mod) { + for (auto row : const_cast(block).find("_chem_mod.", + {"id", "?name", "?comp_id", "?group_id"})) + if (row.str(0) == mod.id) { + if (row.has2(1)) + mod.name = row.str(1); + if (row.has2(2)) + mod.comp_id = row.str(2); + if (row.has2(3)) + mod.group_id = row.str(3); + break; + } + }; + for (const cif::Block& block : doc.blocks) + if (starts_with(block.name, "mod_") && block.name != "mod_list") { + ChemMod mod; + mod.id = block.name.substr(4); + if (list_block) + use_chem_mod(*list_block, mod); + use_chem_mod(block, mod); + for (auto ra : const_cast(block).find("_chem_mod_atom.", + {"function", "atom_id", "new_atom_id", + "new_type_symbol", "new_type_energy", + "?new_charge", "?new_partial_charge"})) + mod.atom_mods.push_back({chem_mod_type(ra[0]), ra.str(1), ra.str(2), + Element(ra.str(3)), + (float) cif::as_number(ra.one_of(5, 6)), + ra.str(4)}); + mod.rt = read_restraint_modifications(block); + mod.block = block; + mods.emplace(mod.id, mod); + } +} + +} // anonymous namespace + +void ChemMod::apply_to(ChemComp& chemcomp, ChemComp::Group alias_group) const { + auto real = [&chemcomp, alias_group](const std::string& atom_id) -> const std::string& { + if (alias_group != ChemComp::Group::Null) { + const ChemComp::Aliasing& aliasing = chemcomp.get_aliasing(alias_group); + if (const std::string* real_id = aliasing.name_from_alias(atom_id)) + return *real_id; + } + return atom_id; // NOLINT(bugprone-return-const-ref-from-parameter) + }; + cat_to(chemcomp.name, '+', id); + // _chem_mod_atom + for (const AtomMod& mod : atom_mods) { + if (mod.func == 'a') { + if (mod.new_id.empty()) + fail("New atom id is not given"); + if (!chemcomp.has_atom(real(mod.new_id))) + chemcomp.atoms.push_back({mod.new_id, "", mod.el, + std::isnan(mod.charge) ? mod.charge : 0, + mod.chem_type, "", Position()}); + continue; + } + const std::string& old = real(mod.old_id); + auto it = chemcomp.find_atom(old); + switch (mod.func) { + case 'd': + if (it != chemcomp.atoms.end()) { + chemcomp.atoms.erase(it); + // delete restraints containing mod.old_id + vector_remove_if(chemcomp.rt.bonds, [&](const Restraints::Bond& b) { + return b.id1 == old || b.id2 == old; + }); + vector_remove_if(chemcomp.rt.angles, [&](const Restraints::Angle& a) { + return a.id1 == old || a.id2 == old || a.id3 == old; + }); + vector_remove_if(chemcomp.rt.torsions, + [&](const Restraints::Torsion& t) { + return t.id1 == old || t.id2 == old || t.id3 == old || + t.id4 == old; + }); + vector_remove_if(chemcomp.rt.chirs, + [&](const Restraints::Chirality& c) { + return c.id_ctr == old || c.id1 == old || c.id2 == old || + c.id3 == old; + }); + for (Restraints::Plane& plane : chemcomp.rt.planes) + vector_remove_if(plane.ids, [&](const Restraints::AtomId& a) { + return a.atom == old; + }); + } + break; + case 'c': + if (it != chemcomp.atoms.end()) { + // the modification shouldn't change the atom name, so we don't do: + // if (!mod.new_id.empty()) + // it->id = mod.new_id; + if (mod.el != El::X) + it->el = mod.el; + if (!std::isnan(mod.charge)) + it->charge = mod.charge; + if (!mod.chem_type.empty()) + it->chem_type = mod.chem_type; + } + break; + } + } + + // _chem_mod_bond + for (const Restraints::Bond& mod : rt.bonds) { + auto it = chemcomp.rt.find_bond(real(mod.id1.atom), real(mod.id2.atom)); + switch (mod.id1.comp) { + case 'a': + if (it == chemcomp.rt.bonds.end()) { + chemcomp.rt.bonds.push_back(mod); + // id1.comp was temporarily set to 'a', set it back to 1 + chemcomp.rt.bonds.back().id1.comp = 1; + } + break; + case 'd': + if (it != chemcomp.rt.bonds.end()) + chemcomp.rt.bonds.erase(it); + break; + case 'c': + if (it != chemcomp.rt.bonds.end()) { + if (mod.type != BondType::Unspec) + it->type = mod.type; + if (!std::isnan(mod.value)) + it->value = mod.value; + if (!std::isnan(mod.esd)) + it->esd = mod.esd; + if (!std::isnan(mod.value_nucleus)) + it->value_nucleus = mod.value_nucleus; + if (!std::isnan(mod.esd_nucleus)) + it->esd_nucleus = mod.esd_nucleus; + } + break; + } + } + + // _chem_mod_angle + for (const Restraints::Angle& mod : rt.angles) { + auto it = chemcomp.rt.find_angle(real(mod.id1.atom), + real(mod.id2.atom), + real(mod.id3.atom)); + switch (mod.id1.comp) { + case 'a': + if (it == chemcomp.rt.angles.end()) { + chemcomp.rt.angles.push_back(mod); + chemcomp.rt.angles.back().id1.comp = 1; + } + break; + case 'd': + if (it != chemcomp.rt.angles.end()) + chemcomp.rt.angles.erase(it); + break; + case 'c': + if (it != chemcomp.rt.angles.end()) { + if (!std::isnan(mod.value)) + it->value = mod.value; + if (!std::isnan(mod.esd)) + it->esd = mod.esd; + } + break; + } + } + + // _chem_mod_tor + for (const Restraints::Torsion& mod : rt.torsions) { + auto it = chemcomp.rt.find_torsion(real(mod.id1.atom), real(mod.id2.atom), + real(mod.id3.atom), real(mod.id4.atom)); + switch (mod.id1.comp) { + case 'a': + if (it == chemcomp.rt.torsions.end()) { + chemcomp.rt.torsions.push_back(mod); + chemcomp.rt.torsions.back().id1.comp = 1; + } + break; + case 'd': + if (it != chemcomp.rt.torsions.end()) + chemcomp.rt.torsions.erase(it); + break; + case 'c': + if (it != chemcomp.rt.torsions.end()) { + if (!mod.label.empty()) + it->label = mod.label; + if (!std::isnan(mod.value)) + it->value = mod.value; + if (!std::isnan(mod.esd)) + it->esd = mod.esd; + if (mod.period != -1) + it->period = mod.period; + } + break; + } + } + + // _chem_mod_chir + for (const Restraints::Chirality& mod : rt.chirs) { + auto it = chemcomp.rt.find_chir(real(mod.id_ctr.atom), real(mod.id1.atom), + real(mod.id2.atom), real(mod.id3.atom)); + switch (mod.id1.comp) { + case 'a': + if (it == chemcomp.rt.chirs.end()) { + chemcomp.rt.chirs.push_back(mod); + chemcomp.rt.chirs.back().id1.comp = 1; + } + break; + case 'd': + if (it != chemcomp.rt.chirs.end()) + chemcomp.rt.chirs.erase(it); + break; + case 'c': + if (it != chemcomp.rt.chirs.end()) + it->sign = mod.sign; + break; + } + } + + // _chem_mod_plane_atom + for (const Restraints::Plane& mod : rt.planes) + for (const Restraints::AtomId& atom_id : mod.ids) { + const std::string& real_id = real(atom_id.atom); + if (atom_id.comp == 'a') { + Restraints::Plane& plane = chemcomp.rt.get_or_add_plane(mod.label); + if (plane.esd == 0.0 && !std::isnan(mod.esd)) + plane.esd = mod.esd; + auto it = std::find(plane.ids.begin(), plane.ids.end(), real_id); + if (it == plane.ids.end()) + plane.ids.push_back({1, real_id}); + } else if (atom_id.comp == 'd') { + auto it = chemcomp.rt.get_plane(mod.label); + if (it != chemcomp.rt.planes.end()) { + auto item = std::find(it->ids.begin(), it->ids.end(), real_id); + if (item != it->ids.end()) + it->ids.erase(item); + } + } + } +} + +void EnerLib::read(const cif::Document& doc) { + cif::Block& block = const_cast(doc.blocks[0]); + for (const auto& row : block.find("_lib_atom.", + {"type", "hb_type", "vdw_radius", "vdwh_radius", + "ion_radius", "element", "valency", "sp"})) + atoms.emplace(row[0], Atom{Element(row[5]), row[1][0], cif::as_number(row[2]), + cif::as_number(row[3]), cif::as_number(row[4]), + cif::as_int(row[6], -1), cif::as_int(row[7], -1)}); + for (const auto& row : block.find("_lib_bond.", + {"atom_type_1", "atom_type_2", "type", "length", "value_esd"})) + bonds.emplace(row.str(0), Bond{row.str(1), bond_type_from_string(row[2]), + cif::as_number(row[3]), cif::as_number(row[4])}); +} + +std::string MonLib::relative_monomer_path(const std::string& code) { + std::string path; + if (!code.empty()) { + path += lower(code[0]); + path += '/'; // works also on Windows + path += code; + // On Windows several names are reserved (CON, PRN, AUX, ...), see + // https://docs.microsoft.com/en-us/windows/win32/fileio/naming-a-file + // The workaround in CCP4 monomer library is to use CON_CON.cif, etc. + if (code.size() == 3) + switch (ialpha3_id(code.c_str())) { + case ialpha3_id("AUX"): + case ialpha3_id("COM"): + case ialpha3_id("CON"): + case ialpha3_id("LPT"): + case ialpha3_id("PRN"): + path += '_'; + path += code; + } + path += ".cif"; + } + return path; +} + +void MonLib::read_monomer_doc(const cif::Document& doc) { + // ChemComp + if (const cif::Block* block = doc.find_block("comp_list")) + for (auto row : const_cast(block)->find("_chem_comp.", {"id", "group"})) + cc_groups.emplace(row.str(0), ChemComp::read_group(row.str(1))); + for (const cif::Block& block : doc.blocks) + add_monomer_if_present(block); + // ChemLink + insert_chemlinks_into(doc, links); + // ChemMod + insert_chemmods_into(doc, modifications); +} + +namespace { + +const std::string* find_chemtype(const std::map& monomers, + const const_CRA& cra) { + auto cc = monomers.find(cra.residue->name); + if (cc != monomers.end()) { + auto cc_atom = cc->second.find_atom(cra.atom->name); + if (cc_atom != cc->second.atoms.end()) + return &cc_atom->chem_type; + } + return nullptr; +} + +// Searches data from _lib_atom in ener_lib.cif. +double find_radius(const EnerLib& ener_lib, const std::string& chemtype, + EnerLib::RadiusType type) { + double r = 0; + auto it = ener_lib.atoms.find(chemtype); + if (it != ener_lib.atoms.end()) { + if (type == EnerLib::RadiusType::Ion) + r = it->second.ion_radius; + else if (type == EnerLib::RadiusType::Vdw) + r = it->second.vdw_radius; + else if (type == EnerLib::RadiusType::Vdwh) + r = it->second.vdwh_radius; + } + return std::isnan(r) ? 0 : r; +} + +} // anonymous namespace + +void MonLib::read_monomer_cif(const std::string& path_) { + read_monomer_doc(read_cif_gz(path_)); +} + +bool MonLib::read_monomer_lib(const std::string& monomer_dir_, + const std::vector& resnames, + const Logger& logger) { + if (monomer_dir_.empty()) + fail("read_monomer_lib: monomer_dir not specified."); + set_monomer_dir(monomer_dir_); + + // Only recent versions of CCP4 Monomer Library have links_and_mods.cif + try { + read_monomer_cif(monomer_dir + "links_and_mods.cif"); + } catch (std::system_error&) { + read_monomer_cif(monomer_dir + "list/mon_lib_list.cif"); + } + ener_lib.read(read_cif_gz(monomer_dir + "ener_lib.cif")); + + bool ok = true; + for (const std::string& name : resnames) { + if (monomers.find(name) != monomers.end()) + continue; + try { + const cif::Document& doc = read_cif_gz(path(name)); + read_monomer_doc(doc); + } catch (std::system_error& err) { + if (err.code().value() == ENOENT) + logger.mesg("Monomer not in the library: ", name, '.'); + else + logger.mesg("Failed to read ", name, ": ", err.what(), '.'); + ok = false; + } catch (std::runtime_error& err) { + logger.mesg("Failed to read ", name, ": ", err.what(), '.'); + ok = false; + } + } + return ok; +} + + +double MonLib::find_ideal_distance(const const_CRA& cra1, const const_CRA& cra2) const { + std::string types[2] = {cra1.atom->element.uname(), + cra2.atom->element.uname()}; + if (const std::string* tmp = find_chemtype(monomers, cra1)) + types[0] = *tmp; + if (const std::string* tmp = find_chemtype(monomers, cra2)) + types[1] = *tmp; + // if either one is metal, use ion radius + ion radius + if (cra1.atom->element.is_metal() != cra2.atom->element.is_metal()) { + // return if ion radius is found for both of them + double r1 = find_radius(ener_lib, types[0], EnerLib::RadiusType::Ion); + double r2 = find_radius(ener_lib, types[1], EnerLib::RadiusType::Ion); + if (r1 > 0 && r2 > 0) + return r1 + r2; + } + // otherwise, look for defined distance or use average of distances + double r[2] = {0, 0}; + for (int j = 0; j < 2; ++j) { + auto range = ener_lib.bonds.equal_range(types[j]); + for (auto i = range.first; i != range.second; ++i) + if (i->second.atom_type_2 == types[1-j] && !std::isnan(i->second.length)) + return i->second.length; + else if (i->second.atom_type_2.empty() && i->second.type == BondType::Single) + r[j] = i->second.length / 2; + if ((r[j] == 0 || std::isnan(r[j])) && range.first != range.second) + r[j] = range.first->second.length / 2; + if (r[j] == 0 || std::isnan(r[j])) + r[j] = (j==0 ? cra1 : cra2).atom->element.covalent_r(); + } + return r[0] + r[1]; +} + +void MonLib::update_old_atom_names(Structure& st, const Logger& logger) const { + for (const auto& it : monomers) + // monomers should have only monomers needed for this structure. + // Few of them (usually none or one) have old names defined. + if (it.second.has_old_names()) { + const std::string& resname = it.first; + const ChemComp& cc = it.second; + int old_vs_new = 0; + for (const Model& model : st.models) + for (const Chain& chain : model.chains) + for (const Residue& res : chain.residues) + if (res.name == resname) { + for (const Atom& atom : res.atoms) { + if (cc.find_atom(atom.name) == cc.atoms.end()) + ++old_vs_new; + if (cc.find_atom_by_old_name(atom.name) == cc.atoms.end()) + --old_vs_new; + } + } + if (old_vs_new > 0) { + std::string msg = cat("Updating atom names in ", resname, ':'); + std::map mapping; + for (const ChemComp::Atom& a : cc.atoms) + if (!a.old_id.empty() && a.old_id != a.id) { + mapping.emplace(a.old_id, a.id); + cat_to(msg, ' ', a.old_id, "->", a.id); + } + logger.mesg(msg); + rename_atom_names(st, resname, mapping); + } + } +} + +} // namespace gemmi diff --git a/gemmi_gph/riding_h.cpp b/gemmi_gph/riding_h.cpp new file mode 100644 index 000000000..2b2dee439 --- /dev/null +++ b/gemmi_gph/riding_h.cpp @@ -0,0 +1,480 @@ +// Copyright 2018-2022 Global Phasing Ltd. + +#include + +namespace gemmi { + +namespace { + +struct BondedAtom { + Atom* ptr; + Position& pos; // == ptr->pos; + double dist; +}; + +// Calculate position using one angle (theta) and one dihedral angle (tau). +// Returns position of x4 in x1-x2-x3-x4, where dist=|x3-x4| and +// theta is angle(x2, x3, x4). +// Based on section 3.3 of Paciorek et al, Acta Cryst. A52, 349 (1996). +Position position_from_angle_and_torsion(const Position& x1, + const Position& x2, + const Position& x3, + double dist, // |x3-x4| + double theta, // angle x2-x3-x4 + double tau) { // dihedral angle + Vec3 u = x2 - x1; + Vec3 v = x3 - x2; + Vec3 e1 = v.normalized(); + Vec3 e2 = -(u - u.dot(e1) * e1).normalized(); + Vec3 e3 = e1.cross(e2); + Vec3 e23 = std::cos(tau) * e2 + std::sin(tau) * e3; + return x3 + Position(dist * (-std::cos(theta) * e1 + std::sin(theta) * e23)); +} + +// Similar to position_from_angle_and_torsion(), but x1 and tau are not given. +Position arbitrary_position_from_angle(const Position& x2, + const Position& x3, + double dist, // |x3-x4| + double theta) { // angle x2-x3-x4 + Vec3 u(1, 0, 0); + Vec3 v = x3 - x2; + Vec3 e1 = v.normalized(); + Vec3 e2_ = -(u - u.dot(e1) * e1); + if (e2_.length_sq() < 1e-6) { + // u || v, let's take any non-parallel u + u = Vec3(0, 1, 0); + e2_ = -(u - u.dot(e1) * e1); + } + Vec3 e2 = e2_.normalized(); + return x3 + Position(dist * (-std::cos(theta) * e1 + std::sin(theta) * e2)); +} + + +Vec3 get_vector_to_line(const Position& point, + const Position& point_on_the_line, + const Vec3& unit_vector) { + // en.wikipedia.org/wiki/Distance_from_a_point_to_a_line#Vector_formulation + // the component of a - p perpendicular to the line is: (a-p) - ((a-p).n)n + Vec3 ap = point_on_the_line - point; + return ap - ap.dot(unit_vector) * unit_vector; +} + +// If no points satisfy the distances returns a pair of NaNs +std::pair trilaterate(const Position& p1, double r1sq, + const Position& p2, double r2sq, + const Position& p3, double r3sq) { + // It was based on https://en.wikipedia.org/wiki/Trilateration + // but apparently that page has changed in the meantime. + Vec3 ex = (p2 - p1).normalized(); + double i = ex.dot(p3-p1); + Vec3 ey = (Vec3(p3) - p1 - i*ex).normalized(); + Vec3 ez = ex.cross(ey); + double d = (p2-p1).length(); + double j = ey.dot(p3-p1); + double x = (r1sq - r2sq + d*d) / (2*d); + double y = (r1sq - r3sq + i*i + j*j) / (2*j) - x*i/j; + double z2 = r1sq - x*x - y*y; + double z = std::sqrt(z2); // may result in NaN + return std::make_pair(p1 + Position(x*ex + y*ey + z*ez), + p1 + Position(x*ex + y*ey - z*ez)); +} + +// Calculate position using two angles. +// Returns p4. Topology: p1 is bonded to p2, p3 and p4. +std::pair +position_from_two_angles(const Position& p1, + const Position& p2, + const Position& p3, + double dist14, // |p4-p1| + double theta214, // angle p2-p1-p4 + double theta314) { // angle p3-p1-p4 + double d12sq = p1.dist_sq(p2); + double d13sq = p1.dist_sq(p3); + double d14sq = dist14 * dist14; + // the law of cosines + double d24sq = d14sq + d12sq - 2 * std::sqrt(d14sq * d12sq) * cos(theta214); + double d34sq = d14sq + d13sq - 2 * std::sqrt(d14sq * d13sq) * cos(theta314); + return trilaterate(p1, d14sq, p2, d24sq, p3, d34sq); +} + +// Returns angle between hydrogen and the plane of heavy atoms +// in 2H tetrahedral configuration. theta0 is the angle between heavy atoms. +double calculate_tetrahedral_delta(double theta0, double theta1, double theta2) { + // simplified trilateration: + // auto r = trilaterate(Position(0, 0, 0), 1, + // Position(1, 0, 0), 2 - 2 * std::cos(theta1), + // Position(std::cos(theta0), std::sin(theta0), 0), + // 2 - 2 * std::cos(theta2)); + // return std::asin(std::fabs(r.first.z)); + double x = std::cos(theta1); + double y = (std::cos(theta2) - x * std::cos(theta0)) / std::sin(theta0); + double z2 = 1 - x*x - y*y; + double z = std::sqrt(z2); // may result in NaN + return std::asin(z); +} + +double angle_in_triangle(double a, double b, double c) { + return std::acos((a * a + c * c - b * b) / (2 * a * c)); +} + +// Used in rare cases when one angle is missing in 2H-tetrahedral configuration. +// Currently it can happen only with metal sites. +// b c(metal) +// \ / +// atom -- h (possibly two H atoms, symmetric wrt plane abc) +// Angle c-atom-h is missing, b-atom-h is equal alpha, b-atom-c is theta. +// For two H atoms we also need angle h-atom-h. +double missing_angle_2H_tetrahedral(const Topo& topo, const Atom& atom, + const std::vector& hs, + double alpha, double theta) { + if (hs.size() == 1) + return 2 * pi() - alpha - theta; // make it coplanar + if (hs.size() == 2) { + if (const Restraints::Angle* hh = topo.take_angle(hs[0].ptr, &atom, hs[1].ptr)) { + double xh = std::cos(alpha); + double zh = std::sin(0.5 * hh->radians()); + double yh = std::sqrt(1 - xh*xh - zh*zh); + double st = std::sin(theta); + double ct = std::cos(theta); + Vec3 ah = Vec3(xh, -yh * st, zh * st); + double angle = std::acos((ct * ah.x + st * ah.y) / ah.length()); + //printf("missing_angle: %s %g\n", atom.name.c_str(), deg(angle)); + return angle; + } + } + return 0; +} + +[[noreturn]] +void giveup(const std::string& message, const std::vector& hs) { + for (const BondedAtom& bonded_h : hs) { + bonded_h.ptr->occ = 0; + bonded_h.ptr->calc_flag = CalcFlag::Dummy; + } + fail(message); +} + +// known and hs are lists of heavy atoms and hydrogens bonded to atom. +// hs is const, but nevertheless atoms it points to are modified. +void place_hydrogens(const Topo& topo, const Atom& atom, + const std::vector& known, + const std::vector& hs) { + using Angle = Restraints::Angle; + assert(!hs.empty()); + + for (const BondedAtom& bonded_h : hs) + bonded_h.ptr->calc_flag = CalcFlag::Calculated; + + // ==== only hydrogens ==== + if (known.size() == 0) { + // we can only arbitrarily pick directions of atoms + for (const BondedAtom& bonded_h : hs) + bonded_h.ptr->occ = 0; + hs[0].pos = atom.pos + Position(hs[0].dist, 0, 0); + if (hs.size() > 1) { + double theta = pi(); + if (const Angle* ang = topo.take_angle(hs[1].ptr, &atom, hs[0].ptr)) + theta = ang->radians(); + hs[1].pos = atom.pos + Position(hs[1].dist * cos(theta), + hs[1].dist * sin(theta), 0); + } + if (hs.size() > 2) { + const Angle* ang0 = topo.take_angle(hs[2].ptr, &atom, hs[0].ptr); + const Angle* ang1 = topo.take_angle(hs[2].ptr, &atom, hs[1].ptr); + double theta0 = rad(ang0 ? ang0->value : 109.47122); + double theta1 = rad(ang1 ? ang1->value : 109.47122); + auto pos = position_from_two_angles(atom.pos, hs[0].pos, hs[1].pos, + hs[2].dist, theta0, theta1); + hs[2].pos = pos.first; + // 3 hydrogens: for now happens only NH3 (NH2.cif and NH3.cif) + // 4 hydrogens: CH4 (CH2.cif) and NH4 (NH4.cif) + if (hs.size() == 4) + hs[3].pos = pos.second; + } + + // ==== one heavy atom and hydrogens ==== + } else if (known.size() == 1) { + const BondedAtom& h = hs[0]; + const BondedAtom& heavy = known[0]; + const Restraints::Angle* angle = topo.take_angle(h.ptr, &atom, heavy.ptr); + if (!angle) + giveup("No angle restraint for " + h.ptr->name + ".\n", hs); + if (std::abs(angle->value - 180.0) < 0.5) { + Vec3 u = atom.pos - h.pos; + h.pos = atom.pos + Position(u * (h.dist / u.length())); + if (hs.size() > 1) + giveup("Unusual: one of two H atoms has angle restraint 180 deg.", hs); + return; + } + double theta = angle->radians(); + double tau = 0.0; + int period = 0; + const Atom* tau_end = nullptr; + auto plane_range = topo.plane_index.equal_range(&atom); + for (auto i = plane_range.first; i != plane_range.second; ++i) { + const Topo::Plane& plane = *i->second; + // only Topo::Plane with atoms.size() >= 4 is put into planes + if (plane.has(h.ptr) && plane.has(heavy.ptr)) { + for (const Atom* a : plane.atoms) { + if (!a->is_hydrogen() && a != &atom && a != heavy.ptr) { + tau_end = a; + break; + } + } + break; + } + } + Atom* torsion_h = nullptr; + if (!tau_end) { + // Using one dihedral angle. + // We don't check here for which hydrogen the torsion angle is defined. + // If an atom has 2 or 3 hydrogens, the torsion angle may not be given + // for the first one, but only for the 2nd or 3rd (e.g. HD22 in ASN). + auto tor_range = topo.torsion_index.equal_range(&atom); + for (auto i = tor_range.first; i != tor_range.second; ++i) { + const Topo::Torsion& tor = *i->second; + if (tor.atoms[1] == &atom && tor.atoms[2] == heavy.ptr && + tor.atoms[0]->is_hydrogen() && !tor.atoms[3]->is_hydrogen()) { + tau = rad(tor.restr->value); + torsion_h = tor.atoms[0]; + tau_end = tor.atoms[3]; + period = tor.restr->period; + break; + } + if (tor.atoms[2] == &atom && tor.atoms[1] == heavy.ptr && + tor.atoms[3]->is_hydrogen() && !tor.atoms[0]->is_hydrogen()) { + tau = rad(tor.restr->value); + torsion_h = tor.atoms[3]; + tau_end = tor.atoms[0]; + period = tor.restr->period; + break; + } + } + } + + if (tau_end) + h.pos = position_from_angle_and_torsion(tau_end->pos, heavy.pos, atom.pos, + h.dist, theta, tau); + else + h.pos = arbitrary_position_from_angle(heavy.pos, atom.pos, h.dist, theta); + if (std::isnan(h.pos.x)) { + h.pos = Position(0, 0, 0); + giveup("bonded atoms are exactly overlapping (case 1).", hs); + } + if (hs.size() == 2) { + // I think we can assume the two hydrogens are symmetric. + Vec3 axis = (heavy.pos - atom.pos).normalized(); + Vec3 perpendicular = get_vector_to_line(hs[0].pos, atom.pos, axis); + hs[1].pos = hs[0].pos + Position(2 * perpendicular); + } else if (hs.size() == 3) { + // Here we assume the three hydrogens are in the same distance from + // the parent atom and that they make an equilateral triangle. + // First check for which hydrogen was the torsion restraint (if any). + int idx = 0; + for (int i : {1, 2}) + if (torsion_h == hs[i].ptr) { + idx = i; + hs[i].pos = h.pos; + } + // Now get the other positions by rotation + Vec3 axis = (heavy.pos - atom.pos).normalized(); + Vec3 v1 = h.pos - atom.pos; + Vec3 v2 = rotate_about_axis(v1, axis, rad(120)); + Vec3 v3 = rotate_about_axis(v1, axis, rad(-120)); + hs[(idx+1) % 3].pos = atom.pos + Position(v2); + hs[(idx+2) % 3].pos = atom.pos + Position(v3); + } else if (hs.size() >= 4) { + giveup("Unusual: atom bonded to one heavy atoms and 4+ hydrogens.", hs); + } + if (!tau_end || period > (int)hs.size()) + for (const BondedAtom& bonded_h : hs) + bonded_h.ptr->occ = 0; + // ==== two heavy atoms and hydrogens ==== + } else if (known.size() == 2) { + if (hs.size() >= 3) + giveup("Unusual: atom bonded to 2+ heavy atoms and 3+ hydrogens.", hs); + const Angle* ang1 = topo.take_angle(hs[0].ptr, &atom, known[0].ptr); + const Angle* ang2 = topo.take_angle(hs[0].ptr, &atom, known[1].ptr); + const Angle* ang3 = topo.take_angle(known[0].ptr, &atom, known[1].ptr); + + double theta1 = ang1 ? ang1->radians() : 0; + double theta2 = ang2 ? ang2->radians() : 0; + double theta3 = ang3 ? ang3->radians() : 0; + if (!ang3) { + // If ang3 atoms form a bonded triangle (e.g. C11-C12-PT in DVW), + // we can calculate theta3 from the bond lengths. + const Restraints::Bond* aptr = topo.take_bond(&atom, known[1].ptr); + const Restraints::Bond* bptr = topo.take_bond(known[0].ptr, known[1].ptr); + const Restraints::Bond* cptr = topo.take_bond(known[0].ptr, &atom); + if (!aptr || !bptr || !cptr) + giveup(cat("Missing angle restraint ", known[0].ptr->name, '-', atom.name, + '-', known[1].ptr->name, ".\n"), hs); + theta3 = angle_in_triangle(aptr->value, bptr->value, cptr->value); + } + // Some configurations with metals have only distance restraints. + // In such cases, we assume that hydrogens are as far as possible from the metal. + if (!ang1 && ang2 && known[0].ptr->element.is_metal()) + theta1 = missing_angle_2H_tetrahedral(topo, atom, hs, theta2, theta3); + if (!ang2 && ang1 && known[1].ptr->element.is_metal()) + theta2 = missing_angle_2H_tetrahedral(topo, atom, hs, theta1, theta3); + if (theta1 == 0 || theta2 == 0) + giveup(cat("Missing angle restraint ", hs[0].ptr->name, '-', atom.name, + '-', known[theta1 == 0 ? 0 : 1].ptr->name, ".\n"), hs); + + // Co-planar case. The sum of angles should be 360 degrees, + // but in some cif files it differs slightly. + if (theta1 + theta2 + theta3 > rad(360 - 3)) { + Vec3 v12 = known[0].pos - atom.pos; + Vec3 v13 = known[1].pos - atom.pos; + // theta3 is the ideal restraint value, cur_theta3 is the current value + double cur_theta3 = v12.angle(v13); + double ratio = (2 * pi() - cur_theta3) / (theta1 + theta2); + Vec3 axis = v13.cross(v12).normalized(); + Vec3 v14 = rotate_about_axis(v12, axis, theta1 * ratio); + hs[0].pos = atom.pos + Position(hs[0].dist / v14.length() * v14); + if (hs.size() > 1) { + topo.logger.err("Unhandled topology of ", hs.size(), " hydrogens bonded to ", atom.name); + for (size_t i = 1; i < hs.size(); ++i) { + hs[i].ptr->occ = 0; + hs[i].ptr->calc_flag = CalcFlag::Dummy; + } + } + return; + } + + // Tetrahedral or similar configuration. + double hh_half = 0; + if (hs.size() == 2) + if (const Angle* hh = topo.take_angle(hs[0].ptr, &atom, hs[1].ptr)) + hh_half = 0.5 * hh->radians(); + if (hh_half == 0) + hh_half = calculate_tetrahedral_delta(theta3, theta1, theta2); + + // Based on Liebschner et al (2020) doi:10.1016/bs.mie.2020.01.007 + // sec. 2.3. 2H-tetrahedral configuration + double c0 = std::cos(theta3); + double c1 = std::cos(theta1); + double c2 = std::cos(theta2); + double den = 1 / (1 - c0*c0); + double a = den * (c1 - c0 * c2); + double b = den * (c2 - c0 * c1); + // I think the paper defines u10 and u20 in the opposite direction, + // but I had to reverse it somewhere to make it work. + Vec3 u10 = (known[0].pos - atom.pos).normalized(); + Vec3 u20 = (known[1].pos - atom.pos).normalized(); + Vec3 v = u10.cross(u20); + if (std::isnan(v.x)) + giveup("bonded atoms are exactly overlapping (case 2).", hs); + Vec3 d = a * u10 + b * u20; + double dist_sin = hs[0].dist * std::sin(hh_half); + double dist_cos = hs[0].dist * std::cos(hh_half); + Vec3 v0s = v.changed_magnitude(dist_sin); + Vec3 d0c = d.changed_magnitude(dist_cos); + hs[0].pos = atom.pos + Position(d0c + v0s); + Position other_pos = atom.pos + Position(d0c - v0s); + + if (hs.size() == 1) { + const Topo::Chirality* chir = topo.get_chirality(&atom); + if (chir && chir->restr->sign != ChiralityType::Both) { + if (!chir->check()) + hs[0].pos = other_pos; + } else { + hs[0].ptr->occ = 0; + } + } else { // hs.size() == 2 + hs[1].pos = other_pos; + } + + } else { // known.size() >= 3 + if (hs.size() > 1) + giveup("Unusual: atom bonded to 3+ heavy atoms and 2+ hydrogens.", hs); + // Based on Liebschner et al (2020) doi:10.1016/bs.mie.2020.01.007 + // sec. 2.4. 1H-tetrahedral configuration + Vec3 u10 = (known[0].pos - atom.pos).normalized(); + Vec3 u20 = (known[1].pos - atom.pos).normalized(); + Vec3 u30 = (known[2].pos - atom.pos).normalized(); + auto cos_tetrahedral = [&](size_t n) { + const Angle* angle = topo.take_angle(known[n].ptr, &atom, hs[0].ptr); + return angle ? std::cos(angle->radians()) : -1./3.; + }; + SMat33 m{1., 1., 1., u10.dot(u20), u10.dot(u30), u20.dot(u30)}; + Vec3 rhs(cos_tetrahedral(0), cos_tetrahedral(1), cos_tetrahedral(2)); + double det = m.determinant(); + if (std::fabs(det) < 1e-12) + giveup("tetrahedral configuration with four co-planar atoms.", hs); + Vec3 abc = m.inverse_(det).multiply(rhs); + Vec3 h_dir = abc.x * u10 + abc.y * u20 + abc.z * u30; + hs[0].pos = atom.pos + Position(h_dir.changed_magnitude(hs[0].dist)); + } +} + +} // anonymous namespace + +void place_hydrogens_on_all_atoms(Topo& topo) { + std::vector known; + std::vector hs; + auto filter = [](char alt, const std::vector& v) { + std::vector out; + out.reserve(v.size()); + for (const BondedAtom& ba : v) + if (ba.ptr->altloc_matches(alt)) + out.push_back(ba); + return out; + }; + for (Topo::ChainInfo& chain_info : topo.chain_infos) + for (Topo::ResInfo& ri : chain_info.res_infos) { + // If we don't have monomer description from a cif file, + // only ad-hoc restraints, don't try to place hydrogens. + if (ri.orig_chemcomp == nullptr) + continue; + for (Atom& atom : ri.res->atoms) { + if (atom.is_hydrogen()) + continue; + try { + // gather bonded atoms + known.clear(); + hs.clear(); + auto range = topo.bond_index.equal_range(&atom); + for (auto i = range.first; i != range.second; ++i) { + const Topo::Bond* t = i->second; + Atom* other = t->atoms[t->atoms[0] == &atom ? 1 : 0]; + if (other->altloc && atom.altloc) { + // We support links between different altlocs in Topo (e.g. link A-B), + // although these are rare, special cases. + // But if we had bonds between atom 1 (A/B) and atom 2 (A/B/C), + // and we had bonds B-B and B-C, we'd want to use only one of them (B-B). + // Checking atom's name is not robust, but should suffice here. + if (atom.altloc != other->altloc && + in_vector_f([&](const BondedAtom& a) { return a.ptr->name == other->name; }, + known)) + continue; + } + auto& atom_list = other->is_hydrogen() ? hs : known; + atom_list.push_back({other, other->pos, t->restr->value}); + } + if (hs.size() == 0) + continue; + std::string altlocs; + // In a special case: Hs with altlocs on a parent without altloc, + // we need to process conformations one by one. + if (atom.altloc == '\0') + for (const auto& h : hs) { + char alt = h.ptr->altloc; + if (alt && altlocs.find(alt) == std::string::npos) { + altlocs += alt; + place_hydrogens(topo, atom, filter(alt, known), filter(alt, hs)); + } + } + // In all other cases, all bonded atoms are from the same conformation. + if (altlocs.empty()) + place_hydrogens(topo, atom, known, hs); + } catch (const std::runtime_error& e) { + topo.logger.err("Placing of hydrogen bonded to ", + atom_str(chain_info.chain_ref, *ri.res, atom), + " failed:\n ", e.what()); + } + } + } +} + +} // namespace gemmi diff --git a/gemmi_gph/topo.cpp b/gemmi_gph/topo.cpp new file mode 100644 index 000000000..673a487da --- /dev/null +++ b/gemmi_gph/topo.cpp @@ -0,0 +1,1084 @@ +// Copyright 2018-2022 Global Phasing Ltd. + +#include +#include // for sqrt, round +#include // for multimap +#include // for unordered_multimap +#include // for get_or_check_polymer_type, ... +#include // for place_hydrogens_on_all_atoms, ... +#include // for remove_hydrogens + +namespace gemmi { + +std::unique_ptr make_chemcomp_with_restraints(const Residue& res) { + std::unique_ptr cc(new ChemComp()); + cc->name = res.name; + cc->group = ChemComp::Group::Null; + cc->has_coordinates = true; + // add atoms + cc->atoms.reserve(res.atoms.size()); + for (const Atom& a : res.atoms) { + if (a.altloc != '\0' && cc->has_atom(a.name)) + continue; + Element el = a.element; + if (el == El::X) + el = El::N; + if (el == El::D) + el = El::H; + const std::string& chem_type = el.uname(); + cc->atoms.push_back(ChemComp::Atom{a.name, "", el, float(a.charge), chem_type, "", a.pos}); + } + // prepare pairs of atoms + struct Pair { + size_t n1, n2; + double dist; + }; + std::vector pairs; + // first heavy atoms only + for (size_t i = 0; i != res.atoms.size(); ++i) { + const Atom& at1 = res.atoms[i]; + if (at1.is_hydrogen()) + continue; + float r1 = at1.element.covalent_r(); + for (size_t j = i+1; j != res.atoms.size(); ++j) { + const Atom& at2 = res.atoms[j]; + if (at2.is_hydrogen() || !at2.same_conformer(at1)) + continue; + double d2 = at1.pos.dist_sq(at2.pos); + float r2 = at2.element.covalent_r(); + double dmax = std::max(2.0, 1.3 * std::max(r1, r2)); + if (d2 < sq(dmax)) + pairs.push_back(Pair{i, j, std::sqrt(d2)}); + } + } + // now each hydrogen with the nearest heavy atom + for (size_t i = 0; i != res.atoms.size(); ++i) { + const Atom& at1 = res.atoms[i]; + if (at1.is_hydrogen()) { + size_t nearest = (size_t)-1; + double min_d2 = sq(2.5); + for (size_t j = 0; j != res.atoms.size(); ++j) { + const Atom& at2 = res.atoms[j]; + if (!at2.is_hydrogen() && at2.same_conformer(at1)) { + double d2 = at1.pos.dist_sq(at2.pos); + if (d2 < min_d2) { + min_d2 = d2; + nearest = j; + } + } + } + if (nearest != (size_t)-1) { + pairs.push_back(Pair{nearest, i, std::sqrt(min_d2)}); + } + } + } + + // add bonds + // note: duplicated bonds (from different conformations) are not a problem + for (const Pair& p : pairs) { + Restraints::Bond bond; + bond.id1 = Restraints::AtomId{1, res.atoms[p.n1].name}; + bond.id2 = Restraints::AtomId{1, res.atoms[p.n2].name}; + bond.type = BondType::Unspec; + bond.aromatic = false; + double rounded_dist = 0.001 * std::round(1000 * p.dist); + bond.value = bond.value_nucleus = rounded_dist; + bond.esd = bond.esd_nucleus = 0.02; + cc->rt.bonds.push_back(bond); + } + // add angles + struct Triple { + size_t n1, n2, n3; + }; + std::vector triples; + for (size_t i = 0; i != pairs.size(); ++i) + for (size_t j = i+1; j != pairs.size(); ++j) { + if (pairs[i].n1 == pairs[j].n1) + triples.push_back(Triple{pairs[i].n2, pairs[i].n1, pairs[j].n2}); + else if (pairs[i].n1 == pairs[j].n2) + triples.push_back(Triple{pairs[i].n2, pairs[i].n1, pairs[j].n1}); + else if (pairs[i].n2 == pairs[j].n1) + triples.push_back(Triple{pairs[i].n1, pairs[i].n2, pairs[j].n2}); + else if (pairs[i].n2 == pairs[j].n2) + triples.push_back(Triple{pairs[i].n1, pairs[i].n2, pairs[j].n1}); + } + for (const Triple& triple : triples) { + Restraints::Angle angle; + angle.id1 = Restraints::AtomId{1, res.atoms[triple.n1].name}; + angle.id2 = Restraints::AtomId{1, res.atoms[triple.n2].name}; + angle.id3 = Restraints::AtomId{1, res.atoms[triple.n3].name}; + double angle_rad = calculate_angle(res.atoms[triple.n1].pos, + res.atoms[triple.n2].pos, + res.atoms[triple.n3].pos); + angle.value = 0.01 * std::round(100 * deg(angle_rad)); + angle.esd = 3.0; + cc->rt.angles.push_back(angle); + } + return cc; +} + +Topo::ChainInfo::ChainInfo(ResidueSpan& subchain, const Chain& chain, const Entity* ent) + : chain_ref(chain) { + subchain_name = subchain.at(0).subchain; + res_infos.reserve(subchain.size()); + if (ent) { + entity_id = ent->name; + polymer = ent->entity_type == EntityType::Polymer; + polymer_type = get_or_check_polymer_type(ent, subchain); + } else { + polymer = false; + polymer_type = PolymerType::Unknown; + } + for (Residue& res : subchain) + res_infos.emplace_back(&res); +} + +// Add a ChemLink that restraints only bond length. +static +const std::string& add_auto_chemlink(MonLib& monlib, + const std::string& resname1, const std::string& aname1, + const std::string& resname2, const std::string& aname2, + double ideal_dist, double esd) { + ChemLink cl; + cl.side1.comp = resname1; + cl.side2.comp = resname2; + cl.id = resname1 + resname2; + cl.name = "auto-" + cl.id; + cl.rt.bonds.push_back({Restraints::AtomId{1, aname1}, + Restraints::AtomId{2, aname2}, + BondType::Unspec, false, + ideal_dist, esd, + ideal_dist, esd}); + // ensure unique link id + size_t orig_len = cl.id.size(); + for (int n = 0; monlib.get_link(cl.id) != nullptr; ++n) + cl.id.replace(orig_len, cl.id.size(), std::to_string(n)); + + auto it = monlib.links.emplace(cl.id, cl); + return it.first->first; +} + +static const ChemLink* setup_link_if_matches(Topo::Link& link, const MonLib& monlib, + const std::string& atom1, + const std::string& atom2) { + bool invert; + const ChemLink* match = nullptr; + std::tie(match, invert, link.aliasing1, link.aliasing2) = + monlib.match_link(*link.res1, atom1, link.alt1, *link.res2, atom2, link.alt2); + if (match) { + link.link_id = match->id; + if (invert) { + std::swap(link.res1, link.res2); + std::swap(link.alt1, link.alt2); + std::swap(link.atom1_name_id, link.atom2_name_id); + std::swap(link.aliasing1, link.aliasing2); + } + } + return match; +} + +static int atom_name_id(const std::string& s) { + int id = 0; + if (s.size() > 0) // there is '\0' at the end + id = (s[0] << 24 | s[1] << 16); + if (s.size() > 2) + id |= (s[2] << 8 | s[3]); + return id | 0x20202020; +} + +static void add_polymer_links(PolymerType polymer_type, + const Topo::ResInfo& ri1, + Topo::ResInfo& ri2, + MonLib* monlib) { + Topo::Link link; + link.res1 = ri1.res; + link.res2 = ri2.res; + assert(&ri1 - &ri2 == link.res_distance()); + bool groups_ok = (ri1.orig_chemcomp != nullptr && ri2.orig_chemcomp != nullptr); + + if (is_polypeptide(polymer_type)) { + std::string c = "C"; + std::string ca1 = "CA"; + std::string n = "N"; + std::string ca2 = "CA"; + if (ri1.orig_chemcomp && !ChemComp::is_peptide_group(ri1.orig_chemcomp->group)) { + for (const ChemComp::Aliasing& aliasing : ri1.orig_chemcomp->aliases) + if (ChemComp::is_peptide_group(aliasing.group)) { + link.aliasing1 = &aliasing; + if (const std::string* ptr = aliasing.name_from_alias(c)) + c = *ptr; + if (const std::string* ptr = aliasing.name_from_alias(ca1)) + ca1 = *ptr; + break; + } + if (!link.aliasing1) + groups_ok = false; + } + ChemComp::Group n_terminus_group = ri2.orig_chemcomp ? ri2.orig_chemcomp->group + : ChemComp::Group::Null; + if (ri2.orig_chemcomp && !ChemComp::is_peptide_group(ri2.orig_chemcomp->group)) { + for (const ChemComp::Aliasing& aliasing : ri2.orig_chemcomp->aliases) + if (ChemComp::is_peptide_group(aliasing.group)) { + link.aliasing2 = &aliasing; + n_terminus_group = aliasing.group; + if (const std::string* ptr = aliasing.name_from_alias(n)) + n = *ptr; + if (const std::string* ptr = aliasing.name_from_alias(ca2)) + ca2 = *ptr; + break; + } + if (!link.aliasing2) + groups_ok = false; + } + for (const Atom& a1 : ri1.res->atoms) + if (a1.name == c && a1.element == El::C) { + for (const Atom& a2 : ri2.res->atoms) + if (a2.name == n && a2.element == El::N && + (a2.altloc == a1.altloc || a2.altloc == '\0' || a1.altloc == '\0') && + in_peptide_bond_distance(&a1, &a2)) { + // One C-N pair of atoms can create here only one link. + // Ignoring artificial configuration of no-altloc C and N atoms, + // and CA atoms in 2+ conformations making both CIS and TRANS links. + link.alt1 = a1.altloc; + link.alt2 = a2.altloc; + link.atom1_name_id = atom_name_id(a1.name); + link.atom2_name_id = atom_name_id(a2.name); + if (groups_ok) { + // Deciding CIS/TRANS based on omega angle. + char alt = a1.altloc_or(a2.altloc_or('*')); + const Atom* ca1_atom = ri1.res->find_atom(ca1, alt, El::C); + const Atom* ca2_atom = ri2.res->find_atom(ca2, alt, El::C); + link.is_cis = is_peptide_bond_cis(ca1_atom, &a1, &a2, ca2_atom, 60.); + if (n_terminus_group == ChemComp::Group::PPeptide) + link.link_id = link.is_cis ? "PCIS" : "PTRANS"; + else if (n_terminus_group == ChemComp::Group::MPeptide) + link.link_id = link.is_cis ? "NMCIS" : "NMTRANS"; + else + link.link_id = link.is_cis ? "CIS" : "TRANS"; + } else if (monlib) { + if (!setup_link_if_matches(link, *monlib, c, n)) + link.link_id = add_auto_chemlink(*monlib, + ri1.res->name, c, + ri2.res->name, n, + 1.34, 0.04); + } + ri2.prev.push_back(link); + } + } + + } else if (is_polynucleotide(polymer_type)) { + std::string o3p = "O3'"; + std::string p = "P"; + if (ri1.orig_chemcomp && !ChemComp::is_nucleotide_group(ri1.orig_chemcomp->group)) { + for (const ChemComp::Aliasing& aliasing : ri1.orig_chemcomp->aliases) + if (ChemComp::is_nucleotide_group(aliasing.group)) { + link.aliasing1 = &aliasing; + if (const std::string* o3p_ptr = aliasing.name_from_alias(o3p)) + o3p = *o3p_ptr; + break; + } + if (!link.aliasing1) + groups_ok = false; + } + if (ri2.orig_chemcomp && !ChemComp::is_nucleotide_group(ri2.orig_chemcomp->group)) { + for (const ChemComp::Aliasing& aliasing : ri2.orig_chemcomp->aliases) + if (ChemComp::is_nucleotide_group(aliasing.group)) { + link.aliasing2 = &aliasing; + if (const std::string* p_ptr = aliasing.name_from_alias(p)) + p = *p_ptr; + break; + } + if (!link.aliasing2) + groups_ok = false; + } + for (const Atom& a1 : ri1.res->atoms) + if (a1.name == o3p && a1.element == El::O) { + for (const Atom& a2 : ri2.res->atoms) + if (a2.name == p && a2.element == El::P && + (a2.altloc == a1.altloc || a2.altloc == '\0' || a1.altloc == '\0') && + in_nucleotide_bond_distance(&a1, &a2)) { + link.alt1 = a1.altloc; + link.alt2 = a2.altloc; + link.atom1_name_id = atom_name_id(a1.name); + link.atom2_name_id = atom_name_id(a2.name); + if (groups_ok) { + link.link_id = "p"; + } else if (monlib) { + if (!setup_link_if_matches(link, *monlib, o3p, p)) + link.link_id = add_auto_chemlink(*monlib, + ri1.res->name, o3p, + ri2.res->name, p, + 1.606, 0.02); + } + ri2.prev.push_back(link); + } + } + } + + if (ri2.prev.empty()) { + link.link_id = "gap"; + ri2.prev.push_back(link); + } +} + +double Topo::ideal_chiral_abs_volume(const Chirality &ch) const { + const Restraints::Bond* bond_c1 = take_bond(ch.atoms[0], ch.atoms[1]); + const Restraints::Bond* bond_c2 = take_bond(ch.atoms[0], ch.atoms[2]); + const Restraints::Bond* bond_c3 = take_bond(ch.atoms[0], ch.atoms[3]); + const Restraints::Angle* angle_1c2 = take_angle(ch.atoms[1], ch.atoms[0], ch.atoms[2]); + const Restraints::Angle* angle_2c3 = take_angle(ch.atoms[2], ch.atoms[0], ch.atoms[3]); + const Restraints::Angle* angle_3c1 = take_angle(ch.atoms[3], ch.atoms[0], ch.atoms[1]); + if (bond_c1 && bond_c2 && bond_c3 && angle_1c2 && angle_2c3 && angle_3c1) + return chiral_abs_volume(bond_c1->value, bond_c2->value, bond_c3->value, + angle_1c2->value, angle_2c3->value, angle_3c1->value); + return std::numeric_limits::quiet_NaN(); +} + +std::vector Topo::apply_restraints(const Restraints& rt, + Residue& res, Residue* res2, Asu asu, + char altloc1, char altloc2, bool require_alt) { + std::string altlocs; + if (altloc1 == '\0' && altloc2 == '\0') { + add_distinct_altlocs(res, altlocs); + if (res2) + add_distinct_altlocs(*res2, altlocs); + } + if (altlocs.empty()) + altlocs += altloc1 != 0 ? altloc1 : altloc2; + + std::vector rules; + for (const Restraints::Bond& bond : rt.bonds) + for (char alt : altlocs) + if (Atom* at1 = bond.id1.get_from(res, res2, alt, altloc2)) + if (Atom* at2 = bond.id2.get_from(res, res2, alt, altloc2)) { + bool with_alt = at1->altloc || at2->altloc; + if (with_alt || !require_alt) { + rules.push_back({RKind::Bond, bonds.size()}); + bonds.push_back({&bond, {{at1, at2}}, asu}); + } + if (!with_alt) + break; + } + + if (only_bonds) + return rules; + + for (const Restraints::Angle& angle : rt.angles) + for (char alt : altlocs) + if (Atom* at1 = angle.id1.get_from(res, res2, alt, altloc2)) + if (Atom* at2 = angle.id2.get_from(res, res2, alt, altloc2)) + if (Atom* at3 = angle.id3.get_from(res, res2, alt, altloc2)) { + bool with_alt = at1->altloc || at2->altloc || at3->altloc; + if (with_alt || !require_alt) { + rules.push_back({RKind::Angle, angles.size()}); + angles.push_back({&angle, {{at1, at2, at3}}}); + } + if (!with_alt) + break; + } + for (const Restraints::Torsion& tor : rt.torsions) + for (char alt : altlocs) + if (Atom* at1 = tor.id1.get_from(res, res2, alt, altloc2)) + if (Atom* at2 = tor.id2.get_from(res, res2, alt, altloc2)) + if (Atom* at3 = tor.id3.get_from(res, res2, alt, altloc2)) + if (Atom* at4 = tor.id4.get_from(res, res2, alt, altloc2)) { + bool with_alt = at1->altloc || at2->altloc || at3->altloc || at4->altloc; + if (with_alt || !require_alt) { + rules.push_back({RKind::Torsion, torsions.size()}); + torsions.push_back({&tor, {{at1, at2, at3, at4}}}); + } + if (!with_alt) + break; + } + for (const Restraints::Chirality& chir : rt.chirs) + for (char alt : altlocs) + if (Atom* at1 = chir.id_ctr.get_from(res, res2, alt, altloc2)) + if (Atom* at2 = chir.id1.get_from(res, res2, alt, altloc2)) + if (Atom* at3 = chir.id2.get_from(res, res2, alt, altloc2)) + if (Atom* at4 = chir.id3.get_from(res, res2, alt, altloc2)) { + bool with_alt = at1->altloc || at2->altloc || at3->altloc || at4->altloc; + if (with_alt || !require_alt) { + rules.push_back({RKind::Chirality, chirs.size()}); + chirs.push_back({&chir, {{at1, at2, at3, at4}}}); + } + if (!with_alt) + break; + } + for (const Restraints::Plane& plane : rt.planes) + for (char alt : altlocs) { + std::vector atoms; + bool with_alt = false; + for (const Restraints::AtomId& id : plane.ids) + if (Atom* atom = id.get_from(res, res2, alt, altloc2)) { + with_alt = with_alt || atom->altloc; + atoms.push_back(atom); + } + if (atoms.size() >= 4 && (with_alt || !require_alt)) { + rules.push_back({RKind::Plane, planes.size()}); + planes.push_back({&plane, atoms}); + } + if (!with_alt) + break; + } + return rules; +} + +void Topo::apply_restraints_from_link(Link& link, const MonLib& monlib) { + if (link.link_id.empty() || link.link_id == "gap") + return; + const ChemLink* chem_link = monlib.get_link(link.link_id); + if (!chem_link) { + logger.err("ignoring link '", link.link_id, "' as it is not in the monomer library"); + return; + } + const Restraints* rt = &chem_link->rt; + if (link.alt1 && link.alt2 && link.alt1 != link.alt2) + logger.err("LINK between different conformers: ", link.alt1, " (in ", + link.res1->name, ") and ", link.alt2, " (in ", link.res2->name, ")."); + // aliases are a new feature - introduced in 2022 + if (link.aliasing1 || link.aliasing2) { + std::unique_ptr rt_copy(new Restraints(*rt)); + if (link.aliasing1) + for (const auto& p : link.aliasing1->related) + rt_copy->rename_atom(Restraints::AtomId{1, p.second}, p.first); + if (link.aliasing2) + for (const auto& p : link.aliasing2->related) + rt_copy->rename_atom(Restraints::AtomId{2, p.second}, p.first); + rt = rt_copy.get(); + rt_storage.push_back(std::move(rt_copy)); + } + link.link_rules = apply_restraints(*rt, *link.res1, link.res2, link.asu, + link.alt1, link.alt2, false); +} + +// see comments above the declaration +void Topo::initialize_refmac_topology(Structure& st, Model& model0, + MonLib& monlib, bool ignore_unknown_links) { + // initialize chain_infos + for (Chain& chain : model0.chains) + for (ResidueSpan& sub : chain.subchains()) { + // set Residue::group_idx which is used in Restraints::AtomId::get_from() + for (size_t i = 0; i != sub.size(); ++i) { + sub[i].group_idx = 0; + if (i != 0 && sub[i-1].seqid == sub[i].seqid) + sub[i].group_idx = sub[i-1].group_idx + 1; + } + const Entity* ent = st.get_entity_of(sub); + chain_infos.emplace_back(sub, chain, ent); + } + + // add modifications from MODRES records (Refmac's extension) + for (const ModRes& modres : st.mod_residues) + if (!modres.mod_id.empty()) { + for (Topo::ChainInfo& chain_info : chain_infos) + if (chain_info.chain_ref.name == modres.chain_name) { + for (Topo::ResInfo& res_info : chain_info.res_infos) + if (*res_info.res == modres.res_id) + res_info.add_mod(modres.mod_id, nullptr, '\0'); + } + } + + // setup pointers to monomers and links in the polymer + for (ChainInfo& ci : chain_infos) { + for (ResInfo& ri : ci.res_infos) { + auto it = monlib.monomers.find(ri.res->name); + if (it != monlib.monomers.end()) + ri.orig_chemcomp = &it->second; + // orig_chemcomp is left null for missing monomers + } + // setup polymer links + if (ci.polymer && !ci.res_infos.empty()) { + // handling of microheterogeneities makes it more complicated + // and it should be even more complex to handle partial bonding + auto prev_begin = ci.res_infos.begin(); + auto prev_end = ci.group_end(prev_begin); + while (prev_end != ci.res_infos.end()) { + auto group_begin = prev_end; + auto group_end = ci.group_end(group_begin); + for (auto ri = group_begin; ri != group_end; ++ri) + for (auto prev_ri = prev_begin; prev_ri != prev_end; ++prev_ri) { + MonLib* monlib_ptr = ignore_unknown_links ? nullptr : &monlib; + add_polymer_links(ci.polymer_type, *prev_ri, *ri, monlib_ptr); + } + prev_begin = group_begin; + prev_end = group_end; + } + } + } + + // add extra links + for (Connection& conn : st.connections) + if (conn.type != Connection::Hydrog) // ignoring hydrogen bonds + setup_connection(conn, model0, monlib, ignore_unknown_links); + + // Add modifications from standard links. We do it here b/c polymer links + // could be disabled (link_id.clear()) in setup_connection(). + for (ChainInfo& ci : chain_infos) + for (ResInfo& ri : ci.res_infos) + for (Link& prev : ri.prev) + if (const ChemLink* chem_link = monlib.get_link(prev.link_id)) { + ResInfo* ri_prev = &ri + prev.res_distance(); + ri_prev->add_mod(chem_link->side1.mod, prev.aliasing1, prev.alt1); + ri.add_mod(chem_link->side2.mod, prev.aliasing2, prev.alt2); + } + + // Apply modifications to monomer restraints + for (ChainInfo& chain_info : chain_infos) + for (ResInfo& ri : chain_info.res_infos) { + if (ri.orig_chemcomp) { + // The final ChemComp restraints that we'll use are made from + // original (_chem_comp) restraints with modifications (_chem_mod) + // applied. There is a corner case in which different conformations + // of the residue have different modifications applied. + bool has_mod_altlocs = false; + for (const Mod& mod : ri.mods) + if (mod.altloc != '\0') + has_mod_altlocs = true; + std::string altlocs; + if (has_mod_altlocs) + add_distinct_altlocs(*ri.res, altlocs); // cf. apply_restraints + if (altlocs.empty()) + altlocs += '\0'; + for (char altloc : altlocs) { + // key for caching in Topo::cc_cache: ChemComp::name + modifications + std::string key = ri.orig_chemcomp->name; + for (const Mod& mod : ri.mods) + if (!mod.altloc || altloc == mod.altloc) { + key += char(1 + static_cast(mod.alias)); + key += mod.id; + } + auto it = cc_cache.find(key); + if (it != cc_cache.end()) { + ri.chemcomps.push_back({altloc, it->second.get()}); + } else { // it's not in cache yet - we need to add it + std::unique_ptr cc_copy(new ChemComp(*ri.orig_chemcomp)); + // apply modifications + for (const Mod& mod : ri.mods) { + if (!mod.altloc || altloc == mod.altloc) { + if (const ChemMod* chem_mod = monlib.get_mod(mod.id)) { + try { + chem_mod->apply_to(*cc_copy, mod.alias); + } catch(std::runtime_error& e) { + logger.err("failed to apply modification ", chem_mod->id, + " to ", ri.res->name, ": ", e.what()); + } + } else { + logger.err("modification not found: ", mod.id); + } + } + } + ri.chemcomps.push_back({altloc, cc_copy.get()}); + cc_cache.emplace(key, std::move(cc_copy)); + } + } + // Usually the same modifications are applied to all conformers. + // In such case reduce chemcomps to a single value. + if (ri.chemcomps.size() > 0 && + std::all_of(ri.chemcomps.begin() + 1, ri.chemcomps.end(), + [&](const FinalChemComp& f) { return f.cc == ri.chemcomps[0].cc; })) { + ri.chemcomps.resize(1); + ri.chemcomps[0].altloc = '\0'; + } + } else { // orig_chemcomp not set - make ChemComp with ad-hoc restraints + // no cache - ad-hoc restraints are separate for each residue + cc_storage.emplace_back(make_chemcomp_with_restraints(*ri.res)); + ri.chemcomps.push_back({'\0', cc_storage.back().get()}); + } + } +} + +void Topo::apply_all_restraints(const MonLib& monlib) { + bonds.clear(); + angles.clear(); + torsions.clear(); + chirs.clear(); + planes.clear(); + rt_storage.clear(); + for (ChainInfo& chain_info : chain_infos) + for (ResInfo& ri : chain_info.res_infos) { + // link restraints + for (Link& link : ri.prev) + apply_restraints_from_link(link, monlib); + // monomer restraints + auto it = ri.chemcomps.cbegin(); + ri.monomer_rules = apply_restraints(it->cc->rt, *ri.res, nullptr, Asu::Same, + it->altloc, '\0', /*require_alt=*/false); + while (++it != ri.chemcomps.end()) { + auto rules = apply_restraints(it->cc->rt, *ri.res, nullptr, Asu::Same, + it->altloc, '\0', /*require_alt=*/true); + // calling reserve avoids bogus GCC warning -Wstringop-overflow + ri.monomer_rules.reserve(ri.monomer_rules.size() + rules.size()); + vector_move_extend(ri.monomer_rules, std::move(rules)); + } + } + for (Link& link : extras) + apply_restraints_from_link(link, monlib); +} + +void Topo::create_indices() { + bond_index.clear(); + for (Bond& bond : bonds) { + bond_index.emplace(bond.atoms[0], &bond); + if (bond.atoms[1] != bond.atoms[0]) + bond_index.emplace(bond.atoms[1], &bond); + } + angle_index.clear(); + for (Angle& ang : angles) + angle_index.emplace(ang.atoms[1], &ang); + torsion_index.clear(); + for (Torsion& tor : torsions) { + torsion_index.emplace(tor.atoms[1], &tor); + if (tor.atoms[1] != tor.atoms[2]) + torsion_index.emplace(tor.atoms[2], &tor); + } + plane_index.clear(); + for (Plane& plane : planes) + for (Atom* atom : plane.atoms) + plane_index.emplace(atom, &plane); +} + +Topo::Link* Topo::find_polymer_link(const AtomAddress& aa1, const AtomAddress& aa2) { + auto are_bonded = [&](const Link& link, const AtomAddress& a1, const AtomAddress& a2) { + return a1.res_id.matches_noseg(*link.res1) && + a2.res_id.matches_noseg(*link.res2) && + a1.altloc == link.alt1 && + a2.altloc == link.alt2 && + (a1.atom_name.empty() || atom_name_id(a1.atom_name) == link.atom1_name_id) && + (a2.atom_name.empty() || atom_name_id(a2.atom_name) == link.atom2_name_id); + }; + if (aa1.chain_name != aa2.chain_name) + return nullptr; + for (ChainInfo& ci : chain_infos) + if (aa1.chain_name == ci.chain_ref.name) { + for (ResInfo& ri : ci.res_infos) + for (Link& link : ri.prev) { + assert(link.res1 && link.res2); + if (are_bonded(link, aa1, aa2) || are_bonded(link, aa2, aa1)) + return &link; + } + } + return nullptr; +} + +// Tries to construct Topo::Link and append it to extras. +// Side-effects: it may modify conn.link_id and add ChemLink to monlib.links. +void Topo::setup_connection(Connection& conn, Model& model0, MonLib& monlib, + bool ignore_unknown_links) { + if (conn.link_id == "gap") { + if (Link* polymer_link = find_polymer_link(conn.partner1, conn.partner2)) + polymer_link->link_id.clear(); // disable polymer link + return; + } + + Link extra; + CRA cra1 = model0.find_cra(conn.partner1, true); + CRA cra2 = model0.find_cra(conn.partner2, true); + if (!cra1.atom || !cra2.atom) + return; + extra.res1 = cra1.residue; + extra.res2 = cra2.residue; + extra.alt1 = conn.partner1.altloc; + extra.alt2 = conn.partner2.altloc; + extra.asu = conn.asu; + + const ChemLink* match = nullptr; + + // If we have link_id find ChemLink by name (and check if it matches). + if (!conn.link_id.empty()) { + match = monlib.get_link(conn.link_id); + if (!match) { + logger.err("link not found in monomer library: ", conn.link_id); + return; + } + if (match->rt.bonds.empty() || + !monlib.link_side_matches_residue(match->side1, extra.res1->name, &extra.aliasing1) || + !monlib.link_side_matches_residue(match->side2, extra.res2->name, &extra.aliasing2) || + !atom_match_with_alias(match->rt.bonds[0].id1.atom, + conn.partner1.atom_name, extra.aliasing1) || + !atom_match_with_alias(match->rt.bonds[0].id2.atom, + conn.partner2.atom_name, extra.aliasing2)) { + logger.err("link from the monomer library does not match: ", conn.link_id); + return; + } + } else { + // we don't have link_id - use the best matching link (if any) + match = setup_link_if_matches(extra, monlib, + conn.partner1.atom_name, conn.partner2.atom_name); + if (match) + conn.link_id = match->id; + } + + // If a polymer link is also given in LINK/struct_conn, + // use only one of them. If LINK has explicit name (ccp4_link_id), + // or if it matches residue-specific link from monomer library, use it; + // otherwise, LINK is repetition of TRANS/CIS, so ignore LINK. + if (Link* polymer_link = find_polymer_link(conn.partner1, conn.partner2)) { + if (!conn.link_id.empty() || // conn has explicit link name + // polymer link was not really identified + cif::is_null(polymer_link->link_id) || polymer_link->link_id == "gap" || + // conn is residue-specific + (match && !(match->side1.comp.empty() && match->side2.comp.empty()))) + polymer_link->link_id.clear(); // disable polymer link, use conn + else + return; + } + + if (match) { + extra.link_id = match->id; + // add modifications from the link + find_resinfo(extra.res1)->add_mod(match->side1.mod, extra.aliasing1, extra.alt1); + find_resinfo(extra.res2)->add_mod(match->side2.mod, extra.aliasing2, extra.alt2); + } else { + if (ignore_unknown_links) + return; + // create a new ChemLink and add it to the monomer library + double ideal_dist = monlib.find_ideal_distance(cra1, cra2); + extra.link_id = add_auto_chemlink(monlib, + extra.res1->name, conn.partner1.atom_name, + extra.res2->name, conn.partner2.atom_name, + ideal_dist, 0.02); + } + extras.push_back(extra); +} + +void Topo::set_cispeps_in_structure(Structure& st) { + st.cispeps.clear(); + if (chain_infos.empty()) + return; + // model is not stored in Topo, let's determine it from chain_infos[0] + int model_num = 0; + for (const Model& model : st.models) + if (!model.chains.empty() && + &model.chains[0] == &chain_infos[0].chain_ref) + model_num = model.num; + for (ChainInfo& chain_info : chain_infos) + for (ResInfo& res_info : chain_info.res_infos) + for (Link& link : res_info.prev) + if (link.is_cis) { + CisPep cp; + cp.model_num = model_num; + cp.partner_c = AtomAddress(chain_info.chain_ref.name, *link.res1, "", link.alt1); + cp.partner_n = AtomAddress(chain_info.chain_ref.name, *link.res2, "", link.alt2); + cp.only_altloc = link.alt1 ? link.alt1 : link.alt2; + for (const Rule& rule : link.link_rules) + if (rule.rkind == RKind::Torsion) { + const Torsion& tor = torsions[rule.index]; + if (tor.restr->label == "omega") { + cp.reported_angle = tor.calculate(); + break; + } + } + st.cispeps.push_back(cp); + } +} + +namespace { + +void remove_hydrogens_from_atom(Topo::ResInfo* ri, + const std::string& atom_name, char alt) { + if (!ri) + return; + std::vector& atoms = ri->res->atoms; + const Restraints& rt = ri->get_final_chemcomp(alt).rt; + for (auto it = atoms.end(); it-- != atoms.begin(); ) { + if (it->is_hydrogen() && is_same_conformer(it->altloc, alt)) { + const Restraints::AtomId* heavy = rt.first_bonded_atom(it->name); + if (heavy && heavy->atom == atom_name) + atoms.erase(it); + } + } +} + +void set_cis_in_link(Topo::Link& link, bool is_cis) { + if (is_cis) { + if (ends_with(link.link_id, "TRANS")) + link.link_id.replace(link.link_id.size() - 5, 5, "CIS"); + } else { + if (ends_with(link.link_id, "CIS")) + link.link_id.replace(link.link_id.size() - 3, 3, "TRANS"); + } + link.is_cis = is_cis; +} + +void force_cispeps(Topo& topo, bool single_model, const Model& model, + const std::vector& cispeps) { + std::multimap cispep_index; + for (const CisPep& cp : cispeps) { + if (single_model || model.num == cp.model_num) + if (const Residue* res_n = model.find_cra(cp.partner_n).residue) + cispep_index.emplace(res_n, &cp); + } + for (Topo::ChainInfo& chain_info : topo.chain_infos) + for (Topo::ResInfo& res_info : chain_info.res_infos) { + auto range = cispep_index.equal_range(res_info.res); + for (Topo::Link& link : res_info.prev) { + bool is_cis = false; + for (auto i = range.first; i != range.second; ++i) { + const CisPep& cp = *i->second; + if (cp.partner_c.res_id.matches_noseg(*link.res1) && + (cp.only_altloc == '\0' || cp.only_altloc == link.alt1 + || cp.only_altloc == link.alt2)) + is_cis = true; + } + if (is_cis != link.is_cis) { + set_cis_in_link(link, is_cis); + const std::string& ch_name = chain_info.chain_ref.name; + topo.logger.note("link between ", atom_str(ch_name, *link.res1, "", link.alt1), + " and ", atom_str(ch_name, *link.res2, "", link.alt2), + " forced to ", link.link_id); + } + } + } +} + +struct Neigh { + char alt; + float occ; +}; +using NeighMap = std::unordered_multimap; + +// Assumes no hydrogens in the residue. +// Position and serial number are not assigned for new atoms. +void add_hydrogens_without_positions(Topo::ResInfo& ri, const NeighMap& neighbor_altlocs) { + std::vector& atoms = ri.res->atoms; + // Add H atom for each conformation (altloc) of the parent atom and its + // first neighbors. + for (size_t i = 0, size = atoms.size(); i != size; ++i) { + if (atoms[i].calc_flag == CalcFlag::NoHydrogen) + continue; + char parent_alt = atoms[i].altloc; + float parent_occ = atoms[i].occ; + std::map altlocs; // altloc + occupancy + if (parent_alt == '\0') { + // We could have neighbor 1 with altlocs A,B and neighbor 2 with C,D. + // Or A,B and A,B,C. Or, neighbor 1 could have different occupancy + // of altloc A than neighbor 2. We don't want to check for all possible + // weird cases. Only ensure that the added H has total occupancy <= 1. + float occ_sum = 0; + auto range = neighbor_altlocs.equal_range(atoms[i].serial); + for (auto it = range.first; it != range.second; ++it) { + const Neigh& neigh = it->second; + if (altlocs.count(neigh.alt) == 0 && neigh.occ < 1.0f && occ_sum + neigh.occ <= 1.001f) { + occ_sum += neigh.occ; + altlocs.emplace(neigh.alt, neigh.occ); + } + } + if (occ_sum - parent_occ > 0.001f) + for (auto& it : altlocs) + it.second *= parent_occ; + } + if (altlocs.empty()) + altlocs.emplace(parent_alt, parent_occ); + const ChemComp& cc = ri.get_final_chemcomp(parent_alt); + for (const Restraints::Bond& bond : cc.rt.bonds) { + // atoms may get re-allocated, so we can't set parent earlier + const Atom& parent = atoms[i]; + assert(!parent.is_hydrogen()); + const Restraints::AtomId* atom_id = bond.other(parent.name); + if (!atom_id) + continue; + auto it = cc.find_atom(atom_id->atom); + if (it == cc.atoms.end()) + fail("inconsistent _chem_comp " + cc.name); + if (it->is_hydrogen()) { + gemmi::Atom atom; + atom.name = it->id; + atom.element = it->el; + // calc_flag will be changed to Calculated when the position is set + atom.calc_flag = CalcFlag::Dummy; + atom.b_iso = parent.b_iso; + for (auto alt_occ : altlocs) { + atom.altloc = alt_occ.first; + atom.occ = alt_occ.second; + atoms.push_back(atom); + } + } + } + } +} + +NeighMap prepare_neighbor_altlocs(Topo& topo, const MonLib& monlib) { + // disable warnings here, so they are not printed twice + topo.logger.suspend(); + // Prepare bonds. Fills topo.bonds, monomer_rules/link_rules and rt_storage, + // but they are all reset when apply_all_restraints() is called again. + topo.only_bonds = true; + topo.apply_all_restraints(monlib); + topo.only_bonds = false; + topo.logger.resume(); // re-enable warnings + NeighMap neighbors; + for (const Topo::Bond& bond : topo.bonds) { + const Atom* a1 = bond.atoms[0]; + const Atom* a2 = bond.atoms[1]; + if (a2->altloc) + neighbors.emplace(a1->serial, Neigh{a2->altloc, a2->occ}); + if (a1->altloc && a1 != a2) + neighbors.emplace(a2->serial, Neigh{a1->altloc, a1->occ}); + } + return neighbors; +} + +} // anonymous namespace + +std::unique_ptr +prepare_topology(Structure& st, MonLib& monlib, size_t model_index, + HydrogenChange h_change, bool reorder, + const Logger& logger, bool ignore_unknown_links, bool use_cispeps) { + std::unique_ptr topo(new Topo); + topo->logger = logger; + if (model_index >= st.models.size()) + fail("no such model index: " + std::to_string(model_index)); + Model& model = st.models[model_index]; + topo->initialize_refmac_topology(st, model, monlib, ignore_unknown_links); + + if (use_cispeps) + force_cispeps(*topo, st.models.size() == 1, model, st.cispeps); + + // remove hydrogens, or change deuterium to fraction, or nothing + // and then check atom names + for (Topo::ChainInfo& chain_info : topo->chain_infos) + for (Topo::ResInfo& ri : chain_info.res_infos) { + Residue& res = *ri.res; + if (h_change != HydrogenChange::NoChange && h_change != HydrogenChange::Shift + // don't re-add H's if we don't have chemical component description + && (ri.orig_chemcomp != nullptr || h_change == HydrogenChange::Remove)) { + // remove/add hydrogens + remove_hydrogens(res); + } else { + // Special handling of Deuterium - mostly for Refmac. + // Note: if the model has deuterium, it gets modified. + if (replace_deuterium_with_fraction(res)) { + // deuterium names usually differ from the names in dictionary + for (Atom& atom : res.atoms) + if (atom.name[0] == 'D' && atom.fraction != 0) { + const ChemComp& cc = ri.get_final_chemcomp(atom.altloc); + if (cc.find_atom(atom.name) == cc.atoms.end()) + atom.name[0] = 'H'; + } + st.has_d_fraction = true; + } + } + // check atom names + for (Atom& atom : res.atoms) { + const ChemComp& cc = ri.get_final_chemcomp(atom.altloc); + if (!cc.has_atom(atom.name)) { + std::string msg = "definition not found for " + + atom_str(chain_info.chain_ref, *ri.res, atom); + if (ri.orig_chemcomp && ri.orig_chemcomp->has_atom(atom.name)) { + msg += " (linkage should remove this atom)"; + } else { + auto it = cc.find_atom_by_old_name(atom.name); + if (it != cc.atoms.end()) + cat_to(msg, " (replace ", atom.name, " with ", it->id, ')'); + } + topo->logger.err(msg); + } + } + } + + // add hydrogens + if (h_change == HydrogenChange::ReAdd || + h_change == HydrogenChange::ReAddButWater || + h_change == HydrogenChange::ReAddKnown) { + NeighMap neighbor_altlocs = prepare_neighbor_altlocs(*topo, monlib); + for (Topo::ChainInfo& chain_info : topo->chain_infos) + for (Topo::ResInfo& ri : chain_info.res_infos) { + Residue& res = *ri.res; + if (ri.orig_chemcomp != nullptr && + (h_change == HydrogenChange::ReAdd || !res.is_water())) { + add_hydrogens_without_positions(ri, neighbor_altlocs); + + // a special handling of HIS for compatibility with Refmac + if (res.name == "HIS") { + for (gemmi::Atom& atom : ri.res->atoms) + if (atom.name == "HD1" || atom.name == "HE2") + atom.occ = 0; + } + } + } + } + + // sort atoms in residues + for (Topo::ChainInfo& chain_info : topo->chain_infos) + for (Topo::ResInfo& ri : chain_info.res_infos) + if (reorder && ri.orig_chemcomp) { + Residue& res = *ri.res; + const ChemComp& cc = *ri.orig_chemcomp; + for (Atom& atom : res.atoms) { + auto it = cc.find_atom(atom.name); + // If atom.name is not found (b/c it was added in a modification), + // the atom will be put after original atoms. + atom.serial = int(it - cc.atoms.begin()); // temporary, for sorting only + } + std::sort(res.atoms.begin(), res.atoms.end(), [](const Atom& a, const Atom& b) { + return a.serial != b.serial ? a.serial < b.serial + : a.altloc < b.altloc; + }); + // check for missing altloc + for (auto atom = res.atoms.begin(); atom + 1 < res.atoms.end(); ++atom) + if (atom->name == (atom + 1)->name && atom->altloc == '\0') + topo->logger.err("missing altloc in ", atom_str(chain_info.chain_ref, *ri.res, *atom)); + } + + // for atoms with ad-hoc links, for now we don't want hydrogens + if (!ignore_unknown_links && h_change != HydrogenChange::NoChange) { + auto remove_h_from_auto_links = [&](const Topo::Link& link) { + const ChemLink* cl = monlib.get_link(link.link_id); + if (cl && starts_with(cl->name, "auto-")) { + const Restraints::Bond& bond = cl->rt.bonds.at(0); + remove_hydrogens_from_atom(topo->find_resinfo(link.res1), bond.id1.atom, link.alt1); + remove_hydrogens_from_atom(topo->find_resinfo(link.res2), bond.id2.atom, link.alt2); + } + }; + for (const Topo::ChainInfo& chain_info : topo->chain_infos) + for (const Topo::ResInfo& res_info : chain_info.res_infos) + for (const Topo::Link& link : res_info.prev) + remove_h_from_auto_links(link); + for (const Topo::Link& link : topo->extras) + remove_h_from_auto_links(link); + } + + // fill Topo::bonds, angles, ... and ResInfo::monomer_rules, Links::link_rules + topo->apply_all_restraints(monlib); + // fill bond_index, angle_index, etc + topo->create_indices(); + + // the hydrogens added previously have positions not set + if (h_change != HydrogenChange::NoChange) + place_hydrogens_on_all_atoms(*topo); + + if (h_change == HydrogenChange::ReAddKnown) { + // To leave only known hydrogens, we remove Hs with zero occupancy. + // As a side-effect, it removes any H atoms on zero-occupancy parents. + for (Chain& chain : model.chains) + for (Residue& res : chain.residues) + vector_remove_if(res.atoms, [](Atom& a) { return a.is_hydrogen() && a.occ == 0; }); + + // disable warnings here, so they are not printed twice + topo->logger.suspend(); + // re-set restraints and indices + topo->apply_all_restraints(monlib); + topo->create_indices(); + topo->logger.resume(); + } + + assign_serial_numbers(model); + return topo; +} + +std::vector find_missing_atoms(const Topo& topo, bool including_hydrogen) { + std::vector ret; + for (const Topo::ChainInfo& chain_info : topo.chain_infos) + for (const Topo::ResInfo& ri : chain_info.res_infos) { + // check only the first conformation + const Topo::FinalChemComp& fcc = ri.chemcomps.at(0); + char altloc = fcc.altloc != '\0' ? fcc.altloc : '*'; + for (const ChemComp::Atom& at : fcc.cc->atoms) + if ((including_hydrogen || !at.is_hydrogen()) && + ri.res->find_atom(at.id, altloc) == nullptr) + ret.emplace_back(chain_info.chain_ref.name, *ri.res, at.id, fcc.altloc); + } + return ret; +} + +} diff --git a/image_analysis/IndexAndRefine.cpp b/image_analysis/IndexAndRefine.cpp index 8d899bec1..eb04815f4 100644 --- a/image_analysis/IndexAndRefine.cpp +++ b/image_analysis/IndexAndRefine.cpp @@ -637,6 +637,12 @@ void IndexAndRefine::QuickPredictAndIntegrate(DataMessage &msg, }; ApplyPredictionRange(settings_prediction, experiment, latt); prediction_centring_ = settings_prediction.centering; + if (stills_window_ && !experiment.GetGoniometer().has_value()) { + settings_prediction.window_c0 = stills_window_->c0; + settings_prediction.window_ang = stills_window_->ang; + settings_prediction.window_bw = stills_window_->bw; + settings_prediction.window_q_scale = stills_window_->q_scale; + } // Online is bounded by what the image-buffer slot can carry, offline by the prediction limit; both // come from BraggPrediction so the cap, the prediction and the transport headroom cannot drift. @@ -948,7 +954,7 @@ void IndexAndRefine::ScaleImage(DataMessage &msg, IntegrationOutcome& outcome) { return; auto scaling_start_time = std::chrono::steady_clock::now(); - reindex_resolver->Resolve(outcome.reflections, outcome.latt); + outcome.reference_cc = reindex_resolver->Resolve(outcome.reflections, outcome.latt); auto scaling_end_time = std::chrono::steady_clock::now(); msg.image_scale_time_s = std::chrono::duration(scaling_end_time - scaling_start_time).count(); } diff --git a/image_analysis/IndexAndRefine.h b/image_analysis/IndexAndRefine.h index 4ff2a5e01..5eaae7f43 100644 --- a/image_analysis/IndexAndRefine.h +++ b/image_analysis/IndexAndRefine.h @@ -90,6 +90,15 @@ struct FrameIndexerCalls { std::optional lattice_found; }; +// The half-width of a still's prediction window against resolution, sqrt(c0^2 + (ang d*)^2 + (bw |q_z|)^2) +// (1/A, rad, relative), see IndexAndRefine::SetStillsWindow. +struct StillsWindow { + float c0 = 0.0f; + float ang = 0.0f; + float bw = 0.0f; + float q_scale = 1.0f; // centred on the excitation error of the reciprocal lattice scaled by this +}; + class IndexAndRefine { // When false, the current image's result is still returned via the outgoing message, but the // whole-run integration_outcome vector is not retained (viewer live/interactive use, which never @@ -144,6 +153,9 @@ class IndexAndRefine { // different error model (ISa 7.8 -> 3.6), post-refined the distance 119 um away, and the second // pass re-indexed 49 of 60 frames instead of 60. bool predict_all_centring_nodes_ = false; + // Stills: the excitation-error window every frame predicts through, as a curve in d* (see + // SetStillsWindow); empty, each frame predicts through twice its own profile radius. + std::optional stills_window_; // The lattice centring the last prediction actually ran in: 'P' unless a user-fixed space group // made it reject that group's centring absences. What a caller needs to know whether the // integration covers every node of the lattice - a P1 merge does. @@ -223,6 +235,10 @@ public: void SetPredictionMosaicityOverride(std::vector mosaicity_per_frame) { prediction_mosaicity_override_ = std::move(mosaicity_per_frame); } + // Stills: predict every frame through |dist_ewald| <= sqrt(c0^2 + (ang d*)^2 + (bw |q_z|)^2), a window + // that follows the run's rocking width, in place of twice the frame's own profile radius. Empty + // returns to the per-frame window. + void SetStillsWindow(std::optional w) { stills_window_ = w; } // Predict the centring-absent reflections too, even with a fixed space group - see the member. void PredictAllCentringNodes(bool on) { predict_all_centring_nodes_ = on; } // The centring prediction ran in - see the member. diff --git a/image_analysis/IntegrationOutcome.h b/image_analysis/IntegrationOutcome.h index a16f41957..2d1b37cc0 100644 --- a/image_analysis/IntegrationOutcome.h +++ b/image_analysis/IntegrationOutcome.h @@ -4,6 +4,7 @@ #pragma once #include +#include #include "../common/Reflection.h" #include "../common/CrystalLattice.h" @@ -23,6 +24,9 @@ struct IntegrationOutcome { std::optional image_scale_cc_n; std::optional image_scale_g; std::optional image_scale_wedge_deg; + // Stills with a reference: the image's CC with it in each indexing it was offered, as indexed first + // (ReindexAmbiguityResolver::Resolve); empty otherwise. + std::vector reference_cc; }; // How far apart, in frames, two partials of one raw hkl may sit and still belong to the same rocking diff --git a/image_analysis/MXAnalysisWithoutFPGA.cpp b/image_analysis/MXAnalysisWithoutFPGA.cpp index e56230cd4..66976fc29 100644 --- a/image_analysis/MXAnalysisWithoutFPGA.cpp +++ b/image_analysis/MXAnalysisWithoutFPGA.cpp @@ -535,8 +535,15 @@ void MXAnalysisWithoutFPGA::UpdateMaskResolution(const SpotFindingSettings &sett std::vector MXAnalysisWithoutFPGA::IntegrateOnImage(const std::vector &predicted, size_t npredicted, int64_t image_number) { const auto &modules = experiment.GetModules(); - if (modules.empty()) - return bragg_engine->Run(*preprocessor_buffer, predicted, npredicted, image_number); + const auto drop_shadow_clipped = [this](std::vector &reflections) { + DropShadowClipped(reflections, mask.GetMask(), static_cast(experiment.GetXPixelsNumConv()), + static_cast(experiment.GetYPixelsNumConv()), experiment.GetBraggIntegrationSettings().GetR1()); + }; + if (modules.empty()) { + auto ret = bragg_engine->Run(*preprocessor_buffer, predicted, npredicted, image_number); + drop_shadow_clipped(ret); + return ret; + } // Predictions are where the reflections fall on the detector plane; the engine reads the image, so // each goes to where its panel put those pixels, and comes back to the plane once integrated. One in @@ -557,6 +564,7 @@ std::vector MXAnalysisWithoutFPGA::IntegrateOnImage(const std::vecto on_image.push_back(r); } auto ret = bragg_engine->Run(*preprocessor_buffer, on_image, on_image.size(), image_number); + drop_shadow_clipped(ret); for (auto &r: ret) { const int64_t panel = modules.ModuleOfImagePixel(r.predicted_x, r.predicted_y); const auto [px, py] = modules.ImageToPlane(panel, r.predicted_x, r.predicted_y); @@ -570,3 +578,26 @@ std::vector MXAnalysisWithoutFPGA::IntegrateOnImage(const std::vecto } return ret; } + +// A signal disk that lost pixels to the mask is otherwise kept, its profile fitted over the pixels that +// remain. That holds for a gap or a dead pixel, which take nothing from their neighbours, but not for the +// beam-stop shadow: the mask is drawn where the BACKGROUND is dimmed, and the Bragg signal's half-shadow +// does not end where the background's does, so the rest of such a disk is attenuated too. Measured against +// their symmetry mates, these observations came out 12-60 % low on the sweeps whose shadow edge crosses +// busy low-resolution reflections (CCD and pixel detectors alike), and level with them elsewhere. +void DropShadowClipped(std::vector &reflections, const std::vector &mask, + int W, int H, float r1) { + std::erase_if(reflections, [&](const Reflection &r) { + const int x0 = std::max(0, static_cast(std::floor(r.predicted_x - r1))); + const int x1 = std::min(W - 1, static_cast(std::ceil(r.predicted_x + r1))); + const int y0 = std::max(0, static_cast(std::floor(r.predicted_y - r1))); + const int y1 = std::min(H - 1, static_cast(std::ceil(r.predicted_y + r1))); + for (int y = y0; y <= y1; y++) + for (int x = x0; x <= x1; x++) { + const float dx = static_cast(x) - r.predicted_x, dy = static_cast(y) - r.predicted_y; + if (dx * dx + dy * dy < r1 * r1 && (mask[static_cast(y) * W + x] & (1u << PixelMask::BeamStopPixelBit))) + return true; + } + return false; + }); +} diff --git a/image_analysis/MXAnalysisWithoutFPGA.h b/image_analysis/MXAnalysisWithoutFPGA.h index 3d3b6e802..27cdff2e5 100644 --- a/image_analysis/MXAnalysisWithoutFPGA.h +++ b/image_analysis/MXAnalysisWithoutFPGA.h @@ -26,6 +26,12 @@ class CudaStream; class AdaptiveSpotFinderGPU; +// Leave out the reflections whose signal disk - radius r1 about the predicted position, in image +// coordinates - reaches a pixel of the beam-stop shadow (PixelMask::BeamStopPixelBit of `mask`, a +// width x height image). +void DropShadowClipped(std::vector &reflections, const std::vector &mask, + int width, int height, float r1); + // MXAnalysisWithoutFPGA is not thread safe - it has to owned by a single thread class MXAnalysisWithoutFPGA { const DiffractionExperiment &experiment; diff --git a/image_analysis/WriteReflections.cpp b/image_analysis/WriteReflections.cpp index fdfa111a8..3383f3c3f 100644 --- a/image_analysis/WriteReflections.cpp +++ b/image_analysis/WriteReflections.cpp @@ -2,6 +2,7 @@ // SPDX-License-Identifier: GPL-3.0-only #include "WriteReflections.h" +#include "geom_refinement/CellEsd.h" #include "scale_merge/Merge.h" #include "scale_merge/HKLKey.h" #include "scale_merge/TwinningAnalysis.h" @@ -19,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -155,18 +157,38 @@ void AddProvenanceHistory(std::vector &history, const OutputProvena add("Collected: ", provenance.collection_date); } -// _entry, _cell and _symmetry. +// An e.s.d. as written: "." for a parameter the symmetry fixes (its e.s.d. is zero), as SHELX's ZERR +// writes 0 for it. +std::string EsdStr(double esd, int decimals) { + return esd < CELL_ESD_FIXED ? std::string(".") : Fmt(esd, decimals); +} + +// _entry, _cell (with the e.s.d.s where there are any, and the _cell_measurement they came from) and +// _symmetry. void WriteBlockHeader(std::ostream &out, const std::string &entry_id, const UnitCell &unitCell, - const gemmi::SpaceGroup &sg) { + const gemmi::SpaceGroup &sg, const CellEsd *esd = nullptr) { out << "_entry.id " << entry_id << "\n"; out << "#\n"; out << "_cell.entry_id " << entry_id << "\n"; - out << "_cell.length_a " << Fmt(unitCell.a, 3) << "\n"; - out << "_cell.length_b " << Fmt(unitCell.b, 3) << "\n"; - out << "_cell.length_c " << Fmt(unitCell.c, 3) << "\n"; - out << "_cell.angle_alpha " << Fmt(unitCell.alpha, 2) << "\n"; - out << "_cell.angle_beta " << Fmt(unitCell.beta, 2) << "\n"; - out << "_cell.angle_gamma " << Fmt(unitCell.gamma, 2) << "\n"; + out << "_cell.length_a " << Fmt(unitCell.a, 4) << "\n"; + out << "_cell.length_b " << Fmt(unitCell.b, 4) << "\n"; + out << "_cell.length_c " << Fmt(unitCell.c, 4) << "\n"; + out << "_cell.angle_alpha " << Fmt(unitCell.alpha, 3) << "\n"; + out << "_cell.angle_beta " << Fmt(unitCell.beta, 3) << "\n"; + out << "_cell.angle_gamma " << Fmt(unitCell.gamma, 3) << "\n"; + if (esd) { + out << "_cell.length_a_esd " << EsdStr(esd->esd[0], 5) << "\n"; + out << "_cell.length_b_esd " << EsdStr(esd->esd[1], 5) << "\n"; + out << "_cell.length_c_esd " << EsdStr(esd->esd[2], 5) << "\n"; + out << "_cell.angle_alpha_esd " << EsdStr(esd->esd[3], 4) << "\n"; + out << "_cell.angle_beta_esd " << EsdStr(esd->esd[4], 4) << "\n"; + out << "_cell.angle_gamma_esd " << EsdStr(esd->esd[5], 4) << "\n"; + out << "#\n"; + out << "_cell_measurement.entry_id " << entry_id << "\n"; + out << "_cell_measurement.reflns_used " << esd->reflections << "\n"; + out << "_cell_measurement.theta_min " << Fmt(esd->theta_min_deg, 2) << "\n"; + out << "_cell_measurement.theta_max " << Fmt(esd->theta_max_deg, 2) << "\n"; + } out << "#\n"; out << "_symmetry.entry_id " << entry_id << "\n"; out << "_symmetry.space_group_name_H-M " << CifStr(sg.hm) << "\n"; @@ -270,7 +292,8 @@ void WriteMmcifReflections(const std::vector &reflections, const TwinningAnalysisResult &twinning, const OutputProvenance &provenance, const std::string &filename, - size_t nthreads) { + size_t nthreads, + const CellEsd *cell_esd) { std::ofstream out(filename); if (!out) @@ -287,7 +310,7 @@ void WriteMmcifReflections(const std::vector &reflections, // ---------- data block ---------- out << "data_sample" << "\n"; out << "#\n"; - WriteBlockHeader(out, entry_id, unitCell, sg); + WriteBlockHeader(out, entry_id, unitCell, sg, cell_esd); // ---------- _audit ---------- out << "_audit.revision_id 1\n"; @@ -774,6 +797,63 @@ void WriteShelxHklReflections(const std::vector &fulls, }); } +void WriteShelxIns(const UnitCell &cell, const CellEsd *esd, const DiffractionExperiment &experiment, + const std::string &title, const std::string &filename) { + const gemmi::SpaceGroup &sg = experiment.GetSpaceGroupOrP1(); + const gemmi::GroupOps ops = sg.operations(); + // LATT is the centring, positive where the group holds an inversion centre at the origin, which + // SHELX then generates itself - so only one of each -1 pair is listed (the proper rotations). A + // centring SHELX has no code for gets LATT -1 with every operator spelled out. + const std::string centrings = "PIRFABC"; + const char centring = ops.find_centering(); + const size_t latt_code = centring ? centrings.find(centring) : std::string::npos; + bool origin_inversion = false; + if (const gemmi::Op *inv = ops.find_by_rotation(gemmi::Op::inversion_rot())) + for (const auto &t : ops.cen_ops) + origin_inversion |= inv->tran == t; + const bool centro = latt_code != std::string::npos && origin_inversion; + int latt = latt_code != std::string::npos ? static_cast(latt_code) + 1 : 1; + std::vector symm; + for (const auto &op : latt_code != std::string::npos ? ops.sym_ops : ops.all_ops_sorted()) + if (!(op == gemmi::Op::identity()) && !(centro && op.det_rot() < 0)) + symm.push_back(op); + + // SFAC and UNIT have to be the formula, which the diffraction does not tell: an organic one is put + // in its place at 18 A^3 per non-hydrogen atom, for the user to replace. + const int nonh = std::max(1, static_cast(std::lround(gemmi::UnitCell(cell).volume / 18.0))); + const int n_c = std::max(1, static_cast(std::lround(0.7 * nonh))); + const int n_n = std::max(1, static_cast(std::lround(0.15 * nonh))); + const int n_o = std::max(1, nonh - n_c - n_n); + + std::ofstream out(filename); + if (!out) + throw std::runtime_error("WriteShelxIns: cannot open " + filename); + char line[256]; + out << "TITL " << title << " in " << sg.xhm() << "\n"; + out << "REM Rugnux " << jfjoch_version() << ": CELL and ZERR from the data, SFAC/UNIT a placeholder" + " to replace with the formula\n"; + std::snprintf(line, sizeof(line), "CELL %.5f %.5f %.5f %.5f %.4f %.4f %.4f\n", experiment.GetWavelength_A(), + cell.a, cell.b, cell.c, cell.alpha, cell.beta, cell.gamma); + out << line; + // ZERR's first number is Z, the formula units in the cell: one per general position is assumed. + if (esd) { + std::snprintf(line, sizeof(line), "ZERR %d %.5f %.5f %.5f %.4f %.4f %.4f\n", ops.order(), esd->esd[0], + esd->esd[1], esd->esd[2], esd->esd[3], esd->esd[4], esd->esd[5]); + out << line; + } + out << "LATT " << (centro ? latt : -latt) << "\n"; + for (const auto &op : symm) { + std::string t = op.triplet(); + for (auto &ch : t) + ch = static_cast(std::toupper(static_cast(ch))); + out << "SYMM " << t << "\n"; + } + out << "SFAC C H N O\n"; + out << "UNIT " << n_c << " " << n_c << " " << n_n << " " << n_o << "\n"; + out << "HKLF 4\n"; + out << "END\n"; +} + namespace { // The detector position an observation is written at: a reflection too weak to have a measured @@ -1233,4 +1313,6 @@ void WriteReflections(const std::vector &reflections, WriteShelxHklReflections(*scaled_fulls, filename + ".hkl", nthreads); else WriteShelxHklReflections(reflections, experiment, filename + ".hkl", nthreads); + WriteShelxIns(unitCell, nullptr, experiment, std::filesystem::path(filename).filename().string(), + filename + ".ins"); } diff --git a/image_analysis/WriteReflections.h b/image_analysis/WriteReflections.h index 1d9053fd8..b48b05018 100644 --- a/image_analysis/WriteReflections.h +++ b/image_analysis/WriteReflections.h @@ -14,6 +14,7 @@ struct MergeStatistics; struct TwinningAnalysisResult; +struct CellEsd; // geom_refinement/CellEsd.h // The error model as it is reported, already formatted. `isa` is the whole-range 1/sqrt(a*b), the // same quantity XDS's ISa denotes, so a file written here is directly comparable with a CORRECT.LP; @@ -36,8 +37,12 @@ struct OutputProvenance { std::string collection_date; // as the input states it (NXmx /entry/start_time), ISO-8601 }; +// An e.s.d. below this is a parameter the symmetry fixes: written "." in the mmCIF. +constexpr double CELL_ESD_FIXED = 1e-9; + // The merged reflections, their statistics and the experiment, as one PDBx/mmCIF data block. // nthreads: workers for the per-reflection row formatting, which is the bulk of the file. +// cell_esd: the cell's e.s.d.s (_cell.*_esd, _cell_measurement), where there are any. void WriteMmcifReflections(const std::vector &reflections, const UnitCell &unitCell, const DiffractionExperiment &experiment, @@ -46,7 +51,8 @@ void WriteMmcifReflections(const std::vector &reflections, const TwinningAnalysisResult &twinning, const OutputProvenance &provenance, const std::string &filename, - size_t nthreads); + size_t nthreads, + const CellEsd *cell_esd = nullptr); // The merged MTZ: H K L IMEAN SIGIMEAN [I(+) SIGI(+) I(-) SIGI(-)] F SIGF [F(+) SIGF(+) F(-) SIGF(-)] // FreeR_flag, one row per unique reflection in the CCP4 anomalous layout, the bracketed columns only where @@ -75,6 +81,12 @@ void WriteShelxHklReflections(const std::vector &fulls, const std::string &filename, size_t nthreads); +// The SHELX instruction file to go with the .hkl: TITL, CELL (at the wavelength), ZERR where the +// e.s.d.s are known, LATT, SYMM, a placeholder SFAC/UNIT, HKLF 4, END - what SHELXT reads, and what +// SHELXL's CIF takes the cell and its e.s.d.s from. +void WriteShelxIns(const UnitCell &cell, const CellEsd *esd, const DiffractionExperiment &experiment, + const std::string &title, const std::string &filename); + // Unmerged observations in the column and batch-header layout POINTLESS writes: aimless, pointless, // careless and iotbx.merging_statistics all read that layout. H K L are the ASU indices and M/ISYM // recovers the index the reflection was measured at (which is what careless needs to see the crystal diff --git a/image_analysis/beam_stop/SHADOW_FINDER.md b/image_analysis/beam_stop/SHADOW_FINDER.md index 2f15a418d..0406eb6c3 100644 --- a/image_analysis/beam_stop/SHADOW_FINDER.md +++ b/image_analysis/beam_stop/SHADOW_FINDER.md @@ -206,15 +206,18 @@ beam-stop mask is an **offline** (Rugnux + viewer) feature and never goes to the than it went in - on one stills run the outer rings carried dim lobes over the detector's corners, sitting on the arm search's thresholds, so that the third decimal of the stated degree moved thousands of pixels in and out of the mask. So before the correction the mean projection is + pooled over 9 x 9 pixels (a sparse background otherwise leaves the sector medians at zero) and compared ring by ring with the profile a polarized source gives each 64 px band (each ring relative to its upper decile, each sector the brighter of itself and the one opposite, since a shadow is rarely on both sides; a band counted where three quarters of the azimuth are seen). The stated degree is applied in the plane the background follows when it follows one clearly - a correlation - above 0.5 and at least 0.3 of a fully polarized source's modulation - and as stated otherwise. Over + above 0.5 and at least 0.3 of a fully polarized source's modulation, but under twice it, which no + polarized source gives (a long-distance sweep's background carries such a harmonic from something + else) - and as stated otherwise. Over the rotation and stills corpora only the run whose plane lies along the image's y axis is turned; on every other run the correction, and so the mask, is what it was. An experiment that states no polarization is left uncorrected, as before. What was applied is read back with - `GetAppliedPolarization()`, and `rugnux`'s pre-scan writes it into the experiment, so the + `GetAppliedPolarization()` (and the correlation and scale it was decided on with `GetPlaneEvidence()`), and `rugnux`'s pre-scan writes it into the experiment, so the integration's correction follows the same plane: the plane is decided once, here. - **Unsigned saturation**: for unsigned images a detector-saturating reflection collides with the no-data sentinel and is skipped; harmless in practice (such reflections do not sit under the diff --git a/image_analysis/beam_stop/ShadowFinder.cpp b/image_analysis/beam_stop/ShadowFinder.cpp index 1081eb1bd..dd681d1b1 100644 --- a/image_analysis/beam_stop/ShadowFinder.cpp +++ b/image_analysis/beam_stop/ShadowFinder.cpp @@ -400,7 +400,7 @@ RingValues bin_by_ring(const Plane &values, const Plane &valid, return rv; } -// The plane the background shows (PolarizationPlane): +1, -1, or 0 where it does not show one. +// The plane the background shows, and what it is decided on (PolarizationPlane). // The degree of polarization cannot be told from the data, but the plane can, and it is not always the // one the experiment assumes - a detector mounted a quarter turn from another on the same kind of // beamline puts the suppressed direction along the image's other axis. Divided by the factor of the @@ -408,8 +408,8 @@ RingValues bin_by_ring(const Plane &values, const Plane &valid, // then carried dim lobes over the detector's corners that sat on the arm search's thresholds, so that // the third decimal of p moved thousands of pixels in and out of the mask. // `mean` is the mean projection (W x H, NaN where unusable), compared ring by ring about the centre. -float measured_plane(const std::vector &mean, int W, int H, float centre_x, float centre_y, - const float *det_matrix, float distance_px, size_t nthreads) { +PlaneEvidence measured_plane(const std::vector &mean, int W, int H, float centre_x, float centre_y, + const float *det_matrix, float distance_px, size_t nthreads) { const int n_pixels = W * H; Plane value(n_pixels); Plane valid(n_pixels); @@ -432,6 +432,23 @@ float measured_plane(const std::vector &mean, int W, int H, float centre_ const int max_radius = max_radius_atomic.load(); const int n_bands = max_radius / HARMONIC_BAND_PX + 1; + // Pooled over a small box first, as the mask is (GetMask): a background of a fraction of a count per + // pixel per frame leaves most single pixels at zero over the frames read, and the sector medians below + // were then zero too, so that on a large photon-counting detector the plane could not be decided at all. + { + Plane num(n_pixels); + Plane den(n_pixels); + for (int i = 0; i < n_pixels; i++) { + num[i] = valid[i] ? value[i] : 0.0; + den[i] = valid[i] ? 1 : 0; + } + const auto pooled_sum = box_sum(num, W, H, PLANE_POOL_PX, nthreads); + const auto pooled_count = box_sum(den, W, H, PLANE_POOL_PX, nthreads); + for (int i = 0; i < n_pixels; i++) + if (valid[i]) + value[i] = static_cast(pooled_sum[i] / pooled_count[i]); + } + // Each ring is taken relative to its upper decile rather than its median: where a shadow covers // half of a ring the median sits on the shadow's edge and jumps from ring to ring. const RingValues rings = bin_by_ring(value, valid, radius, max_radius, nthreads); @@ -713,6 +730,11 @@ std::optional ShadowFinder::GetAppliedPolarization() const { return applied_polarization; } +std::optional ShadowFinder::GetPlaneEvidence() const { + std::unique_lock ul(m); + return plane_evidence; +} + std::vector ShadowFinder::GetMeanProjection() const { std::unique_lock ul(m); #ifdef JFJOCH_USE_CUDA @@ -739,6 +761,7 @@ std::vector ShadowFinder::GetMask(size_t nthreads) const { if (nthreads == 0) nthreads = AvailableCpus(); applied_polarization.reset(); + plane_evidence.reset(); #ifdef JFJOCH_USE_CUDA // Where every frame went to the device the mask is made there too, from the projection as it lies - // when it lies as the detector does (no panel table). @@ -761,10 +784,9 @@ std::vector ShadowFinder::GetMask(size_t nthreads) const { setup.gain = gain; setup.has_polarization = polarization.has_value(); if (polarization) { - setup.polarization = PlaneApplied(*polarization, - measured_plane(gpu->MeanProjection(pixel_mask), width, height, beam_x, - beam_y, setup.det_matrix, - setup.distance_mm / setup.pixel_size_mm, nthreads)); + plane_evidence = measured_plane(gpu->MeanProjection(pixel_mask), width, height, beam_x, beam_y, + setup.det_matrix, setup.distance_mm / setup.pixel_size_mm, nthreads); + setup.polarization = PlaneApplied(*polarization, plane_evidence->plane); applied_polarization = setup.polarization; } return gpu->Mask(setup, pixel_mask); @@ -833,8 +855,9 @@ std::vector ShadowFinder::MaskOn(const Projection &p, const std::vecto projection[i] = valid_count[i] > 0 && known_mask[i] == 0 ? static_cast(static_cast(sum_value[i]) / valid_count[i]) : NAN; }); - polarization_applied = PlaneApplied(*polarization, measured_plane(projection, W, H, centre_x, centre_y, - det_matrix.data(), distance_px, nthreads)); + plane_evidence = measured_plane(projection, W, H, centre_x, centre_y, det_matrix.data(), distance_px, + nthreads); + polarization_applied = PlaneApplied(*polarization, plane_evidence->plane); applied_polarization = polarization_applied; } @@ -1255,7 +1278,7 @@ void HarmonicFit(const std::vector §or_median, int n_bands, } } -float PolarizationPlane(const std::vector §or_median, const std::vector &litude) { +PlaneEvidence PolarizationPlane(const std::vector §or_median, const std::vector &litude) { const int n_bands = static_cast(amplitude.size()); // The modulation is the same at phi and at phi + 180 deg; what shadows the detector rarely is - an // arm, a pin or a goniometer stands on one side of the beam - and shadows only darken. So each @@ -1278,9 +1301,10 @@ float PolarizationPlane(const std::vector §or_median, const std::vec // A horizontally polarized source makes the background dim along lab x, c < 0, by more where the // modulation it can give is larger; a vertically polarized one makes it dim along lab y, c > 0. A // plane is taken only where the bands' harmonics follow its profile (PLANE_CORRELATION) and amount - // to a good part of what a fully polarized source gives (PLANE_MODULATION): a background with - // little modulation of its own decides nothing. With no modulation at all both are NaN, which - // decides nothing too. + // to a good part of what a fully polarized source gives (PLANE_MODULATION) without exceeding what any + // source can give (PLANE_MODULATION_MAX): a background with little modulation of its own decides + // nothing, and neither does one modulated by something else. With no modulation at all both are NaN, + // which decides nothing too. double ca = 0.0, cc = 0.0, aa = 0.0; for (int band = 0; band < n_bands; band++) { if (!seen_enough[band]) @@ -1289,13 +1313,16 @@ float PolarizationPlane(const std::vector §or_median, const std::vec cc += c[band] * c[band]; aa += amplitude[band] * amplitude[band]; } - const double correlation = ca / std::sqrt(cc * aa); - const double modulation = ca / aa; - if (correlation > PLANE_CORRELATION && modulation > PLANE_MODULATION) - return -1.0f; - if (correlation < -PLANE_CORRELATION && modulation < -PLANE_MODULATION) - return 1.0f; - return 0.0f; + PlaneEvidence evidence; + evidence.correlation = ca / std::sqrt(cc * aa); + evidence.modulation = ca / aa; + if (std::fabs(evidence.modulation) < PLANE_MODULATION_MAX) { + if (evidence.correlation > PLANE_CORRELATION && evidence.modulation > PLANE_MODULATION) + evidence.plane = -1.0f; + if (evidence.correlation < -PLANE_CORRELATION && evidence.modulation < -PLANE_MODULATION) + evidence.plane = 1.0f; + } + return evidence; } } // namespace shadow_finder diff --git a/image_analysis/beam_stop/ShadowFinder.h b/image_analysis/beam_stop/ShadowFinder.h index 168c7087b..43e871491 100644 --- a/image_analysis/beam_stop/ShadowFinder.h +++ b/image_analysis/beam_stop/ShadowFinder.h @@ -16,6 +16,7 @@ #include "../../common/DiffractionGeometry.h" #include "../../common/JFJochMessages.h" #include "../../common/PixelMask.h" +#include "ShadowFinderInternal.h" #ifdef JFJOCH_USE_CUDA #include "ShadowAccumulatorGPU.h" #endif @@ -63,6 +64,7 @@ class ShadowFinder { const std::optional polarization; // unset leaves the background as it was measured // What the last GetMask divided by: the stated degree, in the plane the background shows. mutable std::optional applied_polarization; + mutable std::optional plane_evidence; // what that plane was decided on // Detector units per photon (BraggIntegrationSettings::PixelGain; 1 for counted photons). The // shadow is a ratio and does not see it, but the two tests made in counts do: how significant a // deficit is, and the count a pixel must reach to have recorded a reflection. @@ -166,6 +168,8 @@ public: // background shows where it shows one clearly, and as stated otherwise. The run's other corrections // take it from here, so that the plane is decided once. Unset with no stated degree, or before GetMask. [[nodiscard]] std::optional GetAppliedPolarization() const; + // What the last GetMask decided the plane on. Unset where GetAppliedPolarization is. + [[nodiscard]] std::optional GetPlaneEvidence() const; // Mean counts per pixel over the frames added, NAN where nothing was counted. This is the // projection GetMask() tests, so anything else that wants the background before indexing diff --git a/image_analysis/beam_stop/ShadowFinderInternal.h b/image_analysis/beam_stop/ShadowFinderInternal.h index 47036e335..7295f4813 100644 --- a/image_analysis/beam_stop/ShadowFinderInternal.h +++ b/image_analysis/beam_stop/ShadowFinderInternal.h @@ -125,19 +125,34 @@ void HarmonicFit(const std::vector §or_median, int n_bands, // How closely, over the radial bands, the background's cos 2phi harmonic must follow the profile a // polarized source gives it (the correlation), and how large it must be against the profile of a fully // polarized source (the least-squares scale), before the plane is taken from the background rather -// than as stated. On 46 rotation sweeps and 11 stills runs whose plane is horizontal, the largest values -// towards the vertical plane are 0.48 and 0.18, the latter on a background with almost no modulation; -// on a stills run whose plane lies along the image's y axis they are 0.998 and 0.47 - the scale reduced -// there by the placeholder distance the pre-scan reads it at. +// than as stated. Of 244 synchrotron rotation sweeps, all polarized horizontally, 216 show that plane +// past both; apart from the one under PLANE_MODULATION_MAX the largest values towards the vertical plane +// are 0.01 and 0.002, and on 11 sweeps from laboratory sources 0.43 and 0.14. On a stills run whose +// plane lies along the image's y axis they are 0.998 and 0.47 - the scale reduced there by the +// placeholder distance the pre-scan reads it at. inline constexpr double PLANE_CORRELATION = 0.5; inline constexpr double PLANE_MODULATION = 0.3; +// No polarized source modulates the background by more than a fully polarized one does (a scale of 1). A +// harmonic of twice that or more is not the source's: at a long distance, where polarization can move +// the background by a few per cent at most, a sweep's background carried ten per cent along image y +// (scale 2.9, correlation 0.66) on a horizontally polarized beamline. It decides nothing. +inline constexpr double PLANE_MODULATION_MAX = 2.0; +// The box the background is pooled over before the plane is measured, in pixels: the modulation changes +// over hundreds of pixels, and pooling is what gives a sparse background a median that is not zero. +inline constexpr int PLANE_POOL_PX = 9; -// The plane the source is polarized in, as the background shows it: +1 for the plane containing lab x -// (a horizontally polarized source), -1 for the plane turned by 90 degrees, 0 where the background does -// not show one clearly. `sector_median` is laid -// out as for HarmonicFit, each band's background relative to its rings; `amplitude[band]` is the -// relative modulation a fully polarized source gives the band, sin^2 2theta / (1 + cos^2 2theta). See -// GetMask. -float PolarizationPlane(const std::vector §or_median, const std::vector &litude); +// The plane the source is polarized in, as the background shows it, and the two numbers it is decided on. +struct PlaneEvidence { + float plane = 0.0f; // +1 for the plane containing lab x (a horizontally polarized source), -1 for + // the plane turned by 90 degrees, 0 where the background does not show one clearly + double correlation = NAN; // of the bands' cos 2phi harmonic with a polarized source's profile + double modulation = NAN; // the harmonic against a fully polarized source's (least-squares scale) + // both positive towards the turned plane, negative towards lab x +}; + +// `sector_median` is laid out as for HarmonicFit, each band's background relative to its rings; +// `amplitude[band]` is the relative modulation a fully polarized source gives the band, +// sin^2 2theta / (1 + cos^2 2theta). See GetMask. +PlaneEvidence PolarizationPlane(const std::vector §or_median, const std::vector &litude); } // namespace shadow_finder diff --git a/image_analysis/bragg_prediction/BraggPrediction.cpp b/image_analysis/bragg_prediction/BraggPrediction.cpp index a5aa7b7c5..e6f2d230a 100644 --- a/image_analysis/bragg_prediction/BraggPrediction.cpp +++ b/image_analysis/bragg_prediction/BraggPrediction.cpp @@ -154,8 +154,17 @@ int BraggPrediction::Calc(const DiffractionExperiment &experiment, const Crystal const float bw_tol = kBandwidthCutoffSigmas * settings.bandwidth_sigma * std::fabs(recip_z); radial_cutoff = std::sqrt(radial_cutoff * radial_cutoff + bw_tol * bw_tol); } + float window_dist = dist_ewald_sphere; + if (settings.window_c0 > 0.0f || settings.window_ang > 0.0f || settings.window_bw > 0.0f) { + const float wb = settings.window_bw * std::fabs(recip_z); + radial_cutoff = std::sqrt(settings.window_c0 * settings.window_c0 + + settings.window_ang * settings.window_ang * recip_sq + wb * wb); + const float sc = settings.window_q_scale; + const float Sc_x = sc * recip_x + S0.x, Sc_y = sc * recip_y + S0.y, Sc_z = sc * recip_z + S0.z; + window_dist = std::fabs(std::sqrt(Sc_x * Sc_x + Sc_y * Sc_y + Sc_z * Sc_z) - one_over_wavelength); + } - if (dist_ewald_sphere <= radial_cutoff ) { + if (window_dist <= radial_cutoff) { const float s0_p0 = S0.x * recip_x + S0.y * recip_y + S0.z * recip_z; const float val = s0_sq * recip_sq - s0_p0 * s0_p0; diff --git a/image_analysis/bragg_prediction/BraggPrediction.h b/image_analysis/bragg_prediction/BraggPrediction.h index 2248e716c..f93ab8ef6 100644 --- a/image_analysis/bragg_prediction/BraggPrediction.h +++ b/image_analysis/bragg_prediction/BraggPrediction.h @@ -35,6 +35,16 @@ struct BraggPredictionSettings { // already the one the partiality applies to σ_M. CalcMosaicityXDS deconvolves the same term // out of the fitted σ_M, so it is not counted twice. float bandwidth_sigma = 0.0f; + // Stills: an excitation-error window that follows the rocking width against resolution, + // |dist_ewald| <= sqrt(window_c0^2 + (window_ang d*)^2 + (window_bw |q_z|)^2) (1/A, rad, relative). When + // any of the three is set it replaces ewald_dist_cutoff and the bandwidth term above; all zero leaves + // the prediction as it was. + float window_c0 = 0.0f; + float window_ang = 0.0f; + float window_bw = 0.0f; + // The window is centred where the rocking curve is: on the excitation error of the reciprocal lattice + // scaled by this (StillsPartialityRefine::MeasureRadialScale). dist_ewald stays the lattice's own. + float window_q_scale = 1.0f; }; class BraggPrediction { diff --git a/image_analysis/bragg_prediction/BraggPredictionGPU.cu b/image_analysis/bragg_prediction/BraggPredictionGPU.cu index 09477cdbf..36871330b 100644 --- a/image_analysis/bragg_prediction/BraggPredictionGPU.cu +++ b/image_analysis/bragg_prediction/BraggPredictionGPU.cu @@ -114,7 +114,15 @@ namespace { const float bw_tol = kBandwidthCutoffSigmas * C.bandwidth_sigma * fabsf(recip_z); radial_cutoff = sqrtf(radial_cutoff * radial_cutoff + bw_tol * bw_tol); } - if (dist_ewald > radial_cutoff) return false; + float window_dist = dist_ewald; + if (C.window_c0 > 0.0f || C.window_ang > 0.0f || C.window_bw > 0.0f) { + const float wb = C.window_bw * fabsf(recip_z); + radial_cutoff = sqrtf(C.window_c0 * C.window_c0 + C.window_ang * C.window_ang * recip_sq + wb * wb); + const float sc = C.window_q_scale; + const float Scx = sc * recip_x + C.S0.x, Scy = sc * recip_y + C.S0.y, Scz = sc * recip_z + C.S0.z; + window_dist = fabsf(sqrtf(Scx * Scx + Scy * Scy + Scz * Scz) - C.one_over_wavelength); + } + if (window_dist > radial_cutoff) return false; float Srx = C.rot[0] * Sx + C.rot[1] * Sy + C.rot[2] * Sz; float Sry = C.rot[3] * Sx + C.rot[4] * Sy + C.rot[5] * Sz; float Srz = C.rot[6] * Sx + C.rot[7] * Sy + C.rot[8] * Sz; @@ -241,6 +249,10 @@ int BraggPredictionGPU::Calc(const DiffractionExperiment &experiment, // Build constants on host KernelConsts hK = BuildKernelConsts(experiment, lattice, settings.high_res_A, settings.ewald_dist_cutoff, settings.centering, settings.bandwidth_sigma); + hK.window_c0 = settings.window_c0; + hK.window_ang = settings.window_ang; + hK.window_bw = settings.window_bw; + hK.window_q_scale = settings.window_q_scale; cudaMemcpyAsync(dK, &hK, sizeof(KernelConsts), cudaMemcpyHostToDevice, stream); cudaMemsetAsync(d_count, 0, sizeof(int), stream); diff --git a/image_analysis/bragg_prediction/BraggPredictionGPU.h b/image_analysis/bragg_prediction/BraggPredictionGPU.h index 5d75cf4e9..427b8d043 100644 --- a/image_analysis/bragg_prediction/BraggPredictionGPU.h +++ b/image_analysis/bragg_prediction/BraggPredictionGPU.h @@ -17,6 +17,7 @@ struct KernelConsts { float one_over_wavelength; float one_over_dmax_sq; float ewald_cutoff; + float window_c0, window_ang, window_bw, window_q_scale; // the stills window curve; all zero: ewald_cutoff (see BraggPredictionSettings) float bandwidth_sigma; // relative Δλ/λ (sigma); 0 = monochromatic // Angle-dependent sensor efficiency, reduced to the two per-dataset numbers the kernel needs: // the optical thickness at normal incidence and the absorbed fraction there. qe_a0 = 0 leaves diff --git a/image_analysis/geom_refinement/CMakeLists.txt b/image_analysis/geom_refinement/CMakeLists.txt index c655cf25f..397034851 100644 --- a/image_analysis/geom_refinement/CMakeLists.txt +++ b/image_analysis/geom_refinement/CMakeLists.txt @@ -34,6 +34,8 @@ ADD_LIBRARY(JFJochGeomRefinement STATIC GeometryRefiner.h LatticeReduction.cpp LatticeReduction.h + CellEsd.cpp + CellEsd.h ) # fftw3f: BeamCenterFFT scores every candidate centre with one transform set (always fetched, diff --git a/image_analysis/geom_refinement/CellEsd.cpp b/image_analysis/geom_refinement/CellEsd.cpp new file mode 100644 index 000000000..1c7924d9b --- /dev/null +++ b/image_analysis/geom_refinement/CellEsd.cpp @@ -0,0 +1,259 @@ +// SPDX-FileCopyrightText: 2026 Filip Leonarski, Paul Scherrer Institute +// SPDX-License-Identifier: GPL-3.0-only + +#include "CellEsd.h" + +#include +#include + +#include "../../common/JFJochMath.h" +#include "../../common/ParallelFor.h" + +namespace { + using Vec6 = Eigen::Matrix; + // At most six parameters: fixed-capacity, so the per-observation products never touch the heap. + using VecK = Eigen::Matrix; + using MatK = Eigen::Matrix; + + // A symmetric matrix as (g11, g22, g33, g12, g13, g23) and back. + Vec6 ToVec6(const Eigen::Matrix3d &m) { + Vec6 v; + v << m(0, 0), m(1, 1), m(2, 2), m(0, 1), m(0, 2), m(1, 2); + return v; + } + + Eigen::Matrix3d FromVec6(const Vec6 &v) { + Eigen::Matrix3d m; + m << v(0), v(3), v(4), + v(3), v(1), v(5), + v(4), v(5), v(2); + return m; + } + + // h^T G h = hh . (g11, g22, g33, g12, g13, g23) + Vec6 IndexProducts(const CellObservation &o) { + const double h = o.h, k = o.k, l = o.l; + Vec6 v; + v << h * h, k * k, l * l, 2 * h * k, 2 * h * l, 2 * k * l; + return v; + } + + double ToDeg(double rad) { return rad * 180.0 / PI; } +} + +std::vector MetricBasis(const gemmi::SpaceGroup &sg) { + // Project each of the six symmetric unit matrices onto the metrics the group leaves invariant, + // averaging R G R^T over the rotation parts, and keep an orthonormal basis of what comes out. + const gemmi::GroupOps ops = sg.operations(); + std::vector rots; + for (const gemmi::Op &op : ops.sym_ops) { + Eigen::Matrix3d r; + for (int i = 0; i < 3; i++) + for (int j = 0; j < 3; j++) + r(i, j) = static_cast(op.rot[i][j]) / gemmi::Op::DEN; + rots.push_back(r); + } + Eigen::Matrix projected; + for (int m = 0; m < 6; m++) { + Vec6 e = Vec6::Zero(); + e(m) = 1.0; + const Eigen::Matrix3d g = FromVec6(e); + Eigen::Matrix3d sum = Eigen::Matrix3d::Zero(); + for (const auto &r : rots) + sum += r * g * r.transpose(); + projected.col(m) = ToVec6(sum / static_cast(rots.size())); + } + Eigen::JacobiSVD> svd(projected, Eigen::ComputeFullU); + std::vector basis; + for (int m = 0; m < 6; m++) + if (svd.singularValues()(m) > 1e-8 * svd.singularValues()(0)) + basis.push_back(FromVec6(svd.matrixU().col(m))); + return basis; +} + +std::array CellFromReciprocalMetric(const Eigen::Matrix3d &gstar) { + const Eigen::Matrix3d g = gstar.inverse(); + const double a = std::sqrt(g(0, 0)), b = std::sqrt(g(1, 1)), c = std::sqrt(g(2, 2)); + return {a, b, c, ToDeg(std::acos(g(1, 2) / (b * c))), ToDeg(std::acos(g(0, 2) / (a * c))), + ToDeg(std::acos(g(0, 1) / (a * b)))}; +} + +std::array CellEsdFromCovariance(const std::vector &basis, const Eigen::VectorXd &p, + const Eigen::MatrixXd &cov) { + Eigen::Matrix3d gstar = Eigen::Matrix3d::Zero(); + for (size_t k = 0; k < basis.size(); k++) + gstar += p(k) * basis[k]; + const Eigen::Matrix3d g = gstar.inverse(); + const double len[3] = {std::sqrt(g(0, 0)), std::sqrt(g(1, 1)), std::sqrt(g(2, 2))}; + // The angle opposite axis i lies between the other two, j and l: cos = G_jl / (len_j len_l). + const int pair[3][2] = {{1, 2}, {0, 2}, {0, 1}}; + + // Analytic derivatives of the six parameters with respect to each p_k: dG = -G dG* G. + Eigen::MatrixXd jac(6, static_cast(basis.size())); + for (size_t k = 0; k < basis.size(); k++) { + const Eigen::Matrix3d dg = -g * basis[k] * g; + double dlen[3]; + for (int i = 0; i < 3; i++) { + dlen[i] = dg(i, i) / (2.0 * len[i]); + jac(i, k) = dlen[i]; + } + for (int i = 0; i < 3; i++) { + const int j = pair[i][0], l = pair[i][1]; + const double cosv = g(j, l) / (len[j] * len[l]); + const double dcos = dg(j, l) / (len[j] * len[l]) - cosv * (dlen[j] / len[j] + dlen[l] / len[l]); + jac(3 + i, k) = ToDeg(-dcos / std::sqrt(1.0 - cosv * cosv)); + } + } + const Eigen::MatrixXd cell_cov = jac * cov * jac.transpose(); + std::array esd{}; + // A parameter the symmetry fixes comes out at rounding level (1e-19), not at zero: make it zero. + for (int i = 0; i < 6; i++) { + esd[i] = std::sqrt(std::max(0.0, cell_cov(i, i))); + if (esd[i] < 1e-12) + esd[i] = 0.0; + } + return esd; +} + +MetricFit FitReciprocalMetric(std::span obs, const std::vector &basis) { + const int nparam = static_cast(basis.size()); + Eigen::Matrix v(6, nparam); + for (int k = 0; k < nparam; k++) + v.col(k) = ToVec6(basis[k]); + + MetricFit fit; + fit.used.assign(obs.size(), true); + MatK normal; + double s2 = 0.0; + // Fit, reject the observations further than 4 sigma off it, fit again - until nothing changes. + for (int iter = 0; iter < 5; iter++) { + normal = MatK::Zero(nparam, nparam); + VecK rhs = VecK::Zero(nparam); + int64_t n = 0; + for (size_t i = 0; i < obs.size(); i++) { + if (!fit.used[i]) + continue; + const double q2 = static_cast(obs[i].q) * obs[i].q; + const VecK a = v.transpose() * IndexProducts(obs[i]); + normal.noalias() += a * a.transpose() / q2; // weight 1/q^2 on q^2: one e.s.d. on q + rhs.noalias() += a; // a * q^2 / q^2 + n++; + } + if (n < 10 * nparam + 10) + return {}; + fit.p = normal.ldlt().solve(rhs); + double wr2 = 0.0; + std::vector z(obs.size()); + for (size_t i = 0; i < obs.size(); i++) { + const double q2 = static_cast(obs[i].q) * obs[i].q; + const VecK a = v.transpose() * IndexProducts(obs[i]); + const double r = q2 - a.dot(fit.p); + z[i] = r * r / q2; + if (fit.used[i]) + wr2 += z[i]; + } + s2 = wr2 / static_cast(n - nparam); + bool changed = false; + for (size_t i = 0; i < obs.size(); i++) { + const bool keep = z[i] <= 16.0 * s2; + changed |= keep != fit.used[i]; + fit.used[i] = keep; + } + if (!changed) + break; + } + fit.cov = s2 * Eigen::MatrixXd(normal).inverse(); + fit.ok = fit.p.allFinite() && fit.cov.allFinite(); + return fit; +} + +std::optional EstimateCellEsd(std::span obs, const gemmi::SpaceGroup &sg, + double wavelength_A, int nblocks) { + const auto basis = MetricBasis(sg); + const MetricFit fit = FitReciprocalMetric(obs, basis); + if (!fit.ok) + return {}; + const auto metric = [&basis](const Eigen::VectorXd &p) { + Eigen::Matrix3d g = Eigen::Matrix3d::Zero(); + for (size_t k = 0; k < basis.size(); k++) + g += p(k) * basis[k]; + return g; + }; + + CellEsd out; + out.esd_lsq = CellEsdFromCovariance(basis, fit.p, fit.cov); + const auto cell = CellFromReciprocalMetric(metric(fit.p)); + out.fitted = UnitCell{static_cast(cell[0]), static_cast(cell[1]), static_cast(cell[2]), + static_cast(cell[3]), static_cast(cell[4]), static_cast(cell[5])}; + + std::vector keys; + double q_min = INFINITY, q_max = 0.0; + int32_t frame_min = INT32_MAX, frame_max = INT32_MIN; + for (size_t i = 0; i < obs.size(); i++) { + if (!fit.used[i]) + continue; + const auto &o = obs[i]; + keys.push_back(((static_cast(o.h) + 1024) << 22) | ((static_cast(o.k) + 1024) << 11) + | (static_cast(o.l) + 1024)); + q_min = std::min(q_min, static_cast(o.q)); + q_max = std::max(q_max, static_cast(o.q)); + frame_min = std::min(frame_min, o.frame); + frame_max = std::max(frame_max, o.frame); + } + out.observations = static_cast(keys.size()); + std::sort(keys.begin(), keys.end()); + out.reflections = std::unique(keys.begin(), keys.end()) - keys.begin(); + out.theta_min_deg = ToDeg(std::asin(std::min(1.0, wavelength_A * q_min / 2.0))); + out.theta_max_deg = ToDeg(std::asin(std::min(1.0, wavelength_A * q_max / 2.0))); + + // The same fit on blocks of consecutive frames: the scatter of their cells, over sqrt(blocks). + // Least-squares cell e.s.d.s alone are too small: following Herbstein (2000) Acta Cryst. B56, 547-557 + std::vector> block_cells; + const int64_t span = static_cast(frame_max) - frame_min + 1; + std::vector> block_obs(nblocks); + for (size_t i = 0; i < obs.size(); i++) + if (fit.used[i]) + block_obs[(obs[i].frame - frame_min) * nblocks / span].push_back(obs[i]); + for (const auto &b : block_obs) { + const MetricFit bf = FitReciprocalMetric(b, basis); + if (bf.ok) + block_cells.push_back(CellFromReciprocalMetric(metric(bf.p))); + } + out.blocks = static_cast(block_cells.size()); + out.esd = out.esd_lsq; + if (out.blocks >= 4) { + std::array esd{}; + for (int j = 0; j < 6; j++) { + double mean = 0.0; + for (const auto &c : block_cells) + mean += c[j] / out.blocks; + double var = 0.0; + for (const auto &c : block_cells) + var += (c[j] - mean) * (c[j] - mean) / (out.blocks - 1); + esd[j] = std::sqrt(var / out.blocks); + out.esd[j] = std::max(out.esd[j], esd[j]); + } + out.esd_blocks = esd; + } + return out; +} + +std::vector GatherCellObservations(const std::vector &outcomes, + size_t nthreads) { + std::vector> per_frame(outcomes.size()); + ParallelFor(static_cast(outcomes.size()), nthreads, [&](int f) { + const IntegrationOutcome &out = outcomes[f]; + for (const auto &r : out.reflections) { + if (!r.observed || r.clipped || r.overloaded || r.on_ice_ring || !(r.sigma > 0.0f) + || !(r.I > 3.0f * r.sigma) || !std::isfinite(r.observed_x) || !std::isfinite(r.observed_y)) + continue; + const float q = out.geom.DetectorToRecip(r.observed_x, r.observed_y).Length(); + if (q > 0.0f) + per_frame[f].push_back(CellObservation{r.h, r.k, r.l, q, f}); + } + }); + std::vector obs; + for (const auto &v : per_frame) + obs.insert(obs.end(), v.begin(), v.end()); + return obs; +} diff --git a/image_analysis/geom_refinement/CellEsd.h b/image_analysis/geom_refinement/CellEsd.h new file mode 100644 index 000000000..8a112d290 --- /dev/null +++ b/image_analysis/geom_refinement/CellEsd.h @@ -0,0 +1,84 @@ +// SPDX-FileCopyrightText: 2026 Filip Leonarski, Paul Scherrer Institute +// SPDX-License-Identifier: GPL-3.0-only + +#pragma once + +#include +#include +#include +#include +#include + +#include + +#include "../../common/UnitCell.h" +#include "../IntegrationOutcome.h" +#include "gemmi/symmetry.hpp" + +// The e.s.d.s of the unit cell, as SHELXL's ZERR and a CIF's _cell.*_esd ask for them. +// +// The cell is fitted to d-spacings: each strong integrated observation gives |q| = 1/d at its +// observed centroid, which depends on the detector geometry alone (not on the orientation, nor on the +// rotation angle), and q^2 = h^T G* h is LINEAR in the reciprocal metric tensor G*. So the fit is a +// plain linear least squares in the components of G* the point group leaves free, and its covariance, +// scaled by the goodness of fit, maps onto a, b, c, alpha, beta, gamma through the derivatives of the +// cell with respect to G*. A length the group ties to another gets the same e.s.d., an angle it fixes +// gets zero. +// +// Least-squares cell e.s.d.s are known to be too small (Herbstein (2000) Acta Cryst. B56, 547-557): +// they see only the scatter of the centroids, not what changes over the sweep. The same fit is +// therefore also made on blocks of consecutive frames, and the scatter of the block cells, over the +// square root of their number, is the second estimate. The e.s.d. written is the larger of the two. + +// One observation: the Miller index in the setting of the cell, and |q| = 1/d at the observed +// centroid, in 1/A. +struct CellObservation { + int32_t h = 0, k = 0, l = 0; + float q = 0.0f; + int32_t frame = 0; +}; + +struct CellEsd { + std::array esd{}; // written: per parameter the larger of the two below + std::array esd_lsq{}; // least squares, scaled by the goodness of fit + std::optional> esd_blocks; // block scatter / sqrt(blocks) + int blocks = 0; + int64_t observations = 0; // observations in the fit, after rejection + int64_t reflections = 0; // distinct h k l among them (_cell_measurement.reflns_used) + double theta_min_deg = 0.0; + double theta_max_deg = 0.0; + UnitCell fitted{}; // the d-spacing fit's own cell, for comparison with the reported one +}; + +// Symmetric 3x3 matrices spanning the reciprocal metrics G* the point group of `sg` allows +// (G* = R G* R^T for every rotation part R): 6 for triclinic down to 1 for cubic. Orthonormal as +// 6-vectors (g11, g22, g33, g12, g13, g23). +std::vector MetricBasis(const gemmi::SpaceGroup &sg); + +// a, b, c (A) and alpha, beta, gamma (deg) of the reciprocal metric G*. +std::array CellFromReciprocalMetric(const Eigen::Matrix3d &gstar); + +// The e.s.d.s of a, b, c, alpha, beta, gamma for G* = sum_k p_k basis_k with covariance cov(p). +std::array CellEsdFromCovariance(const std::vector &basis, const Eigen::VectorXd &p, + const Eigen::MatrixXd &cov); + +struct MetricFit { + bool ok = false; + Eigen::VectorXd p; + Eigen::MatrixXd cov; // scaled by the goodness of fit + std::vector used; +}; + +// Weighted linear least squares of q^2 = h^T G* h, |q| taken at one constant e.s.d. (weight 1/q^2 on +// q^2), with the observations further than 4 sigma off the fit rejected and the fit repeated. +MetricFit FitReciprocalMetric(std::span obs, const std::vector &basis); + +// Both estimates for observations in the setting of `sg`; blocks are cut by frame. Empty with too +// few observations to fit. +std::optional EstimateCellEsd(std::span obs, const gemmi::SpaceGroup &sg, + double wavelength_A, int nblocks = 8); + +// The observations of a rotation run's integrated frames: observed, unclipped, unsaturated, off the +// ice rings and I > 3 sigma. +std::vector GatherCellObservations(const std::vector &outcomes, + size_t nthreads); diff --git a/image_analysis/indexing/CMakeLists.txt b/image_analysis/indexing/CMakeLists.txt index 212810ce4..78675187f 100644 --- a/image_analysis/indexing/CMakeLists.txt +++ b/image_analysis/indexing/CMakeLists.txt @@ -27,18 +27,9 @@ ADD_LIBRARY(JFJochIndexing STATIC TARGET_LINK_LIBRARIES(JFJochIndexing JFJochCommon JFJochLatticeSearch) IF (JFJOCH_CUDA_AVAILABLE) - # A source archive carries no submodules, which is exactly what is wanted here: ffbidx's bundled - # eigen submodule must NOT be added, or it would add_subdirectory a second Eigen3::Eigen target. - # ffbidx instead resolves Eigen via the project-level Eigen3 (the find_package(Eigen3) at the top - # of image_analysis/CMakeLists.txt). The clone this replaces passed GIT_SUBMODULES "" to get the - # same tree. - FetchContent_Declare( - fast-indexer - URL https://github.com/paulscherrerinstitute/fast-feedback-indexer/archive/a94fd4f5c55289e70860feea358182d2072e02b5.tar.gz - URL_HASH SHA256=275590cb41db783b822b1c8403abc2b3c9986f3d98a1a7361fc0ad478ff466c0 - ) - - FetchContent_MakeAvailable(fast-indexer) + # The fast-feedback indexer is vendored (fast_indexer_static); it takes Eigen from the project-level + # Eigen3 (the find_package(Eigen3) at the top of image_analysis/CMakeLists.txt). + ADD_SUBDIRECTORY(fast-feedback-indexer) TARGET_SOURCES(JFJochIndexing PRIVATE CUDAMemHelpers.h FFTIndexerGPU.cu FFTIndexerGPU.h diff --git a/image_analysis/indexing/CUDAMemHelpers.h b/image_analysis/indexing/CUDAMemHelpers.h index fcbe55d72..37de3fe94 100644 --- a/image_analysis/indexing/CUDAMemHelpers.h +++ b/image_analysis/indexing/CUDAMemHelpers.h @@ -108,6 +108,30 @@ public: cudaEvent_t get() const { return event_; } }; +// cudaStreamSynchronize with the waiting thread asleep: an event made with cudaEventBlockingSync, recorded on the +// stream and waited for. cudaStreamSynchronize spins a core for the whole of the wait (the process's default +// schedule), which on a card shared by several engines - refinement's weight trials - is a core per engine for +// most of the run, taken from whatever else the host is doing. Made on the device of the streams it waits for; +// one thread at a time. +class StreamWaiter { + cudaEvent_t event_ = nullptr; +public: + StreamWaiter() { + if (cudaEventCreateWithFlags(&event_, cudaEventBlockingSync | cudaEventDisableTiming) != cudaSuccess) + throw JFJochException(JFJochExceptionCategory::GPUCUDAError, "Failed to create CUDA event"); + } + ~StreamWaiter() { + if (event_) cudaEventDestroy(event_); + } + StreamWaiter(const StreamWaiter&) = delete; + StreamWaiter& operator=(const StreamWaiter&) = delete; + + cudaError_t Wait(cudaStream_t stream) const { + const cudaError_t err = cudaEventRecord(event_, stream); + return err != cudaSuccess ? err : cudaEventSynchronize(event_); + } +}; + // How much freed memory the pool keeps rather than returning it to the driver. Returning it puts the // next allocation straight back on the path this exists to avoid, so hold the per-worker engine // buffers; but the card also has to fit the merge, which asks for several gigabytes of its own after diff --git a/image_analysis/indexing/fast-feedback-indexer/CMakeLists.txt b/image_analysis/indexing/fast-feedback-indexer/CMakeLists.txt new file mode 100644 index 000000000..0fccd4b0d --- /dev/null +++ b/image_analysis/indexing/fast-feedback-indexer/CMakeLists.txt @@ -0,0 +1,39 @@ +# The fast-feedback indexer (TORO, the GPU known-cell indexer behind FFBIDX), vendored from +# https://github.com/paulscherrerinstitute/fast-feedback-indexer at commit a94fd4f5c55289e70860feea358182d2072e02b5, +# BSD-3-Clause (LICENSE.md). Only the static library the build links is kept, with the rules upstream's +# indexer/src/CMakeLists.txt gives it: its install, pkg-config, shared-library and C-API parts are left out, +# version.h is written once rather than generated, and data/ holds the library's test spot lists that +# FFBIDXIndexerCPU_MatchesGPU reads. + +SET(THREADS_PREFER_PTHREAD_FLAG ON) +FIND_PACKAGE(Threads REQUIRED) +FIND_PACKAGE(CUDAToolkit REQUIRED) +IF (NOT DEFINED CMAKE_CUDA_ARCHITECTURES) + SET(CMAKE_CUDA_ARCHITECTURES "75;80") +ENDIF() + +ADD_LIBRARY(fast_indexer_static STATIC + indexer_gpu.cu ffbidx/indexer_gpu.h + indexer.cpp + log.cpp + ffbidx/indexer.h + ffbidx/refine.h + ffbidx/log.h + ffbidx/exception.h + ffbidx/envvar.h + ffbidx/version.h) +SET_TARGET_PROPERTIES(fast_indexer_static PROPERTIES CUDA_RUNTIME_LIBRARY Static) +TARGET_COMPILE_FEATURES(fast_indexer_static PUBLIC cxx_std_17) +TARGET_INCLUDE_DIRECTORIES(fast_indexer_static PUBLIC .) +TARGET_LINK_LIBRARIES(fast_indexer_static + PRIVATE CUDA::cudart_static + PRIVATE Threads::Threads + PUBLIC Eigen3::Eigen) + +# indexer_gpu.cu includes CUB, which, like all of CCCL, stops with an #error under MSVC's traditional +# preprocessor: the host compiler gets the conforming one for the CUDA sources, as upstream does. The +# top-level CMakeLists.txt sets the same for every CUDA target; it is kept here so the library does not +# depend on that. +IF (MSVC) + TARGET_COMPILE_OPTIONS(fast_indexer_static PRIVATE $<$:-Xcompiler=/Zc:preprocessor>) +ENDIF() diff --git a/image_analysis/indexing/fast-feedback-indexer/LICENSE.md b/image_analysis/indexing/fast-feedback-indexer/LICENSE.md new file mode 100644 index 000000000..f9ab447d8 --- /dev/null +++ b/image_analysis/indexing/fast-feedback-indexer/LICENSE.md @@ -0,0 +1,22 @@ +The code in the **eigen** directory has it's own license +* http://www.eigen.tuxfamily.org +* https://www.mozilla.org/en-US/MPL/2.0 + +Python has it's own license +* https://docs.python.org/3/license.html#psf-license + +For the rest, the BSD-3-Clause applies. + +### BSD-3-Clause + +Copyright 2022 Paul Scherrer Institute + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/image_analysis/indexing/fast-feedback-indexer/data/image0_local.txt b/image_analysis/indexing/fast-feedback-indexer/data/image0_local.txt new file mode 100644 index 000000000..f36dbc646 --- /dev/null +++ b/image_analysis/indexing/fast-feedback-indexer/data/image0_local.txt @@ -0,0 +1,298 @@ +36.9 0 0 4.83429e-15 78.95 0 4.83429e-15 4.83429e-15 78.95 +-0.055371 0.473773 -0.121095 +-0.0588781 0.465162 -0.116734 +0.426543 -0.0325397 -0.0961181 +0.0133439 -0.30226 -0.0468678 +0.344006 -0.160659 -0.0748791 +-0.197034 -0.0718448 -0.0222394 +-0.342727 -0.15456 -0.0733667 +0.458527 -0.0770242 -0.114664 +-0.0877891 -0.420758 -0.097085 +0.220288 -0.413958 -0.116761 +-0.0394481 -0.087645 -0.00462961 +0.276511 0.346708 -0.10371 +0.269925 -0.0869209 -0.0410498 +-0.441063 -0.0813343 -0.106217 +-0.475981 -0.0254935 -0.120914 +-0.279153 0.0684798 -0.0421984 +0.38077 0.0609531 -0.0773413 +-0.292215 -0.0951606 -0.0483936 +-0.00600919 -0.447577 -0.105775 +-0.00363741 -0.100819 -0.00510189 +-0.0746551 -0.102559 -0.00807855 +0.417675 -0.094881 -0.0963712 +-0.193093 -0.41505 -0.110928 +-0.459308 -0.0986124 -0.117214 +-0.366764 -0.310666 -0.12309 +-0.319698 -0.218012 -0.0779022 +0.384007 -0.106091 -0.0827852 +0.121547 -0.115845 -0.0141976 +0.0978358 -0.405263 -0.09105 +-0.383253 -0.10897 -0.0828074 +0.375311 -0.113327 -0.080055 +0.206502 -0.308821 -0.0715675 +-0.202333 -0.124625 -0.0286453 +0.370709 0.0744466 -0.0742396 +0.0477675 -0.46393 -0.115417 +-0.287502 -0.355031 -0.110452 +0.00823107 0.337017 -0.0585373 +-0.207954 -0.0855134 -0.0256066 +-0.331641 -0.276272 -0.0979536 +0.249489 0.238621 -0.0614824 +0.265879 -0.139562 -0.0461495 +0.0266054 -0.146353 -0.0111255 +-0.109113 -0.144518 -0.0165322 +0.0249291 -0.0289788 -0.000730884 +-0.0694774 -0.317386 -0.0542521 +0.42153 -0.13364 -0.103087 +0.359999 -0.137073 -0.0771718 +0.313625 -0.141162 -0.0610043 +-0.0607628 0.0637964 -0.00388861 +0.209799 -0.427077 -0.12046 +0.447207 -0.13858 -0.11637 +-0.274731 -0.335993 -0.0990941 +-0.297585 -0.147717 -0.0568016 +-0.411105 -0.140357 -0.0992821 +0.112036 -0.466963 -0.122849 +0.247274 -0.113244 -0.0376948 +0.382973 0.2005 -0.098262 +-0.377317 -0.14771 -0.0857715 +-0.295777 0.319034 -0.0995925 +-0.19747 -0.162862 -0.0333142 +0.0837039 -0.16746 -0.0176808 +-0.0910718 -0.16833 -0.0184853 +-0.13697 -0.394321 -0.091292 +0.40612 -0.15722 -0.0998064 +0.185777 -0.251528 -0.0501471 +-0.0266512 -0.433824 -0.0993966 +0.0235329 -0.288925 -0.0429375 +-0.105814 0.323012 -0.0595392 +-0.371939 0.264866 -0.110333 +0.226328 0.37161 -0.0996213 +0.235807 0.23392 -0.0567733 +-0.406072 0.110115 -0.0928175 +-0.384182 -0.285792 -0.122089 +0.312209 -0.292655 -0.0961863 +-0.281701 -0.172429 -0.0561183 +-0.338598 0.257661 -0.0950347 +0.0146831 -0.186641 -0.0176815 +0.00629455 -0.11032 -0.00612384 +-0.245915 0.336382 -0.0909495 +-0.247387 0.354398 -0.0982232 +-0.416968 0.0965121 -0.0962172 +-0.0978981 -0.391547 -0.0850644 +-0.27497 -0.211723 -0.0621486 +-0.151742 -0.198834 -0.0317855 +-0.180004 -0.187978 -0.0344624 +-0.284893 0.220018 -0.0670326 +0.155935 0.188299 -0.0303467 +-0.190729 -0.202475 -0.0394656 +-0.00164759 -0.20739 -0.0217431 +-0.336875 0.0538741 -0.0599932 +-0.296351 -0.221841 -0.0710422 +-0.0180012 0.41209 -0.0890347 +-0.312006 -0.197927 -0.0707653 +0.442753 -0.191198 -0.123979 +-0.123929 -0.210738 -0.0303449 +-0.207653 0.338319 -0.0821655 +0.282013 -0.206744 -0.0631299 +-0.425783 0.0340181 -0.0958142 +-0.0670489 -0.436085 -0.102596 +-0.182615 -0.443947 -0.122753 +-0.238289 -0.110307 -0.0350902 +0.111203 -0.220499 -0.0309727 +0.3075 -0.169173 -0.063611 +0.30693 -0.0781296 -0.0514804 +0.00247331 -0.316161 -0.0512976 +-0.152176 0.365793 -0.0818292 +0.465001 0.0822793 -0.118522 +0.365928 -0.218259 -0.0953123 +0.121902 0.420187 -0.100788 +-0.468694 0.0855697 -0.120793 +-0.17097 0.396232 -0.0979083 +-0.0462391 0.08528 -0.00471649 +-0.399879 -0.219507 -0.110105 +0.466079 0.0337424 -0.115901 +-0.231458 -0.375494 -0.102542 +-0.365621 -0.226564 -0.0972319 +0.355181 -0.189486 -0.0846086 +-0.348639 -0.29251 -0.109557 +0.391261 -0.224303 -0.107474 +0.191246 0.391392 -0.0998684 +-0.365807 -0.267844 -0.108684 +-0.213693 -0.138145 -0.0329161 +0.088472 -0.249106 -0.0355732 +0.0329757 0.379899 -0.0755601 +0.254817 -0.243886 -0.0642714 +0.0758148 -0.391119 -0.0827877 +-0.277871 0.0199165 -0.0395882 +-0.41389 0.154952 -0.102958 +-0.230431 -0.247656 -0.0589539 +-0.302771 -0.242963 -0.0784259 +0.105051 0.0929715 -0.00988858 +0.265018 -0.272581 -0.0750866 +0.131621 0.25793 -0.0428437 +-0.416834 -0.235691 -0.122105 +-0.203343 -0.258407 -0.0556074 +0.253575 -0.37184 -0.107008 +0.349035 -0.284276 -0.107049 +-0.259203 -0.364371 -0.105546 +0.375427 -0.246934 -0.106648 +0.354986 0.26143 -0.102426 +-0.279894 0.342669 -0.103207 +-0.356822 -0.0286075 -0.0662657 +0.204188 -0.431498 -0.121298 +-0.174724 -0.269369 -0.0529458 +0.0343974 -0.275124 -0.0392068 +0.302713 -0.264809 -0.084445 +-0.286091 -0.268038 -0.0800501 +-0.355037 -0.209256 -0.0888688 +0.263913 -0.357727 -0.104243 +-0.268511 0.0820416 -0.0402235 +-0.436472 0.175601 -0.117585 +-0.129662 0.343773 -0.0699421 +-0.146379 -0.280545 -0.0513865 +0.0657138 -0.403331 -0.0873084 +-0.400143 -0.260922 -0.121476 +0.228432 -0.147814 -0.0377266 +0.437718 0.0876929 -0.105174 +-0.147256 -0.366153 -0.0811707 +0.155687 0.30079 -0.0591031 +0.444722 0.0981842 -0.109729 +-0.286825 -0.310583 -0.0937606 +-0.390341 -0.0219067 -0.0795901 +0.398939 0.0701879 -0.0857128 +-0.203517 -0.386328 -0.100371 +0.00362598 0.214395 -0.0232596 +-0.276764 0.28828 -0.0833233 +0.0320293 0.203914 -0.0215353 +0.419785 0.00564959 -0.0923939 +-0.281311 0.148004 -0.0518657 +-0.415461 0.047801 -0.0916459 +0.242592 -0.386206 -0.11006 +-0.415864 -0.223885 -0.118562 +0.173451 -0.351503 -0.0800214 +0.0790867 -0.46568 -0.118588 +-0.370923 -0.186343 -0.0902241 +0.187208 0.080632 -0.0209945 +-0.0172408 -0.419888 -0.092588 +0.432091 -0.0716877 -0.101024 +0.118573 -0.391423 -0.0874602 +0.198724 -0.440556 -0.124546 +-0.107623 -0.278051 -0.0454818 +0.315955 0.0330111 -0.0518003 +-0.191936 0.136339 -0.0281089 +0.153294 0.35539 -0.0779376 +0.374749 0.132786 -0.082432 +0.184867 -0.337539 -0.0770204 +0.417647 0.102915 -0.0972379 +-0.0351768 -0.233917 -0.0283799 +0.311858 -0.335476 -0.111068 +0.214203 0.391093 -0.104923 +0.153601 -0.116592 -0.0187697 +-0.0792175 -0.464164 -0.1178 +-0.0949517 -0.466929 -0.120818 +0.0331416 -0.360529 -0.067841 +-0.33222 -0.318191 -0.11209 +0.173154 -0.392887 -0.0968626 +-0.147194 -0.32326 -0.0652074 +-0.477954 0.0230381 -0.121917 +-0.257961 -0.237169 -0.0634068 +0.29228 -0.236007 -0.0732459 +-0.209077 0.248403 -0.0541762 +-0.383576 0.0821539 -0.0801523 +0.200474 0.264811 -0.0567688 +-0.230427 -0.113815 -0.0335893 +-0.40252 0.168965 -0.100318 +0.267689 0.214783 -0.0607393 +0.329644 0.329459 -0.115245 +-0.440223 -0.173032 -0.118942 +-0.371717 0.103665 -0.0774601 +-0.097594 -0.264131 -0.0404636 +0.100061 -0.234667 -0.0330877 +-0.207208 -0.176752 -0.0378026 +-0.311136 0.295339 -0.0966896 +0.348332 -0.326598 -0.121366 +-0.172993 0.124139 -0.0229314 +-0.33295 0.0330417 -0.0576344 +-0.382446 -0.242829 -0.108502 +0.335113 0.340534 -0.121515 +0.337094 0.284902 -0.102671 +-0.429064 0.219351 -0.123764 +0.275244 -0.301685 -0.0871871 +0.390134 0.193314 -0.0997638 +-0.0655285 0.389892 -0.0814739 +-0.360064 0.11717 -0.0744596 +-0.213451 -0.314828 -0.0751637 +0.1192 -0.419348 -0.100034 +-0.425127 -0.0151589 -0.0949932 +-0.261204 0.311924 -0.0865035 +-0.227446 0.192451 -0.0454157 +-0.345761 0.302685 -0.111839 +0.172842 0.00850993 -0.0150871 +0.0715399 0.270264 -0.0398754 +-0.176679 -0.355282 -0.0820896 +0.0334374 -0.318022 -0.0525064 +0.301192 -0.350007 -0.112994 +-0.259248 -0.278955 -0.0753517 +0.141091 -0.393069 -0.09138 +-0.35416 0.234256 -0.09463 +0.22488 0.153335 -0.0377539 +0.229784 0.31771 -0.0800761 +0.231467 -0.400291 -0.113326 +-0.314523 0.350076 -0.117661 +0.33692 0.172568 -0.0744162 +-0.393903 0.0754217 -0.0839474 +0.30244 0.222218 -0.0730967 +-0.188062 0.307793 -0.0673178 +0.0441656 -0.389144 -0.0798824 +-0.311277 0.18258 -0.0673847 +-0.409887 0.213354 -0.113167 +-0.297152 0.208971 -0.0683177 +0.278945 0.0244873 -0.0400052 +-0.0427145 0.368677 -0.0714245 +0.0283189 0.14464 -0.0109209 +-0.319228 0.227025 -0.0799167 +-0.212133 0.215693 -0.0468598 +-0.29263 0.26499 -0.0812247 +0.311401 0.129502 -0.0585869 +-0.349188 -0.116545 -0.0702231 +0.324204 0.319354 -0.109548 +0.0804584 0.389827 -0.0826334 +0.0870261 -0.452602 -0.112544 +0.270583 0.335881 -0.0977977 +-0.0672566 0.213003 -0.0252661 +0.348952 0.0877046 -0.0669726 +-0.118583 0.244978 -0.0377506 +0.0640115 0.314976 -0.0530614 +0.296516 0.307966 -0.0959893 +-0.422099 0.19953 -0.115681 +0.359359 0.158343 -0.0803324 +0.25705 0.0392946 -0.0344011 +-0.16542 0.286607 -0.0563406 +-0.206202 0.0642598 -0.0236029 +0.392063 0.0596701 -0.0819989 +0.00604493 0.392154 -0.0801201 +-0.427808 0.0822112 -0.0998771 +-0.110274 0.201271 -0.0266915 +0.278399 0.179281 -0.0564151 +-0.302541 0.0892016 -0.0510468 +0.3561 0.100116 -0.0709308 +-0.34562 0.189716 -0.0810035 +-0.325914 0.110292 -0.061056 +0.334348 0.114679 -0.0645534 +0.153165 0.130126 -0.0204043 +0.295312 0.154431 -0.0571629 +0.274622 0.380585 -0.116972 +0.420358 0.160741 -0.106993 +0.0609422 0.369438 -0.072745 +0.111563 0.22428 -0.0318821 +0.107482 0.426617 -0.101977 +-0.365604 0.22031 -0.0956786 +-0.226886 0.30572 -0.0753067 +0.349069 0.250305 -0.0969506 +-0.0191226 0.348621 -0.0629314 +0.193393 0.309457 -0.0689598 +0.239539 0.404038 -0.117178 +0.28437 0.302413 -0.0902308 +-0.244182 0.39954 -0.116403 diff --git a/image_analysis/indexing/fast-feedback-indexer/data/image0_peakfinder8.txt b/image_analysis/indexing/fast-feedback-indexer/data/image0_peakfinder8.txt new file mode 100644 index 000000000..67bb6e02a --- /dev/null +++ b/image_analysis/indexing/fast-feedback-indexer/data/image0_peakfinder8.txt @@ -0,0 +1,864 @@ +36.9 0 0 4.83429e-15 78.95 0 4.83429e-15 4.83429e-15 78.95 +-0.0328844 -0.723767 -0.31074 +-0.190835 -0.702829 -0.314717 +0.136979 -0.688803 -0.28811 +-0.100494 -0.688947 -0.282188 +0.329057 -0.647621 -0.312753 +0.154183 -0.670655 -0.274431 +-0.474307 -0.596929 -0.352923 +0.266108 -0.650328 -0.288481 +0.198017 -0.659298 -0.274662 +-0.275889 -0.642957 -0.285513 +-0.525746 -0.565726 -0.364748 +-0.203502 -0.647451 -0.265566 +-0.136888 -0.655285 -0.257125 +-0.224506 -0.632314 -0.258531 +0.368734 -0.602666 -0.292307 +-0.0216067 -0.646407 -0.237313 +0.268606 -0.614154 -0.257931 +-0.180398 -0.626844 -0.242027 +-0.273898 -0.606602 -0.253666 +-0.201102 -0.611012 -0.234349 +0.142196 -0.615942 -0.225148 +-0.391443 -0.566819 -0.275094 +-0.0574843 -0.613684 -0.212544 +0.0124245 -0.612342 -0.209505 +-0.155809 -0.603915 -0.218329 +-0.222165 -0.595529 -0.227997 +0.369815 -0.56543 -0.262758 +0.127097 -0.596787 -0.20773 +-0.176879 -0.588467 -0.211064 +0.345179 -0.560777 -0.247417 +0.381073 -0.551908 -0.258258 +0.0305627 -0.59346 -0.195717 +0.281816 -0.563682 -0.223571 +0.213543 -0.572334 -0.208272 +0.39287 -0.538283 -0.25441 +-0.59083 -0.471995 -0.345675 +-0.361407 -0.541265 -0.240779 +0.0799296 -0.576482 -0.186809 +-0.22659 -0.563468 -0.205544 +0.4819 -0.497665 -0.278819 +0.198706 -0.55293 -0.190813 +-0.00580147 -0.559541 -0.171218 +-0.474199 -0.491007 -0.269214 +-0.275519 -0.537122 -0.202761 +0.140404 -0.546157 -0.174167 +0.108333 -0.545622 -0.169 +0.425537 -0.4971 -0.243819 +-0.433495 -0.493746 -0.246145 +-0.531734 -0.463521 -0.291193 +-0.365117 -0.508112 -0.219929 +-0.230916 -0.531098 -0.184762 +0.0437652 -0.543033 -0.16143 +0.252599 -0.52615 -0.18799 +0.183409 -0.5334 -0.174261 +0.435922 -0.483067 -0.240646 +-0.185292 -0.523487 -0.168358 +-0.262354 -0.485987 -0.166341 +0.433884 -0.45052 -0.219759 +-0.495629 -0.433341 -0.247293 +-0.290483 -0.475464 -0.169606 +-0.151076 -0.487797 -0.140215 +-0.217387 -0.479475 -0.149796 +-0.353546 -0.457772 -0.184249 +-0.113509 -0.486131 -0.133517 +0.443325 -0.436053 -0.216852 +-0.0740556 -0.482591 -0.12729 +-0.13343 -0.469793 -0.127366 +0.144645 -0.466967 -0.127635 +-0.0947626 -0.466968 -0.120818 +0.112036 -0.466963 -0.122849 +-0.301245 -0.446798 -0.157609 +0.079158 -0.466017 -0.118772 +-0.0791285 -0.464234 -0.117829 +0.0477936 -0.4641 -0.115508 +0.18746 -0.454293 -0.129094 +0.256524 -0.446736 -0.142899 +0.429067 -0.417425 -0.198964 +-0.182696 -0.444262 -0.122929 +0.404141 -0.413314 -0.184009 +0.198765 -0.440613 -0.124584 +0.267533 -0.433001 -0.139223 +-0.00600917 -0.447577 -0.105775 +-0.311689 -0.418132 -0.146762 +0.58345 -0.35778 -0.270905 +0.481368 -0.385285 -0.2127 +-0.0670585 -0.436171 -0.102638 +0.209854 -0.427258 -0.120561 +0.278218 -0.418928 -0.135654 +-0.0266512 -0.433824 -0.0993966 +0.315604 -0.411565 -0.14501 +-0.373481 -0.399822 -0.162949 +-0.407726 -0.392868 -0.175734 +0.389072 -0.393485 -0.167058 +-0.193215 -0.415212 -0.11103 +0.220288 -0.413958 -0.116761 +0.288919 -0.405026 -0.132544 +-0.0877891 -0.420758 -0.097085 +0.119144 -0.419447 -0.100073 +0.326692 -0.397219 -0.142393 +-0.0170737 -0.419733 -0.0925129 +0.0870601 -0.418242 -0.0958461 +0.363345 -0.388469 -0.153199 +-0.22257 -0.405029 -0.1132 +0.466651 -0.366459 -0.19505 +-0.499585 -0.358235 -0.211278 +0.398807 -0.379377 -0.165119 +0.231647 -0.400277 -0.113367 +-0.321592 -0.388649 -0.136559 +0.130334 -0.405646 -0.0953099 +0.299514 -0.391301 -0.129842 +0.0978592 -0.405328 -0.0910815 +0.336677 -0.382918 -0.139755 +0.06575 -0.403438 -0.0873584 +-0.0374784 -0.403736 -0.0858926 +-0.563099 -0.334237 -0.244219 +0.372994 -0.37437 -0.151046 +-0.136969 -0.394393 -0.0913233 +0.173105 -0.3928 -0.0968152 +0.242743 -0.386196 -0.110096 +-0.203581 -0.386361 -0.1004 +0.141091 -0.393069 -0.09138 +-0.0980469 -0.391709 -0.0851499 +0.0757383 -0.390971 -0.0827183 +0.0442376 -0.389142 -0.0798851 +0.451215 -0.347366 -0.177965 +-0.516377 -0.333195 -0.211118 +-0.231458 -0.375494 -0.102542 +0.184415 -0.378993 -0.0931618 +0.253556 -0.371817 -0.106993 +-0.400873 -0.346092 -0.151754 +-0.366676 -0.353382 -0.139378 +0.426776 -0.34274 -0.163106 +-0.259402 -0.36452 -0.105664 +0.493209 -0.329239 -0.1948 +-0.0479291 -0.375649 -0.0744781 +0.0231686 -0.373417 -0.0726258 +0.195041 -0.365159 -0.0897157 +0.263967 -0.357717 -0.104254 +-0.287377 -0.354165 -0.110066 +-0.147324 -0.365943 -0.0810977 +0.301347 -0.35012 -0.113092 +-0.17676 -0.355471 -0.0821785 +0.0331573 -0.360728 -0.0679185 +-0.349316 -0.335378 -0.125071 +0.00171139 -0.358672 -0.0665378 +0.375126 -0.332621 -0.134758 +-0.492559 -0.311145 -0.187243 +-0.384013 -0.328677 -0.137153 +0.173451 -0.351503 -0.0800214 +0.410277 -0.323168 -0.147219 +-0.417765 -0.321478 -0.150221 +0.311786 -0.335337 -0.11099 +0.477267 -0.309828 -0.177672 +-0.274731 -0.335993 -0.0990941 +0.348509 -0.326764 -0.121497 +-0.0590766 -0.346352 -0.0637572 +0.579788 -0.282611 -0.235816 +0.384328 -0.317909 -0.133267 +0.184835 -0.337622 -0.0770441 +0.549202 -0.287209 -0.215215 +0.254002 -0.330361 -0.090965 +0.518023 -0.291451 -0.195818 +-0.332112 -0.318057 -0.112001 +-0.366678 -0.310661 -0.123052 +0.427178 -0.300529 -0.147239 +-0.185626 -0.325985 -0.0730282 +-0.00789601 -0.331136 -0.0564501 +-0.434834 -0.296633 -0.149748 +0.196124 -0.32305 -0.0741633 +-0.147237 -0.323266 -0.0652164 +0.265199 -0.31549 -0.0888823 +-0.286847 -0.310769 -0.0938312 +-0.213635 -0.315177 -0.0753253 +-0.108281 -0.320432 -0.0589375 +0.090454 -0.322525 -0.0577709 +0.59479 -0.259118 -0.239025 +0.564832 -0.263603 -0.218029 +-0.0694174 -0.317542 -0.0543 +-0.174574 -0.313066 -0.0664509 +0.0335473 -0.317931 -0.05248 +0.53381 -0.268171 -0.198045 +0.00237932 -0.316116 -0.0512825 +0.206566 -0.308883 -0.0716025 +-0.241566 -0.304404 -0.0785967 +-0.532431 -0.265628 -0.196284 +-0.348873 -0.292733 -0.109722 +0.275244 -0.301685 -0.0871871 +-0.384582 -0.286044 -0.122347 +0.312362 -0.292825 -0.0962944 +0.411058 -0.280691 -0.13268 +-0.417703 -0.278793 -0.135246 +0.153016 -0.303447 -0.0595181 +-0.451732 -0.271754 -0.150242 +-0.0588737 -0.303851 -0.0491011 +0.0131318 -0.302501 -0.0469415 +0.349053 -0.284261 -0.107051 +-0.149399 -0.296216 -0.0566359 +0.18544 -0.294982 -0.0626647 +-0.0223916 -0.298374 -0.0458137 +0.453712 -0.262614 -0.148425 +-0.555703 -0.244619 -0.205421 +-0.04928 -0.291251 -0.0446234 +-0.331697 -0.275924 -0.0978675 +0.549418 -0.24465 -0.201072 +-0.16382 -0.288064 -0.0565054 +0.0235363 -0.288982 -0.0429547 +-0.365822 -0.267863 -0.108695 +-0.185353 -0.283841 -0.0592138 +0.196359 -0.280105 -0.0603276 +-0.400291 -0.261019 -0.121572 +-0.146403 -0.280656 -0.0514232 +-0.00609903 -0.285304 -0.0415822 +0.428122 -0.257603 -0.133771 +0.164903 -0.280343 -0.0543706 +0.265131 -0.272595 -0.075123 +-0.434223 -0.25366 -0.135646 +-0.286251 -0.26814 -0.08013 +-0.193649 -0.276117 -0.0585863 +-0.107523 -0.278007 -0.0454579 +0.494806 -0.244 -0.165955 +0.302713 -0.264809 -0.084445 +0.115476 -0.275487 -0.0456562 +-0.0588368 -0.275386 -0.0404683 +0.0342973 -0.275062 -0.0391855 +-0.174895 -0.269605 -0.0530446 +-0.578954 -0.223479 -0.215864 +-0.185006 -0.267897 -0.0544821 +-0.0592379 -0.272037 -0.0395382 +0.175331 -0.265921 -0.0520837 +0.594038 -0.216375 -0.225209 +-0.348601 -0.250627 -0.0968593 +0.375604 -0.247008 -0.106742 +0.564233 -0.220977 -0.204506 +-0.0974522 -0.264128 -0.0404484 +0.244172 -0.258542 -0.0653687 +-0.202918 -0.258421 -0.0555196 +0.0912011 -0.263158 -0.0395678 +-0.382435 -0.242761 -0.108478 +0.0454527 -0.261442 -0.0358515 +-0.416813 -0.235786 -0.122121 +-0.0590517 -0.260606 -0.0363624 +0.216567 -0.253636 -0.0572554 +0.631256 -0.202166 -0.251238 +-0.451652 -0.230958 -0.138218 +-0.303041 -0.243122 -0.0785565 +0.18594 -0.251359 -0.0501342 +-0.230335 -0.247513 -0.0588927 +0.153894 -0.251029 -0.0443321 +0.121049 -0.250429 -0.0394623 +0.254748 -0.24386 -0.0642458 +0.0883565 -0.248909 -0.0355117 +-0.130158 -0.245682 -0.0394277 +-0.0462402 -0.247818 -0.0322976 +0.0568991 -0.247376 -0.0327526 +-0.415804 -0.223981 -0.118558 +-0.258045 -0.237123 -0.0634183 +0.29228 -0.236007 -0.0732459 +-0.36552 -0.226584 -0.0971963 +-0.286279 -0.234133 -0.0709004 +0.15171 -0.241314 -0.0414848 +-0.161868 -0.237534 -0.0422023 +0.00701251 -0.241086 -0.0295215 +-0.400161 -0.21929 -0.110178 +0.164588 -0.236566 -0.0424263 +0.329042 -0.227304 -0.0834498 +-0.515043 -0.204938 -0.167696 +-0.113473 -0.237638 -0.035297 +0.132703 -0.235672 -0.0372701 +0.100168 -0.23474 -0.0331164 +-0.179557 -0.231087 -0.0437792 +-0.0599042 -0.233907 -0.0295881 +-0.0353102 -0.233955 -0.0283939 +0.0679788 -0.232969 -0.0298946 +0.365907 -0.218299 -0.0953136 +-0.29657 -0.22192 -0.071131 +0.233588 -0.226023 -0.054299 +0.643692 -0.178597 -0.255847 +-0.319832 -0.218174 -0.0779869 +0.525412 -0.197055 -0.172285 +-0.184625 -0.22452 -0.04318 +-0.136802 -0.222117 -0.0346247 +0.207207 -0.219283 -0.0465954 +0.189777 -0.218256 -0.0427387 +0.468227 -0.196294 -0.138471 +-0.27494 -0.211839 -0.0621662 +-0.0243637 -0.22002 -0.024809 +0.111238 -0.220427 -0.0309603 +-0.0729601 -0.219853 -0.0271992 +-0.538004 -0.18395 -0.177374 +-0.162789 -0.213668 -0.0367525 +-0.498071 -0.187219 -0.153315 +-0.456935 -0.190013 -0.131032 +0.281993 -0.206752 -0.0631256 +0.442777 -0.191209 -0.123993 +-0.61534 -0.168061 -0.229862 +0.154209 -0.211156 -0.0347887 +-0.123929 -0.210738 -0.0303449 +0.318886 -0.198393 -0.0732033 +-0.337342 -0.194241 -0.0788754 +-0.311908 -0.197785 -0.0707024 +-0.00164758 -0.20739 -0.0217431 +-0.190722 -0.202483 -0.0394658 +-0.0135001 -0.206314 -0.0216072 +0.539609 -0.173477 -0.176151 +0.223116 -0.200263 -0.0460011 +0.570146 -0.168841 -0.195993 +0.355182 -0.189457 -0.0846028 +-0.37104 -0.186403 -0.0902842 +-0.15195 -0.198932 -0.0318382 +-0.112935 -0.195928 -0.0259066 +0.48328 -0.172596 -0.141716 +-0.291884 -0.18742 -0.062089 +-0.218205 -0.190961 -0.0429625 +-0.480702 -0.169328 -0.13962 +-0.440223 -0.173032 -0.118942 +-0.179912 -0.187921 -0.0344342 +0.201948 -0.185236 -0.0382804 +0.458355 -0.167671 -0.12719 +0.169667 -0.184939 -0.0320067 +0.0146831 -0.186641 -0.0176815 +-0.207275 -0.176772 -0.0378207 +-0.102027 -0.182255 -0.0220565 +-0.591009 -0.146232 -0.2067 +-0.281141 -0.17267 -0.0559954 +0.432495 -0.162435 -0.113116 +0.307531 -0.169072 -0.063603 +0.18036 -0.170216 -0.0312395 +0.4062 -0.157285 -0.0998542 +-0.50389 -0.148544 -0.149101 +-0.23543 -0.166124 -0.0424117 +0.148777 -0.1695 -0.0257643 +0.343925 -0.160627 -0.0748433 +-0.0911904 -0.168459 -0.0185184 +0.116002 -0.168495 -0.0211471 +0.249627 -0.16276 -0.0454344 +0.529943 -0.144562 -0.164379 +-0.197079 -0.1632 -0.0332912 +0.083704 -0.16746 -0.0176808 +-0.342919 -0.154683 -0.0734582 +0.47308 -0.14401 -0.13083 +-0.283871 -0.156102 -0.0539294 +0.243567 -0.157686 -0.0430201 +-0.377317 -0.14771 -0.0857715 +-0.118544 -0.158105 -0.0197194 +-0.0798257 -0.154544 -0.0152442 +-0.224309 -0.152112 -0.0374267 +-0.411228 -0.140466 -0.0993553 +-0.29757 -0.147716 -0.0567969 +0.447457 -0.138671 -0.116511 +0.32408 -0.145923 -0.0652924 +0.228453 -0.147771 -0.0377252 +-0.526747 -0.127213 -0.159551 +0.421555 -0.133539 -0.103084 +0.360023 -0.137061 -0.0771793 +-0.251444 -0.14062 -0.0423979 +-0.109113 -0.144518 -0.0165322 +0.0266055 -0.146353 -0.0111255 +0.265879 -0.139562 -0.0461495 +-0.213655 -0.138166 -0.0329108 +-0.0689543 -0.141309 -0.0124388 +0.0027954 -0.139757 -0.00981808 +-0.174374 -0.135988 -0.0247559 +0.206982 -0.132863 -0.0307189 +-0.43579 -0.119538 -0.107925 +-0.241466 -0.127808 -0.0380439 +-0.198856 -0.128206 -0.0283932 +0.0376497 -0.130123 -0.0092172 +0.244705 -0.124951 -0.0384873 +0.611412 -0.102012 -0.215291 +-0.202432 -0.124131 -0.0286027 +0.0457187 -0.127319 -0.00919238 +0.494985 -0.11045 -0.138147 +0.639283 -0.0976318 -0.237251 +-0.349261 -0.116564 -0.0702531 +-0.633388 -0.094911 -0.232008 +0.375514 -0.113433 -0.0801512 +-0.383149 -0.108935 -0.0827598 +-0.26427 -0.114266 -0.042344 +-0.244569 -0.115527 -0.037275 +0.153628 -0.116575 -0.0187719 +-0.23055 -0.113751 -0.0336111 +0.121547 -0.115845 -0.0141976 +0.247274 -0.113244 -0.0376948 +-0.303737 -0.109779 -0.0535897 +-0.0195516 -0.114225 -0.00673753 +0.0891075 -0.114241 -0.0105512 +-0.238289 -0.110307 -0.0350902 +0.222907 -0.109426 -0.0313215 +0.00629459 -0.11032 -0.00612384 +0.0400594 -0.109253 -0.00679353 +-0.338209 -0.101967 -0.0644695 +0.29122 -0.101774 -0.0487728 +-0.21918 -0.0991652 -0.0293681 +0.417697 -0.0949642 -0.09639 +-0.0747675 -0.102651 -0.00809648 +-0.00356045 -0.100892 -0.00510896 +0.50872 -0.0873333 -0.143509 +-0.29229 -0.0951418 -0.0484146 +0.390589 -0.0898068 -0.0838259 +0.540773 -0.0824625 -0.162883 +0.201962 -0.0945299 -0.0251793 +-0.216454 -0.0904051 -0.0279019 +0.483641 -0.081914 -0.128575 +-0.441246 -0.0814518 -0.106318 +0.270041 -0.0868353 -0.0410747 +0.601318 -0.0731998 -0.20435 +-0.481948 -0.0779621 -0.127276 +0.190956 -0.0876309 -0.0223208 +-0.208063 -0.0854565 -0.0256247 +-0.0394481 -0.087645 -0.00462961 +-0.562826 -0.0718458 -0.176553 +0.194506 -0.0856298 -0.0228434 +0.458406 -0.0768799 -0.114588 +0.306975 -0.0782197 -0.0515023 +0.370532 -0.0748619 -0.0742021 +-0.645472 -0.0600745 -0.238583 +0.148014 -0.0779601 -0.0140923 +0.431996 -0.0716248 -0.100973 +-0.0915762 -0.0775957 -0.00722978 +0.11581 -0.0771616 -0.00973025 +0.0833783 -0.0755665 -0.00635129 +-0.19709 -0.0718652 -0.0222522 +0.218651 -0.0719616 -0.0268538 +-0.305658 -0.0696294 -0.0504081 +-0.000999364 -0.0356439 -0.000635947 +0.0644447 -0.0359019 -0.00272474 +0.426465 -0.0324484 -0.0960784 +-0.356661 -0.0286404 -0.0662051 +-0.276746 -0.0295941 -0.0395128 +-0.476191 -0.0255251 -0.121029 +0.399359 -0.0274915 -0.0836178 +0.0249292 -0.0289788 -0.000730884 +-0.516814 -0.0224865 -0.144198 +0.547827 -0.0204207 -0.163658 +-0.699461 -0.0171472 -0.285535 +-0.390477 -0.021815 -0.0796457 +-0.311151 -0.0217528 -0.0498884 +0.491418 -0.0196831 -0.129299 +0.523763 -0.0151998 -0.148271 +0.189231 -0.0163063 -0.0182028 +-0.0608804 -0.0145315 -0.00196072 +0.157257 -0.0156055 -0.0125655 +0.226752 -0.00807965 -0.0260809 +0.472738 -0.00440596 -0.118808 +0.446962 0.000859609 -0.105447 +0.358583 0.00278248 -0.0665064 +0.204357 0.00692822 -0.0211281 +0.419952 0.00575602 -0.0924718 +0.172956 0.00842053 -0.0151065 +-0.622898 0.0100731 -0.217762 +-0.576778 0.0109723 -0.183173 +-0.205039 0.0157722 -0.0213732 +-0.277851 0.0198191 -0.0395803 +-0.165651 0.0185511 -0.0139901 +0.337261 0.0178706 -0.0587584 +0.278936 0.0241459 -0.039994 +0.39997 0.0211379 -0.0837155 +-0.477954 0.0230381 -0.121917 +0.517376 0.0232633 -0.144558 +-0.658824 0.022806 -0.248048 +0.18862 0.03225 -0.0184796 +0.492301 0.0287901 -0.130051 +0.548495 0.0281559 -0.16432 +-0.26705 0.0337087 -0.0369072 +0.315904 0.0329704 -0.0517818 +-0.425783 0.0340181 -0.0958142 +0.466264 0.0338559 -0.116003 +0.257015 0.0392263 -0.0343889 +-0.256186 0.047228 -0.034527 +0.29361 0.047755 -0.0452684 +-0.548908 0.0429743 -0.165223 +-0.415518 0.0478707 -0.0916755 +-0.641271 0.0406107 -0.233761 +-0.290773 0.0545873 -0.0447664 +0.203807 0.0556026 -0.0225692 +-0.0607628 0.0637964 -0.00388861 +-0.2062 0.0642405 -0.0236012 +0.392063 0.0596701 -0.0819989 +-0.490821 0.0576524 -0.130649 +-0.404847 0.0618792 -0.0877119 +0.641512 0.0512816 -0.234603 +-0.167084 0.0670552 -0.0163402 +-0.279136 0.0684621 -0.0421922 +-0.128466 0.0698493 -0.0107489 +-0.5778 0.0595838 -0.185999 +-0.0515571 0.0743096 -0.00409842 +-0.439093 0.0680852 -0.104142 +0.398781 0.070109 -0.0856376 +0.697008 0.0561879 -0.285141 +0.540964 0.0663681 -0.161577 +0.370866 0.0745099 -0.0743075 +-0.479209 0.0716144 -0.125225 +0.218016 0.0800936 -0.0273469 +-0.393903 0.0754217 -0.0839474 +0.187326 0.0807312 -0.0210253 +-0.0462291 0.08528 -0.00471602 +0.516387 0.0716814 -0.14665 +-0.268562 0.0821162 -0.040244 +0.314674 0.081446 -0.0543008 +0.255429 0.0876552 -0.0371539 +0.491271 0.0773094 -0.132431 +-0.427891 0.0823046 -0.0999251 +-0.302601 0.0891915 -0.0510651 +0.547667 0.0767316 -0.166829 +0.105051 0.0929715 -0.00988858 +0.465034 0.0823103 -0.118542 +-0.0735425 0.0964274 -0.00738061 +-0.468694 0.0855697 -0.120793 +-0.00298325 0.0975477 -0.00477362 +0.43793 0.0876505 -0.105274 +-0.21809 0.0990882 -0.0291148 +0.291875 0.0961131 -0.048385 +-0.417017 0.0964601 -0.0962345 +0.356073 0.100028 -0.0709111 +-0.291938 0.103383 -0.0491666 +-0.548857 0.0915218 -0.169109 +0.444722 0.0981842 -0.109729 +-0.371712 0.103515 -0.0774412 +0.417478 0.102737 -0.0971396 +-0.326058 0.110269 -0.0611033 +-0.206773 0.113089 -0.0281689 +0.239451 0.112708 -0.0356555 +-0.168586 0.115992 -0.0211617 +-0.406381 0.110197 -0.0929658 +-0.280782 0.117341 -0.0474284 +0.334361 0.114621 -0.0645511 +-0.249812 0.120102 -0.039183 +-0.538711 0.105157 -0.164098 +-0.36011 0.117235 -0.0744856 +-0.172993 0.124139 -0.0229314 +0.276068 0.121139 -0.0465263 +0.396623 0.117613 -0.0895838 +-0.315238 0.124071 -0.0591325 +0.153193 0.130214 -0.0204205 +0.0882044 0.132631 -0.012767 +0.121017 0.131618 -0.016114 +-0.632294 0.10301 -0.232151 +-0.394988 0.123802 -0.0896938 +0.311539 0.129619 -0.0586488 +-0.230808 0.133968 -0.0362676 +-0.19189 0.136339 -0.0280999 +0.18917 0.137878 -0.0277837 +-0.152925 0.139043 -0.0215926 +0.222749 0.137741 -0.034904 +0.374853 0.132747 -0.0824689 +0.48799 0.125401 -0.136206 +0.0283189 0.14464 -0.0109209 +0.317922 0.139796 -0.0622459 +0.259676 0.146251 -0.0454431 +0.25489 0.14596 -0.0441096 +-0.179858 0.149882 -0.027793 +-0.176638 0.151762 -0.0274943 +-0.338453 0.145039 -0.0702617 +0.650148 0.118945 -0.249561 +0.224762 0.153448 -0.0377443 +0.574619 0.12904 -0.191816 +-0.254197 0.154777 -0.0453126 +0.468351 0.140565 -0.127711 +-0.177786 0.158361 -0.0287566 +0.295251 0.154395 -0.0571379 +0.550794 0.134836 -0.176322 +0.205201 0.162257 -0.0348237 +-0.0985773 0.165773 -0.0187754 +0.0441614 0.169172 -0.0154033 +0.359294 0.158271 -0.0802947 +-0.41389 0.154952 -0.102958 +-0.193633 0.168594 -0.0335207 +-0.203993 0.171626 -0.0361892 +-0.0511143 0.176527 -0.0170323 +0.242442 0.170878 -0.0450013 +0.279751 0.168859 -0.0548938 +-0.165136 0.174447 -0.0292794 +0.42031 0.160784 -0.106978 +-0.277498 0.175495 -0.0554384 +0.33692 0.172568 -0.0744162 +-0.40257 0.168939 -0.100335 +0.278399 0.179281 -0.0564151 +0.426519 0.171419 -0.111914 +0.1238 0.189651 -0.0259846 +0.156061 0.188417 -0.0303897 +-0.63964 0.147609 -0.245631 +-0.311372 0.182631 -0.0674263 +-0.0809964 0.192022 -0.0219576 +0.0921381 0.191731 -0.0228871 +-0.436472 0.175601 -0.117585 +-0.227491 0.192466 -0.0454296 +-0.188628 0.19489 -0.0374839 +0.2836 0.189338 -0.0599351 +-0.14974 0.197676 -0.0312367 +-0.345806 0.189677 -0.0810652 +-0.110274 0.201271 -0.0266915 +-0.477519 0.178554 -0.139713 +0.0319199 0.203928 -0.0215346 +0.405141 0.186287 -0.104926 +0.15695 0.202339 -0.033343 +-0.300496 0.196466 -0.0666709 +0.619046 0.162742 -0.231692 +0.320299 0.197578 -0.0735164 +-0.0673927 0.213106 -0.0252979 +0.00362905 0.214379 -0.0232563 +0.382971 0.200473 -0.0982549 +-0.564636 0.180576 -0.194656 +-0.422099 0.19953 -0.115681 +-0.212268 0.21557 -0.0468621 +0.267648 0.21478 -0.0607269 +-0.0243458 0.225306 -0.0260163 +-0.0943737 0.224943 -0.0302092 +0.111613 0.224328 -0.031899 +-0.0418416 0.226723 -0.0269399 +0.0841128 0.225811 -0.0294669 +0.463847 0.201087 -0.137208 +0.152822 0.22545 -0.0378057 +-0.284881 0.220097 -0.0670475 +0.30244 0.222218 -0.0730967 +0.526087 0.197762 -0.172883 +-0.410083 0.21344 -0.113278 +0.213215 0.230271 -0.0505187 +0.500651 0.202905 -0.158467 +0.0514844 0.236841 -0.0298167 +-0.365604 0.22031 -0.0956786 +-0.0504066 0.236963 -0.0297898 +-0.319327 0.227102 -0.0799701 +0.235807 0.23392 -0.0567733 +0.366505 0.225683 -0.0973699 +-0.23489 0.236748 -0.0572504 +0.555818 0.202152 -0.193649 +-0.0503591 0.244092 -0.0315563 +0.531614 0.207308 -0.178776 +-0.39933 0.226988 -0.111737 +-0.195156 0.242044 -0.049564 +-0.118587 0.245 -0.0377566 +0.249658 0.238705 -0.0615486 +0.506692 0.21325 -0.164663 +0.480154 0.21801 -0.150339 +-0.354056 0.234233 -0.0945835 +0.148111 0.247064 -0.0423871 +0.1587 0.246653 -0.0439788 +0.161506 0.246255 -0.044346 +0.453462 0.223644 -0.137239 +0.163678 0.248673 -0.0453423 +0.561218 0.211756 -0.199879 +-0.590481 0.207097 -0.219972 +-0.440597 0.230315 -0.132342 +-0.0588181 0.258458 -0.0357697 +0.131706 0.257908 -0.0428494 +0.165061 0.257052 -0.047803 +0.459301 0.233317 -0.142908 +0.431587 0.238381 -0.129996 +0.349283 0.250395 -0.0970586 +-0.220049 0.260636 -0.0599747 +-0.0687694 0.267851 -0.038997 +0.291488 0.257094 -0.0786221 +-0.428392 0.244066 -0.129993 +0.200611 0.264857 -0.0568109 +0.566135 0.221523 -0.206011 +0.0716571 0.270242 -0.039878 +0.0364121 0.270666 -0.0380154 +-0.384124 0.250877 -0.111457 +-0.338586 0.257554 -0.0949997 +0.464596 0.24381 -0.148702 +-0.521391 0.236209 -0.180026 +-0.0981944 0.275414 -0.0437024 +-0.29263 0.26499 -0.0812247 +0.354955 0.261264 -0.102365 +0.237228 0.273344 -0.0677952 +-0.625814 0.219856 -0.251655 +-0.0593927 0.281488 -0.042275 +0.571194 0.231425 -0.212485 +-0.0882188 0.28276 -0.0448749 +-0.372107 0.264834 -0.110394 +0.443296 0.25871 -0.141771 +-0.165489 0.286538 -0.0563319 +0.415364 0.263195 -0.129252 +-0.509769 0.249756 -0.17674 +-0.204168 0.284179 -0.0632195 +-0.102127 0.289009 -0.0481368 +-0.126041 0.28969 -0.0512149 +-0.457834 0.26083 -0.150085 +-0.0162061 0.293746 -0.044254 +-0.276827 0.288299 -0.0833481 +0.420928 0.272985 -0.134957 +0.123905 0.302157 -0.0548288 +0.337278 0.285066 -0.102793 +0.156012 0.300878 -0.059185 +0.278704 0.291549 -0.0849461 +0.177194 0.299386 -0.0624658 +0.0922616 0.304159 -0.0518572 +-0.402423 0.281735 -0.128977 +0.0217167 0.308819 -0.0491271 +-0.311133 0.295359 -0.0966953 +-0.103643 0.309985 -0.0549246 +-0.188127 0.307816 -0.0673387 +-0.149355 0.311049 -0.0614151 +-0.226945 0.305665 -0.0753029 +-0.0398355 0.314367 -0.0515348 +0.0640613 0.315046 -0.053088 +0.284476 0.302423 -0.0902671 +0.34249 0.295322 -0.1081 +0.0960584 0.313632 -0.0553265 +0.193393 0.309457 -0.0689598 +-0.345705 0.302705 -0.111823 +-0.261258 0.311942 -0.086525 +-0.0576386 0.322259 -0.0551048 +0.585505 0.261149 -0.232547 +-0.105815 0.323707 -0.0597783 +0.403432 0.297781 -0.134801 +0.431315 0.293825 -0.146985 +0.229953 0.317836 -0.0801619 +-0.432212 0.29848 -0.149058 +-0.295694 0.318953 -0.0995368 +-0.0619935 0.33557 -0.060027 +0.00805349 0.337011 -0.0585337 +0.408888 0.307724 -0.140863 +-0.171359 0.332446 -0.0725758 +0.324263 0.319404 -0.109587 +-0.00123685 0.341171 -0.0599995 +-0.472879 0.300898 -0.171841 +-0.375032 0.319098 -0.129639 +-0.207653 0.338319 -0.0821655 +-0.12975 0.343842 -0.0699797 +-0.245915 0.336382 -0.0909495 +0.270662 0.335852 -0.0978107 +-0.019399 0.349003 -0.0630792 +0.329722 0.329552 -0.115309 +0.414195 0.318169 -0.147233 +-0.512645 0.304249 -0.197113 +-0.461764 0.315434 -0.170979 +-0.279995 0.342691 -0.103247 +0.088383 0.357702 -0.0703561 +0.153314 0.355269 -0.0778944 +0.121119 0.356996 -0.0737797 +0.276628 0.346652 -0.103725 +0.335068 0.340329 -0.121418 +-0.404719 0.335853 -0.149468 +-0.360035 0.342812 -0.132328 +-0.15213 0.365715 -0.0817905 +-0.314556 0.350174 -0.117712 +-0.0427986 0.368746 -0.0714554 +0.0608906 0.369381 -0.0727189 +0.190469 0.364262 -0.088389 +0.39545 0.342083 -0.147593 +-0.446199 0.338844 -0.171694 +-0.606462 0.301845 -0.26441 +-0.54888 0.316881 -0.22649 +-0.109324 0.377167 -0.0803298 +0.0329651 0.380022 -0.07561 +0.195675 0.374246 -0.09355 +0.226369 0.371758 -0.0996928 +-0.389679 0.359625 -0.152167 +-0.34429 0.366415 -0.13559 +-0.0654813 0.389959 -0.0814991 +0.00552027 0.391775 -0.0799557 +0.405467 0.36174 -0.160512 +0.191304 0.391474 -0.0999163 +-0.170901 0.396315 -0.0979319 +0.325393 0.383351 -0.135615 +-0.244215 0.399704 -0.116487 +-0.128485 0.408132 -0.0961639 +-0.0181693 0.412121 -0.0890521 +-0.328246 0.390047 -0.139699 +-0.374133 0.383398 -0.155589 +0.330366 0.393039 -0.141875 +-0.0848893 0.420612 -0.0967395 +0.121974 0.420245 -0.100824 +-0.278737 0.407015 -0.130147 +0.27668 0.409517 -0.130665 +0.335239 0.40298 -0.148401 +0.593912 0.343579 -0.272523 +-0.510869 0.368208 -0.223189 +0.418916 0.390437 -0.180203 +-0.258677 0.441778 -0.140978 +0.0396905 0.456834 -0.111334 +0.200363 0.448434 -0.128931 +0.291018 0.440151 -0.150544 +0.557332 0.384463 -0.264086 +-0.0588092 0.464871 -0.116577 +-0.338319 0.44079 -0.168589 +0.20523 0.458604 -0.135383 +-0.384017 0.434138 -0.185104 +0.295453 0.4499 -0.157208 +0.352873 0.442636 -0.17565 +-0.0555255 0.473954 -0.121203 +-0.28869 0.457592 -0.159008 +0.209967 0.468759 -0.141991 +0.488977 0.419896 -0.235416 +0.0200675 0.485471 -0.125977 +-0.160679 0.479511 -0.1373 +-0.19939 0.476913 -0.143964 +0.214435 0.47843 -0.148459 +0.304344 0.469079 -0.17094 +-0.367969 0.458408 -0.191012 +-0.117537 0.492059 -0.137409 +0.360924 0.461791 -0.189763 +0.0245987 0.495942 -0.131993 +-0.233723 0.483839 -0.15663 +0.219169 0.488072 -0.155162 +-0.318044 0.474333 -0.179112 +0.308459 0.478495 -0.177871 +0.223679 0.498137 -0.162249 +-0.448924 0.46355 -0.23607 +-0.264037 0.500822 -0.175705 +0.397772 0.476776 -0.216124 +0.228112 0.507332 -0.168989 +-0.500865 0.452681 -0.262292 +-0.0648151 0.52409 -0.150807 +0.00591911 0.525802 -0.149414 +0.401325 0.485819 -0.223522 +0.232581 0.516434 -0.175863 +-0.343141 0.500892 -0.205417 +-0.0609618 0.534458 -0.157006 +-0.388523 0.494153 -0.222271 +-0.29313 0.517425 -0.196044 +0.236505 0.525732 -0.182889 +-0.484756 0.476222 -0.266362 +0.432569 0.490568 -0.243543 +0.0152492 0.545759 -0.162196 +-0.165513 0.539412 -0.174385 +0.0198024 0.555769 -0.168899 +-0.161255 0.549288 -0.180074 +-0.19982 0.546446 -0.186693 +-0.121989 0.552924 -0.175747 +0.0242731 0.565249 -0.175437 +-0.195937 0.55626 -0.192421 +-0.23383 0.553363 -0.200555 +-0.113155 0.571519 -0.18725 +0.0291334 0.574957 -0.182335 +-0.363738 0.537295 -0.239074 +-0.229649 0.563275 -0.206286 +0.222249 0.565782 -0.205962 +-0.515694 0.498635 -0.303277 +0.392541 0.53627 -0.252788 +-0.108678 0.581368 -0.19365 +0.033579 0.584324 -0.189175 +0.0380302 0.593706 -0.196217 +0.286029 0.570229 -0.229918 +-0.0997666 0.601067 -0.207053 +0.17224 0.599041 -0.218026 +0.0797492 0.612398 -0.213483 +0.175994 0.607368 -0.22532 +-0.250044 0.599521 -0.239702 +-0.0902823 0.620357 -0.220894 +0.116549 0.619964 -0.224075 +-0.245756 0.610099 -0.246751 +-0.0856547 0.629824 -0.227999 +-0.0145588 0.632307 -0.225419 +-0.37396 0.592646 -0.286611 +-0.0100497 0.640944 -0.232479 +-0.0813746 0.638837 -0.234974 +-0.324442 0.609365 -0.276528 +0.438645 0.584648 -0.317522 +-0.232058 0.638879 -0.266527 +0.0315344 0.659754 -0.24918 +-0.1059 0.665851 -0.261469 +0.0686848 0.668556 -0.259517 +0.340804 0.637162 -0.308713 +-0.0303335 0.677692 -0.26528 +-0.306293 0.648749 -0.303359 +-0.400671 0.624611 -0.329684 +-0.179051 0.670621 -0.280133 +-0.116447 0.677061 -0.273344 +-0.39648 0.634784 -0.336786 +0.318204 0.658054 -0.31757 +0.117375 0.711431 -0.307115 diff --git a/image_analysis/indexing/fast-feedback-indexer/data/image0_radial.txt b/image_analysis/indexing/fast-feedback-indexer/data/image0_radial.txt new file mode 100644 index 000000000..5f8d5c2c6 --- /dev/null +++ b/image_analysis/indexing/fast-feedback-indexer/data/image0_radial.txt @@ -0,0 +1,668 @@ +36.9 0 0 4.83429e-15 78.95 0 4.83429e-15 4.83429e-15 78.95 +-0.0555149 0.473952 -0.121201 +-0.0540935 0.468741 -0.118322 +-0.0543334 0.464472 -0.116081 +-0.0587754 0.46484 -0.116559 +0.176558 0.450519 -0.124866 +0.0396743 0.456901 -0.111368 +0.168381 0.450759 -0.123379 +0.158898 0.424846 -0.108789 +0.0550367 0.429647 -0.0986819 +0.0273893 0.430108 -0.0976382 +-0.0139241 0.430487 -0.0975108 +-0.0339862 0.42979 -0.0977111 +-0.146483 0.425157 -0.106812 +0.107482 0.426617 -0.101977 +-0.0116848 0.425493 -0.0951138 +0.122057 0.420275 -0.10085 +-0.0454081 0.42354 -0.0952614 +-0.0848674 0.420644 -0.0967526 +-0.0214061 0.420503 -0.0929614 +-0.0460835 0.420657 -0.0939512 +0.0145251 0.41911 -0.0921807 +0.239539 0.404038 -0.117178 +-0.0180581 0.412285 -0.0891241 +-0.244221 0.399711 -0.116491 +-0.128231 0.408104 -0.0961151 +0.106 0.40503 -0.0918618 +0.032864 0.40688 -0.08711 +-0.0358433 0.40592 -0.0867945 +-0.170939 0.396441 -0.0979942 +-0.131416 0.399559 -0.092761 +-0.209286 0.393342 -0.104745 +0.191373 0.391472 -0.0999298 +0.100444 0.3951 -0.0868697 +0.274622 0.380585 -0.116972 +0.00551993 0.391906 -0.0800114 +0.0804584 0.389827 -0.0826334 +-0.0654872 0.389978 -0.0815076 +-0.131688 0.382548 -0.0854973 +0.0366125 0.383046 -0.0769967 +0.0692283 0.381921 -0.0784016 +0.226369 0.371758 -0.0996928 +0.195394 0.374147 -0.0934486 +0.0329656 0.380026 -0.0756117 +-0.109402 0.377099 -0.0803114 +0.199778 0.370485 -0.0929005 +-0.0570029 0.373457 -0.0741057 +0.190469 0.364262 -0.088389 +0.0609082 0.369355 -0.0727096 +-0.056874 0.36999 -0.0727068 +-0.0427986 0.368746 -0.0714554 +-0.190948 0.362787 -0.0879012 +-0.314556 0.350174 -0.117712 +-0.15612 0.363668 -0.081647 +-0.152117 0.365562 -0.0817272 +-0.247387 0.354398 -0.0982232 +0.335108 0.340395 -0.121459 +0.276628 0.346652 -0.103725 +0.153318 0.355283 -0.0779004 +0.0883758 0.357684 -0.0703487 +0.121119 0.356996 -0.0737797 +-0.280007 0.342693 -0.103252 +-0.0799742 0.355797 -0.0688649 +0.0878789 0.352758 -0.0684211 +0.107599 0.349901 -0.0694131 +0.11867 0.348141 -0.0700991 +-0.0193991 0.349003 -0.0630792 +-0.271185 0.338756 -0.0990541 +0.270662 0.335852 -0.0978107 +-0.129894 0.34371 -0.0699509 +-0.245915 0.336382 -0.0909495 +0.113931 0.343743 -0.0678732 +-0.207572 0.338509 -0.082217 +-0.330306 0.326436 -0.114372 +0.167312 0.364529 -0.0839622 +0.122138 0.340307 -0.0676517 +-0.232735 0.332652 -0.0861199 +-0.00123684 0.341171 -0.0599995 +0.265023 0.327909 -0.0932263 +0.00805351 0.337011 -0.0585337 +-0.171542 0.332374 -0.0725838 +0.324263 0.319404 -0.109587 +0.162618 0.331742 -0.0707516 +-0.295693 0.31898 -0.099546 +-0.0619935 0.33557 -0.060027 +0.320279 0.313399 -0.106019 +0.31939 0.309538 -0.104357 +0.229934 0.31773 -0.0801207 +-0.105815 0.323707 -0.0597783 +-0.345662 0.302631 -0.111782 +0.296516 0.307966 -0.0959893 +0.0640613 0.315046 -0.053088 +0.284577 0.302325 -0.0902662 +-0.0398355 0.314367 -0.0515348 +-0.149355 0.311049 -0.0614151 +-0.188125 0.307823 -0.0673402 +0.193393 0.309457 -0.0689598 +0.0960584 0.313632 -0.0553265 +-0.226945 0.305665 -0.0753029 +-0.293139 0.300173 -0.0922745 +0.342555 0.29473 -0.107929 +-0.311135 0.295365 -0.0966979 +0.0217167 0.308819 -0.0491271 +0.123895 0.302167 -0.0548306 +0.278712 0.291546 -0.0849476 +0.156012 0.300878 -0.059185 +0.0922616 0.304159 -0.0518571 +0.337278 0.285066 -0.102793 +0.177194 0.299386 -0.0624658 +-0.276827 0.288299 -0.0833481 +-0.0162061 0.293746 -0.044254 +-0.126041 0.28969 -0.051215 +-0.165489 0.286538 -0.0563319 +-0.204168 0.284179 -0.0632195 +-0.102127 0.289009 -0.0481368 +0.274845 0.278813 -0.0798243 +0.0158851 0.476309 -0.120866 +-0.326975 0.271553 -0.0948225 +-0.37212 0.264865 -0.110409 +-0.0593927 0.281488 -0.042275 +-0.0882188 0.28276 -0.0448749 +0.237228 0.273344 -0.0677952 +0.354949 0.261224 -0.102351 +-0.292745 0.265027 -0.081272 +-0.383995 0.254714 -0.112493 +-0.0981944 0.275414 -0.0437024 +-0.338904 0.256998 -0.0949605 +-0.383984 0.251197 -0.111486 +0.291463 0.257103 -0.0786164 +0.200611 0.264857 -0.0568109 +0.0716571 0.270242 -0.039878 +0.349282 0.250384 -0.0970548 +-0.0687694 0.267851 -0.038997 +0.214203 0.391093 -0.104923 +-0.220049 0.260636 -0.0599748 +-0.26683 0.253814 -0.0702794 +-0.314068 0.250888 -0.0843493 +0.165061 0.257052 -0.047803 +0.131706 0.257908 -0.0428494 +-0.314497 0.24573 -0.0830985 +0.28734 0.247085 -0.0745893 +-0.0588181 0.258458 -0.0357697 +-0.354075 0.234217 -0.0945868 +0.1587 0.246653 -0.0439788 +-0.118591 0.244992 -0.0377552 +0.249658 0.238705 -0.0615486 +-0.195156 0.242044 -0.049564 +-0.301598 0.233851 -0.075688 +-0.39935 0.227101 -0.111774 +-0.0503591 0.244092 -0.0315563 +-0.23489 0.236748 -0.0572504 +0.366503 0.225681 -0.0973687 +-0.429064 0.219351 -0.123764 +0.287802 0.230579 -0.0704821 +0.235807 0.23392 -0.0567733 +-0.319321 0.227082 -0.079963 +0.213215 0.230271 -0.0505187 +0.0514844 0.236841 -0.0298167 +-0.0504067 0.236963 -0.0297898 +-0.365167 0.22018 -0.0954705 +0.148111 0.247064 -0.0423871 +-0.41014 0.213455 -0.113308 +0.30244 0.222218 -0.0730967 +-0.323139 0.219166 -0.0793765 +-0.284881 0.220097 -0.0670475 +0.152822 0.22545 -0.0378057 +-0.0418416 0.226723 -0.0269399 +-0.0943737 0.224943 -0.0302092 +0.111613 0.224328 -0.031899 +-0.0243458 0.225306 -0.0260163 +0.267648 0.21478 -0.0607269 +0.302027 0.212503 -0.0706871 +0.329769 0.329565 -0.115331 +-0.422182 0.199762 -0.115773 +-0.212268 0.21557 -0.0468621 +0.382971 0.200473 -0.0982549 +-0.297152 0.208971 -0.0683177 +-0.330086 0.206606 -0.0789369 +-0.0673927 0.213106 -0.025298 +0.00362904 0.214379 -0.0232563 +0.390134 0.193314 -0.0997638 +0.320299 0.197578 -0.0735164 +-0.300496 0.196466 -0.0666709 +0.0319199 0.203928 -0.0215346 +0.405125 0.18622 -0.104905 +-0.345805 0.18968 -0.0810655 +-0.110274 0.201271 -0.0266915 +-0.14974 0.197676 -0.0312367 +-0.188625 0.194882 -0.0374816 +-0.22751 0.19246 -0.0454328 +-0.436472 0.175601 -0.117585 +0.1238 0.189651 -0.0259846 +0.0921381 0.191731 -0.0228871 +-0.311397 0.18264 -0.0674367 +-0.0809964 0.192022 -0.0219576 +0.156061 0.188417 -0.0303897 +0.426532 0.1714 -0.111916 +-0.13359 0.395318 -0.0912222 +0.278399 0.179281 -0.0564151 +-0.40257 0.168939 -0.100335 +-0.277515 0.175525 -0.0554491 +0.33692 0.172568 -0.0744162 +0.420299 0.160784 -0.106973 +0.242442 0.170878 -0.0450012 +-0.165136 0.174447 -0.0292794 +-0.203993 0.171626 -0.0361892 +-0.0511143 0.176527 -0.0170324 +-0.193633 0.168594 -0.0335207 +-0.41413 0.155072 -0.103089 +0.359294 0.158271 -0.0802947 +0.0441614 0.169172 -0.0154033 +0.205201 0.162257 -0.0348237 +-0.0563225 0.390474 -0.0811105 +-0.0985773 0.165773 -0.0187754 +-0.372108 0.151834 -0.0843134 +0.295251 0.154395 -0.0571379 +-0.177786 0.158361 -0.0287566 +-0.254192 0.15479 -0.0453135 +-0.0604365 0.15755 -0.0143401 +0.224762 0.153448 -0.0377443 +-0.176638 0.151762 -0.0274943 +0.259675 0.146256 -0.0454433 +-0.179858 0.149882 -0.027793 +0.25489 0.14596 -0.0441096 +0.317922 0.139796 -0.0622459 +0.374871 0.132788 -0.0824824 +0.22275 0.137741 -0.0349041 +-0.152925 0.139043 -0.0215926 +0.18917 0.137878 -0.0277837 +-0.230808 0.133968 -0.0362676 +-0.19189 0.136339 -0.0280999 +0.311539 0.129619 -0.0586488 +-0.394988 0.123802 -0.0896938 +0.121023 0.131625 -0.0161157 +0.0882044 0.132631 -0.0127669 +0.153177 0.130208 -0.020417 +-0.315238 0.124071 -0.0591325 +0.396615 0.117595 -0.0895781 +0.276068 0.121139 -0.0465263 +-0.360123 0.117236 -0.0744909 +-0.172993 0.124139 -0.0229314 +-0.280782 0.117341 -0.0474284 +0.334361 0.114621 -0.0645511 +-0.40632 0.110235 -0.0929431 +-0.168586 0.115992 -0.0211617 +-0.326058 0.110269 -0.0611033 +0.239451 0.112708 -0.0356556 +-0.347434 0.108049 -0.0685415 +-0.417012 0.0964713 -0.0962331 +0.100168 -0.23474 -0.0331164 +0.375552 -0.113423 -0.0801653 +-0.400161 -0.21929 -0.110178 +0.40622 -0.157239 -0.0998548 +-0.113473 -0.237638 -0.035297 +0.466246 0.0338671 -0.115994 +0.164588 -0.236566 -0.0424263 +-0.161868 -0.237534 -0.0422023 +-0.36552 -0.226585 -0.0971964 +-0.0374784 -0.403736 -0.0858926 +-0.258045 -0.237123 -0.0634183 +0.391261 -0.224303 -0.107474 +-0.286536 -0.234426 -0.0710535 +0.207207 -0.219283 -0.0465954 +-0.0243637 -0.22002 -0.024809 +-0.365822 -0.267863 -0.108695 +0.292097 -0.235853 -0.073149 +-0.0462402 -0.247818 -0.0322976 +0.0235362 -0.288982 -0.0429547 +0.253573 -0.371715 -0.106955 +0.0883565 -0.248909 -0.0355117 +-0.331697 -0.275924 -0.0978675 +0.265206 -0.315504 -0.0888892 +0.254748 -0.24386 -0.0642458 +0.132705 -0.235669 -0.0372696 +0.251552 -0.262111 -0.0683246 +0.153894 -0.251029 -0.0443321 +0.121049 -0.250429 -0.0394623 +-0.230335 -0.247513 -0.0588927 +-0.303042 -0.243112 -0.0785543 +0.18594 -0.251359 -0.0501342 +0.14964 -0.426062 -0.107768 +0.105051 0.0929715 -0.00988858 +0.231678 -0.400267 -0.113371 +-0.286218 -0.268173 -0.080129 +-0.416803 -0.23579 -0.122117 +-0.179557 -0.231087 -0.0437792 +-0.0462291 0.08528 -0.00471603 +0.216567 -0.253636 -0.0572554 +-0.0590517 -0.260606 -0.0363624 +-0.21918 -0.0991654 -0.0293681 +0.15695 0.202339 -0.033343 +0.242743 -0.386196 -0.110096 +-0.415804 -0.223981 -0.118558 +-0.411228 -0.140467 -0.0993554 +-0.382481 -0.242813 -0.108512 +-0.459308 -0.0986124 -0.117214 +0.358583 0.0027825 -0.0665064 +-0.0974522 -0.264128 -0.0404484 +-0.202918 -0.258421 -0.0555196 +0.0644446 -0.0359019 -0.00272474 +0.00701249 -0.241086 -0.0295215 +0.349043 -0.28426 -0.107047 +-0.348601 -0.250627 -0.0968593 +0.244172 -0.258542 -0.0653687 +-0.208063 -0.0854565 -0.0256247 +0.209858 -0.427297 -0.120581 +-0.216454 -0.0904051 -0.0279019 +0.32408 -0.145923 -0.0652924 +0.175331 -0.265921 -0.0520837 +-0.238289 -0.110307 -0.0350902 +0.204188 -0.431498 -0.121298 +-0.147332 -0.366263 -0.0812263 +-0.241533 -0.304459 -0.0786061 +-0.0479232 -0.375606 -0.0744604 +0.0342972 -0.275062 -0.0391854 +-0.0590766 -0.346352 -0.0637572 +-0.23055 -0.113751 -0.0336111 +-0.0588367 -0.275386 -0.0404683 +-0.165651 0.0185511 -0.0139901 +-0.356661 -0.0286405 -0.0662051 +-0.254973 -0.266746 -0.0705725 +0.302713 -0.264809 -0.084445 +0.329249 -0.227182 -0.0834939 +0.0477822 -0.464112 -0.115513 +0.201952 -0.185233 -0.0382807 +0.255429 0.0876552 -0.0371539 +-0.193186 0.379608 -0.0952477 +-0.0353101 -0.233955 -0.0283939 +-0.0670757 -0.436121 -0.102615 +-0.193649 -0.276117 -0.0585863 +0.0794327 -0.466231 -0.11891 +-0.202368 -0.123993 -0.0285717 +-0.371015 -0.186329 -0.0902583 +0.402253 -0.118918 -0.0922276 +0.265131 -0.272595 -0.075123 +-0.146404 -0.280656 -0.0514232 +-0.268562 0.0821161 -0.040244 +0.0870331 -0.41825 -0.0958473 +0.257015 0.0392263 -0.0343889 +0.431996 -0.0716248 -0.100973 +0.0657393 -0.403434 -0.0873557 +0.196359 -0.280105 -0.0603276 +-0.00789602 -0.331136 -0.0564501 +-0.400209 -0.26114 -0.121571 +0.0283189 0.14464 -0.0109209 +-0.174895 -0.269605 -0.0530446 +-0.15195 -0.198932 -0.0318382 +0.151996 -0.37885 -0.087109 +-0.193217 -0.415229 -0.111039 +-0.185353 -0.283841 -0.0592138 +0.419952 0.005756 -0.0924718 +0.3014 -0.350041 -0.113079 +-0.16382 -0.288064 -0.0565054 +0.270041 -0.0868353 -0.0410747 +-0.0493191 -0.29046 -0.0443848 +-0.314955 -0.277439 -0.0923486 +-0.26427 -0.114266 -0.042344 +0.372339 -0.127708 -0.0807316 +-0.0980447 -0.391707 -0.0851489 +0.118573 -0.391423 -0.0874602 +-0.476186 -0.0255242 -0.121026 +-0.441258 -0.0814733 -0.106326 +0.00237933 -0.316116 -0.0512825 +0.318866 -0.198372 -0.0731923 +0.254583 -0.287504 -0.0766751 +-0.0222354 -0.29856 -0.0458683 +0.130337 -0.405647 -0.0953107 +-0.149399 -0.296216 -0.0566359 +-0.261265 0.311943 -0.0865272 +0.249629 -0.162758 -0.0454346 +0.18544 -0.294982 -0.0626647 +0.0837039 -0.16746 -0.0176808 +0.0131317 -0.302501 -0.0469415 +-0.112936 -0.195928 -0.0259066 +0.26821 -0.310108 -0.0879164 +0.198765 -0.440613 -0.124584 +0.0568992 -0.247376 -0.0327526 +-0.0588737 -0.303851 -0.0491011 +0.31236 -0.292825 -0.0962939 +-0.147237 -0.323266 -0.0652164 +-0.415509 0.0478753 -0.0916715 +0.0418077 -0.364642 -0.0697912 +0.204357 0.00692817 -0.0211281 +0.306975 -0.0782197 -0.0515023 +0.0236437 -0.154394 -0.0122736 +-0.384582 -0.286044 -0.122347 +0.196124 -0.323051 -0.0741633 +0.375604 -0.247008 -0.106742 +-0.348873 -0.292733 -0.109722 +0.355214 -0.189455 -0.084615 +-0.0515571 0.0743096 -0.00409842 +0.275244 -0.301685 -0.0871871 +0.0978793 -0.405328 -0.0910836 +0.0757383 -0.39097 -0.0827183 +0.206637 -0.308868 -0.0716133 +0.465583 -0.0141583 -0.115109 +-0.383576 0.0821539 -0.0801523 +-0.174574 -0.313066 -0.0664509 +0.105037 -0.393356 -0.0866337 +-0.0694174 -0.317542 -0.0543 +0.228455 -0.147777 -0.0377264 +-0.440316 -0.172794 -0.118941 +-0.108281 -0.320432 -0.0589375 +-0.22263 -0.405114 -0.113254 +-0.213554 -0.31519 -0.0753107 +-0.203583 -0.386359 -0.100399 +0.442762 -0.191201 -0.123984 +-0.000564865 -0.0352824 -0.000622776 +-0.218205 -0.190961 -0.0429625 +-0.286847 -0.310768 -0.0938312 +0.184835 -0.337622 -0.0770441 +0.218016 0.0800936 -0.0273469 +0.249717 -0.317711 -0.0852861 +-0.0798251 -0.154542 -0.0152439 +-0.107513 -0.278009 -0.0454573 +0.458424 -0.0768808 -0.114598 +-0.281141 -0.17267 -0.0559954 +0.124661 -0.401787 -0.0927916 +0.163923 -0.328059 -0.0696742 +-0.23142 -0.375533 -0.102548 +-0.383178 -0.108909 -0.0827688 +-0.366673 -0.310646 -0.123045 +-0.19709 -0.0718652 -0.0222522 +0.278983 0.0243463 -0.0400126 +-0.337315 -0.194212 -0.0788591 +-0.190721 -0.202483 -0.0394658 +0.264033 -0.357925 -0.104357 +0.437978 0.087669 -0.105299 +-0.259366 -0.364475 -0.105636 +0.360002 -0.137056 -0.0771705 +-0.331995 -0.317997 -0.111936 +-0.31984 -0.218178 -0.077991 +0.126215 -0.348406 -0.0711926 +0.432486 -0.162441 -0.113113 +0.0679782 -0.23297 -0.0298949 +-0.00356039 -0.100892 -0.00510896 +-0.108921 -0.144532 -0.0165129 +-0.00609902 -0.285304 -0.0415822 +-0.0911904 -0.168459 -0.0185184 +0.253961 -0.330968 -0.0911744 +-0.426053 0.0340613 -0.0959431 +0.160479 -0.332632 -0.0706979 +-0.00600919 -0.447577 -0.105775 +-0.29229 -0.0951418 -0.0484146 +-0.241412 -0.127909 -0.038044 +-0.29657 -0.22192 -0.071131 +-0.27494 -0.211839 -0.0621662 +-0.259248 -0.278955 -0.0753517 +0.348516 -0.326777 -0.121505 +-0.478262 0.0230818 -0.122086 +0.222908 -0.109426 -0.0313215 +-0.274572 -0.336017 -0.0990544 +-0.185626 -0.325985 -0.0730282 +-0.174221 -0.355302 -0.0816277 +0.311688 -0.335276 -0.110932 +0.195044 -0.365163 -0.0897176 +0.150608 -0.349787 -0.0753563 +-0.00656919 -0.367119 -0.0698492 +-0.277851 0.0198174 -0.0395801 +0.418738 -0.131193 -0.10142 +0.173373 -0.351602 -0.0800446 +0.090454 -0.322525 -0.0577709 +0.201962 -0.0945299 -0.0251793 +0.203807 0.0556026 -0.0225692 +-0.16708 0.0670591 -0.0163398 +0.421561 -0.133528 -0.103085 +-0.0170419 -0.41978 -0.0925341 +0.417517 0.102703 -0.0971537 +0.293611 0.0477537 -0.0452684 +0.00171135 -0.358672 -0.0665378 +-0.136241 -0.355449 -0.075287 +0.38077 0.0609531 -0.0773413 +0.0331572 -0.360728 -0.0679185 +-0.179914 -0.187913 -0.034433 +0.148777 -0.1695 -0.0257643 +0.444525 0.0982445 -0.109638 +0.163792 -0.359734 -0.0814337 +0.168102 -0.357676 -0.0814091 +-0.176826 -0.355497 -0.0822013 +-0.43579 -0.119538 -0.107925 +-0.00093122 -0.364456 -0.06878 +0.0376497 -0.130123 -0.0092172 +-0.279136 0.0684621 -0.0421922 +0.187326 0.0807313 -0.0210253 +-0.218294 -0.346651 -0.0877605 +-0.0195516 -0.114225 -0.00673753 +0.119192 -0.419378 -0.100047 +0.0334714 -0.366636 -0.0702379 +0.189231 -0.0163064 -0.0182028 +0.129766 -0.111393 -0.0147323 +0.140838 -0.393729 -0.0916268 +0.0231566 -0.373414 -0.0726243 +0.139804 -0.434258 -0.110127 +-0.0589125 -0.271866 -0.0394697 +-0.224309 -0.152112 -0.0374267 +0.024996 -0.449928 -0.107285 +0.0457187 -0.127319 -0.00919239 +-0.0272714 -0.391395 -0.0801815 +0.29665 -0.217295 -0.0700636 +-0.0947696 -0.46693 -0.120798 +-0.102027 -0.182255 -0.0220565 +-0.256167 0.0472634 -0.0345237 +0.101251 -0.447269 -0.11135 +0.108083 -0.392499 -0.0866205 +-0.182696 -0.444262 -0.122929 +0.15171 -0.241314 -0.0414848 +0.315904 0.0329704 -0.0517818 +0.226784 -0.00785164 -0.0260866 +-0.0608804 -0.0145315 -0.00196072 +-0.287321 -0.354173 -0.110051 +-0.311747 -0.197706 -0.0706312 +0.343925 -0.160627 -0.0748433 +0.220288 -0.413958 -0.116761 +-0.21809 0.099085 -0.0291144 +0.169667 -0.184939 -0.0320068 +-0.0477682 -0.381684 -0.0769424 +-0.26705 0.0337088 -0.0369072 +-0.0561622 -0.393933 -0.0825783 +0.201934 -0.363076 -0.0903856 +0.172956 0.00842051 -0.0151065 +-0.198856 -0.128206 -0.0283932 +0.173105 -0.3928 -0.0968152 +0.162743 -0.406596 -0.101004 +-0.371664 0.103511 -0.0774214 +-0.104665 -0.382242 -0.0818844 +-0.0791954 -0.464222 -0.117829 +0.392063 0.0596701 -0.0819989 +0.086236 -0.375605 -0.0772409 +0.218651 -0.0719616 -0.0268538 +0.0792181 -0.428198 -0.0997939 +0.0442486 -0.389155 -0.0798911 +0.184399 -0.378972 -0.0931499 +0.368132 0.0755261 -0.073299 +-0.0879236 -0.420382 -0.096923 +-0.390477 -0.0218151 -0.0796457 +-0.213655 -0.138166 -0.0329108 +0.206982 -0.132863 -0.0307189 +-0.136961 -0.394425 -0.0913357 +-0.338209 -0.101967 -0.0644694 +-0.311151 -0.0217528 -0.0498884 +-0.206773 0.113089 -0.0281689 +0.154646 -0.454454 -0.122756 +0.00279544 -0.139757 -0.00981808 +0.0870261 -0.452602 -0.112544 +0.0454527 -0.261442 -0.0358515 +0.0833783 -0.0755666 -0.00635129 +-0.128466 0.0698493 -0.0107489 +-0.338453 0.145039 -0.0702617 +-0.0246512 -0.407201 -0.086994 +0.426492 -0.0324495 -0.0960909 +0.2836 0.189338 -0.0599351 +-0.303737 -0.109779 -0.0535897 +-0.0266512 -0.433824 -0.0993966 +-0.0729601 -0.219853 -0.0271992 +0.247274 -0.113244 -0.0376948 +0.153628 -0.116575 -0.0187719 +0.148014 -0.0779601 -0.0140923 +0.194506 -0.0856298 -0.0228434 +0.356042 0.100039 -0.0709003 +0.11581 -0.0771617 -0.00973026 +0.0857738 -0.160284 -0.0166629 +0.121547 -0.115845 -0.0141976 +0.344092 -0.153985 -0.0737768 +0.390571 -0.0898073 -0.0838184 +-0.355037 -0.209256 -0.0888688 +0.112036 -0.466963 -0.122849 +0.0335473 -0.317931 -0.05248 +0.291875 0.0961131 -0.048385 +-0.0333023 -0.378351 -0.074937 +0.29122 -0.101774 -0.0487728 +0.384007 -0.106091 -0.0827852 +-0.276746 -0.029594 -0.0395128 +0.0789215 -0.413355 -0.0928567 +-0.290773 0.0545873 -0.0447664 +-0.23543 -0.166124 -0.0424117 +0.314674 0.0814461 -0.0543008 +-0.0689543 -0.141309 -0.0124388 +0.161506 0.246255 -0.044346 +-0.0628808 -0.365375 -0.0712658 +0.189777 -0.218256 -0.0427387 +0.227258 -0.30341 -0.0746373 +-0.013327 0.420114 -0.0926265 +-0.0235872 -0.420034 -0.0927984 +0.417732 -0.0949928 -0.0964093 +-0.368942 0.0786621 -0.0738823 +0.18036 -0.170216 -0.0312395 +0.153016 -0.303446 -0.0595181 +-0.425127 -0.0151589 -0.0949932 +-0.207276 -0.17677 -0.0378208 +-0.174374 -0.135988 -0.0247559 +0.370958 0.0744693 -0.074341 +0.111071 0.3739 -0.0792057 +0.23282 -0.395143 -0.111373 +-0.305658 -0.0696294 -0.0504081 +0.190956 -0.0876309 -0.0223208 +-0.165283 -0.38395 -0.0915595 +-0.291884 -0.18742 -0.062089 +0.108596 -0.42844 -0.102979 +-0.468694 0.0855697 -0.120793 +-0.0469006 -0.42932 -0.0980663 +0.446949 0.000884836 -0.105441 +0.224326 -0.292192 -0.0703218 +0.398781 0.070109 -0.0856376 +-0.0735424 0.0964275 -0.00738061 +-0.0394481 -0.087645 -0.00462961 +0.465041 0.0823018 -0.118545 +0.0400593 -0.109253 -0.00679353 +-0.404681 0.0617901 -0.087632 +0.337261 0.0178706 -0.0587584 +0.161116 -0.385213 -0.0913456 +-0.405278 -0.179288 -0.103559 +-0.377026 -0.147737 -0.085656 +-0.113451 -0.40419 -0.0923881 +-0.00298329 0.0975477 -0.00477362 +-0.0829156 -0.381493 -0.0793543 +0.472738 -0.00440596 -0.118808 +0.0266054 -0.146353 -0.0111255 +-0.366823 -0.108107 -0.0760121 +-0.197079 -0.1632 -0.0332912 +-0.118544 -0.158105 -0.0197194 +-0.427891 0.0823045 -0.0999251 +0.399359 -0.0274915 -0.0836178 +0.365907 -0.218299 -0.0953136 +-0.349256 -0.116569 -0.0702518 +-0.302601 0.0891915 -0.0510651 +0.111238 -0.220427 -0.0309603 +-0.29757 -0.147716 -0.0567969 +0.370532 -0.0748619 -0.0742021 +0.0249291 -0.0289788 -0.000730884 +-0.0607628 0.0637964 -0.00388861 +-0.123929 -0.210738 -0.0303449 +-0.342972 -0.154724 -0.0734847 +0.0146831 -0.186641 -0.0176815 +0.070315 -0.37102 -0.0740411 +-0.00164759 -0.20739 -0.0217431 +-0.0135001 -0.206314 -0.0216072 +-0.0595319 -0.234198 -0.0296354 +0.233588 -0.226023 -0.054299 +-0.136802 -0.222117 -0.0346247 +0.307531 -0.169072 -0.063603 +-0.19277 0.361058 -0.0875982 +0.244705 -0.124951 -0.0384873 +0.350545 -0.206146 -0.0864234 +0.281993 -0.206752 -0.0631257 +-0.162789 -0.213668 -0.0367525 +-0.205039 0.0157722 -0.0213732 +0.0259176 0.425218 -0.0952803 +0.223116 -0.200263 -0.0460011 +0.0891076 -0.114241 -0.0105512 +0.265879 -0.139562 -0.0461495 +0.116002 -0.168495 -0.0211471 +0.447477 -0.138727 -0.11653 +-0.184625 -0.22452 -0.04318 +-0.283871 -0.156102 -0.0539294 +0.243567 -0.157686 -0.0430201 +-0.251444 -0.14062 -0.0423979 +-0.393903 0.0754217 -0.0839474 +-0.0915762 -0.0775956 -0.00722978 +-0.244569 -0.115527 -0.037275 +-0.417785 -0.102611 -0.097267 +0.00629455 -0.11032 -0.00612384 +-0.0747675 -0.102651 -0.00809648 +-0.2062 0.0642406 -0.0236012 +-0.439038 0.0680873 -0.104115 +0.157257 -0.0156055 -0.0125655 +0.18862 0.03225 -0.0184796 +0.39999 0.0211202 -0.0837241 +-0.291938 0.103383 -0.0491666 diff --git a/image_analysis/indexing/fast-feedback-indexer/data/image1_local.txt b/image_analysis/indexing/fast-feedback-indexer/data/image1_local.txt new file mode 100644 index 000000000..11485fe37 --- /dev/null +++ b/image_analysis/indexing/fast-feedback-indexer/data/image1_local.txt @@ -0,0 +1,299 @@ +36.9 0 0 4.83429e-15 78.95 0 4.83429e-15 4.83429e-15 78.95 +-0.390454 -0.0216732 -0.0796325 +0.0972535 -0.405491 -0.0910891 +-0.476076 -0.0253842 -0.120962 +-0.382763 -0.242786 -0.108626 +-0.168761 0.341205 -0.0752844 +-0.0690323 -0.31778 -0.0543518 +-0.167022 0.0671112 -0.0163335 +0.0157518 -0.46253 -0.113536 +-0.402311 0.168995 -0.10023 +0.248591 -0.0721977 -0.034086 +-0.196964 -0.0717995 -0.0222219 +-0.334855 -0.0692263 -0.0602766 +0.432221 -0.0713898 -0.101063 +0.370926 -0.0749761 -0.074369 +0.307096 -0.0781273 -0.0515338 +0.119492 -0.301137 -0.0539353 +0.458586 -0.0765549 -0.114653 +0.21631 -0.337495 -0.0838629 +0.0493293 -0.43948 -0.103103 +0.264034 -0.357522 -0.104197 +-0.279045 0.068668 -0.0421803 +-0.277863 0.0199977 -0.0395873 +-0.191764 0.136591 -0.0281103 +-0.0747482 -0.102515 -0.00808094 +0.417799 -0.0948751 -0.0964276 +-0.393547 0.0756299 -0.0838118 +-0.214074 -0.357892 -0.0911074 +-0.22606 0.369172 -0.0985518 +0.442926 -0.0997906 -0.109012 +-0.208038 -0.0854168 -0.025616 +-0.417979 -0.102541 -0.097349 +0.24426 -0.12473 -0.0383455 +0.0471818 -0.464758 -0.11582 +0.195176 -0.364984 -0.0896741 +-0.382795 -0.108422 -0.0825509 +-0.0425608 0.369425 -0.0717147 +0.308725 0.232782 -0.0777737 +0.172842 0.00848231 -0.015087 +-0.213891 -0.137976 -0.0329357 +-0.416839 -0.235579 -0.122078 +-0.468579 0.0857271 -0.120748 +0.0882157 0.132799 -0.0127906 +0.360023 -0.136893 -0.0771543 +-0.182748 -0.443741 -0.122676 +0.421534 -0.133493 -0.103067 +-0.213445 -0.314712 -0.0751229 +-0.379761 -0.140505 -0.0856478 +0.228489 -0.147813 -0.0377401 +-0.478023 0.023169 -0.121958 +0.270093 -0.0866972 -0.0410769 +-0.314706 -0.300261 -0.0995538 +-0.342848 -0.154318 -0.073371 +0.0282958 0.145042 -0.0109792 +-0.123151 -0.429937 -0.105579 +-0.091192 -0.168241 -0.0184813 +0.344116 -0.160521 -0.0748963 +0.406078 -0.156929 -0.0997366 +-0.33849 -0.101769 -0.0645496 +-0.388307 -0.1629 -0.0929824 +0.370697 0.0756403 -0.0743315 +-0.411311 -0.140373 -0.0993788 +0.23687 0.273177 -0.0676553 +-0.207211 -0.176766 -0.037806 +0.265314 -0.315776 -0.0890146 +0.237935 -0.177096 -0.0450007 +-0.102281 -0.182192 -0.0220712 +0.115971 -0.168566 -0.0211556 +0.152668 0.225557 -0.0378064 +0.202123 -0.185125 -0.0382957 +0.4623 -0.115177 -0.120789 +0.249692 -0.162648 -0.0454322 +-0.440306 -0.172629 -0.118904 +-0.147258 -0.365375 -0.0808611 +-0.29207 -0.187114 -0.0620854 +0.156271 0.301089 -0.0592956 +0.432639 -0.162292 -0.11316 +-0.193917 -0.415539 -0.111336 +0.0328947 0.379833 -0.0755299 +-0.370914 -0.186224 -0.090196 +0.278424 0.291703 -0.0849102 +-0.384022 0.251057 -0.111463 +-0.190689 -0.201957 -0.0393487 +-0.337344 -0.193916 -0.0788075 +0.200448 0.183557 -0.0376449 +-0.435348 -0.119246 -0.10767 +0.16226 -0.406448 -0.100849 +-0.124118 -0.210568 -0.0303319 +-0.365406 -0.226423 -0.0971096 +0.111196 -0.220322 -0.0309316 +0.401138 -0.209386 -0.108235 +-0.319826 -0.218144 -0.0779781 +-0.296645 -0.222291 -0.0712436 +-0.0651848 0.39096 -0.0819036 +0.033918 -0.275274 -0.0392328 +-0.280261 0.343553 -0.10366 +0.472719 -0.00396542 -0.118796 +-0.136962 -0.394272 -0.0912697 +0.426857 -0.214214 -0.121419 +-0.0460939 0.0853968 -0.00471977 +-0.0979117 -0.238338 -0.0337659 +-0.400132 -0.218872 -0.110062 +-0.405985 0.110235 -0.092793 +-0.067694 -0.436053 -0.102629 +0.0563342 -0.247335 -0.0327089 +0.143087 -0.221612 -0.0354202 +0.254889 -0.243809 -0.0642709 +-0.230895 -0.247226 -0.0589545 +0.417638 0.102915 -0.0972339 +-0.441078 -0.0811014 -0.106203 +-0.180383 -0.187724 -0.0344838 +-0.42572 0.0342249 -0.0957924 +-0.230473 -0.113486 -0.0335617 +-0.460131 0.0354857 -0.112858 +-0.295673 0.319268 -0.0996415 +-0.059592 -0.346492 -0.0638419 +0.342432 0.295533 -0.108148 +-0.303176 -0.24308 -0.07859 +0.242657 -0.386489 -0.1102 +0.311201 0.16745 -0.0645247 +-0.318845 0.227113 -0.0798056 +0.301025 -0.350094 -0.112972 +0.0888209 0.358177 -0.0705808 +-0.34835 -0.249639 -0.0964888 +0.195933 -0.323441 -0.074259 +0.230013 0.190246 -0.0455889 +-0.377495 -0.147192 -0.0857617 +-0.206442 0.402884 -0.108335 +-0.17545 -0.269468 -0.0531082 +-0.107631 -0.423627 -0.10058 +-0.331778 -0.31715 -0.111552 +-0.366258 -0.267675 -0.108818 +0.402407 -0.252542 -0.120062 +-0.371639 0.103676 -0.07743 +-0.0137349 0.422268 -0.093633 +-0.107569 -0.277254 -0.045244 +-0.213204 -0.272491 -0.0617609 +0.466205 0.0343275 -0.11599 +-0.146262 -0.280243 -0.0512791 +0.349554 -0.284216 -0.107233 +-0.401413 -0.26107 -0.122099 +0.065309 -0.40401 -0.0875796 +0.198969 -0.441013 -0.124832 +0.349069 -0.326852 -0.121753 +0.385731 0.0410156 -0.0783009 +0.231235 -0.40036 -0.113297 +0.426577 -0.0325392 -0.0961345 +-0.0268601 -0.432823 -0.0989211 +0.086973 -0.41796 -0.0957073 +-0.0175661 -0.420027 -0.0926583 +0.00272667 -0.139444 -0.00977383 +0.119213 -0.419212 -0.0999727 +0.173198 -0.392439 -0.0966762 +-0.0626383 0.335882 -0.0601809 +0.465431 -0.0141595 -0.115029 +-0.197222 -0.162637 -0.0332256 +-0.25807 -0.236357 -0.0632315 +-0.294721 0.383293 -0.124657 +-0.199927 -0.29069 -0.0643032 +-0.21899 0.358461 -0.092504 +-0.00917205 -0.315645 -0.051167 +-0.0553658 0.473927 -0.121178 +0.255135 0.248003 -0.0654407 +-0.284951 0.220377 -0.0671349 +0.00208153 -0.315603 -0.0511111 +0.444427 0.0982113 -0.109585 +0.375984 -0.246894 -0.106871 +-0.281587 -0.172361 -0.0560719 +-0.260297 0.244418 -0.06592 +0.378607 -0.277401 -0.116991 +0.242805 0.283962 -0.0724163 +-0.311327 0.182645 -0.067414 +0.419933 0.160776 -0.106799 +-0.0949509 -0.466943 -0.120825 +-0.0351785 -0.233388 -0.0282529 +-0.14769 -0.323166 -0.0652532 +-0.0809748 -0.222766 -0.0284968 +0.383248 0.220921 -0.103164 +0.0438904 -0.389218 -0.0799006 +-0.242128 -0.347006 -0.0939309 +0.111955 -0.467658 -0.123209 +-0.274579 -0.211232 -0.0619237 +0.464936 0.0825775 -0.118515 +-0.241282 -0.303472 -0.0782152 +0.292283 -0.23605 -0.0732577 +-0.349109 -0.116074 -0.0701346 +0.382695 0.200693 -0.098187 +-0.325867 0.110346 -0.061046 +-0.34928 -0.334985 -0.124906 +0.419993 0.00609193 -0.0924933 +0.0227935 -0.373885 -0.0728052 +-0.338784 0.258099 -0.095229 +-0.0592232 -0.303906 -0.0491405 +-0.14248 -0.377049 -0.0848316 +0.00704985 0.472633 -0.118769 +0.0607224 0.368888 -0.0725116 +0.27887 0.0244804 -0.0399832 +0.313012 -0.292955 -0.0965617 +0.0525929 0.418325 -0.0932264 +-0.286837 -0.310463 -0.0937231 +-0.153021 0.139138 -0.0216211 +-0.260114 -0.364717 -0.105952 +0.366026 -0.218224 -0.0953436 +0.385258 -0.275436 -0.119255 +-0.083184 0.302202 -0.0503926 +0.10324 -0.312554 -0.0557272 +-0.10886 -0.32036 -0.0589798 +0.156298 0.188567 -0.030457 +-0.203812 -0.386248 -0.100404 +-0.0843846 0.420499 -0.0966399 +0.13252 -0.236069 -0.0373423 +-0.311771 0.295841 -0.0970733 +-0.0697432 0.361115 -0.0700904 +0.39888 0.0701771 -0.0856861 +-0.348926 -0.292477 -0.109659 +0.27619 0.346126 -0.103386 +-0.404655 0.0618063 -0.0876214 +0.354889 0.261141 -0.102303 +-0.438955 0.0680903 -0.104075 +-0.30268 0.089354 -0.0511056 +-0.409738 0.213499 -0.113133 +-0.133617 -0.375166 -0.0827231 +-0.346387 0.189755 -0.0813002 +0.0336233 -0.402055 -0.0850019 +0.175154 -0.265978 -0.0520672 +-0.188475 0.195014 -0.0374789 +0.329195 0.329366 -0.115043 +-0.357318 0.288681 -0.111751 +-0.413638 0.155009 -0.102851 +-0.235028 0.237092 -0.057371 +-0.211961 0.215981 -0.046887 +0.447123 0.000894472 -0.105528 +-0.098107 -0.391246 -0.0849581 +0.0755639 -0.391575 -0.0829619 +-0.331723 -0.275036 -0.097606 +0.396471 0.117698 -0.0895287 +0.296746 0.26741 -0.083248 +-0.204502 -0.349807 -0.0857712 +0.336844 0.284995 -0.102607 +0.184557 -0.378737 -0.093084 +0.257031 0.0393747 -0.0343992 +-0.395041 0.124182 -0.0897682 +-0.26928 0.243515 -0.0682337 +0.334281 0.114724 -0.0645349 +-0.206248 0.0642292 -0.0236105 +-0.314168 0.350684 -0.117776 +-0.29262 0.265115 -0.0812574 +-0.268376 0.0822078 -0.0401999 +0.275289 -0.301681 -0.0871993 +0.13007 -0.4064 -0.09561 +-0.185634 -0.325864 -0.0729874 +0.0302828 -0.321755 -0.0536615 +0.190108 0.36376 -0.0881133 +-0.292144 0.10331 -0.0492219 +-0.149607 0.197834 -0.0312486 +-0.226348 -0.0129537 -0.0260397 +-0.106513 0.323045 -0.0596294 +0.267485 0.214666 -0.0606542 +0.120765 0.356531 -0.0735543 +-0.100786 0.352596 -0.0696677 +-0.109069 0.377401 -0.0803957 +0.123805 0.302283 -0.0548558 +0.375465 0.0283915 -0.0735984 +0.270247 0.335886 -0.097699 +-0.421842 0.199867 -0.115634 +0.179835 0.11142 -0.0226337 +-0.415352 0.0479809 -0.0916056 +0.195301 0.374267 -0.0934781 +0.0097558 0.401401 -0.0841497 +-0.0672502 0.21343 -0.025359 +0.356104 0.100157 -0.0709369 +0.251796 0.0746328 -0.0351018 +0.40505 0.186373 -0.104902 +0.0639419 0.314663 -0.0529528 +-0.417022 0.0965533 -0.0962466 +0.12233 0.42076 -0.101114 +-0.207282 0.113375 -0.0283107 +-0.354015 0.234324 -0.0945909 +-0.359922 0.117409 -0.0744345 +0.359246 0.158375 -0.0802935 +0.318187 0.140242 -0.0624023 +0.295089 0.154631 -0.0571257 +0.336658 0.172877 -0.0743785 +-0.365204 0.220308 -0.0955165 +-0.227419 0.192622 -0.0454439 +-0.219549 0.260659 -0.0598643 +-0.277305 0.28884 -0.0836631 +-0.226991 0.306206 -0.0754932 +0.212897 0.230267 -0.0504465 +0.249262 0.238669 -0.0614341 +-0.203911 0.284232 -0.0631796 +0.200296 0.264886 -0.0567519 +0.284374 0.302424 -0.0902357 +-0.261653 0.312571 -0.0868531 +0.281017 0.356962 -0.109154 +-0.12812 0.408221 -0.0961521 +-0.244309 0.400758 -0.11699 +0.0429895 0.464717 -0.115585 +0.168074 0.450906 -0.123396 diff --git a/image_analysis/indexing/fast-feedback-indexer/data/image1_peakfinder8.txt b/image_analysis/indexing/fast-feedback-indexer/data/image1_peakfinder8.txt new file mode 100644 index 000000000..13a27a3eb --- /dev/null +++ b/image_analysis/indexing/fast-feedback-indexer/data/image1_peakfinder8.txt @@ -0,0 +1,851 @@ +36.9 0 0 4.83429e-15 78.95 0 4.83429e-15 4.83429e-15 78.95 +0.229677 -0.72271 -0.348127 +0.203368 -0.717616 -0.333915 +0.0701225 -0.722814 -0.312524 +0.177245 -0.712114 -0.320678 +-0.28504 -0.683209 -0.327707 +0.194344 -0.693988 -0.306739 +-0.00904474 -0.701932 -0.287813 +-0.100905 -0.689186 -0.282476 +-0.0239649 -0.682798 -0.269786 +-0.276401 -0.643011 -0.285759 +-0.0769707 -0.666888 -0.258828 +0.171428 -0.65274 -0.262068 +-0.137267 -0.655617 -0.257488 +0.214463 -0.640052 -0.262207 +-0.512505 -0.556446 -0.346007 +0.0815132 -0.645355 -0.240479 +0.0491451 -0.644261 -0.236775 +0.269184 -0.614409 -0.258352 +-0.245934 -0.616814 -0.252299 +-0.0747956 -0.630616 -0.227518 +-0.134645 -0.618928 -0.226179 +-0.2224 -0.595517 -0.228055 +-0.156202 -0.604282 -0.218691 +-0.0191222 -0.609569 -0.207497 +0.370109 -0.5651 -0.262652 +-0.177392 -0.588906 -0.211507 +0.381904 -0.551933 -0.258704 +-0.00187561 -0.591664 -0.193817 +0.282459 -0.563742 -0.223848 +-0.299189 -0.558292 -0.226181 +0.112149 -0.577454 -0.191316 +-0.36255 -0.54155 -0.241527 +0.0800339 -0.576905 -0.187119 +0.04759 -0.574862 -0.183134 +0.198037 -0.553588 -0.191099 +-0.0759961 -0.561562 -0.176063 +-0.275466 -0.536708 -0.202465 +-0.474387 -0.490979 -0.269318 +0.140456 -0.545962 -0.174047 +-0.0972982 -0.546772 -0.168391 +-0.433691 -0.493978 -0.24641 +-0.0577648 -0.543882 -0.162829 +0.183587 -0.533261 -0.174211 +0.0117295 -0.5414 -0.159317 +0.436664 -0.483126 -0.241111 +-0.263051 -0.486195 -0.166682 +-0.49627 -0.433105 -0.247579 +-0.290611 -0.475372 -0.169598 +-0.0125628 -0.494022 -0.130641 +-0.151862 -0.488142 -0.140549 +-0.217679 -0.479385 -0.14982 +-0.318321 -0.464194 -0.173443 +0.234389 -0.473974 -0.15123 +0.443609 -0.435952 -0.216957 +0.101441 -0.479544 -0.128365 +0.0692663 -0.47832 -0.12455 +-0.133576 -0.469701 -0.127338 +0.144496 -0.467473 -0.127882 +-0.0949481 -0.466993 -0.120851 +0.047368 -0.464721 -0.115811 +0.495424 -0.403544 -0.230775 +0.187657 -0.454055 -0.129012 +0.0157518 -0.46253 -0.113536 +0.257029 -0.446938 -0.143155 +0.429806 -0.417428 -0.199362 +-0.18276 -0.443862 -0.12274 +0.198871 -0.441099 -0.124853 +0.26798 -0.433244 -0.139485 +0.438892 -0.402944 -0.196875 +-0.00551309 -0.447497 -0.105731 +0.481984 -0.385248 -0.21306 +0.583842 -0.357503 -0.271083 +-0.0675066 -0.435846 -0.102514 +0.278834 -0.419265 -0.136016 +-0.0268656 -0.432838 -0.0989285 +-0.373823 -0.399885 -0.163132 +-0.44188 -0.385318 -0.189894 +-0.126426 -0.422875 -0.102674 +-0.193852 -0.415609 -0.111355 +0.289271 -0.405131 -0.13271 +-0.0877209 -0.420494 -0.0969553 +0.119271 -0.419148 -0.0999501 +0.0870861 -0.41807 -0.0957691 +0.326454 -0.397528 -0.142446 +-0.0176784 -0.420037 -0.0926654 +0.363459 -0.388626 -0.15332 +0.467277 -0.366421 -0.195396 +-0.501098 -0.357951 -0.212109 +0.398832 -0.37909 -0.165001 +0.162296 -0.406486 -0.100873 +0.231412 -0.40041 -0.113366 +-0.321771 -0.388604 -0.136605 +0.130149 -0.406367 -0.095607 +0.299794 -0.391278 -0.129928 +0.0972732 -0.405623 -0.0911504 +0.336969 -0.382853 -0.13984 +0.06531 -0.404094 -0.0876172 +0.373255 -0.374052 -0.151021 +0.0336361 -0.402243 -0.0850852 +-0.137026 -0.394324 -0.0913018 +0.173266 -0.392558 -0.0967406 +0.242657 -0.386489 -0.1102 +-0.203847 -0.38647 -0.100507 +-0.0982341 -0.391535 -0.0850955 +0.075564 -0.391575 -0.0829619 +0.0441018 -0.389274 -0.0799342 +0.451617 -0.347244 -0.178134 +0.0122765 -0.387524 -0.0782221 +0.184492 -0.378886 -0.0931327 +-0.366714 -0.352869 -0.139184 +-0.401007 -0.346015 -0.151786 +0.426547 -0.342612 -0.162937 +-0.260114 -0.364717 -0.105952 +0.493549 -0.328881 -0.194862 +-0.0479838 -0.375456 -0.0744027 +-0.434765 -0.338424 -0.165465 +0.022772 -0.374053 -0.0728724 +0.195192 -0.36502 -0.089692 +-0.0568375 -0.372108 -0.0735523 +0.26407 -0.357573 -0.104228 +-0.147355 -0.365516 -0.0809328 +-0.287145 -0.353176 -0.109599 +0.301072 -0.35021 -0.113034 +-0.214074 -0.357892 -0.0911074 +0.435812 -0.32797 -0.161845 +0.0321766 -0.360729 -0.0678844 +-0.177123 -0.354955 -0.0820488 +-0.349261 -0.335107 -0.124946 +0.00187906 -0.358748 -0.0665673 +-0.242043 -0.347169 -0.0939708 +0.374785 -0.332565 -0.134589 +-0.492634 -0.31106 -0.187255 +0.274718 -0.343859 -0.102063 +-0.384648 -0.328574 -0.137397 +0.410458 -0.32294 -0.14722 +0.312127 -0.335381 -0.111127 +0.477875 -0.309907 -0.178055 +-0.632327 -0.270878 -0.274199 +-0.270422 -0.336129 -0.0978419 +-0.0596305 -0.346753 -0.0639408 +0.348987 -0.326777 -0.121692 +-0.0484773 -0.346601 -0.0632408 +0.579934 -0.282151 -0.235757 +0.384583 -0.317757 -0.133324 +0.54967 -0.286877 -0.215421 +0.518044 -0.291224 -0.195749 +-0.0151002 -0.338988 -0.0593304 +-0.331876 -0.317345 -0.111659 +0.0654551 -0.333577 -0.0595522 +-0.185738 -0.325936 -0.0730333 +-0.43527 -0.296571 -0.149949 +-0.0480774 -0.330178 -0.0573066 +0.0153831 -0.330311 -0.0562533 +0.195963 -0.323513 -0.0742907 +-0.00979316 -0.329109 -0.0557587 +-0.147804 -0.323431 -0.0653629 +0.265264 -0.315839 -0.0890222 +-0.287275 -0.310784 -0.0939719 +-0.213531 -0.314701 -0.075139 +-0.0394509 -0.323385 -0.0545553 +-0.108558 -0.320396 -0.0589571 +0.0302828 -0.321755 -0.0536615 +0.595043 -0.258532 -0.239024 +-0.0692197 -0.31778 -0.0543656 +0.565384 -0.263214 -0.218297 +0.00215972 -0.31569 -0.0511401 +0.436722 -0.285534 -0.146921 +0.534229 -0.267922 -0.198241 +-0.314611 -0.300156 -0.0994855 +0.206655 -0.308739 -0.0715744 +-0.241412 -0.303677 -0.0783163 +-0.000949345 -0.314233 -0.0506547 +0.103241 -0.312554 -0.0557272 +-0.349045 -0.292595 -0.109744 +0.275385 -0.301562 -0.0871893 +0.312894 -0.292926 -0.0965114 +0.411313 -0.280583 -0.132766 +-0.451576 -0.271332 -0.150025 +-0.0591643 -0.303963 -0.0491551 +0.349531 -0.284287 -0.107246 +-0.16389 -0.299533 -0.0600956 +0.0126239 -0.302719 -0.0470036 +0.119635 -0.300899 -0.053878 +0.378607 -0.277401 -0.116991 +0.385258 -0.275436 -0.119255 +-0.199927 -0.29069 -0.0643032 +0.45391 -0.26262 -0.148532 +-0.556332 -0.244337 -0.205775 +-0.331685 -0.275034 -0.0975915 +0.549945 -0.244416 -0.201363 +-0.185233 -0.283551 -0.0591029 +0.0232592 -0.289026 -0.0429613 +-0.366098 -0.267662 -0.108748 +0.00166203 -0.287606 -0.0422526 +-0.114847 -0.284891 -0.048345 +-0.00701457 -0.286916 -0.0420698 +0.196601 -0.280194 -0.0604045 +-0.146367 -0.280298 -0.0513115 +0.428069 -0.257652 -0.13376 +0.265325 -0.272577 -0.0751735 +-0.434221 -0.253586 -0.135623 +-0.286079 -0.267755 -0.079964 +-0.213406 -0.273251 -0.0620278 +-0.107514 -0.277393 -0.0452782 +0.495027 -0.244003 -0.166087 +-0.175898 -0.269739 -0.0532683 +-0.0681037 -0.274377 -0.0407924 +0.0341448 -0.27501 -0.039165 +-0.578896 -0.223081 -0.215708 +-0.2415 -0.261649 -0.0655389 +0.175154 -0.265978 -0.0520672 +0.594421 -0.216159 -0.225443 +0.197401 -0.262572 -0.0554956 +-0.348441 -0.249876 -0.0965896 +0.375992 -0.246907 -0.106878 +0.564588 -0.220711 -0.204684 +-0.0587014 -0.265516 -0.0376823 +-0.0974351 -0.264055 -0.0404266 +-0.203217 -0.258299 -0.0555506 +-0.382837 -0.242802 -0.108662 +0.312246 -0.250018 -0.0834885 +-0.058775 -0.261086 -0.0364754 +-0.416809 -0.235619 -0.122074 +-0.491487 -0.225441 -0.1588 +-0.451475 -0.23035 -0.137962 +-0.230685 -0.247444 -0.0589603 +0.185871 -0.251358 -0.0501203 +-0.303259 -0.243098 -0.0786219 +0.116859 -0.253467 -0.0397404 +0.477466 -0.224842 -0.150605 +-0.0198387 -0.254975 -0.033256 +0.153612 -0.250963 -0.0442694 +0.254933 -0.243792 -0.0642787 +-0.0463787 -0.247572 -0.0322413 +0.0564521 -0.247401 -0.0327327 +-0.25799 -0.236511 -0.0632482 +0.292089 -0.236106 -0.0732108 +-0.0798692 -0.243869 -0.0334862 +-0.365428 -0.226126 -0.0970439 +0.579463 -0.197319 -0.209248 +-0.400168 -0.218783 -0.110056 +0.164691 -0.236297 -0.0423777 +-0.515271 -0.204805 -0.167803 +-0.0979117 -0.238338 -0.0337659 +-0.167687 -0.235055 -0.0425919 +0.132534 -0.235935 -0.0373115 +0.224358 -0.2313 -0.0533409 +-0.232806 -0.22964 -0.054978 +0.100115 -0.23511 -0.033201 +0.426857 -0.214214 -0.121419 +-0.0353004 -0.233482 -0.0282797 +0.067938 -0.232923 -0.0298807 +0.239824 -0.227365 -0.0561835 +0.366097 -0.218279 -0.0953857 +-0.296479 -0.222329 -0.0711996 +0.643892 -0.178148 -0.255913 +-0.319953 -0.218183 -0.0780311 +0.525534 -0.196682 -0.172274 +0.0275674 -0.229296 -0.0270337 +0.401144 -0.209518 -0.108268 +0.00256234 -0.227893 -0.0263172 +-0.134942 -0.224282 -0.0348636 +0.124602 -0.223351 -0.0332588 +-0.0500858 -0.224151 -0.0267334 +0.155924 -0.222029 -0.0375081 +0.143175 -0.221515 -0.035411 +0.111184 -0.22032 -0.0309297 +0.4682 -0.196091 -0.13841 +-0.274752 -0.211303 -0.0619902 +-0.20197 -0.215371 -0.0445822 +-0.0243971 -0.219576 -0.0247098 +0.0732804 -0.218971 -0.0270243 +-0.538256 -0.183775 -0.177499 +0.0691174 -0.218061 -0.0265153 +-0.1628 -0.213363 -0.0366868 +0.282102 -0.206923 -0.0631963 +-0.49831 -0.187092 -0.153428 +-0.274184 -0.206911 -0.0608454 +-0.456985 -0.189814 -0.131015 +0.442994 -0.191073 -0.124074 +-0.124028 -0.210519 -0.03031 +0.685761 -0.153893 -0.288629 +0.31883 -0.198377 -0.0731807 +0.223263 -0.200113 -0.0460041 +-0.190661 -0.201964 -0.0393445 +-0.3373 -0.193726 -0.0787514 +-0.0135577 -0.206134 -0.0215702 +0.539817 -0.173242 -0.176237 +0.570879 -0.168737 -0.196492 +0.60026 -0.164028 -0.217196 +0.35551 -0.18941 -0.0847205 +-0.370968 -0.186167 -0.0902063 +-0.112999 -0.196147 -0.025958 +0.483401 -0.172455 -0.141756 +-0.291966 -0.18708 -0.0620464 +-0.195003 -0.190192 -0.0378145 +-0.167313 -0.191491 -0.0328716 +-0.480975 -0.169282 -0.139763 +-0.440252 -0.172844 -0.11892 +-0.180244 -0.187766 -0.0344659 +0.202039 -0.185056 -0.038265 +0.45856 -0.167636 -0.127291 +0.169633 -0.184751 -0.0319651 +-0.247078 -0.178687 -0.0476221 +-0.102281 -0.182192 -0.0220712 +-0.207292 -0.176765 -0.0378233 +0.237935 -0.177096 -0.0450007 +-0.591321 -0.145994 -0.206889 +0.432661 -0.162337 -0.113179 +-0.281799 -0.172404 -0.0561428 +0.213441 -0.173381 -0.0385522 +0.307598 -0.169023 -0.0636162 +-0.388307 -0.1629 -0.0929824 +0.180626 -0.170362 -0.0313149 +-0.543811 -0.144663 -0.173355 +-0.504255 -0.148314 -0.149277 +-0.235599 -0.166535 -0.0425246 +0.148712 -0.169604 -0.0257724 +0.406233 -0.156903 -0.0998024 +0.249717 -0.162705 -0.0454486 +0.344102 -0.160484 -0.0748843 +-0.462545 -0.150915 -0.126343 +0.115932 -0.168628 -0.0211618 +0.5307 -0.144482 -0.164846 +-0.196564 -0.163207 -0.0331877 +-0.091192 -0.168241 -0.0184813 +-0.342846 -0.154435 -0.0733897 +0.473387 -0.143846 -0.13097 +-0.3775 -0.147386 -0.085795 +-0.251801 -0.1538 -0.0445201 +-0.118665 -0.157784 -0.0196824 +0.288072 -0.1516 -0.0544675 +-0.224167 -0.151811 -0.037346 +-0.0801307 -0.154617 -0.0152804 +-0.411322 -0.140384 -0.0993855 +-0.29752 -0.147579 -0.0567596 +0.447736 -0.138628 -0.116646 +0.228552 -0.147765 -0.0377476 +-0.526618 -0.12719 -0.159467 +0.182788 -0.145841 -0.0277248 +0.421609 -0.13342 -0.103092 +0.360129 -0.136972 -0.0772077 +-0.252482 -0.139386 -0.0424904 +-0.213646 -0.138121 -0.0329023 +-0.0690828 -0.141178 -0.0124291 +0.00265977 -0.13949 -0.00978011 +0.207053 -0.132791 -0.0307242 +-0.207436 -0.131828 -0.0306746 +-0.435348 -0.119246 -0.10767 +-0.241484 -0.128044 -0.0380799 +0.4623 -0.115177 -0.120789 +0.244084 -0.124404 -0.0382586 +0.61138 -0.101711 -0.215226 +-0.202063 -0.124281 -0.028545 +0.0452933 -0.1276 -0.00920899 +0.639344 -0.0975059 -0.237287 +-0.349146 -0.116194 -0.0701633 +0.375789 -0.113311 -0.0802482 +-0.633735 -0.094435 -0.232236 +-0.382945 -0.108592 -0.0826338 +0.153689 -0.116581 -0.0187822 +-0.230498 -0.113481 -0.033567 +0.313949 -0.110983 -0.057069 +-0.303848 -0.109619 -0.0536068 +0.0891563 -0.114286 -0.0105609 +-0.417979 -0.102541 -0.097349 +-0.263606 -0.10926 -0.0415773 +-0.0608561 -0.111049 -0.00805005 +0.22303 -0.10936 -0.0313422 +-0.338326 -0.101729 -0.0644858 +0.291254 -0.101737 -0.0487793 +-0.218942 -0.0991002 -0.0293077 +0.417799 -0.0948751 -0.0964276 +-0.0747482 -0.102515 -0.00808094 +-0.00384499 -0.100921 -0.00511303 +0.508679 -0.0870309 -0.143454 +-0.292411 -0.0950913 -0.0484468 +0.327992 -0.0931801 -0.0599261 +0.390744 -0.0897852 -0.0838897 +0.540717 -0.0821221 -0.162813 +-0.213228 -0.093363 -0.0274686 +0.201928 -0.0944675 -0.0251661 +0.483975 -0.0818967 -0.128759 +-0.441213 -0.0812053 -0.106279 +0.270127 -0.0867751 -0.0410937 +-0.482076 -0.077626 -0.127316 +-0.208118 -0.0854318 -0.0256345 +0.458558 -0.076569 -0.11464 +0.307058 -0.07815 -0.0515233 +0.370885 -0.0749258 -0.0743485 +0.148102 -0.0780008 -0.0141087 +0.432126 -0.0714055 -0.101018 +-0.645587 -0.0597561 -0.238655 +-0.0916265 -0.0774544 -0.00722339 +0.115761 -0.077113 -0.00972071 +0.0834258 -0.0755863 -0.00635677 +0.0587303 -0.0753207 -0.00457168 +0.248683 -0.072034 -0.0340973 +-0.334601 -0.0695099 -0.0602072 +-0.310284 -0.0695031 -0.0519002 +-0.197007 -0.0718084 -0.0222313 +-0.269788 -0.0701066 -0.0396359 +-0.321716 -0.034064 -0.0537767 +0.426466 -0.0323579 -0.0960753 +-0.107263 -0.0344295 -0.00636561 +0.098138 -0.0324916 -0.00535774 +-0.35662 -0.0286432 -0.0661897 +-0.276842 -0.0294923 -0.0395372 +-0.0519065 -0.0299461 -0.00179714 +0.21883 -0.0295674 -0.024685 +-0.476229 -0.0253556 -0.121044 +0.399263 -0.0274927 -0.0835757 +-0.51676 -0.0222918 -0.14416 +0.547832 -0.020161 -0.163654 +-0.390656 -0.0216478 -0.0797177 +-0.311179 -0.0216474 -0.0498953 +0.491572 -0.0193419 -0.129378 +-0.0512556 -0.0199697 -0.00151411 +0.523806 -0.014892 -0.148293 +0.157279 -0.0156257 -0.0125694 +0.465431 -0.0141595 -0.115029 +-0.226348 -0.0129537 -0.0260397 +0.226452 -0.00807333 -0.0260112 +0.472822 -0.00400777 -0.118851 +0.447086 0.000994509 -0.10551 +0.358568 0.00281543 -0.0665008 +0.204402 0.00692983 -0.0211375 +0.419934 0.0060215 -0.0924652 +0.17281 0.00855648 -0.015082 +0.25587 0.00796672 -0.0333216 +-0.62268 0.0104294 -0.217593 +-0.576648 0.0112013 -0.183084 +-0.529931 0.0118714 -0.152042 +-0.204916 0.0156585 -0.0213458 +-0.165633 0.0185813 -0.0139876 +0.337297 0.0178784 -0.0587714 +-0.277817 0.0199287 -0.0395728 +0.0721465 0.0202927 -0.00281241 +0.399949 0.021245 -0.083709 +0.278724 0.0244282 -0.0399396 +-0.478023 0.023169 -0.121958 +-0.658601 0.0233161 -0.247869 +-0.267171 0.0337334 -0.0369415 +0.492265 0.0288163 -0.130032 +0.315918 0.0330213 -0.0517884 +0.548816 0.0284056 -0.16454 +-0.42572 0.0342249 -0.0957925 +0.466159 0.0342582 -0.115962 +-0.133745 0.0390219 -0.00975281 +0.256946 0.0393317 -0.034375 +-0.256109 0.0473186 -0.0345109 +0.293568 0.04779 -0.0452572 +-0.548847 0.0430868 -0.165188 +0.257724 0.0495898 -0.0350549 +-0.415467 0.0480376 -0.0916609 +-0.641628 0.0412013 -0.234092 +0.224761 0.0525928 -0.0270065 +-0.290294 0.0544789 -0.0446146 +0.203654 0.0555956 -0.0225369 +-0.206296 0.0641783 -0.0236173 +-0.490601 0.0578491 -0.130538 +-0.40447 0.0617025 -0.0875324 +0.641354 0.0512904 -0.234472 +-0.16705 0.0671311 -0.0163396 +-0.128406 0.0697842 -0.0107366 +-0.279046 0.0685851 -0.0421746 +-0.577653 0.0598814 -0.185917 +-0.438956 0.0681765 -0.104082 +0.398742 0.0700558 -0.0856164 +0.251796 0.0746327 -0.0351018 +0.540951 0.0667342 -0.161597 +0.218795 0.0792894 -0.027456 +0.370697 0.0756403 -0.0743315 +-0.479124 0.0719369 -0.125206 +-0.393547 0.0756298 -0.0838118 +0.186894 0.0807667 -0.0209457 +0.252598 0.0797284 -0.0357191 +0.516369 0.071785 -0.146648 +-0.268472 0.0822315 -0.0402287 +-0.0461521 0.0853293 -0.00471667 +0.31463 0.081487 -0.0542897 +0.255339 0.0876656 -0.0371311 +0.491064 0.0773658 -0.132319 +0.547506 0.0769959 -0.166748 +-0.302637 0.0894358 -0.0510995 +0.464947 0.0825683 -0.11852 +-0.00298459 0.0975493 -0.00477378 +-0.468769 0.0857173 -0.120848 +-0.0736227 0.0965559 -0.00739904 +0.437916 0.087765 -0.105278 +0.292116 0.0956561 -0.0484127 +-0.218221 0.0991535 -0.0291508 +-0.179071 0.102061 -0.0214718 +-0.417084 0.096539 -0.0962738 +0.356101 0.100122 -0.0709319 +-0.292144 0.10331 -0.0492219 +-0.548781 0.091804 -0.16909 +0.444427 0.0982112 -0.109585 +-0.371552 0.103629 -0.0773895 +0.297716 0.10607 -0.0512563 +-0.061127 0.112127 -0.008188 +0.179835 0.11142 -0.0226337 +0.417567 0.102839 -0.0971921 +-0.325953 0.110364 -0.0610781 +-0.207282 0.113375 -0.0283107 +0.239202 0.112638 -0.0355857 +-0.168134 0.116041 -0.0210897 +-0.165576 0.117597 -0.0208394 +-0.405985 0.110235 -0.092793 +0.33419 0.114656 -0.0644943 +-0.28037 0.117444 -0.0473199 +0.275914 0.121135 -0.0464813 +-0.53917 0.105671 -0.164459 +-0.360012 0.117418 -0.0744709 +-0.0513385 0.129819 -0.00979222 +0.396498 0.11777 -0.0895499 +-0.315198 0.124122 -0.0591259 +0.153086 0.130185 -0.0203997 +0.121035 0.131692 -0.0161261 +-0.632466 0.103322 -0.232334 +0.0883199 0.132769 -0.0127958 +-0.395041 0.124182 -0.0897682 +0.312035 0.129858 -0.058846 +-0.230724 0.133965 -0.036247 +-0.191796 0.13656 -0.0281124 +-0.0495012 0.139499 -0.0110158 +0.203489 0.136104 -0.0304289 +-0.152988 0.139203 -0.0216252 +0.222532 0.137568 -0.0348294 +0.374755 0.132931 -0.0824553 +0.487851 0.125502 -0.136142 +0.0283316 0.145056 -0.0109823 +0.318079 0.140197 -0.0623589 +0.259572 0.146257 -0.0454156 +-0.338311 0.144931 -0.0701933 +0.494509 0.135647 -0.141477 +0.224691 0.153444 -0.0377272 +-0.254254 0.154719 -0.0453185 +0.468193 0.140637 -0.127638 +0.295068 0.154489 -0.0570959 +0.550668 0.134861 -0.176242 +-0.372317 0.15224 -0.0844659 +-0.0603674 0.164469 -0.0154667 +-0.0984344 0.165769 -0.0187603 +0.205102 0.162289 -0.034808 +0.155794 0.16618 -0.0262893 +-0.28868 0.161578 -0.056307 +0.359304 0.158314 -0.0803058 +-0.413767 0.155164 -0.102937 +0.0445561 0.16949 -0.0154757 +-0.203934 0.171667 -0.036184 +0.242324 0.170871 -0.0449701 +0.311201 0.16745 -0.0645246 +-0.165086 0.174539 -0.0292875 +0.420141 0.160877 -0.106915 +-0.277453 0.175817 -0.0554852 +0.336841 0.172809 -0.0744326 +-0.402442 0.16909 -0.100306 +0.200448 0.183557 -0.0376449 +0.426503 0.171419 -0.111906 +-0.0829862 0.189215 -0.0215773 +0.123684 0.189726 -0.0259844 +0.156183 0.188656 -0.0304558 +-0.63922 0.147899 -0.245332 +-0.311431 0.18275 -0.0674694 +-0.227267 0.192571 -0.0453975 +-0.188519 0.195069 -0.0374989 +-0.149575 0.197837 -0.0312443 +-0.346315 0.189774 -0.081277 +0.0322775 0.204045 -0.0215708 +0.40509 0.186322 -0.10491 +-0.254796 0.199731 -0.0538571 +0.618667 0.162937 -0.231428 +0.319992 0.197606 -0.0734164 +0.10942 0.208763 -0.0281742 +-0.067271 0.213453 -0.0253654 +0.00375146 0.214424 -0.0232664 +-0.0425555 0.216576 -0.0246622 +0.382731 0.200631 -0.0981884 +-0.564323 0.180898 -0.194509 +-0.4217 0.199605 -0.115508 +-0.211931 0.21588 -0.0468574 +0.166116 0.216795 -0.0380202 +-0.13423 0.22128 -0.0340718 +0.267506 0.214695 -0.060667 +-0.0499732 0.224515 -0.0268115 +-0.0243085 0.225509 -0.0260622 +0.111558 0.224519 -0.031937 +0.463803 0.201161 -0.137202 +0.152603 0.225612 -0.0378091 +-0.284827 0.220326 -0.0670851 +0.149699 0.230165 -0.0384312 +0.525467 0.197774 -0.172492 +-0.409855 0.213575 -0.113205 +0.212899 0.230281 -0.0504503 +0.500266 0.20303 -0.158268 +0.149247 0.233195 -0.0390913 +-0.365028 0.220277 -0.0954379 +-0.0504469 0.237268 -0.0298666 +0.0514982 0.236977 -0.0298507 +-0.319082 0.227278 -0.0799286 +-0.234984 0.236981 -0.0573323 +0.366153 0.22568 -0.0972263 +0.30895 0.232984 -0.0778999 +-0.118384 0.24516 -0.0377725 +-0.157876 0.243095 -0.0429317 +0.249429 0.238734 -0.0614951 +0.159415 0.245532 -0.0438091 +0.479978 0.218241 -0.150299 +-0.35396 0.234278 -0.0945578 +0.213792 0.244603 -0.0542398 +-0.26928 0.243515 -0.0682337 +-0.260297 0.244418 -0.06592 +-0.590339 0.207528 -0.219979 +-0.440274 0.230516 -0.132232 +0.255135 0.248003 -0.0654407 +0.56075 0.212095 -0.199641 +0.164132 0.254956 -0.0470791 +0.0698918 0.261822 -0.0374179 +0.459049 0.233414 -0.1428 +-0.219418 0.260412 -0.0597652 +-0.180466 0.262945 -0.0522174 +0.00188348 0.267273 -0.036381 +0.348911 0.250491 -0.0969414 +-0.142117 0.265949 -0.0465464 +0.29116 0.257131 -0.0785286 +0.200601 0.265045 -0.0568616 +0.566208 0.221862 -0.206158 +-0.428276 0.244301 -0.130002 +0.0717759 0.270386 -0.0399272 +0.168924 0.266682 -0.0511347 +-0.384191 0.251146 -0.111561 +0.00769877 0.271716 -0.0376534 +-0.338641 0.258 -0.0951473 +0.464586 0.24392 -0.148729 +-0.520975 0.23631 -0.179791 +-0.29262 0.265115 -0.0812574 +0.354882 0.261091 -0.102286 +-0.469737 0.24734 -0.152551 +0.0417492 0.280257 -0.0409832 +0.296933 0.2676 -0.0833643 +-0.0594295 0.282343 -0.042529 +-0.624845 0.220137 -0.250929 +0.0793864 0.280852 -0.0435378 +0.237361 0.273451 -0.0678605 +0.570802 0.231638 -0.212264 +-0.0352933 0.284531 -0.0419831 +0.442905 0.258643 -0.141549 +-0.203933 0.284279 -0.0631986 +0.415187 0.26333 -0.129209 +-0.509538 0.250234 -0.176741 +-0.165276 0.286873 -0.0563965 +-0.049662 0.292291 -0.0449609 +0.242857 0.284046 -0.0724558 +-0.126001 0.290507 -0.0514594 +-0.458216 0.261217 -0.15041 +-0.277326 0.288788 -0.0836531 +0.420739 0.273126 -0.13491 +-0.083105 0.302043 -0.050335 +0.278319 0.291657 -0.0848636 +0.33698 0.285096 -0.10269 +0.124016 0.302451 -0.0549375 +0.156582 0.301304 -0.0594161 +-0.402042 0.281775 -0.128814 +-0.357318 0.288681 -0.111751 +-0.115275 0.306456 -0.0551209 +-0.311639 0.295831 -0.0970241 +-0.049365 0.310387 -0.0506724 +-0.1882 0.308445 -0.0675609 +0.284327 0.302386 -0.0902084 +-0.109092 0.313544 -0.0567137 +-0.106685 0.311873 -0.0558847 +-0.226991 0.306206 -0.0754932 +-0.149086 0.311467 -0.0615108 +-0.0397648 0.314445 -0.0515577 +0.0638968 0.314678 -0.0529546 +0.193054 0.309278 -0.0688301 +0.342433 0.295533 -0.108148 +-0.0485585 0.320675 -0.0540562 +0.585138 0.261187 -0.232279 +-0.345351 0.303036 -0.111799 +-0.261594 0.312505 -0.0868137 +-0.106311 0.322857 -0.0595422 +0.430996 0.29389 -0.146846 +0.403098 0.29793 -0.134697 +0.0356876 0.326324 -0.055416 +0.229541 0.317814 -0.0800516 +-0.0267802 0.328815 -0.0559855 +-0.431734 0.29859 -0.148854 +-0.295631 0.319218 -0.0996101 +-0.716181 0.233694 -0.342374 +-0.062744 0.335562 -0.0600736 +0.00829924 0.336847 -0.0584773 +0.0253384 0.335274 -0.05822 +0.408414 0.30774 -0.140643 +-0.472747 0.301738 -0.172072 +-0.375958 0.319726 -0.13027 +-0.207438 0.338522 -0.0821915 +-0.168711 0.341353 -0.07533 +-0.129309 0.344023 -0.0699852 +0.329155 0.329407 -0.115044 +0.413735 0.31783 -0.146884 +0.270192 0.335958 -0.0977093 +-0.100786 0.352596 -0.0696677 +-0.513405 0.304619 -0.197739 +-0.280293 0.343467 -0.103637 +-0.0862339 0.356634 -0.0697441 +0.0886571 0.358052 -0.0705171 +0.1208 0.356491 -0.0735436 +0.152966 0.355117 -0.077778 +0.276235 0.346197 -0.103428 +0.334781 0.340185 -0.121253 +-0.0697432 0.361115 -0.0700904 +-0.560486 0.30351 -0.229457 +-0.359509 0.343073 -0.132213 +-0.40526 0.336552 -0.150002 +-0.0425923 0.369376 -0.0716966 +0.0607341 0.369007 -0.07256 +0.0934427 0.367856 -0.0748243 +-0.314168 0.350684 -0.117776 +-0.152015 0.365978 -0.0818762 +0.190166 0.36383 -0.0881533 +0.281143 0.356855 -0.109151 +0.395108 0.34229 -0.147517 +-0.445988 0.339029 -0.171656 +-0.226075 0.369219 -0.098575 +-0.548521 0.317292 -0.226404 +-0.108994 0.377455 -0.0804086 +0.0328971 0.379999 -0.0755983 +0.195115 0.374196 -0.0934088 +-0.389276 0.359796 -0.152055 +-0.343928 0.366673 -0.135556 +-0.260712 0.376459 -0.111007 +-0.0651848 0.39096 -0.0819036 +0.00674504 0.392393 -0.0802269 +0.404894 0.36185 -0.160283 +-0.29475 0.383235 -0.124641 +0.0096871 0.401352 -0.0841273 +-0.130861 0.399472 -0.0926428 +0.325093 0.38351 -0.135573 +-0.206256 0.402768 -0.10824 +-0.128061 0.408177 -0.0961238 +-0.244323 0.400558 -0.116903 +-0.373681 0.383482 -0.155427 +0.565831 0.34085 -0.249229 +-0.328771 0.391003 -0.140334 +0.3297 0.39322 -0.141702 +-0.0844178 0.420643 -0.09671 +-0.0137818 0.422238 -0.0936196 +0.122918 0.421273 -0.101434 +0.276162 0.409644 -0.13056 +0.334618 0.403024 -0.148177 +0.593633 0.344318 -0.272646 +-0.258234 0.442062 -0.140991 +-0.0285343 0.457172 -0.111079 +0.0402016 0.456862 -0.111371 +0.168354 0.450918 -0.123455 +0.199825 0.44826 -0.128718 +0.290436 0.43997 -0.150251 +0.532153 0.390953 -0.249021 +0.556798 0.384677 -0.263794 +0.0430327 0.464861 -0.115663 +0.204852 0.458064 -0.135007 +-0.338013 0.441125 -0.168642 +-0.38361 0.434347 -0.185024 +0.295072 0.449854 -0.157051 +0.510668 0.405482 -0.241843 +0.352221 0.442758 -0.175436 +-0.0554309 0.474179 -0.121318 +-0.288097 0.457713 -0.15887 +0.209614 0.467925 -0.14145 +-0.664497 0.357856 -0.343964 +0.488464 0.420041 -0.235168 +0.0203181 0.486137 -0.126354 +-0.160113 0.4812 -0.138136 +0.214331 0.478014 -0.148199 +0.303776 0.469036 -0.170708 +-0.367531 0.458769 -0.191018 +-0.156576 0.489639 -0.142249 +0.0247815 0.495517 -0.131756 +-0.195386 0.486985 -0.148725 +-0.233785 0.485087 -0.157364 +0.218923 0.487792 -0.154937 +-0.317637 0.47453 -0.179069 +0.307437 0.47848 -0.17748 +0.0291987 0.505941 -0.137926 +0.223263 0.497181 -0.16157 +-0.448483 0.463817 -0.235974 +-0.263244 0.500798 -0.175437 +0.397149 0.476615 -0.21571 +0.227708 0.506625 -0.168447 +-0.500635 0.453441 -0.262602 +-0.0645671 0.523515 -0.150434 +0.400446 0.485963 -0.223158 +0.231832 0.515939 -0.175342 +-0.3427 0.501089 -0.205352 +-0.0604098 0.534257 -0.156839 +-0.387782 0.494286 -0.221985 +-0.61688 0.423647 -0.336688 +-0.292643 0.517578 -0.195965 +0.235874 0.525596 -0.182619 +-0.484293 0.476569 -0.266282 +0.432068 0.490533 -0.243234 +0.0151997 0.545399 -0.161961 +0.353314 0.512802 -0.217565 +-0.428254 0.497321 -0.2455 +0.0197848 0.555199 -0.168518 +0.0243271 0.564816 -0.175142 +-0.156681 0.559554 -0.186151 +-0.195368 0.556508 -0.192454 +0.0288158 0.574442 -0.181962 +-0.112908 0.571136 -0.186947 +-0.152499 0.569226 -0.192086 +-0.363068 0.537484 -0.238888 +-0.191243 0.566479 -0.198421 +-0.229214 0.563265 -0.206153 +0.39184 0.535984 -0.252215 +-0.108406 0.580945 -0.193309 +-0.22492 0.573108 -0.211991 +0.195425 0.577966 -0.207685 +-0.10379 0.590735 -0.199838 +0.0374423 0.593369 -0.195941 +0.285714 0.569823 -0.229501 +-0.221037 0.583245 -0.218356 +0.342936 0.56231 -0.247536 +-0.0993828 0.600896 -0.206875 +0.0751033 0.602882 -0.205712 +0.171873 0.598414 -0.217465 +0.0791963 0.611749 -0.212923 +0.1118 0.610796 -0.216145 +-0.249528 0.599086 -0.23919 +-0.019351 0.622254 -0.217424 +0.266898 0.599999 -0.245834 +0.325022 0.593281 -0.263537 +-0.245023 0.609452 -0.245989 +-0.014547 0.631598 -0.22484 +-0.24051 0.619063 -0.252393 +0.42721 0.592677 -0.317193 +-0.231381 0.638702 -0.266159 +0.220234 0.641547 -0.265211 +0.0312517 0.659284 -0.248756 +-0.188976 0.652165 -0.265855 +-0.226435 0.647837 -0.272652 +0.193012 0.65308 -0.267721 +0.0683035 0.668045 -0.259021 +0.28308 0.644273 -0.289523 +0.165324 0.663888 -0.270671 +-0.178732 0.670273 -0.27973 +-0.116447 0.677061 -0.273344 +0.116923 0.71105 -0.306648 diff --git a/image_analysis/indexing/fast-feedback-indexer/data/image1_radial.txt b/image_analysis/indexing/fast-feedback-indexer/data/image1_radial.txt new file mode 100644 index 000000000..26a9f42b7 --- /dev/null +++ b/image_analysis/indexing/fast-feedback-indexer/data/image1_radial.txt @@ -0,0 +1,674 @@ +36.9 0 0 4.83429e-15 78.95 0 4.83429e-15 4.83429e-15 78.95 +-0.0554001 0.474221 -0.121339 +0.043262 0.465092 -0.115795 +-0.054893 0.459916 -0.113736 +0.168336 0.451024 -0.123507 +0.133933 0.453493 -0.118861 +0.0506694 0.456735 -0.111842 +0.0402016 0.456862 -0.111371 +-0.0285343 0.457172 -0.111079 +0.072114 0.455957 -0.112924 +-0.0132874 0.457107 -0.110687 +-0.0338298 0.456885 -0.111118 +-0.142513 0.452481 -0.119687 +-0.0451015 0.42931 -0.0979697 +0.122745 0.421354 -0.101449 +-0.209774 0.415897 -0.115113 +-0.0844155 0.420644 -0.09671 +-0.0137201 0.422164 -0.0935845 +-0.0456018 0.42132 -0.0942352 +0.0525929 0.418325 -0.0932264 +-0.0872295 0.414864 -0.0943074 +-0.0470433 0.414026 -0.0909514 +-0.244323 0.400558 -0.116903 +0.0705523 0.41211 -0.0916016 +-0.128054 0.408188 -0.0961278 +-0.0171034 0.412937 -0.089401 +-0.205866 0.402665 -0.108103 +-0.130678 0.399689 -0.0927117 +-0.161613 0.39839 -0.097134 +0.00968712 0.401352 -0.0841273 +-0.294749 0.383235 -0.124641 +0.0403771 0.395304 -0.0823375 +-0.204114 0.388139 -0.101286 +0.00686321 0.3923 -0.0801882 +-0.0651848 0.39096 -0.0819036 +-0.260805 0.376399 -0.111009 +0.125257 0.385219 -0.0857149 +-0.132924 0.382484 -0.0856494 +0.195066 0.374016 -0.0933241 +0.0329007 0.380006 -0.0756011 +0.116362 0.377563 -0.0813562 +-0.108994 0.377455 -0.0804086 +-0.225813 0.369095 -0.0984584 +0.0995125 0.375629 -0.078588 +-0.0755176 0.376077 -0.076494 +0.281217 0.356778 -0.109143 +0.190151 0.363801 -0.0881386 +0.0607287 0.369011 -0.0725611 +-0.152002 0.365922 -0.0818516 +-0.0425563 0.369397 -0.0717035 +0.158416 0.365758 -0.0828712 +-0.314168 0.350684 -0.117776 +0.0934427 0.367856 -0.0748243 +0.0166262 0.367801 -0.0702439 +-0.21899 0.358461 -0.092504 +-0.152936 0.362414 -0.0806162 +0.0554934 0.378522 -0.0760725 +0.334781 0.340185 -0.121253 +-0.0697432 0.361115 -0.0700904 +0.27625 0.346217 -0.10344 +0.0340543 0.457067 -0.11122 +0.152956 0.355126 -0.0777799 +0.120793 0.356455 -0.0735289 +0.0886572 0.358052 -0.0705171 +-0.0861788 0.35671 -0.0697682 +-0.280281 0.343389 -0.103604 +-0.283262 0.34093 -0.103602 +0.121957 0.348465 -0.0706462 +0.329155 0.329407 -0.115044 +0.27026 0.335914 -0.0977132 +-0.129302 0.34402 -0.0699833 +0.234275 0.338454 -0.0886469 +-0.207455 0.338545 -0.082204 +-0.168711 0.341353 -0.07533 +-0.135596 0.338934 -0.0690126 +-0.303071 0.325167 -0.104224 +0.00829929 0.336847 -0.0584774 +-0.170987 0.331939 -0.0723255 +-0.0627441 0.335562 -0.0600736 +0.0253384 0.335274 -0.05822 +-0.295625 0.31922 -0.0996087 +-0.156121 0.329874 -0.0689741 +-0.187991 0.327209 -0.0739365 +-0.0267802 0.328815 -0.0559855 +0.31685 0.311144 -0.104011 +-0.209667 0.320812 -0.0763556 +-0.184998 0.321675 -0.0713983 +0.229573 0.317785 -0.0800494 +0.0356876 0.326324 -0.055416 +-0.106311 0.322857 -0.0595422 +-0.261624 0.312518 -0.0868268 +-0.345658 0.303181 -0.111968 +-0.181516 0.317129 -0.0691502 +-0.0485584 0.320675 -0.0540562 +0.0638968 0.314678 -0.0529545 +0.284343 0.302358 -0.090204 +0.193076 0.309345 -0.0688572 +0.212021 0.30876 -0.0727923 +-0.0397647 0.314445 -0.0515577 +-0.109092 0.313544 -0.0567137 +-0.149086 0.311467 -0.0615108 +0.342432 0.295533 -0.108148 +-0.1882 0.308445 -0.0675609 +-0.106685 0.311873 -0.0558847 +0.249103 0.301562 -0.0796694 +-0.311626 0.29581 -0.0970129 +-0.049365 0.310387 -0.0506723 +-0.115275 0.306456 -0.0551209 +-0.357423 0.288669 -0.111789 +0.156582 0.301304 -0.0594161 +0.124016 0.302451 -0.0549375 +0.278365 0.291681 -0.0848854 +0.336986 0.285086 -0.10269 +-0.083105 0.302043 -0.050335 +-0.277326 0.288788 -0.0836531 +-0.232783 0.288812 -0.0713451 +0.242857 0.284046 -0.0724558 +-0.049662 0.292291 -0.0449609 +-0.203933 0.284279 -0.0631986 +-0.165276 0.286873 -0.0563965 +-0.372635 0.264974 -0.110656 +-0.0594295 0.282343 -0.042529 +-0.0352933 0.284531 -0.0419831 +0.237361 0.273451 -0.0678605 +0.0793864 0.280852 -0.0435378 +0.0417492 0.280257 -0.0409832 +0.354897 0.261107 -0.102297 +0.296736 0.267731 -0.0833387 +-0.267453 0.268378 -0.0745583 +-0.29262 0.265115 -0.0812574 +0.200602 0.265045 -0.0568616 +-0.338628 0.257993 -0.0951405 +0.0717759 0.270386 -0.0399272 +-0.384215 0.251129 -0.111567 +0.291164 0.257143 -0.078533 +0.168924 0.266682 -0.0511347 +0.3489 0.250517 -0.0969441 +-0.142117 0.265949 -0.0465464 +-0.180466 0.262945 -0.0522174 +-0.219418 0.260412 -0.0597652 +-0.284865 0.254988 -0.0759694 +0.164132 0.254956 -0.0470791 +0.255135 0.248003 -0.0654407 +-0.260297 0.244418 -0.06592 +-0.269593 0.243439 -0.0683041 +-0.273342 0.242977 -0.0692764 +-0.353959 0.234332 -0.094571 +0.213792 0.244603 -0.0542398 +0.159415 0.245532 -0.0438091 +-0.118384 0.245159 -0.0377721 +0.249429 0.238734 -0.0614951 +-0.157876 0.243095 -0.0429317 +0.30895 0.232984 -0.0778999 +-0.234984 0.236981 -0.0573323 +-0.149605 0.362398 -0.080062 +0.366153 0.22568 -0.0972263 +-0.319085 0.227285 -0.0799315 +0.383248 0.220921 -0.103164 +0.0514982 0.236977 -0.0298507 +0.212899 0.230281 -0.0504503 +-0.0504469 0.237268 -0.0298666 +-0.365028 0.220277 -0.0954379 +0.149247 0.233195 -0.0390913 +-0.409855 0.213575 -0.113205 +-0.284827 0.220326 -0.0670851 +0.111558 0.224519 -0.031937 +0.152603 0.225612 -0.0378091 +-0.226946 0.306092 -0.0754445 +-0.0243085 0.225509 -0.0260622 +-0.0499732 0.224515 -0.0268115 +0.267506 0.214695 -0.060667 +-0.13423 0.22128 -0.0340718 +0.325668 0.208341 -0.0777556 +-0.211931 0.21588 -0.0468574 +-0.421715 0.199702 -0.115536 +-0.0649314 0.218048 -0.0262243 +0.382755 0.20063 -0.0981986 +-0.0425555 0.216576 -0.0246622 +0.00375146 0.214424 -0.0232664 +-0.0672789 0.213439 -0.0253629 +0.10942 0.208763 -0.0281742 +0.319992 0.197606 -0.0734165 +-0.254796 0.199731 -0.0538571 +0.405078 0.186349 -0.10491 +0.0322775 0.204045 -0.0215708 +-0.346313 0.189819 -0.0812856 +-0.149575 0.197837 -0.0312443 +-0.188517 0.195072 -0.0374991 +-0.227294 0.192563 -0.0454022 +-0.318047 0.184442 -0.070039 +-0.311431 0.18275 -0.0674694 +0.123684 0.189726 -0.0259844 +0.426541 0.171442 -0.111929 +0.156183 0.188656 -0.0304558 +0.320372 0.178301 -0.0696396 +-0.402442 0.16909 -0.100306 +0.336841 0.172809 -0.0744326 +-0.277453 0.175817 -0.0554852 +0.420177 0.160872 -0.106932 +0.311201 0.16745 -0.0645247 +0.242307 0.170869 -0.0449653 +-0.165086 0.174539 -0.0292875 +-0.203934 0.171667 -0.036184 +0.328477 0.161912 -0.0694695 +-0.0507351 0.170783 -0.0159985 +-0.413737 0.155103 -0.102913 +0.359316 0.158302 -0.0803084 +0.044556 0.16949 -0.0154757 +-0.28868 0.161578 -0.056307 +0.205102 0.162289 -0.034808 +-0.0984344 0.165769 -0.0187603 +-0.0603674 0.164469 -0.0154667 +-0.372317 0.15224 -0.0844658 +-0.37719 0.15115 -0.0862816 +0.295067 0.154489 -0.0570959 +-0.254272 0.154719 -0.0453231 +0.224691 0.153444 -0.0377272 +-0.338311 0.144931 -0.0701933 +0.259572 0.146254 -0.0454152 +-0.100919 0.352591 -0.0696803 +0.318079 0.140197 -0.0623589 +0.00188344 0.267273 -0.036381 +0.0283317 0.145056 -0.0109823 +0.374815 0.132931 -0.0824799 +-0.152988 0.139203 -0.0216252 +0.222532 0.137568 -0.0348294 +-0.0495013 0.139499 -0.0110158 +-0.191796 0.13656 -0.0281124 +0.203489 0.136104 -0.0304289 +0.312035 0.129858 -0.058846 +-0.230724 0.133965 -0.036247 +-0.395041 0.124182 -0.0897682 +0.121035 0.131692 -0.0161261 +0.0883199 0.132769 -0.0127958 +0.153086 0.130185 -0.0203997 +-0.0513385 0.129819 -0.00979222 +-0.315198 0.124122 -0.0591259 +-0.232806 -0.22964 -0.054978 +0.464947 0.0825682 -0.11852 +-0.137056 -0.394294 -0.0912935 +0.164691 -0.236297 -0.0423778 +-0.133827 -0.337855 -0.0683646 +-0.218942 -0.0991003 -0.0293077 +0.426944 -0.214432 -0.121514 +0.132522 -0.235945 -0.0373122 +-0.167902 -0.235142 -0.042651 +-0.0461522 0.0853293 -0.00471668 +-0.291966 -0.18708 -0.0620464 +-0.287238 -0.310787 -0.0939613 +0.173269 -0.39254 -0.0967339 +0.0338888 -0.402273 -0.0851076 +0.292986 -0.32862 -0.102131 +-0.365428 -0.226126 -0.0970439 +0.442994 -0.191073 -0.124074 +-0.25799 -0.236511 -0.0632482 +-0.20812 -0.0854294 -0.0256345 +0.200448 0.183557 -0.0376449 +0.203654 0.0555956 -0.0225369 +0.219429 -0.375545 -0.0995465 +0.225149 -0.377544 -0.101797 +0.432662 -0.162332 -0.113179 +0.0564521 -0.247401 -0.0327327 +-0.0135577 -0.206134 -0.0215702 +-0.0463787 -0.247572 -0.0322413 +0.254933 -0.243792 -0.0642786 +0.153612 -0.250963 -0.0442694 +0.153689 -0.116581 -0.0187822 +-0.230685 -0.247444 -0.0589603 +-0.175898 -0.269739 -0.0532683 +-0.206296 0.0641784 -0.0236173 +0.185871 -0.251358 -0.0501203 +-0.30323 -0.24309 -0.0786104 +-0.123151 -0.429937 -0.105579 +0.067938 -0.232923 -0.0298807 +-0.0198387 -0.254975 -0.033256 +0.249715 -0.162707 -0.0454483 +0.417567 0.102839 -0.0971921 +-0.400168 -0.218783 -0.110056 +0.248683 -0.072034 -0.0340973 +-0.42572 0.0342249 -0.0957924 +-0.203331 -0.312439 -0.0720784 +-0.460131 0.0354857 -0.112858 +-0.416811 -0.235612 -0.122073 +-0.381714 -0.240096 -0.107449 +-0.382788 -0.242799 -0.108641 +0.291254 -0.101737 -0.0487793 +-0.203217 -0.258299 -0.0555506 +-0.0974351 -0.264055 -0.0404266 +-0.348485 -0.249926 -0.0966199 +0.375992 -0.246907 -0.106878 +0.419943 0.00601603 -0.0924693 +-0.147364 -0.365559 -0.0809514 +0.0232593 -0.289026 -0.0429613 +-0.390612 -0.021658 -0.0796994 +-0.292411 -0.0950913 -0.0484468 +-0.112999 -0.196146 -0.025958 +-0.274184 -0.206911 -0.0608454 +-0.056748 -0.373338 -0.0740417 +0.10324 -0.312554 -0.0557272 +0.0341448 -0.27501 -0.0391651 +-0.331859 -0.317323 -0.111644 +0.402407 -0.252542 -0.120062 +0.399919 0.0212715 -0.0836963 +-0.196564 -0.163207 -0.0331877 +-0.165534 -0.426348 -0.110716 +-0.371541 0.103604 -0.0773821 +-0.107514 -0.277393 -0.0452782 +0.302934 -0.264804 -0.0845164 +-0.434595 -0.213001 -0.124924 +0.0473511 -0.464725 -0.115812 +-0.286079 -0.267764 -0.0799665 +0.231354 -0.400383 -0.113338 +-0.213406 -0.273251 -0.0620278 +0.265312 -0.272573 -0.0751683 +-0.146367 -0.280298 -0.0513115 +0.256946 0.0393316 -0.034375 +0.432134 -0.0713946 -0.101021 +0.196601 -0.280194 -0.0604045 +-0.0596304 -0.346753 -0.0639408 +-0.411316 -0.140387 -0.0993833 +-0.401413 -0.26107 -0.122099 +0.06531 -0.404094 -0.0876172 +0.275916 0.121139 -0.0464826 +-0.0801307 -0.154617 -0.0152804 +-0.00701452 -0.286916 -0.0420698 +-0.114847 -0.284891 -0.048345 +0.184482 -0.378893 -0.0931338 +-0.366098 -0.267662 -0.108748 +0.265223 -0.315853 -0.0890148 +0.00166197 -0.287606 -0.0422526 +-0.185233 -0.283551 -0.0591029 +0.0182876 -0.404442 -0.0856192 +0.119271 -0.419148 -0.0999501 +0.0126159 -0.387667 -0.0782868 +-0.0478466 -0.368891 -0.0717597 +0.398701 0.0699807 -0.0855928 +-0.251801 -0.1538 -0.0445201 +-0.331741 -0.275034 -0.0976116 +-0.0280447 -0.425194 -0.0953323 +0.197401 -0.262572 -0.0554956 +0.0961801 0.368074 -0.0751914 +0.31217 -0.249925 -0.0834374 +-0.476218 -0.025352 -0.121038 +0.0227789 -0.374089 -0.0728872 +-0.0479073 -0.375325 -0.0743455 +0.313949 -0.110983 -0.057069 +0.255093 -0.287145 -0.0767042 +-0.154288 0.357395 -0.0788789 +0.378653 -0.277246 -0.116961 +-0.292144 0.10331 -0.0492219 +0.360136 -0.136989 -0.0772128 +0.399128 -0.0274945 -0.0835172 +0.349536 -0.284297 -0.107251 +0.119635 -0.300899 -0.053878 +0.0126239 -0.302719 -0.0470036 +-0.16389 -0.299533 -0.0600956 +-0.15594 -0.33868 -0.0721106 +0.328647 -0.227158 -0.0832718 +-0.287431 0.339998 -0.104576 +-0.0175963 -0.41991 -0.092605 +-0.0500858 -0.224151 -0.0267334 +-0.0512556 -0.0199697 -0.00151411 +0.312907 -0.292929 -0.096517 +0.447769 -0.138667 -0.116669 +0.275406 -0.301479 -0.0871684 +-0.107631 -0.423627 -0.10058 +-0.24142 -0.303687 -0.078322 +-0.349049 -0.292731 -0.10979 +0.355534 -0.189409 -0.0847296 +0.20663 -0.30874 -0.0715695 +-0.0690828 -0.141178 -0.0124291 +0.0021596 -0.31569 -0.0511401 +-0.000949345 -0.314233 -0.0506547 +-0.0243971 -0.219576 -0.0247098 +0.228033 -0.285849 -0.0692523 +-0.277817 0.0199287 -0.0395728 +0.0157518 -0.46253 -0.113536 +-0.314706 -0.300261 -0.0995538 +0.239824 -0.227365 -0.0561835 +-0.0681037 -0.274377 -0.0407924 +-0.263606 -0.10926 -0.0415773 +-0.417879 -0.102591 -0.0973082 +-0.0692197 -0.31778 -0.0543656 +-0.0591643 -0.303963 -0.0491551 +0.223263 -0.200113 -0.0460041 +0.115761 -0.077113 -0.00972071 +0.292132 -0.23608 -0.073218 +-0.026864 -0.432986 -0.0989997 +0.0321766 -0.360729 -0.0678844 +-0.108558 -0.320396 -0.0589571 +-0.213531 -0.314701 -0.075139 +-0.417087 0.0965609 -0.0962773 +0.180626 -0.170362 -0.0313148 +0.42165 -0.133409 -0.103109 +-0.0394508 -0.323385 -0.0545553 +-0.337324 -0.193735 -0.0787623 +-0.179071 0.10206 -0.0214718 +0.204541 -0.31869 -0.0744733 +0.0721465 0.0202928 -0.00281241 +-0.147804 -0.323431 -0.0653629 +0.417799 -0.0948751 -0.0964276 +-0.415475 0.0480451 -0.091665 +-0.214061 -0.358478 -0.0913355 +-0.168134 0.116041 -0.0210897 +0.315918 0.0330213 -0.0517884 +0.195963 -0.323513 -0.0742907 +0.224358 -0.2313 -0.0533409 +-0.126001 0.290507 -0.0514594 +-0.00979313 -0.329109 -0.0557587 +0.370527 0.075407 -0.0742442 +-0.249522 -0.320366 -0.0861596 +0.0153831 -0.330311 -0.0562533 +-0.0480774 -0.330178 -0.0573066 +-0.199927 -0.29069 -0.0643032 +-0.325953 0.110364 -0.0610781 +-0.185738 -0.325936 -0.0730333 +0.278724 0.0244282 -0.0399395 +-0.342878 -0.154451 -0.0734044 +-0.247078 -0.178687 -0.0476221 +0.187263 -0.401526 -0.103501 +0.358568 0.00281543 -0.0665007 +0.0654552 -0.333577 -0.0595522 +0.162218 -0.406552 -0.100889 +0.130168 -0.406306 -0.0955822 +-0.00384501 -0.100921 -0.00511303 +0.322743 -0.320453 -0.109412 +-0.0151002 -0.338988 -0.0593304 +-0.133745 0.0390219 -0.00975281 +-0.290294 0.0544789 -0.0446146 +-0.235599 -0.166535 -0.0425246 +0.184762 -0.337505 -0.0769866 +0.111955 -0.467658 -0.123209 +-0.102281 -0.182192 -0.0220712 +0.384804 -0.275307 -0.119017 +0.390728 -0.0898249 -0.0838871 +0.198873 -0.441139 -0.124874 +-0.134601 -0.363237 -0.0780775 +0.348987 -0.326777 -0.121692 +-0.0877179 -0.420527 -0.0969701 +-0.478023 0.023169 -0.121958 +-0.203845 -0.386458 -0.100502 +0.401144 -0.209518 -0.108268 +0.426466 -0.0323579 -0.0960753 +0.292116 0.0956561 -0.0484127 +0.131954 -0.346169 -0.071154 +-0.269868 -0.335764 -0.0975403 +0.143175 -0.221515 -0.035411 +0.365816 0.0550467 -0.0709423 +0.21631 -0.337495 -0.0838629 +-0.256109 0.0473186 -0.0345109 +0.264071 -0.357573 -0.104228 +0.312166 -0.335364 -0.111133 +-0.382958 -0.108608 -0.0826412 +-0.204502 -0.349807 -0.0857712 +0.195204 -0.36502 -0.0896948 +-0.135513 -0.352211 -0.0739418 +-0.349263 -0.335129 -0.124955 +-0.128406 0.0697843 -0.0107366 +0.274725 -0.343865 -0.102067 +0.173484 -0.351675 -0.0800934 +-0.296603 -0.222487 -0.071277 +0.00187905 -0.358748 -0.0665673 +-0.242043 -0.347169 -0.0939708 +-0.35662 -0.0286432 -0.0661898 +-0.124028 -0.210519 -0.03031 +-0.29752 -0.147579 -0.0567596 +0.375834 -0.113342 -0.0802705 +0.111184 -0.22032 -0.0309297 +-0.177123 -0.354955 -0.0820488 +0.226554 -0.00791348 -0.0260335 +0.0181293 0.387169 -0.0781694 +-0.274752 -0.211303 -0.0619902 +-0.0581172 -0.361519 -0.0694484 +0.142957 -0.359048 -0.0776944 +0.37083 -0.0749327 -0.0743272 +-0.20197 -0.215371 -0.0445822 +0.300917 -0.350315 -0.113023 +0.307598 -0.169023 -0.0636162 +0.0898723 -0.365357 -0.0734812 +-0.207297 -0.176762 -0.0378236 +-0.2415 -0.261649 -0.0655389 +0.157977 -0.392275 -0.0938195 +-0.108572 -0.362986 -0.0745523 +0.344102 -0.160474 -0.0748829 +-0.058775 -0.261086 -0.0364754 +0.209072 -0.427937 -0.120705 +-0.0674917 -0.435731 -0.102457 +0.00948181 -0.429473 -0.09697 +-0.334601 -0.0695099 -0.0602072 +0.182788 -0.145841 -0.0277248 +-0.193836 -0.415595 -0.111345 +0.0493293 -0.43948 -0.103103 +-0.0948883 -0.466937 -0.120815 +-0.134942 -0.224282 -0.0348636 +0.437916 0.087765 -0.105278 +0.11299 -0.412507 -0.0960799 +-0.267168 0.0337433 -0.0369411 +-0.126427 -0.422966 -0.102718 +-0.00549477 -0.447479 -0.105722 +-0.165633 0.0185813 -0.0139876 +-0.153226 -0.367845 -0.0828239 +0.108445 -0.445997 -0.11156 +0.148102 -0.0780008 -0.0141087 +0.167631 -0.437422 -0.116506 +-0.167313 -0.191491 -0.0328716 +-0.182774 -0.44387 -0.122747 +0.0732804 -0.218971 -0.0270243 +0.0356146 -0.38777 -0.078932 +0.44436 0.0982647 -0.109557 +-0.111287 -0.402865 -0.0915314 +0.224761 0.0525929 -0.0270065 +0.458559 -0.0765693 -0.114641 +-0.207436 -0.131828 -0.0306746 +-0.0557163 -0.463418 -0.115614 +0.266485 -0.324864 -0.092559 +0.154396 -0.407866 -0.100107 +-0.252482 -0.139386 -0.0424904 +0.0834274 -0.0755847 -0.00635679 +0.0440076 -0.389393 -0.0799803 +0.255339 0.0876656 -0.0371311 +-0.0592547 -0.387564 -0.0800635 +-0.28037 0.117444 -0.0473199 +-0.133617 -0.375166 -0.0827231 +0.465584 -0.0141582 -0.11511 +0.0692463 -0.478284 -0.124529 +-0.213646 -0.138121 -0.0329023 +0.170967 -0.354802 -0.0808233 +0.0870924 -0.418068 -0.0957689 +0.307058 -0.07815 -0.0515233 +-0.0484773 -0.346601 -0.0632408 +0.396498 0.11777 -0.0895499 +0.19616 -0.37305 -0.0931623 +-0.313316 0.24385 -0.0821928 +-0.260037 -0.364647 -0.105901 +0.252598 0.0797285 -0.0357191 +-0.0255015 0.430229 -0.0976406 +0.202033 -0.18508 -0.0382681 +0.0972732 -0.405624 -0.0911505 +0.327992 -0.0931801 -0.0599261 +-0.0982357 -0.391531 -0.0850939 +-0.287162 -0.353208 -0.109617 +0.0891563 -0.114286 -0.0105609 +0.466194 0.0342616 -0.115981 +0.406233 -0.156903 -0.0998024 +0.228561 -0.147767 -0.0377501 +0.116859 -0.253467 -0.0397404 +0.239202 0.112638 -0.0355857 +-0.0916265 -0.0774544 -0.00722339 +-0.302637 0.0894359 -0.0510995 +0.293569 0.0477886 -0.0452573 +-0.082467 -0.38481 -0.0806957 +-0.0353004 -0.233482 -0.0282797 +0.462386 -0.115096 -0.120823 +-0.218221 0.0991536 -0.0291508 +-0.00298451 0.0975493 -0.00477378 +0.24426 -0.12473 -0.0383455 +-0.204916 0.0156585 -0.0213458 +0.472813 -0.00394072 -0.118846 +0.282102 -0.206923 -0.0631963 +0.157279 -0.0156257 -0.0125694 +0.0275674 -0.229296 -0.0270337 +0.207053 -0.132791 -0.0307242 +-0.440161 -0.172691 -0.118844 +-0.3775 -0.147386 -0.085795 +-0.277118 -0.261596 -0.0754607 +0.115932 -0.168628 -0.0211618 +0.242519 -0.386438 -0.11014 +0.151048 0.0503494 -0.0127567 +-0.14248 -0.377049 -0.0848316 +0.0827332 -0.384863 -0.0807417 +-0.35373 0.113577 -0.0715739 +0.000577659 0.381775 -0.0757449 +-0.371053 -0.186273 -0.0902625 +0.204402 0.00692977 -0.0211375 +-0.349149 -0.116286 -0.070176 +-0.190661 -0.201964 -0.0393445 +-0.388486 -0.162931 -0.0930644 +0.31463 0.081487 -0.0542897 +0.22303 -0.10936 -0.0313422 +-0.202063 -0.124281 -0.028545 +0.356129 0.100144 -0.0709449 +0.297716 0.10607 -0.0512563 +-0.118665 -0.157784 -0.0196824 +0.00704985 0.472633 -0.118769 +0.33419 0.114656 -0.0644943 +-0.207282 0.113375 -0.0283107 +-0.0979117 -0.238338 -0.0337659 +-0.230498 -0.113481 -0.033567 +-0.268472 0.0822315 -0.0402287 +0.447086 0.000994532 -0.10551 +-0.241484 -0.128044 -0.0380799 +-0.0474262 -0.379717 -0.0761139 +0.124602 -0.223351 -0.0332588 +-0.107263 -0.0344294 -0.00636561 +-0.393547 0.0756299 -0.0838118 +-0.379761 -0.140505 -0.0856478 +0.00265973 -0.13949 -0.00978011 +0 -0.383353 -0.0763979 +-0.149731 -0.370117 -0.0831607 +0.320716 -0.195604 -0.0732421 +0.168824 -0.406323 -0.102002 +-0.0747482 -0.102515 -0.00808094 +-0.0471164 -0.407633 -0.0880703 +0.0269803 0.0269803 -0.000728204 +-0.0329415 -0.402009 -0.084957 +0.337297 0.0178784 -0.0587714 +0.186894 0.0807667 -0.0209457 +-0.116823 -0.376524 -0.0809886 +-0.311179 -0.0216474 -0.0498953 +-0.276842 -0.0294923 -0.0395372 +0.148712 -0.169604 -0.0257724 +0.21883 -0.0295674 -0.024685 +0.257724 0.0495898 -0.0350549 +0.442926 -0.0997906 -0.109012 +-0.224167 -0.151811 -0.037346 +-0.41094 0.0473425 -0.0895678 +0.098138 -0.0324916 -0.00535774 +-0.0736226 0.0965558 -0.00739903 +-0.0829862 0.189215 -0.0215773 +-0.319952 -0.218184 -0.0780314 +-0.162724 -0.213327 -0.0366661 +0.31885 -0.198355 -0.0731827 +0.253408 -0.372017 -0.107034 +-0.427518 0.0825111 -0.0997664 +-0.16705 0.0671311 -0.0163396 +-0.404626 0.0617388 -0.0876041 +0.175154 -0.265978 -0.0520672 +-0.360012 0.117418 -0.0744709 +0.397102 -0.128733 -0.0912989 +0.0755639 -0.391575 -0.0829619 +-0.0294014 -0.393643 -0.0812069 +0.338393 -0.179214 -0.0762182 +-0.303848 -0.109619 -0.0536068 +0.270127 -0.0867751 -0.0410937 +0.179835 0.11142 -0.0226337 +-0.180244 -0.187766 -0.0344659 +0.107594 -0.371354 -0.0777637 +-0.0608561 -0.111049 -0.00805005 +0.366065 -0.218276 -0.095372 +0.302161 -0.221588 -0.0728551 +0.0587303 -0.0753207 -0.00457168 +0.288072 -0.1516 -0.0544675 +0.0691174 -0.218061 -0.0265153 +-0.435513 -0.11927 -0.107754 +0.370701 -0.0245002 -0.071571 +-0.269788 -0.0701066 -0.0396359 +0.0302828 -0.321755 -0.0536615 +-0.197007 -0.0718084 -0.0222313 +0.237935 -0.177096 -0.0450007 +-0.405412 -0.179018 -0.103566 +0.169633 -0.184751 -0.0319651 +-0.279046 0.0685851 -0.0421746 +-0.281799 -0.172404 -0.0561428 +0.213441 -0.173381 -0.0385523 +-0.439011 0.0682345 -0.104113 +-0.310284 -0.069503 -0.0519002 +-0.091192 -0.168241 -0.0184813 +0.201928 -0.0944675 -0.0251661 +-0.468803 0.0858051 -0.120875 +-0.321716 -0.034064 -0.0537767 +0.17281 0.00855648 -0.015082 +0.0452933 -0.1276 -0.00920899 +0.375465 0.0283915 -0.0735984 +-0.338326 -0.101729 -0.0644858 +0.385731 0.0410156 -0.0783009 +-0.213228 -0.093363 -0.0274686 +-0.441221 -0.0812466 -0.106287 +-0.406087 0.110358 -0.0928539 +0.218795 0.0792893 -0.027456 +-0.165576 0.117597 -0.0208394 +-0.0519065 -0.0299461 -0.00179714 +0.251796 0.0746328 -0.0351018 +0.366302 0.107827 -0.0757726 +-0.0611269 0.112127 -0.008188 diff --git a/image_analysis/indexing/fast-feedback-indexer/data/image2_local.txt b/image_analysis/indexing/fast-feedback-indexer/data/image2_local.txt new file mode 100644 index 000000000..5070da280 --- /dev/null +++ b/image_analysis/indexing/fast-feedback-indexer/data/image2_local.txt @@ -0,0 +1,296 @@ +36.9 0 0 4.83429e-15 78.95 0 4.83429e-15 4.83429e-15 78.95 +0.0479967 0.474941 -0.121292 +0.399211 -0.0273231 -0.083548 +0.0464978 -0.464864 -0.11584 +-0.357159 0.289065 -0.111812 +-0.30387 -0.242897 -0.0787706 +-0.19173 0.136724 -0.0281223 +0.222247 0.137467 -0.0347491 +-0.213269 -0.272766 -0.0618553 +0.27117 -0.0767176 -0.0405307 +0.370658 -0.0746782 -0.0742376 +0.307124 -0.0780657 -0.0515376 +0.00974045 0.40101 -0.0839782 +-0.201626 -0.215004 -0.0444267 +-0.225639 0.3693 -0.0984985 +0.458623 -0.0761412 -0.114637 +0.178722 0.0999278 -0.0211881 +-0.441076 -0.0806138 -0.106158 +-0.383818 -0.0827722 -0.0803085 +0.390953 -0.0897702 -0.0839775 +-0.365728 -0.225563 -0.0970246 +-0.338314 -0.10166 -0.064474 +0.216773 -0.337433 -0.0839495 +-0.458653 -0.103008 -0.117375 +-0.315489 -0.189675 -0.0702204 +0.401171 -0.209253 -0.108218 +-0.382679 -0.108267 -0.0824842 +0.0691706 -0.4781 -0.124422 +-0.349123 -0.115804 -0.070106 +-0.0322203 0.270032 -0.0376878 +0.152476 -0.42984 -0.110062 +-0.188228 0.195166 -0.0374614 +0.462548 -0.114971 -0.120892 +-0.0246242 -0.219879 -0.0247836 +-0.311886 0.182894 -0.0676497 +0.192201 0.164185 -0.0324762 +0.207054 -0.132632 -0.0307026 +0.17357 -0.392724 -0.0968714 +0.426804 -0.0322101 -0.0962297 +-0.269983 -0.336006 -0.0976646 +-0.208175 -0.0855005 -0.0256526 +-0.164978 0.287118 -0.0564186 +0.202213 -0.185139 -0.0383175 +0.421646 -0.133273 -0.103087 +0.360398 -0.136789 -0.0772855 +0.472943 -0.00352434 -0.118914 +0.270101 -0.0866176 -0.0410721 +0.265759 -0.272604 -0.075306 +0.447743 -0.138522 -0.116633 +-0.297535 -0.147628 -0.0567721 +-0.411377 -0.140247 -0.0993894 +-0.223999 -0.151737 -0.0372952 +0.22879 -0.147717 -0.0377968 +-0.320148 -0.218007 -0.0780574 +-0.177713 -0.159262 -0.0288905 +0.392669 -0.148839 -0.0924441 +0.0156572 -0.462073 -0.113296 +-0.344842 0.131966 -0.0706622 +-0.34279 -0.154434 -0.0733688 +0.0517887 -0.165637 -0.0151739 +0.354758 0.26106 -0.102228 +0.195079 0.374553 -0.0935487 +0.24977 -0.162621 -0.0454481 +0.162352 -0.406314 -0.100806 +0.116043 -0.168616 -0.0211727 +0.344163 -0.16039 -0.0748909 +-0.235539 -0.166615 -0.0425238 +0.406582 -0.156923 -0.0999633 +0.180618 -0.170205 -0.0312857 +-0.415556 0.0483034 -0.0917157 +-0.0392825 0.379654 -0.0757058 +0.371519 0.23662 -0.102234 +-0.388595 -0.162773 -0.0930828 +0.432884 -0.162271 -0.113276 +-0.207393 -0.176743 -0.0378409 +0.0022205 -0.139866 -0.00983212 +0.317778 -0.173948 -0.0679276 +0.437762 0.0876908 -0.105196 +-0.0645272 0.391569 -0.0821166 +0.0636712 0.31481 -0.0529831 +-0.276842 -0.0295996 -0.0395407 +-0.180732 -0.187743 -0.0345527 +-0.440344 -0.172176 -0.118835 +-0.127611 0.408164 -0.0960546 +-0.41685 -0.235546 -0.122074 +-0.29142 -0.186168 -0.0616954 +0.444618 0.098496 -0.109711 +-0.183447 -0.444279 -0.123094 +-0.211805 0.2161 -0.0468792 +-0.218623 -0.191606 -0.043187 +0.427278 -0.214318 -0.121649 +-0.113473 -0.196098 -0.0260032 +-0.356956 -0.0282442 -0.066306 +0.336358 0.285184 -0.102485 +-0.303989 -0.109362 -0.0536223 +0.343034 0.183906 -0.0788561 +-0.477983 0.0233883 -0.121942 +0.223432 -0.200037 -0.0460276 +0.359253 0.158388 -0.0802986 +-0.336873 -0.192936 -0.0784296 +0.278918 0.0247653 -0.0400044 +-0.190414 -0.20147 -0.0391919 +0.255298 0.249504 -0.0658851 +-0.295832 0.319777 -0.0998743 +-0.325845 0.110442 -0.0610496 +0.0932655 0.368519 -0.0750701 +-0.123874 -0.209773 -0.0301286 +-0.20704 0.338673 -0.0821576 +0.189521 0.363457 -0.08787 +-0.359853 0.117548 -0.0744255 +0.284443 0.189791 -0.0602811 +0.111248 -0.220231 -0.0309168 +0.307734 -0.168965 -0.0636505 +-0.371189 -0.186218 -0.0903066 +-0.0876209 -0.419949 -0.0966921 +-0.134934 -0.224156 -0.0348331 +-0.21624 -0.226055 -0.0501898 +-0.0357843 -0.233668 -0.0283424 +-0.434217 -0.212061 -0.124508 +-0.421739 0.200048 -0.115626 +-0.140745 -0.19323 -0.0289938 +0.132352 -0.236036 -0.037311 +-0.352644 -0.222675 -0.0911228 +-0.400173 -0.218382 -0.10996 +0.325798 0.208056 -0.0777372 +-0.146975 -0.280528 -0.0514736 +0.443208 -0.190935 -0.124152 +-0.0976902 -0.247118 -0.0359515 +0.25514 -0.243765 -0.0643281 +-0.285339 -0.283701 -0.0845246 +0.296609 0.267828 -0.0833262 +-0.162638 -0.212443 -0.036456 +0.0692313 0.3681 -0.072795 +-0.382584 -0.242761 -0.108542 +-0.310531 0.359802 -0.120163 +0.0333499 0.380664 -0.0758881 +-0.264995 -0.257939 -0.0708901 +-0.241329 -0.261629 -0.0654892 +0.248674 -0.0721677 -0.0341051 +-0.390372 -0.0215181 -0.0795943 +0.00288575 -0.273322 -0.0380818 +-0.0560007 -0.463723 -0.115791 +-0.20619 0.0641754 -0.0235948 +0.0606272 0.369019 -0.0725577 +-0.175656 -0.397125 -0.0992022 +0.0121652 -0.386952 -0.0779806 +0.012388 -0.302951 -0.0470744 +0.129623 -0.406637 -0.0956527 +-0.0988124 -0.391876 -0.0853037 +0.230827 -0.400467 -0.113239 +0.274575 -0.343503 -0.101883 +0.464738 0.0828669 -0.118438 +0.419867 0.16092 -0.106794 +-0.357205 0.175851 -0.0826774 +-0.214084 -0.357276 -0.0908675 +-0.0603684 -0.346593 -0.0639289 +-0.152837 0.139376 -0.0216263 +0.00189747 -0.316066 -0.0512648 +0.0547157 -0.4166 -0.092558 +-0.287169 -0.352893 -0.109494 +0.119503 -0.419223 -0.100016 +-0.196048 -0.163361 -0.033109 +0.185931 -0.251166 -0.0500815 +-0.394826 0.124155 -0.0896714 +-0.165291 -0.426289 -0.110643 +0.399937 0.0214001 -0.083707 +-0.214288 -0.137654 -0.0329777 +-0.383844 0.251242 -0.111439 +0.0282231 0.144968 -0.0109663 +0.26743 0.214628 -0.0606301 +0.2557 0.0070088 -0.0332693 +-0.107612 -0.277282 -0.045257 +-0.00571373 -0.447068 -0.105518 +-0.2605 0.3764 -0.11092 +0.365988 -0.21824 -0.0953323 +0.129875 0.0152017 -0.00858619 +-0.350149 -0.292335 -0.110092 +0.318131 0.140418 -0.0624097 +0.087343 0.332154 -0.0608275 +0.369682 -0.152455 -0.0834342 +0.152275 0.225728 -0.0377841 +0.184511 -0.379305 -0.093312 +-0.241816 -0.346277 -0.0935692 +-0.219034 0.153556 -0.0364418 +-0.0240816 0.225753 -0.0261131 +-0.19703 -0.0717863 -0.0222342 +-0.314797 -0.300391 -0.0996292 +-0.280141 0.343601 -0.103641 +-0.349487 -0.334939 -0.124972 +0.390822 -0.180518 -0.0974086 +-0.269374 -0.293472 -0.0827695 +0.125022 0.303022 -0.0552527 +0.20609 -0.351109 -0.0866274 +-0.288433 -0.310965 -0.0944023 +-0.196434 0.239429 -0.0491648 +0.0662894 -0.363353 -0.0707096 +-0.0420174 0.369785 -0.0718333 +0.0867888 -0.418523 -0.0959502 +-0.476137 -0.0250198 -0.120985 +-0.425107 -0.0147338 -0.094977 +0.349901 -0.284249 -0.107379 +0.374523 0.133055 -0.0823787 +-0.348309 -0.249559 -0.0964509 +0.348289 0.250442 -0.0966873 +-0.281618 -0.172086 -0.0560307 +-0.346358 0.189769 -0.0812924 +-0.302523 0.0893907 -0.051059 +-0.194757 -0.415571 -0.111534 +-0.173312 0.218646 -0.0397101 +0.050548 -0.459366 -0.113193 +-0.331467 -0.274322 -0.0972948 +0.466064 0.0344791 -0.115921 +-0.438744 0.0683951 -0.103995 +-0.413755 0.155373 -0.102968 +0.275711 0.346025 -0.1032 +0.195726 -0.323686 -0.074301 +0.41739 0.102928 -0.0971206 +0.275398 -0.301102 -0.0870414 +0.313068 -0.292966 -0.0965846 +0.356136 0.100152 -0.0709483 +0.291432 -0.101623 -0.0488217 +0.31248 -0.33541 -0.111261 +-0.428044 0.0826124 -0.100026 +-0.0594253 -0.389001 -0.0806813 +0.196674 -0.280501 -0.0605116 +-0.137418 -0.394334 -0.0913653 +-0.285214 0.220422 -0.0672259 +0.335753 0.297603 -0.106298 +-0.147329 -0.365369 -0.08087 +-0.205758 0.402695 -0.108092 +-0.235159 0.237335 -0.0574648 +0.0716796 0.270099 -0.0398393 +-0.277277 0.288976 -0.0836976 +-0.0840014 0.420832 -0.0967591 +0.334073 0.114712 -0.0644593 +-0.371488 0.103641 -0.0773651 +0.158109 0.365873 -0.0828637 +-0.417639 -0.102247 -0.0971584 +0.00831219 0.336796 -0.058459 +0.128217 -0.329052 -0.0644333 +0.0334791 -0.401788 -0.0848796 +-0.319113 0.22756 -0.0800092 +-0.241263 -0.30335 -0.0781697 +0.205961 0.274833 -0.0608266 +-0.331769 -0.316976 -0.111487 +0.125987 -0.00297608 -0.00797263 +0.176055 -0.292902 -0.0602059 +-0.425754 0.0343591 -0.0958139 +-0.134058 0.22153 -0.0341052 +0.26453 -0.357832 -0.104466 +0.123875 0.189921 -0.0260467 +-0.0144604 0.332276 -0.0569285 +0.19551 -0.36528 -0.0898648 +-0.345105 0.303106 -0.111727 +0.292455 -0.296395 -0.0908135 +-0.364779 0.220402 -0.0953681 +0.349265 -0.326885 -0.121843 +0.181267 0.231592 -0.0442241 +0.173412 0.163683 -0.0288481 +0.342442 0.295621 -0.108181 +-0.353212 0.183181 -0.0825656 +0.378762 -0.277258 -0.117012 +-0.338395 0.258106 -0.0950856 +0.0816983 -0.0259043 -0.00367959 +-0.31123 -0.0216444 -0.0499118 +-0.288701 0.161794 -0.0563504 +0.396195 0.117938 -0.0894394 +0.112034 0.224852 -0.0320692 +0.111666 0.000941443 -0.00625461 +0.419863 0.00635296 -0.0924348 +0.172826 0.00843834 -0.0150838 +0.294956 0.154638 -0.0570852 +-0.0479867 0.0209712 -0.0013722 +-0.294318 0.383483 -0.124604 +-0.038867 0.315964 -0.0520253 +-0.405954 0.110254 -0.0927813 +-0.404208 0.0617794 -0.0874219 +-0.166979 0.067134 -0.0163277 +-0.279018 0.0687802 -0.0421804 +-0.129112 0.344271 -0.0700497 +0.314527 0.0814943 -0.054256 +0.255228 0.0876241 -0.0370978 +-0.203882 0.171747 -0.0361871 +-0.460606 0.110094 -0.119249 +-0.151324 0.366158 -0.0818337 +0.284205 0.302229 -0.0901182 +-0.28474 0.32709 -0.0989254 +-0.261541 0.312901 -0.086934 +0.329485 0.158576 -0.0692513 +0.212631 0.23027 -0.0503874 +0.382352 0.201116 -0.0981355 +0.201181 0.265283 -0.0570518 +-0.188039 0.308831 -0.0676565 +-0.14863 0.374923 -0.0849361 +0.235291 0.328817 -0.0853865 +-0.0859629 0.356721 -0.0697524 diff --git a/image_analysis/indexing/fast-feedback-indexer/data/image2_peakfinder8.txt b/image_analysis/indexing/fast-feedback-indexer/data/image2_peakfinder8.txt new file mode 100644 index 000000000..005f62b9c --- /dev/null +++ b/image_analysis/indexing/fast-feedback-indexer/data/image2_peakfinder8.txt @@ -0,0 +1,877 @@ +36.9 0 0 4.83429e-15 78.95 0 4.83429e-15 4.83429e-15 78.95 +-0.221148 -0.727564 -0.350582 +-0.0178892 -0.741945 -0.329777 +0.177922 -0.712481 -0.32124 +0.00573844 -0.720034 -0.306085 +0.238195 -0.681599 -0.308128 +-0.306298 -0.667501 -0.321307 +-0.205851 -0.682915 -0.299106 +-0.334086 -0.656871 -0.324051 +-0.139111 -0.690584 -0.290252 +0.317267 -0.659936 -0.318952 +-0.227282 -0.668378 -0.291753 +0.0787202 -0.681563 -0.272488 +0.0468244 -0.680576 -0.26882 +0.0962112 -0.663942 -0.258431 +0.171879 -0.652971 -0.262378 +0.215045 -0.640306 -0.262597 +0.081441 -0.645388 -0.240499 +-0.51296 -0.55649 -0.346402 +0.0491511 -0.644348 -0.236848 +-0.113492 -0.633577 -0.23469 +-0.246211 -0.616909 -0.252468 +0.0664976 -0.626301 -0.22326 +-0.0365819 -0.626779 -0.221662 +0.358715 -0.578172 -0.26717 +-0.223059 -0.595978 -0.228602 +-0.0193889 -0.609725 -0.207624 +0.370871 -0.565156 -0.263079 +0.202268 -0.584398 -0.214146 +0.417172 -0.541929 -0.270424 +-0.00197146 -0.591775 -0.193899 +0.28258 -0.564268 -0.224275 +-0.463536 -0.518713 -0.281619 +-0.299568 -0.558372 -0.226385 +-0.198737 -0.573203 -0.205052 +0.112169 -0.578246 -0.191885 +-0.327084 -0.547287 -0.229615 +0.25641 -0.558006 -0.21077 +0.187269 -0.56551 -0.196801 +-0.584733 -0.467118 -0.336759 +0.0155043 -0.573602 -0.181013 +-0.114863 -0.564054 -0.18229 +-0.247669 -0.547325 -0.200566 +-0.0761546 -0.561299 -0.175898 +-0.275808 -0.536874 -0.202695 +-0.475702 -0.490862 -0.270094 +0.140431 -0.546603 -0.174467 +-0.202709 -0.540967 -0.18375 +-0.0975171 -0.546367 -0.168151 +-0.0587149 -0.54349 -0.16264 +-0.331002 -0.514453 -0.20894 +0.183809 -0.534127 -0.17482 +0.0114615 -0.541193 -0.15918 +0.436669 -0.483455 -0.241323 +-0.118831 -0.531464 -0.161295 +-0.0801559 -0.528548 -0.154889 +-0.189526 -0.490153 -0.149218 +-0.29222 -0.47609 -0.170575 +-0.0127724 -0.493773 -0.130503 +-0.318321 -0.463939 -0.1733 +0.234674 -0.47386 -0.151245 +0.444624 -0.436061 -0.217594 +0.133619 -0.480354 -0.133163 +0.101539 -0.4798 -0.128517 +-0.380173 -0.445517 -0.189455 +0.0692197 -0.47821 -0.124486 +-0.172027 -0.472359 -0.135544 +0.176291 -0.467394 -0.133707 +-0.133584 -0.469245 -0.127094 +-0.506045 -0.403542 -0.237719 +0.0464977 -0.464864 -0.11584 +-0.0559982 -0.463678 -0.115768 +0.0156435 -0.462236 -0.113381 +0.18794 -0.45432 -0.129212 +0.429931 -0.417511 -0.199473 +-0.183459 -0.444173 -0.123043 +0.198644 -0.441704 -0.125107 +0.267953 -0.433775 -0.139744 +0.439443 -0.402978 -0.197193 +-0.0057727 -0.44725 -0.10561 +-0.523009 -0.379077 -0.236611 +-0.0270048 -0.432384 -0.0987148 +-0.339252 -0.406268 -0.151558 +-0.165233 -0.426209 -0.110593 +-0.441992 -0.385133 -0.189867 +-0.194639 -0.415678 -0.111559 +0.151285 -0.420103 -0.105223 +-0.0878645 -0.420281 -0.09687 +0.289879 -0.405521 -0.133096 +0.119382 -0.419278 -0.100026 +0.629302 -0.328572 -0.295713 +0.0869512 -0.418588 -0.0959957 +0.0547477 -0.416684 -0.0925985 +0.399254 -0.379092 -0.165204 +0.162456 -0.406323 -0.100828 +0.230924 -0.400389 -0.113229 +-0.322241 -0.388947 -0.136935 +0.129763 -0.406587 -0.0956499 +0.300098 -0.391196 -0.129996 +0.337654 -0.38306 -0.140201 +-0.175823 -0.397347 -0.0993325 +0.373496 -0.373935 -0.151075 +0.0334822 -0.401896 -0.0849269 +-0.418176 -0.36314 -0.167378 +0.173574 -0.392827 -0.0969167 +0.476025 -0.351692 -0.193952 +-0.137418 -0.394334 -0.0913653 +-0.204381 -0.386449 -0.100619 +-0.0988139 -0.39181 -0.0852754 +0.347471 -0.368742 -0.137855 +-0.059356 -0.388893 -0.0806311 +0.452293 -0.347088 -0.17844 +0.0122241 -0.387105 -0.0780452 +0.184555 -0.379234 -0.0932912 +-0.0641216 -0.385144 -0.0793738 +-0.36664 -0.352762 -0.139108 +-0.401413 -0.346049 -0.151992 +-0.579945 -0.308191 -0.24589 +-0.434994 -0.338395 -0.165572 +0.0221452 -0.374106 -0.0728784 +0.195499 -0.365227 -0.0898411 +0.264544 -0.357741 -0.104434 +-0.147422 -0.365396 -0.0808958 +0.564893 -0.305467 -0.233459 +-0.287131 -0.352958 -0.109508 +-0.21406 -0.357532 -0.0909622 +0.436033 -0.327844 -0.16191 +-0.0699084 -0.359975 -0.0696608 +0.00184026 -0.358221 -0.0663648 +0.20616 -0.351251 -0.0866979 +-0.349552 -0.335141 -0.125075 +-0.242018 -0.346518 -0.0937149 +0.274715 -0.343616 -0.101969 +-0.492911 -0.310819 -0.187331 +-0.38548 -0.328315 -0.137669 +0.410691 -0.322883 -0.14731 +0.3124 -0.335489 -0.111263 +0.478493 -0.309842 -0.17839 +-0.451874 -0.313572 -0.164846 +-0.269954 -0.335903 -0.0976175 +-0.632474 -0.270492 -0.274183 +0.34928 -0.326868 -0.121842 +-0.0601834 -0.346495 -0.0638808 +0.216795 -0.337391 -0.0839393 +0.580272 -0.281777 -0.235875 +0.384926 -0.317688 -0.133452 +0.550074 -0.286565 -0.21559 +0.518351 -0.291015 -0.195872 +0.322318 -0.321291 -0.10956 +0.005644 -0.339284 -0.0593329 +-0.331915 -0.317111 -0.11159 +-0.509413 -0.28572 -0.188296 +-0.185642 -0.325462 -0.0728476 +0.128217 -0.329052 -0.0644333 +-0.00858339 -0.329967 -0.0560464 +0.195726 -0.323686 -0.074301 +-0.435845 -0.296223 -0.150123 +-0.147753 -0.323229 -0.0652851 +-0.288046 -0.310723 -0.094196 +-0.213948 -0.314919 -0.0753097 +0.595621 -0.258271 -0.239387 +-0.0691561 -0.317188 -0.0541623 +0.00197489 -0.316155 -0.0512945 +0.565636 -0.262985 -0.218402 +0.436954 -0.285485 -0.147023 +-0.314845 -0.300242 -0.099596 +0.53467 -0.267663 -0.198449 +0.207056 -0.308982 -0.0717447 +-0.24139 -0.303513 -0.0782566 +0.0763569 -0.313316 -0.0534258 +0.275464 -0.301203 -0.0870946 +-0.34941 -0.292421 -0.10983 +0.313069 -0.293082 -0.0966226 +0.411433 -0.280504 -0.132798 +-0.0595099 -0.304126 -0.0492288 +-0.451703 -0.271167 -0.15004 +-0.269374 -0.293472 -0.0827695 +0.0122521 -0.302917 -0.0470618 +0.349886 -0.284269 -0.10738 +-0.157819 -0.294732 -0.0575425 +0.385288 -0.275187 -0.119191 +0.176055 -0.292902 -0.060206 +-0.632703 -0.227946 -0.259914 +-0.331437 -0.274449 -0.097322 +0.55031 -0.244074 -0.20151 +-0.185345 -0.283659 -0.0591574 +0.0227432 -0.289409 -0.0430647 +-0.0672196 -0.285781 -0.0440655 +-0.0587186 -0.285755 -0.0434979 +-0.00858075 -0.286496 -0.0419571 +0.196719 -0.280478 -0.0605139 +0.428074 -0.257713 -0.13378 +-0.146997 -0.280646 -0.0515119 +0.265772 -0.272691 -0.0753353 +-0.434235 -0.253539 -0.135617 +-0.286186 -0.267781 -0.080005 +-0.107673 -0.277467 -0.0453174 +-0.213239 -0.272487 -0.0617675 +-0.0685643 -0.274126 -0.0407536 +-0.578886 -0.222948 -0.215663 +0.00254409 -0.273289 -0.0380714 +0.170585 -0.269777 -0.0523073 +0.206923 -0.266252 -0.0585688 +-0.241216 -0.261735 -0.0654895 +0.174981 -0.26614 -0.0520806 +0.594626 -0.215898 -0.225528 +-0.348297 -0.249541 -0.0964411 +-0.264869 -0.257881 -0.0708382 +0.564838 -0.220477 -0.204797 +-0.0954724 -0.264197 -0.0402684 +0.376289 -0.246813 -0.106977 +0.312592 -0.250059 -0.0836177 +-0.38271 -0.242724 -0.108586 +-0.238057 -0.254092 -0.0625746 +-0.0587757 -0.261046 -0.0364647 +-0.416923 -0.235571 -0.122115 +-0.491933 -0.225242 -0.159007 +-0.451681 -0.229436 -0.137826 +-0.23076 -0.247619 -0.0590244 +-0.0347281 -0.256619 -0.0341115 +0.185946 -0.251166 -0.0500844 +-0.303871 -0.242981 -0.078793 +0.477957 -0.224499 -0.15079 +0.153452 -0.251079 -0.0442742 +0.255196 -0.243859 -0.0643678 +-0.0464408 -0.247124 -0.0321297 +-0.0980513 -0.247041 -0.0359685 +0.0561932 -0.247434 -0.032726 +-0.25776 -0.236011 -0.0630587 +0.292125 -0.23584 -0.0731545 +-0.0705472 -0.245002 -0.0330474 +-0.365721 -0.225676 -0.0970501 +0.579053 -0.196759 -0.208809 +0.16477 -0.236206 -0.0423687 +-0.400074 -0.218337 -0.109905 +-0.167885 -0.235084 -0.0426339 +0.132231 -0.235969 -0.0372779 +-0.150703 -0.23426 -0.0395776 +0.427286 -0.214305 -0.121649 +-0.179959 -0.232778 -0.0442651 +-0.434265 -0.212036 -0.124526 +0.229207 -0.228949 -0.0539309 +-0.0357901 -0.233817 -0.0283783 +0.0678685 -0.233446 -0.0300016 +0.366082 -0.218288 -0.0953817 +-0.296832 -0.223184 -0.0715177 +0.64426 -0.177964 -0.256186 +-0.21624 -0.226055 -0.0501898 +-0.177733 -0.228149 -0.0427334 +0.000307171 -0.232114 -0.0273115 +0.302157 -0.221392 -0.0728072 +0.525983 -0.196582 -0.172536 +-0.320213 -0.218122 -0.0781073 +0.0599404 -0.228357 -0.0282694 +0.401006 -0.209173 -0.108125 +-0.134902 -0.22416 -0.0348296 +0.30118 -0.216133 -0.0712499 +-0.0502903 -0.225128 -0.0269697 +0.111206 -0.22017 -0.0308982 +0.124502 -0.223463 -0.0332717 +0.143295 -0.221443 -0.0354123 +0.468574 -0.196026 -0.138599 +-0.0246968 -0.219863 -0.024782 +-0.274783 -0.211204 -0.061977 +-0.201626 -0.215004 -0.0444267 +-0.538478 -0.183576 -0.1776 +-0.162693 -0.212612 -0.0365027 +-0.457052 -0.189663 -0.131017 +0.443258 -0.190952 -0.12418 +-0.123892 -0.209893 -0.0301569 +0.685768 -0.153665 -0.288587 +0.250815 -0.203176 -0.053527 +0.318828 -0.198348 -0.0731739 +-0.0595551 -0.208006 -0.0236872 +0.0918919 -0.206513 -0.0258808 +-0.337006 -0.193249 -0.0785438 +-0.190449 -0.201539 -0.0392132 +-0.0136794 -0.205625 -0.0214647 +0.122974 -0.204887 -0.0289703 +0.22334 -0.200023 -0.0460029 +-0.264127 -0.198735 -0.056209 +-0.0505099 -0.205846 -0.02272 +0.540044 -0.173025 -0.176341 +-0.157414 -0.201334 -0.0332088 +0.600472 -0.163591 -0.217267 +0.355625 -0.189378 -0.0847585 +-0.37118 -0.186265 -0.0903128 +-0.315489 -0.189675 -0.0702204 +-0.113322 -0.196152 -0.0259966 +0.483618 -0.172379 -0.141863 +-0.218578 -0.191464 -0.0431483 +0.390949 -0.180665 -0.0974932 +-0.291604 -0.186423 -0.0618029 +-0.481249 -0.168819 -0.139826 +-0.440236 -0.172264 -0.118798 +-0.00266959 -0.192228 -0.0186532 +-0.180525 -0.187808 -0.0345265 +0.20219 -0.185111 -0.0383073 +0.458766 -0.167379 -0.12735 +0.239497 -0.17834 -0.0456227 +0.270538 -0.177635 -0.0538209 +-0.207516 -0.176802 -0.0378784 +-0.591114 -0.145832 -0.206705 +0.432844 -0.162173 -0.113238 +-0.281618 -0.172086 -0.0560307 +-0.147573 -0.177412 -0.0269907 +0.307845 -0.169042 -0.0637006 +-0.38874 -0.16282 -0.0931535 +-0.23562 -0.16666 -0.0425515 +0.180652 -0.170177 -0.031287 +-0.544148 -0.144625 -0.17357 +0.148507 -0.169582 -0.0257373 +0.406382 -0.156775 -0.0998471 +-0.504401 -0.14791 -0.149293 +0.249859 -0.162684 -0.045482 +0.344155 -0.160285 -0.0748698 +0.116043 -0.168616 -0.0211727 +0.530501 -0.144126 -0.164658 +-0.196868 -0.163174 -0.0332441 +0.0517369 -0.165659 -0.0151749 +-0.343029 -0.154522 -0.073472 +0.473577 -0.143714 -0.131052 +-0.163435 -0.1607 -0.0266221 +-0.249282 -0.15386 -0.0438696 +-0.119357 -0.1571 -0.0196564 +-0.224137 -0.151795 -0.0373366 +-0.297534 -0.147533 -0.0567568 +-0.0805151 -0.154657 -0.0153181 +0.225939 -0.150604 -0.0375706 +-0.411399 -0.140263 -0.0994018 +0.447756 -0.138454 -0.116629 +0.323958 -0.145714 -0.0652174 +0.228804 -0.14777 -0.0378084 +-0.526936 -0.126897 -0.159622 +0.421698 -0.133308 -0.103117 +0.36042 -0.136844 -0.0773021 +-0.25271 -0.140199 -0.0426694 +0.265186 -0.139841 -0.0459975 +-0.213834 -0.138023 -0.0329298 +-0.068954 -0.140713 -0.0123537 +0.574438 -0.115874 -0.189695 +-0.286056 -0.133785 -0.0511726 +0.0022957 -0.139831 -0.00982724 +0.604034 -0.111271 -0.210847 +0.302459 -0.131658 -0.0559742 +0.207112 -0.13262 -0.0307134 +-0.241457 -0.127723 -0.0380305 +0.462537 -0.114865 -0.120872 +0.243635 -0.12451 -0.0381583 +0.611296 -0.101252 -0.215102 +0.494823 -0.110331 -0.138039 +-0.349147 -0.116002 -0.0701396 +0.31268 -0.117149 -0.0573932 +0.376028 -0.113215 -0.0803343 +-0.63351 -0.0942602 -0.232028 +-0.226193 -0.118916 -0.0332033 +0.281336 -0.116836 -0.0475298 +-0.382872 -0.108393 -0.0825796 +-0.0416662 -0.118733 -0.00794837 +0.153859 -0.116656 -0.0188176 +-0.230276 -0.113178 -0.0334786 +-0.304043 -0.109375 -0.0536411 +0.0891825 -0.114524 -0.0105907 +-0.417639 -0.102247 -0.0971584 +-0.338314 -0.10166 -0.064474 +-0.038823 -0.106992 -0.00649842 +0.291381 -0.101621 -0.0488057 +-0.219054 -0.0991967 -0.0293429 +0.417491 -0.0947443 -0.0962717 +-0.0746745 -0.102189 -0.00804182 +-0.0514139 -0.101515 -0.00649542 +-0.00383314 -0.101094 -0.00513053 +0.508932 -0.086742 -0.143575 +-0.29246 -0.0950508 -0.0484578 +0.0291937 -0.0988211 -0.00532311 +0.328009 -0.0931111 -0.0599255 +0.39084 -0.0897326 -0.0839257 +0.540696 -0.0819894 -0.162787 +0.201899 -0.0944966 -0.0251629 +0.484046 -0.0816254 -0.128773 +-0.440971 -0.0806615 -0.106111 +0.270197 -0.0866832 -0.0411051 +-0.482292 -0.0773982 -0.127415 +-0.208203 -0.0854411 -0.0256534 +-0.251345 -0.0829331 -0.035662 +-0.061029 -0.0854721 -0.0055303 +0.00199258 -0.0860132 -0.003708 +0.458709 -0.076274 -0.114693 +-0.561844 -0.0708813 -0.175799 +-0.0731904 -0.0845103 -0.00626907 +0.307125 -0.0780746 -0.0515388 +0.27117 -0.0767176 -0.0405307 +0.370564 -0.0742979 -0.0741694 +-0.0915108 -0.0772487 -0.0071967 +0.148142 -0.0781054 -0.014123 +0.432149 -0.071201 -0.101013 +-0.0517726 -0.0777584 -0.00437295 +-0.645646 -0.0592887 -0.238668 +0.115735 -0.077173 -0.0097224 +-0.236723 -0.0742842 -0.0312668 +0.0834327 -0.0756553 -0.00636261 +0.125266 -0.0758575 -0.0107811 +-0.301843 -0.0713016 -0.0493125 +-0.278391 -0.0708046 -0.0421455 +-0.197065 -0.0717953 -0.022242 +0.224858 -0.072005 -0.0282725 +0.248837 -0.0719616 -0.0341317 +-0.306625 -0.0692992 -0.0506957 +0.663694 -0.0544594 -0.253981 +-0.232943 -0.0340939 -0.0281075 +-0.121025 -0.0357122 -0.00799313 +0.104359 -0.0357803 -0.00610415 +0.426618 -0.0321652 -0.0961402 +0.271561 -0.0333439 -0.0381564 +-0.356872 -0.0284308 -0.0662794 +-0.277012 -0.0294404 -0.0395847 +-0.476217 -0.0250798 -0.12103 +0.399211 -0.0273231 -0.083548 +-0.516887 -0.0221127 -0.144232 +0.0816983 -0.0259043 -0.00367959 +-0.390548 -0.0215437 -0.0796694 +0.547808 -0.0199758 -0.163634 +-0.311252 -0.0215481 -0.0499168 +0.49126 -0.0191577 -0.129198 +0.270347 -0.0192514 -0.0374295 +-0.425107 -0.0147338 -0.094977 +0.189477 -0.016422 -0.0182522 +0.523729 -0.01448 -0.148238 +0.465895 -0.0140536 -0.115271 +0.226133 -0.00768433 -0.0259339 +0.472761 -0.00371448 -0.118817 +0.125987 -0.00297608 -0.00797263 +0.111666 0.000941462 -0.00625461 +0.447094 0.00111341 -0.105514 +0.358568 0.00286317 -0.066501 +0.204465 0.00692005 -0.0211506 +0.2557 0.0070088 -0.0332693 +0.419953 0.00621242 -0.0924755 +0.172919 0.00839281 -0.0150998 +-0.622875 0.0108408 -0.217754 +-0.576745 0.0115656 -0.183158 +0.129875 0.0152017 -0.00858619 +-0.204926 0.0157516 -0.0213494 +-0.277809 0.0200228 -0.0395724 +-0.165626 0.0186159 -0.013987 +0.0833783 0.0186159 -0.00365593 +0.337305 0.0179507 -0.0587757 +-0.0479867 0.0209712 -0.0013722 +0.399969 0.0214568 -0.0837226 +0.278985 0.0247109 -0.0400225 +-0.47818 0.0235211 -0.122053 +0.516985 0.0239584 -0.144341 +-0.658463 0.0237114 -0.247761 +0.188592 0.0322633 -0.0184745 +0.315901 0.0330566 -0.051784 +0.492144 0.0290529 -0.129971 +-0.267232 0.033762 -0.0369595 +0.548702 0.0287934 -0.164478 +-0.0449591 0.0359499 -0.00165824 +-0.425691 0.0342699 -0.0957808 +0.466114 0.034406 -0.115945 +0.256899 0.0393904 -0.0343649 +-0.256232 0.0473868 -0.0345468 +0.293513 0.0478538 -0.0452434 +-0.548947 0.0435335 -0.165277 +-0.415444 0.0482127 -0.09166 +0.140049 0.055643 -0.0114201 +0.203571 0.0556304 -0.0225215 +-0.290497 0.0544535 -0.0446747 +-0.206306 0.063998 -0.0236076 +0.211667 0.0638251 -0.0247443 +-0.490687 0.0578642 -0.130587 +-0.404498 0.062058 -0.0875692 +-0.166994 0.0671541 -0.0163317 +0.641406 0.0520495 -0.234566 +-0.128411 0.0698902 -0.0107448 +0.336773 0.06592 -0.0607245 +-0.279003 0.068704 -0.0421707 +-0.577654 0.0601628 -0.185939 +-0.438744 0.0683951 -0.103995 +0.398692 0.0701627 -0.0856032 +0.54092 0.0670071 -0.161599 +0.697008 0.0571824 -0.28522 +0.647496 0.061526 -0.240419 +-0.478967 0.0720818 -0.125131 +-0.393801 0.0758871 -0.0839421 +0.187169 0.0806728 -0.0209905 +0.217647 0.0812528 -0.0273604 +0.516178 0.0722348 -0.14657 +-0.268513 0.0823639 -0.0402517 +-0.0460681 0.0854172 -0.00472032 +0.314442 0.0814619 -0.0542251 +0.255279 0.0876885 -0.0371172 +0.0308604 0.089647 -0.00450462 +0.490896 0.0774628 -0.132232 +-0.428044 0.0826123 -0.100026 +0.547593 0.0771147 -0.166816 +-0.302556 0.0894945 -0.0510791 +0.464818 0.0827543 -0.11847 +-0.468711 0.0860758 -0.120852 +-0.0736149 0.0965307 -0.00739602 +-0.00296761 0.0978384 -0.00480211 +0.437881 0.0878306 -0.105267 +-0.218529 0.0991863 -0.0292234 +0.178722 0.0999278 -0.0211881 +-0.179667 0.101885 -0.0215628 +-0.417037 0.0965755 -0.096256 +0.35611 0.100099 -0.0709328 +-0.29208 0.103294 -0.0492006 +0.44459 0.0983898 -0.109686 +-0.549257 0.0921913 -0.169448 +-0.371433 0.103646 -0.0773434 +-0.457896 0.0996638 -0.116599 +0.298167 0.106651 -0.0514631 +0.41745 0.102925 -0.0971478 +-0.325828 0.110472 -0.0610474 +0.239119 0.112683 -0.0355704 +-0.168065 0.116823 -0.0211709 +-0.405954 0.110254 -0.0927813 +0.0128606 0.121179 -0.00745263 +0.334076 0.114737 -0.0644634 +-0.280099 0.117793 -0.0472831 +-0.460532 0.109997 -0.119199 +-0.242307 0.120302 -0.0372879 +-0.538973 0.105842 -0.164353 +-0.359916 0.117564 -0.0744518 +0.254858 0.121513 -0.0406866 +0.27576 0.12115 -0.0464388 +0.396311 0.117966 -0.0894936 +-0.315237 0.124124 -0.0591393 +0.152935 0.130223 -0.0203812 +0.1889 0.128721 -0.0264766 +0.120932 0.131469 -0.0160837 +-0.632321 0.103665 -0.23226 +0.0886252 0.133054 -0.0128616 +-0.394826 0.124155 -0.0896714 +0.312414 0.129197 -0.0588806 +-0.230711 0.134003 -0.0362491 +-0.191761 0.136753 -0.0281326 +0.203466 0.135748 -0.0303743 +-0.15287 0.139349 -0.0216275 +-0.168492 0.139217 -0.0241778 +-0.0510682 0.140697 -0.0112653 +0.222262 0.13743 -0.0347475 +0.374699 0.133045 -0.0824489 +0.487624 0.125836 -0.136062 +0.0282257 0.144976 -0.0109675 +0.318122 0.14029 -0.0623874 +0.259288 0.146107 -0.0453157 +0.494145 0.135846 -0.1413 +-0.219034 0.153556 -0.0364418 +0.224872 0.153855 -0.037835 +-0.254237 0.154841 -0.0453337 +0.295358 0.154325 -0.0571598 +0.468006 0.140752 -0.127556 +0.550242 0.135059 -0.17599 +-0.0981866 0.165862 -0.0187512 +0.20519 0.162379 -0.0348419 +0.1736 0.163847 -0.0289093 +0.192201 0.164185 -0.0324762 +-0.28858 0.16182 -0.0563179 +0.359275 0.158378 -0.0803055 +-0.413673 0.155319 -0.102921 +0.242096 0.170902 -0.0449178 +-0.203899 0.171704 -0.0361832 +-0.164882 0.17479 -0.029298 +0.419886 0.161077 -0.106832 +0.0159341 0.179716 -0.0164105 +-0.277285 0.175733 -0.0554203 +0.336386 0.172932 -0.0742897 +-0.402185 0.169258 -0.100223 +-0.357205 0.175851 -0.0826774 +0.426455 0.171442 -0.111888 +-0.0830837 0.189424 -0.021626 +0.123928 0.190014 -0.0260716 +-0.311872 0.1829 -0.0676463 +-0.639144 0.148428 -0.245372 +0.128297 0.193467 -0.0273178 +0.284653 0.189795 -0.0603453 +-0.22735 0.192713 -0.0454458 +-0.188307 0.19519 -0.0374817 +-0.149305 0.197799 -0.0311947 +0.59064 0.160188 -0.209125 +0.128119 0.198992 -0.0284097 +-0.346328 0.189767 -0.0812807 +0.193648 0.197536 -0.0390214 +0.404721 0.18619 -0.104715 +-0.26224 0.199346 -0.0558117 +0.618598 0.163266 -0.231443 +0.319762 0.197629 -0.0733421 +-0.0672304 0.21379 -0.0254366 +0.00370612 0.214599 -0.0233047 +0.382352 0.20084 -0.0980739 +-0.564225 0.181258 -0.194521 +-0.42166 0.200089 -0.115598 +0.325893 0.208273 -0.0778199 +-0.211749 0.216138 -0.0468752 +0.267397 0.214647 -0.060625 +-0.173312 0.218646 -0.0397101 +-0.134053 0.22153 -0.0341043 +0.0439653 0.222609 -0.0260841 +-0.0938833 0.225022 -0.0301799 +-0.0240431 0.225919 -0.0261507 +0.111793 0.224743 -0.032016 +0.230931 0.219889 -0.0522027 +0.463574 0.201538 -0.137167 +0.152326 0.225687 -0.0377828 +0.172112 0.225082 -0.0409818 +0.388387 0.211489 -0.103101 +-0.285349 0.220494 -0.0672844 +-0.0395234 0.230432 -0.0277145 +-0.0503389 0.233375 -0.028917 +0.525425 0.197781 -0.172466 +-0.409579 0.213786 -0.113129 +0.0514546 0.236777 -0.0297996 +0.500098 0.203394 -0.158256 +0.181124 0.231922 -0.0442771 +0.212707 0.230325 -0.0504179 +-0.364915 0.220583 -0.095467 +-0.319128 0.227457 -0.079989 +0.221395 0.23625 -0.0538657 +0.365893 0.225796 -0.09715 +-0.23511 0.23721 -0.0574213 +-0.196529 0.239595 -0.0492263 +0.216117 0.239236 -0.0533958 +0.308838 0.233075 -0.0778856 +-0.157526 0.24243 -0.0427052 +-0.118292 0.245411 -0.0378251 +0.248532 0.238854 -0.0612878 +-0.0486992 0.248011 -0.0324676 +0.479729 0.218399 -0.150199 +0.124926 0.248149 -0.0393671 +-0.353662 0.234656 -0.0945392 +-0.209729 0.246628 -0.053856 +-0.26996 0.244005 -0.0685586 +0.371519 0.23662 -0.102234 +-0.439989 0.230777 -0.132157 +0.255442 0.249482 -0.0659187 +0.560361 0.212376 -0.199443 +-0.590421 0.20795 -0.220154 +0.51122 0.223416 -0.170097 +-0.0587586 0.262082 -0.036745 +0.458766 0.233481 -0.142667 +0.15561 0.261645 -0.0474625 +-0.219285 0.260654 -0.0598013 +-0.181005 0.263273 -0.0524111 +0.348591 0.25056 -0.0968365 +-0.14193 0.266078 -0.0465545 +0.290785 0.257244 -0.0784415 +0.104197 0.268554 -0.0423874 +0.168935 0.266838 -0.0511805 +0.565533 0.221986 -0.205711 +-0.42875 0.24462 -0.130325 +-0.0322743 0.270169 -0.0377283 +0.0716359 0.270152 -0.0398509 +0.201133 0.265364 -0.0570645 +-0.383913 0.251364 -0.111503 +-0.179873 0.268141 -0.0535614 +-0.338431 0.258102 -0.0950978 +0.46445 0.243949 -0.148663 +-0.52066 0.236625 -0.179682 +0.354784 0.261098 -0.10225 +-0.469564 0.247472 -0.152493 +0.296761 0.267994 -0.0834238 +-0.0768357 0.280386 -0.0431929 +0.205833 0.275511 -0.0609972 +-0.0588491 0.282328 -0.0424888 +0.109979 0.280351 -0.0464237 +-0.624913 0.220678 -0.251144 +-0.16369 0.279175 -0.0538144 +0.570634 0.231858 -0.212206 +0.207091 0.281119 -0.0629377 +0.151002 0.284456 -0.0532777 +0.442634 0.2586 -0.141396 +-0.203728 0.284398 -0.0631902 +0.181632 0.285203 -0.0589001 +-0.508993 0.250173 -0.176386 +-0.164995 0.287075 -0.0564085 +0.242974 0.284032 -0.0724821 +-0.125906 0.29067 -0.0514968 +0.086625 0.295239 -0.0485116 +0.0804944 0.298331 -0.0489378 +-0.277277 0.288976 -0.0836976 +0.420147 0.273281 -0.134671 +0.33656 0.285186 -0.102561 +-0.0827031 0.302321 -0.0503884 +0.124081 0.302873 -0.0550812 +-0.401803 0.282002 -0.128777 +-0.356956 0.288873 -0.111667 +-0.604215 0.24848 -0.242912 +-0.311562 0.296105 -0.0970876 +-0.187987 0.308752 -0.0676196 +0.284259 0.302234 -0.0901366 +0.0638284 0.314854 -0.0530085 +0.161247 0.311504 -0.0635362 +0.342542 0.295564 -0.1082 +-0.149023 0.311758 -0.0615977 +0.0961567 0.314196 -0.055524 +0.192394 0.309355 -0.068719 +-0.108151 0.314626 -0.0569657 +-0.038867 0.315964 -0.0520253 +0.584641 0.261254 -0.231924 +-0.344963 0.302992 -0.111633 +0.169121 0.318185 -0.0671783 +-0.135017 0.32037 -0.062379 +-0.261541 0.312901 -0.086934 +-0.106235 0.323255 -0.0596703 +0.0359591 0.325704 -0.0552122 +0.431047 0.293874 -0.146867 +0.402309 0.298122 -0.134396 +-0.0487998 0.326591 -0.0560949 +-0.431324 0.298866 -0.148743 +-0.0144605 0.332276 -0.0569285 +0.087343 0.332154 -0.0608275 +-0.295937 0.319736 -0.0998941 +-0.0628123 0.335848 -0.0601805 +-0.0692248 0.335827 -0.0606236 +0.0083376 0.337 -0.0585324 +0.235272 0.328614 -0.0853087 +0.408262 0.30808 -0.140693 +0.435569 0.303842 -0.152675 +-0.523245 0.290808 -0.198972 +-0.472446 0.30183 -0.171934 +0.11138 0.341605 -0.0667796 +-0.207096 0.338702 -0.082181 +-0.168524 0.341425 -0.0753225 +-0.129106 0.344268 -0.0700477 +0.413401 0.317845 -0.146727 +0.328638 0.329515 -0.114891 +-0.513423 0.304879 -0.197849 +-0.280013 0.34349 -0.103558 +-0.0859556 0.356718 -0.0697505 +0.120432 0.356359 -0.0734449 +0.152758 0.355075 -0.0777275 +0.275809 0.346095 -0.103257 +0.334362 0.339784 -0.120939 +-0.092865 0.359145 -0.07135 +-0.559877 0.30375 -0.229108 +-0.405403 0.336625 -0.150099 +-0.359982 0.343487 -0.132573 +-0.153137 0.36415 -0.0813361 +0.0692313 0.3681 -0.072795 +0.0932615 0.368359 -0.0750058 +-0.0422139 0.369715 -0.0718142 +0.0608576 0.369389 -0.07272 +-0.151324 0.366158 -0.0818337 +0.0309451 0.370412 -0.0716482 +0.158109 0.365873 -0.0828637 +0.189648 0.363646 -0.0879718 +0.281244 0.356885 -0.109194 +0.423392 0.338519 -0.159676 +-0.445582 0.339304 -0.17155 +-0.310658 0.359718 -0.120173 +-0.225614 0.369258 -0.0984752 +-0.187687 0.372041 -0.0909571 +-0.548785 0.317694 -0.226757 +-0.14863 0.374923 -0.0849361 +-0.0392825 0.379654 -0.0757058 +0.0334076 0.380719 -0.075913 +0.195167 0.374607 -0.0935897 +-0.260564 0.376448 -0.110959 +-0.389314 0.36017 -0.152231 +0.037721 0.390042 -0.0799758 +-0.0645272 0.391569 -0.0821166 +0.404505 0.362037 -0.160176 +-0.294331 0.383435 -0.124588 +-0.0624045 0.399777 -0.0855142 +0.00973333 0.401121 -0.0840268 +0.436873 0.367653 -0.179041 +-0.205795 0.402826 -0.10816 +-0.16727 0.405618 -0.101393 +-0.127705 0.408323 -0.0961397 +-0.243878 0.401008 -0.116985 +-0.522806 0.355154 -0.225055 +-0.0842654 0.420816 -0.0967761 +-0.0136732 0.422013 -0.0935132 +-0.324914 0.400316 -0.143158 +0.334042 0.403152 -0.148012 +-0.569671 0.353706 -0.258133 +0.417698 0.39093 -0.179815 +0.0400309 0.456781 -0.111322 +0.0716871 0.455971 -0.112897 +0.136085 0.453016 -0.118945 +0.16846 0.451057 -0.123548 +0.199973 0.4484 -0.128824 +-0.258159 0.442524 -0.141207 +0.2897 0.439916 -0.149972 +0.506184 0.396676 -0.234215 +0.531759 0.390772 -0.248648 +0.556356 0.384775 -0.263511 +-0.0992599 0.462021 -0.118703 +-0.254407 0.451153 -0.144583 +0.204099 0.457913 -0.134749 +-0.337661 0.441259 -0.16857 +-0.383033 0.434569 -0.184871 +0.294242 0.449814 -0.156739 +0.510213 0.40555 -0.241573 +0.0480247 0.474989 -0.12132 +-0.054028 0.475927 -0.122176 +0.208988 0.467692 -0.141171 +-0.663303 0.358288 -0.342993 +0.4879 0.420166 -0.234877 +0.51342 0.414486 -0.248601 +-0.159251 0.481274 -0.138017 +0.213792 0.477626 -0.147846 +0.303 0.469128 -0.170476 +-0.156144 0.489725 -0.142219 +0.0244671 0.495347 -0.13165 +-0.194953 0.487026 -0.148649 +0.389499 0.45878 -0.201369 +0.218323 0.487247 -0.154468 +-0.233109 0.48554 -0.157438 +-0.363178 0.468231 -0.19448 +-0.11281 0.502365 -0.142735 +0.0293203 0.505618 -0.137741 +0.222702 0.496948 -0.161283 +-0.109041 0.512498 -0.148263 +0.0339519 0.515875 -0.144009 +0.396423 0.476364 -0.21519 +0.226972 0.506543 -0.168196 +-0.499821 0.453326 -0.26198 +-0.25937 0.511036 -0.180507 +0.200065 0.519209 -0.169099 +0.290793 0.51116 -0.191202 +-0.0602633 0.534054 -0.1567 +0.431179 0.490647 -0.242801 +-0.055801 0.544007 -0.162777 +0.295323 0.520176 -0.198625 +0.0156506 0.546315 -0.162566 +0.3527 0.512636 -0.21718 +-0.051654 0.554174 -0.169204 +0.0194294 0.554883 -0.168299 +0.213646 0.547218 -0.190736 +-0.156284 0.559472 -0.186018 +-0.195017 0.556082 -0.192076 +-0.151921 0.569187 -0.191949 +-0.190694 0.56658 -0.198362 +0.390739 0.536083 -0.25171 +-0.460679 0.520565 -0.281122 +-0.186573 0.576611 -0.204569 +-0.359043 0.547923 -0.244442 +0.194909 0.577285 -0.207061 +-0.309021 0.564324 -0.234465 +0.285064 0.569537 -0.229048 +-0.0334008 0.594099 -0.196302 +0.0701169 0.593037 -0.197884 +-0.182526 0.586568 -0.210936 +-0.220321 0.583359 -0.218238 +0.167422 0.588866 -0.2093 +-0.305201 0.574194 -0.240294 +0.0745342 0.602264 -0.20519 +0.139693 0.600272 -0.212498 +0.171093 0.598288 -0.217198 +-0.216157 0.593327 -0.224604 +-0.133977 0.608806 -0.218076 +0.111152 0.610616 -0.215912 +-0.21179 0.603142 -0.230998 +0.266152 0.599551 -0.245214 +-0.129547 0.618679 -0.22511 +0.32434 0.592945 -0.262965 +-0.119671 0.637743 -0.239104 +-0.19789 0.632593 -0.251224 +0.0268586 0.650362 -0.24085 +-0.0390333 0.659557 -0.24936 +0.0640347 0.659422 -0.250959 +-0.14947 0.654599 -0.258948 +-0.188153 0.651817 -0.265335 +0.192162 0.652548 -0.267023 +-0.0349245 0.668493 -0.257102 +0.0676922 0.667533 -0.258504 +0.100803 0.667105 -0.261888 +0.164467 0.663343 -0.269982 +-0.116447 0.677061 -0.273344 +0.204686 0.687994 -0.303747 +-0.499078 0.614376 -0.388884 +0.115732 0.710537 -0.305923 +0.267257 0.69036 -0.327708 diff --git a/image_analysis/indexing/fast-feedback-indexer/data/image2_radial.txt b/image_analysis/indexing/fast-feedback-indexer/data/image2_radial.txt new file mode 100644 index 000000000..11e087886 --- /dev/null +++ b/image_analysis/indexing/fast-feedback-indexer/data/image2_radial.txt @@ -0,0 +1,670 @@ +36.9 0 0 4.83429e-15 78.95 0 4.83429e-15 4.83429e-15 78.95 +-0.0540103 0.476055 -0.122245 +0.0480003 0.475029 -0.12134 +-0.053842 0.466925 -0.117344 +-0.0992122 0.462018 -0.118696 +0.168462 0.451078 -0.123559 +0.136085 0.453015 -0.118945 +-0.0549528 0.45669 -0.112073 +0.0716871 0.455971 -0.112897 +0.0403521 0.456775 -0.111333 +0.016007 0.457088 -0.110723 +0.0395219 0.430026 -0.0980488 +-0.0136894 0.422009 -0.0935118 +-0.0842706 0.420836 -0.0967862 +0.153459 0.417156 -0.104215 +-0.00936163 0.419936 -0.0924946 +-0.243878 0.401008 -0.116985 +-0.0160687 0.413071 -0.0894431 +-0.127712 0.408304 -0.0961321 +-0.16727 0.405618 -0.101393 +-0.205785 0.402841 -0.108164 +-0.17151 0.405279 -0.10204 +-0.0679535 0.407664 -0.0894001 +-0.0472216 0.403867 -0.086402 +-0.133057 0.399875 -0.0931396 +0.00975263 0.401132 -0.0840317 +-0.0566653 0.401836 -0.0860434 +-0.0611141 0.399741 -0.0854113 +-0.294331 0.383435 -0.124588 +0.0340906 0.39515 -0.0820163 +0.102023 0.389875 -0.0848011 +-0.0644404 0.391416 -0.0820452 +0.0352375 0.390946 -0.0802613 +-0.260564 0.376448 -0.110959 +0.0379094 0.39021 -0.0800549 +-0.121553 0.381763 -0.0837678 +0.286128 0.366763 -0.114779 +0.195165 0.37458 -0.0935783 +0.0333942 0.380625 -0.0758738 +0.131062 0.377911 -0.0834816 +-0.039523 0.379548 -0.0756725 +-0.148823 0.374965 -0.0849845 +-0.225644 0.369279 -0.0984916 +-0.187622 0.372127 -0.0909789 +-0.310596 0.359733 -0.120158 +-0.158147 0.373275 -0.085858 +-0.147081 0.372284 -0.0836092 +0.281245 0.356885 -0.109194 +0.207747 0.363454 -0.0918467 +0.189667 0.363665 -0.0879832 +0.0610407 0.369527 -0.072787 +0.0309451 0.370412 -0.0716482 +-0.151324 0.366158 -0.0818337 +0.158089 0.365914 -0.0828771 +0.0932867 0.368366 -0.0750111 +-0.0424616 0.369149 -0.0716002 +0.0692313 0.3681 -0.072795 +-0.153172 0.363549 -0.0811036 +-0.15696 0.364462 -0.082105 +0.0363669 0.366568 -0.0703196 +-0.0788992 0.363555 -0.0717744 +0.275809 0.346095 -0.103257 +0.334347 0.339775 -0.12093 +0.152666 0.355012 -0.0776879 +0.0899105 0.358492 -0.0708069 +-0.092865 0.359145 -0.07135 +0.120391 0.356353 -0.073437 +-0.0859564 0.356718 -0.0697506 +-0.280024 0.343476 -0.103557 +-0.15397 0.345262 -0.0742099 +0.32867 0.329463 -0.114884 +-0.129106 0.344268 -0.0700477 +-0.2071 0.338694 -0.0821787 +-0.168524 0.341425 -0.0753225 +0.11138 0.341605 -0.0667796 +-0.28474 0.32709 -0.0989254 +0.00833764 0.337 -0.0585324 +0.147394 0.334196 -0.0690927 +-0.0628124 0.335848 -0.0601805 +-0.191577 0.330734 -0.075926 +-0.0692248 0.335827 -0.0606236 +-0.295937 0.319736 -0.0998941 +0.087343 0.332154 -0.0608275 +-0.0144604 0.332276 -0.0569285 +0.217123 0.322777 -0.0787659 +-0.159613 0.326896 -0.0685158 +0.0359592 0.325704 -0.0552122 +-0.106235 0.323255 -0.0596703 +0.169121 0.318185 -0.0671783 +-0.135017 0.32037 -0.062379 +-0.181426 0.317655 -0.0693122 +-0.344963 0.302992 -0.111633 +0.0638284 0.314854 -0.0530085 +0.284245 0.302255 -0.0901392 +0.238345 0.306838 -0.078565 +0.161247 0.311504 -0.0635362 +0.0961567 0.314196 -0.055524 +-0.038867 0.315964 -0.0520253 +0.192324 0.309533 -0.0687639 +-0.149023 0.311758 -0.0615977 +0.342542 0.295564 -0.1082 +-0.188008 0.308735 -0.0676183 +-0.311483 0.295967 -0.097015 +0.311328 0.292396 -0.0957989 +0.124081 0.302873 -0.0550812 +-0.0827031 0.302321 -0.0503884 +0.33656 0.285186 -0.102561 +0.335753 0.297603 -0.106298 +-0.277277 0.288976 -0.0836976 +0.0804944 0.298331 -0.0489378 +0.0866251 0.295239 -0.0485116 +0.235884 0.285465 -0.0710929 +0.242902 0.283971 -0.0724444 +0.272729 0.27993 -0.0795337 +-0.164999 0.287073 -0.0564087 +-0.238749 0.283561 -0.0712418 +-0.203745 0.284413 -0.0631982 +0.207091 0.281119 -0.0629377 +0.151002 0.284456 -0.0532778 +0.205833 0.275511 -0.0609972 +-0.16369 0.279175 -0.0538144 +0.296787 0.268037 -0.0834447 +-0.0770546 0.280546 -0.0432574 +0.354759 0.261076 -0.102233 +-0.338431 0.258102 -0.0950978 +-0.383876 0.251376 -0.11149 +-0.179873 0.268141 -0.0535614 +0.270184 0.262464 -0.0736559 +0.168935 0.266838 -0.0511805 +0.201133 0.265364 -0.0570645 +0.104283 0.268596 -0.0424088 +0.0716359 0.270152 -0.0398509 +0.290785 0.257244 -0.0784415 +-0.0322203 0.270032 -0.0376878 +0.348591 0.25056 -0.0968365 +-0.14193 0.266078 -0.0465545 +-0.181005 0.263273 -0.0524111 +-0.219285 0.260654 -0.0598013 +-0.0587586 0.262082 -0.036745 +0.255442 0.249482 -0.0659187 +0.371551 0.236532 -0.102224 +-0.26996 0.244005 -0.0685586 +-0.353763 0.234635 -0.094573 +-0.0486991 0.248011 -0.0324676 +-0.118294 0.24541 -0.0378251 +-0.317865 0.234483 -0.0813163 +-0.397972 0.227355 -0.111221 +0.308838 0.233075 -0.0778856 +0.248532 0.238854 -0.0612878 +0.216117 0.239236 -0.0533958 +-0.157526 0.24243 -0.0427052 +-0.196529 0.239595 -0.0492263 +-0.235186 0.237259 -0.0574525 +0.365893 0.225796 -0.09715 +-0.319125 0.22746 -0.0799887 +0.0514549 0.236779 -0.0297999 +-0.364915 0.220583 -0.095467 +0.212707 0.230325 -0.0504179 +0.181124 0.231922 -0.0442771 +0.0848144 0.384078 -0.0806031 +-0.409592 0.213807 -0.11314 +-0.0503121 0.233077 -0.0288442 +-0.320549 0.220238 -0.0787272 +-0.0395234 0.230432 -0.0277145 +0.388371 0.211636 -0.103129 +0.172112 0.225082 -0.0409818 +-0.285349 0.220494 -0.0672844 +0.230931 0.219889 -0.0522027 +0.111793 0.224743 -0.032016 +-0.0938833 0.225022 -0.0301799 +-0.332021 0.212905 -0.0810694 +-0.0240431 0.225919 -0.0261507 +-0.289999 0.215401 -0.0675284 +0.267397 0.214647 -0.060625 +-0.134053 0.22153 -0.0341043 +-0.173312 0.218646 -0.0397101 +0.325893 0.208273 -0.0778199 +-0.35683 0.288879 -0.111619 +-0.42166 0.200089 -0.115598 +-0.211749 0.216138 -0.0468752 +-0.0672306 0.21379 -0.0254367 +0.382352 0.20084 -0.0980739 +0.00370609 0.214599 -0.0233047 +0.319758 0.197604 -0.0733352 +-0.26224 0.199346 -0.0558117 +0.404736 0.186195 -0.104724 +-0.346308 0.189768 -0.0812733 +0.193648 0.197536 -0.0390214 +-0.149305 0.197799 -0.0311947 +0.128119 0.198992 -0.0284097 +-0.188307 0.19519 -0.0374817 +0.152326 0.225687 -0.0377828 +0.284653 0.189795 -0.0603454 +-0.22735 0.192713 -0.0454458 +0.343034 0.183906 -0.0788561 +0.128297 0.193466 -0.0273178 +-0.353212 0.183181 -0.0825656 +-0.311872 0.182899 -0.0676463 +0.123928 0.190014 -0.0260716 +-0.0830837 0.189424 -0.021626 +0.426446 0.171433 -0.111882 +-0.357446 0.176063 -0.0828121 +-0.402153 0.16924 -0.100205 +0.336526 0.17294 -0.0743424 +-0.277285 0.175733 -0.0554203 +0.0162517 0.179325 -0.0163443 +0.419886 0.161052 -0.106827 +-0.164939 0.174792 -0.029308 +0.242091 0.1709 -0.0449162 +-0.203899 0.171704 -0.0361832 +0.278001 0.291765 -0.0848013 +0.359255 0.158367 -0.080296 +-0.413691 0.155293 -0.102925 +-0.28858 0.16182 -0.0563179 +-0.0981866 0.165862 -0.0187512 +0.329485 0.158576 -0.0692513 +0.20519 0.162379 -0.0348419 +0.192201 0.164185 -0.0324762 +0.173583 0.163733 -0.0288869 +-0.372659 0.152291 -0.0846133 +0.295358 0.154325 -0.0571598 +-0.254237 0.154841 -0.0453337 +0.151041 0.414838 -0.102729 +-0.219034 0.153556 -0.0364418 +0.259286 0.146109 -0.0453154 +0.318122 0.14029 -0.0623874 +0.0282257 0.144976 -0.0109675 +0.374699 0.133045 -0.0824489 +-0.15287 0.139349 -0.0216275 +-0.191763 0.136751 -0.0281327 +0.222262 0.13743 -0.0347475 +-0.168492 0.139217 -0.0241778 +-0.0510681 0.140697 -0.0112652 +-0.344842 0.131966 -0.0706622 +0.203466 0.135748 -0.0303743 +-0.230711 0.134003 -0.0362491 +0.312414 0.129197 -0.0588806 +-0.394826 0.124155 -0.0896714 +0.120932 0.131469 -0.0160837 +0.0886252 0.133054 -0.0128616 +0.152935 0.130223 -0.0203812 +0.1889 0.128721 -0.0264766 +-0.315237 0.124124 -0.0591393 +0.396311 0.117966 -0.0894936 +0.207112 -0.13262 -0.0307134 +-0.219055 -0.0991961 -0.0293429 +0.302125 -0.221482 -0.0728181 +-0.21624 -0.226055 -0.0501898 +-0.320213 -0.218122 -0.0781073 +0.195504 -0.365223 -0.0898402 +0.26458 -0.357796 -0.104467 +-0.123892 -0.209893 -0.0301569 +-0.296692 -0.223011 -0.0714312 +0.0678685 -0.233446 -0.0300015 +-0.434188 -0.212036 -0.124488 +-0.0026696 -0.192228 -0.0186532 +0.427286 -0.214305 -0.121649 +-0.218578 -0.191464 -0.0431483 +0.31268 -0.117149 -0.0573932 +-0.416923 -0.235571 -0.122115 +0.164762 -0.236212 -0.0423689 +-0.352644 -0.222675 -0.0911228 +0.132188 -0.235973 -0.0372731 +-0.0915109 -0.0772487 -0.0071967 +0.032413 0.413693 -0.0901606 +-0.167885 -0.235084 -0.0426339 +-0.286283 -0.228002 -0.0693781 +-0.276657 -0.231264 -0.067274 +0.0869512 -0.418588 -0.0959957 +-0.38874 -0.16282 -0.0931535 +0.432139 -0.0712069 -0.101008 +-0.4114 -0.140259 -0.0994015 +-0.365721 -0.225676 -0.0970501 +-0.415447 0.0482253 -0.0916618 +-0.224137 -0.151795 -0.0373366 +0.203571 0.0556304 -0.0225215 +-0.371452 -0.186191 -0.0904086 +-0.25776 -0.236011 -0.0630587 +-0.208203 -0.0854411 -0.0256534 +0.447756 -0.138454 -0.116629 +0.292125 -0.23584 -0.0731545 +-0.0464408 -0.247124 -0.0321297 +-0.478196 0.0234727 -0.122061 +0.0227432 -0.289409 -0.0430647 +-0.0980513 -0.247041 -0.0359685 +-0.304043 -0.109375 -0.0536411 +-0.125906 0.29067 -0.0514968 +-0.241396 -0.303508 -0.0782567 +-0.278997 0.0687026 -0.0421687 +0.319018 -0.198018 -0.0731686 +0.255196 -0.243859 -0.0643678 +-0.331947 -0.317118 -0.111604 +-0.29246 -0.0950509 -0.0484578 +-0.285339 -0.283701 -0.0845246 +-0.0708792 -0.354942 -0.0678025 +0.0561931 -0.247434 -0.032726 +-0.23076 -0.247619 -0.0590244 +0.185946 -0.251166 -0.0500844 +0.153452 -0.251079 -0.0442742 +-0.476217 -0.0250798 -0.12103 +-0.303871 -0.242981 -0.078793 +0.336993 -0.136474 -0.0684365 +-0.400098 -0.218345 -0.109917 +-0.1035 -0.374949 -0.0787502 +0.464838 0.0827664 -0.118481 +-0.0270049 -0.432385 -0.0987153 +0.0291938 -0.0988211 -0.00532312 +-0.301142 -0.362283 -0.11792 +-0.0587757 -0.261046 -0.0364647 +0.0122521 -0.302917 -0.0470618 +-0.382786 -0.242765 -0.10863 +0.312585 -0.250097 -0.0836258 +0.136618 -0.0356394 -0.0100174 +0.119349 -0.419303 -0.100033 +-0.348318 -0.249558 -0.0964539 +-0.126511 -0.382529 -0.0847589 +-0.0952028 -0.26457 -0.0403442 +-0.214203 -0.357474 -0.0909733 +-0.119357 -0.1571 -0.0196564 +-0.265119 -0.258025 -0.0709494 +-0.168065 0.116823 -0.0211709 +0.30118 -0.216133 -0.0712499 +-0.185638 -0.325437 -0.0728379 +-0.241216 -0.261735 -0.0654895 +0.248837 -0.0719615 -0.0341317 +0.419955 0.00621566 -0.0924762 +0.00229573 -0.139831 -0.00982724 +0.206923 -0.266252 -0.0585688 +-0.314882 -0.300194 -0.0995928 +0.148019 -0.438738 -0.11366 +-0.0736149 0.0965307 -0.00739602 +-0.117727 -0.159493 -0.0198458 +-0.230276 -0.113178 -0.0334786 +0.111666 0.000941443 -0.00625461 +0.202191 -0.185113 -0.0383076 +-0.196868 -0.163174 -0.033244 +0.447097 0.00108519 -0.105515 +0.415897 0.00994944 -0.0906428 +0.270538 -0.177636 -0.0538209 +0.437886 0.0878198 -0.105269 +-0.0685643 -0.274126 -0.0407536 +0.00197486 -0.316155 -0.0512945 +-0.0559998 -0.463724 -0.115792 +0.0692278 -0.478202 -0.124483 +-0.261431 0.312932 -0.0869134 +0.249861 -0.16268 -0.045482 +-0.206306 0.0639981 -0.0236076 +-0.107657 -0.277454 -0.0453119 +-0.213239 -0.272487 -0.0617675 +-0.286215 -0.267796 -0.0800185 +0.04684 -0.465028 -0.115944 +0.4064 -0.15679 -0.099858 +0.265785 -0.272666 -0.0753317 +-0.146997 -0.280646 -0.0515119 +0.256899 0.0393904 -0.0343649 +0.174981 -0.26614 -0.0520806 +0.187169 0.0806728 -0.0209905 +-0.0587186 -0.285755 -0.0434979 +0.390841 -0.18054 -0.0974208 +0.196719 -0.280478 -0.0605139 +-0.00858073 -0.286496 -0.0419571 +-0.0672196 -0.285781 -0.0440655 +-0.0705472 -0.245002 -0.0330474 +-0.185345 -0.283659 -0.0591574 +-0.0347281 -0.256619 -0.0341115 +0.337792 -0.272936 -0.0992212 +0.230895 -0.400491 -0.113268 +-0.331437 -0.274449 -0.097322 +0.270197 -0.0866832 -0.0411051 +0.302078 -0.131792 -0.055871 +-0.365933 -0.0886267 -0.0735883 +-0.0595551 -0.208006 -0.0236872 +0.0221543 -0.374112 -0.0728811 +-0.128411 0.0698901 -0.0107448 +0.235272 0.328614 -0.0853087 +0.153859 -0.116656 -0.0188176 +0.41745 0.102925 -0.0971478 +0.176055 -0.292902 -0.0602059 +0.36599 -0.218337 -0.0953561 +0.385163 -0.275254 -0.119157 +0.378762 -0.277258 -0.117012 +0.375992 -0.113215 -0.0803195 +-0.183487 -0.444272 -0.123099 +-0.0699083 -0.359975 -0.0696608 +0.349891 -0.284266 -0.107381 +-0.113322 -0.196152 -0.0259966 +0.190492 -0.35351 -0.0841707 +0.005644 -0.339284 -0.0593329 +-0.0595099 -0.304126 -0.0492288 +-0.269956 -0.335832 -0.0975918 +0.46615 0.0344066 -0.115964 +-0.297534 -0.147533 -0.0567568 +-0.417639 -0.102247 -0.0971584 +0.426588 -0.0321548 -0.0961255 +0.0121844 -0.387134 -0.0780569 +0.189477 -0.016422 -0.0182522 +-0.207513 -0.176808 -0.0378787 +0.20616 -0.351251 -0.0866979 +-0.337002 -0.193237 -0.0785398 +-0.349147 -0.116002 -0.0701396 +0.313098 -0.293115 -0.096643 +0.292455 -0.296395 -0.0908135 +0.275462 -0.301198 -0.0870923 +-0.34941 -0.292421 -0.10983 +0.293512 0.0478547 -0.0452431 +-0.242018 -0.346518 -0.0937149 +0.207049 -0.308966 -0.0717376 +-0.0689541 -0.140713 -0.0123537 +0.000307165 -0.232114 -0.0273115 +0.076357 -0.313316 -0.0534258 +0.239119 0.112683 -0.0355703 +0.173231 -0.351549 -0.0799977 +-0.0691561 -0.317188 -0.0541623 +0.223341 -0.200025 -0.0460037 +0.0891825 -0.114524 -0.0105907 +-0.0746745 -0.10219 -0.00804182 +0.00184027 -0.358221 -0.0663648 +0.376289 -0.246813 -0.106977 +-0.277029 -0.0295148 -0.039592 +0.25527 0.087689 -0.0371148 +-0.238057 -0.254092 -0.0625746 +0.399211 -0.0273231 -0.083548 +-0.376867 -0.0778771 -0.0770124 +-0.213938 -0.314947 -0.0753169 +-0.241457 -0.127723 -0.0380305 +0.228804 -0.147774 -0.0378089 +0.0439653 0.222609 -0.0260841 +0.0547245 -0.416639 -0.0925768 +-0.288046 -0.310723 -0.094196 +0.390854 -0.0897323 -0.0839315 +0.254858 0.121513 -0.0406866 +-0.425705 0.0342072 -0.0957846 +-0.301843 -0.0713016 -0.0493125 +-0.0601834 -0.346495 -0.0638808 +0.265323 -0.31603 -0.0891055 +-0.352854 -0.128286 -0.0731577 +0.195607 -0.323847 -0.0743321 +-0.121862 -0.385706 -0.0854618 +-0.00858786 -0.329907 -0.0560258 +0.180654 -0.170176 -0.0312873 +0.216781 -0.337405 -0.0839411 +0.0156436 -0.462236 -0.113381 +-0.468831 0.0860367 -0.120912 +0.17356 -0.392828 -0.0969145 +0.128217 -0.329052 -0.0644333 +-0.134902 -0.22416 -0.0348296 +0.3124 -0.335489 -0.111263 +-0.253574 -0.140959 -0.0430096 +-0.27781 0.0200258 -0.0395728 +0.129595 -0.406723 -0.0956874 +-0.236723 -0.0742842 -0.0312668 +-0.197065 -0.0717952 -0.022242 +0.322315 -0.321319 -0.109569 +-0.164969 -0.426095 -0.11049 +0.184789 -0.337051 -0.0768262 +-0.359919 0.11756 -0.0744528 +0.125987 -0.00297608 -0.00797263 +-0.315489 -0.189675 -0.0702204 +-0.0772609 -0.384772 -0.0802274 +0.184557 -0.37924 -0.0932942 +0.34928 -0.326868 -0.121842 +-0.0878865 -0.420263 -0.0968637 +-0.269374 -0.293472 -0.0827695 +0.307845 -0.169042 -0.0637006 +-0.256232 0.0473867 -0.0345468 +0.194013 0.315688 -0.0711837 +-0.157414 -0.201334 -0.0332088 +0.355625 -0.189378 -0.0847585 +-0.108151 0.314626 -0.0569657 +-0.0136793 -0.205625 -0.0214647 +0.306464 -0.195926 -0.0684995 +0.172965 -0.34785 -0.0785428 +-0.213834 -0.138023 -0.0329298 +0.178722 0.0999278 -0.0211881 +0.00254405 -0.273289 -0.0380714 +-0.0460682 0.0854171 -0.00472032 +0.0306482 -0.373862 -0.0730221 +0.274726 -0.343601 -0.101967 +-0.356872 -0.0284308 -0.0662794 +0.27117 -0.0767176 -0.0405307 +0.0419159 -0.361408 -0.068535 +0.0334873 -0.401895 -0.0849268 +0.0662894 -0.363353 -0.0707096 +-0.272727 -0.266313 -0.0755016 +0.170585 -0.269777 -0.0523073 +-0.0795316 -0.379822 -0.0783655 +0.143295 -0.221443 -0.0354123 +-0.121025 -0.0357122 -0.00799313 +-0.0968924 -0.351664 -0.0689016 +0.443252 -0.190957 -0.124179 +-0.404579 0.0621727 -0.0876126 +0.2557 0.0070088 -0.0332693 +-0.274783 -0.211204 -0.061977 +-0.371468 0.103639 -0.0773569 +-0.0057704 -0.447266 -0.105617 +-0.187663 -0.359225 -0.0858118 +-0.165626 0.018616 -0.013987 +0.201899 -0.0944966 -0.0251629 +0.399969 0.0214568 -0.0837226 +0.462685 -0.114889 -0.120953 +0.334076 0.114737 -0.0644634 +-0.201626 -0.215004 -0.0444267 +0.44459 0.0983898 -0.109686 +0.0484566 -0.399724 -0.084646 +0.109979 0.280351 -0.0464237 +-0.0481167 -0.376121 -0.0746795 +0.182865 -0.327838 -0.0731331 +-0.194586 -0.415818 -0.111613 +-0.218529 0.0991864 -0.0292234 +-0.0821333 -0.449036 -0.110269 +0.392669 -0.148839 -0.0924441 +0.045018 -0.3923 -0.0812649 +-0.0593257 -0.388794 -0.0805872 +0.370298 -0.0742578 -0.0740598 +0.291381 -0.101621 -0.0488057 +0.0872987 -0.360386 -0.0712906 +-0.0803885 -0.372578 -0.0754877 +-0.175823 -0.397347 -0.0993325 +0.360441 -0.136884 -0.0773162 +0.15561 0.261645 -0.0474626 +-0.0988139 -0.39181 -0.0852754 +-0.0357901 -0.233817 -0.0283783 +0.0816983 -0.0259043 -0.00367959 +-0.302556 0.0894945 -0.0510791 +-0.249282 -0.15386 -0.0438696 +0.050548 -0.459366 -0.113193 +-0.0588491 0.282328 -0.0424888 +-0.268513 0.0823639 -0.0402517 +-0.390548 -0.0215437 -0.0796694 +0.140049 0.0556429 -0.0114201 +-0.2043 -0.386536 -0.100638 +0.162456 -0.406323 -0.100828 +-0.190452 -0.201537 -0.0392134 +0.172919 0.0083928 -0.0150998 +-0.287169 -0.352982 -0.10953 +0.323958 -0.145714 -0.0652174 +-0.418439 -0.0661259 -0.0941655 +-0.0514139 -0.101515 -0.00649542 +0.115735 -0.077173 -0.0097224 +0.356127 0.10009 -0.0709385 +-0.00296767 0.0978385 -0.00480212 +-0.23562 -0.16666 -0.0425514 +-0.0213846 -0.39594 -0.0819726 +0.369682 -0.152455 -0.0834342 +0.111206 -0.22017 -0.0308982 +-0.29208 0.103294 -0.0492006 +0.188591 0.0322633 -0.0184745 +0.307125 -0.0780746 -0.0515388 +-0.147573 -0.177412 -0.0269907 +-0.382875 -0.108387 -0.0825802 +-0.186453 -0.368744 -0.0893611 +-0.204926 0.0157516 -0.0213494 +0.344156 -0.160263 -0.0748665 +-0.0246967 -0.219863 -0.024782 +0.458709 -0.076274 -0.114693 +-0.0641216 -0.385144 -0.0793738 +-0.10216 -0.379729 -0.0805602 +0.0513472 -0.398127 -0.0841078 +-0.417053 0.0965797 -0.096264 +-0.137219 -0.394346 -0.0913407 +0.472761 -0.00371452 -0.118817 +0.432859 -0.162168 -0.113245 +0.134094 -0.398739 -0.0927923 +0.0538939 -0.377312 -0.0754832 +0.139028 -0.388114 -0.0889353 +-0.147753 -0.323229 -0.0652851 +0.204465 0.00692005 -0.0211506 +-0.378004 -0.147429 -0.0860101 +-0.291604 -0.186423 -0.0618029 +-0.0567422 -0.373889 -0.0742637 +0.328009 -0.0931111 -0.0599255 +-0.147422 -0.365396 -0.0808958 +-0.425107 -0.0147338 -0.094977 +-0.0517726 -0.0777585 -0.00437295 +0.116043 -0.168616 -0.0211727 +0.121002 -0.369456 -0.0786636 +-0.441957 -0.0320091 -0.103535 +-0.232943 -0.034094 -0.0281075 +-0.460532 0.109997 -0.119199 +0.226133 -0.0076843 -0.0259339 +-0.286056 -0.133785 -0.0511726 +-0.0805151 -0.154657 -0.0153181 +0.421717 -0.133288 -0.103123 +-0.0416662 -0.118733 -0.00794838 +0.0362612 -0.399628 -0.08404 +-0.038823 -0.106992 -0.00649842 +-0.0731904 -0.0845103 -0.00626907 +0.281336 -0.116836 -0.0475298 +0.0636261 -0.412035 -0.0910564 +-0.157819 -0.294732 -0.0575425 +-0.329935 -0.215668 -0.0809621 +-0.179959 -0.232778 -0.0442651 +-0.0449591 0.0359499 -0.00165824 +0.0642198 -0.404444 -0.0876949 +-0.0187598 -0.389755 -0.0792727 +0.152476 -0.42984 -0.110062 +-0.00383309 -0.101094 -0.00513053 +-0.428044 0.0826124 -0.100026 +-0.342981 -0.154416 -0.0734366 +0.278985 0.0247108 -0.0400225 +-0.251869 -0.139355 -0.0423246 +0.151285 -0.420103 -0.105223 +0.375973 -0.0330651 -0.0739593 +0.0517369 -0.165659 -0.0151749 +-0.0104684 -0.421621 -0.0932883 +0.465895 -0.0140536 -0.115271 +-0.0472067 -0.41669 -0.092178 +-0.440971 -0.0806615 -0.106111 +0.314453 0.0814915 -0.0542312 +-0.280099 0.117793 -0.0472831 +0.181632 0.285203 -0.0589001 +0.176697 -0.0268547 -0.0161011 +0.05981 -0.409109 -0.0894769 +-0.438744 0.0683951 -0.103995 +-0.393824 0.0758459 -0.0839488 +-0.383818 -0.0827722 -0.0803085 +0.315901 0.0330567 -0.051784 +-0.440206 -0.172341 -0.118798 +0.0833783 0.0186159 -0.00365593 +0.211667 0.0638251 -0.0247443 +-0.162693 -0.212612 -0.0365027 +0.0834327 -0.0756553 -0.00636261 +0.0128606 0.121179 -0.00745262 +-0.311252 -0.0215481 -0.0499168 +-0.43809 -0.0660423 -0.103498 +-0.458653 -0.103008 -0.117375 +0.217647 0.0812528 -0.0273604 +-0.267232 0.033762 -0.0369595 +0.148142 -0.0781053 -0.014123 +0.250815 -0.203176 -0.053527 +0.0896952 -0.142921 -0.0143386 +-0.166992 0.0671517 -0.0163313 +0.401006 -0.209173 -0.108125 +-0.0502903 -0.225128 -0.0269697 +0.124502 -0.223463 -0.0332717 +0.338905 -0.21283 -0.0835685 +-0.325828 0.110472 -0.0610474 +0.417491 -0.0947444 -0.0962717 +-0.179667 0.101885 -0.0215628 +0.125266 -0.0758575 -0.0107811 +0.0918919 -0.206513 -0.0258808 +-0.0505099 -0.205846 -0.02272 +0.239497 -0.178095 -0.0455769 +0.398692 0.0701627 -0.0856032 +0.104359 -0.0357803 -0.00610415 +-0.321311 -0.185419 -0.0713563 +-0.180525 -0.187808 -0.0345265 +0.336773 0.0659201 -0.0607245 +-0.306625 -0.0692992 -0.0506957 +0.358568 0.00286312 -0.066501 +-0.281618 -0.172086 -0.0560307 +0.148507 -0.169582 -0.0257373 +0.0308604 0.089647 -0.00450462 +-0.163435 -0.1607 -0.0266221 +0.337305 0.0179507 -0.0587757 +0.275772 0.121152 -0.0464424 +-0.226193 -0.118916 -0.0332033 +0.129875 0.0152017 -0.00858619 +-0.338314 -0.10166 -0.064474 +0.00199258 -0.0860132 -0.003708 +-0.251345 -0.0829331 -0.035662 +-0.061029 -0.0854721 -0.0055303 +-0.0479867 0.0209712 -0.0013722 +0.348679 -0.0334235 -0.0633539 +-0.380568 0.0856896 -0.0792255 +-0.00558749 -0.0152921 -0.000132543 +-0.290497 0.0544535 -0.0446747 +-0.405954 0.110254 -0.0927813 +-0.457896 0.0996637 -0.116599 +0.298167 0.106651 -0.0514631 diff --git a/image_analysis/indexing/fast-feedback-indexer/data/image3_local.txt b/image_analysis/indexing/fast-feedback-indexer/data/image3_local.txt new file mode 100644 index 000000000..7ee46fe94 --- /dev/null +++ b/image_analysis/indexing/fast-feedback-indexer/data/image3_local.txt @@ -0,0 +1,292 @@ +36.9 0 0 4.83429e-15 78.95 0 4.83429e-15 4.83429e-15 78.95 +0.0478059 0.474818 -0.121215 +0.0755474 0.464324 -0.117563 +-0.0987206 0.461875 -0.118566 +0.396073 0.118216 -0.0894225 +0.189345 0.363819 -0.0879781 +-0.0563314 -0.463843 -0.115875 +0.242619 0.283818 -0.0723238 +0.20678 -0.309358 -0.0718082 +-0.197089 -0.0718117 -0.022248 +0.399132 -0.0271951 -0.0835097 +0.432291 -0.0710157 -0.101067 +0.346987 0.306041 -0.113468 +0.0116931 -0.303008 -0.0470836 +-0.240226 0.409852 -0.120049 +0.00962157 0.400945 -0.0839486 +-0.2082 -0.0855021 -0.025658 +-0.43859 0.0687851 -0.103949 +0.270138 -0.0865012 -0.0410719 +-0.440563 -0.0804697 -0.105892 +-0.342996 -0.154163 -0.0734002 +-0.292611 -0.0949504 -0.0484943 +-0.219064 -0.0991596 -0.0293412 +-0.315136 0.124197 -0.0591152 +0.417766 -0.0948766 -0.0964129 +0.380917 0.143667 -0.0866206 +0.371349 0.236656 -0.102173 +0.14343 -0.221269 -0.0353922 +-0.468732 0.0863185 -0.120887 +-0.417798 -0.101585 -0.0971573 +0.443571 -0.100341 -0.109395 +-0.303837 -0.109175 -0.0535518 +0.202431 -0.185279 -0.0383902 +0.437247 -0.109792 -0.107385 +-0.46958 -0.11237 -0.12429 +0.462499 -0.114767 -0.12084 +0.291451 -0.101549 -0.0488195 +0.0840583 0.193855 -0.0225777 +0.302527 0.377502 -0.124803 +0.421681 -0.133069 -0.103073 +-0.157646 0.242405 -0.0427187 +-0.411418 -0.14018 -0.0993976 +-0.224119 -0.151865 -0.0373434 +-0.382673 -0.108267 -0.0824819 +0.28715 -0.116077 -0.0491734 +-0.196264 -0.163524 -0.0331804 +0.25025 -0.162716 -0.0455898 +0.344328 -0.160249 -0.074928 +-0.261486 -0.364863 -0.106412 +0.180778 -0.169973 -0.0312748 +-0.439693 -0.171713 -0.118419 +-0.388385 -0.162509 -0.0929455 +0.308078 -0.168981 -0.0637665 +0.433094 -0.162003 -0.113329 +0.127185 -0.154173 -0.0201763 +-0.297786 -0.14752 -0.0568346 +-0.207746 -0.176636 -0.0378974 +-0.28753 -0.353026 -0.109664 +0.313041 -0.29337 -0.0967064 +0.270868 -0.177574 -0.0539037 +0.437726 0.0879321 -0.105202 +0.376117 -0.113116 -0.0803583 +-0.320667 -0.218001 -0.0782362 +0.242824 -0.157729 -0.0428387 +-0.26016 0.376488 -0.110858 +0.27503 -0.343499 -0.102021 +0.249577 0.106525 -0.037522 +-0.218507 -0.191093 -0.0430579 +0.42761 -0.214231 -0.121789 +-0.11374 -0.196027 -0.0260202 +-0.154719 -0.454944 -0.123024 +-0.383656 0.251443 -0.111414 +0.223617 -0.200086 -0.0460814 +0.125579 0.367265 -0.0784002 +0.426388 0.171546 -0.111876 +-0.291415 -0.186047 -0.0616696 +0.318398 -0.19821 -0.0729964 +-0.368995 -0.194495 -0.0911464 +-0.123904 -0.209798 -0.0301378 +0.328298 0.329644 -0.114813 +-0.162658 -0.212458 -0.0364628 +-0.393868 0.0760294 -0.0839829 +-0.275015 -0.211211 -0.0620465 +0.0547016 -0.41667 -0.0925895 +0.124226 -0.223579 -0.0332629 +-0.331356 -0.274123 -0.0971933 +0.401227 -0.208898 -0.10816 +0.161337 0.311705 -0.0636183 +-0.348651 -0.115499 -0.0698913 +-0.277255 0.175902 -0.0554429 +0.302256 -0.221204 -0.0727947 +0.34204 0.295492 -0.107984 +-0.404877 0.062363 -0.0877579 +-0.0836652 0.421874 -0.097214 +-0.0362313 -0.233904 -0.0284157 +0.443787 -0.190874 -0.124431 +-0.219273 0.261106 -0.0599239 +-0.214308 -0.31468 -0.0753116 +0.164921 -0.236333 -0.0424261 +0.348849 0.251016 -0.097063 +-0.366015 -0.225571 -0.0971429 +0.104202 0.269377 -0.0426192 +0.212676 0.230565 -0.0504692 +-0.134963 -0.224268 -0.0348633 +-0.231246 -0.246877 -0.0589489 +-0.257849 -0.235904 -0.0630565 +0.447993 -0.138309 -0.116726 +0.186024 -0.251148 -0.0500949 +-0.399512 -0.217484 -0.109444 +0.249902 0.239253 -0.0617532 +-0.416994 -0.235399 -0.122103 +0.167763 -0.294476 -0.0591815 +-0.383613 -0.242769 -0.108987 +-0.364712 0.220668 -0.0954055 +0.312795 -0.249875 -0.0836369 +-0.261992 0.199405 -0.0557553 +-0.348323 -0.24955 -0.0964537 +0.315385 -0.015859 -0.0511686 +-0.241113 -0.2617 -0.0654532 +-0.314542 -0.29963 -0.0992861 +0.280901 0.3564 -0.108892 +0.299583 0.353059 -0.11366 +0.00147517 -0.316306 -0.0513439 +-0.213944 -0.356966 -0.0907129 +-0.184388 -0.444404 -0.123355 +-0.108091 -0.277581 -0.0453979 +-0.286852 -0.267958 -0.0802642 +0.345034 -0.298143 -0.110021 +0.153222 -0.251067 -0.0442341 +0.26591 -0.272925 -0.0754441 +-0.190452 -0.201502 -0.0392061 +0.28435 0.189937 -0.0602824 +-0.147459 -0.28058 -0.0515642 +-0.297368 -0.224345 -0.0719688 +-0.353633 0.234726 -0.0945457 +0.205868 0.275633 -0.0610407 +0.196619 -0.280673 -0.0605515 +-0.31039 0.360004 -0.120196 +-0.185162 -0.282746 -0.0588467 +-0.0584429 -0.313696 -0.0522769 +-0.236166 -0.282346 -0.0702116 +0.172911 0.00864823 -0.0151004 +-0.478279 0.023703 -0.122112 +0.255526 0.0070649 -0.0332237 +0.376391 -0.246727 -0.106996 +0.296636 0.268058 -0.0834019 +-0.331841 -0.316908 -0.111489 +0.385627 -0.275125 -0.119319 +0.446904 0.00137814 -0.105419 +0.00152616 -0.358609 -0.0665134 +0.0674437 -0.233533 -0.0299928 +-0.206777 0.338756 -0.0821288 +0.0862508 -0.419117 -0.0961739 +-0.425564 0.034528 -0.0957307 +-0.088485 -0.420628 -0.0970923 +0.388586 0.0952562 -0.0835244 +0.0760275 -0.431436 -0.101066 +-0.276918 -0.029593 -0.0395622 +-0.0270389 -0.432356 -0.0987026 +-0.371211 0.103735 -0.0772641 +0.267358 0.214581 -0.0605988 +-0.0861313 0.131068 -0.0123753 +-0.197607 -0.430154 -0.119138 +-0.270121 -0.336035 -0.0977169 +-0.337825 0.145377 -0.0700859 +-0.413486 0.155495 -0.102865 +-0.0062584 -0.447909 -0.105943 +0.151423 -0.419865 -0.105134 +-0.0697796 -0.359857 -0.0696056 +0.0150669 -0.462894 -0.113715 +0.419602 0.161257 -0.106731 +-0.0772768 -0.448896 -0.109764 +-0.115911 -0.451286 -0.115181 +-0.186258 -0.368404 -0.0891837 +0.195277 -0.365826 -0.0900341 +-0.409763 0.214013 -0.113268 +0.349434 -0.327079 -0.121982 +0.333802 0.33967 -0.120682 +0.119113 -0.419993 -0.100324 +-0.128908 0.345232 -0.0703778 +0.189503 -0.0166896 -0.0182617 +0.275641 -0.301184 -0.0871418 +0.366038 -0.218325 -0.0953729 +-0.415324 0.0483009 -0.0916097 +0.188568 0.239678 -0.0476364 +0.0329356 -0.402382 -0.085121 +0.426582 -0.0316363 -0.0961048 +0.325914 0.208605 -0.0779023 +0.0639703 0.202047 -0.0227155 +-0.325687 0.110636 -0.0610178 +-0.241551 -0.303331 -0.0782388 +-0.185707 -0.325214 -0.0727738 +-0.166943 0.0671929 -0.0163256 +0.399891 0.0215788 -0.0836914 +-0.191642 0.136821 -0.0281186 +-0.0693103 -0.316976 -0.0541025 +-0.246774 -0.29176 -0.0758904 +0.264496 -0.35789 -0.10448 +-0.149603 0.198383 -0.0313601 +0.0687354 -0.478998 -0.124879 +0.255122 0.0876266 -0.03707 +-0.141705 0.266271 -0.0465749 +0.0216993 -0.374365 -0.0729724 +0.356103 0.100189 -0.0709399 +0.157329 -0.0155793 -0.0125767 +-0.148191 -0.365666 -0.0811268 +-0.133882 0.2216 -0.0340967 +-0.0624653 0.335933 -0.0601876 +-0.205344 0.402966 -0.108119 +0.255598 -0.243936 -0.0644973 +0.184493 -0.379528 -0.0934015 +-0.241825 -0.34586 -0.0934121 +-0.319671 0.227677 -0.0802318 +-0.390379 -0.021549 -0.079598 +0.158096 0.365907 -0.0828752 +-0.311305 -0.0215348 -0.049934 +-0.105915 0.323447 -0.0597 +0.359212 0.158442 -0.080292 +0.0318941 -0.0747519 -0.00330801 +-0.295691 0.31996 -0.0998931 +0.466091 0.0344785 -0.115936 +-0.30434 0.251285 -0.0811783 +0.472937 -0.00352436 -0.118911 +-0.205412 -0.386496 -0.100874 +0.0377089 0.390739 -0.0802712 +0.391073 -0.0897652 -0.0840281 +-0.168059 -0.235281 -0.0427125 +-0.196429 0.239772 -0.0492503 +0.0137972 -0.259512 -0.0343587 +-0.399432 0.228193 -0.112091 +-0.300436 -0.362243 -0.117663 +-0.015215 0.358076 -0.0664317 +-0.356635 -0.0285212 -0.0661916 +0.133007 0.354487 -0.0744471 +0.428284 0.183171 -0.115115 +-0.307371 0.277332 -0.0897199 +-0.0135991 0.421763 -0.0933957 +0.279835 0.278974 -0.0813783 +0.216846 -0.337177 -0.0838724 +0.18925 0.138049 -0.0278237 +-0.265456 0.141153 -0.0462658 +0.322336 -0.321014 -0.109467 +-0.341668 0.312627 -0.113701 +-0.225693 0.369653 -0.0986568 +-0.152783 0.139518 -0.021638 +-0.405996 0.110337 -0.0928103 +-0.336827 -0.192813 -0.0783869 +-0.458016 0.100021 -0.116701 +0.349933 -0.28432 -0.107414 +-0.0935235 0.224756 -0.0300835 +0.333858 0.1149 -0.0644058 +-0.294003 0.383477 -0.124496 +0.46557 -0.0140078 -0.1151 +0.342521 0.183709 -0.0786259 +-0.302445 0.0896212 -0.0510558 +-0.368178 0.126237 -0.0788544 +0.419845 0.00635302 -0.0924264 +0.255251 0.249804 -0.0659525 +-0.382295 0.0896141 -0.0803152 +-0.203895 0.284922 -0.0633857 +0.173418 0.163919 -0.0288888 +-0.012104 0.30364 -0.0472901 +-0.394558 0.124411 -0.0895901 +0.464648 0.0828713 -0.118391 +0.0644612 0.315497 -0.0532653 +0.230574 0.206082 -0.0490186 +-0.164859 0.287265 -0.0564428 +-0.288444 0.16178 -0.0562696 +0.44457 0.0985191 -0.10969 +-0.356745 0.289064 -0.111645 +-0.433017 0.186376 -0.118093 +-0.241948 0.119951 -0.0371537 +0.382173 0.201132 -0.0980632 +0.246498 0.392851 -0.11405 +0.222191 0.137515 -0.0347431 +0.374398 0.133062 -0.0823288 +0.028151 0.145192 -0.0109971 +0.318074 0.140357 -0.0623813 +0.285717 0.366967 -0.114731 +0.20549 0.162865 -0.0349878 +-0.279882 0.343866 -0.103662 +-0.402044 0.16944 -0.100194 +-0.166863 0.405685 -0.101348 +0.193598 0.197644 -0.0390336 +-0.421495 0.200137 -0.11553 +-0.173116 0.218736 -0.0396951 +-0.269615 0.243873 -0.068424 +0.290349 0.25716 -0.0782807 +-0.338121 0.258238 -0.095021 +0.195071 0.374347 -0.0934617 +-0.31129 0.296361 -0.0970777 +0.274926 0.346007 -0.102952 diff --git a/image_analysis/indexing/fast-feedback-indexer/data/image3_peakfinder8.txt b/image_analysis/indexing/fast-feedback-indexer/data/image3_peakfinder8.txt new file mode 100644 index 000000000..a81918adf --- /dev/null +++ b/image_analysis/indexing/fast-feedback-indexer/data/image3_peakfinder8.txt @@ -0,0 +1,869 @@ +36.9 0 0 4.83429e-15 78.95 0 4.83429e-15 4.83429e-15 78.95 +-0.348875 -0.700449 -0.377379 +0.0849008 -0.740264 -0.333066 +-0.482955 -0.635393 -0.39748 +-0.184559 -0.697607 -0.307697 +-0.278421 -0.678126 -0.319833 +0.0614845 -0.698953 -0.28748 +-0.139598 -0.691223 -0.290971 +0.0790029 -0.681857 -0.272793 +0.0467811 -0.68082 -0.269045 +0.128475 -0.664677 -0.263998 +-0.461849 -0.587446 -0.335468 +-0.29765 -0.627162 -0.280227 +-0.0920996 -0.647776 -0.243757 +0.0808553 -0.64611 -0.241051 +0.01699 -0.642624 -0.234007 +-0.151671 -0.635243 -0.242727 +-0.173136 -0.620581 -0.235211 +0.574919 -0.514516 -0.363806 +0.462589 -0.555976 -0.309419 +0.359643 -0.578235 -0.267674 +-0.295215 -0.590283 -0.248725 +0.21731 -0.603055 -0.232471 +-0.322887 -0.579225 -0.251506 +-0.419076 -0.554303 -0.280887 +-0.384871 -0.561321 -0.267338 +0.0516576 -0.607041 -0.207011 +0.555683 -0.505671 -0.340065 +0.484192 -0.528465 -0.30266 +-0.110789 -0.596349 -0.204957 +-0.243679 -0.579763 -0.222507 +0.20257 -0.584748 -0.214484 +0.418033 -0.541787 -0.270812 +-0.0720865 -0.593372 -0.198306 +-0.132198 -0.58123 -0.197071 +0.429227 -0.528298 -0.267425 +0.144426 -0.577995 -0.196842 +0.256806 -0.558344 -0.211138 +-0.0547506 -0.575639 -0.184131 +0.18777 -0.565629 -0.197002 +-0.423304 -0.521791 -0.259359 +0.0153581 -0.573652 -0.181045 +-0.153404 -0.566374 -0.190255 +-0.354712 -0.53547 -0.233546 +-0.114984 -0.564016 -0.182281 +-0.247919 -0.547364 -0.20067 +-0.0767443 -0.561971 -0.176411 +0.064986 -0.556795 -0.171896 +0.139933 -0.547146 -0.174742 +-0.4677 -0.485614 -0.261463 +-0.098346 -0.547013 -0.168673 +-0.058831 -0.54343 -0.16261 +-0.331324 -0.514335 -0.208998 +0.0112607 -0.541926 -0.159649 +-0.392946 -0.495785 -0.225538 +-0.119194 -0.53158 -0.161421 +0.22658 -0.519965 -0.176412 +0.368305 -0.495274 -0.2132 +-0.251846 -0.514494 -0.180323 +-0.0804121 -0.528715 -0.155018 +0.093619 -0.526502 -0.154996 +-0.189707 -0.489869 -0.149095 +0.223616 -0.487281 -0.155871 +0.328764 -0.470993 -0.181416 +0.365156 -0.462133 -0.191858 +-0.0133133 -0.494745 -0.131064 +-0.318967 -0.464003 -0.173585 +0.235163 -0.474126 -0.151529 +0.617724 -0.384487 -0.314007 +0.133757 -0.480346 -0.13318 +-0.34625 -0.452918 -0.178431 +-0.380336 -0.445517 -0.189531 +-0.172252 -0.471983 -0.135384 +0.0687353 -0.478998 -0.124879 +0.0370535 -0.47688 -0.121813 +0.1766 -0.467459 -0.133805 +0.454313 -0.421411 -0.215135 +-0.506306 -0.403383 -0.237808 +-0.056201 -0.463744 -0.115815 +0.496758 -0.403267 -0.23149 +0.0152325 -0.463037 -0.113792 +0.187641 -0.454969 -0.129486 +-0.154889 -0.454759 -0.122957 +-0.116101 -0.451432 -0.11528 +-0.390923 -0.416751 -0.179331 +-0.184388 -0.444404 -0.123355 +-0.0772105 -0.44902 -0.10982 +-0.249671 -0.435336 -0.135045 +0.439932 -0.402825 -0.197384 +-0.00613813 -0.448038 -0.106007 +0.613654 -0.35159 -0.293025 +-0.277343 -0.424645 -0.138166 +0.108413 -0.432577 -0.104945 +-0.027113 -0.432379 -0.0987156 +-0.165422 -0.425721 -0.110395 +-0.339339 -0.406221 -0.15157 +0.0760429 -0.431403 -0.101051 +0.151502 -0.419917 -0.105172 +-0.088619 -0.420926 -0.0972443 +0.118986 -0.420045 -0.100331 +0.0863747 -0.419165 -0.0962079 +-0.0470797 -0.417663 -0.0926186 +0.054708 -0.41675 -0.0926266 +0.399967 -0.379039 -0.165521 +0.162635 -0.406629 -0.100999 +0.300719 -0.391349 -0.130279 +0.337522 -0.383072 -0.140154 +-0.175872 -0.396965 -0.0991738 +0.0333476 -0.402394 -0.085141 +0.37422 -0.373983 -0.151415 +-0.384009 -0.370125 -0.154101 +0.476529 -0.351536 -0.194182 +-0.41814 -0.363002 -0.167301 +0.310756 -0.377118 -0.127525 +-0.556492 -0.3285 -0.236846 +-0.205412 -0.386496 -0.100874 +-0.0996724 -0.392289 -0.085574 +0.347648 -0.368548 -0.137844 +-0.059575 -0.388321 -0.0804035 +0.452613 -0.347043 -0.178597 +0.0120606 -0.386807 -0.077918 +0.184319 -0.37964 -0.0934129 +-0.300619 -0.36239 -0.117786 +-0.366791 -0.352743 -0.139165 +-0.579727 -0.308014 -0.24565 +-0.401986 -0.345771 -0.15215 +-0.435219 -0.338468 -0.16572 +-0.186329 -0.368423 -0.0892059 +0.0217605 -0.374562 -0.0730536 +0.461203 -0.332604 -0.177402 +0.195376 -0.365814 -0.0900503 +0.264496 -0.35789 -0.10448 +-0.147666 -0.365504 -0.0809779 +-0.287753 -0.353221 -0.109813 +-0.21409 -0.357097 -0.0907983 +-0.0464745 -0.365909 -0.0705105 +0.436316 -0.327667 -0.161989 +-0.533211 -0.3072 -0.211765 +-0.0698184 -0.359932 -0.0696377 +-0.0570325 -0.359589 -0.068634 +0.00149312 -0.35876 -0.0665715 +0.206466 -0.351456 -0.0868457 +-0.241914 -0.346096 -0.0935258 +0.274904 -0.343423 -0.101953 +-0.350323 -0.334975 -0.12532 +0.411135 -0.322756 -0.147476 +0.478731 -0.309415 -0.178368 +-0.452626 -0.313646 -0.165281 +-0.27008 -0.336067 -0.0977161 +-0.633152 -0.270054 -0.274611 +0.349434 -0.327079 -0.121982 +-0.0608452 -0.346484 -0.0639194 +-0.0573774 -0.345201 -0.0632267 +0.216987 -0.337212 -0.0839187 +0.385095 -0.317614 -0.133499 +-0.157787 -0.337089 -0.0718437 +0.55039 -0.286268 -0.215703 +0.518724 -0.290788 -0.19603 +0.322382 -0.321021 -0.109486 +-0.118908 -0.334284 -0.0650587 +-0.332008 -0.317082 -0.111614 +0.0251116 -0.335554 -0.0583138 +-0.07996 -0.330788 -0.0596886 +-0.509166 -0.285156 -0.187943 +-0.185538 -0.32556 -0.0728611 +-0.0487964 -0.330859 -0.0575821 +-0.00853834 -0.329382 -0.0558419 +-0.468919 -0.288547 -0.165221 +-0.214563 -0.315078 -0.0755063 +0.595841 -0.257992 -0.239465 +-0.00311284 -0.320121 -0.0526286 +-0.069402 -0.317242 -0.0541981 +-0.0490433 -0.318119 -0.0532184 +-0.145979 -0.31509 -0.0622322 +0.00168562 -0.316305 -0.0513438 +0.437357 -0.285438 -0.147214 +-0.314591 -0.299503 -0.0992611 +0.206928 -0.309424 -0.0718633 +0.53513 -0.26735 -0.198652 +-0.0584429 -0.313696 -0.0522769 +-0.241684 -0.303531 -0.0783398 +0.275621 -0.30106 -0.087095 +0.313195 -0.293497 -0.0968009 +-0.0999937 -0.306938 -0.0535379 +0.411857 -0.280399 -0.132965 +0.0098624 -0.307075 -0.0483658 +0.0430843 -0.30618 -0.0490018 +-0.602505 -0.244383 -0.240221 +-0.451873 -0.271123 -0.150116 +-0.0595624 -0.303905 -0.0491612 +0.349928 -0.284382 -0.107433 +0.0119609 -0.302858 -0.0470394 +-0.246774 -0.29176 -0.0758903 +0.167763 -0.294476 -0.0591815 +-0.157477 -0.294523 -0.05742 +0.385428 -0.274954 -0.119179 +-0.118861 -0.291632 -0.0508831 +-0.331438 -0.274348 -0.0972921 +0.550643 -0.243771 -0.201646 +-0.236166 -0.282346 -0.0702116 +-0.185188 -0.282919 -0.0589038 +-0.00820829 -0.287411 -0.0422278 +0.196662 -0.280865 -0.0606177 +-0.101066 -0.28409 -0.046544 +-0.147426 -0.280654 -0.0515807 +-0.0102655 -0.284436 -0.0413601 +-0.508848 -0.242793 -0.174091 +0.265914 -0.27286 -0.0754262 +-0.434335 -0.253272 -0.135589 +0.131137 -0.277632 -0.048305 +-0.286454 -0.26766 -0.0800529 +-0.213016 -0.271803 -0.0615187 +-0.108054 -0.277571 -0.045391 +-0.0690175 -0.274865 -0.0409976 +0.0334287 -0.274568 -0.0390134 +0.002917 -0.273446 -0.038117 +-0.579174 -0.222711 -0.215808 +0.207096 -0.266125 -0.0585709 +-0.241146 -0.261625 -0.0654408 +0.174744 -0.265801 -0.0519419 +0.594989 -0.215502 -0.225695 +-0.348322 -0.249527 -0.096447 +-0.264839 -0.257287 -0.0706649 +-0.081296 -0.266024 -0.0394677 +0.565403 -0.220279 -0.205144 +0.376466 -0.246826 -0.107055 +-0.202132 -0.258805 -0.0554564 +-0.0587988 -0.260542 -0.0363296 +0.312746 -0.249808 -0.0836015 +-0.383613 -0.242769 -0.108987 +0.113772 -0.260462 -0.0412429 +-0.417211 -0.23549 -0.12223 +0.0139721 -0.259631 -0.0343932 +-0.451919 -0.229019 -0.13784 +0.186153 -0.251213 -0.0501373 +-0.30407 -0.242839 -0.0788212 +0.478098 -0.224248 -0.150803 +-0.231345 -0.246771 -0.0589453 +0.153313 -0.25098 -0.0442258 +0.255532 -0.243944 -0.0644816 +-0.0466278 -0.247355 -0.0321977 +0.0559366 -0.247074 -0.0326192 +-0.257789 -0.236004 -0.0630653 +0.4531 -0.219259 -0.135925 +-0.365751 -0.225171 -0.0969363 +0.579316 -0.19625 -0.208875 +0.164959 -0.236411 -0.042452 +-0.399632 -0.217527 -0.109508 +-0.168109 -0.235199 -0.0427012 +0.132227 -0.23583 -0.0372435 +-0.254246 -0.22982 -0.0605631 +0.42761 -0.214231 -0.121789 +-0.434215 -0.21157 -0.124389 +-0.297368 -0.224345 -0.0719689 +0.0675378 -0.233564 -0.030007 +-0.258699 -0.226538 -0.0609819 +-0.0362746 -0.234164 -0.0284798 +0.167652 -0.231593 -0.0417425 +0.365865 -0.218173 -0.0952664 +-0.180987 -0.229173 -0.0435883 +0.302286 -0.221182 -0.072799 +0.644415 -0.177448 -0.256198 +-0.320567 -0.21796 -0.0781918 +-0.667791 -0.171656 -0.275715 +0.00421779 -0.229381 -0.0266724 +0.40119 -0.208932 -0.108151 +-0.134944 -0.224296 -0.0348671 +0.175076 -0.222637 -0.0409478 +-0.185945 -0.221602 -0.0427555 +0.124049 -0.22372 -0.033273 +0.143387 -0.221261 -0.0353842 +0.338768 -0.212476 -0.0834356 +0.0683569 -0.224207 -0.0278587 +0.111354 -0.220293 -0.0309432 +0.244471 -0.214976 -0.054474 +0.468773 -0.195804 -0.138656 +-0.201788 -0.215999 -0.0446852 +-0.0251942 -0.219902 -0.0248034 +0.0788698 -0.219149 -0.0275015 +-0.275273 -0.211318 -0.0621464 +-0.538602 -0.183452 -0.177654 +-0.162724 -0.212653 -0.0365169 +0.281979 -0.206724 -0.0631151 +-0.155973 -0.212232 -0.0353084 +-0.45723 -0.189624 -0.131102 +-0.271108 -0.206187 -0.0597941 +-0.1716 -0.210833 -0.0376576 +0.443596 -0.190707 -0.124298 +-0.124112 -0.210014 -0.0302112 +0.183608 -0.205398 -0.038699 +0.318713 -0.198097 -0.0730806 +-0.190499 -0.201592 -0.0392343 +0.0500061 -0.206864 -0.0229091 +-0.0137475 -0.206024 -0.0215496 +0.223604 -0.200101 -0.0460814 +-0.33684 -0.192864 -0.0784023 +0.540246 -0.172683 -0.176401 +-0.263777 -0.196731 -0.0556914 +0.571236 -0.167916 -0.196574 +0.601026 -0.163339 -0.21764 +0.355904 -0.18943 -0.0848778 +-0.113671 -0.196018 -0.0260103 +0.483891 -0.172228 -0.141986 +-0.218605 -0.191136 -0.0430888 +-0.291452 -0.186109 -0.0616933 +-0.131349 -0.191955 -0.0274258 +-0.439837 -0.171811 -0.11851 +-0.00245058 -0.192303 -0.0186675 +-0.179903 -0.188115 -0.0344703 +0.20247 -0.185232 -0.0383894 +0.169085 -0.185219 -0.0319584 +0.459104 -0.167164 -0.127487 +0.270799 -0.177587 -0.0538863 +-0.207683 -0.176659 -0.037888 +-0.202204 -0.177858 -0.0369422 +-0.59164 -0.145523 -0.20704 +-0.0236575 -0.178958 -0.0164278 +0.433095 -0.16199 -0.113327 +0.3081 -0.168968 -0.0637714 +-0.388486 -0.162443 -0.0929772 +-0.147486 -0.174744 -0.0264948 +-0.280513 -0.168413 -0.05504 +-0.23362 -0.170356 -0.0427118 +0.180729 -0.170025 -0.0312749 +-0.544307 -0.14447 -0.173647 +-0.235629 -0.166477 -0.0425219 +0.406503 -0.156643 -0.0998789 +-0.504828 -0.147555 -0.149485 +0.344323 -0.16023 -0.0749225 +0.250124 -0.162661 -0.0455475 +0.530868 -0.143876 -0.164848 +-0.196304 -0.163386 -0.0331651 +0.0841776 -0.166649 -0.0175834 +0.0517427 -0.165443 -0.0151389 +-0.343 -0.154248 -0.0734157 +0.473584 -0.143527 -0.131025 +0.242745 -0.157634 -0.042803 +-0.297674 -0.147527 -0.0568001 +-0.224182 -0.15182 -0.037351 +0.127185 -0.154173 -0.0201763 +-0.411541 -0.14018 -0.0994537 +0.448034 -0.138364 -0.116756 +0.229016 -0.147869 -0.0378741 +-0.526927 -0.126689 -0.159585 +0.421835 -0.133117 -0.103153 +-0.252219 -0.140408 -0.0425705 +0.360611 -0.136665 -0.0773504 +-0.0689875 -0.140674 -0.0123504 +0.544009 -0.120149 -0.169567 +-0.213759 -0.137808 -0.0328827 +0.574524 -0.115768 -0.189741 +-0.051122 -0.140067 -0.0111785 +0.00213076 -0.13968 -0.00980561 +0.22436 -0.135342 -0.0349378 +0.603956 -0.110886 -0.210733 +0.207178 -0.132637 -0.0307297 +-0.241541 -0.127651 -0.038042 +0.271527 -0.127525 -0.0460554 +0.276034 -0.126405 -0.0472004 +0.0430942 -0.129283 -0.00932906 +0.462571 -0.114675 -0.120866 +0.611362 -0.101245 -0.215152 +-0.227582 -0.121731 -0.0338799 +0.639525 -0.0968559 -0.237356 +-0.348817 -0.115566 -0.0699618 +-0.222503 -0.120925 -0.0325965 +0.312439 -0.116819 -0.0572725 +-0.226203 -0.11898 -0.0332137 +0.28715 -0.116077 -0.0491734 +0.376119 -0.113084 -0.0803552 +-0.230086 -0.113042 -0.0334175 +0.0515569 -0.119638 -0.00852204 +0.15399 -0.116716 -0.0188453 +-0.382829 -0.108291 -0.0825495 +-0.303881 -0.109162 -0.0535645 +0.156997 -0.114766 -0.0190919 +-0.417819 -0.101811 -0.0971924 +0.291483 -0.101545 -0.0488289 +-0.492664 -0.0922875 -0.134688 +-0.219145 -0.0992081 -0.0293645 +-0.0745362 -0.101924 -0.00800406 +0.065505 -0.10322 -0.00750076 +0.417766 -0.0948766 -0.0964129 +-0.00360038 -0.101309 -0.00515148 +0.508955 -0.0865802 -0.143572 +-0.292563 -0.094903 -0.0484746 +-0.0631533 -0.0986347 -0.00688225 +0.327915 -0.0929426 -0.059876 +0.680447 -0.072194 -0.270767 +0.390973 -0.0896477 -0.0839743 +0.540927 -0.0816556 -0.162904 +0.201959 -0.0944735 -0.0251731 +-0.323719 -0.0885481 -0.0579992 +0.48459 -0.0813393 -0.129048 +0.270275 -0.0866017 -0.0411198 +-0.440793 -0.080508 -0.106009 +-0.208308 -0.0854746 -0.0256787 +-0.482267 -0.0772297 -0.127386 +-0.562163 -0.0709378 -0.176022 +0.45881 -0.0761098 -0.114731 +0.307198 -0.0779409 -0.0515515 +0.148076 -0.0781364 -0.0141156 +0.370624 -0.0743827 -0.0742001 +0.432325 -0.071042 -0.101085 +-0.0913775 -0.0769586 -0.00716188 +-0.0444873 -0.0776868 -0.00401524 +-0.645842 -0.0590281 -0.238814 +-0.236456 -0.0747922 -0.0312407 +0.0316724 -0.0749726 -0.00331752 +-0.307979 -0.0700763 -0.0511911 +0.24871 -0.0718257 -0.0340889 +-0.197154 -0.0718069 -0.0222607 +-0.0784041 -0.0728648 -0.00574474 +-0.010698 -0.0731178 -0.00273407 +0.211844 -0.0713356 -0.0253035 +-0.27827 -0.0699306 -0.0420462 +-0.267709 -0.0701488 -0.0390572 +-0.0380141 -0.0727536 -0.00337478 +0.20125 -0.0713166 -0.0230596 +0.663619 -0.0544643 -0.253914 +-0.146701 -0.0352912 -0.0114489 +0.426579 -0.0319318 -0.0961134 +-0.072767 -0.0328422 -0.00319192 +-0.27704 -0.0293885 -0.0395912 +-0.356635 -0.0285212 -0.0661916 +0.399132 -0.0271951 -0.0835097 +-0.4761 -0.0248492 -0.12096 +-0.239716 -0.0254341 -0.0294901 +-0.0641785 -0.02627 -0.00240739 +-0.516679 -0.0218166 -0.144099 +-0.390471 -0.0214644 -0.0796349 +0.547693 -0.0195414 -0.163549 +-0.311217 -0.0214975 -0.0499042 +0.491403 -0.0190676 -0.129277 +0.120106 -0.0171879 -0.00738774 +0.189503 -0.0166896 -0.0182617 +0.315489 -0.0157229 -0.0512011 +0.523813 -0.0144178 -0.148289 +0.157329 -0.0155794 -0.0125767 +0.465564 -0.0138488 -0.115094 +0.226839 -0.00796679 -0.0261003 +0.472937 -0.00352436 -0.118911 +0.358579 0.00291785 -0.0665053 +0.447042 0.00140193 -0.105488 +0.204505 0.00693923 -0.0211592 +0.419897 0.00635562 -0.0924506 +0.172751 0.00838465 -0.0150701 +0.255812 0.00783422 -0.0333051 +-0.576713 0.0117611 -0.183138 +-0.622827 0.011047 -0.217719 +-0.165633 0.0186311 -0.0139885 +-0.277811 0.020089 -0.0395744 +0.337276 0.0179692 -0.0587656 +0.399965 0.021603 -0.083724 +0.279176 0.0246351 -0.0400762 +-0.478127 0.0237052 -0.122029 +0.517208 0.0239547 -0.144476 +-0.658636 0.0240665 -0.247923 +0.188595 0.0323315 -0.0184774 +0.315876 0.0331228 -0.051778 +0.492078 0.0294676 -0.129948 +-0.267266 0.0337543 -0.0369686 +0.548742 0.0290945 -0.164515 +-0.0449236 0.0359892 -0.00165805 +-0.303719 0.035545 -0.0479017 +-0.425768 0.0345635 -0.0958282 +0.466251 0.0345096 -0.116021 +0.256844 0.0394633 -0.0343531 +0.293447 0.0478791 -0.0452245 +-0.256064 0.0475157 -0.0345087 +-0.548966 0.0438007 -0.165304 +-0.415388 0.0483108 -0.0916395 +-0.641331 0.0419869 -0.233886 +0.291675 0.0519065 -0.044892 +0.26327 0.0536327 -0.0367698 +-0.290539 0.0546023 -0.0446959 +0.203537 0.0556725 -0.0225169 +-0.206173 0.0641551 -0.0235898 +-0.404784 0.0622284 -0.0877076 +-0.166921 0.0672366 -0.016325 +-0.128364 0.0699756 -0.0107447 +-0.278997 0.0688098 -0.0421766 +-0.577671 0.0605336 -0.185978 +-0.438881 0.0687127 -0.104086 +-0.0609942 0.0759702 -0.0047572 +0.398811 0.0702593 -0.0856625 +0.219296 0.0785892 -0.027512 +0.540751 0.0671922 -0.161505 +0.69695 0.0573721 -0.285179 +-0.478912 0.0722947 -0.125119 +0.187103 0.0806356 -0.0209748 +-0.393715 0.0762928 -0.0839389 +-0.268427 0.0823745 -0.0402284 +-0.0459592 0.0855348 -0.00472539 +0.0578269 0.0852935 -0.00532363 +0.516146 0.072541 -0.146577 +0.314309 0.0815788 -0.0541911 +0.490875 0.0776969 -0.132241 +-0.427921 0.0826286 -0.0999689 +0.255141 0.0877599 -0.0370871 +0.547518 0.0774816 -0.166801 +0.464735 0.0828548 -0.118435 +-0.302544 0.0896072 -0.0510861 +-0.468818 0.0863564 -0.120937 +-0.382295 0.089614 -0.0803152 +-0.0735464 0.09655 -0.00739281 +-0.00289464 0.0981267 -0.00483028 +0.437649 0.0879916 -0.10517 +-0.218633 0.0991113 -0.0292393 +-0.179544 0.1017 -0.0215211 +-0.417081 0.0966286 -0.0962819 +-0.140651 0.104515 -0.0154727 +0.170133 0.10568 -0.020262 +0.356074 0.10017 -0.0709266 +-0.0608549 0.108811 -0.00780201 +0.0731649 0.109072 -0.00866246 +0.444483 0.0983334 -0.109626 +0.249577 0.106525 -0.037522 +-0.371339 0.103756 -0.0773179 +0.297398 0.106562 -0.051212 +-0.457858 0.099999 -0.116616 +0.417137 0.103005 -0.0970125 +0.23898 0.112745 -0.0355431 +-0.206718 0.113378 -0.0281907 +-0.325752 0.11061 -0.0610374 +-0.405996 0.110337 -0.0928103 +0.012839 0.121216 -0.00745691 +0.3339 0.114837 -0.064413 +-0.280664 0.117361 -0.0473962 +-0.46059 0.110233 -0.119258 +-0.241852 0.119908 -0.0371243 +-0.247078 0.121136 -0.038606 +-0.538927 0.106159 -0.164364 +-0.359936 0.117701 -0.074477 +0.275618 0.121196 -0.0464036 +0.396168 0.118176 -0.0894589 +-0.315186 0.124307 -0.0591464 +-0.0861869 0.131159 -0.0123922 +0.120824 0.131481 -0.0160719 +0.152867 0.130282 -0.0203785 +0.0890482 0.133079 -0.012903 +-0.632277 0.104077 -0.23228 +-0.394558 0.124411 -0.0895901 +-0.367877 0.126515 -0.0787723 +-0.23076 0.134039 -0.0362659 +-0.191613 0.13682 -0.0281128 +-0.152786 0.1395 -0.021636 +0.18925 0.138049 -0.0278237 +0.222164 0.137486 -0.0347327 +0.374398 0.133062 -0.0823288 +0.0281713 0.145217 -0.0110013 +0.4873 0.126155 -0.135926 +-0.265456 0.141153 -0.0462657 +0.317918 0.140353 -0.0623278 +0.259118 0.14612 -0.0452713 +-0.337825 0.145377 -0.0700859 +0.381127 0.143722 -0.086717 +0.649925 0.120073 -0.249547 +0.467778 0.140959 -0.127467 +-0.254189 0.154898 -0.0453301 +0.283938 0.154578 -0.0536993 +0.550135 0.135212 -0.175943 +-0.138684 0.164077 -0.0233499 +-0.0982133 0.166078 -0.0187904 +0.20566 0.162665 -0.0349903 +0.173549 0.163974 -0.0289215 +0.0768509 0.167309 -0.0170953 +-0.288494 0.161855 -0.0562975 +0.35923 0.158465 -0.080303 +-0.413547 0.155476 -0.10289 +0.473606 0.151587 -0.132407 +-0.658392 0.131184 -0.258845 +-0.203781 0.171792 -0.0361739 +0.24183 0.170969 -0.0448625 +0.419602 0.161257 -0.106731 +-0.546735 0.15076 -0.176379 +0.0157863 0.179826 -0.0164282 +-0.277319 0.175994 -0.0554788 +-0.402021 0.169395 -0.100175 +0.247517 0.180821 -0.048139 +-0.0829167 0.189604 -0.0216468 +0.426315 0.171533 -0.111838 +0.124078 0.19018 -0.0261231 +-0.311875 0.182847 -0.067637 +0.0840583 0.193855 -0.0225777 +0.342502 0.183697 -0.0786164 +0.284546 0.189796 -0.0603131 +-0.227362 0.1928 -0.0454662 +-0.188447 0.195366 -0.0375449 +-0.14965 0.198331 -0.0313567 +0.0641091 0.201747 -0.0226628 +0.193719 0.197684 -0.0390662 +-0.346218 0.189981 -0.0812833 +0.404459 0.186221 -0.104604 +-0.261855 0.199352 -0.0557064 +-0.433016 0.186376 -0.118093 +0.319068 0.197721 -0.0731226 +0.618387 0.163718 -0.231369 +0.230791 0.206217 -0.0491003 +-0.0671808 0.213867 -0.02545 +0.382133 0.201101 -0.0980396 +0.325882 0.208479 -0.0778626 +-0.421369 0.200129 -0.115468 +-0.211671 0.216196 -0.0468712 +-0.0500346 0.220798 -0.0259648 +-0.173087 0.218771 -0.039698 +0.267319 0.214576 -0.0605864 +-0.133839 0.221666 -0.0341058 +-0.0936986 0.224658 -0.0300777 +-0.0505787 0.226631 -0.0273335 +-0.0235762 0.226467 -0.0262665 +0.46338 0.201817 -0.137128 +0.152173 0.225739 -0.0377707 +0.388672 0.211284 -0.103176 +-0.285061 0.220701 -0.0672454 +-0.409783 0.214002 -0.113275 +0.181376 0.232003 -0.0443444 +0.212855 0.230606 -0.0505191 +0.500257 0.203663 -0.158416 +-0.364756 0.220697 -0.0954305 +0.0514345 0.236807 -0.0298057 +-0.319669 0.227683 -0.0802326 +0.155915 0.238705 -0.0415061 +0.365587 0.225929 -0.097059 +-0.23498 0.237392 -0.0574347 +-0.196397 0.239695 -0.0492243 +0.188568 0.239678 -0.0476364 +0.219481 0.238402 -0.0539597 +-0.157592 0.242416 -0.0427124 +0.308858 0.233086 -0.0778949 +-0.049663 0.246561 -0.032146 +-0.118251 0.245892 -0.0379429 +0.249902 0.239253 -0.0617532 +0.219689 0.241563 -0.0548102 +-0.399432 0.228193 -0.112091 +0.157348 0.246287 -0.043661 +0.479322 0.218712 -0.15005 +-0.353633 0.234726 -0.0945457 +-0.269707 0.24397 -0.0684762 +0.37147 0.236683 -0.10223 +-0.589929 0.207968 -0.219787 +-0.439751 0.230798 -0.132042 +-0.0752844 0.257505 -0.0366603 +0.00746242 0.257987 -0.0338805 +0.161456 0.254579 -0.0465213 +0.255327 0.249633 -0.0659275 +0.560355 0.212912 -0.199581 +-0.00352539 0.259066 -0.0341468 +0.0998636 0.259579 -0.0394553 +0.510957 0.223484 -0.169953 +0.458287 0.233656 -0.142458 +-0.30434 0.251285 -0.0811784 +-0.1438 0.261513 -0.0455723 +-0.18083 0.263405 -0.0524143 +-0.219273 0.261106 -0.0599239 +-0.141664 0.266204 -0.04655 +0.168773 0.26647 -0.0510483 +0.349001 0.251001 -0.0971176 +0.290848 0.25742 -0.0785109 +-0.0319013 0.270115 -0.0377006 +0.0714198 0.270216 -0.039853 +0.104127 0.269344 -0.0426018 +0.136502 0.268095 -0.0463271 +0.56535 0.222405 -0.205698 +-0.42932 0.244695 -0.130627 +-0.220356 0.265178 -0.0613179 +0.200005 0.265333 -0.0568157 +0.541227 0.228023 -0.190631 +-0.383674 0.251532 -0.111447 +-0.181382 0.267175 -0.0535763 +-0.338199 0.258269 -0.095059 +0.490344 0.239053 -0.161897 +0.464065 0.243886 -0.148435 +-0.520493 0.236909 -0.179658 +0.35443 0.260898 -0.102051 +-0.46914 0.24772 -0.152331 +0.205974 0.275614 -0.0610582 +0.296632 0.267979 -0.0833775 +0.0438941 0.281545 -0.0414565 +-0.058518 0.28261 -0.0425516 +0.570404 0.232233 -0.21215 +0.442278 0.258623 -0.141219 +-0.164851 0.287306 -0.0564539 +-0.203895 0.284922 -0.0633857 +0.242655 0.28381 -0.0723307 +0.152944 0.292041 -0.0559024 +0.44775 0.269088 -0.147291 +0.419578 0.273508 -0.134467 +-0.0825817 0.302515 -0.0504397 +-0.0120074 0.303684 -0.0473029 +0.335942 0.285276 -0.102358 +-0.401581 0.282192 -0.128736 +-0.356739 0.289051 -0.111638 +-0.311178 0.296325 -0.0970275 +-0.60421 0.24884 -0.243027 +0.0964827 0.313899 -0.0554585 +-0.187785 0.308885 -0.0676229 +0.2838 0.301918 -0.0898884 +0.341954 0.295382 -0.107914 +0.161287 0.3117 -0.0636083 +0.064423 0.315518 -0.0532697 +0.0551771 0.318911 -0.053823 +0.0445239 0.320184 -0.0536913 +0.5842 0.261576 -0.231698 +-0.223018 0.315226 -0.0775599 +-0.261008 0.312802 -0.0867476 +-0.105944 0.32339 -0.0596838 +0.430743 0.293747 -0.146669 +0.000315146 0.326136 -0.0546773 +0.0360628 0.326286 -0.0554171 +0.347209 0.306257 -0.11363 +-0.535133 0.277404 -0.202078 +-0.431406 0.299146 -0.148883 +-0.387234 0.305947 -0.130261 +-0.341459 0.312543 -0.11359 +-0.295691 0.31996 -0.0998931 +-0.0624612 0.335959 -0.0601968 +0.435402 0.303844 -0.15259 +0.234898 0.328295 -0.0850984 +0.407634 0.308128 -0.140412 +-0.523026 0.291131 -0.198947 +-0.472185 0.302123 -0.171892 +-0.206819 0.338819 -0.0821616 +-0.168202 0.341546 -0.0753084 +-0.128908 0.345232 -0.0703778 +0.412945 0.317954 -0.146547 +-0.0856881 0.356862 -0.069781 +-0.0151897 0.358137 -0.0664547 +-0.279766 0.34382 -0.103608 +0.275307 0.346202 -0.103144 +0.333942 0.339705 -0.120749 +-0.55955 0.304161 -0.229033 +0.0933128 0.368389 -0.075023 +-0.151493 0.365555 -0.0816211 +0.125724 0.367158 -0.0783772 +0.158124 0.365946 -0.0828957 +-0.0417614 0.370152 -0.071968 +0.189382 0.36375 -0.0879582 +0.280834 0.35636 -0.108855 +0.0618817 0.370104 -0.0730728 +0.422903 0.33794 -0.159197 +-0.445254 0.339572 -0.171484 +-0.310362 0.360019 -0.120192 +-0.187272 0.3721 -0.0908955 +-0.148207 0.37494 -0.0848744 +-0.225617 0.369741 -0.0986742 +-0.0382724 0.378667 -0.0752586 +0.195017 0.374419 -0.0934798 +0.285775 0.366993 -0.114761 +0.343943 0.360687 -0.133046 +-0.260175 0.376592 -0.110907 +0.0375299 0.390682 -0.0802395 +-0.389741 0.360719 -0.152661 +-0.0613598 0.40022 -0.0856374 +-0.293995 0.383588 -0.124542 +0.00968139 0.401184 -0.0840539 +0.436784 0.367749 -0.179037 +-0.205385 0.40295 -0.108121 +-0.166809 0.405763 -0.101373 +-0.127528 0.409681 -0.0967291 +-0.243868 0.401257 -0.117095 +0.565865 0.341477 -0.24954 +-0.522199 0.355535 -0.224821 +-0.0468711 0.417484 -0.0925253 +-0.0136603 0.42204 -0.0935255 +0.441052 0.377284 -0.185672 +-0.240226 0.409852 -0.12005 +-0.324574 0.400608 -0.143166 +-0.0835774 0.421949 -0.0972412 +-0.0314464 0.457408 -0.111299 +0.13609 0.453016 -0.118946 +0.167991 0.450787 -0.123319 +0.479829 0.401713 -0.220006 +0.506144 0.396423 -0.234058 +-0.612293 0.364401 -0.298352 +-0.440197 0.414329 -0.203408 +0.531186 0.390807 -0.248261 +-0.0988135 0.461986 -0.118634 +-0.253873 0.45113 -0.144413 +0.0757142 0.464502 -0.11767 +0.140619 0.461759 -0.124212 +0.172904 0.460641 -0.129417 +-0.38362 0.435731 -0.185767 +0.047998 0.475059 -0.121356 +0.177617 0.470545 -0.135685 +0.208417 0.468036 -0.141219 +0.486718 0.420604 -0.234364 +-0.424006 0.438058 -0.207331 +-0.284293 0.468141 -0.163327 +0.182194 0.48045 -0.142111 +0.212924 0.477548 -0.147585 +-0.0451316 0.494659 -0.132086 +0.388682 0.45818 -0.200627 +0.186717 0.490345 -0.148707 +0.217642 0.48727 -0.154305 +-0.362905 0.468558 -0.194548 +0.0290792 0.50549 -0.137658 +-0.191116 0.496987 -0.15355 +0.191107 0.499652 -0.155118 +-0.313533 0.484918 -0.183574 +-0.108408 0.512412 -0.148131 +0.0338819 0.515403 -0.143722 +-0.404368 0.471752 -0.216459 +0.195817 0.509727 -0.162245 +0.395785 0.476636 -0.215034 +0.423957 0.472948 -0.227614 +0.0385954 0.525746 -0.150235 +-0.259111 0.511352 -0.180622 +-0.444678 0.474511 -0.240329 +0.200399 0.519417 -0.16931 +0.427666 0.481449 -0.234945 +0.290919 0.51127 -0.191316 +-0.615217 0.423981 -0.335358 +0.294908 0.520096 -0.198421 +-0.05585 0.543506 -0.162455 +0.351652 0.512721 -0.216764 +0.209051 0.537789 -0.18325 +0.510002 0.475684 -0.283325 +-0.0513884 0.554023 -0.169086 +-0.480633 0.487606 -0.271143 +0.0524313 0.55552 -0.170152 +0.212609 0.546947 -0.19028 +-0.284542 0.538377 -0.206788 +0.18624 0.55933 -0.192248 +-0.0416841 0.574652 -0.182665 +0.061422 0.574285 -0.183652 +-0.151941 0.568972 -0.191801 +-0.190506 0.566305 -0.198123 +0.190361 0.567976 -0.199271 +-0.0375439 0.583852 -0.189008 +0.0659111 0.583559 -0.190609 +-0.459809 0.520569 -0.280568 +-0.186052 0.576456 -0.204335 +0.0981537 0.583019 -0.193492 +-0.358303 0.547887 -0.244065 +-0.30829 0.563934 -0.233883 +-0.0329154 0.59344 -0.195795 +0.284069 0.569445 -0.228614 +-0.142609 0.588816 -0.204413 +0.0701629 0.593128 -0.197955 +-0.181701 0.586556 -0.210737 +0.102763 0.59224 -0.200818 +0.448636 0.536132 -0.284956 +-0.398999 0.550959 -0.267031 +-0.304559 0.574455 -0.240233 +-0.137879 0.599074 -0.211267 +-0.177296 0.59639 -0.21713 +0.13912 0.599761 -0.212007 +-0.215361 0.592963 -0.224104 +-0.133532 0.608637 -0.217868 +-0.210851 0.603165 -0.230758 +-0.129041 0.618377 -0.224785 +-0.168232 0.616221 -0.230604 +-0.206581 0.613119 -0.237497 +0.0225659 0.641811 -0.233469 +-0.197316 0.632456 -0.250957 +0.216143 0.632787 -0.256453 +0.188687 0.644349 -0.258912 +-0.0389839 0.659256 -0.249092 +0.0636242 0.658833 -0.250406 +0.279018 0.636012 -0.280529 +0.336473 0.628643 -0.298862 +-0.116447 0.677061 -0.273344 +0.0435756 0.695694 -0.282985 +-0.258894 0.672395 -0.30656 +-0.447314 0.625317 -0.360556 +0.290634 0.670579 -0.317464 +-0.0944915 0.702723 -0.29484 +0.266503 0.690387 -0.327436 diff --git a/image_analysis/indexing/fast-feedback-indexer/data/image3_radial.txt b/image_analysis/indexing/fast-feedback-indexer/data/image3_radial.txt new file mode 100644 index 000000000..7d444f71f --- /dev/null +++ b/image_analysis/indexing/fast-feedback-indexer/data/image3_radial.txt @@ -0,0 +1,690 @@ +36.9 0 0 4.83429e-15 78.95 0 4.83429e-15 4.83429e-15 78.95 +-0.0536948 0.475653 -0.122007 +0.0479979 0.475059 -0.121356 +0.0756711 0.464389 -0.117607 +0.140555 0.461398 -0.124011 +-0.0988135 0.461986 -0.118634 +0.13609 0.453016 -0.118946 +0.176539 0.450183 -0.124689 +-0.0287511 0.457283 -0.111143 +-0.0317299 0.457496 -0.111354 +0.167991 0.450787 -0.123319 +0.103711 0.454807 -0.115469 +0.0719224 0.455963 -0.112912 +-0.0876311 0.45587 -0.114278 +0.138474 0.426151 -0.106009 +0.121395 0.427345 -0.104098 +-0.00937933 0.43035 -0.0973868 +0.0315836 0.429763 -0.0976108 +0.102513 0.425285 -0.100765 +-0.0820205 0.425308 -0.0986754 +-0.0458197 0.425146 -0.0960356 +-0.0136603 0.42204 -0.0935255 +-0.083607 0.422056 -0.0972938 +-0.063629 0.420743 -0.0950544 +-0.240226 0.409852 -0.120049 +0.00266729 0.418934 -0.0919874 +-0.0468711 0.417484 -0.0925253 +0.0752285 0.415739 -0.0936328 +-0.243756 0.401228 -0.117051 +-0.127528 0.409681 -0.0967291 +-0.166804 0.405765 -0.101372 +-0.205392 0.402915 -0.108107 +0.246498 0.392851 -0.11405 +0.11421 0.402575 -0.0917657 +0.00968934 0.401377 -0.0841385 +-0.0613871 0.400188 -0.0856251 +-0.293995 0.383588 -0.124542 +0.127541 0.397164 -0.0911578 +-0.131511 0.396887 -0.0916028 +-0.155857 0.393209 -0.093857 +-0.000573816 0.396335 -0.0818941 +0.302527 0.377502 -0.124803 +-0.0642425 0.39193 -0.0822507 +0.158204 0.385563 -0.0909827 +0.0374964 0.390618 -0.0802111 +-0.260175 0.376592 -0.110907 +-0.139229 0.380837 -0.0859001 +0.285894 0.367002 -0.114803 +0.143473 0.379063 -0.0858188 +0.195026 0.374412 -0.0934787 +0.0344514 0.381105 -0.0761102 +-0.00766073 0.383199 -0.0763661 +0.0657895 0.379646 -0.0772106 +-0.310401 0.360058 -0.120222 +-0.148207 0.37494 -0.0848744 +-0.187256 0.372063 -0.0908769 +-0.225617 0.369741 -0.0986742 +-0.0388576 0.378705 -0.0752988 +0.280839 0.35638 -0.108864 +0.158145 0.365962 -0.0829057 +0.189525 0.363806 -0.08801 +0.0618817 0.370103 -0.0730728 +-0.0414619 0.370194 -0.0719712 +-0.0832917 0.369568 -0.074537 +0.093311 0.368388 -0.0750224 +0.299583 0.353059 -0.11366 +0.125724 0.367158 -0.0783772 +-0.151491 0.36569 -0.0816748 +-0.000929965 0.367646 -0.0700348 +0.080997 0.364516 -0.072332 +0.275285 0.346193 -0.103134 +0.333944 0.339707 -0.12075 +-0.0857052 0.356873 -0.069787 +-0.0151897 0.358137 -0.0664547 +0.301003 0.341077 -0.109459 +-0.279691 0.343854 -0.103598 +-0.12263 0.354915 -0.0731788 +-0.241755 0.345926 -0.0934185 +-0.132109 0.352362 -0.0735076 +0.101698 0.352309 -0.0696581 +0.328298 0.329644 -0.114813 +-0.128856 0.345276 -0.070387 +-0.168202 0.34155 -0.0753098 +-0.206819 0.338819 -0.0821616 +0.137391 0.339058 -0.0693211 +0.234883 0.328253 -0.0850794 +-0.0624612 0.335959 -0.0601968 +-0.295707 0.32003 -0.099923 +0.316577 0.316279 -0.105714 +-0.341332 0.312627 -0.113571 +-0.199676 0.421138 -0.115256 +0.347271 0.306334 -0.113681 +0.319584 0.310632 -0.104805 +-0.105944 0.32339 -0.0596838 +0.0353718 0.325932 -0.0552688 +-0.345293 0.303404 -0.111902 +0.0445238 0.320184 -0.0536913 +0.0551771 0.318911 -0.053823 +0.345306 0.298676 -0.110305 +0.161287 0.3117 -0.0636083 +0.0644229 0.315518 -0.0532697 +0.283805 0.301922 -0.0898913 +0.228464 0.419143 -0.121294 +0.0964862 0.313872 -0.0554499 +-0.187671 0.308957 -0.0676239 +-0.229851 0.308315 -0.0769018 +0.341954 0.295382 -0.107914 +-0.311178 0.296325 -0.0970275 +-0.356745 0.289089 -0.111653 +-0.0120075 0.303684 -0.0473029 +-0.0825817 0.302515 -0.0504397 +0.336086 0.285244 -0.102402 +0.247129 0.290234 -0.0755047 +-0.224734 0.291069 -0.0700679 +0.250563 0.28698 -0.0754132 +0.242655 0.28381 -0.0723307 +-0.164851 0.287306 -0.0564539 +-0.307371 0.277332 -0.0897199 +-0.203895 0.284922 -0.0633857 +-0.241254 0.282023 -0.0714206 +0.205974 0.275614 -0.0610582 +0.29662 0.267991 -0.0833773 +0.0438866 0.281597 -0.0414714 +-0.0584065 0.282513 -0.0425163 +0.35441 0.260899 -0.102044 +-0.0345825 0.375158 -0.0736844 +-0.338187 0.25828 -0.0950575 +-0.220356 0.265178 -0.0613179 +0.104143 0.269331 -0.0425998 +-0.181382 0.267175 -0.0535763 +-0.383674 0.251544 -0.111451 +0.200005 0.265333 -0.0568157 +0.168773 0.26647 -0.0510483 +0.136615 0.268151 -0.0463587 +0.0713703 0.270258 -0.0398609 +-0.0319013 0.270115 -0.0377007 +-0.386214 0.250127 -0.112151 +0.290974 0.257454 -0.0785602 +-0.141666 0.266208 -0.0465514 +-0.18083 0.263405 -0.0524143 +0.34884 0.250899 -0.0970271 +-0.219273 0.261106 -0.0599239 +-0.344674 0.25059 -0.095343 +-0.00352536 0.259066 -0.0341468 +0.255343 0.249621 -0.0659285 +0.00746244 0.257987 -0.0338805 +-0.0752844 0.257505 -0.0366603 +0.37147 0.236683 -0.10223 +-0.269707 0.24397 -0.0684762 +-0.353633 0.234726 -0.0945457 +-0.335856 0.236163 -0.0881734 +0.157348 0.246287 -0.043661 +-0.399432 0.228193 -0.112091 +0.249902 0.239253 -0.0617532 +-0.049663 0.246561 -0.032146 +-0.291088 0.236393 -0.0729691 +0.219689 0.241564 -0.0548102 +-0.11824 0.245898 -0.0379431 +0.308805 0.233123 -0.0778865 +-0.157608 0.24241 -0.0427138 +0.219481 0.238402 -0.0539597 +-0.196397 0.239695 -0.0492243 +0.188568 0.239678 -0.0476364 +-0.23498 0.237392 -0.0574347 +0.365587 0.225929 -0.097059 +-0.28833 0.231361 -0.0708401 +0.155915 0.238705 -0.0415061 +-0.319701 0.227687 -0.0802446 +0.0514345 0.236807 -0.0298057 +0.212855 0.230606 -0.0505191 +-0.364756 0.220697 -0.0954305 +0.181376 0.232003 -0.0443444 +-0.409802 0.213996 -0.113283 +-0.285084 0.220813 -0.067279 +0.338002 0.216118 -0.0840046 +0.388672 0.211284 -0.103176 +-0.0235762 0.226467 -0.0262665 +-0.0505787 0.226631 -0.0273335 +-0.0936985 0.224658 -0.0300777 +-0.133839 0.221666 -0.0341058 +0.267319 0.214576 -0.0605864 +-0.17309 0.218762 -0.0396962 +-0.421376 0.200159 -0.115478 +0.325866 0.208383 -0.0778353 +-0.0500347 0.220798 -0.0259648 +0.319669 0.207334 -0.0754329 +0.382133 0.201101 -0.0980397 +-0.0671808 0.213867 -0.02545 +0.230791 0.206217 -0.0491004 +0.319365 0.197746 -0.0732301 +-0.261855 0.199352 -0.0557064 +-0.433017 0.186376 -0.118093 +0.40446 0.186217 -0.104603 +-0.346219 0.189868 -0.0812602 +0.428284 0.183171 -0.115115 +0.193692 0.197682 -0.0390602 +0.0641092 0.201747 -0.0226628 +-0.14965 0.198331 -0.0313567 +-0.188447 0.195366 -0.0375449 +-0.227429 0.192796 -0.0454813 +0.000315108 0.326136 -0.0546773 +0.342502 0.183697 -0.0786164 +0.0840583 0.193855 -0.0225777 +0.124078 0.19018 -0.0261231 +-0.0829168 0.189604 -0.0216468 +0.426298 0.171489 -0.111821 +0.247517 0.180821 -0.048139 +-0.401968 0.169372 -0.100147 +0.336272 0.172811 -0.074226 +-0.277319 0.175994 -0.0554788 +-0.0609648 0.181258 -0.018456 +0.0157862 0.179826 -0.0164282 +-0.323358 0.169186 -0.0689706 +0.419586 0.161208 -0.106714 +0.24183 0.170969 -0.0448625 +-0.203781 0.171792 -0.0361739 +0.3592 0.1585 -0.0802973 +-0.413575 0.155475 -0.102903 +-0.288494 0.161855 -0.0562975 +-0.0982133 0.166078 -0.0187905 +0.0768509 0.167309 -0.0170953 +0.173549 0.163974 -0.0289215 +0.284546 0.189796 -0.0603131 +0.20566 0.162665 -0.0349902 +-0.138684 0.164077 -0.0233499 +0.283938 0.154578 -0.0536993 +-0.254189 0.154898 -0.0453301 +-0.425089 0.141469 -0.105972 +0.380917 0.143667 -0.0866206 +-0.337949 0.145496 -0.0701497 +0.259118 0.146119 -0.0452714 +0.317918 0.140353 -0.0623278 +0.0281712 0.145217 -0.0110013 +-0.152786 0.1395 -0.021636 +0.222164 0.137486 -0.0347327 +-0.191614 0.136819 -0.0281129 +-0.230737 0.134084 -0.0362666 +-0.368178 0.126237 -0.0788544 +0.0890481 0.133079 -0.012903 +0.152867 0.130282 -0.0203785 +0.120824 0.131481 -0.0160719 +-0.0861868 0.131159 -0.0123922 +-0.315186 0.124307 -0.0591464 +0.396138 0.118164 -0.089444 +0.275618 0.121196 -0.0464036 +-0.35993 0.1177 -0.0744748 +-0.0362746 -0.234164 -0.0284798 +-0.258699 -0.226538 -0.0609819 +-0.434215 -0.21157 -0.124389 +0.42752 -0.214187 -0.121734 +0.249577 0.106525 -0.037522 +-0.399663 -0.217581 -0.109535 +-0.218605 -0.191136 -0.0430888 +-0.214652 -0.3151 -0.0755344 +0.376119 -0.113084 -0.0803552 +0.164959 -0.236411 -0.042452 +-0.254246 -0.22982 -0.0605631 +-0.0271173 -0.432371 -0.0987118 +0.432325 -0.071042 -0.101085 +-0.269562 -0.292719 -0.0825841 +-0.113671 -0.196018 -0.0260103 +0.0731649 0.109072 -0.00866247 +-0.365854 -0.225131 -0.0969681 +-0.0470414 -0.365655 -0.0704392 +-0.185188 -0.282919 -0.0589038 +0.203537 0.0556725 -0.0225169 +-0.257789 -0.236004 -0.0630653 +0.406644 -0.201391 -0.108887 +-0.147486 -0.174744 -0.0264948 +-0.207716 -0.176669 -0.0378971 +0.312776 -0.249822 -0.0836157 +0.140992 -0.433253 -0.109824 +0.0333314 -0.402352 -0.085122 +-0.00830067 -0.287415 -0.0422298 +-0.208308 -0.0854746 -0.0256787 +0.151528 -0.419903 -0.10517 +-0.0466278 -0.247355 -0.0321977 +0.0559367 -0.247074 -0.0326192 +0.317491 -0.235746 -0.0815103 +0.012839 0.121216 -0.00745692 +-0.190492 -0.201579 -0.0392302 +-0.134944 -0.224296 -0.0348671 +0.270277 -0.0865979 -0.0411198 +-0.331894 -0.317046 -0.111558 +0.186153 -0.251213 -0.0501373 +0.0517427 -0.165443 -0.0151389 +-0.130559 -0.139025 -0.0183553 +0.255532 -0.243944 -0.0644816 +0.153313 -0.25098 -0.0442258 +0.391155 0.0624379 -0.0817956 +-0.320505 -0.217942 -0.0781659 +0.24871 -0.0718258 -0.0340889 +-0.303843 -0.2429 -0.0787622 +-0.0106979 -0.0731177 -0.00273406 +-0.239716 -0.0254341 -0.0294901 +-0.0913774 -0.0769589 -0.00716189 +0.0675378 -0.233564 -0.030007 +-0.271108 -0.206187 -0.0597941 +0.322381 -0.321029 -0.109489 +-0.0587951 -0.260536 -0.0363279 +0.443595 -0.19072 -0.1243 +-0.417233 -0.235505 -0.122245 +0.0118245 -0.302928 -0.0470598 +0.391117 -0.180494 -0.0975316 +-0.393795 0.0761873 -0.0839644 +0.370695 -0.0745302 -0.0742406 +-0.383442 -0.24273 -0.108903 +-0.175863 -0.396974 -0.0991759 +-0.297674 -0.147527 -0.0568001 +-0.264836 -0.257341 -0.0706791 +0.376414 -0.246817 -0.107031 +0.419897 0.0063556 -0.0924506 +-0.348322 -0.249527 -0.0964471 +-0.00909669 -0.371887 -0.0717667 +0.313051 -0.293429 -0.0967288 +0.189614 -0.0169286 -0.0182873 +0.322937 -0.254953 -0.0885668 +0.174744 -0.265801 -0.0519419 +0.207096 -0.266125 -0.0585709 +0.0021308 -0.13968 -0.00980561 +-0.314585 -0.29956 -0.0992778 +-0.241146 -0.261625 -0.0654407 +-0.394142 -0.0669126 -0.0833897 +0.00291706 -0.273446 -0.038117 +-0.168109 -0.235199 -0.0427012 +-0.0689543 -0.274824 -0.0409811 +0.00168568 -0.316305 -0.0513438 +-0.404784 0.0622285 -0.0877076 +-0.476099 -0.0248398 -0.120959 +0.406506 -0.156618 -0.0998757 +0.0334286 -0.274568 -0.0390134 +-0.0380141 -0.0727536 -0.00337478 +-0.0784041 -0.0728647 -0.00574474 +-0.222916 0.315136 -0.0775048 +-0.267709 -0.0701488 -0.0390572 +-0.346182 0.105036 -0.0677312 +-0.213016 -0.271803 -0.0615187 +-0.286454 -0.26766 -0.0800529 +-0.18429 -0.444179 -0.123221 +0.184227 -0.37962 -0.0933858 +-0.155973 -0.212232 -0.0353084 +-0.108073 -0.277597 -0.0454005 +0.131137 -0.277632 -0.048305 +0.256844 0.0394633 -0.0343531 +-0.0771501 -0.449119 -0.109865 +0.265914 -0.27286 -0.0754262 +-0.147426 -0.280654 -0.0515807 +0.354382 -0.0988239 -0.0701358 +-0.101066 -0.28409 -0.046544 +0.0788698 -0.219149 -0.0275015 +-0.0405966 -0.455404 -0.110641 +0.204414 0.00692327 -0.0211401 +0.196662 -0.280865 -0.0606177 +-0.231345 -0.246771 -0.0589453 +0.433094 -0.161982 -0.113325 +0.0430844 -0.30618 -0.0490018 +-0.41539 0.0483081 -0.0916401 +0.255812 0.00783426 -0.0333051 +-0.236651 -0.282109 -0.070263 +-0.230086 -0.113042 -0.0334175 +-0.331433 -0.274338 -0.0972869 +0.383913 -0.269878 -0.116951 +0.00421775 -0.229381 -0.0266724 +0.398765 0.0702648 -0.0856428 +-0.118861 -0.291632 -0.0508831 +0.244682 -0.317348 -0.083801 +0.464734 0.082861 -0.118435 +-0.425772 0.0346635 -0.0958337 +0.385428 -0.274954 -0.119179 +0.206466 -0.351456 -0.0868457 +0.390985 -0.0896544 -0.0839798 +-0.157477 -0.294523 -0.05742 +-0.291452 -0.186109 -0.0616933 +-0.246774 -0.29176 -0.0758904 +-0.417074 0.0966321 -0.0962792 +0.365865 -0.218173 -0.0952664 +0.349909 -0.284347 -0.107414 +-0.0366426 0.381206 -0.0762365 +-0.0595624 -0.303905 -0.0491612 +0.426606 -0.0319422 -0.0961265 +0.417697 -0.094776 -0.0963705 +0.127185 -0.154173 -0.0201763 +-0.088619 -0.420926 -0.0972443 +0.00986239 -0.307075 -0.0483658 +0.143387 -0.221261 -0.0353842 +-0.0999937 -0.306938 -0.0535379 +0.270799 -0.177587 -0.0538864 +0.0120606 -0.386807 -0.077918 +-0.0595452 -0.388302 -0.0803937 +0.275609 -0.301058 -0.0870905 +-0.244131 -0.341692 -0.0924503 +-0.241673 -0.303581 -0.0783532 +0.207178 -0.132637 -0.0307297 +0.443571 -0.100341 -0.109395 +-0.241902 -0.346078 -0.0935158 +-0.252597 -0.139922 -0.042599 +-0.0689875 -0.140674 -0.0123504 +-0.186321 -0.368397 -0.0891936 +-0.069402 -0.317242 -0.0541981 +-0.0236575 -0.178958 -0.0164278 +0.312439 -0.116819 -0.0572725 +0.206974 -0.309471 -0.0718891 +-0.145979 -0.31509 -0.0622322 +0.345034 -0.298143 -0.110021 +0.327915 -0.0929426 -0.0598759 +-0.37134 0.103747 -0.0773173 +-0.0490433 -0.318119 -0.0532184 +0.00150078 -0.358748 -0.0665668 +-0.46958 -0.11237 -0.12429 +0.162619 -0.406619 -0.100992 +-0.0036004 -0.101309 -0.00515148 +-0.162724 -0.212653 -0.0365169 +-0.0608548 0.108811 -0.00780201 +-0.0855854 -0.417865 -0.095531 +0.108408 -0.432612 -0.104961 +-0.288025 -0.310471 -0.094103 +0.344322 -0.160235 -0.0749231 +-0.27008 -0.336067 -0.0977161 +-0.201702 -0.215959 -0.0446581 +-0.382823 -0.108296 -0.0825479 +-0.00618798 -0.447997 -0.105986 +-0.179544 0.1017 -0.0215211 +-0.224182 -0.15182 -0.037351 +0.291483 -0.101545 -0.0488289 +0.180729 -0.170025 -0.0312749 +0.421835 -0.133117 -0.103153 +-0.46059 0.110233 -0.119258 +-0.438881 0.0687127 -0.104086 +0.315876 0.0331228 -0.051778 +0.172751 0.00838466 -0.0150701 +-0.00853834 -0.329382 -0.0558419 +0.401195 -0.208904 -0.108147 +0.124049 -0.22372 -0.033273 +0.120106 -0.0171879 -0.00738774 +-0.0487963 -0.330859 -0.0575821 +-0.185421 -0.32556 -0.0728378 +-0.0799601 -0.330788 -0.0596886 +0.11748 -0.351311 -0.0711409 +-0.311875 0.182847 -0.067637 +0.103684 -0.441473 -0.108736 +0.0251116 -0.335554 -0.0583138 +-0.118908 -0.334284 -0.0650587 +-0.17908 -0.331295 -0.0736234 +-0.0656691 -0.431797 -0.100423 +-0.348817 -0.115566 -0.0699618 +-0.200417 -0.331751 -0.078168 +-0.0609942 0.0759702 -0.0047572 +-0.157787 -0.337089 -0.0718437 +-0.0745362 -0.101924 -0.00800406 +0.26327 0.0536327 -0.0367698 +0.417137 0.103005 -0.0970125 +0.0316724 -0.0749727 -0.00331752 +-0.0469613 -0.417898 -0.0927206 +0.216981 -0.337205 -0.0839151 +0.3339 0.114837 -0.064413 +-0.154819 -0.454677 -0.122903 +0.0546658 -0.416729 -0.0926145 +-0.213506 -0.417 -0.116526 +-0.290519 0.0545826 -0.0446889 +-0.0573774 -0.345201 -0.0632267 +-0.0608452 -0.346484 -0.0639193 +-0.440756 -0.0804939 -0.10599 +0.349305 -0.32706 -0.121924 +-0.478127 0.0237052 -0.122029 +0.18925 0.138049 -0.0278237 +0.0435199 -0.129364 -0.00935832 +0.448034 -0.138364 -0.116756 +-0.0024506 -0.192299 -0.0186666 +-0.34306 -0.154302 -0.073447 +-0.275273 -0.211318 -0.0621464 +-0.256064 0.0475156 -0.0345087 +-0.255931 -0.341543 -0.0956505 +-0.394558 0.124411 -0.0895901 +0.294599 0.285194 -0.0879277 +0.111354 -0.220293 -0.0309432 +0.274909 -0.343423 -0.101954 +0.152173 0.225739 -0.0377707 +0.355904 -0.18943 -0.0848777 +-0.138179 -0.353157 -0.0746966 +-0.165435 -0.425741 -0.110407 +0.143535 -0.353375 -0.0755953 +-0.056201 -0.463744 -0.115815 +0.20125 -0.0713166 -0.0230596 +0.085542 -0.357975 -0.0701954 +-0.0570325 -0.359589 -0.068634 +-0.297368 -0.224345 -0.0719688 +0.211844 -0.0713356 -0.0253035 +-0.277019 -0.0293292 -0.0395834 +-0.0698464 -0.359925 -0.0696371 +0.360621 -0.136684 -0.0773569 +0.0207598 0.429977 -0.0973987 +0.0760429 -0.431403 -0.101051 +0.297399 0.106562 -0.051212 +0.112381 0.353221 -0.0712345 +0.275269 -0.322977 -0.0945097 +0.315489 -0.015723 -0.0512011 +-0.303719 0.035545 -0.0479017 +-0.21409 -0.357097 -0.0907983 +-0.260477 0.258343 -0.0697254 +-0.177408 -0.359701 -0.0839532 +0.3081 -0.168968 -0.0637714 +0.43773 0.0879706 -0.105208 +-0.259424 -0.35378 -0.101368 +-0.287632 -0.353193 -0.109763 +-0.197607 -0.430154 -0.119138 +0.0687962 -0.478961 -0.124864 +-0.328471 -0.241145 -0.0867881 +-0.00289466 0.0981268 -0.00483029 +0.302284 -0.221203 -0.0728035 +-0.0137547 -0.206017 -0.0215483 +-0.0459592 0.0855348 -0.00472539 +-0.323719 -0.0885481 -0.0579992 +-0.336847 -0.192874 -0.0784067 +-0.292563 -0.094903 -0.0484746 +0.374398 0.133062 -0.0823288 +0.0981687 -0.446219 -0.110477 +-0.277811 0.020089 -0.0395744 +0.0841776 -0.166649 -0.0175834 +-0.196304 -0.163386 -0.0331651 +0.015269 -0.462861 -0.113701 +-0.0584429 -0.313696 -0.0522769 +-0.30056 -0.362604 -0.117854 +-0.11609 -0.451481 -0.115303 +0.462571 -0.114675 -0.120866 +-0.261486 -0.364863 -0.106412 +-0.166921 0.0672366 -0.016325 +-0.468753 0.0863145 -0.120898 +0.0212971 -0.460549 -0.112621 +-0.390612 -0.021499 -0.0796958 +0.118927 -0.420123 -0.10036 +-0.378352 -0.147137 -0.0861068 +-0.0335591 -0.401489 -0.0847513 +0.153989 -0.116715 -0.018845 +0.264578 -0.357813 -0.104473 +0.132227 -0.23583 -0.0372435 +0.248676 -0.368884 -0.104408 +0.402204 -0.118028 -0.0920897 +0.399949 0.0215943 -0.083717 +0.0370534 -0.47688 -0.121813 +-0.165633 0.0186311 -0.0139885 +-0.268427 0.0823744 -0.0402284 +-0.280664 0.117361 -0.0473962 +0.279176 0.0246351 -0.0400762 +0.021553 -0.374416 -0.0729895 +-0.00311279 -0.320121 -0.0526286 +0.447495 0.156516 -0.119517 +0.226839 -0.00796682 -0.0261003 +-0.388515 -0.162597 -0.0930171 +-0.0683167 -0.378204 -0.0768018 +-0.0999703 -0.392152 -0.085548 +0.234125 -0.366496 -0.0995189 +-0.0735464 0.09655 -0.00739281 +0.28715 -0.116077 -0.0491734 +-0.131349 -0.191955 -0.0274258 +-0.0780205 -0.41337 -0.0927854 +-0.147666 -0.365504 -0.0809779 +0.129049 -0.406617 -0.0955613 +-0.41793 -0.101831 -0.0972459 +-0.193123 -0.316415 -0.0712454 +-0.235629 -0.166477 -0.0425219 +0.0211323 -0.394164 -0.0812029 +-0.0365741 -0.383047 -0.0769954 +0.0185964 -0.0350834 -0.000788648 +0.0384233 -0.366571 -0.0704036 +-0.411536 -0.14017 -0.0994499 +-0.307979 -0.0700763 -0.0511911 +-0.352228 -0.129478 -0.0730852 +-0.278998 0.0688068 -0.0421766 +-0.0628805 0.375434 -0.0752863 +-0.311217 -0.0214976 -0.0499042 +0.223614 -0.200097 -0.0460828 +-0.219145 -0.0992081 -0.0293645 +0.337276 0.0179692 -0.0587656 +-0.110069 -0.404413 -0.0920709 +-0.241852 0.119908 -0.0371244 +-0.227582 -0.121731 -0.0338799 +-0.222503 -0.120925 -0.0325965 +-0.369515 0.0556534 -0.0724435 +0.195343 -0.365843 -0.0900551 +-0.241536 -0.127666 -0.0380427 +0.219296 0.0785892 -0.027512 +0.229017 -0.147865 -0.0378735 +-0.405996 0.110337 -0.0928103 +-0.30434 0.251285 -0.0811783 +0.458793 -0.0761272 -0.114724 +0.276034 -0.126405 -0.0472004 +0.0866742 -0.419091 -0.0962023 +0.250124 -0.162661 -0.0455477 +0.096278 -0.387252 -0.0830666 +0.465664 -0.0138718 -0.115147 +0.244471 -0.214976 -0.054474 +0.242897 0.289516 -0.074159 +-0.146701 -0.0352913 -0.0114489 +0.255141 0.0877599 -0.0370871 +-0.236456 -0.0747922 -0.0312407 +-0.179903 -0.188115 -0.0344703 +-0.211664 0.216203 -0.0468711 +0.0515569 -0.119638 -0.00852203 +0.157329 -0.0155793 -0.0125767 +-0.0631533 -0.0986346 -0.00688225 +-0.0251942 -0.219902 -0.0248034 +0.10491 -0.384267 -0.082758 +-0.382464 0.0896923 -0.0803934 +0.22436 -0.135342 -0.0349378 +-0.205412 -0.386496 -0.100874 +-0.0641785 -0.0262699 -0.00240739 +0.358579 0.00291787 -0.0665053 +0.156997 -0.114766 -0.0190919 +0.167763 -0.294476 -0.0591815 +0.23898 0.112745 -0.0355431 +0.148076 -0.0781364 -0.0141156 +0.167652 -0.231593 -0.0417425 +-0.267266 0.0337543 -0.0369686 +-0.110927 -0.409526 -0.0944704 +-0.218633 0.0991114 -0.0292393 +0.306871 -0.218937 -0.0737727 +-0.00203903 -0.433886 -0.0990345 +-0.124112 -0.210014 -0.0302112 +0.202469 -0.185235 -0.0383897 +-0.277879 -0.0699389 -0.0419334 +0.116498 -0.385831 -0.0848155 +-0.202204 -0.177858 -0.0369422 +-0.0449236 0.0359892 -0.00165805 +0.398963 -0.0271432 -0.0834348 +0.0260774 -0.436721 -0.100781 +-0.0446133 0.366259 -0.070557 +-0.427921 0.0826287 -0.0999689 +-0.0444873 -0.0776868 -0.00401524 +0.201959 -0.0944734 -0.0251731 +-0.0192663 -0.428977 -0.0968902 +0.447042 0.00140193 -0.105488 +0.0448523 -0.427151 -0.0969328 +-0.303881 -0.109162 -0.0535645 +-0.185945 -0.221602 -0.0427555 +0.279835 0.278974 -0.0813783 +0.281979 -0.206724 -0.0631151 +0.358473 -0.312051 -0.120158 +0.013972 -0.259631 -0.0343932 +-0.37208 -0.0678666 -0.0742838 +-0.439836 -0.171838 -0.118515 +0.0112421 -0.417832 -0.0915454 +-0.0511221 -0.140067 -0.0111785 +0.133007 0.354487 -0.0744471 +0.135017 -0.400822 -0.0938474 +0.307198 -0.0779408 -0.0515515 +0.0333382 0.410671 -0.0888263 +0.46623 0.0344906 -0.116009 +0.472852 -0.00359676 -0.118865 +0.338768 -0.212476 -0.0834356 +-0.362624 0.0607376 -0.0700458 +-0.358051 0.113378 -0.0732071 +0.170133 0.10568 -0.020262 +-0.457986 0.100069 -0.116691 +-0.356635 -0.0285212 -0.0661916 +-0.265456 0.141153 -0.0462658 +-0.368995 -0.194495 -0.0911464 +-0.213759 -0.137808 -0.0328826 +-0.302544 0.0896071 -0.0510861 +-0.180987 -0.229173 -0.0435883 +-0.197154 -0.0718069 -0.0222606 +-0.206173 0.0641552 -0.0235898 +0.175173 -0.222352 -0.0408992 +0.314309 0.0815787 -0.0541911 +0.0578269 0.0852935 -0.00532363 +-0.1716 -0.210833 -0.0376576 +-0.226203 -0.11898 -0.0332137 +0.318633 -0.198069 -0.073047 +0.0500061 -0.206864 -0.0229091 +-0.313997 -0.195123 -0.0708429 +0.169085 -0.185219 -0.0319584 +-0.128364 0.0699756 -0.0107447 +-0.325752 0.11061 -0.0610374 +0.388586 0.0952562 -0.0835244 +-0.280513 -0.168413 -0.05504 +-0.261008 0.312802 -0.0867476 +-0.172014 0.328773 -0.0713884 +0.242745 -0.157634 -0.042803 +0.356074 0.10017 -0.0709265 +0.293445 0.0478747 -0.0452237 +-0.140651 0.104515 -0.0154727 +0.065505 -0.10322 -0.00750076 +0.187103 0.0806356 -0.0209748 +0.437247 -0.109792 -0.107385 +0.444453 0.0983516 -0.109613 +-0.00435099 -0.0296338 -0.000448646 +-0.40762 -0.0322446 -0.0874178 +-0.072767 -0.0328422 -0.00319192 +0.3649 -0.0283103 -0.0693836 +0.188551 0.0323342 -0.0184689 +0.381791 0.109272 -0.0822334 diff --git a/image_analysis/indexing/fast-feedback-indexer/data/image4_local.txt b/image_analysis/indexing/fast-feedback-indexer/data/image4_local.txt new file mode 100644 index 000000000..c75e2e060 --- /dev/null +++ b/image_analysis/indexing/fast-feedback-indexer/data/image4_local.txt @@ -0,0 +1,295 @@ +36.9 0 0 4.83429e-15 78.95 0 4.83429e-15 4.83429e-15 78.95 +0.080314 0.474443 -0.123385 +0.140545 0.462219 -0.124443 +0.0757162 0.463932 -0.117371 +0.0138661 0.465252 -0.11493 +-0.0987194 0.461895 -0.118576 +0.118469 -0.341539 -0.0676288 +-0.2049 -0.257736 -0.0557606 +0.0160835 0.292794 -0.0439596 +-0.19721 -0.0719239 -0.0222805 +0.248815 -0.0717231 -0.0341083 +0.43234 -0.0710139 -0.10109 +-0.291448 -0.186017 -0.0616738 +0.370425 -0.0740723 -0.074096 +-0.241951 0.120133 -0.0371772 +0.06662 -0.0828956 -0.00567104 +-0.440633 -0.0801935 -0.105902 +-0.166439 0.405994 -0.101408 +-0.292791 -0.0947829 -0.0485328 +0.391044 -0.0896025 -0.0839998 +0.327985 -0.092917 -0.0598977 +-0.208281 -0.0854332 -0.0256693 +-0.219105 -0.099189 -0.0293536 +-0.0746988 -0.101975 -0.00802162 +-0.388494 -0.162127 -0.0929239 +0.291465 -0.101507 -0.0488193 +-0.417599 -0.101572 -0.0970638 +-0.230208 -0.112911 -0.0334311 +-0.295479 0.320076 -0.0998649 +-0.382746 -0.108264 -0.0825118 +0.250345 -0.162762 -0.0456227 +0.312431 -0.116725 -0.0572583 +-0.165694 -0.425806 -0.110486 +0.3471 0.306012 -0.113502 +0.365237 0.226172 -0.0969785 +-0.061261 0.400281 -0.0856573 +-0.304299 -0.275115 -0.0880164 +0.035577 -0.232061 -0.0279496 +0.421969 -0.133 -0.103199 +0.125715 0.367452 -0.0784931 +-0.239865 0.410125 -0.120078 +0.307237 -0.0777729 -0.0515503 +-0.411697 -0.140065 -0.0995072 +0.448087 -0.138215 -0.116759 +-0.297972 -0.147521 -0.0568934 +-0.224601 -0.151851 -0.0374535 +0.228423 0.146263 -0.0374878 +0.0368797 -0.477074 -0.121911 +-0.31462 -0.298695 -0.0990031 +-0.101627 -0.368937 -0.0761182 +-0.33686 -0.192765 -0.078389 +-0.147969 0.311353 -0.0612965 +0.242935 -0.15764 -0.0428521 +-0.402113 0.169623 -0.100259 +0.0516651 -0.165785 -0.0151924 +-0.434103 -0.211052 -0.124208 +0.406437 -0.156467 -0.0998182 +-0.235726 -0.166198 -0.0424971 +-0.308721 -0.162311 -0.0627984 +0.195464 -0.40643 -0.107471 +0.180881 -0.170011 -0.0313007 +0.218247 0.240653 -0.0542441 +0.194617 0.37392 -0.0931881 +0.43346 -0.161787 -0.113469 +-0.208387 -0.176425 -0.0379973 +0.237193 -0.17761 -0.0449113 +-0.311193 -0.021609 -0.0498989 +0.270909 -0.177445 -0.0538914 +-0.439532 -0.171298 -0.118258 +-0.00263249 -0.191812 -0.0185718 +0.337956 -0.181301 -0.0764657 +0.120407 0.131559 -0.0160314 +-0.238738 0.291327 -0.0736454 +-0.218607 -0.190655 -0.0429933 +0.427742 -0.214008 -0.121799 +0.249661 0.106512 -0.0375425 +0.390853 -0.180094 -0.0973372 +0.355467 -0.189235 -0.0846678 +-0.38364 0.251783 -0.111504 +-0.190665 -0.201535 -0.0392551 +-0.154811 -0.454055 -0.122579 +-0.0141015 -0.206142 -0.0215796 +0.252266 -0.413088 -0.124946 +0.318357 -0.198153 -0.0729703 +-0.206951 0.339762 -0.08254 +0.437255 0.0884195 -0.10502 +-0.162961 -0.212476 -0.0365179 +0.244461 -0.21467 -0.0544018 +0.143528 -0.221278 -0.035409 +-0.288303 0.162018 -0.0562674 +0.4473 0.156452 -0.119406 +0.33908 -0.212302 -0.0835106 +-0.134932 -0.223928 -0.03478 +0.322729 -0.27818 -0.0953112 +0.401328 -0.208892 -0.108204 +0.157305 -0.0155203 -0.0125719 +0.302355 -0.221071 -0.0727951 +0.0541585 -0.41772 -0.0930398 +0.0217951 -0.374882 -0.0731838 +0.0671752 -0.233599 -0.0299902 +0.245688 0.413119 -0.123091 +-0.157467 0.242504 -0.0427143 +0.1649 -0.236911 -0.0425652 +-0.176366 -0.396785 -0.099191 +-0.343405 -0.154401 -0.0735913 +-0.33137 -0.232617 -0.0856241 +-0.470269 -0.112638 -0.124695 +-0.00410877 0.259114 -0.0341619 +0.0248507 -0.245444 -0.0309078 +-0.240893 -0.260936 -0.0651828 +0.398746 0.0704053 -0.0856453 +-0.367094 -0.236032 -0.10026 +-0.289972 -0.244342 -0.0746819 +0.186324 -0.251365 -0.0502111 +0.0929767 0.367784 -0.0747486 +-0.417374 -0.235239 -0.122241 +-0.304152 0.251265 -0.0811109 +-0.461116 0.11088 -0.119615 +-0.259793 0.376793 -0.11088 +-0.00910633 -0.372154 -0.0718738 +-0.273012 -0.142409 -0.0485883 +-0.337746 0.258373 -0.0949192 +-0.00880206 -0.329613 -0.0559249 +0.0963537 0.31363 -0.0553559 +-0.0686878 -0.274827 -0.0409629 +-0.242191 -0.346108 -0.0936045 +-0.212859 -0.271647 -0.061438 +-0.108599 -0.277338 -0.045385 +-0.287461 -0.267843 -0.0804204 +0.443933 -0.190483 -0.12442 +-0.241776 0.345871 -0.0934031 +0.26588 -0.273075 -0.0754797 +-0.253326 -0.273431 -0.0720661 +0.196861 -0.28115 -0.0607448 +-0.185133 -0.282714 -0.0588313 +-0.33157 -0.274213 -0.0972994 +0.151818 -0.420205 -0.105361 +-0.258043 -0.235921 -0.0631143 +0.298054 0.106493 -0.05141 +0.336163 0.0664745 -0.060545 +0.232271 -0.407979 -0.117049 +-0.0386469 0.379066 -0.0754377 +0.0762492 -0.431408 -0.101071 +-0.276815 -0.0294352 -0.0395276 +-0.109233 -0.405106 -0.092279 +0.377781 0.187681 -0.0933262 +0.399902 0.0218057 -0.0837015 +0.284427 0.190221 -0.060363 +-0.186921 0.372238 -0.09088 +0.359103 -0.312241 -0.120483 +0.283376 0.301848 -0.089733 +-0.0117451 0.303522 -0.0472479 +-0.315247 -0.342591 -0.114986 +0.108307 -0.432513 -0.104901 +0.207272 -0.265993 -0.0585723 +-0.077464 -0.448558 -0.10961 +-0.215536 0.157448 -0.0362809 +0.353163 0.232069 -0.093678 +-0.116576 -0.451683 -0.11547 +-0.425768 0.0345394 -0.0958271 +0.0517753 0.237318 -0.0299488 +0.436664 -0.109191 -0.107026 +0.224487 -0.331124 -0.0835054 +0.410096 0.196574 -0.109394 +-0.254128 0.155105 -0.0453476 +0.121036 0.416568 -0.0989885 +0.242349 0.283555 -0.0721726 +0.180963 -0.395838 -0.0996863 +0.0237481 -0.311575 -0.0500753 +0.183933 -0.379524 -0.0932863 +0.381847 0.201161 -0.097932 +0.311967 0.283802 -0.0932844 +0.359094 0.158366 -0.0802327 +0.022732 -0.415568 -0.0907218 +-0.196284 0.239858 -0.0492422 +-0.23224 -0.417133 -0.121328 +-0.311228 0.296511 -0.0971054 +0.0691479 0.426312 -0.0980706 +-0.458052 0.10017 -0.116737 +-0.410666 0.214262 -0.113746 +-0.0802654 -0.331168 -0.0598484 +-0.031753 0.270446 -0.0377886 +0.104388 -0.234242 -0.0334422 +-0.186171 -0.367859 -0.0889457 +0.181363 0.232455 -0.0444518 +-0.203762 0.284976 -0.0633732 +-0.341326 0.312733 -0.113606 +-0.332924 -0.316939 -0.111906 +0.241598 0.17098 -0.0448056 +-0.365046 -0.224314 -0.0964378 +-0.0279276 -0.433146 -0.0991091 +0.0440897 0.281757 -0.0415276 +0.389229 0.150845 -0.0912941 +0.08561 -0.41914 -0.0961237 +0.255049 0.0876284 -0.0370508 +0.206662 -0.309417 -0.0718016 +-0.236385 -0.074597 -0.0312083 +-0.259954 0.0986583 -0.0394321 +-0.302438 0.0896799 -0.0510591 +-0.242753 -0.303533 -0.0786212 +0.230549 0.206291 -0.0490579 +0.195188 -0.366013 -0.0900901 +-0.46853 0.0865084 -0.120798 +0.296563 0.267972 -0.0833533 +-0.105318 -0.353762 -0.0706128 +0.0106654 0.402217 -0.0845178 +-0.399388 -0.217108 -0.109296 +-0.140552 0.104631 -0.015471 +0.168459 0.266429 -0.0509808 +-0.203609 0.171988 -0.0361725 +0.462468 -0.114301 -0.120762 +0.0149732 0.0578962 -0.00178968 +0.403499 0.00548978 -0.0850364 +0.0870553 -0.359107 -0.0707725 +-0.478326 0.0240443 -0.122147 +-0.29736 -0.32578 -0.102535 +-0.415263 0.0484308 -0.0915886 +-0.157221 -0.201381 -0.0331871 +0.275334 0.346186 -0.103146 +0.193536 0.197585 -0.0390088 +0.276161 -0.301602 -0.087437 +0.308465 -0.16882 -0.0638647 +0.333294 0.33978 -0.120532 +-0.421187 0.200364 -0.115434 +0.162259 -0.407194 -0.101187 +0.465995 0.0344805 -0.115885 +-0.119702 -0.376134 -0.0811994 +-0.404467 0.0622058 -0.0875656 +0.227569 -0.323503 -0.0815459 +0.0238599 0.248232 -0.0315932 +-0.167845 -0.399765 -0.0988807 +0.0326469 -0.402992 -0.085379 +-0.137739 0.412993 -0.0997421 +0.0119849 -0.387205 -0.0780841 +-0.212037 0.216512 -0.0470242 +0.209826 -0.144924 -0.0330614 +-0.14782 0.375137 -0.0848926 +0.388403 0.211727 -0.103164 +0.0655239 0.379491 -0.0771279 +0.20613 -0.351824 -0.0869117 +0.371568 0.236531 -0.102231 +-0.424541 0.141643 -0.105739 +-0.0259849 0.0219873 -0.000579496 +-0.323028 0.169014 -0.0688248 +0.464563 0.0828754 -0.118346 +0.283365 0.0863047 -0.0448793 +-0.279469 0.34371 -0.103473 +0.375347 0.170667 -0.0889636 +0.121688 0.406326 -0.0944113 +0.41911 0.161276 -0.106503 +-0.438967 0.0689805 -0.104149 +0.353981 0.260732 -0.101826 +0.29344 0.047904 -0.0452236 +0.399176 -0.0268192 -0.0835181 +-0.356411 0.289107 -0.111525 +-0.476014 -0.0246146 -0.120907 +0.318053 0.140357 -0.0623741 +0.205427 0.16289 -0.0349784 +0.31571 -0.0155591 -0.0512717 +-0.425317 -0.0144789 -0.0950712 +0.465687 -0.0138712 -0.115159 +0.285693 0.366948 -0.114716 +0.35863 0.00302563 -0.066525 +0.419843 0.00635302 -0.0924254 +0.172775 0.00870623 -0.0150771 +0.470962 0.011467 -0.117921 +-0.37129 0.103949 -0.0773198 +0.136568 0.268397 -0.0464215 +-0.166944 0.0672155 -0.0163274 +-0.269623 0.244281 -0.0685333 +0.0375777 0.390178 -0.0800276 +0.371864 0.0691017 -0.0742883 +-0.39375 0.0760336 -0.0839323 +0.444588 0.0986577 -0.109715 +-0.325684 0.110798 -0.0610357 +0.234486 0.328046 -0.0849033 +0.423557 0.113821 -0.10131 +-0.360019 0.117801 -0.074522 +-0.000310711 -0.43369 -0.0989381 +-0.413505 0.155658 -0.102902 +-0.19165 0.136861 -0.0281257 +0.374391 0.133063 -0.0823261 +-0.346592 0.140109 -0.0725071 +-0.13482 0.150816 -0.0206747 +0.342477 0.183672 -0.078602 +0.0763347 0.167419 -0.0170739 +-0.277229 0.175924 -0.0554393 +0.0269993 0.216645 -0.0241229 +-0.0669735 0.213915 -0.0254462 +-0.364549 0.220937 -0.0954058 +-0.319504 0.227745 -0.0801904 +-0.180663 0.263654 -0.0524519 +0.205914 0.275677 -0.0610638 +0.199767 0.384806 -0.09888 +-0.167976 0.341962 -0.0754213 diff --git a/image_analysis/indexing/fast-feedback-indexer/data/image4_peakfinder8.txt b/image_analysis/indexing/fast-feedback-indexer/data/image4_peakfinder8.txt new file mode 100644 index 000000000..1fc0f709a --- /dev/null +++ b/image_analysis/indexing/fast-feedback-indexer/data/image4_peakfinder8.txt @@ -0,0 +1,853 @@ +36.9 0 0 4.83429e-15 78.95 0 4.83429e-15 4.83429e-15 78.95 +-0.349375 -0.700438 -0.377646 +0.0850553 -0.740432 -0.333273 +-0.342193 -0.695593 -0.368292 +-0.148352 -0.730642 -0.333551 +-0.483522 -0.635588 -0.398141 +0.400173 -0.664742 -0.369144 +-0.0647988 -0.721525 -0.310651 +-0.0265121 -0.717926 -0.304386 +0.0937455 -0.699796 -0.291835 +-0.430265 -0.630924 -0.354394 +0.0293569 -0.697461 -0.283979 +0.280991 -0.667809 -0.310743 +-0.389341 -0.633652 -0.331495 +-0.0557785 -0.680959 -0.269806 +0.128648 -0.664865 -0.264198 +-0.175784 -0.656845 -0.266751 +-0.270108 -0.637705 -0.278631 +-0.000285862 -0.659969 -0.248708 +0.145691 -0.646438 -0.251073 +0.440871 -0.582848 -0.317416 +-0.152075 -0.635191 -0.242764 +0.130943 -0.627741 -0.23267 +-0.173469 -0.62065 -0.235342 +0.576328 -0.514099 -0.364746 +0.463597 -0.555675 -0.309853 +-0.267706 -0.601328 -0.24718 +0.359987 -0.578427 -0.267995 +-0.194653 -0.605343 -0.228203 +-0.0894429 -0.610885 -0.213349 +0.116107 -0.608984 -0.215362 +-0.0506011 -0.607965 -0.20765 +-0.350768 -0.568008 -0.255468 +0.484574 -0.528086 -0.302639 +-0.111047 -0.596227 -0.204902 +-0.504157 -0.514802 -0.306599 +-0.0721643 -0.593185 -0.198175 +-0.0338872 -0.589799 -0.193161 +-0.153542 -0.566252 -0.190196 +-0.355014 -0.535701 -0.233847 +-0.219918 -0.557918 -0.199773 +0.230372 -0.552359 -0.198858 +0.129182 -0.558631 -0.180706 +0.0972503 -0.557953 -0.175845 +0.0650726 -0.557065 -0.172084 +-0.0381466 -0.557538 -0.170726 +0.346576 -0.522371 -0.220889 +0.0325678 -0.555332 -0.169009 +-0.467663 -0.485538 -0.26139 +-0.0594434 -0.544349 -0.16325 +0.357454 -0.508346 -0.216539 +-0.157611 -0.533495 -0.169011 +-0.427013 -0.488147 -0.238835 +-0.393165 -0.49592 -0.225736 +0.226918 -0.520201 -0.176653 +0.331975 -0.503454 -0.202299 +0.368553 -0.494659 -0.212929 +-0.251968 -0.514465 -0.180343 +0.125661 -0.526221 -0.158988 +0.0932156 -0.526698 -0.155074 +-0.122981 -0.497895 -0.141527 +0.223942 -0.487305 -0.155972 +-0.190243 -0.49008 -0.149336 +0.329123 -0.470875 -0.181492 +0.468679 -0.439739 -0.233861 +-0.0842906 -0.495027 -0.135221 +0.365571 -0.461994 -0.191966 +0.0904805 -0.492588 -0.134454 +0.234819 -0.474836 -0.151831 +0.16568 -0.48123 -0.139205 +0.133395 -0.480918 -0.133441 +-0.346057 -0.452284 -0.178 +-0.381026 -0.445753 -0.189986 +-0.172533 -0.471967 -0.135431 +0.0368797 -0.477074 -0.121911 +0.177002 -0.467747 -0.134042 +0.350604 -0.443318 -0.175048 +0.455025 -0.42132 -0.215499 +0.187412 -0.455131 -0.129522 +-0.154828 -0.45427 -0.122693 +-0.116476 -0.45162 -0.115425 +-0.356557 -0.423453 -0.167201 +-0.390924 -0.416568 -0.179238 +-0.424929 -0.409219 -0.19255 +-0.0774301 -0.448599 -0.109627 +-0.249299 -0.435179 -0.134859 +0.440703 -0.402712 -0.197751 +0.097717 -0.446204 -0.11042 +-0.27721 -0.424436 -0.13802 +0.14056 -0.433597 -0.109923 +0.108406 -0.432724 -0.105015 +-0.0276225 -0.433016 -0.0990372 +0.0761673 -0.431503 -0.10111 +-0.000411904 -0.433777 -0.0989798 +-0.33995 -0.406325 -0.151864 +-0.165846 -0.425987 -0.110601 +-0.232327 -0.417294 -0.121428 +0.151737 -0.420216 -0.105353 +0.252266 -0.413088 -0.124946 +-0.0891464 -0.420831 -0.0972519 +0.0856099 -0.41914 -0.0961237 +-0.0472 -0.416975 -0.0923086 +0.0541584 -0.41772 -0.0930397 +0.022732 -0.415568 -0.0907218 +0.195464 -0.40643 -0.107471 +0.162256 -0.407178 -0.101179 +0.400297 -0.379044 -0.165681 +0.300802 -0.391715 -0.130473 +-0.109132 -0.40523 -0.0923221 +-0.349849 -0.377697 -0.142707 +-0.176543 -0.39731 -0.0994571 +0.374466 -0.374117 -0.151583 +0.0323774 -0.402783 -0.0852773 +-0.418333 -0.362985 -0.16739 +-0.383858 -0.370126 -0.154033 +0.476802 -0.35133 -0.194254 +-0.452655 -0.355894 -0.182417 +0.409211 -0.364494 -0.163525 +0.311018 -0.377039 -0.127584 +-0.556543 -0.328164 -0.236739 +0.347971 -0.368467 -0.13794 +0.548956 -0.328237 -0.231295 +-0.0596973 -0.388386 -0.0804389 +0.0118432 -0.387325 -0.0781329 +0.183933 -0.379524 -0.0932863 +-0.119869 -0.376225 -0.0812582 +-0.580042 -0.307537 -0.245698 +-0.1862 -0.367959 -0.0889921 +-0.435473 -0.338241 -0.16576 +0.0220494 -0.374884 -0.0731904 +0.461386 -0.332325 -0.177393 +-0.0090668 -0.372153 -0.0718729 +0.19506 -0.365964 -0.0900429 +-0.101627 -0.368937 -0.0761182 +-0.21439 -0.357157 -0.0908929 +0.436631 -0.327539 -0.162103 +-0.315391 -0.342756 -0.115101 +-0.0698955 -0.359586 -0.0695094 +0.0870553 -0.359107 -0.0707725 +-0.60309 -0.286435 -0.255529 +0.000987791 -0.359015 -0.0666685 +0.20613 -0.351824 -0.0869117 +-0.350879 -0.335433 -0.125718 +0.275297 -0.343509 -0.102106 +-0.242161 -0.346222 -0.0936399 +-0.105318 -0.353762 -0.0706128 +0.411727 -0.322683 -0.147734 +-0.269871 -0.335033 -0.0972694 +0.349018 -0.326989 -0.121783 +-0.633075 -0.269892 -0.274484 +0.217219 -0.337199 -0.083969 +0.385731 -0.317542 -0.133756 +-0.0197195 -0.343287 -0.0609765 +-0.157851 -0.336703 -0.0717142 +0.0522708 -0.340748 -0.0612996 +0.322519 -0.32083 -0.109467 +0.519162 -0.290541 -0.196223 +-0.119011 -0.333638 -0.0648413 +-0.661958 -0.252634 -0.294318 +-0.332924 -0.316939 -0.111906 +0.359011 -0.312178 -0.120423 +-0.0798848 -0.331308 -0.059865 +0.227569 -0.323503 -0.0815459 +-0.509497 -0.285141 -0.188145 +-0.00884069 -0.329748 -0.0559726 +-0.468862 -0.288289 -0.1651 +-0.0321839 -0.325123 -0.054876 +-0.0489023 -0.321558 -0.0543737 +-0.0699398 -0.317398 -0.0542904 +0.437905 -0.285277 -0.147441 +0.00133236 -0.31621 -0.0513116 +-0.31452 -0.298803 -0.0990038 +0.206662 -0.309417 -0.0718016 +0.535459 -0.267097 -0.198787 +0.276115 -0.301324 -0.0873313 +-0.24221 -0.303458 -0.0784538 +-0.057839 -0.312425 -0.0518201 +0.0237481 -0.311575 -0.0500753 +0.412331 -0.280229 -0.133135 +-0.058293 -0.303634 -0.0489963 +-0.45235 -0.270968 -0.15032 +0.349793 -0.284513 -0.107421 +-0.269143 -0.292041 -0.0822451 +0.0116634 -0.303414 -0.0472124 +0.118379 -0.299784 -0.053366 +-0.157435 -0.294693 -0.0574659 +-0.150623 -0.296247 -0.05684 +0.385583 -0.27489 -0.119227 +-0.118519 -0.291707 -0.0508635 +0.048796 -0.294367 -0.0455541 +0.322867 -0.278225 -0.0953743 +0.550924 -0.243541 -0.20177 +-0.331653 -0.274341 -0.0973685 +-0.185215 -0.282837 -0.0588844 +0.519149 -0.248124 -0.182126 +-0.00809419 -0.287133 -0.0421435 +-0.182356 -0.28253 -0.0582339 +0.196861 -0.28115 -0.0607449 +-0.508872 -0.242397 -0.17399 +0.265799 -0.273161 -0.0754817 +-0.253326 -0.273431 -0.0720661 +-0.287649 -0.267931 -0.0805048 +-0.108785 -0.277629 -0.0454906 +-0.213036 -0.271771 -0.0615139 +-0.0595195 -0.2783 -0.0413516 +0.46232 -0.247526 -0.148536 +-0.0687408 -0.274806 -0.0409606 +0.0336321 -0.274785 -0.0390828 +0.00288109 -0.273003 -0.037991 +-0.579357 -0.222675 -0.215933 +0.20718 -0.265918 -0.0585309 +-0.241076 -0.261125 -0.0652829 +0.437016 -0.24257 -0.133872 +0.276262 -0.258469 -0.0743257 +0.595569 -0.215256 -0.226074 +-0.265053 -0.256537 -0.0705186 +-0.348452 -0.249492 -0.0964876 +0.565544 -0.219828 -0.205119 +-0.0391809 -0.264953 -0.036535 +0.534334 -0.224382 -0.185052 +-0.2049 -0.257736 -0.0557606 +0.312857 -0.249719 -0.0836155 +-0.0587925 -0.260672 -0.0363644 +-0.532286 -0.221592 -0.182951 +0.0136441 -0.259445 -0.0343384 +-0.417558 -0.235372 -0.122364 +-0.0942227 -0.258311 -0.0385441 +-0.451606 -0.228472 -0.137531 +0.186307 -0.251427 -0.0502241 +-0.230159 -0.247124 -0.0587472 +-0.212645 -0.24977 -0.0553323 +-0.109206 -0.254014 -0.0389844 +0.478315 -0.22396 -0.150849 +0.153342 -0.251342 -0.0443258 +0.255543 -0.244168 -0.0645428 +-0.236058 -0.244522 -0.0595292 +-0.127768 -0.247811 -0.0396537 +-0.0471166 -0.247599 -0.0322838 +0.0561001 -0.247577 -0.0327573 +-0.457131 -0.219272 -0.138054 +-0.33137 -0.232617 -0.0856241 +0.0247945 -0.24548 -0.0309156 +0.0591658 -0.246035 -0.0325467 +-0.258069 -0.23603 -0.0631489 +-0.365323 -0.224471 -0.0965887 +0.164927 -0.236834 -0.0425509 +0.579757 -0.196242 -0.209196 +-0.145255 -0.237424 -0.0395154 +-0.399548 -0.21731 -0.109417 +-0.168102 -0.23519 -0.0426979 +0.132406 -0.235413 -0.0371659 +0.203533 -0.232383 -0.0489099 +0.427822 -0.214165 -0.121876 +-0.434281 -0.21116 -0.124322 +0.104563 -0.233967 -0.0333945 +0.0672651 -0.233735 -0.0300293 +0.366112 -0.218191 -0.0953705 +0.133636 -0.230684 -0.0361917 +0.302363 -0.220998 -0.0727804 +0.0354809 -0.231949 -0.0279194 +0.246622 -0.224992 -0.0573674 +0.644839 -0.177157 -0.256496 +-0.320739 -0.217841 -0.0782235 +-0.134912 -0.223859 -0.0347614 +0.401386 -0.208714 -0.108188 +0.174741 -0.222942 -0.0409575 +0.241273 -0.220254 -0.0548675 +0.339024 -0.212456 -0.0835258 +0.300801 -0.21509 -0.0708848 +0.143529 -0.221279 -0.0354094 +0.111195 -0.220735 -0.0310254 +-0.201641 -0.215951 -0.0446434 +0.244461 -0.21467 -0.0544018 +0.469115 -0.195623 -0.138801 +0.0788624 -0.218975 -0.0274618 +-0.275525 -0.211245 -0.0622038 +-0.0251197 -0.220148 -0.0248571 +-0.53891 -0.183203 -0.1778 +-0.163191 -0.212651 -0.0365955 +0.281998 -0.206767 -0.0631304 +-0.171682 -0.210847 -0.0376752 +-0.45731 -0.18947 -0.131111 +-0.124401 -0.210085 -0.0302637 +0.443878 -0.1905 -0.124396 +-0.251637 -0.204337 -0.0539952 +-0.084951 -0.207225 -0.0254021 +0.318357 -0.198153 -0.0729703 +0.26621 -0.200208 -0.0571061 +-0.0141798 -0.20614 -0.0215801 +0.223841 -0.200184 -0.0461544 +0.260975 -0.199902 -0.055579 +-0.336849 -0.192823 -0.0783971 +-0.190767 -0.201542 -0.0392769 +0.508732 -0.176514 -0.157364 +0.540533 -0.172359 -0.176522 +-0.157118 -0.201496 -0.0331943 +0.601157 -0.162736 -0.217614 +0.355467 -0.189235 -0.0846677 +-0.113461 -0.196271 -0.0260368 +-0.218548 -0.190705 -0.0429899 +0.48399 -0.17196 -0.141989 +-0.561492 -0.161676 -0.188466 +0.391007 -0.180125 -0.0974099 +-0.291534 -0.186047 -0.0617067 +-0.00263458 -0.191835 -0.0185764 +-0.179814 -0.188521 -0.0345329 +-0.439611 -0.171391 -0.118316 +0.20251 -0.185429 -0.0384358 +0.45926 -0.166881 -0.127515 +0.202495 -0.180006 -0.0374027 +0.27091 -0.177395 -0.0538824 +0.237193 -0.17761 -0.0449113 +-0.281141 -0.172579 -0.0559788 +-0.208146 -0.176481 -0.0379554 +-0.592131 -0.14506 -0.207322 +0.433423 -0.16178 -0.113449 +0.30839 -0.168893 -0.0638532 +-0.38846 -0.161905 -0.0928694 +0.180872 -0.170053 -0.0313064 +-0.235678 -0.166169 -0.0424804 +0.14829 -0.169724 -0.025729 +0.40665 -0.156575 -0.0999334 +-0.50526 -0.147537 -0.149738 +-0.308787 -0.162178 -0.0627974 +0.250337 -0.162737 -0.0456164 +0.344466 -0.160144 -0.0749611 +0.116071 -0.168093 -0.0210863 +-0.196201 -0.163465 -0.0331574 +0.0516559 -0.165695 -0.0151767 +-0.343441 -0.154325 -0.0735919 +0.473778 -0.143401 -0.13111 +0.242833 -0.15755 -0.0428113 +0.244812 -0.152249 -0.0424576 +-0.297846 -0.147506 -0.0568511 +-0.224306 -0.151803 -0.0373771 +0.127227 -0.154015 -0.0201567 +-0.411698 -0.140091 -0.0995118 +0.448129 -0.138177 -0.116774 +0.0946093 -0.153075 -0.0163247 +0.229105 -0.147991 -0.037914 +-0.526923 -0.126607 -0.15957 +0.209987 -0.144939 -0.0330986 +-0.273012 -0.142409 -0.0485883 +0.42197 -0.132932 -0.103189 +0.360854 -0.136613 -0.0774377 +-0.252088 -0.140988 -0.0426212 +-0.214435 -0.138033 -0.0330643 +-0.0691356 -0.140585 -0.0123482 +0.574966 -0.115679 -0.190042 +0.00215008 -0.13973 -0.00981263 +0.604235 -0.110549 -0.2109 +0.207353 -0.132702 -0.0307761 +-0.241568 -0.127404 -0.038016 +-0.250465 -0.126735 -0.0402053 +0.462626 -0.114459 -0.120866 +-0.204294 -0.125378 -0.0291528 +0.639963 -0.0964022 -0.237666 +-0.20277 -0.12208 -0.0284133 +-0.348627 -0.115301 -0.0698576 +0.312426 -0.11663 -0.0572447 +-0.226285 -0.118913 -0.0332247 +0.376324 -0.113063 -0.0804366 +-0.230108 -0.112943 -0.033411 +0.154029 -0.116804 -0.018862 +-0.382885 -0.108196 -0.0825621 +-0.267935 -0.111958 -0.0430902 +-0.303453 -0.108768 -0.053382 +-0.0122356 -0.113309 -0.0065156 +-0.417712 -0.101612 -0.0971203 +0.223161 -0.109067 -0.0313393 +-0.308265 -0.105261 -0.0545409 +0.291557 -0.101478 -0.0488445 +-0.272189 -0.102376 -0.0432177 +0.41716 -0.0943469 -0.0960774 +-0.219247 -0.0992175 -0.0293886 +-0.0747288 -0.101978 -0.00802418 +-0.00454593 -0.100715 -0.00509506 +-0.321777 -0.0948778 -0.0579503 +0.509097 -0.0864329 -0.143642 +-0.292763 -0.094701 -0.0485162 +0.327997 -0.0928379 -0.0598942 +0.391042 -0.0894994 -0.0839891 +0.00995374 -0.0955559 -0.00462571 +0.540739 -0.0812143 -0.16274 +0.484385 -0.0810119 -0.128904 +-0.440655 -0.0802908 -0.105921 +0.270337 -0.0864902 -0.041127 +-0.482461 -0.0771001 -0.127482 +-0.208454 -0.0853897 -0.0257025 +-0.562049 -0.0705152 -0.175908 +0.458854 -0.0760631 -0.11475 +0.06662 -0.0828956 -0.00567104 +0.307301 -0.0778511 -0.0515775 +-0.0914637 -0.0770349 -0.00717574 +0.148036 -0.078066 -0.0141039 +0.370425 -0.0740723 -0.074096 +-0.235805 -0.0747858 -0.0310816 +0.432394 -0.0709873 -0.101114 +-0.645716 -0.0588234 -0.238691 +-0.310143 -0.0698211 -0.0518776 +-0.269695 -0.0706914 -0.0396525 +0.248742 -0.0717592 -0.0340922 +-0.197228 -0.071851 -0.0222788 +-0.158235 -0.0722499 -0.0152453 +0.1115 -0.0725987 -0.00889091 +0.244378 -0.0708915 -0.0329149 +0.0188631 -0.0727933 -0.00283135 +0.123659 -0.0722475 -0.0103088 +-0.288936 -0.0341099 -0.0432593 +0.215493 -0.0344095 -0.024101 +0.426636 -0.0317595 -0.0961343 +0.322609 -0.0296435 -0.053932 +-0.276868 -0.0293123 -0.0395392 +0.399013 -0.0267884 -0.0834463 +-0.476141 -0.0246843 -0.120978 +-0.516814 -0.0216441 -0.144176 +-0.0509184 -0.0246271 -0.00160087 +-0.390507 -0.0211682 -0.0796435 +0.547648 -0.019339 -0.163515 +-0.311118 -0.0215872 -0.0498739 +0.491376 -0.0189544 -0.129259 +0.270307 -0.0191211 -0.0374157 +0.219788 -0.017557 -0.0246103 +0.18922 -0.0161551 -0.0181982 +0.31571 -0.0155592 -0.0512717 +0.523881 -0.0142975 -0.148328 +0.157305 -0.0155203 -0.0125719 +0.216112 -0.0149521 -0.0237459 +0.465905 -0.0138287 -0.115273 +0.0924576 -0.0125919 -0.004363 +0.226563 -0.00782263 -0.0260349 +0.472867 -0.00352451 -0.118873 +0.08832 0.00166011 -0.00390923 +0.446977 0.00166624 -0.105456 +0.358581 0.00309619 -0.0665064 +0.204447 0.00690025 -0.0211466 +0.419884 0.00637106 -0.0924444 +0.172825 0.00863183 -0.0150853 +0.470962 0.011467 -0.117921 +-0.622667 0.0114529 -0.217596 +-0.57667 0.0120491 -0.183111 +-0.204947 0.0157531 -0.0213538 +-0.165618 0.0186548 -0.0139865 +-0.277791 0.020157 -0.0395699 +0.337271 0.0181269 -0.0587668 +0.399968 0.0217391 -0.0837288 +0.279038 0.0249033 -0.0400429 +-0.478266 0.0239834 -0.122112 +0.517046 0.0239574 -0.144377 +-0.658575 0.0243734 -0.24788 +0.188482 0.0323402 -0.018456 +0.492083 0.0295884 -0.129955 +-0.26725 0.0337707 -0.0369646 +0.315862 0.0331832 -0.0517755 +-0.0449263 0.0361851 -0.00166525 +0.548708 0.0292426 -0.164497 +-0.425857 0.034617 -0.0958718 +0.256787 0.0395238 -0.0343406 +0.466051 0.0345046 -0.115915 +-0.256081 0.0473483 -0.0345048 +0.293421 0.0479366 -0.0452192 +0.0432087 0.0519579 -0.00228592 +-0.549014 0.0438059 -0.165336 +-0.415348 0.0484333 -0.0916277 +-0.290591 0.0547015 -0.0447175 +0.203468 0.0556964 -0.0225038 +0.0149732 0.0578962 -0.00178968 +-0.100316 0.0586005 -0.00677159 +-0.206187 0.0643009 -0.0236024 +-0.490981 0.0582378 -0.130779 +-0.404642 0.0623087 -0.0876499 +-0.166921 0.0672667 -0.016327 +0.641397 0.0528119 -0.23461 +-0.279022 0.0688567 -0.0421872 +-0.128305 0.0700158 -0.0107399 +0.336163 0.0664746 -0.060545 +-0.577535 0.0607801 -0.1859 +0.0365055 0.0744271 -0.00344195 +0.398684 0.0702613 -0.0856069 +-0.438967 0.0689805 -0.104149 +0.540742 0.0674066 -0.161517 +0.696823 0.0579071 -0.285098 +-0.478896 0.0725272 -0.125129 +0.18709 0.0806375 -0.0209725 +0.647292 0.0622948 -0.240308 +-0.393764 0.0761533 -0.0839483 +-0.268434 0.0824533 -0.0402372 +0.0575962 0.0854314 -0.00532209 +0.51609 0.0725438 -0.146543 +0.31426 0.0815111 -0.0541687 +-0.0427891 0.0891919 -0.00490508 +0.283434 0.086021 -0.044874 +0.490877 0.078013 -0.132271 +0.255108 0.0878025 -0.0370823 +-0.302479 0.0896589 -0.0510701 +0.207458 0.0912295 -0.0260193 +0.464667 0.0829381 -0.118407 +0.547385 0.0776541 -0.16673 +-0.0374715 0.0945078 -0.00518134 +-0.468541 0.0864195 -0.120795 +-0.00291542 0.0980969 -0.0048274 +-0.382866 0.0902719 -0.0806171 +0.437346 0.0883437 -0.105057 +0.260156 0.097055 -0.0393237 +-0.218562 0.0990866 -0.0292207 +-0.334944 0.0959215 -0.0626571 +-0.259954 0.0986584 -0.0394321 +-0.179526 0.101804 -0.0215285 +-0.416992 0.0967216 -0.0962508 +-0.140536 0.104646 -0.0154703 +0.356047 0.100224 -0.0709221 +0.17036 0.105671 -0.0203004 +0.0730276 0.109095 -0.00865478 +0.249616 0.106334 -0.0375111 +0.444501 0.0985885 -0.109663 +0.297678 0.106436 -0.0512856 +-0.371338 0.103889 -0.0773326 +-0.45801 0.100222 -0.116721 +0.00960469 0.112607 -0.00640685 +0.41711 0.103072 -0.0970074 +0.238806 0.112802 -0.0355065 +0.0128347 0.121281 -0.00746482 +-0.325674 0.110731 -0.0610246 +0.333775 0.114964 -0.0643839 +-0.281238 0.117731 -0.0476113 +-0.241871 0.120084 -0.0371511 +-0.461124 0.110945 -0.119628 +-0.538685 0.106279 -0.164223 +-0.360063 0.117809 -0.0745404 +0.423363 0.113713 -0.101205 +0.275441 0.121276 -0.0463627 +0.395917 0.118308 -0.0893669 +-0.315163 0.12431 -0.0591389 +-0.0859686 0.1312 -0.0123786 +0.152796 0.130282 -0.0203675 +0.120475 0.131531 -0.016036 +-0.632092 0.104568 -0.232194 +0.311058 0.130809 -0.0586543 +-0.230626 0.134037 -0.0362336 +-0.191607 0.136892 -0.0281216 +-0.152659 0.139753 -0.0216522 +0.221944 0.137605 -0.034699 +0.374387 0.133194 -0.0823434 +-0.265422 0.14089 -0.0462173 +0.0285252 0.145493 -0.0110521 +0.253588 0.141307 -0.0430646 +0.317921 0.140285 -0.0623186 +0.175167 0.145761 -0.026311 +0.228423 0.146263 -0.0374878 +0.258943 0.146155 -0.0452291 +-0.13482 0.150816 -0.0206747 +0.519323 0.130897 -0.155506 +-0.424541 0.141643 -0.105739 +0.467618 0.141217 -0.127423 +-0.254092 0.155045 -0.0453281 +0.225611 0.156686 -0.0384653 +-0.215734 0.157695 -0.0363656 +0.550081 0.135439 -0.175944 +-0.138391 0.163324 -0.023182 +0.205351 0.162555 -0.0349057 +0.173568 0.164059 -0.0289393 +-0.0982268 0.166384 -0.0188437 +-0.288394 0.162048 -0.0563002 +0.0762878 0.167466 -0.0170782 +-0.0600037 0.169702 -0.016333 +0.358978 0.158381 -0.0801902 +-0.413442 0.155704 -0.102881 +-0.603939 0.136166 -0.214687 +0.473603 0.151674 -0.13242 +-0.657489 0.131005 -0.258012 +-0.203989 0.171672 -0.0361965 +0.4473 0.156452 -0.119406 +0.241689 0.171027 -0.0448371 +-0.164921 0.174524 -0.0292568 +-0.139341 0.176369 -0.0255882 +0.41911 0.161276 -0.106503 +-0.322976 0.169047 -0.0688127 +-0.546663 0.150993 -0.176374 +0.0157878 0.179823 -0.0164278 +0.240208 0.17747 -0.0456393 +-0.277347 0.176009 -0.0554897 +-0.402168 0.169601 -0.10028 +-0.357072 0.17621 -0.0826944 +0.425983 0.171464 -0.111666 +-0.0827428 0.18981 -0.021672 +-0.311889 0.183037 -0.0676787 +0.342493 0.183575 -0.0785888 +0.0346586 0.196296 -0.020068 +0.284382 0.190161 -0.0603376 +-0.227146 0.192969 -0.0454489 +-0.188605 0.195524 -0.0376079 +0.590282 0.160377 -0.208896 +-0.149496 0.198464 -0.0313604 +0.193605 0.197565 -0.0390185 +-0.346213 0.190148 -0.0813162 +-0.0400352 0.201794 -0.0213906 +0.0638353 0.202263 -0.0227515 +0.186944 0.199129 -0.0380232 +0.404224 0.186304 -0.104515 +-0.261919 0.199529 -0.0557613 +-0.432914 0.1863 -0.118026 +0.247778 0.200289 -0.0521126 +0.618012 0.164045 -0.231137 +0.230635 0.206352 -0.0490918 +-0.0669853 0.213848 -0.0254323 +0.0269992 0.216645 -0.0241229 +0.381883 0.201223 -0.0979606 +-0.421266 0.200334 -0.115466 +0.325766 0.208516 -0.0778297 +-0.211983 0.216535 -0.0470174 +-0.172932 0.218929 -0.0397058 +0.26702 0.214369 -0.0604542 +-0.134017 0.222097 -0.0342296 +-0.331122 0.213702 -0.0809302 +0.152638 0.226391 -0.0379975 +0.388392 0.211684 -0.103149 +-0.410542 0.214192 -0.113672 +0.148948 0.233192 -0.0390442 +0.181319 0.232362 -0.0444208 +-0.364563 0.22085 -0.0953902 +0.0517679 0.237316 -0.0299477 +0.214331 0.231117 -0.0509757 +-0.319565 0.227653 -0.080189 +0.112829 0.23937 -0.0356496 +-0.451397 0.217197 -0.134514 +0.365123 0.226143 -0.0969247 +-0.196216 0.239864 -0.0492296 +0.308437 0.232783 -0.0776775 +-0.235025 0.237645 -0.0575097 +-0.157428 0.242534 -0.0427155 +-0.0705992 0.244357 -0.0328881 +0.218937 0.240388 -0.0543361 +-0.118115 0.246054 -0.0379678 +0.0237844 0.248306 -0.0316104 +-0.0449746 0.25002 -0.0328044 +-0.269514 0.244215 -0.0684844 +0.131284 0.252149 -0.0412584 +0.371568 0.236531 -0.102231 +-0.439533 0.230955 -0.131973 +0.255161 0.249586 -0.0658694 +-0.589727 0.208369 -0.21974 +-0.0751437 0.257859 -0.0367441 +-0.00416114 0.259134 -0.0341677 +0.5355 0.218259 -0.184155 +0.510773 0.223634 -0.16988 +-0.304206 0.25119 -0.0811081 +0.458092 0.233883 -0.142416 +-0.0657615 0.263688 -0.0376361 +-0.480717 0.234251 -0.154993 +-0.18062 0.263559 -0.0524174 +-0.141652 0.266551 -0.0466451 +0.10429 0.269613 -0.0426952 +0.168515 0.266471 -0.0510028 +-0.0318056 0.270422 -0.0377835 +0.136579 0.268365 -0.046414 +-0.429082 0.244773 -0.130532 +0.0719481 0.270457 -0.0399601 +-0.383517 0.251678 -0.111421 +-0.579376 0.22241 -0.215872 +-0.337911 0.258378 -0.0949821 +0.0294451 0.274573 -0.0388847 +0.463701 0.243869 -0.148232 +0.490263 0.239248 -0.161905 +-0.52072 0.237242 -0.179898 +-0.254408 0.267856 -0.0707368 +0.354026 0.260813 -0.101867 +0.29655 0.267893 -0.0833259 +-0.469151 0.248117 -0.152453 +0.0439269 0.281674 -0.0414959 +0.205981 0.275708 -0.0610872 +-0.0584057 0.28256 -0.0425301 +0.569752 0.232529 -0.211766 +0.495117 0.249639 -0.167811 +0.442124 0.258817 -0.141198 +0.46905 0.254483 -0.154287 +-0.177397 0.284837 -0.0579817 +-0.203762 0.284976 -0.0633732 +-0.164918 0.287971 -0.0566682 +0.24238 0.283655 -0.0722114 +0.0160978 0.292879 -0.0439859 +-0.238738 0.291327 -0.0736454 +0.447149 0.268804 -0.146887 +-0.0824345 0.302858 -0.0505361 +-0.0117268 0.303663 -0.0472928 +0.115842 0.305295 -0.0548145 +-0.402514 0.282641 -0.129312 +-0.356523 0.289234 -0.111611 +-0.603449 0.248843 -0.242421 +-0.311228 0.296511 -0.0971054 +0.283442 0.30192 -0.0897778 +0.341589 0.295405 -0.107782 +-0.187416 0.308985 -0.0675819 +-0.147969 0.311353 -0.0612965 +0.0962997 0.313665 -0.0553623 +0.12877 0.312871 -0.0589741 +0.161018 0.311141 -0.0633761 +0.0646584 0.316077 -0.0534724 +-0.443425 0.285461 -0.150361 +0.0505071 0.318095 -0.0532876 +-0.22299 0.315273 -0.0775695 +-0.105859 0.324079 -0.0599114 +0.347066 0.306107 -0.113522 +0.43031 0.293605 -0.146402 +0.457196 0.289442 -0.159051 +-0.592908 0.262843 -0.238834 +-0.534562 0.277701 -0.201798 +-0.387092 0.306061 -0.130238 +-0.341493 0.312808 -0.113697 +-0.295551 0.320236 -0.0999454 +-0.0621336 0.336691 -0.060437 +0.234399 0.327972 -0.0848543 +0.435409 0.304074 -0.152676 +0.0444934 0.339174 -0.0603292 +-0.472023 0.302409 -0.171904 +-0.167992 0.341813 -0.0753688 +-0.206951 0.339762 -0.08254 +-0.129158 0.345426 -0.0704844 +0.412369 0.318115 -0.146329 +-0.416835 0.323389 -0.15049 +-0.241868 0.346047 -0.0934951 +-0.0150192 0.358083 -0.066431 +-0.279469 0.34371 -0.103473 +-0.085285 0.357983 -0.0701748 +0.275712 0.346543 -0.1034 +0.333364 0.339758 -0.12055 +-0.276278 0.35301 -0.106102 +-0.560179 0.30475 -0.229722 +0.0930612 0.36798 -0.0748352 +0.125757 0.367445 -0.0784963 +0.157752 0.365409 -0.0826175 +0.280446 0.356269 -0.108696 +0.422499 0.337975 -0.159008 +0.577383 0.306733 -0.243334 +-0.310097 0.360173 -0.120162 +-0.186912 0.372361 -0.0909283 +-0.147859 0.375124 -0.0848936 +-0.038514 0.379111 -0.0754508 +0.194644 0.373972 -0.0932152 +-0.446283 0.340205 -0.172297 +0.0654296 0.379628 -0.0771774 +0.285729 0.366974 -0.114738 +0.343847 0.360378 -0.13288 +0.427141 0.347841 -0.1654 +-0.259824 0.376795 -0.11089 +-0.10518 0.387538 -0.0841664 +0.0375447 0.390264 -0.0800628 +0.199695 0.384568 -0.0987623 +-0.197441 0.390285 -0.100725 +-0.061188 0.400194 -0.0856146 +0.56137 0.332244 -0.242057 +0.0106654 0.402217 -0.0845178 +-0.0471248 0.406606 -0.0876124 +0.436405 0.367609 -0.178773 +-0.166502 0.40603 -0.101436 +-0.205284 0.404218 -0.108671 +0.565306 0.34138 -0.249075 +-0.521567 0.355527 -0.224392 +0.440728 0.37709 -0.185407 +-0.240064 0.410396 -0.120259 +-0.324196 0.400767 -0.143097 +-0.0128842 0.423127 -0.0940211 +-0.414799 0.387384 -0.176668 +0.245615 0.412904 -0.122969 +0.569032 0.350593 -0.256167 +-0.568585 0.354074 -0.257475 +-0.00909139 0.430511 -0.0974606 +-0.0310364 0.456927 -0.111037 +0.104189 0.454767 -0.115505 +0.135969 0.452985 -0.118912 +0.167607 0.450822 -0.123263 +0.479349 0.40182 -0.219766 +0.505658 0.396503 -0.233779 +-0.611968 0.364724 -0.298237 +-0.439677 0.414648 -0.203287 +0.530819 0.390884 -0.248042 +-0.0986931 0.4621 -0.118681 +0.0755955 0.463931 -0.11736 +0.140596 0.462121 -0.124399 +0.172603 0.459993 -0.129015 +0.508896 0.405794 -0.240819 +0.379925 0.439773 -0.186208 +0.0803553 0.474686 -0.123521 +0.177549 0.470112 -0.135436 +-0.379649 0.445129 -0.188996 +-0.423495 0.438413 -0.207254 +0.0523877 0.484666 -0.126871 +0.384087 0.448645 -0.193033 +-0.283776 0.468266 -0.163221 +0.182235 0.480507 -0.142152 +-0.0451333 0.494601 -0.132053 +0.0570374 0.495221 -0.133108 +0.388194 0.45807 -0.200327 +0.186748 0.490466 -0.148784 +-0.0424079 0.505217 -0.13805 +-0.190492 0.497251 -0.153564 +0.191284 0.499903 -0.155306 +-0.31295 0.484937 -0.183362 +-0.359182 0.478564 -0.198773 +-0.108215 0.512335 -0.14806 +-0.403995 0.471817 -0.216305 +0.033504 0.515199 -0.143584 +0.195787 0.509525 -0.162115 +0.423582 0.472574 -0.227179 +0.0383165 0.525278 -0.149933 +0.344379 0.494579 -0.202006 +0.200119 0.51886 -0.168894 +-0.444143 0.474886 -0.24025 +0.290519 0.510681 -0.1908 +0.042909 0.53522 -0.156378 +0.293973 0.519809 -0.197891 +-0.382898 0.505106 -0.226529 +0.208164 0.537602 -0.182901 +0.509276 0.475533 -0.282709 +-0.334631 0.521801 -0.215305 +0.0522097 0.554791 -0.16965 +-0.479514 0.487429 -0.270288 +-0.050801 0.555463 -0.170012 +0.181693 0.549969 -0.184818 +-0.283885 0.538298 -0.206499 +0.185803 0.55898 -0.191905 +-0.420712 0.518374 -0.255493 +-0.527285 0.486759 -0.303554 +0.126249 0.572478 -0.189858 +-0.0376494 0.583486 -0.18875 +0.280319 0.560392 -0.220653 +0.0982794 0.582838 -0.193377 +-0.459 0.520556 -0.280041 +0.130657 0.581745 -0.197192 +0.162527 0.579425 -0.201344 +-0.0332436 0.592769 -0.195314 +0.102132 0.591406 -0.20012 +-0.18129 0.586575 -0.210656 +-0.353859 0.558175 -0.249517 +-0.304011 0.574399 -0.239971 +0.369978 0.559451 -0.258291 +-0.176798 0.59642 -0.21704 +-0.350383 0.568285 -0.255497 +-0.395079 0.561349 -0.272814 +-0.299695 0.584268 -0.245802 +-0.295676 0.594344 -0.252116 +-0.16768 0.615981 -0.230291 +0.238838 0.611828 -0.245929 +0.0177976 0.631903 -0.225157 +0.0598174 0.650459 -0.242818 +0.187959 0.64392 -0.258354 +-0.0390074 0.658606 -0.248523 +0.278349 0.635752 -0.280041 +0.128425 0.656831 -0.256979 +0.00212945 0.678198 -0.265124 +-0.116447 0.677061 -0.273344 +-0.258175 0.672381 -0.306279 +0.0429836 0.69553 -0.28279 +-0.0942206 0.70218 -0.294263 diff --git a/image_analysis/indexing/fast-feedback-indexer/data/image4_radial.txt b/image_analysis/indexing/fast-feedback-indexer/data/image4_radial.txt new file mode 100644 index 000000000..562386d24 --- /dev/null +++ b/image_analysis/indexing/fast-feedback-indexer/data/image4_radial.txt @@ -0,0 +1,692 @@ +36.9 0 0 4.83429e-15 78.95 0 4.83429e-15 4.83429e-15 78.95 +0.0803908 0.474635 -0.123496 +-0.0622664 0.46876 -0.118872 +0.140585 0.462107 -0.12439 +0.0756134 0.463957 -0.117375 +0.0718283 0.466082 -0.118179 +-0.0986932 0.462114 -0.118688 +0.0138661 0.465252 -0.11493 +-0.0309474 0.457192 -0.11117 +0.135934 0.452985 -0.118906 +0.104189 0.454767 -0.115505 +0.0718938 0.456198 -0.113031 +0.056829 0.456408 -0.112046 +-0.128674 0.453347 -0.118002 +0.0827642 0.428777 -0.100389 +-0.00909143 0.430511 -0.0974606 +-0.0800105 0.429149 -0.100317 +-0.0466116 0.427582 -0.0972261 +0.245678 0.412972 -0.123019 +0.0691479 0.426312 -0.0980706 +-0.0779153 0.426281 -0.0987711 +-0.0383317 0.423565 -0.0949458 +-0.0824148 0.422563 -0.0974211 +0.0160159 0.424055 -0.094505 +-0.0128704 0.423072 -0.0939954 +-0.239961 0.41038 -0.120223 +-0.0130451 0.419882 -0.092515 +0.121036 0.416568 -0.0989885 +-0.137739 0.412993 -0.0997421 +0.240928 0.402458 -0.116835 +-0.166494 0.406026 -0.101433 +-0.205284 0.404218 -0.108671 +0.121688 0.406326 -0.0944113 +0.0502143 0.407079 -0.0879884 +-0.0611905 0.400203 -0.0856188 +0.0106654 0.402217 -0.0845178 +-0.197441 0.390285 -0.100725 +0.199635 0.384598 -0.0987618 +0.0375337 0.390287 -0.0800723 +-0.259806 0.376812 -0.110892 +-0.141682 0.387752 -0.0891901 +-0.0631004 0.389323 -0.0810627 +-0.105296 0.387691 -0.0842442 +0.285744 0.36699 -0.114749 +0.194642 0.373976 -0.0932165 +0.0654353 0.379554 -0.0771474 +0.0338247 0.380915 -0.076009 +-0.0384795 0.379114 -0.0754506 +-0.147852 0.375114 -0.0848883 +-0.186926 0.372326 -0.090917 +-0.0481664 0.373753 -0.0737231 +0.0271594 0.375194 -0.0734517 +0.280459 0.356269 -0.1087 +0.157752 0.365403 -0.082615 +0.0930601 0.367976 -0.0748334 +-0.0479573 0.370728 -0.0724976 +0.125783 0.367419 -0.0784892 +-0.31383 0.351279 -0.117892 +-0.276401 0.353066 -0.106162 +0.00775125 0.367099 -0.0698504 +0.333389 0.339787 -0.120571 +0.275611 0.346584 -0.103385 +-0.0852684 0.357801 -0.0701034 +-0.0150192 0.358083 -0.066431 +-0.279715 0.343909 -0.103626 +-0.241849 0.346003 -0.0934732 +-0.290375 0.340401 -0.105679 +-0.129158 0.345426 -0.0704844 +0.167607 0.450822 -0.123263 +-0.167992 0.341813 -0.0753688 +-0.206874 0.339704 -0.0825011 +0.129657 0.342442 -0.0694504 +-0.177365 0.338559 -0.0759224 +0.0444934 0.339174 -0.0603292 +-0.172631 0.334454 -0.0735342 +0.234472 0.327902 -0.084848 +-0.0621336 0.336691 -0.060437 +-0.295551 0.320236 -0.0999454 +-0.341467 0.312893 -0.113717 +0.346975 0.306086 -0.113479 +-0.105859 0.324079 -0.0599114 +-0.222945 0.315282 -0.0775614 +0.0505071 0.318095 -0.0532876 +0.0646584 0.316077 -0.0534724 +0.28343 0.301929 -0.0897766 +0.161018 0.311141 -0.0633761 +0.0962996 0.313665 -0.0553623 +-0.0471248 0.406606 -0.0876124 +0.341607 0.295402 -0.107788 +-0.147969 0.311353 -0.0612965 +-0.187416 0.308985 -0.0675819 +0.12877 0.312871 -0.0589741 +-0.31134 0.296553 -0.0971581 +0.253458 0.300656 -0.0805627 +-0.356523 0.289234 -0.111611 +0.115842 0.305295 -0.0548145 +-0.240819 0.297482 -0.0761434 +-0.0117268 0.303663 -0.0472928 +-0.0824346 0.302858 -0.0505361 +-0.238755 0.29147 -0.0736949 +0.311967 0.283802 -0.0932844 +0.242363 0.283672 -0.0722121 +0.0160978 0.292879 -0.0439859 +-0.164918 0.287971 -0.0566682 +-0.203762 0.284976 -0.0633732 +-0.177397 0.284837 -0.0579817 +-0.0584057 0.28256 -0.0425301 +0.205981 0.275708 -0.0610872 +0.043927 0.281674 -0.041496 +0.296591 0.267896 -0.0833401 +-0.250082 0.273954 -0.0713409 +0.354026 0.260813 -0.101867 +-0.254505 0.267883 -0.0707715 +-0.337916 0.258404 -0.0949917 +0.0294451 0.274573 -0.0388847 +-0.383514 0.251669 -0.111417 +0.168515 0.266471 -0.0510028 +0.104278 0.269618 -0.0426953 +0.136579 0.268365 -0.046414 +0.0719481 0.270457 -0.0399602 +-0.0318057 0.270422 -0.0377835 +-0.18062 0.263559 -0.0524174 +-0.141652 0.266551 -0.0466451 +0.292488 0.257313 -0.0790002 +-0.310105 0.360161 -0.12016 +0.347788 0.251023 -0.0966556 +-0.304206 0.25119 -0.081108 +-0.00416116 0.259135 -0.0341677 +0.255161 0.249586 -0.0658694 +-0.0751437 0.257859 -0.0367441 +0.371689 0.236621 -0.102304 +0.131255 0.252423 -0.0413265 +-0.269513 0.244209 -0.0684826 +-0.301423 0.242158 -0.0777723 +-0.277487 0.241897 -0.0702222 +-0.0451409 0.249565 -0.0326946 +-0.353244 0.234563 -0.0943517 +0.0237844 0.248306 -0.0316104 +-0.118146 0.246083 -0.0379787 +0.353163 0.232069 -0.093678 +0.218937 0.240388 -0.0543362 +-0.15743 0.242532 -0.0427153 +-0.196216 0.239865 -0.0492296 +0.308433 0.232765 -0.0776716 +-0.235025 0.237645 -0.0575097 +0.36523 0.226104 -0.0969586 +0.112829 0.23937 -0.0356496 +-0.319565 0.227653 -0.080189 +0.0517679 0.237315 -0.0299477 +-0.364564 0.220848 -0.0953898 +0.214331 0.231117 -0.0509757 +0.181319 0.232362 -0.0444208 +-0.344707 0.303419 -0.111679 +0.148948 0.233192 -0.0390442 +-0.410487 0.214215 -0.113652 +0.388443 0.211678 -0.10317 +-0.331068 0.213921 -0.0809617 +-0.172932 0.218929 -0.0397058 +-0.134017 0.222097 -0.0342296 +0.26702 0.214369 -0.0604543 +-0.421255 0.20034 -0.115462 +0.325719 0.20847 -0.0778031 +-0.211983 0.216535 -0.0470174 +0.381866 0.201265 -0.0979627 +0.410256 0.196817 -0.109521 +-0.0669853 0.213848 -0.0254323 +0.230635 0.206352 -0.0490918 +0.405082 0.190469 -0.10578 +0.247778 0.200289 -0.0521125 +-0.261919 0.199529 -0.0557613 +-0.435942 0.185804 -0.119414 +0.404227 0.186294 -0.104514 +0.377781 0.187681 -0.0933262 +0.0638353 0.202263 -0.0227515 +-0.346234 0.190007 -0.0812948 +0.193605 0.197565 -0.0390185 +-0.149496 0.198464 -0.0313604 +-0.188599 0.195531 -0.037608 +0.284382 0.190161 -0.0603376 +0.0346586 0.196296 -0.020068 +-0.341042 0.184654 -0.078266 +0.342493 0.183575 -0.0785888 +-0.311841 0.182887 -0.0676334 +-0.0827428 0.18981 -0.021672 +0.425988 0.171472 -0.111669 +-0.35735 0.175907 -0.0827446 +-0.402168 0.169601 -0.10028 +0.375347 0.170667 -0.0889636 +-0.277347 0.176009 -0.0554897 +0.240208 0.17747 -0.0456393 +0.0157878 0.179823 -0.0164278 +-0.139341 0.176369 -0.0255882 +-0.322976 0.169047 -0.0688127 +0.419082 0.161495 -0.10653 +0.241689 0.171027 -0.0448371 +-0.164921 0.174524 -0.0292568 +-0.203989 0.171672 -0.0361965 +0.447314 0.156341 -0.119394 +-0.413415 0.155705 -0.102869 +-0.0600037 0.169702 -0.016333 +0.358978 0.158381 -0.0801902 +-0.288394 0.162048 -0.0563002 +0.342647 0.15805 -0.073926 +0.0762878 0.167466 -0.0170782 +-0.0982268 0.166384 -0.0188437 +0.173568 0.164059 -0.0289393 +0.205375 0.162664 -0.0349291 +-0.138391 0.163324 -0.0231821 +0.389229 0.150845 -0.0912941 +-0.215734 0.157695 -0.0363656 +0.225611 0.156686 -0.0384653 +-0.254092 0.155045 -0.0453281 +0.379922 0.144184 -0.0862875 +-0.424541 0.141643 -0.105739 +0.258946 0.14615 -0.0452292 +-0.13482 0.150816 -0.0206747 +0.228423 0.146263 -0.0374878 +-0.346592 0.140109 -0.0725071 +0.317921 0.140285 -0.0623186 +0.175167 0.145761 -0.026311 +0.0285253 0.145493 -0.0110521 +0.374327 0.133111 -0.0823069 +-0.152659 0.139753 -0.0216522 +-0.188636 0.139336 -0.0278879 +0.221944 0.137605 -0.034699 +-0.191619 0.13688 -0.0281223 +0.311058 0.130809 -0.0586543 +0.0967482 0.135494 -0.0139568 +0.120475 0.131531 -0.016036 +0.152796 0.130282 -0.0203675 +-0.0859686 0.1312 -0.0123786 +-0.315163 0.12431 -0.0591389 +0.395876 0.118276 -0.0893449 +0.363097 0.119492 -0.0759425 +0.275447 0.121273 -0.0463639 +-0.432703 0.18629 -0.11792 +-0.360072 0.117811 -0.0745438 +-0.461229 0.111022 -0.119692 +0.423594 0.113946 -0.101343 +-0.198565 0.326013 -0.0757233 +0.0128348 0.121282 -0.00746492 +-0.241871 0.120084 -0.0371511 +0.333775 0.114964 -0.0643839 +0.112973 0.121805 -0.0138963 +-0.281238 0.117731 -0.0476113 +0.238813 0.112807 -0.0355089 +-0.325674 0.110731 -0.0610246 +0.417139 0.103153 -0.0970304 +-0.458027 0.100307 -0.116739 +-0.371353 0.103895 -0.0773395 +0.297678 0.106436 -0.0512856 +0.444454 0.098572 -0.109638 +0.249616 0.106334 -0.0375111 +0.0730276 0.109095 -0.00865478 +-0.258069 -0.23603 -0.0631489 +-0.365369 -0.224487 -0.0966113 +-0.265053 -0.256537 -0.0705186 +-0.241087 -0.261138 -0.0652895 +-0.208454 -0.0853897 -0.0257025 +0.203468 0.0556964 -0.0225038 +-0.331388 -0.232637 -0.0856359 +0.0591658 -0.246035 -0.0325467 +0.0561001 -0.247577 -0.0327573 +-0.0471166 -0.247599 -0.0322838 +-0.185215 -0.282837 -0.0588844 +-0.415352 0.0484374 -0.0916296 +-0.0141797 -0.20614 -0.0215801 +0.398684 0.0702613 -0.0856069 +-0.277791 0.020157 -0.0395699 +-0.127768 -0.247811 -0.0396537 +-0.236058 -0.244522 -0.0595292 +0.255543 -0.244168 -0.0645428 +-0.366149 0.128467 -0.0783543 +-0.230159 -0.247124 -0.0587472 +-0.367094 -0.236032 -0.10026 +0.186307 -0.251427 -0.0502241 +0.153342 -0.251342 -0.0443258 +0.26621 -0.200208 -0.0571061 +0.35543 -0.238637 -0.0962735 +-0.157859 -0.336774 -0.0717416 +-0.109206 -0.254014 -0.0389844 +0.162128 -0.407163 -0.101149 +-0.30508 -0.242731 -0.0791267 +0.0136441 -0.259445 -0.0343384 +-0.219247 -0.0992175 -0.0293886 +-0.417518 -0.235344 -0.122337 +-0.0698955 -0.359586 -0.0695093 +-0.163191 -0.212651 -0.0365955 +-0.29736 -0.32578 -0.102535 +0.00911137 -0.0359752 -0.000688853 +0.390866 -0.180031 -0.0973304 +-0.0587924 -0.260672 -0.0363644 +-0.304299 -0.275115 -0.0880164 +-0.2049 -0.257736 -0.0557606 +-0.230626 0.134037 -0.0362336 +-0.348452 -0.249492 -0.0964876 +0.140573 -0.433603 -0.109928 +0.376345 -0.246982 -0.107047 +-0.0798848 -0.331308 -0.0598651 +0.204446 0.00690026 -0.0211466 +0.275722 -0.258498 -0.0741727 +-0.0464197 -0.424409 -0.09572 +-0.314342 -0.257624 -0.0863158 +-0.157221 -0.201381 -0.0331871 +-0.20818 -0.176517 -0.0379694 +-0.256842 -0.357125 -0.10195 +-0.468518 0.086442 -0.120785 +0.00288439 -0.273002 -0.0379909 +0.20718 -0.265918 -0.0585309 +-0.314513 -0.298813 -0.0990049 +0.207353 -0.132702 -0.0307761 +-0.303453 -0.108768 -0.053382 +-0.230108 -0.112943 -0.033411 +-0.337995 -0.257118 -0.0946551 +-0.0687408 -0.274806 -0.0409606 +0.0336321 -0.274785 -0.0390828 +-0.213036 -0.271771 -0.0615139 +0.302367 -0.220993 -0.0727803 +-0.067729 -0.359805 -0.0694341 +0.312426 -0.11663 -0.0572447 +-0.425761 0.034602 -0.0958264 +-0.108923 -0.277681 -0.0455217 +0.000925289 -0.359096 -0.0666999 +-0.287649 -0.267931 -0.0805048 +-0.235678 -0.166169 -0.0424804 +0.44388 -0.190496 -0.124396 +0.281998 -0.206767 -0.0631304 +-0.291534 -0.186047 -0.0617067 +-0.0276369 -0.433041 -0.0990497 +0.265659 -0.273243 -0.0754658 +0.0542144 -0.417493 -0.0929384 +0.406672 -0.156578 -0.0999437 +-0.253496 -0.273666 -0.0721818 +-0.257508 -0.275107 -0.0737139 +-0.0080785 -0.287143 -0.0421465 +-0.378171 -0.146505 -0.0859305 +-0.000220219 -0.434032 -0.0991027 +-0.266842 -0.250801 -0.0694656 +0.196861 -0.28115 -0.0607448 +0.402161 -0.118923 -0.0921874 +-0.0596665 -0.368378 -0.0722407 +0.14353 -0.221281 -0.0354099 +-0.182356 -0.28253 -0.0582339 +0.359434 -0.269953 -0.106729 +0.270337 -0.0864901 -0.041127 +0.174741 -0.222942 -0.0409575 +-0.331625 -0.27433 -0.0973549 +-0.373458 0.0450536 -0.0734478 +0.383713 -0.270019 -0.116906 +0.293409 0.0479238 -0.045215 +-0.382876 -0.108197 -0.0825582 +0.00133235 -0.31621 -0.0513116 +0.151728 -0.420209 -0.105347 +-0.332955 -0.316816 -0.111874 +-0.434283 -0.211155 -0.124322 +-0.118519 -0.291707 -0.0508635 +-0.0699398 -0.317398 -0.0542904 +-0.157435 -0.294693 -0.0574659 +0.385632 -0.274906 -0.119253 +0.0672651 -0.233735 -0.0300293 +0.250335 -0.162738 -0.045616 +-0.150623 -0.296247 -0.05684 +-0.315192 -0.34234 -0.114869 +-0.399548 -0.21731 -0.109417 +0.327997 -0.0928378 -0.0598942 +0.349747 -0.284531 -0.107409 +-0.310143 -0.0698212 -0.0518776 +-0.058293 -0.303634 -0.0489963 +-0.0251197 -0.220148 -0.0248571 +-0.411698 -0.140091 -0.0995118 +0.208705 -0.297219 -0.0682795 +0.0116634 -0.303414 -0.0472124 +0.31426 0.081511 -0.0541687 +-0.269274 -0.29209 -0.082299 +0.217219 -0.337199 -0.083969 +-0.201641 -0.215951 -0.0446434 +-0.151717 -0.0346897 -0.0121849 +-0.179525 0.101805 -0.0215285 +0.315862 0.0331832 -0.0517755 +0.08561 -0.41914 -0.0961237 +-0.322705 -0.193635 -0.0735189 +0.157305 -0.0155203 -0.0125719 +-0.440655 -0.0802908 -0.105921 +-0.0597296 -0.388383 -0.08044 +-0.336862 -0.19279 -0.078395 +0.276104 -0.301322 -0.0873273 +0.0237481 -0.311575 -0.0500753 +-0.057839 -0.312425 -0.0518201 +0.108373 -0.43267 -0.104985 +-0.24221 -0.303458 -0.0784538 +-0.242182 -0.34622 -0.0936451 +0.206477 -0.309365 -0.0717432 +0.0188631 -0.0727933 -0.00283135 +-0.206187 0.0643009 -0.0236024 +-0.179575 -0.188117 -0.0344096 +0.275295 -0.3435 -0.102102 +0.246622 -0.224992 -0.0573674 +0.226563 -0.00782264 -0.0260349 +-0.119869 -0.376225 -0.0812582 +-0.0489024 -0.321558 -0.0543737 +0.344438 -0.160122 -0.0749467 +-0.241565 -0.127397 -0.0380143 +-0.113461 -0.196271 -0.0260368 +-0.00263653 -0.191833 -0.0185759 +-0.032184 -0.325123 -0.054876 +0.398986 -0.0268609 -0.0834364 +0.291557 -0.101479 -0.0488445 +0.0946094 -0.153075 -0.0163247 +0.0149732 0.0578962 -0.00178968 +-0.00884073 -0.329748 -0.0559726 +-0.281141 -0.172579 -0.0559788 +-0.235689 -0.276788 -0.0684214 +0.227487 -0.32337 -0.0814788 +-0.100759 0.360691 -0.0727732 +0.0269993 0.216645 -0.0241229 +-0.279018 0.0688539 -0.0421858 +0.391042 -0.0894994 -0.083989 +-0.00908905 -0.372169 -0.0718795 +0.255543 -0.322088 -0.0884314 +0.437346 0.0883437 -0.105057 +-0.0691356 -0.140585 -0.0123482 +0.359082 -0.312216 -0.120465 +-0.232131 -0.417405 -0.121428 +-0.119011 -0.333638 -0.0648413 +0.322514 -0.320832 -0.109466 +-0.0914637 -0.0770349 -0.00717574 +-0.0747288 -0.101978 -0.00802419 +0.224487 -0.331124 -0.0835054 +0.0522708 -0.340748 -0.0612996 +-0.416995 0.0967207 -0.0962519 +0.360842 -0.1366 -0.0774312 +-0.400685 -0.0329624 -0.0843771 +-0.26725 0.0337707 -0.0369646 +0.0321343 -0.402936 -0.0853363 +-0.0197195 -0.343287 -0.0609766 +-0.388511 -0.161789 -0.0928706 +-0.17964 -0.391598 -0.0975698 +0.00215012 -0.13973 -0.00981263 +0.08832 0.00166015 -0.00390923 +0.237193 -0.17761 -0.0449113 +-0.218562 0.0990865 -0.0292207 +0.356047 0.100224 -0.0709221 +0.42662 -0.0317879 -0.0961281 +0.0247944 -0.24548 -0.0309156 +0.348973 -0.326617 -0.121627 +-0.269872 -0.335046 -0.0972746 +-0.0761871 -0.381108 -0.0786141 +-0.218359 -0.342917 -0.0863659 +-0.470269 -0.112638 -0.124695 +-0.390628 -0.0211949 -0.0796952 +-0.0509184 -0.0246272 -0.00160087 +-0.0909987 -0.351572 -0.0682723 +0.399968 0.0217391 -0.0837288 +-0.0577045 -0.354626 -0.066774 +-0.302479 0.0896589 -0.0510701 +-0.348621 -0.115314 -0.0698568 +-0.186198 -0.367974 -0.0889978 +-0.252088 -0.140988 -0.0426212 +-0.0449263 0.0361852 -0.00166525 +-0.235805 -0.0747858 -0.0310815 +0.206271 -0.351887 -0.086968 +0.337271 0.018127 -0.0587668 +0.365971 -0.218268 -0.095332 +0.436664 -0.109191 -0.107026 +0.106022 -0.358108 -0.0723589 +0.0870553 -0.359107 -0.0707725 +-0.0471953 -0.416974 -0.0923077 +0.427822 -0.214165 -0.121876 +-0.0774381 -0.448607 -0.109632 +-0.0374715 0.0945078 -0.00518134 +0.312859 -0.249719 -0.0836158 +0.322609 -0.0296435 -0.053932 +0.0434362 -0.363002 -0.0692247 +-0.0400352 0.201794 -0.0213906 +-0.086023 -0.36173 -0.0716942 +0.432387 -0.0709729 -0.10111 +0.18709 0.0806374 -0.0209725 +-0.371665 0.0531391 -0.0731551 +0.0924576 -0.0125919 -0.004363 +-0.128947 -0.361914 -0.0767499 +-0.214403 -0.357241 -0.0909287 +-0.0891464 -0.420831 -0.0972519 +0.256778 0.0395235 -0.0343381 +0.376324 -0.113063 -0.0804366 +-0.0901887 -0.364578 -0.073205 +0.215493 -0.0344095 -0.024101 +0.462791 -0.114429 -0.120949 +-0.417802 -0.101667 -0.0971681 +-0.176481 -0.397387 -0.099479 +-0.478143 0.023967 -0.122045 +0.0297695 -0.370175 -0.0715152 +0.433423 -0.16178 -0.113449 +0.0118784 -0.38732 -0.078131 +0.401368 -0.208705 -0.108178 +0.264389 -0.357991 -0.104489 +-0.0479832 -0.370207 -0.072291 +-0.102019 -0.369037 -0.0762016 +-0.10904 -0.405268 -0.0923282 +0.194847 -0.365894 -0.0899688 +0.154029 -0.116804 -0.018862 +0.0975303 -0.446246 -0.11042 +0.219788 -0.017557 -0.0246103 +0.180872 -0.170054 -0.0313064 +0.0145482 -0.463105 -0.113816 +0.148036 -0.0780659 -0.0141039 +-0.218548 -0.190705 -0.0429899 +0.0921183 -0.406351 -0.0909382 +0.27091 -0.177395 -0.0538824 +-0.105318 -0.353762 -0.0706128 +-0.393764 0.0761533 -0.0839483 +0.223845 -0.200184 -0.0461551 +-0.154834 -0.454283 -0.122701 +-0.23097 -0.38107 -0.104769 +-0.04094 -0.0353012 -0.0014622 +-0.256052 0.0473493 -0.0344973 +0.26929 0.366371 -0.109351 +0.176924 0.391604 -0.0970361 +0.370585 -0.0741718 -0.0741679 +-0.0170852 -0.460412 -0.112459 +0.133636 -0.230684 -0.0361917 +0.0516558 -0.165695 -0.0151767 +0.41751 -0.0944633 -0.0962513 +-0.116506 -0.452032 -0.11564 +0.248742 -0.0717592 -0.0340922 +-0.297846 -0.147506 -0.0568511 +0.0761639 -0.431503 -0.101109 +-0.166921 0.0672667 -0.016327 +-0.00123338 -0.379881 -0.0749654 +-0.196133 -0.163534 -0.0331553 +0.00176348 -0.471731 -0.118259 +-0.0999699 -0.434198 -0.104747 +0.447002 0.00164555 -0.105469 +0.0280908 -0.447938 -0.106377 +0.0162757 -0.426785 -0.0957936 +-0.320692 -0.217763 -0.0781889 +-0.269795 -0.0706392 -0.0396769 +0.464667 0.082938 -0.118407 +-0.165846 -0.425987 -0.110601 +0.0221665 -0.374842 -0.0731764 +-0.165618 0.0186548 -0.0139865 +-0.0566279 -0.464047 -0.116001 +0.229334 -0.366878 -0.0984421 +0.307301 -0.0778512 -0.0515775 +0.0490137 -0.377313 -0.0752123 +0.441081 -0.069215 -0.105206 +0.419904 0.0063612 -0.0924538 +0.116071 -0.168093 -0.0210863 +-0.251731 -0.381321 -0.110491 +-0.00291544 0.0980969 -0.0048274 +-0.128305 0.0700157 -0.0107399 +0.0278275 -0.372579 -0.0724169 +0.00960473 0.112607 -0.00640684 +0.0587002 0.369386 -0.0725798 +0.118379 -0.299784 -0.053366 +0.183815 -0.379583 -0.0932869 +0.241273 -0.220254 -0.0548675 +0.232271 -0.407979 -0.117049 +0.216112 -0.0149521 -0.0237459 +0.322867 -0.278225 -0.0953743 +-0.335109 -0.150402 -0.0699025 +0.14829 -0.169724 -0.025729 +0.17036 0.105671 -0.0203004 +0.403499 0.00548978 -0.0850364 +0.223161 -0.109067 -0.0313392 +-0.227146 0.192969 -0.0454489 +-0.292763 -0.094701 -0.0485162 +0.470962 0.011467 -0.117921 +0.0911215 0.428545 -0.101086 +0.202555 -0.185479 -0.038455 +0.242833 -0.15755 -0.0428113 +0.0226113 -0.415665 -0.0907632 +0.00282665 -0.372189 -0.0718474 +0.355467 -0.189235 -0.0846678 +-0.214309 -0.138214 -0.0330621 +0.193218 0.315837 -0.0710683 +-0.134909 -0.223861 -0.0347612 +-0.273012 -0.142409 -0.0485883 +0.107259 -0.390948 -0.0858582 +0.310741 -0.215743 -0.0743138 +0.111195 -0.220735 -0.0310254 +0.363576 -0.0681318 -0.0709303 +-0.265435 0.141003 -0.0462377 +-0.205682 -0.293973 -0.0665789 +0.127968 -0.389983 -0.0881135 +-0.276868 -0.0293123 -0.0395392 +-0.0449406 -0.372195 -0.072934 +-0.425173 -0.0146539 -0.0950065 +-0.0479756 -0.382744 -0.077392 +-0.311118 -0.0215872 -0.0498739 +0.023615 -0.0170553 -0.000424364 +-0.439607 -0.171374 -0.11831 +0.27274 0.290168 -0.0827131 +-0.12746 -0.366772 -0.0784621 +0.339024 -0.212456 -0.0835258 +-0.084951 -0.207225 -0.0254021 +-0.438967 0.0689805 -0.104149 +0.104563 -0.233967 -0.0333945 +0.188482 0.0323402 -0.018456 +0.0754808 -0.383387 -0.0795019 +-0.348518 0.100789 -0.0681327 +-0.145255 -0.237424 -0.0395154 +-0.212645 -0.24977 -0.0553323 +-0.100316 0.0586005 -0.00677159 +0.14367 -0.435872 -0.111532 +-0.297049 0.256891 -0.0803431 +0.421973 -0.132944 -0.103192 +-0.0792635 -0.373208 -0.0756447 +-0.0444149 -0.435953 -0.101127 +0.0532051 -0.170439 -0.0160692 +-0.190767 -0.201542 -0.0392769 +-0.197228 -0.071851 -0.0222789 +0.244461 -0.21467 -0.0544018 +0.30839 -0.168893 -0.0638532 +-0.275525 -0.211245 -0.0622038 +0.0368797 -0.477074 -0.121911 +-0.251637 -0.204337 -0.0539952 +0.184142 -0.00878793 -0.0171396 +-0.268434 0.0824533 -0.0402372 +0.0271077 -0.00029401 -0.000367524 +-0.00454595 -0.100715 -0.00509507 +0.340641 -0.164709 -0.0743461 +0.0354809 -0.231949 -0.0279194 +-0.171682 -0.210847 -0.0376752 +0.082113 -0.399609 -0.0869994 +0.0788624 -0.218975 -0.0274618 +0.252266 -0.413088 -0.124946 +0.270307 -0.0191212 -0.0374156 +0.16771 0.398592 -0.098336 +0.164918 -0.236848 -0.0425529 +0.465905 -0.0138287 -0.115273 +-0.476146 -0.0246792 -0.12098 +0.194632 -0.406817 -0.107465 +0.180963 -0.395838 -0.0996863 +-0.321777 -0.0948779 -0.0579503 +0.123659 -0.0722475 -0.0103088 +0.0296365 -0.376013 -0.0738597 +0.318357 -0.198153 -0.0729703 +0.466051 0.0345046 -0.115915 +-0.404642 0.0623087 -0.0876499 +0.472935 -0.00345861 -0.11891 +0.358581 0.00309613 -0.0665064 +-0.167845 -0.399765 -0.0988807 +0.229105 -0.147991 -0.037914 +0.119403 -0.393649 -0.0885269 +0.0569064 -0.392838 -0.0821546 +-0.289972 -0.244342 -0.0746819 +-0.343339 -0.154358 -0.0735595 +-0.250465 -0.126735 -0.0402053 +0.18922 -0.0161551 -0.0181982 +-0.290558 0.0547265 -0.044709 +0.336163 0.0664745 -0.060545 +-0.288936 -0.0341099 -0.0432593 +0.255108 0.0878025 -0.0370823 +0.283365 0.0863047 -0.0448793 +0.0354953 -0.375941 -0.0740365 +0.259904 0.0968386 -0.0392335 +-0.168331 -0.235322 -0.0427705 +0.132406 -0.235413 -0.0371659 +-0.308787 -0.162178 -0.0627974 +0.209987 -0.144939 -0.0330986 +0.203533 -0.232383 -0.0489099 +0.06662 -0.0828956 -0.00567104 +-0.165386 0.0698464 -0.0162475 +0.0575963 0.0854314 -0.00532209 +-0.140536 0.104646 -0.0154703 +0.300711 -0.215156 -0.0708711 +-0.124401 -0.210085 -0.0302637 +0.00995374 -0.0955559 -0.00462571 +0.260975 -0.199902 -0.055579 +-0.204947 0.015753 -0.0213538 +0.279129 0.0249582 -0.0400708 +0.448063 -0.138166 -0.116739 +0.337956 -0.181301 -0.0764657 +0.0149314 -0.0243026 -0.000406865 +-0.334944 0.0959214 -0.0626571 +0.0365055 0.0744272 -0.00344195 +-0.224306 -0.151803 -0.0373771 +0.127227 -0.154015 -0.0201567 +0.458854 -0.0760631 -0.11475 +-0.204294 -0.125378 -0.0291528 +-0.226285 -0.118913 -0.0332247 +-0.0122355 -0.11331 -0.0065156 +0.0432087 0.0519579 -0.00228592 +-0.308265 -0.105261 -0.0545409 +-0.382866 0.0902719 -0.0806171 +-0.0427891 0.0891919 -0.00490508 +-0.158235 -0.0722499 -0.0152453 +0.1115 -0.0725987 -0.00889091 +0.371864 0.0691017 -0.0742883 +0.31571 -0.0155591 -0.0512717 +0.172825 0.00863184 -0.0150853 +0.207458 0.0912295 -0.0260193 diff --git a/image_analysis/indexing/fast-feedback-indexer/data/image5_local.txt b/image_analysis/indexing/fast-feedback-indexer/data/image5_local.txt new file mode 100644 index 000000000..9ccf5bae8 --- /dev/null +++ b/image_analysis/indexing/fast-feedback-indexer/data/image5_local.txt @@ -0,0 +1,280 @@ +36.9 0 0 4.83429e-15 78.95 0 4.83429e-15 4.83429e-15 78.95 +0.0802853 0.474083 -0.123188 +0.140349 0.46156 -0.124063 +-0.0278202 0.464472 -0.114849 +-0.315176 0.124561 -0.0591765 +-0.167055 0.0672797 -0.0163507 +0.0373009 0.390005 -0.0799431 +-0.399381 -0.217108 -0.109293 +-0.330889 0.213783 -0.0808648 +0.432421 -0.0710108 -0.101129 +-0.360459 0.117869 -0.0747022 +-0.393742 0.0764326 -0.0839621 +0.458897 -0.0759438 -0.114762 +-0.337127 0.0968654 -0.0635371 +-0.208845 -0.0852012 -0.0257697 +-0.175972 -0.398674 -0.0999485 +-0.440288 -0.0797357 -0.105691 +0.282668 0.301934 -0.0895416 +0.39113 -0.0892793 -0.0840051 +-0.287473 -0.267239 -0.0802487 +0.0930719 0.368248 -0.0749426 +-0.219421 -0.0991389 -0.0294197 +-0.0749919 -0.101973 -0.0080435 +0.417864 -0.0944016 -0.0964081 +-0.0605014 0.401235 -0.0860251 +0.0125286 -0.434161 -0.0992517 +-0.417919 -0.101519 -0.0972055 +-0.303266 -0.108534 -0.0532951 +0.17576 -0.222191 -0.0409694 +-0.152818 0.139732 -0.0216741 +-0.402842 0.169977 -0.100652 +-0.382721 -0.108136 -0.0824863 +0.436475 -0.109165 -0.106931 +-0.34836 -0.115142 -0.0697379 +-0.0314541 0.271008 -0.0379369 +0.312362 -0.116475 -0.0572044 +-0.145405 0.320688 -0.0640423 +-0.19727 -0.0718913 -0.0222904 +-0.425552 0.0348948 -0.0957389 +0.0948835 -0.152736 -0.0162984 +0.275989 -0.125192 -0.0470273 +-0.425387 -0.0144783 -0.0951043 +-0.00813607 -0.28676 -0.0420321 +0.162669 0.376337 -0.0879093 +0.43355 -0.161561 -0.113472 +-0.0801978 -0.331184 -0.059848 +0.185947 -0.11773 -0.0245189 +-0.060358 -0.38968 -0.0810298 +0.210331 -0.144796 -0.0331521 +-0.291801 0.329956 -0.102236 +0.40386 0.186295 -0.104349 +-0.126476 0.261636 -0.043156 +-0.411809 -0.139827 -0.0995215 +0.25285 0.329876 -0.0904678 +0.342422 0.183643 -0.0785758 +-0.2982 -0.147354 -0.0569392 +0.428405 -0.214 -0.12212 +0.242835 -0.157441 -0.0427938 +-0.476003 -0.0246148 -0.120901 +-0.341132 0.313052 -0.113644 +0.0127882 0.347116 -0.0622652 +0.250385 -0.162858 -0.0456496 +-0.276837 -0.0291801 -0.0395264 +0.254918 0.0878249 -0.0370339 +-0.0915302 -0.0771461 -0.0071905 +0.406731 -0.156476 -0.0999525 +0.308535 -0.168868 -0.0638963 +-0.18614 -0.367711 -0.0888794 +-0.208079 -0.176303 -0.0379084 +0.160573 0.311173 -0.0633102 +0.328098 -0.0928365 -0.0599293 +-0.312058 0.195254 -0.0702175 +-0.157442 -0.29395 -0.0572353 +0.157281 0.365389 -0.0825285 +0.0532847 0.406209 -0.0877745 +0.328577 -0.183709 -0.0735616 +0.422129 -0.132859 -0.103253 +-0.29178 -0.186003 -0.0617744 +-0.211962 0.216727 -0.0470563 +0.390956 -0.179893 -0.0973418 +-0.258637 -0.235862 -0.0632631 +0.462637 -0.114136 -0.12083 +0.301063 0.165294 -0.0608305 +0.410263 0.197221 -0.109613 +-0.33243 -0.27424 -0.0976239 +-0.157216 -0.201341 -0.0331779 +-0.383092 0.25178 -0.111266 +-0.191225 -0.201434 -0.0393453 +0.276209 -0.301598 -0.0874501 +0.218291 0.24099 -0.05434 +-0.269866 -0.334704 -0.0971458 +-0.314899 -0.34132 -0.114371 +0.41679 0.10324 -0.0968791 +0.291504 -0.101498 -0.0488303 +-0.290472 0.0548515 -0.04469 +-0.201732 -0.216086 -0.0446933 +0.110972 -0.220771 -0.031008 +0.15236 0.337188 -0.0709733 +-0.364339 0.221078 -0.0953556 +-0.337073 -0.19287 -0.0784889 +-0.106699 -0.351076 -0.0697521 +0.377397 0.0854602 -0.0779002 +-0.166318 0.407198 -0.101931 +-0.19323 -0.224417 -0.0448564 +-0.434138 -0.210385 -0.124065 +-0.0704501 -0.317498 -0.0543617 +0.151524 0.313982 -0.0627402 +0.0653883 0.379163 -0.0769833 +-0.421035 0.20038 -0.115366 +-0.365205 -0.224247 -0.0964854 +0.286642 -0.231483 -0.0703487 +-0.147871 0.376192 -0.0853341 +-0.115904 0.0317681 -0.00724772 +-0.331224 -0.232627 -0.0855738 +-0.26922 0.2444 -0.068448 +0.233925 0.328006 -0.0847455 +0.298051 0.106889 -0.0514536 +0.023888 0.2483 -0.0316113 +-0.418134 -0.235194 -0.122591 +0.37612 -0.246813 -0.106906 +0.207344 -0.265902 -0.0585627 +-0.314559 -0.257659 -0.0864003 +-0.10906 -0.405045 -0.0922312 +-0.0688019 -0.274538 -0.0408884 +0.104077 0.26927 -0.0425754 +0.000948438 -0.316961 -0.051562 +-0.0704821 -0.360112 -0.0697573 +0.318494 -0.341125 -0.115582 +0.261053 -0.262272 -0.0709871 +-0.185532 -0.282784 -0.0589309 +-0.148112 -0.407711 -0.0989814 +0.386163 -0.274885 -0.119479 +0.128993 -0.44699 -0.11481 +0.447956 -0.137806 -0.116629 +0.000248893 -0.358967 -0.0666496 +0.0438967 -0.429992 -0.0982351 +0.0976378 0.378549 -0.079583 +0.296012 0.267416 -0.0830128 +-0.240769 -0.260437 -0.0650117 +-0.415176 0.0485742 -0.0915564 +0.140523 -0.433344 -0.109794 +0.27586 -0.25846 -0.074203 +-0.39053 -0.020996 -0.0796492 +0.284298 0.190146 -0.060309 +-0.221213 -0.409099 -0.11473 +0.252414 -0.412993 -0.124944 +-0.206732 0.339997 -0.0825775 +0.1515 -0.420922 -0.105644 +-0.38251 0.0901155 -0.0804537 +-0.0777889 -0.448972 -0.109847 +-0.0147399 0.358588 -0.0666205 +-0.225289 0.381607 -0.103551 +0.120425 0.131585 -0.0160369 +-0.259816 -0.405814 -0.123752 +-0.468535 0.0866036 -0.12081 +-0.140509 0.10475 -0.0154773 +-0.134823 -0.223362 -0.0346336 +-0.0741203 -0.193501 -0.0217038 +0.402146 0.128991 -0.0935563 +-0.154933 -0.453806 -0.122472 +-0.0164839 -0.460918 -0.11271 +0.444549 0.0986386 -0.109693 +0.425682 0.171476 -0.111523 +0.00288593 -0.273118 -0.0380237 +-0.304601 -0.303096 -0.0970322 +0.279848 0.356161 -0.108465 +-0.357321 -0.0279402 -0.0664365 +-0.196041 0.240038 -0.0492373 +0.313023 -0.249648 -0.0836527 +-0.213548 -0.271919 -0.0616731 +0.189267 -0.0164722 -0.0182125 +-0.348956 -0.249328 -0.0966369 +-0.432497 0.186594 -0.117883 +-0.388692 -0.161746 -0.0929405 +-0.356764 0.176468 -0.0826243 +0.161966 -0.407611 -0.101323 +0.241585 0.17098 -0.0448024 +0.075714 -0.431775 -0.101202 +0.293425 0.047944 -0.0452209 +-0.308912 -0.162358 -0.0628697 +-0.0286124 -0.432831 -0.0989789 +-0.292977 -0.0946813 -0.0485801 +0.0410769 0.336768 -0.0593086 +0.181352 0.232442 -0.0444467 +-0.413439 0.155791 -0.102895 +0.278338 0.0734343 -0.0423281 +-0.11959 -0.376556 -0.0813575 +0.329531 -0.31294 -0.109226 +-0.222678 0.315404 -0.0775387 +-0.337638 0.258492 -0.094913 +-0.438897 0.0689832 -0.104115 +0.337266 0.0182672 -0.0587679 +-0.0380597 0.379019 -0.0753941 +-0.0985186 -0.433766 -0.104377 +0.322836 -0.320834 -0.109583 +-0.279366 0.344443 -0.103722 +0.217341 -0.337502 -0.0841094 +0.186889 0.298274 -0.063995 +0.0971964 -0.446154 -0.110338 +-0.276191 0.353415 -0.106235 +-0.353206 0.235011 -0.0944532 +0.0160688 0.292801 -0.0439616 +0.0142561 0.411683 -0.0887845 +0.384334 -0.269487 -0.117014 +-0.298024 -0.324148 -0.102164 +-0.019252 -0.300991 -0.0465675 +-0.242279 -0.389182 -0.111272 +-0.314644 -0.298685 -0.099008 +0.0639571 0.202458 -0.0227997 +0.166254 0.13959 -0.0238472 +0.446963 0.15656 -0.119254 +-0.309461 0.360264 -0.119975 +0.25497 0.249364 -0.0657581 +0.353682 0.260851 -0.101743 +0.464431 0.0828819 -0.118278 +0.243263 -0.0345592 -0.0306556 +0.217708 -0.294964 -0.0696239 +0.000658998 0.15124 -0.0115031 +0.359172 -0.311858 -0.120375 +0.205376 -0.393251 -0.1038 +0.00127995 -0.400773 -0.0838236 +0.339082 -0.212148 -0.0834756 +0.153429 0.130509 -0.0204967 +-0.0666533 0.213919 -0.0254253 +-0.241563 0.346173 -0.0934618 +-0.104592 0.387844 -0.0842283 +-0.345033 0.0168919 -0.0615613 +0.230473 0.206213 -0.0490222 +0.0113075 -0.387486 -0.0781939 +0.387901 0.21149 -0.102891 +0.322998 -0.278222 -0.0954201 +0.359514 0.271756 -0.107308 +0.359336 -0.269502 -0.106553 +-0.30241 0.0897825 -0.0510598 +-0.0827176 0.19022 -0.0217495 +-0.311175 -0.0214098 -0.0498887 +-0.18471 0.31832 -0.0701856 +-0.16479 0.288087 -0.0566814 +-0.477931 0.0239356 -0.121929 +-0.254164 0.155257 -0.0453817 +-0.23185 -0.416908 -0.121118 +0.285367 0.366576 -0.114456 +0.33294 0.339791 -0.120402 +-0.203611 0.172112 -0.0361951 +-0.168013 0.342496 -0.0756255 +-0.123406 0.418816 -0.100353 +-0.288244 0.162106 -0.0562641 +0.399145 -0.0267915 -0.0835036 +-0.296938 0.206505 -0.0676997 +0.378648 -0.0117666 -0.074534 +0.465419 -0.0132749 -0.115009 +0.358608 0.00333605 -0.0665178 +0.419871 0.00635293 -0.0924385 +0.0160924 0.180323 -0.0165242 +0.199583 0.384751 -0.0988159 +-0.371087 0.103944 -0.0772379 +0.465917 0.0344821 -0.115844 +-0.039929 0.201892 -0.0214065 +-0.2542 0.267922 -0.070699 +-0.40431 0.0623664 -0.087507 +-0.478637 0.0726253 -0.124996 +-0.261787 0.199762 -0.055774 +-0.277264 0.175955 -0.0554555 +-0.0117341 0.304111 -0.0474356 +-0.45792 0.10038 -0.116692 +-0.325647 0.110799 -0.0610232 +-0.410615 0.214281 -0.113727 +0.22161 0.137538 -0.0346129 +0.0959529 0.313636 -0.0553171 +0.318025 0.140359 -0.062365 +-0.186635 0.372489 -0.0909239 +0.193918 0.373899 -0.0930294 +-0.226952 0.193043 -0.0454177 +-0.267784 0.32295 -0.0922582 +-0.157172 0.242689 -0.0427128 +-0.141567 0.267059 -0.046775 +0.0439229 0.281338 -0.041397 +-0.18714 0.308984 -0.0675261 +0.346945 0.306005 -0.113439 +-0.260093 0.377862 -0.111422 diff --git a/image_analysis/indexing/fast-feedback-indexer/data/image5_peakfinder8.txt b/image_analysis/indexing/fast-feedback-indexer/data/image5_peakfinder8.txt new file mode 100644 index 000000000..f69006201 --- /dev/null +++ b/image_analysis/indexing/fast-feedback-indexer/data/image5_peakfinder8.txt @@ -0,0 +1,842 @@ +36.9 0 0 4.83429e-15 78.95 0 4.83429e-15 4.83429e-15 78.95 +0.117311 -0.740658 -0.338438 +0.192181 -0.728937 -0.342948 +-0.342825 -0.695689 -0.368741 +-0.011407 -0.736308 -0.323449 +0.209535 -0.711325 -0.329097 +0.34382 -0.663824 -0.335828 +0.281665 -0.667945 -0.31115 +-0.423685 -0.62621 -0.345514 +0.143427 -0.682519 -0.283344 +-0.355498 -0.64017 -0.318969 +-0.220902 -0.663422 -0.285106 +0.334357 -0.640763 -0.308894 +0.128011 -0.665107 -0.264305 +0.309979 -0.636577 -0.293825 +-0.130635 -0.649904 -0.251295 +0.146007 -0.646544 -0.251226 +0.441774 -0.582814 -0.317971 +-0.318621 -0.610922 -0.275255 +-0.414715 -0.585654 -0.303565 +-0.0151571 -0.640792 -0.232435 +-0.23958 -0.611581 -0.245964 +-0.174499 -0.620669 -0.235592 +0.576724 -0.513676 -0.364762 +0.285964 -0.594547 -0.248509 +-0.195028 -0.605117 -0.228121 +-0.0897181 -0.610937 -0.213421 +0.1163 -0.609446 -0.215749 +-0.453114 -0.546128 -0.295421 +-0.0508405 -0.607853 -0.20758 +0.191214 -0.597066 -0.22093 +0.557294 -0.504759 -0.340726 +-0.215843 -0.590109 -0.222065 +-0.149594 -0.598096 -0.212661 +0.485683 -0.528064 -0.303394 +0.0689161 -0.588856 -0.194705 +-0.0341467 -0.589528 -0.192974 +-0.457227 -0.513569 -0.273922 +-0.154112 -0.566547 -0.19051 +-0.220165 -0.557774 -0.199741 +-0.0168481 -0.571728 -0.17973 +0.230872 -0.552391 -0.199024 +0.129499 -0.558706 -0.180807 +-0.508159 -0.48164 -0.285999 +-0.174789 -0.550927 -0.183956 +0.0645441 -0.557761 -0.172512 +-0.571917 -0.457384 -0.319037 +0.346761 -0.521905 -0.220659 +0.0327105 -0.555402 -0.169061 +0.215627 -0.533214 -0.181961 +0.321243 -0.517055 -0.206617 +0.357914 -0.508264 -0.216696 +-0.427503 -0.488363 -0.239248 +-0.0209495 -0.539107 -0.158024 +-0.358941 -0.502387 -0.213382 +-0.223952 -0.524954 -0.178861 +0.295134 -0.511825 -0.193197 +0.332667 -0.503527 -0.202633 +0.369154 -0.494771 -0.213281 +-0.123114 -0.497589 -0.141368 +0.224075 -0.487921 -0.156363 +0.329735 -0.470829 -0.181712 +-0.0845021 -0.495023 -0.135239 +0.46918 -0.439581 -0.234076 +0.122563 -0.493301 -0.138819 +0.366188 -0.462051 -0.192278 +0.0905142 -0.49248 -0.134396 +0.05829 -0.491315 -0.130971 +0.165774 -0.480799 -0.138983 +0.303109 -0.46535 -0.168391 +0.340483 -0.457034 -0.178299 +0.377109 -0.448075 -0.189434 +-0.346186 -0.4521 -0.177954 +-0.238887 -0.463805 -0.146878 +0.35069 -0.442838 -0.174827 +0.455609 -0.421286 -0.21582 +0.21953 -0.454312 -0.13663 +-0.155015 -0.454043 -0.122609 +-0.0165419 -0.460762 -0.112631 +-0.221498 -0.445894 -0.132753 +-0.356715 -0.423293 -0.167187 +0.23038 -0.440376 -0.132248 +-0.425278 -0.409371 -0.192811 +-0.0777702 -0.448871 -0.109794 +0.128745 -0.446888 -0.114723 +-0.24938 -0.434747 -0.134665 +0.50611 -0.388514 -0.229994 +0.0973007 -0.446226 -0.110385 +0.440989 -0.402812 -0.197958 +-0.27721 -0.423699 -0.137658 +0.140635 -0.433441 -0.109859 +0.241574 -0.426721 -0.128478 +-0.51747 -0.37463 -0.230664 +-0.0985062 -0.434 -0.104489 +-0.515996 -0.373312 -0.229035 +-0.0285998 -0.433332 -0.0992194 +0.012738 -0.434316 -0.0993296 +0.0758751 -0.432224 -0.101431 +-0.000863518 -0.433768 -0.0989758 +0.0438818 -0.430044 -0.0982594 +-0.231913 -0.416963 -0.121161 +0.252472 -0.413043 -0.124984 +0.151439 -0.420869 -0.105609 +-0.260005 -0.406511 -0.124131 +-0.0471907 -0.416747 -0.0922035 +0.0226724 -0.415253 -0.0905765 +0.194524 -0.406949 -0.107502 +0.263299 -0.399251 -0.121779 +-0.287874 -0.395146 -0.127654 +-0.148073 -0.407793 -0.0990123 +0.162234 -0.407414 -0.101282 +0.300521 -0.391627 -0.130336 +-0.109112 -0.405146 -0.0922824 +-0.176527 -0.398379 -0.0999264 +-0.49306 -0.352034 -0.20441 +-0.349749 -0.376863 -0.142299 +0.374274 -0.374338 -0.151596 +0.205336 -0.393213 -0.103774 +-0.242418 -0.389176 -0.111307 +-0.452805 -0.355915 -0.182509 +0.00124605 -0.40067 -0.0837783 +0.477184 -0.351166 -0.194408 +-0.41847 -0.362913 -0.167427 +0.409862 -0.364463 -0.16383 +0.311658 -0.377167 -0.127868 +-0.556903 -0.328176 -0.237006 +0.348583 -0.368609 -0.138248 +-0.060358 -0.38968 -0.0810298 +0.0112557 -0.38751 -0.0782034 +0.32159 -0.363128 -0.125519 +-0.332566 -0.358994 -0.12792 +-0.119564 -0.376505 -0.0813334 +-0.580206 -0.307416 -0.245774 +-0.18629 -0.367838 -0.0889615 +-0.4695 -0.330637 -0.181313 +0.461612 -0.332004 -0.17739 +-0.00925452 -0.37167 -0.0716812 +0.194554 -0.365826 -0.0898792 +0.43731 -0.327479 -0.162434 +-0.315117 -0.341557 -0.11454 +-0.0705881 -0.360139 -0.0697758 +0.000311113 -0.359292 -0.0667748 +0.275581 -0.343717 -0.102273 +0.411879 -0.322664 -0.147801 +-0.106699 -0.351076 -0.0697521 +-0.269962 -0.33493 -0.0972583 +0.217387 -0.337493 -0.0841172 +-0.0195503 -0.343321 -0.0609855 +0.285618 -0.329422 -0.100054 +0.385981 -0.31745 -0.133834 +-0.157905 -0.33627 -0.0715666 +-0.298024 -0.324148 -0.102164 +0.322893 -0.320886 -0.109622 +0.519732 -0.290383 -0.196535 +-0.0576849 -0.334823 -0.0594863 +0.359185 -0.311991 -0.120427 +-0.080219 -0.331169 -0.0598448 +0.22774 -0.323134 -0.0814583 +-0.509818 -0.285056 -0.188317 +-0.00939019 -0.329854 -0.0560147 +-0.469023 -0.288158 -0.165145 +-0.39433 -0.298401 -0.130827 +-0.0489171 -0.324119 -0.0552494 +-0.0698507 -0.317055 -0.0541685 +-0.0347296 -0.318837 -0.0528268 +-0.175536 -0.312072 -0.0662986 +0.00172171 -0.316196 -0.0513076 +0.438223 -0.285105 -0.147547 +-0.314566 -0.298731 -0.0989962 +0.206472 -0.309727 -0.0718629 +-0.0754158 -0.313339 -0.0533578 +0.27626 -0.301459 -0.0874195 +0.503394 -0.271146 -0.179589 +0.412511 -0.280254 -0.133229 +-0.452848 -0.270717 -0.150506 +-0.26918 -0.292082 -0.082269 +-0.0586152 -0.303944 -0.0491149 +0.349528 -0.284175 -0.107209 +0.217547 -0.294969 -0.0695879 +-0.0189762 -0.30096 -0.0465522 +0.00858219 -0.301027 -0.046423 +0.285981 -0.287117 -0.0857908 +-0.157448 -0.294016 -0.0572569 +0.386118 -0.274916 -0.119469 +-0.179302 -0.292769 -0.0607784 +-0.11857 -0.290872 -0.0506135 +0.323119 -0.278355 -0.0955042 +0.610673 -0.233623 -0.243363 +-0.332614 -0.274387 -0.0977363 +-0.0487274 -0.29114 -0.0445613 +0.384334 -0.269487 -0.117014 +0.551229 -0.243238 -0.201888 +0.519465 -0.247909 -0.182261 +-0.185701 -0.282943 -0.0590121 +0.359483 -0.269657 -0.106659 +-0.00814538 -0.286729 -0.0420229 +-0.0278039 -0.282876 -0.0412465 +-0.508966 -0.242149 -0.173975 +-0.0498272 -0.281677 -0.0417853 +0.109397 -0.278574 -0.0458362 +-0.287473 -0.267239 -0.0802487 +-0.213343 -0.271997 -0.0616491 +0.00452121 -0.279112 -0.0397521 +0.462563 -0.247317 -0.148607 +-0.468455 -0.24547 -0.151298 +-0.0687793 -0.274498 -0.0408754 +-0.0499321 -0.2747 -0.0397675 +0.00272552 -0.273263 -0.0380646 +0.207322 -0.265857 -0.0585449 +-0.31447 -0.257768 -0.0864002 +-0.240844 -0.260535 -0.0650585 +0.437368 -0.242412 -0.134006 +0.275845 -0.258405 -0.0741835 +0.595705 -0.214777 -0.226045 +-0.348885 -0.249352 -0.0966159 +0.37612 -0.246813 -0.106906 +0.565959 -0.219561 -0.205341 +-0.26472 -0.25611 -0.0703062 +-0.0588591 -0.26094 -0.036441 +0.313143 -0.249733 -0.0837171 +0.0134081 -0.259958 -0.034473 +-0.418284 -0.23517 -0.122656 +-0.451346 -0.227954 -0.137258 +-0.233991 -0.24934 -0.0602777 +-0.0988759 -0.255396 -0.0382326 +0.186189 -0.251703 -0.0502743 +0.478473 -0.223866 -0.150913 +0.153236 -0.25053 -0.0440955 +0.255425 -0.24429 -0.0645426 +-0.0475742 -0.247538 -0.0322905 +-0.33111 -0.232611 -0.0855284 +0.0245805 -0.245308 -0.0308665 +-0.258523 -0.235925 -0.0632473 +0.186674 -0.240104 -0.0473705 +0.0151935 -0.24342 -0.0301981 +-0.123524 -0.240966 -0.0373594 +0.197413 -0.237166 -0.0488006 +-0.365258 -0.22424 -0.0965051 +-0.555274 -0.200291 -0.192811 +0.579718 -0.19595 -0.209095 +-0.146527 -0.2373 -0.0396779 +0.164816 -0.236869 -0.0425405 +0.549321 -0.200538 -0.188809 +-0.399559 -0.21719 -0.109393 +0.428172 -0.213917 -0.121986 +-0.434276 -0.210543 -0.124171 +0.0667822 -0.233565 -0.029955 +-0.0501547 -0.232112 -0.0286049 +0.0358245 -0.23181 -0.0278989 +0.302502 -0.220945 -0.0728128 +0.139982 -0.229557 -0.0368236 +0.644894 -0.176818 -0.256463 +-0.320925 -0.218224 -0.0783787 +0.493629 -0.200205 -0.153685 +-0.19323 -0.224417 -0.0448564 +0.401582 -0.208684 -0.10827 +-0.134785 -0.223452 -0.0346491 +0.164574 -0.223828 -0.0393666 +0.175834 -0.222097 -0.0409613 +0.339114 -0.212203 -0.0835003 +0.300944 -0.215103 -0.0709341 +0.111019 -0.220812 -0.0310229 +0.143642 -0.221515 -0.0354803 +-0.0962914 -0.221384 -0.029579 +-0.0593688 -0.221903 -0.0267404 +-0.258758 -0.213874 -0.0580328 +-0.201782 -0.215978 -0.0446795 +0.244575 -0.214619 -0.0544199 +0.469461 -0.195403 -0.13894 +0.0788411 -0.219269 -0.0275263 +-0.538816 -0.182769 -0.177642 +0.0506988 -0.216445 -0.0250225 +-0.457569 -0.189286 -0.131207 +0.444106 -0.190356 -0.124481 +0.105457 -0.210186 -0.0280428 +-0.0849609 -0.207447 -0.0254501 +0.122714 -0.205539 -0.0290753 +-0.0144339 -0.206267 -0.0216106 +-0.337047 -0.192858 -0.0784767 +-0.191049 -0.201455 -0.0393147 +0.223862 -0.200408 -0.0462062 +0.508749 -0.176709 -0.157416 +0.540825 -0.172086 -0.176656 +-0.157216 -0.201341 -0.0331779 +-0.112774 -0.197112 -0.0261269 +0.484367 -0.171791 -0.142168 +-0.218334 -0.19025 -0.0428504 +0.391045 -0.179862 -0.0973739 +-0.561465 -0.161506 -0.188413 +-0.291882 -0.186116 -0.0618286 +-0.0741451 -0.193634 -0.0217319 +0.32878 -0.183648 -0.0736215 +-0.00278089 -0.19199 -0.0186072 +-0.439567 -0.171201 -0.118257 +0.664387 -0.143375 -0.266493 +0.202458 -0.185422 -0.0384235 +0.459446 -0.166635 -0.127565 +0.271002 -0.177373 -0.0539045 +-0.208152 -0.176187 -0.0379028 +-0.0630669 -0.179842 -0.0183283 +-0.591516 -0.144865 -0.206828 +0.433614 -0.161607 -0.113512 +0.30853 -0.168874 -0.0638959 +0.584571 -0.14353 -0.201454 +-0.388611 -0.161591 -0.0928783 +0.181121 -0.170179 -0.0313751 +-0.235492 -0.165716 -0.0423563 +0.406823 -0.156493 -0.0999975 +-0.30909 -0.162133 -0.0628895 +0.344654 -0.160098 -0.075023 +0.498797 -0.148072 -0.146023 +0.250399 -0.162864 -0.0456544 +-0.19613 -0.163479 -0.0331456 +0.0513301 -0.165948 -0.0152024 +-0.225753 -0.160751 -0.0391699 +-0.263556 -0.158895 -0.0485325 +-0.199179 -0.159537 -0.0331103 +0.47399 -0.143191 -0.13119 +0.242826 -0.157387 -0.0427826 +0.127263 -0.153838 -0.0201337 +-0.297986 -0.147377 -0.0568753 +0.206519 -0.150892 -0.0332624 +0.448325 -0.137998 -0.116846 +-0.411939 -0.139789 -0.099575 +0.0948347 -0.152763 -0.0162978 +0.229022 -0.147948 -0.0378877 +0.42213 -0.132875 -0.103256 +-0.527211 -0.12625 -0.159697 +0.210268 -0.144703 -0.0331244 +0.360927 -0.136575 -0.0774606 +-0.252554 -0.141132 -0.0427652 +-0.295598 -0.136453 -0.0544831 +-0.214383 -0.138269 -0.0330865 +-0.0695676 -0.140532 -0.012371 +0.574819 -0.115042 -0.189846 +0.604392 -0.110485 -0.211011 +-0.193696 -0.135069 -0.0282808 +0.207564 -0.132706 -0.0308218 +-0.241528 -0.127144 -0.0379718 +0.173462 -0.129891 -0.0237627 +0.275989 -0.125192 -0.0470273 +0.462707 -0.114233 -0.12088 +0.313639 -0.120558 -0.058142 +-0.348591 -0.115158 -0.0698265 +0.639916 -0.0960645 -0.237584 +0.312383 -0.116402 -0.0572022 +0.376394 -0.113017 -0.0804595 +0.436475 -0.109165 -0.106931 +-0.270539 -0.115002 -0.0441846 +0.185853 -0.117454 -0.0244677 +0.153983 -0.11681 -0.0188555 +-0.382911 -0.108136 -0.0825657 +-0.230161 -0.112956 -0.0334253 +-0.303298 -0.108498 -0.0533014 +0.254751 -0.110576 -0.0393361 +-0.417785 -0.101458 -0.0971367 +-0.253222 -0.105816 -0.0383965 +0.291635 -0.101466 -0.048867 +-0.219386 -0.0991733 -0.0294154 +0.417864 -0.0944015 -0.0964081 +-0.0750524 -0.101854 -0.00803585 +-0.00354433 -0.100796 -0.00509919 +0.0272189 -0.100762 -0.00546188 +-0.292911 -0.0947684 -0.0485685 +0.509272 -0.0862567 -0.143728 +0.328004 -0.0927842 -0.0598911 +0.391176 -0.0892835 -0.0840254 +0.201062 -0.0945752 -0.0249977 +0.540805 -0.0812102 -0.162782 +0.484738 -0.0808811 -0.129088 +-0.440494 -0.079949 -0.105811 +0.27045 -0.0864286 -0.0411534 +-0.608994 -0.0710984 -0.210018 +-0.211577 -0.0866427 -0.0264866 +-0.208676 -0.0852566 -0.0257384 +-0.482524 -0.0766186 -0.127475 +-0.562225 -0.0702085 -0.176001 +-0.0952667 -0.0849831 -0.00818241 +0.458945 -0.0758898 -0.114783 +0.30741 -0.0777965 -0.0516084 +0.179808 -0.0793334 -0.0195025 +0.370608 -0.0743732 -0.074193 +0.148036 -0.0781054 -0.014107 +-0.23632 -0.0746935 -0.0311999 +-0.0915883 -0.0770921 -0.00719166 +0.432473 -0.0709458 -0.101149 +0.115427 -0.07708 -0.00967925 +-0.645965 -0.0582338 -0.238857 +-0.244025 -0.0737965 -0.0330429 +0.0833529 -0.0759063 -0.00637506 +-0.270103 -0.0711055 -0.0397978 +-0.309477 -0.0700147 -0.0516742 +0.24878 -0.0716285 -0.0340921 +-0.344535 -0.0689694 -0.0637635 +-0.197332 -0.0718246 -0.0222979 +-0.00398926 -0.0731364 -0.00268603 +0.322258 -0.0692352 -0.0558835 +-0.31335 -0.0691396 -0.0528826 +-0.401172 -0.0329547 -0.0845903 +-0.237227 -0.034271 -0.0291505 +0.243263 -0.0345593 -0.0306556 +0.27628 -0.0342428 -0.0395332 +0.426796 -0.0316328 -0.0962054 +-0.357321 -0.0279402 -0.0664365 +-0.276928 -0.0292604 -0.039555 +0.399105 -0.0269172 -0.0834899 +-0.476181 -0.0245431 -0.120995 +-0.516854 -0.021403 -0.144194 +0.114211 -0.0251943 -0.00686298 +0.547876 -0.0192358 -0.163662 +-0.390738 -0.0209097 -0.0797355 +-0.311173 -0.021405 -0.049888 +0.491416 -0.0186336 -0.129274 +0.229701 -0.0181814 -0.0269085 +0.189297 -0.016363 -0.0182165 +0.523872 -0.0138275 -0.148315 +0.31563 -0.0150141 -0.0512364 +0.465419 -0.0132749 -0.115009 +0.378648 -0.0117666 -0.074534 +0.226667 -0.00792218 -0.0260598 +0.273807 -0.00769403 -0.0382462 +0.227504 -0.00292132 -0.0262273 +0.472595 -0.003386 -0.118727 +0.447016 0.0017339 -0.105476 +0.358562 0.00328594 -0.0664999 +0.204645 0.00699219 -0.0211888 +0.41987 0.00646272 -0.0924389 +0.172784 0.00864993 -0.0150783 +-0.576789 0.0124298 -0.183201 +-0.622848 0.0117338 -0.217745 +-0.16563 0.0186814 -0.0139889 +-0.277783 0.0202203 -0.0395688 +0.337246 0.0182888 -0.0587609 +0.399886 0.0218646 -0.0836961 +0.278999 0.0248587 -0.0400304 +-0.478052 0.0238911 -0.121993 +0.516997 0.0246422 -0.144368 +0.0618535 0.0299291 -0.00236359 +-0.115904 0.0317681 -0.00724772 +-0.658504 0.0247395 -0.24783 +0.188465 0.0322553 -0.01845 +-0.267265 0.0337812 -0.0369691 +0.315863 0.0331999 -0.0517764 +0.491994 0.0296209 -0.129905 +-0.0449266 0.0364439 -0.00167468 +0.548795 0.0294163 -0.164561 +-0.425652 0.0348414 -0.0957842 +0.256741 0.0395636 -0.0343298 +0.466057 0.0346371 -0.115923 +0.293346 0.0479933 -0.045199 +-0.256194 0.0474563 -0.0345403 +-0.415323 0.0485519 -0.0916224 +-0.548843 0.0442198 -0.165245 +-0.290529 0.0547911 -0.0447039 +0.20342 0.0557111 -0.0224947 +-0.100269 0.0586823 -0.0067717 +0.20422 0.0592791 -0.0228714 +-0.206261 0.0642948 -0.0236176 +-0.404479 0.0624326 -0.0875864 +-0.167052 0.0673157 -0.0163526 +-0.279129 0.068913 -0.0422224 +-0.128318 0.0700231 -0.0107421 +0.336013 0.0668863 -0.0605206 +-0.577645 0.0611612 -0.186006 +0.278338 0.0734343 -0.0423281 +0.398792 0.0703738 -0.0856627 +-0.438897 0.0689832 -0.104115 +-0.262277 0.0779092 -0.0381575 +0.540614 0.0677696 -0.161463 +0.218165 0.0796132 -0.027341 +0.187078 0.0806778 -0.0209734 +-0.478936 0.0727629 -0.125171 +-0.393826 0.0763929 -0.083995 +0.0576385 0.0854942 -0.00532993 +-0.2685 0.0824467 -0.0402551 +-0.2374 0.0833543 -0.0321709 +0.314197 0.0814764 -0.0541448 +0.516028 0.072613 -0.146512 +-0.228854 0.0852473 -0.0302791 +0.490701 0.0781039 -0.132179 +0.255087 0.0880095 -0.0370956 +0.377397 0.0854603 -0.0779002 +0.547222 0.0776778 -0.166625 +-0.302436 0.0897793 -0.0510678 +0.4645 0.0830436 -0.118329 +-0.468506 0.0865753 -0.120792 +-0.382501 0.0900997 -0.0804483 +-0.218599 0.0991132 -0.0292317 +-0.337127 0.0968654 -0.0635371 +-0.179462 0.101923 -0.0215293 +-0.416958 0.0967132 -0.0962341 +-0.140492 0.104781 -0.0154783 +0.356081 0.100283 -0.0709417 +0.170284 0.105606 -0.0202803 +0.0727674 0.109102 -0.00863651 +0.249601 0.106707 -0.0375485 +0.444491 0.098603 -0.10966 +-0.37119 0.103994 -0.077285 +0.29448 0.10672 -0.0503199 +0.298028 0.106725 -0.0514279 +-0.457944 0.100489 -0.116717 +0.416963 0.103199 -0.0969541 +-0.325683 0.110846 -0.0610413 +0.238664 0.112833 -0.0354751 +0.0128042 0.121696 -0.00751521 +0.333565 0.115072 -0.0643224 +-0.280159 0.117788 -0.0473001 +-0.241752 0.120147 -0.0371289 +0.275312 0.121288 -0.0463268 +0.423359 0.113993 -0.101238 +-0.538548 0.106502 -0.164163 +-0.360509 0.117871 -0.0747219 +-0.145477 0.127911 -0.0189418 +0.395764 0.118462 -0.0893203 +-0.315176 0.124561 -0.0591765 +-0.0859254 0.131311 -0.0123896 +0.120494 0.131575 -0.0160441 +0.153429 0.130509 -0.0204967 +-0.631855 0.10489 -0.232043 +-0.230738 0.134143 -0.0362751 +-0.191925 0.136991 -0.0281985 +-0.152832 0.139753 -0.0216792 +0.166254 0.13959 -0.0238472 +0.221693 0.137567 -0.0346361 +0.402146 0.128991 -0.0935563 +0.374197 0.133228 -0.082271 +0.0284823 0.145378 -0.0110339 +-0.265288 0.14107 -0.0462068 +0.31792 0.140312 -0.0623222 +0.25874 0.146206 -0.0451819 +0.226917 0.146653 -0.0371908 +0.380836 0.144109 -0.0866562 +-0.424887 0.141968 -0.105955 +0.493866 0.136348 -0.141218 +0.467438 0.141396 -0.127355 +-0.253952 0.155307 -0.0453337 +-0.21531 0.157662 -0.0362653 +0.549886 0.135634 -0.175847 +-0.137099 0.164512 -0.0231993 +0.173522 0.164068 -0.0289326 +0.20601 0.163622 -0.0352267 +-0.0981228 0.166523 -0.0188568 +0.076348 0.167782 -0.0171368 +0.358736 0.158316 -0.0800846 +-0.288283 0.162181 -0.0562892 +-0.413296 0.155767 -0.102825 +-0.60347 0.136494 -0.214383 +0.473494 0.151883 -0.132397 +0.301249 0.165427 -0.0609138 +-0.657778 0.131797 -0.258409 +-0.20357 0.172101 -0.0361844 +0.446963 0.15656 -0.119254 +0.214982 0.173011 -0.0388288 +0.241949 0.171199 -0.0449336 +-0.322854 0.169147 -0.0687885 +-0.546658 0.151174 -0.176403 +0.0160924 0.180323 -0.0165242 +0.274155 0.175521 -0.0544675 +-0.277264 0.175955 -0.0554555 +-0.238812 0.178519 -0.0454846 +-0.402794 0.169785 -0.100595 +0.425755 0.171504 -0.111564 +-0.356764 0.176468 -0.0826243 +-0.0827123 0.190206 -0.0217463 +-0.0119831 0.190747 -0.018434 +-0.311703 0.183239 -0.0676562 +0.342484 0.183675 -0.0786054 +-0.535738 0.16504 -0.171902 +-0.188444 0.195676 -0.0376073 +0.28432 0.190134 -0.0603133 +-0.226952 0.193043 -0.0454177 +0.590069 0.160417 -0.208744 +-0.149363 0.198566 -0.0313605 +0.193328 0.197312 -0.0389111 +-0.0398953 0.201903 -0.0214074 +-0.345927 0.190118 -0.0812022 +0.0639113 0.202458 -0.0227969 +0.403985 0.186374 -0.104421 +-0.261699 0.199735 -0.055744 +-0.432679 0.186629 -0.117981 +0.617559 0.16459 -0.230889 +0.230593 0.206364 -0.0490842 +-0.0666533 0.213919 -0.0254253 +-0.296938 0.206505 -0.0676997 +0.410017 0.197245 -0.109505 +-0.421024 0.200407 -0.115367 +-0.17273 0.219033 -0.0396934 +0.325754 0.208569 -0.0778376 +-0.211962 0.216727 -0.0470563 +0.266788 0.214367 -0.0603878 +-0.133799 0.22233 -0.0342529 +-0.330803 0.213681 -0.0808103 +0.387924 0.211539 -0.102912 +-0.285198 0.220773 -0.0673041 +-0.410486 0.214202 -0.113649 +0.148787 0.232801 -0.0389243 +0.181311 0.2323 -0.0444043 +0.211856 0.230821 -0.0503482 +-0.364345 0.221062 -0.0953539 +-0.0504527 0.236817 -0.0297566 +0.0522886 0.237575 -0.0300391 +-0.31912 0.227896 -0.0800944 +-0.0497618 0.240453 -0.0306157 +-0.451241 0.217473 -0.134502 +-0.196029 0.240025 -0.0492316 +-0.157181 0.242696 -0.042716 +0.308191 0.232739 -0.0775842 +-0.234666 0.238229 -0.0575676 +0.218234 0.240921 -0.0543092 +-0.117824 0.246187 -0.0379659 +0.0238027 0.248296 -0.0316083 +0.121795 0.245294 -0.0382325 +-0.0501088 0.247553 -0.0324224 +0.165576 0.245437 -0.0448323 +-0.145631 0.247768 -0.0421887 +-0.0595064 0.250547 -0.0337261 +-0.269259 0.244351 -0.0684464 +0.370935 0.236323 -0.101914 +-0.439249 0.231208 -0.131897 +0.25502 0.249397 -0.0657806 +-0.589517 0.208799 -0.219697 +-0.0750042 0.258018 -0.0367756 +-0.00403028 0.25913 -0.034166 +0.510575 0.223777 -0.169797 +0.457811 0.234159 -0.142341 +-0.303946 0.251512 -0.0811103 +-0.126552 0.261596 -0.0431551 +0.233528 0.256662 -0.0621359 +-0.480513 0.23435 -0.154904 +-0.180457 0.263758 -0.0524415 +0.104077 0.269197 -0.0425549 +-0.141528 0.267056 -0.0467681 +0.136514 0.26815 -0.046344 +0.168126 0.266512 -0.0509453 +-0.0314541 0.271008 -0.0379369 +-0.383198 0.251818 -0.111323 +-0.579178 0.222648 -0.215793 +0.489823 0.239147 -0.161619 +-0.337792 0.258621 -0.0950075 +0.46342 0.244012 -0.14812 +-0.25414 0.26792 -0.0706821 +-0.0941467 0.275008 -0.0431788 +0.353756 0.260909 -0.101789 +0.0438654 0.281475 -0.0414347 +0.205719 0.275323 -0.0609171 +0.296186 0.267608 -0.0831248 +-0.469809 0.248417 -0.152906 +0.56965 0.232655 -0.21173 +-0.0495002 0.285486 -0.0428963 +0.495082 0.249691 -0.167805 +0.468843 0.254376 -0.15414 +0.441647 0.258925 -0.140985 +-0.164863 0.288048 -0.056682 +0.359514 0.271756 -0.107308 +0.0160637 0.292652 -0.0439159 +0.241865 0.283636 -0.0720711 +-0.413787 0.268827 -0.130223 +-0.0492712 0.296042 -0.0460966 +-0.238753 0.291697 -0.0737657 +0.447111 0.269034 -0.146939 +-0.0116194 0.304148 -0.047446 +0.186889 0.298274 -0.063995 +-0.603352 0.249415 -0.242532 +0.341131 0.295623 -0.107679 +-0.187091 0.309113 -0.0675592 +0.0960246 0.313624 -0.0553207 +0.128742 0.312545 -0.0588619 +0.160629 0.311166 -0.0633176 +0.282974 0.301981 -0.0896524 +0.0650908 0.315789 -0.0534058 +-0.110714 0.314646 -0.0572697 +0.151349 0.314412 -0.0628561 +-0.443153 0.285824 -0.150341 +-0.14841 0.31468 -0.0624761 +-0.092796 0.318555 -0.0566487 +-0.114658 0.320667 -0.0597733 +-0.222667 0.315394 -0.0775328 +0.583493 0.262354 -0.231426 +-0.656194 0.244185 -0.286009 +-0.18471 0.31832 -0.0701856 +-0.145311 0.320826 -0.0640751 +-0.105325 0.324374 -0.059953 +0.346923 0.306018 -0.113435 +0.430032 0.293716 -0.1463 +0.457114 0.289798 -0.159129 +-0.592555 0.263175 -0.238674 +0.131065 0.323551 -0.0629106 +-0.534269 0.278002 -0.201707 +-0.48401 0.289111 -0.174077 +-0.38667 0.30629 -0.130131 +-0.341215 0.313054 -0.113677 +-0.295377 0.320577 -0.100009 +0.0410768 0.336768 -0.0593086 +0.435111 0.303807 -0.152427 +-0.0617105 0.337183 -0.0605855 +0.233853 0.328079 -0.0847529 +-0.581401 0.276914 -0.234957 +0.15236 0.337188 -0.0709733 +-0.291952 0.329865 -0.102251 +0.0127871 0.347145 -0.0622759 +-0.206732 0.339997 -0.0825775 +-0.167962 0.342592 -0.0756516 +0.239962 0.338879 -0.0902861 +0.411999 0.318287 -0.146214 +-0.415994 0.323034 -0.149942 +-0.241555 0.346158 -0.093454 +-0.0148135 0.358574 -0.0666164 +-0.279366 0.344443 -0.103722 +0.333146 0.33995 -0.120541 +-0.457668 0.326424 -0.172965 +-0.276174 0.353368 -0.106211 +0.0932095 0.368453 -0.0750384 +0.125395 0.36688 -0.0782217 +0.157365 0.365432 -0.08256 +0.279895 0.356287 -0.10853 +0.422083 0.33809 -0.158845 +-0.401149 0.346891 -0.152211 +-0.356186 0.353715 -0.13512 +-0.309663 0.360345 -0.120079 +-0.186611 0.372519 -0.0909314 +-0.0381522 0.379078 -0.0754219 +0.0653261 0.379254 -0.0770164 +0.0974694 0.378484 -0.0795383 +-0.446123 0.3406 -0.172373 +-0.147871 0.376192 -0.0853341 +0.194148 0.373987 -0.0931153 +0.162669 0.376337 -0.0879093 +0.285399 0.366584 -0.11447 +0.343499 0.359986 -0.132579 +0.426675 0.34774 -0.165119 +0.556762 0.322858 -0.234638 +-0.104689 0.387857 -0.0842448 +-0.260041 0.377337 -0.111183 +0.0373189 0.390178 -0.080017 +0.199691 0.3848 -0.0988602 +0.348475 0.37037 -0.13896 +-0.0609316 0.400987 -0.085945 +0.560904 0.332272 -0.241724 +-0.385833 0.370626 -0.155152 +0.352844 0.380246 -0.145065 +0.435806 0.367502 -0.178407 +0.462615 0.363155 -0.191232 +0.0142126 0.411553 -0.0887248 +-0.166368 0.407008 -0.101854 +0.5649 0.341457 -0.248804 +0.440209 0.377155 -0.185156 +-0.123468 0.418721 -0.100318 +-0.239567 0.410351 -0.120102 +-0.323719 0.400905 -0.142981 +-0.414043 0.387315 -0.176255 +0.245551 0.412729 -0.122868 +0.362195 0.40031 -0.158236 +-0.0140734 0.430323 -0.0974348 +-0.0797488 0.429158 -0.100298 +-0.00916123 0.430511 -0.0974612 +-0.0308471 0.456929 -0.111032 +0.135964 0.45299 -0.118913 +0.16793 0.450945 -0.123388 +0.505011 0.396746 -0.233478 +-0.611452 0.36511 -0.297988 +-0.439306 0.414994 -0.203263 +0.530303 0.391172 -0.247828 +-0.138295 0.459797 -0.122811 +-0.0278486 0.464518 -0.114874 +-0.215746 0.454312 -0.135677 +0.140384 0.461751 -0.12417 +0.172044 0.459969 -0.128892 +0.37971 0.439455 -0.185936 +0.0802459 0.47411 -0.123199 +0.112665 0.473603 -0.126497 +-0.249944 0.46144 -0.148765 +0.145239 0.472337 -0.130631 +0.176974 0.469885 -0.135195 +-0.333406 0.451967 -0.172615 +-0.379094 0.445365 -0.188867 +0.38367 0.448619 -0.192821 +0.0848817 0.48475 -0.129476 +0.181753 0.479878 -0.141698 +-0.283333 0.468462 -0.163181 +-0.0450438 0.495285 -0.132438 +0.0569586 0.494765 -0.132842 +0.387388 0.458076 -0.199939 +0.186402 0.489751 -0.148297 +-0.0417345 0.504906 -0.137835 +-0.190402 0.497631 -0.153767 +0.190843 0.499375 -0.154895 +-0.358864 0.47891 -0.198837 +-0.403345 0.471922 -0.216034 +-0.147464 0.510254 -0.152713 +-0.1866 0.507736 -0.158939 +-0.107332 0.514014 -0.14896 +0.195242 0.509021 -0.161681 +0.423118 0.472721 -0.227015 +-0.103643 0.52231 -0.153566 +0.0708776 0.52523 -0.151997 +0.343693 0.494303 -0.201539 +-0.626229 0.411467 -0.337782 +0.199512 0.518639 -0.168611 +0.289813 0.510524 -0.190449 +-0.0994878 0.532591 -0.159495 +-0.254231 0.521617 -0.185578 +0.172781 0.531455 -0.170722 +0.508728 0.475947 -0.282595 +-0.334076 0.52216 -0.215307 +0.0517184 0.554916 -0.169702 +0.0845663 0.554563 -0.172167 +0.181186 0.549387 -0.184313 +0.149547 0.552413 -0.179954 +0.383259 0.518472 -0.235605 +-0.283858 0.539848 -0.207543 +0.153909 0.561094 -0.186682 +0.185008 0.558765 -0.191573 +-0.420044 0.518694 -0.255339 +-0.526385 0.487007 -0.303047 +0.126086 0.572201 -0.189637 +0.0977696 0.58248 -0.193056 +0.130121 0.581162 -0.196682 +0.444833 0.528025 -0.276596 +-0.455745 0.531732 -0.286167 +0.369648 0.559077 -0.257845 +0.257765 0.582156 -0.228864 +-0.34975 0.568558 -0.255409 +-0.394064 0.561174 -0.272128 +-0.299232 0.58437 -0.245698 +-0.390643 0.57166 -0.278472 +-0.295038 0.594864 -0.252277 +0.0173516 0.631328 -0.224678 +0.297665 0.606199 -0.262492 +0.211623 0.62411 -0.247868 +-0.286374 0.6143 -0.264727 +-0.28191 0.624491 -0.27162 +0.0586202 0.649391 -0.241808 +0.0917502 0.649229 -0.244961 +0.186893 0.643603 -0.25781 +0.127875 0.656441 -0.25654 +0.277094 0.63574 -0.279547 +-0.27243 0.643969 -0.285098 +0.00180377 0.677388 -0.264377 +-0.0691529 0.676413 -0.266731 +-0.116447 0.677061 -0.273344 +0.140449 0.692626 -0.292509 +-0.0227118 0.704095 -0.290258 diff --git a/image_analysis/indexing/fast-feedback-indexer/data/image5_radial.txt b/image_analysis/indexing/fast-feedback-indexer/data/image5_radial.txt new file mode 100644 index 000000000..20bc8fb21 --- /dev/null +++ b/image_analysis/indexing/fast-feedback-indexer/data/image5_radial.txt @@ -0,0 +1,648 @@ +36.9 0 0 4.83429e-15 78.95 0 4.83429e-15 4.83429e-15 78.95 +0.0802526 0.474107 -0.123198 +0.140384 0.461751 -0.12417 +-0.0979835 0.463497 -0.119336 +-0.0278541 0.464536 -0.114884 +-0.13834 0.459694 -0.122764 +-0.0979299 0.46048 -0.117748 +0.135958 0.453001 -0.118918 +0.168071 0.450962 -0.123424 +-0.0308835 0.457029 -0.111085 +-0.00915701 0.430482 -0.0974473 +-0.079677 0.42916 -0.100293 +-0.0140733 0.430323 -0.0974348 +0.245558 0.412691 -0.122853 +-0.0120787 0.423309 -0.0940952 +-0.230397 0.41175 -0.118309 +-0.239567 0.410351 -0.120102 +-0.123421 0.41871 -0.100306 +0.240423 0.402199 -0.116579 +-0.166377 0.407117 -0.101905 +-0.243197 0.401224 -0.116895 +0.0142127 0.411553 -0.0887248 +-0.0558678 0.409501 -0.0894026 +0.0532847 0.406209 -0.0877745 +-0.0609685 0.400927 -0.0859209 +-0.0296083 0.398175 -0.0831683 +0.199691 0.3848 -0.0988602 +0.0933961 0.390982 -0.0843524 +0.0373385 0.390183 -0.0800199 +-0.26011 0.377462 -0.111256 +-0.225289 0.381607 -0.103551 +-0.0564093 0.389983 -0.0809072 +-0.104694 0.387877 -0.0842542 +0.285372 0.366596 -0.114466 +0.194177 0.373975 -0.0931163 +0.12893 0.379409 -0.0837983 +0.162669 0.376337 -0.0879093 +0.11842 0.378517 -0.0820122 +-0.0381505 0.379078 -0.0754219 +0.0653151 0.379278 -0.0770256 +-0.14786 0.375938 -0.085228 +-0.309663 0.360345 -0.120079 +0.0972648 0.378474 -0.0795125 +-0.186618 0.372506 -0.0909274 +-0.0795104 0.373967 -0.0759726 +0.125378 0.366914 -0.0782332 +0.0994022 0.371143 -0.0767598 +0.064143 0.371006 -0.0735875 +0.279895 0.356287 -0.10853 +0.157356 0.365435 -0.0825598 +0.093205 0.368441 -0.0750328 +-0.276173 0.353516 -0.106269 +0.0998997 0.366607 -0.0750031 +0.0687106 0.375289 -0.0756424 +0.333146 0.33995 -0.120541 +0.00122406 0.360865 -0.0673826 +0.0870123 0.359816 -0.0710429 +-0.14113 0.45292 -0.11969 +-0.014841 0.358693 -0.0666624 +-0.0729879 0.358095 -0.069172 +-0.279366 0.344443 -0.103722 +-0.241531 0.346147 -0.0934433 +-0.171718 0.343782 -0.0767846 +0.239962 0.338879 -0.0902861 +0.121342 0.344817 -0.069206 +0.0127871 0.347145 -0.0622759 +-0.206537 0.339998 -0.0825339 +-0.167962 0.342592 -0.0756516 +-0.291918 0.330009 -0.102293 +-0.112866 0.342329 -0.0672234 +0.152171 0.337207 -0.0709491 +0.25285 0.329876 -0.0904678 +-0.0617106 0.337183 -0.0605855 +-0.138723 0.334752 -0.067961 +0.233757 0.328058 -0.084721 +0.0410769 0.336768 -0.0593086 +-0.267784 0.32295 -0.0922582 +-0.341215 0.313054 -0.113677 +-0.13907 0.329879 -0.0662766 +-0.105325 0.324374 -0.059953 +0.346919 0.306016 -0.113433 +0.0334064 0.428601 -0.0971238 +0.131065 0.323551 -0.0629106 +-0.222692 0.315387 -0.0775362 +-0.114658 0.320667 -0.0597733 +-0.250388 0.310004 -0.0828285 +-0.092796 0.318555 -0.0566487 +-0.14841 0.31468 -0.0624761 +0.160629 0.311166 -0.0633176 +0.151349 0.314412 -0.0628561 +0.0650908 0.315789 -0.0534058 +0.0960246 0.313624 -0.0553207 +-0.110714 0.314646 -0.0572697 +0.282986 0.301984 -0.0896569 +0.128742 0.312545 -0.0588619 +0.341138 0.29563 -0.107684 +-0.186775 0.309131 -0.0675016 +-0.310648 0.296651 -0.0969521 +-0.0116193 0.304148 -0.047446 +0.247584 0.29445 -0.0769607 +0.186889 0.298274 -0.063995 +-0.238793 0.291695 -0.0737755 +-0.0492712 0.296042 -0.0460967 +0.241865 0.283636 -0.0720712 +0.0160637 0.292652 -0.0439159 +-0.270784 0.283357 -0.0800084 +0.359514 0.271756 -0.107308 +-0.164863 0.288048 -0.056682 +0.205719 0.275323 -0.0609171 +0.296182 0.267612 -0.0831249 +0.0438654 0.281475 -0.0414347 +0.353744 0.260901 -0.101782 +-0.254143 0.267994 -0.0707045 +-0.0941468 0.275008 -0.0431788 +-0.33781 0.258626 -0.0950157 +-0.180457 0.263758 -0.0524415 +-0.383196 0.251822 -0.111323 +0.136514 0.26815 -0.046344 +0.104076 0.269195 -0.0425545 +-0.339755 0.255269 -0.0947906 +0.168126 0.266512 -0.0509454 +-0.0314541 0.271008 -0.0379369 +-0.141528 0.267056 -0.0467681 +-0.282017 0.259542 -0.0763635 +0.233528 0.256662 -0.0621359 +-0.126552 0.261596 -0.0431551 +-0.303885 0.251491 -0.0810843 +0.255034 0.249417 -0.0657899 +0.285368 0.248964 -0.0744828 +-0.00403029 0.25913 -0.034166 +-0.075005 0.258018 -0.0367756 +-0.274498 0.246264 -0.0704816 +0.370935 0.236323 -0.101914 +0.275552 0.244957 -0.0704478 +-0.269256 0.244352 -0.0684457 +-0.0595064 0.250547 -0.0337261 +-0.353206 0.235011 -0.0944532 +-0.157183 0.242698 -0.0427168 +0.0238027 0.248296 -0.0316083 +-0.117824 0.246187 -0.0379659 +-0.300207 0.236665 -0.0759516 +0.218234 0.240921 -0.0543092 +-0.0501088 0.247553 -0.0324224 +-0.196029 0.240025 -0.0492316 +0.308245 0.232767 -0.0776094 +0.364595 0.226189 -0.0967232 +-0.0497617 0.240453 -0.0306157 +-0.31922 0.227852 -0.0801182 +0.0522886 0.237575 -0.0300392 +-0.364345 0.22107 -0.095356 +-0.0504527 0.236817 -0.0297566 +0.211856 0.230821 -0.0503482 +0.181311 0.2323 -0.0444043 +0.148787 0.232801 -0.0389243 +-0.295377 0.320577 -0.100009 +-0.410486 0.214202 -0.113649 +-0.284948 0.220969 -0.0672741 +0.387894 0.211494 -0.102889 +-0.330766 0.213745 -0.0808117 +-0.133799 0.22233 -0.0342529 +-0.145311 0.320826 -0.0640751 +0.266788 0.214367 -0.0603878 +-0.172729 0.219036 -0.0396939 +-0.421037 0.200405 -0.115373 +0.325719 0.208545 -0.0778199 +0.381292 0.201383 -0.0977466 +0.409864 0.196973 -0.109375 +-0.296938 0.206505 -0.0676997 +-0.0666533 0.213919 -0.0254253 +0.230593 0.206364 -0.0490842 +-0.261699 0.199735 -0.055744 +-0.432679 0.186629 -0.117981 +-0.312058 0.195254 -0.0702175 +0.113419 0.343676 -0.0677861 +-0.342114 0.192822 -0.0803384 +0.403985 0.186401 -0.104427 +0.0639113 0.202458 -0.0227969 +-0.345865 0.190176 -0.0811906 +0.193329 0.197304 -0.0389094 +-0.0398953 0.201903 -0.0214074 +-0.149363 0.198565 -0.0313605 +0.28432 0.190134 -0.0603133 +-0.188471 0.195643 -0.0376059 +-0.226952 0.193043 -0.0454177 +0.342484 0.183675 -0.0786054 +-0.311703 0.183239 -0.0676562 +-0.0121204 0.190646 -0.018416 +-0.0827123 0.190206 -0.0217463 +0.425754 0.1715 -0.111562 +-0.356764 0.176468 -0.0826243 +-0.349281 0.175539 -0.0795713 +-0.402794 0.169785 -0.100595 +-0.238812 0.178519 -0.0454846 +-0.277264 0.175955 -0.0554555 +0.0491006 0.182327 -0.0179888 +0.0160924 0.180323 -0.0165242 +-0.322854 0.169147 -0.0687885 +0.214982 0.173011 -0.0388288 +0.241949 0.171199 -0.0449336 +-0.20357 0.172101 -0.0361844 +0.446816 0.156478 -0.119165 +0.301249 0.165427 -0.0609138 +-0.340178 0.163298 -0.0739261 +-0.368078 0.161759 -0.0843839 +-0.413304 0.155791 -0.102833 +0.358733 0.158309 -0.080082 +-0.288283 0.162181 -0.0562892 +0.20601 0.163622 -0.0352267 +0.0763214 0.167769 -0.0171324 +-0.0981228 0.166523 -0.0188568 +0.173522 0.164068 -0.0289326 +-0.137099 0.164512 -0.0231993 +-0.21531 0.157662 -0.0362653 +-0.253952 0.155307 -0.0453337 +-0.42474 0.14204 -0.105897 +0.380752 0.144054 -0.0866127 +0.25874 0.146206 -0.0451819 +0.31792 0.140312 -0.0623222 +0.0284822 0.145378 -0.0110339 +-0.265288 0.14107 -0.0462068 +0.374197 0.133228 -0.082271 +0.166254 0.13959 -0.0238472 +-0.152832 0.139753 -0.0216792 +0.221693 0.137567 -0.0346361 +0.402146 0.128991 -0.0935563 +-0.191925 0.136991 -0.0281985 +-0.230738 0.134143 -0.0362751 +0.120485 0.131571 -0.0160425 +-0.0859254 0.131311 -0.0123896 +0.153429 0.130509 -0.0204967 +-0.315176 0.124561 -0.0591765 +0.395827 0.118475 -0.0893493 +-0.145477 0.127911 -0.0189418 +0.275312 0.121288 -0.0463268 +-0.360489 0.11788 -0.0747153 +0.423431 0.113847 -0.101253 +-0.241752 0.120147 -0.037129 +0.333565 0.115072 -0.0643224 +0.0128042 0.121696 -0.00751521 +-0.325683 0.110846 -0.0610413 +0.238664 0.112833 -0.0354751 +0.428172 -0.213917 -0.121986 +-0.0281956 -0.432638 -0.0988731 +-0.399539 -0.217213 -0.109389 +0.248775 -0.0716418 -0.0340919 +-0.0195504 -0.343321 -0.0609855 +0.134837 -0.42946 -0.107037 +0.164784 -0.236901 -0.0425429 +-0.411893 -0.139811 -0.0995575 +-0.201781 -0.21596 -0.0446751 +-0.365295 -0.224274 -0.0965286 +0.218165 0.0796132 -0.027341 +0.40681 -0.156496 -0.0999918 +0.0151936 -0.24342 -0.0301981 +0.186674 -0.240104 -0.0473705 +-0.123524 -0.240966 -0.0373594 +-0.258523 -0.235925 -0.0632473 +-0.00814443 -0.286729 -0.042023 +0.127263 -0.153838 -0.0201337 +-0.109103 -0.40513 -0.0922743 +0.0245805 -0.245308 -0.0308665 +-0.240844 -0.260535 -0.0650585 +-0.0475742 -0.247538 -0.0322906 +-0.115904 0.0317681 -0.00724772 +-0.0897532 -0.368486 -0.0747095 +-0.331125 -0.232337 -0.0854644 +0.242826 -0.157387 -0.0427826 +0.401611 -0.208675 -0.108281 +-0.0168167 -0.460526 -0.112513 +0.255425 -0.24429 -0.0645425 +-0.271636 -0.0700687 -0.0401542 +0.227504 -0.00292132 -0.0262273 +-0.21802 0.31084 -0.0748807 +0.0017217 -0.316196 -0.0513076 +-0.304642 -0.24226 -0.0788578 +-0.328022 -0.160132 -0.0690009 +0.205318 -0.393207 -0.103768 +0.186189 -0.251703 -0.0502743 +0.0438906 -0.430069 -0.0982715 +0.185853 -0.117454 -0.0244677 +0.312383 -0.116402 -0.0572022 +-0.315116 -0.34158 -0.114548 +0.399912 0.0218539 -0.0837072 +0.298028 0.106725 -0.0514279 +-0.233991 -0.24934 -0.0602777 +0.4645 0.0830435 -0.118329 +-0.418267 -0.235162 -0.122645 +-0.2374 0.0833543 -0.0321709 +0.286642 -0.231483 -0.0703487 +-0.297906 -0.324267 -0.102168 +-0.0588591 -0.26094 -0.036441 +0.422132 -0.132884 -0.103258 +0.0134081 -0.259958 -0.034473 +-0.0189761 -0.30096 -0.0465522 +0.217367 -0.337497 -0.084114 +0.313149 -0.249747 -0.0837226 +0.277585 -0.254736 -0.0736869 +-0.348943 -0.249345 -0.0966361 +0.37612 -0.246813 -0.106906 +-0.264743 -0.256344 -0.070377 +0.143642 -0.221515 -0.0354803 +0.27586 -0.25826 -0.0741474 +-0.314402 -0.257702 -0.0863582 +-0.390802 -0.0209179 -0.0797631 +0.207322 -0.265857 -0.0585449 +0.381008 0.0929524 -0.0801128 +-0.314564 -0.298742 -0.0989992 +0.00272548 -0.273263 -0.0380646 +-0.434259 -0.210541 -0.124162 +0.274155 0.175521 -0.0544675 +-0.0687781 -0.274502 -0.0408763 +0.276101 -0.263432 -0.0756775 +-0.063067 -0.179842 -0.0183283 +-0.0499321 -0.2747 -0.0397675 +0.162243 -0.407255 -0.101212 +-0.134785 -0.223453 -0.0346494 +-0.47618 -0.0245527 -0.120995 +-0.00398926 -0.0731364 -0.00268603 +-0.213343 -0.271997 -0.0616491 +0.00035683 -0.359232 -0.0667518 +-0.0704855 -0.360031 -0.0697263 +0.237591 -0.27117 -0.067253 +-0.235496 -0.165719 -0.0423577 +0.109397 -0.278574 -0.0458362 +-0.218334 -0.19025 -0.0428504 +0.27045 -0.0864286 -0.0411534 +0.444484 0.0985933 -0.109655 +-0.0498272 -0.281677 -0.0417853 +0.181121 -0.170179 -0.0313751 +0.232159 -0.27634 -0.0674023 +0.170284 0.105606 -0.0202803 +0.328038 -0.270046 -0.0947561 +0.204645 0.00699219 -0.0211888 +-0.185701 -0.282943 -0.0590121 +0.26557 -0.362926 -0.106827 +-0.0593688 -0.221903 -0.0267404 +-0.146022 -0.2378 -0.0397247 +-0.0347297 -0.318837 -0.0528268 +-0.343666 -0.153785 -0.0735853 +0.384607 -0.269609 -0.11717 +0.1514 -0.420829 -0.105584 +-0.0487322 -0.290826 -0.044466 +-0.332268 -0.274266 -0.0975721 +-0.382909 -0.108148 -0.0825662 +0.136892 -0.349443 -0.0730964 +0.323083 -0.278242 -0.0954564 +0.233971 -0.284751 -0.0703902 +0.254751 -0.110576 -0.0393361 +-0.11857 -0.290872 -0.0506135 +0.359483 -0.269657 -0.106659 +0.417729 -0.0944528 -0.0963514 +-0.157448 -0.294016 -0.0572569 +0.386118 -0.274916 -0.119469 +0.140635 -0.433453 -0.109865 +-0.219386 -0.0991733 -0.0294154 +0.275594 -0.34372 -0.102278 +0.261053 -0.262272 -0.0709871 +-0.371177 0.103983 -0.0772785 +0.285935 -0.287192 -0.0857999 +-0.234666 0.238229 -0.0575676 +-0.157909 -0.336288 -0.071574 +-0.425779 0.034736 -0.0958396 +0.00858219 -0.301027 -0.046423 +0.344652 -0.160096 -0.0750221 +-0.269248 -0.292119 -0.0823007 +0.349527 -0.284175 -0.107209 +-0.0586153 -0.303944 -0.0491149 +0.179808 -0.0793334 -0.0195025 +-0.0278039 -0.282876 -0.0412465 +-0.270539 -0.115002 -0.0441846 +0.0758543 -0.432132 -0.101386 +0.153236 -0.25053 -0.0440955 +-0.260045 -0.406607 -0.124188 +0.250421 -0.162861 -0.0456594 +-0.415321 0.0485568 -0.0916218 +-0.204908 -0.300842 -0.0685997 +0.33842 -0.124569 -0.0672864 +0.27621 -0.301433 -0.0873959 +0.223862 -0.200408 -0.0462062 +-0.0698507 -0.317055 -0.0541685 +-0.230161 -0.112956 -0.0334253 +0.111019 -0.220812 -0.0310229 +0.0203081 -0.00406163 -0.000214482 +-0.175536 -0.312072 -0.0662986 +-0.304601 -0.303096 -0.0970322 +0.256741 0.0395636 -0.0343298 +-0.0849609 -0.207447 -0.0254501 +-0.0449266 0.0364438 -0.00167468 +-0.401243 -0.0328448 -0.0846173 +0.432436 -0.0709201 -0.101129 +0.0972932 -0.446211 -0.110377 +0.187078 0.0806778 -0.0209734 +0.148036 -0.0781055 -0.014107 +-0.297986 -0.147377 -0.0568753 +-0.267265 0.0337812 -0.0369691 +0.433614 -0.161607 -0.113512 +-0.0962914 -0.221384 -0.0295789 +-0.00939017 -0.329854 -0.0560147 +0.41987 0.00646267 -0.0924389 +-0.0802191 -0.331169 -0.0598448 +0.249601 0.106707 -0.0375485 +0.22774 -0.323134 -0.0814583 +0.426808 -0.0316522 -0.0962119 +0.0576385 0.0854941 -0.00532992 +0.329531 -0.31294 -0.109226 +0.163443 -0.401095 -0.0986625 +-0.00925204 -0.371667 -0.0716801 +0.359243 -0.312014 -0.12046 +-0.0576848 -0.334823 -0.0594863 +-0.06952 -0.140607 -0.0123783 +0.271002 -0.177373 -0.0539045 +-0.184618 0.318125 -0.0701008 +0.202458 -0.185422 -0.0384235 +0.322898 -0.320887 -0.109625 +-0.287274 -0.267182 -0.08017 +-0.211577 -0.0866427 -0.0264866 +-0.146983 -0.342168 -0.0719285 +-0.14154 -0.337008 -0.0691983 +-0.0754158 -0.313339 -0.0533578 +0.217547 -0.294969 -0.0695879 +0.210268 -0.144703 -0.0331244 +0.285618 -0.329422 -0.100054 +0.291635 -0.101466 -0.048867 +0.17962 -0.341365 -0.0773915 +-0.269966 -0.334927 -0.0972586 +-0.468506 0.0865753 -0.120792 +-0.291882 -0.186116 -0.0618286 +-0.0758585 -0.380675 -0.0784079 +0.313639 -0.120558 -0.058142 +0.0752914 -0.350945 -0.0666357 +-0.184618 -0.346131 -0.0801579 +-0.279128 0.0689187 -0.0422223 +-0.106699 -0.351076 -0.0697521 +-0.302436 0.0897792 -0.0510678 +0.194408 -0.366066 -0.0899443 +-0.382336 0.090238 -0.0803935 +-0.244025 -0.0737964 -0.0330429 +0.153983 -0.11681 -0.0188555 +-0.117172 0.367506 -0.0773897 +0.255087 0.0880095 -0.0370956 +0.301138 -0.21524 -0.0710288 +0.318494 -0.341125 -0.115582 +-0.0326338 -0.359963 -0.0676043 +-0.0575644 -0.358696 -0.0683222 +-0.276928 -0.0292603 -0.039555 +0.0833529 -0.0759062 -0.00637505 +-0.0471907 -0.416747 -0.0922035 +-0.11956 -0.376537 -0.081346 +-0.0623416 -0.361023 -0.0695291 +-0.363738 -0.111896 -0.0752436 +0.128568 -0.446851 -0.114679 +-0.393723 0.0764052 -0.0839516 +0.466065 0.0346469 -0.115928 +-0.167092 -0.426397 -0.111031 +0.0788411 -0.219269 -0.0275263 +0.30741 -0.0777965 -0.0516084 +0.252472 -0.413043 -0.124984 +0.0226768 -0.415265 -0.090582 +-0.242919 -0.346438 -0.0939252 +-0.0489171 -0.324119 -0.0552494 +0.30251 -0.220941 -0.0728147 +-0.256194 0.0474563 -0.0345402 +0.229701 -0.0181814 -0.0269085 +0.175834 -0.222097 -0.0409613 +-0.303298 -0.108498 -0.0533014 +0.112582 -0.392516 -0.0871713 +0.318204 -0.198103 -0.0729069 +0.094411 -0.444741 -0.109331 +-0.320761 -0.21802 -0.0782736 +-0.18629 -0.367848 -0.0889652 +-0.155019 -0.454068 -0.122622 +-0.128284 0.0700822 -0.0107418 +0.376492 -0.112953 -0.0804918 +0.472595 -0.00338595 -0.118727 +-0.07779 -0.448951 -0.109836 +0.194524 -0.406949 -0.107502 +-0.231913 -0.416963 -0.121161 +-0.263556 -0.158895 -0.0485325 +-0.140492 0.104781 -0.0154783 +0.189297 -0.0163631 -0.0182165 +-0.208676 -0.0852566 -0.0257384 +-0.0127196 -0.458296 -0.111291 +-0.277783 0.0202213 -0.0395689 +0.173462 -0.129891 -0.0237627 +-0.348623 -0.115173 -0.0698403 +-0.193696 -0.135069 -0.0282808 +-0.478031 0.0239341 -0.121983 +-0.438897 0.0689832 -0.104115 +0.462707 -0.114233 -0.12088 +-0.253222 -0.105816 -0.0383965 +0.315863 0.0331999 -0.0517764 +0.314197 0.0814765 -0.0541448 +0.398792 0.0703738 -0.0856627 +-0.0452092 -0.471516 -0.119302 +-0.176527 -0.398379 -0.0999264 +0.275989 -0.125192 -0.0470273 +0.130108 -0.393345 -0.0898619 +-0.098511 -0.43391 -0.104445 +-0.388588 -0.161625 -0.0928743 +0.0492686 -0.424659 -0.0959884 +0.0201831 -0.374546 -0.0730112 +-0.179302 -0.292769 -0.0607784 +-0.14795 -0.407753 -0.0989737 +-0.417845 -0.101434 -0.0971618 +-0.0269769 -0.0313066 -0.000854293 +0.0452272 -0.382124 -0.0769962 +-0.131058 -0.373497 -0.0816733 +-0.0144339 -0.206267 -0.0216106 +0.391021 -0.179879 -0.097367 +-0.242268 -0.38881 -0.111106 +0.0618535 0.0299291 -0.00236359 +-0.440491 -0.0799404 -0.105809 +0.436413 -0.109029 -0.106884 +-0.0915882 -0.0770921 -0.00719166 +-0.2685 0.0824467 -0.0402551 +-0.439574 -0.171222 -0.118265 +0.011226 -0.387641 -0.0782578 +-0.199179 -0.159537 -0.0331103 +-0.179462 0.101923 -0.0215293 +0.0981199 -0.441261 -0.108001 +-0.191088 -0.201398 -0.0393106 +0.337246 0.0182888 -0.058761 +-0.000378708 -0.433686 -0.098936 +0.329848 -0.18007 -0.0732987 +-0.218599 0.0991132 -0.0292317 +-0.0741451 -0.193634 -0.0217319 +-0.292911 -0.0947683 -0.0485684 +0.328004 -0.0927842 -0.0598911 +-0.206261 0.0642948 -0.0236176 +0.377397 0.0854602 -0.0779002 +0.411795 -0.23736 -0.120179 +-0.309477 -0.0700147 -0.0516742 +0.0355823 -0.407827 -0.0876345 +0.356074 0.100266 -0.0709369 +0.0127381 -0.434316 -0.0993296 +0.188465 0.0322552 -0.01845 +0.336013 0.0668864 -0.0605206 +0.131529 -0.336602 -0.0675842 +-0.197199 -0.33921 -0.0801906 +0.197414 -0.237166 -0.0488006 +0.226667 -0.00792217 -0.0260598 +0.183972 -0.419843 -0.111245 +-0.0027809 -0.19199 -0.0186072 +-0.252554 -0.141132 -0.0427652 +-0.208152 -0.176187 -0.0379028 +-0.197332 -0.0718246 -0.0222979 +-0.311173 -0.021405 -0.049888 +-0.344535 -0.0689694 -0.0637635 +-0.167049 0.0673151 -0.0163521 +0.0506988 -0.216445 -0.0250225 +0.20422 0.0592791 -0.0228714 +0.309179 -0.20581 -0.0715334 +0.122714 -0.205539 -0.0290753 +-0.113588 -0.14964 -0.0178057 +-0.221213 -0.409099 -0.11473 +0.293347 0.047991 -0.0451993 +-0.0604142 -0.389414 -0.0809206 +0.20342 0.0557112 -0.0224947 +-0.290519 0.0547693 -0.0446995 +0.32878 -0.183648 -0.0736215 +-0.280159 0.117788 -0.0473002 +0.27908 0.0248215 -0.0400529 +-0.165629 0.0186814 -0.0139889 +-0.19613 -0.163479 -0.0331456 +0.44409 -0.190354 -0.124472 +0.0667822 -0.233565 -0.029955 +-0.30909 -0.162133 -0.0628895 +-0.28561 -0.225672 -0.0686036 +-0.357321 -0.0279402 -0.0664365 +0.358884 0.0239684 -0.0669255 +0.227498 -0.365037 -0.0972307 +0.206472 -0.309727 -0.0718629 +0.30853 -0.168874 -0.0638959 +-0.0476964 -0.383145 -0.077544 +0.214973 -0.300125 -0.0706392 +0.228996 -0.147971 -0.0378848 +-0.337069 -0.19287 -0.0784872 +-0.457931 0.100528 -0.116714 +0.207564 -0.132706 -0.0308218 +0.263299 -0.399251 -0.121779 +0.0948347 -0.152763 -0.0162979 +-0.203761 -0.42833 -0.119651 +0.0434845 -0.392586 -0.0813131 +0.00128275 -0.400607 -0.0837509 +-0.416895 0.0967852 -0.096213 +-0.119458 0.10959 -0.0132275 +-0.00166957 -0.145376 -0.010625 +0.29448 0.10672 -0.0503199 +-0.214383 -0.138269 -0.0330865 +0.0513301 -0.165948 -0.0152024 +0.370493 -0.0742374 -0.0741362 +0.0358245 -0.23181 -0.0278989 +-0.0184932 -0.380344 -0.0753397 +0.391166 -0.0892811 -0.0840208 +0.416963 0.103199 -0.0969541 +-0.112775 -0.197112 -0.0261269 +-0.0953864 -0.406982 -0.0915579 +-0.0952667 -0.0849831 -0.00818241 +0.121355 -0.406327 -0.094367 +0.312653 -0.292773 -0.0963785 +0.243263 -0.0345592 -0.0306556 +0.278338 0.0734343 -0.0423281 +-0.174132 -0.320927 -0.0690413 +-0.404541 0.0624125 -0.0876122 +0.172784 0.00864993 -0.0150783 +0.458974 -0.075872 -0.114796 +-0.23632 -0.0746935 -0.0311999 +0.0727675 0.109102 -0.00863651 +-0.135484 0.352751 -0.0741433 +-0.0508656 -0.170187 -0.015902 +-0.425387 -0.0144783 -0.0951043 +0.33915 -0.21223 -0.0835198 +-0.337127 0.0968654 -0.0635371 +-0.241528 -0.127144 -0.0379718 +-0.211962 0.216727 -0.0470563 +0.447021 0.00169379 -0.105478 +-0.100269 0.0586823 -0.0067717 +-0.0501547 -0.232112 -0.0286049 +0.114211 -0.0251943 -0.00686298 +0.115427 -0.07708 -0.00967925 +0.358574 0.0033009 -0.0665045 +-0.258758 -0.213874 -0.0580328 +0.244575 -0.214619 -0.0544199 +0.312385 -0.199382 -0.0712037 +-0.31335 -0.0691396 -0.0528826 +-0.157216 -0.201341 -0.0331779 +0.372043 -0.0675799 -0.074248 +-0.295598 -0.136453 -0.0544831 +0.370453 0.0710036 -0.0738667 +0.448325 -0.137998 -0.116846 +0.378648 -0.0117666 -0.074534 +-0.237227 -0.034271 -0.0291505 +0.348833 0.132668 -0.0722528 +0.206519 -0.150892 -0.0332624 +-0.110982 -0.151925 -0.0178586 +0.360959 -0.136593 -0.0774758 +0.465419 -0.0132749 -0.115009 +0.39919 -0.026892 -0.0835262 +-0.092982 -0.3532 -0.0690844 +-0.0750524 -0.101854 -0.00803585 +-0.00354433 -0.100796 -0.00509919 +0.0272189 -0.100762 -0.00546188 +0.201062 -0.0945752 -0.0249977 +0.322258 -0.0692352 -0.0558835 +0.00463848 -0.475484 -0.120288 +0.31563 -0.0150142 -0.0512364 +-0.139293 0.0615856 -0.0116658 +-0.228854 0.0852473 -0.0302791 diff --git a/image_analysis/indexing/fast-feedback-indexer/data/image6_local.txt b/image_analysis/indexing/fast-feedback-indexer/data/image6_local.txt new file mode 100644 index 000000000..bc8b63e69 --- /dev/null +++ b/image_analysis/indexing/fast-feedback-indexer/data/image6_local.txt @@ -0,0 +1,274 @@ +36.9 0 0 4.83429e-15 78.95 0 4.83429e-15 4.83429e-15 78.95 +0.0231239 0.476595 -0.121181 +0.0796721 0.473703 -0.122926 +-0.0232837 0.474954 -0.120298 +0.139879 0.461397 -0.123903 +-0.0683996 0.463256 -0.116419 +-0.0277176 0.464282 -0.114746 +0.328854 -0.0239166 -0.0559221 +0.282757 0.302056 -0.0896098 +0.0650872 0.313009 -0.0524826 +0.432505 -0.0708655 -0.101158 +-0.270634 -0.335031 -0.097497 +-0.241121 0.346288 -0.0933877 +0.353168 0.260961 -0.101573 +0.143506 -0.221995 -0.0355704 +-0.440171 -0.0795997 -0.105621 +0.385178 -0.269118 -0.117269 +0.418058 -0.094237 -0.096481 +0.406994 -0.156441 -0.100065 +0.291551 -0.101505 -0.0488455 +0.308549 -0.168862 -0.0639 +-0.417345 -0.100947 -0.096876 +0.076098 0.167505 -0.0170701 +-0.30331 -0.10834 -0.0532869 +-0.382727 -0.10811 -0.0824857 +0.302719 -0.220902 -0.0728735 +0.129547 -0.44698 -0.114886 +-0.322723 0.16929 -0.0687691 +-0.468675 -0.111294 -0.123668 +-0.425706 0.0352628 -0.095826 +-0.158349 -0.336384 -0.0716834 +0.462813 -0.114123 -0.120921 +0.0768988 0.120841 -0.0103111 +0.344924 -0.160006 -0.075108 +-0.241092 -0.126817 -0.037819 +0.328114 -0.0926525 -0.0599168 +0.284907 0.366244 -0.114171 +0.0105984 -0.387994 -0.078399 +0.123533 -0.330029 -0.064147 +-0.402475 0.169801 -0.100455 +0.124841 0.366816 -0.0781212 +-0.215277 0.157749 -0.0362724 +0.0476601 -0.251012 -0.0331902 +0.210328 -0.144521 -0.0331102 +0.237904 0.393406 -0.11195 +-0.0918541 -0.076843 -0.00719691 +0.448562 -0.137759 -0.116929 +-0.360847 -0.308142 -0.119751 +-0.137727 0.459866 -0.122757 +0.0160211 0.292845 -0.0439742 +-0.345901 0.190407 -0.0812519 +0.387696 0.21145 -0.102793 +-0.285937 -0.225284 -0.0686099 +0.250327 -0.162884 -0.0456388 +-0.308787 -0.161653 -0.0627066 +0.466031 0.0350113 -0.115925 +-0.316251 -0.316531 -0.105688 +-0.412302 -0.139546 -0.0997036 +0.0081994 -0.178378 -0.0160721 +0.4661 -0.0132695 -0.115368 +0.271196 -0.177294 -0.0539452 +0.094993 -0.152705 -0.0163041 +-0.3112 -0.0213369 -0.049895 +0.179815 -0.0792233 -0.0194949 +-0.428311 0.0829969 -0.100188 +-0.0785687 -0.449069 -0.109964 +-0.0985291 -0.433565 -0.104281 +-0.123267 0.418621 -0.100244 +0.0438927 -0.430033 -0.0982542 +-0.416984 0.0968805 -0.096264 +-0.0741707 -0.193133 -0.0216349 +0.39125 -0.179833 -0.0974572 +-0.292254 -0.186219 -0.0619648 +0.151308 -0.421553 -0.105909 +-0.112975 -0.196733 -0.0260736 +-0.30753 0.305957 -0.0989917 +-0.337345 -0.19272 -0.078557 +-0.0849399 -0.20717 -0.0253894 +0.245137 0.412258 -0.122531 +-0.338531 0.259136 -0.095431 +-0.204202 -0.428465 -0.119819 +-0.179462 0.101982 -0.0215353 +-0.38271 -0.200593 -0.0981711 +0.193032 0.197214 -0.0388313 +0.313634 -0.249796 -0.083902 +-0.291996 0.329862 -0.102264 +0.110689 -0.22076 -0.0309731 +-0.325121 0.337279 -0.116519 +-0.13489 -0.223403 -0.0346526 +0.339267 -0.212202 -0.0835568 +-0.235179 -0.165274 -0.0422029 +-0.23058 0.134555 -0.0362948 +-0.164404 0.288359 -0.056697 +0.0128588 0.347258 -0.0623184 +0.183359 -0.420598 -0.111475 +0.207592 -0.266118 -0.0586783 +-0.433952 -0.209916 -0.123861 +0.259641 -0.0347429 -0.03492 +0.419912 0.0063528 -0.0924575 +-0.399629 -0.217032 -0.109386 +0.428446 -0.213776 -0.122086 +0.422216 -0.132716 -0.103272 +-0.393738 0.0764926 -0.0839656 +-0.126589 0.261837 -0.0432259 +0.169943 0.105484 -0.0202079 +0.164527 -0.236896 -0.0424976 +-0.388547 -0.161187 -0.0927788 +0.274195 -0.385488 -0.118969 +-0.260203 -0.406331 -0.124107 +-0.331244 -0.232534 -0.0855575 +-0.37219 -0.227424 -0.100137 +0.318014 0.140413 -0.0623694 +0.230443 0.206162 -0.0490041 +-0.146507 -0.158841 -0.0236265 +0.411525 -0.237106 -0.119984 +-0.0590055 -0.260839 -0.0364225 +0.0530696 0.237967 -0.0301778 +-0.349523 -0.249272 -0.0968404 +0.205428 0.275328 -0.0608547 +-0.240769 -0.260408 -0.0650038 +0.364018 0.281448 -0.11215 +-0.0100591 -0.330117 -0.0561137 +-0.314639 -0.256988 -0.0862385 +-0.299702 -0.0703681 -0.0485657 +-0.348589 -0.11503 -0.0698098 +0.168423 0.266841 -0.0510901 +0.472923 -0.00309719 -0.118902 +-0.133809 0.222356 -0.0342604 +-0.251955 0.342176 -0.0947737 +-0.218414 -0.190225 -0.0428638 +-0.238524 0.291965 -0.0737913 +-0.31683 -0.268926 -0.090441 +-0.0874054 0.348689 -0.0668459 +-0.191394 -0.201205 -0.039331 +-0.00848868 -0.287076 -0.0421299 +-0.186308 -0.2828 -0.059089 +0.359511 -0.269439 -0.106605 +-0.33331 -0.274225 -0.0979439 +0.307709 0.232715 -0.0774174 +0.0959626 0.313725 -0.0553478 +0.0227338 -0.415407 -0.0906484 +-0.364465 0.221319 -0.0954654 +0.263412 -0.399134 -0.12176 +-0.188439 0.195727 -0.0376168 +-0.315109 -0.341302 -0.114438 +0.0652051 -0.444865 -0.106779 +0.279183 0.356274 -0.108302 +0.398717 0.0704063 -0.0856327 +-0.26945 -0.292141 -0.0823671 +-0.296938 0.206505 -0.0676997 +-0.214636 -0.399612 -0.108798 +0.332686 0.0367505 -0.0576789 +-0.13763 -0.436508 -0.110889 +0.357009 -0.306017 -0.117448 +-0.261461 0.199769 -0.0556851 +0.158082 -0.364346 -0.0822517 +0.351576 0.316302 -0.118894 +-0.19685 -0.339279 -0.0801415 +0.140627 -0.43364 -0.109955 +-0.371058 0.104269 -0.077263 +-0.424848 0.142602 -0.106038 +-0.0380866 0.379936 -0.0757717 +-0.476057 -0.0243698 -0.120923 +0.0973845 -0.44579 -0.110176 +-0.155811 -0.454397 -0.122933 +0.0977986 0.378723 -0.0796715 +0.28578 -0.329326 -0.10007 +-0.14619 -0.358241 -0.0778873 +-0.298033 -0.324548 -0.102311 +0.227025 -0.36548 -0.0972908 +0.194397 -0.406583 -0.107308 +-0.311665 0.183359 -0.0676673 +-0.0781493 -0.426764 -0.09902 +-0.24241 -0.388434 -0.11098 +0.380505 0.143998 -0.0865008 +-0.0197234 -0.342781 -0.0607918 +0.0250984 0.151579 -0.0118735 +0.27604 -0.301613 -0.0874041 +0.217429 -0.338089 -0.0843469 +-0.0112005 0.304561 -0.047573 +0.275351 -0.344065 -0.102336 +0.122113 -0.206374 -0.0291765 +0.227979 -0.322991 -0.0814675 +-0.404433 0.0624575 -0.0875676 +-0.276842 0.176268 -0.0553899 +-0.303644 0.251489 -0.0810041 +0.464391 0.0833651 -0.118302 +-0.142105 -0.306845 -0.058909 +0.0145788 0.411765 -0.0888263 +0.436731 -0.108942 -0.107029 +0.402119 0.129018 -0.0935484 +0.323412 -0.320971 -0.109841 +-0.365332 -0.224197 -0.0965245 +-0.232037 -0.416702 -0.12107 +0.241537 0.283633 -0.0719846 +-0.165914 0.40727 -0.101889 +-0.360575 0.117822 -0.0747413 +-0.140339 0.104913 -0.0154705 +0.199238 0.384123 -0.0984715 +-0.275828 0.353448 -0.106136 +0.391278 -0.0889963 -0.0840409 +-0.457931 0.10054 -0.116716 +0.358672 0.00347736 -0.0665428 +-0.186852 -0.367981 -0.0891343 +0.25015 0.198983 -0.0524608 +0.359605 -0.31196 -0.120588 +0.293436 0.322841 -0.100184 +-0.254003 0.268146 -0.07071 +0.337284 0.0183909 -0.0587767 +-0.415195 0.0486847 -0.0915714 +-0.432552 0.186796 -0.117954 +-0.337222 0.0969939 -0.0635847 +0.12833 0.312423 -0.0587649 +-0.0354405 0.324909 -0.054919 +-0.00928182 -0.37201 -0.0718177 +-0.382474 -0.277602 -0.118722 +0.340477 0.295644 -0.107436 +-0.119466 -0.375804 -0.0810337 +0.193925 0.374017 -0.0930799 +0.00439987 -0.475001 -0.120026 +0.0942372 0.369228 -0.0754516 +0.0649935 0.379245 -0.0769891 +-0.382945 0.252071 -0.111285 +0.0436386 0.281787 -0.0415159 +0.239639 0.338518 -0.0900668 +-0.246876 -0.179939 -0.0478055 +-0.412899 0.155837 -0.102654 +-0.147807 -0.407288 -0.0987397 +0.2843 0.190167 -0.060314 +-0.269168 0.244516 -0.0684634 +0.205487 -0.393024 -0.103726 +-0.158429 -0.379007 -0.0882685 +-0.10439 0.388067 -0.0842997 +-0.390415 -0.0209727 -0.0796 +0.332334 -0.327026 -0.115349 +-0.368436 0.162696 -0.084694 +0.160679 0.31127 -0.0633605 +-0.0801157 -0.330545 -0.0596162 +0.1044 0.176501 -0.0212518 +0.293412 0.0479653 -0.045218 +-0.0397436 0.202184 -0.0214591 +0.221449 0.137501 -0.0345706 +-0.0823583 0.190345 -0.0217435 +0.239692 0.402044 -0.11631 +-0.276884 -0.029069 -0.0395363 +0.399369 -0.0265757 -0.0835951 +0.151907 0.0925013 -0.0159433 +0.423358 0.11414 -0.101257 +0.348633 0.011871 -0.0628157 +0.173274 0.163842 -0.0288502 +-0.477984 0.0242071 -0.121965 +-0.356773 0.176596 -0.0826522 +-0.382462 0.0903338 -0.0804551 +-0.290477 0.054963 -0.0446978 +0.0686556 0.325193 -0.0568479 +0.359424 0.2717 -0.107255 +0.18095 0.231924 -0.0442446 +0.342393 0.183706 -0.0785775 +-0.3764 0.20732 -0.0970374 +-0.468544 0.0867369 -0.120828 +0.0727872 0.10922 -0.00865093 +-0.32578 0.110794 -0.0610686 +-0.310066 0.36105 -0.12051 +-0.32327 0.118348 -0.0611229 +0.254591 0.249136 -0.0655937 +0.0165353 0.180438 -0.0165526 +-0.420689 0.200558 -0.115242 +-0.211844 0.216921 -0.0470742 +-0.410579 0.214339 -0.113725 +-0.047392 0.247138 -0.0321793 +-0.141243 0.267276 -0.0467876 +0.247627 0.294673 -0.0770433 +0.145781 0.339785 -0.0708639 +0.228245 0.363144 -0.096656 diff --git a/image_analysis/indexing/fast-feedback-indexer/data/image6_peakfinder8.txt b/image_analysis/indexing/fast-feedback-indexer/data/image6_peakfinder8.txt new file mode 100644 index 000000000..fd751cbf4 --- /dev/null +++ b/image_analysis/indexing/fast-feedback-indexer/data/image6_peakfinder8.txt @@ -0,0 +1,891 @@ +36.9 0 0 4.83429e-15 78.95 0 4.83429e-15 4.83429e-15 78.95 +-0.404956 -0.67715 -0.385606 +0.210402 -0.711641 -0.329702 +0.108506 -0.717403 -0.311844 +0.0120814 -0.714076 -0.300036 +0.380685 -0.654823 -0.347095 +-0.178179 -0.692327 -0.30076 +-0.272314 -0.673076 -0.312385 +-0.133021 -0.685571 -0.28425 +0.143584 -0.682651 -0.283501 +0.335058 -0.640631 -0.309111 +0.370939 -0.631688 -0.319284 +0.160697 -0.665128 -0.270766 +-0.242346 -0.647934 -0.277885 +-0.0325503 -0.65788 -0.247581 +-0.415281 -0.585651 -0.303901 +-0.0154607 -0.641481 -0.233017 +-0.346757 -0.599662 -0.278775 +0.162858 -0.627954 -0.23898 +-0.106858 -0.627682 -0.228899 +-0.240087 -0.611666 -0.246194 +-0.0684342 -0.624947 -0.222338 +0.148274 -0.609558 -0.221249 +-0.453403 -0.546177 -0.295645 +-0.288711 -0.585032 -0.242119 +-0.0513207 -0.608314 -0.207965 +0.191591 -0.597084 -0.221037 +-0.216142 -0.589979 -0.22205 +-0.412565 -0.54869 -0.272862 +-0.170977 -0.583164 -0.205842 +0.0690592 -0.589398 -0.195114 +0.0367002 -0.587578 -0.191665 +0.1764 -0.578213 -0.203412 +-0.26511 -0.563728 -0.217742 +-0.292998 -0.553038 -0.220063 +0.361258 -0.540351 -0.240057 +-0.457621 -0.513659 -0.274233 +-0.0169487 -0.571902 -0.179853 +-0.32067 -0.541708 -0.223004 +-0.416726 -0.516395 -0.251885 +0.335825 -0.53522 -0.224912 +0.372281 -0.526518 -0.235679 +-0.17504 -0.550781 -0.183911 +-0.572251 -0.457248 -0.319226 +0.310075 -0.530163 -0.210835 +0.347487 -0.522104 -0.221116 +-0.269077 -0.531181 -0.196604 +0.216046 -0.533379 -0.182179 +0.3217 -0.516878 -0.206686 +0.358651 -0.508651 -0.217284 +-0.296837 -0.520192 -0.199196 +0.295379 -0.511611 -0.193151 +0.157693 -0.526934 -0.164851 +0.332819 -0.50379 -0.202863 +0.369552 -0.494933 -0.213569 +-0.123891 -0.497853 -0.141633 +0.292307 -0.478826 -0.172182 +0.330113 -0.471142 -0.182045 +0.469902 -0.43954 -0.234496 +0.122729 -0.49343 -0.138917 +-0.0852967 -0.495355 -0.135507 +0.36671 -0.462149 -0.192571 +0.0902028 -0.493481 -0.134934 +0.402322 -0.452947 -0.204402 +0.0581809 -0.491493 -0.131064 +-0.0447257 -0.491706 -0.130388 +0.303454 -0.465321 -0.1685 +0.166009 -0.481082 -0.139186 +-0.144377 -0.482746 -0.136223 +-0.211165 -0.474503 -0.14545 +0.376831 -0.447977 -0.18925 +-0.105627 -0.479659 -0.128926 +-0.346831 -0.452263 -0.178315 +-0.23896 -0.463264 -0.146604 +0.520647 -0.406996 -0.24948 +0.00459028 -0.47509 -0.120075 +0.314153 -0.451469 -0.164845 +0.35134 -0.442968 -0.175173 +0.387264 -0.433932 -0.186532 +-0.266962 -0.452626 -0.1492 +0.219674 -0.45409 -0.13655 +0.325287 -0.437725 -0.161796 +-0.294503 -0.441061 -0.152219 +-0.0167666 -0.460324 -0.112407 +-0.155675 -0.454419 -0.12292 +0.361504 -0.428918 -0.172145 +-0.49957 -0.397983 -0.230559 +0.465024 -0.406635 -0.213615 +-0.221541 -0.445505 -0.132564 +-0.356749 -0.423236 -0.167173 +0.230804 -0.440386 -0.132366 +0.129479 -0.447052 -0.114913 +-0.0786815 -0.448998 -0.109938 +0.0973965 -0.445926 -0.110245 +-0.249557 -0.43458 -0.134632 +0.0651912 -0.44485 -0.106771 +-0.277382 -0.423758 -0.137742 +-0.137544 -0.436423 -0.110834 +0.242043 -0.427064 -0.128776 +0.140633 -0.433881 -0.110073 +-0.204082 -0.42834 -0.11973 +-0.0987205 -0.433569 -0.104304 +-0.516608 -0.373347 -0.229462 +0.450284 -0.387891 -0.195771 +0.000225245 -0.43386 -0.0990196 +0.0438214 -0.430131 -0.0982979 +-0.232029 -0.416761 -0.121096 +0.0111859 -0.428503 -0.0965291 +0.183299 -0.420588 -0.111458 +-0.0781493 -0.426764 -0.09902 +0.252923 -0.413179 -0.125178 +0.151288 -0.421271 -0.105772 +-0.401247 -0.386947 -0.169776 +-0.435987 -0.379889 -0.184157 +-0.260154 -0.406264 -0.124061 +-0.0472103 -0.41654 -0.0921094 +0.0224651 -0.415563 -0.0907129 +0.194521 -0.406695 -0.107385 +-0.287844 -0.395231 -0.127682 +-0.147992 -0.407597 -0.09891 +0.263441 -0.399172 -0.121786 +0.161887 -0.407938 -0.101457 +0.300296 -0.391881 -0.130373 +0.43521 -0.369257 -0.178878 +-0.214653 -0.399387 -0.108701 +-0.109185 -0.40464 -0.0920656 +-0.176107 -0.398557 -0.0999228 +-0.349867 -0.376771 -0.142308 +0.205504 -0.393006 -0.103722 +-0.24261 -0.388597 -0.111106 +0.00105915 -0.400241 -0.0835907 +0.609565 -0.318215 -0.273935 +0.27409 -0.385336 -0.11887 +-0.452484 -0.355203 -0.182021 +0.410198 -0.364341 -0.163942 +0.477866 -0.35099 -0.194736 +0.311734 -0.377565 -0.128067 +-0.557353 -0.327938 -0.237233 +0.384432 -0.359249 -0.149616 +0.0105984 -0.387994 -0.078399 +0.216479 -0.379235 -0.100379 +0.517881 -0.332355 -0.211749 +0.321803 -0.362935 -0.125517 +-0.158429 -0.379007 -0.0882685 +-0.50977 -0.326884 -0.20421 +-0.119572 -0.375941 -0.0811035 +-0.0807535 -0.373497 -0.07589 +0.227136 -0.365481 -0.0973193 +-0.469426 -0.330253 -0.181115 +-0.18671 -0.367999 -0.0891123 +0.461909 -0.332001 -0.177555 +-0.00944929 -0.372061 -0.0718399 +-0.0577585 -0.371569 -0.0733932 +0.19514 -0.365638 -0.0899292 +0.437647 -0.327427 -0.16259 +-0.14619 -0.358241 -0.0778873 +-0.315118 -0.341344 -0.114458 +0.275412 -0.344136 -0.102382 +-0.603616 -0.285806 -0.255714 +0.411973 -0.322904 -0.147937 +-0.270699 -0.335142 -0.097558 +-0.411902 -0.317331 -0.145812 +-0.19685 -0.339279 -0.0801415 +0.217211 -0.337968 -0.0842504 +-0.0197266 -0.342841 -0.0608137 +0.285839 -0.329282 -0.100073 +0.385857 -0.317641 -0.133849 +-0.158177 -0.336345 -0.0716401 +-0.298014 -0.324539 -0.102302 +0.323339 -0.320979 -0.109818 +0.421034 -0.308178 -0.146913 +0.520007 -0.29015 -0.196629 +0.35972 -0.312053 -0.120668 +-0.0802249 -0.330621 -0.0596525 +0.123533 -0.330029 -0.064147 +0.227936 -0.323026 -0.0814688 +-0.509939 -0.284894 -0.188337 +-0.010073 -0.330182 -0.0561365 +0.357009 -0.306017 -0.117448 +-0.468824 -0.288074 -0.165004 +-0.394269 -0.298836 -0.130949 +-0.110143 -0.318819 -0.0586058 +-0.0488829 -0.320104 -0.0538796 +-0.0708228 -0.318345 -0.0546743 +0.0849998 -0.317497 -0.0555579 +-0.314773 -0.298733 -0.099069 +0.27604 -0.301613 -0.0874041 +0.503769 -0.271077 -0.179796 +-0.142105 -0.306845 -0.058909 +0.412413 -0.280173 -0.133156 +-0.108838 -0.302383 -0.0530477 +-0.269622 -0.292208 -0.0824388 +-0.0190555 -0.300752 -0.0464879 +0.140966 -0.297747 -0.0558203 +0.286134 -0.286893 -0.0857682 +-0.157466 -0.29371 -0.0571643 +0.386508 -0.274842 -0.119617 +-0.118638 -0.290954 -0.0506473 +0.323294 -0.278274 -0.0955418 +0.385178 -0.269118 -0.117269 +-0.0582636 -0.290363 -0.0448588 +-0.0115077 -0.290096 -0.0430718 +-0.080143 -0.288622 -0.0459169 +0.35956 -0.269377 -0.106606 +0.51975 -0.247621 -0.182355 +-0.186109 -0.282922 -0.0590864 +-0.00843714 -0.287031 -0.0421159 +-0.509153 -0.242105 -0.174077 +-0.0220231 -0.281663 -0.0407394 +-0.0137104 -0.279278 -0.0398875 +0.462847 -0.247166 -0.148717 +-0.214221 -0.271696 -0.0617618 +-0.468505 -0.245113 -0.151223 +-0.0689106 -0.274174 -0.040792 +0.034574 -0.276509 -0.0396107 +0.00214634 -0.27353 -0.0381389 +0.207664 -0.26609 -0.058686 +-0.314584 -0.256912 -0.0861986 +0.0173202 -0.271671 -0.0377656 +-0.240917 -0.260523 -0.065074 +0.437349 -0.242248 -0.13395 +0.275956 -0.258196 -0.0741582 +0.596119 -0.214517 -0.226292 +-0.349523 -0.249272 -0.0968404 +0.535031 -0.224229 -0.185468 +0.566135 -0.21931 -0.205397 +0.313572 -0.249777 -0.0838756 +-0.0590977 -0.260923 -0.0364509 +-0.00482587 -0.261562 -0.0348255 +0.20506 -0.255729 -0.0552498 +0.0130922 -0.259881 -0.034448 +0.411525 -0.237106 -0.119984 +-0.269381 -0.249821 -0.0699338 +-0.0933081 -0.256838 -0.0380604 +0.186119 -0.251837 -0.0502959 +-0.451224 -0.227516 -0.137079 +0.478746 -0.223799 -0.15105 +0.255082 -0.244221 -0.0644311 +0.0476601 -0.251012 -0.0331902 +-0.601609 -0.200278 -0.226724 +-0.331424 -0.232414 -0.085592 +0.0243946 -0.245859 -0.0310014 +0.453928 -0.21873 -0.136225 +-0.37219 -0.227424 -0.100137 +-0.258648 -0.235717 -0.0632295 +-0.143031 -0.240945 -0.0400586 +0.201441 -0.237811 -0.0498065 +-0.365347 -0.22423 -0.0965385 +0.19659 -0.237334 -0.0486719 +-0.145919 -0.237774 -0.0397026 +0.164871 -0.236997 -0.0425815 +0.580023 -0.195728 -0.209263 +-0.555838 -0.200098 -0.193151 +-0.0700968 -0.237377 -0.0311147 +-0.399632 -0.217117 -0.109408 +-0.286049 -0.225563 -0.0687119 +0.428446 -0.213776 -0.122086 +0.176972 -0.231498 -0.0433968 +-0.434027 -0.210018 -0.123922 +0.0669336 -0.233492 -0.0299477 +0.460292 -0.208144 -0.136978 +0.0357903 -0.231501 -0.0278238 +-0.227219 -0.227269 -0.0530468 +0.302764 -0.220946 -0.0728987 +0.645265 -0.176462 -0.256701 +-0.260586 -0.222363 -0.0605058 +0.494134 -0.2001 -0.153955 +-0.173223 -0.225875 -0.0413686 +-0.134993 -0.223534 -0.0346971 +-0.0505695 -0.227386 -0.0275092 +0.175521 -0.222454 -0.0409865 +0.401776 -0.208652 -0.10835 +0.339349 -0.212245 -0.0835968 +0.123538 -0.223977 -0.033267 +0.143491 -0.22191 -0.0355486 +-0.0961032 -0.221239 -0.0295271 +0.11085 -0.220704 -0.0309789 +0.244944 -0.214823 -0.0545618 +-0.201692 -0.215396 -0.0445291 +0.0786589 -0.219456 -0.0275537 +0.469689 -0.195213 -0.139021 +0.216603 -0.212445 -0.0471359 +-0.38271 -0.200593 -0.0981711 +-0.539327 -0.182502 -0.177918 +-0.457833 -0.189015 -0.131287 +0.183446 -0.20871 -0.0393817 +0.444165 -0.19023 -0.124483 +-0.0850156 -0.207255 -0.0254141 +-0.014461 -0.20652 -0.0216646 +0.122131 -0.206307 -0.0291646 +0.22378 -0.200446 -0.0461951 +-0.337388 -0.192743 -0.0785775 +-0.191227 -0.201269 -0.0393111 +0.509011 -0.176474 -0.157525 +-0.108993 -0.202723 -0.0268484 +0.541087 -0.171831 -0.176775 +-0.607917 -0.161691 -0.222637 +0.601508 -0.162163 -0.217765 +-0.113189 -0.196728 -0.0260974 +-0.121674 -0.196234 -0.0270213 +0.484657 -0.171593 -0.142291 +-0.218372 -0.190281 -0.0428653 +0.391243 -0.179845 -0.0974565 +-0.561076 -0.161419 -0.188127 +-0.292254 -0.186219 -0.0619648 +-0.0741103 -0.193211 -0.0216457 +0.328428 -0.183532 -0.0734737 +-0.0029526 -0.192131 -0.0186351 +-0.439617 -0.171016 -0.118246 +0.664744 -0.143326 -0.266807 +0.20229 -0.185539 -0.0384108 +0.459753 -0.166605 -0.127721 +-0.246042 -0.179777 -0.0475592 +0.271237 -0.177342 -0.053966 +-0.208055 -0.177568 -0.038136 +-0.206296 -0.175492 -0.0373761 +-0.0629666 -0.179828 -0.0183192 +0.433808 -0.161483 -0.113584 +-0.203107 -0.176259 -0.0368382 +0.00813338 -0.178703 -0.0161306 +0.308549 -0.168862 -0.0639 +0.58456 -0.143385 -0.20142 +-0.388558 -0.16115 -0.092777 +0.181133 -0.170406 -0.0314171 +-0.235275 -0.165352 -0.0422398 +-0.0511643 -0.17107 -0.0160704 +0.407009 -0.156422 -0.100069 +0.344955 -0.160026 -0.0751228 +0.498972 -0.147931 -0.146101 +-0.308796 -0.161596 -0.0626998 +0.250283 -0.162879 -0.0456265 +-0.196763 -0.163805 -0.0333293 +-0.224858 -0.161395 -0.0390679 +0.242739 -0.157375 -0.0427586 +0.474259 -0.14298 -0.131302 +-0.310786 -0.15278 -0.0618793 +-0.146507 -0.158841 -0.0236265 +0.159377 -0.155176 -0.0250542 +0.29881 -0.148934 -0.0573807 +-0.0805337 -0.153697 -0.0151693 +0.127374 -0.153932 -0.0201628 +-0.298363 -0.147204 -0.0569675 +0.0949723 -0.152692 -0.0163002 +0.206609 -0.150675 -0.0332478 +0.448617 -0.137861 -0.116973 +-0.412183 -0.139618 -0.09966 +0.228787 -0.148048 -0.0378471 +0.422274 -0.132811 -0.103314 +0.210328 -0.144521 -0.0331102 +-0.252586 -0.141233 -0.0427888 +0.36092 -0.136537 -0.0774523 +0.544284 -0.119677 -0.16968 +-0.249692 -0.137076 -0.041426 +0.255568 -0.135963 -0.0428171 +0.575193 -0.115005 -0.190107 +0.604421 -0.110056 -0.210973 +0.207722 -0.132756 -0.0308624 +-0.241259 -0.126787 -0.0378569 +-0.314744 -0.123052 -0.0588334 +0.275807 -0.125047 -0.0469556 +0.462832 -0.114137 -0.120933 +-0.468877 -0.111401 -0.12379 +0.639974 -0.0956009 -0.237573 +-0.348627 -0.115065 -0.0698283 +0.312495 -0.116305 -0.0572276 +0.376468 -0.112922 -0.080478 +0.436731 -0.108942 -0.107029 +0.185647 -0.117963 -0.0244899 +-0.383015 -0.108045 -0.0825981 +0.153924 -0.116817 -0.0188469 +-0.230269 -0.112948 -0.0334499 +0.0889953 -0.115096 -0.0106402 +-0.303267 -0.108387 -0.0532787 +0.254544 -0.110266 -0.0392458 +0.056599 -0.113061 -0.00802531 +-0.417479 -0.100993 -0.0969433 +0.291738 -0.101463 -0.0488986 +-0.492846 -0.0913006 -0.134687 +-0.219534 -0.099031 -0.0294343 +0.418058 -0.0942371 -0.0964809 +0.293431 -0.0979478 -0.0490508 +0.594409 -0.0816012 -0.199988 +0.509341 -0.0858399 -0.143727 +-0.293229 -0.0945467 -0.0486443 +0.328093 -0.0926605 -0.0599103 +0.391317 -0.0890848 -0.0840659 +0.540645 -0.0809831 -0.162656 +0.484793 -0.0808341 -0.129114 +0.27055 -0.0863824 -0.0411773 +-0.608978 -0.0706271 -0.209963 +-0.4404 -0.0796807 -0.105741 +-0.208524 -0.0849627 -0.0256802 +-0.562204 -0.070026 -0.175972 +-0.262519 -0.0817656 -0.0385438 +0.459024 -0.0756252 -0.114801 +0.307482 -0.0777735 -0.0516298 +0.179832 -0.0792097 -0.019497 +-0.235843 -0.0745029 -0.031069 +0.148018 -0.0781014 -0.014104 +-0.0918466 -0.0768622 -0.0071977 +0.432597 -0.0707638 -0.101194 +0.0836812 -0.0761742 -0.00642315 +0.116498 -0.0768898 -0.00978987 +-0.645836 -0.0579847 -0.238729 +-0.30982 -0.0701186 -0.0517939 +-0.307465 -0.0701824 -0.0510324 +-0.299702 -0.070368 -0.0485657 +0.248919 -0.0715562 -0.0341226 +-0.197477 -0.0717126 -0.022319 +-0.013059 -0.0731307 -0.00276314 +0.26449 -0.0708513 -0.0382178 +-0.401078 -0.0329562 -0.0845492 +-0.33101 -0.0330516 -0.0569517 +-0.322155 -0.0340587 -0.0539258 +-0.239735 -0.0338743 -0.0297529 +0.00704787 -0.0359758 -0.000672191 +0.0974702 -0.0358054 -0.00540585 +0.185301 -0.0347342 -0.0179322 +0.204923 -0.034969 -0.0218468 +0.259641 -0.0347429 -0.03492 +0.426783 -0.031586 -0.0961977 +-0.276961 -0.0289505 -0.0395551 +0.0797064 -0.0312184 -0.00367058 +-0.476188 -0.0243428 -0.120993 +0.39917 -0.0264765 -0.0835053 +-0.238155 -0.0262136 -0.0291267 +0.328854 -0.0239167 -0.0559221 +-0.51676 -0.0211851 -0.144132 +-0.390628 -0.0208628 -0.0796878 +-0.311342 -0.02138 -0.0499426 +0.548007 -0.0189106 -0.16374 +0.491581 -0.0182006 -0.129358 +0.270311 -0.019135 -0.0374171 +0.523941 -0.01358 -0.148354 +0.157179 -0.0153055 -0.0125485 +0.315728 -0.0151797 -0.0512717 +0.465909 -0.013271 -0.115267 +0.22662 -0.00779162 -0.026048 +0.472923 -0.00309718 -0.118902 +0.0715004 0.00293983 -0.00256376 +0.202984 0.00283964 -0.020822 +0.446964 0.00183616 -0.10545 +0.358575 0.00343485 -0.0665053 +0.204628 0.00734109 -0.0211877 +0.172701 0.0085136 -0.0150626 +0.419888 0.00656934 -0.0924477 +-0.576613 0.012609 -0.18308 +-0.622779 0.0120931 -0.217696 +-0.277779 0.0202868 -0.0395693 +-0.165621 0.0187106 -0.0139881 +0.337259 0.0183973 -0.058768 +0.399965 0.0219372 -0.0837323 +0.279218 0.0248053 -0.0400926 +-0.477859 0.0241658 -0.121896 +0.516928 0.0248144 -0.144331 +-0.518803 0.0274933 -0.145548 +0.188464 0.0322969 -0.0184511 +0.256411 0.0317681 -0.0339543 +-0.658545 0.0252349 -0.247882 +-0.0449251 0.0364395 -0.00167445 +0.315789 0.0332618 -0.0517536 +0.492005 0.0296827 -0.129914 +-0.267259 0.0337916 -0.0369678 +0.2567 0.0393726 -0.0343112 +0.548476 0.029608 -0.164358 +-0.425638 0.0350588 -0.095786 +0.332687 0.0367505 -0.0576789 +0.466106 0.0350035 -0.115964 +-0.256043 0.0475537 -0.0345049 +-0.25315 0.048311 -0.0337799 +0.232917 0.0483382 -0.0287053 +0.293314 0.0480163 -0.0451903 +-0.548882 0.0444255 -0.165281 +-0.415266 0.0486984 -0.0916043 +-0.217331 0.0513616 -0.0252542 +0.203364 0.0557221 -0.0224836 +-0.641251 0.0429033 -0.233869 +-0.290525 0.0550039 -0.0447147 +-0.10034 0.0587088 -0.00678037 +0.137422 0.0608017 -0.0113552 +-0.20625 0.0643139 -0.0236166 +-0.490861 0.0584099 -0.130722 +-0.404576 0.062575 -0.0876388 +-0.16722 0.0673578 -0.016384 +-0.12842 0.0701633 -0.0107652 +-0.279247 0.0689573 -0.04226 +0.336111 0.0670812 -0.0605695 +0.218649 0.0710446 -0.026786 +-0.577539 0.0615253 -0.185959 +0.398766 0.0704106 -0.0856543 +0.540574 0.0679332 -0.161451 +0.187068 0.0807733 -0.0209795 +0.696486 0.0586439 -0.28483 +-0.478898 0.0730123 -0.125171 +-0.393583 0.076503 -0.0838998 +-0.268348 0.0824864 -0.0402161 +0.0575396 0.0854385 -0.00531942 +0.51584 0.0730697 -0.146437 +0.310883 0.0820316 -0.0530984 +0.314062 0.0815542 -0.0541067 +0.490612 0.0781939 -0.132137 +0.255158 0.0883022 -0.0371411 +0.151907 0.0925013 -0.0159433 +0.5471 0.0778261 -0.166558 +-0.302379 0.0899153 -0.0510625 +0.464412 0.0833162 -0.118309 +-0.0732688 0.0969342 -0.00740973 +0.232809 0.0941585 -0.0320465 +-0.468384 0.0866919 -0.120739 +-0.382545 0.0904006 -0.0804961 +0.260723 0.0954005 -0.0393115 +-0.218521 0.0991439 -0.0292173 +0.261817 0.098223 -0.0398937 +-0.337222 0.0969939 -0.0635847 +-0.179402 0.102062 -0.0215328 +0.251564 0.100433 -0.0373843 +-0.140339 0.104913 -0.0154705 +-0.416935 0.0969552 -0.0962496 +0.169971 0.10545 -0.0202091 +0.355999 0.100386 -0.0709214 +-0.0306274 0.108798 -0.00640809 +0.297592 0.105737 -0.0511805 +0.0727872 0.10922 -0.00865094 +0.249595 0.106762 -0.0375531 +0.444496 0.098821 -0.109687 +-0.371113 0.104207 -0.0772781 +-0.457837 0.100693 -0.116685 +0.416798 0.103501 -0.0969126 +0.238546 0.112871 -0.0354503 +-0.325867 0.110925 -0.0611144 +0.0768988 0.120841 -0.0103111 +0.0128878 0.121984 -0.00755163 +0.333508 0.115126 -0.0643084 +-0.241724 0.120359 -0.0371483 +-0.32327 0.118348 -0.0611229 +-0.538591 0.106789 -0.164227 +-0.360666 0.117894 -0.074786 +0.275322 0.121379 -0.0463414 +0.423358 0.11414 -0.101257 +0.395672 0.118483 -0.0892831 +-0.085995 0.131584 -0.012432 +0.120696 0.131723 -0.0160887 +-0.631935 0.105362 -0.232174 +0.281993 0.130742 -0.0495335 +-0.23058 0.134555 -0.0362948 +0.277849 0.132892 -0.0486116 +-0.308942 0.131865 -0.0581048 +-0.191926 0.13699 -0.0281985 +-0.152928 0.139822 -0.0217041 +0.221449 0.137501 -0.0345706 +0.402119 0.129018 -0.0935484 +-0.265186 0.141186 -0.0461957 +0.317898 0.140362 -0.0623223 +0.258582 0.14622 -0.0451413 +0.0250984 0.151579 -0.0118735 +0.227244 0.146644 -0.0372664 +0.000362217 0.155871 -0.0122227 +0.380606 0.144021 -0.0865465 +-0.424848 0.142602 -0.106038 +-0.253956 0.155379 -0.0453461 +0.467135 0.14157 -0.127221 +-0.21526 0.157753 -0.0362691 +0.549648 0.135919 -0.175735 +-0.066452 0.165827 -0.0160867 +-0.0981424 0.166537 -0.0188612 +0.173305 0.163891 -0.028864 +-0.134814 0.165749 -0.0230903 +0.0761002 0.16751 -0.0170712 +0.358573 0.158348 -0.0800265 +-0.288098 0.162293 -0.0562518 +-0.413104 0.155927 -0.102764 +0.473587 0.151914 -0.132453 +0.301064 0.165308 -0.0608334 +-0.657342 0.131978 -0.258054 +-0.368632 0.162627 -0.0847606 +0.241944 0.171763 -0.0450336 +0.219188 0.173856 -0.0399318 +-0.322807 0.169353 -0.0688098 +-0.546543 0.151568 -0.176399 +0.0166431 0.180396 -0.0165467 +0.279407 0.173641 -0.0556586 +-0.276842 0.176268 -0.05539 +-0.238754 0.178727 -0.0455091 +-0.402475 0.169801 -0.100455 +-0.356689 0.17665 -0.08263 +0.425587 0.171603 -0.111502 +-0.0824602 0.190268 -0.0217371 +-0.0118246 0.19095 -0.0184714 +-0.207997 0.187517 -0.0400133 +-0.311665 0.183359 -0.0676673 +0.143805 0.190996 -0.0290001 +0.115875 0.193809 -0.025828 +0.342424 0.183726 -0.0785932 +-0.536053 0.165654 -0.172229 +0.284292 0.190178 -0.0603136 +-0.188479 0.195825 -0.0376444 +0.12971 0.198446 -0.0285092 +0.209761 0.195478 -0.0419872 +0.590233 0.161047 -0.208995 +-0.149229 0.198588 -0.0313445 +0.193138 0.197265 -0.0388631 +0.0637199 0.202266 -0.0227446 +-0.039746 0.202237 -0.0214702 +-0.345931 0.190465 -0.0812756 +0.403747 0.186508 -0.104342 +-0.261478 0.199819 -0.0557005 +-0.432678 0.186909 -0.118039 +0.617381 0.164792 -0.23079 +0.230495 0.206276 -0.0490415 +-0.0664022 0.213923 -0.0254089 +0.409831 0.197148 -0.109398 +-0.296538 0.206531 -0.0675783 +-0.0597304 0.218494 -0.0259914 +0.325679 0.208548 -0.0778064 +-0.420795 0.200646 -0.115312 +-0.211844 0.216921 -0.0470742 +-0.172889 0.219404 -0.0398068 +0.266445 0.214424 -0.0603036 +-0.0230667 0.222545 -0.0253505 +-0.376258 0.207214 -0.0969538 +-0.133809 0.222356 -0.0342604 +-0.330715 0.214014 -0.080856 +0.387696 0.21145 -0.102793 +-0.0592449 0.230667 -0.0287724 +0.181 0.231983 -0.0442685 +-0.410579 0.214339 -0.113725 +-0.0500958 0.235876 -0.0295088 +0.0520563 0.237492 -0.0300064 +0.148671 0.233444 -0.0390626 +-0.364491 0.221306 -0.0954728 +0.0841619 0.235897 -0.0318733 +-0.319201 0.228116 -0.0801773 +-0.451 0.21768 -0.134428 +-0.196281 0.240444 -0.0493895 +-0.15722 0.2431 -0.0428248 +-0.0484205 0.246435 -0.0320511 +0.307879 0.232866 -0.0775118 +0.218304 0.241195 -0.0543952 +-0.117684 0.24641 -0.0380059 +0.0240358 0.248721 -0.0317231 +0.132106 0.247589 -0.0401835 +0.157174 0.246714 -0.0437425 +-0.0592319 0.250917 -0.0338052 +-0.269209 0.244541 -0.0684819 +-0.229721 0.246668 -0.0585206 +0.371009 0.236386 -0.101961 +-0.0497511 0.254706 -0.034262 +0.25472 0.249233 -0.065655 +-0.439394 0.231483 -0.132044 +-0.00398549 0.259337 -0.0342214 +-0.58928 0.209267 -0.219643 +-0.0748848 0.25852 -0.036901 +0.510042 0.224031 -0.169538 +0.0552389 0.262063 -0.0365316 +-0.30368 0.251553 -0.0810335 +-0.126589 0.261837 -0.0432259 +0.457401 0.234528 -0.142223 +-0.479924 0.234505 -0.154612 +0.240734 0.259097 -0.0646308 +-0.18057 0.264295 -0.0526127 +-0.141297 0.267205 -0.0467757 +-0.049608 0.269558 -0.0382945 +0.103761 0.269278 -0.0425434 +0.136296 0.267965 -0.0462609 +0.1681 0.266729 -0.0510017 +0.0125121 0.271096 -0.037529 +-0.383067 0.252099 -0.111346 +-0.578414 0.22297 -0.215321 +0.489779 0.239301 -0.161638 +-0.338455 0.25898 -0.0953575 +0.463061 0.244098 -0.147949 +-0.253983 0.268116 -0.0706957 +0.353383 0.261006 -0.10167 +0.205427 0.275249 -0.0608314 +0.295882 0.26755 -0.08301 +0.0438234 0.281791 -0.0415256 +0.108731 0.278963 -0.0458735 +0.494824 0.249648 -0.167639 +0.468442 0.254241 -0.153877 +0.441102 0.259065 -0.140748 +0.359424 0.2717 -0.107255 +-0.16449 0.28828 -0.0566879 +0.0160261 0.292835 -0.0439714 +0.241692 0.283721 -0.072052 +-0.413426 0.269089 -0.130132 +-0.238448 0.291855 -0.073737 +0.473386 0.264421 -0.159769 +0.446688 0.269001 -0.146707 +-0.128185 0.299034 -0.0544065 +-0.121969 0.300339 -0.053998 +0.247533 0.294568 -0.0769849 +-0.0111621 0.304766 -0.0476382 +0.555039 0.258272 -0.209287 +0.529725 0.26446 -0.194114 +0.478322 0.274988 -0.16598 +-0.60317 0.249881 -0.24254 +0.0650871 0.313009 -0.0524826 +-0.186849 0.30932 -0.0675793 +0.0962412 0.313966 -0.0554563 +0.128347 0.312423 -0.0587673 +0.160803 0.311483 -0.0634528 +0.283065 0.302267 -0.0897756 +0.340699 0.295659 -0.107526 +-0.442876 0.285956 -0.150241 +-0.307413 0.306077 -0.0989929 +-0.222396 0.315645 -0.0775531 +-0.18422 0.318233 -0.0700588 +-0.145094 0.320923 -0.0640748 +-0.057622 0.323061 -0.0553776 +0.582901 0.262429 -0.231002 +-0.0356441 0.324979 -0.0549507 +0.0684652 0.325095 -0.0568002 +0.346565 0.305755 -0.113204 +0.429487 0.293759 -0.146041 +-0.105202 0.324562 -0.0600041 +0.457062 0.289784 -0.159096 +-0.592404 0.263748 -0.238755 +-0.48355 0.289179 -0.173831 +-0.38635 0.306476 -0.130054 +-0.340794 0.313197 -0.113565 +0.0406995 0.336387 -0.059156 +0.434744 0.303787 -0.152231 +0.564194 0.27808 -0.222596 +-0.0614632 0.337143 -0.0605551 +0.293436 0.322841 -0.100184 +0.351574 0.316305 -0.118894 +-0.581182 0.277474 -0.234993 +0.145781 0.339785 -0.0708639 +-0.291835 0.3298 -0.102189 +0.0127934 0.347305 -0.0623352 +-0.167679 0.342937 -0.0757284 +0.239693 0.338724 -0.0901576 +-0.251955 0.342176 -0.0947737 +-0.415707 0.32343 -0.149953 +-0.241183 0.346333 -0.0934216 +-0.125226 0.354403 -0.0733301 +-0.0139832 0.359338 -0.0668972 +0.333619 0.340179 -0.120809 +0.572628 0.297568 -0.236096 +-0.457256 0.326851 -0.172905 +-0.275766 0.353491 -0.106133 +0.0940942 0.369088 -0.0753811 +0.125118 0.367063 -0.0782571 +0.157886 0.365942 -0.0828529 +0.279499 0.356371 -0.108439 +0.421394 0.338234 -0.158558 +-0.355924 0.353947 -0.135107 +-0.0380727 0.379649 -0.0756533 +-0.401135 0.347426 -0.152424 +-0.309992 0.361118 -0.120512 +0.0651733 0.379454 -0.0770878 +0.0978635 0.378776 -0.0797005 +0.130079 0.377 -0.0829667 +0.194335 0.374217 -0.0932502 +-0.186221 0.373495 -0.0912519 +0.162547 0.375909 -0.0877111 +0.285006 0.366403 -0.114269 +0.343135 0.359917 -0.132407 +0.426136 0.347872 -0.164899 +0.5567 0.323034 -0.234667 +-0.221772 0.379807 -0.101911 +-0.104453 0.38807 -0.0843082 +0.0383851 0.391436 -0.0805958 +0.199402 0.384338 -0.0985994 +0.348078 0.370067 -0.138668 +0.430452 0.357743 -0.171307 +0.0423501 0.400704 -0.0847716 +0.560676 0.332285 -0.241561 +-0.385288 0.370868 -0.155009 +-0.0601093 0.401747 -0.0862243 +0.35289 0.380346 -0.145128 +0.435155 0.367497 -0.17806 +0.46269 0.363429 -0.191398 +0.0145178 0.411749 -0.0888182 +-0.165822 0.40733 -0.101899 +0.239692 0.402044 -0.11631 +0.564263 0.341545 -0.248365 +0.357288 0.390141 -0.151392 +0.439558 0.377285 -0.184865 +-0.162826 0.416044 -0.105352 +-0.123177 0.418746 -0.100289 +0.466886 0.372883 -0.198142 +0.493033 0.368118 -0.211706 +-0.369403 0.394642 -0.158692 +-0.324033 0.401688 -0.143467 +0.245166 0.412285 -0.122552 +0.361969 0.400078 -0.158029 +-0.00900193 0.430512 -0.0974599 +-0.0306453 0.457071 -0.111098 +0.135828 0.453006 -0.1189 +0.504247 0.396781 -0.232993 +-0.610841 0.365482 -0.297649 +0.52968 0.391606 -0.247614 +-0.137756 0.459911 -0.122785 +0.375168 0.429715 -0.178664 +-0.027766 0.464305 -0.11476 +-0.491673 0.404875 -0.229069 +-0.215297 0.454538 -0.135684 +0.139979 0.461508 -0.123977 +-0.682888 0.343282 -0.355158 +-0.0334538 0.47312 -0.119637 +0.379122 0.439156 -0.185501 +-0.023292 0.474925 -0.120282 +0.0798317 0.4739 -0.123048 +0.11271 0.473204 -0.126287 +0.144919 0.471585 -0.130169 +-0.249481 0.461681 -0.14876 +0.176318 0.469827 -0.135029 +-0.378553 0.445608 -0.188747 +0.0848103 0.484085 -0.129099 +0.383056 0.44869 -0.192568 +0.117129 0.483235 -0.13238 +0.149799 0.481934 -0.136692 +0.181154 0.479684 -0.141463 +0.0565221 0.494606 -0.132722 +0.0896258 0.49459 -0.135507 +0.121979 0.493428 -0.138809 +0.38654 0.458304 -0.19966 +0.185716 0.489486 -0.147995 +-0.279659 0.47868 -0.16774 +-0.0417198 0.504694 -0.137711 +0.158859 0.502116 -0.149916 +0.190182 0.499156 -0.154616 +0.419063 0.463563 -0.219298 +-0.358247 0.479094 -0.198671 +-0.147 0.510236 -0.152621 +-0.0372114 0.515104 -0.14368 +-0.185904 0.50768 -0.158751 +0.0988143 0.514385 -0.148153 +-0.106639 0.514479 -0.149153 +0.194512 0.508907 -0.161442 +-0.308748 0.495566 -0.188157 +0.422372 0.472629 -0.22655 +0.070898 0.524852 -0.151764 +-0.400065 0.482427 -0.220762 +0.342843 0.494362 -0.201211 +-0.220641 0.515075 -0.171739 +0.198964 0.518702 -0.168519 +0.289011 0.51072 -0.190286 +-0.0991079 0.532556 -0.159428 +0.0754826 0.534857 -0.158436 +0.453109 0.47702 -0.24691 +0.140212 0.532725 -0.165407 +0.172343 0.530463 -0.169996 +-0.253816 0.52148 -0.185361 +-0.0948289 0.542652 -0.165413 +0.0801284 0.544889 -0.165329 +0.176757 0.539855 -0.17701 +-0.250464 0.532186 -0.191269 +-0.333405 0.522264 -0.215091 +0.0843723 0.553908 -0.171708 +-0.378853 0.515914 -0.231688 +0.117249 0.553802 -0.175648 +0.149198 0.551556 -0.179314 +0.180175 0.549328 -0.184049 +0.382424 0.518346 -0.235102 +0.272098 0.542004 -0.204894 +-0.330005 0.532345 -0.220445 +0.08894 0.56318 -0.178466 +-0.475572 0.498444 -0.275166 +0.1216 0.562404 -0.182128 +0.153456 0.560656 -0.186295 +-0.419315 0.518915 -0.255082 +0.12563 0.571753 -0.18925 +-0.275017 0.558687 -0.217546 +0.444225 0.527852 -0.276096 +0.470664 0.52346 -0.289743 +0.368952 0.55901 -0.257449 +0.257213 0.581786 -0.2284 +0.00395823 0.603788 -0.202865 +-0.349167 0.568662 -0.255214 +-0.45152 0.542006 -0.291227 +0.00855745 0.613156 -0.210084 +-0.344991 0.578635 -0.260971 +-0.389696 0.571695 -0.277987 +-0.0532189 0.63098 -0.226029 +0.21083 0.623372 -0.247034 +-0.285646 0.614383 -0.264514 +0.0546776 0.640587 -0.234063 +0.183639 0.634843 -0.249499 +-0.281184 0.624393 -0.271255 +0.0915933 0.648912 -0.24467 +0.155967 0.645756 -0.252556 +-0.271752 0.643572 -0.284482 +-0.0736418 0.667054 -0.25864 +0.493674 0.592508 -0.36343 +-0.116447 0.677061 -0.273344 +-0.103446 0.684413 -0.278282 +0.286222 0.662477 -0.307756 +0.139868 0.692239 -0.292015 +0.0140476 0.71386 -0.299853 diff --git a/image_analysis/indexing/fast-feedback-indexer/data/image6_radial.txt b/image_analysis/indexing/fast-feedback-indexer/data/image6_radial.txt new file mode 100644 index 000000000..ab445ca30 --- /dev/null +++ b/image_analysis/indexing/fast-feedback-indexer/data/image6_radial.txt @@ -0,0 +1,675 @@ +36.9 0 0 4.83429e-15 78.95 0 4.83429e-15 4.83429e-15 78.95 +0.0798584 0.473956 -0.12308 +-0.023204 0.474829 -0.120228 +-0.0335289 0.473153 -0.119658 +0.139982 0.461506 -0.123976 +0.0983402 0.463745 -0.119506 +-0.0277409 0.464358 -0.114787 +-0.0683996 0.463256 -0.116419 +-0.137756 0.459911 -0.122785 +0.153863 0.451974 -0.121339 +0.135858 0.453187 -0.118998 +0.00829957 0.457366 -0.11076 +-0.0306453 0.457071 -0.111098 +0.0474118 0.456853 -0.111722 +0.0275607 0.456973 -0.110947 +-0.0090483 0.430511 -0.0974602 +-0.0780338 0.428483 -0.099826 +-0.0866659 0.427932 -0.100354 +-0.045532 0.428411 -0.0975639 +0.245179 0.412315 -0.12257 +-0.123192 0.418765 -0.1003 +-0.162826 0.416044 -0.105352 +0.0145485 0.411735 -0.0888124 +-0.165846 0.407439 -0.101953 +-0.0576302 0.410691 -0.0900487 +-0.0474549 0.406104 -0.0874062 +0.237904 0.393406 -0.11195 +0.204652 0.394918 -0.104368 +-0.0600151 0.401682 -0.0861892 +0.0427087 0.397759 -0.0835046 +0.061703 0.396834 -0.0841858 +0.00581321 0.396828 -0.0821253 +-0.0562355 0.395176 -0.0831176 +0.0468064 0.394337 -0.0822267 +0.0278622 0.394358 -0.0814654 +0.199374 0.384339 -0.0985938 +0.151003 0.386944 -0.090345 +0.0381533 0.390965 -0.0803854 +-0.104453 0.38807 -0.0843082 +-0.259584 0.37801 -0.111335 +-0.144619 0.386257 -0.0890165 +0.0702635 0.389184 -0.0815234 +-0.221837 0.379807 -0.101927 +0.285004 0.366405 -0.114269 +0.198258 0.375695 -0.0947115 +0.194317 0.374275 -0.0932701 +0.0978158 0.378776 -0.0796952 +-0.0380855 0.379614 -0.0756394 +0.130029 0.377175 -0.0830313 +-0.186222 0.373625 -0.0913054 +-0.30996 0.361101 -0.120494 +0.0652119 0.37929 -0.0770231 +-0.077522 0.374019 -0.0758247 +0.228245 0.363144 -0.096656 +0.093929 0.368748 -0.0752285 +0.27956 0.356371 -0.108459 +0.158381 0.366377 -0.0831121 +0.125118 0.367063 -0.0782571 +-0.0482577 0.369357 -0.0719664 +0.0231239 0.476595 -0.121181 +0.0692195 0.369151 -0.073212 +-0.275772 0.353477 -0.10613 +0.0212124 0.366008 -0.0696299 +-0.0568976 0.364955 -0.0707152 +-0.159353 0.35945 -0.0805426 +-0.115106 0.360097 -0.0742133 +0.333411 0.340126 -0.12071 +0.046819 0.360776 -0.0685233 +-0.0139832 0.359338 -0.0668972 +-0.125249 0.354426 -0.073342 +-0.241183 0.346333 -0.0934216 +-0.325121 0.337279 -0.116519 +-0.171222 0.346747 -0.0778016 +0.239923 0.339046 -0.0903382 +-0.106711 0.348892 -0.0689322 +0.117903 0.345953 -0.0691855 +0.0127934 0.347305 -0.0623352 +-0.130244 0.344967 -0.0704655 +-0.291836 0.329777 -0.102181 +0.145781 0.339785 -0.0708639 +0.267391 0.32964 -0.0945501 +0.157115 0.336821 -0.0716323 +-0.251955 0.342176 -0.0947737 +-0.0614632 0.337143 -0.0605551 +0.351574 0.316305 -0.118894 +0.293436 0.322841 -0.100184 +0.203107 0.32969 -0.0780174 +0.0406995 0.336387 -0.059156 +-0.34081 0.313206 -0.113574 +0.346567 0.305749 -0.113203 +-0.105202 0.324562 -0.0600041 +0.166569 0.321997 -0.0680274 +-0.0356441 0.324979 -0.0549507 +0.288012 0.311855 -0.0945741 +-0.18422 0.318233 -0.0700588 +-0.222396 0.315645 -0.0775531 +-0.145094 0.320923 -0.0640748 +-0.057622 0.323061 -0.0553776 +-0.307494 0.306082 -0.0990221 +0.283132 0.302243 -0.0897882 +0.160803 0.311483 -0.0634528 +0.128347 0.312423 -0.0587673 +0.0962411 0.313966 -0.0554563 +0.340699 0.295659 -0.107526 +-0.186849 0.30932 -0.0675793 +0.0650872 0.313009 -0.0524826 +-0.310115 0.296369 -0.096676 +-0.0111621 0.304766 -0.0476382 +0.247533 0.294568 -0.0769849 +-0.158009 0.379525 -0.0884112 +0.364018 0.281448 -0.11215 +0.22384 0.295357 -0.071205 +-0.121969 0.300339 -0.053998 +-0.238451 0.29185 -0.0737362 +-0.128185 0.299034 -0.0544065 +-0.323203 0.28256 -0.096839 +0.0160261 0.292835 -0.0439714 +0.241627 0.283722 -0.0720354 +-0.16449 0.28828 -0.056688 +0.359424 0.2717 -0.107255 +0.205427 0.275249 -0.0608314 +0.29589 0.26756 -0.0830155 +0.0438235 0.281791 -0.0415257 +0.353383 0.261022 -0.101675 +0.108731 0.278963 -0.0458735 +-0.253988 0.268132 -0.0707016 +-0.338447 0.259 -0.0953603 +-0.206515 0.339298 -0.08227 +0.287149 0.262493 -0.0787819 +0.0931909 0.415589 -0.0952342 +-0.383071 0.2521 -0.111348 +0.103753 0.269276 -0.0425421 +0.136296 0.267965 -0.0462609 +0.1681 0.266729 -0.0510017 +-0.049608 0.269558 -0.0382945 +-0.141297 0.267205 -0.0467757 +-0.18057 0.264295 -0.0526127 +0.240734 0.259097 -0.0646308 +-0.126589 0.261837 -0.0432259 +-0.303647 0.251552 -0.0810224 +-0.0568137 0.359608 -0.0686276 +0.27868 0.251254 -0.0730649 +0.25472 0.249233 -0.065655 +-0.00398546 0.259337 -0.0342214 +-0.0748848 0.25852 -0.036901 +0.371009 0.236386 -0.101961 +-0.269211 0.244548 -0.0684841 +-0.0497511 0.254706 -0.034262 +-0.229721 0.246668 -0.0585206 +-0.0592319 0.250917 -0.0338052 +0.157174 0.246714 -0.0437425 +0.132106 0.247589 -0.0401835 +0.218304 0.241195 -0.0543952 +0.0240358 0.248721 -0.0317231 +-0.0484205 0.246435 -0.0320511 +-0.117684 0.24641 -0.0380059 +0.307915 0.232869 -0.077525 +-0.157222 0.243099 -0.0428247 +-0.196281 0.240444 -0.0493895 +-0.319201 0.228116 -0.0801773 +0.0520563 0.237492 -0.0300064 +-0.364491 0.221306 -0.0954728 +0.181 0.231983 -0.0442685 +-0.0500958 0.235876 -0.0295088 +0.148543 0.233273 -0.0390012 +0.0841619 0.235897 -0.0318733 +-0.325004 0.221325 -0.0805502 +-0.410579 0.214339 -0.113725 +0.162616 0.376073 -0.0877912 +0.387711 0.21148 -0.102807 +-0.330705 0.214028 -0.0808557 +0.266445 0.214424 -0.0603036 +-0.133809 0.222356 -0.0342604 +-0.376258 0.207214 -0.0969538 +-0.0230667 0.222545 -0.0253505 +-0.420811 0.200651 -0.115321 +-0.172893 0.21941 -0.0398087 +0.325653 0.208556 -0.0777991 +-0.211844 0.216921 -0.0470742 +-0.0597304 0.218494 -0.0259914 +0.409831 0.197148 -0.109398 +-0.296538 0.206531 -0.0675783 +-0.0664021 0.213923 -0.0254089 +0.230495 0.206276 -0.0490415 +-0.261478 0.199819 -0.0557005 +-0.432897 0.186778 -0.118119 +0.403748 0.186518 -0.104345 +0.0637199 0.202266 -0.0227446 +-0.039746 0.202237 -0.0214702 +-0.345901 0.190506 -0.0812727 +0.193138 0.197265 -0.0388631 +0.129542 0.198371 -0.0284715 +0.013481 0.43049 -0.0975053 +-0.149229 0.198588 -0.0313445 +0.319329 0.190588 -0.071719 +0.209761 0.195478 -0.0419872 +-0.188479 0.195825 -0.0376444 +0.284292 0.190178 -0.0603135 +-0.33254 0.270425 -0.0965135 +0.342424 0.183726 -0.0785932 +0.115875 0.193809 -0.025828 +0.143805 0.190996 -0.0290001 +-0.0118245 0.19095 -0.0184714 +-0.311665 0.183359 -0.0676673 +-0.0395144 0.191442 -0.0192919 +0.425593 0.171609 -0.111506 +-0.0824602 0.190268 -0.0217371 +-0.356607 0.176627 -0.0825938 +-0.402612 0.169814 -0.100519 +-0.238754 0.178728 -0.0455091 +-0.276842 0.176268 -0.0553899 +0.279407 0.173641 -0.0556586 +0.0165781 0.180434 -0.0165527 +-0.322807 0.169353 -0.0688098 +0.241944 0.171763 -0.0450336 +0.301063 0.165308 -0.0608334 +-0.413092 0.155931 -0.102759 +0.358573 0.158348 -0.0800265 +0.0761043 0.167513 -0.0170719 +-0.288098 0.162293 -0.0562518 +0.173305 0.163891 -0.0288639 +-0.134814 0.165749 -0.0230903 +-0.0981424 0.166537 -0.0188612 +-0.0663713 0.165436 -0.0160154 +-0.21526 0.157753 -0.0362691 +-0.42481 0.14249 -0.106001 +0.380606 0.144021 -0.0865465 +0.000362185 0.155871 -0.0122227 +0.258582 0.146219 -0.0451413 +0.0250984 0.151579 -0.0118735 +0.227244 0.146644 -0.0372664 +0.317898 0.140362 -0.0623223 +-0.265186 0.141186 -0.0461957 +-0.152928 0.139822 -0.0217041 +0.402324 0.128949 -0.0936294 +0.221449 0.137501 -0.0345706 +-0.191926 0.13699 -0.0281985 +0.277849 0.132892 -0.0486116 +-0.23058 0.134555 -0.0362948 +-0.308942 0.131865 -0.0581048 +0.128457 0.13636 -0.0177045 +0.281993 0.130742 -0.0495335 +-0.128748 0.132351 -0.0171942 +0.120711 0.131685 -0.0160854 +0.395672 0.118483 -0.0892831 +0.275322 0.121379 -0.0463414 +-0.360666 0.117894 -0.074786 +0.423421 0.114062 -0.101276 +-0.32327 0.118348 -0.0611229 +-0.241724 0.120359 -0.0371483 +0.333508 0.115126 -0.0643085 +0.0768988 0.120841 -0.0103111 +0.0128877 0.121984 -0.00755162 +-0.325867 0.110925 -0.0611144 +0.238546 0.112871 -0.0354503 +0.344945 -0.160021 -0.0751181 +-0.399611 -0.217108 -0.109396 +-0.0190506 -0.300758 -0.0464898 +-0.235272 -0.16535 -0.0422388 +-0.314744 -0.123052 -0.0588334 +0.275807 -0.125047 -0.0469556 +-0.121674 -0.196234 -0.0270213 +-0.365372 -0.224237 -0.0965505 +0.164835 -0.237061 -0.0425911 +0.201441 -0.23781 -0.0498065 +0.426745 -0.0316086 -0.0961806 +-0.258648 -0.235717 -0.0632295 +-0.331424 -0.232364 -0.0855794 +0.127374 -0.153932 -0.0201628 +-0.279247 0.0689573 -0.04226 +-0.080225 -0.330621 -0.0596525 +0.255082 -0.244221 -0.064431 +0.0476601 -0.251012 -0.0331902 +-0.206719 -0.30884 -0.0716224 +-0.0808212 -0.373411 -0.0758612 +0.186119 -0.251837 -0.0502959 +0.293313 0.0480162 -0.0451903 +-0.227219 -0.227269 -0.0530468 +0.464431 0.0833117 -0.118318 +-0.253956 0.155379 -0.0453461 +0.0224651 -0.415563 -0.0907129 +-0.0918466 -0.0768622 -0.0071977 +-0.26953 -0.249104 -0.0697845 +0.411476 -0.236943 -0.119918 +0.0973965 -0.445926 -0.110245 +0.427886 -0.131451 -0.105777 +-0.119574 -0.375926 -0.0810973 +0.36092 -0.136537 -0.0774523 +0.137321 -0.396037 -0.0920917 +0.205061 -0.255729 -0.0552498 +-0.00482587 -0.261562 -0.0348255 +0.129533 -0.447026 -0.114907 +-0.260162 -0.406202 -0.124035 +-0.0590977 -0.260923 -0.0364509 +0.0691547 -0.380812 -0.0779372 +0.0130922 -0.259881 -0.034448 +-0.270703 -0.335116 -0.0975492 +-0.0741103 -0.193211 -0.0216457 +-0.349523 -0.249272 -0.0968404 +-0.185424 0.354657 -0.083574 +0.275977 -0.258197 -0.0741648 +-0.240917 -0.260523 -0.065074 +0.0243945 -0.245859 -0.0310015 +-0.390628 -0.0208629 -0.0796878 +0.123533 -0.330029 -0.064147 +-0.0850156 -0.207255 -0.0254141 +-0.134993 -0.223534 -0.0346971 +-0.010073 -0.330182 -0.0561365 +0.207664 -0.26609 -0.058686 +-0.314773 -0.298733 -0.099069 +-0.31457 -0.256978 -0.0862122 +-0.434026 -0.210009 -0.123919 +0.194521 -0.406695 -0.107385 +0.00214639 -0.27353 -0.0381389 +-0.0689106 -0.274174 -0.040792 +-0.277779 0.0202868 -0.0395693 +-0.167679 0.342937 -0.0757284 +-0.252622 -0.141276 -0.0428044 +-0.0708228 -0.318345 -0.0546743 +-0.214221 -0.271696 -0.0617618 +0.302756 -0.220931 -0.0728925 +-0.0137104 -0.279278 -0.0398875 +0.472923 -0.00309719 -0.118902 +-0.348631 -0.115064 -0.0698299 +0.0727872 0.10922 -0.00865093 +0.391246 -0.179807 -0.0974502 +-0.085995 0.131584 -0.012432 +-0.31683 -0.268926 -0.090441 +0.19659 -0.237334 -0.0486719 +-0.0197265 -0.342841 -0.0608137 +0.313577 -0.249788 -0.0838801 +-0.0084372 -0.287031 -0.0421159 +0.188464 0.032297 -0.0184511 +0.428471 -0.213807 -0.122105 +-0.41753 -0.101034 -0.0969714 +-0.186109 -0.282922 -0.0590864 +-0.337372 -0.192724 -0.0785677 +-0.145932 -0.237796 -0.0397101 +0.398785 0.0704525 -0.0856656 +-0.0115077 -0.290096 -0.0430718 +0.359582 -0.269379 -0.106616 +0.227929 -0.32302 -0.081465 +-0.080143 -0.288622 -0.0459169 +0.216446 -0.379147 -0.100334 +-0.33331 -0.274225 -0.0979439 +-0.382976 -0.108058 -0.0825837 +0.323275 -0.27826 -0.095531 +-0.118638 -0.290954 -0.0506473 +-0.0130591 -0.0731307 -0.00276314 +-0.0167611 -0.460328 -0.112409 +0.232916 0.0483381 -0.0287053 +-0.24982 -0.13737 -0.0415014 +0.377838 0.0855933 -0.0780931 +-0.157466 -0.29371 -0.0571643 +-0.290525 0.0550039 -0.0447147 +0.386484 -0.274811 -0.119597 +0.428369 -0.0664208 -0.0988405 +-0.276986 -0.0289609 -0.0395626 +0.286238 -0.28683 -0.0857812 +-0.295202 -0.28761 -0.0888818 +0.227985 -0.291107 -0.0708717 +-0.15788 -0.0985598 -0.0174727 +0.339359 -0.212235 -0.0835983 +0.148018 -0.0781014 -0.014104 +0.232496 -0.292462 -0.0724162 +-0.0506625 -0.170654 -0.0159723 +-0.468995 -0.111382 -0.123851 +-0.158177 -0.336345 -0.0716401 +-0.269648 -0.292212 -0.0824478 +0.332686 0.0367505 -0.0576789 +-0.19697 -0.339105 -0.0801031 +0.289109 -0.290933 -0.0879837 +0.250629 -0.293374 -0.07744 +-0.201692 -0.215396 -0.0445291 +-0.108838 -0.302383 -0.0530477 +0.418058 -0.094237 -0.096481 +0.259641 -0.0347429 -0.03492 +0.314062 0.0815542 -0.0541067 +-0.353998 -0.169506 -0.080243 +0.172701 0.00851364 -0.0150626 +-0.00368772 -0.387337 -0.0780691 +-0.147992 -0.407597 -0.09891 +0.162028 -0.407783 -0.101412 +0.0849998 -0.317497 -0.0555579 +0.0106494 -0.429232 -0.0968685 +0.202316 -0.185557 -0.0384195 +-0.0991657 -0.383502 -0.0817993 +0.422277 -0.132813 -0.103316 +0.0797064 -0.0312183 -0.00367058 +-0.0488829 -0.320104 -0.0538796 +0.39917 -0.0264765 -0.0835053 +0.310883 0.0820316 -0.0530984 +-0.41693 0.0970592 -0.0962586 +-0.268348 0.0824864 -0.0402161 +-0.0548902 0.458479 -0.112992 +0.372568 0.0807384 -0.0755139 +-0.219534 -0.099031 -0.0294343 +0.307482 -0.0777736 -0.0516298 +-0.241259 -0.126787 -0.0378569 +0.205505 -0.393007 -0.103722 +0.357198 -0.305902 -0.117485 +-0.044925 0.0364395 -0.00167445 +-0.412183 -0.139618 -0.09966 +-0.382545 0.0904007 -0.0804961 +-0.368632 0.162627 -0.0847606 +-0.4404 -0.0796848 -0.105741 +0.0357913 -0.2315 -0.0278237 +0.123538 -0.223977 -0.033267 +0.254499 -0.110262 -0.0392333 +-0.0216279 -0.181871 -0.0169154 +-0.286049 -0.225563 -0.0687119 +-0.0094766 -0.372045 -0.0718335 +-0.316251 -0.316531 -0.105688 +0.359676 -0.312039 -0.120645 +-0.299702 -0.0703681 -0.0485657 +-0.293229 -0.0945466 -0.0486443 +-0.297962 -0.324611 -0.102311 +-0.235843 -0.0745029 -0.031069 +0.183361 -0.420584 -0.111469 +0.323338 -0.320984 -0.109819 +0.405905 -0.0665388 -0.08851 +0.263441 -0.399172 -0.121786 +0.271237 -0.177342 -0.053966 +0.140671 -0.394927 -0.0921211 +0.256411 0.031768 -0.0339543 +-0.425549 0.0350113 -0.0957421 +0.285745 -0.329269 -0.100038 +0.179832 -0.0792098 -0.019497 +-0.388563 -0.161135 -0.0927766 +0.185301 -0.0347342 -0.0179322 +0.217179 -0.338012 -0.0842593 +0.244944 -0.214823 -0.0545618 +0.332334 -0.327026 -0.115349 +0.29881 -0.148934 -0.0573807 +0.12777 -0.130298 -0.0167924 +-0.110143 -0.318819 -0.0586058 +-0.0510784 -0.180337 -0.0177223 +-0.0105278 0.365798 -0.0693651 +-0.172343 -0.348544 -0.0786883 +-0.0479021 -0.375349 -0.0743551 +-0.153055 -0.350763 -0.0761281 +0.10315 -0.354693 -0.0707244 +0.27542 -0.34415 -0.10239 +-0.439627 -0.171023 -0.118252 +-0.315096 -0.341318 -0.11444 +-0.00295265 -0.192131 -0.0186351 +-0.30982 -0.0701186 -0.0517939 +-0.0987125 -0.433544 -0.10429 +-0.252075 -0.275214 -0.0722523 +-0.0559983 -0.415704 -0.0922256 +0.458993 -0.0756153 -0.114784 +-0.0713979 -0.360583 -0.0700094 +-0.146116 -0.35818 -0.0778519 +-0.230269 -0.112948 -0.0334499 +-0.263192 -0.349462 -0.100774 +0.419888 0.00656932 -0.0924477 +0.00105621 -0.400239 -0.08359 +-0.113189 -0.196728 -0.0260974 +0.274172 -0.385386 -0.118917 +-0.093335 -0.362832 -0.0728314 +0.240007 -0.281505 -0.0709405 +0.2567 0.0393726 -0.0343112 +0.135637 -0.398066 -0.0927262 +0.206609 -0.150675 -0.0332478 +0.0949652 -0.152687 -0.0162987 +0.204001 -0.359127 -0.0892799 +-0.41526 0.0486995 -0.0916018 +0.239692 0.402044 -0.11631 +0.0423501 0.400704 -0.0847716 +-0.137478 -0.436511 -0.110867 +-0.232022 -0.416767 -0.121097 +0.3791 -0.0120286 -0.0747223 +0.158082 -0.364346 -0.0822517 +0.385279 -0.26898 -0.117272 +-0.239789 -0.295884 -0.0753629 +-0.155632 -0.454356 -0.12288 +-0.214665 -0.399147 -0.108596 +-0.00643909 -0.372133 -0.0718429 +0.19514 -0.365638 -0.0899292 +-0.253371 -0.360733 -0.102406 +0.27604 -0.301613 -0.0874041 +-0.147088 0.376355 -0.0852747 +-0.186682 -0.36794 -0.089083 +-0.0786815 -0.448998 -0.109938 +0.151415 -0.4212 -0.105761 +-0.238155 -0.0262136 -0.0291267 +0.432613 -0.0707652 -0.101202 +0.399965 0.0219372 -0.0837323 +-0.140339 0.104913 -0.0154705 +0.376468 -0.112922 -0.080478 +-0.0784653 -0.451763 -0.111319 +0.355998 0.100381 -0.0709204 +0.315789 0.0332618 -0.0517536 +-0.337222 0.0969939 -0.0635847 +0.444501 0.098857 -0.109693 +0.175496 -0.22246 -0.0409836 +-0.022023 -0.281663 -0.0407394 +-0.468384 0.086692 -0.120739 +-0.404557 0.0625712 -0.0876303 +-0.360847 -0.308142 -0.119751 +-0.311342 -0.02138 -0.0499426 +0.0652219 -0.444955 -0.106825 +-0.12842 0.0701633 -0.0107652 +0.11085 -0.220704 -0.0309789 +0.227136 -0.365481 -0.0973193 +-0.196632 -0.312887 -0.0707865 +0.202984 0.00283962 -0.020822 +-0.204108 -0.428245 -0.11969 +0.204628 0.00734109 -0.0211877 +-0.0375622 -0.445814 -0.105663 +0.407011 -0.156419 -0.10007 +-0.33101 -0.0330516 -0.0569517 +-0.122497 -0.376727 -0.0818111 +-0.476177 -0.0243598 -0.120988 +0.00458065 -0.475112 -0.120086 +0.0552389 0.262063 -0.0365316 +0.291738 -0.101463 -0.0488986 +0.137422 0.0608017 -0.0113552 +-0.319678 -0.217651 -0.0778103 +0.401773 -0.208658 -0.108349 +-0.38271 -0.200593 -0.0981711 +0.300461 -0.214526 -0.0706444 +0.119539 -0.390172 -0.0870507 +0.448675 -0.137852 -0.117001 +-0.0700967 -0.237377 -0.0311147 +0.0575396 0.0854385 -0.00531942 +0.22662 -0.00779162 -0.026048 +-0.382474 -0.277602 -0.118722 +0.353346 0.0853774 -0.0684114 +-0.138544 -0.387326 -0.0885263 +-0.014461 -0.20652 -0.0216646 +0.22378 -0.200446 -0.0461951 +0.0889953 -0.115096 -0.0106402 +0.216603 -0.212445 -0.0471359 +0.328854 -0.0239166 -0.0559221 +0.0202204 -0.376675 -0.0738754 +0.056599 -0.113061 -0.00802531 +0.337259 0.0183973 -0.058768 +0.436885 -0.109033 -0.107115 +0.433808 -0.161483 -0.113584 +-0.109186 -0.404642 -0.0920665 +0.130687 -0.403831 -0.0945491 +-0.24264 -0.38858 -0.111106 +0.312495 -0.116305 -0.0572276 +-0.358429 0.0977745 -0.0715773 +0.140582 -0.433855 -0.110052 +0.143491 -0.22191 -0.0355486 +-0.0671495 -0.476789 -0.123551 +-0.122785 -0.381185 -0.083691 +-0.173318 -0.225957 -0.0414052 +0.293431 -0.0979478 -0.0490508 +0.242991 -0.157241 -0.0428006 +0.0684652 0.325095 -0.0568002 +0.149302 0.348269 -0.0745719 +-0.0805337 -0.153697 -0.0151693 +0.169971 0.10545 -0.0202091 +-0.307465 -0.0701823 -0.0510324 +0.0437952 -0.43017 -0.0983152 +-0.0571721 -0.435713 -0.101732 +-0.303267 -0.108387 -0.0532787 +-0.0373836 -0.373527 -0.0731342 +0.151907 0.0925013 -0.0159433 +0.157179 -0.0153055 -0.0125485 +0.172051 -0.364521 -0.0848371 +0.279218 0.0248053 -0.0400926 +0.270548 -0.0863847 -0.041177 +0.332746 -0.191152 -0.0765603 +0.297592 0.105737 -0.0511805 +0.335714 0.165075 -0.0726131 +0.444165 -0.19023 -0.124483 +-0.0961032 -0.221239 -0.0295271 +0.328093 -0.0926604 -0.0599103 +-0.393583 0.076503 -0.0838998 +0.187068 0.0807733 -0.0209795 +-0.196764 -0.163805 -0.0333293 +-0.371113 0.104207 -0.0772781 +-0.298363 -0.147204 -0.0569675 +-0.246042 -0.179777 -0.0475592 +-0.349242 -0.1562 -0.0760784 +-0.401078 -0.0329562 -0.0845492 +0.0105984 -0.387994 -0.078399 +-0.37219 -0.227424 -0.100137 +-0.20625 0.0643139 -0.0236166 +0.423 -0.12853 -0.103032 +-0.0577585 -0.371569 -0.0733932 +-0.25315 0.048311 -0.0337799 +0.207722 -0.132756 -0.0308625 +0.159377 -0.155176 -0.0250542 +-0.0609934 -0.379158 -0.0766806 +0.203364 0.0557221 -0.0224836 +-0.179402 0.102062 -0.0215328 +0.181133 -0.170406 -0.0314171 +-0.308796 -0.161596 -0.0626998 +0.140966 -0.297747 -0.0558203 +0.174008 -0.434771 -0.116431 +0.270311 -0.019135 -0.0374171 +0.328428 -0.183532 -0.0734738 +0.358575 0.00343484 -0.0665053 +0.22886 -0.14804 -0.0378632 +-0.260586 -0.222363 -0.0605058 +0.330264 -0.16873 -0.0713149 +-0.108993 -0.202723 -0.0268484 +-0.130199 -0.420453 -0.102076 +0.00813332 -0.178703 -0.0161306 +-0.302379 0.0899153 -0.0510625 +-0.262519 -0.0817656 -0.0385438 +-0.000374915 -0.0213077 -0.000227104 +-0.439259 0.0688806 -0.104284 +-0.158483 -0.378965 -0.0882605 +0.462865 -0.114155 -0.120953 +0.153924 -0.116817 -0.018847 +-0.07817 -0.426868 -0.0990709 +-0.165621 0.0187106 -0.0139881 +0.117158 -0.420782 -0.100435 +-0.142105 -0.306845 -0.058909 +-0.0629666 -0.179828 -0.0183192 +-0.0472103 -0.41654 -0.0921094 +0.0669336 -0.233492 -0.0299476 +0.250283 -0.162879 -0.0456265 +-0.197477 -0.0717127 -0.022319 +-0.16722 0.0673577 -0.016384 +-0.0598302 -0.37471 -0.0747904 +-0.176107 -0.398557 -0.0999228 +-0.146507 -0.158841 -0.0236265 +-0.218521 0.0991439 -0.0292173 +0.122102 -0.206377 -0.0291757 +0.00704789 -0.0359758 -0.000672191 +-0.457837 0.100693 -0.116685 +0.391324 -0.0890873 -0.0840694 +0.000341764 -0.433791 -0.0989867 +0.0786589 -0.219456 -0.0275537 +0.104503 -0.379636 -0.0807852 +0.0297006 -0.375264 -0.0735578 +0.248919 -0.0715562 -0.0341226 +-0.0306275 0.108798 -0.00640809 +0.176972 -0.231498 -0.0433968 +0.365092 -0.0717808 -0.0717999 +-0.292254 -0.186219 -0.0619648 +-0.218372 -0.190281 -0.0428653 +0.249595 0.106762 -0.0375531 +-0.428311 0.0829969 -0.100188 +0.446964 0.00183618 -0.10545 +0.336857 -0.213931 -0.08307 +-0.203107 -0.176259 -0.0368382 +-0.395138 -0.123178 -0.0896743 +-0.10034 0.0587089 -0.00678037 +-0.191227 -0.201269 -0.0393111 +-0.310786 -0.15278 -0.0618793 +-0.267259 0.0337916 -0.0369678 +-0.00849633 -0.185705 -0.0174313 +-0.206378 -0.175107 -0.0373238 +0.308549 -0.168862 -0.0639 +-0.322155 -0.0340587 -0.0539258 +0.466106 0.0350034 -0.115964 +0.0266931 -0.174229 -0.0156567 +0.416934 0.103527 -0.0969784 +0.116498 -0.0768898 -0.00978986 +0.185647 -0.117963 -0.0244899 +0.218649 0.0710446 -0.026786 +0.466089 -0.0132696 -0.115362 +-0.208524 -0.0849627 -0.0256802 +0.210328 -0.144521 -0.0331102 +0.255158 0.0883022 -0.0371411 +-0.477859 0.0241658 -0.121896 +0.336111 0.0670812 -0.0605695 +-0.256043 0.0475537 -0.0345049 +-0.0732688 0.0969343 -0.00740974 +-0.217331 0.0513616 -0.0252542 +0.0836812 -0.0761742 -0.00642316 +-0.239735 -0.0338743 -0.0297529 +0.0974702 -0.0358054 -0.00540585 +0.204923 -0.034969 -0.0218468 +0.232809 0.0941585 -0.0320465 +0.315728 -0.0151797 -0.0512717 +0.0715004 0.00293981 -0.00256376 diff --git a/image_analysis/indexing/fast-feedback-indexer/data/image7_local.txt b/image_analysis/indexing/fast-feedback-indexer/data/image7_local.txt new file mode 100644 index 000000000..17a26988f --- /dev/null +++ b/image_analysis/indexing/fast-feedback-indexer/data/image7_local.txt @@ -0,0 +1,295 @@ +36.9 0 0 4.83429e-15 78.95 0 4.83429e-15 4.83429e-15 78.95 +-0.0231968 0.474506 -0.120054 +0.0402336 0.47135 -0.118972 +-0.0327933 0.471799 -0.118904 +-0.275246 -0.0134579 -0.0387205 +-0.290471 0.0550615 -0.0447017 +-0.23371 0.353283 -0.0941464 +-0.286175 -0.225355 -0.0687005 +0.432811 -0.0703599 -0.101265 +0.179805 -0.0790882 -0.0194821 +0.299992 -0.21416 -0.0704087 +-0.44014 -0.079601 -0.105606 +-0.124925 0.354456 -0.07331 +-0.390886 -0.0208156 -0.0797962 +-0.382869 -0.107964 -0.0825277 +-0.221541 0.380097 -0.101977 +-0.20102 0.413648 -0.112032 +-0.218563 -0.19026 -0.0429047 +0.291969 -0.101371 -0.0489594 +0.336016 0.0670483 -0.0605332 +-0.360596 0.117919 -0.0747619 +-0.412471 -0.13932 -0.0997457 +0.140149 -0.434321 -0.110212 +-0.167236 -0.108769 -0.0201013 +-0.417249 -0.100394 -0.0967702 +0.254425 -0.110099 -0.0391952 +-0.337453 -0.19258 -0.0785669 +-0.404545 0.0627719 -0.0876389 +0.122111 -0.206175 -0.029134 +0.18568 -0.117825 -0.0244795 +0.437134 -0.10874 -0.107201 +0.376336 -0.112743 -0.0804022 +-0.309556 -0.116084 -0.0562312 +-0.419757 -0.11147 -0.0992344 +0.0355529 -0.231804 -0.0278873 +-0.348641 -0.115029 -0.0698293 +-0.303446 0.251798 -0.0810232 +-0.468828 -0.111284 -0.123749 +-0.425823 0.0352606 -0.0958809 +0.462991 -0.114028 -0.121002 +-0.241053 -0.126495 -0.0377671 +-0.394175 -0.122954 -0.0892266 +-0.241386 0.347097 -0.0937677 +-0.383691 0.25255 -0.111744 +0.395711 -0.127331 -0.0904946 +-0.439802 -0.171041 -0.118343 +0.422356 -0.132706 -0.103337 +0.328182 -0.0925805 -0.0599332 +-0.252464 -0.141445 -0.0427879 +-0.162408 0.416257 -0.105375 +0.267172 -0.0956097 -0.0411059 +-0.383455 -0.139345 -0.0870128 +0.207839 -0.150399 -0.0334685 +0.0951463 -0.15273 -0.0163228 +-0.298484 -0.146673 -0.056923 +0.284353 0.36633 -0.114029 +-0.00862047 -0.287206 -0.0421699 +-0.0373465 0.380275 -0.0758809 +-0.0797617 -0.288566 -0.0458681 +0.312547 -0.116184 -0.0572299 +-0.326285 0.110941 -0.0612612 +0.387522 0.211501 -0.10273 +0.18828 -0.232806 -0.0458764 +-0.308901 -0.16145 -0.0627092 +-0.235161 -0.16524 -0.0421925 +-0.388671 -0.160947 -0.0927896 +-0.0952824 -0.340371 -0.0645487 +0.0164403 0.293463 -0.0441711 +0.405774 0.136463 -0.0962715 +-0.370924 0.104275 -0.0772095 +0.271677 -0.177434 -0.0541095 +-0.230412 -0.112928 -0.0334818 +-0.295196 -0.181058 -0.0618758 +-0.0741288 -0.192925 -0.0215907 +0.391409 -0.179741 -0.0975078 +-0.190825 -0.200866 -0.039147 +-0.261572 0.199998 -0.0557644 +-0.147956 -0.407145 -0.0987 +0.313124 -0.265307 -0.0880978 +-0.137601 -0.435778 -0.110526 +0.342321 0.183624 -0.0785344 +0.423291 0.114144 -0.101225 +-0.400148 -0.216983 -0.109607 +0.143402 -0.222004 -0.035557 +-0.303289 -0.108277 -0.053273 +-0.135219 -0.223418 -0.0347021 +-0.137399 0.459977 -0.122764 +0.227202 -0.365176 -0.0972121 +-0.173727 -0.226074 -0.0415066 +-0.354386 -0.168897 -0.0802805 +-0.066909 -0.476724 -0.123497 +0.303153 -0.22096 -0.0730291 +0.407362 -0.156356 -0.100217 +-0.0670042 -0.187137 -0.019954 +-0.433698 -0.209454 -0.123624 +0.207593 -0.26656 -0.0588035 +-0.365545 -0.224167 -0.0966029 +0.264605 -0.303858 -0.0847652 +-0.271191 -0.334923 -0.0976241 +-0.259404 -0.235579 -0.0634039 +-0.372531 -0.226983 -0.100167 +0.352989 0.261025 -0.101521 +-0.253667 0.268184 -0.0706292 +0.323673 -0.278193 -0.0956527 +-0.211788 0.21697 -0.0470729 +0.447075 0.00178899 -0.105505 +-0.331523 -0.231989 -0.0855201 +0.411807 -0.237056 -0.120103 +-0.37704 -0.281549 -0.117633 +0.376166 0.247085 -0.107 +0.313661 -0.249852 -0.0839265 +0.275399 -0.344156 -0.102385 +0.358682 0.00356121 -0.066547 +0.276158 -0.258018 -0.074169 +0.120482 0.335425 -0.0656691 +-0.314221 -0.256181 -0.0858686 +-0.32967 -0.257923 -0.0918187 +-0.0692253 -0.274651 -0.0409512 +0.250289 -0.162868 -0.0456264 +0.356566 0.327036 -0.124838 +0.395391 0.11841 -0.0891515 +0.38684 -0.275308 -0.119909 +-0.275404 0.353713 -0.10611 +0.473022 -0.00280937 -0.118954 +0.364431 0.282439 -0.112634 +0.205804 -0.39325 -0.103898 +0.431187 0.18266 -0.11642 +0.129622 -0.446863 -0.114838 +-0.222567 0.316138 -0.0777631 +0.419831 0.00675916 -0.092423 +0.293492 0.323151 -0.100313 +0.210358 -0.144286 -0.0330817 +-0.412791 0.156138 -0.102657 +0.399405 -0.0265753 -0.0836106 +0.0115641 -0.429081 -0.0968079 +0.337234 0.0185768 -0.0587626 +-0.0985664 -0.432856 -0.103942 +0.0943289 -0.328603 -0.0602542 +-0.23824 0.292131 -0.0737704 +-0.0692336 -0.439636 -0.104496 +0.339646 -0.212089 -0.0836711 +-0.0381343 -0.445106 -0.105335 +0.263879 -0.399366 -0.122005 +0.0974261 -0.44619 -0.11038 +0.359795 -0.26926 -0.106665 +0.244124 -0.276993 -0.070657 +-0.476042 -0.0239693 -0.120904 +0.0282479 -0.468998 -0.117253 +-0.0168623 -0.460524 -0.112513 +-0.415142 0.0489122 -0.0915592 +0.240212 0.356085 -0.0969484 +0.30748 0.232913 -0.0773908 +-0.336822 0.0968451 -0.0634253 +-0.15644 -0.454376 -0.123034 +-0.0269098 -0.46072 -0.112863 +-0.259126 0.212864 -0.0579051 +-0.269944 -0.376789 -0.113907 +-0.296938 0.206505 -0.0676997 +-0.338128 0.259 -0.0952413 +0.274994 0.12133 -0.0462405 +-0.432455 0.187069 -0.117964 +-0.29776 -0.323423 -0.101815 +-0.187877 -0.368424 -0.0895242 +0.409471 0.197298 -0.109266 +-0.270294 -0.342347 -0.100145 +0.252056 -0.313697 -0.0845426 +-0.46827 0.0869058 -0.120699 +-0.232382 -0.416881 -0.121246 +-0.348484 0.0833087 -0.0663948 +0.416491 0.0266945 -0.091252 +-0.201153 -0.384909 -0.0992323 +-0.204154 -0.427498 -0.119337 +0.275967 -0.30162 -0.0873841 +0.0435181 -0.431314 -0.0988482 +0.0699735 0.390036 -0.081863 +-0.109596 -0.404885 -0.0922244 +-0.424645 0.142558 -0.105934 +-0.158369 -0.378558 -0.0880717 +-0.457709 0.100864 -0.116638 +0.465961 0.0353639 -0.115902 +-0.0102086 -0.372312 -0.0719487 +0.000916354 -0.400368 -0.0836462 +0.187971 0.384679 -0.0962915 +-0.196846 -0.339333 -0.0801605 +0.0444856 0.282478 -0.0417583 +0.194881 -0.406882 -0.107549 +-0.315595 -0.34148 -0.11468 +-0.269003 -0.250391 -0.0699778 +0.361161 -0.00652736 -0.0675195 +-0.345918 0.190462 -0.0812699 +0.244455 0.412075 -0.122255 +0.228308 -0.323282 -0.0816514 +-0.382489 0.0904925 -0.0804822 +-0.297382 -0.281834 -0.0877864 +-0.080796 -0.373474 -0.0758847 +-0.0806193 -0.330793 -0.0597467 +0.29339 0.0479928 -0.0452127 +0.288105 0.312038 -0.094667 +0.323499 -0.321441 -0.110043 +0.06521 -0.44473 -0.106712 +0.115772 -0.343453 -0.0679931 +-0.188696 0.379506 -0.0942578 +-0.443844 0.173053 -0.120764 +0.0218163 -0.416199 -0.0909884 +0.00439963 -0.475091 -0.120074 +-0.402524 0.169779 -0.100473 +-0.309976 0.361667 -0.120732 +-0.183932 0.318402 -0.0700596 +0.284271 0.190149 -0.0603015 +-0.0199264 -0.343244 -0.0609653 +0.139632 0.461553 -0.123946 +-0.241329 -0.26043 -0.0651544 +-0.242407 -0.387832 -0.110717 +0.274299 -0.385172 -0.118863 +-0.416825 -0.193111 -0.111763 +-0.214591 -0.398865 -0.108453 +-0.314042 0.0757108 -0.0536146 +0.173458 -0.396114 -0.0983317 +0.126528 0.367645 -0.0786813 +0.380518 0.143929 -0.0864953 +-0.144745 0.321097 -0.0640803 +0.289741 0.376358 -0.119997 +-0.119625 -0.375665 -0.0809976 +0.333203 0.115104 -0.064197 +0.317678 0.140232 -0.0622282 +0.218266 0.24113 -0.05437 +0.325174 0.208209 -0.0775518 +0.403457 0.18663 -0.104237 +-0.0566941 0.410475 -0.0898921 +-0.104751 0.324728 -0.0600111 +-0.121411 -0.389793 -0.0871359 +0.198825 0.384029 -0.0983402 +-0.224576 -0.327826 -0.0823423 +0.0758722 0.16758 -0.0170654 +0.197854 -0.355954 -0.0866815 +0.0729976 0.109294 -0.0086745 +0.286405 -0.286749 -0.0858079 +0.0684883 0.324788 -0.0566961 +0.0312144 -0.451271 -0.108159 +0.135776 0.267842 -0.0461522 +0.169844 0.105528 -0.0201956 +0.126641 -0.329841 -0.0644965 +0.242209 0.284059 -0.0722906 +0.161709 0.312122 -0.0638216 +-0.0268753 0.465557 -0.11539 +-0.288504 0.275394 -0.0829813 +-0.28819 0.162472 -0.0563109 +0.189419 -0.0166898 -0.0182455 +-0.269561 0.244796 -0.0686507 +0.0129511 0.347227 -0.0623082 +0.37746 0.0855565 -0.0779349 +-0.425208 -0.0139313 -0.0950113 +-0.0513978 0.0940636 -0.00576145 +0.465609 -0.0132734 -0.115109 +-0.394904 0.238377 -0.112742 +0.242213 0.0161828 -0.029912 +0.398643 0.0704087 -0.0856007 +-0.416767 0.0971591 -0.0961942 +0.212997 0.399975 -0.108567 +-0.293422 0.0200712 -0.0442277 +-0.477961 0.0242627 -0.121954 +0.295535 0.267574 -0.0829049 +0.346218 0.305668 -0.113039 +0.109577 0.0407189 -0.00685606 +0.202937 0.330741 -0.0783563 +-0.215154 0.157873 -0.0362652 +0.203648 0.322879 -0.075729 +-0.188328 0.19581 -0.0376118 +-0.157592 0.157917 -0.0252041 +0.464382 0.0837582 -0.118335 +0.173093 0.163822 -0.0288147 +-0.179248 0.102208 -0.0215198 +-0.307193 0.306292 -0.0989904 +0.41654 0.103864 -0.096835 +-0.253906 0.155605 -0.0453699 +0.141282 0.165183 -0.0239088 +-0.368398 0.162701 -0.0846796 +-0.322714 0.169661 -0.0688338 +-0.23842 0.178786 -0.0454365 +-0.356697 0.176847 -0.082671 +-0.0134652 0.359027 -0.0667699 +0.192752 0.197237 -0.0387799 +-0.376128 0.207492 -0.0969634 +-0.330464 0.21401 -0.0807648 +-0.410199 0.21472 -0.113641 +0.116747 0.234514 -0.034923 +-0.291526 0.329933 -0.102138 +0.254385 0.249158 -0.0655437 +0.358972 0.271458 -0.107 +0.351729 0.316659 -0.119083 +0.0186591 0.421908 -0.0935534 +0.177984 0.320929 -0.0697708 +0.0421013 0.400692 -0.084755 +-0.104057 0.389353 -0.0848081 +0.0975798 0.378207 -0.0794363 diff --git a/image_analysis/indexing/fast-feedback-indexer/data/image7_peakfinder8.txt b/image_analysis/indexing/fast-feedback-indexer/data/image7_peakfinder8.txt new file mode 100644 index 000000000..0564905f5 --- /dev/null +++ b/image_analysis/indexing/fast-feedback-indexer/data/image7_peakfinder8.txt @@ -0,0 +1,913 @@ +36.9 0 0 4.83429e-15 78.95 0 4.83429e-15 4.83429e-15 78.95 +-0.142113 -0.72538 -0.326481 +0.278097 -0.702649 -0.34506 +-0.0583023 -0.715882 -0.304217 +-0.073201 -0.697027 -0.286701 +-0.41739 -0.621222 -0.336774 +0.372292 -0.631902 -0.320222 +0.335772 -0.64087 -0.30968 +0.0851654 -0.675615 -0.267681 +0.0531349 -0.674514 -0.263653 +0.102345 -0.657779 -0.253775 +-0.032762 -0.657907 -0.247613 +0.177648 -0.646388 -0.25796 +0.0381743 -0.655657 -0.245907 +-0.263511 -0.63235 -0.271512 +-0.190648 -0.636691 -0.25282 +-0.449083 -0.577773 -0.318455 +-0.408274 -0.580529 -0.295516 +-0.374039 -0.587625 -0.28251 +-0.10723 -0.627682 -0.228951 +-0.0303279 -0.621226 -0.216955 +-0.260849 -0.595383 -0.240081 +-0.289035 -0.585202 -0.242374 +-0.0522715 -0.60829 -0.208008 +-0.316804 -0.574118 -0.245001 +-0.0128048 -0.603684 -0.202879 +0.234292 -0.583843 -0.222675 +0.133374 -0.590446 -0.20402 +0.453954 -0.531406 -0.284784 +-0.17133 -0.583159 -0.205915 +0.0363565 -0.588167 -0.192078 +-0.265374 -0.563913 -0.217965 +0.219441 -0.565252 -0.204804 +0.324722 -0.548548 -0.229513 +0.50729 -0.499566 -0.297796 +-0.192297 -0.56794 -0.199709 +0.361509 -0.539949 -0.239891 +-0.321014 -0.541825 -0.223227 +0.0861073 -0.570448 -0.183192 +0.29908 -0.543698 -0.215817 +0.336809 -0.535595 -0.225599 +-0.417034 -0.516223 -0.251938 +0.372906 -0.526466 -0.235949 +0.161415 -0.558907 -0.186631 +0.310808 -0.53059 -0.211411 +-0.24134 -0.541693 -0.194815 +0.347373 -0.522609 -0.221404 +-0.572612 -0.457125 -0.319447 +0.000359049 -0.553271 -0.166999 +-0.269206 -0.530961 -0.196502 +0.284243 -0.52478 -0.197621 +-0.297096 -0.520021 -0.19918 +-0.461339 -0.48015 -0.253929 +0.0822215 -0.537892 -0.161006 +-0.324511 -0.508473 -0.202411 +0.295921 -0.511945 -0.193561 +0.157844 -0.527064 -0.164962 +-0.0236881 -0.505382 -0.137429 +-0.397194 -0.461504 -0.206746 +0.292987 -0.479175 -0.172625 +0.154746 -0.49401 -0.144425 +0.470386 -0.439348 -0.234683 +-0.256221 -0.4805 -0.161268 +0.0575613 -0.492219 -0.131434 +0.402108 -0.452435 -0.204003 +-0.0447623 -0.491645 -0.130355 +0.0260716 -0.489807 -0.128559 +-0.284053 -0.469559 -0.164041 +-0.144465 -0.482238 -0.135953 +0.304038 -0.465504 -0.168816 +0.165649 -0.481798 -0.139517 +-0.211054 -0.474197 -0.145252 +0.377624 -0.447991 -0.189627 +-0.105866 -0.479496 -0.128865 +0.551612 -0.401951 -0.269138 +-0.239239 -0.463397 -0.146754 +-0.066949 -0.476709 -0.123492 +-0.408591 -0.434146 -0.197148 +0.00443038 -0.475238 -0.120154 +0.520774 -0.406448 -0.249271 +0.314948 -0.451998 -0.165431 +0.351618 -0.443259 -0.175448 +0.387541 -0.433807 -0.186597 +-0.193772 -0.456582 -0.131677 +0.220013 -0.454201 -0.136695 +0.288291 -0.446391 -0.152873 +0.325478 -0.437652 -0.161832 +-0.29468 -0.441053 -0.152276 +-0.0169727 -0.460632 -0.112571 +-0.156491 -0.454534 -0.123125 +-0.499703 -0.397818 -0.23056 +0.361942 -0.428704 -0.172225 +0.465528 -0.406622 -0.213907 +-0.222278 -0.446259 -0.133141 +0.397851 -0.419914 -0.184287 +0.230907 -0.441201 -0.132807 +-0.563537 -0.373717 -0.263276 +-0.459255 -0.401042 -0.207378 +0.129647 -0.446835 -0.114828 +0.0974115 -0.446328 -0.110448 +0.507546 -0.388091 -0.230726 +0.37222 -0.414955 -0.16978 +-0.038139 -0.445237 -0.1054 +0.0651831 -0.444691 -0.106691 +-0.278158 -0.42389 -0.138057 +-0.137609 -0.435896 -0.110586 +0.172516 -0.434093 -0.115805 +0.140179 -0.43442 -0.110265 +-0.204233 -0.427722 -0.119465 +-0.0987714 -0.433105 -0.104085 +-0.516794 -0.373186 -0.229509 +0.450961 -0.388041 -0.196223 +-0.305107 -0.412236 -0.14153 +0.0434711 -0.431076 -0.0987323 +0.0114741 -0.42898 -0.0967589 +0.183543 -0.420427 -0.111432 +-0.232236 -0.416761 -0.12115 +0.252817 -0.413578 -0.125336 +-0.367227 -0.393916 -0.1574 +-0.43568 -0.379766 -0.183936 +-0.0558048 -0.420752 -0.0945423 +0.0218166 -0.416168 -0.0909739 +0.194817 -0.406915 -0.10755 +0.263938 -0.399386 -0.122032 +-0.287688 -0.394642 -0.127364 +-0.148068 -0.407287 -0.0987823 +-0.533295 -0.348032 -0.228981 +-0.214688 -0.399214 -0.108632 +0.435598 -0.368901 -0.178924 +-0.109664 -0.404997 -0.0922826 +-0.315778 -0.384002 -0.132344 +-0.350411 -0.376893 -0.142583 +-0.0704291 -0.402002 -0.0870737 +0.205814 -0.393231 -0.103892 +-0.24251 -0.387977 -0.110808 +0.000906227 -0.400507 -0.0837067 +0.274307 -0.385193 -0.118874 +0.410873 -0.364312 -0.164261 +0.478197 -0.350908 -0.194897 +-0.45266 -0.354997 -0.182029 +-0.270211 -0.377273 -0.114194 +0.216633 -0.379292 -0.10044 +0.385112 -0.359202 -0.149904 +0.284836 -0.371586 -0.116376 +-0.158424 -0.378566 -0.0880846 +0.322049 -0.362844 -0.12557 +-0.119742 -0.375822 -0.0810769 +-0.510022 -0.326682 -0.204289 +0.358555 -0.353917 -0.136182 +0.227231 -0.365302 -0.0972703 +-0.0807639 -0.373301 -0.075812 +-0.469543 -0.330124 -0.18113 +-0.187877 -0.368424 -0.0895242 +0.46235 -0.331883 -0.177756 +-0.00998651 -0.372373 -0.0719705 +0.503856 -0.313517 -0.195117 +-0.315721 -0.341543 -0.11475 +0.275417 -0.344081 -0.102362 +-0.527296 -0.303466 -0.206358 +-0.270294 -0.342347 -0.100145 +-0.0571952 -0.355207 -0.0669637 +0.639029 -0.270394 -0.27991 +-0.271317 -0.335034 -0.0977034 +-0.412 -0.316511 -0.145555 +-0.196876 -0.339467 -0.0802165 +0.217273 -0.338066 -0.0843016 +0.115772 -0.343453 -0.0679931 +-0.0199955 -0.343282 -0.0609806 +0.285927 -0.329132 -0.100045 +-0.0952824 -0.340371 -0.0645487 +-0.297899 -0.323726 -0.10197 +-0.0579055 -0.338982 -0.060991 +0.0513821 -0.339103 -0.0606552 +0.323313 -0.321315 -0.10993 +0.421107 -0.30782 -0.146821 +0.0568767 -0.33609 -0.059889 +-0.22463 -0.327749 -0.0823279 +0.360129 -0.312079 -0.120845 +-0.0805932 -0.330861 -0.0597681 +0.126449 -0.32973 -0.0644315 +0.228308 -0.323271 -0.0816476 +0.395372 -0.302953 -0.132878 +-0.0204692 -0.329396 -0.05603 +0.094406 -0.328528 -0.0602358 +-0.0666474 -0.325692 -0.0568761 +-0.0395703 -0.326725 -0.0557092 +-0.394208 -0.298008 -0.130638 +0.252056 -0.313697 -0.0845427 +-0.428663 -0.291558 -0.144873 +-0.0604354 -0.321314 -0.0549579 +-0.0721473 -0.316781 -0.0542494 +-0.315082 -0.298546 -0.0991151 +-0.104486 -0.312513 -0.0558506 +0.275967 -0.30162 -0.0873841 +0.503998 -0.271035 -0.179923 +0.00665382 -0.310512 -0.0494538 +-0.129517 -0.304716 -0.056404 +0.412515 -0.280198 -0.133213 +0.0209426 -0.305572 -0.0480615 +-0.0582449 -0.304789 -0.0493627 +-0.377151 -0.281497 -0.117664 +-0.0190921 -0.300351 -0.0463623 +-0.153477 -0.298926 -0.0581466 +0.286338 -0.286722 -0.0857784 +-0.157928 -0.293899 -0.0573007 +-0.0726423 -0.297881 -0.048165 +0.38684 -0.275308 -0.119909 +-0.297397 -0.281596 -0.0877178 +0.323731 -0.278243 -0.0956884 +-0.11904 -0.291097 -0.0507412 +-0.0797489 -0.288429 -0.0458254 +-0.0430385 -0.288836 -0.0435893 +0.35975 -0.269236 -0.10664 +0.520259 -0.247413 -0.182615 +-0.00879681 -0.287279 -0.0421933 +0.228674 -0.28061 -0.0678162 +-0.186784 -0.282768 -0.0591739 +0.244124 -0.276993 -0.070657 +-0.188072 -0.278489 -0.0581545 +-0.50932 -0.241971 -0.174141 +0.462915 -0.246978 -0.1487 +-0.46859 -0.245017 -0.151242 +-0.0690953 -0.274464 -0.0408882 +-0.0268588 -0.276393 -0.0393306 +0.0607687 -0.275058 -0.0404948 +0.169285 -0.271298 -0.0525087 +0.00183536 -0.273651 -0.0381728 +0.207514 -0.266467 -0.0587598 +-0.314452 -0.256414 -0.0860131 +0.276078 -0.258087 -0.0741641 +0.437844 -0.242159 -0.134176 +-0.241298 -0.260523 -0.0651721 +0.59635 -0.214074 -0.226347 +-0.0963701 -0.263585 -0.0401897 +-0.197611 -0.258778 -0.0544928 +0.313681 -0.249884 -0.0839421 +-0.0591011 -0.262256 -0.0368133 +-0.268993 -0.250255 -0.0699382 +0.411807 -0.237056 -0.120103 +-0.221461 -0.250724 -0.0576135 +0.185914 -0.251847 -0.0502585 +-0.451385 -0.227469 -0.13715 +0.083054 -0.254777 -0.0365733 +0.479007 -0.223654 -0.151159 +-0.0499326 -0.254072 -0.0341046 +0.254853 -0.24407 -0.0643292 +-0.601994 -0.200025 -0.226958 +-0.117975 -0.248225 -0.0385084 +0.144732 -0.247814 -0.0420642 +0.136971 -0.244686 -0.0401209 +-0.331449 -0.231878 -0.0854649 +-0.372531 -0.226983 -0.100167 +-0.258792 -0.235727 -0.063272 +0.201423 -0.238161 -0.0498905 +-0.365542 -0.22416 -0.0966001 +-0.14599 -0.237818 -0.0397241 +0.196696 -0.237078 -0.04863 +0.164191 -0.237105 -0.0424915 +0.54986 -0.200226 -0.189097 +0.580322 -0.195512 -0.20943 +0.609432 -0.190574 -0.230407 +0.265566 -0.229558 -0.0636358 +-0.400119 -0.216992 -0.109596 +0.18828 -0.232806 -0.0458764 +-0.107099 -0.234919 -0.0339033 +0.428621 -0.213622 -0.122133 +-0.286127 -0.225265 -0.0686639 +-0.00680232 -0.235873 -0.0282398 +-0.433778 -0.209547 -0.123686 +0.460472 -0.208119 -0.137068 +-0.15001 -0.229823 -0.038398 +0.0355597 -0.231782 -0.0278825 +0.303143 -0.220945 -0.0730223 +-0.173547 -0.2261 -0.0414803 +0.0034064 -0.229689 -0.0267419 +0.494471 -0.200053 -0.154141 +0.645621 -0.175939 -0.256886 +0.175543 -0.222228 -0.0409384 +0.402132 -0.208567 -0.10849 +-0.135266 -0.223442 -0.0347143 +-0.249378 -0.218559 -0.0565792 +0.33974 -0.21217 -0.0837244 +-0.185805 -0.220245 -0.042415 +-0.172434 -0.220752 -0.0400338 +0.143309 -0.221973 -0.0355361 +0.299992 -0.21416 -0.0704087 +-0.0960917 -0.221087 -0.0294915 +0.110671 -0.220768 -0.0309728 +-0.201525 -0.214985 -0.0444011 +0.245219 -0.214984 -0.0546695 +0.07842 -0.21997 -0.0276505 +0.469892 -0.195071 -0.1391 +-0.703416 -0.156684 -0.306706 +0.0465814 -0.217889 -0.0251386 +0.00362524 -0.217564 -0.0239606 +-0.383019 -0.200077 -0.0981874 +-0.0875777 -0.213154 -0.0269145 +-0.45844 -0.188492 -0.131493 +-0.416825 -0.193111 -0.111763 +0.255351 -0.20555 -0.055254 +0.444067 -0.190173 -0.124421 +-0.0849035 -0.206808 -0.0253094 +0.122091 -0.206155 -0.0291272 +-0.190714 -0.201482 -0.0392539 +-0.0146412 -0.2069 -0.0217475 +0.0897245 -0.205265 -0.0254151 +0.223732 -0.200295 -0.046152 +0.509153 -0.176193 -0.157552 +-0.337602 -0.192469 -0.0785985 +0.541238 -0.171549 -0.176815 +-0.607898 -0.16141 -0.222564 +0.291955 -0.192221 -0.063083 +0.128694 -0.19542 -0.0277609 +-0.0506271 -0.196241 -0.0207522 +0.484973 -0.171412 -0.142434 +-0.218542 -0.190253 -0.0428985 +0.391409 -0.179796 -0.0975187 +-0.561528 -0.161205 -0.188397 +-0.09537 -0.193344 -0.0235152 +-0.0741296 -0.192889 -0.0215836 +0.328572 -0.183476 -0.0735138 +-0.270124 -0.187009 -0.0555104 +-0.00336604 -0.192438 -0.0186967 +0.664951 -0.14295 -0.266921 +-0.439738 -0.170975 -0.118298 +-0.295196 -0.181058 -0.0618758 +0.202059 -0.185446 -0.0383441 +-0.0670042 -0.187137 -0.019954 +0.459362 -0.166441 -0.127484 +-0.246666 -0.179941 -0.0477516 +0.271569 -0.177389 -0.05407 +-0.20782 -0.177197 -0.0380168 +-0.354386 -0.168897 -0.0802805 +-0.0629442 -0.179468 -0.018252 +-0.0510988 -0.178191 -0.0173317 +0.433884 -0.161393 -0.113605 +0.00855296 -0.178182 -0.0160395 +-0.388556 -0.160841 -0.0927217 +0.584675 -0.142945 -0.201425 +0.181015 -0.170452 -0.0314032 +-0.235266 -0.165285 -0.0422261 +0.345144 -0.159979 -0.0751854 +0.407272 -0.156283 -0.100164 +-0.308731 -0.161326 -0.0626318 +0.498872 -0.14774 -0.14601 +0.250231 -0.162737 -0.0455886 +-0.196591 -0.163385 -0.0332233 +-0.229115 -0.159687 -0.0397884 +0.38039 -0.151244 -0.0876248 +0.24302 -0.157134 -0.0427904 +0.4744 -0.142704 -0.131334 +0.159235 -0.155055 -0.0250117 +-0.285857 -0.148588 -0.0533177 +0.127394 -0.154159 -0.0202012 +-0.412741 -0.139377 -0.0998785 +-0.298521 -0.146748 -0.0569462 +0.095123 -0.152753 -0.0163242 +0.207651 -0.150291 -0.0334113 +0.44885 -0.137737 -0.117072 +0.228783 -0.147971 -0.0378342 +0.422403 -0.132714 -0.10336 +0.210422 -0.144403 -0.033113 +-0.252502 -0.141323 -0.0427798 +0.36084 -0.136418 -0.0774034 +0.544401 -0.119342 -0.169708 +0.575205 -0.114706 -0.190073 +0.395711 -0.127331 -0.0904947 +0.60457 -0.109879 -0.211063 +0.20216 -0.13293 -0.0297108 +0.207624 -0.132814 -0.0308495 +-0.394175 -0.122954 -0.0892266 +-0.241126 -0.12653 -0.0377897 +0.275829 -0.124973 -0.0469521 +-0.314647 -0.123293 -0.0588326 +0.462975 -0.114003 -0.12099 +-0.469005 -0.11122 -0.123835 +-0.3487 -0.115059 -0.0698551 +0.640085 -0.0952964 -0.237629 +-0.309556 -0.116084 -0.0562312 +-0.266849 -0.118309 -0.0435511 +0.31254 -0.116146 -0.0572227 +0.376336 -0.112743 -0.0804022 +0.437095 -0.108751 -0.107183 +0.185675 -0.117818 -0.0244778 +0.153743 -0.116847 -0.0188222 +-0.230434 -0.112848 -0.0334777 +0.187308 -0.114872 -0.0244386 +-0.383059 -0.107963 -0.0826072 +-0.30325 -0.10832 -0.0532656 +0.254489 -0.110191 -0.0392226 +0.0566032 -0.113088 -0.00802858 +-0.417263 -0.100596 -0.0967991 +-0.167236 -0.108769 -0.0201013 +0.29189 -0.101402 -0.0489386 +-0.49288 -0.0907052 -0.134643 +-0.219657 -0.0989319 -0.029452 +0.509595 -0.0856488 -0.143859 +-0.293115 -0.0943796 -0.0485926 +0.267172 -0.0956098 -0.0411059 +0.328223 -0.0925958 -0.0599492 +0.391469 -0.0889121 -0.0841144 +0.484583 -0.0803667 -0.128954 +0.270678 -0.0863483 -0.0412104 +-0.44037 -0.0795491 -0.105715 +-0.609093 -0.0703079 -0.210024 +0.0537129 -0.0878637 -0.00531669 +-0.208745 -0.0849566 -0.025727 +0.458876 -0.0753109 -0.114697 +-0.562269 -0.0697058 -0.175989 +0.307642 -0.0777534 -0.05168 +0.179845 -0.0790584 -0.0194872 +0.148002 -0.0780026 -0.0140938 +0.432687 -0.0704527 -0.101213 +-0.0919729 -0.0766471 -0.00719277 +-0.236479 -0.0745087 -0.0312245 +-0.645939 -0.0575349 -0.238782 +-0.209305 -0.0722147 -0.0248197 +-0.107726 -0.0732831 -0.00852398 +0.151456 -0.0735841 -0.0142787 +0.248909 -0.0715077 -0.0341164 +-0.309074 -0.0695738 -0.0515103 +-0.197528 -0.0715878 -0.0223201 +0.0179484 -0.0734888 -0.00286548 +-0.246332 -0.0705628 -0.0333866 +0.0278624 -0.072778 -0.0030411 +-0.40108 -0.0329562 -0.08455 +-0.103052 -0.0347924 -0.00593268 +0.0397998 -0.0359482 -0.00143918 +0.110873 -0.0354416 -0.00679754 +0.279909 -0.034299 -0.0405863 +0.502754 -0.0310993 -0.13613 +0.426841 -0.031548 -0.0962236 +-0.277044 -0.0289745 -0.0395796 +-0.476157 -0.0241201 -0.120971 +0.399338 -0.0264815 -0.0835789 +0.279711 -0.0242184 -0.0402214 +-0.516814 -0.0209486 -0.144159 +-0.00433209 -0.0239929 -0.000297256 +-0.390691 -0.0207941 -0.079713 +-0.311196 -0.0213409 -0.049894 +0.548 -0.0187079 -0.163731 +0.491574 -0.0181952 -0.129354 +0.270297 -0.0191059 -0.0374127 +0.189264 -0.0165185 -0.0182127 +0.577801 -0.013873 -0.18394 +-0.425319 -0.0139941 -0.0950649 +0.315554 -0.0150334 -0.0512115 +0.523924 -0.0135012 -0.148342 +0.465609 -0.0132734 -0.115109 +0.226446 -0.0078987 -0.0260084 +0.473022 -0.00280941 -0.118954 +0.447075 0.00196959 -0.105506 +0.358597 0.00351994 -0.0665141 +0.204678 0.00709728 -0.0211963 +0.172848 0.0085896 -0.0150889 +0.41988 0.00676556 -0.0924455 +-0.623045 0.0124526 -0.217913 +-0.576699 0.0129704 -0.183146 +-0.205119 0.0158596 -0.0213915 +0.242213 0.0161828 -0.0299119 +-0.165631 0.0187373 -0.0139902 +0.33726 0.0184883 -0.0587702 +-0.277766 0.0203638 -0.039567 +-0.293422 0.0200712 -0.0442277 +0.399943 0.0220096 -0.0837241 +0.279116 0.024723 -0.040061 +-0.47801 0.0242014 -0.121979 +0.517202 0.0248096 -0.144496 +-0.518695 0.0273447 -0.145478 +0.188441 0.032252 -0.0184452 +-0.267249 0.0337602 -0.036964 +-0.0449259 0.0364406 -0.00167453 +0.315737 0.0333212 -0.0517386 +0.491967 0.0300053 -0.129904 +0.256622 0.0394806 -0.0342949 +-0.425901 0.0351674 -0.095914 +0.465984 0.0352979 -0.115911 +0.109577 0.0407189 -0.00685607 +0.22547 0.0441207 -0.0267494 +-0.256107 0.0475525 -0.0345218 +0.293265 0.0480635 -0.0451777 +0.607593 0.0388715 -0.206703 +0.271084 0.0493317 -0.0387093 +-0.415241 0.0488861 -0.0916029 +-0.548753 0.0446377 -0.165208 +0.267922 0.0543178 -0.0380917 +0.203303 0.0557648 -0.0224734 +-0.29048 0.055177 -0.044711 +-0.100336 0.0588874 -0.00679057 +-0.05109 0.0601866 -0.00312118 +-0.0934252 0.0675986 -0.00667117 +-0.404547 0.0628133 -0.0876427 +-0.167287 0.0672207 -0.016386 +0.641328 0.0535776 -0.234606 +-0.279572 0.0690063 -0.0423583 +0.336045 0.0671639 -0.0605517 +0.278388 0.0727857 -0.0422932 +-0.577359 0.0617669 -0.18585 +0.398697 0.0705483 -0.085635 +-0.31392 0.0758707 -0.0535868 +0.540333 0.0682241 -0.161319 +0.186987 0.0807492 -0.020962 +-0.478926 0.0731954 -0.125202 +-0.393645 0.0766242 -0.0839367 +0.057446 0.085492 -0.0053186 +-0.268499 0.0823909 -0.0402501 +0.515855 0.0733198 -0.146468 +0.313911 0.0815937 -0.0540602 +-0.348484 0.0833087 -0.0663947 +0.490564 0.0782436 -0.132115 +0.254846 0.0882561 -0.0370543 +0.37746 0.0855564 -0.0779349 +0.547105 0.0782348 -0.1666 +-0.302328 0.0900458 -0.0510587 +-0.0514667 0.0943832 -0.0057953 +0.464248 0.0835594 -0.118245 +0.253241 0.0933202 -0.0371082 +-0.382289 0.0903908 -0.080389 +-0.468293 0.0869377 -0.120714 +-0.218362 0.0993827 -0.0292059 +-0.337004 0.0971828 -0.063526 +-0.179308 0.102159 -0.0215257 +-0.416943 0.097096 -0.0962686 +-0.140554 0.105011 -0.0155117 +0.355943 0.100415 -0.0709029 +0.16986 0.10552 -0.0201975 +-0.0307977 0.108431 -0.0063732 +0.0729217 0.109382 -0.00867869 +0.249507 0.106679 -0.0375209 +0.298035 0.106689 -0.051426 +0.444523 0.0989199 -0.109711 +-0.371068 0.104336 -0.0772742 +-0.457682 0.100867 -0.116624 +0.416604 0.103641 -0.0968393 +0.238489 0.112885 -0.035438 +-0.326238 0.110982 -0.0612497 +0.0130595 0.121976 -0.00755281 +0.333326 0.115146 -0.0642463 +-0.241606 0.120445 -0.0371294 +0.423333 0.113945 -0.10122 +0.275169 0.12142 -0.0463024 +-0.538475 0.107165 -0.164201 +-0.360722 0.117971 -0.0748177 +-0.0508563 0.12615 -0.00929328 +0.395541 0.11846 -0.0892233 +-0.314905 0.124635 -0.0590956 +-0.63199 0.105715 -0.232268 +-0.230136 0.134265 -0.0361481 +-0.191909 0.137128 -0.0282147 +0.40215 0.129205 -0.0935887 +-0.152838 0.139908 -0.0217023 +-0.265132 0.141385 -0.04621 +0.317731 0.14029 -0.062255 +0.228098 0.147253 -0.0375615 +0.258484 0.14629 -0.0451257 +-0.0707838 0.154745 -0.0145845 +0.000148547 0.156113 -0.0122608 +0.303123 0.148079 -0.0586238 +0.380656 0.143969 -0.0865592 +-0.424464 0.142369 -0.105818 +-0.230633 0.152794 -0.0390304 +0.493197 0.136601 -0.140875 +-0.157592 0.157917 -0.0252041 +-0.253917 0.155442 -0.0453463 +0.46711 0.141616 -0.127215 +-0.215121 0.157897 -0.0362618 +-0.137101 0.163515 -0.0230323 +0.54935 0.136033 -0.175555 +0.173109 0.16384 -0.0288205 +-0.098037 0.166764 -0.0188892 +0.141837 0.165585 -0.0240574 +0.205613 0.163786 -0.0351698 +0.0758972 0.16758 -0.0170674 +-0.288044 0.162441 -0.0562608 +0.358376 0.158392 -0.0799574 +-0.412998 0.156204 -0.102764 +0.301112 0.165394 -0.0608639 +0.473579 0.152135 -0.132488 +0.654511 0.131051 -0.255392 +-0.368646 0.162867 -0.0848092 +-0.657297 0.132469 -0.258102 +0.242023 0.172794 -0.0452396 +-0.322676 0.169551 -0.0688004 +-0.546374 0.15172 -0.176315 +-0.282377 0.174206 -0.0566467 +-0.238549 0.17885 -0.0454807 +-0.276877 0.17683 -0.0555053 +-0.402524 0.169779 -0.100473 +-0.593941 0.151302 -0.209847 +-0.356697 0.176847 -0.082671 +0.425399 0.171653 -0.111422 +-0.0822194 0.190486 -0.0217592 +-0.0117914 0.191295 -0.0185383 +-0.443579 0.173211 -0.120661 +0.342239 0.183575 -0.0784943 +-0.535929 0.165875 -0.172192 +0.28422 0.190143 -0.0602848 +-0.226896 0.193196 -0.0454353 +-0.188223 0.195871 -0.0376038 +0.589936 0.161021 -0.208768 +0.192832 0.197297 -0.0388083 +-0.149129 0.198818 -0.0313762 +-0.0395175 0.20202 -0.0214162 +0.127983 0.199787 -0.0285549 +0.0636698 0.202395 -0.022768 +0.431187 0.18266 -0.11642 +-0.345986 0.190595 -0.0813231 +0.403474 0.186652 -0.104249 +-0.432512 0.187059 -0.11799 +-0.261598 0.200015 -0.0557753 +0.23021 0.20604 -0.0489212 +0.0356557 0.213309 -0.0236662 +0.409807 0.197194 -0.109398 +-0.296454 0.206734 -0.0675965 +-0.259126 0.212864 -0.0579051 +0.253515 0.21294 -0.0563968 +0.325255 0.208298 -0.0776001 +-0.42067 0.200919 -0.115314 +0.266243 0.21448 -0.0602593 +-0.211788 0.21697 -0.0470729 +-0.172846 0.219588 -0.0398409 +-0.376285 0.207551 -0.0970424 +0.167817 0.221078 -0.0392909 +-0.330561 0.214188 -0.0808412 +0.387512 0.211574 -0.102742 +0.027234 0.23071 -0.0273588 +0.180741 0.231996 -0.0442225 +0.149128 0.233564 -0.0391625 +0.214547 0.229694 -0.0506791 +-0.410199 0.21472 -0.113641 +0.0841318 0.236005 -0.0318969 +0.116747 0.234514 -0.034923 +-0.365058 0.221524 -0.0957545 +-0.503083 0.207428 -0.161024 +0.24286 0.234388 -0.0586812 +-0.450754 0.217835 -0.134339 +-0.157109 0.243342 -0.0428681 +0.307586 0.232904 -0.077424 +-0.196211 0.240608 -0.0494165 +-0.0475211 0.246949 -0.0321374 +0.218261 0.241143 -0.054372 +-0.117792 0.245701 -0.0378379 +-0.231823 0.241246 -0.0576315 +0.0245355 0.249087 -0.0318298 +0.15958 0.24671 -0.0441399 +0.147113 0.248311 -0.0425559 +-0.26962 0.244858 -0.0686839 +0.130424 0.251604 -0.0409979 +0.370723 0.23642 -0.101852 +0.254365 0.249191 -0.0655472 +-0.440068 0.231754 -0.132457 +-0.0743924 0.258876 -0.0369584 +-0.00377016 0.259838 -0.0343552 +-0.589583 0.209574 -0.219954 +-0.394904 0.238377 -0.112742 +0.168712 0.256855 -0.0483901 +0.509836 0.224243 -0.169469 +-0.303465 0.251776 -0.0810234 +0.376119 0.247147 -0.106998 +-0.47997 0.234962 -0.154766 +-0.180497 0.264291 -0.0525978 +0.140507 0.266378 -0.0464275 +-0.140804 0.267348 -0.0467427 +0.104184 0.269713 -0.0427119 +0.13604 0.268074 -0.0462551 +0.167533 0.266699 -0.0508929 +-0.383682 0.252436 -0.111707 +-0.578296 0.22348 -0.215378 +-0.338225 0.259002 -0.0952781 +0.489378 0.239296 -0.161402 +-0.0940179 0.274398 -0.0429908 +0.462811 0.24432 -0.147877 +-0.253723 0.268277 -0.0706711 +0.353153 0.261078 -0.101601 +-0.0984911 0.278898 -0.0447433 +0.20502 0.275301 -0.0607577 +0.295493 0.267604 -0.0829003 +0.0763183 0.280329 -0.0431346 +0.0444631 0.28243 -0.0417431 +0.494718 0.249642 -0.167574 +-0.288448 0.275457 -0.0829823 +0.468231 0.254295 -0.153777 +0.44046 0.259337 -0.140501 +-0.0582791 0.289526 -0.0446057 +0.359192 0.27141 -0.107074 +-0.684846 0.213674 -0.303344 +0.0164402 0.293463 -0.0441711 +0.24221 0.284059 -0.0722906 +-0.413175 0.269253 -0.130064 +-0.32269 0.282792 -0.0967282 +-0.238119 0.291969 -0.0736884 +0.473381 0.264596 -0.159822 +0.499482 0.260002 -0.173613 +-0.121975 0.299985 -0.0538863 +0.446304 0.269212 -0.146573 +0.0109601 0.302595 -0.0469439 +0.122541 0.299712 -0.053873 +0.364418 0.282207 -0.112555 +0.247567 0.294557 -0.0769905 +0.529862 0.264553 -0.194235 +0.554915 0.258765 -0.209361 +0.478221 0.274924 -0.165901 +0.503566 0.270226 -0.179391 +-0.186726 0.309267 -0.0675369 +0.128586 0.312781 -0.0589189 +0.096971 0.314222 -0.0556161 +0.284456 0.302687 -0.0903485 +0.162075 0.31213 -0.0638874 +0.0666998 0.316942 -0.0539034 +-0.442451 0.286173 -0.150093 +-0.0784116 0.31837 -0.055282 +-0.307204 0.30626 -0.0989835 +-0.183932 0.318371 -0.0700491 +-0.144791 0.32108 -0.0640816 +-0.222566 0.316138 -0.0777631 +-0.0351531 0.324907 -0.0549075 +0.559188 0.268459 -0.215629 +-0.10494 0.324628 -0.0599979 +0.068417 0.324868 -0.0567184 +0.346195 0.305714 -0.113045 +0.429173 0.29396 -0.145952 +0.456862 0.289759 -0.158979 +0.534259 0.274699 -0.200558 +0.165934 0.32195 -0.067898 +0.287976 0.311979 -0.0946055 +-0.483005 0.289362 -0.173576 +-0.386147 0.306781 -0.130072 +0.00440184 0.332027 -0.0567405 +-0.341412 0.313793 -0.114013 +0.108018 0.333419 -0.0634297 +0.0406404 0.336386 -0.0591532 +0.0748264 0.334997 -0.0607566 +0.202907 0.330555 -0.0782829 +0.434346 0.30384 -0.152047 +0.563599 0.278141 -0.222187 +0.293531 0.32315 -0.100326 +0.351621 0.316402 -0.118948 +0.120482 0.335425 -0.0656691 +0.119074 0.340435 -0.067302 +-0.291602 0.329939 -0.102164 +0.0129163 0.347214 -0.0623029 +0.239127 0.338356 -0.0898716 +0.356566 0.327035 -0.124838 +-0.416045 0.32404 -0.15035 +-0.241301 0.347074 -0.0937364 +-0.124906 0.354573 -0.073352 +-0.0134652 0.359027 -0.0667699 +-0.456772 0.326917 -0.172664 +-0.275405 0.353694 -0.106103 +-0.50887 0.316498 -0.19945 +-0.0815531 0.367152 -0.0734209 +0.0936357 0.368317 -0.0750271 +0.126528 0.367645 -0.0786813 +0.421196 0.338464 -0.158551 +-0.400671 0.347415 -0.152199 +-0.355624 0.354179 -0.135079 +-0.309749 0.361388 -0.120537 +0.0976812 0.37835 -0.0795058 +0.130377 0.377595 -0.0832536 +0.162336 0.375611 -0.0875508 +-0.0371968 0.380232 -0.0758569 +0.194773 0.374709 -0.0935472 +0.284482 0.366435 -0.114113 +0.342672 0.359979 -0.132249 +0.42568 0.348243 -0.164822 +0.453443 0.343721 -0.177659 +0.531194 0.328973 -0.219225 +0.556276 0.322876 -0.234293 +-0.221506 0.379967 -0.101913 +-0.144051 0.385437 -0.0885795 +0.0700538 0.390109 -0.0819001 +-0.104057 0.389353 -0.0848081 +0.167389 0.386272 -0.0929307 +0.19892 0.384085 -0.098385 +0.289741 0.376358 -0.119997 +0.347609 0.369874 -0.138396 +0.45781 0.353597 -0.184292 +-0.256108 0.387169 -0.114275 +0.04208 0.400727 -0.0847694 +0.560388 0.332487 -0.241437 +-0.385082 0.371144 -0.155036 +0.204244 0.394885 -0.10426 +0.352471 0.379929 -0.14477 +0.43466 0.367824 -0.177944 +0.462281 0.363193 -0.191058 +-0.0568224 0.410557 -0.0899374 +-0.289982 0.394273 -0.127957 +-0.165289 0.407084 -0.101689 +0.0147639 0.412402 -0.0891177 +0.514313 0.353603 -0.218689 +0.539689 0.347706 -0.233295 +0.563823 0.341713 -0.248111 +0.299651 0.397431 -0.132672 +0.357295 0.389974 -0.151318 +0.466266 0.372704 -0.197698 +-0.162323 0.416224 -0.105344 +0.0186769 0.422011 -0.0936018 +-0.200979 0.413735 -0.112064 +0.492918 0.368268 -0.211704 +0.244571 0.412195 -0.122344 +-0.36894 0.394756 -0.158542 +0.361768 0.399791 -0.157806 +-0.350163 0.429176 -0.167417 +-0.0543936 0.45714 -0.11227 +-0.0297294 0.457101 -0.111082 +0.136528 0.453331 -0.119176 +0.374695 0.429627 -0.178401 +-0.491187 0.404895 -0.228771 +-0.13743 0.46001 -0.122786 +-0.214938 0.454744 -0.135703 +-0.176607 0.457607 -0.128561 +0.139829 0.46177 -0.124091 +-0.0268753 0.465557 -0.11539 +0.0988045 0.463513 -0.119436 +-0.682586 0.343708 -0.355064 +0.263553 0.453458 -0.14858 +-0.0329029 0.471747 -0.11888 +0.0402336 0.47135 -0.118972 +-0.0231976 0.474627 -0.120118 +0.378453 0.43919 -0.185208 +0.112384 0.472906 -0.126084 +0.144489 0.471466 -0.130033 +-0.249128 0.461815 -0.148729 +-0.378411 0.446029 -0.188912 +0.326386 0.456761 -0.172449 +0.0843628 0.483893 -0.128949 +0.117152 0.482842 -0.132164 +0.382323 0.448787 -0.192275 +0.149357 0.481502 -0.136375 +-0.329804 0.462709 -0.177121 +0.272357 0.47231 -0.161701 +0.0894154 0.493971 -0.135132 +0.122036 0.493437 -0.138822 +0.154134 0.491481 -0.14286 +-0.279213 0.478993 -0.167771 +-0.0584061 0.496567 -0.133969 +0.276586 0.482007 -0.168634 +0.0941608 0.504249 -0.141591 +0.126628 0.503456 -0.145308 +0.158676 0.501235 -0.149362 +0.418423 0.463265 -0.218778 +-0.0371568 0.514794 -0.143492 +0.0987835 0.514358 -0.148133 +-0.185596 0.507956 -0.158849 +-0.146747 0.511569 -0.153382 +0.16347 0.511204 -0.15623 +-0.308244 0.495747 -0.188076 +0.421636 0.472844 -0.226281 +-0.0325883 0.524959 -0.149497 +-0.142502 0.520407 -0.158056 +-0.399546 0.48274 -0.220689 +0.070562 0.524547 -0.151547 +0.103484 0.52438 -0.154827 +-0.219907 0.514836 -0.171396 +0.135767 0.52294 -0.158513 +0.167847 0.520824 -0.162999 +0.527039 0.452976 -0.280943 +-0.0994827 0.532116 -0.159193 +-0.0282862 0.535382 -0.155864 +0.0752252 0.534288 -0.158051 +0.140202 0.532349 -0.165166 +0.10789 0.533713 -0.161245 +-0.216466 0.525081 -0.176937 +0.171728 0.530242 -0.169727 +-0.0944733 0.542496 -0.165271 +0.0798821 0.544306 -0.164925 +0.112359 0.543388 -0.168072 +-0.249549 0.531943 -0.190827 +0.37887 0.509304 -0.227299 +0.267858 0.533041 -0.197429 +-0.090307 0.552652 -0.171495 +0.0840361 0.553497 -0.171399 +0.116717 0.552613 -0.174775 +0.148717 0.55116 -0.178961 +-0.245896 0.542027 -0.196419 +0.271632 0.541983 -0.20472 +-0.329435 0.532676 -0.22043 +-0.0857723 0.562893 -0.177932 +0.152563 0.560579 -0.186074 +-0.375195 0.526113 -0.236826 +-0.419768 0.519971 -0.256075 +-0.0814211 0.572294 -0.184004 +0.124734 0.571578 -0.188988 +-0.274537 0.558966 -0.217576 +0.443468 0.527857 -0.275636 +0.365441 0.550414 -0.249335 +0.470287 0.523205 -0.289306 +0.368089 0.559062 -0.25706 +0.00406206 0.60351 -0.202655 +-0.450714 0.542069 -0.290762 +0.00848481 0.612385 -0.209486 +-0.344145 0.578348 -0.260352 +-0.0578097 0.621168 -0.218457 +0.0503083 0.631216 -0.226026 +-0.336059 0.5989 -0.2731 +0.179598 0.626551 -0.241595 +0.0538068 0.640011 -0.23352 +0.0871192 0.640175 -0.236726 +0.151683 0.637353 -0.244505 +0.18267 0.634715 -0.249155 +-0.00714035 0.659837 -0.248626 +-0.0782787 0.658069 -0.251123 +0.0343219 0.677953 -0.265696 +0.492781 0.59279 -0.363002 +-0.116447 0.677061 -0.273344 +-0.407314 0.624571 -0.333662 +-0.102955 0.683744 -0.277577 +0.285385 0.662379 -0.307318 +0.167781 0.681517 -0.287691 +-0.402612 0.63461 -0.340323 +-0.398253 0.644709 -0.347508 +-0.393162 0.65338 -0.35307 +0.0136475 0.713034 -0.299003 diff --git a/image_analysis/indexing/fast-feedback-indexer/data/image7_radial.txt b/image_analysis/indexing/fast-feedback-indexer/data/image7_radial.txt new file mode 100644 index 000000000..12bd2f434 --- /dev/null +++ b/image_analysis/indexing/fast-feedback-indexer/data/image7_radial.txt @@ -0,0 +1,704 @@ +36.9 0 0 4.83429e-15 78.95 0 4.83429e-15 4.83429e-15 78.95 +-0.0232079 0.474625 -0.120118 +-0.0328637 0.471955 -0.11899 +0.0402336 0.47135 -0.118972 +0.13991 0.461809 -0.124124 +0.0986681 0.46346 -0.119392 +-0.0268753 0.465557 -0.11539 +-0.137427 0.459992 -0.122777 +-0.0296662 0.457188 -0.111125 +0.137191 0.453183 -0.119203 +0.000741159 0.457147 -0.110609 +-0.153792 0.451708 -0.12119 +0.149047 0.42572 -0.107505 +-0.0334379 0.430013 -0.0977966 +-0.0815894 0.428865 -0.100323 +0.244602 0.412208 -0.122359 +0.0461291 0.426341 -0.0966146 +0.0186769 0.422011 -0.0936018 +-0.1623 0.416222 -0.105339 +-0.200979 0.413735 -0.112064 +-0.123116 0.419747 -0.100747 +-0.165431 0.407182 -0.10176 +-0.0568224 0.410557 -0.0899374 +-0.169346 0.40369 -0.100913 +0.204244 0.394885 -0.10426 +0.0420803 0.400739 -0.0847748 +-0.256127 0.387217 -0.114302 +0.289813 0.376499 -0.120081 +0.198936 0.384092 -0.0983918 +0.187971 0.384679 -0.0962915 +0.167302 0.385771 -0.0927012 +-0.104057 0.389353 -0.0848081 +0.0700855 0.390074 -0.0818877 +-0.14415 0.385397 -0.088578 +0.1324 0.385634 -0.0868971 +-0.221506 0.379967 -0.101913 +0.212997 0.399975 -0.108567 +-0.18906 0.379479 -0.0943224 +0.124573 0.382416 -0.0844456 +0.284472 0.366461 -0.114121 +0.198704 0.375292 -0.0946425 +0.194844 0.374584 -0.0935108 +0.0323327 0.381526 -0.0762076 +-0.0651995 0.380125 -0.0773658 +0.162408 0.375556 -0.0875412 +0.130387 0.377542 -0.0832334 +0.0976923 0.378343 -0.079504 +-0.0379995 0.379594 -0.0756276 +-0.0459218 0.378161 -0.0754 +-0.0610891 0.375724 -0.0752839 +-0.181463 0.371496 -0.0894715 +-0.0401315 0.371891 -0.0725914 +0.126972 0.367163 -0.0785506 +-0.0815536 0.367109 -0.0734042 +-0.0104742 0.367527 -0.0700463 +-0.275405 0.353686 -0.1061 +0.240212 0.356085 -0.0969484 +-0.23371 0.353283 -0.0941464 +0.0709375 0.359804 -0.0696727 +-0.0543936 0.45714 -0.11227 +0.0973077 0.357182 -0.0710478 +-0.0132094 0.358916 -0.0667238 +-0.0830693 0.357797 -0.0699027 +-0.124924 0.354564 -0.0733511 +-0.241298 0.347005 -0.0937093 +-0.0571836 0.353298 -0.0662385 +-0.278629 0.341105 -0.102218 +0.0696916 0.352774 -0.0668903 +-0.144824 0.348284 -0.0738661 +-0.156047 0.345966 -0.0748205 +0.356566 0.327036 -0.124838 +0.239147 0.338425 -0.0899026 +-0.126748 0.345845 -0.0703086 +0.0129163 0.347214 -0.0623029 +-0.206245 0.340355 -0.0826007 +0.355773 0.324873 -0.123711 +-0.291607 0.329937 -0.102165 +0.118733 0.340628 -0.067329 +0.293469 0.323159 -0.100309 +0.20293 0.33052 -0.0782754 +0.165809 0.33435 -0.0722515 +0.0406404 0.336386 -0.0591532 +0.351621 0.316402 -0.118948 +0.120482 0.335425 -0.0656691 +-0.241532 0.326516 -0.0861894 +0.0748264 0.334997 -0.0607566 +-0.341381 0.313853 -0.114023 +0.00440188 0.332027 -0.0567405 +0.252018 0.320501 -0.086892 +0.203648 0.322879 -0.075729 +0.346195 0.305715 -0.113046 +0.165934 0.32195 -0.067898 +-0.10494 0.324628 -0.0599979 +-0.0351531 0.324907 -0.0549075 +-0.166555 0.321633 -0.0678993 +0.288171 0.312169 -0.0947332 +0.28341 0.312138 -0.0932207 +-0.144791 0.32108 -0.0640816 +-0.18393 0.318379 -0.0700514 +-0.222624 0.316247 -0.0778143 +0.0684171 0.324868 -0.0567184 +-0.301283 0.309101 -0.097955 +-0.307206 0.306241 -0.0989778 +-0.0464282 0.411213 -0.0896439 +-0.0784116 0.31837 -0.055282 +0.0666998 0.316942 -0.0539034 +0.162075 0.31213 -0.0638875 +0.128586 0.312781 -0.0589189 +0.284206 0.302745 -0.09029 +-0.197011 0.309123 -0.0696077 +0.0969711 0.314222 -0.0556161 +-0.186726 0.309267 -0.0675369 +0.364453 0.282263 -0.112587 +0.247567 0.294557 -0.0769905 +0.122541 0.299712 -0.0538729 +-0.121975 0.299985 -0.0538863 +-0.238121 0.291965 -0.0736874 +0.178121 0.321129 -0.069866 +-0.32268 0.282717 -0.0967012 +-0.368891 0.275895 -0.112418 +0.0164403 0.293463 -0.0441711 +0.241997 0.283951 -0.072202 +0.30144 0.278365 -0.0880532 +0.359192 0.27141 -0.107074 +-0.23667 0.281134 -0.0699726 +-0.288676 0.275511 -0.0830704 +0.20502 0.275301 -0.0607577 +0.044416 0.282337 -0.0417134 +0.295488 0.267615 -0.0829018 +0.0764146 0.280443 -0.0431759 +-0.0984912 0.278898 -0.0447433 +0.353178 0.261088 -0.101613 +-0.253726 0.268278 -0.0706722 +-0.0940179 0.274398 -0.0429908 +-0.338275 0.258985 -0.0952918 +-0.383661 0.252442 -0.1117 +0.13604 0.268074 -0.0462551 +0.104191 0.269748 -0.0427223 +-0.255172 0.263544 -0.0697142 +0.167533 0.266699 -0.0508929 +-0.140804 0.267348 -0.0467427 +0.140507 0.266378 -0.0464276 +-0.180497 0.264291 -0.0525978 +0.376119 0.247147 -0.106998 +-0.303476 0.251729 -0.0810144 +0.253866 0.253866 -0.0666703 +0.168713 0.256855 -0.0483901 +-0.00377016 0.259838 -0.0343552 +-0.0743924 0.258876 -0.0369584 +-0.256647 0.250521 -0.066527 +-0.394904 0.238377 -0.112742 +0.254365 0.249191 -0.0655472 +0.284675 0.245992 -0.0734753 +0.270823 0.246006 -0.0693357 +0.370707 0.236389 -0.101837 +-0.269575 0.244852 -0.0686692 +0.0245355 0.249087 -0.0318298 +-0.0475211 0.246949 -0.0321374 +0.218261 0.241143 -0.054372 +-0.231823 0.241246 -0.0576315 +0.307668 0.232969 -0.0774678 +-0.157109 0.243361 -0.042873 +-0.196211 0.240608 -0.0494165 +0.24286 0.234388 -0.0586812 +-0.318983 0.228273 -0.0801409 +-0.365058 0.221524 -0.0957545 +0.180741 0.231996 -0.0442225 +0.148915 0.233552 -0.0391267 +0.0841318 0.236005 -0.0318968 +0.214547 0.229694 -0.050679 +0.116747 0.234514 -0.034923 +-0.410199 0.21472 -0.113641 +0.387468 0.211617 -0.102734 +0.027234 0.230711 -0.0273588 +-0.330561 0.214188 -0.0808411 +0.167817 0.221078 -0.0392909 +-0.376285 0.207551 -0.0970424 +0.266243 0.21448 -0.0602593 +-0.172846 0.219588 -0.0398409 +-0.42067 0.200919 -0.115314 +-0.259126 0.212864 -0.0579051 +0.32524 0.208295 -0.0775944 +0.253515 0.21294 -0.0563968 +0.409803 0.197218 -0.109401 +-0.296509 0.206726 -0.0676124 +0.0356557 0.213309 -0.0236662 +0.23021 0.20604 -0.0489212 +-0.261598 0.200015 -0.0557753 +-0.432464 0.187062 -0.117966 +-0.167385 0.343146 -0.0757527 +0.40347 0.186664 -0.10425 +0.0636698 0.202395 -0.022768 +0.431187 0.18266 -0.11642 +-0.0395175 0.20202 -0.0214162 +-0.345986 0.190595 -0.0813231 +0.192832 0.197297 -0.0388083 +0.127983 0.199787 -0.0285549 +-0.149129 0.198818 -0.0313762 +-0.188271 0.195855 -0.0376098 +0.28422 0.190143 -0.0602848 +0.342211 0.183561 -0.0784811 +-0.443595 0.173254 -0.120678 +0.0145762 0.412125 -0.0889894 +-0.0117915 0.191295 -0.0185383 +-0.0822194 0.190486 -0.0217592 +0.425396 0.171656 -0.111421 +-0.356791 0.176726 -0.0826842 +-0.402431 0.169841 -0.100443 +-0.276877 0.17683 -0.0555053 +-0.238549 0.17885 -0.0454807 +0.364485 0.169399 -0.0843285 +-0.282377 0.174206 -0.0566467 +-0.322685 0.169538 -0.0688011 +0.242665 0.173515 -0.0455336 +-0.368657 0.16291 -0.0848214 +0.301112 0.165394 -0.0608639 +-0.412993 0.156209 -0.102762 +0.35837 0.158385 -0.0799536 +-0.288044 0.162441 -0.0562608 +0.0758972 0.16758 -0.0170674 +0.205613 0.163786 -0.0351698 +0.173109 0.16384 -0.0288205 +-0.309732 0.361441 -0.120554 +0.141837 0.165585 -0.0240574 +-0.098037 0.166764 -0.0188892 +-0.0880658 0.389621 -0.0832449 +-0.137101 0.163515 -0.0230323 +-0.215121 0.157897 -0.0362618 +-0.0502641 0.161633 -0.01443 +-0.157592 0.157917 -0.0252041 +-0.253917 0.155443 -0.0453463 +-0.424464 0.142369 -0.105818 +0.000148598 0.156113 -0.0122608 +-0.230633 0.152794 -0.0390304 +0.380821 0.143951 -0.0866254 +-0.0707838 0.154745 -0.0145845 +0.258484 0.14629 -0.0451256 +0.405774 0.136463 -0.0962715 +0.317731 0.14029 -0.062255 +-0.265132 0.141385 -0.0462099 +-0.152838 0.139908 -0.0217023 +0.40215 0.129205 -0.0935887 +-0.191886 0.137083 -0.0282038 +0.0934598 0.36817 -0.0749506 +-0.230136 0.134265 -0.0361481 +-0.314905 0.124635 -0.0590956 +0.395542 0.11846 -0.0892233 +0.423414 0.113922 -0.101255 +0.275169 0.12142 -0.0463024 +-0.0508563 0.12615 -0.00929327 +-0.360765 0.117828 -0.074816 +-0.241606 0.120445 -0.0371294 +0.333326 0.115146 -0.0642462 +0.0130596 0.121975 -0.00755281 +-0.326238 0.110982 -0.0612497 +0.238489 0.112885 -0.035438 +-0.352765 0.108693 -0.0706225 +0.416804 0.103657 -0.096933 +-0.457649 0.100865 -0.116607 +-0.3711 0.104324 -0.0772859 +0.298035 0.106688 -0.051426 +0.444545 0.0989506 -0.109726 +0.249507 0.106679 -0.0375209 +0.0729216 0.109382 -0.00867869 +0.355942 0.100397 -0.0709008 +0.16986 0.105521 -0.0201975 +0.138 0.106879 -0.0153514 +-0.0307977 0.108431 -0.0063732 +0.00855298 -0.178182 -0.0160395 +-0.241314 -0.260536 -0.0651798 +-0.0368542 -0.386969 -0.0786442 +-0.270295 -0.377137 -0.114163 +-0.0629442 -0.179468 -0.018252 +0.339764 -0.212184 -0.0837369 +-0.302328 0.0900458 -0.0510587 +0.143309 -0.221973 -0.0355361 +0.254853 -0.24407 -0.0643292 +0.293265 0.0480635 -0.0451777 +-0.252502 -0.141323 -0.0427798 +0.083054 -0.254777 -0.0365733 +-0.119709 -0.375833 -0.0810773 +0.185914 -0.251847 -0.0502585 +-0.235266 -0.165283 -0.0422258 +-0.308731 -0.161326 -0.0626318 +0.464268 0.0835601 -0.118256 +-0.295196 -0.181058 -0.0618758 +-0.221461 -0.250724 -0.0576135 +0.256622 0.0394806 -0.0342949 +0.057446 0.085492 -0.0053186 +-0.269051 -0.250495 -0.0700195 +-0.219657 -0.098932 -0.029452 +-0.377248 -0.281482 -0.117701 +-0.09537 -0.193344 -0.0235152 +0.422412 -0.132746 -0.103369 +0.313613 -0.249946 -0.0839356 +-0.0556935 -0.420493 -0.0944153 +-0.271449 -0.334906 -0.0976957 +-0.0591011 -0.262256 -0.0368133 +-0.267249 0.0337603 -0.036964 +-0.0963701 -0.263585 -0.0401896 +-0.258792 -0.235727 -0.063272 +0.315671 -0.191447 -0.0706454 +0.140217 -0.434462 -0.110291 +0.194817 -0.406915 -0.10755 +0.299992 -0.21416 -0.0704087 +0.465739 -0.0131718 -0.115176 +0.0359177 0.00399739 -0.000653243 +0.276076 -0.258069 -0.0741584 +-0.0436898 -0.425449 -0.0960726 +-0.390691 -0.0207941 -0.079713 +-0.314452 -0.256414 -0.0860131 +0.216664 -0.379356 -0.100475 +0.207514 -0.266467 -0.0587598 +-0.314994 -0.298585 -0.0990973 +-0.156152 -0.454611 -0.123105 +-0.232205 -0.416739 -0.121132 +-0.196591 -0.163385 -0.0332233 +0.00183537 -0.273651 -0.0381728 +-0.0849035 -0.206808 -0.0253094 +-0.0690953 -0.274464 -0.0408882 +0.0864383 -0.459096 -0.115828 +-0.32967 -0.257923 -0.0918187 +-0.0499326 -0.254072 -0.0341046 +0.323729 -0.278262 -0.0956937 +-0.187836 -0.368169 -0.0894126 +0.0513822 -0.339103 -0.0606552 +-0.400119 -0.216992 -0.109596 +0.31254 -0.116146 -0.0572227 +0.153743 -0.116847 -0.0188222 +0.205811 -0.393226 -0.103889 +0.386761 -0.275345 -0.119886 +-0.469005 -0.11122 -0.123835 +-0.425839 0.0351052 -0.0958825 +0.313124 -0.265307 -0.0880978 +-0.241125 -0.12653 -0.0377895 +0.473029 -0.00294693 -0.118958 +-0.0987681 -0.433109 -0.104086 +-0.145986 -0.237828 -0.039726 +-0.252989 -0.274327 -0.0722387 +0.196696 -0.237078 -0.04863 +0.128694 -0.19542 -0.0277609 +0.000898589 -0.400484 -0.0836967 +-0.00879679 -0.287279 -0.0421933 +-0.186784 -0.282768 -0.0591739 +0.095123 -0.152753 -0.0163242 +-0.359893 -0.305947 -0.118596 +-0.0268587 -0.276393 -0.0393306 +0.228674 -0.28061 -0.0678162 +0.303143 -0.220942 -0.0730218 +-0.249378 -0.218559 -0.0565792 +0.118937 0.36849 -0.0780079 +-0.0797489 -0.288429 -0.0458254 +-0.0807496 -0.373242 -0.0757869 +-0.252503 -0.358567 -0.101294 +-0.137596 -0.435908 -0.110589 +0.41988 0.00676558 -0.0924455 +0.00442967 -0.475251 -0.120161 +-0.0430385 -0.288836 -0.0435893 +-0.11904 -0.291097 -0.0507412 +-0.383059 -0.107963 -0.0826072 +-0.121411 -0.389793 -0.0871359 +-0.297356 -0.281712 -0.0877405 +0.110959 -0.391597 -0.086578 +0.227231 -0.365321 -0.0972783 +-0.157928 -0.293899 -0.0573007 +-0.165631 0.0187374 -0.0139902 +-0.091973 -0.076647 -0.00719277 +0.286342 -0.286736 -0.0857842 +-0.0726423 -0.297881 -0.048165 +0.254846 0.0882561 -0.0370542 +-0.279582 0.0689961 -0.0423604 +-0.0190921 -0.300351 -0.0463623 +0.248909 -0.0715077 -0.0341164 +-0.0173861 -0.0359713 -0.000798423 +0.226446 -0.00789867 -0.0260084 +-0.229047 -0.291561 -0.0712753 +0.129646 -0.446833 -0.114827 +0.315139 -0.286526 -0.0952403 +0.407273 -0.156288 -0.100165 +0.313911 0.0815937 -0.0540602 +0.399943 0.0220096 -0.0837241 +0.0209426 -0.305572 -0.0480615 +-0.417263 -0.100596 -0.0967991 +-0.298521 -0.146748 -0.0569462 +-0.129517 -0.304716 -0.056404 +0.204677 0.00709729 -0.0211963 +0.188441 0.0322519 -0.0184452 +-0.208745 -0.0849566 -0.025727 +0.00665382 -0.310512 -0.0494538 +-0.135266 -0.223442 -0.0347143 +0.275967 -0.30162 -0.0873841 +-0.433786 -0.20959 -0.1237 +-0.218545 -0.190278 -0.0429042 +-0.104486 -0.312513 -0.0558506 +0.253241 0.0933203 -0.0371082 +-0.0721473 -0.316781 -0.0542493 +-0.188072 -0.278489 -0.0581545 +0.0545829 -0.393443 -0.0822727 +-0.0602154 -0.429328 -0.0988611 +-0.348484 0.0833087 -0.0663948 +-0.117975 -0.248225 -0.0385083 +-0.190546 -0.201116 -0.0391439 +0.263967 -0.39939 -0.122043 +0.264605 -0.303858 -0.0847652 +0.181535 -0.316832 -0.0690529 +-0.0604354 -0.321314 -0.0549579 +0.0465814 -0.217889 -0.0251386 +0.391409 -0.179796 -0.0975187 +-0.0666474 -0.325692 -0.0568761 +-0.440384 -0.0795537 -0.105722 +-0.0395703 -0.326725 -0.0557092 +0.223732 -0.200295 -0.0461521 +-0.331467 -0.231859 -0.0854667 +0.44885 -0.137737 -0.117072 +0.201423 -0.238161 -0.0498905 +-0.263476 -0.35745 -0.104003 +0.228324 -0.323245 -0.0816425 +-0.153477 -0.298926 -0.0581466 +0.094406 -0.328528 -0.0602358 +-0.0417234 0.418992 -0.092969 +-0.0204692 -0.329396 -0.05603 +-0.0805932 -0.330861 -0.0597681 +-0.101447 -0.370598 -0.0767635 +0.0107998 0.303029 -0.0470797 +0.181502 -0.32569 -0.0721083 +0.126449 -0.32973 -0.0644315 +0.0980676 0.366674 -0.0748337 +0.360129 -0.312079 -0.120845 +0.0568767 -0.33609 -0.059889 +0.0651935 -0.444709 -0.106701 +-0.476182 -0.0241203 -0.120984 +-0.315747 -0.341495 -0.11474 +0.183532 -0.420405 -0.111419 +0.122091 -0.206155 -0.0291272 +-0.204248 -0.427716 -0.119465 +-0.297945 -0.323872 -0.102038 +0.184695 -0.333243 -0.075426 +0.202061 -0.185514 -0.0383577 +-0.0579056 -0.338982 -0.060991 +0.323334 -0.321258 -0.109916 +0.0974234 -0.446337 -0.110454 +0.35975 -0.269236 -0.10664 +0.328572 -0.183476 -0.0735138 +-0.0199956 -0.343282 -0.0609806 +0.399231 -0.0264903 -0.0835323 +-0.0952824 -0.340371 -0.0645487 +-0.388557 -0.160841 -0.0927217 +-0.0741296 -0.192889 -0.0215836 +-0.179308 0.102159 -0.0215257 +0.285927 -0.329132 -0.100045 +-0.197888 -0.258682 -0.0545245 +-0.242537 -0.388001 -0.110826 +0.411795 -0.237161 -0.120125 +0.181015 -0.170452 -0.0314032 +-0.196845 -0.339493 -0.0802194 +0.217373 -0.337977 -0.0842923 +-0.193394 -0.321911 -0.0731925 +0.426857 -0.031523 -0.0962304 +-0.425208 -0.0139313 -0.0950113 +-0.0198004 -0.385532 -0.0775179 +-0.158438 -0.37854 -0.0880763 +0.0537129 -0.0878637 -0.00531669 +0.172498 -0.434064 -0.115787 +-0.3487 -0.11507 -0.0698566 +0.110119 -0.348682 -0.0692505 +0.303123 0.148078 -0.0586238 +0.416491 0.0266945 -0.091252 +-0.392961 -0.028104 -0.0808746 +0.270678 -0.0863483 -0.0412104 +0.0116479 -0.428782 -0.0966671 +0.254479 -0.110198 -0.0392207 +-0.270372 -0.342345 -0.100168 +0.169285 -0.271298 -0.0525087 +0.433884 -0.161393 -0.113605 +0.0335678 -0.355786 -0.0660354 +-0.140296 -0.353051 -0.0749746 +0.275344 -0.344035 -0.102322 +0.151456 -0.0735841 -0.0142787 +-0.0571344 -0.35542 -0.0670411 +0.153759 -0.354216 -0.0775633 +-0.383193 -0.200163 -0.0982806 +0.0590183 -0.358713 -0.0684198 +-0.0120804 -0.369226 -0.070739 +0.42876 -0.213621 -0.122201 +0.0561762 -0.360876 -0.0690797 +-0.416943 0.097096 -0.0962686 +-0.268499 0.0823908 -0.0402501 +-0.100336 0.0588874 -0.00679057 +0.136971 -0.244686 -0.0401209 +0.432687 -0.0704528 -0.101213 +-0.412482 -0.139317 -0.0997503 +0.465995 0.0352835 -0.115916 +-0.401063 -0.032938 -0.0845419 +0.0397998 -0.0359482 -0.00143918 +-0.05109 0.0601866 -0.00312118 +-0.415238 0.0488871 -0.0916019 +0.462975 -0.114003 -0.12099 +0.244124 -0.276993 -0.070657 +0.402132 -0.208567 -0.10849 +0.136697 -0.397691 -0.0927206 +-0.211788 0.21697 -0.0470729 +-0.0406244 -0.368957 -0.0714417 +-0.242757 -0.358727 -0.0986763 +0.205367 -0.363425 -0.0912943 +0.0365184 -0.370861 -0.0720297 +0.271084 0.0493317 -0.0387093 +-0.00983146 -0.372418 -0.0719868 +-0.21469 -0.399203 -0.108627 +-0.0269098 -0.46072 -0.112863 +0.00179186 -0.384599 -0.0769181 +-0.167287 0.0672207 -0.016386 +0.150518 -0.369066 -0.0828659 +0.187308 -0.114872 -0.0244386 +0.0334355 -0.443617 -0.104407 +-0.0739792 -0.374927 -0.0759022 +-0.201153 -0.384909 -0.0992323 +-0.0569585 -0.372819 -0.0738458 +0.336045 0.0671639 -0.0605517 +-0.0478887 -0.374988 -0.074208 +-0.197528 -0.0715879 -0.0223201 +-0.404547 0.0628133 -0.0876426 +0.0278624 -0.072778 -0.0030411 +0.275829 -0.124973 -0.0469521 +-0.422896 -0.15461 -0.107109 +-0.372523 -0.227069 -0.100186 +-0.149972 -0.375846 -0.0855338 +0.345142 -0.159981 -0.0751848 +0.0131087 -0.448327 -0.106226 +0.0607687 -0.275058 -0.0404948 +0.205541 0.300239 -0.0685445 +-0.224637 -0.327896 -0.0823819 +-0.0692336 -0.439636 -0.104496 +-0.438928 0.0691844 -0.104145 +0.0169968 -0.0094982 -0.000189571 +0.185675 -0.117818 -0.0244778 +0.0218166 -0.416168 -0.0909739 +-0.0449259 0.0364406 -0.00167453 +0.24302 -0.157134 -0.0427904 +-0.0459126 -0.366754 -0.0708158 +-0.0169694 -0.460637 -0.112574 +0.175541 -0.222229 -0.0409382 +0.194528 -0.365081 -0.0895742 +0.244076 0.348644 -0.0950834 +0.423926 -0.140104 -0.105205 +-0.201524 -0.214987 -0.0444012 +0.065783 -0.359324 -0.0691086 +0.0300039 -0.395673 -0.0820987 +-0.247917 -0.359845 -0.100529 +-0.365641 -0.224208 -0.096652 +0.294901 0.238403 -0.0746908 +-0.148064 -0.407287 -0.0987818 +-0.468293 0.0869376 -0.120714 +-0.393645 0.0766243 -0.0839367 +-0.0704228 -0.402064 -0.0871009 +0.447075 0.00196961 -0.105506 +-0.31392 0.0758708 -0.0535868 +0.315737 0.0333213 -0.0517386 +-0.290474 0.0551621 -0.0447085 +0.0034064 -0.229689 -0.0267419 +-0.0670042 -0.187137 -0.019954 +-0.00433205 -0.0239929 -0.000297256 +0.22547 0.0441207 -0.0267494 +-0.038141 -0.445254 -0.105408 +0.284836 -0.371586 -0.116376 +0.143133 -0.350195 -0.0743237 +0.2894 -0.210674 -0.0662634 +0.207651 -0.150291 -0.0334113 +0.189264 -0.0165186 -0.0182127 +-0.237815 -0.383934 -0.10779 +0.0566031 -0.113088 -0.00802858 +-0.00680232 -0.235873 -0.0282398 +-0.230434 -0.112848 -0.0334777 +-0.109672 -0.404992 -0.0922811 +0.0282479 -0.468998 -0.117253 +0.252056 -0.313697 -0.0845426 +-0.0480059 -0.381332 -0.0768092 +0.328223 -0.0925958 -0.0599492 +-0.132325 -0.34708 -0.0715467 +-0.150913 -0.351149 -0.0759225 +-0.066949 -0.476709 -0.123492 +0.197854 -0.355954 -0.0866815 +-0.209456 -0.378643 -0.0984692 +-0.270124 -0.187009 -0.0555104 +0.203303 0.0557649 -0.0224734 +0.358601 0.00351587 -0.0665158 +0.274318 -0.385169 -0.118867 +0.238462 -0.309345 -0.0794343 +0.0679549 0.380055 -0.0775358 +-0.107726 -0.073283 -0.00852398 +0.0434711 -0.431076 -0.0987323 +-0.286108 -0.225339 -0.0686761 +-0.236479 -0.0745086 -0.0312245 +-0.0510988 -0.178191 -0.0173317 +0.29189 -0.101402 -0.0489386 +-0.106791 -0.355349 -0.0713867 +0.437033 -0.108764 -0.107155 +-0.383455 -0.139345 -0.0870128 +0.291955 -0.192221 -0.063083 +-0.140554 0.105011 -0.0155117 +0.159235 -0.155055 -0.0250117 +0.228783 -0.147971 -0.0378342 +0.161043 -0.405756 -0.100318 +0.271569 -0.177389 -0.0540701 +-0.0033661 -0.192438 -0.0186967 +0.012617 -0.433185 -0.0987832 +0.108018 0.333419 -0.0634297 +0.186987 0.0807492 -0.020962 +0.398697 0.0705483 -0.085635 +0.210422 -0.144403 -0.033113 +-0.309074 -0.0695737 -0.0515103 +0.148002 -0.0780026 -0.0140938 +0.127394 -0.154159 -0.0202012 +-0.342219 -0.121509 -0.0682695 +0.307642 -0.0777535 -0.05168 +0.33726 0.0184883 -0.0587702 +0.38031 -0.151059 -0.0875607 +-0.293115 -0.0943796 -0.0485926 +-0.285857 -0.148588 -0.0533177 +0.315554 -0.0150334 -0.0512115 +0.270297 -0.0191059 -0.0374127 +0.279711 -0.0242184 -0.0402214 +0.0941237 -0.395057 -0.0861779 +-0.260712 -0.406306 -0.124246 +-0.337004 0.0971829 -0.063526 +0.115828 -0.343553 -0.0680367 +-0.209304 -0.0722147 -0.0248197 +0.279116 0.024723 -0.040061 +0.391469 -0.0889121 -0.0841144 +-0.0467728 -0.420437 -0.0938848 +0.360835 -0.136339 -0.0773896 +0.0897246 -0.205265 -0.0254151 +-0.0472257 -0.415893 -0.0918134 +-0.218362 0.0993827 -0.0292059 +-0.354511 -0.077026 -0.0681263 +0.173458 -0.396114 -0.0983317 +0.317276 -0.201108 -0.0732359 +0.110671 -0.220768 -0.0309728 +-0.205119 0.0158597 -0.0213916 +-0.0960917 -0.221087 -0.0294915 +-0.0618008 -0.381259 -0.0775997 +0.444067 -0.190173 -0.124421 +-0.0875777 -0.213154 -0.0269145 +-0.246666 -0.179941 -0.0477516 +0.458913 -0.0753363 -0.114719 +-0.0934252 0.0675986 -0.00667117 +0.179845 -0.0790584 -0.0194872 +0.0226875 -0.391819 -0.0802374 +0.07842 -0.21997 -0.0276505 +-0.15001 -0.229823 -0.038398 +0.0355597 -0.231782 -0.0278825 +-0.0582448 -0.304789 -0.0493627 +0.417748 -0.0939837 -0.0963109 +-0.309556 -0.116084 -0.0562312 +-0.439738 -0.170975 -0.118298 +0.172899 0.00859551 -0.015098 +-0.0564156 -0.388959 -0.0804741 +0.20216 -0.13293 -0.0297108 +-0.256107 0.0475525 -0.0345218 +-0.354927 -0.168958 -0.0805001 +-0.103052 -0.0347924 -0.00593267 +0.00362529 -0.217564 -0.0239606 +0.164436 -0.237006 -0.042509 +0.0259408 0.380561 -0.0756079 +0.265566 -0.229558 -0.0636358 +0.18828 -0.232806 -0.0458764 +-0.478042 0.024306 -0.121999 +-0.107099 -0.234919 -0.0339033 +-0.246332 -0.0705628 -0.0333866 +-0.419757 -0.11147 -0.0992344 +-0.173547 -0.2261 -0.0414803 +-0.0514667 0.0943832 -0.00579529 +-0.172434 -0.220752 -0.0400339 +-0.30325 -0.10832 -0.0532656 +0.245219 -0.214984 -0.0546695 +-0.394175 -0.122954 -0.0892266 +-0.416825 -0.193111 -0.111763 +0.255351 -0.20555 -0.055254 +-0.0146412 -0.2069 -0.0217475 +-0.337522 -0.192437 -0.0785628 +-0.382289 0.0903908 -0.080389 +-0.0506271 -0.196241 -0.0207522 +-0.314647 -0.123293 -0.0588326 +0.158175 0.0443307 -0.0135845 +-0.277044 -0.0289745 -0.0395796 +0.250246 -0.16284 -0.0456102 +0.395711 -0.127331 -0.0904946 +-0.277767 0.0203604 -0.0395673 +-0.229115 -0.159687 -0.0397884 +0.000666533 -0.019996 -0.000200162 +-0.266849 -0.118309 -0.0435511 +0.207624 -0.132814 -0.0308495 +0.134859 0.0576476 -0.0108136 +0.376336 -0.112743 -0.0804022 +-0.167236 -0.108769 -0.0201013 +0.0179484 -0.0734888 -0.00286548 +0.369958 -0.0247476 -0.0712811 +0.279541 -0.034223 -0.0404764 +-0.160721 -0.0352193 -0.0136286 +0.110873 -0.0354416 -0.00679754 +-0.311196 -0.0213408 -0.049894 +0.37746 0.0855565 -0.0779349 +0.242213 0.0161828 -0.029912 +0.0312144 -0.451271 -0.108159 +0.109577 0.0407189 -0.00685606 diff --git a/image_analysis/indexing/fast-feedback-indexer/data/image8_local.txt b/image_analysis/indexing/fast-feedback-indexer/data/image8_local.txt new file mode 100644 index 000000000..f021b9ee1 --- /dev/null +++ b/image_analysis/indexing/fast-feedback-indexer/data/image8_local.txt @@ -0,0 +1,305 @@ +36.9 0 0 4.83429e-15 78.95 0 4.83429e-15 4.83429e-15 78.95 +-0.0231265 0.474246 -0.119911 +-0.357968 0.0979652 -0.0714194 +0.324 -0.27825 -0.095787 +-0.468692 -0.110943 -0.123633 +0.179946 -0.0789557 -0.0194973 +0.40757 -0.156116 -0.10027 +0.249476 0.106621 -0.0375065 +0.00839093 -0.177826 -0.0159738 +-0.202861 0.349391 -0.0852466 +-0.0812142 -0.330931 -0.0598465 +-0.337981 -0.192218 -0.0786851 +-0.197541 -0.0713716 -0.0223069 +0.328353 -0.0925825 -0.0599931 +0.3013 0.278295 -0.0879855 +-0.40102 -0.0329571 -0.0845239 +0.313741 0.0815922 -0.0540035 +0.286474 -0.286631 -0.0857925 +0.36422 0.282406 -0.112537 +-0.230698 -0.112792 -0.0335341 +-0.382973 -0.1079 -0.082564 +-0.439864 -0.170891 -0.118345 +0.437019 -0.108662 -0.107135 +0.185697 -0.117678 -0.024465 +-0.348679 -0.115004 -0.0698404 +-0.425739 0.0352622 -0.0958415 +0.0973952 0.377927 -0.0793016 +0.197132 0.2971 -0.0657245 +0.358091 0.158409 -0.0798492 +-0.360089 -0.130061 -0.0761926 +-0.168945 -0.349922 -0.0785815 +-0.204648 -0.427854 -0.119625 +0.237956 -0.351581 -0.0945895 +-0.421027 0.201219 -0.115553 +0.136364 0.268448 -0.0464065 +-0.412721 -0.13898 -0.099808 +0.449271 -0.137704 -0.117281 +-0.00311451 0.260389 -0.0345012 +0.078394 -0.22007 -0.0276712 +-0.124526 0.354734 -0.0733626 +0.242851 -0.157187 -0.0427562 +-0.311351 -0.0210857 -0.0499389 +0.380522 -0.15103 -0.0876445 +-0.433646 -0.209292 -0.123559 +-0.0600199 -0.430315 -0.0993187 +-0.308571 -0.160807 -0.0624902 +0.265869 0.214438 -0.0601437 +-0.235378 -0.165327 -0.0422608 +0.403109 0.186729 -0.104101 +-0.144798 0.322021 -0.064406 +0.431056 0.182516 -0.116327 +0.30958 0.274588 -0.0896368 +-0.348284 -0.207508 -0.0858675 +-0.388129 -0.160141 -0.0924151 +0.393291 0.222524 -0.107921 +0.30852 -0.16877 -0.063874 +0.0839961 0.235711 -0.0318134 +-0.338333 0.259371 -0.0954242 +0.228259 -0.32374 -0.0818006 +0.27179 -0.177555 -0.0541647 +0.292172 -0.101369 -0.0490216 +0.167118 0.386134 -0.0928221 +-0.272776 -0.28958 -0.0825379 +0.159373 -0.154875 -0.0250057 +-0.0741641 -0.192995 -0.0216072 +-0.440337 -0.0794341 -0.105688 +-0.10937 0.401756 -0.0908079 +0.169706 0.105547 -0.0201737 +-0.0853326 -0.206894 -0.0253651 +0.122172 -0.206144 -0.029135 +-0.416869 -0.192791 -0.111714 +0.443948 -0.190021 -0.124327 +-0.382831 -0.199608 -0.0980038 +0.328494 -0.183229 -0.0734371 +0.375445 -0.203139 -0.0956906 +0.186819 0.0805677 -0.0209151 +0.284042 0.366498 -0.113998 +0.426881 -0.0314362 -0.0962386 +-0.422749 -0.154206 -0.106969 +-0.296279 0.206905 -0.0675789 +-0.382253 0.0905018 -0.080385 +-0.135875 -0.223517 -0.0348172 +0.340125 -0.212194 -0.083873 +0.402453 -0.208425 -0.108602 +0.419902 0.00706023 -0.0924579 +-0.297446 -0.28113 -0.08759 +0.227562 -0.365359 -0.0973769 +0.129658 -0.447159 -0.114993 +0.395762 -0.127328 -0.0905165 +0.33692 -0.0301137 -0.0589484 +-0.285602 -0.224305 -0.068271 +-0.400628 -0.216543 -0.109716 +0.170351 -0.23326 -0.0426233 +-0.269147 -0.250023 -0.0699204 +0.263783 -0.399828 -0.122187 +-0.30333 -0.108259 -0.0532841 +0.307015 0.232816 -0.0772116 +-0.241018 -0.126438 -0.0377507 +-0.365985 -0.224008 -0.096742 +-0.252535 -0.141151 -0.042763 +-0.306921 0.306415 -0.0989399 +-0.121778 0.300189 -0.0539256 +0.398484 0.0705755 -0.0855439 +-0.326308 0.110947 -0.0612699 +0.412421 -0.237062 -0.120392 +0.128469 -0.370691 -0.0801718 +0.313459 -0.2499 -0.0838703 +-0.241858 -0.260348 -0.0652681 +0.157275 -0.0153904 -0.012565 +-0.322435 0.283113 -0.0967375 +0.276336 -0.258054 -0.0742319 +-0.251972 -0.274202 -0.071925 +-0.313969 -0.255668 -0.0856385 +0.286549 -0.329471 -0.100368 +0.00163761 -0.273845 -0.0382276 +0.00374298 -0.47589 -0.120503 +-0.39399 -0.256428 -0.117381 +-0.120056 -0.375871 -0.0811381 +-0.213092 -0.228911 -0.0501624 +-0.139517 0.0382599 -0.0105197 +0.140226 0.379746 -0.0855986 +0.409469 0.197298 -0.109265 +-0.0195255 -0.300772 -0.0465039 +-0.196472 0.348027 -0.0833345 +0.290179 -0.233846 -0.0720387 +-0.246632 -0.17999 -0.047752 +-0.186958 -0.410207 -0.107377 +-0.376988 -0.280428 -0.117254 +-0.359806 -0.304937 -0.11821 +-0.432191 0.187339 -0.117892 +0.359982 -0.269266 -0.106742 +-0.229617 -0.20521 -0.0485985 +0.0117428 -0.428873 -0.0967113 +0.136693 -0.35815 -0.0763963 +-0.0991107 -0.433171 -0.104154 +0.274805 -0.385329 -0.119089 +-0.179222 0.102284 -0.0215229 +0.139491 -0.434601 -0.110245 +0.251969 -0.371698 -0.106494 +0.172779 -0.433999 -0.11581 +-0.158512 -0.378234 -0.0879623 +-0.110366 -0.404991 -0.0923647 +0.0697997 0.389409 -0.0815835 +0.096723 -0.446946 -0.110683 +-0.331183 -0.231148 -0.085184 +-0.0813089 0.367249 -0.0734383 +-0.394757 0.238366 -0.112673 +0.466133 -0.0132692 -0.115385 +0.275254 -0.301684 -0.0871899 +-0.148664 -0.40756 -0.0990039 +-0.370975 0.104401 -0.0772442 +-0.290486 0.0552454 -0.0447169 +-0.0107837 -0.372791 -0.0721472 +-0.038464 -0.445385 -0.105487 +0.28751 0.312184 -0.0945282 +0.126681 -0.329366 -0.0643347 +-0.417134 0.0974338 -0.0963929 +0.464156 0.0837694 -0.118216 +-0.256101 0.0478203 -0.0345336 +0.0864627 -0.459478 -0.116029 +-0.0177428 -0.461164 -0.112862 +0.100907 0.324159 -0.0593945 +0.463106 -0.113809 -0.121034 +-0.0474278 0.246761 -0.0320849 +0.425012 0.171715 -0.111249 +0.205626 -0.393756 -0.104079 +-0.00939944 -0.287562 -0.042284 +-0.0882939 -0.461914 -0.117481 +0.285011 -0.371302 -0.116312 +0.295051 0.267642 -0.0827691 +-0.0671658 -0.476555 -0.123425 +0.28925 0.37622 -0.119777 +0.0945474 -0.328331 -0.060181 +0.238261 0.112861 -0.0353789 +0.395557 0.11855 -0.089242 +-0.242707 -0.388019 -0.11088 +-0.158608 -0.294046 -0.0574607 +-0.137674 -0.435867 -0.110581 +-0.314761 -0.12309 -0.058844 +0.217872 0.240742 -0.0541802 +0.0835153 -0.342134 -0.0640674 +0.356165 0.3267 -0.12455 +-0.383692 0.252567 -0.111749 +-0.23125 0.0534794 -0.0285766 +0.161706 0.375485 -0.0873871 +-0.0797403 -0.287795 -0.0456334 +-0.391047 -0.0206324 -0.0798607 +0.0188834 0.421588 -0.0934091 +-0.0697583 -0.274641 -0.040987 +0.250283 -0.16285 -0.0456215 +0.000415481 -0.400747 -0.0838115 +0.238672 -0.309052 -0.0793901 +0.226777 -0.295151 -0.0718524 +0.332167 -0.34862 -0.12357 +0.141198 0.165398 -0.023933 +0.254582 -0.11002 -0.0392276 +-0.415142 0.0490554 -0.0915669 +-0.349839 0.245365 -0.0958933 +0.203396 0.297559 -0.0672145 +0.0128931 0.347839 -0.0625344 +0.0219615 -0.176107 -0.0158739 +0.335829 0.0671055 -0.0604704 +-0.238353 0.17894 -0.0454487 +-0.457577 0.101085 -0.116594 +0.270651 -0.198464 -0.0580021 +0.18025 0.232028 -0.0441377 +-0.270407 -0.376887 -0.11409 +0.465905 0.0353651 -0.115872 +0.203925 0.394401 -0.103974 +0.0648342 -0.445296 -0.106967 +-0.346094 0.190822 -0.0814108 +-0.034968 0.324959 -0.0549185 +-0.303917 0.252077 -0.0812556 +0.258132 0.146341 -0.0450383 +0.198226 0.383998 -0.0981953 +0.376257 0.247157 -0.107059 +0.0726713 -0.355927 -0.0683162 +-0.318957 0.182294 -0.0699272 +-0.35437 -0.168245 -0.0801548 +0.128497 0.199792 -0.0286238 +-0.129571 -0.305108 -0.0565381 +0.20517 0.275441 -0.0608317 +-0.277776 0.0203741 -0.0395702 +-0.214655 -0.398835 -0.108454 +0.444325 0.0988341 -0.109603 +0.0950944 -0.153228 -0.0163953 +-0.27164 -0.3348 -0.0977135 +0.416439 0.103869 -0.096789 +0.229904 0.205934 -0.0488244 +-0.275716 0.354356 -0.106461 +0.380432 0.144028 -0.086475 +-0.348282 0.0832595 -0.0663152 +-0.0632307 -0.395268 -0.0836131 +0.20825 -0.363207 -0.0918631 +0.274949 -0.344327 -0.102313 +-0.330456 0.214422 -0.080858 +0.401938 0.12935 -0.0935154 +-0.224402 -0.327417 -0.0821539 +0.21046 0.172612 -0.0377568 +-0.424358 0.142493 -0.105787 +-0.115493 -0.309539 -0.056153 +-0.188161 0.196067 -0.0376314 +-0.252669 -0.317517 -0.0860301 +-0.425376 -0.0137413 -0.0950876 +-0.0705557 0.154908 -0.0145939 +-0.445469 -0.131943 -0.114479 +-0.080956 -0.372783 -0.0756196 +-0.143704 0.3856 -0.0885933 +-0.29762 -0.323016 -0.101622 +0.154087 0.4092 -0.10066 +0.238686 0.33838 -0.0897649 +-0.183075 0.383143 -0.0946356 +-0.412868 0.156305 -0.102721 +-0.196734 -0.338677 -0.0798945 +-0.360507 0.117763 -0.0747074 +0.370119 0.236442 -0.101609 +0.243782 0.412062 -0.122062 +-0.404319 0.0627764 -0.0875389 +0.399376 -0.0265757 -0.0835979 +-0.476074 -0.0237353 -0.120915 +0.333168 0.115105 -0.0641849 +0.473057 -0.00264308 -0.118972 +-0.256841 0.322853 -0.0890671 +-0.238037 0.292223 -0.0737471 +0.281643 0.131504 -0.0495349 +0.358619 0.271241 -0.106792 +0.337247 0.0186423 -0.0587685 +-0.478042 0.0245838 -0.122007 +0.357177 0.0522242 -0.0674242 +0.29354 0.323071 -0.100301 +-0.322574 0.16965 -0.068783 +-0.0564271 0.410498 -0.0898859 +0.2932 0.0481319 -0.0451612 +-0.264884 0.141425 -0.046147 +0.313364 0.243355 -0.0820779 +-0.291259 0.330091 -0.102109 +-0.313919 0.0759389 -0.0535921 +-0.393246 0.0766122 -0.0837642 +-0.183544 0.318555 -0.0700355 +0.19393 0.374258 -0.09318 +0.260254 0.0986231 -0.0395099 +-0.337117 0.0971651 -0.0635646 +-0.44366 0.173403 -0.12074 +-0.255704 0.387254 -0.114195 +-0.420804 0.119338 -0.100732 +-0.288286 0.275624 -0.0829815 +-0.435554 0.128685 -0.109083 +-0.221082 0.380286 -0.101944 +0.192729 0.197305 -0.0387893 +-0.0104663 0.368458 -0.0704146 +0.0761389 0.1678 -0.0171236 +-0.288358 0.162536 -0.0563731 +0.104824 0.269919 -0.0428399 +0.325063 0.208266 -0.0775255 +-0.0816012 0.2228 -0.0285571 +0.116597 0.234882 -0.0349946 +-0.161941 0.416275 -0.105299 +0.0249126 0.249056 -0.0318313 +-0.269537 0.245124 -0.0687299 +0.253764 0.249245 -0.0653981 +-0.323449 0.261612 -0.0906376 +-0.368478 0.27616 -0.112329 +0.244101 0.348873 -0.0951784 +-0.305972 0.31333 -0.100997 +-0.103405 0.389773 -0.084913 diff --git a/image_analysis/indexing/fast-feedback-indexer/data/image8_peakfinder8.txt b/image_analysis/indexing/fast-feedback-indexer/data/image8_peakfinder8.txt new file mode 100644 index 000000000..41cec02ab --- /dev/null +++ b/image_analysis/indexing/fast-feedback-indexer/data/image8_peakfinder8.txt @@ -0,0 +1,902 @@ +36.9 0 0 4.83429e-15 78.95 0 4.83429e-15 4.83429e-15 78.95 +-0.186983 -0.731415 -0.344203 +-0.281068 -0.712107 -0.356646 +-0.0822441 -0.736993 -0.329122 +0.278947 -0.703124 -0.345931 +0.140746 -0.717526 -0.317836 +0.332726 -0.676071 -0.342565 +-0.223307 -0.697881 -0.319488 +-0.0201306 -0.712395 -0.29851 +-0.111825 -0.699463 -0.294134 +0.244618 -0.675092 -0.304003 +0.067959 -0.692845 -0.282123 +0.175295 -0.682311 -0.290265 +0.408025 -0.622212 -0.331892 +0.117285 -0.676207 -0.272684 +-0.0879878 -0.677807 -0.270044 +0.0852755 -0.67557 -0.267652 +-0.049379 -0.675194 -0.264014 +0.0531207 -0.674765 -0.263882 +-0.214429 -0.657689 -0.277875 +0.0208089 -0.673097 -0.260739 +0.102835 -0.657887 -0.253937 +-0.169586 -0.651476 -0.260527 +0.0382101 -0.655964 -0.246176 +0.178153 -0.646528 -0.258203 +0.362797 -0.608426 -0.29417 +-0.190868 -0.636595 -0.252794 +0.0232513 -0.636846 -0.22936 +-0.408809 -0.580704 -0.29597 +-0.145578 -0.629626 -0.236863 +-0.212113 -0.62139 -0.245757 +-0.374515 -0.587796 -0.282899 +-0.166951 -0.61487 -0.229245 +-0.0303812 -0.621328 -0.217038 +0.0728679 -0.620203 -0.218951 +0.0406164 -0.619387 -0.215966 +0.433172 -0.558576 -0.292643 +-0.261226 -0.595771 -0.240515 +-0.289959 -0.585619 -0.24305 +-0.0128561 -0.603627 -0.202837 +0.235087 -0.584146 -0.223143 +-0.344587 -0.562785 -0.248646 +0.455035 -0.531361 -0.285438 +-0.104648 -0.590621 -0.199865 +-0.237506 -0.574304 -0.216568 +0.350535 -0.55344 -0.244467 +0.325698 -0.548952 -0.230213 +0.362454 -0.540133 -0.240471 +-0.192441 -0.567865 -0.19969 +0.219843 -0.56516 -0.20485 +0.118343 -0.571385 -0.187896 +0.0862664 -0.570485 -0.183235 +0.299608 -0.543725 -0.216037 +0.0541453 -0.569244 -0.179616 +0.373354 -0.52655 -0.236225 +0.161975 -0.55954 -0.187178 +-0.348626 -0.530181 -0.227104 +-0.241494 -0.54175 -0.194899 +0.204787 -0.546264 -0.187807 +0.285018 -0.525292 -0.198231 +-0.19643 -0.535339 -0.178521 +-0.0909784 -0.540997 -0.163911 +0.114567 -0.539101 -0.165588 +-0.324914 -0.508668 -0.2027 +0.157373 -0.527841 -0.165364 +-0.386616 -0.490163 -0.218803 +-0.228381 -0.491067 -0.159348 +-0.397904 -0.46162 -0.20717 +0.154897 -0.494037 -0.144468 +0.293041 -0.479522 -0.172845 +0.403204 -0.452594 -0.204648 +-0.0450542 -0.491933 -0.130534 +0.266274 -0.473599 -0.160475 +0.0259387 -0.489802 -0.128552 +-0.284521 -0.46972 -0.16429 +-0.144733 -0.482269 -0.136016 +0.304044 -0.466063 -0.169131 +-0.211232 -0.473879 -0.14512 +-0.106422 -0.480184 -0.129312 +0.479848 -0.424744 -0.232316 +-0.311893 -0.4583 -0.167724 +-0.48283 -0.422023 -0.232685 +0.552494 -0.401728 -0.269682 +0.412867 -0.438414 -0.201668 +-0.0671431 -0.476541 -0.123416 +0.209143 -0.467714 -0.14122 +0.277411 -0.459617 -0.15632 +-0.240405 -0.463494 -0.147135 +0.521062 -0.406304 -0.249393 +0.00381184 -0.475611 -0.120353 +-0.408203 -0.432897 -0.196277 +0.388307 -0.4338 -0.186959 +-0.193778 -0.456117 -0.131434 +0.219876 -0.454744 -0.136946 +0.288347 -0.446002 -0.152688 +-0.0881721 -0.462058 -0.117544 +0.32603 -0.437966 -0.162211 +-0.0175542 -0.461121 -0.112837 +0.0865121 -0.459541 -0.116067 +-0.500178 -0.397794 -0.230856 +0.362659 -0.429012 -0.172699 +0.466265 -0.406457 -0.214258 +0.398099 -0.419735 -0.184317 +-0.322387 -0.429498 -0.156437 +0.299252 -0.432358 -0.149403 +0.129656 -0.447292 -0.11506 +0.0967951 -0.447 -0.110719 +0.336414 -0.423658 -0.158965 +0.507847 -0.38809 -0.230924 +0.37258 -0.414732 -0.16983 +-0.0382639 -0.445253 -0.105413 +0.0648061 -0.445372 -0.107003 +0.0329267 -0.443564 -0.104363 +-0.137845 -0.436157 -0.11075 +0.17278 -0.434012 -0.115816 +-0.278635 -0.42377 -0.138153 +0.139423 -0.434314 -0.110094 +-0.0991502 -0.433484 -0.10431 +-0.204485 -0.427821 -0.119571 +0.346706 -0.409873 -0.156318 +-0.517233 -0.373189 -0.229806 +0.451644 -0.3878 -0.19649 +-0.305407 -0.412301 -0.141668 +-0.0599635 -0.430356 -0.0993348 +0.0117286 -0.428802 -0.0966777 +0.18378 -0.420766 -0.111641 +0.62226 -0.335587 -0.29277 +-0.333278 -0.401263 -0.146822 +-0.367382 -0.393971 -0.157494 +-0.435701 -0.379436 -0.183794 +-0.187018 -0.410248 -0.107408 +0.194555 -0.407521 -0.107769 +0.263813 -0.399947 -0.12225 +-0.148837 -0.407735 -0.0991115 +-0.288057 -0.39463 -0.12748 +-0.533664 -0.347926 -0.229189 +-0.214691 -0.398845 -0.108467 +0.435953 -0.368845 -0.179087 +0.501371 -0.354787 -0.210853 +-0.110189 -0.405175 -0.0924256 +-0.315794 -0.384361 -0.132509 +-0.0704159 -0.401579 -0.0868868 +0.205644 -0.393838 -0.104119 +-0.24278 -0.388115 -0.110942 +0.000508056 -0.400874 -0.0838668 +0.274788 -0.385333 -0.119086 +0.411118 -0.364207 -0.164336 +0.478706 -0.351322 -0.19538 +-0.453048 -0.35503 -0.182259 +-0.0632307 -0.395268 -0.0836131 +-0.270282 -0.376738 -0.113989 +0.216836 -0.3796 -0.100619 +0.285015 -0.371338 -0.116329 +-0.0202132 -0.385125 -0.0773571 +0.322698 -0.363003 -0.125875 +-0.158483 -0.378278 -0.0879756 +0.359282 -0.354167 -0.136587 +-0.120262 -0.375967 -0.0812041 +-0.0808997 -0.372858 -0.0756451 +0.227528 -0.365366 -0.0973712 +0.462968 -0.331737 -0.178044 +-0.469762 -0.330029 -0.181218 +-0.0108573 -0.372828 -0.0721629 +-0.360527 -0.347649 -0.13446 +-0.253061 -0.359561 -0.101849 +0.20825 -0.363207 -0.0918631 +0.332258 -0.348629 -0.123608 +0.136693 -0.35815 -0.0763963 +0.238008 -0.35155 -0.0945913 +0.104881 -0.356965 -0.0717886 +0.0028006 -0.358477 -0.0664657 +0.0730719 -0.356142 -0.0684297 +0.275253 -0.344279 -0.102388 +-0.5273 -0.301887 -0.205759 +-0.168945 -0.349922 -0.0785815 +0.639371 -0.269978 -0.280058 +-0.377256 -0.32262 -0.131902 +-0.271891 -0.334849 -0.0978073 +-0.41164 -0.315493 -0.145005 +-0.196767 -0.338754 -0.0799303 +0.115753 -0.343145 -0.0678774 +-0.0205545 -0.343434 -0.0610483 +0.286418 -0.329373 -0.10029 +0.0835153 -0.342134 -0.0640674 +-0.297673 -0.323082 -0.101663 +0.323149 -0.321307 -0.109867 +0.4213 -0.30758 -0.146829 +-0.224553 -0.32743 -0.082195 +0.487539 -0.293876 -0.177843 +0.360128 -0.312244 -0.120903 +-0.0809198 -0.331027 -0.0598547 +0.126653 -0.329378 -0.0643348 +0.228183 -0.323793 -0.0818005 +0.0944777 -0.32827 -0.0601529 +0.395603 -0.302713 -0.1329 +-0.252536 -0.317284 -0.0859121 +-0.0113786 -0.328941 -0.055718 +-0.359871 -0.30504 -0.118272 +-0.394152 -0.297798 -0.13054 +-0.428685 -0.291116 -0.144734 +-0.0736466 -0.321073 -0.0558134 +-0.0579815 -0.321615 -0.0549065 +0.238673 -0.309105 -0.0794082 +0.105521 -0.314548 -0.0566418 +0.504708 -0.270905 -0.180317 +-0.115493 -0.309539 -0.056153 +-0.129614 -0.305109 -0.0565442 +-0.0583789 -0.304592 -0.0493079 +0.117563 -0.304332 -0.0547164 +0.144799 -0.301849 -0.0577046 +-0.376818 -0.280355 -0.117158 +-0.196357 -0.297147 -0.0655763 +-0.0911042 -0.301821 -0.0509982 +0.116295 -0.30094 -0.0534746 +0.226777 -0.295151 -0.0718524 +-0.0194891 -0.300816 -0.0465169 +-0.272776 -0.28958 -0.0825379 +-0.0138115 -0.300838 -0.0464247 +0.286472 -0.286617 -0.0857877 +-0.158553 -0.294006 -0.0574389 +-0.297558 -0.281232 -0.087658 +0.323927 -0.278271 -0.0957673 +-0.0797773 -0.287946 -0.045682 +-0.00915821 -0.287469 -0.0422538 +0.360031 -0.269296 -0.106772 +0.520578 -0.247162 -0.182743 +0.228476 -0.280401 -0.0677049 +-0.549638 -0.237995 -0.199215 +-0.251995 -0.273799 -0.071812 +-0.509678 -0.241719 -0.174288 +-0.39399 -0.256428 -0.117381 +0.463255 -0.246904 -0.148864 +-0.468716 -0.244855 -0.151265 +-0.0696944 -0.274645 -0.0409835 +0.00137843 -0.274145 -0.0383126 +0.20742 -0.266555 -0.0587639 +-0.183195 -0.267697 -0.054073 +-0.0637313 -0.271469 -0.0396653 +-0.314191 -0.255868 -0.0857703 +-0.0497103 -0.270218 -0.0384849 +0.202338 -0.265203 -0.057277 +0.276375 -0.258141 -0.0742678 +0.438143 -0.242059 -0.134299 +-0.241919 -0.260436 -0.0653085 +0.313617 -0.249919 -0.0839296 +-0.058974 -0.261004 -0.0364655 +-0.269107 -0.249876 -0.0698691 +0.412303 -0.237038 -0.12033 +0.185959 -0.251828 -0.0502622 +-0.451523 -0.227313 -0.137181 +0.479336 -0.223457 -0.151292 +0.047794 -0.250808 -0.0331436 +-0.602278 -0.199853 -0.227135 +0.158711 -0.246368 -0.0439071 +-0.331242 -0.231277 -0.0852379 +0.19678 -0.236921 -0.0486082 +-0.145875 -0.237096 -0.0395282 +-0.366168 -0.224078 -0.0968333 +0.580696 -0.195247 -0.209639 +0.549864 -0.199788 -0.188992 +0.609633 -0.19008 -0.230444 +0.265664 -0.229248 -0.0635875 +-0.400504 -0.216741 -0.109708 +-0.107055 -0.234893 -0.0338922 +0.170367 -0.233152 -0.0425998 +-0.285852 -0.224487 -0.0683915 +-0.213092 -0.228911 -0.0501624 +-0.433767 -0.209343 -0.123632 +0.035086 -0.23208 -0.0279362 +0.30335 -0.220988 -0.0731004 +-0.0696192 -0.229626 -0.0292141 +0.494848 -0.199977 -0.154343 +0.645761 -0.175679 -0.256946 +0.175602 -0.222053 -0.0409087 +0.402526 -0.208423 -0.108634 +-0.135731 -0.223552 -0.0348049 +0.340009 -0.21214 -0.0838174 +0.143156 -0.221917 -0.0355006 +-0.0960761 -0.220531 -0.0293633 +-0.348284 -0.207508 -0.0858675 +0.110607 -0.2208 -0.0309729 +0.244889 -0.215127 -0.0546167 +-0.201585 -0.215037 -0.0444256 +0.078394 -0.22007 -0.0276711 +0.469936 -0.194871 -0.139079 +-0.703456 -0.156676 -0.306745 +0.0467376 -0.217783 -0.0251225 +0.375445 -0.203139 -0.0956906 +-0.382707 -0.19959 -0.0979473 +-0.416817 -0.192944 -0.111723 +-0.156368 -0.209456 -0.0347657 +-0.45882 -0.188127 -0.131615 +-0.228948 -0.205097 -0.0484129 +-0.0390631 -0.211592 -0.0234228 +0.443948 -0.190021 -0.124327 +0.122167 -0.206123 -0.02913 +-0.0853158 -0.206897 -0.0253642 +0.0897403 -0.205002 -0.0253612 +0.223434 -0.200645 -0.0461558 +-0.012722 -0.205313 -0.0213864 +0.270651 -0.198464 -0.0580021 +0.509291 -0.176152 -0.157626 +-0.608378 -0.161239 -0.222904 +-0.337981 -0.192218 -0.0786851 +0.541338 -0.171223 -0.176814 +0.292029 -0.192046 -0.0630702 +-0.164347 -0.195928 -0.0332517 +-0.219103 -0.19038 -0.043052 +0.328674 -0.183292 -0.0735131 +0.391663 -0.17973 -0.0976159 +0.485168 -0.171212 -0.142505 +-0.561776 -0.160684 -0.188466 +-0.0743478 -0.193048 -0.0216316 +-0.0041617 -0.192827 -0.0187761 +-0.439838 -0.170884 -0.11833 +0.201967 -0.185634 -0.0383612 +0.664885 -0.142391 -0.266752 +-0.129162 -0.185755 -0.02593 +-0.246604 -0.180012 -0.0477488 +0.209165 -0.181562 -0.0391228 +0.271757 -0.177538 -0.0541522 +-0.235143 -0.177107 -0.0443112 +-0.354478 -0.168253 -0.0801976 +-0.207276 -0.17592 -0.037665 +-0.0629722 -0.179094 -0.0181854 +0.106274 -0.179622 -0.0220216 +-0.283657 -0.171704 -0.0565721 +0.00837599 -0.17791 -0.0159889 +0.433602 -0.161267 -0.113443 +0.30852 -0.16877 -0.063874 +0.0219616 -0.176107 -0.0158739 +-0.388255 -0.160351 -0.0925058 +0.585006 -0.142903 -0.20166 +0.180994 -0.170485 -0.0314051 +-0.235413 -0.165347 -0.042273 +0.407558 -0.156126 -0.100266 +0.345351 -0.159964 -0.0752598 +-0.422749 -0.154206 -0.106969 +-0.308663 -0.160883 -0.0625332 +0.49938 -0.14769 -0.146298 +-0.196574 -0.164701 -0.0334431 +0.250286 -0.162834 -0.0456195 +0.380522 -0.15103 -0.0876445 +0.242815 -0.157148 -0.0427407 +0.474652 -0.142502 -0.131439 +-0.0613818 -0.159662 -0.0147384 +0.159407 -0.154917 -0.0250178 +0.127037 -0.154093 -0.0201445 +-0.298487 -0.146594 -0.0569117 +0.207167 -0.150497 -0.0333396 +0.0951841 -0.153083 -0.0163814 +0.449106 -0.137549 -0.117173 +-0.41235 -0.139054 -0.0996491 +0.228737 -0.148153 -0.0378513 +0.422602 -0.132585 -0.103435 +-0.210726 -0.14564 -0.0333649 +0.210564 -0.144262 -0.033123 +-0.445469 -0.131943 -0.114479 +-0.252547 -0.14119 -0.042772 +0.36088 -0.136393 -0.0774153 +-0.254378 -0.137356 -0.042699 +0.544683 -0.119064 -0.169853 +0.575328 -0.114322 -0.190106 +-0.360358 -0.129856 -0.0762686 +0.395762 -0.127328 -0.0905165 +0.604807 -0.10966 -0.211214 +0.207694 -0.132854 -0.0308699 +-0.00572537 -0.134325 -0.00907918 +-0.241084 -0.126471 -0.0377716 +0.275857 -0.124864 -0.0469459 +-0.314934 -0.12301 -0.0588915 +0.463084 -0.113862 -0.12103 +-0.468788 -0.110909 -0.12368 +0.0134142 -0.125688 -0.00802091 +0.312661 -0.11606 -0.0572523 +-0.348772 -0.11502 -0.069877 +-0.197474 -0.121273 -0.0272221 +0.640332 -0.0950674 -0.237808 +-0.0643839 -0.121339 -0.00947912 +0.185726 -0.117654 -0.0244676 +0.309068 -0.115452 -0.0559936 +0.436992 -0.108606 -0.107116 +0.153839 -0.11686 -0.0188388 +-0.230669 -0.112763 -0.0335238 +-0.38314 -0.107811 -0.0826231 +0.0565848 -0.112997 -0.00801718 +0.254578 -0.109992 -0.0392232 +-0.303333 -0.108285 -0.0532881 +-0.417106 -0.100391 -0.0967038 +0.291999 -0.10132 -0.0489633 +-0.25886 -0.102537 -0.0395429 +-0.492842 -0.0905476 -0.134605 +-0.219693 -0.0986348 -0.02943 +0.509771 -0.0855565 -0.143955 +0.328318 -0.0925284 -0.0599758 +0.391608 -0.0888359 -0.0841662 +0.0480566 -0.0954503 -0.00572649 +0.540717 -0.0805621 -0.162662 +-0.0616609 -0.0937204 -0.00631272 +-0.246624 -0.0883048 -0.0349202 +0.270816 -0.0863251 -0.0412473 +0.48443 -0.0801459 -0.128849 +-0.440409 -0.0793963 -0.10572 +-0.608986 -0.0700172 -0.209915 +-0.209118 -0.0849496 -0.0258063 +-0.562389 -0.0694999 -0.176053 +0.45897 -0.0752471 -0.11474 +0.307758 -0.0777384 -0.0517165 +0.179953 -0.078958 -0.0194988 +0.432911 -0.0702137 -0.101302 +-0.236326 -0.0746862 -0.0312007 +-0.0919737 -0.0766368 -0.00719205 +-0.646119 -0.057206 -0.23891 +0.034781 -0.0748438 -0.00341147 +0.248996 -0.0714568 -0.0341353 +-0.197533 -0.0714933 -0.0223143 +0.227569 -0.0714939 -0.0288662 +0.0208898 -0.0727904 -0.00287153 +-0.401042 -0.0329568 -0.0845332 +-0.00504672 -0.0359762 -0.000660097 +0.0971429 -0.0354754 -0.005362 +0.21194 -0.03422 -0.0233167 +0.502838 -0.0310976 -0.136179 +0.426882 -0.0313742 -0.0962372 +0.33692 -0.0301137 -0.0589484 +-0.277084 -0.0288348 -0.039587 +0.399197 -0.026568 -0.0835198 +-0.476181 -0.0238961 -0.120977 +-0.516922 -0.0207362 -0.144219 +-0.390953 -0.0205851 -0.0798194 +-0.311379 -0.0211761 -0.0499501 +0.548024 -0.0185756 -0.163744 +0.491418 -0.0180597 -0.129263 +0.270228 -0.0188849 -0.0373888 +0.18924 -0.0166904 -0.018211 +0.232118 -0.015561 -0.0274369 +0.157394 -0.0152909 -0.0125826 +0.315685 -0.0151799 -0.0512573 +0.523961 -0.0134082 -0.148363 +0.465786 -0.0130951 -0.1152 +0.226794 -0.00771854 -0.0260879 +0.472888 -0.00264336 -0.118882 +0.447006 0.00203169 -0.105472 +0.358582 0.00360224 -0.0665088 +0.204733 0.00703555 -0.0212075 +0.419862 0.00699227 -0.092439 +0.172832 0.00865731 -0.0150867 +-0.576733 0.0132666 -0.183175 +-0.622963 0.012862 -0.217854 +-0.277754 0.0204345 -0.039565 +-0.165647 0.0187562 -0.0139933 +0.337278 0.0186096 -0.058779 +0.399921 0.0220395 -0.0837155 +0.279029 0.02475 -0.0400364 +-0.275481 0.0249855 -0.0390184 +-0.477944 0.0244786 -0.121951 +0.516952 0.024814 -0.144345 +0.188475 0.032307 -0.0184535 +-0.0449264 0.0367968 -0.00168762 +0.0334816 0.0342407 -0.00114738 +0.315646 0.0333467 -0.0517093 +0.49189 0.0303404 -0.129871 +-0.267261 0.0337816 -0.0369681 +0.548384 0.0300847 -0.164315 +-0.139517 0.0382599 -0.0105197 +-0.425823 0.0353524 -0.0958845 +0.465934 0.0353411 -0.115887 +0.256659 0.0396244 -0.0343104 +-0.256201 0.0478303 -0.0345606 +0.293193 0.0481214 -0.0451585 +0.607459 0.0394042 -0.206627 +0.230365 0.049901 -0.0281759 +-0.415196 0.0490745 -0.0915927 +0.0601225 0.0527777 -0.00320523 +-0.548754 0.0449517 -0.165226 +0.203212 0.0557678 -0.0224547 +0.0934406 0.0559981 -0.00595118 +-0.290453 0.0552727 -0.0447085 +-0.070945 0.0592453 -0.00428076 +-0.100291 0.0590135 -0.00679352 +-0.0249369 0.0664983 -0.00252512 +-0.404312 0.0628549 -0.0875411 +-0.167272 0.0671015 -0.0163754 +-0.279702 0.0689958 -0.0423955 +0.335899 0.0670824 -0.0604937 +-0.577328 0.0621114 -0.185853 +0.398631 0.0706446 -0.0856133 +-0.313919 0.075939 -0.0535921 +0.540441 0.0685107 -0.161412 +0.186856 0.0805984 -0.0209246 +-0.479054 0.0734002 -0.125289 +-0.393474 0.0767518 -0.0838738 +0.696323 0.0593673 -0.284731 +0.0571766 0.0855199 -0.00530549 +-0.268325 0.082644 -0.040223 +0.313899 0.0816836 -0.0540639 +0.515648 0.0734138 -0.146351 +-0.348284 0.0831471 -0.0663058 +-0.229521 0.0854505 -0.0304546 +0.490368 0.0785314 -0.13203 +0.25516 0.0881935 -0.0371318 +0.546927 0.078398 -0.166499 +-0.30233 0.0901437 -0.0510687 +0.464213 0.0837986 -0.118249 +-0.468126 0.0870949 -0.120641 +-0.382306 0.0905531 -0.0804117 +-0.218643 0.0992948 -0.0292601 +0.260254 0.0986232 -0.0395099 +-0.337067 0.0973394 -0.0635648 +-0.179253 0.102233 -0.0215232 +0.496309 0.0893619 -0.136466 +-0.357968 0.0979652 -0.0714194 +0.355662 0.100417 -0.0707957 +-0.416967 0.0974015 -0.0963122 +-0.030798 0.108797 -0.00641323 +0.169719 0.105536 -0.0201746 +0.105612 0.107905 -0.0114644 +0.249534 0.106718 -0.0375324 +0.444374 0.0989635 -0.109641 +0.297991 0.107012 -0.0514487 +-0.371006 0.10449 -0.077267 +-0.457625 0.101016 -0.116612 +0.416439 0.103869 -0.096789 +0.238398 0.112907 -0.0354181 +-0.32633 0.111008 -0.061285 +-0.0604533 0.11912 -0.00896222 +-0.498546 0.104314 -0.139436 +-0.196126 0.11899 -0.0266677 +-0.27986 0.117577 -0.0471864 +0.0136328 0.122069 -0.00757197 +0.333197 0.115199 -0.0642067 +-0.241466 0.120485 -0.0370995 +0.275156 0.121614 -0.0463233 +0.423256 0.114163 -0.101211 +-0.36037 0.117924 -0.0746743 +0.255137 0.122133 -0.0408395 +-0.538302 0.107456 -0.164127 +-0.246395 0.123351 -0.0387124 +0.395462 0.118623 -0.0892102 +-0.31484 0.124776 -0.0590926 +0.28095 0.130645 -0.0492114 +-0.631819 0.106142 -0.232186 +-0.230682 0.134811 -0.036355 +-0.191808 0.137089 -0.0281891 +0.21657 0.136305 -0.0332952 +-0.152819 0.139915 -0.0217004 +0.190462 0.139399 -0.0282531 +0.402003 0.129254 -0.0935304 +-0.435663 0.128882 -0.109165 +-0.151898 0.143749 -0.022113 +-0.265003 0.141466 -0.0461863 +0.317504 0.140182 -0.062162 +0.258468 0.146415 -0.0451404 +-0.0705315 0.154932 -0.0145958 +0.000221854 0.156168 -0.0122695 +0.380573 0.143984 -0.0865272 +-0.424332 0.142341 -0.105751 +0.466925 0.141813 -0.127148 +-0.215022 0.158044 -0.0362639 +0.549466 0.136336 -0.175683 +-0.137509 0.163242 -0.0230438 +0.172936 0.163907 -0.0288009 +-0.0979833 0.166663 -0.0188666 +0.108672 0.166475 -0.019961 +0.141146 0.165441 -0.0239328 +0.205538 0.163079 -0.035034 +0.0763147 0.167877 -0.0171503 +-0.288311 0.16254 -0.0563595 +0.358172 0.158495 -0.0798954 +0.203657 0.166271 -0.03518 +-0.412991 0.156388 -0.102792 +0.473325 0.152118 -0.132346 +0.301187 0.165378 -0.0608853 +0.133102 0.172093 -0.0239529 +-0.368409 0.162956 -0.0847295 +-0.657339 0.132898 -0.258216 +0.210507 0.172472 -0.0377421 +-0.322477 0.169637 -0.0687473 +-0.546177 0.152111 -0.176257 +-0.238439 0.178997 -0.0454806 +-0.593567 0.151413 -0.209587 +0.425189 0.171822 -0.111354 +-0.0822675 0.190427 -0.0217518 +-0.0116259 0.191588 -0.0185934 +-0.443618 0.173349 -0.120709 +-0.050614 0.192754 -0.0200592 +0.341983 0.183501 -0.0783844 +0.283917 0.189929 -0.0601499 +-0.535765 0.166056 -0.172122 +-0.195927 0.195086 -0.038983 +-0.188161 0.196088 -0.0376358 +0.589735 0.161077 -0.20863 +0.128497 0.199792 -0.0286237 +-0.149142 0.19884 -0.0313828 +0.161294 0.199075 -0.0333805 +0.193172 0.197408 -0.0388991 +0.0640392 0.202771 -0.02287 +0.431056 0.182516 -0.116327 +-0.346094 0.190822 -0.0814107 +0.403344 0.186738 -0.104209 +-0.432113 0.187219 -0.117828 +-0.261967 0.200189 -0.0559143 +0.229977 0.206027 -0.0488622 +-0.0662635 0.214544 -0.0255361 +-0.296257 0.206938 -0.0675791 +0.409807 0.197311 -0.109423 +0.325065 0.2083 -0.0775338 +-0.420989 0.201146 -0.115518 +-0.172687 0.219822 -0.0398658 +0.266218 0.214615 -0.0602826 +-0.376197 0.207729 -0.0970469 +-0.330414 0.21439 -0.0808355 +0.387183 0.211645 -0.102617 +-0.0592097 0.233089 -0.0293487 +0.272377 0.225026 -0.0644924 +-0.0907673 0.234383 -0.0321024 +0.180447 0.232022 -0.0441733 +0.0839459 0.235787 -0.0318277 +0.116553 0.234884 -0.0349898 +0.148968 0.233838 -0.0392044 +-0.205083 0.231966 -0.0491411 +-0.364951 0.221654 -0.0957431 +-0.502767 0.207493 -0.160851 +-0.31896 0.228321 -0.0801446 +0.393291 0.222524 -0.107921 +0.161025 0.23981 -0.0426276 +-0.45047 0.217978 -0.134227 +-0.195819 0.24079 -0.0493817 +0.217925 0.240799 -0.0542069 +0.307397 0.232894 -0.0773586 +-0.157061 0.24348 -0.0428953 +-0.0474698 0.246589 -0.0320432 +0.0248087 0.249156 -0.0318545 +0.158871 0.250266 -0.0449465 +-0.269464 0.245073 -0.0686952 +0.370347 0.236503 -0.101718 +0.313364 0.243355 -0.0820779 +0.0340865 0.256837 -0.0341464 +0.254058 0.249278 -0.0654867 +-0.440119 0.231877 -0.132516 +-0.394697 0.23843 -0.112664 +-0.0742353 0.259063 -0.0369967 +-0.00320005 0.260317 -0.0344822 +-0.349775 0.245254 -0.0958385 +0.0334475 0.262277 -0.0355871 +0.147933 0.25928 -0.0455946 +-0.303946 0.252194 -0.0812971 +0.00832266 0.266939 -0.0363224 +0.116778 0.264825 -0.0428007 +0.37619 0.247176 -0.107036 +-0.48028 0.235168 -0.154999 +-0.180217 0.264601 -0.0526309 +-0.140909 0.267484 -0.0467964 +0.136651 0.26862 -0.0464959 +0.104899 0.269993 -0.0428688 +-0.383678 0.252475 -0.111717 +-0.578242 0.223806 -0.215432 +0.489052 0.239422 -0.161248 +-0.338313 0.259536 -0.095464 +0.462355 0.244522 -0.147688 +-0.25363 0.268487 -0.0707064 +0.353046 0.261443 -0.101665 +-0.0982958 0.279243 -0.044824 +0.295215 0.267705 -0.08284 +0.0764056 0.280767 -0.04327 +0.205113 0.275529 -0.0608447 +-0.0622032 0.281516 -0.0424618 +-0.288199 0.275575 -0.0829396 +-0.201784 0.280848 -0.0616996 +0.494345 0.249543 -0.167323 +0.467759 0.254387 -0.153543 +0.358701 0.27129 -0.10684 +0.3013 0.278295 -0.0879855 +-0.0582157 0.292946 -0.0456448 +-0.412863 0.269423 -0.129968 +-0.36845 0.276214 -0.112334 +-0.322356 0.282982 -0.0966686 +0.040094 0.29843 -0.046411 +0.549587 0.248826 -0.202479 +-0.238058 0.29224 -0.073758 +0.49938 0.259893 -0.173516 +0.0602713 0.299825 -0.0479116 +0.166498 0.295682 -0.0593351 +0.473007 0.264579 -0.159606 +0.44588 0.269329 -0.146388 +-0.121736 0.30014 -0.0539047 +0.247256 0.29425 -0.0768091 +0.364097 0.282151 -0.112405 +0.197329 0.297512 -0.0658972 +0.203396 0.297559 -0.0672145 +-0.165694 0.304814 -0.0621118 +-0.0581834 0.310239 -0.0511237 +0.554054 0.258466 -0.20866 +0.529745 0.264695 -0.194204 +0.478185 0.27497 -0.165896 +0.50399 0.270044 -0.179591 +0.561939 0.262873 -0.215703 +-0.442398 0.286504 -0.150177 +0.0488997 0.320089 -0.0538753 +-0.307034 0.306483 -0.0990015 +-0.183605 0.318543 -0.0700432 +-0.144791 0.321831 -0.0643398 +-0.0350449 0.324967 -0.054924 +0.456549 0.28957 -0.158743 +0.482812 0.285022 -0.171957 +0.534207 0.274516 -0.20046 +0.0682377 0.325085 -0.0567803 +0.101006 0.324337 -0.0594663 +0.165942 0.321983 -0.0679109 +0.28751 0.312184 -0.0945282 +0.345775 0.305833 -0.112923 +0.428643 0.294227 -0.145778 +-0.103946 0.3249 -0.0599813 +-0.0487755 0.327124 -0.0562781 +0.129854 0.325884 -0.0635507 +-0.306012 0.313297 -0.100999 +-0.482978 0.289669 -0.173668 +-0.0622092 0.331882 -0.0587327 +-0.386868 0.307328 -0.130585 +-0.256909 0.3228 -0.0890677 +-0.101895 0.333857 -0.0628996 +0.04055 0.336198 -0.0590821 +0.0730098 0.335491 -0.0607902 +0.202793 0.330588 -0.0782698 +0.351267 0.316136 -0.118712 +0.293527 0.323121 -0.100314 +0.433843 0.304003 -0.151847 +0.461208 0.299683 -0.164849 +0.487418 0.295484 -0.178347 +-0.291287 0.33015 -0.10214 +-0.0582472 0.346278 -0.063678 +0.0130461 0.347724 -0.0624937 +0.238686 0.33838 -0.0897649 +0.356284 0.326769 -0.124624 +0.46586 0.309592 -0.171068 +-0.37099 0.330851 -0.1323 +-0.2028 0.349399 -0.0852363 +-0.164049 0.351711 -0.0783778 +-0.124559 0.354716 -0.0733601 +-0.241114 0.347323 -0.0937823 +0.244213 0.348989 -0.0952534 +0.547705 0.304194 -0.220587 +-0.456377 0.32719 -0.172554 +-0.275563 0.354302 -0.106392 +-0.508326 0.316594 -0.199142 +-0.0812619 0.367194 -0.073412 +-0.0104995 0.368494 -0.0704292 +0.448589 0.333842 -0.170954 +-0.355247 0.354322 -0.134982 +-0.400204 0.347719 -0.152104 +0.0974441 0.378249 -0.0794392 +0.13007 0.377079 -0.0829978 +-0.30958 0.361642 -0.120582 +0.161798 0.375538 -0.0874253 +0.19393 0.374258 -0.09318 +0.284363 0.36663 -0.114156 +0.342285 0.360095 -0.132145 +0.453141 0.343749 -0.177504 +0.479433 0.33923 -0.190638 +-0.143715 0.385564 -0.08858 +0.531159 0.328917 -0.219177 +0.555893 0.32287 -0.234012 +0.0698048 0.389448 -0.0816008 +-0.221007 0.380154 -0.101869 +-0.182787 0.38297 -0.094504 +-0.0339444 0.389712 -0.0796892 +-0.441805 0.350962 -0.174389 +0.167184 0.386188 -0.0928571 +0.198577 0.384263 -0.0983854 +0.28918 0.376284 -0.119781 +0.347091 0.369957 -0.138223 +0.457369 0.353333 -0.18393 +0.0419656 0.400501 -0.0846653 +-0.255748 0.387341 -0.114246 +0.559659 0.332423 -0.240872 +-0.384612 0.371305 -0.154892 +0.203975 0.39462 -0.104082 +0.352021 0.379921 -0.144582 +-0.590648 0.328534 -0.262979 +0.433993 0.368165 -0.177744 +0.461848 0.363173 -0.190802 +-0.654767 0.310157 -0.310737 +-0.0565897 0.410614 -0.0899484 +0.0469203 0.410967 -0.089558 +-0.289589 0.394387 -0.127878 +0.514181 0.353424 -0.218521 +0.539308 0.347855 -0.233095 +0.563283 0.342207 -0.247932 +0.299356 0.397236 -0.132481 +0.356735 0.389779 -0.150993 +0.0188113 0.421583 -0.0934055 +-0.162013 0.416443 -0.10539 +0.465725 0.372724 -0.197394 +0.492516 0.368138 -0.211392 +0.244043 0.412302 -0.122247 +-0.32365 0.402671 -0.143784 +0.304008 0.407274 -0.138776 +-0.467206 0.378176 -0.200812 +0.361399 0.399705 -0.157607 +-0.691836 0.330198 -0.357869 +-0.349377 0.429386 -0.167196 +0.317344 0.43766 -0.158723 +0.373779 0.429513 -0.177925 +-0.176226 0.457626 -0.128494 +-0.490606 0.405325 -0.228626 +0.0986946 0.463075 -0.119193 +0.263182 0.452918 -0.148178 +-0.681583 0.343979 -0.354149 +0.321995 0.447385 -0.165634 +-0.0231388 0.474518 -0.120059 +-0.133313 0.470274 -0.127607 +0.37784 0.438979 -0.184811 +-0.211265 0.464876 -0.140199 +0.112526 0.473399 -0.126369 +0.144123 0.471119 -0.129784 +0.326211 0.45672 -0.172357 +-0.0895463 0.482485 -0.128685 +-0.0187523 0.485145 -0.125767 +0.116763 0.482692 -0.132028 +-0.245404 0.47203 -0.153262 +-0.0532154 0.485917 -0.127617 +0.148901 0.481489 -0.136289 +-0.329229 0.462823 -0.176955 +0.271956 0.472287 -0.161558 +-0.374992 0.456369 -0.193088 +0.330405 0.466093 -0.179275 +0.0888316 0.493798 -0.134972 +0.121625 0.492866 -0.138437 +-0.584013 0.403572 -0.295686 +-0.0577823 0.49654 -0.133912 +-0.27879 0.479076 -0.167677 +0.414428 0.454208 -0.211365 +0.275807 0.481908 -0.168318 +0.0938681 0.503863 -0.141332 +0.126354 0.502774 -0.144866 +0.158218 0.501082 -0.149186 +0.417674 0.46347 -0.218498 +0.0984621 0.513761 -0.147735 +0.162611 0.510612 -0.155706 +-0.354444 0.489849 -0.203497 +-0.03258 0.524753 -0.149369 +-0.398855 0.482931 -0.220454 +-0.142182 0.520459 -0.158034 +0.0706966 0.524975 -0.151824 +-0.181086 0.517847 -0.163912 +0.103048 0.52375 -0.154384 +0.135391 0.52232 -0.158067 +-0.304666 0.506136 -0.193151 +0.52683 0.452983 -0.280795 +-0.0280499 0.534978 -0.1556 +-0.138191 0.530552 -0.163688 +0.107651 0.533249 -0.160919 +0.139787 0.531981 -0.164862 +-0.215656 0.525191 -0.176795 +0.37481 0.50039 -0.219534 +-0.0234201 0.545122 -0.16197 +0.111841 0.542907 -0.167688 +-0.491641 0.476111 -0.270886 +0.378178 0.509235 -0.226915 +0.26736 0.532822 -0.197118 +-0.0897114 0.552392 -0.171257 +-0.019022 0.555103 -0.168436 +0.116022 0.552305 -0.174471 +0.325806 0.52666 -0.214838 +-0.245288 0.542258 -0.196389 +-0.328834 0.532775 -0.220244 +-0.0853024 0.562587 -0.177675 +-0.0144482 0.564812 -0.174907 +-0.374369 0.526256 -0.236519 +-0.0808324 0.572568 -0.184137 +-0.414185 0.529039 -0.259346 +0.249265 0.563982 -0.212732 +-0.0762817 0.582475 -0.190738 +-0.00515176 0.584104 -0.188337 +0.364896 0.550288 -0.248979 +0.469473 0.523136 -0.288717 +-0.000489558 0.593507 -0.195171 +-0.0717734 0.592271 -0.197464 +0.311643 0.566811 -0.23737 +-0.265695 0.578804 -0.229032 +0.0037653 0.602965 -0.202241 +-0.066977 0.602078 -0.204377 +-0.450161 0.542177 -0.290494 +-0.261851 0.589236 -0.235647 +0.346881 0.58191 -0.264436 +-0.335343 0.598909 -0.272777 +0.179205 0.626027 -0.241069 +0.481949 0.558581 -0.324936 +0.0866337 0.639549 -0.236147 +0.119434 0.638811 -0.239963 +0.151159 0.636876 -0.243997 +-0.331121 0.608985 -0.279239 +-0.00733754 0.659387 -0.248232 +-0.0779118 0.657801 -0.250848 +-0.317358 0.638563 -0.298914 +-0.228859 0.657393 -0.282046 +0.0340739 0.67729 -0.265074 +-0.363111 0.632141 -0.315494 +-0.116447 0.677061 -0.273344 +-0.0319397 0.687055 -0.274097 +-0.142 0.6824 -0.282947 +0.103628 0.685374 -0.27922 diff --git a/image_analysis/indexing/fast-feedback-indexer/data/image8_radial.txt b/image_analysis/indexing/fast-feedback-indexer/data/image8_radial.txt new file mode 100644 index 000000000..903cba09f --- /dev/null +++ b/image_analysis/indexing/fast-feedback-indexer/data/image8_radial.txt @@ -0,0 +1,635 @@ +36.9 0 0 4.83429e-15 78.95 0 4.83429e-15 4.83429e-15 78.95 +-0.0231438 0.474516 -0.120057 +0.0986946 0.463075 -0.119193 +-0.00749173 0.458138 -0.111151 +0.0252708 0.429886 -0.0974706 +-0.0466629 0.42984 -0.0983014 +0.244043 0.412302 -0.122247 +-0.0469665 0.42664 -0.0967985 +0.0188112 0.421583 -0.0934055 +-0.162002 0.416448 -0.10539 +-0.166014 0.407832 -0.102162 +0.0468476 0.410923 -0.0895346 +0.0187185 0.411808 -0.0889214 +-0.0565731 0.410624 -0.0899518 +-0.24676 0.398409 -0.116609 +-0.0298609 0.40736 -0.0872208 +0.203975 0.39462 -0.104082 +0.0419657 0.400501 -0.0846653 +-0.255751 0.387343 -0.114248 +0.289047 0.376408 -0.119791 +0.198577 0.384263 -0.0983854 +-0.103405 0.389773 -0.084913 +0.16719 0.386292 -0.0929024 +0.0697987 0.389437 -0.0815955 +-0.143707 0.385558 -0.088576 +-0.22101 0.380164 -0.101874 +0.193473 0.383835 -0.0970942 +-0.0338538 0.38966 -0.0796636 +-0.182787 0.38297 -0.094504 +-0.0570494 0.387384 -0.0798483 +0.140226 0.379746 -0.0855986 +0.28437 0.366661 -0.114171 +0.161591 0.375467 -0.0873596 +0.0974749 0.378243 -0.0794398 +-0.0369541 0.380958 -0.0761463 +0.130064 0.377076 -0.0829957 +0.0567629 0.378993 -0.0763431 +-0.187378 0.370833 -0.0903997 +0.0931693 0.373254 -0.076961 +0.094483 0.36977 -0.0756931 +0.19393 0.374258 -0.09318 +-0.0105095 0.368513 -0.070437 +-0.275651 0.354348 -0.106438 +-0.0812619 0.367194 -0.073412 +0.10841 0.360131 -0.0734188 +0.244213 0.348989 -0.0952534 +-0.124566 0.354719 -0.073362 +-0.241098 0.347407 -0.0938103 +-0.202782 0.349404 -0.0852342 +-0.164049 0.351711 -0.0783778 +-0.196472 0.348027 -0.0833345 +0.356284 0.326769 -0.124624 +0.0130461 0.347724 -0.0624937 +0.238559 0.338502 -0.089777 +-0.147526 0.342573 -0.072164 +-0.291287 0.33015 -0.10214 +-0.0582471 0.346278 -0.063678 +0.293468 0.323084 -0.100282 +0.202794 0.33057 -0.0782636 +0.04055 0.336198 -0.0590821 +0.351267 0.316136 -0.118712 +-0.252038 0.326676 -0.0890884 +0.0730098 0.335491 -0.0607901 +-0.101895 0.333857 -0.0628996 +-0.341292 0.314029 -0.114051 +-0.256909 0.3228 -0.0890677 +-0.0622092 0.331882 -0.0587327 +0.283281 0.316855 -0.0948178 +0.16714 0.32575 -0.0694348 +0.161973 0.326507 -0.0687867 +-0.305952 0.313281 -0.100974 +0.345779 0.305841 -0.112927 +0.165957 0.321979 -0.0679122 +-0.0487755 0.327124 -0.0562781 +-0.103946 0.3249 -0.0599813 +0.287889 0.312568 -0.0947811 +0.101006 0.324337 -0.0594663 +0.0682377 0.325085 -0.0567803 +-0.144791 0.321831 -0.0643398 +-0.183605 0.318543 -0.0700432 +-0.22154 0.316185 -0.0775321 +-0.0350402 0.324971 -0.0549252 +-0.179044 0.317582 -0.0688261 +-0.307031 0.306489 -0.0990025 +-0.215839 0.312397 -0.0748936 +-0.186437 0.310271 -0.0678128 +-0.0581834 0.310239 -0.0511237 +0.307858 0.294893 -0.0954218 +-0.233305 0.301393 -0.0754831 +-0.165694 0.304814 -0.0621118 +0.197329 0.297512 -0.0658972 +0.364122 0.28217 -0.112422 +0.247256 0.29425 -0.076809 +0.203396 0.297559 -0.0672145 +-0.121727 0.300136 -0.0539021 +-0.238063 0.292246 -0.0737611 +0.166498 0.295682 -0.0593351 +0.0602713 0.299825 -0.0479116 +0.0400941 0.29843 -0.046411 +-0.322422 0.28296 -0.0966851 +-0.36845 0.276214 -0.112334 +0.358708 0.27133 -0.106855 +0.301349 0.278279 -0.0879971 +0.30958 0.274588 -0.0896368 +-0.288197 0.275548 -0.0829308 +-0.201784 0.280848 -0.0616996 +0.205113 0.275529 -0.0608447 +0.0764056 0.280767 -0.04327 +-0.0622032 0.281516 -0.0424618 +0.295192 0.267703 -0.0828321 +-0.0982958 0.279243 -0.044824 +0.353213 0.261458 -0.101735 +-0.253632 0.268485 -0.0707064 +0.116062 0.37042 -0.078415 +-0.323449 0.261612 -0.0906376 +-0.338318 0.259471 -0.0954472 +-0.383686 0.252487 -0.111723 +-0.10937 0.401756 -0.0908079 +0.136651 0.26862 -0.0464959 +0.104899 0.269993 -0.0428687 +-0.386704 0.250351 -0.112428 +-0.140909 0.267484 -0.0467964 +-0.180216 0.264601 -0.0526309 +0.00832267 0.266939 -0.0363224 +0.376253 0.247221 -0.107075 +-0.30388 0.252127 -0.0812569 +0.138306 0.462667 -0.124323 +0.0334476 0.262276 -0.0355871 +-0.349739 0.245327 -0.0958447 +-0.0032 0.260317 -0.0344822 +-0.0742353 0.259063 -0.0369967 +0.254058 0.249278 -0.0654867 +-0.394885 0.23845 -0.112753 +0.312119 0.243968 -0.0818163 +0.0340866 0.256837 -0.0341464 +0.370347 0.236503 -0.101718 +-0.269399 0.24499 -0.0686545 +0.158871 0.250266 -0.0449465 +0.217926 0.2408 -0.0542074 +-0.0474698 0.246589 -0.0320432 +-0.15701 0.24352 -0.0428972 +-0.195819 0.24079 -0.0493817 +0.307397 0.232894 -0.0773586 +0.291632 0.233784 -0.0724788 +0.393291 0.222524 -0.107921 +-0.319108 0.228412 -0.0802187 +0.148968 0.233838 -0.0392044 +0.116553 0.234884 -0.0349898 +0.0839459 0.235787 -0.0318277 +-0.205083 0.231966 -0.0491411 +-0.365013 0.221558 -0.0957446 +0.180447 0.232022 -0.0441733 +-0.0907673 0.234383 -0.0321024 +0.272377 0.225026 -0.0644924 +0.387156 0.211651 -0.102607 +-0.330405 0.214395 -0.0808333 +-0.080795 0.425216 -0.0985215 +-0.376197 0.207729 -0.0970469 +0.266218 0.214615 -0.0602826 +-0.172718 0.219785 -0.039863 +-0.420989 0.201146 -0.115518 +0.325067 0.208297 -0.077534 +-0.138088 0.354776 -0.0753023 +0.409791 0.197274 -0.109408 +-0.296257 0.206938 -0.0675791 +-0.0662635 0.214544 -0.0255361 +0.229978 0.206027 -0.0488623 +-0.432163 0.187232 -0.117855 +-0.261967 0.200189 -0.0559143 +-0.167052 0.343386 -0.0757815 +-0.177276 0.328907 -0.072426 +0.403344 0.186738 -0.104209 +0.0640392 0.202771 -0.02287 +-0.346136 0.1906 -0.0813806 +0.431056 0.182516 -0.116327 +0.161294 0.199075 -0.0333805 +0.128497 0.199792 -0.0286238 +0.193149 0.197417 -0.0388965 +-0.149142 0.19884 -0.0313828 +-0.188161 0.196088 -0.0376358 +0.283917 0.189929 -0.0601499 +0.341988 0.183499 -0.0783862 +-0.443661 0.17334 -0.120729 +-0.0506139 0.192754 -0.0200592 +-0.0116259 0.191588 -0.0185935 +0.425183 0.171812 -0.111349 +-0.0822675 0.190427 -0.0217518 +-0.238435 0.178998 -0.04548 +-0.402423 0.169794 -0.10043 +-0.322477 0.169637 -0.0687473 +0.210507 0.172472 -0.0377421 +-0.368409 0.162956 -0.0847295 +0.301187 0.165378 -0.0608853 +0.133102 0.172093 -0.0239529 +-0.412987 0.156389 -0.102791 +0.358173 0.158492 -0.0798954 +0.0763147 0.167877 -0.0171503 +-0.288311 0.16254 -0.0563595 +0.108673 0.166475 -0.0199611 +-0.137509 0.163242 -0.0230438 +0.172935 0.163908 -0.0288008 +0.141146 0.165441 -0.0239328 +-0.215022 0.158044 -0.0362638 +-0.424332 0.142341 -0.105751 +0.380606 0.144021 -0.0865465 +0.000221877 0.156168 -0.0122695 +-0.070531 0.154934 -0.014596 +0.258468 0.146415 -0.0451404 +0.317504 0.140182 -0.062162 +0.0507247 0.147468 -0.0122347 +-0.265003 0.141469 -0.0461866 +-0.151898 0.143749 -0.022113 +0.190462 0.139399 -0.0282531 +-0.435663 0.128882 -0.109165 +-0.152819 0.139915 -0.0217004 +0.402003 0.129254 -0.0935304 +0.21657 0.136305 -0.0332952 +-0.191808 0.137089 -0.0281891 +-0.230682 0.134811 -0.036355 +0.28095 0.130645 -0.0492114 +-0.31484 0.124776 -0.0590926 +-0.420804 0.119338 -0.100732 +0.395462 0.118623 -0.0892102 +-0.360435 0.117823 -0.074687 +0.423256 0.114163 -0.101211 +0.275201 0.121768 -0.046356 +-0.246395 0.123351 -0.0387124 +-0.241466 0.120485 -0.0370995 +0.333197 0.115199 -0.0642067 +0.0136328 0.122069 -0.00757197 +-0.196126 0.11899 -0.0266677 +-0.0604533 0.11912 -0.00896222 +-0.32633 0.111008 -0.061285 +0.238398 0.112907 -0.0354181 +0.416439 0.103869 -0.096789 +0.0248087 0.249156 -0.0318545 +-0.457616 0.101 -0.116605 +0.19678 -0.236921 -0.0486082 +-0.145877 -0.237096 -0.0395286 +-0.365971 -0.22414 -0.0967688 +-0.372477 -0.22676 -0.100088 +-0.331236 -0.231283 -0.0852374 +-0.0809198 -0.331027 -0.0598547 +0.419873 0.00699189 -0.0924438 +-0.0809036 -0.372856 -0.0756447 +0.223434 -0.200645 -0.0461558 +0.194673 -0.407392 -0.107736 +0.0968562 -0.446969 -0.110709 +0.185959 -0.251828 -0.0502622 +0.464213 0.0837987 -0.118249 +0.22753 -0.365364 -0.0973711 +0.422596 -0.132594 -0.103433 +-0.0449263 0.0367968 -0.00168761 +-0.412195 -0.139205 -0.0996017 +-0.252221 -0.273827 -0.071882 +0.297991 0.107012 -0.0514487 +-0.058974 -0.261004 -0.0364655 +-0.388245 -0.160355 -0.0925021 +0.313617 -0.249919 -0.0839296 +-0.196775 -0.338772 -0.0799386 +-0.129614 -0.305109 -0.0565442 +-0.241919 -0.260436 -0.0653085 +0.276374 -0.258139 -0.074267 +0.157394 -0.0152909 -0.0125826 +0.398612 0.0706642 -0.0856067 +-0.3142 -0.255833 -0.0857641 +-0.31034 -0.256176 -0.0845422 +0.0565849 -0.112997 -0.00801719 +-0.207172 -0.32698 -0.0779565 +-0.0104419 -0.372693 -0.0721039 +-0.404285 0.0628443 -0.0875283 +-0.439891 -0.170922 -0.118364 +-0.169024 -0.349838 -0.0785643 +0.32392 -0.278296 -0.0957725 +-0.0696944 -0.274645 -0.0409835 +0.0645971 -0.445302 -0.106953 +-0.417169 -0.100423 -0.0967363 +0.238682 -0.309113 -0.0794132 +-0.297667 -0.323088 -0.101664 +0.337278 0.0186096 -0.058779 +0.313899 0.0816837 -0.054064 +-0.0736466 -0.321073 -0.0558135 +0.00137842 -0.274145 -0.0383126 +-0.139517 0.0382599 -0.0105197 +-0.0991462 -0.433497 -0.104316 +0.391681 -0.179727 -0.0976231 +-0.337067 0.0973395 -0.0635648 +0.407548 -0.156134 -0.100263 +0.412303 -0.237038 -0.12033 +-0.218643 0.0992947 -0.0292601 +-0.319209 -0.291556 -0.0982792 +0.133479 -0.398575 -0.0926292 +0.097143 -0.0354754 -0.00536201 +-0.00912518 -0.287409 -0.0422354 +-0.0797773 -0.287946 -0.045682 +-0.269107 -0.249876 -0.0698691 +0.228472 -0.280433 -0.0677136 +0.333046 -0.306438 -0.108273 +0.18924 -0.0166904 -0.018211 +-0.303333 -0.108285 -0.0532881 +-0.110192 -0.405177 -0.0924266 +0.175602 -0.222053 -0.0409087 +-0.29757 -0.281284 -0.0876779 +-0.229521 0.0854505 -0.0304546 +-0.129162 -0.185755 -0.02593 +0.286468 -0.286621 -0.0857873 +0.137434 -0.357718 -0.076339 +-0.0194891 -0.300816 -0.0465169 +-0.158553 -0.294006 -0.0574389 +-0.0138115 -0.300838 -0.0464246 +-0.0307981 0.108797 -0.00641324 +0.312661 -0.11606 -0.0572523 +0.265664 -0.229248 -0.0635875 +-0.272907 -0.289459 -0.0825386 +-0.376873 -0.280424 -0.117204 +-0.196357 -0.297147 -0.0655763 +-0.210726 -0.14564 -0.0333649 +0.116295 -0.30094 -0.0534746 +-0.309468 0.361728 -0.120579 +-0.241084 -0.126471 -0.0377716 +-0.0911042 -0.301821 -0.0509982 +0.426882 -0.0313742 -0.0962372 +-0.300417 -0.290423 -0.0914823 +0.144799 -0.301849 -0.0577046 +-0.29847 -0.2717 -0.0850712 +-0.290453 0.0552726 -0.0447085 +0.117563 -0.304332 -0.0547164 +-0.313919 0.0759389 -0.0535921 +-0.223589 -0.298135 -0.0720326 +0.355663 0.100417 -0.0707957 +0.0477941 -0.250808 -0.0331437 +-0.415194 0.0490686 -0.0915916 +-0.468156 0.0870916 -0.120657 +-0.059395 -0.386904 -0.079795 +-0.115493 -0.309539 -0.056153 +-0.148806 -0.407843 -0.0991557 +0.275254 -0.301684 -0.0871899 +0.447006 0.00203164 -0.105472 +0.18376 -0.420801 -0.111654 +0.105521 -0.314548 -0.0566418 +0.228226 -0.324036 -0.0818967 +0.303337 -0.220988 -0.0730959 +0.104858 -0.35697 -0.071788 +-0.219693 -0.0986348 -0.02943 +-0.267261 0.0337816 -0.0369681 +-0.0579815 -0.321615 -0.0549065 +0.432911 -0.0702137 -0.101302 +0.254564 -0.109994 -0.03922 +0.202811 -0.31819 -0.0739208 +-0.283657 -0.171704 -0.0565721 +-0.440415 -0.0793925 -0.105723 +-0.348284 -0.207508 -0.0858675 +-0.359946 -0.305361 -0.118414 +-0.252595 -0.317271 -0.085924 +0.377387 0.0857531 -0.0779235 +0.159407 -0.154917 -0.0250179 +0.0944777 -0.32827 -0.0601529 +0.205608 -0.393876 -0.104128 +0.126653 -0.329378 -0.0643348 +-0.0113786 -0.328941 -0.055718 +0.202338 -0.265203 -0.057277 +-0.230669 -0.112763 -0.0335238 +0.465786 -0.013095 -0.1152 +0.270817 -0.0863287 -0.0412479 +-0.285879 -0.224542 -0.0684132 +-0.164347 -0.195928 -0.0332517 +0.290179 -0.233846 -0.0720387 +0.20742 -0.266555 -0.0587639 +0.402526 -0.208423 -0.108634 +-0.224553 -0.32743 -0.082195 +-0.433768 -0.209339 -0.123631 +0.449106 -0.137549 -0.117173 +-0.213092 -0.228911 -0.0501624 +-0.0599635 -0.430356 -0.0993348 +-0.348284 0.0831471 -0.0663058 +-0.165647 0.0187561 -0.0139933 +-0.041833 -0.413783 -0.0905862 +-0.477906 0.0245464 -0.121932 +0.399095 -0.0265226 -0.0834741 +-0.205158 -0.333957 -0.0800092 +-0.228793 -0.332467 -0.0850577 +-0.107055 -0.234894 -0.0338922 +-0.179253 0.102233 -0.0215232 +0.0835153 -0.342134 -0.0640674 +-0.0205545 -0.343434 -0.0610483 +-0.242803 -0.388144 -0.110961 +-0.126928 -0.464924 -0.123795 +0.248996 -0.0714568 -0.0341353 +0.115753 -0.343145 -0.0678774 +0.105612 0.107905 -0.0114644 +-0.0241329 0.418336 -0.0920283 +0.0329955 -0.443597 -0.104381 +0.216433 -0.338027 -0.0840881 +-0.394146 -0.256267 -0.117404 +-0.425376 -0.0137413 -0.0950876 +0.188475 0.032307 -0.0184535 +0.285008 -0.371306 -0.116313 +-0.271891 -0.334849 -0.0978073 +-0.120249 -0.375988 -0.081211 +-0.383121 -0.10779 -0.0826126 +0.226777 -0.295151 -0.0718524 +0.286449 -0.329387 -0.100305 +-0.0380583 -0.445104 -0.10533 +0.0453626 -0.390435 -0.0804878 +0.0731759 -0.356065 -0.0684083 +0.275115 -0.344158 -0.102299 +-0.0349534 0.394302 -0.081684 +0.0028006 -0.358477 -0.0664657 +-0.476182 -0.0238909 -0.120978 +-0.235413 -0.165347 -0.042273 +0.238082 -0.35152 -0.0945992 +-0.204501 -0.427824 -0.119576 +-0.0562656 -0.416245 -0.0924899 +0.111871 -0.359369 -0.0735344 +0.323149 -0.321307 -0.109867 +-0.0743478 -0.193048 -0.0216316 +0.102745 0.388586 -0.0843339 +-0.0570538 -0.362529 -0.0697756 +-0.142063 -0.358942 -0.0775149 +-0.0283232 -0.472517 -0.119134 +0.215581 0.29592 -0.0694326 +0.463114 -0.113837 -0.121043 +0.207167 -0.150497 -0.0333396 +0.203212 0.0557679 -0.0224547 +-0.393382 -0.166372 -0.0958037 +0.00837604 -0.17791 -0.0159889 +-0.209118 -0.0849497 -0.0258063 +0.127037 -0.154093 -0.0201445 +0.332389 -0.348625 -0.123657 +0.228737 -0.148153 -0.0378513 +-0.253327 -0.359476 -0.10189 +-0.319218 -0.219419 -0.07807 +0.358582 0.00360228 -0.0665087 +-0.270282 -0.376738 -0.113989 +-0.0364843 -0.370643 -0.0719416 +-0.390923 -0.0206439 -0.0798083 +0.270228 -0.0188849 -0.0373888 +-0.228948 -0.205097 -0.0484129 +0.328664 -0.183256 -0.0735027 +-0.311379 -0.0211761 -0.0499501 +0.128071 -0.371106 -0.0802834 +0.335899 0.0670824 -0.0604937 +-0.0390631 -0.211592 -0.0234228 +0.185726 -0.117654 -0.0244676 +0.216731 -0.379557 -0.100576 +-0.0868086 -0.374758 -0.0769504 +0.035086 -0.23208 -0.0279362 +0.0347809 -0.0748438 -0.00341147 +0.119899 -0.342045 -0.0679971 +-0.371019 0.104488 -0.0772717 +-0.00416174 -0.192827 -0.0187761 +-0.382741 -0.1997 -0.0979861 +0.108578 -0.356359 -0.0719812 +-0.197533 -0.0714933 -0.0223143 +0.256659 0.0396243 -0.0343104 +-0.357968 0.0979652 -0.0714194 +0.172773 -0.434005 -0.115811 +0.179953 -0.078958 -0.0194988 +0.275857 -0.124864 -0.0469459 +0.171753 0.395005 -0.0975189 +-0.0704124 -0.401577 -0.0868857 +-0.201585 -0.215037 -0.0444256 +0.0467375 -0.217783 -0.0251225 +-0.158487 -0.378281 -0.0879773 +0.129663 -0.447289 -0.115059 +0.180994 -0.170485 -0.0314051 +-0.349842 -0.133864 -0.0728049 +0.0171693 -0.432667 -0.0986098 +0.360128 -0.312244 -0.120903 +-0.256201 0.0478303 -0.0345606 +-0.214698 -0.398849 -0.108471 +0.345345 -0.159969 -0.0752586 +0.0865368 -0.459542 -0.11607 +-0.0175012 -0.461134 -0.112842 +-0.0583789 -0.304592 -0.0493079 +-0.0882584 -0.462064 -0.117556 +0.391623 -0.0888557 -0.0841748 +-0.167272 0.0671015 -0.0163754 +-0.0558039 -0.435704 -0.101641 +0.210564 -0.144262 -0.0331229 +-0.0201968 -0.385115 -0.0773526 +-0.312947 -0.219028 -0.0758297 +0.254737 0.0883362 -0.0370328 +0.00389913 -0.475694 -0.120398 +0.203657 0.166271 -0.03518 +0.20825 -0.363207 -0.0918631 +-0.0671556 -0.476554 -0.123424 +0.292029 -0.192046 -0.0630702 +0.0117333 -0.428805 -0.0966793 +-0.268325 0.082644 -0.040223 +0.360031 -0.269296 -0.106772 +-0.298487 -0.146594 -0.0569117 +0.242673 -0.157171 -0.0427086 +-0.0632307 -0.395268 -0.0836131 +0.12269 -0.393581 -0.0889339 +-0.382306 0.090553 -0.0804117 +-0.0497103 -0.270218 -0.0384849 +-0.0979833 0.166663 -0.0188666 +-0.0563967 -0.384527 -0.0786104 +0.383989 0.0930882 -0.0813666 +0.0480566 -0.0954503 -0.00572649 +-0.113449 -0.368147 -0.07718 +0.291999 -0.10132 -0.0489633 +0.380522 -0.15103 -0.0876445 +0.444373 0.0989453 -0.109639 +0.170805 -0.40682 -0.102602 +-0.277084 -0.0288348 -0.039587 +0.44389 -0.189948 -0.124282 +-0.355818 -0.0777103 -0.0686814 +0.274814 -0.385352 -0.119102 +-0.277754 0.0204382 -0.0395652 +0.139511 -0.434008 -0.109959 +0.251969 -0.371698 -0.106494 +-0.35466 -0.168255 -0.0802681 +-0.393474 0.0767519 -0.0838738 +-0.133411 -0.372064 -0.0814307 +-0.252553 -0.141186 -0.0427729 +0.0601225 0.0527777 -0.00320523 +-0.0960753 -0.220534 -0.0293639 +0.172832 0.00865734 -0.0150867 +0.0897403 -0.205002 -0.0253612 +0.142529 -0.437133 -0.111969 +0.000487631 -0.400825 -0.0838455 +0.143156 -0.221917 -0.0355006 +0.232118 -0.015561 -0.0274369 +-0.00572532 -0.134325 -0.00907918 +-0.0919737 -0.0766368 -0.00719205 +0.122167 -0.206123 -0.02913 +0.340033 -0.212144 -0.0838273 +-0.135731 -0.223552 -0.0348049 +0.204733 0.00703553 -0.0212075 +-0.0629721 -0.179094 -0.0181854 +-0.0560921 -0.388967 -0.0804573 +0.135068 0.453437 -0.119005 +0.263709 -0.399845 -0.122172 +-0.0323112 0.457115 -0.11118 +0.465922 0.0353254 -0.115879 +-0.219103 -0.190379 -0.043052 +0.250286 -0.162834 -0.0456195 +-0.012722 -0.205313 -0.0213864 +0.0210912 -0.41675 -0.0912235 +0.36088 -0.136393 -0.0774153 +0.0934406 0.0559981 -0.00595117 +0.205538 0.163079 -0.035034 +-0.425823 0.0353524 -0.0958845 +0.226794 -0.00771848 -0.0260879 +0.399926 0.0220284 -0.0837173 +0.154087 0.4092 -0.10066 +-0.236326 -0.0746862 -0.0312007 +0.153839 -0.11686 -0.0188387 +0.10611 -0.384358 -0.0829344 +-0.070945 0.0592453 -0.00428076 +-0.30233 0.0901438 -0.0510687 +-0.279691 0.0689836 -0.0423915 +-0.137845 -0.436157 -0.11075 +0.436992 -0.108606 -0.107116 +0.158711 -0.246368 -0.0439071 +0.249534 0.106718 -0.0375324 +-0.314934 -0.12301 -0.0588915 +-0.468734 -0.110927 -0.123653 +0.21194 -0.0342201 -0.0233167 +-0.348767 -0.11501 -0.0698739 +0.0209599 -0.163323 -0.01365 +0.207694 -0.132854 -0.03087 +0.375295 -0.20318 -0.0956374 +0.315646 0.0333467 -0.0517092 +0.293193 0.0481213 -0.0451585 +0.078394 -0.22007 -0.0276712 +0.00210163 -0.434437 -0.0993004 +-0.416909 0.0973414 -0.0962788 +-0.400649 -0.216769 -0.10978 +-0.0476564 -0.387389 -0.0793161 +0.0334815 0.0342407 -0.00114738 +0.347454 -0.158333 -0.075767 +0.45897 -0.0752471 -0.11474 +-0.0466646 0.400766 -0.0850088 +0.33692 -0.0301137 -0.0589484 +-0.439557 0.0695675 -0.104483 +0.161025 0.23981 -0.0426276 +-0.246604 -0.180012 -0.0477488 +-0.0643839 -0.121339 -0.00947912 +0.395762 -0.127328 -0.0905165 +0.095184 -0.153083 -0.0163814 +0.0134143 -0.125688 -0.00802091 +0.129854 0.325884 -0.0635507 +-0.196574 -0.164701 -0.0334431 +-0.337821 -0.192302 -0.0786441 +0.472888 -0.00264336 -0.118882 +-0.0476758 -0.384211 -0.0779864 +0.433602 -0.161267 -0.113443 +0.260254 0.0986231 -0.0395099 +-0.360358 -0.129856 -0.0762687 +0.328318 -0.0925283 -0.0599758 +0.298727 -0.228244 -0.073357 +0.309068 -0.115452 -0.0559936 +-0.197474 -0.121273 -0.0272221 +0.170367 -0.233152 -0.0425998 +0.110608 -0.2208 -0.0309729 +-0.100291 0.0590134 -0.00679352 +0.307758 -0.0777384 -0.0517165 +0.106274 -0.179622 -0.0220216 +0.186856 0.0805984 -0.0209246 +-0.416892 -0.192914 -0.111752 +-0.302941 -0.201273 -0.0684874 +-0.156368 -0.209456 -0.0347657 +-0.0853158 -0.206897 -0.0253642 +0.270651 -0.198464 -0.0580021 +0.201967 -0.185634 -0.0383612 +-0.335031 -0.189513 -0.0770488 +-0.445469 -0.131943 -0.114479 +0.279076 0.0248045 -0.0400515 +-0.187018 -0.410248 -0.107408 +0.27179 -0.177555 -0.0541647 +-0.235143 -0.177107 -0.0443112 +0.351867 0.0983978 -0.069136 +0.30852 -0.16877 -0.063874 +0.0219615 -0.176107 -0.0158739 +-0.422723 -0.154006 -0.106923 +-0.308663 -0.160883 -0.0625332 +0.37659 -0.112694 -0.0805002 +-0.0616609 -0.0937204 -0.00631272 +-0.0613818 -0.159662 -0.0147384 +0.0571767 0.08552 -0.00530549 +-0.27986 0.117577 -0.0471864 +-0.00504667 -0.0359762 -0.000660097 +-0.0249369 0.0664983 -0.00252513 +-0.135911 -0.111608 -0.0155855 +-0.246624 -0.0883048 -0.0349202 +-0.389409 -0.0697997 -0.0815835 +0.0208898 -0.0727904 -0.00287154 +-0.401042 -0.0329568 -0.0845332 +0.315685 -0.0151799 -0.0512573 +0.00499873 -0.0219944 -0.000254403 +0.230365 0.0499011 -0.0281759 +0.169719 0.105536 -0.0201746 diff --git a/image_analysis/indexing/fast-feedback-indexer/ffbidx/envvar.h b/image_analysis/indexing/fast-feedback-indexer/ffbidx/envvar.h new file mode 100644 index 000000000..df939c0f2 --- /dev/null +++ b/image_analysis/indexing/fast-feedback-indexer/ffbidx/envvar.h @@ -0,0 +1,89 @@ +// Vendored from https://github.com/paulscherrerinstitute/fast-feedback-indexer, commit a94fd4f5c55289e70860feea358182d2072e02b5 +// (indexer/src/ffbidx/envvar.h), BSD-3-Clause - see LICENSE.md in this directory. +/* +Copyright 2022 Paul Scherrer Institute + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS +BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +------------------------ + +Author: hans-christian.stadler@psi.ch +*/ + +#ifndef FAST_FEEDBACK_ENVVAR_H +#define FAST_FEEDBACK_ENVVAR_H + +#include +#include +#include +#include + +namespace fast_feedback { + + template + inline result_type envvar([[maybe_unused]] const char *name, [[maybe_unused]] std::function func) + {} + + // throw std::invalid_argument, if value is not accepted + // return if_undefined() if undefined + template <> + inline bool envvar(const char* name, std::function func) + { + static const std::vector accepted = {"1", "true", "yes", "on", "0", "false", "no", "off"}; // [4] == "0" + char* varval = std::getenv(name); + if (varval != nullptr) { + unsigned i; + for (i=0u; i + inline unsigned envvar(const char *name, std::function func) + { + char* varval = std::getenv(name); + if (varval != nullptr) { + std::istringstream iss(varval); + unsigned val; + if (!(iss >> val) || !iss.eof()) { + std::ostringstream oss; + oss << "illegal value of type unsigned for " << name << ": " << varval; + throw std::invalid_argument(oss.str()); + } + return val; + } + return func(); + } + +} // namespace fast_feedback + +#endif // FAST_FEEDBACK_ENVVAR_H diff --git a/image_analysis/indexing/fast-feedback-indexer/ffbidx/exception.h b/image_analysis/indexing/fast-feedback-indexer/ffbidx/exception.h new file mode 100644 index 000000000..f478d9339 --- /dev/null +++ b/image_analysis/indexing/fast-feedback-indexer/ffbidx/exception.h @@ -0,0 +1,94 @@ +// Vendored from https://github.com/paulscherrerinstitute/fast-feedback-indexer, commit a94fd4f5c55289e70860feea358182d2072e02b5 +// (indexer/src/ffbidx/exception.h), BSD-3-Clause - see LICENSE.md in this directory. +/* +Copyright 2022 Paul Scherrer Institute + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS +BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +------------------------ + +Author: hans-christian.stadler@psi.ch +*/ + +#ifndef FAST_FEEDBACK_EXCEPTION_H +#define FAST_FEEDBACK_EXCEPTION_H + +#include +#include +#include "envvar.h" + +namespace fast_feedback { + + constexpr char INDEXER_VERBOSE_EXCEPTION[] = "INDEXER_VERBOSE_EXCEPTION"; + + struct exception : public std::exception { + + std::string error_message; + const char* file_name; + unsigned line_number; + + inline static bool verbose() + { + return envvar(INDEXER_VERBOSE_EXCEPTION, []()->bool{return false;}); + } + + inline static std::string verbosify(const std::string& message, const char* file, unsigned line) + { + if (verbose()) { + std::ostringstream oss; + oss << '(' << file << ':' << line << ") " << message; + return oss.str(); + } + return message; + } + + inline exception(const std::string& message, const char* file, unsigned line) + : error_message(verbosify(message, file, line)), file_name(file), line_number(line) + {} + + inline exception(const exception&) = default; + inline exception(exception&&) = default; + + inline exception& operator=(const exception&) = default; + inline exception& operator=(exception&&) = default; + + inline ~exception() noexcept override + {} + + inline const char* what() const noexcept override + { + return error_message.c_str(); + } + + template + inline exception& operator<<(const T& data) + { + std::ostringstream oss; + oss << data; + error_message += oss.str(); + return *this; + } + + }; + +} + +#define FF_EXCEPTION(msg) fast_feedback::exception(msg, __FILE__, __LINE__) +#define FF_EXCEPTION_OBJ fast_feedback::exception{std::string{}, __FILE__, __LINE__} + +#endif diff --git a/image_analysis/indexing/fast-feedback-indexer/ffbidx/indexer.h b/image_analysis/indexing/fast-feedback-indexer/ffbidx/indexer.h new file mode 100644 index 000000000..404248cdb --- /dev/null +++ b/image_analysis/indexing/fast-feedback-indexer/ffbidx/indexer.h @@ -0,0 +1,382 @@ +// Vendored from https://github.com/paulscherrerinstitute/fast-feedback-indexer, commit a94fd4f5c55289e70860feea358182d2072e02b5 +// (indexer/src/ffbidx/indexer.h), BSD-3-Clause - see LICENSE.md in this directory. +/* +Copyright 2022 Paul Scherrer Institute + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS +BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +------------------------ + +Author: hans-christian.stadler@psi.ch +*/ + +#ifndef FAST_FEEDBACK_INDEXER_H +#define FAST_FEEDBACK_INDEXER_H + +// Fast feedback indexer + +#include +#include +#include +#include + +namespace fast_feedback { + + // Input data for fast feedback indexer + // + // Input data consists of the (x,y,z) 3D space coordinates + // coordinates + // - of given unit cells [0..3*n_cells[ + // - of the spots [0..n_spots[ + // The origin is implicitly assumed to be part of the lattice. + template + struct input final { + struct { + float_type* x; // x coordinates, pinned memory + float_type* y; // y coordinates, pinned memory + float_type* z; // z coordinates, pinned memory + } cell; + struct { + float_type* x; // x coordinates, pinned memory + float_type* y; // y coordinates, pinned memory + float_type* z; // z coordinates, pinned memory + } spot; + unsigned n_cells; // number of given unit cells (must be before n_spots in memory, see copy_in()) + unsigned n_spots; // number of spots (must be after n_cells in memory, see copy_in()) + bool new_cells; // set to true if cells are new or have changed + bool new_spots; // set to true if spots are new or have changed + }; + + // Output data for fast feedback indexer + // + // Output data consists of the (x,y,z) 3D space + // coordinates of the found unit cell vectors [0..3*n_cells[ + // + // The coordinate arrays must be of size 3*n_cells at least, + // the score array at least of size n_cells + template + struct output final { + float_type* x; // x coordinates, pinned memory + float_type* y; // y coordinates, pinned memory + float_type* z; // z coordinates, pinned memory + float_type* score; // per cell score, pinned memory + unsigned n_cells=1u;// number of unit cells + }; + + // Configuration setting for the fast feedback indexer runtime state + // These are used to determine GPU kernel grid sizes and calculation thresholds + // Memory must be pinned in order to be used as an argument for indexing + template + struct config_runtime final { + float_type length_threshold=1e-9; // threshold for determining equal vector length (|va| - threshold < |vb| < |va| + threshold) + float_type triml=0.001; // lower trim value for distance to nearest integer objective value - 0 < triml < trimh + float_type trimh=0.3; // higher trim value for distance to nearest integer objective value - triml < trimh < 0.5 + float_type delta=0.1; // log2 curve position: score = log2(trim(dist(x)) + delta) + float_type dist1=0.2; // maximum distance to int for single coordinate + float_type dist3=0.15; // maximum distance to int for tripple coordinates + unsigned min_spots=6; // vector refinement: minimum number of spots to fit against (0: no refinement) + unsigned num_halfsphere_points=32*1024; // number of sample points on half sphere for finding vector candidates + unsigned num_angle_points=0; // number of sample points in rotation space for finding cell candidates (0: auto) + }; + + // Configuration setting for the fast feedback indexer persistent state + // The persistent state determines static GPU memory consumtion + // Changing these parameters will cause reallocation of memory on the GPU + template + struct config_persistent final { + unsigned max_output_cells=1; // maximum number of output unit cells + unsigned max_input_cells=1; // maximum number of input unit cells, (must be before max_spots in memory, see copy_in()) + unsigned max_spots=200; // maximum number of input spots, (must be after max_input_cells in memory, see copy_in()) + unsigned num_candidate_vectors=32; // number of candidate vectors (per input cell vector) + bool redundant_computations=false; // compute candidates for all three cell vectors instead of just one + }; + + // Exception type for fast feedback indexer + struct indexer_error final : public std::runtime_error {}; + + // State ID to identify object private state + struct state_id final { + using type = unsigned; + static constexpr type null = 0u; // instance identity usable to denote object instance without private state + static std::atomic next; // monotonically increasing atomic counter + + // Allocate a new state identifier + static type alloc() noexcept + { + return next.fetch_add(1u); + } + }; + + // Indexer object + // + // Keeps persistent state, like GPU memory allocations. + template + struct indexer final { + config_persistent cpers; // persistent configuration + const state_id::type state; // object instance private state identifier + + // Initialize this instance according to conf + static void init (indexer& instance, const config_persistent& conf); + + // Drop this instance and its private state + static void drop (indexer& instance); + + // Create according to c + explicit inline indexer (const config_persistent& c) + : state{state_id::alloc()} + { init(*this, c); } + + // Create with default persistent config + inline indexer () + : state{state_id::alloc()} + { init(*this, config_persistent{}); } + + // Create according to other.cpers + inline indexer (const indexer& other) + : state{state_id::alloc()} + { init(*this, other.cpers); } + + // Reconfigure according to other.cpers + inline indexer& operator= (const indexer& other) + { if (other.state!=state) { drop(*this); init(*this, other.cpers); } return *this; } + + // Take over others state + inline indexer (indexer&& other) + : cpers(std::move(other.cpers)), state(state_id::null) + { + std::swap(const_cast(state), const_cast(other.state)); + } + + // Take over others state + inline indexer& operator= (indexer&& other) + { + if (other.state != state) { + std::swap(cpers, other.cpers); + std::swap(const_cast(state), const_cast(other.state)); + } + return *this; + } + + // Drop if valid + inline ~indexer () + { + if (state != state_id::null) { + drop(*this); + const_cast(state) = state_id::null; + } + } + + // Run indexing asynchronously according to conf_rt on in data + // All coordinate data and the runtime config memory must be pinned. + // Before accessing output data, index_end() must be called. + // If callback is set, it will be called with the data argument as + // soon as the result is ready to be handled with index_end(). + // The callback is not allowed to call any indexer method. + void index_start (const input& in, output& out, const config_runtime& conf_rt, + void(*callback)(void*)=nullptr, void* data=nullptr); + + // Finish indexing for output access + // Must follow an index_start() call if no callback was given to index_start(). + // Must follow a callback() call if a callback was given to index_start(). + void index_end (output& out); + + // Run indexing according to conf_rt on in data, put result into out data + // All coordinate data and the runtime config memory must be pinned + inline void index (const input& in, output& out, const config_runtime& conf_rt) + { + index_start(in, out, conf_rt); + index_end(out); + } + }; + + // Pin allocated memory during the lifetime of this object + // Use this for already allocated unpinned memory + // Watch out when pinning memory that might move (like container data) + struct memory_pin final { + void* ptr; + + // Nothing is pinned by default + inline memory_pin() noexcept + : ptr(nullptr) + {} + + // Pin standard container content + // Make sure the container data is not moved during the lifetime of the pin + template + explicit inline memory_pin(const Container& container) + : ptr(nullptr) + { + void* mem_ptr = const_cast(container).data(); + pin(mem_ptr, container.size() * sizeof(typename Container::value_type)); + ptr = mem_ptr; + } + + // Raw memory pin + inline memory_pin(void* mem_ptr, std::size_t num_bytes) + : ptr(nullptr) + { + pin(mem_ptr, num_bytes); + ptr = mem_ptr; + } + + // Take over pin from other + inline memory_pin(memory_pin&& other) noexcept + : ptr(nullptr) + { + std::swap(ptr, other.ptr); + } + + // Take over pin from other + inline memory_pin& operator=(memory_pin&& other) + { + if (other.ptr != ptr) { + void* mem_ptr = nullptr; + std::swap(ptr, mem_ptr); + if (mem_ptr != nullptr) + unpin(mem_ptr); + std::swap(ptr, other.ptr); + } + return *this; + } + + // Unpin pinned memory if any + inline ~memory_pin() + { + if (ptr != nullptr) { + unpin(ptr); + ptr = nullptr; + } + } + + memory_pin(const memory_pin&) = delete; + memory_pin& operator=(const memory_pin&) = delete; + + // Pin on object + // Only works for objects without internally allocated extra memory + template + static inline memory_pin on(const Object& obj) + { + void* mem_ptr = const_cast(&obj); + return memory_pin(mem_ptr, sizeof(obj)); + } + + // Pin on object underlying the pointer + // Only works for objects without internally allocated extra memory + template + static inline memory_pin on(const Object* obj_ptr) + { + void* mem_ptr = const_cast(obj_ptr); + return memory_pin(mem_ptr, sizeof(*obj_ptr)); + } + + static void pin(void* ptr, std::size_t size); // Raw memory pin + static void unpin(void* ptr); // Raw unpin + }; + + // Allocate pinned raw memory + void* alloc_pinned(std::size_t num_bytes); + + // Deallocate pinned memory + void dealloc_pinned(void* ptr); + + // Deleter for pinned smart pointers + // Calls destructor + template + struct pinned_deleter final { + inline void operator()(T* ptr) const + { + if (ptr == nullptr) + return; + try { + ptr->~T(); + } catch (...) { + try { + dealloc_pinned(ptr); + } catch (...) {} // ignore dealloc exception + throw; + } + dealloc_pinned(ptr); + } + }; + + // Specialized array version + template + struct pinned_deleter final { + inline void operator()(T ptr[]) const + { + pinned_deleter{}(ptr); + } + }; + + // Pinned smart pointer + // Use this for memory allocated with alloc_pinned + template + using pinned_ptr = std::unique_ptr>; + + // Allocate pinned object + // Calls default constructor + // This only works for objects that do not allocate internal extra memory + template + inline pinned_ptr alloc_pinned() + { + pinned_ptr ptr{static_cast(alloc_pinned(sizeof(T)))}; + new (ptr.get()) T; + return ptr; + } + + // Check configuration consistency + // Throw exception with error message on detected inconsistency. + // Parameters can set separately to nullptr for a noop with respect + // to the particular parameter. + template + void check_config(const config_persistent* cpers, const config_runtime* crt); + + // Print config_persistent into stream + template + inline auto& operator<<(std::basic_ostream& out, const config_runtime& crt) + { + out << "crt: length_threshold=" << crt.length_threshold + << " triml=" << crt.triml + << " trimh=" << crt.trimh + << " delta=" << crt.delta + << " dist1=" << crt.dist1 + << " dist3=" << crt.dist3 + << " min_spots=" << crt.min_spots + << " num_halfsphere_points=" << crt.num_halfsphere_points + << " num_angle_points=" << crt.num_angle_points; + return out; + } + + // Print config_persistent into stream + template + inline auto& operator<<(std::basic_ostream& out, const config_persistent& cpers) + { + out << "cpers: max_output_cells=" << cpers.max_output_cells + << " max_input_cells=" << cpers.max_input_cells + << " max_spots=" << cpers.max_spots + << " num_candidate_vectors=" << cpers.num_candidate_vectors + << " redundant_computations=" << cpers.redundant_computations; + return out; + } + + // Throw exception if runtime problem is detected + void runtime_check(); + +} // namespace fast_feedback + +#endif diff --git a/image_analysis/indexing/fast-feedback-indexer/ffbidx/indexer_gpu.h b/image_analysis/indexing/fast-feedback-indexer/ffbidx/indexer_gpu.h new file mode 100644 index 000000000..b10012b97 --- /dev/null +++ b/image_analysis/indexing/fast-feedback-indexer/ffbidx/indexer_gpu.h @@ -0,0 +1,74 @@ +// Vendored from https://github.com/paulscherrerinstitute/fast-feedback-indexer, commit a94fd4f5c55289e70860feea358182d2072e02b5 +// (indexer/src/ffbidx/indexer_gpu.h), BSD-3-Clause - see LICENSE.md in this directory. +/* +Copyright 2022 Paul Scherrer Institute + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS +BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +------------------------ + +Author: hans-christian.stadler@psi.ch +*/ + +#ifndef INDEXER_GPU_H +#define INDEXER_GPU_H + +#include "ffbidx/indexer.h" + +namespace gpu { + using namespace fast_feedback; + + // GPU part of indexer::init + template + void init (const indexer& instance); + + // GPU part of indexer::drop + template + void drop (const indexer& instance); + + // GPU part of indexer::index_start + template + void index_start (const indexer& instance, const input& in, output& out, const config_runtime& conf_rt, + void(*callback)(void*), void* data); + + // GPU part of indexer::index_end + template + void index_end (const indexer& instance, output& out); + + // Register host memory + void pin_memory(void* ptr, std::size_t size); + + // Unregister host memory + void unpin_memory(void* ptr); + + // Allocate pinned host memory + void* alloc_pinned(std::size_t num_bytes); + + // Deallocate pinned host memory + void dealloc_pinned(void* ptr); + + // GPU version of check_config + template + void check_config(const config_persistent* cpers, const config_runtime* crt); + + // Check gpu runtime, throws exception on incompatibility + void runtime_check(); + +} // namespace gpu + +#endif diff --git a/image_analysis/indexing/fast-feedback-indexer/ffbidx/log.h b/image_analysis/indexing/fast-feedback-indexer/ffbidx/log.h new file mode 100644 index 000000000..1f1968a19 --- /dev/null +++ b/image_analysis/indexing/fast-feedback-indexer/ffbidx/log.h @@ -0,0 +1,140 @@ +// Vendored from https://github.com/paulscherrerinstitute/fast-feedback-indexer, commit a94fd4f5c55289e70860feea358182d2072e02b5 +// (indexer/src/ffbidx/log.h), BSD-3-Clause - see LICENSE.md in this directory. +/* +Copyright 2022 Paul Scherrer Institute + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS +BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +------------------------ + +Author: hans-christian.stadler@psi.ch +*/ + +#ifndef INDEXER_LOG_H +#define INDEXER_LOG_H + +#include +#include +#include +#include + +namespace fast_feedback { + namespace logger { + // Log levels + constexpr unsigned l_fatal = 0u; // Log fatal errors + constexpr unsigned l_error = 1u; // Log errors + constexpr unsigned l_warn = 2u; // Log warnings + constexpr unsigned l_info = 3u; // Log useful information + constexpr unsigned l_debug = 4u; // Log debug information + constexpr unsigned l_undef = 10u; // Undefined (only returned by get_init_log_level()) + + // Current log level, default is l_error + // Logging will react to changes dynamically + inline std::atomic level{l_error}; + + // Get string representation for log level + const char* level_to_string(unsigned log_level); + + // Check if log level is active + template + inline bool level_active() noexcept + { + return log_level <= level.load(); + } + + // Get common log output lock + std::mutex& lock() noexcept; + + // Get version string + const char* get_version(); + + // Get log level from environment, if given + // Parses the environment variable INDEXER_LOG_LEVEL + // which should contain one of {"fatal", "error", "warn", "info", "debug"} + // If the variable is undefined, l_undef is returned. + unsigned get_init_log_level(); + + // Initalize log level using get_init_log_level() + // If the variable is undefined, the log level is not changed. + inline void init_log_level() + { + unsigned new_level = get_init_log_level(); + if (new_level != l_undef) + level.store(new_level); + } + + // Logger writes to clog + // Flushes only if log_level is l_fatal + template + struct logger final { + inline logger() + { + init_log_level(); + } + }; + + // For starting a stanza + inline struct stanza_type final {} stanza; + + // Log output to clog + template + inline logger& operator<<(logger& out, const T& value) + { + if (level_active()) + std::clog << value; + if constexpr (log_level == l_fatal) { + std::clog.flush(); + } + return out; + } + + // Start stanza + template + inline logger& operator<<(logger& out, const stanza_type&) + { + if (level_active()) + std::clog << '(' << level_to_string(log_level) << ") "; + if constexpr (log_level == l_fatal) { + std::clog.flush(); + } + return out; + } + + #ifndef _INDEXER_LOG_IMPL_ + // Logger objects + extern logger fatal; + extern logger error; + extern logger warn; + extern logger info; + extern logger debug; + #endif + + // TODO: imlement thread safe lock_guard for logger + // { + // guard = logger << (create guard) blabla << blabla; + // guard << blabla << blabla; (release guard) + // } + } // namespace logger +} // namespace fast_feedback + +// Start and end locked logging conditional on logging level +// This will hold the logger::lock() +#define LOG_START(level) if (fast_feedback::logger::level_active()) { std::lock_guard logger_output_lock{fast_feedback::logger::lock()}; do +#define LOG_END while(false); } + +#endif // INDEXER_LOG_H diff --git a/image_analysis/indexing/fast-feedback-indexer/ffbidx/refine.h b/image_analysis/indexing/fast-feedback-indexer/ffbidx/refine.h new file mode 100644 index 000000000..cc31b8a8d --- /dev/null +++ b/image_analysis/indexing/fast-feedback-indexer/ffbidx/refine.h @@ -0,0 +1,1012 @@ +// Vendored from https://github.com/paulscherrerinstitute/fast-feedback-indexer, commit a94fd4f5c55289e70860feea358182d2072e02b5 +// (indexer/src/ffbidx/refine.h), BSD-3-Clause - see LICENSE.md in this directory. +/* +Copyright 2022 Paul Scherrer Institute + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS +BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +------------------------ + +Author: hans-christian.stadler@psi.ch +*/ + +#ifndef INDEXER_REFINE_H +#define INDEXER_REFINE_H + +#include +#include +#include +#include +#include "ffbidx/exception.h" +#include "ffbidx/indexer.h" +#include "ffbidx/log.h" + +namespace fast_feedback { + namespace refine { + // Provide convenience classes for the fast feedback indexer + // - indexer: calls the raw fast_feedback::indexer + // - indexer_ifss: calls indexer and refined the output cells + // - indexer_ifse: calls indexer and refines the output cells + // + // Like the raw indexer these indexers (idx) provide several call possibilities + // + // - synchronous: idx.index(..) + // - asynchronous: idx.index_start(.., callback, data) + // callback(data) by GPU <-- result is ready + // idx.index_end() <-- will do the refinement on CPU + // + // For multithreaded refinement use the base indexer, split the output cells into + // logical blocks, and let threads call the refine(..) static methods on individual + // output cell blocks. + + using logger::stanza; + + // Base indexer class for refinement + // - controlling all indexer data + // - getter/setter interface + // The origin is implicitly assumed to be part of the lattice + template + class indexer { + protected: + fast_feedback::indexer idx; // raw indexer + Eigen::MatrixX3 icells; // space for max_input_cells in real space + Eigen::MatrixX3 spots; // space for max_spots in reciprocal space + Eigen::MatrixX3 ocells; // max_output_cells coordinate container + Eigen::VectorX scores; // output cell scores container + fast_feedback::input input; // raw indexer input + fast_feedback::output output; // raw indexer output + fast_feedback::memory_pin pin_icells; // pin input cells container + fast_feedback::memory_pin pin_spots; // pin spots container + fast_feedback::memory_pin pin_ocells; // pin output cells container + fast_feedback::memory_pin pin_scores; // pin output cell scores container + fast_feedback::memory_pin pin_crt; // pin runtime config memory + fast_feedback::config_runtime crt; // raw indexer runtime config + public: + inline static void check_config (const fast_feedback::config_persistent& cp, + const fast_feedback::config_runtime& cr) + { + if (cp.max_input_cells <= 0u) + throw FF_EXCEPTION("no input cells"); + if (cp.max_output_cells <= 0) + throw FF_EXCEPTION("no output cells"); + if (cp.max_spots <= 0u) + throw FF_EXCEPTION("no spots"); + if (cp.num_candidate_vectors < 1u) + throw FF_EXCEPTION("nonpositive number of candidate vectors"); + if (cr.num_halfsphere_points < cp.num_candidate_vectors) + throw FF_EXCEPTION("fewer half sphere sample points than required candidate vectors"); + if ((cr.num_angle_points > 0u) && (cr.num_angle_points < cp.max_output_cells)) + throw FF_EXCEPTION("fewer angle sample points than required candidate cells"); + if (cr.triml < float_type{0.f}) + throw FF_EXCEPTION("lower trim value < 0"); + if (cr.triml > cr.trimh) + throw FF_EXCEPTION("lower > higher trim value"); + if (cr.trimh > float_type{.5f}) + throw FF_EXCEPTION("higher trim value > 0.5"); + if (cr.delta <= float_type{.0}) + throw FF_EXCEPTION("nonpositive delta value"); + } + + // Create base indexer object + // - allocate (pinned) memory for all input and output data + // - store configuration + inline indexer (const fast_feedback::config_persistent& cp, + const fast_feedback::config_runtime& cr) + : idx{cp}, + icells{cp.max_input_cells * 3u, 3u}, spots{cp.max_spots, 3u}, + ocells{3u * cp.max_output_cells, 3u}, scores{cp.max_output_cells}, + input{{&icells(0,0), &icells(0,1), &icells(0,2)}, {&spots(0,0), &spots(0,1), &spots(0,2)}, 0u, 0u, true, true}, + output{&ocells(0,0), &ocells(0,1), &ocells(0,2), scores.data(), idx.cpers.max_output_cells}, + pin_icells{icells}, pin_spots{spots}, + pin_ocells{ocells}, pin_scores{scores}, + pin_crt{fast_feedback::memory_pin::on(crt)}, + crt{cr} + { + check_config(cp, cr); + } + + inline indexer (indexer&&) = default; + inline indexer& operator= (indexer&&) = default; + inline virtual ~indexer () = default; + + indexer () = delete; + indexer (const indexer&) = delete; + indexer& operator= (const indexer&) = delete; + + // Asynchronouly launch indexing operation on GPU + // - n_input_cells must be less than max_input_cells + // - n_spots must be less than max_spots + // - if callback is given, it will be called with data as the argument as soon as index_end can be called + inline void index_start (unsigned n_input_cells, unsigned n_spots, void(*callback)(void*)=nullptr, void* data=nullptr) + { + if (n_input_cells == 0u) { + input.new_cells = false; + } else { + input.n_cells = n_input_cells; + input.new_cells = true; + } + if (n_spots == 0u) { + input.new_spots = false; + } else { + input.n_spots = n_spots; + input.new_spots = true; + } + idx.index_start(input, output, crt, callback, data); + } + + // Finish indexing + // - index_start must have been called before this + inline virtual void index_end () + { + idx.index_end(output); + } + + // Synchronous indexing + // - n_input_cells must be less than max_input_cells + // - n_spots must be less than max_spots + inline void index (unsigned n_input_cells, unsigned n_spots) + { + index_start(n_input_cells, n_spots); + index_end(); + } + + // Reciprocal space spot access: spot i + inline float_type& spotX (unsigned i=0u) noexcept + { return spots(i, 0u); } + + inline const float_type& spotX (unsigned i=0u) const noexcept + { return &spots(i, 0u); } + + inline float_type& spotY (unsigned i=0u) noexcept + { return spots(i, 1u); } + + inline const float_type& spotY (unsigned i=0u) const noexcept + { return spots(i, 1u); } + + inline float_type& spotZ (unsigned i=0u) noexcept + { return spots(i, 2u); } + + inline const float_type& spotZ (unsigned i=0u) const noexcept + { return spots(i, 2u); } + + // Coords area designated for reciprocal space spots, fill top down + inline auto& spotM () + { return spots; } + + // Used coords area designated for reciprocal space spots + inline auto Spots () + { + return spots.topRows(input.n_spots); + } + + // Real space input cell access: cell i, vector j + inline float_type& iCellX (unsigned i=0u, unsigned j=0u) noexcept + { return icells(3u * i + j, 0u); } + + inline const float_type& iCellX (unsigned i=0u, unsigned j=0u) const noexcept + { return icells(3u * i + j, 0u); } + + inline float_type& iCellY (unsigned i=0u, unsigned j=0u) noexcept + { return icells(3u * i + j, 1u); } + + inline const float_type& iCellY (unsigned i=0u, unsigned j=0u) const noexcept + { return icells(3u * i + j, 1u); } + + inline float_type& iCellZ (unsigned i=0u, unsigned j=0u) noexcept + { return icells(3u * i + j, 2u); } + + inline const float_type& iCellZ (unsigned i=0u, unsigned j=0u) const noexcept + { return icells(3u * i + j, 2u); } + + // Coords area for real space input cell i + inline auto iCell (unsigned i=0u) noexcept + { return icells.block(3u * i, 0u, 3u, 3u); } + + inline auto iCell (unsigned i=0u) const noexcept + { return icells.block(3u * i, 0u, 3u, 3u); } + + // Coords area designated for real space input cells, fill cellwise bottom up + inline auto& iCellM () noexcept + { return icells; } + + // Input size access + inline unsigned n_input_cells () const noexcept + { return input.n_cells; } + + inline unsigned n_spots () const noexcept + { return input.n_spots; } + + // Real space output cell access: cell i, vector j + inline float_type& oCellX (unsigned i=0u, unsigned j=0u) noexcept + { return ocells(3u * i + j, 0u); } + + inline const float_type& oCellX (unsigned i=0u, unsigned j=0u) const noexcept + { return ocells(3u * i + j, 0u); } + + inline float_type& oCellY (unsigned i=0u, unsigned j=0u) noexcept + { return ocells(3u * i + j, 1u); } + + inline const float_type& oCellY (unsigned i=0u, unsigned j=0u) const noexcept + { return ocells(3u * i + j, 1u); } + + inline float_type& oCellZ (unsigned i=0u, unsigned j=0u) noexcept + { return ocells(3u * i + j, 2u); } + + inline const float_type& oCellZ (unsigned i=0u, unsigned j=0u) const noexcept + { return ocells(3u * i + j, 2u); } + + // Real space output cell i + inline auto oCell (unsigned i) noexcept + { return ocells.block(3u * i, 0u, 3u, 3u); } + + inline auto oCell (unsigned i) const noexcept + { return ocells.block(3u * i, 0u, 3u, 3u); } + + // All output cells + inline auto& oCellM () noexcept + { return ocells; } + + // Output cell score access: cell i + inline float_type& oScore (unsigned i=0u) noexcept + { return scores(i); } + + inline const float_type& oScore (unsigned i=0u) const noexcept + { return scores(i); } + + // All output scores + inline auto& oScoreV () noexcept + { return scores; } + + // Dissect the base indexer score into two parts: + // - main score: number of spots within a distance of trimh to closest lattice point + // - sub score: exp2(sum[spots](log2(trim[triml..trimh](dist2int(dot(v,spot))) + delta)) / #spots) - delta + inline static std::pair score_parts (float_type score) noexcept + { + float_type nsp = -std::floor(score); + float_type s = score + nsp; + return std::make_pair(nsp-1, s); + } + + // Output size access + inline unsigned n_output_cells () const noexcept + { return output.n_cells; } + + // Runtime configuration access + inline void length_threshold (float_type lt) + { + if (lt < float_type{.0f}) + throw FF_EXCEPTION("negative length threshold"); + crt.length_threshold = lt; + } + + inline float_type length_threshold () const noexcept + { return crt.length_threshold; } + + inline void triml (float_type tl) + { + if (tl < float_type{0.f}) + throw FF_EXCEPTION("lower trim value < 0"); + if (tl > crt.trimh) + throw FF_EXCEPTION("lower > higher trim value"); + crt.triml = tl; + } + + inline float_type triml () const noexcept + { + return crt.triml; + } + + inline void trimh (float_type th) + { + if (crt.triml > th) + throw FF_EXCEPTION("lower > higher trim value"); + if (th > float_type{.5f}) + throw FF_EXCEPTION("higher trim value > 0.5"); + crt.trimh = th; + } + + inline float_type trimh () const noexcept + { + return crt.trimh; + } + + inline void delta (float_type d) + { + if (d <= float_type{.0}) + throw FF_EXCEPTION("nonnegative delta value"); + crt.delta = d; + } + + inline float_type delta () const noexcept + { + return crt.delta; + } + + inline void dist1 (float_type d) noexcept + { + crt.dist1 = d; + } + + inline float_type dist1 () const noexcept + { + return crt.dist1; + } + + inline void dist3 (float_type d) noexcept + { + crt.dist3 = d; + } + + inline float_type dist3 () const noexcept + { + return crt.dist3; + } + + inline void min_spots1 (unsigned ms) noexcept + { + crt.min_spots = ms; + } + + inline unsigned min_spots1 () const noexcept + { return crt.min_spots; } + + inline void num_halfsphere_points (unsigned nhsp) + { + unsigned tmp = crt.num_halfsphere_points; + crt.num_halfsphere_points = nhsp; + try { + check_config(); + } catch (...) { + crt.num_halfsphere_points = tmp; + throw; + } + } + + inline unsigned num_halfsphere_points () const noexcept + { return crt.num_halfsphere_points; } + + inline void num_angle_points (unsigned nap) + { + unsigned tmp = crt.num_angle_points; + crt.num_angle_points = nap; + try { + check_config(); + } catch (...) { + crt.num_angle_points = tmp; + throw; + } + } + + inline unsigned num_angle_points () const noexcept + { return crt.num_angle_points; } + + inline const config_runtime& conf_runtime () const noexcept + { return crt; } + + // Persistent configuration access + // - to change the persistent config, create another indexer instance + inline unsigned max_output_cells () const noexcept + { return idx.cpers.max_output_cells; } + + inline unsigned max_input_cells () const noexcept + { return idx.cpers.max_input_cells; } + + inline unsigned max_spots () const noexcept + { return idx.cpers.max_spots; } + + inline unsigned num_candidate_vectors () const noexcept + { return idx.cpers.num_candidate_vectors; } + + inline bool redundant_computations () const noexcept + { return idx.cpers.redundant_computations; } + + inline const config_persistent& conf_persistent () const noexcept + { return idx.cpers; } + }; // indexer + + // Iterative fit to selected spots refinement indexer extra config + template + struct config_ifss final { + float_type threshold_contraction=.8; // contract error threshold by this value in every iteration + float_type max_distance=.01; // max distance to integer for inliers + unsigned min_spots=6; // minimum number of spots to fit against + unsigned max_iter=15; // max number of iterations + }; + + // Iterative fit to selected spots refinement indexer + template + class indexer_ifss : public indexer { + config_ifss cifss; + public: + inline static void check_config (const config_ifss& c) + { + if (c.threshold_contraction <= float_type{.0}) + throw FF_EXCEPTION("nonpositive threshold contraction"); + if (c.threshold_contraction >= float_type{1.}) + throw FF_EXCEPTION("threshold contraction >= 1"); + if (c.min_spots <= 3) + throw FF_EXCEPTION("min spots <= 3"); + } + + inline indexer_ifss (const fast_feedback::config_persistent& cp, + const fast_feedback::config_runtime& cr, + const config_ifss& c) + : indexer{cp, cr}, cifss{c} + { + check_config(c); + } + + inline indexer_ifss (indexer_ifss&&) = default; + inline indexer_ifss& operator= (indexer_ifss&&) = default; + inline ~indexer_ifss () override = default; + + indexer_ifss () = delete; + indexer_ifss (const indexer_ifss&) = delete; + indexer_ifss& operator= (const indexer_ifss&) = delete; + + // Refine cells + // + // This call splits cells into nblocks cell blocks to allow multithreaded cell refinement. + // All threads must use a common nblocks parameter and each thread an individual block parameter. + // + // input: + // - spots spot reciprocal coordinates matrix + // - cells output cells real space coordinates matrix like the one in the base indexer + // - scores output cell scores matrix with scores coming from the base indexer + // - cpers persistent config for the matrices + // - cifss ifss config + // - block which of the N cell blocks + // - nblocks use N cell blocks + // output: + // - cells the refined cells + // - scores refined cell scores: largest distance of the min_spots closest to their approximated lattice points + template + inline static void refine (const Eigen::Ref>& spots, + Eigen::DenseBase& cells, + Eigen::DenseBase& scores, + const config_ifss& cifss, + unsigned block=0, unsigned nblocks=1) + { + using namespace Eigen; + using Mx3 = MatrixX3; + using M3 = Matrix3; + const unsigned nspots = spots.rows(); + const unsigned ncells = scores.rows(); + VectorX below{nspots}; + MatrixX3 sel{nspots, 3u}; + Mx3 resid{nspots, 3u}; + Mx3 miller{nspots, 3u}; + M3 cell; + const unsigned blocksize = (ncells + nblocks - 1u) / nblocks; + const unsigned startcell = block * blocksize; + const unsigned endcell = std::min(startcell + blocksize, ncells); + for (unsigned j=startcell; j::score_parts(scores[j]).second; + resid = spots * cell; // coordinates in system + miller = round(resid.array()); + resid -= miller; + if (threshold > cifss.max_distance) { + below = (resid.rowwise().norm().array() < threshold); + if (below.count() < cifss.min_spots) + goto calc_score; + threshold *= cifss.threshold_contraction; + sel.colwise() = below; + HouseholderQR qr{sel.select(spots, .0f)}; + cell = qr.solve(sel.select(miller, .0f)); + } + for (unsigned niter=1; nitercifss.max_distance; niter++) { + resid = (spots * cell) - miller; + below = (resid.rowwise().norm().array() < threshold); + if (below.count() < cifss.min_spots) + break; + threshold *= cifss.threshold_contraction; + sel.colwise() = below; + HouseholderQR qr{sel.select(spots, .0f)}; + cell = qr.solve(sel.select(miller, .0f)); + } + calc_score: { + ArrayX dist = resid.rowwise().norm(); + if (dist.size() < cifss.min_spots) { + scores(j) = float_type{1.}; + } else { + auto nth = std::begin(dist) + (cifss.min_spots - 1); + std::nth_element(std::begin(dist), nth, std::end(dist)); + scores(j) = *nth; + } + } + cells.block(3u * j, 0u, 3u, 3u) = cell.transpose(); + } + } + + // Refined result + inline void index_end () override + { + indexer::index_end(); + refine(this->Spots(), this->ocells, this->scores, cifss); + } + + // ifss configuration access + inline void threshold_contraction (float_type tc) + { + if (tc <= float_type{.0}) + throw FF_EXCEPTION("nonpositive threshold contraction"); + if (tc >= float_type{1.}) + throw FF_EXCEPTION("threshold contraction >= 1"); + cifss.threshold_contraction = tc; + } + + inline float_type threshold_contraction () const noexcept + { return cifss.threshold_contraction; } + + inline void min_spots (unsigned ms) + { + if (ms <= 3) + throw FF_EXCEPTION("min spots <= 3"); + cifss.min_spots = ms; + } + + inline unsigned min_spots () const noexcept + { return cifss.min_spots; } + + inline void max_distance (float_type d) noexcept + { cifss.max_distance = d; } + + inline float_type max_distance () const noexcept + { return cifss.max_distance; } + + inline void max_iter (unsigned n) noexcept + { cifss.max_iter = n; } + + inline unsigned max_iter () const noexcept + { return cifss.max_iter; } + + inline const config_ifss& conf_ifss () const noexcept + { return cifss; } + + }; // indexer_ifss + + // Iterative fit to selected errors refinement indexer extra config + template + struct config_ifse final { + float_type threshold_contraction=.8; // contract error threshold by this value in every iteration + float_type max_distance=.01; // max distance to integer for inliers + unsigned min_spots=6; // minimum number of spots to fit against + unsigned max_iter=15; // max number of iterations + }; + + // Iterative fit to selected errors refinement indexer + template + class indexer_ifse : public indexer { + config_ifse cifse; + public: + inline static void check_config (const config_ifse& c) + { + if (c.threshold_contraction <= float_type{.0}) + throw FF_EXCEPTION("nonpositive contraction speed"); + if (c.min_spots <= 3) + throw FF_EXCEPTION("min spots <= 3"); + } + + inline indexer_ifse (const fast_feedback::config_persistent& cp, + const fast_feedback::config_runtime& cr, + const config_ifse& c) + : indexer{cp, cr}, cifse{c} + {} + + inline indexer_ifse (indexer_ifse&&) = default; + inline indexer_ifse& operator= (indexer_ifse&&) = default; + inline ~indexer_ifse () override = default; + + indexer_ifse () = delete; + indexer_ifse (const indexer_ifse&) = delete; + indexer_ifse& operator= (const indexer_ifse&) = delete; + + // Refine cells + // + // This call splits cells into nblocks cell blocks to allow multithreaded cell refinement. + // All threads must use a common nblocks parameter and each thread an individual block parameter. + // + // input: + // - spots spot coordinate matrix + // - cells output cells matrix like the one in the base indexer + // - scores output cell scores matrix with scores coming from the base indexer + // - cpers persistent config for the matrices + // - cifse ifse config + // - block which of the N cell blocks + // - nblocks use N cell blocks + // output: + // - cells the refined cells + // - scores refined cell scores: largest distance of the min_spots closest to their approximated lattice points + template + inline static void refine (const Eigen::Ref>& spots, + Eigen::DenseBase& cells, + Eigen::DenseBase& scores, + const config_ifse& cifse, + unsigned block=0, unsigned nblocks=1) + { + using namespace Eigen; + using Mx3 = MatrixX3; + using M3 = Matrix3; + const unsigned nspots = spots.rows(); + const unsigned ncells = scores.rows(); + VectorX below{nspots}; + MatrixX3 sel{nspots, 3u}; + Mx3 resid{nspots, 3u}; + Mx3 miller{nspots, 3u}; + M3 cell; + const unsigned blocksize = (ncells + nblocks - 1u) / nblocks; + const unsigned startcell = block * blocksize; + const unsigned endcell = std::min(startcell + blocksize, ncells); + for (unsigned j=startcell; j + miller = round(resid.array()); + resid -= miller; + float_type threshold = indexer::score_parts(scores[j]).second; + for (unsigned niter=0; nitercifse.max_distance; niter++) { + below = (resid.rowwise().norm().array() < threshold); + if (below.count() < cifse.min_spots) + break; + threshold *= cifse.threshold_contraction; + sel.colwise() = below; + HouseholderQR qr{sel.select(spots, .0f)}; + cell -= qr.solve(sel.select(resid, .0f)); + resid = spots * cell; // coordinates in system + miller = round(resid.array()); + resid -= miller; + } + { + ArrayX dist = resid.rowwise().norm(); + if (dist.size() < cifse.min_spots) { + scores(j) = float_type{1.}; + } else { + auto nth = std::begin(dist) + (cifse.min_spots - 1); + std::nth_element(std::begin(dist), nth, std::end(dist)); + scores(j) = *nth; + } + } + cells.block(3u * j, 0u, 3u, 3u) = cell.transpose(); + } + } + + // Refined result + inline void index_end () override + { + indexer::index_end(); + refine(this->Spots(), this->ocells, this->scores, cifse); + } + + // ifse configuration access + inline void threshold_contraction (float_type tc) + { + if (tc <= float_type{.0}) + throw FF_EXCEPTION("nonpositive threshold contraction"); + if (tc >= float_type{1.}) + throw FF_EXCEPTION("threshold contraction >= 1"); + cifse.threshold_contraction = tc; + } + + inline float_type threshold_contraction () const noexcept + { return cifse.threshold_contraction; } + + inline float_type max_distance () const noexcept + { return cifse.max_distance; } + + inline void max_distance (float_type d) noexcept + { cifse.max_distance = d; } + + inline void min_spots (unsigned ms) + { + if (ms <= 3) + throw FF_EXCEPTION("min spots <= 3"); + cifse.min_spots = ms; + } + + inline unsigned min_spots () const noexcept + { return cifse.min_spots; } + + inline void max_iter (unsigned n) noexcept + { cifse.max_iter = n; } + + inline unsigned max_iter () const noexcept + { return cifse.max_iter; } + + inline const config_ifse& conf_ifse () const noexcept + { return cifse; } + + }; // indexer_ifse + + // Iterative fit to selected spots reciprocal refinement indexer extra config + template + struct config_ifssr final { + float_type threshold_contraction=.8; // contract error threshold by this value in every iteration + float_type max_distance=.00075; // max distance to reciprocal spots for inliers + unsigned min_spots=8; // minimum number of spots to fit against + unsigned max_iter=32; // max number of iterations + }; + + // Iterative fit to selected spots refinement indexer + template + class indexer_ifssr : public indexer { + config_ifssr cifssr; + public: + inline static void check_config (const config_ifssr& c) + { + if (c.threshold_contraction <= float_type{.0}) + throw FF_EXCEPTION("nonpositive threshold contraction"); + if (c.threshold_contraction >= float_type{1.}) + throw FF_EXCEPTION("threshold contraction >= 1"); + if (c.min_spots <= 3) + throw FF_EXCEPTION("min spots <= 3"); + } + + inline indexer_ifssr (const fast_feedback::config_persistent& cp, + const fast_feedback::config_runtime& cr, + const config_ifssr& c) + : indexer{cp, cr}, cifssr{c} + { + check_config(c); + } + + inline indexer_ifssr (indexer_ifssr&&) = default; + inline indexer_ifssr& operator= (indexer_ifssr&&) = default; + inline ~indexer_ifssr () override = default; + + indexer_ifssr () = delete; + indexer_ifssr (const indexer_ifssr&) = delete; + indexer_ifssr& operator= (const indexer_ifssr&) = delete; + + // Refine cells + // + // This call splits cells into nblocks cell blocks to allow multithreaded cell refinement. + // All threads must use a common nblocks parameter and each thread an individual block parameter. + // + // input: + // - spots spot reciprocal coordinates matrix + // - cells output cells real space coordinates matrix like the one in the base indexer + // - scores output cell scores matrix with scores coming from the base indexer + // - cpers persistent config for the matrices + // - cifssr ifssr config + // - block which of the N cell blocks + // - nblocks use N cell blocks + // output: + // - cells the refined cells + // - scores refined cell scores: largest distance of the min_spots closest to their approximated lattice points + template + inline static void refine (const Eigen::Ref>& spots, + Eigen::DenseBase& cells, + Eigen::DenseBase& scores, + const config_ifssr& cifssr, + unsigned block=0, unsigned nblocks=1) + { + using namespace Eigen; + using Mx3 = MatrixX3; + using M3 = Matrix3; + const unsigned nspots = spots.rows(); + const unsigned ncells = scores.rows(); + VectorX below{nspots}; + MatrixX3 sel{nspots, 3u}; + Mx3 resid{nspots, 3u}; + Mx3 miller{nspots, 3u}; + M3 cell; + const unsigned blocksize = (ncells + nblocks - 1u) / nblocks; + const unsigned startcell = block * blocksize; + const unsigned endcell = std::min(startcell + blocksize, ncells); + for (unsigned j=startcell; j::score_parts(scores[j]).second / scale; + for (unsigned niter=1; nitercifssr.max_distance; niter++) { + miller = round((spots * cell).array()); + resid = miller * cell.inverse(); // reciprocal spots induced by + resid -= spots; // distance between induced and given spots + below = (resid.rowwise().norm().array() < threshold); + if (below.count() < cifssr.min_spots) + break; + threshold *= cifssr.threshold_contraction; + sel.colwise() = below; + HouseholderQR qr{sel.select(spots, .0f)}; + cell = qr.solve(sel.select(miller, .0f)); + } + { // calc score + ArrayX dist = resid.rowwise().norm(); + auto nth = std::begin(dist) + (cifssr.min_spots - 1); + std::nth_element(std::begin(dist), nth, std::end(dist)); + scores(j) = *nth; + } + cells.block(3u * j, 0u, 3u, 3u) = cell.transpose(); + } + } + + // Refined result + inline void index_end () override + { + indexer::index_end(); + refine(this->Spots(), this->ocells, this->scores, cifssr); + } + + // ifss configuration access + inline void threshold_contraction (float_type tc) + { + if (tc <= float_type{.0}) + throw FF_EXCEPTION("nonpositive threshold contraction"); + if (tc >= float_type{1.}) + throw FF_EXCEPTION("threshold contraction >= 1"); + cifssr.threshold_contraction = tc; + } + + inline float_type threshold_contraction () const noexcept + { return cifssr.threshold_contraction; } + + inline void min_spots (unsigned ms) + { + if (ms <= 3) + throw FF_EXCEPTION("min spots <= 3"); + cifssr.min_spots = ms; + } + + inline unsigned min_spots () const noexcept + { return cifssr.min_spots; } + + inline void max_distance (float_type d) noexcept + { cifssr.max_distance = d; } + + inline float_type max_distance () const noexcept + { return cifssr.max_distance; } + + inline void max_iter (unsigned n) noexcept + { cifssr.max_iter = n; } + + inline unsigned max_iter () const noexcept + { return cifssr.max_iter; } + + inline const config_ifssr& conf_ifssr () const noexcept + { return cifssr; } + }; // indexer_ifssr + + // Return index for the best cell + template + inline unsigned best_cell (const Eigen::DenseBase& scores) + { + auto it = std::min_element(std::cbegin(scores), std::cend(scores)); + return (unsigned)(it - std::cbegin(scores)); + } + + // Check if a cell looks like a viable unit cell for the spots + // - cell cell in real space + // - spots spots in reciprocal space + // - threshold radius around approximated miller indices in primal space + // or radius around spots in reciprocal space + // - min_spots minimum number of spots within threshold + // - reciprocal take radius in reciprocal or primal space + template + inline bool is_viable_cell (const Eigen::MatrixBase& cell, + const Eigen::MatrixBase& spots, + float_type threshold=.00075, unsigned min_spots=8u, bool reciprocal=true) + { + using M3x = Eigen::MatrixX3; + M3x resid = spots * cell.transpose(); + const M3x miller = round(resid.array()); + if (reciprocal) { + resid = spots - miller * cell.transpose().inverse(); + } else { + resid -= miller; + } + return (resid.rowwise().norm().array() < threshold).count() >= min_spots; + } + + // Return indices of cells representing crystals + // Cell is considered a new crystal, if it differs by more than good n_spots + // to other crystalls + template + inline std::vector select_crystals (const Eigen::MatrixBase& cells, + const Eigen::MatrixBase& spots, + const Eigen::DenseBase& scores, + float_type threshold=.00075, unsigned min_spots=8u, + bool reciprocal=true) + { + using namespace Eigen; + using M3 = Matrix3f; + using Mx3 = MatrixX3; + using Vx = VectorX; + + std::vector crystals; + const unsigned n_cells = scores.size(); + std::vector sorted(n_cells); + + std::iota(std::begin(sorted), std::end(sorted), 0u); + std::sort(std::begin(sorted), std::end(sorted), [&scores](const unsigned& a, const unsigned&b) { + return scores[a] < scores[b]; + }); + + auto spots_covered = [&cells, &spots, threshold, reciprocal](unsigned i) -> Vx { + M3 cell = cells.block(3u * i, 0u, 3u, 3u).transpose(); + Mx3 resid = spots * cell; + const Mx3 miller = round(resid.array()); + if (reciprocal) { + resid = spots - miller * cell.inverse(); + } else { + resid -= miller; + } + return (resid.rowwise().norm().array() < threshold); + }; + + Vx allcover = spots_covered(sorted[0]); + if (allcover.count() < min_spots) + return crystals; + crystals.push_back(sorted[0]); + + for (unsigned i=1u; i + inline void make_right_handed (Eigen::MatrixBase& cell) + { + if (cell.determinant() < .0f) + cell = -cell; + } + + // Compute a cell similarity score based on cell vector length + // It can be used for penalisation of cell scores for output cells dissimilar to an input cell + // max(0, m-t)**2, with m the maximum of the relative cell vector length differences plus the relative determinant difference + template + inline float_type cell_similarity (const Eigen::MatrixBase& cellA, const Eigen::MatrixBase& cellB, float_type threshold=.02f) + { + Eigen::Vector3 vlen_a = cellA.rowwise().norm(); + Eigen::Vector3 vlen_b = cellB.rowwise().norm(); + std::sort(std::begin(vlen_a), std::end(vlen_a)); + std::sort(std::begin(vlen_b), std::end(vlen_b)); + const float_type detA = cellA.determinant(); + const float_type dD = std::abs((cellB.determinant() - detA) / detA); + float_type dL = .0f; + for (unsigned i=0; i<3u; i++) + dL = std::max(dL, std::abs(vlen_a[i] - vlen_b[i]) / vlen_a[i]); + const float_type score = dD + dL; + return std::max(float_type{.0f}, score * score - threshold); + } + + // Make a string out of a configuration struct + template + std::string conf2str(const config_type& conf) + { + std::ostringstream oss; + oss << "threshold_contraction=" << conf.threshold_contraction + << " max_distance=" << conf.max_distance + << " min_spots=" << conf.min_spots + << " max_iter=" << conf.max_iter; + return oss.str(); + } + + } // namespace refine +} // namespace fast_feedback + +#endif // INDEXER_REFINE_H diff --git a/image_analysis/indexing/fast-feedback-indexer/ffbidx/version.h b/image_analysis/indexing/fast-feedback-indexer/ffbidx/version.h new file mode 100644 index 000000000..6ff6d08b8 --- /dev/null +++ b/image_analysis/indexing/fast-feedback-indexer/ffbidx/version.h @@ -0,0 +1,9 @@ +// Vendored from https://github.com/paulscherrerinstitute/fast-feedback-indexer, commit a94fd4f5c55289e70860feea358182d2072e02b5, +// BSD-3-Clause - see LICENSE.md in this directory. Upstream generates this file from version.h.in at build +// time; here it is written once with the pinned release and commit. +#ifndef VERSION_H +#define VERSION_H + +constexpr static auto version_string = "1.1.3-a94fd4f"; + +#endif diff --git a/image_analysis/indexing/fast-feedback-indexer/indexer.cpp b/image_analysis/indexing/fast-feedback-indexer/indexer.cpp new file mode 100644 index 000000000..e465c2533 --- /dev/null +++ b/image_analysis/indexing/fast-feedback-indexer/indexer.cpp @@ -0,0 +1,103 @@ +// Vendored from https://github.com/paulscherrerinstitute/fast-feedback-indexer, commit a94fd4f5c55289e70860feea358182d2072e02b5 +// (indexer/src/indexer.cpp), BSD-3-Clause - see LICENSE.md in this directory. +/* +Copyright 2022 Paul Scherrer Institute + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS +BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +------------------------ + +Author: hans-christian.stadler@psi.ch +*/ + +#include "ffbidx/exception.h" +#include "ffbidx/indexer.h" +#include "ffbidx/indexer_gpu.h" + +namespace fast_feedback { + + std::atomic state_id::next = static_cast(state_id::null + 1u); + + template + void indexer::init (indexer& instance, const config_persistent& conf) + { + if (instance.state == state_id::null) + throw FF_EXCEPTION("illegal initialisation of null state"); + + instance.cpers = conf; + gpu::drop(instance); + gpu::init(instance); + } + + template + void indexer::drop (indexer& instance) + { + if (instance.state != state_id::null) + gpu::drop(instance); + } + + template + void indexer::index_start(const input& in, output& out, const config_runtime& conf_rt, + void(*callback)(void*), void* data) + { + gpu::index_start(*this, in, out, conf_rt, callback, data); + } + + template + void indexer::index_end (output& out) + { + gpu::index_end(*this, out); + } + + void memory_pin::pin(void* ptr, std::size_t size) + { + gpu::pin_memory(ptr, size); + } + + void memory_pin::unpin(void* ptr) + { + gpu::unpin_memory(ptr); + } + + void* alloc_pinned(std::size_t num_bytes) + { + return gpu::alloc_pinned(num_bytes); + } + + void dealloc_pinned(void* ptr) + { + gpu::dealloc_pinned(ptr); + } + + template + void check_config(const config_persistent* cpers, const config_runtime* crt) + { + gpu::check_config(cpers, crt); + } + + void runtime_check() + { + gpu::runtime_check(); + } + + template void indexer::init(indexer&, const config_persistent&); + template void indexer::drop(indexer&); + template void indexer::index_start(const input&, output&, const config_runtime&, void(*)(void*), void*); + template void indexer::index_end(output&); + template void check_config(const config_persistent*, const config_runtime*); +} // namespace fast_feedback diff --git a/image_analysis/indexing/fast-feedback-indexer/indexer_gpu.cu b/image_analysis/indexing/fast-feedback-indexer/indexer_gpu.cu new file mode 100644 index 000000000..5f44be5ed --- /dev/null +++ b/image_analysis/indexing/fast-feedback-indexer/indexer_gpu.cu @@ -0,0 +1,2381 @@ +// Vendored from https://github.com/paulscherrerinstitute/fast-feedback-indexer, commit a94fd4f5c55289e70860feea358182d2072e02b5 +// (indexer/src/indexer_gpu.cu), BSD-3-Clause - see LICENSE.md in this directory. +// Local modifications: a deterministic tie-break in the candidate ordering; the INDEXER_GPU_DEVICE environment +// variable is not read (the indexer runs on the calling thread's current device, the one Jungfraujoch pins). +/* +Copyright 2022 Paul Scherrer Institute + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS +BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +------------------------ + +Author: hans-christian.stadler@psi.ch +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "ffbidx/envvar.h" +#include "ffbidx/exception.h" +#include "ffbidx/log.h" +#include "ffbidx/indexer_gpu.h" +#include "cuda_runtime.h" + +namespace logger = fast_feedback::logger; +using logger::stanza; + +namespace { + + constexpr char INDEXER_GPU_DEBUG[] = "INDEXER_GPU_DEBUG"; + constexpr unsigned n_threads = 1024; // num cuda threads per block for find_candidates kernel + constexpr unsigned warp_size = 32; // number of threads in a warp + constexpr unsigned mem_txn_unit = 32; // minimum memory transaction unit (cache line sector) + constexpr unsigned all_lanes = 0xffffffff; // mask for all lanes of a warp + + template + struct constant final { + // static constexpr float_type pi = 3.1415926535897932384628; + #pragma nv_diag_suppress 177 // suppress unused warning + [[maybe_unused]] static constexpr float_type pi2 = 6.2831853071795864769257; + #pragma nv_diag_suppress 177 // suppress unused warning + [[maybe_unused]] static constexpr float_type dl = 0.76393202250021030359082633; // 3 - sqrt(5), for spiral sample points on a half sphere + #pragma nv_diag_suppress 177 // suppress unused warning + [[maybe_unused]] static constexpr unsigned mem_txn_unit = ::mem_txn_unit / sizeof(float_type); // minimum memory transaction unit + static constexpr float_type eps = std::numeric_limits::epsilon(); + }; + + // NOTE: not allowed as member of constant + // (dl * 2^N) mod 2pi + template + __constant__ static float_type dl2pNmod2pi[32] = { + 0.76393202250021030359082633, // N = 0 + 1.5278640450004206071816527, + 3.0557280900008412143633053, + 6.1114561800016824287266107, + 5.9397270528237783805279346, + 5.5962687984679702841305826, + 4.9093522897563540913358776, + 3.535519272333121705746469, + 0.78785323748665693456765102, // 8 + 1.575706474973313869135302, + 3.1514129499466277382706041, + 0.019640592713668999615921566, + 0.039281185427337999231843132, + 0.078562370854675998463686265, + 0.15712474170935199692737253, + 0.31424948341870399385474506, + 0.62849896683740798770949012, // 16 + 1.2569979336748159754189802, + 2.5139958673496319508379605, + 5.0279917346992639016759209, + 3.7727981622189413264265548, + 1.2624110172582961759278224, + 2.5248220345165923518556449, + 5.0496440690331847037112897, + 3.8161028308867829304972927, // 24 + 1.3490203545939793840692983, + 2.6980407091879587681385967, + 5.3960814183759175362771934, + 4.5089775295722485956291, + 2.7347697519649107143329137, + 5.4695395039298214286658275, + 4.6558937006800563804063691 // 31 + }; + + std::atomic_bool gpu_debug_output{false}; // Print gpu debug output if true, set if INDEXER_GPU_DEBUG env var is set to true at indexer creation time + + // Exception for cuda related errors + struct cuda_exception final : public fast_feedback::exception { + + inline cuda_exception(cudaError_t error, const char* file, unsigned line) + : exception(std::string{}, file, line) + { + const char* error_name = cudaGetErrorName(error); + const char* error_string = cudaGetErrorString(error); + *this << '(' << error_name << ") " << error_string; + } + + }; + + #define CU_EXCEPTION(err) cuda_exception(err, __FILE__, __LINE__) + + #define CU_CHECK(err) { \ + cudaError_t error = (err); \ + if (error != cudaSuccess) \ + throw CU_EXCEPTION(error); \ + } + + #define CU_CHECK_EXT(err) \ + switch (err) { \ + case cudaSuccess: \ + case cudaErrorCudartUnloading: \ + break;; \ + default: \ + throw CU_EXCEPTION(err); \ + } + + #define DEBUG_STREAM_SYNC(stream) { \ + stream.sync(); \ + } + + #define DEBUG_DEVICE_SYNC() { \ + CU_CHECK(cudaDeviceSynchronize()); \ + } + + // Cuda device infos + struct gpu_device final { + int id; + cudaDeviceProp prop; + + static inline std::vector list; // Cuda device list + static inline std::atomic_bool cuda_initialized{false}; // Is the cuda runtime initialized? + static inline std::mutex init_lock; // Protect cuda runtime initalisation + + // Check if cuda has been initialized + static void check_init() + { + if (! gpu_device::cuda_initialized.load()) + throw FF_EXCEPTION("cuda runtime not initialized"); + } + + // Get the list of cuda devices + static void init() + { + if (cuda_initialized.load()) + return; + + { + std::lock_guard lock{init_lock}; + + if (cuda_initialized.load()) + return; + + int num_devices; + CU_CHECK(cudaGetDeviceCount(&num_devices)); + + list.resize(num_devices); + for (int dev=0; dev= (int)list.size())) + throw FF_EXCEPTION_OBJ << "illegal value for GPU device"; + + auto compcap = list[dev].prop.major; // COMPUTE CAPABILITY CHECK (__shuffle_sync requires >= 5.x) + if (compcap < 5) + throw FF_EXCEPTION_OBJ << "unsupported compute capability " << compcap << ".x (must be >= 5.x)"; + + CU_CHECK(cudaSetDevice(dev)); + } + }; + + // Set GPU debug output if INDEXER_GPU_DEBUG is set to true + void gpu_debug_init() + { + bool debug = fast_feedback::envvar(INDEXER_GPU_DEBUG, []()->bool{return false;}); + gpu_debug_output.store(debug); + } + + // Deleter for device smart pointers + template + struct gpu_deleter final { + void operator()(T* ptr) const + { + CU_CHECK_EXT(cudaFree(ptr)); + } + }; + + // Device smart pointer + template + using gpu_pointer = std::unique_ptr>; + + // Cuda event wrapper + template + struct gpu_event final { + cudaEvent_t event; + + inline gpu_event() + : event{} + {} + + gpu_event(const gpu_event&) = delete; + gpu_event& operator=(const gpu_event&) = delete; + + gpu_event(gpu_event&& other) + : event{} + { + std::swap(other.event, event); + } + + static void drop(cudaEvent_t& event) + { + if (event == cudaEvent_t{}) + return; + CU_CHECK_EXT(cudaEventDestroy(event)); + event = cudaEvent_t{}; + } + + gpu_event& operator=(gpu_event&& other) + { + std::swap(other.event, event); + return *this; + } + + inline ~gpu_event() + { + drop(event); + } + + inline void init() + { + assert(event == cudaEvent_t{}); + CU_CHECK(cudaEventCreateWithFlags(&event, flags)); + } + + inline void record(cudaStream_t stream=0) + { + assert(event != cudaEvent_t{}); + CU_CHECK(cudaEventRecord(event, stream)); + } + + inline void sync() + { + assert(event != cudaEvent_t{}); + CU_CHECK(cudaEventSynchronize(event)); + } + }; + + template + static float gpu_timing(const gpu_event& start, const gpu_event& end) + { + static_assert(!(flags & cudaEventDisableTiming), "GPU timing measurement are only valid on events that don't have the cudaEventDisableTiming flag set"); + assert(start.event != cudaEvent_t{}); + assert(end.event != cudaEvent_t{}); + float time; + CU_CHECK(cudaEventElapsedTime(&time, start.event, end.event)); + return time; + } + + // Cuda stream wrapper + struct gpu_stream final { + bool ready; // Is stream ready = initialized + cudaStream_t stream; // Cuda stream + + // Return uninitialized stream + gpu_stream() noexcept + : ready{false}, stream{cudaStream_t{}} + {} + + // Initialize stream with existing cuda stream + // The cuda stream given as argument will be managed by this object after the call, + // which basically means it should not be used afterwards. + gpu_stream(cudaStream_t s) + : ready{true}, stream{s} + { + unsigned int flags; + CU_CHECK(cudaStreamGetFlags(s, &flags)); // check that the s is initialized + } + + // Move s into this + gpu_stream(gpu_stream&& s) + : ready{false}, stream{cudaStream_t{}} + { + std::swap(ready, s.ready); + std::swap(stream, s.stream); + } + + // Move s into this + gpu_stream& operator=(gpu_stream&& s) + { + if (this != &s) { + if (ready) { + CU_CHECK(cudaStreamDestroy(stream)); + ready = false; + } + std::swap(ready, s.ready); + std::swap(stream, s.stream); + } + return *this; + } + + gpu_stream(const gpu_stream&) = delete; // No copying + gpu_stream& operator=(const gpu_stream&) = delete; // No copying + + // Destroy this + ~gpu_stream() + { + release(); + } + + // Release and unititialize the cuda stream + // This is left in uninitialized state + void release() + { + if (ready) { + CU_CHECK_EXT(cudaStreamDestroy(stream)); + ready = false; + } + } + + // (Re)initialize the cuda stream + void init(unsigned int flags=cudaStreamDefault) + { + release(); + CU_CHECK(cudaStreamCreateWithFlags(&stream, flags)); + ready = true; + } + + // Sync with cuda stream + void sync() + { + if (ready) + CU_CHECK(cudaStreamSynchronize(stream)); + } + + // Check for completion status + bool completed() + { + if (ready) { + auto error = cudaStreamQuery(stream); + switch (error) { + case cudaSuccess: + return true; + case cudaErrorNotReady: + return false; + default: + throw CU_EXCEPTION(error); + } + } + return true; + } + + operator cudaStream_t&() noexcept { return stream; } // Cast to cuda stream + }; + + // On GPU compact vector representation + template + struct compact_vec final { + float_type x; + float_type y; + float_type z; + }; + + // On GPU data for indexer + template + struct indexer_device_data final { + fast_feedback::config_persistent cpers; + fast_feedback::config_runtime crt; + fast_feedback::input input; + fast_feedback::output output; + float_type* candidate_length; // Candidate vector groups length, [3 * max_input_cells] + float_type* candidate_value; // Candidate vector objective function values, [3 * max_input_cells * num_candidate_vectors] + float_type* refined_candidates; // Refined candidate coordinates in consecutive aligned tripples + // (x,y,z,gap; alignment = mem_txn_unit) [3 * max_input_cells * num_candidate_vectors * 3] + unsigned* candidate_sample; // Sample number of candidate vectors, [3 * max_input_cells * num_candidate_vectors] + unsigned* cellvec_to_cand; // Input cell vector to candidate group mapping, [3 * max_input_cells] + unsigned* cell_to_cellvec; // Input cell to representing cell vector mapping, [max_input_cells] + unsigned* vec_cgrps; // Candidate vector groups of cell representing vectors, [max_input_cells] + unsigned* seq_block; // Per candidate vector group sequentializer for thread blocks (explicit init to 0, set to 0 in kernel after use) + // First sequentializer is also used for candidate cell search + }; + + // Indexer GPU state representation on the Host side + // + // Candidate vector group = set of vectors with same length that are candidates for a unit cell vector + // + template + struct indexer_gpu_state final { + using content_type = indexer_device_data; + using key_type = fast_feedback::state_id::type; + using map_type = std::map; + using config_persistent = fast_feedback::config_persistent; + using config_runtime = fast_feedback::config_runtime; + using memory_pin = fast_feedback::memory_pin; + using clock = std::chrono::high_resolution_clock; + using time_point = std::chrono::time_point; + + gpu_pointer data; // Indexer_device_data on GPU + gpu_pointer elements; // Input/output vector elements of data on GPU + gpu_pointer candidate_length; // Candidate vector groups length values on GPU + gpu_pointer candidate_value; // Candidate vectors objective function values on GPU + gpu_pointer refined_candidates; // Refined candidate coordinates in consecutive aligned tripples on GPU + gpu_pointer candidate_sample; // Sample number of candidate vectors on GPU + gpu_pointer cellvec_to_cand; // Input cell vector to candidate group mapping on GPU + gpu_pointer cell_to_cellvec; // Input cell to cell representing vector mapping on GPU + gpu_pointer vec_cgrps; // Candidate vector groups of cell representing vectors on GPU + gpu_pointer seq_block; // Thread block sequentializers on GPU + gpu_stream cuda_stream; // CUDA stream + + // Temporary pinned space to transfer n_input_cells, n_output_cells, n_spots + fast_feedback::pinned_ptr tmp; // Pointer to make move construction simple + + // Input cell coordinates on GPU pointing into elements + float_type* ix; + float_type* iy; + float_type* iz; + + // Output cell coordinates and scores on GPU pointing into elements + float_type* ox; + float_type* oy; + float_type* oz; + float_type* cell_score; + + // Last runtime config ang candidate group mapping properties for overhead and copy omission + config_runtime last_crt; + unsigned n_cand_groups = 0u; + unsigned n_vec_cgrps = 0u; + std::vector cell_candidate_h; + std::vector vec_cgrps_h; + std::vector candidate_idx_h; + std::vector candidate_length_h; + memory_pin pin_cell_cand; + memory_pin pin_vec_grp; + memory_pin pin_cand_idx; + memory_pin pin_cand_len; + + // Timings + gpu_event start; + gpu_event end; + time_point start_time{}; + + // GPU device + int device; + + // Callback mode + bool callback_mode = false; + + static std::mutex state_update; // Protect per indexer state map + static map_type dev_ptr; // Per indexer state map + + // Create hostside on GPU state representation with + // d pointer to on GPU state + // e on GPU input and output elements pointed to by d->elements + // cl on GPU candidate lengths pointed to by d->candidate_length + // cv on GPU candidate vector objective function values pointed to by d->candidate_value + // rc on GPU refined candidates vector pointed to by d->refined_candidates + // cs on GPU candidate vector sample numbers pointed to by d->candidate_sample + // v2c on GPU input cell vector to candidate group mapping pointed to by d->cellvec_to_cand + // c2v on GPU input cell to cell representing vector mapping pointed to by d->cell_to_cellvec + // vcgr on GPU candidate groups of cell representing vectors pointed to by d->vec_cgrps + // sb on GPU per candidate vector group/output cell block sequentializers pointed to by d->seq_block + // stream GPU stream used for actions on this state + // x/y/zi on GPU input pointers d->input.x / y / z + // x/y/z0 on GPU output pointers d->output.x / y / z + // score on GPU per output cell scoring function values + // dev cuda device number of the GPU holding this state + // cbm host callback function is called when results are ready + indexer_gpu_state(gpu_pointer&& d, gpu_pointer&& e, + gpu_pointer&& cl, gpu_pointer&& cv, + gpu_pointer&& rc, + gpu_pointer&& cs, gpu_pointer&& v2c, + gpu_pointer&& c2v, gpu_pointer&& vcgr, + gpu_pointer&& sb, gpu_stream&& stream, + float_type* xi, float_type* yi, float_type* zi, + float_type* xo, float_type* yo, float_type* zo, + float_type* scores, int dev, unsigned n_cells_in) + : data{std::move(d)}, elements{std::move(e)}, + candidate_length{std::move(cl)}, candidate_value{std::move(cv)}, + refined_candidates{std::move(rc)}, + candidate_sample{std::move(cs)}, cellvec_to_cand{std::move(v2c)}, + cell_to_cellvec{std::move(c2v)}, vec_cgrps{std::move(vcgr)}, + seq_block{std::move(sb)}, cuda_stream{std::move(stream)}, + ix{xi}, iy{yi}, iz{zi}, + ox{xo}, oy{yo}, oz{zo}, + cell_score{scores}, + cell_candidate_h(n_cells_in), vec_cgrps_h(n_cells_in), + candidate_idx_h(3u * n_cells_in), candidate_length_h(3u * n_cells_in), + pin_cell_cand{cell_candidate_h}, + pin_vec_grp{vec_cgrps_h}, + pin_cand_idx{candidate_idx_h}, + pin_cand_len{candidate_length_h}, + device{dev} + { + tmp = fast_feedback::alloc_pinned(); + // Invalidate objects to help with overhead and copy omission + tmp->max_output_cells = -1u; + tmp->max_input_cells = -1u; + tmp->max_spots = -1u; + std::memset(static_cast(&last_crt), 0, sizeof(last_crt)); + } + + indexer_gpu_state() = default; // Default with some uninitialized pointers + indexer_gpu_state(const indexer_gpu_state&) = delete; + indexer_gpu_state(indexer_gpu_state&&) = default; // Take over state representation + indexer_gpu_state& operator=(const indexer_gpu_state&) = delete; + indexer_gpu_state& operator=(indexer_gpu_state&&) = default; // Take over state representation + ~indexer_gpu_state() = default; // Drop on GPU state data + + // Shortcut to get at reference + static inline indexer_gpu_state& ref(const key_type& id) + { + return dev_ptr[id]; + } + + // Shortcut to get at state data pointer + static inline gpu_pointer& ptr(const key_type& id) + { + return ref(id).data; + } + + // Shortcut to cuda stream + static inline gpu_stream& stream(const key_type& id) + { + return ref(id).cuda_stream; + } + + // State exists + static inline bool exists(const key_type& id) + { + std::lock_guard state_lock{state_update}; + return dev_ptr.find(id) != std::end(dev_ptr); + } + + // Drop state + static inline void drop(const key_type& id) + { + std::lock_guard state_lock{state_update}; + dev_ptr.erase(id); + } + + // Copy runtime configuration to GPU + static inline void copy_crt(const key_type& state_id, const config_runtime& crt, cudaStream_t stream) + { + const auto crt_dp = &ptr(state_id)->crt; + CU_CHECK(cudaMemcpyAsync(crt_dp, &crt, sizeof(crt), cudaMemcpyHostToDevice, stream)); + ref(state_id).last_crt = crt; + LOG_START(logger::l_debug) { + logger::debug << stanza << "copy runtime config data: " << &crt << "-->" << crt_dp << '\n'; + } LOG_END; + } + + // Copy input data to GPU + static inline void copy_in(const key_type& state_id, const config_persistent& cpers, + const fast_feedback::input& input, + fast_feedback::output& output, + cudaStream_t stream) + { + if (!input.new_cells && !input.new_spots) + return; + + const auto& gpu_state = ref(state_id); + auto& pinned_tmp = const_cast(*gpu_state.tmp); + const auto& device_data = gpu_state.data; + + output.n_cells = std::min(output.n_cells, cpers.max_output_cells); + if (pinned_tmp.max_output_cells != output.n_cells) { + pinned_tmp.max_output_cells = output.n_cells; + CU_CHECK(cudaMemcpyAsync(&device_data->output.n_cells, &pinned_tmp.max_output_cells, sizeof(output.n_cells), cudaMemcpyHostToDevice, stream)); + + LOG_START(logger::l_debug) { + logger::debug << stanza << "copy " << output.n_cells << " cells(out)\n"; + } LOG_END; + } + + const auto n_input_cells = std::min(input.n_cells, cpers.max_input_cells); + const auto n_spots = std::min(input.n_spots, cpers.max_spots); + if ((pinned_tmp.max_input_cells != n_input_cells) || + (pinned_tmp.max_spots != n_spots)) { + pinned_tmp.max_input_cells = n_input_cells; + pinned_tmp.max_spots = n_spots; + // NOTE: the following code assumes consecutive storage of two data members in pinned_tmp and in device_data->input + CU_CHECK(cudaMemcpyAsync(&device_data->input.n_cells, &pinned_tmp.max_input_cells, sizeof(n_input_cells) + sizeof(n_spots), cudaMemcpyHostToDevice, stream)); + + LOG_START(logger::l_debug) { + logger::debug << stanza << "copy " << n_input_cells << " cells(in), " << n_spots << " spots\n"; + } LOG_END; + } + + if (input.new_cells && n_input_cells > 0u) { + const auto cell_sz = 3u * n_input_cells * sizeof(float_type); + CU_CHECK(cudaMemcpyAsync(gpu_state.ix, input.cell.x, cell_sz, cudaMemcpyHostToDevice, stream)); + CU_CHECK(cudaMemcpyAsync(gpu_state.iy, input.cell.y, cell_sz, cudaMemcpyHostToDevice, stream)); + CU_CHECK(cudaMemcpyAsync(gpu_state.iz, input.cell.z, cell_sz, cudaMemcpyHostToDevice, stream)); + + LOG_START(logger::l_debug) { + logger::debug << stanza << "copy (cells) " + << input.cell.x << "-->" << gpu_state.ix << ", " + << input.cell.y << "-->" << gpu_state.iy << ", " + << input.cell.z << "-->" << gpu_state.iz << '\n'; + } LOG_END; + } + + if (input.new_spots && n_spots > 0) { + const auto dst_offset = 3u * cpers.max_input_cells; + const auto spot_sz = n_spots * sizeof(float_type); + CU_CHECK(cudaMemcpyAsync(&gpu_state.ix[dst_offset], input.spot.x, spot_sz, cudaMemcpyHostToDevice, stream)); + CU_CHECK(cudaMemcpyAsync(&gpu_state.iy[dst_offset], input.spot.y, spot_sz, cudaMemcpyHostToDevice, stream)); + CU_CHECK(cudaMemcpyAsync(&gpu_state.iz[dst_offset], input.spot.z, spot_sz, cudaMemcpyHostToDevice, stream)); + + LOG_START(logger::l_debug) { + logger::debug << stanza << "copy (spots) " + << input.cell.x << "-->" << &gpu_state.ix[3u * cpers.max_input_cells] << ", " + << input.cell.y << "-->" << &gpu_state.iy[3u * cpers.max_input_cells] << ", " + << input.cell.z << "-->" << &gpu_state.iz[3u * cpers.max_input_cells] << '\n'; + } LOG_END; + } + } + + static inline void init_cand(const key_type& state_id, const unsigned n_cand_groups, const unsigned n_vec_cgrps, + const config_persistent& cpers, + const std::vector& cand_len, const std::vector& cand_idx, + const std::vector& cell_cand, const std::vector& vec_cgrps, + cudaStream_t stream) + { + const auto n_cand_vecs = n_cand_groups * cpers.num_candidate_vectors; + const auto& gpu_state = ref(state_id); + + CU_CHECK(cudaMemcpyAsync(gpu_state.candidate_length.get(), cand_len.data(), n_cand_groups * sizeof(float_type), cudaMemcpyHostToDevice, stream)); + CU_CHECK(cudaMemsetAsync(gpu_state.candidate_value.get(), 0, n_cand_vecs * sizeof(float_type), stream)); + CU_CHECK(cudaMemcpyAsync(gpu_state.cellvec_to_cand.get(), cand_idx.data(), cand_idx.size() * sizeof(unsigned), cudaMemcpyHostToDevice, stream)); + CU_CHECK(cudaMemcpyAsync(gpu_state.cell_to_cellvec.get(), cell_cand.data(), cell_cand.size() * sizeof(unsigned), cudaMemcpyHostToDevice, stream)); + CU_CHECK(cudaMemcpyAsync(gpu_state.vec_cgrps.get(), vec_cgrps.data(), n_vec_cgrps * sizeof(unsigned), cudaMemcpyHostToDevice, stream)); + } + + // Copy output data from GPU + // This is a blocking call that synchronizes on stream + // Precondition: output.n_cells != 0 + static inline void copy_out(const key_type& state_id, fast_feedback::output& output, gpu_stream &stream) + { + const auto& gpu_state = ref(state_id); + const auto& device_data = gpu_state.data; + const auto cell_sz = 3u * output.n_cells * sizeof(float_type); + + CU_CHECK(cudaMemcpyAsync(output.x, gpu_state.ox, cell_sz, cudaMemcpyDeviceToHost, stream)); + CU_CHECK(cudaMemcpyAsync(output.y, gpu_state.oy, cell_sz, cudaMemcpyDeviceToHost, stream)); + CU_CHECK(cudaMemcpyAsync(output.z, gpu_state.oz, cell_sz, cudaMemcpyDeviceToHost, stream)); + CU_CHECK(cudaMemcpyAsync(output.score, gpu_state.cell_score, output.n_cells * sizeof(float_type), cudaMemcpyDeviceToHost, stream)); + stream.sync(); + + LOG_START(logger::l_debug) { + logger::debug << stanza << "copy out: " << output.n_cells << " cells, elements=" << gpu_state.elements.get() << ": " + << gpu_state.ox << "-->" << output.x << ", " + << gpu_state.oy << "-->" << output.y << ", " + << gpu_state.oz << "-->" << output.z << ", " + << gpu_state.cell_score << "-->" << output.score << '\n'; + } LOG_END; + } + }; + + // Calculate vector candidate groups + // All input cell vectors are mapped to a candidate vector group that uniquely represents the length of the vector. + // crt.length_threshold determines if two vectors are considered to have the same length. + // Input Args: + // in : indexing input + // crt : runtime configuration + // n_cells_in: number of considered input cells + // Output Args: + // cand_idx: input cell vector to candidate vector group mapping (preallocated size: 3 * n_cells_in) + // cand_len: sorted candidate vector group length (preallocated size: 3 * n_cells_in, initialized to: 0) + // Return: + // number of candidate vector groups N ∈ [1 ... 3 * n_cells_in] + template + unsigned calc_cand_groups(std::vector& cand_idx, std::vector& cand_len, + const fast_feedback::input& in, + const fast_feedback::config_runtime& crt, const unsigned n_cells_in) + { + const unsigned n_vecs = 3u * n_cells_in; + + if (cand_idx.size() < n_vecs) + throw FF_EXCEPTION("candidate index vector too small"); + if (cand_len.size() < n_vecs) + throw FF_EXCEPTION("candidate length vector too small"); + + // All vector lengths + for (unsigned i=0u; i{}); + + const float_type l_threshold = crt.length_threshold; + LOG_START(logger::l_debug) { + logger::debug << stanza << "candidate_length ="; + for (const auto& e : cand_len) + logger::debug << ' ' << e; + logger::debug << ", threshold = " << l_threshold << '\n'; + } LOG_END; + + unsigned i=0, j=1; + do { + if ((cand_len[i] - cand_len[j]) < l_threshold) { + LOG_START(logger::l_debug) { + logger::debug << stanza << " ignore " << cand_len[j] << '\n'; + } LOG_END; + } else if (++i != j) { + cand_len[i] = cand_len[j]; + } + } while(++j != n_vecs); + n_cand_groups = i + 1; + for (unsigned i=0u; i bool { + return (a - l) >= l_threshold; + }); + cand_idx[i] = it - std::cbegin(cand_len); + } + } + return n_cand_groups; + } + + // Calculate a candidate vector for each cell + // Chose a vector for every input cell. This vector will be used for the initial half-sphere brute force sampling step. + // The algorithm relies on the decreasing order of the candidate group lengths and corresponding indices in cand_idx. + // So a lower candidate vector group index in cand_idx means a longer vector. + // Input Args: + // cand_idx: input cell vector to candidate vector group mapping (see ordering requirement above, size 3 * n_cells_in) + // Output Args: + // cell_vec: cell to chosen input vector mapping (preallocated size: n_cells_in) + // vec_cand: candidate groups of chosen input vectors (preallocated size: n_cells_in) + // Return: + // Number of candidate groups for the chosen vectors + unsigned calc_cell_cand(std::vector& cell_vec, std::vector& vec_cand, + const std::vector& cand_idx, const unsigned n_cells_in) + { + const unsigned n_vecs = 3u * n_cells_in; + + if (cand_idx.size() < n_vecs) + throw FF_EXCEPTION("candidate index vector too small"); + if (cell_vec.size() < n_cells_in) + throw FF_EXCEPTION("cell candidate vector too small"); + if (vec_cand.size() < n_cells_in) + throw FF_EXCEPTION("candidate groups vector too small"); + + unsigned num_cand_grps = 0u; + unsigned vec = 0u; + for (unsigned cell=0u; cell cand_idx[vec]) + cand = vec; + } + cell_vec[cell] = cand; + unsigned cand_grp = cand_idx[cand]; + auto it = std::find(&vec_cand[0u], &vec_cand[num_cand_grps], cand_grp); + if (it == &vec_cand[num_cand_grps]) + vec_cand[num_cand_grps++] = cand_grp; + } + + return num_cand_grps; + } + + template<> std::mutex indexer_gpu_state::state_update{}; + template<> indexer_gpu_state::map_type indexer_gpu_state::dev_ptr{}; + + template + struct vec_cand_t final { + float_type value; // objective function value + unsigned sample; // sample point index + }; + + template + struct cell_cand_t final { + constexpr static unsigned FLIPPED = 1u<<31; + float_type value; // objective function value + unsigned vsample; // sample point index, or plain candidate index + unsigned rsample; // sample rotation angle index + unsigned cell_vec; // cell vector index: + // lower 31 bits: index + // highest bit : use flipped candidate vector + }; + + template + using BlockRadixSort = cub::BlockRadixSort; + + // ----------------------------------- + // GPU Auxiliary + // ----------------------------------- + + template + struct util final {}; + + template<> + struct util final { + __device__ __forceinline__ static float abs(const float val) noexcept + { + return fabsf(val); + } + + __device__ __forceinline__ static float rint(const float val) noexcept + { + return rintf(val); + } + + __device__ __forceinline__ static void sincos(const float angle, + float* __restrict__ sine, + float* __restrict__ cosine) noexcept + { + return sincosf(angle, sine, cosine); + } + + // __device__ __forceinline__ static float cos(const float angle) noexcept + // { + // return cosf(angle); + // } + + __device__ __forceinline__ static float acos(const float x) noexcept + { + return acosf(x); + } + + __device__ __forceinline__ static float log2(const float x) noexcept + { + return log2f(x); + } + + __device__ __forceinline__ static float exp2(const float x) noexcept + { + return exp2f(x); + } + + // x ^ y + // __device__ __forceinline__ static float pow(const float x, const float y) noexcept + // { + // return powf(x, y); + // } + + __device__ __forceinline__ static float sqrt(const float x) noexcept + { + return sqrtf(x); + } + + // __device__ __forceinline__ static float rem(const float x, const float y) noexcept + // { + // return remainderf(x, y); + // } + + __device__ __forceinline__ static float norm(const float x, const float y, const float z) noexcept + { // sqrt(x*x + y*y + z*z) + return norm3df(x, y, z); + } + + __device__ __forceinline__ static float rnorm(const float x, const float y, const float z) noexcept + { // 1 / sqrt(x*x + y*y + z*z) + return rnorm3df(x, y, z); + } + + __device__ __forceinline__ static float fma(const float x, const float y, const float z) noexcept + { // x * y + z + return fmaf(x, y, z); + } + + // __device__ __forceinline__ static void sincospi(const float a, float* sinp, float* cosp) noexcept + // { + // sincospif(a, sinp, cosp); + // } + + // __device__ __forceinline__ static float cospi(const float a) noexcept + // { + // return cospif(a); + // } + + // __device__ __forceinline__ static void from_unsigned(float& f1, float& f2, const unsigned n) noexcept + // { + // static constexpr unsigned nbits = 8u * sizeof(unsigned); + // static constexpr unsigned mant_bits = std::numeric_limits::digits; + // static constexpr unsigned mask_upper = ((1u << mant_bits) - 1u) << (nbits - mant_bits);; + // static constexpr unsigned mask_lower = ~mask_upper; + + // f1 = n & mask_upper; + // f2 = n & mask_lower; + // } + }; + + // acquire block sequentializer in busy wait loop + __device__ __forceinline__ void seq_acquire(unsigned& __restrict__ seq) noexcept + { + while (atomicCAS(&seq, 0u, 1u) != 0u) + #if defined(__CUDA_ARCH__) && (__CUDA_ARCH__ >= 700) + __nanosleep(1) + #endif + ; + } + + // release block sequentializer + __device__ __forceinline__ void seq_release(unsigned& __restrict__ seq) noexcept + { + __threadfence(); + __stwt(&seq, 0u); + } + + // kahan sum + // (a, rest) = a + b + rest + template + __device__ __forceinline__ void ksum(float_type& __restrict__ a, + float_type& __restrict__ rest, + const float_type b) noexcept + { + const float_type s = rest + b; + const float_type t = a; + a = t + s; + rest = s - (a - t); + } + + // warpwise aggregate of float a in lane 0 + __device__ __forceinline__ void reduce_add(float& __restrict__ a) noexcept + { + float r = .0f; + for (unsigned d=1; d= 800 + a = __reduce_add_sync(all_lanes, a); + #else + for (unsigned d=1; d + __device__ __forceinline__ float_type max3(const float_type a, const float_type b, const float_type c) noexcept + { + const float_type t = (a < b) ? b : a; + return (t < c) ? c : t; + } + + // return value trimmed to the range [triml..trimh] + // assume triml <= trimh + template + __device__ __forceinline__ float_type trim(const fast_feedback::config_runtime& __restrict__ crt, + const float_type val) noexcept + { + return min(max(crt.triml, val), crt.trimh); + } + + // return distance to nearest integer for value + // The function assumes that 0 <= triml <= trimh <= 0.5 + template + __device__ __forceinline__ float_type dist2int(const float_type val) noexcept + { + return util::abs(val - util::rint(val)); + } + + // a 🞄 a + template + __device__ __forceinline__ float_type norm2(const float_type a[3]) noexcept + { + return util::fma(a[0], a[0], util::fma(a[1], a[1], a[2] * a[2])); + } + + // a 🞄 b + template + __device__ __forceinline__ float_type dot(const float_type a[3], const float_type b[3]) noexcept + { + return util::fma(a[0], b[0], util::fma(a[1], b[1], a[2] * b[2])); + } + + // a = b X c + template + __device__ __forceinline__ void cross(float_type a[3], const float_type b[3], const float_type c[3]) noexcept + { + a[0] = util::fma(b[1], c[2], -b[2] * c[1]); + a[1] = util::fma(b[2], c[0], -b[0] * c[2]); + a[2] = util::fma(b[0], c[1], -b[1] * c[0]); + } + + // a = -a + template + __device__ __forceinline__ void flip(float_type a[3]) noexcept + { + a[0] = -a[0]; + a[1] = -a[1]; + a[2] = -a[2]; + } + + // x = inv(A) * v; A in R^3 symmetric positive definite (only upper triangle is present) + // out: x + // in : A + // in : v + template + __device__ __forceinline__ void sym_solve(float_type x[3], const float_type A[6], const float_type v[3]) noexcept + { + // A = [a b c] 0 1 2 + // [- d e] 3 4 + // [- - f] 5 + // det_A = a*(d*f - e*e) - b*(b*f - c*e) + c*(b*e - c*d) + // A_inv = [[(d*f - e*e), -(b*f - c*e), (b*e - c*d)], + // [- , (a*f - c*c), -(a*e - b*c)], + // [- , - , (a*d - b*b)]] / det_A + // x = A_inv @ v + + // A cofactors + const auto co00 = A[3]*A[5] - A[4]*A[4]; + const auto co01 = A[1]*A[5] - A[2]*A[4]; + const auto co02 = A[1]*A[4] - A[2]*A[3]; + + const auto co11 = A[0]*A[5] - A[2]*A[2]; + const auto co12 = A[0]*A[4] - A[1]*A[2]; + + const auto co22 = A[0]*A[3] - A[1]*A[1]; + + // det = A[0]*co00 - A[1]*co01 + A[2]*co02 + float_type t = A[0]*co00; + float_type r = 0.; + ksum(t, r, -A[1]*co01); + ksum(t, r, A[2]*co02); + const auto r_det_A = float_type{1.} / t; + + // x[0] = (co00*v[0] - co01*v[1] + co02*v[2]) / det + t = co00*v[0]; + r = 0.; + ksum(t, r, -co01*v[1]); + ksum(t, r, co02*v[2]); + x[0] = t * r_det_A; + + // x[1] = (-co01*v[0] + co11*v[1] - co12*v[2]) / det + t = -co01*v[0]; + r = 0.; + ksum(t, r, co11*v[1]); + ksum(t, r, -co12*v[2]); + x[1] = t * r_det_A; + + // x[0] = (co02*v[0] - co12*v[1] + co22*v[2]) / det + t = co02*v[0]; + r = 0.; + ksum(t, r, -co12*v[1]); + ksum(t, r, co22*v[2]); + x[2] = t * r_det_A; + } + + // Calculate in a the unique unified mirroring vector that brings a to b if it exists + // Return unified mirroring vector in a, unified b in b, and length of b in l, and if the unique mirroring vector exists + // lb = |b| + // b = b / lb + // a = (a + l * b); a /= |a| + // l = lb + // pre: l = |a| + // post: result is false if and only if a is not unique (a and b collinear) + template + __device__ __forceinline__ bool add_unify(float_type a[3], float_type b[3], float_type& __restrict__ l) noexcept + { + const float_type lb = util::norm(b[0], b[1], b[2]); + for (unsigned i=0u; i<3u; i++) { + b[i] /= lb; + a[i] = util::fma(l, b[i], a[i]); + } + l = lb; + const float_type f = util::norm(a[0], a[1], a[2]); + if (f >= constant::eps) { + for (unsigned i=0u; i<3u; i++) + a[i] /= f; + return true; + } + return false; + } + + // Calculate a unit vector in a perpendicular to b and c + // a = b X c + // l = |a| + // a /= l + template + __device__ __forceinline__ void perpendicular_unit(float_type a[3], const float_type b[3], const float_type c[3]) noexcept + { + cross(a, b, c); + const float_type f = util::rnorm(a[0], a[1], a[2]); + for (unsigned i=0u; i<3u; i++) + a[i] *= f; + } + + // Mirror a on axis represented by unit vector b + // a = 2 * (a 🞄 b) * b - a + // pre: |b| == 1 + template + __device__ __forceinline__ void mirror(float_type a[3], const float_type b[3]) noexcept + { + const float_type p2 = float_type{2.f} * dot(a, b); + for (unsigned i=0u; i<3u; i++) + a[i] = util::fma(p2, b[i], -a[i]); + } + + // laz = a 🞄 z length af vector a projected to axis through z + // x = a - laz * z projection of a to plane perpendicular to z + // x /= |x| unit vector of projection + // laxy = a 🞄 x length of projection + // pre: |z| == 1 + template + __device__ __forceinline__ void project_unify(float_type x[3], const float_type a[3], const float_type z[3], + float_type& __restrict__ laz, + float_type& __restrict__ laxy) noexcept + { + laz = dot(a, z); + for (unsigned i=0u; i<3u; i++) + x[i] = util::fma(-laz, z[i], a[i]); + const float_type f = util::rnorm(x[0], x[1], x[2]); + for (unsigned i=0u; i<3u; i++) + x[i] *= f; + laxy = dot(a, x); + } + + // Calculate vector a with z coordinate laz and with xy projection of length laxy and angle alpha + // a = laz * z + (cos(alpha) * x + sin(alpha) * y) * laxy + // pre x, y, z are of unit length and pairwise perpendicular + template + __device__ __forceinline__ void rotate(float_type a[3], + const float_type x[3], const float_type y[3], const float_type z[3], + const float_type laz, const float_type laxy, + const float_type alpha) noexcept + { + float_type s, c; + util::sincos(alpha, &s, &c); + for (unsigned i=0u; i<3u; i++) + a[i] = util::fma(laz, z[i], (util::fma(c, x[i], s * y[i]) * laxy)); + } + + // single threaded merge of block local sorted candidate vector array into global sorted candidate vector array + template + __device__ __forceinline__ void merge_top_vecs(float_type* __restrict__ top_val, + unsigned* __restrict__ top_sample, + vec_cand_t* __restrict__ cand, + const unsigned n_cand) noexcept + { + // ---- python equivalent ---- + // def a_top(A, B): + // if A[-1] <= B[0]: + // return + // if B[-1] <= A[0]: + // A[:] = B[:] + // return + // a, b0, b1, b2 = 0, 0, len(B)-1, len(B)-1 + // while a < len(A): + // val = A[a] + // if b1 < b2: + // if val < B[b1]: + // B[b1] = val; b1 -= 1 + // if B[b0] < B[b2]: + // A[a] = B[b0]; b0 += 1 + // else: + // A[a] = B[b2]; b2 -= 1 + // else: + // if val > B[b0]: + // if val < B[b1]: + // B[b1] = val; b1 -= 1 + // else: + // A[a:] = B[b0:b0+len(A)-a] + // return + // A[a] = B[b0]; b0 += 1 + // a += 1 + // ---------------------------- + // Candidates are ordered by value, equal values by sample index: a total order, so the global top + // list is the same whatever order the blocks merge in (a value tie would otherwise go to the block + // that happened to merge first). The block-local lists are in this order already: the block's + // radix sort is stable and its samples ascend with the thread index. + auto less = [](float_type va, unsigned sa, float_type vb, unsigned sb) { + return va < vb || (va == vb && sa < sb); + }; + + if (!less(cand[0].value, cand[0].sample, top_val[n_cand-1], top_sample[n_cand-1])) + return; + + if (!less(top_val[0], top_sample[0], cand[n_cand-1].value, cand[n_cand-1].sample)) { + for (unsigned i=0; i + __device__ __forceinline__ void merge_top_cells(fast_feedback::output& __restrict__ out, + cell_cand_t* __restrict__ cand, + const unsigned n_cand) noexcept + { + // A total order, as in merge_top_vecs: equal values by cell vector (with its flip bit), candidate + // vector and rotation sample, so a tie does not go to whichever block merged first. Within a block + // only the rotation sample varies, and the block's stable radix sort leaves it ascending on ties. + auto key_less = [](unsigned ca, unsigned va, unsigned ra, unsigned cb, unsigned vb, unsigned rb) { + return ca != cb ? ca < cb : (va != vb ? va < vb : ra < rb); + }; + auto out_key = [&](unsigned i, unsigned& c, unsigned& v, unsigned& r) { + c = *reinterpret_cast(&out.z[3u * i]); + v = *reinterpret_cast(&out.x[3u * i]); + r = *reinterpret_cast(&out.y[3u * i]); + }; + auto out_less_cand = [&](unsigned i, const cell_cand_t& b) { + if (out.score[i] != b.value) + return out.score[i] < b.value; + unsigned c, v, r; + out_key(i, c, v, r); + return key_less(c, v, r, b.cell_vec, b.vsample, b.rsample); + }; + auto cand_less_out = [&](const cell_cand_t& a, unsigned i) { + if (a.value != out.score[i]) + return a.value < out.score[i]; + unsigned c, v, r; + out_key(i, c, v, r); + return key_less(a.cell_vec, a.vsample, a.rsample, c, v, r); + }; + auto cand_less = [&](const cell_cand_t& a, const cell_cand_t& b) { + if (a.value != b.value) + return a.value < b.value; + return key_less(a.cell_vec, a.vsample, a.rsample, b.cell_vec, b.vsample, b.rsample); + }; + + if (!cand_less_out(cand[0], n_cand-1)) + return; + + if (!out_less_cand(0, cand[n_cand-1])) { + for (unsigned i=0u; i(&out.x[3u * i]) = cand[i].vsample; + *reinterpret_cast(&out.y[3u * i]) = cand[i].rsample; + *reinterpret_cast(&out.z[3u * i]) = cand[i].cell_vec; + } + return; + } + + unsigned top = 0; + unsigned cand0 = 0; + unsigned cand1 = n_cand - 1; + unsigned cand2 = n_cand - 1; + + while (top < n_cand) { + auto val = out.score[top]; + if (cand1 < cand2) { + if (out_less_cand(top, cand[cand1])) { + cand[cand1].value = val; + cand[cand1].vsample = *reinterpret_cast(&out.x[3u * top]); + cand[cand1].rsample = *reinterpret_cast(&out.y[3u * top]); + cand[cand1].cell_vec = *reinterpret_cast(&out.z[3u * top]); + --cand1; + } + if (cand_less(cand[cand0], cand[cand2])) { + out.score[top] = cand[cand0].value; + *reinterpret_cast(&out.x[3u * top]) = cand[cand0].vsample; + *reinterpret_cast(&out.y[3u * top]) = cand[cand0].rsample; + *reinterpret_cast(&out.z[3u * top]) = cand[cand0].cell_vec; + ++cand0; + } else { + out.score[top] = cand[cand2].value; + *reinterpret_cast(&out.x[3u * top]) = cand[cand2].vsample; + *reinterpret_cast(&out.y[3u * top]) = cand[cand2].rsample; + *reinterpret_cast(&out.z[3u * top]) = cand[cand2].cell_vec; + --cand2; + } + } else if (cand_less_out(cand[cand0], top)) { + if (out_less_cand(top, cand[cand1])) { + cand[cand1].value = val; + cand[cand1].vsample = *reinterpret_cast(&out.x[3u * top]); + cand[cand1].rsample = *reinterpret_cast(&out.y[3u * top]); + cand[cand1].cell_vec = *reinterpret_cast(&out.z[3u * top]); + --cand1; + } else { + for (; top(&out.x[3u * top]) = cand[cand0].vsample; + *reinterpret_cast(&out.y[3u * top]) = cand[cand0].rsample; + *reinterpret_cast(&out.z[3u * top]) = cand[cand0].cell_vec; + } + return; + } + out.score[top] = cand[cand0].value; + *reinterpret_cast(&out.x[3u * top]) = cand[cand0].vsample; + *reinterpret_cast(&out.y[3u * top]) = cand[cand0].rsample; + *reinterpret_cast(&out.z[3u * top]) = cand[cand0].cell_vec; + ++cand0; + } + ++top; + } + } + + // Calculate sample point on half unit sphere + // sample_idx index of sample point 0..n_samples + // n_samples number of sampling points + // v sample point coordinates on half unit sphere + template + __device__ __forceinline__ void sample_point(const unsigned sample_idx, const unsigned n_samples, float_type v[3]) noexcept + { + // Version 2: Julia + // i = collect(0:np-1) + // dl = 3. - sqrt(5.) + // z = 1. .- i./(np-1) + // r = sqrt.(1. .- z .* z) + // l = i * dl + // x = cos.(l .* pi) .* r + // y = sin.(l .* pi) .* r + + const float_type z = float_type{1.} - static_cast(sample_idx) / (n_samples - 1); + const float_type r = util::sqrt(float_type{1.} - z * z); + + float_type l = .0; + { + float_type rest = .0; + static_assert(sizeof(unsigned) == 4, "assumption about sizeof(unsigned) violated"); + for (unsigned i=0; i<32; i++) { + if (sample_idx & (1u << i)) + ksum(l, rest, dl2pNmod2pi[i]); + } + } + + float_type x, y; + util::sincos(l, &y, &x); + + v[0] = x * r; + v[1] = y * r; + v[2] = z; + } + + // Get sample cell vectors a, b, and unified c + // z (inout) sample cell vector c, maybe refined + // a (out) sample cell vector a + // b (out) sample cell vector b + // cx input cell vectors x coordinates + // cy input cell vectors y coordinates + // cz input cell vectors z coordinates + // vlength (inout) length of original cell vector c + // rsample sample rotation angle index of sample cell [0 .. n_rsamples[ + // n_rsamples number of sample angles around sample cell vector c + // cell_vec input cell vector index [0 .. 3*n_input_cells[ + // post |z_out|=1, vlength=|z_in| + template + __device__ __forceinline__ void sample_cell(float_type z[3], float_type a[3], float_type b[3], + const float_type* __restrict__ cx, + const float_type* __restrict__ cy, + const float_type* __restrict__ cz, + float_type& __restrict__ vlength, + const unsigned rsample, const unsigned n_rsamples, + const unsigned cell_vec) noexcept + { + { // Get input cell vectors a and b + const unsigned cell_base = cell_vec / 3u; + { + const unsigned idx = cell_base + (cell_vec + 1u) % 3u; + a[0] = cx[idx]; a[1] = cy[idx]; a[2] = cz[idx]; + } + { + const unsigned idx = cell_base + (cell_vec + 2u) % 3u; + b[0] = cx[idx]; b[1] = cy[idx]; b[2] = cz[idx]; + } + } + float_type t[3] = { cx[cell_vec], cy[cell_vec], cz[cell_vec] }; + // Align cell to sample vector z by finding and mirroring on t + if (! add_unify(t, z, vlength)) // now z has unit length, vlength is it's original length + perpendicular_unit(t, z, a); + mirror(a, t); + mirror(b, t); + // Basis perpendicular to z and projections of a/b to z, xy + float_type x[3], laz, laxy; // unit vector x, length of a projected to z and xy plane ⊥ v + float_type y[3], lbz, lbxy; // unit vector y, length of b projected to z and xy plane ⊥ v + project_unify(x, a, z, laz, laxy); + project_unify(t, b, z, lbz, lbxy); + cross(y, z, x); + // Rotation around z for a, b + float_type delta = util::acos(dot(t, x)); // angle delta between axy and bxy vectors + if (dot(t, y) < .0f) + delta = -delta; + const float_type alpha = rsample * constant::pi2 / static_cast(n_rsamples); // sample angle + rotate(a, x, y, z, laz, laxy, alpha); + rotate(b, x, y, z, lbz, lbxy, alpha + delta); + } + + // Calculate combined score for single vector + // - pow(mul(s ∈ spots) trim[triml..trimh](dist2int(s 🞄 v * vlength)) + delta, 1/|spots|) - delta + // - negative number of spots within distance crt.trimh of an integer - 1 (to prevent negative scores) + // crt runtime configuration with triml/h and delta + // v unit vector in sample vector direction, |v| == 1 + // vlength sample vector length + // s{x,y,z} spot coordinate pointers [n_spots] + // n_spots number of spots + template + __device__ __forceinline__ float_type sample1(const fast_feedback::config_runtime& __restrict__ crt, + const float_type v[3], const float_type vlength, + const float_type* __restrict__ sx, + const float_type* __restrict__ sy, + const float_type* __restrict__ sz, + const unsigned n_spots) noexcept + { + constexpr unsigned BATCH = 1u << 3; // 2^n, with n=3 + constexpr unsigned MASK = BATCH - 1u; // lower n bits + float_type sval = float_type{0.f}; + float_type sv = float_type{1.f}; + unsigned n_good = 1u; // 1 too many to prevent positive numbers + + const float_type delta = crt.delta; + unsigned i = 0u; + do { + const float_type s[3] = { sx[i], sy[i], sz[i] }; + const float_type d = dist2int(vlength * dot(v, s)); + n_good += (d < crt.dist1) ? 1u : 0u; + sv *= trim(crt, d) + delta; + if ((++i & MASK) == 0u) { + sval += util::log2(sv); + sv = float_type{1.}; + } + } while (i::log2(sv); + return util::exp2(sval / (float_type)n_spots) - delta - (float_type)n_good; + } + + // Calculate combined score for cell + // - pow(mul(s ∈ spots) trim[triml..trimh](sqrt(sum[i=a,b,c](dist2int(s 🞄 vi / |vi|²)²))) + delta, 1/|spots|) - delta + // - negative number of spots within distance crt.trimh of an integer - 1 (to prevent negative scores) + // crt runtime configuration with triml/h and delta + // z, a, b sample vectors, z is c normalized + // s{x,y,z} spot coordinate pointers [n_spots] + // lz length of c + // n_spots number of spots + template + __device__ __forceinline__ float_type sample3(const fast_feedback::config_runtime& __restrict__ crt, + const float_type z[3], const float_type a[3], const float_type b[3], + const float_type* __restrict__ sx, + const float_type* __restrict__ sy, + const float_type* __restrict__ sz, + const float_type lz, const unsigned n_spots) noexcept + { + constexpr unsigned BATCH = 1u << 3; // 2^n, with n=3 + constexpr unsigned MASK = BATCH - 1u; // lower n bits + float_type sval = float_type{1.f}; + float_type sv = float_type{1.f}; + unsigned n_good = 1u; // 1 too many to prevent positive numbers + + const float_type delta = crt.delta; + unsigned i=0u; + do { + const float_type s[3] = { sx[i], sy[i], sz[i] }; + const float_type dn = util::norm( + dist2int(lz * dot(z, s)), + dist2int(dot(a, s)), + dist2int(dot(b, s)) + ); + n_good += (dn < crt.dist3) ? 1u : 0u; + sv *= trim(crt, dn) + delta; + if ((++i & MASK) == 0u) { + sval += util::log2(sv); + sv = float_type{1.}; + } + } while (i::log2(sv); + return util::exp2(sval / (float_type)n_spots) - delta - (float_type)n_good; + } + + // ----------------------------------- + // GPU Kernels + // ----------------------------------- + + // single thread kernel + // kind 0-candidate vectors sampled + output cells (float) + // 1-candidate vectors refined + // 2-output cells (unsigned) + // 3-output cells (float) + template + __global__ void gpu_debug_out(indexer_device_data* __restrict__ data, const unsigned kind) + { + printf("### INDEXER_GPU_DEBUG (%u)\n", kind); + if (kind <= 1u) { + // Print out candidate vectors + unsigned ncg = 0u; + const unsigned ncv = data->cpers.num_candidate_vectors; + const unsigned n_cells_in = data->input.n_cells; + + if (kind == 0u) { + // Vector candidates sampled + const float_type* const __restrict__ cvp = data->candidate_value; + const unsigned* const __restrict__ csp = data->candidate_sample; + for (unsigned i=0u; icell_to_cellvec[i]); + for (unsigned j=3*i; j<3*i+3; ++j) { + unsigned cg = data->cellvec_to_cand[j]; + printf(" %u", cg); + if (cg > ncg) + ncg = cg; + } + printf("\n"); + } + + printf("redundant_comp=%u, rcgrps:", unsigned(data->cpers.redundant_computations)); + for (unsigned i=0u; ivec_cgrps[i]); + printf("\n"); + + for (unsigned i=0u; i<=ncg; ++i) { + printf("cg%u:", i); + auto cv = &cvp[i * ncv]; + auto cs = &csp[i * ncv]; + for (unsigned j=0; jrefined_candidates; + for (unsigned i=0u; i<(3u*n_cells_in); ++i) { + unsigned cg = data->cellvec_to_cand[i]; + if (cg > ncg) + ncg = cg; + } + for (unsigned i=0u; i<=ncg; ++i) { + printf("cg%u:", i); + for (unsigned j=0; j::mem_txn_unit]; + printf(" (%0.2f,%0.2f,%0.2f)", (float)rc[0], (float)rc[1], (float)rc[2]); + } + printf("\n"); + } + return; + } + } else { + const fast_feedback::output& out = data->output; + const unsigned n_cells_out = data->cpers.max_output_cells; + printf("output n_cells=%u\n", out.n_cells); + for (unsigned i=0u; i(&out.z[j]); + printf(" %u %u %u %s\n", + *reinterpret_cast(&out.x[j]), + *reinterpret_cast(&out.y[j]), + cell_vec & ~cell_cand_t::FLIPPED, + cell_vec & cell_cand_t::FLIPPED ? "flipped" : ""); + } else { + printf(" %f %f %f\n", out.x[j], out.y[j], out.z[j]); + } + } + } + } + printf("###\n"); + } + + // sample = blockDim.x * blockIdx.x + threadIdx.x + // for non-redundant (cpers.redundant_computations=false) calculations: + // representing vector candidate group = blockIdx.y + // for redundant computations: + // candidate group index = blockIdx.y + template + __global__ void gpu_find_candidates(indexer_device_data* __restrict__ data) + { + extern __shared__ double* shared_ptr[]; + + unsigned sample[1] = {blockDim.x * blockIdx.x + threadIdx.x}; + const unsigned n_samples = data->crt.num_halfsphere_points; + const unsigned c_group = data->cpers.redundant_computations ? blockIdx.y : data->vec_cgrps[blockIdx.y]; + float_type v[1] = {0.}; // objective function value for sample vector + + if (*sample < n_samples) { // calculate v + const float_type sl = data->candidate_length[c_group]; // sample vector length + float_type sv[3]; // unit vector in sample direction + sample_point(*sample, n_samples, sv); + + const fast_feedback::input& in = data->input; + const unsigned n_spots = in.n_spots; + *v = sample1(data->crt, sv, sl, in.spot.x, in.spot.y, in.spot.z, n_spots); + } + + { // sort within block {objective function value, sample} ascending by objective function value + auto sort_ptr = reinterpret_cast::TempStorage*>(shared_ptr); + BlockRadixSort(*sort_ptr).Sort(v, sample); + __syncthreads(); // protect sort_ptr[] (it's in the same memory as cand_ptr) + } + + const unsigned num_candidate_vectors = data->cpers.num_candidate_vectors; + auto cand_ptr = reinterpret_cast*>(shared_ptr); // [num_candidate_vectors] + if (threadIdx.x < num_candidate_vectors) // store top candidate vectors into cand_ptr + cand_ptr[threadIdx.x] = { *v, *sample }; + + if (num_candidate_vectors < warp_size) { // wait for cand_ptr + if (threadIdx.x < warp_size) + __syncwarp(); + } else + __syncthreads(); + + if (threadIdx.x == 0) { // merge block local into global result + auto value_ptr = &data->candidate_value[c_group * num_candidate_vectors]; + auto sample_ptr = &data->candidate_sample[c_group * num_candidate_vectors]; + + seq_acquire(data->seq_block[c_group]); + merge_top_vecs(value_ptr, sample_ptr, cand_ptr, num_candidate_vectors); + seq_release(data->seq_block[c_group]); + } + + // clear output cell scores + if (*sample < data->cpers.max_output_cells) { + data->output.score[*sample] = float_type{.0f}; + } + } + + // vector candidate index = blockIdx.x + // vector candidate group index = blockIdx.y + // cuda thread block size = warp_size (32) + template + __global__ void gpu_refine_cand(indexer_device_data* __restrict__ data) + { + // # Python equivalent + // class Optimizer: + // def __init__(self, reciprocal_spots, beta=[.3, .1, .03, .01]): + // self.spots = reciprocal_spots # spots in reciprocal space + // self.beta = beta # list of diminishing beta values + // self.select = None # spot selector boolean vector + // def __call__(self, b): # b: approximation column vector in nonreciprocal space + // coord = self.spots @ b # spot coordinates in nonreciprocal space + // miller = np.round(coord) # closest integer coordinates + // for beta in self.beta: + // coord = self.spots @ b + // self.select = np.abs(coord - miller) < beta # index set: spots within distance beta of miller coordinate + // if sum(self.select) < 6: + // return None + // b = np.linalg.lstsq(self.spots[self.select,:], miller[self.select],rcond=-1)[0] # use least squares fit to selected spots for a better approximation vector + // return b + static constexpr unsigned n_rounds = 4; + static constexpr float_type beta[n_rounds] = {.1, .05, .025, 0.01}; // beta values per round + const unsigned n_cand = gridDim.x; // number of candidates per candidate group + const unsigned cand = blockIdx.x; // candidate vector index (within candidate group) + const unsigned cand_grp = blockIdx.y; // candidate group index + const unsigned n_vsamples = data->crt.num_halfsphere_points; // total number of sample vectors + const unsigned vsample = data->candidate_sample[cand_grp * n_cand + cand]; // sample vector index + const float_type vlength = data->candidate_length[cand_grp]; // sample vector length + const fast_feedback::input& in = data->input; // input data + const unsigned n_spots = in.n_spots; // number of reciprocal spots + const float_type* sx = in.spot.x; + const float_type* sy = in.spot.y; // reciprocal spot coordinates + const float_type* sz = in.spot.z; + float_type z0[3]; // sample vector + float_type z[3]; // refined sample vector + float_type STS[6] = {}; // S.T @ S, i'th block (upper trinagle) + float_type STS_r[6] = {}; // rest values + float_type STm[3] = {}; // S.T @ m, i'th block + float_type STm_r[3] = {}; // rest values + + sample_point(vsample, n_vsamples, z); // sample unit vector + for (unsigned i=0u; i<3u; i++) { + z[i] *= vlength; // refined sample vector + z0[i] = z[i]; // sample vector + } + + for (unsigned round=0; round::rint(dot(s, z0)); // Miller index i + const float_type d = std::abs(dot(s, z) - m); + if (d >= b) + continue; + good_spots++; + for (unsigned j=0u; j<3u; j++) { + ksum(STm[j], STm_r[j], s[j] * m); + for (unsigned k=j; k<3u; k++) { + unsigned l = (j<<1u) - (j>>1u) + k; + ksum(STS[l], STS_r[l], s[j]*s[k]); + } + } + } + + reduce_add_broadcast(good_spots); + + if (good_spots < data->crt.min_spots) + break; + } + + for (unsigned j=0u; j<3u; j++) { + reduce_add(STm[j]); + for (unsigned k=j; k<3u; k++) + reduce_add(STS[(j<<1u)-(j>>1u)+k]); + } + + if (threadIdx.x == 0) + sym_solve(z, STS, STm); + + for (unsigned j=0u; j<3u; j++) + z[j] = __shfl_sync(all_lanes, z[j], 0); + } + + if (threadIdx.x == 0) { + float_type* refined_candidate = &data->refined_candidates[(cand_grp * n_cand + cand) * constant::mem_txn_unit]; + for (unsigned i=0u; i<3u; i++) + refined_candidate[i] = z[i]; + } + } + + // sample rotation angle index = blockDim.x * blockIdx.x + threadIdx.x + // for non-redundant (cpers.redundant_computations=false) calculations: + // input cell index = blockIdx.y + // for redundant computations: + // cell vector index = blockIdx.y + // vector candidate index = blockIdx.z / 2 + // flipped candidate = blockIdx.z & 1 + template + __global__ void gpu_find_cells(indexer_device_data* __restrict__ data) + { + extern __shared__ double* shared_ptr[]; + + const unsigned n_vsamples = data->crt.num_halfsphere_points; + unsigned rsample = blockIdx.x * blockDim.x + threadIdx.x; + const unsigned cell_vec = data->cpers.redundant_computations ? blockIdx.y : data->cell_to_cellvec[blockIdx.y]; + const unsigned cand = blockIdx.z / 2u; + const bool flipped = blockIdx.z & 1; // use flipped candidate vector? + const unsigned cand_grp = data->cellvec_to_cand[cell_vec]; + const unsigned n_cand = data->cpers.num_candidate_vectors; + const unsigned vsample = data->candidate_sample[cand_grp * n_cand + cand]; + float_type vabc=.0f; // accumulated sample values for a, b, c cell vectors + + { // calculate vabc for vsample/rsample/ + const fast_feedback::input& __restrict__ in = data->input; + const unsigned n_rsamples = gridDim.x * blockDim.x; + float_type vlength = data->candidate_length[cand_grp]; + float_type z[3], a[3], b[3]; + + if (data->crt.min_spots != 0) { + const float_type* const __restrict__ refined_candidate = &data->refined_candidates[(cand_grp * n_cand + cand) * constant::mem_txn_unit]; + for (unsigned i=0u; i<3u; i++) + z[i] = refined_candidate[i]; + } else { + sample_point(vsample, n_vsamples, z); + for (unsigned i=0u; i<3u; i++) + z[i] *= vlength; + } + // z = (refined) rotated cell vector, vlength = original cell vector length + if (flipped) + flip(z); + + sample_cell(z, a, b, in.cell.x, in.cell.y, in.cell.z, vlength, rsample, n_rsamples, cell_vec); + // z unified, vlength has it's original length + + const unsigned n_spots = in.n_spots; + vabc = sample3(data->crt, z, a, b, in.spot.x, in.spot.y, in.spot.z, vlength, n_spots); + } + + // Get best output cells for block + { // sort within block {objective function value, sample} ascending by objective function value + float_type key[1] = {vabc}; + unsigned val[1] = {rsample}; + { + auto sort_ptr = reinterpret_cast::TempStorage*>(shared_ptr); + BlockRadixSort(*sort_ptr).Sort(key, val); + } + vabc = *key; + rsample = *val; + __syncthreads(); // protect sort_ptr[] (it's in the same memory as cand_ptr) + } + + const unsigned n_output_cells = data->output.n_cells; + auto __restrict__ cand_ptr = reinterpret_cast*>(shared_ptr); // [output.n_cells] + if (threadIdx.x < n_output_cells) { // store top candidate cells into cand_ptr + if (data->crt.min_spots != 0) { + cand_ptr[threadIdx.x] = { vabc, cand, rsample, flipped ? (cell_vec | cell_cand_t::FLIPPED) : cell_vec }; + } else { + cand_ptr[threadIdx.x] = { vabc, vsample, rsample, flipped ? (cell_vec | cell_cand_t::FLIPPED) : cell_vec }; + } + } + + if (n_output_cells < warp_size) { // wait for cand_ptr + if (threadIdx.x < warp_size) + __syncwarp(); + } else + __syncthreads(); + + if (threadIdx.x == 0) { // merge block local into global result + seq_acquire(data->seq_block[0]); + merge_top_cells(data->output, cand_ptr, n_output_cells); + seq_release(data->seq_block[0]); + } + } + + // expand {cand, rsample, cell_vec} to coordinates of unit cell vectors + // threadIdx.x = output cell index + // n_rsamples number of rotation angle samples rounded up to n_threads (must match n_rsamples in gpu_find_cells) + template + __global__ void gpu_expand_cells(indexer_device_data* __restrict__ data, const unsigned n_rsamples) + { + const fast_feedback::input& __restrict__ in = data->input; + fast_feedback::output& __restrict__ out = data->output; + float_type* __restrict__ ox = out.x; + float_type* __restrict__ oy = out.y; + float_type* __restrict__ oz = out.z; + const unsigned cell_base = 3u * threadIdx.x; + const unsigned rsample = *reinterpret_cast(&oy[cell_base]); + const unsigned cell_vec = *reinterpret_cast(&oz[cell_base]) & ~cell_cand_t::FLIPPED; + const bool flipped = *reinterpret_cast(&oz[cell_base]) & cell_cand_t::FLIPPED; + const unsigned cand_grp = data->cellvec_to_cand[cell_vec]; + const unsigned n_cand = data->cpers.num_candidate_vectors; + float_type vlength = data->candidate_length[cand_grp]; + float_type z[3], a[3], b[3]; + + if (data->crt.min_spots != 0) { + const unsigned cand = *reinterpret_cast(&ox[cell_base]); + const float_type* const __restrict__ refined_candidate = &data->refined_candidates[(cand_grp * n_cand + cand) * constant::mem_txn_unit]; + for (unsigned i=0u; i<3u; i++) + z[i] = refined_candidate[i]; + } else { + const unsigned vsample = *reinterpret_cast(&ox[cell_base]); + const unsigned n_vsamples = data->crt.num_halfsphere_points; + sample_point(vsample, n_vsamples, z); + for (unsigned i=0u; i<3u; i++) + z[i] *= vlength; + } + if (flipped) + flip(z); + // z = rotated cell vector + + sample_cell(z, a, b, in.cell.x, in.cell.y, in.cell.z, vlength, rsample, n_rsamples, cell_vec); + + const unsigned iz = cell_vec % 3u; + const unsigned ia = (iz + 1u) % 3u; + const unsigned ib = (iz + 2u) % 3u; + ox[cell_base + iz] = z[0] * vlength; + ox[cell_base + ia] = a[0]; + ox[cell_base + ib] = b[0]; + oy[cell_base + iz] = z[1] * vlength; + oy[cell_base + ia] = a[1]; + oy[cell_base + ib] = b[1]; + oz[cell_base + iz] = z[2] * vlength; + oz[cell_base + ia] = a[2]; + oz[cell_base + ib] = b[2]; + } + + // Test PTX compatibility + // Flip bit zero of *int_ptr with a single cuda thread + __global__ void gpu_ptx_compatibility_test(int* int_ptr) + { + *int_ptr ^= 1; + } + +} // anonymous namespace + +namespace gpu { + + template + void init (const indexer& instance) + { + using gpu_state = indexer_gpu_state; + using device_data = indexer_device_data; + + gpu_device::init(); + gpu_debug_init(); + + const auto state_id = instance.state; + if (gpu_state::exists(state_id)) + throw FF_EXCEPTION("instance illegal reinitialisation"); + + const auto& cpers = instance.cpers; + + if (cpers.num_candidate_vectors < 1u) + throw FF_EXCEPTION("nonpositive number of candidate vectors"); + if (instance.cpers.num_candidate_vectors > n_threads) + throw FF_EXCEPTION("fewer threads in a block than candidate vectors"); + + device_data* data = nullptr; + float_type* candidate_length = nullptr; + float_type* candidate_value = nullptr; + float_type* refined_candidates = nullptr; + unsigned* candidate_sample = nullptr; + unsigned* cellvec_to_cand = nullptr; + unsigned* cell_to_cellvec = nullptr; + unsigned* vec_cgrps = nullptr; + unsigned* sequentializers = nullptr; + float_type* elements = nullptr; + float_type* ix; + float_type* iy; + float_type* iz; + float_type* ox; + float_type* oy; + float_type* oz; + float_type* scores; + + int dev = gpu_device::get(); + gpu_device::set(dev); + + { + gpu_stream stream; + stream.init(); // new cuda stream + + CU_CHECK(cudaMalloc(&data, sizeof(device_data))); + gpu_pointer data_ptr{data}; + + { + std::size_t vector_dimension = std::max(3 * cpers.max_input_cells, cpers.max_output_cells); + CU_CHECK(cudaMalloc(&sequentializers, vector_dimension * sizeof(unsigned))); + } + + gpu_pointer sequentializers_ptr{sequentializers}; + { // initialize sequentializers + std::size_t vector_dimension = 3 * cpers.max_input_cells; + CU_CHECK(cudaMemsetAsync(sequentializers, 0, vector_dimension * sizeof(unsigned), stream)); + } + + { + std::size_t vector_dimension = 10 * cpers.max_output_cells + 9 * cpers.max_input_cells + 3 * cpers.max_spots; + CU_CHECK(cudaMalloc(&elements, vector_dimension * sizeof(float_type))); + } + gpu_pointer element_ptr{elements}; + + { + std::size_t vector_dimension = 3 * cpers.max_input_cells; + CU_CHECK(cudaMalloc(&candidate_length, vector_dimension * sizeof(float_type))); + } + gpu_pointer candidate_length_ptr{candidate_length}; + + { + std::size_t vector_dimension = 3 * cpers.num_candidate_vectors * cpers.max_input_cells; + CU_CHECK(cudaMalloc(&candidate_value, vector_dimension * sizeof(float_type))); + } + gpu_pointer candidate_value_ptr{candidate_value}; + + { + static_assert(mem_txn_unit >= 3 * sizeof(float_type)); + std::size_t vector_dimension = constant::mem_txn_unit * 3 * cpers.num_candidate_vectors * cpers.max_input_cells; + CU_CHECK(cudaMalloc(&refined_candidates, vector_dimension * sizeof(float_type))); + } + gpu_pointer refined_candidates_ptr{refined_candidates}; + + { + std::size_t vector_dimension = 3 * cpers.num_candidate_vectors * cpers.max_input_cells; + CU_CHECK(cudaMalloc(&candidate_sample, vector_dimension * sizeof(unsigned))); + } + gpu_pointer candidate_sample_ptr{candidate_sample}; + + { + std::size_t vector_dimension = 3 * cpers.max_input_cells; + CU_CHECK(cudaMalloc(&cellvec_to_cand, vector_dimension * sizeof(unsigned))); + } + gpu_pointer v2c_ptr{cellvec_to_cand}; + + { + std::size_t vector_dimension = cpers.max_input_cells; + CU_CHECK(cudaMalloc(&cell_to_cellvec, vector_dimension * sizeof(unsigned))); + } + gpu_pointer c2v_ptr{cell_to_cellvec}; + + { + std::size_t vector_dimension = cpers.max_input_cells; + CU_CHECK(cudaMalloc(&vec_cgrps, vector_dimension * sizeof(unsigned))); + } + gpu_pointer vcgrp_ptr{vec_cgrps}; + + std::size_t dim = cpers.max_output_cells; + scores = elements; + + ox = elements + dim; + dim = 3 * cpers.max_output_cells; + oy = ox + dim; + oz = oy + dim; + + ix = oz + dim; + dim = 3 * cpers.max_input_cells + cpers.max_spots; + iy = ix + dim; + iz = iy + dim; + + { + std::lock_guard state_lock{gpu_state::state_update}; + gpu_state::ref(state_id) = gpu_state{std::move(data_ptr), std::move(element_ptr), + std::move(candidate_length_ptr), std::move(candidate_value_ptr), + std::move(refined_candidates_ptr), + std::move(candidate_sample_ptr), std::move(v2c_ptr), + std::move(c2v_ptr), std::move(vcgrp_ptr), + std::move(sequentializers_ptr), std::move(stream), + ix, iy, iz, + ox, oy, oz, + scores, dev, + cpers.max_input_cells}; + } + + LOG_START(logger::l_debug) { + logger::debug << stanza << "init id=" << state_id << " on " << dev << ", data=" << data << '\n' + << stanza << " cand len=" << candidate_length << ", val=" << candidate_value << ", smpl=" << candidate_sample << '\n' + << stanza << " vec2cand=" << cellvec_to_cand << ", cell2vec=" << cell_to_cellvec << ", vec_cgrp=" << vec_cgrps << '\n' + << stanza << " seq=" << sequentializers << ", elements=" << elements << ", score=" << scores << '\n' + << stanza << " refcand=" << refined_candidates << '\n' + << stanza << " ox=" << ox << ", oy=" << oy << ", oz=" << oz << '\n' + << stanza << " ix=" << ix << ", iy=" << iy << ", iz=" << iz << '\n'; + } LOG_END; + } + + { + const unsigned so = 3 * cpers.max_input_cells; // spot offset + device_data _data{cpers, fast_feedback::config_runtime{}, + fast_feedback::input{{ix, iy, iz}, {&ix[so], &iy[so], &iz[so]}, 0, 0, true, true}, + fast_feedback::output{ox, oy, oz, scores, 0}, + candidate_length, candidate_value, + refined_candidates, + candidate_sample, cellvec_to_cand, + cell_to_cellvec, vec_cgrps, + sequentializers}; + auto pin_data = memory_pin::on(_data); + CU_CHECK(cudaMemcpyAsync(data, &_data, sizeof(_data), cudaMemcpyHostToDevice, gpu_state::stream(state_id))); + } + } + + // Drop state if any + template + void drop (const indexer& instance) + { + using gpu_state = indexer_gpu_state; + + gpu_device::init(); + gpu_state::drop(instance.state); + } + + // Run indexer asynchronously + template + void index_start (const indexer& instance, const input& in, output& out, const config_runtime& conf_rt, + void(*host_callback)(void*), void* callback_data) + { + using gpu_state = indexer_gpu_state; + using clock = std::chrono::high_resolution_clock; + + gpu_device::check_init(); + auto state_id = instance.state; + auto& state = gpu_state::ref(state_id); + + gpu_device::set(state.device); + + bool timing = logger::level_active(); + if (timing) { + state.start_time = clock::now(); + state.start.init(); + state.end.init(); + } + + const bool crt_changed = (std::memcmp(&conf_rt, &state.last_crt, sizeof(conf_rt)) != 0); + const bool lth_changed = (state.last_crt.length_threshold != conf_rt.length_threshold); + + // Check input/output (*TODO*: merge this with check_config() for consistency) + const auto n_cells_in = std::min(in.n_cells, instance.cpers.max_input_cells); + const auto n_cells_out = out.n_cells; + if (n_cells_in <= 0u) + throw FF_EXCEPTION("no given input cells"); + if (n_cells_out <= 0) + throw FF_EXCEPTION("no output cells"); + if (in.n_spots <= 0u) + throw FF_EXCEPTION("no spots"); + if (conf_rt.num_halfsphere_points < instance.cpers.num_candidate_vectors) + throw FF_EXCEPTION("fewer halfsphere sample points than required candidate vectors"); + if ((conf_rt.num_angle_points > 0u) && (conf_rt.num_angle_points < instance.cpers.max_output_cells)) + throw FF_EXCEPTION("fewer angle sample points than required candidate cells"); + if (conf_rt.delta <= .0f) + throw FF_EXCEPTION("nonpositive delta value in runtime configuration"); + if (conf_rt.triml >= conf_rt.trimh) + throw FF_EXCEPTION("lower trim value bigger than higher trim value"); + if (conf_rt.triml < .0f) + throw FF_EXCEPTION("negative lower trim value"); + if ((conf_rt.min_spots != 0) && (conf_rt.min_spots < 4)) + throw FF_EXCEPTION("minimum number of spots to fit vectors against too low"); + if (n_cells_out > n_threads) + throw FF_EXCEPTION("fewer threads in a block than output cells"); + if (instance.cpers.max_output_cells < out.n_cells) + throw FF_EXCEPTION("more output cells requested than the configured maximum"); + + gpu_stream& stream = gpu_state::stream(state_id); + + LOG_START(logger::l_debug) { + logger::debug << stanza << "index on " << state.device << ", n_cells = " << n_cells_in << "(in:" << (in.new_cells?"new":"old") << ")/" + << n_cells_out << "(out), n_spots = " << in.n_spots << ':' << (in.new_spots?"new":"old") << '\n'; + } LOG_END; + + if (crt_changed) + gpu_state::copy_crt(state_id, conf_rt, stream); + + if (in.new_cells || lth_changed) { + // Calculate input vector candidate groups + std::fill(std::begin(state.candidate_length_h), std::end(state.candidate_length_h), float_type{}); // need to sort + state.n_cand_groups = calc_cand_groups(state.candidate_idx_h, state.candidate_length_h, in, conf_rt, n_cells_in); + state.n_vec_cgrps = calc_cell_cand(state.cell_candidate_h, state.vec_cgrps_h, state.candidate_idx_h, n_cells_in); + gpu_state::init_cand(state_id, state.n_cand_groups, state.n_vec_cgrps, instance.cpers, + state.candidate_length_h, state.candidate_idx_h, state.cell_candidate_h, state.vec_cgrps_h, stream); + + LOG_START(logger::l_debug) { + logger::debug << stanza << " candidate_idx ="; + for (const auto& e : state.candidate_idx_h) + logger::debug << ' ' << e; + logger::debug << ", n_cand_groups = " << state.n_cand_groups << '\n'; + logger::debug << stanza << "cell_candidates ="; + for (const auto& e : state.cell_candidate_h) + logger::debug << ' ' << e; + logger::debug << ", vec_cgrps ="; + for (unsigned i=0u; i + void check_config(const config_persistent* cpers, const config_runtime* crt) + { + if (cpers) { + if (cpers->max_input_cells <= 0u) + throw FF_EXCEPTION("max_input_cells <= 0"); + if (cpers->max_output_cells <= 0u) + throw FF_EXCEPTION("max_output_cells <= 0"); + if (cpers->max_output_cells > n_threads) + throw FF_EXCEPTION("fewer threads in a block than output cells"); + if (cpers->max_spots <= 0u) + throw FF_EXCEPTION("max_spots <= 0"); + if (cpers->num_candidate_vectors <= 0u) + throw FF_EXCEPTION("num_candidate_vectors <= 0"); + } + if (crt) { + if (crt->delta <= .0f) + throw FF_EXCEPTION("nonpositive delta value in runtime configuration"); + if (crt->triml >= crt->trimh) + throw FF_EXCEPTION("lower trim value bigger than higher trim value"); + if (crt->triml < .0f) + throw FF_EXCEPTION("negative lower trim value"); + if ((crt->min_spots != 0) && (crt->min_spots < 4)) + throw FF_EXCEPTION("minimum number of spots to fit vectors against too low"); + } + if (crt && cpers) { + if (crt->num_halfsphere_points < cpers->num_candidate_vectors) + throw FF_EXCEPTION("fewer halfsphere sample points than required candidate vectors"); + if ((crt->num_angle_points > 0u) && (crt->num_angle_points < cpers->max_output_cells)) + throw FF_EXCEPTION("fewer angle sample points than required candidate cells"); + } + } + + // Check compatibility between driver and runtime, + // throw an exception if incompatibility is detected + void runtime_check() + { + // check compatibility between reported driver and runtime versions + int driver=0, runtime=0; + CU_CHECK(cudaDriverGetVersion(&driver)); + CU_CHECK(cudaRuntimeGetVersion(&runtime)); + logger::debug << stanza << "CUDA version check: driver=" << driver << ", runtime=" << runtime << '\n'; + if (driver < runtime) + throw FF_EXCEPTION("CUDA driver version is older than the runtime version"); + + // call dummy compatibility test kernel that flips bit 0, with one CUDA thread + int* dummy, data=0; + CU_CHECK(cudaMalloc(&dummy, sizeof(int))); + gpu_pointer gpu_ptr(dummy); + CU_CHECK(cudaMemcpy(dummy, &data, sizeof(int), cudaMemcpyHostToDevice)); + gpu_ptx_compatibility_test<<<1,1>>>(dummy); + CU_CHECK(cudaMemcpy(&data, dummy, sizeof(int), cudaMemcpyDeviceToHost)); + if (data != 1) + throw FF_EXCEPTION("PTX compatibility test failed"); + } + + template void init (const indexer&); + template void drop (const indexer&); + template void index_start (const indexer&, const input&, output&, const config_runtime&, void(*)(void*), void*); + template void index_end (const indexer&, output&); + template void check_config (const config_persistent*, const config_runtime*); +} // namespace gpu + +extern "C" { + int _num_gpus() + { + int ngpus = 0; + if (cudaGetDeviceCount(&ngpus) != cudaSuccess) + return -1; + return ngpus; + } + + int _select_gpu(int gpu) + { + if (cudaSetDevice(gpu) != cudaSuccess) + return -1; + return 0; + } +} diff --git a/image_analysis/indexing/fast-feedback-indexer/log.cpp b/image_analysis/indexing/fast-feedback-indexer/log.cpp new file mode 100644 index 000000000..d151ea1dd --- /dev/null +++ b/image_analysis/indexing/fast-feedback-indexer/log.cpp @@ -0,0 +1,120 @@ +// Vendored from https://github.com/paulscherrerinstitute/fast-feedback-indexer, commit a94fd4f5c55289e70860feea358182d2072e02b5 +// (indexer/src/log.cpp), BSD-3-Clause - see LICENSE.md in this directory. +/* +Copyright 2022 Paul Scherrer Institute + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS +BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +------------------------ + +Author: hans-christian.stadler@psi.ch +*/ + +#define _INDEXER_LOG_IMPL_ + +#include +#include +#include "ffbidx/log.h" +#include "ffbidx/exception.h" + +namespace { + + #include "ffbidx/version.h" + + using namespace fast_feedback::logger; + + const std::map string_to_level = { + {"fatal", l_fatal}, + {"error", l_error}, + {"warn", l_warn}, + {"info", l_info}, + {"debug", l_debug} + }; + + // Protect log output + std::mutex logging_output_lock; + + constexpr char INDEXER_LOG_LEVEL[] = "INDEXER_LOG_LEVEL"; + + inline bool initialized = false; + +} // namespace + +namespace fast_feedback { + namespace logger { + + const char* get_version() + { + return version_string; + } + + unsigned get_init_log_level() + { + unsigned level = l_undef; + char* l_string = std::getenv(INDEXER_LOG_LEVEL); + if (l_string != nullptr) { + auto entry = string_to_level.find(l_string); + if (entry == string_to_level.end()) { + std::ostringstream oss; + for (const auto& e : string_to_level) + oss << e.first << ", "; + std::string levels_list = oss.str(); + levels_list.erase(levels_list.size() - 2); + throw FF_EXCEPTION_OBJ << "illegal value for " << INDEXER_LOG_LEVEL << ": " << l_string << " (should be in [" << levels_list << "])\n"; + } + level = entry->second; + } + if (!initialized && (level >= l_info) && (level <= l_debug)) { + initialized = true; + std::lock_guard logger_output_lock{lock()}; + std::clog << "(version) " << get_version() << '\n'; + } + return level; + } + + const char* level_to_string(unsigned log_level) + { + switch (log_level) { + case l_fatal: + return "fatal"; + case l_error: + return "error"; + case l_warn: + return "warn"; + case l_info: + return "info"; + case l_debug: + return "debug"; + } + + return "undef"; + } + + std::mutex& lock() noexcept + { + return logging_output_lock; + } + + logger fatal; + logger error; + logger warn; + logger info; + logger debug; + + } // namespace logger +} // namespace fast_feedback diff --git a/image_analysis/scale_merge/AnisotropyAnalysis.cpp b/image_analysis/scale_merge/AnisotropyAnalysis.cpp index 28f840900..94249e410 100644 --- a/image_analysis/scale_merge/AnisotropyAnalysis.cpp +++ b/image_analysis/scale_merge/AnisotropyAnalysis.cpp @@ -337,8 +337,23 @@ namespace { } } + // The hemisphere direction nearest to s, -1 for s = 0. + int NearestDirection(const gemmi::Vec3 &s, const std::vector &dirs) { + const double len = s.length(); + if (!(len > 0)) + return -1; + const gemmi::Vec3 unit(s.x / len, s.y / len, s.z / len); + int best = 0; + double best_dot = -1.0; + for (int j = 0; j < N_DIRECTIONS; ++j) { + const double dot = std::fabs(unit.dot(dirs[j])); + if (dot > best_dot) { best_dot = dot; best = j; } + } + return best; + } + Cells BuildCells(const std::vector &refl, const gemmi::UnitCell &cell, - const gemmi::SpaceGroup *sg, int n_shells) { + const gemmi::SpaceGroup *sg, int n_shells, size_t nthreads) { Cells c; c.n_shells = n_shells; const std::vector ops = sg ? sg->operations().sym_ops : std::vector{gemmi::Op::identity()}; @@ -353,26 +368,32 @@ namespace { std::vector raw_cell, raw_cluster; std::vector raw_value; + // The direction of each copy (-1 for the origin), on all threads; the cells are filled below in + // reflection order, as one loop would fill them. + const auto copy_s = [&](const Usable &r, const gemmi::Op &op) { + const gemmi::Op::Miller m = op.apply_to_hkl(r.hkl); + gemmi::Vec3 s = cell.frac.mat.left_multiply(gemmi::Vec3(m[0], m[1], m[2])); + if (s.z < 0) + s = gemmi::Vec3(-s.x, -s.y, -s.z); + return s; + }; + const size_t n_taken = (refl.size() + stride - 1) / stride; + std::vector direction(n_taken * ops.size()); + ParallelChunks(static_cast(n_taken), nthreads, [&](int lo, int hi) { + for (int t = lo; t < hi; ++t) + for (size_t o = 0; o < ops.size(); ++o) + direction[t * ops.size() + o] = NearestDirection(copy_s(refl[t * stride], ops[o]), dirs); + }); + std::vector> hits; // (cell, s) of this reflection's copies for (size_t i = 0; i < refl.size(); i += stride) { const auto &r = refl[i]; hits.clear(); - for (const auto &op : ops) { - const gemmi::Op::Miller m = op.apply_to_hkl(r.hkl); - gemmi::Vec3 s = cell.frac.mat.left_multiply(gemmi::Vec3(m[0], m[1], m[2])); - if (s.z < 0) - s = gemmi::Vec3(-s.x, -s.y, -s.z); - const double len = s.length(); - if (!(len > 0)) + for (size_t o = 0; o < ops.size(); ++o) { + const int best = direction[i / stride * ops.size() + o]; + if (best < 0) continue; - const gemmi::Vec3 unit(s.x / len, s.y / len, s.z / len); - int best = 0; - double best_dot = -1.0; - for (int j = 0; j < N_DIRECTIONS; ++j) { - const double dot = std::fabs(unit.dot(dirs[j])); - if (dot > best_dot) { best_dot = dot; best = j; } - } - hits.emplace_back(r.shell * N_DIRECTIONS + best, s); + hits.emplace_back(r.shell * N_DIRECTIONS + best, copy_s(r, ops[o])); } // A reflection contributes to a cell ONCE however many of its symmetry copies land there, so // a cell's standard error counts independent measurements. @@ -920,7 +941,7 @@ namespace { // de-duplicated: two observations of the same reflection recorded on different frames are two // measurements, and the difference between them is exactly the signal this arm is after. Cells BuildObservationCells(const std::vector &obs, const gemmi::UnitCell &cell, - const gemmi::SpaceGroup *sg, int n_shells) { + const gemmi::SpaceGroup *sg, int n_shells, size_t nthreads) { Cells c; c.n_shells = n_shells; const HKLKeyGenerator key(/*merge_friedel=*/true, sg ? *sg : *gemmi::find_spacegroup_by_number(1)); @@ -939,7 +960,8 @@ namespace { } if (order.empty()) return c; - std::sort(order.begin(), order.end()); + // The index makes the pairs a total order, so any sort leaves the same one. + ParallelSort(order.begin(), order.end(), nthreads, std::less<>()); int32_t n_clusters = 1; for (size_t i = 1; i < order.size(); ++i) if (order[i].first != order[i - 1].first) @@ -987,21 +1009,24 @@ namespace { raw_cell.reserve(kept.size()); raw_value.reserve(kept.size()); raw_cluster.reserve(kept.size()); - for (size_t i = 0; i < kept.size(); ++i) { - const auto &o = obs[kept[i]]; + const auto obs_s = [&](const AnisotropyObservation &o) { gemmi::Vec3 s = cell.frac.mat.left_multiply(gemmi::Vec3(o.h, o.k, o.l)); if (s.z < 0) s = gemmi::Vec3(-s.x, -s.y, -s.z); - const double len = s.length(); - if (!(len > 0)) + return s; + }; + // The directions on all threads, the sums below in observation order. + std::vector direction(kept.size()); + ParallelChunks(static_cast(kept.size()), nthreads, [&](int lo, int hi) { + for (int i = lo; i < hi; ++i) + direction[i] = NearestDirection(obs_s(obs[kept[i]]), dirs); + }); + for (size_t i = 0; i < kept.size(); ++i) { + const auto &o = obs[kept[i]]; + const int best = direction[i]; + if (best < 0) continue; - const gemmi::Vec3 unit(s.x / len, s.y / len, s.z / len); - int best = 0; - double best_dot = -1.0; - for (int j = 0; j < N_DIRECTIONS; ++j) { - const double dot = std::fabs(unit.dot(dirs[j])); - if (dot > best_dot) { best_dot = dot; best = j; } - } + const gemmi::Vec3 s = obs_s(o); const int cid = shell[i] * N_DIRECTIONS + best; sum[cid] += o.I; sumsq[cid] += static_cast(o.I) * o.I; @@ -1029,12 +1054,12 @@ namespace { SystematicFloor MeasureSystematicFloor(const std::vector &obs, const gemmi::UnitCell &cell, const gemmi::SpaceGroup *sg, const std::vector &full, - const std::vector &forbidden) { + const std::vector &forbidden, size_t nthreads) { SystematicFloor out; const int q = static_cast(forbidden.size()); if (q == 0 || obs.empty()) return out; - const Cells cells = BuildObservationCells(obs, cell, sg, N_SHELLS); + const Cells cells = BuildObservationCells(obs, cell, sg, N_SHELLS, nthreads); if (cells.mu.empty()) return out; const TensorFit fit = FitTensor(cells, full, true); @@ -1292,7 +1317,7 @@ AnisotropyResult AnalyzeAnisotropy(const std::vector &merged, if (refl.size() < static_cast(MIN_CELLS * MIN_CELL_REFLECTIONS)) return result; - const Cells cells = BuildCells(refl, cell, space_group, N_SHELLS); + const Cells cells = BuildCells(refl, cell, space_group, N_SHELLS, run.nthreads); const TensorFit constrained = FitTensor(cells, allowed, true); if (!constrained.ok) return result; @@ -1347,7 +1372,7 @@ AnisotropyResult AnalyzeAnisotropy(const std::vector &merged, result.shape_stable = true; for (int alt : {8, 16}) { const auto alt_refl = SelectReflections(merged, cell, space_group, alt); - const Cells alt_cells = BuildCells(alt_refl, cell, space_group, alt); + const Cells alt_cells = BuildCells(alt_refl, cell, space_group, alt, run.nthreads); const TensorFit alt_fit = FitTensor(alt_cells, allowed, false); if (!alt_fit.ok) { result.shape_stable = false; @@ -1404,7 +1429,7 @@ AnisotropyResult AnalyzeAnisotropy(const std::vector &merged, refuse("the systematic-error scale can only be measured on unmerged observations, and none were " "available for this merge"); } else { - const SystematicFloor sys = MeasureSystematicFloor(unmerged, cell, space_group, full, forbidden); + const SystematicFloor sys = MeasureSystematicFloor(unmerged, cell, space_group, full, forbidden, run.nthreads); result.n_observations = sys.n_observations; result.forbidden_z = sys.forbidden_z; if (!sys.ok) { @@ -1513,7 +1538,7 @@ gemmi::Mat33 AnisotropyPriorHKL(const std::vector &merged, con const auto refl = SelectReflections(merged, cell, space_group, N_SHELLS); if (refl.size() < static_cast(MIN_CELLS * MIN_CELL_REFLECTIONS)) return AnisotropyTensorHKL(result, cell); - const Eigen3 axes = Decompose(FitTensor(BuildCells(refl, cell, space_group, N_SHELLS), allowed, true).b); + const Eigen3 axes = Decompose(FitTensor(BuildCells(refl, cell, space_group, N_SHELLS, 1), allowed, true).b); for (int n = 0; n < 3; ++n) { result.eigenvalue[n] = axes.value[n]; for (int j = 0; j < 3; ++j) diff --git a/image_analysis/scale_merge/AnisotropyAnalysis.h b/image_analysis/scale_merge/AnisotropyAnalysis.h index a5bd8a18a..ca91ddb43 100644 --- a/image_analysis/scale_merge/AnisotropyAnalysis.h +++ b/image_analysis/scale_merge/AnisotropyAnalysis.h @@ -180,6 +180,8 @@ struct AnisotropyRunInfo { bool dose_term_in_scale_model = true; // The run's measured radiation damage (MergeStatistics::radiation_damage_delta_b), for the caution. double radiation_damage_relative_b = NAN; + // Workers for the cell assignment and the observation sort; the result is the same at any count. + size_t nthreads = 1; }; AnisotropyResult AnalyzeAnisotropy(const std::vector &merged, diff --git a/image_analysis/scale_merge/CMakeLists.txt b/image_analysis/scale_merge/CMakeLists.txt index 0fd093890..e3340bce4 100644 --- a/image_analysis/scale_merge/CMakeLists.txt +++ b/image_analysis/scale_merge/CMakeLists.txt @@ -29,6 +29,8 @@ ADD_LIBRARY(JFJochScaleMerge SphericalHarmonicSurface.h ReindexAmbiguity.cpp ReindexAmbiguity.h + ReferenceFreeReindex.cpp + ReferenceFreeReindex.h CrystalSetting.cpp CrystalSetting.h TranslationalNCS.cpp diff --git a/image_analysis/scale_merge/CellPopulation.cpp b/image_analysis/scale_merge/CellPopulation.cpp index 601708b4e..d4d7f7fe1 100644 --- a/image_analysis/scale_merge/CellPopulation.cpp +++ b/image_analysis/scale_merge/CellPopulation.cpp @@ -74,6 +74,15 @@ std::pair GivenCellPopulation(const std::vector &relativ if (smooth[i] <= 0 || (i > 0 && smooth[i - 1] > smooth[i]) || (i + 1 < nbins && smooth[i + 1] >= smooth[i])) continue; const int left = valley(i, -1), right = valley(i, +1); + // A population is its highest peak: a stray frame or two in its tail is a local maximum too, and + // with no valley of its own its range is the whole population - or, where the tail runs out + // before any valley, everything, two forms included. + bool highest = true; + for (int j = left < 0 ? 0 : left; j <= (right < 0 ? nbins - 1 : right); j++) + if (smooth[j] > smooth[i]) + highest = false; + if (!highest) + continue; const double low = left < 0 ? -everything : lo + (left + 0.5) * bin; const double high = right < 0 ? everything : lo + (right + 0.5) * bin; size_t count = 0; diff --git a/image_analysis/scale_merge/CentreOfSymmetry.cpp b/image_analysis/scale_merge/CentreOfSymmetry.cpp index 5a77ae794..a7faebf74 100644 --- a/image_analysis/scale_merge/CentreOfSymmetry.cpp +++ b/image_analysis/scale_merge/CentreOfSymmetry.cpp @@ -2,17 +2,25 @@ // SPDX-License-Identifier: GPL-3.0-only #include "CentreOfSymmetry.h" +#include "../../common/ParallelFor.h" #include #include #include #include -#include #include +#include namespace { using Hkl = std::array; + struct HklHash { + size_t operator()(const Hkl& h) const { + return std::hash{}((uint64_t(uint32_t(h[0])) << 42) ^ (uint64_t(uint32_t(h[1])) << 21) + ^ uint64_t(uint32_t(h[2]))); + } + }; + struct Refl { Hkl hkl; double I, sigma, d; @@ -76,15 +84,13 @@ namespace { // Uniform, exponential and normal deviates written out rather than taken from 's // distributions, whose output the standard leaves to the implementation: the decision this feeds - // must be the same on every platform. mt19937_64 itself is fully specified. - struct Deviates { - std::mt19937_64 engine{20261004}; - double Uniform() { return (static_cast(engine() >> 11) + 0.5) * 0x1.0p-53; } - double Exponential() { return -std::log(Uniform()); } - double Normal() { // Box-Muller, one of the pair - return std::sqrt(-2.0 * std::log(Uniform())) * std::cos(2.0 * 3.14159265358979323846 * Uniform()); - } - }; + // must be the same on every platform. mt19937_64 itself is fully specified. Each takes the + // generator's raw outputs, in the order it uses them. + double Uniform(uint64_t x) { return (static_cast(x >> 11) + 0.5) * 0x1.0p-53; } + double Exponential(uint64_t x) { return -std::log(Uniform(x)); } + double Normal(uint64_t x1, uint64_t x2) { // Box-Muller, one of the pair + return std::sqrt(-2.0 * std::log(Uniform(x1))) * std::cos(2.0 * 3.14159265358979323846 * Uniform(x2)); + } CentreStatistic Calibrated(double measured, double acentric, double centric) { return {measured, acentric, centric, @@ -95,7 +101,7 @@ namespace { // Following Howells, Phillips & Rogers (1950) Acta Cryst. 3, 210-214 (N(z)), and Padilla & Yeates // (2003) Acta Cryst. D59, 1124-1130 (the L-test, read here against its centric value 2/pi). CentreOfSymmetryResult AnalyzeCentreOfSymmetry(const std::vector& merged, - const gemmi::SpaceGroup& space_group) { + const gemmi::SpaceGroup& space_group, size_t nthreads) { CentreOfSymmetryResult out; const gemmi::GroupOps gops = space_group.operations(); @@ -114,7 +120,9 @@ CentreOfSymmetryResult AnalyzeCentreOfSymmetry(const std::vector folded; + // Hashed: the order the orbits come out in does not matter, the sort below puts them in one. + std::unordered_map folded; + folded.reserve(merged.size()); for (const auto& r : merged) { if (!std::isfinite(r.I) || !std::isfinite(r.sigma) || !(r.sigma > 0.0f) || !(r.d > 0.0f)) continue; @@ -157,7 +165,8 @@ CentreOfSymmetryResult AnalyzeCentreOfSymmetry(const std::vector general, control; - std::map general_index; + std::unordered_map general_index; + general_index.reserve(refl.size()); for (size_t i = 0; i < refl.size(); ++i) { const gemmi::Op::Miller hkl{{refl[i].hkl[0], refl[i].hkl[1], refl[i].hkl[2]}}; const gemmi::Op::Miller minus{{-hkl[0], -hkl[1], -hkl[2]}}; @@ -220,22 +229,32 @@ CentreOfSymmetryResult AnalyzeCentreOfSymmetry(const std::vector I_sim(refl.size()); + std::vector raw; for (int centric = 0; centric < 2; ++centric) for (int rep = 0; rep < SIMULATION_REPEATS; ++rep) { - for (size_t i = 0; i < refl.size(); ++i) { - double x; - if (centric) { - const double z = dev.Normal(); - x = z * z; - } else { - x = dev.Exponential(); + // A reflection takes 4 draws (centric: two normals) or 3 (acentric: an exponential and a + // normal), drawn here in reflection order and turned into intensities on all threads. + const size_t per = centric ? 4 : 3; + raw.resize(refl.size() * per); + for (auto& x : raw) + x = engine(); + ParallelChunks(static_cast(refl.size()), nthreads, [&](int lo, int hi) { + for (int i = lo; i < hi; ++i) { + const uint64_t* u = &raw[i * per]; + double x; + if (centric) { + const double z = Normal(u[0], u[1]); + x = z * z; + } else { + x = Exponential(u[0]); + } + I_sim[i] = mean_true[i] * x + Normal(u[per - 2], u[per - 1]) * sigma[i]; } - I_sim[i] = mean_true[i] * x + dev.Normal() * sigma[i]; - } + }); const Stats sg = ClassStats(I_sim, general), sc = ClassStats(I_sim, control); sim_g[centric].e2m1 += sg.e2m1 / SIMULATION_REPEATS; sim_g[centric].nz01 += sg.nz01 / SIMULATION_REPEATS; diff --git a/image_analysis/scale_merge/CentreOfSymmetry.h b/image_analysis/scale_merge/CentreOfSymmetry.h index 19c794248..29bceaa9c 100644 --- a/image_analysis/scale_merge/CentreOfSymmetry.h +++ b/image_analysis/scale_merge/CentreOfSymmetry.h @@ -51,4 +51,4 @@ struct CentreOfSymmetryResult { // `merged` is a merge in any group of the Laue class of `space_group` (P1 included); it is folded onto // that Laue class here. Reflections `space_group` extinguishes are left out. CentreOfSymmetryResult AnalyzeCentreOfSymmetry(const std::vector& merged, - const gemmi::SpaceGroup& space_group); + const gemmi::SpaceGroup& space_group, size_t nthreads = 1); diff --git a/image_analysis/scale_merge/ErrorModel.cpp b/image_analysis/scale_merge/ErrorModel.cpp index 77999d826..a129cc3cf 100644 --- a/image_analysis/scale_merge/ErrorModel.cpp +++ b/image_analysis/scale_merge/ErrorModel.cpp @@ -121,6 +121,7 @@ bool ErrorModelUpdate(const std::vector &bs2, const std::vector if (!(Ass > 0.0)) return false; a_new = std::clamp(Bs / Ass, 0.25, 100.0); b2_new = 0.0; + fit.b_resolved = false; } else { if (!(det > 1e-10 * Ass * AII)) return false; const double a_fit = (Bs * AII - BI * AsI) / det; @@ -130,13 +131,18 @@ bool ErrorModelUpdate(const std::vector &bs2, const std::vector // Leverage is not enough: b^2 can have it and still come out at zero within its own error, // and 1/b then reads the noise in b as an I/sigma. The standard error of b^2 comes from the // bins' own scatter about the fitted line; this only decides what is printed. + // Nor is a standard error enough when a sits on a bound: the b^2 reported beside a clamped a + // is not the solution of any fit. A bin whose median deviation lies far below the others' - + // observations that repeat their mates to the bit - takes the whole fit through its 1/bd2^2 + // weight and pulls both terms towards zero; a stops at its bound, b^2 does not, and 1/b of + // the remainder reads as an I/sigma in the thousands or millions. double chi = 0.0; for (int bin = 0; bin < n_bins; ++bin) { if (!(bd2[bin] > 0.0)) continue; const double r = (bd2[bin] - a_fit * bs2[bin] - b2_fit * bI2[bin]) / bd2[bin]; chi += r * r; } - fit.b_resolved = b2_fit >= 2.0 * std::sqrt(chi / (n_bins - 2) * Ass / det); + fit.b_resolved = a_new == a_fit && b2_fit >= 2.0 * std::sqrt(chi / (n_bins - 2) * Ass / det); } const bool settled = std::fabs(a_new - a) <= 1e-4 * a && std::fabs(b2_new - b2) <= 1e-4 * b2; a = a_new; diff --git a/image_analysis/scale_merge/ErrorModel.h b/image_analysis/scale_merge/ErrorModel.h index 34ceb4a4b..d6ee315ec 100644 --- a/image_analysis/scale_merge/ErrorModel.h +++ b/image_analysis/scale_merge/ErrorModel.h @@ -35,7 +35,8 @@ struct ErrorModelFit { bool active = false; // the pool was large enough to fit double a = 1.0, b2 = 0.0; bool b_measured = true; // false: no bin reached where b could be seen; b is held at 0 - bool b_resolved = true; // b^2 stood clear of two of its standard errors + bool b_resolved = true; // b^2 stood clear of two of its standard errors, with a inside its bounds + // and b measured; the only state in which 1/b is reported as ISa }; // Scratch: the partitioned copy of the pool (reused between calls to save the allocation), with the rank diff --git a/image_analysis/scale_merge/Merge.cpp b/image_analysis/scale_merge/Merge.cpp index 16bfa0fcd..f422a2cb6 100644 --- a/image_analysis/scale_merge/Merge.cpp +++ b/image_analysis/scale_merge/Merge.cpp @@ -62,7 +62,6 @@ MergeOnTheFly::MergeOnTheFly(const DiffractionExperiment &x) scaling_settings(x.GetScalingSettings()), indexing_settings(x.GetIndexingSettings()), high_resolution_limit(scaling_settings.GetHighResolutionLimit_A()), - low_resolution_limit(scaling_settings.GetLowResolutionLimit_A()), // A min-image-CC of 0 (the default) means "no limit": leave the optional // empty so the per-image CC cut is inactive. Otherwise a 0.0 threshold // would silently drop every image with a non-positive per-image CC. @@ -73,7 +72,8 @@ MergeOnTheFly::MergeOnTheFly(const DiffractionExperiment &x) capture_coeff(scaling_settings.GetCaptureUncertaintyCoeff()), generator(scaling_settings.GetMergeFriedel(), space_group), reject_outliers(scaling_settings.GetOutlierRejectNsigma() > 0.0), - reject_nsigma(scaling_settings.GetOutlierRejectNsigma()) { + reject_nsigma(scaling_settings.GetOutlierRejectNsigma()), + stills(!x.IsRotationIndexing()) { } MergeOnTheFly &MergeOnTheFly::ReferenceCell(const std::optional &cell) { @@ -89,7 +89,7 @@ size_t MergeOnTheFly::Contributions(const IntegrationOutcome &outcome, std::vect if (r.image_scale_corr <= 0.0 || !std::isfinite(r.image_scale_corr)) continue; - if (!AcceptReflection(r, high_resolution_limit, low_resolution_limit)) + if (!AcceptReflection(r, high_resolution_limit, std::nullopt)) continue; if (exclude_ice_rings && r.on_ice_ring) continue; @@ -245,6 +245,7 @@ void MergeOnTheFly::RefineErrorModel(const std::vector &outc error_model_a = 1.0; error_model_b = 0.0; error_model_chi2 = 0.0; + error_model_b_resolved = true; error_model_mean_I.clear(); reject_median_I.clear(); reject_up = 0.0; @@ -267,7 +268,7 @@ void MergeOnTheFly::RefineErrorModel(const std::vector &outc continue; if (r.image_scale_corr <= 0.0 || !std::isfinite(r.image_scale_corr)) continue; - if (!AcceptReflection(r, high_resolution_limit, low_resolution_limit)) + if (!AcceptReflection(r, high_resolution_limit, std::nullopt)) continue; if (exclude_ice_rings && r.on_ice_ring) continue; @@ -414,12 +415,34 @@ void MergeOnTheFly::RefineErrorModel(const std::vector &outc const double det = Ass * AII - AsI * AsI; if (!(det > 1e-10 * Ass * AII)) return; - const double a = std::clamp((Bs * AII - BI * AsI) / det, 0.25, 100.0); - const double b2 = std::max((Ass * BI - AsI * Bs) / det, 0.0); + const double a_fit = (Bs * AII - BI * AsI) / det; + const double b2_fit = (Ass * BI - AsI * Bs) / det; + const double a = std::clamp(a_fit, 0.25, 100.0); + const double b2 = std::max(b2_fit, 0.0); + // Whether 1/b can be reported as ISa, decided as the rotation fit decides it (ErrorModelUpdate): + // b^2 two of its standard errors clear of zero, the error from the bins' scatter about the line, + // and a inside its bounds - beside a clamped a the b^2 above is not the solution of any fit, and + // it is a near-zero-scatter bin that puts a on its bound (see the weight floor above). + double chi = 0.0; + for (int bin = 0; bin < n_bins; ++bin) { + if (!(bd2[bin] > 0.0)) continue; + const double r = (bd2[bin] - a_fit * bs2[bin] - b2_fit * bI2[bin]) / bd2[bin]; + chi += r * r; + } + error_model_b_resolved = a == a_fit && b2_fit >= 2.0 * std::sqrt(chi / (n_bins - 2) * Ass / det); error_model_a = a; error_model_b = std::sqrt(b2); error_model_active = true; + // A still's observations of one reflection spread by their partiality and per-crystal scale, not by a + // multiplicative factor about the median: many read near zero, so the spread of ln(I / median) is + // wide and the band drawn from it lets through even a powder grain or a neighbour's spot at hundreds + // of sigma. The error model's b is that spread measured as it is, so stills test the plain band of + // n sigma about the median. + if (stills) { + reject_up = reject_nsigma * error_model_b; + reject_down = reject_nsigma * error_model_b; + } // Achieved goodness of fit: the median of the per-observation dev2/(a*sigma^2 + (b*)^2). That // ratio is chi-square(1)-distributed (median 0.4549) when the sigmas are correct, so normalize by @@ -641,7 +664,9 @@ MergeStatistics MergeOnTheFly::MergeStats(const std::vector &m auto d_min_limit_A = d_min_override.has_value() ? d_min_override : scaling_settings.GetHighResolutionLimit_A(); - auto d_max_limit_A = scaling_settings.GetLowResolutionLimit_A(); + // The low-resolution limit bounds the scale fit, not the merge (ScalingSettings), so the statistics + // run to the coarsest reflection unless a range is declared. + std::optional d_max_limit_A; if (declared_range) { d_min_limit_A = declared_range->d_min; d_max_limit_A = std::isfinite(declared_range->d_max) @@ -841,6 +866,7 @@ MergeStatistics MergeOnTheFly::MergeStats(const std::vector &m MergeStatistics out; out.shells.resize(n_shells); + out.n_observations_rejected = reject_count; for (int s = 0; s < n_shells; ++s) { const auto &sa = acc[s]; diff --git a/image_analysis/scale_merge/Merge.h b/image_analysis/scale_merge/Merge.h index 6c8ca78a7..bea32cae1 100644 --- a/image_analysis/scale_merge/Merge.h +++ b/image_analysis/scale_merge/Merge.h @@ -288,7 +288,6 @@ class MergeOnTheFly { std::optional reference_cell; std::optional high_resolution_limit; - std::optional low_resolution_limit; std::optional image_cc_limit; // Apply image_cc_limit in Mask(). One flag for the whole engine, not a per-call argument, so the // merge, the error model and MergeStats can never disagree about which images are in. @@ -317,6 +316,7 @@ class MergeOnTheFly { double error_model_a = 1.0; double error_model_b = 0.0; double error_model_chi2 = 0.0; // achieved median reduced chi^2 (~1.0 = honestly calibrated sigmas) + bool error_model_b_resolved = true; // as ErrorModelFit::b_resolved; 1/b is reported as ISa only then // The (b*I)^2 term uses the reflection's *mean* intensity (constant over its // observations), so it inflates sigma without biasing the inverse-variance weights - // using the per-observation I_i instead would over-weight down-fluctuated points. @@ -334,9 +334,10 @@ class MergeOnTheFly { double reject_nsigma = 6.0; std::unordered_map reject_median_I; // The asymmetric band of OutlierBand.h: exp(+-n s) - 1 about the reflection mean, s the spread of - // ln(I / median) measured on this merge's observations. + // ln(I / median) measured on this merge's observations; on stills n b, the linear band. double reject_up = 0.0, reject_down = 0.0; size_t reject_count = 0; + bool stills = false; bool Mask(const IntegrationOutcome &outcome) const; @@ -366,6 +367,7 @@ public: [[nodiscard]] double ErrorModelA() const { return error_model_a; } [[nodiscard]] double ErrorModelB() const { return error_model_b; } [[nodiscard]] double ErrorModelChi2() const { return error_model_chi2; } + [[nodiscard]] bool ErrorModelBResolved() const { return error_model_b_resolved; } // Outlier rejection (driven by ScalingSettings::GetOutlierRejectNsigma) reports its count. [[nodiscard]] size_t RejectedCount() const { return reject_count; } diff --git a/image_analysis/scale_merge/ReferenceFreeReindex.cpp b/image_analysis/scale_merge/ReferenceFreeReindex.cpp new file mode 100644 index 000000000..f23cc3689 --- /dev/null +++ b/image_analysis/scale_merge/ReferenceFreeReindex.cpp @@ -0,0 +1,452 @@ +// SPDX-FileCopyrightText: 2026 Filip Leonarski, Paul Scherrer Institute +// SPDX-License-Identifier: GPL-3.0-only + +#include "ReferenceFreeReindex.h" + +#include +#include +#include +#include +#include +#include + +#include "HKLKey.h" +#include "ReindexAmbiguity.h" +#include "../../common/CrystalLattice.h" +#include "../../common/ParallelFor.h" + +namespace { + constexpr size_t MIN_REFLECTIONS = 20; + constexpr int RESOLUTION_BINS = 20; + constexpr int RESTARTS = 4; + constexpr int MAX_SWEEPS = 100; + constexpr double DECIDED_SIGMA = 3.0; + // Two fits closer than this (a 0.1% difference of one axis, squared) are the same fit. + constexpr double METRIC_TIE = 1e-6; + + double CellDistance(const UnitCell &u, const UnitCell &ref) { + const auto rel = [](double v, double r) { return (v - r) / r; }; + const auto ang = [](double v, double r) { return (v - r) * std::numbers::pi / 180.0; }; + return rel(u.a, ref.a) * rel(u.a, ref.a) + rel(u.b, ref.b) * rel(u.b, ref.b) + + rel(u.c, ref.c) * rel(u.c, ref.c) + ang(u.alpha, ref.alpha) * ang(u.alpha, ref.alpha) + + ang(u.beta, ref.beta) * ang(u.beta, ref.beta) + ang(u.gamma, ref.gamma) * ang(u.gamma, ref.gamma); + } + + double Median(std::vector v) { + if (v.empty()) + return NAN; + std::nth_element(v.begin(), v.begin() + v.size() / 2, v.end()); + return v[v.size() / 2]; + } +} + +MetricAnchors AnchorOnCells(const std::vector &outcomes, const UnitCell &cell, + const std::vector &ops) { + std::vector indexings{gemmi::Op::identity()}; + indexings.insert(indexings.end(), ops.begin(), ops.end()); + const size_t K = indexings.size(); + + // How much better an image's own refined cell fits the run's cell as indexed than after indexing g. + const auto cell_preference = [&](const IntegrationOutcome &o, size_t g) { + return CellDistance(ReindexLattice(o.latt, indexings[g]).GetUnitCell(), cell) + - CellDistance(o.latt.GetUnitCell(), cell); + }; + // Which indexings the cells decide: those the indexed images' cells prefer the identity over (a tie + // counting half) for at least METRIC_DECIDED of them. + MetricAnchors out; + std::vector decided(K, false); + for (size_t g = 1; g < K; ++g) { + double prefer = 0, n = 0; + for (const auto &o : outcomes) { + if (o.reflections.empty()) + continue; + const double p = cell_preference(o, g); + prefer += std::fabs(p) < METRIC_TIE ? 0.5 : p > 0 ? 1.0 : 0.0; + n += 1; + } + out.metric_preference.push_back(n > 0 ? prefer / n : 0.5); + decided[g] = out.metric_preference.back() >= METRIC_DECIDED; + } + // Where the cells decide an indexing, an image whose own cell prefers the identity stays as indexed. + out.allowed.assign(outcomes.size() * K, 1); + for (size_t o = 0; o < outcomes.size(); ++o) + for (size_t g = 1; g < K; ++g) + if (decided[g] && !outcomes[o].reflections.empty() && cell_preference(outcomes[o], g) >= METRIC_TIE) + out.allowed[o * K + g] = 0; + return out; +} + +ReferenceAnchorResult AnchorReferenceReindex(std::vector &outcomes, const UnitCell &cell, + const std::vector &ops) { + std::vector indexings{gemmi::Op::identity()}; + indexings.insert(indexings.end(), ops.begin(), ops.end()); + const size_t K = indexings.size(); + // The indexing best correlated with the reference among those open: the one as indexed unless another + // beats it; a score that is not finite never wins (the rule of the per-image resolver). + const auto best = [&](const std::vector &cc, const uint8_t *open) { + size_t b = 0; + for (size_t g = 1; g < K; ++g) + if (open[g] && std::isfinite(cc[g]) && (!std::isfinite(cc[b]) || cc[g] > cc[b])) + b = g; + return b; + }; + const std::vector all_open(K, 1); + + // Each image back in the indexing it was indexed in. + std::vector by_reference(outcomes.size(), 0); + for (size_t o = 0; o < outcomes.size(); ++o) { + auto &out = outcomes[o]; + if (out.reference_cc.size() != K) + continue; + by_reference[o] = best(out.reference_cc, all_open.data()); + if (by_reference[o] != 0) + ReindexImage(out.reflections, out.latt, indexings[by_reference[o]].inverse()); + } + + const MetricAnchors anchors = AnchorOnCells(outcomes, cell, ops); + ReferenceAnchorResult result; + result.metric_preference = anchors.metric_preference; + for (size_t o = 0; o < outcomes.size(); ++o) { + auto &out = outcomes[o]; + if (out.reference_cc.size() != K) + continue; + const size_t g = best(out.reference_cc, &anchors.allowed[o * K]); + result.overruled += g != by_reference[o]; + if (g != 0) + ReindexImage(out.reflections, out.latt, indexings[g]); + out.reference_cc.clear(); // the scores were for the indexing as indexed, which is no longer known + } + return result; +} + +ReferenceFreeReindexResult ResolveReindexReferenceFree(std::vector &outcomes, + const DiffractionExperiment &x, + const UnitCell &cell, + const std::vector &all_ops, + size_t nthreads, bool apply) { + ReferenceFreeReindexResult out; + out.choice.assign(outcomes.size(), -1); + + if (all_ops.empty()) + return out; + const auto &s = x.GetScalingSettings(); + const gemmi::SpaceGroup &sg = x.GetSpaceGroupOrP1(); + std::vector indexings{gemmi::Op::identity()}; + indexings.insert(indexings.end(), all_ops.begin(), all_ops.end()); + const int K = static_cast(indexings.size()); + + const MetricAnchors anchors = AnchorOnCells(outcomes, cell, all_ops); + out.metric_preference = anchors.metric_preference; + + const auto accept = [&](const Reflection &r) { + return !r.on_ice_ring && AcceptReflection(r, s.GetHighResolutionLimit_A(), s.GetLowResolutionLimit_A()) + && r.partiality >= s.GetMinPartiality() && r.partiality > 0.0f + && std::isfinite(r.I) && std::isfinite(r.sigma) && r.sigma > 0.0f; + }; + const auto corrected = [](const Reflection &r) { + return static_cast(r.I) * (r.prescaling_corr * r.qe_corr * r.flight_corr) / r.partiality; + }; + + // What each image has to offer: how many reflections, how fine, and how far its indices reach in + // any of the indexings (which sizes the index table below). + const int n_out = static_cast(outcomes.size()); + std::vector count(n_out, 0); + std::vector> reach(n_out, {0, 0, 0}); + std::vector s3_max(n_out, 0.0); + ParallelFor(n_out, nthreads, [&](int o) { + for (const auto &r : outcomes[o].reflections) { + if (!accept(r)) + continue; + ++count[o]; + s3_max[o] = std::max(s3_max[o], 1.0 / (static_cast(r.d) * r.d * r.d)); + for (const auto &op : indexings) { + const auto h = op.apply_to_hkl({{r.h, r.k, r.l}}); + for (int i = 0; i < 3; ++i) + reach[o][i] = std::max(reach[o][i], std::abs(h[i])); + } + } + }); + + // The crystals: images with enough reflections, in image order. + std::vector crystal_outcome; + std::vector begin{0}; + std::array bound{0, 0, 0}; + double s3_top = 0.0; + for (int o = 0; o < n_out; ++o) { + if (count[o] < MIN_REFLECTIONS) + continue; + crystal_outcome.push_back(o); + begin.push_back(begin.back() + count[o]); + for (int i = 0; i < 3; ++i) + bound[i] = std::max(bound[i], reach[o][i]); + s3_top = std::max(s3_top, s3_max[o]); + } + const int N = static_cast(crystal_outcome.size()); + if (N < 2) + return out; + + // The indexings each crystal may take (AnchorOnCells): a crystal its own cell anchors is one of those + // the others are decided against. + std::vector allowed(static_cast(N) * K); + std::vector free(N, false); + for (int c = 0; c < N; ++c) + for (int g = 0; g < K; ++g) { + allowed[c * K + g] = anchors.allowed[crystal_outcome[c] * K + g]; + free[c] = free[c] || (g > 0 && allowed[c * K + g]); + } + out.crystals = std::count(free.begin(), free.end(), true); + if (out.crystals == 0) + return out; + const size_t nnz = begin.back(); + + // The mean intensity in shells of equal reciprocal volume over the whole run, so that a crystal's + // intensities are compared after the fall-off with resolution, which every indexing shares, is out. + const auto bin_of = [&](const Reflection &r) { + const double s3 = 1.0 / (static_cast(r.d) * r.d * r.d); + return std::min(RESOLUTION_BINS - 1, static_cast(RESOLUTION_BINS * s3 / s3_top)); + }; + std::vector> bin_part(N); + ParallelFor(N, nthreads, [&](int c) { + auto &b = bin_part[c]; + b.fill(0.0); + for (const auto &r : outcomes[crystal_outcome[c]].reflections) + if (accept(r)) { + b[bin_of(r)] += corrected(r); + b[RESOLUTION_BINS + bin_of(r)] += 1.0; + } + }); + std::array bin_mean{}; + { + std::array total{}; + for (const auto &b : bin_part) // in crystal order: the same sum at any thread count + for (int i = 0; i < 2 * RESOLUTION_BINS; ++i) + total[i] += b[i]; + for (int i = 0; i < RESOLUTION_BINS; ++i) + bin_mean[i] = total[RESOLUTION_BINS + i] > 0 ? total[i] / total[RESOLUTION_BINS + i] : 1.0; + if (std::any_of(bin_mean.begin(), bin_mean.end(), [](double m) { return !(m > 0.0); })) + for (auto &m : bin_mean) + m = 1.0; // a shell with a non-positive mean: compare raw intensities instead + } + + // Every index any indexing can produce, mapped to a dense number of its reflection in the + // asymmetric unit (Friedel mates together: the anomalous difference would only add noise here). + const HKLKeyGenerator key_gen(/*merge_friedel=*/true, sg); + const int dh = 2 * bound[0] + 1, dk = 2 * bound[1] + 1, dl = 2 * bound[2] + 1; + const auto entry = [&](int h, int k, int l) { + return (static_cast(h + bound[0]) * dk + (k + bound[1])) * dl + (l + bound[2]); + }; + std::vector table_key(static_cast(dh) * dk * dl); + ParallelFor(dh, nthreads, [&](int ih) { + for (int k = -bound[1]; k <= bound[1]; ++k) + for (int l = -bound[2]; l <= bound[2]; ++l) + table_key[entry(ih - bound[0], k, l)] = key_gen(ih - bound[0], k, l).pack(); + }); + std::vector table(table_key.size()); + int32_t n_keys = 0; + { + std::unordered_map dense; + for (size_t i = 0; i < table_key.size(); ++i) { + const auto [it, inserted] = dense.try_emplace(table_key[i], n_keys); + n_keys += inserted; + table[i] = it->second; + } + } + table_key = {}; + + // Each crystal's intensities, divided by the shell mean and standardised within the crystal (the + // unknown scale and offset of an image drop out), and where each lands in every indexing. Each is + // weighted by how much of it is signal: a standardised intensity has unit variance, of which its + // measurement error takes (sigma / sd)^2, so a weak or barely recorded reflection counts for little. + std::vector z(nnz); + std::vector> key(K, std::vector(nnz)); + ParallelFor(N, nthreads, [&](int c) { + std::vector err; + size_t j = begin[c]; + double sum = 0, sum2 = 0; + for (const auto &r : outcomes[crystal_outcome[c]].reflections) { + if (!accept(r)) + continue; + const double v = corrected(r) / bin_mean[bin_of(r)]; + z[j] = static_cast(v); + err.push_back(r.sigma * (r.prescaling_corr * r.qe_corr * r.flight_corr) / r.partiality + / bin_mean[bin_of(r)]); + sum += v; + sum2 += v * v; + for (int g = 0; g < K; ++g) { + const auto h = indexings[g].apply_to_hkl({{r.h, r.k, r.l}}); + key[g][j] = table[entry(h[0], h[1], h[2])]; + } + ++j; + } + const double n = static_cast(begin[c + 1] - begin[c]); + const double mean = sum / n; + const double sd = std::sqrt(std::max(0.0, sum2 / n - mean * mean)); + for (size_t i = begin[c]; i < begin[c + 1]; ++i) { + const double e = err[i - begin[c]] / sd; + z[i] = sd > 0 ? static_cast((z[i] - mean) / sd / (1.0 + e * e)) : 0.0f; + } + }); + table = {}; + + // Following Brehm & Diederichs (2014) Acta Cryst. D70, 101-109: each crystal in turn takes the + // indexing in which it agrees best with all the others, until none changes. Agreement is the sum + // over all pairs of crystals of the products of their standardised intensities on common + // reflections, which is the dot product of a crystal with the sum of all the others - so a pass over + // the crystals costs one pass over the reflections, not one per pair of crystals. The sum of all + // pairs only ever grows, so it ends; a few starts are made and the one that ends highest is kept. + std::vector M(n_keys); + const auto add = [&](int c, int g, double sign) { + for (size_t i = begin[c]; i < begin[c + 1]; ++i) + M[key[g][i]] += sign * z[i]; + }; + const auto dot = [&](int c, int g) { + double d = 0; + for (size_t i = begin[c]; i < begin[c + 1]; ++i) + d += z[i] * M[key[g][i]]; + return d; + }; + std::vector best_choice; + double best_objective = -1.0; + for (int restart = 0; restart < RESTARTS; ++restart) { + std::vector choice(N, 0); + std::mt19937 rng(restart); + if (restart > 0) + for (int c = 0; c < N; ++c) { + const int g = static_cast(rng() % K); + choice[c] = allowed[c * K + g] ? g : 0; + } + std::fill(M.begin(), M.end(), 0.0); + for (int c = 0; c < N; ++c) + add(c, choice[c], 1.0); + int sweeps = 0; + // Run until a pass moves no more than one crystal in a thousand: what still moves then are crystals + // too weak to be decided either way. + for (int changed = N; changed > N / 1000 && sweeps < MAX_SWEEPS; ++sweeps) { + changed = 0; + for (int c = 0; c < N; ++c) { + add(c, choice[c], -1.0); + int best = choice[c]; + double best_dot = dot(c, best); + for (int g = 0; g < K; ++g) { + if (g == choice[c] || !allowed[c * K + g]) + continue; + const double d = dot(c, g); + if (d > best_dot) { + best_dot = d; + best = g; + } + } + changed += best != choice[c]; + choice[c] = best; + add(c, best, 1.0); + } + } + double objective = 0; + for (double m : M) + objective += m * m; + if (objective > best_objective) { + best_objective = objective; + best_choice = choice; + out.sweeps = sweeps; + } + } + + // How clearly each crystal is decided: its CC with the mean of all the other crystals, in the chosen + // indexing and in the best other one, and the difference of the two in sigma (Fisher's z; each CC + // on n reflections has an error of 1/sqrt(n - 3), and the two are nearly independent). + std::fill(M.begin(), M.end(), 0.0); + std::vector C(n_keys, 0.0); + for (int c = 0; c < N; ++c) + for (size_t i = begin[c]; i < begin[c + 1]; ++i) { + M[key[best_choice[c]][i]] += z[i]; + C[key[best_choice[c]][i]] += 1.0; + } + std::vector sigma(N, NAN), cc_chosen(N, NAN), cc_other(N, NAN); + ParallelFor(N, nthreads, [&](int c) { + std::vector cc(K, NAN); + std::vector n_used(K, 0.0); + for (int g = 0; g < K; ++g) { + double sx = 0, sy = 0, sxx = 0, syy = 0, sxy = 0, n = 0; + for (size_t i = begin[c]; i < begin[c + 1]; ++i) { + const int32_t k = key[g][i]; + const double own = g == best_choice[c] ? 1.0 : 0.0; + const double cnt = C[k] - own; + if (cnt <= 0) + continue; + const double xv = z[i], yv = (M[k] - own * z[i]) / cnt; + sx += xv; sy += yv; sxx += xv * xv; syy += yv * yv; sxy += xv * yv; n += 1; + } + const double vx = sxx - sx * sx / n, vy = syy - sy * sy / n; + if (n > 3 && vx > 0 && vy > 0) { + cc[g] = std::clamp((sxy - sx * sy / n) / std::sqrt(vx * vy), -0.999, 0.999); + n_used[g] = n; + } + } + const int g0 = best_choice[c]; + int other = -1; + for (int g = 0; g < K; ++g) + if (g != g0 && allowed[c * K + g] && std::isfinite(cc[g]) && (other < 0 || cc[g] > cc[other])) + other = g; + if (!std::isfinite(cc[g0]) || other < 0) + return; + cc_chosen[c] = cc[g0]; + cc_other[c] = cc[other]; + sigma[c] = (std::atanh(cc[g0]) - std::atanh(cc[other])) + * std::sqrt((std::min(n_used[g0], n_used[other]) - 3.0) / 2.0); + }); + std::vector sig, ccc, cco; + for (int c = 0; c < N; ++c) + if (free[c] && std::isfinite(sigma[c])) { + sig.push_back(sigma[c]); + ccc.push_back(cc_chosen[c]); + cco.push_back(cc_other[c]); + } + out.median_sigma = Median(sig); + out.cc_chosen = Median(ccc); + out.cc_other = Median(cco); + if (!sig.empty()) + out.decided_fraction = static_cast(std::count_if(sig.begin(), sig.end(), [](double v) { + return v > DECIDED_SIGMA; })) / static_cast(sig.size()); + + // Any consistent answer relabelled as a whole by one of the indexings is as consistent: take the + // one that leaves the most crystals where they are - unless the cells decide an indexing, in which + // case the crystals they anchor fix the whole. Two indexings are the same for the merge when they + // send a general reflection to the same reflection of the asymmetric unit. + const std::array general{2, 5, 11}; + const auto same = [&](const gemmi::Op::Miller &a, const gemmi::Op::Miller &b) { + return key_gen(a[0], a[1], a[2]) == key_gen(b[0], b[1], b[2]); + }; + const auto composed = [&](int global, int g) { // indexing g, then the overall relabel + return indexings[global].apply_to_hkl(indexings[g].apply_to_hkl(general)); + }; + int global = 0; + size_t global_kept = 0; + const bool anchored = std::any_of(out.metric_preference.begin(), out.metric_preference.end(), + [](double p) { return p >= METRIC_DECIDED; }); + for (int h = 0; h < (anchored ? 1 : K); ++h) { + size_t kept = 0; + for (int c = 0; c < N; ++c) + kept += same(composed(h, best_choice[c]), general); + if (kept > global_kept) { + global_kept = kept; + global = h; + } + } + for (int c = 0; c < N; ++c) { + int final_g = best_choice[c]; + for (int g = 0; g < K; ++g) + if (same(composed(global, best_choice[c]), indexings[g].apply_to_hkl(general))) { + final_g = g; + break; + } + out.choice[crystal_outcome[c]] = final_g; + if (final_g == 0) + continue; + ++out.reindexed; + if (apply) { + auto &o = outcomes[crystal_outcome[c]]; + ReindexImage(o.reflections, o.latt, indexings[final_g]); + } + } + return out; +} diff --git a/image_analysis/scale_merge/ReferenceFreeReindex.h b/image_analysis/scale_merge/ReferenceFreeReindex.h new file mode 100644 index 000000000..2527b1d54 --- /dev/null +++ b/image_analysis/scale_merge/ReferenceFreeReindex.h @@ -0,0 +1,77 @@ +// SPDX-FileCopyrightText: 2026 Filip Leonarski, Paul Scherrer Institute +// SPDX-License-Identifier: GPL-3.0-only + +#pragma once + +#include +#include +#include + +#include "gemmi/symmetry.hpp" + +#include "../../common/DiffractionExperiment.h" +#include "../IntegrationOutcome.h" + +// Serial stills with no reference: every crystal is indexed in one of the indexings its lattice allows +// (the identity and the twin-law operators of ReindexAmbiguityOperators), at random. Which one each +// crystal is in is decided from the data alone, by putting each crystal into the indexing in which it +// agrees best with all the others. The overall choice among the equivalent consistent answers is the +// one that moves the fewest crystals. +// +// An operator is only an ambiguity where the crystal's own lattice cannot tell the indexings apart. Where +// the cell is merely close to a more symmetric one (two axes a few per cent apart, say), the crystals' +// refined cells already say which axis is which, and the indexer has used that. For such an operator a +// crystal whose cell prefers the indexing it came in stays there, as an anchor, and only the others are +// decided by the intensities. +// An operator whose reindexed cell is the worse fit to the run's cell for at least this share of the +// crystals is one the cells decide. For a true (merohedral) ambiguity the two fits are equal and the +// share is a half. +constexpr double METRIC_DECIDED = 0.9; + +// Which indexings each image's own refined cell leaves open. Indexing g is the image as indexed for g = 0 +// and after ops[g - 1] otherwise; `cell` is the run's cell. An operator the cells decide is closed to +// every image whose cell fits `cell` better as indexed; everything else is open. +struct MetricAnchors { + std::vector metric_preference; // per operator: share of the images whose refined cell is + // closer to `cell` as indexed than after the operator + std::vector allowed; // allowed[o * (ops.size() + 1) + g]: indexing g open to image o +}; +MetricAnchors AnchorOnCells(const std::vector &outcomes, const UnitCell &cell, + const std::vector &ops); + +// With a reference - a reference MTZ or intensities from the model - each image has been put, image by +// image, into the indexing that correlates best with it (ReindexAmbiguityResolver, which leaves the scores in +// IntegrationOutcome::reference_cc, over the same `ops`). The reference knows nothing of the cells, so +// here the cells have their say first, as above: an image its own cell anchors keeps that indexing, +// and the reference decides among the indexings left open to the others. +struct ReferenceAnchorResult { + std::vector metric_preference; // as in MetricAnchors + size_t overruled = 0; // images the reference had put into an indexing their cell + // excludes, now in the best open one instead +}; +ReferenceAnchorResult AnchorReferenceReindex(std::vector &outcomes, const UnitCell &cell, + const std::vector &ops); + +struct ReferenceFreeReindexResult { + size_t crystals = 0; // crystals that took part (enough reflections to say anything, and an + // indexing their own cell leaves open) + size_t reindexed = 0; // of them, put into an indexing other than the one they came in + double median_sigma = NAN; // per crystal, how far its chosen indexing beats the best other one + // in agreement with the rest of the merge, in sigma; the median + double decided_fraction = NAN; // share of the crystals for which that margin is over 3 sigma + double cc_chosen = NAN; // median CC of a crystal with the merge of all the others, as chosen + double cc_other = NAN; // ... and in the best other indexing + std::vector metric_preference; // per operator: share of crystals whose refined cell is + // closer to `cell` as indexed than after the operator + int sweeps = 0; // passes over the crystals until (almost) none changed (the start kept) + std::vector choice; // per outcome: -1 did not take part, 0 kept, k reindexed by ops[k - 1] +}; + +// `cell` is the run's cell, `ops` its twin-law operators (identity excluded). With apply = false nothing is changed - the +// result then says how many crystals the data alone would put into another indexing than they are in, +// which, after a reference has resolved them, is the disagreement with the reference. +ReferenceFreeReindexResult ResolveReindexReferenceFree(std::vector &outcomes, + const DiffractionExperiment &x, + const UnitCell &cell, + const std::vector &ops, + size_t nthreads, bool apply); diff --git a/image_analysis/scale_merge/ReindexAmbiguity.cpp b/image_analysis/scale_merge/ReindexAmbiguity.cpp index 61783520c..42486ce0f 100644 --- a/image_analysis/scale_merge/ReindexAmbiguity.cpp +++ b/image_analysis/scale_merge/ReindexAmbiguity.cpp @@ -266,18 +266,23 @@ double ReindexAmbiguityResolver::ReferenceCC(std::span reflect // Serial stills index each crystal in one of the merohedrally-equivalent hands at random; pick, for this // image alone, the reindexing whose intensities correlate best with the external reference and apply it. -void ReindexAmbiguityResolver::Resolve(std::span reflections, CrystalLattice &latt) const { +std::vector ReindexAmbiguityResolver::Resolve(std::span reflections, CrystalLattice &latt) const { if (ops.empty()) - return; + return {}; - const BestReindex best = PickBestReindex( - ReferenceCC(reflections, gemmi::Op::identity()), ops, - [&](const gemmi::Op &op) { return ReferenceCC(reflections, op); }); - if (best.is_identity) - return; + std::vector cc{ReferenceCC(reflections, gemmi::Op::identity())}; + const BestReindex best = PickBestReindex(cc[0], ops, [&](const gemmi::Op &op) { + cc.push_back(ReferenceCC(reflections, op)); + return cc.back(); + }); + if (!best.is_identity) + ReindexImage(reflections, latt, best.op); + return cc; +} +void ReindexImage(std::span reflections, CrystalLattice &latt, const gemmi::Op &op) { for (auto &r : reflections) { - const gemmi::Op::Miller h = best.op.apply_to_hkl({{r.h, r.k, r.l}}); + const gemmi::Op::Miller h = op.apply_to_hkl({{r.h, r.k, r.l}}); r.h = h[0]; r.k = h[1]; r.l = h[2]; } // Everything after this - the sublattice relabel, the partiality post-refinement - predicts a spot @@ -285,5 +290,5 @@ void ReindexAmbiguityResolver::Resolve(std::span reflections, Crysta // axes, a frame relabelled by an operator that is only a near-symmetry of the lattice was put // through the sublattice relabel a second time, and its reflections came out at indices finer // than anything measured. - latt = ReindexLattice(latt, best.op); + latt = ReindexLattice(latt, op); } diff --git a/image_analysis/scale_merge/ReindexAmbiguity.h b/image_analysis/scale_merge/ReindexAmbiguity.h index 773011342..57346d18d 100644 --- a/image_analysis/scale_merge/ReindexAmbiguity.h +++ b/image_analysis/scale_merge/ReindexAmbiguity.h @@ -21,7 +21,8 @@ // Resolving the indexing ("alternative indexing" / reindexing) ambiguity: when the lattice symmetry // is higher than the crystal Laue symmetry (merohedral / pseudo-merohedral), a crystal can be validly // indexed in several ways related by reindexing operators. The right one is picked by agreement with a -// reference (reference-MTZ intensities or a model), so no reference-free ambigator (cosym) is needed. +// reference (reference-MTZ intensities or a model); serial stills without one are made consistent from +// the data alone (ReferenceFreeReindex.h). // // This is distinct from the screw-axis / enantiomorph ambiguity (P4_1 vs P4_3): that leaves the merged // intensities unchanged, so it is never resolved here — it is adopted from the reference/model. @@ -39,6 +40,10 @@ std::vector ReindexAmbiguityOperators(const UnitCell &cell, const gem // R^-1 times the old ones, so h' (a*, b*, c*)' is the same reciprocal vector as h (a*, b*, c*). CrystalLattice ReindexLattice(const CrystalLattice &latt, const gemmi::Op &op); +// One image put into another indexing: its reflections relabelled by `op` and its lattice moved onto the +// same axes, so that a spot's new index still predicts it where it was measured. +void ReindexImage(std::span reflections, CrystalLattice &latt, const gemmi::Op &op); + std::vector ReindexReflections(const std::vector &merged, const gemmi::Op &op); @@ -133,9 +138,11 @@ public: // The reference must be an external, correctly-handed dataset (not the data's own running merge). ReindexAmbiguityResolver(const DiffractionExperiment &x, const std::vector &reference); - // Reindex this image's reflections in place into the hand best-correlated with the reference (done - // once per image, for good). No-op when there is no ambiguity. + // Reindex this image's reflections in place into the hand best-correlated with the reference. No-op + // when there is no ambiguity. // Relabels the image's reflections and moves its lattice onto the same axes, so that a spot's new - // index still predicts it where it was measured. - void Resolve(std::span reflections, CrystalLattice &latt) const; + // index still predicts it where it was measured. Returns the CC in each indexing, as indexed first and + // then the operators of ReindexAmbiguityOperators(cell, space group) - empty when there are none - + // for AnchorReferenceReindex to revisit the choice once the whole run's cells are known. + std::vector Resolve(std::span reflections, CrystalLattice &latt) const; }; diff --git a/image_analysis/scale_merge/RotationScaleMerge.cpp b/image_analysis/scale_merge/RotationScaleMerge.cpp index 4761d0954..b1722648c 100644 --- a/image_analysis/scale_merge/RotationScaleMerge.cpp +++ b/image_analysis/scale_merge/RotationScaleMerge.cpp @@ -350,7 +350,7 @@ RotationScaleMerge::RotationScaleMerge(const DiffractionExperiment &experiment, const auto s = x.GetScalingSettings(); min_partiality = s.GetMinPartiality(); d_min_limit = s.GetHighResolutionLimit_A(); - d_max_limit = s.GetLowResolutionLimit_A(); + d_max_scale = s.GetLowResolutionLimit_A(); merge_friedel = s.GetMergeFriedel(); capture_uncertainty_coeff = s.GetCaptureUncertaintyCoeff(); min_captured_fraction = s.GetMinCapturedFraction(); @@ -408,23 +408,38 @@ RotationScaleMerge::RotationScaleMerge(const DiffractionExperiment &experiment, // the scaling and the sweep ledger to judge as they judge any other. Only from the ends inward: a frame // inside the sweep without beam is news, and is left to the ledger too. A frame with nothing integrated // on it (missing from disk, not processed) is walked past and not counted. -std::pair TrimBlankSweepEnds(std::vector &outcomes, size_t nthreads) { +namespace { constexpr double BLANK_TAIL_SIGMA = 3.0; +} + +SweepEndTally TallySweepEnd(const IntegrationOutcome &outcome) { + SweepEndTally t; + for (const auto &r : outcome.reflections) { + if (std::isfinite(r.I) && std::isfinite(r.sigma) && r.sigma > 0.0f) { + t.upper += r.I > BLANK_TAIL_SIGMA * r.sigma; + t.lower += r.I < -BLANK_TAIL_SIGMA * r.sigma; + } + if (std::isfinite(r.bkg)) { t.bkg_sum += r.bkg; ++t.bkg_n; } + } + return t; +} + +std::pair TrimBlankSweepEnds(std::vector &outcomes, size_t nthreads) { + std::vector tally(outcomes.size()); + ParallelFor(static_cast(outcomes.size()), nthreads, [&](int f) { tally[f] = TallySweepEnd(outcomes[f]); }); + return TrimBlankSweepEnds(outcomes, tally); +} + +std::pair TrimBlankSweepEnds(std::vector &outcomes, + const std::vector &tally) { const int n = static_cast(outcomes.size()); std::vector upper(n, 0), lower(n, 0); std::vector bkg(n, 0.0); - ParallelFor(n, nthreads, [&](int f) { - double bkg_sum = 0.0; - int64_t bkg_n = 0; - for (const auto &r : outcomes[f].reflections) { - if (std::isfinite(r.I) && std::isfinite(r.sigma) && r.sigma > 0.0f) { - upper[f] += r.I > BLANK_TAIL_SIGMA * r.sigma; - lower[f] += r.I < -BLANK_TAIL_SIGMA * r.sigma; - } - if (std::isfinite(r.bkg)) { bkg_sum += r.bkg; ++bkg_n; } - } - if (bkg_n > 0) bkg[f] = bkg_sum / bkg_n; - }); + for (int f = 0; f < n; ++f) { + upper[f] = tally[f].upper; + lower[f] = tally[f].lower; + if (tally[f].bkg_n > 0) bkg[f] = tally[f].bkg_sum / tally[f].bkg_n; + } std::vector excess, tails, background; for (int f = 0; f < n; ++f) if (!outcomes[f].reflections.empty()) { @@ -606,7 +621,7 @@ void RotationScaleMerge::IngestHost() { // genuinely share (h,k,l) and image_number: the predictor emits both intersections of a // reflection's rotation circle with the Ewald sphere, and near the blind region the two are close // enough in angle that both land on the same frame. Without a final key their relative order was - // whatever the sort happened to produce, and the combine reads it - it takes on_ice from the first + // whatever the sort happened to produce, and the combine reads it - it takes unscaled from the first // member of an event, and its per-event sums are floating point. Ordering them by arrival makes // the result independent of the sort algorithm, which is what lets the order be reproduced by a // faster one. @@ -733,8 +748,9 @@ void RotationScaleMerge::IngestHost() { #ifdef JFJOCH_USE_CUDA // The resident path's ingest. The reflections go to the card frame by frame, and the card measures the // per-frame background, sorts, cuts the raw-hkl runs and drops what the resolution range excludes -// (RotationScaleMergeGPU::IngestUpload .. IngestSort); once the scaling is known to fit, they go to the -// card a second time for the observations the cut kept (IngestObservations) - the observations, the runs +// (RotationScaleMergeGPU::IngestUpload .. IngestSort); once the scaling is known to fit, the observations +// the cut kept are taken from them on the card, or from a second upload where the first could not stay +// (IngestObservations) - the observations, the runs // and the order of each that BuildInRangeObservations lays down on the host, to the bit, and left where // the device pipeline reads them. The geometry smoothing then runs here on what the card hands back. void RotationScaleMerge::IngestOnDevice() { @@ -755,7 +771,7 @@ void RotationScaleMerge::IngestOnDevice() { std::vector mean_bkg(n_frames); gpu_->IngestMeanBackground(mean_bkg.data()); MeasureIncidentFlux(mean_bkg); - const int n = gpu_->IngestSort(d_min_limit, d_max_limit); + const int n = gpu_->IngestSort(d_min_limit, std::nullopt); n_partials_obs = n; RotationScaleMergeGPU::IngestLayout layout; gpu_->IngestGetLayout(layout); @@ -775,11 +791,16 @@ void RotationScaleMerge::IngestOnDevice() { // ends before a single observation is on it. if (ScaleOnCPUWhereTooLarge()) return; + std::unique_ptr sub_mark; + auto sub = [&](const char *n) { sub_mark.reset(); sub_mark = std::make_unique(*logger, std::string("rsm/i ") + n); }; + sub("observations"); auto pos = std::make_shared(); pos->px.resize(n); pos->py.resize(n); - gpu_->IngestObservations(refl.data(), count.data(), nthreads, frame_flux.data(), pos->px.data(), pos->py.data()); + gpu_->IngestObservations(refl.data(), count.data(), nthreads, frame_flux.data(), + d_max_scale ? static_cast(*d_max_scale) : INFINITY, pos->px.data(), pos->py.data()); obs_position = std::move(pos); + sub("geometry"); const SmoothedGeometry sg = SmoothedFrameGeometry(); int64_t n_resolved = 0; if (sg.half > 0) { @@ -813,6 +834,7 @@ void RotationScaleMerge::IngestOnDevice() { // SmoothMosaicityAndPartiality on the card: the events relaid, the mosaicity smoothed here, the // partiality recomputed from it. RockingEventFrames reads the corr as integrated, so it is taken // before the recompute moves it. + sub("partiality"); const auto gon = x.GetGoniometer(); if (const double increment_deg = gon ? gon->GetIncrement_deg() : 0.0; std::fabs(increment_deg) > 0.0) { int64_t n_events = 0, n_relaid = 0; @@ -997,7 +1019,7 @@ void RotationScaleMerge::IngestDevice(const RotationScaleMerge *observations_fro fbuf[3][i] = o.partiality; fbuf[4][i] = r.zeta; fbuf[5][i] = o.corr; fbuf[6][i] = r.bkg; fbuf[7][i] = r.var_bkg; fbuf[8][i] = r.image_number; fbuf[9][i] = r.d; - flags[i] = static_cast((r.on_ice_ring ? 1 : 0) | (ClippedFlags(r) << 1)); // SetObsFlags + flags[i] = static_cast(Unscaled(r) | (ClippedFlags(r) << 1)); // SetObsFlags } }); constexpr F fields[NFLOAT] = {F::I, F::Sigma, F::PrescalingCorr, F::Partiality, @@ -1042,7 +1064,7 @@ void RotationScaleMerge::IngestDevice(const RotationScaleMerge *observations_fro void RotationScaleMerge::BuildInRangeObservations(std::unique_ptr &keys, int n_obs, const SmoothedGeometry &sg) { const int n_run = static_cast(rawrun_start.size()); - const bool limited = d_min_limit.has_value() || d_max_limit.has_value(); + const bool limited = d_min_limit.has_value(); std::vector keep_run(n_run, 1); // Filled once, with the value the branch below actually wants: a resolution-limited run used to @@ -1053,7 +1075,7 @@ void RotationScaleMerge::BuildInRangeObservations(std::unique_ptr &ke for (int r = lo; r < hi; ++r) { const float d = rawrun_d[r]; const bool in_range = std::isfinite(d) && d > 0.0f - && !(d_min_limit && d < *d_min_limit) && !(d_max_limit && d > *d_max_limit); + && !(d_min_limit && d < *d_min_limit); keep_run[r] = in_range ? 1 : 0; if (!in_range) continue; const int p0 = rawrun_start[r], p1 = p0 + rawrun_count[r]; @@ -1555,7 +1577,6 @@ int RotationScaleMerge::ComputeAsuGroups(const HKLKeyGenerator &keygen) { const float d = rawrun_d[r]; // resolution is a per-raw-hkl property (all its partials share d) if (!std::isfinite(d) || d <= 0.0f) continue; if (d_min_limit && d < *d_min_limit) continue; - if (d_max_limit && d > *d_max_limit) continue; key[r] = keygen(rawrun_h[r], rawrun_k[r], rawrun_l[r]).pack(); eligible[r] = 1; } @@ -3208,19 +3229,27 @@ void RotationScaleMerge::MeasureBatchDeltaCCHalf(int n_groups) { std::vector d; std::vector touched; }; - const int n_workers = static_cast(std::clamp(nthreads, 1, 8)); + // A worker's scratch is as long as the merge, so it is made on first use, by the worker: the + // workers a measurement does not need cost nothing, and the ones it does zero theirs side by side. + const int n_workers = static_cast(std::clamp(std::min(nthreads, n_batch), 1, 16)); std::vector scratch(n_workers); - for (auto &sc : scratch) - sc.d.assign(n_groups, Sums{}); + auto scratch_of = [&](int t) -> RangeScratch & { + if (scratch[t].d.empty()) scratch[t].d.assign(n_groups, Sums{}); + return scratch[t]; + }; + // Each worker takes a range of the reflections and walks every observation for them, so a + // reflection's sums are added in observation order whatever the split: the one serial sum. auto build_totals = [&]() { - std::fill(tot.begin(), tot.end(), Sums{}); - for (int i = 0; i < n_full; ++i) { - const int g = obs_group[i]; - if (g < 0 || frame_rejected[obs_frame[i]]) continue; - Sums &t = tot[g]; - t.n += 1; t.s1 += obs_I[i]; t.s2 += obs_I[i] * obs_I[i]; - t.w += obs_info[i]; - } + ParallelChunks(n_groups, nthreads, [&](int g0, int g1) { + std::fill(tot.begin() + g0, tot.begin() + g1, Sums{}); + for (int i = 0; i < n_full; ++i) { + const int g = obs_group[i]; + if (g < g0 || g >= g1 || frame_rejected[obs_frame[i]]) continue; + Sums &t = tot[g]; + t.n += 1; t.s1 += obs_I[i]; t.s2 += obs_I[i] * obs_I[i]; + t.w += obs_info[i]; + } + }); }; // delta-CC1/2 of the frames [f0, f1]. delta_cc is the difference in CC units, which is what a user @@ -3283,9 +3312,10 @@ void RotationScaleMerge::MeasureBatchDeltaCCHalf(int n_groups) { return r; }; auto measure = [&](int f0, int f1) { - accumulate(scratch[0], f0, f1); - const RangeDelta r = evaluate(scratch[0]); - clear(scratch[0]); + RangeScratch &sc = scratch_of(0); + accumulate(sc, f0, f1); + const RangeDelta r = evaluate(sc); + clear(sc); return r; }; // Every range in `ranges`, side by side. Ranges that start on the same frame are one chain, measured @@ -3305,7 +3335,7 @@ void RotationScaleMerge::MeasureBatchDeltaCCHalf(int n_groups) { std::vector out(ranges.size()); std::atomic next_chain{0}; parallel_detail::RunTasks(std::min(n_workers, n_chain), [&](int t) { - RangeScratch &sc = scratch[t]; + RangeScratch &sc = scratch_of(t); for (int c = next_chain++; c < n_chain; c = next_chain++) { int added_to = ranges[sorted[chain_start[c]]].first - 1; for (size_t k = chain_start[c]; k < chain_start[c + 1]; ++k) { @@ -3978,11 +4008,11 @@ void RotationScaleMerge::ApplyCellSurface(const std::vector &cell, int const SphericalHarmonicBasis *sh_basis) { // An observation on an ice ring is excluded from scaling, as the run's log says: its background is // the ring's, uneven round the azimuth, so it would teach a surface the ring rather than the - // detector. The `Is > 0` filter the fit once had hid this omission by dropping the over-subtracted + // detector. So is one coarser than the scale fit's low-resolution limit (Unscaled). The `Is > 0` filter the fit once had hid this omission by dropping the over-subtracted // half of those observations. auto usable = [&](const Obs &o) { return o.group >= 0 && o.corr > 0.0f && std::isfinite(o.corr) && o.partiality >= min_partiality - && !o.on_ice; + && !o.unscaled; }; // The observations any of the passes below can use, in fulls order, with the four fields those // passes read copied out beside them. Around twenty passes follow, and each one used to reach back @@ -4713,7 +4743,7 @@ void RotationScaleMerge::Combine() { float peak_frame = partials[ev[i]].r->image_number; float peak_px = partials[ev[i]].r->predicted_x, peak_py = partials[ev[i]].r->predicted_y; float peak_partiality = -1.0f; - const bool on_ice = partials[ev[i]].r->on_ice_ring; + const uint8_t unscaled = Unscaled(*partials[ev[i]].r); uint8_t flags = 0; for (size_t m = i; m < kk; ++m) flags |= ClippedFlags(*partials[ev[m]].r); // A saturated pixel anywhere in the rocking curve means its brightest part was not measured: @@ -4797,7 +4827,7 @@ void RotationScaleMerge::Combine() { full.image_number = peak_frame; full.px = peak_px; full.py = peak_py; full.frame = peak_outcome; - full.on_ice = on_ice ? 1 : 0; + full.unscaled = unscaled; full.clipped = clipped ? 1 : 0; full.group = group; // the raw hkl's ASU group for the current space group (<0 = absent) out.push_back(full); @@ -4933,7 +4963,7 @@ void RotationScaleMerge::ComputePerFrameCC(const std::vector &partial_gr const PartialObs &o = partials[i]; const Reflection &r = *o.r; const int g = partial_group[i]; - if (r.on_ice_ring) continue; + if (Unscaled(r)) continue; if (g < 0) continue; if (o.partiality < min_partiality) continue; if (!std::isfinite(r.I) || !std::isfinite(o.corr) || o.corr <= 0.0f) continue; @@ -5028,7 +5058,7 @@ RotationScaleMerge::Result RotationScaleMerge::MergeAndStats(int n_groups, bool // A full is usable for the merge / error model if it passes AddImage's filters (with the current // ice context). auto usable_merge = [&](const Obs &o) { - return UsableFull(o) && !(for_search && o.on_ice); + return UsableFull(o) && !(for_search && o.unscaled); }; // The em-stats / samples / merge-accumulate / R_meas reductions run on the resident, scaled fulls @@ -5731,7 +5761,7 @@ RotationScaleMerge::Result RotationScaleMerge::MergeAndStats(int n_groups, bool // MergeOnTheFly does on the stills path): the intensity is still merged and written, // the flag only lets a consumer that must not read ring signal as crystal signal - // the CC1/2 resolution-cutoff fit - leave it out. - if (o.on_ice) a.on_ice = true; + if (o.unscaled & UNSCALED_ICE) a.on_ice = true; if (!std::isfinite(a.d) && std::isfinite(o.d) && o.d > 0.0f) a.d = o.d; } } @@ -6551,8 +6581,7 @@ RotationScaleMerge::Result RotationScaleMerge::MergeAndStats(int n_groups, bool // infinite d_max - when no limit was declared. Reflections the beam stop, a mask or the limit ate // then count as missing. The high end stays the finest d reached. See MergeStats in Merge.cpp. const float d_min_pad = sd_min * 0.999f; - const float d_max_declared = d_max_limit ? static_cast(*d_max_limit) - : std::numeric_limits::infinity(); + const float d_max_declared = std::numeric_limits::infinity(); // The innermost shell is labelled by the bound it reaches, except when that bound is infinite // and the coarsest reflection measured is the only finite thing to say. const float d_max_label = std::isfinite(d_max_declared) ? d_max_declared : sd_max; @@ -6605,7 +6634,7 @@ RotationScaleMerge::Result RotationScaleMerge::MergeAndStats(int n_groups, bool pool.push_back(s); error_model_active = false; // a pool too small to fit leaves no model, not the run's own fit_error_model(pool); - if (error_model_active) + if (error_model_active && error_model_b_resolved) result.reference_isa = ToXdsErrorModel(error_model_a, error_model_b).isa; } @@ -6798,7 +6827,7 @@ RotationScaleMerge::Result RotationScaleMerge::RunArm(bool scale_partials, bool frame_scaled_scratch.assign(n_frames, 1); partial_loop.converged = true; } else if (!scaled_on_gpu) { - const PartialLoopKey key{Group().xhm(), merge_friedel, d_min_limit, d_max_limit, + const PartialLoopKey key{Group().xhm(), merge_friedel, d_min_limit, d_max_scale, min_partiality, smooth_window, scaling_iter}; const auto memo = std::find_if(partial_loop_memos.begin(), partial_loop_memos.end(), [&](const PartialLoopMemo &m) { return m.key == key; }); @@ -6872,7 +6901,7 @@ RotationScaleMerge::Result RotationScaleMerge::RunArm(bool scale_partials, bool // model needs zeta > 0. auto fitted_obs = [&](int i) { const PartialObs &o = partials[i]; - return partial_group[i] >= 0 && !o.r->on_ice_ring && o.partiality >= min_partiality + return partial_group[i] >= 0 && !Unscaled(*o.r) && o.partiality >= min_partiality && std::isfinite(o.r->zeta) && o.r->zeta > 0.0f; }; const int n_fit_frames = static_cast(frame_start.size()); @@ -7171,7 +7200,7 @@ RotationScaleMerge::Result RotationScaleMerge::RunArm(bool scale_partials, bool FullsStaging &st = fulls_staging; st.Resize(nf); gpu_->GetFulls(st.run.data(), st.I.data(), st.sigma.data(), st.d.data(), - st.image_number.data(), st.frame.data(), st.on_ice.data(), st.clipped.data(), + st.image_number.data(), st.frame.data(), st.unscaled.data(), st.clipped.data(), st.group.data()); gpu_->GetFullsPeak(st.peak.data()); const ObsPosition &pos = *obs_position; @@ -7188,7 +7217,7 @@ RotationScaleMerge::Result RotationScaleMerge::RunArm(bool scale_partials, bool o.corr = scaled_fulls_on_gpu ? st.corr[i] : 1.0f; o.image_number = st.image_number[i]; o.frame = st.frame[i]; o.px = pos.px[st.peak[i]]; o.py = pos.py[st.peak[i]]; - o.on_ice = st.on_ice[i]; o.clipped = st.clipped[i]; o.group = st.group[i]; + o.unscaled = st.unscaled[i]; o.clipped = st.clipped[i]; o.group = st.group[i]; // A full has no rocking geometry of its own and carries no background; the combine on // the device does not produce these, and a reused buffer would keep the last chain's. o.zeta = 0.0f; o.delta_phi = 0.0f; o.bkg = 0.0f; @@ -7244,7 +7273,7 @@ RotationScaleMerge::Result RotationScaleMerge::RunArm(bool scale_partials, bool // The partials' filters for the Unity model, which needs no zeta, and whose coefficient is the // mean itself: the partiality is folded into the full, and prescaling_corr is 1. auto fitted_full = [&](const Obs &o) { - return o.group >= 0 && !o.on_ice && o.partiality >= min_partiality; + return o.group >= 0 && !o.unscaled && o.partiality >= min_partiality; }; std::vector fit_start(n_frames + 1, 0); ParallelFor(n_frames, nthreads, [&](int f) { diff --git a/image_analysis/scale_merge/RotationScaleMerge.h b/image_analysis/scale_merge/RotationScaleMerge.h index 4ef64c4fb..6291bdf1e 100644 --- a/image_analysis/scale_merge/RotationScaleMerge.h +++ b/image_analysis/scale_merge/RotationScaleMerge.h @@ -67,7 +67,17 @@ template using FillVector = std::vector>; // Stills use the per-image ScaleOnTheFly (fixed partiality) instead. // // Before any of it: TrimBlankSweepEnds clears the reflections of the frames at either end of the sweep -// that the beam never reached, and returns how many it cleared at the start and at the end. +// that the beam never reached, and returns how many it cleared at the start and at the end. It decides +// on each frame's SweepEndTally, one walk over the frame's reflections in their order; a caller walking +// them anyway for something else hands the tallies over, the other form makes them on all threads. +struct SweepEndTally { + int64_t upper = 0, lower = 0; // reflections standing above / below zero by more than the tail sigma + double bkg_sum = 0.0; + int64_t bkg_n = 0; +}; +SweepEndTally TallySweepEnd(const IntegrationOutcome &outcome); +std::pair TrimBlankSweepEnds(std::vector &outcomes, + const std::vector &tally); std::pair TrimBlankSweepEnds(std::vector &outcomes, size_t nthreads); class RotationScaleMerge { @@ -248,6 +258,10 @@ public: // The copy does not write its per-frame scales back (WriteBackPerFrameScale does). [[nodiscard]] std::unique_ptr CloneIngest(int device, Logger &log) const; + // The per-frame scale choice the first merge that is not a search makes (see Run), from a copy that made + // that merge in this engine's place: the merges after it keep it, as they would on this engine. + void TakeScalePartialsChoice(const RotationScaleMerge &from) { scale_partials_choice = from.scale_partials_choice; } + // The card memory an engine may hold during a merge, the device helpers its merge calls included: // what a caller goes by when it decides whether a second engine fits beside one already on the // card. Call after IngestHost(). It counts what the ingest knows - the observations, the rocking @@ -338,7 +352,7 @@ private: float px, py; // predicted detector position (for the absorption surface; CPU path only) float image_number; // fractional frame position (for 3D-combine contiguity) int32_t frame; // index of the outcome whose per-frame scale G applies to this obs - uint8_t on_ice; + uint8_t unscaled; // UNSCALED_ICE | UNSCALED_LOW_RES: kept out of the scale fit, still merged uint8_t clipped; // OBS_CLIPPED | OBS_OVERLOADED (Reflection::clipped / ::overloaded); a full // is clipped if any of its partials is, and an overloaded event is no full float corr; // image_scale_corr (working; updated by scaling) @@ -362,6 +376,14 @@ private: static uint8_t ClippedFlags(const Reflection &r) { return (r.clipped ? OBS_CLIPPED : 0) | (r.overloaded ? OBS_OVERLOADED : 0); } + // Why an observation stays out of the scale fit (Obs::unscaled), with the bit values the device flags + // use: it sits on an ice ring, whose background is the ring's, or it is coarser than the scale fit's + // low-resolution limit (ScalingSettings::low_resolution_limit_A). Either is still merged and written. + static constexpr uint8_t UNSCALED_ICE = 1; + static constexpr uint8_t UNSCALED_LOW_RES = 8; + uint8_t Unscaled(const Reflection &r) const { + return (r.on_ice_ring ? UNSCALED_ICE : 0) | (d_max_scale && r.d > *d_max_scale ? UNSCALED_LOW_RES : 0); + } // One leverage-corrected error-model sample per usable full: its counting variance at the group's // mean, that mean squared, its squared deviation from the mean - and the resolution it sits at, @@ -410,7 +432,9 @@ private: int n_frames = 0; double min_partiality = 0.02; std::optional d_min_limit; - std::optional d_max_limit; + // The low-resolution limit of the scale FIT. Coarser observations are merged and written, but a + // handful of them on a large cell can bend the whole scale model (Unscaled). + std::optional d_max_scale; bool merge_friedel = true; double capture_uncertainty_coeff = 0.0; double min_captured_fraction = 0.0; @@ -566,12 +590,12 @@ private: struct FullsStaging { FillVector run, peak, frame, group; FillVector I, sigma, d, image_number, corr, var_bkg, var_per_I, capture; - FillVector on_ice, clipped; + FillVector unscaled, clipped; void Resize(int n) { run.resize(n); peak.resize(n); frame.resize(n); group.resize(n); I.resize(n); sigma.resize(n); d.resize(n); image_number.resize(n); corr.resize(n); var_bkg.resize(n); var_per_I.resize(n); capture.resize(n); - on_ice.resize(n); clipped.resize(n); + unscaled.resize(n); clipped.resize(n); } }; FullsStaging fulls_staging; diff --git a/image_analysis/scale_merge/RotationScaleMergeGPU.cu b/image_analysis/scale_merge/RotationScaleMergeGPU.cu index e14faab8b..08c795305 100644 --- a/image_analysis/scale_merge/RotationScaleMergeGPU.cu +++ b/image_analysis/scale_merge/RotationScaleMergeGPU.cu @@ -61,11 +61,14 @@ namespace { struct alignas(16) ObsRecord { float I, sigma, partiality, prescaling_corr; }; // floats 0, 1, 2, 3 // A partial's flags, one byte: on an ice ring, then RotationScaleMerge::OBS_CLIPPED and - // OBS_OVERLOADED one bit up. A full's on_ice byte is 0 or OBS_ON_ICE_FLAG, so the kernels shared by - // the two read either the same way. + // OBS_OVERLOADED one bit up, then coarser than the scale fit's low-resolution limit. The two that keep + // an observation out of the scale fit are OBS_UNSCALED, and a full's unscaled byte holds those of its + // partials, so the kernels shared by the two read either the same way. constexpr uint8_t OBS_ON_ICE_FLAG = 1; constexpr uint8_t OBS_CLIPPED_FLAG = 2; constexpr uint8_t OBS_OVERLOADED_FLAG = 4; + constexpr uint8_t OBS_LOW_RES_FLAG = 8; + constexpr uint8_t OBS_UNSCALED = OBS_ON_ICE_FLAG | OBS_LOW_RES_FLAG; // An observation's frame. The fulls carry theirs (frame); the partials lie in frame order, so theirs // is the last frame starting at or before them in the frame CSR (start, n_frames entries) - an empty @@ -131,10 +134,10 @@ namespace { // where the observation is not one the reference is built from (the host RunArm says why, where it fills ScalingFit). __device__ __forceinline__ bool ScaleCoeff(int i, double min_partiality, const int32_t *__restrict__ group, const ObsRecord &o, const float *__restrict__ zeta, - const uint8_t *__restrict__ on_ice, + const uint8_t *__restrict__ unscaled, const double *__restrict__ group_mean, float &coeff) { const int g = group[i]; - if (!((g >= 0) && !(on_ice[i] & OBS_ON_ICE_FLAG) && isfinite(zeta[i]) && zeta[i] > 0.0f && o.partiality >= min_partiality)) + if (!((g >= 0) && !(unscaled[i] & OBS_UNSCALED) && isfinite(zeta[i]) && zeta[i] > 0.0f && o.partiality >= min_partiality)) return false; const double mean = group_mean[g]; if (!isfinite(mean)) return false; @@ -155,7 +158,7 @@ namespace { const int32_t *__restrict__ frame_count, const int32_t *__restrict__ perm, double min_partiality, const int32_t *__restrict__ group, const ObsRecord *__restrict__ obs, - const float *__restrict__ zeta, const uint8_t *__restrict__ on_ice, + const float *__restrict__ zeta, const uint8_t *__restrict__ unscaled, const double *__restrict__ group_mean, long min_obs, double *__restrict__ g, uint8_t *__restrict__ scaled, double *__restrict__ info) { @@ -173,7 +176,7 @@ namespace { const int a = perm ? perm[i] : i; const ObsRecord o = obs[a]; float coeff_f; - if (!ScaleCoeff(a, min_partiality, group, o, zeta, on_ice, group_mean, coeff_f)) continue; + if (!ScaleCoeff(a, min_partiality, group, o, zeta, unscaled, group_mean, coeff_f)) continue; ++cnt_local; const double coeff = coeff_f; const double w = SafeInvD(o.sigma, 1.0); @@ -214,7 +217,7 @@ namespace { double sx = 0, sy = 0, sx2 = 0, sy2 = 0, sxy = 0; long nl = 0; for (int i = lo + threadIdx.x; i < hi; i += blockDim.x) { - if (flags[i] & OBS_ON_ICE_FLAG) continue; + if (flags[i] & OBS_UNSCALED) continue; const int g = group[i]; if (g < 0) continue; const ObsRecord o = obs[i]; @@ -329,7 +332,7 @@ namespace { const int32_t *rr_offset; // emit pass: per-run base offset into the fulls arrays int32_t *f_run, *f_peak, *f_frame, *f_group; float *f_I, *f_sigma, *f_d, *f_img, *f_var_bkg, *f_var_per_I, *f_capture; - uint8_t *f_on_ice, *f_clipped; + uint8_t *f_unscaled, *f_clipped; }; // One thread's raw-hkl run: split its usable partials (already in image_number order within the run) @@ -381,7 +384,7 @@ namespace { return double(p.obs[i].I) + n_bkg * (double(p.bkg[i]) - pooled_bkg); }; - // Pass B: seed F (inverse-variance mean of pooled_I*corr), plus peak / d / on_ice / partiality. + // Pass B: seed F (inverse-variance mean of pooled_I*corr), plus peak / d / unscaled / partiality. double sum_w = 0.0, sum_wI = 0.0, sum_partiality = 0.0; float d = NAN; const int first = p.perm[ev_start]; @@ -389,7 +392,7 @@ namespace { float peak_frame = p.image_number[first]; int peak_obs = first; float peak_partiality = -1.0f; - const bool on_ice = p.flags[first] & OBS_ON_ICE_FLAG; + const uint8_t unscaled = p.flags[first] & OBS_UNSCALED; uint8_t flags = 0; for (int m = ev_start; m <= ev_end; ++m) flags |= p.flags[p.perm[m]]; // An overloaded event is not a measurement of the reflection; see the host combine. @@ -466,7 +469,7 @@ namespace { p.f_img[o] = peak_frame; p.f_peak[o] = peak_obs; p.f_frame[o] = peak_outcome; - p.f_on_ice[o] = on_ice ? 1 : 0; + p.f_unscaled[o] = unscaled; p.f_clipped[o] = clipped ? 1 : 0; p.f_group[o] = group; } @@ -586,13 +589,13 @@ namespace { // Per full: 1 if it gives a term (all, even frame, odd frame) - the host's `usable(o) && cell >= 0`. // A full's partiality is 1 (the combine sets it so on both paths). - __global__ void SurfaceKeepKernel(int n, const int32_t *group, const float *corr, const uint8_t *on_ice, + __global__ void SurfaceKeepKernel(int n, const int32_t *group, const float *corr, const uint8_t *unscaled, const int32_t *frame, const int32_t *cell, double min_partiality, int32_t *keep, int32_t *keep_even, int32_t *keep_odd) { const int i = blockIdx.x * blockDim.x + threadIdx.x; if (i >= n) return; const float c = corr[i]; - const bool k = group[i] >= 0 && c > 0.0f && isfinite(c) && 1.0f >= min_partiality && !on_ice[i] + const bool k = group[i] >= 0 && c > 0.0f && isfinite(c) && 1.0f >= min_partiality && !unscaled[i] && cell[i] >= 0; const bool odd = frame[i] & 1; keep[i] = k; keep_even[i] = k && !odd; keep_odd[i] = k && odd; @@ -699,7 +702,7 @@ namespace { const float *I, *sigma, *corr, *d, *reject_median, *var_bkg, *var_per_I, *capture; const float *reject_var_add; // per group: the shell's measured share of dI^2/4 const int32_t *group, *frame; - const uint8_t *on_ice, *frame_cell_ok, *half; + const uint8_t *unscaled, *frame_cell_ok, *half; const uint8_t *hand, *has_hands; // per-full Bijvoet hand; per-group "two hands to split" const int32_t *gperm, *gstart, *gcount; const double *em_mean, *merged_I, *cc_factor; @@ -727,7 +730,7 @@ namespace { if (!p.frame_cell_ok[p.frame[i]]) return false; const float c = p.corr[i]; if (!(c > 0.0f) || !isfinite(c)) return false; - if (p.for_search && p.on_ice[i]) return false; + if (p.for_search && p.unscaled[i]) return false; if (FULL_PARTIALITY < p.min_partiality) return false; const float I_corr = p.I[i] * c, sigma_corr = p.sigma[i] * c; return isfinite(I_corr) && isfinite(sigma_corr) && sigma_corr > 0.0f; @@ -982,7 +985,7 @@ namespace { swI += wI; sw += w; if (half) { swIh1 += wI; swh1 += w; swht1 += wt; ++nh1; } else { swIh0 += wI; swh0 += w; swht0 += wt; ++nh0; } - if (p.on_ice[i]) onice = 1; // see the host merge loop + if (p.unscaled[i] & OBS_ON_ICE_FLAG) onice = 1; // see the host merge loop if (!isfinite(dd) && isfinite(p.d[i]) && p.d[i] > 0.0f) dd = p.d[i]; } p.a_swI[g] = swI; p.a_sw[g] = sw; p.a_swIh0[g] = swIh0; p.a_swIh1[g] = swIh1; @@ -1295,7 +1298,7 @@ struct RotationScaleMergeGPU::Impl { // run: the raw-hkl run a full is of; peak: the partial its position is taken from CudaDevicePtr f_run, f_peak, f_frame, f_group; CudaDevicePtr f_I, f_sigma, f_d, f_img, f_var_bkg, f_var_per_I, f_capture; - CudaDevicePtr f_on_ice, f_clipped; + CudaDevicePtr f_unscaled, f_clipped; // scale-fulls (Unity model, kept resident): all-ones partiality/zeta and records with partiality and // prescaling_corr 1, so the shared scaling kernels yield coeff=mean, plus the working corr and the // fulls frame/group CSRs (built on the host from the small f_frame/f_group key arrays, over the @@ -1327,9 +1330,16 @@ struct RotationScaleMergeGPU::Impl { CudaDevicePtr in_new_idx; int in_n_keep = 0; CudaDevicePtr in_dphi; - // The reflections of the ingest's frames, through two pinned buffers of whole frames, each filled on - // all threads while the other is on its way to the card; take(cnt, base, src) takes cnt of them, - // the first being reflection base, apart on the card. + // Every reflection as uploaded, kept on the card from the upload to the extract where the copy fits + // beside the ingest's peak (IngestUpload), so that the reflections cross the bus once; empty where + // it does not, and the extract stages them a second time. + CudaDevicePtr in_refl; + // The reflections of the ingest's frames, through two pinned buffers of whole frames (kept from the + // upload to the extract, which may stage them again), each filled on all threads while the other + // is on its way to the card; take(cnt, base, src) takes cnt of them, the first being reflection + // base, apart on the card. + CudaHostPtr in_stage[2]; + int in_stage_cap = 0; template void StageReflections(const Reflection *const *refl, const int32_t *count, size_t nthreads, Take take); RotationScaleMergeGPU::IngestLayout in_layout; @@ -1426,7 +1436,7 @@ void RotationScaleMergeGPU::Impl::ReleaseFulls() { n_fulls = 0; f_run = {}; f_peak = {}; f_frame = {}; f_group = {}; f_I = {}; f_sigma = {}; f_d = {}; f_img = {}; - f_var_bkg = {}; f_var_per_I = {}; f_capture = {}; f_on_ice = {}; f_clipped = {}; + f_var_bkg = {}; f_var_per_I = {}; f_capture = {}; f_unscaled = {}; f_clipped = {}; f_corr = {}; f_zeta = {}; f_obs = {}; f_frame_perm = {}; f_frame_start = {}; f_frame_count = {}; f_gperm = {}; f_gstart = {}; f_gcount = {}; @@ -1647,7 +1657,7 @@ void RotationScaleMergeGPU::MergeEmSamples(bool for_search, double min_partialit p.for_search = d.merge_for_search; p.I = d.f_I.get(); p.sigma = d.f_sigma.get(); p.corr = d.f_corr.get(); p.d = d.f_d.get(); p.group = d.f_group.get(); p.frame = d.f_frame.get(); - p.on_ice = d.f_on_ice.get(); p.frame_cell_ok = d.frame_cell_ok.get(); + p.unscaled = d.f_unscaled.get(); p.frame_cell_ok = d.frame_cell_ok.get(); p.gperm = d.f_gperm.get(); p.gstart = d.f_gstart.get(); p.gcount = d.f_gcount.get(); p.em_mean = d.m_em_mean.get(); p.sw = sw.get(); p.swI = swI.get(); p.em_mean_out = d.m_em_mean.get(); p.cnt = cnt.get(); @@ -1730,7 +1740,7 @@ void RotationScaleMergeGPU::MergeAccum(double error_model_a, double error_model_ p.reject_var_add = var_add.get(); p.I = d.f_I.get(); p.sigma = d.f_sigma.get(); p.corr = d.f_corr.get(); p.d = d.f_d.get(); p.group = d.f_group.get(); p.frame = d.f_frame.get(); - p.on_ice = d.f_on_ice.get(); p.frame_cell_ok = d.frame_cell_ok.get(); + p.unscaled = d.f_unscaled.get(); p.frame_cell_ok = d.frame_cell_ok.get(); p.half = d_half.get(); p.var_bkg = d.f_var_bkg.get(); p.var_per_I = d.f_var_per_I.get(); p.capture = d.f_capture.get(); p.gperm = d.f_gperm.get(); p.gstart = d.f_gstart.get(); p.gcount = d.f_gcount.get(); @@ -1825,7 +1835,7 @@ void RotationScaleMergeGPU::MergeBijvoetExcess(double error_model_a, double erro p.n_groups = ng; p.min_partiality = d.merge_min_part; p.for_search = d.merge_for_search; p.I = d.f_I.get(); p.sigma = d.f_sigma.get(); p.corr = d.f_corr.get(); p.d = d.f_d.get(); p.group = d.f_group.get(); p.frame = d.f_frame.get(); - p.on_ice = d.f_on_ice.get(); p.frame_cell_ok = d.frame_cell_ok.get(); + p.unscaled = d.f_unscaled.get(); p.frame_cell_ok = d.frame_cell_ok.get(); p.gperm = d.f_gperm.get(); p.gstart = d.f_gstart.get(); p.gcount = d.f_gcount.get(); p.hand = d.m_hand.get(); p.has_hands = d.m_has_hands.get(); p.error_model_a = error_model_a; p.error_model_b = error_model_b; p.error_model_active = 1; @@ -1857,7 +1867,7 @@ void RotationScaleMergeGPU::MergeGroupScatter(double *sum, double *sum_sq, doubl p.n_groups = ng; p.min_partiality = d.merge_min_part; p.for_search = d.merge_for_search; p.I = d.f_I.get(); p.sigma = d.f_sigma.get(); p.corr = d.f_corr.get(); p.d = d.f_d.get(); p.group = d.f_group.get(); p.frame = d.f_frame.get(); - p.on_ice = d.f_on_ice.get(); p.frame_cell_ok = d.frame_cell_ok.get(); + p.unscaled = d.f_unscaled.get(); p.frame_cell_ok = d.frame_cell_ok.get(); p.gperm = d.f_gperm.get(); p.gstart = d.f_gstart.get(); p.gcount = d.f_gcount.get(); p.em_mean = d.m_em_mean.get(); p.var_bkg = d.f_var_bkg.get(); p.var_per_I = d.f_var_per_I.get(); p.capture = d.f_capture.get(); @@ -1884,7 +1894,7 @@ void RotationScaleMergeGPU::MergeHalves(uint64_t *obs_key, uint8_t *half) { p.n_groups = ng; p.min_partiality = d.merge_min_part; p.for_search = d.merge_for_search; p.I = d.f_I.get(); p.sigma = d.f_sigma.get(); p.corr = d.f_corr.get(); p.d = d.f_d.get(); p.group = d.f_group.get(); p.frame = d.f_frame.get(); - p.on_ice = d.f_on_ice.get(); p.frame_cell_ok = d.frame_cell_ok.get(); + p.unscaled = d.f_unscaled.get(); p.frame_cell_ok = d.frame_cell_ok.get(); p.gperm = d.f_gperm.get(); p.gstart = d.f_gstart.get(); p.gcount = d.f_gcount.get(); const int obs_blocks = std::min(65535, (nf + BLK - 1) / BLK); @@ -2041,7 +2051,7 @@ int RotationScaleMergeGPU::Combine(const int32_t *rawrun_group, double min_parti d.f_I = d.Alloc(nf); d.f_sigma = d.Alloc(nf); d.f_d = d.Alloc(nf); d.f_img = d.Alloc(nf); d.f_var_bkg = d.Alloc(nf); d.f_var_per_I = d.Alloc(nf); d.f_capture = d.Alloc(nf); - d.f_on_ice = d.Alloc(nf); d.f_clipped = d.Alloc(nf); + d.f_unscaled = d.Alloc(nf); d.f_clipped = d.Alloc(nf); d.f_corr = d.Alloc(nf); d.f_zeta = d.Alloc(nf); d.f_obs = d.Alloc(nf); @@ -2052,7 +2062,7 @@ int RotationScaleMergeGPU::Combine(const int32_t *rawrun_group, double min_parti p.f_frame = d.f_frame.get(); p.f_group = d.f_group.get(); p.f_I = d.f_I.get(); p.f_sigma = d.f_sigma.get(); p.f_d = d.f_d.get(); p.f_img = d.f_img.get(); p.f_var_bkg = d.f_var_bkg.get(); p.f_var_per_I = d.f_var_per_I.get(); p.f_capture = d.f_capture.get(); - p.f_on_ice = d.f_on_ice.get(); p.f_clipped = d.f_clipped.get(); + p.f_unscaled = d.f_unscaled.get(); p.f_clipped = d.f_clipped.get(); if (d.n_fulls > 0) { CombineKernel<<s()>>>(p); CudaCheck(cudaGetLastError(), "combine emit launch"); @@ -2062,7 +2072,7 @@ int RotationScaleMergeGPU::Combine(const int32_t *rawrun_group, double min_parti } void RotationScaleMergeGPU::GetFulls(int32_t *run, float *I, float *sigma, float *d, - float *image_number, int32_t *frame, uint8_t *on_ice, + float *image_number, int32_t *frame, uint8_t *unscaled, uint8_t *clipped, int32_t *group) const { DeviceGuard guard(impl_->device, impl_->available); const auto &dd = *impl_; @@ -2075,7 +2085,7 @@ void RotationScaleMergeGPU::GetFulls(int32_t *run, float *I, float *sigma, float dl(group, dd.f_group.get(), n * sizeof(int32_t)); dl(I, dd.f_I.get(), n * sizeof(float)); dl(sigma, dd.f_sigma.get(), n * sizeof(float)); dl(d, dd.f_d.get(), n * sizeof(float)); dl(image_number, dd.f_img.get(), n * sizeof(float)); - dl(on_ice, dd.f_on_ice.get(), n * sizeof(uint8_t)); + dl(unscaled, dd.f_unscaled.get(), n * sizeof(uint8_t)); dl(clipped, dd.f_clipped.get(), n * sizeof(uint8_t)); } @@ -2111,7 +2121,7 @@ void RotationScaleMergeGPU::FitFullsScale(double min_partiality) { d.f_obs.get(), d.f_corr.get(), d.group_mean.get()); CudaCheck(cudaGetLastError(), "ReduceGroupMeansKernel launch"); FitPerFrameGKernel<<s()>>>(d.n_frames, d.f_frame_start.get(), d.f_frame_count.get(), - d.f_frame_perm.get(), min_partiality, d.f_group.get(), d.f_obs.get(), d.f_zeta.get(), d.f_on_ice.get(), + d.f_frame_perm.get(), min_partiality, d.f_group.get(), d.f_obs.get(), d.f_zeta.get(), d.f_unscaled.get(), d.group_mean.get(), 1L, d.g.get(), d.scaled.get(), d.info.get()); CudaCheck(cudaGetLastError(), "scale fulls launch"); CudaCheck(cudaStreamSynchronize(impl_->s()), "scale fulls sync"); @@ -2250,7 +2260,7 @@ int RotationScaleMergeGPU::SurfaceBuildTerms(const int32_t *cell, const float *c keep = d.Alloc(std::max(1, nf)); even = d.Alloc(std::max(1, nf)); odd = d.Alloc(std::max(1, nf)); if (nf > 0) { - SurfaceKeepKernel<<<(nf + BLK - 1) / BLK, BLK, 0, st>>>(nf, d.f_group.get(), d_corr.get(), d.f_on_ice.get(), + SurfaceKeepKernel<<<(nf + BLK - 1) / BLK, BLK, 0, st>>>(nf, d.f_group.get(), d_corr.get(), d.f_unscaled.get(), d.f_frame.get(), d_cell.get(), min_partiality, keep.get(), even.get(), odd.get()); CudaCheck(cudaGetLastError(), "surface keep launch"); } @@ -2509,8 +2519,9 @@ namespace { struct IngestArrays { ObsRecord *obs; - float *zeta, *corr, *bkg, *var_bkg, *image_number, *d, *dphi; + float *zeta, *corr, *bkg, *var_bkg, *image_number, *d, *dphi, *px, *py; uint8_t *flags; + float d_max_scale; // coarser than this is kept out of the scale fit (OBS_LOW_RES_FLAG) const int32_t *new_idx; // the cut's place of each reflection (an exclusive prefix over the kept) int n, n_keep; // reflections and observations }; @@ -2537,8 +2548,10 @@ namespace { a.image_number[i] = r.image_number; a.d[i] = r.d; a.dphi[i] = r.delta_phi_deg; + a.px[i] = r.predicted_x; + a.py[i] = r.predicted_y; a.flags[i] = (r.on_ice_ring ? OBS_ON_ICE_FLAG : 0) | (r.clipped ? OBS_CLIPPED_FLAG : 0) - | (r.overloaded ? OBS_OVERLOADED_FLAG : 0); + | (r.overloaded ? OBS_OVERLOADED_FLAG : 0) | (r.d > a.d_max_scale ? OBS_LOW_RES_FLAG : 0); } @@ -2838,13 +2851,18 @@ void RotationScaleMergeGPU::Impl::StageReflections(const Reflection *const *refl for (int o = 0; o < n_frames; ++o) max_count = std::max(max_count, count[o]); // Where the card reads host memory directly (gpu_direct_host_read()), the kernel takes the pinned - // buffer apart in place, without the upload. + // buffer apart in place, without the upload. Where the reflections stay resident (in_refl), each + // buffer goes to its place in the copy instead of a staging buffer of its own on the card. constexpr size_t STAGE_BYTES = 64 << 20; const bool direct = gpu_direct_host_read(); const int cap = std::max(static_cast(STAGE_BYTES / sizeof(Reflection)), max_count); - CudaHostPtr stage[2] = {CudaHostPtr(cap), CudaHostPtr(cap)}; + if (cap > in_stage_cap) { + in_stage[0] = CudaHostPtr(cap); + in_stage[1] = CudaHostPtr(cap); + in_stage_cap = cap; + } CudaDevicePtr staged[2]; - if (!direct) { + if (!direct && !in_refl) { staged[0] = Alloc(cap); staged[1] = Alloc(cap); } @@ -2859,7 +2877,7 @@ void RotationScaleMergeGPU::Impl::StageReflections(const Reflection *const *refl const int cnt = in_src_start[f1] - base; if (in_flight[b]) CudaCheck(cudaEventSynchronize(copied[b]), "staging buffer"); - Reflection *dst = stage[b].get(); + Reflection *dst = in_stage[b].get(); ParallelFor(f1 - f0, nthreads, [&](int fo) { const int o = f0 + fo; std::copy(refl[o], refl[o] + count[o], dst + (in_src_start[o] - base)); @@ -2867,10 +2885,11 @@ void RotationScaleMergeGPU::Impl::StageReflections(const Reflection *const *refl if (cnt > 0) { const Reflection *src = dst; if (!direct) { - CudaCheck(cudaMemcpyAsync(staged[b].get(), dst, size_t(cnt) * sizeof(Reflection), - cudaMemcpyHostToDevice, s()), "upload reflections"); + Reflection *to = in_refl ? in_refl.get() + base : staged[b].get(); + CudaCheck(cudaMemcpyAsync(to, dst, size_t(cnt) * sizeof(Reflection), cudaMemcpyHostToDevice, s()), + "upload reflections"); CudaCheck(cudaEventRecord(copied[b], s()), "upload reflections"); - src = staged[b].get(); + src = to; } in_flight[b] = true; take(cnt, base, src); @@ -2900,9 +2919,18 @@ void RotationScaleMergeGPU::IngestUpload(int n_frames, const Reflection *const * ThrowTooLargeForGPU(n); // See AllocObservations: these are the first of the scaling's buffers. cuda_trim_allocation_pool(); + const int na = std::max(1, n); + // The reflections stay on the card until the observations are taken from them where that copy and + // the ingest's own peak beside it (67 bytes per reflection, see RotationScaleMerge::DeviceBytes) + // fit a quarter of the card - decided on the card's total, so the answer does not depend on the + // moment, and with room for a second engine's ingest beside this one. Not where the card reads + // the host's memory in place: there the copy would be the upload it saves. + constexpr size_t INGEST_PEAK_BYTES_PER_REFLECTION = 67; + d.in_refl = {}; + if (!gpu_direct_host_read() && size_t(n) * (sizeof(Reflection) + INGEST_PEAK_BYTES_PER_REFLECTION) <= total_bytes / 4) + d.in_refl = d.Alloc(na); // Only what the sort and the cut read; the observations are taken from the reflections once the cut // has decided which they are (IngestObservations), so the two are never on the card together. - const int na = std::max(1, n); d.in_img = d.Alloc(na); d.in_d = d.Alloc(na); d.in_bkg = d.Alloc(na); d.in_key = d.Alloc(na); const IngestKeys a{d.in_img.get(), d.in_d.get(), d.in_bkg.get(), d.in_key.get()}; @@ -3117,34 +3145,38 @@ void RotationScaleMergeGPU::IngestGetLayout(IngestLayout &out) const { } void RotationScaleMergeGPU::IngestObservations(const Reflection *const *refl, const int32_t *count, size_t nthreads, - const double *frame_flux, float *px, float *py) { + const double *frame_flux, float d_max_scale, float *px, float *py) { DeviceGuard guard(impl_->device, impl_->available); auto &d = *impl_; const int n_keep = d.in_n_keep; + const int nka = std::max(1, n_keep); d.AllocObservations(n_keep); - d.in_dphi = d.Alloc(std::max(1, n_keep)); + d.in_dphi = d.Alloc(nka); + // The predicted positions, which only the fulls' and only on the host read, go there straight away. + CudaDevicePtr dev_px = d.Alloc(nka), dev_py = d.Alloc(nka); + const int n = d.in_src_start[d.n_frames]; const IngestArrays a{d.obs.get(), d.zeta.get(), d.corr.get(), d.bkg.get(), d.var_bkg.get(), d.image_number.get(), - d.d_obs.get(), d.in_dphi.get(), d.flags.get(), d.in_new_idx.get(), - d.in_src_start[d.n_frames], n_keep}; - d.StageReflections(refl, count, nthreads, [&](int cnt, int base, const Reflection *src) { + d.d_obs.get(), d.in_dphi.get(), dev_px.get(), dev_py.get(), d.flags.get(), d_max_scale, + d.in_new_idx.get(), n, n_keep}; + const auto extract = [&](int cnt, int base, const Reflection *src) { IngestExtractKernel<<<(cnt + BLK - 1) / BLK, BLK, 0, d.s()>>>(cnt, base, src, a); CudaCheck(cudaGetLastError(), "IngestExtractKernel launch"); - }); - // The predicted positions, which only the fulls' and only on the host read, stay there. - const int n = d.in_src_start[d.n_frames]; - std::vector new_idx(n); - if (n > 0) - CopyAndWait(new_idx.data(), d.in_new_idx.get(), size_t(n) * sizeof(int32_t), cudaMemcpyDeviceToHost, d.s(), - "download places"); + }; + if (d.in_refl) { + if (n > 0) + extract(n, 0, d.in_refl.get()); + CudaCheck(cudaStreamSynchronize(d.s()), "extract reflections"); + d.in_refl = {}; + } else { + d.StageReflections(refl, count, nthreads, extract); + } d.in_new_idx = {}; - ParallelFor(d.n_frames, nthreads, [&](int o) { - for (int j = 0; j < count[o]; ++j) { - const int src = d.in_src_start[o] + j, i = new_idx[src]; - if ((src + 1 < n ? new_idx[src + 1] : n_keep) == i) continue; - px[i] = refl[o][j].predicted_x; - py[i] = refl[o][j].predicted_y; - } - }); + d.in_stage[0] = {}; d.in_stage[1] = {}; d.in_stage_cap = 0; + if (n_keep > 0) { + CopyAndWait(px, dev_px.get(), size_t(n_keep) * sizeof(float), cudaMemcpyDeviceToHost, d.s(), "download positions"); + CopyAndWait(py, dev_py.get(), size_t(n_keep) * sizeof(float), cudaMemcpyDeviceToHost, d.s(), "download positions"); + } + dev_px = {}; dev_py = {}; // The kept observations are in frame order, as the reflections were (IngestSort laid out the CSR). CudaDevicePtr flux; diff --git a/image_analysis/scale_merge/RotationScaleMergeGPU.h b/image_analysis/scale_merge/RotationScaleMergeGPU.h index b479fe174..eb69648e2 100644 --- a/image_analysis/scale_merge/RotationScaleMergeGPU.h +++ b/image_analysis/scale_merge/RotationScaleMergeGPU.h @@ -61,7 +61,8 @@ public: // The steps below build, from the reflections, exactly the observations and raw-hkl runs that // RotationScaleMerge::BuildInRangeObservations builds on the host, and leave them where the uploads // above and SetRawRuns would: the reflections are sorted and cut on the card, and cross the bus - // twice - once for what the sort and the cut read, once for the observations the cut kept. + // once where their copy fits beside the ingest (IngestUpload), else twice - once for what the sort + // and the cut read, once for the observations the cut kept. // The reflections of n_frames frames, frame o's count[o] of them at refl[o], uploaded in frame order; // what the sort, the cut and the background below read is kept per reflection. @@ -88,8 +89,9 @@ public: // its order, each with its deterministic correction divided by its frame's flux (length n_frames). // px/py (length IngestSort's count) receive each observation's predicted position, which is not // kept on the card (GetFullsPeak). + // d_max_scale: observations coarser than this are flagged to stay out of the scale fit (INFINITY: none). void IngestObservations(const Reflection *const *refl, const int32_t *count, size_t nthreads, - const double *frame_flux, float *px, float *py); + const double *frame_flux, float d_max_scale, float *px, float *py); // The ingest's geometry smoothing, on the observations IngestSort left (RotationScaleMerge::IngestOnDevice): // each delta_phi re-solved against its frame's smoothed lattice where the frame has one - recip holds // a*, b*, c* per frame (9 floats), ok which frames, and the goniometer frame as SmoothedGeometry @@ -240,7 +242,7 @@ public: // of. The working corr is downloaded separately by GetFullsCorr (it is only meaningful after the // fulls scaling; otherwise the caller sets it). void GetFulls(int32_t *run, float *I, float *sigma, float *d, - float *image_number, int32_t *frame, uint8_t *on_ice, uint8_t *clipped, + float *image_number, int32_t *frame, uint8_t *unscaled, uint8_t *clipped, int32_t *group) const; // Download the observation each full's predicted detector position is that of (its peak partial), diff --git a/image_analysis/scale_merge/ScaleOnTheFly.cpp b/image_analysis/scale_merge/ScaleOnTheFly.cpp index 823b42706..5cce4b17d 100644 --- a/image_analysis/scale_merge/ScaleOnTheFly.cpp +++ b/image_analysis/scale_merge/ScaleOnTheFly.cpp @@ -31,45 +31,57 @@ namespace { return 1.0 / x; } + // The scatter of a still about its scale model is not counting noise: the strong reflections of a frame + // scatter by tens of percent (partiality, orientation, the crystal itself), far beyond their counting + // sigma. Measured in counting sigmas alone, every strong reflection is an outlier to the robust fit and + // the scale is decided by the weak ones. So the fit's variance carries a model error proportional to + // the predicted intensity. Its size barely matters (0.1-1.0 all fit alike); its presence does. + constexpr double SCALE_MODEL_ERROR = 0.3; + // One reflection reduced to the 1-D scale fit: predicted intensity is G * coeff (coeff is constant - // while B is fixed), measured is Iobs, weighted by 1/sigma. + // while B is fixed), measured is Iobs; sigma2 its measured variance, var_bkg the background part of it. struct ScaleObs { double coeff; double Iobs; - double weight; + double sigma2; + double var_bkg; }; - // Robust per-image scale: minimise sum_i Cauchy_k( weight_i (G*coeff_i - Iobs_i) ) over G >= 0. The - // model is linear in G, so this M-estimate is a few reweighted-least-squares steps (each a closed-form - // weighted ratio) - the same objective the Ceres path solves, without a per-image problem/autodiff/ - // trust-region. Seeded from the plain weighted-LS solution; Cauchy weight is 1/(1 + (res/k)^2). - double SolveScaleIRLS(const std::vector &obs, double robust_k) { - auto weighted_scale = [&obs](auto robust_weight) { - double num = 0.0, den = 0.0; - for (const auto &o: obs) { - const double rw = robust_weight(o); - const double w2 = o.weight * o.weight; - num += rw * w2 * o.coeff * o.Iobs; - den += rw * w2 * o.coeff * o.coeff; - } - return den > 0.0 ? num / den : NAN; - }; + // The variance of an observation at the model m = G * coeff: background, the counting noise of m and + // the model error. + double ModelVariance(const ScaleObs &o, double G) { + const double m = G * o.coeff; + return o.var_bkg + std::max(0.0, m) + SCALE_MODEL_ERROR * SCALE_MODEL_ERROR * m * m; + } - double G = weighted_scale([](const ScaleObs &) { return 1.0; }); - if (!std::isfinite(G)) + // Robust per-image scale: minimise sum_i Cauchy_k( (G*coeff_i - Iobs_i) / sqrt(var_i(G)) ) over G >= 0. + // The model is linear in G, so this M-estimate is a few reweighted-least-squares steps (each a + // closed-form weighted ratio), the variances re-evaluated at each step's G. Seeded from the plain + // least-squares solution weighted by the measured variances; Cauchy weight is 1/(1 + (res/k)^2). + double SolveScaleIRLS(const std::vector &obs, double robust_k) { + double num = 0.0, den = 0.0; + for (const auto &o: obs) { + num += o.coeff * o.Iobs / o.sigma2; + den += o.coeff * o.coeff / o.sigma2; + } + if (!(den > 0.0) || !std::isfinite(num / den)) return 1.0; - G = std::max(0.0, G); + double G = std::max(0.0, num / den); const double k2 = robust_k * robust_k; for (int iter = 0; iter < 30; ++iter) { - const double G_prev = G; - const double G_next = weighted_scale([&](const ScaleObs &o) { - const double res = o.weight * (G * o.coeff - o.Iobs); - return 1.0 / (1.0 + res * res / k2); - }); - if (!std::isfinite(G_next)) + num = den = 0.0; + for (const auto &o: obs) { + const double var = ModelVariance(o, G); + const double res = G * o.coeff - o.Iobs; + const double w = 1.0 / (var + res * res / k2); // Cauchy weight / var + num += w * o.coeff * o.Iobs; + den += w * o.coeff * o.coeff; + } + if (!(den > 0.0) || !std::isfinite(num / den)) break; - G = std::max(0.0, G_next); + const double G_prev = G; + G = std::max(0.0, num / den); if (std::abs(G - G_prev) <= 1e-7 * std::max(G, 1.0)) break; } @@ -118,7 +130,11 @@ void ScaleOnTheFly::Scale(IntegrationOutcome &integration_outcome) const { if (it == reference_data.end()) continue; const double coeff = r.partiality * SafeInv(r.prescaling_corr * r.qe_corr * r.flight_corr, 1.0) * it->second; - obs.push_back({coeff, static_cast(r.I), SafeInv(r.sigma, 1.0)}); + const double sigma2 = static_cast(r.sigma) * r.sigma; + if (!(sigma2 > 0.0) || !std::isfinite(sigma2)) + continue; + const double var_bkg = std::isfinite(r.var_bkg) && r.var_bkg > 0.0f ? r.var_bkg : sigma2; + obs.push_back({coeff, static_cast(r.I), sigma2, var_bkg}); } if (obs.size() < MIN_REFLECTIONS) { diff --git a/image_analysis/scale_merge/SearchSpaceGroup.cpp b/image_analysis/scale_merge/SearchSpaceGroup.cpp index 6cf37304d..92b7a3bb1 100644 --- a/image_analysis/scale_merge/SearchSpaceGroup.cpp +++ b/image_analysis/scale_merge/SearchSpaceGroup.cpp @@ -144,9 +144,21 @@ namespace { if (CenteringAbsent(gops, hkl)) return REFL_CENTRING_ABSENT; const uint8_t zone = static_cast((MirrorZoneOf(mirrors, hkl) + 1) << 4); - if (gops.is_systematically_absent(hkl)) + // gemmi's is_systematically_absent and epsilon_factor_without_centering in one pass over the + // operators: both ask which of them fix hkl. The absence test adds each centring vector to a + // fixing operator's translation, but no centring vector shifts the phase of this reflection + // (above), so the operator's own translation decides, as it does for one with none. + const gemmi::Op::Miller denh = {{gemmi::Op::DEN * hkl[0], gemmi::Op::DEN * hkl[1], gemmi::Op::DEN * hkl[2]}}; + int epsilon = 0; + bool absent = false; + for (const gemmi::Op& op : gops.sym_ops) + if (op.apply_to_hkl_without_division(hkl) == denh) { + ++epsilon; + absent |= gemmi::GroupOps::has_phase_shift(op.tran, hkl); + } + if (absent) return REFL_ABSENT | zone; - return REFL_PRESENT | zone | (gops.epsilon_factor_without_centering(hkl) > 1 ? REFL_ON_AXIS : 0); + return REFL_PRESENT | zone | (epsilon > 1 ? REFL_ON_AXIS : 0); } // The zone a mirror fixes, named the way a crystallographer names it - "h0l" for the mirror diff --git a/image_analysis/scale_merge/StillsPartialityRefine.cpp b/image_analysis/scale_merge/StillsPartialityRefine.cpp index 401c8882d..6096da7f4 100644 --- a/image_analysis/scale_merge/StillsPartialityRefine.cpp +++ b/image_analysis/scale_merge/StillsPartialityRefine.cpp @@ -22,6 +22,9 @@ namespace { constexpr size_t MIN_FIT_REFLECTIONS = 20; constexpr double kRadToDeg = 180.0 / 3.14159265358979323846; + // Model error of the per-crystal scale fit, as a fraction of the predicted intensity - ScaleOnTheFly's. + constexpr double SCALE_MODEL_ERROR = 0.3; + double SafeInv(double x, double fallback) { if (!std::isfinite(x) || x == 0.0) return fallback; @@ -30,18 +33,52 @@ namespace { // One accepted reflection reduced to the physical partiality fit: the base reciprocal vector q (crystal // frame at the stored per-image orientation), the reference full intensity, the measured intensity, the - // reciprocal of the prescaling correction (the factor that turns a true intensity back into counts) - // and the weight. dist_ewald / partiality are recomputed from q under the refined tilt. + // reciprocal of the prescaling correction (the factor that turns a true intensity back into counts), + // the measured variance and its background part, and the weight the tilt is refined with. + // dist_ewald / partiality are recomputed from q under the refined tilt. struct FitObs { double qx, qy, qz; double Iref; double Iobs; double inv_corr; // 1 / (prescaling_corr * qe_corr * flight_corr) - double weight; // 1 / sigma + double sigma2; + double var_bkg; + double weight; // 1 / sqrt(variance at the current model), set with each G }; + // The variance of an observation at the model m: background, the counting noise of m and the model error. + double ModelVariance(const FitObs &o, double m) { + return o.var_bkg + std::max(0.0, m) + SCALE_MODEL_ERROR * SCALE_MODEL_ERROR * m * m; + } + double VecLen(double x, double y, double z) { return std::sqrt(x * x + y * y + z * z); } + // The rocking width sigma^2 at a reflection of resolution d* (and |q_z|, for the bandwidth term): the + // run's table where there is one - linear in d* between its shells, held beyond the outermost - else + // the three-term formula. + struct Width { + double gamma0, gamma_e, bw; + const std::vector *table_dstar = nullptr, *table_s = nullptr; + + double Sigma2(double dstar, double qz) const { + if (table_dstar && !table_dstar->empty()) { + const auto &x = *table_dstar; + const auto &y = *table_s; + double s = y.front(); + if (dstar >= x.back()) + s = y.back(); + else if (dstar > x.front()) { + const size_t i = std::upper_bound(x.begin(), x.end(), dstar) - x.begin(); + s = y[i - 1] + (dstar - x[i - 1]) / (x[i] - x[i - 1]) * (y[i] - y[i - 1]); + } + return s * s; + } + const double sig_ang = gamma_e * dstar; + const double sbw = bw * std::fabs(qz); + return gamma0 * gamma0 + sig_ang * sig_ang + sbw * sbw; + } + }; + // Analytic partiality for a reflection whose base reciprocal vector is q, tilted by (psi_x, psi_y). // Mirrors BraggPrediction: dist_ewald = |S| - 1/lambda with S = q_rot + S0, and // p = exp(-dist_ewald^2 / 2 sigma^2), sigma^2 = gamma0^2 + (gamma_e*d*)^2 + (bw*|q_z|)^2 - three @@ -52,7 +89,7 @@ namespace { double ComputeP(double qx, double qy, double qz, double psi_x, double psi_y, double s0x, double s0y, double s0z, double inv_lambda, - double gamma0, double gamma_e, double bw) { + const Width &width) { double aa[3] = {psi_x, psi_y, 0.0}; double q[3] = {qx, qy, qz}; double qr[3]; @@ -60,9 +97,7 @@ namespace { const double Sx = qr[0] + s0x, Sy = qr[1] + s0y, Sz = qr[2] + s0z; const double de = std::sqrt(Sx * Sx + Sy * Sy + Sz * Sz) - inv_lambda; const double dstar = std::sqrt(qr[0] * qr[0] + qr[1] * qr[1] + qr[2] * qr[2]); - const double sig_ang = gamma_e * dstar; - const double sbw = bw * std::fabs(qr[2]); - const double sig2 = gamma0 * gamma0 + sig_ang * sig_ang + sbw * sbw; + const double sig2 = width.Sigma2(dstar, qr[2]); if (!(sig2 > 0.0)) return 1.0; return std::exp(-0.5 * de * de / sig2); @@ -72,9 +107,8 @@ namespace { // their plain moment of de is u = W^2 / 3, and the intensity-weighted moment m of a Gaussian of width // s cut at +-W is u * g(a), a = W / s, with g(a) = 3/a^2 (1 - 2 a phi(a) / erf(a / sqrt 2)): 1 for a // curve much wider than the window, s^2 / u for a much narrower one. Solves g(a) = m / u for s^2 by - // bisection (g falls with a). A curve wider than the window cannot be measured through it, so it is - // taken as wide as the window (a = 1). - double UntruncatedVariance(double m, double u) { + // bisection (g falls with a). A curve wider than the window cannot be measured through it: empty. + std::optional UntruncatedVariance(double m, double u) { auto g = [](double a) { const double phi = std::exp(-0.5 * a * a) / std::sqrt(2.0 * 3.14159265358979323846); return 3.0 / (a * a) * (1.0 - 2.0 * a * phi / std::erf(a / std::sqrt(2.0))); @@ -82,7 +116,7 @@ namespace { const double t = m / u; double lo = 1.0, hi = 50.0; if (!(t < g(lo))) - return 3.0 * u; + return std::nullopt; for (int i = 0; i < 60; ++i) { const double mid = 0.5 * (lo + hi); (g(mid) > t ? lo : hi) = mid; @@ -91,36 +125,32 @@ namespace { return 3.0 * u / (a * a); } - // Robust per-crystal scale G (linear in G given the model coefficients), identical objective to - // ScaleOnTheFly::SolveScaleIRLS: minimise sum Cauchy_k( w (G*coeff - Iobs) ) over G >= 0. - double SolveScaleIRLS(const std::vector &coeff, const std::vector &Iobs, - const std::vector &weight, double robust_k) { - auto weighted_scale = [&](auto robust_weight) { - double num = 0.0, den = 0.0; - for (size_t i = 0; i < coeff.size(); ++i) { - const double rw = robust_weight(i); - const double w2 = weight[i] * weight[i]; - num += rw * w2 * coeff[i] * Iobs[i]; - den += rw * w2 * coeff[i] * coeff[i]; - } - return den > 0.0 ? num / den : NAN; - }; - - double G = weighted_scale([](size_t) { return 1.0; }); - if (!std::isfinite(G)) + // Robust per-crystal scale G (linear in G given the model coefficients), the objective of + // ScaleOnTheFly::SolveScaleIRLS: minimise sum Cauchy_k( (G*coeff - Iobs) / sqrt(var(G*coeff)) ) over G >= 0, + // the variances re-evaluated at each step's G. + double SolveScaleIRLS(const std::vector &obs, const std::vector &coeff, double robust_k) { + double num = 0.0, den = 0.0; + for (size_t i = 0; i < obs.size(); ++i) { + num += coeff[i] * obs[i].Iobs / obs[i].sigma2; + den += coeff[i] * coeff[i] / obs[i].sigma2; + } + if (!(den > 0.0) || !std::isfinite(num / den)) return 1.0; - G = std::max(0.0, G); + double G = std::max(0.0, num / den); const double k2 = robust_k * robust_k; for (int iter = 0; iter < 30; ++iter) { - const double G_prev = G; - const double G_next = weighted_scale([&](size_t i) { - const double res = weight[i] * (G * coeff[i] - Iobs[i]); - return 1.0 / (1.0 + res * res / k2); - }); - if (!std::isfinite(G_next)) + num = den = 0.0; + for (size_t i = 0; i < obs.size(); ++i) { + const double res = G * coeff[i] - obs[i].Iobs; + const double w = 1.0 / (ModelVariance(obs[i], G * coeff[i]) + res * res / k2); + num += w * coeff[i] * obs[i].Iobs; + den += w * coeff[i] * coeff[i]; + } + if (!(den > 0.0) || !std::isfinite(num / den)) break; - G = std::max(0.0, G_next); + const double G_prev = G; + G = std::max(0.0, num / den); if (std::abs(G - G_prev) <= 1e-7 * std::max(G, 1.0)) break; } @@ -143,16 +173,14 @@ namespace { // ComputeP with the tilt given as its rotation matrix. struct TiltModel { double s0x, s0y, s0z, inv_lambda; - double gamma0, gamma_e, bw; + Width width; double P(const std::array &R, const FitObs &o) const { const double qx = R[0] * o.qx + R[1] * o.qy + R[2] * o.qz; const double qy = R[3] * o.qx + R[4] * o.qy + R[5] * o.qz; const double qz = R[6] * o.qx + R[7] * o.qy + R[8] * o.qz; const double de = VecLen(qx + s0x, qy + s0y, qz + s0z) - inv_lambda; - const double sig_ang = gamma_e * VecLen(qx, qy, qz); - const double sbw = bw * std::fabs(qz); - const double sig2 = gamma0 * gamma0 + sig_ang * sig_ang + sbw * sbw; + const double sig2 = width.Sigma2(VecLen(qx, qy, qz), qz); if (!(sig2 > 0.0)) return 1.0; return std::exp(-0.5 * de * de / sig2); @@ -247,7 +275,8 @@ StillsPartialityRefine::StillsPartialityRefine(const DiffractionExperiment &x) double StillsPartialityRefine::RefineOne(IntegrationOutcome &outcome, const std::map &reference, - const std::optional &run_width) const { + const std::optional &run_width, + double radial_scale) const { if (outcome.reflections.empty()) return 0.0; @@ -258,8 +287,8 @@ double StillsPartialityRefine::RefineOne(IntegrationOutcome &outcome, const double inv_lambda = 1.0 / outcome.geom.GetWavelength_A(); auto base_q = [&](const Reflection &r) { - return Astar * static_cast(r.h) + Bstar * static_cast(r.k) - + Cstar * static_cast(r.l); + return (Astar * static_cast(r.h) + Bstar * static_cast(r.k) + + Cstar * static_cast(r.l)) * static_cast(radial_scale); }; // Collect the reflections that constrain the fit (accepted, non-ice, finite, present in the reference). @@ -284,6 +313,8 @@ double StillsPartialityRefine::RefineOne(IntegrationOutcome &outcome, .Iref = it->second, .Iobs = static_cast(r.I), .inv_corr = SafeInv(r.prescaling_corr * r.qe_corr * r.flight_corr, 1.0), + .sigma2 = static_cast(r.sigma) * r.sigma, + .var_bkg = std::isfinite(r.var_bkg) && r.var_bkg > 0.0f ? r.var_bkg : static_cast(r.sigma) * r.sigma, .weight = SafeInv(r.sigma, 1.0), }); @@ -337,28 +368,31 @@ double StillsPartialityRefine::RefineOne(IntegrationOutcome &outcome, gamma_e = std::max(run_width->gamma_e, 1e-9); bw = run_width->bandwidth_sigma; } + const Width width{.gamma0 = gamma0, .gamma_e = gamma_e, .bw = bw, + .table_dstar = run_width ? &run_width->table_dstar : nullptr, + .table_s = run_width ? &run_width->table_s : nullptr}; double psi[2] = {0.0, 0.0}; double G = 1.0; const TiltModel model{.s0x = S0.x, .s0y = S0.y, .s0z = S0.z, .inv_lambda = inv_lambda, - .gamma0 = gamma0, .gamma_e = gamma_e, .bw = bw}; + .width = width}; const bool refine_tilt = obs.size() >= settings_.min_reflections; const int inner = refine_tilt ? settings_.inner_iterations : 1; for (int it = 0; it < inner; ++it) { - // (1) Solve G given the current partialities. - std::vector coeff(obs.size()), Iobs(obs.size()), weight(obs.size()); + // (1) Solve G given the current partialities, and weight the tilt fit by the variances at that model. + std::vector coeff(obs.size()); for (size_t j = 0; j < obs.size(); ++j) { const double p = ComputeP(obs[j].qx, obs[j].qy, obs[j].qz, psi[0], psi[1], - S0.x, S0.y, S0.z, inv_lambda, gamma0, gamma_e, bw); + S0.x, S0.y, S0.z, inv_lambda, width); coeff[j] = p * obs[j].inv_corr * obs[j].Iref; - Iobs[j] = obs[j].Iobs; - weight[j] = obs[j].weight; } - G = SolveScaleIRLS(coeff, Iobs, weight, settings_.robust_k); + G = SolveScaleIRLS(obs, coeff, settings_.robust_k); if (!(G > 0.0) || !std::isfinite(G)) return 0.0; + for (size_t j = 0; j < obs.size(); ++j) + obs[j].weight = 1.0 / std::sqrt(ModelVariance(obs[j], G * coeff[j])); if (!refine_tilt) break; @@ -370,23 +404,12 @@ double StillsPartialityRefine::RefineOne(IntegrationOutcome &outcome, break; } - // Keep what the crystal came in with. This refinement is on by default, so a crystal the tilt model - // happens to suit WORSE than the fixed partiality it replaces must not be made worse by it - and - // whether it suits is only known once the corrections are written and the CC re-measured. - const auto cc_before = outcome.image_scale_cc; - const auto g_before = outcome.image_scale_g; - std::vector> before; // partiality, image_scale_corr - before.reserve(outcome.reflections.size()); - for (const auto &r: outcome.reflections) - before.emplace_back(r.partiality, r.image_scale_corr); - // Write the refined partiality + scale correction onto every reflection of the crystal (not only the // fit subset), so the merge sees a consistent model. image_scale_corr = prescaling_corr * qe_corr * flight_corr / // (partiality * G), the same composition ScaleOnTheFly writes. for (auto &r: outcome.reflections) { const Coord q = base_q(r); - const double p = ComputeP(q.x, q.y, q.z, psi[0], psi[1], S0.x, S0.y, S0.z, inv_lambda, - gamma0, gamma_e, bw); + const double p = ComputeP(q.x, q.y, q.z, psi[0], psi[1], S0.x, S0.y, S0.z, inv_lambda, width); r.partiality = static_cast(p); const float corr = r.prescaling_corr * r.qe_corr * r.flight_corr; const double denom = p * G; @@ -402,20 +425,6 @@ double StillsPartialityRefine::RefineOne(IntegrationOutcome &outcome, const auto [cc, cc_n] = ImageReferenceCC(outcome.reflections, reference, hkl_key_generator_, d_min_limit_, d_max_limit_, min_partiality_); - // Adopt the refined model only if it correlates with the reference at least as well as the model it - // replaces. Rejecting puts the crystal back exactly as it arrived, which is the same state a - // crystal with too few reflections to fit ends in. A CC that cannot be measured at all counts as - // worse, not as no opinion: ImageReferenceCC returns NaN when too few reflections clear the - // partiality cut, which is precisely what a refinement that collapsed the partialities produces - - // and adopting it would leave image_scale_cc NaN, on which --min-image-cc drops the image outright. - if (cc_before.has_value() && std::isfinite(*cc_before) && !(std::isfinite(cc) && cc >= *cc_before)) { - for (size_t i = 0; i < outcome.reflections.size(); ++i) { - outcome.reflections[i].partiality = before[i].first; - outcome.reflections[i].image_scale_corr = before[i].second; - } - outcome.image_scale_g = g_before; - return 0.0; // nothing adopted, so no tilt to report - } outcome.image_scale_cc = cc; outcome.image_scale_cc_n = cc_n; @@ -423,8 +432,67 @@ double StillsPartialityRefine::RefineOne(IntegrationOutcome &outcome, return tilt_deg; } +double StillsPartialityRefine::MeasureRadialScale(const std::vector &outcomes, + const std::optional &reference_cell, + double radial_scale) const { + // A scale of the reciprocal lattice - a wavelength, or a cell, a little off - leaves every spot where + // it was (positions fix only lambda d*), but moves each reflection's excitation error by + // eps lambda d*^2 / 2 for q -> (1 + eps) q, so the run's rocking curve sits off zero by an amount + // growing as d*^2. The prediction window is symmetric in de, so the intensity-weighted mean de of a + // shell is that offset, and a line through the origin in lambda d*^2 / 2 gives eps. A window that cuts + // an off-centre curve pulls the mean toward zero, so the caller iterates from the scale found. + const auto &indexing = experiment_.GetIndexingSettings(); + struct Point { double x, de, w; }; + std::vector pts; + double max_x = 0.0; + for (const auto &o: outcomes) { + if (!o.image_scale_g || !(*o.image_scale_g > 0.0)) + continue; + if (reference_cell && !o.latt.GetUnitCell().is_close(*reference_cell, indexing.GetUnitCellDistTolerance(), + indexing.GetUnitCellAngleTolerance_deg())) + continue; + const Coord S0 = o.geom.GetScatteringVector(); + const double inv_lambda = 1.0 / o.geom.GetWavelength_A(); + for (const auto &r: o.reflections) { + if (r.on_ice_ring || !AcceptReflection(r, d_min_limit_, d_max_limit_) || !(r.d > 0.0f)) + continue; + const double w = r.I * r.prescaling_corr * r.qe_corr * r.flight_corr / *o.image_scale_g; + if (!std::isfinite(w)) + continue; + const Coord q = (o.latt.Astar() * static_cast(r.h) + o.latt.Bstar() * static_cast(r.k) + + o.latt.Cstar() * static_cast(r.l)) * static_cast(radial_scale); + const double x = 0.5 / (inv_lambda * r.d * r.d); + pts.push_back({x, VecLen(q.x + S0.x, q.y + S0.y, q.z + S0.z) - inv_lambda, w}); + max_x = std::max(max_x, x); + } + } + constexpr int N_SHELLS = 8; + if (pts.size() < 100 * N_SHELLS) + return radial_scale; + std::array sw{}, swde{}, swx{}; + for (const auto &p: pts) { + const int b = std::min(N_SHELLS - 1, static_cast(p.x / max_x * N_SHELLS)); + sw[b] += p.w; + swde[b] += p.w * p.de; + swx[b] += p.w * p.x; + } + double sxy = 0.0, sxx = 0.0; + for (int b = 0; b < N_SHELLS; ++b) { + if (!(sw[b] > 0.0)) + continue; + const double x = swx[b] / sw[b], y = swde[b] / sw[b]; + sxy += sw[b] * x * y; + sxx += sw[b] * x * x; + } + if (!(sxx > 0.0) || !std::isfinite(sxy)) + return radial_scale; + // the slope is eps, removed by scaling q by (1 - eps) + return radial_scale * (1.0 - sxy / sxx); +} + std::optional StillsPartialityRefine::MeasureRunWidth( - const std::vector &outcomes, const std::optional &reference_cell) const { + const std::vector &outcomes, const std::optional &reference_cell, + double radial_scale, const RunWidth *window_width) const { // The rocking width measured on the crystals rather than on the prediction window. A lattice point // sits anywhere across the window with equal likelihood, while what it records is I_full * p(de), so // the intensity-weighted second moment of the excitation error, sum I de^2 / sum I, is the width s^2 @@ -433,8 +501,22 @@ std::optional StillsPartialityRefine::MeasureR // instead the window's own (W^2 / 3). Measured in shells of d*^2 over the whole run, where the // intensities of thousands of crystals average out, and fitted as s^2 = gamma0^2 + gamma_e^2 d*^2 + // (bandwidth_sigma lambda d*^2 / 2)^2. + // + // Each frame predicts through a window of its own (twice its profile radius), and these differ by an + // order of magnitude within a run. Pooled, the frames with the widest windows decide both moments, and + // the correction then reads their window: on a run whose windows are mostly narrower than the curve at + // high resolution, the pooled measurement came out as the window at every resolution, a width constant + // in d* that is several times too wide at low resolution. So within a shell the frames are taken in + // WINDOW_GROUPS groups of similar window, each measured against its own, and the shell's width is the + // median of the groups whose curve is narrower than their window; a shell where no group can see the + // curve is left out. + // + // A frame's window is the largest excitation error it predicted where it predicted through one width. + // Predicted through the run's width (window_width), the window is its formula at the reflection's own + // resolution: the frame's largest excitation error is then the high-resolution window, and taken as the + // window of its low-resolution reflections it put them in the wrong group. const auto &indexing = experiment_.GetIndexingSettings(); - struct Point { double x, de2, w, var_w; }; + struct Point { double x, de2, w, var_w, window; }; std::vector pts; for (const auto &o: outcomes) { if (!o.image_scale_g || !(*o.image_scale_g > 0.0)) @@ -442,6 +524,10 @@ std::optional StillsPartialityRefine::MeasureR if (reference_cell && !o.latt.GetUnitCell().is_close(*reference_cell, indexing.GetUnitCellDistTolerance(), indexing.GetUnitCellAngleTolerance_deg())) continue; + float frame_window = 0.0f; // the largest excitation error the frame predicted + for (const auto &r: o.reflections) + if (std::isfinite(r.dist_ewald)) + frame_window = std::max(frame_window, std::fabs(r.dist_ewald)); for (const auto &r: o.reflections) { if (r.on_ice_ring || !AcceptReflection(r, d_min_limit_, d_max_limit_)) continue; @@ -449,40 +535,135 @@ std::optional StillsPartialityRefine::MeasureR const double w = r.I * corr, sigma_w = r.sigma * corr; if (!std::isfinite(w) || !std::isfinite(sigma_w) || !std::isfinite(r.dist_ewald) || !(r.d > 0.0f)) continue; - pts.push_back({1.0 / (static_cast(r.d) * r.d), - static_cast(r.dist_ewald) * r.dist_ewald, w, sigma_w * sigma_w}); + // The excitation error the window was cut in is the prediction's; the curve's is taken at the + // run's radial scale (MeasureRadialScale), recomputed from the lattice when that is not one. + double de = r.dist_ewald; + if (radial_scale != 1.0) { + const Coord q = (o.latt.Astar() * static_cast(r.h) + o.latt.Bstar() * static_cast(r.k) + + o.latt.Cstar() * static_cast(r.l)) * static_cast(radial_scale); + const Coord S0 = o.geom.GetScatteringVector(); + de = VecLen(q.x + S0.x, q.y + S0.y, q.z + S0.z) - 1.0 / o.geom.GetWavelength_A(); + } + double window = frame_window; + if (window_width) { + // the formula at the reflection's d*, its bandwidth term at |q_z| = lambda d*^2 / 2 + const double dstar = 1.0 / r.d; + const double a = window_width->gamma_e * dstar; + const double b = window_width->bandwidth_sigma * o.geom.GetWavelength_A() * dstar * dstar / 2.0; + window = std::sqrt(window_width->gamma0 * window_width->gamma0 + a * a + b * b); + } + pts.push_back({1.0 / (static_cast(r.d) * r.d), de * de, w, sigma_w * sigma_w, window}); } } constexpr size_t N_SHELLS = 8; + constexpr size_t WINDOW_GROUPS = 4; if (pts.size() < 100 * N_SHELLS) return std::nullopt; std::sort(pts.begin(), pts.end(), [](const Point &a, const Point &b) { return a.x < b.x; }); Logger logger("StillsPartialityRefine"); - // A shell's moment is no better than the summed intensity it is weighted by, so a shell is used only - // where that sum is measured to 10 % (sum I / sigma(sum I) >= 10): the shells beyond the diffraction - // limit, where the sum is noise and can even be negative, say nothing about the width. + // A group's moment is no better than the summed intensity it is weighted by, so a group is used only + // where that sum is measured to 10 % (sum I / sigma(sum I) >= 10): beyond the diffraction limit the + // sum is noise and can even be negative, and says nothing about the width. constexpr double MIN_SHELL_SIGNAL = 10.0; + // The width of the points [lo, hi) of pts (sorted by d*): the median of the window groups' widths. + auto shell_width = [&](size_t lo, size_t hi) -> std::optional { + std::vector shell(pts.begin() + lo, pts.begin() + hi); + std::sort(shell.begin(), shell.end(), [](const Point &a, const Point &b) { return a.window < b.window; }); + std::vector widths; + for (size_t g = 0; g < WINDOW_GROUPS; ++g) { + const size_t glo = g * shell.size() / WINDOW_GROUPS, ghi = (g + 1) * shell.size() / WINDOW_GROUPS; + double sw = 0.0, svar = 0.0, swde2 = 0.0, sde2 = 0.0; + for (size_t i = glo; i < ghi; ++i) { + sw += shell[i].w; + svar += shell[i].var_w; + swde2 += shell[i].w * shell[i].de2; + sde2 += shell[i].de2; + } + if (!(sw >= MIN_SHELL_SIGNAL * std::sqrt(svar)) || !(swde2 > 0.0)) + continue; + if (const auto v = UntruncatedVariance(swde2 / sw, sde2 / static_cast(ghi - glo))) + widths.push_back(*v); + } + if (widths.empty()) + return std::nullopt; + std::sort(widths.begin(), widths.end()); + const size_t m = widths.size(); + return m % 2 ? widths[m / 2] : 0.5 * (widths[m / 2 - 1] + widths[m / 2]); + }; + + // For the three-term formula (the prediction window): shells of equal count in d*^2. std::vector sx, sy; for (size_t k = 0; k < N_SHELLS; ++k) { - double sw = 0.0, svar = 0.0, swde2 = 0.0, sde2 = 0.0, sumx = 0.0; const size_t lo = k * pts.size() / N_SHELLS, hi = (k + 1) * pts.size() / N_SHELLS; - for (size_t i = lo; i < hi; ++i) { - sw += pts[i].w; - svar += pts[i].var_w; - swde2 += pts[i].w * pts[i].de2; - sde2 += pts[i].de2; - sumx += pts[i].x; - } - const double n = static_cast(hi - lo); - if (!(sw >= MIN_SHELL_SIGNAL * std::sqrt(svar)) || !(swde2 > 0.0)) + const auto y = shell_width(lo, hi); + if (!y) continue; - const double x = sumx / n, y = UntruncatedVariance(swde2 / sw, sde2 / n); + double sumx = 0.0; + for (size_t i = lo; i < hi; ++i) + sumx += pts[i].x; + const double x = sumx / static_cast(hi - lo); sx.push_back(x); - sy.push_back(y); - logger.Debug("Stills rocking width at d = {:.2f} A: {:.2e} 1/A ({:.3f} deg), I/sigma {:.0f}", 1.0 / std::sqrt(x), - std::sqrt(y), std::sqrt(y / x) * kRadToDeg, sw / std::sqrt(svar)); + sy.push_back(*y); + logger.Debug("Stills rocking width at d = {:.2f} A: {:.2e} 1/A ({:.3f} deg)", + 1.0 / std::sqrt(x), std::sqrt(*y), std::sqrt(*y / x) * kRadToDeg); } + + // For the partiality: shells of equal width in d*, kept as a table. Equal-count shells crowd where + // the reflections are - on a run predicting ~1000 reflections a frame, all eight sat at 3.8-1.8 A, so + // the low-resolution width was the formula's extrapolation, and the three-term fit flipped between + // forms with the number of frames (to a pure bandwidth at 50k frames). Measured where it is used and + // interpolated, the width needs no form. A wider curve at finer resolution is the physics (every term + // grows with d*), so the table is made non-decreasing (pool adjacent violators, weighted by the + // shells' summed signal). + std::vector table_dstar, table_s, table_weight; + { + const double lo_d = std::sqrt(pts.front().x), hi_d = std::sqrt(pts.back().x); + size_t lo = 0; + for (size_t k = 0; k < N_SHELLS; ++k) { + const double edge = lo_d + (hi_d - lo_d) * static_cast(k + 1) / N_SHELLS; + size_t hi = lo; + while (hi < pts.size() && (k + 1 == N_SHELLS || std::sqrt(pts[hi].x) < edge)) + ++hi; + double sw = 0.0, svar = 0.0, sds = 0.0; + for (size_t i = lo; i < hi; ++i) { + sw += pts[i].w; + svar += pts[i].var_w; + sds += std::sqrt(pts[i].x); + } + if (hi - lo >= 400 && sw >= MIN_SHELL_SIGNAL * std::sqrt(svar)) + if (const auto y = shell_width(lo, hi)) { + table_dstar.push_back(sds / static_cast(hi - lo)); + table_s.push_back(std::sqrt(*y)); + table_weight.push_back(sw / std::sqrt(svar)); + } + lo = hi; + } + std::vector block_s, block_w; + std::vector block_n; + for (size_t i = 0; i < table_s.size(); ++i) { + block_s.push_back(table_s[i]); + block_w.push_back(table_weight[i]); + block_n.push_back(1); + while (block_s.size() > 1 && block_s[block_s.size() - 2] > block_s.back()) { + const size_t j = block_s.size() - 2; + block_s[j] = (block_s[j] * block_w[j] + block_s.back() * block_w.back()) / (block_w[j] + block_w.back()); + block_w[j] += block_w.back(); + block_n[j] += block_n.back(); + block_s.pop_back(); + block_w.pop_back(); + block_n.pop_back(); + } + } + table_s.clear(); + for (size_t j = 0; j < block_s.size(); ++j) + table_s.insert(table_s.end(), block_n[j], block_s[j]); + if (table_dstar.size() < 3) { + table_dstar.clear(); + table_s.clear(); + } + } + if (sx.size() < 3) return std::nullopt; @@ -525,14 +706,22 @@ std::optional StillsPartialityRefine::MeasureR return std::nullopt; // The d*^4 term is a bandwidth: its radial smear bw |q_z|, with |q_z| = lambda d*^2 / 2 on the sphere. const RunWidth width{.gamma0 = std::sqrt(best[0]), .gamma_e = std::sqrt(best[1]), - .bandwidth_sigma = 2.0 * std::sqrt(best[2]) / experiment_.GetWavelength_A()}; + .bandwidth_sigma = 2.0 * std::sqrt(best[2]) / experiment_.GetWavelength_A(), + .radial_scale = radial_scale, .table_dstar = table_dstar, .table_s = table_s}; logger.Info("Stills rocking width measured: {:.2e} 1/A + {:.3f} deg angular + {:.4f} bandwidth (FWHM)", width.gamma0, width.gamma_e * kRadToDeg, width.bandwidth_sigma * 2.3548); + std::string table; + for (size_t i = 0; i < table_dstar.size(); ++i) + table += fmt::format(" {:.2f} A {:.2e}", 1.0 / table_dstar[i], table_s[i]); + logger.Info("Stills rocking width for the partiality, against resolution (1/A):{}", + table.empty() ? " none, the formula is used" : table); return width; } double StillsPartialityRefine::Run(std::vector &outcomes, size_t nthreads, - const std::optional &reference_cell) const { + const std::optional &reference_cell, + const std::optional &given_width, + std::optional *used_width) const { const auto &indexing = experiment_.GetIndexingSettings(); auto merged_crystal = [&](const IntegrationOutcome &o) { return !reference_cell || o.latt.GetUnitCell().is_close(*reference_cell, @@ -544,7 +733,22 @@ double StillsPartialityRefine::Run(std::vector &outcomes, si nthreads = std::max(1, nthreads); double last_mean_tilt = 0.0; - const auto run_width = MeasureRunWidth(outcomes, reference_cell); + // Where the frames were predicted through a curve measured before the image pass, the partialities use + // that same curve. Measured again here, through windows that follow it, the width reads narrower at low + // resolution (its constant term falls to about zero), and the merge it gave moved R-free against the + // models by up to +-0.015 per run in both directions, where the one curve moved it by at most +0.008. + std::optional run_width = given_width; + if (!run_width) { + double radial_scale = 1.0; + for (int i = 0; i < 3; ++i) + radial_scale = MeasureRadialScale(outcomes, reference_cell, radial_scale); + Logger("StillsPartialityRefine").Info("Stills rocking curve centre: reciprocal lattice scaled by {:+.2e}", + radial_scale - 1.0); + run_width = MeasureRunWidth(outcomes, reference_cell, radial_scale); + } + const double radial_scale = run_width ? run_width->radial_scale : 1.0; + if (used_width) + *used_width = run_width; for (int outer = 0; outer < settings_.outer_iterations; ++outer) { // Reference full intensities from the current corrections. @@ -560,7 +764,7 @@ double StillsPartialityRefine::Run(std::vector &outcomes, si auto worker = [&]() { size_t i = next.fetch_add(1); while (i < outcomes.size()) { - const double t = merged_crystal(outcomes[i]) ? RefineOne(outcomes[i], reference, run_width) : 0.0; + const double t = merged_crystal(outcomes[i]) ? RefineOne(outcomes[i], reference, run_width, radial_scale) : 0.0; if (t > 0.0) { double prev = tilt_sum.load(); while (!tilt_sum.compare_exchange_weak(prev, prev + t)) {} diff --git a/image_analysis/scale_merge/StillsPartialityRefine.h b/image_analysis/scale_merge/StillsPartialityRefine.h index a3600f0ca..9ba83f1bd 100644 --- a/image_analysis/scale_merge/StillsPartialityRefine.h +++ b/image_analysis/scale_merge/StillsPartialityRefine.h @@ -7,6 +7,7 @@ #include #include "../../common/DiffractionExperiment.h" +#include "../../common/StillsRunWidth.h" #include "../IntegrationOutcome.h" #include "HKLKey.h" @@ -45,20 +46,34 @@ public: explicit StillsPartialityRefine(const DiffractionExperiment &x); + // The run's rocking width (common/StillsRunWidth.h): the three-term formula, which the prediction + // window uses, and the table in d* the partiality uses where it is not empty; measured from the + // intensity-weighted excitation errors with the reciprocal lattice scaled by radial_scale (the curve's + // centre, MeasureRadialScale); empty when the run has too few reflections to measure it. + using RunWidth = StillsRunWidth; + // Refine all crystals in place. Returns the mean |dpsi| applied (degrees), for diagnostics. // Only the crystals whose cell is close to reference_cell (all without one) are refined and make the - // reference: the others are not merged. + // reference: the others are not merged. The partiality width is run_width where one is given (the + // width the frames were predicted with), else measured here (MeasureRunWidth); the one used is put in + // used_width where that is given. double Run(std::vector &outcomes, size_t nthreads, - const std::optional &reference_cell) const; - - // The run's rocking width, sigma^2 = gamma0^2 + (gamma_e d*)^2 + (bandwidth_sigma |q_z|)^2 (1/A, rad, - // relative), measured from the intensity-weighted excitation errors; empty when the run has too - // few reflections to measure it. - struct RunWidth { - double gamma0, gamma_e, bandwidth_sigma; - }; + const std::optional &reference_cell, + const std::optional &run_width = std::nullopt, + std::optional *used_width = nullptr) const; + // window: the width the frames were predicted through (|dist_ewald| <= k times its formula at the + // reflection's d*), where they were; without one each frame's window is taken as the largest excitation + // error it predicted. std::optional MeasureRunWidth(const std::vector &outcomes, - const std::optional &reference_cell) const; + const std::optional &reference_cell, + double radial_scale = 1.0, + const RunWidth *window = nullptr) const; + + // The run's radial scale of the reciprocal lattice (a wavelength or cell scale the spot positions cannot + // see), measured from where the rocking curve is centred against d*^2: one step from radial_scale, so + // call it a few times. Returns radial_scale unchanged when the run has too few reflections. + double MeasureRadialScale(const std::vector &outcomes, + const std::optional &reference_cell, double radial_scale) const; private: const DiffractionExperiment experiment_; @@ -72,5 +87,5 @@ private: // Refine one crystal against the reference map; returns |dpsi| in degrees (0 if skipped). double RefineOne(IntegrationOutcome &outcome, const std::map &reference, - const std::optional &run_width) const; + const std::optional &run_width, double radial_scale) const; }; diff --git a/image_analysis/structure_refinement/CMakeLists.txt b/image_analysis/structure_refinement/CMakeLists.txt index 62ac58f77..d9cf337f4 100644 --- a/image_analysis/structure_refinement/CMakeLists.txt +++ b/image_analysis/structure_refinement/CMakeLists.txt @@ -16,7 +16,52 @@ ADD_LIBRARY(JFJochStructureRefinement STATIC $<$:ModelStructureFactorsGPU.cu> ModelStructureFactorsGPU.h ModelStructureFactorsGPUEngine.h $<$:ModelScaleGPU.cu> ModelScaleGPU.h - SigmaA.cpp SigmaA.h) + SigmaA.cpp SigmaA.h + MonomerLibrary.cpp MonomerLibrary.h + RefinementMath.h RefinementMinimiser.h + RefinementRestraints.cpp RefinementRestraints.h + RefinementXray.cpp RefinementXray.h + Refinement.cpp Refinement.h + DensityBlobs.cpp DensityBlobs.h + $<$:RefinementGPU.cpp> + $<$:RefinementGPU.cu> + RefinementGPU.h RefinementGPUEngine.h + ${CMAKE_CURRENT_BINARY_DIR}/MonomerLibraryData.cpp) + +# The subset of the CCP4 Monomer Library that refinement restrains with (monomers/, chosen by +# monomers/update_monomers.py), carried in the binary so that nothing is read from disk: every .cif of the +# directory as a string, cut into pieces of at most 12000 characters - under the 16380 a single literal may +# hold with MSVC - which MonomerLibrary.cpp joins again. A .cif added or edited re-runs the configure. +FILE(GLOB MONOMER_CIFS ${CMAKE_CURRENT_SOURCE_DIR}/monomers/*.cif) +SET_PROPERTY(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${MONOMER_CIFS} ${CMAKE_CURRENT_SOURCE_DIR}/monomers) +SET(monomer_source "// Generated from image_analysis/structure_refinement/monomers by its CMakeLists.txt - do not edit.\n") +STRING(APPEND monomer_source "#include \"MonomerLibrary.h\"\n\n") +SET(monomer_table "") +SET(monomer_count 0) +FOREACH(cif ${MONOMER_CIFS}) + GET_FILENAME_COMPONENT(cif_name ${cif} NAME) + FILE(READ ${cif} text) + STRING(LENGTH "${text}" text_length) + SET(pieces "") + SET(n_pieces 0) + SET(offset 0) + WHILE(offset LESS text_length) + STRING(SUBSTRING "${text}" ${offset} 12000 piece) + STRING(APPEND pieces "R\"MONLIB(${piece})MONLIB\",\n") + MATH(EXPR offset "${offset} + 12000") + MATH(EXPR n_pieces "${n_pieces} + 1") + ENDWHILE() + STRING(APPEND monomer_source "static const char *const file_${monomer_count}[] = {\n${pieces}};\n") + STRING(APPEND monomer_table " {\"${cif_name}\", file_${monomer_count}, ${n_pieces}},\n") + MATH(EXPR monomer_count "${monomer_count} + 1") +ENDFOREACH() +STRING(APPEND monomer_source "\nextern const EmbeddedMonomerFile embedded_monomer_files[] = {\n${monomer_table}};\n") +STRING(APPEND monomer_source "extern const size_t embedded_monomer_file_count = ${monomer_count};\n") +# Written only when it changed, so a configure does not rebuild the library. +FILE(WRITE ${CMAKE_CURRENT_BINARY_DIR}/MonomerLibraryData.cpp.tmp "${monomer_source}") +CONFIGURE_FILE(${CMAKE_CURRENT_BINARY_DIR}/MonomerLibraryData.cpp.tmp + ${CMAKE_CURRENT_BINARY_DIR}/MonomerLibraryData.cpp COPYONLY) +TARGET_INCLUDE_DIRECTORIES(JFJochStructureRefinement PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) # JFJochIndexing for CUDAMemHelpers.h and, under CUDA, to put cuFFT (RigidBodyGPU.cu) after these # objects on the link line. diff --git a/image_analysis/structure_refinement/DensityBlobs.cpp b/image_analysis/structure_refinement/DensityBlobs.cpp new file mode 100644 index 000000000..b2a9b7fb9 --- /dev/null +++ b/image_analysis/structure_refinement/DensityBlobs.cpp @@ -0,0 +1,131 @@ +// SPDX-FileCopyrightText: 2026 Filip Leonarski, Paul Scherrer Institute +// SPDX-License-Identifier: GPL-3.0-only + +#include "DensityBlobs.h" + +#include +#include + +#include "gemmi/blob.hpp" +#include "gemmi/neighbor.hpp" + +namespace { + +constexpr double CUTOFF_SIGMA = 3.0; +constexpr double PEAK_SIGMA = 4.0; +// Closer than this to a model atom, the density is the model's own atom out of place. +constexpr double MODEL_ERROR_DISTANCE = 1.6; +// Waters and ions sit at least this far from the model's atoms. +constexpr double CONTACT_MIN = 2.2; +// An ion's peak, in sigma, where the anomalous map gives no help (with two metal-like contacts); an anomalous +// peak this high says heavier than water on its own. +constexpr double ION_PEAK_SIGMA = 8.0; +constexpr double ION_ANOMALOUS_SIGMA = 4.0; +// The smallest blob called ligand-like, A^3, and at low resolution one and a half of the resolution's spheres: at +// high resolution a strong single atom's blob already spans several of them. +constexpr double LIGAND_MIN_VOLUME = 8.0; + +bool Polar(const gemmi::Element &el) { + return el == gemmi::El::N || el == gemmi::El::O; +} + +} // namespace + +const char *DensityBlobKindName(DensityBlob::Kind kind) { + switch (kind) { + case DensityBlob::Kind::Water: return "WATER"; + case DensityBlob::Kind::Ion: return "ION"; + case DensityBlob::Kind::Ligand: return "LIGAND"; + case DensityBlob::Kind::ModelError: return "MODEL_ERROR"; + case DensityBlob::Kind::Unassigned: break; + } + return "UNASSIGNED"; +} + +DensityBlobsMessage DensityBlobsToMessage(const std::vector &blobs) { + DensityBlobsMessage m; + for (const DensityBlob &b : blobs) { + m.kind.emplace_back(DensityBlobKindName(b.kind)); + m.x.push_back(b.centroid.x); + m.y.push_back(b.centroid.y); + m.z.push_back(b.centroid.z); + m.peak_sigma.push_back(b.peak_sigma); + m.volume.push_back(b.volume); + m.score.push_back(b.score); + m.nearest_atom.push_back(b.nearest_atom); + m.nearest_atom_distance.push_back(b.nearest_atom_distance); + m.polar_contacts.push_back(b.polar_contacts); + m.metal_contacts.push_back(b.metal_contacts); + m.anomalous_sigma.push_back(b.anomalous_sigma); + } + return m; +} + +// Following Coot's unmodelled blobs, Emsley et al. (2010) Acta Cryst. D66, 486-501 +std::vector FindDensityBlobs(const gemmi::Grid &difference, double rms, const gemmi::Structure &model, + double d_min, const gemmi::Grid *anomalous, double anomalous_rms) { + std::vector out; + if (!(rms > 0) || model.models.empty()) + return out; + gemmi::Grid map = difference; + for (float &v : map.data) + v = static_cast(v / rms); + gemmi::BlobCriteria criteria; + criteria.cutoff = CUTOFF_SIGMA; + criteria.min_volume = 0.0; + criteria.min_score = 0.0; + criteria.min_peak = PEAK_SIGMA; + const std::vector blobs = gemmi::find_blobs_by_flood_fill(map, criteria); + + gemmi::Model copy = model.models[0]; + gemmi::UnitCell cell = map.unit_cell; + cell.set_cell_images_from_spacegroup(map.spacegroup); + gemmi::NeighborSearch ns(copy, cell, 5.0); + ns.populate(false); + // A single atom's blob at this resolution: a sphere of half the resolution's radius. + const double atom_volume = 4.0 / 3.0 * 3.14159265358979 * std::pow(0.5 * d_min, 3); + + for (const gemmi::Blob &b : blobs) { + DensityBlob d; + d.peak_sigma = b.peak_value; + d.volume = b.volume; + d.score = b.score; + d.centroid = b.centroid; + // the copy of the blob beside the atom nearest to it + if (gemmi::NeighborSearch::Mark *m = ns.find_nearest_atom(b.centroid, 12.0)) { + const gemmi::CRA cra = m->to_cra(copy); + const gemmi::FTransform t = ns.get_image_transformation(m->image_idx); + const gemmi::Fractional fc = cell.fractionalize(b.centroid); + const gemmi::Fractional fi = t.apply(cell.fractionalize(cra.atom->pos)); + const gemmi::Fractional shifted(fc.x - std::round(fc.x - fi.x), fc.y - std::round(fc.y - fi.y), + fc.z - std::round(fc.z - fi.z)); + d.centroid = cell.orthogonalize(gemmi::FTransform(t.inverse()).apply(shifted)); + d.nearest_atom_distance = d.centroid.dist(cra.atom->pos); + d.nearest_atom = cra.atom->name + " " + cra.residue->name + " " + cra.chain->name + + cra.residue->seqid.str(); + } else + d.nearest_atom_distance = INFINITY; + ns.for_each(d.centroid, '\0', 3.4, [&](gemmi::NeighborSearch::Mark &m, double dist_sq) { + const double r = std::sqrt(dist_sq); + if (Polar(m.element) && r >= 2.4) + d.polar_contacts++; + if ((Polar(m.element) || m.element == gemmi::El::S) && r >= 1.8 && r <= 2.6) + d.metal_contacts++; + }); + if (anomalous != nullptr && anomalous_rms > 0) + d.anomalous_sigma = anomalous->interpolate_value(b.peak_pos) / anomalous_rms; + + if (d.nearest_atom_distance < MODEL_ERROR_DISTANCE) + d.kind = DensityBlob::Kind::ModelError; + else if (d.nearest_atom_distance >= 1.8 && + (d.anomalous_sigma >= ION_ANOMALOUS_SIGMA || (d.metal_contacts >= 2 && d.peak_sigma >= ION_PEAK_SIGMA))) + d.kind = DensityBlob::Kind::Ion; + else if (d.volume > std::max(1.5 * atom_volume, LIGAND_MIN_VOLUME) && d.nearest_atom_distance >= CONTACT_MIN) + d.kind = DensityBlob::Kind::Ligand; + else if (d.nearest_atom_distance >= CONTACT_MIN && d.polar_contacts >= 1) + d.kind = DensityBlob::Kind::Water; + out.push_back(d); + } + std::sort(out.begin(), out.end(), [](const DensityBlob &a, const DensityBlob &b) { return a.score > b.score; }); + return out; +} diff --git a/image_analysis/structure_refinement/DensityBlobs.h b/image_analysis/structure_refinement/DensityBlobs.h new file mode 100644 index 000000000..499aa37af --- /dev/null +++ b/image_analysis/structure_refinement/DensityBlobs.h @@ -0,0 +1,46 @@ +// SPDX-FileCopyrightText: 2026 Filip Leonarski, Paul Scherrer Institute +// SPDX-License-Identifier: GPL-3.0-only + +#pragma once + +#include +#include + +#include "gemmi/grid.hpp" +#include "gemmi/model.hpp" + +#include "../../common/JFJochMessages.h" + +// What a model leaves unexplained: the connected regions of positive mFo-DFc density above a cutoff ("blobs"), +// each placed beside the model, measured and given a likely reading - a water, an ion, something ligand-sized, +// or an error of the model itself (a misplaced or missing atom, an alternative conformation). +// +// The readings are rules on what is measured, meant to point a person at the density, not to identify a +// compound: a blob called LIGAND is density of ligand size and shape where the model has nothing, which a +// buffer molecule or an unmodelled side chain can be as well as the compound that was soaked. +struct DensityBlob { + enum class Kind { Water, Ion, Ligand, ModelError, Unassigned }; + Kind kind = Kind::Unassigned; + gemmi::Position centroid; // the copy nearest the model + double peak_sigma = 0; // the highest point, in the map's rms + double volume = 0; // A^3 above the cutoff + double score = 0; // the density above the cutoff integrated, sigma A^3 + double nearest_atom_distance = 0; + std::string nearest_atom; // e.g. "OG1 THR A42" + int polar_contacts = 0; // N or O of the model at 2.4-3.4 A + int metal_contacts = 0; // N, O or S of the model at 1.8-2.6 A + double anomalous_sigma = 0; // the anomalous difference map at the peak, 0 where there is none +}; + +const char *DensityBlobKindName(DensityBlob::Kind kind); + +// The blobs as the end message carries them to the writer, for _blobs.json. +DensityBlobsMessage DensityBlobsToMessage(const std::vector &blobs); + +// The blobs of `difference` (an mFo-DFc map of the whole cell, rms `rms`) above 3 sigma that peak above 4 sigma, +// strongest (by score) first. `model`: what the map was made from, in the map's cell. `anomalous`: the anomalous +// difference map on any grid of the same cell, or null. Following the flood fill of Coot's unmodelled blobs as +// gemmi implements it (find_blobs_by_flood_fill). +std::vector FindDensityBlobs(const gemmi::Grid &difference, double rms, const gemmi::Structure &model, + double d_min, const gemmi::Grid *anomalous = nullptr, + double anomalous_rms = 0); diff --git a/image_analysis/structure_refinement/ModelDensityGPU.cu b/image_analysis/structure_refinement/ModelDensityGPU.cu index 30bd7dd38..a60879d06 100644 --- a/image_analysis/structure_refinement/ModelDensityGPU.cu +++ b/image_analysis/structure_refinement/ModelDensityGPU.cu @@ -4,6 +4,7 @@ #include "ModelDensityGPU.h" #include +#include #include #include @@ -21,6 +22,7 @@ constexpr int BRICK = 8; // the gather's bricks are BRICK^3 gri constexpr int GATHER_TILE = 128; // atoms staged in shared memory at a time constexpr int MAX_BRICKS_PER_AXIS = 16; // an atom's box touches at most this many bricks along an axis constexpr int THREADS = 256; +constexpr int SORT_ATOMS = 4096; // a brick's atoms are sorted in shared memory up to this many __device__ __forceinline__ int imod(int a, int n) { const int r = a % n; @@ -64,58 +66,97 @@ __device__ void atom_bricks(const float4 &pos, const int *box, int nu, int nv, i nbw = axis_bricks(__float2int_rn(pos.z), box[2], nw, bw); } -__global__ void count_pairs_kernel(const float4 *pos, const int *box, int n, int nu, int nv, int nw, int *count, - int *overflow) { +// How many atoms touch each brick: integer atomics, whose sum does not depend on their order. +__global__ void count_bricks_kernel(const float4 *pos, const int *box, int n, int nu, int nv, int nw, int *brick_count) { const int i = blockIdx.x * blockDim.x + threadIdx.x; - if (i > n) + if (i >= n) return; - if (i == n) { - count[n] = 0; // so the exclusive scan's last entry is the total - return; - } int bu[MAX_BRICKS_PER_AXIS], bv[MAX_BRICKS_PER_AXIS], bw[MAX_BRICKS_PER_AXIS], a, b, c; atom_bricks(pos[i], box + 3 * i, nu, nv, nw, bu, a, bv, b, bw, c); - if (a < 0 || b < 0 || c < 0) { - *overflow = 1; - a = b = c = 0; - } - count[i] = a * b * c; + const int nbu = (nu + BRICK - 1) / BRICK, nbv = (nv + BRICK - 1) / BRICK; + for (int k = 0; k < c; k++) + for (int j = 0; j < b; j++) + for (int l = 0; l < a; l++) + atomicAdd(brick_count + bu[l] + nbu * (bv[j] + nbv * bw[k]), 1); } -// The (brick, atom) pairs, atom-major: sorted stably by brick, each brick's atoms stay in model order. -__global__ void fill_pairs_kernel(const float4 *pos, const int *box, int n, int nu, int nv, int nw, - const int *offset, int *key, int *value) { +// Each atom into the segments of the bricks it touches, at whatever place in the segment the atomic hands out: +// the order within a brick is settled by order_bricks_kernel. +__global__ void fill_bricks_kernel(const float4 *pos, const int *box, int n, int nu, int nv, int nw, + const int *brick_start, int *brick_fill, int *pair_atom) { const int i = blockIdx.x * blockDim.x + threadIdx.x; if (i >= n) return; int bu[MAX_BRICKS_PER_AXIS], bv[MAX_BRICKS_PER_AXIS], bw[MAX_BRICKS_PER_AXIS], a, b, c; atom_bricks(pos[i], box + 3 * i, nu, nv, nw, bu, a, bv, b, bw, c); const int nbu = (nu + BRICK - 1) / BRICK, nbv = (nv + BRICK - 1) / BRICK; - int o = offset[i]; for (int k = 0; k < c; k++) for (int j = 0; j < b; j++) for (int l = 0; l < a; l++) { - key[o] = bu[l] + nbu * (bv[j] + nbv * bw[k]); - value[o] = i; - o++; + const int brick = bu[l] + nbu * (bv[j] + nbv * bw[k]); + pair_atom[brick_start[brick] + atomicAdd(brick_fill + brick, 1)] = i; } } -__global__ void brick_ranges_kernel(const int *key, int npairs, int *start, int *end) { - const int i = blockIdx.x * blockDim.x + threadIdx.x; - if (i >= npairs) +// Each brick's atoms into model order, one block per brick: a bitonic sort of the segment in shared memory, +// padded to a power of two, for the bricks of up to SORT_ATOMS atoms. A larger brick is ranked instead: an +// atom's place is the number of the brick's atoms with a lower index (an atom is in a brick once), counted +// against the segment staged a tile at a time, a pair staying with one thread through the tiles. +__global__ void order_bricks_kernel(const int *unordered, const int *brick_start, int *rank, int *pair_atom) { + const int brick = blockIdx.x; + const int s = brick_start[brick], e = brick_start[brick + 1], k = e - s; + __shared__ int keys[SORT_ATOMS]; + if (k <= SORT_ATOMS) { + int n = 1; + while (n < k) + n <<= 1; + for (int t = threadIdx.x; t < n; t += THREADS) + keys[t] = t < k ? unordered[s + t] : INT_MAX; + __syncthreads(); + for (int size = 2; size <= n; size <<= 1) + for (int stride = size >> 1; stride > 0; stride >>= 1) { + for (int t = threadIdx.x; t < n / 2; t += THREADS) { + const int i = 2 * t - (t & (stride - 1)), j = i + stride; + const int a = keys[i], b = keys[j]; + if ((a > b) == ((i & size) == 0)) { + keys[i] = b; + keys[j] = a; + } + } + __syncthreads(); + } + for (int t = threadIdx.x; t < k; t += THREADS) + pair_atom[s + t] = keys[t]; return; - const int k = key[i]; - if (i == 0 || key[i - 1] != k) - start[k] = i; - if (i == npairs - 1 || key[i + 1] != k) - end[k] = i + 1; + } + for (int c = s; c < e; c += THREADS) { + const int m = min(THREADS, e - c); + __syncthreads(); + if (threadIdx.x < m) + keys[threadIdx.x] = unordered[c + threadIdx.x]; + __syncthreads(); + for (int p = s + threadIdx.x; p < e; p += THREADS) { + const int atom = unordered[p]; + int below = 0; + for (int q = 0; q < m; q++) + below += keys[q] < atom; + rank[p] = (c == s ? 0 : rank[p]) + below; + } + } + for (int p = s + threadIdx.x; p < e; p += THREADS) + pair_atom[s + rank[p]] = unordered[p]; } -// An atom's box as the gather tests it: its first point, unwrapped (c - d) and wrapped into the grid, and its -// width less one (2 d), along each axis; and its centre in grid units. -struct GatherBox { - int lo[3], first[3], span[3]; +// What the gather needs of one staged atom: its isotropic Gaussians (an anisotropic atom's matrices are read +// from the atoms in global memory), and its box as the brick sees it - a bit per point of the brick along each +// axis for whether the point is in the box, and for the points that are, what gemmi's box offset makes of them: +// the point's unwrapped box index is base + t, less n where t reaches wrap. +struct GatherAtom { + float a[5], b[5]; + float occ, max_r2; + int index, aniso; + int masks; // bits 0-7: u, 8-15: v, 16-23: w + int base[3], wrap[3]; float nctr[3]; }; @@ -137,51 +178,61 @@ __global__ void gather_kernel(const ModelDensityAtom *atoms, const float4 *pos, const int nbu = (g.nu + BRICK - 1) / BRICK, nbv = (g.nv + BRICK - 1) / BRICK; const int brick = blockIdx.x; const int s = brick_start[brick], e = brick_end[brick]; // s == e: an empty brick, written as zeros - const int u = (brick % nbu) * BRICK + threadIdx.x, v = (brick / nbu % nbv) * BRICK + threadIdx.y, - w = (brick / (nbu * nbv)) * BRICK + threadIdx.z; + const int origin[3] = {(brick % nbu) * BRICK, (brick / nbu % nbv) * BRICK, (brick / (nbu * nbv)) * BRICK}; + const int tu = threadIdx.x, tv = threadIdx.y, tw = threadIdx.z; + const int u = origin[0] + tu, v = origin[1] + tv, w = origin[2] + tw; const bool inside = u < g.nu && v < g.nv && w < g.nw; - const int tid = threadIdx.x + BRICK * (threadIdx.y + BRICK * threadIdx.z); + const int tid = tu + BRICK * (tv + BRICK * tw); const int n3[3] = {g.nu, g.nv, g.nw}; - constexpr int WORDS = sizeof(ModelDensityAtom) / sizeof(int); - __shared__ int sh_index[GATHER_TILE]; - __shared__ ModelDensityAtom sh_atom[GATHER_TILE]; - __shared__ GatherBox sh_box[GATHER_TILE]; + __shared__ GatherAtom sh[GATHER_TILE]; float acc = 0.0f; for (int c = s; c < e; c += GATHER_TILE) { const int m = min(GATHER_TILE, e - c); __syncthreads(); if (tid < m) { const int a = pair_atom[c + tid]; - sh_index[tid] = a; + const ModelDensityAtom &at = atoms[a]; const float4 p = pos[a]; const float nctr[3] = {p.x, p.y, p.z}; - GatherBox &b = sh_box[tid]; + GatherAtom &r = sh[tid]; + for (int q = 0; q < 5; q++) { + r.a[q] = at.a[q]; + r.b[q] = at.b[q][0]; + } + r.occ = at.occ; + r.max_r2 = at.max_r2; + r.index = a; + r.aniso = at.aniso; + r.masks = 0; for (int k = 0; k < 3; k++) { const int d = box[3 * a + k]; - b.lo[k] = __float2int_rn(nctr[k]) - d; - b.first[k] = imod(b.lo[k], n3[k]); - b.span[k] = 2 * d; - b.nctr[k] = nctr[k]; + const int lo = __float2int_rn(nctr[k]) - d, first = imod(lo, n3[k]), span = 2 * d; + const int m0 = box_offset(origin[k], first, n3[k]); + for (int t = 0; t < BRICK; t++) { + const int mt = m0 + t; + if ((mt < n3[k] ? mt : mt - n3[k]) <= span) + r.masks |= 1 << (8 * k + t); + } + r.base[k] = lo + m0; + r.wrap[k] = n3[k] - m0; + r.nctr[k] = nctr[k]; } } __syncthreads(); - for (int i = tid; i < m * WORDS; i += BRICK * BRICK * BRICK) - reinterpret_cast(sh_atom)[i] = reinterpret_cast(atoms + sh_index[i / WORDS])[i % WORDS]; - __syncthreads(); if (!inside) continue; for (int k = 0; k < m; k++) { - const GatherBox &b = sh_box[k]; - const int mu = box_offset(u, b.first[0], g.nu), mv = box_offset(v, b.first[1], g.nv), - mw = box_offset(w, b.first[2], g.nw); - if (mu > b.span[0] || mv > b.span[1] || mw > b.span[2]) + const GatherAtom &at = sh[k]; + if (!((at.masks >> tu) & (at.masks >> (8 + tv)) & (at.masks >> (16 + tw)) & 1)) continue; - const ModelDensityAtom &at = sh_atom[k]; + const int pu = at.base[0] + tu - (tu >= at.wrap[0] ? g.nu : 0); + const int pv = at.base[1] + tv - (tv >= at.wrap[1] ? g.nv : 0); + const int pw = at.base[2] + tw - (tw >= at.wrap[2] ? g.nw : 0); // f = centre - (u, v, w) in the box's own (unwrapped) indices, then in A, as the CPU walks it - const float fx = b.nctr[0] - static_cast(b.lo[0] + mu); - const float fy = b.nctr[1] - static_cast(b.lo[1] + mv); - const float fz = b.nctr[2] - static_cast(b.lo[2] + mw); + const float fx = at.nctr[0] - static_cast(pu); + const float fy = at.nctr[1] - static_cast(pv); + const float fz = at.nctr[2] - static_cast(pw); const float z = g.m22 * fz; const float y = g.m11 * fy + g.m12 * fz; const float yz = y * y + z * z; @@ -192,10 +243,10 @@ __global__ void gather_kernel(const ModelDensityAtom *atoms, const float4 *pos, float density = 0.0f; if (!at.aniso) { for (int q = 0; q < 5; q++) - density += at.a[q] * expapprox(fmaxf(at.b[q][0] * r2, -88.f)); + density += at.a[q] * expapprox(fmaxf(at.b[q] * r2, -88.f)); } else { for (int q = 0; q < 5; q++) { - const float *bq = at.b[q]; + const float *bq = atoms[at.index].b[q]; // gemmi's SMat33::r_u_r(), in its order const float rur = x * x * bq[0] + y * y * bq[1] + z * z * bq[2] + 2 * (x * y * bq[3] + x * z * bq[4] + y * z * bq[5]); @@ -213,15 +264,12 @@ int blocks(size_t n) { return static_cast((n + THREADS - 1) / THREADS); } -// cub's temporary storage for the pair scan and sort at the capacity. -size_t CubBytes(size_t atoms, size_t pairs) { - size_t scan = 0, sort = 0; +// cub's temporary storage for the scan over the bricks. +size_t CubBytes(size_t bricks) { + size_t scan = 0; cuda_err(cub::DeviceScan::ExclusiveSum(nullptr, scan, static_cast(nullptr), static_cast(nullptr), - static_cast(atoms + 1))); - cuda_err(cub::DeviceRadixSort::SortPairs(nullptr, sort, static_cast(nullptr), static_cast(nullptr), - static_cast(nullptr), static_cast(nullptr), - static_cast(pairs))); - return std::max(scan, sort); + static_cast(bricks + 1))); + return scan; } } // namespace @@ -238,24 +286,27 @@ size_t ModelDensityGPU::Bricks(int nu, int nv, int nw) { return static_cast((nu + BRICK - 1) / BRICK) * ((nv + BRICK - 1) / BRICK) * ((nw + BRICK - 1) / BRICK); } -std::vector ModelDensityGPU::Boxes(const ModelDensityGrid &grid, const std::vector &atoms) { +void ModelDensityGPU::Boxes(const ModelDensityGrid &grid, const ModelDensityAtom *atoms, size_t n, int *box) { const int n3[3] = {grid.nu, grid.nv, grid.nw}; double spacing[3]; for (int k = 0; k < 3; k++) spacing[k] = 1.0 / (n3[k] * std::sqrt(grid.frac[3 * k] * grid.frac[3 * k] + grid.frac[3 * k + 1] * grid.frac[3 * k + 1] + grid.frac[3 * k + 2] * grid.frac[3 * k + 2])); - std::vector box(3 * atoms.size()); - for (size_t i = 0; i < atoms.size(); i++) + for (size_t i = 0; i < n; i++) for (int k = 0; k < 3; k++) box[3 * i + k] = static_cast(std::ceil(atoms[i].radius / spacing[k])); +} + +std::vector ModelDensityGPU::Boxes(const ModelDensityGrid &grid, const std::vector &atoms) { + std::vector box(3 * atoms.size()); + Boxes(grid, atoms.data(), atoms.size(), box.data()); return box; } -size_t ModelDensityGPU::PairBound(const ModelDensityGrid &grid, const std::vector &atoms) { - const std::vector box = Boxes(grid, atoms); +size_t ModelDensityGPU::PairBound(const ModelDensityGrid &grid, const int *box, size_t n) { const int n3[3] = {grid.nu, grid.nv, grid.nw}; size_t pairs = 0; - for (size_t i = 0; i < atoms.size(); i++) { + for (size_t i = 0; i < n; i++) { size_t product = 1; for (int k = 0; k < 3; k++) product *= AxisBrickBound(box[3 * i + k], n3[k]); @@ -264,48 +315,63 @@ size_t ModelDensityGPU::PairBound(const ModelDensityGrid &grid, const std::vecto return pairs; } -bool ModelDensityGPU::Supports(const ModelDensityGrid &grid, const std::vector &atoms) { +size_t ModelDensityGPU::PairBound(const ModelDensityGrid &grid, const std::vector &atoms) { const std::vector box = Boxes(grid, atoms); + return PairBound(grid, box.data(), atoms.size()); +} + +bool ModelDensityGPU::Supports(const ModelDensityGrid &grid, const int *box, size_t n) { const int n3[3] = {grid.nu, grid.nv, grid.nw}; - for (size_t i = 0; i < box.size(); i++) + for (size_t i = 0; i < 3 * n; i++) if (2 * box[i] + 1 > n3[i % 3] || AxisBrickBound(box[i], n3[i % 3]) > MAX_BRICKS_PER_AXIS) return false; return true; } +bool ModelDensityGPU::Supports(const ModelDensityGrid &grid, const std::vector &atoms) { + const std::vector box = Boxes(grid, atoms); + return Supports(grid, box.data(), atoms.size()); +} + size_t ModelDensityGPU::DeviceBytes(size_t max_atoms, size_t max_pairs, size_t max_bricks) { - const size_t na = max_atoms + 1; - return na * (sizeof(ModelDensityAtom) + 3 * sizeof(int) + 2 * sizeof(int)) + 4 * max_pairs * sizeof(int) + - 2 * max_bricks * sizeof(int) + CubBytes(na, max_pairs + 1); + const size_t na = max_atoms + 1, nb = max_bricks + 1; + return na * (sizeof(ModelDensityAtom) + 3 * sizeof(int)) + 3 * max_pairs * sizeof(int) + 3 * nb * sizeof(int) + + CubBytes(nb); } ModelDensityGPU::ModelDensityGPU(cudaStream_t stream, size_t max_atoms_, size_t max_pairs_, size_t max_bricks_) : stream(stream), max_atoms(max_atoms_), max_pairs(max_pairs_), max_bricks(max_bricks_) { const auto sync = CudaAlloc::Synchronous; - const size_t na = std::max(max_atoms, 1), np = std::max(max_pairs, 1), - nb = std::max(max_bricks, 1); + const size_t na = std::max(max_atoms, 1), np = std::max(max_pairs, 1), nb = max_bricks + 1; atoms = CudaDevicePtr(na, sync); box = CudaDevicePtr(3 * na, sync); - overflow = CudaDevicePtr(1, sync); - count = CudaDevicePtr(na + 1, sync); - offset = CudaDevicePtr(na + 1, sync); - key = CudaDevicePtr(np, sync); - value = CudaDevicePtr(np, sync); - key_sorted = CudaDevicePtr(np, sync); - value_sorted = CudaDevicePtr(np, sync); + brick_count = CudaDevicePtr(nb, sync); brick_start = CudaDevicePtr(nb, sync); - brick_end = CudaDevicePtr(nb, sync); - cub_bytes = CubBytes(na, np); + brick_fill = CudaDevicePtr(nb, sync); + unordered = CudaDevicePtr(np, sync); + rank = CudaDevicePtr(np, sync); + pair_atom = CudaDevicePtr(np, sync); + cub_bytes = CubBytes(nb); cub_temp = CudaDevicePtr(std::max(cub_bytes, 1), sync); + host_box = CudaHostPtr(3 * na); } void ModelDensityGPU::SetAtoms(const ModelDensityGrid &grid, const std::vector &atom_list) { - if (atom_list.size() > max_atoms || Bricks(grid.nu, grid.nv, grid.nw) > max_bricks) + SetAtoms(grid, atom_list.data(), atom_list.size()); +} + +void ModelDensityGPU::SetAtoms(const ModelDensityGrid &grid, const ModelDensityAtom *atom_list, size_t n) { + if (n > max_atoms || Bricks(grid.nu, grid.nv, grid.nw) > max_bricks) throw JFJochException(JFJochExceptionCategory::GPUCUDAError, "model density: grid or atoms over the reserve"); + // The boxes into the pinned staging buffer, so that their copy and the atoms' (pinned where the caller keeps + // them so) go up by DMA instead of through the driver's staging of pageable memory. + Boxes(grid, atom_list, n, host_box); // An atom whose box is wider than the cell would reach a point through more than one image, which // gemmi's box walk adds and the gather's box test does not; such a cell is left to the CPU. - if (!Supports(grid, atom_list)) + if (!Supports(grid, host_box, n)) throw JFJochException(JFJochExceptionCategory::GPUCUDAError, "model density: an atom wider than the cell"); + if (PairBound(grid, host_box, n) > max_pairs) + throw JFJochException(JFJochExceptionCategory::GPUCUDAError, "model density: gather pairs over the reserve"); geom.nu = grid.nu; geom.nv = grid.nv; geom.nw = grid.nw; @@ -317,50 +383,37 @@ void ModelDensityGPU::SetAtoms(const ModelDensityGrid &grid, const std::vector(grid.orth[4] * inv_n[1]); geom.m12 = static_cast(grid.orth[5] * inv_n[2]); geom.m22 = static_cast(grid.orth[8] * inv_n[2]); - const std::vector b = Boxes(grid, atom_list); - n_atoms = static_cast(atom_list.size()); + n_atoms = static_cast(n); if (n_atoms > 0) { - cuda_err(cudaMemcpyAsync(atoms, atom_list.data(), atom_list.size() * sizeof(ModelDensityAtom), - cudaMemcpyHostToDevice, stream)); - cuda_err(cudaMemcpyAsync(box, b.data(), b.size() * sizeof(int), cudaMemcpyHostToDevice, stream)); + cuda_err(cudaMemcpyAsync(atoms, atom_list, n * sizeof(ModelDensityAtom), cudaMemcpyHostToDevice, stream)); + cuda_err(cudaMemcpyAsync(box, host_box, 3 * n * sizeof(int), cudaMemcpyHostToDevice, stream)); } - // The uploads read host vectors that end with this call. + // The uploads read the caller's atoms, which it may change once this returns. cuda_err(cudaStreamSynchronize(stream)); } void ModelDensityGPU::Compute(const float4 *d_pos, float *d_grid) { - cuda_err(cudaMemsetAsync(overflow, 0, sizeof(int), stream)); - count_pairs_kernel<<>>(d_pos, box, n_atoms, geom.nu, geom.nv, geom.nw, - count, overflow); - cuda_err(cudaGetLastError()); - size_t temp = cub_bytes; - cuda_err(cub::DeviceScan::ExclusiveSum(cub_temp.get(), temp, count.get(), offset.get(), n_atoms + 1, stream)); - int npairs = 0; - int over = 0; - cuda_err(cudaMemcpyAsync(&npairs, offset.get() + n_atoms, sizeof(int), cudaMemcpyDeviceToHost, stream)); - cuda_err(cudaMemcpyAsync(&over, overflow.get(), sizeof(int), cudaMemcpyDeviceToHost, stream)); - cuda_err(cudaStreamSynchronize(stream)); - if (over) - throw JFJochException(JFJochExceptionCategory::GPUCUDAError, "model density: an atom's box over the bricks per axis"); - if (static_cast(npairs) > max_pairs) - throw JFJochException(JFJochExceptionCategory::GPUCUDAError, "model density: gather pairs over the reserve"); - fill_pairs_kernel<<>>(d_pos, box, n_atoms, geom.nu, geom.nv, geom.nw, - offset, key, value); - cuda_err(cudaGetLastError()); + // Counted per brick, scanned, filled, and each brick put in model order: nothing comes back to the host, so + // the launches queue straight through (and record into a CUDA graph). The bricks' atoms end up as a stable + // sort of the atom-major pairs by brick would leave them. const int nb = static_cast(Bricks(geom.nu, geom.nv, geom.nw)); - int bits = 1; - while ((1 << bits) < nb) - bits++; - temp = cub_bytes; - cuda_err(cub::DeviceRadixSort::SortPairs(cub_temp.get(), temp, key.get(), key_sorted.get(), value.get(), - value_sorted.get(), npairs, 0, bits, stream)); - cuda_err(cudaMemsetAsync(brick_start, 0, nb * sizeof(int), stream)); - cuda_err(cudaMemsetAsync(brick_end, 0, nb * sizeof(int), stream)); - if (npairs > 0) { - brick_ranges_kernel<<>>(key_sorted, npairs, brick_start, brick_end); + cuda_err(cudaMemsetAsync(brick_count, 0, (nb + 1) * sizeof(int), stream)); + cuda_err(cudaMemsetAsync(brick_fill, 0, nb * sizeof(int), stream)); + if (n_atoms > 0) { + count_bricks_kernel<<>>(d_pos, box, n_atoms, geom.nu, geom.nv, geom.nw, + brick_count); cuda_err(cudaGetLastError()); } - gather_kernel<<>>(atoms, d_pos, box, value_sorted, brick_start, brick_end, - geom, d_grid); + size_t temp = cub_bytes; + cuda_err(cub::DeviceScan::ExclusiveSum(cub_temp.get(), temp, brick_count.get(), brick_start.get(), nb + 1, stream)); + if (n_atoms > 0) { + fill_bricks_kernel<<>>(d_pos, box, n_atoms, geom.nu, geom.nv, geom.nw, + brick_start, brick_fill, unordered); + cuda_err(cudaGetLastError()); + } + order_bricks_kernel<<>>(unordered, brick_start, rank, pair_atom); + cuda_err(cudaGetLastError()); + gather_kernel<<>>(atoms, d_pos, box, pair_atom, brick_start, + brick_start.get() + 1, geom, d_grid); cuda_err(cudaGetLastError()); } diff --git a/image_analysis/structure_refinement/ModelDensityGPU.h b/image_analysis/structure_refinement/ModelDensityGPU.h index d46941ab7..855ecd4d7 100644 --- a/image_analysis/structure_refinement/ModelDensityGPU.h +++ b/image_analysis/structure_refinement/ModelDensityGPU.h @@ -49,23 +49,32 @@ public: // gemmi's box around each atom (MakeAtomBox, ModelGrid.cpp): the points within ceil(radius / spacing) // of the nearest one along each axis, three per atom. static std::vector Boxes(const ModelDensityGrid &grid, const std::vector &atoms); + static void Boxes(const ModelDensityGrid &grid, const ModelDensityAtom *atoms, size_t n, int *box); // (brick, atom) pairs of the gather over at most. static size_t PairBound(const ModelDensityGrid &grid, const std::vector &atoms); + static size_t PairBound(const ModelDensityGrid &grid, const int *box, size_t n); // Whether the gather reproduces gemmi's box walk on this grid: every atom's box narrower than the cell, // so that no point is reached by two images of one atom. static bool Supports(const ModelDensityGrid &grid, const std::vector &atoms); + static bool Supports(const ModelDensityGrid &grid, const int *box, size_t n); ModelDensityGPU(cudaStream_t stream, size_t max_atoms, size_t max_pairs, size_t max_bricks); - // The grid and the atoms' densities. Throws if they are over the capacity or if !Supports(). + // The grid and the atoms' densities. Throws if they are over the capacity or if !Supports(). The atoms are + // read until the call returns; from pinned memory (PinnedVector) they go up by DMA. void SetAtoms(const ModelDensityGrid &grid, const std::vector &atoms); + void SetAtoms(const ModelDensityGrid &grid, const ModelDensityAtom *atoms, size_t n); // The density into d_grid (nu * nv * nw floats, every point written). d_pos: each atom's centre in // grid units - its fractional position times the grid size, as the CPU's DensityBox holds it, not - // wrapped into the cell - in the order SetAtoms() got them; w is not read. Waits on the stream once, - // for the number of (brick, atom) pairs. + // wrapped into the cell - in the order SetAtoms() got them; w is not read. Queued on the stream, nothing + // waited for: the pairs are built in buffers of a fixed shape, so this records into a CUDA graph. void Compute(const float4 *d_pos, float *d_grid); + // The densities and the boxes of the atoms last set, on the device, for a kernel that walks the same boxes. + const ModelDensityAtom *DeviceAtoms() const { return atoms; } + const int *DeviceBoxes() const { return box; } + // What the gather kernel needs of the grid. struct Geometry { int nu, nv, nw; @@ -81,8 +90,10 @@ private: CudaDevicePtr atoms; CudaDevicePtr box; - CudaDevicePtr overflow; // an atom's box over MAX_BRICKS_PER_AXIS - CudaDevicePtr count, offset, key, value, key_sorted, value_sorted, brick_start, brick_end; + CudaHostPtr host_box; // the boxes' staging buffer, pinned + // per brick its atoms counted, where its segment starts (max_bricks + 1: the last entry the total) and how + // far it is filled; per pair the atom as the fill placed it, its rank in the brick, and in model order + CudaDevicePtr brick_count, brick_start, brick_fill, unordered, rank, pair_atom; CudaDevicePtr cub_temp; size_t cub_bytes = 0; }; diff --git a/image_analysis/structure_refinement/ModelMaskGPU.cu b/image_analysis/structure_refinement/ModelMaskGPU.cu index 627da9aa8..d4fc89bb5 100644 --- a/image_analysis/structure_refinement/ModelMaskGPU.cu +++ b/image_analysis/structure_refinement/ModelMaskGPU.cu @@ -206,12 +206,15 @@ __global__ void shrink_edges(const float *mask, int *edge, const int3 *stencil, edge[i] = is_edge; } -// The stencil is symmetric (an offset and its negative are the same distance), so a macromolecule point -// that an edge point reaches is one that reaches an edge point. +// The stencil is symmetric (an offset and its negative are the same distance), so a macromolecule point within +// it of an edge point is one an edge point reaches: each edge point marks its stencil as solvent. The edge points +// are a thin shell, so this visits far fewer points than asking every macromolecule point for an edge within +// reach; every write is the same store of 1, made only to points the edge pass did not change, so the mask is +// the same bit for bit (a solvent point written again stays 1). __global__ void shrink_margin(float *mask, const int *edge, const int3 *stencil, int n_stencil, int nu, int nv, int nw) { const size_t n = static_cast(nu) * nv * nw; const size_t i = blockIdx.x * static_cast(blockDim.x) + threadIdx.x; - if (i >= n || mask[i] >= 1.0f) + if (i >= n || !edge[i]) return; const int u = static_cast(i % nu); const int v = static_cast((i / nu) % nv); @@ -220,10 +223,7 @@ __global__ void shrink_margin(float *mask, const int *edge, const int3 *stencil, const size_t j = wrap(u + stencil[k].x, nu) + static_cast(nu) * (wrap(v + stencil[k].y, nv) + static_cast(nv) * wrap(w + stencil[k].z, nw)); - if (edge[j]) { - mask[i] = 1.0f; - return; - } + mask[j] = 1.0f; } } diff --git a/image_analysis/structure_refinement/ModelScaleGPU.cu b/image_analysis/structure_refinement/ModelScaleGPU.cu index f26a72744..bfa19dce9 100644 --- a/image_analysis/structure_refinement/ModelScaleGPU.cu +++ b/image_analysis/structure_refinement/ModelScaleGPU.cu @@ -25,6 +25,8 @@ constexpr int THREADS = 128; constexpr int BLOCKS = 48; constexpr int SLOTS = 36; // 1 + 28 + 7: the WSSR, the lower half of J^T J and J^T r for 7 parameters constexpr int MAX_FITS = 88; // FitModelScale's coarse pass, the larger of its two +constexpr int MAX_ROBUST_FITS = 32; // FitModelScale's fine pass, at most 5 x 5 points +constexpr int ROBUST_ROUNDS = 4; // as ModelScaling.cpp // What a launch sums over the points for one fit. constexpr int MODE_ISOTROPIC = 0; // fit_isotropic_b_approximately(): sx, sy, sxx, sxy, n @@ -54,7 +56,7 @@ __global__ void solvent_amplitudes(const double *__restrict__ stol2, const float template __global__ void scale_sums(const int *__restrict__ hkl, const double *__restrict__ stol2, const float *__restrict__ fobs, const unsigned char *__restrict__ strong, - const float *__restrict__ f_abs_all, int n, + const float *__restrict__ f_abs_all, const float *__restrict__ weight_all, int n, const ModelScaleFitState *__restrict__ fits, Constraints c, double *__restrict__ partial) { constexpr int NS = 1 + NA * (NA + 1) / 2 + NA; // WSSR, J^T J lower half, J^T r const ModelScaleFitState f = fits[blockIdx.y]; @@ -105,10 +107,12 @@ __global__ void scale_sums(const int *__restrict__ hkl, const double *__restrict const float r_u_r_f = fx * fx * uf[0] + fy * fy * uf[1] + fz * fz * uf[2] + 2 * (fx * fy * uf[3] + fx * fz * uf[4] + fy * fz * uf[5]); const float k_aniso = expf(-0.25f * r_u_r_f); + // the robust fit's weight (ModelScaling.cpp, ComputeLMMatrices and ComputeWSSR multiply by it) + const double w = f.weighted ? weight_all[static_cast(f.column) * n + i] : 1.0; if (f.mode == MODE_WSSR) { const float value = f_abs * static_cast(f.k_overall * k_aniso); const double dy = fo - value; - acc[0] += dy * dy; + acc[0] += dy * dy * w; continue; } @@ -124,13 +128,13 @@ __global__ void scale_sums(const int *__restrict__ hkl, const double *__restrict dy_da[j] = r[0] * du[0] + r[1] * du[1] + r[2] * du[2] + r[3] * du[3] + r[4] * du[4] + r[5] * du[5]; } const double dy = fo - y; - acc[0] += dy * dy; + acc[0] += dy * dy * w; int s = 1; for (int j = 0; j < NA; j++) for (int k = 0; k <= j; k++) - acc[s++] += dy_da[j] * dy_da[k]; + acc[s++] += dy_da[j] * dy_da[k] * w; for (int j = 0; j < NA; j++) - acc[s++] += dy * dy_da[j]; + acc[s++] += dy * dy_da[j] * w; } // The block's sum of each slot the mode fills: a fixed shuffle tree within each warp, then the warps @@ -155,6 +159,75 @@ __global__ void scale_sums(const int *__restrict__ hkl, const double *__restrict } } +// The robust fit's residuals |Fo - value| of each fit (blockIdx.y) at its parameters, compute_value() as in MODE_R. +__global__ void robust_residuals(const int *__restrict__ hkl, const float *__restrict__ fobs, + const float *__restrict__ f_abs_all, int n, + const ModelScaleFitState *__restrict__ fits, float *__restrict__ residual) { + const ModelScaleFitState f = fits[blockIdx.y]; + const float *f_abs_fit = f_abs_all + static_cast(f.column) * n; + for (int i = blockIdx.x * THREADS + threadIdx.x; i < n; i += BLOCKS * THREADS) { + const double hx = hkl[3 * i], hy = hkl[3 * i + 1], hz = hkl[3 * i + 2]; + const double *u = f.b_star; + const double r_u_r = hx * hx * u[0] + hy * hy * u[1] + hz * hz * u[2] + + 2 * (hx * hy * u[3] + hx * hz * u[4] + hy * hz * u[5]); + const float value = f_abs_fit[i] * static_cast(f.k_overall * exp(-0.25 * r_u_r)); + residual[static_cast(f.column) * n + i] = fabsf(fobs[i] - value); + } +} + +// The robust fit's weights 1 / sqrt(1 + (r / c)^2) from the residuals (ModelScaling.cpp, RobustReweight); a fit +// whose c is not positive keeps its weights. +__global__ void robust_weights(const float *__restrict__ residual, int n, const ModelScaleFitState *__restrict__ fits, + float *__restrict__ weight) { + const ModelScaleFitState f = fits[blockIdx.y]; + if (!(f.c > 0)) + return; + const size_t row = static_cast(f.column) * n; + for (int i = blockIdx.x * THREADS + threadIdx.x; i < n; i += BLOCKS * THREADS) { + const double q = residual[row + i] / f.c; + weight[row + i] = static_cast(1.0 / sqrt(1.0 + q * q)); + } +} + +// The robust fit's c of each fit (blockIdx.x): the median of its residuals, the element std::nth_element puts at +// n / 2, by radix selection - the residuals are not negative, so their order is that of their bits as unsigned +// integers, and four passes find those bits a byte at a time. The counts are of integers: the same answer +// whatever order the threads take. +__global__ void residual_median(const float *__restrict__ residual, int n, const ModelScaleFitState *__restrict__ fits, + double *__restrict__ c) { + __shared__ unsigned int count[256]; + __shared__ unsigned int prefix, rank; + const float *r = residual + static_cast(fits[blockIdx.x].column) * n; + if (threadIdx.x == 0) { + prefix = 0; + rank = n / 2; + } + for (int shift = 24; shift >= 0; shift -= 8) { + for (int b = threadIdx.x; b < 256; b += blockDim.x) + count[b] = 0; + __syncthreads(); + // the bits above this byte, which the residuals counted must share with the median + const unsigned int high = shift == 24 ? 0 : 0xffffffffu << (shift + 8); + for (int i = threadIdx.x; i < n; i += blockDim.x) { + const unsigned int u = __float_as_uint(r[i]); + if ((u & high) == prefix) + atomicAdd(&count[(u >> shift) & 255], 1u); + } + __syncthreads(); + if (threadIdx.x == 0) { + unsigned int b = 0; + while (rank >= count[b]) { + rank -= count[b]; + b++; + } + prefix |= b << shift; + } + __syncthreads(); + } + if (threadIdx.x == 0) + c[blockIdx.x] = __uint_as_float(prefix); +} + // Each fit's block partials summed in block order. __global__ void sum_blocks(const double *__restrict__ partial, double *__restrict__ sums) { const int s = threadIdx.x; @@ -303,6 +376,10 @@ struct ModelScaleGPU::LevMarRun { } }; +size_t ModelScaleGPU::RobustBytes(size_t max_points) { + return 2 * MAX_ROBUST_FITS * max_points * sizeof(float) + MAX_ROBUST_FITS * sizeof(double); +} + size_t ModelScaleGPU::DeviceBytes(size_t max_points) { return max_points * (3 * sizeof(int) + sizeof(double) + sizeof(float) + sizeof(unsigned char)) + MAX_FITS * max_points * sizeof(float) @@ -368,22 +445,28 @@ const double *ModelScaleGPU::Reduce(int nfits) { c.row[j][k] = static_cast(constraints_[j][k]); const dim3 grid(BLOCKS, nfits); switch (n_params_) { - case 2: scale_sums<2><<>>(hkl_, stol2_, fobs_, strong_, f_abs_, n_, fits_, c, partial_); break; - case 3: scale_sums<3><<>>(hkl_, stol2_, fobs_, strong_, f_abs_, n_, fits_, c, partial_); break; - case 4: scale_sums<4><<>>(hkl_, stol2_, fobs_, strong_, f_abs_, n_, fits_, c, partial_); break; - case 5: scale_sums<5><<>>(hkl_, stol2_, fobs_, strong_, f_abs_, n_, fits_, c, partial_); break; - case 6: scale_sums<6><<>>(hkl_, stol2_, fobs_, strong_, f_abs_, n_, fits_, c, partial_); break; - case 7: scale_sums<7><<>>(hkl_, stol2_, fobs_, strong_, f_abs_, n_, fits_, c, partial_); break; + case 2: scale_sums<2><<>>(hkl_, stol2_, fobs_, strong_, f_abs_, weight_, n_, fits_, c, partial_); break; + case 3: scale_sums<3><<>>(hkl_, stol2_, fobs_, strong_, f_abs_, weight_, n_, fits_, c, partial_); break; + case 4: scale_sums<4><<>>(hkl_, stol2_, fobs_, strong_, f_abs_, weight_, n_, fits_, c, partial_); break; + case 5: scale_sums<5><<>>(hkl_, stol2_, fobs_, strong_, f_abs_, weight_, n_, fits_, c, partial_); break; + case 6: scale_sums<6><<>>(hkl_, stol2_, fobs_, strong_, f_abs_, weight_, n_, fits_, c, partial_); break; + case 7: scale_sums<7><<>>(hkl_, stol2_, fobs_, strong_, f_abs_, weight_, n_, fits_, c, partial_); break; default: throw std::logic_error("ModelScaleGPU: unexpected number of parameters"); } cuda_err(cudaGetLastError()); sum_blocks<<>>(partial_, sums_); cuda_err(cudaGetLastError()); cuda_err(cudaMemcpyAsync(host_sums_, sums_, nfits * SLOTS * sizeof(double), cudaMemcpyDeviceToHost, stream_)); - cuda_err(cudaStreamSynchronize(stream_)); + Wait(); return host_sums_; } +void ModelScaleGPU::Wait() { + cudaError_t err; + while ((err = cudaStreamQuery(stream_)) == cudaErrorNotReady) {} + cuda_err(err); +} + // fit_isotropic_b_approximately() then fit_parameters() for every fit in `fits`, which start from the // k_overall and b_star they hold, and are left holding the answer. void ModelScaleGPU::FitBatch(const float2 *d_fcmol, const float2 *d_fmask, std::vector &fits) { @@ -414,7 +497,11 @@ void ModelScaleGPU::FitBatch(const float2 *d_fcmol, const float2 *d_fmask, std:: const double b[6] = {elem(0, 0), elem(1, 1), elem(2, 2), elem(0, 1), elem(0, 2), elem(1, 2)}; std::copy(b, b + 6, fits[i].b_star); } + LevMarBatch(fits); +} +void ModelScaleGPU::LevMarBatch(std::vector &fits) { + const size_t nfits = fits.size(); // get_parameters() and set_parameters() with k_sol and b_sol fixed const int na = n_params_; auto get_parameters = [&](const ModelScaleFitState &f) { @@ -459,6 +546,49 @@ void ModelScaleGPU::FitBatch(const float2 *d_fcmol, const float2 *d_fmask, std:: set_parameters(fits[i], runs[i].Result()); } +// ModelScaling.cpp's robust rounds of each fit: the residuals at its parameters, their median taken once as c, +// the weights, and gemmi's Levenberg-Marquardt again from where the fit stands. The median is the element +// std::nth_element puts at n / 2, as there. +void ModelScaleGPU::RobustBatch(std::vector &fits) { + const size_t nfits = fits.size(); + if (nfits > static_cast(MAX_ROBUST_FITS)) + throw std::logic_error("ModelScaleGPU: too many robust fits in one launch"); + if (!weight_) { + weight_ = CudaDevicePtr(MAX_ROBUST_FITS * max_points_); + residual_ = CudaDevicePtr(MAX_ROBUST_FITS * max_points_); + median_ = CudaDevicePtr(MAX_ROBUST_FITS); + host_median_ = CudaHostPtr(MAX_ROBUST_FITS); + } + for (size_t i = 0; i < nfits; i++) { + fits[i].column = static_cast(i); + fits[i].weighted = 0; + fits[i].c = 0; + } + const dim3 grid(BLOCKS, static_cast(nfits)); + for (int round = 0; round < ROBUST_ROUNDS; round++) { + UploadFits(fits); + robust_residuals<<>>(hkl_, fobs_, f_abs_, n_, fits_, residual_); + cuda_err(cudaGetLastError()); + if (round == 0) { + residual_median<<(nfits), 1024, 0, stream_>>>(residual_, n_, fits_, median_); + cuda_err(cudaGetLastError()); + cuda_err(cudaMemcpyAsync(host_median_, median_, nfits * sizeof(double), cudaMemcpyDeviceToHost, stream_)); + Wait(); + for (size_t i = 0; i < nfits; i++) + fits[i].c = host_median_[i]; + UploadFits(fits); + } + robust_weights<<>>(residual_, n_, fits_, weight_); + cuda_err(cudaGetLastError()); + Wait(); // host_fits_ is written again below + for (ModelScaleFitState &f : fits) + f.weighted = f.c > 0; + LevMarBatch(fits); + } + for (ModelScaleFitState &f : fits) + f.weighted = 0; +} + ModelScaleParams ModelScaleGPU::Fit(const float2 *d_fcmol, const float2 *d_fmask, double k_sol, double b_sol) { ModelScaleParams out; if (n_ == 0) @@ -473,7 +603,8 @@ ModelScaleParams ModelScaleGPU::Fit(const float2 *d_fcmol, const float2 *d_fmask // FitModelScale's grid (ModelScaling.cpp, default ModelScaleBox with b_sol up to b_hi): a coarse pass // over the box and a finer one around its winner, every grid point its own fit, the winner the lowest // finite R in grid order. The fits of a pass run together, one launch per Levenberg-Marquardt step. -ModelSolventFit ModelScaleGPU::FitSolvent(const float2 *d_fcmol, const float2 *d_fmask, double b_hi) { +ModelSolventFit ModelScaleGPU::FitSolvent(const float2 *d_fcmol, const float2 *d_fmask, double b_hi, bool robust, + double k_start, double b_start) { ModelSolventFit out; if (n_ < 20) return out; @@ -483,8 +614,10 @@ ModelSolventFit ModelScaleGPU::FitSolvent(const float2 *d_fcmol, const float2 *d const double k_lo = 0.10, k_hi = 0.60, b_lo = 10.0; // ModelScaleBox{} const double b_step = std::max(10.0, (b_hi - b_lo) / 7.0); double best_r = -1; - auto try_points = [&](std::vector &fits) { + auto try_points = [&](std::vector &fits, bool robust_pass) { FitBatch(d_fcmol, d_fmask, fits); + if (robust_pass) + RobustBatch(fits); for (auto &f : fits) f.mode = MODE_R; const double *r = Sums(fits); @@ -505,19 +638,26 @@ ModelSolventFit ModelScaleGPU::FitSolvent(const float2 *d_fcmol, const float2 *d return ModelScaleFitState{1.0, {0, 0, 0, 0, 0, 0}, ks, bs, 0, 0}; }; - std::vector coarse; - for (double ks = k_lo; ks <= k_hi + 1e-9; ks += 0.05) - for (double bs = b_lo; bs <= b_hi + 1e-9; bs += b_step) - coarse.push_back(point(ks, bs)); - try_points(coarse); - const double k0 = out.k_sol, b0 = out.b_sol; + double k0 = k_start, b0 = b_start; + if (k0 < 0) { + std::vector coarse; + for (double ks = k_lo; ks <= k_hi + 1e-9; ks += 0.05) + for (double bs = b_lo; bs <= b_hi + 1e-9; bs += b_step) + coarse.push_back(point(ks, bs)); + try_points(coarse, false); + k0 = out.k_sol; + b0 = out.b_sol; + } const double k_hi2 = std::min(k_hi, k0 + 0.05); const double b_hi2 = std::min(b_hi, b0 + b_step); std::vector fine; for (double ks = std::max(k_lo, k0 - 0.05); ks <= k_hi2 + 1e-9; ks += 0.025) for (double bs = std::max(b_lo, b0 - b_step); bs <= b_hi2 + 1e-9; bs += b_step / 2.0) fine.push_back(point(ks, bs)); - try_points(fine); + // a robust fit takes the fine pass robustly, the coarse winner included (as FitModelScale) + if (robust) + best_r = -1; + try_points(fine, robust); out.r = best_r; return out; } diff --git a/image_analysis/structure_refinement/ModelScaleGPU.h b/image_analysis/structure_refinement/ModelScaleGPU.h index 3906b5c53..178508864 100644 --- a/image_analysis/structure_refinement/ModelScaleGPU.h +++ b/image_analysis/structure_refinement/ModelScaleGPU.h @@ -36,6 +36,8 @@ struct ModelScaleFitState { double k_sol, b_sol; int mode; int column; // the fit's row of |Fcalc + solvent| on the device + int weighted; // the robust fit's weights (row `column`) multiply the WSSR and J^T J, J^T r; 0: weight 1 + double c; // the robust fit's scale of the residuals (ModelScaling.cpp, RobustReweight) }; class ModelScaleGPU { @@ -59,7 +61,13 @@ public: // FitModelScale (ModelScaling.cpp) with the default box, b_sol up to b_hi: the same grid, the same // winner. Throws ModelScaleGPUTooFewReflections where FitModelScale would chain the grid points // (five or fewer reflections for the isotropic fit). - ModelSolventFit FitSolvent(const float2 *d_fcmol, const float2 *d_fmask, double b_hi = 80.0); + // robust: the fine pass by robust least squares, as FitModelScale with ModelScaleBox::robust - the + // reweighting on the device, the median of each fit's first residuals included. + // k_start, b_start: ModelScaleBox's - the fine pass around them, no coarse pass (negative: as FitModelScale). + ModelSolventFit FitSolvent(const float2 *d_fcmol, const float2 *d_fmask, double b_hi = 80.0, + bool robust = false, double k_start = -1, double b_start = -1); + // What a robust FitSolvent takes on the card beyond DeviceBytes(), reserved at its first call. + static size_t RobustBytes(size_t max_points); private: struct LevMarRun; @@ -70,8 +78,16 @@ private: // The sums of the first `nfits` uploaded fits over all points, one row of SLOTS doubles per fit, on // the host. const double *Reduce(int nfits); + // The stream's queued work done, polled for: a fit's launches are short and the host waits for every one + // of them, so sleeping until the device raises the wake-up (set_gpu_blocking_sync) would cost more than + // the work itself. + void Wait(); const double *Sums(const std::vector &fits); void FitBatch(const float2 *d_fcmol, const float2 *d_fmask, std::vector &fits); + // gemmi's Levenberg-Marquardt for every fit in `fits` from the parameters it holds. + void LevMarBatch(std::vector &fits); + // The robust rounds of a batch FitBatch() has fitted: reweight, fit again, ROBUST_ROUNDS times. + void RobustBatch(std::vector &fits); cudaStream_t stream_; size_t max_points_; @@ -91,4 +107,7 @@ private: CudaDevicePtr sums_; // per fit, per slot CudaHostPtr host_fits_; CudaHostPtr host_sums_; + CudaDevicePtr weight_, residual_; // the robust fit's, per fit of a batch, per point + CudaDevicePtr median_; // the robust fit's c, per fit of a batch + CudaHostPtr host_median_; }; diff --git a/image_analysis/structure_refinement/ModelScaling.cpp b/image_analysis/structure_refinement/ModelScaling.cpp index 6a099189b..0b7688974 100644 --- a/image_analysis/structure_refinement/ModelScaling.cpp +++ b/image_analysis/structure_refinement/ModelScaling.cpp @@ -25,6 +25,8 @@ namespace { +constexpr int ROBUST_ROUNDS = 4; // reweightings of the robust fit (ModelScaleBox::robust) + // gemmi::Scaling as a grid point fits it: the same starting point, parameters, model values, // derivatives and R. The solvent pair is fixed there, so |Fcalc + k_sol exp(-b_sol s^2) Fmask| of a // reflection is the same at every evaluation of the solver; it is taken once per grid point here rather than @@ -35,8 +37,9 @@ struct FixedSolventFit { gemmi::Miller hkl; float fobs; float fcalc_abs; // std::abs(Scaling::get_fcalc(p)) + double weight = 1.0; // 1, but for the robust fit's reweighting (RobustReweight) double get_y() const { return fobs; } - double get_weight() const { return 1.0; } + double get_weight() const { return weight; } }; const std::vector &constraint_matrix; double k_overall = 1.0; @@ -61,7 +64,7 @@ struct FixedSolventFit { // Scaling::get_fcalc() at (k_sol, b_sol) const std::complex fcalc = s.use_solvent ? p.fcmol + (float) (k_sol * std::exp(-b_sol * p.stol2)) * p.fmask : p.fcmol; - points[i] = {p.hkl, p.fobs, std::abs(fcalc)}; + points[i] = {p.hkl, p.fobs, std::abs(fcalc), 1.0}; if (p.fobs < 1 || p.fobs < p.sigma) // skip weak reflections continue; double fcalc_abs = points[i].fcalc_abs; @@ -138,6 +141,28 @@ struct FixedSolventFit { } }; +// The robust fit's weights at the current parameters: each reflection's residual r = |Fo| - |F_model| weighted by +// 1 / sqrt(1 + (r / c)^2), with c the median |r| of the unweighted fit. Iterated, the weighted least squares then +// minimises sum c^2 2 (sqrt(1 + (r / c)^2) - 1) - quadratic for the bulk of the reflections and linear for the few +// a model fits badly (a beam-stop shadow, an ice ring, a missing part of the model), which least squares would +// otherwise let set the scale of all the rest. +// Following Huber (1964) Ann. Math. Statist. 35, 73-101 for the M-estimator, as iteratively reweighted least squares +// The smooth (pseudo-Huber) loss of Charbonnier et al. (1997) IEEE Trans. Image Process. 6, 298-311 +void RobustReweight(FixedSolventFit &fit, double &c) { + std::vector r(fit.points.size()); + for (size_t i = 0; i < fit.points.size(); i++) + r[i] = std::fabs(fit.points[i].fobs - fit.compute_value(fit.points[i])); + if (c <= 0) { + std::vector sorted = r; + std::nth_element(sorted.begin(), sorted.begin() + sorted.size() / 2, sorted.end()); + c = sorted[sorted.size() / 2]; + } + if (c <= 0) + return; + for (size_t i = 0; i < fit.points.size(); i++) + fit.points[i].weight = 1.0 / std::sqrt(1.0 + gemmi::sq(r[i] / c)); +} + // R-factor of the current parameters over the fitted reflections. This is what the grid is // selected on, and it is the quantity the scale exists to make small. double RFactor(const FixedSolventFit &fit) { @@ -171,16 +196,17 @@ double ComputeLMMatrices(const FixedSolventFit &fit, const double *kaniso, doubl const double k = kaniso ? kaniso[i] : std::exp(-0.25 * fit.b_star.r_u_r(gemmi::Vec3(p.hkl))); double y = fit.compute_value_and_derivatives(p, k, dy_da); double dy_sig = p.get_y() - y; + const double w = p.get_weight(); for (int j = 0; j != NA; ++j) { const bool used = dy_da[j] != 0; for (int k = 0; k < NA; ++k) { - const double a = dy_da[j] * dy_da[k]; + const double a = dy_da[j] * dy_da[k] * w; alpha[NA * j + k] += used ? a : 0.0; } - const double b = dy_sig * dy_da[j]; + const double b = dy_sig * dy_da[j] * w; beta[j] += used ? b : 0.0; } - wssr += gemmi::sq(dy_sig); + wssr += gemmi::sq(dy_sig) * w; } // The upper half of alpha is the lower half's mirror, as in gemmi. for (int j = 1; j < NA; j++) @@ -198,8 +224,8 @@ double ComputeWSSR(const FixedSolventFit &fit, std::vector &kaniso) { for (size_t i = 0; i < fit.points.size(); ++i) { const auto &p = fit.points[i]; kaniso[i] = std::exp(-0.25 * fit.b_star.r_u_r(p.hkl)); - // FixedSolventFit::compute_value(), weight 1 - wssr += gemmi::sq(p.get_y() - p.fcalc_abs * (float) (fit.k_overall * kaniso[i])); + // FixedSolventFit::compute_value() + wssr += gemmi::sq(p.get_y() - p.fcalc_abs * (float) (fit.k_overall * kaniso[i])) * p.get_weight(); } return (double) wssr; } @@ -343,10 +369,18 @@ ModelScaleReport FitModelScale(gemmi::Scaling &scaling, ModelScaleBox box // The scale the walk stands at, which a point starts from only where the data give it no start of its own. double k_last = scaling.k_overall; gemmi::SMat33 b_last = scaling.b_star; - auto fit_point = [&scaling](FixedSolventFit &fit, PointFit &pf, double k_start, - const gemmi::SMat33 &b_start) { + bool robust_pass = false; // the fine pass of a robust fit (ModelScaleBox::robust) + auto fit_point = [&scaling, &robust_pass](FixedSolventFit &fit, PointFit &pf, double k_start, + const gemmi::SMat33 &b_start) { fit.Start(scaling, pf.k_sol, pf.b_sol, k_start, b_start); LevMarFit(fit); // k_overall + anisotropic B only + if (robust_pass) { + double c = 0; + for (int round = 0; round < ROBUST_ROUNDS; round++) { + RobustReweight(fit, c); + LevMarFit(fit); + } + } pf.r = RFactor(fit); pf.k_overall = fit.k_overall; pf.b_star = fit.b_star; @@ -394,15 +428,26 @@ ModelScaleReport FitModelScale(gemmi::Scaling &scaling, ModelScaleBox box // 10 A^2, or in eight values where the box is wider than the default, so a raised ceiling costs // no more grid points. const double b_step = std::max(10.0, (box.b_hi - box.b_lo) / 7.0); - std::vector coarse; - for (double ks = box.k_lo; ks <= box.k_hi + 1e-9; ks += 0.05) - for (double bs = box.b_lo; bs <= box.b_hi + 1e-9; bs += b_step) - coarse.push_back(PointFit{ks, bs}); - try_points(coarse); - const double k0 = best_k_sol, b0 = best_b_sol; + double k0 = box.k_start, b0 = box.b_start; + if (k0 < 0) { + std::vector coarse; + for (double ks = box.k_lo; ks <= box.k_hi + 1e-9; ks += 0.05) + for (double bs = box.b_lo; bs <= box.b_hi + 1e-9; bs += b_step) + coarse.push_back(PointFit{ks, bs}); + try_points(coarse); + k0 = best_k_sol; + b0 = best_b_sol; + } const double k_hi2 = std::min(box.k_hi, k0 + 0.05); const double b_hi2 = std::min(box.b_hi, b0 + b_step); std::vector fine; + // A robust fit takes the fine pass robustly: each of its points, and the coarse winner again, by robust least + // squares - the coarse pass only finds where to look. + if (box.robust) { + robust_pass = true; + fitted.clear(); + best_r = -1; + } for (double ks = std::max(box.k_lo, k0 - 0.05); ks <= k_hi2 + 1e-9; ks += 0.025) for (double bs = std::max(box.b_lo, b0 - b_step); bs <= b_hi2 + 1e-9; bs += b_step / 2.0) fine.push_back(PointFit{ks, bs}); @@ -431,15 +476,26 @@ double SolventBMax(const gemmi::Model &model) { } #ifdef JFJOCH_USE_CUDA +// A fit is a chain of small launches, each waited for by the host's Levenberg-Marquardt: on a card shared with +// long kernels (refinement's trials side by side) every wait would queue behind them, so the stream goes first. +int HighestStreamPriority() { + int least = 0, greatest = 0; + cudaDeviceGetStreamPriorityRange(&least, &greatest); + return greatest; +} + struct ModelScaleGPUPool::Engine { CudaStream stream; ModelScaleGPU scale; CudaDevicePtr fcalc, fmask; - explicit Engine(size_t max_points) : scale(stream, max_points), fcalc(max_points), fmask(max_points) {} + explicit Engine(size_t max_points) + : stream(cudaStreamNonBlocking, HighestStreamPriority()), scale(stream, max_points), fcalc(max_points), + fmask(max_points) {} }; -size_t ModelScaleGPUPool::DeviceBytes(size_t max_points, size_t engines) { - return engines * (ModelScaleGPU::DeviceBytes(max_points) + 2 * max_points * sizeof(float2)); +size_t ModelScaleGPUPool::DeviceBytes(size_t max_points, size_t engines, bool robust) { + return engines * (ModelScaleGPU::DeviceBytes(max_points) + 2 * max_points * sizeof(float2) + + (robust ? ModelScaleGPU::RobustBytes(max_points) : 0)); } ModelScaleGPUPool::ModelScaleGPUPool(int device, size_t max_points, size_t engines) @@ -460,7 +516,8 @@ ModelScaleGPUPool::~ModelScaleGPUPool() { set_gpu(current); } -ModelScaleReport ModelScaleGPUPool::Fit(gemmi::Scaling &scaling, double b_hi, size_t nthreads) { +ModelScaleReport ModelScaleGPUPool::Fit(gemmi::Scaling &scaling, double b_hi, size_t nthreads, bool robust, + double k_start, double b_start) { const size_t n = scaling.points.size(); std::vector> hkl(n); std::vector stol2(n); @@ -503,11 +560,11 @@ ModelScaleReport ModelScaleGPUPool::Fit(gemmi::Scaling &scaling, double b if (cudaMemcpyAsync(e->fcalc, fc.data(), n * sizeof(float2), cudaMemcpyHostToDevice, e->stream) != cudaSuccess || cudaMemcpyAsync(e->fmask, fm.data(), n * sizeof(float2), cudaMemcpyHostToDevice, e->stream) != cudaSuccess) throw JFJochException(JFJochExceptionCategory::GPUCUDAError, "ModelScaleGPUPool: the upload failed"); - fit = e->scale.FitSolvent(e->fcalc, e->fmask, b_hi); + fit = e->scale.FitSolvent(e->fcalc, e->fmask, b_hi, robust, k_start, b_start); } catch (const ModelScaleGPUTooFewReflections &) { set_gpu(current); release(); - return FitModelScale(scaling, {.b_hi = b_hi}, nthreads); + return FitModelScale(scaling, {.b_hi = b_hi, .robust = robust, .k_start = k_start, .b_start = b_start}, nthreads); } catch (...) { set_gpu(current); release(); diff --git a/image_analysis/structure_refinement/ModelScaling.h b/image_analysis/structure_refinement/ModelScaling.h index a3d465e85..8630d62f9 100644 --- a/image_analysis/structure_refinement/ModelScaling.h +++ b/image_analysis/structure_refinement/ModelScaling.h @@ -31,6 +31,12 @@ struct ModelScaleBox { double k_lo = 0.10, k_hi = 0.60; double b_lo = 10.0, b_hi = 80.0; + // The overall scale and anisotropic B of the points of the fine pass by robust least squares + // (ModelScaling.cpp, RobustReweight) rather than plain least squares on |F|: what refinement scores a model with. + bool robust = false; + // Where a fit of the model as it was a moment ago found the solvent: the fine pass around (k_start, b_start) + // without the coarse pass. Negative: the coarse pass finds where to look. + double k_start = -1, b_start = -1; }; // The b_sol ceiling for `model`: 80 A^2, or twice the model's mean atomic B where that is higher. @@ -60,15 +66,19 @@ ModelScaleReport FitModelScale(gemmi::Scaling &scaling, ModelScaleBox box class ModelScaleGPUPool { public: // What `engines` engines for fits of up to `max_points` reflections take on the card. - static size_t DeviceBytes(size_t max_points, size_t engines); + static size_t DeviceBytes(size_t max_points, size_t engines, bool robust = false); // On `device`. Throws JFJochException on a CUDA failure. ModelScaleGPUPool(int device, size_t max_points, size_t engines); ~ModelScaleGPUPool(); - // FitModelScale(scaling, {.b_hi = b_hi}, nthreads). Where FitModelScale would walk the grid point to - // point (five or fewer reflections for the isotropic start), it is FitModelScale on the host. Safe to - // call from several threads. Throws JFJochException on a CUDA failure. - ModelScaleReport Fit(gemmi::Scaling &scaling, double b_hi, size_t nthreads); + // FitModelScale(scaling, {.b_hi = b_hi, .robust = robust}, nthreads). Where FitModelScale would walk the + // grid point to point (five or fewer reflections for the isotropic start), it is FitModelScale on the host. + // Safe to call from several threads. Throws JFJochException on a CUDA failure. The robust fit's reweighting + // runs on the device; it is FitModelScale's robust fit to rounding (float residuals and weights, the + // anisotropic factor of the steps in float), deterministic run to run. + // k_start, b_start: ModelScaleBox's. + ModelScaleReport Fit(gemmi::Scaling &scaling, double b_hi, size_t nthreads, bool robust = false, + double k_start = -1, double b_start = -1); // What the pool holds on the card. size_t Bytes() const { return DeviceBytes(max_points_, engines_.size()); } diff --git a/image_analysis/structure_refinement/MonomerLibrary.cpp b/image_analysis/structure_refinement/MonomerLibrary.cpp new file mode 100644 index 000000000..3c55b8fb3 --- /dev/null +++ b/image_analysis/structure_refinement/MonomerLibrary.cpp @@ -0,0 +1,96 @@ +// SPDX-FileCopyrightText: 2026 Filip Leonarski, Paul Scherrer Institute +// SPDX-License-Identifier: GPL-3.0-only + +#include "MonomerLibrary.h" + +#include +#include +#include + +#include "gemmi/numb.hpp" // as_number +#include "gemmi/read_cif.hpp" // read_cif_from_memory + +// Generated by CMakeLists.txt from monomers/*.cif (MonomerLibraryData.cpp in the build tree). +extern const EmbeddedMonomerFile embedded_monomer_files[]; +extern const size_t embedded_monomer_file_count; + +namespace { + +struct MetalRow { + gemmi::El metal, ligand; + int coordination; + double distance, std; + int count; +}; + +struct EmbeddedLibrary { + gemmi::MonLib monlib; + std::vector metals; // metals.cif +}; + +EmbeddedLibrary ReadEmbeddedMonomerLibrary() { + EmbeddedLibrary lib; + gemmi::MonLib &monlib = lib.monlib; + for (size_t i = 0; i < embedded_monomer_file_count; i++) { + const EmbeddedMonomerFile &f = embedded_monomer_files[i]; + std::string text; + for (size_t k = 0; k < f.n_pieces; k++) + text += f.pieces[k]; + gemmi::cif::Document doc = gemmi::read_cif_from_memory(text.data(), text.size(), f.name); + if (std::strcmp(f.name, "ener_lib.cif") == 0) + monlib.ener_lib.read(doc); + else if (std::strcmp(f.name, "metals.cif") == 0) { + for (const auto &row : doc.blocks.at(0).find("_metal_coordination.", + {"metal", "ligand", "coordination", "distance", "std", "count"})) + lib.metals.push_back({gemmi::find_element(row[0].c_str()), gemmi::find_element(row[1].c_str()), + gemmi::cif::as_int(row[2]), gemmi::cif::as_number(row[3]), + gemmi::cif::as_number(row[4]), gemmi::cif::as_int(row[5])}); + } else + monlib.read_monomer_doc(doc); + } + return lib; +} + +const EmbeddedLibrary &Library() { + static const EmbeddedLibrary lib = ReadEmbeddedMonomerLibrary(); + return lib; +} + +} // namespace + +const gemmi::MonLib &EmbeddedMonomerLibrary() { + return Library().monlib; +} + +bool EmbeddedMetalDistance(gemmi::El metal, gemmi::El ligand, int coordination, double &distance, double &sigma) { + // the rows of the pair resting on enough sites: the nearest at or below the coordination and above it + const MetalRow *lo = nullptr, *hi = nullptr; + for (const MetalRow &r : Library().metals) { + if (r.metal != metal || r.ligand != ligand || r.count < METAL_MIN_SITES) + continue; + if (r.coordination <= coordination && (lo == nullptr || r.coordination > lo->coordination)) + lo = &r; + if (r.coordination > coordination && (hi == nullptr || r.coordination < hi->coordination)) + hi = &r; + } + if (lo == nullptr && hi == nullptr) + return false; + if (lo != nullptr && (lo->coordination == coordination || hi == nullptr)) { + distance = lo->distance; + sigma = lo->std; + } else if (lo == nullptr) { + distance = hi->distance; + sigma = hi->std; + } else { + // between two coordination numbers: linear in the coordination + const double t = static_cast(coordination - lo->coordination) / (hi->coordination - lo->coordination); + distance = lo->distance + t * (hi->distance - lo->distance); + sigma = lo->std + t * (hi->std - lo->std); + } + sigma = std::max(sigma, METAL_MIN_SIGMA); + return true; +} + +bool InEmbeddedMonomerLibrary(const std::string &code) { + return EmbeddedMonomerLibrary().monomers.count(code) > 0; +} diff --git a/image_analysis/structure_refinement/MonomerLibrary.h b/image_analysis/structure_refinement/MonomerLibrary.h new file mode 100644 index 000000000..a856f7430 --- /dev/null +++ b/image_analysis/structure_refinement/MonomerLibrary.h @@ -0,0 +1,35 @@ +// SPDX-FileCopyrightText: 2026 Filip Leonarski, Paul Scherrer Institute +// SPDX-License-Identifier: GPL-3.0-only + +#pragma once + +#include +#include + +#include "gemmi/monlib.hpp" + +// The restraint dictionary refinement uses: the subset of the CCP4 Monomer Library (Vagin et al. 2004, +// LGPL-3.0) carried in the binary - the standard amino acids and nucleotides, the common modified RNA nucleotides, +// their links and modifications, the common cofactors (NAD(P)(H), FAD, FMN, hemes, SAM/SAH), a few other ligands +// and additives, water and ions; monomers/update_monomers.py holds the list. Parsed from memory once per process; +// no file is read. +const gemmi::MonLib &EmbeddedMonomerLibrary(); + +// The ideal distance and its sigma of a bond from a metal ion to a donor atom (O, N, S) at a site of `coordination` +// donors, from the library's statistics of metal sites (metals.json, embedded as monomers/metals.cif). Only rows +// resting on at least METAL_MIN_SITES sites count: the row of that coordination number, else the two nearest +// below and above it interpolated linearly, else the nearest one; the sigma is the row's standard deviation, at +// least METAL_MIN_SIGMA. False where the pair has no such row. +constexpr int METAL_MIN_SITES = 20; +constexpr double METAL_MIN_SIGMA = 0.02; // A +bool EmbeddedMetalDistance(gemmi::El metal, gemmi::El ligand, int coordination, double &distance, double &sigma); + +// Whether `code` (a residue name) has a description in it. +bool InEmbeddedMonomerLibrary(const std::string &code); + +// One .cif of monomers/, as CMakeLists.txt embeds it: its name and its text in pieces. +struct EmbeddedMonomerFile { + const char *name; + const char *const *pieces; + size_t n_pieces; +}; diff --git a/image_analysis/structure_refinement/Refinement.cpp b/image_analysis/structure_refinement/Refinement.cpp new file mode 100644 index 000000000..86a4d72a8 --- /dev/null +++ b/image_analysis/structure_refinement/Refinement.cpp @@ -0,0 +1,1560 @@ +// SPDX-FileCopyrightText: 2026 Filip Leonarski, Paul Scherrer Institute +// SPDX-License-Identifier: GPL-3.0-only + +#include "Refinement.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "gemmi/fourier.hpp" // get_size_for_hkl, get_f_phi_on_grid +#include "gemmi/it92.hpp" +#include "gemmi/modify.hpp" // remove_hydrogens +#include "gemmi/scaling.hpp" +#include "gemmi/stats.hpp" // calculate_data_statistics + +#include "../../common/JFJochException.h" +#include "../../common/JFJochMath.h" +#include "../../common/Logger.h" +#include "../../common/ParallelFor.h" +#include "ModelFFT.h" +#include "ModelScaling.h" +#include "RefinementMath.h" +#include "RefinementMinimiser.h" +#include "RefinementXray.h" +#ifdef JFJOCH_USE_CUDA +#include "../../common/CUDAWrapper.h" +#include "RefinementGPU.h" +#endif + +namespace { + +constexpr double B_FLOOR = 2.0; // A^2: no atom's B goes below it +// nor above twice the model's largest B, within these bounds (the GPU's gather is reserved for it) +constexpr double B_CEILING_MIN = 100.0, B_CEILING_MAX = 300.0; +// How far below the smallest B of the model a macro-cycle's B refinement may take an atom; the blur of the +// cycle is chosen for that. +constexpr double B_STEP_DOWN = 10.0; +constexpr double REPULSION_MARGIN = 0.5; // A: pairs this much beyond their contact distance are listed too +// The geometry the weight is chosen within (Afonine et al. 2012 select among weights by R-free with the +// geometry held to a target in the same way). +constexpr double MAX_RMSD_BONDS = 0.02, MAX_RMSD_ANGLES = 2.0; +// R-free differences smaller than this do not decide between two weights: the tighter geometry is taken. +constexpr double R_FREE_TIE = 0.001; +// The minimiser (RefinementMinimiser): a solve stops where an iteration lowers the target by less than this, +// relative; the most a position (A) or a B (A^2) moves in the first trial of a line search. +constexpr double MINIMISER_F_TOLERANCE = 1e-7; +constexpr double MAX_STEP_XYZ = 0.3, MAX_STEP_B = 10.0; + +// The figure of merit of the likelihood, , at X = 2 Fo D Fc / var: I1(X)/I0(X) for an acentric +// reflection, tanh(X / 2) for a centric one. +// Following Murshudov, Vagin & Dodson (1997) Acta Cryst. D53, 240-255 +double Fom(double x, bool centric) { + double log_i0 = 0, ratio = 0; + refine_math::BesselI0I1(x, log_i0, ratio); + return centric ? std::tanh(0.5 * x) : ratio; +} + +std::string Joined(const std::vector &names) { + std::string out; + for (const std::string &n : names) + out += (out.empty() ? "" : " ") + n; + return out; +} + +std::vector AtomList(gemmi::Model &model) { + std::vector atoms; + for (gemmi::Chain &ch : model.chains) + for (gemmi::Residue &r : ch.residues) + for (gemmi::Atom &a : r.atoms) + atoms.push_back(&a); + return atoms; +} + +// The model as refinement takes it: the first model only, without hydrogens and atoms of unknown element, +// every B isotropic (an anisotropic one becomes its equivalent isotropic B) and inside the allowed range. +gemmi::Structure PrepareModel(const gemmi::Structure &placed, const gemmi::UnitCell &cell, const gemmi::SpaceGroup &sg) { + gemmi::Structure st = placed; + st.models.resize(1); + st.cell = cell; + st.spacegroup_hm = sg.xhm(); + gemmi::remove_hydrogens(st.models[0]); + for (gemmi::Chain &ch : st.models[0].chains) + for (gemmi::Residue &r : ch.residues) { + std::erase_if(r.atoms, [](const gemmi::Atom &a) { return a.element == gemmi::El::X; }); + for (gemmi::Atom &a : r.atoms) { + if (a.aniso.nonzero()) { + a.b_iso = static_cast(gemmi::u_to_b() * a.aniso.trace() / 3.0); + a.aniso = {0, 0, 0, 0, 0, 0}; + } + a.b_iso = static_cast(std::clamp(a.b_iso, B_FLOOR, B_CEILING_MAX)); + } + } + gemmi::remove_empty_children(st); + st.setup_cell_images(); + return st; +} + +// What every stage works on: the model, the reflections, the engine and the row model of the cycle. +struct Context { + gemmi::Structure st; + std::vector atoms; + gemmi::UnitCell cell; + const gemmi::SpaceGroup *sg = nullptr; + double d_min = 0; + RefinementReflections refl; + std::unique_ptr engine; + std::unique_ptr mask; +#ifdef JFJOCH_USE_CUDA + std::unique_ptr scale_gpu; +#endif + size_t nthreads = 1; + // the likelihood fit's: all of the run's, also in a trial's slot - the slots refit at the same time, the GPU + // idles meanwhile, and the bins they queue on the shared worker pool are fitted by whichever thread is free + size_t ml_threads = 1; + int device = -1; // the engine's GPU + size_t engine_bytes = 0; // and what it holds there + XrayRowModel rows; + std::vector> fcalc, fmask; + double k_sol = 0, b_sol = 0; + // where the last Refit()'s solvent grid ended (before MoveOverallB()): the next one's fine pass is around it + // (negative: the next one searches the whole box) + double grid_k_sol = -1, grid_b_sol = -1; + double k_overall = 0; + gemmi::SMat33 b_star{0, 0, 0, 0, 0, 0}; + double b_floor = B_FLOOR; // the cycle's lowest allowed B + double b_ceiling = B_CEILING_MAX; + // Riding hydrogens: per atom the parent it rides on (-1: none), and where it sits from the parent. + std::vector rider_parent; + std::vector rider_start, rider_index; // SetRiderParents() + std::vector rider_offset; + int evaluations = 0; + const std::atomic *cancel = nullptr; // RefinementSettings::cancel + + bool Cancelled() const { return cancel != nullptr && cancel->load(std::memory_order_relaxed); } + + gemmi::Model &Model() { return st.models[0]; } + + // The riders' parents, and per parent its riders in index order (rider_start, rider_index: CSR over the atoms). + void SetRiderParents(const std::vector &parents) { + rider_parent = parents; + rider_start.assign(atoms.size() + 1, 0); + for (int p : rider_parent) + if (p >= 0) + rider_start[p + 1]++; + for (size_t i = 0; i < atoms.size(); i++) + rider_start[i + 1] += rider_start[i]; + rider_index.resize(rider_start.back()); + std::vector fill(rider_start.begin(), rider_start.end() - 1); + for (size_t i = 0; i < rider_parent.size(); i++) + if (rider_parent[i] >= 0) + rider_index[fill[rider_parent[i]]++] = static_cast(i); + } + // The hydrogens moved with their parents, at the offsets they were last placed at, and given their B. + void MoveRiders() { + const int n = static_cast(rider_parent.size()); + ParallelChunks(n, ThreadsForWork(n, nthreads, 16384), [&](int lo, int hi) { + for (int i = lo; i < hi; i++) + if (rider_parent[i] >= 0) { + atoms[i]->pos = atoms[rider_parent[i]]->pos + rider_offset[i]; + atoms[i]->b_iso = atoms[rider_parent[i]]->b_iso; + } + }); + } + // What the target says of a hydrogen is said of its parent: each parent takes its riders in index order, as + // the serial walk over the atoms added them (a rider has no riders of its own). + void FoldRiders(std::vector> &g) const { + const int n = static_cast(rider_parent.size()); + ParallelChunks(n, ThreadsForWork(n, nthreads, 16384), [&](int lo, int hi) { + for (int i = lo; i < hi; i++) + for (int r = rider_start[i]; r < rider_start[i + 1]; r++) + for (int c = 0; c < 4; c++) + g[i][c] += g[rider_index[r]][c]; + }); + } + + std::vector> XyzB() const { + std::vector> out(atoms.size()); + for (size_t i = 0; i < atoms.size(); i++) + out[i] = {atoms[i]->pos.x, atoms[i]->pos.y, atoms[i]->pos.z, atoms[i]->b_iso}; + return out; + } + std::vector Positions() const { + std::vector out; + for (const gemmi::Atom *a : atoms) + out.push_back(a->pos); + return out; + } + void SetPositions(const std::vector &p) { + for (size_t i = 0; i < atoms.size(); i++) + atoms[i]->pos = p[i]; + } + std::vector B() const { + std::vector out; + for (const gemmi::Atom *a : atoms) + out.push_back(a->b_iso); + return out; + } + void SetB(const std::vector &b) { + for (size_t i = 0; i < atoms.size(); i++) + atoms[i]->b_iso = static_cast(b[i]); + } + + // What Refit() fitted, to start another context from without fitting it again. + struct Fit { + double b_floor = B_FLOOR; + double k_sol = 0, b_sol = 0, k_overall = 0; + gemmi::SMat33 b_star{0, 0, 0, 0, 0, 0}; + XrayRowModel rows; + double grid_k_sol = -1, grid_b_sol = -1; + }; + Fit Fitted() const { return {b_floor, k_sol, b_sol, k_overall, b_star, rows, grid_k_sol, grid_b_sol}; } + // Refit() as it was where `fit` was taken, for the atoms as they were there. + void Restore(const Fit &fit) { + b_floor = fit.b_floor; + engine->SetBlur(RefinementBlur(cell, *sg, d_min, b_floor)); + k_sol = fit.k_sol; + b_sol = fit.b_sol; + k_overall = fit.k_overall; + b_star = fit.b_star; + rows = fit.rows; + grid_k_sol = fit.grid_k_sol; + grid_b_sol = fit.grid_b_sol; + engine->SetRowModel(rows); + } + // The next Refit() from nothing an earlier one found: the whole solvent box, the likelihood from the moments. + void ForgetStarts() { + grid_k_sol = grid_b_sol = -1; + rows.bin_d.clear(); + } + + // A new macro-cycle: the blur for the B the cycle may reach, the bulk-solvent mask of the model as it is, + // the scale and the solvent fitted to the working set, and the likelihood's parameters from the free set. + // Returns the R-factors of the model as it stands. + RFactors Refit() { + const RefinementStage stage("refit"); + double b_min = b_ceiling; + for (const gemmi::Atom *a : atoms) + b_min = std::min(b_min, a->b_iso); + b_floor = std::max(B_FLOOR, b_min - B_STEP_DOWN); + engine->SetBlur(RefinementBlur(cell, *sg, d_min, b_floor)); + { + const RefinementStage s1("refit.fcalc"); + engine->Fcalc(Model(), fcalc); + } + { + const RefinementStage s2("refit.fmask"); + // the GPU engine masks on the same grid as BulkSolventMask (bit for bit but at points on an atom's + // radius, ModelMaskGPU.h) + if (engine->OnGPU()) + engine->Fmask(Model(), fmask); + else + mask->Fmask(Model(), refl.hkl, fmask); + } + std::optional s3("refit.scale"); + + gemmi::AsuData> fc, fm; + gemmi::AsuData> fo; + fc.unit_cell_ = fm.unit_cell_ = fo.unit_cell_ = cell; + fc.spacegroup_ = fm.spacegroup_ = fo.spacegroup_ = sg; + for (size_t m = 0; m < refl.Size(); m++) { + fc.v.push_back({refl.hkl[m], fcalc[m]}); + fm.v.push_back({refl.hkl[m], fmask[m]}); + if (!refl.free[m]) + fo.v.push_back({refl.hkl[m], {refl.fo[m], 1.0f}}); + } + gemmi::Scaling scaling(cell, sg); + scaling.use_solvent = true; + scaling.prepare_points(fc, fo, &fm); + // the scale of the score: by robust least squares (ModelScaleBox::robust) +#ifdef JFJOCH_USE_CUDA + if (scale_gpu) + scale_gpu->Fit(scaling, SolventBMax(Model()), nthreads, true, grid_k_sol, grid_b_sol); + else +#endif + FitModelScale(scaling, {.b_hi = SolventBMax(Model()), .robust = true, .k_start = grid_k_sol, + .b_start = grid_b_sol}, nthreads); + s3.reset(); + k_sol = grid_k_sol = scaling.k_sol; + b_sol = grid_b_sol = scaling.b_sol; + k_overall = scaling.k_overall; + b_star = scaling.b_star; + rows.k_total.resize(refl.Size()); + rows.fmask.resize(refl.Size()); + std::vector> fmodel(refl.Size()); + for (size_t m = 0; m < refl.Size(); m++) { + rows.k_total[m] = static_cast(scaling.get_overall_scale_factor(refl.hkl[m])); + rows.fmask[m] = static_cast(scaling.get_solvent_scale(cell.calculate_stol_sq(refl.hkl[m]))) * fmask[m]; + fmodel[m] = rows.k_total[m] * (fcalc[m] + rows.fmask[m]); + } + { + const RefinementStage s4("refit.ml"); + EstimateLikelihoodParameters(refl, fmodel, rows, ml_threads); + } + engine->SetRowModel(rows); + return ComputeRFactors(refl, fmodel); + } + + // The overall isotropic B of the last Refit() moved into the atoms, and into the solvent's B so that F_model stays + // as it is (but where an atom meets a bound of B): left in the scale, it and the atoms' B drift against each + // other as the B factors are refined - and the B restraints, in proportion to B, depend on which holds it. + // As phenix.refine moves the overall B into the atoms (Afonine et al. (2012) Acta Cryst. D68, 352-367) + void MoveOverallB() { + const gemmi::Mat33 b = cell.orth.mat.multiply(b_star.as_mat33()).multiply(cell.orth.mat.transpose()); + const double b_iso = (b[0][0] + b[1][1] + b[2][2]) / 3.0; + double b_min = b_ceiling; + for (size_t i = 0; i < atoms.size(); i++) + if (rider_parent.empty() || rider_parent[i] < 0) { + atoms[i]->b_iso = static_cast(std::clamp(atoms[i]->b_iso + b_iso, B_FLOOR, b_ceiling)); + b_min = std::min(b_min, atoms[i]->b_iso); + } + MoveRiders(); + b_floor = std::max(B_FLOOR, b_min - B_STEP_DOWN); + engine->SetBlur(RefinementBlur(cell, *sg, d_min, b_floor)); + // b_iso I in Cartesian is b_iso F F^T in the reciprocal basis + const gemmi::Mat33 f = cell.frac.mat.multiply(cell.frac.mat.transpose()); + b_star = {b_star.u11 - b_iso * f[0][0], b_star.u22 - b_iso * f[1][1], b_star.u33 - b_iso * f[2][2], + b_star.u12 - b_iso * f[0][1], b_star.u13 - b_iso * f[0][2], b_star.u23 - b_iso * f[1][2]}; + b_sol += b_iso; + for (size_t m = 0; m < refl.Size(); m++) { + rows.k_total[m] *= static_cast(std::exp(b_iso * refl.inv_d2[m] / 4.0)); + rows.fmask[m] *= static_cast(std::exp(-b_iso * refl.inv_d2[m] / 4.0)); + } + engine->SetRowModel(rows); + } + + // Every term of the score of the atoms as they are, at the scale, the solvent and the likelihood parameters + // of the last Refit(). + RefinementScore Score() { + const std::vector> fmodel = FModel(); + RefinementScore sc; + sc.k_overall = k_overall; + sc.k_sol = k_sol; + sc.b_sol = b_sol; + sc.mask_spacing = mask->Spacing(); + // b_star is in the reciprocal basis (exp(-h^T b_star h / 4)); in Cartesian B = O b_star O^T + const gemmi::Mat33 b = cell.orth.mat.multiply(b_star.as_mat33()).multiply(cell.orth.mat.transpose()); + sc.b_iso = (b[0][0] + b[1][1] + b[2][2]) / 3.0; + sc.b_aniso = {b[0][0] - sc.b_iso, b[1][1] - sc.b_iso, b[2][2] - sc.b_iso, b[0][1], b[0][2], b[1][2]}; + const RFactors r = ComputeRFactors(refl, fmodel); + sc.r_work = r.r_work; + sc.r_free = r.r_free; + sc.n_work = r.n_work; + sc.n_free = r.n_free; + sc.nll_work = sc.nll_free = 0; + double fom_sum = 0; + int fom_n = 0; + for (size_t m = 0; m < refl.Size(); m++) { + double dfc = 0; + const double fc = std::abs(fmodel[m]); + const double nll = refine_math::AmplitudeNegLogLikelihood(refl.fo[m], fc, rows.d[m], rows.var[m], + refl.centric[m], dfc); + (refl.free[m] ? sc.nll_free : sc.nll_work) += nll; + // the figure of merit of the same likelihood, over the working reflections + const double x = 2.0 * refl.fo[m] * rows.d[m] * fc / rows.var[m]; + if (!refl.free[m]) { + fom_sum += Fom(x, refl.centric[m]); + fom_n++; + } + } + sc.fom = fom_n > 0 ? fom_sum / fom_n : NAN; + for (int p : rider_parent) + sc.hydrogens += p >= 0; + constexpr int SHELLS = 20; + double s_lo = refl.inv_d2[0], s_hi = refl.inv_d2[0]; + for (double s2 : refl.inv_d2) { + s_lo = std::min(s_lo, s2); + s_hi = std::max(s_hi, s2); + } + std::vector> sums(SHELLS, {0, 0, 0, 0}); + sc.shells.resize(SHELLS); + for (int k = 0; k < SHELLS; k++) { + sc.shells[k].d_max = 1.0 / std::sqrt(s_lo + (s_hi - s_lo) * k / SHELLS); + sc.shells[k].d_min = 1.0 / std::sqrt(s_lo + (s_hi - s_lo) * (k + 1) / SHELLS); + } + for (size_t m = 0; m < refl.Size(); m++) { + const int k = std::min(SHELLS - 1, static_cast((refl.inv_d2[m] - s_lo) / (s_hi - s_lo) * SHELLS)); + const int f = refl.free[m] ? 2 : 0; + sums[k][f] += std::fabs(refl.fo[m] - std::abs(fmodel[m])); + sums[k][f + 1] += refl.fo[m]; + (refl.free[m] ? sc.shells[k].n_free : sc.shells[k].n_work)++; + } + for (int k = 0; k < SHELLS; k++) { + if (sums[k][1] > 0) + sc.shells[k].r_work = sums[k][0] / sums[k][1]; + if (sums[k][3] > 0) + sc.shells[k].r_free = sums[k][2] / sums[k][3]; + } + return sc; + } + + // The X-ray target's curvature in each atom's B, up to one factor (CalibrateBCurvature): the likelihood's + // curvature in |F_model| of the cycle, 2 (k_total D)^2 / var, summed in resolution shells, against the atom's own + // part of it, (s^2 / 4)^2 f(s)^2 exp(-B s^2 / 2). A hydrogen's is its parent's. + std::vector XrayBCurvatureShape() const { + constexpr int SHELLS = 32; + double s2_max = 0; + for (double s2 : refl.inv_d2) + s2_max = std::max(s2_max, s2); + std::vector w(SHELLS, 0), s2_sum(SHELLS, 0); + std::vector n(SHELLS, 0); + for (size_t m = 0; m < refl.Size(); m++) { + if (refl.free[m]) + continue; + const int k = std::min(SHELLS - 1, static_cast(refl.inv_d2[m] / s2_max * SHELLS)); + const double kd = rows.k_total[m] * rows.d[m]; + w[k] += 2.0 * kd * kd / rows.var[m]; + s2_sum[k] += refl.inv_d2[m]; + n[k]++; + } + std::map, std::vector> f2; // per element and charge, per shell + std::vector shape(atoms.size(), 0.0); + for (size_t i = 0; i < atoms.size(); i++) { + const gemmi::Atom &a = *atoms[i]; + std::vector &f = f2[{static_cast(a.element.elem), a.charge}]; + if (f.empty()) { + const auto &coef = gemmi::IT92::get(a.element, a.charge, a.serial); + f.resize(SHELLS, 0); + for (int k = 0; k < SHELLS; k++) + if (n[k] > 0) + f[k] = std::pow(coef.calculate_sf(s2_sum[k] / n[k] / 4.0), 2); + } + for (int k = 0; k < SHELLS; k++) + if (n[k] > 0) { + const double s2 = s2_sum[k] / n[k]; + shape[i] += w[k] * f[k] * a.occ * a.occ * std::exp(-a.b_iso * s2 / 2.0) * s2 * s2 / 16.0; + } + } + for (size_t i = 0; i < rider_parent.size(); i++) + if (rider_parent[i] >= 0) + shape[rider_parent[i]] += shape[i]; + return shape; + } + + // The factor that turns XrayBCurvatureShape() into the X-ray target's curvature: its second derivative along a + // random +-1 direction of the B factors of `params`, by central differences of the gradient, over what the shape + // predicts for it. + double CalibrateBCurvature(const std::vector ¶ms, const std::vector &shape) { + constexpr double EPS = 0.5; // A^2 + const std::vector b0 = B(); + std::mt19937 rng(7); + std::vector v(params.size()); + for (double &x : v) + x = rng() % 2 == 0 ? 1.0 : -1.0; + std::array>, 2> g; + for (int side = 0; side < 2; side++) { + for (size_t k = 0; k < params.size(); k++) + atoms[params[k]]->b_iso = static_cast(b0[params[k]] + (side == 0 ? EPS : -EPS) * v[k]); + MoveRiders(); + engine->Evaluate(Model(), &g[side]); + FoldRiders(g[side]); + } + SetB(b0); + MoveRiders(); + double num = 0, den = 0; + for (size_t k = 0; k < params.size(); k++) { + num += v[k] * (g[0][params[k]][3] - g[1][params[k]][3]) / (2 * EPS); + den += shape[params[k]]; + } + return den > 0 ? std::max(num / den, 0.0) : 0.0; + } + + // F_model with the cycle's scale and solvent, for the atoms as they are now. + std::vector> FModel() { + engine->Fcalc(Model(), fcalc); + std::vector> fmodel(refl.Size()); + for (size_t m = 0; m < refl.Size(); m++) + fmodel[m] = rows.k_total[m] * (fcalc[m] + rows.fmask[m]); + return fmodel; + } +}; + +ceres::GradientProblemSolver::Options SolverOptions(int iterations) { + ceres::GradientProblemSolver::Options options; + options.line_search_direction_type = ceres::LBFGS; + options.max_num_iterations = iterations; + options.function_tolerance = 1e-7; + options.gradient_tolerance = 1e-10; + options.parameter_tolerance = 1e-9; + options.logging_type = ceres::SILENT; + return options; +} + +// SolverOptions(iterations) that stop at the next iteration, where the minimiser stands, once ctx is cancelled. +class CancelCheck : public ceres::IterationCallback { +public: + explicit CancelCheck(const Context &ctx) : ctx_(ctx) {} + ceres::CallbackReturnType operator()(const ceres::IterationSummary &) override { + return ctx_.Cancelled() ? ceres::SOLVER_TERMINATE_SUCCESSFULLY : ceres::SOLVER_CONTINUE; + } + ceres::GradientProblemSolver::Options Options(int iterations) const { + ceres::GradientProblemSolver::Options options = SolverOptions(iterations); + options.callbacks.push_back(const_cast(this)); + return options; + } + +private: + const Context &ctx_; +}; + +// The positions or the B factors of the refinable atoms, against w times the X-ray target plus a restraint set +// (minimised by RefinementMinimiser). +class AtomTarget { +public: + enum class Mode { Xyz, B }; + AtomTarget(Context &ctx, Mode mode, const std::vector ¶m_atoms, double weight, int restraint_set) + : ctx_(ctx), mode_(mode), param_atoms_(param_atoms), weight_(weight), restraint_set_(restraint_set) {} + + // The parameters of the atoms as they are: x y z per atom, or B per atom. + std::vector Get() const { + std::vector p; + for (int i : param_atoms_) { + const gemmi::Atom &a = *ctx_.atoms[i]; + if (mode_ == Mode::Xyz) { + p.push_back(a.pos.x); + p.push_back(a.pos.y); + p.push_back(a.pos.z); + } else + p.push_back(a.b_iso); + } + return p; + } + // The atoms set to the parameters, their riders with them. + void Set(const double *p) const { + const int n = static_cast(param_atoms_.size()); + ParallelChunks(n, ThreadsForWork(n, ctx_.nthreads, 16384), [&](int lo, int hi) { + for (int k = lo; k < hi; k++) { + gemmi::Atom &a = *ctx_.atoms[param_atoms_[k]]; + if (mode_ == Mode::Xyz) + a.pos = gemmi::Position(p[3 * k], p[3 * k + 1], p[3 * k + 2]); + else + a.b_iso = static_cast(std::clamp(p[k], ctx_.b_floor, ctx_.b_ceiling)); + } + }); + ctx_.MoveRiders(); + } + // the most a parameter moves in the first trial of a line search + double MaxStep() const { return mode_ == Mode::Xyz ? MAX_STEP_XYZ : MAX_STEP_B; } + + bool Evaluate(const double *p, double *cost, double *gradient) const { + const RefinementStage stage(mode_ == Mode::Xyz ? "eval.xyz" : "eval.b"); + Set(p); + ctx_.evaluations++; + std::vector> &gx = gx_, &gr = gr_; + double xray = 0, restraints = 0; + { + const RefinementStage s1("eval.engine"); + xray = ctx_.engine->EvaluateWithRestraints(ctx_.Model(), restraint_set_, gradient != nullptr ? &gx : nullptr, + gradient != nullptr ? &gr : nullptr, restraints); + } + *cost = weight_ * xray + restraints; + if (gradient == nullptr) + return std::isfinite(*cost); + ctx_.FoldRiders(gx); + const int n = static_cast(param_atoms_.size()); + ParallelChunks(n, ThreadsForWork(n, ctx_.nthreads, 16384), [&](int lo, int hi) { + for (int k = lo; k < hi; k++) { + const int i = param_atoms_[k]; + if (mode_ == Mode::Xyz) + for (int c = 0; c < 3; c++) + gradient[3 * k + c] = weight_ * gx[i][c] + gr[i][c]; + else { + // held at a bound, B does not move further out: by the whole target, restraints included + const double g = weight_ * gx[i][3] + gr[i][3]; + const bool held = (p[k] <= ctx_.b_floor && g > 0) || (p[k] >= ctx_.b_ceiling && g < 0); + gradient[k] = held ? 0.0 : g; + } + } + }); + return std::isfinite(*cost); + } + +private: + Context &ctx_; + Mode mode_; + const std::vector ¶m_atoms_; + double weight_; + int restraint_set_; + // the gradients per atom, kept from evaluation to evaluation (7 MB each on a large model: made anew, their + // pages fault in every time) + mutable std::vector> gx_, gr_; +}; + +// The minimiser's diagonal for the B factors of `param_atoms` (RefinementMinimiser::SetDiagonal): weight times the +// X-ray target's curvature in B plus the B restraints', each element at least a thousandth of the median. The +// positions take none: their restraints' curvature is that of stiff bonds and angles, which move atoms together, so +// as a diagonal it slows rather than scales the minimiser. +std::vector BDiagonal(const std::vector &xray, const std::vector &restraints, + const std::vector ¶m_atoms, double weight) { + std::vector h; + for (int i : param_atoms) + h.push_back(weight * xray[i] + restraints[i]); + std::vector sorted = h; + std::nth_element(sorted.begin(), sorted.begin() + sorted.size() / 2, sorted.end()); + const double floor = std::max(1e-3 * sorted[sorted.size() / 2], 1e-12); + for (double &v : h) + v = std::max(v, floor); + return h; +} + +// `minimiser` carries its memory from the call before; `diagonal` is the curvature it scales the steps by (none: 1). +void Minimise(Context &ctx, const AtomTarget &target, int iterations, RefinementMinimiser &minimiser, + std::vector diagonal = {}) { + std::vector p = target.Get(); + if (p.empty()) + return; + minimiser.SetDiagonal(diagonal.empty() ? std::vector(p.size(), 1.0) : std::move(diagonal)); + minimiser.Minimise([&](const std::vector &x, double &f, std::vector &g) { + return target.Evaluate(x.data(), &f, g.data()); + }, + p, iterations, MINIMISER_F_TOLERANCE, target.MaxStep(), [&]() { return ctx.Cancelled(); }); + target.Set(p.data()); // where the minimiser ended, not where its last line search probed +} + +// Groups of atoms that move as rigid bodies (one per chain) against the X-ray target: per body an angle-axis +// rotation about its centroid, scaled by its rms radius so that a unit moves a typical atom by an angstrom as a +// unit of translation does, then a translation. +class RigidBodiesTarget : public ceres::FirstOrderFunction { +public: + RigidBodiesTarget(Context &ctx, const std::vector> &bodies) + : ctx_(ctx), bodies_(bodies), base_(ctx.Positions()) { + for (const std::vector &b : bodies) { + gemmi::Position c; + for (int i : b) + c += base_[i]; + c *= 1.0 / static_cast(b.size()); + double r2 = 0; + for (int i : b) + r2 += c.dist_sq(base_[i]); + centre_.push_back(c); + radius_.push_back(std::max(1.0, std::sqrt(r2 / static_cast(b.size())))); + } + } + int NumParameters() const override { return static_cast(6 * bodies_.size()); } + + bool Evaluate(const double *q, double *cost, double *gradient) const override { + const RefinementStage stage("eval.rigid"); + Place(q); + ctx_.evaluations++; + std::vector> g; + *cost = ctx_.engine->Evaluate(ctx_.Model(), gradient != nullptr ? &g : nullptr); + if (gradient == nullptr) + return std::isfinite(*cost); + using Jet = ceres::Jet; + for (size_t b = 0; b < bodies_.size(); b++) { + const Jet aa[3] = {Jet(q[6 * b] / radius_[b], 0), Jet(q[6 * b + 1] / radius_[b], 1), + Jet(q[6 * b + 2] / radius_[b], 2)}; + double dq[6] = {0, 0, 0, 0, 0, 0}; + for (int i : bodies_[b]) { + const gemmi::Position d = base_[i] - centre_[b]; + const Jet p[3] = {Jet(d.x), Jet(d.y), Jet(d.z)}; + Jet rp[3]; + ceres::AngleAxisRotatePoint(aa, p, rp); + for (int c = 0; c < 3; c++) { + for (int k = 0; k < 3; k++) + dq[k] += g[i][c] * rp[c].v[k] / radius_[b]; + dq[3 + c] += g[i][c]; + } + } + std::copy(dq, dq + 6, gradient + 6 * b); + } + return std::isfinite(*cost); + } + + void Place(const double *q) const { + for (size_t b = 0; b < bodies_.size(); b++) { + const double aa[3] = {q[6 * b] / radius_[b], q[6 * b + 1] / radius_[b], q[6 * b + 2] / radius_[b]}; + for (int i : bodies_[b]) { + const gemmi::Position d = base_[i] - centre_[b]; + const double p[3] = {d.x, d.y, d.z}; + double rp[3]; + ceres::AngleAxisRotatePoint(aa, p, rp); + ctx_.atoms[i]->pos = gemmi::Position(rp[0] + centre_[b].x + q[6 * b + 3], rp[1] + centre_[b].y + q[6 * b + 4], + rp[2] + centre_[b].z + q[6 * b + 5]); + } + } + } + +private: + Context &ctx_; + const std::vector> &bodies_; + std::vector base_; + std::vector centre_; + std::vector radius_; +}; + +// One B shift per group of atoms (a residue), against the X-ray target. +class GroupBTarget : public ceres::FirstOrderFunction { +public: + GroupBTarget(Context &ctx, const std::vector> &groups) + : ctx_(ctx), groups_(groups), base_(ctx.B()) {} + int NumParameters() const override { return static_cast(groups_.size()); } + + bool Evaluate(const double *q, double *cost, double *gradient) const override { + const RefinementStage stage("eval.group_b"); + Place(q); + ctx_.evaluations++; + std::vector> g; + *cost = ctx_.engine->Evaluate(ctx_.Model(), gradient != nullptr ? &g : nullptr); + if (gradient != nullptr) + for (size_t k = 0; k < groups_.size(); k++) { + gradient[k] = 0; + for (int i : groups_[k]) { + const double b = base_[i] + q[k]; + if (b > ctx_.b_floor && b < ctx_.b_ceiling) + gradient[k] += g[i][3]; + } + } + return std::isfinite(*cost); + } + + void Place(const double *q) const { + for (size_t k = 0; k < groups_.size(); k++) + for (int i : groups_[k]) + ctx_.atoms[i]->b_iso = static_cast(std::clamp(base_[i] + q[k], ctx_.b_floor, ctx_.b_ceiling)); + } + +private: + Context &ctx_; + const std::vector> &groups_; + std::vector base_; +}; + +// The placement stage: rigid bodies, then group B. +void RefinePlacement(Context &ctx, bool group_b, RefinementResult &result) { + const RefinementStage stage("placement"); + std::vector> bodies, groups; + size_t i = 0; + for (const gemmi::Chain &ch : ctx.Model().chains) { + std::vector body; + for (const gemmi::Residue &r : ch.residues) { + std::vector group; + for (size_t k = 0; k < r.atoms.size(); k++, i++) { + group.push_back(static_cast(i)); + if (!r.is_water()) + body.push_back(static_cast(i)); + } + groups.push_back(group); + } + // A chain of a few atoms (an ion, a ligand of its own chain) stays where it is. + if (body.size() >= 50) + bodies.push_back(body); + } + // Each step is kept only where it lowers R-free beyond the tie: a deposited model was refined atom by atom + // already, and moving its chains or shifting its B factors residue by residue then only makes it worse. + RFactors before = ctx.Refit(); + if (!bodies.empty()) { + const std::vector pos0 = ctx.Positions(); + std::vector q(6 * bodies.size(), 0.0); + auto target = std::make_unique(ctx, bodies); + RigidBodiesTarget *rb = target.get(); + ceres::GradientProblem problem(std::move(target)); + ceres::GradientProblemSolver::Summary summary; + const CancelCheck cancel_check(ctx); + ceres::Solve(cancel_check.Options(30), problem, q.data(), &summary); + rb->Place(q.data()); + const RFactors after = ctx.Refit(); + if (after.r_free < before.r_free - R_FREE_TIE) { + result.rigid_bodies = static_cast(bodies.size()); + before = after; + } else { + ctx.SetPositions(pos0); + before = ctx.Refit(); + } + } + if (group_b) { + const std::vector b0 = ctx.B(); + std::vector q(groups.size(), 0.0); + auto target = std::make_unique(ctx, groups); + GroupBTarget *gb = target.get(); + ceres::GradientProblem problem(std::move(target)); + ceres::GradientProblemSolver::Summary summary; + const CancelCheck cancel_check(ctx); + ceres::Solve(cancel_check.Options(30), problem, q.data(), &summary); + gb->Place(q.data()); + result.group_b = ctx.Refit().r_free < before.r_free - R_FREE_TIE; + if (!result.group_b) + ctx.SetB(b0); + } +} + +// The X-ray weight that balances the two gradients: the norm of the geometry's gradient (taken on the model +// shaken by 0.1 A, where a refined model's geometry would have none) over the norm of the X-ray target's. +// Following Brunger, Karplus & Petsko (1989) Acta Cryst. A45, 50-61, as phenix.refine starts its weight search +// (Afonine et al. (2012) Acta Cryst. D68, 352-367) +double BalancedWeight(Context &ctx, const std::vector &refinable) { + std::vector> gx, gr; + ctx.engine->Evaluate(ctx.Model(), &gx); + std::vector> xyzb = ctx.XyzB(); + std::mt19937 rng(1); + std::normal_distribution shake(0.0, 0.1); + for (std::array &a : xyzb) + for (int c = 0; c < 3; c++) + a[c] += shake(rng); + ctx.engine->EvaluateRestraints(0, xyzb, &gr); + double nx = 0, ng = 0; + for (int i : refinable) + for (int c = 0; c < 3; c++) { + nx += gx[i][c] * gx[i][c]; + ng += gr[i][c] * gr[i][c]; + } + return nx > 0 ? std::sqrt(ng / nx) : 1.0; +} + +// The B factors' X-ray weight that balances the two gradients, as BalancedWeight() does for the positions: the B +// similarity's gradient on the model with its B shaken by 20% (a flat B, as a model may come, gives none) over the +// X-ray target's. +double BalancedADPWeight(Context &ctx, const RestraintSet &b_restraints, const std::vector &refinable) { + std::vector> gx; + ctx.engine->Evaluate(ctx.Model(), &gx); + ctx.FoldRiders(gx); + std::vector> xyzb = ctx.XyzB(); + std::mt19937 rng(2); + std::normal_distribution shake(0.0, 0.2); + for (std::array &a : xyzb) + a[3] *= std::exp(shake(rng)); + std::vector> gr(xyzb.size(), {0, 0, 0, 0}); + EvaluateRestraints(b_restraints, xyzb, &gr); + double nx = 0, ng = 0; + for (int i : refinable) { + nx += gx[i][3] * gx[i][3]; + ng += gr[i][3] * gr[i][3]; + } + return nx > 0 ? std::sqrt(ng / nx) : 1.0; +} + +// The model's map coefficients and its difference map, weighted by the refinement's own likelihood: m its figure +// of merit and D its D (2mFo - DFc, mFo - DFc). +// Following Read (1986) Acta Cryst. A42, 140-149 +void MakeMaps(Context &ctx, const std::vector &merged, double wavelength_A, RefinementResult &result) { + const RefinementStage stage("maps"); + ctx.Refit(); + const std::vector> fmodel = ctx.FModel(); + const gemmi::GroupOps gops = ctx.sg->operations(); + std::vector fom(ctx.refl.Size()); + double fom_sum = 0; + int fom_n = 0; + for (size_t m = 0; m < ctx.refl.Size(); m++) { + const double x = 2.0 * ctx.refl.fo[m] * ctx.rows.d[m] * std::abs(fmodel[m]) / ctx.rows.var[m]; + fom[m] = Fom(x, ctx.refl.centric[m]); + if (!ctx.refl.free[m]) { + fom_sum += fom[m]; + fom_n++; + } + } + result.mean_fom = fom_n > 0 ? fom_sum / fom_n : 0; + + auto maps = std::make_shared(); + MtzTable &mtz = maps->coefficients; + mtz.space_group_name = ctx.sg->xhm(); + mtz.unit_cell = UnitCell{static_cast(ctx.cell.a), static_cast(ctx.cell.b), static_cast(ctx.cell.c), + static_cast(ctx.cell.alpha), static_cast(ctx.cell.beta), + static_cast(ctx.cell.gamma)}; + mtz.datasets = {{"HKL_base", "HKL_base", "HKL_base", 0.0f}, + {"refinement", "refinement", "refinement", static_cast(wavelength_A)}}; + const std::pair columns[] = {{"H", 'H'}, {"K", 'H'}, {"L", 'H'}, {"FP", 'F'}, {"FC", 'F'}, + {"PHIC", 'P'}, {"FWT", 'F'}, {"PHWT", 'P'}, {"DELFWT", 'F'}, + {"PHDELWT", 'P'}, {"FOM", 'W'}, {"FREE", 'I'}}; + for (const auto &[label, type] : columns) + mtz.columns.push_back({label, type, type == 'H' ? 0 : 1, {}}); + gemmi::AsuData> diff; + diff.unit_cell_ = ctx.cell; + diff.spacegroup_ = ctx.sg; + for (size_t m = 0; m < ctx.refl.Size(); m++) { + const double fo = ctx.refl.fo[m], fc = std::abs(fmodel[m]); + const double mw = fom[m], d = ctx.rows.d[m]; + const double fwt = ctx.refl.centric[m] ? mw * fo : 2 * mw * fo - d * fc; + const double delfwt = mw * fo - d * fc; + const double phi = std::arg(fmodel[m]); + double phi_deg = phi * 180.0 / PI; + if (phi_deg < 0) + phi_deg += 360.0; + const float row[] = {static_cast(ctx.refl.hkl[m][0]), static_cast(ctx.refl.hkl[m][1]), + static_cast(ctx.refl.hkl[m][2]), static_cast(fo), static_cast(fc), + static_cast(phi_deg), static_cast(fwt), static_cast(phi_deg), + static_cast(delfwt), static_cast(phi_deg), static_cast(mw), + ctx.refl.free[m] ? 0.0f : 1.0f}; + for (size_t c = 0; c < mtz.columns.size(); c++) + mtz.columns[c].values.push_back(row[c]); + diff.v.push_back({ctx.refl.hkl[m], std::polar(static_cast(delfwt), static_cast(phi))}); + } + result.maps = maps; + // The difference map beside the anomalous one below: neither reads the other. + std::future difference_map = std::async(std::launch::async, [&diff, &result] { + const std::array size = gemmi::get_size_for_hkl(diff, {{0, 0, 0}}, 3.0); + result.difference_map = std::make_shared>(MapFromFPhi(gemmi::get_f_phi_on_grid(diff, size, true))); + result.difference_map_rms = gemmi::calculate_data_statistics(result.difference_map->data).rms; + }); + + // The anomalous difference map: F(+) - F(-) on the model's phase turned back by 90 degrees, read on the + + // rows of an anomalous merge only (as model validation reads it). + // Following ANODE, Thorn & Sheldrick (2011) J. Appl. Cryst. 44, 1285-1287 + const gemmi::ReciprocalAsu asu(ctx.sg); + std::map danom; + for (const MergedReflection &r : merged) { + if (!std::isfinite(r.F_plus) || !std::isfinite(r.F_minus)) + continue; + const gemmi::Miller h{{r.h, r.k, r.l}}; + if (gops.is_reflection_centric(h)) + continue; + const auto [hasu, plus] = asu.to_asu_sign(h, gops); + if (plus) + danom[hasu] = r.F_plus - r.F_minus; + } + if (!danom.empty()) { + gemmi::AsuData> anom; + anom.unit_cell_ = ctx.cell; + anom.spacegroup_ = ctx.sg; + for (size_t m = 0; m < ctx.refl.Size(); m++) { + const auto it = danom.find(ctx.refl.hkl[m]); + if (it != danom.end()) + anom.v.push_back({ctx.refl.hkl[m], it->second * std::polar(1.0f, static_cast(std::arg(fmodel[m]) - PI / 2))}); + } + if (!anom.v.empty()) { + result.anomalous_map = std::make_shared>( + MapFromFPhi(gemmi::get_f_phi_on_grid(anom, gemmi::get_size_for_hkl(anom, {{0, 0, 0}}, 3.0), true))); + result.anomalous_map_rms = gemmi::calculate_data_statistics(result.anomalous_map->data).rms; + } + } + difference_map.get(); +} + +// The engine for the model as it is now: on the GPU where it is wanted and takes the case within its budget, +// on the CPU otherwise. +void MakeEngine(Context &ctx, bool gpu, const RefinementSettings &settings, Logger &logger) { + const RefinementStage stage("engine"); + ctx.engine.reset(); +#ifdef JFJOCH_USE_CUDA + ctx.scale_gpu.reset(); + if (gpu && get_gpu_count() > 0) { + try { + const int device = get_gpu(); + const size_t card = get_gpu_total_memory(device); + const size_t usable = card / 5 * 4; + const size_t budget = usable > settings.gpu_resident_bytes ? usable - settings.gpu_resident_bytes : 0; + size_t bytes = 0; + ctx.engine = MakeRefinementEngineGPU(device, ctx.cell, *ctx.sg, ctx.d_min, ctx.refl, ctx.Model(), + ctx.b_ceiling, budget, &bytes, settings.nthreads); + ctx.device = device; + ctx.engine_bytes = bytes; + if (ctx.engine) { + ctx.scale_gpu = std::make_unique(device, ctx.refl.Size(), 1); + logger.Debug("Refinement: GPU engine {:.2f} GB of a {:.2f} GB budget (scale pool {:.2f} GB)", bytes / 1e9, + budget / 1e9, ModelScaleGPUPool::DeviceBytes(ctx.refl.Size(), 1, true) / 1e9); + } else + logger.Info("Refinement: on the CPU - the GPU cannot take this case or {:.1f} GB is over its budget", + bytes / 1e9); + } catch (const JFJochException &e) { + logger.Warning("Refinement: the GPU failed ({}), on the CPU", e.what()); + ctx.engine.reset(); + ctx.scale_gpu.reset(); + } + } +#else + (void) gpu; + (void) logger; +#endif + if (!ctx.engine) + ctx.engine = MakeRefinementEngineCPU(ctx.cell, *ctx.sg, ctx.d_min, ctx.refl, settings.nthreads); +} + +// The riding hydrogens placed on their parents as they are, and the offsets and B they ride with. +void PlaceRiders(Context &ctx, RefinementTopology &topo) { + const RefinementStage stage("riders"); + PlaceRidingHydrogens(topo); + ctx.rider_offset.assign(ctx.atoms.size(), gemmi::Position()); + for (size_t i = 0; i < ctx.atoms.size(); i++) + if (ctx.rider_parent[i] >= 0) { + ctx.rider_offset[i] = ctx.atoms[i]->pos - ctx.atoms[ctx.rider_parent[i]]->pos; + ctx.atoms[i]->b_iso = ctx.atoms[ctx.rider_parent[i]]->b_iso; + } +} + +// The geometry and the repulsions of the model as it is. +RestraintSet RestraintsNow(Context &ctx, const RefinementTopology &topo) { + const RefinementStage stage("repulsions"); + RestraintSet set = topo.geometry; + set.Append(topo.metal_bonds); + set.Append(BuildRepulsions(topo, ctx.Model(), ctx.cell, *ctx.sg, REPULSION_MARGIN, ctx.nthreads)); + set.Finalize(ctx.atoms.size()); + return set; +} + +// The B similarity of the model as it is: bonded and angle-related pairs, and atoms in contact. +RestraintSet BRestraintsNow(Context &ctx, const RefinementTopology &topo) { + const RefinementStage stage("b_restraints"); + RestraintSet set = topo.adp; + set.Append(BuildBContacts(topo, ctx.Model(), ctx.cell, *ctx.sg, ctx.nthreads)); + set.Finalize(ctx.atoms.size()); + return set; +} + +// Where a weight trial runs: a model with its topology and its engine. +struct TrialSlot { + Context *ctx; + RefinementTopology *topo; +}; + +// A slot of its own beside the main one. +struct OwnSlot { + Context ctx; + RefinementTopology topo; +}; + +// A copy of the model as it was before the topology was made (the same topology comes out of it, hydrogens +// included), with an engine of the main one's kind - a GPU's on `device`. Null where the card cannot make one. +std::unique_ptr MakeOwnSlot(const gemmi::Structure &before_topology, const Context &main, int device, + size_t nthreads, const RefinementSettings &settings) { + auto slot = std::make_unique(); + Context &ctx = slot->ctx; + ctx.st = before_topology; + ctx.cell = main.cell; + ctx.sg = main.sg; + ctx.d_min = main.d_min; + ctx.refl = main.refl; + ctx.nthreads = nthreads; + ctx.ml_threads = settings.nthreads; + ctx.cancel = main.cancel; + ctx.b_ceiling = main.b_ceiling; + ctx.mask = std::make_unique(ctx.cell, *ctx.sg, ctx.d_min, nthreads); + slot->topo = BuildRefinementTopology(ctx.st, settings.riding_hydrogens); + ctx.atoms = AtomList(ctx.Model()); + ctx.SetRiderParents(slot->topo.rider_parent); +#ifdef JFJOCH_USE_CUDA + if (main.engine->OnGPU()) { + try { + ctx.engine = MakeRefinementEngineGPU(device, ctx.cell, *ctx.sg, ctx.d_min, ctx.refl, ctx.Model(), + ctx.b_ceiling, SIZE_MAX, nullptr, nthreads); + if (!ctx.engine) + return nullptr; + ctx.scale_gpu = std::make_unique(device, ctx.refl.Size(), 1); + } catch (const std::exception &) { + return nullptr; + } + ctx.device = device; + } +#else + (void) device; +#endif + if (!ctx.engine) + ctx.engine = MakeRefinementEngineCPU(ctx.cell, *ctx.sg, ctx.d_min, ctx.refl, nthreads); + ctx.engine->SetRestraints(1, slot->topo.adp); + return slot; +} + +// The devices of the slots beside the main one, `wanted` of them at most: the GPUs in turn from the main +// engine's, each taking engines while they fit in its budget. The slots beyond one per card go to the cards the +// ladder's long trials (those refining B) leave free: RunTrials gives the long trials to the first slots, one +// card each, so a short trial then shares a card with a short one, not with a long one. -1 for each one on the +// CPU, where the main one and those beside it are no more than the threads. +std::vector OwnSlotDevices(const Context &main, int wanted, const RefinementSettings &settings) { +#ifdef JFJOCH_USE_CUDA + if (main.engine->OnGPU()) { + const int n = get_gpu_count(); + const int longest = static_cast(settings.weight_ladder.size()) * + static_cast(std::count_if(settings.adp_ladder.begin(), settings.adp_ladder.end(), + [](double adp) { return adp > 0; })); + const int free = n - longest; // cards without a long trial, after the first slots' cards + // a slot's engine and its scale pool, the robust fit's buffers included + const size_t slot_bytes = main.engine_bytes + ModelScaleGPUPool::DeviceBytes(main.refl.Size(), 1, true); + std::vector used(n, 0); + used[main.device] = slot_bytes; + std::vector devices; + for (int k = 1; k <= wanted; k++) { + const int d = (k < n || free <= 0) ? (main.device + k) % n : (main.device + longest + (k - n) % free) % n; + const size_t usable = get_gpu_total_memory(d) / 5 * 4; + const size_t budget = usable > settings.gpu_resident_bytes ? usable - settings.gpu_resident_bytes : 0; + if (used[d] + slot_bytes <= budget) { + used[d] += slot_bytes; + devices.push_back(d); + } + } + return devices; + } +#endif + // on the CPU, no more trials at once than threads: each slot is a model, a topology and an engine of its own + const int beside = std::min(wanted, static_cast(settings.nthreads) - 1); + return std::vector(std::max(beside, 0), -1); +} + +// One weight trial: `cycles` macro-cycles from pos0 and b0, of the positions at X-ray weight w and, where adp_w is +// not 0, the B factors at X-ray weight adp_w. `fit`: what was fitted at pos0 and b0 already, null to fit it here. +struct TrialOutcome { + RefinementWeightTrial trial; + std::vector pos; + std::vector b; + Context::Fit fit; // the scale, the solvent and the likelihood's parameters fitted where it ended + std::string line; // what the log says of it + bool ran = false; // false: left out, the refinement cancelled before it +}; + +TrialOutcome RunTrial(TrialSlot slot, const std::vector &refinable, const std::vector &pos0, + const std::vector &b0, const Context::Fit *fit, double w, double adp_w, int cycles, + const RefinementSettings &settings) { + Context &ctx = *slot.ctx; + RefinementTopology &topo = *slot.topo; + const RefinementStage stage(adp_w > 0 ? "rung.b" : "rung.xyz"); + ctx.SetPositions(pos0); + ctx.SetB(b0); + // the positions and the B factors in turn, each with a memory of its own kept from macro-cycle to macro-cycle + const AtomTarget xyz(ctx, AtomTarget::Mode::Xyz, refinable, w, 0), b(ctx, AtomTarget::Mode::B, refinable, adp_w, 1); + RefinementMinimiser xyz_minimiser(20, ctx.nthreads), b_minimiser(20, ctx.nthreads); + double xray_scale = 0; + for (int cycle = 0; cycle < cycles && !ctx.Cancelled(); cycle++) { + PlaceRiders(ctx, topo); + if (cycle == 0 && fit != nullptr) + ctx.Restore(*fit); + else { + // a trial starts from nothing the slot's previous trial left + if (cycle == 0) + ctx.ForgetStarts(); + ctx.Refit(); + } + if (adp_w > 0) + ctx.MoveOverallB(); + { + const RestraintSet set = RestraintsNow(ctx, topo); + const RefinementStage s1("set_restraints"); + ctx.engine->SetRestraints(0, set); + } + { + const RefinementStage s2("minimise.xyz"); + Minimise(ctx, xyz, settings.xyz_iterations, xyz_minimiser); + } + if (adp_w > 0) { + const RestraintSet b_set = BRestraintsNow(ctx, topo); + ctx.engine->SetRestraints(1, b_set); + std::vector xray = ctx.XrayBCurvatureShape(); + if (cycle == 0) + xray_scale = ctx.CalibrateBCurvature(refinable, xray); + for (double &x : xray) + x *= xray_scale; + const RefinementStage s3("minimise.b"); + Minimise(ctx, b, settings.b_iterations, b_minimiser, + BDiagonal(xray, BRestraintCurvature(b_set, ctx.XyzB()), refinable, adp_w)); + } + } + PlaceRiders(ctx, topo); + TrialOutcome out; + RefinementWeightTrial &t = out.trial; + t.weight = w; + t.adp_weight = adp_w; + const RFactors rf = ctx.Refit(); + t.r_work = rf.r_work; + t.r_free = rf.r_free; + { + const RefinementStage s1("measure"); + t.geometry = MeasureGeometry(topo.geometry, + BuildRepulsions(topo, ctx.Model(), ctx.cell, *ctx.sg, 0.0, ctx.nthreads), ctx.XyzB(), + &topo.metal_bonds); + } + t.within_bounds = t.geometry.rmsd_bonds <= MAX_RMSD_BONDS && t.geometry.rmsd_angles <= MAX_RMSD_ANGLES; + out.line = fmt::format("X-ray weight {:.3g}, B {}: R-work {:.4f}, R-free {:.4f}, rmsd bonds {:.4f} A, " + "angles {:.2f} deg{}{}", + w, adp_w > 0 ? fmt::format("refined at weight {:.3g}", adp_w) : std::string("held"), + rf.r_work, rf.r_free, t.geometry.rmsd_bonds, t.geometry.rmsd_angles, + t.geometry.metal_bonds > 0 ? fmt::format(", metal bonds {:.3f} A", t.geometry.rmsd_metal) + : std::string(), + t.within_bounds ? "" : " (geometry out of bounds)"); + out.pos = ctx.Positions(); + out.b = ctx.B(); + out.fit = ctx.Fitted(); + out.ran = true; + return out; +} + +// The trials (w, adp_w) side by side, the longest to the slots first and each slot's trials in turn on a thread of +// its own (on its GPU), returned in the order given. Every trial starts from pos0 and b0 and takes nothing from the +// one before it in its slot, so the outcome is the same for any number of slots. +std::vector RunTrials(const std::vector &trial_slots, + const std::vector> &trials, + const std::vector &refinable, const std::vector &pos0, + const std::vector &b0, const Context::Fit *fit, int cycles, + const RefinementSettings &settings) { + std::vector out(trials.size()); + std::vector errors(trial_slots.size()); + // the threads shared among the slots that run (the outcome does not depend on how many each has) + const size_t running = std::min(trial_slots.size(), trials.size()); + for (size_t s = 0; s < running; s++) + trial_slots[s].ctx->nthreads = std::max(1, settings.nthreads / running); + // The trials that refine B are the longest: they go to the slots first, so that two of them share a slot (or a + // card) only where the slots are fewer than they are; the first slots are on cards of their own (OwnSlotDevices). + std::vector order(trials.size()); + std::iota(order.begin(), order.end(), 0); + std::stable_sort(order.begin(), order.end(), + [&](size_t a, size_t b) { return (trials[a].second > 0) > (trials[b].second > 0); }); + auto run_slot = [&](size_t s) { + try { +#ifdef JFJOCH_USE_CUDA + const ScopedGpuPin pin(trial_slots[s].ctx->device >= 0 ? trial_slots[s].ctx->device : get_gpu()); +#endif + for (size_t j = s; j < trials.size(); j += trial_slots.size()) + if (const size_t i = order[j]; !trial_slots[s].ctx->Cancelled()) + out[i] = RunTrial(trial_slots[s], refinable, pos0, b0, fit, trials[i].first, trials[i].second, + cycles, settings); + } catch (...) { + errors[s] = std::current_exception(); + } + }; + std::vector threads; + for (size_t s = 1; s < std::min(trial_slots.size(), trials.size()); s++) + threads.emplace_back(run_slot, s); + run_slot(0); + for (std::thread &t : threads) + t.join(); + for (const std::exception_ptr &e : errors) + if (e) + std::rethrow_exception(e); + return out; +} + +} // namespace + +RefinementResult RefineModel(const gemmi::Structure &placed, const std::vector &merged, + const gemmi::UnitCell &cell, const gemmi::SpaceGroup &sg, double wavelength_A, + Logger &logger, const RefinementSettings &settings) { + const auto start = std::chrono::steady_clock::now(); + RefinementResult result; + Context ctx; + ctx.st = PrepareModel(placed, cell, sg); + ctx.cell = cell; + ctx.sg = &sg; + ctx.nthreads = settings.nthreads; + ctx.ml_threads = settings.nthreads; + ctx.cancel = settings.cancel; + ctx.atoms = AtomList(ctx.Model()); + result.atoms = static_cast(ctx.atoms.size()); + double b_max = 0; + for (const gemmi::Atom *a : ctx.atoms) + b_max = std::max(b_max, a->b_iso); + ctx.b_ceiling = std::clamp(2 * b_max, B_CEILING_MIN, B_CEILING_MAX); + if (ctx.atoms.empty()) { + result.failure_reason = "the model has no atoms"; + return result; + } + double max_inv_d2 = 0; + for (const MergedReflection &r : merged) + if (std::isfinite(r.F) && r.d > 0) + max_inv_d2 = std::max(max_inv_d2, 1.0 / (double(r.d) * r.d)); + if (max_inv_d2 <= 0) { + result.failure_reason = "no amplitudes"; + return result; + } + // just past the finest reflection, so that prepare_asu_data()'s strict limit keeps it + ctx.d_min = 0.999 / std::sqrt(max_inv_d2); + result.d_min = 1.0 / std::sqrt(max_inv_d2); + ctx.refl = PrepareRefinementReflections(merged, cell, sg, ctx.d_min); + if (ctx.refl.Size() < 100) { + result.failure_reason = "too few reflections"; + return result; + } + + ctx.mask = std::make_unique(cell, sg, ctx.d_min, settings.nthreads); + + // The dictionary's view of the model, and its hydrogens riding on their parents from the start, so that the + // model is scored as the restrained stage refines it. + const bool restrained = settings.restrained || settings.score_only; + // The weight trials' slots start from a copy of the model as it is before the topology is made. + const gemmi::Structure before_topology = ctx.st; + RefinementTopology topo; + if (restrained) { + std::optional topo_stage("topology"); + topo = BuildRefinementTopology(ctx.st, settings.riding_hydrogens); + topo_stage.reset(); + ctx.atoms = AtomList(ctx.Model()); + ctx.SetRiderParents(topo.rider_parent); + PlaceRiders(ctx, topo); + } + + MakeEngine(ctx, settings.gpu, settings, logger); + result.on_gpu = ctx.engine->OnGPU(); + + RFactors r = ctx.Refit(); + result.n_work = r.n_work; + result.n_free = r.n_free; + result.r_work_start = r.r_work; + result.r_free_start = r.r_free; + result.score_start = ctx.Score(); + logger.Info("Refinement: {} atoms ({} riding hydrogens), {} reflections to {:.2f} A ({} free), on the {}; as given " + "R-work {:.4f}, R-free {:.4f}; k_sol {:.3f}, b_sol {:.1f}, overall B {:.1f}, mask grid {:.2f} A", + ctx.atoms.size(), result.score_start.hydrogens, ctx.refl.Size(), result.d_min, r.n_free, + result.on_gpu ? "GPU" : "CPU", r.r_work, r.r_free, ctx.k_sol, ctx.b_sol, result.score_start.b_iso, + result.score_start.mask_spacing); + + // The maps, the blobs and the model of where the refinement ended. + auto finish = [&]() { + MakeMaps(ctx, merged, wavelength_A, result); + { + const RefinementStage stage("blobs"); + result.blobs = FindDensityBlobs(*result.difference_map, result.difference_map_rms, ctx.st, result.d_min, + result.anomalous_map.get(), result.anomalous_map_rms); + } + result.k_sol = ctx.k_sol; + result.b_sol = ctx.b_sol; + result.model = std::make_shared(ctx.st); + result.ok = true; + result.seconds = std::chrono::duration(std::chrono::steady_clock::now() - start).count(); + }; + if (settings.score_only) { + result.score_start.hkl = ctx.refl.hkl; + result.score_start.fcalc = ctx.fcalc; + result.score_start.fmask = ctx.rows.fmask; + result.score_start.k_total = ctx.rows.k_total; + result.score_start.d = ctx.rows.d; + result.score_start.var = ctx.rows.var; + result.r_work_placement = result.r_work_start; + result.r_free_placement = result.r_free_start; + result.restrained_residues = topo.restrained_residues; + result.fixed_residues = topo.fixed_residues; + result.fixed_names = topo.fixed_names; + result.geometry_start = MeasureGeometry(topo.geometry, BuildRepulsions(topo, ctx.Model(), cell, sg, 0.0), + ctx.XyzB(), &topo.metal_bonds); + finish(); + const GeometryStatistics &g = result.geometry_start; + logger.Info("Refinement: the model scored only; geometry rmsd bonds {:.4f} A (rmsZ {:.2f}, {} bonds), metal " + "bonds {:.4f} A (rmsZ {:.2f}, {}; {} links made), both {:.4f} A; angles {:.2f} deg (rmsZ {:.2f})", + g.rmsd_bonds, g.rmsz_bonds, g.bonds, g.rmsd_metal, g.rmsz_metal, g.metal_bonds, topo.metal_links, + g.RmsdAllBonds(), g.rmsd_angles, g.rmsz_angles); + return result; + } + + // The trials run side by side, as many at a time as the longest set of them has and the cards take engines: + // on the main model and engine, and on copies with engines of their own; each with a share of the threads. The + // copies are made while the placement runs: they start from the model as it was before the topology was made + // and take nothing from the main context that the placement changes. + int wanted = static_cast(std::max({settings.weight_ladder.size() * settings.adp_ladder.size(), + settings.final_ladder.size(), size_t{3}})); + if (settings.max_trials_at_once > 0) + wanted = std::min(wanted, static_cast(settings.max_trials_at_once)); + const std::vector devices = settings.restrained ? OwnSlotDevices(ctx, wanted - 1, settings) : std::vector(); + const size_t slot_threads = std::max(1, settings.nthreads / (devices.size() + 1)); + std::vector> own(devices.size()); + std::vector slot_builders; + // joined before the slots are taken, or here where the placement throws + struct JoinAll { + std::vector &threads; + ~JoinAll() { + for (std::thread &t : threads) + if (t.joinable()) + t.join(); + } + } join_slot_builders{slot_builders}; + for (size_t k = 0; k < devices.size(); k++) + slot_builders.emplace_back([&, k]() { +#ifdef JFJOCH_USE_CUDA + const ScopedGpuPin pin(devices[k] >= 0 ? devices[k] : get_gpu()); +#endif + // a slot that cannot be made is left out, as where the card cannot take its engine + try { + own[k] = MakeOwnSlot(before_topology, ctx, devices[k], slot_threads, settings); + } catch (const std::exception &e) { + logger.Warning("Refinement: a trial slot could not be made ({}), the trials share fewer", e.what()); + } + }); + + RefinePlacement(ctx, settings.group_b, result); + if (restrained) + PlaceRiders(ctx, topo); + r = ctx.Refit(); + result.r_work_placement = r.r_work; + result.r_free_placement = r.r_free; + logger.Info("Refinement, placement ({} rigid bodies kept, B per residue {}): R-work {:.4f}, R-free {:.4f}", + result.rigid_bodies, result.group_b ? "kept" : "not kept", r.r_work, r.r_free); + + if (settings.restrained) { + ctx.Refit(); + result.restrained_residues = topo.restrained_residues; + result.fixed_residues = topo.fixed_residues; + result.fixed_names = topo.fixed_names; + std::vector refinable; + for (size_t i = 0; i < ctx.atoms.size(); i++) + if (topo.refinable[i]) + refinable.push_back(static_cast(i)); + result.refined_atoms = static_cast(refinable.size()); + logger.Info("Refinement: {} residues restrained, {} held fixed{}; {} bonds, {} metal bonds ({} links made), {} " + "angles, {} torsions, {} chiral volumes, {} planes", + topo.restrained_residues, topo.fixed_residues, + topo.fixed_names.empty() ? std::string() : " (" + Joined(topo.fixed_names) + ")", + topo.bonds, topo.metal_bonds.records.size(), topo.metal_links, topo.angles, topo.torsions, topo.chirals, topo.planes); + + ctx.engine->SetRestraints(1, topo.adp); + { + const RestraintSet set = RestraintsNow(ctx, topo); + ctx.engine->SetRestraints(0, set); + RestraintSet repulsions = BuildRepulsions(topo, ctx.Model(), cell, sg, 0.0, ctx.nthreads); + result.geometry_start = MeasureGeometry(topo.geometry, repulsions, ctx.XyzB(), &topo.metal_bonds); + } + double w0 = 0, adp_w0 = 0; + { + const RefinementStage stage("balanced_weight"); + w0 = BalancedWeight(ctx, refinable); + adp_w0 = BalancedADPWeight(ctx, BRestraintsNow(ctx, topo), refinable); + } + logger.Info("Refinement: geometry as given rmsd bonds {:.4f} A, angles {:.2f} deg, {} clashes; balanced X-ray " + "weights {:.3g} (positions), {:.3g} (B)", result.geometry_start.rmsd_bonds, + result.geometry_start.rmsd_angles, result.geometry_start.clashes, w0, adp_w0); + + const std::vector pos0 = ctx.Positions(); + const std::vector b0 = ctx.B(); + + std::optional slot_stage("slots"); + for (std::thread &t : slot_builders) + t.join(); + const size_t main_threads = ctx.nthreads; + ctx.nthreads = slot_threads; + std::vector trial_slots{{&ctx, &topo}}; + for (const std::unique_ptr &o : own) + if (o) + trial_slots.push_back({&o->ctx, &o->topo}); + slot_stage.reset(); + logger.Debug("Refinement: {} weight trials at a time", trial_slots.size()); + + // A trial displaces another only where its geometry is within bounds and its R-free lower by more than the + // tie. + auto displaces = [](const RefinementWeightTrial &t, const RefinementWeightTrial &b) { + return t.within_bounds && (!b.within_bounds || t.r_free < b.r_free - R_FREE_TIE); + }; + // Of a set of trials, the one kept: they come in order of trust, the first kept unless a later one displaces + // it. -1: none ran. + auto choose = [&](std::vector &outcomes, const char *stage) { + int best = -1; + for (size_t k = 0; k < outcomes.size(); k++) { + const TrialOutcome &o = outcomes[k]; + if (!o.ran) + continue; + logger.Info("Refinement, {}: {}", stage, o.line); + result.trials.push_back(o.trial); + if (best < 0 || displaces(o.trial, outcomes[best].trial)) + best = static_cast(k); + } + return best; + }; + const double w_max = w0 * settings.max_weight; + + // 1. The weights from the placed model: the ladder's rungs, tighter geometry first, each with the B factors + // held and refined at their own balanced weight. + std::vector> ladder; + for (double rung : settings.weight_ladder) + for (double adp : settings.adp_ladder) + ladder.emplace_back(w0 * rung, adp_w0 * adp); + std::vector outcomes = RunTrials(trial_slots, ladder, refinable, pos0, b0, nullptr, + settings.macro_cycles, settings); + int k = choose(outcomes, "ladder"); + TrialOutcome state; + if (k >= 0) + state = std::move(outcomes[k]); + + // 2. The trajectory: steps of a few macro-cycles from where the last one ended, each trying the weights as they + // are and, in turn, the positions' X-ray weight halved and doubled (halved: the geometry loosens as the + // model improves at one weight, until it leaves the bounds) and the B factors' divided and multiplied by + // four. + // A step is taken while it lowers R-free or R-work by more than the tie and its R-free stays within the tie + // of the best so far; the trajectory ends at its best step (on a deposited model, whose free set it was + // fitted to, R-work falls while R-free rises, and it ends where it began). + TrialOutcome best = state; + // The trials of the step that went from the best so far: the final ladder goes from there too, and a trial + // of the same weights from the same model is the same computation. + std::vector from_best; + bool state_is_best = true; + for (int step = 0; step < settings.max_steps && state.ran && !ctx.Cancelled(); step++) { + const double w = state.trial.weight, adp = state.trial.adp_weight; + std::vector> trials = {{w, adp}}; + if (step % 2 == 1 && adp > 0) { + trials.emplace_back(w, adp / 4); + trials.emplace_back(w, 4 * adp); + } else { + trials.emplace_back(w / 2, adp); + if (2 * w <= w_max) + trials.emplace_back(2 * w, adp); + } + outcomes = RunTrials(trial_slots, trials, refinable, state.pos, state.b, &state.fit, settings.macro_cycles, + settings); + if (state_is_best) + from_best = outcomes; + k = choose(outcomes, fmt::format("step {}", step + 1).c_str()); + if (k < 0) + break; + const RefinementWeightTrial &t = outcomes[k].trial; + const bool gains = displaces(t, state.trial) || (t.within_bounds && t.r_work < state.trial.r_work - R_FREE_TIE); + if (!gains || !(t.within_bounds && t.r_free < best.trial.r_free + R_FREE_TIE)) + break; + state = std::move(outcomes[k]); + state_is_best = displaces(state.trial, best.trial); + if (state_is_best) { + best = state; + from_best.clear(); + } + } + state = std::move(best); + + // 3. The final weights: a short ladder from where the trajectory ended, tighter geometry first, its choice + // kept where it displaces that. A rung the step from there tried already is taken from that step. + if (state.ran && !ctx.Cancelled()) { + const double w = state.trial.weight, adp = state.trial.adp_weight; + std::vector> trials; + for (double f : settings.final_ladder) + if (w * f <= w_max) + trials.emplace_back(w * f, adp); + outcomes.assign(trials.size(), TrialOutcome()); + std::vector> missing; + for (size_t i = 0; i < trials.size(); i++) { + for (const TrialOutcome &o : from_best) + if (o.ran && o.trial.weight == trials[i].first && o.trial.adp_weight == trials[i].second) + outcomes[i] = o; + if (!outcomes[i].ran) + missing.push_back(trials[i]); + } + std::vector ran = RunTrials(trial_slots, missing, refinable, state.pos, state.b, &state.fit, + settings.macro_cycles, settings); + for (size_t i = 0, m = 0; i < trials.size(); i++) + if (!outcomes[i].ran) + outcomes[i] = std::move(ran[m++]); + k = choose(outcomes, "final"); + // The main slot's fit as it stands where its last rung ran on it, for the maps' Refit() to start from + // (the solvent grid and the likelihood's D) whether the rung ran or was taken from the step. + const size_t main_last = (trials.size() - 1) / trial_slots.size() * trial_slots.size(); + if (outcomes[main_last].ran) + ctx.Restore(outcomes[main_last].fit); + if (k >= 0 && displaces(outcomes[k].trial, state.trial)) + state = std::move(outcomes[k]); + } + for (size_t s = 1; s < trial_slots.size(); s++) + ctx.evaluations += trial_slots[s].ctx->evaluations; + ctx.nthreads = main_threads; + if (state.ran) { + ctx.SetPositions(state.pos); + ctx.SetB(state.b); + PlaceRiders(ctx, topo); + result.restrained = true; + result.weight = state.trial.weight; + result.adp_weight = state.trial.adp_weight; + result.r_work = state.trial.r_work; + result.r_free = state.trial.r_free; + result.geometry = state.trial.geometry; + } else + ctx.Refit(); // no trial ran: the model as placed, its scale and solvent for the maps + } + result.cancelled = ctx.Cancelled(); + if (result.cancelled) + logger.Warning("Refinement: cancelled, {} weight trials ran", result.trials.size()); + + finish(); + logger.Info("Refinement: done in {:.1f} s, {} target evaluations{}", result.seconds, ctx.evaluations, + result.restrained ? fmt::format("; R-work {:.4f}, R-free {:.4f}, weight {:.3g}", result.r_work, + result.r_free, result.weight) + : std::string()); + RefinementStage::Log(logger); + return result; +} diff --git a/image_analysis/structure_refinement/Refinement.h b/image_analysis/structure_refinement/Refinement.h new file mode 100644 index 000000000..f9eadd055 --- /dev/null +++ b/image_analysis/structure_refinement/Refinement.h @@ -0,0 +1,160 @@ +// SPDX-FileCopyrightText: 2026 Filip Leonarski, Paul Scherrer Institute +// SPDX-License-Identifier: GPL-3.0-only + +#pragma once + +#include +#include +#include +#include +#include +#include +#include + +#include "gemmi/grid.hpp" +#include "gemmi/model.hpp" +#include "gemmi/symmetry.hpp" +#include "gemmi/unitcell.hpp" + +#include "../../common/Reflection.h" // MergedReflection +#include "DensityBlobs.h" +#include "ModelValidation.h" // ModelMaps +#include "RefinementRestraints.h" // GeometryStatistics + +class Logger; + +// Refinement of an atomic model already placed against the data (ValidateAgainstModel's placed model, or a +// molecular-replacement placement), in two stages: +// +// 1. Placement: each chain as a rigid body, then one B shift per residue, each kept only where it lowers +// R-free. Needs no dictionary. +// 2. Restrained: every atom's position and isotropic B, against the maximum-likelihood amplitude target with +// the geometry the dictionary describes (MonomerLibrary.h: bonds, angles, planes, chiral volumes, +// torsions, repulsions; B similarity of bonded atoms and of atoms in contact, in proportion to B). Residues +// it does not describe are held fixed and stay in the structure factors and the bulk-solvent mask. The +// weights of the X-ray term against the geometry and against the B similarity, and whether to refine the B +// factors, are chosen by R-free among trials whose geometry stays within bounds: a ladder from the placed +// model, then a trajectory of steps that each try the weights as they are and changed, from where the last +// step ended, until no step gains; then a short final ladder. +// +// The library reads and writes nothing: the model and the reflections come in, the refined model, the +// statistics and the map coefficients go out. Nothing it finds feeds back into processing decisions. +struct RefinementSettings { + bool restrained = true; // stage 2; false stops after the placement stage + bool score_only = false; // only score the model as given (RefinementResult::score_start), no stage + bool group_b = true; // the placement stage's B shift per residue + int macro_cycles = 2; // per weight trial, from the model the trial starts from + int xyz_iterations = 30; // L-BFGS iterations per macro-cycle + int b_iterations = 20; + // The first trials, from the placed model: the positions' X-ray weight, times the gradient-balanced one + // (BalancedWeight), each with the B factors' X-ray weight their own balanced one times each of adp_ladder (0: B + // held). + std::vector weight_ladder = {1.0 / 1024, 1.0 / 128, 1.0 / 16}; + std::vector adp_ladder = {0.0, 1.0}; + // Then at most this many steps of the trajectory, each a set of trials from where the last one ended, + int max_steps = 8; + // and the final trials from where it ended, at its weights times each of these; + std::vector final_ladder = {0.5, 1.0, 2.0}; + double max_weight = 1.0 / 8; // the positions' X-ray weight at most, times the balanced one + bool riding_hydrogens = true; // the dictionary's hydrogens added, riding on their parents + bool gpu = true; + size_t nthreads = 1; + size_t gpu_resident_bytes = 0; // held on the card by what runs beside + // The most weight trials run side by side, 0 for as many as the ladders and the cards take; the result does not + // depend on it (1 runs them one after another, as a check of that). + size_t max_trials_at_once = 0; + // Set by the caller (from any thread) to cut a running refinement short: checked between the minimiser's + // iterations and before every weight trial. The trials that ran are chosen among as usual, those that did not + // are left out (RefinementResult::cancelled); cut before the first trial, the model is the placement's. + const std::atomic *cancel = nullptr; +}; + +// R by resolution: one of RefinementScore's shells, equal in width in 1/d^2 between the coarsest and the +// finest reflection. +struct RefinementShell { + double d_max = 0, d_min = 0; + int n_work = 0, n_free = 0; + double r_work = NAN, r_free = NAN; +}; + +// What scoring a model against the data gives, every term of it: the model's structure factors are +// F_model = k_overall exp(-s^T B s / 4) (Fcalc + k_sol exp(-b_sol s^2 / 4) Fmask), the scale and the solvent +// fitted to the working reflections; R-work and R-free; and the likelihood target, -ln L summed over the +// working and over the free reflections, at D and the variance estimated from the free set. +struct RefinementScore { + double k_overall = 0; + double b_iso = 0; // the overall B: a third of the trace of B (Cartesian, A^2) + std::array b_aniso{}; // B less b_iso: B11 B22 B33 B12 B13 B23 (Cartesian, A^2) + double k_sol = 0, b_sol = 0; + double mask_spacing = 0; // A, the grid the solvent mask is drawn on + double r_work = NAN, r_free = NAN; + int n_work = 0, n_free = 0; + double nll_work = NAN, nll_free = NAN; + double fom = NAN; // the likelihood's mean figure of merit, working reflections + int hydrogens = 0; // riding hydrogens in the model scored + std::vector shells; + // Per reflection, with settings.score_only only: the atoms' Fcalc, the solvent's k_sol exp(-b_sol s^2/4) Fmask + // and k_overall exp(-s^T B s / 4), in the order of `hkl`, and the likelihood's parameters. + std::vector hkl; + std::vector> fcalc, fmask; + std::vector k_total; + std::vector d, var; // the likelihood's D and variance (epsilon beta + sigma^2) +}; + +// One rung of the weight ladder. +struct RefinementWeightTrial { + double weight = 0; // the X-ray term's weight + double adp_weight = 0; // the B refinement's X-ray weight; 0: the B factors were held + double r_work = 1, r_free = 1; + GeometryStatistics geometry; + bool within_bounds = false; // the geometry bounds the choice is made inside +}; + +struct RefinementResult { + bool ok = false; + std::string failure_reason; + bool on_gpu = false; + double seconds = 0; + double d_min = 0; + int n_work = 0, n_free = 0; + + // The model as given, scaled to these reflections (B made isotropic; the dictionary's hydrogens riding + // where the restrained stage runs or the model is only scored), and every term of that score. + double r_work_start = 1, r_free_start = 1; + RefinementScore score_start; + // After the placement stage. + int rigid_bodies = 0; // the chains moved as rigid bodies, where that was kept + bool group_b = false; // the B shift per residue was kept + double r_work_placement = 1, r_free_placement = 1; + // After the restrained stage (NaN where it did not run). + bool restrained = false; + bool cancelled = false; // cut short by RefinementSettings::cancel + double r_work = NAN, r_free = NAN; + double weight = 0; + double adp_weight = 0; // 0: the B factors kept as placed + std::vector trials; + GeometryStatistics geometry_start, geometry; + + int atoms = 0, refined_atoms = 0; + int restrained_residues = 0, fixed_residues = 0; + std::vector fixed_names; + double k_sol = 0, b_sol = 0; + double mean_fom = 0; + + std::shared_ptr model; // the refined model, in the data's cell and frame + std::shared_ptr maps; // its 2mFo-DFc and mFo-DFc coefficients (as _maps.mtz holds them) + // The mFo-DFc map of the refined model and its rms, for finding what it leaves unexplained (DensityBlobs.h). + std::shared_ptr> difference_map; + double difference_map_rms = 0; + // The anomalous difference map on the refined model's phases, where the merge kept the Bijvoet pairs. + std::shared_ptr> anomalous_map; + double anomalous_map_rms = 0; + // What the refined model leaves unexplained in the difference map (FindDensityBlobs). + std::vector blobs; +}; + +// `placed`: the model in the data's cell and space group. `merged`: the merge, with French-Wilson amplitudes +// and free flags, in the same group. +RefinementResult RefineModel(const gemmi::Structure &placed, const std::vector &merged, + const gemmi::UnitCell &cell, const gemmi::SpaceGroup &sg, double wavelength_A, + Logger &logger, const RefinementSettings &settings); diff --git a/image_analysis/structure_refinement/RefinementGPU.cpp b/image_analysis/structure_refinement/RefinementGPU.cpp new file mode 100644 index 000000000..dc886f577 --- /dev/null +++ b/image_analysis/structure_refinement/RefinementGPU.cpp @@ -0,0 +1,359 @@ +// SPDX-FileCopyrightText: 2026 Filip Leonarski, Paul Scherrer Institute +// SPDX-License-Identifier: GPL-3.0-only + +#include "RefinementGPU.h" + +#include +#include +#include + +#include "gemmi/dencalc.hpp" +#include "gemmi/it92.hpp" +#include "gemmi/solmask.hpp" // SolventMasker, refmac_radius_for_bulk_solvent + +#include "../../common/ParallelFor.h" +#include "RefinementGPUEngine.h" + +namespace { + +using Table = gemmi::IT92; + +// One atom's density as the gather takes it, isotropic, with `blur`. +ModelDensityAtom DensityAtom(const gemmi::Atom &atom, double b_iso, const gemmi::DensityCalculator &dc) { + using CReal = Table::Coef::coef_type; + const auto &coef = Table::get(atom.element, atom.charge, atom.serial); + const CReal b = static_cast(b_iso + dc.blur); + const auto precal = coef.precalculate_density_iso(b, 0.0f); + const double radius = dc.estimate_radius(precal, b); + ModelDensityAtom a{}; + a.occ = atom.occ; + a.aniso = 0; + a.radius = static_cast(radius); + a.max_r2 = static_cast(radius * radius); + for (int k = 0; k < 5; k++) { + a.a[k] = precal.a[k]; + a.b[k][0] = precal.b[k]; + } + return a; +} + +std::vector Atoms(const gemmi::Model &model) { + std::vector atoms; + for (const gemmi::Chain &ch : model.chains) + for (const gemmi::Residue &r : ch.residues) + for (const gemmi::Atom &a : r.atoms) + atoms.push_back(&a); + return atoms; +} + +// Whether `atoms` is Atoms(model) still: as many atoms, the first and the last the same ones. +bool SameAtoms(const gemmi::Model &model, const std::vector &atoms) { + size_t n = 0; + const gemmi::Atom *first = nullptr, *last = nullptr; + for (const gemmi::Chain &ch : model.chains) + for (const gemmi::Residue &r : ch.residues) + if (!r.atoms.empty()) { + if (first == nullptr) + first = &r.atoms.front(); + last = &r.atoms.back(); + n += r.atoms.size(); + } + return n > 0 && n == atoms.size() && first == atoms.front() && last == atoms.back(); +} + +// The engine's single-precision gradient into the caller's doubles, element by element in parallel: bit for bit +// the serial loop's. +void Widen(const std::array *from, size_t n, std::vector> &to, size_t nthreads) { + to.resize(n); + ParallelChunks(static_cast(n), ThreadsForWork(n, nthreads, 16384), [&](int lo, int hi) { + for (int i = lo; i < hi; i++) + to[i] = {from[i][0], from[i][1], from[i][2], from[i][3]}; + }); +} + +class RefinementEngineGPU : public RefinementEngine { +public: + RefinementEngineGPU(int device, const gemmi::UnitCell &cell, const gemmi::SpaceGroup &sg, double d_min, + const RefinementReflections &refl, const gemmi::Model &model, double b_max, size_t nthreads) + : device_(device), cell_(cell), sg_(sg), d_min_(d_min), nthreads_(nthreads) { + const gemmi::Grid grid = RigidBodyZoneGrid(cell, sg, d_min); + setup_.grid.nu = grid.nu; + setup_.grid.nv = grid.nv; + setup_.grid.nw = grid.nw; + for (int i = 0; i < 3; i++) + for (int j = 0; j < 3; j++) { + setup_.grid.orth[3 * i + j] = cell.orth.mat[i][j]; + setup_.grid.frac[3 * i + j] = cell.frac.mat[i][j]; + } + setup_.volume = cell.volume; + // the mask on a grid of its own, as BulkSolventMask has it + const gemmi::Grid mask_grid = BulkSolventMask::MaskGrid(cell, sg, d_min); + setup_.mask_grid = setup_.grid; + setup_.mask_grid.nu = mask_grid.nu; + setup_.mask_grid.nv = mask_grid.nv; + setup_.mask_grid.nw = mask_grid.nw; + const gemmi::GroupOps gops = sg.operations(); + setup_.den = gemmi::Op::DEN; + setup_.centring = static_cast(gops.cen_ops.size()); + for (const gemmi::Op &op : gops.sym_ops) { + std::array o{}; + for (int i = 0; i < 3; i++) { + for (int j = 0; j < 3; j++) + o[3 * i + j] = op.rot[i][j]; + o[9 + i] = op.tran[i]; + } + setup_.sym_ops.push_back(o); + } + for (const gemmi::Op::Tran &cen : gops.cen_ops) + for (const gemmi::Op &op : gops.sym_ops) { + ModelMaskOp m{}; + for (int i = 0; i < 3; i++) { + for (int j = 0; j < 3; j++) + m.rot[3 * i + j] = static_cast(op.rot[i][j]) / gemmi::Op::DEN; + m.tran[i] = static_cast(op.tran[i] + cen[i]) / gemmi::Op::DEN; + } + setup_.mask_ops.push_back(m); + } + for (size_t m = 0; m < refl.Size(); m++) { + setup_.rows.push_back({refl.hkl[m][0], refl.hkl[m][1], refl.hkl[m][2]}); + setup_.inv_d2.push_back(refl.inv_d2[m]); + setup_.fo.push_back(refl.fo[m]); + setup_.work.push_back(!refl.free[m]); + setup_.centric.push_back(refl.centric[m]); + } + + // The adjoint of the composition on cuFFT's half-u spectrum: the term of row m and operator o, at + // k = hR, goes to k where k_u > 0, conjugated to -k where k_u < 0, and to both on the planes k_u = 0 + // and k_u = nu/2, which hold their own Friedel mates. + const int nu = grid.nu, nv = grid.nv, nw = grid.nw; + auto point = [&](int ku, int kv, int kw) { + return ku + (nu / 2 + 1) * (gemmi::modulo(kv, nv) + nv * gemmi::modulo(kw, nw)); + }; + std::vector> entries; + const int n_ops = static_cast(gops.sym_ops.size()); + for (size_t m = 0; m < refl.Size(); m++) + for (int o = 0; o < n_ops; o++) { + const gemmi::Miller k = gops.sym_ops[o].apply_to_hkl(refl.hkl[m]); + const int term = (static_cast(m) * n_ops + o) * 2; + if (k[0] > 0 && 2 * k[0] != nu) + entries.emplace_back(point(k[0], k[1], k[2]), term); + else if (k[0] < 0 && -2 * k[0] != nu) + entries.emplace_back(point(-k[0], -k[1], -k[2]), term + 1); + else { + const int ku = std::abs(k[0]); + entries.emplace_back(point(ku, k[1], k[2]), term); + entries.emplace_back(point(ku, -k[1], -k[2]), term + 1); + } + } + std::stable_sort(entries.begin(), entries.end(), + [](const auto &a, const auto &b) { return a.first < b.first; }); + for (size_t e = 0; e < entries.size(); e++) { + if (e == 0 || entries[e].first != entries[e - 1].first) { + setup_.scatter_point.push_back(entries[e].first); + setup_.scatter_start.push_back(static_cast(e)); + } + setup_.scatter_term.push_back(entries[e].second); + } + setup_.scatter_start.push_back(static_cast(entries.size())); + + // The gather's reserve for every atom at b_max with the largest blur a refinement sets (B down to 0). + dc_ = Calculator(RefinementBlur(cell, sg, d_min, 0.0)); + std::vector widest; + for (const gemmi::Atom *a : Atoms(model)) + widest.push_back(DensityAtom(*a, b_max, dc_)); + setup_.max_atoms = widest.size(); + setup_.max_pairs = ModelDensityGPU::PairBound(setup_.grid, widest); + supported_ = !setup_.rows.empty() && ModelDensityGPU::Supports(setup_.grid, widest) && + setup_.mask_ops.size() <= ModelMaskGPU::MAX_OPS; + if (supported_) { + fft_work_ = RefinementGPUEngine::FFTWorkBytes(device, setup_); + // the restraints: about thirty records and slots per atom + bytes_ = RefinementGPUEngine::DeviceBytes(setup_, fft_work_, 30 * widest.size(), 60 * widest.size()); + } + } + + bool Supported() const { return supported_; } + size_t Bytes() const { return bytes_; } + void Reserve() { engine_ = std::make_unique(device_, setup_, fft_work_); } + + void SetBlur(double blur) override { + dc_ = Calculator(blur); + last_b_.clear(); + engine_->SetBlur(blur); + } + + void SetRowModel(const XrayRowModel &rows) override { + std::vector> fmask(rows.fmask.size()); + for (size_t m = 0; m < fmask.size(); m++) + fmask[m] = {rows.fmask[m].real(), rows.fmask[m].imag()}; + engine_->SetRowModel(rows.k_total, fmask, rows.d, rows.var); + } + + bool OnGPU() const override { return true; } + + void Fcalc(const gemmi::Model &model, std::vector> &f) override { + SetAtoms(model); + std::vector> out; + engine_->Fcalc(out); + f.resize(out.size()); + for (size_t m = 0; m < out.size(); m++) + f[m] = {out[m][0], out[m][1]}; + } + + void Fmask(const gemmi::Model &model, std::vector> &f) override { + const gemmi::SolventMasker masker(gemmi::AtomicRadiiSet::Refmac); + std::vector mask_atoms; + for (const gemmi::Atom *a : Atoms(model)) { + if ((masker.ignore_hydrogen && a->is_hydrogen()) || (masker.ignore_zero_occupancy_atoms && a->occ <= 0)) + continue; + const gemmi::Fractional f0 = cell_.fractionalize(a->pos); + double frac[3] = {f0.x, f0.y, f0.z}; + for (double &x : frac) { + x -= std::floor(x); + if (x >= 1.0) + x = 0.0; + } + mask_atoms.push_back({frac[0], frac[1], frac[2], + masker.constant_r + masker.rprobe + + gemmi::refmac_radius_for_bulk_solvent(a->element.elem)}); + } + std::vector> out; + engine_->Fmask(mask_atoms, out); + f.resize(out.size()); + for (size_t m = 0; m < out.size(); m++) + f[m] = {out[m][0], out[m][1]}; + } + + double Evaluate(const gemmi::Model &model, std::vector> *grad) override { + SetAtoms(model); + double value = 0; + { + const RefinementStage stage("gpu.evaluate"); + value = engine_->Evaluate(grad != nullptr); + } + if (grad != nullptr) + Widen(engine_->HostGradient(), atom_ptrs_.size(), *grad, nthreads_); + return value; + } + + double EvaluateWithRestraints(const gemmi::Model &model, int which, std::vector> *grad, + std::vector> *restraint_grad, double &restraints) override { + SetAtoms(model); + double value = 0; + { + const RefinementStage stage("gpu.evaluate"); + value = engine_->EvaluateWithRestraints(grad != nullptr, which, [&](std::array *x) { + for (size_t i = 0; i < atom_ptrs_.size(); i++) { + const gemmi::Atom &a = *atom_ptrs_[i]; + x[i] = {static_cast(a.pos.x), static_cast(a.pos.y), static_cast(a.pos.z), a.b_iso}; + } + }, restraint_grad != nullptr, restraints); + } + if (grad != nullptr) + Widen(engine_->HostGradient(), atom_ptrs_.size(), *grad, nthreads_); + if (restraint_grad != nullptr) + Widen(engine_->HostRestraintGradient(), atom_ptrs_.size(), *restraint_grad, nthreads_); + return value; + } + + void SetRestraints(int which, const RestraintSet &set) override { + engine_->SetRestraints(which, set.records, set.plane_atoms, set.slot_start, set.slot_index, set.n_slots); + } + + double EvaluateRestraints(int which, const std::vector> &xyzb, + std::vector> *grad) override { + std::vector> x(xyzb.size()), g; + for (size_t i = 0; i < xyzb.size(); i++) + x[i] = {static_cast(xyzb[i][0]), static_cast(xyzb[i][1]), static_cast(xyzb[i][2]), + static_cast(xyzb[i][3])}; + double value = 0; + { + const RefinementStage stage("gpu.restraints"); + value = engine_->EvaluateRestraints(which, x, grad != nullptr ? &g : nullptr); + } + if (grad != nullptr) { + grad->resize(g.size()); + for (size_t i = 0; i < g.size(); i++) + (*grad)[i] = {g[i][0], g[i][1], g[i][2], g[i][3]}; + } + return value; + } + +private: + gemmi::DensityCalculator Calculator(double blur) const { + gemmi::DensityCalculator dc; + dc.d_min = d_min_; + dc.rate = 1.5; + dc.grid.unit_cell = cell_; + dc.grid.spacegroup = &sg_; + dc.blur = blur; + dc.cutoff = REFINEMENT_DENSITY_CUTOFF; + return dc; + } + + // The atoms' grid positions to the device, and their densities where some B moved (made again only for the + // atoms whose B moved). + void SetAtoms(const gemmi::Model &model) { + std::optional stage("gpu.atoms_host"); + // the pointers kept from the last call where the model is the same one still (its context's own) + if (!SameAtoms(model, atom_ptrs_)) + atom_ptrs_ = Atoms(model); + const std::vector &atoms = atom_ptrs_; + const int n = static_cast(atoms.size()); + if (last_b_.size() != atoms.size()) { + last_b_.assign(atoms.size(), NAN); + atoms_.resize(atoms.size()); + pos_.resize(atoms.size()); + } + changed_.assign(atoms.size(), 0); + const int n3[3] = {setup_.grid.nu, setup_.grid.nv, setup_.grid.nw}; + ParallelChunks(n, ThreadsForWork(atoms.size(), nthreads_, 4096), [&](int lo, int hi) { + for (int i = lo; i < hi; i++) { + if (!(atoms[i]->b_iso == last_b_[i])) { + atoms_[i] = DensityAtom(*atoms[i], atoms[i]->b_iso, dc_); + last_b_[i] = atoms[i]->b_iso; + changed_[i] = 1; + } + const gemmi::Fractional f = cell_.fractionalize(atoms[i]->pos); + pos_[i] = {static_cast(f.x * n3[0]), static_cast(f.y * n3[1]), static_cast(f.z * n3[2]), 0}; + } + }); + stage.reset(); + const RefinementStage upload("gpu.upload"); + if (std::find(changed_.begin(), changed_.end(), 1) != changed_.end()) + engine_->SetDensities(atoms_.data(), atoms_.size()); + engine_->SetPositions(pos_.data(), pos_.size()); + } + + int device_; + gemmi::UnitCell cell_; + const gemmi::SpaceGroup &sg_; + double d_min_; + size_t nthreads_; + RefinementGPUSetup setup_; + gemmi::DensityCalculator dc_; + bool supported_ = false; + size_t fft_work_ = 0, bytes_ = 0; + std::unique_ptr engine_; + std::vector atom_ptrs_; // the model's atoms at the last SetAtoms() + std::vector last_b_; + PinnedVector atoms_; // pinned: a B rung sends them every evaluation (37 MB on a large model) + PinnedVector> pos_; + std::vector changed_; +}; + +} // namespace + +std::unique_ptr MakeRefinementEngineGPU(int device, const gemmi::UnitCell &cell, + const gemmi::SpaceGroup &sg, double d_min, + const RefinementReflections &refl, + const gemmi::Model &model, double b_max, size_t budget, + size_t *device_bytes, size_t nthreads) { + auto engine = std::make_unique(device, cell, sg, d_min, refl, model, b_max, nthreads); + if (device_bytes != nullptr) + *device_bytes = engine->Bytes(); + if (!engine->Supported() || engine->Bytes() > budget) + return nullptr; + engine->Reserve(); + return engine; +} diff --git a/image_analysis/structure_refinement/RefinementGPU.cu b/image_analysis/structure_refinement/RefinementGPU.cu new file mode 100644 index 000000000..90d9672ec --- /dev/null +++ b/image_analysis/structure_refinement/RefinementGPU.cu @@ -0,0 +1,922 @@ +// SPDX-FileCopyrightText: 2026 Filip Leonarski, Paul Scherrer Institute +// SPDX-License-Identifier: GPL-3.0-only + +#include "RefinementGPUEngine.h" + +#include +#include + +#include +#include + +#include "../../common/JFJochException.h" +#include "../indexing/CUDAMemHelpers.h" + +namespace { + +void cuda_err(cudaError_t val) { + if (val != cudaSuccess) + throw JFJochException(JFJochExceptionCategory::GPUCUDAError, cudaGetErrorString(val)); +} + +void cufft_err(cufftResult val) { + if (val != CUFFT_SUCCESS) + throw JFJochException(JFJochExceptionCategory::GPUCUDAError, "cuFFT error " + std::to_string(static_cast(val))); +} + +constexpr int THREADS = 256; +constexpr int WARP = 32; +constexpr double FOUR_PI2 = 4 * refine_math::PI * refine_math::PI; + +int blocks(size_t n) { + return static_cast((n + THREADS - 1) / THREADS); +} + +__device__ __forceinline__ int imod(int a, int n) { + const int r = a % n; + return r < 0 ? r + n : r; +} + +// gemmi's unsafe_expapprox(), as ModelDensityGPU.cu has it. +__device__ __forceinline__ float expapprox(float x) { + const float val = 12102203.1615614f * x + 1065353216.f; + const int vali = static_cast(val); + const float a = __int_as_float(vali & 0x7F800000); + const float b = __int_as_float((vali & 0x7FFFFF) | 0x3F800000); + return a * (0.509871020f + b * (0.312146713f + b * (0.166617139f + b * (-2.190619930e-3f + b * 1.3555747234e-2f)))); +} + +// exp(+2 pi i h.t) for h.t = ht / den, exact for the fractions a translation is made of. +__device__ __forceinline__ void op_phase(int ht, int den, double &c, double &s) { + sincospi(2.0 * ht / den, &s, &c); +} + +// The phases of every h.t the rows and operators make, as a table over the integer h.t from `min`: the hot +// kernels read it in place of op_phase() - the same function at the same argument, so the same bits. +__global__ void phase_table_kernel(int min, int count, int den, double2 *phase) { + const int i = blockIdx.x * blockDim.x + threadIdx.x; + if (i >= count) + return; + double s, c; + op_phase(min + i, den, c, s); + phase[i] = make_double2(c, s); +} + +// F of the atoms at each row, composed from the half-u transform of one copy (ModelStructureFactorsGPU.cu's +// compose_kernel), and with `evaluate` the target's term of a working row and the coefficient +// conj(dT/dF) n_cen unblur the gradient's map is made of. `ops` holds each operator's rotation in whole +// units and its translation in units of 1 / den. +__global__ void compose_target_kernel(const float2 *f1, float norm, int nu, int nv, int nw, const int *ops, int n_ops, + const double2 *phase, int phase_min, const int *row_hkl, const double *row_scale, + int rows, bool evaluate, const float *k_total, const float2 *fmask, + const float *ml_d, const float *ml_var, const float *fo, const char *work, + const char *centric, float2 *f, double *nll, float2 *coef) { + const int m = blockIdx.x * blockDim.x + threadIdx.x; + if (m >= rows) + return; + const int h[3] = {row_hkl[3 * m], row_hkl[3 * m + 1], row_hkl[3 * m + 2]}; + double sr = 0, si = 0; + for (int o = 0; o < n_ops; o++) { + const int *rot = ops + 12 * o, *tran = rot + 9; + int k[3]; + for (int i = 0; i < 3; i++) + k[i] = rot[i] * h[0] + rot[3 + i] * h[1] + rot[6 + i] * h[2]; + const bool conj = k[0] < 0; + if (conj) + for (int i = 0; i < 3; i++) + k[i] = -k[i]; + const float2 out = f1[k[0] + static_cast(nu / 2 + 1) * (imod(k[1], nv) + static_cast(nv) * imod(k[2], nw))]; + const double vr = out.x * norm, vi = (conj ? out.y : -out.y) * norm; + const double2 p = phase[h[0] * tran[0] + h[1] * tran[1] + h[2] * tran[2] - phase_min]; + sr += p.x * vr - p.y * vi; + si += p.x * vi + p.y * vr; + } + const double scale = row_scale[m]; + sr *= scale; + si *= scale; + f[m] = make_float2(static_cast(sr), static_cast(si)); + if (!evaluate) + return; + double term = 0, cr = 0, ci = 0; + if (work[m]) { + const double k = k_total[m]; + const double mr = k * (sr + fmask[m].x), mi = k * (si + fmask[m].y); + const double fc = sqrt(mr * mr + mi * mi); + double dfc = 0; + term = refine_math::AmplitudeNegLogLikelihood(fo[m], fc, ml_d[m], ml_var[m], centric[m], dfc); + if (fc > 0) { + // dT/dF = k dT/d|F_model| F_model / |F_model|; the coefficient is its conjugate times the scale + const double g = k * dfc / fc * scale; + cr = g * mr; + ci = -g * mi; + } + } + nll[m] = term; + coef[m] = make_float2(static_cast(cr), static_cast(ci)); +} + +// The gradient's coefficients on the half-u spectrum: each point the sum, in order, of the terms +// (coef[row] exp(2 pi i h.t_op)) / 2 that land on it, conjugated where they land as a Friedel mate. A term is +// its row * 2 + conj, and its phase the table's entry at term_phase. +__global__ void scatter_kernel(const float2 *coef, const double2 *phase, const int *point, const int *start, + const int *term, const int *term_phase, int points, float2 *spectrum) { + const int s = blockIdx.x * blockDim.x + threadIdx.x; + if (s >= points) + return; + double sr = 0, si = 0; + for (int e = start[s]; e < start[s + 1]; e++) { + const int t = term[e]; + const bool conj = t & 1; + const int m = t >> 1; + const double2 p = phase[term_phase[e]]; + const double ar = 0.5 * (coef[m].x * p.x - coef[m].y * p.y), ai = 0.5 * (coef[m].x * p.y + coef[m].y * p.x); + sr += ar; + si += conj ? -ai : ai; + } + spectrum[point[s]] = make_float2(static_cast(sr), static_cast(si)); +} + +// F_mask at each row, read at h directly (ModelStructureFactorsGPU.cu's fmask_kernel). +__global__ void fmask_kernel(const float2 *fm, float norm, const int *row_hkl, int rows, int nu, int nv, int nw, + float2 *fmask) { + const int m = blockIdx.x * blockDim.x + threadIdx.x; + if (m >= rows) + return; + int h = row_hkl[3 * m], k = row_hkl[3 * m + 1], l = row_hkl[3 * m + 2]; + const bool conj = h < 0; + if (conj) { + h = -h; + k = -k; + l = -l; + } + const float2 out = fm[h + static_cast(nu / 2 + 1) * (imod(k, nv) + static_cast(nv) * imod(l, nw))]; + const float re = out.x * norm, im = -out.y * norm; + fmask[m] = make_float2(re, conj ? -im : im); +} + +// dT/d(x, y, z, B) of every atom: the derivative map summed against the derivatives of the atom's density over +// its box, one warp per atom, the lanes' sums added in a fixed tree. The box, the points within the radius and +// their offsets from the centre are the density gather's (ModelDensityGPU.cu). +__global__ void atom_gradient_kernel(const ModelDensityAtom *atoms, const float4 *pos, const int *box, int n, + ModelDensityGPU::Geometry g, const float *map, float map_scale, float4 *grad) { + const int a = (blockIdx.x * blockDim.x + threadIdx.x) / WARP; + const int lane = threadIdx.x % WARP; + if (a >= n) + return; + const ModelDensityAtom at = atoms[a]; + const float4 p = pos[a]; + const float nctr[3] = {p.x, p.y, p.z}; + // the box's first point, unwrapped and wrapped into the grid; a box is narrower than the cell (Supports()) + int lo[3], first[3], span[3]; + const int n3[3] = {g.nu, g.nv, g.nw}; + for (int k = 0; k < 3; k++) { + lo[k] = __float2int_rn(nctr[k]) - box[3 * a + k]; + first[k] = imod(lo[k], n3[k]); + span[k] = 2 * box[3 * a + k] + 1; + } + const int total = span[0] * span[1] * span[2]; + // the lane's points t = lane, lane + WARP, ... as (iu, iv, iw) in the box, stepped on without dividing + int iu = lane % span[0], iv = lane / span[0] % span[1], iw = lane / (span[0] * span[1]); + const int step_u = WARP % span[0], step_v = WARP / span[0]; + auto next = [&]() { + iu += step_u; + iv += step_v; + if (iu >= span[0]) { + iu -= span[0]; + iv++; + } + while (iv >= span[1]) { + iv -= span[1]; + iw++; + } + }; + float gx = 0, gy = 0, gz = 0, gb = 0; + for (int t = lane; t < total; t += WARP, next()) { + const int u = lo[0] + iu, v = lo[1] + iv, w = lo[2] + iw; + const float fx = nctr[0] - static_cast(u); + const float fy = nctr[1] - static_cast(v); + const float fz = nctr[2] - static_cast(w); + const float z = g.m22 * fz; + const float y = g.m11 * fy + g.m12 * fz; + const float x = g.m00 * fx + (g.m01 * fy + g.m02 * fz); + const float r2 = (y * y + z * z) + x * x; + if (r2 > at.max_r2) + continue; + const int mu = first[0] + iu, mv = first[1] + iv, mw = first[2] + iw; + const float value = map[(mu < g.nu ? mu : mu - g.nu) + + static_cast(g.nu) * ((mv < g.nv ? mv : mv - g.nv) + + static_cast(g.nv) * (mw < g.nw ? mw : mw - g.nw))]; + float dr2 = 0, db = 0; + for (int q = 0; q < 5; q++) { + const float b = at.b[q][0]; + const float e = at.a[q] * expapprox(fmaxf(b * r2, -88.f)); + dr2 += e * b; + db += e * b * (1.5f + b * r2); + } + gx += value * dr2 * x; + gy += value * dr2 * y; + gz += value * dr2 * z; + gb += value * db; + } + for (int off = WARP / 2; off > 0; off /= 2) { + gx += __shfl_down_sync(0xffffffff, gx, off); + gy += __shfl_down_sync(0xffffffff, gy, off); + gz += __shfl_down_sync(0xffffffff, gz, off); + gb += __shfl_down_sync(0xffffffff, gb, off); + } + if (lane == 0) { + const float s = 2.0f * at.occ * map_scale; + grad[a] = make_float4(s * gx, s * gy, s * gz, at.occ * map_scale * gb / static_cast(FOUR_PI2)); + } +} + +using V3f = refine_math::V3; + +__device__ V3f xyz(const float4 *p, int i) { + const float4 q = p[i]; + return {q.x, q.y, q.z}; +} + +// Every restraint's E, and its gradient into its slots, one thread per restraint. +__global__ void restraint_kernel(const RestraintRecord *records, int n, const int *plane_atoms, const float4 *xyzb, + float4 *contrib, double *energy) { + const int i = blockIdx.x * blockDim.x + threadIdx.x; + if (i >= n) + return; + const RestraintRecord &r = records[i]; + V3f g[4] = {}; + int na = 0; + float e = 0; + switch (static_cast(r.kind)) { + case RestraintKind::Bond: + e = refine_math::BondTerm(xyz(xyzb, r.atom[0]), xyz(xyzb, r.atom[1]), r.ideal, r.sigma, g); + na = 2; + break; + case RestraintKind::Angle: + e = refine_math::AngleTerm(xyz(xyzb, r.atom[0]), xyz(xyzb, r.atom[1]), xyz(xyzb, r.atom[2]), r.ideal, + r.sigma, g); + na = 3; + break; + case RestraintKind::Torsion: + e = refine_math::TorsionTerm(xyz(xyzb, r.atom[0]), xyz(xyzb, r.atom[1]), xyz(xyzb, r.atom[2]), + xyz(xyzb, r.atom[3]), r.ideal, r.sigma, r.period, g); + na = 4; + break; + case RestraintKind::Chiral: + e = refine_math::ChiralTerm(xyz(xyzb, r.atom[0]), xyz(xyzb, r.atom[1]), xyz(xyzb, r.atom[2]), + xyz(xyzb, r.atom[3]), r.ideal, r.sigma, g); + na = 4; + break; + case RestraintKind::Repulsion: { + const V3f q = xyz(xyzb, r.atom[1]); + const V3f image{r.rot[0] * q.x + r.rot[1] * q.y + r.rot[2] * q.z + r.tran[0], + r.rot[3] * q.x + r.rot[4] * q.y + r.rot[5] * q.z + r.tran[1], + r.rot[6] * q.x + r.rot[7] * q.y + r.rot[8] * q.z + r.tran[2]}; + e = refine_math::RepulsionTerm(xyz(xyzb, r.atom[0]), image, r.ideal, r.sigma, g); + const V3f gi = g[1]; + g[1] = {r.rot[0] * gi.x + r.rot[3] * gi.y + r.rot[6] * gi.z, + r.rot[1] * gi.x + r.rot[4] * gi.y + r.rot[7] * gi.z, + r.rot[2] * gi.x + r.rot[5] * gi.y + r.rot[8] * gi.z}; + na = 2; + break; + } + case RestraintKind::Plane: { + V3f px[RefinementGPUEngine::MAX_PLANE_ATOMS], pg[RefinementGPUEngine::MAX_PLANE_ATOMS]; + const int m = r.atom[1]; + for (int k = 0; k < m; k++) + px[k] = xyz(xyzb, plane_atoms[r.atom[0] + k]); + e = refine_math::PlaneTerm(px, m, r.sigma, pg); + for (int k = 0; k < m; k++) + contrib[r.slot + k] = make_float4(pg[k].x, pg[k].y, pg[k].z, 0.0f); + break; + } + case RestraintKind::BSimilarity: { + float gi = 0, gj = 0; + e = refine_math::BSimilarityTerm(xyzb[r.atom[0]].w, xyzb[r.atom[1]].w, r.sigma, gi, gj); + contrib[r.slot] = make_float4(0, 0, 0, gi); + contrib[r.slot + 1] = make_float4(0, 0, 0, gj); + break; + } + } + for (int k = 0; k < na; k++) + contrib[r.slot + k] = make_float4(g[k].x, g[k].y, g[k].z, 0.0f); + energy[i] = e; +} + +// Each atom's restraint gradient: its slots summed in order. +__global__ void slot_gather_kernel(const float4 *contrib, const int *start, const int *index, int n, float4 *grad) { + const int a = blockIdx.x * blockDim.x + threadIdx.x; + if (a >= n) + return; + float4 s = make_float4(0, 0, 0, 0); + for (int k = start[a]; k < start[a + 1]; k++) { + const float4 c = contrib[index[k]]; + s.x += c.x; + s.y += c.y; + s.z += c.z; + s.w += c.w; + } + grad[a] = s; +} + +CudaFFTShape ForwardShape(const ModelDensityGrid &g) { + return {.n = {g.nw, g.nv, g.nu}, .idist = g.nu * g.nv * g.nw, .odist = (g.nu / 2 + 1) * g.nv * g.nw, + .type = CUFFT_R2C}; +} + +bool SameGrid(const ModelDensityGrid &a, const ModelDensityGrid &b) { + return a.nu == b.nu && a.nv == b.nv && a.nw == b.nw; +} + +CudaFFTShape InverseShape(const ModelDensityGrid &g) { + return {.n = {g.nw, g.nv, g.nu}, .idist = (g.nu / 2 + 1) * g.nv * g.nw, .odist = g.nu * g.nv * g.nw, + .type = CUFFT_C2R}; +} + +class DeviceGuard { +public: + explicit DeviceGuard(int device) { + cuda_err(cudaGetDevice(&previous_)); + cuda_err(cudaSetDevice(device)); + } + ~DeviceGuard() { cudaSetDevice(previous_); } + DeviceGuard(const DeviceGuard &) = delete; + DeviceGuard &operator=(const DeviceGuard &) = delete; + +private: + int previous_ = 0; +}; + +size_t GridPoints(const ModelDensityGrid &g) { + return static_cast(g.nu) * g.nv * g.nw; +} + +size_t ComplexPoints(const ModelDensityGrid &g) { + return static_cast(g.nu / 2 + 1) * g.nv * g.nw; +} + +template +void Upload(CudaDevicePtr &dst, const std::vector &src, cudaStream_t stream) { + if (!src.empty()) + cuda_err(cudaMemcpyAsync(dst, src.data(), src.size() * sizeof(T), cudaMemcpyHostToDevice, stream)); +} + +// A device buffer of at least n elements, kept between calls and grown when it is too small. +template +void Ensure(CudaDevicePtr &p, size_t &capacity, size_t n) { + if (n <= capacity && p) + return; + capacity = std::max(n, 1); + p = CudaDevicePtr(capacity, CudaAlloc::Synchronous); +} + +// h.t of a row and an operator, in units of 1 / den. +int HT(const std::array &h, const std::array &op) { + return h[0] * op[9] + h[1] * op[10] + h[2] * op[11]; +} + +// The range of h.t over the rows and operators: the phase table's. +void PhaseRange(const RefinementGPUSetup &setup, int &min, int &max) { + min = max = 0; + for (const auto &h : setup.rows) + for (const auto &op : setup.sym_ops) { + const int ht = HT(h, op); + min = std::min(min, ht); + max = std::max(max, ht); + } +} + +// cub's temporary storage to reduce n doubles. +size_t ReduceBytes(size_t n) { + size_t bytes = 0; + cuda_err(cub::DeviceReduce::Sum(nullptr, bytes, static_cast(nullptr), static_cast(nullptr), + static_cast(std::max(n, 1)))); + return bytes; +} + +// The engine's wait on its stream, polling: an evaluation is a millisecond or a few, and where a slot has a +// card to itself the wake-up of a sleeping thread is on the critical path of every one of them. +class StreamPoller { +public: + cudaError_t Wait(cudaStream_t stream) const { + cudaError_t err; + while ((err = cudaStreamQuery(stream)) == cudaErrorNotReady) {} + return err; + } +}; + +// What a function queues on a stream, recorded once as a CUDA graph and replayed from then on: the same +// launches in the same order, so the same bits, without the host between them. Recorded again where `key` +// differs from the recording's (another shape: the atoms, a gradient asked or not, another restraint set). +// Where the stream cannot be captured the function is run as it is, every time. +class RecordedLaunches { +public: + RecordedLaunches() = default; + RecordedLaunches(const RecordedLaunches &) = delete; + RecordedLaunches &operator=(const RecordedLaunches &) = delete; + ~RecordedLaunches() { + if (exec_ != nullptr) + cudaGraphExecDestroy(exec_); + } + + void Launch(cudaStream_t stream, long key, const std::function &queue) { + if (direct_) { + queue(); + return; + } + if (exec_ == nullptr || key != key_) { + if (exec_ != nullptr) + cuda_err(cudaGraphExecDestroy(exec_)); + exec_ = nullptr; + cudaGraph_t graph = nullptr; + cuda_err(cudaStreamBeginCapture(stream, cudaStreamCaptureModeThreadLocal)); + try { + queue(); + } catch (const JFJochException &) { + cudaStreamEndCapture(stream, &graph); + if (graph != nullptr) + cudaGraphDestroy(graph); + cudaGetLastError(); + direct_ = true; + queue(); + return; + } + cuda_err(cudaStreamEndCapture(stream, &graph)); + cuda_err(cudaGraphInstantiate(&exec_, graph, 0)); + cuda_err(cudaGraphDestroy(graph)); + key_ = key; + } + cuda_err(cudaGraphLaunch(exec_, stream)); + } + +private: + cudaGraphExec_t exec_ = nullptr; + long key_ = 0; + bool direct_ = false; +}; + +} // namespace + +struct RefinementGPUEngineImpl { + struct Restraints { + int records = 0, atoms = 0; + size_t cap_records = 0, cap_planes = 0, cap_start = 0, cap_index = 0, cap_slots = 0, cap_reduce = 0, + cap_atoms = 0, cap_xyzb = 0, reduce_bytes = 0; + CudaDevicePtr rec; + CudaDevicePtr plane_atoms, slot_start, slot_index; + CudaDevicePtr contrib, xyzb, grad; + CudaDevicePtr energy, sum; + CudaDevicePtr reduce_temp; + int version = 0; // counts SetRestraints(): a recording of the set is of one version + RecordedLaunches launches; + }; + + RefinementGPUSetup setup; + size_t work_bytes; + int device = 0; + CudaStream stream; + StreamPoller waiter; // the engine's waits on the stream, polled + int n_atoms = 0; + + CudaDevicePtr pos; + // What comes back, pinned, so that a copy back queues without waiting: the X-ray target and the restraints' + // sums, their gradients, and the restraints' positions going up. + CudaHostPtr host_sums; + CudaHostPtr host_grad, host_xyzb, host_restraint_grad; + CudaDevicePtr mask_atoms; + CudaDevicePtr grid; + CudaDevicePtr spectrum; + CudaDevicePtr fft_work; + // The mask's grid, spectrum and transform where its grid is not the structure factors' (grid, spectrum, + // forward otherwise). + CudaDevicePtr mask_grid; + CudaDevicePtr mask_spectrum; + CudaDevicePtr ops, row_hkl; + CudaDevicePtr row_scale; + CudaDevicePtr k_total, ml_d, ml_var, fo; + CudaDevicePtr fmask_scaled, f, fm, coef; + CudaDevicePtr work, centric; + CudaDevicePtr nll, nll_sum; + CudaDevicePtr reduce_temp; + size_t reduce_bytes = 0; + CudaDevicePtr scatter_point, scatter_start, scatter_term, scatter_phase; + CudaDevicePtr phase; // exp(2 pi i h.t) over the integer h.t from phase_min + int phase_min = 0; + CudaDevicePtr grad; + std::unique_ptr density; + std::unique_ptr mask; + CudaFFTPlan forward, inverse, mask_forward; + ModelDensityGPU::Geometry geom{}; + Restraints restraints[2]; + RecordedLaunches evaluate; // QueueEvaluate() recorded + + RefinementGPUEngineImpl(int dev, const RefinementGPUSetup &s, size_t fft_work_bytes) : setup(s), work_bytes(fft_work_bytes), device(dev) { + const auto sync = CudaAlloc::Synchronous; + const size_t na = std::max(setup.max_atoms, 1), nr = std::max(setup.rows.size(), 1); + pos = CudaDevicePtr(na, sync); + host_sums = CudaHostPtr(2); + host_grad = CudaHostPtr(na); + host_xyzb = CudaHostPtr(na); + host_restraint_grad = CudaHostPtr(na); + mask_atoms = CudaDevicePtr(na, sync); + grad = CudaDevicePtr(na, sync); + grid = CudaDevicePtr(GridPoints(setup.grid), sync); + spectrum = CudaDevicePtr(ComplexPoints(setup.grid), sync); + fft_work = CudaDevicePtr(std::max(work_bytes, 1), sync); + ops = CudaDevicePtr(std::max(12 * setup.sym_ops.size(), 1), sync); + row_hkl = CudaDevicePtr(3 * nr, sync); + row_scale = CudaDevicePtr(nr, sync); + k_total = CudaDevicePtr(nr, sync); + ml_d = CudaDevicePtr(nr, sync); + ml_var = CudaDevicePtr(nr, sync); + fo = CudaDevicePtr(nr, sync); + fmask_scaled = CudaDevicePtr(nr, sync); + f = CudaDevicePtr(nr, sync); + fm = CudaDevicePtr(nr, sync); + coef = CudaDevicePtr(nr, sync); + work = CudaDevicePtr(nr, sync); + centric = CudaDevicePtr(nr, sync); + nll = CudaDevicePtr(nr, sync); + nll_sum = CudaDevicePtr(1, sync); + reduce_bytes = ReduceBytes(nr); + reduce_temp = CudaDevicePtr(std::max(reduce_bytes, 1), sync); + scatter_point = CudaDevicePtr(std::max(setup.scatter_point.size(), 1), sync); + scatter_start = CudaDevicePtr(std::max(setup.scatter_start.size(), 1), sync); + scatter_term = CudaDevicePtr(std::max(setup.scatter_term.size(), 1), sync); + scatter_phase = CudaDevicePtr(std::max(setup.scatter_term.size(), 1), sync); + int phase_max = 0; + PhaseRange(setup, phase_min, phase_max); + const int phase_count = phase_max - phase_min + 1; + phase = CudaDevicePtr(phase_count, sync); + density = std::make_unique(stream, setup.max_atoms, setup.max_pairs, + ModelDensityGPU::Bricks(setup.grid.nu, setup.grid.nv, setup.grid.nw)); + mask = std::make_unique(stream, GridPoints(setup.mask_grid)); + ModelMaskGrid mg; + mg.nu = setup.mask_grid.nu; + mg.nv = setup.mask_grid.nv; + mg.nw = setup.mask_grid.nw; + std::copy(setup.mask_grid.orth, setup.mask_grid.orth + 9, mg.orth); + mg.volume = setup.volume; + mask->SetGrid(mg, setup.mask_ops); + if (!SameGrid(setup.mask_grid, setup.grid)) { + mask_grid = CudaDevicePtr(GridPoints(setup.mask_grid), sync); + mask_spectrum = CudaDevicePtr(ComplexPoints(setup.mask_grid), sync); + } + + // the rotations in whole units (gemmi's are den times an integer matrix), the translations as given + std::vector flat_ops; + for (const auto &o : setup.sym_ops) { + for (int i = 0; i < 9; i++) + flat_ops.push_back(o[i] / setup.den); + flat_ops.insert(flat_ops.end(), o.begin() + 9, o.end()); + } + std::vector hkl; + for (const auto &h : setup.rows) + hkl.insert(hkl.end(), h.begin(), h.end()); + // each scatter term as row * 2 + conj, and its phase's place in the table + const int n_ops = static_cast(setup.sym_ops.size()); + std::vector term, term_phase; + for (const int t : setup.scatter_term) { + const int m = (t >> 1) / n_ops, o = (t >> 1) % n_ops; + term.push_back(m * 2 + (t & 1)); + term_phase.push_back(HT(setup.rows[m], setup.sym_ops[o]) - phase_min); + } + Upload(ops, flat_ops, stream); + Upload(row_hkl, hkl, stream); + Upload(fo, setup.fo, stream); + Upload(work, setup.work, stream); + Upload(centric, setup.centric, stream); + Upload(scatter_point, setup.scatter_point, stream); + Upload(scatter_start, setup.scatter_start, stream); + Upload(scatter_term, term, stream); + Upload(scatter_phase, term_phase, stream); + phase_table_kernel<<>>(phase_min, phase_count, setup.den, phase); + cuda_err(cudaGetLastError()); + + const double inv_n[3] = {1.0 / setup.grid.nu, 1.0 / setup.grid.nv, 1.0 / setup.grid.nw}; + geom.nu = setup.grid.nu; + geom.nv = setup.grid.nv; + geom.nw = setup.grid.nw; + geom.m00 = static_cast(setup.grid.orth[0] * inv_n[0]); + geom.m01 = static_cast(setup.grid.orth[1] * inv_n[1]); + geom.m02 = static_cast(setup.grid.orth[2] * inv_n[2]); + geom.m11 = static_cast(setup.grid.orth[4] * inv_n[1]); + geom.m12 = static_cast(setup.grid.orth[5] * inv_n[2]); + geom.m22 = static_cast(setup.grid.orth[8] * inv_n[2]); + + forward = CudaFFTPlan(ForwardShape(setup.grid), stream, fft_work); + inverse = CudaFFTPlan(InverseShape(setup.grid), stream, fft_work); + if (!SameGrid(setup.mask_grid, setup.grid)) + mask_forward = CudaFFTPlan(ForwardShape(setup.mask_grid), stream, fft_work); + if (forward.WorkBytes() > work_bytes || inverse.WorkBytes() > work_bytes || + (mask_grid.get() != nullptr && mask_forward.WorkBytes() > work_bytes)) + throw JFJochException(JFJochExceptionCategory::GPUCUDAError, "refinement: cuFFT work area over the reserve"); + cuda_err(cudaStreamSynchronize(stream)); + } + + ~RefinementGPUEngineImpl() { cudaStreamSynchronize(stream); } + + float Norm() const { return static_cast(setup.volume / static_cast(GridPoints(setup.grid))); } + float MaskNorm() const { + return static_cast(setup.volume / static_cast(GridPoints(setup.mask_grid))); + } + + // The atoms' density on the grid and its transform into the spectrum. + void Transform() { + density->Compute(pos, grid); + cufft_err(forward.R2C(grid, reinterpret_cast(spectrum.get()))); + } + + void Compose(bool evaluate) { + const int rows = static_cast(setup.rows.size()); + if (rows == 0) + return; + compose_target_kernel<<>>( + spectrum, Norm(), setup.grid.nu, setup.grid.nv, setup.grid.nw, ops, static_cast(setup.sym_ops.size()), + phase, phase_min, row_hkl, row_scale, rows, evaluate, k_total, fmask_scaled, ml_d, ml_var, fo, work, centric, + f, nll, coef); + cuda_err(cudaGetLastError()); + } + + // The X-ray target into host_sums[0] and, with `grad`, its gradient into host_grad: queued, not waited for. + void QueueEvaluate(bool grad) { + const int rows = static_cast(setup.rows.size()); + Transform(); + Compose(true); + if (rows > 0) { + size_t temp = reduce_bytes; + cuda_err(cub::DeviceReduce::Sum(reduce_temp.get(), temp, nll.get(), nll_sum.get(), rows, stream)); + cuda_err(cudaMemcpyAsync(host_sums.get(), nll_sum, sizeof(double), cudaMemcpyDeviceToHost, stream)); + } + if (grad) { + const ModelDensityGrid &g = setup.grid; + cuda_err(cudaMemsetAsync(spectrum, 0, ComplexPoints(g) * sizeof(float2), stream)); + const int points = static_cast(setup.scatter_point.size()); + if (points > 0) { + scatter_kernel<<>>(coef, phase, scatter_point, scatter_start, + scatter_term, scatter_phase, points, spectrum); + cuda_err(cudaGetLastError()); + } + cufft_err(inverse.C2R(reinterpret_cast(spectrum.get()), this->grid)); + if (n_atoms > 0) { + const size_t threads = static_cast(n_atoms) * WARP; + atom_gradient_kernel<<>>(density->DeviceAtoms(), pos, + density->DeviceBoxes(), n_atoms, geom, + this->grid, Norm(), this->grad); + cuda_err(cudaGetLastError()); + cuda_err(cudaMemcpyAsync(host_grad.get(), this->grad, n_atoms * sizeof(float4), cudaMemcpyDeviceToHost, + stream)); + } + } + } + + // Restraint set `which` at host_xyzb into host_sums[1] and, with `grad`, its gradient into + // host_restraint_grad: queued, not waited for. + void QueueRestraints(int which, bool grad) { + Restraints &r = restraints[which]; + if (r.atoms > 0) + cuda_err(cudaMemcpyAsync(r.xyzb, host_xyzb.get(), r.atoms * sizeof(float4), cudaMemcpyHostToDevice, stream)); + if (r.records > 0) { + restraint_kernel<<>>(r.rec, r.records, r.plane_atoms, r.xyzb, r.contrib, + r.energy); + cuda_err(cudaGetLastError()); + size_t temp = r.reduce_bytes; + cuda_err(cub::DeviceReduce::Sum(r.reduce_temp.get(), temp, r.energy.get(), r.sum.get(), r.records, stream)); + cuda_err(cudaMemcpyAsync(host_sums.get() + 1, r.sum, sizeof(double), cudaMemcpyDeviceToHost, stream)); + } + if (grad && r.atoms > 0) { + if (r.records > 0) { + slot_gather_kernel<<>>(r.contrib, r.slot_start, r.slot_index, + r.atoms, r.grad); + cuda_err(cudaGetLastError()); + } else + cuda_err(cudaMemsetAsync(r.grad, 0, r.atoms * sizeof(float4), stream)); + cuda_err(cudaMemcpyAsync(host_restraint_grad.get(), r.grad, r.atoms * sizeof(float4), cudaMemcpyDeviceToHost, + stream)); + } + } + + // QueueEvaluate() and QueueRestraints() as their recordings (the sums that no launch writes zeroed here, on + // the host, so that a replay finds them so). + void LaunchEvaluate(bool grad) { + host_sums[0] = 0; + evaluate.Launch(stream, 2L * n_atoms + (grad ? 1 : 0), [&]() { QueueEvaluate(grad); }); + } + + void LaunchRestraints(int which, bool grad) { + Restraints &r = restraints[which]; + host_sums[1] = 0; + r.launches.Launch(stream, 2L * r.version + (grad ? 1 : 0), [&]() { QueueRestraints(which, grad); }); + } +}; + +namespace { + +void CopyOut(const float4 *from, int n, std::vector> &to) { + to.resize(n); + std::copy(reinterpret_cast *>(from), reinterpret_cast *>(from) + n, + to.begin()); +} + +} // namespace + +size_t RefinementGPUEngine::FFTWorkBytes(int device, const RefinementGPUSetup &setup) { + DeviceGuard guard(device); + size_t bytes = std::max(CudaFFTPlan::WorkBytes(ForwardShape(setup.grid)), + CudaFFTPlan::WorkBytes(InverseShape(setup.grid))); + if (!SameGrid(setup.mask_grid, setup.grid)) + bytes = std::max(bytes, CudaFFTPlan::WorkBytes(ForwardShape(setup.mask_grid))); + return bytes; +} + +size_t RefinementGPUEngine::DeviceBytes(const RefinementGPUSetup &s, size_t fft_work_bytes, size_t max_records, + size_t max_slots) { + const size_t na = s.max_atoms + 1, nr = s.rows.size() + 1; + size_t bytes = na * (2 * sizeof(float4) + 3 * sizeof(int) + sizeof(ModelMaskAtom) + sizeof(ModelDensityAtom)); + bytes += GridPoints(s.grid) * sizeof(float) + ComplexPoints(s.grid) * sizeof(float2) + fft_work_bytes; + bytes += nr * (3 * sizeof(int) + 2 * sizeof(double) + 4 * sizeof(float) + 4 * sizeof(float2) + 2); + bytes += (s.scatter_point.size() + s.scatter_start.size() + 2 * s.scatter_term.size()) * sizeof(int); + int phase_min = 0, phase_max = 0; + PhaseRange(s, phase_min, phase_max); + bytes += static_cast(phase_max - phase_min + 1) * sizeof(double2); + bytes += ModelDensityGPU::DeviceBytes(s.max_atoms, s.max_pairs, ModelDensityGPU::Bricks(s.grid.nu, s.grid.nv, s.grid.nw)); + bytes += ModelMaskGPU::DeviceBytes(GridPoints(s.mask_grid)); + if (!SameGrid(s.mask_grid, s.grid)) + bytes += GridPoints(s.mask_grid) * sizeof(float) + ComplexPoints(s.mask_grid) * sizeof(float2); + // the two restraint sets of SetRestraints(), each up to these + bytes += 2 * (max_records * (sizeof(RestraintRecord) + sizeof(double)) + max_slots * (sizeof(float4) + sizeof(int)) + + na * (2 * sizeof(float4) + sizeof(int))); + return bytes; +} + +RefinementGPUEngine::RefinementGPUEngine(int device, const RefinementGPUSetup &setup, size_t fft_work_bytes) { + DeviceGuard guard(device); + impl_ = std::make_unique(device, setup, fft_work_bytes); +} + +RefinementGPUEngine::~RefinementGPUEngine() { + if (impl_) { + DeviceGuard guard(impl_->device); + impl_.reset(); + } +} + +void RefinementGPUEngine::SetBlur(double blur) { + RefinementGPUEngineImpl &e = *impl_; + DeviceGuard guard(e.device); + std::vector scale(e.setup.rows.size()); + for (size_t m = 0; m < scale.size(); m++) + scale[m] = e.setup.centring * std::exp(blur * 0.25 * e.setup.inv_d2[m]); + Upload(e.row_scale, scale, e.stream); + cuda_err(e.waiter.Wait(e.stream)); +} + +void RefinementGPUEngine::SetRowModel(const std::vector &k_total, const std::vector> &fmask, + const std::vector &d, const std::vector &var) { + RefinementGPUEngineImpl &e = *impl_; + DeviceGuard guard(e.device); + Upload(e.k_total, k_total, e.stream); + if (!fmask.empty()) + cuda_err(cudaMemcpyAsync(e.fmask_scaled, fmask.data(), fmask.size() * sizeof(float2), cudaMemcpyHostToDevice, + e.stream)); + Upload(e.ml_d, d, e.stream); + Upload(e.ml_var, var, e.stream); + cuda_err(e.waiter.Wait(e.stream)); +} + +void RefinementGPUEngine::SetDensities(const ModelDensityAtom *atoms, size_t n) { + RefinementGPUEngineImpl &e = *impl_; + DeviceGuard guard(e.device); + if (n > e.setup.max_atoms) + throw JFJochException(JFJochExceptionCategory::GPUCUDAError, "refinement: atoms over the reserve"); + e.density->SetAtoms(e.setup.grid, atoms, n); + e.n_atoms = static_cast(n); +} + +void RefinementGPUEngine::SetPositions(const std::array *pos, size_t n) { + RefinementGPUEngineImpl &e = *impl_; + DeviceGuard guard(e.device); + if (static_cast(n) != e.n_atoms) + throw JFJochException(JFJochExceptionCategory::GPUCUDAError, "refinement: positions do not match the atoms"); + if (n > 0) + cuda_err(cudaMemcpyAsync(e.pos, pos, n * sizeof(float4), cudaMemcpyHostToDevice, e.stream)); +} + +void RefinementGPUEngine::Fcalc(std::vector> &f) { + RefinementGPUEngineImpl &e = *impl_; + DeviceGuard guard(e.device); + e.Transform(); + e.Compose(false); + f.resize(e.setup.rows.size()); + if (!f.empty()) + cuda_err(cudaMemcpyAsync(f.data(), e.f, f.size() * sizeof(float2), cudaMemcpyDeviceToHost, e.stream)); + cuda_err(e.waiter.Wait(e.stream)); +} + +void RefinementGPUEngine::Fmask(const std::vector &mask_atoms, std::vector> &f) { + RefinementGPUEngineImpl &e = *impl_; + DeviceGuard guard(e.device); + if (mask_atoms.size() > e.setup.max_atoms) + throw JFJochException(JFJochExceptionCategory::GPUCUDAError, "refinement: mask atoms over the reserve"); + if (!mask_atoms.empty()) + cuda_err(cudaMemcpyAsync(e.mask_atoms, mask_atoms.data(), mask_atoms.size() * sizeof(ModelMaskAtom), + cudaMemcpyHostToDevice, e.stream)); + const bool own = e.mask_grid.get() != nullptr; + float *grid = own ? e.mask_grid.get() : e.grid.get(); + float2 *spectrum = own ? e.mask_spectrum.get() : e.spectrum.get(); + e.mask->Compute(e.mask_atoms, static_cast(mask_atoms.size()), grid); + cufft_err((own ? e.mask_forward : e.forward).R2C(grid, reinterpret_cast(spectrum))); + const int rows = static_cast(e.setup.rows.size()); + f.resize(rows); + if (rows > 0) { + const ModelDensityGrid &g = e.setup.mask_grid; + fmask_kernel<<>>(spectrum, e.MaskNorm(), e.row_hkl, rows, g.nu, g.nv, g.nw, + e.fm); + cuda_err(cudaGetLastError()); + cuda_err(cudaMemcpyAsync(f.data(), e.fm, rows * sizeof(float2), cudaMemcpyDeviceToHost, e.stream)); + } + cuda_err(e.waiter.Wait(e.stream)); +} + +double RefinementGPUEngine::Evaluate(bool grad) { + RefinementGPUEngineImpl &e = *impl_; + DeviceGuard guard(e.device); + e.LaunchEvaluate(grad); + cuda_err(e.waiter.Wait(e.stream)); + return e.host_sums[0]; +} + +const std::array *RefinementGPUEngine::HostGradient() const { + return reinterpret_cast *>(impl_->host_grad.get()); +} + +const std::array *RefinementGPUEngine::HostRestraintGradient() const { + return reinterpret_cast *>(impl_->host_restraint_grad.get()); +} + +double RefinementGPUEngine::EvaluateWithRestraints(bool grad, int which, + const std::function *)> &xyzb, + bool restraint_grad, double &restraints) { + RefinementGPUEngineImpl &e = *impl_; + DeviceGuard guard(e.device); + RefinementGPUEngineImpl::Restraints &r = e.restraints[which]; + if (r.atoms != e.n_atoms) + throw JFJochException(JFJochExceptionCategory::GPUCUDAError, "refinement: restraint atoms do not match"); + e.LaunchEvaluate(grad); + xyzb(reinterpret_cast *>(e.host_xyzb.get())); + e.LaunchRestraints(which, restraint_grad); + cuda_err(e.waiter.Wait(e.stream)); + restraints = e.host_sums[1]; + return e.host_sums[0]; +} + +void RefinementGPUEngine::SetRestraints(int which, const std::vector &records, + const std::vector &plane_atoms, const std::vector &slot_start, + const std::vector &slot_index, int n_slots) { + RefinementGPUEngineImpl &e = *impl_; + DeviceGuard guard(e.device); + RefinementGPUEngineImpl::Restraints &r = e.restraints[which]; + for (const RestraintRecord &rec : records) + if (rec.kind == static_cast(RestraintKind::Plane) && rec.atom[1] > MAX_PLANE_ATOMS) + throw JFJochException(JFJochExceptionCategory::GPUCUDAError, "refinement: a plane of too many atoms"); + r.records = static_cast(records.size()); + r.atoms = static_cast(slot_start.empty() ? 0 : slot_start.size() - 1); + Ensure(r.rec, r.cap_records, records.size()); + Ensure(r.energy, r.cap_reduce, records.size()); + Ensure(r.plane_atoms, r.cap_planes, plane_atoms.size()); + Ensure(r.slot_start, r.cap_start, slot_start.size()); + Ensure(r.slot_index, r.cap_index, slot_index.size()); + Ensure(r.contrib, r.cap_slots, static_cast(n_slots)); + Ensure(r.xyzb, r.cap_xyzb, r.atoms); + Ensure(r.grad, r.cap_atoms, r.atoms); + if (!r.sum) + r.sum = CudaDevicePtr(1, CudaAlloc::Synchronous); + const size_t bytes = ReduceBytes(r.cap_reduce); + if (!r.reduce_temp || bytes > r.reduce_bytes) { + r.reduce_bytes = bytes; + r.reduce_temp = CudaDevicePtr(std::max(bytes, 1), CudaAlloc::Synchronous); + } + Upload(r.rec, records, e.stream); + Upload(r.plane_atoms, plane_atoms, e.stream); + Upload(r.slot_start, slot_start, e.stream); + Upload(r.slot_index, slot_index, e.stream); + r.version++; + cuda_err(e.waiter.Wait(e.stream)); +} + +double RefinementGPUEngine::EvaluateRestraints(int which, const std::vector> &xyzb, + std::vector> *grad) { + RefinementGPUEngineImpl &e = *impl_; + DeviceGuard guard(e.device); + RefinementGPUEngineImpl::Restraints &r = e.restraints[which]; + if (static_cast(xyzb.size()) != r.atoms) + throw JFJochException(JFJochExceptionCategory::GPUCUDAError, "refinement: restraint atoms do not match"); + // the staging buffer free again + cuda_err(e.waiter.Wait(e.stream)); + std::copy(xyzb.begin(), xyzb.end(), reinterpret_cast *>(e.host_xyzb.get())); + e.LaunchRestraints(which, grad != nullptr); + cuda_err(e.waiter.Wait(e.stream)); + if (grad != nullptr) + CopyOut(e.host_restraint_grad, r.atoms, *grad); + return e.host_sums[1]; +} diff --git a/image_analysis/structure_refinement/RefinementGPU.h b/image_analysis/structure_refinement/RefinementGPU.h new file mode 100644 index 000000000..764454679 --- /dev/null +++ b/image_analysis/structure_refinement/RefinementGPU.h @@ -0,0 +1,24 @@ +// SPDX-FileCopyrightText: 2026 Filip Leonarski, Paul Scherrer Institute +// SPDX-License-Identifier: GPL-3.0-only + +#pragma once + +// Restrained refinement's targets on a GPU (CUDA builds only): the RefinementEngine of RefinementXray.h with +// everything per evaluation on the device - the atoms' density (ModelDensityGPU's gather), its transform, the +// symmetry composed in reciprocal space, the likelihood target, the derivative map by the inverse transform +// of the target's derivatives and every atom's gradient read off it, and the geometry restraints. The host +// passes positions in and gets one value and one gradient per atom back. + +#include + +#include "RefinementXray.h" + +// The engine for refining `model` against `refl` on `device`, or null where the GPU cannot take this case (an +// atom's box wider than the cell, too many symmetry operators) or its memory is over `budget` bytes. +// `b_max`: the largest B an atom may reach, which the gather's reserve is sized for. Throws JFJochException on a +// CUDA failure. `nthreads`: the host threads that work out the atoms' densities. +std::unique_ptr MakeRefinementEngineGPU(int device, const gemmi::UnitCell &cell, + const gemmi::SpaceGroup &sg, double d_min, + const RefinementReflections &refl, + const gemmi::Model &model, double b_max, size_t budget, + size_t *device_bytes = nullptr, size_t nthreads = 1); diff --git a/image_analysis/structure_refinement/RefinementGPUEngine.h b/image_analysis/structure_refinement/RefinementGPUEngine.h new file mode 100644 index 000000000..4b8c86d7c --- /dev/null +++ b/image_analysis/structure_refinement/RefinementGPUEngine.h @@ -0,0 +1,93 @@ +// SPDX-FileCopyrightText: 2026 Filip Leonarski, Paul Scherrer Institute +// SPDX-License-Identifier: GPL-3.0-only + +#pragma once + +// The device half of restrained refinement on a GPU (RefinementGPU.h, CUDA builds only). The host half works +// out with gemmi everything that depends on the cell, the group and the reflections; this half grids the atoms, +// transforms, composes the symmetry, evaluates the likelihood target, takes its derivative back to every atom +// by the FFT method, and evaluates the geometry restraints. Every kernel is deterministic - gathers and fixed +// reduction trees, no floating-point atomics - so the same input gives the same bits on every run. + +#include +#include +#include +#include +#include + +#include "ModelDensityGPU.h" +#include "ModelMaskGPU.h" +#include "RefinementMath.h" + +// Everything an engine needs that does not depend on the atoms. +struct RefinementGPUSetup { + ModelDensityGrid grid; // the structure-factor grid, u fastest + ModelDensityGrid mask_grid; // the bulk-solvent mask's (BulkSolventMask::MaskGrid), u fastest + double volume = 0; + std::vector> sym_ops; // gemmi's Op: rot row-major and tran, in units of 1 / den + int den = 24; + double centring = 1; // the number of centring vectors + std::vector mask_ops; // every operator with every centring vector + std::vector> rows; // the reflections, in the order their numbers come back + std::vector inv_d2; + std::vector fo; + std::vector work, centric; + // The adjoint of the composition, as a gather: the half-u spectrum points the gradient's coefficients + // land on (ascending), and for each the terms (row * ops + op) * 2 + conj adding to it, in order. + std::vector scatter_point, scatter_start, scatter_term; + size_t max_atoms = 0, max_pairs = 0; +}; + +struct RefinementGPUEngineImpl; + +class RefinementGPUEngine { +public: + static size_t DeviceBytes(const RefinementGPUSetup &setup, size_t fft_work_bytes, size_t max_records, + size_t max_slots); + static size_t FFTWorkBytes(int device, const RefinementGPUSetup &setup); + + RefinementGPUEngine(int device, const RefinementGPUSetup &setup, size_t fft_work_bytes); + ~RefinementGPUEngine(); + + // n_cen exp(blur s^2 / 4) per reflection: prepare_asu_data()'s unblur. + void SetBlur(double blur); + // Per macro-cycle: F_model = k_total (F + fmask), and the likelihood's D and variance. + void SetRowModel(const std::vector &k_total, const std::vector> &fmask, + const std::vector &d, const std::vector &var); + + // The atoms' densities, as ModelStructureFactorsGPU takes them (the boxes of ModelDensityGPU::Boxes() made + // from them): called again only where some atom's density changed. Read until the call returns; from pinned + // memory they go up by DMA. + void SetDensities(const ModelDensityAtom *atoms, size_t n); + // The atoms' grid positions (fractional times the grid size, not wrapped), in the order of SetDensities(): + // read until the next evaluation returns, so from a pinned buffer the copy goes up by DMA. + void SetPositions(const std::array *pos, size_t n); + // F of the atoms at the rows. + void Fcalc(std::vector> &f); + // The bulk-solvent mask's F at the rows (the mask atoms fractional, wrapped), on the mask's own grid. + void Fmask(const std::vector &mask_atoms, std::vector> &f); + // -ln L over the working rows for the atoms last set and, with `grad`, dT/d(x, y, z, B) per atom into + // HostGradient(). + double Evaluate(bool grad); + // The gradients of the last evaluation, in the engine's pinned buffers: valid until the next one. + const std::array *HostGradient() const; + const std::array *HostRestraintGradient() const; + + // Restraint set `which` (0 or 1), as RestraintSet holds it. + void SetRestraints(int which, const std::vector &records, const std::vector &plane_atoms, + const std::vector &slot_start, const std::vector &slot_index, int n_slots); + // The sum of E of set `which` at `xyzb` (x, y, z, B per atom) and dE/d(x, y, z, B) per atom. + double EvaluateRestraints(int which, const std::vector> &xyzb, + std::vector> *grad); + // Evaluate() and EvaluateRestraints() in one submission with one wait: the X-ray target is queued first, and + // `xyzb` writes the restraints' x, y, z, B of every atom while the device works on it. The gradients into + // HostGradient() and HostRestraintGradient(). + double EvaluateWithRestraints(bool grad, int which, const std::function *)> &xyzb, + bool restraint_grad, double &restraints); + + // The most atoms of a plane restraint the kernel takes. + static constexpr int MAX_PLANE_ATOMS = 32; + +private: + std::unique_ptr impl_; +}; diff --git a/image_analysis/structure_refinement/RefinementMath.h b/image_analysis/structure_refinement/RefinementMath.h new file mode 100644 index 000000000..af87c6bc6 --- /dev/null +++ b/image_analysis/structure_refinement/RefinementMath.h @@ -0,0 +1,280 @@ +// SPDX-FileCopyrightText: 2026 Filip Leonarski, Paul Scherrer Institute +// SPDX-License-Identifier: GPL-3.0-only + +#pragma once + +// The per-term arithmetic of restrained refinement (Refinement.h), written once for the CPU and the GPU: +// the maximum-likelihood amplitude target of one reflection and the geometry restraints, each with its +// derivatives. Plain functions on plain numbers, so the CUDA engine (RefinementGPU.cu) and the CPU path +// (RefinementXray.cpp, RefinementRestraints.cpp) evaluate the same expressions. + +#include + +#if defined(__CUDACC__) +#define REFINE_HD __host__ __device__ +#else +#define REFINE_HD +#endif + +// What a restraint is, for the evaluators on either side (RefinementRestraints.h builds them). +enum class RestraintKind : int { Bond = 0, Angle, Torsion, Chiral, Plane, Repulsion, BSimilarity }; + +// One restraint. E = ((value - ideal) / sigma)^2, summed over a set (BSimilarity: sigma is kappa, BSimilarityTerm). +struct RestraintRecord { + int kind = 0; + int atom[4] = {0, 0, 0, 0}; // Plane: atom[0] the first of its atoms in plane_atoms, atom[1] their number + float ideal = 0; // A, degrees, A^3 (chiral) or A (repulsion: the contact distance) + float sigma = 1; + int period = 0; // Torsion + int slot = 0; // the first of its gradient slots, one per atom + // Repulsion: where the second atom is, as the image x' = rot x + tran of its position (Cartesian); + // the identity elsewhere. + float rot[9] = {1, 0, 0, 0, 1, 0, 0, 0, 1}; + float tran[3] = {0, 0, 0}; +}; + +namespace refine_math { + +constexpr double PI = 3.14159265358979323846; +constexpr double DEG = PI / 180.0; + +// ln I0(x) and I1(x)/I0(x) for x >= 0, from the polynomial approximations of Abramowitz & Stegun (1964), +// Handbook of Mathematical Functions, 9.8.1-9.8.4 (relative error below 2e-7); for large x through the +// exponentially scaled form, so nothing overflows. +template +REFINE_HD inline void BesselI0I1(T x, T &log_i0, T &i1_over_i0) { + if (x < T(3.75)) { + const T t = (x / T(3.75)) * (x / T(3.75)); + const T i0 = T(1.0) + t * (T(3.5156229) + t * (T(3.0899424) + t * (T(1.2067492) + + t * (T(0.2659732) + t * (T(0.0360768) + t * T(0.0045813)))))); + const T i1 = x * (T(0.5) + t * (T(0.87890594) + t * (T(0.51498869) + t * (T(0.15084934) + + t * (T(0.02658733) + t * (T(0.00301532) + t * T(0.00032411))))))); + log_i0 = log(i0); + i1_over_i0 = i1 / i0; + } else { + const T t = T(3.75) / x; + // sqrt(x) exp(-x) I0(x) and sqrt(x) exp(-x) I1(x) + const T s0 = T(0.39894228) + t * (T(0.01328592) + t * (T(0.00225319) + t * (T(-0.00157565) + + t * (T(0.00916281) + t * (T(-0.02057706) + t * (T(0.02635537) + t * (T(-0.01647633) + + t * T(0.00392377)))))))); + const T s1 = T(0.39894228) + t * (T(-0.03988024) + t * (T(-0.00362018) + t * (T(0.00163801) + + t * (T(-0.01031555) + t * (T(0.02282967) + t * (T(-0.02895312) + t * (T(0.01787654) + + t * T(-0.00420059)))))))); + log_i0 = x + log(s0) - T(0.5) * log(x); + i1_over_i0 = s1 / s0; + } +} + +// The likelihood of one observed amplitude given the model amplitude Fc - the Rice distribution for an +// acentric reflection, its centric counterpart otherwise - with D the fraction of the model that is +// right and var the variance the rest of the structure and the measurement leave (epsilon beta plus the +// observation's own sigma^2). Returns -ln L without the terms that depend on neither Fc nor the +// parameters, and sets d(-ln L)/dFc. +// Following Pannu & Read (1996) Acta Cryst. A52, 659-668 and Murshudov, Vagin & Dodson (1997) Acta Cryst. +// D53, 240-255 +template +REFINE_HD inline T AmplitudeNegLogLikelihood(T fo, T fc, T d, T var, bool centric, T &dfc) { + if (!centric) { + const T x = T(2.0) * d * fo * fc / var; + T log_i0, ratio; + BesselI0I1(x, log_i0, ratio); + dfc = (T(2.0) * d * d * fc - ratio * T(2.0) * d * fo) / var; + return log(var) + (fo * fo + d * d * fc * fc) / var - log_i0; + } + const T x = d * fo * fc / var; + // ln cosh x = x + ln(1 + exp(-2x)) - ln 2 for x >= 0 + const T log_cosh = x + log(T(1.0) + exp(T(-2.0) * x)) - T(0.6931471805599453); + dfc = (d * d * fc - tanh(x) * d * fo) / var; + return T(0.5) * log(var) + (fo * fo + d * d * fc * fc) / (T(2.0) * var) - log_cosh; +} + +// --- geometry restraints: E = ((value - ideal) / sigma)^2 and dE/dx for each atom --- + +template +struct V3 { + T x, y, z; +}; + +template REFINE_HD inline V3 operator-(V3 a, V3 b) { return {a.x - b.x, a.y - b.y, a.z - b.z}; } +template REFINE_HD inline V3 operator+(V3 a, V3 b) { return {a.x + b.x, a.y + b.y, a.z + b.z}; } +template REFINE_HD inline V3 operator*(T s, V3 a) { return {s * a.x, s * a.y, s * a.z}; } +template REFINE_HD inline T Dot(V3 a, V3 b) { return a.x * b.x + a.y * b.y + a.z * b.z; } +template REFINE_HD inline V3 Cross(V3 a, V3 b) { + return {a.y * b.z - a.z * b.y, a.z * b.x - a.x * b.z, a.x * b.y - a.y * b.x}; +} +template REFINE_HD inline T Norm(V3 a) { return sqrt(Dot(a, a)); } + +// A bond length. +template +REFINE_HD inline T BondTerm(V3 a, V3 b, T ideal, T sigma, V3 g[2]) { + const V3 d = a - b; + const T len = Norm(d); + const T r = (len - ideal) / sigma; + const T f = len > T(0) ? T(2.0) * r / (sigma * len) : T(0); + g[0] = f * d; + g[1] = (-f) * d; + return r * r; +} + +// A bond angle at b, ideal and sigma in degrees. +template +REFINE_HD inline T AngleTerm(V3 a, V3 b, V3 c, T ideal, T sigma, V3 g[3]) { + const V3 u = a - b, v = c - b; + const T lu = Norm(u), lv = Norm(v); + const V3 cr = Cross(u, v); + const T theta = atan2(Norm(cr), Dot(u, v)); + const T s = T(DEG); + const T r = (theta - ideal * s) / (sigma * s); + // dtheta/du = (cos(theta) u/|u| - v/|v|) / (|u| sin(theta)), and the same with u and v swapped + const T sin_t = fmax(sin(theta), T(1e-6)), cos_t = cos(theta); + const T f = T(2.0) * r / (sigma * s); + const V3 du = (T(1.0) / (lu * sin_t)) * ((cos_t / lu) * u - (T(1.0) / lv) * v); + const V3 dv = (T(1.0) / (lv * sin_t)) * ((cos_t / lv) * v - (T(1.0) / lu) * u); + g[0] = f * du; + g[2] = f * dv; + g[1] = (-f) * (du + dv); + return r * r; +} + +// The dihedral angle p0-p1-p2-p3 in radians, and its derivatives with respect to the four positions. +// Following Blondel & Karplus (1996) J. Comput. Chem. 17, 1132-1141 +template +REFINE_HD inline T Dihedral(V3 p0, V3 p1, V3 p2, V3 p3, V3 d[4]) { + const V3 b1 = p1 - p0, b2 = p2 - p1, b3 = p3 - p2; + const V3 m = Cross(b1, b2), n = Cross(b2, b3); + const T lb2 = Norm(b2); + const T mm = fmax(Dot(m, m), T(1e-12)), nn = fmax(Dot(n, n), T(1e-12)); + const T phi = atan2(lb2 * Dot(b1, n), Dot(m, n)); + d[0] = (-lb2 / mm) * m; + d[3] = (lb2 / nn) * n; + const T bb = lb2 * lb2; + const T p = Dot(b1, b2) / bb, q = Dot(b3, b2) / bb; + d[1] = (-(T(1.0) + p)) * d[0] + q * d[3]; + d[2] = (-T(1.0)) * (d[0] + d[1] + d[3]); + return phi; +} + +// A torsion restrained to ideal (degrees) modulo 360/period; period 0 is read as 1. +template +REFINE_HD inline T TorsionTerm(V3 p0, V3 p1, V3 p2, V3 p3, T ideal, T sigma, int period, V3 g[4]) { + V3 d[4]; + const T phi = Dihedral(p0, p1, p2, p3, d) / T(DEG); + const T step = T(360.0) / T(period > 0 ? period : 1); + T delta = phi - ideal; + delta -= step * floor(delta / step + T(0.5)); + const T r = delta / sigma; + const T f = T(2.0) * r / (sigma * T(DEG)); + for (int i = 0; i < 4; i++) + g[i] = f * d[i]; + return r * r; +} + +// A chiral volume (c the centre): (a1 - c) . ((a2 - c) x (a3 - c)). +template +REFINE_HD inline T ChiralTerm(V3 c, V3 a1, V3 a2, V3 a3, T ideal, T sigma, V3 g[4]) { + const V3 x1 = a1 - c, x2 = a2 - c, x3 = a3 - c; + const T vol = Dot(x1, Cross(x2, x3)); + const T r = (vol - ideal) / sigma; + const T f = T(2.0) * r / sigma; + g[1] = f * Cross(x2, x3); + g[2] = f * Cross(x3, x1); + g[3] = f * Cross(x1, x2); + g[0] = (-T(1.0)) * (g[1] + g[2] + g[3]); + return r * r; +} + +// A repulsion below the contact distance d0 (none above it). +template +REFINE_HD inline T RepulsionTerm(V3 a, V3 b, T d0, T sigma, V3 g[2]) { + const V3 d = a - b; + const T len = Norm(d); + if (len >= d0 || len <= T(0)) { + g[0] = g[1] = V3{0, 0, 0}; + return T(0); + } + const T r = (d0 - len) / sigma; + const T f = T(-2.0) * r / (sigma * len); + g[0] = f * d; + g[1] = (-f) * d; + return r * r; +} + +// Two atoms' B alike in proportion to their size: the symmetric Kullback-Leibler divergence of two isotropic +// Gaussians of variances B_i and B_j over kappa^2 (up to a factor), E = (B_i - B_j)^2 / (kappa^2 B_i B_j) - a +// difference restraint whose sigma is kappa sqrt(B_i B_j). Sets dE/dB_i and dE/dB_j. +// Following Murshudov et al. (2011) Acta Cryst. D67, 355-367 (the Kullback-Leibler form of the ADP restraints) +template +REFINE_HD inline T BSimilarityTerm(T bi, T bj, T kappa, T &gi, T &gj) { + const T k2 = kappa * kappa, d = bi - bj; + gi = d * (bi + bj) / (k2 * bi * bi * bj); + gj = -d * (bi + bj) / (k2 * bi * bj * bj); + return d * d / (k2 * bi * bj); +} + +// The unit eigenvector of the smallest eigenvalue of a symmetric 3x3 matrix (a00 a11 a22 a01 a02 a12), by +// cyclic Jacobi rotations. +template +REFINE_HD inline V3 SmallestEigenvector(const T m_in[6]) { + T a[3][3] = {{m_in[0], m_in[3], m_in[4]}, {m_in[3], m_in[1], m_in[5]}, {m_in[4], m_in[5], m_in[2]}}; + T v[3][3] = {{1, 0, 0}, {0, 1, 0}, {0, 0, 1}}; + for (int sweep = 0; sweep < 12; sweep++) + for (int p = 0; p < 2; p++) + for (int q = p + 1; q < 3; q++) { + if (fabs(a[p][q]) < T(1e-30)) + continue; + const T theta = (a[q][q] - a[p][p]) / (T(2.0) * a[p][q]); + const T t = (theta >= 0 ? T(1.0) : T(-1.0)) / (fabs(theta) + sqrt(theta * theta + T(1.0))); + const T c = T(1.0) / sqrt(t * t + T(1.0)), s = t * c; + for (int k = 0; k < 3; k++) { + const T akp = a[k][p], akq = a[k][q]; + a[k][p] = c * akp - s * akq; + a[k][q] = s * akp + c * akq; + } + for (int k = 0; k < 3; k++) { + const T apk = a[p][k], aqk = a[q][k]; + a[p][k] = c * apk - s * aqk; + a[q][k] = s * apk + c * aqk; + } + for (int k = 0; k < 3; k++) { + const T vkp = v[k][p], vkq = v[k][q]; + v[k][p] = c * vkp - s * vkq; + v[k][q] = s * vkp + c * vkq; + } + } + int i = 0; + if (a[1][1] < a[i][i]) + i = 1; + if (a[2][2] < a[i][i]) + i = 2; + return {v[0][i], v[1][i], v[2][i]}; +} + +// A plane: the distances of n atoms from their least-squares plane. The plane is optimal, so the +// derivative of each atom's distance carries no term from the plane moving: dE/dx_i = 2 (n.(x_i - c)) n / sigma^2. +template +REFINE_HD inline T PlaneTerm(const V3 *x, int n, T sigma, V3 *g) { + V3 c{0, 0, 0}; + for (int i = 0; i < n; i++) + c = c + x[i]; + c = (T(1.0) / T(n)) * c; + T m[6] = {0, 0, 0, 0, 0, 0}; + for (int i = 0; i < n; i++) { + const V3 d = x[i] - c; + m[0] += d.x * d.x; + m[1] += d.y * d.y; + m[2] += d.z * d.z; + m[3] += d.x * d.y; + m[4] += d.x * d.z; + m[5] += d.y * d.z; + } + const V3 nv = SmallestEigenvector(m); + T e = 0; + for (int i = 0; i < n; i++) { + const T r = Dot(nv, x[i] - c) / sigma; + e += r * r; + g[i] = (T(2.0) * r / sigma) * nv; + } + return e; +} + +} // namespace refine_math diff --git a/image_analysis/structure_refinement/RefinementMinimiser.h b/image_analysis/structure_refinement/RefinementMinimiser.h new file mode 100644 index 000000000..1a19b2677 --- /dev/null +++ b/image_analysis/structure_refinement/RefinementMinimiser.h @@ -0,0 +1,211 @@ +// SPDX-FileCopyrightText: 2026 Filip Leonarski, Paul Scherrer Institute +// SPDX-License-Identifier: GPL-3.0-only + +#pragma once + +#include +#include +#include +#include +#include + +#include "../../common/ParallelFor.h" + +// Limited-memory BFGS whose memory outlives one call, so that a refinement's macro-cycles - each a few dozen +// iterations on a target whose scale and likelihood parameters were refitted in between - go on from what the +// earlier ones learnt of the curvature instead of starting each from a steepest-descent step. The initial inverse +// Hessian is a diagonal the caller gives (SetDiagonal: an estimate of the Hessian's diagonal, so that a parameter +// with ten times the curvature of another takes a tenth of its step), scaled each iteration by the latest pair +// (Oren-Shanno in that metric). The line search backtracks from the full step to sufficient decrease. +// Following Nocedal (1980) Math. Comp. 35, 773-782 and Liu & Nocedal (1989) Math. Program. 45, 503-528 +class RefinementMinimiser { +public: + // f(x, g): the target at x, and its gradient in g (sized as x); false where it cannot be evaluated there. + using Target = std::function &x, double &f, std::vector &g)>; + + // `nthreads`: the threads the sweeps over the parameters run on (the dot products stay serial chains). + explicit RefinementMinimiser(size_t memory = 20, size_t nthreads = 1) : memory_(memory), nthreads_(nthreads) {} + + // Forget the pairs (the target changed beyond what the memory still describes, e.g. another weight). + void Reset() { + s_.clear(); + y_.clear(); + sy_.clear(); + } + // The estimated diagonal of the Hessian; every element > 0. + void SetDiagonal(std::vector h) { h_ = std::move(h); } + + struct Outcome { + int iterations = 0; + int evaluations = 0; + double f_start = 0, f_end = 0; + }; + + // At most `iterations` iterations from x (x is where it ended); stops early where an iteration lowers f by + // less than `f_tolerance` relative to |f|, or `stop` says so (checked before every iteration). `max_step`, in + // the parameters' units, is the most any parameter moves in the first trial of a line search. + Outcome Minimise(const Target &target, std::vector &x, int iterations, double f_tolerance, double max_step, + const std::function &stop = nullptr) { + const size_t n = x.size(); + if (h_.size() != n) + h_.assign(n, 1.0); + Outcome out; + double f = 0; + std::vector g(n), d(n), x_new(n), g_new(n); + if (!target(x, f, g)) + return out; + out.evaluations++; + out.f_start = out.f_end = f; + for (int it = 0; it < iterations; it++) { + if (stop && stop()) + break; + Direction(g, d); + double gd = Dot(g, d); + if (!(gd < 0)) { // not a descent direction: the memory no longer fits, start again from the diagonal + Reset(); + Direction(g, d); + gd = Dot(g, d); + if (!(gd < 0)) + break; + } + double d_max = 0; + for (double v : d) + d_max = std::max(d_max, std::fabs(v)); + double alpha = d_max > max_step ? max_step / d_max : 1.0; + double f_new = 0; + bool accepted = false; + for (int ls = 0; ls < 10; ls++) { + Sweep(n, [&](size_t k) { x_new[k] = x[k] + alpha * d[k]; }); + const bool ok = target(x_new, f_new, g_new); + out.evaluations++; + if (ok && f_new <= f + 1e-4 * alpha * gd) { + accepted = true; + break; + } + // the minimum of the quadratic through f, its slope and f_new, kept within [0.1, 0.5] of the step + const double q = ok ? -gd * alpha * alpha / (2.0 * (f_new - f - gd * alpha)) : 0.1 * alpha; + alpha = std::clamp(q, 0.1 * alpha, 0.5 * alpha); + } + if (!accepted) + break; + // the pair's vectors are the ones the memory last let go, where it did: made anew, their pages fault in + std::vector s = std::move(spare_s_), y = std::move(spare_y_); + s.resize(n); + y.resize(n); + Sweep(n, [&](size_t k) { + s[k] = x_new[k] - x[k]; + y[k] = g_new[k] - g[k]; + }); + const double sy = Dot(s, y); + if (sy > 1e-10 * std::sqrt(Dot(s, s) * Dot(y, y))) { + s_.push_back(std::move(s)); + y_.push_back(std::move(y)); + sy_.push_back(sy); + if (s_.size() > memory_) { + spare_s_ = std::move(s_.front()); + spare_y_ = std::move(y_.front()); + s_.pop_front(); + y_.pop_front(); + sy_.pop_front(); + } + } else { + spare_s_ = std::move(s); + spare_y_ = std::move(y); + } + const double decrease = f - f_new; + x.swap(x_new); + g.swap(g_new); + f = f_new; + out.iterations++; + out.f_end = f; + if (decrease <= f_tolerance * std::max(std::fabs(f), 1.0)) + break; + } + return out; + } + +private: + static double Dot(const std::vector &a, const std::vector &b) { + double s = 0; + for (size_t k = 0; k < a.size(); k++) + s += a[k] * b[k]; + return s; + } + + // fn(k) for every k below n on the threads, each element on its own: the serial loop's bits. + template + void Sweep(size_t n, Fn fn) const { + ParallelChunks(static_cast(n), ThreadsForWork(n, nthreads_), [&](int lo, int hi) { + for (int k = lo; k < hi; k++) + fn(static_cast(k)); + }); + } + + // d = -H g by the two-loop recursion, H0 = gamma diag(1/h). Every dot product is a serial chain of n + // additions, so each sweep over the parameters takes the next pair's dot product while it applies the + // previous pair's update to q - the same operations on each element in the same order as a sweep for + // each would do, with the update's memory traffic hidden under the chain. + void Direction(const std::vector &g, std::vector &d) const { + const size_t n = g.size(), m = s_.size(); + std::vector &q = q_; // kept from call to call: made anew, its pages fault in every time + q.assign(g.begin(), g.end()); + std::vector a(m), rho(m); + for (size_t i = 0; i < m; i++) + rho[i] = 1.0 / sy_[i]; + double dot = m > 0 ? Dot(s_[m - 1], q) : 0.0, yhy = 0.0; + for (size_t i = m; i-- > 0;) { + a[i] = rho[i] * dot; + const double ai = a[i]; + const double *y = y_[i].data(); + dot = 0.0; + if (i > 0) { + const double *s = s_[i - 1].data(); + for (size_t k = 0; k < n; k++) { + q[k] -= ai * y[k]; + dot += s[k] * q[k]; + } + } else { + const double *yl = y_[m - 1].data(); + for (size_t k = 0; k < n; k++) { + q[k] -= ai * y[k]; + yhy += yl[k] * yl[k] / h_[k]; + } + } + } + const double gamma = m > 0 ? sy_[m - 1] / yhy : 1.0; + if (m > 0) { + const double *y = y_[0].data(); + for (size_t k = 0; k < n; k++) { + q[k] *= gamma / h_[k]; + dot += y[k] * q[k]; + } + } else + for (size_t k = 0; k < n; k++) + q[k] *= gamma / h_[k]; + for (size_t i = 0; i < m; i++) { + // b on its own and (a[i] - b) in the loop, as before: written as a[i] - rho[i] * dot the compiler + // contracts it into a fused multiply-add, and the bits change + const double b = rho[i] * dot; + const double *s = s_[i].data(); + dot = 0.0; + if (i + 1 < m) { + const double *y = y_[i + 1].data(); + for (size_t k = 0; k < n; k++) { + q[k] += s[k] * (a[i] - b); + dot += y[k] * q[k]; + } + } else + for (size_t k = 0; k < n; k++) + q[k] += s[k] * (a[i] - b); + } + for (size_t k = 0; k < n; k++) + d[k] = -q[k]; + } + + size_t memory_, nthreads_; + std::deque> s_, y_; + std::deque sy_; // s.y of each pair, as taken when it was kept + std::vector spare_s_, spare_y_; // the pair the memory last let go, for the next one to reuse + mutable std::vector q_; // Direction()'s working vector + std::vector h_; +}; diff --git a/image_analysis/structure_refinement/RefinementRestraints.cpp b/image_analysis/structure_refinement/RefinementRestraints.cpp new file mode 100644 index 000000000..61239cbfe --- /dev/null +++ b/image_analysis/structure_refinement/RefinementRestraints.cpp @@ -0,0 +1,751 @@ +// SPDX-FileCopyrightText: 2026 Filip Leonarski, Paul Scherrer Institute +// SPDX-License-Identifier: GPL-3.0-only + +#include "RefinementRestraints.h" + +#include +#include +#include +#include +#include + +#include "gemmi/neighbor.hpp" +#include "gemmi/polyheur.hpp" // setup_entities +#include "gemmi/riding_h.hpp" // place_hydrogens_on_all_atoms +#include "gemmi/topo.hpp" + +#include "../../common/ParallelFor.h" +#include "MonomerLibrary.h" +#include "RefinementMath.h" + +using refine_math::V3; + +namespace { + +constexpr float CHIRAL_SIGMA = 0.2f; // A^3 +constexpr float REPULSION_SIGMA = 0.2f; // A +constexpr float HBOND_CONTACT = 2.6f; // A +constexpr float METAL_CONTACT = 1.9f; // A, to N, O or S +// B similarity (BSimilarityTerm's kappa: sigma = kappa sqrt(B_i B_j)): main chain and the rest, for bonded pairs and +// pairs bonded to a common atom - REFMAC's logs list sigma near 0.1 B for main-chain bonded pairs from B 11 to 140 +// A^2, the ratios between the classes are those of the fixed sigmas this replaced (1.5, 2.0, 3.0, 4.5 A^2, i.e. these +// at B = 15) - and atoms in contact, waters among them, that no bond or angle relates. +constexpr float B_KAPPA_MAIN_BOND = 0.1f, B_KAPPA_MAIN_ANGLE = 0.133f; +constexpr float B_KAPPA_SIDE_BOND = 0.2f, B_KAPPA_SIDE_ANGLE = 0.3f; +constexpr float B_KAPPA_CONTACT = 0.5f; +constexpr double B_CONTACT_DISTANCE = 4.0; // A + +bool IsMainChain(const gemmi::Atom &a) { + static const std::set names = {"N", "CA", "C", "O", "OXT", "P", "OP1", "OP2", "O5'", "C5'", + "C4'", "C3'", "O3'"}; + return names.count(a.name) > 0; +} + +bool IsMetal(const gemmi::Element &el) { + return el.is_metal(); +} + +// The radius van der Waals contacts are made of, without hydrogens: the dictionary's for the atom's +// energy type, or an element's typical value where the residue is not described. +float VdwRadius(const gemmi::MonLib &monlib, const std::string &resname, const gemmi::Atom &a) { + auto cc = monlib.monomers.find(resname); + if (cc != monlib.monomers.end()) { + auto it = cc->second.find_atom(a.name); + if (it != cc->second.atoms.end()) { + auto e = monlib.ener_lib.atoms.find(it->chem_type); + if (e != monlib.ener_lib.atoms.end() && std::isfinite(e->second.vdw_radius)) + return static_cast(e->second.vdw_radius); + } + } + switch (a.element.elem) { + case gemmi::El::C: return 1.70f; + case gemmi::El::N: return 1.55f; + case gemmi::El::O: return 1.52f; + case gemmi::El::S: return 1.80f; + case gemmi::El::P: return 1.80f; + default: return 1.70f; + } +} + +bool CanHydrogenBond(const gemmi::MonLib &monlib, const std::string &resname, const gemmi::Atom &a) { + if (a.element != gemmi::El::N && a.element != gemmi::El::O) + return false; + auto cc = monlib.monomers.find(resname); + if (cc != monlib.monomers.end()) { + auto it = cc->second.find_atom(a.name); + if (it != cc->second.atoms.end()) { + auto e = monlib.ener_lib.atoms.find(it->chem_type); + if (e != monlib.ener_lib.atoms.end()) + return e->second.hb_type == 'D' || e->second.hb_type == 'A' || e->second.hb_type == 'B' || + e->second.hb_type == 'H'; + } + } + return true; // N or O of an undescribed residue +} + +V3 At(const std::vector> &xyzb, int i) { + return {xyzb[i][0], xyzb[i][1], xyzb[i][2]}; +} + +V3 Image(const RestraintRecord &r, V3 p) { + return {r.rot[0] * p.x + r.rot[1] * p.y + r.rot[2] * p.z + r.tran[0], + r.rot[3] * p.x + r.rot[4] * p.y + r.rot[5] * p.z + r.tran[1], + r.rot[6] * p.x + r.rot[7] * p.y + r.rot[8] * p.z + r.tran[2]}; +} + +// The gradient at an image back on the atom it is an image of: rot^T g. +V3 FromImage(const RestraintRecord &r, V3 g) { + return {r.rot[0] * g.x + r.rot[3] * g.y + r.rot[6] * g.z, + r.rot[1] * g.x + r.rot[4] * g.y + r.rot[7] * g.z, + r.rot[2] * g.x + r.rot[5] * g.y + r.rot[8] * g.z}; +} + +// The bonds the dictionary gives a metal atom within its own residue: none for an ion, four for a heme's iron. +int DictionaryMetalBonds(const gemmi::MonLib &monlib, const gemmi::CRA &metal) { + auto cc = monlib.monomers.find(metal.residue->name); + if (cc == monlib.monomers.end()) + return 0; + int n = 0; + for (const gemmi::Restraints::Bond &b : cc->second.rt.bonds) + n += b.id1.atom == metal.atom->name || b.id2.atom == metal.atom->name; + return n; +} + +bool IsMetalDonor(const gemmi::Element &el) { + return el == gemmi::El::O || el == gemmi::El::N || el == gemmi::El::S; +} + +// The modification a donor's residue takes when it binds a metal: the proton the bond replaces, as the +// library's own ZN-HISND, ZN-HISNE and ZN-CYS links have it. +std::string MetalDonorModification(const std::string &resname, const std::string &atom) { + if (resname == "HIS" && atom == "ND1") + return "DEL-HD1"; + if (resname == "HIS" && atom == "NE2") + return "DEL-HE2"; + if (resname == "CYS" && atom == "SG") + return "CYSmod1"; + return ""; +} + +// The model's LINK / struct_conn records between a metal atom (an ion, or the iron of a heme) and an O, N or S +// that no link of the dictionary describes (its ZN-CYS, ZN-HISND, ZN-HISNE, FE-CYS, FE-HISND and FE-HISNE are +// taken as they are): a link of one bond is made for each in `monlib`, at the distance of the library's statistics +// of metal sites (EmbeddedMetalDistance) for the two elements and the site's coordination - the number of records +// between the metal and an O, N or S, plus the bonds its own residue's dictionary gives it (a heme's four pyrrole +// N) - and the record is pointed at it, so that prepare_topology() restrains it like any other link. +// Only the bond: no angles at the metal. Sites are taken from the records alone, as REFMAC takes links from +// the coordinate file; a contact without a record stays a repulsion (BuildRepulsions, METAL_CONTACT). +// Records to a symmetry mate are left out, as every bond to a symmetry mate is (BuildRefinementTopology). +// Returns the number of links made. +// Distances as surveyed by Harding (2001) Acta Cryst. D57, 401-411 and (2006) Acta Cryst. D62, 678-682, +// and for Mg, Na and K at nucleic acids by Leonarski, D'Ascenzo & Auffinger (2017) Nucleic Acids Res. 45, 987-1004 +int AddMetalLinks(gemmi::Structure &st, gemmi::MonLib &monlib) { + gemmi::Model &model = st.models.at(0); + struct Site { + gemmi::Connection *conn; + gemmi::CRA metal, donor; + bool metal_first; // the metal is partner1 + }; + std::vector sites; + std::unordered_map coordination; + for (gemmi::Connection &conn : st.connections) { + gemmi::CRA a = model.find_cra(conn.partner1, true), b = model.find_cra(conn.partner2, true); + if (!a.atom || !b.atom) + continue; + const bool a_metal = IsMetal(a.atom->element), b_metal = IsMetal(b.atom->element); + if (a_metal == b_metal) + continue; + const gemmi::CRA &metal = a_metal ? a : b, &donor = a_metal ? b : a; + if (!IsMetalDonor(donor.atom->element)) + continue; + // the site's coordination: every record of the metal, a symmetry mate's or one the dictionary describes too + if (coordination.count(metal.atom) == 0) + coordination[metal.atom] = DictionaryMetalBonds(monlib, metal); + coordination[metal.atom]++; + if (!conn.link_id.empty() || conn.asu == gemmi::Asu::Different || + std::get<0>(monlib.match_link(*a.residue, a.atom->name, conn.partner1.altloc, *b.residue, b.atom->name, + conn.partner2.altloc)) != nullptr) + continue; + sites.push_back({&conn, metal, donor, a_metal}); + } + int made = 0; + for (const Site &site : sites) { + double distance = 0, sigma = 0; + if (!EmbeddedMetalDistance(site.metal.atom->element.elem, site.donor.atom->element.elem, + coordination[site.metal.atom], distance, sigma)) + continue; + const gemmi::Connection &conn = *site.conn; + gemmi::ChemLink link; + link.side1.comp = conn.partner1.res_id.name; + link.side2.comp = conn.partner2.res_id.name; + (site.metal_first ? link.side2 : link.side1).mod = + MetalDonorModification(site.donor.residue->name, site.donor.atom->name); + link.id = "metal-" + std::to_string(made); + link.name = link.id; + link.rt.bonds.push_back({gemmi::Restraints::AtomId{1, conn.partner1.atom_name}, + gemmi::Restraints::AtomId{2, conn.partner2.atom_name}, + gemmi::BondType::Metal, false, distance, sigma, distance, sigma}); + monlib.links.emplace(link.id, link); + site.conn->link_id = link.id; + made++; + } + return made; +} + +} // namespace + +void RestraintSet::Add(RestraintRecord r, int n_atoms_of_r) { + r.slot = n_slots; + n_slots += n_atoms_of_r; + records.push_back(r); +} + +void RestraintSet::Append(const RestraintSet &other) { + const int plane_offset = static_cast(plane_atoms.size()); + for (RestraintRecord r : other.records) { + r.slot += n_slots; + if (r.kind == static_cast(RestraintKind::Plane)) + r.atom[0] += plane_offset; + records.push_back(r); + } + plane_atoms.insert(plane_atoms.end(), other.plane_atoms.begin(), other.plane_atoms.end()); + n_slots += other.n_slots; +} + +void RestraintSet::Finalize(size_t n_atoms) { + slot_atom.assign(n_slots, -1); + for (const RestraintRecord &r : records) { + if (r.kind == static_cast(RestraintKind::Plane)) { + for (int k = 0; k < r.atom[1]; k++) + slot_atom[r.slot + k] = plane_atoms[r.atom[0] + k]; + } else { + const int n = r.kind == static_cast(RestraintKind::Bond) || + r.kind == static_cast(RestraintKind::Repulsion) || + r.kind == static_cast(RestraintKind::BSimilarity) ? 2 + : r.kind == static_cast(RestraintKind::Angle) ? 3 : 4; + for (int k = 0; k < n; k++) + slot_atom[r.slot + k] = r.atom[k]; + } + } + slot_start.assign(n_atoms + 1, 0); + for (int a : slot_atom) + if (a >= 0) + slot_start[a + 1]++; + for (size_t a = 0; a < n_atoms; a++) + slot_start[a + 1] += slot_start[a]; + slot_index.assign(slot_start[n_atoms], 0); + std::vector fill(slot_start.begin(), slot_start.end() - 1); + for (int s = 0; s < n_slots; s++) + if (slot_atom[s] >= 0) + slot_index[fill[slot_atom[s]]++] = s; +} + +double RestraintValue(const RestraintSet &set, const RestraintRecord &r, const std::vector> &xyzb) { + V3 g[4]; + switch (static_cast(r.kind)) { + case RestraintKind::Bond: + return refine_math::Norm(At(xyzb, r.atom[0]) - At(xyzb, r.atom[1])); + case RestraintKind::Angle: { + const V3 u = At(xyzb, r.atom[0]) - At(xyzb, r.atom[1]), v = At(xyzb, r.atom[2]) - At(xyzb, r.atom[1]); + return std::atan2(refine_math::Norm(refine_math::Cross(u, v)), refine_math::Dot(u, v)) / refine_math::DEG; + } + case RestraintKind::Torsion: + return refine_math::Dihedral(At(xyzb, r.atom[0]), At(xyzb, r.atom[1]), At(xyzb, r.atom[2]), + At(xyzb, r.atom[3]), g) / refine_math::DEG; + case RestraintKind::Chiral: { + const V3 c = At(xyzb, r.atom[0]); + return refine_math::Dot(At(xyzb, r.atom[1]) - c, + refine_math::Cross(At(xyzb, r.atom[2]) - c, At(xyzb, r.atom[3]) - c)); + } + case RestraintKind::Repulsion: + return refine_math::Norm(At(xyzb, r.atom[0]) - Image(r, At(xyzb, r.atom[1]))); + case RestraintKind::BSimilarity: + return xyzb[r.atom[0]][3] - xyzb[r.atom[1]][3]; + case RestraintKind::Plane: + break; + } + (void) set; + return NAN; +} + +double EvaluateRestraints(const RestraintSet &set, const std::vector> &xyzb, + std::vector> *grad) { + double sum = 0; + std::vector> px, pg; + for (const RestraintRecord &r : set.records) { + V3 g[4] = {}; + int n = 0; + double e = 0; + const double ideal = r.ideal, sigma = r.sigma; + switch (static_cast(r.kind)) { + case RestraintKind::Bond: + e = refine_math::BondTerm(At(xyzb, r.atom[0]), At(xyzb, r.atom[1]), ideal, sigma, g); + n = 2; + break; + case RestraintKind::Angle: + e = refine_math::AngleTerm(At(xyzb, r.atom[0]), At(xyzb, r.atom[1]), At(xyzb, r.atom[2]), ideal, sigma, g); + n = 3; + break; + case RestraintKind::Torsion: + e = refine_math::TorsionTerm(At(xyzb, r.atom[0]), At(xyzb, r.atom[1]), At(xyzb, r.atom[2]), + At(xyzb, r.atom[3]), ideal, sigma, r.period, g); + n = 4; + break; + case RestraintKind::Chiral: + e = refine_math::ChiralTerm(At(xyzb, r.atom[0]), At(xyzb, r.atom[1]), At(xyzb, r.atom[2]), + At(xyzb, r.atom[3]), ideal, sigma, g); + n = 4; + break; + case RestraintKind::Repulsion: + e = refine_math::RepulsionTerm(At(xyzb, r.atom[0]), Image(r, At(xyzb, r.atom[1])), ideal, sigma, g); + g[1] = FromImage(r, g[1]); + n = 2; + break; + case RestraintKind::Plane: { + const int m = r.atom[1]; + px.resize(m); + pg.resize(m); + for (int k = 0; k < m; k++) + px[k] = At(xyzb, set.plane_atoms[r.atom[0] + k]); + e = refine_math::PlaneTerm(px.data(), m, sigma, pg.data()); + if (grad != nullptr) + for (int k = 0; k < m; k++) { + std::array &d = (*grad)[set.plane_atoms[r.atom[0] + k]]; + d[0] += pg[k].x; + d[1] += pg[k].y; + d[2] += pg[k].z; + } + break; + } + case RestraintKind::BSimilarity: { + double gi = 0, gj = 0; + e = refine_math::BSimilarityTerm(xyzb[r.atom[0]][3], xyzb[r.atom[1]][3], sigma, gi, gj); + if (grad != nullptr) { + (*grad)[r.atom[0]][3] += gi; + (*grad)[r.atom[1]][3] += gj; + } + break; + } + } + sum += e; + if (grad != nullptr) + for (int k = 0; k < n; k++) { + std::array &d = (*grad)[r.atom[k]]; + d[0] += g[k].x; + d[1] += g[k].y; + d[2] += g[k].z; + } + } + return sum; +} + +std::vector BRestraintCurvature(const RestraintSet &set, const std::vector> &xyzb) { + std::vector h(xyzb.size(), 0.0); + for (const RestraintRecord &r : set.records) + if (r.kind == static_cast(RestraintKind::BSimilarity)) { + // d2E/dB_i^2 of BSimilarityTerm = 2 B_j / (kappa^2 B_i^3) + const double bi = xyzb[r.atom[0]][3], bj = xyzb[r.atom[1]][3], k2 = double(r.sigma) * r.sigma; + h[r.atom[0]] += 2.0 * bj / (k2 * bi * bi * bi); + h[r.atom[1]] += 2.0 * bi / (k2 * bj * bj * bj); + } + return h; +} + +RefinementTopology BuildRefinementTopology(gemmi::Structure &st, bool hydrogens) { + RefinementTopology out; + gemmi::Model &model = st.models.at(0); + out.monlib = std::make_shared(EmbeddedMonomerLibrary()); + gemmi::MonLib &monlib = *out.monlib; + gemmi::setup_entities(st); + out.metal_links = AddMetalLinks(st, monlib); + gemmi::Logger quiet; // missing atoms and unknown residues are what the fixed residues report + quiet.threshold = 0; + out.topo = gemmi::prepare_topology(st, monlib, 0, + hydrogens ? gemmi::HydrogenChange::ReAddButWater : gemmi::HydrogenChange::NoChange, + /*reorder=*/false, quiet, /*ignore_unknown_links=*/true, /*use_cispeps=*/true); + gemmi::Topo *topo = out.topo.get(); + + // the atoms as they are now, hydrogens added + std::unordered_map index; + std::vector residue_of; + for (const gemmi::Chain &ch : model.chains) + for (const gemmi::Residue &r : ch.residues) + for (const gemmi::Atom &a : r.atoms) { + index[&a] = static_cast(residue_of.size()); + residue_of.push_back(&r); + } + const size_t n = residue_of.size(); + out.refinable.assign(n, 0); + out.vdw_radius.assign(n, 1.7f); + out.hbond.assign(n, 0); + out.metal.assign(n, 0); + out.altloc.assign(n, 0); + out.element.assign(n, gemmi::El::X); + out.rider_parent.assign(n, -1); + for (const gemmi::Topo::Bond &b : topo->bonds) + for (int k = 0; k < 2; k++) + if (b.atoms[k]->is_hydrogen() && !b.atoms[1 - k]->is_hydrogen()) + out.rider_parent[index.at(b.atoms[k])] = index.at(b.atoms[1 - k]); + // A hydrogen gemmi could not place, or with no parent, scatters nothing. + for (gemmi::Chain &ch : model.chains) + for (gemmi::Residue &r : ch.residues) + for (gemmi::Atom &a : r.atoms) + if (a.is_hydrogen() && (out.rider_parent[index.at(&a)] < 0 || !std::isfinite(a.pos.x))) { + a.occ = 0; + out.rider_parent[index.at(&a)] = -1; + if (!std::isfinite(a.pos.x)) + a.pos = r.atoms.front().pos; + } + + // A residue is refined where the dictionary describes it and every one of its atoms. + std::set fixed_names; + for (const gemmi::Topo::ChainInfo &ci : topo->chain_infos) + for (const gemmi::Topo::ResInfo &ri : ci.res_infos) { + const gemmi::Residue &res = *ri.res; + bool known = ri.orig_chemcomp != nullptr && InEmbeddedMonomerLibrary(res.name); + for (const gemmi::Atom &a : res.atoms) + known = known && ri.get_final_chemcomp(a.altloc).has_atom(a.name); + if (known) + out.restrained_residues++; + else { + out.fixed_residues++; + fixed_names.insert(res.name); + } + for (const gemmi::Atom &a : res.atoms) { + const auto it = index.find(&a); + if (it == index.end()) + continue; + const int i = it->second; + out.refinable[i] = known && a.occ > 0 && !a.is_hydrogen(); + out.vdw_radius[i] = VdwRadius(monlib, res.name, a); + out.hbond[i] = res.is_water() || CanHydrogenBond(monlib, res.name, a); + out.metal[i] = IsMetal(a.element); + out.altloc[i] = a.altloc; + out.element[i] = a.element.elem; + } + } + out.fixed_names.assign(fixed_names.begin(), fixed_names.end()); + + auto idx = [&](const gemmi::Atom *a) { return index.at(a); }; + auto has_h = [](std::initializer_list atoms) { + for (const gemmi::Atom *a : atoms) + if (a->is_hydrogen()) + return true; + return false; + }; + auto any_refinable = [&](std::initializer_list atoms) { + for (int a : atoms) + if (out.refinable[a]) + return true; + return false; + }; + std::vector> excluded(n); + std::vector> bonded(n); + for (size_t i = 0; i < n; i++) + excluded[i].insert(static_cast(i)); + + for (const gemmi::Topo::Bond &b : topo->bonds) { + if (b.asu == gemmi::Asu::Different || has_h({b.atoms[0], b.atoms[1]})) + continue; + const int i = idx(b.atoms[0]), j = idx(b.atoms[1]); + excluded[i].insert(j); + excluded[j].insert(i); + bonded[i].push_back(j); + bonded[j].push_back(i); + if (!any_refinable({i, j}) || !(b.restr->esd > 0)) + continue; + RestraintRecord r; + r.kind = static_cast(RestraintKind::Bond); + r.atom[0] = i; + r.atom[1] = j; + r.ideal = static_cast(b.restr->value); + r.sigma = static_cast(b.restr->esd); + if (out.metal[i] || out.metal[j]) + out.metal_bonds.Add(r, 2); // a metal's coordination, kept apart from the covalent bonds + else { + out.geometry.Add(r, 2); + out.bonds++; + } + RestraintRecord rb; + rb.kind = static_cast(RestraintKind::BSimilarity); + rb.atom[0] = i; + rb.atom[1] = j; + const bool main = IsMainChain(*b.atoms[0]) && IsMainChain(*b.atoms[1]); + rb.sigma = main ? B_KAPPA_MAIN_BOND : B_KAPPA_SIDE_BOND; + out.adp.Add(rb, 2); + } + for (const gemmi::Topo::Angle &an : topo->angles) { + if (has_h({an.atoms[0], an.atoms[1], an.atoms[2]})) + continue; + const int i = idx(an.atoms[0]), j = idx(an.atoms[1]), k = idx(an.atoms[2]); + excluded[i].insert(k); + excluded[k].insert(i); + if (!any_refinable({i, j, k}) || !(an.restr->esd > 0)) + continue; + RestraintRecord r; + r.kind = static_cast(RestraintKind::Angle); + r.atom[0] = i; + r.atom[1] = j; + r.atom[2] = k; + r.ideal = static_cast(an.restr->value); + r.sigma = static_cast(an.restr->esd); + out.geometry.Add(r, 3); + out.angles++; + RestraintRecord rb; + rb.kind = static_cast(RestraintKind::BSimilarity); + rb.atom[0] = i; + rb.atom[1] = k; + const bool main = IsMainChain(*an.atoms[0]) && IsMainChain(*an.atoms[2]); + rb.sigma = main ? B_KAPPA_MAIN_ANGLE : B_KAPPA_SIDE_ANGLE; + out.adp.Add(rb, 2); + } + for (const gemmi::Topo::Torsion &t : topo->torsions) { + const std::string &label = t.restr->label; + if (has_h({t.atoms[0], t.atoms[1], t.atoms[2], t.atoms[3]})) + continue; + if (!(t.restr->esd > 0) || label.rfind("phi", 0) == 0 || label.rfind("psi", 0) == 0 || + label.rfind("C2e", 0) == 0 || label.rfind("C3e", 0) == 0) + continue; + const int a = idx(t.atoms[0]), b = idx(t.atoms[1]), c = idx(t.atoms[2]), d = idx(t.atoms[3]); + if (!any_refinable({a, b, c, d})) + continue; + RestraintRecord r; + r.kind = static_cast(RestraintKind::Torsion); + r.atom[0] = a; + r.atom[1] = b; + r.atom[2] = c; + r.atom[3] = d; + r.ideal = static_cast(t.restr->value); + r.sigma = static_cast(t.restr->esd); + r.period = t.restr->period; + out.geometry.Add(r, 4); + out.torsions++; + } + for (const gemmi::Topo::Chirality &ch : topo->chirs) { + if (ch.restr->sign == gemmi::ChiralityType::Both || has_h({ch.atoms[0], ch.atoms[1], ch.atoms[2], ch.atoms[3]})) + continue; + const int c = idx(ch.atoms[0]), a1 = idx(ch.atoms[1]), a2 = idx(ch.atoms[2]), a3 = idx(ch.atoms[3]); + if (!any_refinable({c, a1, a2, a3})) + continue; + const double volume = topo->ideal_chiral_abs_volume(ch); + RestraintRecord r; + r.kind = static_cast(RestraintKind::Chiral); + r.atom[0] = c; + r.atom[1] = a1; + r.atom[2] = a2; + r.atom[3] = a3; + r.ideal = static_cast(ch.restr->sign == gemmi::ChiralityType::Negative ? -volume : volume); + r.sigma = CHIRAL_SIGMA; + out.geometry.Add(r, 4); + out.chirals++; + } + for (const gemmi::Topo::Plane &p_all : topo->planes) { + gemmi::Topo::Plane p = p_all; + std::erase_if(p.atoms, [](const gemmi::Atom *a) { return a->is_hydrogen(); }); + if (p.atoms.size() < 4 || !(p.restr->esd > 0)) + continue; + bool any = false; + for (const gemmi::Atom *a : p.atoms) + any = any || out.refinable[idx(a)]; + if (!any) + continue; + RestraintRecord r; + r.kind = static_cast(RestraintKind::Plane); + r.atom[0] = static_cast(out.geometry.plane_atoms.size()); + r.atom[1] = static_cast(p.atoms.size()); + r.sigma = static_cast(p.restr->esd); + for (const gemmi::Atom *a : p.atoms) + out.geometry.plane_atoms.push_back(idx(a)); + out.geometry.Add(r, r.atom[1]); + out.planes++; + } + // and those three bonds away, whose distance the torsions and planes govern + std::vector> within3 = excluded; + for (size_t i = 0; i < n; i++) + for (int j : excluded[i]) + for (int k : bonded[j]) + within3[i].insert(k); + out.excluded.resize(n); + for (size_t i = 0; i < n; i++) + out.excluded[i].assign(within3[i].begin(), within3[i].end()); + out.geometry.Finalize(n); + out.metal_bonds.Finalize(n); + out.adp.Finalize(n); + return out; +} + +namespace { + +// The pairs of atoms of `model`, symmetry mates and lattice translates included, closer than `reach` and not excluded, where at least one of +// the two is refinable, neither is a hydrogen and the two are not alternative conformations of each other: `make` +// turns each into a record (the image of j as x -> rot x + tran, Cartesian, and the distance), or says to leave it out. +// The search runs on `nthreads` threads; the list is in atom order whatever their number. +RestraintSet Contacts(const RefinementTopology &topo, gemmi::Model &model, const gemmi::UnitCell &cell_in, + const gemmi::SpaceGroup &sg, double reach, size_t nthreads, + const std::function &make) { + gemmi::UnitCell cell = cell_in; + cell.set_cell_images_from_spacegroup(&sg); + gemmi::NeighborSearch ns(model, cell, std::max(reach, 5.0)); + ns.populate(false); + + std::vector> first(model.chains.size()); + std::vector pos; + for (size_t c = 0; c < model.chains.size(); c++) + for (const gemmi::Residue &r : model.chains[c].residues) { + first[c].push_back(static_cast(pos.size())); + for (const gemmi::Atom &a : r.atoms) + pos.push_back(a.pos); + } + + // The atoms in blocks searched on the threads, each block's pairs listed in atom order; the blocks are + // joined in order below, so the list is the same for any number of threads. + constexpr int BLOCKS = 64; + std::vector> found(BLOCKS); + ParallelFor(BLOCKS, nthreads, [&](int block) { + const size_t lo = pos.size() * block / BLOCKS, hi = pos.size() * (block + 1) / BLOCKS; + for (size_t i = lo; i < hi; i++) { + if (topo.rider_parent[i] >= 0 || topo.element[i] == gemmi::El::H) + continue; + const gemmi::Fractional fi = cell.fractionalize(pos[i]); + ns.for_each(pos[i], '\0', reach, [&](gemmi::NeighborSearch::Mark &m, double) { + const int j = first[m.chain_idx][m.residue_idx] + m.atom_idx; + if (topo.rider_parent[j] >= 0 || topo.element[j] == gemmi::El::H) + return; + if (!topo.refinable[i] && !topo.refinable[j]) + return; + if (topo.altloc[i] && topo.altloc[j] && topo.altloc[i] != topo.altloc[j]) + return; + // The image of j nearest to i, as a Cartesian x -> R x + t. + const gemmi::FTransform ft = ns.get_image_transformation(m.image_idx); + const gemmi::Fractional fj = ft.apply(cell.fractionalize(pos[j])); + const gemmi::Vec3 shift(std::round(fi.x - fj.x), std::round(fi.y - fj.y), std::round(fi.z - fj.z)); + const bool same_copy = m.image_idx == 0 && shift.x == 0 && shift.y == 0 && shift.z == 0; + // Within the copy itself: each pair once, the excluded ones left out. With any other copy + // (a symmetry mate or a lattice translate): the pair is met again from j, so it is kept from + // the lower atom only. + if (same_copy && (static_cast(i) >= j || + std::binary_search(topo.excluded[i].begin(), topo.excluded[i].end(), j))) + return; + if (!same_copy && static_cast(i) > j) + return; + // An atom against its own image x -> T x is met again through T^-1, at the same distance: + // the one of the two images that comes first in fractional coordinates is kept. + if (static_cast(i) == j) { + gemmi::Transform t = ft; + t.vec += shift; + const gemmi::Vec3 there = t.apply(fi), back = t.inverse().apply(fi); + for (int a = 0; a < 3; a++) { + if (back.at(a) < there.at(a) - 1e-6) + return; + if (back.at(a) > there.at(a) + 1e-6) + break; + } + } + const gemmi::Mat33 rot = cell.orth.mat.multiply(ft.mat).multiply(cell.frac.mat); + const gemmi::Vec3 tran = cell.orth.mat.multiply(ft.vec + shift); + const gemmi::Position image(rot.multiply(pos[j]) + tran); + RestraintRecord r; + r.atom[0] = static_cast(i); + r.atom[1] = j; + for (int a = 0; a < 3; a++) { + for (int b = 0; b < 3; b++) + r.rot[3 * a + b] = static_cast(rot[a][b]); + r.tran[a] = static_cast(tran.at(a)); + } + if (make(static_cast(i), j, pos[i].dist(image), r)) + found[block].push_back(r); + }); + } + }); + RestraintSet out; + for (const std::vector &records : found) + for (const RestraintRecord &r : records) + out.Add(r, 2); + out.Finalize(pos.size()); + return out; +} + +} // namespace + +RestraintSet BuildRepulsions(const RefinementTopology &topo, gemmi::Model &model, const gemmi::UnitCell &cell, + const gemmi::SpaceGroup &sg, double margin, size_t nthreads) { + float max_radius = 0; + for (float r : topo.vdw_radius) + max_radius = std::max(max_radius, r); + return Contacts(topo, model, cell, sg, 2 * max_radius + margin, nthreads, + [&](int i, int j, double d, RestraintRecord &r) { + float d0 = topo.vdw_radius[i] + topo.vdw_radius[j]; + if (topo.metal[i] || topo.metal[j]) { + const gemmi::El other = topo.element[topo.metal[i] ? j : i]; + if (other == gemmi::El::N || other == gemmi::El::O || other == gemmi::El::S) + d0 = METAL_CONTACT; + } else if (topo.hbond[i] && topo.hbond[j]) + d0 = HBOND_CONTACT; + if (!(d < d0 + margin)) + return false; + r.kind = static_cast(RestraintKind::Repulsion); + r.ideal = d0; + r.sigma = REPULSION_SIGMA; + return true; + }); +} + +RestraintSet BuildBContacts(const RefinementTopology &topo, gemmi::Model &model, const gemmi::UnitCell &cell, + const gemmi::SpaceGroup &sg, size_t nthreads) { + return Contacts(topo, model, cell, sg, B_CONTACT_DISTANCE, nthreads, [&](int i, int j, double d, RestraintRecord &r) { + if (i == j || !(d < B_CONTACT_DISTANCE)) + return false; + r.kind = static_cast(RestraintKind::BSimilarity); + r.sigma = B_KAPPA_CONTACT; + return true; + }); +} + +void PlaceRidingHydrogens(RefinementTopology &topo) { + gemmi::place_hydrogens_on_all_atoms(*topo.topo); +} + +GeometryStatistics MeasureGeometry(const RestraintSet &geometry, const RestraintSet &repulsions, + const std::vector> &xyzb, const RestraintSet *metal_bonds) { + GeometryStatistics s; + if (metal_bonds != nullptr) { + double sm = 0, zm = 0; + for (const RestraintRecord &r : metal_bonds->records) { + const double d = RestraintValue(*metal_bonds, r, xyzb) - r.ideal; + sm += d * d; + zm += d * d / (double(r.sigma) * r.sigma); + s.metal_bonds++; + } + s.rmsd_metal = s.metal_bonds > 0 ? std::sqrt(sm / s.metal_bonds) : 0; + s.rmsz_metal = s.metal_bonds > 0 ? std::sqrt(zm / s.metal_bonds) : 0; + } + double sb = 0, sa = 0, sc = 0, zb = 0, za = 0; + int nc = 0; + for (const RestraintRecord &r : geometry.records) { + const RestraintKind kind = static_cast(r.kind); + if (kind == RestraintKind::Bond) { + const double d = RestraintValue(geometry, r, xyzb) - r.ideal; + sb += d * d; + zb += d * d / (double(r.sigma) * r.sigma); + s.bonds++; + } else if (kind == RestraintKind::Angle) { + const double d = RestraintValue(geometry, r, xyzb) - r.ideal; + sa += d * d; + za += d * d / (double(r.sigma) * r.sigma); + s.angles++; + } else if (kind == RestraintKind::Chiral) { + const double d = RestraintValue(geometry, r, xyzb) - r.ideal; + sc += d * d; + nc++; + } + } + for (const RestraintRecord &r : repulsions.records) + if (RestraintValue(repulsions, r, xyzb) < r.ideal - 0.4) + s.clashes++; + s.rmsd_bonds = s.bonds > 0 ? std::sqrt(sb / s.bonds) : 0; + s.rmsd_angles = s.angles > 0 ? std::sqrt(sa / s.angles) : 0; + s.rmsd_chirals = nc > 0 ? std::sqrt(sc / nc) : 0; + s.rmsz_bonds = s.bonds > 0 ? std::sqrt(zb / s.bonds) : 0; + s.rmsz_angles = s.angles > 0 ? std::sqrt(za / s.angles) : 0; + return s; +} diff --git a/image_analysis/structure_refinement/RefinementRestraints.h b/image_analysis/structure_refinement/RefinementRestraints.h new file mode 100644 index 000000000..335a511bc --- /dev/null +++ b/image_analysis/structure_refinement/RefinementRestraints.h @@ -0,0 +1,124 @@ +// SPDX-FileCopyrightText: 2026 Filip Leonarski, Paul Scherrer Institute +// SPDX-License-Identifier: GPL-3.0-only + +#pragma once + +#include +#include +#include +#include + +#include + +#include "gemmi/model.hpp" +#include "gemmi/monlib.hpp" +#include "gemmi/topo.hpp" +#include "gemmi/unitcell.hpp" + +#include "RefinementMath.h" // RestraintRecord + +// The geometry side of restrained refinement (Refinement.h): what the dictionary says each refinable atom's +// surroundings should look like, as flat lists of restraints the CPU and the GPU evaluate alike +// (RefinementMath.h). Atoms are numbered in model order, as ModelPositions() lists them. + +// A list of restraints and how their gradients reach the atoms: each restraint writes one gradient slot per +// atom it involves, and atom a sums the slots slot_index[slot_start[a] ... slot_start[a + 1]) in that order - +// a gather, so that a GPU, summing in the same order, needs no atomics and gives the same bits every run. +struct RestraintSet { + std::vector records; + std::vector plane_atoms; + int n_slots = 0; + std::vector slot_start; // n_atoms + 1 + std::vector slot_index; + + void Add(RestraintRecord r, int n_atoms_of_r); + void Append(const RestraintSet &other); // other's records after these; Finalize() again afterwards + void Finalize(size_t n_atoms); + // Which atom each slot belongs to (Finalize() works it out); -1 for none. + std::vector slot_atom; +}; + +// The value of one restraint's own quantity (a distance, an angle, a volume ...) at `xyzb`, for statistics. +double RestraintValue(const RestraintSet &set, const RestraintRecord &r, const std::vector> &xyzb); + +// The sum of E over the set at `xyzb` (x, y, z, B per atom) and, with `grad`, dE/d(x, y, z, B) per atom (added +// to it). On the CPU, in double. +double EvaluateRestraints(const RestraintSet &set, const std::vector> &xyzb, + std::vector> *grad); + +// The diagonal of the Hessian of the set's B similarity restraints with respect to each atom's B, at `xyzb`. +std::vector BRestraintCurvature(const RestraintSet &set, const std::vector> &xyzb); + +// What refinement knows of a model's chemistry. +struct RefinementTopology { + RestraintSet geometry; // bonds, angles, torsions, chiral volumes, planes + RestraintSet metal_bonds; // the bonds of metals (ions, a heme's iron) to their donors, apart from the rest + RestraintSet adp; // B of bonded and angle-related atoms alike + std::vector refinable; // per atom: its residue is described by the dictionary + // Per atom: the atoms the repulsion leaves out - itself and those up to three bonds away (sorted). + std::vector> excluded; + std::vector vdw_radius; // A + std::vector hbond; // donor, acceptor or both (water included) + std::vector metal; // a metal atom: an ion, or a metal within a ligand (a heme's iron) + std::vector altloc; + std::vector element; + // Per atom: the heavy atom a hydrogen rides on, -1 for every other atom. + std::vector rider_parent; + // The topology itself and the dictionary it points into, for placing the hydrogens again. + std::shared_ptr monlib; + std::shared_ptr topo; + int restrained_residues = 0; + int fixed_residues = 0; + std::vector fixed_names; // the residue names held fixed, each once + int bonds = 0, angles = 0, torsions = 0, chirals = 0, planes = 0; + int metal_links = 0; // metal-donor bonds made from the model's LINK records (AddMetalLinks) +}; + +// The topology of the first model of `st` (hydrogens already removed) from the embedded monomer library +// (MonomerLibrary.h), through gemmi's prepare_topology(): links between residues (peptide, cis-peptide, +// nucleic-acid backbone, disulfides, the model's LINK records the library describes) and their +// modifications included; the LINK records of metals (ions, a heme's iron) the library has no link for are +// restrained at the library's metal-site distances (RefinementRestraints.cpp, AddMetalLinks). A residue the library +// does not describe, or with an atom it does not know, is held fixed: it stays in the structure factors and the +// bulk-solvent mask, and it is restrained against. +// Torsions: those with an esd, except the main-chain phi/psi and the sugar puckers given as alternatives. +// With `hydrogens`, the dictionary's hydrogens are added to the residues it describes (waters excepted) and +// placed; they ride on their parent atoms and take part in no restraint. +RefinementTopology BuildRefinementTopology(gemmi::Structure &st, bool hydrogens = false); + +// The riding hydrogens placed again on their parents as they are now (gemmi's place_hydrogens_on_all_atoms). +void PlaceRidingHydrogens(RefinementTopology &topo); + +// The repulsions of the model as it is now: every pair of atoms, symmetry mates included, closer than its +// contact distance plus `margin` and not excluded, where at least one of the two is refinable and the two are +// not alternative conformations of each other. Contact distances: van der Waals radii summed, 2.6 A where +// both can hydrogen-bond, 1.9 A between a metal and N, O or S. `model` is not changed (gemmi's NeighborSearch +// takes it non-const); the search runs on `nthreads` threads. +RestraintSet BuildRepulsions(const RefinementTopology &topo, gemmi::Model &model, const gemmi::UnitCell &cell, + const gemmi::SpaceGroup &sg, double margin, size_t nthreads = 1); + +// The B similarity of the atoms in contact (closer than 4 A, symmetry mates included) that no bond or angle relates, +// waters among them, under the same conditions as BuildRepulsions(). +RestraintSet BuildBContacts(const RefinementTopology &topo, gemmi::Model &model, const gemmi::UnitCell &cell, + const gemmi::SpaceGroup &sg, size_t nthreads = 1); + +// The usual summary of a model's geometry. +struct GeometryStatistics { + double rmsd_bonds = 0, rmsd_angles = 0, rmsd_chirals = 0; + double rmsz_bonds = 0, rmsz_angles = 0; // rms of (deviation / the dictionary's sigma) + int bonds = 0, angles = 0; + int clashes = 0; // repulsions overlapping by more than 0.4 A + // The metal-donor bonds, apart: their sigma is the spread of real sites (0.04-0.1 A), so they sit further + // from ideal than covalent bonds do and are not what the bond rmsd's bound is about. + double rmsd_metal = 0, rmsz_metal = 0; + int metal_bonds = 0; + // Bonds and metal bonds together, as one rmsd (what REFMAC lists as its bond distances). + double RmsdAllBonds() const { + const int n = bonds + metal_bonds; + return n > 0 ? std::sqrt((rmsd_bonds * rmsd_bonds * bonds + rmsd_metal * rmsd_metal * metal_bonds) / n) : 0; + } +}; +// `metal_bonds`: where given, its bonds are measured too (rmsd_metal), apart from `geometry`'s. +GeometryStatistics MeasureGeometry(const RestraintSet &geometry, const RestraintSet &repulsions, + const std::vector> &xyzb, + const RestraintSet *metal_bonds = nullptr); diff --git a/image_analysis/structure_refinement/RefinementXray.cpp b/image_analysis/structure_refinement/RefinementXray.cpp new file mode 100644 index 000000000..faba0a11d --- /dev/null +++ b/image_analysis/structure_refinement/RefinementXray.cpp @@ -0,0 +1,531 @@ +// SPDX-FileCopyrightText: 2026 Filip Leonarski, Paul Scherrer Institute +// SPDX-License-Identifier: GPL-3.0-only + +#include "RefinementXray.h" + +#include +#include +#include +#include + +#include + +#include "gemmi/dencalc.hpp" +#include "gemmi/it92.hpp" +#include "gemmi/math.hpp" + +#include "../../common/Logger.h" +#include "../../common/ParallelFor.h" +#include "ModelFFT.h" +#include "ModelGrid.h" +#include "RefinementMath.h" + +namespace { + +using Table = gemmi::IT92; + +// The free reflections a likelihood bin is fitted on, at least. +constexpr size_t FREE_PER_BIN = 100; +constexpr size_t MAX_BINS = 30; + +// The density calculator the refinement grids atoms with: DensityCalculator's settings for the grid of +// RigidBodyZoneGrid(), and the given blur. +gemmi::DensityCalculator Calculator(const gemmi::UnitCell &cell, const gemmi::SpaceGroup &sg, + double d_min, double blur) { + gemmi::DensityCalculator dc; + dc.d_min = d_min; + dc.rate = 1.5; // RigidBodyRefine.cpp's GRID_RATE, which RigidBodyZoneGrid sizes the grid with + dc.grid.unit_cell = cell; + dc.grid.spacegroup = &sg; + dc.blur = blur; + dc.cutoff = REFINEMENT_DENSITY_CUTOFF; + return dc; +} + +// The likelihood's variance of reflection i: epsilon beta, plus the measurement error of each of the structure +// factor's components that the observed amplitude measures - sigma^2 twice for an acentric reflection, once for a +// centric one (with_sigma = false leaves it out). +double Variance(const RefinementReflections &refl, size_t i, double beta, bool with_sigma) { + const double s2 = with_sigma ? double(refl.sigma[i]) * refl.sigma[i] : 0.0; + return refl.epsilon[i] * beta + (refl.centric[i] ? s2 : 2.0 * s2); +} + +// The first and second derivatives of one row's -ln L (refine_math::AmplitudeNegLogLikelihood) in D and in the +// variance, at D and var. +struct RowDerivatives { + double d, dd, v, vv; +}; + +RowDerivatives LikelihoodDerivatives(double fo, double fc, double d, double var, bool centric) { + const double q = fo * fo + d * d * fc * fc; + if (!centric) { + // x = 2 D Fo Fc / var, m = I1(x) / I0(x) = d ln I0 / dx, m' = 1 - m / x - m^2 + const double a = 2.0 * fo * fc / var, x = a * d; + double log_i0, m; + refine_math::BesselI0I1(x, log_i0, m); + const double m1 = x > 0 ? 1.0 - m / x - m * m : 0.5; + return {2.0 * d * fc * fc / var - a * m, + 2.0 * fc * fc / var - a * a * m1, + 1.0 / var - q / (var * var) + m * x / var, + (-1.0 + 2.0 * q / var - x * (m1 * x + 2.0 * m)) / (var * var)}; + } + // x = D Fo Fc / var, t = tanh x = d ln cosh / dx + const double a = fo * fc / var, x = a * d; + const double t = std::tanh(x), t1 = 1.0 - t * t; + return {d * fc * fc / var - a * t, + fc * fc / var - a * a * t1, + 0.5 / var - q / (2.0 * var * var) + t * x / var, + (-0.5 + q / var - x * (t1 * x + 2.0 * t)) / (var * var)}; +} + +// The minimum of a function over [lo, hi] from x, given its first and second derivative (derivatives(x, g, h)): +// Newton's method on the first derivative, kept inside the interval where that changes sign and bisecting it +// wherever a step would leave it or the curvature is not positive. A minimum on a bound is the bound. +template +double NewtonMinimum(F derivatives, double x, double lo, double hi) { + x = std::clamp(x, lo, hi); + for (int iteration = 0; iteration < 200; iteration++) { + double g = 0, h = 0; + derivatives(x, g, h); + if (g < 0) + lo = x; + else + hi = x; + double next = h > 0 ? x - g / h : lo - 1.0; + if (!(next > lo && next < hi)) + next = 0.5 * (lo + hi); + const bool converged = std::fabs(next - x) < 1e-10 || hi - lo < 1e-10; + x = next; + if (converged) + break; + } + return x; +} + +class RefinementEngineCPU : public RefinementEngine { +public: + RefinementEngineCPU(const gemmi::UnitCell &cell, const gemmi::SpaceGroup &sg, double d_min, + const RefinementReflections &refl, size_t nthreads) + : cell_(cell), sg_(sg), d_min_(d_min), refl_(refl), nthreads_(nthreads), + grid_(RigidBodyZoneGrid(cell, sg, d_min)), composition_(grid_, d_min, refl.hkl), + orbit_leaders_(OrbitLeaders(grid_, nthreads)) {} + + void SetBlur(double blur) override { blur_ = blur; } + void SetRowModel(const XrayRowModel &rows) override { rows_ = rows; } + bool OnGPU() const override { return false; } + + void Fcalc(const gemmi::Model &model, std::vector> &f) override { + std::vector> fd; + Compose(model, fd); + f.assign(fd.begin(), fd.end()); + } + + void Fmask(const gemmi::Model &model, std::vector> &f) override { + gemmi::Grid mask = grid_; + PutMaskOnGrid(mask, model, orbit_leaders_, nthreads_); + const gemmi::FPhiGrid fm = MapToFPhi(mask); + f.clear(); + for (const gemmi::Miller &h : refl_.hkl) + f.push_back(fm.get_value_by_hkl(h)); + } + + double Evaluate(const gemmi::Model &model, std::vector> *grad) override { + std::vector> f; + Compose(model, f); + const size_t n = f.size(); + // The target and, per reflection, dT/dF of the atoms' structure factor (dT/dRe F + i dT/dIm F). + std::vector> dt_df(n, 0.0); + double sum = 0; + for (size_t m = 0; m < n; m++) { + if (refl_.free[m]) + continue; + const double k = rows_.k_total[m]; + const std::complex fm = k * (f[m] + std::complex(rows_.fmask[m])); + const double fc = std::abs(fm); + double dfc = 0; + sum += refine_math::AmplitudeNegLogLikelihood(refl_.fo[m], fc, rows_.d[m], rows_.var[m], + refl_.centric[m], dfc); + if (fc > 0) + dt_df[m] = k * dfc * fm / fc; + } + if (grad == nullptr) + return sum; + + // The FFT method's map, dT/drho(x) = (V/N) Re sum_m sum_ops conj(dT/dF_m) scale_m exp(2 pi i h.t) + // exp(2 pi i (hR).x), as the inverse real transform of a half-l coefficient grid: a term A at index k + // goes in as A/2 at k, or as conj(A)/2 at -k where k is in the half not stored; on the planes l = 0 and + // l = nw/2, which hold both, as both. + const int nu = grid_.nu, nv = grid_.nv, nw = grid_.nw, nwh = nw / 2 + 1; + const size_t ncomplex = static_cast(nu) * nv * nwh; + std::complex *in = reinterpret_cast *>(fftwf_alloc_complex(ncomplex)); + float *out = fftwf_alloc_real(static_cast(nu) * nv * nw); + std::fill(in, in + ncomplex, std::complex(0, 0)); + const std::vector &terms = composition_.Terms(); + const size_t ops = composition_.Ops(); + auto add = [&](int ku, int kv, int kw, std::complex value) { + in[gemmi::modulo(ku, nu) + static_cast(nu) * (gemmi::modulo(kv, nv) + static_cast(nv) * kw)] += + std::complex(value); + }; + for (size_t m = 0; m < n; m++) { + if (dt_df[m] == 0.0) + continue; + const double scale = composition_.Centring() * std::exp(blur_ * 0.25 * composition_.InvD2()[m]); + const std::complex c = std::conj(dt_df[m]) * scale; + for (size_t o = 0; o < ops; o++) { + const SymmetryComposition::Term &t = terms[m * ops + o]; + const std::complex a = 0.5 * c * t.phase; + const gemmi::Miller &k = t.k; + if (k[2] > 0 && 2 * k[2] != nw) + add(k[0], k[1], k[2], a); + else if (k[2] < 0 && -2 * k[2] != nw) + add(-k[0], -k[1], -k[2], std::conj(a)); + else { + const int l = k[2] < 0 ? -k[2] : k[2]; + add(k[0], k[1], l, a); + add(-k[0], -k[1], l, std::conj(a)); + } + } + } + MapFromFPhiExecute(nu, nv, nw, in, out); + gemmi::Grid map = grid_; + const float norm = static_cast(cell_.volume / static_cast(map.point_count())); + for (size_t i = 0; i < map.data.size(); i++) + map.data[i] = out[i] * norm; + fftwf_free(in); + fftwf_free(out); + AtomGradientsFromMap(map, model, blur_, nthreads_, *grad); + return sum; + } + +private: + void Compose(const gemmi::Model &model, std::vector> &f) const { + gemmi::DensityCalculator dc = Calculator(cell_, sg_, d_min_, blur_); + PutModelDensityOnGrid(dc, model, {}, nthreads_); // one copy: the symmetry is composed below + composition_.Compose(MapToFPhi(dc.grid), blur_, f, nullptr, nthreads_); + } + + gemmi::UnitCell cell_; + const gemmi::SpaceGroup &sg_; + double d_min_; + const RefinementReflections &refl_; + size_t nthreads_; + gemmi::Grid grid_; + SymmetryComposition composition_; + std::vector orbit_leaders_; + double blur_ = 0; + XrayRowModel rows_; +}; + +} // namespace + +RefinementReflections PrepareRefinementReflections(const std::vector &merged, + const gemmi::UnitCell &cell, const gemmi::SpaceGroup &sg, + double d_min) { + const gemmi::GroupOps gops = sg.operations(); + const gemmi::ReciprocalAsu asu(&sg); + // ASU, last one wins where a reflection is listed twice (both hands of an anomalous merge) + std::map by_hkl; + for (const MergedReflection &r : merged) { + if (!std::isfinite(r.F) || r.F < 0) + continue; + gemmi::Miller h{{r.h, r.k, r.l}}; + if (!asu.is_in(h)) + h = asu.to_asu(h, gops).first; + by_hkl[h] = &r; + } + std::vector hkl; + for (const auto &[h, r] : by_hkl) + hkl.push_back(h); + const SymmetryComposition composition(RigidBodyZoneGrid(cell, sg, d_min), d_min, hkl); + RefinementReflections out; + for (size_t i = 0; i < hkl.size(); i++) { + if (composition.Row()[i] < 0) + continue; + const MergedReflection &r = *by_hkl[hkl[i]]; + out.hkl.push_back(hkl[i]); + out.fo.push_back(r.F); + out.sigma.push_back(std::isfinite(r.sigmaF) ? r.sigmaF : 0.0f); + out.free.push_back(r.rfree_flag); + out.centric.push_back(gops.is_reflection_centric(hkl[i])); + out.epsilon.push_back(static_cast(gops.epsilon_factor(hkl[i]))); + out.inv_d2.push_back(cell.calculate_1_d2(hkl[i])); + } + return out; +} + +BulkSolventMask::BulkSolventMask(const gemmi::UnitCell &cell, const gemmi::SpaceGroup &sg, double d_min, + size_t nthreads) + : grid_(MaskGrid(cell, sg, d_min)), nthreads_(nthreads), + spacing_(std::max(std::min(d_min / 3.0, MASK_SPACING_MAX), std::cbrt(cell.volume / MASK_POINTS_MAX))) {} + +gemmi::Grid BulkSolventMask::MaskGrid(const gemmi::UnitCell &cell, const gemmi::SpaceGroup &sg, double d_min) { + gemmi::Grid grid; + grid.unit_cell = cell; + grid.spacegroup = &sg; + const double spacing = std::max(std::min(d_min / 3.0, MASK_SPACING_MAX), std::cbrt(cell.volume / MASK_POINTS_MAX)); + // set_size_from_spacing()'s size, without allocating the values + const std::array n = gemmi::good_grid_size({{cell.a / spacing, cell.b / spacing, cell.c / spacing}}, + gemmi::GridSizeRounding::Up, &sg); + grid.nu = n[0]; + grid.nv = n[1]; + grid.nw = n[2]; + grid.calculate_spacing(); + grid.axis_order = gemmi::AxisOrder::XYZ; + return grid; +} + +void BulkSolventMask::Fmask(const gemmi::Model &model, const std::vector &hkl, + std::vector> &f) const { + if (orbit_leaders_.empty()) // at the first mask: a GPU engine's refinement never draws one here + orbit_leaders_ = OrbitLeaders(grid_, nthreads_); + gemmi::Grid mask = grid_; + mask.data.resize(mask.point_count()); + PutMaskOnGrid(mask, model, orbit_leaders_, nthreads_); + const gemmi::FPhiGrid fm = MapToFPhi(mask); + f.clear(); + for (const gemmi::Miller &h : hkl) + f.push_back(fm.get_value_by_hkl(h)); +} + +void EstimateLikelihoodParameters(const RefinementReflections &refl, const std::vector> &fmodel, + XrayRowModel &rows, size_t nthreads) { + const size_t n = refl.Size(); + std::vector fc(n); + for (size_t i = 0; i < n; i++) + fc[i] = std::abs(fmodel[i]); + std::vector free, work; + for (size_t i = 0; i < n; i++) + if (fc[i] > 0) + (refl.free[i] ? free : work).push_back(i); + // Too few free reflections to bin: the working set, which says the model is better than it is, but + // still gives the likelihood a scale. + if (free.size() < FREE_PER_BIN) + free.insert(free.end(), work.begin(), work.end()); + std::sort(free.begin(), free.end(), [&](size_t a, size_t b) { return refl.inv_d2[a] < refl.inv_d2[b]; }); + const size_t bins = std::clamp(free.size() / FREE_PER_BIN, 1, MAX_BINS); + // the working reflections of each bin: those from its first free reflection's 1/d^2 to the next bin's + std::vector lower(bins); + for (size_t b = 0; b < bins; b++) + lower[b] = refl.inv_d2[free[b * free.size() / bins]]; + std::vector> work_in_bin(bins); + for (size_t i : work) { + const size_t b = std::upper_bound(lower.begin(), lower.end(), refl.inv_d2[i]) - lower.begin(); + work_in_bin[b > 0 ? b - 1 : 0].push_back(i); + } + + std::vector centre(bins), bin_d(bins), bin_beta(bins); + const bool warm = rows.bin_d.size() == bins; + // each bin is fitted on its own + ParallelFor(static_cast(bins), nthreads, [&](int b) { + const std::vector idx(free.begin() + b * free.size() / bins, free.begin() + (b + 1) * free.size() / bins); + double s2 = 0, sfo = 0, sfc2 = 0, sfofc = 0; + for (size_t i : idx) { + s2 += refl.inv_d2[i]; + sfo += double(refl.fo[i]) * refl.fo[i] / refl.epsilon[i]; + sfc2 += fc[i] * fc[i] / refl.epsilon[i]; + sfofc += refl.fo[i] * fc[i] / refl.epsilon[i]; + } + centre[b] = s2 / static_cast(idx.size()); + double d = sfc2 > 0 ? std::max(sfofc / sfc2, 0.05) : 1.0; + double beta = std::max((sfo - d * d * sfc2) / static_cast(idx.size()), 1e-3 * sfo / idx.size()); + // beta: the spread of the free amplitudes about D Fc, measurement error included, by maximum likelihood + // (alternating one-dimensional minimisations over ln D and ln beta) + for (int round = 0; round < 4; round++) { + const double ld = NewtonMinimum([&](double x, double &g, double &h) { + const double dx = std::exp(x); + for (size_t i : idx) { + const RowDerivatives r = LikelihoodDerivatives(refl.fo[i], fc[i], dx, refl.epsilon[i] * beta, + refl.centric[i]); + g += dx * r.d; + h += dx * dx * r.dd + dx * r.d; + } + }, std::log(d), std::log(d) - 2.0, std::log(std::min(d * 7.4, 3.0))); + d = std::exp(ld); + const double lb = NewtonMinimum([&](double x, double &g, double &h) { + for (size_t i : idx) { + const double var = refl.epsilon[i] * std::exp(x); + const RowDerivatives r = LikelihoodDerivatives(refl.fo[i], fc[i], d, var, refl.centric[i]); + g += var * r.v; + h += var * var * r.vv + var * r.v; + } + }, std::log(beta), std::log(beta) - 3.0, std::log(beta) + 3.0); + beta = std::exp(lb); + } + // D: by maximum likelihood on the working reflections, with the measurement error added to that beta, from + // where the last fit found it. Where the error is a large part of the spread, the variance counts it twice + // and D falls towards 0 - the high-resolution D and figure of merit REFMAC 5.8 reports. + // Following Murshudov et al. (2011) Acta Cryst. D67, 355-367 (D from the working set, the variance from the free) + if (!work_in_bin[b].empty()) { + std::vector var; + for (size_t i : work_in_bin[b]) + var.push_back(Variance(refl, i, beta, true)); + d = NewtonMinimum([&](double x, double &g, double &h) { + for (size_t k = 0; k < var.size(); k++) { + const size_t i = work_in_bin[b][k]; + const RowDerivatives r = LikelihoodDerivatives(refl.fo[i], fc[i], x, var[k], refl.centric[i]); + g += r.d; + h += r.dd; + } + }, warm ? rows.bin_d[b] : d, 0.0, 3.0); + } + bin_d[b] = d; + bin_beta[b] = beta; + }); + rows.bin_d = bin_d; + rows.d.resize(n); + rows.var.resize(n); + for (size_t i = 0; i < n; i++) { + // linear in 1/d^2 between the bins' centres, flat beyond the outermost + const double s = refl.inv_d2[i]; + double d = bin_d[0], beta = bin_beta[0]; + if (s >= centre[bins - 1]) { + d = bin_d[bins - 1]; + beta = bin_beta[bins - 1]; + } else if (s > centre[0]) { + const size_t b = std::upper_bound(centre.begin(), centre.end(), s) - centre.begin(); + const double t = (s - centre[b - 1]) / (centre[b] - centre[b - 1]); + d = bin_d[b - 1] + t * (bin_d[b] - bin_d[b - 1]); + beta = bin_beta[b - 1] + t * (bin_beta[b] - bin_beta[b - 1]); + } + rows.d[i] = static_cast(d); + rows.var[i] = static_cast(Variance(refl, i, beta, true)); + } +} + +RFactors ComputeRFactors(const RefinementReflections &refl, const std::vector> &fmodel) { + double nw = 0, dw = 0, nf = 0, df = 0; + RFactors r; + for (size_t i = 0; i < refl.Size(); i++) { + const double diff = std::fabs(refl.fo[i] - std::abs(fmodel[i])); + if (refl.free[i]) { + nf += diff; + df += refl.fo[i]; + r.n_free++; + } else { + nw += diff; + dw += refl.fo[i]; + r.n_work++; + } + } + r.r_work = dw > 0 ? nw / dw : 1; + r.r_free = df > 0 ? nf / df : 1; + return r; +} + +std::vector> ModelXyzB(const gemmi::Model &model) { + std::vector> out; + for (const gemmi::Chain &ch : model.chains) + for (const gemmi::Residue &r : ch.residues) + for (const gemmi::Atom &a : r.atoms) + out.push_back({a.pos.x, a.pos.y, a.pos.z, a.b_iso}); + return out; +} + +namespace { +std::mutex stage_mutex; +std::map> stage_times; +} // namespace + +RefinementStage::RefinementStage(const char *name) + : name_(name), start_(std::chrono::steady_clock::now()), nvtx_(NvtxRangeStart(name)) {} + +RefinementStage::~RefinementStage() { + NvtxRangeEnd(nvtx_); + const double seconds = std::chrono::duration(std::chrono::steady_clock::now() - start_).count(); + std::lock_guard lock(stage_mutex); + std::pair &t = stage_times[name_]; + t.first += seconds; + t.second++; +} + +void RefinementStage::Log(Logger &logger) { + std::lock_guard lock(stage_mutex); + for (const auto &[name, t] : stage_times) + logger.Debug("TIMING refine.{} {:.3f} {}", name, t.first, t.second); + stage_times.clear(); +} + +double RefinementBlur(const gemmi::UnitCell &cell, const gemmi::SpaceGroup &sg, double d_min, double b_floor) { + // set_refmac_compatible_blur(): u_to_b / 1.1 * spacing^2 - b_min, not below 0, the spacing the one asked for + const gemmi::DensityCalculator dc = Calculator(cell, sg, d_min, 0); + const double spacing = dc.requested_grid_spacing(); + return std::max(0.0, gemmi::u_to_b() / 1.1 * spacing * spacing - b_floor); +} + +std::unique_ptr MakeRefinementEngineCPU(const gemmi::UnitCell &cell, const gemmi::SpaceGroup &sg, + double d_min, const RefinementReflections &refl, + size_t nthreads) { + return std::make_unique(cell, sg, d_min, refl, nthreads); +} + +void AtomGradientsFromMap(const gemmi::Grid &map, const gemmi::Model &model, double blur, size_t nthreads, + std::vector> &grad) { + const gemmi::DensityCalculator dc = Calculator(map.unit_cell, *map.spacegroup, 1.0, blur); + std::vector atoms; + for (const gemmi::Chain &ch : model.chains) + for (const gemmi::Residue &r : ch.residues) + for (const gemmi::Atom &a : r.atoms) + atoms.push_back(&a); + grad.assign(atoms.size(), {0, 0, 0, 0}); + const int nu = map.nu, nv = map.nv, nw = map.nw; + // As ModelGrid.cpp walks a density box: the orthogonalization over the grid size in single precision. + const gemmi::UpperTriangularMat33 &om = map.orth_n; + const float m00 = static_cast(om.a11), m01 = static_cast(om.a12), m02 = static_cast(om.a13), + m11 = static_cast(om.a22), m12 = static_cast(om.a23), m22 = static_cast(om.a33); + constexpr double FOUR_PI2 = 4 * refine_math::PI * refine_math::PI; + ParallelChunks(static_cast(atoms.size()), nthreads, [&](int lo, int hi) { + for (int i = lo; i < hi; i++) { + const gemmi::Atom &atom = *atoms[i]; + const float b = static_cast(atom.b_iso + blur); + const auto precal = Table::get(atom.element, atom.charge, atom.serial).precalculate_density_iso(b, 0.0f); + const double radius = dc.estimate_radius(precal, b); + const float max_r2 = static_cast(radius * radius); + const gemmi::Fractional fpos = map.unit_cell.fractionalize(atom.pos); + const double n3[3] = {fpos.x * nu, fpos.y * nv, fpos.z * nw}; + float nctr[3]; + int c[3], d[3]; + for (int k = 0; k < 3; k++) { + nctr[k] = static_cast(n3[k]); + c[k] = gemmi::iround(n3[k]); + } + d[0] = std::min(static_cast(std::ceil(radius / map.spacing[0])), nu - 1); + d[1] = std::min(static_cast(std::ceil(radius / map.spacing[1])), nv - 1); + d[2] = std::min(static_cast(std::ceil(radius / map.spacing[2])), nw - 1); + double gx = 0, gy = 0, gz = 0, gb = 0; + for (int w = c[2] - d[2]; w <= c[2] + d[2]; w++) { + const float fz = nctr[2] - static_cast(w); + const float z = m22 * fz; + const int w_ = gemmi::modulo(w, nw); + for (int v = c[1] - d[1]; v <= c[1] + d[1]; v++) { + const float fy = nctr[1] - static_cast(v); + const float y = m11 * fy + m12 * fz; + const float yz = y * y + z * z; + if (yz > max_r2) + continue; + const float x_yz = m01 * fy + m02 * fz; + const size_t row = static_cast(nu) * (gemmi::modulo(v, nv) + static_cast(nv) * w_); + for (int u = c[0] - d[0]; u <= c[0] + d[0]; u++) { + const float x = m00 * (nctr[0] - static_cast(u)) + x_yz; + const float r2 = yz + x * x; + if (r2 > max_r2) + continue; + const double value = map.data[row + gemmi::modulo(u, nu)]; + double dr2 = 0, db = 0; + for (size_t q = 0; q < std::size(precal.a); q++) { + const double e = precal.a[q] * gemmi::unsafe_expapprox(std::max(precal.b[q] * r2, -88.f)); + dr2 += e * precal.b[q]; + db += e * precal.b[q] * (1.5 + precal.b[q] * r2); + } + gx += value * dr2 * x; + gy += value * dr2 * y; + gz += value * dr2 * z; + gb += value * db; + } + } + } + // rho = occ sum_q a_q exp(b_q r^2): d rho / d(centre) = occ 2 (sum a_q b_q e_q) (centre - point), and + // with b_q = -4 pi^2 / (B_q + B + blur), d rho / dB = occ sum a_q e_q b_q (1.5 + b_q r^2) / (4 pi^2). + grad[i] = {2.0 * atom.occ * gx, 2.0 * atom.occ * gy, 2.0 * atom.occ * gz, atom.occ * gb / FOUR_PI2}; + } + }); +} diff --git a/image_analysis/structure_refinement/RefinementXray.h b/image_analysis/structure_refinement/RefinementXray.h new file mode 100644 index 000000000..d7062afbf --- /dev/null +++ b/image_analysis/structure_refinement/RefinementXray.h @@ -0,0 +1,184 @@ +// SPDX-FileCopyrightText: 2026 Filip Leonarski, Paul Scherrer Institute +// SPDX-License-Identifier: GPL-3.0-only + +#pragma once + +#include +#include +#include +#include +#include +#include +#include + +#include "gemmi/grid.hpp" +#include "gemmi/model.hpp" +#include "gemmi/symmetry.hpp" +#include "gemmi/unitcell.hpp" + +#include "../../common/Reflection.h" // MergedReflection +#include "RefinementRestraints.h" // RestraintSet +#include "RigidBodyRefine.h" // SymmetryComposition + +class Logger; + +// The X-ray side of restrained refinement (Refinement.h): the observed amplitudes, the model's structure +// factors and the maximum-likelihood target that compares them, with its gradient with respect to every +// atom's position and B. + +// The reflections a refinement fits and scores: the observed amplitudes, in the group's reciprocal ASU, that +// the refinement grid composes (SymmetryComposition) - every observed one in practice. +struct RefinementReflections { + std::vector hkl; + std::vector fo, sigma; + std::vector free, centric; + std::vector epsilon; + std::vector inv_d2; + size_t Size() const { return hkl.size(); } +}; + +// The French-Wilson amplitudes of `merged` (NaN dropped) into the ASU of `sg`, those the grid of +// RigidBodyZoneGrid(cell, sg, d_min) composes. +RefinementReflections PrepareRefinementReflections(const std::vector &merged, + const gemmi::UnitCell &cell, const gemmi::SpaceGroup &sg, + double d_min); + +// What turns the atoms' structure factors F into the model the target compares with the data, per reflection: +// F_model = k_total (F + fmask), +// with k_total the overall scale and anisotropic B and fmask the bulk solvent already scaled by k_sol +// exp(-b_sol s^2/4); and the two parameters of the likelihood, D and the variance. Fixed for one macro-cycle. +struct XrayRowModel { + std::vector k_total; + std::vector> fmask; + std::vector d, var; + // D per likelihood bin, where EstimateLikelihoodParameters() found it - the next fit's start (empty: none) + std::vector bin_d; +}; + +// The flat bulk-solvent model's mask (SolventMasker with the Refmac radii, PutMaskOnGrid) and its structure factors +// at the reflections, on a grid of its own rather than the atoms' density grid: the mask's edge is set by the +// probe and shrink radii (1.0 and 0.8 A), which a grid at d_min / 3 cannot resolve at low resolution - at 3 A +// its 1 A step leaves no grid point within the shrink radius and the shrink is skipped. The step is therefore +// d_min / 3 or MASK_SPACING_MAX, whichever is finer - where the mask grid stays within MASK_POINTS_MAX points; a +// cell too large for that gets the spacing that fills it. The R-factors of low-resolution models settle at a +// step of 0.4 A (within 0.001 of 0.3 A) and move by up to 0.005 between 0.4 and 0.8 A. +// The flat solvent model of Fokine & Urzhumtsev (2002) Acta Cryst. D58, 1387-1392 +// The probe-and-shrink mask of Jiang & Brunger (1994) J. Mol. Biol. 243, 100-115 +class BulkSolventMask { +public: + static constexpr double MASK_SPACING_MAX = 0.4; // A + static constexpr double MASK_POINTS_MAX = 1 << 26; + BulkSolventMask(const gemmi::UnitCell &cell, const gemmi::SpaceGroup &sg, double d_min, size_t nthreads); + // The mask's grid (sizes and spacing set, values not allocated) - also the GPU engine's (RefinementGPU.cpp). + static gemmi::Grid MaskGrid(const gemmi::UnitCell &cell, const gemmi::SpaceGroup &sg, double d_min); + // Fmask (unscaled) of `model` at `hkl`. + void Fmask(const gemmi::Model &model, const std::vector &hkl, + std::vector> &f) const; + double Spacing() const { return spacing_; } + +private: + gemmi::Grid grid_; + mutable std::vector orbit_leaders_; // made at the first Fmask() + size_t nthreads_; + double spacing_; +}; + +// The ML parameters per reflection, in resolution bins of the free set interpolated between the bins' centres: +// beta fitted by maximum likelihood to the free reflections as the whole spread of Fo about D Fc, D then fitted to +// the working reflections with the variance epsilon beta + 2 sigma^2 (acentric; + sigma^2 centric), which is also +// the variance of a reflection in the target. `fmodel` is k_total (F + fmask), without D. +// Following Lunin & Skovoroda (1995) Acta Cryst. A51, 880-887, and Murshudov et al. (2011) Acta Cryst. D67, 355-367 +void EstimateLikelihoodParameters(const RefinementReflections &refl, const std::vector> &fmodel, + XrayRowModel &rows, size_t nthreads = 1); + +// R-work and R-free of k_total (F + fmask) against the observations. +struct RFactors { + double r_work = 1, r_free = 1; + int n_work = 0, n_free = 0; +}; +RFactors ComputeRFactors(const RefinementReflections &refl, const std::vector> &fmodel); + +// x, y, z and B of every atom of `model`, in model order. +std::vector> ModelXyzB(const gemmi::Model &model); + +// What evaluates the targets for a set of atom positions and B: the CPU below, or a GPU (RefinementGPU.h). The +// atoms are the model's, all of them, in model order; the grid and the reflections are fixed when the engine is +// made, the row model each macro-cycle, the blur where SetBlur is called. +class RefinementEngine { +public: + virtual ~RefinementEngine() = default; + // The blur the atoms are gridded with (DensityCalculator's), and the matching unblur of their transform. + // Every atom's B must stay above what the blur was chosen for (RefinementBlur) while it is in use. + virtual void SetBlur(double blur) = 0; + virtual void SetRowModel(const XrayRowModel &rows) = 0; + // F of the atoms at the reflections. + virtual void Fcalc(const gemmi::Model &model, std::vector> &f) = 0; + // The bulk-solvent mask's structure factors at the reflections (unscaled). + virtual void Fmask(const gemmi::Model &model, std::vector> &f) = 0; + // The sum of -ln L over the working reflections and, with `grad`, its derivatives with respect to every + // atom's x, y, z (Cartesian, A) and B (A^2), in model order. + virtual double Evaluate(const gemmi::Model &model, std::vector> *grad) = 0; + virtual bool OnGPU() const = 0; + + // Restraint set `which` (0: the geometry and the repulsions, 1: the B similarity) and its sum of E at xyzb + // (x, y, z, B per atom) with, given `grad`, dE/d(x, y, z, B) per atom. On the CPU unless the engine has its own. + virtual void SetRestraints(int which, const RestraintSet &set) { restraints_[which] = set; } + virtual double EvaluateRestraints(int which, const std::vector> &xyzb, + std::vector> *grad) { + if (grad != nullptr) + grad->assign(xyzb.size(), {0, 0, 0, 0}); + return ::EvaluateRestraints(restraints_[which], xyzb, grad); + } + // Evaluate() and EvaluateRestraints(which) at the atoms of `model` as they are, in one go: returns the X-ray + // target, and the restraints' sum in `restraints`. + virtual double EvaluateWithRestraints(const gemmi::Model &model, int which, std::vector> *grad, + std::vector> *restraint_grad, double &restraints) { + const double xray = Evaluate(model, grad); + restraints = EvaluateRestraints(which, ModelXyzB(model), restraint_grad); + return xray; + } + +private: + RestraintSet restraints_[2]; +}; + +// The time a refinement spends in one stage, summed over every call (and over threads) until Log(): the scope of +// an instance is one call, and an NVTX range of the stage's name. +class RefinementStage { +public: + explicit RefinementStage(const char *name); + ~RefinementStage(); + RefinementStage(const RefinementStage &) = delete; + RefinementStage &operator=(const RefinementStage &) = delete; + // "TIMING refine. " per stage at debug level, then the sums start again. + static void Log(Logger &logger); + +private: + const char *name_; + std::chrono::steady_clock::time_point start_; + uint64_t nvtx_; +}; + +// The density an atom is gridded out to, in e/A^3 of its blurred density (DensityCalculator::cutoff, 1e-5 by +// default): the radius of every atom, and with it the gather and the gradient, follow from it. +constexpr float REFINEMENT_DENSITY_CUTOFF = 1e-4f; + +// The blur for a model whose smallest B may go as low as b_floor: DensityCalculator's +// set_refmac_compatible_blur() for that B, on the refinement grid of d_min. +double RefinementBlur(const gemmi::UnitCell &cell, const gemmi::SpaceGroup &sg, double d_min, double b_floor); + +// The CPU engine: the density of one copy of the atoms on the grid of RigidBodyZoneGrid(cell, sg, d_min) +// (PutModelDensityOnGrid), its transform and the crystal's symmetry composed in reciprocal space +// (SymmetryComposition). The gradient by the FFT method: the derivative of the target with respect to each +// structure factor, taken back to real space by one inverse transform, is a map; each atom's derivatives are +// that map summed against the derivatives of its own density. +// Following Agarwal (1978) Acta Cryst. A34, 791-809 +std::unique_ptr MakeRefinementEngineCPU(const gemmi::UnitCell &cell, + const gemmi::SpaceGroup &sg, double d_min, + const RefinementReflections &refl, size_t nthreads); + +// The derivative map of the X-ray target on a grid (the FFT method's map), summed against each atom's density +// derivatives: dT/d(x, y, z, B) per atom. `map` is u fastest on the grid of RigidBodyZoneGrid(), the atoms +// gridded with `blur`. Exposed for the tests. +void AtomGradientsFromMap(const gemmi::Grid &map, const gemmi::Model &model, double blur, size_t nthreads, + std::vector> &grad); diff --git a/image_analysis/structure_refinement/monomers/1MA.cif b/image_analysis/structure_refinement/monomers/1MA.cif new file mode 100644 index 000000000..256d8c361 --- /dev/null +++ b/image_analysis/structure_refinement/monomers/1MA.cif @@ -0,0 +1,288 @@ +# +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +1MA 1MA "6-HYDRO-1-METHYLADENOSINE-5'-MONOPHOSPHATE" RNA 38 24 . +# +data_comp_1MA +# +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +1MA P P P 0 46.199 22.985 33.948 +1MA OP1 O O 0 45.612 23.494 35.251 +1MA OP2 O OP -1 45.300 23.247 32.755 +1MA OP3 O OP -1 47.626 23.448 33.724 +1MA "O5'" O O2 0 46.275 21.379 34.098 +1MA "C5'" C CH2 0 46.795 20.601 32.990 +1MA "C4'" C CH1 0 46.838 19.142 33.374 +1MA "O4'" O O2 0 47.700 18.984 34.533 +1MA "C3'" C CH1 0 45.487 18.504 33.742 +1MA "O3'" O OH1 0 45.334 17.241 33.106 +1MA "C2'" C CH1 0 45.552 18.382 35.269 +1MA "O2'" O OH1 0 44.831 17.281 35.781 +1MA "C1'" C CH1 0 47.059 18.182 35.494 +1MA N9 N NR5 0 47.526 18.600 36.823 +1MA C8 C CR15 0 47.503 19.881 37.308 +1MA N7 N NRD5 0 47.981 19.974 38.529 +1MA C5 C CR56 0 48.339 18.679 38.866 +1MA C6 C CR6 0 48.912 18.172 40.064 +1MA N6 N NH1 0 49.200 18.794 41.137 +1MA N1 N NR6 0 49.184 16.766 39.984 +1MA CM1 C CH3 0 49.814 16.095 41.139 +1MA C2 C CR16 0 48.871 16.031 38.868 +1MA N3 N NRD6 0 48.283 16.491 37.799 +1MA C4 C CR56 0 48.059 17.831 37.814 +1MA "H5'" H H 0 47.706 20.911 32.761 +1MA "H5''" H H 0 46.216 20.718 32.197 +1MA "H4'" H H 0 47.231 18.646 32.624 +1MA "H3'" H H 0 44.746 19.109 33.479 +1MA "HO3'" H H 0 44.509 17.042 33.090 +1MA "H2'" H H 0 45.240 19.223 35.696 +1MA "HO2'" H H 0 44.907 17.268 36.626 +1MA "H1'" H H 0 47.295 17.228 35.362 +1MA H8 H H 0 47.164 20.641 36.793 +1MA HN61 H H 0 50.024 19.033 41.188 +1MA HM11 H H 0 49.949 15.154 40.947 +1MA HM12 H H 0 49.240 16.184 41.916 +1MA HM13 H H 0 50.672 16.510 41.324 +1MA H2 H H 0 49.096 15.129 38.869 +loop_ +_chem_comp_bond.comp_id +_chem_comp_bond.atom_id_1 +_chem_comp_bond.atom_id_2 +_chem_comp_bond.type +_chem_comp_bond.aromatic +_chem_comp_bond.value_dist_nucleus +_chem_comp_bond.value_dist_nucleus_esd +_chem_comp_bond.value_dist +_chem_comp_bond.value_dist_esd +1MA P OP1 DOUBLE n 1.517 0.0192 1.517 0.0192 +1MA P OP2 SINGLE n 1.517 0.0192 1.517 0.0192 +1MA P OP3 SINGLE n 1.517 0.0192 1.517 0.0192 +1MA P "O5'" SINGLE n 1.614 0.0178 1.614 0.0178 +1MA "O5'" "C5'" SINGLE n 1.450 0.0166 1.450 0.0166 +1MA "C5'" "C4'" SINGLE n 1.509 0.0100 1.509 0.0100 +1MA "C4'" "O4'" SINGLE n 1.451 0.0100 1.451 0.0100 +1MA "C4'" "C3'" SINGLE n 1.535 0.0100 1.535 0.0100 +1MA "O4'" "C1'" SINGLE n 1.408 0.0100 1.408 0.0100 +1MA "C3'" "O3'" SINGLE n 1.422 0.0100 1.422 0.0100 +1MA "C3'" "C2'" SINGLE n 1.531 0.0100 1.531 0.0100 +1MA "C2'" "O2'" SINGLE n 1.411 0.0100 1.411 0.0100 +1MA "C2'" "C1'" SINGLE n 1.539 0.0100 1.539 0.0100 +1MA "C1'" N9 SINGLE n 1.468 0.0100 1.468 0.0100 +1MA N9 C8 SINGLE y 1.369 0.0100 1.369 0.0100 +1MA N9 C4 SINGLE y 1.364 0.0100 1.364 0.0100 +1MA C8 N7 DOUBLE y 1.313 0.0100 1.313 0.0100 +1MA N7 C5 SINGLE y 1.384 0.0100 1.384 0.0100 +1MA C5 C6 SINGLE n 1.410 0.0200 1.410 0.0200 +1MA C5 C4 DOUBLE y 1.379 0.0109 1.379 0.0109 +1MA C6 N6 DOUBLE n 1.272 0.0100 1.272 0.0100 +1MA C6 N1 SINGLE n 1.406 0.0200 1.406 0.0200 +1MA N1 CM1 SINGLE n 1.471 0.0118 1.471 0.0118 +1MA N1 C2 SINGLE n 1.366 0.0100 1.366 0.0100 +1MA C2 N3 DOUBLE n 1.299 0.0100 1.299 0.0100 +1MA N3 C4 SINGLE n 1.355 0.0100 1.355 0.0100 +1MA "C5'" "H5'" SINGLE n 1.089 0.0100 0.989 0.0200 +1MA "C5'" "H5''" SINGLE n 1.089 0.0100 0.989 0.0200 +1MA "C4'" "H4'" SINGLE n 1.089 0.0100 0.981 0.0200 +1MA "C3'" "H3'" SINGLE n 1.089 0.0100 0.992 0.0200 +1MA "O3'" "HO3'" SINGLE n 0.970 0.0120 0.849 0.0200 +1MA "C2'" "H2'" SINGLE n 1.089 0.0100 0.994 0.0200 +1MA "O2'" "HO2'" SINGLE n 0.970 0.0120 0.849 0.0200 +1MA "C1'" "H1'" SINGLE n 1.089 0.0100 0.992 0.0200 +1MA C8 H8 SINGLE n 1.082 0.0130 0.979 0.0200 +1MA N6 HN61 SINGLE n 1.016 0.0100 0.860 0.0100 +1MA CM1 HM11 SINGLE n 1.089 0.0100 0.970 0.0158 +1MA CM1 HM12 SINGLE n 1.089 0.0100 0.970 0.0158 +1MA CM1 HM13 SINGLE n 1.089 0.0100 0.970 0.0158 +1MA C2 H2 SINGLE n 1.082 0.0130 0.930 0.0100 +loop_ +_chem_comp_angle.comp_id +_chem_comp_angle.atom_id_1 +_chem_comp_angle.atom_id_2 +_chem_comp_angle.atom_id_3 +_chem_comp_angle.value_angle +_chem_comp_angle.value_angle_esd +1MA OP1 P OP2 112.864 1.69 +1MA OP1 P OP3 112.864 1.69 +1MA OP1 P "O5'" 105.808 2.07 +1MA OP2 P OP3 112.864 1.69 +1MA OP2 P "O5'" 105.808 2.07 +1MA OP3 P "O5'" 105.808 2.07 +1MA P "O5'" "C5'" 118.783 1.50 +1MA "O5'" "C5'" "C4'" 109.342 1.50 +1MA "O5'" "C5'" "H5'" 109.845 1.50 +1MA "O5'" "C5'" "H5''" 109.845 1.50 +1MA "C4'" "C5'" "H5'" 109.624 1.50 +1MA "C4'" "C5'" "H5''" 109.624 1.50 +1MA "H5'" "C5'" "H5''" 108.472 1.50 +1MA "C5'" "C4'" "O4'" 109.123 1.50 +1MA "C5'" "C4'" "C3'" 116.008 1.52 +1MA "C5'" "C4'" "H4'" 108.268 1.50 +1MA "O4'" "C4'" "C3'" 105.388 1.50 +1MA "O4'" "C4'" "H4'" 108.947 1.50 +1MA "C3'" "C4'" "H4'" 109.363 1.86 +1MA "C4'" "O4'" "C1'" 109.426 1.50 +1MA "C4'" "C3'" "O3'" 111.281 2.46 +1MA "C4'" "C3'" "C2'" 102.602 1.50 +1MA "C4'" "C3'" "H3'" 110.452 2.54 +1MA "O3'" "C3'" "C2'" 111.581 2.83 +1MA "O3'" "C3'" "H3'" 110.380 1.67 +1MA "C2'" "C3'" "H3'" 110.504 1.75 +1MA "C3'" "O3'" "HO3'" 108.744 3.00 +1MA "C3'" "C2'" "O2'" 112.782 2.45 +1MA "C3'" "C2'" "C1'" 101.779 1.50 +1MA "C3'" "C2'" "H2'" 110.596 1.51 +1MA "O2'" "C2'" "C1'" 110.620 3.00 +1MA "O2'" "C2'" "H2'" 110.448 1.97 +1MA "C1'" "C2'" "H2'" 110.803 1.50 +1MA "C2'" "O2'" "HO2'" 109.103 2.13 +1MA "O4'" "C1'" "C2'" 106.588 1.50 +1MA "O4'" "C1'" N9 107.830 1.50 +1MA "O4'" "C1'" "H1'" 110.469 1.59 +1MA "C2'" "C1'" N9 113.810 1.50 +1MA "C2'" "C1'" "H1'" 109.847 1.50 +1MA N9 "C1'" "H1'" 108.233 1.86 +1MA "C1'" N9 C8 125.615 2.25 +1MA "C1'" N9 C4 127.393 3.00 +1MA C8 N9 C4 106.992 1.50 +1MA N9 C8 N7 112.621 1.50 +1MA N9 C8 H8 123.218 1.50 +1MA N7 C8 H8 124.162 1.50 +1MA C8 N7 C5 103.718 1.50 +1MA N7 C5 C6 129.894 1.50 +1MA N7 C5 C4 109.368 1.50 +1MA C6 C5 C4 120.738 1.50 +1MA C5 C6 N6 129.510 1.50 +1MA C5 C6 N1 112.223 1.50 +1MA N6 C6 N1 118.267 1.50 +1MA C6 N6 HN61 113.739 3.00 +1MA C6 N1 CM1 118.703 1.50 +1MA C6 N1 C2 122.333 1.50 +1MA CM1 N1 C2 118.965 1.66 +1MA N1 CM1 HM11 109.481 1.50 +1MA N1 CM1 HM12 109.481 1.50 +1MA N1 CM1 HM13 109.481 1.50 +1MA HM11 CM1 HM12 109.428 1.50 +1MA HM11 CM1 HM13 109.428 1.50 +1MA HM12 CM1 HM13 109.428 1.50 +1MA N1 C2 N3 125.328 1.50 +1MA N1 C2 H2 117.343 1.50 +1MA N3 C2 H2 117.329 1.50 +1MA C2 N3 C4 113.724 1.50 +1MA N9 C4 C5 107.302 1.96 +1MA N9 C4 N3 127.043 1.50 +1MA C5 C4 N3 125.654 1.50 +loop_ +_chem_comp_tor.comp_id +_chem_comp_tor.id +_chem_comp_tor.atom_id_1 +_chem_comp_tor.atom_id_2 +_chem_comp_tor.atom_id_3 +_chem_comp_tor.atom_id_4 +_chem_comp_tor.value_angle +_chem_comp_tor.value_angle_esd +_chem_comp_tor.period +1MA C2e-chi "O4'" "C1'" N9 C4 210.000 10.000 6 +1MA C2e-nyu0 "C4'" "O4'" "C1'" "C2'" 340.700 6.300 1 +1MA C2e-nyu1 "O4'" "C1'" "C2'" "C3'" 32.800 4.900 1 +1MA C2e-nyu2 "C1'" "C2'" "C3'" "C4'" 326.9 3.600 1 +1MA C2e-nyu3 "C2'" "C3'" "C4'" "O4'" 22.600 4.500 1 +1MA C2e-nyu4 "C3'" "C4'" "O4'" "C1'" 357.700 6.100 1 +1MA C3e-chi "O4'" "C1'" N9 C4 210.000 10.000 6 +1MA C3e-nyu0 "C4'" "O4'" "C1'" "C2'" 2.8 6.100 1 +1MA C3e-nyu1 "O4'" "C1'" "C2'" "C3'" 335.00 4.900 1 +1MA C3e-nyu2 "C1'" "C2'" "C3'" "C4'" 35.9 2.800 1 +1MA C3e-nyu3 "C2'" "C3'" "C4'" "O4'" 324.700 3.100 1 +1MA C3e-nyu4 "C3'" "C4'" "O4'" "C1'" 20.500 5.100 1 +1MA alpha "C5'" "O5'" P OP3 -60.000 10.00 3 +1MA beta P "O5'" "C5'" "C4'" 180.000 10.00 3 +1MA epsi "C4'" "C3'" "O3'" "HO3'" 180.000 10.00 3 +1MA gamma "O5'" "C5'" "C4'" "C3'" 180.000 10.00 3 +1MA sp3_sp3_52 "C3'" "C2'" "O2'" "HO2'" 180.000 10.00 3 +1MA const_sp2_sp2_2 N7 C8 N9 "C1'" 180.000 5.0 2 +1MA const_14 C5 C4 N9 "C1'" 180.000 10.0 2 +1MA const_sp2_sp2_5 N9 C8 N7 C5 0.000 5.0 2 +1MA const_sp2_sp2_8 C6 C5 N7 C8 180.000 5.0 2 +1MA sp2_sp2_4 N7 C5 C6 N6 0.000 5.0 2 +1MA const_sp2_sp2_9 N9 C4 C5 N7 0.000 5.0 2 +1MA sp2_sp2_17 C5 C6 N6 HN61 180.000 5.0 2 +1MA sp2_sp2_8 N6 C6 N1 CM1 0.000 5.0 2 +1MA sp2_sp3_7 C6 N1 CM1 HM11 150.000 10.0 6 +1MA sp2_sp2_10 N3 C2 N1 CM1 180.000 5.0 2 +1MA sp2_sp2_13 N1 C2 N3 C4 0.000 5.0 2 +1MA sp2_sp2_16 N9 C4 N3 C2 180.000 5.0 2 +loop_ +_chem_comp_chir.comp_id +_chem_comp_chir.id +_chem_comp_chir.atom_id_centre +_chem_comp_chir.atom_id_1 +_chem_comp_chir.atom_id_2 +_chem_comp_chir.atom_id_3 +_chem_comp_chir.volume_sign +1MA chir_1 P "O5'" OP2 OP3 both +1MA chir_2 "C4'" "O4'" "C3'" "C5'" negative +1MA chir_3 "C3'" "O3'" "C4'" "C2'" positive +1MA chir_4 "C2'" "O2'" "C1'" "C3'" negative +1MA chir_5 "C1'" "O4'" N9 "C2'" negative +loop_ +_chem_comp_plane_atom.comp_id +_chem_comp_plane_atom.plane_id +_chem_comp_plane_atom.atom_id +_chem_comp_plane_atom.dist_esd +1MA plan-1 "C1'" 0.020 +1MA plan-1 C4 0.020 +1MA plan-1 C5 0.020 +1MA plan-1 C6 0.020 +1MA plan-1 C8 0.020 +1MA plan-1 H8 0.020 +1MA plan-1 N3 0.020 +1MA plan-1 N7 0.020 +1MA plan-1 N9 0.020 +1MA plan-2 C5 0.020 +1MA plan-2 C6 0.020 +1MA plan-2 N1 0.020 +1MA plan-2 N6 0.020 +1MA plan-3 C2 0.020 +1MA plan-3 C6 0.020 +1MA plan-3 CM1 0.020 +1MA plan-3 N1 0.020 +1MA plan-4 C2 0.020 +1MA plan-4 H2 0.020 +1MA plan-4 N1 0.020 +1MA plan-4 N3 0.020 +loop_ +_pdbx_chem_comp_descriptor.comp_id +_pdbx_chem_comp_descriptor.type +_pdbx_chem_comp_descriptor.program +_pdbx_chem_comp_descriptor.program_version +_pdbx_chem_comp_descriptor.descriptor +1MA SMILES ACDLabs 12.01 P(=O)(O)(O)OCC1OC(C(C1O)O)n2cnc3\C(=N)N(C)C=Nc23 +1MA InChI InChI 1.03 InChI=1S/C11H16N5O7P/c1-15-3-14-10-6(9(15)12)13-4-16(10)11-8(18)7(17)5(23-11)2-22-24(19,20)21/h3-5,7-8,11-12,17-18H,2H2,1H3,(H2,19,20,21)/b12-9-/t5-,7-,8-,11-/m1/s1 +1MA InChIKey InChI 1.03 BKBYKEWNXKDACS-JOLDIKRXSA-N +1MA SMILES_CANONICAL CACTVS 3.385 CN1C=Nc2n(cnc2C1=N)[C@@H]3O[C@H](CO[P](O)(O)=O)[C@@H](O)[C@H]3O +1MA SMILES CACTVS 3.385 CN1C=Nc2n(cnc2C1=N)[CH]3O[CH](CO[P](O)(O)=O)[CH](O)[CH]3O +1MA SMILES_CANONICAL "OpenEye OEToolkits" 1.7.6 "[H]/N=C\1/c2c(n(cn2)[C@H]3[C@@H]([C@@H]([C@H](O3)COP(=O)(O)O)O)O)N=CN1C" +1MA SMILES "OpenEye OEToolkits" 1.7.6 CN1C=Nc2c(ncn2C3C(C(C(O3)COP(=O)(O)O)O)O)C1=N +loop_ +_pdbx_chem_comp_description_generator.comp_id +_pdbx_chem_comp_description_generator.program_name +_pdbx_chem_comp_description_generator.program_version +_pdbx_chem_comp_description_generator.descriptor +1MA acedrg 243 "dictionary generator" +1MA acedrg_database 11 "data source" +1MA rdkit 2017.03.2 "Chemoinformatics tool" +1MA refmac5 5.8.0238 "optimization tool" diff --git a/image_analysis/structure_refinement/monomers/1PE.cif b/image_analysis/structure_refinement/monomers/1PE.cif new file mode 100644 index 000000000..426368f17 --- /dev/null +++ b/image_analysis/structure_refinement/monomers/1PE.cif @@ -0,0 +1,228 @@ +# +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +1PE 1PE "PENTAETHYLENE GLYCOL" NON-POLYMER 38 16 . +# +data_comp_1PE +# +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +1PE OH2 O OH1 0 21.840 38.426 32.717 +1PE C12 C CH2 0 21.457 39.572 31.984 +1PE C22 C CH2 0 22.615 40.477 31.702 +1PE OH3 O O2 0 22.207 41.540 30.844 +1PE C13 C CH2 0 21.271 43.721 30.536 +1PE C23 C CH2 0 21.666 42.667 31.529 +1PE OH4 O O2 0 22.390 44.073 29.724 +1PE C14 C CH2 0 24.698 44.588 30.044 +1PE C24 C CH2 0 23.288 45.017 30.307 +1PE OH5 O O2 0 24.933 43.322 30.652 +1PE C15 C CH2 0 26.417 41.501 31.086 +1PE C25 C CH2 0 26.288 42.896 30.557 +1PE OH6 O O2 0 26.057 41.474 32.464 +1PE C16 C CH2 0 25.748 40.226 34.478 +1PE C26 C CH2 0 26.168 40.178 33.042 +1PE OH7 O OH1 0 26.621 41.011 35.266 +1PE HO2 H H 0 21.179 37.901 32.781 +1PE H121 H H 0 20.778 40.064 32.492 +1PE H122 H H 0 21.055 39.289 31.136 +1PE H221 H H 0 23.332 39.966 31.269 +1PE H222 H H 0 22.967 40.837 32.546 +1PE H131 H H 0 20.932 44.514 31.009 +1PE H132 H H 0 20.549 43.378 29.966 +1PE H231 H H 0 22.333 43.031 32.150 +1PE H232 H H 0 20.880 42.393 32.049 +1PE H141 H H 0 25.320 45.254 30.410 +1PE H142 H H 0 24.850 44.524 29.076 +1PE H241 H H 0 23.142 45.083 31.276 +1PE H242 H H 0 23.134 45.903 29.913 +1PE H151 H H 0 27.342 41.191 30.979 +1PE H152 H H 0 25.829 40.900 30.579 +1PE H251 H H 0 26.862 43.501 31.075 +1PE H252 H H 0 26.581 42.922 29.619 +1PE H161 H H 0 25.725 39.315 34.837 +1PE H162 H H 0 24.843 40.599 34.536 +1PE H261 H H 0 27.097 39.867 32.979 +1PE H262 H H 0 25.598 39.547 32.551 +1PE HO7 H H 0 26.588 41.816 35.006 +loop_ +_chem_comp_bond.comp_id +_chem_comp_bond.atom_id_1 +_chem_comp_bond.atom_id_2 +_chem_comp_bond.type +_chem_comp_bond.aromatic +_chem_comp_bond.value_dist_nucleus +_chem_comp_bond.value_dist_nucleus_esd +_chem_comp_bond.value_dist +_chem_comp_bond.value_dist_esd +1PE OH2 C12 SINGLE n 1.414 0.0200 1.414 0.0200 +1PE C12 C22 SINGLE n 1.496 0.0200 1.496 0.0200 +1PE C22 OH3 SINGLE n 1.423 0.0106 1.423 0.0106 +1PE OH3 C23 SINGLE n 1.423 0.0106 1.423 0.0106 +1PE C13 C23 SINGLE n 1.496 0.0200 1.496 0.0200 +1PE C13 OH4 SINGLE n 1.423 0.0106 1.423 0.0106 +1PE OH4 C24 SINGLE n 1.423 0.0106 1.423 0.0106 +1PE C14 C24 SINGLE n 1.496 0.0200 1.496 0.0200 +1PE C14 OH5 SINGLE n 1.423 0.0106 1.423 0.0106 +1PE OH5 C25 SINGLE n 1.423 0.0106 1.423 0.0106 +1PE C15 C25 SINGLE n 1.496 0.0200 1.496 0.0200 +1PE C15 OH6 SINGLE n 1.423 0.0106 1.423 0.0106 +1PE OH6 C26 SINGLE n 1.423 0.0106 1.423 0.0106 +1PE C16 C26 SINGLE n 1.496 0.0200 1.496 0.0200 +1PE C16 OH7 SINGLE n 1.414 0.0200 1.414 0.0200 +1PE OH2 HO2 SINGLE n 0.970 0.0120 0.846 0.0200 +1PE C12 H121 SINGLE n 1.089 0.0100 0.980 0.0144 +1PE C12 H122 SINGLE n 1.089 0.0100 0.980 0.0144 +1PE C22 H221 SINGLE n 1.089 0.0100 0.982 0.0175 +1PE C22 H222 SINGLE n 1.089 0.0100 0.982 0.0175 +1PE C13 H131 SINGLE n 1.089 0.0100 0.982 0.0175 +1PE C13 H132 SINGLE n 1.089 0.0100 0.982 0.0175 +1PE C23 H231 SINGLE n 1.089 0.0100 0.982 0.0175 +1PE C23 H232 SINGLE n 1.089 0.0100 0.982 0.0175 +1PE C14 H141 SINGLE n 1.089 0.0100 0.982 0.0175 +1PE C14 H142 SINGLE n 1.089 0.0100 0.982 0.0175 +1PE C24 H241 SINGLE n 1.089 0.0100 0.982 0.0175 +1PE C24 H242 SINGLE n 1.089 0.0100 0.982 0.0175 +1PE C15 H151 SINGLE n 1.089 0.0100 0.982 0.0175 +1PE C15 H152 SINGLE n 1.089 0.0100 0.982 0.0175 +1PE C25 H251 SINGLE n 1.089 0.0100 0.982 0.0175 +1PE C25 H252 SINGLE n 1.089 0.0100 0.982 0.0175 +1PE C16 H161 SINGLE n 1.089 0.0100 0.980 0.0144 +1PE C16 H162 SINGLE n 1.089 0.0100 0.980 0.0144 +1PE C26 H261 SINGLE n 1.089 0.0100 0.982 0.0175 +1PE C26 H262 SINGLE n 1.089 0.0100 0.982 0.0175 +1PE OH7 HO7 SINGLE n 0.970 0.0120 0.846 0.0200 +loop_ +_chem_comp_angle.comp_id +_chem_comp_angle.atom_id_1 +_chem_comp_angle.atom_id_2 +_chem_comp_angle.atom_id_3 +_chem_comp_angle.value_angle +_chem_comp_angle.value_angle_esd +1PE C12 OH2 HO2 109.347 1.86 +1PE OH2 C12 C22 112.284 1.56 +1PE OH2 C12 H121 109.012 1.50 +1PE OH2 C12 H122 109.012 1.50 +1PE C22 C12 H121 109.198 1.50 +1PE C22 C12 H122 109.198 1.50 +1PE H121 C12 H122 108.093 1.50 +1PE C12 C22 OH3 109.904 1.68 +1PE C12 C22 H221 109.795 1.50 +1PE C12 C22 H222 109.795 1.50 +1PE OH3 C22 H221 109.691 1.50 +1PE OH3 C22 H222 109.691 1.50 +1PE H221 C22 H222 108.274 1.50 +1PE C22 OH3 C23 112.795 1.50 +1PE C23 C13 OH4 109.613 1.74 +1PE C23 C13 H131 109.729 1.50 +1PE C23 C13 H132 109.729 1.50 +1PE OH4 C13 H131 109.691 1.50 +1PE OH4 C13 H132 109.691 1.50 +1PE H131 C13 H132 108.274 1.50 +1PE OH3 C23 C13 109.613 1.74 +1PE OH3 C23 H231 109.691 1.50 +1PE OH3 C23 H232 109.691 1.50 +1PE C13 C23 H231 109.729 1.50 +1PE C13 C23 H232 109.729 1.50 +1PE H231 C23 H232 108.274 1.50 +1PE C13 OH4 C24 112.795 1.50 +1PE C24 C14 OH5 109.613 1.74 +1PE C24 C14 H141 109.729 1.50 +1PE C24 C14 H142 109.729 1.50 +1PE OH5 C14 H141 109.691 1.50 +1PE OH5 C14 H142 109.691 1.50 +1PE H141 C14 H142 108.274 1.50 +1PE OH4 C24 C14 109.613 1.74 +1PE OH4 C24 H241 109.691 1.50 +1PE OH4 C24 H242 109.691 1.50 +1PE C14 C24 H241 109.729 1.50 +1PE C14 C24 H242 109.729 1.50 +1PE H241 C24 H242 108.274 1.50 +1PE C14 OH5 C25 112.795 1.50 +1PE C25 C15 OH6 109.613 1.74 +1PE C25 C15 H151 109.729 1.50 +1PE C25 C15 H152 109.729 1.50 +1PE OH6 C15 H151 109.691 1.50 +1PE OH6 C15 H152 109.691 1.50 +1PE H151 C15 H152 108.274 1.50 +1PE OH5 C25 C15 109.613 1.74 +1PE OH5 C25 H251 109.691 1.50 +1PE OH5 C25 H252 109.691 1.50 +1PE C15 C25 H251 109.729 1.50 +1PE C15 C25 H252 109.729 1.50 +1PE H251 C25 H252 108.274 1.50 +1PE C15 OH6 C26 112.795 1.50 +1PE C26 C16 OH7 112.284 1.56 +1PE C26 C16 H161 109.198 1.50 +1PE C26 C16 H162 109.198 1.50 +1PE OH7 C16 H161 109.012 1.50 +1PE OH7 C16 H162 109.012 1.50 +1PE H161 C16 H162 108.093 1.50 +1PE OH6 C26 C16 109.904 1.68 +1PE OH6 C26 H261 109.691 1.50 +1PE OH6 C26 H262 109.691 1.50 +1PE C16 C26 H261 109.795 1.50 +1PE C16 C26 H262 109.795 1.50 +1PE H261 C26 H262 108.274 1.50 +1PE C16 OH7 HO7 109.347 1.86 +loop_ +_chem_comp_tor.comp_id +_chem_comp_tor.id +_chem_comp_tor.atom_id_1 +_chem_comp_tor.atom_id_2 +_chem_comp_tor.atom_id_3 +_chem_comp_tor.atom_id_4 +_chem_comp_tor.value_angle +_chem_comp_tor.value_angle_esd +_chem_comp_tor.period +1PE sp3_sp3_1 C22 C12 OH2 HO2 180.000 10.0 3 +1PE sp3_sp3_49 OH6 C15 C25 OH5 180.000 10.0 3 +1PE sp3_sp3_58 C25 C15 OH6 C26 180.000 10.0 3 +1PE sp3_sp3_61 C16 C26 OH6 C15 180.000 10.0 3 +1PE sp3_sp3_64 OH7 C16 C26 OH6 180.000 10.0 3 +1PE sp3_sp3_73 C26 C16 OH7 HO7 180.000 10.0 3 +1PE sp3_sp3_4 OH2 C12 C22 OH3 180.000 10.0 3 +1PE sp3_sp3_13 C12 C22 OH3 C23 180.000 10.0 3 +1PE sp3_sp3_16 C13 C23 OH3 C22 180.000 10.0 3 +1PE sp3_sp3_19 OH4 C13 C23 OH3 180.000 10.0 3 +1PE sp3_sp3_28 C23 C13 OH4 C24 180.000 10.0 3 +1PE sp3_sp3_31 C14 C24 OH4 C13 180.000 10.0 3 +1PE sp3_sp3_34 OH5 C14 C24 OH4 180.000 10.0 3 +1PE sp3_sp3_43 C24 C14 OH5 C25 180.000 10.0 3 +1PE sp3_sp3_46 C15 C25 OH5 C14 180.000 10.0 3 +loop_ +_pdbx_chem_comp_descriptor.comp_id +_pdbx_chem_comp_descriptor.type +_pdbx_chem_comp_descriptor.program +_pdbx_chem_comp_descriptor.program_version +_pdbx_chem_comp_descriptor.descriptor +1PE SMILES ACDLabs 10.04 O(CCO)CCOCCOCCOCCO +1PE SMILES_CANONICAL CACTVS 3.341 OCCOCCOCCOCCOCCO +1PE SMILES CACTVS 3.341 OCCOCCOCCOCCOCCO +1PE SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 C(COCCOCCOCCOCCO)O +1PE SMILES "OpenEye OEToolkits" 1.5.0 C(COCCOCCOCCOCCO)O +1PE InChI InChI 1.03 InChI=1S/C10H22O6/c11-1-3-13-5-7-15-9-10-16-8-6-14-4-2-12/h11-12H,1-10H2 +1PE InChIKey InChI 1.03 JLFNLZLINWHATN-UHFFFAOYSA-N +loop_ +_pdbx_chem_comp_description_generator.comp_id +_pdbx_chem_comp_description_generator.program_name +_pdbx_chem_comp_description_generator.program_version +_pdbx_chem_comp_description_generator.descriptor +1PE acedrg 243 "dictionary generator" +1PE acedrg_database 11 "data source" +1PE rdkit 2017.03.2 "Chemoinformatics tool" +1PE refmac5 5.8.0238 "optimization tool" diff --git a/image_analysis/structure_refinement/monomers/2MG.cif b/image_analysis/structure_refinement/monomers/2MG.cif new file mode 100644 index 000000000..4603d5a4c --- /dev/null +++ b/image_analysis/structure_refinement/monomers/2MG.cif @@ -0,0 +1,294 @@ +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +2MG 2MG "2N-METHYLGUANOSINE-5'-MONOPHOSPHATE" RNA 39 25 . + +data_comp_2MG +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +2MG P P P 0 33.727 6.946 21.647 +2MG OP1 O O 0 33.329 6.945 23.111 +2MG OP2 O OP -1 32.927 7.934 20.820 +2MG OP3 O OP -1 35.224 7.082 21.443 +2MG "O5'" O O2 0 33.337 5.484 21.085 +2MG "C5'" C CH2 0 31.942 5.086 21.079 +2MG "C4'" C CH1 0 31.822 3.646 20.642 +2MG "O4'" O O2 0 32.464 3.473 19.354 +2MG "C3'" C CH1 0 32.490 2.602 21.543 +2MG "O3'" O OH1 0 31.638 2.231 22.620 +2MG "C2'" C CH1 0 32.737 1.450 20.564 +2MG "O2'" O OH1 0 31.625 0.591 20.413 +2MG "C1'" C CH1 0 33.058 2.195 19.266 +2MG N9 N NR5 0 34.492 2.337 19.018 +2MG C8 C CR15 0 35.255 3.479 19.051 +2MG N7 N NRD5 0 36.521 3.268 18.782 +2MG C5 C CR56 0 36.603 1.900 18.557 +2MG C6 C CR6 0 37.720 1.084 18.223 +2MG O6 O O 0 38.896 1.435 18.058 +2MG N1 N NR16 0 37.361 -0.264 18.084 +2MG C2 C CR6 0 36.088 -0.759 18.253 +2MG N2 N NH1 0 35.917 -2.084 18.070 +2MG CM2 C CH3 0 34.985 -2.901 18.830 +2MG N3 N NRD6 0 35.044 0.005 18.552 +2MG C4 C CR56 0 35.359 1.317 18.698 +2MG "H5'" H H 0 31.432 5.664 20.459 +2MG "H5''" H H 0 31.561 5.189 21.986 +2MG "H4'" H H 0 30.869 3.432 20.553 +2MG "H3'" H H 0 33.352 2.945 21.893 +2MG "HO3'" H H 0 32.005 1.601 23.055 +2MG "H2'" H H 0 33.522 0.917 20.859 +2MG "HO2'" H H 0 30.963 1.025 20.105 +2MG "H1'" H H 0 32.654 1.702 18.516 +2MG H8 H H 0 34.907 4.331 19.245 +2MG HN1 H H 0 38.016 -0.841 17.874 +2MG HN2 H H 0 36.394 -2.476 17.453 +2MG HM21 H H 0 34.406 -2.341 19.371 +2MG HM22 H H 0 35.480 -3.500 19.410 +2MG HM23 H H 0 34.443 -3.423 18.218 + +loop_ +_chem_comp_bond.comp_id +_chem_comp_bond.atom_id_1 +_chem_comp_bond.atom_id_2 +_chem_comp_bond.type +_chem_comp_bond.aromatic +_chem_comp_bond.value_dist_nucleus +_chem_comp_bond.value_dist_nucleus_esd +_chem_comp_bond.value_dist +_chem_comp_bond.value_dist_esd +2MG P OP1 DOUBLE n 1.517 0.0192 1.517 0.0192 +2MG P OP2 SINGLE n 1.517 0.0192 1.517 0.0192 +2MG P OP3 SINGLE n 1.517 0.0192 1.517 0.0192 +2MG P "O5'" SINGLE n 1.614 0.0178 1.614 0.0178 +2MG "O5'" "C5'" SINGLE n 1.450 0.0166 1.450 0.0166 +2MG "C5'" "C4'" SINGLE n 1.509 0.0100 1.509 0.0100 +2MG "C4'" "O4'" SINGLE n 1.451 0.0100 1.451 0.0100 +2MG "C4'" "C3'" SINGLE n 1.535 0.0100 1.535 0.0100 +2MG "O4'" "C1'" SINGLE n 1.409 0.0100 1.409 0.0100 +2MG "C3'" "O3'" SINGLE n 1.422 0.0100 1.422 0.0100 +2MG "C3'" "C2'" SINGLE n 1.531 0.0100 1.531 0.0100 +2MG "C2'" "O2'" SINGLE n 1.411 0.0100 1.411 0.0100 +2MG "C2'" "C1'" SINGLE n 1.525 0.0100 1.525 0.0100 +2MG "C1'" N9 SINGLE n 1.458 0.0100 1.458 0.0100 +2MG N9 C8 SINGLE y 1.372 0.0100 1.372 0.0100 +2MG N9 C4 SINGLE y 1.375 0.0100 1.375 0.0100 +2MG C8 N7 DOUBLE y 1.312 0.0100 1.312 0.0100 +2MG N7 C5 SINGLE y 1.390 0.0100 1.390 0.0100 +2MG C5 C6 SINGLE y 1.417 0.0103 1.417 0.0103 +2MG C5 C4 DOUBLE y 1.377 0.0100 1.377 0.0100 +2MG C6 O6 DOUBLE n 1.239 0.0100 1.239 0.0100 +2MG C6 N1 SINGLE y 1.396 0.0107 1.396 0.0107 +2MG N1 C2 SINGLE y 1.372 0.0100 1.372 0.0100 +2MG C2 N2 SINGLE n 1.342 0.0119 1.342 0.0119 +2MG C2 N3 DOUBLE y 1.324 0.0127 1.324 0.0127 +2MG N2 CM2 SINGLE n 1.450 0.0100 1.450 0.0100 +2MG N3 C4 SINGLE y 1.355 0.0100 1.355 0.0100 +2MG "C5'" "H5'" SINGLE n 1.089 0.0100 0.989 0.0200 +2MG "C5'" "H5''" SINGLE n 1.089 0.0100 0.989 0.0200 +2MG "C4'" "H4'" SINGLE n 1.089 0.0100 0.981 0.0200 +2MG "C3'" "H3'" SINGLE n 1.089 0.0100 0.992 0.0200 +2MG "O3'" "HO3'" SINGLE n 0.970 0.0120 0.849 0.0200 +2MG "C2'" "H2'" SINGLE n 1.089 0.0100 0.994 0.0200 +2MG "O2'" "HO2'" SINGLE n 0.970 0.0120 0.849 0.0200 +2MG "C1'" "H1'" SINGLE n 1.089 0.0100 0.984 0.0200 +2MG C8 H8 SINGLE n 1.082 0.0130 0.942 0.0170 +2MG N1 HN1 SINGLE n 1.016 0.0100 0.897 0.0200 +2MG N2 HN2 SINGLE n 1.016 0.0100 0.873 0.0200 +2MG CM2 HM21 SINGLE n 1.089 0.0100 0.970 0.0159 +2MG CM2 HM22 SINGLE n 1.089 0.0100 0.970 0.0159 +2MG CM2 HM23 SINGLE n 1.089 0.0100 0.970 0.0159 + +loop_ +_chem_comp_angle.comp_id +_chem_comp_angle.atom_id_1 +_chem_comp_angle.atom_id_2 +_chem_comp_angle.atom_id_3 +_chem_comp_angle.value_angle +_chem_comp_angle.value_angle_esd +2MG OP1 P OP2 112.864 1.69 +2MG OP1 P OP3 112.864 1.69 +2MG OP1 P "O5'" 105.808 2.07 +2MG OP2 P OP3 112.864 1.69 +2MG OP2 P "O5'" 105.808 2.07 +2MG OP3 P "O5'" 105.808 2.07 +2MG P "O5'" "C5'" 118.783 1.50 +2MG "O5'" "C5'" "C4'" 109.342 1.50 +2MG "O5'" "C5'" "H5'" 109.845 1.50 +2MG "O5'" "C5'" "H5''" 109.845 1.50 +2MG "C4'" "C5'" "H5'" 109.624 1.50 +2MG "C4'" "C5'" "H5''" 109.624 1.50 +2MG "H5'" "C5'" "H5''" 108.472 1.50 +2MG "C5'" "C4'" "O4'" 109.123 1.50 +2MG "C5'" "C4'" "C3'" 116.008 1.52 +2MG "C5'" "C4'" "H4'" 108.268 1.50 +2MG "O4'" "C4'" "C3'" 105.388 1.50 +2MG "O4'" "C4'" "H4'" 108.947 1.50 +2MG "C3'" "C4'" "H4'" 109.363 1.86 +2MG "C4'" "O4'" "C1'" 109.903 1.50 +2MG "C4'" "C3'" "O3'" 111.281 2.46 +2MG "C4'" "C3'" "C2'" 102.602 1.50 +2MG "C4'" "C3'" "H3'" 110.452 2.54 +2MG "O3'" "C3'" "C2'" 111.581 2.83 +2MG "O3'" "C3'" "H3'" 110.380 1.67 +2MG "C2'" "C3'" "H3'" 110.504 1.75 +2MG "C3'" "O3'" "HO3'" 108.744 3.00 +2MG "C3'" "C2'" "O2'" 112.782 2.45 +2MG "C3'" "C2'" "C1'" 101.239 1.50 +2MG "C3'" "C2'" "H2'" 110.596 1.51 +2MG "O2'" "C2'" "C1'" 111.715 2.69 +2MG "O2'" "C2'" "H2'" 110.448 1.97 +2MG "C1'" "C2'" "H2'" 110.636 1.70 +2MG "C2'" "O2'" "HO2'" 109.103 2.13 +2MG "O4'" "C1'" "C2'" 106.047 1.50 +2MG "O4'" "C1'" N9 108.477 1.50 +2MG "O4'" "C1'" "H1'" 109.807 1.50 +2MG "C2'" "C1'" N9 113.824 1.50 +2MG "C2'" "C1'" "H1'" 109.015 1.50 +2MG N9 "C1'" "H1'" 109.561 1.50 +2MG "C1'" N9 C8 126.829 1.91 +2MG "C1'" N9 C4 127.440 1.80 +2MG C8 N9 C4 105.731 1.50 +2MG N9 C8 N7 113.507 1.50 +2MG N9 C8 H8 123.187 1.50 +2MG N7 C8 H8 123.307 1.50 +2MG C8 N7 C5 104.778 1.50 +2MG N7 C5 C6 130.614 1.50 +2MG N7 C5 C4 110.574 1.50 +2MG C6 C5 C4 118.812 1.50 +2MG C5 C6 O6 128.536 1.50 +2MG C5 C6 N1 110.783 1.50 +2MG O6 C6 N1 120.681 1.50 +2MG C6 N1 C2 124.695 1.50 +2MG C6 N1 HN1 117.267 2.44 +2MG C2 N1 HN1 118.037 1.50 +2MG N1 C2 N2 116.538 1.50 +2MG N1 C2 N3 124.501 1.50 +2MG N2 C2 N3 118.961 1.50 +2MG C2 N2 CM2 121.703 2.30 +2MG C2 N2 HN2 119.049 1.68 +2MG CM2 N2 HN2 119.248 1.66 +2MG N2 CM2 HM21 109.503 1.50 +2MG N2 CM2 HM22 109.503 1.50 +2MG N2 CM2 HM23 109.503 1.50 +2MG HM21 CM2 HM22 109.396 1.50 +2MG HM21 CM2 HM23 109.396 1.50 +2MG HM22 CM2 HM23 109.396 1.50 +2MG C2 N3 C4 113.582 1.50 +2MG N9 C4 C5 105.411 1.50 +2MG N9 C4 N3 126.963 1.50 +2MG C5 C4 N3 127.627 1.50 + +loop_ +_chem_comp_tor.comp_id +_chem_comp_tor.id +_chem_comp_tor.atom_id_1 +_chem_comp_tor.atom_id_2 +_chem_comp_tor.atom_id_3 +_chem_comp_tor.atom_id_4 +_chem_comp_tor.value_angle +_chem_comp_tor.value_angle_esd +_chem_comp_tor.period +2MG C2e-chi "O4'" "C1'" N9 C4 210.000 10.000 6 +2MG C2e-nyu0 "C4'" "O4'" "C1'" "C2'" 340.700 6.300 1 +2MG C2e-nyu1 "O4'" "C1'" "C2'" "C3'" 32.800 4.900 1 +2MG C2e-nyu2 "C1'" "C2'" "C3'" "C4'" 326.9 3.600 1 +2MG C2e-nyu3 "C2'" "C3'" "C4'" "O4'" 22.600 4.500 1 +2MG C2e-nyu4 "C3'" "C4'" "O4'" "C1'" 357.700 6.100 1 +2MG C3e-chi "O4'" "C1'" N9 C4 210.000 10.000 6 +2MG C3e-nyu0 "C4'" "O4'" "C1'" "C2'" 2.8 6.100 1 +2MG C3e-nyu1 "O4'" "C1'" "C2'" "C3'" 335.00 4.900 1 +2MG C3e-nyu2 "C1'" "C2'" "C3'" "C4'" 35.9 2.800 1 +2MG C3e-nyu3 "C2'" "C3'" "C4'" "O4'" 324.700 3.100 1 +2MG C3e-nyu4 "C3'" "C4'" "O4'" "C1'" 20.500 5.100 1 +2MG alpha "C5'" "O5'" P OP3 -60.000 10.00 3 +2MG beta P "O5'" "C5'" "C4'" 180.000 10.00 3 +2MG epsi "C4'" "C3'" "O3'" "HO3'" 180.000 10.00 3 +2MG gamma "O5'" "C5'" "C4'" "C3'" 180.000 10.00 3 +2MG sp3_sp3_52 "C3'" "C2'" "O2'" "HO2'" 180.000 10.00 3 +2MG const_18 N7 C8 N9 "C1'" 180.000 10.0 2 +2MG const_30 C5 C4 N9 "C1'" 180.000 10.0 2 +2MG const_21 N9 C8 N7 C5 0.000 10.0 2 +2MG const_24 C6 C5 N7 C8 180.000 10.0 2 +2MG const_sp2_sp2_4 N7 C5 C6 O6 0.000 5.0 2 +2MG const_25 N9 C4 C5 N7 0.000 10.0 2 +2MG const_sp2_sp2_7 O6 C6 N1 C2 180.000 5.0 2 +2MG const_11 N2 C2 N1 C6 180.000 10.0 2 +2MG sp2_sp2_1 N1 C2 N2 CM2 180.000 5.0 2 +2MG const_14 N2 C2 N3 C4 180.000 10.0 2 +2MG sp2_sp3_7 C2 N2 CM2 HM21 0.000 10.0 6 +2MG const_16 N9 C4 N3 C2 180.000 10.0 2 + +loop_ +_chem_comp_chir.comp_id +_chem_comp_chir.id +_chem_comp_chir.atom_id_centre +_chem_comp_chir.atom_id_1 +_chem_comp_chir.atom_id_2 +_chem_comp_chir.atom_id_3 +_chem_comp_chir.volume_sign +2MG chir_1 P "O5'" OP2 OP3 both +2MG chir_2 "C4'" "O4'" "C3'" "C5'" negative +2MG chir_3 "C3'" "O3'" "C4'" "C2'" positive +2MG chir_4 "C2'" "O2'" "C1'" "C3'" negative +2MG chir_5 "C1'" "O4'" N9 "C2'" negative + +loop_ +_chem_comp_plane_atom.comp_id +_chem_comp_plane_atom.plane_id +_chem_comp_plane_atom.atom_id +_chem_comp_plane_atom.dist_esd +2MG plan-1 "C1'" 0.020 +2MG plan-1 C2 0.020 +2MG plan-1 C4 0.020 +2MG plan-1 C5 0.020 +2MG plan-1 C6 0.020 +2MG plan-1 C8 0.020 +2MG plan-1 H8 0.020 +2MG plan-1 HN1 0.020 +2MG plan-1 N1 0.020 +2MG plan-1 N2 0.020 +2MG plan-1 N3 0.020 +2MG plan-1 N7 0.020 +2MG plan-1 N9 0.020 +2MG plan-1 O6 0.020 +2MG plan-2 C2 0.020 +2MG plan-2 CM2 0.020 +2MG plan-2 HN2 0.020 +2MG plan-2 N2 0.020 + +loop_ +_pdbx_chem_comp_descriptor.comp_id +_pdbx_chem_comp_descriptor.type +_pdbx_chem_comp_descriptor.program +_pdbx_chem_comp_descriptor.program_version +_pdbx_chem_comp_descriptor.descriptor +2MG SMILES ACDLabs 10.04 O=C1c2ncn(c2N=C(NC)N1)C3OC(C(O)C3O)COP(=O)(O)O +2MG SMILES_CANONICAL CACTVS 3.341 CNC1=Nc2n(cnc2C(=O)N1)[C@@H]3O[C@H](CO[P](O)(O)=O)[C@@H](O)[C@H]3O +2MG SMILES CACTVS 3.341 CNC1=Nc2n(cnc2C(=O)N1)[CH]3O[CH](CO[P](O)(O)=O)[CH](O)[CH]3O +2MG SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 CNC1=Nc2c(ncn2[C@H]3[C@@H]([C@@H]([C@H](O3)COP(=O)(O)O)O)O)C(=O)N1 +2MG SMILES "OpenEye OEToolkits" 1.5.0 CNC1=Nc2c(ncn2C3C(C(C(O3)COP(=O)(O)O)O)O)C(=O)N1 +2MG InChI InChI 1.03 InChI=1S/C11H16N5O8P/c1-12-11-14-8-5(9(19)15-11)13-3-16(8)10-7(18)6(17)4(24-10)2-23-25(20,21)22/h3-4,6-7,10,17-18H,2H2,1H3,(H2,20,21,22)(H2,12,14,15,19)/t4-,6-,7-,10-/m1/s1 +2MG InChIKey InChI 1.03 ZSKBUUXHFBEFIJ-KQYNXXCUSA-N + +loop_ +_pdbx_chem_comp_description_generator.comp_id +_pdbx_chem_comp_description_generator.program_name +_pdbx_chem_comp_description_generator.program_version +_pdbx_chem_comp_description_generator.descriptor +2MG acedrg 243 "dictionary generator" +2MG acedrg_database 11 "data source" +2MG rdkit 2017.03.2 "Chemoinformatics tool" +2MG refmac5 5.8.0238 "optimization tool" diff --git a/image_analysis/structure_refinement/monomers/5MC.cif b/image_analysis/structure_refinement/monomers/5MC.cif new file mode 100644 index 000000000..1358828fc --- /dev/null +++ b/image_analysis/structure_refinement/monomers/5MC.cif @@ -0,0 +1,268 @@ +# +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +5MC 5MC "5-METHYLCYTIDINE-5'-MONOPHOSPHATE" RNA 36 22 . +# +data_comp_5MC +# +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +5MC P P P 0 50.440 -8.664 9.985 +5MC OP1 O O 0 48.933 -8.494 10.029 +5MC OP2 O OP -1 51.110 -8.329 11.305 +5MC OP3 O OP -1 50.865 -10.012 9.434 +5MC "O5'" O O2 0 50.976 -7.568 8.928 +5MC "C5'" C CH2 0 52.398 -7.502 8.649 +5MC "C4'" C CH1 0 52.685 -6.336 7.734 +5MC "O4'" O O2 0 51.869 -6.428 6.541 +5MC "C3'" C CH1 0 52.360 -4.941 8.282 +5MC "O3'" O OH1 0 53.402 -4.481 9.135 +5MC "C2'" C CH1 0 52.217 -4.110 6.997 +5MC "O2'" O OH1 0 53.434 -3.537 6.561 +5MC "C1'" C CH1 0 51.731 -5.144 5.969 +5MC N1 N NR6 0 50.307 -4.941 5.576 +5MC C2 C CR6 0 49.973 -4.500 4.284 +5MC O2 O O 0 50.870 -4.281 3.453 +5MC N3 N NRD6 0 48.663 -4.323 3.969 +5MC C4 C CR6 0 47.697 -4.561 4.872 +5MC N4 N NH2 0 46.429 -4.359 4.472 +5MC C5 C CR6 0 48.009 -5.004 6.186 +5MC C6 C CR16 0 49.309 -5.173 6.486 +5MC CM5 C CH3 0 46.922 -5.266 7.189 +5MC "H5'" H H 0 52.694 -8.342 8.219 +5MC "H5''" H H 0 52.900 -7.390 9.494 +5MC "H4'" H H 0 53.630 -6.373 7.473 +5MC "H3'" H H 0 51.499 -4.954 8.773 +5MC "HO3'" H H 0 53.276 -3.658 9.306 +5MC "H2'" H H 0 51.542 -3.413 7.124 +5MC "HO2'" H H 0 54.035 -4.136 6.511 +5MC "H1'" H H 0 52.305 -5.099 5.170 +5MC HN41 H H 0 46.115 -4.796 3.779 +5MC HN42 H H 0 45.920 -3.791 4.905 +5MC H6 H H 0 49.548 -5.468 7.358 +5MC HM51 H H 0 47.279 -5.777 7.934 +5MC HM52 H H 0 46.206 -5.770 6.770 +5MC HM53 H H 0 46.572 -4.422 7.518 +loop_ +_chem_comp_bond.comp_id +_chem_comp_bond.atom_id_1 +_chem_comp_bond.atom_id_2 +_chem_comp_bond.type +_chem_comp_bond.aromatic +_chem_comp_bond.value_dist_nucleus +_chem_comp_bond.value_dist_nucleus_esd +_chem_comp_bond.value_dist +_chem_comp_bond.value_dist_esd +5MC P OP1 DOUBLE n 1.517 0.0192 1.517 0.0192 +5MC P OP2 SINGLE n 1.517 0.0192 1.517 0.0192 +5MC P OP3 SINGLE n 1.517 0.0192 1.517 0.0192 +5MC P "O5'" SINGLE n 1.614 0.0178 1.614 0.0178 +5MC "O5'" "C5'" SINGLE n 1.450 0.0166 1.450 0.0166 +5MC "C5'" "C4'" SINGLE n 1.509 0.0100 1.509 0.0100 +5MC "C4'" "O4'" SINGLE n 1.451 0.0111 1.451 0.0111 +5MC "C4'" "C3'" SINGLE n 1.535 0.0100 1.535 0.0100 +5MC "O4'" "C1'" SINGLE n 1.411 0.0100 1.411 0.0100 +5MC "C3'" "O3'" SINGLE n 1.422 0.0100 1.422 0.0100 +5MC "C3'" "C2'" SINGLE n 1.533 0.0109 1.533 0.0109 +5MC "C2'" "O2'" SINGLE n 1.412 0.0100 1.412 0.0100 +5MC "C2'" "C1'" SINGLE n 1.532 0.0100 1.532 0.0100 +5MC "C1'" N1 SINGLE n 1.485 0.0100 1.485 0.0100 +5MC N1 C2 SINGLE y 1.395 0.0100 1.395 0.0100 +5MC N1 C6 SINGLE y 1.364 0.0100 1.364 0.0100 +5MC C2 O2 DOUBLE n 1.241 0.0100 1.241 0.0100 +5MC C2 N3 SINGLE y 1.353 0.0117 1.353 0.0117 +5MC N3 C4 DOUBLE y 1.341 0.0100 1.341 0.0100 +5MC C4 N4 SINGLE n 1.343 0.0151 1.343 0.0151 +5MC C4 C5 SINGLE y 1.416 0.0131 1.416 0.0131 +5MC C5 C6 DOUBLE y 1.342 0.0102 1.342 0.0102 +5MC C5 CM5 SINGLE n 1.501 0.0100 1.501 0.0100 +5MC "C5'" "H5'" SINGLE n 1.089 0.0100 0.989 0.0200 +5MC "C5'" "H5''" SINGLE n 1.089 0.0100 0.989 0.0200 +5MC "C4'" "H4'" SINGLE n 1.089 0.0100 0.981 0.0200 +5MC "C3'" "H3'" SINGLE n 1.089 0.0100 0.992 0.0200 +5MC "O3'" "HO3'" SINGLE n 0.970 0.0120 0.849 0.0200 +5MC "C2'" "H2'" SINGLE n 1.089 0.0100 0.978 0.0200 +5MC "O2'" "HO2'" SINGLE n 0.970 0.0120 0.849 0.0200 +5MC "C1'" "H1'" SINGLE n 1.089 0.0100 0.985 0.0100 +5MC N4 HN41 SINGLE n 1.016 0.0100 0.877 0.0200 +5MC N4 HN42 SINGLE n 1.016 0.0100 0.877 0.0200 +5MC C6 H6 SINGLE n 1.082 0.0130 0.951 0.0200 +5MC CM5 HM51 SINGLE n 1.089 0.0100 0.971 0.0135 +5MC CM5 HM52 SINGLE n 1.089 0.0100 0.971 0.0135 +5MC CM5 HM53 SINGLE n 1.089 0.0100 0.971 0.0135 +loop_ +_chem_comp_angle.comp_id +_chem_comp_angle.atom_id_1 +_chem_comp_angle.atom_id_2 +_chem_comp_angle.atom_id_3 +_chem_comp_angle.value_angle +_chem_comp_angle.value_angle_esd +5MC OP1 P OP2 112.864 1.69 +5MC OP1 P OP3 112.864 1.69 +5MC OP1 P "O5'" 105.808 2.07 +5MC OP2 P OP3 112.864 1.69 +5MC OP2 P "O5'" 105.808 2.07 +5MC OP3 P "O5'" 105.808 2.07 +5MC P "O5'" "C5'" 118.783 1.50 +5MC "O5'" "C5'" "C4'" 109.342 1.50 +5MC "O5'" "C5'" "H5'" 109.845 1.50 +5MC "O5'" "C5'" "H5''" 109.845 1.50 +5MC "C4'" "C5'" "H5'" 109.624 1.50 +5MC "C4'" "C5'" "H5''" 109.624 1.50 +5MC "H5'" "C5'" "H5''" 108.472 1.50 +5MC "C5'" "C4'" "O4'" 109.615 1.50 +5MC "C5'" "C4'" "C3'" 116.008 1.52 +5MC "C5'" "C4'" "H4'" 108.268 1.50 +5MC "O4'" "C4'" "C3'" 104.439 1.50 +5MC "O4'" "C4'" "H4'" 108.698 1.50 +5MC "C3'" "C4'" "H4'" 109.363 1.86 +5MC "C4'" "O4'" "C1'" 109.578 1.50 +5MC "C4'" "C3'" "O3'" 111.281 2.46 +5MC "C4'" "C3'" "C2'" 102.071 1.50 +5MC "C4'" "C3'" "H3'" 110.452 2.54 +5MC "O3'" "C3'" "C2'" 111.993 3.00 +5MC "O3'" "C3'" "H3'" 110.380 1.67 +5MC "C2'" "C3'" "H3'" 110.108 1.66 +5MC "C3'" "O3'" "HO3'" 108.744 3.00 +5MC "C3'" "C2'" "O2'" 112.861 2.52 +5MC "C3'" "C2'" "C1'" 101.269 1.50 +5MC "C3'" "C2'" "H2'" 110.799 1.82 +5MC "O2'" "C2'" "C1'" 109.476 3.00 +5MC "O2'" "C2'" "H2'" 111.022 1.77 +5MC "C1'" "C2'" "H2'" 110.760 1.63 +5MC "C2'" "O2'" "HO2'" 109.449 1.85 +5MC "O4'" "C1'" "C2'" 106.825 1.50 +5MC "O4'" "C1'" N1 108.667 1.50 +5MC "O4'" "C1'" "H1'" 109.327 1.50 +5MC "C2'" "C1'" N1 112.859 1.50 +5MC "C2'" "C1'" "H1'" 109.776 1.83 +5MC N1 "C1'" "H1'" 109.166 1.50 +5MC "C1'" N1 C2 118.572 2.26 +5MC "C1'" N1 C6 121.186 1.50 +5MC C2 N1 C6 120.242 1.50 +5MC N1 C2 O2 118.953 1.50 +5MC N1 C2 N3 118.440 1.50 +5MC O2 C2 N3 122.606 1.50 +5MC C2 N3 C4 119.913 1.50 +5MC N3 C4 N4 117.013 1.55 +5MC N3 C4 C5 121.550 1.50 +5MC N4 C4 C5 121.437 1.50 +5MC C4 N4 HN41 119.860 1.50 +5MC C4 N4 HN42 119.860 1.50 +5MC HN41 N4 HN42 120.280 1.85 +5MC C4 C5 C6 117.857 1.50 +5MC C4 C5 CM5 120.410 1.50 +5MC C6 C5 CM5 121.734 1.50 +5MC N1 C6 C5 121.998 1.50 +5MC N1 C6 H6 118.660 1.56 +5MC C5 C6 H6 119.342 1.50 +5MC C5 CM5 HM51 109.580 1.50 +5MC C5 CM5 HM52 109.580 1.50 +5MC C5 CM5 HM53 109.580 1.50 +5MC HM51 CM5 HM52 109.348 1.50 +5MC HM51 CM5 HM53 109.348 1.50 +5MC HM52 CM5 HM53 109.348 1.50 +loop_ +_chem_comp_tor.comp_id +_chem_comp_tor.id +_chem_comp_tor.atom_id_1 +_chem_comp_tor.atom_id_2 +_chem_comp_tor.atom_id_3 +_chem_comp_tor.atom_id_4 +_chem_comp_tor.value_angle +_chem_comp_tor.value_angle_esd +_chem_comp_tor.period +5MC C2e-chi "O4'" "C1'" N1 C2 210.000 10.000 6 +5MC C2e-nyu0 "C4'" "O4'" "C1'" "C2'" 340.700 6.300 1 +5MC C2e-nyu1 "O4'" "C1'" "C2'" "C3'" 32.800 4.900 1 +5MC C2e-nyu2 "C1'" "C2'" "C3'" "C4'" 326.9 3.600 1 +5MC C2e-nyu3 "C2'" "C3'" "C4'" "O4'" 22.600 4.500 1 +5MC C2e-nyu4 "C3'" "C4'" "O4'" "C1'" 357.700 6.100 1 +5MC C3e-chi "O4'" "C1'" N1 C2 210.000 10.000 6 +5MC C3e-nyu0 "C4'" "O4'" "C1'" "C2'" 2.8 6.100 1 +5MC C3e-nyu1 "O4'" "C1'" "C2'" "C3'" 335.00 4.900 1 +5MC C3e-nyu2 "C1'" "C2'" "C3'" "C4'" 35.9 2.800 1 +5MC C3e-nyu3 "C2'" "C3'" "C4'" "O4'" 324.700 3.100 1 +5MC C3e-nyu4 "C3'" "C4'" "O4'" "C1'" 20.500 5.100 1 +5MC alpha "C5'" "O5'" P OP3 -60.000 10.00 3 +5MC beta P "O5'" "C5'" "C4'" 180.000 10.00 3 +5MC epsi "C4'" "C3'" "O3'" "HO3'" 180.000 10.00 3 +5MC gamma "O5'" "C5'" "C4'" "C3'" 180.000 10.00 3 +5MC sp3_sp3_52 "C3'" "C2'" "O2'" "HO2'" 180.000 10.00 3 +5MC const_sp2_sp2_4 O2 C2 N1 "C1'" 0.000 5.0 2 +5MC const_18 C5 C6 N1 "C1'" 180.000 10.0 2 +5MC const_sp2_sp2_6 O2 C2 N3 C4 180.000 5.0 2 +5MC const_sp2_sp2_8 N4 C4 N3 C2 180.000 5.0 2 +5MC sp2_sp2_3 N3 C4 N4 HN41 0.000 5.0 2 +5MC const_12 N4 C4 C5 CM5 0.000 10.0 2 +5MC const_15 CM5 C5 C6 N1 180.000 10.0 2 +5MC sp2_sp3_7 C4 C5 CM5 HM51 150.000 10.0 6 +loop_ +_chem_comp_chir.comp_id +_chem_comp_chir.id +_chem_comp_chir.atom_id_centre +_chem_comp_chir.atom_id_1 +_chem_comp_chir.atom_id_2 +_chem_comp_chir.atom_id_3 +_chem_comp_chir.volume_sign +5MC chir_1 P "O5'" OP2 OP3 both +5MC chir_2 "C4'" "O4'" "C3'" "C5'" negative +5MC chir_3 "C3'" "O3'" "C4'" "C2'" positive +5MC chir_4 "C2'" "O2'" "C1'" "C3'" negative +5MC chir_5 "C1'" "O4'" N1 "C2'" negative +loop_ +_chem_comp_plane_atom.comp_id +_chem_comp_plane_atom.plane_id +_chem_comp_plane_atom.atom_id +_chem_comp_plane_atom.dist_esd +5MC plan-1 "C1'" 0.020 +5MC plan-1 C2 0.020 +5MC plan-1 C4 0.020 +5MC plan-1 C5 0.020 +5MC plan-1 C6 0.020 +5MC plan-1 CM5 0.020 +5MC plan-1 H6 0.020 +5MC plan-1 N1 0.020 +5MC plan-1 N3 0.020 +5MC plan-1 N4 0.020 +5MC plan-1 O2 0.020 +5MC plan-2 C4 0.020 +5MC plan-2 HN41 0.020 +5MC plan-2 HN42 0.020 +5MC plan-2 N4 0.020 +loop_ +_pdbx_chem_comp_descriptor.comp_id +_pdbx_chem_comp_descriptor.type +_pdbx_chem_comp_descriptor.program +_pdbx_chem_comp_descriptor.program_version +_pdbx_chem_comp_descriptor.descriptor +5MC SMILES ACDLabs 10.04 O=C1N=C(N)C(=CN1C2OC(C(O)C2O)COP(=O)(O)O)C +5MC SMILES_CANONICAL CACTVS 3.341 CC1=CN([C@@H]2O[C@H](CO[P](O)(O)=O)[C@@H](O)[C@H]2O)C(=O)N=C1N +5MC SMILES CACTVS 3.341 CC1=CN([CH]2O[CH](CO[P](O)(O)=O)[CH](O)[CH]2O)C(=O)N=C1N +5MC SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 CC1=CN(C(=O)N=C1N)[C@H]2[C@@H]([C@@H]([C@H](O2)COP(=O)(O)O)O)O +5MC SMILES "OpenEye OEToolkits" 1.5.0 CC1=CN(C(=O)N=C1N)C2C(C(C(O2)COP(=O)(O)O)O)O +5MC InChI InChI 1.03 InChI=1S/C10H16N3O8P/c1-4-2-13(10(16)12-8(4)11)9-7(15)6(14)5(21-9)3-20-22(17,18)19/h2,5-7,9,14-15H,3H2,1H3,(H2,11,12,16)(H2,17,18,19)/t5-,6-,7-,9-/m1/s1 +5MC InChIKey InChI 1.03 NJQONZSFUKNYOY-JXOAFFINSA-N +loop_ +_pdbx_chem_comp_description_generator.comp_id +_pdbx_chem_comp_description_generator.program_name +_pdbx_chem_comp_description_generator.program_version +_pdbx_chem_comp_description_generator.descriptor +5MC acedrg 243 "dictionary generator" +5MC acedrg_database 11 "data source" +5MC rdkit 2017.03.2 "Chemoinformatics tool" +5MC refmac5 5.8.0238 "optimization tool" diff --git a/image_analysis/structure_refinement/monomers/5MU.cif b/image_analysis/structure_refinement/monomers/5MU.cif new file mode 100644 index 000000000..cec03d0f6 --- /dev/null +++ b/image_analysis/structure_refinement/monomers/5MU.cif @@ -0,0 +1,266 @@ +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +5MU 5MU "5-METHYLURIDINE 5'-MONOPHOSPHATE" RNA 35 22 . + +data_comp_5MU +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +5MU N1 N NR6 0 45.964 22.742 42.610 +5MU C2 C CR6 0 46.310 21.509 42.078 +5MU N3 N NR16 0 45.881 21.292 40.788 +5MU C4 C CR6 0 45.162 22.161 39.983 +5MU C5 C CR6 0 44.836 23.436 40.589 +5MU C5M C CH3 0 44.058 24.436 39.786 +5MU C6 C CR16 0 45.249 23.665 41.851 +5MU O2 O O 0 46.944 20.657 42.690 +5MU O4 O O 0 44.849 21.819 38.838 +5MU "C1'" C CH1 0 46.396 23.062 43.999 +5MU "C2'" C CH1 0 47.646 23.950 44.041 +5MU "O2'" O OH1 0 48.573 23.414 44.962 +5MU "C3'" C CH1 0 47.081 25.308 44.482 +5MU "C4'" C CH1 0 45.911 24.881 45.376 +5MU "O3'" O OH1 0 48.020 26.094 45.207 +5MU "O4'" O O2 0 45.356 23.744 44.672 +5MU "C5'" C CH2 0 44.839 25.915 45.625 +5MU "O5'" O O2 0 44.216 26.287 44.368 +5MU P P P 0 43.153 27.501 44.357 +5MU OP1 O O 0 42.658 27.605 42.927 +5MU OP2 O OP -1 43.921 28.730 44.805 +5MU OP3 O OP -1 42.060 27.102 45.331 +5MU HN3 H H 0 46.097 20.497 40.440 +5MU H71 H H 0 43.917 25.242 40.310 +5MU H72 H H 0 43.197 24.059 39.541 +5MU H73 H H 0 44.550 24.660 38.980 +5MU H6 H H 0 45.037 24.501 42.250 +5MU "H1'" H H 0 46.577 22.230 44.486 +5MU "H2'" H H 0 48.047 24.022 43.151 +5MU "HO2'" H H 0 49.240 23.936 45.028 +5MU "H3'" H H 0 46.752 25.810 43.693 +5MU "H4'" H H 0 46.255 24.578 46.244 +5MU "HO3'" H H 0 47.644 26.816 45.448 +5MU "H5'" H H 0 45.241 26.713 46.049 +5MU "H5''" H H 0 44.158 25.544 46.239 + +loop_ +_chem_comp_bond.comp_id +_chem_comp_bond.atom_id_1 +_chem_comp_bond.atom_id_2 +_chem_comp_bond.type +_chem_comp_bond.aromatic +_chem_comp_bond.value_dist_nucleus +_chem_comp_bond.value_dist_nucleus_esd +_chem_comp_bond.value_dist +_chem_comp_bond.value_dist_esd +5MU N1 C2 SINGLE y 1.376 0.0100 1.376 0.0100 +5MU N1 C6 SINGLE y 1.386 0.0100 1.386 0.0100 +5MU N1 "C1'" SINGLE n 1.476 0.0133 1.476 0.0133 +5MU C2 N3 SINGLE y 1.373 0.0100 1.373 0.0100 +5MU C2 O2 DOUBLE n 1.224 0.0111 1.224 0.0111 +5MU N3 C4 SINGLE y 1.383 0.0100 1.383 0.0100 +5MU C4 C5 SINGLE y 1.446 0.0100 1.446 0.0100 +5MU C4 O4 DOUBLE n 1.234 0.0141 1.234 0.0141 +5MU C5 C5M SINGLE n 1.500 0.0100 1.500 0.0100 +5MU C5 C6 DOUBLE y 1.343 0.0112 1.343 0.0112 +5MU "C1'" "C2'" SINGLE n 1.529 0.0100 1.529 0.0100 +5MU "C1'" "O4'" SINGLE n 1.412 0.0100 1.412 0.0100 +5MU "C2'" "O2'" SINGLE n 1.412 0.0100 1.412 0.0100 +5MU "C2'" "C3'" SINGLE n 1.533 0.0109 1.533 0.0109 +5MU "C3'" "C4'" SINGLE n 1.535 0.0100 1.535 0.0100 +5MU "C3'" "O3'" SINGLE n 1.422 0.0100 1.422 0.0100 +5MU "C4'" "O4'" SINGLE n 1.451 0.0111 1.451 0.0111 +5MU "C4'" "C5'" SINGLE n 1.509 0.0100 1.509 0.0100 +5MU "C5'" "O5'" SINGLE n 1.450 0.0166 1.450 0.0166 +5MU "O5'" P SINGLE n 1.614 0.0178 1.614 0.0178 +5MU P OP1 DOUBLE n 1.517 0.0192 1.517 0.0192 +5MU P OP2 SINGLE n 1.517 0.0192 1.517 0.0192 +5MU P OP3 SINGLE n 1.517 0.0192 1.517 0.0192 +5MU N3 HN3 SINGLE n 1.016 0.0100 0.893 0.0200 +5MU C5M H71 SINGLE n 1.089 0.0100 0.971 0.0135 +5MU C5M H72 SINGLE n 1.089 0.0100 0.971 0.0135 +5MU C5M H73 SINGLE n 1.089 0.0100 0.971 0.0135 +5MU C6 H6 SINGLE n 1.082 0.0130 0.951 0.0200 +5MU "C1'" "H1'" SINGLE n 1.089 0.0100 0.981 0.0118 +5MU "C2'" "H2'" SINGLE n 1.089 0.0100 0.978 0.0200 +5MU "O2'" "HO2'" SINGLE n 0.970 0.0120 0.849 0.0200 +5MU "C3'" "H3'" SINGLE n 1.089 0.0100 0.992 0.0200 +5MU "C4'" "H4'" SINGLE n 1.089 0.0100 0.981 0.0200 +5MU "O3'" "HO3'" SINGLE n 0.970 0.0120 0.849 0.0200 +5MU "C5'" "H5'" SINGLE n 1.089 0.0100 0.989 0.0200 +5MU "C5'" "H5''" SINGLE n 1.089 0.0100 0.989 0.0200 + +loop_ +_chem_comp_angle.comp_id +_chem_comp_angle.atom_id_1 +_chem_comp_angle.atom_id_2 +_chem_comp_angle.atom_id_3 +_chem_comp_angle.value_angle +_chem_comp_angle.value_angle_esd +5MU C2 N1 C6 121.243 1.50 +5MU C2 N1 "C1'" 117.446 1.50 +5MU C6 N1 "C1'" 121.311 1.50 +5MU N1 C2 N3 114.786 1.50 +5MU N1 C2 O2 122.872 1.50 +5MU N3 C2 O2 122.342 1.50 +5MU C2 N3 C4 127.106 1.50 +5MU C2 N3 HN3 115.584 1.79 +5MU C4 N3 HN3 117.311 1.81 +5MU N3 C4 C5 115.265 1.50 +5MU N3 C4 O4 119.787 1.50 +5MU C5 C4 O4 124.948 1.50 +5MU C4 C5 C5M 118.650 1.50 +5MU C4 C5 C6 118.305 1.50 +5MU C5M C5 C6 123.045 1.50 +5MU C5 C5M H71 109.652 1.50 +5MU C5 C5M H72 109.652 1.50 +5MU C5 C5M H73 109.652 1.50 +5MU H71 C5M H72 109.348 1.50 +5MU H71 C5M H73 109.348 1.50 +5MU H72 C5M H73 109.348 1.50 +5MU N1 C6 C5 123.296 1.50 +5MU N1 C6 H6 117.926 1.56 +5MU C5 C6 H6 118.779 1.68 +5MU N1 "C1'" "C2'" 112.859 1.50 +5MU N1 "C1'" "O4'" 108.667 1.50 +5MU N1 "C1'" "H1'" 109.166 1.50 +5MU "C2'" "C1'" "O4'" 106.825 1.50 +5MU "C2'" "C1'" "H1'" 109.776 1.83 +5MU "O4'" "C1'" "H1'" 109.327 1.50 +5MU "C1'" "C2'" "O2'" 109.476 3.00 +5MU "C1'" "C2'" "C3'" 101.269 1.50 +5MU "C1'" "C2'" "H2'" 110.760 1.63 +5MU "O2'" "C2'" "C3'" 112.861 2.52 +5MU "O2'" "C2'" "H2'" 111.022 1.77 +5MU "C3'" "C2'" "H2'" 110.799 1.82 +5MU "C2'" "O2'" "HO2'" 109.449 1.85 +5MU "C2'" "C3'" "C4'" 102.071 1.50 +5MU "C2'" "C3'" "O3'" 111.993 3.00 +5MU "C2'" "C3'" "H3'" 110.108 1.66 +5MU "C4'" "C3'" "O3'" 111.281 2.46 +5MU "C4'" "C3'" "H3'" 110.452 2.54 +5MU "O3'" "C3'" "H3'" 110.380 1.67 +5MU "C3'" "C4'" "O4'" 104.439 1.50 +5MU "C3'" "C4'" "C5'" 116.008 1.52 +5MU "C3'" "C4'" "H4'" 109.363 1.86 +5MU "O4'" "C4'" "C5'" 109.615 1.50 +5MU "O4'" "C4'" "H4'" 108.698 1.50 +5MU "C5'" "C4'" "H4'" 108.268 1.50 +5MU "C3'" "O3'" "HO3'" 108.744 3.00 +5MU "C1'" "O4'" "C4'" 109.578 1.50 +5MU "C4'" "C5'" "O5'" 109.342 1.50 +5MU "C4'" "C5'" "H5'" 109.624 1.50 +5MU "C4'" "C5'" "H5''" 109.624 1.50 +5MU "O5'" "C5'" "H5'" 109.845 1.50 +5MU "O5'" "C5'" "H5''" 109.845 1.50 +5MU "H5'" "C5'" "H5''" 108.472 1.50 +5MU "C5'" "O5'" P 118.783 1.50 +5MU "O5'" P OP1 105.808 2.07 +5MU "O5'" P OP2 105.808 2.07 +5MU "O5'" P OP3 105.808 2.07 +5MU OP1 P OP2 112.864 1.69 +5MU OP1 P OP3 112.864 1.69 +5MU OP2 P OP3 112.864 1.69 + +loop_ +_chem_comp_tor.comp_id +_chem_comp_tor.id +_chem_comp_tor.atom_id_1 +_chem_comp_tor.atom_id_2 +_chem_comp_tor.atom_id_3 +_chem_comp_tor.atom_id_4 +_chem_comp_tor.value_angle +_chem_comp_tor.value_angle_esd +_chem_comp_tor.period +5MU C2e-chi "O4'" "C1'" N1 C2 210.000 10.000 6 +5MU C2e-nyu0 "C4'" "O4'" "C1'" "C2" 340.700 6.300 1 +5MU C2e-nyu1 "O4'" "C1'" "C2'" "C3'" 32.800 4.900 1 +5MU C2e-nyu2 "C1'" "C2'" "C3'" "C4'" 326.9 3.600 1 +5MU C2e-nyu3 "C2'" "C3'" "C4'" "O4'" 22.600 4.500 1 +5MU C2e-nyu4 "C3'" "C4'" "O4'" "C1'" 357.700 6.100 1 +5MU C3e-chi "O4'" "C1'" N1 C2 210.000 10.000 6 +5MU C3e-nyu0 "C4'" "O4'" "C1'" "C2'" 2.8 6.100 1 +5MU C3e-nyu1 "O4'" "C1'" "C2'" "C3'" 335.00 4.900 1 +5MU C3e-nyu2 "C1'" "C2'" "C3'" "C4'" 35.9 2.800 1 +5MU C3e-nyu3 "C2'" "C3'" "C4'" "O4'" 324.700 3.100 1 +5MU C3e-nyu4 "C3'" "C4'" "O4'" "C1'" 20.500 5.100 1 +5MU alpha "C5'" "O5'" P OP3 -60.000 10.00 3 +5MU beta P "O5'" "C5'" "C4'" 180.000 10.00 3 +5MU epsi "C4'" "C3'" "O3'" "HO3'" 180.000 10.00 3 +5MU gamma "O5'" "C5'" "C4'" "C3'" 180.000 10.00 3 +5MU const_sp2_sp2_3 O2 C2 N1 C6 180.000 5.0 2 +5MU const_21 C5 C6 N1 C2 0.000 10.0 2 +5MU sp3_sp3_34 "C1'" "C2'" "O2'" "HO2'" 180.000 10.0 3 +5MU const_sp2_sp2_7 O2 C2 N3 C4 180.000 5.0 2 +5MU const_11 O4 C4 N3 C2 180.000 10.0 2 +5MU const_16 O4 C4 C5 C5M 0.000 10.0 2 +5MU sp2_sp3_7 C4 C5 C5M H71 150.000 10.0 6 +5MU const_19 C5M C5 C6 N1 180.000 10.0 2 + +loop_ +_chem_comp_chir.comp_id +_chem_comp_chir.id +_chem_comp_chir.atom_id_centre +_chem_comp_chir.atom_id_1 +_chem_comp_chir.atom_id_2 +_chem_comp_chir.atom_id_3 +_chem_comp_chir.volume_sign +5MU chir_1 "C1'" "O4'" N1 "C2'" negative +5MU chir_2 "C2'" "O2'" "C1'" "C3'" negative +5MU chir_3 "C3'" "O3'" "C4'" "C2'" positive +5MU chir_4 "C4'" "O4'" "C3'" "C5'" negative +5MU chir_5 P "O5'" OP2 OP3 both + +loop_ +_chem_comp_plane_atom.comp_id +_chem_comp_plane_atom.plane_id +_chem_comp_plane_atom.atom_id +_chem_comp_plane_atom.dist_esd +5MU plan-1 "C1'" 0.020 +5MU plan-1 C2 0.020 +5MU plan-1 C4 0.020 +5MU plan-1 C5 0.020 +5MU plan-1 C5M 0.020 +5MU plan-1 C6 0.020 +5MU plan-1 H6 0.020 +5MU plan-1 HN3 0.020 +5MU plan-1 N1 0.020 +5MU plan-1 N3 0.020 +5MU plan-1 O2 0.020 +5MU plan-1 O4 0.020 + +loop_ +_pdbx_chem_comp_descriptor.comp_id +_pdbx_chem_comp_descriptor.type +_pdbx_chem_comp_descriptor.program +_pdbx_chem_comp_descriptor.program_version +_pdbx_chem_comp_descriptor.descriptor +5MU SMILES ACDLabs 10.04 O=C1NC(=O)N(C=C1C)C2OC(C(O)C2O)COP(=O)(O)O +5MU SMILES_CANONICAL CACTVS 3.341 CC1=CN([C@@H]2O[C@H](CO[P](O)(O)=O)[C@@H](O)[C@H]2O)C(=O)NC1=O +5MU SMILES CACTVS 3.341 CC1=CN([CH]2O[CH](CO[P](O)(O)=O)[CH](O)[CH]2O)C(=O)NC1=O +5MU SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 CC1=CN(C(=O)NC1=O)[C@H]2[C@@H]([C@@H]([C@H](O2)COP(=O)(O)O)O)O +5MU SMILES "OpenEye OEToolkits" 1.5.0 CC1=CN(C(=O)NC1=O)C2C(C(C(O2)COP(=O)(O)O)O)O +5MU InChI InChI 1.03 InChI=1S/C10H15N2O9P/c1-4-2-12(10(16)11-8(4)15)9-7(14)6(13)5(21-9)3-20-22(17,18)19/h2,5-7,9,13-14H,3H2,1H3,(H,11,15,16)(H2,17,18,19)/t5-,6-,7-,9-/m1/s1 +5MU InChIKey InChI 1.03 IGWHDMPTQKSDTL-JXOAFFINSA-N + +loop_ +_pdbx_chem_comp_description_generator.comp_id +_pdbx_chem_comp_description_generator.program_name +_pdbx_chem_comp_description_generator.program_version +_pdbx_chem_comp_description_generator.descriptor +5MU acedrg 243 "dictionary generator" +5MU acedrg_database 11 "data source" +5MU rdkit 2017.03.2 "Chemoinformatics tool" +5MU refmac5 5.8.0238 "optimization tool" diff --git a/image_analysis/structure_refinement/monomers/7MG.cif b/image_analysis/structure_refinement/monomers/7MG.cif new file mode 100644 index 000000000..17dafc8c9 --- /dev/null +++ b/image_analysis/structure_refinement/monomers/7MG.cif @@ -0,0 +1,308 @@ +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +7MG 7MG "7N-METHYL-8-HYDROGUANOSINE-5'-MONOPHOSPHATE" RNA 41 25 . + +data_comp_7MG +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +7MG P P P 0 36.755 11.551 18.304 +7MG OP1 O O 0 37.842 12.410 17.686 +7MG OP2 O OP -1 35.360 12.088 18.045 +7MG OP3 O OP -1 36.894 10.081 17.952 +7MG "O5'" O O2 0 36.974 11.645 19.900 +7MG "C5'" C CH2 0 36.067 10.924 20.772 +7MG "C4'" C CH1 0 36.506 11.088 22.207 +7MG "O4'" O O2 0 37.856 10.573 22.349 +7MG "C3'" C CH1 0 36.546 12.531 22.736 +7MG "O3'" O OH1 0 35.933 12.618 24.017 +7MG "C2'" C CH1 0 38.028 12.882 22.708 +7MG "O2'" O OH1 0 38.387 13.794 23.729 +7MG "C1'" C CH1 0 38.659 11.524 23.021 +7MG N9 N NR5 0 40.065 11.364 22.595 +7MG C8 C CH2 0 40.895 12.383 21.944 +7MG N7 N NR5 0 42.179 11.711 21.783 +7MG C5 C CR56 0 42.096 10.393 22.267 +7MG C6 C CR6 0 43.053 9.354 22.315 +7MG O6 O O 0 44.218 9.367 21.927 +7MG N1 N NR16 0 42.512 8.199 22.893 +7MG C2 C CR6 0 41.228 8.062 23.362 +7MG N2 N NH2 0 40.894 6.876 23.884 +7MG N3 N NRD6 0 40.334 9.040 23.317 +7MG C4 C CR56 0 40.795 10.194 22.764 +7MG CM7 C CH3 0 43.334 12.377 21.203 +7MG "H5'" H H 0 36.065 9.964 20.533 +7MG "H5''" H H 0 35.148 11.275 20.664 +7MG "H4'" H H 0 35.901 10.557 22.768 +7MG "H3'" H H 0 36.091 13.140 22.099 +7MG "HO3'" H H 0 36.051 13.402 24.323 +7MG "H2'" H H 0 38.278 13.222 21.823 +7MG "HO2'" H H 0 39.220 13.942 23.778 +7MG "H1'" H H 0 38.572 11.340 23.987 +7MG H81 H H 0 40.524 12.630 21.083 +7MG H82 H H 0 40.988 13.166 22.507 +7MG HN1 H H 0 43.041 7.506 22.961 +7MG HN21 H H 0 40.414 6.841 24.617 +7MG HN22 H H 0 41.156 6.137 23.490 +7MG HM71 H H 0 44.116 11.808 21.264 +7MG HM72 H H 0 43.505 13.205 21.682 +7MG HM73 H H 0 43.157 12.579 20.269 + +loop_ +_chem_comp_bond.comp_id +_chem_comp_bond.atom_id_1 +_chem_comp_bond.atom_id_2 +_chem_comp_bond.type +_chem_comp_bond.aromatic +_chem_comp_bond.value_dist_nucleus +_chem_comp_bond.value_dist_nucleus_esd +_chem_comp_bond.value_dist +_chem_comp_bond.value_dist_esd +7MG P OP1 DOUBLE n 1.517 0.0192 1.517 0.0192 +7MG P OP2 SINGLE n 1.517 0.0192 1.517 0.0192 +7MG P OP3 SINGLE n 1.517 0.0192 1.517 0.0192 +7MG P "O5'" SINGLE n 1.614 0.0178 1.614 0.0178 +7MG "O5'" "C5'" SINGLE n 1.450 0.0166 1.450 0.0166 +7MG "C5'" "C4'" SINGLE n 1.509 0.0100 1.509 0.0100 +7MG "C4'" "O4'" SINGLE n 1.450 0.0100 1.450 0.0100 +7MG "C4'" "C3'" SINGLE n 1.535 0.0100 1.535 0.0100 +7MG "O4'" "C1'" SINGLE n 1.416 0.0117 1.416 0.0117 +7MG "C3'" "O3'" SINGLE n 1.422 0.0100 1.422 0.0100 +7MG "C3'" "C2'" SINGLE n 1.517 0.0200 1.517 0.0200 +7MG "C2'" "O2'" SINGLE n 1.412 0.0200 1.412 0.0200 +7MG "C2'" "C1'" SINGLE n 1.529 0.0100 1.529 0.0100 +7MG "C1'" N9 SINGLE n 1.466 0.0175 1.466 0.0175 +7MG N9 C8 SINGLE n 1.461 0.0141 1.461 0.0141 +7MG N9 C4 SINGLE n 1.376 0.0200 1.376 0.0200 +7MG C8 N7 SINGLE n 1.461 0.0141 1.461 0.0141 +7MG N7 C5 SINGLE n 1.405 0.0200 1.405 0.0200 +7MG N7 CM7 SINGLE n 1.453 0.0100 1.453 0.0100 +7MG C5 C6 SINGLE y 1.393 0.0169 1.393 0.0169 +7MG C5 C4 DOUBLE y 1.389 0.0200 1.389 0.0200 +7MG C6 O6 DOUBLE n 1.228 0.0131 1.228 0.0131 +7MG C6 N1 SINGLE y 1.394 0.0121 1.394 0.0121 +7MG N1 C2 SINGLE y 1.371 0.0108 1.371 0.0108 +7MG C2 N2 SINGLE n 1.337 0.0113 1.337 0.0113 +7MG C2 N3 DOUBLE y 1.323 0.0117 1.323 0.0117 +7MG N3 C4 SINGLE y 1.348 0.0185 1.348 0.0185 +7MG "C5'" "H5'" SINGLE n 1.089 0.0100 0.989 0.0200 +7MG "C5'" "H5''" SINGLE n 1.089 0.0100 0.989 0.0200 +7MG "C4'" "H4'" SINGLE n 1.089 0.0100 0.981 0.0200 +7MG "C3'" "H3'" SINGLE n 1.089 0.0100 0.992 0.0200 +7MG "O3'" "HO3'" SINGLE n 0.970 0.0120 0.849 0.0200 +7MG "C2'" "H2'" SINGLE n 1.089 0.0100 0.981 0.0200 +7MG "O2'" "HO2'" SINGLE n 0.970 0.0120 0.849 0.0200 +7MG "C1'" "H1'" SINGLE n 1.089 0.0100 0.987 0.0200 +7MG C8 H81 SINGLE n 1.089 0.0100 0.970 0.0140 +7MG C8 H82 SINGLE n 1.089 0.0100 0.970 0.0140 +7MG N1 HN1 SINGLE n 1.016 0.0100 0.873 0.0200 +7MG N2 HN21 SINGLE n 1.016 0.0100 0.877 0.0200 +7MG N2 HN22 SINGLE n 1.016 0.0100 0.877 0.0200 +7MG CM7 HM71 SINGLE n 1.089 0.0100 0.972 0.0143 +7MG CM7 HM72 SINGLE n 1.089 0.0100 0.972 0.0143 +7MG CM7 HM73 SINGLE n 1.089 0.0100 0.972 0.0143 + +loop_ +_chem_comp_angle.comp_id +_chem_comp_angle.atom_id_1 +_chem_comp_angle.atom_id_2 +_chem_comp_angle.atom_id_3 +_chem_comp_angle.value_angle +_chem_comp_angle.value_angle_esd +7MG OP1 P OP2 112.864 1.69 +7MG OP1 P OP3 112.864 1.69 +7MG OP1 P "O5'" 105.808 2.07 +7MG OP2 P OP3 112.864 1.69 +7MG OP2 P "O5'" 105.808 2.07 +7MG OP3 P "O5'" 105.808 2.07 +7MG P "O5'" "C5'" 118.783 1.50 +7MG "O5'" "C5'" "C4'" 109.342 1.50 +7MG "O5'" "C5'" "H5'" 109.845 1.50 +7MG "O5'" "C5'" "H5''" 109.845 1.50 +7MG "C4'" "C5'" "H5'" 109.624 1.50 +7MG "C4'" "C5'" "H5''" 109.624 1.50 +7MG "H5'" "C5'" "H5''" 108.472 1.50 +7MG "C5'" "C4'" "O4'" 109.123 1.50 +7MG "C5'" "C4'" "C3'" 116.008 1.52 +7MG "C5'" "C4'" "H4'" 108.268 1.50 +7MG "O4'" "C4'" "C3'" 104.641 1.82 +7MG "O4'" "C4'" "H4'" 110.466 2.90 +7MG "C3'" "C4'" "H4'" 109.363 1.86 +7MG "C4'" "O4'" "C1'" 109.585 1.50 +7MG "C4'" "C3'" "O3'" 111.281 2.46 +7MG "C4'" "C3'" "C2'" 101.879 2.07 +7MG "C4'" "C3'" "H3'" 110.452 2.54 +7MG "O3'" "C3'" "C2'" 114.431 3.00 +7MG "O3'" "C3'" "H3'" 110.380 1.67 +7MG "C2'" "C3'" "H3'" 107.880 2.97 +7MG "C3'" "O3'" "HO3'" 108.744 3.00 +7MG "C3'" "C2'" "O2'" 112.637 3.00 +7MG "C3'" "C2'" "C1'" 101.599 1.50 +7MG "C3'" "C2'" "H2'" 111.559 3.00 +7MG "O2'" "C2'" "C1'" 107.625 3.00 +7MG "O2'" "C2'" "H2'" 111.144 3.00 +7MG "C1'" "C2'" "H2'" 111.470 3.00 +7MG "C2'" "O2'" "HO2'" 112.841 3.00 +7MG "O4'" "C1'" "C2'" 106.883 1.50 +7MG "O4'" "C1'" N9 109.703 1.83 +7MG "O4'" "C1'" "H1'" 108.522 3.00 +7MG "C2'" "C1'" N9 113.039 1.91 +7MG "C2'" "C1'" "H1'" 111.147 3.00 +7MG N9 "C1'" "H1'" 110.672 1.50 +7MG "C1'" N9 C8 124.243 2.92 +7MG "C1'" N9 C4 126.514 3.00 +7MG C8 N9 C4 109.243 1.81 +7MG N9 C8 N7 102.166 2.68 +7MG N9 C8 H81 111.296 1.50 +7MG N9 C8 H82 111.296 1.50 +7MG N7 C8 H81 111.296 1.50 +7MG N7 C8 H82 111.296 1.50 +7MG H81 C8 H82 111.548 2.37 +7MG C8 N7 C5 111.115 1.81 +7MG C8 N7 CM7 122.962 1.87 +7MG C5 N7 CM7 125.923 1.74 +7MG N7 C5 C6 130.345 1.50 +7MG N7 C5 C4 109.346 2.06 +7MG C6 C5 C4 120.309 1.50 +7MG C5 C6 O6 128.640 1.50 +7MG C5 C6 N1 110.185 1.50 +7MG O6 C6 N1 121.175 1.50 +7MG C6 N1 C2 125.932 1.50 +7MG C6 N1 HN1 116.880 1.50 +7MG C2 N1 HN1 117.188 1.50 +7MG N1 C2 N2 116.451 1.50 +7MG N1 C2 N3 123.751 1.50 +7MG N2 C2 N3 119.799 1.50 +7MG C2 N2 HN21 119.815 1.50 +7MG C2 N2 HN22 119.815 1.50 +7MG HN21 N2 HN22 120.371 1.96 +7MG C2 N3 C4 114.279 1.50 +7MG N9 C4 C5 107.842 2.06 +7MG N9 C4 N3 126.614 1.94 +7MG C5 C4 N3 125.545 1.50 +7MG N7 CM7 HM71 109.783 1.50 +7MG N7 CM7 HM72 109.783 1.50 +7MG N7 CM7 HM73 109.783 1.50 +7MG HM71 CM7 HM72 109.459 1.50 +7MG HM71 CM7 HM73 109.459 1.50 +7MG HM72 CM7 HM73 109.459 1.50 + +loop_ +_chem_comp_tor.comp_id +_chem_comp_tor.id +_chem_comp_tor.atom_id_1 +_chem_comp_tor.atom_id_2 +_chem_comp_tor.atom_id_3 +_chem_comp_tor.atom_id_4 +_chem_comp_tor.value_angle +_chem_comp_tor.value_angle_esd +_chem_comp_tor.period +7MG C2e-chi "O4'" "C1'" N9 C4 210.000 10.000 6 +7MG C2e-nyu0 "C4'" "O4'" "C1'" "C2'" 340.700 6.300 1 +7MG C2e-nyu1 "O4'" "C1'" "C2'" "C3'" 32.800 4.900 1 +7MG C2e-nyu2 "C1'" "C2'" "C3'" "C4'" 326.9 3.600 1 +7MG C2e-nyu3 "C2'" "C3'" "C4'" "O4'" 22.600 4.500 1 +7MG C2e-nyu4 "C3'" "C4'" "O4'" "C1'" 357.700 6.100 1 +7MG C3e-chi "O4'" "C1'" N9 C4 210.000 10.000 6 +7MG C3e-nyu0 "C4'" "O4'" "C1'" "C2'" 2.8 6.100 1 +7MG C3e-nyu1 "O4'" "C1'" "C2'" "C3'" 335.00 4.900 1 +7MG C3e-nyu2 "C1'" "C2'" "C3'" "C4'" 35.9 2.800 1 +7MG C3e-nyu3 "C2'" "C3'" "C4'" "O4'" 324.700 3.100 1 +7MG C3e-nyu4 "C3'" "C4'" "O4'" "C1'" 20.500 5.100 1 +7MG alpha "C5'" "O5'" P OP3 -60.000 10.00 3 +7MG beta P "O5'" "C5'" "C4'" 180.000 10.00 3 +7MG epsi "C4'" "C3'" "O3'" "HO3'" 180.000 10.00 3 +7MG gamma "O5'" "C5'" "C4'" "C3'" 180.000 10.00 3 +7MG sp3_sp3_52 "C3'" "C2'" "O2'" "HO2'" 180.000 10.00 3 +7MG sp2_sp3_4 "C1'" N9 C8 N7 180.000 10.0 6 +7MG sp2_sp2_6 C5 C4 N9 "C1'" 180.000 5.0 2 +7MG sp2_sp3_10 CM7 N7 C8 N9 180.000 10.0 6 +7MG sp2_sp2_4 C6 C5 N7 CM7 0.000 5.0 2 +7MG sp2_sp3_19 C8 N7 CM7 HM71 150.000 10.0 6 +7MG const_sp2_sp2_4 N7 C5 C6 O6 0.000 5.0 2 +7MG const_17 N9 C4 C5 N7 0.000 10.0 2 +7MG const_sp2_sp2_7 O6 C6 N1 C2 180.000 5.0 2 +7MG const_11 N2 C2 N1 C6 180.000 10.0 2 +7MG sp2_sp2_9 N1 C2 N2 HN21 180.000 5.0 2 +7MG const_14 N2 C2 N3 C4 180.000 10.0 2 +7MG const_16 N9 C4 N3 C2 180.000 10.0 2 + +loop_ +_chem_comp_chir.comp_id +_chem_comp_chir.id +_chem_comp_chir.atom_id_centre +_chem_comp_chir.atom_id_1 +_chem_comp_chir.atom_id_2 +_chem_comp_chir.atom_id_3 +_chem_comp_chir.volume_sign +7MG chir_1 P "O5'" OP2 OP3 both +7MG chir_2 "C4'" "O4'" "C3'" "C5'" negative +7MG chir_3 "C3'" "O3'" "C4'" "C2'" positive +7MG chir_4 "C2'" "O2'" "C1'" "C3'" negative +7MG chir_5 "C1'" "O4'" N9 "C2'" negative + +loop_ +_chem_comp_plane_atom.comp_id +_chem_comp_plane_atom.plane_id +_chem_comp_plane_atom.atom_id +_chem_comp_plane_atom.dist_esd +7MG plan-1 C2 0.020 +7MG plan-1 C4 0.020 +7MG plan-1 C5 0.020 +7MG plan-1 C6 0.020 +7MG plan-1 HN1 0.020 +7MG plan-1 N1 0.020 +7MG plan-1 N2 0.020 +7MG plan-1 N3 0.020 +7MG plan-1 N7 0.020 +7MG plan-1 N9 0.020 +7MG plan-1 O6 0.020 +7MG plan-2 "C1'" 0.020 +7MG plan-2 C4 0.020 +7MG plan-2 C8 0.020 +7MG plan-2 N9 0.020 +7MG plan-3 C5 0.020 +7MG plan-3 C8 0.020 +7MG plan-3 CM7 0.020 +7MG plan-3 N7 0.020 +7MG plan-4 C2 0.020 +7MG plan-4 HN21 0.020 +7MG plan-4 HN22 0.020 +7MG plan-4 N2 0.020 + +loop_ +_pdbx_chem_comp_descriptor.comp_id +_pdbx_chem_comp_descriptor.type +_pdbx_chem_comp_descriptor.program +_pdbx_chem_comp_descriptor.program_version +_pdbx_chem_comp_descriptor.descriptor +7MG SMILES ACDLabs 10.04 O=C1C=2N(CN(C=2N=C(N)N1)C3OC(C(O)C3O)COP(=O)(O)O)C +7MG SMILES_CANONICAL CACTVS 3.341 CN1CN([C@@H]2O[C@H](CO[P](O)(O)=O)[C@@H](O)[C@H]2O)C3=C1C(=O)NC(=N3)N +7MG SMILES CACTVS 3.341 CN1CN([CH]2O[CH](CO[P](O)(O)=O)[CH](O)[CH]2O)C3=C1C(=O)NC(=N3)N +7MG SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 CN1CN(C2=C1C(=O)NC(=N2)N)[C@H]3[C@@H]([C@@H]([C@H](O3)COP(=O)(O)O)O)O +7MG SMILES "OpenEye OEToolkits" 1.5.0 CN1CN(C2=C1C(=O)NC(=N2)N)C3C(C(C(O3)COP(=O)(O)O)O)O +7MG InChI InChI 1.03 InChI=1S/C11H18N5O8P/c1-15-3-16(8-5(15)9(19)14-11(12)13-8)10-7(18)6(17)4(24-10)2-23-25(20,21)22/h4,6-7,10,17-18H,2-3H2,1H3,(H2,20,21,22)(H3,12,13,14,19)/t4-,6-,7-,10-/m1/s1 +7MG InChIKey InChI 1.03 ZMWJGXGSWZFZPJ-KQYNXXCUSA-N + +loop_ +_pdbx_chem_comp_description_generator.comp_id +_pdbx_chem_comp_description_generator.program_name +_pdbx_chem_comp_description_generator.program_version +_pdbx_chem_comp_description_generator.descriptor +7MG acedrg 243 "dictionary generator" +7MG acedrg_database 11 "data source" +7MG rdkit 2017.03.2 "Chemoinformatics tool" +7MG refmac5 5.8.0238 "optimization tool" diff --git a/image_analysis/structure_refinement/monomers/A.cif b/image_analysis/structure_refinement/monomers/A.cif new file mode 100644 index 000000000..613cc0cea --- /dev/null +++ b/image_analysis/structure_refinement/monomers/A.cif @@ -0,0 +1,271 @@ +# +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +A A "ADENOSINE-5'-MONOPHOSPHATE" RNA 35 23 . +# +data_comp_A +# +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +A OP3 O OP -1 22.184 9.416 -6.467 +A P P P 0 23.061 10.073 -7.517 +A OP1 O O 0 22.426 10.079 -8.894 +A OP2 O OP -1 24.478 9.532 -7.523 +A "O5'" O O2 0 23.184 11.622 -7.081 +A "C5'" C CH2 0 23.997 12.510 -7.889 +A "C4'" C CH1 0 23.959 13.900 -7.302 +A "O4'" O O2 0 24.489 13.865 -5.952 +A "C3'" C CH1 0 24.795 14.957 -8.033 +A "O3'" O OH1 0 24.040 15.590 -9.060 +A "C2'" C CH1 0 25.162 15.917 -6.899 +A "O2'" O OH1 0 24.142 16.849 -6.609 +A "C1'" C CH1 0 25.367 14.950 -5.735 +A N9 N NR5 0 26.737 14.457 -5.612 +A C8 C CR15 0 27.206 13.184 -5.839 +A N7 N NRD5 0 28.493 13.056 -5.636 +A C5 C CR56 0 28.908 14.321 -5.248 +A C6 C CR6 0 30.172 14.840 -4.890 +A N6 N NH2 0 31.287 14.114 -4.866 +A N1 N NRD6 0 30.240 16.155 -4.553 +A C2 C CR16 0 29.111 16.881 -4.579 +A N3 N NRD6 0 27.874 16.499 -4.898 +A C4 C CR56 0 27.833 15.193 -5.227 +A "H5'" H H 0 23.653 12.531 -8.815 +A "H5''" H H 0 24.931 12.185 -7.909 +A "H4'" H H 0 23.023 14.194 -7.269 +A "H3'" H H 0 25.613 14.544 -8.414 +A "HO3'" H H 0 24.512 16.204 -9.407 +A "H2'" H H 0 26.008 16.394 -7.110 +A "HO2'" H H 0 24.469 17.486 -6.152 +A "H1'" H H 0 25.116 15.407 -4.901 +A H8 H H 0 26.656 12.471 -6.115 +A H61 H H 0 31.972 14.381 -4.386 +A H62 H H 0 31.333 13.371 -5.331 +A H2 H H 0 29.207 17.789 -4.337 +loop_ +_chem_comp_bond.comp_id +_chem_comp_bond.atom_id_1 +_chem_comp_bond.atom_id_2 +_chem_comp_bond.type +_chem_comp_bond.aromatic +_chem_comp_bond.value_dist_nucleus +_chem_comp_bond.value_dist_nucleus_esd +_chem_comp_bond.value_dist +_chem_comp_bond.value_dist_esd +A OP3 P SINGLE n 1.517 0.0192 1.517 0.0192 +A P OP1 DOUBLE n 1.517 0.0192 1.517 0.0192 +A P OP2 SINGLE n 1.517 0.0192 1.517 0.0192 +A P "O5'" SINGLE n 1.614 0.0178 1.614 0.0178 +A "O5'" "C5'" SINGLE n 1.450 0.0166 1.450 0.0166 +A "C5'" "C4'" SINGLE n 1.509 0.0100 1.509 0.0100 +A "C4'" "O4'" SINGLE n 1.451 0.0100 1.451 0.0100 +A "C4'" "C3'" SINGLE n 1.535 0.0100 1.535 0.0100 +A "O4'" "C1'" SINGLE n 1.409 0.0100 1.409 0.0100 +A "C3'" "O3'" SINGLE n 1.422 0.0100 1.422 0.0100 +A "C3'" "C2'" SINGLE n 1.531 0.0100 1.531 0.0100 +A "C2'" "O2'" SINGLE n 1.411 0.0100 1.411 0.0100 +A "C2'" "C1'" SINGLE n 1.525 0.0100 1.525 0.0100 +A "C1'" N9 SINGLE n 1.458 0.0100 1.458 0.0100 +A N9 C8 SINGLE y 1.372 0.0100 1.372 0.0100 +A N9 C4 SINGLE y 1.374 0.0101 1.374 0.0101 +A C8 N7 DOUBLE y 1.310 0.0100 1.310 0.0100 +A N7 C5 SINGLE y 1.388 0.0100 1.388 0.0100 +A C5 C6 SINGLE y 1.408 0.0100 1.408 0.0100 +A C5 C4 DOUBLE y 1.381 0.0100 1.381 0.0100 +A C6 N6 SINGLE n 1.330 0.0100 1.330 0.0100 +A C6 N1 DOUBLE y 1.354 0.0100 1.354 0.0100 +A N1 C2 SINGLE y 1.339 0.0100 1.339 0.0100 +A C2 N3 DOUBLE y 1.330 0.0100 1.330 0.0100 +A N3 C4 SINGLE y 1.343 0.0100 1.343 0.0100 +A "C5'" "H5'" SINGLE n 1.089 0.0100 0.989 0.0200 +A "C5'" "H5''" SINGLE n 1.089 0.0100 0.989 0.0200 +A "C4'" "H4'" SINGLE n 1.089 0.0100 0.981 0.0200 +A "C3'" "H3'" SINGLE n 1.089 0.0100 0.992 0.0200 +A "O3'" "HO3'" SINGLE n 0.970 0.0120 0.849 0.0200 +A "C2'" "H2'" SINGLE n 1.089 0.0100 0.994 0.0200 +A "O2'" "HO2'" SINGLE n 0.970 0.0120 0.849 0.0200 +A "C1'" "H1'" SINGLE n 1.089 0.0100 0.984 0.0200 +A C8 H8 SINGLE n 1.082 0.0130 0.942 0.0170 +A N6 H61 SINGLE n 1.016 0.0100 0.877 0.0200 +A N6 H62 SINGLE n 1.016 0.0100 0.877 0.0200 +A C2 H2 SINGLE n 1.082 0.0130 0.945 0.0200 +loop_ +_chem_comp_angle.comp_id +_chem_comp_angle.atom_id_1 +_chem_comp_angle.atom_id_2 +_chem_comp_angle.atom_id_3 +_chem_comp_angle.value_angle +_chem_comp_angle.value_angle_esd +A OP3 P OP1 112.864 1.69 +A OP3 P OP2 112.864 1.69 +A OP3 P "O5'" 105.808 2.07 +A OP1 P OP2 112.864 1.69 +A OP1 P "O5'" 105.808 2.07 +A OP2 P "O5'" 105.808 2.07 +A P "O5'" "C5'" 118.783 1.50 +A "O5'" "C5'" "C4'" 109.342 1.50 +A "O5'" "C5'" "H5'" 109.845 1.50 +A "O5'" "C5'" "H5''" 109.845 1.50 +A "C4'" "C5'" "H5'" 109.624 1.50 +A "C4'" "C5'" "H5''" 109.624 1.50 +A "H5'" "C5'" "H5''" 108.472 1.50 +A "C5'" "C4'" "O4'" 109.123 1.50 +A "C5'" "C4'" "C3'" 116.008 1.52 +A "C5'" "C4'" "H4'" 108.268 1.50 +A "O4'" "C4'" "C3'" 105.388 1.50 +A "O4'" "C4'" "H4'" 108.947 1.50 +A "C3'" "C4'" "H4'" 109.363 1.86 +A "C4'" "O4'" "C1'" 109.903 1.50 +A "C4'" "C3'" "O3'" 111.281 2.46 +A "C4'" "C3'" "C2'" 102.602 1.50 +A "C4'" "C3'" "H3'" 110.452 2.54 +A "O3'" "C3'" "C2'" 111.581 2.83 +A "O3'" "C3'" "H3'" 110.380 1.67 +A "C2'" "C3'" "H3'" 110.504 1.75 +A "C3'" "O3'" "HO3'" 108.744 3.00 +A "C3'" "C2'" "O2'" 112.782 2.45 +A "C3'" "C2'" "C1'" 101.239 1.50 +A "C3'" "C2'" "H2'" 110.596 1.51 +A "O2'" "C2'" "C1'" 111.715 2.69 +A "O2'" "C2'" "H2'" 110.448 1.97 +A "C1'" "C2'" "H2'" 110.636 1.70 +A "C2'" "O2'" "HO2'" 109.103 2.13 +A "O4'" "C1'" "C2'" 106.047 1.50 +A "O4'" "C1'" N9 108.477 1.50 +A "O4'" "C1'" "H1'" 109.807 1.50 +A "C2'" "C1'" N9 113.824 1.50 +A "C2'" "C1'" "H1'" 109.015 1.50 +A N9 "C1'" "H1'" 109.561 1.50 +A "C1'" N9 C8 126.848 1.91 +A "C1'" N9 C4 127.459 1.80 +A C8 N9 C4 105.693 1.50 +A N9 C8 N7 113.469 1.50 +A N9 C8 H8 123.206 1.50 +A N7 C8 H8 123.326 1.50 +A C8 N7 C5 104.739 1.50 +A N7 C5 C6 132.250 1.50 +A N7 C5 C4 110.483 1.50 +A C6 C5 C4 117.267 1.50 +A C5 C6 N6 123.792 1.50 +A C5 C6 N1 117.409 1.50 +A N6 C6 N1 118.799 1.50 +A C6 N6 H61 119.723 1.50 +A C6 N6 H62 119.723 1.50 +A H61 N6 H62 120.554 1.88 +A C6 N1 C2 118.521 1.50 +A N1 C2 N3 129.332 1.50 +A N1 C2 H2 115.313 1.50 +A N3 C2 H2 115.355 1.50 +A C2 N3 C4 110.982 1.50 +A N9 C4 C5 105.616 1.50 +A N9 C4 N3 127.895 1.50 +A C5 C4 N3 126.489 1.50 +loop_ +_chem_comp_tor.comp_id +_chem_comp_tor.id +_chem_comp_tor.atom_id_1 +_chem_comp_tor.atom_id_2 +_chem_comp_tor.atom_id_3 +_chem_comp_tor.atom_id_4 +_chem_comp_tor.value_angle +_chem_comp_tor.value_angle_esd +_chem_comp_tor.period +A C2e-chi "O4'" "C1'" N9 C4 210.000 10.000 6 +A C2e-nyu0 "C4'" "O4'" "C1'" "C2'" 340.700 6.300 1 +A C2e-nyu1 "O4'" "C1'" "C2'" "C3'" 32.800 4.900 1 +A C2e-nyu2 "C1'" "C2'" "C3'" "C4'" 326.9 3.600 1 +A C2e-nyu3 "C2'" "C3'" "C4'" "O4'" 22.600 4.500 1 +A C2e-nyu4 "C3'" "C4'" "O4'" "C1'" 357.700 6.100 1 +A C3e-chi "O4'" "C1'" N9 C4 210.000 10.000 6 +A C3e-nyu0 "C4'" "O4'" "C1'" "C2'" 2.8 6.100 1 +A C3e-nyu1 "O4'" "C1'" "C2'" "C3'" 335.00 4.900 1 +A C3e-nyu2 "C1'" "C2'" "C3'" "C4'" 35.9 2.800 1 +A C3e-nyu3 "C2'" "C3'" "C4'" "O4'" 324.700 3.100 1 +A C3e-nyu4 "C3'" "C4'" "O4'" "C1'" 20.500 5.100 1 +A alpha "C5'" "O5'" P OP3 -60.000 10.00 3 +A beta P "O5'" "C5'" "C4'" 180.000 10.00 3 +A epsi "C4'" "C3'" "O3'" "HO3'" 180.000 10.00 3 +A gamma "O5'" "C5'" "C4'" "C3'" 180.000 10.00 3 +A sp3_sp3_52 "C3'" "C2'" "O2'" "HO2'" 180.000 10.00 3 +A const_14 N7 C8 N9 "C1'" 180.000 10.0 2 +A const_26 C5 C4 N9 "C1'" 180.000 10.0 2 +A const_17 N9 C8 N7 C5 0.000 10.0 2 +A const_20 C6 C5 N7 C8 180.000 10.0 2 +A const_sp2_sp2_4 N7 C5 C6 N6 0.000 5.0 2 +A const_21 N9 C4 C5 N7 0.000 10.0 2 +A sp2_sp2_1 C5 C6 N6 H61 180.000 5.0 2 +A const_sp2_sp2_6 N6 C6 N1 C2 180.000 5.0 2 +A const_sp2_sp2_7 N3 C2 N1 C6 0.000 5.0 2 +A const_sp2_sp2_9 N1 C2 N3 C4 0.000 5.0 2 +A const_12 N9 C4 N3 C2 180.000 10.0 2 +loop_ +_chem_comp_chir.comp_id +_chem_comp_chir.id +_chem_comp_chir.atom_id_centre +_chem_comp_chir.atom_id_1 +_chem_comp_chir.atom_id_2 +_chem_comp_chir.atom_id_3 +_chem_comp_chir.volume_sign +A chir_1 P "O5'" OP3 OP2 both +A chir_2 "C4'" "O4'" "C3'" "C5'" negative +A chir_3 "C3'" "O3'" "C4'" "C2'" positive +A chir_4 "C2'" "O2'" "C1'" "C3'" negative +A chir_5 "C1'" "O4'" N9 "C2'" negative +loop_ +_chem_comp_plane_atom.comp_id +_chem_comp_plane_atom.plane_id +_chem_comp_plane_atom.atom_id +_chem_comp_plane_atom.dist_esd +A plan-1 "C1'" 0.020 +A plan-1 C2 0.020 +A plan-1 C4 0.020 +A plan-1 C5 0.020 +A plan-1 C6 0.020 +A plan-1 C8 0.020 +A plan-1 H2 0.020 +A plan-1 H8 0.020 +A plan-1 N1 0.020 +A plan-1 N3 0.020 +A plan-1 N6 0.020 +A plan-1 N7 0.020 +A plan-1 N9 0.020 +A plan-2 C6 0.020 +A plan-2 H61 0.020 +A plan-2 H62 0.020 +A plan-2 N6 0.020 +loop_ +_pdbx_chem_comp_descriptor.comp_id +_pdbx_chem_comp_descriptor.type +_pdbx_chem_comp_descriptor.program +_pdbx_chem_comp_descriptor.program_version +_pdbx_chem_comp_descriptor.descriptor +A SMILES ACDLabs 10.04 O=P(O)(O)OCC3OC(n2cnc1c(ncnc12)N)C(O)C3O +A SMILES_CANONICAL CACTVS 3.341 Nc1ncnc2n(cnc12)[C@@H]3O[C@H](CO[P](O)(O)=O)[C@@H](O)[C@H]3O +A SMILES CACTVS 3.341 Nc1ncnc2n(cnc12)[CH]3O[CH](CO[P](O)(O)=O)[CH](O)[CH]3O +A SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 c1nc(c2c(n1)n(cn2)[C@H]3[C@@H]([C@@H]([C@H](O3)COP(=O)(O)O)O)O)N +A SMILES "OpenEye OEToolkits" 1.5.0 c1nc(c2c(n1)n(cn2)C3C(C(C(O3)COP(=O)(O)O)O)O)N +A InChI InChI 1.03 InChI=1S/C10H14N5O7P/c11-8-5-9(13-2-12-8)15(3-14-5)10-7(17)6(16)4(22-10)1-21-23(18,19)20/h2-4,6-7,10,16-17H,1H2,(H2,11,12,13)(H2,18,19,20)/t4-,6-,7-,10-/m1/s1 +A InChIKey InChI 1.03 UDMBCSSLTHHNCD-KQYNXXCUSA-N +loop_ +_pdbx_chem_comp_description_generator.comp_id +_pdbx_chem_comp_description_generator.program_name +_pdbx_chem_comp_description_generator.program_version +_pdbx_chem_comp_description_generator.descriptor +A acedrg 243 "dictionary generator" +A acedrg_database 11 "data source" +A rdkit 2017.03.2 "Chemoinformatics tool" +A refmac5 5.8.0238 "optimization tool" diff --git a/image_analysis/structure_refinement/monomers/ACT.cif b/image_analysis/structure_refinement/monomers/ACT.cif new file mode 100644 index 000000000..c46c46947 --- /dev/null +++ b/image_analysis/structure_refinement/monomers/ACT.cif @@ -0,0 +1,104 @@ +# +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +ACT ACT "ACETATE ION" NON-POLYMER 7 4 . +# +data_comp_ACT +# +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +ACT C C C 0 50.652 -7.080 41.537 +ACT O O O 0 50.915 -7.323 42.732 +ACT OXT O OC -1 51.516 -6.945 40.648 +ACT CH3 C CH3 0 49.181 -6.939 41.139 +ACT H1 H H 0 49.117 -6.760 40.187 +ACT H2 H H 0 48.780 -6.205 41.632 +ACT H3 H H 0 48.708 -7.761 41.345 +loop_ +_chem_comp_bond.comp_id +_chem_comp_bond.atom_id_1 +_chem_comp_bond.atom_id_2 +_chem_comp_bond.type +_chem_comp_bond.aromatic +_chem_comp_bond.value_dist_nucleus +_chem_comp_bond.value_dist_nucleus_esd +_chem_comp_bond.value_dist +_chem_comp_bond.value_dist_esd +ACT C O DOUBLE n 1.247 0.0187 1.247 0.0187 +ACT C OXT SINGLE n 1.247 0.0187 1.247 0.0187 +ACT C CH3 SINGLE n 1.530 0.0200 1.530 0.0200 +ACT CH3 H1 SINGLE n 1.089 0.0100 0.971 0.0140 +ACT CH3 H2 SINGLE n 1.089 0.0100 0.971 0.0140 +ACT CH3 H3 SINGLE n 1.089 0.0100 0.971 0.0140 +loop_ +_chem_comp_angle.comp_id +_chem_comp_angle.atom_id_1 +_chem_comp_angle.atom_id_2 +_chem_comp_angle.atom_id_3 +_chem_comp_angle.value_angle +_chem_comp_angle.value_angle_esd +ACT O C OXT 123.884 1.50 +ACT O C CH3 118.052 1.94 +ACT OXT C CH3 118.052 1.94 +ACT C CH3 H1 109.670 1.50 +ACT C CH3 H2 109.670 1.50 +ACT C CH3 H3 109.670 1.50 +ACT H1 CH3 H2 109.424 1.50 +ACT H1 CH3 H3 109.424 1.50 +ACT H2 CH3 H3 109.424 1.50 +loop_ +_chem_comp_tor.comp_id +_chem_comp_tor.id +_chem_comp_tor.atom_id_1 +_chem_comp_tor.atom_id_2 +_chem_comp_tor.atom_id_3 +_chem_comp_tor.atom_id_4 +_chem_comp_tor.value_angle +_chem_comp_tor.value_angle_esd +_chem_comp_tor.period +ACT sp2_sp3_1 O C CH3 H1 0.000 10.0 6 +loop_ +_chem_comp_plane_atom.comp_id +_chem_comp_plane_atom.plane_id +_chem_comp_plane_atom.atom_id +_chem_comp_plane_atom.dist_esd +ACT plan-1 C 0.020 +ACT plan-1 CH3 0.020 +ACT plan-1 O 0.020 +ACT plan-1 OXT 0.020 +loop_ +_pdbx_chem_comp_descriptor.comp_id +_pdbx_chem_comp_descriptor.type +_pdbx_chem_comp_descriptor.program +_pdbx_chem_comp_descriptor.program_version +_pdbx_chem_comp_descriptor.descriptor +ACT SMILES ACDLabs 10.04 "[O-]C(=O)C" +ACT SMILES_CANONICAL CACTVS 3.341 CC([O-])=O +ACT SMILES CACTVS 3.341 CC([O-])=O +ACT SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 CC(=O)[O-] +ACT SMILES "OpenEye OEToolkits" 1.5.0 CC(=O)[O-] +ACT InChI InChI 1.03 InChI=1S/C2H4O2/c1-2(3)4/h1H3,(H,3,4)/p-1 +ACT InChIKey InChI 1.03 QTBSBXVTEAMEQO-UHFFFAOYSA-M +loop_ +_pdbx_chem_comp_description_generator.comp_id +_pdbx_chem_comp_description_generator.program_name +_pdbx_chem_comp_description_generator.program_version +_pdbx_chem_comp_description_generator.descriptor +ACT acedrg 243 "dictionary generator" +ACT acedrg_database 11 "data source" +ACT rdkit 2017.03.2 "Chemoinformatics tool" +ACT refmac5 5.8.0238 "optimization tool" diff --git a/image_analysis/structure_refinement/monomers/ADP.cif b/image_analysis/structure_refinement/monomers/ADP.cif new file mode 100644 index 000000000..8dd58c16f --- /dev/null +++ b/image_analysis/structure_refinement/monomers/ADP.cif @@ -0,0 +1,283 @@ +# +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +ADP ADP "ADENOSINE-5'-DIPHOSPHATE" NON-POLYMER 39 27 . +# +data_comp_ADP +# +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +ADP PB P P 0 46.212 2.934 41.132 +ADP O1B O O 0 47.352 3.648 41.816 +ADP O2B O OP -1 46.188 3.167 39.642 +ADP O3B O OP -1 46.138 1.471 41.495 +ADP PA P P 0 43.308 3.312 41.426 +ADP O1A O O 0 42.947 3.885 40.095 +ADP O2A O OP -1 43.043 1.862 41.663 +ADP O3A O O2 0 44.860 3.603 41.708 +ADP "O5'" O O2 0 42.611 4.176 42.585 +ADP "C5'" C CH2 0 42.803 5.614 42.612 +ADP "C4'" C CH1 0 41.916 6.217 43.675 +ADP "O4'" O O2 0 42.237 5.618 44.957 +ADP "C3'" C CH1 0 42.060 7.727 43.896 +ADP "O3'" O OH1 0 40.836 8.295 44.347 +ADP "C2'" C CH1 0 43.161 7.787 44.958 +ADP "O2'" O OH1 0 43.139 8.979 45.714 +ADP "C1'" C CH1 0 42.808 6.577 45.819 +ADP N9 N NR5 0 43.956 5.966 46.481 +ADP C8 C CR15 0 45.032 5.373 45.867 +ADP N7 N NRD5 0 45.919 4.902 46.707 +ADP C5 C CR56 0 45.398 5.197 47.958 +ADP C6 C CR6 0 45.872 4.953 49.266 +ADP N6 N NH2 0 47.020 4.334 49.530 +ADP N1 N NRD6 0 45.104 5.379 50.303 +ADP C2 C CR16 0 43.948 6.003 50.029 +ADP N3 N NRD6 0 43.405 6.285 48.844 +ADP C4 C CR56 0 44.184 5.853 47.833 +ADP "H5'1" H H 0 42.575 6.001 41.731 +ADP "H5'2" H H 0 43.749 5.824 42.811 +ADP "H4'" H H 0 40.984 6.008 43.451 +ADP "H3'" H H 0 42.359 8.172 43.061 +ADP "HO3'" H H 0 40.903 9.141 44.325 +ADP "H2'" H H 0 44.053 7.669 44.537 +ADP "HO2'" H H 0 43.755 8.950 46.297 +ADP "H1'" H H 0 42.146 6.850 46.493 +ADP H8 H H 0 45.124 5.315 44.932 +ADP HN61 H H 0 47.233 4.142 50.360 +ADP HN62 H H 0 47.561 4.119 48.873 +ADP H2 H H 0 43.448 6.281 50.782 +loop_ +_chem_comp_bond.comp_id +_chem_comp_bond.atom_id_1 +_chem_comp_bond.atom_id_2 +_chem_comp_bond.type +_chem_comp_bond.aromatic +_chem_comp_bond.value_dist_nucleus +_chem_comp_bond.value_dist_nucleus_esd +_chem_comp_bond.value_dist +_chem_comp_bond.value_dist_esd +ADP PB O1B DOUBLE n 1.509 0.0200 1.509 0.0200 +ADP PB O2B SINGLE n 1.509 0.0200 1.509 0.0200 +ADP PB O3B SINGLE n 1.509 0.0200 1.509 0.0200 +ADP PB O3A SINGLE n 1.614 0.0178 1.614 0.0178 +ADP PA O1A DOUBLE n 1.493 0.0122 1.493 0.0122 +ADP PA O2A SINGLE n 1.493 0.0122 1.493 0.0122 +ADP PA O3A SINGLE n 1.604 0.0133 1.604 0.0133 +ADP PA "O5'" SINGLE n 1.604 0.0133 1.604 0.0133 +ADP "O5'" "C5'" SINGLE n 1.450 0.0166 1.450 0.0166 +ADP "C5'" "C4'" SINGLE n 1.509 0.0100 1.509 0.0100 +ADP "C4'" "O4'" SINGLE n 1.451 0.0100 1.451 0.0100 +ADP "C4'" "C3'" SINGLE n 1.535 0.0100 1.535 0.0100 +ADP "O4'" "C1'" SINGLE n 1.409 0.0100 1.409 0.0100 +ADP "C3'" "O3'" SINGLE n 1.422 0.0100 1.422 0.0100 +ADP "C3'" "C2'" SINGLE n 1.531 0.0100 1.531 0.0100 +ADP "C2'" "O2'" SINGLE n 1.411 0.0100 1.411 0.0100 +ADP "C2'" "C1'" SINGLE n 1.525 0.0100 1.525 0.0100 +ADP "C1'" N9 SINGLE n 1.458 0.0100 1.458 0.0100 +ADP N9 C8 SINGLE y 1.372 0.0100 1.372 0.0100 +ADP N9 C4 SINGLE y 1.374 0.0101 1.374 0.0101 +ADP C8 N7 DOUBLE y 1.310 0.0100 1.310 0.0100 +ADP N7 C5 SINGLE y 1.388 0.0100 1.388 0.0100 +ADP C5 C6 SINGLE y 1.408 0.0100 1.408 0.0100 +ADP C5 C4 DOUBLE y 1.381 0.0100 1.381 0.0100 +ADP C6 N6 SINGLE n 1.330 0.0100 1.330 0.0100 +ADP C6 N1 DOUBLE y 1.354 0.0100 1.354 0.0100 +ADP N1 C2 SINGLE y 1.339 0.0100 1.339 0.0100 +ADP C2 N3 DOUBLE y 1.330 0.0100 1.330 0.0100 +ADP N3 C4 SINGLE y 1.343 0.0100 1.343 0.0100 +ADP "C5'" "H5'1" SINGLE n 1.089 0.0100 0.989 0.0200 +ADP "C5'" "H5'2" SINGLE n 1.089 0.0100 0.989 0.0200 +ADP "C4'" "H4'" SINGLE n 1.089 0.0100 0.981 0.0200 +ADP "C3'" "H3'" SINGLE n 1.089 0.0100 0.992 0.0200 +ADP "O3'" "HO3'" SINGLE n 0.970 0.0120 0.849 0.0200 +ADP "C2'" "H2'" SINGLE n 1.089 0.0100 0.994 0.0200 +ADP "O2'" "HO2'" SINGLE n 0.970 0.0120 0.849 0.0200 +ADP "C1'" "H1'" SINGLE n 1.089 0.0100 0.984 0.0200 +ADP C8 H8 SINGLE n 1.082 0.0130 0.942 0.0170 +ADP N6 HN61 SINGLE n 1.016 0.0100 0.877 0.0200 +ADP N6 HN62 SINGLE n 1.016 0.0100 0.877 0.0200 +ADP C2 H2 SINGLE n 1.082 0.0130 0.945 0.0200 +loop_ +_chem_comp_angle.comp_id +_chem_comp_angle.atom_id_1 +_chem_comp_angle.atom_id_2 +_chem_comp_angle.atom_id_3 +_chem_comp_angle.value_angle +_chem_comp_angle.value_angle_esd +ADP O1B PB O2B 112.716 1.50 +ADP O1B PB O3B 112.716 1.50 +ADP O1B PB O3A 105.965 2.38 +ADP O2B PB O3B 112.716 1.50 +ADP O2B PB O3A 105.965 2.38 +ADP O3B PB O3A 105.965 2.38 +ADP O1A PA O2A 118.411 2.35 +ADP O1A PA O3A 108.816 2.14 +ADP O1A PA "O5'" 109.410 1.50 +ADP O2A PA O3A 108.816 2.14 +ADP O2A PA "O5'" 109.410 1.50 +ADP O3A PA "O5'" 101.065 1.97 +ADP PB O3A PA 132.584 3.00 +ADP PA "O5'" "C5'" 118.553 2.41 +ADP "O5'" "C5'" "C4'" 109.342 1.50 +ADP "O5'" "C5'" "H5'1" 109.845 1.50 +ADP "O5'" "C5'" "H5'2" 109.845 1.50 +ADP "C4'" "C5'" "H5'1" 109.624 1.50 +ADP "C4'" "C5'" "H5'2" 109.624 1.50 +ADP "H5'1" "C5'" "H5'2" 108.472 1.50 +ADP "C5'" "C4'" "O4'" 109.123 1.50 +ADP "C5'" "C4'" "C3'" 116.008 1.52 +ADP "C5'" "C4'" "H4'" 108.268 1.50 +ADP "O4'" "C4'" "C3'" 105.388 1.50 +ADP "O4'" "C4'" "H4'" 108.947 1.50 +ADP "C3'" "C4'" "H4'" 109.363 1.86 +ADP "C4'" "O4'" "C1'" 109.903 1.50 +ADP "C4'" "C3'" "O3'" 111.281 2.46 +ADP "C4'" "C3'" "C2'" 102.602 1.50 +ADP "C4'" "C3'" "H3'" 110.452 2.54 +ADP "O3'" "C3'" "C2'" 111.581 2.83 +ADP "O3'" "C3'" "H3'" 110.380 1.67 +ADP "C2'" "C3'" "H3'" 110.504 1.75 +ADP "C3'" "O3'" "HO3'" 108.744 3.00 +ADP "C3'" "C2'" "O2'" 112.782 2.45 +ADP "C3'" "C2'" "C1'" 101.239 1.50 +ADP "C3'" "C2'" "H2'" 110.596 1.51 +ADP "O2'" "C2'" "C1'" 111.715 2.69 +ADP "O2'" "C2'" "H2'" 110.448 1.97 +ADP "C1'" "C2'" "H2'" 110.636 1.70 +ADP "C2'" "O2'" "HO2'" 109.103 2.13 +ADP "O4'" "C1'" "C2'" 106.047 1.50 +ADP "O4'" "C1'" N9 108.477 1.50 +ADP "O4'" "C1'" "H1'" 109.807 1.50 +ADP "C2'" "C1'" N9 113.824 1.50 +ADP "C2'" "C1'" "H1'" 109.015 1.50 +ADP N9 "C1'" "H1'" 109.561 1.50 +ADP "C1'" N9 C8 126.848 1.91 +ADP "C1'" N9 C4 127.459 1.80 +ADP C8 N9 C4 105.693 1.50 +ADP N9 C8 N7 113.469 1.50 +ADP N9 C8 H8 123.206 1.50 +ADP N7 C8 H8 123.326 1.50 +ADP C8 N7 C5 104.739 1.50 +ADP N7 C5 C6 132.250 1.50 +ADP N7 C5 C4 110.483 1.50 +ADP C6 C5 C4 117.267 1.50 +ADP C5 C6 N6 123.792 1.50 +ADP C5 C6 N1 117.409 1.50 +ADP N6 C6 N1 118.799 1.50 +ADP C6 N6 HN61 119.723 1.50 +ADP C6 N6 HN62 119.723 1.50 +ADP HN61 N6 HN62 120.554 1.88 +ADP C6 N1 C2 118.521 1.50 +ADP N1 C2 N3 129.332 1.50 +ADP N1 C2 H2 115.313 1.50 +ADP N3 C2 H2 115.355 1.50 +ADP C2 N3 C4 110.982 1.50 +ADP N9 C4 C5 105.616 1.50 +ADP N9 C4 N3 127.895 1.50 +ADP C5 C4 N3 126.489 1.50 +loop_ +_chem_comp_tor.comp_id +_chem_comp_tor.id +_chem_comp_tor.atom_id_1 +_chem_comp_tor.atom_id_2 +_chem_comp_tor.atom_id_3 +_chem_comp_tor.atom_id_4 +_chem_comp_tor.value_angle +_chem_comp_tor.value_angle_esd +_chem_comp_tor.period +ADP sp3_sp3_27 PA O3A PB O1B 60.000 10.0 3 +ADP sp3_sp3_2 "C5'" "C4'" "O4'" "C1'" -60.000 10.0 3 +ADP sp3_sp3_50 "O3'" "C3'" "C4'" "C5'" 180.000 10.0 3 +ADP sp3_sp3_4 "C2'" "C1'" "O4'" "C4'" -60.000 10.0 3 +ADP sp3_sp3_55 "C4'" "C3'" "O3'" "HO3'" 180.000 10.0 3 +ADP sp3_sp3_20 "O2'" "C2'" "C3'" "O3'" -60.000 10.0 3 +ADP sp3_sp3_58 "C3'" "C2'" "O2'" "HO2'" 180.000 10.0 3 +ADP sp3_sp3_8 "O4'" "C1'" "C2'" "O2'" 180.000 10.0 3 +ADP sp2_sp3_1 C8 N9 "C1'" "O4'" 150.000 10.0 6 +ADP const_14 N7 C8 N9 "C1'" 180.000 10.0 2 +ADP const_26 C5 C4 N9 "C1'" 180.000 10.0 2 +ADP const_17 N9 C8 N7 C5 0.000 10.0 2 +ADP const_20 C6 C5 N7 C8 180.000 10.0 2 +ADP const_sp2_sp2_4 N7 C5 C6 N6 0.000 5.0 2 +ADP const_21 N9 C4 C5 N7 0.000 10.0 2 +ADP sp2_sp2_1 C5 C6 N6 HN61 180.000 5.0 2 +ADP const_sp2_sp2_6 N6 C6 N1 C2 180.000 5.0 2 +ADP const_sp2_sp2_7 N3 C2 N1 C6 0.000 5.0 2 +ADP const_sp2_sp2_9 N1 C2 N3 C4 0.000 5.0 2 +ADP const_12 N9 C4 N3 C2 180.000 10.0 2 +ADP sp3_sp3_30 PB O3A PA O1A 60.000 10.0 3 +ADP sp3_sp3_33 "C5'" "O5'" PA O1A 60.000 10.0 3 +ADP sp3_sp3_34 "C4'" "C5'" "O5'" PA 180.000 10.0 3 +ADP sp3_sp3_37 "O4'" "C4'" "C5'" "O5'" 180.000 10.0 3 +loop_ +_chem_comp_chir.comp_id +_chem_comp_chir.id +_chem_comp_chir.atom_id_centre +_chem_comp_chir.atom_id_1 +_chem_comp_chir.atom_id_2 +_chem_comp_chir.atom_id_3 +_chem_comp_chir.volume_sign +ADP chir_1 PB O3A O2B O3B both +ADP chir_2 PA O3A "O5'" O2A both +ADP chir_3 "C4'" "O4'" "C3'" "C5'" negative +ADP chir_4 "C3'" "O3'" "C4'" "C2'" positive +ADP chir_5 "C2'" "O2'" "C1'" "C3'" negative +ADP chir_6 "C1'" "O4'" N9 "C2'" negative +loop_ +_chem_comp_plane_atom.comp_id +_chem_comp_plane_atom.plane_id +_chem_comp_plane_atom.atom_id +_chem_comp_plane_atom.dist_esd +ADP plan-1 "C1'" 0.020 +ADP plan-1 C2 0.020 +ADP plan-1 C4 0.020 +ADP plan-1 C5 0.020 +ADP plan-1 C6 0.020 +ADP plan-1 C8 0.020 +ADP plan-1 H2 0.020 +ADP plan-1 H8 0.020 +ADP plan-1 N1 0.020 +ADP plan-1 N3 0.020 +ADP plan-1 N6 0.020 +ADP plan-1 N7 0.020 +ADP plan-1 N9 0.020 +ADP plan-2 C6 0.020 +ADP plan-2 HN61 0.020 +ADP plan-2 HN62 0.020 +ADP plan-2 N6 0.020 +loop_ +_pdbx_chem_comp_descriptor.comp_id +_pdbx_chem_comp_descriptor.type +_pdbx_chem_comp_descriptor.program +_pdbx_chem_comp_descriptor.program_version +_pdbx_chem_comp_descriptor.descriptor +ADP SMILES ACDLabs 10.04 O=P(O)(O)OP(=O)(O)OCC3OC(n2cnc1c(ncnc12)N)C(O)C3O +ADP SMILES_CANONICAL CACTVS 3.341 Nc1ncnc2n(cnc12)[C@@H]3O[C@H](CO[P@@](O)(=O)O[P](O)(O)=O)[C@@H](O)[C@H]3O +ADP SMILES CACTVS 3.341 Nc1ncnc2n(cnc12)[CH]3O[CH](CO[P](O)(=O)O[P](O)(O)=O)[CH](O)[CH]3O +ADP SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 c1nc(c2c(n1)n(cn2)[C@H]3[C@@H]([C@@H]([C@H](O3)CO[P@](=O)(O)OP(=O)(O)O)O)O)N +ADP SMILES "OpenEye OEToolkits" 1.5.0 c1nc(c2c(n1)n(cn2)C3C(C(C(O3)COP(=O)(O)OP(=O)(O)O)O)O)N +ADP InChI InChI 1.03 InChI=1S/C10H15N5O10P2/c11-8-5-9(13-2-12-8)15(3-14-5)10-7(17)6(16)4(24-10)1-23-27(21,22)25-26(18,19)20/h2-4,6-7,10,16-17H,1H2,(H,21,22)(H2,11,12,13)(H2,18,19,20)/t4-,6-,7-,10-/m1/s1 +ADP InChIKey InChI 1.03 XTWYTFMLZFPYCI-KQYNXXCUSA-N +loop_ +_pdbx_chem_comp_description_generator.comp_id +_pdbx_chem_comp_description_generator.program_name +_pdbx_chem_comp_description_generator.program_version +_pdbx_chem_comp_description_generator.descriptor +ADP acedrg 243 "dictionary generator" +ADP acedrg_database 11 "data source" +ADP rdkit 2017.03.2 "Chemoinformatics tool" +ADP refmac5 5.8.0238 "optimization tool" diff --git a/image_analysis/structure_refinement/monomers/ALA.cif b/image_analysis/structure_refinement/monomers/ALA.cif new file mode 100644 index 000000000..be45c4253 --- /dev/null +++ b/image_analysis/structure_refinement/monomers/ALA.cif @@ -0,0 +1,182 @@ +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +ALA ALA ALANINE peptide 13 6 . + +data_comp_ALA +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +ALA N N NT3 1 2.474 26.375 12.879 +ALA CA C CH1 0 1.190 26.935 13.368 +ALA C C C 0 1.429 28.314 13.990 +ALA O O O 0 2.253 28.383 14.929 +ALA CB C CH3 0 0.557 25.983 14.359 +ALA OXT O OC -1 0.782 29.274 13.516 +ALA H H H 0 3.050 26.285 13.567 +ALA H2 H H 0 2.832 26.925 12.260 +ALA H3 H H 0 2.330 25.565 12.507 +ALA HA H H 0 0.581 27.046 12.587 +ALA HB3 H H 0 -0.324 26.308 14.608 +ALA HB2 H H 0 1.113 25.921 15.155 +ALA HB1 H H 0 0.472 25.102 13.958 + +loop_ +_chem_comp_tree.comp_id +_chem_comp_tree.atom_id +_chem_comp_tree.atom_back +_chem_comp_tree.atom_forward +_chem_comp_tree.connect_type +ALA N n/a CA START +ALA H N . . +ALA H2 N . . +ALA H3 N . . +ALA CA N C . +ALA HA CA . . +ALA CB CA HB3 . +ALA HB1 CB . . +ALA HB2 CB . . +ALA HB3 CB . . +ALA C CA . END +ALA O C . . +ALA OXT C . . + +loop_ +_chem_comp_acedrg.comp_id +_chem_comp_acedrg.atom_id +_chem_comp_acedrg.atom_type +ALA N N(CCCH)(H)3 +ALA CA C(CH3)(NH3)(COO)(H) +ALA C C(CCHN)(O)2 +ALA O O(CCO) +ALA CB C(CCHN)(H)3 +ALA OXT O(CCO) +ALA H H(NCHH) +ALA H2 H(NCHH) +ALA H3 H(NCHH) +ALA HA H(CCCN) +ALA HB3 H(CCHH) +ALA HB2 H(CCHH) +ALA HB1 H(CCHH) + +loop_ +_chem_comp_bond.comp_id +_chem_comp_bond.atom_id_1 +_chem_comp_bond.atom_id_2 +_chem_comp_bond.type +_chem_comp_bond.aromatic +_chem_comp_bond.value_dist_nucleus +_chem_comp_bond.value_dist_nucleus_esd +_chem_comp_bond.value_dist +_chem_comp_bond.value_dist_esd +ALA N CA SINGLE n 1.483 0.0100 1.483 0.0100 +ALA CA C SINGLE n 1.531 0.0100 1.531 0.0100 +ALA CA CB SINGLE n 1.513 0.0158 1.513 0.0158 +ALA C O DOUBLE n 1.251 0.0183 1.251 0.0183 +ALA C OXT SINGLE n 1.251 0.0183 1.251 0.0183 +ALA N H SINGLE n 1.018 0.0520 0.902 0.0102 +ALA N H2 SINGLE n 1.018 0.0520 0.902 0.0102 +ALA N H3 SINGLE n 1.018 0.0520 0.902 0.0102 +ALA CA HA SINGLE n 1.092 0.0100 0.997 0.0200 +ALA CB HB3 SINGLE n 1.092 0.0100 0.972 0.0148 +ALA CB HB2 SINGLE n 1.092 0.0100 0.972 0.0148 +ALA CB HB1 SINGLE n 1.092 0.0100 0.972 0.0148 + +loop_ +_chem_comp_angle.comp_id +_chem_comp_angle.atom_id_1 +_chem_comp_angle.atom_id_2 +_chem_comp_angle.atom_id_3 +_chem_comp_angle.value_angle +_chem_comp_angle.value_angle_esd +ALA CA N H 109.611 2.03 +ALA CA N H2 109.611 2.03 +ALA CA N H3 109.611 2.03 +ALA H N H2 109.032 3.00 +ALA H N H3 109.032 3.00 +ALA H2 N H3 109.032 3.00 +ALA N CA C 109.720 1.50 +ALA N CA CB 109.927 1.50 +ALA N CA HA 108.247 1.50 +ALA C CA CB 111.515 1.50 +ALA C CA HA 108.267 1.50 +ALA CB CA HA 109.172 1.57 +ALA CA C O 117.191 2.33 +ALA CA C OXT 117.191 2.33 +ALA O C OXT 125.618 1.50 +ALA CA CB HB3 109.742 1.50 +ALA CA CB HB2 109.742 1.50 +ALA CA CB HB1 109.742 1.50 +ALA HB3 CB HB2 109.365 1.60 +ALA HB3 CB HB1 109.365 1.60 +ALA HB2 CB HB1 109.365 1.60 + +loop_ +_chem_comp_tor.comp_id +_chem_comp_tor.id +_chem_comp_tor.atom_id_1 +_chem_comp_tor.atom_id_2 +_chem_comp_tor.atom_id_3 +_chem_comp_tor.atom_id_4 +_chem_comp_tor.value_angle +_chem_comp_tor.value_angle_esd +_chem_comp_tor.period +ALA hh1 N CA CB HB3 180.000 10.0 3 +ALA sp3_sp3_1 C CA N H 180.000 10.0 3 +ALA sp2_sp3_1 O C CA N 0.000 10.0 6 + +loop_ +_chem_comp_chir.comp_id +_chem_comp_chir.id +_chem_comp_chir.atom_id_centre +_chem_comp_chir.atom_id_1 +_chem_comp_chir.atom_id_2 +_chem_comp_chir.atom_id_3 +_chem_comp_chir.volume_sign +ALA chir_1 CA N C CB positive + +loop_ +_chem_comp_plane_atom.comp_id +_chem_comp_plane_atom.plane_id +_chem_comp_plane_atom.atom_id +_chem_comp_plane_atom.dist_esd +ALA plan-1 C 0.020 +ALA plan-1 CA 0.020 +ALA plan-1 O 0.020 +ALA plan-1 OXT 0.020 + +loop_ +_pdbx_chem_comp_descriptor.comp_id +_pdbx_chem_comp_descriptor.type +_pdbx_chem_comp_descriptor.program +_pdbx_chem_comp_descriptor.program_version +_pdbx_chem_comp_descriptor.descriptor +ALA SMILES ACDLabs 10.04 O=C(O)C(N)C +ALA SMILES_CANONICAL CACTVS 3.341 C[C@H](N)C(O)=O +ALA SMILES CACTVS 3.341 C[CH](N)C(O)=O +ALA SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 C[C@@H](C(=O)O)N +ALA SMILES "OpenEye OEToolkits" 1.5.0 CC(C(=O)O)N +ALA InChI InChI 1.03 InChI=1S/C3H7NO2/c1-2(4)3(5)6/h2H,4H2,1H3,(H,5,6)/t2-/m0/s1 +ALA InChIKey InChI 1.03 QNAYBMKLOCPYGJ-REOHCLBHSA-N + +loop_ +_pdbx_chem_comp_description_generator.comp_id +_pdbx_chem_comp_description_generator.program_name +_pdbx_chem_comp_description_generator.program_version +_pdbx_chem_comp_description_generator.descriptor +ALA acedrg 278 "dictionary generator" +ALA acedrg_database 12 "data source" +ALA rdkit 2019.09.1 "Chemoinformatics tool" +ALA refmac5 5.8.0419 "optimization tool" diff --git a/image_analysis/structure_refinement/monomers/AMP.cif b/image_analysis/structure_refinement/monomers/AMP.cif new file mode 100644 index 000000000..af979b28b --- /dev/null +++ b/image_analysis/structure_refinement/monomers/AMP.cif @@ -0,0 +1,279 @@ +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +AMP AMP "ADENOSINE MONOPHOSPHATE" NON-POLYMER 35 23 . + +data_comp_AMP +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +AMP P P P 0 7.785 40.217 19.087 +AMP O1P O O 0 7.126 41.546 19.404 +AMP O2P O OP -1 6.783 39.104 18.848 +AMP O3P O OP -1 8.858 39.838 20.091 +AMP "O5'" O O2 0 8.550 40.429 17.682 +AMP "C5'" C CH2 0 9.613 41.413 17.608 +AMP "C4'" C CH1 0 10.179 41.441 16.209 +AMP "O4'" O O2 0 10.693 40.125 15.878 +AMP "C3'" C CH1 0 9.188 41.799 15.089 +AMP "O3'" O OH1 0 9.786 42.675 14.141 +AMP "C2'" C CH1 0 8.844 40.434 14.483 +AMP "O2'" O OH1 0 8.453 40.504 13.128 +AMP "C1'" C CH1 0 10.173 39.703 14.640 +AMP N9 N NR5 0 10.056 38.248 14.658 +AMP C8 C CR15 0 9.355 37.497 15.568 +AMP N7 N NRD5 0 9.424 36.209 15.347 +AMP C5 C CR56 0 10.226 36.096 14.221 +AMP C6 C CR6 0 10.678 34.979 13.484 +AMP N6 N NH2 0 10.371 33.721 13.791 +AMP N1 N NRD6 0 11.469 35.215 12.406 +AMP C2 C CR16 0 11.775 36.486 12.102 +AMP N3 N NRD6 0 11.408 37.609 12.720 +AMP C4 C CR56 0 10.625 37.349 13.785 +AMP "H5'1" H H 0 10.329 41.183 18.250 +AMP "H5'2" H H 0 9.260 42.307 17.841 +AMP "H4'" H H 0 10.923 42.081 16.196 +AMP "H3'" H H 0 8.376 42.217 15.476 +AMP "HO3'" H H 0 9.174 43.023 13.667 +AMP "H2'" H H 0 8.135 39.989 15.017 +AMP "HO2'" H H 0 8.294 39.721 12.844 +AMP "H1'" H H 0 10.777 39.979 13.915 +AMP H8 H H 0 8.867 37.874 16.281 +AMP HN61 H H 0 10.832 33.060 13.441 +AMP HN62 H H 0 9.709 33.556 14.343 +AMP H2 H H 0 12.327 36.601 11.344 + +loop_ +_chem_comp_bond.comp_id +_chem_comp_bond.atom_id_1 +_chem_comp_bond.atom_id_2 +_chem_comp_bond.type +_chem_comp_bond.aromatic +_chem_comp_bond.value_dist_nucleus +_chem_comp_bond.value_dist_nucleus_esd +_chem_comp_bond.value_dist +_chem_comp_bond.value_dist_esd +AMP P O1P DOUBLE n 1.517 0.0192 1.517 0.0192 +AMP P O2P SINGLE n 1.517 0.0192 1.517 0.0192 +AMP P O3P SINGLE n 1.517 0.0192 1.517 0.0192 +AMP P "O5'" SINGLE n 1.614 0.0178 1.614 0.0178 +AMP "O5'" "C5'" SINGLE n 1.450 0.0166 1.450 0.0166 +AMP "C5'" "C4'" SINGLE n 1.509 0.0100 1.509 0.0100 +AMP "C4'" "O4'" SINGLE n 1.451 0.0100 1.451 0.0100 +AMP "C4'" "C3'" SINGLE n 1.535 0.0100 1.535 0.0100 +AMP "O4'" "C1'" SINGLE n 1.409 0.0100 1.409 0.0100 +AMP "C3'" "O3'" SINGLE n 1.422 0.0100 1.422 0.0100 +AMP "C3'" "C2'" SINGLE n 1.531 0.0100 1.531 0.0100 +AMP "C2'" "O2'" SINGLE n 1.411 0.0100 1.411 0.0100 +AMP "C2'" "C1'" SINGLE n 1.525 0.0100 1.525 0.0100 +AMP "C1'" N9 SINGLE n 1.458 0.0100 1.458 0.0100 +AMP N9 C8 SINGLE y 1.372 0.0100 1.372 0.0100 +AMP N9 C4 SINGLE y 1.374 0.0101 1.374 0.0101 +AMP C8 N7 DOUBLE y 1.310 0.0100 1.310 0.0100 +AMP N7 C5 SINGLE y 1.388 0.0100 1.388 0.0100 +AMP C5 C6 SINGLE y 1.408 0.0100 1.408 0.0100 +AMP C5 C4 DOUBLE y 1.381 0.0100 1.381 0.0100 +AMP C6 N6 SINGLE n 1.330 0.0100 1.330 0.0100 +AMP C6 N1 DOUBLE y 1.354 0.0100 1.354 0.0100 +AMP N1 C2 SINGLE y 1.339 0.0100 1.339 0.0100 +AMP C2 N3 DOUBLE y 1.330 0.0100 1.330 0.0100 +AMP N3 C4 SINGLE y 1.343 0.0100 1.343 0.0100 +AMP "C5'" "H5'1" SINGLE n 1.089 0.0100 0.989 0.0200 +AMP "C5'" "H5'2" SINGLE n 1.089 0.0100 0.989 0.0200 +AMP "C4'" "H4'" SINGLE n 1.089 0.0100 0.981 0.0200 +AMP "C3'" "H3'" SINGLE n 1.089 0.0100 0.992 0.0200 +AMP "O3'" "HO3'" SINGLE n 0.970 0.0120 0.849 0.0200 +AMP "C2'" "H2'" SINGLE n 1.089 0.0100 0.994 0.0200 +AMP "O2'" "HO2'" SINGLE n 0.970 0.0120 0.849 0.0200 +AMP "C1'" "H1'" SINGLE n 1.089 0.0100 0.984 0.0200 +AMP C8 H8 SINGLE n 1.082 0.0130 0.942 0.0170 +AMP N6 HN61 SINGLE n 1.016 0.0100 0.877 0.0200 +AMP N6 HN62 SINGLE n 1.016 0.0100 0.877 0.0200 +AMP C2 H2 SINGLE n 1.082 0.0130 0.945 0.0200 + +loop_ +_chem_comp_angle.comp_id +_chem_comp_angle.atom_id_1 +_chem_comp_angle.atom_id_2 +_chem_comp_angle.atom_id_3 +_chem_comp_angle.value_angle +_chem_comp_angle.value_angle_esd +AMP O1P P O2P 112.864 1.69 +AMP O1P P O3P 112.864 1.69 +AMP O1P P "O5'" 105.808 2.07 +AMP O2P P O3P 112.864 1.69 +AMP O2P P "O5'" 105.808 2.07 +AMP O3P P "O5'" 105.808 2.07 +AMP P "O5'" "C5'" 118.783 1.50 +AMP "O5'" "C5'" "C4'" 109.342 1.50 +AMP "O5'" "C5'" "H5'1" 109.845 1.50 +AMP "O5'" "C5'" "H5'2" 109.845 1.50 +AMP "C4'" "C5'" "H5'1" 109.624 1.50 +AMP "C4'" "C5'" "H5'2" 109.624 1.50 +AMP "H5'1" "C5'" "H5'2" 108.472 1.50 +AMP "C5'" "C4'" "O4'" 109.123 1.50 +AMP "C5'" "C4'" "C3'" 116.008 1.52 +AMP "C5'" "C4'" "H4'" 108.268 1.50 +AMP "O4'" "C4'" "C3'" 105.388 1.50 +AMP "O4'" "C4'" "H4'" 108.947 1.50 +AMP "C3'" "C4'" "H4'" 109.363 1.86 +AMP "C4'" "O4'" "C1'" 109.903 1.50 +AMP "C4'" "C3'" "O3'" 111.281 2.46 +AMP "C4'" "C3'" "C2'" 102.602 1.50 +AMP "C4'" "C3'" "H3'" 110.452 2.54 +AMP "O3'" "C3'" "C2'" 111.581 2.83 +AMP "O3'" "C3'" "H3'" 110.380 1.67 +AMP "C2'" "C3'" "H3'" 110.504 1.75 +AMP "C3'" "O3'" "HO3'" 108.744 3.00 +AMP "C3'" "C2'" "O2'" 112.782 2.45 +AMP "C3'" "C2'" "C1'" 101.239 1.50 +AMP "C3'" "C2'" "H2'" 110.596 1.51 +AMP "O2'" "C2'" "C1'" 111.715 2.69 +AMP "O2'" "C2'" "H2'" 110.448 1.97 +AMP "C1'" "C2'" "H2'" 110.636 1.70 +AMP "C2'" "O2'" "HO2'" 109.103 2.13 +AMP "O4'" "C1'" "C2'" 106.047 1.50 +AMP "O4'" "C1'" N9 108.477 1.50 +AMP "O4'" "C1'" "H1'" 109.807 1.50 +AMP "C2'" "C1'" N9 113.824 1.50 +AMP "C2'" "C1'" "H1'" 109.015 1.50 +AMP N9 "C1'" "H1'" 109.561 1.50 +AMP "C1'" N9 C8 126.848 1.91 +AMP "C1'" N9 C4 127.459 1.80 +AMP C8 N9 C4 105.693 1.50 +AMP N9 C8 N7 113.469 1.50 +AMP N9 C8 H8 123.206 1.50 +AMP N7 C8 H8 123.326 1.50 +AMP C8 N7 C5 104.739 1.50 +AMP N7 C5 C6 132.250 1.50 +AMP N7 C5 C4 110.483 1.50 +AMP C6 C5 C4 117.267 1.50 +AMP C5 C6 N6 123.792 1.50 +AMP C5 C6 N1 117.409 1.50 +AMP N6 C6 N1 118.799 1.50 +AMP C6 N6 HN61 119.723 1.50 +AMP C6 N6 HN62 119.723 1.50 +AMP HN61 N6 HN62 120.554 1.88 +AMP C6 N1 C2 118.521 1.50 +AMP N1 C2 N3 129.332 1.50 +AMP N1 C2 H2 115.313 1.50 +AMP N3 C2 H2 115.355 1.50 +AMP C2 N3 C4 110.982 1.50 +AMP N9 C4 C5 105.616 1.50 +AMP N9 C4 N3 127.895 1.50 +AMP C5 C4 N3 126.489 1.50 + +loop_ +_chem_comp_tor.comp_id +_chem_comp_tor.id +_chem_comp_tor.atom_id_1 +_chem_comp_tor.atom_id_2 +_chem_comp_tor.atom_id_3 +_chem_comp_tor.atom_id_4 +_chem_comp_tor.value_angle +_chem_comp_tor.value_angle_esd +_chem_comp_tor.period +AMP sp3_sp3_27 "C5'" "O5'" P O1P 60.000 10.0 3 +AMP sp3_sp3_52 "C3'" "C2'" "O2'" "HO2'" 180.000 10.0 3 +AMP sp3_sp3_8 "O4'" "C1'" "C2'" "O2'" 180.000 10.0 3 +AMP sp2_sp3_1 C8 N9 "C1'" "O4'" 150.000 10.0 6 +AMP const_14 N7 C8 N9 "C1'" 180.000 10.0 2 +AMP const_26 C5 C4 N9 "C1'" 180.000 10.0 2 +AMP const_17 N9 C8 N7 C5 0.000 10.0 2 +AMP const_20 C6 C5 N7 C8 180.000 10.0 2 +AMP const_sp2_sp2_4 N7 C5 C6 N6 0.000 5.0 2 +AMP const_21 N9 C4 C5 N7 0.000 10.0 2 +AMP sp2_sp2_1 C5 C6 N6 HN61 180.000 5.0 2 +AMP const_sp2_sp2_6 N6 C6 N1 C2 180.000 5.0 2 +AMP const_sp2_sp2_7 N3 C2 N1 C6 0.000 5.0 2 +AMP const_sp2_sp2_9 N1 C2 N3 C4 0.000 5.0 2 +AMP const_12 N9 C4 N3 C2 180.000 10.0 2 +AMP sp3_sp3_28 "C4'" "C5'" "O5'" P 180.000 10.0 3 +AMP sp3_sp3_31 "O4'" "C4'" "C5'" "O5'" 180.000 10.0 3 +AMP sp3_sp3_2 "C5'" "C4'" "O4'" "C1'" -60.000 10.0 3 +AMP sp3_sp3_44 "O3'" "C3'" "C4'" "C5'" 180.000 10.0 3 +AMP sp3_sp3_4 "C2'" "C1'" "O4'" "C4'" -60.000 10.0 3 +AMP sp3_sp3_20 "O2'" "C2'" "C3'" "O3'" -60.000 10.0 3 +AMP sp3_sp3_49 "C4'" "C3'" "O3'" "HO3'" 180.000 10.0 3 + +loop_ +_chem_comp_chir.comp_id +_chem_comp_chir.id +_chem_comp_chir.atom_id_centre +_chem_comp_chir.atom_id_1 +_chem_comp_chir.atom_id_2 +_chem_comp_chir.atom_id_3 +_chem_comp_chir.volume_sign +AMP chir_1 P "O5'" O2P O3P both +AMP chir_2 "C4'" "O4'" "C3'" "C5'" negative +AMP chir_3 "C3'" "O3'" "C4'" "C2'" positive +AMP chir_4 "C2'" "O2'" "C1'" "C3'" negative +AMP chir_5 "C1'" "O4'" N9 "C2'" negative + +loop_ +_chem_comp_plane_atom.comp_id +_chem_comp_plane_atom.plane_id +_chem_comp_plane_atom.atom_id +_chem_comp_plane_atom.dist_esd +AMP plan-1 "C1'" 0.020 +AMP plan-1 C2 0.020 +AMP plan-1 C4 0.020 +AMP plan-1 C5 0.020 +AMP plan-1 C6 0.020 +AMP plan-1 C8 0.020 +AMP plan-1 H2 0.020 +AMP plan-1 H8 0.020 +AMP plan-1 N1 0.020 +AMP plan-1 N3 0.020 +AMP plan-1 N6 0.020 +AMP plan-1 N7 0.020 +AMP plan-1 N9 0.020 +AMP plan-2 C6 0.020 +AMP plan-2 HN61 0.020 +AMP plan-2 HN62 0.020 +AMP plan-2 N6 0.020 + +loop_ +_pdbx_chem_comp_descriptor.comp_id +_pdbx_chem_comp_descriptor.type +_pdbx_chem_comp_descriptor.program +_pdbx_chem_comp_descriptor.program_version +_pdbx_chem_comp_descriptor.descriptor +AMP SMILES ACDLabs 12.01 O=P(O)(O)OCC3OC(n2cnc1c(ncnc12)N)C(O)C3O +AMP InChI InChI 1.03 InChI=1S/C10H14N5O7P/c11-8-5-9(13-2-12-8)15(3-14-5)10-7(17)6(16)4(22-10)1-21-23(18,19)20/h2-4,6-7,10,16-17H,1H2,(H2,11,12,13)(H2,18,19,20)/t4-,6-,7-,10-/m1/s1 +AMP InChIKey InChI 1.03 UDMBCSSLTHHNCD-KQYNXXCUSA-N +AMP SMILES_CANONICAL CACTVS 3.370 Nc1ncnc2n(cnc12)[C@@H]3O[C@H](CO[P](O)(O)=O)[C@@H](O)[C@H]3O +AMP SMILES CACTVS 3.370 Nc1ncnc2n(cnc12)[CH]3O[CH](CO[P](O)(O)=O)[CH](O)[CH]3O +AMP SMILES_CANONICAL "OpenEye OEToolkits" 1.7.6 c1nc(c2c(n1)n(cn2)[C@H]3[C@@H]([C@@H]([C@H](O3)COP(=O)(O)O)O)O)N +AMP SMILES "OpenEye OEToolkits" 1.7.6 c1nc(c2c(n1)n(cn2)C3C(C(C(O3)COP(=O)(O)O)O)O)N + +loop_ +_pdbx_chem_comp_description_generator.comp_id +_pdbx_chem_comp_description_generator.program_name +_pdbx_chem_comp_description_generator.program_version +_pdbx_chem_comp_description_generator.descriptor +AMP acedrg 243 "dictionary generator" +AMP acedrg_database 11 "data source" +AMP rdkit 2017.03.2 "Chemoinformatics tool" +AMP refmac5 5.8.0238 "optimization tool" + +loop_ +_chem_comp_alias.comp_id +_chem_comp_alias.group +_chem_comp_alias.atom_id +_chem_comp_alias.atom_id_standard +AMP DNA/RNA O2P OP2 +AMP DNA/RNA O1P OP1 +AMP DNA/RNA O3P OP3 diff --git a/image_analysis/structure_refinement/monomers/ARG.cif b/image_analysis/structure_refinement/monomers/ARG.cif new file mode 100644 index 000000000..f92a52e96 --- /dev/null +++ b/image_analysis/structure_refinement/monomers/ARG.cif @@ -0,0 +1,284 @@ +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +ARG ARG ARGININE peptide 27 12 . + +data_comp_ARG +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +ARG N N NT3 1 70.130 14.992 90.045 +ARG CA C CH1 0 70.443 14.368 91.360 +ARG C C C 0 71.906 13.892 91.367 +ARG O O O 0 72.245 13.075 90.483 +ARG CB C CH2 0 69.504 13.191 91.652 +ARG CG C CH2 0 68.033 13.562 91.785 +ARG CD C CH2 0 67.166 12.373 92.178 +ARG NE N NC1 0 67.123 11.321 91.154 +ARG CZ C C 0 66.488 10.157 91.270 +ARG NH1 N NC2 0 65.818 9.861 92.371 +ARG NH2 N NC2 1 66.525 9.285 90.278 +ARG OXT O OC -1 72.653 14.357 92.256 +ARG H H H 0 70.064 14.355 89.409 +ARG H2 H H 0 70.776 15.575 89.808 +ARG H3 H H 0 69.349 15.441 90.092 +ARG HA H H 0 70.328 15.054 92.065 +ARG HB3 H H 0 69.794 12.761 92.485 +ARG HB2 H H 0 69.597 12.533 90.931 +ARG HG3 H H 0 67.712 13.922 90.930 +ARG HG2 H H 0 67.938 14.265 92.464 +ARG HD3 H H 0 66.255 12.690 92.348 +ARG HD2 H H 0 67.510 11.993 93.012 +ARG HE H H 0 67.542 11.468 90.404 +ARG HH11 H H 0 66.247 9.797 93.142 +ARG HH12 H H 0 64.945 9.729 92.332 +ARG HH21 H H 0 66.438 9.566 89.444 +ARG HH22 H H 0 66.637 8.426 90.452 + +loop_ +_chem_comp_tree.comp_id +_chem_comp_tree.atom_id +_chem_comp_tree.atom_back +_chem_comp_tree.atom_forward +_chem_comp_tree.connect_type +ARG N n/a CA START +ARG H N . . +ARG H2 N . . +ARG H3 N . . +ARG CA N C . +ARG HA CA . . +ARG CB CA CG . +ARG HB3 CB . . +ARG HB2 CB . . +ARG CG CB CD . +ARG HG3 CG . . +ARG HG2 CG . . +ARG CD CG NE . +ARG HD3 CD . . +ARG HD2 CD . . +ARG NE CD CZ . +ARG HE NE . . +ARG CZ NE NH2 . +ARG NH1 CZ HH12 . +ARG HH11 NH1 . . +ARG HH12 NH1 . . +ARG NH2 CZ HH22 . +ARG HH21 NH2 . . +ARG HH22 NH2 . . +ARG C CA . END +ARG O C . . +ARG OXT C . . + +loop_ +_chem_comp_acedrg.comp_id +_chem_comp_acedrg.atom_id +_chem_comp_acedrg.atom_type +ARG N N(CCCH)(H)3 +ARG CA C(CCHH)(NH3)(COO)(H) +ARG C C(CCHN)(O)2 +ARG O O(CCO) +ARG CB C(CCHH)(CCHN)(H)2 +ARG CG C(CCHH)(CHHN)(H)2 +ARG CD C(CCHH)(NCH)(H)2 +ARG NE N(CCHH)(CNN)(H) +ARG CZ C(NCH)(NHH)2 +ARG NH1 N(CNN)(H)2 +ARG NH2 N(CNN)(H)2 +ARG OXT O(CCO) +ARG H H(NCHH) +ARG H2 H(NCHH) +ARG H3 H(NCHH) +ARG HA H(CCCN) +ARG HB3 H(CCCH) +ARG HB2 H(CCCH) +ARG HG3 H(CCCH) +ARG HG2 H(CCCH) +ARG HD3 H(CCHN) +ARG HD2 H(CCHN) +ARG HE H(NCC) +ARG HH11 H(NCH) +ARG HH12 H(NCH) +ARG HH21 H(NCH) +ARG HH22 H(NCH) + +loop_ +_chem_comp_bond.comp_id +_chem_comp_bond.atom_id_1 +_chem_comp_bond.atom_id_2 +_chem_comp_bond.type +_chem_comp_bond.aromatic +_chem_comp_bond.value_dist_nucleus +_chem_comp_bond.value_dist_nucleus_esd +_chem_comp_bond.value_dist +_chem_comp_bond.value_dist_esd +ARG N CA SINGLE n 1.487 0.0100 1.487 0.0100 +ARG CA C SINGLE n 1.538 0.0113 1.538 0.0113 +ARG CA CB SINGLE n 1.533 0.0100 1.533 0.0100 +ARG C O DOUBLE n 1.251 0.0183 1.251 0.0183 +ARG C OXT SINGLE n 1.251 0.0183 1.251 0.0183 +ARG CB CG SINGLE n 1.522 0.0100 1.522 0.0100 +ARG CG CD SINGLE n 1.521 0.0200 1.521 0.0200 +ARG CD NE SINGLE n 1.467 0.0100 1.467 0.0100 +ARG NE CZ SINGLE n 1.327 0.0153 1.327 0.0153 +ARG CZ NH1 SINGLE n 1.321 0.0134 1.321 0.0134 +ARG CZ NH2 DOUBLE n 1.321 0.0134 1.321 0.0134 +ARG N H SINGLE n 1.018 0.0520 0.902 0.0102 +ARG N H2 SINGLE n 1.018 0.0520 0.902 0.0102 +ARG N H3 SINGLE n 1.018 0.0520 0.902 0.0102 +ARG CA HA SINGLE n 1.092 0.0100 0.991 0.0200 +ARG CB HB3 SINGLE n 1.092 0.0100 0.981 0.0141 +ARG CB HB2 SINGLE n 1.092 0.0100 0.981 0.0141 +ARG CG HG3 SINGLE n 1.092 0.0100 0.982 0.0161 +ARG CG HG2 SINGLE n 1.092 0.0100 0.982 0.0161 +ARG CD HD3 SINGLE n 1.092 0.0100 0.979 0.0175 +ARG CD HD2 SINGLE n 1.092 0.0100 0.979 0.0175 +ARG NE HE SINGLE n 1.013 0.0120 0.871 0.0200 +ARG NH1 HH11 SINGLE n 1.013 0.0120 0.884 0.0200 +ARG NH1 HH12 SINGLE n 1.013 0.0120 0.884 0.0200 +ARG NH2 HH21 SINGLE n 1.013 0.0120 0.884 0.0200 +ARG NH2 HH22 SINGLE n 1.013 0.0120 0.884 0.0200 + +loop_ +_chem_comp_angle.comp_id +_chem_comp_angle.atom_id_1 +_chem_comp_angle.atom_id_2 +_chem_comp_angle.atom_id_3 +_chem_comp_angle.value_angle +_chem_comp_angle.value_angle_esd +ARG CA N H 109.990 3.00 +ARG CA N H2 109.990 3.00 +ARG CA N H3 109.990 3.00 +ARG H N H2 109.032 3.00 +ARG H N H3 109.032 3.00 +ARG H2 N H3 109.032 3.00 +ARG N CA C 109.258 1.50 +ARG N CA CB 110.440 2.46 +ARG N CA HA 108.387 1.58 +ARG C CA CB 111.059 3.00 +ARG C CA HA 108.774 1.79 +ARG CB CA HA 109.080 2.33 +ARG CA C O 117.148 1.60 +ARG CA C OXT 117.148 1.60 +ARG O C OXT 125.704 1.50 +ARG CA CB CG 114.160 3.00 +ARG CA CB HB3 108.677 1.74 +ARG CA CB HB2 108.677 1.74 +ARG CG CB HB3 108.721 1.50 +ARG CG CB HB2 108.721 1.50 +ARG HB3 CB HB2 107.655 1.50 +ARG CB CG CD 112.025 3.00 +ARG CB CG HG3 109.216 1.64 +ARG CB CG HG2 109.216 1.64 +ARG CD CG HG3 108.991 1.50 +ARG CD CG HG2 108.991 1.50 +ARG HG3 CG HG2 107.958 2.23 +ARG CG CD NE 112.275 3.00 +ARG CG CD HD3 109.172 2.35 +ARG CG CD HD2 109.172 2.35 +ARG NE CD HD3 109.193 1.50 +ARG NE CD HD2 109.193 1.50 +ARG HD3 CD HD2 107.932 1.94 +ARG CD NE CZ 124.614 2.32 +ARG CD NE HE 117.935 2.37 +ARG CZ NE HE 117.451 2.77 +ARG NE CZ NH1 120.032 1.90 +ARG NE CZ NH2 120.032 1.90 +ARG NH1 CZ NH2 119.937 1.95 +ARG CZ NH1 HH11 119.775 3.00 +ARG CZ NH1 HH12 119.775 3.00 +ARG HH11 NH1 HH12 120.450 3.00 +ARG CZ NH2 HH21 119.775 3.00 +ARG CZ NH2 HH22 119.775 3.00 +ARG HH21 NH2 HH22 120.450 3.00 + +loop_ +_chem_comp_tor.comp_id +_chem_comp_tor.id +_chem_comp_tor.atom_id_1 +_chem_comp_tor.atom_id_2 +_chem_comp_tor.atom_id_3 +_chem_comp_tor.atom_id_4 +_chem_comp_tor.value_angle +_chem_comp_tor.value_angle_esd +_chem_comp_tor.period +ARG chi1 N CA CB CG -60.000 10.0 3 +ARG chi2 CA CB CG CD 180.000 10.0 3 +ARG chi3 CB CG CD NE 60.000 10.0 3 +ARG chi4 CG CD NE CZ 180.000 10.0 6 +ARG chi5 CD NE CZ NH2 0.000 5.0 2 +ARG hh1 NE CZ NH1 HH12 0.000 5.0 2 +ARG hh2 NE CZ NH2 HH22 0.000 5.0 2 +ARG sp3_sp3_1 C CA N H 180.000 10.0 3 +ARG sp2_sp3_1 O C CA N 0.000 10.0 6 + +loop_ +_chem_comp_chir.comp_id +_chem_comp_chir.id +_chem_comp_chir.atom_id_centre +_chem_comp_chir.atom_id_1 +_chem_comp_chir.atom_id_2 +_chem_comp_chir.atom_id_3 +_chem_comp_chir.volume_sign +ARG chir_1 CA N C CB positive + +loop_ +_chem_comp_plane_atom.comp_id +_chem_comp_plane_atom.plane_id +_chem_comp_plane_atom.atom_id +_chem_comp_plane_atom.dist_esd +ARG plan-1 C 0.020 +ARG plan-1 CA 0.020 +ARG plan-1 O 0.020 +ARG plan-1 OXT 0.020 +ARG plan-2 CD 0.020 +ARG plan-2 CZ 0.020 +ARG plan-2 HE 0.020 +ARG plan-2 NE 0.020 +ARG plan-3 CZ 0.020 +ARG plan-3 NE 0.020 +ARG plan-3 NH1 0.020 +ARG plan-3 NH2 0.020 +ARG plan-4 CZ 0.020 +ARG plan-4 HH11 0.020 +ARG plan-4 HH12 0.020 +ARG plan-4 NH1 0.020 +ARG plan-5 CZ 0.020 +ARG plan-5 HH21 0.020 +ARG plan-5 HH22 0.020 +ARG plan-5 NH2 0.020 + +loop_ +_pdbx_chem_comp_descriptor.comp_id +_pdbx_chem_comp_descriptor.type +_pdbx_chem_comp_descriptor.program +_pdbx_chem_comp_descriptor.program_version +_pdbx_chem_comp_descriptor.descriptor +ARG SMILES ACDLabs 10.04 O=C(O)C(N)CCCN\C(=[NH2+])N +ARG SMILES_CANONICAL CACTVS 3.341 N[C@@H](CCCNC(N)=[NH2+])C(O)=O +ARG SMILES CACTVS 3.341 N[CH](CCCNC(N)=[NH2+])C(O)=O +ARG SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 C(C[C@@H](C(=O)O)N)CNC(=[NH2+])N +ARG SMILES "OpenEye OEToolkits" 1.5.0 C(CC(C(=O)O)N)CNC(=[NH2+])N +ARG InChI InChI 1.03 InChI=1S/C6H14N4O2/c7-4(5(11)12)2-1-3-10-6(8)9/h4H,1-3,7H2,(H,11,12)(H4,8,9,10)/p+1/t4-/m0/s1 +ARG InChIKey InChI 1.03 ODKSFYDXXFIFQN-BYPYZUCNSA-O + +loop_ +_pdbx_chem_comp_description_generator.comp_id +_pdbx_chem_comp_description_generator.program_name +_pdbx_chem_comp_description_generator.program_version +_pdbx_chem_comp_description_generator.descriptor +ARG acedrg 278 "dictionary generator" +ARG acedrg_database 12 "data source" +ARG rdkit 2019.09.1 "Chemoinformatics tool" +ARG refmac5 5.8.0419 "optimization tool" diff --git a/image_analysis/structure_refinement/monomers/ASN.cif b/image_analysis/structure_refinement/monomers/ASN.cif new file mode 100644 index 000000000..50e7df06f --- /dev/null +++ b/image_analysis/structure_refinement/monomers/ASN.cif @@ -0,0 +1,214 @@ +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +ASN ASN ASPARAGINE peptide 17 9 . + +data_comp_ASN +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +ASN N N NT3 1 14.911 16.808 19.868 +ASN CA C CH1 0 15.816 17.894 20.345 +ASN C C C 0 15.155 18.638 21.512 +ASN O O O 0 15.771 18.659 22.602 +ASN CB C CH2 0 16.178 18.868 19.226 +ASN CG C C 0 16.898 18.214 18.068 +ASN OD1 O O 0 17.108 16.995 18.059 +ASN ND2 N NH2 0 17.282 19.004 17.075 +ASN OXT O OC -1 14.046 19.172 21.292 +ASN H H H 0 14.283 17.146 19.316 +ASN H2 H H 0 14.499 16.402 20.561 +ASN H3 H H 0 15.385 16.183 19.422 +ASN HA H H 0 16.651 17.482 20.665 +ASN HB3 H H 0 16.746 19.574 19.593 +ASN HB2 H H 0 15.359 19.286 18.893 +ASN HD21 H H 0 16.894 19.794 16.957 +ASN HD22 H H 0 17.928 18.741 16.527 + +loop_ +_chem_comp_tree.comp_id +_chem_comp_tree.atom_id +_chem_comp_tree.atom_back +_chem_comp_tree.atom_forward +_chem_comp_tree.connect_type +ASN N n/a CA START +ASN H N . . +ASN H2 N . . +ASN H3 N . . +ASN CA N C . +ASN HA CA . . +ASN CB CA CG . +ASN HB3 CB . . +ASN HB2 CB . . +ASN CG CB ND2 . +ASN OD1 CG . . +ASN ND2 CG HD22 . +ASN HD21 ND2 . . +ASN HD22 ND2 . . +ASN C CA . END +ASN O C . . +ASN OXT C . . + +loop_ +_chem_comp_acedrg.comp_id +_chem_comp_acedrg.atom_id +_chem_comp_acedrg.atom_type +ASN N N(CCCH)(H)3 +ASN CA C(CCHH)(NH3)(COO)(H) +ASN C C(CCHN)(O)2 +ASN O O(CCO) +ASN CB C(CCHN)(CNO)(H)2 +ASN CG C(CCHH)(NHH)(O) +ASN OD1 O(CCN) +ASN ND2 N(CCO)(H)2 +ASN OXT O(CCO) +ASN H H(NCHH) +ASN H2 H(NCHH) +ASN H3 H(NCHH) +ASN HA H(CCCN) +ASN HB3 H(CCCH) +ASN HB2 H(CCCH) +ASN HD21 H(NCH) +ASN HD22 H(NCH) + +loop_ +_chem_comp_bond.comp_id +_chem_comp_bond.atom_id_1 +_chem_comp_bond.atom_id_2 +_chem_comp_bond.type +_chem_comp_bond.aromatic +_chem_comp_bond.value_dist_nucleus +_chem_comp_bond.value_dist_nucleus_esd +_chem_comp_bond.value_dist +_chem_comp_bond.value_dist_esd +ASN N CA SINGLE n 1.490 0.0100 1.490 0.0100 +ASN CA C SINGLE n 1.533 0.0100 1.533 0.0100 +ASN CA CB SINGLE n 1.525 0.0100 1.525 0.0100 +ASN C O DOUBLE n 1.251 0.0183 1.251 0.0183 +ASN C OXT SINGLE n 1.251 0.0183 1.251 0.0183 +ASN CB CG SINGLE n 1.510 0.0100 1.510 0.0100 +ASN CG OD1 DOUBLE n 1.236 0.0100 1.236 0.0100 +ASN CG ND2 SINGLE n 1.325 0.0100 1.325 0.0100 +ASN N H SINGLE n 1.018 0.0520 0.902 0.0102 +ASN N H2 SINGLE n 1.018 0.0520 0.902 0.0102 +ASN N H3 SINGLE n 1.018 0.0520 0.902 0.0102 +ASN CA HA SINGLE n 1.092 0.0100 0.984 0.0200 +ASN CB HB3 SINGLE n 1.092 0.0100 0.978 0.0143 +ASN CB HB2 SINGLE n 1.092 0.0100 0.978 0.0143 +ASN ND2 HD21 SINGLE n 1.013 0.0120 0.887 0.0200 +ASN ND2 HD22 SINGLE n 1.013 0.0120 0.887 0.0200 + +loop_ +_chem_comp_angle.comp_id +_chem_comp_angle.atom_id_1 +_chem_comp_angle.atom_id_2 +_chem_comp_angle.atom_id_3 +_chem_comp_angle.value_angle +_chem_comp_angle.value_angle_esd +ASN CA N H 109.990 3.00 +ASN CA N H2 109.990 3.00 +ASN CA N H3 109.990 3.00 +ASN H N H2 109.032 3.00 +ASN H N H3 109.032 3.00 +ASN H2 N H3 109.032 3.00 +ASN N CA C 109.258 1.50 +ASN N CA CB 111.558 1.50 +ASN N CA HA 108.387 1.58 +ASN C CA CB 111.904 3.00 +ASN C CA HA 108.774 1.79 +ASN CB CA HA 107.748 1.50 +ASN CA C O 117.148 1.60 +ASN CA C OXT 117.148 1.60 +ASN O C OXT 125.704 1.50 +ASN CA CB CG 112.193 1.50 +ASN CA CB HB3 109.177 1.50 +ASN CA CB HB2 109.177 1.50 +ASN CG CB HB3 109.132 1.50 +ASN CG CB HB2 109.132 1.50 +ASN HB3 CB HB2 108.039 1.50 +ASN CB CG OD1 120.239 1.50 +ASN CB CG ND2 117.180 1.62 +ASN OD1 CG ND2 122.581 1.50 +ASN CG ND2 HD21 119.917 2.87 +ASN CG ND2 HD22 119.917 2.87 +ASN HD21 ND2 HD22 120.165 3.00 + +loop_ +_chem_comp_tor.comp_id +_chem_comp_tor.id +_chem_comp_tor.atom_id_1 +_chem_comp_tor.atom_id_2 +_chem_comp_tor.atom_id_3 +_chem_comp_tor.atom_id_4 +_chem_comp_tor.value_angle +_chem_comp_tor.value_angle_esd +_chem_comp_tor.period +ASN chi1 N CA CB CG -60.000 10.0 3 +ASN chi2 CA CB CG ND2 180.000 10.0 6 +ASN hh1 CB CG ND2 HD22 180.000 5.0 2 +ASN sp3_sp3_1 C CA N H 180.000 10.0 3 +ASN sp2_sp3_1 O C CA N 0.000 10.0 6 + +loop_ +_chem_comp_chir.comp_id +_chem_comp_chir.id +_chem_comp_chir.atom_id_centre +_chem_comp_chir.atom_id_1 +_chem_comp_chir.atom_id_2 +_chem_comp_chir.atom_id_3 +_chem_comp_chir.volume_sign +ASN chir_1 CA N C CB positive + +loop_ +_chem_comp_plane_atom.comp_id +_chem_comp_plane_atom.plane_id +_chem_comp_plane_atom.atom_id +_chem_comp_plane_atom.dist_esd +ASN plan-1 C 0.020 +ASN plan-1 CA 0.020 +ASN plan-1 O 0.020 +ASN plan-1 OXT 0.020 +ASN plan-2 CB 0.020 +ASN plan-2 CG 0.020 +ASN plan-2 ND2 0.020 +ASN plan-2 OD1 0.020 +ASN plan-3 CG 0.020 +ASN plan-3 HD21 0.020 +ASN plan-3 HD22 0.020 +ASN plan-3 ND2 0.020 + +loop_ +_pdbx_chem_comp_descriptor.comp_id +_pdbx_chem_comp_descriptor.type +_pdbx_chem_comp_descriptor.program +_pdbx_chem_comp_descriptor.program_version +_pdbx_chem_comp_descriptor.descriptor +ASN SMILES ACDLabs 12.01 O=C(N)CC(N)C(=O)O +ASN InChI InChI 1.03 InChI=1S/C4H8N2O3/c5-2(4(8)9)1-3(6)7/h2H,1,5H2,(H2,6,7)(H,8,9)/t2-/m0/s1 +ASN InChIKey InChI 1.03 DCXYFEDJOCDNAF-REOHCLBHSA-N +ASN SMILES_CANONICAL CACTVS 3.370 N[C@@H](CC(N)=O)C(O)=O +ASN SMILES CACTVS 3.370 N[CH](CC(N)=O)C(O)=O +ASN SMILES_CANONICAL "OpenEye OEToolkits" 1.7.2 C([C@@H](C(=O)O)N)C(=O)N +ASN SMILES "OpenEye OEToolkits" 1.7.2 C(C(C(=O)O)N)C(=O)N + +loop_ +_pdbx_chem_comp_description_generator.comp_id +_pdbx_chem_comp_description_generator.program_name +_pdbx_chem_comp_description_generator.program_version +_pdbx_chem_comp_description_generator.descriptor +ASN acedrg 278 "dictionary generator" +ASN acedrg_database 12 "data source" +ASN rdkit 2019.09.1 "Chemoinformatics tool" +ASN refmac5 5.8.0419 "optimization tool" diff --git a/image_analysis/structure_refinement/monomers/ASP.cif b/image_analysis/structure_refinement/monomers/ASP.cif new file mode 100644 index 000000000..08958a6f6 --- /dev/null +++ b/image_analysis/structure_refinement/monomers/ASP.cif @@ -0,0 +1,198 @@ +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +ASP ASP "ASPARTIC ACID" peptide 15 9 . + +data_comp_ASP +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +ASP N N NT3 1 33.542 17.835 39.145 +ASP CA C CH1 0 34.991 17.614 38.867 +ASP C C C 0 35.178 17.161 37.413 +ASP O O O 0 36.268 17.442 36.867 +ASP CB C CH2 0 35.617 16.650 39.866 +ASP CG C C 0 34.932 15.299 40.037 +ASP OD1 O O 0 35.515 14.435 40.725 +ASP OD2 O OC -1 33.817 15.122 39.501 +ASP OXT O OC -1 34.232 16.542 36.875 +ASP H H H 0 33.408 17.940 40.031 +ASP H2 H H 0 33.045 17.139 38.857 +ASP H3 H H 0 33.263 18.581 38.722 +ASP HA H H 0 35.453 18.476 38.978 +ASP HB3 H H 0 35.641 17.087 40.742 +ASP HB2 H H 0 36.543 16.483 39.592 + +loop_ +_chem_comp_tree.comp_id +_chem_comp_tree.atom_id +_chem_comp_tree.atom_back +_chem_comp_tree.atom_forward +_chem_comp_tree.connect_type +ASP N n/a CA START +ASP H N . . +ASP H2 N . . +ASP H3 N . . +ASP CA N C . +ASP HA CA . . +ASP CB CA CG . +ASP HB3 CB . . +ASP HB2 CB . . +ASP CG CB OD2 . +ASP OD1 CG . . +ASP OD2 CG . . +ASP C CA . END +ASP O C . . +ASP OXT C . . + +loop_ +_chem_comp_acedrg.comp_id +_chem_comp_acedrg.atom_id +_chem_comp_acedrg.atom_type +ASP N N(CCCH)(H)3 +ASP CA C(CCHH)(NH3)(COO)(H) +ASP C C(CCHN)(O)2 +ASP O O(CCO) +ASP CB C(CCHN)(COO)(H)2 +ASP CG C(CCHH)(O)2 +ASP OD1 O(CCO) +ASP OD2 O(CCO) +ASP OXT O(CCO) +ASP H H(NCHH) +ASP H2 H(NCHH) +ASP H3 H(NCHH) +ASP HA H(CCCN) +ASP HB3 H(CCCH) +ASP HB2 H(CCCH) + +loop_ +_chem_comp_bond.comp_id +_chem_comp_bond.atom_id_1 +_chem_comp_bond.atom_id_2 +_chem_comp_bond.type +_chem_comp_bond.aromatic +_chem_comp_bond.value_dist_nucleus +_chem_comp_bond.value_dist_nucleus_esd +_chem_comp_bond.value_dist +_chem_comp_bond.value_dist_esd +ASP N CA SINGLE n 1.490 0.0100 1.490 0.0100 +ASP CA C SINGLE n 1.533 0.0100 1.533 0.0100 +ASP CA CB SINGLE n 1.521 0.0100 1.521 0.0100 +ASP C O DOUBLE n 1.251 0.0183 1.251 0.0183 +ASP C OXT SINGLE n 1.251 0.0183 1.251 0.0183 +ASP CB CG SINGLE n 1.522 0.0100 1.522 0.0100 +ASP CG OD1 DOUBLE n 1.249 0.0161 1.249 0.0161 +ASP CG OD2 SINGLE n 1.249 0.0161 1.249 0.0161 +ASP N H SINGLE n 1.018 0.0520 0.902 0.0102 +ASP N H2 SINGLE n 1.018 0.0520 0.902 0.0102 +ASP N H3 SINGLE n 1.018 0.0520 0.902 0.0102 +ASP CA HA SINGLE n 1.092 0.0100 0.984 0.0200 +ASP CB HB3 SINGLE n 1.092 0.0100 0.980 0.0165 +ASP CB HB2 SINGLE n 1.092 0.0100 0.980 0.0165 + +loop_ +_chem_comp_angle.comp_id +_chem_comp_angle.atom_id_1 +_chem_comp_angle.atom_id_2 +_chem_comp_angle.atom_id_3 +_chem_comp_angle.value_angle +_chem_comp_angle.value_angle_esd +ASP CA N H 109.990 3.00 +ASP CA N H2 109.990 3.00 +ASP CA N H3 109.990 3.00 +ASP H N H2 109.032 3.00 +ASP H N H3 109.032 3.00 +ASP H2 N H3 109.032 3.00 +ASP N CA C 109.258 1.50 +ASP N CA CB 111.400 1.50 +ASP N CA HA 108.387 1.58 +ASP C CA CB 112.421 3.00 +ASP C CA HA 108.774 1.79 +ASP CB CA HA 108.472 2.65 +ASP CA C O 117.148 1.60 +ASP CA C OXT 117.148 1.60 +ASP O C OXT 125.704 1.50 +ASP CA CB CG 115.436 1.50 +ASP CA CB HB3 108.799 3.00 +ASP CA CB HB2 108.799 3.00 +ASP CG CB HB3 108.242 2.79 +ASP CG CB HB2 108.242 2.79 +ASP HB3 CB HB2 107.976 2.66 +ASP CB CG OD1 117.985 1.50 +ASP CB CG OD2 117.985 1.50 +ASP OD1 CG OD2 124.031 1.82 + +loop_ +_chem_comp_tor.comp_id +_chem_comp_tor.id +_chem_comp_tor.atom_id_1 +_chem_comp_tor.atom_id_2 +_chem_comp_tor.atom_id_3 +_chem_comp_tor.atom_id_4 +_chem_comp_tor.value_angle +_chem_comp_tor.value_angle_esd +_chem_comp_tor.period +ASP chi1 N CA CB CG -60.000 10.0 3 +ASP chi2 CA CB CG OD1 180.000 10.0 6 +ASP sp3_sp3_1 C CA N H 180.000 10.0 3 +ASP sp2_sp3_1 O C CA N 0.000 10.0 6 + +loop_ +_chem_comp_chir.comp_id +_chem_comp_chir.id +_chem_comp_chir.atom_id_centre +_chem_comp_chir.atom_id_1 +_chem_comp_chir.atom_id_2 +_chem_comp_chir.atom_id_3 +_chem_comp_chir.volume_sign +ASP chir_1 CA N C CB positive + +loop_ +_chem_comp_plane_atom.comp_id +_chem_comp_plane_atom.plane_id +_chem_comp_plane_atom.atom_id +_chem_comp_plane_atom.dist_esd +ASP plan-1 C 0.020 +ASP plan-1 CA 0.020 +ASP plan-1 O 0.020 +ASP plan-1 OXT 0.020 +ASP plan-2 CB 0.020 +ASP plan-2 CG 0.020 +ASP plan-2 OD1 0.020 +ASP plan-2 OD2 0.020 + +loop_ +_pdbx_chem_comp_descriptor.comp_id +_pdbx_chem_comp_descriptor.type +_pdbx_chem_comp_descriptor.program +_pdbx_chem_comp_descriptor.program_version +_pdbx_chem_comp_descriptor.descriptor +ASP SMILES ACDLabs 12.01 O=C(O)CC(N)C(=O)O +ASP SMILES_CANONICAL CACTVS 3.370 N[C@@H](CC(O)=O)C(O)=O +ASP SMILES CACTVS 3.370 N[CH](CC(O)=O)C(O)=O +ASP SMILES_CANONICAL "OpenEye OEToolkits" 1.7.0 C([C@@H](C(=O)O)N)C(=O)O +ASP SMILES "OpenEye OEToolkits" 1.7.0 C(C(C(=O)O)N)C(=O)O +ASP InChI InChI 1.03 InChI=1S/C4H7NO4/c5-2(4(8)9)1-3(6)7/h2H,1,5H2,(H,6,7)(H,8,9)/t2-/m0/s1 +ASP InChIKey InChI 1.03 CKLJMWTZIZZHCS-REOHCLBHSA-N + +loop_ +_pdbx_chem_comp_description_generator.comp_id +_pdbx_chem_comp_description_generator.program_name +_pdbx_chem_comp_description_generator.program_version +_pdbx_chem_comp_description_generator.descriptor +ASP acedrg 278 "dictionary generator" +ASP acedrg_database 12 "data source" +ASP rdkit 2019.09.1 "Chemoinformatics tool" +ASP refmac5 5.8.0419 "optimization tool" diff --git a/image_analysis/structure_refinement/monomers/ATP.cif b/image_analysis/structure_refinement/monomers/ATP.cif new file mode 100644 index 000000000..d59d901cc --- /dev/null +++ b/image_analysis/structure_refinement/monomers/ATP.cif @@ -0,0 +1,301 @@ +# +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +ATP ATP "ADENOSINE-5'-TRIPHOSPHATE" NON-POLYMER 43 31 . +# +data_comp_ATP +# +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +ATP PG P P 0 44.662 45.077 58.117 +ATP O1G O O 0 43.261 45.625 58.004 +ATP O2G O OP -1 45.679 45.923 57.392 +ATP O3G O OP -1 45.059 44.781 59.542 +ATP PB P P 0 44.268 43.226 55.860 +ATP O1B O O 0 44.078 41.746 55.818 +ATP O2B O OP -1 43.182 44.124 55.365 +ATP O3B O O2 0 44.645 43.653 57.356 +ATP PA P P 0 46.020 43.596 53.536 +ATP O1A O O 0 47.423 44.087 53.400 +ATP O2A O OP -1 44.948 44.301 52.771 +ATP O3A O O2 0 45.624 43.591 55.090 +ATP "O5'" O O2 0 45.968 42.029 53.199 +ATP "C5'" C CH2 0 46.946 41.148 53.808 +ATP "C4'" C CH1 0 46.681 39.728 53.369 +ATP "O4'" O O2 0 46.924 39.620 51.943 +ATP "C3'" C CH1 0 47.567 38.650 54.004 +ATP "O3'" O OH1 0 46.881 37.406 54.075 +ATP "C2'" C CH1 0 48.756 38.611 53.041 +ATP "O2'" O OH1 0 49.451 37.383 53.067 +ATP "C1'" C CH1 0 48.066 38.829 51.697 +ATP N9 N NT 0 48.916 39.514 50.718 +ATP C8 C CR15 0 48.960 40.860 50.413 +ATP N7 N NRD5 0 49.847 41.139 49.485 +ATP C5 C CR56 0 50.421 39.915 49.166 +ATP C6 C CR6 0 51.429 39.540 48.250 +ATP N6 N NH2 0 52.063 40.400 47.457 +ATP N1 N NRD6 0 51.760 38.223 48.186 +ATP C2 C CR16 0 51.117 37.359 48.990 +ATP N3 N NRD6 0 50.158 37.599 49.885 +ATP C4 C CR56 0 49.852 38.909 49.924 +ATP "H5'1" H H 0 46.885 41.207 54.794 +ATP "H5'2" H H 0 47.858 41.415 53.533 +ATP "H4'" H H 0 45.738 39.523 53.548 +ATP "H3'" H H 0 47.862 38.933 54.908 +ATP "HO3'" H H 0 47.400 36.827 54.416 +ATP "H2'" H H 0 49.382 39.360 53.233 +ATP "HO2'" H H 0 50.094 37.416 52.513 +ATP "H1'" H H 0 47.793 37.957 51.333 +ATP H8 H H 0 48.417 41.517 50.815 +ATP HN61 H H 0 52.825 40.173 47.086 +ATP HN62 H H 0 51.716 41.193 47.308 +ATP H2 H H 0 51.382 36.456 48.909 +loop_ +_chem_comp_bond.comp_id +_chem_comp_bond.atom_id_1 +_chem_comp_bond.atom_id_2 +_chem_comp_bond.type +_chem_comp_bond.aromatic +_chem_comp_bond.value_dist_nucleus +_chem_comp_bond.value_dist_nucleus_esd +_chem_comp_bond.value_dist +_chem_comp_bond.value_dist_esd +ATP PG O1G DOUBLE n 1.509 0.0200 1.509 0.0200 +ATP PG O2G SINGLE n 1.509 0.0200 1.509 0.0200 +ATP PG O3G SINGLE n 1.509 0.0200 1.509 0.0200 +ATP PG O3B SINGLE n 1.614 0.0178 1.614 0.0178 +ATP PB O1B DOUBLE n 1.493 0.0157 1.493 0.0157 +ATP PB O2B SINGLE n 1.493 0.0157 1.493 0.0157 +ATP PB O3B SINGLE n 1.601 0.0114 1.601 0.0114 +ATP PB O3A SINGLE n 1.601 0.0114 1.601 0.0114 +ATP PA O1A DOUBLE n 1.493 0.0122 1.493 0.0122 +ATP PA O2A SINGLE n 1.493 0.0122 1.493 0.0122 +ATP PA O3A SINGLE n 1.604 0.0133 1.604 0.0133 +ATP PA "O5'" SINGLE n 1.604 0.0133 1.604 0.0133 +ATP "O5'" "C5'" SINGLE n 1.450 0.0166 1.450 0.0166 +ATP "C5'" "C4'" SINGLE n 1.509 0.0100 1.509 0.0100 +ATP "C4'" "O4'" SINGLE n 1.451 0.0100 1.451 0.0100 +ATP "C4'" "C3'" SINGLE n 1.535 0.0100 1.535 0.0100 +ATP "O4'" "C1'" SINGLE n 1.409 0.0100 1.409 0.0100 +ATP "C3'" "O3'" SINGLE n 1.422 0.0100 1.422 0.0100 +ATP "C3'" "C2'" SINGLE n 1.531 0.0100 1.531 0.0100 +ATP "C2'" "O2'" SINGLE n 1.411 0.0100 1.411 0.0100 +ATP "C2'" "C1'" SINGLE n 1.525 0.0100 1.525 0.0100 +ATP "C1'" N9 SINGLE n 1.458 0.0200 1.458 0.0200 +ATP N9 C8 SINGLE y 1.372 0.0200 1.372 0.0200 +ATP N9 C4 SINGLE y 1.372 0.0100 1.372 0.0100 +ATP C8 N7 DOUBLE y 1.310 0.0100 1.310 0.0100 +ATP N7 C5 SINGLE y 1.388 0.0100 1.388 0.0100 +ATP C5 C6 SINGLE y 1.408 0.0100 1.408 0.0100 +ATP C5 C4 DOUBLE y 1.381 0.0100 1.381 0.0100 +ATP C6 N6 SINGLE n 1.330 0.0100 1.330 0.0100 +ATP C6 N1 DOUBLE y 1.354 0.0100 1.354 0.0100 +ATP N1 C2 SINGLE y 1.339 0.0100 1.339 0.0100 +ATP C2 N3 DOUBLE y 1.330 0.0100 1.330 0.0100 +ATP N3 C4 SINGLE y 1.343 0.0100 1.343 0.0100 +ATP "C5'" "H5'1" SINGLE n 1.089 0.0100 0.989 0.0200 +ATP "C5'" "H5'2" SINGLE n 1.089 0.0100 0.989 0.0200 +ATP "C4'" "H4'" SINGLE n 1.089 0.0100 0.981 0.0200 +ATP "C3'" "H3'" SINGLE n 1.089 0.0100 0.992 0.0200 +ATP "O3'" "HO3'" SINGLE n 0.970 0.0120 0.849 0.0200 +ATP "C2'" "H2'" SINGLE n 1.089 0.0100 0.994 0.0200 +ATP "O2'" "HO2'" SINGLE n 0.970 0.0120 0.849 0.0200 +ATP "C1'" "H1'" SINGLE n 1.089 0.0100 0.984 0.0200 +ATP C8 H8 SINGLE n 1.082 0.0130 0.942 0.0170 +ATP N6 HN61 SINGLE n 1.016 0.0100 0.877 0.0200 +ATP N6 HN62 SINGLE n 1.016 0.0100 0.877 0.0200 +ATP C2 H2 SINGLE n 1.082 0.0130 0.945 0.0200 +loop_ +_chem_comp_angle.comp_id +_chem_comp_angle.atom_id_1 +_chem_comp_angle.atom_id_2 +_chem_comp_angle.atom_id_3 +_chem_comp_angle.value_angle +_chem_comp_angle.value_angle_esd +ATP O1G PG O2G 112.716 1.50 +ATP O1G PG O3G 112.716 1.50 +ATP O1G PG O3B 105.965 2.38 +ATP O2G PG O3G 112.716 1.50 +ATP O2G PG O3B 105.965 2.38 +ATP O3G PG O3B 105.965 2.38 +ATP O1B PB O2B 119.630 1.50 +ATP O1B PB O3B 108.678 2.29 +ATP O1B PB O3A 108.678 2.29 +ATP O2B PB O3B 108.678 2.29 +ATP O2B PB O3A 108.678 2.29 +ATP O3B PB O3A 100.890 2.10 +ATP PG O3B PB 132.584 3.00 +ATP O1A PA O2A 118.411 2.35 +ATP O1A PA O3A 108.816 2.14 +ATP O1A PA "O5'" 109.410 1.50 +ATP O2A PA O3A 108.816 2.14 +ATP O2A PA "O5'" 109.410 1.50 +ATP O3A PA "O5'" 101.065 1.97 +ATP PB O3A PA 132.542 3.00 +ATP PA "O5'" "C5'" 118.553 2.41 +ATP "O5'" "C5'" "C4'" 109.342 1.50 +ATP "O5'" "C5'" "H5'1" 109.845 1.50 +ATP "O5'" "C5'" "H5'2" 109.845 1.50 +ATP "C4'" "C5'" "H5'1" 109.624 1.50 +ATP "C4'" "C5'" "H5'2" 109.624 1.50 +ATP "H5'1" "C5'" "H5'2" 108.472 1.50 +ATP "C5'" "C4'" "O4'" 109.123 1.50 +ATP "C5'" "C4'" "C3'" 116.008 1.52 +ATP "C5'" "C4'" "H4'" 108.268 1.50 +ATP "O4'" "C4'" "C3'" 105.388 1.50 +ATP "O4'" "C4'" "H4'" 108.947 1.50 +ATP "C3'" "C4'" "H4'" 109.363 1.86 +ATP "C4'" "O4'" "C1'" 109.903 1.50 +ATP "C4'" "C3'" "O3'" 111.281 2.46 +ATP "C4'" "C3'" "C2'" 102.602 1.50 +ATP "C4'" "C3'" "H3'" 110.452 2.54 +ATP "O3'" "C3'" "C2'" 111.581 2.83 +ATP "O3'" "C3'" "H3'" 110.380 1.67 +ATP "C2'" "C3'" "H3'" 110.504 1.75 +ATP "C3'" "O3'" "HO3'" 108.744 3.00 +ATP "C3'" "C2'" "O2'" 112.782 2.45 +ATP "C3'" "C2'" "C1'" 101.239 1.50 +ATP "C3'" "C2'" "H2'" 110.596 1.51 +ATP "O2'" "C2'" "C1'" 111.715 2.69 +ATP "O2'" "C2'" "H2'" 110.448 1.97 +ATP "C1'" "C2'" "H2'" 110.636 1.70 +ATP "C2'" "O2'" "HO2'" 109.103 2.13 +ATP "O4'" "C1'" "C2'" 106.047 1.50 +ATP "O4'" "C1'" N9 108.167 1.51 +ATP "O4'" "C1'" "H1'" 109.807 1.50 +ATP "C2'" "C1'" N9 113.752 2.20 +ATP "C2'" "C1'" "H1'" 109.015 1.50 +ATP N9 "C1'" "H1'" 109.246 1.50 +ATP "C1'" N9 C8 126.078 2.46 +ATP "C1'" N9 C4 125.158 1.54 +ATP C8 N9 C4 107.594 1.50 +ATP N9 C8 N7 112.130 1.94 +ATP N9 C8 H8 124.701 2.19 +ATP N7 C8 H8 123.170 1.50 +ATP C8 N7 C5 103.927 1.50 +ATP N7 C5 C6 132.145 1.50 +ATP N7 C5 C4 110.588 1.50 +ATP C6 C5 C4 117.267 1.50 +ATP C5 C6 N6 123.792 1.50 +ATP C5 C6 N1 117.409 1.50 +ATP N6 C6 N1 118.799 1.50 +ATP C6 N6 HN61 119.723 1.50 +ATP C6 N6 HN62 119.723 1.50 +ATP HN61 N6 HN62 120.554 1.88 +ATP C6 N1 C2 118.521 1.50 +ATP N1 C2 N3 129.332 1.50 +ATP N1 C2 H2 115.313 1.50 +ATP N3 C2 H2 115.355 1.50 +ATP C2 N3 C4 110.982 1.50 +ATP N9 C4 C5 107.666 1.69 +ATP N9 C4 N3 125.845 1.50 +ATP C5 C4 N3 126.489 1.50 +loop_ +_chem_comp_tor.comp_id +_chem_comp_tor.id +_chem_comp_tor.atom_id_1 +_chem_comp_tor.atom_id_2 +_chem_comp_tor.atom_id_3 +_chem_comp_tor.atom_id_4 +_chem_comp_tor.value_angle +_chem_comp_tor.value_angle_esd +_chem_comp_tor.period +ATP sp3_sp3_27 PB O3B PG O1G 60.000 10.0 3 +ATP sp3_sp3_40 "C4'" "C5'" "O5'" PA 180.000 10.0 3 +ATP sp3_sp3_43 "O4'" "C4'" "C5'" "O5'" 180.000 10.0 3 +ATP sp3_sp3_2 "C5'" "C4'" "O4'" "C1'" -60.000 10.0 3 +ATP sp3_sp3_56 "O3'" "C3'" "C4'" "C5'" 180.000 10.0 3 +ATP sp3_sp3_4 "C2'" "C1'" "O4'" "C4'" -60.000 10.0 3 +ATP sp3_sp3_61 "C4'" "C3'" "O3'" "HO3'" 180.000 10.0 3 +ATP sp3_sp3_20 "O2'" "C2'" "C3'" "O3'" -60.000 10.0 3 +ATP sp3_sp3_64 "C3'" "C2'" "O2'" "HO2'" 180.000 10.0 3 +ATP sp3_sp3_8 "O4'" "C1'" "C2'" "O2'" 180.000 10.0 3 +ATP sp2_sp3_1 C8 N9 "C1'" "O4'" 150.000 10.0 6 +ATP const_14 N7 C8 N9 "C1'" 180.000 10.0 2 +ATP const_26 C5 C4 N9 "C1'" 180.000 10.0 2 +ATP const_17 N9 C8 N7 C5 0.000 10.0 2 +ATP const_20 C6 C5 N7 C8 180.000 10.0 2 +ATP const_sp2_sp2_4 N7 C5 C6 N6 0.000 5.0 2 +ATP const_21 N9 C4 C5 N7 0.000 10.0 2 +ATP sp2_sp2_1 C5 C6 N6 HN61 180.000 5.0 2 +ATP const_sp2_sp2_6 N6 C6 N1 C2 180.000 5.0 2 +ATP const_sp2_sp2_7 N3 C2 N1 C6 0.000 5.0 2 +ATP const_sp2_sp2_9 N1 C2 N3 C4 0.000 5.0 2 +ATP const_12 N9 C4 N3 C2 180.000 10.0 2 +ATP sp3_sp3_33 PA O3A PB O1B 60.000 10.0 3 +ATP sp3_sp3_30 PG O3B PB O1B 60.000 10.0 3 +ATP sp3_sp3_36 PB O3A PA O1A 60.000 10.0 3 +ATP sp3_sp3_39 "C5'" "O5'" PA O1A 60.000 10.0 3 +loop_ +_chem_comp_chir.comp_id +_chem_comp_chir.id +_chem_comp_chir.atom_id_centre +_chem_comp_chir.atom_id_1 +_chem_comp_chir.atom_id_2 +_chem_comp_chir.atom_id_3 +_chem_comp_chir.volume_sign +ATP chir_1 PG O3B O2G O3G both +ATP chir_2 PB O3A O3B O2B both +ATP chir_3 PA O3A "O5'" O2A both +ATP chir_4 "C4'" "O4'" "C3'" "C5'" negative +ATP chir_5 "C3'" "O3'" "C4'" "C2'" positive +ATP chir_6 "C2'" "O2'" "C1'" "C3'" negative +ATP chir_7 "C1'" "O4'" N9 "C2'" negative +loop_ +_chem_comp_plane_atom.comp_id +_chem_comp_plane_atom.plane_id +_chem_comp_plane_atom.atom_id +_chem_comp_plane_atom.dist_esd +ATP plan-1 "C1'" 0.020 +ATP plan-1 C2 0.020 +ATP plan-1 C4 0.020 +ATP plan-1 C5 0.020 +ATP plan-1 C6 0.020 +ATP plan-1 C8 0.020 +ATP plan-1 H2 0.020 +ATP plan-1 H8 0.020 +ATP plan-1 N1 0.020 +ATP plan-1 N3 0.020 +ATP plan-1 N6 0.020 +ATP plan-1 N7 0.020 +ATP plan-1 N9 0.020 +ATP plan-2 C6 0.020 +ATP plan-2 HN61 0.020 +ATP plan-2 HN62 0.020 +ATP plan-2 N6 0.020 +loop_ +_pdbx_chem_comp_descriptor.comp_id +_pdbx_chem_comp_descriptor.type +_pdbx_chem_comp_descriptor.program +_pdbx_chem_comp_descriptor.program_version +_pdbx_chem_comp_descriptor.descriptor +ATP SMILES ACDLabs 10.04 O=P(O)(O)OP(=O)(O)OP(=O)(O)OCC3OC(n2cnc1c(ncnc12)N)C(O)C3O +ATP SMILES_CANONICAL CACTVS 3.341 Nc1ncnc2n(cnc12)[C@@H]3O[C@H](CO[P@](O)(=O)O[P@@](O)(=O)O[P](O)(O)=O)[C@@H](O)[C@H]3O +ATP SMILES CACTVS 3.341 Nc1ncnc2n(cnc12)[CH]3O[CH](CO[P](O)(=O)O[P](O)(=O)O[P](O)(O)=O)[CH](O)[CH]3O +ATP SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 c1nc(c2c(n1)n(cn2)[C@H]3[C@@H]([C@@H]([C@H](O3)CO[P@@](=O)(O)O[P@](=O)(O)OP(=O)(O)O)O)O)N +ATP SMILES "OpenEye OEToolkits" 1.5.0 c1nc(c2c(n1)n(cn2)C3C(C(C(O3)COP(=O)(O)OP(=O)(O)OP(=O)(O)O)O)O)N +ATP InChI InChI 1.03 InChI=1S/C10H16N5O13P3/c11-8-5-9(13-2-12-8)15(3-14-5)10-7(17)6(16)4(26-10)1-25-30(21,22)28-31(23,24)27-29(18,19)20/h2-4,6-7,10,16-17H,1H2,(H,21,22)(H,23,24)(H2,11,12,13)(H2,18,19,20)/t4-,6-,7-,10-/m1/s1 +ATP InChIKey InChI 1.03 ZKHQWZAMYRWXGA-KQYNXXCUSA-N +loop_ +_pdbx_chem_comp_description_generator.comp_id +_pdbx_chem_comp_description_generator.program_name +_pdbx_chem_comp_description_generator.program_version +_pdbx_chem_comp_description_generator.descriptor +ATP acedrg 243 "dictionary generator" +ATP acedrg_database 11 "data source" +ATP rdkit 2017.03.2 "Chemoinformatics tool" +ATP refmac5 5.8.0238 "optimization tool" diff --git a/image_analysis/structure_refinement/monomers/BR.cif b/image_analysis/structure_refinement/monomers/BR.cif new file mode 100644 index 000000000..64698cd70 --- /dev/null +++ b/image_analysis/structure_refinement/monomers/BR.cif @@ -0,0 +1,30 @@ +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +BR BR 'BROMIDE ION ' NON-POLYMER 1 1 . + +data_comp_BR +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.partial_charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +BR BR BR BR -1.000 0.000 0.000 0.000 + +loop_ +_chem_comp_tree.comp_id +_chem_comp_tree.atom_id +_chem_comp_tree.atom_back +_chem_comp_tree.atom_forward +_chem_comp_tree.connect_type +BR BR n/a . END diff --git a/image_analysis/structure_refinement/monomers/C.cif b/image_analysis/structure_refinement/monomers/C.cif new file mode 100644 index 000000000..0d0c89011 --- /dev/null +++ b/image_analysis/structure_refinement/monomers/C.cif @@ -0,0 +1,255 @@ +# +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +C C "CYTIDINE-5'-MONOPHOSPHATE" RNA 33 21 . +# +data_comp_C +# +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +C OP3 O OP -1 26.264 21.286 -11.211 +C P P P 0 27.065 20.768 -12.391 +C OP1 O O 0 26.731 21.481 -13.688 +C OP2 O OP -1 27.015 19.258 -12.520 +C "O5'" O O2 0 28.604 21.132 -12.071 +C "C5'" C CH2 0 28.962 22.520 -11.845 +C "C4'" C CH1 0 30.463 22.648 -11.735 +C "O4'" O O2 0 30.967 21.749 -10.719 +C "C3'" C CH1 0 31.273 22.268 -12.980 +C "O3'" O OH1 0 31.285 23.333 -13.923 +C "C2'" C CH1 0 32.660 21.973 -12.387 +C "O2'" O OH1 0 33.494 23.113 -12.311 +C "C1'" C CH1 0 32.329 21.476 -10.970 +C N1 N NR6 0 32.565 20.011 -10.805 +C C2 C CR6 0 33.589 19.539 -9.963 +C O2 O O 0 34.302 20.347 -9.344 +C N3 N NRD6 0 33.778 18.197 -9.840 +C C4 C CR6 0 33.005 17.329 -10.512 +C N4 N NH2 0 33.237 16.032 -10.352 +C C5 C CR16 0 31.965 17.787 -11.373 +C C6 C CR16 0 31.786 19.115 -11.490 +C "H5'" H H 0 28.541 22.842 -11.010 +C "H5''" H H 0 28.636 23.077 -12.594 +C "H4'" H H 0 30.676 23.570 -11.475 +C "H3'" H H 0 30.904 21.447 -13.396 +C "HO3'" H H 0 31.819 23.134 -14.553 +C "H2'" H H 0 33.101 21.267 -12.901 +C "HO2'" H H 0 33.087 23.744 -11.913 +C "H1'" H H 0 32.871 21.976 -10.317 +C H41 H H 0 33.920 15.764 -9.869 +C H42 H H 0 32.707 15.443 -10.731 +C H5 H H 0 31.420 17.183 -11.847 +C H6 H H 0 31.112 19.446 -12.046 +loop_ +_chem_comp_bond.comp_id +_chem_comp_bond.atom_id_1 +_chem_comp_bond.atom_id_2 +_chem_comp_bond.type +_chem_comp_bond.aromatic +_chem_comp_bond.value_dist_nucleus +_chem_comp_bond.value_dist_nucleus_esd +_chem_comp_bond.value_dist +_chem_comp_bond.value_dist_esd +C OP3 P SINGLE n 1.517 0.0192 1.517 0.0192 +C P OP1 DOUBLE n 1.517 0.0192 1.517 0.0192 +C P OP2 SINGLE n 1.517 0.0192 1.517 0.0192 +C P "O5'" SINGLE n 1.614 0.0178 1.614 0.0178 +C "O5'" "C5'" SINGLE n 1.450 0.0166 1.450 0.0166 +C "C5'" "C4'" SINGLE n 1.509 0.0100 1.509 0.0100 +C "C4'" "O4'" SINGLE n 1.451 0.0111 1.451 0.0111 +C "C4'" "C3'" SINGLE n 1.535 0.0100 1.535 0.0100 +C "O4'" "C1'" SINGLE n 1.411 0.0100 1.411 0.0100 +C "C3'" "O3'" SINGLE n 1.422 0.0100 1.422 0.0100 +C "C3'" "C2'" SINGLE n 1.533 0.0109 1.533 0.0109 +C "C2'" "O2'" SINGLE n 1.412 0.0100 1.412 0.0100 +C "C2'" "C1'" SINGLE n 1.532 0.0100 1.532 0.0100 +C "C1'" N1 SINGLE n 1.487 0.0100 1.487 0.0100 +C N1 C2 SINGLE y 1.397 0.0100 1.397 0.0100 +C N1 C6 SINGLE y 1.364 0.0108 1.364 0.0108 +C C2 O2 DOUBLE n 1.241 0.0100 1.241 0.0100 +C C2 N3 SINGLE y 1.355 0.0119 1.355 0.0119 +C N3 C4 DOUBLE y 1.339 0.0110 1.339 0.0110 +C C4 N4 SINGLE n 1.325 0.0109 1.325 0.0109 +C C4 C5 SINGLE y 1.422 0.0123 1.422 0.0123 +C C5 C6 DOUBLE y 1.342 0.0100 1.342 0.0100 +C "C5'" "H5'" SINGLE n 1.089 0.0100 0.989 0.0200 +C "C5'" "H5''" SINGLE n 1.089 0.0100 0.989 0.0200 +C "C4'" "H4'" SINGLE n 1.089 0.0100 0.981 0.0200 +C "C3'" "H3'" SINGLE n 1.089 0.0100 0.992 0.0200 +C "O3'" "HO3'" SINGLE n 0.970 0.0120 0.849 0.0200 +C "C2'" "H2'" SINGLE n 1.089 0.0100 0.978 0.0200 +C "O2'" "HO2'" SINGLE n 0.970 0.0120 0.849 0.0200 +C "C1'" "H1'" SINGLE n 1.089 0.0100 0.985 0.0100 +C N4 H41 SINGLE n 1.016 0.0100 0.877 0.0200 +C N4 H42 SINGLE n 1.016 0.0100 0.877 0.0200 +C C5 H5 SINGLE n 1.082 0.0130 0.941 0.0174 +C C6 H6 SINGLE n 1.082 0.0130 0.935 0.0143 +loop_ +_chem_comp_angle.comp_id +_chem_comp_angle.atom_id_1 +_chem_comp_angle.atom_id_2 +_chem_comp_angle.atom_id_3 +_chem_comp_angle.value_angle +_chem_comp_angle.value_angle_esd +C OP3 P OP1 112.864 1.69 +C OP3 P OP2 112.864 1.69 +C OP3 P "O5'" 105.808 2.07 +C OP1 P OP2 112.864 1.69 +C OP1 P "O5'" 105.808 2.07 +C OP2 P "O5'" 105.808 2.07 +C P "O5'" "C5'" 118.783 1.50 +C "O5'" "C5'" "C4'" 109.342 1.50 +C "O5'" "C5'" "H5'" 109.845 1.50 +C "O5'" "C5'" "H5''" 109.845 1.50 +C "C4'" "C5'" "H5'" 109.624 1.50 +C "C4'" "C5'" "H5''" 109.624 1.50 +C "H5'" "C5'" "H5''" 108.472 1.50 +C "C5'" "C4'" "O4'" 109.615 1.50 +C "C5'" "C4'" "C3'" 116.008 1.52 +C "C5'" "C4'" "H4'" 108.268 1.50 +C "O4'" "C4'" "C3'" 104.439 1.50 +C "O4'" "C4'" "H4'" 108.698 1.50 +C "C3'" "C4'" "H4'" 109.363 1.86 +C "C4'" "O4'" "C1'" 109.578 1.50 +C "C4'" "C3'" "O3'" 111.281 2.46 +C "C4'" "C3'" "C2'" 102.071 1.50 +C "C4'" "C3'" "H3'" 110.452 2.54 +C "O3'" "C3'" "C2'" 111.993 3.00 +C "O3'" "C3'" "H3'" 110.380 1.67 +C "C2'" "C3'" "H3'" 110.108 1.66 +C "C3'" "O3'" "HO3'" 108.744 3.00 +C "C3'" "C2'" "O2'" 112.861 2.52 +C "C3'" "C2'" "C1'" 101.269 1.50 +C "C3'" "C2'" "H2'" 110.799 1.82 +C "O2'" "C2'" "C1'" 109.476 3.00 +C "O2'" "C2'" "H2'" 111.022 1.77 +C "C1'" "C2'" "H2'" 110.760 1.63 +C "C2'" "O2'" "HO2'" 109.449 1.85 +C "O4'" "C1'" "C2'" 106.825 1.50 +C "O4'" "C1'" N1 108.667 1.50 +C "O4'" "C1'" "H1'" 109.327 1.50 +C "C2'" "C1'" N1 112.859 1.50 +C "C2'" "C1'" "H1'" 109.776 1.83 +C N1 "C1'" "H1'" 109.166 1.50 +C "C1'" N1 C2 118.189 2.26 +C "C1'" N1 C6 121.301 1.52 +C C2 N1 C6 120.510 1.50 +C N1 C2 O2 118.710 1.50 +C N1 C2 N3 118.927 1.50 +C O2 C2 N3 122.370 1.50 +C C2 N3 C4 120.266 1.50 +C N3 C4 N4 117.855 1.50 +C N3 C4 C5 121.269 1.50 +C N4 C4 C5 120.876 1.50 +C C4 N4 H41 119.818 1.59 +C C4 N4 H42 119.818 1.59 +C H41 N4 H42 120.363 1.85 +C C4 C5 C6 117.808 1.50 +C C4 C5 H5 121.350 1.50 +C C6 C5 H5 120.848 1.50 +C N1 C6 C5 121.215 1.50 +C N1 C6 H6 118.510 1.50 +C C5 C6 H6 120.275 1.75 +loop_ +_chem_comp_tor.comp_id +_chem_comp_tor.id +_chem_comp_tor.atom_id_1 +_chem_comp_tor.atom_id_2 +_chem_comp_tor.atom_id_3 +_chem_comp_tor.atom_id_4 +_chem_comp_tor.value_angle +_chem_comp_tor.value_angle_esd +_chem_comp_tor.period +C C2e-chi "O4'" "C1'" N1 C2 210.000 10.000 6 +C C2e-nyu0 "C4'" "O4'" "C1'" "C2'" 340.700 6.300 1 +C C2e-nyu1 "O4'" "C1'" "C2'" "C3'" 32.800 4.900 1 +C C2e-nyu2 "C1'" "C2'" "C3'" "C4'" 326.9 3.600 1 +C C2e-nyu3 "C2'" "C3'" "C4'" "O4'" 22.600 4.500 1 +C C2e-nyu4 "C3'" "C4'" "O4'" "C1'" 357.700 6.100 1 +C C3e-chi "O4'" "C1'" N1 C2 210.000 10.000 6 +C C3e-nyu0 "C4'" "O4'" "C1'" "C2'" 2.8 6.100 1 +C C3e-nyu1 "O4'" "C1'" "C2'" "C3'" 335.00 4.900 1 +C C3e-nyu2 "C1'" "C2'" "C3'" "C4'" 35.9 2.800 1 +C C3e-nyu3 "C2'" "C3'" "C4'" "O4'" 324.700 3.100 1 +C C3e-nyu4 "C3'" "C4'" "O4'" "C1'" 20.500 5.100 1 +C alpha "C5'" "O5'" P OP3 -60.000 10.00 3 +C beta P "O5'" "C5'" "C4'" 180.000 10.00 3 +C epsi "C4'" "C3'" "O3'" "HO3'" 180.000 10.00 3 +C gamma "O5'" "C5'" "C4'" "C3'" 180.000 10.00 3 +C sp3_sp3_52 "C3'" "C2'" "O2'" "HO2'" 180.000 10.00 3 +C const_sp2_sp2_4 O2 C2 N1 "C1'" 0.000 5.0 2 +C const_18 C5 C6 N1 "C1'" 180.000 10.0 2 +C const_sp2_sp2_6 O2 C2 N3 C4 180.000 5.0 2 +C const_sp2_sp2_8 N4 C4 N3 C2 180.000 5.0 2 +C sp2_sp2_3 N3 C4 N4 H41 0.000 5.0 2 +C const_11 N4 C4 C5 C6 180.000 10.0 2 +C const_13 C4 C5 C6 N1 0.000 10.0 2 +loop_ +_chem_comp_chir.comp_id +_chem_comp_chir.id +_chem_comp_chir.atom_id_centre +_chem_comp_chir.atom_id_1 +_chem_comp_chir.atom_id_2 +_chem_comp_chir.atom_id_3 +_chem_comp_chir.volume_sign +C chir_1 P "O5'" OP3 OP2 both +C chir_2 "C4'" "O4'" "C3'" "C5'" negative +C chir_3 "C3'" "O3'" "C4'" "C2'" positive +C chir_4 "C2'" "O2'" "C1'" "C3'" negative +C chir_5 "C1'" "O4'" N1 "C2'" negative +loop_ +_chem_comp_plane_atom.comp_id +_chem_comp_plane_atom.plane_id +_chem_comp_plane_atom.atom_id +_chem_comp_plane_atom.dist_esd +C plan-1 "C1'" 0.020 +C plan-1 C2 0.020 +C plan-1 C4 0.020 +C plan-1 C5 0.020 +C plan-1 C6 0.020 +C plan-1 H5 0.020 +C plan-1 H6 0.020 +C plan-1 N1 0.020 +C plan-1 N3 0.020 +C plan-1 N4 0.020 +C plan-1 O2 0.020 +C plan-2 C4 0.020 +C plan-2 H41 0.020 +C plan-2 H42 0.020 +C plan-2 N4 0.020 +loop_ +_pdbx_chem_comp_descriptor.comp_id +_pdbx_chem_comp_descriptor.type +_pdbx_chem_comp_descriptor.program +_pdbx_chem_comp_descriptor.program_version +_pdbx_chem_comp_descriptor.descriptor +C SMILES ACDLabs 10.04 O=C1N=C(N)C=CN1C2OC(C(O)C2O)COP(=O)(O)O +C SMILES_CANONICAL CACTVS 3.341 NC1=NC(=O)N(C=C1)[C@@H]2O[C@H](CO[P](O)(O)=O)[C@@H](O)[C@H]2O +C SMILES CACTVS 3.341 NC1=NC(=O)N(C=C1)[CH]2O[CH](CO[P](O)(O)=O)[CH](O)[CH]2O +C SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 C1=CN(C(=O)N=C1N)[C@H]2[C@@H]([C@@H]([C@H](O2)COP(=O)(O)O)O)O +C SMILES "OpenEye OEToolkits" 1.5.0 C1=CN(C(=O)N=C1N)C2C(C(C(O2)COP(=O)(O)O)O)O +C InChI InChI 1.03 InChI=1S/C9H14N3O8P/c10-5-1-2-12(9(15)11-5)8-7(14)6(13)4(20-8)3-19-21(16,17)18/h1-2,4,6-8,13-14H,3H2,(H2,10,11,15)(H2,16,17,18)/t4-,6-,7-,8-/m1/s1 +C InChIKey InChI 1.03 IERHLVCPSMICTF-XVFCMESISA-N +loop_ +_pdbx_chem_comp_description_generator.comp_id +_pdbx_chem_comp_description_generator.program_name +_pdbx_chem_comp_description_generator.program_version +_pdbx_chem_comp_description_generator.descriptor +C acedrg 243 "dictionary generator" +C acedrg_database 11 "data source" +C rdkit 2017.03.2 "Chemoinformatics tool" +C refmac5 5.8.0238 "optimization tool" diff --git a/image_analysis/structure_refinement/monomers/CA.cif b/image_analysis/structure_refinement/monomers/CA.cif new file mode 100644 index 000000000..d1cacc170 --- /dev/null +++ b/image_analysis/structure_refinement/monomers/CA.cif @@ -0,0 +1,30 @@ +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +CA CA 'CALCIUM ION ' NON-POLYMER 1 1 . + +data_comp_CA +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.partial_charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +CA CA CA CA 2.000 0.000 0.000 0.000 + +loop_ +_chem_comp_tree.comp_id +_chem_comp_tree.atom_id +_chem_comp_tree.atom_back +_chem_comp_tree.atom_forward +_chem_comp_tree.connect_type +CA CA n/a . END diff --git a/image_analysis/structure_refinement/monomers/CD.cif b/image_analysis/structure_refinement/monomers/CD.cif new file mode 100644 index 000000000..fbdd3d2de --- /dev/null +++ b/image_analysis/structure_refinement/monomers/CD.cif @@ -0,0 +1,30 @@ +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +CD CD 'CADMIUM ION ' NON-POLYMER 1 1 . + +data_comp_CD +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.partial_charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +CD CD CD CD 2.000 0.000 0.000 0.000 + +loop_ +_chem_comp_tree.comp_id +_chem_comp_tree.atom_id +_chem_comp_tree.atom_back +_chem_comp_tree.atom_forward +_chem_comp_tree.connect_type +CD CD n/a . END diff --git a/image_analysis/structure_refinement/monomers/CL.cif b/image_analysis/structure_refinement/monomers/CL.cif new file mode 100644 index 000000000..0d614ea71 --- /dev/null +++ b/image_analysis/structure_refinement/monomers/CL.cif @@ -0,0 +1,30 @@ +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +CL CL 'CHLORIDE ION ' NON-POLYMER 1 1 . + +data_comp_CL +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.partial_charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +CL CL CL CL -1.000 0.000 0.000 0.000 + +loop_ +_chem_comp_tree.comp_id +_chem_comp_tree.atom_id +_chem_comp_tree.atom_back +_chem_comp_tree.atom_forward +_chem_comp_tree.connect_type +CL CL n/a . END diff --git a/image_analysis/structure_refinement/monomers/CO.cif b/image_analysis/structure_refinement/monomers/CO.cif new file mode 100644 index 000000000..6942e5689 --- /dev/null +++ b/image_analysis/structure_refinement/monomers/CO.cif @@ -0,0 +1,30 @@ +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +CO CO 'COBALT (II) ION ' NON-POLYMER 1 1 . + +data_comp_CO +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.partial_charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +CO CO CO CO 2.000 0.000 0.000 0.000 + +loop_ +_chem_comp_tree.comp_id +_chem_comp_tree.atom_id +_chem_comp_tree.atom_back +_chem_comp_tree.atom_forward +_chem_comp_tree.connect_type +CO CO n/a . END diff --git a/image_analysis/structure_refinement/monomers/COPYING b/image_analysis/structure_refinement/monomers/COPYING new file mode 100644 index 000000000..3f7b8b1e5 --- /dev/null +++ b/image_analysis/structure_refinement/monomers/COPYING @@ -0,0 +1,166 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. + diff --git a/image_analysis/structure_refinement/monomers/CU.cif b/image_analysis/structure_refinement/monomers/CU.cif new file mode 100644 index 000000000..138b89fac --- /dev/null +++ b/image_analysis/structure_refinement/monomers/CU.cif @@ -0,0 +1,30 @@ +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +CU CU 'COPPER (II) ION ' NON-POLYMER 1 1 . + +data_comp_CU +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.partial_charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +CU CU CU CU 2.000 0.000 0.000 0.000 + +loop_ +_chem_comp_tree.comp_id +_chem_comp_tree.atom_id +_chem_comp_tree.atom_back +_chem_comp_tree.atom_forward +_chem_comp_tree.connect_type +CU CU n/a . END diff --git a/image_analysis/structure_refinement/monomers/CYS.cif b/image_analysis/structure_refinement/monomers/CYS.cif new file mode 100644 index 000000000..190d34acf --- /dev/null +++ b/image_analysis/structure_refinement/monomers/CYS.cif @@ -0,0 +1,188 @@ +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +CYS CYS CYSTEINE peptide 14 7 . + +data_comp_CYS +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +CYS N N NT3 1 22.713 13.517 37.695 +CYS CA C CH1 0 22.373 13.685 39.137 +CYS C C C 0 22.022 15.153 39.440 +CYS O O O 0 22.838 16.024 39.065 +CYS CB C CH2 0 23.514 13.225 40.038 +CYS SG S SH1 0 25.070 14.106 39.742 +CYS OXT O OC -1 20.945 15.370 40.038 +CYS H H H 0 23.605 13.433 37.588 +CYS H2 H H 0 22.430 14.227 37.214 +CYS H3 H H 0 22.308 12.777 37.375 +CYS HA H H 0 21.577 13.127 39.328 +CYS HB3 H H 0 23.668 12.265 39.898 +CYS HB2 H H 0 23.255 13.357 40.977 +CYS HG H HSH1 0 25.737 13.537 40.579 + +loop_ +_chem_comp_tree.comp_id +_chem_comp_tree.atom_id +_chem_comp_tree.atom_back +_chem_comp_tree.atom_forward +_chem_comp_tree.connect_type +CYS N n/a CA START +CYS H N . . +CYS H2 N . . +CYS H3 N . . +CYS CA N C . +CYS HA CA . . +CYS CB CA SG . +CYS HB3 CB . . +CYS HB2 CB . . +CYS SG CB . . +CYS HG SG . . +CYS C CA . END +CYS O C . . +CYS OXT C . . + +loop_ +_chem_comp_acedrg.comp_id +_chem_comp_acedrg.atom_id +_chem_comp_acedrg.atom_type +CYS N N(CCCH)(H)3 +CYS CA C(CHHS)(NH3)(COO)(H) +CYS C C(CCHN)(O)2 +CYS O O(CCO) +CYS CB C(CCHN)(SH)(H)2 +CYS SG S(CCHH)(H) +CYS OXT O(CCO) +CYS H H(NCHH) +CYS H2 H(NCHH) +CYS H3 H(NCHH) +CYS HA H(CCCN) +CYS HB3 H(CCHS) +CYS HB2 H(CCHS) +CYS HG H(SC) + +loop_ +_chem_comp_bond.comp_id +_chem_comp_bond.atom_id_1 +_chem_comp_bond.atom_id_2 +_chem_comp_bond.type +_chem_comp_bond.aromatic +_chem_comp_bond.value_dist_nucleus +_chem_comp_bond.value_dist_nucleus_esd +_chem_comp_bond.value_dist +_chem_comp_bond.value_dist_esd +CYS N CA SINGLE n 1.487 0.0100 1.487 0.0100 +CYS CA C SINGLE n 1.538 0.0113 1.538 0.0113 +CYS CA CB SINGLE n 1.524 0.0100 1.524 0.0100 +CYS C O DOUBLE n 1.251 0.0183 1.251 0.0183 +CYS C OXT SINGLE n 1.251 0.0183 1.251 0.0183 +CYS CB SG SINGLE n 1.812 0.0101 1.812 0.0101 +CYS N H SINGLE n 1.018 0.0520 0.902 0.0102 +CYS N H2 SINGLE n 1.018 0.0520 0.902 0.0102 +CYS N H3 SINGLE n 1.018 0.0520 0.902 0.0102 +CYS CA HA SINGLE n 1.092 0.0100 0.991 0.0200 +CYS CB HB3 SINGLE n 1.092 0.0100 0.983 0.0131 +CYS CB HB2 SINGLE n 1.092 0.0100 0.983 0.0131 +CYS SG HG SINGLE n 1.338 0.0100 1.212 0.0200 + +loop_ +_chem_comp_angle.comp_id +_chem_comp_angle.atom_id_1 +_chem_comp_angle.atom_id_2 +_chem_comp_angle.atom_id_3 +_chem_comp_angle.value_angle +_chem_comp_angle.value_angle_esd +CYS CA N H 109.684 2.12 +CYS CA N H2 109.684 2.12 +CYS CA N H3 109.684 2.12 +CYS H N H2 109.032 3.00 +CYS H N H3 109.032 3.00 +CYS H2 N H3 109.032 3.00 +CYS N CA C 109.504 1.50 +CYS N CA CB 110.927 1.50 +CYS N CA HA 107.886 1.50 +CYS C CA CB 110.126 3.00 +CYS C CA HA 108.362 1.50 +CYS CB CA HA 108.525 2.42 +CYS CA C O 117.126 1.50 +CYS CA C OXT 117.126 1.50 +CYS O C OXT 125.747 1.50 +CYS CA CB SG 113.492 1.50 +CYS CA CB HB3 109.109 1.50 +CYS CA CB HB2 109.109 1.50 +CYS SG CB HB3 108.513 1.50 +CYS SG CB HB2 108.513 1.50 +CYS HB3 CB HB2 107.963 1.50 +CYS CB SG HG 97.543 3.00 + +loop_ +_chem_comp_tor.comp_id +_chem_comp_tor.id +_chem_comp_tor.atom_id_1 +_chem_comp_tor.atom_id_2 +_chem_comp_tor.atom_id_3 +_chem_comp_tor.atom_id_4 +_chem_comp_tor.value_angle +_chem_comp_tor.value_angle_esd +_chem_comp_tor.period +CYS chi1 N CA CB SG -60.000 10.0 3 +CYS chi2 CA CB SG HG 180.000 10.0 3 +CYS sp3_sp3_1 C CA N H 180.000 10.0 3 +CYS sp2_sp3_1 O C CA N 0.000 10.0 6 + +loop_ +_chem_comp_chir.comp_id +_chem_comp_chir.id +_chem_comp_chir.atom_id_centre +_chem_comp_chir.atom_id_1 +_chem_comp_chir.atom_id_2 +_chem_comp_chir.atom_id_3 +_chem_comp_chir.volume_sign +CYS chir_1 CA N CB C negative + +loop_ +_chem_comp_plane_atom.comp_id +_chem_comp_plane_atom.plane_id +_chem_comp_plane_atom.atom_id +_chem_comp_plane_atom.dist_esd +CYS plan-1 C 0.020 +CYS plan-1 CA 0.020 +CYS plan-1 O 0.020 +CYS plan-1 OXT 0.020 + +loop_ +_pdbx_chem_comp_descriptor.comp_id +_pdbx_chem_comp_descriptor.type +_pdbx_chem_comp_descriptor.program +_pdbx_chem_comp_descriptor.program_version +_pdbx_chem_comp_descriptor.descriptor +CYS SMILES ACDLabs 10.04 O=C(O)C(N)CS +CYS SMILES_CANONICAL CACTVS 3.341 N[C@@H](CS)C(O)=O +CYS SMILES CACTVS 3.341 N[CH](CS)C(O)=O +CYS SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 C([C@@H](C(=O)O)N)S +CYS SMILES "OpenEye OEToolkits" 1.5.0 C(C(C(=O)O)N)S +CYS InChI InChI 1.03 InChI=1S/C3H7NO2S/c4-2(1-7)3(5)6/h2,7H,1,4H2,(H,5,6)/t2-/m0/s1 +CYS InChIKey InChI 1.03 XUJNEKJLAYXESH-REOHCLBHSA-N + +loop_ +_pdbx_chem_comp_description_generator.comp_id +_pdbx_chem_comp_description_generator.program_name +_pdbx_chem_comp_description_generator.program_version +_pdbx_chem_comp_description_generator.descriptor +CYS acedrg 278 "dictionary generator" +CYS acedrg_database 12 "data source" +CYS rdkit 2019.09.1 "Chemoinformatics tool" +CYS refmac5 5.8.0419 "optimization tool" diff --git a/image_analysis/structure_refinement/monomers/DA.cif b/image_analysis/structure_refinement/monomers/DA.cif new file mode 100644 index 000000000..268788579 --- /dev/null +++ b/image_analysis/structure_refinement/monomers/DA.cif @@ -0,0 +1,266 @@ +# +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +DA DA "2'-DEOXYADENOSINE-5'-MONOPHOSPHATE" DNA 34 22 . +# +data_comp_DA +# +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +DA OP3 O OP -1 -6.497 8.522 9.951 +DA P P P 0 -5.346 9.062 9.122 +DA OP1 O O 0 -4.898 10.441 9.565 +DA OP2 O OP -1 -5.605 8.977 7.630 +DA "O5'" O O2 0 -4.097 8.080 9.408 +DA "C5'" C CH2 0 -3.640 7.912 10.774 +DA "C4'" C CH1 0 -2.470 6.958 10.801 +DA "O4'" O O2 0 -2.888 5.686 10.260 +DA "C3'" C CH1 0 -1.251 7.408 9.993 +DA "O3'" O OH1 0 -0.049 7.159 10.716 +DA "C2'" C CH2 0 -1.324 6.542 8.739 +DA "C1'" C CH1 0 -1.962 5.267 9.263 +DA N9 N NR5 0 -2.687 4.489 8.258 +DA C8 C CR15 0 -3.753 4.911 7.501 +DA N7 N NRD5 0 -4.206 3.997 6.680 +DA C5 C CR56 0 -3.393 2.896 6.907 +DA C6 C CR6 0 -3.368 1.602 6.342 +DA N6 N NH2 0 -4.214 1.192 5.400 +DA N1 N NRD6 0 -2.423 0.736 6.793 +DA C2 C CR16 0 -1.573 1.156 7.744 +DA N3 N NRD6 0 -1.504 2.345 8.344 +DA C4 C CR56 0 -2.450 3.184 7.880 +DA "H5'" H H 0 -4.373 7.554 11.332 +DA "H5''" H H 0 -3.363 8.786 11.145 +DA "H4'" H H 0 -2.203 6.829 11.743 +DA "H3'" H H 0 -1.322 8.365 9.759 +DA "HO3'" H H 0 0.583 7.601 10.361 +DA "H2'" H H 0 -0.433 6.369 8.376 +DA "H2''" H H 0 -1.875 6.962 8.051 +DA "H1'" H H 0 -1.264 4.700 9.685 +DA H8 H H 0 -4.120 5.776 7.565 +DA H61 H H 0 -4.304 0.334 5.236 +DA H62 H H 0 -4.679 1.782 4.946 +DA H2 H H 0 -0.933 0.520 8.026 +loop_ +_chem_comp_bond.comp_id +_chem_comp_bond.atom_id_1 +_chem_comp_bond.atom_id_2 +_chem_comp_bond.type +_chem_comp_bond.aromatic +_chem_comp_bond.value_dist_nucleus +_chem_comp_bond.value_dist_nucleus_esd +_chem_comp_bond.value_dist +_chem_comp_bond.value_dist_esd +DA OP3 P SINGLE n 1.517 0.0192 1.517 0.0192 +DA P OP1 DOUBLE n 1.517 0.0192 1.517 0.0192 +DA P OP2 SINGLE n 1.517 0.0192 1.517 0.0192 +DA P "O5'" SINGLE n 1.614 0.0178 1.614 0.0178 +DA "O5'" "C5'" SINGLE n 1.450 0.0166 1.450 0.0166 +DA "C5'" "C4'" SINGLE n 1.509 0.0100 1.509 0.0100 +DA "C4'" "O4'" SINGLE n 1.442 0.0100 1.442 0.0100 +DA "C4'" "C3'" SINGLE n 1.526 0.0115 1.526 0.0115 +DA "O4'" "C1'" SINGLE n 1.425 0.0100 1.425 0.0100 +DA "C3'" "O3'" SINGLE n 1.424 0.0100 1.424 0.0100 +DA "C3'" "C2'" SINGLE n 1.526 0.0101 1.526 0.0101 +DA "C2'" "C1'" SINGLE n 1.521 0.0118 1.521 0.0118 +DA "C1'" N9 SINGLE n 1.462 0.0111 1.462 0.0111 +DA N9 C8 SINGLE y 1.373 0.0100 1.373 0.0100 +DA N9 C4 SINGLE y 1.377 0.0100 1.377 0.0100 +DA C8 N7 DOUBLE y 1.310 0.0100 1.310 0.0100 +DA N7 C5 SINGLE y 1.388 0.0100 1.388 0.0100 +DA C5 C6 SINGLE y 1.408 0.0100 1.408 0.0100 +DA C5 C4 DOUBLE y 1.381 0.0100 1.381 0.0100 +DA C6 N6 SINGLE n 1.330 0.0100 1.330 0.0100 +DA C6 N1 DOUBLE y 1.354 0.0100 1.354 0.0100 +DA N1 C2 SINGLE y 1.339 0.0100 1.339 0.0100 +DA C2 N3 DOUBLE y 1.330 0.0100 1.330 0.0100 +DA N3 C4 SINGLE y 1.343 0.0100 1.343 0.0100 +DA "C5'" "H5'" SINGLE n 1.089 0.0100 0.989 0.0200 +DA "C5'" "H5''" SINGLE n 1.089 0.0100 0.989 0.0200 +DA "C4'" "H4'" SINGLE n 1.089 0.0100 0.987 0.0170 +DA "C3'" "H3'" SINGLE n 1.089 0.0100 0.988 0.0189 +DA "O3'" "HO3'" SINGLE n 0.970 0.0120 0.849 0.0200 +DA "C2'" "H2'" SINGLE n 1.089 0.0100 0.977 0.0113 +DA "C2'" "H2''" SINGLE n 1.089 0.0100 0.977 0.0113 +DA "C1'" "H1'" SINGLE n 1.089 0.0100 0.993 0.0101 +DA C8 H8 SINGLE n 1.082 0.0130 0.942 0.0170 +DA N6 H61 SINGLE n 1.016 0.0100 0.877 0.0200 +DA N6 H62 SINGLE n 1.016 0.0100 0.877 0.0200 +DA C2 H2 SINGLE n 1.082 0.0130 0.945 0.0200 +loop_ +_chem_comp_angle.comp_id +_chem_comp_angle.atom_id_1 +_chem_comp_angle.atom_id_2 +_chem_comp_angle.atom_id_3 +_chem_comp_angle.value_angle +_chem_comp_angle.value_angle_esd +DA OP3 P OP1 112.864 1.69 +DA OP3 P OP2 112.864 1.69 +DA OP3 P "O5'" 105.808 2.07 +DA OP1 P OP2 112.864 1.69 +DA OP1 P "O5'" 105.808 2.07 +DA OP2 P "O5'" 105.808 2.07 +DA P "O5'" "C5'" 118.783 1.50 +DA "O5'" "C5'" "C4'" 109.342 1.50 +DA "O5'" "C5'" "H5'" 109.845 1.50 +DA "O5'" "C5'" "H5''" 109.845 1.50 +DA "C4'" "C5'" "H5'" 109.624 1.50 +DA "C4'" "C5'" "H5''" 109.624 1.50 +DA "H5'" "C5'" "H5''" 108.472 1.50 +DA "C5'" "C4'" "O4'" 109.123 1.50 +DA "C5'" "C4'" "C3'" 114.866 1.63 +DA "C5'" "C4'" "H4'" 108.268 1.50 +DA "O4'" "C4'" "C3'" 105.506 1.50 +DA "O4'" "C4'" "H4'" 108.947 1.50 +DA "C3'" "C4'" "H4'" 109.069 1.50 +DA "C4'" "O4'" "C1'" 108.795 1.50 +DA "C4'" "C3'" "O3'" 110.527 2.37 +DA "C4'" "C3'" "C2'" 102.433 1.50 +DA "C4'" "C3'" "H3'" 110.775 1.50 +DA "O3'" "C3'" "C2'" 111.424 1.96 +DA "O3'" "C3'" "H3'" 110.713 1.50 +DA "C2'" "C3'" "H3'" 110.846 1.50 +DA "C3'" "O3'" "HO3'" 109.026 2.38 +DA "C3'" "C2'" "C1'" 102.663 1.50 +DA "C3'" "C2'" "H2'" 111.194 1.50 +DA "C3'" "C2'" "H2''" 111.194 1.50 +DA "C1'" "C2'" "H2'" 111.213 1.50 +DA "C1'" "C2'" "H2''" 111.213 1.50 +DA "H2'" "C2'" "H2''" 109.148 1.50 +DA "O4'" "C1'" "C2'" 106.035 1.50 +DA "O4'" "C1'" N9 108.236 1.50 +DA "O4'" "C1'" "H1'" 109.059 1.50 +DA "C2'" "C1'" N9 114.190 1.67 +DA "C2'" "C1'" "H1'" 109.272 1.50 +DA N9 "C1'" "H1'" 109.282 1.50 +DA "C1'" N9 C8 127.636 2.81 +DA "C1'" N9 C4 126.671 2.93 +DA C8 N9 C4 105.693 1.50 +DA N9 C8 N7 113.469 1.50 +DA N9 C8 H8 123.206 1.50 +DA N7 C8 H8 123.326 1.50 +DA C8 N7 C5 104.739 1.50 +DA N7 C5 C6 132.250 1.50 +DA N7 C5 C4 110.483 1.50 +DA C6 C5 C4 117.267 1.50 +DA C5 C6 N6 123.792 1.50 +DA C5 C6 N1 117.409 1.50 +DA N6 C6 N1 118.799 1.50 +DA C6 N6 H61 119.723 1.50 +DA C6 N6 H62 119.723 1.50 +DA H61 N6 H62 120.554 1.88 +DA C6 N1 C2 118.521 1.50 +DA N1 C2 N3 129.332 1.50 +DA N1 C2 H2 115.313 1.50 +DA N3 C2 H2 115.355 1.50 +DA C2 N3 C4 110.982 1.50 +DA N9 C4 C5 105.616 1.50 +DA N9 C4 N3 127.895 1.50 +DA C5 C4 N3 126.489 1.50 +loop_ +_chem_comp_tor.comp_id +_chem_comp_tor.id +_chem_comp_tor.atom_id_1 +_chem_comp_tor.atom_id_2 +_chem_comp_tor.atom_id_3 +_chem_comp_tor.atom_id_4 +_chem_comp_tor.value_angle +_chem_comp_tor.value_angle_esd +_chem_comp_tor.period +DA C2e-chi "O4'" "C1'" N9 C4 210.000 10.000 6 +DA C2e-nyu0 "C4'" "O4'" "C1'" "C2'" 340.700 6.300 1 +DA C2e-nyu1 "O4'" "C1'" "C2'" "C3'" 32.800 4.900 1 +DA C2e-nyu2 "C1'" "C2'" "C3'" "C4'" 326.9 3.600 1 +DA C2e-nyu3 "C2'" "C3'" "C4'" "O4'" 22.600 4.500 1 +DA C2e-nyu4 "C3'" "C4'" "O4'" "C1'" 357.700 6.100 1 +DA C3e-chi "O4'" "C1'" N9 C4 210.000 10.000 6 +DA C3e-nyu0 "C4'" "O4'" "C1'" "C2'" 2.8 6.100 1 +DA C3e-nyu1 "O4'" "C1'" "C2'" "C3'" 335.00 4.900 1 +DA C3e-nyu2 "C1'" "C2'" "C3'" "C4'" 35.9 2.800 1 +DA C3e-nyu3 "C2'" "C3'" "C4'" "O4'" 324.700 3.100 1 +DA C3e-nyu4 "C3'" "C4'" "O4'" "C1'" 20.500 5.100 1 +DA alpha "C5'" "O5'" P OP3 -60.000 10.00 3 +DA beta P "O5'" "C5'" "C4'" 180.000 10.00 3 +DA epsi "C4'" "C3'" "O3'" "HO3'" 180.000 10.00 3 +DA gamma "O5'" "C5'" "C4'" "C3'" 180.000 10.00 3 +DA const_14 N7 C8 N9 "C1'" 180.000 10.0 2 +DA const_26 C5 C4 N9 "C1'" 180.000 10.0 2 +DA const_17 N9 C8 N7 C5 0.000 10.0 2 +DA const_20 C6 C5 N7 C8 180.000 10.0 2 +DA const_sp2_sp2_4 N7 C5 C6 N6 0.000 5.0 2 +DA const_21 N9 C4 C5 N7 0.000 10.0 2 +DA sp2_sp2_1 C5 C6 N6 H61 180.000 5.0 2 +DA const_sp2_sp2_6 N6 C6 N1 C2 180.000 5.0 2 +DA const_sp2_sp2_7 N3 C2 N1 C6 0.000 5.0 2 +DA const_sp2_sp2_9 N1 C2 N3 C4 0.000 5.0 2 +DA const_12 N9 C4 N3 C2 180.000 10.0 2 +loop_ +_chem_comp_chir.comp_id +_chem_comp_chir.id +_chem_comp_chir.atom_id_centre +_chem_comp_chir.atom_id_1 +_chem_comp_chir.atom_id_2 +_chem_comp_chir.atom_id_3 +_chem_comp_chir.volume_sign +DA chir_1 P "O5'" OP3 OP2 both +DA chir_2 "C4'" "O4'" "C3'" "C5'" negative +DA chir_3 "C3'" "O3'" "C4'" "C2'" positive +DA chir_4 "C1'" "O4'" N9 "C2'" negative +loop_ +_chem_comp_plane_atom.comp_id +_chem_comp_plane_atom.plane_id +_chem_comp_plane_atom.atom_id +_chem_comp_plane_atom.dist_esd +DA plan-1 "C1'" 0.020 +DA plan-1 C2 0.020 +DA plan-1 C4 0.020 +DA plan-1 C5 0.020 +DA plan-1 C6 0.020 +DA plan-1 C8 0.020 +DA plan-1 H2 0.020 +DA plan-1 H8 0.020 +DA plan-1 N1 0.020 +DA plan-1 N3 0.020 +DA plan-1 N6 0.020 +DA plan-1 N7 0.020 +DA plan-1 N9 0.020 +DA plan-2 C6 0.020 +DA plan-2 H61 0.020 +DA plan-2 H62 0.020 +DA plan-2 N6 0.020 +loop_ +_pdbx_chem_comp_descriptor.comp_id +_pdbx_chem_comp_descriptor.type +_pdbx_chem_comp_descriptor.program +_pdbx_chem_comp_descriptor.program_version +_pdbx_chem_comp_descriptor.descriptor +DA SMILES ACDLabs 10.04 O=P(O)(O)OCC3OC(n2cnc1c(ncnc12)N)CC3O +DA SMILES_CANONICAL CACTVS 3.341 Nc1ncnc2n(cnc12)[C@H]3C[C@H](O)[C@@H](CO[P](O)(O)=O)O3 +DA SMILES CACTVS 3.341 Nc1ncnc2n(cnc12)[CH]3C[CH](O)[CH](CO[P](O)(O)=O)O3 +DA SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 c1nc(c2c(n1)n(cn2)[C@H]3C[C@@H]([C@H](O3)COP(=O)(O)O)O)N +DA SMILES "OpenEye OEToolkits" 1.5.0 c1nc(c2c(n1)n(cn2)C3CC(C(O3)COP(=O)(O)O)O)N +DA InChI InChI 1.03 InChI=1S/C10H14N5O6P/c11-9-8-10(13-3-12-9)15(4-14-8)7-1-5(16)6(21-7)2-20-22(17,18)19/h3-7,16H,1-2H2,(H2,11,12,13)(H2,17,18,19)/t5-,6+,7+/m0/s1 +DA InChIKey InChI 1.03 KHWCHTKSEGGWEX-RRKCRQDMSA-N +loop_ +_pdbx_chem_comp_description_generator.comp_id +_pdbx_chem_comp_description_generator.program_name +_pdbx_chem_comp_description_generator.program_version +_pdbx_chem_comp_description_generator.descriptor +DA acedrg 243 "dictionary generator" +DA acedrg_database 11 "data source" +DA rdkit 2017.03.2 "Chemoinformatics tool" +DA refmac5 5.8.0238 "optimization tool" diff --git a/image_analysis/structure_refinement/monomers/DC.cif b/image_analysis/structure_refinement/monomers/DC.cif new file mode 100644 index 000000000..f0373996c --- /dev/null +++ b/image_analysis/structure_refinement/monomers/DC.cif @@ -0,0 +1,250 @@ +# +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +DC DC "2'-DEOXYCYTIDINE-5'-MONOPHOSPHATE" DNA 32 20 . +# +data_comp_DC +# +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +DC OP3 O OP -1 4.759 -6.216 1.740 +DC P P P 0 5.427 -6.783 0.501 +DC OP1 O O 0 5.450 -8.300 0.487 +DC OP2 O OP -1 6.788 -6.171 0.232 +DC "O5'" O O2 0 4.494 -6.346 -0.742 +DC "C5'" C CH2 0 3.097 -6.734 -0.736 +DC "C4'" C CH1 0 2.438 -6.261 -2.009 +DC "O4'" O O2 0 2.537 -4.821 -2.097 +DC "C3'" C CH1 0 3.044 -6.825 -3.297 +DC "O3'" O OH1 0 2.035 -7.363 -4.147 +DC "C2'" C CH2 0 3.705 -5.618 -3.951 +DC "C1'" C CH1 0 2.890 -4.454 -3.414 +DC N1 N NR6 0 3.622 -3.158 -3.358 +DC C2 C CR6 0 3.233 -2.087 -4.185 +DC O2 O O 0 2.273 -2.221 -4.961 +DC N3 N NRD6 0 3.923 -0.917 -4.114 +DC C4 C CR6 0 4.961 -0.779 -3.274 +DC N4 N NH2 0 5.596 0.387 -3.250 +DC C5 C CR16 0 5.371 -1.854 -2.432 +DC C6 C CR16 0 4.683 -3.007 -2.507 +DC "H5'" H H 0 2.640 -6.331 0.044 +DC "H5''" H H 0 3.022 -7.718 -0.669 +DC "H4'" H H 0 1.482 -6.507 -1.967 +DC "H3'" H H 0 3.719 -7.516 -3.087 +DC "HO3'" H H 0 1.460 -6.765 -4.330 +DC "H2'" H H 0 3.647 -5.668 -4.930 +DC "H2''" H H 0 4.648 -5.546 -3.691 +DC "H1'" H H 0 2.063 -4.358 -3.951 +DC H41 H H 0 5.385 1.014 -3.827 +DC H42 H H 0 6.226 0.528 -2.656 +DC H5 H H 0 6.097 -1.763 -1.841 +DC H6 H H 0 4.929 -3.731 -1.969 +loop_ +_chem_comp_bond.comp_id +_chem_comp_bond.atom_id_1 +_chem_comp_bond.atom_id_2 +_chem_comp_bond.type +_chem_comp_bond.aromatic +_chem_comp_bond.value_dist_nucleus +_chem_comp_bond.value_dist_nucleus_esd +_chem_comp_bond.value_dist +_chem_comp_bond.value_dist_esd +DC OP3 P SINGLE n 1.517 0.0192 1.517 0.0192 +DC P OP1 DOUBLE n 1.517 0.0192 1.517 0.0192 +DC P OP2 SINGLE n 1.517 0.0192 1.517 0.0192 +DC P "O5'" SINGLE n 1.614 0.0178 1.614 0.0178 +DC "O5'" "C5'" SINGLE n 1.450 0.0166 1.450 0.0166 +DC "C5'" "C4'" SINGLE n 1.509 0.0100 1.509 0.0100 +DC "C4'" "O4'" SINGLE n 1.445 0.0100 1.445 0.0100 +DC "C4'" "C3'" SINGLE n 1.526 0.0115 1.526 0.0115 +DC "O4'" "C1'" SINGLE n 1.413 0.0100 1.413 0.0100 +DC "C3'" "O3'" SINGLE n 1.424 0.0100 1.424 0.0100 +DC "C3'" "C2'" SINGLE n 1.522 0.0100 1.522 0.0100 +DC "C2'" "C1'" SINGLE n 1.520 0.0100 1.520 0.0100 +DC "C1'" N1 SINGLE n 1.480 0.0115 1.480 0.0115 +DC N1 C2 SINGLE y 1.397 0.0100 1.397 0.0100 +DC N1 C6 SINGLE y 1.360 0.0118 1.360 0.0118 +DC C2 O2 DOUBLE n 1.241 0.0100 1.241 0.0100 +DC C2 N3 SINGLE y 1.355 0.0119 1.355 0.0119 +DC N3 C4 DOUBLE y 1.339 0.0110 1.339 0.0110 +DC C4 N4 SINGLE n 1.325 0.0109 1.325 0.0109 +DC C4 C5 SINGLE y 1.422 0.0123 1.422 0.0123 +DC C5 C6 DOUBLE y 1.342 0.0100 1.342 0.0100 +DC "C5'" "H5'" SINGLE n 1.089 0.0100 0.989 0.0200 +DC "C5'" "H5''" SINGLE n 1.089 0.0100 0.989 0.0200 +DC "C4'" "H4'" SINGLE n 1.089 0.0100 0.987 0.0170 +DC "C3'" "H3'" SINGLE n 1.089 0.0100 0.988 0.0189 +DC "O3'" "HO3'" SINGLE n 0.970 0.0120 0.849 0.0200 +DC "C2'" "H2'" SINGLE n 1.089 0.0100 0.982 0.0200 +DC "C2'" "H2''" SINGLE n 1.089 0.0100 0.982 0.0200 +DC "C1'" "H1'" SINGLE n 1.089 0.0100 0.991 0.0103 +DC N4 H41 SINGLE n 1.016 0.0100 0.877 0.0200 +DC N4 H42 SINGLE n 1.016 0.0100 0.877 0.0200 +DC C5 H5 SINGLE n 1.082 0.0130 0.941 0.0174 +DC C6 H6 SINGLE n 1.082 0.0130 0.935 0.0143 +loop_ +_chem_comp_angle.comp_id +_chem_comp_angle.atom_id_1 +_chem_comp_angle.atom_id_2 +_chem_comp_angle.atom_id_3 +_chem_comp_angle.value_angle +_chem_comp_angle.value_angle_esd +DC OP3 P OP1 112.864 1.69 +DC OP3 P OP2 112.864 1.69 +DC OP3 P "O5'" 105.808 2.07 +DC OP1 P OP2 112.864 1.69 +DC OP1 P "O5'" 105.808 2.07 +DC OP2 P "O5'" 105.808 2.07 +DC P "O5'" "C5'" 118.783 1.50 +DC "O5'" "C5'" "C4'" 109.342 1.50 +DC "O5'" "C5'" "H5'" 109.845 1.50 +DC "O5'" "C5'" "H5''" 109.845 1.50 +DC "C4'" "C5'" "H5'" 109.624 1.50 +DC "C4'" "C5'" "H5''" 109.624 1.50 +DC "H5'" "C5'" "H5''" 108.472 1.50 +DC "C5'" "C4'" "O4'" 109.615 1.50 +DC "C5'" "C4'" "C3'" 114.866 1.63 +DC "C5'" "C4'" "H4'" 108.268 1.50 +DC "O4'" "C4'" "C3'" 105.770 1.50 +DC "O4'" "C4'" "H4'" 108.698 1.50 +DC "C3'" "C4'" "H4'" 109.069 1.50 +DC "C4'" "O4'" "C1'" 109.692 1.50 +DC "C4'" "C3'" "O3'" 110.527 2.37 +DC "C4'" "C3'" "C2'" 102.800 1.50 +DC "C4'" "C3'" "H3'" 110.775 1.50 +DC "O3'" "C3'" "C2'" 110.636 2.59 +DC "O3'" "C3'" "H3'" 110.713 1.50 +DC "C2'" "C3'" "H3'" 110.862 1.50 +DC "C3'" "O3'" "HO3'" 109.026 2.38 +DC "C3'" "C2'" "C1'" 102.834 1.50 +DC "C3'" "C2'" "H2'" 111.310 1.50 +DC "C3'" "C2'" "H2''" 111.310 1.50 +DC "C1'" "C2'" "H2'" 111.187 1.50 +DC "C1'" "C2'" "H2''" 111.187 1.50 +DC "H2'" "C2'" "H2''" 108.952 1.50 +DC "O4'" "C1'" "C2'" 106.308 1.50 +DC "O4'" "C1'" N1 107.584 1.50 +DC "O4'" "C1'" "H1'" 109.550 1.50 +DC "C2'" "C1'" N1 114.268 1.50 +DC "C2'" "C1'" "H1'" 109.741 1.50 +DC N1 "C1'" "H1'" 109.342 1.50 +DC "C1'" N1 C2 118.777 1.50 +DC "C1'" N1 C6 120.713 1.50 +DC C2 N1 C6 120.510 1.50 +DC N1 C2 O2 118.710 1.50 +DC N1 C2 N3 118.927 1.50 +DC O2 C2 N3 122.370 1.50 +DC C2 N3 C4 120.266 1.50 +DC N3 C4 N4 117.855 1.50 +DC N3 C4 C5 121.269 1.50 +DC N4 C4 C5 120.876 1.50 +DC C4 N4 H41 119.818 1.59 +DC C4 N4 H42 119.818 1.59 +DC H41 N4 H42 120.363 1.85 +DC C4 C5 C6 117.808 1.50 +DC C4 C5 H5 121.350 1.50 +DC C6 C5 H5 120.848 1.50 +DC N1 C6 C5 121.215 1.50 +DC N1 C6 H6 118.510 1.50 +DC C5 C6 H6 120.275 1.75 +loop_ +_chem_comp_tor.comp_id +_chem_comp_tor.id +_chem_comp_tor.atom_id_1 +_chem_comp_tor.atom_id_2 +_chem_comp_tor.atom_id_3 +_chem_comp_tor.atom_id_4 +_chem_comp_tor.value_angle +_chem_comp_tor.value_angle_esd +_chem_comp_tor.period +DC C2e-chi "O4'" "C1'" N1 C2 210.000 10.000 6 +DC C2e-nyu0 "C4'" "O4'" "C1'" "C2'" 340.700 6.300 1 +DC C2e-nyu1 "O4'" "C1'" "C2'" "C3'" 32.800 4.900 1 +DC C2e-nyu2 "C1'" "C2'" "C3'" "C4'" 326.9 3.600 1 +DC C2e-nyu3 "C2'" "C3'" "C4'" "O4'" 22.600 4.500 1 +DC C2e-nyu4 "C3'" "C4'" "O4'" "C1'" 357.700 6.100 1 +DC C3e-chi "O4'" "C1'" N1 C2 210.000 10.000 6 +DC C3e-nyu0 "C4'" "O4'" "C1'" "C2'" 2.8 6.100 1 +DC C3e-nyu1 "O4'" "C1'" "C2'" "C3'" 335.00 4.900 1 +DC C3e-nyu2 "C1'" "C2'" "C3'" "C4'" 35.9 2.800 1 +DC C3e-nyu3 "C2'" "C3'" "C4'" "O4'" 324.700 3.100 1 +DC C3e-nyu4 "C3'" "C4'" "O4'" "C1'" 20.500 5.100 1 +DC alpha "C5'" "O5'" P OP3 -60.000 10.00 3 +DC beta P "O5'" "C5'" "C4'" 180.000 10.00 3 +DC epsi "C4'" "C3'" "O3'" "HO3'" 180.000 10.00 3 +DC gamma "O5'" "C5'" "C4'" "C3'" 180.000 10.00 3 +DC const_sp2_sp2_4 O2 C2 N1 "C1'" 0.000 5.0 2 +DC const_18 C5 C6 N1 "C1'" 180.000 10.0 2 +DC const_sp2_sp2_6 O2 C2 N3 C4 180.000 5.0 2 +DC const_sp2_sp2_8 N4 C4 N3 C2 180.000 5.0 2 +DC sp2_sp2_3 N3 C4 N4 H41 0.000 5.0 2 +DC const_11 N4 C4 C5 C6 180.000 10.0 2 +DC const_13 C4 C5 C6 N1 0.000 10.0 2 +loop_ +_chem_comp_chir.comp_id +_chem_comp_chir.id +_chem_comp_chir.atom_id_centre +_chem_comp_chir.atom_id_1 +_chem_comp_chir.atom_id_2 +_chem_comp_chir.atom_id_3 +_chem_comp_chir.volume_sign +DC chir_1 P "O5'" OP3 OP2 both +DC chir_2 "C4'" "O4'" "C3'" "C5'" negative +DC chir_3 "C3'" "O3'" "C4'" "C2'" positive +DC chir_4 "C1'" "O4'" N1 "C2'" negative +loop_ +_chem_comp_plane_atom.comp_id +_chem_comp_plane_atom.plane_id +_chem_comp_plane_atom.atom_id +_chem_comp_plane_atom.dist_esd +DC plan-1 "C1'" 0.020 +DC plan-1 C2 0.020 +DC plan-1 C4 0.020 +DC plan-1 C5 0.020 +DC plan-1 C6 0.020 +DC plan-1 H5 0.020 +DC plan-1 H6 0.020 +DC plan-1 N1 0.020 +DC plan-1 N3 0.020 +DC plan-1 N4 0.020 +DC plan-1 O2 0.020 +DC plan-2 C4 0.020 +DC plan-2 H41 0.020 +DC plan-2 H42 0.020 +DC plan-2 N4 0.020 +loop_ +_pdbx_chem_comp_descriptor.comp_id +_pdbx_chem_comp_descriptor.type +_pdbx_chem_comp_descriptor.program +_pdbx_chem_comp_descriptor.program_version +_pdbx_chem_comp_descriptor.descriptor +DC SMILES ACDLabs 10.04 O=C1N=C(N)C=CN1C2OC(C(O)C2)COP(=O)(O)O +DC SMILES_CANONICAL CACTVS 3.341 NC1=NC(=O)N(C=C1)[C@H]2C[C@H](O)[C@@H](CO[P](O)(O)=O)O2 +DC SMILES CACTVS 3.341 NC1=NC(=O)N(C=C1)[CH]2C[CH](O)[CH](CO[P](O)(O)=O)O2 +DC SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 C1[C@@H]([C@H](O[C@H]1N2C=CC(=NC2=O)N)COP(=O)(O)O)O +DC SMILES "OpenEye OEToolkits" 1.5.0 C1C(C(OC1N2C=CC(=NC2=O)N)COP(=O)(O)O)O +DC InChI InChI 1.03 InChI=1S/C9H14N3O7P/c10-7-1-2-12(9(14)11-7)8-3-5(13)6(19-8)4-18-20(15,16)17/h1-2,5-6,8,13H,3-4H2,(H2,10,11,14)(H2,15,16,17)/t5-,6+,8+/m0/s1 +DC InChIKey InChI 1.03 NCMVOABPESMRCP-SHYZEUOFSA-N +loop_ +_pdbx_chem_comp_description_generator.comp_id +_pdbx_chem_comp_description_generator.program_name +_pdbx_chem_comp_description_generator.program_version +_pdbx_chem_comp_description_generator.descriptor +DC acedrg 243 "dictionary generator" +DC acedrg_database 11 "data source" +DC rdkit 2017.03.2 "Chemoinformatics tool" +DC refmac5 5.8.0238 "optimization tool" diff --git a/image_analysis/structure_refinement/monomers/DG.cif b/image_analysis/structure_refinement/monomers/DG.cif new file mode 100644 index 000000000..1073727b3 --- /dev/null +++ b/image_analysis/structure_refinement/monomers/DG.cif @@ -0,0 +1,271 @@ +# +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +DG DG "2'-DEOXYGUANOSINE-5'-MONOPHOSPHATE" DNA 35 23 . +# +data_comp_DG +# +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +DG OP3 O OP -1 0.424 -8.734 -9.816 +DG P P P 0 0.296 -8.811 -11.326 +DG OP1 O O 0 -0.898 -9.631 -11.775 +DG OP2 O OP -1 1.587 -9.229 -12.005 +DG "O5'" O O2 0 0.007 -7.303 -11.822 +DG "C5'" C CH2 0 -1.170 -6.617 -11.324 +DG "C4'" C CH1 0 -1.206 -5.213 -11.876 +DG "O4'" O O2 0 -0.018 -4.512 -11.450 +DG "C3'" C CH1 0 -1.259 -5.123 -13.404 +DG "O3'" O OH1 0 -2.248 -4.188 -13.827 +DG "C2'" C CH2 0 0.144 -4.654 -13.783 +DG "C1'" C CH1 0 0.565 -3.849 -12.566 +DG N9 N NR5 0 2.012 -3.775 -12.354 +DG C8 C CR15 0 2.857 -4.830 -12.111 +DG N7 N NRD5 0 4.108 -4.471 -11.958 +DG C5 C CR56 0 4.088 -3.091 -12.106 +DG C6 C CR6 0 5.150 -2.149 -12.042 +DG O6 O O 0 6.352 -2.369 -11.834 +DG N1 N NR16 0 4.698 -0.841 -12.249 +DG C2 C CR6 0 3.388 -0.485 -12.487 +DG N2 N NH2 0 3.138 0.820 -12.662 +DG N3 N NRD6 0 2.387 -1.368 -12.548 +DG C4 C CR56 0 2.803 -2.647 -12.350 +DG "H5'" H H 0 -1.147 -6.585 -10.336 +DG "H5''" H H 0 -1.985 -7.104 -11.602 +DG "H4'" H H 0 -1.996 -4.756 -11.498 +DG "H3'" H H 0 -1.441 -6.012 -13.795 +DG "HO3'" H H 0 -2.096 -3.427 -13.481 +DG "H2'" H H 0 0.125 -4.097 -14.586 +DG "H2''" H H 0 0.741 -5.412 -13.932 +DG "H1'" H H 0 0.190 -2.932 -12.632 +DG H8 H H 0 2.565 -5.725 -12.063 +DG H1 H H 0 5.314 -0.188 -12.222 +DG H21 H H 0 2.584 1.078 -13.291 +DG H22 H H 0 3.528 1.412 -12.146 +loop_ +_chem_comp_bond.comp_id +_chem_comp_bond.atom_id_1 +_chem_comp_bond.atom_id_2 +_chem_comp_bond.type +_chem_comp_bond.aromatic +_chem_comp_bond.value_dist_nucleus +_chem_comp_bond.value_dist_nucleus_esd +_chem_comp_bond.value_dist +_chem_comp_bond.value_dist_esd +DG OP3 P SINGLE n 1.517 0.0192 1.517 0.0192 +DG P OP1 DOUBLE n 1.517 0.0192 1.517 0.0192 +DG P OP2 SINGLE n 1.517 0.0192 1.517 0.0192 +DG P "O5'" SINGLE n 1.614 0.0178 1.614 0.0178 +DG "O5'" "C5'" SINGLE n 1.450 0.0166 1.450 0.0166 +DG "C5'" "C4'" SINGLE n 1.509 0.0100 1.509 0.0100 +DG "C4'" "O4'" SINGLE n 1.442 0.0100 1.442 0.0100 +DG "C4'" "C3'" SINGLE n 1.526 0.0115 1.526 0.0115 +DG "O4'" "C1'" SINGLE n 1.425 0.0100 1.425 0.0100 +DG "C3'" "O3'" SINGLE n 1.424 0.0100 1.424 0.0100 +DG "C3'" "C2'" SINGLE n 1.526 0.0101 1.526 0.0101 +DG "C2'" "C1'" SINGLE n 1.521 0.0118 1.521 0.0118 +DG "C1'" N9 SINGLE n 1.462 0.0111 1.462 0.0111 +DG N9 C8 SINGLE y 1.373 0.0100 1.373 0.0100 +DG N9 C4 SINGLE y 1.375 0.0100 1.375 0.0100 +DG C8 N7 DOUBLE y 1.312 0.0100 1.312 0.0100 +DG N7 C5 SINGLE y 1.390 0.0100 1.390 0.0100 +DG C5 C6 SINGLE y 1.417 0.0103 1.417 0.0103 +DG C5 C4 DOUBLE y 1.377 0.0100 1.377 0.0100 +DG C6 O6 DOUBLE n 1.239 0.0100 1.239 0.0100 +DG C6 N1 SINGLE y 1.396 0.0107 1.396 0.0107 +DG N1 C2 SINGLE y 1.374 0.0100 1.374 0.0100 +DG C2 N2 SINGLE n 1.340 0.0101 1.340 0.0101 +DG C2 N3 DOUBLE y 1.333 0.0104 1.333 0.0104 +DG N3 C4 SINGLE y 1.355 0.0100 1.355 0.0100 +DG "C5'" "H5'" SINGLE n 1.089 0.0100 0.989 0.0200 +DG "C5'" "H5''" SINGLE n 1.089 0.0100 0.989 0.0200 +DG "C4'" "H4'" SINGLE n 1.089 0.0100 0.987 0.0170 +DG "C3'" "H3'" SINGLE n 1.089 0.0100 0.988 0.0189 +DG "O3'" "HO3'" SINGLE n 0.970 0.0120 0.849 0.0200 +DG "C2'" "H2'" SINGLE n 1.089 0.0100 0.977 0.0113 +DG "C2'" "H2''" SINGLE n 1.089 0.0100 0.977 0.0113 +DG "C1'" "H1'" SINGLE n 1.089 0.0100 0.993 0.0101 +DG C8 H8 SINGLE n 1.082 0.0130 0.942 0.0170 +DG N1 H1 SINGLE n 1.016 0.0100 0.897 0.0200 +DG N2 H21 SINGLE n 1.016 0.0100 0.877 0.0200 +DG N2 H22 SINGLE n 1.016 0.0100 0.877 0.0200 +loop_ +_chem_comp_angle.comp_id +_chem_comp_angle.atom_id_1 +_chem_comp_angle.atom_id_2 +_chem_comp_angle.atom_id_3 +_chem_comp_angle.value_angle +_chem_comp_angle.value_angle_esd +DG OP3 P OP1 112.864 1.69 +DG OP3 P OP2 112.864 1.69 +DG OP3 P "O5'" 105.808 2.07 +DG OP1 P OP2 112.864 1.69 +DG OP1 P "O5'" 105.808 2.07 +DG OP2 P "O5'" 105.808 2.07 +DG P "O5'" "C5'" 118.783 1.50 +DG "O5'" "C5'" "C4'" 109.342 1.50 +DG "O5'" "C5'" "H5'" 109.845 1.50 +DG "O5'" "C5'" "H5''" 109.845 1.50 +DG "C4'" "C5'" "H5'" 109.624 1.50 +DG "C4'" "C5'" "H5''" 109.624 1.50 +DG "H5'" "C5'" "H5''" 108.472 1.50 +DG "C5'" "C4'" "O4'" 109.123 1.50 +DG "C5'" "C4'" "C3'" 114.866 1.63 +DG "C5'" "C4'" "H4'" 108.268 1.50 +DG "O4'" "C4'" "C3'" 105.506 1.50 +DG "O4'" "C4'" "H4'" 108.947 1.50 +DG "C3'" "C4'" "H4'" 109.069 1.50 +DG "C4'" "O4'" "C1'" 108.795 1.50 +DG "C4'" "C3'" "O3'" 110.527 2.37 +DG "C4'" "C3'" "C2'" 102.433 1.50 +DG "C4'" "C3'" "H3'" 110.775 1.50 +DG "O3'" "C3'" "C2'" 111.424 1.96 +DG "O3'" "C3'" "H3'" 110.713 1.50 +DG "C2'" "C3'" "H3'" 110.846 1.50 +DG "C3'" "O3'" "HO3'" 109.026 2.38 +DG "C3'" "C2'" "C1'" 102.663 1.50 +DG "C3'" "C2'" "H2'" 111.194 1.50 +DG "C3'" "C2'" "H2''" 111.194 1.50 +DG "C1'" "C2'" "H2'" 111.213 1.50 +DG "C1'" "C2'" "H2''" 111.213 1.50 +DG "H2'" "C2'" "H2''" 109.148 1.50 +DG "O4'" "C1'" "C2'" 106.035 1.50 +DG "O4'" "C1'" N9 108.236 1.50 +DG "O4'" "C1'" "H1'" 109.059 1.50 +DG "C2'" "C1'" N9 114.190 1.67 +DG "C2'" "C1'" "H1'" 109.272 1.50 +DG N9 "C1'" "H1'" 109.282 1.50 +DG "C1'" N9 C8 127.617 2.81 +DG "C1'" N9 C4 126.652 2.93 +DG C8 N9 C4 105.731 1.50 +DG N9 C8 N7 113.507 1.50 +DG N9 C8 H8 123.187 1.50 +DG N7 C8 H8 123.307 1.50 +DG C8 N7 C5 104.778 1.50 +DG N7 C5 C6 130.030 1.50 +DG N7 C5 C4 110.574 1.50 +DG C6 C5 C4 119.397 1.50 +DG C5 C6 O6 128.244 1.50 +DG C5 C6 N1 111.367 1.50 +DG O6 C6 N1 120.389 1.50 +DG C6 N1 C2 125.351 1.50 +DG C6 N1 H1 116.978 2.44 +DG C2 N1 H1 117.677 2.71 +DG N1 C2 N2 116.576 1.50 +DG N1 C2 N3 123.602 1.50 +DG N2 C2 N3 119.821 1.50 +DG C2 N2 H21 119.868 1.50 +DG C2 N2 H22 119.868 1.50 +DG H21 N2 H22 120.263 1.96 +DG C2 N3 C4 112.066 1.50 +DG N9 C4 C5 105.411 1.50 +DG N9 C4 N3 126.378 1.50 +DG C5 C4 N3 128.211 1.50 +loop_ +_chem_comp_tor.comp_id +_chem_comp_tor.id +_chem_comp_tor.atom_id_1 +_chem_comp_tor.atom_id_2 +_chem_comp_tor.atom_id_3 +_chem_comp_tor.atom_id_4 +_chem_comp_tor.value_angle +_chem_comp_tor.value_angle_esd +_chem_comp_tor.period +DG C2e-chi "O4'" "C1'" N9 C4 210.000 10.000 6 +DG C2e-nyu0 "C4'" "O4'" "C1'" "C2'" 340.700 6.300 1 +DG C2e-nyu1 "O4'" "C1'" "C2'" "C3'" 32.800 4.900 1 +DG C2e-nyu2 "C1'" "C2'" "C3'" "C4'" 326.9 3.600 1 +DG C2e-nyu3 "C2'" "C3'" "C4'" "O4'" 22.600 4.500 1 +DG C2e-nyu4 "C3'" "C4'" "O4'" "C1'" 357.700 6.100 1 +DG C3e-chi "O4'" "C1'" N9 C4 210.000 10.000 6 +DG C3e-nyu0 "C4'" "O4'" "C1'" "C2'" 2.8 6.100 1 +DG C3e-nyu1 "O4'" "C1'" "C2'" "C3'" 335.00 4.900 1 +DG C3e-nyu2 "C1'" "C2'" "C3'" "C4'" 35.9 2.800 1 +DG C3e-nyu3 "C2'" "C3'" "C4'" "O4'" 324.700 3.100 1 +DG C3e-nyu4 "C3'" "C4'" "O4'" "C1'" 20.500 5.100 1 +DG alpha "C5'" "O5'" P OP3 -60.000 10.00 3 +DG beta P "O5'" "C5'" "C4'" 180.000 10.00 3 +DG epsi "C4'" "C3'" "O3'" "HO3'" 180.000 10.00 3 +DG gamma "O5'" "C5'" "C4'" "C3'" 180.000 10.00 3 +DG const_18 N7 C8 N9 "C1'" 180.000 10.0 2 +DG const_30 C5 C4 N9 "C1'" 180.000 10.0 2 +DG const_21 N9 C8 N7 C5 0.000 10.0 2 +DG const_24 C6 C5 N7 C8 180.000 10.0 2 +DG const_sp2_sp2_4 N7 C5 C6 O6 0.000 5.0 2 +DG const_25 N9 C4 C5 N7 0.000 10.0 2 +DG const_sp2_sp2_7 O6 C6 N1 C2 180.000 5.0 2 +DG const_11 N2 C2 N1 C6 180.000 10.0 2 +DG sp2_sp2_1 N1 C2 N2 H21 180.000 5.0 2 +DG const_14 N2 C2 N3 C4 180.000 10.0 2 +DG const_16 N9 C4 N3 C2 180.000 10.0 2 +loop_ +_chem_comp_chir.comp_id +_chem_comp_chir.id +_chem_comp_chir.atom_id_centre +_chem_comp_chir.atom_id_1 +_chem_comp_chir.atom_id_2 +_chem_comp_chir.atom_id_3 +_chem_comp_chir.volume_sign +DG chir_1 P "O5'" OP3 OP2 both +DG chir_2 "C4'" "O4'" "C3'" "C5'" negative +DG chir_3 "C3'" "O3'" "C4'" "C2'" positive +DG chir_4 "C1'" "O4'" N9 "C2'" negative +loop_ +_chem_comp_plane_atom.comp_id +_chem_comp_plane_atom.plane_id +_chem_comp_plane_atom.atom_id +_chem_comp_plane_atom.dist_esd +DG plan-1 "C1'" 0.020 +DG plan-1 C2 0.020 +DG plan-1 C4 0.020 +DG plan-1 C5 0.020 +DG plan-1 C6 0.020 +DG plan-1 C8 0.020 +DG plan-1 H1 0.020 +DG plan-1 H8 0.020 +DG plan-1 N1 0.020 +DG plan-1 N2 0.020 +DG plan-1 N3 0.020 +DG plan-1 N7 0.020 +DG plan-1 N9 0.020 +DG plan-1 O6 0.020 +DG plan-2 C2 0.020 +DG plan-2 H21 0.020 +DG plan-2 H22 0.020 +DG plan-2 N2 0.020 +loop_ +_pdbx_chem_comp_descriptor.comp_id +_pdbx_chem_comp_descriptor.type +_pdbx_chem_comp_descriptor.program +_pdbx_chem_comp_descriptor.program_version +_pdbx_chem_comp_descriptor.descriptor +DG SMILES ACDLabs 10.04 O=C1c2ncn(c2N=C(N)N1)C3OC(C(O)C3)COP(=O)(O)O +DG SMILES_CANONICAL CACTVS 3.341 NC1=Nc2n(cnc2C(=O)N1)[C@H]3C[C@H](O)[C@@H](CO[P](O)(O)=O)O3 +DG SMILES CACTVS 3.341 NC1=Nc2n(cnc2C(=O)N1)[CH]3C[CH](O)[CH](CO[P](O)(O)=O)O3 +DG SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 c1nc2c(n1[C@H]3C[C@@H]([C@H](O3)COP(=O)(O)O)O)N=C(NC2=O)N +DG SMILES "OpenEye OEToolkits" 1.5.0 c1nc2c(n1C3CC(C(O3)COP(=O)(O)O)O)N=C(NC2=O)N +DG InChI InChI 1.03 InChI=1S/C10H14N5O7P/c11-10-13-8-7(9(17)14-10)12-3-15(8)6-1-4(16)5(22-6)2-21-23(18,19)20/h3-6,16H,1-2H2,(H2,18,19,20)(H3,11,13,14,17)/t4-,5+,6+/m0/s1 +DG InChIKey InChI 1.03 LTFMZDNNPPEQNG-KVQBGUIXSA-N +loop_ +_pdbx_chem_comp_description_generator.comp_id +_pdbx_chem_comp_description_generator.program_name +_pdbx_chem_comp_description_generator.program_version +_pdbx_chem_comp_description_generator.descriptor +DG acedrg 243 "dictionary generator" +DG acedrg_database 11 "data source" +DG rdkit 2017.03.2 "Chemoinformatics tool" +DG refmac5 5.8.0238 "optimization tool" diff --git a/image_analysis/structure_refinement/monomers/DMS.cif b/image_analysis/structure_refinement/monomers/DMS.cif new file mode 100644 index 000000000..209672234 --- /dev/null +++ b/image_analysis/structure_refinement/monomers/DMS.cif @@ -0,0 +1,117 @@ +# +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +DMS DMS "DIMETHYL SULFOXIDE" NON-POLYMER 10 4 . +# +data_comp_DMS +# +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +DMS S S S3 0 63.218 46.394 -11.587 +DMS O O O 0 63.732 46.133 -12.975 +DMS C1 C CH3 0 64.619 46.928 -10.638 +DMS C2 C CH3 0 63.010 44.801 -10.834 +DMS H11 H H 0 64.347 47.082 -9.723 +DMS H12 H H 0 64.967 47.748 -11.014 +DMS H13 H H 0 65.302 46.245 -10.662 +DMS H21 H H 0 63.858 44.337 -10.825 +DMS H22 H H 0 62.366 44.288 -11.340 +DMS H23 H H 0 62.693 44.913 -9.927 +loop_ +_chem_comp_bond.comp_id +_chem_comp_bond.atom_id_1 +_chem_comp_bond.atom_id_2 +_chem_comp_bond.type +_chem_comp_bond.aromatic +_chem_comp_bond.value_dist_nucleus +_chem_comp_bond.value_dist_nucleus_esd +_chem_comp_bond.value_dist +_chem_comp_bond.value_dist_esd +DMS S O DOUBLE n 1.503 0.0200 1.503 0.0200 +DMS S C1 SINGLE n 1.774 0.0176 1.774 0.0176 +DMS S C2 SINGLE n 1.774 0.0176 1.774 0.0176 +DMS C1 H11 SINGLE n 1.089 0.0100 0.967 0.0136 +DMS C1 H12 SINGLE n 1.089 0.0100 0.967 0.0136 +DMS C1 H13 SINGLE n 1.089 0.0100 0.967 0.0136 +DMS C2 H21 SINGLE n 1.089 0.0100 0.967 0.0136 +DMS C2 H22 SINGLE n 1.089 0.0100 0.967 0.0136 +DMS C2 H23 SINGLE n 1.089 0.0100 0.967 0.0136 +loop_ +_chem_comp_angle.comp_id +_chem_comp_angle.atom_id_1 +_chem_comp_angle.atom_id_2 +_chem_comp_angle.atom_id_3 +_chem_comp_angle.value_angle +_chem_comp_angle.value_angle_esd +DMS O S C1 106.047 1.50 +DMS O S C2 106.047 1.50 +DMS C1 S C2 97.789 1.50 +DMS S C1 H11 109.408 1.50 +DMS S C1 H12 109.408 1.50 +DMS S C1 H13 109.408 1.50 +DMS H11 C1 H12 109.545 1.50 +DMS H11 C1 H13 109.545 1.50 +DMS H12 C1 H13 109.545 1.50 +DMS S C2 H21 109.408 1.50 +DMS S C2 H22 109.408 1.50 +DMS S C2 H23 109.408 1.50 +DMS H21 C2 H22 109.545 1.50 +DMS H21 C2 H23 109.545 1.50 +DMS H22 C2 H23 109.545 1.50 +loop_ +_chem_comp_tor.comp_id +_chem_comp_tor.id +_chem_comp_tor.atom_id_1 +_chem_comp_tor.atom_id_2 +_chem_comp_tor.atom_id_3 +_chem_comp_tor.atom_id_4 +_chem_comp_tor.value_angle +_chem_comp_tor.value_angle_esd +_chem_comp_tor.period +DMS sp3_sp3_1 H11 C1 S O 180.000 10.0 3 +DMS sp3_sp3_8 H21 C2 S O -60.000 10.0 3 +loop_ +_chem_comp_chir.comp_id +_chem_comp_chir.id +_chem_comp_chir.atom_id_centre +_chem_comp_chir.atom_id_1 +_chem_comp_chir.atom_id_2 +_chem_comp_chir.atom_id_3 +_chem_comp_chir.volume_sign +DMS chir_1 S O C1 C2 both +loop_ +_pdbx_chem_comp_descriptor.comp_id +_pdbx_chem_comp_descriptor.type +_pdbx_chem_comp_descriptor.program +_pdbx_chem_comp_descriptor.program_version +_pdbx_chem_comp_descriptor.descriptor +DMS SMILES ACDLabs 10.04 sulfinyldimethane +DMS SMILES_CANONICAL CACTVS 3.341 C[S](C)=O +DMS SMILES CACTVS 3.341 C[S](C)=O +DMS SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 CS(=O)C +DMS SMILES "OpenEye OEToolkits" 1.5.0 CS(=O)C +DMS InChI InChI 1.03 InChI=1S/C2H6OS/c1-4(2)3/h1-2H3 +DMS InChIKey InChI 1.03 IAZDPXIOMUYVGZ-UHFFFAOYSA-N +loop_ +_pdbx_chem_comp_description_generator.comp_id +_pdbx_chem_comp_description_generator.program_name +_pdbx_chem_comp_description_generator.program_version +_pdbx_chem_comp_description_generator.descriptor +DMS acedrg 243 "dictionary generator" +DMS acedrg_database 11 "data source" +DMS rdkit 2017.03.2 "Chemoinformatics tool" +DMS refmac5 5.8.0238 "optimization tool" diff --git a/image_analysis/structure_refinement/monomers/DT.cif b/image_analysis/structure_refinement/monomers/DT.cif new file mode 100644 index 000000000..affc26c5a --- /dev/null +++ b/image_analysis/structure_refinement/monomers/DT.cif @@ -0,0 +1,256 @@ +# +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +DT DT "THYMIDINE-5'-MONOPHOSPHATE" DNA 34 21 . +# +data_comp_DT +# +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +DT OP3 O OP -1 -9.033 1.811 3.710 +DT P P P 0 -8.813 3.246 4.151 +DT OP1 O O 0 -9.790 3.689 5.223 +DT OP2 O OP -1 -8.738 4.214 2.986 +DT "O5'" O O2 0 -7.356 3.277 4.843 +DT "C5'" C CH2 0 -7.098 2.397 5.967 +DT "C4'" C CH1 0 -5.688 2.610 6.462 +DT "O4'" O O2 0 -4.754 2.345 5.391 +DT "C3'" C CH1 0 -5.391 4.024 6.970 +DT "O3'" O OH1 0 -4.766 3.989 8.251 +DT "C2'" C CH2 0 -4.437 4.599 5.930 +DT "C1'" C CH1 0 -3.760 3.359 5.367 +DT N1 N NR6 0 -3.270 3.502 3.966 +DT C2 C CR6 0 -1.905 3.474 3.713 +DT O2 O O 0 -1.053 3.332 4.583 +DT N3 N NR16 0 -1.559 3.618 2.388 +DT C4 C CR6 0 -2.414 3.786 1.310 +DT O4 O O 0 -1.948 3.903 0.172 +DT C5 C CR6 0 -3.824 3.809 1.640 +DT C7 C CH3 0 -4.824 3.988 0.535 +DT C6 C CR16 0 -4.178 3.669 2.932 +DT "H5'" H H 0 -7.213 1.455 5.689 +DT "H5''" H H 0 -7.738 2.588 6.696 +DT "H4'" H H 0 -5.520 1.964 7.190 +DT "H3'" H H 0 -6.221 4.559 7.010 +DT "HO3'" H H 0 -4.051 3.531 8.213 +DT "H2'" H H 0 -3.782 5.203 6.342 +DT "H2''" H H 0 -4.926 5.088 5.233 +DT "H1'" H H 0 -3.014 3.092 5.967 +DT H3 H H 0 -0.682 3.600 2.215 +DT H71 H H 0 -5.705 3.724 0.845 +DT H72 H H 0 -4.574 3.437 -0.224 +DT H73 H H 0 -4.846 4.920 0.263 +DT H6 H H 0 -5.103 3.686 3.152 +loop_ +_chem_comp_bond.comp_id +_chem_comp_bond.atom_id_1 +_chem_comp_bond.atom_id_2 +_chem_comp_bond.type +_chem_comp_bond.aromatic +_chem_comp_bond.value_dist_nucleus +_chem_comp_bond.value_dist_nucleus_esd +_chem_comp_bond.value_dist +_chem_comp_bond.value_dist_esd +DT OP3 P SINGLE n 1.517 0.0192 1.517 0.0192 +DT P OP1 DOUBLE n 1.517 0.0192 1.517 0.0192 +DT P OP2 SINGLE n 1.517 0.0192 1.517 0.0192 +DT P "O5'" SINGLE n 1.614 0.0178 1.614 0.0178 +DT "O5'" "C5'" SINGLE n 1.450 0.0166 1.450 0.0166 +DT "C5'" "C4'" SINGLE n 1.509 0.0100 1.509 0.0100 +DT "C4'" "O4'" SINGLE n 1.445 0.0100 1.445 0.0100 +DT "C4'" "C3'" SINGLE n 1.526 0.0115 1.526 0.0115 +DT "O4'" "C1'" SINGLE n 1.422 0.0100 1.422 0.0100 +DT "C3'" "O3'" SINGLE n 1.424 0.0100 1.424 0.0100 +DT "C3'" "C2'" SINGLE n 1.522 0.0100 1.522 0.0100 +DT "C2'" "C1'" SINGLE n 1.523 0.0130 1.523 0.0130 +DT "C1'" N1 SINGLE n 1.477 0.0139 1.477 0.0139 +DT N1 C2 SINGLE y 1.379 0.0100 1.379 0.0100 +DT N1 C6 SINGLE y 1.380 0.0107 1.380 0.0107 +DT C2 O2 DOUBLE n 1.224 0.0111 1.224 0.0111 +DT C2 N3 SINGLE y 1.373 0.0100 1.373 0.0100 +DT N3 C4 SINGLE y 1.383 0.0100 1.383 0.0100 +DT C4 O4 DOUBLE n 1.234 0.0141 1.234 0.0141 +DT C4 C5 SINGLE y 1.446 0.0100 1.446 0.0100 +DT C5 C7 SINGLE n 1.500 0.0100 1.500 0.0100 +DT C5 C6 DOUBLE y 1.343 0.0112 1.343 0.0112 +DT "C5'" "H5'" SINGLE n 1.089 0.0100 0.989 0.0200 +DT "C5'" "H5''" SINGLE n 1.089 0.0100 0.989 0.0200 +DT "C4'" "H4'" SINGLE n 1.089 0.0100 0.987 0.0170 +DT "C3'" "H3'" SINGLE n 1.089 0.0100 0.988 0.0189 +DT "O3'" "HO3'" SINGLE n 0.970 0.0120 0.849 0.0200 +DT "C2'" "H2'" SINGLE n 1.089 0.0100 0.982 0.0200 +DT "C2'" "H2''" SINGLE n 1.089 0.0100 0.982 0.0200 +DT "C1'" "H1'" SINGLE n 1.089 0.0100 0.996 0.0200 +DT N3 H3 SINGLE n 1.016 0.0100 0.893 0.0200 +DT C7 H71 SINGLE n 1.089 0.0100 0.971 0.0135 +DT C7 H72 SINGLE n 1.089 0.0100 0.971 0.0135 +DT C7 H73 SINGLE n 1.089 0.0100 0.971 0.0135 +DT C6 H6 SINGLE n 1.082 0.0130 0.951 0.0200 +loop_ +_chem_comp_angle.comp_id +_chem_comp_angle.atom_id_1 +_chem_comp_angle.atom_id_2 +_chem_comp_angle.atom_id_3 +_chem_comp_angle.value_angle +_chem_comp_angle.value_angle_esd +DT OP3 P OP1 112.864 1.69 +DT OP3 P OP2 112.864 1.69 +DT OP3 P "O5'" 105.808 2.07 +DT OP1 P OP2 112.864 1.69 +DT OP1 P "O5'" 105.808 2.07 +DT OP2 P "O5'" 105.808 2.07 +DT P "O5'" "C5'" 118.783 1.50 +DT "O5'" "C5'" "C4'" 109.342 1.50 +DT "O5'" "C5'" "H5'" 109.845 1.50 +DT "O5'" "C5'" "H5''" 109.845 1.50 +DT "C4'" "C5'" "H5'" 109.624 1.50 +DT "C4'" "C5'" "H5''" 109.624 1.50 +DT "H5'" "C5'" "H5''" 108.472 1.50 +DT "C5'" "C4'" "O4'" 109.615 1.50 +DT "C5'" "C4'" "C3'" 114.866 1.63 +DT "C5'" "C4'" "H4'" 108.268 1.50 +DT "O4'" "C4'" "C3'" 105.770 1.50 +DT "O4'" "C4'" "H4'" 108.698 1.50 +DT "C3'" "C4'" "H4'" 109.069 1.50 +DT "C4'" "O4'" "C1'" 109.692 1.50 +DT "C4'" "C3'" "O3'" 110.527 2.37 +DT "C4'" "C3'" "C2'" 102.800 1.50 +DT "C4'" "C3'" "H3'" 110.775 1.50 +DT "O3'" "C3'" "C2'" 110.636 2.59 +DT "O3'" "C3'" "H3'" 110.713 1.50 +DT "C2'" "C3'" "H3'" 110.862 1.50 +DT "C3'" "O3'" "HO3'" 109.026 2.38 +DT "C3'" "C2'" "C1'" 102.834 1.50 +DT "C3'" "C2'" "H2'" 111.310 1.50 +DT "C3'" "C2'" "H2''" 111.310 1.50 +DT "C1'" "C2'" "H2'" 111.187 1.50 +DT "C1'" "C2'" "H2''" 111.187 1.50 +DT "H2'" "C2'" "H2''" 108.952 1.50 +DT "O4'" "C1'" "C2'" 106.308 1.50 +DT "O4'" "C1'" N1 107.584 1.50 +DT "O4'" "C1'" "H1'" 109.550 1.50 +DT "C2'" "C1'" N1 114.268 1.50 +DT "C2'" "C1'" "H1'" 109.741 1.50 +DT N1 "C1'" "H1'" 109.342 1.50 +DT "C1'" N1 C2 118.265 1.50 +DT "C1'" N1 C6 120.492 1.50 +DT C2 N1 C6 121.243 1.50 +DT N1 C2 O2 122.872 1.50 +DT N1 C2 N3 114.786 1.50 +DT O2 C2 N3 122.342 1.50 +DT C2 N3 C4 127.106 1.50 +DT C2 N3 H3 115.584 1.79 +DT C4 N3 H3 117.311 1.81 +DT N3 C4 O4 119.787 1.50 +DT N3 C4 C5 115.265 1.50 +DT O4 C4 C5 124.948 1.50 +DT C4 C5 C7 118.650 1.50 +DT C4 C5 C6 118.305 1.50 +DT C7 C5 C6 123.045 1.50 +DT C5 C7 H71 109.652 1.50 +DT C5 C7 H72 109.652 1.50 +DT C5 C7 H73 109.652 1.50 +DT H71 C7 H72 109.348 1.50 +DT H71 C7 H73 109.348 1.50 +DT H72 C7 H73 109.348 1.50 +DT N1 C6 C5 123.296 1.50 +DT N1 C6 H6 117.926 1.56 +DT C5 C6 H6 118.779 1.68 +loop_ +_chem_comp_tor.comp_id +_chem_comp_tor.id +_chem_comp_tor.atom_id_1 +_chem_comp_tor.atom_id_2 +_chem_comp_tor.atom_id_3 +_chem_comp_tor.atom_id_4 +_chem_comp_tor.value_angle +_chem_comp_tor.value_angle_esd +_chem_comp_tor.period +DT C2e-chi "O4'" "C1'" N1 C2 210.000 10.000 6 +DT C2e-nyu0 "C4'" "O4'" "C1'" "C2'" 340.700 6.300 1 +DT C2e-nyu1 "O4'" "C1'" "C2'" "C3'" 32.800 4.900 1 +DT C2e-nyu2 "C1'" "C2'" "C3'" "C4'" 326.9 3.600 1 +DT C2e-nyu3 "C2'" "C3'" "C4'" "O4'" 22.600 4.500 1 +DT C2e-nyu4 "C3'" "C4'" "O4'" "C1'" 357.700 6.100 1 +DT C3e-chi "O4'" "C1'" N1 C2 210.000 10.000 6 +DT C3e-nyu0 "C4'" "O4'" "C1'" "C2'" 2.8 6.100 1 +DT C3e-nyu1 "O4'" "C1'" "C2'" "C3'" 335.00 4.900 1 +DT C3e-nyu2 "C1'" "C2'" "C3'" "C4'" 35.9 2.800 1 +DT C3e-nyu3 "C2'" "C3'" "C4'" "O4'" 324.700 3.100 1 +DT C3e-nyu4 "C3'" "C4'" "O4'" "C1'" 20.500 5.100 1 +DT alpha "C5'" "O5'" P OP3 -60.000 10.00 3 +DT beta P "O5'" "C5'" "C4'" 180.000 10.00 3 +DT epsi "C4'" "C3'" "O3'" "HO3'" 180.000 10.00 3 +DT gamma "O5'" "C5'" "C4'" "C3'" 180.000 10.00 3 +DT const_sp2_sp2_4 O2 C2 N1 "C1'" 0.000 5.0 2 +DT const_22 C5 C6 N1 "C1'" 180.000 10.0 2 +DT const_sp2_sp2_7 O2 C2 N3 C4 180.000 5.0 2 +DT const_11 O4 C4 N3 C2 180.000 10.0 2 +DT const_16 O4 C4 C5 C7 0.000 10.0 2 +DT sp2_sp3_7 C4 C5 C7 H71 150.000 10.0 6 +DT const_19 C7 C5 C6 N1 180.000 10.0 2 +loop_ +_chem_comp_chir.comp_id +_chem_comp_chir.id +_chem_comp_chir.atom_id_centre +_chem_comp_chir.atom_id_1 +_chem_comp_chir.atom_id_2 +_chem_comp_chir.atom_id_3 +_chem_comp_chir.volume_sign +DT chir_1 P "O5'" OP3 OP2 both +DT chir_2 "C4'" "O4'" "C3'" "C5'" negative +DT chir_3 "C3'" "O3'" "C4'" "C2'" positive +DT chir_4 "C1'" "O4'" N1 "C2'" negative +loop_ +_chem_comp_plane_atom.comp_id +_chem_comp_plane_atom.plane_id +_chem_comp_plane_atom.atom_id +_chem_comp_plane_atom.dist_esd +DT plan-1 "C1'" 0.020 +DT plan-1 C2 0.020 +DT plan-1 C4 0.020 +DT plan-1 C5 0.020 +DT plan-1 C6 0.020 +DT plan-1 C7 0.020 +DT plan-1 H3 0.020 +DT plan-1 H6 0.020 +DT plan-1 N1 0.020 +DT plan-1 N3 0.020 +DT plan-1 O2 0.020 +DT plan-1 O4 0.020 +loop_ +_pdbx_chem_comp_descriptor.comp_id +_pdbx_chem_comp_descriptor.type +_pdbx_chem_comp_descriptor.program +_pdbx_chem_comp_descriptor.program_version +_pdbx_chem_comp_descriptor.descriptor +DT SMILES ACDLabs 10.04 O=C1NC(=O)N(C=C1C)C2OC(C(O)C2)COP(=O)(O)O +DT SMILES_CANONICAL CACTVS 3.341 CC1=CN([C@H]2C[C@H](O)[C@@H](CO[P](O)(O)=O)O2)C(=O)NC1=O +DT SMILES CACTVS 3.341 CC1=CN([CH]2C[CH](O)[CH](CO[P](O)(O)=O)O2)C(=O)NC1=O +DT SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 CC1=CN(C(=O)NC1=O)[C@H]2C[C@@H]([C@H](O2)COP(=O)(O)O)O +DT SMILES "OpenEye OEToolkits" 1.5.0 CC1=CN(C(=O)NC1=O)C2CC(C(O2)COP(=O)(O)O)O +DT InChI InChI 1.03 InChI=1S/C10H15N2O8P/c1-5-3-12(10(15)11-9(5)14)8-2-6(13)7(20-8)4-19-21(16,17)18/h3,6-8,13H,2,4H2,1H3,(H,11,14,15)(H2,16,17,18)/t6-,7+,8+/m0/s1 +DT InChIKey InChI 1.03 GYOZYWVXFNDGLU-XLPZGREQSA-N +loop_ +_pdbx_chem_comp_description_generator.comp_id +_pdbx_chem_comp_description_generator.program_name +_pdbx_chem_comp_description_generator.program_version +_pdbx_chem_comp_description_generator.descriptor +DT acedrg 243 "dictionary generator" +DT acedrg_database 11 "data source" +DT rdkit 2017.03.2 "Chemoinformatics tool" +DT refmac5 5.8.0238 "optimization tool" diff --git a/image_analysis/structure_refinement/monomers/EDO.cif b/image_analysis/structure_refinement/monomers/EDO.cif new file mode 100644 index 000000000..9d74e7fbe --- /dev/null +++ b/image_analysis/structure_refinement/monomers/EDO.cif @@ -0,0 +1,108 @@ +# +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +EDO EDO 1,2-ETHANEDIOL NON-POLYMER 10 4 . +# +data_comp_EDO +# +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +EDO C1 C CH2 0 5.160 28.149 5.379 +EDO O1 O OH1 0 6.106 28.471 4.378 +EDO C2 C CH2 0 3.762 28.430 4.968 +EDO O2 O OH1 0 3.416 27.839 3.730 +EDO H11 H H 0 5.362 28.666 6.186 +EDO H12 H H 0 5.240 27.198 5.599 +EDO HO1 H H 0 6.871 28.201 4.619 +EDO H21 H H 0 3.642 29.401 4.901 +EDO H22 H H 0 3.156 28.097 5.661 +EDO HO2 H H 0 3.485 26.998 3.790 +loop_ +_chem_comp_bond.comp_id +_chem_comp_bond.atom_id_1 +_chem_comp_bond.atom_id_2 +_chem_comp_bond.type +_chem_comp_bond.aromatic +_chem_comp_bond.value_dist_nucleus +_chem_comp_bond.value_dist_nucleus_esd +_chem_comp_bond.value_dist +_chem_comp_bond.value_dist_esd +EDO C1 O1 SINGLE n 1.414 0.0200 1.414 0.0200 +EDO C1 C2 SINGLE n 1.483 0.0200 1.483 0.0200 +EDO C2 O2 SINGLE n 1.414 0.0200 1.414 0.0200 +EDO C1 H11 SINGLE n 1.089 0.0100 0.980 0.0144 +EDO C1 H12 SINGLE n 1.089 0.0100 0.980 0.0144 +EDO O1 HO1 SINGLE n 0.970 0.0120 0.846 0.0200 +EDO C2 H21 SINGLE n 1.089 0.0100 0.980 0.0144 +EDO C2 H22 SINGLE n 1.089 0.0100 0.980 0.0144 +EDO O2 HO2 SINGLE n 0.970 0.0120 0.846 0.0200 +loop_ +_chem_comp_angle.comp_id +_chem_comp_angle.atom_id_1 +_chem_comp_angle.atom_id_2 +_chem_comp_angle.atom_id_3 +_chem_comp_angle.value_angle +_chem_comp_angle.value_angle_esd +EDO O1 C1 C2 113.236 3.00 +EDO O1 C1 H11 109.012 1.50 +EDO O1 C1 H12 109.012 1.50 +EDO C2 C1 H11 108.881 1.50 +EDO C2 C1 H12 108.881 1.50 +EDO H11 C1 H12 108.093 1.50 +EDO C1 O1 HO1 109.347 1.86 +EDO C1 C2 O2 113.236 3.00 +EDO C1 C2 H21 108.881 1.50 +EDO C1 C2 H22 108.881 1.50 +EDO O2 C2 H21 109.012 1.50 +EDO O2 C2 H22 109.012 1.50 +EDO H21 C2 H22 108.093 1.50 +EDO C2 O2 HO2 109.347 1.86 +loop_ +_chem_comp_tor.comp_id +_chem_comp_tor.id +_chem_comp_tor.atom_id_1 +_chem_comp_tor.atom_id_2 +_chem_comp_tor.atom_id_3 +_chem_comp_tor.atom_id_4 +_chem_comp_tor.value_angle +_chem_comp_tor.value_angle_esd +_chem_comp_tor.period +EDO sp3_sp3_1 C2 C1 O1 HO1 180.000 10.0 3 +EDO sp3_sp3_4 O1 C1 C2 O2 180.000 10.0 3 +EDO sp3_sp3_13 C1 C2 O2 HO2 180.000 10.0 3 +loop_ +_pdbx_chem_comp_descriptor.comp_id +_pdbx_chem_comp_descriptor.type +_pdbx_chem_comp_descriptor.program +_pdbx_chem_comp_descriptor.program_version +_pdbx_chem_comp_descriptor.descriptor +EDO SMILES ACDLabs 10.04 OCCO +EDO SMILES_CANONICAL CACTVS 3.341 OCCO +EDO SMILES CACTVS 3.341 OCCO +EDO SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 C(CO)O +EDO SMILES "OpenEye OEToolkits" 1.5.0 C(CO)O +EDO InChI InChI 1.03 InChI=1S/C2H6O2/c3-1-2-4/h3-4H,1-2H2 +EDO InChIKey InChI 1.03 LYCAIKOWRPUZTN-UHFFFAOYSA-N +loop_ +_pdbx_chem_comp_description_generator.comp_id +_pdbx_chem_comp_description_generator.program_name +_pdbx_chem_comp_description_generator.program_version +_pdbx_chem_comp_description_generator.descriptor +EDO acedrg 243 "dictionary generator" +EDO acedrg_database 11 "data source" +EDO rdkit 2017.03.2 "Chemoinformatics tool" +EDO refmac5 5.8.0238 "optimization tool" diff --git a/image_analysis/structure_refinement/monomers/FAD.cif b/image_analysis/structure_refinement/monomers/FAD.cif new file mode 100644 index 000000000..9952352d8 --- /dev/null +++ b/image_analysis/structure_refinement/monomers/FAD.cif @@ -0,0 +1,619 @@ +# +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +FAD FAD "FLAVIN-ADENINE DINUCLEOTIDE" NON-POLYMER 84 53 . +# +data_comp_FAD +# +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +FAD PA P P 0 20.714 1.770 23.791 +FAD O1A O O 0 19.737 0.994 22.985 +FAD O2A O OP -1 20.556 3.244 23.868 +FAD O5B O O2 0 20.784 1.154 25.265 +FAD C5B C CH2 0 21.508 1.920 26.259 +FAD C4B C CH1 0 21.685 1.088 27.506 +FAD O4B O O2 0 22.496 1.819 28.451 +FAD C3B C CH1 0 20.398 0.757 28.265 +FAD O3B O OH1 0 20.556 -0.451 28.999 +FAD C2B C CH1 0 20.243 1.982 29.172 +FAD O2B O OH1 0 19.475 1.727 30.330 +FAD C1B C CH1 0 21.699 2.264 29.545 +FAD N9A N NR5 0 21.959 3.685 29.781 +FAD C8A C CR15 0 22.300 4.646 28.862 +FAD N7A N NRD5 0 22.466 5.839 29.380 +FAD C5A C CR56 0 22.214 5.654 30.732 +FAD C6A C CR6 0 22.225 6.545 31.827 +FAD N6A N NH2 0 22.509 7.843 31.720 +FAD N1A N NRD6 0 21.925 6.038 33.053 +FAD C2A C CR16 0 21.639 4.731 33.155 +FAD N3A N NRD6 0 21.600 3.805 32.197 +FAD C4A C CR56 0 21.899 4.330 30.993 +FAD N1 N NRD6 0 21.477 -2.068 14.310 +FAD C2 C CR6 0 21.990 -3.170 13.678 +FAD O2 O O 0 23.119 -3.600 13.933 +FAD N3 N NR16 0 21.215 -3.824 12.720 +FAD C4 C CR6 0 19.939 -3.467 12.324 +FAD O4 O O 0 19.331 -4.099 11.476 +FAD C4X C CR66 0 19.428 -2.318 12.997 +FAD N5 N NRD6 0 18.223 -1.922 12.672 +FAD C5X C CR66 0 17.708 -0.822 13.305 +FAD C6 C CR16 0 16.407 -0.419 12.939 +FAD C7 C CR6 0 15.794 0.671 13.514 +FAD C7M C CH3 0 14.398 1.039 13.068 +FAD C8 C CR6 0 16.505 1.416 14.514 +FAD C8M C CH3 0 15.889 2.619 15.180 +FAD C9 C CR16 0 17.784 1.024 14.876 +FAD C9A C CR66 0 18.422 -0.094 14.291 +FAD N10 N NR6 0 19.717 -0.536 14.620 +FAD C10 C CR66 0 20.261 -1.663 13.986 +FAD "C1'" C CH2 0 20.546 0.156 15.638 +FAD "C2'" C CH1 0 20.455 -0.488 17.014 +FAD "O2'" O OH1 0 19.095 -0.421 17.451 +FAD "C3'" C CH1 0 21.373 0.159 18.058 +FAD "O3'" O OH1 0 22.723 0.097 17.602 +FAD "C4'" C CH1 0 21.301 -0.479 19.449 +FAD "O4'" O OH1 0 19.957 -0.463 19.936 +FAD "C5'" C CH2 0 22.167 0.224 20.481 +FAD "O5'" O O2 0 22.110 -0.483 21.743 +FAD P P P 0 22.951 0.052 22.986 +FAD O1P O O 0 22.742 -0.871 24.130 +FAD O2P O OP -1 24.340 0.346 22.551 +FAD O3P O O2 0 22.191 1.429 23.280 +FAD H51A H H 0 21.005 2.745 26.481 +FAD H52A H H 0 22.397 2.180 25.905 +FAD H4B H H 0 22.151 0.249 27.259 +FAD H3B H H 0 19.629 0.687 27.645 +FAD HO3A H H 0 19.777 -0.616 29.334 +FAD H2B H H 0 19.868 2.745 28.663 +FAD HO2A H H 0 19.501 2.350 30.867 +FAD H1B H H 0 21.939 1.734 30.378 +FAD H8A H H 0 22.407 4.462 27.944 +FAD H61A H H 0 22.502 8.360 32.433 +FAD H62A H H 0 22.705 8.186 30.933 +FAD H2A H H 0 21.438 4.425 34.027 +FAD HN3 H H 0 21.567 -4.529 12.329 +FAD H6 H H 0 15.940 -0.918 12.276 +FAD HM71 H H 0 14.059 1.787 13.584 +FAD HM72 H H 0 13.809 0.276 13.191 +FAD HM73 H H 0 14.414 1.282 12.127 +FAD HM81 H H 0 16.515 3.008 15.814 +FAD HM82 H H 0 15.082 2.352 15.651 +FAD HM83 H H 0 15.664 3.283 14.507 +FAD H9 H H 0 18.238 1.530 15.543 +FAD "H1'1" H H 0 20.293 1.095 15.702 +FAD "H1'2" H H 0 21.480 0.169 15.345 +FAD "H2'" H H 0 20.705 -1.452 16.929 +FAD "HO2'" H H 0 19.029 -0.034 18.222 +FAD "H3'" H H 0 21.118 1.116 18.145 +FAD "HO3'" H H 0 23.179 -0.185 18.222 +FAD "H4'" H H 0 21.600 -1.422 19.381 +FAD "HO4'" H H 0 19.930 -0.056 20.740 +FAD "H5'1" H H 0 21.854 1.142 20.606 +FAD "H5'2" H H 0 23.095 0.252 20.176 +loop_ +_chem_comp_acedrg.comp_id +_chem_comp_acedrg.atom_id +_chem_comp_acedrg.atom_type +FAD PA P(OC)(OP)(O)2 +FAD O1A O(PO3) +FAD O2A O(PO3) +FAD O5B O(CC[5]HH)(PO3) +FAD C5B C(C[5]C[5]O[5]H)(OP)(H)2 +FAD C4B C[5](C[5]C[5]HO)(O[5]C[5])(CHHO)(H){1|N<3>,1|O<2>,2|H<1>} +FAD O4B O[5](C[5]N[5a]C[5]H)(C[5]C[5]CH){2|C<3>,2|H<1>,2|O<2>} +FAD C3B C[5](C[5]C[5]HO)(C[5]O[5]CH)(OH)(H){1|H<1>,1|N<3>} +FAD O3B O(C[5]C[5]2H)(H) +FAD C2B C[5](C[5]N[5a]O[5]H)(C[5]C[5]HO)(OH)(H){1|C<4>,1|H<1>,2|C<3>} +FAD O2B O(C[5]C[5]2H)(H) +FAD C1B C[5](N[5a]C[5a,6a]C[5a])(C[5]C[5]HO)(O[5]C[5])(H){1|C<3>,1|C<4>,1|O<2>,2|N<2>,3|H<1>} +FAD N9A N[5a](C[5a,6a]C[5a,6a]N[6a])(C[5]C[5]O[5]H)(C[5a]N[5a]H){1|H<1>,1|O<2>,2|C<3>,2|C<4>} +FAD C8A C[5a](N[5a]C[5a,6a]C[5])(N[5a]C[5a,6a])(H){1|C<3>,1|C<4>,1|H<1>,1|N<2>,1|O<2>} +FAD N7A N[5a](C[5a,6a]C[5a,6a]C[6a])(C[5a]N[5a]H){1|C<4>,1|N<3>,2|N<2>} +FAD C5A C[5a,6a](C[5a,6a]N[5a]N[6a])(C[6a]N[6a]N)(N[5a]C[5a]){1|C<3>,1|C<4>,1|H<1>} +FAD C6A C[6a](C[5a,6a]C[5a,6a]N[5a])(N[6a]C[6a])(NHH){1|C<3>,1|H<1>,1|N<2>,1|N<3>} +FAD N6A N(C[6a]C[5a,6a]N[6a])(H)2 +FAD N1A N[6a](C[6a]C[5a,6a]N)(C[6a]N[6a]H){1|C<3>,1|N<2>} +FAD C2A C[6a](N[6a]C[5a,6a])(N[6a]C[6a])(H){1|C<3>,2|N<3>} +FAD N3A N[6a](C[5a,6a]C[5a,6a]N[5a])(C[6a]N[6a]H){1|C<4>,1|N<2>,2|C<3>} +FAD C4A C[5a,6a](C[5a,6a]C[6a]N[5a])(N[5a]C[5a]C[5])(N[6a]C[6a]){1|C<4>,1|N<2>,1|N<3>,1|O<2>,3|H<1>} +FAD N1 N[6a](C[6a,6a]C[6a,6a]N[6a])(C[6a]N[6a]O){1|C<4>,1|H<1>,1|N<2>,2|C<3>} +FAD C2 C[6a](N[6a]C[6a,6a])(N[6a]C[6a]H)(O){1|C<3>,1|N<3>,1|O<1>} +FAD O2 O(C[6a]N[6a]2) +FAD N3 N[6a](C[6a]C[6a,6a]O)(C[6a]N[6a]O)(H){1|C<3>,1|N<2>} +FAD C4 C[6a](C[6a,6a]C[6a,6a]N[6a])(N[6a]C[6a]H)(O){1|C<3>,1|N<2>,1|N<3>,1|O<1>} +FAD O4 O(C[6a]C[6a,6a]N[6a]) +FAD C4X C[6a,6a](C[6a,6a]N[6a]2)(N[6a]C[6a,6a])(C[6a]N[6a]O){1|C<4>,1|H<1>,3|C<3>} +FAD N5 N[6a](C[6a,6a]C[6a,6a]C[6a])2{1|H<1>,1|N<2>,1|O<1>,2|C<3>,2|N<3>} +FAD C5X C[6a,6a](C[6a,6a]C[6a]N[6a])(N[6a]C[6a,6a])(C[6a]C[6a]H){1|H<1>,2|C<4>,3|C<3>} +FAD C6 C[6a](C[6a,6a]C[6a,6a]N[6a])(C[6a]C[6a]C)(H){1|C<4>,1|N<3>,2|C<3>} +FAD C7 C[6a](C[6a]C[6a,6a]H)(C[6a]C[6a]C)(CH3){1|C<3>,1|H<1>,1|N<2>} +FAD C7M C(C[6a]C[6a]2)(H)3 +FAD C8 C[6a](C[6a]C[6a,6a]H)(C[6a]C[6a]C)(CH3){1|C<3>,1|H<1>,1|N<3>} +FAD C8M C(C[6a]C[6a]2)(H)3 +FAD C9 C[6a](C[6a,6a]C[6a,6a]N[6a])(C[6a]C[6a]C)(H){1|N<2>,2|C<3>,2|C<4>} +FAD C9A C[6a,6a](C[6a,6a]C[6a]N[6a])(N[6a]C[6a,6a]C)(C[6a]C[6a]H){1|C<4>,1|H<1>,1|N<2>,2|C<3>} +FAD N10 N[6a](C[6a,6a]C[6a,6a]C[6a])(C[6a,6a]C[6a,6a]N[6a])(CCHH){1|H<1>,1|N<2>,4|C<3>} +FAD C10 C[6a,6a](C[6a,6a]C[6a]N[6a])(N[6a]C[6a,6a]C)(N[6a]C[6a]){1|N<3>,2|C<3>,2|O<1>} +FAD "C1'" C(N[6a]C[6a,6a]2)(CCHO)(H)2 +FAD "C2'" C(CN[6a]HH)(CCHO)(OH)(H) +FAD "O2'" O(CCCH)(H) +FAD "C3'" C(CCHO)2(OH)(H) +FAD "O3'" O(CCCH)(H) +FAD "C4'" C(CCHO)(CHHO)(OH)(H) +FAD "O4'" O(CCCH)(H) +FAD "C5'" C(CCHO)(OP)(H)2 +FAD "O5'" O(CCHH)(PO3) +FAD P P(OC)(OP)(O)2 +FAD O1P O(PO3) +FAD O2P O(PO3) +FAD O3P O(PO3)2 +FAD H51A H(CC[5]HO) +FAD H52A H(CC[5]HO) +FAD H4B H(C[5]C[5]O[5]C) +FAD H3B H(C[5]C[5]2O) +FAD HO3A H(OC[5]) +FAD H2B H(C[5]C[5]2O) +FAD HO2A H(OC[5]) +FAD H1B H(C[5]N[5a]C[5]O[5]) +FAD H8A H(C[5a]N[5a]2) +FAD H61A H(NC[6a]H) +FAD H62A H(NC[6a]H) +FAD H2A H(C[6a]N[6a]2) +FAD HN3 H(N[6a]C[6a]2) +FAD H6 H(C[6a]C[6a,6a]C[6a]) +FAD HM71 H(CC[6a]HH) +FAD HM72 H(CC[6a]HH) +FAD HM73 H(CC[6a]HH) +FAD HM81 H(CC[6a]HH) +FAD HM82 H(CC[6a]HH) +FAD HM83 H(CC[6a]HH) +FAD H9 H(C[6a]C[6a,6a]C[6a]) +FAD "H1'1" H(CN[6a]CH) +FAD "H1'2" H(CN[6a]CH) +FAD "H2'" H(CCCO) +FAD "HO2'" H(OC) +FAD "H3'" H(CCCO) +FAD "HO3'" H(OC) +FAD "H4'" H(CCCO) +FAD "HO4'" H(OC) +FAD "H5'1" H(CCHO) +FAD "H5'2" H(CCHO) +loop_ +_chem_comp_bond.comp_id +_chem_comp_bond.atom_id_1 +_chem_comp_bond.atom_id_2 +_chem_comp_bond.type +_chem_comp_bond.aromatic +_chem_comp_bond.value_dist_nucleus +_chem_comp_bond.value_dist_nucleus_esd +_chem_comp_bond.value_dist +_chem_comp_bond.value_dist_esd +FAD PA O1A DOUBLE n 1.485 0.0100 1.485 0.0100 +FAD PA O2A SINGLE n 1.485 0.0100 1.485 0.0100 +FAD PA O5B SINGLE n 1.598 0.0100 1.598 0.0100 +FAD PA O3P SINGLE n 1.600 0.0185 1.600 0.0185 +FAD O5B C5B SINGLE n 1.445 0.0200 1.445 0.0200 +FAD C5B C4B SINGLE n 1.509 0.0100 1.509 0.0100 +FAD C4B O4B SINGLE n 1.444 0.0100 1.444 0.0100 +FAD C4B C3B SINGLE n 1.532 0.0100 1.532 0.0100 +FAD O4B C1B SINGLE n 1.423 0.0100 1.423 0.0100 +FAD C3B O3B SINGLE n 1.422 0.0100 1.422 0.0100 +FAD C3B C2B SINGLE n 1.532 0.0103 1.532 0.0103 +FAD C2B O2B SINGLE n 1.412 0.0100 1.412 0.0100 +FAD C2B C1B SINGLE n 1.528 0.0100 1.528 0.0100 +FAD C1B N9A SINGLE n 1.462 0.0102 1.462 0.0102 +FAD N9A C8A SINGLE y 1.371 0.0100 1.371 0.0100 +FAD N9A C4A SINGLE y 1.374 0.0101 1.374 0.0101 +FAD C8A N7A DOUBLE y 1.311 0.0100 1.311 0.0100 +FAD N7A C5A SINGLE y 1.388 0.0100 1.388 0.0100 +FAD C5A C6A SINGLE y 1.407 0.0100 1.407 0.0100 +FAD C5A C4A DOUBLE y 1.382 0.0100 1.382 0.0100 +FAD C6A N6A SINGLE n 1.332 0.0107 1.332 0.0107 +FAD C6A N1A DOUBLE y 1.355 0.0106 1.355 0.0106 +FAD N1A C2A SINGLE y 1.338 0.0100 1.338 0.0100 +FAD C2A N3A DOUBLE y 1.329 0.0100 1.329 0.0100 +FAD N3A C4A SINGLE y 1.344 0.0100 1.344 0.0100 +FAD N1 C2 SINGLE y 1.369 0.0100 1.369 0.0100 +FAD N1 C10 DOUBLE y 1.317 0.0100 1.317 0.0100 +FAD C2 O2 DOUBLE n 1.235 0.0100 1.235 0.0100 +FAD C2 N3 SINGLE y 1.393 0.0104 1.393 0.0104 +FAD N3 C4 SINGLE y 1.377 0.0130 1.377 0.0130 +FAD C4 O4 DOUBLE n 1.218 0.0100 1.218 0.0100 +FAD C4 C4X SINGLE y 1.398 0.0190 1.398 0.0190 +FAD C4X N5 DOUBLE y 1.308 0.0122 1.308 0.0122 +FAD C4X C10 SINGLE y 1.443 0.0100 1.443 0.0100 +FAD N5 C5X SINGLE y 1.368 0.0100 1.368 0.0100 +FAD C5X C6 SINGLE y 1.409 0.0100 1.409 0.0100 +FAD C5X C9A DOUBLE y 1.410 0.0100 1.410 0.0100 +FAD C6 C7 DOUBLE y 1.376 0.0100 1.376 0.0100 +FAD C7 C7M SINGLE n 1.507 0.0100 1.507 0.0100 +FAD C7 C8 SINGLE y 1.417 0.0165 1.417 0.0165 +FAD C8 C8M SINGLE n 1.504 0.0100 1.504 0.0100 +FAD C8 C9 DOUBLE y 1.379 0.0100 1.379 0.0100 +FAD C9 C9A SINGLE y 1.403 0.0100 1.403 0.0100 +FAD C9A N10 SINGLE y 1.392 0.0100 1.392 0.0100 +FAD N10 C10 SINGLE y 1.385 0.0119 1.385 0.0119 +FAD N10 "C1'" SINGLE n 1.475 0.0100 1.475 0.0100 +FAD "C1'" "C2'" SINGLE n 1.518 0.0148 1.518 0.0148 +FAD "C2'" "O2'" SINGLE n 1.429 0.0132 1.429 0.0132 +FAD "C2'" "C3'" SINGLE n 1.529 0.0130 1.529 0.0130 +FAD "C3'" "O3'" SINGLE n 1.426 0.0100 1.426 0.0100 +FAD "C3'" "C4'" SINGLE n 1.528 0.0126 1.528 0.0126 +FAD "C4'" "O4'" SINGLE n 1.429 0.0111 1.429 0.0111 +FAD "C4'" "C5'" SINGLE n 1.518 0.0135 1.518 0.0135 +FAD "C5'" "O5'" SINGLE n 1.445 0.0200 1.445 0.0200 +FAD "O5'" P SINGLE n 1.592 0.0137 1.592 0.0137 +FAD P O1P DOUBLE n 1.485 0.0100 1.485 0.0100 +FAD P O2P SINGLE n 1.485 0.0100 1.485 0.0100 +FAD P O3P SINGLE n 1.600 0.0185 1.600 0.0185 +FAD C5B H51A SINGLE n 1.089 0.0100 0.991 0.0200 +FAD C5B H52A SINGLE n 1.089 0.0100 0.991 0.0200 +FAD C4B H4B SINGLE n 1.089 0.0100 0.990 0.0200 +FAD C3B H3B SINGLE n 1.089 0.0100 0.991 0.0200 +FAD O3B HO3A SINGLE n 0.970 0.0120 0.839 0.0200 +FAD C2B H2B SINGLE n 1.089 0.0100 0.991 0.0200 +FAD O2B HO2A SINGLE n 0.970 0.0120 0.839 0.0200 +FAD C1B H1B SINGLE n 1.089 0.0100 1.016 0.0200 +FAD C8A H8A SINGLE n 1.082 0.0130 0.942 0.0168 +FAD N6A H61A SINGLE n 1.016 0.0100 0.880 0.0200 +FAD N6A H62A SINGLE n 1.016 0.0100 0.880 0.0200 +FAD C2A H2A SINGLE n 1.082 0.0130 0.946 0.0200 +FAD N3 HN3 SINGLE n 1.016 0.0100 0.880 0.0100 +FAD C6 H6 SINGLE n 1.082 0.0130 0.952 0.0100 +FAD C7M HM71 SINGLE n 1.089 0.0100 0.972 0.0144 +FAD C7M HM72 SINGLE n 1.089 0.0100 0.972 0.0144 +FAD C7M HM73 SINGLE n 1.089 0.0100 0.972 0.0144 +FAD C8M HM81 SINGLE n 1.089 0.0100 0.972 0.0144 +FAD C8M HM82 SINGLE n 1.089 0.0100 0.972 0.0144 +FAD C8M HM83 SINGLE n 1.089 0.0100 0.972 0.0144 +FAD C9 H9 SINGLE n 1.082 0.0130 0.954 0.0100 +FAD "C1'" "H1'1" SINGLE n 1.089 0.0100 0.980 0.0162 +FAD "C1'" "H1'2" SINGLE n 1.089 0.0100 0.980 0.0162 +FAD "C2'" "H2'" SINGLE n 1.089 0.0100 1.000 0.0200 +FAD "O2'" "HO2'" SINGLE n 0.970 0.0120 0.864 0.0200 +FAD "C3'" "H3'" SINGLE n 1.089 0.0100 0.994 0.0118 +FAD "O3'" "HO3'" SINGLE n 0.970 0.0120 0.864 0.0200 +FAD "C4'" "H4'" SINGLE n 1.089 0.0100 0.991 0.0117 +FAD "O4'" "HO4'" SINGLE n 0.970 0.0120 0.864 0.0200 +FAD "C5'" "H5'1" SINGLE n 1.089 0.0100 0.978 0.0200 +FAD "C5'" "H5'2" SINGLE n 1.089 0.0100 0.978 0.0200 +loop_ +_chem_comp_angle.comp_id +_chem_comp_angle.atom_id_1 +_chem_comp_angle.atom_id_2 +_chem_comp_angle.atom_id_3 +_chem_comp_angle.value_angle +_chem_comp_angle.value_angle_esd +FAD O1A PA O2A 118.805 3.00 +FAD O1A PA O5B 109.340 2.31 +FAD O1A PA O3P 109.053 3.00 +FAD O2A PA O5B 109.340 2.31 +FAD O2A PA O3P 109.053 3.00 +FAD O5B PA O3P 100.137 3.00 +FAD PA O5B C5B 116.362 1.50 +FAD O5B C5B C4B 109.454 1.61 +FAD O5B C5B H51A 109.882 1.50 +FAD O5B C5B H52A 109.882 1.50 +FAD C4B C5B H51A 109.589 1.50 +FAD C4B C5B H52A 109.589 1.50 +FAD H51A C5B H52A 108.471 1.50 +FAD C5B C4B O4B 109.154 1.50 +FAD C5B C4B C3B 115.288 1.50 +FAD C5B C4B H4B 108.351 1.59 +FAD O4B C4B C3B 105.318 1.50 +FAD O4B C4B H4B 109.120 1.50 +FAD C3B C4B H4B 109.322 2.54 +FAD C4B O4B C1B 109.502 2.85 +FAD C4B C3B O3B 110.713 3.00 +FAD C4B C3B C2B 102.593 1.50 +FAD C4B C3B H3B 110.577 3.00 +FAD O3B C3B C2B 111.671 3.00 +FAD O3B C3B H3B 110.541 2.08 +FAD C2B C3B H3B 110.454 1.85 +FAD C3B O3B HO3A 109.389 3.00 +FAD C3B C2B O2B 112.677 3.00 +FAD C3B C2B C1B 101.406 1.50 +FAD C3B C2B H2B 110.788 1.91 +FAD O2B C2B C1B 110.814 3.00 +FAD O2B C2B H2B 110.904 1.50 +FAD C1B C2B H2B 110.342 1.91 +FAD C2B O2B HO2A 109.217 3.00 +FAD O4B C1B C2B 106.114 1.65 +FAD O4B C1B N9A 108.577 1.50 +FAD O4B C1B H1B 109.833 2.53 +FAD C2B C1B N9A 113.380 2.77 +FAD C2B C1B H1B 109.222 1.50 +FAD N9A C1B H1B 109.411 1.50 +FAD C1B N9A C8A 127.072 3.00 +FAD C1B N9A C4A 126.969 2.94 +FAD C8A N9A C4A 105.958 1.50 +FAD N9A C8A N7A 113.692 1.50 +FAD N9A C8A H8A 122.949 1.50 +FAD N7A C8A H8A 123.359 1.50 +FAD C8A N7A C5A 103.906 1.50 +FAD N7A C5A C6A 131.998 1.50 +FAD N7A C5A C4A 110.646 1.50 +FAD C6A C5A C4A 117.356 1.50 +FAD C5A C6A N6A 123.773 1.50 +FAD C5A C6A N1A 117.375 1.50 +FAD N6A C6A N1A 118.852 1.50 +FAD C6A N6A H61A 119.818 3.00 +FAD C6A N6A H62A 119.818 3.00 +FAD H61A N6A H62A 120.363 3.00 +FAD C6A N1A C2A 118.603 1.50 +FAD N1A C2A N3A 129.210 1.50 +FAD N1A C2A H2A 115.363 1.50 +FAD N3A C2A H2A 115.427 1.50 +FAD C2A N3A C4A 111.101 1.50 +FAD N9A C4A C5A 105.797 1.50 +FAD N9A C4A N3A 127.848 1.50 +FAD C5A C4A N3A 126.355 1.50 +FAD C2 N1 C10 118.461 1.50 +FAD N1 C2 O2 121.468 1.50 +FAD N1 C2 N3 119.897 1.50 +FAD O2 C2 N3 118.636 1.50 +FAD C2 N3 C4 126.347 1.50 +FAD C2 N3 HN3 117.238 1.50 +FAD C4 N3 HN3 116.415 2.90 +FAD N3 C4 O4 122.539 1.50 +FAD N3 C4 C4X 112.794 1.50 +FAD O4 C4 C4X 124.668 1.50 +FAD C4 C4X N5 117.421 1.50 +FAD C4 C4X C10 117.741 1.50 +FAD N5 C4X C10 124.838 1.50 +FAD C4X N5 C5X 117.454 1.50 +FAD N5 C5X C6 118.145 1.50 +FAD N5 C5X C9A 122.298 1.50 +FAD C6 C5X C9A 119.556 1.50 +FAD C5X C6 C7 121.774 1.50 +FAD C5X C6 H6 118.910 1.63 +FAD C7 C6 H6 119.325 1.50 +FAD C6 C7 C7M 119.966 1.50 +FAD C6 C7 C8 119.488 1.50 +FAD C7M C7 C8 120.546 1.50 +FAD C7 C7M HM71 109.566 1.50 +FAD C7 C7M HM72 109.566 1.50 +FAD C7 C7M HM73 109.566 1.50 +FAD HM71 C7M HM72 109.334 1.91 +FAD HM71 C7M HM73 109.334 1.91 +FAD HM72 C7M HM73 109.334 1.91 +FAD C7 C8 C8M 120.546 1.50 +FAD C7 C8 C9 119.488 1.50 +FAD C8M C8 C9 119.966 1.50 +FAD C8 C8M HM81 109.566 1.50 +FAD C8 C8M HM82 109.566 1.50 +FAD C8 C8M HM83 109.566 1.50 +FAD HM81 C8M HM82 109.334 1.91 +FAD HM81 C8M HM83 109.334 1.91 +FAD HM82 C8M HM83 109.334 1.91 +FAD C8 C9 C9A 120.779 1.50 +FAD C8 C9 H9 119.551 1.50 +FAD C9A C9 H9 119.670 1.50 +FAD C5X C9A C9 118.907 1.50 +FAD C5X C9A N10 118.199 1.50 +FAD C9 C9A N10 122.894 1.50 +FAD C9A N10 C10 120.671 1.50 +FAD C9A N10 "C1'" 120.592 1.50 +FAD C10 N10 "C1'" 118.737 1.50 +FAD N1 C10 C4X 124.761 1.50 +FAD N1 C10 N10 118.699 1.50 +FAD C4X C10 N10 116.541 1.50 +FAD N10 "C1'" "C2'" 112.123 2.65 +FAD N10 "C1'" "H1'1" 108.981 1.50 +FAD N10 "C1'" "H1'2" 108.981 1.50 +FAD "C2'" "C1'" "H1'1" 109.180 1.50 +FAD "C2'" "C1'" "H1'2" 109.180 1.50 +FAD "H1'1" "C1'" "H1'2" 107.924 2.79 +FAD "C1'" "C2'" "O2'" 109.718 2.99 +FAD "C1'" "C2'" "C3'" 111.239 3.00 +FAD "C1'" "C2'" "H2'" 108.435 1.50 +FAD "O2'" "C2'" "C3'" 109.426 3.00 +FAD "O2'" "C2'" "H2'" 108.176 3.00 +FAD "C3'" "C2'" "H2'" 108.439 2.58 +FAD "C2'" "O2'" "HO2'" 109.126 3.00 +FAD "C2'" "C3'" "O3'" 109.426 3.00 +FAD "C2'" "C3'" "C4'" 113.599 3.00 +FAD "C2'" "C3'" "H3'" 108.439 2.58 +FAD "O3'" "C3'" "C4'" 109.190 2.87 +FAD "O3'" "C3'" "H3'" 108.315 1.83 +FAD "C4'" "C3'" "H3'" 108.171 1.50 +FAD "C3'" "O3'" "HO3'" 108.910 3.00 +FAD "C3'" "C4'" "O4'" 109.920 2.94 +FAD "C3'" "C4'" "C5'" 112.050 2.78 +FAD "C3'" "C4'" "H4'" 108.859 1.50 +FAD "O4'" "C4'" "C5'" 109.162 3.00 +FAD "O4'" "C4'" "H4'" 108.709 1.50 +FAD "C5'" "C4'" "H4'" 108.615 1.79 +FAD "C4'" "O4'" "HO4'" 109.757 3.00 +FAD "C4'" "C5'" "O5'" 109.303 3.00 +FAD "C4'" "C5'" "H5'1" 109.594 1.50 +FAD "C4'" "C5'" "H5'2" 109.594 1.50 +FAD "O5'" "C5'" "H5'1" 108.621 3.00 +FAD "O5'" "C5'" "H5'2" 108.621 3.00 +FAD "H5'1" "C5'" "H5'2" 108.315 1.66 +FAD "C5'" "O5'" P 119.008 2.40 +FAD "O5'" P O1P 108.662 3.00 +FAD "O5'" P O2P 108.662 3.00 +FAD "O5'" P O3P 100.260 3.00 +FAD O1P P O2P 118.805 3.00 +FAD O1P P O3P 109.053 3.00 +FAD O2P P O3P 109.053 3.00 +FAD PA O3P P 133.108 3.00 +loop_ +_chem_comp_tor.comp_id +_chem_comp_tor.id +_chem_comp_tor.atom_id_1 +_chem_comp_tor.atom_id_2 +_chem_comp_tor.atom_id_3 +_chem_comp_tor.atom_id_4 +_chem_comp_tor.value_angle +_chem_comp_tor.value_angle_esd +_chem_comp_tor.period +FAD sp3_sp3_27 C5B O5B PA O1A 60.000 10.0 3 +FAD sp3_sp3_30 P O3P PA O1A 60.000 10.0 3 +FAD sp2_sp3_1 C8A N9A C1B O4B 150.000 10.0 6 +FAD const_48 N7A C8A N9A C1B 180.000 0.0 2 +FAD const_80 C5A C4A N9A C1B 180.000 0.0 2 +FAD const_51 N9A C8A N7A C5A 0.000 0.0 2 +FAD const_54 C6A C5A N7A C8A 180.000 0.0 2 +FAD const_38 N7A C5A C6A N6A 0.000 0.0 2 +FAD const_55 N9A C4A C5A N7A 0.000 0.0 2 +FAD sp2_sp2_83 C5A C6A N6A H61A 180.000 20 2 +FAD const_40 N6A C6A N1A C2A 180.000 0.0 2 +FAD const_41 N3A C2A N1A C6A 0.000 0.0 2 +FAD const_43 N1A C2A N3A C4A 0.000 0.0 2 +FAD const_46 N9A C4A N3A C2A 180.000 0.0 2 +FAD const_sp2_sp2_2 O2 C2 N1 C10 180.000 0.0 2 +FAD const_87 C4X C10 N1 C2 0.000 0.0 2 +FAD const_sp2_sp2_5 O2 C2 N3 C4 180.000 0.0 2 +FAD const_sp2_sp2_9 O4 C4 N3 C2 180.000 0.0 2 +FAD const_14 O4 C4 C4X N5 0.000 0.0 2 +FAD const_20 C4 C4X N5 C5X 180.000 0.0 2 +FAD const_15 N1 C10 C4X C4 0.000 0.0 2 +FAD const_22 C6 C5X N5 C4X 180.000 0.0 2 +FAD const_61 N5 C5X C6 C7 180.000 0.0 2 +FAD const_24 N5 C5X C9A C9 180.000 0.0 2 +FAD const_64 C5X C6 C7 C7M 180.000 0.0 2 +FAD sp2_sp3_7 C6 C7 C7M HM71 150.000 10.0 6 +FAD const_70 C7M C7 C8 C8M 0.000 0.0 2 +FAD sp2_sp3_13 C7 C8 C8M HM81 150.000 10.0 6 +FAD const_73 C8M C8 C9 C9A 180.000 0.0 2 +FAD const_75 C8 C9 C9A C5X 0.000 0.0 2 +FAD const_28 C5X C9A N10 "C1'" 180.000 0.0 2 +FAD const_34 N1 C10 N10 "C1'" 0.000 0.0 2 +FAD sp2_sp3_20 C9A N10 "C1'" "C2'" -90.000 10.0 6 +FAD sp3_sp3_31 C4B C5B O5B PA 180.000 10.0 3 +FAD sp3_sp3_58 N10 "C1'" "C2'" "O2'" 180.000 10.0 3 +FAD sp3_sp3_67 "C1'" "C2'" "O2'" "HO2'" 180.000 10.0 3 +FAD sp3_sp3_70 "C1'" "C2'" "C3'" "O3'" 180.000 10.0 3 +FAD sp3_sp3_79 "C2'" "C3'" "O3'" "HO3'" 180.000 10.0 3 +FAD sp3_sp3_82 "C2'" "C3'" "C4'" "O4'" 180.000 10.0 3 +FAD sp3_sp3_91 "C3'" "C4'" "O4'" "HO4'" 180.000 10.0 3 +FAD sp3_sp3_94 "C3'" "C4'" "C5'" "O5'" 180.000 10.0 3 +FAD sp3_sp3_103 "C4'" "C5'" "O5'" P 180.000 10.0 3 +FAD sp3_sp3_108 "C5'" "O5'" P O1P 60.000 10.0 3 +FAD sp3_sp3_110 PA O3P P "O5'" -60.000 10.0 3 +FAD sp3_sp3_34 O4B C4B C5B O5B 180.000 10.0 3 +FAD sp3_sp3_2 C5B C4B O4B C1B -60.000 10.0 3 +FAD sp3_sp3_47 O3B C3B C4B C5B 180.000 10.0 3 +FAD sp3_sp3_4 C2B C1B O4B C4B -60.000 10.0 3 +FAD sp3_sp3_52 C4B C3B O3B HO3A 180.000 10.0 3 +FAD sp3_sp3_20 O2B C2B C3B O3B -60.000 10.0 3 +FAD sp3_sp3_55 C3B C2B O2B HO2A 180.000 10.0 3 +FAD sp3_sp3_8 O4B C1B C2B O2B 180.000 10.0 3 +loop_ +_chem_comp_chir.comp_id +_chem_comp_chir.id +_chem_comp_chir.atom_id_centre +_chem_comp_chir.atom_id_1 +_chem_comp_chir.atom_id_2 +_chem_comp_chir.atom_id_3 +_chem_comp_chir.volume_sign +FAD chir_1 PA O3P O5B O2A both +FAD chir_2 C4B O4B C3B C5B negative +FAD chir_3 C3B O3B C4B C2B positive +FAD chir_4 C2B O2B C1B C3B negative +FAD chir_5 C1B O4B N9A C2B negative +FAD chir_6 "C2'" "O2'" "C3'" "C1'" positive +FAD chir_7 "C3'" "O3'" "C4'" "C2'" positive +FAD chir_8 "C4'" "O4'" "C3'" "C5'" negative +FAD chir_9 P O3P "O5'" O2P both +loop_ +_chem_comp_plane_atom.comp_id +_chem_comp_plane_atom.plane_id +_chem_comp_plane_atom.atom_id +_chem_comp_plane_atom.dist_esd +FAD plan-1 C1B 0.020 +FAD plan-1 C4A 0.020 +FAD plan-1 C5A 0.020 +FAD plan-1 C6A 0.020 +FAD plan-1 C8A 0.020 +FAD plan-1 H8A 0.020 +FAD plan-1 N3A 0.020 +FAD plan-1 N7A 0.020 +FAD plan-1 N9A 0.020 +FAD plan-2 C2A 0.020 +FAD plan-2 C4A 0.020 +FAD plan-2 C5A 0.020 +FAD plan-2 C6A 0.020 +FAD plan-2 H2A 0.020 +FAD plan-2 N1A 0.020 +FAD plan-2 N3A 0.020 +FAD plan-2 N6A 0.020 +FAD plan-2 N7A 0.020 +FAD plan-2 N9A 0.020 +FAD plan-3 C10 0.020 +FAD plan-3 C2 0.020 +FAD plan-3 C4 0.020 +FAD plan-3 C4X 0.020 +FAD plan-3 HN3 0.020 +FAD plan-3 N1 0.020 +FAD plan-3 N10 0.020 +FAD plan-3 N3 0.020 +FAD plan-3 N5 0.020 +FAD plan-3 O2 0.020 +FAD plan-3 O4 0.020 +FAD plan-4 "C1'" 0.020 +FAD plan-4 C10 0.020 +FAD plan-4 C4 0.020 +FAD plan-4 C4X 0.020 +FAD plan-4 C5X 0.020 +FAD plan-4 C6 0.020 +FAD plan-4 C9 0.020 +FAD plan-4 C9A 0.020 +FAD plan-4 N1 0.020 +FAD plan-4 N10 0.020 +FAD plan-4 N5 0.020 +FAD plan-5 C5X 0.020 +FAD plan-5 C6 0.020 +FAD plan-5 C7 0.020 +FAD plan-5 C7M 0.020 +FAD plan-5 C8 0.020 +FAD plan-5 C8M 0.020 +FAD plan-5 C9 0.020 +FAD plan-5 C9A 0.020 +FAD plan-5 H6 0.020 +FAD plan-5 H9 0.020 +FAD plan-5 N10 0.020 +FAD plan-5 N5 0.020 +FAD plan-6 C6A 0.020 +FAD plan-6 H61A 0.020 +FAD plan-6 H62A 0.020 +FAD plan-6 N6A 0.020 +loop_ +_pdbx_chem_comp_descriptor.comp_id +_pdbx_chem_comp_descriptor.type +_pdbx_chem_comp_descriptor.program +_pdbx_chem_comp_descriptor.program_version +_pdbx_chem_comp_descriptor.descriptor +FAD SMILES ACDLabs 10.04 "O=C2C3=Nc1cc(c(cc1N(C3=NC(=O)N2)CC(O)C(O)C(O)COP(=O)(O)OP(=O)(O)OCC6OC(n5cnc4c(ncnc45)N)C(O)C6O)C)C" +FAD SMILES_CANONICAL CACTVS 3.341 "Cc1cc2N=C3C(=O)NC(=O)N=C3N(C[C@H](O)[C@H](O)[C@H](O)CO[P@](O)(=O)O[P@@](O)(=O)OC[C@H]4O[C@H]([C@H](O)[C@@H]4O)n5cnc6c(N)ncnc56)c2cc1C" +FAD SMILES CACTVS 3.341 "Cc1cc2N=C3C(=O)NC(=O)N=C3N(C[CH](O)[CH](O)[CH](O)CO[P](O)(=O)O[P](O)(=O)OC[CH]4O[CH]([CH](O)[CH]4O)n5cnc6c(N)ncnc56)c2cc1C" +FAD SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 "Cc1cc2c(cc1C)N(C3=NC(=O)NC(=O)C3=N2)C[C@@H]([C@@H]([C@@H](CO[P@@](=O)(O)O[P@](=O)(O)OC[C@@H]4[C@H]([C@H]([C@@H](O4)n5cnc6c5ncnc6N)O)O)O)O)O" +FAD SMILES "OpenEye OEToolkits" 1.5.0 "Cc1cc2c(cc1C)N(C3=NC(=O)NC(=O)C3=N2)CC(C(C(COP(=O)(O)OP(=O)(O)OCC4C(C(C(O4)n5cnc6c5ncnc6N)O)O)O)O)O" +FAD InChI InChI 1.03 "InChI=1S/C27H33N9O15P2/c1-10-3-12-13(4-11(10)2)35(24-18(32-12)25(42)34-27(43)33-24)5-14(37)19(39)15(38)6-48-52(44,45)51-53(46,47)49-7-16-20(40)21(41)26(50-16)36-9-31-17-22(28)29-8-30-23(17)36/h3-4,8-9,14-16,19-21,26,37-41H,5-7H2,1-2H3,(H,44,45)(H,46,47)(H2,28,29,30)(H,34,42,43)/t14-,15+,16+,19-,20+,21+,26+/m0/s1" +FAD InChIKey InChI 1.03 VWWQXMAJTJZDQX-UYBVJOGSSA-N +loop_ +_pdbx_chem_comp_description_generator.comp_id +_pdbx_chem_comp_description_generator.program_name +_pdbx_chem_comp_description_generator.program_version +_pdbx_chem_comp_description_generator.descriptor +FAD acedrg 275 "dictionary generator" +FAD acedrg_database 12 "data source" +FAD rdkit 2019.09.1 "Chemoinformatics tool" +FAD refmac5 5.8.0405 "optimization tool" diff --git a/image_analysis/structure_refinement/monomers/FE.cif b/image_analysis/structure_refinement/monomers/FE.cif new file mode 100644 index 000000000..eabe098cd --- /dev/null +++ b/image_analysis/structure_refinement/monomers/FE.cif @@ -0,0 +1,30 @@ +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +FE FE 'FE (III) ION ' NON-POLYMER 1 1 . + +data_comp_FE +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.partial_charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +FE FE FE FE 3.000 0.000 0.000 0.000 + +loop_ +_chem_comp_tree.comp_id +_chem_comp_tree.atom_id +_chem_comp_tree.atom_back +_chem_comp_tree.atom_forward +_chem_comp_tree.connect_type +FE FE n/a . END diff --git a/image_analysis/structure_refinement/monomers/FE2.cif b/image_analysis/structure_refinement/monomers/FE2.cif new file mode 100644 index 000000000..fb5535321 --- /dev/null +++ b/image_analysis/structure_refinement/monomers/FE2.cif @@ -0,0 +1,30 @@ +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +FE2 FE2 'FE (II) ION ' NON-POLYMER 1 1 . + +data_comp_FE2 +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.partial_charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +FE2 FE FE FE 2.000 0.000 0.000 0.000 + +loop_ +_chem_comp_tree.comp_id +_chem_comp_tree.atom_id +_chem_comp_tree.atom_back +_chem_comp_tree.atom_forward +_chem_comp_tree.connect_type +FE2 FE n/a . END diff --git a/image_analysis/structure_refinement/monomers/FMN.cif b/image_analysis/structure_refinement/monomers/FMN.cif new file mode 100644 index 000000000..220ed4327 --- /dev/null +++ b/image_analysis/structure_refinement/monomers/FMN.cif @@ -0,0 +1,337 @@ +# +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +FMN FMN "FLAVIN MONONUCLEOTIDE" NON-POLYMER 50 31 . +# +data_comp_FMN +# +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +FMN N1 N NRD6 0 33.067 6.557 14.888 +FMN C2 C CR6 0 32.180 5.530 15.005 +FMN O2 O O 0 32.567 4.383 15.250 +FMN N3 N NR6 0 30.830 5.721 14.860 +FMN C4 C CR6 0 30.302 6.963 14.585 +FMN O4 O O 0 29.090 7.087 14.463 +FMN C4A C CR66 0 31.209 8.062 14.453 +FMN N5 N NRD6 0 30.723 9.250 14.191 +FMN C5A C CR66 0 31.604 10.293 14.068 +FMN C6 C CR16 0 31.061 11.563 13.788 +FMN C7 C CR6 0 31.851 12.681 13.648 +FMN C7M C CH3 0 31.199 14.009 13.347 +FMN C8 C CR6 0 33.272 12.544 13.787 +FMN C8M C CH3 0 34.190 13.733 13.641 +FMN C9 C CR16 0 33.814 11.292 14.063 +FMN C9A C CR66 0 33.007 10.140 14.210 +FMN N10 N NR6 0 33.500 8.849 14.490 +FMN C10 C CR66 0 32.615 7.770 14.622 +FMN "C1'" C CH2 0 34.953 8.600 14.655 +FMN "C2'" C CH1 0 35.393 8.656 16.119 +FMN "O2'" O OH1 0 34.975 9.887 16.712 +FMN "C3'" C CH1 0 36.908 8.505 16.320 +FMN "O3'" O OH1 0 37.577 9.611 15.699 +FMN "C4'" C CH1 0 37.505 7.182 15.823 +FMN "O4'" O OH1 0 36.840 6.086 16.455 +FMN "C5'" C CH2 0 38.990 7.063 16.085 +FMN "O5'" O O2 0 39.268 7.119 17.512 +FMN P P P 0 40.802 7.026 18.006 +FMN O1P O O 0 40.755 7.133 19.519 +FMN O2P O OP -1 41.519 8.194 17.355 +FMN O3P O OP -1 41.310 5.680 17.526 +FMN HN3 H H 0 30.294 5.027 14.946 +FMN H6 H H 0 30.115 11.646 13.696 +FMN HM71 H H 0 31.765 14.737 13.647 +FMN HM72 H H 0 30.346 14.059 13.808 +FMN HM73 H H 0 31.051 14.088 12.391 +FMN HM81 H H 0 35.116 13.445 13.677 +FMN HM82 H H 0 34.022 14.362 14.361 +FMN HM83 H H 0 34.023 14.169 12.789 +FMN H9 H H 0 34.761 11.223 14.156 +FMN "H1'1" H H 0 35.460 9.245 14.138 +FMN "H1'2" H H 0 35.168 7.720 14.292 +FMN "H2'" H H 0 34.941 7.923 16.609 +FMN "HO2'" H H 0 35.387 10.537 16.354 +FMN "H3'" H H 0 37.078 8.565 17.295 +FMN "HO3'" H H 0 37.689 9.467 14.871 +FMN "H4'" H H 0 37.357 7.113 14.833 +FMN "HO4'" H H 0 36.918 6.118 17.299 +FMN "H5'1" H H 0 39.467 7.788 15.630 +FMN "H5'2" H H 0 39.317 6.211 15.727 +loop_ +_chem_comp_bond.comp_id +_chem_comp_bond.atom_id_1 +_chem_comp_bond.atom_id_2 +_chem_comp_bond.type +_chem_comp_bond.aromatic +_chem_comp_bond.value_dist_nucleus +_chem_comp_bond.value_dist_nucleus_esd +_chem_comp_bond.value_dist +_chem_comp_bond.value_dist_esd +FMN N1 C2 SINGLE y 1.349 0.0188 1.349 0.0188 +FMN N1 C10 DOUBLE y 1.316 0.0100 1.316 0.0100 +FMN C2 O2 DOUBLE n 1.233 0.0164 1.233 0.0164 +FMN C2 N3 SINGLE y 1.354 0.0200 1.354 0.0200 +FMN N3 C4 SINGLE y 1.372 0.0117 1.372 0.0117 +FMN C4 O4 DOUBLE n 1.223 0.0119 1.223 0.0119 +FMN C4 C4A SINGLE y 1.412 0.0200 1.412 0.0200 +FMN C4A N5 DOUBLE y 1.309 0.0135 1.309 0.0135 +FMN C4A C10 SINGLE y 1.442 0.0100 1.442 0.0100 +FMN N5 C5A SINGLE y 1.369 0.0100 1.369 0.0100 +FMN C5A C6 SINGLE y 1.407 0.0100 1.407 0.0100 +FMN C5A C9A DOUBLE y 1.409 0.0100 1.409 0.0100 +FMN C6 C7 DOUBLE y 1.375 0.0100 1.375 0.0100 +FMN C7 C7M SINGLE n 1.507 0.0100 1.507 0.0100 +FMN C7 C8 SINGLE y 1.415 0.0183 1.415 0.0183 +FMN C8 C8M SINGLE n 1.507 0.0100 1.507 0.0100 +FMN C8 C9 DOUBLE y 1.378 0.0152 1.378 0.0152 +FMN C9 C9A SINGLE y 1.404 0.0100 1.404 0.0100 +FMN C9A N10 SINGLE y 1.393 0.0100 1.393 0.0100 +FMN N10 C10 SINGLE y 1.383 0.0127 1.383 0.0127 +FMN N10 "C1'" SINGLE n 1.474 0.0100 1.474 0.0100 +FMN "C1'" "C2'" SINGLE n 1.517 0.0189 1.517 0.0189 +FMN "C2'" "O2'" SINGLE n 1.424 0.0199 1.424 0.0199 +FMN "C2'" "C3'" SINGLE n 1.531 0.0100 1.531 0.0100 +FMN "C3'" "O3'" SINGLE n 1.424 0.0199 1.424 0.0199 +FMN "C3'" "C4'" SINGLE n 1.530 0.0100 1.530 0.0100 +FMN "C4'" "O4'" SINGLE n 1.429 0.0100 1.429 0.0100 +FMN "C4'" "C5'" SINGLE n 1.511 0.0100 1.511 0.0100 +FMN "C5'" "O5'" SINGLE n 1.454 0.0165 1.454 0.0165 +FMN "O5'" P SINGLE n 1.614 0.0178 1.614 0.0178 +FMN P O1P DOUBLE n 1.517 0.0192 1.517 0.0192 +FMN P O2P SINGLE n 1.517 0.0192 1.517 0.0192 +FMN P O3P SINGLE n 1.517 0.0192 1.517 0.0192 +FMN N3 HN3 SINGLE n 1.016 0.0100 0.880 0.0200 +FMN C6 H6 SINGLE n 1.082 0.0130 0.954 0.0100 +FMN C7M HM71 SINGLE n 1.089 0.0100 0.971 0.0135 +FMN C7M HM72 SINGLE n 1.089 0.0100 0.971 0.0135 +FMN C7M HM73 SINGLE n 1.089 0.0100 0.971 0.0135 +FMN C8M HM81 SINGLE n 1.089 0.0100 0.971 0.0135 +FMN C8M HM82 SINGLE n 1.089 0.0100 0.971 0.0135 +FMN C8M HM83 SINGLE n 1.089 0.0100 0.971 0.0135 +FMN C9 H9 SINGLE n 1.082 0.0130 0.956 0.0118 +FMN "C1'" "H1'1" SINGLE n 1.089 0.0100 0.978 0.0200 +FMN "C1'" "H1'2" SINGLE n 1.089 0.0100 0.978 0.0200 +FMN "C2'" "H2'" SINGLE n 1.089 0.0100 0.992 0.0184 +FMN "O2'" "HO2'" SINGLE n 0.970 0.0120 0.848 0.0200 +FMN "C3'" "H3'" SINGLE n 1.089 0.0100 0.992 0.0184 +FMN "O3'" "HO3'" SINGLE n 0.970 0.0120 0.848 0.0200 +FMN "C4'" "H4'" SINGLE n 1.089 0.0100 1.004 0.0200 +FMN "O4'" "HO4'" SINGLE n 0.970 0.0120 0.848 0.0200 +FMN "C5'" "H5'1" SINGLE n 1.089 0.0100 0.980 0.0146 +FMN "C5'" "H5'2" SINGLE n 1.089 0.0100 0.980 0.0146 +loop_ +_chem_comp_angle.comp_id +_chem_comp_angle.atom_id_1 +_chem_comp_angle.atom_id_2 +_chem_comp_angle.atom_id_3 +_chem_comp_angle.value_angle +_chem_comp_angle.value_angle_esd +FMN C2 N1 C10 118.131 1.50 +FMN N1 C2 O2 121.177 1.50 +FMN N1 C2 N3 121.483 2.18 +FMN O2 C2 N3 117.340 1.50 +FMN C2 N3 C4 121.560 1.50 +FMN C2 N3 HN3 118.500 2.31 +FMN C4 N3 HN3 119.939 1.50 +FMN N3 C4 O4 119.688 1.50 +FMN N3 C4 C4A 118.005 1.65 +FMN O4 C4 C4A 122.306 1.50 +FMN C4 C4A N5 118.186 1.50 +FMN C4 C4A C10 116.947 1.50 +FMN N5 C4A C10 124.867 1.50 +FMN C4A N5 C5A 117.421 1.50 +FMN N5 C5A C6 118.199 1.50 +FMN N5 C5A C9A 122.273 1.50 +FMN C6 C5A C9A 119.529 1.50 +FMN C5A C6 C7 121.879 1.50 +FMN C5A C6 H6 118.690 1.50 +FMN C7 C6 H6 119.431 1.50 +FMN C6 C7 C7M 120.045 1.50 +FMN C6 C7 C8 119.399 1.50 +FMN C7M C7 C8 120.556 1.50 +FMN C7 C7M HM71 109.535 1.50 +FMN C7 C7M HM72 109.535 1.50 +FMN C7 C7M HM73 109.535 1.50 +FMN HM71 C7M HM72 109.348 1.50 +FMN HM71 C7M HM73 109.348 1.50 +FMN HM72 C7M HM73 109.348 1.50 +FMN C7 C8 C8M 120.556 1.50 +FMN C7 C8 C9 119.399 1.50 +FMN C8M C8 C9 120.045 1.50 +FMN C8 C8M HM81 109.535 1.50 +FMN C8 C8M HM82 109.535 1.50 +FMN C8 C8M HM83 109.535 1.50 +FMN HM81 C8M HM82 109.348 1.50 +FMN HM81 C8M HM83 109.348 1.50 +FMN HM82 C8M HM83 109.348 1.50 +FMN C8 C9 C9A 120.818 1.51 +FMN C8 C9 H9 119.507 1.50 +FMN C9A C9 H9 119.676 1.64 +FMN C5A C9A C9 118.977 1.50 +FMN C5A C9A N10 118.178 1.50 +FMN C9 C9A N10 122.846 1.50 +FMN C9A N10 C10 120.732 1.50 +FMN C9A N10 "C1'" 119.696 1.50 +FMN C10 N10 "C1'" 119.572 1.50 +FMN N1 C10 C4A 123.873 1.50 +FMN N1 C10 N10 119.597 1.50 +FMN C4A C10 N10 116.530 1.50 +FMN N10 "C1'" "C2'" 112.079 1.50 +FMN N10 "C1'" "H1'1" 108.897 1.50 +FMN N10 "C1'" "H1'2" 108.897 1.50 +FMN "C2'" "C1'" "H1'1" 109.291 1.50 +FMN "C2'" "C1'" "H1'2" 109.291 1.50 +FMN "H1'1" "C1'" "H1'2" 107.893 1.50 +FMN "C1'" "C2'" "O2'" 109.698 2.33 +FMN "C1'" "C2'" "C3'" 110.999 2.33 +FMN "C1'" "C2'" "H2'" 108.757 1.75 +FMN "O2'" "C2'" "C3'" 109.320 2.01 +FMN "O2'" "C2'" "H2'" 108.183 1.96 +FMN "C3'" "C2'" "H2'" 108.450 1.83 +FMN "C2'" "O2'" "HO2'" 109.265 3.00 +FMN "C2'" "C3'" "O3'" 109.320 2.01 +FMN "C2'" "C3'" "C4'" 113.695 2.13 +FMN "C2'" "C3'" "H3'" 108.450 1.83 +FMN "O3'" "C3'" "C4'" 109.164 1.97 +FMN "O3'" "C3'" "H3'" 108.243 1.50 +FMN "C4'" "C3'" "H3'" 108.336 1.50 +FMN "C3'" "O3'" "HO3'" 108.564 3.00 +FMN "C3'" "C4'" "O4'" 109.549 1.85 +FMN "C3'" "C4'" "C5'" 112.503 1.50 +FMN "C3'" "C4'" "H4'" 108.777 1.50 +FMN "O4'" "C4'" "C5'" 109.314 1.96 +FMN "O4'" "C4'" "H4'" 108.591 1.50 +FMN "C5'" "C4'" "H4'" 108.656 1.50 +FMN "C4'" "O4'" "HO4'" 111.202 3.00 +FMN "C4'" "C5'" "O5'" 109.438 2.56 +FMN "C4'" "C5'" "H5'1" 109.582 1.50 +FMN "C4'" "C5'" "H5'2" 109.582 1.50 +FMN "O5'" "C5'" "H5'1" 109.393 1.91 +FMN "O5'" "C5'" "H5'2" 109.393 1.91 +FMN "H5'1" "C5'" "H5'2" 108.319 1.50 +FMN "C5'" "O5'" P 118.671 1.50 +FMN "O5'" P O1P 105.795 2.09 +FMN "O5'" P O2P 105.795 2.09 +FMN "O5'" P O3P 105.795 2.09 +FMN O1P P O2P 112.864 1.69 +FMN O1P P O3P 112.864 1.69 +FMN O2P P O3P 112.864 1.69 +loop_ +_chem_comp_tor.comp_id +_chem_comp_tor.id +_chem_comp_tor.atom_id_1 +_chem_comp_tor.atom_id_2 +_chem_comp_tor.atom_id_3 +_chem_comp_tor.atom_id_4 +_chem_comp_tor.value_angle +_chem_comp_tor.value_angle_esd +_chem_comp_tor.period +FMN const_sp2_sp2_2 O2 C2 N1 C10 180.000 5.0 2 +FMN const_55 C4A C10 N1 C2 0.000 10.0 2 +FMN sp2_sp3_1 C6 C7 C7M HM71 150.000 10.0 6 +FMN const_46 C7M C7 C8 C8M 0.000 10.0 2 +FMN sp2_sp3_7 C7 C8 C8M HM81 150.000 10.0 6 +FMN const_49 C8M C8 C9 C9A 180.000 10.0 2 +FMN const_51 C8 C9 C9A C5A 0.000 10.0 2 +FMN const_28 C5A C9A N10 "C1'" 180.000 10.0 2 +FMN const_34 N1 C10 N10 "C1'" 0.000 10.0 2 +FMN sp2_sp3_14 C9A N10 "C1'" "C2'" -90.000 10.0 6 +FMN sp3_sp3_1 N10 "C1'" "C2'" "O2'" 180.000 10.0 3 +FMN sp3_sp3_10 "C1'" "C2'" "O2'" "HO2'" 180.000 10.0 3 +FMN sp3_sp3_13 "C1'" "C2'" "C3'" "O3'" 180.000 10.0 3 +FMN const_sp2_sp2_5 O2 C2 N3 C4 180.000 5.0 2 +FMN sp3_sp3_22 "C2'" "C3'" "O3'" "HO3'" 180.000 10.0 3 +FMN sp3_sp3_25 "C2'" "C3'" "C4'" "O4'" 180.000 10.0 3 +FMN sp3_sp3_34 "C3'" "C4'" "O4'" "HO4'" 180.000 10.0 3 +FMN sp3_sp3_37 "C3'" "C4'" "C5'" "O5'" 180.000 10.0 3 +FMN sp3_sp3_46 "C4'" "C5'" "O5'" P 180.000 10.0 3 +FMN sp3_sp3_51 "C5'" "O5'" P O1P 60.000 10.0 3 +FMN const_sp2_sp2_9 O4 C4 N3 C2 180.000 5.0 2 +FMN const_14 O4 C4 C4A N5 0.000 10.0 2 +FMN const_15 N1 C10 C4A C4 0.000 10.0 2 +FMN const_20 C4 C4A N5 C5A 180.000 10.0 2 +FMN const_22 C6 C5A N5 C4A 180.000 10.0 2 +FMN const_24 N5 C5A C9A C9 180.000 10.0 2 +FMN const_37 N5 C5A C6 C7 180.000 10.0 2 +FMN const_40 C5A C6 C7 C7M 180.000 10.0 2 +loop_ +_chem_comp_chir.comp_id +_chem_comp_chir.id +_chem_comp_chir.atom_id_centre +_chem_comp_chir.atom_id_1 +_chem_comp_chir.atom_id_2 +_chem_comp_chir.atom_id_3 +_chem_comp_chir.volume_sign +FMN chir_1 "C2'" "O2'" "C3'" "C1'" positive +FMN chir_2 "C3'" "O3'" "C4'" "C2'" positive +FMN chir_3 "C4'" "O4'" "C3'" "C5'" negative +FMN chir_4 P "O5'" O2P O3P both +loop_ +_chem_comp_plane_atom.comp_id +_chem_comp_plane_atom.plane_id +_chem_comp_plane_atom.atom_id +_chem_comp_plane_atom.dist_esd +FMN plan-1 "C1'" 0.020 +FMN plan-1 C10 0.020 +FMN plan-1 C2 0.020 +FMN plan-1 C4 0.020 +FMN plan-1 C4A 0.020 +FMN plan-1 C5A 0.020 +FMN plan-1 C6 0.020 +FMN plan-1 C9 0.020 +FMN plan-1 C9A 0.020 +FMN plan-1 HN3 0.020 +FMN plan-1 N1 0.020 +FMN plan-1 N10 0.020 +FMN plan-1 N3 0.020 +FMN plan-1 N5 0.020 +FMN plan-1 O2 0.020 +FMN plan-1 O4 0.020 +FMN plan-2 C5A 0.020 +FMN plan-2 C6 0.020 +FMN plan-2 C7 0.020 +FMN plan-2 C7M 0.020 +FMN plan-2 C8 0.020 +FMN plan-2 C8M 0.020 +FMN plan-2 C9 0.020 +FMN plan-2 C9A 0.020 +FMN plan-2 H6 0.020 +FMN plan-2 H9 0.020 +FMN plan-2 N10 0.020 +FMN plan-2 N5 0.020 +loop_ +_pdbx_chem_comp_descriptor.comp_id +_pdbx_chem_comp_descriptor.type +_pdbx_chem_comp_descriptor.program +_pdbx_chem_comp_descriptor.program_version +_pdbx_chem_comp_descriptor.descriptor +FMN SMILES ACDLabs 12.01 N=2C(=O)NC(=O)C3=Nc1cc(C)c(C)cc1N(C=23)CC(O)C(O)C(O)COP(=O)(O)O +FMN InChI InChI 1.03 InChI=1S/C17H21N4O9P/c1-7-3-9-10(4-8(7)2)21(15-13(18-9)16(25)20-17(26)19-15)5-11(22)14(24)12(23)6-30-31(27,28)29/h3-4,11-12,14,22-24H,5-6H2,1-2H3,(H,20,25,26)(H2,27,28,29)/t11-,12+,14-/m0/s1 +FMN InChIKey InChI 1.03 FVTCRASFADXXNN-SCRDCRAPSA-N +FMN SMILES_CANONICAL CACTVS 3.385 Cc1cc2N=C3C(=O)NC(=O)N=C3N(C[C@H](O)[C@H](O)[C@H](O)CO[P](O)(O)=O)c2cc1C +FMN SMILES CACTVS 3.385 Cc1cc2N=C3C(=O)NC(=O)N=C3N(C[CH](O)[CH](O)[CH](O)CO[P](O)(O)=O)c2cc1C +FMN SMILES_CANONICAL "OpenEye OEToolkits" 1.7.6 Cc1cc2c(cc1C)N(C3=NC(=O)NC(=O)C3=N2)C[C@@H]([C@@H]([C@@H](COP(=O)(O)O)O)O)O +FMN SMILES "OpenEye OEToolkits" 1.7.6 Cc1cc2c(cc1C)N(C3=NC(=O)NC(=O)C3=N2)CC(C(C(COP(=O)(O)O)O)O)O +loop_ +_pdbx_chem_comp_description_generator.comp_id +_pdbx_chem_comp_description_generator.program_name +_pdbx_chem_comp_description_generator.program_version +_pdbx_chem_comp_description_generator.descriptor +FMN acedrg 243 "dictionary generator" +FMN acedrg_database 11 "data source" +FMN rdkit 2017.03.2 "Chemoinformatics tool" +FMN refmac5 5.8.0238 "optimization tool" diff --git a/image_analysis/structure_refinement/monomers/G.cif b/image_analysis/structure_refinement/monomers/G.cif new file mode 100644 index 000000000..a948bdc2c --- /dev/null +++ b/image_analysis/structure_refinement/monomers/G.cif @@ -0,0 +1,276 @@ +# +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +G G "GUANOSINE-5'-MONOPHOSPHATE" RNA 36 24 . +# +data_comp_G +# +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +G OP3 O OP -1 34.040 3.415 -1.077 +G P P P 0 34.210 4.003 0.312 +G OP1 O O 0 34.487 5.494 0.290 +G OP2 O OP -1 35.203 3.231 1.161 +G "O5'" O O2 0 32.781 3.831 1.041 +G "C5'" C CH2 0 32.260 2.493 1.252 +G "C4'" C CH1 0 30.851 2.571 1.788 +G "O4'" O O2 0 30.831 3.382 2.990 +G "C3'" C CH1 0 29.808 3.223 0.875 +G "O3'" O OH1 0 29.289 2.285 -0.060 +G "C2'" C CH1 0 28.754 3.698 1.881 +G "O2'" O OH1 0 27.799 2.707 2.202 +G "C1'" C CH1 0 29.604 4.073 3.097 +G N9 N NR5 0 29.861 5.508 3.212 +G C8 C CR15 0 31.057 6.172 3.071 +G N7 N NRD5 0 30.958 7.468 3.239 +G C5 C CR56 0 29.612 7.676 3.509 +G C6 C CR6 0 28.906 8.880 3.777 +G O6 O O 0 29.357 10.033 3.827 +G N1 N NR16 0 27.544 8.645 3.999 +G C2 C CR6 0 26.939 7.407 3.968 +G N2 N NH2 0 25.620 7.371 4.205 +G N3 N NRD6 0 27.601 6.273 3.716 +G C4 C CR56 0 28.926 6.478 3.499 +G "H5'" H H 0 32.833 2.008 1.895 +G "H5''" H H 0 32.261 1.995 0.397 +G "H4'" H H 0 30.559 1.662 2.015 +G "H3'" H H 0 30.200 3.999 0.398 +G "HO3'" H H 0 28.659 2.653 -0.495 +G "H2'" H H 0 28.286 4.500 1.527 +G "HO2'" H H 0 28.188 2.026 2.527 +G "H1'" H H 0 29.136 3.771 3.909 +G H8 H H 0 31.870 5.740 2.872 +G H1 H H 0 27.031 9.361 4.176 +G H21 H H 0 25.105 6.850 3.723 +G H22 H H 0 25.277 7.868 4.840 +loop_ +_chem_comp_bond.comp_id +_chem_comp_bond.atom_id_1 +_chem_comp_bond.atom_id_2 +_chem_comp_bond.type +_chem_comp_bond.aromatic +_chem_comp_bond.value_dist_nucleus +_chem_comp_bond.value_dist_nucleus_esd +_chem_comp_bond.value_dist +_chem_comp_bond.value_dist_esd +G OP3 P SINGLE n 1.517 0.0192 1.517 0.0192 +G P OP1 DOUBLE n 1.517 0.0192 1.517 0.0192 +G P OP2 SINGLE n 1.517 0.0192 1.517 0.0192 +G P "O5'" SINGLE n 1.614 0.0178 1.614 0.0178 +G "O5'" "C5'" SINGLE n 1.450 0.0166 1.450 0.0166 +G "C5'" "C4'" SINGLE n 1.509 0.0100 1.509 0.0100 +G "C4'" "O4'" SINGLE n 1.451 0.0100 1.451 0.0100 +G "C4'" "C3'" SINGLE n 1.535 0.0100 1.535 0.0100 +G "O4'" "C1'" SINGLE n 1.409 0.0100 1.409 0.0100 +G "C3'" "O3'" SINGLE n 1.422 0.0100 1.422 0.0100 +G "C3'" "C2'" SINGLE n 1.531 0.0100 1.531 0.0100 +G "C2'" "O2'" SINGLE n 1.411 0.0100 1.411 0.0100 +G "C2'" "C1'" SINGLE n 1.525 0.0100 1.525 0.0100 +G "C1'" N9 SINGLE n 1.458 0.0100 1.458 0.0100 +G N9 C8 SINGLE y 1.372 0.0100 1.372 0.0100 +G N9 C4 SINGLE y 1.375 0.0100 1.375 0.0100 +G C8 N7 DOUBLE y 1.312 0.0100 1.312 0.0100 +G N7 C5 SINGLE y 1.390 0.0100 1.390 0.0100 +G C5 C6 SINGLE y 1.417 0.0103 1.417 0.0103 +G C5 C4 DOUBLE y 1.377 0.0100 1.377 0.0100 +G C6 O6 DOUBLE n 1.239 0.0100 1.239 0.0100 +G C6 N1 SINGLE y 1.396 0.0107 1.396 0.0107 +G N1 C2 SINGLE y 1.374 0.0100 1.374 0.0100 +G C2 N2 SINGLE n 1.340 0.0101 1.340 0.0101 +G C2 N3 DOUBLE y 1.333 0.0104 1.333 0.0104 +G N3 C4 SINGLE y 1.355 0.0100 1.355 0.0100 +G "C5'" "H5'" SINGLE n 1.089 0.0100 0.989 0.0200 +G "C5'" "H5''" SINGLE n 1.089 0.0100 0.989 0.0200 +G "C4'" "H4'" SINGLE n 1.089 0.0100 0.981 0.0200 +G "C3'" "H3'" SINGLE n 1.089 0.0100 0.992 0.0200 +G "O3'" "HO3'" SINGLE n 0.970 0.0120 0.849 0.0200 +G "C2'" "H2'" SINGLE n 1.089 0.0100 0.994 0.0200 +G "O2'" "HO2'" SINGLE n 0.970 0.0120 0.849 0.0200 +G "C1'" "H1'" SINGLE n 1.089 0.0100 0.984 0.0200 +G C8 H8 SINGLE n 1.082 0.0130 0.942 0.0170 +G N1 H1 SINGLE n 1.016 0.0100 0.897 0.0200 +G N2 H21 SINGLE n 1.016 0.0100 0.877 0.0200 +G N2 H22 SINGLE n 1.016 0.0100 0.877 0.0200 +loop_ +_chem_comp_angle.comp_id +_chem_comp_angle.atom_id_1 +_chem_comp_angle.atom_id_2 +_chem_comp_angle.atom_id_3 +_chem_comp_angle.value_angle +_chem_comp_angle.value_angle_esd +G OP3 P OP1 112.864 1.69 +G OP3 P OP2 112.864 1.69 +G OP3 P "O5'" 105.808 2.07 +G OP1 P OP2 112.864 1.69 +G OP1 P "O5'" 105.808 2.07 +G OP2 P "O5'" 105.808 2.07 +G P "O5'" "C5'" 118.783 1.50 +G "O5'" "C5'" "C4'" 109.342 1.50 +G "O5'" "C5'" "H5'" 109.845 1.50 +G "O5'" "C5'" "H5''" 109.845 1.50 +G "C4'" "C5'" "H5'" 109.624 1.50 +G "C4'" "C5'" "H5''" 109.624 1.50 +G "H5'" "C5'" "H5''" 108.472 1.50 +G "C5'" "C4'" "O4'" 109.123 1.50 +G "C5'" "C4'" "C3'" 116.008 1.52 +G "C5'" "C4'" "H4'" 108.268 1.50 +G "O4'" "C4'" "C3'" 105.388 1.50 +G "O4'" "C4'" "H4'" 108.947 1.50 +G "C3'" "C4'" "H4'" 109.363 1.86 +G "C4'" "O4'" "C1'" 109.903 1.50 +G "C4'" "C3'" "O3'" 111.281 2.46 +G "C4'" "C3'" "C2'" 102.602 1.50 +G "C4'" "C3'" "H3'" 110.452 2.54 +G "O3'" "C3'" "C2'" 111.581 2.83 +G "O3'" "C3'" "H3'" 110.380 1.67 +G "C2'" "C3'" "H3'" 110.504 1.75 +G "C3'" "O3'" "HO3'" 108.744 3.00 +G "C3'" "C2'" "O2'" 112.782 2.45 +G "C3'" "C2'" "C1'" 101.239 1.50 +G "C3'" "C2'" "H2'" 110.596 1.51 +G "O2'" "C2'" "C1'" 111.715 2.69 +G "O2'" "C2'" "H2'" 110.448 1.97 +G "C1'" "C2'" "H2'" 110.636 1.70 +G "C2'" "O2'" "HO2'" 109.103 2.13 +G "O4'" "C1'" "C2'" 106.047 1.50 +G "O4'" "C1'" N9 108.477 1.50 +G "O4'" "C1'" "H1'" 109.807 1.50 +G "C2'" "C1'" N9 113.824 1.50 +G "C2'" "C1'" "H1'" 109.015 1.50 +G N9 "C1'" "H1'" 109.561 1.50 +G "C1'" N9 C8 126.829 1.91 +G "C1'" N9 C4 127.440 1.80 +G C8 N9 C4 105.731 1.50 +G N9 C8 N7 113.507 1.50 +G N9 C8 H8 123.187 1.50 +G N7 C8 H8 123.307 1.50 +G C8 N7 C5 104.778 1.50 +G N7 C5 C6 130.030 1.50 +G N7 C5 C4 110.574 1.50 +G C6 C5 C4 119.397 1.50 +G C5 C6 O6 128.244 1.50 +G C5 C6 N1 111.367 1.50 +G O6 C6 N1 120.389 1.50 +G C6 N1 C2 125.351 1.50 +G C6 N1 H1 116.978 2.44 +G C2 N1 H1 117.677 2.71 +G N1 C2 N2 116.576 1.50 +G N1 C2 N3 123.602 1.50 +G N2 C2 N3 119.821 1.50 +G C2 N2 H21 119.868 1.50 +G C2 N2 H22 119.868 1.50 +G H21 N2 H22 120.263 1.96 +G C2 N3 C4 112.066 1.50 +G N9 C4 C5 105.411 1.50 +G N9 C4 N3 126.378 1.50 +G C5 C4 N3 128.211 1.50 +loop_ +_chem_comp_tor.comp_id +_chem_comp_tor.id +_chem_comp_tor.atom_id_1 +_chem_comp_tor.atom_id_2 +_chem_comp_tor.atom_id_3 +_chem_comp_tor.atom_id_4 +_chem_comp_tor.value_angle +_chem_comp_tor.value_angle_esd +_chem_comp_tor.period +G C2e-chi "O4'" "C1'" N9 C4 210.000 10.000 6 +G C2e-nyu0 "C4'" "O4'" "C1'" "C2'" 340.700 6.300 1 +G C2e-nyu1 "O4'" "C1'" "C2'" "C3'" 32.800 4.900 1 +G C2e-nyu2 "C1'" "C2'" "C3'" "C4'" 326.9 3.600 1 +G C2e-nyu3 "C2'" "C3'" "C4'" "O4'" 22.600 4.500 1 +G C2e-nyu4 "C3'" "C4'" "O4'" "C1'" 357.700 6.100 1 +G C3e-chi "O4'" "C1'" N9 C4 210.000 10.000 6 +G C3e-nyu0 "C4'" "O4'" "C1'" "C2'" 2.8 6.100 1 +G C3e-nyu1 "O4'" "C1'" "C2'" "C3'" 335.00 4.900 1 +G C3e-nyu2 "C1'" "C2'" "C3'" "C4'" 35.9 2.800 1 +G C3e-nyu3 "C2'" "C3'" "C4'" "O4'" 324.700 3.100 1 +G C3e-nyu4 "C3'" "C4'" "O4'" "C1'" 20.500 5.100 1 +G alpha "C5'" "O5'" P OP3 -60.000 10.00 3 +G beta P "O5'" "C5'" "C4'" 180.000 10.00 3 +G epsi "C4'" "C3'" "O3'" "HO3'" 180.000 10.00 3 +G gamma "O5'" "C5'" "C4'" "C3'" 180.000 10.00 3 +G sp3_sp3_52 "C3'" "C2'" "O2'" "HO2'" 180.000 10.00 3 +G const_18 N7 C8 N9 "C1'" 180.000 10.0 2 +G const_30 C5 C4 N9 "C1'" 180.000 10.0 2 +G const_21 N9 C8 N7 C5 0.000 10.0 2 +G const_24 C6 C5 N7 C8 180.000 10.0 2 +G const_sp2_sp2_4 N7 C5 C6 O6 0.000 5.0 2 +G const_25 N9 C4 C5 N7 0.000 10.0 2 +G const_sp2_sp2_7 O6 C6 N1 C2 180.000 5.0 2 +G const_11 N2 C2 N1 C6 180.000 10.0 2 +G sp2_sp2_1 N1 C2 N2 H21 180.000 5.0 2 +G const_14 N2 C2 N3 C4 180.000 10.0 2 +G const_16 N9 C4 N3 C2 180.000 10.0 2 +loop_ +_chem_comp_chir.comp_id +_chem_comp_chir.id +_chem_comp_chir.atom_id_centre +_chem_comp_chir.atom_id_1 +_chem_comp_chir.atom_id_2 +_chem_comp_chir.atom_id_3 +_chem_comp_chir.volume_sign +G chir_1 P "O5'" OP3 OP2 both +G chir_2 "C4'" "O4'" "C3'" "C5'" negative +G chir_3 "C3'" "O3'" "C4'" "C2'" positive +G chir_4 "C2'" "O2'" "C1'" "C3'" negative +G chir_5 "C1'" "O4'" N9 "C2'" negative +loop_ +_chem_comp_plane_atom.comp_id +_chem_comp_plane_atom.plane_id +_chem_comp_plane_atom.atom_id +_chem_comp_plane_atom.dist_esd +G plan-1 "C1'" 0.020 +G plan-1 C2 0.020 +G plan-1 C4 0.020 +G plan-1 C5 0.020 +G plan-1 C6 0.020 +G plan-1 C8 0.020 +G plan-1 H1 0.020 +G plan-1 H8 0.020 +G plan-1 N1 0.020 +G plan-1 N2 0.020 +G plan-1 N3 0.020 +G plan-1 N7 0.020 +G plan-1 N9 0.020 +G plan-1 O6 0.020 +G plan-2 C2 0.020 +G plan-2 H21 0.020 +G plan-2 H22 0.020 +G plan-2 N2 0.020 +loop_ +_pdbx_chem_comp_descriptor.comp_id +_pdbx_chem_comp_descriptor.type +_pdbx_chem_comp_descriptor.program +_pdbx_chem_comp_descriptor.program_version +_pdbx_chem_comp_descriptor.descriptor +G SMILES ACDLabs 10.04 O=C1c2ncn(c2N=C(N)N1)C3OC(C(O)C3O)COP(=O)(O)O +G SMILES_CANONICAL CACTVS 3.341 NC1=Nc2n(cnc2C(=O)N1)[C@@H]3O[C@H](CO[P](O)(O)=O)[C@@H](O)[C@H]3O +G SMILES CACTVS 3.341 NC1=Nc2n(cnc2C(=O)N1)[CH]3O[CH](CO[P](O)(O)=O)[CH](O)[CH]3O +G SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 c1nc2c(n1[C@H]3[C@@H]([C@@H]([C@H](O3)COP(=O)(O)O)O)O)N=C(NC2=O)N +G SMILES "OpenEye OEToolkits" 1.5.0 c1nc2c(n1C3C(C(C(O3)COP(=O)(O)O)O)O)N=C(NC2=O)N +G InChI InChI 1.03 InChI=1S/C10H14N5O8P/c11-10-13-7-4(8(18)14-10)12-2-15(7)9-6(17)5(16)3(23-9)1-22-24(19,20)21/h2-3,5-6,9,16-17H,1H2,(H2,19,20,21)(H3,11,13,14,18)/t3-,5-,6-,9-/m1/s1 +G InChIKey InChI 1.03 RQFCJASXJCIDSX-UUOKFMHZSA-N +loop_ +_pdbx_chem_comp_description_generator.comp_id +_pdbx_chem_comp_description_generator.program_name +_pdbx_chem_comp_description_generator.program_version +_pdbx_chem_comp_description_generator.descriptor +G acedrg 243 "dictionary generator" +G acedrg_database 11 "data source" +G rdkit 2017.03.2 "Chemoinformatics tool" +G refmac5 5.8.0238 "optimization tool" diff --git a/image_analysis/structure_refinement/monomers/GDP.cif b/image_analysis/structure_refinement/monomers/GDP.cif new file mode 100644 index 000000000..833d710c0 --- /dev/null +++ b/image_analysis/structure_refinement/monomers/GDP.cif @@ -0,0 +1,299 @@ +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +GDP GDP "GUANOSINE-5'-DIPHOSPHATE" NON-POLYMER 40 28 . + +data_comp_GDP +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +GDP PB P P 0 13.504 16.639 28.649 +GDP O1B O O 0 13.923 17.830 29.476 +GDP O2B O OP -1 14.420 15.453 28.828 +GDP O3B O OP -1 12.049 16.284 28.833 +GDP O3A O O2 0 13.659 17.092 27.107 +GDP PA P P 0 12.620 17.691 26.043 +GDP O1A O O 0 11.548 16.681 25.800 +GDP O2A O OP -1 12.214 19.058 26.485 +GDP "O5'" O O2 0 13.547 17.806 24.737 +GDP "C5'" C CH2 0 14.774 18.580 24.803 +GDP "C4'" C CH1 0 15.248 18.905 23.407 +GDP "O4'" O O2 0 15.427 17.678 22.656 +GDP "C3'" C CH1 0 14.302 19.747 22.544 +GDP "O3'" O OH1 0 14.480 21.136 22.797 +GDP "C2'" C CH1 0 14.722 19.349 21.125 +GDP "O2'" O OH1 0 15.810 20.102 20.630 +GDP "C1'" C CH1 0 15.090 17.873 21.298 +GDP N9 N NR5 0 14.017 16.952 20.924 +GDP C8 C CR15 0 13.290 16.120 21.742 +GDP N7 N NRD5 0 12.395 15.408 21.100 +GDP C5 C CR56 0 12.541 15.792 19.774 +GDP C6 C CR6 0 11.843 15.360 18.614 +GDP O6 O O 0 10.930 14.526 18.539 +GDP N1 N NR6 0 12.305 16.006 17.460 +GDP C2 C CR6 0 13.311 16.946 17.429 +GDP N2 N NH2 0 13.623 17.460 16.231 +GDP N3 N NRD6 0 13.969 17.354 18.519 +GDP C4 C CR56 0 13.538 16.739 19.651 +GDP "H5'" H H 0 15.470 18.062 25.277 +GDP "H5''" H H 0 14.616 19.420 25.301 +GDP "H4'" H H 0 16.113 19.362 23.477 +GDP "H3'" H H 0 13.359 19.490 22.706 +GDP "HO3'" H H 0 14.000 21.576 22.253 +GDP "H2'" H H 0 13.951 19.442 20.505 +GDP "HO2'" H H 0 16.487 19.998 21.132 +GDP "H1'" H H 0 15.878 17.683 20.741 +GDP H8 H H 0 13.418 16.065 22.673 +GDP HN1 H H 0 11.910 15.784 16.684 +GDP HN21 H H 0 13.778 18.320 16.152 +GDP HN22 H H 0 13.671 16.936 15.530 + +loop_ +_chem_comp_bond.comp_id +_chem_comp_bond.atom_id_1 +_chem_comp_bond.atom_id_2 +_chem_comp_bond.type +_chem_comp_bond.aromatic +_chem_comp_bond.value_dist_nucleus +_chem_comp_bond.value_dist_nucleus_esd +_chem_comp_bond.value_dist +_chem_comp_bond.value_dist_esd +GDP PB O1B DOUBLE n 1.509 0.0200 1.509 0.0200 +GDP PB O2B SINGLE n 1.509 0.0200 1.509 0.0200 +GDP PB O3B SINGLE n 1.509 0.0200 1.509 0.0200 +GDP PB O3A SINGLE n 1.614 0.0178 1.614 0.0178 +GDP O3A PA SINGLE n 1.604 0.0133 1.604 0.0133 +GDP PA O1A DOUBLE n 1.493 0.0122 1.493 0.0122 +GDP PA O2A SINGLE n 1.493 0.0122 1.493 0.0122 +GDP PA "O5'" SINGLE n 1.604 0.0133 1.604 0.0133 +GDP "O5'" "C5'" SINGLE n 1.450 0.0166 1.450 0.0166 +GDP "C5'" "C4'" SINGLE n 1.509 0.0100 1.509 0.0100 +GDP "C4'" "O4'" SINGLE n 1.451 0.0100 1.451 0.0100 +GDP "C4'" "C3'" SINGLE n 1.535 0.0100 1.535 0.0100 +GDP "O4'" "C1'" SINGLE n 1.409 0.0100 1.409 0.0100 +GDP "C3'" "O3'" SINGLE n 1.422 0.0100 1.422 0.0100 +GDP "C3'" "C2'" SINGLE n 1.531 0.0100 1.531 0.0100 +GDP "C2'" "O2'" SINGLE n 1.411 0.0100 1.411 0.0100 +GDP "C2'" "C1'" SINGLE n 1.525 0.0100 1.525 0.0100 +GDP "C1'" N9 SINGLE n 1.458 0.0100 1.458 0.0100 +GDP N9 C8 SINGLE y 1.372 0.0100 1.372 0.0100 +GDP N9 C4 SINGLE y 1.375 0.0100 1.375 0.0100 +GDP C8 N7 DOUBLE y 1.312 0.0100 1.312 0.0100 +GDP N7 C5 SINGLE y 1.390 0.0100 1.390 0.0100 +GDP C5 C6 SINGLE y 1.417 0.0103 1.417 0.0103 +GDP C5 C4 DOUBLE y 1.377 0.0100 1.377 0.0100 +GDP C6 O6 DOUBLE n 1.239 0.0100 1.239 0.0100 +GDP C6 N1 SINGLE y 1.396 0.0107 1.396 0.0107 +GDP N1 C2 SINGLE y 1.374 0.0100 1.374 0.0100 +GDP C2 N2 SINGLE n 1.340 0.0101 1.340 0.0101 +GDP C2 N3 DOUBLE y 1.333 0.0104 1.333 0.0104 +GDP N3 C4 SINGLE y 1.355 0.0100 1.355 0.0100 +GDP "C5'" "H5'" SINGLE n 1.089 0.0100 0.989 0.0200 +GDP "C5'" "H5''" SINGLE n 1.089 0.0100 0.989 0.0200 +GDP "C4'" "H4'" SINGLE n 1.089 0.0100 0.981 0.0200 +GDP "C3'" "H3'" SINGLE n 1.089 0.0100 0.992 0.0200 +GDP "O3'" "HO3'" SINGLE n 0.970 0.0120 0.849 0.0200 +GDP "C2'" "H2'" SINGLE n 1.089 0.0100 0.994 0.0200 +GDP "O2'" "HO2'" SINGLE n 0.970 0.0120 0.849 0.0200 +GDP "C1'" "H1'" SINGLE n 1.089 0.0100 0.984 0.0200 +GDP C8 H8 SINGLE n 1.082 0.0130 0.942 0.0170 +GDP N1 HN1 SINGLE n 1.016 0.0100 0.897 0.0200 +GDP N2 HN21 SINGLE n 1.016 0.0100 0.877 0.0200 +GDP N2 HN22 SINGLE n 1.016 0.0100 0.877 0.0200 + +loop_ +_chem_comp_angle.comp_id +_chem_comp_angle.atom_id_1 +_chem_comp_angle.atom_id_2 +_chem_comp_angle.atom_id_3 +_chem_comp_angle.value_angle +_chem_comp_angle.value_angle_esd +GDP O1B PB O2B 112.716 1.50 +GDP O1B PB O3B 112.716 1.50 +GDP O1B PB O3A 105.965 2.38 +GDP O2B PB O3B 112.716 1.50 +GDP O2B PB O3A 105.965 2.38 +GDP O3B PB O3A 105.965 2.38 +GDP PB O3A PA 132.584 3.00 +GDP O3A PA O1A 108.816 2.14 +GDP O3A PA O2A 108.816 2.14 +GDP O3A PA "O5'" 101.065 1.97 +GDP O1A PA O2A 118.411 2.35 +GDP O1A PA "O5'" 109.410 1.50 +GDP O2A PA "O5'" 109.410 1.50 +GDP PA "O5'" "C5'" 118.553 2.41 +GDP "O5'" "C5'" "C4'" 109.342 1.50 +GDP "O5'" "C5'" "H5'" 109.845 1.50 +GDP "O5'" "C5'" "H5''" 109.845 1.50 +GDP "C4'" "C5'" "H5'" 109.624 1.50 +GDP "C4'" "C5'" "H5''" 109.624 1.50 +GDP "H5'" "C5'" "H5''" 108.472 1.50 +GDP "C5'" "C4'" "O4'" 109.123 1.50 +GDP "C5'" "C4'" "C3'" 116.008 1.52 +GDP "C5'" "C4'" "H4'" 108.268 1.50 +GDP "O4'" "C4'" "C3'" 105.388 1.50 +GDP "O4'" "C4'" "H4'" 108.947 1.50 +GDP "C3'" "C4'" "H4'" 109.363 1.86 +GDP "C4'" "O4'" "C1'" 109.903 1.50 +GDP "C4'" "C3'" "O3'" 111.281 2.46 +GDP "C4'" "C3'" "C2'" 102.602 1.50 +GDP "C4'" "C3'" "H3'" 110.452 2.54 +GDP "O3'" "C3'" "C2'" 111.581 2.83 +GDP "O3'" "C3'" "H3'" 110.380 1.67 +GDP "C2'" "C3'" "H3'" 110.504 1.75 +GDP "C3'" "O3'" "HO3'" 108.744 3.00 +GDP "C3'" "C2'" "O2'" 112.782 2.45 +GDP "C3'" "C2'" "C1'" 101.239 1.50 +GDP "C3'" "C2'" "H2'" 110.596 1.51 +GDP "O2'" "C2'" "C1'" 111.715 2.69 +GDP "O2'" "C2'" "H2'" 110.448 1.97 +GDP "C1'" "C2'" "H2'" 110.636 1.70 +GDP "C2'" "O2'" "HO2'" 109.103 2.13 +GDP "O4'" "C1'" "C2'" 106.047 1.50 +GDP "O4'" "C1'" N9 108.477 1.50 +GDP "O4'" "C1'" "H1'" 109.807 1.50 +GDP "C2'" "C1'" N9 113.824 1.50 +GDP "C2'" "C1'" "H1'" 109.015 1.50 +GDP N9 "C1'" "H1'" 109.561 1.50 +GDP "C1'" N9 C8 126.829 1.91 +GDP "C1'" N9 C4 127.440 1.80 +GDP C8 N9 C4 105.731 1.50 +GDP N9 C8 N7 113.507 1.50 +GDP N9 C8 H8 123.187 1.50 +GDP N7 C8 H8 123.307 1.50 +GDP C8 N7 C5 104.778 1.50 +GDP N7 C5 C6 130.030 1.50 +GDP N7 C5 C4 110.574 1.50 +GDP C6 C5 C4 119.397 1.50 +GDP C5 C6 O6 128.244 1.50 +GDP C5 C6 N1 111.367 1.50 +GDP O6 C6 N1 120.389 1.50 +GDP C6 N1 C2 125.351 1.50 +GDP C6 N1 HN1 116.978 2.44 +GDP C2 N1 HN1 117.677 2.71 +GDP N1 C2 N2 116.576 1.50 +GDP N1 C2 N3 123.602 1.50 +GDP N2 C2 N3 119.821 1.50 +GDP C2 N2 HN21 119.868 1.50 +GDP C2 N2 HN22 119.868 1.50 +GDP HN21 N2 HN22 120.263 1.96 +GDP C2 N3 C4 112.066 1.50 +GDP N9 C4 C5 105.411 1.50 +GDP N9 C4 N3 126.378 1.50 +GDP C5 C4 N3 128.211 1.50 + +loop_ +_chem_comp_tor.comp_id +_chem_comp_tor.id +_chem_comp_tor.atom_id_1 +_chem_comp_tor.atom_id_2 +_chem_comp_tor.atom_id_3 +_chem_comp_tor.atom_id_4 +_chem_comp_tor.value_angle +_chem_comp_tor.value_angle_esd +_chem_comp_tor.period +GDP C2e-chi "O4'" "C1'" N9 C4 210.000 10.000 6 +GDP C2e-nyu0 "C4'" "O4'" "C1'" "C2'" 340.700 6.300 1 +GDP C2e-nyu1 "O4'" "C1'" "C2'" "C3'" 32.800 4.900 1 +GDP C2e-nyu2 "C1'" "C2'" "C3'" "C4'" 326.9 3.600 1 +GDP C2e-nyu3 "C2'" "C3'" "C4'" "O4'" 22.600 4.500 1 +GDP C2e-nyu4 "C3'" "C4'" "O4'" "C1'" 357.700 6.100 1 +GDP C3e-chi "O4'" "C1'" N9 C4 210.000 10.000 6 +GDP C3e-nyu0 "C4'" "O4'" "C1'" "C2'" 2.8 6.100 1 +GDP C3e-nyu1 "O4'" "C1'" "C2'" "C3'" 335.00 4.900 1 +GDP C3e-nyu2 "C1'" "C2'" "C3'" "C4'" 35.9 2.800 1 +GDP C3e-nyu3 "C2'" "C3'" "C4'" "O4'" 324.700 3.100 1 +GDP C3e-nyu4 "C3'" "C4'" "O4'" "C1'" 20.500 5.100 1 +GDP epsi "C4'" "C3'" "O3'" "HO3'" 180.000 10.00 3 +GDP gamma "O5'" "C5'" "C4'" "C3'" 180.000 10.00 3 +GDP sp3_sp3_52 "C3'" "C2'" "O2'" "HO2'" 180.000 10.00 3 +GDP sp3_sp3_27 PA O3A PB O1B 60.000 10.0 3 +GDP const_18 N7 C8 N9 "C1'" 180.000 10.0 2 +GDP const_30 C5 C4 N9 "C1'" 180.000 10.0 2 +GDP const_21 N9 C8 N7 C5 0.000 10.0 2 +GDP const_24 C6 C5 N7 C8 180.000 10.0 2 +GDP const_sp2_sp2_4 N7 C5 C6 O6 0.000 5.0 2 +GDP const_25 N9 C4 C5 N7 0.000 10.0 2 +GDP const_sp2_sp2_7 O6 C6 N1 C2 180.000 5.0 2 +GDP const_11 N2 C2 N1 C6 180.000 10.0 2 +GDP sp2_sp2_1 N1 C2 N2 HN21 180.000 5.0 2 +GDP const_14 N2 C2 N3 C4 180.000 10.0 2 +GDP const_16 N9 C4 N3 C2 180.000 10.0 2 +GDP sp3_sp3_30 PB O3A PA O1A 60.000 10.0 3 +GDP sp3_sp3_31 "C5'" "O5'" PA O3A 180.000 10.0 3 +GDP sp3_sp3_34 "C4'" "C5'" "O5'" PA 180.000 10.0 3 + +loop_ +_chem_comp_chir.comp_id +_chem_comp_chir.id +_chem_comp_chir.atom_id_centre +_chem_comp_chir.atom_id_1 +_chem_comp_chir.atom_id_2 +_chem_comp_chir.atom_id_3 +_chem_comp_chir.volume_sign +GDP chir_1 PB O3A O2B O3B both +GDP chir_2 PA O3A "O5'" O2A both +GDP chir_3 "C4'" "O4'" "C3'" "C5'" negative +GDP chir_4 "C3'" "O3'" "C4'" "C2'" positive +GDP chir_5 "C2'" "O2'" "C1'" "C3'" negative +GDP chir_6 "C1'" "O4'" N9 "C2'" negative + +loop_ +_chem_comp_plane_atom.comp_id +_chem_comp_plane_atom.plane_id +_chem_comp_plane_atom.atom_id +_chem_comp_plane_atom.dist_esd +GDP plan-1 "C1'" 0.020 +GDP plan-1 C2 0.020 +GDP plan-1 C4 0.020 +GDP plan-1 C5 0.020 +GDP plan-1 C6 0.020 +GDP plan-1 C8 0.020 +GDP plan-1 H8 0.020 +GDP plan-1 HN1 0.020 +GDP plan-1 N1 0.020 +GDP plan-1 N2 0.020 +GDP plan-1 N3 0.020 +GDP plan-1 N7 0.020 +GDP plan-1 N9 0.020 +GDP plan-1 O6 0.020 +GDP plan-2 C2 0.020 +GDP plan-2 HN21 0.020 +GDP plan-2 HN22 0.020 +GDP plan-2 N2 0.020 + +loop_ +_pdbx_chem_comp_descriptor.comp_id +_pdbx_chem_comp_descriptor.type +_pdbx_chem_comp_descriptor.program +_pdbx_chem_comp_descriptor.program_version +_pdbx_chem_comp_descriptor.descriptor +GDP SMILES ACDLabs 12.01 O=P(O)(O)OP(=O)(O)OCC3OC(n2cnc1c2N=C(N)NC1=O)C(O)C3O +GDP InChI InChI 1.03 InChI=1S/C10H15N5O11P2/c11-10-13-7-4(8(18)14-10)12-2-15(7)9-6(17)5(16)3(25-9)1-24-28(22,23)26-27(19,20)21/h2-3,5-6,9,16-17H,1H2,(H,22,23)(H2,19,20,21)(H3,11,13,14,18)/t3-,5-,6-,9-/m1/s1 +GDP InChIKey InChI 1.03 QGWNDRXFNXRZMB-UUOKFMHZSA-N +GDP SMILES_CANONICAL CACTVS 3.385 NC1=Nc2n(cnc2C(=O)N1)[C@@H]3O[C@H](CO[P](O)(=O)O[P](O)(O)=O)[C@@H](O)[C@H]3O +GDP SMILES CACTVS 3.385 NC1=Nc2n(cnc2C(=O)N1)[CH]3O[CH](CO[P](O)(=O)O[P](O)(O)=O)[CH](O)[CH]3O +GDP SMILES_CANONICAL "OpenEye OEToolkits" 1.7.6 c1nc2c(n1[C@H]3[C@@H]([C@@H]([C@H](O3)CO[P@](=O)(O)OP(=O)(O)O)O)O)N=C(NC2=O)N +GDP SMILES "OpenEye OEToolkits" 1.7.6 c1nc2c(n1C3C(C(C(O3)COP(=O)(O)OP(=O)(O)O)O)O)N=C(NC2=O)N + +loop_ +_pdbx_chem_comp_description_generator.comp_id +_pdbx_chem_comp_description_generator.program_name +_pdbx_chem_comp_description_generator.program_version +_pdbx_chem_comp_description_generator.descriptor +GDP acedrg 243 "dictionary generator" +GDP acedrg_database 11 "data source" +GDP rdkit 2017.03.2 "Chemoinformatics tool" +GDP refmac5 5.8.0238 "optimization tool" diff --git a/image_analysis/structure_refinement/monomers/GLN.cif b/image_analysis/structure_refinement/monomers/GLN.cif new file mode 100644 index 000000000..ab85e9d2d --- /dev/null +++ b/image_analysis/structure_refinement/monomers/GLN.cif @@ -0,0 +1,233 @@ +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +GLN GLN GLUTAMINE peptide 20 10 . + +data_comp_GLN +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +GLN N N NT3 1 -13.189 34.859 120.921 +GLN CA C CH1 0 -12.155 35.335 119.962 +GLN C C C 0 -10.823 35.547 120.705 +GLN O O O 0 -9.774 35.259 120.087 +GLN CB C CH2 0 -12.610 36.599 119.226 +GLN CG C CH2 0 -12.991 37.771 120.127 +GLN CD C C 0 -13.453 38.985 119.351 +GLN OE1 O O 0 -14.437 38.935 118.605 +GLN NE2 N NH2 0 -12.747 40.094 119.519 +GLN OXT O OC -1 -10.882 35.991 121.873 +GLN H H H 0 -14.005 34.886 120.536 +GLN H2 H H 0 -13.202 35.368 121.666 +GLN H3 H H 0 -13.012 34.007 121.158 +GLN HA H H 0 -12.019 34.624 119.285 +GLN HB3 H H 0 -13.381 36.370 118.666 +GLN HB2 H H 0 -11.887 36.885 118.629 +GLN HG3 H H 0 -12.221 38.023 120.680 +GLN HG2 H H 0 -13.713 37.495 120.731 +GLN HE21 H H 0 -11.862 40.066 119.472 +GLN HE22 H H 0 -13.160 40.862 119.679 + +loop_ +_chem_comp_tree.comp_id +_chem_comp_tree.atom_id +_chem_comp_tree.atom_back +_chem_comp_tree.atom_forward +_chem_comp_tree.connect_type +GLN N n/a CA START +GLN H N . . +GLN H2 N . . +GLN H3 N . . +GLN CA N C . +GLN HA CA . . +GLN CB CA CG . +GLN HB3 CB . . +GLN HB2 CB . . +GLN CG CB CD . +GLN HG3 CG . . +GLN HG2 CG . . +GLN CD CG NE2 . +GLN OE1 CD . . +GLN NE2 CD HE22 . +GLN HE21 NE2 . . +GLN HE22 NE2 . . +GLN C CA . END +GLN O C . . +GLN OXT C . . + +loop_ +_chem_comp_acedrg.comp_id +_chem_comp_acedrg.atom_id +_chem_comp_acedrg.atom_type +GLN N N(CCCH)(H)3 +GLN CA C(CCHH)(NH3)(COO)(H) +GLN C C(CCHN)(O)2 +GLN O O(CCO) +GLN CB C(CCHH)(CCHN)(H)2 +GLN CG C(CCHH)(CNO)(H)2 +GLN CD C(CCHH)(NHH)(O) +GLN OE1 O(CCN) +GLN NE2 N(CCO)(H)2 +GLN OXT O(CCO) +GLN H H(NCHH) +GLN H2 H(NCHH) +GLN H3 H(NCHH) +GLN HA H(CCCN) +GLN HB3 H(CCCH) +GLN HB2 H(CCCH) +GLN HG3 H(CCCH) +GLN HG2 H(CCCH) +GLN HE21 H(NCH) +GLN HE22 H(NCH) + +loop_ +_chem_comp_bond.comp_id +_chem_comp_bond.atom_id_1 +_chem_comp_bond.atom_id_2 +_chem_comp_bond.type +_chem_comp_bond.aromatic +_chem_comp_bond.value_dist_nucleus +_chem_comp_bond.value_dist_nucleus_esd +_chem_comp_bond.value_dist +_chem_comp_bond.value_dist_esd +GLN N CA SINGLE n 1.487 0.0100 1.487 0.0100 +GLN CA C SINGLE n 1.538 0.0113 1.538 0.0113 +GLN CA CB SINGLE n 1.529 0.0100 1.529 0.0100 +GLN C O DOUBLE n 1.251 0.0183 1.251 0.0183 +GLN C OXT SINGLE n 1.251 0.0183 1.251 0.0183 +GLN CB CG SINGLE n 1.525 0.0100 1.525 0.0100 +GLN CG CD SINGLE n 1.513 0.0100 1.513 0.0100 +GLN CD OE1 DOUBLE n 1.236 0.0100 1.236 0.0100 +GLN CD NE2 SINGLE n 1.325 0.0100 1.325 0.0100 +GLN N H SINGLE n 1.018 0.0520 0.902 0.0102 +GLN N H2 SINGLE n 1.018 0.0520 0.902 0.0102 +GLN N H3 SINGLE n 1.018 0.0520 0.902 0.0102 +GLN CA HA SINGLE n 1.092 0.0100 0.991 0.0200 +GLN CB HB3 SINGLE n 1.092 0.0100 0.980 0.0168 +GLN CB HB2 SINGLE n 1.092 0.0100 0.980 0.0168 +GLN CG HG3 SINGLE n 1.092 0.0100 0.981 0.0172 +GLN CG HG2 SINGLE n 1.092 0.0100 0.981 0.0172 +GLN NE2 HE21 SINGLE n 1.013 0.0120 0.887 0.0200 +GLN NE2 HE22 SINGLE n 1.013 0.0120 0.887 0.0200 + +loop_ +_chem_comp_angle.comp_id +_chem_comp_angle.atom_id_1 +_chem_comp_angle.atom_id_2 +_chem_comp_angle.atom_id_3 +_chem_comp_angle.value_angle +_chem_comp_angle.value_angle_esd +GLN CA N H 109.990 3.00 +GLN CA N H2 109.990 3.00 +GLN CA N H3 109.990 3.00 +GLN H N H2 109.032 3.00 +GLN H N H3 109.032 3.00 +GLN H2 N H3 109.032 3.00 +GLN N CA C 109.258 1.50 +GLN N CA CB 110.440 2.46 +GLN N CA HA 108.387 1.58 +GLN C CA CB 111.059 3.00 +GLN C CA HA 108.774 1.79 +GLN CB CA HA 109.080 2.33 +GLN CA C O 117.148 1.60 +GLN CA C OXT 117.148 1.60 +GLN O C OXT 125.704 1.50 +GLN CA CB CG 113.998 1.50 +GLN CA CB HB3 108.677 1.74 +GLN CA CB HB2 108.677 1.74 +GLN CG CB HB3 108.907 1.50 +GLN CG CB HB2 108.907 1.50 +GLN HB3 CB HB2 107.655 1.50 +GLN CB CG CD 113.265 1.50 +GLN CB CG HG3 109.355 1.50 +GLN CB CG HG2 109.355 1.50 +GLN CD CG HG3 108.958 1.89 +GLN CD CG HG2 108.958 1.89 +GLN HG3 CG HG2 107.827 1.56 +GLN CG CD OE1 121.487 1.50 +GLN CG CD NE2 116.074 1.76 +GLN OE1 CD NE2 122.439 1.50 +GLN CD NE2 HE21 119.917 2.87 +GLN CD NE2 HE22 119.917 2.87 +GLN HE21 NE2 HE22 120.165 3.00 + +loop_ +_chem_comp_tor.comp_id +_chem_comp_tor.id +_chem_comp_tor.atom_id_1 +_chem_comp_tor.atom_id_2 +_chem_comp_tor.atom_id_3 +_chem_comp_tor.atom_id_4 +_chem_comp_tor.value_angle +_chem_comp_tor.value_angle_esd +_chem_comp_tor.period +GLN chi1 N CA CB CG -60.000 10.0 3 +GLN chi2 CA CB CG CD 180.000 10.0 3 +GLN chi3 CB CG CD NE2 180.000 10.0 6 +GLN hh1 CG CD NE2 HE22 180.000 5.0 2 +GLN sp3_sp3_1 C CA N H 180.000 10.0 3 +GLN sp2_sp3_1 O C CA N 0.000 10.0 6 + +loop_ +_chem_comp_chir.comp_id +_chem_comp_chir.id +_chem_comp_chir.atom_id_centre +_chem_comp_chir.atom_id_1 +_chem_comp_chir.atom_id_2 +_chem_comp_chir.atom_id_3 +_chem_comp_chir.volume_sign +GLN chir_1 CA N C CB positive + +loop_ +_chem_comp_plane_atom.comp_id +_chem_comp_plane_atom.plane_id +_chem_comp_plane_atom.atom_id +_chem_comp_plane_atom.dist_esd +GLN plan-1 C 0.020 +GLN plan-1 CA 0.020 +GLN plan-1 O 0.020 +GLN plan-1 OXT 0.020 +GLN plan-2 CD 0.020 +GLN plan-2 CG 0.020 +GLN plan-2 NE2 0.020 +GLN plan-2 OE1 0.020 +GLN plan-3 CD 0.020 +GLN plan-3 HE21 0.020 +GLN plan-3 HE22 0.020 +GLN plan-3 NE2 0.020 + +loop_ +_pdbx_chem_comp_descriptor.comp_id +_pdbx_chem_comp_descriptor.type +_pdbx_chem_comp_descriptor.program +_pdbx_chem_comp_descriptor.program_version +_pdbx_chem_comp_descriptor.descriptor +GLN SMILES ACDLabs 10.04 O=C(N)CCC(N)C(=O)O +GLN SMILES_CANONICAL CACTVS 3.341 N[C@@H](CCC(N)=O)C(O)=O +GLN SMILES CACTVS 3.341 N[CH](CCC(N)=O)C(O)=O +GLN SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 C(CC(=O)N)[C@@H](C(=O)O)N +GLN SMILES "OpenEye OEToolkits" 1.5.0 C(CC(=O)N)C(C(=O)O)N +GLN InChI InChI 1.03 InChI=1S/C5H10N2O3/c6-3(5(9)10)1-2-4(7)8/h3H,1-2,6H2,(H2,7,8)(H,9,10)/t3-/m0/s1 +GLN InChIKey InChI 1.03 ZDXPYRJPNDTMRX-VKHMYHEASA-N + +loop_ +_pdbx_chem_comp_description_generator.comp_id +_pdbx_chem_comp_description_generator.program_name +_pdbx_chem_comp_description_generator.program_version +_pdbx_chem_comp_description_generator.descriptor +GLN acedrg 278 "dictionary generator" +GLN acedrg_database 12 "data source" +GLN rdkit 2019.09.1 "Chemoinformatics tool" +GLN refmac5 5.8.0419 "optimization tool" diff --git a/image_analysis/structure_refinement/monomers/GLU.cif b/image_analysis/structure_refinement/monomers/GLU.cif new file mode 100644 index 000000000..1eefa693b --- /dev/null +++ b/image_analysis/structure_refinement/monomers/GLU.cif @@ -0,0 +1,217 @@ +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +GLU GLU "GLUTAMIC ACID" peptide 18 10 . + +data_comp_GLU +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +GLU N N NT3 1 88.319 -7.751 -10.089 +GLU CA C CH1 0 87.677 -7.162 -11.296 +GLU C C C 0 88.359 -5.826 -11.640 +GLU O O O 0 88.389 -4.954 -10.744 +GLU CB C CH2 0 86.177 -6.950 -11.080 +GLU CG C CH2 0 85.390 -8.247 -10.908 +GLU CD C C 0 83.891 -8.048 -10.773 +GLU OE1 O O 0 83.281 -7.495 -11.711 +GLU OE2 O OC -1 83.334 -8.447 -9.728 +GLU OXT O OC -1 88.836 -5.708 -12.790 +GLU H H H 0 88.066 -7.298 -9.352 +GLU H2 H H 0 89.218 -7.717 -10.158 +GLU H3 H H 0 88.077 -8.615 -9.999 +GLU HA H H 0 87.806 -7.788 -12.054 +GLU HB3 H H 0 85.814 -6.460 -11.847 +GLU HB2 H H 0 86.049 -6.394 -10.284 +GLU HG3 H H 0 85.714 -8.714 -10.110 +GLU HG2 H H 0 85.559 -8.827 -11.681 + +loop_ +_chem_comp_tree.comp_id +_chem_comp_tree.atom_id +_chem_comp_tree.atom_back +_chem_comp_tree.atom_forward +_chem_comp_tree.connect_type +GLU N n/a CA START +GLU H N . . +GLU H2 N . . +GLU H3 N . . +GLU CA N C . +GLU HA CA . . +GLU CB CA CG . +GLU HB3 CB . . +GLU HB2 CB . . +GLU CG CB CD . +GLU HG3 CG . . +GLU HG2 CG . . +GLU CD CG OE2 . +GLU OE1 CD . . +GLU OE2 CD . . +GLU C CA . END +GLU O C . . +GLU OXT C . . + +loop_ +_chem_comp_acedrg.comp_id +_chem_comp_acedrg.atom_id +_chem_comp_acedrg.atom_type +GLU N N(CCCH)(H)3 +GLU CA C(CCHH)(NH3)(COO)(H) +GLU C C(CCHN)(O)2 +GLU O O(CCO) +GLU CB C(CCHH)(CCHN)(H)2 +GLU CG C(CCHH)(COO)(H)2 +GLU CD C(CCHH)(O)2 +GLU OE1 O(CCO) +GLU OE2 O(CCO) +GLU OXT O(CCO) +GLU H H(NCHH) +GLU H2 H(NCHH) +GLU H3 H(NCHH) +GLU HA H(CCCN) +GLU HB3 H(CCCH) +GLU HB2 H(CCCH) +GLU HG3 H(CCCH) +GLU HG2 H(CCCH) + +loop_ +_chem_comp_bond.comp_id +_chem_comp_bond.atom_id_1 +_chem_comp_bond.atom_id_2 +_chem_comp_bond.type +_chem_comp_bond.aromatic +_chem_comp_bond.value_dist_nucleus +_chem_comp_bond.value_dist_nucleus_esd +_chem_comp_bond.value_dist +_chem_comp_bond.value_dist_esd +GLU N CA SINGLE n 1.487 0.0100 1.487 0.0100 +GLU CA C SINGLE n 1.538 0.0113 1.538 0.0113 +GLU CA CB SINGLE n 1.529 0.0100 1.529 0.0100 +GLU C O DOUBLE n 1.251 0.0183 1.251 0.0183 +GLU C OXT SINGLE n 1.251 0.0183 1.251 0.0183 +GLU CB CG SINGLE n 1.526 0.0100 1.526 0.0100 +GLU CG CD SINGLE n 1.518 0.0135 1.518 0.0135 +GLU CD OE1 DOUBLE n 1.249 0.0161 1.249 0.0161 +GLU CD OE2 SINGLE n 1.249 0.0161 1.249 0.0161 +GLU N H SINGLE n 1.018 0.0520 0.902 0.0102 +GLU N H2 SINGLE n 1.018 0.0520 0.902 0.0102 +GLU N H3 SINGLE n 1.018 0.0520 0.902 0.0102 +GLU CA HA SINGLE n 1.092 0.0100 0.991 0.0200 +GLU CB HB3 SINGLE n 1.092 0.0100 0.980 0.0168 +GLU CB HB2 SINGLE n 1.092 0.0100 0.980 0.0168 +GLU CG HG3 SINGLE n 1.092 0.0100 0.981 0.0172 +GLU CG HG2 SINGLE n 1.092 0.0100 0.981 0.0172 + +loop_ +_chem_comp_angle.comp_id +_chem_comp_angle.atom_id_1 +_chem_comp_angle.atom_id_2 +_chem_comp_angle.atom_id_3 +_chem_comp_angle.value_angle +_chem_comp_angle.value_angle_esd +GLU CA N H 109.990 3.00 +GLU CA N H2 109.990 3.00 +GLU CA N H3 109.990 3.00 +GLU H N H2 109.032 3.00 +GLU H N H3 109.032 3.00 +GLU H2 N H3 109.032 3.00 +GLU N CA C 109.258 1.50 +GLU N CA CB 110.440 2.46 +GLU N CA HA 108.387 1.58 +GLU C CA CB 111.059 3.00 +GLU C CA HA 108.774 1.79 +GLU CB CA HA 109.080 2.33 +GLU CA C O 117.148 1.60 +GLU CA C OXT 117.148 1.60 +GLU O C OXT 125.704 1.50 +GLU CA CB CG 113.294 1.61 +GLU CA CB HB3 108.677 1.74 +GLU CA CB HB2 108.677 1.74 +GLU CG CB HB3 108.696 2.80 +GLU CG CB HB2 108.696 2.80 +GLU HB3 CB HB2 107.655 1.50 +GLU CB CG CD 114.140 3.00 +GLU CB CG HG3 108.968 1.50 +GLU CB CG HG2 108.968 1.50 +GLU CD CG HG3 108.472 1.50 +GLU CD CG HG2 108.472 1.50 +GLU HG3 CG HG2 107.541 1.92 +GLU CG CD OE1 118.251 3.00 +GLU CG CD OE2 118.251 3.00 +GLU OE1 CD OE2 123.498 1.82 + +loop_ +_chem_comp_tor.comp_id +_chem_comp_tor.id +_chem_comp_tor.atom_id_1 +_chem_comp_tor.atom_id_2 +_chem_comp_tor.atom_id_3 +_chem_comp_tor.atom_id_4 +_chem_comp_tor.value_angle +_chem_comp_tor.value_angle_esd +_chem_comp_tor.period +GLU chi1 N CA CB CG -60.000 10.0 3 +GLU chi2 CA CB CG CD 180.000 10.0 3 +GLU chi3 CB CG CD OE1 180.000 10.0 6 +GLU sp3_sp3_1 C CA N H 180.000 10.0 3 +GLU sp2_sp3_1 O C CA N 0.000 10.0 6 + +loop_ +_chem_comp_chir.comp_id +_chem_comp_chir.id +_chem_comp_chir.atom_id_centre +_chem_comp_chir.atom_id_1 +_chem_comp_chir.atom_id_2 +_chem_comp_chir.atom_id_3 +_chem_comp_chir.volume_sign +GLU chir_1 CA N C CB positive + +loop_ +_chem_comp_plane_atom.comp_id +_chem_comp_plane_atom.plane_id +_chem_comp_plane_atom.atom_id +_chem_comp_plane_atom.dist_esd +GLU plan-1 C 0.020 +GLU plan-1 CA 0.020 +GLU plan-1 O 0.020 +GLU plan-1 OXT 0.020 +GLU plan-2 CD 0.020 +GLU plan-2 CG 0.020 +GLU plan-2 OE1 0.020 +GLU plan-2 OE2 0.020 + +loop_ +_pdbx_chem_comp_descriptor.comp_id +_pdbx_chem_comp_descriptor.type +_pdbx_chem_comp_descriptor.program +_pdbx_chem_comp_descriptor.program_version +_pdbx_chem_comp_descriptor.descriptor +GLU SMILES ACDLabs 12.01 O=C(O)C(N)CCC(=O)O +GLU SMILES_CANONICAL CACTVS 3.370 N[C@@H](CCC(O)=O)C(O)=O +GLU SMILES CACTVS 3.370 N[CH](CCC(O)=O)C(O)=O +GLU SMILES_CANONICAL "OpenEye OEToolkits" 1.7.0 C(CC(=O)O)[C@@H](C(=O)O)N +GLU SMILES "OpenEye OEToolkits" 1.7.0 C(CC(=O)O)C(C(=O)O)N +GLU InChI InChI 1.03 InChI=1S/C5H9NO4/c6-3(5(9)10)1-2-4(7)8/h3H,1-2,6H2,(H,7,8)(H,9,10)/t3-/m0/s1 +GLU InChIKey InChI 1.03 WHUUTDBJXJRKMK-VKHMYHEASA-N + +loop_ +_pdbx_chem_comp_description_generator.comp_id +_pdbx_chem_comp_description_generator.program_name +_pdbx_chem_comp_description_generator.program_version +_pdbx_chem_comp_description_generator.descriptor +GLU acedrg 278 "dictionary generator" +GLU acedrg_database 12 "data source" +GLU rdkit 2019.09.1 "Chemoinformatics tool" +GLU refmac5 5.8.0419 "optimization tool" diff --git a/image_analysis/structure_refinement/monomers/GLY.cif b/image_analysis/structure_refinement/monomers/GLY.cif new file mode 100644 index 000000000..1eab291b6 --- /dev/null +++ b/image_analysis/structure_refinement/monomers/GLY.cif @@ -0,0 +1,153 @@ +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +GLY GLY GLYCINE peptide 10 5 . + +data_comp_GLY +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +GLY N N NT3 1 25.320 35.545 47.014 +GLY CA C CH2 0 25.532 37.001 46.897 +GLY C C C 0 26.039 37.376 45.517 +GLY O O O 0 27.114 36.860 45.146 +GLY OXT O OC -1 25.343 38.172 44.853 +GLY H H H 0 26.098 35.105 46.869 +GLY H2 H H 0 24.710 35.270 46.405 +GLY H3 H H 0 25.019 35.342 47.843 +GLY HA3 H H 0 26.185 37.288 47.578 +GLY HA2 H H 0 24.682 37.467 47.075 + +loop_ +_chem_comp_tree.comp_id +_chem_comp_tree.atom_id +_chem_comp_tree.atom_back +_chem_comp_tree.atom_forward +_chem_comp_tree.connect_type +GLY N n/a CA START +GLY H N . . +GLY H2 N . . +GLY H3 N . . +GLY CA N C . +GLY HA3 CA . . +GLY HA2 CA . . +GLY C CA . END +GLY O C . . +GLY OXT C . . + +loop_ +_chem_comp_acedrg.comp_id +_chem_comp_acedrg.atom_id +_chem_comp_acedrg.atom_type +GLY N N(CCHH)(H)3 +GLY CA C(NH3)(COO)(H)2 +GLY C C(CHHN)(O)2 +GLY O O(CCO) +GLY OXT O(CCO) +GLY H H(NCHH) +GLY H2 H(NCHH) +GLY H3 H(NCHH) +GLY HA3 H(CCHN) +GLY HA2 H(CCHN) + +loop_ +_chem_comp_bond.comp_id +_chem_comp_bond.atom_id_1 +_chem_comp_bond.atom_id_2 +_chem_comp_bond.type +_chem_comp_bond.aromatic +_chem_comp_bond.value_dist_nucleus +_chem_comp_bond.value_dist_nucleus_esd +_chem_comp_bond.value_dist +_chem_comp_bond.value_dist_esd +GLY N CA SINGLE n 1.476 0.0106 1.476 0.0106 +GLY CA C SINGLE n 1.517 0.0121 1.517 0.0121 +GLY C O DOUBLE n 1.249 0.0161 1.249 0.0161 +GLY C OXT SINGLE n 1.249 0.0161 1.249 0.0161 +GLY N H SINGLE n 1.018 0.0520 0.905 0.0200 +GLY N H2 SINGLE n 1.018 0.0520 0.905 0.0200 +GLY N H3 SINGLE n 1.018 0.0520 0.905 0.0200 +GLY CA HA3 SINGLE n 1.092 0.0100 0.986 0.0200 +GLY CA HA2 SINGLE n 1.092 0.0100 0.986 0.0200 + +loop_ +_chem_comp_angle.comp_id +_chem_comp_angle.atom_id_1 +_chem_comp_angle.atom_id_2 +_chem_comp_angle.atom_id_3 +_chem_comp_angle.value_angle +_chem_comp_angle.value_angle_esd +GLY CA N H 110.151 2.94 +GLY CA N H2 110.151 2.94 +GLY CA N H3 110.151 2.94 +GLY H N H2 109.089 3.00 +GLY H N H3 109.089 3.00 +GLY H2 N H3 109.089 3.00 +GLY N CA C 111.292 1.50 +GLY N CA HA3 109.172 1.50 +GLY N CA HA2 109.172 1.50 +GLY C CA HA3 109.620 1.50 +GLY C CA HA2 109.620 1.50 +GLY HA3 CA HA2 108.054 1.50 +GLY CA C O 117.080 1.50 +GLY CA C OXT 117.080 1.50 +GLY O C OXT 125.839 1.50 + +loop_ +_chem_comp_tor.comp_id +_chem_comp_tor.id +_chem_comp_tor.atom_id_1 +_chem_comp_tor.atom_id_2 +_chem_comp_tor.atom_id_3 +_chem_comp_tor.atom_id_4 +_chem_comp_tor.value_angle +_chem_comp_tor.value_angle_esd +_chem_comp_tor.period +GLY sp3_sp3_1 C CA N H 180.000 10.0 3 +GLY sp2_sp3_1 O C CA HA3 0.000 10.0 6 + +loop_ +_chem_comp_plane_atom.comp_id +_chem_comp_plane_atom.plane_id +_chem_comp_plane_atom.atom_id +_chem_comp_plane_atom.dist_esd +GLY plan-1 C 0.020 +GLY plan-1 CA 0.020 +GLY plan-1 O 0.020 +GLY plan-1 OXT 0.020 + +loop_ +_pdbx_chem_comp_descriptor.comp_id +_pdbx_chem_comp_descriptor.type +_pdbx_chem_comp_descriptor.program +_pdbx_chem_comp_descriptor.program_version +_pdbx_chem_comp_descriptor.descriptor +GLY SMILES ACDLabs 10.04 O=C(O)CN +GLY SMILES_CANONICAL CACTVS 3.341 NCC(O)=O +GLY SMILES CACTVS 3.341 NCC(O)=O +GLY SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 C(C(=O)O)N +GLY SMILES "OpenEye OEToolkits" 1.5.0 C(C(=O)O)N +GLY InChI InChI 1.03 InChI=1S/C2H5NO2/c3-1-2(4)5/h1,3H2,(H,4,5) +GLY InChIKey InChI 1.03 DHMQDGOQFOQNFH-UHFFFAOYSA-N + +loop_ +_pdbx_chem_comp_description_generator.comp_id +_pdbx_chem_comp_description_generator.program_name +_pdbx_chem_comp_description_generator.program_version +_pdbx_chem_comp_description_generator.descriptor +GLY acedrg 278 "dictionary generator" +GLY acedrg_database 12 "data source" +GLY rdkit 2019.09.1 "Chemoinformatics tool" +GLY refmac5 5.8.0419 "optimization tool" diff --git a/image_analysis/structure_refinement/monomers/GMP.cif b/image_analysis/structure_refinement/monomers/GMP.cif new file mode 100644 index 000000000..8c4b2aa55 --- /dev/null +++ b/image_analysis/structure_refinement/monomers/GMP.cif @@ -0,0 +1,256 @@ +# +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +GMP GMP GUANOSINE NON-POLYMER 33 20 . +# +data_comp_GMP +# +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +GMP "O5'" O OH1 0 31.023 62.348 13.095 +GMP "C5'" C CH2 0 30.880 60.990 13.491 +GMP "C4'" C CH1 0 32.039 60.141 13.016 +GMP "O4'" O O2 0 32.223 60.322 11.591 +GMP "C3'" C CH1 0 33.402 60.499 13.617 +GMP "O3'" O OH1 0 33.583 59.871 14.880 +GMP "C2'" C CH1 0 34.373 59.978 12.551 +GMP "O2'" O OH1 0 34.741 58.628 12.744 +GMP "C1'" C CH1 0 33.583 60.160 11.252 +GMP N9 N NR5 0 33.999 61.321 10.471 +GMP C8 C CR15 0 33.932 62.634 10.866 +GMP N7 N NRD5 0 34.376 63.473 9.962 +GMP C5 C CR56 0 34.763 62.661 8.903 +GMP C6 C CR6 0 35.321 63.006 7.643 +GMP O6 O O 0 35.589 64.136 7.210 +GMP N1 N NR6 0 35.569 61.874 6.857 +GMP C2 C CR6 0 35.310 60.575 7.237 +GMP N2 N NH2 0 35.612 59.614 6.354 +GMP N3 N NRD6 0 34.785 60.248 8.422 +GMP C4 C CR56 0 34.537 61.332 9.203 +GMP "HO5'" H H 0 30.412 62.808 13.461 +GMP "H5'1" H H 0 30.045 60.632 13.121 +GMP "H5'2" H H 0 30.824 60.943 14.469 +GMP "H4'" H H 0 31.840 59.197 13.196 +GMP "H3'" H H 0 33.489 61.482 13.709 +GMP "HO3'" H H 0 34.374 60.022 15.150 +GMP "H2'" H H 0 35.192 60.542 12.533 +GMP "HO2'" H H 0 34.046 58.141 12.763 +GMP "H1'" H H 0 33.686 59.348 10.707 +GMP H8 H H 0 33.598 62.904 11.704 +GMP HN1 H H 0 35.923 62.012 6.043 +GMP HN21 H H 0 35.993 58.873 6.627 +GMP HN22 H H 0 35.427 59.728 5.504 +loop_ +_chem_comp_bond.comp_id +_chem_comp_bond.atom_id_1 +_chem_comp_bond.atom_id_2 +_chem_comp_bond.type +_chem_comp_bond.aromatic +_chem_comp_bond.value_dist_nucleus +_chem_comp_bond.value_dist_nucleus_esd +_chem_comp_bond.value_dist +_chem_comp_bond.value_dist_esd +GMP "O5'" "C5'" SINGLE n 1.421 0.0131 1.421 0.0131 +GMP "C5'" "C4'" SINGLE n 1.511 0.0177 1.511 0.0177 +GMP "C4'" "O4'" SINGLE n 1.451 0.0100 1.451 0.0100 +GMP "C4'" "C3'" SINGLE n 1.535 0.0100 1.535 0.0100 +GMP "O4'" "C1'" SINGLE n 1.409 0.0100 1.409 0.0100 +GMP "C3'" "O3'" SINGLE n 1.422 0.0100 1.422 0.0100 +GMP "C3'" "C2'" SINGLE n 1.531 0.0100 1.531 0.0100 +GMP "C2'" "O2'" SINGLE n 1.411 0.0100 1.411 0.0100 +GMP "C2'" "C1'" SINGLE n 1.525 0.0100 1.525 0.0100 +GMP "C1'" N9 SINGLE n 1.458 0.0100 1.458 0.0100 +GMP N9 C8 SINGLE y 1.372 0.0100 1.372 0.0100 +GMP N9 C4 SINGLE y 1.375 0.0100 1.375 0.0100 +GMP C8 N7 DOUBLE y 1.312 0.0100 1.312 0.0100 +GMP N7 C5 SINGLE y 1.390 0.0100 1.390 0.0100 +GMP C5 C6 SINGLE y 1.417 0.0103 1.417 0.0103 +GMP C5 C4 DOUBLE y 1.377 0.0100 1.377 0.0100 +GMP C6 O6 DOUBLE n 1.239 0.0100 1.239 0.0100 +GMP C6 N1 SINGLE y 1.396 0.0107 1.396 0.0107 +GMP N1 C2 SINGLE y 1.374 0.0100 1.374 0.0100 +GMP C2 N2 SINGLE n 1.340 0.0101 1.340 0.0101 +GMP C2 N3 DOUBLE y 1.333 0.0104 1.333 0.0104 +GMP N3 C4 SINGLE y 1.355 0.0100 1.355 0.0100 +GMP "O5'" "HO5'" SINGLE n 0.970 0.0120 0.848 0.0200 +GMP "C5'" "H5'1" SINGLE n 1.089 0.0100 0.981 0.0200 +GMP "C5'" "H5'2" SINGLE n 1.089 0.0100 0.981 0.0200 +GMP "C4'" "H4'" SINGLE n 1.089 0.0100 0.981 0.0200 +GMP "C3'" "H3'" SINGLE n 1.089 0.0100 0.992 0.0200 +GMP "O3'" "HO3'" SINGLE n 0.970 0.0120 0.849 0.0200 +GMP "C2'" "H2'" SINGLE n 1.089 0.0100 0.994 0.0200 +GMP "O2'" "HO2'" SINGLE n 0.970 0.0120 0.849 0.0200 +GMP "C1'" "H1'" SINGLE n 1.089 0.0100 0.984 0.0200 +GMP C8 H8 SINGLE n 1.082 0.0130 0.942 0.0170 +GMP N1 HN1 SINGLE n 1.016 0.0100 0.897 0.0200 +GMP N2 HN21 SINGLE n 1.016 0.0100 0.877 0.0200 +GMP N2 HN22 SINGLE n 1.016 0.0100 0.877 0.0200 +loop_ +_chem_comp_angle.comp_id +_chem_comp_angle.atom_id_1 +_chem_comp_angle.atom_id_2 +_chem_comp_angle.atom_id_3 +_chem_comp_angle.value_angle +_chem_comp_angle.value_angle_esd +GMP "C5'" "O5'" "HO5'" 109.007 3.00 +GMP "O5'" "C5'" "C4'" 111.279 1.98 +GMP "O5'" "C5'" "H5'1" 109.280 1.50 +GMP "O5'" "C5'" "H5'2" 109.280 1.50 +GMP "C4'" "C5'" "H5'1" 109.326 2.00 +GMP "C4'" "C5'" "H5'2" 109.326 2.00 +GMP "H5'1" "C5'" "H5'2" 108.248 2.26 +GMP "C5'" "C4'" "O4'" 109.170 1.50 +GMP "C5'" "C4'" "C3'" 114.598 1.97 +GMP "C5'" "C4'" "H4'" 109.037 1.87 +GMP "O4'" "C4'" "C3'" 105.388 1.50 +GMP "O4'" "C4'" "H4'" 108.947 1.50 +GMP "C3'" "C4'" "H4'" 109.363 1.86 +GMP "C4'" "O4'" "C1'" 109.903 1.50 +GMP "C4'" "C3'" "O3'" 111.281 2.46 +GMP "C4'" "C3'" "C2'" 102.602 1.50 +GMP "C4'" "C3'" "H3'" 110.452 2.54 +GMP "O3'" "C3'" "C2'" 111.581 2.83 +GMP "O3'" "C3'" "H3'" 110.380 1.67 +GMP "C2'" "C3'" "H3'" 110.504 1.75 +GMP "C3'" "O3'" "HO3'" 108.744 3.00 +GMP "C3'" "C2'" "O2'" 112.782 2.45 +GMP "C3'" "C2'" "C1'" 101.239 1.50 +GMP "C3'" "C2'" "H2'" 110.596 1.51 +GMP "O2'" "C2'" "C1'" 111.715 2.69 +GMP "O2'" "C2'" "H2'" 110.448 1.97 +GMP "C1'" "C2'" "H2'" 110.636 1.70 +GMP "C2'" "O2'" "HO2'" 109.103 2.13 +GMP "O4'" "C1'" "C2'" 106.047 1.50 +GMP "O4'" "C1'" N9 108.477 1.50 +GMP "O4'" "C1'" "H1'" 109.807 1.50 +GMP "C2'" "C1'" N9 113.824 1.50 +GMP "C2'" "C1'" "H1'" 109.015 1.50 +GMP N9 "C1'" "H1'" 109.561 1.50 +GMP "C1'" N9 C8 126.829 1.91 +GMP "C1'" N9 C4 127.440 1.80 +GMP C8 N9 C4 105.731 1.50 +GMP N9 C8 N7 113.507 1.50 +GMP N9 C8 H8 123.187 1.50 +GMP N7 C8 H8 123.307 1.50 +GMP C8 N7 C5 104.778 1.50 +GMP N7 C5 C6 130.030 1.50 +GMP N7 C5 C4 110.574 1.50 +GMP C6 C5 C4 119.397 1.50 +GMP C5 C6 O6 128.244 1.50 +GMP C5 C6 N1 111.367 1.50 +GMP O6 C6 N1 120.389 1.50 +GMP C6 N1 C2 125.351 1.50 +GMP C6 N1 HN1 116.978 2.44 +GMP C2 N1 HN1 117.677 2.71 +GMP N1 C2 N2 116.576 1.50 +GMP N1 C2 N3 123.602 1.50 +GMP N2 C2 N3 119.821 1.50 +GMP C2 N2 HN21 119.868 1.50 +GMP C2 N2 HN22 119.868 1.50 +GMP HN21 N2 HN22 120.263 1.96 +GMP C2 N3 C4 112.066 1.50 +GMP N9 C4 C5 105.411 1.50 +GMP N9 C4 N3 126.378 1.50 +GMP C5 C4 N3 128.211 1.50 +loop_ +_chem_comp_tor.comp_id +_chem_comp_tor.id +_chem_comp_tor.atom_id_1 +_chem_comp_tor.atom_id_2 +_chem_comp_tor.atom_id_3 +_chem_comp_tor.atom_id_4 +_chem_comp_tor.value_angle +_chem_comp_tor.value_angle_esd +_chem_comp_tor.period +GMP sp3_sp3_25 "C4'" "C5'" "O5'" "HO5'" 180.000 10.0 3 +GMP const_21 N9 C8 N7 C5 0.000 10.0 2 +GMP const_24 C6 C5 N7 C8 180.000 10.0 2 +GMP const_sp2_sp2_4 N7 C5 C6 O6 0.000 5.0 2 +GMP const_25 N9 C4 C5 N7 0.000 10.0 2 +GMP const_sp2_sp2_7 O6 C6 N1 C2 180.000 5.0 2 +GMP const_11 N2 C2 N1 C6 180.000 10.0 2 +GMP sp2_sp2_1 N1 C2 N2 HN21 180.000 5.0 2 +GMP const_14 N2 C2 N3 C4 180.000 10.0 2 +GMP const_16 N9 C4 N3 C2 180.000 10.0 2 +GMP sp3_sp3_28 "O4'" "C4'" "C5'" "O5'" 180.000 10.0 3 +GMP sp3_sp3_2 "C5'" "C4'" "O4'" "C1'" -60.000 10.0 3 +GMP sp3_sp3_41 "O3'" "C3'" "C4'" "C5'" 180.000 10.0 3 +GMP sp3_sp3_4 "C2'" "C1'" "O4'" "C4'" -60.000 10.0 3 +GMP sp3_sp3_46 "C4'" "C3'" "O3'" "HO3'" 180.000 10.0 3 +GMP sp3_sp3_20 "O2'" "C2'" "C3'" "O3'" -60.000 10.0 3 +GMP sp3_sp3_49 "C3'" "C2'" "O2'" "HO2'" 180.000 10.0 3 +GMP sp3_sp3_8 "O4'" "C1'" "C2'" "O2'" 180.000 10.0 3 +GMP sp2_sp3_1 C8 N9 "C1'" "O4'" 150.000 10.0 6 +GMP const_18 N7 C8 N9 "C1'" 180.000 10.0 2 +GMP const_30 C5 C4 N9 "C1'" 180.000 10.0 2 +loop_ +_chem_comp_chir.comp_id +_chem_comp_chir.id +_chem_comp_chir.atom_id_centre +_chem_comp_chir.atom_id_1 +_chem_comp_chir.atom_id_2 +_chem_comp_chir.atom_id_3 +_chem_comp_chir.volume_sign +GMP chir_1 "C4'" "O4'" "C3'" "C5'" negative +GMP chir_2 "C3'" "O3'" "C4'" "C2'" positive +GMP chir_3 "C2'" "O2'" "C1'" "C3'" negative +GMP chir_4 "C1'" "O4'" N9 "C2'" negative +loop_ +_chem_comp_plane_atom.comp_id +_chem_comp_plane_atom.plane_id +_chem_comp_plane_atom.atom_id +_chem_comp_plane_atom.dist_esd +GMP plan-1 "C1'" 0.020 +GMP plan-1 C2 0.020 +GMP plan-1 C4 0.020 +GMP plan-1 C5 0.020 +GMP plan-1 C6 0.020 +GMP plan-1 C8 0.020 +GMP plan-1 H8 0.020 +GMP plan-1 HN1 0.020 +GMP plan-1 N1 0.020 +GMP plan-1 N2 0.020 +GMP plan-1 N3 0.020 +GMP plan-1 N7 0.020 +GMP plan-1 N9 0.020 +GMP plan-1 O6 0.020 +GMP plan-2 C2 0.020 +GMP plan-2 HN21 0.020 +GMP plan-2 HN22 0.020 +GMP plan-2 N2 0.020 +loop_ +_pdbx_chem_comp_descriptor.comp_id +_pdbx_chem_comp_descriptor.type +_pdbx_chem_comp_descriptor.program +_pdbx_chem_comp_descriptor.program_version +_pdbx_chem_comp_descriptor.descriptor +GMP SMILES ACDLabs 10.04 O=C1c2ncn(c2N=C(N)N1)C3OC(C(O)C3O)CO +GMP InChI InChI 1.03 InChI=1S/C10H13N5O5/c11-10-13-7-4(8(19)14-10)12-2-15(7)9-6(18)5(17)3(1-16)20-9/h2-3,5-6,9,16-18H,1H2,(H3,11,13,14,19)/t3-,5-,6-,9-/m1/s1 +GMP InChIKey InChI 1.03 NYHBQMYGNKIUIF-UUOKFMHZSA-N +GMP SMILES_CANONICAL CACTVS 3.385 NC1=Nc2n(cnc2C(=O)N1)[C@@H]3O[C@H](CO)[C@@H](O)[C@H]3O +GMP SMILES CACTVS 3.385 NC1=Nc2n(cnc2C(=O)N1)[CH]3O[CH](CO)[CH](O)[CH]3O +GMP SMILES_CANONICAL "OpenEye OEToolkits" 1.7.5 c1nc2c(n1[C@H]3[C@@H]([C@@H]([C@H](O3)CO)O)O)N=C(NC2=O)N +GMP SMILES "OpenEye OEToolkits" 1.7.5 c1nc2c(n1C3C(C(C(O3)CO)O)O)N=C(NC2=O)N +loop_ +_pdbx_chem_comp_description_generator.comp_id +_pdbx_chem_comp_description_generator.program_name +_pdbx_chem_comp_description_generator.program_version +_pdbx_chem_comp_description_generator.descriptor +GMP acedrg 243 "dictionary generator" +GMP acedrg_database 11 "data source" +GMP rdkit 2017.03.2 "Chemoinformatics tool" +GMP refmac5 5.8.0238 "optimization tool" diff --git a/image_analysis/structure_refinement/monomers/GOL.cif b/image_analysis/structure_refinement/monomers/GOL.cif new file mode 100644 index 000000000..f4a3e10af --- /dev/null +++ b/image_analysis/structure_refinement/monomers/GOL.cif @@ -0,0 +1,134 @@ +# +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +GOL GOL GLYCEROL NON-POLYMER 14 6 . +# +data_comp_GOL +# +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +GOL C1 C CH2 0 29.630 3.832 30.945 +GOL O1 O OH1 0 28.425 3.137 31.257 +GOL C2 C CH1 0 30.401 3.142 29.840 +GOL O2 O OH1 0 31.484 3.970 29.416 +GOL C3 C CH2 0 30.919 1.777 30.241 +GOL O3 O OH1 0 31.679 1.174 29.197 +GOL H11 H H 0 30.196 3.882 31.753 +GOL H12 H H 0 29.411 4.753 30.662 +GOL HO1 H H 0 28.030 3.557 31.876 +GOL H2 H H 0 29.790 3.020 29.074 +GOL HO2 H H 0 32.019 4.078 30.068 +GOL H31 H H 0 30.155 1.193 30.467 +GOL H32 H H 0 31.486 1.869 31.045 +GOL HO3 H H 0 31.160 1.020 28.546 +loop_ +_chem_comp_bond.comp_id +_chem_comp_bond.atom_id_1 +_chem_comp_bond.atom_id_2 +_chem_comp_bond.type +_chem_comp_bond.aromatic +_chem_comp_bond.value_dist_nucleus +_chem_comp_bond.value_dist_nucleus_esd +_chem_comp_bond.value_dist +_chem_comp_bond.value_dist_esd +GOL C1 O1 SINGLE n 1.425 0.0100 1.425 0.0100 +GOL C1 C2 SINGLE n 1.514 0.0105 1.514 0.0105 +GOL C2 O2 SINGLE n 1.427 0.0100 1.427 0.0100 +GOL C2 C3 SINGLE n 1.514 0.0105 1.514 0.0105 +GOL C3 O3 SINGLE n 1.425 0.0100 1.425 0.0100 +GOL C1 H11 SINGLE n 1.089 0.0100 0.988 0.0200 +GOL C1 H12 SINGLE n 1.089 0.0100 0.988 0.0200 +GOL O1 HO1 SINGLE n 0.970 0.0120 0.846 0.0200 +GOL C2 H2 SINGLE n 1.089 0.0100 0.987 0.0186 +GOL O2 HO2 SINGLE n 0.970 0.0120 0.848 0.0200 +GOL C3 H31 SINGLE n 1.089 0.0100 0.988 0.0200 +GOL C3 H32 SINGLE n 1.089 0.0100 0.988 0.0200 +GOL O3 HO3 SINGLE n 0.970 0.0120 0.846 0.0200 +loop_ +_chem_comp_angle.comp_id +_chem_comp_angle.atom_id_1 +_chem_comp_angle.atom_id_2 +_chem_comp_angle.atom_id_3 +_chem_comp_angle.value_angle +_chem_comp_angle.value_angle_esd +GOL O1 C1 C2 111.586 1.51 +GOL O1 C1 H11 109.268 1.50 +GOL O1 C1 H12 109.268 1.50 +GOL C2 C1 H11 109.193 1.50 +GOL C2 C1 H12 109.193 1.50 +GOL H11 C1 H12 108.313 1.50 +GOL C1 O1 HO1 108.280 3.00 +GOL C1 C2 O2 110.247 1.72 +GOL C1 C2 C3 113.504 1.50 +GOL C1 C2 H2 108.441 1.50 +GOL O2 C2 C3 110.247 1.72 +GOL O2 C2 H2 108.721 1.50 +GOL C3 C2 H2 108.441 1.50 +GOL C2 O2 HO2 107.936 3.00 +GOL C2 C3 O3 111.586 1.51 +GOL C2 C3 H31 109.193 1.50 +GOL C2 C3 H32 109.193 1.50 +GOL O3 C3 H31 109.268 1.50 +GOL O3 C3 H32 109.268 1.50 +GOL H31 C3 H32 108.313 1.50 +GOL C3 O3 HO3 108.280 3.00 +loop_ +_chem_comp_tor.comp_id +_chem_comp_tor.id +_chem_comp_tor.atom_id_1 +_chem_comp_tor.atom_id_2 +_chem_comp_tor.atom_id_3 +_chem_comp_tor.atom_id_4 +_chem_comp_tor.value_angle +_chem_comp_tor.value_angle_esd +_chem_comp_tor.period +GOL sp3_sp3_1 C2 C1 O1 HO1 180.000 10.0 3 +GOL sp3_sp3_4 O1 C1 C2 O2 180.000 10.0 3 +GOL sp3_sp3_14 C1 C2 O2 HO2 60.000 10.0 3 +GOL sp3_sp3_16 C1 C2 C3 O3 180.000 10.0 3 +GOL sp3_sp3_25 C2 C3 O3 HO3 180.000 10.0 3 +loop_ +_chem_comp_chir.comp_id +_chem_comp_chir.id +_chem_comp_chir.atom_id_centre +_chem_comp_chir.atom_id_1 +_chem_comp_chir.atom_id_2 +_chem_comp_chir.atom_id_3 +_chem_comp_chir.volume_sign +GOL chir_1 C2 O2 C1 C3 both +loop_ +_pdbx_chem_comp_descriptor.comp_id +_pdbx_chem_comp_descriptor.type +_pdbx_chem_comp_descriptor.program +_pdbx_chem_comp_descriptor.program_version +_pdbx_chem_comp_descriptor.descriptor +GOL SMILES ACDLabs 12.01 OCC(O)CO +GOL SMILES_CANONICAL CACTVS 3.370 OCC(O)CO +GOL SMILES CACTVS 3.370 OCC(O)CO +GOL SMILES_CANONICAL "OpenEye OEToolkits" 1.7.0 C(C(CO)O)O +GOL SMILES "OpenEye OEToolkits" 1.7.0 C(C(CO)O)O +GOL InChI InChI 1.03 InChI=1S/C3H8O3/c4-1-3(6)2-5/h3-6H,1-2H2 +GOL InChIKey InChI 1.03 PEDCQBHIVMGVHV-UHFFFAOYSA-N +loop_ +_pdbx_chem_comp_description_generator.comp_id +_pdbx_chem_comp_description_generator.program_name +_pdbx_chem_comp_description_generator.program_version +_pdbx_chem_comp_description_generator.descriptor +GOL acedrg 243 "dictionary generator" +GOL acedrg_database 11 "data source" +GOL rdkit 2017.03.2 "Chemoinformatics tool" +GOL refmac5 5.8.0238 "optimization tool" diff --git a/image_analysis/structure_refinement/monomers/GTP.cif b/image_analysis/structure_refinement/monomers/GTP.cif new file mode 100644 index 000000000..53fdeff81 --- /dev/null +++ b/image_analysis/structure_refinement/monomers/GTP.cif @@ -0,0 +1,312 @@ +# +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +GTP GTP "GUANOSINE-5'-TRIPHOSPHATE" NON-POLYMER 44 32 . +# +data_comp_GTP +# +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +GTP PG P P 0 4.560 31.688 21.477 +GTP O1G O O 0 4.404 32.256 22.874 +GTP O2G O OP -1 4.031 32.621 20.405 +GTP O3G O OP -1 4.007 30.282 21.352 +GTP O3B O O2 0 6.154 31.567 21.217 +GTP PB P P 0 7.014 30.840 20.078 +GTP O1B O O 0 7.367 29.484 20.548 +GTP O2B O OP -1 6.320 31.011 18.784 +GTP O3A O O2 0 8.339 31.740 20.070 +GTP PA P P 0 8.640 33.246 19.616 +GTP O1A O O 0 8.465 33.336 18.144 +GTP O2A O OP -1 7.853 34.171 20.471 +GTP "O5'" O O2 0 10.195 33.377 19.964 +GTP "C5'" C CH2 0 10.583 33.182 21.348 +GTP "C4'" C CH1 0 12.036 33.553 21.524 +GTP "O4'" O O2 0 12.846 32.727 20.657 +GTP "C3'" C CH1 0 12.389 35.007 21.180 +GTP "O3'" O OH1 0 13.296 35.538 22.138 +GTP "C2'" C CH1 0 13.016 34.892 19.786 +GTP "O2'" O OH1 0 13.937 35.921 19.490 +GTP "C1'" C CH1 0 13.732 33.549 19.908 +GTP N9 N NR5 0 14.014 32.895 18.629 +GTP C8 C CR15 0 13.089 32.464 17.714 +GTP N7 N NRD5 0 13.617 31.910 16.650 +GTP C5 C CR56 0 14.986 31.978 16.880 +GTP C6 C CR6 0 16.070 31.533 16.074 +GTP O6 O O 0 16.021 30.976 14.968 +GTP N1 N NR16 0 17.307 31.793 16.676 +GTP C2 C CR6 0 17.480 32.406 17.902 +GTP N2 N NH2 0 18.744 32.578 18.332 +GTP N3 N NRD6 0 16.461 32.825 18.660 +GTP C4 C CR56 0 15.250 32.581 18.093 +GTP "H5'" H H 0 10.452 32.234 21.605 +GTP "H5''" H H 0 10.026 33.747 21.941 +GTP "H4'" H H 0 12.287 33.371 22.464 +GTP "H3'" H H 0 11.567 35.560 21.142 +GTP "HO3'" H H 0 14.015 35.710 21.778 +GTP "H2'" H H 0 12.311 34.844 19.092 +GTP "HO2'" H H 0 14.731 35.591 19.468 +GTP "H1'" H H 0 14.596 33.678 20.425 +GTP H8 H H 0 12.160 32.561 17.840 +GTP HN1 H H 0 18.034 31.538 16.221 +GTP HN21 H H 0 18.891 32.964 19.107 +GTP HN22 H H 0 19.424 32.310 17.847 +loop_ +_chem_comp_bond.comp_id +_chem_comp_bond.atom_id_1 +_chem_comp_bond.atom_id_2 +_chem_comp_bond.type +_chem_comp_bond.aromatic +_chem_comp_bond.value_dist_nucleus +_chem_comp_bond.value_dist_nucleus_esd +_chem_comp_bond.value_dist +_chem_comp_bond.value_dist_esd +GTP PG O1G DOUBLE n 1.516 0.0200 1.516 0.0200 +GTP PG O2G SINGLE n 1.516 0.0200 1.516 0.0200 +GTP PG O3G SINGLE n 1.516 0.0200 1.516 0.0200 +GTP PG O3B SINGLE n 1.620 0.0143 1.620 0.0143 +GTP O3B PB SINGLE n 1.601 0.0108 1.601 0.0108 +GTP PB O1B DOUBLE n 1.478 0.0100 1.478 0.0100 +GTP PB O2B SINGLE n 1.478 0.0100 1.478 0.0100 +GTP PB O3A SINGLE n 1.602 0.0126 1.602 0.0126 +GTP O3A PA SINGLE n 1.600 0.0185 1.600 0.0185 +GTP PA O1A DOUBLE n 1.485 0.0100 1.485 0.0100 +GTP PA O2A SINGLE n 1.485 0.0100 1.485 0.0100 +GTP PA "O5'" SINGLE n 1.598 0.0100 1.598 0.0100 +GTP "O5'" "C5'" SINGLE n 1.445 0.0200 1.445 0.0200 +GTP "C5'" "C4'" SINGLE n 1.509 0.0100 1.509 0.0100 +GTP "C4'" "O4'" SINGLE n 1.444 0.0100 1.444 0.0100 +GTP "C4'" "C3'" SINGLE n 1.532 0.0100 1.532 0.0100 +GTP "O4'" "C1'" SINGLE n 1.423 0.0100 1.423 0.0100 +GTP "C3'" "O3'" SINGLE n 1.422 0.0100 1.422 0.0100 +GTP "C3'" "C2'" SINGLE n 1.532 0.0103 1.532 0.0103 +GTP "C2'" "O2'" SINGLE n 1.412 0.0100 1.412 0.0100 +GTP "C2'" "C1'" SINGLE n 1.528 0.0100 1.528 0.0100 +GTP "C1'" N9 SINGLE n 1.462 0.0102 1.462 0.0102 +GTP N9 C8 SINGLE y 1.371 0.0100 1.371 0.0100 +GTP N9 C4 SINGLE y 1.383 0.0114 1.383 0.0114 +GTP C8 N7 DOUBLE y 1.311 0.0104 1.311 0.0104 +GTP N7 C5 SINGLE y 1.390 0.0100 1.390 0.0100 +GTP C5 C6 SINGLE y 1.418 0.0111 1.418 0.0111 +GTP C5 C4 DOUBLE y 1.377 0.0100 1.377 0.0100 +GTP C6 O6 DOUBLE n 1.240 0.0104 1.240 0.0104 +GTP C6 N1 SINGLE y 1.394 0.0120 1.394 0.0120 +GTP N1 C2 SINGLE y 1.374 0.0124 1.374 0.0124 +GTP C2 N2 SINGLE n 1.341 0.0143 1.341 0.0143 +GTP C2 N3 DOUBLE y 1.331 0.0119 1.331 0.0119 +GTP N3 C4 SINGLE y 1.355 0.0100 1.355 0.0100 +GTP "C5'" "H5'" SINGLE n 1.089 0.0100 0.991 0.0200 +GTP "C5'" "H5''" SINGLE n 1.089 0.0100 0.991 0.0200 +GTP "C4'" "H4'" SINGLE n 1.089 0.0100 0.990 0.0200 +GTP "C3'" "H3'" SINGLE n 1.089 0.0100 0.991 0.0200 +GTP "O3'" "HO3'" SINGLE n 0.970 0.0120 0.839 0.0200 +GTP "C2'" "H2'" SINGLE n 1.089 0.0100 0.991 0.0200 +GTP "O2'" "HO2'" SINGLE n 0.970 0.0120 0.839 0.0200 +GTP "C1'" "H1'" SINGLE n 1.089 0.0100 1.016 0.0200 +GTP C8 H8 SINGLE n 1.082 0.0130 0.942 0.0168 +GTP N1 HN1 SINGLE n 1.016 0.0100 0.894 0.0200 +GTP N2 HN21 SINGLE n 1.016 0.0100 0.877 0.0200 +GTP N2 HN22 SINGLE n 1.016 0.0100 0.877 0.0200 +loop_ +_chem_comp_angle.comp_id +_chem_comp_angle.atom_id_1 +_chem_comp_angle.atom_id_2 +_chem_comp_angle.atom_id_3 +_chem_comp_angle.value_angle +_chem_comp_angle.value_angle_esd +GTP O1G PG O2G 112.609 3.00 +GTP O1G PG O3G 112.609 3.00 +GTP O1G PG O3B 106.004 3.00 +GTP O2G PG O3G 112.609 3.00 +GTP O2G PG O3B 106.004 3.00 +GTP O3G PG O3B 106.004 3.00 +GTP PG O3B PB 132.613 3.00 +GTP O3B PB O1B 108.634 3.00 +GTP O3B PB O2B 108.634 3.00 +GTP O3B PB O3A 100.990 3.00 +GTP O1B PB O2B 119.776 1.50 +GTP O1B PB O3A 108.634 3.00 +GTP O2B PB O3A 108.634 3.00 +GTP PB O3A PA 133.108 3.00 +GTP O3A PA O1A 109.053 3.00 +GTP O3A PA O2A 109.053 3.00 +GTP O3A PA "O5'" 100.137 3.00 +GTP O1A PA O2A 118.805 3.00 +GTP O1A PA "O5'" 109.340 2.31 +GTP O2A PA "O5'" 109.340 2.31 +GTP PA "O5'" "C5'" 116.362 1.50 +GTP "O5'" "C5'" "C4'" 109.454 1.61 +GTP "O5'" "C5'" "H5'" 109.882 1.50 +GTP "O5'" "C5'" "H5''" 109.882 1.50 +GTP "C4'" "C5'" "H5'" 109.589 1.50 +GTP "C4'" "C5'" "H5''" 109.589 1.50 +GTP "H5'" "C5'" "H5''" 108.471 1.50 +GTP "C5'" "C4'" "O4'" 109.154 1.50 +GTP "C5'" "C4'" "C3'" 115.288 1.50 +GTP "C5'" "C4'" "H4'" 108.351 1.59 +GTP "O4'" "C4'" "C3'" 105.318 1.50 +GTP "O4'" "C4'" "H4'" 109.120 1.50 +GTP "C3'" "C4'" "H4'" 109.322 2.54 +GTP "C4'" "O4'" "C1'" 109.502 2.85 +GTP "C4'" "C3'" "O3'" 110.713 3.00 +GTP "C4'" "C3'" "C2'" 102.593 1.50 +GTP "C4'" "C3'" "H3'" 110.577 3.00 +GTP "O3'" "C3'" "C2'" 111.671 3.00 +GTP "O3'" "C3'" "H3'" 110.541 2.08 +GTP "C2'" "C3'" "H3'" 110.454 1.85 +GTP "C3'" "O3'" "HO3'" 109.389 3.00 +GTP "C3'" "C2'" "O2'" 112.677 3.00 +GTP "C3'" "C2'" "C1'" 101.406 1.50 +GTP "C3'" "C2'" "H2'" 110.788 1.91 +GTP "O2'" "C2'" "C1'" 110.814 3.00 +GTP "O2'" "C2'" "H2'" 110.904 1.50 +GTP "C1'" "C2'" "H2'" 110.342 1.91 +GTP "C2'" "O2'" "HO2'" 109.217 3.00 +GTP "O4'" "C1'" "C2'" 106.114 1.65 +GTP "O4'" "C1'" N9 108.577 1.50 +GTP "O4'" "C1'" "H1'" 109.833 2.53 +GTP "C2'" "C1'" N9 113.380 2.77 +GTP "C2'" "C1'" "H1'" 109.222 1.50 +GTP N9 "C1'" "H1'" 109.411 1.50 +GTP "C1'" N9 C8 127.058 3.00 +GTP "C1'" N9 C4 126.955 2.94 +GTP C8 N9 C4 105.987 1.50 +GTP N9 C8 N7 113.721 1.50 +GTP N9 C8 H8 122.935 1.50 +GTP N7 C8 H8 123.345 1.50 +GTP C8 N7 C5 103.926 1.50 +GTP N7 C5 C6 129.926 1.50 +GTP N7 C5 C4 110.770 1.50 +GTP C6 C5 C4 119.304 1.50 +GTP C5 C6 O6 128.237 1.50 +GTP C5 C6 N1 111.514 1.50 +GTP O6 C6 N1 120.248 1.50 +GTP C6 N1 C2 125.452 1.50 +GTP C6 N1 HN1 117.160 2.45 +GTP C2 N1 HN1 117.387 2.97 +GTP N1 C2 N2 116.657 1.50 +GTP N1 C2 N3 123.538 1.50 +GTP N2 C2 N3 119.805 1.50 +GTP C2 N2 HN21 119.712 3.00 +GTP C2 N2 HN22 119.712 3.00 +GTP HN21 N2 HN22 120.576 3.00 +GTP C2 N3 C4 111.926 1.50 +GTP N9 C4 C5 105.596 1.50 +GTP N9 C4 N3 126.138 1.50 +GTP C5 C4 N3 128.265 1.50 +loop_ +_chem_comp_tor.comp_id +_chem_comp_tor.id +_chem_comp_tor.atom_id_1 +_chem_comp_tor.atom_id_2 +_chem_comp_tor.atom_id_3 +_chem_comp_tor.atom_id_4 +_chem_comp_tor.value_angle +_chem_comp_tor.value_angle_esd +_chem_comp_tor.period +GTP sp3_sp3_27 PB O3B PG O1G 60.000 10.0 3 +GTP sp3_sp3_40 "C4'" "C5'" "O5'" PA 180.000 10.0 3 +GTP sp3_sp3_43 "O4'" "C4'" "C5'" "O5'" 180.000 10.0 3 +GTP sp3_sp3_2 "C5'" "C4'" "O4'" "C1'" -60.000 10.0 3 +GTP sp3_sp3_56 "O3'" "C3'" "C4'" "C5'" 180.000 10.0 3 +GTP sp3_sp3_4 "C2'" "C1'" "O4'" "C4'" -60.000 10.0 3 +GTP sp3_sp3_61 "C4'" "C3'" "O3'" "HO3'" 180.000 10.0 3 +GTP sp3_sp3_20 "O2'" "C2'" "C3'" "O3'" -60.000 10.0 3 +GTP sp3_sp3_64 "C3'" "C2'" "O2'" "HO2'" 180.000 10.0 3 +GTP sp3_sp3_8 "O4'" "C1'" "C2'" "O2'" 180.000 10.0 3 +GTP sp2_sp3_1 C8 N9 "C1'" "O4'" 150.000 10.0 6 +GTP const_18 N7 C8 N9 "C1'" 180.000 0.0 2 +GTP const_30 C5 C4 N9 "C1'" 180.000 0.0 2 +GTP const_21 N9 C8 N7 C5 0.000 0.0 2 +GTP const_24 C6 C5 N7 C8 180.000 0.0 2 +GTP const_sp2_sp2_4 N7 C5 C6 O6 0.000 0.0 2 +GTP const_25 N9 C4 C5 N7 0.000 0.0 2 +GTP const_sp2_sp2_7 O6 C6 N1 C2 180.000 0.0 2 +GTP const_11 N2 C2 N1 C6 180.000 0.0 2 +GTP sp2_sp2_33 N1 C2 N2 HN21 180.000 5.0 2 +GTP const_14 N2 C2 N3 C4 180.000 0.0 2 +GTP const_16 N9 C4 N3 C2 180.000 0.0 2 +GTP sp3_sp3_30 PG O3B PB O1B 60.000 10.0 3 +GTP sp3_sp3_32 PA O3A PB O3B -60.000 10.0 3 +GTP sp3_sp3_36 PB O3A PA O1A 60.000 10.0 3 +GTP sp3_sp3_37 "C5'" "O5'" PA O3A 180.000 10.0 3 +loop_ +_chem_comp_chir.comp_id +_chem_comp_chir.id +_chem_comp_chir.atom_id_centre +_chem_comp_chir.atom_id_1 +_chem_comp_chir.atom_id_2 +_chem_comp_chir.atom_id_3 +_chem_comp_chir.volume_sign +GTP chir_1 PB O3A O3B O2B both +GTP chir_2 PA O3A "O5'" O2A both +GTP chir_3 "C4'" "O4'" "C3'" "C5'" negative +GTP chir_4 "C3'" "O3'" "C4'" "C2'" positive +GTP chir_5 "C2'" "O2'" "C1'" "C3'" negative +GTP chir_6 "C1'" "O4'" N9 "C2'" negative +GTP chir_7 PG O3B O2G O3G both +loop_ +_chem_comp_plane_atom.comp_id +_chem_comp_plane_atom.plane_id +_chem_comp_plane_atom.atom_id +_chem_comp_plane_atom.dist_esd +GTP plan-1 "C1'" 0.020 +GTP plan-1 C4 0.020 +GTP plan-1 C5 0.020 +GTP plan-1 C6 0.020 +GTP plan-1 C8 0.020 +GTP plan-1 H8 0.020 +GTP plan-1 N3 0.020 +GTP plan-1 N7 0.020 +GTP plan-1 N9 0.020 +GTP plan-2 C2 0.020 +GTP plan-2 C4 0.020 +GTP plan-2 C5 0.020 +GTP plan-2 C6 0.020 +GTP plan-2 HN1 0.020 +GTP plan-2 N1 0.020 +GTP plan-2 N2 0.020 +GTP plan-2 N3 0.020 +GTP plan-2 N7 0.020 +GTP plan-2 N9 0.020 +GTP plan-2 O6 0.020 +GTP plan-3 C2 0.020 +GTP plan-3 HN21 0.020 +GTP plan-3 HN22 0.020 +GTP plan-3 N2 0.020 +loop_ +_pdbx_chem_comp_descriptor.comp_id +_pdbx_chem_comp_descriptor.type +_pdbx_chem_comp_descriptor.program +_pdbx_chem_comp_descriptor.program_version +_pdbx_chem_comp_descriptor.descriptor +GTP SMILES ACDLabs 12.01 "O=P(O)(O)OP(=O)(O)OP(=O)(O)OCC3OC(n2cnc1c2N=C(N)NC1=O)C(O)C3O" +GTP InChI InChI 1.03 "InChI=1S/C10H16N5O14P3/c11-10-13-7-4(8(18)14-10)12-2-15(7)9-6(17)5(16)3(27-9)1-26-31(22,23)29-32(24,25)28-30(19,20)21/h2-3,5-6,9,16-17H,1H2,(H,22,23)(H,24,25)(H2,19,20,21)(H3,11,13,14,18)/t3-,5-,6-,9-/m1/s1" +GTP InChIKey InChI 1.03 XKMLYUALXHKNFT-UUOKFMHZSA-N +GTP SMILES_CANONICAL CACTVS 3.370 "NC1=Nc2n(cnc2C(=O)N1)[C@@H]3O[C@H](CO[P](O)(=O)O[P](O)(=O)O[P](O)(O)=O)[C@@H](O)[C@H]3O" +GTP SMILES CACTVS 3.370 "NC1=Nc2n(cnc2C(=O)N1)[CH]3O[CH](CO[P](O)(=O)O[P](O)(=O)O[P](O)(O)=O)[CH](O)[CH]3O" +GTP SMILES_CANONICAL "OpenEye OEToolkits" 1.7.6 "c1nc2c(n1[C@H]3[C@@H]([C@@H]([C@H](O3)CO[P@](=O)(O)O[P@](=O)(O)OP(=O)(O)O)O)O)N=C(NC2=O)N" +GTP SMILES "OpenEye OEToolkits" 1.7.6 "c1nc2c(n1C3C(C(C(O3)COP(=O)(O)OP(=O)(O)OP(=O)(O)O)O)O)N=C(NC2=O)N" +loop_ +_pdbx_chem_comp_description_generator.comp_id +_pdbx_chem_comp_description_generator.program_name +_pdbx_chem_comp_description_generator.program_version +_pdbx_chem_comp_description_generator.descriptor +GTP acedrg 271 "dictionary generator" +GTP acedrg_database 12 "data source" +GTP rdkit 2019.09.1 "Chemoinformatics tool" +GTP refmac5 5.8.0405 "optimization tool" diff --git a/image_analysis/structure_refinement/monomers/H2U.cif b/image_analysis/structure_refinement/monomers/H2U.cif new file mode 100644 index 000000000..4e8fff729 --- /dev/null +++ b/image_analysis/structure_refinement/monomers/H2U.cif @@ -0,0 +1,267 @@ +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +H2U H2U "5,6-DIHYDROURIDINE-5'-MONOPHOSPHATE" RNA 34 21 . + +data_comp_H2U +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +H2U P P P 0 50.726 5.590 34.203 +H2U OP1 O O 0 49.785 6.717 34.586 +H2U OP2 O OP -1 50.408 4.289 34.915 +H2U OP3 O OP -1 50.864 5.422 32.702 +H2U "O5'" O O2 0 52.185 6.036 34.731 +H2U "C5'" C CH2 0 52.783 7.247 34.201 +H2U "C4'" C CH1 0 54.080 7.529 34.920 +H2U "O4'" O O2 0 53.820 7.636 36.343 +H2U "C3'" C CH1 0 55.180 6.469 34.768 +H2U "O3'" O OH1 0 56.455 7.077 34.600 +H2U "C1'" C CH1 0 54.676 6.785 37.073 +H2U "C2'" C CH1 0 55.056 5.687 36.077 +H2U "O2'" O OH1 0 56.271 5.034 36.427 +H2U N1 N NR6 0 53.958 6.335 38.328 +H2U C2 C CR6 0 53.665 7.317 39.260 +H2U O2 O O 0 54.100 8.459 39.144 +H2U N3 N NR16 0 52.842 7.004 40.287 +H2U C4 C CR6 0 52.614 5.723 40.737 +H2U O4 O O 0 51.852 5.514 41.665 +H2U C5 C CH2 0 53.341 4.623 40.030 +H2U C6 C CH2 0 53.582 4.925 38.551 +H2U "H5'" H H 0 52.163 8.008 34.324 +H2U "H5''" H H 0 52.957 7.139 33.234 +H2U "H4'" H H 0 54.420 8.393 34.602 +H2U "H3'" H H 0 54.979 5.876 33.998 +H2U "HO3'" H H 0 57.050 6.470 34.603 +H2U "H1'" H H 0 55.490 7.284 37.333 +H2U "H2'" H H 0 54.331 5.025 35.984 +H2U "HO2'" H H 0 56.337 4.943 37.269 +H2U HN3 H H 0 52.424 7.661 40.692 +H2U H51 H H 0 52.822 3.807 40.107 +H2U H52 H H 0 54.195 4.483 40.469 +H2U H61 H H 0 54.297 4.331 38.228 +H2U H62 H H 0 52.764 4.720 38.043 + +loop_ +_chem_comp_bond.comp_id +_chem_comp_bond.atom_id_1 +_chem_comp_bond.atom_id_2 +_chem_comp_bond.type +_chem_comp_bond.aromatic +_chem_comp_bond.value_dist_nucleus +_chem_comp_bond.value_dist_nucleus_esd +_chem_comp_bond.value_dist +_chem_comp_bond.value_dist_esd +H2U P OP1 DOUBLE n 1.517 0.0192 1.517 0.0192 +H2U P OP2 SINGLE n 1.517 0.0192 1.517 0.0192 +H2U P OP3 SINGLE n 1.517 0.0192 1.517 0.0192 +H2U P "O5'" SINGLE n 1.614 0.0178 1.614 0.0178 +H2U "O5'" "C5'" SINGLE n 1.450 0.0166 1.450 0.0166 +H2U "C5'" "C4'" SINGLE n 1.509 0.0100 1.509 0.0100 +H2U "C4'" "O4'" SINGLE n 1.449 0.0100 1.449 0.0100 +H2U "C4'" "C3'" SINGLE n 1.535 0.0100 1.535 0.0100 +H2U "O4'" "C1'" SINGLE n 1.409 0.0106 1.409 0.0106 +H2U "C3'" "O3'" SINGLE n 1.422 0.0100 1.422 0.0100 +H2U "C3'" "C2'" SINGLE n 1.530 0.0134 1.530 0.0134 +H2U "C1'" "C2'" SINGLE n 1.527 0.0119 1.527 0.0119 +H2U "C1'" N1 SINGLE n 1.489 0.0155 1.489 0.0155 +H2U "C2'" "O2'" SINGLE n 1.420 0.0122 1.420 0.0122 +H2U N1 C2 SINGLE n 1.343 0.0200 1.343 0.0200 +H2U N1 C6 SINGLE n 1.467 0.0100 1.467 0.0100 +H2U C2 O2 DOUBLE n 1.226 0.0110 1.226 0.0110 +H2U C2 N3 SINGLE n 1.343 0.0163 1.343 0.0163 +H2U N3 C4 SINGLE n 1.377 0.0101 1.377 0.0101 +H2U C4 O4 DOUBLE n 1.218 0.0100 1.218 0.0100 +H2U C4 C5 SINGLE n 1.497 0.0100 1.497 0.0100 +H2U C5 C6 SINGLE n 1.525 0.0128 1.525 0.0128 +H2U "C5'" "H5'" SINGLE n 1.089 0.0100 0.989 0.0200 +H2U "C5'" "H5''" SINGLE n 1.089 0.0100 0.989 0.0200 +H2U "C4'" "H4'" SINGLE n 1.089 0.0100 0.981 0.0200 +H2U "C3'" "H3'" SINGLE n 1.089 0.0100 0.992 0.0200 +H2U "O3'" "HO3'" SINGLE n 0.970 0.0120 0.849 0.0200 +H2U "C1'" "H1'" SINGLE n 1.089 0.0100 0.989 0.0200 +H2U "C2'" "H2'" SINGLE n 1.089 0.0100 0.988 0.0200 +H2U "O2'" "HO2'" SINGLE n 0.970 0.0120 0.849 0.0200 +H2U N3 HN3 SINGLE n 1.016 0.0100 0.876 0.0200 +H2U C5 H51 SINGLE n 1.089 0.0100 0.970 0.0100 +H2U C5 H52 SINGLE n 1.089 0.0100 0.970 0.0100 +H2U C6 H61 SINGLE n 1.089 0.0100 0.985 0.0100 +H2U C6 H62 SINGLE n 1.089 0.0100 0.985 0.0100 + +loop_ +_chem_comp_angle.comp_id +_chem_comp_angle.atom_id_1 +_chem_comp_angle.atom_id_2 +_chem_comp_angle.atom_id_3 +_chem_comp_angle.value_angle +_chem_comp_angle.value_angle_esd +H2U OP1 P OP2 112.864 1.69 +H2U OP1 P OP3 112.864 1.69 +H2U OP1 P "O5'" 105.808 2.07 +H2U OP2 P OP3 112.864 1.69 +H2U OP2 P "O5'" 105.808 2.07 +H2U OP3 P "O5'" 105.808 2.07 +H2U P "O5'" "C5'" 118.783 1.50 +H2U "O5'" "C5'" "C4'" 109.342 1.50 +H2U "O5'" "C5'" "H5'" 109.845 1.50 +H2U "O5'" "C5'" "H5''" 109.845 1.50 +H2U "C4'" "C5'" "H5'" 109.624 1.50 +H2U "C4'" "C5'" "H5''" 109.624 1.50 +H2U "H5'" "C5'" "H5''" 108.472 1.50 +H2U "C5'" "C4'" "O4'" 109.123 1.50 +H2U "C5'" "C4'" "C3'" 116.008 1.52 +H2U "C5'" "C4'" "H4'" 108.268 1.50 +H2U "O4'" "C4'" "C3'" 105.508 1.50 +H2U "O4'" "C4'" "H4'" 108.642 1.50 +H2U "C3'" "C4'" "H4'" 109.363 1.86 +H2U "C4'" "O4'" "C1'" 109.926 1.50 +H2U "C4'" "C3'" "O3'" 111.281 2.46 +H2U "C4'" "C3'" "C2'" 102.352 1.50 +H2U "C4'" "C3'" "H3'" 110.452 2.54 +H2U "O3'" "C3'" "C2'" 112.463 2.73 +H2U "O3'" "C3'" "H3'" 110.380 1.67 +H2U "C2'" "C3'" "H3'" 110.255 2.04 +H2U "C3'" "O3'" "HO3'" 108.744 3.00 +H2U "O4'" "C1'" "C2'" 106.204 2.50 +H2U "O4'" "C1'" N1 108.858 1.71 +H2U "O4'" "C1'" "H1'" 109.395 1.50 +H2U "C2'" "C1'" N1 112.110 1.66 +H2U "C2'" "C1'" "H1'" 109.914 1.68 +H2U N1 "C1'" "H1'" 108.795 2.24 +H2U "C3'" "C2'" "C1'" 104.443 2.26 +H2U "C3'" "C2'" "O2'" 112.463 2.73 +H2U "C3'" "C2'" "H2'" 110.255 2.04 +H2U "C1'" "C2'" "O2'" 111.164 2.38 +H2U "C1'" "C2'" "H2'" 110.518 1.74 +H2U "O2'" "C2'" "H2'" 110.259 1.63 +H2U "C2'" "O2'" "HO2'" 109.104 3.00 +H2U "C1'" N1 C2 118.428 3.00 +H2U "C1'" N1 C6 119.226 3.00 +H2U C2 N1 C6 122.347 2.69 +H2U N1 C2 O2 121.078 1.61 +H2U N1 C2 N3 117.002 2.84 +H2U O2 C2 N3 121.921 1.50 +H2U C2 N3 C4 123.512 2.15 +H2U C2 N3 HN3 118.376 1.92 +H2U C4 N3 HN3 118.112 1.50 +H2U N3 C4 O4 120.553 1.50 +H2U N3 C4 C5 116.998 1.50 +H2U O4 C4 C5 122.450 1.72 +H2U C4 C5 C6 112.021 2.38 +H2U C4 C5 H51 108.560 1.50 +H2U C4 C5 H52 108.560 1.50 +H2U C6 C5 H51 108.959 1.50 +H2U C6 C5 H52 108.959 1.50 +H2U H51 C5 H52 108.118 1.50 +H2U N1 C6 C5 110.160 1.50 +H2U N1 C6 H61 109.581 1.50 +H2U N1 C6 H62 109.581 1.50 +H2U C5 C6 H61 109.272 1.50 +H2U C5 C6 H62 109.272 1.50 +H2U H61 C6 H62 108.112 1.50 + +loop_ +_chem_comp_tor.comp_id +_chem_comp_tor.id +_chem_comp_tor.atom_id_1 +_chem_comp_tor.atom_id_2 +_chem_comp_tor.atom_id_3 +_chem_comp_tor.atom_id_4 +_chem_comp_tor.value_angle +_chem_comp_tor.value_angle_esd +_chem_comp_tor.period +H2U C2e-chi "O4'" "C1'" N1 C2 210.000 10.000 6 +H2U C2e-nyu0 "C4'" "O4'" "C1'" "C2'" 340.700 6.300 1 +H2U C2e-nyu1 "O4'" "C1'" "C2'" "C3'" 32.800 4.900 1 +H2U C2e-nyu2 "C1'" "C2'" "C3'" "C4'" 326.9 3.600 1 +H2U C2e-nyu3 "C2'" "C3'" "C4'" "O4'" 22.600 4.500 1 +H2U C2e-nyu4 "C3'" "C4'" "O4'" "C1'" 357.700 6.100 1 +H2U C3e-chi "O4'" "C1'" N1 C2 210.000 10.000 6 +H2U C3e-nyu0 "C4'" "O4'" "C1'" "C2'" 2.8 6.100 1 +H2U C3e-nyu1 "O4'" "C1'" "C2'" "C3'" 335.00 4.900 1 +H2U C3e-nyu2 "C1'" "C2'" "C3'" "C4'" 35.9 2.800 1 +H2U C3e-nyu3 "C2'" "C3'" "C4'" "O4'" 324.700 3.100 1 +H2U C3e-nyu4 "C3'" "C4'" "O4'" "C1'" 20.500 5.100 1 +H2U alpha "C5'" "O5'" P OP3 -60.000 10.00 3 +H2U beta P "O5'" "C5'" "C4'" 180.000 10.00 3 +H2U epsi "C4'" "C3'" "O3'" "HO3'" 180.000 10.00 3 +H2U gamma "O5'" "C5'" "C4'" "C3'" 180.000 10.00 3 +H2U sp3_sp3_52 "C3'" "C2'" "O2'" "HO2'" 180.000 10.00 3 +H2U sp2_sp2_4 O2 C2 N1 "C1'" 0.000 5.0 2 +H2U sp2_sp3_16 "C1'" N1 C6 C5 180.000 10.0 6 +H2U sp2_sp2_7 O2 C2 N3 C4 180.000 5.0 2 +H2U sp2_sp2_11 O4 C4 N3 C2 180.000 5.0 2 +H2U sp2_sp3_4 O4 C4 C5 C6 180.000 10.0 6 +H2U sp3_sp3_25 C4 C5 C6 N1 60.000 10.0 3 + +loop_ +_chem_comp_chir.comp_id +_chem_comp_chir.id +_chem_comp_chir.atom_id_centre +_chem_comp_chir.atom_id_1 +_chem_comp_chir.atom_id_2 +_chem_comp_chir.atom_id_3 +_chem_comp_chir.volume_sign +H2U chir_1 P "O5'" OP2 OP3 both +H2U chir_2 "C4'" "O4'" "C3'" "C5'" negative +H2U chir_3 "C3'" "O3'" "C4'" "C2'" positive +H2U chir_4 "C1'" "O4'" N1 "C2'" negative +H2U chir_5 "C2'" "O2'" "C1'" "C3'" negative + +loop_ +_chem_comp_plane_atom.comp_id +_chem_comp_plane_atom.plane_id +_chem_comp_plane_atom.atom_id +_chem_comp_plane_atom.dist_esd +H2U plan-1 "C1'" 0.020 +H2U plan-1 C2 0.020 +H2U plan-1 C6 0.020 +H2U plan-1 N1 0.020 +H2U plan-2 C2 0.020 +H2U plan-2 N1 0.020 +H2U plan-2 N3 0.020 +H2U plan-2 O2 0.020 +H2U plan-3 C2 0.020 +H2U plan-3 C4 0.020 +H2U plan-3 HN3 0.020 +H2U plan-3 N3 0.020 +H2U plan-4 C4 0.020 +H2U plan-4 C5 0.020 +H2U plan-4 N3 0.020 +H2U plan-4 O4 0.020 + +loop_ +_pdbx_chem_comp_descriptor.comp_id +_pdbx_chem_comp_descriptor.type +_pdbx_chem_comp_descriptor.program +_pdbx_chem_comp_descriptor.program_version +_pdbx_chem_comp_descriptor.descriptor +H2U SMILES ACDLabs 10.04 O=C1N(CCC(=O)N1)C2OC(C(O)C2O)COP(=O)(O)O +H2U SMILES_CANONICAL CACTVS 3.341 O[C@H]1[C@@H](O)[C@@H](O[C@@H]1CO[P](O)(O)=O)N2CCC(=O)NC2=O +H2U SMILES CACTVS 3.341 O[CH]1[CH](O)[CH](O[CH]1CO[P](O)(O)=O)N2CCC(=O)NC2=O +H2U SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 C1CN(C(=O)NC1=O)[C@H]2[C@@H]([C@@H]([C@H](O2)COP(=O)(O)O)O)O +H2U SMILES "OpenEye OEToolkits" 1.5.0 C1CN(C(=O)NC1=O)C2C(C(C(O2)COP(=O)(O)O)O)O +H2U InChI InChI 1.03 InChI=1S/C9H15N2O9P/c12-5-1-2-11(9(15)10-5)8-7(14)6(13)4(20-8)3-19-21(16,17)18/h4,6-8,13-14H,1-3H2,(H,10,12,15)(H2,16,17,18)/t4-,6-,7-,8-/m1/s1 +H2U InChIKey InChI 1.03 NBWDKGJHOHJBRJ-XVFCMESISA-N + +loop_ +_pdbx_chem_comp_description_generator.comp_id +_pdbx_chem_comp_description_generator.program_name +_pdbx_chem_comp_description_generator.program_version +_pdbx_chem_comp_description_generator.descriptor +H2U acedrg 243 "dictionary generator" +H2U acedrg_database 11 "data source" +H2U rdkit 2017.03.2 "Chemoinformatics tool" +H2U refmac5 5.8.0238 "optimization tool" diff --git a/image_analysis/structure_refinement/monomers/HEC.cif b/image_analysis/structure_refinement/monomers/HEC.cif new file mode 100644 index 000000000..95ec1620f --- /dev/null +++ b/image_analysis/structure_refinement/monomers/HEC.cif @@ -0,0 +1,689 @@ +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +HEC HEC "HEME C" NON-POLYMER 74 42 . + +data_comp_HEC +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.alt_atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +HEC FE FE FE FE 2.00 -0.636 0.011 0.178 +HEC CHA CHA C C1 0 2.705 0.563 -0.191 +HEC CHB CHB C C1 0 -1.246 3.264 -0.651 +HEC CHC CHC C C1 0 -3.983 -0.606 0.238 +HEC CHD CHD C C1 0 -0.013 -3.313 0.643 +HEC NA NA N NRD5 -1 0.536 1.644 -0.354 +HEC C1A C1A C CR5 0 1.894 1.679 -0.418 +HEC C2A C2A C CR5 0 2.308 2.957 -0.744 +HEC C3A C3A C CR5 0 1.186 3.724 -0.874 +HEC C4A C4A C CR5 0 0.106 2.908 -0.630 +HEC CMA CMA C CH3 0 1.153 5.194 -1.212 +HEC CAA CAA C CH2 0 3.737 3.412 -0.906 +HEC CBA CBA C CH2 0 4.414 3.848 0.391 +HEC CGA CGA C C 0 4.256 5.326 0.738 +HEC O1A O1A O O 0 5.052 6.137 0.220 +HEC O2A O2A O OC -1 3.339 5.649 1.522 +HEC NB NB N NRD5 0 -2.344 1.145 -0.176 +HEC C1B C1B C CR5 0 -2.390 2.485 -0.453 +HEC C2B C2B C CR5 0 -3.695 2.917 -0.499 +HEC C3B C3B C CR5 0 -4.521 1.785 -0.231 +HEC C4B C4B C CR5 0 -3.632 0.716 -0.043 +HEC CMB CMB C CH3 0 -4.205 4.311 -0.764 +HEC CAB CAB C CH1 -1 -5.944 1.794 -0.181 +HEC CBB CBB C CH3 0 -6.457 1.964 1.230 +HEC NC NC N NRD5 -1 -1.812 -1.692 0.391 +HEC C1C C1C C CR5 0 -3.180 -1.736 0.415 +HEC C2C C2C C CR5 0 -3.614 -3.025 0.618 +HEC C3C C3C C CR5 0 -2.443 -3.843 0.743 +HEC C4C C4C C CR5 0 -1.365 -2.963 0.597 +HEC CMC CMC C CH3 0 -5.039 -3.509 0.709 +HEC CAC CAC C CH1 -1 -2.369 -5.248 0.970 +HEC CBC CBC C CH3 0 -2.389 -6.034 -0.319 +HEC ND ND N NRD5 0 1.066 -1.186 0.196 +HEC C1D C1D C CR5 0 1.125 -2.521 0.464 +HEC C2D C2D C CR5 0 2.438 -2.923 0.528 +HEC C3D C3D C CR5 0 3.211 -1.822 0.301 +HEC C4D C4D C CR5 0 2.353 -0.759 0.089 +HEC CMD CMD C CH3 0 2.947 -4.314 0.810 +HEC CAD CAD C CH2 0 4.718 -1.775 0.271 +HEC CBD CBD C CH2 0 5.319 -1.958 -1.119 +HEC CGD CGD C C 0 6.842 -1.867 -1.168 +HEC O1D O1D O O 0 7.354 -0.784 -1.521 +HEC O2D O2D O OC -1 7.499 -2.881 -0.852 +HEC HHA HHA H H 0 3.635 0.731 -0.226 +HEC HHB HHB H H 0 -1.412 4.181 -0.802 +HEC HHC HHC H H 0 -4.913 -0.752 0.339 +HEC HHD HHD H H 0 0.158 -4.224 0.834 +HEC HMA1 HMA1 H H 0 0.311 5.421 -1.635 +HEC HMA2 HMA2 H H 0 1.871 5.414 -1.827 +HEC HMA3 HMA3 H H 0 1.255 5.717 -0.400 +HEC HAA1 HAA1 H H 0 3.782 4.153 -1.549 +HEC HAA2 HAA2 H H 0 4.266 2.686 -1.303 +HEC HBA1 HBA1 H H 0 5.376 3.645 0.328 +HEC HBA2 HBA2 H H 0 4.050 3.313 1.134 +HEC HMB1 HMB1 H H 0 -5.042 4.275 -1.254 +HEC HMB2 HMB2 H H 0 -3.561 4.806 -1.294 +HEC HMB3 HMB3 H H 0 -4.346 4.770 0.080 +HEC HAB HAB H H 0 -6.300 1.007 -0.566 +HEC HBB1 HBB1 H H 0 -7.428 1.953 1.202 +HEC HBB2 HBB2 H H 0 -6.133 2.815 1.569 +HEC HBB3 HBB3 H H 0 -6.120 1.229 1.767 +HEC HMC1 HMC1 H H 0 -5.098 -4.434 0.423 +HEC HMC2 HMC2 H H 0 -5.609 -2.971 0.136 +HEC HMC3 HMC3 H H 0 -5.349 -3.437 1.627 +HEC HAC HAC H H 0 -3.040 -5.552 1.562 +HEC HBC1 HBC1 H H 0 -2.345 -6.978 -0.098 +HEC HBC2 HBC2 H H 0 -1.619 -5.768 -0.848 +HEC HBC3 HBC3 H H 0 -3.215 -5.828 -0.786 +HEC HMD1 HMD1 H H 0 3.793 -4.460 0.359 +HEC HMD2 HMD2 H H 0 2.311 -4.973 0.490 +HEC HMD3 HMD3 H H 0 3.070 -4.427 1.767 +HEC HAD1 HAD1 H H 0 5.084 -2.466 0.865 +HEC HAD2 HAD2 H H 0 5.025 -0.915 0.634 +HEC HBD1 HBD1 H H 0 4.945 -1.271 -1.719 +HEC HBD2 HBD2 H H 0 5.046 -2.837 -1.469 + +loop_ +_chem_comp_tree.comp_id +_chem_comp_tree.atom_id +_chem_comp_tree.atom_back +_chem_comp_tree.atom_forward +_chem_comp_tree.connect_type +HEC O2D n/a CGD START +HEC CGD O2D CBD . +HEC O1D CGD . . +HEC CBD CGD CAD . +HEC HBD1 CBD . . +HEC HBD2 CBD . . +HEC CAD CBD C3D . +HEC HAD1 CAD . . +HEC HAD2 CAD . . +HEC C3D CAD C4D . +HEC C2D C3D C1D . +HEC CMD C2D HMD1 . +HEC HMD3 CMD . . +HEC HMD2 CMD . . +HEC HMD1 CMD . . +HEC C1D C2D CHD . +HEC CHD C1D HHD . +HEC HHD CHD . . +HEC C4D C3D ND . +HEC CHA C4D HHA . +HEC HHA CHA . . +HEC ND C4D FE . +HEC FE ND NA . +HEC NB FE C4B . +HEC C4B NB C3B . +HEC C3B C4B C2B . +HEC CAB C3B CBB . +HEC HAB CAB . . +HEC CBB CAB HBB1 . +HEC HBB3 CBB . . +HEC HBB2 CBB . . +HEC HBB1 CBB . . +HEC C2B C3B C1B . +HEC CMB C2B HMB1 . +HEC HMB3 CMB . . +HEC HMB2 CMB . . +HEC HMB1 CMB . . +HEC C1B C2B CHB . +HEC CHB C1B HHB . +HEC HHB CHB . . +HEC NC FE C4C . +HEC C4C NC C3C . +HEC C3C C4C C2C . +HEC CAC C3C CBC . +HEC HAC CAC . . +HEC CBC CAC HBC1 . +HEC HBC3 CBC . . +HEC HBC2 CBC . . +HEC HBC1 CBC . . +HEC C2C C3C C1C . +HEC CMC C2C HMC1 . +HEC HMC3 CMC . . +HEC HMC2 CMC . . +HEC HMC1 CMC . . +HEC C1C C2C CHC . +HEC CHC C1C HHC . +HEC HHC CHC . . +HEC NA FE C4A . +HEC C4A NA C3A . +HEC C3A C4A C2A . +HEC CMA C3A HMA1 . +HEC HMA3 CMA . . +HEC HMA2 CMA . . +HEC HMA1 CMA . . +HEC C2A C3A CAA . +HEC C1A C2A . . +HEC CAA C2A CBA . +HEC HAA1 CAA . . +HEC HAA2 CAA . . +HEC CBA CAA CGA . +HEC HBA1 CBA . . +HEC HBA2 CBA . . +HEC CGA CBA O2A . +HEC O1A CGA . . +HEC O2A CGA . END +HEC CHA C1A . ADD +HEC CHB C4A . ADD +HEC CHC C4B . ADD +HEC CHD C4C . ADD +HEC NA C1A . ADD +HEC NB C1B . ADD +HEC NC C1C . ADD +HEC ND C1D . ADD + +loop_ +_chem_comp_acedrg.comp_id +_chem_comp_acedrg.atom_id +_chem_comp_acedrg.atom_type +HEC CHA C(C[5a]C[5a]N[5a])2(H) +HEC CHB C(C[5a]C[5a]N[5a])2(H) +HEC CHC C(C[5a]C[5a]N[5a])2(H) +HEC CHD C(C[5a]C[5a]N[5a])2(H) +HEC NA N[5a](C[5a]C[5a]C)2{2|C<4>} +HEC C1A C[5a](C[5a]C[5a]C)(N[5a]C[5a])(CC[5a]H){1|C<3>,1|C<4>} +HEC C2A C[5a](C[5a]C[5a]C)(C[5a]N[5a]C)(CCHH){1|C<3>} +HEC C3A C[5a](C[5a]C[5a]C)(C[5a]N[5a]C)(CH3){1|C<3>} +HEC C4A C[5a](C[5a]C[5a]C)(N[5a]C[5a])(CC[5a]H){1|C<3>,1|C<4>} +HEC CMA C(C[5a]C[5a]2)(H)3 +HEC CAA C(C[5a]C[5a]2)(CCHH)(H)2 +HEC CBA C(CC[5a]HH)(COO)(H)2 +HEC CGA C(CCHH)(O)2 +HEC O1A O(CCO) +HEC O2A O(CCO) +HEC NB N[5a](C[5a]C[5a]C)2{1|C<3>,1|C<4>} +HEC C1B C[5a](C[5a]C[5a]C)(N[5a]C[5a])(CC[5a]H){2|C<3>} +HEC C2B C[5a](C[5a]C[5a]C)(C[5a]N[5a]C)(CH3){1|C<3>} +HEC C3B C[5a](C[5a]C[5a]C)(C[5a]N[5a]C)(CCH){1|C<3>} +HEC C4B C[5a](C[5a]C[5a]C)(N[5a]C[5a])(CC[5a]H){1|C<3>,1|C<4>} +HEC CMB C(C[5a]C[5a]2)(H)3 +HEC CAB C(C[5a]C[5a]2)(CH3)(H) +HEC CBB C(CC[5a]H)(H)3 +HEC NC N[5a](C[5a]C[5a]C)2{1|C<3>,1|C<4>} +HEC C1C C[5a](C[5a]C[5a]C)(N[5a]C[5a])(CC[5a]H){2|C<3>} +HEC C2C C[5a](C[5a]C[5a]C)(C[5a]N[5a]C)(CH3){1|C<3>} +HEC C3C C[5a](C[5a]C[5a]C)(C[5a]N[5a]C)(CCH){1|C<3>} +HEC C4C C[5a](C[5a]C[5a]C)(N[5a]C[5a])(CC[5a]H){1|C<3>,1|C<4>} +HEC CMC C(C[5a]C[5a]2)(H)3 +HEC CAC C(C[5a]C[5a]2)(CH3)(H) +HEC CBC C(CC[5a]H)(H)3 +HEC ND N[5a](C[5a]C[5a]C)2{2|C<4>} +HEC C1D C[5a](C[5a]C[5a]C)(N[5a]C[5a])(CC[5a]H){1|C<3>,1|C<4>} +HEC C2D C[5a](C[5a]C[5a]C)(C[5a]N[5a]C)(CH3){1|C<3>} +HEC C3D C[5a](C[5a]C[5a]C)(C[5a]N[5a]C)(CCHH){1|C<3>} +HEC C4D C[5a](C[5a]C[5a]C)(N[5a]C[5a])(CC[5a]H){1|C<3>,1|C<4>} +HEC CMD C(C[5a]C[5a]2)(H)3 +HEC CAD C(C[5a]C[5a]2)(CCHH)(H)2 +HEC CBD C(CC[5a]HH)(COO)(H)2 +HEC CGD C(CCHH)(O)2 +HEC O1D O(CCO) +HEC O2D O(CCO) +HEC HHA H(CC[5a]2) +HEC HHB H(CC[5a]2) +HEC HHC H(CC[5a]2) +HEC HHD H(CC[5a]2) +HEC HMA1 H(CC[5a]HH) +HEC HMA2 H(CC[5a]HH) +HEC HMA3 H(CC[5a]HH) +HEC HAA1 H(CC[5a]CH) +HEC HAA2 H(CC[5a]CH) +HEC HBA1 H(CCCH) +HEC HBA2 H(CCCH) +HEC HMB1 H(CC[5a]HH) +HEC HMB2 H(CC[5a]HH) +HEC HMB3 H(CC[5a]HH) +HEC HAB H(CC[5a]C) +HEC HBB1 H(CCHH) +HEC HBB2 H(CCHH) +HEC HBB3 H(CCHH) +HEC HMC1 H(CC[5a]HH) +HEC HMC2 H(CC[5a]HH) +HEC HMC3 H(CC[5a]HH) +HEC HAC H(CC[5a]C) +HEC HBC1 H(CCHH) +HEC HBC2 H(CCHH) +HEC HBC3 H(CCHH) +HEC HMD1 H(CC[5a]HH) +HEC HMD2 H(CC[5a]HH) +HEC HMD3 H(CC[5a]HH) +HEC HAD1 H(CC[5a]CH) +HEC HAD2 H(CC[5a]CH) +HEC HBD1 H(CCCH) +HEC HBD2 H(CCCH) + +loop_ +_chem_comp_bond.comp_id +_chem_comp_bond.atom_id_1 +_chem_comp_bond.atom_id_2 +_chem_comp_bond.value_order +_chem_comp_bond.pdbx_aromatic_flag +_chem_comp_bond.value_dist_nucleus +_chem_comp_bond.value_dist_nucleus_esd +_chem_comp_bond.value_dist +_chem_comp_bond.value_dist_esd +HEC FE NA SINGLE n 1.9 0.06 1.9 0.06 +HEC FE NB SINGLE n 1.9 0.06 1.9 0.06 +HEC FE NC SINGLE n 1.9 0.06 1.9 0.06 +HEC FE ND SINGLE n 1.9 0.06 1.9 0.06 +HEC CHA C1A DOUBLE n 1.393 0.0200 1.393 0.0200 +HEC CHA C4D SINGLE n 1.393 0.0200 1.393 0.0200 +HEC CHB C4A DOUBLE n 1.393 0.0200 1.393 0.0200 +HEC CHB C1B SINGLE n 1.393 0.0200 1.393 0.0200 +HEC CHC C4B DOUBLE n 1.393 0.0200 1.393 0.0200 +HEC CHC C1C SINGLE n 1.393 0.0200 1.393 0.0200 +HEC CHD C4C SINGLE n 1.393 0.0200 1.393 0.0200 +HEC CHD C1D DOUBLE n 1.393 0.0200 1.393 0.0200 +HEC NA C1A SINGLE y 1.350 0.0200 1.350 0.0200 +HEC NA C4A SINGLE y 1.350 0.0200 1.350 0.0200 +HEC C1A C2A SINGLE y 1.374 0.0147 1.374 0.0147 +HEC C2A C3A DOUBLE y 1.361 0.0149 1.361 0.0149 +HEC C2A CAA SINGLE n 1.502 0.0100 1.502 0.0100 +HEC C3A C4A SINGLE y 1.361 0.0165 1.361 0.0165 +HEC C3A CMA SINGLE n 1.501 0.0106 1.501 0.0106 +HEC CAA CBA SINGLE n 1.526 0.0100 1.526 0.0100 +HEC CBA CGA SINGLE n 1.526 0.0100 1.526 0.0100 +HEC CGA O1A DOUBLE n 1.249 0.0161 1.249 0.0161 +HEC CGA O2A SINGLE n 1.249 0.0161 1.249 0.0161 +HEC NB C1B DOUBLE y 1.350 0.0200 1.350 0.0200 +HEC NB C4B SINGLE y 1.350 0.0200 1.350 0.0200 +HEC C1B C2B SINGLE y 1.361 0.0165 1.361 0.0165 +HEC C2B C3B DOUBLE y 1.436 0.0200 1.436 0.0200 +HEC C2B CMB SINGLE n 1.501 0.0106 1.501 0.0106 +HEC C3B C4B SINGLE y 1.393 0.0200 1.393 0.0200 +HEC C3B CAB SINGLE n 1.407 0.0200 1.407 0.0200 +HEC CAB CBB SINGLE n 1.506 0.0200 1.506 0.0200 +HEC NC C1C SINGLE y 1.350 0.0200 1.350 0.0200 +HEC NC C4C SINGLE y 1.350 0.0200 1.350 0.0200 +HEC C1C C2C DOUBLE y 1.361 0.0165 1.361 0.0165 +HEC C2C C3C SINGLE y 1.436 0.0200 1.436 0.0200 +HEC C2C CMC SINGLE n 1.501 0.0106 1.501 0.0106 +HEC C3C C4C DOUBLE y 1.393 0.0200 1.393 0.0200 +HEC C3C CAC SINGLE n 1.407 0.0200 1.407 0.0200 +HEC CAC CBC SINGLE n 1.506 0.0200 1.506 0.0200 +HEC ND C1D SINGLE y 1.350 0.0200 1.350 0.0200 +HEC ND C4D DOUBLE y 1.350 0.0200 1.350 0.0200 +HEC C1D C2D SINGLE y 1.361 0.0165 1.361 0.0165 +HEC C2D C3D DOUBLE y 1.361 0.0149 1.361 0.0149 +HEC C2D CMD SINGLE n 1.501 0.0106 1.501 0.0106 +HEC C3D C4D SINGLE y 1.374 0.0147 1.374 0.0147 +HEC C3D CAD SINGLE n 1.502 0.0100 1.502 0.0100 +HEC CAD CBD SINGLE n 1.526 0.0100 1.526 0.0100 +HEC CBD CGD SINGLE n 1.526 0.0100 1.526 0.0100 +HEC CGD O1D DOUBLE n 1.249 0.0161 1.249 0.0161 +HEC CGD O2D SINGLE n 1.249 0.0161 1.249 0.0161 +HEC CHA HHA SINGLE n 1.085 0.0150 0.948 0.0107 +HEC CHB HHB SINGLE n 1.085 0.0150 0.948 0.0107 +HEC CHC HHC SINGLE n 1.085 0.0150 0.948 0.0107 +HEC CHD HHD SINGLE n 1.085 0.0150 0.948 0.0107 +HEC CMA HMA1 SINGLE n 1.092 0.0100 0.971 0.0135 +HEC CMA HMA2 SINGLE n 1.092 0.0100 0.971 0.0135 +HEC CMA HMA3 SINGLE n 1.092 0.0100 0.971 0.0135 +HEC CAA HAA1 SINGLE n 1.092 0.0100 0.983 0.0149 +HEC CAA HAA2 SINGLE n 1.092 0.0100 0.983 0.0149 +HEC CBA HBA1 SINGLE n 1.092 0.0100 0.985 0.0125 +HEC CBA HBA2 SINGLE n 1.092 0.0100 0.985 0.0125 +HEC CMB HMB1 SINGLE n 1.092 0.0100 0.971 0.0135 +HEC CMB HMB2 SINGLE n 1.092 0.0100 0.971 0.0135 +HEC CMB HMB3 SINGLE n 1.092 0.0100 0.971 0.0135 +HEC CAB HAB SINGLE n 1.092 0.0100 0.945 0.0129 +HEC CBB HBB1 SINGLE n 1.092 0.0100 0.971 0.0160 +HEC CBB HBB2 SINGLE n 1.092 0.0100 0.971 0.0160 +HEC CBB HBB3 SINGLE n 1.092 0.0100 0.971 0.0160 +HEC CMC HMC1 SINGLE n 1.092 0.0100 0.971 0.0135 +HEC CMC HMC2 SINGLE n 1.092 0.0100 0.971 0.0135 +HEC CMC HMC3 SINGLE n 1.092 0.0100 0.971 0.0135 +HEC CAC HAC SINGLE n 1.092 0.0100 0.945 0.0129 +HEC CBC HBC1 SINGLE n 1.092 0.0100 0.971 0.0160 +HEC CBC HBC2 SINGLE n 1.092 0.0100 0.971 0.0160 +HEC CBC HBC3 SINGLE n 1.092 0.0100 0.971 0.0160 +HEC CMD HMD1 SINGLE n 1.092 0.0100 0.971 0.0135 +HEC CMD HMD2 SINGLE n 1.092 0.0100 0.971 0.0135 +HEC CMD HMD3 SINGLE n 1.092 0.0100 0.971 0.0135 +HEC CAD HAD1 SINGLE n 1.092 0.0100 0.983 0.0149 +HEC CAD HAD2 SINGLE n 1.092 0.0100 0.983 0.0149 +HEC CBD HBD1 SINGLE n 1.092 0.0100 0.985 0.0125 +HEC CBD HBD2 SINGLE n 1.092 0.0100 0.985 0.0125 + +loop_ +_chem_comp_angle.comp_id +_chem_comp_angle.atom_id_1 +_chem_comp_angle.atom_id_2 +_chem_comp_angle.atom_id_3 +_chem_comp_angle.value_angle +_chem_comp_angle.value_angle_esd +HEC FE NA C1A 127.3755 5.0 +HEC FE NA C4A 127.3755 5.0 +HEC FE NB C1B 127.1020 5.0 +HEC FE NB C4B 127.1020 5.0 +HEC FE NC C1C 127.1020 5.0 +HEC FE NC C4C 127.1020 5.0 +HEC FE ND C1D 127.3755 5.0 +HEC FE ND C4D 127.3755 5.0 +HEC C1A CHA C4D 124.237 3.00 +HEC C1A CHA HHA 117.882 3.00 +HEC C4D CHA HHA 117.882 3.00 +HEC C4A CHB C1B 124.237 3.00 +HEC C4A CHB HHB 117.882 3.00 +HEC C1B CHB HHB 117.882 3.00 +HEC C4B CHC C1C 124.237 3.00 +HEC C4B CHC HHC 117.882 3.00 +HEC C1C CHC HHC 117.882 3.00 +HEC C4C CHD C1D 124.237 3.00 +HEC C4C CHD HHD 117.882 3.00 +HEC C1D CHD HHD 117.882 3.00 +HEC C1A NA C4A 105.249 3.00 +HEC CHA C1A NA 122.751 3.00 +HEC CHA C1A C2A 128.506 3.00 +HEC NA C1A C2A 108.743 1.50 +HEC C1A C2A C3A 108.632 3.00 +HEC C1A C2A CAA 125.377 3.00 +HEC C3A C2A CAA 125.990 1.50 +HEC C2A C3A C4A 108.632 3.00 +HEC C2A C3A CMA 124.744 3.00 +HEC C4A C3A CMA 126.624 1.50 +HEC CHB C4A NA 122.751 3.00 +HEC CHB C4A C3A 128.506 3.00 +HEC NA C4A C3A 108.743 1.50 +HEC C3A CMA HMA1 109.572 1.50 +HEC C3A CMA HMA2 109.572 1.50 +HEC C3A CMA HMA3 109.572 1.50 +HEC HMA1 CMA HMA2 109.322 1.87 +HEC HMA1 CMA HMA3 109.322 1.87 +HEC HMA2 CMA HMA3 109.322 1.87 +HEC C2A CAA CBA 113.932 3.00 +HEC C2A CAA HAA1 109.001 1.50 +HEC C2A CAA HAA2 109.001 1.50 +HEC CBA CAA HAA1 108.631 1.50 +HEC CBA CAA HAA2 108.631 1.50 +HEC HAA1 CAA HAA2 107.419 2.31 +HEC CAA CBA CGA 114.716 3.00 +HEC CAA CBA HBA1 108.790 1.50 +HEC CAA CBA HBA2 108.790 1.50 +HEC CGA CBA HBA1 108.586 1.50 +HEC CGA CBA HBA2 108.586 1.50 +HEC HBA1 CBA HBA2 107.505 1.50 +HEC CBA CGA O1A 117.968 3.00 +HEC CBA CGA O2A 117.968 3.00 +HEC O1A CGA O2A 124.063 1.82 +HEC C1B NB C4B 105.796 3.00 +HEC CHB C1B NB 122.477 3.00 +HEC CHB C1B C2B 128.232 3.00 +HEC NB C1B C2B 109.291 1.50 +HEC C1B C2B C3B 108.186 3.00 +HEC C1B C2B CMB 126.778 1.50 +HEC C3B C2B CMB 125.036 3.00 +HEC C2B C3B C4B 107.432 3.00 +HEC C2B C3B CAB 126.284 3.00 +HEC C4B C3B CAB 126.284 3.00 +HEC CHC C4B NB 121.757 3.00 +HEC CHC C4B C3B 128.949 3.00 +HEC NB C4B C3B 109.294 2.29 +HEC C2B CMB HMB1 109.572 1.50 +HEC C2B CMB HMB2 109.572 1.50 +HEC C2B CMB HMB3 109.572 1.50 +HEC HMB1 CMB HMB2 109.322 1.87 +HEC HMB1 CMB HMB3 109.322 1.87 +HEC HMB2 CMB HMB3 109.322 1.87 +HEC C3B CAB CBB 109.471 3.00 +HEC C3B CAB HAB 109.471 3.00 +HEC CBB CAB HAB 109.471 3.00 +HEC CAB CBB HBB1 109.211 1.50 +HEC CAB CBB HBB2 109.211 1.50 +HEC CAB CBB HBB3 109.211 1.50 +HEC HBB1 CBB HBB2 111.860 1.50 +HEC HBB1 CBB HBB3 111.860 1.50 +HEC HBB2 CBB HBB3 111.860 1.50 +HEC C1C NC C4C 105.796 3.00 +HEC CHC C1C NC 122.477 3.00 +HEC CHC C1C C2C 128.232 3.00 +HEC NC C1C C2C 109.291 1.50 +HEC C1C C2C C3C 108.186 3.00 +HEC C1C C2C CMC 126.778 1.50 +HEC C3C C2C CMC 125.036 3.00 +HEC C2C C3C C4C 107.432 3.00 +HEC C2C C3C CAC 126.284 3.00 +HEC C4C C3C CAC 126.284 3.00 +HEC CHD C4C NC 121.757 3.00 +HEC CHD C4C C3C 128.949 3.00 +HEC NC C4C C3C 109.294 2.29 +HEC C2C CMC HMC1 109.572 1.50 +HEC C2C CMC HMC2 109.572 1.50 +HEC C2C CMC HMC3 109.572 1.50 +HEC HMC1 CMC HMC2 109.322 1.87 +HEC HMC1 CMC HMC3 109.322 1.87 +HEC HMC2 CMC HMC3 109.322 1.87 +HEC C3C CAC CBC 109.471 3.00 +HEC C3C CAC HAC 109.471 3.00 +HEC CBC CAC HAC 109.471 3.00 +HEC CAC CBC HBC1 109.211 1.50 +HEC CAC CBC HBC2 109.211 1.50 +HEC CAC CBC HBC3 109.211 1.50 +HEC HBC1 CBC HBC2 111.860 1.50 +HEC HBC1 CBC HBC3 111.860 1.50 +HEC HBC2 CBC HBC3 111.860 1.50 +HEC C1D ND C4D 105.249 3.00 +HEC CHD C1D ND 122.751 3.00 +HEC CHD C1D C2D 128.506 3.00 +HEC ND C1D C2D 108.743 1.50 +HEC C1D C2D C3D 108.632 3.00 +HEC C1D C2D CMD 126.624 1.50 +HEC C3D C2D CMD 124.744 3.00 +HEC C2D C3D C4D 108.632 3.00 +HEC C2D C3D CAD 125.990 1.50 +HEC C4D C3D CAD 125.377 3.00 +HEC CHA C4D ND 122.751 3.00 +HEC CHA C4D C3D 128.506 3.00 +HEC ND C4D C3D 108.743 1.50 +HEC C2D CMD HMD1 109.572 1.50 +HEC C2D CMD HMD2 109.572 1.50 +HEC C2D CMD HMD3 109.572 1.50 +HEC HMD1 CMD HMD2 109.322 1.87 +HEC HMD1 CMD HMD3 109.322 1.87 +HEC HMD2 CMD HMD3 109.322 1.87 +HEC C3D CAD CBD 113.932 3.00 +HEC C3D CAD HAD1 109.001 1.50 +HEC C3D CAD HAD2 109.001 1.50 +HEC CBD CAD HAD1 108.631 1.50 +HEC CBD CAD HAD2 108.631 1.50 +HEC HAD1 CAD HAD2 107.419 2.31 +HEC CAD CBD CGD 114.716 3.00 +HEC CAD CBD HBD1 108.790 1.50 +HEC CAD CBD HBD2 108.790 1.50 +HEC CGD CBD HBD1 108.586 1.50 +HEC CGD CBD HBD2 108.586 1.50 +HEC HBD1 CBD HBD2 107.505 1.50 +HEC CBD CGD O1D 117.968 3.00 +HEC CBD CGD O2D 117.968 3.00 +HEC O1D CGD O2D 124.063 1.82 +HEC NA FE NB 87.8 5.52 +HEC NA FE NC 157.26 7.8 +HEC NA FE ND 87.8 5.52 +HEC NB FE NC 87.8 5.52 +HEC NB FE ND 157.26 7.8 +HEC NC FE ND 87.8 5.52 + +loop_ +_chem_comp_tor.comp_id +_chem_comp_tor.id +_chem_comp_tor.atom_id_1 +_chem_comp_tor.atom_id_2 +_chem_comp_tor.atom_id_3 +_chem_comp_tor.atom_id_4 +_chem_comp_tor.value_angle +_chem_comp_tor.value_angle_esd +_chem_comp_tor.period +HEC sp2_sp2_1 ND C4D CHA C1A 0.000 5.0 2 +HEC sp2_sp2_2 NA C1A CHA C4D 0.000 5.0 2 +HEC sp3_sp3_1 C2A CAA CBA CGA 180.000 10.0 3 +HEC sp2_sp3_1 O1A CGA CBA CAA 120.000 20.0 6 +HEC const_0 CHB C1B NB C4B 180.000 0.0 1 +HEC const_1 CHC C4B NB C1B 180.000 0.0 1 +HEC const_2 CHB C1B C2B CMB 0.000 0.0 1 +HEC const_3 CMB C2B C3B CAB 0.000 0.0 1 +HEC sp2_sp3_2 C1B C2B CMB HMB1 150.000 20.0 6 +HEC const_4 CAB C3B C4B CHC 0.000 0.0 1 +HEC sp2_sp3_3 C2B C3B CAB CBB -90.000 20.0 6 +HEC sp2_sp2_3 NB C1B CHB C4A 0.000 5.0 2 +HEC sp2_sp2_4 NA C4A CHB C1B 0.000 5.0 2 +HEC sp3_sp3_2 C3B CAB CBB HBB1 180.000 10.0 3 +HEC const_5 CHC C1C NC C4C 180.000 0.0 1 +HEC const_6 CHD C4C NC C1C 180.000 0.0 1 +HEC const_7 CHC C1C C2C CMC 0.000 0.0 1 +HEC const_8 CMC C2C C3C CAC 0.000 0.0 1 +HEC sp2_sp3_4 C1C C2C CMC HMC1 150.000 20.0 6 +HEC const_9 CAC C3C C4C CHD 0.000 0.0 1 +HEC sp2_sp3_5 C2C C3C CAC CBC -90.000 20.0 6 +HEC sp3_sp3_3 C3C CAC CBC HBC1 180.000 10.0 3 +HEC sp2_sp2_5 NB C4B CHC C1C 0.000 5.0 2 +HEC sp2_sp2_6 NC C1C CHC C4B 0.000 5.0 2 +HEC const_10 CHD C1D ND C4D 180.000 0.0 1 +HEC const_11 CHA C4D ND C1D 180.000 0.0 1 +HEC const_12 CHD C1D C2D CMD 0.000 0.0 1 +HEC const_13 CMD C2D C3D CAD 0.000 0.0 1 +HEC sp2_sp3_6 C1D C2D CMD HMD1 150.000 20.0 6 +HEC const_14 CAD C3D C4D CHA 0.000 0.0 1 +HEC sp2_sp3_7 C2D C3D CAD CBD -90.000 20.0 6 +HEC sp3_sp3_4 C3D CAD CBD CGD 180.000 10.0 3 +HEC sp2_sp3_8 O1D CGD CBD CAD 120.000 20.0 6 +HEC sp2_sp2_7 NC C4C CHD C1D 0.000 5.0 2 +HEC sp2_sp2_8 ND C1D CHD C4C 0.000 5.0 2 +HEC const_15 CHA C1A NA C4A 180.000 0.0 1 +HEC const_16 CHB C4A NA C1A 180.000 0.0 1 +HEC const_17 CHA C1A C2A CAA 0.000 0.0 1 +HEC sp2_sp3_9 C1A C2A CAA CBA -90.000 20.0 6 +HEC const_18 CAA C2A C3A CMA 0.000 0.0 1 +HEC const_19 CMA C3A C4A CHB 0.000 0.0 1 +HEC sp2_sp3_10 C2A C3A CMA HMA1 150.000 20.0 6 + +loop_ +_chem_comp_plane_atom.comp_id +_chem_comp_plane_atom.plane_id +_chem_comp_plane_atom.atom_id +_chem_comp_plane_atom.dist_esd +HEC plan-11 FE 0.060 +HEC plan-11 NA 0.060 +HEC plan-11 C1A 0.060 +HEC plan-11 C4A 0.060 +HEC plan-12 FE 0.060 +HEC plan-12 NB 0.060 +HEC plan-12 C1B 0.060 +HEC plan-12 C4B 0.060 +HEC plan-13 FE 0.060 +HEC plan-13 NC 0.060 +HEC plan-13 C1C 0.060 +HEC plan-13 C4C 0.060 +HEC plan-14 FE 0.060 +HEC plan-14 ND 0.060 +HEC plan-14 C1D 0.060 +HEC plan-14 C4D 0.060 +HEC plan-1 C1B 0.020 +HEC plan-1 C2B 0.020 +HEC plan-1 C3B 0.020 +HEC plan-1 C4B 0.020 +HEC plan-1 CAB 0.020 +HEC plan-1 CHB 0.020 +HEC plan-1 CHC 0.020 +HEC plan-1 CMB 0.020 +HEC plan-1 NB 0.020 +HEC plan-2 C1C 0.020 +HEC plan-2 C2C 0.020 +HEC plan-2 C3C 0.020 +HEC plan-2 C4C 0.020 +HEC plan-2 CAC 0.020 +HEC plan-2 CHC 0.020 +HEC plan-2 CHD 0.020 +HEC plan-2 CMC 0.020 +HEC plan-2 NC 0.020 +HEC plan-3 C1D 0.020 +HEC plan-3 C2D 0.020 +HEC plan-3 C3D 0.020 +HEC plan-3 C4D 0.020 +HEC plan-3 CAD 0.020 +HEC plan-3 CHA 0.020 +HEC plan-3 CHD 0.020 +HEC plan-3 CMD 0.020 +HEC plan-3 ND 0.020 +HEC plan-4 C1A 0.020 +HEC plan-4 C2A 0.020 +HEC plan-4 C3A 0.020 +HEC plan-4 C4A 0.020 +HEC plan-4 CAA 0.020 +HEC plan-4 CHA 0.020 +HEC plan-4 CHB 0.020 +HEC plan-4 CMA 0.020 +HEC plan-4 NA 0.020 +HEC plan-5 C1A 0.020 +HEC plan-5 C4D 0.020 +HEC plan-5 CHA 0.020 +HEC plan-5 HHA 0.020 +HEC plan-6 C1B 0.020 +HEC plan-6 C4A 0.020 +HEC plan-6 CHB 0.020 +HEC plan-6 HHB 0.020 +HEC plan-7 C1C 0.020 +HEC plan-7 C4B 0.020 +HEC plan-7 CHC 0.020 +HEC plan-7 HHC 0.020 +HEC plan-8 C1D 0.020 +HEC plan-8 C4C 0.020 +HEC plan-8 CHD 0.020 +HEC plan-8 HHD 0.020 +HEC plan-9 CBA 0.020 +HEC plan-9 CGA 0.020 +HEC plan-9 O1A 0.020 +HEC plan-9 O2A 0.020 +HEC plan-10 CBD 0.020 +HEC plan-10 CGD 0.020 +HEC plan-10 O1D 0.020 +HEC plan-10 O2D 0.020 + +loop_ +_chem_comp_ring_atom.comp_id +_chem_comp_ring_atom.ring_serial_number +_chem_comp_ring_atom.atom_id +_chem_comp_ring_atom.is_aromatic_ring +HEC ring-1 NB YES +HEC ring-1 C1B YES +HEC ring-1 C2B YES +HEC ring-1 C3B YES +HEC ring-1 C4B YES +HEC ring-2 NC YES +HEC ring-2 C1C YES +HEC ring-2 C2C YES +HEC ring-2 C3C YES +HEC ring-2 C4C YES +HEC ring-3 ND YES +HEC ring-3 C1D YES +HEC ring-3 C2D YES +HEC ring-3 C3D YES +HEC ring-3 C4D YES +HEC ring-4 NA YES +HEC ring-4 C1A YES +HEC ring-4 C2A YES +HEC ring-4 C3A YES +HEC ring-4 C4A YES + +loop_ +_acedrg_chem_comp_descriptor.comp_id +_acedrg_chem_comp_descriptor.program_name +_acedrg_chem_comp_descriptor.program_version +_acedrg_chem_comp_descriptor.type +HEC acedrg 314 'dictionary generator' +HEC 'acedrg_database' 12 'data source' +HEC rdkit 2023.03.3 'Chemoinformatics tool' +HEC servalcat 0.4.99 'optimization tool' +HEC metalCoord 0.1.77 'metal coordination analysis' diff --git a/image_analysis/structure_refinement/monomers/HEM.cif b/image_analysis/structure_refinement/monomers/HEM.cif new file mode 100644 index 000000000..a0dfd75e5 --- /dev/null +++ b/image_analysis/structure_refinement/monomers/HEM.cif @@ -0,0 +1,691 @@ +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +HEM HEM "PROTOPORPHYRIN IX CONTAINING FE" NON-POLYMER 72 42 . + +data_comp_HEM +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.alt_atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +HEM FE FE FE FE 2.00 2.113 -20.686 36.710 +HEM CHA CHA C C1 0 2.720 -19.528 39.866 +HEM CHB CHB C C1 0 3.392 -17.792 35.417 +HEM CHC CHC C C1 0 1.647 -21.910 33.552 +HEM CHD CHD C C1 0 0.970 -23.635 38.034 +HEM C1A C1A C CR5 0 3.084 -18.642 38.839 +HEM C2A C2A C CR5 0 3.624 -17.376 38.970 +HEM C3A C3A C CR5 0 3.821 -16.888 37.707 +HEM C4A C4A C CR5 0 3.395 -17.851 36.822 +HEM CMA CMA C CH3 0 4.397 -15.536 37.368 +HEM CAA CAA C CH2 0 3.948 -16.673 40.264 +HEM CBA CBA C CH2 0 5.335 -16.990 40.817 +HEM CGA CGA C C 0 5.753 -16.132 42.008 +HEM O1A O1A O O 0 6.478 -15.139 41.789 +HEM O2A O2A O OC -1 5.350 -16.467 43.141 +HEM C1B C1B C CR5 0 3.012 -18.742 34.450 +HEM C2B C2B C CR5 0 3.088 -18.615 33.063 +HEM C3B C3B C CR5 0 2.602 -19.823 32.491 +HEM C4B C4B C CR5 0 2.223 -20.612 33.577 +HEM CMB CMB C CH3 0 3.637 -17.437 32.305 +HEM CAB CAB C C1 0 2.444 -20.228 31.062 +HEM CBB CBB C C2 0 2.468 -19.589 29.912 +HEM C1C C1C C CR5 0 1.305 -22.806 34.583 +HEM C2C C2C C CR5 0 0.791 -24.096 34.439 +HEM C3C C3C C CR5 0 0.605 -24.635 35.742 +HEM C4C C4C C CR5 0 0.990 -23.616 36.614 +HEM CMC CMC C CH3 0 0.531 -24.813 33.142 +HEM CAC CAC C C1 0 0.071 -25.962 36.177 +HEM CBC CBC C C2 0 -0.577 -26.940 35.580 +HEM C1D C1D C CR5 0 1.386 -22.691 38.991 +HEM C2D C2D C CR5 0 1.361 -22.807 40.363 +HEM C3D C3D C CR5 0 1.858 -21.643 40.882 +HEM C4D C4D C CR5 0 2.180 -20.824 39.815 +HEM CMD CMD C CH3 0 0.875 -23.984 41.171 +HEM CAD CAD C CH2 0 2.015 -21.306 42.343 +HEM CBD CBD C CH2 0 0.815 -20.581 42.946 +HEM CGD CGD C C 0 0.988 -20.172 44.406 +HEM O1D O1D O O 0 1.599 -19.110 44.648 +HEM O2D O2D O OC -1 0.509 -20.920 45.284 +HEM NA NA N NRD5 -1 2.940 -18.925 37.520 +HEM NB NB N NRD5 1 2.476 -19.944 34.769 +HEM NC NC N NRD5 -1 1.417 -22.504 35.897 +HEM ND ND N NRD5 1 1.887 -21.472 38.658 +HEM HHA HHA H H 0 2.859 -19.193 40.740 +HEM HHB HHB H H 0 3.670 -16.961 35.061 +HEM HHC HHC H H 0 1.422 -22.211 32.685 +HEM HHD HHD H H 0 0.585 -24.416 38.400 +HEM HMA HMA H H 0 4.826 -15.566 36.499 +HEM HMAA HMAA H H 0 5.058 -15.279 38.029 +HEM HMAB HMAB H H 0 3.686 -14.875 37.351 +HEM HAA HAA H H 0 3.279 -16.915 40.942 +HEM HAAA HAAA H H 0 3.873 -15.702 40.143 +HEM HBA HBA H H 0 5.997 -16.872 40.097 +HEM HBAA HBAA H H 0 5.359 -17.937 41.089 +HEM HMB HMB H H 0 4.047 -17.740 31.479 +HEM HMBA HMBA H H 0 4.310 -16.982 32.835 +HEM HMBB HMBB H H 0 2.918 -16.818 32.099 +HEM HAB HAB H H 0 2.329 -21.154 30.922 +HEM HBB HBB H H 0 2.384 -20.072 29.107 +HEM HBBA HBBA H H 0 2.536 -18.650 29.889 +HEM HMC HMC H H 0 0.678 -25.764 33.258 +HEM HMCA HMCA H H 0 1.133 -24.489 32.454 +HEM HMCB HMCB H H 0 -0.387 -24.660 32.864 +HEM HAC HAC H H 0 0.253 -26.188 37.076 +HEM HBC HBC H H 0 -0.782 -27.725 36.060 +HEM HBCA HBCA H H 0 -0.864 -26.848 34.688 +HEM HMD HMD H H 0 1.479 -24.149 41.913 +HEM HMDA HMDA H H 0 0.841 -24.780 40.620 +HEM HMDB HMDB H H 0 -0.013 -23.796 41.516 +HEM HAD HAD H H 0 2.812 -20.745 42.464 +HEM HADA HADA H H 0 2.181 -22.124 42.860 +HEM HBD HBD H H 0 0.025 -21.165 42.876 +HEM HBDA HBDA H H 0 0.633 -19.773 42.413 + +loop_ +_chem_comp_tree.comp_id +_chem_comp_tree.atom_id +_chem_comp_tree.atom_back +_chem_comp_tree.atom_forward +_chem_comp_tree.connect_type +HEM O2D n/a CGD START +HEM CGD O2D CBD . +HEM O1D CGD . . +HEM CBD CGD CAD . +HEM HBD CBD . . +HEM HBDA CBD . . +HEM CAD CBD C3D . +HEM HAD CAD . . +HEM HADA CAD . . +HEM C3D CAD C4D . +HEM C2D C3D CMD . +HEM CMD C2D HMD . +HEM HMDB CMD . . +HEM HMDA CMD . . +HEM HMD CMD . . +HEM C4D C3D ND . +HEM CHA C4D HHA . +HEM HHA CHA . . +HEM ND C4D FE . +HEM C1D ND CHD . +HEM CHD C1D HHD . +HEM HHD CHD . . +HEM FE ND NA . +HEM NB FE C1B . +HEM C4B NB C3B . +HEM C3B C4B C2B . +HEM CAB C3B CBB . +HEM HAB CAB . . +HEM CBB CAB HBB . +HEM HBBA CBB . . +HEM HBB CBB . . +HEM C2B C3B CMB . +HEM CMB C2B HMB . +HEM HMBB CMB . . +HEM HMBA CMB . . +HEM HMB CMB . . +HEM C1B NB CHB . +HEM CHB C1B HHB . +HEM HHB CHB . . +HEM NC FE C1C . +HEM C4C NC C3C . +HEM C3C C4C C2C . +HEM CAC C3C CBC . +HEM HAC CAC . . +HEM CBC CAC HBC . +HEM HBCA CBC . . +HEM HBC CBC . . +HEM C2C C3C CMC . +HEM CMC C2C HMC . +HEM HMCB CMC . . +HEM HMCA CMC . . +HEM HMC CMC . . +HEM C1C NC CHC . +HEM CHC C1C HHC . +HEM HHC CHC . . +HEM NA FE C4A . +HEM C1A NA . . +HEM C4A NA C3A . +HEM C3A C4A C2A . +HEM CMA C3A HMA . +HEM HMAB CMA . . +HEM HMAA CMA . . +HEM HMA CMA . . +HEM C2A C3A CAA . +HEM CAA C2A CBA . +HEM HAA CAA . . +HEM HAAA CAA . . +HEM CBA CAA CGA . +HEM HBA CBA . . +HEM HBAA CBA . . +HEM CGA CBA O2A . +HEM O1A CGA . . +HEM O2A CGA . END +HEM CHA C1A . ADD +HEM CHB C4A . ADD +HEM CHC C4B . ADD +HEM CHD C4C . ADD +HEM C1A C2A . ADD +HEM C1B C2B . ADD +HEM C1C C2C . ADD +HEM C1D C2D . ADD + +loop_ +_chem_comp_acedrg.comp_id +_chem_comp_acedrg.atom_id +_chem_comp_acedrg.atom_type +HEM CHA C(C[5a]C[5a]N[5a])2(H) +HEM CHB C(C[5a]C[5a]N[5a])2(H) +HEM CHC C(C[5a]C[5a]N[5a])2(H) +HEM CHD C(C[5a]C[5a]N[5a])2(H) +HEM C1A C[5a](C[5a]C[5a]C)(N[5a]C[5a])(CC[5a]H){1|C<3>,1|C<4>} +HEM C2A C[5a](C[5a]C[5a]C)(C[5a]N[5a]C)(CCHH){1|C<3>} +HEM C3A C[5a](C[5a]C[5a]C)(C[5a]N[5a]C)(CH3){1|C<3>} +HEM C4A C[5a](C[5a]C[5a]C)(N[5a]C[5a])(CC[5a]H){1|C<3>,1|C<4>} +HEM CMA C(C[5a]C[5a]2)(H)3 +HEM CAA C(C[5a]C[5a]2)(CCHH)(H)2 +HEM CBA C(CC[5a]HH)(COO)(H)2 +HEM CGA C(CCHH)(O)2 +HEM O1A O(CCO) +HEM O2A O(CCO) +HEM C1B C[5a](C[5a]C[5a]C)(N[5a]C[5a])(CC[5a]H){2|C<3>} +HEM C2B C[5a](C[5a]C[5a]C)(C[5a]N[5a]C)(CH3){1|C<3>} +HEM C3B C[5a](C[5a]C[5a]C)(C[5a]N[5a]C)(CCH){1|C<3>} +HEM C4B C[5a](C[5a]C[5a]C)(N[5a]C[5a])(CC[5a]H){1|C<3>,1|C<4>} +HEM CMB C(C[5a]C[5a]2)(H)3 +HEM CAB C(C[5a]C[5a]2)(CHH)(H) +HEM CBB C(CC[5a]H)(H)2 +HEM C1C C[5a](C[5a]C[5a]C)(N[5a]C[5a])(CC[5a]H){2|C<3>} +HEM C2C C[5a](C[5a]C[5a]C)(C[5a]N[5a]C)(CH3){1|C<3>} +HEM C3C C[5a](C[5a]C[5a]C)(C[5a]N[5a]C)(CCH){1|C<3>} +HEM C4C C[5a](C[5a]C[5a]C)(N[5a]C[5a])(CC[5a]H){1|C<3>,1|C<4>} +HEM CMC C(C[5a]C[5a]2)(H)3 +HEM CAC C(C[5a]C[5a]2)(CHH)(H) +HEM CBC C(CC[5a]H)(H)2 +HEM C1D C[5a](C[5a]C[5a]C)(N[5a]C[5a])(CC[5a]H){1|C<3>,1|C<4>} +HEM C2D C[5a](C[5a]C[5a]C)(C[5a]N[5a]C)(CH3){1|C<3>} +HEM C3D C[5a](C[5a]C[5a]C)(C[5a]N[5a]C)(CCHH){1|C<3>} +HEM C4D C[5a](C[5a]C[5a]C)(N[5a]C[5a])(CC[5a]H){1|C<3>,1|C<4>} +HEM CMD C(C[5a]C[5a]2)(H)3 +HEM CAD C(C[5a]C[5a]2)(CCHH)(H)2 +HEM CBD C(CC[5a]HH)(COO)(H)2 +HEM CGD C(CCHH)(O)2 +HEM O1D O(CCO) +HEM O2D O(CCO) +HEM NA N[5a](C[5a]C[5a]C)2{2|C<4>} +HEM NB N[5a](C[5a]C[5a]C)2{1|C<3>,1|C<4>} +HEM NC N[5a](C[5a]C[5a]C)2{1|C<3>,1|C<4>} +HEM ND N[5a](C[5a]C[5a]C)2{2|C<4>} +HEM HHA H(CC[5a]2) +HEM HHB H(CC[5a]2) +HEM HHC H(CC[5a]2) +HEM HHD H(CC[5a]2) +HEM HMA H(CC[5a]HH) +HEM HMAA H(CC[5a]HH) +HEM HMAB H(CC[5a]HH) +HEM HAA H(CC[5a]CH) +HEM HAAA H(CC[5a]CH) +HEM HBA H(CCCH) +HEM HBAA H(CCCH) +HEM HMB H(CC[5a]HH) +HEM HMBA H(CC[5a]HH) +HEM HMBB H(CC[5a]HH) +HEM HAB H(CC[5a]C) +HEM HBB H(CCH) +HEM HBBA H(CCH) +HEM HMC H(CC[5a]HH) +HEM HMCA H(CC[5a]HH) +HEM HMCB H(CC[5a]HH) +HEM HAC H(CC[5a]C) +HEM HBC H(CCH) +HEM HBCA H(CCH) +HEM HMD H(CC[5a]HH) +HEM HMDA H(CC[5a]HH) +HEM HMDB H(CC[5a]HH) +HEM HAD H(CC[5a]CH) +HEM HADA H(CC[5a]CH) +HEM HBD H(CCCH) +HEM HBDA H(CCCH) + +loop_ +_chem_comp_bond.comp_id +_chem_comp_bond.atom_id_1 +_chem_comp_bond.atom_id_2 +_chem_comp_bond.value_order +_chem_comp_bond.pdbx_aromatic_flag +_chem_comp_bond.value_dist_nucleus +_chem_comp_bond.value_dist_nucleus_esd +_chem_comp_bond.value_dist +_chem_comp_bond.value_dist_esd +HEM FE NA SINGLE n 2.04 0.09 2.04 0.09 +HEM FE NB SINGLE n 2.04 0.09 2.04 0.09 +HEM FE NC SINGLE n 2.04 0.09 2.04 0.09 +HEM FE ND SINGLE n 2.04 0.09 2.04 0.09 +HEM CHA C1A DOUBLE n 1.393 0.0200 1.393 0.0200 +HEM CHA C4D SINGLE n 1.393 0.0200 1.393 0.0200 +HEM CHB C4A DOUBLE n 1.393 0.0200 1.393 0.0200 +HEM CHB C1B SINGLE n 1.393 0.0200 1.393 0.0200 +HEM CHC C4B DOUBLE n 1.407 0.0200 1.407 0.0200 +HEM CHC C1C SINGLE n 1.393 0.0200 1.393 0.0200 +HEM CHD C4C SINGLE n 1.407 0.0200 1.407 0.0200 +HEM CHD C1D DOUBLE n 1.393 0.0200 1.393 0.0200 +HEM C1A C2A SINGLE y 1.374 0.0147 1.374 0.0147 +HEM C1A NA SINGLE y 1.350 0.0200 1.350 0.0200 +HEM C2A C3A DOUBLE y 1.361 0.0149 1.361 0.0149 +HEM C2A CAA SINGLE n 1.502 0.0100 1.502 0.0100 +HEM C3A C4A SINGLE y 1.361 0.0165 1.361 0.0165 +HEM C3A CMA SINGLE n 1.501 0.0106 1.501 0.0106 +HEM C4A NA SINGLE y 1.350 0.0200 1.350 0.0200 +HEM CAA CBA SINGLE n 1.526 0.0100 1.526 0.0100 +HEM CBA CGA SINGLE n 1.526 0.0100 1.526 0.0100 +HEM CGA O1A DOUBLE n 1.249 0.0161 1.249 0.0161 +HEM CGA O2A SINGLE n 1.249 0.0161 1.249 0.0161 +HEM C1B C2B SINGLE y 1.379 0.0175 1.379 0.0175 +HEM C1B NB DOUBLE y 1.350 0.0200 1.350 0.0200 +HEM C2B C3B DOUBLE y 1.401 0.0200 1.401 0.0200 +HEM C2B CMB SINGLE n 1.500 0.0100 1.500 0.0100 +HEM C3B C4B SINGLE y 1.388 0.0111 1.388 0.0111 +HEM C3B CAB SINGLE n 1.456 0.0200 1.456 0.0200 +HEM C4B NB SINGLE y 1.388 0.0142 1.388 0.0142 +HEM CAB CBB DOUBLE n 1.306 0.0200 1.306 0.0200 +HEM C1C C2C DOUBLE y 1.379 0.0175 1.379 0.0175 +HEM C1C NC SINGLE y 1.350 0.0200 1.350 0.0200 +HEM C2C C3C SINGLE y 1.401 0.0200 1.401 0.0200 +HEM C2C CMC SINGLE n 1.500 0.0100 1.500 0.0100 +HEM C3C C4C DOUBLE y 1.388 0.0111 1.388 0.0111 +HEM C3C CAC SINGLE n 1.456 0.0200 1.456 0.0200 +HEM C4C NC SINGLE y 1.388 0.0142 1.388 0.0142 +HEM CAC CBC DOUBLE n 1.306 0.0200 1.306 0.0200 +HEM C1D C2D SINGLE y 1.361 0.0165 1.361 0.0165 +HEM C1D ND SINGLE y 1.350 0.0200 1.350 0.0200 +HEM C2D C3D DOUBLE y 1.361 0.0149 1.361 0.0149 +HEM C2D CMD SINGLE n 1.501 0.0106 1.501 0.0106 +HEM C3D C4D SINGLE y 1.374 0.0147 1.374 0.0147 +HEM C3D CAD SINGLE n 1.502 0.0100 1.502 0.0100 +HEM C4D ND DOUBLE y 1.350 0.0200 1.350 0.0200 +HEM CAD CBD SINGLE n 1.526 0.0100 1.526 0.0100 +HEM CBD CGD SINGLE n 1.526 0.0100 1.526 0.0100 +HEM CGD O1D DOUBLE n 1.249 0.0161 1.249 0.0161 +HEM CGD O2D SINGLE n 1.249 0.0161 1.249 0.0161 +HEM CHA HHA SINGLE n 1.085 0.0150 0.948 0.0107 +HEM CHB HHB SINGLE n 1.085 0.0150 0.948 0.0107 +HEM CHC HHC SINGLE n 1.085 0.0150 0.948 0.0107 +HEM CHD HHD SINGLE n 1.085 0.0150 0.948 0.0107 +HEM CMA HMA SINGLE n 1.092 0.0100 0.971 0.0135 +HEM CMA HMAA SINGLE n 1.092 0.0100 0.971 0.0135 +HEM CMA HMAB SINGLE n 1.092 0.0100 0.971 0.0135 +HEM CAA HAA SINGLE n 1.092 0.0100 0.983 0.0149 +HEM CAA HAAA SINGLE n 1.092 0.0100 0.983 0.0149 +HEM CBA HBA SINGLE n 1.092 0.0100 0.985 0.0125 +HEM CBA HBAA SINGLE n 1.092 0.0100 0.985 0.0125 +HEM CMB HMB SINGLE n 1.092 0.0100 0.971 0.0135 +HEM CMB HMBA SINGLE n 1.092 0.0100 0.971 0.0135 +HEM CMB HMBB SINGLE n 1.092 0.0100 0.971 0.0135 +HEM CAB HAB SINGLE n 1.085 0.0150 0.945 0.0100 +HEM CBB HBB SINGLE n 1.085 0.0150 0.943 0.0100 +HEM CBB HBBA SINGLE n 1.085 0.0150 0.943 0.0100 +HEM CMC HMC SINGLE n 1.092 0.0100 0.971 0.0135 +HEM CMC HMCA SINGLE n 1.092 0.0100 0.971 0.0135 +HEM CMC HMCB SINGLE n 1.092 0.0100 0.971 0.0135 +HEM CAC HAC SINGLE n 1.085 0.0150 0.945 0.0100 +HEM CBC HBC SINGLE n 1.085 0.0150 0.943 0.0100 +HEM CBC HBCA SINGLE n 1.085 0.0150 0.943 0.0100 +HEM CMD HMD SINGLE n 1.092 0.0100 0.971 0.0135 +HEM CMD HMDA SINGLE n 1.092 0.0100 0.971 0.0135 +HEM CMD HMDB SINGLE n 1.092 0.0100 0.971 0.0135 +HEM CAD HAD SINGLE n 1.092 0.0100 0.983 0.0149 +HEM CAD HADA SINGLE n 1.092 0.0100 0.983 0.0149 +HEM CBD HBD SINGLE n 1.092 0.0100 0.985 0.0125 +HEM CBD HBDA SINGLE n 1.092 0.0100 0.985 0.0125 + +loop_ +_chem_comp_angle.comp_id +_chem_comp_angle.atom_id_1 +_chem_comp_angle.atom_id_2 +_chem_comp_angle.atom_id_3 +_chem_comp_angle.value_angle +_chem_comp_angle.value_angle_esd +HEM FE NA C1A 127.3755 5.0 +HEM FE NA C4A 127.3755 5.0 +HEM FE NB C1B 127.1020 5.0 +HEM FE NB C4B 127.1020 5.0 +HEM FE NC C1C 127.1020 5.0 +HEM FE NC C4C 127.1020 5.0 +HEM FE ND C1D 127.3755 5.0 +HEM FE ND C4D 127.3755 5.0 +HEM C1A CHA C4D 124.237 3.00 +HEM C1A CHA HHA 117.882 3.00 +HEM C4D CHA HHA 117.882 3.00 +HEM C4A CHB C1B 124.237 3.00 +HEM C4A CHB HHB 117.882 3.00 +HEM C1B CHB HHB 117.882 3.00 +HEM C4B CHC C1C 124.237 3.00 +HEM C4B CHC HHC 117.882 3.00 +HEM C1C CHC HHC 117.882 3.00 +HEM C4C CHD C1D 124.237 3.00 +HEM C4C CHD HHD 117.882 3.00 +HEM C1D CHD HHD 117.882 3.00 +HEM CHA C1A C2A 128.506 3.00 +HEM CHA C1A NA 122.751 3.00 +HEM C2A C1A NA 108.743 1.50 +HEM C1A C2A C3A 108.632 3.00 +HEM C1A C2A CAA 125.377 3.00 +HEM C3A C2A CAA 125.990 1.50 +HEM C2A C3A C4A 108.632 3.00 +HEM C2A C3A CMA 124.744 3.00 +HEM C4A C3A CMA 126.624 1.50 +HEM CHB C4A C3A 128.506 3.00 +HEM CHB C4A NA 122.751 3.00 +HEM C3A C4A NA 108.743 1.50 +HEM C3A CMA HMA 109.572 1.50 +HEM C3A CMA HMAA 109.572 1.50 +HEM C3A CMA HMAB 109.572 1.50 +HEM HMA CMA HMAA 109.322 1.87 +HEM HMA CMA HMAB 109.322 1.87 +HEM HMAA CMA HMAB 109.322 1.87 +HEM C2A CAA CBA 113.932 3.00 +HEM C2A CAA HAA 109.001 1.50 +HEM C2A CAA HAAA 109.001 1.50 +HEM CBA CAA HAA 108.631 1.50 +HEM CBA CAA HAAA 108.631 1.50 +HEM HAA CAA HAAA 107.419 2.31 +HEM CAA CBA CGA 114.716 3.00 +HEM CAA CBA HBA 108.790 1.50 +HEM CAA CBA HBAA 108.790 1.50 +HEM CGA CBA HBA 108.586 1.50 +HEM CGA CBA HBAA 108.586 1.50 +HEM HBA CBA HBAA 107.505 1.50 +HEM CBA CGA O1A 117.968 3.00 +HEM CBA CGA O2A 117.968 3.00 +HEM O1A CGA O2A 124.063 1.82 +HEM CHB C1B C2B 128.232 3.00 +HEM CHB C1B NB 122.477 3.00 +HEM C2B C1B NB 109.291 1.50 +HEM C1B C2B C3B 108.186 3.00 +HEM C1B C2B CMB 126.778 1.50 +HEM C3B C2B CMB 125.036 3.00 +HEM C2B C3B C4B 107.432 3.00 +HEM C2B C3B CAB 125.770 3.00 +HEM C4B C3B CAB 126.798 3.00 +HEM CHC C4B C3B 128.949 3.00 +HEM CHC C4B NB 121.757 3.00 +HEM C3B C4B NB 109.294 2.29 +HEM C2B CMB HMB 109.572 1.50 +HEM C2B CMB HMBA 109.572 1.50 +HEM C2B CMB HMBB 109.572 1.50 +HEM HMB CMB HMBA 109.322 1.87 +HEM HMB CMB HMBB 109.322 1.87 +HEM HMBA CMB HMBB 109.322 1.87 +HEM C3B CAB CBB 127.109 3.00 +HEM C3B CAB HAB 116.019 1.61 +HEM CBB CAB HAB 116.872 2.59 +HEM CAB CBB HBB 119.970 1.50 +HEM CAB CBB HBBA 119.970 1.50 +HEM HBB CBB HBBA 120.061 1.50 +HEM CHC C1C C2C 128.232 3.00 +HEM CHC C1C NC 122.477 3.00 +HEM C2C C1C NC 109.291 1.50 +HEM C1C C2C C3C 108.186 3.00 +HEM C1C C2C CMC 126.778 1.50 +HEM C3C C2C CMC 125.036 3.00 +HEM C2C C3C C4C 107.432 3.00 +HEM C2C C3C CAC 125.770 3.00 +HEM C4C C3C CAC 126.798 3.00 +HEM CHD C4C C3C 128.949 3.00 +HEM CHD C4C NC 121.757 3.00 +HEM C3C C4C NC 109.294 2.29 +HEM C2C CMC HMC 109.572 1.50 +HEM C2C CMC HMCA 109.572 1.50 +HEM C2C CMC HMCB 109.572 1.50 +HEM HMC CMC HMCA 109.322 1.87 +HEM HMC CMC HMCB 109.322 1.87 +HEM HMCA CMC HMCB 109.322 1.87 +HEM C3C CAC CBC 127.109 3.00 +HEM C3C CAC HAC 116.019 1.61 +HEM CBC CAC HAC 116.872 2.59 +HEM CAC CBC HBC 119.970 1.50 +HEM CAC CBC HBCA 119.970 1.50 +HEM HBC CBC HBCA 120.061 1.50 +HEM CHD C1D C2D 128.506 3.00 +HEM CHD C1D ND 122.751 3.00 +HEM C2D C1D ND 108.743 1.50 +HEM C1D C2D C3D 108.632 3.00 +HEM C1D C2D CMD 126.624 1.50 +HEM C3D C2D CMD 124.744 3.00 +HEM C2D C3D C4D 108.632 3.00 +HEM C2D C3D CAD 125.990 1.50 +HEM C4D C3D CAD 125.377 3.00 +HEM CHA C4D C3D 128.506 3.00 +HEM CHA C4D ND 122.751 3.00 +HEM C3D C4D ND 108.743 1.50 +HEM C2D CMD HMD 109.572 1.50 +HEM C2D CMD HMDA 109.572 1.50 +HEM C2D CMD HMDB 109.572 1.50 +HEM HMD CMD HMDA 109.322 1.87 +HEM HMD CMD HMDB 109.322 1.87 +HEM HMDA CMD HMDB 109.322 1.87 +HEM C3D CAD CBD 113.932 3.00 +HEM C3D CAD HAD 109.001 1.50 +HEM C3D CAD HADA 109.001 1.50 +HEM CBD CAD HAD 108.631 1.50 +HEM CBD CAD HADA 108.631 1.50 +HEM HAD CAD HADA 107.419 2.31 +HEM CAD CBD CGD 114.716 3.00 +HEM CAD CBD HBD 108.790 1.50 +HEM CAD CBD HBDA 108.790 1.50 +HEM CGD CBD HBD 108.586 1.50 +HEM CGD CBD HBDA 108.586 1.50 +HEM HBD CBD HBDA 107.505 1.50 +HEM CBD CGD O1D 117.968 3.00 +HEM CBD CGD O2D 117.968 3.00 +HEM O1D CGD O2D 124.063 1.82 +HEM C1A NA C4A 105.249 3.00 +HEM C1B NB C4B 105.796 3.00 +HEM C1C NC C4C 105.796 3.00 +HEM C1D ND C4D 105.249 3.00 +HEM NA FE ND 89.77 6.92 +HEM NA FE NB 89.77 6.92 +HEM NA FE NC 172.48 12.51 +HEM ND FE NB 172.48 12.51 +HEM ND FE NC 89.77 6.92 +HEM NB FE NC 89.77 6.92 + +loop_ +_chem_comp_tor.comp_id +_chem_comp_tor.id +_chem_comp_tor.atom_id_1 +_chem_comp_tor.atom_id_2 +_chem_comp_tor.atom_id_3 +_chem_comp_tor.atom_id_4 +_chem_comp_tor.value_angle +_chem_comp_tor.value_angle_esd +_chem_comp_tor.period +HEM sp2_sp2_1 C3D C4D CHA C1A 180.000 5.0 2 +HEM sp2_sp2_2 C2A C1A CHA C4D 180.000 5.0 2 +HEM sp2_sp3_1 O1A CGA CBA CAA 120.000 20.0 6 +HEM const_0 CHB C1B C2B CMB 0.000 0.0 1 +HEM const_1 CHB C1B NB C4B 180.000 0.0 1 +HEM const_2 CMB C2B C3B CAB 0.000 0.0 1 +HEM sp2_sp3_2 C1B C2B CMB HMB 150.000 20.0 6 +HEM const_3 CAB C3B C4B CHC 0.000 0.0 1 +HEM sp2_sp2_3 C2B C3B CAB CBB 180.000 5.0 2 +HEM const_4 CHC C4B NB C1B 180.000 0.0 1 +HEM sp2_sp2_4 C3B CAB CBB HBB 180.000 5.0 2 +HEM sp2_sp2_5 C2B C1B CHB C4A 180.000 5.0 2 +HEM sp2_sp2_6 C3A C4A CHB C1B 180.000 5.0 2 +HEM const_5 CHC C1C C2C CMC 0.000 0.0 1 +HEM const_6 CHC C1C NC C4C 180.000 0.0 1 +HEM const_7 CMC C2C C3C CAC 0.000 0.0 1 +HEM sp2_sp3_3 C1C C2C CMC HMC 150.000 20.0 6 +HEM const_8 CAC C3C C4C CHD 0.000 0.0 1 +HEM sp2_sp2_7 C2C C3C CAC CBC 180.000 5.0 2 +HEM const_9 CHD C4C NC C1C 180.000 0.0 1 +HEM sp2_sp2_8 C3C CAC CBC HBC 180.000 5.0 2 +HEM const_10 CHD C1D C2D CMD 0.000 0.0 1 +HEM const_11 CHD C1D ND C4D 180.000 0.0 1 +HEM const_12 CMD C2D C3D CAD 0.000 0.0 1 +HEM sp2_sp3_4 C1D C2D CMD HMD 150.000 20.0 6 +HEM sp2_sp2_9 C3B C4B CHC C1C 180.000 5.0 2 +HEM sp2_sp2_10 C2C C1C CHC C4B 180.000 5.0 2 +HEM const_13 CAD C3D C4D CHA 0.000 0.0 1 +HEM sp2_sp3_5 C2D C3D CAD CBD -90.000 20.0 6 +HEM const_14 CHA C4D ND C1D 180.000 0.0 1 +HEM sp3_sp3_1 C3D CAD CBD CGD 180.000 10.0 3 +HEM sp2_sp3_6 O1D CGD CBD CAD 120.000 20.0 6 +HEM sp2_sp2_11 C3C C4C CHD C1D 180.000 5.0 2 +HEM sp2_sp2_12 C2D C1D CHD C4C 180.000 5.0 2 +HEM const_15 CHA C1A NA C4A 180.000 0.0 1 +HEM const_16 CHA C1A C2A CAA 0.000 0.0 1 +HEM const_17 CAA C2A C3A CMA 0.000 0.0 1 +HEM sp2_sp3_7 C1A C2A CAA CBA -90.000 20.0 6 +HEM const_18 CMA C3A C4A CHB 0.000 0.0 1 +HEM sp2_sp3_8 C2A C3A CMA HMA 150.000 20.0 6 +HEM const_19 CHB C4A NA C1A 180.000 0.0 1 +HEM sp3_sp3_2 C2A CAA CBA CGA 180.000 10.0 3 + +loop_ +_chem_comp_plane_atom.comp_id +_chem_comp_plane_atom.plane_id +_chem_comp_plane_atom.atom_id +_chem_comp_plane_atom.dist_esd +HEM plan-15 FE 0.060 +HEM plan-15 NA 0.060 +HEM plan-15 C1A 0.060 +HEM plan-15 C4A 0.060 +HEM plan-16 FE 0.060 +HEM plan-16 NB 0.060 +HEM plan-16 C1B 0.060 +HEM plan-16 C4B 0.060 +HEM plan-17 FE 0.060 +HEM plan-17 NC 0.060 +HEM plan-17 C1C 0.060 +HEM plan-17 C4C 0.060 +HEM plan-18 FE 0.060 +HEM plan-18 ND 0.060 +HEM plan-18 C1D 0.060 +HEM plan-18 C4D 0.060 +HEM plan-1 C1B 0.020 +HEM plan-1 C2B 0.020 +HEM plan-1 C3B 0.020 +HEM plan-1 C4B 0.020 +HEM plan-1 CAB 0.020 +HEM plan-1 CHB 0.020 +HEM plan-1 CHC 0.020 +HEM plan-1 CMB 0.020 +HEM plan-1 NB 0.020 +HEM plan-2 C1C 0.020 +HEM plan-2 C2C 0.020 +HEM plan-2 C3C 0.020 +HEM plan-2 C4C 0.020 +HEM plan-2 CAC 0.020 +HEM plan-2 CHC 0.020 +HEM plan-2 CHD 0.020 +HEM plan-2 CMC 0.020 +HEM plan-2 NC 0.020 +HEM plan-3 C1D 0.020 +HEM plan-3 C2D 0.020 +HEM plan-3 C3D 0.020 +HEM plan-3 C4D 0.020 +HEM plan-3 CAD 0.020 +HEM plan-3 CHA 0.020 +HEM plan-3 CHD 0.020 +HEM plan-3 CMD 0.020 +HEM plan-3 ND 0.020 +HEM plan-4 C1A 0.020 +HEM plan-4 C2A 0.020 +HEM plan-4 C3A 0.020 +HEM plan-4 C4A 0.020 +HEM plan-4 CAA 0.020 +HEM plan-4 CHA 0.020 +HEM plan-4 CHB 0.020 +HEM plan-4 CMA 0.020 +HEM plan-4 NA 0.020 +HEM plan-5 C1A 0.020 +HEM plan-5 C4D 0.020 +HEM plan-5 CHA 0.020 +HEM plan-5 HHA 0.020 +HEM plan-6 C1B 0.020 +HEM plan-6 C4A 0.020 +HEM plan-6 CHB 0.020 +HEM plan-6 HHB 0.020 +HEM plan-7 C1C 0.020 +HEM plan-7 C4B 0.020 +HEM plan-7 CHC 0.020 +HEM plan-7 HHC 0.020 +HEM plan-8 C1D 0.020 +HEM plan-8 C4C 0.020 +HEM plan-8 CHD 0.020 +HEM plan-8 HHD 0.020 +HEM plan-9 CBA 0.020 +HEM plan-9 CGA 0.020 +HEM plan-9 O1A 0.020 +HEM plan-9 O2A 0.020 +HEM plan-10 C3B 0.020 +HEM plan-10 CAB 0.020 +HEM plan-10 CBB 0.020 +HEM plan-10 HAB 0.020 +HEM plan-11 CAB 0.020 +HEM plan-11 CBB 0.020 +HEM plan-11 HBB 0.020 +HEM plan-11 HBBA 0.020 +HEM plan-12 C3C 0.020 +HEM plan-12 CAC 0.020 +HEM plan-12 CBC 0.020 +HEM plan-12 HAC 0.020 +HEM plan-13 CAC 0.020 +HEM plan-13 CBC 0.020 +HEM plan-13 HBC 0.020 +HEM plan-13 HBCA 0.020 +HEM plan-14 CBD 0.020 +HEM plan-14 CGD 0.020 +HEM plan-14 O1D 0.020 +HEM plan-14 O2D 0.020 + +loop_ +_chem_comp_ring_atom.comp_id +_chem_comp_ring_atom.ring_serial_number +_chem_comp_ring_atom.atom_id +_chem_comp_ring_atom.is_aromatic_ring +HEM ring-1 C1B YES +HEM ring-1 C2B YES +HEM ring-1 C3B YES +HEM ring-1 C4B YES +HEM ring-1 NB YES +HEM ring-2 C1C YES +HEM ring-2 C2C YES +HEM ring-2 C3C YES +HEM ring-2 C4C YES +HEM ring-2 NC YES +HEM ring-3 C1D YES +HEM ring-3 C2D YES +HEM ring-3 C3D YES +HEM ring-3 C4D YES +HEM ring-3 ND YES +HEM ring-4 C1A YES +HEM ring-4 C2A YES +HEM ring-4 C3A YES +HEM ring-4 C4A YES +HEM ring-4 NA YES + +loop_ +_acedrg_chem_comp_descriptor.comp_id +_acedrg_chem_comp_descriptor.program_name +_acedrg_chem_comp_descriptor.program_version +_acedrg_chem_comp_descriptor.type +HEM acedrg 311 'dictionary generator' +HEM 'acedrg_database' 12 'data source' +HEM rdkit 2019.09.1 'Chemoinformatics tool' +HEM servalcat 0.4.93 'optimization tool' +HEM metalCoord 0.1.63 'metal coordination analysis' diff --git a/image_analysis/structure_refinement/monomers/HIS.cif b/image_analysis/structure_refinement/monomers/HIS.cif new file mode 100644 index 000000000..9aa774d8a --- /dev/null +++ b/image_analysis/structure_refinement/monomers/HIS.cif @@ -0,0 +1,247 @@ +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +HIS HIS HISTIDINE peptide 21 11 . + +data_comp_HIS +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +HIS N N NT3 1 33.660 42.779 -4.734 +HIS CA C CH1 0 33.418 41.805 -5.835 +HIS C C C 0 33.362 42.558 -7.170 +HIS O O O 0 32.473 43.428 -7.296 +HIS CB C CH2 0 32.141 40.999 -5.566 +HIS CG C CR5 0 31.907 39.881 -6.528 +HIS ND1 N NR15 1 32.388 38.605 -6.324 +HIS CD2 C CR15 0 31.249 39.846 -7.694 +HIS CE1 C CR15 0 32.025 37.834 -7.339 +HIS NE2 N NR15 0 31.332 38.567 -8.183 +HIS OXT O OC -1 34.210 42.245 -8.036 +HIS H H H 0 32.989 43.381 -4.702 +HIS H2 H H 0 34.439 43.213 -4.870 +HIS H3 H H 0 33.701 42.345 -3.944 +HIS HA H H 0 34.186 41.182 -5.863 +HIS HB3 H H 0 31.373 41.610 -5.597 +HIS HB2 H H 0 32.189 40.630 -4.657 +HIS HD1 H H 0 32.878 38.369 -5.655 +HIS HD2 H H 0 30.808 40.561 -8.109 +HIS HE1 H H 0 32.229 36.920 -7.437 +HIS HE2 H H 0 30.960 38.279 -8.940 + +loop_ +_chem_comp_tree.comp_id +_chem_comp_tree.atom_id +_chem_comp_tree.atom_back +_chem_comp_tree.atom_forward +_chem_comp_tree.connect_type +HIS N n/a CA START +HIS H N . . +HIS H2 N . . +HIS H3 N . . +HIS CA N C . +HIS HA CA . . +HIS CB CA CG . +HIS HB3 CB . . +HIS HB2 CB . . +HIS CG CB ND1 . +HIS ND1 CG CE1 . +HIS HD1 ND1 . . +HIS CE1 ND1 NE2 . +HIS HE1 CE1 . . +HIS NE2 CE1 CD2 . +HIS HE2 NE2 . . +HIS CD2 NE2 HD2 . +HIS HD2 CD2 . . +HIS C CA . END +HIS O C . . +HIS OXT C . . +HIS CD2 CG . ADD + +loop_ +_chem_comp_acedrg.comp_id +_chem_comp_acedrg.atom_id +_chem_comp_acedrg.atom_type +HIS N N(CCCH)(H)3 +HIS CA C(CC[5]HH)(NH3)(COO)(H) +HIS C C(CCHN)(O)2 +HIS O O(CCO) +HIS CB C(C[5]C[5]N[5])(CCHN)(H)2 +HIS CG C[5](C[5]N[5]H)(N[5]C[5]H)(CCHH){2|H<1>} +HIS ND1 N[5](C[5]C[5]C)(C[5]N[5]H)(H){2|H<1>} +HIS CD2 C[5](C[5]N[5]C)(N[5]C[5]H)(H){2|H<1>} +HIS CE1 C[5](N[5]C[5]H)2(H){1|C<4>,1|H<1>} +HIS NE2 N[5](C[5]C[5]H)(C[5]N[5]H)(H){1|C<4>,1|H<1>} +HIS OXT O(CCO) +HIS H H(NCHH) +HIS H2 H(NCHH) +HIS H3 H(NCHH) +HIS HA H(CCCN) +HIS HB3 H(CC[5]CH) +HIS HB2 H(CC[5]CH) +HIS HD1 H(N[5]C[5]2) +HIS HD2 H(C[5]C[5]N[5]) +HIS HE1 H(C[5]N[5]2) +HIS HE2 H(N[5]C[5]2) + +loop_ +_chem_comp_bond.comp_id +_chem_comp_bond.atom_id_1 +_chem_comp_bond.atom_id_2 +_chem_comp_bond.type +_chem_comp_bond.aromatic +_chem_comp_bond.value_dist_nucleus +_chem_comp_bond.value_dist_nucleus_esd +_chem_comp_bond.value_dist +_chem_comp_bond.value_dist_esd +HIS N CA SINGLE n 1.489 0.0100 1.489 0.0100 +HIS CA C SINGLE n 1.533 0.0100 1.533 0.0100 +HIS CA CB SINGLE n 1.533 0.0104 1.533 0.0104 +HIS C O DOUBLE n 1.251 0.0183 1.251 0.0183 +HIS C OXT SINGLE n 1.251 0.0183 1.251 0.0183 +HIS CB CG SINGLE n 1.493 0.0146 1.493 0.0146 +HIS CG ND1 SINGLE y 1.378 0.0100 1.378 0.0100 +HIS CG CD2 DOUBLE y 1.338 0.0174 1.338 0.0174 +HIS ND1 CE1 DOUBLE y 1.326 0.0133 1.326 0.0133 +HIS CD2 NE2 SINGLE y 1.371 0.0154 1.371 0.0154 +HIS CE1 NE2 SINGLE y 1.316 0.0157 1.316 0.0157 +HIS N H SINGLE n 1.018 0.0520 0.902 0.0102 +HIS N H2 SINGLE n 1.018 0.0520 0.902 0.0102 +HIS N H3 SINGLE n 1.018 0.0520 0.902 0.0102 +HIS CA HA SINGLE n 1.092 0.0100 0.989 0.0200 +HIS CB HB3 SINGLE n 1.092 0.0100 0.982 0.0176 +HIS CB HB2 SINGLE n 1.092 0.0100 0.982 0.0176 +HIS ND1 HD1 SINGLE n 1.013 0.0120 0.881 0.0200 +HIS CD2 HD2 SINGLE n 1.085 0.0150 0.937 0.0104 +HIS CE1 HE1 SINGLE n 1.085 0.0150 0.942 0.0200 +HIS NE2 HE2 SINGLE n 1.013 0.0120 0.877 0.0200 + +loop_ +_chem_comp_angle.comp_id +_chem_comp_angle.atom_id_1 +_chem_comp_angle.atom_id_2 +_chem_comp_angle.atom_id_3 +_chem_comp_angle.value_angle +_chem_comp_angle.value_angle_esd +HIS CA N H 109.992 2.14 +HIS CA N H2 109.992 2.14 +HIS CA N H3 109.992 2.14 +HIS H N H2 109.032 3.00 +HIS H N H3 109.032 3.00 +HIS H2 N H3 109.032 3.00 +HIS N CA C 109.292 1.55 +HIS N CA CB 110.573 1.50 +HIS N CA HA 108.019 2.27 +HIS C CA CB 111.874 3.00 +HIS C CA HA 108.290 1.50 +HIS CB CA HA 108.890 2.34 +HIS CA C O 117.058 3.00 +HIS CA C OXT 117.058 3.00 +HIS O C OXT 125.883 1.50 +HIS CA CB CG 113.931 1.83 +HIS CA CB HB3 108.697 1.50 +HIS CA CB HB2 108.697 1.50 +HIS CG CB HB3 108.948 1.50 +HIS CG CB HB2 108.948 1.50 +HIS HB3 CB HB2 107.846 2.68 +HIS CB CG ND1 122.940 3.00 +HIS CB CG CD2 131.173 3.00 +HIS ND1 CG CD2 105.887 1.50 +HIS CG ND1 CE1 109.313 1.50 +HIS CG ND1 HD1 125.337 2.60 +HIS CE1 ND1 HD1 125.350 3.00 +HIS CG CD2 NE2 107.589 1.50 +HIS CG CD2 HD2 126.688 3.00 +HIS NE2 CD2 HD2 125.723 3.00 +HIS ND1 CE1 NE2 108.287 1.50 +HIS ND1 CE1 HE1 125.729 2.42 +HIS NE2 CE1 HE1 125.984 1.51 +HIS CD2 NE2 CE1 108.930 1.50 +HIS CD2 NE2 HE2 125.575 3.00 +HIS CE1 NE2 HE2 125.489 3.00 + +loop_ +_chem_comp_tor.comp_id +_chem_comp_tor.id +_chem_comp_tor.atom_id_1 +_chem_comp_tor.atom_id_2 +_chem_comp_tor.atom_id_3 +_chem_comp_tor.atom_id_4 +_chem_comp_tor.value_angle +_chem_comp_tor.value_angle_esd +_chem_comp_tor.period +HIS chi1 N CA CB CG -60.000 10.0 3 +HIS chi2 CA CB CG CD2 90.000 10.0 6 +HIS sp3_sp3_1 C CA N H 180.000 10.0 3 +HIS const_17 NE2 CD2 CG ND1 0.000 0.0 1 +HIS const_13 CG CD2 NE2 CE1 0.000 0.0 1 +HIS const_sp2_sp2_5 NE2 CE1 ND1 CG 0.000 0.0 1 +HIS const_sp2_sp2_9 ND1 CE1 NE2 CD2 0.000 0.0 1 +HIS const_sp2_sp2_1 CD2 CG ND1 CE1 0.000 0.0 1 +HIS sp2_sp3_1 O C CA N 0.000 10.0 6 + +loop_ +_chem_comp_chir.comp_id +_chem_comp_chir.id +_chem_comp_chir.atom_id_centre +_chem_comp_chir.atom_id_1 +_chem_comp_chir.atom_id_2 +_chem_comp_chir.atom_id_3 +_chem_comp_chir.volume_sign +HIS chir_1 CA N C CB positive + +loop_ +_chem_comp_plane_atom.comp_id +_chem_comp_plane_atom.plane_id +_chem_comp_plane_atom.atom_id +_chem_comp_plane_atom.dist_esd +HIS plan-1 CB 0.020 +HIS plan-1 CD2 0.020 +HIS plan-1 CE1 0.020 +HIS plan-1 CG 0.020 +HIS plan-1 HD1 0.020 +HIS plan-1 HD2 0.020 +HIS plan-1 HE1 0.020 +HIS plan-1 HE2 0.020 +HIS plan-1 ND1 0.020 +HIS plan-1 NE2 0.020 +HIS plan-2 C 0.020 +HIS plan-2 CA 0.020 +HIS plan-2 O 0.020 +HIS plan-2 OXT 0.020 + +loop_ +_pdbx_chem_comp_descriptor.comp_id +_pdbx_chem_comp_descriptor.type +_pdbx_chem_comp_descriptor.program +_pdbx_chem_comp_descriptor.program_version +_pdbx_chem_comp_descriptor.descriptor +HIS SMILES ACDLabs 10.04 "O=C(O)C(N)Cc1cnc[nH+]1" +HIS SMILES_CANONICAL CACTVS 3.341 "N[C@@H](Cc1c[nH]c[nH+]1)C(O)=O" +HIS SMILES CACTVS 3.341 "N[CH](Cc1c[nH]c[nH+]1)C(O)=O" +HIS SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 "c1c([nH+]c[nH]1)C[C@@H](C(=O)O)N" +HIS SMILES "OpenEye OEToolkits" 1.5.0 "c1c([nH+]c[nH]1)CC(C(=O)O)N" +HIS InChI InChI 1.03 "InChI=1S/C6H9N3O2/c7-5(6(10)11)1-4-2-8-3-9-4/h2-3,5H,1,7H2,(H,8,9)(H,10,11)/p+1/t5-/m0/s1" +HIS InChIKey InChI 1.03 HNDVDQJCIGZPNO-YFKPBYRVSA-O + +loop_ +_pdbx_chem_comp_description_generator.comp_id +_pdbx_chem_comp_description_generator.program_name +_pdbx_chem_comp_description_generator.program_version +_pdbx_chem_comp_description_generator.descriptor +HIS acedrg 278 "dictionary generator" +HIS acedrg_database 12 "data source" +HIS rdkit 2019.09.1 "Chemoinformatics tool" +HIS refmac5 5.8.0419 "optimization tool" diff --git a/image_analysis/structure_refinement/monomers/HOH.cif b/image_analysis/structure_refinement/monomers/HOH.cif new file mode 100644 index 000000000..9b16b4d26 --- /dev/null +++ b/image_analysis/structure_refinement/monomers/HOH.cif @@ -0,0 +1,79 @@ +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +HOH HOH WATER NON-POLYMER 3 1 . + +data_comp_HOH +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.alt_atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +HOH O O O OH2 0 -23.107 18.382 -21.639 +HOH H1 H1 H H 0 -22.244 18.382 -21.639 +HOH H2 H2 H H 0 -23.365 19.206 -21.639 + +loop_ +_chem_comp_acedrg.comp_id +_chem_comp_acedrg.atom_id +_chem_comp_acedrg.atom_type +HOH O O(H)2 +HOH H1 H(OH) +HOH H2 H(OH) + +loop_ +_chem_comp_bond.comp_id +_chem_comp_bond.atom_id_1 +_chem_comp_bond.atom_id_2 +_chem_comp_bond.value_order +_chem_comp_bond.pdbx_aromatic_flag +_chem_comp_bond.value_dist_nucleus +_chem_comp_bond.value_dist_nucleus_esd +_chem_comp_bond.value_dist +_chem_comp_bond.value_dist_esd +HOH O H1 SINGLE n 0.972 0.0180 0.863 0.0200 +HOH O H2 SINGLE n 0.972 0.0180 0.863 0.0200 + +loop_ +_chem_comp_angle.comp_id +_chem_comp_angle.atom_id_1 +_chem_comp_angle.atom_id_2 +_chem_comp_angle.atom_id_3 +_chem_comp_angle.value_angle +_chem_comp_angle.value_angle_esd +HOH H1 O H2 107.391 3.00 + +loop_ +_pdbx_chem_comp_descriptor.comp_id +_pdbx_chem_comp_descriptor.type +_pdbx_chem_comp_descriptor.program +_pdbx_chem_comp_descriptor.program_version +_pdbx_chem_comp_descriptor.descriptor +HOH SMILES ACDLabs 10.04 O +HOH SMILES_CANONICAL CACTVS 3.341 O +HOH SMILES CACTVS 3.341 O +HOH SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 O +HOH SMILES "OpenEye OEToolkits" 1.5.0 O +HOH InChI InChI 1.03 InChI=1S/H2O/h1H2 +HOH InChIKey InChI 1.03 XLYOFNOQVPJJNP-UHFFFAOYSA-N + +loop_ +_acedrg_chem_comp_descriptor.comp_id +_acedrg_chem_comp_descriptor.program_name +_acedrg_chem_comp_descriptor.program_version +_acedrg_chem_comp_descriptor.type +HOH acedrg 285 "dictionary generator" +HOH acedrg_database 12 "data source" +HOH rdkit 2019.09.1 "Chemoinformatics tool" +HOH servalcat 0.4.57 'optimization tool' diff --git a/image_analysis/structure_refinement/monomers/ILE.cif b/image_analysis/structure_refinement/monomers/ILE.cif new file mode 100644 index 000000000..5a1718d9b --- /dev/null +++ b/image_analysis/structure_refinement/monomers/ILE.cif @@ -0,0 +1,240 @@ +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +ILE ILE ISOLEUCINE peptide 22 9 . + +data_comp_ILE +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +ILE N N NT3 1 52.911 76.465 68.493 +ILE CA C CH1 0 53.201 77.811 67.902 +ILE C C C 0 51.886 78.441 67.404 +ILE O O O 0 51.005 77.667 66.962 +ILE CB C CH1 0 54.273 77.728 66.792 +ILE CG1 C CH2 0 54.806 79.117 66.415 +ILE CG2 C CH3 0 53.775 76.967 65.560 +ILE CD1 C CH3 0 55.991 79.094 65.464 +ILE OXT O OC -1 51.789 79.686 67.476 +ILE H H H 0 53.671 75.992 68.596 +ILE H2 H H 0 52.344 75.994 67.973 +ILE H3 H H 0 52.530 76.571 69.304 +ILE HA H H 0 53.554 78.378 68.615 +ILE HB H H 0 55.027 77.224 67.158 +ILE HG12 H H 0 55.071 79.584 67.234 +ILE HG13 H H 0 54.084 79.629 65.999 +ILE HG21 H H 0 53.180 76.249 65.830 +ILE HG22 H H 0 54.534 76.591 65.082 +ILE HG23 H H 0 53.296 77.576 64.972 +ILE HD11 H H 0 56.404 78.209 65.466 +ILE HD12 H H 0 56.648 79.757 65.749 +ILE HD13 H H 0 55.687 79.307 64.562 + +loop_ +_chem_comp_tree.comp_id +_chem_comp_tree.atom_id +_chem_comp_tree.atom_back +_chem_comp_tree.atom_forward +_chem_comp_tree.connect_type +ILE N n/a CA START +ILE H N . . +ILE H2 N . . +ILE H3 N . . +ILE CA N C . +ILE HA CA . . +ILE CB CA CG2 . +ILE HB CB . . +ILE CG1 CB CD1 . +ILE HG13 CG1 . . +ILE HG12 CG1 . . +ILE CD1 CG1 HD13 . +ILE HD11 CD1 . . +ILE HD12 CD1 . . +ILE HD13 CD1 . . +ILE CG2 CB HG23 . +ILE HG21 CG2 . . +ILE HG22 CG2 . . +ILE HG23 CG2 . . +ILE C CA . END +ILE O C . . +ILE OXT C . . + +loop_ +_chem_comp_acedrg.comp_id +_chem_comp_acedrg.atom_id +_chem_comp_acedrg.atom_type +ILE N N(CCCH)(H)3 +ILE CA C(CCCH)(NH3)(COO)(H) +ILE C C(CCHN)(O)2 +ILE O O(CCO) +ILE CB C(CCHH)(CCHN)(CH3)(H) +ILE CG1 C(CCCH)(CH3)(H)2 +ILE CG2 C(CCCH)(H)3 +ILE CD1 C(CCHH)(H)3 +ILE OXT O(CCO) +ILE H H(NCHH) +ILE H2 H(NCHH) +ILE H3 H(NCHH) +ILE HA H(CCCN) +ILE HB H(CC3) +ILE HG12 H(CCCH) +ILE HG13 H(CCCH) +ILE HG21 H(CCHH) +ILE HG22 H(CCHH) +ILE HG23 H(CCHH) +ILE HD11 H(CCHH) +ILE HD12 H(CCHH) +ILE HD13 H(CCHH) + +loop_ +_chem_comp_bond.comp_id +_chem_comp_bond.atom_id_1 +_chem_comp_bond.atom_id_2 +_chem_comp_bond.type +_chem_comp_bond.aromatic +_chem_comp_bond.value_dist_nucleus +_chem_comp_bond.value_dist_nucleus_esd +_chem_comp_bond.value_dist +_chem_comp_bond.value_dist_esd +ILE N CA SINGLE n 1.495 0.0100 1.495 0.0100 +ILE CA C SINGLE n 1.538 0.0100 1.538 0.0100 +ILE CA CB SINGLE n 1.540 0.0102 1.540 0.0102 +ILE C O DOUBLE n 1.251 0.0183 1.251 0.0183 +ILE C OXT SINGLE n 1.251 0.0183 1.251 0.0183 +ILE CB CG1 SINGLE n 1.529 0.0200 1.529 0.0200 +ILE CB CG2 SINGLE n 1.529 0.0119 1.529 0.0119 +ILE CG1 CD1 SINGLE n 1.518 0.0129 1.518 0.0129 +ILE N H SINGLE n 1.018 0.0520 0.902 0.0102 +ILE N H2 SINGLE n 1.018 0.0520 0.902 0.0102 +ILE N H3 SINGLE n 1.018 0.0520 0.902 0.0102 +ILE CA HA SINGLE n 1.092 0.0100 0.977 0.0200 +ILE CB HB SINGLE n 1.092 0.0100 0.978 0.0189 +ILE CG1 HG12 SINGLE n 1.092 0.0100 0.979 0.0127 +ILE CG1 HG13 SINGLE n 1.092 0.0100 0.979 0.0127 +ILE CG2 HG21 SINGLE n 1.092 0.0100 0.972 0.0156 +ILE CG2 HG22 SINGLE n 1.092 0.0100 0.972 0.0156 +ILE CG2 HG23 SINGLE n 1.092 0.0100 0.972 0.0156 +ILE CD1 HD11 SINGLE n 1.092 0.0100 0.976 0.0140 +ILE CD1 HD12 SINGLE n 1.092 0.0100 0.976 0.0140 +ILE CD1 HD13 SINGLE n 1.092 0.0100 0.976 0.0140 + +loop_ +_chem_comp_angle.comp_id +_chem_comp_angle.atom_id_1 +_chem_comp_angle.atom_id_2 +_chem_comp_angle.atom_id_3 +_chem_comp_angle.value_angle +_chem_comp_angle.value_angle_esd +ILE CA N H 109.990 2.80 +ILE CA N H2 109.990 2.80 +ILE CA N H3 109.990 2.80 +ILE H N H2 109.032 3.00 +ILE H N H3 109.032 3.00 +ILE H2 N H3 109.032 3.00 +ILE N CA C 108.738 1.50 +ILE N CA CB 110.837 1.50 +ILE N CA HA 108.328 1.50 +ILE C CA CB 111.703 1.50 +ILE C CA HA 108.550 1.50 +ILE CB CA HA 108.373 1.50 +ILE CA C O 117.155 1.50 +ILE CA C OXT 117.155 1.50 +ILE O C OXT 125.690 1.50 +ILE CA CB CG1 111.638 1.50 +ILE CA CB CG2 110.951 1.50 +ILE CA CB HB 107.422 1.50 +ILE CG1 CB CG2 111.728 1.50 +ILE CG1 CB HB 107.389 1.50 +ILE CG2 CB HB 107.597 1.50 +ILE CB CG1 CD1 114.066 1.50 +ILE CB CG1 HG12 108.686 1.50 +ILE CB CG1 HG13 108.686 1.50 +ILE CD1 CG1 HG12 108.722 1.50 +ILE CD1 CG1 HG13 108.722 1.50 +ILE HG12 CG1 HG13 107.774 1.50 +ILE CB CG2 HG21 109.633 1.50 +ILE CB CG2 HG22 109.633 1.50 +ILE CB CG2 HG23 109.633 1.50 +ILE HG21 CG2 HG22 109.390 1.50 +ILE HG21 CG2 HG23 109.390 1.50 +ILE HG22 CG2 HG23 109.390 1.50 +ILE CG1 CD1 HD11 109.644 2.81 +ILE CG1 CD1 HD12 109.644 2.81 +ILE CG1 CD1 HD13 109.644 2.81 +ILE HD11 CD1 HD12 109.381 1.50 +ILE HD11 CD1 HD13 109.381 1.50 +ILE HD12 CD1 HD13 109.381 1.50 + +loop_ +_chem_comp_tor.comp_id +_chem_comp_tor.id +_chem_comp_tor.atom_id_1 +_chem_comp_tor.atom_id_2 +_chem_comp_tor.atom_id_3 +_chem_comp_tor.atom_id_4 +_chem_comp_tor.value_angle +_chem_comp_tor.value_angle_esd +_chem_comp_tor.period +ILE chi1 N CA CB CG2 -60.000 10.0 3 +ILE chi2 CA CB CG1 CD1 180.000 10.0 3 +ILE hh1 CA CB CG2 HG23 -60.000 10.0 3 +ILE hh2 CB CG1 CD1 HD13 60.000 10.0 3 +ILE sp3_sp3_1 C CA N H 180.000 10.0 3 +ILE sp2_sp3_1 O C CA N 0.000 10.0 6 + +loop_ +_chem_comp_chir.comp_id +_chem_comp_chir.id +_chem_comp_chir.atom_id_centre +_chem_comp_chir.atom_id_1 +_chem_comp_chir.atom_id_2 +_chem_comp_chir.atom_id_3 +_chem_comp_chir.volume_sign +ILE chir_1 CA N C CB positive +ILE chir_2 CB CA CG1 CG2 positive + +loop_ +_chem_comp_plane_atom.comp_id +_chem_comp_plane_atom.plane_id +_chem_comp_plane_atom.atom_id +_chem_comp_plane_atom.dist_esd +ILE plan-1 C 0.020 +ILE plan-1 CA 0.020 +ILE plan-1 O 0.020 +ILE plan-1 OXT 0.020 + +loop_ +_pdbx_chem_comp_descriptor.comp_id +_pdbx_chem_comp_descriptor.type +_pdbx_chem_comp_descriptor.program +_pdbx_chem_comp_descriptor.program_version +_pdbx_chem_comp_descriptor.descriptor +ILE SMILES ACDLabs 10.04 O=C(O)C(N)C(C)CC +ILE SMILES_CANONICAL CACTVS 3.341 CC[C@H](C)[C@H](N)C(O)=O +ILE SMILES CACTVS 3.341 CC[CH](C)[CH](N)C(O)=O +ILE SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 CC[C@H](C)[C@@H](C(=O)O)N +ILE SMILES "OpenEye OEToolkits" 1.5.0 CCC(C)C(C(=O)O)N +ILE InChI InChI 1.03 InChI=1S/C6H13NO2/c1-3-4(2)5(7)6(8)9/h4-5H,3,7H2,1-2H3,(H,8,9)/t4-,5-/m0/s1 +ILE InChIKey InChI 1.03 AGPKZVBTJJNPAG-WHFBIAKZSA-N + +loop_ +_pdbx_chem_comp_description_generator.comp_id +_pdbx_chem_comp_description_generator.program_name +_pdbx_chem_comp_description_generator.program_version +_pdbx_chem_comp_description_generator.descriptor +ILE acedrg 278 "dictionary generator" +ILE acedrg_database 12 "data source" +ILE rdkit 2019.09.1 "Chemoinformatics tool" +ILE refmac5 5.8.0419 "optimization tool" diff --git a/image_analysis/structure_refinement/monomers/IOD.cif b/image_analysis/structure_refinement/monomers/IOD.cif new file mode 100644 index 000000000..fe8d1dcfc --- /dev/null +++ b/image_analysis/structure_refinement/monomers/IOD.cif @@ -0,0 +1,30 @@ +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +IOD IOD 'IODIDE ION ' NON-POLYMER 1 1 . + +data_comp_IOD +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.partial_charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +IOD I I I -1.000 0.000 0.000 0.000 + +loop_ +_chem_comp_tree.comp_id +_chem_comp_tree.atom_id +_chem_comp_tree.atom_back +_chem_comp_tree.atom_forward +_chem_comp_tree.connect_type +IOD I n/a . END diff --git a/image_analysis/structure_refinement/monomers/K.cif b/image_analysis/structure_refinement/monomers/K.cif new file mode 100644 index 000000000..656dfa7f1 --- /dev/null +++ b/image_analysis/structure_refinement/monomers/K.cif @@ -0,0 +1,30 @@ +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +K K 'POTASSIUM ION ' NON-POLYMER 1 1 . + +data_comp_K +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.partial_charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +K K K K 1.000 0.000 0.000 0.000 + +loop_ +_chem_comp_tree.comp_id +_chem_comp_tree.atom_id +_chem_comp_tree.atom_back +_chem_comp_tree.atom_forward +_chem_comp_tree.connect_type +K K n/a . END diff --git a/image_analysis/structure_refinement/monomers/LEU.cif b/image_analysis/structure_refinement/monomers/LEU.cif new file mode 100644 index 000000000..d7a7bc7e4 --- /dev/null +++ b/image_analysis/structure_refinement/monomers/LEU.cif @@ -0,0 +1,240 @@ +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +LEU LEU LEUCINE peptide 22 9 . + +data_comp_LEU +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +LEU N N NT3 1 16.397 16.089 52.368 +LEU CA C CH1 0 15.211 16.954 52.118 +LEU C C C 0 13.931 16.126 52.332 +LEU O O O 0 13.023 16.642 53.022 +LEU CB C CH2 0 15.230 17.562 50.712 +LEU CG C CH1 0 16.388 18.503 50.342 +LEU CD1 C CH3 0 16.596 19.599 51.384 +LEU CD2 C CH3 0 17.703 17.774 50.057 +LEU OXT O OC -1 13.888 14.994 51.800 +LEU H H H 0 16.605 15.616 51.628 +LEU H2 H H 0 16.242 15.512 53.045 +LEU H3 H H 0 17.102 16.600 52.600 +LEU HA H H 0 15.218 17.683 52.788 +LEU HB3 H H 0 14.387 18.055 50.587 +LEU HB2 H H 0 15.214 16.822 50.062 +LEU HG H H 0 16.133 18.961 49.500 +LEU HD11 H H 0 15.741 20.011 51.596 +LEU HD12 H H 0 17.200 20.273 51.030 +LEU HD13 H H 0 16.978 19.215 52.192 +LEU HD21 H H 0 17.517 16.879 49.726 +LEU HD22 H H 0 18.230 17.713 50.871 +LEU HD23 H H 0 18.205 18.266 49.386 + +loop_ +_chem_comp_tree.comp_id +_chem_comp_tree.atom_id +_chem_comp_tree.atom_back +_chem_comp_tree.atom_forward +_chem_comp_tree.connect_type +LEU N n/a CA START +LEU H N . . +LEU H2 N . . +LEU H3 N . . +LEU CA N C . +LEU HA CA . . +LEU CB CA CG . +LEU HB3 CB . . +LEU HB2 CB . . +LEU CG CB CD2 . +LEU HG CG . . +LEU CD1 CG HD13 . +LEU HD11 CD1 . . +LEU HD12 CD1 . . +LEU HD13 CD1 . . +LEU CD2 CG HD23 . +LEU HD21 CD2 . . +LEU HD22 CD2 . . +LEU HD23 CD2 . . +LEU C CA . END +LEU O C . . +LEU OXT C . . + +loop_ +_chem_comp_acedrg.comp_id +_chem_comp_acedrg.atom_id +_chem_comp_acedrg.atom_type +LEU N N(CCCH)(H)3 +LEU CA C(CCHH)(NH3)(COO)(H) +LEU C C(CCHN)(O)2 +LEU O O(CCO) +LEU CB C(CCCH)(CCHN)(H)2 +LEU CG C(CCHH)(CH3)2(H) +LEU CD1 C(CCCH)(H)3 +LEU CD2 C(CCCH)(H)3 +LEU OXT O(CCO) +LEU H H(NCHH) +LEU H2 H(NCHH) +LEU H3 H(NCHH) +LEU HA H(CCCN) +LEU HB3 H(CCCH) +LEU HB2 H(CCCH) +LEU HG H(CC3) +LEU HD11 H(CCHH) +LEU HD12 H(CCHH) +LEU HD13 H(CCHH) +LEU HD21 H(CCHH) +LEU HD22 H(CCHH) +LEU HD23 H(CCHH) + +loop_ +_chem_comp_bond.comp_id +_chem_comp_bond.atom_id_1 +_chem_comp_bond.atom_id_2 +_chem_comp_bond.type +_chem_comp_bond.aromatic +_chem_comp_bond.value_dist_nucleus +_chem_comp_bond.value_dist_nucleus_esd +_chem_comp_bond.value_dist +_chem_comp_bond.value_dist_esd +LEU N CA SINGLE n 1.487 0.0100 1.487 0.0100 +LEU CA C SINGLE n 1.538 0.0113 1.538 0.0113 +LEU CA CB SINGLE n 1.528 0.0100 1.528 0.0100 +LEU C O DOUBLE n 1.251 0.0183 1.251 0.0183 +LEU C OXT SINGLE n 1.251 0.0183 1.251 0.0183 +LEU CB CG SINGLE n 1.532 0.0100 1.532 0.0100 +LEU CG CD1 SINGLE n 1.519 0.0200 1.519 0.0200 +LEU CG CD2 SINGLE n 1.519 0.0200 1.519 0.0200 +LEU N H SINGLE n 1.018 0.0520 0.902 0.0102 +LEU N H2 SINGLE n 1.018 0.0520 0.902 0.0102 +LEU N H3 SINGLE n 1.018 0.0520 0.902 0.0102 +LEU CA HA SINGLE n 1.092 0.0100 0.991 0.0200 +LEU CB HB3 SINGLE n 1.092 0.0100 0.985 0.0129 +LEU CB HB2 SINGLE n 1.092 0.0100 0.985 0.0129 +LEU CG HG SINGLE n 1.092 0.0100 0.992 0.0164 +LEU CD1 HD11 SINGLE n 1.092 0.0100 0.972 0.0156 +LEU CD1 HD12 SINGLE n 1.092 0.0100 0.972 0.0156 +LEU CD1 HD13 SINGLE n 1.092 0.0100 0.972 0.0156 +LEU CD2 HD21 SINGLE n 1.092 0.0100 0.972 0.0156 +LEU CD2 HD22 SINGLE n 1.092 0.0100 0.972 0.0156 +LEU CD2 HD23 SINGLE n 1.092 0.0100 0.972 0.0156 + +loop_ +_chem_comp_angle.comp_id +_chem_comp_angle.atom_id_1 +_chem_comp_angle.atom_id_2 +_chem_comp_angle.atom_id_3 +_chem_comp_angle.value_angle +_chem_comp_angle.value_angle_esd +LEU CA N H 109.990 3.00 +LEU CA N H2 109.990 3.00 +LEU CA N H3 109.990 3.00 +LEU H N H2 109.032 3.00 +LEU H N H3 109.032 3.00 +LEU H2 N H3 109.032 3.00 +LEU N CA C 109.258 1.50 +LEU N CA CB 109.859 2.63 +LEU N CA HA 108.387 1.58 +LEU C CA CB 111.627 1.50 +LEU C CA HA 108.774 1.79 +LEU CB CA HA 109.261 1.50 +LEU CA C O 117.148 1.60 +LEU CA C OXT 117.148 1.60 +LEU O C OXT 125.704 1.50 +LEU CA CB CG 115.973 1.50 +LEU CA CB HB3 108.172 1.50 +LEU CA CB HB2 108.172 1.50 +LEU CG CB HB3 108.390 1.50 +LEU CG CB HB2 108.390 1.50 +LEU HB3 CB HB2 107.673 3.00 +LEU CB CG CD1 110.898 3.00 +LEU CB CG CD2 110.898 3.00 +LEU CB CG HG 108.090 1.50 +LEU CD1 CG CD2 110.647 1.82 +LEU CD1 CG HG 107.962 1.81 +LEU CD2 CG HG 107.962 1.81 +LEU CG CD1 HD11 109.527 1.50 +LEU CG CD1 HD12 109.527 1.50 +LEU CG CD1 HD13 109.527 1.50 +LEU HD11 CD1 HD12 109.390 1.50 +LEU HD11 CD1 HD13 109.390 1.50 +LEU HD12 CD1 HD13 109.390 1.50 +LEU CG CD2 HD21 109.527 1.50 +LEU CG CD2 HD22 109.527 1.50 +LEU CG CD2 HD23 109.527 1.50 +LEU HD21 CD2 HD22 109.390 1.50 +LEU HD21 CD2 HD23 109.390 1.50 +LEU HD22 CD2 HD23 109.390 1.50 + +loop_ +_chem_comp_tor.comp_id +_chem_comp_tor.id +_chem_comp_tor.atom_id_1 +_chem_comp_tor.atom_id_2 +_chem_comp_tor.atom_id_3 +_chem_comp_tor.atom_id_4 +_chem_comp_tor.value_angle +_chem_comp_tor.value_angle_esd +_chem_comp_tor.period +LEU chi1 N CA CB CG -60.000 10.0 3 +LEU chi2 CA CB CG CD1 180.000 10.0 3 +LEU hh1 CB CG CD1 HD13 60.000 10.0 3 +LEU hh2 CB CG CD2 HD23 180.000 10.0 3 +LEU sp3_sp3_1 C CA N H 180.000 10.0 3 +LEU sp2_sp3_1 O C CA N 0.000 10.0 6 + +loop_ +_chem_comp_chir.comp_id +_chem_comp_chir.id +_chem_comp_chir.atom_id_centre +_chem_comp_chir.atom_id_1 +_chem_comp_chir.atom_id_2 +_chem_comp_chir.atom_id_3 +_chem_comp_chir.volume_sign +LEU chir_1 CA N C CB positive +LEU chir_2 CG CB CD1 CD2 both + +loop_ +_chem_comp_plane_atom.comp_id +_chem_comp_plane_atom.plane_id +_chem_comp_plane_atom.atom_id +_chem_comp_plane_atom.dist_esd +LEU plan-1 C 0.020 +LEU plan-1 CA 0.020 +LEU plan-1 O 0.020 +LEU plan-1 OXT 0.020 + +loop_ +_pdbx_chem_comp_descriptor.comp_id +_pdbx_chem_comp_descriptor.type +_pdbx_chem_comp_descriptor.program +_pdbx_chem_comp_descriptor.program_version +_pdbx_chem_comp_descriptor.descriptor +LEU SMILES ACDLabs 10.04 O=C(O)C(N)CC(C)C +LEU SMILES_CANONICAL CACTVS 3.341 CC(C)C[C@H](N)C(O)=O +LEU SMILES CACTVS 3.341 CC(C)C[CH](N)C(O)=O +LEU SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 CC(C)C[C@@H](C(=O)O)N +LEU SMILES "OpenEye OEToolkits" 1.5.0 CC(C)CC(C(=O)O)N +LEU InChI InChI 1.03 InChI=1S/C6H13NO2/c1-4(2)3-5(7)6(8)9/h4-5H,3,7H2,1-2H3,(H,8,9)/t5-/m0/s1 +LEU InChIKey InChI 1.03 ROHFNLRQFUQHCH-YFKPBYRVSA-N + +loop_ +_pdbx_chem_comp_description_generator.comp_id +_pdbx_chem_comp_description_generator.program_name +_pdbx_chem_comp_description_generator.program_version +_pdbx_chem_comp_description_generator.descriptor +LEU acedrg 278 "dictionary generator" +LEU acedrg_database 12 "data source" +LEU rdkit 2019.09.1 "Chemoinformatics tool" +LEU refmac5 5.8.0419 "optimization tool" diff --git a/image_analysis/structure_refinement/monomers/LYS.cif b/image_analysis/structure_refinement/monomers/LYS.cif new file mode 100644 index 000000000..edcceab06 --- /dev/null +++ b/image_analysis/structure_refinement/monomers/LYS.cif @@ -0,0 +1,258 @@ +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +LYS LYS LYSINE peptide 25 10 . + +data_comp_LYS +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +LYS N N NT3 1 38.447 40.683 -3.403 +LYS CA C CH1 0 39.289 39.686 -4.119 +LYS C C C 0 38.638 39.335 -5.470 +LYS O O O 0 37.393 39.207 -5.493 +LYS CB C CH2 0 39.527 38.438 -3.257 +LYS CG C CH2 0 38.287 37.697 -2.761 +LYS CD C CH2 0 38.607 36.502 -1.871 +LYS CE C CH2 0 37.387 35.753 -1.425 +LYS NZ N NT3 1 36.499 36.554 -0.576 +LYS OXT O OC -1 39.402 39.203 -6.452 +LYS H H H 0 38.746 40.791 -2.559 +LYS H2 H H 0 37.585 40.417 -3.374 +LYS H3 H H 0 38.489 41.477 -3.829 +LYS HA H H 0 40.169 40.104 -4.300 +LYS HB3 H H 0 40.055 38.704 -2.474 +LYS HB2 H H 0 40.071 37.807 -3.775 +LYS HG3 H H 0 37.773 37.386 -3.537 +LYS HG2 H H 0 37.724 38.326 -2.260 +LYS HD3 H H 0 39.096 36.816 -1.080 +LYS HD2 H H 0 39.195 35.888 -2.363 +LYS HE3 H H 0 37.662 34.961 -0.931 +LYS HE2 H H 0 36.889 35.459 -2.208 +LYS HZ1 H H 0 36.983 37.027 0.027 +LYS HZ2 H H 0 35.931 36.006 -0.132 +LYS HZ3 H H 0 36.017 37.126 -1.086 + +loop_ +_chem_comp_tree.comp_id +_chem_comp_tree.atom_id +_chem_comp_tree.atom_back +_chem_comp_tree.atom_forward +_chem_comp_tree.connect_type +LYS N n/a CA START +LYS H N . . +LYS H2 N . . +LYS H3 N . . +LYS CA N C . +LYS HA CA . . +LYS CB CA CG . +LYS HB3 CB . . +LYS HB2 CB . . +LYS CG CB CD . +LYS HG3 CG . . +LYS HG2 CG . . +LYS CD CG CE . +LYS HD3 CD . . +LYS HD2 CD . . +LYS CE CD NZ . +LYS HE3 CE . . +LYS HE2 CE . . +LYS NZ CE HZ3 . +LYS HZ1 NZ . . +LYS HZ2 NZ . . +LYS HZ3 NZ . . +LYS C CA . END +LYS O C . . +LYS OXT C . . + +loop_ +_chem_comp_acedrg.comp_id +_chem_comp_acedrg.atom_id +_chem_comp_acedrg.atom_type +LYS N N(CCCH)(H)3 +LYS CA C(CCHH)(NH3)(COO)(H) +LYS C C(CCHN)(O)2 +LYS O O(CCO) +LYS CB C(CCHH)(CCHN)(H)2 +LYS CG C(CCHH)2(H)2 +LYS CD C(CCHH)(CHHN)(H)2 +LYS CE C(CCHH)(NH3)(H)2 +LYS NZ N(CCHH)(H)3 +LYS OXT O(CCO) +LYS H H(NCHH) +LYS H2 H(NCHH) +LYS H3 H(NCHH) +LYS HA H(CCCN) +LYS HB3 H(CCCH) +LYS HB2 H(CCCH) +LYS HG3 H(CCCH) +LYS HG2 H(CCCH) +LYS HD3 H(CCCH) +LYS HD2 H(CCCH) +LYS HE3 H(CCHN) +LYS HE2 H(CCHN) +LYS HZ1 H(NCHH) +LYS HZ2 H(NCHH) +LYS HZ3 H(NCHH) + +loop_ +_chem_comp_bond.comp_id +_chem_comp_bond.atom_id_1 +_chem_comp_bond.atom_id_2 +_chem_comp_bond.type +_chem_comp_bond.aromatic +_chem_comp_bond.value_dist_nucleus +_chem_comp_bond.value_dist_nucleus_esd +_chem_comp_bond.value_dist +_chem_comp_bond.value_dist_esd +LYS N CA SINGLE n 1.487 0.0100 1.487 0.0100 +LYS CA C SINGLE n 1.538 0.0113 1.538 0.0113 +LYS CA CB SINGLE n 1.533 0.0100 1.533 0.0100 +LYS C O DOUBLE n 1.251 0.0183 1.251 0.0183 +LYS C OXT SINGLE n 1.251 0.0183 1.251 0.0183 +LYS CB CG SINGLE n 1.523 0.0189 1.523 0.0189 +LYS CG CD SINGLE n 1.524 0.0122 1.524 0.0122 +LYS CD CE SINGLE n 1.496 0.0200 1.496 0.0200 +LYS CE NZ SINGLE n 1.465 0.0130 1.465 0.0130 +LYS N H SINGLE n 1.018 0.0520 0.902 0.0102 +LYS N H2 SINGLE n 1.018 0.0520 0.902 0.0102 +LYS N H3 SINGLE n 1.018 0.0520 0.902 0.0102 +LYS CA HA SINGLE n 1.092 0.0100 0.991 0.0200 +LYS CB HB3 SINGLE n 1.092 0.0100 0.981 0.0141 +LYS CB HB2 SINGLE n 1.092 0.0100 0.981 0.0141 +LYS CG HG3 SINGLE n 1.092 0.0100 0.982 0.0163 +LYS CG HG2 SINGLE n 1.092 0.0100 0.982 0.0163 +LYS CD HD3 SINGLE n 1.092 0.0100 0.982 0.0163 +LYS CD HD2 SINGLE n 1.092 0.0100 0.982 0.0163 +LYS CE HE3 SINGLE n 1.092 0.0100 0.974 0.0147 +LYS CE HE2 SINGLE n 1.092 0.0100 0.974 0.0147 +LYS NZ HZ1 SINGLE n 1.018 0.0520 0.906 0.0200 +LYS NZ HZ2 SINGLE n 1.018 0.0520 0.906 0.0200 +LYS NZ HZ3 SINGLE n 1.018 0.0520 0.906 0.0200 + +loop_ +_chem_comp_angle.comp_id +_chem_comp_angle.atom_id_1 +_chem_comp_angle.atom_id_2 +_chem_comp_angle.atom_id_3 +_chem_comp_angle.value_angle +_chem_comp_angle.value_angle_esd +LYS CA N H 109.990 3.00 +LYS CA N H2 109.990 3.00 +LYS CA N H3 109.990 3.00 +LYS H N H2 109.032 3.00 +LYS H N H3 109.032 3.00 +LYS H2 N H3 109.032 3.00 +LYS N CA C 109.258 1.50 +LYS N CA CB 110.440 2.46 +LYS N CA HA 108.387 1.58 +LYS C CA CB 111.059 3.00 +LYS C CA HA 108.774 1.79 +LYS CB CA HA 109.080 2.33 +LYS CA C O 117.148 1.60 +LYS CA C OXT 117.148 1.60 +LYS O C OXT 125.704 1.50 +LYS CA CB CG 115.148 2.35 +LYS CA CB HB3 108.677 1.74 +LYS CA CB HB2 108.677 1.74 +LYS CG CB HB3 108.413 1.50 +LYS CG CB HB2 108.413 1.50 +LYS HB3 CB HB2 107.655 1.50 +LYS CB CG CD 113.403 3.00 +LYS CB CG HG3 108.381 1.50 +LYS CB CG HG2 108.381 1.50 +LYS CD CG HG3 108.819 1.50 +LYS CD CG HG2 108.819 1.50 +LYS HG3 CG HG2 107.566 1.82 +LYS CG CD CE 112.541 3.00 +LYS CG CD HD3 108.993 1.92 +LYS CG CD HD2 108.993 1.92 +LYS CE CD HD3 109.016 1.50 +LYS CE CD HD2 109.016 1.50 +LYS HD3 CD HD2 107.958 2.23 +LYS CD CE NZ 111.716 3.00 +LYS CD CE HE3 109.468 2.65 +LYS CD CE HE2 109.468 2.65 +LYS NZ CE HE3 108.972 2.23 +LYS NZ CE HE2 108.972 2.23 +LYS HE3 CE HE2 108.144 2.57 +LYS CE NZ HZ1 109.659 3.00 +LYS CE NZ HZ2 109.659 3.00 +LYS CE NZ HZ3 109.659 3.00 +LYS HZ1 NZ HZ2 109.089 3.00 +LYS HZ1 NZ HZ3 109.089 3.00 +LYS HZ2 NZ HZ3 109.089 3.00 + +loop_ +_chem_comp_tor.comp_id +_chem_comp_tor.id +_chem_comp_tor.atom_id_1 +_chem_comp_tor.atom_id_2 +_chem_comp_tor.atom_id_3 +_chem_comp_tor.atom_id_4 +_chem_comp_tor.value_angle +_chem_comp_tor.value_angle_esd +_chem_comp_tor.period +LYS chi1 N CA CB CG -60.000 10.0 3 +LYS chi2 CA CB CG CD 180.000 10.0 3 +LYS chi3 CB CG CD CE 180.000 10.0 3 +LYS chi4 CG CD CE NZ 180.000 10.0 3 +LYS hh1 CD CE NZ HZ3 180.000 10.0 3 +LYS sp3_sp3_1 C CA N H 180.000 10.0 3 +LYS sp2_sp3_1 O C CA N 0.000 10.0 6 + +loop_ +_chem_comp_chir.comp_id +_chem_comp_chir.id +_chem_comp_chir.atom_id_centre +_chem_comp_chir.atom_id_1 +_chem_comp_chir.atom_id_2 +_chem_comp_chir.atom_id_3 +_chem_comp_chir.volume_sign +LYS chir_1 CA N C CB positive + +loop_ +_chem_comp_plane_atom.comp_id +_chem_comp_plane_atom.plane_id +_chem_comp_plane_atom.atom_id +_chem_comp_plane_atom.dist_esd +LYS plan-1 C 0.020 +LYS plan-1 CA 0.020 +LYS plan-1 O 0.020 +LYS plan-1 OXT 0.020 + +loop_ +_pdbx_chem_comp_descriptor.comp_id +_pdbx_chem_comp_descriptor.type +_pdbx_chem_comp_descriptor.program +_pdbx_chem_comp_descriptor.program_version +_pdbx_chem_comp_descriptor.descriptor +LYS SMILES ACDLabs 10.04 O=C(O)C(N)CCCC[NH3+] +LYS SMILES_CANONICAL CACTVS 3.341 N[C@@H](CCCC[NH3+])C(O)=O +LYS SMILES CACTVS 3.341 N[CH](CCCC[NH3+])C(O)=O +LYS SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 C(CC[NH3+])C[C@@H](C(=O)O)N +LYS SMILES "OpenEye OEToolkits" 1.5.0 C(CC[NH3+])CC(C(=O)O)N +LYS InChI InChI 1.03 InChI=1S/C6H14N2O2/c7-4-2-1-3-5(8)6(9)10/h5H,1-4,7-8H2,(H,9,10)/p+1/t5-/m0/s1 +LYS InChIKey InChI 1.03 KDXKERNSBIXSRK-YFKPBYRVSA-O + +loop_ +_pdbx_chem_comp_description_generator.comp_id +_pdbx_chem_comp_description_generator.program_name +_pdbx_chem_comp_description_generator.program_version +_pdbx_chem_comp_description_generator.descriptor +LYS acedrg 278 "dictionary generator" +LYS acedrg_database 12 "data source" +LYS rdkit 2019.09.1 "Chemoinformatics tool" +LYS refmac5 5.8.0419 "optimization tool" diff --git a/image_analysis/structure_refinement/monomers/M2G.cif b/image_analysis/structure_refinement/monomers/M2G.cif new file mode 100644 index 000000000..f08ed483a --- /dev/null +++ b/image_analysis/structure_refinement/monomers/M2G.cif @@ -0,0 +1,307 @@ +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +M2G M2G "N2-DIMETHYLGUANOSINE-5'-MONOPHOSPHATE" RNA 42 26 . + +data_comp_M2G +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +M2G P P P 0 39.624 -6.580 13.186 +M2G OP1 O O 0 40.880 -5.814 12.816 +M2G OP2 O OP -1 38.958 -7.232 11.988 +M2G OP3 O OP -1 39.838 -7.543 14.338 +M2G "O5'" O O2 0 38.577 -5.476 13.725 +M2G "C5'" C CH2 0 37.276 -5.917 14.192 +M2G "C4'" C CH1 0 36.420 -4.719 14.527 +M2G "O4'" O O2 0 37.113 -3.873 15.478 +M2G "C3'" C CH1 0 36.075 -3.781 13.366 +M2G "O3'" O OH1 0 34.949 -4.254 12.637 +M2G "C2'" C CH1 0 35.793 -2.465 14.098 +M2G "O2'" O OH1 0 34.465 -2.359 14.571 +M2G "C1'" C CH1 0 36.802 -2.514 15.248 +M2G N9 N NR5 0 38.030 -1.769 14.978 +M2G C8 C CR15 0 39.306 -2.257 14.820 +M2G N7 N NRD5 0 40.197 -1.323 14.584 +M2G C5 C CR56 0 39.465 -0.144 14.588 +M2G C6 C CR6 0 39.880 1.200 14.389 +M2G O6 O O 0 41.026 1.613 14.162 +M2G N1 N NR16 0 38.812 2.107 14.473 +M2G C2 C CR6 0 37.498 1.761 14.720 +M2G N2 N N 0 36.512 2.761 14.782 +M2G N3 N NRD6 0 37.123 0.497 14.909 +M2G C4 C CR56 0 38.134 -0.404 14.831 +M2G CM1 C CH3 0 35.097 2.452 14.595 +M2G CM2 C CH3 0 36.840 4.157 15.050 +M2G "H5'" H H 0 37.383 -6.482 14.996 +M2G "H5''" H H 0 36.833 -6.454 13.489 +M2G "H4'" H H 0 35.589 -5.043 14.937 +M2G "H3'" H H 0 36.854 -3.676 12.761 +M2G "HO3'" H H 0 34.740 -3.675 12.052 +M2G "H2'" H H 0 35.987 -1.696 13.500 +M2G "HO2'" H H 0 34.306 -2.977 15.131 +M2G "H1'" H H 0 36.375 -2.140 16.053 +M2G H8 H H 0 39.523 -3.172 14.874 +M2G HN1 H H 0 39.016 2.969 14.353 +M2G HM11 H H 0 34.999 1.706 13.981 +M2G HM12 H H 0 34.637 3.225 14.228 +M2G HM13 H H 0 34.702 2.219 15.451 +M2G HM21 H H 0 37.546 4.202 15.715 +M2G HM22 H H 0 36.057 4.624 15.385 +M2G HM23 H H 0 37.142 4.581 14.230 + +loop_ +_chem_comp_bond.comp_id +_chem_comp_bond.atom_id_1 +_chem_comp_bond.atom_id_2 +_chem_comp_bond.type +_chem_comp_bond.aromatic +_chem_comp_bond.value_dist_nucleus +_chem_comp_bond.value_dist_nucleus_esd +_chem_comp_bond.value_dist +_chem_comp_bond.value_dist_esd +M2G P OP1 DOUBLE n 1.517 0.0192 1.517 0.0192 +M2G P OP2 SINGLE n 1.517 0.0192 1.517 0.0192 +M2G P OP3 SINGLE n 1.517 0.0192 1.517 0.0192 +M2G P "O5'" SINGLE n 1.614 0.0178 1.614 0.0178 +M2G "O5'" "C5'" SINGLE n 1.450 0.0166 1.450 0.0166 +M2G "C5'" "C4'" SINGLE n 1.509 0.0100 1.509 0.0100 +M2G "C4'" "O4'" SINGLE n 1.451 0.0100 1.451 0.0100 +M2G "C4'" "C3'" SINGLE n 1.535 0.0100 1.535 0.0100 +M2G "O4'" "C1'" SINGLE n 1.409 0.0100 1.409 0.0100 +M2G "C3'" "O3'" SINGLE n 1.422 0.0100 1.422 0.0100 +M2G "C3'" "C2'" SINGLE n 1.531 0.0100 1.531 0.0100 +M2G "C2'" "O2'" SINGLE n 1.411 0.0100 1.411 0.0100 +M2G "C2'" "C1'" SINGLE n 1.525 0.0100 1.525 0.0100 +M2G "C1'" N9 SINGLE n 1.458 0.0100 1.458 0.0100 +M2G N9 C8 SINGLE y 1.372 0.0100 1.372 0.0100 +M2G N9 C4 SINGLE y 1.375 0.0100 1.375 0.0100 +M2G C8 N7 DOUBLE y 1.312 0.0100 1.312 0.0100 +M2G N7 C5 SINGLE y 1.390 0.0100 1.390 0.0100 +M2G C5 C6 SINGLE y 1.417 0.0103 1.417 0.0103 +M2G C5 C4 DOUBLE y 1.377 0.0100 1.377 0.0100 +M2G C6 O6 DOUBLE n 1.239 0.0100 1.239 0.0100 +M2G C6 N1 SINGLE y 1.396 0.0107 1.396 0.0107 +M2G N1 C2 SINGLE y 1.372 0.0100 1.372 0.0100 +M2G C2 N2 SINGLE n 1.370 0.0200 1.370 0.0200 +M2G C2 N3 DOUBLE y 1.324 0.0127 1.324 0.0127 +M2G N2 CM1 SINGLE n 1.453 0.0119 1.453 0.0119 +M2G N2 CM2 SINGLE n 1.453 0.0119 1.453 0.0119 +M2G N3 C4 SINGLE y 1.355 0.0100 1.355 0.0100 +M2G "C5'" "H5'" SINGLE n 1.089 0.0100 0.989 0.0200 +M2G "C5'" "H5''" SINGLE n 1.089 0.0100 0.989 0.0200 +M2G "C4'" "H4'" SINGLE n 1.089 0.0100 0.981 0.0200 +M2G "C3'" "H3'" SINGLE n 1.089 0.0100 0.992 0.0200 +M2G "O3'" "HO3'" SINGLE n 0.970 0.0120 0.849 0.0200 +M2G "C2'" "H2'" SINGLE n 1.089 0.0100 0.994 0.0200 +M2G "O2'" "HO2'" SINGLE n 0.970 0.0120 0.849 0.0200 +M2G "C1'" "H1'" SINGLE n 1.089 0.0100 0.984 0.0200 +M2G C8 H8 SINGLE n 1.082 0.0130 0.942 0.0170 +M2G N1 HN1 SINGLE n 1.016 0.0100 0.897 0.0200 +M2G CM1 HM11 SINGLE n 1.089 0.0100 0.971 0.0181 +M2G CM1 HM12 SINGLE n 1.089 0.0100 0.971 0.0181 +M2G CM1 HM13 SINGLE n 1.089 0.0100 0.971 0.0181 +M2G CM2 HM21 SINGLE n 1.089 0.0100 0.971 0.0181 +M2G CM2 HM22 SINGLE n 1.089 0.0100 0.971 0.0181 +M2G CM2 HM23 SINGLE n 1.089 0.0100 0.971 0.0181 + +loop_ +_chem_comp_angle.comp_id +_chem_comp_angle.atom_id_1 +_chem_comp_angle.atom_id_2 +_chem_comp_angle.atom_id_3 +_chem_comp_angle.value_angle +_chem_comp_angle.value_angle_esd +M2G OP1 P OP2 112.864 1.69 +M2G OP1 P OP3 112.864 1.69 +M2G OP1 P "O5'" 105.808 2.07 +M2G OP2 P OP3 112.864 1.69 +M2G OP2 P "O5'" 105.808 2.07 +M2G OP3 P "O5'" 105.808 2.07 +M2G P "O5'" "C5'" 118.783 1.50 +M2G "O5'" "C5'" "C4'" 109.342 1.50 +M2G "O5'" "C5'" "H5'" 109.845 1.50 +M2G "O5'" "C5'" "H5''" 109.845 1.50 +M2G "C4'" "C5'" "H5'" 109.624 1.50 +M2G "C4'" "C5'" "H5''" 109.624 1.50 +M2G "H5'" "C5'" "H5''" 108.472 1.50 +M2G "C5'" "C4'" "O4'" 109.123 1.50 +M2G "C5'" "C4'" "C3'" 116.008 1.52 +M2G "C5'" "C4'" "H4'" 108.268 1.50 +M2G "O4'" "C4'" "C3'" 105.388 1.50 +M2G "O4'" "C4'" "H4'" 108.947 1.50 +M2G "C3'" "C4'" "H4'" 109.363 1.86 +M2G "C4'" "O4'" "C1'" 109.903 1.50 +M2G "C4'" "C3'" "O3'" 111.281 2.46 +M2G "C4'" "C3'" "C2'" 102.602 1.50 +M2G "C4'" "C3'" "H3'" 110.452 2.54 +M2G "O3'" "C3'" "C2'" 111.581 2.83 +M2G "O3'" "C3'" "H3'" 110.380 1.67 +M2G "C2'" "C3'" "H3'" 110.504 1.75 +M2G "C3'" "O3'" "HO3'" 108.744 3.00 +M2G "C3'" "C2'" "O2'" 112.782 2.45 +M2G "C3'" "C2'" "C1'" 101.239 1.50 +M2G "C3'" "C2'" "H2'" 110.596 1.51 +M2G "O2'" "C2'" "C1'" 111.715 2.69 +M2G "O2'" "C2'" "H2'" 110.448 1.97 +M2G "C1'" "C2'" "H2'" 110.636 1.70 +M2G "C2'" "O2'" "HO2'" 109.103 2.13 +M2G "O4'" "C1'" "C2'" 106.047 1.50 +M2G "O4'" "C1'" N9 108.477 1.50 +M2G "O4'" "C1'" "H1'" 109.807 1.50 +M2G "C2'" "C1'" N9 113.824 1.50 +M2G "C2'" "C1'" "H1'" 109.015 1.50 +M2G N9 "C1'" "H1'" 109.561 1.50 +M2G "C1'" N9 C8 126.829 1.91 +M2G "C1'" N9 C4 127.440 1.80 +M2G C8 N9 C4 105.731 1.50 +M2G N9 C8 N7 113.507 1.50 +M2G N9 C8 H8 123.187 1.50 +M2G N7 C8 H8 123.307 1.50 +M2G C8 N7 C5 104.778 1.50 +M2G N7 C5 C6 130.048 1.50 +M2G N7 C5 C4 110.574 1.50 +M2G C6 C5 C4 119.378 1.50 +M2G C5 C6 O6 128.253 1.50 +M2G C5 C6 N1 111.349 1.50 +M2G O6 C6 N1 120.398 1.50 +M2G C6 N1 C2 123.973 1.50 +M2G C6 N1 HN1 117.776 2.44 +M2G C2 N1 HN1 118.251 1.59 +M2G N1 C2 N2 118.650 1.50 +M2G N1 C2 N3 122.959 1.50 +M2G N2 C2 N3 118.391 2.18 +M2G C2 N2 CM1 121.373 2.30 +M2G C2 N2 CM2 121.373 2.30 +M2G CM1 N2 CM2 117.254 1.50 +M2G C2 N3 C4 114.148 1.50 +M2G N9 C4 C5 105.411 1.50 +M2G N9 C4 N3 126.396 1.50 +M2G C5 C4 N3 128.193 1.50 +M2G N2 CM1 HM11 109.468 1.50 +M2G N2 CM1 HM12 109.468 1.50 +M2G N2 CM1 HM13 109.468 1.50 +M2G HM11 CM1 HM12 109.352 1.56 +M2G HM11 CM1 HM13 109.352 1.56 +M2G HM12 CM1 HM13 109.352 1.56 +M2G N2 CM2 HM21 109.468 1.50 +M2G N2 CM2 HM22 109.468 1.50 +M2G N2 CM2 HM23 109.468 1.50 +M2G HM21 CM2 HM22 109.352 1.56 +M2G HM21 CM2 HM23 109.352 1.56 +M2G HM22 CM2 HM23 109.352 1.56 + +loop_ +_chem_comp_tor.comp_id +_chem_comp_tor.id +_chem_comp_tor.atom_id_1 +_chem_comp_tor.atom_id_2 +_chem_comp_tor.atom_id_3 +_chem_comp_tor.atom_id_4 +_chem_comp_tor.value_angle +_chem_comp_tor.value_angle_esd +_chem_comp_tor.period +M2G C2e-chi "O4'" "C1'" N9 C4 210.000 10.000 6 +M2G C2e-nyu0 "C4'" "O4'" "C1'" "C2'" 340.700 6.300 1 +M2G C2e-nyu1 "O4'" "C1'" "C2'" "C3'" 32.800 4.900 1 +M2G C2e-nyu2 "C1'" "C2'" "C3'" "C4'" 326.9 3.600 1 +M2G C2e-nyu3 "C2'" "C3'" "C4'" "O4'" 22.600 4.500 1 +M2G C2e-nyu4 "C3'" "C4'" "O4'" "C1'" 357.700 6.100 1 +M2G C3e-chi "O4'" "C1'" N9 C4 210.000 10.000 6 +M2G C3e-nyu0 "C4'" "O4'" "C1'" "C2'" 2.8 6.100 1 +M2G C3e-nyu1 "O4'" "C1'" "C2'" "C3'" 335.00 4.900 1 +M2G C3e-nyu2 "C1'" "C2'" "C3'" "C4'" 35.9 2.800 1 +M2G C3e-nyu3 "C2'" "C3'" "C4'" "O4'" 324.700 3.100 1 +M2G C3e-nyu4 "C3'" "C4'" "O4'" "C1'" 20.500 5.100 1 +M2G alpha "C5'" "O5'" P OP3 -60.000 10.00 3 +M2G beta P "O5'" "C5'" "C4'" 180.000 10.00 3 +M2G epsi "C4'" "C3'" "O3'" "HO3'" 180.000 10.00 3 +M2G gamma "O5'" "C5'" "C4'" "C3'" 180.000 10.00 3 +M2G sp3_sp3_52 "C3'" "C2'" "O2'" "HO2'" 180.000 10.00 3 +M2G const_18 N7 C8 N9 "C1'" 180.000 10.0 2 +M2G const_30 C5 C4 N9 "C1'" 180.000 10.0 2 +M2G const_21 N9 C8 N7 C5 0.000 10.0 2 +M2G const_24 C6 C5 N7 C8 180.000 10.0 2 +M2G const_sp2_sp2_4 N7 C5 C6 O6 0.000 5.0 2 +M2G const_25 N9 C4 C5 N7 0.000 10.0 2 +M2G const_sp2_sp2_7 O6 C6 N1 C2 180.000 5.0 2 +M2G const_11 N2 C2 N1 C6 180.000 10.0 2 +M2G sp2_sp2_1 N1 C2 N2 CM1 180.000 5.0 2 +M2G const_14 N2 C2 N3 C4 180.000 10.0 2 +M2G sp2_sp3_10 CM2 N2 CM1 HM11 180.000 10.0 6 +M2G sp2_sp3_16 CM1 N2 CM2 HM21 180.000 10.0 6 +M2G const_16 N9 C4 N3 C2 180.000 10.0 2 + +loop_ +_chem_comp_chir.comp_id +_chem_comp_chir.id +_chem_comp_chir.atom_id_centre +_chem_comp_chir.atom_id_1 +_chem_comp_chir.atom_id_2 +_chem_comp_chir.atom_id_3 +_chem_comp_chir.volume_sign +M2G chir_1 P "O5'" OP2 OP3 both +M2G chir_2 "C4'" "O4'" "C3'" "C5'" negative +M2G chir_3 "C3'" "O3'" "C4'" "C2'" positive +M2G chir_4 "C2'" "O2'" "C1'" "C3'" negative +M2G chir_5 "C1'" "O4'" N9 "C2'" negative + +loop_ +_chem_comp_plane_atom.comp_id +_chem_comp_plane_atom.plane_id +_chem_comp_plane_atom.atom_id +_chem_comp_plane_atom.dist_esd +M2G plan-1 "C1'" 0.020 +M2G plan-1 C2 0.020 +M2G plan-1 C4 0.020 +M2G plan-1 C5 0.020 +M2G plan-1 C6 0.020 +M2G plan-1 C8 0.020 +M2G plan-1 H8 0.020 +M2G plan-1 HN1 0.020 +M2G plan-1 N1 0.020 +M2G plan-1 N2 0.020 +M2G plan-1 N3 0.020 +M2G plan-1 N7 0.020 +M2G plan-1 N9 0.020 +M2G plan-1 O6 0.020 +M2G plan-2 C2 0.020 +M2G plan-2 CM1 0.020 +M2G plan-2 CM2 0.020 +M2G plan-2 N2 0.020 + +loop_ +_pdbx_chem_comp_descriptor.comp_id +_pdbx_chem_comp_descriptor.type +_pdbx_chem_comp_descriptor.program +_pdbx_chem_comp_descriptor.program_version +_pdbx_chem_comp_descriptor.descriptor +M2G SMILES ACDLabs 10.04 O=C1c2ncn(c2N=C(N(C)C)N1)C3OC(C(O)C3O)COP(=O)(O)O +M2G SMILES_CANONICAL CACTVS 3.341 CN(C)C1=Nc2n(cnc2C(=O)N1)[C@@H]3O[C@H](CO[P](O)(O)=O)[C@@H](O)[C@H]3O +M2G SMILES CACTVS 3.341 CN(C)C1=Nc2n(cnc2C(=O)N1)[CH]3O[CH](CO[P](O)(O)=O)[CH](O)[CH]3O +M2G SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 CN(C)C1=Nc2c(ncn2[C@H]3[C@@H]([C@@H]([C@H](O3)COP(=O)(O)O)O)O)C(=O)N1 +M2G SMILES "OpenEye OEToolkits" 1.5.0 CN(C)C1=Nc2c(ncn2C3C(C(C(O3)COP(=O)(O)O)O)O)C(=O)N1 +M2G InChI InChI 1.03 InChI=1S/C12H18N5O8P/c1-16(2)12-14-9-6(10(20)15-12)13-4-17(9)11-8(19)7(18)5(25-11)3-24-26(21,22)23/h4-5,7-8,11,18-19H,3H2,1-2H3,(H,14,15,20)(H2,21,22,23)/t5-,7-,8-,11-/m1/s1 +M2G InChIKey InChI 1.03 IWJFVRMOIKWYNZ-IOSLPCCCSA-N + +loop_ +_pdbx_chem_comp_description_generator.comp_id +_pdbx_chem_comp_description_generator.program_name +_pdbx_chem_comp_description_generator.program_version +_pdbx_chem_comp_description_generator.descriptor +M2G acedrg 243 "dictionary generator" +M2G acedrg_database 11 "data source" +M2G rdkit 2017.03.2 "Chemoinformatics tool" +M2G refmac5 5.8.0238 "optimization tool" diff --git a/image_analysis/structure_refinement/monomers/MET.cif b/image_analysis/structure_refinement/monomers/MET.cif new file mode 100644 index 000000000..28a95f5e7 --- /dev/null +++ b/image_analysis/structure_refinement/monomers/MET.cif @@ -0,0 +1,226 @@ +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +MET MET METHIONINE peptide 20 9 . + +data_comp_MET +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +MET N N NT3 1 16.235 16.083 52.229 +MET CA C CH1 0 15.074 16.893 51.770 +MET C C C 0 13.874 15.966 51.506 +MET O O O 0 12.749 16.368 51.879 +MET CB C CH2 0 15.401 17.671 50.489 +MET CG C CH2 0 16.529 18.680 50.635 +MET SD S S2 0 18.171 17.933 50.684 +MET CE C CH3 0 18.367 17.396 48.979 +MET OXT O OC -1 14.108 14.877 50.937 +MET H H H 0 16.577 15.615 51.537 +MET H2 H H 0 15.985 15.507 52.876 +MET H3 H H 0 16.877 16.622 52.563 +MET HA H H 0 14.833 17.529 52.491 +MET HB3 H H 0 14.592 18.143 50.197 +MET HB2 H H 0 15.638 17.028 49.787 +MET HG3 H H 0 16.395 19.191 51.458 +MET HG2 H H 0 16.495 19.307 49.886 +MET HE3 H H 0 18.130 18.128 48.379 +MET HE2 H H 0 17.783 16.634 48.809 +MET HE1 H H 0 19.294 17.136 48.825 + +loop_ +_chem_comp_tree.comp_id +_chem_comp_tree.atom_id +_chem_comp_tree.atom_back +_chem_comp_tree.atom_forward +_chem_comp_tree.connect_type +MET N n/a CA START +MET H N . . +MET H2 N . . +MET H3 N . . +MET CA N C . +MET HA CA . . +MET CB CA CG . +MET HB3 CB . . +MET HB2 CB . . +MET CG CB SD . +MET HG3 CG . . +MET HG2 CG . . +MET SD CG CE . +MET CE SD HE3 . +MET HE1 CE . . +MET HE2 CE . . +MET HE3 CE . . +MET C CA . END +MET O C . . +MET OXT C . . + +loop_ +_chem_comp_acedrg.comp_id +_chem_comp_acedrg.atom_id +_chem_comp_acedrg.atom_type +MET N N(CCCH)(H)3 +MET CA C(CCHH)(NH3)(COO)(H) +MET C C(CCHN)(O)2 +MET O O(CCO) +MET CB C(CCHN)(CHHS)(H)2 +MET CG C(CCHH)(SC)(H)2 +MET SD S(CCHH)(CH3) +MET CE C(SC)(H)3 +MET OXT O(CCO) +MET H H(NCHH) +MET H2 H(NCHH) +MET H3 H(NCHH) +MET HA H(CCCN) +MET HB3 H(CCCH) +MET HB2 H(CCCH) +MET HG3 H(CCHS) +MET HG2 H(CCHS) +MET HE3 H(CHHS) +MET HE2 H(CHHS) +MET HE1 H(CHHS) + +loop_ +_chem_comp_bond.comp_id +_chem_comp_bond.atom_id_1 +_chem_comp_bond.atom_id_2 +_chem_comp_bond.type +_chem_comp_bond.aromatic +_chem_comp_bond.value_dist_nucleus +_chem_comp_bond.value_dist_nucleus_esd +_chem_comp_bond.value_dist +_chem_comp_bond.value_dist_esd +MET N CA SINGLE n 1.487 0.0100 1.487 0.0100 +MET CA C SINGLE n 1.538 0.0113 1.538 0.0113 +MET CA CB SINGLE n 1.533 0.0100 1.533 0.0100 +MET C O DOUBLE n 1.251 0.0183 1.251 0.0183 +MET C OXT SINGLE n 1.251 0.0183 1.251 0.0183 +MET CB CG SINGLE n 1.517 0.0186 1.517 0.0186 +MET CG SD SINGLE n 1.804 0.0100 1.804 0.0100 +MET SD CE SINGLE n 1.798 0.0100 1.798 0.0100 +MET N H SINGLE n 1.018 0.0520 0.902 0.0102 +MET N H2 SINGLE n 1.018 0.0520 0.902 0.0102 +MET N H3 SINGLE n 1.018 0.0520 0.902 0.0102 +MET CA HA SINGLE n 1.092 0.0100 0.991 0.0200 +MET CB HB3 SINGLE n 1.092 0.0100 0.981 0.0141 +MET CB HB2 SINGLE n 1.092 0.0100 0.981 0.0141 +MET CG HG3 SINGLE n 1.092 0.0100 0.978 0.0200 +MET CG HG2 SINGLE n 1.092 0.0100 0.978 0.0200 +MET CE HE3 SINGLE n 1.092 0.0100 0.975 0.0110 +MET CE HE2 SINGLE n 1.092 0.0100 0.975 0.0110 +MET CE HE1 SINGLE n 1.092 0.0100 0.975 0.0110 + +loop_ +_chem_comp_angle.comp_id +_chem_comp_angle.atom_id_1 +_chem_comp_angle.atom_id_2 +_chem_comp_angle.atom_id_3 +_chem_comp_angle.value_angle +_chem_comp_angle.value_angle_esd +MET CA N H 109.990 3.00 +MET CA N H2 109.990 3.00 +MET CA N H3 109.990 3.00 +MET H N H2 109.032 3.00 +MET H N H3 109.032 3.00 +MET H2 N H3 109.032 3.00 +MET N CA C 109.258 1.50 +MET N CA CB 110.970 1.50 +MET N CA HA 108.387 1.58 +MET C CA CB 109.608 2.17 +MET C CA HA 108.774 1.79 +MET CB CA HA 109.550 1.56 +MET CA C O 117.148 1.60 +MET CA C OXT 117.148 1.60 +MET O C OXT 125.704 1.50 +MET CA CB CG 113.978 1.60 +MET CA CB HB3 108.606 1.50 +MET CA CB HB2 108.606 1.50 +MET CG CB HB3 108.930 1.50 +MET CG CB HB2 108.930 1.50 +MET HB3 CB HB2 107.726 1.50 +MET CB CG SD 112.846 3.00 +MET CB CG HG3 109.287 1.50 +MET CB CG HG2 109.287 1.50 +MET SD CG HG3 108.733 1.50 +MET SD CG HG2 108.733 1.50 +MET HG3 CG HG2 107.881 1.50 +MET CG SD CE 100.693 3.00 +MET SD CE HE3 109.472 1.50 +MET SD CE HE2 109.472 1.50 +MET SD CE HE1 109.472 1.50 +MET HE3 CE HE2 109.569 2.44 +MET HE3 CE HE1 109.569 2.44 +MET HE2 CE HE1 109.569 2.44 + +loop_ +_chem_comp_tor.comp_id +_chem_comp_tor.id +_chem_comp_tor.atom_id_1 +_chem_comp_tor.atom_id_2 +_chem_comp_tor.atom_id_3 +_chem_comp_tor.atom_id_4 +_chem_comp_tor.value_angle +_chem_comp_tor.value_angle_esd +_chem_comp_tor.period +MET chi1 N CA CB CG -60.000 10.0 3 +MET chi2 CA CB CG SD 180.000 10.0 3 +MET chi3 CB CG SD CE 180.000 10.0 3 +MET hh1 CG SD CE HE3 60.000 10.0 3 +MET sp3_sp3_1 C CA N H 180.000 10.0 3 +MET sp2_sp3_1 O C CA N 0.000 10.0 6 + +loop_ +_chem_comp_chir.comp_id +_chem_comp_chir.id +_chem_comp_chir.atom_id_centre +_chem_comp_chir.atom_id_1 +_chem_comp_chir.atom_id_2 +_chem_comp_chir.atom_id_3 +_chem_comp_chir.volume_sign +MET chir_1 CA N C CB positive + +loop_ +_chem_comp_plane_atom.comp_id +_chem_comp_plane_atom.plane_id +_chem_comp_plane_atom.atom_id +_chem_comp_plane_atom.dist_esd +MET plan-1 C 0.020 +MET plan-1 CA 0.020 +MET plan-1 O 0.020 +MET plan-1 OXT 0.020 + +loop_ +_pdbx_chem_comp_descriptor.comp_id +_pdbx_chem_comp_descriptor.type +_pdbx_chem_comp_descriptor.program +_pdbx_chem_comp_descriptor.program_version +_pdbx_chem_comp_descriptor.descriptor +MET SMILES ACDLabs 10.04 O=C(O)C(N)CCSC +MET SMILES_CANONICAL CACTVS 3.341 CSCC[C@H](N)C(O)=O +MET SMILES CACTVS 3.341 CSCC[CH](N)C(O)=O +MET SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 CSCC[C@@H](C(=O)O)N +MET SMILES "OpenEye OEToolkits" 1.5.0 CSCCC(C(=O)O)N +MET InChI InChI 1.03 InChI=1S/C5H11NO2S/c1-9-3-2-4(6)5(7)8/h4H,2-3,6H2,1H3,(H,7,8)/t4-/m0/s1 +MET InChIKey InChI 1.03 FFEARJCKVFRZRR-BYPYZUCNSA-N + +loop_ +_pdbx_chem_comp_description_generator.comp_id +_pdbx_chem_comp_description_generator.program_name +_pdbx_chem_comp_description_generator.program_version +_pdbx_chem_comp_description_generator.descriptor +MET acedrg 278 "dictionary generator" +MET acedrg_database 12 "data source" +MET rdkit 2019.09.1 "Chemoinformatics tool" +MET refmac5 5.8.0419 "optimization tool" diff --git a/image_analysis/structure_refinement/monomers/MG.cif b/image_analysis/structure_refinement/monomers/MG.cif new file mode 100644 index 000000000..1b723799b --- /dev/null +++ b/image_analysis/structure_refinement/monomers/MG.cif @@ -0,0 +1,30 @@ +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +MG MG 'MAGNESIUM ION ' NON-POLYMER 1 1 . + +data_comp_MG +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.partial_charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +MG MG MG MG 2.000 0.000 0.000 0.000 + +loop_ +_chem_comp_tree.comp_id +_chem_comp_tree.atom_id +_chem_comp_tree.atom_back +_chem_comp_tree.atom_forward +_chem_comp_tree.connect_type +MG MG n/a . END diff --git a/image_analysis/structure_refinement/monomers/MN.cif b/image_analysis/structure_refinement/monomers/MN.cif new file mode 100644 index 000000000..ee5537884 --- /dev/null +++ b/image_analysis/structure_refinement/monomers/MN.cif @@ -0,0 +1,30 @@ +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +MN MN 'MANGANESE (II) ION ' NON-POLYMER 1 1 . + +data_comp_MN +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.partial_charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +MN MN MN MN 2.000 0.000 0.000 0.000 + +loop_ +_chem_comp_tree.comp_id +_chem_comp_tree.atom_id +_chem_comp_tree.atom_back +_chem_comp_tree.atom_forward +_chem_comp_tree.connect_type +MN MN n/a . END diff --git a/image_analysis/structure_refinement/monomers/MPD.cif b/image_analysis/structure_refinement/monomers/MPD.cif new file mode 100644 index 000000000..bc29cd330 --- /dev/null +++ b/image_analysis/structure_refinement/monomers/MPD.cif @@ -0,0 +1,170 @@ +# +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +MPD MPD (4S)-2-METHYL-2,4-PENTANEDIOL NON-POLYMER 22 8 . +# +data_comp_MPD +# +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +MPD C1 C CH3 0 -2.742 -3.513 8.489 +MPD C2 C CT 0 -3.104 -4.028 9.879 +MPD O2 O OH1 0 -3.051 -5.468 9.845 +MPD CM C CH3 0 -4.531 -3.659 10.262 +MPD C3 C CH2 0 -2.100 -3.522 10.924 +MPD C4 C CH1 0 -2.174 -4.161 12.300 +MPD O4 O OH1 0 -1.753 -5.524 12.217 +MPD C5 C CH3 0 -1.373 -3.434 13.348 +MPD H11 H H 0 -2.205 -2.707 8.574 +MPD H12 H H 0 -3.550 -3.311 7.989 +MPD H13 H H 0 -2.231 -4.191 8.014 +MPD HO2 H H 0 -2.246 -5.731 9.774 +MPD HM1 H H 0 -4.554 -2.734 10.562 +MPD HM2 H H 0 -4.831 -4.241 10.980 +MPD HM3 H H 0 -5.116 -3.767 9.494 +MPD H31 H H 0 -2.230 -2.555 11.026 +MPD H32 H H 0 -1.197 -3.662 10.569 +MPD H4 H H 0 -3.118 -4.168 12.600 +MPD HO4 H H 0 -0.938 -5.565 11.984 +MPD H51 H H 0 -0.836 -4.069 13.855 +MPD H52 H H 0 -1.976 -2.969 13.955 +MPD H53 H H 0 -0.783 -2.784 12.924 +loop_ +_chem_comp_bond.comp_id +_chem_comp_bond.atom_id_1 +_chem_comp_bond.atom_id_2 +_chem_comp_bond.type +_chem_comp_bond.aromatic +_chem_comp_bond.value_dist_nucleus +_chem_comp_bond.value_dist_nucleus_esd +_chem_comp_bond.value_dist +_chem_comp_bond.value_dist_esd +MPD C1 C2 SINGLE n 1.520 0.0101 1.520 0.0101 +MPD C2 O2 SINGLE n 1.437 0.0141 1.437 0.0141 +MPD C2 CM SINGLE n 1.520 0.0101 1.520 0.0101 +MPD C2 C3 SINGLE n 1.531 0.0100 1.531 0.0100 +MPD C3 C4 SINGLE n 1.506 0.0200 1.506 0.0200 +MPD C4 O4 SINGLE n 1.424 0.0199 1.424 0.0199 +MPD C4 C5 SINGLE n 1.501 0.0160 1.501 0.0160 +MPD C1 H11 SINGLE n 1.089 0.0100 0.972 0.0148 +MPD C1 H12 SINGLE n 1.089 0.0100 0.972 0.0148 +MPD C1 H13 SINGLE n 1.089 0.0100 0.972 0.0148 +MPD O2 HO2 SINGLE n 0.970 0.0120 0.848 0.0200 +MPD CM HM1 SINGLE n 1.089 0.0100 0.972 0.0148 +MPD CM HM2 SINGLE n 1.089 0.0100 0.972 0.0148 +MPD CM HM3 SINGLE n 1.089 0.0100 0.972 0.0148 +MPD C3 H31 SINGLE n 1.089 0.0100 0.981 0.0160 +MPD C3 H32 SINGLE n 1.089 0.0100 0.981 0.0160 +MPD C4 H4 SINGLE n 1.089 0.0100 0.992 0.0184 +MPD O4 HO4 SINGLE n 0.970 0.0120 0.848 0.0200 +MPD C5 H51 SINGLE n 1.089 0.0100 0.974 0.0145 +MPD C5 H52 SINGLE n 1.089 0.0100 0.974 0.0145 +MPD C5 H53 SINGLE n 1.089 0.0100 0.974 0.0145 +loop_ +_chem_comp_angle.comp_id +_chem_comp_angle.atom_id_1 +_chem_comp_angle.atom_id_2 +_chem_comp_angle.atom_id_3 +_chem_comp_angle.value_angle +_chem_comp_angle.value_angle_esd +MPD C2 C1 H11 109.123 1.50 +MPD C2 C1 H12 109.123 1.50 +MPD C2 C1 H13 109.123 1.50 +MPD H11 C1 H12 109.441 1.50 +MPD H11 C1 H13 109.441 1.50 +MPD H12 C1 H13 109.441 1.50 +MPD C1 C2 O2 107.291 2.44 +MPD C1 C2 CM 110.915 1.50 +MPD C1 C2 C3 111.119 1.58 +MPD O2 C2 CM 107.291 2.44 +MPD O2 C2 C3 107.760 2.12 +MPD CM C2 C3 111.119 1.58 +MPD C2 O2 HO2 109.561 1.92 +MPD C2 CM HM1 109.123 1.50 +MPD C2 CM HM2 109.123 1.50 +MPD C2 CM HM3 109.123 1.50 +MPD HM1 CM HM2 109.441 1.50 +MPD HM1 CM HM3 109.441 1.50 +MPD HM2 CM HM3 109.441 1.50 +MPD C2 C3 C4 111.094 2.85 +MPD C2 C3 H31 108.201 1.50 +MPD C2 C3 H32 108.201 1.50 +MPD C4 C3 H31 108.468 1.50 +MPD C4 C3 H32 108.468 1.50 +MPD H31 C3 H32 107.715 1.50 +MPD C3 C4 O4 109.024 2.32 +MPD C3 C4 C5 113.468 3.00 +MPD C3 C4 H4 108.603 1.50 +MPD O4 C4 C5 109.534 2.02 +MPD O4 C4 H4 107.545 2.92 +MPD C5 C4 H4 108.620 2.54 +MPD C4 O4 HO4 109.880 2.07 +MPD C4 C5 H51 109.852 1.50 +MPD C4 C5 H52 109.852 1.50 +MPD C4 C5 H53 109.852 1.50 +MPD H51 C5 H52 109.425 1.50 +MPD H51 C5 H53 109.425 1.50 +MPD H52 C5 H53 109.425 1.50 +loop_ +_chem_comp_tor.comp_id +_chem_comp_tor.id +_chem_comp_tor.atom_id_1 +_chem_comp_tor.atom_id_2 +_chem_comp_tor.atom_id_3 +_chem_comp_tor.atom_id_4 +_chem_comp_tor.value_angle +_chem_comp_tor.value_angle_esd +_chem_comp_tor.period +MPD sp3_sp3_2 H11 C1 C2 O2 -60.000 10.0 3 +MPD sp3_sp3_10 C1 C2 O2 HO2 180.000 10.0 3 +MPD sp3_sp3_19 C1 C2 CM HM1 -60.000 10.0 3 +MPD sp3_sp3_25 C1 C2 C3 C4 60.000 10.0 3 +MPD sp3_sp3_31 C2 C3 C4 O4 180.000 10.0 3 +MPD sp3_sp3_40 C3 C4 O4 HO4 180.000 10.0 3 +MPD sp3_sp3_43 C3 C4 C5 H51 180.000 10.0 3 +loop_ +_chem_comp_chir.comp_id +_chem_comp_chir.id +_chem_comp_chir.atom_id_centre +_chem_comp_chir.atom_id_1 +_chem_comp_chir.atom_id_2 +_chem_comp_chir.atom_id_3 +_chem_comp_chir.volume_sign +MPD chir_1 C2 O2 C3 C1 both +MPD chir_2 C4 O4 C3 C5 positive +loop_ +_pdbx_chem_comp_descriptor.comp_id +_pdbx_chem_comp_descriptor.type +_pdbx_chem_comp_descriptor.program +_pdbx_chem_comp_descriptor.program_version +_pdbx_chem_comp_descriptor.descriptor +MPD SMILES ACDLabs 11.02 OC(C)CC(O)(C)C +MPD SMILES_CANONICAL CACTVS 3.352 C[C@H](O)CC(C)(C)O +MPD SMILES CACTVS 3.352 C[CH](O)CC(C)(C)O +MPD SMILES_CANONICAL "OpenEye OEToolkits" 1.7.0 C[C@@H](CC(C)(C)O)O +MPD SMILES "OpenEye OEToolkits" 1.7.0 CC(CC(C)(C)O)O +MPD InChI InChI 1.03 InChI=1S/C6H14O2/c1-5(7)4-6(2,3)8/h5,7-8H,4H2,1-3H3/t5-/m0/s1 +MPD InChIKey InChI 1.03 SVTBMSDMJJWYQN-YFKPBYRVSA-N +loop_ +_pdbx_chem_comp_description_generator.comp_id +_pdbx_chem_comp_description_generator.program_name +_pdbx_chem_comp_description_generator.program_version +_pdbx_chem_comp_description_generator.descriptor +MPD acedrg 243 "dictionary generator" +MPD acedrg_database 11 "data source" +MPD rdkit 2017.03.2 "Chemoinformatics tool" +MPD refmac5 5.8.0238 "optimization tool" diff --git a/image_analysis/structure_refinement/monomers/MSE.cif b/image_analysis/structure_refinement/monomers/MSE.cif new file mode 100644 index 000000000..d73f9f68b --- /dev/null +++ b/image_analysis/structure_refinement/monomers/MSE.cif @@ -0,0 +1,201 @@ +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +MSE MSE SELENOMETHIONINE peptide 20 9 . + +data_comp_MSE +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +MSE N N NT3 1 10.980 -7.344 20.020 +MSE CA C CH1 0 10.215 -8.538 19.563 +MSE C C C 0 8.775 -8.458 20.089 +MSE O O O 0 8.605 -7.967 21.223 +MSE OXT O OC -1 7.876 -8.895 19.344 +MSE CB C CH2 0 10.896 -9.824 20.043 +MSE CG C CH2 0 12.189 -10.151 19.325 +MSE SE SE SE 0 12.850 -11.935 19.808 +MSE CE C CH3 0 13.628 -11.498 21.557 +MSE H H H 0 11.808 -7.339 19.642 +MSE H2 H H 0 11.069 -7.358 20.927 +MSE H3 H H 0 10.544 -6.581 19.779 +MSE HA H H 0 10.192 -8.533 18.579 +MSE HB2 H H 0 10.295 -10.556 19.923 +MSE HB3 H H 0 11.082 -9.746 20.975 +MSE HG2 H H 0 12.870 -9.483 19.555 +MSE HG3 H H 0 12.044 -10.114 18.355 +MSE HE1 H H 0 14.013 -12.298 21.947 +MSE HE2 H H 0 12.935 -11.153 22.141 +MSE HE3 H H 0 14.320 -10.828 21.443 + +loop_ +_chem_comp_tree.comp_id +_chem_comp_tree.atom_id +_chem_comp_tree.atom_back +_chem_comp_tree.atom_forward +_chem_comp_tree.connect_type +MSE N n/a CA START +MSE H N . . +MSE H2 N . . +MSE H3 N . . +MSE CA N C . +MSE HA CA . . +MSE CB CA CG . +MSE HB2 CB . . +MSE HB3 CB . . +MSE CG CB SE . +MSE HG2 CG . . +MSE HG3 CG . . +MSE SE CG CE . +MSE CE SE HE1 . +MSE HE3 CE . . +MSE HE2 CE . . +MSE HE1 CE . . +MSE C CA . END +MSE O C . . +MSE OXT C . . + +loop_ +_chem_comp_bond.comp_id +_chem_comp_bond.atom_id_1 +_chem_comp_bond.atom_id_2 +_chem_comp_bond.type +_chem_comp_bond.aromatic +_chem_comp_bond.value_dist_nucleus +_chem_comp_bond.value_dist_nucleus_esd +_chem_comp_bond.value_dist +_chem_comp_bond.value_dist_esd +MSE N CA SINGLE n 1.488 0.0100 1.488 0.0100 +MSE CA C SINGLE n 1.533 0.0100 1.533 0.0100 +MSE CA CB SINGLE n 1.532 0.0100 1.532 0.0100 +MSE C O DOUBLE n 1.247 0.0187 1.247 0.0187 +MSE C OXT SINGLE n 1.247 0.0187 1.247 0.0187 +MSE CB CG SINGLE n 1.514 0.0200 1.514 0.0200 +MSE CG SE SINGLE n 1.963 0.0200 1.963 0.0200 +MSE SE CE SINGLE n 1.963 0.0200 1.963 0.0200 +MSE N H SINGLE n 1.036 0.0160 0.911 0.0200 +MSE N H2 SINGLE n 1.036 0.0160 0.911 0.0200 +MSE N H3 SINGLE n 1.036 0.0160 0.911 0.0200 +MSE CA HA SINGLE n 1.089 0.0100 0.985 0.0200 +MSE CB HB2 SINGLE n 1.089 0.0100 0.954 0.0200 +MSE CB HB3 SINGLE n 1.089 0.0100 0.954 0.0200 +MSE CG HG2 SINGLE n 1.089 0.0100 0.981 0.0167 +MSE CG HG3 SINGLE n 1.089 0.0100 0.981 0.0167 +MSE CE HE1 SINGLE n 1.089 0.0100 0.970 0.0162 +MSE CE HE2 SINGLE n 1.089 0.0100 0.970 0.0162 +MSE CE HE3 SINGLE n 1.089 0.0100 0.970 0.0162 + +loop_ +_chem_comp_angle.comp_id +_chem_comp_angle.atom_id_1 +_chem_comp_angle.atom_id_2 +_chem_comp_angle.atom_id_3 +_chem_comp_angle.value_angle +_chem_comp_angle.value_angle_esd +MSE CA N H 110.062 1.93 +MSE CA N H2 110.062 1.93 +MSE CA N H3 110.062 1.93 +MSE H N H2 109.028 2.41 +MSE H N H3 109.028 2.41 +MSE H2 N H3 109.028 2.41 +MSE N CA C 109.241 1.50 +MSE N CA CB 110.245 1.51 +MSE N CA HA 108.487 1.50 +MSE C CA CB 110.728 2.07 +MSE C CA HA 108.824 1.50 +MSE CB CA HA 109.207 1.50 +MSE CA C O 117.124 1.50 +MSE CA C OXT 117.124 1.50 +MSE O C OXT 125.752 1.50 +MSE CA CB CG 113.897 1.50 +MSE CA CB HB2 108.567 1.50 +MSE CA CB HB3 108.567 1.50 +MSE CG CB HB2 108.056 1.50 +MSE CG CB HB3 108.056 1.50 +MSE HB2 CB HB3 107.715 1.50 +MSE CB CG SE 111.593 3.00 +MSE CB CG HG2 109.535 1.63 +MSE CB CG HG3 109.535 1.63 +MSE SE CG HG2 109.134 1.50 +MSE SE CG HG3 109.134 1.50 +MSE HG2 CG HG3 108.011 1.50 +MSE CG SE CE 98.689 1.50 +MSE SE CE HE1 109.134 1.50 +MSE SE CE HE2 109.134 1.50 +MSE SE CE HE3 109.134 1.50 +MSE HE1 CE HE2 109.290 1.50 +MSE HE1 CE HE3 109.290 1.50 +MSE HE2 CE HE3 109.290 1.50 + +loop_ +_chem_comp_tor.comp_id +_chem_comp_tor.id +_chem_comp_tor.atom_id_1 +_chem_comp_tor.atom_id_2 +_chem_comp_tor.atom_id_3 +_chem_comp_tor.atom_id_4 +_chem_comp_tor.value_angle +_chem_comp_tor.value_angle_esd +_chem_comp_tor.period +MSE sp3_sp3_1 C CA N H 180.000 10.0 3 +MSE sp2_sp3_1 O C CA N 0.000 10.0 6 +MSE sp3_sp3_10 N CA CB CG 180.000 10.0 3 +MSE sp3_sp3_19 CA CB CG SE 180.000 10.0 3 +MSE sp3_sp3_28 CB CG SE CE 180.000 10.0 3 +MSE sp3_sp3_31 HE1 CE SE CG 180.000 10.0 3 + +loop_ +_chem_comp_chir.comp_id +_chem_comp_chir.id +_chem_comp_chir.atom_id_centre +_chem_comp_chir.atom_id_1 +_chem_comp_chir.atom_id_2 +_chem_comp_chir.atom_id_3 +_chem_comp_chir.volume_sign +MSE chir_1 CA N C CB positive + +loop_ +_chem_comp_plane_atom.comp_id +_chem_comp_plane_atom.plane_id +_chem_comp_plane_atom.atom_id +_chem_comp_plane_atom.dist_esd +MSE plan-1 C 0.020 +MSE plan-1 CA 0.020 +MSE plan-1 O 0.020 +MSE plan-1 OXT 0.020 + +loop_ +_pdbx_chem_comp_descriptor.comp_id +_pdbx_chem_comp_descriptor.type +_pdbx_chem_comp_descriptor.program +_pdbx_chem_comp_descriptor.program_version +_pdbx_chem_comp_descriptor.descriptor +MSE SMILES ACDLabs 10.04 O=C(O)C(N)CC[Se]C +MSE SMILES_CANONICAL CACTVS 3.341 C[Se]CC[C@H](N)C(O)=O +MSE SMILES CACTVS 3.341 C[Se]CC[CH](N)C(O)=O +MSE SMILES_CANONICAL ""OpenEye OEToolkits" 1.5.0 C[Se]CC[C@@H](C(=O)O)N +MSE SMILES ""OpenEye OEToolkits" 1.5.0 C[Se]CCC(C(=O)O)N +MSE InChI InChI 1.03 InChI=1S/C5H11NO2Se/c1-9-3-2-4(6)5(7)8/h4H,2-3,6H2,1H3,(H,7,8)/t4-/m0/s1 +MSE InChIKey InChI 1.03 RJFAYQIBOAGBLC-BYPYZUCNSA-N + +loop_ +_pdbx_chem_comp_description_generator.comp_id +_pdbx_chem_comp_description_generator.program_name +_pdbx_chem_comp_description_generator.program_version +_pdbx_chem_comp_description_generator.descriptor +MSE acedrg 243 ""dictionary generator" +MSE acedrg_database 11 ""data source" +MSE rdkit 2017.03.2 ""Chemoinformatics tool" +MSE refmac5 5.8.0238 ""optimization tool" diff --git a/image_analysis/structure_refinement/monomers/NA.cif b/image_analysis/structure_refinement/monomers/NA.cif new file mode 100644 index 000000000..e9d8ecd98 --- /dev/null +++ b/image_analysis/structure_refinement/monomers/NA.cif @@ -0,0 +1,30 @@ +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +NA NA 'SODIUM ION ' NON-POLYMER 1 1 . + +data_comp_NA +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.partial_charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +NA NA NA NA 1.000 0.000 0.000 0.000 + +loop_ +_chem_comp_tree.comp_id +_chem_comp_tree.atom_id +_chem_comp_tree.atom_back +_chem_comp_tree.atom_forward +_chem_comp_tree.connect_type +NA NA n/a . END diff --git a/image_analysis/structure_refinement/monomers/NAD.cif b/image_analysis/structure_refinement/monomers/NAD.cif new file mode 100644 index 000000000..e61090f17 --- /dev/null +++ b/image_analysis/structure_refinement/monomers/NAD.cif @@ -0,0 +1,447 @@ +# +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +NAD NAD NICOTINAMIDE-ADENINE-DINUCLEOTIDE NON-POLYMER 70 44 . +# +data_comp_NAD +# +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +NAD PA P P 0 18.626 51.830 -19.907 +NAD O1A O O 0 18.239 51.977 -21.341 +NAD O2A O OP -1 17.725 52.411 -18.868 +NAD O5B O O2 0 20.113 52.394 -19.696 +NAD C5B C CH2 0 21.139 52.018 -20.649 +NAD C4B C CH1 0 22.468 52.578 -20.205 +NAD O4B O O2 0 23.527 51.931 -20.956 +NAD C3B C CH1 0 22.679 54.079 -20.440 +NAD O3B O OH1 0 23.576 54.623 -19.479 +NAD C2B C CH1 0 23.256 54.094 -21.858 +NAD O2B O OH1 0 24.009 55.255 -22.137 +NAD C1B C CH1 0 24.142 52.850 -21.831 +NAD N9A N NR5 0 24.299 52.206 -23.131 +NAD C8A C CR15 0 23.301 51.647 -23.891 +NAD N7A N NRD5 0 23.726 51.133 -25.017 +NAD C5A C CR56 0 25.095 51.358 -25.002 +NAD C6A C CR6 0 26.120 51.044 -25.921 +NAD N6A N NH2 0 25.907 50.413 -27.073 +NAD N1A N NRD6 0 27.387 51.412 -25.601 +NAD C2A C CR16 0 27.594 52.049 -24.438 +NAD N3A N NRD6 0 26.710 52.394 -23.501 +NAD C4A C CR56 0 25.462 52.019 -23.841 +NAD O3 O O2 0 18.840 50.272 -19.588 +NAD PN P P 0 18.864 49.438 -18.218 +NAD O1N O O 0 17.461 49.265 -17.740 +NAD O2N O OP -1 19.853 50.066 -17.293 +NAD O5D O O2 0 19.431 48.023 -18.723 +NAD C5D C CH2 0 20.701 47.984 -19.424 +NAD C4D C CH1 0 21.194 46.559 -19.494 +NAD O4D O O2 0 21.428 46.064 -18.157 +NAD C3D C CH1 0 20.242 45.551 -20.164 +NAD O3D O OH1 0 20.944 44.677 -21.042 +NAD C2D C CH1 0 19.601 44.823 -18.973 +NAD O2D O OH1 0 19.219 43.486 -19.258 +NAD C1D C CH1 0 20.764 44.819 -17.978 +NAD N1N N NR6 1 20.354 44.692 -16.557 +NAD C2N C CR16 0 19.658 45.714 -15.942 +NAD C3N C CR6 0 19.271 45.586 -14.608 +NAD C7N C C 0 18.519 46.700 -13.946 +NAD O7N O O 0 18.970 47.210 -12.908 +NAD N7N N NH2 0 17.384 47.110 -14.499 +NAD C4N C CR16 0 19.587 44.433 -13.901 +NAD C5N C CR16 0 20.283 43.414 -14.527 +NAD C6N C CR16 0 20.661 43.549 -15.851 +NAD H51A H H 0 20.912 52.372 -21.544 +NAD H52A H H 0 21.197 51.032 -20.708 +NAD H4B H H 0 22.584 52.377 -19.252 +NAD H3B H H 0 21.811 54.559 -20.413 +NAD HO3A H H 0 23.564 55.469 -19.544 +NAD H2B H H 0 22.529 53.992 -22.526 +NAD HO2A H H 0 24.306 55.209 -22.931 +NAD H1B H H 0 25.026 53.099 -21.478 +NAD H8A H H 0 22.396 51.641 -23.629 +NAD H61A H H 0 26.528 49.888 -27.403 +NAD H62A H H 0 25.147 50.524 -27.495 +NAD H2A H H 0 28.491 52.285 -24.258 +NAD H51N H H 0 21.366 48.541 -18.948 +NAD H52N H H 0 20.590 48.342 -20.339 +NAD H4D H H 0 22.048 46.560 -19.977 +NAD H3D H H 0 19.542 46.042 -20.668 +NAD HO3N H H 0 21.584 44.301 -20.630 +NAD H2D H H 0 18.837 45.341 -18.621 +NAD HO2N H H 0 18.872 43.138 -18.566 +NAD H1D H H 0 21.389 44.085 -18.205 +NAD H2N H H 0 19.441 46.498 -16.419 +NAD H71N H H 0 16.923 47.775 -14.126 +NAD H72N H H 0 17.069 46.727 -15.240 +NAD H4N H H 0 19.329 44.343 -13.000 +NAD H5N H H 0 20.502 42.627 -14.056 +NAD H6N H H 0 21.135 42.856 -16.280 +loop_ +_chem_comp_bond.comp_id +_chem_comp_bond.atom_id_1 +_chem_comp_bond.atom_id_2 +_chem_comp_bond.type +_chem_comp_bond.aromatic +_chem_comp_bond.value_dist_nucleus +_chem_comp_bond.value_dist_nucleus_esd +_chem_comp_bond.value_dist +_chem_comp_bond.value_dist_esd +NAD PA O1A DOUBLE n 1.493 0.0122 1.493 0.0122 +NAD PA O2A SINGLE n 1.493 0.0122 1.493 0.0122 +NAD PA O5B SINGLE n 1.604 0.0133 1.604 0.0133 +NAD PA O3 SINGLE n 1.604 0.0133 1.604 0.0133 +NAD O5B C5B SINGLE n 1.450 0.0166 1.450 0.0166 +NAD C5B C4B SINGLE n 1.509 0.0100 1.509 0.0100 +NAD C4B O4B SINGLE n 1.451 0.0100 1.451 0.0100 +NAD C4B C3B SINGLE n 1.535 0.0100 1.535 0.0100 +NAD O4B C1B SINGLE n 1.409 0.0100 1.409 0.0100 +NAD C3B O3B SINGLE n 1.422 0.0100 1.422 0.0100 +NAD C3B C2B SINGLE n 1.531 0.0100 1.531 0.0100 +NAD C2B O2B SINGLE n 1.411 0.0100 1.411 0.0100 +NAD C2B C1B SINGLE n 1.525 0.0100 1.525 0.0100 +NAD C1B N9A SINGLE n 1.458 0.0100 1.458 0.0100 +NAD N9A C8A SINGLE y 1.372 0.0100 1.372 0.0100 +NAD N9A C4A SINGLE y 1.374 0.0101 1.374 0.0101 +NAD C8A N7A DOUBLE y 1.310 0.0100 1.310 0.0100 +NAD N7A C5A SINGLE y 1.388 0.0100 1.388 0.0100 +NAD C5A C6A SINGLE y 1.408 0.0100 1.408 0.0100 +NAD C5A C4A DOUBLE y 1.381 0.0100 1.381 0.0100 +NAD C6A N6A SINGLE n 1.330 0.0100 1.330 0.0100 +NAD C6A N1A DOUBLE y 1.354 0.0100 1.354 0.0100 +NAD N1A C2A SINGLE y 1.339 0.0100 1.339 0.0100 +NAD C2A N3A DOUBLE y 1.330 0.0100 1.330 0.0100 +NAD N3A C4A SINGLE y 1.343 0.0100 1.343 0.0100 +NAD O3 PN SINGLE n 1.604 0.0133 1.604 0.0133 +NAD PN O1N DOUBLE n 1.493 0.0122 1.493 0.0122 +NAD PN O2N SINGLE n 1.493 0.0122 1.493 0.0122 +NAD PN O5D SINGLE n 1.604 0.0133 1.604 0.0133 +NAD O5D C5D SINGLE n 1.450 0.0166 1.450 0.0166 +NAD C5D C4D SINGLE n 1.509 0.0100 1.509 0.0100 +NAD C4D O4D SINGLE n 1.443 0.0107 1.443 0.0107 +NAD C4D C3D SINGLE n 1.535 0.0100 1.535 0.0100 +NAD O4D C1D SINGLE n 1.425 0.0141 1.425 0.0141 +NAD C3D O3D SINGLE n 1.422 0.0100 1.422 0.0100 +NAD C3D C2D SINGLE n 1.533 0.0100 1.533 0.0100 +NAD C2D O2D SINGLE n 1.419 0.0101 1.419 0.0101 +NAD C2D C1D SINGLE n 1.533 0.0100 1.533 0.0100 +NAD C1D N1N SINGLE n 1.477 0.0138 1.477 0.0138 +NAD N1N C2N DOUBLE y 1.377 0.0105 1.377 0.0105 +NAD N1N C6N SINGLE y 1.375 0.0105 1.375 0.0105 +NAD C2N C3N SINGLE y 1.390 0.0105 1.390 0.0105 +NAD C3N C7N SINGLE n 1.497 0.0100 1.497 0.0100 +NAD C3N C4N DOUBLE y 1.385 0.0100 1.385 0.0100 +NAD C7N O7N DOUBLE n 1.241 0.0105 1.241 0.0105 +NAD C7N N7N SINGLE n 1.326 0.0100 1.326 0.0100 +NAD C4N C5N SINGLE y 1.380 0.0100 1.380 0.0100 +NAD C5N C6N DOUBLE y 1.380 0.0128 1.380 0.0128 +NAD C5B H51A SINGLE n 1.089 0.0100 0.989 0.0200 +NAD C5B H52A SINGLE n 1.089 0.0100 0.989 0.0200 +NAD C4B H4B SINGLE n 1.089 0.0100 0.981 0.0200 +NAD C3B H3B SINGLE n 1.089 0.0100 0.992 0.0200 +NAD O3B HO3A SINGLE n 0.970 0.0120 0.849 0.0200 +NAD C2B H2B SINGLE n 1.089 0.0100 0.994 0.0200 +NAD O2B HO2A SINGLE n 0.970 0.0120 0.849 0.0200 +NAD C1B H1B SINGLE n 1.089 0.0100 0.984 0.0200 +NAD C8A H8A SINGLE n 1.082 0.0130 0.942 0.0170 +NAD N6A H61A SINGLE n 1.016 0.0100 0.877 0.0200 +NAD N6A H62A SINGLE n 1.016 0.0100 0.877 0.0200 +NAD C2A H2A SINGLE n 1.082 0.0130 0.945 0.0200 +NAD C5D H51N SINGLE n 1.089 0.0100 0.989 0.0200 +NAD C5D H52N SINGLE n 1.089 0.0100 0.989 0.0200 +NAD C4D H4D SINGLE n 1.089 0.0100 0.981 0.0200 +NAD C3D H3D SINGLE n 1.089 0.0100 0.992 0.0200 +NAD O3D HO3N SINGLE n 0.970 0.0120 0.849 0.0200 +NAD C2D H2D SINGLE n 1.089 0.0100 0.989 0.0200 +NAD O2D HO2N SINGLE n 0.970 0.0120 0.849 0.0200 +NAD C1D H1D SINGLE n 1.089 0.0100 0.990 0.0173 +NAD C2N H2N SINGLE n 1.082 0.0130 0.943 0.0170 +NAD N7N H71N SINGLE n 1.016 0.0100 0.891 0.0200 +NAD N7N H72N SINGLE n 1.016 0.0100 0.891 0.0200 +NAD C4N H4N SINGLE n 1.082 0.0130 0.941 0.0168 +NAD C5N H5N SINGLE n 1.082 0.0130 0.943 0.0190 +NAD C6N H6N SINGLE n 1.082 0.0130 0.943 0.0169 +loop_ +_chem_comp_angle.comp_id +_chem_comp_angle.atom_id_1 +_chem_comp_angle.atom_id_2 +_chem_comp_angle.atom_id_3 +_chem_comp_angle.value_angle +_chem_comp_angle.value_angle_esd +NAD O1A PA O2A 118.411 2.35 +NAD O1A PA O5B 109.410 1.50 +NAD O1A PA O3 108.816 2.14 +NAD O2A PA O5B 109.410 1.50 +NAD O2A PA O3 108.816 2.14 +NAD O5B PA O3 101.065 1.97 +NAD PA O5B C5B 118.553 2.41 +NAD O5B C5B C4B 109.342 1.50 +NAD O5B C5B H51A 109.845 1.50 +NAD O5B C5B H52A 109.845 1.50 +NAD C4B C5B H51A 109.624 1.50 +NAD C4B C5B H52A 109.624 1.50 +NAD H51A C5B H52A 108.472 1.50 +NAD C5B C4B O4B 109.123 1.50 +NAD C5B C4B C3B 116.008 1.52 +NAD C5B C4B H4B 108.268 1.50 +NAD O4B C4B C3B 105.388 1.50 +NAD O4B C4B H4B 108.947 1.50 +NAD C3B C4B H4B 109.363 1.86 +NAD C4B O4B C1B 109.903 1.50 +NAD C4B C3B O3B 111.281 2.46 +NAD C4B C3B C2B 102.602 1.50 +NAD C4B C3B H3B 110.452 2.54 +NAD O3B C3B C2B 111.581 2.83 +NAD O3B C3B H3B 110.380 1.67 +NAD C2B C3B H3B 110.504 1.75 +NAD C3B O3B HO3A 108.744 3.00 +NAD C3B C2B O2B 112.782 2.45 +NAD C3B C2B C1B 101.239 1.50 +NAD C3B C2B H2B 110.596 1.51 +NAD O2B C2B C1B 111.715 2.69 +NAD O2B C2B H2B 110.448 1.97 +NAD C1B C2B H2B 110.636 1.70 +NAD C2B O2B HO2A 109.103 2.13 +NAD O4B C1B C2B 106.047 1.50 +NAD O4B C1B N9A 108.477 1.50 +NAD O4B C1B H1B 109.807 1.50 +NAD C2B C1B N9A 113.824 1.50 +NAD C2B C1B H1B 109.015 1.50 +NAD N9A C1B H1B 109.561 1.50 +NAD C1B N9A C8A 126.848 1.91 +NAD C1B N9A C4A 127.459 1.80 +NAD C8A N9A C4A 105.693 1.50 +NAD N9A C8A N7A 113.469 1.50 +NAD N9A C8A H8A 123.206 1.50 +NAD N7A C8A H8A 123.326 1.50 +NAD C8A N7A C5A 104.739 1.50 +NAD N7A C5A C6A 132.250 1.50 +NAD N7A C5A C4A 110.483 1.50 +NAD C6A C5A C4A 117.267 1.50 +NAD C5A C6A N6A 123.792 1.50 +NAD C5A C6A N1A 117.409 1.50 +NAD N6A C6A N1A 118.799 1.50 +NAD C6A N6A H61A 119.723 1.50 +NAD C6A N6A H62A 119.723 1.50 +NAD H61A N6A H62A 120.554 1.88 +NAD C6A N1A C2A 118.521 1.50 +NAD N1A C2A N3A 129.332 1.50 +NAD N1A C2A H2A 115.313 1.50 +NAD N3A C2A H2A 115.355 1.50 +NAD C2A N3A C4A 110.982 1.50 +NAD N9A C4A C5A 105.616 1.50 +NAD N9A C4A N3A 127.895 1.50 +NAD C5A C4A N3A 126.489 1.50 +NAD PA O3 PN 132.542 3.00 +NAD O3 PN O1N 108.816 2.14 +NAD O3 PN O2N 108.816 2.14 +NAD O3 PN O5D 101.065 1.97 +NAD O1N PN O2N 118.411 2.35 +NAD O1N PN O5D 109.410 1.50 +NAD O2N PN O5D 109.410 1.50 +NAD PN O5D C5D 118.553 2.41 +NAD O5D C5D C4D 109.342 1.50 +NAD O5D C5D H51N 109.845 1.50 +NAD O5D C5D H52N 109.845 1.50 +NAD C4D C5D H51N 109.624 1.50 +NAD C4D C5D H52N 109.624 1.50 +NAD H51N C5D H52N 108.472 1.50 +NAD C5D C4D O4D 109.615 1.50 +NAD C5D C4D C3D 116.008 1.52 +NAD C5D C4D H4D 108.268 1.50 +NAD O4D C4D C3D 104.439 1.50 +NAD O4D C4D H4D 108.698 1.50 +NAD C3D C4D H4D 109.363 1.86 +NAD C4D O4D C1D 109.578 1.50 +NAD C4D C3D O3D 111.281 2.46 +NAD C4D C3D C2D 102.071 1.50 +NAD C4D C3D H3D 110.452 2.54 +NAD O3D C3D C2D 111.993 3.00 +NAD O3D C3D H3D 110.380 1.67 +NAD C2D C3D H3D 110.108 1.66 +NAD C3D O3D HO3N 108.744 3.00 +NAD C3D C2D O2D 112.861 2.52 +NAD C3D C2D C1D 101.269 1.50 +NAD C3D C2D H2D 110.799 1.82 +NAD O2D C2D C1D 109.476 3.00 +NAD O2D C2D H2D 111.022 1.77 +NAD C1D C2D H2D 110.760 1.63 +NAD C2D O2D HO2N 109.449 1.85 +NAD O4D C1D C2D 106.825 1.50 +NAD O4D C1D N1N 108.092 1.50 +NAD O4D C1D H1D 109.327 1.50 +NAD C2D C1D N1N 113.620 1.99 +NAD C2D C1D H1D 109.776 1.83 +NAD N1N C1D H1D 108.901 1.50 +NAD C1D N1N C2N 119.705 1.50 +NAD C1D N1N C6N 119.705 1.50 +NAD C2N N1N C6N 120.590 1.50 +NAD N1N C2N C3N 119.549 3.00 +NAD N1N C2N H2N 120.430 1.53 +NAD C3N C2N H2N 120.021 1.50 +NAD C2N C3N C7N 119.660 2.75 +NAD C2N C3N C4N 119.402 1.64 +NAD C7N C3N C4N 120.938 2.50 +NAD C3N C7N O7N 119.730 1.50 +NAD C3N C7N N7N 118.032 1.50 +NAD O7N C7N N7N 122.238 1.50 +NAD C7N N7N H71N 120.236 2.75 +NAD C7N N7N H72N 120.236 2.75 +NAD H71N N7N H72N 119.529 2.83 +NAD C3N C4N C5N 119.166 1.50 +NAD C3N C4N H4N 120.513 1.50 +NAD C5N C4N H4N 120.320 1.50 +NAD C4N C5N C6N 120.016 1.50 +NAD C4N C5N H5N 120.300 1.50 +NAD C6N C5N H5N 119.683 1.50 +NAD N1N C6N C5N 121.277 1.50 +NAD N1N C6N H6N 118.693 1.53 +NAD C5N C6N H6N 120.031 1.59 +loop_ +_chem_comp_tor.comp_id +_chem_comp_tor.id +_chem_comp_tor.atom_id_1 +_chem_comp_tor.atom_id_2 +_chem_comp_tor.atom_id_3 +_chem_comp_tor.atom_id_4 +_chem_comp_tor.value_angle +_chem_comp_tor.value_angle_esd +_chem_comp_tor.period +NAD sp3_sp3_54 PN O3 PA O1A 60.000 10.0 3 +NAD sp3_sp3_51 C5B O5B PA O1A 60.000 10.0 3 +NAD sp2_sp3_1 C8A N9A C1B O4B 150.000 10.0 6 +NAD const_34 N7A C8A N9A C1B 180.000 10.0 2 +NAD const_46 C5A C4A N9A C1B 180.000 10.0 2 +NAD const_37 N9A C8A N7A C5A 0.000 10.0 2 +NAD const_40 C6A C5A N7A C8A 180.000 10.0 2 +NAD const_sp2_sp2_4 N7A C5A C6A N6A 0.000 5.0 2 +NAD const_41 N9A C4A C5A N7A 0.000 10.0 2 +NAD sp2_sp2_1 C5A C6A N6A H61A 180.000 5.0 2 +NAD const_sp2_sp2_6 N6A C6A N1A C2A 180.000 5.0 2 +NAD const_sp2_sp2_7 N3A C2A N1A C6A 0.000 5.0 2 +NAD const_sp2_sp2_9 N1A C2A N3A C4A 0.000 5.0 2 +NAD const_12 N9A C4A N3A C2A 180.000 10.0 2 +NAD sp3_sp3_84 PA O3 PN O1N 60.000 10.0 3 +NAD sp3_sp3_85 C5D O5D PN O3 180.000 10.0 3 +NAD sp3_sp3_88 C4D C5D O5D PN 180.000 10.0 3 +NAD sp3_sp3_91 O4D C4D C5D O5D 180.000 10.0 3 +NAD sp3_sp3_26 C5D C4D O4D C1D -60.000 10.0 3 +NAD sp3_sp3_104 O3D C3D C4D C5D 180.000 10.0 3 +NAD sp3_sp3_28 C2D C1D O4D C4D -60.000 10.0 3 +NAD sp3_sp3_109 C4D C3D O3D HO3N 180.000 10.0 3 +NAD sp3_sp3_44 O2D C2D C3D O3D -60.000 10.0 3 +NAD sp3_sp3_112 C3D C2D O2D HO2N 180.000 10.0 3 +NAD sp3_sp3_32 O4D C1D C2D O2D 180.000 10.0 3 +NAD sp2_sp3_7 C2N N1N C1D O4D 150.000 10.0 6 +NAD const_14 C3N C2N N1N C1D 180.000 10.0 2 +NAD const_50 C5N C6N N1N C1D 180.000 10.0 2 +NAD const_18 N1N C2N C3N C7N 180.000 10.0 2 +NAD sp2_sp2_6 C2N C3N C7N O7N 0.000 5.0 2 +NAD const_23 C7N C3N C4N C5N 180.000 10.0 2 +NAD sp2_sp2_11 O7N C7N N7N H71N 0.000 5.0 2 +NAD sp3_sp3_55 C4B C5B O5B PA 180.000 10.0 3 +NAD const_25 C3N C4N C5N C6N 0.000 10.0 2 +NAD const_29 C4N C5N C6N N1N 0.000 10.0 2 +NAD sp3_sp3_58 O4B C4B C5B O5B 180.000 10.0 3 +NAD sp3_sp3_2 C5B C4B O4B C1B -60.000 10.0 3 +NAD sp3_sp3_71 O3B C3B C4B C5B 180.000 10.0 3 +NAD sp3_sp3_4 C2B C1B O4B C4B -60.000 10.0 3 +NAD sp3_sp3_76 C4B C3B O3B HO3A 180.000 10.0 3 +NAD sp3_sp3_20 O2B C2B C3B O3B -60.000 10.0 3 +NAD sp3_sp3_79 C3B C2B O2B HO2A 180.000 10.0 3 +NAD sp3_sp3_8 O4B C1B C2B O2B 180.000 10.0 3 +loop_ +_chem_comp_chir.comp_id +_chem_comp_chir.id +_chem_comp_chir.atom_id_centre +_chem_comp_chir.atom_id_1 +_chem_comp_chir.atom_id_2 +_chem_comp_chir.atom_id_3 +_chem_comp_chir.volume_sign +NAD chir_1 PA O3 O5B O2A both +NAD chir_2 C4B O4B C3B C5B negative +NAD chir_3 C3B O3B C4B C2B positive +NAD chir_4 C2B O2B C1B C3B negative +NAD chir_5 C1B O4B N9A C2B negative +NAD chir_6 PN O3 O5D O2N both +NAD chir_7 C4D O4D C3D C5D negative +NAD chir_8 C3D O3D C4D C2D positive +NAD chir_9 C2D O2D C1D C3D negative +NAD chir_10 C1D O4D N1N C2D negative +loop_ +_chem_comp_plane_atom.comp_id +_chem_comp_plane_atom.plane_id +_chem_comp_plane_atom.atom_id +_chem_comp_plane_atom.dist_esd +NAD plan-1 C1B 0.020 +NAD plan-1 C2A 0.020 +NAD plan-1 C4A 0.020 +NAD plan-1 C5A 0.020 +NAD plan-1 C6A 0.020 +NAD plan-1 C8A 0.020 +NAD plan-1 H2A 0.020 +NAD plan-1 H8A 0.020 +NAD plan-1 N1A 0.020 +NAD plan-1 N3A 0.020 +NAD plan-1 N6A 0.020 +NAD plan-1 N7A 0.020 +NAD plan-1 N9A 0.020 +NAD plan-2 C1D 0.020 +NAD plan-2 C2N 0.020 +NAD plan-2 C3N 0.020 +NAD plan-2 C4N 0.020 +NAD plan-2 C5N 0.020 +NAD plan-2 C6N 0.020 +NAD plan-2 C7N 0.020 +NAD plan-2 H2N 0.020 +NAD plan-2 H4N 0.020 +NAD plan-2 H5N 0.020 +NAD plan-2 H6N 0.020 +NAD plan-2 N1N 0.020 +NAD plan-3 C6A 0.020 +NAD plan-3 H61A 0.020 +NAD plan-3 H62A 0.020 +NAD plan-3 N6A 0.020 +NAD plan-4 C3N 0.020 +NAD plan-4 C7N 0.020 +NAD plan-4 N7N 0.020 +NAD plan-4 O7N 0.020 +NAD plan-5 C7N 0.020 +NAD plan-5 H71N 0.020 +NAD plan-5 H72N 0.020 +NAD plan-5 N7N 0.020 +loop_ +_pdbx_chem_comp_descriptor.comp_id +_pdbx_chem_comp_descriptor.type +_pdbx_chem_comp_descriptor.program +_pdbx_chem_comp_descriptor.program_version +_pdbx_chem_comp_descriptor.descriptor +NAD SMILES_CANONICAL CACTVS 3.341 NC(=O)c1ccc[n+](c1)[C@@H]2O[C@H](CO[P]([O-])(=O)O[P@](O)(=O)OC[C@H]3O[C@H]([C@H](O)[C@@H]3O)n4cnc5c(N)ncnc45)[C@@H](O)[C@H]2O +NAD SMILES CACTVS 3.341 NC(=O)c1ccc[n+](c1)[CH]2O[CH](CO[P]([O-])(=O)O[P](O)(=O)OC[CH]3O[CH]([CH](O)[CH]3O)n4cnc5c(N)ncnc45)[CH](O)[CH]2O +NAD SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 c1cc(c[n+](c1)[C@H]2[C@@H]([C@@H]([C@H](O2)CO[P@@](=O)([O-])O[P@@](=O)(O)OC[C@@H]3[C@H]([C@H]([C@@H](O3)n4cnc5c4ncnc5N)O)O)O)O)C(=O)N +NAD SMILES "OpenEye OEToolkits" 1.5.0 c1cc(c[n+](c1)C2C(C(C(O2)COP(=O)([O-])OP(=O)(O)OCC3C(C(C(O3)n4cnc5c4ncnc5N)O)O)O)O)C(=O)N +NAD InChI InChI 1.03 InChI=1S/C21H27N7O14P2/c22-17-12-19(25-7-24-17)28(8-26-12)21-16(32)14(30)11(41-21)6-39-44(36,37)42-43(34,35)38-5-10-13(29)15(31)20(40-10)27-3-1-2-9(4-27)18(23)33/h1-4,7-8,10-11,13-16,20-21,29-32H,5-6H2,(H5-,22,23,24,25,33,34,35,36,37)/t10-,11-,13-,14-,15-,16-,20-,21-/m1/s1 +NAD InChIKey InChI 1.03 BAWFJGJZGIEFAR-NNYOXOHSSA-N +loop_ +_pdbx_chem_comp_description_generator.comp_id +_pdbx_chem_comp_description_generator.program_name +_pdbx_chem_comp_description_generator.program_version +_pdbx_chem_comp_description_generator.descriptor +NAD acedrg 243 "dictionary generator" +NAD acedrg_database 11 "data source" +NAD rdkit 2017.03.2 "Chemoinformatics tool" +NAD refmac5 5.8.0238 "optimization tool" diff --git a/image_analysis/structure_refinement/monomers/NAI.cif b/image_analysis/structure_refinement/monomers/NAI.cif new file mode 100644 index 000000000..5fea12fc9 --- /dev/null +++ b/image_analysis/structure_refinement/monomers/NAI.cif @@ -0,0 +1,460 @@ +# +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +NAI NAI "1,4-DIHYDRONICOTINAMIDE ADENINE DINUCLEOTIDE" NON-POLYMER 71 44 . +# +data_comp_NAI +# +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +NAI PA P P 0 32.123 21.120 42.561 +NAI O1A O O 0 30.870 21.929 42.623 +NAI O2A O OP -1 32.361 20.105 43.629 +NAI O5B O O2 0 33.388 22.102 42.470 +NAI C5B C CH2 0 33.354 23.194 41.515 +NAI C4B C CH1 0 34.654 23.958 41.578 +NAI O4B O O2 0 34.715 24.875 40.456 +NAI C3B C CH1 0 34.861 24.837 42.817 +NAI O3B O OH1 0 36.244 24.979 43.116 +NAI C2B C CH1 0 34.216 26.154 42.376 +NAI O2B O OH1 0 34.702 27.273 43.085 +NAI C1B C CH1 0 34.624 26.209 40.905 +NAI N9A N NR5 0 33.672 26.910 40.050 +NAI C8A C CR15 0 32.354 26.580 39.853 +NAI N7A N NRD5 0 31.731 27.382 39.026 +NAI C5A C CR56 0 32.699 28.299 38.644 +NAI C6A C CR6 0 32.662 29.411 37.773 +NAI N6A N NH2 0 31.572 29.792 37.111 +NAI N1A N NRD6 0 33.809 30.121 37.612 +NAI C2A C CR16 0 34.903 29.730 38.283 +NAI N3A N NRD6 0 35.053 28.706 39.124 +NAI C4A C CR56 0 33.903 28.018 39.267 +NAI O3 O O2 0 32.194 20.391 41.133 +NAI PN P P 0 33.045 19.141 40.598 +NAI O1N O OP -1 32.494 17.894 41.207 +NAI O2N O O 0 34.496 19.434 40.787 +NAI O5D O O2 0 32.695 19.167 39.032 +NAI C5D C CH2 0 32.931 20.381 38.272 +NAI C4D C CH1 0 32.960 20.056 36.798 +NAI O4D O O2 0 34.097 19.197 36.527 +NAI C3D C CH1 0 31.723 19.330 36.245 +NAI O3D O OH1 0 31.277 19.932 35.035 +NAI C2D C CH1 0 32.229 17.899 36.048 +NAI O2D O OH1 0 31.575 17.210 34.992 +NAI C1D C CH1 0 33.704 18.112 35.723 +NAI N1N N NR6 0 34.553 16.920 36.041 +NAI C2N C CR16 0 34.762 16.547 37.347 +NAI C3N C CR6 0 35.558 15.478 37.694 +NAI C7N C C 0 35.808 15.235 39.136 +NAI O7N O O 0 36.965 15.266 39.567 +NAI N7N N NH2 0 34.772 14.990 39.928 +NAI C4N C CH2 0 36.124 14.625 36.604 +NAI C5N C CR16 0 35.864 15.118 35.233 +NAI C6N C CR16 0 35.119 16.184 35.007 +NAI H51A H H 0 32.603 23.801 41.726 +NAI H52A H H 0 33.223 22.838 40.602 +NAI H4B H H 0 35.393 23.316 41.506 +NAI H3B H H 0 34.377 24.457 43.595 +NAI HO3A H H 0 36.323 25.360 43.870 +NAI H2B H H 0 33.229 26.100 42.466 +NAI HO2A H H 0 34.323 27.974 42.792 +NAI H1B H H 0 35.506 26.639 40.838 +NAI H8A H H 0 31.936 25.850 40.278 +NAI H61A H H 0 31.623 30.443 36.523 +NAI H62A H H 0 30.806 29.392 37.264 +NAI H2A H H 0 35.676 30.255 38.140 +NAI H51N H H 0 33.794 20.784 38.539 +NAI H52N H H 0 32.211 21.035 38.453 +NAI H4D H H 0 33.085 20.897 36.307 +NAI H3D H H 0 30.994 19.339 36.918 +NAI HO3N H H 0 30.631 19.477 34.725 +NAI H2D H H 0 32.129 17.394 36.890 +NAI HO2N H H 0 31.893 16.425 34.933 +NAI H1D H H 0 33.809 18.353 34.773 +NAI H2N H H 0 34.340 17.035 38.031 +NAI H71N H H 0 34.898 14.848 40.795 +NAI H72N H H 0 33.947 14.963 39.600 +NAI H4N H H 0 35.759 13.720 36.687 +NAI H42N H H 0 37.093 14.548 36.731 +NAI H5N H H 0 36.247 14.649 34.492 +NAI H6N H H 0 34.963 16.456 34.120 +loop_ +_chem_comp_bond.comp_id +_chem_comp_bond.atom_id_1 +_chem_comp_bond.atom_id_2 +_chem_comp_bond.type +_chem_comp_bond.aromatic +_chem_comp_bond.value_dist_nucleus +_chem_comp_bond.value_dist_nucleus_esd +_chem_comp_bond.value_dist +_chem_comp_bond.value_dist_esd +NAI PA O1A DOUBLE n 1.493 0.0122 1.493 0.0122 +NAI PA O2A SINGLE n 1.493 0.0122 1.493 0.0122 +NAI PA O5B SINGLE n 1.604 0.0133 1.604 0.0133 +NAI PA O3 SINGLE n 1.604 0.0133 1.604 0.0133 +NAI O5B C5B SINGLE n 1.450 0.0166 1.450 0.0166 +NAI C5B C4B SINGLE n 1.509 0.0100 1.509 0.0100 +NAI C4B O4B SINGLE n 1.451 0.0100 1.451 0.0100 +NAI C4B C3B SINGLE n 1.535 0.0100 1.535 0.0100 +NAI O4B C1B SINGLE n 1.409 0.0100 1.409 0.0100 +NAI C3B O3B SINGLE n 1.422 0.0100 1.422 0.0100 +NAI C3B C2B SINGLE n 1.531 0.0100 1.531 0.0100 +NAI C2B O2B SINGLE n 1.411 0.0100 1.411 0.0100 +NAI C2B C1B SINGLE n 1.525 0.0100 1.525 0.0100 +NAI C1B N9A SINGLE n 1.458 0.0100 1.458 0.0100 +NAI N9A C8A SINGLE y 1.372 0.0100 1.372 0.0100 +NAI N9A C4A SINGLE y 1.374 0.0101 1.374 0.0101 +NAI C8A N7A DOUBLE y 1.310 0.0100 1.310 0.0100 +NAI N7A C5A SINGLE y 1.388 0.0100 1.388 0.0100 +NAI C5A C6A SINGLE y 1.408 0.0100 1.408 0.0100 +NAI C5A C4A DOUBLE y 1.381 0.0100 1.381 0.0100 +NAI C6A N6A SINGLE n 1.330 0.0100 1.330 0.0100 +NAI C6A N1A DOUBLE y 1.354 0.0100 1.354 0.0100 +NAI N1A C2A SINGLE y 1.339 0.0100 1.339 0.0100 +NAI C2A N3A DOUBLE y 1.330 0.0100 1.330 0.0100 +NAI N3A C4A SINGLE y 1.343 0.0100 1.343 0.0100 +NAI O3 PN SINGLE n 1.604 0.0133 1.604 0.0133 +NAI PN O1N SINGLE n 1.493 0.0122 1.493 0.0122 +NAI PN O2N DOUBLE n 1.493 0.0122 1.493 0.0122 +NAI PN O5D SINGLE n 1.604 0.0133 1.604 0.0133 +NAI O5D C5D SINGLE n 1.450 0.0166 1.450 0.0166 +NAI C5D C4D SINGLE n 1.509 0.0100 1.509 0.0100 +NAI C4D O4D SINGLE n 1.449 0.0100 1.449 0.0100 +NAI C4D C3D SINGLE n 1.535 0.0100 1.535 0.0100 +NAI O4D C1D SINGLE n 1.407 0.0132 1.407 0.0132 +NAI C3D O3D SINGLE n 1.422 0.0100 1.422 0.0100 +NAI C3D C2D SINGLE n 1.530 0.0134 1.530 0.0134 +NAI C2D O2D SINGLE n 1.420 0.0122 1.420 0.0122 +NAI C2D C1D SINGLE n 1.527 0.0119 1.527 0.0119 +NAI C1D N1N SINGLE n 1.492 0.0124 1.492 0.0124 +NAI N1N C2N SINGLE n 1.367 0.0104 1.367 0.0104 +NAI N1N C6N SINGLE n 1.374 0.0156 1.374 0.0156 +NAI C2N C3N DOUBLE n 1.365 0.0175 1.365 0.0175 +NAI C3N C7N SINGLE n 1.480 0.0169 1.480 0.0169 +NAI C3N C4N SINGLE n 1.491 0.0200 1.491 0.0200 +NAI C7N O7N DOUBLE n 1.235 0.0110 1.235 0.0110 +NAI C7N N7N SINGLE n 1.325 0.0100 1.325 0.0100 +NAI C4N C5N SINGLE n 1.477 0.0200 1.477 0.0200 +NAI C5N C6N DOUBLE n 1.315 0.0139 1.315 0.0139 +NAI C5B H51A SINGLE n 1.089 0.0100 0.989 0.0200 +NAI C5B H52A SINGLE n 1.089 0.0100 0.989 0.0200 +NAI C4B H4B SINGLE n 1.089 0.0100 0.981 0.0200 +NAI C3B H3B SINGLE n 1.089 0.0100 0.992 0.0200 +NAI O3B HO3A SINGLE n 0.970 0.0120 0.849 0.0200 +NAI C2B H2B SINGLE n 1.089 0.0100 0.994 0.0200 +NAI O2B HO2A SINGLE n 0.970 0.0120 0.849 0.0200 +NAI C1B H1B SINGLE n 1.089 0.0100 0.984 0.0200 +NAI C8A H8A SINGLE n 1.082 0.0130 0.942 0.0170 +NAI N6A H61A SINGLE n 1.016 0.0100 0.877 0.0200 +NAI N6A H62A SINGLE n 1.016 0.0100 0.877 0.0200 +NAI C2A H2A SINGLE n 1.082 0.0130 0.945 0.0200 +NAI C5D H51N SINGLE n 1.089 0.0100 0.989 0.0200 +NAI C5D H52N SINGLE n 1.089 0.0100 0.989 0.0200 +NAI C4D H4D SINGLE n 1.089 0.0100 0.981 0.0200 +NAI C3D H3D SINGLE n 1.089 0.0100 0.992 0.0200 +NAI O3D HO3N SINGLE n 0.970 0.0120 0.849 0.0200 +NAI C2D H2D SINGLE n 1.089 0.0100 0.988 0.0200 +NAI O2D HO2N SINGLE n 0.970 0.0120 0.849 0.0200 +NAI C1D H1D SINGLE n 1.089 0.0100 0.986 0.0200 +NAI C2N H2N SINGLE n 1.082 0.0130 0.940 0.0112 +NAI N7N H71N SINGLE n 1.016 0.0100 0.887 0.0200 +NAI N7N H72N SINGLE n 1.016 0.0100 0.887 0.0200 +NAI C4N H4N SINGLE n 1.089 0.0100 0.980 0.0113 +NAI C4N H42N SINGLE n 1.089 0.0100 0.980 0.0113 +NAI C5N H5N SINGLE n 1.082 0.0130 0.957 0.0130 +NAI C6N H6N SINGLE n 1.082 0.0130 0.941 0.0198 +loop_ +_chem_comp_angle.comp_id +_chem_comp_angle.atom_id_1 +_chem_comp_angle.atom_id_2 +_chem_comp_angle.atom_id_3 +_chem_comp_angle.value_angle +_chem_comp_angle.value_angle_esd +NAI O1A PA O2A 118.411 2.35 +NAI O1A PA O5B 109.410 1.50 +NAI O1A PA O3 108.816 2.14 +NAI O2A PA O5B 109.410 1.50 +NAI O2A PA O3 108.816 2.14 +NAI O5B PA O3 101.065 1.97 +NAI PA O5B C5B 118.553 2.41 +NAI O5B C5B C4B 109.342 1.50 +NAI O5B C5B H51A 109.845 1.50 +NAI O5B C5B H52A 109.845 1.50 +NAI C4B C5B H51A 109.624 1.50 +NAI C4B C5B H52A 109.624 1.50 +NAI H51A C5B H52A 108.472 1.50 +NAI C5B C4B O4B 109.123 1.50 +NAI C5B C4B C3B 116.008 1.52 +NAI C5B C4B H4B 108.268 1.50 +NAI O4B C4B C3B 105.388 1.50 +NAI O4B C4B H4B 108.947 1.50 +NAI C3B C4B H4B 109.363 1.86 +NAI C4B O4B C1B 109.903 1.50 +NAI C4B C3B O3B 111.281 2.46 +NAI C4B C3B C2B 102.602 1.50 +NAI C4B C3B H3B 110.452 2.54 +NAI O3B C3B C2B 111.581 2.83 +NAI O3B C3B H3B 110.380 1.67 +NAI C2B C3B H3B 110.504 1.75 +NAI C3B O3B HO3A 108.744 3.00 +NAI C3B C2B O2B 112.782 2.45 +NAI C3B C2B C1B 101.239 1.50 +NAI C3B C2B H2B 110.596 1.51 +NAI O2B C2B C1B 111.715 2.69 +NAI O2B C2B H2B 110.448 1.97 +NAI C1B C2B H2B 110.636 1.70 +NAI C2B O2B HO2A 109.103 2.13 +NAI O4B C1B C2B 106.047 1.50 +NAI O4B C1B N9A 108.477 1.50 +NAI O4B C1B H1B 109.807 1.50 +NAI C2B C1B N9A 113.824 1.50 +NAI C2B C1B H1B 109.015 1.50 +NAI N9A C1B H1B 109.561 1.50 +NAI C1B N9A C8A 126.848 1.91 +NAI C1B N9A C4A 127.459 1.80 +NAI C8A N9A C4A 105.693 1.50 +NAI N9A C8A N7A 113.469 1.50 +NAI N9A C8A H8A 123.206 1.50 +NAI N7A C8A H8A 123.326 1.50 +NAI C8A N7A C5A 104.739 1.50 +NAI N7A C5A C6A 132.250 1.50 +NAI N7A C5A C4A 110.483 1.50 +NAI C6A C5A C4A 117.267 1.50 +NAI C5A C6A N6A 123.792 1.50 +NAI C5A C6A N1A 117.409 1.50 +NAI N6A C6A N1A 118.799 1.50 +NAI C6A N6A H61A 119.723 1.50 +NAI C6A N6A H62A 119.723 1.50 +NAI H61A N6A H62A 120.554 1.88 +NAI C6A N1A C2A 118.521 1.50 +NAI N1A C2A N3A 129.332 1.50 +NAI N1A C2A H2A 115.313 1.50 +NAI N3A C2A H2A 115.355 1.50 +NAI C2A N3A C4A 110.982 1.50 +NAI N9A C4A C5A 105.616 1.50 +NAI N9A C4A N3A 127.895 1.50 +NAI C5A C4A N3A 126.489 1.50 +NAI PA O3 PN 132.542 3.00 +NAI O3 PN O1N 108.816 2.14 +NAI O3 PN O2N 108.816 2.14 +NAI O3 PN O5D 101.065 1.97 +NAI O1N PN O2N 118.411 2.35 +NAI O1N PN O5D 109.410 1.50 +NAI O2N PN O5D 109.410 1.50 +NAI PN O5D C5D 118.553 2.41 +NAI O5D C5D C4D 109.342 1.50 +NAI O5D C5D H51N 109.845 1.50 +NAI O5D C5D H52N 109.845 1.50 +NAI C4D C5D H51N 109.624 1.50 +NAI C4D C5D H52N 109.624 1.50 +NAI H51N C5D H52N 108.472 1.50 +NAI C5D C4D O4D 109.123 1.50 +NAI C5D C4D C3D 116.008 1.52 +NAI C5D C4D H4D 108.268 1.50 +NAI O4D C4D C3D 105.508 1.50 +NAI O4D C4D H4D 108.642 1.50 +NAI C3D C4D H4D 109.363 1.86 +NAI C4D O4D C1D 109.926 1.50 +NAI C4D C3D O3D 111.281 2.46 +NAI C4D C3D C2D 102.352 1.50 +NAI C4D C3D H3D 110.452 2.54 +NAI O3D C3D C2D 112.463 2.73 +NAI O3D C3D H3D 110.380 1.67 +NAI C2D C3D H3D 110.255 2.04 +NAI C3D O3D HO3N 108.744 3.00 +NAI C3D C2D O2D 112.463 2.73 +NAI C3D C2D C1D 104.443 2.26 +NAI C3D C2D H2D 110.255 2.04 +NAI O2D C2D C1D 111.164 2.38 +NAI O2D C2D H2D 110.259 1.63 +NAI C1D C2D H2D 110.518 1.74 +NAI C2D O2D HO2N 109.104 3.00 +NAI O4D C1D C2D 106.204 2.50 +NAI O4D C1D N1N 108.278 1.50 +NAI O4D C1D H1D 109.395 1.50 +NAI C2D C1D N1N 112.110 1.66 +NAI C2D C1D H1D 109.914 1.68 +NAI N1N C1D H1D 109.209 1.50 +NAI C1D N1N C2N 120.851 1.78 +NAI C1D N1N C6N 120.851 1.78 +NAI C2N N1N C6N 118.299 1.80 +NAI N1N C2N C3N 121.110 1.66 +NAI N1N C2N H2N 119.532 1.52 +NAI C3N C2N H2N 119.358 1.50 +NAI C2N C3N C7N 117.781 1.96 +NAI C2N C3N C4N 118.007 1.50 +NAI C7N C3N C4N 124.211 3.00 +NAI C3N C7N O7N 119.878 1.50 +NAI C3N C7N N7N 118.037 3.00 +NAI O7N C7N N7N 122.085 1.50 +NAI C7N N7N H71N 120.214 2.13 +NAI C7N N7N H72N 120.224 2.13 +NAI H71N N7N H72N 119.583 2.34 +NAI C3N C4N C5N 114.356 2.46 +NAI C3N C4N H4N 108.993 1.50 +NAI C3N C4N H42N 108.993 1.50 +NAI C5N C4N H4N 108.815 3.00 +NAI C5N C4N H42N 108.815 3.00 +NAI H4N C4N H42N 106.630 2.58 +NAI C4N C5N C6N 121.257 2.14 +NAI C4N C5N H5N 119.218 1.70 +NAI C6N C5N H5N 119.525 1.50 +NAI N1N C6N C5N 120.771 1.66 +NAI N1N C6N H6N 119.193 1.52 +NAI C5N C6N H6N 120.036 1.50 +loop_ +_chem_comp_tor.comp_id +_chem_comp_tor.id +_chem_comp_tor.atom_id_1 +_chem_comp_tor.atom_id_2 +_chem_comp_tor.atom_id_3 +_chem_comp_tor.atom_id_4 +_chem_comp_tor.value_angle +_chem_comp_tor.value_angle_esd +_chem_comp_tor.period +NAI sp3_sp3_54 PN O3 PA O1A 60.000 10.0 3 +NAI sp3_sp3_51 C5B O5B PA O1A 60.000 10.0 3 +NAI sp2_sp3_13 C8A N9A C1B O4B 150.000 10.0 6 +NAI const_14 N7A C8A N9A C1B 180.000 10.0 2 +NAI const_26 C5A C4A N9A C1B 180.000 10.0 2 +NAI const_17 N9A C8A N7A C5A 0.000 10.0 2 +NAI const_20 C6A C5A N7A C8A 180.000 10.0 2 +NAI const_sp2_sp2_4 N7A C5A C6A N6A 0.000 5.0 2 +NAI const_21 N9A C4A C5A N7A 0.000 10.0 2 +NAI sp2_sp2_13 C5A C6A N6A H61A 180.000 5.0 2 +NAI const_sp2_sp2_6 N6A C6A N1A C2A 180.000 5.0 2 +NAI const_sp2_sp2_7 N3A C2A N1A C6A 0.000 5.0 2 +NAI const_sp2_sp2_9 N1A C2A N3A C4A 0.000 5.0 2 +NAI const_12 N9A C4A N3A C2A 180.000 10.0 2 +NAI sp3_sp3_82 PA O3 PN O1N 180.000 10.0 3 +NAI sp3_sp3_85 C5D O5D PN O3 180.000 10.0 3 +NAI sp3_sp3_88 C4D C5D O5D PN 180.000 10.0 3 +NAI sp3_sp3_91 O4D C4D C5D O5D 180.000 10.0 3 +NAI sp3_sp3_26 C5D C4D O4D C1D -60.000 10.0 3 +NAI sp3_sp3_104 O3D C3D C4D C5D 180.000 10.0 3 +NAI sp3_sp3_28 C2D C1D O4D C4D -60.000 10.0 3 +NAI sp3_sp3_109 C4D C3D O3D HO3N 180.000 10.0 3 +NAI sp3_sp3_44 O2D C2D C3D O3D -60.000 10.0 3 +NAI sp3_sp3_112 C3D C2D O2D HO2N 180.000 10.0 3 +NAI sp3_sp3_32 O4D C1D C2D O2D 180.000 10.0 3 +NAI sp2_sp3_19 C2N N1N C1D O4D 150.000 10.0 6 +NAI sp2_sp2_2 C3N C2N N1N C1D 180.000 5.0 2 +NAI sp2_sp2_18 C5N C6N N1N C1D 180.000 5.0 2 +NAI sp2_sp2_6 N1N C2N C3N C7N 180.000 5.0 2 +NAI sp2_sp2_24 C2N C3N C7N O7N 180.000 5.0 2 +NAI sp2_sp3_4 C7N C3N C4N C5N 180.000 10.0 6 +NAI sp2_sp2_27 O7N C7N N7N H71N 0.000 5.0 2 +NAI sp3_sp3_55 C4B C5B O5B PA 180.000 10.0 3 +NAI sp2_sp3_7 C6N C5N C4N C3N 0.000 10.0 6 +NAI sp2_sp2_9 C4N C5N C6N N1N 0.000 5.0 2 +NAI sp3_sp3_58 O4B C4B C5B O5B 180.000 10.0 3 +NAI sp3_sp3_2 C5B C4B O4B C1B -60.000 10.0 3 +NAI sp3_sp3_71 O3B C3B C4B C5B 180.000 10.0 3 +NAI sp3_sp3_4 C2B C1B O4B C4B -60.000 10.0 3 +NAI sp3_sp3_76 C4B C3B O3B HO3A 180.000 10.0 3 +NAI sp3_sp3_20 O2B C2B C3B O3B -60.000 10.0 3 +NAI sp3_sp3_79 C3B C2B O2B HO2A 180.000 10.0 3 +NAI sp3_sp3_8 O4B C1B C2B O2B 180.000 10.0 3 +loop_ +_chem_comp_chir.comp_id +_chem_comp_chir.id +_chem_comp_chir.atom_id_centre +_chem_comp_chir.atom_id_1 +_chem_comp_chir.atom_id_2 +_chem_comp_chir.atom_id_3 +_chem_comp_chir.volume_sign +NAI chir_1 PA O3 O5B O2A both +NAI chir_2 C4B O4B C3B C5B negative +NAI chir_3 C3B O3B C4B C2B positive +NAI chir_4 C2B O2B C1B C3B negative +NAI chir_5 C1B O4B N9A C2B negative +NAI chir_6 PN O3 O5D O1N both +NAI chir_7 C4D O4D C3D C5D negative +NAI chir_8 C3D O3D C4D C2D positive +NAI chir_9 C2D O2D C1D C3D negative +NAI chir_10 C1D O4D N1N C2D negative +loop_ +_chem_comp_plane_atom.comp_id +_chem_comp_plane_atom.plane_id +_chem_comp_plane_atom.atom_id +_chem_comp_plane_atom.dist_esd +NAI plan-1 C1B 0.020 +NAI plan-1 C2A 0.020 +NAI plan-1 C4A 0.020 +NAI plan-1 C5A 0.020 +NAI plan-1 C6A 0.020 +NAI plan-1 C8A 0.020 +NAI plan-1 H2A 0.020 +NAI plan-1 H8A 0.020 +NAI plan-1 N1A 0.020 +NAI plan-1 N3A 0.020 +NAI plan-1 N6A 0.020 +NAI plan-1 N7A 0.020 +NAI plan-1 N9A 0.020 +NAI plan-2 C6A 0.020 +NAI plan-2 H61A 0.020 +NAI plan-2 H62A 0.020 +NAI plan-2 N6A 0.020 +NAI plan-3 C1D 0.020 +NAI plan-3 C2N 0.020 +NAI plan-3 C6N 0.020 +NAI plan-3 N1N 0.020 +NAI plan-4 C2N 0.020 +NAI plan-4 C3N 0.020 +NAI plan-4 H2N 0.020 +NAI plan-4 N1N 0.020 +NAI plan-5 C2N 0.020 +NAI plan-5 C3N 0.020 +NAI plan-5 C4N 0.020 +NAI plan-5 C7N 0.020 +NAI plan-6 C3N 0.020 +NAI plan-6 C7N 0.020 +NAI plan-6 N7N 0.020 +NAI plan-6 O7N 0.020 +NAI plan-7 C7N 0.020 +NAI plan-7 H71N 0.020 +NAI plan-7 H72N 0.020 +NAI plan-7 N7N 0.020 +NAI plan-8 C4N 0.020 +NAI plan-8 C5N 0.020 +NAI plan-8 C6N 0.020 +NAI plan-8 H5N 0.020 +NAI plan-9 C5N 0.020 +NAI plan-9 C6N 0.020 +NAI plan-9 H6N 0.020 +NAI plan-9 N1N 0.020 +loop_ +_pdbx_chem_comp_descriptor.comp_id +_pdbx_chem_comp_descriptor.type +_pdbx_chem_comp_descriptor.program +_pdbx_chem_comp_descriptor.program_version +_pdbx_chem_comp_descriptor.descriptor +NAI SMILES_CANONICAL CACTVS 3.341 NC(=O)C1=CN(C=CC1)[C@@H]2O[C@H](CO[P@@](O)(=O)O[P@](O)(=O)OC[C@H]3O[C@H]([C@H](O)[C@@H]3O)n4cnc5c(N)ncnc45)[C@@H](O)[C@H]2O +NAI SMILES CACTVS 3.341 NC(=O)C1=CN(C=CC1)[CH]2O[CH](CO[P](O)(=O)O[P](O)(=O)OC[CH]3O[CH]([CH](O)[CH]3O)n4cnc5c(N)ncnc45)[CH](O)[CH]2O +NAI SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 c1nc(c2c(n1)n(cn2)[C@H]3[C@@H]([C@@H]([C@H](O3)CO[P@](=O)(O)O[P@@](=O)(O)OC[C@@H]4[C@H]([C@H]([C@@H](O4)N5C=CCC(=C5)C(=O)N)O)O)O)O)N +NAI SMILES "OpenEye OEToolkits" 1.5.0 c1nc(c2c(n1)n(cn2)C3C(C(C(O3)COP(=O)(O)OP(=O)(O)OCC4C(C(C(O4)N5C=CCC(=C5)C(=O)N)O)O)O)O)N +NAI InChI InChI 1.03 InChI=1S/C21H29N7O14P2/c22-17-12-19(25-7-24-17)28(8-26-12)21-16(32)14(30)11(41-21)6-39-44(36,37)42-43(34,35)38-5-10-13(29)15(31)20(40-10)27-3-1-2-9(4-27)18(23)33/h1,3-4,7-8,10-11,13-16,20-21,29-32H,2,5-6H2,(H2,23,33)(H,34,35)(H,36,37)(H2,22,24,25)/t10-,11-,13-,14-,15-,16-,20-,21-/m1/s1 +NAI InChIKey InChI 1.03 BOPGDPNILDQYTO-NNYOXOHSSA-N +loop_ +_pdbx_chem_comp_description_generator.comp_id +_pdbx_chem_comp_description_generator.program_name +_pdbx_chem_comp_description_generator.program_version +_pdbx_chem_comp_description_generator.descriptor +NAI acedrg 243 "dictionary generator" +NAI acedrg_database 11 "data source" +NAI rdkit 2017.03.2 "Chemoinformatics tool" +NAI refmac5 5.8.0238 "optimization tool" diff --git a/image_analysis/structure_refinement/monomers/NAP.cif b/image_analysis/structure_refinement/monomers/NAP.cif new file mode 100644 index 000000000..02a6ea31e --- /dev/null +++ b/image_analysis/structure_refinement/monomers/NAP.cif @@ -0,0 +1,460 @@ +# +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +NAP NAP "NADP NICOTINAMIDE-ADENINE-DINUCLEOTIDE PHOSPHATE" NON-POLYMER 73 48 . +# +data_comp_NAP +# +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +NAP PA P P 0 14.707 24.447 12.480 +NAP O1A O O 0 13.458 23.637 12.602 +NAP O2A O OP -1 16.014 23.726 12.475 +NAP O5B O O2 0 14.609 25.379 11.174 +NAP C5B C CH2 0 15.409 26.589 11.081 +NAP C4B C CH1 0 15.737 26.871 9.636 +NAP O4B O O2 0 16.491 28.107 9.568 +NAP C3B C CH1 0 16.601 25.819 8.930 +NAP O3B O OH1 0 15.781 24.855 8.281 +NAP C2B C CH1 0 17.440 26.644 7.958 +NAP O2B O O2 0 16.792 26.811 6.691 +NAP C1B C CH1 0 17.572 27.988 8.672 +NAP N9A N NR5 0 18.813 28.129 9.426 +NAP C8A C CR15 0 19.226 27.352 10.480 +NAP N7A N NRD5 0 20.388 27.707 10.967 +NAP C5A C CR56 0 20.773 28.787 10.187 +NAP C6A C CR6 0 21.921 29.609 10.202 +NAP N6A N NH2 0 22.922 29.462 11.067 +NAP N1A N NRD6 0 21.993 30.607 9.282 +NAP C2A C CR16 0 20.979 30.751 8.415 +NAP N3A N NRD6 0 19.857 30.039 8.308 +NAP C4A C CR56 0 19.809 29.058 9.231 +NAP O3 O O2 0 14.727 25.535 13.659 +NAP PN P P 0 15.006 25.433 15.236 +NAP O1N O O 0 14.417 24.159 15.744 +NAP O2N O OP -1 14.583 26.712 15.880 +NAP O5D O O2 0 16.607 25.326 15.265 +NAP C5D C CH2 0 17.397 26.371 14.640 +NAP C4D C CH1 0 18.836 26.241 15.075 +NAP O4D O O2 0 19.679 27.018 14.196 +NAP C3D C CH1 0 19.161 26.751 16.486 +NAP O3D O OH1 0 20.269 26.050 17.038 +NAP C2D C CH1 0 19.461 28.232 16.227 +NAP O2D O OH1 0 20.299 28.821 17.209 +NAP C1D C CH1 0 20.213 28.142 14.894 +NAP N1N N NR6 1 20.068 29.345 14.038 +NAP C2N C CR16 0 18.841 29.658 13.486 +NAP C3N C CR6 0 18.708 30.789 12.681 +NAP C7N C C 0 17.375 31.126 12.085 +NAP O7N O O 0 16.914 32.269 12.231 +NAP N7N N NH2 0 16.721 30.182 11.419 +NAP C4N C CR16 0 19.808 31.604 12.444 +NAP C5N C CR16 0 21.032 31.285 13.005 +NAP C6N C CR16 0 21.155 30.158 13.797 +NAP P2B P P 0 17.807 26.912 5.431 +NAP O1X O O 0 18.385 25.523 5.232 +NAP O2X O OP -1 16.970 27.355 4.247 +NAP O3X O OP -1 18.878 27.929 5.783 +NAP H51A H H 0 16.247 26.480 11.592 +NAP H52A H H 0 14.907 27.351 11.463 +NAP H4B H H 0 14.895 26.984 9.146 +NAP H3B H H 0 17.191 25.370 9.588 +NAP HO3A H H 0 16.276 24.329 7.835 +NAP H2B H H 0 18.322 26.219 7.847 +NAP H1B H H 0 17.517 28.708 8.003 +NAP H8A H H 0 18.721 26.635 10.822 +NAP H61A H H 0 23.626 29.985 11.016 +NAP H62A H H 0 22.876 28.841 11.686 +NAP H2A H H 0 21.074 31.456 7.793 +NAP H51N H H 0 17.050 27.259 14.903 +NAP H52N H H 0 17.341 26.291 13.658 +NAP H4D H H 0 19.094 25.297 15.004 +NAP H3D H H 0 18.368 26.662 17.076 +NAP HO3N H H 0 20.386 26.311 17.838 +NAP H2D H H 0 18.621 28.744 16.127 +NAP HO2N H H 0 20.439 29.635 17.009 +NAP H1D H H 0 21.174 27.982 15.071 +NAP H2N H H 0 18.092 29.108 13.647 +NAP H71N H H 0 17.067 29.367 11.311 +NAP H72N H H 0 15.919 30.359 11.072 +NAP H4N H H 0 19.723 32.370 11.903 +NAP H5N H H 0 21.785 31.830 12.847 +NAP H6N H H 0 21.988 29.938 14.181 +loop_ +_chem_comp_bond.comp_id +_chem_comp_bond.atom_id_1 +_chem_comp_bond.atom_id_2 +_chem_comp_bond.type +_chem_comp_bond.aromatic +_chem_comp_bond.value_dist_nucleus +_chem_comp_bond.value_dist_nucleus_esd +_chem_comp_bond.value_dist +_chem_comp_bond.value_dist_esd +NAP PA O1A DOUBLE n 1.493 0.0122 1.493 0.0122 +NAP PA O2A SINGLE n 1.493 0.0122 1.493 0.0122 +NAP PA O5B SINGLE n 1.604 0.0133 1.604 0.0133 +NAP PA O3 SINGLE n 1.604 0.0133 1.604 0.0133 +NAP O5B C5B SINGLE n 1.450 0.0166 1.450 0.0166 +NAP C5B C4B SINGLE n 1.509 0.0100 1.509 0.0100 +NAP C4B O4B SINGLE n 1.451 0.0100 1.451 0.0100 +NAP C4B C3B SINGLE n 1.535 0.0100 1.535 0.0100 +NAP O4B C1B SINGLE n 1.409 0.0100 1.409 0.0100 +NAP C3B O3B SINGLE n 1.422 0.0100 1.422 0.0100 +NAP C3B C2B SINGLE n 1.523 0.0106 1.523 0.0106 +NAP C2B O2B SINGLE n 1.425 0.0152 1.425 0.0152 +NAP C2B C1B SINGLE n 1.524 0.0100 1.524 0.0100 +NAP O2B P2B SINGLE n 1.614 0.0178 1.614 0.0178 +NAP C1B N9A SINGLE n 1.458 0.0100 1.458 0.0100 +NAP N9A C8A SINGLE y 1.372 0.0100 1.372 0.0100 +NAP N9A C4A SINGLE y 1.374 0.0101 1.374 0.0101 +NAP C8A N7A DOUBLE y 1.310 0.0100 1.310 0.0100 +NAP N7A C5A SINGLE y 1.388 0.0100 1.388 0.0100 +NAP C5A C6A SINGLE y 1.408 0.0100 1.408 0.0100 +NAP C5A C4A DOUBLE y 1.381 0.0100 1.381 0.0100 +NAP C6A N6A SINGLE n 1.330 0.0100 1.330 0.0100 +NAP C6A N1A DOUBLE y 1.354 0.0100 1.354 0.0100 +NAP N1A C2A SINGLE y 1.339 0.0100 1.339 0.0100 +NAP C2A N3A DOUBLE y 1.330 0.0100 1.330 0.0100 +NAP N3A C4A SINGLE y 1.343 0.0100 1.343 0.0100 +NAP O3 PN SINGLE n 1.604 0.0133 1.604 0.0133 +NAP PN O1N DOUBLE n 1.493 0.0122 1.493 0.0122 +NAP PN O2N SINGLE n 1.493 0.0122 1.493 0.0122 +NAP PN O5D SINGLE n 1.604 0.0133 1.604 0.0133 +NAP O5D C5D SINGLE n 1.450 0.0166 1.450 0.0166 +NAP C5D C4D SINGLE n 1.509 0.0100 1.509 0.0100 +NAP C4D O4D SINGLE n 1.443 0.0107 1.443 0.0107 +NAP C4D C3D SINGLE n 1.535 0.0100 1.535 0.0100 +NAP O4D C1D SINGLE n 1.425 0.0141 1.425 0.0141 +NAP C3D O3D SINGLE n 1.422 0.0100 1.422 0.0100 +NAP C3D C2D SINGLE n 1.533 0.0100 1.533 0.0100 +NAP C2D O2D SINGLE n 1.419 0.0101 1.419 0.0101 +NAP C2D C1D SINGLE n 1.533 0.0100 1.533 0.0100 +NAP C1D N1N SINGLE n 1.477 0.0138 1.477 0.0138 +NAP N1N C2N DOUBLE y 1.377 0.0105 1.377 0.0105 +NAP N1N C6N SINGLE y 1.375 0.0105 1.375 0.0105 +NAP C2N C3N SINGLE y 1.390 0.0105 1.390 0.0105 +NAP C3N C7N SINGLE n 1.497 0.0100 1.497 0.0100 +NAP C3N C4N DOUBLE y 1.385 0.0100 1.385 0.0100 +NAP C7N O7N DOUBLE n 1.241 0.0105 1.241 0.0105 +NAP C7N N7N SINGLE n 1.326 0.0100 1.326 0.0100 +NAP C4N C5N SINGLE y 1.380 0.0100 1.380 0.0100 +NAP C5N C6N DOUBLE y 1.380 0.0128 1.380 0.0128 +NAP P2B O1X DOUBLE n 1.517 0.0192 1.517 0.0192 +NAP P2B O2X SINGLE n 1.517 0.0192 1.517 0.0192 +NAP P2B O3X SINGLE n 1.517 0.0192 1.517 0.0192 +NAP C5B H51A SINGLE n 1.089 0.0100 0.989 0.0200 +NAP C5B H52A SINGLE n 1.089 0.0100 0.989 0.0200 +NAP C4B H4B SINGLE n 1.089 0.0100 0.981 0.0200 +NAP C3B H3B SINGLE n 1.089 0.0100 0.992 0.0200 +NAP O3B HO3A SINGLE n 0.970 0.0120 0.849 0.0200 +NAP C2B H2B SINGLE n 1.089 0.0100 0.985 0.0119 +NAP C1B H1B SINGLE n 1.089 0.0100 0.984 0.0200 +NAP C8A H8A SINGLE n 1.082 0.0130 0.942 0.0170 +NAP N6A H61A SINGLE n 1.016 0.0100 0.877 0.0200 +NAP N6A H62A SINGLE n 1.016 0.0100 0.877 0.0200 +NAP C2A H2A SINGLE n 1.082 0.0130 0.945 0.0200 +NAP C5D H51N SINGLE n 1.089 0.0100 0.989 0.0200 +NAP C5D H52N SINGLE n 1.089 0.0100 0.989 0.0200 +NAP C4D H4D SINGLE n 1.089 0.0100 0.981 0.0200 +NAP C3D H3D SINGLE n 1.089 0.0100 0.992 0.0200 +NAP O3D HO3N SINGLE n 0.970 0.0120 0.849 0.0200 +NAP C2D H2D SINGLE n 1.089 0.0100 0.989 0.0200 +NAP O2D HO2N SINGLE n 0.970 0.0120 0.849 0.0200 +NAP C1D H1D SINGLE n 1.089 0.0100 0.990 0.0173 +NAP C2N H2N SINGLE n 1.082 0.0130 0.943 0.0170 +NAP N7N H71N SINGLE n 1.016 0.0100 0.891 0.0200 +NAP N7N H72N SINGLE n 1.016 0.0100 0.891 0.0200 +NAP C4N H4N SINGLE n 1.082 0.0130 0.941 0.0168 +NAP C5N H5N SINGLE n 1.082 0.0130 0.943 0.0190 +NAP C6N H6N SINGLE n 1.082 0.0130 0.943 0.0169 +loop_ +_chem_comp_angle.comp_id +_chem_comp_angle.atom_id_1 +_chem_comp_angle.atom_id_2 +_chem_comp_angle.atom_id_3 +_chem_comp_angle.value_angle +_chem_comp_angle.value_angle_esd +NAP O1A PA O2A 118.411 2.35 +NAP O1A PA O5B 109.410 1.50 +NAP O1A PA O3 108.816 2.14 +NAP O2A PA O5B 109.410 1.50 +NAP O2A PA O3 108.816 2.14 +NAP O5B PA O3 101.065 1.97 +NAP PA O5B C5B 118.553 2.41 +NAP O5B C5B C4B 109.342 1.50 +NAP O5B C5B H51A 109.845 1.50 +NAP O5B C5B H52A 109.845 1.50 +NAP C4B C5B H51A 109.624 1.50 +NAP C4B C5B H52A 109.624 1.50 +NAP H51A C5B H52A 108.472 1.50 +NAP C5B C4B O4B 109.123 1.50 +NAP C5B C4B C3B 116.008 1.52 +NAP C5B C4B H4B 108.268 1.50 +NAP O4B C4B C3B 105.388 1.50 +NAP O4B C4B H4B 108.947 1.50 +NAP C3B C4B H4B 109.363 1.86 +NAP C4B O4B C1B 109.903 1.50 +NAP C4B C3B O3B 111.281 2.46 +NAP C4B C3B C2B 102.352 1.50 +NAP C4B C3B H3B 110.452 2.54 +NAP O3B C3B C2B 112.463 2.73 +NAP O3B C3B H3B 110.380 1.67 +NAP C2B C3B H3B 110.255 2.04 +NAP C3B O3B HO3A 108.744 3.00 +NAP C3B C2B O2B 110.766 3.00 +NAP C3B C2B C1B 101.388 1.50 +NAP C3B C2B H2B 110.255 2.04 +NAP O2B C2B C1B 110.738 2.44 +NAP O2B C2B H2B 110.343 1.64 +NAP C1B C2B H2B 111.050 1.62 +NAP C2B O2B P2B 109.471 3.00 +NAP O4B C1B C2B 106.416 1.50 +NAP O4B C1B N9A 108.477 1.50 +NAP O4B C1B H1B 109.807 1.50 +NAP C2B C1B N9A 113.659 1.50 +NAP C2B C1B H1B 109.319 1.50 +NAP N9A C1B H1B 109.561 1.50 +NAP C1B N9A C8A 126.848 1.91 +NAP C1B N9A C4A 127.459 1.80 +NAP C8A N9A C4A 105.693 1.50 +NAP N9A C8A N7A 113.469 1.50 +NAP N9A C8A H8A 123.206 1.50 +NAP N7A C8A H8A 123.326 1.50 +NAP C8A N7A C5A 104.739 1.50 +NAP N7A C5A C6A 132.250 1.50 +NAP N7A C5A C4A 110.483 1.50 +NAP C6A C5A C4A 117.267 1.50 +NAP C5A C6A N6A 123.792 1.50 +NAP C5A C6A N1A 117.409 1.50 +NAP N6A C6A N1A 118.799 1.50 +NAP C6A N6A H61A 119.723 1.50 +NAP C6A N6A H62A 119.723 1.50 +NAP H61A N6A H62A 120.554 1.88 +NAP C6A N1A C2A 118.521 1.50 +NAP N1A C2A N3A 129.332 1.50 +NAP N1A C2A H2A 115.313 1.50 +NAP N3A C2A H2A 115.355 1.50 +NAP C2A N3A C4A 110.982 1.50 +NAP N9A C4A C5A 105.616 1.50 +NAP N9A C4A N3A 127.895 1.50 +NAP C5A C4A N3A 126.489 1.50 +NAP PA O3 PN 132.542 3.00 +NAP O3 PN O1N 108.816 2.14 +NAP O3 PN O2N 108.816 2.14 +NAP O3 PN O5D 101.065 1.97 +NAP O1N PN O2N 118.411 2.35 +NAP O1N PN O5D 109.410 1.50 +NAP O2N PN O5D 109.410 1.50 +NAP PN O5D C5D 118.553 2.41 +NAP O5D C5D C4D 109.342 1.50 +NAP O5D C5D H51N 109.845 1.50 +NAP O5D C5D H52N 109.845 1.50 +NAP C4D C5D H51N 109.624 1.50 +NAP C4D C5D H52N 109.624 1.50 +NAP H51N C5D H52N 108.472 1.50 +NAP C5D C4D O4D 109.615 1.50 +NAP C5D C4D C3D 116.008 1.52 +NAP C5D C4D H4D 108.268 1.50 +NAP O4D C4D C3D 104.439 1.50 +NAP O4D C4D H4D 108.698 1.50 +NAP C3D C4D H4D 109.363 1.86 +NAP C4D O4D C1D 109.578 1.50 +NAP C4D C3D O3D 111.281 2.46 +NAP C4D C3D C2D 102.071 1.50 +NAP C4D C3D H3D 110.452 2.54 +NAP O3D C3D C2D 111.993 3.00 +NAP O3D C3D H3D 110.380 1.67 +NAP C2D C3D H3D 110.108 1.66 +NAP C3D O3D HO3N 108.744 3.00 +NAP C3D C2D O2D 112.861 2.52 +NAP C3D C2D C1D 101.269 1.50 +NAP C3D C2D H2D 110.799 1.82 +NAP O2D C2D C1D 109.476 3.00 +NAP O2D C2D H2D 111.022 1.77 +NAP C1D C2D H2D 110.760 1.63 +NAP C2D O2D HO2N 109.449 1.85 +NAP O4D C1D C2D 106.825 1.50 +NAP O4D C1D N1N 108.092 1.50 +NAP O4D C1D H1D 109.327 1.50 +NAP C2D C1D N1N 113.620 1.99 +NAP C2D C1D H1D 109.776 1.83 +NAP N1N C1D H1D 108.901 1.50 +NAP C1D N1N C2N 119.705 1.50 +NAP C1D N1N C6N 119.705 1.50 +NAP C2N N1N C6N 120.590 1.50 +NAP N1N C2N C3N 119.549 3.00 +NAP N1N C2N H2N 120.430 1.53 +NAP C3N C2N H2N 120.021 1.50 +NAP C2N C3N C7N 119.660 2.75 +NAP C2N C3N C4N 119.402 1.64 +NAP C7N C3N C4N 120.938 2.50 +NAP C3N C7N O7N 119.730 1.50 +NAP C3N C7N N7N 118.032 1.50 +NAP O7N C7N N7N 122.238 1.50 +NAP C7N N7N H71N 120.236 2.75 +NAP C7N N7N H72N 120.236 2.75 +NAP H71N N7N H72N 119.529 2.83 +NAP C3N C4N C5N 119.166 1.50 +NAP C3N C4N H4N 120.513 1.50 +NAP C5N C4N H4N 120.320 1.50 +NAP C4N C5N C6N 120.016 1.50 +NAP C4N C5N H5N 120.300 1.50 +NAP C6N C5N H5N 119.683 1.50 +NAP N1N C6N C5N 121.277 1.50 +NAP N1N C6N H6N 118.693 1.53 +NAP C5N C6N H6N 120.031 1.59 +NAP O2B P2B O1X 106.518 3.00 +NAP O2B P2B O2X 106.518 3.00 +NAP O2B P2B O3X 106.518 3.00 +NAP O1X P2B O2X 112.139 1.52 +NAP O1X P2B O3X 112.139 1.52 +NAP O2X P2B O3X 112.139 1.52 +loop_ +_chem_comp_tor.comp_id +_chem_comp_tor.id +_chem_comp_tor.atom_id_1 +_chem_comp_tor.atom_id_2 +_chem_comp_tor.atom_id_3 +_chem_comp_tor.atom_id_4 +_chem_comp_tor.value_angle +_chem_comp_tor.value_angle_esd +_chem_comp_tor.period +NAP sp3_sp3_54 PN O3 PA O1A 60.000 10.0 3 +NAP sp3_sp3_51 C5B O5B PA O1A 60.000 10.0 3 +NAP sp3_sp3_82 C2B O2B P2B O1X 180.000 10.0 3 +NAP sp2_sp3_1 C8A N9A C1B O4B 150.000 10.0 6 +NAP const_34 N7A C8A N9A C1B 180.000 10.0 2 +NAP const_46 C5A C4A N9A C1B 180.000 10.0 2 +NAP const_37 N9A C8A N7A C5A 0.000 10.0 2 +NAP const_40 C6A C5A N7A C8A 180.000 10.0 2 +NAP const_sp2_sp2_4 N7A C5A C6A N6A 0.000 5.0 2 +NAP const_41 N9A C4A C5A N7A 0.000 10.0 2 +NAP sp2_sp2_1 C5A C6A N6A H61A 180.000 5.0 2 +NAP const_sp2_sp2_6 N6A C6A N1A C2A 180.000 5.0 2 +NAP const_sp2_sp2_7 N3A C2A N1A C6A 0.000 5.0 2 +NAP const_sp2_sp2_9 N1A C2A N3A C4A 0.000 5.0 2 +NAP const_12 N9A C4A N3A C2A 180.000 10.0 2 +NAP sp3_sp3_87 PA O3 PN O1N 60.000 10.0 3 +NAP sp3_sp3_88 C5D O5D PN O3 180.000 10.0 3 +NAP sp3_sp3_91 C4D C5D O5D PN 180.000 10.0 3 +NAP sp3_sp3_94 O4D C4D C5D O5D 180.000 10.0 3 +NAP sp3_sp3_26 C5D C4D O4D C1D -60.000 10.0 3 +NAP sp3_sp3_107 O3D C3D C4D C5D 180.000 10.0 3 +NAP sp3_sp3_28 C2D C1D O4D C4D -60.000 10.0 3 +NAP sp3_sp3_112 C4D C3D O3D HO3N 180.000 10.0 3 +NAP sp3_sp3_44 O2D C2D C3D O3D -60.000 10.0 3 +NAP sp3_sp3_115 C3D C2D O2D HO2N 180.000 10.0 3 +NAP sp3_sp3_32 O4D C1D C2D O2D 180.000 10.0 3 +NAP sp2_sp3_7 C2N N1N C1D O4D 150.000 10.0 6 +NAP const_14 C3N C2N N1N C1D 180.000 10.0 2 +NAP const_50 C5N C6N N1N C1D 180.000 10.0 2 +NAP const_18 N1N C2N C3N C7N 180.000 10.0 2 +NAP sp2_sp2_6 C2N C3N C7N O7N 0.000 5.0 2 +NAP const_23 C7N C3N C4N C5N 180.000 10.0 2 +NAP sp2_sp2_11 O7N C7N N7N H71N 0.000 5.0 2 +NAP sp3_sp3_55 C4B C5B O5B PA 180.000 10.0 3 +NAP const_25 C3N C4N C5N C6N 0.000 10.0 2 +NAP const_29 C4N C5N C6N N1N 0.000 10.0 2 +NAP sp3_sp3_58 O4B C4B C5B O5B 180.000 10.0 3 +NAP sp3_sp3_2 C5B C4B O4B C1B -60.000 10.0 3 +NAP sp3_sp3_71 O3B C3B C4B C5B 180.000 10.0 3 +NAP sp3_sp3_4 C2B C1B O4B C4B -60.000 10.0 3 +NAP sp3_sp3_76 C4B C3B O3B HO3A 180.000 10.0 3 +NAP sp3_sp3_20 O2B C2B C3B O3B -60.000 10.0 3 +NAP sp3_sp3_79 C3B C2B O2B P2B 180.000 10.0 3 +NAP sp3_sp3_8 O4B C1B C2B O2B 180.000 10.0 3 +loop_ +_chem_comp_chir.comp_id +_chem_comp_chir.id +_chem_comp_chir.atom_id_centre +_chem_comp_chir.atom_id_1 +_chem_comp_chir.atom_id_2 +_chem_comp_chir.atom_id_3 +_chem_comp_chir.volume_sign +NAP chir_1 PA O3 O5B O2A both +NAP chir_2 C4B O4B C3B C5B negative +NAP chir_3 C3B O3B C2B C4B negative +NAP chir_4 C2B O2B C1B C3B negative +NAP chir_5 C1B O4B N9A C2B negative +NAP chir_6 PN O3 O5D O2N both +NAP chir_7 C4D O4D C3D C5D negative +NAP chir_8 C3D O3D C4D C2D positive +NAP chir_9 C2D O2D C1D C3D negative +NAP chir_10 C1D O4D N1N C2D negative +loop_ +_chem_comp_plane_atom.comp_id +_chem_comp_plane_atom.plane_id +_chem_comp_plane_atom.atom_id +_chem_comp_plane_atom.dist_esd +NAP plan-1 C1B 0.020 +NAP plan-1 C2A 0.020 +NAP plan-1 C4A 0.020 +NAP plan-1 C5A 0.020 +NAP plan-1 C6A 0.020 +NAP plan-1 C8A 0.020 +NAP plan-1 H2A 0.020 +NAP plan-1 H8A 0.020 +NAP plan-1 N1A 0.020 +NAP plan-1 N3A 0.020 +NAP plan-1 N6A 0.020 +NAP plan-1 N7A 0.020 +NAP plan-1 N9A 0.020 +NAP plan-2 C1D 0.020 +NAP plan-2 C2N 0.020 +NAP plan-2 C3N 0.020 +NAP plan-2 C4N 0.020 +NAP plan-2 C5N 0.020 +NAP plan-2 C6N 0.020 +NAP plan-2 C7N 0.020 +NAP plan-2 H2N 0.020 +NAP plan-2 H4N 0.020 +NAP plan-2 H5N 0.020 +NAP plan-2 H6N 0.020 +NAP plan-2 N1N 0.020 +NAP plan-3 C6A 0.020 +NAP plan-3 H61A 0.020 +NAP plan-3 H62A 0.020 +NAP plan-3 N6A 0.020 +NAP plan-4 C3N 0.020 +NAP plan-4 C7N 0.020 +NAP plan-4 N7N 0.020 +NAP plan-4 O7N 0.020 +NAP plan-5 C7N 0.020 +NAP plan-5 H71N 0.020 +NAP plan-5 H72N 0.020 +NAP plan-5 N7N 0.020 +loop_ +_pdbx_chem_comp_descriptor.comp_id +_pdbx_chem_comp_descriptor.type +_pdbx_chem_comp_descriptor.program +_pdbx_chem_comp_descriptor.program_version +_pdbx_chem_comp_descriptor.descriptor +NAP SMILES_CANONICAL CACTVS 3.341 NC(=O)c1ccc[n+](c1)[C@@H]2O[C@H](CO[P]([O-])(=O)O[P@@](O)(=O)OC[C@H]3O[C@H]([C@H](O[P](O)(O)=O)[C@@H]3O)n4cnc5c(N)ncnc45)[C@@H](O)[C@H]2O +NAP SMILES CACTVS 3.341 NC(=O)c1ccc[n+](c1)[CH]2O[CH](CO[P]([O-])(=O)O[P](O)(=O)OC[CH]3O[CH]([CH](O[P](O)(O)=O)[CH]3O)n4cnc5c(N)ncnc45)[CH](O)[CH]2O +NAP SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 c1cc(c[n+](c1)[C@H]2[C@@H]([C@@H]([C@H](O2)CO[P@@](=O)([O-])O[P@](=O)(O)OC[C@@H]3[C@H]([C@H]([C@@H](O3)n4cnc5c4ncnc5N)OP(=O)(O)O)O)O)O)C(=O)N +NAP SMILES "OpenEye OEToolkits" 1.5.0 c1cc(c[n+](c1)C2C(C(C(O2)COP(=O)([O-])OP(=O)(O)OCC3C(C(C(O3)n4cnc5c4ncnc5N)OP(=O)(O)O)O)O)O)C(=O)N +NAP InChI InChI 1.03 InChI=1S/C21H28N7O17P3/c22-17-12-19(25-7-24-17)28(8-26-12)21-16(44-46(33,34)35)14(30)11(43-21)6-41-48(38,39)45-47(36,37)40-5-10-13(29)15(31)20(42-10)27-3-1-2-9(4-27)18(23)32/h1-4,7-8,10-11,13-16,20-21,29-31H,5-6H2,(H7-,22,23,24,25,32,33,34,35,36,37,38,39)/t10-,11-,13-,14-,15-,16-,20-,21-/m1/s1 +NAP InChIKey InChI 1.03 XJLXINKUBYWONI-NNYOXOHSSA-N +loop_ +_pdbx_chem_comp_description_generator.comp_id +_pdbx_chem_comp_description_generator.program_name +_pdbx_chem_comp_description_generator.program_version +_pdbx_chem_comp_description_generator.descriptor +NAP acedrg 243 "dictionary generator" +NAP acedrg_database 11 "data source" +NAP rdkit 2017.03.2 "Chemoinformatics tool" +NAP refmac5 5.8.0238 "optimization tool" diff --git a/image_analysis/structure_refinement/monomers/NDP.cif b/image_analysis/structure_refinement/monomers/NDP.cif new file mode 100644 index 000000000..c3eae3816 --- /dev/null +++ b/image_analysis/structure_refinement/monomers/NDP.cif @@ -0,0 +1,473 @@ +# +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +NDP NDP "NADPH DIHYDRO-NICOTINAMIDE-ADENINE-DINUCLEOTIDE PHOSPHATE" NON-POLYMER 74 48 . +# +data_comp_NDP +# +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +NDP PA P P 0 14.746 11.568 81.367 +NDP O1A O O 0 14.846 12.116 82.752 +NDP O2A O OP -1 15.219 10.173 81.123 +NDP O5B O O2 0 15.480 12.564 80.346 +NDP C5B C CH2 0 15.269 13.993 80.484 +NDP C4B C CH1 0 15.682 14.683 79.207 +NDP O4B O O2 0 15.216 16.056 79.244 +NDP C3B C CH1 0 17.194 14.748 78.938 +NDP O3B O OH1 0 17.492 14.414 77.587 +NDP C2B C CH1 0 17.556 16.184 79.308 +NDP O2B O O2 0 18.652 16.694 78.540 +NDP C1B C CH1 0 16.277 16.931 78.947 +NDP N9A N NR5 0 16.067 18.164 79.699 +NDP C8A C CR15 0 16.031 18.293 81.065 +NDP N7A N NRD5 0 15.816 19.519 81.470 +NDP C5A C CR56 0 15.691 20.250 80.299 +NDP C6A C CR6 0 15.449 21.620 80.056 +NDP N6A N NH2 0 15.287 22.522 81.021 +NDP N1A N NRD6 0 15.382 22.028 78.762 +NDP C2A C CR16 0 15.546 21.113 77.794 +NDP N3A N NRD6 0 15.777 19.804 77.905 +NDP C4A C CR56 0 15.840 19.425 79.196 +NDP O3 O O2 0 13.226 11.692 80.871 +NDP PN P P 0 12.518 11.379 79.466 +NDP O1N O O 0 13.514 10.727 78.565 +NDP O2N O OP -1 11.231 10.667 79.724 +NDP O5D O O2 0 12.213 12.863 78.935 +NDP C5D C CH2 0 11.328 13.716 79.706 +NDP C4D C CH1 0 11.023 14.974 78.929 +NDP O4D O O2 0 12.257 15.648 78.585 +NDP C3D C CH1 0 10.306 14.797 77.585 +NDP O3D O OH1 0 8.904 14.643 77.770 +NDP C2D C CH1 0 10.697 16.089 76.857 +NDP O2D O OH1 0 9.719 17.111 76.999 +NDP C1D C CH1 0 12.016 16.522 77.506 +NDP N1N N NR6 0 13.173 16.451 76.558 +NDP C2N C CR16 0 13.593 15.236 76.075 +NDP C3N C CR6 0 14.740 15.096 75.322 +NDP C7N C C 0 15.161 13.734 74.898 +NDP O7N O O 0 15.511 13.557 73.727 +NDP N7N N NH2 0 15.161 12.736 75.773 +NDP C4N C CH2 0 15.493 16.332 74.936 +NDP C5N C CR16 0 14.940 17.593 75.478 +NDP C6N C CR16 0 13.806 17.617 76.151 +NDP P2B P P 0 20.124 16.448 79.172 +NDP O1X O O 0 20.271 14.965 79.456 +NDP O2X O OP -1 20.204 17.281 80.438 +NDP O3X O OP -1 21.106 16.923 78.118 +NDP H51A H H 0 15.806 14.341 81.239 +NDP H52A H H 0 14.314 14.177 80.667 +NDP H4B H H 0 15.242 14.224 78.463 +NDP H3B H H 0 17.664 14.123 79.548 +NDP HO3A H H 0 17.093 14.951 77.068 +NDP H2B H H 0 17.743 16.245 80.273 +NDP H1B H H 0 16.282 17.128 77.984 +NDP H8A H H 0 16.159 17.569 81.654 +NDP H61A H H 0 14.828 23.253 80.863 +NDP H62A H H 0 15.640 22.380 81.812 +NDP H2A H H 0 15.491 21.442 76.910 +NDP H51N H H 0 11.757 13.954 80.565 +NDP H52N H H 0 10.485 13.237 79.901 +NDP H4D H H 0 10.493 15.568 79.503 +NDP H3D H H 0 10.672 14.015 77.099 +NDP HO3N H H 0 8.534 14.576 77.009 +NDP H2D H H 0 10.834 15.895 75.897 +NDP HO2N H H 0 9.885 17.733 76.446 +NDP H1D H H 0 11.933 17.443 77.851 +NDP H2N H H 0 13.079 14.471 76.264 +NDP H71N H H 0 14.910 12.863 76.612 +NDP H72N H H 0 15.415 11.924 75.519 +NDP H41N H H 0 15.516 16.397 73.959 +NDP H42N H H 0 16.424 16.244 75.229 +NDP H5N H H 0 15.417 18.410 75.332 +NDP H6N H H 0 13.411 18.445 76.360 +loop_ +_chem_comp_bond.comp_id +_chem_comp_bond.atom_id_1 +_chem_comp_bond.atom_id_2 +_chem_comp_bond.type +_chem_comp_bond.aromatic +_chem_comp_bond.value_dist_nucleus +_chem_comp_bond.value_dist_nucleus_esd +_chem_comp_bond.value_dist +_chem_comp_bond.value_dist_esd +NDP PA O1A DOUBLE n 1.493 0.0122 1.493 0.0122 +NDP PA O2A SINGLE n 1.493 0.0122 1.493 0.0122 +NDP PA O5B SINGLE n 1.604 0.0133 1.604 0.0133 +NDP PA O3 SINGLE n 1.604 0.0133 1.604 0.0133 +NDP O5B C5B SINGLE n 1.450 0.0166 1.450 0.0166 +NDP C5B C4B SINGLE n 1.509 0.0100 1.509 0.0100 +NDP C4B O4B SINGLE n 1.451 0.0100 1.451 0.0100 +NDP C4B C3B SINGLE n 1.535 0.0100 1.535 0.0100 +NDP O4B C1B SINGLE n 1.409 0.0100 1.409 0.0100 +NDP C3B O3B SINGLE n 1.422 0.0100 1.422 0.0100 +NDP C3B C2B SINGLE n 1.523 0.0106 1.523 0.0106 +NDP C2B O2B SINGLE n 1.425 0.0152 1.425 0.0152 +NDP C2B C1B SINGLE n 1.524 0.0100 1.524 0.0100 +NDP O2B P2B SINGLE n 1.614 0.0178 1.614 0.0178 +NDP C1B N9A SINGLE n 1.458 0.0100 1.458 0.0100 +NDP N9A C8A SINGLE y 1.372 0.0100 1.372 0.0100 +NDP N9A C4A SINGLE y 1.374 0.0101 1.374 0.0101 +NDP C8A N7A DOUBLE y 1.310 0.0100 1.310 0.0100 +NDP N7A C5A SINGLE y 1.388 0.0100 1.388 0.0100 +NDP C5A C6A SINGLE y 1.408 0.0100 1.408 0.0100 +NDP C5A C4A DOUBLE y 1.381 0.0100 1.381 0.0100 +NDP C6A N6A SINGLE n 1.330 0.0100 1.330 0.0100 +NDP C6A N1A DOUBLE y 1.354 0.0100 1.354 0.0100 +NDP N1A C2A SINGLE y 1.339 0.0100 1.339 0.0100 +NDP C2A N3A DOUBLE y 1.330 0.0100 1.330 0.0100 +NDP N3A C4A SINGLE y 1.343 0.0100 1.343 0.0100 +NDP O3 PN SINGLE n 1.604 0.0133 1.604 0.0133 +NDP PN O1N DOUBLE n 1.493 0.0122 1.493 0.0122 +NDP PN O2N SINGLE n 1.493 0.0122 1.493 0.0122 +NDP PN O5D SINGLE n 1.604 0.0133 1.604 0.0133 +NDP O5D C5D SINGLE n 1.450 0.0166 1.450 0.0166 +NDP C5D C4D SINGLE n 1.509 0.0100 1.509 0.0100 +NDP C4D O4D SINGLE n 1.449 0.0100 1.449 0.0100 +NDP C4D C3D SINGLE n 1.535 0.0100 1.535 0.0100 +NDP O4D C1D SINGLE n 1.407 0.0132 1.407 0.0132 +NDP C3D O3D SINGLE n 1.422 0.0100 1.422 0.0100 +NDP C3D C2D SINGLE n 1.530 0.0134 1.530 0.0134 +NDP C2D O2D SINGLE n 1.420 0.0122 1.420 0.0122 +NDP C2D C1D SINGLE n 1.527 0.0119 1.527 0.0119 +NDP C1D N1N SINGLE n 1.492 0.0124 1.492 0.0124 +NDP N1N C2N SINGLE n 1.367 0.0104 1.367 0.0104 +NDP N1N C6N SINGLE n 1.374 0.0156 1.374 0.0156 +NDP C2N C3N DOUBLE n 1.365 0.0175 1.365 0.0175 +NDP C3N C7N SINGLE n 1.480 0.0169 1.480 0.0169 +NDP C3N C4N SINGLE n 1.491 0.0200 1.491 0.0200 +NDP C7N O7N DOUBLE n 1.235 0.0110 1.235 0.0110 +NDP C7N N7N SINGLE n 1.325 0.0100 1.325 0.0100 +NDP C4N C5N SINGLE n 1.477 0.0200 1.477 0.0200 +NDP C5N C6N DOUBLE n 1.315 0.0139 1.315 0.0139 +NDP P2B O1X DOUBLE n 1.517 0.0192 1.517 0.0192 +NDP P2B O2X SINGLE n 1.517 0.0192 1.517 0.0192 +NDP P2B O3X SINGLE n 1.517 0.0192 1.517 0.0192 +NDP C5B H51A SINGLE n 1.089 0.0100 0.989 0.0200 +NDP C5B H52A SINGLE n 1.089 0.0100 0.989 0.0200 +NDP C4B H4B SINGLE n 1.089 0.0100 0.981 0.0200 +NDP C3B H3B SINGLE n 1.089 0.0100 0.992 0.0200 +NDP O3B HO3A SINGLE n 0.970 0.0120 0.849 0.0200 +NDP C2B H2B SINGLE n 1.089 0.0100 0.985 0.0119 +NDP C1B H1B SINGLE n 1.089 0.0100 0.984 0.0200 +NDP C8A H8A SINGLE n 1.082 0.0130 0.942 0.0170 +NDP N6A H61A SINGLE n 1.016 0.0100 0.877 0.0200 +NDP N6A H62A SINGLE n 1.016 0.0100 0.877 0.0200 +NDP C2A H2A SINGLE n 1.082 0.0130 0.945 0.0200 +NDP C5D H51N SINGLE n 1.089 0.0100 0.989 0.0200 +NDP C5D H52N SINGLE n 1.089 0.0100 0.989 0.0200 +NDP C4D H4D SINGLE n 1.089 0.0100 0.981 0.0200 +NDP C3D H3D SINGLE n 1.089 0.0100 0.992 0.0200 +NDP O3D HO3N SINGLE n 0.970 0.0120 0.849 0.0200 +NDP C2D H2D SINGLE n 1.089 0.0100 0.988 0.0200 +NDP O2D HO2N SINGLE n 0.970 0.0120 0.849 0.0200 +NDP C1D H1D SINGLE n 1.089 0.0100 0.986 0.0200 +NDP C2N H2N SINGLE n 1.082 0.0130 0.940 0.0112 +NDP N7N H71N SINGLE n 1.016 0.0100 0.887 0.0200 +NDP N7N H72N SINGLE n 1.016 0.0100 0.887 0.0200 +NDP C4N H41N SINGLE n 1.089 0.0100 0.980 0.0113 +NDP C4N H42N SINGLE n 1.089 0.0100 0.980 0.0113 +NDP C5N H5N SINGLE n 1.082 0.0130 0.957 0.0130 +NDP C6N H6N SINGLE n 1.082 0.0130 0.941 0.0198 +loop_ +_chem_comp_angle.comp_id +_chem_comp_angle.atom_id_1 +_chem_comp_angle.atom_id_2 +_chem_comp_angle.atom_id_3 +_chem_comp_angle.value_angle +_chem_comp_angle.value_angle_esd +NDP O1A PA O2A 118.411 2.35 +NDP O1A PA O5B 109.410 1.50 +NDP O1A PA O3 108.816 2.14 +NDP O2A PA O5B 109.410 1.50 +NDP O2A PA O3 108.816 2.14 +NDP O5B PA O3 101.065 1.97 +NDP PA O5B C5B 118.553 2.41 +NDP O5B C5B C4B 109.342 1.50 +NDP O5B C5B H51A 109.845 1.50 +NDP O5B C5B H52A 109.845 1.50 +NDP C4B C5B H51A 109.624 1.50 +NDP C4B C5B H52A 109.624 1.50 +NDP H51A C5B H52A 108.472 1.50 +NDP C5B C4B O4B 109.123 1.50 +NDP C5B C4B C3B 116.008 1.52 +NDP C5B C4B H4B 108.268 1.50 +NDP O4B C4B C3B 105.388 1.50 +NDP O4B C4B H4B 108.947 1.50 +NDP C3B C4B H4B 109.363 1.86 +NDP C4B O4B C1B 109.903 1.50 +NDP C4B C3B O3B 111.281 2.46 +NDP C4B C3B C2B 102.352 1.50 +NDP C4B C3B H3B 110.452 2.54 +NDP O3B C3B C2B 112.463 2.73 +NDP O3B C3B H3B 110.380 1.67 +NDP C2B C3B H3B 110.255 2.04 +NDP C3B O3B HO3A 108.744 3.00 +NDP C3B C2B O2B 110.766 3.00 +NDP C3B C2B C1B 101.388 1.50 +NDP C3B C2B H2B 110.255 2.04 +NDP O2B C2B C1B 110.738 2.44 +NDP O2B C2B H2B 110.343 1.64 +NDP C1B C2B H2B 111.050 1.62 +NDP C2B O2B P2B 109.471 3.00 +NDP O4B C1B C2B 106.416 1.50 +NDP O4B C1B N9A 108.477 1.50 +NDP O4B C1B H1B 109.807 1.50 +NDP C2B C1B N9A 113.659 1.50 +NDP C2B C1B H1B 109.319 1.50 +NDP N9A C1B H1B 109.561 1.50 +NDP C1B N9A C8A 126.848 1.91 +NDP C1B N9A C4A 127.459 1.80 +NDP C8A N9A C4A 105.693 1.50 +NDP N9A C8A N7A 113.469 1.50 +NDP N9A C8A H8A 123.206 1.50 +NDP N7A C8A H8A 123.326 1.50 +NDP C8A N7A C5A 104.739 1.50 +NDP N7A C5A C6A 132.250 1.50 +NDP N7A C5A C4A 110.483 1.50 +NDP C6A C5A C4A 117.267 1.50 +NDP C5A C6A N6A 123.792 1.50 +NDP C5A C6A N1A 117.409 1.50 +NDP N6A C6A N1A 118.799 1.50 +NDP C6A N6A H61A 119.723 1.50 +NDP C6A N6A H62A 119.723 1.50 +NDP H61A N6A H62A 120.554 1.88 +NDP C6A N1A C2A 118.521 1.50 +NDP N1A C2A N3A 129.332 1.50 +NDP N1A C2A H2A 115.313 1.50 +NDP N3A C2A H2A 115.355 1.50 +NDP C2A N3A C4A 110.982 1.50 +NDP N9A C4A C5A 105.616 1.50 +NDP N9A C4A N3A 127.895 1.50 +NDP C5A C4A N3A 126.489 1.50 +NDP PA O3 PN 132.542 3.00 +NDP O3 PN O1N 108.816 2.14 +NDP O3 PN O2N 108.816 2.14 +NDP O3 PN O5D 101.065 1.97 +NDP O1N PN O2N 118.411 2.35 +NDP O1N PN O5D 109.410 1.50 +NDP O2N PN O5D 109.410 1.50 +NDP PN O5D C5D 118.553 2.41 +NDP O5D C5D C4D 109.342 1.50 +NDP O5D C5D H51N 109.845 1.50 +NDP O5D C5D H52N 109.845 1.50 +NDP C4D C5D H51N 109.624 1.50 +NDP C4D C5D H52N 109.624 1.50 +NDP H51N C5D H52N 108.472 1.50 +NDP C5D C4D O4D 109.123 1.50 +NDP C5D C4D C3D 116.008 1.52 +NDP C5D C4D H4D 108.268 1.50 +NDP O4D C4D C3D 105.508 1.50 +NDP O4D C4D H4D 108.642 1.50 +NDP C3D C4D H4D 109.363 1.86 +NDP C4D O4D C1D 109.926 1.50 +NDP C4D C3D O3D 111.281 2.46 +NDP C4D C3D C2D 102.352 1.50 +NDP C4D C3D H3D 110.452 2.54 +NDP O3D C3D C2D 112.463 2.73 +NDP O3D C3D H3D 110.380 1.67 +NDP C2D C3D H3D 110.255 2.04 +NDP C3D O3D HO3N 108.744 3.00 +NDP C3D C2D O2D 112.463 2.73 +NDP C3D C2D C1D 104.443 2.26 +NDP C3D C2D H2D 110.255 2.04 +NDP O2D C2D C1D 111.164 2.38 +NDP O2D C2D H2D 110.259 1.63 +NDP C1D C2D H2D 110.518 1.74 +NDP C2D O2D HO2N 109.104 3.00 +NDP O4D C1D C2D 106.204 2.50 +NDP O4D C1D N1N 108.278 1.50 +NDP O4D C1D H1D 109.395 1.50 +NDP C2D C1D N1N 112.110 1.66 +NDP C2D C1D H1D 109.914 1.68 +NDP N1N C1D H1D 109.209 1.50 +NDP C1D N1N C2N 120.851 1.78 +NDP C1D N1N C6N 120.851 1.78 +NDP C2N N1N C6N 118.299 1.80 +NDP N1N C2N C3N 121.110 1.66 +NDP N1N C2N H2N 119.532 1.52 +NDP C3N C2N H2N 119.358 1.50 +NDP C2N C3N C7N 117.781 1.96 +NDP C2N C3N C4N 118.007 1.50 +NDP C7N C3N C4N 124.211 3.00 +NDP C3N C7N O7N 119.878 1.50 +NDP C3N C7N N7N 118.037 3.00 +NDP O7N C7N N7N 122.085 1.50 +NDP C7N N7N H71N 120.214 2.13 +NDP C7N N7N H72N 120.224 2.13 +NDP H71N N7N H72N 119.583 2.34 +NDP C3N C4N C5N 114.356 2.46 +NDP C3N C4N H41N 108.993 1.50 +NDP C3N C4N H42N 108.993 1.50 +NDP C5N C4N H41N 108.815 3.00 +NDP C5N C4N H42N 108.815 3.00 +NDP H41N C4N H42N 106.630 2.58 +NDP C4N C5N C6N 121.257 2.14 +NDP C4N C5N H5N 119.218 1.70 +NDP C6N C5N H5N 119.525 1.50 +NDP N1N C6N C5N 120.771 1.66 +NDP N1N C6N H6N 119.193 1.52 +NDP C5N C6N H6N 120.036 1.50 +NDP O2B P2B O1X 106.518 3.00 +NDP O2B P2B O2X 106.518 3.00 +NDP O2B P2B O3X 106.518 3.00 +NDP O1X P2B O2X 112.139 1.52 +NDP O1X P2B O3X 112.139 1.52 +NDP O2X P2B O3X 112.139 1.52 +loop_ +_chem_comp_tor.comp_id +_chem_comp_tor.id +_chem_comp_tor.atom_id_1 +_chem_comp_tor.atom_id_2 +_chem_comp_tor.atom_id_3 +_chem_comp_tor.atom_id_4 +_chem_comp_tor.value_angle +_chem_comp_tor.value_angle_esd +_chem_comp_tor.period +NDP sp3_sp3_54 PN O3 PA O1A 60.000 10.0 3 +NDP sp3_sp3_51 C5B O5B PA O1A 60.000 10.0 3 +NDP sp3_sp3_82 C2B O2B P2B O1X 180.000 10.0 3 +NDP sp2_sp3_13 C8A N9A C1B O4B 150.000 10.0 6 +NDP const_14 N7A C8A N9A C1B 180.000 10.0 2 +NDP const_26 C5A C4A N9A C1B 180.000 10.0 2 +NDP const_17 N9A C8A N7A C5A 0.000 10.0 2 +NDP const_20 C6A C5A N7A C8A 180.000 10.0 2 +NDP const_sp2_sp2_4 N7A C5A C6A N6A 0.000 5.0 2 +NDP const_21 N9A C4A C5A N7A 0.000 10.0 2 +NDP sp2_sp2_13 C5A C6A N6A H61A 180.000 5.0 2 +NDP const_sp2_sp2_6 N6A C6A N1A C2A 180.000 5.0 2 +NDP const_sp2_sp2_7 N3A C2A N1A C6A 0.000 5.0 2 +NDP const_sp2_sp2_9 N1A C2A N3A C4A 0.000 5.0 2 +NDP const_12 N9A C4A N3A C2A 180.000 10.0 2 +NDP sp3_sp3_87 PA O3 PN O1N 60.000 10.0 3 +NDP sp3_sp3_88 C5D O5D PN O3 180.000 10.0 3 +NDP sp3_sp3_91 C4D C5D O5D PN 180.000 10.0 3 +NDP sp3_sp3_94 O4D C4D C5D O5D 180.000 10.0 3 +NDP sp3_sp3_26 C5D C4D O4D C1D -60.000 10.0 3 +NDP sp3_sp3_107 O3D C3D C4D C5D 180.000 10.0 3 +NDP sp3_sp3_28 C2D C1D O4D C4D -60.000 10.0 3 +NDP sp3_sp3_112 C4D C3D O3D HO3N 180.000 10.0 3 +NDP sp3_sp3_44 O2D C2D C3D O3D -60.000 10.0 3 +NDP sp3_sp3_115 C3D C2D O2D HO2N 180.000 10.0 3 +NDP sp3_sp3_32 O4D C1D C2D O2D 180.000 10.0 3 +NDP sp2_sp3_19 C2N N1N C1D O4D 150.000 10.0 6 +NDP sp2_sp2_2 C3N C2N N1N C1D 180.000 5.0 2 +NDP sp2_sp2_18 C5N C6N N1N C1D 180.000 5.0 2 +NDP sp2_sp2_6 N1N C2N C3N C7N 180.000 5.0 2 +NDP sp2_sp2_24 C2N C3N C7N O7N 180.000 5.0 2 +NDP sp2_sp3_4 C7N C3N C4N C5N 180.000 10.0 6 +NDP sp2_sp2_27 O7N C7N N7N H71N 0.000 5.0 2 +NDP sp3_sp3_55 C4B C5B O5B PA 180.000 10.0 3 +NDP sp2_sp3_7 C6N C5N C4N C3N 0.000 10.0 6 +NDP sp2_sp2_9 C4N C5N C6N N1N 0.000 5.0 2 +NDP sp3_sp3_58 O4B C4B C5B O5B 180.000 10.0 3 +NDP sp3_sp3_2 C5B C4B O4B C1B -60.000 10.0 3 +NDP sp3_sp3_71 O3B C3B C4B C5B 180.000 10.0 3 +NDP sp3_sp3_4 C2B C1B O4B C4B -60.000 10.0 3 +NDP sp3_sp3_76 C4B C3B O3B HO3A 180.000 10.0 3 +NDP sp3_sp3_20 O2B C2B C3B O3B -60.000 10.0 3 +NDP sp3_sp3_79 C3B C2B O2B P2B 180.000 10.0 3 +NDP sp3_sp3_8 O4B C1B C2B O2B 180.000 10.0 3 +loop_ +_chem_comp_chir.comp_id +_chem_comp_chir.id +_chem_comp_chir.atom_id_centre +_chem_comp_chir.atom_id_1 +_chem_comp_chir.atom_id_2 +_chem_comp_chir.atom_id_3 +_chem_comp_chir.volume_sign +NDP chir_1 PA O3 O5B O2A both +NDP chir_2 C4B O4B C3B C5B negative +NDP chir_3 C3B O3B C2B C4B negative +NDP chir_4 C2B O2B C1B C3B negative +NDP chir_5 C1B O4B N9A C2B negative +NDP chir_6 PN O3 O5D O2N both +NDP chir_7 C4D O4D C3D C5D negative +NDP chir_8 C3D O3D C4D C2D positive +NDP chir_9 C2D O2D C1D C3D negative +NDP chir_10 C1D O4D N1N C2D negative +loop_ +_chem_comp_plane_atom.comp_id +_chem_comp_plane_atom.plane_id +_chem_comp_plane_atom.atom_id +_chem_comp_plane_atom.dist_esd +NDP plan-1 C1B 0.020 +NDP plan-1 C2A 0.020 +NDP plan-1 C4A 0.020 +NDP plan-1 C5A 0.020 +NDP plan-1 C6A 0.020 +NDP plan-1 C8A 0.020 +NDP plan-1 H2A 0.020 +NDP plan-1 H8A 0.020 +NDP plan-1 N1A 0.020 +NDP plan-1 N3A 0.020 +NDP plan-1 N6A 0.020 +NDP plan-1 N7A 0.020 +NDP plan-1 N9A 0.020 +NDP plan-2 C6A 0.020 +NDP plan-2 H61A 0.020 +NDP plan-2 H62A 0.020 +NDP plan-2 N6A 0.020 +NDP plan-3 C1D 0.020 +NDP plan-3 C2N 0.020 +NDP plan-3 C6N 0.020 +NDP plan-3 N1N 0.020 +NDP plan-4 C2N 0.020 +NDP plan-4 C3N 0.020 +NDP plan-4 H2N 0.020 +NDP plan-4 N1N 0.020 +NDP plan-5 C2N 0.020 +NDP plan-5 C3N 0.020 +NDP plan-5 C4N 0.020 +NDP plan-5 C7N 0.020 +NDP plan-6 C3N 0.020 +NDP plan-6 C7N 0.020 +NDP plan-6 N7N 0.020 +NDP plan-6 O7N 0.020 +NDP plan-7 C7N 0.020 +NDP plan-7 H71N 0.020 +NDP plan-7 H72N 0.020 +NDP plan-7 N7N 0.020 +NDP plan-8 C4N 0.020 +NDP plan-8 C5N 0.020 +NDP plan-8 C6N 0.020 +NDP plan-8 H5N 0.020 +NDP plan-9 C5N 0.020 +NDP plan-9 C6N 0.020 +NDP plan-9 H6N 0.020 +NDP plan-9 N1N 0.020 +loop_ +_pdbx_chem_comp_descriptor.comp_id +_pdbx_chem_comp_descriptor.type +_pdbx_chem_comp_descriptor.program +_pdbx_chem_comp_descriptor.program_version +_pdbx_chem_comp_descriptor.descriptor +NDP SMILES_CANONICAL CACTVS 3.341 NC(=O)C1=CN(C=CC1)[C@@H]2O[C@H](CO[P@@](O)(=O)O[P@](O)(=O)OC[C@H]3O[C@H]([C@H](O[P](O)(O)=O)[C@@H]3O)n4cnc5c(N)ncnc45)[C@@H](O)[C@H]2O +NDP SMILES CACTVS 3.341 NC(=O)C1=CN(C=CC1)[CH]2O[CH](CO[P](O)(=O)O[P](O)(=O)OC[CH]3O[CH]([CH](O[P](O)(O)=O)[CH]3O)n4cnc5c(N)ncnc45)[CH](O)[CH]2O +NDP SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 c1nc(c2c(n1)n(cn2)[C@H]3[C@@H]([C@@H]([C@H](O3)CO[P@](=O)(O)O[P@@](=O)(O)OC[C@@H]4[C@H]([C@H]([C@@H](O4)N5C=CCC(=C5)C(=O)N)O)O)O)OP(=O)(O)O)N +NDP SMILES "OpenEye OEToolkits" 1.5.0 c1nc(c2c(n1)n(cn2)C3C(C(C(O3)COP(=O)(O)OP(=O)(O)OCC4C(C(C(O4)N5C=CCC(=C5)C(=O)N)O)O)O)OP(=O)(O)O)N +NDP InChI InChI 1.03 InChI=1S/C21H30N7O17P3/c22-17-12-19(25-7-24-17)28(8-26-12)21-16(44-46(33,34)35)14(30)11(43-21)6-41-48(38,39)45-47(36,37)40-5-10-13(29)15(31)20(42-10)27-3-1-2-9(4-27)18(23)32/h1,3-4,7-8,10-11,13-16,20-21,29-31H,2,5-6H2,(H2,23,32)(H,36,37)(H,38,39)(H2,22,24,25)(H2,33,34,35)/t10-,11-,13-,14-,15-,16-,20-,21-/m1/s1 +NDP InChIKey InChI 1.03 ACFIXJIJDZMPPO-NNYOXOHSSA-N +loop_ +_pdbx_chem_comp_description_generator.comp_id +_pdbx_chem_comp_description_generator.program_name +_pdbx_chem_comp_description_generator.program_version +_pdbx_chem_comp_description_generator.descriptor +NDP acedrg 243 "dictionary generator" +NDP acedrg_database 11 "data source" +NDP rdkit 2017.03.2 "Chemoinformatics tool" +NDP refmac5 5.8.0238 "optimization tool" diff --git a/image_analysis/structure_refinement/monomers/NI.cif b/image_analysis/structure_refinement/monomers/NI.cif new file mode 100644 index 000000000..fb5249865 --- /dev/null +++ b/image_analysis/structure_refinement/monomers/NI.cif @@ -0,0 +1,30 @@ +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +NI NI 'NICKEL (II) ION ' NON-POLYMER 1 1 . + +data_comp_NI +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.partial_charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +NI NI NI NI 2.000 0.000 0.000 0.000 + +loop_ +_chem_comp_tree.comp_id +_chem_comp_tree.atom_id +_chem_comp_tree.atom_back +_chem_comp_tree.atom_forward +_chem_comp_tree.connect_type +NI NI n/a . END diff --git a/image_analysis/structure_refinement/monomers/OMC.cif b/image_analysis/structure_refinement/monomers/OMC.cif new file mode 100644 index 000000000..47bb94cb7 --- /dev/null +++ b/image_analysis/structure_refinement/monomers/OMC.cif @@ -0,0 +1,268 @@ +# +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +OMC OMC "O2'-METHYLYCYTIDINE-5'-MONOPHOSPHATE" RNA 36 22 . +# +data_comp_OMC +# +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +OMC N1 N NR6 0 47.593 -6.375 -2.504 +OMC C2 C CR6 0 46.926 -6.660 -1.298 +OMC N3 N NRD6 0 45.724 -6.070 -1.053 +OMC C4 C CR6 0 45.173 -5.232 -1.946 +OMC C5 C CR16 0 45.830 -4.936 -3.175 +OMC C6 C CR16 0 47.017 -5.523 -3.411 +OMC O2 O O 0 47.439 -7.436 -0.475 +OMC N4 N NH2 0 43.999 -4.688 -1.651 +OMC "C1'" C CH1 0 48.910 -7.010 -2.809 +OMC "C2'" C CH1 0 48.823 -8.062 -3.926 +OMC "O2'" O O2 0 49.366 -9.304 -3.486 +OMC CM2 C CH3 0 48.416 -10.158 -2.852 +OMC "C3'" C CH1 0 49.625 -7.429 -5.073 +OMC "C4'" C CH1 0 50.603 -6.511 -4.332 +OMC "O4'" O O2 0 49.817 -6.011 -3.225 +OMC "O3'" O OH1 0 50.326 -8.382 -5.862 +OMC "C5'" C CH2 0 51.176 -5.361 -5.125 +OMC "O5'" O O2 0 50.108 -4.463 -5.525 +OMC P P P 0 50.445 -3.257 -6.544 +OMC OP1 O O 0 49.150 -2.486 -6.714 +OMC OP2 O OP -1 50.910 -3.918 -7.829 +OMC OP3 O OP -1 51.534 -2.441 -5.874 +OMC H5 H H 0 45.449 -4.350 -3.805 +OMC H6 H H 0 47.471 -5.349 -4.209 +OMC HN41 H H 0 43.650 -4.086 -2.185 +OMC HN42 H H 0 43.572 -4.931 -0.922 +OMC "H1'" H H 0 49.270 -7.434 -1.997 +OMC "H2'" H H 0 47.883 -8.180 -4.213 +OMC HM21 H H 0 48.873 -10.933 -2.488 +OMC HM22 H H 0 47.756 -10.447 -3.504 +OMC HM23 H H 0 47.974 -9.675 -2.135 +OMC "H3'" H H 0 49.020 -6.893 -5.647 +OMC "H4'" H H 0 51.347 -7.043 -3.976 +OMC "HO3'" H H 0 50.750 -7.973 -6.473 +OMC "H5'" H H 0 51.639 -5.709 -5.926 +OMC "H5''" H H 0 51.834 -4.872 -4.571 +loop_ +_chem_comp_bond.comp_id +_chem_comp_bond.atom_id_1 +_chem_comp_bond.atom_id_2 +_chem_comp_bond.type +_chem_comp_bond.aromatic +_chem_comp_bond.value_dist_nucleus +_chem_comp_bond.value_dist_nucleus_esd +_chem_comp_bond.value_dist +_chem_comp_bond.value_dist_esd +OMC N1 C2 SINGLE y 1.397 0.0100 1.397 0.0100 +OMC N1 C6 SINGLE y 1.364 0.0108 1.364 0.0108 +OMC N1 "C1'" SINGLE n 1.487 0.0100 1.487 0.0100 +OMC C2 N3 SINGLE y 1.355 0.0119 1.355 0.0119 +OMC C2 O2 DOUBLE n 1.241 0.0100 1.241 0.0100 +OMC N3 C4 DOUBLE y 1.339 0.0110 1.339 0.0110 +OMC C4 C5 SINGLE y 1.422 0.0123 1.422 0.0123 +OMC C4 N4 SINGLE n 1.325 0.0109 1.325 0.0109 +OMC C5 C6 DOUBLE y 1.342 0.0100 1.342 0.0100 +OMC "C1'" "C2'" SINGLE n 1.531 0.0100 1.531 0.0100 +OMC "C1'" "O4'" SINGLE n 1.411 0.0100 1.411 0.0100 +OMC "C2'" "O2'" SINGLE n 1.423 0.0100 1.423 0.0100 +OMC "C2'" "C3'" SINGLE n 1.530 0.0134 1.530 0.0134 +OMC "O2'" CM2 SINGLE n 1.423 0.0131 1.423 0.0131 +OMC "C3'" "C4'" SINGLE n 1.535 0.0100 1.535 0.0100 +OMC "C3'" "O3'" SINGLE n 1.422 0.0100 1.422 0.0100 +OMC "C4'" "O4'" SINGLE n 1.451 0.0111 1.451 0.0111 +OMC "C4'" "C5'" SINGLE n 1.509 0.0100 1.509 0.0100 +OMC "C5'" "O5'" SINGLE n 1.450 0.0166 1.450 0.0166 +OMC "O5'" P SINGLE n 1.614 0.0178 1.614 0.0178 +OMC P OP1 DOUBLE n 1.517 0.0192 1.517 0.0192 +OMC P OP2 SINGLE n 1.517 0.0192 1.517 0.0192 +OMC P OP3 SINGLE n 1.517 0.0192 1.517 0.0192 +OMC C5 H5 SINGLE n 1.082 0.0130 0.941 0.0174 +OMC C6 H6 SINGLE n 1.082 0.0130 0.935 0.0143 +OMC N4 HN41 SINGLE n 1.016 0.0100 0.877 0.0200 +OMC N4 HN42 SINGLE n 1.016 0.0100 0.877 0.0200 +OMC "C1'" "H1'" SINGLE n 1.089 0.0100 0.985 0.0100 +OMC "C2'" "H2'" SINGLE n 1.089 0.0100 0.988 0.0200 +OMC CM2 HM21 SINGLE n 1.089 0.0100 0.971 0.0146 +OMC CM2 HM22 SINGLE n 1.089 0.0100 0.971 0.0146 +OMC CM2 HM23 SINGLE n 1.089 0.0100 0.971 0.0146 +OMC "C3'" "H3'" SINGLE n 1.089 0.0100 0.992 0.0200 +OMC "C4'" "H4'" SINGLE n 1.089 0.0100 0.981 0.0200 +OMC "O3'" "HO3'" SINGLE n 0.970 0.0120 0.849 0.0200 +OMC "C5'" "H5'" SINGLE n 1.089 0.0100 0.989 0.0200 +OMC "C5'" "H5''" SINGLE n 1.089 0.0100 0.989 0.0200 +loop_ +_chem_comp_angle.comp_id +_chem_comp_angle.atom_id_1 +_chem_comp_angle.atom_id_2 +_chem_comp_angle.atom_id_3 +_chem_comp_angle.value_angle +_chem_comp_angle.value_angle_esd +OMC C2 N1 C6 120.510 1.50 +OMC C2 N1 "C1'" 118.189 2.26 +OMC C6 N1 "C1'" 121.301 1.52 +OMC N1 C2 N3 118.920 1.50 +OMC N1 C2 O2 118.716 1.50 +OMC N3 C2 O2 122.370 1.50 +OMC C2 N3 C4 120.266 1.50 +OMC N3 C4 C5 121.269 1.50 +OMC N3 C4 N4 117.855 1.50 +OMC C5 C4 N4 120.876 1.50 +OMC C4 C5 C6 117.808 1.50 +OMC C4 C5 H5 121.350 1.50 +OMC C6 C5 H5 120.848 1.50 +OMC N1 C6 C5 121.215 1.50 +OMC N1 C6 H6 118.510 1.50 +OMC C5 C6 H6 120.275 1.75 +OMC C4 N4 HN41 119.818 1.59 +OMC C4 N4 HN42 119.818 1.59 +OMC HN41 N4 HN42 120.363 1.85 +OMC N1 "C1'" "C2'" 113.620 1.99 +OMC N1 "C1'" "O4'" 108.667 1.50 +OMC N1 "C1'" "H1'" 109.166 1.50 +OMC "C2'" "C1'" "O4'" 106.391 1.51 +OMC "C2'" "C1'" "H1'" 109.527 1.54 +OMC "O4'" "C1'" "H1'" 109.327 1.50 +OMC "C1'" "C2'" "O2'" 110.738 2.44 +OMC "C1'" "C2'" "C3'" 101.207 1.50 +OMC "C1'" "C2'" "H2'" 110.561 1.96 +OMC "O2'" "C2'" "C3'" 112.623 3.00 +OMC "O2'" "C2'" "H2'" 110.257 1.68 +OMC "C3'" "C2'" "H2'" 110.255 2.04 +OMC "C2'" "O2'" CM2 113.084 1.50 +OMC "O2'" CM2 HM21 109.434 1.50 +OMC "O2'" CM2 HM22 109.434 1.50 +OMC "O2'" CM2 HM23 109.434 1.50 +OMC HM21 CM2 HM22 109.541 1.50 +OMC HM21 CM2 HM23 109.541 1.50 +OMC HM22 CM2 HM23 109.541 1.50 +OMC "C2'" "C3'" "C4'" 102.352 1.50 +OMC "C2'" "C3'" "O3'" 112.463 2.73 +OMC "C2'" "C3'" "H3'" 110.255 2.04 +OMC "C4'" "C3'" "O3'" 111.281 2.46 +OMC "C4'" "C3'" "H3'" 110.452 2.54 +OMC "O3'" "C3'" "H3'" 110.380 1.67 +OMC "C3'" "C4'" "O4'" 104.439 1.50 +OMC "C3'" "C4'" "C5'" 116.008 1.52 +OMC "C3'" "C4'" "H4'" 109.363 1.86 +OMC "O4'" "C4'" "C5'" 109.615 1.50 +OMC "O4'" "C4'" "H4'" 108.698 1.50 +OMC "C5'" "C4'" "H4'" 108.268 1.50 +OMC "C1'" "O4'" "C4'" 109.578 1.50 +OMC "C3'" "O3'" "HO3'" 108.744 3.00 +OMC "C4'" "C5'" "O5'" 109.342 1.50 +OMC "C4'" "C5'" "H5'" 109.624 1.50 +OMC "C4'" "C5'" "H5''" 109.624 1.50 +OMC "O5'" "C5'" "H5'" 109.845 1.50 +OMC "O5'" "C5'" "H5''" 109.845 1.50 +OMC "H5'" "C5'" "H5''" 108.472 1.50 +OMC "C5'" "O5'" P 118.783 1.50 +OMC "O5'" P OP1 105.808 2.07 +OMC "O5'" P OP2 105.808 2.07 +OMC "O5'" P OP3 105.808 2.07 +OMC OP1 P OP2 112.864 1.69 +OMC OP1 P OP3 112.864 1.69 +OMC OP2 P OP3 112.864 1.69 +loop_ +_chem_comp_tor.comp_id +_chem_comp_tor.id +_chem_comp_tor.atom_id_1 +_chem_comp_tor.atom_id_2 +_chem_comp_tor.atom_id_3 +_chem_comp_tor.atom_id_4 +_chem_comp_tor.value_angle +_chem_comp_tor.value_angle_esd +_chem_comp_tor.period +OMC C2e-chi "O4'" "C1'" N1 C2 210.000 10.000 6 +OMC C2e-nyu0 "C4'" "O4'" "C1'" "C2" 340.700 6.300 1 +OMC C2e-nyu1 "O4'" "C1'" "C2'" "C3'" 32.800 4.900 1 +OMC C2e-nyu2 "C1'" "C2'" "C3'" "C4'" 326.9 3.600 1 +OMC C2e-nyu3 "C2'" "C3'" "C4'" "O4'" 22.600 4.500 1 +OMC C2e-nyu4 "C3'" "C4'" "O4'" "C1'" 357.700 6.100 1 +OMC C3e-chi "O4'" "C1'" N1 C2 210.000 10.000 6 +OMC C3e-nyu0 "C4'" "O4'" "C1'" "C2'" 2.8 6.100 1 +OMC C3e-nyu1 "O4'" "C1'" "C2'" "C3'" 335.00 4.900 1 +OMC C3e-nyu2 "C1'" "C2'" "C3'" "C4'" 35.9 2.800 1 +OMC C3e-nyu3 "C2'" "C3'" "C4'" "O4'" 324.700 3.100 1 +OMC C3e-nyu4 "C3'" "C4'" "O4'" "C1'" 20.500 5.100 1 +OMC alpha "C5'" "O5'" P OP3 -60.000 10.00 3 +OMC beta P "O5'" "C5'" "C4'" 180.000 10.00 3 +OMC epsi "C4'" "C3'" "O3'" "HO3'" 180.000 10.00 3 +OMC gamma "O5'" "C5'" "C4'" "C3'" 180.000 10.00 3 +OMC const_sp2_sp2_3 O2 C2 N1 C6 180.000 5.0 2 +OMC const_17 C5 C6 N1 C2 0.000 10.0 2 +OMC sp3_sp3_37 HM21 CM2 "O2'" "C2'" 180.000 10.0 3 +OMC const_sp2_sp2_6 O2 C2 N3 C4 180.000 5.0 2 +OMC const_sp2_sp2_8 N4 C4 N3 C2 180.000 5.0 2 +OMC const_11 N4 C4 C5 C6 180.000 10.0 2 +OMC sp2_sp2_3 N3 C4 N4 HN41 0.000 5.0 2 +OMC const_13 C4 C5 C6 N1 0.000 10.0 2 +OMC sp3_sp3_34 "C1'" "C2'" "O2'" CM2 180.000 10.0 3 +loop_ +_chem_comp_chir.comp_id +_chem_comp_chir.id +_chem_comp_chir.atom_id_centre +_chem_comp_chir.atom_id_1 +_chem_comp_chir.atom_id_2 +_chem_comp_chir.atom_id_3 +_chem_comp_chir.volume_sign +OMC chir_1 "C1'" "O4'" N1 "C2'" negative +OMC chir_2 "C2'" "O2'" "C1'" "C3'" negative +OMC chir_3 "C3'" "O3'" "C2'" "C4'" negative +OMC chir_4 "C4'" "O4'" "C3'" "C5'" negative +OMC chir_5 P "O5'" OP2 OP3 both +loop_ +_chem_comp_plane_atom.comp_id +_chem_comp_plane_atom.plane_id +_chem_comp_plane_atom.atom_id +_chem_comp_plane_atom.dist_esd +OMC plan-1 "C1'" 0.020 +OMC plan-1 C2 0.020 +OMC plan-1 C4 0.020 +OMC plan-1 C5 0.020 +OMC plan-1 C6 0.020 +OMC plan-1 H5 0.020 +OMC plan-1 H6 0.020 +OMC plan-1 N1 0.020 +OMC plan-1 N3 0.020 +OMC plan-1 N4 0.020 +OMC plan-1 O2 0.020 +OMC plan-2 C4 0.020 +OMC plan-2 HN41 0.020 +OMC plan-2 HN42 0.020 +OMC plan-2 N4 0.020 +loop_ +_pdbx_chem_comp_descriptor.comp_id +_pdbx_chem_comp_descriptor.type +_pdbx_chem_comp_descriptor.program +_pdbx_chem_comp_descriptor.program_version +_pdbx_chem_comp_descriptor.descriptor +OMC SMILES ACDLabs 10.04 O=C1N=C(N)C=CN1C2OC(C(O)C2OC)COP(=O)(O)O +OMC SMILES_CANONICAL CACTVS 3.341 CO[C@@H]1[C@H](O)[C@@H](CO[P](O)(O)=O)O[C@H]1N2C=CC(=NC2=O)N +OMC SMILES CACTVS 3.341 CO[CH]1[CH](O)[CH](CO[P](O)(O)=O)O[CH]1N2C=CC(=NC2=O)N +OMC SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 CO[C@@H]1[C@@H]([C@H](O[C@H]1N2C=CC(=NC2=O)N)COP(=O)(O)O)O +OMC SMILES "OpenEye OEToolkits" 1.5.0 COC1C(C(OC1N2C=CC(=NC2=O)N)COP(=O)(O)O)O +OMC InChI InChI 1.03 InChI=1S/C10H16N3O8P/c1-19-8-7(14)5(4-20-22(16,17)18)21-9(8)13-3-2-6(11)12-10(13)15/h2-3,5,7-9,14H,4H2,1H3,(H2,11,12,15)(H2,16,17,18)/t5-,7-,8-,9-/m1/s1 +OMC InChIKey InChI 1.03 USRXKJOTSNCJMA-ZOQUXTDFSA-N +loop_ +_pdbx_chem_comp_description_generator.comp_id +_pdbx_chem_comp_description_generator.program_name +_pdbx_chem_comp_description_generator.program_version +_pdbx_chem_comp_description_generator.descriptor +OMC acedrg 243 "dictionary generator" +OMC acedrg_database 11 "data source" +OMC rdkit 2017.03.2 "Chemoinformatics tool" +OMC refmac5 5.8.0238 "optimization tool" diff --git a/image_analysis/structure_refinement/monomers/OMG.cif b/image_analysis/structure_refinement/monomers/OMG.cif new file mode 100644 index 000000000..f0bb41e3a --- /dev/null +++ b/image_analysis/structure_refinement/monomers/OMG.cif @@ -0,0 +1,294 @@ +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +OMG OMG "O2'-METHYLGUANOSINE-5'-MONOPHOSPHATE" RNA 39 25 . + +data_comp_OMG +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +OMG P P P 0 46.680 -11.593 -10.172 +OMG OP1 O O 0 46.840 -10.158 -9.706 +OMG OP2 O OP -1 47.443 -11.887 -11.449 +OMG OP3 O OP -1 46.957 -12.602 -9.074 +OMG "O5'" O O2 0 45.118 -11.766 -10.543 +OMG "C5'" C CH2 0 44.556 -10.952 -11.605 +OMG "C4'" C CH1 0 43.054 -11.106 -11.627 +OMG "O4'" O O2 0 42.713 -12.507 -11.779 +OMG "C3'" C CH1 0 42.306 -10.664 -10.364 +OMG "O3'" O OH1 0 42.080 -9.260 -10.371 +OMG "C2'" C CH1 0 41.018 -11.485 -10.465 +OMG "O2'" O O2 0 40.048 -10.870 -11.308 +OMG CM2 C CH3 0 38.711 -11.301 -11.064 +OMG "C1'" C CH1 0 41.518 -12.794 -11.083 +OMG N9 N NR5 0 41.769 -13.832 -10.083 +OMG C8 C CR15 0 42.971 -14.402 -9.735 +OMG N7 N NRD5 0 42.865 -15.317 -8.802 +OMG C5 C CR56 0 41.507 -15.358 -8.517 +OMG C6 C CR6 0 40.790 -16.159 -7.588 +OMG O6 O O 0 41.238 -17.015 -6.813 +OMG N1 N NR16 0 39.417 -15.883 -7.616 +OMG C2 C CR6 0 38.813 -14.955 -8.435 +OMG N2 N NH2 0 37.484 -14.824 -8.326 +OMG N3 N NRD6 0 39.486 -14.200 -9.310 +OMG C4 C CR56 0 40.821 -14.453 -9.301 +OMG "H5'" H H 0 44.931 -11.234 -12.476 +OMG "H5''" H H 0 44.789 -10.002 -11.458 +OMG "H4'" H H 0 42.707 -10.610 -12.398 +OMG "H3'" H H 0 42.809 -10.925 -9.551 +OMG "HO3'" H H 0 41.566 -9.062 -9.725 +OMG "H2'" H H 0 40.648 -11.625 -9.558 +OMG HM21 H H 0 38.118 -10.894 -11.717 +OMG HM22 H H 0 38.441 -11.032 -10.171 +OMG HM23 H H 0 38.663 -12.267 -11.141 +OMG "H1'" H H 0 40.844 -13.122 -11.720 +OMG H8 H H 0 43.793 -14.159 -10.125 +OMG HN1 H H 0 38.896 -16.352 -7.054 +OMG HN21 H H 0 37.121 -14.025 -8.337 +OMG HN22 H H 0 36.980 -15.537 -8.245 + +loop_ +_chem_comp_bond.comp_id +_chem_comp_bond.atom_id_1 +_chem_comp_bond.atom_id_2 +_chem_comp_bond.type +_chem_comp_bond.aromatic +_chem_comp_bond.value_dist_nucleus +_chem_comp_bond.value_dist_nucleus_esd +_chem_comp_bond.value_dist +_chem_comp_bond.value_dist_esd +OMG P OP1 DOUBLE n 1.517 0.0192 1.517 0.0192 +OMG P OP2 SINGLE n 1.517 0.0192 1.517 0.0192 +OMG P OP3 SINGLE n 1.517 0.0192 1.517 0.0192 +OMG P "O5'" SINGLE n 1.614 0.0178 1.614 0.0178 +OMG "O5'" "C5'" SINGLE n 1.450 0.0166 1.450 0.0166 +OMG "C5'" "C4'" SINGLE n 1.509 0.0100 1.509 0.0100 +OMG "C4'" "O4'" SINGLE n 1.451 0.0100 1.451 0.0100 +OMG "C4'" "C3'" SINGLE n 1.535 0.0100 1.535 0.0100 +OMG "O4'" "C1'" SINGLE n 1.409 0.0100 1.409 0.0100 +OMG "C3'" "O3'" SINGLE n 1.422 0.0100 1.422 0.0100 +OMG "C3'" "C2'" SINGLE n 1.530 0.0134 1.530 0.0134 +OMG "C2'" "O2'" SINGLE n 1.423 0.0100 1.423 0.0100 +OMG "C2'" "C1'" SINGLE n 1.527 0.0100 1.527 0.0100 +OMG "O2'" CM2 SINGLE n 1.423 0.0131 1.423 0.0131 +OMG "C1'" N9 SINGLE n 1.458 0.0100 1.458 0.0100 +OMG N9 C8 SINGLE y 1.372 0.0100 1.372 0.0100 +OMG N9 C4 SINGLE y 1.375 0.0100 1.375 0.0100 +OMG C8 N7 DOUBLE y 1.312 0.0100 1.312 0.0100 +OMG N7 C5 SINGLE y 1.390 0.0100 1.390 0.0100 +OMG C5 C6 SINGLE y 1.417 0.0103 1.417 0.0103 +OMG C5 C4 DOUBLE y 1.377 0.0100 1.377 0.0100 +OMG C6 O6 DOUBLE n 1.239 0.0100 1.239 0.0100 +OMG C6 N1 SINGLE y 1.396 0.0107 1.396 0.0107 +OMG N1 C2 SINGLE y 1.374 0.0100 1.374 0.0100 +OMG C2 N2 SINGLE n 1.340 0.0101 1.340 0.0101 +OMG C2 N3 DOUBLE y 1.333 0.0104 1.333 0.0104 +OMG N3 C4 SINGLE y 1.355 0.0100 1.355 0.0100 +OMG "C5'" "H5'" SINGLE n 1.089 0.0100 0.989 0.0200 +OMG "C5'" "H5''" SINGLE n 1.089 0.0100 0.989 0.0200 +OMG "C4'" "H4'" SINGLE n 1.089 0.0100 0.981 0.0200 +OMG "C3'" "H3'" SINGLE n 1.089 0.0100 0.992 0.0200 +OMG "O3'" "HO3'" SINGLE n 0.970 0.0120 0.849 0.0200 +OMG "C2'" "H2'" SINGLE n 1.089 0.0100 0.988 0.0200 +OMG CM2 HM21 SINGLE n 1.089 0.0100 0.971 0.0146 +OMG CM2 HM22 SINGLE n 1.089 0.0100 0.971 0.0146 +OMG CM2 HM23 SINGLE n 1.089 0.0100 0.971 0.0146 +OMG "C1'" "H1'" SINGLE n 1.089 0.0100 0.984 0.0200 +OMG C8 H8 SINGLE n 1.082 0.0130 0.942 0.0170 +OMG N1 HN1 SINGLE n 1.016 0.0100 0.897 0.0200 +OMG N2 HN21 SINGLE n 1.016 0.0100 0.877 0.0200 +OMG N2 HN22 SINGLE n 1.016 0.0100 0.877 0.0200 + +loop_ +_chem_comp_angle.comp_id +_chem_comp_angle.atom_id_1 +_chem_comp_angle.atom_id_2 +_chem_comp_angle.atom_id_3 +_chem_comp_angle.value_angle +_chem_comp_angle.value_angle_esd +OMG OP1 P OP2 112.864 1.69 +OMG OP1 P OP3 112.864 1.69 +OMG OP1 P "O5'" 105.808 2.07 +OMG OP2 P OP3 112.864 1.69 +OMG OP2 P "O5'" 105.808 2.07 +OMG OP3 P "O5'" 105.808 2.07 +OMG P "O5'" "C5'" 118.783 1.50 +OMG "O5'" "C5'" "C4'" 109.342 1.50 +OMG "O5'" "C5'" "H5'" 109.845 1.50 +OMG "O5'" "C5'" "H5''" 109.845 1.50 +OMG "C4'" "C5'" "H5'" 109.624 1.50 +OMG "C4'" "C5'" "H5''" 109.624 1.50 +OMG "H5'" "C5'" "H5''" 108.472 1.50 +OMG "C5'" "C4'" "O4'" 109.123 1.50 +OMG "C5'" "C4'" "C3'" 116.008 1.52 +OMG "C5'" "C4'" "H4'" 108.268 1.50 +OMG "O4'" "C4'" "C3'" 105.388 1.50 +OMG "O4'" "C4'" "H4'" 108.947 1.50 +OMG "C3'" "C4'" "H4'" 109.363 1.86 +OMG "C4'" "O4'" "C1'" 109.903 1.50 +OMG "C4'" "C3'" "O3'" 111.281 2.46 +OMG "C4'" "C3'" "C2'" 102.352 1.50 +OMG "C4'" "C3'" "H3'" 110.452 2.54 +OMG "O3'" "C3'" "C2'" 112.463 2.73 +OMG "O3'" "C3'" "H3'" 110.380 1.67 +OMG "C2'" "C3'" "H3'" 110.255 2.04 +OMG "C3'" "O3'" "HO3'" 108.744 3.00 +OMG "C3'" "C2'" "O2'" 112.623 3.00 +OMG "C3'" "C2'" "C1'" 101.388 1.50 +OMG "C3'" "C2'" "H2'" 110.255 2.04 +OMG "O2'" "C2'" "C1'" 110.738 2.44 +OMG "O2'" "C2'" "H2'" 110.257 1.68 +OMG "C1'" "C2'" "H2'" 111.584 1.94 +OMG "C2'" "O2'" CM2 113.084 1.50 +OMG "O2'" CM2 HM21 109.434 1.50 +OMG "O2'" CM2 HM22 109.434 1.50 +OMG "O2'" CM2 HM23 109.434 1.50 +OMG HM21 CM2 HM22 109.541 1.50 +OMG HM21 CM2 HM23 109.541 1.50 +OMG HM22 CM2 HM23 109.541 1.50 +OMG "O4'" "C1'" "C2'" 106.765 1.50 +OMG "O4'" "C1'" N9 108.477 1.50 +OMG "O4'" "C1'" "H1'" 109.807 1.50 +OMG "C2'" "C1'" N9 112.584 1.50 +OMG "C2'" "C1'" "H1'" 109.263 1.50 +OMG N9 "C1'" "H1'" 109.561 1.50 +OMG "C1'" N9 C8 126.829 1.91 +OMG "C1'" N9 C4 127.440 1.80 +OMG C8 N9 C4 105.731 1.50 +OMG N9 C8 N7 113.507 1.50 +OMG N9 C8 H8 123.187 1.50 +OMG N7 C8 H8 123.307 1.50 +OMG C8 N7 C5 104.778 1.50 +OMG N7 C5 C6 130.030 1.50 +OMG N7 C5 C4 110.574 1.50 +OMG C6 C5 C4 119.397 1.50 +OMG C5 C6 O6 128.244 1.50 +OMG C5 C6 N1 111.367 1.50 +OMG O6 C6 N1 120.389 1.50 +OMG C6 N1 C2 125.351 1.50 +OMG C6 N1 HN1 116.978 2.44 +OMG C2 N1 HN1 117.677 2.71 +OMG N1 C2 N2 116.576 1.50 +OMG N1 C2 N3 123.602 1.50 +OMG N2 C2 N3 119.821 1.50 +OMG C2 N2 HN21 119.868 1.50 +OMG C2 N2 HN22 119.868 1.50 +OMG HN21 N2 HN22 120.263 1.96 +OMG C2 N3 C4 112.066 1.50 +OMG N9 C4 C5 105.411 1.50 +OMG N9 C4 N3 126.378 1.50 +OMG C5 C4 N3 128.211 1.50 + +loop_ +_chem_comp_tor.comp_id +_chem_comp_tor.id +_chem_comp_tor.atom_id_1 +_chem_comp_tor.atom_id_2 +_chem_comp_tor.atom_id_3 +_chem_comp_tor.atom_id_4 +_chem_comp_tor.value_angle +_chem_comp_tor.value_angle_esd +_chem_comp_tor.period +OMG C2e-chi "O4'" "C1'" N9 C4 210.000 10.000 6 +OMG C2e-nyu0 "C4'" "O4'" "C1'" "C2'" 340.700 6.300 1 +OMG C2e-nyu1 "O4'" "C1'" "C2'" "C3'" 32.800 4.900 1 +OMG C2e-nyu2 "C1'" "C2'" "C3'" "C4'" 326.9 3.600 1 +OMG C2e-nyu3 "C2'" "C3'" "C4'" "O4'" 22.600 4.500 1 +OMG C2e-nyu4 "C3'" "C4'" "O4'" "C1'" 357.700 6.100 1 +OMG C3e-chi "O4'" "C1'" N9 C4 210.000 10.000 6 +OMG C3e-nyu0 "C4'" "O4'" "C1'" "C2'" 2.8 6.100 1 +OMG C3e-nyu1 "O4'" "C1'" "C2'" "C3'" 335.00 4.900 1 +OMG C3e-nyu2 "C1'" "C2'" "C3'" "C4'" 35.9 2.800 1 +OMG C3e-nyu3 "C2'" "C3'" "C4'" "O4'" 324.700 3.100 1 +OMG C3e-nyu4 "C3'" "C4'" "O4'" "C1'" 20.500 5.100 1 +OMG alpha "C5'" "O5'" P OP3 -60.000 10.00 3 +OMG beta P "O5'" "C5'" "C4'" 180.000 10.00 3 +OMG epsi "C4'" "C3'" "O3'" "HO3'" 180.000 10.00 3 +OMG gamma "O5'" "C5'" "C4'" "C3'" 180.000 10.00 3 +OMG sp3_sp3_52 "C3'" "C2'" "O2'" CM2 180.000 10.0 3 +OMG sp3_sp3_55 HM21 CM2 "O2'" "C2'" 180.000 10.0 3 +OMG const_18 N7 C8 N9 "C1'" 180.000 10.0 2 +OMG const_30 C5 C4 N9 "C1'" 180.000 10.0 2 +OMG const_21 N9 C8 N7 C5 0.000 10.0 2 +OMG const_24 C6 C5 N7 C8 180.000 10.0 2 +OMG const_sp2_sp2_4 N7 C5 C6 O6 0.000 5.0 2 +OMG const_25 N9 C4 C5 N7 0.000 10.0 2 +OMG const_sp2_sp2_7 O6 C6 N1 C2 180.000 5.0 2 +OMG const_11 N2 C2 N1 C6 180.000 10.0 2 +OMG sp2_sp2_1 N1 C2 N2 HN21 180.000 5.0 2 +OMG const_14 N2 C2 N3 C4 180.000 10.0 2 +OMG const_16 N9 C4 N3 C2 180.000 10.0 2 + +loop_ +_chem_comp_chir.comp_id +_chem_comp_chir.id +_chem_comp_chir.atom_id_centre +_chem_comp_chir.atom_id_1 +_chem_comp_chir.atom_id_2 +_chem_comp_chir.atom_id_3 +_chem_comp_chir.volume_sign +OMG chir_1 P "O5'" OP2 OP3 both +OMG chir_2 "C4'" "O4'" "C3'" "C5'" negative +OMG chir_3 "C3'" "O3'" "C2'" "C4'" negative +OMG chir_4 "C2'" "O2'" "C1'" "C3'" negative +OMG chir_5 "C1'" "O4'" N9 "C2'" negative + +loop_ +_chem_comp_plane_atom.comp_id +_chem_comp_plane_atom.plane_id +_chem_comp_plane_atom.atom_id +_chem_comp_plane_atom.dist_esd +OMG plan-1 "C1'" 0.020 +OMG plan-1 C2 0.020 +OMG plan-1 C4 0.020 +OMG plan-1 C5 0.020 +OMG plan-1 C6 0.020 +OMG plan-1 C8 0.020 +OMG plan-1 H8 0.020 +OMG plan-1 HN1 0.020 +OMG plan-1 N1 0.020 +OMG plan-1 N2 0.020 +OMG plan-1 N3 0.020 +OMG plan-1 N7 0.020 +OMG plan-1 N9 0.020 +OMG plan-1 O6 0.020 +OMG plan-2 C2 0.020 +OMG plan-2 HN21 0.020 +OMG plan-2 HN22 0.020 +OMG plan-2 N2 0.020 + +loop_ +_pdbx_chem_comp_descriptor.comp_id +_pdbx_chem_comp_descriptor.type +_pdbx_chem_comp_descriptor.program +_pdbx_chem_comp_descriptor.program_version +_pdbx_chem_comp_descriptor.descriptor +OMG SMILES ACDLabs 10.04 O=C1c2ncn(c2N=C(N)N1)C3OC(C(O)C3OC)COP(=O)(O)O +OMG SMILES_CANONICAL CACTVS 3.341 CO[C@@H]1[C@H](O)[C@@H](CO[P](O)(O)=O)O[C@H]1n2cnc3C(=O)NC(=Nc23)N +OMG SMILES CACTVS 3.341 CO[CH]1[CH](O)[CH](CO[P](O)(O)=O)O[CH]1n2cnc3C(=O)NC(=Nc23)N +OMG SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 CO[C@@H]1[C@@H]([C@H](O[C@H]1n2cnc3c2N=C(NC3=O)N)COP(=O)(O)O)O +OMG SMILES "OpenEye OEToolkits" 1.5.0 COC1C(C(OC1n2cnc3c2N=C(NC3=O)N)COP(=O)(O)O)O +OMG InChI InChI 1.03 InChI=1S/C11H16N5O8P/c1-22-7-6(17)4(2-23-25(19,20)21)24-10(7)16-3-13-5-8(16)14-11(12)15-9(5)18/h3-4,6-7,10,17H,2H2,1H3,(H2,19,20,21)(H3,12,14,15,18)/t4-,6-,7-,10-/m1/s1 +OMG InChIKey InChI 1.03 YPMKZCOIEXUDSS-KQYNXXCUSA-N + +loop_ +_pdbx_chem_comp_description_generator.comp_id +_pdbx_chem_comp_description_generator.program_name +_pdbx_chem_comp_description_generator.program_version +_pdbx_chem_comp_description_generator.descriptor +OMG acedrg 243 "dictionary generator" +OMG acedrg_database 11 "data source" +OMG rdkit 2017.03.2 "Chemoinformatics tool" +OMG refmac5 5.8.0238 "optimization tool" diff --git a/image_analysis/structure_refinement/monomers/OMU.cif b/image_analysis/structure_refinement/monomers/OMU.cif new file mode 100644 index 000000000..4fff76f20 --- /dev/null +++ b/image_analysis/structure_refinement/monomers/OMU.cif @@ -0,0 +1,266 @@ +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +OMU OMU "O2'-METHYLURIDINE 5'-MONOPHOSPHATE" RNA 35 22 . + +data_comp_OMU +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +OMU N1 N NR6 0 7.321 3.277 -7.800 +OMU C2 C CR6 0 6.703 4.284 -8.539 +OMU N3 N NR16 0 5.357 4.097 -8.759 +OMU C4 C CR6 0 4.576 3.040 -8.325 +OMU C5 C CR16 0 5.282 2.046 -7.565 +OMU C6 C CR16 0 6.597 2.199 -7.332 +OMU O2 O O 0 7.289 5.268 -8.976 +OMU O4 O O 0 3.377 3.016 -8.605 +OMU "C1'" C CH1 0 8.775 3.398 -7.507 +OMU "C2'" C CH1 0 9.066 3.720 -6.033 +OMU "O2'" O O2 0 9.918 4.857 -5.928 +OMU CM2 C CH3 0 9.221 6.100 -5.894 +OMU "C3'" C CH1 0 9.716 2.430 -5.513 +OMU "C4'" C CH1 0 10.361 1.849 -6.776 +OMU "O3'" O OH1 0 10.695 2.660 -4.506 +OMU "O4'" O O2 0 9.408 2.172 -7.816 +OMU "C5'" C CH2 0 10.637 0.365 -6.768 +OMU "O5'" O O2 0 9.387 -0.365 -6.663 +OMU P P P 0 9.434 -1.955 -6.390 +OMU OP1 O O 0 10.088 -2.124 -5.032 +OMU OP2 O OP -1 7.990 -2.420 -6.410 +OMU OP3 O OP -1 10.258 -2.544 -7.519 +OMU HN3 H H 0 4.952 4.733 -9.234 +OMU H5 H H 0 4.828 1.299 -7.235 +OMU H6 H H 0 7.045 1.542 -6.834 +OMU "H1'" H H 0 9.170 4.096 -8.070 +OMU "H2'" H H 0 8.220 3.878 -5.544 +OMU HM21 H H 0 9.861 6.830 -5.932 +OMU HM22 H H 0 8.710 6.162 -5.071 +OMU HM23 H H 0 8.620 6.157 -6.654 +OMU "H3'" H H 0 9.016 1.816 -5.172 +OMU "H4'" H H 0 11.202 2.320 -6.961 +OMU "HO3'" H H 0 11.018 1.914 -4.263 +OMU "H5'" H H 0 11.221 0.141 -6.002 +OMU "H5''" H H 0 11.104 0.110 -7.601 + +loop_ +_chem_comp_bond.comp_id +_chem_comp_bond.atom_id_1 +_chem_comp_bond.atom_id_2 +_chem_comp_bond.type +_chem_comp_bond.aromatic +_chem_comp_bond.value_dist_nucleus +_chem_comp_bond.value_dist_nucleus_esd +_chem_comp_bond.value_dist +_chem_comp_bond.value_dist_esd +OMU N1 C2 SINGLE y 1.383 0.0100 1.383 0.0100 +OMU N1 C6 SINGLE y 1.375 0.0106 1.375 0.0106 +OMU N1 "C1'" SINGLE n 1.476 0.0133 1.476 0.0133 +OMU C2 N3 SINGLE y 1.372 0.0112 1.372 0.0112 +OMU C2 O2 DOUBLE n 1.224 0.0111 1.224 0.0111 +OMU N3 C4 SINGLE y 1.381 0.0100 1.381 0.0100 +OMU C4 C5 SINGLE y 1.434 0.0100 1.434 0.0100 +OMU C4 O4 DOUBLE n 1.231 0.0100 1.231 0.0100 +OMU C5 C6 DOUBLE y 1.342 0.0100 1.342 0.0100 +OMU "C1'" "C2'" SINGLE n 1.531 0.0100 1.531 0.0100 +OMU "C1'" "O4'" SINGLE n 1.412 0.0100 1.412 0.0100 +OMU "C2'" "O2'" SINGLE n 1.423 0.0100 1.423 0.0100 +OMU "C2'" "C3'" SINGLE n 1.530 0.0134 1.530 0.0134 +OMU "O2'" CM2 SINGLE n 1.423 0.0131 1.423 0.0131 +OMU "C3'" "C4'" SINGLE n 1.535 0.0100 1.535 0.0100 +OMU "C3'" "O3'" SINGLE n 1.422 0.0100 1.422 0.0100 +OMU "C4'" "O4'" SINGLE n 1.451 0.0111 1.451 0.0111 +OMU "C4'" "C5'" SINGLE n 1.509 0.0100 1.509 0.0100 +OMU "C5'" "O5'" SINGLE n 1.450 0.0166 1.450 0.0166 +OMU "O5'" P SINGLE n 1.614 0.0178 1.614 0.0178 +OMU P OP1 DOUBLE n 1.517 0.0192 1.517 0.0192 +OMU P OP2 SINGLE n 1.517 0.0192 1.517 0.0192 +OMU P OP3 SINGLE n 1.517 0.0192 1.517 0.0192 +OMU N3 HN3 SINGLE n 1.016 0.0100 0.889 0.0200 +OMU C5 H5 SINGLE n 1.082 0.0130 0.935 0.0100 +OMU C6 H6 SINGLE n 1.082 0.0130 0.938 0.0107 +OMU "C1'" "H1'" SINGLE n 1.089 0.0100 0.981 0.0118 +OMU "C2'" "H2'" SINGLE n 1.089 0.0100 0.988 0.0200 +OMU CM2 HM21 SINGLE n 1.089 0.0100 0.971 0.0146 +OMU CM2 HM22 SINGLE n 1.089 0.0100 0.971 0.0146 +OMU CM2 HM23 SINGLE n 1.089 0.0100 0.971 0.0146 +OMU "C3'" "H3'" SINGLE n 1.089 0.0100 0.992 0.0200 +OMU "C4'" "H4'" SINGLE n 1.089 0.0100 0.981 0.0200 +OMU "O3'" "HO3'" SINGLE n 0.970 0.0120 0.849 0.0200 +OMU "C5'" "H5'" SINGLE n 1.089 0.0100 0.989 0.0200 +OMU "C5'" "H5''" SINGLE n 1.089 0.0100 0.989 0.0200 + +loop_ +_chem_comp_angle.comp_id +_chem_comp_angle.atom_id_1 +_chem_comp_angle.atom_id_2 +_chem_comp_angle.atom_id_3 +_chem_comp_angle.value_angle +_chem_comp_angle.value_angle_esd +OMU C2 N1 C6 121.419 1.50 +OMU C2 N1 "C1'" 117.109 1.50 +OMU C6 N1 "C1'" 121.471 1.52 +OMU N1 C2 N3 114.848 1.50 +OMU N1 C2 O2 122.841 1.50 +OMU N3 C2 O2 122.311 1.50 +OMU C2 N3 C4 126.992 1.50 +OMU C2 N3 HN3 115.772 1.79 +OMU C4 N3 HN3 117.236 1.73 +OMU N3 C4 C5 114.659 1.50 +OMU N3 C4 O4 119.401 1.50 +OMU C5 C4 O4 125.940 1.50 +OMU C4 C5 C6 119.525 1.50 +OMU C4 C5 H5 120.151 1.50 +OMU C6 C5 H5 120.325 1.50 +OMU N1 C6 C5 122.557 1.50 +OMU N1 C6 H6 118.477 1.50 +OMU C5 C6 H6 118.966 1.50 +OMU N1 "C1'" "C2'" 113.620 1.99 +OMU N1 "C1'" "O4'" 108.667 1.50 +OMU N1 "C1'" "H1'" 109.166 1.50 +OMU "C2'" "C1'" "O4'" 106.391 1.51 +OMU "C2'" "C1'" "H1'" 109.527 1.54 +OMU "O4'" "C1'" "H1'" 109.327 1.50 +OMU "C1'" "C2'" "O2'" 110.738 2.44 +OMU "C1'" "C2'" "C3'" 101.207 1.50 +OMU "C1'" "C2'" "H2'" 110.561 1.96 +OMU "O2'" "C2'" "C3'" 112.623 3.00 +OMU "O2'" "C2'" "H2'" 110.257 1.68 +OMU "C3'" "C2'" "H2'" 110.255 2.04 +OMU "C2'" "O2'" CM2 113.084 1.50 +OMU "O2'" CM2 HM21 109.434 1.50 +OMU "O2'" CM2 HM22 109.434 1.50 +OMU "O2'" CM2 HM23 109.434 1.50 +OMU HM21 CM2 HM22 109.541 1.50 +OMU HM21 CM2 HM23 109.541 1.50 +OMU HM22 CM2 HM23 109.541 1.50 +OMU "C2'" "C3'" "C4'" 102.352 1.50 +OMU "C2'" "C3'" "O3'" 112.463 2.73 +OMU "C2'" "C3'" "H3'" 110.255 2.04 +OMU "C4'" "C3'" "O3'" 111.281 2.46 +OMU "C4'" "C3'" "H3'" 110.452 2.54 +OMU "O3'" "C3'" "H3'" 110.380 1.67 +OMU "C3'" "C4'" "O4'" 104.439 1.50 +OMU "C3'" "C4'" "C5'" 116.008 1.52 +OMU "C3'" "C4'" "H4'" 109.363 1.86 +OMU "O4'" "C4'" "C5'" 109.615 1.50 +OMU "O4'" "C4'" "H4'" 108.698 1.50 +OMU "C5'" "C4'" "H4'" 108.268 1.50 +OMU "C3'" "O3'" "HO3'" 108.744 3.00 +OMU "C1'" "O4'" "C4'" 109.578 1.50 +OMU "C4'" "C5'" "O5'" 109.342 1.50 +OMU "C4'" "C5'" "H5'" 109.624 1.50 +OMU "C4'" "C5'" "H5''" 109.624 1.50 +OMU "O5'" "C5'" "H5'" 109.845 1.50 +OMU "O5'" "C5'" "H5''" 109.845 1.50 +OMU "H5'" "C5'" "H5''" 108.472 1.50 +OMU "C5'" "O5'" P 118.783 1.50 +OMU "O5'" P OP1 105.808 2.07 +OMU "O5'" P OP2 105.808 2.07 +OMU "O5'" P OP3 105.808 2.07 +OMU OP1 P OP2 112.864 1.69 +OMU OP1 P OP3 112.864 1.69 +OMU OP2 P OP3 112.864 1.69 + +loop_ +_chem_comp_tor.comp_id +_chem_comp_tor.id +_chem_comp_tor.atom_id_1 +_chem_comp_tor.atom_id_2 +_chem_comp_tor.atom_id_3 +_chem_comp_tor.atom_id_4 +_chem_comp_tor.value_angle +_chem_comp_tor.value_angle_esd +_chem_comp_tor.period +OMU C2e-chi "O4'" "C1'" N1 C2 210.000 10.000 6 +OMU C2e-nyu0 "C4'" "O4'" "C1'" "C2" 340.700 6.300 1 +OMU C2e-nyu1 "O4'" "C1'" "C2'" "C3'" 32.800 4.900 1 +OMU C2e-nyu2 "C1'" "C2'" "C3'" "C4'" 326.9 3.600 1 +OMU C2e-nyu3 "C2'" "C3'" "C4'" "O4'" 22.600 4.500 1 +OMU C2e-nyu4 "C3'" "C4'" "O4'" "C1'" 357.700 6.100 1 +OMU C3e-chi "O4'" "C1'" N1 C2 210.000 10.000 6 +OMU C3e-nyu0 "C4'" "O4'" "C1'" "C2'" 2.8 6.100 1 +OMU C3e-nyu1 "O4'" "C1'" "C2'" "C3'" 335.00 4.900 1 +OMU C3e-nyu2 "C1'" "C2'" "C3'" "C4'" 35.9 2.800 1 +OMU C3e-nyu3 "C2'" "C3'" "C4'" "O4'" 324.700 3.100 1 +OMU C3e-nyu4 "C3'" "C4'" "O4'" "C1'" 20.500 5.100 1 +OMU alpha "C5'" "O5'" P OP3 -60.000 10.00 3 +OMU beta P "O5'" "C5'" "C4'" 180.000 10.00 3 +OMU epsi "C4'" "C3'" "O3'" "HO3'" 180.000 10.00 3 +OMU gamma "O5'" "C5'" "C4'" "C3'" 180.000 10.00 3 +OMU const_sp2_sp2_3 O2 C2 N1 C6 180.000 5.0 2 +OMU const_21 C5 C6 N1 C2 0.000 10.0 2 +OMU sp3_sp3_37 HM21 CM2 "O2'" "C2'" 180.000 10.0 3 +OMU const_sp2_sp2_7 O2 C2 N3 C4 180.000 5.0 2 +OMU const_11 O4 C4 N3 C2 180.000 10.0 2 +OMU const_15 O4 C4 C5 C6 180.000 10.0 2 +OMU const_17 C4 C5 C6 N1 0.000 10.0 2 +OMU sp3_sp3_34 "C1'" "C2'" "O2'" CM2 180.000 10.0 3 + +loop_ +_chem_comp_chir.comp_id +_chem_comp_chir.id +_chem_comp_chir.atom_id_centre +_chem_comp_chir.atom_id_1 +_chem_comp_chir.atom_id_2 +_chem_comp_chir.atom_id_3 +_chem_comp_chir.volume_sign +OMU chir_1 "C1'" "O4'" N1 "C2'" negative +OMU chir_2 "C2'" "O2'" "C1'" "C3'" negative +OMU chir_3 "C3'" "O3'" "C2'" "C4'" negative +OMU chir_4 "C4'" "O4'" "C3'" "C5'" negative +OMU chir_5 P "O5'" OP2 OP3 both + +loop_ +_chem_comp_plane_atom.comp_id +_chem_comp_plane_atom.plane_id +_chem_comp_plane_atom.atom_id +_chem_comp_plane_atom.dist_esd +OMU plan-1 "C1'" 0.020 +OMU plan-1 C2 0.020 +OMU plan-1 C4 0.020 +OMU plan-1 C5 0.020 +OMU plan-1 C6 0.020 +OMU plan-1 H5 0.020 +OMU plan-1 H6 0.020 +OMU plan-1 HN3 0.020 +OMU plan-1 N1 0.020 +OMU plan-1 N3 0.020 +OMU plan-1 O2 0.020 +OMU plan-1 O4 0.020 + +loop_ +_pdbx_chem_comp_descriptor.comp_id +_pdbx_chem_comp_descriptor.type +_pdbx_chem_comp_descriptor.program +_pdbx_chem_comp_descriptor.program_version +_pdbx_chem_comp_descriptor.descriptor +OMU SMILES ACDLabs 10.04 O=C1NC(=O)N(C=C1)C2OC(C(O)C2OC)COP(=O)(O)O +OMU SMILES_CANONICAL CACTVS 3.341 CO[C@@H]1[C@H](O)[C@@H](CO[P](O)(O)=O)O[C@H]1N2C=CC(=O)NC2=O +OMU SMILES CACTVS 3.341 CO[CH]1[CH](O)[CH](CO[P](O)(O)=O)O[CH]1N2C=CC(=O)NC2=O +OMU SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 CO[C@@H]1[C@@H]([C@H](O[C@H]1N2C=CC(=O)NC2=O)COP(=O)(O)O)O +OMU SMILES "OpenEye OEToolkits" 1.5.0 COC1C(C(OC1N2C=CC(=O)NC2=O)COP(=O)(O)O)O +OMU InChI InChI 1.03 InChI=1S/C10H15N2O9P/c1-19-8-7(14)5(4-20-22(16,17)18)21-9(8)12-3-2-6(13)11-10(12)15/h2-3,5,7-9,14H,4H2,1H3,(H,11,13,15)(H2,16,17,18)/t5-,7-,8-,9-/m1/s1 +OMU InChIKey InChI 1.03 FHMMECZNEPGJSJ-ZOQUXTDFSA-N + +loop_ +_pdbx_chem_comp_description_generator.comp_id +_pdbx_chem_comp_description_generator.program_name +_pdbx_chem_comp_description_generator.program_version +_pdbx_chem_comp_description_generator.descriptor +OMU acedrg 243 "dictionary generator" +OMU acedrg_database 11 "data source" +OMU rdkit 2017.03.2 "Chemoinformatics tool" +OMU refmac5 5.8.0238 "optimization tool" diff --git a/image_analysis/structure_refinement/monomers/OXY.cif b/image_analysis/structure_refinement/monomers/OXY.cif new file mode 100644 index 000000000..2bc6ecfc7 --- /dev/null +++ b/image_analysis/structure_refinement/monomers/OXY.cif @@ -0,0 +1,57 @@ +# +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +OXY OXY "OXYGEN MOLECULE" NON-POLYMER 2 2 . +# +data_comp_OXY +# +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +OXY O1 O O 0 27.236 26.922 33.744 +OXY O2 O O 0 26.684 27.385 32.771 +loop_ +_chem_comp_bond.comp_id +_chem_comp_bond.atom_id_1 +_chem_comp_bond.atom_id_2 +_chem_comp_bond.type +_chem_comp_bond.aromatic +_chem_comp_bond.value_dist_nucleus +_chem_comp_bond.value_dist_nucleus_esd +_chem_comp_bond.value_dist +_chem_comp_bond.value_dist_esd +OXY O1 O2 DOUBLE n 1.210 0.0200 1.210 0.0200 +loop_ +_pdbx_chem_comp_descriptor.comp_id +_pdbx_chem_comp_descriptor.type +_pdbx_chem_comp_descriptor.program +_pdbx_chem_comp_descriptor.program_version +_pdbx_chem_comp_descriptor.descriptor +OXY SMILES_CANONICAL CACTVS 3.341 O=O +OXY SMILES CACTVS 3.341 O=O +OXY SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 O=O +OXY SMILES "OpenEye OEToolkits" 1.5.0 O=O +OXY InChI InChI 1.03 InChI=1S/O2/c1-2 +OXY InChIKey InChI 1.03 MYMOFIZGZYHOMD-UHFFFAOYSA-N +loop_ +_pdbx_chem_comp_description_generator.comp_id +_pdbx_chem_comp_description_generator.program_name +_pdbx_chem_comp_description_generator.program_version +_pdbx_chem_comp_description_generator.descriptor +OXY acedrg 243 "dictionary generator" +OXY acedrg_database 11 "data source" +OXY rdkit 2017.03.2 "Chemoinformatics tool" +OXY refmac5 5.8.0238 "optimization tool" diff --git a/image_analysis/structure_refinement/monomers/PEG.cif b/image_analysis/structure_refinement/monomers/PEG.cif new file mode 100644 index 000000000..08009cba8 --- /dev/null +++ b/image_analysis/structure_refinement/monomers/PEG.cif @@ -0,0 +1,138 @@ +# +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +PEG PEG DI(HYDROXYETHYL)ETHER NON-POLYMER 17 7 . +# +data_comp_PEG +# +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +PEG C1 C CH2 0 41.561 37.152 47.063 +PEG O1 O OH1 0 41.065 36.188 46.155 +PEG C2 C CH2 0 42.802 36.690 47.759 +PEG O2 O O2 0 42.505 35.564 48.578 +PEG C3 C CH2 0 43.645 35.062 49.268 +PEG C4 C CH2 0 43.253 33.888 50.109 +PEG O4 O OH1 0 44.370 33.256 50.702 +PEG H11 H H 0 40.870 37.346 47.731 +PEG H12 H H 0 41.754 37.980 46.576 +PEG HO1 H H 0 40.396 36.506 45.747 +PEG H21 H H 0 43.160 37.417 48.314 +PEG H22 H H 0 43.482 36.446 47.095 +PEG H31 H H 0 44.023 35.766 49.839 +PEG H32 H H 0 44.330 34.791 48.620 +PEG H41 H H 0 42.777 33.237 49.552 +PEG H42 H H 0 42.643 34.187 50.815 +PEG HO4 H H 0 44.736 33.789 51.248 +loop_ +_chem_comp_bond.comp_id +_chem_comp_bond.atom_id_1 +_chem_comp_bond.atom_id_2 +_chem_comp_bond.type +_chem_comp_bond.aromatic +_chem_comp_bond.value_dist_nucleus +_chem_comp_bond.value_dist_nucleus_esd +_chem_comp_bond.value_dist +_chem_comp_bond.value_dist_esd +PEG C1 O1 SINGLE n 1.414 0.0200 1.414 0.0200 +PEG C1 C2 SINGLE n 1.496 0.0200 1.496 0.0200 +PEG C2 O2 SINGLE n 1.423 0.0106 1.423 0.0106 +PEG O2 C3 SINGLE n 1.423 0.0106 1.423 0.0106 +PEG C3 C4 SINGLE n 1.496 0.0200 1.496 0.0200 +PEG C4 O4 SINGLE n 1.414 0.0200 1.414 0.0200 +PEG C1 H11 SINGLE n 1.089 0.0100 0.980 0.0144 +PEG C1 H12 SINGLE n 1.089 0.0100 0.980 0.0144 +PEG O1 HO1 SINGLE n 0.970 0.0120 0.846 0.0200 +PEG C2 H21 SINGLE n 1.089 0.0100 0.982 0.0175 +PEG C2 H22 SINGLE n 1.089 0.0100 0.982 0.0175 +PEG C3 H31 SINGLE n 1.089 0.0100 0.982 0.0175 +PEG C3 H32 SINGLE n 1.089 0.0100 0.982 0.0175 +PEG C4 H41 SINGLE n 1.089 0.0100 0.980 0.0144 +PEG C4 H42 SINGLE n 1.089 0.0100 0.980 0.0144 +PEG O4 HO4 SINGLE n 0.970 0.0120 0.846 0.0200 +loop_ +_chem_comp_angle.comp_id +_chem_comp_angle.atom_id_1 +_chem_comp_angle.atom_id_2 +_chem_comp_angle.atom_id_3 +_chem_comp_angle.value_angle +_chem_comp_angle.value_angle_esd +PEG O1 C1 C2 112.284 1.56 +PEG O1 C1 H11 109.012 1.50 +PEG O1 C1 H12 109.012 1.50 +PEG C2 C1 H11 109.198 1.50 +PEG C2 C1 H12 109.198 1.50 +PEG H11 C1 H12 108.093 1.50 +PEG C1 O1 HO1 109.347 1.86 +PEG C1 C2 O2 109.904 1.68 +PEG C1 C2 H21 109.795 1.50 +PEG C1 C2 H22 109.795 1.50 +PEG O2 C2 H21 109.691 1.50 +PEG O2 C2 H22 109.691 1.50 +PEG H21 C2 H22 108.274 1.50 +PEG C2 O2 C3 112.795 1.50 +PEG O2 C3 C4 109.904 1.68 +PEG O2 C3 H31 109.691 1.50 +PEG O2 C3 H32 109.691 1.50 +PEG C4 C3 H31 109.795 1.50 +PEG C4 C3 H32 109.795 1.50 +PEG H31 C3 H32 108.274 1.50 +PEG C3 C4 O4 112.284 1.56 +PEG C3 C4 H41 109.198 1.50 +PEG C3 C4 H42 109.198 1.50 +PEG O4 C4 H41 109.012 1.50 +PEG O4 C4 H42 109.012 1.50 +PEG H41 C4 H42 108.093 1.50 +PEG C4 O4 HO4 109.347 1.86 +loop_ +_chem_comp_tor.comp_id +_chem_comp_tor.id +_chem_comp_tor.atom_id_1 +_chem_comp_tor.atom_id_2 +_chem_comp_tor.atom_id_3 +_chem_comp_tor.atom_id_4 +_chem_comp_tor.value_angle +_chem_comp_tor.value_angle_esd +_chem_comp_tor.period +PEG sp3_sp3_1 C2 C1 O1 HO1 180.000 10.0 3 +PEG sp3_sp3_4 O1 C1 C2 O2 180.000 10.0 3 +PEG sp3_sp3_13 C1 C2 O2 C3 180.000 10.0 3 +PEG sp3_sp3_16 C4 C3 O2 C2 180.000 10.0 3 +PEG sp3_sp3_19 O2 C3 C4 O4 180.000 10.0 3 +PEG sp3_sp3_28 C3 C4 O4 HO4 180.000 10.0 3 +loop_ +_pdbx_chem_comp_descriptor.comp_id +_pdbx_chem_comp_descriptor.type +_pdbx_chem_comp_descriptor.program +_pdbx_chem_comp_descriptor.program_version +_pdbx_chem_comp_descriptor.descriptor +PEG SMILES ACDLabs 12.01 OCCOCCO +PEG InChI InChI 1.03 InChI=1S/C4H10O3/c5-1-3-7-4-2-6/h5-6H,1-4H2 +PEG InChIKey InChI 1.03 MTHSVFCYNBDYFN-UHFFFAOYSA-N +PEG SMILES_CANONICAL CACTVS 3.370 OCCOCCO +PEG SMILES CACTVS 3.370 OCCOCCO +PEG SMILES_CANONICAL "OpenEye OEToolkits" 1.7.6 C(COCCO)O +PEG SMILES "OpenEye OEToolkits" 1.7.6 C(COCCO)O +loop_ +_pdbx_chem_comp_description_generator.comp_id +_pdbx_chem_comp_description_generator.program_name +_pdbx_chem_comp_description_generator.program_version +_pdbx_chem_comp_description_generator.descriptor +PEG acedrg 243 "dictionary generator" +PEG acedrg_database 11 "data source" +PEG rdkit 2017.03.2 "Chemoinformatics tool" +PEG refmac5 5.8.0238 "optimization tool" diff --git a/image_analysis/structure_refinement/monomers/PG4.cif b/image_analysis/structure_refinement/monomers/PG4.cif new file mode 100644 index 000000000..77efd2c07 --- /dev/null +++ b/image_analysis/structure_refinement/monomers/PG4.cif @@ -0,0 +1,198 @@ +# +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +PG4 PG4 "TETRAETHYLENE GLYCOL" NON-POLYMER 31 13 . +# +data_comp_PG4 +# +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +PG4 O1 O OH1 0 -3.161 60.725 73.637 +PG4 C1 C CH2 0 -2.073 60.164 74.345 +PG4 C2 C CH2 0 -1.379 59.093 73.563 +PG4 O2 O O2 0 -0.854 59.637 72.355 +PG4 C3 C CH2 0 0.478 60.128 72.474 +PG4 C4 C CH2 0 0.861 60.848 71.220 +PG4 O3 O O2 0 2.240 61.204 71.277 +PG4 C5 C CH2 0 2.663 62.051 70.212 +PG4 C6 C CH2 0 2.490 63.484 70.609 +PG4 O4 O O2 0 2.911 64.332 69.543 +PG4 C7 C CH2 0 4.287 64.696 69.603 +PG4 C8 C CH2 0 4.670 65.446 68.364 +PG4 O5 O OH1 0 3.831 66.560 68.126 +PG4 HO1 H H 0 -3.573 61.267 74.139 +PG4 H11 H H 0 -2.401 59.786 75.187 +PG4 H12 H H 0 -1.432 60.874 74.560 +PG4 H21 H H 0 -2.017 58.377 73.349 +PG4 H22 H H 0 -0.655 58.704 74.102 +PG4 H31 H H 0 1.095 59.379 72.627 +PG4 H32 H H 0 0.541 60.741 73.239 +PG4 H41 H H 0 0.311 61.656 71.122 +PG4 H42 H H 0 0.699 60.270 70.443 +PG4 H51 H H 0 2.138 61.866 69.401 +PG4 H52 H H 0 3.608 61.877 70.010 +PG4 H61 H H 0 3.016 63.670 71.419 +PG4 H62 H H 0 1.546 63.659 70.813 +PG4 H71 H H 0 4.841 63.889 69.685 +PG4 H72 H H 0 4.447 65.258 70.392 +PG4 H81 H H 0 4.623 64.841 67.594 +PG4 H82 H H 0 5.596 65.757 68.450 +PG4 HO5 H H 0 3.919 67.118 68.756 +loop_ +_chem_comp_bond.comp_id +_chem_comp_bond.atom_id_1 +_chem_comp_bond.atom_id_2 +_chem_comp_bond.type +_chem_comp_bond.aromatic +_chem_comp_bond.value_dist_nucleus +_chem_comp_bond.value_dist_nucleus_esd +_chem_comp_bond.value_dist +_chem_comp_bond.value_dist_esd +PG4 O1 C1 SINGLE n 1.414 0.0200 1.414 0.0200 +PG4 C1 C2 SINGLE n 1.496 0.0200 1.496 0.0200 +PG4 C2 O2 SINGLE n 1.423 0.0106 1.423 0.0106 +PG4 O2 C3 SINGLE n 1.423 0.0106 1.423 0.0106 +PG4 C3 C4 SINGLE n 1.496 0.0200 1.496 0.0200 +PG4 C4 O3 SINGLE n 1.423 0.0106 1.423 0.0106 +PG4 O3 C5 SINGLE n 1.423 0.0106 1.423 0.0106 +PG4 C5 C6 SINGLE n 1.496 0.0200 1.496 0.0200 +PG4 C6 O4 SINGLE n 1.423 0.0106 1.423 0.0106 +PG4 O4 C7 SINGLE n 1.423 0.0106 1.423 0.0106 +PG4 C7 C8 SINGLE n 1.496 0.0200 1.496 0.0200 +PG4 C8 O5 SINGLE n 1.414 0.0200 1.414 0.0200 +PG4 O1 HO1 SINGLE n 0.970 0.0120 0.846 0.0200 +PG4 C1 H11 SINGLE n 1.089 0.0100 0.980 0.0144 +PG4 C1 H12 SINGLE n 1.089 0.0100 0.980 0.0144 +PG4 C2 H21 SINGLE n 1.089 0.0100 0.982 0.0175 +PG4 C2 H22 SINGLE n 1.089 0.0100 0.982 0.0175 +PG4 C3 H31 SINGLE n 1.089 0.0100 0.982 0.0175 +PG4 C3 H32 SINGLE n 1.089 0.0100 0.982 0.0175 +PG4 C4 H41 SINGLE n 1.089 0.0100 0.982 0.0175 +PG4 C4 H42 SINGLE n 1.089 0.0100 0.982 0.0175 +PG4 C5 H51 SINGLE n 1.089 0.0100 0.982 0.0175 +PG4 C5 H52 SINGLE n 1.089 0.0100 0.982 0.0175 +PG4 C6 H61 SINGLE n 1.089 0.0100 0.982 0.0175 +PG4 C6 H62 SINGLE n 1.089 0.0100 0.982 0.0175 +PG4 C7 H71 SINGLE n 1.089 0.0100 0.982 0.0175 +PG4 C7 H72 SINGLE n 1.089 0.0100 0.982 0.0175 +PG4 C8 H81 SINGLE n 1.089 0.0100 0.980 0.0144 +PG4 C8 H82 SINGLE n 1.089 0.0100 0.980 0.0144 +PG4 O5 HO5 SINGLE n 0.970 0.0120 0.846 0.0200 +loop_ +_chem_comp_angle.comp_id +_chem_comp_angle.atom_id_1 +_chem_comp_angle.atom_id_2 +_chem_comp_angle.atom_id_3 +_chem_comp_angle.value_angle +_chem_comp_angle.value_angle_esd +PG4 C1 O1 HO1 109.347 1.86 +PG4 O1 C1 C2 112.284 1.56 +PG4 O1 C1 H11 109.012 1.50 +PG4 O1 C1 H12 109.012 1.50 +PG4 C2 C1 H11 109.198 1.50 +PG4 C2 C1 H12 109.198 1.50 +PG4 H11 C1 H12 108.093 1.50 +PG4 C1 C2 O2 109.904 1.68 +PG4 C1 C2 H21 109.795 1.50 +PG4 C1 C2 H22 109.795 1.50 +PG4 O2 C2 H21 109.691 1.50 +PG4 O2 C2 H22 109.691 1.50 +PG4 H21 C2 H22 108.274 1.50 +PG4 C2 O2 C3 112.795 1.50 +PG4 O2 C3 C4 109.613 1.74 +PG4 O2 C3 H31 109.691 1.50 +PG4 O2 C3 H32 109.691 1.50 +PG4 C4 C3 H31 109.729 1.50 +PG4 C4 C3 H32 109.729 1.50 +PG4 H31 C3 H32 108.274 1.50 +PG4 C3 C4 O3 109.613 1.74 +PG4 C3 C4 H41 109.729 1.50 +PG4 C3 C4 H42 109.729 1.50 +PG4 O3 C4 H41 109.691 1.50 +PG4 O3 C4 H42 109.691 1.50 +PG4 H41 C4 H42 108.274 1.50 +PG4 C4 O3 C5 112.795 1.50 +PG4 O3 C5 C6 109.613 1.74 +PG4 O3 C5 H51 109.691 1.50 +PG4 O3 C5 H52 109.691 1.50 +PG4 C6 C5 H51 109.729 1.50 +PG4 C6 C5 H52 109.729 1.50 +PG4 H51 C5 H52 108.274 1.50 +PG4 C5 C6 O4 109.613 1.74 +PG4 C5 C6 H61 109.729 1.50 +PG4 C5 C6 H62 109.729 1.50 +PG4 O4 C6 H61 109.691 1.50 +PG4 O4 C6 H62 109.691 1.50 +PG4 H61 C6 H62 108.274 1.50 +PG4 C6 O4 C7 112.795 1.50 +PG4 O4 C7 C8 109.904 1.68 +PG4 O4 C7 H71 109.691 1.50 +PG4 O4 C7 H72 109.691 1.50 +PG4 C8 C7 H71 109.795 1.50 +PG4 C8 C7 H72 109.795 1.50 +PG4 H71 C7 H72 108.274 1.50 +PG4 C7 C8 O5 112.284 1.56 +PG4 C7 C8 H81 109.198 1.50 +PG4 C7 C8 H82 109.198 1.50 +PG4 O5 C8 H81 109.012 1.50 +PG4 O5 C8 H82 109.012 1.50 +PG4 H81 C8 H82 108.093 1.50 +PG4 C8 O5 HO5 109.347 1.86 +loop_ +_chem_comp_tor.comp_id +_chem_comp_tor.id +_chem_comp_tor.atom_id_1 +_chem_comp_tor.atom_id_2 +_chem_comp_tor.atom_id_3 +_chem_comp_tor.atom_id_4 +_chem_comp_tor.value_angle +_chem_comp_tor.value_angle_esd +_chem_comp_tor.period +PG4 sp3_sp3_1 C2 C1 O1 HO1 180.000 10.0 3 +PG4 sp3_sp3_49 O4 C7 C8 O5 180.000 10.0 3 +PG4 sp3_sp3_58 C7 C8 O5 HO5 180.000 10.0 3 +PG4 sp3_sp3_4 O1 C1 C2 O2 180.000 10.0 3 +PG4 sp3_sp3_13 C1 C2 O2 C3 180.000 10.0 3 +PG4 sp3_sp3_16 C4 C3 O2 C2 180.000 10.0 3 +PG4 sp3_sp3_19 O2 C3 C4 O3 180.000 10.0 3 +PG4 sp3_sp3_28 C3 C4 O3 C5 180.000 10.0 3 +PG4 sp3_sp3_31 C6 C5 O3 C4 180.000 10.0 3 +PG4 sp3_sp3_34 O3 C5 C6 O4 180.000 10.0 3 +PG4 sp3_sp3_43 C5 C6 O4 C7 180.000 10.0 3 +PG4 sp3_sp3_46 C8 C7 O4 C6 180.000 10.0 3 +loop_ +_pdbx_chem_comp_descriptor.comp_id +_pdbx_chem_comp_descriptor.type +_pdbx_chem_comp_descriptor.program +_pdbx_chem_comp_descriptor.program_version +_pdbx_chem_comp_descriptor.descriptor +PG4 SMILES ACDLabs 10.04 OCCOCCOCCOCCO +PG4 SMILES_CANONICAL CACTVS 3.341 OCCOCCOCCOCCO +PG4 SMILES CACTVS 3.341 OCCOCCOCCOCCO +PG4 SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 C(COCCOCCOCCO)O +PG4 SMILES "OpenEye OEToolkits" 1.5.0 C(COCCOCCOCCO)O +PG4 InChI InChI 1.03 InChI=1S/C8H18O5/c9-1-3-11-5-7-13-8-6-12-4-2-10/h9-10H,1-8H2 +PG4 InChIKey InChI 1.03 UWHCKJMYHZGTIT-UHFFFAOYSA-N +loop_ +_pdbx_chem_comp_description_generator.comp_id +_pdbx_chem_comp_description_generator.program_name +_pdbx_chem_comp_description_generator.program_version +_pdbx_chem_comp_description_generator.descriptor +PG4 acedrg 243 "dictionary generator" +PG4 acedrg_database 11 "data source" +PG4 rdkit 2017.03.2 "Chemoinformatics tool" +PG4 refmac5 5.8.0238 "optimization tool" diff --git a/image_analysis/structure_refinement/monomers/PGE.cif b/image_analysis/structure_refinement/monomers/PGE.cif new file mode 100644 index 000000000..63666644b --- /dev/null +++ b/image_analysis/structure_refinement/monomers/PGE.cif @@ -0,0 +1,168 @@ +# +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +PGE PGE "TRIETHYLENE GLYCOL" NON-POLYMER 24 10 . +# +data_comp_PGE +# +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +PGE C1 C CH2 0 18.715 -18.946 34.930 +PGE O1 O OH1 0 18.098 -20.073 34.339 +PGE C2 C CH2 0 19.228 -19.237 36.305 +PGE O2 O O2 0 18.136 -19.500 37.182 +PGE C3 C CH2 0 18.527 -19.893 38.496 +PGE C4 C CH2 0 18.196 -21.337 38.706 +PGE O4 O OH1 0 19.209 -25.686 36.980 +PGE C6 C CH2 0 19.520 -24.306 36.972 +PGE C5 C CH2 0 18.689 -23.532 37.946 +PGE O3 O O2 0 18.956 -22.140 37.808 +PGE H1 H H 0 18.064 -18.215 34.977 +PGE H12 H H 0 19.459 -18.656 34.363 +PGE HO1 H H 0 17.842 -19.875 33.558 +PGE H2 H H 0 19.741 -18.468 36.636 +PGE H22 H H 0 19.826 -20.016 36.277 +PGE H3 H H 0 18.049 -19.347 39.157 +PGE H32 H H 0 19.492 -19.753 38.624 +PGE H4 H H 0 17.237 -21.483 38.551 +PGE H42 H H 0 18.400 -21.592 39.632 +PGE HO4 H H 0 19.421 -26.016 37.730 +PGE H6 H H 0 19.375 -23.952 36.071 +PGE H62 H H 0 20.468 -24.192 37.195 +PGE H5 H H 0 18.897 -23.819 38.861 +PGE H52 H H 0 17.737 -23.704 37.778 +loop_ +_chem_comp_bond.comp_id +_chem_comp_bond.atom_id_1 +_chem_comp_bond.atom_id_2 +_chem_comp_bond.type +_chem_comp_bond.aromatic +_chem_comp_bond.value_dist_nucleus +_chem_comp_bond.value_dist_nucleus_esd +_chem_comp_bond.value_dist +_chem_comp_bond.value_dist_esd +PGE C1 O1 SINGLE n 1.414 0.0200 1.414 0.0200 +PGE C1 C2 SINGLE n 1.496 0.0200 1.496 0.0200 +PGE C2 O2 SINGLE n 1.423 0.0106 1.423 0.0106 +PGE O2 C3 SINGLE n 1.423 0.0106 1.423 0.0106 +PGE C3 C4 SINGLE n 1.496 0.0200 1.496 0.0200 +PGE C4 O3 SINGLE n 1.423 0.0106 1.423 0.0106 +PGE O4 C6 SINGLE n 1.414 0.0200 1.414 0.0200 +PGE C6 C5 SINGLE n 1.496 0.0200 1.496 0.0200 +PGE C5 O3 SINGLE n 1.423 0.0106 1.423 0.0106 +PGE C1 H1 SINGLE n 1.089 0.0100 0.980 0.0144 +PGE C1 H12 SINGLE n 1.089 0.0100 0.980 0.0144 +PGE O1 HO1 SINGLE n 0.970 0.0120 0.846 0.0200 +PGE C2 H2 SINGLE n 1.089 0.0100 0.982 0.0175 +PGE C2 H22 SINGLE n 1.089 0.0100 0.982 0.0175 +PGE C3 H3 SINGLE n 1.089 0.0100 0.982 0.0175 +PGE C3 H32 SINGLE n 1.089 0.0100 0.982 0.0175 +PGE C4 H4 SINGLE n 1.089 0.0100 0.982 0.0175 +PGE C4 H42 SINGLE n 1.089 0.0100 0.982 0.0175 +PGE O4 HO4 SINGLE n 0.970 0.0120 0.846 0.0200 +PGE C6 H6 SINGLE n 1.089 0.0100 0.980 0.0144 +PGE C6 H62 SINGLE n 1.089 0.0100 0.980 0.0144 +PGE C5 H5 SINGLE n 1.089 0.0100 0.982 0.0175 +PGE C5 H52 SINGLE n 1.089 0.0100 0.982 0.0175 +loop_ +_chem_comp_angle.comp_id +_chem_comp_angle.atom_id_1 +_chem_comp_angle.atom_id_2 +_chem_comp_angle.atom_id_3 +_chem_comp_angle.value_angle +_chem_comp_angle.value_angle_esd +PGE O1 C1 C2 112.284 1.56 +PGE O1 C1 H1 109.012 1.50 +PGE O1 C1 H12 109.012 1.50 +PGE C2 C1 H1 109.198 1.50 +PGE C2 C1 H12 109.198 1.50 +PGE H1 C1 H12 108.093 1.50 +PGE C1 O1 HO1 109.347 1.86 +PGE C1 C2 O2 109.904 1.68 +PGE C1 C2 H2 109.795 1.50 +PGE C1 C2 H22 109.795 1.50 +PGE O2 C2 H2 109.691 1.50 +PGE O2 C2 H22 109.691 1.50 +PGE H2 C2 H22 108.274 1.50 +PGE C2 O2 C3 112.795 1.50 +PGE O2 C3 C4 109.613 1.74 +PGE O2 C3 H3 109.691 1.50 +PGE O2 C3 H32 109.691 1.50 +PGE C4 C3 H3 109.729 1.50 +PGE C4 C3 H32 109.729 1.50 +PGE H3 C3 H32 108.274 1.50 +PGE C3 C4 O3 109.613 1.74 +PGE C3 C4 H4 109.729 1.50 +PGE C3 C4 H42 109.729 1.50 +PGE O3 C4 H4 109.691 1.50 +PGE O3 C4 H42 109.691 1.50 +PGE H4 C4 H42 108.274 1.50 +PGE C6 O4 HO4 109.347 1.86 +PGE O4 C6 C5 112.284 1.56 +PGE O4 C6 H6 109.012 1.50 +PGE O4 C6 H62 109.012 1.50 +PGE C5 C6 H6 109.198 1.50 +PGE C5 C6 H62 109.198 1.50 +PGE H6 C6 H62 108.093 1.50 +PGE C6 C5 O3 109.904 1.68 +PGE C6 C5 H5 109.795 1.50 +PGE C6 C5 H52 109.795 1.50 +PGE O3 C5 H5 109.691 1.50 +PGE O3 C5 H52 109.691 1.50 +PGE H5 C5 H52 108.274 1.50 +PGE C4 O3 C5 112.795 1.50 +loop_ +_chem_comp_tor.comp_id +_chem_comp_tor.id +_chem_comp_tor.atom_id_1 +_chem_comp_tor.atom_id_2 +_chem_comp_tor.atom_id_3 +_chem_comp_tor.atom_id_4 +_chem_comp_tor.value_angle +_chem_comp_tor.value_angle_esd +_chem_comp_tor.period +PGE sp3_sp3_1 C2 C1 O1 HO1 180.000 10.0 3 +PGE sp3_sp3_4 O1 C1 C2 O2 180.000 10.0 3 +PGE sp3_sp3_13 C1 C2 O2 C3 180.000 10.0 3 +PGE sp3_sp3_16 C4 C3 O2 C2 180.000 10.0 3 +PGE sp3_sp3_19 O2 C3 C4 O3 180.000 10.0 3 +PGE sp3_sp3_28 C3 C4 O3 C5 180.000 10.0 3 +PGE sp3_sp3_31 C5 C6 O4 HO4 180.000 10.0 3 +PGE sp3_sp3_34 O3 C5 C6 O4 180.000 10.0 3 +PGE sp3_sp3_43 C6 C5 O3 C4 180.000 10.0 3 +loop_ +_pdbx_chem_comp_descriptor.comp_id +_pdbx_chem_comp_descriptor.type +_pdbx_chem_comp_descriptor.program +_pdbx_chem_comp_descriptor.program_version +_pdbx_chem_comp_descriptor.descriptor +PGE SMILES ACDLabs 10.04 OCCOCCOCCO +PGE SMILES_CANONICAL CACTVS 3.341 OCCOCCOCCO +PGE SMILES CACTVS 3.341 OCCOCCOCCO +PGE SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 C(COCCOCCO)O +PGE SMILES "OpenEye OEToolkits" 1.5.0 C(COCCOCCO)O +PGE InChI InChI 1.03 InChI=1S/C6H14O4/c7-1-3-9-5-6-10-4-2-8/h7-8H,1-6H2 +PGE InChIKey InChI 1.03 ZIBGPFATKBEMQZ-UHFFFAOYSA-N +loop_ +_pdbx_chem_comp_description_generator.comp_id +_pdbx_chem_comp_description_generator.program_name +_pdbx_chem_comp_description_generator.program_version +_pdbx_chem_comp_description_generator.descriptor +PGE acedrg 243 "dictionary generator" +PGE acedrg_database 11 "data source" +PGE rdkit 2017.03.2 "Chemoinformatics tool" +PGE refmac5 5.8.0238 "optimization tool" diff --git a/image_analysis/structure_refinement/monomers/PHE.cif b/image_analysis/structure_refinement/monomers/PHE.cif new file mode 100644 index 000000000..57e42ec86 --- /dev/null +++ b/image_analysis/structure_refinement/monomers/PHE.cif @@ -0,0 +1,261 @@ +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +PHE PHE PHENYLALANINE peptide 23 12 . + +data_comp_PHE +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +PHE N N NT3 1 3.215 22.308 6.140 +PHE CA C CH1 0 4.240 21.287 5.785 +PHE C C C 0 5.492 21.998 5.258 +PHE O O O 0 5.348 22.751 4.269 +PHE CB C CH2 0 3.652 20.304 4.767 +PHE CG C CR6 0 4.548 19.121 4.423 +PHE CD1 C CR16 0 4.526 17.959 5.195 +PHE CD2 C CR16 0 5.408 19.169 3.325 +PHE CE1 C CR16 0 5.344 16.878 4.879 +PHE CE2 C CR16 0 6.225 18.087 3.012 +PHE CZ C CR16 0 6.192 16.943 3.789 +PHE OXT O OC -1 6.569 21.775 5.853 +PHE H H H 0 2.984 22.781 5.407 +PHE H2 H H 0 3.541 22.872 6.764 +PHE H3 H H 0 2.480 21.902 6.470 +PHE HA H H 0 4.482 20.785 6.608 +PHE HB3 H H 0 3.450 20.797 3.941 +PHE HB2 H H 0 2.802 19.961 5.122 +PHE HD1 H H 0 3.950 17.907 5.941 +PHE HD2 H H 0 5.437 19.946 2.791 +PHE HE1 H H 0 5.320 16.099 5.411 +PHE HE2 H H 0 6.803 18.134 2.267 +PHE HZ H H 0 6.746 16.210 3.575 + +loop_ +_chem_comp_tree.comp_id +_chem_comp_tree.atom_id +_chem_comp_tree.atom_back +_chem_comp_tree.atom_forward +_chem_comp_tree.connect_type +PHE N n/a CA START +PHE H N . . +PHE H2 N . . +PHE H3 N . . +PHE CA N C . +PHE HA CA . . +PHE CB CA CG . +PHE HB3 CB . . +PHE HB2 CB . . +PHE CG CB CD1 . +PHE CD1 CG CE1 . +PHE HD1 CD1 . . +PHE CE1 CD1 CZ . +PHE HE1 CE1 . . +PHE CZ CE1 CE2 . +PHE HZ CZ . . +PHE CE2 CZ CD2 . +PHE HE2 CE2 . . +PHE CD2 CE2 HD2 . +PHE HD2 CD2 . . +PHE C CA . END +PHE O C . . +PHE OXT C . . +PHE CD2 CG . ADD + +loop_ +_chem_comp_acedrg.comp_id +_chem_comp_acedrg.atom_id +_chem_comp_acedrg.atom_type +PHE N N(CCCH)(H)3 +PHE CA C(CC[6a]HH)(NH3)(COO)(H) +PHE C C(CCHN)(O)2 +PHE O O(CCO) +PHE CB C(C[6a]C[6a]2)(CCHN)(H)2 +PHE CG C[6a](C[6a]C[6a]H)2(CCHH){1|C<3>,2|H<1>} +PHE CD1 C[6a](C[6a]C[6a]C)(C[6a]C[6a]H)(H){1|C<3>,2|H<1>} +PHE CD2 C[6a](C[6a]C[6a]C)(C[6a]C[6a]H)(H){1|C<3>,2|H<1>} +PHE CE1 C[6a](C[6a]C[6a]H)2(H){1|C<3>,1|C<4>,1|H<1>} +PHE CE2 C[6a](C[6a]C[6a]H)2(H){1|C<3>,1|C<4>,1|H<1>} +PHE CZ C[6a](C[6a]C[6a]H)2(H){1|C<3>,2|H<1>} +PHE OXT O(CCO) +PHE H H(NCHH) +PHE H2 H(NCHH) +PHE H3 H(NCHH) +PHE HA H(CCCN) +PHE HB3 H(CC[6a]CH) +PHE HB2 H(CC[6a]CH) +PHE HD1 H(C[6a]C[6a]2) +PHE HD2 H(C[6a]C[6a]2) +PHE HE1 H(C[6a]C[6a]2) +PHE HE2 H(C[6a]C[6a]2) +PHE HZ H(C[6a]C[6a]2) + +loop_ +_chem_comp_bond.comp_id +_chem_comp_bond.atom_id_1 +_chem_comp_bond.atom_id_2 +_chem_comp_bond.type +_chem_comp_bond.aromatic +_chem_comp_bond.value_dist_nucleus +_chem_comp_bond.value_dist_nucleus_esd +_chem_comp_bond.value_dist +_chem_comp_bond.value_dist_esd +PHE N CA SINGLE n 1.489 0.0100 1.489 0.0100 +PHE CA C SINGLE n 1.531 0.0171 1.531 0.0171 +PHE CA CB SINGLE n 1.532 0.0100 1.532 0.0100 +PHE C O DOUBLE n 1.251 0.0183 1.251 0.0183 +PHE C OXT SINGLE n 1.251 0.0183 1.251 0.0183 +PHE CB CG SINGLE n 1.523 0.0100 1.523 0.0100 +PHE CG CD1 DOUBLE y 1.390 0.0116 1.390 0.0116 +PHE CG CD2 SINGLE y 1.390 0.0116 1.390 0.0116 +PHE CD1 CE1 SINGLE y 1.386 0.0131 1.386 0.0131 +PHE CD2 CE2 DOUBLE y 1.386 0.0131 1.386 0.0131 +PHE CE1 CZ DOUBLE y 1.376 0.0151 1.376 0.0151 +PHE CE2 CZ SINGLE y 1.376 0.0151 1.376 0.0151 +PHE N H SINGLE n 1.018 0.0520 0.902 0.0102 +PHE N H2 SINGLE n 1.018 0.0520 0.902 0.0102 +PHE N H3 SINGLE n 1.018 0.0520 0.902 0.0102 +PHE CA HA SINGLE n 1.092 0.0100 0.994 0.0200 +PHE CB HB3 SINGLE n 1.092 0.0100 0.983 0.0163 +PHE CB HB2 SINGLE n 1.092 0.0100 0.983 0.0163 +PHE CD1 HD1 SINGLE n 1.085 0.0150 0.944 0.0143 +PHE CD2 HD2 SINGLE n 1.085 0.0150 0.944 0.0143 +PHE CE1 HE1 SINGLE n 1.085 0.0150 0.944 0.0180 +PHE CE2 HE2 SINGLE n 1.085 0.0150 0.944 0.0180 +PHE CZ HZ SINGLE n 1.085 0.0150 0.944 0.0170 + +loop_ +_chem_comp_angle.comp_id +_chem_comp_angle.atom_id_1 +_chem_comp_angle.atom_id_2 +_chem_comp_angle.atom_id_3 +_chem_comp_angle.value_angle +_chem_comp_angle.value_angle_esd +PHE CA N H 109.791 3.00 +PHE CA N H2 109.791 3.00 +PHE CA N H3 109.791 3.00 +PHE H N H2 109.032 3.00 +PHE H N H3 109.032 3.00 +PHE H2 N H3 109.032 3.00 +PHE N CA C 109.085 1.50 +PHE N CA CB 109.965 3.00 +PHE N CA HA 108.547 1.50 +PHE C CA CB 111.980 3.00 +PHE C CA HA 108.746 1.50 +PHE CB CA HA 108.686 1.50 +PHE CA C O 117.219 3.00 +PHE CA C OXT 117.219 3.00 +PHE O C OXT 125.562 1.50 +PHE CA CB CG 114.693 2.05 +PHE CA CB HB3 108.494 1.50 +PHE CA CB HB2 108.494 1.50 +PHE CG CB HB3 108.859 1.50 +PHE CG CB HB2 108.859 1.50 +PHE HB3 CB HB2 107.843 2.16 +PHE CB CG CD1 120.965 1.50 +PHE CB CG CD2 120.965 1.50 +PHE CD1 CG CD2 118.071 1.50 +PHE CG CD1 CE1 120.673 1.50 +PHE CG CD1 HD1 119.564 1.50 +PHE CE1 CD1 HD1 119.763 1.50 +PHE CG CD2 CE2 120.673 1.50 +PHE CG CD2 HD2 119.564 1.50 +PHE CE2 CD2 HD2 119.763 1.50 +PHE CD1 CE1 CZ 120.297 1.50 +PHE CD1 CE1 HE1 119.796 1.50 +PHE CZ CE1 HE1 119.907 1.50 +PHE CD2 CE2 CZ 120.297 1.50 +PHE CD2 CE2 HE2 119.796 1.50 +PHE CZ CE2 HE2 119.907 1.50 +PHE CE1 CZ CE2 119.995 1.50 +PHE CE1 CZ HZ 120.000 1.50 +PHE CE2 CZ HZ 120.000 1.50 + +loop_ +_chem_comp_tor.comp_id +_chem_comp_tor.id +_chem_comp_tor.atom_id_1 +_chem_comp_tor.atom_id_2 +_chem_comp_tor.atom_id_3 +_chem_comp_tor.atom_id_4 +_chem_comp_tor.value_angle +_chem_comp_tor.value_angle_esd +_chem_comp_tor.period +PHE chi1 N CA CB CG -60.000 10.0 3 +PHE chi2 CA CB CG CD1 90.000 10.0 6 +PHE CONST_1 CB CG CD1 CE1 0.000 0.0 1 +PHE CONST_2 CG CD1 CE1 CZ 0.000 0.0 1 +PHE CONST_3 CZ CE2 CD2 CG 0.000 0.0 1 +PHE CONST_4 CD1 CE1 CZ CE2 0.000 0.0 1 +PHE CONST_5 CE1 CZ CE2 CD2 0.000 0.0 1 +PHE sp3_sp3_1 C CA N H 180.000 10.0 3 +PHE const_21 CE2 CD2 CG CD1 0.000 0.0 1 +PHE sp2_sp3_1 O C CA N 0.000 10.0 6 + +loop_ +_chem_comp_chir.comp_id +_chem_comp_chir.id +_chem_comp_chir.atom_id_centre +_chem_comp_chir.atom_id_1 +_chem_comp_chir.atom_id_2 +_chem_comp_chir.atom_id_3 +_chem_comp_chir.volume_sign +PHE chir_1 CA N C CB positive + +loop_ +_chem_comp_plane_atom.comp_id +_chem_comp_plane_atom.plane_id +_chem_comp_plane_atom.atom_id +_chem_comp_plane_atom.dist_esd +PHE plan-1 CB 0.020 +PHE plan-1 CD1 0.020 +PHE plan-1 CD2 0.020 +PHE plan-1 CE1 0.020 +PHE plan-1 CE2 0.020 +PHE plan-1 CG 0.020 +PHE plan-1 CZ 0.020 +PHE plan-1 HD1 0.020 +PHE plan-1 HD2 0.020 +PHE plan-1 HE1 0.020 +PHE plan-1 HE2 0.020 +PHE plan-1 HZ 0.020 +PHE plan-2 C 0.020 +PHE plan-2 CA 0.020 +PHE plan-2 O 0.020 +PHE plan-2 OXT 0.020 + +loop_ +_pdbx_chem_comp_descriptor.comp_id +_pdbx_chem_comp_descriptor.type +_pdbx_chem_comp_descriptor.program +_pdbx_chem_comp_descriptor.program_version +_pdbx_chem_comp_descriptor.descriptor +PHE SMILES ACDLabs 10.04 O=C(O)C(N)Cc1ccccc1 +PHE SMILES_CANONICAL CACTVS 3.341 N[C@@H](Cc1ccccc1)C(O)=O +PHE SMILES CACTVS 3.341 N[CH](Cc1ccccc1)C(O)=O +PHE SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 c1ccc(cc1)C[C@@H](C(=O)O)N +PHE SMILES "OpenEye OEToolkits" 1.5.0 c1ccc(cc1)CC(C(=O)O)N +PHE InChI InChI 1.03 InChI=1S/C9H11NO2/c10-8(9(11)12)6-7-4-2-1-3-5-7/h1-5,8H,6,10H2,(H,11,12)/t8-/m0/s1 +PHE InChIKey InChI 1.03 COLNVLDHVKWLRT-QMMMGPOBSA-N + +loop_ +_pdbx_chem_comp_description_generator.comp_id +_pdbx_chem_comp_description_generator.program_name +_pdbx_chem_comp_description_generator.program_version +_pdbx_chem_comp_description_generator.descriptor +PHE acedrg 278 "dictionary generator" +PHE acedrg_database 12 "data source" +PHE rdkit 2019.09.1 "Chemoinformatics tool" +PHE refmac5 5.8.0419 "optimization tool" diff --git a/image_analysis/structure_refinement/monomers/PO4.cif b/image_analysis/structure_refinement/monomers/PO4.cif new file mode 100644 index 000000000..6c80df723 --- /dev/null +++ b/image_analysis/structure_refinement/monomers/PO4.cif @@ -0,0 +1,86 @@ +# +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +PO4 PO4 "PHOSPHATE ION" NON-POLYMER 5 5 . +# +data_comp_PO4 +# +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +PO4 P P P 0 29.978 23.532 13.276 +PO4 O1 O O 0 31.126 22.989 14.118 +PO4 O2 O OP -1 30.372 24.882 12.690 +PO4 O3 O OP -1 29.672 22.557 12.145 +PO4 O4 O OP -1 28.741 23.699 14.151 +loop_ +_chem_comp_bond.comp_id +_chem_comp_bond.atom_id_1 +_chem_comp_bond.atom_id_2 +_chem_comp_bond.type +_chem_comp_bond.aromatic +_chem_comp_bond.value_dist_nucleus +_chem_comp_bond.value_dist_nucleus_esd +_chem_comp_bond.value_dist +_chem_comp_bond.value_dist_esd +PO4 P O1 DOUBLE n 1.524 0.0200 1.524 0.0200 +PO4 P O2 SINGLE n 1.524 0.0200 1.524 0.0200 +PO4 P O3 SINGLE n 1.524 0.0200 1.524 0.0200 +PO4 P O4 SINGLE n 1.524 0.0200 1.524 0.0200 +loop_ +_chem_comp_angle.comp_id +_chem_comp_angle.atom_id_1 +_chem_comp_angle.atom_id_2 +_chem_comp_angle.atom_id_3 +_chem_comp_angle.value_angle +_chem_comp_angle.value_angle_esd +PO4 O1 P O2 109.461 1.50 +PO4 O1 P O3 109.461 1.50 +PO4 O1 P O4 109.461 1.50 +PO4 O2 P O3 109.461 1.50 +PO4 O2 P O4 109.461 1.50 +PO4 O3 P O4 109.461 1.50 +loop_ +_chem_comp_chir.comp_id +_chem_comp_chir.id +_chem_comp_chir.atom_id_centre +_chem_comp_chir.atom_id_1 +_chem_comp_chir.atom_id_2 +_chem_comp_chir.atom_id_3 +_chem_comp_chir.volume_sign +PO4 chir_1 P O2 O3 O4 both +loop_ +_pdbx_chem_comp_descriptor.comp_id +_pdbx_chem_comp_descriptor.type +_pdbx_chem_comp_descriptor.program +_pdbx_chem_comp_descriptor.program_version +_pdbx_chem_comp_descriptor.descriptor +PO4 SMILES ACDLabs 10.04 "[O-]P([O-])([O-])=O" +PO4 SMILES_CANONICAL CACTVS 3.341 "[O-][P]([O-])([O-])=O" +PO4 SMILES CACTVS 3.341 "[O-][P]([O-])([O-])=O" +PO4 SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 "[O-]P(=O)([O-])[O-]" +PO4 SMILES "OpenEye OEToolkits" 1.5.0 "[O-]P(=O)([O-])[O-]" +PO4 InChI InChI 1.03 InChI=1S/H3O4P/c1-5(2,3)4/h(H3,1,2,3,4)/p-3 +PO4 InChIKey InChI 1.03 NBIIXXVUZAFLBC-UHFFFAOYSA-K +loop_ +_pdbx_chem_comp_description_generator.comp_id +_pdbx_chem_comp_description_generator.program_name +_pdbx_chem_comp_description_generator.program_version +_pdbx_chem_comp_description_generator.descriptor +PO4 acedrg 243 "dictionary generator" +PO4 acedrg_database 11 "data source" +PO4 rdkit 2017.03.2 "Chemoinformatics tool" +PO4 refmac5 5.8.0238 "optimization tool" diff --git a/image_analysis/structure_refinement/monomers/PRO.cif b/image_analysis/structure_refinement/monomers/PRO.cif new file mode 100644 index 000000000..2330d47a9 --- /dev/null +++ b/image_analysis/structure_refinement/monomers/PRO.cif @@ -0,0 +1,216 @@ +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +PRO PRO PROLINE P-peptide 17 8 . + +data_comp_PRO +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.alt_atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +PRO N N N NT2 1 39.160 37.649 83.026 +PRO CA CA C CH1 0 38.550 38.680 82.125 +PRO C C C C 0 37.155 39.077 82.602 +PRO O O O O 0 36.450 38.196 83.146 +PRO CB CB C CH2 0 38.553 38.007 80.756 +PRO CG CG C CH2 0 38.265 36.558 81.098 +PRO CD CD C CH2 0 38.934 36.298 82.416 +PRO OXT OXT O OC -1 36.821 40.268 82.409 +PRO H H H H 0 40.054 37.806 83.097 +PRO H2 H2 H H 0 38.800 37.681 83.862 +PRO HA HA H H 0 39.125 39.473 82.102 +PRO HB3 HB3 H H 0 39.422 38.100 80.320 +PRO HB2 HB2 H H 0 37.858 38.378 80.178 +PRO HG3 HG3 H H 0 38.625 35.964 80.410 +PRO HG2 HG2 H H 0 37.302 36.406 81.169 +PRO HD3 HD3 H H 0 38.363 35.755 82.994 +PRO HD2 HD2 H H 0 39.785 35.835 82.289 + +loop_ +_chem_comp_tree.comp_id +_chem_comp_tree.atom_id +_chem_comp_tree.atom_back +_chem_comp_tree.atom_forward +_chem_comp_tree.connect_type +PRO N n/a CA START +PRO CA N C . +PRO HA CA . . +PRO CB CA CG . +PRO HB3 CB . . +PRO HB2 CB . . +PRO CG CB CD . +PRO HG3 CG . . +PRO HG2 CG . . +PRO CD CG HD2 . +PRO HD3 CD . . +PRO HD2 CD . . +PRO C CA . END +PRO O C . . +PRO OXT C . . +PRO H N . . +PRO H2 N . . +PRO CD N . ADD + +loop_ +_chem_comp_acedrg.comp_id +_chem_comp_acedrg.atom_id +_chem_comp_acedrg.atom_type +PRO N N[5](C[5]C[5]CH)(C[5]C[5]HH)(H)2{4|H<1>} +PRO CA C[5](C[5]C[5]HH)(N[5]C[5]HH)(COO)(H){4|H<1>} +PRO C C(C[5]C[5]N[5]H)(O)2 +PRO O O(CC[5]O) +PRO CB C[5](C[5]C[5]HH)(C[5]N[5]CH)(H)2{4|H<1>} +PRO CG C[5](C[5]C[5]HH)(C[5]N[5]HH)(H)2{1|C<3>,3|H<1>} +PRO CD C[5](C[5]C[5]HH)(N[5]C[5]HH)(H)2{1|C<3>,3|H<1>} +PRO OXT O(CC[5]O) +PRO H H(N[5]C[5]2H) +PRO H2 H(N[5]C[5]2H) +PRO HA H(C[5]C[5]N[5]C) +PRO HB3 H(C[5]C[5]2H) +PRO HB2 H(C[5]C[5]2H) +PRO HG3 H(C[5]C[5]2H) +PRO HG2 H(C[5]C[5]2H) +PRO HD3 H(C[5]C[5]N[5]H) +PRO HD2 H(C[5]C[5]N[5]H) + +loop_ +_chem_comp_bond.comp_id +_chem_comp_bond.atom_id_1 +_chem_comp_bond.atom_id_2 +_chem_comp_bond.value_order +_chem_comp_bond.pdbx_aromatic_flag +_chem_comp_bond.value_dist_nucleus +_chem_comp_bond.value_dist_nucleus_esd +_chem_comp_bond.value_dist +_chem_comp_bond.value_dist_esd +PRO N CA SINGLE n 1.496 0.0142 1.496 0.0142 +PRO N CD SINGLE n 1.499 0.0135 1.499 0.0135 +PRO CA C SINGLE n 1.525 0.0103 1.525 0.0103 +PRO CA CB SINGLE n 1.526 0.0157 1.526 0.0157 +PRO C O DOUBLE n 1.252 0.0117 1.252 0.0117 +PRO C OXT SINGLE n 1.252 0.0117 1.252 0.0117 +PRO CB CG SINGLE n 1.516 0.0179 1.516 0.0179 +PRO CG CD SINGLE n 1.497 0.0200 1.497 0.0200 +PRO N H SINGLE n 1.018 0.0520 0.910 0.0200 +PRO N H2 SINGLE n 1.018 0.0520 0.910 0.0200 +PRO CA HA SINGLE n 1.092 0.0100 0.980 0.0200 +PRO CB HB3 SINGLE n 1.092 0.0100 0.977 0.0145 +PRO CB HB2 SINGLE n 1.092 0.0100 0.977 0.0145 +PRO CG HG3 SINGLE n 1.092 0.0100 0.978 0.0181 +PRO CG HG2 SINGLE n 1.092 0.0100 0.978 0.0181 +PRO CD HD3 SINGLE n 1.092 0.0100 0.977 0.0199 +PRO CD HD2 SINGLE n 1.092 0.0100 0.977 0.0199 + +loop_ +_chem_comp_angle.comp_id +_chem_comp_angle.atom_id_1 +_chem_comp_angle.atom_id_2 +_chem_comp_angle.atom_id_3 +_chem_comp_angle.value_angle +_chem_comp_angle.value_angle_esd +PRO CA N CD 107.978 1.50 +PRO CA N H 109.889 3.00 +PRO CA N H2 109.889 3.00 +PRO CD N H 110.257 3.00 +PRO CD N H2 110.257 3.00 +PRO H N H2 108.772 3.00 +PRO N CA C 110.397 1.50 +PRO N CA CB 103.994 1.50 +PRO N CA HA 109.579 1.50 +PRO C CA CB 113.159 3.00 +PRO C CA HA 109.687 1.50 +PRO CB CA HA 109.910 1.89 +PRO CA C O 116.979 3.00 +PRO CA C OXT 116.979 3.00 +PRO O C OXT 126.043 1.52 +PRO CA CB CG 101.701 3.00 +PRO CA CB HB3 110.865 1.50 +PRO CA CB HB2 110.865 1.50 +PRO CG CB HB3 110.891 1.59 +PRO CG CB HB2 110.891 1.59 +PRO HB3 CB HB2 108.880 2.25 +PRO CB CG CD 105.541 3.00 +PRO CB CG HG3 110.897 1.50 +PRO CB CG HG2 110.897 1.50 +PRO CD CG HG3 110.621 1.50 +PRO CD CG HG2 110.621 1.50 +PRO HG3 CG HG2 108.871 1.50 +PRO N CD CG 104.386 2.30 +PRO N CD HD3 110.569 1.50 +PRO N CD HD2 110.569 1.50 +PRO CG CD HD3 111.131 1.62 +PRO CG CD HD2 111.131 1.62 +PRO HD3 CD HD2 109.116 1.50 + +loop_ +_chem_comp_tor.comp_id +_chem_comp_tor.id +_chem_comp_tor.atom_id_1 +_chem_comp_tor.atom_id_2 +_chem_comp_tor.atom_id_3 +_chem_comp_tor.atom_id_4 +_chem_comp_tor.value_angle +_chem_comp_tor.value_angle_esd +_chem_comp_tor.period +PRO chi1 N CA CB CG -60.000 10.0 3 +PRO chi2 CA CB CG CD 180.000 10.0 3 +PRO sp3_sp3_1 CB CA N CD 60.000 10.0 3 +PRO sp3_sp3_28 N CD CG CB -60.000 10.0 3 +PRO sp3_sp3_37 CG CD N CA 180.000 10.0 3 +PRO sp2_sp3_1 O C CA N 0.000 10.0 6 + +loop_ +_chem_comp_chir.comp_id +_chem_comp_chir.id +_chem_comp_chir.atom_id_centre +_chem_comp_chir.atom_id_1 +_chem_comp_chir.atom_id_2 +_chem_comp_chir.atom_id_3 +_chem_comp_chir.volume_sign +PRO chir_1 CA N C CB positive + +loop_ +_chem_comp_plane_atom.comp_id +_chem_comp_plane_atom.plane_id +_chem_comp_plane_atom.atom_id +_chem_comp_plane_atom.dist_esd +PRO plan-1 C 0.020 +PRO plan-1 CA 0.020 +PRO plan-1 O 0.020 +PRO plan-1 OXT 0.020 + +loop_ +_pdbx_chem_comp_descriptor.comp_id +_pdbx_chem_comp_descriptor.type +_pdbx_chem_comp_descriptor.program +_pdbx_chem_comp_descriptor.program_version +_pdbx_chem_comp_descriptor.descriptor +PRO SMILES ACDLabs 10.04 "O=C(O)C1NCCC1" +PRO SMILES_CANONICAL CACTVS 3.341 "OC(=O)[C@@H]1CCCN1" +PRO SMILES CACTVS 3.341 "OC(=O)[CH]1CCCN1" +PRO SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 "C1C[C@H](NC1)C(=O)O" +PRO SMILES "OpenEye OEToolkits" 1.5.0 "C1CC(NC1)C(=O)O" +PRO InChI InChI 1.03 "InChI=1S/C5H9NO2/c7-5(8)4-2-1-3-6-4/h4,6H,1-3H2,(H,7,8)/t4-/m0/s1" +PRO InChIKey InChI 1.03 ONIBWKKTOPOVIA-BYPYZUCNSA-N + +loop_ +_pdbx_chem_comp_description_generator.comp_id +_pdbx_chem_comp_description_generator.program_name +_pdbx_chem_comp_description_generator.program_version +_pdbx_chem_comp_description_generator.descriptor +PRO acedrg 281 "dictionary generator" +PRO acedrg_database 12 "data source" +PRO rdkit 2019.09.1 "Chemoinformatics tool" +PRO refmac5 5.8.0419 "optimization tool" diff --git a/image_analysis/structure_refinement/monomers/PSU.cif b/image_analysis/structure_refinement/monomers/PSU.cif new file mode 100644 index 000000000..4a2fa8af7 --- /dev/null +++ b/image_analysis/structure_refinement/monomers/PSU.cif @@ -0,0 +1,250 @@ +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +PSU PSU "PSEUDOURIDINE-5'-MONOPHOSPHATE" RNA 32 21 . + +data_comp_PSU +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +PSU N1 N NR16 0 46.164 -7.762 4.833 +PSU C2 C CR6 0 46.590 -7.315 3.610 +PSU N3 N NR16 0 47.833 -7.748 3.219 +PSU C4 C CR6 0 48.652 -8.579 3.959 +PSU C5 C CR6 0 48.162 -9.023 5.229 +PSU C6 C CR16 0 46.903 -8.584 5.636 +PSU O2 O O 0 45.910 -6.578 2.906 +PSU O4 O O 0 49.759 -8.895 3.485 +PSU "C1'" C CH1 0 48.988 -9.928 6.111 +PSU "C2'" C CH1 0 49.724 -9.224 7.265 +PSU "O2'" O OH1 0 51.104 -9.536 7.260 +PSU "C3'" C CH1 0 48.969 -9.682 8.522 +PSU "C4'" C CH1 0 48.520 -11.085 8.105 +PSU "O3'" O OH1 0 49.839 -9.721 9.649 +PSU "O4'" O O2 0 48.167 -10.942 6.712 +PSU "C5'" C CH2 0 47.359 -11.677 8.866 +PSU "O5'" O O2 0 46.178 -10.856 8.677 +PSU P P P 0 44.847 -11.206 9.521 +PSU OP1 O O 0 43.790 -10.223 9.054 +PSU OP2 O OP -1 45.222 -11.019 10.980 +PSU OP3 O OP -1 44.507 -12.644 9.180 +PSU HN1 H H 0 45.353 -7.490 5.108 +PSU HN3 H H 0 48.133 -7.472 2.427 +PSU H6 H H 0 46.552 -8.857 6.469 +PSU "H1'" H H 0 49.672 -10.378 5.553 +PSU "H2'" H H 0 49.616 -8.252 7.170 +PSU "HO2'" H H 0 51.463 -9.174 7.939 +PSU "H3'" H H 0 48.194 -9.103 8.707 +PSU "H4'" H H 0 49.285 -11.706 8.179 +PSU "HO3'" H H 0 49.417 -10.046 10.310 +PSU "H5'" H H 0 47.583 -11.723 9.829 +PSU "H5''" H H 0 47.184 -12.595 8.543 + +loop_ +_chem_comp_bond.comp_id +_chem_comp_bond.atom_id_1 +_chem_comp_bond.atom_id_2 +_chem_comp_bond.type +_chem_comp_bond.aromatic +_chem_comp_bond.value_dist_nucleus +_chem_comp_bond.value_dist_nucleus_esd +_chem_comp_bond.value_dist +_chem_comp_bond.value_dist_esd +PSU N1 C2 SINGLE y 1.365 0.0100 1.365 0.0100 +PSU N1 C6 SINGLE y 1.355 0.0148 1.355 0.0148 +PSU C2 N3 SINGLE y 1.370 0.0100 1.370 0.0100 +PSU C2 O2 DOUBLE n 1.225 0.0100 1.225 0.0100 +PSU N3 C4 SINGLE y 1.379 0.0122 1.379 0.0122 +PSU C4 C5 SINGLE y 1.418 0.0200 1.418 0.0200 +PSU C4 O4 DOUBLE n 1.242 0.0172 1.242 0.0172 +PSU C5 C6 DOUBLE y 1.389 0.0100 1.389 0.0100 +PSU C5 "C1'" SINGLE n 1.506 0.0100 1.506 0.0100 +PSU "C1'" "C2'" SINGLE n 1.532 0.0100 1.532 0.0100 +PSU "C1'" "O4'" SINGLE n 1.434 0.0100 1.434 0.0100 +PSU "C2'" "O2'" SINGLE n 1.414 0.0100 1.414 0.0100 +PSU "C2'" "C3'" SINGLE n 1.533 0.0100 1.533 0.0100 +PSU "C3'" "C4'" SINGLE n 1.535 0.0100 1.535 0.0100 +PSU "C3'" "O3'" SINGLE n 1.423 0.0100 1.423 0.0100 +PSU "C4'" "O4'" SINGLE n 1.448 0.0100 1.448 0.0100 +PSU "C4'" "C5'" SINGLE n 1.509 0.0100 1.509 0.0100 +PSU "C5'" "O5'" SINGLE n 1.450 0.0166 1.450 0.0166 +PSU "O5'" P SINGLE n 1.614 0.0178 1.614 0.0178 +PSU P OP1 DOUBLE n 1.517 0.0192 1.517 0.0192 +PSU P OP2 SINGLE n 1.517 0.0192 1.517 0.0192 +PSU P OP3 SINGLE n 1.517 0.0192 1.517 0.0192 +PSU N1 HN1 SINGLE n 1.016 0.0100 0.898 0.0200 +PSU N3 HN3 SINGLE n 1.016 0.0100 0.889 0.0200 +PSU C6 H6 SINGLE n 1.082 0.0130 0.945 0.0200 +PSU "C1'" "H1'" SINGLE n 1.089 0.0100 0.991 0.0119 +PSU "C2'" "H2'" SINGLE n 1.089 0.0100 0.982 0.0200 +PSU "O2'" "HO2'" SINGLE n 0.970 0.0120 0.849 0.0200 +PSU "C3'" "H3'" SINGLE n 1.089 0.0100 0.985 0.0200 +PSU "C4'" "H4'" SINGLE n 1.089 0.0100 0.988 0.0200 +PSU "O3'" "HO3'" SINGLE n 0.970 0.0120 0.849 0.0200 +PSU "C5'" "H5'" SINGLE n 1.089 0.0100 0.989 0.0200 +PSU "C5'" "H5''" SINGLE n 1.089 0.0100 0.989 0.0200 + +loop_ +_chem_comp_angle.comp_id +_chem_comp_angle.atom_id_1 +_chem_comp_angle.atom_id_2 +_chem_comp_angle.atom_id_3 +_chem_comp_angle.value_angle +_chem_comp_angle.value_angle_esd +PSU C2 N1 C6 122.342 1.50 +PSU C2 N1 HN1 117.656 2.18 +PSU C6 N1 HN1 120.002 2.19 +PSU N1 C2 N3 115.268 1.50 +PSU N1 C2 O2 122.598 1.50 +PSU N3 C2 O2 122.134 1.50 +PSU C2 N3 C4 125.337 1.50 +PSU C2 N3 HN3 117.319 2.30 +PSU C4 N3 HN3 117.344 1.50 +PSU N3 C4 C5 118.938 3.00 +PSU N3 C4 O4 117.999 1.50 +PSU C5 C4 O4 123.064 1.50 +PSU C4 C5 C6 119.178 1.66 +PSU C4 C5 "C1'" 120.411 1.56 +PSU C6 C5 "C1'" 120.411 1.56 +PSU N1 C6 C5 118.938 3.00 +PSU N1 C6 H6 120.523 1.97 +PSU C5 C6 H6 120.539 1.50 +PSU C5 "C1'" "C2'" 115.040 1.80 +PSU C5 "C1'" "O4'" 110.287 1.50 +PSU C5 "C1'" "H1'" 108.843 1.50 +PSU "C2'" "C1'" "O4'" 104.658 1.50 +PSU "C2'" "C1'" "H1'" 108.221 2.17 +PSU "O4'" "C1'" "H1'" 109.373 1.78 +PSU "C1'" "C2'" "O2'" 111.625 2.24 +PSU "C1'" "C2'" "C3'" 102.060 1.50 +PSU "C1'" "C2'" "H2'" 108.984 1.81 +PSU "O2'" "C2'" "C3'" 114.225 2.57 +PSU "O2'" "C2'" "H2'" 109.642 2.25 +PSU "C3'" "C2'" "H2'" 109.242 2.24 +PSU "C2'" "O2'" "HO2'" 108.353 3.00 +PSU "C2'" "C3'" "C4'" 101.721 1.50 +PSU "C2'" "C3'" "O3'" 109.895 1.81 +PSU "C2'" "C3'" "H3'" 111.377 1.50 +PSU "C4'" "C3'" "O3'" 111.281 2.46 +PSU "C4'" "C3'" "H3'" 110.452 2.54 +PSU "O3'" "C3'" "H3'" 110.380 1.67 +PSU "C3'" "C4'" "O4'" 106.192 1.50 +PSU "C3'" "C4'" "C5'" 116.008 1.52 +PSU "C3'" "C4'" "H4'" 109.363 1.86 +PSU "O4'" "C4'" "C5'" 109.123 1.50 +PSU "O4'" "C4'" "H4'" 108.995 1.50 +PSU "C5'" "C4'" "H4'" 108.268 1.50 +PSU "C3'" "O3'" "HO3'" 108.744 3.00 +PSU "C1'" "O4'" "C4'" 109.937 1.50 +PSU "C4'" "C5'" "O5'" 109.342 1.50 +PSU "C4'" "C5'" "H5'" 109.624 1.50 +PSU "C4'" "C5'" "H5''" 109.624 1.50 +PSU "O5'" "C5'" "H5'" 109.845 1.50 +PSU "O5'" "C5'" "H5''" 109.845 1.50 +PSU "H5'" "C5'" "H5''" 108.472 1.50 +PSU "C5'" "O5'" P 118.783 1.50 +PSU "O5'" P OP1 105.808 2.07 +PSU "O5'" P OP2 105.808 2.07 +PSU "O5'" P OP3 105.808 2.07 +PSU OP1 P OP2 112.864 1.69 +PSU OP1 P OP3 112.864 1.69 +PSU OP2 P OP3 112.864 1.69 + +loop_ +_chem_comp_tor.comp_id +_chem_comp_tor.id +_chem_comp_tor.atom_id_1 +_chem_comp_tor.atom_id_2 +_chem_comp_tor.atom_id_3 +_chem_comp_tor.atom_id_4 +_chem_comp_tor.value_angle +_chem_comp_tor.value_angle_esd +_chem_comp_tor.period +PSU C2e-nyu2 "C1'" "C2'" "C3'" "C4'" 326.9 3.600 1 +PSU C2e-nyu3 "C2'" "C3'" "C4'" "O4'" 22.600 4.500 1 +PSU C2e-nyu4 "C3'" "C4'" "O4'" "C1'" 357.700 6.100 1 +PSU C3e-nyu2 "C1'" "C2'" "C3'" "C4'" 35.9 2.800 1 +PSU C3e-nyu3 "C2'" "C3'" "C4'" "O4'" 324.700 3.100 1 +PSU C3e-nyu4 "C3'" "C4'" "O4'" "C1'" 20.500 5.100 1 +PSU alpha "C5'" "O5'" P OP3 -60.000 10.00 3 +PSU beta P "O5'" "C5'" "C4'" 180.000 10.00 3 +PSU epsi "C4'" "C3'" "O3'" "HO3'" 180.000 10.00 3 +PSU gamma "O5'" "C5'" "C4'" "C3'" 180.000 10.00 3 +PSU const_sp2_sp2_3 O2 C2 N1 C6 180.000 5.0 2 +PSU const_21 C5 C6 N1 C2 0.000 10.0 2 +PSU const_sp2_sp2_7 O2 C2 N3 C4 180.000 5.0 2 +PSU const_11 O4 C4 N3 C2 180.000 10.0 2 +PSU const_15 O4 C4 C5 C6 180.000 10.0 2 +PSU const_17 C4 C5 C6 N1 0.000 10.0 2 +PSU sp2_sp3_1 C4 C5 "C1'" "C2'" 150.000 10.0 6 +PSU sp3_sp3_32 C5 "C1'" "O4'" "C4'" 60.000 10.0 3 +PSU sp3_sp3_5 C5 "C1'" "C2'" "O2'" 60.000 10.0 3 +PSU sp3_sp3_34 "C1'" "C2'" "O2'" "HO2'" 180.000 10.0 3 + +loop_ +_chem_comp_chir.comp_id +_chem_comp_chir.id +_chem_comp_chir.atom_id_centre +_chem_comp_chir.atom_id_1 +_chem_comp_chir.atom_id_2 +_chem_comp_chir.atom_id_3 +_chem_comp_chir.volume_sign +PSU chir_1 "C1'" "O4'" "C2'" C5 positive +PSU chir_2 "C2'" "O2'" "C1'" "C3'" negative +PSU chir_3 "C3'" "O3'" "C4'" "C2'" positive +PSU chir_4 "C4'" "O4'" "C3'" "C5'" negative +PSU chir_5 P "O5'" OP2 OP3 both + +loop_ +_chem_comp_plane_atom.comp_id +_chem_comp_plane_atom.plane_id +_chem_comp_plane_atom.atom_id +_chem_comp_plane_atom.dist_esd +PSU plan-1 "C1'" 0.020 +PSU plan-1 C2 0.020 +PSU plan-1 C4 0.020 +PSU plan-1 C5 0.020 +PSU plan-1 C6 0.020 +PSU plan-1 H6 0.020 +PSU plan-1 HN1 0.020 +PSU plan-1 HN3 0.020 +PSU plan-1 N1 0.020 +PSU plan-1 N3 0.020 +PSU plan-1 O2 0.020 +PSU plan-1 O4 0.020 + +loop_ +_pdbx_chem_comp_descriptor.comp_id +_pdbx_chem_comp_descriptor.type +_pdbx_chem_comp_descriptor.program +_pdbx_chem_comp_descriptor.program_version +_pdbx_chem_comp_descriptor.descriptor +PSU SMILES ACDLabs 10.04 O=P(OCC2OC(C1=CNC(=O)NC1=O)C(O)C2O)(O)O +PSU SMILES_CANONICAL CACTVS 3.341 O[C@H]1[C@@H](O)[C@@H](O[C@@H]1CO[P](O)(O)=O)C2=CNC(=O)NC2=O +PSU SMILES CACTVS 3.341 O[CH]1[CH](O)[CH](O[CH]1CO[P](O)(O)=O)C2=CNC(=O)NC2=O +PSU SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 C1=C(C(=O)NC(=O)N1)[C@H]2[C@@H]([C@@H]([C@H](O2)COP(=O)(O)O)O)O +PSU SMILES "OpenEye OEToolkits" 1.5.0 C1=C(C(=O)NC(=O)N1)C2C(C(C(O2)COP(=O)(O)O)O)O +PSU InChI InChI 1.03 InChI=1S/C9H13N2O9P/c12-5-4(2-19-21(16,17)18)20-7(6(5)13)3-1-10-9(15)11-8(3)14/h1,4-7,12-13H,2H2,(H2,16,17,18)(H2,10,11,14,15)/t4-,5-,6-,7+/m1/s1 +PSU InChIKey InChI 1.03 MOBMOJGXNHLLIR-GBNDHIKLSA-N + +loop_ +_pdbx_chem_comp_description_generator.comp_id +_pdbx_chem_comp_description_generator.program_name +_pdbx_chem_comp_description_generator.program_version +_pdbx_chem_comp_description_generator.descriptor +PSU acedrg 243 "dictionary generator" +PSU acedrg_database 11 "data source" +PSU rdkit 2017.03.2 "Chemoinformatics tool" +PSU refmac5 5.8.0238 "optimization tool" diff --git a/image_analysis/structure_refinement/monomers/SAH.cif b/image_analysis/structure_refinement/monomers/SAH.cif new file mode 100644 index 000000000..9f1abc9cb --- /dev/null +++ b/image_analysis/structure_refinement/monomers/SAH.cif @@ -0,0 +1,329 @@ +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +SAH SAH S-ADENOSYL-L-HOMOCYSTEINE NON-POLYMER 46 26 . + +data_comp_SAH +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +SAH N N NT3 1 -2.642 13.710 24.335 +SAH CA C CH1 0 -3.261 12.686 25.223 +SAH CB C CH2 0 -2.531 11.342 25.110 +SAH CG C CH2 0 -2.701 10.665 23.762 +SAH SD S S2 0 -1.875 9.057 23.667 +SAH C C C 0 -3.207 13.172 26.677 +SAH O O O 0 -4.296 13.351 27.259 +SAH OXT O OC -1 -2.078 13.355 27.173 +SAH "C5'" C CH2 0 -2.426 8.439 22.058 +SAH "C4'" C CH1 0 -3.830 7.882 22.065 +SAH "O4'" O O2 0 -4.295 7.751 20.701 +SAH "C3'" C CH1 0 -3.966 6.491 22.682 +SAH "O3'" O OH1 0 -5.239 6.333 23.297 +SAH "C2'" C CH1 0 -3.790 5.584 21.462 +SAH "O2'" O OH1 0 -4.370 4.309 21.628 +SAH "C1'" C CH1 0 -4.519 6.393 20.394 +SAH N9 N NR5 0 -4.045 6.148 19.035 +SAH C8 C CR15 0 -2.777 6.375 18.561 +SAH N7 N NRD5 0 -2.628 6.068 17.297 +SAH C5 C CR56 0 -3.878 5.613 16.905 +SAH C6 C CR6 0 -4.372 5.137 15.671 +SAH N6 N NH2 0 -3.632 5.040 14.570 +SAH N1 N NRD6 0 -5.675 4.759 15.617 +SAH C2 C CR16 0 -6.417 4.859 16.731 +SAH N3 N NRD6 0 -6.060 5.290 17.942 +SAH C4 C CR56 0 -4.764 5.658 17.969 +SAH HN1 H H 0 -2.972 14.538 24.529 +SAH HN2 H H 0 -2.828 13.522 23.464 +SAH H3 H H 0 -1.739 13.719 24.450 +SAH HA H H 0 -4.203 12.573 24.958 +SAH HB1 H H 0 -2.865 10.744 25.808 +SAH HB2 H H 0 -1.578 11.488 25.274 +SAH HG1 H H 0 -2.337 11.245 23.060 +SAH HG2 H H 0 -3.657 10.538 23.583 +SAH "H5'1" H H 0 -1.829 7.752 21.772 +SAH "H5'2" H H 0 -2.386 9.152 21.425 +SAH "H4'" H H 0 -4.421 8.511 22.548 +SAH "H3'" H H 0 -3.243 6.329 23.342 +SAH "HO3'" H H 0 -5.240 5.609 23.740 +SAH "H2'" H H 0 -2.826 5.493 21.237 +SAH "HO2'" H H 0 -4.231 3.847 20.929 +SAH "H1'" H H 0 -5.481 6.197 20.448 +SAH H8 H H 0 -2.079 6.715 19.096 +SAH HN61 H H 0 -3.998 5.178 13.785 +SAH HN62 H H 0 -2.780 4.840 14.635 +SAH H2 H H 0 -7.317 4.585 16.646 + +loop_ +_chem_comp_bond.comp_id +_chem_comp_bond.atom_id_1 +_chem_comp_bond.atom_id_2 +_chem_comp_bond.type +_chem_comp_bond.aromatic +_chem_comp_bond.value_dist_nucleus +_chem_comp_bond.value_dist_nucleus_esd +_chem_comp_bond.value_dist +_chem_comp_bond.value_dist_esd +SAH N CA SINGLE n 1.488 0.0100 1.488 0.0100 +SAH CA CB SINGLE n 1.532 0.0100 1.532 0.0100 +SAH CA C SINGLE n 1.533 0.0100 1.533 0.0100 +SAH CB CG SINGLE n 1.517 0.0200 1.517 0.0200 +SAH CG SD SINGLE n 1.810 0.0200 1.810 0.0200 +SAH SD "C5'" SINGLE n 1.810 0.0169 1.810 0.0169 +SAH C O DOUBLE n 1.247 0.0187 1.247 0.0187 +SAH C OXT SINGLE n 1.247 0.0187 1.247 0.0187 +SAH "C5'" "C4'" SINGLE n 1.510 0.0135 1.510 0.0135 +SAH "C4'" "O4'" SINGLE n 1.446 0.0100 1.446 0.0100 +SAH "C4'" "C3'" SINGLE n 1.528 0.0117 1.528 0.0117 +SAH "O4'" "C1'" SINGLE n 1.409 0.0100 1.409 0.0100 +SAH "C3'" "O3'" SINGLE n 1.422 0.0100 1.422 0.0100 +SAH "C3'" "C2'" SINGLE n 1.531 0.0100 1.531 0.0100 +SAH "C2'" "O2'" SINGLE n 1.411 0.0100 1.411 0.0100 +SAH "C2'" "C1'" SINGLE n 1.525 0.0100 1.525 0.0100 +SAH "C1'" N9 SINGLE n 1.458 0.0100 1.458 0.0100 +SAH N9 C8 SINGLE y 1.372 0.0100 1.372 0.0100 +SAH N9 C4 SINGLE y 1.374 0.0101 1.374 0.0101 +SAH C8 N7 DOUBLE y 1.310 0.0100 1.310 0.0100 +SAH N7 C5 SINGLE y 1.388 0.0100 1.388 0.0100 +SAH C5 C6 SINGLE y 1.408 0.0100 1.408 0.0100 +SAH C5 C4 DOUBLE y 1.381 0.0100 1.381 0.0100 +SAH C6 N6 SINGLE n 1.330 0.0100 1.330 0.0100 +SAH C6 N1 DOUBLE y 1.354 0.0100 1.354 0.0100 +SAH N1 C2 SINGLE y 1.339 0.0100 1.339 0.0100 +SAH C2 N3 DOUBLE y 1.330 0.0100 1.330 0.0100 +SAH N3 C4 SINGLE y 1.343 0.0100 1.343 0.0100 +SAH N HN1 SINGLE n 1.036 0.0160 0.911 0.0200 +SAH N HN2 SINGLE n 1.036 0.0160 0.911 0.0200 +SAH N H3 SINGLE n 1.036 0.0160 0.911 0.0200 +SAH CA HA SINGLE n 1.089 0.0100 0.985 0.0200 +SAH CB HB1 SINGLE n 1.089 0.0100 0.978 0.0200 +SAH CB HB2 SINGLE n 1.089 0.0100 0.978 0.0200 +SAH CG HG1 SINGLE n 1.089 0.0100 0.981 0.0122 +SAH CG HG2 SINGLE n 1.089 0.0100 0.981 0.0122 +SAH "C5'" "H5'1" SINGLE n 1.089 0.0100 0.954 0.0200 +SAH "C5'" "H5'2" SINGLE n 1.089 0.0100 0.954 0.0200 +SAH "C4'" "H4'" SINGLE n 1.089 0.0100 0.989 0.0197 +SAH "C3'" "H3'" SINGLE n 1.089 0.0100 0.992 0.0200 +SAH "O3'" "HO3'" SINGLE n 0.970 0.0120 0.849 0.0200 +SAH "C2'" "H2'" SINGLE n 1.089 0.0100 0.994 0.0200 +SAH "O2'" "HO2'" SINGLE n 0.970 0.0120 0.849 0.0200 +SAH "C1'" "H1'" SINGLE n 1.089 0.0100 0.984 0.0200 +SAH C8 H8 SINGLE n 1.082 0.0130 0.942 0.0170 +SAH N6 HN61 SINGLE n 1.016 0.0100 0.877 0.0200 +SAH N6 HN62 SINGLE n 1.016 0.0100 0.877 0.0200 +SAH C2 H2 SINGLE n 1.082 0.0130 0.945 0.0200 + +loop_ +_chem_comp_angle.comp_id +_chem_comp_angle.atom_id_1 +_chem_comp_angle.atom_id_2 +_chem_comp_angle.atom_id_3 +_chem_comp_angle.value_angle +_chem_comp_angle.value_angle_esd +SAH CA N HN1 110.062 1.93 +SAH CA N HN2 110.062 1.93 +SAH CA N H3 110.062 1.93 +SAH HN1 N HN2 109.028 2.41 +SAH HN1 N H3 109.028 2.41 +SAH HN2 N H3 109.028 2.41 +SAH N CA CB 110.906 1.50 +SAH N CA C 109.241 1.50 +SAH N CA HA 108.487 1.50 +SAH CB CA C 109.344 1.50 +SAH CB CA HA 109.670 1.50 +SAH C CA HA 108.824 1.50 +SAH CA CB CG 113.476 1.50 +SAH CA CB HB1 108.666 1.50 +SAH CA CB HB2 108.666 1.50 +SAH CG CB HB1 108.955 1.50 +SAH CG CB HB2 108.955 1.50 +SAH HB1 CB HB2 107.698 1.50 +SAH CB CG SD 113.263 2.33 +SAH CB CG HG1 109.206 1.50 +SAH CB CG HG2 109.206 1.50 +SAH SD CG HG1 108.654 1.50 +SAH SD CG HG2 108.654 1.50 +SAH HG1 CG HG2 107.939 1.50 +SAH CG SD "C5'" 102.171 1.96 +SAH CA C O 117.124 1.50 +SAH CA C OXT 117.124 1.50 +SAH O C OXT 125.752 1.50 +SAH SD "C5'" "C4'" 113.180 3.00 +SAH SD "C5'" "H5'1" 108.574 1.50 +SAH SD "C5'" "H5'2" 108.574 1.50 +SAH "C4'" "C5'" "H5'1" 108.376 1.50 +SAH "C4'" "C5'" "H5'2" 108.376 1.50 +SAH "H5'1" "C5'" "H5'2" 108.127 1.50 +SAH "C5'" "C4'" "O4'" 109.275 1.50 +SAH "C5'" "C4'" "C3'" 114.880 1.64 +SAH "C5'" "C4'" "H4'" 109.000 1.62 +SAH "O4'" "C4'" "C3'" 105.508 1.50 +SAH "O4'" "C4'" "H4'" 109.115 1.50 +SAH "C3'" "C4'" "H4'" 109.143 1.50 +SAH "C4'" "O4'" "C1'" 109.426 1.50 +SAH "C4'" "C3'" "O3'" 110.985 2.41 +SAH "C4'" "C3'" "C2'" 102.352 1.50 +SAH "C4'" "C3'" "H3'" 110.624 1.81 +SAH "O3'" "C3'" "C2'" 111.581 2.83 +SAH "O3'" "C3'" "H3'" 110.380 1.67 +SAH "C2'" "C3'" "H3'" 110.504 1.75 +SAH "C3'" "O3'" "HO3'" 108.744 3.00 +SAH "C3'" "C2'" "O2'" 112.782 2.45 +SAH "C3'" "C2'" "C1'" 101.239 1.50 +SAH "C3'" "C2'" "H2'" 110.596 1.51 +SAH "O2'" "C2'" "C1'" 111.715 2.69 +SAH "O2'" "C2'" "H2'" 110.448 1.97 +SAH "C1'" "C2'" "H2'" 110.636 1.70 +SAH "C2'" "O2'" "HO2'" 109.103 2.13 +SAH "O4'" "C1'" "C2'" 106.047 1.50 +SAH "O4'" "C1'" N9 108.477 1.50 +SAH "O4'" "C1'" "H1'" 109.807 1.50 +SAH "C2'" "C1'" N9 113.824 1.50 +SAH "C2'" "C1'" "H1'" 109.015 1.50 +SAH N9 "C1'" "H1'" 109.561 1.50 +SAH "C1'" N9 C8 126.848 1.91 +SAH "C1'" N9 C4 127.459 1.80 +SAH C8 N9 C4 105.693 1.50 +SAH N9 C8 N7 113.469 1.50 +SAH N9 C8 H8 123.206 1.50 +SAH N7 C8 H8 123.326 1.50 +SAH C8 N7 C5 104.739 1.50 +SAH N7 C5 C6 132.250 1.50 +SAH N7 C5 C4 110.483 1.50 +SAH C6 C5 C4 117.267 1.50 +SAH C5 C6 N6 123.792 1.50 +SAH C5 C6 N1 117.409 1.50 +SAH N6 C6 N1 118.799 1.50 +SAH C6 N6 HN61 119.723 1.50 +SAH C6 N6 HN62 119.723 1.50 +SAH HN61 N6 HN62 120.554 1.88 +SAH C6 N1 C2 118.521 1.50 +SAH N1 C2 N3 129.332 1.50 +SAH N1 C2 H2 115.313 1.50 +SAH N3 C2 H2 115.355 1.50 +SAH C2 N3 C4 110.982 1.50 +SAH N9 C4 C5 105.616 1.50 +SAH N9 C4 N3 127.895 1.50 +SAH C5 C4 N3 126.489 1.50 + +loop_ +_chem_comp_tor.comp_id +_chem_comp_tor.id +_chem_comp_tor.atom_id_1 +_chem_comp_tor.atom_id_2 +_chem_comp_tor.atom_id_3 +_chem_comp_tor.atom_id_4 +_chem_comp_tor.value_angle +_chem_comp_tor.value_angle_esd +_chem_comp_tor.period +SAH sp3_sp3_25 CB CA N HN1 180.000 10.0 3 +SAH sp3_sp3_4 "C2'" "C1'" "O4'" "C4'" -60.000 10.0 3 +SAH sp3_sp3_76 "C4'" "C3'" "O3'" "HO3'" 180.000 10.0 3 +SAH sp3_sp3_20 "O2'" "C2'" "C3'" "O3'" -60.000 10.0 3 +SAH sp3_sp3_79 "C3'" "C2'" "O2'" "HO2'" 180.000 10.0 3 +SAH sp3_sp3_8 "O4'" "C1'" "C2'" "O2'" 180.000 10.0 3 +SAH sp2_sp3_7 C8 N9 "C1'" "O4'" 150.000 10.0 6 +SAH const_14 N7 C8 N9 "C1'" 180.000 10.0 2 +SAH const_26 C5 C4 N9 "C1'" 180.000 10.0 2 +SAH const_17 N9 C8 N7 C5 0.000 10.0 2 +SAH const_20 C6 C5 N7 C8 180.000 10.0 2 +SAH const_sp2_sp2_4 N7 C5 C6 N6 0.000 5.0 2 +SAH const_21 N9 C4 C5 N7 0.000 10.0 2 +SAH sp3_sp3_34 N CA CB CG 180.000 10.0 3 +SAH sp2_sp3_1 O C CA N 0.000 10.0 6 +SAH sp2_sp2_1 C5 C6 N6 HN61 180.000 5.0 2 +SAH const_sp2_sp2_6 N6 C6 N1 C2 180.000 5.0 2 +SAH const_sp2_sp2_7 N3 C2 N1 C6 0.000 5.0 2 +SAH const_sp2_sp2_9 N1 C2 N3 C4 0.000 5.0 2 +SAH const_12 N9 C4 N3 C2 180.000 10.0 2 +SAH sp3_sp3_43 CA CB CG SD 180.000 10.0 3 +SAH sp3_sp3_52 CB CG SD "C5'" 180.000 10.0 3 +SAH sp3_sp3_55 "C4'" "C5'" SD CG 180.000 10.0 3 +SAH sp3_sp3_58 "O4'" "C4'" "C5'" SD 180.000 10.0 3 +SAH sp3_sp3_2 "C5'" "C4'" "O4'" "C1'" -60.000 10.0 3 +SAH sp3_sp3_71 "O3'" "C3'" "C4'" "C5'" 180.000 10.0 3 + +loop_ +_chem_comp_chir.comp_id +_chem_comp_chir.id +_chem_comp_chir.atom_id_centre +_chem_comp_chir.atom_id_1 +_chem_comp_chir.atom_id_2 +_chem_comp_chir.atom_id_3 +_chem_comp_chir.volume_sign +SAH chir_1 CA N C CB positive +SAH chir_2 "C4'" "O4'" "C5'" "C3'" positive +SAH chir_3 "C3'" "O3'" "C4'" "C2'" positive +SAH chir_4 "C2'" "O2'" "C1'" "C3'" negative +SAH chir_5 "C1'" "O4'" N9 "C2'" negative + +loop_ +_chem_comp_plane_atom.comp_id +_chem_comp_plane_atom.plane_id +_chem_comp_plane_atom.atom_id +_chem_comp_plane_atom.dist_esd +SAH plan-1 "C1'" 0.020 +SAH plan-1 C2 0.020 +SAH plan-1 C4 0.020 +SAH plan-1 C5 0.020 +SAH plan-1 C6 0.020 +SAH plan-1 C8 0.020 +SAH plan-1 H2 0.020 +SAH plan-1 H8 0.020 +SAH plan-1 N1 0.020 +SAH plan-1 N3 0.020 +SAH plan-1 N6 0.020 +SAH plan-1 N7 0.020 +SAH plan-1 N9 0.020 +SAH plan-2 C 0.020 +SAH plan-2 CA 0.020 +SAH plan-2 O 0.020 +SAH plan-2 OXT 0.020 +SAH plan-3 C6 0.020 +SAH plan-3 HN61 0.020 +SAH plan-3 HN62 0.020 +SAH plan-3 N6 0.020 + +loop_ +_pdbx_chem_comp_descriptor.comp_id +_pdbx_chem_comp_descriptor.type +_pdbx_chem_comp_descriptor.program +_pdbx_chem_comp_descriptor.program_version +_pdbx_chem_comp_descriptor.descriptor +SAH SMILES ACDLabs 10.04 O=C(O)C(N)CCSCC3OC(n2cnc1c(ncnc12)N)C(O)C3O +SAH SMILES_CANONICAL CACTVS 3.341 N[C@@H](CCSC[C@H]1O[C@H]([C@H](O)[C@@H]1O)n2cnc3c(N)ncnc23)C(O)=O +SAH SMILES CACTVS 3.341 N[CH](CCSC[CH]1O[CH]([CH](O)[CH]1O)n2cnc3c(N)ncnc23)C(O)=O +SAH SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 c1nc(c2c(n1)n(cn2)[C@H]3[C@@H]([C@@H]([C@H](O3)CSCC[C@@H](C(=O)O)N)O)O)N +SAH SMILES "OpenEye OEToolkits" 1.5.0 c1nc(c2c(n1)n(cn2)C3C(C(C(O3)CSCCC(C(=O)O)N)O)O)N +SAH InChI InChI 1.03 InChI=1S/C14H20N6O5S/c15-6(14(23)24)1-2-26-3-7-9(21)10(22)13(25-7)20-5-19-8-11(16)17-4-18-12(8)20/h4-7,9-10,13,21-22H,1-3,15H2,(H,23,24)(H2,16,17,18)/t6-,7+,9+,10+,13+/m0/s1 +SAH InChIKey InChI 1.03 ZJUKTBDSGOFHSH-WFMPWKQPSA-N + +loop_ +_pdbx_chem_comp_description_generator.comp_id +_pdbx_chem_comp_description_generator.program_name +_pdbx_chem_comp_description_generator.program_version +_pdbx_chem_comp_description_generator.descriptor +SAH acedrg 243 "dictionary generator" +SAH acedrg_database 11 "data source" +SAH rdkit 2017.03.2 "Chemoinformatics tool" +SAH refmac5 5.8.0238 "optimization tool" + +loop_ +_chem_comp_alias.comp_id +_chem_comp_alias.group +_chem_comp_alias.atom_id +_chem_comp_alias.atom_id_standard +SAH peptide HN1 H +SAH peptide HN2 H2 diff --git a/image_analysis/structure_refinement/monomers/SAM.cif b/image_analysis/structure_refinement/monomers/SAM.cif new file mode 100644 index 000000000..5feded1da --- /dev/null +++ b/image_analysis/structure_refinement/monomers/SAM.cif @@ -0,0 +1,347 @@ +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +SAM SAM S-ADENOSYLMETHIONINE NON-POLYMER 50 27 . + +data_comp_SAM +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +SAM N N NT3 1 -27.592 29.068 46.677 +SAM CA C CH1 0 -28.803 28.395 46.134 +SAM C C C 0 -29.252 27.303 47.112 +SAM O O O 0 -28.390 26.481 47.482 +SAM OXT O OC -1 -30.447 27.315 47.469 +SAM CB C CH2 0 -28.507 27.780 44.760 +SAM CG C CH2 0 -29.706 27.205 44.008 +SAM SD S S3 1 -30.917 28.471 43.547 +SAM CE C CH3 0 -32.145 27.508 42.679 +SAM "C5'" C CH2 0 -30.019 29.269 42.194 +SAM "C4'" C CH1 0 -29.862 30.762 42.411 +SAM "O4'" O O2 0 -29.159 30.988 43.651 +SAM "C3'" C CH1 0 -29.042 31.494 41.354 +SAM "O3'" O OH1 0 -29.880 31.908 40.281 +SAM "C2'" C CH1 0 -28.448 32.677 42.130 +SAM "O2'" O OH1 0 -29.235 33.845 42.037 +SAM "C1'" C CH1 0 -28.400 32.173 43.575 +SAM N9 N NR5 0 -27.055 31.878 44.061 +SAM C8 C CR15 0 -26.399 32.530 45.075 +SAM N7 N NRD5 0 -25.203 32.054 45.314 +SAM C5 C CR56 0 -25.057 31.017 44.404 +SAM C6 C CR6 0 -24.001 30.114 44.153 +SAM N6 N NH2 0 -22.853 30.119 44.825 +SAM N1 N NRD6 0 -24.177 29.196 43.169 +SAM C2 C CR16 0 -25.338 29.196 42.495 +SAM N3 N NRD6 0 -26.395 29.994 42.645 +SAM C4 C CR56 0 -26.195 30.896 43.625 +SAM HN1 H H 0 -27.310 29.714 46.100 +SAM HN2 H H 0 -26.921 28.461 46.790 +SAM H3 H H 0 -27.781 29.453 47.481 +SAM HA H H 0 -29.519 29.065 46.056 +SAM HB1 H H 0 -27.851 27.065 44.879 +SAM HB2 H H 0 -28.094 28.464 44.200 +SAM HG1 H H 0 -30.155 26.532 44.561 +SAM HG2 H H 0 -29.394 26.764 43.189 +SAM HE1 H H 0 -32.772 28.106 42.242 +SAM HE2 H H 0 -32.619 26.946 43.314 +SAM HE3 H H 0 -31.707 26.952 42.015 +SAM "H5'1" H H 0 -30.506 29.113 41.356 +SAM "H5'2" H H 0 -29.133 28.858 42.111 +SAM "H4'" H H 0 -30.759 31.175 42.468 +SAM "H3'" H H 0 -28.320 30.910 41.010 +SAM "HO3'" H H 0 -29.420 32.372 39.739 +SAM "H2'" H H 0 -27.528 32.871 41.805 +SAM "HO2'" H H 0 -28.800 34.500 42.358 +SAM "H1'" H H 0 -28.805 32.854 44.158 +SAM H8 H H 0 -26.773 33.252 45.550 +SAM HN61 H H 0 -22.410 29.370 44.938 +SAM HN62 H H 0 -22.544 30.872 45.153 +SAM H2 H H 0 -25.416 28.540 41.820 + +loop_ +_chem_comp_bond.comp_id +_chem_comp_bond.atom_id_1 +_chem_comp_bond.atom_id_2 +_chem_comp_bond.type +_chem_comp_bond.aromatic +_chem_comp_bond.value_dist_nucleus +_chem_comp_bond.value_dist_nucleus_esd +_chem_comp_bond.value_dist +_chem_comp_bond.value_dist_esd +SAM N CA SINGLE n 1.488 0.0100 1.488 0.0100 +SAM CA C SINGLE n 1.533 0.0100 1.533 0.0100 +SAM CA CB SINGLE n 1.532 0.0100 1.532 0.0100 +SAM C O DOUBLE n 1.247 0.0187 1.247 0.0187 +SAM C OXT SINGLE n 1.247 0.0187 1.247 0.0187 +SAM CB CG SINGLE n 1.516 0.0200 1.516 0.0200 +SAM CG SD SINGLE n 1.807 0.0171 1.807 0.0171 +SAM SD CE SINGLE n 1.786 0.0143 1.786 0.0143 +SAM SD "C5'" SINGLE n 1.807 0.0171 1.807 0.0171 +SAM "C5'" "C4'" SINGLE n 1.516 0.0120 1.516 0.0120 +SAM "C4'" "O4'" SINGLE n 1.446 0.0100 1.446 0.0100 +SAM "C4'" "C3'" SINGLE n 1.528 0.0117 1.528 0.0117 +SAM "O4'" "C1'" SINGLE n 1.409 0.0100 1.409 0.0100 +SAM "C3'" "O3'" SINGLE n 1.422 0.0100 1.422 0.0100 +SAM "C3'" "C2'" SINGLE n 1.531 0.0100 1.531 0.0100 +SAM "C2'" "O2'" SINGLE n 1.411 0.0100 1.411 0.0100 +SAM "C2'" "C1'" SINGLE n 1.525 0.0100 1.525 0.0100 +SAM "C1'" N9 SINGLE n 1.458 0.0100 1.458 0.0100 +SAM N9 C8 SINGLE y 1.372 0.0100 1.372 0.0100 +SAM N9 C4 SINGLE y 1.374 0.0101 1.374 0.0101 +SAM C8 N7 DOUBLE y 1.310 0.0100 1.310 0.0100 +SAM N7 C5 SINGLE y 1.388 0.0100 1.388 0.0100 +SAM C5 C6 SINGLE y 1.408 0.0100 1.408 0.0100 +SAM C5 C4 DOUBLE y 1.381 0.0100 1.381 0.0100 +SAM C6 N6 SINGLE n 1.330 0.0100 1.330 0.0100 +SAM C6 N1 DOUBLE y 1.354 0.0100 1.354 0.0100 +SAM N1 C2 SINGLE y 1.339 0.0100 1.339 0.0100 +SAM C2 N3 DOUBLE y 1.330 0.0100 1.330 0.0100 +SAM N3 C4 SINGLE y 1.343 0.0100 1.343 0.0100 +SAM N HN1 SINGLE n 1.036 0.0160 0.911 0.0200 +SAM N HN2 SINGLE n 1.036 0.0160 0.911 0.0200 +SAM N H3 SINGLE n 1.036 0.0160 0.911 0.0200 +SAM CA HA SINGLE n 1.089 0.0100 0.985 0.0200 +SAM CB HB1 SINGLE n 1.089 0.0100 0.978 0.0200 +SAM CB HB2 SINGLE n 1.089 0.0100 0.978 0.0200 +SAM CG HG1 SINGLE n 1.089 0.0100 0.981 0.0150 +SAM CG HG2 SINGLE n 1.089 0.0100 0.981 0.0150 +SAM CE HE1 SINGLE n 1.089 0.0100 0.971 0.0165 +SAM CE HE2 SINGLE n 1.089 0.0100 0.971 0.0165 +SAM CE HE3 SINGLE n 1.089 0.0100 0.971 0.0165 +SAM "C5'" "H5'1" SINGLE n 1.089 0.0100 0.981 0.0150 +SAM "C5'" "H5'2" SINGLE n 1.089 0.0100 0.981 0.0150 +SAM "C4'" "H4'" SINGLE n 1.089 0.0100 0.989 0.0197 +SAM "C3'" "H3'" SINGLE n 1.089 0.0100 0.992 0.0200 +SAM "O3'" "HO3'" SINGLE n 0.970 0.0120 0.849 0.0200 +SAM "C2'" "H2'" SINGLE n 1.089 0.0100 0.994 0.0200 +SAM "O2'" "HO2'" SINGLE n 0.970 0.0120 0.849 0.0200 +SAM "C1'" "H1'" SINGLE n 1.089 0.0100 0.984 0.0200 +SAM C8 H8 SINGLE n 1.082 0.0130 0.942 0.0170 +SAM N6 HN61 SINGLE n 1.016 0.0100 0.877 0.0200 +SAM N6 HN62 SINGLE n 1.016 0.0100 0.877 0.0200 +SAM C2 H2 SINGLE n 1.082 0.0130 0.945 0.0200 + +loop_ +_chem_comp_angle.comp_id +_chem_comp_angle.atom_id_1 +_chem_comp_angle.atom_id_2 +_chem_comp_angle.atom_id_3 +_chem_comp_angle.value_angle +_chem_comp_angle.value_angle_esd +SAM CA N HN1 110.062 1.93 +SAM CA N HN2 110.062 1.93 +SAM CA N H3 110.062 1.93 +SAM HN1 N HN2 109.028 2.41 +SAM HN1 N H3 109.028 2.41 +SAM HN2 N H3 109.028 2.41 +SAM N CA C 109.241 1.50 +SAM N CA CB 110.906 1.50 +SAM N CA HA 108.487 1.50 +SAM C CA CB 109.344 1.50 +SAM C CA HA 108.824 1.50 +SAM CB CA HA 109.670 1.50 +SAM CA C O 117.124 1.50 +SAM CA C OXT 117.124 1.50 +SAM O C OXT 125.752 1.50 +SAM CA CB CG 113.808 1.88 +SAM CA CB HB1 108.666 1.50 +SAM CA CB HB2 108.666 1.50 +SAM CG CB HB1 108.557 1.50 +SAM CG CB HB2 108.557 1.50 +SAM HB1 CB HB2 107.698 1.50 +SAM CB CG SD 108.220 3.00 +SAM CB CG HG1 109.481 1.50 +SAM CB CG HG2 109.481 1.50 +SAM SD CG HG1 108.504 1.57 +SAM SD CG HG2 108.504 1.57 +SAM HG1 CG HG2 108.193 1.50 +SAM CG SD CE 102.026 1.83 +SAM CG SD "C5'" 98.345 1.79 +SAM CE SD "C5'" 102.487 1.89 +SAM SD CE HE1 109.268 1.50 +SAM SD CE HE2 109.268 1.50 +SAM SD CE HE3 109.268 1.50 +SAM HE1 CE HE2 109.605 1.50 +SAM HE1 CE HE3 109.605 1.50 +SAM HE2 CE HE3 109.605 1.50 +SAM SD "C5'" "C4'" 111.142 2.46 +SAM SD "C5'" "H5'1" 108.544 1.50 +SAM SD "C5'" "H5'2" 108.544 1.50 +SAM "C4'" "C5'" "H5'1" 109.065 1.50 +SAM "C4'" "C5'" "H5'2" 109.065 1.50 +SAM "H5'1" "C5'" "H5'2" 107.808 1.50 +SAM "C5'" "C4'" "O4'" 109.393 1.53 +SAM "C5'" "C4'" "C3'" 115.549 1.59 +SAM "C5'" "C4'" "H4'" 109.003 1.50 +SAM "O4'" "C4'" "C3'" 105.508 1.50 +SAM "O4'" "C4'" "H4'" 109.115 1.50 +SAM "C3'" "C4'" "H4'" 109.143 1.50 +SAM "C4'" "O4'" "C1'" 109.426 1.50 +SAM "C4'" "C3'" "O3'" 110.985 2.41 +SAM "C4'" "C3'" "C2'" 102.352 1.50 +SAM "C4'" "C3'" "H3'" 110.624 1.81 +SAM "O3'" "C3'" "C2'" 111.581 2.83 +SAM "O3'" "C3'" "H3'" 110.380 1.67 +SAM "C2'" "C3'" "H3'" 110.504 1.75 +SAM "C3'" "O3'" "HO3'" 108.744 3.00 +SAM "C3'" "C2'" "O2'" 112.782 2.45 +SAM "C3'" "C2'" "C1'" 101.239 1.50 +SAM "C3'" "C2'" "H2'" 110.596 1.51 +SAM "O2'" "C2'" "C1'" 111.715 2.69 +SAM "O2'" "C2'" "H2'" 110.448 1.97 +SAM "C1'" "C2'" "H2'" 110.636 1.70 +SAM "C2'" "O2'" "HO2'" 109.103 2.13 +SAM "O4'" "C1'" "C2'" 106.047 1.50 +SAM "O4'" "C1'" N9 108.477 1.50 +SAM "O4'" "C1'" "H1'" 109.807 1.50 +SAM "C2'" "C1'" N9 113.824 1.50 +SAM "C2'" "C1'" "H1'" 109.015 1.50 +SAM N9 "C1'" "H1'" 109.561 1.50 +SAM "C1'" N9 C8 126.848 1.91 +SAM "C1'" N9 C4 127.459 1.80 +SAM C8 N9 C4 105.693 1.50 +SAM N9 C8 N7 113.469 1.50 +SAM N9 C8 H8 123.206 1.50 +SAM N7 C8 H8 123.326 1.50 +SAM C8 N7 C5 104.739 1.50 +SAM N7 C5 C6 132.250 1.50 +SAM N7 C5 C4 110.483 1.50 +SAM C6 C5 C4 117.267 1.50 +SAM C5 C6 N6 123.792 1.50 +SAM C5 C6 N1 117.409 1.50 +SAM N6 C6 N1 118.799 1.50 +SAM C6 N6 HN61 119.723 1.50 +SAM C6 N6 HN62 119.723 1.50 +SAM HN61 N6 HN62 120.554 1.88 +SAM C6 N1 C2 118.521 1.50 +SAM N1 C2 N3 129.332 1.50 +SAM N1 C2 H2 115.313 1.50 +SAM N3 C2 H2 115.355 1.50 +SAM C2 N3 C4 110.982 1.50 +SAM N9 C4 C5 105.616 1.50 +SAM N9 C4 N3 127.895 1.50 +SAM C5 C4 N3 126.489 1.50 + +loop_ +_chem_comp_tor.comp_id +_chem_comp_tor.id +_chem_comp_tor.atom_id_1 +_chem_comp_tor.atom_id_2 +_chem_comp_tor.atom_id_3 +_chem_comp_tor.atom_id_4 +_chem_comp_tor.value_angle +_chem_comp_tor.value_angle_esd +_chem_comp_tor.period +SAM sp3_sp3_25 C CA N HN1 180.000 10.0 3 +SAM sp3_sp3_2 "C5'" "C4'" "O4'" "C1'" -60.000 10.0 3 +SAM sp3_sp3_83 "O3'" "C3'" "C4'" "C5'" 180.000 10.0 3 +SAM sp3_sp3_4 "C2'" "C1'" "O4'" "C4'" -60.000 10.0 3 +SAM sp3_sp3_88 "C4'" "C3'" "O3'" "HO3'" 180.000 10.0 3 +SAM sp3_sp3_20 "O2'" "C2'" "C3'" "O3'" -60.000 10.0 3 +SAM sp3_sp3_91 "C3'" "C2'" "O2'" "HO2'" 180.000 10.0 3 +SAM sp3_sp3_8 "O4'" "C1'" "C2'" "O2'" 180.000 10.0 3 +SAM sp2_sp3_7 C8 N9 "C1'" "O4'" 150.000 10.0 6 +SAM const_14 N7 C8 N9 "C1'" 180.000 10.0 2 +SAM const_26 C5 C4 N9 "C1'" 180.000 10.0 2 +SAM const_17 N9 C8 N7 C5 0.000 10.0 2 +SAM const_20 C6 C5 N7 C8 180.000 10.0 2 +SAM sp2_sp3_1 O C CA N 0.000 10.0 6 +SAM sp3_sp3_34 N CA CB CG 180.000 10.0 3 +SAM const_sp2_sp2_4 N7 C5 C6 N6 0.000 5.0 2 +SAM const_21 N9 C4 C5 N7 0.000 10.0 2 +SAM sp2_sp2_1 C5 C6 N6 HN61 180.000 5.0 2 +SAM const_sp2_sp2_6 N6 C6 N1 C2 180.000 5.0 2 +SAM const_sp2_sp2_7 N3 C2 N1 C6 0.000 5.0 2 +SAM const_sp2_sp2_9 N1 C2 N3 C4 0.000 5.0 2 +SAM const_12 N9 C4 N3 C2 180.000 10.0 2 +SAM sp3_sp3_43 CA CB CG SD 180.000 10.0 3 +SAM sp3_sp3_52 CB CG SD CE 180.000 10.0 3 +SAM sp3_sp3_58 HE1 CE SD CG 180.000 10.0 3 +SAM sp3_sp3_64 "C4'" "C5'" SD CG 180.000 10.0 3 +SAM sp3_sp3_70 "O4'" "C4'" "C5'" SD 180.000 10.0 3 + +loop_ +_chem_comp_chir.comp_id +_chem_comp_chir.id +_chem_comp_chir.atom_id_centre +_chem_comp_chir.atom_id_1 +_chem_comp_chir.atom_id_2 +_chem_comp_chir.atom_id_3 +_chem_comp_chir.volume_sign +SAM chir_1 CA N C CB positive +SAM chir_2 SD "C5'" CG CE positive +SAM chir_3 "C4'" "O4'" "C5'" "C3'" positive +SAM chir_4 "C3'" "O3'" "C4'" "C2'" positive +SAM chir_5 "C2'" "O2'" "C1'" "C3'" negative +SAM chir_6 "C1'" "O4'" N9 "C2'" negative + +loop_ +_chem_comp_plane_atom.comp_id +_chem_comp_plane_atom.plane_id +_chem_comp_plane_atom.atom_id +_chem_comp_plane_atom.dist_esd +SAM plan-1 "C1'" 0.020 +SAM plan-1 C2 0.020 +SAM plan-1 C4 0.020 +SAM plan-1 C5 0.020 +SAM plan-1 C6 0.020 +SAM plan-1 C8 0.020 +SAM plan-1 H2 0.020 +SAM plan-1 H8 0.020 +SAM plan-1 N1 0.020 +SAM plan-1 N3 0.020 +SAM plan-1 N6 0.020 +SAM plan-1 N7 0.020 +SAM plan-1 N9 0.020 +SAM plan-2 C 0.020 +SAM plan-2 CA 0.020 +SAM plan-2 O 0.020 +SAM plan-2 OXT 0.020 +SAM plan-3 C6 0.020 +SAM plan-3 HN61 0.020 +SAM plan-3 HN62 0.020 +SAM plan-3 N6 0.020 + +loop_ +_pdbx_chem_comp_descriptor.comp_id +_pdbx_chem_comp_descriptor.type +_pdbx_chem_comp_descriptor.program +_pdbx_chem_comp_descriptor.program_version +_pdbx_chem_comp_descriptor.descriptor +SAM SMILES ACDLabs 10.04 "[O-]C(=O)C(N)CC[S+](C)CC3OC(n2cnc1c(ncnc12)N)C(O)C3O" +SAM SMILES_CANONICAL CACTVS 3.341 C[S@@+](CC[C@H](N)C([O-])=O)C[C@H]1O[C@H]([C@H](O)[C@@H]1O)n2cnc3c(N)ncnc23 +SAM SMILES CACTVS 3.341 C[S+](CC[CH](N)C([O-])=O)C[CH]1O[CH]([CH](O)[CH]1O)n2cnc3c(N)ncnc23 +SAM SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 C[S@@+](CC[C@@H](C(=O)[O-])N)C[C@@H]1[C@H]([C@H]([C@@H](O1)n2cnc3c2ncnc3N)O)O +SAM SMILES "OpenEye OEToolkits" 1.5.0 C[S+](CCC(C(=O)[O-])N)CC1C(C(C(O1)n2cnc3c2ncnc3N)O)O +SAM InChI InChI 1.03 InChI=1S/C15H22N6O5S/c1-27(3-2-7(16)15(24)25)4-8-10(22)11(23)14(26-8)21-6-20-9-12(17)18-5-19-13(9)21/h5-8,10-11,14,22-23H,2-4,16H2,1H3,(H2-,17,18,19,24,25)/t7-,8+,10+,11+,14+,27-/m0/s1 +SAM InChIKey InChI 1.03 MEFKEPWMEQBLKI-FCKMPRQPSA-N + +loop_ +_pdbx_chem_comp_description_generator.comp_id +_pdbx_chem_comp_description_generator.program_name +_pdbx_chem_comp_description_generator.program_version +_pdbx_chem_comp_description_generator.descriptor +SAM acedrg 243 "dictionary generator" +SAM acedrg_database 11 "data source" +SAM rdkit 2017.03.2 "Chemoinformatics tool" +SAM refmac5 5.8.0238 "optimization tool" + +loop_ +_chem_comp_alias.comp_id +_chem_comp_alias.group +_chem_comp_alias.atom_id +_chem_comp_alias.atom_id_standard +SAM peptide HN1 H +SAM peptide HN2 H2 diff --git a/image_analysis/structure_refinement/monomers/SER.cif b/image_analysis/structure_refinement/monomers/SER.cif new file mode 100644 index 000000000..f16baafc7 --- /dev/null +++ b/image_analysis/structure_refinement/monomers/SER.cif @@ -0,0 +1,188 @@ +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +SER SER SERINE peptide 14 7 . + +data_comp_SER +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +SER N N NT3 1 88.105 -7.500 -9.831 +SER CA C CH1 0 87.822 -7.221 -11.265 +SER C C C 0 88.475 -5.896 -11.689 +SER O O O 0 88.336 -4.918 -10.921 +SER CB C CH2 0 86.337 -7.203 -11.533 +SER OG O OH1 0 85.742 -8.447 -11.190 +SER OXT O OC -1 89.099 -5.887 -12.773 +SER H H H 0 87.553 -7.016 -9.304 +SER H2 H H 0 88.960 -7.295 -9.626 +SER H3 H H 0 87.971 -8.377 -9.665 +SER HA H H 0 88.226 -7.948 -11.803 +SER HB3 H H 0 86.182 -7.019 -12.479 +SER HB2 H H 0 85.923 -6.490 -11.011 +SER HG H H 0 84.904 -8.380 -11.287 + +loop_ +_chem_comp_tree.comp_id +_chem_comp_tree.atom_id +_chem_comp_tree.atom_back +_chem_comp_tree.atom_forward +_chem_comp_tree.connect_type +SER N n/a CA START +SER H N . . +SER H2 N . . +SER H3 N . . +SER CA N C . +SER HA CA . . +SER CB CA OG . +SER HB3 CB . . +SER HB2 CB . . +SER OG CB HG . +SER HG OG . . +SER C CA . END +SER O C . . +SER OXT C . . + +loop_ +_chem_comp_acedrg.comp_id +_chem_comp_acedrg.atom_id +_chem_comp_acedrg.atom_type +SER N N(CCCH)(H)3 +SER CA C(CHHO)(NH3)(COO)(H) +SER C C(CCHN)(O)2 +SER O O(CCO) +SER CB C(CCHN)(OH)(H)2 +SER OG O(CCHH)(H) +SER OXT O(CCO) +SER H H(NCHH) +SER H2 H(NCHH) +SER H3 H(NCHH) +SER HA H(CCCN) +SER HB3 H(CCHO) +SER HB2 H(CCHO) +SER HG H(OC) + +loop_ +_chem_comp_bond.comp_id +_chem_comp_bond.atom_id_1 +_chem_comp_bond.atom_id_2 +_chem_comp_bond.type +_chem_comp_bond.aromatic +_chem_comp_bond.value_dist_nucleus +_chem_comp_bond.value_dist_nucleus_esd +_chem_comp_bond.value_dist +_chem_comp_bond.value_dist_esd +SER N CA SINGLE n 1.487 0.0100 1.487 0.0100 +SER CA C SINGLE n 1.536 0.0100 1.536 0.0100 +SER CA CB SINGLE n 1.508 0.0190 1.508 0.0190 +SER C O DOUBLE n 1.251 0.0183 1.251 0.0183 +SER C OXT SINGLE n 1.251 0.0183 1.251 0.0183 +SER CB OG SINGLE n 1.421 0.0108 1.421 0.0108 +SER N H SINGLE n 1.018 0.0520 0.902 0.0102 +SER N H2 SINGLE n 1.018 0.0520 0.902 0.0102 +SER N H3 SINGLE n 1.018 0.0520 0.902 0.0102 +SER CA HA SINGLE n 1.092 0.0100 0.991 0.0200 +SER CB HB3 SINGLE n 1.092 0.0100 0.976 0.0180 +SER CB HB2 SINGLE n 1.092 0.0100 0.976 0.0180 +SER OG HG SINGLE n 0.972 0.0180 0.846 0.0200 + +loop_ +_chem_comp_angle.comp_id +_chem_comp_angle.atom_id_1 +_chem_comp_angle.atom_id_2 +_chem_comp_angle.atom_id_3 +_chem_comp_angle.value_angle +_chem_comp_angle.value_angle_esd +SER CA N H 109.696 3.00 +SER CA N H2 109.696 3.00 +SER CA N H3 109.696 3.00 +SER H N H2 109.032 3.00 +SER H N H3 109.032 3.00 +SER H2 N H3 109.032 3.00 +SER N CA C 109.839 1.50 +SER N CA CB 111.152 1.50 +SER N CA HA 108.129 1.50 +SER C CA CB 111.300 1.50 +SER C CA HA 108.235 1.50 +SER CB CA HA 108.445 1.50 +SER CA C O 117.199 1.50 +SER CA C OXT 117.189 1.50 +SER O C OXT 125.593 1.50 +SER CA CB OG 110.934 1.86 +SER CA CB HB3 109.238 1.50 +SER CA CB HB2 109.238 1.50 +SER OG CB HB3 109.353 1.50 +SER OG CB HB2 109.353 1.50 +SER HB3 CB HB2 108.095 1.88 +SER CB OG HG 108.539 3.00 + +loop_ +_chem_comp_tor.comp_id +_chem_comp_tor.id +_chem_comp_tor.atom_id_1 +_chem_comp_tor.atom_id_2 +_chem_comp_tor.atom_id_3 +_chem_comp_tor.atom_id_4 +_chem_comp_tor.value_angle +_chem_comp_tor.value_angle_esd +_chem_comp_tor.period +SER chi1 N CA CB OG -60.000 10.0 3 +SER hh1 CA CB OG HG 180.000 10.0 3 +SER sp3_sp3_1 C CA N H 180.000 10.0 3 +SER sp2_sp3_1 O C CA N 0.000 10.0 6 + +loop_ +_chem_comp_chir.comp_id +_chem_comp_chir.id +_chem_comp_chir.atom_id_centre +_chem_comp_chir.atom_id_1 +_chem_comp_chir.atom_id_2 +_chem_comp_chir.atom_id_3 +_chem_comp_chir.volume_sign +SER chir_1 CA N C CB positive + +loop_ +_chem_comp_plane_atom.comp_id +_chem_comp_plane_atom.plane_id +_chem_comp_plane_atom.atom_id +_chem_comp_plane_atom.dist_esd +SER plan-1 C 0.020 +SER plan-1 CA 0.020 +SER plan-1 O 0.020 +SER plan-1 OXT 0.020 + +loop_ +_pdbx_chem_comp_descriptor.comp_id +_pdbx_chem_comp_descriptor.type +_pdbx_chem_comp_descriptor.program +_pdbx_chem_comp_descriptor.program_version +_pdbx_chem_comp_descriptor.descriptor +SER SMILES ACDLabs 10.04 O=C(O)C(N)CO +SER SMILES_CANONICAL CACTVS 3.341 N[C@@H](CO)C(O)=O +SER SMILES CACTVS 3.341 N[CH](CO)C(O)=O +SER SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 C([C@@H](C(=O)O)N)O +SER SMILES "OpenEye OEToolkits" 1.5.0 C(C(C(=O)O)N)O +SER InChI InChI 1.03 InChI=1S/C3H7NO3/c4-2(1-5)3(6)7/h2,5H,1,4H2,(H,6,7)/t2-/m0/s1 +SER InChIKey InChI 1.03 MTCFGRXMJLQNBG-REOHCLBHSA-N + +loop_ +_pdbx_chem_comp_description_generator.comp_id +_pdbx_chem_comp_description_generator.program_name +_pdbx_chem_comp_description_generator.program_version +_pdbx_chem_comp_description_generator.descriptor +SER acedrg 278 "dictionary generator" +SER acedrg_database 12 "data source" +SER rdkit 2019.09.1 "Chemoinformatics tool" +SER refmac5 5.8.0419 "optimization tool" diff --git a/image_analysis/structure_refinement/monomers/SO4.cif b/image_analysis/structure_refinement/monomers/SO4.cif new file mode 100644 index 000000000..1f560acff --- /dev/null +++ b/image_analysis/structure_refinement/monomers/SO4.cif @@ -0,0 +1,86 @@ +# +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +SO4 SO4 "SULFATE ION" NON-POLYMER 5 5 . +# +data_comp_SO4 +# +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +SO4 S S S3 0 16.537 34.975 5.493 +SO4 O1 O O 0 17.831 34.952 4.866 +SO4 O2 O O 0 16.570 35.855 6.629 +SO4 O3 O OS -1 15.557 35.444 4.551 +SO4 O4 O OS -1 16.190 33.647 5.924 +loop_ +_chem_comp_bond.comp_id +_chem_comp_bond.atom_id_1 +_chem_comp_bond.atom_id_2 +_chem_comp_bond.type +_chem_comp_bond.aromatic +_chem_comp_bond.value_dist_nucleus +_chem_comp_bond.value_dist_nucleus_esd +_chem_comp_bond.value_dist +_chem_comp_bond.value_dist_esd +SO4 S O1 DOUBLE n 1.438 0.0156 1.438 0.0156 +SO4 S O2 DOUBLE n 1.438 0.0156 1.438 0.0156 +SO4 S O3 SINGLE n 1.438 0.0156 1.438 0.0156 +SO4 S O4 SINGLE n 1.438 0.0156 1.438 0.0156 +loop_ +_chem_comp_angle.comp_id +_chem_comp_angle.atom_id_1 +_chem_comp_angle.atom_id_2 +_chem_comp_angle.atom_id_3 +_chem_comp_angle.value_angle +_chem_comp_angle.value_angle_esd +SO4 O1 S O2 109.467 1.50 +SO4 O1 S O3 109.467 1.50 +SO4 O1 S O4 109.467 1.50 +SO4 O2 S O3 109.467 1.50 +SO4 O2 S O4 109.467 1.50 +SO4 O3 S O4 109.467 1.50 +loop_ +_chem_comp_chir.comp_id +_chem_comp_chir.id +_chem_comp_chir.atom_id_centre +_chem_comp_chir.atom_id_1 +_chem_comp_chir.atom_id_2 +_chem_comp_chir.atom_id_3 +_chem_comp_chir.volume_sign +SO4 chir_1 S O1 O2 O3 both +loop_ +_pdbx_chem_comp_descriptor.comp_id +_pdbx_chem_comp_descriptor.type +_pdbx_chem_comp_descriptor.program +_pdbx_chem_comp_descriptor.program_version +_pdbx_chem_comp_descriptor.descriptor +SO4 SMILES ACDLabs 10.04 "[O-]S([O-])(=O)=O" +SO4 SMILES_CANONICAL CACTVS 3.341 "[O-][S]([O-])(=O)=O" +SO4 SMILES CACTVS 3.341 "[O-][S]([O-])(=O)=O" +SO4 SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 "[O-]S(=O)(=O)[O-]" +SO4 SMILES "OpenEye OEToolkits" 1.5.0 "[O-]S(=O)(=O)[O-]" +SO4 InChI InChI 1.03 InChI=1S/H2O4S/c1-5(2,3)4/h(H2,1,2,3,4)/p-2 +SO4 InChIKey InChI 1.03 QAOWNCQODCNURD-UHFFFAOYSA-L +loop_ +_pdbx_chem_comp_description_generator.comp_id +_pdbx_chem_comp_description_generator.program_name +_pdbx_chem_comp_description_generator.program_version +_pdbx_chem_comp_description_generator.descriptor +SO4 acedrg 243 "dictionary generator" +SO4 acedrg_database 11 "data source" +SO4 rdkit 2017.03.2 "Chemoinformatics tool" +SO4 refmac5 5.8.0238 "optimization tool" diff --git a/image_analysis/structure_refinement/monomers/THR.cif b/image_analysis/structure_refinement/monomers/THR.cif new file mode 100644 index 000000000..ecef5ae40 --- /dev/null +++ b/image_analysis/structure_refinement/monomers/THR.cif @@ -0,0 +1,208 @@ +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +THR THR THREONINE peptide 17 8 . + +data_comp_THR +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +THR N N NT3 1 36.284 31.964 31.738 +THR CA C CH1 0 35.016 31.199 31.745 +THR C C C 0 34.952 30.333 30.501 +THR O O O 0 35.086 30.909 29.398 +THR CB C CH1 0 33.833 32.166 31.829 +THR OG1 O OH1 0 34.044 32.962 32.993 +THR CG2 C CH3 0 32.493 31.457 31.927 +THR OXT O OC -1 34.770 29.107 30.668 +THR H H H 0 36.319 32.492 31.007 +THR H2 H H 0 36.984 31.395 31.731 +THR H3 H H 0 36.331 32.480 32.477 +THR HA H H 0 35.006 30.619 32.537 +THR HB H H 0 33.830 32.749 31.033 +THR HG1 H H 0 34.002 32.475 33.707 +THR HG21 H H 0 32.588 30.657 32.470 +THR HG22 H H 0 32.191 31.210 31.037 +THR HG23 H H 0 31.841 32.050 32.336 + +loop_ +_chem_comp_tree.comp_id +_chem_comp_tree.atom_id +_chem_comp_tree.atom_back +_chem_comp_tree.atom_forward +_chem_comp_tree.connect_type +THR N n/a CA START +THR H N . . +THR H2 N . . +THR H3 N . . +THR CA N C . +THR HA CA . . +THR CB CA CG2 . +THR HB CB . . +THR OG1 CB HG1 . +THR HG1 OG1 . . +THR CG2 CB HG23 . +THR HG21 CG2 . . +THR HG22 CG2 . . +THR HG23 CG2 . . +THR C CA . END +THR O C . . +THR OXT C . . + +loop_ +_chem_comp_acedrg.comp_id +_chem_comp_acedrg.atom_id +_chem_comp_acedrg.atom_type +THR N N(CCCH)(H)3 +THR CA C(CCHO)(NH3)(COO)(H) +THR C C(CCHN)(O)2 +THR O O(CCO) +THR CB C(CCHN)(CH3)(OH)(H) +THR OG1 O(CCCH)(H) +THR CG2 C(CCHO)(H)3 +THR OXT O(CCO) +THR H H(NCHH) +THR H2 H(NCHH) +THR H3 H(NCHH) +THR HA H(CCCN) +THR HB H(CCCO) +THR HG1 H(OC) +THR HG21 H(CCHH) +THR HG22 H(CCHH) +THR HG23 H(CCHH) + +loop_ +_chem_comp_bond.comp_id +_chem_comp_bond.atom_id_1 +_chem_comp_bond.atom_id_2 +_chem_comp_bond.type +_chem_comp_bond.aromatic +_chem_comp_bond.value_dist_nucleus +_chem_comp_bond.value_dist_nucleus_esd +_chem_comp_bond.value_dist +_chem_comp_bond.value_dist_esd +THR N CA SINGLE n 1.480 0.0122 1.480 0.0122 +THR CA C SINGLE n 1.515 0.0129 1.515 0.0129 +THR CA CB SINGLE n 1.528 0.0100 1.528 0.0100 +THR C O DOUBLE n 1.251 0.0183 1.251 0.0183 +THR C OXT SINGLE n 1.251 0.0183 1.251 0.0183 +THR CB OG1 SINGLE n 1.424 0.0100 1.424 0.0100 +THR CB CG2 SINGLE n 1.518 0.0100 1.518 0.0100 +THR N H SINGLE n 1.018 0.0520 0.902 0.0102 +THR N H2 SINGLE n 1.018 0.0520 0.902 0.0102 +THR N H3 SINGLE n 1.018 0.0520 0.902 0.0102 +THR CA HA SINGLE n 1.092 0.0100 0.982 0.0200 +THR CB HB SINGLE n 1.092 0.0100 0.987 0.0100 +THR OG1 HG1 SINGLE n 0.972 0.0180 0.864 0.0200 +THR CG2 HG21 SINGLE n 1.092 0.0100 0.972 0.0156 +THR CG2 HG22 SINGLE n 1.092 0.0100 0.972 0.0156 +THR CG2 HG23 SINGLE n 1.092 0.0100 0.972 0.0156 + +loop_ +_chem_comp_angle.comp_id +_chem_comp_angle.atom_id_1 +_chem_comp_angle.atom_id_2 +_chem_comp_angle.atom_id_3 +_chem_comp_angle.value_angle +_chem_comp_angle.value_angle_esd +THR CA N H 109.577 1.50 +THR CA N H2 109.577 1.50 +THR CA N H3 109.577 1.50 +THR H N H2 109.032 3.00 +THR H N H3 109.032 3.00 +THR H2 N H3 109.032 3.00 +THR N CA C 109.121 1.50 +THR N CA CB 109.645 1.84 +THR N CA HA 108.639 1.50 +THR C CA CB 111.778 1.58 +THR C CA HA 109.055 1.50 +THR CB CA HA 108.870 1.50 +THR CA C O 117.098 1.50 +THR CA C OXT 117.098 1.50 +THR O C OXT 125.804 1.50 +THR CA CB OG1 105.245 3.00 +THR CA CB CG2 112.544 1.50 +THR CA CB HB 109.595 2.39 +THR OG1 CB CG2 109.974 3.00 +THR OG1 CB HB 109.323 1.86 +THR CG2 CB HB 109.170 2.61 +THR CB OG1 HG1 109.544 3.00 +THR CB CG2 HG21 109.532 1.50 +THR CB CG2 HG22 109.532 1.50 +THR CB CG2 HG23 109.532 1.50 +THR HG21 CG2 HG22 109.425 1.50 +THR HG21 CG2 HG23 109.425 1.50 +THR HG22 CG2 HG23 109.425 1.50 + +loop_ +_chem_comp_tor.comp_id +_chem_comp_tor.id +_chem_comp_tor.atom_id_1 +_chem_comp_tor.atom_id_2 +_chem_comp_tor.atom_id_3 +_chem_comp_tor.atom_id_4 +_chem_comp_tor.value_angle +_chem_comp_tor.value_angle_esd +_chem_comp_tor.period +THR chi1 N CA CB CG2 -60.000 10.0 3 +THR hh1 CA CB OG1 HG1 -60.000 10.0 3 +THR hh2 CA CB CG2 HG23 -60.000 10.0 3 +THR sp3_sp3_1 C CA N H 180.000 10.0 3 +THR sp2_sp3_1 O C CA N 0.000 10.0 6 + +loop_ +_chem_comp_chir.comp_id +_chem_comp_chir.id +_chem_comp_chir.atom_id_centre +_chem_comp_chir.atom_id_1 +_chem_comp_chir.atom_id_2 +_chem_comp_chir.atom_id_3 +_chem_comp_chir.volume_sign +THR chir_1 CA N C CB positive +THR chir_2 CB OG1 CA CG2 negative + +loop_ +_chem_comp_plane_atom.comp_id +_chem_comp_plane_atom.plane_id +_chem_comp_plane_atom.atom_id +_chem_comp_plane_atom.dist_esd +THR plan-1 C 0.020 +THR plan-1 CA 0.020 +THR plan-1 O 0.020 +THR plan-1 OXT 0.020 + +loop_ +_pdbx_chem_comp_descriptor.comp_id +_pdbx_chem_comp_descriptor.type +_pdbx_chem_comp_descriptor.program +_pdbx_chem_comp_descriptor.program_version +_pdbx_chem_comp_descriptor.descriptor +THR SMILES ACDLabs 10.04 O=C(O)C(N)C(O)C +THR SMILES_CANONICAL CACTVS 3.341 C[C@@H](O)[C@H](N)C(O)=O +THR SMILES CACTVS 3.341 C[CH](O)[CH](N)C(O)=O +THR SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 C[C@H]([C@@H](C(=O)O)N)O +THR SMILES "OpenEye OEToolkits" 1.5.0 CC(C(C(=O)O)N)O +THR InChI InChI 1.03 InChI=1S/C4H9NO3/c1-2(6)3(5)4(7)8/h2-3,6H,5H2,1H3,(H,7,8)/t2-,3+/m1/s1 +THR InChIKey InChI 1.03 AYFVYJQAPQTCCC-GBXIJSLDSA-N + +loop_ +_pdbx_chem_comp_description_generator.comp_id +_pdbx_chem_comp_description_generator.program_name +_pdbx_chem_comp_description_generator.program_version +_pdbx_chem_comp_description_generator.descriptor +THR acedrg 278 "dictionary generator" +THR acedrg_database 12 "data source" +THR rdkit 2019.09.1 "Chemoinformatics tool" +THR refmac5 5.8.0419 "optimization tool" diff --git a/image_analysis/structure_refinement/monomers/TRP.cif b/image_analysis/structure_refinement/monomers/TRP.cif new file mode 100644 index 000000000..8c24a618c --- /dev/null +++ b/image_analysis/structure_refinement/monomers/TRP.cif @@ -0,0 +1,301 @@ +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +TRP TRP TRYPTOPHAN peptide 27 15 . + +data_comp_TRP +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +TRP N N NT3 1 75.046 60.221 32.550 +TRP CA C CH1 0 74.659 61.570 32.056 +TRP C C C 0 73.758 61.438 30.822 +TRP O O O 0 72.787 62.222 30.736 +TRP CB C CH2 0 75.903 62.411 31.737 +TRP CG C CR5 0 76.760 62.727 32.935 +TRP CD1 C CR15 0 77.836 62.019 33.383 +TRP CD2 C CR56 0 76.605 63.839 33.843 +TRP NE1 N NR15 0 78.364 62.608 34.501 +TRP CE2 C CR56 0 77.632 63.725 34.809 +TRP CE3 C CR16 0 75.707 64.913 33.936 +TRP CZ2 C CR16 0 77.780 64.645 35.849 +TRP CZ3 C CR16 0 75.854 65.821 34.965 +TRP CH2 C CR16 0 76.878 65.687 35.909 +TRP OXT O OC -1 74.059 60.555 29.988 +TRP H H H 0 75.680 59.865 32.016 +TRP H2 H H 0 74.332 59.671 32.560 +TRP H3 H H 0 75.369 60.277 33.391 +TRP HA H H 0 74.147 62.030 32.775 +TRP HB3 H H 0 75.613 63.253 31.325 +TRP HB2 H H 0 76.446 61.928 31.078 +TRP HD1 H H 0 78.177 61.234 32.984 +TRP HE1 H H 0 79.056 62.317 34.946 +TRP HE3 H H 0 75.014 65.011 33.305 +TRP HZ2 H H 0 78.468 64.556 36.485 +TRP HZ3 H H 0 75.254 66.545 35.034 +TRP HH2 H H 0 76.954 66.321 36.599 + +loop_ +_chem_comp_tree.comp_id +_chem_comp_tree.atom_id +_chem_comp_tree.atom_back +_chem_comp_tree.atom_forward +_chem_comp_tree.connect_type +TRP N n/a CA START +TRP H N . . +TRP H2 N . . +TRP H3 N . . +TRP CA N C . +TRP HA CA . . +TRP CB CA CG . +TRP HB3 CB . . +TRP HB2 CB . . +TRP CG CB CD1 . +TRP CD1 CG NE1 . +TRP HD1 CD1 . . +TRP NE1 CD1 CE2 . +TRP HE1 NE1 . . +TRP CE2 NE1 CD2 . +TRP CD2 CE2 CE3 . +TRP CE3 CD2 CZ3 . +TRP HE3 CE3 . . +TRP CZ3 CE3 CH2 . +TRP HZ3 CZ3 . . +TRP CH2 CZ3 CZ2 . +TRP HH2 CH2 . . +TRP CZ2 CH2 HZ2 . +TRP HZ2 CZ2 . . +TRP C CA . END +TRP O C . . +TRP OXT C . . +TRP CD2 CG . ADD + +loop_ +_chem_comp_acedrg.comp_id +_chem_comp_acedrg.atom_id +_chem_comp_acedrg.atom_type +TRP N N(CCCH)(H)3 +TRP CA C(CC[5a]HH)(NH3)(COO)(H) +TRP C C(CCHN)(O)2 +TRP O O(CCO) +TRP CB C(C[5a]C[5a,6a]C[5a])(CCHN)(H)2 +TRP CG C[5a](C[5a,6a]C[5a,6a]C[6a])(C[5a]N[5a]H)(CCHH){2|C<3>,2|H<1>} +TRP CD1 C[5a](C[5a]C[5a,6a]C)(N[5a]C[5a,6a]H)(H){2|C<3>} +TRP CD2 C[5a,6a](C[5a,6a]C[6a]N[5a])(C[5a]C[5a]C)(C[6a]C[6a]H){1|C<3>,4|H<1>} +TRP NE1 N[5a](C[5a,6a]C[5a,6a]C[6a])(C[5a]C[5a]H)(H){1|C<4>,1|H<1>,2|C<3>} +TRP CE2 C[5a,6a](C[5a,6a]C[5a]C[6a])(C[6a]C[6a]H)(N[5a]C[5a]H){1|C<3>,1|C<4>,3|H<1>} +TRP CE3 C[6a](C[5a,6a]C[5a,6a]C[5a])(C[6a]C[6a]H)(H){1|C<4>,1|H<1>,1|N<3>,2|C<3>} +TRP CZ2 C[6a](C[5a,6a]C[5a,6a]N[5a])(C[6a]C[6a]H)(H){2|H<1>,3|C<3>} +TRP CZ3 C[6a](C[6a]C[5a,6a]H)(C[6a]C[6a]H)(H){1|H<1>,2|C<3>} +TRP CH2 C[6a](C[6a]C[5a,6a]H)(C[6a]C[6a]H)(H){1|C<3>,1|H<1>,1|N<3>} +TRP OXT O(CCO) +TRP H H(NCHH) +TRP H2 H(NCHH) +TRP H3 H(NCHH) +TRP HA H(CCCN) +TRP HB3 H(CC[5a]CH) +TRP HB2 H(CC[5a]CH) +TRP HD1 H(C[5a]C[5a]N[5a]) +TRP HE1 H(N[5a]C[5a,6a]C[5a]) +TRP HE3 H(C[6a]C[5a,6a]C[6a]) +TRP HZ2 H(C[6a]C[5a,6a]C[6a]) +TRP HZ3 H(C[6a]C[6a]2) +TRP HH2 H(C[6a]C[6a]2) + +loop_ +_chem_comp_bond.comp_id +_chem_comp_bond.atom_id_1 +_chem_comp_bond.atom_id_2 +_chem_comp_bond.type +_chem_comp_bond.aromatic +_chem_comp_bond.value_dist_nucleus +_chem_comp_bond.value_dist_nucleus_esd +_chem_comp_bond.value_dist +_chem_comp_bond.value_dist_esd +TRP N CA SINGLE n 1.486 0.0100 1.486 0.0100 +TRP CA C SINGLE n 1.532 0.0129 1.532 0.0129 +TRP CA CB SINGLE n 1.535 0.0100 1.535 0.0100 +TRP C O DOUBLE n 1.251 0.0183 1.251 0.0183 +TRP C OXT SINGLE n 1.251 0.0183 1.251 0.0183 +TRP CB CG SINGLE n 1.506 0.0100 1.506 0.0100 +TRP CG CD1 DOUBLE y 1.364 0.0100 1.364 0.0100 +TRP CG CD2 SINGLE y 1.445 0.0100 1.445 0.0100 +TRP CD1 NE1 SINGLE y 1.369 0.0100 1.369 0.0100 +TRP CD2 CE2 DOUBLE y 1.412 0.0100 1.412 0.0100 +TRP CD2 CE3 SINGLE y 1.399 0.0100 1.399 0.0100 +TRP NE1 CE2 SINGLE y 1.370 0.0100 1.370 0.0100 +TRP CE2 CZ2 SINGLE y 1.393 0.0100 1.393 0.0100 +TRP CE3 CZ3 DOUBLE y 1.377 0.0100 1.377 0.0100 +TRP CZ2 CH2 DOUBLE y 1.376 0.0101 1.376 0.0101 +TRP CZ3 CH2 SINGLE y 1.394 0.0120 1.394 0.0120 +TRP N H SINGLE n 1.018 0.0520 0.902 0.0102 +TRP N H2 SINGLE n 1.018 0.0520 0.902 0.0102 +TRP N H3 SINGLE n 1.018 0.0520 0.902 0.0102 +TRP CA HA SINGLE n 1.092 0.0100 0.995 0.0200 +TRP CB HB3 SINGLE n 1.092 0.0100 0.981 0.0100 +TRP CB HB2 SINGLE n 1.092 0.0100 0.981 0.0100 +TRP CD1 HD1 SINGLE n 1.085 0.0150 0.944 0.0195 +TRP NE1 HE1 SINGLE n 1.013 0.0120 0.873 0.0200 +TRP CE3 HE3 SINGLE n 1.085 0.0150 0.942 0.0199 +TRP CZ2 HZ2 SINGLE n 1.085 0.0150 0.942 0.0181 +TRP CZ3 HZ3 SINGLE n 1.085 0.0150 0.943 0.0167 +TRP CH2 HH2 SINGLE n 1.085 0.0150 0.941 0.0176 + +loop_ +_chem_comp_angle.comp_id +_chem_comp_angle.atom_id_1 +_chem_comp_angle.atom_id_2 +_chem_comp_angle.atom_id_3 +_chem_comp_angle.value_angle +_chem_comp_angle.value_angle_esd +TRP CA N H 109.786 3.00 +TRP CA N H2 109.786 3.00 +TRP CA N H3 109.786 3.00 +TRP H N H2 109.032 3.00 +TRP H N H3 109.032 3.00 +TRP H2 N H3 109.032 3.00 +TRP N CA C 109.790 1.50 +TRP N CA CB 110.346 1.50 +TRP N CA HA 108.404 1.50 +TRP C CA CB 111.156 1.50 +TRP C CA HA 108.682 1.50 +TRP CB CA HA 108.429 1.50 +TRP CA C O 117.155 2.01 +TRP CA C OXT 117.155 2.01 +TRP O C OXT 125.691 1.50 +TRP CA CB CG 113.870 1.50 +TRP CA CB HB3 108.522 1.50 +TRP CA CB HB2 108.522 1.50 +TRP CG CB HB3 108.877 1.50 +TRP CG CB HB2 108.877 1.50 +TRP HB3 CB HB2 107.959 3.00 +TRP CB CG CD1 126.940 2.13 +TRP CB CG CD2 126.837 1.66 +TRP CD1 CG CD2 106.223 1.50 +TRP CG CD1 NE1 110.303 1.50 +TRP CG CD1 HD1 125.325 2.99 +TRP NE1 CD1 HD1 124.372 1.81 +TRP CG CD2 CE2 106.978 1.50 +TRP CG CD2 CE3 134.327 1.50 +TRP CE2 CD2 CE3 118.695 1.50 +TRP CD1 NE1 CE2 109.057 1.50 +TRP CD1 NE1 HE1 125.366 3.00 +TRP CE2 NE1 HE1 125.577 3.00 +TRP CD2 CE2 NE1 107.438 1.50 +TRP CD2 CE2 CZ2 122.273 1.50 +TRP NE1 CE2 CZ2 130.289 1.50 +TRP CD2 CE3 CZ3 118.811 1.50 +TRP CD2 CE3 HE3 120.479 1.50 +TRP CZ3 CE3 HE3 120.709 1.50 +TRP CE2 CZ2 CH2 117.418 1.50 +TRP CE2 CZ2 HZ2 121.196 1.50 +TRP CH2 CZ2 HZ2 121.386 1.50 +TRP CE3 CZ3 CH2 121.228 1.50 +TRP CE3 CZ3 HZ3 119.424 1.50 +TRP CH2 CZ3 HZ3 119.348 1.50 +TRP CZ2 CH2 CZ3 121.574 1.50 +TRP CZ2 CH2 HH2 119.154 1.50 +TRP CZ3 CH2 HH2 119.272 1.50 + +loop_ +_chem_comp_tor.comp_id +_chem_comp_tor.id +_chem_comp_tor.atom_id_1 +_chem_comp_tor.atom_id_2 +_chem_comp_tor.atom_id_3 +_chem_comp_tor.atom_id_4 +_chem_comp_tor.value_angle +_chem_comp_tor.value_angle_esd +_chem_comp_tor.period +TRP chi1 N CA CB CG -60.000 10.0 3 +TRP chi2 CA CB CG CD1 90.000 10.0 6 +TRP CONST_1 CB CG CD1 NE1 0.000 0.0 1 +TRP CONST_2 CG CD1 NE1 CE2 0.000 0.0 1 +TRP CONST_3 NE1 CE2 CD2 CE3 0.000 0.0 1 +TRP CONST_4 CE2 CD2 CE3 CZ3 0.000 0.0 1 +TRP CONST_5 CD1 NE1 CE2 CD2 0.000 0.0 1 +TRP CONST_6 CD2 CE3 CZ3 CH2 0.000 0.0 1 +TRP CONST_7 CZ3 CH2 CZ2 CE2 0.000 0.0 1 +TRP CONST_8 CE3 CZ3 CH2 CZ2 0.000 0.0 1 +TRP sp3_sp3_1 C CA N H 180.000 10.0 3 +TRP const_33 CE2 CD2 CG CD1 0.000 0.0 1 +TRP const_17 CD2 CE2 CZ2 CH2 0.000 0.0 1 +TRP sp2_sp3_1 O C CA N 0.000 10.0 6 + +loop_ +_chem_comp_chir.comp_id +_chem_comp_chir.id +_chem_comp_chir.atom_id_centre +_chem_comp_chir.atom_id_1 +_chem_comp_chir.atom_id_2 +_chem_comp_chir.atom_id_3 +_chem_comp_chir.volume_sign +TRP chir_1 CA N C CB positive + +loop_ +_chem_comp_plane_atom.comp_id +_chem_comp_plane_atom.plane_id +_chem_comp_plane_atom.atom_id +_chem_comp_plane_atom.dist_esd +TRP plan-1 CD2 0.020 +TRP plan-1 CE2 0.020 +TRP plan-1 CE3 0.020 +TRP plan-1 CG 0.020 +TRP plan-1 CH2 0.020 +TRP plan-1 CZ2 0.020 +TRP plan-1 CZ3 0.020 +TRP plan-1 HE3 0.020 +TRP plan-1 HH2 0.020 +TRP plan-1 HZ2 0.020 +TRP plan-1 HZ3 0.020 +TRP plan-1 NE1 0.020 +TRP plan-2 CB 0.020 +TRP plan-2 CD1 0.020 +TRP plan-2 CD2 0.020 +TRP plan-2 CE2 0.020 +TRP plan-2 CE3 0.020 +TRP plan-2 CG 0.020 +TRP plan-2 CZ2 0.020 +TRP plan-2 HD1 0.020 +TRP plan-2 HE1 0.020 +TRP plan-2 NE1 0.020 +TRP plan-3 C 0.020 +TRP plan-3 CA 0.020 +TRP plan-3 O 0.020 +TRP plan-3 OXT 0.020 + +loop_ +_pdbx_chem_comp_descriptor.comp_id +_pdbx_chem_comp_descriptor.type +_pdbx_chem_comp_descriptor.program +_pdbx_chem_comp_descriptor.program_version +_pdbx_chem_comp_descriptor.descriptor +TRP SMILES ACDLabs 10.04 "O=C(O)C(N)Cc2c1ccccc1nc2" +TRP SMILES_CANONICAL CACTVS 3.341 "N[C@@H](Cc1c[nH]c2ccccc12)C(O)=O" +TRP SMILES CACTVS 3.341 "N[CH](Cc1c[nH]c2ccccc12)C(O)=O" +TRP SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 "c1ccc2c(c1)c(c[nH]2)C[C@@H](C(=O)O)N" +TRP SMILES "OpenEye OEToolkits" 1.5.0 "c1ccc2c(c1)c(c[nH]2)CC(C(=O)O)N" +TRP InChI InChI 1.03 "InChI=1S/C11H12N2O2/c12-9(11(14)15)5-7-6-13-10-4-2-1-3-8(7)10/h1-4,6,9,13H,5,12H2,(H,14,15)/t9-/m0/s1" +TRP InChIKey InChI 1.03 QIVBCDIJIAJPQS-VIFPVBQESA-N + +loop_ +_pdbx_chem_comp_description_generator.comp_id +_pdbx_chem_comp_description_generator.program_name +_pdbx_chem_comp_description_generator.program_version +_pdbx_chem_comp_description_generator.descriptor +TRP acedrg 278 "dictionary generator" +TRP acedrg_database 12 "data source" +TRP rdkit 2019.09.1 "Chemoinformatics tool" +TRP refmac5 5.8.0419 "optimization tool" diff --git a/image_analysis/structure_refinement/monomers/TYR.cif b/image_analysis/structure_refinement/monomers/TYR.cif new file mode 100644 index 000000000..f1a4e5bee --- /dev/null +++ b/image_analysis/structure_refinement/monomers/TYR.cif @@ -0,0 +1,268 @@ +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +TYR TYR TYROSINE peptide 24 13 . + +data_comp_TYR +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +TYR N N NT3 1 5.311 5.160 15.589 +TYR CA C CH1 0 5.358 6.374 16.456 +TYR C C C 0 4.823 7.578 15.662 +TYR O O O 0 3.988 8.305 16.245 +TYR CB C CH2 0 6.763 6.679 16.994 +TYR CG C CR6 0 7.348 5.630 17.938 +TYR CD1 C CR16 0 7.096 5.672 19.314 +TYR CD2 C CR16 0 8.161 4.597 17.458 +TYR CE1 C CR16 0 7.628 4.720 20.176 +TYR CE2 C CR16 0 8.697 3.641 18.313 +TYR CZ C CR6 0 8.431 3.702 19.674 +TYR OH O OH1 0 8.982 2.738 20.476 +TYR OXT O OC -1 5.248 7.759 14.496 +TYR H H H 0 5.552 4.421 16.046 +TYR H2 H H 0 5.856 5.257 14.876 +TYR H3 H H 0 4.470 5.038 15.288 +TYR HA H H 0 4.756 6.220 17.232 +TYR HB3 H H 0 6.733 7.543 17.464 +TYR HB2 H H 0 7.369 6.788 16.227 +TYR HD1 H H 0 6.552 6.358 19.667 +TYR HD2 H H 0 8.350 4.543 16.534 +TYR HE1 H H 0 7.444 4.765 21.099 +TYR HE2 H H 0 9.240 2.953 17.971 +TYR HH H H 0 8.782 2.828 21.308 + +loop_ +_chem_comp_tree.comp_id +_chem_comp_tree.atom_id +_chem_comp_tree.atom_back +_chem_comp_tree.atom_forward +_chem_comp_tree.connect_type +TYR N n/a CA START +TYR H N . . +TYR H2 N . . +TYR H3 N . . +TYR CA N C . +TYR HA CA . . +TYR CB CA CG . +TYR HB3 CB . . +TYR HB2 CB . . +TYR CG CB CD1 . +TYR CD1 CG CE1 . +TYR HD1 CD1 . . +TYR CE1 CD1 CZ . +TYR HE1 CE1 . . +TYR CZ CE1 CE2 . +TYR OH CZ HH . +TYR HH OH . . +TYR CE2 CZ CD2 . +TYR HE2 CE2 . . +TYR CD2 CE2 HD2 . +TYR HD2 CD2 . . +TYR C CA . END +TYR O C . . +TYR OXT C . . +TYR CD2 CG . ADD + +loop_ +_chem_comp_acedrg.comp_id +_chem_comp_acedrg.atom_id +_chem_comp_acedrg.atom_type +TYR N N(CCCH)(H)3 +TYR CA C(CC[6a]HH)(NH3)(COO)(H) +TYR C C(CCHN)(O)2 +TYR O O(CCO) +TYR CB C(C[6a]C[6a]2)(CCHN)(H)2 +TYR CG C[6a](C[6a]C[6a]H)2(CCHH){1|C<3>,2|H<1>} +TYR CD1 C[6a](C[6a]C[6a]C)(C[6a]C[6a]H)(H){1|C<3>,1|H<1>,1|O<2>} +TYR CD2 C[6a](C[6a]C[6a]C)(C[6a]C[6a]H)(H){1|C<3>,1|H<1>,1|O<2>} +TYR CE1 C[6a](C[6a]C[6a]H)(C[6a]C[6a]O)(H){1|C<3>,1|C<4>,1|H<1>} +TYR CE2 C[6a](C[6a]C[6a]H)(C[6a]C[6a]O)(H){1|C<3>,1|C<4>,1|H<1>} +TYR CZ C[6a](C[6a]C[6a]H)2(OH){1|C<3>,2|H<1>} +TYR OH O(C[6a]C[6a]2)(H) +TYR OXT O(CCO) +TYR H H(NCHH) +TYR H2 H(NCHH) +TYR H3 H(NCHH) +TYR HA H(CCCN) +TYR HB3 H(CC[6a]CH) +TYR HB2 H(CC[6a]CH) +TYR HD1 H(C[6a]C[6a]2) +TYR HD2 H(C[6a]C[6a]2) +TYR HE1 H(C[6a]C[6a]2) +TYR HE2 H(C[6a]C[6a]2) +TYR HH H(OC[6a]) + +loop_ +_chem_comp_bond.comp_id +_chem_comp_bond.atom_id_1 +_chem_comp_bond.atom_id_2 +_chem_comp_bond.type +_chem_comp_bond.aromatic +_chem_comp_bond.value_dist_nucleus +_chem_comp_bond.value_dist_nucleus_esd +_chem_comp_bond.value_dist +_chem_comp_bond.value_dist_esd +TYR N CA SINGLE n 1.489 0.0100 1.489 0.0100 +TYR CA C SINGLE n 1.531 0.0171 1.531 0.0171 +TYR CA CB SINGLE n 1.532 0.0100 1.532 0.0100 +TYR C O DOUBLE n 1.251 0.0183 1.251 0.0183 +TYR C OXT SINGLE n 1.251 0.0183 1.251 0.0183 +TYR CB CG SINGLE n 1.523 0.0100 1.523 0.0100 +TYR CG CD1 DOUBLE y 1.390 0.0116 1.390 0.0116 +TYR CG CD2 SINGLE y 1.390 0.0116 1.390 0.0116 +TYR CD1 CE1 SINGLE y 1.385 0.0100 1.385 0.0100 +TYR CD2 CE2 DOUBLE y 1.385 0.0100 1.385 0.0100 +TYR CE1 CZ DOUBLE y 1.383 0.0100 1.383 0.0100 +TYR CE2 CZ SINGLE y 1.383 0.0100 1.383 0.0100 +TYR CZ OH SINGLE n 1.365 0.0137 1.365 0.0137 +TYR N H SINGLE n 1.018 0.0520 0.902 0.0102 +TYR N H2 SINGLE n 1.018 0.0520 0.902 0.0102 +TYR N H3 SINGLE n 1.018 0.0520 0.902 0.0102 +TYR CA HA SINGLE n 1.092 0.0100 0.994 0.0200 +TYR CB HB3 SINGLE n 1.092 0.0100 0.983 0.0163 +TYR CB HB2 SINGLE n 1.092 0.0100 0.983 0.0163 +TYR CD1 HD1 SINGLE n 1.085 0.0150 0.944 0.0143 +TYR CD2 HD2 SINGLE n 1.085 0.0150 0.944 0.0143 +TYR CE1 HE1 SINGLE n 1.085 0.0150 0.942 0.0174 +TYR CE2 HE2 SINGLE n 1.085 0.0150 0.942 0.0174 +TYR OH HH SINGLE n 0.966 0.0059 0.858 0.0200 + +loop_ +_chem_comp_angle.comp_id +_chem_comp_angle.atom_id_1 +_chem_comp_angle.atom_id_2 +_chem_comp_angle.atom_id_3 +_chem_comp_angle.value_angle +_chem_comp_angle.value_angle_esd +TYR CA N H 109.791 3.00 +TYR CA N H2 109.791 3.00 +TYR CA N H3 109.791 3.00 +TYR H N H2 109.032 3.00 +TYR H N H3 109.032 3.00 +TYR H2 N H3 109.032 3.00 +TYR N CA C 109.085 1.50 +TYR N CA CB 109.965 3.00 +TYR N CA HA 108.547 1.50 +TYR C CA CB 111.980 3.00 +TYR C CA HA 108.746 1.50 +TYR CB CA HA 108.686 1.50 +TYR CA C O 117.219 3.00 +TYR CA C OXT 117.219 3.00 +TYR O C OXT 125.562 1.50 +TYR CA CB CG 114.693 2.05 +TYR CA CB HB3 108.494 1.50 +TYR CA CB HB2 108.494 1.50 +TYR CG CB HB3 108.859 1.50 +TYR CG CB HB2 108.859 1.50 +TYR HB3 CB HB2 107.843 2.16 +TYR CB CG CD1 121.060 1.50 +TYR CB CG CD2 121.060 1.50 +TYR CD1 CG CD2 117.879 1.50 +TYR CG CD1 CE1 121.468 1.50 +TYR CG CD1 HD1 119.327 1.50 +TYR CE1 CD1 HD1 119.205 1.50 +TYR CG CD2 CE2 121.468 1.50 +TYR CG CD2 HD2 119.327 1.50 +TYR CE2 CD2 HD2 119.205 1.50 +TYR CD1 CE1 CZ 119.794 1.50 +TYR CD1 CE1 HE1 120.177 1.50 +TYR CZ CE1 HE1 120.029 1.50 +TYR CD2 CE2 CZ 119.794 1.50 +TYR CD2 CE2 HE2 120.177 1.50 +TYR CZ CE2 HE2 120.029 1.50 +TYR CE1 CZ CE2 119.597 1.50 +TYR CE1 CZ OH 120.202 3.00 +TYR CE2 CZ OH 120.202 3.00 +TYR CZ OH HH 109.970 3.00 + +loop_ +_chem_comp_tor.comp_id +_chem_comp_tor.id +_chem_comp_tor.atom_id_1 +_chem_comp_tor.atom_id_2 +_chem_comp_tor.atom_id_3 +_chem_comp_tor.atom_id_4 +_chem_comp_tor.value_angle +_chem_comp_tor.value_angle_esd +_chem_comp_tor.period +TYR chi1 N CA CB CG -60.000 10.0 3 +TYR chi2 CA CB CG CD1 90.000 10.0 6 +TYR CONST_1 CB CG CD1 CE1 0.000 0.0 1 +TYR CONST_2 CG CD1 CE1 CZ 0.000 0.0 1 +TYR CONST_3 CZ CE2 CD2 CG 0.000 0.0 1 +TYR CONST_4 CD1 CE1 CZ CE2 0.000 0.0 1 +TYR CONST_5 CE1 CZ CE2 CD2 0.000 0.0 1 +TYR hh1 CE1 CZ OH HH 0.000 5.0 2 +TYR sp3_sp3_1 C CA N H 180.000 10.0 3 +TYR const_21 CE2 CD2 CG CD1 0.000 0.0 1 +TYR sp2_sp3_1 O C CA N 0.000 10.0 6 + +loop_ +_chem_comp_chir.comp_id +_chem_comp_chir.id +_chem_comp_chir.atom_id_centre +_chem_comp_chir.atom_id_1 +_chem_comp_chir.atom_id_2 +_chem_comp_chir.atom_id_3 +_chem_comp_chir.volume_sign +TYR chir_1 CA N C CB positive + +loop_ +_chem_comp_plane_atom.comp_id +_chem_comp_plane_atom.plane_id +_chem_comp_plane_atom.atom_id +_chem_comp_plane_atom.dist_esd +TYR plan-1 CB 0.020 +TYR plan-1 CD1 0.020 +TYR plan-1 CD2 0.020 +TYR plan-1 CE1 0.020 +TYR plan-1 CE2 0.020 +TYR plan-1 CG 0.020 +TYR plan-1 CZ 0.020 +TYR plan-1 HD1 0.020 +TYR plan-1 HD2 0.020 +TYR plan-1 HE1 0.020 +TYR plan-1 HE2 0.020 +TYR plan-1 OH 0.020 +TYR plan-2 C 0.020 +TYR plan-2 CA 0.020 +TYR plan-2 O 0.020 +TYR plan-2 OXT 0.020 + +loop_ +_pdbx_chem_comp_descriptor.comp_id +_pdbx_chem_comp_descriptor.type +_pdbx_chem_comp_descriptor.program +_pdbx_chem_comp_descriptor.program_version +_pdbx_chem_comp_descriptor.descriptor +TYR SMILES ACDLabs 10.04 "O=C(O)C(N)Cc1ccc(O)cc1" +TYR SMILES_CANONICAL CACTVS 3.341 "N[C@@H](Cc1ccc(O)cc1)C(O)=O" +TYR SMILES CACTVS 3.341 "N[CH](Cc1ccc(O)cc1)C(O)=O" +TYR SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 "c1cc(ccc1C[C@@H](C(=O)O)N)O" +TYR SMILES "OpenEye OEToolkits" 1.5.0 "c1cc(ccc1CC(C(=O)O)N)O" +TYR InChI InChI 1.03 "InChI=1S/C9H11NO3/c10-8(9(12)13)5-6-1-3-7(11)4-2-6/h1-4,8,11H,5,10H2,(H,12,13)/t8-/m0/s1" +TYR InChIKey InChI 1.03 OUYCCCASQSFEME-QMMMGPOBSA-N + +loop_ +_pdbx_chem_comp_description_generator.comp_id +_pdbx_chem_comp_description_generator.program_name +_pdbx_chem_comp_description_generator.program_version +_pdbx_chem_comp_description_generator.descriptor +TYR acedrg 278 "dictionary generator" +TYR acedrg_database 12 "data source" +TYR rdkit 2019.09.1 "Chemoinformatics tool" +TYR refmac5 5.8.0419 "optimization tool" +TYR servalcat 0.4.57 'optimization tool' diff --git a/image_analysis/structure_refinement/monomers/U.cif b/image_analysis/structure_refinement/monomers/U.cif new file mode 100644 index 000000000..608cab6db --- /dev/null +++ b/image_analysis/structure_refinement/monomers/U.cif @@ -0,0 +1,248 @@ +# +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +U U "URIDINE-5'-MONOPHOSPHATE" RNA 32 21 . +# +data_comp_U +# +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +U OP3 O OP -1 28.643 1.174 0.256 +U P P P 0 28.819 1.986 -1.013 +U OP1 O O 0 28.329 1.258 -2.251 +U OP2 O OP -1 30.224 2.536 -1.171 +U "O5'" O O2 0 27.859 3.273 -0.849 +U "C5'" C CH2 0 26.439 3.063 -0.635 +U "C4'" C CH1 0 25.718 4.389 -0.671 +U "O4'" O O2 0 26.311 5.305 0.281 +U "C3'" C CH1 0 25.778 5.166 -1.991 +U "O3'" O OH1 0 24.835 4.654 -2.925 +U "C2'" C CH1 0 25.458 6.596 -1.533 +U "O2'" O OH1 0 24.071 6.867 -1.498 +U "C1'" C CH1 0 26.019 6.633 -0.106 +U N1 N NR6 0 27.258 7.450 0.002 +U C2 C CR6 0 27.205 8.658 0.693 +U O2 O O 0 26.192 9.093 1.231 +U N3 N NR16 0 28.393 9.351 0.740 +U C4 C CR6 0 29.603 8.978 0.180 +U O4 O O 0 30.583 9.712 0.310 +U C5 C CR16 0 29.578 7.725 -0.520 +U C6 C CR16 0 28.433 7.023 -0.585 +U "H5'" H H 0 26.293 2.630 0.242 +U "H5''" H H 0 26.078 2.471 -1.340 +U "H4'" H H 0 24.781 4.238 -0.422 +U "H3'" H H 0 26.692 5.130 -2.374 +U "HO3'" H H 0 24.819 5.164 -3.604 +U "H2'" H H 0 25.919 7.246 -2.101 +U "HO2'" H H 0 23.948 7.707 -1.488 +U "H1'" H H 0 25.334 6.986 0.500 +U H3 H H 0 28.372 10.124 1.182 +U H5 H H 0 30.354 7.400 -0.928 +U H6 H H 0 28.431 6.206 -1.045 +loop_ +_chem_comp_bond.comp_id +_chem_comp_bond.atom_id_1 +_chem_comp_bond.atom_id_2 +_chem_comp_bond.type +_chem_comp_bond.aromatic +_chem_comp_bond.value_dist_nucleus +_chem_comp_bond.value_dist_nucleus_esd +_chem_comp_bond.value_dist +_chem_comp_bond.value_dist_esd +U OP3 P SINGLE n 1.517 0.0192 1.517 0.0192 +U P OP1 DOUBLE n 1.517 0.0192 1.517 0.0192 +U P OP2 SINGLE n 1.517 0.0192 1.517 0.0192 +U P "O5'" SINGLE n 1.614 0.0178 1.614 0.0178 +U "O5'" "C5'" SINGLE n 1.450 0.0166 1.450 0.0166 +U "C5'" "C4'" SINGLE n 1.509 0.0100 1.509 0.0100 +U "C4'" "O4'" SINGLE n 1.451 0.0111 1.451 0.0111 +U "C4'" "C3'" SINGLE n 1.535 0.0100 1.535 0.0100 +U "O4'" "C1'" SINGLE n 1.412 0.0100 1.412 0.0100 +U "C3'" "O3'" SINGLE n 1.422 0.0100 1.422 0.0100 +U "C3'" "C2'" SINGLE n 1.533 0.0109 1.533 0.0109 +U "C2'" "O2'" SINGLE n 1.412 0.0100 1.412 0.0100 +U "C2'" "C1'" SINGLE n 1.529 0.0100 1.529 0.0100 +U "C1'" N1 SINGLE n 1.476 0.0133 1.476 0.0133 +U N1 C2 SINGLE y 1.383 0.0100 1.383 0.0100 +U N1 C6 SINGLE y 1.375 0.0106 1.375 0.0106 +U C2 O2 DOUBLE n 1.224 0.0111 1.224 0.0111 +U C2 N3 SINGLE y 1.372 0.0112 1.372 0.0112 +U N3 C4 SINGLE y 1.381 0.0100 1.381 0.0100 +U C4 O4 DOUBLE n 1.231 0.0100 1.231 0.0100 +U C4 C5 SINGLE y 1.434 0.0100 1.434 0.0100 +U C5 C6 DOUBLE y 1.342 0.0100 1.342 0.0100 +U "C5'" "H5'" SINGLE n 1.089 0.0100 0.989 0.0200 +U "C5'" "H5''" SINGLE n 1.089 0.0100 0.989 0.0200 +U "C4'" "H4'" SINGLE n 1.089 0.0100 0.981 0.0200 +U "C3'" "H3'" SINGLE n 1.089 0.0100 0.992 0.0200 +U "O3'" "HO3'" SINGLE n 0.970 0.0120 0.849 0.0200 +U "C2'" "H2'" SINGLE n 1.089 0.0100 0.978 0.0200 +U "O2'" "HO2'" SINGLE n 0.970 0.0120 0.849 0.0200 +U "C1'" "H1'" SINGLE n 1.089 0.0100 0.981 0.0118 +U N3 H3 SINGLE n 1.016 0.0100 0.889 0.0200 +U C5 H5 SINGLE n 1.082 0.0130 0.935 0.0100 +U C6 H6 SINGLE n 1.082 0.0130 0.938 0.0107 +loop_ +_chem_comp_angle.comp_id +_chem_comp_angle.atom_id_1 +_chem_comp_angle.atom_id_2 +_chem_comp_angle.atom_id_3 +_chem_comp_angle.value_angle +_chem_comp_angle.value_angle_esd +U OP3 P OP1 112.864 1.69 +U OP3 P OP2 112.864 1.69 +U OP3 P "O5'" 105.808 2.07 +U OP1 P OP2 112.864 1.69 +U OP1 P "O5'" 105.808 2.07 +U OP2 P "O5'" 105.808 2.07 +U P "O5'" "C5'" 118.783 1.50 +U "O5'" "C5'" "C4'" 109.342 1.50 +U "O5'" "C5'" "H5'" 109.845 1.50 +U "O5'" "C5'" "H5''" 109.845 1.50 +U "C4'" "C5'" "H5'" 109.624 1.50 +U "C4'" "C5'" "H5''" 109.624 1.50 +U "H5'" "C5'" "H5''" 108.472 1.50 +U "C5'" "C4'" "O4'" 109.615 1.50 +U "C5'" "C4'" "C3'" 116.008 1.52 +U "C5'" "C4'" "H4'" 108.268 1.50 +U "O4'" "C4'" "C3'" 104.439 1.50 +U "O4'" "C4'" "H4'" 108.698 1.50 +U "C3'" "C4'" "H4'" 109.363 1.86 +U "C4'" "O4'" "C1'" 109.578 1.50 +U "C4'" "C3'" "O3'" 111.281 2.46 +U "C4'" "C3'" "C2'" 102.071 1.50 +U "C4'" "C3'" "H3'" 110.452 2.54 +U "O3'" "C3'" "C2'" 111.993 3.00 +U "O3'" "C3'" "H3'" 110.380 1.67 +U "C2'" "C3'" "H3'" 110.108 1.66 +U "C3'" "O3'" "HO3'" 108.744 3.00 +U "C3'" "C2'" "O2'" 112.861 2.52 +U "C3'" "C2'" "C1'" 101.269 1.50 +U "C3'" "C2'" "H2'" 110.799 1.82 +U "O2'" "C2'" "C1'" 109.476 3.00 +U "O2'" "C2'" "H2'" 111.022 1.77 +U "C1'" "C2'" "H2'" 110.760 1.63 +U "C2'" "O2'" "HO2'" 109.449 1.85 +U "O4'" "C1'" "C2'" 106.825 1.50 +U "O4'" "C1'" N1 108.667 1.50 +U "O4'" "C1'" "H1'" 109.327 1.50 +U "C2'" "C1'" N1 112.859 1.50 +U "C2'" "C1'" "H1'" 109.776 1.83 +U N1 "C1'" "H1'" 109.166 1.50 +U "C1'" N1 C2 117.109 1.50 +U "C1'" N1 C6 121.471 1.52 +U C2 N1 C6 121.419 1.50 +U N1 C2 O2 122.841 1.50 +U N1 C2 N3 114.848 1.50 +U O2 C2 N3 122.311 1.50 +U C2 N3 C4 126.992 1.50 +U C2 N3 H3 115.772 1.79 +U C4 N3 H3 117.236 1.73 +U N3 C4 O4 119.401 1.50 +U N3 C4 C5 114.659 1.50 +U O4 C4 C5 125.940 1.50 +U C4 C5 C6 119.525 1.50 +U C4 C5 H5 120.151 1.50 +U C6 C5 H5 120.325 1.50 +U N1 C6 C5 122.557 1.50 +U N1 C6 H6 118.477 1.50 +U C5 C6 H6 118.966 1.50 +loop_ +_chem_comp_tor.comp_id +_chem_comp_tor.id +_chem_comp_tor.atom_id_1 +_chem_comp_tor.atom_id_2 +_chem_comp_tor.atom_id_3 +_chem_comp_tor.atom_id_4 +_chem_comp_tor.value_angle +_chem_comp_tor.value_angle_esd +_chem_comp_tor.period +U C2e-chi "O4'" "C1'" N1 C2 210.000 10.000 6 +U C2e-nyu0 "C4'" "O4'" "C1'" "C2'" 340.700 6.300 1 +U C2e-nyu1 "O4'" "C1'" "C2'" "C3'" 32.800 4.900 1 +U C2e-nyu2 "C1'" "C2'" "C3'" "C4'" 326.9 3.600 1 +U C2e-nyu3 "C2'" "C3'" "C4'" "O4'" 22.600 4.500 1 +U C2e-nyu4 "C3'" "C4'" "O4'" "C1'" 357.700 6.100 1 +U C3e-chi "O4'" "C1'" N1 C2 210.000 10.000 6 +U C3e-nyu0 "C4'" "O4'" "C1'" "C2'" 2.8 6.100 1 +U C3e-nyu1 "O4'" "C1'" "C2'" "C3'" 335.00 4.900 1 +U C3e-nyu2 "C1'" "C2'" "C3'" "C4'" 35.9 2.800 1 +U C3e-nyu3 "C2'" "C3'" "C4'" "O4'" 324.700 3.100 1 +U C3e-nyu4 "C3'" "C4'" "O4'" "C1'" 20.500 5.100 1 +U alpha "C5'" "O5'" P OP3 -60.000 10.00 3 +U beta P "O5'" "C5'" "C4'" 180.000 10.00 3 +U epsi "C4'" "C3'" "O3'" "HO3'" 180.000 10.00 3 +U gamma "O5'" "C5'" "C4'" "C3'" 180.000 10.00 3 +U sp3_sp3_52 "C3'" "C2'" "O2'" "HO2'" 180.000 10.00 3 +U const_sp2_sp2_4 O2 C2 N1 "C1'" 0.000 5.0 2 +U const_22 C5 C6 N1 "C1'" 180.000 10.0 2 +U const_sp2_sp2_7 O2 C2 N3 C4 180.000 5.0 2 +U const_11 O4 C4 N3 C2 180.000 10.0 2 +U const_15 O4 C4 C5 C6 180.000 10.0 2 +U const_17 C4 C5 C6 N1 0.000 10.0 2 +loop_ +_chem_comp_chir.comp_id +_chem_comp_chir.id +_chem_comp_chir.atom_id_centre +_chem_comp_chir.atom_id_1 +_chem_comp_chir.atom_id_2 +_chem_comp_chir.atom_id_3 +_chem_comp_chir.volume_sign +U chir_1 P "O5'" OP3 OP2 both +U chir_2 "C4'" "O4'" "C3'" "C5'" negative +U chir_3 "C3'" "O3'" "C4'" "C2'" positive +U chir_4 "C2'" "O2'" "C1'" "C3'" negative +U chir_5 "C1'" "O4'" N1 "C2'" negative +loop_ +_chem_comp_plane_atom.comp_id +_chem_comp_plane_atom.plane_id +_chem_comp_plane_atom.atom_id +_chem_comp_plane_atom.dist_esd +U plan-1 "C1'" 0.020 +U plan-1 C2 0.020 +U plan-1 C4 0.020 +U plan-1 C5 0.020 +U plan-1 C6 0.020 +U plan-1 H3 0.020 +U plan-1 H5 0.020 +U plan-1 H6 0.020 +U plan-1 N1 0.020 +U plan-1 N3 0.020 +U plan-1 O2 0.020 +U plan-1 O4 0.020 +loop_ +_pdbx_chem_comp_descriptor.comp_id +_pdbx_chem_comp_descriptor.type +_pdbx_chem_comp_descriptor.program +_pdbx_chem_comp_descriptor.program_version +_pdbx_chem_comp_descriptor.descriptor +U SMILES ACDLabs 10.04 O=C1NC(=O)N(C=C1)C2OC(C(O)C2O)COP(=O)(O)O +U SMILES_CANONICAL CACTVS 3.341 O[C@H]1[C@@H](O)[C@@H](O[C@@H]1CO[P](O)(O)=O)N2C=CC(=O)NC2=O +U SMILES CACTVS 3.341 O[CH]1[CH](O)[CH](O[CH]1CO[P](O)(O)=O)N2C=CC(=O)NC2=O +U SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 C1=CN(C(=O)NC1=O)[C@H]2[C@@H]([C@@H]([C@H](O2)COP(=O)(O)O)O)O +U SMILES "OpenEye OEToolkits" 1.5.0 C1=CN(C(=O)NC1=O)C2C(C(C(O2)COP(=O)(O)O)O)O +U InChI InChI 1.03 InChI=1S/C9H13N2O9P/c12-5-1-2-11(9(15)10-5)8-7(14)6(13)4(20-8)3-19-21(16,17)18/h1-2,4,6-8,13-14H,3H2,(H,10,12,15)(H2,16,17,18)/t4-,6-,7-,8-/m1/s1 +U InChIKey InChI 1.03 DJJCXFVJDGTHFX-XVFCMESISA-N +loop_ +_pdbx_chem_comp_description_generator.comp_id +_pdbx_chem_comp_description_generator.program_name +_pdbx_chem_comp_description_generator.program_version +_pdbx_chem_comp_description_generator.descriptor +U acedrg 243 "dictionary generator" +U acedrg_database 11 "data source" +U rdkit 2017.03.2 "Chemoinformatics tool" +U refmac5 5.8.0238 "optimization tool" diff --git a/image_analysis/structure_refinement/monomers/VAL.cif b/image_analysis/structure_refinement/monomers/VAL.cif new file mode 100644 index 000000000..af42ed1b8 --- /dev/null +++ b/image_analysis/structure_refinement/monomers/VAL.cif @@ -0,0 +1,221 @@ +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +VAL VAL VALINE peptide 19 8 . + +data_comp_VAL +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +VAL N N NT3 1 11.307 2.990 48.522 +VAL CA C CH1 0 10.346 4.137 48.590 +VAL C C C 0 9.715 4.163 49.994 +VAL O O O 0 9.179 3.107 50.398 +VAL CB C CH1 0 9.259 4.073 47.494 +VAL CG1 C CH3 0 8.396 5.334 47.475 +VAL CG2 C CH3 0 9.849 3.802 46.112 +VAL OXT O OC -1 9.782 5.237 50.630 +VAL H H H 0 11.930 3.145 47.888 +VAL H2 H H 0 10.867 2.229 48.319 +VAL H3 H H 0 11.735 2.877 49.308 +VAL HA H H 0 10.853 4.963 48.468 +VAL HB H H 0 8.670 3.315 47.717 +VAL HG11 H H 0 8.964 6.117 47.567 +VAL HG12 H H 0 7.763 5.306 48.212 +VAL HG13 H H 0 7.907 5.387 46.637 +VAL HG21 H H 0 10.555 4.444 45.928 +VAL HG22 H H 0 9.155 3.884 45.436 +VAL HG23 H H 0 10.217 2.902 46.084 + +loop_ +_chem_comp_tree.comp_id +_chem_comp_tree.atom_id +_chem_comp_tree.atom_back +_chem_comp_tree.atom_forward +_chem_comp_tree.connect_type +VAL N n/a CA START +VAL H N . . +VAL H2 N . . +VAL H3 N . . +VAL CA N C . +VAL HA CA . . +VAL CB CA CG2 . +VAL HB CB . . +VAL CG1 CB HG13 . +VAL HG11 CG1 . . +VAL HG12 CG1 . . +VAL HG13 CG1 . . +VAL CG2 CB HG23 . +VAL HG21 CG2 . . +VAL HG22 CG2 . . +VAL HG23 CG2 . . +VAL C CA . END +VAL O C . . +VAL OXT C . . + +loop_ +_chem_comp_acedrg.comp_id +_chem_comp_acedrg.atom_id +_chem_comp_acedrg.atom_type +VAL N N(CCCH)(H)3 +VAL CA C(CCCH)(NH3)(COO)(H) +VAL C C(CCHN)(O)2 +VAL O O(CCO) +VAL CB C(CCHN)(CH3)2(H) +VAL CG1 C(CCCH)(H)3 +VAL CG2 C(CCCH)(H)3 +VAL OXT O(CCO) +VAL H H(NCHH) +VAL H2 H(NCHH) +VAL H3 H(NCHH) +VAL HA H(CCCN) +VAL HB H(CC3) +VAL HG11 H(CCHH) +VAL HG12 H(CCHH) +VAL HG13 H(CCHH) +VAL HG21 H(CCHH) +VAL HG22 H(CCHH) +VAL HG23 H(CCHH) + +loop_ +_chem_comp_bond.comp_id +_chem_comp_bond.atom_id_1 +_chem_comp_bond.atom_id_2 +_chem_comp_bond.type +_chem_comp_bond.aromatic +_chem_comp_bond.value_dist_nucleus +_chem_comp_bond.value_dist_nucleus_esd +_chem_comp_bond.value_dist +_chem_comp_bond.value_dist_esd +VAL N CA SINGLE n 1.495 0.0100 1.495 0.0100 +VAL CA C SINGLE n 1.538 0.0100 1.538 0.0100 +VAL CA CB SINGLE n 1.541 0.0101 1.541 0.0101 +VAL C O DOUBLE n 1.251 0.0183 1.251 0.0183 +VAL C OXT SINGLE n 1.251 0.0183 1.251 0.0183 +VAL CB CG1 SINGLE n 1.524 0.0131 1.524 0.0131 +VAL CB CG2 SINGLE n 1.524 0.0131 1.524 0.0131 +VAL N H SINGLE n 1.018 0.0520 0.902 0.0102 +VAL N H2 SINGLE n 1.018 0.0520 0.902 0.0102 +VAL N H3 SINGLE n 1.018 0.0520 0.902 0.0102 +VAL CA HA SINGLE n 1.092 0.0100 0.977 0.0200 +VAL CB HB SINGLE n 1.092 0.0100 0.986 0.0184 +VAL CG1 HG11 SINGLE n 1.092 0.0100 0.972 0.0156 +VAL CG1 HG12 SINGLE n 1.092 0.0100 0.972 0.0156 +VAL CG1 HG13 SINGLE n 1.092 0.0100 0.972 0.0156 +VAL CG2 HG21 SINGLE n 1.092 0.0100 0.972 0.0156 +VAL CG2 HG22 SINGLE n 1.092 0.0100 0.972 0.0156 +VAL CG2 HG23 SINGLE n 1.092 0.0100 0.972 0.0156 + +loop_ +_chem_comp_angle.comp_id +_chem_comp_angle.atom_id_1 +_chem_comp_angle.atom_id_2 +_chem_comp_angle.atom_id_3 +_chem_comp_angle.value_angle +_chem_comp_angle.value_angle_esd +VAL CA N H 109.990 2.80 +VAL CA N H2 109.990 2.80 +VAL CA N H3 109.990 2.80 +VAL H N H2 109.032 3.00 +VAL H N H3 109.032 3.00 +VAL H2 N H3 109.032 3.00 +VAL N CA C 108.738 1.50 +VAL N CA CB 111.627 2.88 +VAL N CA HA 108.328 1.50 +VAL C CA CB 111.231 1.50 +VAL C CA HA 108.550 1.50 +VAL CB CA HA 108.536 1.50 +VAL CA C O 117.155 1.50 +VAL CA C OXT 117.155 1.50 +VAL O C OXT 125.690 1.50 +VAL CA CB CG1 111.834 1.50 +VAL CA CB CG2 111.834 1.50 +VAL CA CB HB 107.069 1.50 +VAL CG1 CB CG2 110.700 1.76 +VAL CG1 CB HB 107.681 2.06 +VAL CG2 CB HB 107.681 2.06 +VAL CB CG1 HG11 109.510 1.50 +VAL CB CG1 HG12 109.510 1.50 +VAL CB CG1 HG13 109.510 1.50 +VAL HG11 CG1 HG12 109.390 1.50 +VAL HG11 CG1 HG13 109.390 1.50 +VAL HG12 CG1 HG13 109.390 1.50 +VAL CB CG2 HG21 109.510 1.50 +VAL CB CG2 HG22 109.510 1.50 +VAL CB CG2 HG23 109.510 1.50 +VAL HG21 CG2 HG22 109.390 1.50 +VAL HG21 CG2 HG23 109.390 1.50 +VAL HG22 CG2 HG23 109.390 1.50 + +loop_ +_chem_comp_tor.comp_id +_chem_comp_tor.id +_chem_comp_tor.atom_id_1 +_chem_comp_tor.atom_id_2 +_chem_comp_tor.atom_id_3 +_chem_comp_tor.atom_id_4 +_chem_comp_tor.value_angle +_chem_comp_tor.value_angle_esd +_chem_comp_tor.period +VAL chi1 N CA CB CG2 -60.000 10.0 3 +VAL hh1 CA CB CG1 HG13 180.000 10.0 3 +VAL hh2 CA CB CG2 HG23 -60.000 10.0 3 +VAL sp3_sp3_1 C CA N H 180.000 10.0 3 +VAL sp2_sp3_1 O C CA N 0.000 10.0 6 + +loop_ +_chem_comp_chir.comp_id +_chem_comp_chir.id +_chem_comp_chir.atom_id_centre +_chem_comp_chir.atom_id_1 +_chem_comp_chir.atom_id_2 +_chem_comp_chir.atom_id_3 +_chem_comp_chir.volume_sign +VAL chir_1 CA N C CB positive +VAL chir_2 CB CA CG1 CG2 both + +loop_ +_chem_comp_plane_atom.comp_id +_chem_comp_plane_atom.plane_id +_chem_comp_plane_atom.atom_id +_chem_comp_plane_atom.dist_esd +VAL plan-1 C 0.020 +VAL plan-1 CA 0.020 +VAL plan-1 O 0.020 +VAL plan-1 OXT 0.020 + +loop_ +_pdbx_chem_comp_descriptor.comp_id +_pdbx_chem_comp_descriptor.type +_pdbx_chem_comp_descriptor.program +_pdbx_chem_comp_descriptor.program_version +_pdbx_chem_comp_descriptor.descriptor +VAL SMILES ACDLabs 10.04 O=C(O)C(N)C(C)C +VAL SMILES_CANONICAL CACTVS 3.341 CC(C)[C@H](N)C(O)=O +VAL SMILES CACTVS 3.341 CC(C)[CH](N)C(O)=O +VAL SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 CC(C)[C@@H](C(=O)O)N +VAL SMILES "OpenEye OEToolkits" 1.5.0 CC(C)C(C(=O)O)N +VAL InChI InChI 1.03 InChI=1S/C5H11NO2/c1-3(2)4(6)5(7)8/h3-4H,6H2,1-2H3,(H,7,8)/t4-/m0/s1 +VAL InChIKey InChI 1.03 KZSNJWFQEVHDMF-BYPYZUCNSA-N + +loop_ +_pdbx_chem_comp_description_generator.comp_id +_pdbx_chem_comp_description_generator.program_name +_pdbx_chem_comp_description_generator.program_version +_pdbx_chem_comp_description_generator.descriptor +VAL acedrg 278 "dictionary generator" +VAL acedrg_database 12 "data source" +VAL rdkit 2019.09.1 "Chemoinformatics tool" +VAL refmac5 5.8.0419 "optimization tool" diff --git a/image_analysis/structure_refinement/monomers/ZN.cif b/image_analysis/structure_refinement/monomers/ZN.cif new file mode 100644 index 000000000..aada536e8 --- /dev/null +++ b/image_analysis/structure_refinement/monomers/ZN.cif @@ -0,0 +1,30 @@ +data_comp_list +loop_ +_chem_comp.id +_chem_comp.three_letter_code +_chem_comp.name +_chem_comp.group +_chem_comp.number_atoms_all +_chem_comp.number_atoms_nh +_chem_comp.desc_level +ZN ZN 'ZINC ION ' NON-POLYMER 1 1 . + +data_comp_ZN +loop_ +_chem_comp_atom.comp_id +_chem_comp_atom.atom_id +_chem_comp_atom.type_symbol +_chem_comp_atom.type_energy +_chem_comp_atom.partial_charge +_chem_comp_atom.x +_chem_comp_atom.y +_chem_comp_atom.z +ZN ZN ZN ZN 2.000 0.000 0.000 0.000 + +loop_ +_chem_comp_tree.comp_id +_chem_comp_tree.atom_id +_chem_comp_tree.atom_back +_chem_comp_tree.atom_forward +_chem_comp_tree.connect_type +ZN ZN n/a . END diff --git a/image_analysis/structure_refinement/monomers/ener_lib.cif b/image_analysis/structure_refinement/monomers/ener_lib.cif new file mode 100644 index 000000000..717864eb2 --- /dev/null +++ b/image_analysis/structure_refinement/monomers/ener_lib.cif @@ -0,0 +1,219 @@ +data_energy +loop_ +_lib_atom.type +_lib_atom.weight +_lib_atom.hb_type +_lib_atom.vdw_radius +_lib_atom.vdwh_radius +_lib_atom.ion_radius +_lib_atom.element +_lib_atom.valency +_lib_atom.sp +CSP 12.01150 N 1.700 1.700 . C 4 1 +CSP1 12.01150 N 1.700 1.700 . C 4 1 +C 12.01150 N 1.700 1.750 . C 4 2 +C1 12.01150 N 1.700 1.820 . C 4 2 +C2 12.01150 N 1.700 1.800 . C 4 2 +CR1 12.01150 N 1.700 1.800 . C 4 2 +CR2 12.01150 N 1.700 1.800 . C 4 2 +CR1H 12.01150 N 1.700 1.800 . C 4 2 +CR15 12.01150 N 1.700 1.740 . C 4 2 +CR5 12.01150 N 1.700 1.740 . C 4 2 +CR56 12.01150 N 1.700 1.740 . C 4 2 +CR55 12.01150 N 1.700 1.740 . C 4 2 +CR16 12.01150 N 1.700 1.820 . C 4 2 +CR6 12.01150 N 1.700 1.740 . C 4 2 +CR66 12.01150 N 1.700 1.740 . C 4 2 +CH1 12.01150 N 1.700 1.950 . C 4 3 +CH2 12.01150 N 1.700 1.920 . C 4 3 +CH3 12.01150 N 1.700 1.940 . C 4 3 +CT 12.01150 N 1.700 1.850 . C 4 3 +NS 14.00670 A 1.550 1.600 1.32 N 3 1 +NSP 14.00670 A 1.550 1.600 1.32 N 3 1 +NS1 14.00670 D 1.550 1.600 1.32 N 3 1 +NSP1 14.00670 D 1.550 1.600 1.32 N 3 1 +N 14.00670 N 1.550 1.600 1.32 N 3 2 +NC1 14.00670 D 1.550 1.600 1.32 N 3 2 +NH0 14.00670 N 1.550 1.600 1.32 N 3 2 +NH1 14.00670 D 1.550 1.600 1.32 N 3 2 +NC2 14.00670 D 1.550 1.600 1.32 N 3 2 +NH2 14.00670 D 1.550 1.600 1.32 N 3 2 +NC3 14.00670 D 1.550 1.600 1.32 N 3 2 +N20 14.00670 A 1.550 1.600 1.32 N 3 2 +N21 14.00670 B 1.550 1.600 1.32 N 3 2 +NT 14.00670 N 1.550 1.600 1.32 N 3 3 +NT1 14.00670 D 1.550 1.600 1.32 N 3 3 +NT2 14.00670 D 1.550 1.600 1.32 N 3 3 +NT3 14.00670 D 1.550 1.600 1.32 N 3 3 +NT4 14.00670 D 1.550 1.600 1.32 N 3 3 +N30 14.00670 A 1.550 1.600 1.32 N 3 3 +N31 14.00670 B 1.550 1.600 1.32 N 3 3 +N32 14.00670 B 1.550 1.600 1.32 N 3 3 +N33 14.00670 B 1.550 1.600 1.32 N 3 3 +NPA 14.00670 A 1.550 1.600 1.32 N 3 2 +NPB 14.00670 A 1.550 1.600 1.32 N 3 2 +NR5 14.00670 A 1.550 1.600 1.32 N 3 2 +NR15 14.00670 D 1.550 1.600 1.32 N 3 2 +NRD5 14.00670 A 1.550 1.600 1.32 N 3 2 +NR56 14.00670 N 1.550 1.600 1.32 N 3 2 +NR55 14.00670 N 1.550 1.600 1.32 N 3 2 +NR6 14.00670 A 1.550 1.600 1.32 N 3 2 +NR66 14.00670 N 1.550 1.600 1.32 N 3 2 +NR16 14.00670 D 1.550 1.600 1.32 N 3 2 +NRD6 14.00670 A 1.550 1.600 1.32 N 3 2 +OS 15.99940 A 1.520 1.520 1.28 O 2 2 +O 15.99940 A 1.520 1.520 1.28 O 2 2 +AF 15.99940 A 1.520 1.520 1.28 AF 2 2 +O2 15.99940 A 1.520 1.520 1.28 O 2 3 +OH1 15.99940 B 1.520 1.520 1.28 O 2 3 +OH2 15.99940 B 1.520 1.520 1.28 O 2 3 +OHA 15.99940 B 1.520 1.680 1.28 O 2 3 +OHB 15.99940 B 1.520 1.680 1.28 O 2 3 +OHC 15.99940 B 1.520 1.680 1.28 O 2 3 +OC2 15.99940 A 1.520 1.520 1.28 O 2 2 +OC 15.99940 A 1.520 1.520 1.28 O 2 2 +OP 15.99940 A 1.520 1.520 1.28 O 2 2 +OB 15.99940 A 1.520 1.520 1.28 O 2 2 +P 30.97380 N 1.800 1.88 1.79 P 5 . +P1 30.97380 N 1.800 1.88 1.79 P 5 . +PS 30.97380 N 1.800 1.90 1.79 P 5 . +S 32.06400 A 1.800 1.88 1.7 S 2 . +S3 32.06400 A 1.800 1.88 1.7 S 4 . +S2 32.06400 A 1.800 1.88 1.7 S 2 . +S1 32.06400 A 1.800 1.88 1.7 S 2 . +ST 32.06400 A 1.800 1.88 1.7 S 6 3 +SH1 32.06400 B 1.800 1.950 1.7 S 2 . +H 1.00800 N 1.200 . . H 1 . +HCH 1.00800 N 1.200 . . H 1 . +HCH1 1.00800 N 1.200 . . H 1 . +HCH2 1.00800 N 1.200 . . H 1 . +HCH3 1.00800 N 1.200 . . H 1 . +HCR1 1.00800 N 1.200 . . H 1 . +HC2 1.00800 N 1.200 . . H 1 . +HC1 1.00800 N 1.200 . . H 1 . +HC2 1.00800 N 1.200 . . H 1 . +HCR5 1.00800 N 1.200 . . H 1 . +HCR6 1.00800 N 1.200 . . H 1 . +HNC1 1.00800 H 1.200 . . H 1 . +HNC2 1.00800 H 1.200 . . H 1 . +HNH1 1.00800 H 1.200 . . H 1 . +HNH2 1.00800 H 1.200 . . H 1 . +HNR5 1.00800 H 1.200 . . H 1 . +HNR6 1.00800 H 1.200 . . H 1 . +HNT1 1.00800 H 1.200 . . H 1 . +HNT2 1.00800 H 1.200 . . H 1 . +HNT3 1.00800 H 1.200 . . H 1 . +HOH1 1.00800 H 1.200 . . H 1 . +HOH2 1.00800 H 1.200 . . H 1 . +HOHA 1.00800 H 1.200 . . H 1 . +HOHB 1.00800 H 1.200 . . H 1 . +HOHC 1.00800 H 1.200 . . H 1 . +HSH1 1.00800 H 1.200 . . H 1 . +SI 28.0855 N 2.10 . 0.40 SI 4 3 +SI1 28.0855 N 2.10 . 0.40 SI 4 . +GE 72.59 N 2.10 . 0.40 GE 1 . +GE1 72.59 N 2.10 . 0.40 GE 1 . +SN 118.69 N 2.17 . 0.69 SN 1 . +PB 207.2 N 2.02 . 0.79 PB 1 . +LI 6.941 N 1.82 . 0.73 LI 1 . +NA 22.990 N 2.27 . 1.13 NA 1 . +K 30.0983 N 2.75 . 1.51 K 1 . +RB 85.468 N 2.00 . 1.48 RB 1 . +CS 132.905 N 2.98 . 1.81 CS 1 . +FR 223.0 N . . 1.94 FR 1 . +BE 9.0123 N 1.12 . 0.41 BE 1 . +MG 24.30500 N 1.73 . 0.71 MG 1 . +CA 40.08000 N 1.94 . 1.14 CA 1 . +SR 87.62 N 2.19 . 1.32 SR 1 . +BA 137.33 N 2.53 . 1.49 BA 1 . +RA 226.025 N 2.15 . 1.62 RA 1 . +SC 44.9559 N 1.60 . 0.885 SC 1 . +Y 88.9059 N 1.80 . 1.04 Y 1 . +LA 138.9055 N 1.95 . 1.172 LA 1 . +CE 140.12 N 1.85 . 1.01 CE 1 . +PR 140.9077 N 1.85 . 0.99 PR 1 . +ND 144.24 N 1.85 . 1.123 ND 1 . +PM . N . . 1.11 PM 1 . +SM 150.36 N 1.85 . 1.098 SM 1 . +EU 151.96 N 1.85 . 1.087 EU 1 . +GD 157.25 N 1.80 . 1.078 GD 1 . +TB 158.9254 N 1.75 . 0.90 TB 1 . +DY 162.50 N 1.75 . 1.052 DY 1 . +HO 164.9304 N 1.75 . 1.041 HO 1 . +ER 167.26 N 1.75 . 1.03 ER 1 . +TM 168.9342 N 1.75 . 1.02 TM 1 . +YB 173.04 N 1.75 . 1.008 YB 1 . +LU 174.967 N 1.75 . 1.001 LU 1 . +AC 227.028 N 1.95 . 1.26 AC 1 . +TH 232.0 N 1.80 . 1.08 TH 1 . +PA 231.0 N 1.80 . 0.92 PA 1 . +U 238.0 N 1.86 . 0.66 U 1 . +NP 237.0 N 1.75 . 0.85 NP 1 . +PU 239.0 N 1.75 . 0.85 PU 1 . +AM 241.0 N 1.75 . 0.99 AM 1 . +CM 244.0 N . . 0.99 CM 1 . +BK 249.0 N . . 0.97 BK 1 . +CF 252.0 N . . 0.961 CF 1 . +ES 253.0 N . . . ES 1 . +FM 257.0 N . . . FM 1 . +MD 256.0 N . . . MD 1 . +NO 255.0 N . . . NO 1 . +LR 256.0 N . . . LR 1 . +TI 47.88 N 1.40 . 0.56 TI 1 . +ZR 91.22 N 1.55 . 0.73 ZR 1 . +HF 178.49 N 1.55 . 0.72 HF 1 . +RF . N . . . RF 1 . +V 50.9415 N 1.35 . 0.68 V 1 . +NB 92.9064 N 1.45 . 0.62 NB 1 . +TA 180.9479 N 1.45 . 0.78 TA 1 . +DB . N . . . DB 1 . +CR 51.996 N 1.40 . 0.53 CR 1 . +MO 95.94 N 1.45 . 0.55 MO 1 . +W 183.85 N 1.35 . 0.56 W 1 . +SG . N . . . SG 1 . +MN 54.938 N 1.40 . 0.46 MN 1 . +TC 98.906 N 1.35 . 0.51 TC 1 . +RE 186.207 N 1.35 . 0.52 RE 1 . +BH . N . . . BH 1 . +FE 55.847 N 1.40 . 0.68 FE 1 . +RU 101.07 N 1.30 . 0.52 RU 1 . +OSE 190.2 N 1.30 . 0.53 OS 1 . +HS . N . . . HS 1 . +CO 58.9332 N 1.35 . 0.54 CO 1 . +RH 102.9055 N 1.35 . 0.69 RH 1 . +IR 192.22 N 1.35 . 0.71 IR 1 . +MT . N . . . MT 1 . +NI 58.69 N 1.63 . 0.63 NI 1 . +PD 106.42 N 1.63 . 0.78 PD 1 . +PT 195.08 N 1.75 . 0.71 PT 1 . +CU 63.546 N 1.40 . 0.71 CU 1 . +AG 107.868 N 1.72 . 0.81 AG 1 . +AU 196.9665 N 1.66 . 0.71 AU 1 . +ZN 65.38 N 1.39 . 0.74 ZN 1 . +CD 112.41 N 1.58 . 0.92 CD 1 . +HG 200.59 N 1.55 . 1.10 HG 1 . +B 10.81 N 0.85 . 0.25 B 1 . +AL 26.98154 N 1.25 . 0.53 AL 1 . +GA 69.72 N 1.87 . 0.61 GA 1 . +IN 114.82 N 1.93 . 0.76 IN 1 . +TL 204.383 N 1.96 . 0.89 TL 1 . +AS 74.9216 N 1.85 . 0.475 AS 1 . +AS1 74.9216 N 1.85 . 0.475 AS 1 . +SB 121.75 N 1.8 . 0.90 SB 1 . +BI 208.9804 N 1.8 . 0.90 BI 1 . +SE 78.96 N 1.90 . 0.42 SE 1 . +TE 127.60 N 2.06 . 0.57 TE 1 . +PO 210.0 N 2.0 . 0.81 PO 1 . +F 18.998 B 1.47 . 1.19 F 1 . +CL 35.453 A 1.75 . 1.67 CL 1 . +BR 79.904 N 1.85 . 0.73 BR 1 . +I 126.9045 N 1.98 . 0.56 I 1 . +AT 210.0 N 1.80 . 0.76 AT 1 . +HE 4.0026 N 1.40 . . HE 1 . +NE 20.179 N 1.54 . 1.12 NE 1 . +AR 39.948 N 1.88 . 1.54 AR 1 . +KR 83.80 N 2.02 . 1.69 KR 1 . +XE 131.29 N 2.16 . 1.90 XE 1 . +RN 222.0 N 2.20 . 2.0 RN 1 . +DUM 16.0 N 0.6 0.6 0.6 O . . +. . B 1.7 1.5 1.7 C 4 3 diff --git a/image_analysis/structure_refinement/monomers/links_and_mods.cif b/image_analysis/structure_refinement/monomers/links_and_mods.cif new file mode 100644 index 000000000..132bf6afb --- /dev/null +++ b/image_analysis/structure_refinement/monomers/links_and_mods.cif @@ -0,0 +1,5506 @@ +data_link_list +loop_ +_chem_link.id +_chem_link.comp_id_1 +_chem_link.mod_id_1 +_chem_link.group_comp_1 +_chem_link.comp_id_2 +_chem_link.mod_id_2 +_chem_link.group_comp_2 +_chem_link.name +DNA-SER . DEL_OP3 DNA/RNA SER SERm1 peptide DNA-SER +DNA-TYR . DEL_OP3 DNA/RNA TYR TYRmod5 peptide DNA-TYR +SS . CYS-SS peptide . CYS-SS peptide SS-bridge +disulf CYS CYS-SS peptide CYS CYS-SS peptide SS-bridge +TRANS . DEL-OXT peptide . DEL-HN1 peptide TRANS +CIS . DEL-OXT peptide . DEL-HN1 peptide CIS +PTRANS . DEL-OXT peptide . DEL-HNP P-peptide PTRANS +PCIS . DEL-OXT peptide . DEL-HNP P-peptide PCIS +NMTRANS . DEL-OXT1 peptide . DEL-NMH M-peptide NMTRANS +NMCIS . DEL-OXT1 peptide . DEL-NMH M-peptide NMCIS +gap . . . . . . gap-link +p . DEL_HO3p DNA/RNA . DEL_OP3 DNA/RNA default-DNA/RNA-link +AA-RNA . DEL-OXT peptide . DEL_HO3p DNA/RNA aminoacyl-RNA +ZN-CYS ZN . NON-POLYMER CYS CYSmod1 peptide bond_ZN_=_CYS-SG +ZN-HISND ZN . NON-POLYMER HIS DEL-HD1 peptide bond_ZN_=_HIS-ND1 +ZN-HISNE ZN . NON-POLYMER HIS DEL-HE2 peptide bond_ZN_=_HIS-NE2 +HEC-CYS1 CYS CYSmod1 peptide HEC HECmod1 NON-POLYMER HEC_CAC-CYS1 +HEC-CYS2 CYS CYSmod1 peptide HEC HECmod2 NON-POLYMER HEC_CAB-CYS2 +FE-CYS FE . NON-POLYMER CYS CYSmod1 peptide bond_FE_=_CYS-SG +FE-HISND FE . NON-POLYMER HIS DEL-HD1 peptide bond_FE_=_HIS-ND1 +FE-HISNE FE . NON-POLYMER HIS DEL-HE2 peptide bond_FE_=_HIS-NE2 +symmetry . . . . . . dummy_link +CYS-FAD CYS CYSmod2 peptide FAD FADmod1 NON-POLYMER CYS-FAD +HIS-FAD1 HIS HISmod1 peptide FAD FADmod2 NON-POLYMER HIS-FAD1 +HIS-FAD2 HIS HISmod2 peptide FAD FADmod3 NON-POLYMER HIS-FAD2 +GTP-p GTP GTPmod1 NON-POLYMER . DEL_OP3 DNA/RNA GTP-p +CYS-HEMB CYS CYSmod1 peptide HEM HEMmod2 NON-POLYMER CYS-HEMB +CYS-HEMC CYS CYSmod1 peptide HEM HEMmod3 NON-POLYMER CYS-HEMC +HIS_TYR1 HIS HISmod1 peptide TYR TYRmod1 peptide HIS_TYR1 +HIS_TYR2 HIS HISmod3 peptide TYR TYRmod2 peptide HIS_TYR2 +LYS-CYS LYS LYSmod1 peptide CYS CYSmod1 peptide LYS-CYS +LYS-ASN LYS LYSmod3 peptide ASN ASNmod1 peptide LYS-ASN +MET-TYR MET METmod1 peptide TYR TYRmod3 peptide MET-TYR +TRP-TYR TRP TRPmod1 peptide TYR TYRmod4 peptide TRP-TYR + +data_mod_list +loop_ +_chem_mod.id +_chem_mod.name +_chem_mod.comp_id +_chem_mod.group_id +SERm1 SERINE SER peptide +CYS-SS HG-deletete CYS peptide +CYSmod1 CYS-HG-delete_with_atom_type CYS peptide +NH3 NH3-terminus . peptide +NH1 NH1-terminus . peptide +NH2 NH2-terminus_for_proline . peptide +NH2N NH2-terminus_proline_type_with_CN . peptide +COO COO-terminus . peptide +AA-STAND AA_to_residue_modification . peptide +AA-STPRO AA_to_residue_modification_for_proline . peptide +NA-STAND DNA/RNA_to_residue_modification . DNA/RNA +5*END DNA/RNA-5*-terminus . DNA/RNA +3*END DNA/RNA-3*-terminus . DNA/RNA +p5*END DNA/RNA-p5*-terminus . DNA/RNA +p3*END DNA/RNA-p3*-terminus . DNA/RNA +DEL_OP3 DN/RNA-OP3-delete . DNA/RNA +DEL_HO3p DNA/RNA-OP3-delete . DNA/RNA +FOR-N N-terminus_of_formyl . . +FOR-C C-terminus_of_formyl . . +G-N2 delete_N2_from_guanosine . DNA/RNA +DEL-HD1 delete_HD1_from_HIS HIS peptide +DEL-HE2 delete_HE2_from_HIS HIS peptide +DEL-OXT delete_OXT_from_peptide . peptide +DEL-OXT1 delete_OXT_from_peptide . peptide +DEL-HN1 delete_Hs_from_peptide . peptide +DEL-NMH delete_Hs_from_NMpeptide . peptide +DEL-HNP delete_Hs_from_peptide . peptide +PEPT-D change_peptide_to_D . peptide +1MA N1-metyl_of_adenosine . DNA/RNA +1MG N1-metyl_of_guanosine . DNA/RNA +2MG N2-metyl_of_guanosine . DNA/RNA +M2G N2-dimetyl_of_guanosine . DNA/RNA +O2*MET O2*_metyl . DNA/RNA +C5MET C5_metyl . DNA/RNA +N7MET N7_metyl . DNA/RNA +RNA-O2* delete_O2*_from_RNA . DNA/RNA +XYS-O1 delete_O1_from_XYS . . +B2C replace_B_to_C . peptide +B2C_D replace_B_to_C_for_D-peptide . peptide +RENAME change_monomer"s_name . . +TERMINUS chain_terminus_without_modification . . +DEL-HD22 delete_HD22_from_ASN ASN peptide +DEL-HG delete_HG_from_SER SER peptide +DEL-HG1 delete_HG1_from_THR THR peptide +HECmod1 'HEME C CAB-C3B bond order ' HEC NON-POLYMER +HECmod2 'HEME C CAC-C3C bond order ' HEC NON-POLYMER +FADmod1 "FLAVIN-ADENINE DINUCLEOTIDE" FAD NON-POLYMER +HISmod1 HISTIDINE HIS peptide +FADmod2 "FLAVIN-ADENINE DINUCLEOTIDE" FAD NON-POLYMER +HISmod2 HISTIDINE HIS peptide +FADmod3 "FLAVIN-ADENINE DINUCLEOTIDE" FAD NON-POLYMER +GTPmod1 "GUANOSINE-5'-TRIPHOSPHATE" GTP NON-POLYMER +HEMmod2 "PROTOPORPHYRIN IX CONTAINING FE" HEM NON-POLYMER +HEMmod3 "PROTOPORPHYRIN IX CONTAINING FE" HEM NON-POLYMER +TYRmod1 TYROSINE TYR peptide +HISmod3 HISTIDINE HIS peptide +TYRmod2 TYROSINE TYR peptide +LYSmod1 LYSINE LYS peptide +CYSmod2 CYSTEINE CYS peptide +LYSmod2 LYSINE LYS peptide +LYSmod3 LYSINE LYS peptide +ASNmod1 ASPARAGINE ASN peptide +METmod1 METHIONINE MET peptide +TYRmod3 TYROSINE TYR peptide +LEUmod1 LEUCINE LEU peptide +LYSmod4 LYSINE LYS peptide +TRPmod1 TRYPTOPHAN TRP peptide +TYRmod4 TYROSINE TYR peptide +TYRmod5 TYROSINE TYR peptide +LYSmod5 LYSINE LYS peptide +MS6mod2 DEL-HN1_equiv_for_MS6-pept . peptide +ASPprot "Protonation of ASP" ASP peptide +GLUprot "Protonation of GLU" GLU peptide +HISprot1 HISTIDINE HIS peptide +HISprot2 HISTIDINE HIS peptide + +data_link_DNA-SER +loop_ +_chem_link_bond.link_id +_chem_link_bond.atom_1_comp_id +_chem_link_bond.atom_id_1 +_chem_link_bond.atom_2_comp_id +_chem_link_bond.atom_id_2 +_chem_link_bond.type +_chem_link_bond.value_dist +_chem_link_bond.value_dist_esd +DNA-SER 1 P 2 OG SINGLE 1.607 0.0108 + +loop_ +_chem_link_angle.link_id +_chem_link_angle.atom_1_comp_id +_chem_link_angle.atom_id_1 +_chem_link_angle.atom_2_comp_id +_chem_link_angle.atom_id_2 +_chem_link_angle.atom_3_comp_id +_chem_link_angle.atom_id_3 +_chem_link_angle.value_angle +_chem_link_angle.value_angle_esd +DNA-SER 1 OP1 1 P 2 OG 107.777 3.00 +DNA-SER 1 OP2 1 P 2 OG 107.777 3.00 +DNA-SER 1 "O5'" 1 P 2 OG 103.482 3.00 +DNA-SER 2 CB 2 OG 1 P 119.008 2.40 + +loop_ +_chem_link_tor.link_id +_chem_link_tor.id +_chem_link_tor.atom_1_comp_id +_chem_link_tor.atom_id_1 +_chem_link_tor.atom_2_comp_id +_chem_link_tor.atom_id_2 +_chem_link_tor.atom_3_comp_id +_chem_link_tor.atom_id_3 +_chem_link_tor.atom_4_comp_id +_chem_link_tor.atom_id_4 +_chem_link_tor.value_angle +_chem_link_tor.value_angle_esd +_chem_link_tor.period +DNA-SER sp3_sp3_1 2 CB 2 OG 1 P 1 OP1 60.000 10.0 3 +DNA-SER sp3_sp3_2 2 CA 2 CB 2 OG 1 P 180.000 10.0 3 + +loop_ +_chem_link_chir.link_id +_chem_link_chir.atom_centre_comp_id +_chem_link_chir.atom_id_centre +_chem_link_chir.atom_1_comp_id +_chem_link_chir.atom_id_1 +_chem_link_chir.atom_2_comp_id +_chem_link_chir.atom_id_2 +_chem_link_chir.atom_3_comp_id +_chem_link_chir.atom_id_3 +_chem_link_chir.volume_sign +DNA-SER 1 P 1 "O5'" 2 OG 1 OP2 both + +data_link_DNA-TYR +loop_ +_chem_link_bond.link_id +_chem_link_bond.atom_1_comp_id +_chem_link_bond.atom_id_1 +_chem_link_bond.atom_2_comp_id +_chem_link_bond.atom_id_2 +_chem_link_bond.type +_chem_link_bond.value_dist +_chem_link_bond.value_dist_esd +DNA-TYR 1 P 2 OH SINGLE 1.618 0.0100 + +loop_ +_chem_link_angle.link_id +_chem_link_angle.atom_1_comp_id +_chem_link_angle.atom_id_1 +_chem_link_angle.atom_2_comp_id +_chem_link_angle.atom_id_2 +_chem_link_angle.atom_3_comp_id +_chem_link_angle.atom_id_3 +_chem_link_angle.value_angle +_chem_link_angle.value_angle_esd +DNA-TYR 1 OP1 1 P 2 OH 108.075 3.00 +DNA-TYR 1 OP2 1 P 2 OH 108.075 3.00 +DNA-TYR 1 "O5'" 1 P 2 OH 101.281 3.00 +DNA-TYR 2 CZ 2 OH 1 P 121.950 3.00 + +loop_ +_chem_link_tor.link_id +_chem_link_tor.id +_chem_link_tor.atom_1_comp_id +_chem_link_tor.atom_id_1 +_chem_link_tor.atom_2_comp_id +_chem_link_tor.atom_id_2 +_chem_link_tor.atom_3_comp_id +_chem_link_tor.atom_id_3 +_chem_link_tor.atom_4_comp_id +_chem_link_tor.atom_id_4 +_chem_link_tor.value_angle +_chem_link_tor.value_angle_esd +_chem_link_tor.period +DNA-TYR sp3_sp3_1 1 OP1 1 P 2 OH 2 CZ 180.000 10.0 3 +DNA-TYR sp2_sp2_1 2 CE1 2 CZ 2 OH 1 P 180.000 5.0 2 + +loop_ +_chem_link_chir.link_id +_chem_link_chir.atom_centre_comp_id +_chem_link_chir.atom_id_centre +_chem_link_chir.atom_1_comp_id +_chem_link_chir.atom_id_1 +_chem_link_chir.atom_2_comp_id +_chem_link_chir.atom_id_2 +_chem_link_chir.atom_3_comp_id +_chem_link_chir.atom_id_3 +_chem_link_chir.volume_sign +DNA-TYR 1 P 1 "O5'" 2 OH 1 OP2 both + +data_link_SS +loop_ +_chem_link_bond.link_id +_chem_link_bond.atom_1_comp_id +_chem_link_bond.atom_id_1 +_chem_link_bond.atom_2_comp_id +_chem_link_bond.atom_id_2 +_chem_link_bond.type +_chem_link_bond.value_dist +_chem_link_bond.value_dist_esd +SS 1 SG 2 SG single 2.031 .020 + +loop_ +_chem_link_angle.link_id +_chem_link_angle.atom_1_comp_id +_chem_link_angle.atom_id_1 +_chem_link_angle.atom_2_comp_id +_chem_link_angle.atom_id_2 +_chem_link_angle.atom_3_comp_id +_chem_link_angle.atom_id_3 +_chem_link_angle.value_angle +_chem_link_angle.value_angle_esd +SS 1 CB 1 SG 2 SG 103.800 1.800 +SS 1 SG 2 SG 2 CB 103.800 1.800 + +loop_ +_chem_link_tor.link_id +_chem_link_tor.id +_chem_link_tor.atom_1_comp_id +_chem_link_tor.atom_id_1 +_chem_link_tor.atom_2_comp_id +_chem_link_tor.atom_id_2 +_chem_link_tor.atom_3_comp_id +_chem_link_tor.atom_id_3 +_chem_link_tor.atom_4_comp_id +_chem_link_tor.atom_id_4 +_chem_link_tor.value_angle +_chem_link_tor.value_angle_esd +_chem_link_tor.period +SS ss 1 CB 1 SG 2 SG 2 CB 90.00 10.0 2 + +data_link_disulf +loop_ +_chem_link_bond.link_id +_chem_link_bond.atom_1_comp_id +_chem_link_bond.atom_id_1 +_chem_link_bond.atom_2_comp_id +_chem_link_bond.atom_id_2 +_chem_link_bond.type +_chem_link_bond.value_dist +_chem_link_bond.value_dist_esd +disulf 1 SG 2 SG single 2.031 .020 + +loop_ +_chem_link_angle.link_id +_chem_link_angle.atom_1_comp_id +_chem_link_angle.atom_id_1 +_chem_link_angle.atom_2_comp_id +_chem_link_angle.atom_id_2 +_chem_link_angle.atom_3_comp_id +_chem_link_angle.atom_id_3 +_chem_link_angle.value_angle +_chem_link_angle.value_angle_esd +disulf 1 CB 1 SG 2 SG 103.800 1.800 +disulf 1 SG 2 SG 2 CB 103.800 1.800 + +loop_ +_chem_link_tor.link_id +_chem_link_tor.id +_chem_link_tor.atom_1_comp_id +_chem_link_tor.atom_id_1 +_chem_link_tor.atom_2_comp_id +_chem_link_tor.atom_id_2 +_chem_link_tor.atom_3_comp_id +_chem_link_tor.atom_id_3 +_chem_link_tor.atom_4_comp_id +_chem_link_tor.atom_id_4 +_chem_link_tor.value_angle +_chem_link_tor.value_angle_esd +_chem_link_tor.period +disulf ss 1 CB 1 SG 2 SG 2 CB 90.00 10.0 2 + +data_link_TRANS +loop_ +_chem_link_bond.link_id +_chem_link_bond.atom_1_comp_id +_chem_link_bond.atom_id_1 +_chem_link_bond.atom_2_comp_id +_chem_link_bond.atom_id_2 +_chem_link_bond.type +_chem_link_bond.value_dist +_chem_link_bond.value_dist_esd +TRANS 1 C 2 N SINGLE 1.337 0.011 + +loop_ +_chem_link_angle.link_id +_chem_link_angle.atom_1_comp_id +_chem_link_angle.atom_id_1 +_chem_link_angle.atom_2_comp_id +_chem_link_angle.atom_id_2 +_chem_link_angle.atom_3_comp_id +_chem_link_angle.atom_id_3 +_chem_link_angle.value_angle +_chem_link_angle.value_angle_esd +TRANS 1 CA 1 C 2 N 115.917 1.50 +TRANS 1 O 1 C 2 N 123.469 1.50 +TRANS 1 C 2 N 2 CA 122.095 1.76 +TRANS 1 C 2 N 2 H 119.176 1.83 + +loop_ +_chem_link_tor.link_id +_chem_link_tor.id +_chem_link_tor.atom_1_comp_id +_chem_link_tor.atom_id_1 +_chem_link_tor.atom_2_comp_id +_chem_link_tor.atom_id_2 +_chem_link_tor.atom_3_comp_id +_chem_link_tor.atom_id_3 +_chem_link_tor.atom_4_comp_id +_chem_link_tor.atom_id_4 +_chem_link_tor.value_angle +_chem_link_tor.value_angle_esd +_chem_link_tor.period +TRANS psi 1 N 1 CA 1 C 2 N 160.00 30.0 2 +TRANS omega 1 CA 1 C 2 N 2 CA 180.00 5.0 0 +TRANS phi 1 C 2 N 2 CA 2 C 60.00 20.0 3 + +loop_ +_chem_link_plane.link_id +_chem_link_plane.plane_id +_chem_link_plane.atom_comp_id +_chem_link_plane.atom_id +_chem_link_plane.dist_esd +TRANS plan-1 1 CA 0.020 +TRANS plan-1 1 C 0.020 +TRANS plan-1 2 N 0.020 +TRANS plan-1 1 O 0.020 +TRANS plan-2 2 CA 0.020 +TRANS plan-2 1 C 0.020 +TRANS plan-2 2 H 0.020 +TRANS plan-2 2 N 0.020 + +data_link_CIS +loop_ +_chem_link_bond.link_id +_chem_link_bond.atom_1_comp_id +_chem_link_bond.atom_id_1 +_chem_link_bond.atom_2_comp_id +_chem_link_bond.atom_id_2 +_chem_link_bond.type +_chem_link_bond.value_dist +_chem_link_bond.value_dist_esd +CIS 1 C 2 N SINGLE 1.337 0.011 + +loop_ +_chem_link_angle.link_id +_chem_link_angle.atom_1_comp_id +_chem_link_angle.atom_id_1 +_chem_link_angle.atom_2_comp_id +_chem_link_angle.atom_id_2 +_chem_link_angle.atom_3_comp_id +_chem_link_angle.atom_id_3 +_chem_link_angle.value_angle +_chem_link_angle.value_angle_esd +CIS 1 CA 1 C 2 N 115.917 1.50 +CIS 1 O 1 C 2 N 123.469 1.50 +CIS 1 C 2 N 2 CA 122.095 1.76 +CIS 1 C 2 N 2 H 119.176 1.83 + +loop_ +_chem_link_tor.link_id +_chem_link_tor.id +_chem_link_tor.atom_1_comp_id +_chem_link_tor.atom_id_1 +_chem_link_tor.atom_2_comp_id +_chem_link_tor.atom_id_2 +_chem_link_tor.atom_3_comp_id +_chem_link_tor.atom_id_3 +_chem_link_tor.atom_4_comp_id +_chem_link_tor.atom_id_4 +_chem_link_tor.value_angle +_chem_link_tor.value_angle_esd +_chem_link_tor.period +CIS psi 1 N 1 CA 1 C 2 N 160.00 30.0 2 +CIS omega 1 CA 1 C 2 N 2 CA 0.00 5.0 0 +CIS phi 1 C 2 N 2 CA 2 C 60.00 20.0 3 + +loop_ +_chem_link_plane.link_id +_chem_link_plane.plane_id +_chem_link_plane.atom_comp_id +_chem_link_plane.atom_id +_chem_link_plane.dist_esd +CIS plan-1 1 CA 0.020 +CIS plan-1 1 C 0.020 +CIS plan-1 2 N 0.020 +CIS plan-1 1 O 0.020 +CIS plan-2 2 CA 0.020 +CIS plan-2 1 C 0.020 +CIS plan-2 2 H 0.020 +CIS plan-2 2 N 0.020 + +data_link_PTRANS +loop_ +_chem_link_bond.link_id +_chem_link_bond.atom_1_comp_id +_chem_link_bond.atom_id_1 +_chem_link_bond.atom_2_comp_id +_chem_link_bond.atom_id_2 +_chem_link_bond.type +_chem_link_bond.value_dist +_chem_link_bond.value_dist_esd +PTRANS 1 C 2 N SINGLE 1.352 0.010 + +loop_ +_chem_link_angle.link_id +_chem_link_angle.atom_1_comp_id +_chem_link_angle.atom_id_1 +_chem_link_angle.atom_2_comp_id +_chem_link_angle.atom_id_2 +_chem_link_angle.atom_3_comp_id +_chem_link_angle.atom_id_3 +_chem_link_angle.value_angle +_chem_link_angle.value_angle_esd +PTRANS 1 CA 1 C 2 N 118.415 1.50 +PTRANS 1 O 1 C 2 N 121.016 1.53 +PTRANS 2 CA 2 N 1 C 120.469 1.50 +PTRANS 2 CD 2 N 1 C 124.005 1.50 + +loop_ +_chem_link_tor.link_id +_chem_link_tor.id +_chem_link_tor.atom_1_comp_id +_chem_link_tor.atom_id_1 +_chem_link_tor.atom_2_comp_id +_chem_link_tor.atom_id_2 +_chem_link_tor.atom_3_comp_id +_chem_link_tor.atom_id_3 +_chem_link_tor.atom_4_comp_id +_chem_link_tor.atom_id_4 +_chem_link_tor.value_angle +_chem_link_tor.value_angle_esd +_chem_link_tor.period +PTRANS psi 1 N 1 CA 1 C 2 N 160.00 30.0 2 +PTRANS omega 1 CA 1 C 2 N 2 CA 180.00 5.0 0 +PTRANS phi 1 C 2 N 2 CA 2 C 60.00 20.0 3 + +loop_ +_chem_link_plane.link_id +_chem_link_plane.plane_id +_chem_link_plane.atom_comp_id +_chem_link_plane.atom_id +_chem_link_plane.dist_esd +PTRANS plan-1 1 CA 0.020 +PTRANS plan-1 1 C 0.020 +PTRANS plan-1 2 N 0.020 +PTRANS plan-1 1 O 0.020 +PTRANS plan-2 1 C .020 +PTRANS plan-2 2 N .020 +PTRANS plan-2 2 CA .020 +PTRANS plan-2 2 CD .020 + +data_link_PCIS +loop_ +_chem_link_bond.link_id +_chem_link_bond.atom_1_comp_id +_chem_link_bond.atom_id_1 +_chem_link_bond.atom_2_comp_id +_chem_link_bond.atom_id_2 +_chem_link_bond.type +_chem_link_bond.value_dist +_chem_link_bond.value_dist_esd +PCIS 1 C 2 N SINGLE 1.352 0.010 + +loop_ +_chem_link_angle.link_id +_chem_link_angle.atom_1_comp_id +_chem_link_angle.atom_id_1 +_chem_link_angle.atom_2_comp_id +_chem_link_angle.atom_id_2 +_chem_link_angle.atom_3_comp_id +_chem_link_angle.atom_id_3 +_chem_link_angle.value_angle +_chem_link_angle.value_angle_esd +PCIS 1 CA 1 C 2 N 118.415 1.50 +PCIS 1 O 1 C 2 N 121.016 1.53 +PCIS 2 CA 2 N 1 C 120.469 1.50 +PCIS 2 CD 2 N 1 C 124.005 1.50 + +loop_ +_chem_link_tor.link_id +_chem_link_tor.id +_chem_link_tor.atom_1_comp_id +_chem_link_tor.atom_id_1 +_chem_link_tor.atom_2_comp_id +_chem_link_tor.atom_id_2 +_chem_link_tor.atom_3_comp_id +_chem_link_tor.atom_id_3 +_chem_link_tor.atom_4_comp_id +_chem_link_tor.atom_id_4 +_chem_link_tor.value_angle +_chem_link_tor.value_angle_esd +_chem_link_tor.period +PCIS psi 1 N 1 CA 1 C 2 N 160.00 30.0 2 +PCIS omega 1 CA 1 C 2 N 2 CA 0.00 5.0 0 +PCIS phi 1 C 2 N 2 CA 2 C 60.00 20.0 3 + +loop_ +_chem_link_plane.link_id +_chem_link_plane.plane_id +_chem_link_plane.atom_comp_id +_chem_link_plane.atom_id +_chem_link_plane.dist_esd +PCIS plan-1 1 CA 0.020 +PCIS plan-1 1 C 0.020 +PCIS plan-1 2 N 0.020 +PCIS plan-1 1 O 0.020 +PCIS plan-2 1 C .020 +PCIS plan-2 2 N .020 +PCIS plan-2 2 CA .020 +PCIS plan-2 2 CD .020 + +data_link_NMTRANS +loop_ +_chem_link_bond.link_id +_chem_link_bond.atom_1_comp_id +_chem_link_bond.atom_id_1 +_chem_link_bond.atom_2_comp_id +_chem_link_bond.atom_id_2 +_chem_link_bond.type +_chem_link_bond.value_dist +_chem_link_bond.value_dist_esd +NMTRANS 1 C 2 N SINGLE 1.346 0.020 + +loop_ +_chem_link_angle.link_id +_chem_link_angle.atom_1_comp_id +_chem_link_angle.atom_id_1 +_chem_link_angle.atom_2_comp_id +_chem_link_angle.atom_id_2 +_chem_link_angle.atom_3_comp_id +_chem_link_angle.atom_id_3 +_chem_link_angle.value_angle +_chem_link_angle.value_angle_esd +NMTRANS 1 CA 1 C 2 N 118.492 1.50 +NMTRANS 1 O 1 C 2 N 121.426 2.26 +NMTRANS 2 CA 2 N 1 C 121.862 2.35 +NMTRANS 2 CN 2 N 1 C 121.178 3.00 + +loop_ +_chem_link_tor.link_id +_chem_link_tor.id +_chem_link_tor.atom_1_comp_id +_chem_link_tor.atom_id_1 +_chem_link_tor.atom_2_comp_id +_chem_link_tor.atom_id_2 +_chem_link_tor.atom_3_comp_id +_chem_link_tor.atom_id_3 +_chem_link_tor.atom_4_comp_id +_chem_link_tor.atom_id_4 +_chem_link_tor.value_angle +_chem_link_tor.value_angle_esd +_chem_link_tor.period +NMTRANS psi 1 N 1 CA 1 C 2 N 160.00 30.0 2 +NMTRANS omega 1 CA 1 C 2 N 2 CA 180.00 5.0 0 +NMTRANS phi 1 C 2 N 2 CA 2 C 60.00 20.0 3 + +loop_ +_chem_link_plane.link_id +_chem_link_plane.plane_id +_chem_link_plane.atom_comp_id +_chem_link_plane.atom_id +_chem_link_plane.dist_esd +NMTRANS plan-2 1 CA 0.020 +NMTRANS plan-2 1 C 0.020 +NMTRANS plan-2 2 N 0.020 +NMTRANS plan-2 1 O 0.020 +NMTRANS plan-3 2 CA 0.020 +NMTRANS plan-3 2 CN 0.020 +NMTRANS plan-3 1 C 0.020 +NMTRANS plan-3 2 N 0.020 + +data_link_NMCIS +loop_ +_chem_link_bond.link_id +_chem_link_bond.atom_1_comp_id +_chem_link_bond.atom_id_1 +_chem_link_bond.atom_2_comp_id +_chem_link_bond.atom_id_2 +_chem_link_bond.type +_chem_link_bond.value_dist +_chem_link_bond.value_dist_esd +NMCIS 1 C 2 N single 1.329 .014 + +loop_ +_chem_link_angle.link_id +_chem_link_angle.atom_1_comp_id +_chem_link_angle.atom_id_1 +_chem_link_angle.atom_2_comp_id +_chem_link_angle.atom_id_2 +_chem_link_angle.atom_3_comp_id +_chem_link_angle.atom_id_3 +_chem_link_angle.value_angle +_chem_link_angle.value_angle_esd +NMCIS 1 O 1 C 2 N 123.000 1.600 +NMCIS 1 CA 1 C 2 N 116.200 2.000 +NMCIS 1 C 2 N 2 CN 124.300 3.000 +NMCIS 1 C 2 N 2 CA 121.700 1.800 + +loop_ +_chem_link_tor.link_id +_chem_link_tor.id +_chem_link_tor.atom_1_comp_id +_chem_link_tor.atom_id_1 +_chem_link_tor.atom_2_comp_id +_chem_link_tor.atom_id_2 +_chem_link_tor.atom_3_comp_id +_chem_link_tor.atom_id_3 +_chem_link_tor.atom_4_comp_id +_chem_link_tor.atom_id_4 +_chem_link_tor.value_angle +_chem_link_tor.value_angle_esd +_chem_link_tor.period +NMCIS psi 1 N 1 CA 1 C 2 N 160.00 30.0 2 +NMCIS omega 1 CA 1 C 2 N 2 CA .00 5.0 0 +NMCIS phi 1 C 2 N 2 CA 2 C 60.00 20.0 3 + +loop_ +_chem_link_plane.link_id +_chem_link_plane.plane_id +_chem_link_plane.atom_comp_id +_chem_link_plane.atom_id +_chem_link_plane.dist_esd +NMCIS plane1 1 CA .020 +NMCIS plane1 1 C .020 +NMCIS plane1 1 O .020 +NMCIS plane1 2 N .020 +NMCIS plane2 1 C .050 +NMCIS plane2 2 N .050 +NMCIS plane2 2 CA .050 +NMCIS plane2 2 CN .050 + +data_link_gap + +data_link_p +loop_ +_chem_link_bond.link_id +_chem_link_bond.atom_1_comp_id +_chem_link_bond.atom_id_1 +_chem_link_bond.atom_2_comp_id +_chem_link_bond.atom_id_2 +_chem_link_bond.type +_chem_link_bond.value_dist +_chem_link_bond.value_dist_esd +p 1 "O3'" 2 P SINGLE 1.607 0.0100 + +loop_ +_chem_link_angle.link_id +_chem_link_angle.atom_1_comp_id +_chem_link_angle.atom_id_1 +_chem_link_angle.atom_2_comp_id +_chem_link_angle.atom_id_2 +_chem_link_angle.atom_3_comp_id +_chem_link_angle.atom_id_3 +_chem_link_angle.value_angle +_chem_link_angle.value_angle_esd +p 1 "C3'" 1 "O3'" 2 P 121.082 1.50 +p 2 OP1 2 P 1 "O3'" 109.493 3.00 +p 2 OP2 2 P 1 "O3'" 109.493 3.00 +p 2 "O5'" 2 P 1 "O3'" 100.661 3.00 + +loop_ +_chem_link_tor.link_id +_chem_link_tor.id +_chem_link_tor.atom_1_comp_id +_chem_link_tor.atom_id_1 +_chem_link_tor.atom_2_comp_id +_chem_link_tor.atom_id_2 +_chem_link_tor.atom_3_comp_id +_chem_link_tor.atom_id_3 +_chem_link_tor.atom_4_comp_id +_chem_link_tor.atom_id_4 +_chem_link_tor.value_angle +_chem_link_tor.value_angle_esd +_chem_link_tor.period +p zeta 1 "C3'" 1 "O3'" 2 P 2 "O5'" 60.000 10.00 3 +p epsilon 1 "C4'" 1 "C3'" 1 "O3'" 2 P 180.000 10.00 3 +p alpha 1 "O3'" 2 "P" 2 "O5'" 2 "C5'" 180.000 10.00 3 + +loop_ +_chem_link_chir.link_id +_chem_link_chir.atom_centre_comp_id +_chem_link_chir.atom_id_centre +_chem_link_chir.atom_1_comp_id +_chem_link_chir.atom_id_1 +_chem_link_chir.atom_2_comp_id +_chem_link_chir.atom_id_2 +_chem_link_chir.atom_3_comp_id +_chem_link_chir.atom_id_3 +_chem_link_chir.volume_sign +p 2 P 2 "O5'" 1 "O3'" 2 OP2 both + +data_link_AA-RNA +loop_ +_chem_link_bond.link_id +_chem_link_bond.atom_1_comp_id +_chem_link_bond.atom_id_1 +_chem_link_bond.atom_2_comp_id +_chem_link_bond.atom_id_2 +_chem_link_bond.type +_chem_link_bond.value_dist +_chem_link_bond.value_dist_esd +AA-RNA 1 C 2 "O3'" SINGLE 1.334 0.0128 + +loop_ +_chem_link_angle.link_id +_chem_link_angle.atom_1_comp_id +_chem_link_angle.atom_id_1 +_chem_link_angle.atom_2_comp_id +_chem_link_angle.atom_id_2 +_chem_link_angle.atom_3_comp_id +_chem_link_angle.atom_id_3 +_chem_link_angle.value_angle +_chem_link_angle.value_angle_esd +AA-RNA 1 CA 1 C 2 "O3'" 111.770 3.00 +AA-RNA 1 O 1 C 2 "O3'" 123.273 1.50 +AA-RNA 2 "C3'" 2 "O3'" 1 C 116.978 1.50 + +loop_ +_chem_link_tor.link_id +_chem_link_tor.id +_chem_link_tor.atom_1_comp_id +_chem_link_tor.atom_id_1 +_chem_link_tor.atom_2_comp_id +_chem_link_tor.atom_id_2 +_chem_link_tor.atom_3_comp_id +_chem_link_tor.atom_id_3 +_chem_link_tor.atom_4_comp_id +_chem_link_tor.atom_id_4 +_chem_link_tor.value_angle +_chem_link_tor.value_angle_esd +_chem_link_tor.period +AA-RNA sp2_sp2_1 1 CA 1 C 2 "O3'" 2 "C3'" 180.000 5.0 2 +AA-RNA sp3_sp3_1 2 "C4'" 2 "C3'" 2 "O3'" 1 C 180.000 10.0 3 + +loop_ +_chem_link_plane.link_id +_chem_link_plane.plane_id +_chem_link_plane.atom_comp_id +_chem_link_plane.atom_id +_chem_link_plane.dist_esd +AA-RNA plan-1 1 CA 0.020 +AA-RNA plan-1 1 C 0.020 +AA-RNA plan-1 2 "O3'" 0.020 +AA-RNA plan-1 1 O 0.020 + +data_link_ZN-CYS +loop_ +_chem_link_bond.link_id +_chem_link_bond.atom_1_comp_id +_chem_link_bond.atom_id_1 +_chem_link_bond.atom_2_comp_id +_chem_link_bond.atom_id_2 +_chem_link_bond.type +_chem_link_bond.value_dist +_chem_link_bond.value_dist_esd +ZN-CYS 1 ZN 2 SG single 2.340 .020 + +loop_ +_chem_link_angle.link_id +_chem_link_angle.atom_1_comp_id +_chem_link_angle.atom_id_1 +_chem_link_angle.atom_2_comp_id +_chem_link_angle.atom_id_2 +_chem_link_angle.atom_3_comp_id +_chem_link_angle.atom_id_3 +_chem_link_angle.value_angle +_chem_link_angle.value_angle_esd +ZN-CYS 1 ZN 2 SG 2 CB 109.000 3.000 + +data_link_ZN-HISND +loop_ +_chem_link_bond.link_id +_chem_link_bond.atom_1_comp_id +_chem_link_bond.atom_id_1 +_chem_link_bond.atom_2_comp_id +_chem_link_bond.atom_id_2 +_chem_link_bond.type +_chem_link_bond.value_dist +_chem_link_bond.value_dist_esd +ZN-HISND 1 ZN 2 ND1 single 2.057 .064 + +loop_ +_chem_link_angle.link_id +_chem_link_angle.atom_1_comp_id +_chem_link_angle.atom_id_1 +_chem_link_angle.atom_2_comp_id +_chem_link_angle.atom_id_2 +_chem_link_angle.atom_3_comp_id +_chem_link_angle.atom_id_3 +_chem_link_angle.value_angle +_chem_link_angle.value_angle_esd +ZN-HISND 1 ZN 2 ND1 2 CG 125.350 3.000 +ZN-HISND 1 ZN 2 ND1 2 CE1 125.350 3.000 + +data_link_ZN-HISNE +loop_ +_chem_link_bond.link_id +_chem_link_bond.atom_1_comp_id +_chem_link_bond.atom_id_1 +_chem_link_bond.atom_2_comp_id +_chem_link_bond.atom_id_2 +_chem_link_bond.type +_chem_link_bond.value_dist +_chem_link_bond.value_dist_esd +ZN-HISNE 1 ZN 2 NE2 single 2.058 .073 + +loop_ +_chem_link_angle.link_id +_chem_link_angle.atom_1_comp_id +_chem_link_angle.atom_id_1 +_chem_link_angle.atom_2_comp_id +_chem_link_angle.atom_id_2 +_chem_link_angle.atom_3_comp_id +_chem_link_angle.atom_id_3 +_chem_link_angle.value_angle +_chem_link_angle.value_angle_esd +ZN-HISNE 1 ZN 2 NE2 2 CD2 125.500 3.000 +ZN-HISNE 1 ZN 2 NE2 2 CE1 125.500 3.000 + +data_link_HEC-CYS1 +loop_ +_chem_link_bond.link_id +_chem_link_bond.atom_1_comp_id +_chem_link_bond.atom_id_1 +_chem_link_bond.atom_2_comp_id +_chem_link_bond.atom_id_2 +_chem_link_bond.type +_chem_link_bond.value_dist +_chem_link_bond.value_dist_esd +HEC-CYS1 1 SG 2 CAC SINGLE 1.824 0.0100 + +loop_ +_chem_link_angle.link_id +_chem_link_angle.atom_1_comp_id +_chem_link_angle.atom_id_1 +_chem_link_angle.atom_2_comp_id +_chem_link_angle.atom_id_2 +_chem_link_angle.atom_3_comp_id +_chem_link_angle.atom_id_3 +_chem_link_angle.value_angle +_chem_link_angle.value_angle_esd +HEC-CYS1 1 CB 1 SG 2 CAC 101.808 3.00 +HEC-CYS1 2 C3C 2 CAC 1 SG 111.652 3.00 +HEC-CYS1 2 CBC 2 CAC 1 SG 110.252 3.00 +HEC-CYS1 1 SG 2 CAC 2 HAC 107.856 1.89 + +loop_ +_chem_link_tor.link_id +_chem_link_tor.id +_chem_link_tor.atom_1_comp_id +_chem_link_tor.atom_id_1 +_chem_link_tor.atom_2_comp_id +_chem_link_tor.atom_id_2 +_chem_link_tor.atom_3_comp_id +_chem_link_tor.atom_id_3 +_chem_link_tor.atom_4_comp_id +_chem_link_tor.atom_id_4 +_chem_link_tor.value_angle +_chem_link_tor.value_angle_esd +_chem_link_tor.period +HEC-CYS1 sp3_sp3_1 2 CBC 2 CAC 1 SG 1 CB 60.000 10.0 3 +HEC-CYS1 sp3_sp3_2 1 SG 2 CAC 2 CBC 2 HBC1 60.000 10.0 3 +HEC-CYS1 sp3_sp3_3 1 CA 1 CB 1 SG 2 CAC 180.000 10.0 3 + +loop_ +_chem_link_chir.link_id +_chem_link_chir.atom_centre_comp_id +_chem_link_chir.atom_id_centre +_chem_link_chir.atom_1_comp_id +_chem_link_chir.atom_id_1 +_chem_link_chir.atom_2_comp_id +_chem_link_chir.atom_id_2 +_chem_link_chir.atom_3_comp_id +_chem_link_chir.atom_id_3 +_chem_link_chir.volume_sign +HEC-CYS1 2 CAC 1 SG 2 C3C 2 CBC both + +data_link_HEC-CYS2 +loop_ +_chem_link_bond.link_id +_chem_link_bond.atom_1_comp_id +_chem_link_bond.atom_id_1 +_chem_link_bond.atom_2_comp_id +_chem_link_bond.atom_id_2 +_chem_link_bond.type +_chem_link_bond.value_dist +_chem_link_bond.value_dist_esd +HEC-CYS2 1 SG 2 CAB SINGLE 1.824 0.0100 + +loop_ +_chem_link_angle.link_id +_chem_link_angle.atom_1_comp_id +_chem_link_angle.atom_id_1 +_chem_link_angle.atom_2_comp_id +_chem_link_angle.atom_id_2 +_chem_link_angle.atom_3_comp_id +_chem_link_angle.atom_id_3 +_chem_link_angle.value_angle +_chem_link_angle.value_angle_esd +HEC-CYS2 1 CB 1 SG 2 CAB 101.808 3.00 +HEC-CYS2 2 C3B 2 CAB 1 SG 111.652 3.00 +HEC-CYS2 2 CBB 2 CAB 1 SG 110.252 3.00 +HEC-CYS2 1 SG 2 CAB 2 HAB 107.856 1.89 + +loop_ +_chem_link_tor.link_id +_chem_link_tor.id +_chem_link_tor.atom_1_comp_id +_chem_link_tor.atom_id_1 +_chem_link_tor.atom_2_comp_id +_chem_link_tor.atom_id_2 +_chem_link_tor.atom_3_comp_id +_chem_link_tor.atom_id_3 +_chem_link_tor.atom_4_comp_id +_chem_link_tor.atom_id_4 +_chem_link_tor.value_angle +_chem_link_tor.value_angle_esd +_chem_link_tor.period +HEC-CYS2 sp3_sp3_1 2 CBB 2 CAB 1 SG 1 CB 60.000 10.0 3 +HEC-CYS2 sp3_sp3_2 1 SG 2 CAB 2 CBB 2 HBB1 60.000 10.0 3 +HEC-CYS2 sp3_sp3_3 1 CA 1 CB 1 SG 2 CAB 180.000 10.0 3 + +loop_ +_chem_link_chir.link_id +_chem_link_chir.atom_centre_comp_id +_chem_link_chir.atom_id_centre +_chem_link_chir.atom_1_comp_id +_chem_link_chir.atom_id_1 +_chem_link_chir.atom_2_comp_id +_chem_link_chir.atom_id_2 +_chem_link_chir.atom_3_comp_id +_chem_link_chir.atom_id_3 +_chem_link_chir.volume_sign +HEC-CYS2 2 CAB 1 SG 2 C3B 2 CBB both + +data_link_FE-CYS +loop_ +_chem_link_bond.link_id +_chem_link_bond.atom_1_comp_id +_chem_link_bond.atom_id_1 +_chem_link_bond.atom_2_comp_id +_chem_link_bond.atom_id_2 +_chem_link_bond.type +_chem_link_bond.value_dist +_chem_link_bond.value_dist_esd +FE-CYS 1 FE 2 SG single 2.260 .020 + +loop_ +_chem_link_angle.link_id +_chem_link_angle.atom_1_comp_id +_chem_link_angle.atom_id_1 +_chem_link_angle.atom_2_comp_id +_chem_link_angle.atom_id_2 +_chem_link_angle.atom_3_comp_id +_chem_link_angle.atom_id_3 +_chem_link_angle.value_angle +_chem_link_angle.value_angle_esd +FE-CYS 1 FE 2 SG 2 CB 109.470 3.000 + +data_link_FE-HISND +loop_ +_chem_link_bond.link_id +_chem_link_bond.atom_1_comp_id +_chem_link_bond.atom_id_1 +_chem_link_bond.atom_2_comp_id +_chem_link_bond.atom_id_2 +_chem_link_bond.type +_chem_link_bond.value_dist +_chem_link_bond.value_dist_esd +FE-HISND 1 FE 2 ND1 single 2.057 .064 + +loop_ +_chem_link_angle.link_id +_chem_link_angle.atom_1_comp_id +_chem_link_angle.atom_id_1 +_chem_link_angle.atom_2_comp_id +_chem_link_angle.atom_id_2 +_chem_link_angle.atom_3_comp_id +_chem_link_angle.atom_id_3 +_chem_link_angle.value_angle +_chem_link_angle.value_angle_esd +FE-HISND 1 FE 2 ND1 2 CG 125.350 3.000 +FE-HISND 1 FE 2 ND1 2 CE1 125.350 3.000 + +data_link_FE-HISNE +loop_ +_chem_link_bond.link_id +_chem_link_bond.atom_1_comp_id +_chem_link_bond.atom_id_1 +_chem_link_bond.atom_2_comp_id +_chem_link_bond.atom_id_2 +_chem_link_bond.type +_chem_link_bond.value_dist +_chem_link_bond.value_dist_esd +FE-HISNE 1 FE 2 NE2 single 2.058 .073 + +loop_ +_chem_link_angle.link_id +_chem_link_angle.atom_1_comp_id +_chem_link_angle.atom_id_1 +_chem_link_angle.atom_2_comp_id +_chem_link_angle.atom_id_2 +_chem_link_angle.atom_3_comp_id +_chem_link_angle.atom_id_3 +_chem_link_angle.value_angle +_chem_link_angle.value_angle_esd +FE-HISNE 1 FE 2 NE2 2 CD2 125.500 3.000 +FE-HISNE 1 FE 2 NE2 2 CE1 125.500 3.000 + +data_link_symmetry +loop_ +_chem_link_bond.link_id +_chem_link_bond.atom_1_comp_id +_chem_link_bond.atom_id_1 +_chem_link_bond.atom_2_comp_id +_chem_link_bond.atom_id_2 +_chem_link_bond.type +_chem_link_bond.value_dist +_chem_link_bond.value_dist_esd +symmetry 0 . 0 . . .000 .020 + +data_link_CYS-FAD +loop_ +_chem_link_bond.link_id +_chem_link_bond.atom_1_comp_id +_chem_link_bond.atom_id_1 +_chem_link_bond.atom_2_comp_id +_chem_link_bond.atom_id_2 +_chem_link_bond.type +_chem_link_bond.value_dist +_chem_link_bond.value_dist_esd +CYS-FAD 1 SG 2 C8M SINGLE 1.820 0.0100 + +loop_ +_chem_link_angle.link_id +_chem_link_angle.atom_1_comp_id +_chem_link_angle.atom_id_1 +_chem_link_angle.atom_2_comp_id +_chem_link_angle.atom_id_2 +_chem_link_angle.atom_3_comp_id +_chem_link_angle.atom_id_3 +_chem_link_angle.value_angle +_chem_link_angle.value_angle_esd +CYS-FAD 1 CB 1 SG 2 C8M 101.044 3.00 +CYS-FAD 2 C8 2 C8M 1 SG 113.672 3.00 +CYS-FAD 1 SG 2 C8M 2 HM81 108.732 1.50 +CYS-FAD 1 SG 2 C8M 2 HM82 108.732 1.50 + +loop_ +_chem_link_tor.link_id +_chem_link_tor.id +_chem_link_tor.atom_1_comp_id +_chem_link_tor.atom_id_1 +_chem_link_tor.atom_2_comp_id +_chem_link_tor.atom_id_2 +_chem_link_tor.atom_3_comp_id +_chem_link_tor.atom_id_3 +_chem_link_tor.atom_4_comp_id +_chem_link_tor.atom_id_4 +_chem_link_tor.value_angle +_chem_link_tor.value_angle_esd +_chem_link_tor.period +CYS-FAD sp3_sp3_1 2 C8 2 C8M 1 SG 1 CB 180.000 10.0 3 +CYS-FAD sp2_sp3_1 2 C7 2 C8 2 C8M 1 SG -90.000 10.0 6 +CYS-FAD sp3_sp3_2 1 CA 1 CB 1 SG 2 C8M 180.000 10.0 3 + +data_link_HIS-FAD1 +loop_ +_chem_link_bond.link_id +_chem_link_bond.atom_1_comp_id +_chem_link_bond.atom_id_1 +_chem_link_bond.atom_2_comp_id +_chem_link_bond.atom_id_2 +_chem_link_bond.type +_chem_link_bond.value_dist +_chem_link_bond.value_dist_esd +HIS-FAD1 1 ND1 2 C8M SINGLE 1.467 0.0125 + +loop_ +_chem_link_angle.link_id +_chem_link_angle.atom_1_comp_id +_chem_link_angle.atom_id_1 +_chem_link_angle.atom_2_comp_id +_chem_link_angle.atom_id_2 +_chem_link_angle.atom_3_comp_id +_chem_link_angle.atom_id_3 +_chem_link_angle.value_angle +_chem_link_angle.value_angle_esd +HIS-FAD1 1 CG 1 ND1 2 C8M 125.176 2.51 +HIS-FAD1 1 CE1 1 ND1 2 C8M 126.099 1.66 +HIS-FAD1 2 C8 2 C8M 1 ND1 112.614 2.48 +HIS-FAD1 1 ND1 2 C8M 2 HM81 108.931 1.50 +HIS-FAD1 1 ND1 2 C8M 2 HM82 108.931 1.50 + +loop_ +_chem_link_tor.link_id +_chem_link_tor.id +_chem_link_tor.atom_1_comp_id +_chem_link_tor.atom_id_1 +_chem_link_tor.atom_2_comp_id +_chem_link_tor.atom_id_2 +_chem_link_tor.atom_3_comp_id +_chem_link_tor.atom_id_3 +_chem_link_tor.atom_4_comp_id +_chem_link_tor.atom_id_4 +_chem_link_tor.value_angle +_chem_link_tor.value_angle_esd +_chem_link_tor.period +HIS-FAD1 sp2_sp3_1 1 CG 1 ND1 2 C8M 2 C8 -90.000 10.0 6 +HIS-FAD1 sp2_sp3_2 2 C7 2 C8 2 C8M 1 ND1 -90.000 10.0 6 +HIS-FAD1 const_82_1 1 CB 1 CG 1 ND1 2 C8M 0.000 0.0 2 + +loop_ +_chem_link_plane.link_id +_chem_link_plane.plane_id +_chem_link_plane.atom_comp_id +_chem_link_plane.atom_id +_chem_link_plane.dist_esd +HIS-FAD1 plan-6 1 CB 0.020 +HIS-FAD1 plan-6 2 C8M 0.020 +HIS-FAD1 plan-6 1 CG 0.020 +HIS-FAD1 plan-6 1 CD2 0.020 +HIS-FAD1 plan-6 1 CE1 0.020 +HIS-FAD1 plan-6 1 HD2 0.020 +HIS-FAD1 plan-6 1 HE1 0.020 +HIS-FAD1 plan-6 1 HE2 0.020 +HIS-FAD1 plan-6 1 NE2 0.020 +HIS-FAD1 plan-6 1 ND1 0.020 + +data_link_HIS-FAD2 +loop_ +_chem_link_bond.link_id +_chem_link_bond.atom_1_comp_id +_chem_link_bond.atom_id_1 +_chem_link_bond.atom_2_comp_id +_chem_link_bond.atom_id_2 +_chem_link_bond.type +_chem_link_bond.value_dist +_chem_link_bond.value_dist_esd +HIS-FAD2 1 NE2 2 C8M SINGLE 1.477 0.0113 + +loop_ +_chem_link_angle.link_id +_chem_link_angle.atom_1_comp_id +_chem_link_angle.atom_id_1 +_chem_link_angle.atom_2_comp_id +_chem_link_angle.atom_id_2 +_chem_link_angle.atom_3_comp_id +_chem_link_angle.atom_id_3 +_chem_link_angle.value_angle +_chem_link_angle.value_angle_esd +HIS-FAD2 1 CD2 1 NE2 2 C8M 125.649 2.86 +HIS-FAD2 1 CE1 1 NE2 2 C8M 126.201 1.50 +HIS-FAD2 2 C8 2 C8M 1 NE2 112.614 2.48 +HIS-FAD2 1 NE2 2 C8M 2 HM81 109.095 1.50 +HIS-FAD2 1 NE2 2 C8M 2 HM82 109.095 1.50 + +loop_ +_chem_link_tor.link_id +_chem_link_tor.id +_chem_link_tor.atom_1_comp_id +_chem_link_tor.atom_id_1 +_chem_link_tor.atom_2_comp_id +_chem_link_tor.atom_id_2 +_chem_link_tor.atom_3_comp_id +_chem_link_tor.atom_id_3 +_chem_link_tor.atom_4_comp_id +_chem_link_tor.atom_id_4 +_chem_link_tor.value_angle +_chem_link_tor.value_angle_esd +_chem_link_tor.period +HIS-FAD2 sp2_sp3_1 1 CD2 1 NE2 2 C8M 2 C8 -90.000 10.0 6 +HIS-FAD2 sp2_sp3_2 2 C7 2 C8 2 C8M 1 NE2 -90.000 10.0 6 +HIS-FAD2 const_92_1 1 CG 1 CD2 1 NE2 2 C8M 180.000 0.0 2 + +loop_ +_chem_link_plane.link_id +_chem_link_plane.plane_id +_chem_link_plane.atom_comp_id +_chem_link_plane.atom_id +_chem_link_plane.dist_esd +HIS-FAD2 plan-6 1 CB 0.020 +HIS-FAD2 plan-6 2 C8M 0.020 +HIS-FAD2 plan-6 1 CG 0.020 +HIS-FAD2 plan-6 1 CD2 0.020 +HIS-FAD2 plan-6 1 CE1 0.020 +HIS-FAD2 plan-6 1 HD1 0.020 +HIS-FAD2 plan-6 1 HD2 0.020 +HIS-FAD2 plan-6 1 HE1 0.020 +HIS-FAD2 plan-6 1 NE2 0.020 +HIS-FAD2 plan-6 1 ND1 0.020 + +data_link_GTP-p +loop_ +_chem_link_bond.link_id +_chem_link_bond.atom_1_comp_id +_chem_link_bond.atom_id_1 +_chem_link_bond.atom_2_comp_id +_chem_link_bond.atom_id_2 +_chem_link_bond.type +_chem_link_bond.value_dist +_chem_link_bond.value_dist_esd +GTP-p 1 "O3'" 2 P SINGLE 1.607 0.0100 + +loop_ +_chem_link_angle.link_id +_chem_link_angle.atom_1_comp_id +_chem_link_angle.atom_id_1 +_chem_link_angle.atom_2_comp_id +_chem_link_angle.atom_id_2 +_chem_link_angle.atom_3_comp_id +_chem_link_angle.atom_id_3 +_chem_link_angle.value_angle +_chem_link_angle.value_angle_esd +GTP-p 1 "C3'" 1 "O3'" 2 P 121.082 1.50 +GTP-p 2 OP1 2 P 1 "O3'" 109.493 3.00 +GTP-p 2 OP2 2 P 1 "O3'" 109.493 3.00 +GTP-p 2 "O5'" 2 P 1 "O3'" 100.661 3.00 + +loop_ +_chem_link_tor.link_id +_chem_link_tor.id +_chem_link_tor.atom_1_comp_id +_chem_link_tor.atom_id_1 +_chem_link_tor.atom_2_comp_id +_chem_link_tor.atom_id_2 +_chem_link_tor.atom_3_comp_id +_chem_link_tor.atom_id_3 +_chem_link_tor.atom_4_comp_id +_chem_link_tor.atom_id_4 +_chem_link_tor.value_angle +_chem_link_tor.value_angle_esd +_chem_link_tor.period +GTP-p sp3_sp3_1 1 "C3'" 1 "O3'" 2 P 2 OP1 60.000 10.0 3 +GTP-p sp3_sp3_2 1 "C4'" 1 "C3'" 1 "O3'" 2 P 180.000 10.0 3 + +loop_ +_chem_link_chir.link_id +_chem_link_chir.atom_centre_comp_id +_chem_link_chir.atom_id_centre +_chem_link_chir.atom_1_comp_id +_chem_link_chir.atom_id_1 +_chem_link_chir.atom_2_comp_id +_chem_link_chir.atom_id_2 +_chem_link_chir.atom_3_comp_id +_chem_link_chir.atom_id_3 +_chem_link_chir.volume_sign +GTP-p 2 P 2 "O5'" 1 "O3'" 2 OP2 both + +data_link_CYS-HEMB +loop_ +_chem_link_bond.link_id +_chem_link_bond.atom_1_comp_id +_chem_link_bond.atom_id_1 +_chem_link_bond.atom_2_comp_id +_chem_link_bond.atom_id_2 +_chem_link_bond.type +_chem_link_bond.value_dist +_chem_link_bond.value_dist_esd +CYS-HEMB 1 SG 2 CAB SINGLE 1.824 0.0100 + +loop_ +_chem_link_angle.link_id +_chem_link_angle.atom_1_comp_id +_chem_link_angle.atom_id_1 +_chem_link_angle.atom_2_comp_id +_chem_link_angle.atom_id_2 +_chem_link_angle.atom_3_comp_id +_chem_link_angle.atom_id_3 +_chem_link_angle.value_angle +_chem_link_angle.value_angle_esd +CYS-HEMB 1 CB 1 SG 2 CAB 101.808 3.00 +CYS-HEMB 2 C3B 2 CAB 1 SG 111.652 3.00 +CYS-HEMB 2 CBB 2 CAB 1 SG 110.252 3.00 +CYS-HEMB 1 SG 2 CAB 2 HAB 107.856 1.89 + +loop_ +_chem_link_tor.link_id +_chem_link_tor.id +_chem_link_tor.atom_1_comp_id +_chem_link_tor.atom_id_1 +_chem_link_tor.atom_2_comp_id +_chem_link_tor.atom_id_2 +_chem_link_tor.atom_3_comp_id +_chem_link_tor.atom_id_3 +_chem_link_tor.atom_4_comp_id +_chem_link_tor.atom_id_4 +_chem_link_tor.value_angle +_chem_link_tor.value_angle_esd +_chem_link_tor.period +CYS-HEMB sp3_sp3_1 2 CBB 2 CAB 1 SG 1 CB 60.000 10.0 3 +CYS-HEMB sp3_sp3_2 1 SG 2 CAB 2 CBB 2 HBB 60.000 10.0 3 +CYS-HEMB sp3_sp3_3 1 CA 1 CB 1 SG 2 CAB 180.000 10.0 3 + +loop_ +_chem_link_chir.link_id +_chem_link_chir.atom_centre_comp_id +_chem_link_chir.atom_id_centre +_chem_link_chir.atom_1_comp_id +_chem_link_chir.atom_id_1 +_chem_link_chir.atom_2_comp_id +_chem_link_chir.atom_id_2 +_chem_link_chir.atom_3_comp_id +_chem_link_chir.atom_id_3 +_chem_link_chir.volume_sign +CYS-HEMB 2 CAB 1 SG 2 C3B 2 CBB both + +data_link_CYS-HEMC +loop_ +_chem_link_bond.link_id +_chem_link_bond.atom_1_comp_id +_chem_link_bond.atom_id_1 +_chem_link_bond.atom_2_comp_id +_chem_link_bond.atom_id_2 +_chem_link_bond.type +_chem_link_bond.value_dist +_chem_link_bond.value_dist_esd +CYS-HEMC 1 SG 2 CAC SINGLE 1.824 0.0100 + +loop_ +_chem_link_angle.link_id +_chem_link_angle.atom_1_comp_id +_chem_link_angle.atom_id_1 +_chem_link_angle.atom_2_comp_id +_chem_link_angle.atom_id_2 +_chem_link_angle.atom_3_comp_id +_chem_link_angle.atom_id_3 +_chem_link_angle.value_angle +_chem_link_angle.value_angle_esd +CYS-HEMC 1 CB 1 SG 2 CAC 101.808 3.00 +CYS-HEMC 2 C3C 2 CAC 1 SG 111.652 3.00 +CYS-HEMC 2 CBC 2 CAC 1 SG 110.252 3.00 +CYS-HEMC 1 SG 2 CAC 2 HAC 107.856 1.89 + +loop_ +_chem_link_tor.link_id +_chem_link_tor.id +_chem_link_tor.atom_1_comp_id +_chem_link_tor.atom_id_1 +_chem_link_tor.atom_2_comp_id +_chem_link_tor.atom_id_2 +_chem_link_tor.atom_3_comp_id +_chem_link_tor.atom_id_3 +_chem_link_tor.atom_4_comp_id +_chem_link_tor.atom_id_4 +_chem_link_tor.value_angle +_chem_link_tor.value_angle_esd +_chem_link_tor.period +CYS-HEMC sp3_sp3_1 2 CBC 2 CAC 1 SG 1 CB 60.000 10.0 3 +CYS-HEMC sp3_sp3_2 1 SG 2 CAC 2 CBC 2 HBC 60.000 10.0 3 +CYS-HEMC sp3_sp3_3 1 CA 1 CB 1 SG 2 CAC 180.000 10.0 3 + +loop_ +_chem_link_chir.link_id +_chem_link_chir.atom_centre_comp_id +_chem_link_chir.atom_id_centre +_chem_link_chir.atom_1_comp_id +_chem_link_chir.atom_id_1 +_chem_link_chir.atom_2_comp_id +_chem_link_chir.atom_id_2 +_chem_link_chir.atom_3_comp_id +_chem_link_chir.atom_id_3 +_chem_link_chir.volume_sign +CYS-HEMC 2 CAC 1 SG 2 C3C 2 CBC both + +data_link_HIS_TYR1 +loop_ +_chem_link_bond.link_id +_chem_link_bond.atom_1_comp_id +_chem_link_bond.atom_id_1 +_chem_link_bond.atom_2_comp_id +_chem_link_bond.atom_id_2 +_chem_link_bond.type +_chem_link_bond.value_dist +_chem_link_bond.value_dist_esd +HIS_TYR1 1 ND1 2 CB SINGLE 1.479 0.0100 + +loop_ +_chem_link_angle.link_id +_chem_link_angle.atom_1_comp_id +_chem_link_angle.atom_id_1 +_chem_link_angle.atom_2_comp_id +_chem_link_angle.atom_id_2 +_chem_link_angle.atom_3_comp_id +_chem_link_angle.atom_id_3 +_chem_link_angle.value_angle +_chem_link_angle.value_angle_esd +HIS_TYR1 1 CG 1 ND1 2 CB 126.908 3.00 +HIS_TYR1 1 CE1 1 ND1 2 CB 124.367 2.36 +HIS_TYR1 2 CA 2 CB 1 ND1 111.116 3.00 +HIS_TYR1 2 CG 2 CB 1 ND1 110.829 1.95 +HIS_TYR1 1 ND1 2 CB 2 HB2 106.371 1.50 + +loop_ +_chem_link_tor.link_id +_chem_link_tor.id +_chem_link_tor.atom_1_comp_id +_chem_link_tor.atom_id_1 +_chem_link_tor.atom_2_comp_id +_chem_link_tor.atom_id_2 +_chem_link_tor.atom_3_comp_id +_chem_link_tor.atom_id_3 +_chem_link_tor.atom_4_comp_id +_chem_link_tor.atom_id_4 +_chem_link_tor.value_angle +_chem_link_tor.value_angle_esd +_chem_link_tor.period +HIS_TYR1 sp2_sp3_1 1 CG 1 ND1 2 CB 2 CA 150.000 10.0 6 +HIS_TYR1 const_24_1 1 CB 1 CG 1 ND1 2 CB 0.000 0.0 2 + +loop_ +_chem_link_chir.link_id +_chem_link_chir.atom_centre_comp_id +_chem_link_chir.atom_id_centre +_chem_link_chir.atom_1_comp_id +_chem_link_chir.atom_id_1 +_chem_link_chir.atom_2_comp_id +_chem_link_chir.atom_id_2 +_chem_link_chir.atom_3_comp_id +_chem_link_chir.atom_id_3 +_chem_link_chir.volume_sign +HIS_TYR1 2 CB 1 ND1 2 CA 2 CG both + +loop_ +_chem_link_plane.link_id +_chem_link_plane.plane_id +_chem_link_plane.atom_comp_id +_chem_link_plane.atom_id +_chem_link_plane.dist_esd +HIS_TYR1 plan-2 2 CB 0.020 +HIS_TYR1 plan-2 1 CB 0.020 +HIS_TYR1 plan-2 1 CG 0.020 +HIS_TYR1 plan-2 1 CD2 0.020 +HIS_TYR1 plan-2 1 CE1 0.020 +HIS_TYR1 plan-2 1 HD2 0.020 +HIS_TYR1 plan-2 1 HE1 0.020 +HIS_TYR1 plan-2 1 HE2 0.020 +HIS_TYR1 plan-2 1 NE2 0.020 +HIS_TYR1 plan-2 1 ND1 0.020 + +data_link_HIS_TYR2 +loop_ +_chem_link_bond.link_id +_chem_link_bond.atom_1_comp_id +_chem_link_bond.atom_id_1 +_chem_link_bond.atom_2_comp_id +_chem_link_bond.atom_id_2 +_chem_link_bond.type +_chem_link_bond.value_dist +_chem_link_bond.value_dist_esd +HIS_TYR2 1 NE2 2 CE2 SINGLE 1.447 0.0100 + +loop_ +_chem_link_angle.link_id +_chem_link_angle.atom_1_comp_id +_chem_link_angle.atom_id_1 +_chem_link_angle.atom_2_comp_id +_chem_link_angle.atom_id_2 +_chem_link_angle.atom_3_comp_id +_chem_link_angle.atom_id_3 +_chem_link_angle.value_angle +_chem_link_angle.value_angle_esd +HIS_TYR2 1 CD2 1 NE2 2 CE2 126.913 1.60 +HIS_TYR2 1 CE1 1 NE2 2 CE2 124.723 2.73 +HIS_TYR2 2 CD2 2 CE2 1 NE2 119.776 1.50 +HIS_TYR2 2 CZ 2 CE2 1 NE2 120.443 1.51 + +loop_ +_chem_link_tor.link_id +_chem_link_tor.id +_chem_link_tor.atom_1_comp_id +_chem_link_tor.atom_id_1 +_chem_link_tor.atom_2_comp_id +_chem_link_tor.atom_id_2 +_chem_link_tor.atom_3_comp_id +_chem_link_tor.atom_id_3 +_chem_link_tor.atom_4_comp_id +_chem_link_tor.atom_id_4 +_chem_link_tor.value_angle +_chem_link_tor.value_angle_esd +_chem_link_tor.period +HIS_TYR2 sp2_sp2_1 2 CD2 2 CE2 1 NE2 1 CD2 180.000 20 2 + +loop_ +_chem_link_plane.link_id +_chem_link_plane.plane_id +_chem_link_plane.atom_comp_id +_chem_link_plane.atom_id +_chem_link_plane.dist_esd +HIS_TYR2 plan-1 2 CB 0.020 +HIS_TYR2 plan-1 2 CG 0.020 +HIS_TYR2 plan-1 2 CD1 0.020 +HIS_TYR2 plan-1 2 CD2 0.020 +HIS_TYR2 plan-1 2 CE1 0.020 +HIS_TYR2 plan-1 2 CE2 0.020 +HIS_TYR2 plan-1 2 CZ 0.020 +HIS_TYR2 plan-1 2 HD1 0.020 +HIS_TYR2 plan-1 2 HD2 0.020 +HIS_TYR2 plan-1 2 HE1 0.020 +HIS_TYR2 plan-1 1 NE2 0.020 +HIS_TYR2 plan-1 2 OH 0.020 +HIS_TYR2 plan-2 2 CE2 0.020 +HIS_TYR2 plan-2 1 CB 0.020 +HIS_TYR2 plan-2 1 CG 0.020 +HIS_TYR2 plan-2 1 CD2 0.020 +HIS_TYR2 plan-2 1 CE1 0.020 +HIS_TYR2 plan-2 1 HD1 0.020 +HIS_TYR2 plan-2 1 HD2 0.020 +HIS_TYR2 plan-2 1 HE1 0.020 +HIS_TYR2 plan-2 1 NE2 0.020 +HIS_TYR2 plan-2 1 ND1 0.020 + +data_link_LYS-CYS +loop_ +_chem_link_bond.link_id +_chem_link_bond.atom_1_comp_id +_chem_link_bond.atom_id_1 +_chem_link_bond.atom_2_comp_id +_chem_link_bond.atom_id_2 +_chem_link_bond.type +_chem_link_bond.value_dist +_chem_link_bond.value_dist_esd +LYS-CYS 1 NZ 2 SG SINGLE 1.682 0.0176 + +loop_ +_chem_link_angle.link_id +_chem_link_angle.atom_1_comp_id +_chem_link_angle.atom_id_1 +_chem_link_angle.atom_2_comp_id +_chem_link_angle.atom_id_2 +_chem_link_angle.atom_3_comp_id +_chem_link_angle.atom_id_3 +_chem_link_angle.value_angle +_chem_link_angle.value_angle_esd +LYS-CYS 1 CE 1 NZ 2 SG 116.537 1.50 +LYS-CYS 2 SG 1 NZ 1 HZ1 110.707 3.00 +LYS-CYS 2 CB 2 SG 1 NZ 109.471 3.00 + +loop_ +_chem_link_tor.link_id +_chem_link_tor.id +_chem_link_tor.atom_1_comp_id +_chem_link_tor.atom_id_1 +_chem_link_tor.atom_2_comp_id +_chem_link_tor.atom_id_2 +_chem_link_tor.atom_3_comp_id +_chem_link_tor.atom_id_3 +_chem_link_tor.atom_4_comp_id +_chem_link_tor.atom_id_4 +_chem_link_tor.value_angle +_chem_link_tor.value_angle_esd +_chem_link_tor.period +LYS-CYS sp3_sp3_1 1 CE 1 NZ 2 SG 2 CB 60.000 10.00 3 + +loop_ +_chem_link_chir.link_id +_chem_link_chir.atom_centre_comp_id +_chem_link_chir.atom_id_centre +_chem_link_chir.atom_1_comp_id +_chem_link_chir.atom_id_1 +_chem_link_chir.atom_2_comp_id +_chem_link_chir.atom_id_2 +_chem_link_chir.atom_3_comp_id +_chem_link_chir.atom_id_3 +_chem_link_chir.volume_sign +LYS-CYS 1 NZ 2 SG 1 CE 1 HZ1 both + +data_link_LYS-ASN +loop_ +_chem_link_bond.link_id +_chem_link_bond.atom_1_comp_id +_chem_link_bond.atom_id_1 +_chem_link_bond.atom_2_comp_id +_chem_link_bond.atom_id_2 +_chem_link_bond.type +_chem_link_bond.value_dist +_chem_link_bond.value_dist_esd +LYS-ASN 1 NZ 2 CG SINGLE 1.337 0.0118 + +loop_ +_chem_link_angle.link_id +_chem_link_angle.atom_1_comp_id +_chem_link_angle.atom_id_1 +_chem_link_angle.atom_2_comp_id +_chem_link_angle.atom_id_2 +_chem_link_angle.atom_3_comp_id +_chem_link_angle.atom_id_3 +_chem_link_angle.value_angle +_chem_link_angle.value_angle_esd +LYS-ASN 1 CE 1 NZ 2 CG 124.480 2.27 +LYS-ASN 2 CG 1 NZ 1 HZ1 117.279 2.10 +LYS-ASN 2 CB 2 CG 1 NZ 116.603 1.50 +LYS-ASN 2 OD1 2 CG 1 NZ 121.996 1.50 + +loop_ +_chem_link_tor.link_id +_chem_link_tor.id +_chem_link_tor.atom_1_comp_id +_chem_link_tor.atom_id_1 +_chem_link_tor.atom_2_comp_id +_chem_link_tor.atom_id_2 +_chem_link_tor.atom_3_comp_id +_chem_link_tor.atom_id_3 +_chem_link_tor.atom_4_comp_id +_chem_link_tor.atom_id_4 +_chem_link_tor.value_angle +_chem_link_tor.value_angle_esd +_chem_link_tor.period +LYS-ASN sp2_sp2_1 2 CB 2 CG 1 NZ 1 CE 180.000 5.00 2 + +loop_ +_chem_link_plane.link_id +_chem_link_plane.plane_id +_chem_link_plane.atom_comp_id +_chem_link_plane.atom_id +_chem_link_plane.dist_esd +LYS-ASN plan-4 2 CB 0.020 +LYS-ASN plan-4 2 CG 0.020 +LYS-ASN plan-4 1 NZ 0.020 +LYS-ASN plan-4 2 OD1 0.020 +LYS-ASN plan-1 1 CE 0.020 +LYS-ASN plan-1 2 CG 0.020 +LYS-ASN plan-1 1 HZ1 0.020 +LYS-ASN plan-1 1 NZ 0.020 + +data_link_MET-TYR +loop_ +_chem_link_bond.link_id +_chem_link_bond.atom_1_comp_id +_chem_link_bond.atom_id_1 +_chem_link_bond.atom_2_comp_id +_chem_link_bond.atom_id_2 +_chem_link_bond.type +_chem_link_bond.value_dist +_chem_link_bond.value_dist_esd +MET-TYR 1 SD 2 CE1 SINGLE 1.780 0.0200 + +loop_ +_chem_link_angle.link_id +_chem_link_angle.atom_1_comp_id +_chem_link_angle.atom_id_1 +_chem_link_angle.atom_2_comp_id +_chem_link_angle.atom_id_2 +_chem_link_angle.atom_3_comp_id +_chem_link_angle.atom_id_3 +_chem_link_angle.value_angle +_chem_link_angle.value_angle_esd +MET-TYR 1 CG 1 SD 2 CE1 103.903 1.50 +MET-TYR 1 CE 1 SD 2 CE1 103.843 3.00 +MET-TYR 2 CD1 2 CE1 1 SD 120.241 3.00 +MET-TYR 2 CZ 2 CE1 1 SD 120.124 3.00 + +loop_ +_chem_link_tor.link_id +_chem_link_tor.id +_chem_link_tor.atom_1_comp_id +_chem_link_tor.atom_id_1 +_chem_link_tor.atom_2_comp_id +_chem_link_tor.atom_id_2 +_chem_link_tor.atom_3_comp_id +_chem_link_tor.atom_id_3 +_chem_link_tor.atom_4_comp_id +_chem_link_tor.atom_id_4 +_chem_link_tor.value_angle +_chem_link_tor.value_angle_esd +_chem_link_tor.period +MET-TYR sp2_sp3_1 2 CD1 2 CE1 1 SD 1 CG 150.000 10.0 6 +MET-TYR sp2_sp2_1 2 CG 2 CD1 2 CE1 1 SD 180.000 0.0 2 + +loop_ +_chem_link_chir.link_id +_chem_link_chir.atom_centre_comp_id +_chem_link_chir.atom_id_centre +_chem_link_chir.atom_1_comp_id +_chem_link_chir.atom_id_1 +_chem_link_chir.atom_2_comp_id +_chem_link_chir.atom_id_2 +_chem_link_chir.atom_3_comp_id +_chem_link_chir.atom_id_3 +_chem_link_chir.volume_sign +MET-TYR 1 SD 2 CE1 1 CG 1 CE both + +loop_ +_chem_link_plane.link_id +_chem_link_plane.plane_id +_chem_link_plane.atom_comp_id +_chem_link_plane.atom_id +_chem_link_plane.dist_esd +MET-TYR plan-1 2 CB 0.020 +MET-TYR plan-1 2 CG 0.020 +MET-TYR plan-1 2 CD1 0.020 +MET-TYR plan-1 2 CD2 0.020 +MET-TYR plan-1 2 CE1 0.020 +MET-TYR plan-1 2 CE2 0.020 +MET-TYR plan-1 2 CZ 0.020 +MET-TYR plan-1 2 HD1 0.020 +MET-TYR plan-1 2 HD2 0.020 +MET-TYR plan-1 2 HE2 0.020 +MET-TYR plan-1 2 OH 0.020 +MET-TYR plan-1 1 SD 0.020 + +data_link_TRP-TYR +loop_ +_chem_link_bond.link_id +_chem_link_bond.atom_1_comp_id +_chem_link_bond.atom_id_1 +_chem_link_bond.atom_2_comp_id +_chem_link_bond.atom_id_2 +_chem_link_bond.type +_chem_link_bond.value_dist +_chem_link_bond.value_dist_esd +TRP-TYR 1 CH2 2 CE2 SINGLE 1.492 0.0125 + +loop_ +_chem_link_angle.link_id +_chem_link_angle.atom_1_comp_id +_chem_link_angle.atom_id_1 +_chem_link_angle.atom_2_comp_id +_chem_link_angle.atom_id_2 +_chem_link_angle.atom_3_comp_id +_chem_link_angle.atom_id_3 +_chem_link_angle.value_angle +_chem_link_angle.value_angle_esd +TRP-TYR 1 CZ2 1 CH2 2 CE2 120.507 2.02 +TRP-TYR 1 CZ3 1 CH2 2 CE2 120.338 2.79 +TRP-TYR 2 CD2 2 CE2 1 CH2 120.621 2.79 +TRP-TYR 2 CZ 2 CE2 1 CH2 121.366 3.00 + +loop_ +_chem_link_tor.link_id +_chem_link_tor.id +_chem_link_tor.atom_1_comp_id +_chem_link_tor.atom_id_1 +_chem_link_tor.atom_2_comp_id +_chem_link_tor.atom_id_2 +_chem_link_tor.atom_3_comp_id +_chem_link_tor.atom_id_3 +_chem_link_tor.atom_4_comp_id +_chem_link_tor.atom_id_4 +_chem_link_tor.value_angle +_chem_link_tor.value_angle_esd +_chem_link_tor.period +TRP-TYR sp2_sp2_1 1 CZ2 1 CH2 2 CE2 2 CD2 180.000 5.0 2 + +loop_ +_chem_link_plane.link_id +_chem_link_plane.plane_id +_chem_link_plane.atom_comp_id +_chem_link_plane.atom_id +_chem_link_plane.dist_esd +TRP-TYR plan-1 1 CE2 0.020 +TRP-TYR plan-1 1 CE3 0.020 +TRP-TYR plan-1 1 CZ2 0.020 +TRP-TYR plan-1 1 CZ3 0.020 +TRP-TYR plan-1 1 CH2 0.020 +TRP-TYR plan-1 2 CE2 0.020 +TRP-TYR plan-1 1 CG 0.020 +TRP-TYR plan-1 1 CD2 0.020 +TRP-TYR plan-1 1 HE3 0.020 +TRP-TYR plan-1 1 HZ2 0.020 +TRP-TYR plan-1 1 HZ3 0.020 +TRP-TYR plan-1 1 NE1 0.020 +TRP-TYR plan-2 1 CH2 0.020 +TRP-TYR plan-2 2 CB 0.020 +TRP-TYR plan-2 2 CG 0.020 +TRP-TYR plan-2 2 CD1 0.020 +TRP-TYR plan-2 2 CD2 0.020 +TRP-TYR plan-2 2 CE1 0.020 +TRP-TYR plan-2 2 CE2 0.020 +TRP-TYR plan-2 2 CZ 0.020 +TRP-TYR plan-2 2 HD1 0.020 +TRP-TYR plan-2 2 HD2 0.020 +TRP-TYR plan-2 2 HE1 0.020 +TRP-TYR plan-2 2 OH 0.020 + +data_mod_SERm1 +loop_ +_chem_mod_atom.mod_id +_chem_mod_atom.function +_chem_mod_atom.atom_id +_chem_mod_atom.new_atom_id +_chem_mod_atom.new_type_symbol +_chem_mod_atom.new_type_energy +_chem_mod_atom.new_charge +SERm1 delete HG . H H 0 +SERm1 change OG . O O2 0 + +loop_ +_chem_mod_bond.mod_id +_chem_mod_bond.function +_chem_mod_bond.atom_id_1 +_chem_mod_bond.atom_id_2 +_chem_mod_bond.new_type +_chem_mod_bond.new_value_dist +_chem_mod_bond.new_value_dist_esd +_chem_mod_bond.new_value_dist_nucleus +_chem_mod_bond.new_value_dist_nucleus_esd +SERm1 delete OG HG single . . . . +SERm1 change CA CB single 1.516 0.0100 1.516 0.0100 +SERm1 change CB OG single 1.438 0.0200 1.438 0.0200 + +loop_ +_chem_mod_angle.mod_id +_chem_mod_angle.function +_chem_mod_angle.atom_id_1 +_chem_mod_angle.atom_id_2 +_chem_mod_angle.atom_id_3 +_chem_mod_angle.new_value_angle +_chem_mod_angle.new_value_angle_esd +SERm1 delete CB OG HG . . +SERm1 change CA CB OG 108.381 1.50 + +loop_ +_chem_mod_tor.mod_id +_chem_mod_tor.function +_chem_mod_tor.atom_id_1 +_chem_mod_tor.atom_id_2 +_chem_mod_tor.atom_id_3 +_chem_mod_tor.atom_id_4 +_chem_mod_tor.id +_chem_mod_tor.new_value_angle +_chem_mod_tor.new_value_angle_esd +_chem_mod_tor.new_period +SERm1 delete CA CB OG HG . . . 3 +SERm1 change OG CB CA N sp3_sp3_199 180.000 10.0 3 + +data_mod_CYS-SS +loop_ +_chem_mod_atom.mod_id +_chem_mod_atom.function +_chem_mod_atom.atom_id +_chem_mod_atom.new_atom_id +_chem_mod_atom.new_type_symbol +_chem_mod_atom.new_type_energy +_chem_mod_atom.new_partial_charge +CYS-SS delete HG . . . .000 + +data_mod_CYSmod1 +loop_ +_chem_mod_atom.mod_id +_chem_mod_atom.function +_chem_mod_atom.atom_id +_chem_mod_atom.new_atom_id +_chem_mod_atom.new_type_symbol +_chem_mod_atom.new_type_energy +_chem_mod_atom.new_charge +CYSmod1 delete HG . H HSH1 0 +CYSmod1 change SG . S S2 0 + +loop_ +_chem_mod_bond.mod_id +_chem_mod_bond.function +_chem_mod_bond.atom_id_1 +_chem_mod_bond.atom_id_2 +_chem_mod_bond.new_type +_chem_mod_bond.new_value_dist +_chem_mod_bond.new_value_dist_esd +_chem_mod_bond.new_value_dist_nucleus +_chem_mod_bond.new_value_dist_nucleus_esd +CYSmod1 delete SG HG single . . . . +CYSmod1 change CB HB3 single 0.980 0.0104 1.089 0.0100 +CYSmod1 change CB HB2 single 0.980 0.0104 1.089 0.0100 + +loop_ +_chem_mod_angle.mod_id +_chem_mod_angle.function +_chem_mod_angle.atom_id_1 +_chem_mod_angle.atom_id_2 +_chem_mod_angle.atom_id_3 +_chem_mod_angle.new_value_angle +_chem_mod_angle.new_value_angle_esd +CYSmod1 delete CB SG HG . . +CYSmod1 change N CA CB 109.354 2.20 +CYSmod1 change C CA CB 110.419 3.00 +CYSmod1 change CA CB SG 114.974 2.42 + +loop_ +_chem_mod_tor.mod_id +_chem_mod_tor.function +_chem_mod_tor.atom_id_1 +_chem_mod_tor.atom_id_2 +_chem_mod_tor.atom_id_3 +_chem_mod_tor.atom_id_4 +_chem_mod_tor.id +_chem_mod_tor.new_value_angle +_chem_mod_tor.new_value_angle_esd +_chem_mod_tor.new_period +CYSmod1 delete CA CB SG HG . . . 0 +CYSmod1 change N CA CB SG sp3_sp3_19 180.000 10.0 3 + +data_mod_NH3 +loop_ +_chem_mod_atom.mod_id +_chem_mod_atom.function +_chem_mod_atom.atom_id +_chem_mod_atom.new_atom_id +_chem_mod_atom.new_type_symbol +_chem_mod_atom.new_type_energy +_chem_mod_atom.new_partial_charge +NH3 change N N . NT3 -1.000 +NH3 add H H H HNT3 .000 +NH3 add . H2 H HNT3 .000 +NH3 add . H3 H HNT3 .000 +NH3 delete HN1 . . . .000 +NH3 delete HN2 . . . .000 +NH3 delete HN3 . . . .000 + +loop_ +_chem_mod_tree.mod_id +_chem_mod_tree.function +_chem_mod_tree.atom_id +_chem_mod_tree.atom_back +_chem_mod_tree.back_type +_chem_mod_tree.atom_forward +_chem_mod_tree.connect_type +NH3 change N n/a . CA START +NH3 add H N . . . +NH3 add H2 N . . . +NH3 add H3 N . . . + +loop_ +_chem_mod_bond.mod_id +_chem_mod_bond.function +_chem_mod_bond.atom_id_1 +_chem_mod_bond.atom_id_2 +_chem_mod_bond.new_type +_chem_mod_bond.new_value_dist +_chem_mod_bond.new_value_dist_esd +_chem_mod_bond.new_value_dist_nucleus +_chem_mod_bond.new_value_dist_nucleus_esd +NH3 add N H2 single 0.914 0.010 1.036 0.016 +NH3 add N H3 single 0.914 0.010 1.036 0.016 +NH3 change N CA single 1.491 .021 1.491 .021 + +loop_ +_chem_mod_angle.mod_id +_chem_mod_angle.function +_chem_mod_angle.atom_id_1 +_chem_mod_angle.atom_id_2 +_chem_mod_angle.atom_id_3 +_chem_mod_angle.new_value_angle +_chem_mod_angle.new_value_angle_esd +NH3 add H2 N H3 109.470 3.000 +NH3 add H3 N CA 109.470 3.000 +NH3 add H2 N CA 109.470 3.000 +NH3 add H N H2 109.470 3.000 +NH3 add H N H3 109.470 3.000 +NH3 change H N CA 109.470 3.000 + +data_mod_NH1 +loop_ +_chem_mod_atom.mod_id +_chem_mod_atom.function +_chem_mod_atom.atom_id +_chem_mod_atom.new_atom_id +_chem_mod_atom.new_type_symbol +_chem_mod_atom.new_type_energy +_chem_mod_atom.new_partial_charge +NH1 change N N . NH1 .000 +NH1 add . H H HNH1 .000 + +loop_ +_chem_mod_tree.mod_id +_chem_mod_tree.function +_chem_mod_tree.atom_id +_chem_mod_tree.atom_back +_chem_mod_tree.back_type +_chem_mod_tree.atom_forward +_chem_mod_tree.connect_type +NH1 change N n/a . CA START +NH1 add H N . . . + +loop_ +_chem_mod_bond.mod_id +_chem_mod_bond.function +_chem_mod_bond.atom_id_1 +_chem_mod_bond.atom_id_2 +_chem_mod_bond.new_type +_chem_mod_bond.new_value_dist +_chem_mod_bond.new_value_dist_esd +_chem_mod_bond.new_value_dist_nucleus +_chem_mod_bond.new_value_dist_nucleus_esd +NH1 add N H single 0.914 0.010 1.036 0.016 + +loop_ +_chem_mod_angle.mod_id +_chem_mod_angle.function +_chem_mod_angle.atom_id_1 +_chem_mod_angle.atom_id_2 +_chem_mod_angle.atom_id_3 +_chem_mod_angle.new_value_angle +_chem_mod_angle.new_value_angle_esd +NH1 add H N CA 109.307 3.000 +NH1 add H N CD 106.136 2.250 + +data_mod_NH2 +loop_ +_chem_mod_atom.mod_id +_chem_mod_atom.function +_chem_mod_atom.atom_id +_chem_mod_atom.new_atom_id +_chem_mod_atom.new_type_symbol +_chem_mod_atom.new_type_energy +_chem_mod_atom.new_partial_charge +NH2 change N N . NH1 .000 +NH2 add . H H HNH1 .000 + +loop_ +_chem_mod_tree.mod_id +_chem_mod_tree.function +_chem_mod_tree.atom_id +_chem_mod_tree.atom_back +_chem_mod_tree.back_type +_chem_mod_tree.atom_forward +_chem_mod_tree.connect_type +NH2 change N n/a . CA START +NH2 add H N . . . + +loop_ +_chem_mod_bond.mod_id +_chem_mod_bond.function +_chem_mod_bond.atom_id_1 +_chem_mod_bond.atom_id_2 +_chem_mod_bond.new_type +_chem_mod_bond.new_value_dist +_chem_mod_bond.new_value_dist_esd +_chem_mod_bond.new_value_dist_nucleus +_chem_mod_bond.new_value_dist_nucleus_esd +NH2 add N H single 0.914 0.010 1.036 0.016 + +loop_ +_chem_mod_angle.mod_id +_chem_mod_angle.function +_chem_mod_angle.atom_id_1 +_chem_mod_angle.atom_id_2 +_chem_mod_angle.atom_id_3 +_chem_mod_angle.new_value_angle +_chem_mod_angle.new_value_angle_esd +NH2 add H N CA 109.307 3.000 +NH2 add H N CD 106.136 2.250 + +data_mod_NH2N +loop_ +_chem_mod_atom.mod_id +_chem_mod_atom.function +_chem_mod_atom.atom_id +_chem_mod_atom.new_atom_id +_chem_mod_atom.new_type_symbol +_chem_mod_atom.new_type_energy +_chem_mod_atom.new_partial_charge +NH2N change N N . NH2 .000 + +data_mod_COO +loop_ +_chem_mod_atom.mod_id +_chem_mod_atom.function +_chem_mod_atom.atom_id +_chem_mod_atom.new_atom_id +_chem_mod_atom.new_type_symbol +_chem_mod_atom.new_type_energy +_chem_mod_atom.new_partial_charge +COO change C C . C .000 +COO change O O . OC -.500 +COO add . OXT O OC -.500 + +loop_ +_chem_mod_tree.mod_id +_chem_mod_tree.function +_chem_mod_tree.atom_id +_chem_mod_tree.atom_back +_chem_mod_tree.back_type +_chem_mod_tree.atom_forward +_chem_mod_tree.connect_type +COO add OXT C . . END +COO change C n/a . OXT . + +loop_ +_chem_mod_bond.mod_id +_chem_mod_bond.function +_chem_mod_bond.atom_id_1 +_chem_mod_bond.atom_id_2 +_chem_mod_bond.new_type +_chem_mod_bond.new_value_dist +_chem_mod_bond.new_value_dist_esd +_chem_mod_bond.new_value_dist_nucleus +_chem_mod_bond.new_value_dist_nucleus_esd +COO change C O deloc 1.231 .020 1.231 .020 +COO add C OXT deloc 1.231 .020 1.231 .020 + +loop_ +_chem_mod_angle.mod_id +_chem_mod_angle.function +_chem_mod_angle.atom_id_1 +_chem_mod_angle.atom_id_2 +_chem_mod_angle.atom_id_3 +_chem_mod_angle.new_value_angle +_chem_mod_angle.new_value_angle_esd +COO change CA C O 121.000 3.000 +COO add CA C OXT 121.000 3.000 +COO add O C OXT 118.000 3.000 + +loop_ +_chem_mod_tor.mod_id +_chem_mod_tor.function +_chem_mod_tor.id +_chem_mod_tor.atom_id_1 +_chem_mod_tor.atom_id_2 +_chem_mod_tor.atom_id_3 +_chem_mod_tor.atom_id_4 +_chem_mod_tor.new_value_angle +_chem_mod_tor.new_value_angle_esd +_chem_mod_tor.new_period +COO add psi N CA C OXT 160.00 30.0 2 + +loop_ +_chem_mod_plane_atom.mod_id +_chem_mod_plane_atom.function +_chem_mod_plane_atom.plane_id +_chem_mod_plane_atom.atom_id +_chem_mod_plane_atom.new_dist_esd +COO add oxt C .020 +COO add oxt CA .020 +COO add oxt O .020 +COO add oxt OXT .020 + +data_mod_AA-STAND + +data_mod_AA-STPRO +loop_ +_chem_mod_atom.mod_id +_chem_mod_atom.function +_chem_mod_atom.atom_id +_chem_mod_atom.new_atom_id +_chem_mod_atom.new_type_symbol +_chem_mod_atom.new_type_energy +_chem_mod_atom.new_partial_charge +AA-STPRO delete HN . . . .000 + +data_mod_NA-STAND + +data_mod_5*END +loop_ +_chem_mod_atom.mod_id +_chem_mod_atom.function +_chem_mod_atom.atom_id +_chem_mod_atom.new_atom_id +_chem_mod_atom.new_type_symbol +_chem_mod_atom.new_type_energy +_chem_mod_atom.new_partial_charge +5*END delete P . . . .000 +5*END delete OP1 . . . .000 +5*END delete OP2 . . . .000 +5*END delete OP3 . . . .000 +5*END change 'O5'' 'O5'' . OH1 0.000 +5*END add . 'HO5'' H HOH1 0.000 + +loop_ +_chem_mod_tree.mod_id +_chem_mod_tree.function +_chem_mod_tree.atom_id +_chem_mod_tree.atom_back +_chem_mod_tree.back_type +_chem_mod_tree.atom_forward +_chem_mod_tree.connect_type +5*END delete P n/a . . . +5*END delete O1P n/a . . . +5*END delete O2P n/a . . . +5*END change 'O5'' n/a . 'C5'' START +5*END add 'HO5'' 'O5'' . . . + +loop_ +_chem_mod_bond.mod_id +_chem_mod_bond.function +_chem_mod_bond.atom_id_1 +_chem_mod_bond.atom_id_2 +_chem_mod_bond.new_type +_chem_mod_bond.new_value_dist +_chem_mod_bond.new_value_dist_esd +_chem_mod_bond.new_value_dist_nucleus +_chem_mod_bond.new_value_dist_nucleus_esd +5*END add 'O5'' 'HO5'' single 0.839 0.010 0.970 0.012 + +loop_ +_chem_mod_angle.mod_id +_chem_mod_angle.function +_chem_mod_angle.atom_id_1 +_chem_mod_angle.atom_id_2 +_chem_mod_angle.atom_id_3 +_chem_mod_angle.new_value_angle +_chem_mod_angle.new_value_angle_esd +5*END add 'C5'' 'O5'' 'HO5'' 120.000 3.000 + +data_mod_3*END +loop_ +_chem_mod_atom.mod_id +_chem_mod_atom.function +_chem_mod_atom.atom_id +_chem_mod_atom.new_atom_id +_chem_mod_atom.new_type_symbol +_chem_mod_atom.new_type_energy +_chem_mod_atom.new_partial_charge +3*END change 'O3'' 'O3'' . OH1 0.000 +3*END add . 'HO3'' H HOH1 0.000 + +loop_ +_chem_mod_tree.mod_id +_chem_mod_tree.function +_chem_mod_tree.atom_id +_chem_mod_tree.atom_back +_chem_mod_tree.back_type +_chem_mod_tree.atom_forward +_chem_mod_tree.connect_type +3*END change 'O3'' 'C3'' . . END +3*END add 'HO3'' 'O3'' . . . + +loop_ +_chem_mod_bond.mod_id +_chem_mod_bond.function +_chem_mod_bond.atom_id_1 +_chem_mod_bond.atom_id_2 +_chem_mod_bond.new_type +_chem_mod_bond.new_value_dist +_chem_mod_bond.new_value_dist_esd +_chem_mod_bond.new_value_dist_nucleus +_chem_mod_bond.new_value_dist_nucleus_esd +3*END add 'O3'' 'HO3'' single 0.839 0.010 0.970 0.012 + +loop_ +_chem_mod_angle.mod_id +_chem_mod_angle.function +_chem_mod_angle.atom_id_1 +_chem_mod_angle.atom_id_2 +_chem_mod_angle.atom_id_3 +_chem_mod_angle.new_value_angle +_chem_mod_angle.new_value_angle_esd +3*END add 'C3'' 'O3'' 'HO3'' 120.000 3.000 + +loop_ +_chem_mod_tor.mod_id +_chem_mod_tor.function +_chem_mod_tor.id +_chem_mod_tor.atom_id_1 +_chem_mod_tor.atom_id_2 +_chem_mod_tor.atom_id_3 +_chem_mod_tor.atom_id_4 +_chem_mod_tor.new_value_angle +_chem_mod_tor.new_value_angle_esd +_chem_mod_tor.new_period +3*END add hh 'C4'' 'C3'' 'O3'' 'HO3'' .00 30.0 3 + +data_mod_p5*END +loop_ +_chem_mod_atom.mod_id +_chem_mod_atom.function +_chem_mod_atom.atom_id +_chem_mod_atom.new_atom_id +_chem_mod_atom.new_type_symbol +_chem_mod_atom.new_type_energy +_chem_mod_atom.new_partial_charge +p5*END change OP3 OP3 O OP -.330 + +data_mod_p3*END +loop_ +_chem_mod_atom.mod_id +_chem_mod_atom.function +_chem_mod_atom.atom_id +_chem_mod_atom.new_atom_id +_chem_mod_atom.new_type_symbol +_chem_mod_atom.new_type_energy +_chem_mod_atom.new_partial_charge +p3*END change 'O3'' 'O3'' . OH1 0.000 +p3*END add . 'HO3'' H HOH1 0.000 + +loop_ +_chem_mod_tree.mod_id +_chem_mod_tree.function +_chem_mod_tree.atom_id +_chem_mod_tree.atom_back +_chem_mod_tree.back_type +_chem_mod_tree.atom_forward +_chem_mod_tree.connect_type +p3*END change 'O3'' 'C3'' . . END +p3*END add 'HO3'' 'O3'' . . . + +loop_ +_chem_mod_bond.mod_id +_chem_mod_bond.function +_chem_mod_bond.atom_id_1 +_chem_mod_bond.atom_id_2 +_chem_mod_bond.new_type +_chem_mod_bond.new_value_dist +_chem_mod_bond.new_value_dist_esd +_chem_mod_bond.new_value_dist_nucleus +_chem_mod_bond.new_value_dist_nucleus_esd +p3*END add 'O3'' 'HO3'' single 0.839 0.010 0.970 0.012 + +loop_ +_chem_mod_angle.mod_id +_chem_mod_angle.function +_chem_mod_angle.atom_id_1 +_chem_mod_angle.atom_id_2 +_chem_mod_angle.atom_id_3 +_chem_mod_angle.new_value_angle +_chem_mod_angle.new_value_angle_esd +p3*END add 'C3'' 'O3'' 'HO3'' 120.000 3.000 + +loop_ +_chem_mod_tor.mod_id +_chem_mod_tor.function +_chem_mod_tor.id +_chem_mod_tor.atom_id_1 +_chem_mod_tor.atom_id_2 +_chem_mod_tor.atom_id_3 +_chem_mod_tor.atom_id_4 +_chem_mod_tor.new_value_angle +_chem_mod_tor.new_value_angle_esd +_chem_mod_tor.new_period +p3*END add hh 'C4'' 'C3'' 'O3'' 'HO3'' .00 30.0 3 + +data_mod_DEL_OP3 +loop_ +_chem_mod_atom.mod_id +_chem_mod_atom.function +_chem_mod_atom.atom_id +_chem_mod_atom.new_atom_id +_chem_mod_atom.new_type_symbol +_chem_mod_atom.new_type_energy +_chem_mod_atom.new_charge +DEL_OP3 delete OP3 . O OP -1 + +loop_ +_chem_mod_bond.mod_id +_chem_mod_bond.function +_chem_mod_bond.atom_id_1 +_chem_mod_bond.atom_id_2 +_chem_mod_bond.new_type +_chem_mod_bond.new_value_dist +_chem_mod_bond.new_value_dist_esd +_chem_mod_bond.new_value_dist_nucleus +_chem_mod_bond.new_value_dist_nucleus_esd +DEL_OP3 delete OP3 P single . . . . +DEL_OP3 change P OP1 double 1.491 0.0100 1.491 0.0100 +DEL_OP3 change P OP2 single 1.491 0.0100 1.491 0.0100 +DEL_OP3 change P "O5'" single 1.599 0.0103 1.599 0.0103 + +loop_ +_chem_mod_angle.mod_id +_chem_mod_angle.function +_chem_mod_angle.atom_id_1 +_chem_mod_angle.atom_id_2 +_chem_mod_angle.atom_id_3 +_chem_mod_angle.new_value_angle +_chem_mod_angle.new_value_angle_esd +DEL_OP3 delete OP3 P OP1 . . +DEL_OP3 delete OP3 P OP2 . . +DEL_OP3 delete OP3 P "O5'" . . +DEL_OP3 change OP1 P OP2 118.304 1.50 +DEL_OP3 change OP1 P "O5'" 108.008 3.00 +DEL_OP3 change OP2 P "O5'" 108.008 3.00 + +loop_ +_chem_mod_tor.mod_id +_chem_mod_tor.function +_chem_mod_tor.atom_id_1 +_chem_mod_tor.atom_id_2 +_chem_mod_tor.atom_id_3 +_chem_mod_tor.atom_id_4 +_chem_mod_tor.new_value_angle +_chem_mod_tor.new_value_angle_esd +DEL_OP3 delete "C5'" "O5'" P OP3 . . + +data_mod_DEL_HO3p +loop_ +_chem_mod_atom.mod_id +_chem_mod_atom.function +_chem_mod_atom.atom_id +_chem_mod_atom.new_atom_id +_chem_mod_atom.new_type_symbol +_chem_mod_atom.new_type_energy +_chem_mod_atom.new_charge +DEL_HO3p delete "HO3'" . H H 0 +DEL_HO3p change "O3'" . O O2 0 + +loop_ +_chem_mod_bond.mod_id +_chem_mod_bond.function +_chem_mod_bond.atom_id_1 +_chem_mod_bond.atom_id_2 +_chem_mod_bond.new_type +_chem_mod_bond.new_value_dist +_chem_mod_bond.new_value_dist_esd +_chem_mod_bond.new_value_dist_nucleus +_chem_mod_bond.new_value_dist_nucleus_esd +DEL_HO3p delete "O3'" "HO3'" single . . . . +DEL_HO3p change "C3'" "O3'" single 1.421 0.0119 1.421 0.0119 + +loop_ +_chem_mod_angle.mod_id +_chem_mod_angle.function +_chem_mod_angle.atom_id_1 +_chem_mod_angle.atom_id_2 +_chem_mod_angle.atom_id_3 +_chem_mod_angle.new_value_angle +_chem_mod_angle.new_value_angle_esd +DEL_HO3p delete "C3'" "O3'" "HO3'" . . + +loop_ +_chem_mod_tor.mod_id +_chem_mod_tor.function +_chem_mod_tor.atom_id_1 +_chem_mod_tor.atom_id_2 +_chem_mod_tor.atom_id_3 +_chem_mod_tor.atom_id_4 +_chem_mod_tor.new_value_angle +_chem_mod_tor.new_value_angle_esd +DEL_HO3p delete "C4'" "C3'" "O3'" "HO3'" . . + +data_mod_FOR-N +loop_ +_chem_mod_atom.mod_id +_chem_mod_atom.function +_chem_mod_atom.atom_id +_chem_mod_atom.new_atom_id +_chem_mod_atom.new_type_symbol +_chem_mod_atom.new_type_energy +_chem_mod_atom.new_partial_charge +FOR-N add . H H HC1 .000 + +loop_ +_chem_mod_tree.mod_id +_chem_mod_tree.function +_chem_mod_tree.atom_id +_chem_mod_tree.atom_back +_chem_mod_tree.back_type +_chem_mod_tree.atom_forward +_chem_mod_tree.connect_type +FOR-N add H C . . . + +loop_ +_chem_mod_bond.mod_id +_chem_mod_bond.function +_chem_mod_bond.atom_id_1 +_chem_mod_bond.atom_id_2 +_chem_mod_bond.new_type +_chem_mod_bond.new_value_dist +_chem_mod_bond.new_value_dist_esd +_chem_mod_bond.new_value_dist_nucleus +_chem_mod_bond.new_value_dist_nucleus_esd +FOR-N add C H single 0.988 0.010 1.089 0.010 + +loop_ +_chem_mod_angle.mod_id +_chem_mod_angle.function +_chem_mod_angle.atom_id_1 +_chem_mod_angle.atom_id_2 +_chem_mod_angle.atom_id_3 +_chem_mod_angle.new_value_angle +_chem_mod_angle.new_value_angle_esd +FOR-N add H C O 121.000 3.000 + +data_mod_FOR-C +loop_ +_chem_mod_atom.mod_id +_chem_mod_atom.function +_chem_mod_atom.atom_id +_chem_mod_atom.new_atom_id +_chem_mod_atom.new_type_symbol +_chem_mod_atom.new_type_energy +_chem_mod_atom.new_partial_charge +FOR-C change O O . OC -0.500 +FOR-C add . OXT O OC -0.500 + +loop_ +_chem_mod_tree.mod_id +_chem_mod_tree.function +_chem_mod_tree.atom_id +_chem_mod_tree.atom_back +_chem_mod_tree.back_type +_chem_mod_tree.atom_forward +_chem_mod_tree.connect_type +FOR-C add OXT C . . . + +loop_ +_chem_mod_bond.mod_id +_chem_mod_bond.function +_chem_mod_bond.atom_id_1 +_chem_mod_bond.atom_id_2 +_chem_mod_bond.new_type +_chem_mod_bond.new_value_dist +_chem_mod_bond.new_value_dist_esd +_chem_mod_bond.new_value_dist_nucleus +_chem_mod_bond.new_value_dist_nucleus_esd +FOR-C change C O deloc 1.231 .020 1.231 .020 +FOR-C add C OXT deloc 1.231 .020 1.231 .020 + +loop_ +_chem_mod_angle.mod_id +_chem_mod_angle.function +_chem_mod_angle.atom_id_1 +_chem_mod_angle.atom_id_2 +_chem_mod_angle.atom_id_3 +_chem_mod_angle.new_value_angle +_chem_mod_angle.new_value_angle_esd +FOR-C add O C OXT 120.000 3.000 + +data_mod_G-N2 +loop_ +_chem_mod_atom.mod_id +_chem_mod_atom.function +_chem_mod_atom.atom_id +_chem_mod_atom.new_atom_id +_chem_mod_atom.new_type_symbol +_chem_mod_atom.new_type_energy +_chem_mod_atom.new_partial_charge +G-N2 delete N2 . . . .000 + +loop_ +_chem_mod_tree.mod_id +_chem_mod_tree.function +_chem_mod_tree.atom_id +_chem_mod_tree.atom_back +_chem_mod_tree.back_type +_chem_mod_tree.atom_forward +_chem_mod_tree.connect_type +G-N2 delete N2 n/a . . . + +data_mod_DEL-HD1 +loop_ +_chem_mod_atom.mod_id +_chem_mod_atom.function +_chem_mod_atom.atom_id +_chem_mod_atom.new_atom_id +_chem_mod_atom.new_type_symbol +_chem_mod_atom.new_type_energy +_chem_mod_atom.new_partial_charge +DEL-HD1 delete HD1 . . . .000 + +loop_ +_chem_mod_tree.mod_id +_chem_mod_tree.function +_chem_mod_tree.atom_id +_chem_mod_tree.atom_back +_chem_mod_tree.back_type +_chem_mod_tree.atom_forward +_chem_mod_tree.connect_type +DEL-HD1 change ND1 n/a . . END + +data_mod_DEL-HE2 +loop_ +_chem_mod_atom.mod_id +_chem_mod_atom.function +_chem_mod_atom.atom_id +_chem_mod_atom.new_atom_id +_chem_mod_atom.new_type_symbol +_chem_mod_atom.new_type_energy +_chem_mod_atom.new_partial_charge +DEL-HE2 delete HE2 . . . .000 + +loop_ +_chem_mod_tree.mod_id +_chem_mod_tree.function +_chem_mod_tree.atom_id +_chem_mod_tree.atom_back +_chem_mod_tree.back_type +_chem_mod_tree.atom_forward +_chem_mod_tree.connect_type +DEL-HE2 change NE2 n/a . . END + +data_mod_DEL-OXT +loop_ +_chem_mod_atom.mod_id +_chem_mod_atom.function +_chem_mod_atom.atom_id +_chem_mod_atom.new_atom_id +_chem_mod_atom.new_type_symbol +_chem_mod_atom.new_type_energy +_chem_mod_atom.new_charge +DEL-OXT delete OXT . O OC -1 + +loop_ +_chem_mod_bond.mod_id +_chem_mod_bond.function +_chem_mod_bond.atom_id_1 +_chem_mod_bond.atom_id_2 +_chem_mod_bond.new_type +_chem_mod_bond.new_value_dist +_chem_mod_bond.new_value_dist_esd +_chem_mod_bond.new_value_dist_nucleus +_chem_mod_bond.new_value_dist_nucleus_esd +DEL-OXT delete C OXT single . . . . +DEL-OXT change CA C single 1.526 0.010 1.526 0.010 +DEL-OXT change C O double 1.229 0.012 1.229 0.012 + +loop_ +_chem_mod_angle.mod_id +_chem_mod_angle.function +_chem_mod_angle.atom_id_1 +_chem_mod_angle.atom_id_2 +_chem_mod_angle.atom_id_3 +_chem_mod_angle.new_value_angle +_chem_mod_angle.new_value_angle_esd +DEL-OXT delete CA C OXT . . +DEL-OXT delete O C OXT . . +DEL-OXT change CA C O 120.614 1.50 + +loop_ +_chem_mod_plane_atom.mod_id +_chem_mod_plane_atom.function +_chem_mod_plane_atom.plane_id +_chem_mod_plane_atom.atom_id +_chem_mod_plane_atom.new_dist_esd +DEL-OXT delete plan-1 C 0.020 +DEL-OXT delete plan-1 CA 0.020 +DEL-OXT delete plan-1 O 0.020 +DEL-OXT delete plan-1 OXT 0.020 + +loop_ +_chem_mod_tor.mod_id +_chem_mod_tor.function +_chem_mod_tor.atom_id_1 +_chem_mod_tor.atom_id_2 +_chem_mod_tor.atom_id_3 +_chem_mod_tor.atom_id_4 +_chem_mod_tor.new_value_angle +_chem_mod_tor.new_value_angle_esd +DEL-OXT delete O C CA N 0.000 10.0 + +data_mod_DEL-OXT1 +loop_ +_chem_mod_atom.mod_id +_chem_mod_atom.function +_chem_mod_atom.atom_id +_chem_mod_atom.new_atom_id +_chem_mod_atom.new_type_symbol +_chem_mod_atom.new_type_energy +_chem_mod_atom.new_charge +DEL-OXT1 delete OXT . O OC -1 + +loop_ +_chem_mod_bond.mod_id +_chem_mod_bond.function +_chem_mod_bond.atom_id_1 +_chem_mod_bond.atom_id_2 +_chem_mod_bond.new_type +_chem_mod_bond.new_value_dist +_chem_mod_bond.new_value_dist_esd +_chem_mod_bond.new_value_dist_nucleus +_chem_mod_bond.new_value_dist_nucleus_esd +DEL-OXT1 delete C OXT single . . . . +DEL-OXT1 change CA C single 1.526 0.010 1.526 0.010 +DEL-OXT1 change C O double 1.232 0.010 1.232 0.010 + +loop_ +_chem_mod_angle.mod_id +_chem_mod_angle.function +_chem_mod_angle.atom_id_1 +_chem_mod_angle.atom_id_2 +_chem_mod_angle.atom_id_3 +_chem_mod_angle.new_value_angle +_chem_mod_angle.new_value_angle_esd +DEL-OXT1 delete CA C OXT . . +DEL-OXT1 delete O C OXT . . +DEL-OXT1 change CA C O 120.082 1.50 + +loop_ +_chem_mod_plane_atom.mod_id +_chem_mod_plane_atom.function +_chem_mod_plane_atom.plane_id +_chem_mod_plane_atom.atom_id +_chem_mod_plane_atom.new_dist_esd +DEL-OXT1 delete plan-1 C 0.020 +DEL-OXT1 delete plan-1 CA 0.020 +DEL-OXT1 delete plan-1 O 0.020 +DEL-OXT1 delete plan-1 OXT 0.020 + +data_mod_DEL-HN1 +loop_ +_chem_mod_atom.mod_id +_chem_mod_atom.function +_chem_mod_atom.atom_id +_chem_mod_atom.new_atom_id +_chem_mod_atom.new_type_symbol +_chem_mod_atom.new_type_energy +_chem_mod_atom.new_charge +DEL-HN1 delete H2 . H H 0 +DEL-HN1 delete H3 . H H 0 +DEL-HN1 change N . N NH1 0 + +loop_ +_chem_mod_bond.mod_id +_chem_mod_bond.function +_chem_mod_bond.atom_id_1 +_chem_mod_bond.atom_id_2 +_chem_mod_bond.new_type +_chem_mod_bond.new_value_dist +_chem_mod_bond.new_value_dist_esd +_chem_mod_bond.new_value_dist_nucleus +_chem_mod_bond.new_value_dist_nucleus_esd +DEL-HN1 delete N H2 single . . . . +DEL-HN1 delete N H3 single . . . . +DEL-HN1 change CA N single 1.453 0.010 1.453 0.010 +DEL-HN1 change N H single 0.914 0.010 1.036 0.016 + +loop_ +_chem_mod_angle.mod_id +_chem_mod_angle.function +_chem_mod_angle.atom_id_1 +_chem_mod_angle.atom_id_2 +_chem_mod_angle.atom_id_3 +_chem_mod_angle.new_value_angle +_chem_mod_angle.new_value_angle_esd +DEL-HN1 delete CA N H2 . . +DEL-HN1 delete CA N H3 . . +DEL-HN1 delete H N H2 . . +DEL-HN1 delete H N H3 . . +DEL-HN1 delete H2 N H3 . . +DEL-HN1 change CA N H 118.729 1.50 + +loop_ +_chem_mod_tor.mod_id +_chem_mod_tor.function +_chem_mod_tor.atom_id_1 +_chem_mod_tor.atom_id_2 +_chem_mod_tor.atom_id_3 +_chem_mod_tor.atom_id_4 +_chem_mod_tor.new_value_angle +_chem_mod_tor.new_value_angle_esd +DEL-HN1 delete C CA N H 180 10 + +data_mod_DEL-NMH +loop_ +_chem_mod_atom.mod_id +_chem_mod_atom.function +_chem_mod_atom.atom_id +_chem_mod_atom.new_atom_id +_chem_mod_atom.new_type_symbol +_chem_mod_atom.new_type_energy +_chem_mod_atom.new_charge +DEL-NMH delete H . H H 0 +DEL-NMH change N . N N 0 + +loop_ +_chem_mod_bond.mod_id +_chem_mod_bond.function +_chem_mod_bond.atom_id_1 +_chem_mod_bond.atom_id_2 +_chem_mod_bond.new_type +_chem_mod_bond.new_value_dist +_chem_mod_bond.new_value_dist_esd +_chem_mod_bond.new_value_dist_nucleus +_chem_mod_bond.new_value_dist_nucleus_esd +DEL-NMH delete N H single . . . . +DEL-NMH change N CN single 1.450 0.0200 1.450 0.0200 + +loop_ +_chem_mod_angle.mod_id +_chem_mod_angle.function +_chem_mod_angle.atom_id_1 +_chem_mod_angle.atom_id_2 +_chem_mod_angle.atom_id_3 +_chem_mod_angle.new_value_angle +_chem_mod_angle.new_value_angle_esd +DEL-NMH delete CN N H . . +DEL-NMH delete CA N H . . +DEL-NMH change CN N CA 118.119 2.78 +DEL-NMH change N CA C 111.097 3.00 + +loop_ +_chem_mod_tor.mod_id +_chem_mod_tor.function +_chem_mod_tor.atom_id_1 +_chem_mod_tor.atom_id_2 +_chem_mod_tor.atom_id_3 +_chem_mod_tor.atom_id_4 +_chem_mod_tor.id +_chem_mod_tor.new_value_angle +_chem_mod_tor.new_value_angle_esd +_chem_mod_tor.new_period +DEL-NMH change CN N CA C sp2_sp3_13 0.000 10.0 6 +DEL-NMH change CA N CN HN1 sp2_sp3_7 0.000 10.0 6 + +loop_ +_chem_mod_chir.mod_id +_chem_mod_chir.function +_chem_mod_chir.atom_id_centre +_chem_mod_chir.atom_id_1 +_chem_mod_chir.atom_id_2 +_chem_mod_chir.atom_id_3 +_chem_mod_chir.new_volume_sign +DEL-NMH delete N CA CN H . + +data_mod_DEL-HNP +loop_ +_chem_mod_atom.mod_id +_chem_mod_atom.function +_chem_mod_atom.atom_id +_chem_mod_atom.new_atom_id +_chem_mod_atom.new_type_symbol +_chem_mod_atom.new_type_energy +_chem_mod_atom.new_charge +DEL-HNP delete H . H H 0 +DEL-HNP delete H2 . H H 0 +DEL-HNP change N . N NH0 0 + +loop_ +_chem_mod_bond.mod_id +_chem_mod_bond.function +_chem_mod_bond.atom_id_1 +_chem_mod_bond.atom_id_2 +_chem_mod_bond.new_type +_chem_mod_bond.new_value_dist +_chem_mod_bond.new_value_dist_esd +_chem_mod_bond.new_value_dist_nucleus +_chem_mod_bond.new_value_dist_nucleus_esd +DEL-HNP delete N H single . . . . +DEL-HNP delete N H2 single . . . . +DEL-HNP change N CA single 1.459 0.0100 1.459 0.0100 +DEL-HNP change N CD single 1.472 0.0100 1.472 0.0100 + +loop_ +_chem_mod_angle.mod_id +_chem_mod_angle.function +_chem_mod_angle.atom_id_1 +_chem_mod_angle.atom_id_2 +_chem_mod_angle.atom_id_3 +_chem_mod_angle.new_value_angle +_chem_mod_angle.new_value_angle_esd +DEL-HNP delete CA N H . . +DEL-HNP delete CA N H2 . . +DEL-HNP delete CD N H . . +DEL-HNP delete CD N H2 . . +DEL-HNP delete H N H2 . . +DEL-HNP change CA N CD 112.597 1.50 +DEL-HNP change N CA C 113.251 1.50 +DEL-HNP change N CD CG 102.887 1.50 + +data_mod_PEPT-D +loop_ +_chem_mod_chir.mod_id +_chem_mod_chir.function +_chem_mod_chir.atom_id_centre +_chem_mod_chir.atom_id_1 +_chem_mod_chir.atom_id_2 +_chem_mod_chir.atom_id_3 +_chem_mod_chir.new_volume_sign +PEPT-D change CA N CB C positiv + +data_mod_1MA +loop_ +_chem_mod_atom.mod_id +_chem_mod_atom.function +_chem_mod_atom.atom_id +_chem_mod_atom.new_atom_id +_chem_mod_atom.new_type_symbol +_chem_mod_atom.new_type_energy +_chem_mod_atom.new_partial_charge +1MA change N1 . . NR6 .000 +1MA add . C1 C CH3 .000 +1MA add . H11 H HCH .000 +1MA add . H12 H HGH .000 +1MA add . H13 H HCH .000 + +loop_ +_chem_mod_tree.mod_id +_chem_mod_tree.function +_chem_mod_tree.atom_id +_chem_mod_tree.atom_back +_chem_mod_tree.back_type +_chem_mod_tree.atom_forward +_chem_mod_tree.connect_type +1MA add C1 N1 . H13 . +1MA add H11 C1 . . . +1MA add H12 C1 . . . +1MA add H13 C1 . . . + +loop_ +_chem_mod_bond.mod_id +_chem_mod_bond.function +_chem_mod_bond.atom_id_1 +_chem_mod_bond.atom_id_2 +_chem_mod_bond.new_type +_chem_mod_bond.new_value_dist +_chem_mod_bond.new_value_dist_esd +_chem_mod_bond.new_value_dist_nucleus +_chem_mod_bond.new_value_dist_nucleus_esd +1MA add C1 N1 single 1.465 .020 1.465 .020 +1MA add C1 H11 single 0.988 0.010 1.089 0.010 +1MA add C1 H12 single 0.988 0.010 1.089 0.010 +1MA add C1 H13 single 0.988 0.010 1.089 0.010 + +loop_ +_chem_mod_angle.mod_id +_chem_mod_angle.function +_chem_mod_angle.atom_id_1 +_chem_mod_angle.atom_id_2 +_chem_mod_angle.atom_id_3 +_chem_mod_angle.new_value_angle +_chem_mod_angle.new_value_angle_esd +1MA add N1 C1 H11 109.470 3.000 +1MA add N1 C1 H12 109.470 3.000 +1MA add N1 C1 H13 109.470 3.000 +1MA add H12 C1 H11 109.470 3.000 +1MA add H13 C1 H11 109.470 3.000 +1MA add H13 C1 H12 109.470 3.000 + +data_mod_1MG +loop_ +_chem_mod_atom.mod_id +_chem_mod_atom.function +_chem_mod_atom.atom_id +_chem_mod_atom.new_atom_id +_chem_mod_atom.new_type_symbol +_chem_mod_atom.new_type_energy +_chem_mod_atom.new_partial_charge +1MG change N1 . . NR6 .000 +1MG add . C1A C CH3 .000 +1MG add . H1A1 H HCH .000 +1MG add . H1A2 H HGH .000 +1MG add . H1A3 H HCH .000 + +loop_ +_chem_mod_tree.mod_id +_chem_mod_tree.function +_chem_mod_tree.atom_id +_chem_mod_tree.atom_back +_chem_mod_tree.back_type +_chem_mod_tree.atom_forward +_chem_mod_tree.connect_type +1MG add C1A N1 . H1A3 . +1MG add H1A1 C1A . . . +1MG add H1A2 C1A . . . +1MG add H1A3 C1A . . . + +loop_ +_chem_mod_bond.mod_id +_chem_mod_bond.function +_chem_mod_bond.atom_id_1 +_chem_mod_bond.atom_id_2 +_chem_mod_bond.new_type +_chem_mod_bond.new_value_dist +_chem_mod_bond.new_value_dist_esd +_chem_mod_bond.new_value_dist_nucleus +_chem_mod_bond.new_value_dist_nucleus_esd +1MG add C1A N1 single 1.465 .020 1.465 .020 +1MG add C1A H1A1 single 0.988 0.010 1.089 0.010 +1MG add C1A H1A2 single 0.988 0.010 1.089 0.010 +1MG add C1A H1A3 single 0.988 0.010 1.089 0.010 + +loop_ +_chem_mod_angle.mod_id +_chem_mod_angle.function +_chem_mod_angle.atom_id_1 +_chem_mod_angle.atom_id_2 +_chem_mod_angle.atom_id_3 +_chem_mod_angle.new_value_angle +_chem_mod_angle.new_value_angle_esd +1MG add N1 C1A H1A1 109.470 3.000 +1MG add N1 C1A H1A2 109.470 3.000 +1MG add N1 C1A H1A3 109.470 3.000 +1MG add H1A2 C1A H1A1 109.470 3.000 +1MG add H1A3 C1A H1A1 109.470 3.000 +1MG add H1A3 C1A H1A2 109.470 3.000 + +data_mod_2MG +loop_ +_chem_mod_atom.mod_id +_chem_mod_atom.function +_chem_mod_atom.atom_id +_chem_mod_atom.new_atom_id +_chem_mod_atom.new_type_symbol +_chem_mod_atom.new_type_energy +_chem_mod_atom.new_partial_charge +2MG change N2 . . NH1 .000 +2MG add . C2A C CH3 .000 +2MG add . H2A1 H HCH .000 +2MG add . H2A2 H HGH .000 +2MG add . H2A3 H HCH .000 + +loop_ +_chem_mod_tree.mod_id +_chem_mod_tree.function +_chem_mod_tree.atom_id +_chem_mod_tree.atom_back +_chem_mod_tree.back_type +_chem_mod_tree.atom_forward +_chem_mod_tree.connect_type +2MG change N2 C2 . C2A . +2MG add C2A N2 . H2A3 . +2MG add H2A1 C2A . . . +2MG add H2A2 C2A . . . +2MG add H2A3 C2A . . . + +loop_ +_chem_mod_bond.mod_id +_chem_mod_bond.function +_chem_mod_bond.atom_id_1 +_chem_mod_bond.atom_id_2 +_chem_mod_bond.new_type +_chem_mod_bond.new_value_dist +_chem_mod_bond.new_value_dist_esd +_chem_mod_bond.new_value_dist_nucleus +_chem_mod_bond.new_value_dist_nucleus_esd +2MG add C2A N2 single 1.465 .020 1.465 .020 +2MG add C2A H2A1 single 0.988 0.010 1.089 0.010 +2MG add C2A H2A2 single 0.988 0.010 1.089 0.010 +2MG add C2A H2A3 single 0.988 0.010 1.089 0.010 + +loop_ +_chem_mod_angle.mod_id +_chem_mod_angle.function +_chem_mod_angle.atom_id_1 +_chem_mod_angle.atom_id_2 +_chem_mod_angle.atom_id_3 +_chem_mod_angle.new_value_angle +_chem_mod_angle.new_value_angle_esd +2MG add C2 N2 C2A 115.000 3.000 +2MG add N2 C2A H2A1 109.470 3.000 +2MG add N2 C2A H2A2 109.470 3.000 +2MG add N2 C2A H2A3 109.470 3.000 +2MG add H2A2 C2A H2A1 109.470 3.000 +2MG add H2A3 C2A H2A1 109.470 3.000 +2MG add H2A3 C2A H2A2 109.470 3.000 + +data_mod_M2G +loop_ +_chem_mod_atom.mod_id +_chem_mod_atom.function +_chem_mod_atom.atom_id +_chem_mod_atom.new_atom_id +_chem_mod_atom.new_type_symbol +_chem_mod_atom.new_type_energy +_chem_mod_atom.new_partial_charge +M2G change N2 . . N .000 +M2G add . C2A C CH3 .000 +M2G add . H2A1 H HCH .000 +M2G add . H2A2 H HGH .000 +M2G add . H2A3 H HCH .000 +M2G add . C2B C CH3 .000 +M2G add . H2B1 H HCH .000 +M2G add . H2B2 H HGH .000 +M2G add . H2B3 H HCH .000 +M2G delete H21 . . . .000 +M2G delete H22 . . . .000 + +loop_ +_chem_mod_tree.mod_id +_chem_mod_tree.function +_chem_mod_tree.atom_id +_chem_mod_tree.atom_back +_chem_mod_tree.back_type +_chem_mod_tree.atom_forward +_chem_mod_tree.connect_type +M2G change N2 C2 . C2A . +M2G add C2A N2 . H2A3 . +M2G add H2A1 C2A . . . +M2G add H2A2 C2A . . . +M2G add H2A3 C2A . . . +M2G add C2B N2 . H2B3 . +M2G add H2B1 C2B . . . +M2G add H2B2 C2B . . . +M2G add H2B3 C2B . . . + +loop_ +_chem_mod_bond.mod_id +_chem_mod_bond.function +_chem_mod_bond.atom_id_1 +_chem_mod_bond.atom_id_2 +_chem_mod_bond.new_type +_chem_mod_bond.new_value_dist +_chem_mod_bond.new_value_dist_esd +_chem_mod_bond.new_value_dist_nucleus +_chem_mod_bond.new_value_dist_nucleus_esd +M2G add C2A N2 single 1.465 .020 1.465 .020 +M2G add C2A H2A1 single 0.988 0.010 1.089 0.010 +M2G add C2A H2A2 single 0.988 0.010 1.089 0.010 +M2G add C2A H2A3 single 0.988 0.010 1.089 0.010 +M2G add C2B N2 single 1.465 .020 1.465 .020 +M2G add C2B H2B1 single 0.988 0.010 1.089 0.010 +M2G add C2B H2B2 single 0.988 0.010 1.089 0.010 +M2G add C2B H2B3 single 0.988 0.010 1.089 0.010 + +loop_ +_chem_mod_angle.mod_id +_chem_mod_angle.function +_chem_mod_angle.atom_id_1 +_chem_mod_angle.atom_id_2 +_chem_mod_angle.atom_id_3 +_chem_mod_angle.new_value_angle +_chem_mod_angle.new_value_angle_esd +M2G add C2 N2 C2A 118.000 3.000 +M2G add C2 N2 C2B 118.000 3.000 +M2G add C2A N2 C2B 124.000 3.000 +M2G add N2 C2A H2A1 109.470 3.000 +M2G add N2 C2A H2A2 109.470 3.000 +M2G add N2 C2A H2A3 109.470 3.000 +M2G add H2A2 C2A H2A1 109.470 3.000 +M2G add H2A3 C2A H2A1 109.470 3.000 +M2G add H2A3 C2A H2A2 109.470 3.000 +M2G add N2 C2B H2B1 109.470 3.000 +M2G add N2 C2B H2B2 109.470 3.000 +M2G add N2 C2B H2B3 109.470 3.000 +M2G add H2B2 C2B H2B1 109.470 3.000 +M2G add H2B3 C2B H2B1 109.470 3.000 +M2G add H2B3 C2B H2B2 109.470 3.000 + +data_mod_O2*MET +loop_ +_chem_mod_atom.mod_id +_chem_mod_atom.function +_chem_mod_atom.atom_id +_chem_mod_atom.new_atom_id +_chem_mod_atom.new_type_symbol +_chem_mod_atom.new_type_energy +_chem_mod_atom.new_partial_charge +O2*MET change 'O2'' . . OC2 .000 +O2*MET delete 'HO2'' . . . .000 +O2*MET add . C2A C CH3 .000 +O2*MET add . H2A1 H HCH .000 +O2*MET add . H2A2 H HGH .000 +O2*MET add . H2A3 H HCH .000 + +loop_ +_chem_mod_tree.mod_id +_chem_mod_tree.function +_chem_mod_tree.atom_id +_chem_mod_tree.atom_back +_chem_mod_tree.back_type +_chem_mod_tree.atom_forward +_chem_mod_tree.connect_type +O2*MET change 'O2'' 'C2'' . C2A . +O2*MET add C2A 'O2'' . H2A3 . +O2*MET add H2A1 C2A . . . +O2*MET add H2A2 C2A . . . +O2*MET add H2A3 C2A . . . + +loop_ +_chem_mod_bond.mod_id +_chem_mod_bond.function +_chem_mod_bond.atom_id_1 +_chem_mod_bond.atom_id_2 +_chem_mod_bond.new_type +_chem_mod_bond.new_value_dist +_chem_mod_bond.new_value_dist_esd +_chem_mod_bond.new_value_dist_nucleus +_chem_mod_bond.new_value_dist_nucleus_esd +O2*MET add 'O2'' C2A single 1.420 .020 1.420 .020 +O2*MET add C2A H2A1 single 0.988 0.010 1.089 0.010 +O2*MET add C2A H2A2 single 0.988 0.010 1.089 0.010 +O2*MET add C2A H2A3 single 0.988 0.010 1.089 0.010 + +loop_ +_chem_mod_angle.mod_id +_chem_mod_angle.function +_chem_mod_angle.atom_id_1 +_chem_mod_angle.atom_id_2 +_chem_mod_angle.atom_id_3 +_chem_mod_angle.new_value_angle +_chem_mod_angle.new_value_angle_esd +O2*MET add 'C2'' 'O2'' C2A 120.000 3.000 +O2*MET add 'O2'' C2A H2A1 109.470 3.000 +O2*MET add 'O2'' C2A H2A2 109.470 3.000 +O2*MET add 'O2'' C2A H2A3 109.470 3.000 +O2*MET add H2A2 C2A H2A1 109.470 3.000 +O2*MET add H2A3 C2A H2A1 109.470 3.000 +O2*MET add H2A3 C2A H2A2 109.470 3.000 + +data_mod_C5MET +loop_ +_chem_mod_atom.mod_id +_chem_mod_atom.function +_chem_mod_atom.atom_id +_chem_mod_atom.new_atom_id +_chem_mod_atom.new_type_symbol +_chem_mod_atom.new_type_energy +_chem_mod_atom.new_partial_charge +C5MET change C5 . . CR6 .000 +C5MET add . C5A C CH3 .000 +C5MET add . H5A1 H HCH .000 +C5MET add . H5A2 H HGH .000 +C5MET add . H5A3 H HCH .000 + +loop_ +_chem_mod_tree.mod_id +_chem_mod_tree.function +_chem_mod_tree.atom_id +_chem_mod_tree.atom_back +_chem_mod_tree.back_type +_chem_mod_tree.atom_forward +_chem_mod_tree.connect_type +C5MET add C5A C5 . H5A3 . +C5MET add H5A1 C5A . . . +C5MET add H5A2 C5A . . . +C5MET add H5A3 C5A . . . + +loop_ +_chem_mod_bond.mod_id +_chem_mod_bond.function +_chem_mod_bond.atom_id_1 +_chem_mod_bond.atom_id_2 +_chem_mod_bond.new_type +_chem_mod_bond.new_value_dist +_chem_mod_bond.new_value_dist_esd +_chem_mod_bond.new_value_dist_nucleus +_chem_mod_bond.new_value_dist_nucleus_esd +C5MET add C5A C5 single 1.500 .020 1.500 .020 +C5MET add C5A H5A1 single 0.988 0.010 1.089 0.010 +C5MET add C5A H5A2 single 0.988 0.010 1.089 0.010 +C5MET add C5A H5A3 single 0.988 0.010 1.089 0.010 + +loop_ +_chem_mod_angle.mod_id +_chem_mod_angle.function +_chem_mod_angle.atom_id_1 +_chem_mod_angle.atom_id_2 +_chem_mod_angle.atom_id_3 +_chem_mod_angle.new_value_angle +_chem_mod_angle.new_value_angle_esd +C5MET add C4 C5 C5A 122.000 3.000 +C5MET add C6 C5 C5A 118.000 3.000 +C5MET add C5 C5A H5A2 109.470 3.000 +C5MET add C5 C5A H5A3 109.470 3.000 +C5MET add H5A2 C5A H5A1 109.470 3.000 +C5MET add H5A3 C5A H5A1 109.470 3.000 +C5MET add H5A3 C5A H5A2 109.470 3.000 + +data_mod_N7MET +loop_ +_chem_mod_atom.mod_id +_chem_mod_atom.function +_chem_mod_atom.atom_id +_chem_mod_atom.new_atom_id +_chem_mod_atom.new_type_symbol +_chem_mod_atom.new_type_energy +_chem_mod_atom.new_partial_charge +N7MET change N7 . . NR5 .000 +N7MET add . C7 C CH3 .000 +N7MET add . H71 H HCH .000 +N7MET add . H72 H HGH .000 +N7MET add . H73 H HCH .000 + +loop_ +_chem_mod_tree.mod_id +_chem_mod_tree.function +_chem_mod_tree.atom_id +_chem_mod_tree.atom_back +_chem_mod_tree.back_type +_chem_mod_tree.atom_forward +_chem_mod_tree.connect_type +N7MET add C7 N7 . H73 . +N7MET add H71 C7 . . . +N7MET add H72 C7 . . . +N7MET add H73 C7 . . . + +loop_ +_chem_mod_bond.mod_id +_chem_mod_bond.function +_chem_mod_bond.atom_id_1 +_chem_mod_bond.atom_id_2 +_chem_mod_bond.new_type +_chem_mod_bond.new_value_dist +_chem_mod_bond.new_value_dist_esd +_chem_mod_bond.new_value_dist_nucleus +_chem_mod_bond.new_value_dist_nucleus_esd +N7MET add C7 N7 single 1.465 .020 1.465 .020 +N7MET add C7 H71 single 0.988 0.010 1.089 0.010 +N7MET add C7 H72 single 0.988 0.010 1.089 0.010 +N7MET add C7 H73 single 0.988 0.010 1.089 0.010 + +loop_ +_chem_mod_angle.mod_id +_chem_mod_angle.function +_chem_mod_angle.atom_id_1 +_chem_mod_angle.atom_id_2 +_chem_mod_angle.atom_id_3 +_chem_mod_angle.new_value_angle +_chem_mod_angle.new_value_angle_esd +N7MET add C5 N7 C7 126.000 3.000 +N7MET add C8 N7 C7 126.000 3.000 +N7MET add N7 C7 H71 109.470 3.000 +N7MET add N7 C7 H72 109.470 3.000 +N7MET add N7 C7 H73 109.470 3.000 +N7MET add H72 C7 H71 109.470 3.000 +N7MET add H73 C7 H71 109.470 3.000 +N7MET add H73 C7 H72 109.470 3.000 + +data_mod_RNA-O2* +loop_ +_chem_mod_atom.mod_id +_chem_mod_atom.function +_chem_mod_atom.atom_id +_chem_mod_atom.new_atom_id +_chem_mod_atom.new_type_symbol +_chem_mod_atom.new_type_energy +_chem_mod_atom.new_partial_charge +RNA-O2* delete 'O2'' . . . .000 +RNA-O2* delete 'HO2'' . . . .000 + +loop_ +_chem_mod_tree.mod_id +_chem_mod_tree.function +_chem_mod_tree.atom_id +_chem_mod_tree.atom_back +_chem_mod_tree.back_type +_chem_mod_tree.atom_forward +_chem_mod_tree.connect_type +RNA-O2* delete 'O2'' n/a . . . +RNA-O2* delete 'HO2'' n/a . . . + +data_mod_XYS-O1 +loop_ +_chem_mod_atom.mod_id +_chem_mod_atom.function +_chem_mod_atom.atom_id +_chem_mod_atom.new_atom_id +_chem_mod_atom.new_type_symbol +_chem_mod_atom.new_type_energy +_chem_mod_atom.new_partial_charge +XYS-O1 delete O1 . . . .000 +XYS-O1 delete HO1 . . . .000 + +loop_ +_chem_mod_tree.mod_id +_chem_mod_tree.function +_chem_mod_tree.atom_id +_chem_mod_tree.atom_back +_chem_mod_tree.back_type +_chem_mod_tree.atom_forward +_chem_mod_tree.connect_type +XYS-O1 delete O1 n/a . . . +XYS-O1 delete HO1 n/a . . . + +data_mod_B2C +loop_ +_chem_mod_atom.mod_id +_chem_mod_atom.function +_chem_mod_atom.atom_id +_chem_mod_atom.new_atom_id +_chem_mod_atom.new_type_symbol +_chem_mod_atom.new_type_energy +_chem_mod_atom.new_partial_charge +B2C change N N . NT3 -1.000 +B2C add . H1 H HNT3 0.000 +B2C add . H2 H HNT3 0.000 +B2C add . H3 H HNT3 0.000 +B2C delete H . . . .000 +B2C change C B B B .000 +B2C change O O1 O O .000 +B2C add . O2 O O .000 + +loop_ +_chem_mod_tree.mod_id +_chem_mod_tree.function +_chem_mod_tree.atom_id +_chem_mod_tree.atom_back +_chem_mod_tree.back_type +_chem_mod_tree.atom_forward +_chem_mod_tree.connect_type +B2C change N n/a . CA START +B2C add H1 N . . . +B2C add H2 N . . . +B2C add H3 N . . . +B2C change B CA . . END +B2C change CA N . B . +B2C change O1 B . . . +B2C add O2 B . . . + +loop_ +_chem_mod_bond.mod_id +_chem_mod_bond.function +_chem_mod_bond.atom_id_1 +_chem_mod_bond.atom_id_2 +_chem_mod_bond.new_type +_chem_mod_bond.new_value_dist +_chem_mod_bond.new_value_dist_esd +_chem_mod_bond.new_value_dist_nucleus +_chem_mod_bond.new_value_dist_nucleus_esd +B2C add N H1 single 0.914 0.010 1.036 0.016 +B2C add N H2 single 0.914 0.010 1.036 0.016 +B2C add N H3 single 0.914 0.010 1.036 0.016 +B2C change N CA single 1.491 .021 1.491 .021 +B2C change B CA single 1.560 .020 1.560 .020 +B2C change B O1 deloc 1.480 .020 1.480 .020 +B2C add B O2 deloc 1.480 .020 1.480 .020 + +loop_ +_chem_mod_angle.mod_id +_chem_mod_angle.function +_chem_mod_angle.atom_id_1 +_chem_mod_angle.atom_id_2 +_chem_mod_angle.atom_id_3 +_chem_mod_angle.new_value_angle +_chem_mod_angle.new_value_angle_esd +B2C add H2 N H3 109.470 3.000 +B2C add H3 N CA 109.470 3.000 +B2C add H2 N CA 109.470 3.000 +B2C add H1 N H2 109.470 3.000 +B2C add H1 N H3 109.470 3.000 +B2C add H1 N CA 109.470 3.000 +B2C add O1 B O2 112.000 3.000 +B2C change CA B O1 126.000 3.000 +B2C add CA B O2 126.000 3.000 + +loop_ +_chem_mod_tor.mod_id +_chem_mod_tor.function +_chem_mod_tor.id +_chem_mod_tor.atom_id_1 +_chem_mod_tor.atom_id_2 +_chem_mod_tor.atom_id_3 +_chem_mod_tor.atom_id_4 +_chem_mod_tor.new_value_angle +_chem_mod_tor.new_value_angle_esd +_chem_mod_tor.new_period +B2C add hhb N CA B O2 .00 30.0 3 + +loop_ +_chem_mod_chir.mod_id +_chem_mod_chir.function +_chem_mod_chir.atom_id_centre +_chem_mod_chir.atom_id_1 +_chem_mod_chir.atom_id_2 +_chem_mod_chir.atom_id_3 +_chem_mod_chir.new_volume_sign +B2C change CA N CB B negativ + +data_mod_B2C_D +loop_ +_chem_mod_atom.mod_id +_chem_mod_atom.function +_chem_mod_atom.atom_id +_chem_mod_atom.new_atom_id +_chem_mod_atom.new_type_symbol +_chem_mod_atom.new_type_energy +_chem_mod_atom.new_partial_charge +B2C_D change N N . NT3 -1.000 +B2C_D add . H1 H HNT3 0.000 +B2C_D add . H2 H HNT3 0.00 +B2C_D add . H3 H HNT3 0.00 +B2C_D delete H . . . .000 +B2C_D change C B B B .000 +B2C_D change O O1 O O .000 +B2C_D add . O2 O O .000 + +loop_ +_chem_mod_tree.mod_id +_chem_mod_tree.function +_chem_mod_tree.atom_id +_chem_mod_tree.atom_back +_chem_mod_tree.back_type +_chem_mod_tree.atom_forward +_chem_mod_tree.connect_type +B2C_D change N n/a . CA START +B2C_D add H1 N . . . +B2C_D add H2 N . . . +B2C_D add H3 N . . . +B2C_D change B CA . . END +B2C_D change CA N . B . +B2C_D change O1 B . . . +B2C_D add O2 B . . . + +loop_ +_chem_mod_bond.mod_id +_chem_mod_bond.function +_chem_mod_bond.atom_id_1 +_chem_mod_bond.atom_id_2 +_chem_mod_bond.new_type +_chem_mod_bond.new_value_dist +_chem_mod_bond.new_value_dist_esd +_chem_mod_bond.new_value_dist_nucleus +_chem_mod_bond.new_value_dist_nucleus_esd +B2C_D add N H1 single 0.914 0.010 1.036 0.016 +B2C_D add N H2 single 0.914 0.010 1.036 0.016 +B2C_D add N H3 single 0.914 0.010 1.036 0.016 +B2C_D change N CA single 1.491 .021 1.491 .021 +B2C_D change B CA single 1.560 .020 1.560 .020 +B2C_D change B O1 deloc 1.480 .020 1.480 .020 +B2C_D add B O2 deloc 1.480 .020 1.480 .020 + +loop_ +_chem_mod_angle.mod_id +_chem_mod_angle.function +_chem_mod_angle.atom_id_1 +_chem_mod_angle.atom_id_2 +_chem_mod_angle.atom_id_3 +_chem_mod_angle.new_value_angle +_chem_mod_angle.new_value_angle_esd +B2C_D add H2 N H3 109.470 3.000 +B2C_D add H3 N CA 109.470 3.000 +B2C_D add H2 N CA 109.470 3.000 +B2C_D add H1 N H2 109.470 3.000 +B2C_D add H1 N H3 109.470 3.000 +B2C_D add H1 N CA 109.470 3.000 +B2C_D add O1 B O2 112.000 3.000 +B2C_D change CA B O1 126.000 3.000 +B2C_D add CA B O2 126.000 3.000 + +loop_ +_chem_mod_tor.mod_id +_chem_mod_tor.function +_chem_mod_tor.id +_chem_mod_tor.atom_id_1 +_chem_mod_tor.atom_id_2 +_chem_mod_tor.atom_id_3 +_chem_mod_tor.atom_id_4 +_chem_mod_tor.new_value_angle +_chem_mod_tor.new_value_angle_esd +_chem_mod_tor.new_period +B2C_D add hhb N CA B O2 .00 30.0 3 + +loop_ +_chem_mod_chir.mod_id +_chem_mod_chir.function +_chem_mod_chir.atom_id_centre +_chem_mod_chir.atom_id_1 +_chem_mod_chir.atom_id_2 +_chem_mod_chir.atom_id_3 +_chem_mod_chir.new_volume_sign +B2C_D change CA N CB B positiv + +data_mod_RENAME + +data_mod_TERMINUS + +data_mod_DEL-HD22 +loop_ +_chem_mod_atom.mod_id +_chem_mod_atom.function +_chem_mod_atom.atom_id +_chem_mod_atom.new_atom_id +_chem_mod_atom.new_type_symbol +_chem_mod_atom.new_type_energy +_chem_mod_atom.new_charge +DEL-HD22 delete HD22 . H H 0 +DEL-HD22 change ND2 . N NH1 0 + +loop_ +_chem_mod_bond.mod_id +_chem_mod_bond.function +_chem_mod_bond.atom_id_1 +_chem_mod_bond.atom_id_2 +_chem_mod_bond.new_type +_chem_mod_bond.new_value_dist +_chem_mod_bond.new_value_dist_esd +_chem_mod_bond.new_value_dist_nucleus +_chem_mod_bond.new_value_dist_nucleus_esd +DEL-HD22 delete ND2 HD22 single . . . . +DEL-HD22 change CB CG single 1.520 0.0174 1.520 0.0174 +DEL-HD22 change CG OD1 double 1.227 0.0138 1.227 0.0138 +DEL-HD22 change ND2 HD21 single 0.863 0.0200 1.013 0.0120 + +loop_ +_chem_mod_angle.mod_id +_chem_mod_angle.function +_chem_mod_angle.atom_id_1 +_chem_mod_angle.atom_id_2 +_chem_mod_angle.atom_id_3 +_chem_mod_angle.new_value_angle +_chem_mod_angle.new_value_angle_esd +DEL-HD22 delete CG ND2 HD22 . . +DEL-HD22 delete HD21 ND2 HD22 . . +DEL-HD22 change CA CB CG 112.357 3.00 +DEL-HD22 change OD1 CG ND2 123.445 2.69 + +loop_ +_chem_mod_tor.mod_id +_chem_mod_tor.function +_chem_mod_tor.atom_id_1 +_chem_mod_tor.atom_id_2 +_chem_mod_tor.atom_id_3 +_chem_mod_tor.atom_id_4 +_chem_mod_tor.id +_chem_mod_tor.new_value_angle +_chem_mod_tor.new_value_angle_esd +_chem_mod_tor.new_period +DEL-HD22 delete CB CG ND2 HD22 . . . 2 + +loop_ +_chem_mod_plane_atom.mod_id +_chem_mod_plane_atom.function +_chem_mod_plane_atom.plane_id +_chem_mod_plane_atom.atom_id +_chem_mod_plane_atom.new_dist_esd +DEL-HD22 delete plan-3 CG 0.020 +DEL-HD22 delete plan-3 HD21 0.020 +DEL-HD22 delete plan-3 HD22 0.020 +DEL-HD22 delete plan-3 ND2 0.020 + +data_mod_DEL-HG +loop_ +_chem_mod_atom.mod_id +_chem_mod_atom.function +_chem_mod_atom.atom_id +_chem_mod_atom.new_atom_id +_chem_mod_atom.new_type_symbol +_chem_mod_atom.new_type_energy +_chem_mod_atom.new_charge +DEL-HG delete HG . H H 0 +DEL-HG change OG . O O2 0 + +loop_ +_chem_mod_bond.mod_id +_chem_mod_bond.function +_chem_mod_bond.atom_id_1 +_chem_mod_bond.atom_id_2 +_chem_mod_bond.new_type +_chem_mod_bond.new_value_dist +_chem_mod_bond.new_value_dist_esd +_chem_mod_bond.new_value_dist_nucleus +_chem_mod_bond.new_value_dist_nucleus_esd +DEL-HG delete OG HG single . . . . +DEL-HG change CA CB single 1.518 0.0126 1.518 0.0126 +DEL-HG change CB OG single 1.426 0.0176 1.426 0.0176 +DEL-HG change CB HB3 single 0.982 0.0125 1.092 0.0100 +DEL-HG change CB HB2 single 0.982 0.0125 1.092 0.0100 + +loop_ +_chem_mod_angle.mod_id +_chem_mod_angle.function +_chem_mod_angle.atom_id_1 +_chem_mod_angle.atom_id_2 +_chem_mod_angle.atom_id_3 +_chem_mod_angle.new_value_angle +_chem_mod_angle.new_value_angle_esd +DEL-HG delete CB OG HG . . +DEL-HG change N CA CB 113.399 3.00 +DEL-HG change C CA CB 111.339 3.00 +DEL-HG change CA CB OG 109.581 3.00 +DEL-HG change OG CB HB3 109.634 2.46 +DEL-HG change OG CB HB2 109.634 2.46 + +loop_ +_chem_mod_tor.mod_id +_chem_mod_tor.function +_chem_mod_tor.atom_id_1 +_chem_mod_tor.atom_id_2 +_chem_mod_tor.atom_id_3 +_chem_mod_tor.atom_id_4 +_chem_mod_tor.id +_chem_mod_tor.new_value_angle +_chem_mod_tor.new_value_angle_esd +_chem_mod_tor.new_period +DEL-HG delete CA CB OG HG . . . 3 + +data_mod_DEL-HG1 +loop_ +_chem_mod_atom.mod_id +_chem_mod_atom.function +_chem_mod_atom.atom_id +_chem_mod_atom.new_atom_id +_chem_mod_atom.new_type_symbol +_chem_mod_atom.new_type_energy +_chem_mod_atom.new_charge +DEL-HG1 delete HG1 . H H 0 +DEL-HG1 change OG1 . O O2 0 + +loop_ +_chem_mod_bond.mod_id +_chem_mod_bond.function +_chem_mod_bond.atom_id_1 +_chem_mod_bond.atom_id_2 +_chem_mod_bond.new_type +_chem_mod_bond.new_value_dist +_chem_mod_bond.new_value_dist_esd +_chem_mod_bond.new_value_dist_nucleus +_chem_mod_bond.new_value_dist_nucleus_esd +DEL-HG1 delete OG1 HG1 single . . . . +DEL-HG1 change CA CB single 1.538 0.0100 1.538 0.0100 +DEL-HG1 change CB OG1 single 1.440 0.0100 1.440 0.0100 +DEL-HG1 change CB CG2 single 1.508 0.0200 1.508 0.0200 +DEL-HG1 change CB HB single 0.993 0.0134 1.092 0.0100 + +loop_ +_chem_mod_angle.mod_id +_chem_mod_angle.function +_chem_mod_angle.atom_id_1 +_chem_mod_angle.atom_id_2 +_chem_mod_angle.atom_id_3 +_chem_mod_angle.new_value_angle +_chem_mod_angle.new_value_angle_esd +DEL-HG1 delete CB OG1 HG1 . . +DEL-HG1 change N CA CB 113.399 3.00 +DEL-HG1 change C CA CB 111.339 3.00 +DEL-HG1 change CA CB OG1 111.145 1.50 +DEL-HG1 change CA CB CG2 110.837 3.00 +DEL-HG1 change CG2 CB HB 109.492 1.50 + +loop_ +_chem_mod_tor.mod_id +_chem_mod_tor.function +_chem_mod_tor.atom_id_1 +_chem_mod_tor.atom_id_2 +_chem_mod_tor.atom_id_3 +_chem_mod_tor.atom_id_4 +_chem_mod_tor.id +_chem_mod_tor.new_value_angle +_chem_mod_tor.new_value_angle_esd +_chem_mod_tor.new_period +DEL-HG1 delete CA CB OG1 HG1 . . . 3 + +data_mod_HECmod1 +loop_ +_chem_mod_atom.mod_id +_chem_mod_atom.function +_chem_mod_atom.atom_id +_chem_mod_atom.new_atom_id +_chem_mod_atom.new_type_symbol +_chem_mod_atom.new_type_energy +_chem_mod_atom.new_charge +HECmod1 change CAC . C CH1 0 + +loop_ +_chem_mod_bond.mod_id +_chem_mod_bond.function +_chem_mod_bond.atom_id_1 +_chem_mod_bond.atom_id_2 +_chem_mod_bond.new_type +_chem_mod_bond.new_value_dist +_chem_mod_bond.new_value_dist_esd +_chem_mod_bond.new_value_dist_nucleus +_chem_mod_bond.new_value_dist_nucleus_esd +HECmod1 change C2C C3C single 1.375 0.0200 1.375 0.0200 +HECmod1 change C3C CAC single 1.503 0.0100 1.503 0.0100 +HECmod1 change CAC CBC single 1.513 0.0121 1.513 0.0121 +HECmod1 change CAC HAC single 0.990 0.0200 1.092 0.0100 + +loop_ +_chem_mod_angle.mod_id +_chem_mod_angle.function +_chem_mod_angle.atom_id_1 +_chem_mod_angle.atom_id_2 +_chem_mod_angle.atom_id_3 +_chem_mod_angle.new_value_angle +_chem_mod_angle.new_value_angle_esd +HECmod1 change NC C4C C3C 108.743 1.50 +HECmod1 change C3C CAC CBC 112.400 1.50 +HECmod1 change C3C CAC HAC 108.177 1.50 +HECmod1 change CBC CAC HAC 108.549 2.04 +HECmod1 change HBC1 CBC HBC2 109.460 1.50 +HECmod1 change HBC1 CBC HBC3 109.460 1.50 +HECmod1 change HBC2 CBC HBC3 109.460 1.50 + +loop_ +_chem_mod_tor.mod_id +_chem_mod_tor.function +_chem_mod_tor.atom_id_1 +_chem_mod_tor.atom_id_2 +_chem_mod_tor.atom_id_3 +_chem_mod_tor.atom_id_4 +_chem_mod_tor.id +_chem_mod_tor.new_value_angle +_chem_mod_tor.new_value_angle_esd +_chem_mod_tor.new_period +HECmod1 delete C3C CAC CBC HBC1 . . . 3 +HECmod1 change C2C C3C CAC CBC sp2_sp3_8 150.000 20.0 6 + +data_mod_HECmod2 +loop_ +_chem_mod_atom.mod_id +_chem_mod_atom.function +_chem_mod_atom.atom_id +_chem_mod_atom.new_atom_id +_chem_mod_atom.new_type_symbol +_chem_mod_atom.new_type_energy +_chem_mod_atom.new_charge +HECmod2 change CAB . C CH1 0 + +loop_ +_chem_mod_bond.mod_id +_chem_mod_bond.function +_chem_mod_bond.atom_id_1 +_chem_mod_bond.atom_id_2 +_chem_mod_bond.new_type +_chem_mod_bond.new_value_dist +_chem_mod_bond.new_value_dist_esd +_chem_mod_bond.new_value_dist_nucleus +_chem_mod_bond.new_value_dist_nucleus_esd +HECmod2 change C2B C3B double 1.375 0.0200 1.375 0.0200 +HECmod2 change C3B CAB single 1.503 0.0100 1.503 0.0100 +HECmod2 change CAB CBB single 1.513 0.0121 1.513 0.0121 +HECmod2 change CAB HAB single 0.990 0.0200 1.092 0.0100 + +loop_ +_chem_mod_angle.mod_id +_chem_mod_angle.function +_chem_mod_angle.atom_id_1 +_chem_mod_angle.atom_id_2 +_chem_mod_angle.atom_id_3 +_chem_mod_angle.new_value_angle +_chem_mod_angle.new_value_angle_esd +HECmod2 change NB C4B C3B 108.743 1.50 +HECmod2 change C3B CAB CBB 112.400 1.50 +HECmod2 change C3B CAB HAB 108.177 1.50 +HECmod2 change CBB CAB HAB 108.549 2.04 +HECmod2 change HBB1 CBB HBB2 109.460 1.50 +HECmod2 change HBB1 CBB HBB3 109.460 1.50 +HECmod2 change HBB2 CBB HBB3 109.460 1.50 + +loop_ +_chem_mod_tor.mod_id +_chem_mod_tor.function +_chem_mod_tor.atom_id_1 +_chem_mod_tor.atom_id_2 +_chem_mod_tor.atom_id_3 +_chem_mod_tor.atom_id_4 +_chem_mod_tor.id +_chem_mod_tor.new_value_angle +_chem_mod_tor.new_value_angle_esd +_chem_mod_tor.new_period +HECmod2 delete C3B CAB CBB HBB1 . . . 3 +HECmod2 change C2B C3B CAB CBB sp2_sp3_6 150.000 20.0 6 + +data_mod_FADmod1 +loop_ +_chem_mod_atom.mod_id +_chem_mod_atom.function +_chem_mod_atom.atom_id +_chem_mod_atom.new_atom_id +_chem_mod_atom.new_type_symbol +_chem_mod_atom.new_type_energy +_chem_mod_atom.new_charge +FADmod1 delete HM83 . H H 0 +FADmod1 change C8M . C CH2 0 + +loop_ +_chem_mod_bond.mod_id +_chem_mod_bond.function +_chem_mod_bond.atom_id_1 +_chem_mod_bond.atom_id_2 +_chem_mod_bond.new_type +_chem_mod_bond.new_value_dist +_chem_mod_bond.new_value_dist_esd +_chem_mod_bond.new_value_dist_nucleus +_chem_mod_bond.new_value_dist_nucleus_esd +FADmod1 delete C8M HM83 single . . . . +FADmod1 change C7 C8 single 1.401 0.0100 1.401 0.0100 +FADmod1 change C8 C8M single 1.516 0.0100 1.516 0.0100 +FADmod1 change C8 C9 double 1.377 0.0162 1.377 0.0162 +FADmod1 change C8M HM81 single 0.982 0.0200 1.089 0.0100 +FADmod1 change C8M HM82 single 0.982 0.0200 1.089 0.0100 + +loop_ +_chem_mod_angle.mod_id +_chem_mod_angle.function +_chem_mod_angle.atom_id_1 +_chem_mod_angle.atom_id_2 +_chem_mod_angle.atom_id_3 +_chem_mod_angle.new_value_angle +_chem_mod_angle.new_value_angle_esd +FADmod1 delete C8 C8M HM83 . . +FADmod1 delete HM81 C8M HM83 . . +FADmod1 delete HM82 C8M HM83 . . +FADmod1 change C7 C8 C8M 120.426 2.23 +FADmod1 change C8M C8 C9 120.074 3.00 + +data_mod_HISmod1 +loop_ +_chem_mod_atom.mod_id +_chem_mod_atom.function +_chem_mod_atom.atom_id +_chem_mod_atom.new_atom_id +_chem_mod_atom.new_type_symbol +_chem_mod_atom.new_type_energy +_chem_mod_atom.new_charge +HISmod1 delete HD1 . H H 0 +HISmod1 change ND1 . N NR5 1 + +loop_ +_chem_mod_bond.mod_id +_chem_mod_bond.function +_chem_mod_bond.atom_id_1 +_chem_mod_bond.atom_id_2 +_chem_mod_bond.new_type +_chem_mod_bond.new_value_dist +_chem_mod_bond.new_value_dist_esd +_chem_mod_bond.new_value_dist_nucleus +_chem_mod_bond.new_value_dist_nucleus_esd +HISmod1 delete ND1 HD1 single . . . . +HISmod1 change CB CG single 1.491 0.0100 1.491 0.0100 +HISmod1 change CG ND1 single 1.352 0.0200 1.352 0.0200 +HISmod1 change CG CD2 double 1.357 0.0100 1.357 0.0100 +HISmod1 change ND1 CE1 double 1.351 0.0200 1.351 0.0200 +HISmod1 change CE1 HE1 single 0.939 0.0134 1.082 0.0130 + +loop_ +_chem_mod_angle.mod_id +_chem_mod_angle.function +_chem_mod_angle.atom_id_1 +_chem_mod_angle.atom_id_2 +_chem_mod_angle.atom_id_3 +_chem_mod_angle.new_value_angle +_chem_mod_angle.new_value_angle_esd +HISmod1 delete CG ND1 HD1 . . +HISmod1 delete CE1 ND1 HD1 . . +HISmod1 change CB CG ND1 123.044 1.50 +HISmod1 change CG CD2 HD2 126.231 1.50 +HISmod1 change ND1 CE1 HE1 125.433 1.50 + +loop_ +_chem_mod_plane_atom.mod_id +_chem_mod_plane_atom.function +_chem_mod_plane_atom.plane_id +_chem_mod_plane_atom.atom_id +_chem_mod_plane_atom.new_dist_esd +HISmod1 delete plan-1 CB 0.020 +HISmod1 delete plan-1 CD2 0.020 +HISmod1 delete plan-1 CE1 0.020 +HISmod1 delete plan-1 CG 0.020 +HISmod1 delete plan-1 HD1 0.020 +HISmod1 delete plan-1 HD2 0.020 +HISmod1 delete plan-1 HE1 0.020 +HISmod1 delete plan-1 HE2 0.020 +HISmod1 delete plan-1 ND1 0.020 +HISmod1 delete plan-1 NE2 0.020 + +data_mod_FADmod2 +loop_ +_chem_mod_atom.mod_id +_chem_mod_atom.function +_chem_mod_atom.atom_id +_chem_mod_atom.new_atom_id +_chem_mod_atom.new_type_symbol +_chem_mod_atom.new_type_energy +_chem_mod_atom.new_charge +FADmod2 delete HM83 . H H 0 +FADmod2 change C8M . C CH2 0 + +loop_ +_chem_mod_bond.mod_id +_chem_mod_bond.function +_chem_mod_bond.atom_id_1 +_chem_mod_bond.atom_id_2 +_chem_mod_bond.new_type +_chem_mod_bond.new_value_dist +_chem_mod_bond.new_value_dist_esd +_chem_mod_bond.new_value_dist_nucleus +_chem_mod_bond.new_value_dist_nucleus_esd +FADmod2 delete C8M HM83 single . . . . +FADmod2 change C7 C8 single 1.398 0.0119 1.398 0.0119 +FADmod2 change C8 C8M single 1.514 0.0100 1.514 0.0100 + +loop_ +_chem_mod_angle.mod_id +_chem_mod_angle.function +_chem_mod_angle.atom_id_1 +_chem_mod_angle.atom_id_2 +_chem_mod_angle.atom_id_3 +_chem_mod_angle.new_value_angle +_chem_mod_angle.new_value_angle_esd +FADmod2 delete C8 C8M HM83 . . +FADmod2 delete HM81 C8M HM83 . . +FADmod2 delete HM82 C8M HM83 . . +FADmod2 change C7 C8 C8M 120.918 3.00 +FADmod2 change C8M C8 C9 119.582 3.00 + +data_mod_HISmod2 +loop_ +_chem_mod_atom.mod_id +_chem_mod_atom.function +_chem_mod_atom.atom_id +_chem_mod_atom.new_atom_id +_chem_mod_atom.new_type_symbol +_chem_mod_atom.new_type_energy +_chem_mod_atom.new_charge +HISmod2 delete HE2 . H H 0 +HISmod2 change NE2 . N NR5 0 + +loop_ +_chem_mod_bond.mod_id +_chem_mod_bond.function +_chem_mod_bond.atom_id_1 +_chem_mod_bond.atom_id_2 +_chem_mod_bond.new_type +_chem_mod_bond.new_value_dist +_chem_mod_bond.new_value_dist_esd +_chem_mod_bond.new_value_dist_nucleus +_chem_mod_bond.new_value_dist_nucleus_esd +HISmod2 delete NE2 HE2 single . . . . +HISmod2 change CG CD2 double 1.366 0.0178 1.366 0.0178 +HISmod2 change ND1 CE1 double 1.344 0.0200 1.344 0.0200 +HISmod2 change CE1 NE2 single 1.322 0.0100 1.322 0.0100 +HISmod2 change CD2 HD2 single 0.949 0.0120 1.082 0.0130 +HISmod2 change CE1 HE1 single 0.939 0.0134 1.082 0.0130 + +loop_ +_chem_mod_angle.mod_id +_chem_mod_angle.function +_chem_mod_angle.atom_id_1 +_chem_mod_angle.atom_id_2 +_chem_mod_angle.atom_id_3 +_chem_mod_angle.new_value_angle +_chem_mod_angle.new_value_angle_esd +HISmod2 delete CD2 NE2 HE2 . . +HISmod2 delete CE1 NE2 HE2 . . +HISmod2 change NE2 CD2 HD2 125.717 1.62 + +loop_ +_chem_mod_plane_atom.mod_id +_chem_mod_plane_atom.function +_chem_mod_plane_atom.plane_id +_chem_mod_plane_atom.atom_id +_chem_mod_plane_atom.new_dist_esd +HISmod2 delete plan-1 CB 0.020 +HISmod2 delete plan-1 CD2 0.020 +HISmod2 delete plan-1 CE1 0.020 +HISmod2 delete plan-1 CG 0.020 +HISmod2 delete plan-1 HD1 0.020 +HISmod2 delete plan-1 HD2 0.020 +HISmod2 delete plan-1 HE1 0.020 +HISmod2 delete plan-1 HE2 0.020 +HISmod2 delete plan-1 ND1 0.020 +HISmod2 delete plan-1 NE2 0.020 + +data_mod_FADmod3 +loop_ +_chem_mod_atom.mod_id +_chem_mod_atom.function +_chem_mod_atom.atom_id +_chem_mod_atom.new_atom_id +_chem_mod_atom.new_type_symbol +_chem_mod_atom.new_type_energy +_chem_mod_atom.new_charge +FADmod3 delete HM83 . H H 0 +FADmod3 change C8M . C CH2 0 + +loop_ +_chem_mod_bond.mod_id +_chem_mod_bond.function +_chem_mod_bond.atom_id_1 +_chem_mod_bond.atom_id_2 +_chem_mod_bond.new_type +_chem_mod_bond.new_value_dist +_chem_mod_bond.new_value_dist_esd +_chem_mod_bond.new_value_dist_nucleus +_chem_mod_bond.new_value_dist_nucleus_esd +FADmod3 delete C8M HM83 single . . . . +FADmod3 change C7 C8 single 1.398 0.0119 1.398 0.0119 +FADmod3 change C8 C8M single 1.514 0.0100 1.514 0.0100 + +loop_ +_chem_mod_angle.mod_id +_chem_mod_angle.function +_chem_mod_angle.atom_id_1 +_chem_mod_angle.atom_id_2 +_chem_mod_angle.atom_id_3 +_chem_mod_angle.new_value_angle +_chem_mod_angle.new_value_angle_esd +FADmod3 delete C8 C8M HM83 . . +FADmod3 delete HM81 C8M HM83 . . +FADmod3 delete HM82 C8M HM83 . . +FADmod3 change C7 C8 C8M 120.918 3.00 +FADmod3 change C8M C8 C9 119.582 3.00 + +data_mod_GTPmod1 +loop_ +_chem_mod_atom.mod_id +_chem_mod_atom.function +_chem_mod_atom.atom_id +_chem_mod_atom.new_atom_id +_chem_mod_atom.new_type_symbol +_chem_mod_atom.new_type_energy +_chem_mod_atom.new_charge +GTPmod1 delete "HO3'" . H H 0 +GTPmod1 change "O3'" . O O2 0 + +loop_ +_chem_mod_bond.mod_id +_chem_mod_bond.function +_chem_mod_bond.atom_id_1 +_chem_mod_bond.atom_id_2 +_chem_mod_bond.new_type +_chem_mod_bond.new_value_dist +_chem_mod_bond.new_value_dist_esd +_chem_mod_bond.new_value_dist_nucleus +_chem_mod_bond.new_value_dist_nucleus_esd +GTPmod1 delete "O3'" "HO3'" single . . . . + +loop_ +_chem_mod_angle.mod_id +_chem_mod_angle.function +_chem_mod_angle.atom_id_1 +_chem_mod_angle.atom_id_2 +_chem_mod_angle.atom_id_3 +_chem_mod_angle.new_value_angle +_chem_mod_angle.new_value_angle_esd +GTPmod1 delete "C3'" "O3'" "HO3'" . . +GTPmod1 change "C5'" "C4'" "C3'" 114.817 2.32 +GTPmod1 change "C3'" "C4'" "H4'" 109.150 1.50 +GTPmod1 change "C2'" "C3'" "H3'" 110.368 2.92 +GTPmod1 change "C3'" "C2'" "H2'" 110.368 2.92 + +loop_ +_chem_mod_tor.mod_id +_chem_mod_tor.function +_chem_mod_tor.atom_id_1 +_chem_mod_tor.atom_id_2 +_chem_mod_tor.atom_id_3 +_chem_mod_tor.atom_id_4 +_chem_mod_tor.id +_chem_mod_tor.new_value_angle +_chem_mod_tor.new_value_angle_esd +_chem_mod_tor.new_period +GTPmod1 delete "C4'" "C3'" "O3'" "HO3'" . . . 0 + +data_mod_HEMmod2 +loop_ +_chem_mod_atom.mod_id +_chem_mod_atom.function +_chem_mod_atom.atom_id +_chem_mod_atom.new_atom_id +_chem_mod_atom.new_type_symbol +_chem_mod_atom.new_type_energy +_chem_mod_atom.new_charge +HEMmod2 change CAB . C CH1 0 +HEMmod2 change CBB . C CH3 0 +HEMmod2 add . H31 H H 0 + +loop_ +_chem_mod_bond.mod_id +_chem_mod_bond.function +_chem_mod_bond.atom_id_1 +_chem_mod_bond.atom_id_2 +_chem_mod_bond.new_type +_chem_mod_bond.new_value_dist +_chem_mod_bond.new_value_dist_esd +_chem_mod_bond.new_value_dist_nucleus +_chem_mod_bond.new_value_dist_nucleus_esd +HEMmod2 change C2B C3B double 1.375 0.0200 1.375 0.0200 +HEMmod2 change C3B C4B single 1.381 0.0200 1.381 0.0200 +HEMmod2 change C3B CAB single 1.503 0.0100 1.503 0.0100 +HEMmod2 change CAB CBB single 1.513 0.0121 1.513 0.0121 +HEMmod2 change CAB HAB single 0.990 0.0200 1.092 0.0100 +HEMmod2 add CBB H31 single 0.960 0.0100 1.092 0.0100 + +loop_ +_chem_mod_angle.mod_id +_chem_mod_angle.function +_chem_mod_angle.atom_id_1 +_chem_mod_angle.atom_id_2 +_chem_mod_angle.atom_id_3 +_chem_mod_angle.new_value_angle +_chem_mod_angle.new_value_angle_esd +HEMmod2 change C3B C4B NB 108.743 1.50 +HEMmod2 change C3B CAB CBB 112.400 1.50 +HEMmod2 change C3B CAB HAB 108.177 1.50 +HEMmod2 change CBB CAB HAB 108.549 2.04 +HEMmod2 change CAB CBB HBB 109.518 1.50 +HEMmod2 change CAB CBB HBBA 109.518 1.50 +HEMmod2 change HBB CBB HBBA 109.460 1.50 +HEMmod2 add CAB CBB H31 109.518 1.50 +HEMmod2 add HBB CBB H31 109.460 1.50 +HEMmod2 add HBBA CBB H31 109.460 1.50 + +loop_ +_chem_mod_tor.mod_id +_chem_mod_tor.function +_chem_mod_tor.atom_id_1 +_chem_mod_tor.atom_id_2 +_chem_mod_tor.atom_id_3 +_chem_mod_tor.atom_id_4 +_chem_mod_tor.id +_chem_mod_tor.new_value_angle +_chem_mod_tor.new_value_angle_esd +_chem_mod_tor.new_period +HEMmod2 delete C3B CAB CBB HBB . . . 2 +HEMmod2 change C2B C3B CAB CBB sp2_sp3_9 150.000 20.0 6 + +loop_ +_chem_mod_plane_atom.mod_id +_chem_mod_plane_atom.function +_chem_mod_plane_atom.plane_id +_chem_mod_plane_atom.atom_id +_chem_mod_plane_atom.new_dist_esd +HEMmod2 delete plan-10 C3B 0.020 +HEMmod2 delete plan-10 CAB 0.020 +HEMmod2 delete plan-10 CBB 0.020 +HEMmod2 delete plan-10 HAB 0.020 +HEMmod2 delete plan-11 CAB 0.020 +HEMmod2 delete plan-11 CBB 0.020 +HEMmod2 delete plan-11 HBB 0.020 +HEMmod2 delete plan-11 HBBA 0.020 + +data_mod_HEMmod3 +loop_ +_chem_mod_atom.mod_id +_chem_mod_atom.function +_chem_mod_atom.atom_id +_chem_mod_atom.new_atom_id +_chem_mod_atom.new_type_symbol +_chem_mod_atom.new_type_energy +_chem_mod_atom.new_charge +HEMmod3 change CAC . C CH1 0 +HEMmod3 change CBC . C CH3 0 +HEMmod3 add . H32 H H 0 + +loop_ +_chem_mod_bond.mod_id +_chem_mod_bond.function +_chem_mod_bond.atom_id_1 +_chem_mod_bond.atom_id_2 +_chem_mod_bond.new_type +_chem_mod_bond.new_value_dist +_chem_mod_bond.new_value_dist_esd +_chem_mod_bond.new_value_dist_nucleus +_chem_mod_bond.new_value_dist_nucleus_esd +HEMmod3 change C2C C3C single 1.375 0.0200 1.375 0.0200 +HEMmod3 change C3C C4C double 1.381 0.0200 1.381 0.0200 +HEMmod3 change C3C CAC single 1.503 0.0100 1.503 0.0100 +HEMmod3 change CAC CBC single 1.513 0.0121 1.513 0.0121 +HEMmod3 change CAC HAC single 0.990 0.0200 1.092 0.0100 +HEMmod3 add CBC H32 single 0.960 0.0100 1.092 0.0100 + +loop_ +_chem_mod_angle.mod_id +_chem_mod_angle.function +_chem_mod_angle.atom_id_1 +_chem_mod_angle.atom_id_2 +_chem_mod_angle.atom_id_3 +_chem_mod_angle.new_value_angle +_chem_mod_angle.new_value_angle_esd +HEMmod3 change C3C C4C NC 108.743 1.50 +HEMmod3 change C3C CAC CBC 112.400 1.50 +HEMmod3 change C3C CAC HAC 108.177 1.50 +HEMmod3 change CBC CAC HAC 108.549 2.04 +HEMmod3 change CAC CBC HBC 109.518 1.50 +HEMmod3 change CAC CBC HBCA 109.518 1.50 +HEMmod3 change HBC CBC HBCA 109.460 1.50 +HEMmod3 add CAC CBC H32 109.518 1.50 +HEMmod3 add HBC CBC H32 109.460 1.50 +HEMmod3 add HBCA CBC H32 109.460 1.50 + +loop_ +_chem_mod_tor.mod_id +_chem_mod_tor.function +_chem_mod_tor.atom_id_1 +_chem_mod_tor.atom_id_2 +_chem_mod_tor.atom_id_3 +_chem_mod_tor.atom_id_4 +_chem_mod_tor.id +_chem_mod_tor.new_value_angle +_chem_mod_tor.new_value_angle_esd +_chem_mod_tor.new_period +HEMmod3 delete C3C CAC CBC HBC . . . 2 +HEMmod3 change C2C C3C CAC CBC sp2_sp3_9 150.000 20.0 6 + +loop_ +_chem_mod_plane_atom.mod_id +_chem_mod_plane_atom.function +_chem_mod_plane_atom.plane_id +_chem_mod_plane_atom.atom_id +_chem_mod_plane_atom.new_dist_esd +HEMmod3 delete plan-12 C3C 0.020 +HEMmod3 delete plan-12 CAC 0.020 +HEMmod3 delete plan-12 CBC 0.020 +HEMmod3 delete plan-12 HAC 0.020 +HEMmod3 delete plan-13 CAC 0.020 +HEMmod3 delete plan-13 CBC 0.020 +HEMmod3 delete plan-13 HBC 0.020 +HEMmod3 delete plan-13 HBCA 0.020 + +data_mod_TYRmod1 +loop_ +_chem_mod_atom.mod_id +_chem_mod_atom.function +_chem_mod_atom.atom_id +_chem_mod_atom.new_atom_id +_chem_mod_atom.new_type_symbol +_chem_mod_atom.new_type_energy +_chem_mod_atom.new_charge +TYRmod1 delete HB3 . H H 0 +TYRmod1 change CB . C CH1 0 + +loop_ +_chem_mod_bond.mod_id +_chem_mod_bond.function +_chem_mod_bond.atom_id_1 +_chem_mod_bond.atom_id_2 +_chem_mod_bond.new_type +_chem_mod_bond.new_value_dist +_chem_mod_bond.new_value_dist_esd +_chem_mod_bond.new_value_dist_nucleus +_chem_mod_bond.new_value_dist_nucleus_esd +TYRmod1 delete CB HB3 single . . . . +TYRmod1 change CA C single 1.533 0.0111 1.533 0.0111 + +loop_ +_chem_mod_angle.mod_id +_chem_mod_angle.function +_chem_mod_angle.atom_id_1 +_chem_mod_angle.atom_id_2 +_chem_mod_angle.atom_id_3 +_chem_mod_angle.new_value_angle +_chem_mod_angle.new_value_angle_esd +TYRmod1 delete CA CB HB3 . . +TYRmod1 delete CG CB HB3 . . +TYRmod1 delete HB3 CB HB2 . . +TYRmod1 change N CA CB 113.399 3.00 +TYRmod1 change CA C O 117.156 1.94 +TYRmod1 change CA C OXT 117.156 1.94 +TYRmod1 change CA CB CG 113.308 3.00 +TYRmod1 change CA CB HB2 106.713 1.50 +TYRmod1 change CG CB HB2 107.067 3.00 +TYRmod1 change CB CG CD1 120.731 3.00 +TYRmod1 change CB CG CD2 120.731 3.00 + +loop_ +_chem_mod_tor.mod_id +_chem_mod_tor.function +_chem_mod_tor.atom_id_1 +_chem_mod_tor.atom_id_2 +_chem_mod_tor.atom_id_3 +_chem_mod_tor.atom_id_4 +_chem_mod_tor.id +_chem_mod_tor.new_value_angle +_chem_mod_tor.new_value_angle_esd +_chem_mod_tor.new_period +TYRmod1 change N CA CB CG sp3_sp3_28 180.000 10.0 3 +TYRmod1 change CD1 CG CB CA sp2_sp3_19 150.000 10.0 6 + +data_mod_HISmod3 +loop_ +_chem_mod_atom.mod_id +_chem_mod_atom.function +_chem_mod_atom.atom_id +_chem_mod_atom.new_atom_id +_chem_mod_atom.new_type_symbol +_chem_mod_atom.new_type_energy +_chem_mod_atom.new_charge +HISmod3 delete HE2 . H H 0 +HISmod3 change NE2 . N NR5 0 + +loop_ +_chem_mod_bond.mod_id +_chem_mod_bond.function +_chem_mod_bond.atom_id_1 +_chem_mod_bond.atom_id_2 +_chem_mod_bond.new_type +_chem_mod_bond.new_value_dist +_chem_mod_bond.new_value_dist_esd +_chem_mod_bond.new_value_dist_nucleus +_chem_mod_bond.new_value_dist_nucleus_esd +HISmod3 delete NE2 HE2 single . . . . +HISmod3 change CG CD2 double 1.364 0.0129 1.364 0.0129 +HISmod3 change ND1 CE1 double 1.351 0.0200 1.351 0.0200 +HISmod3 change CD2 NE2 single 1.376 0.0100 1.376 0.0100 +HISmod3 change CE1 NE2 single 1.338 0.0162 1.338 0.0162 +HISmod3 change CD2 HD2 single 0.947 0.0141 1.082 0.0130 +HISmod3 change CE1 HE1 single 0.928 0.0133 1.082 0.0130 + +loop_ +_chem_mod_angle.mod_id +_chem_mod_angle.function +_chem_mod_angle.atom_id_1 +_chem_mod_angle.atom_id_2 +_chem_mod_angle.atom_id_3 +_chem_mod_angle.new_value_angle +_chem_mod_angle.new_value_angle_esd +HISmod3 delete CD2 NE2 HE2 . . +HISmod3 delete CE1 NE2 HE2 . . +HISmod3 change CG ND1 CE1 108.905 3.00 +HISmod3 change CG CD2 NE2 108.374 2.83 +HISmod3 change CG CD2 HD2 126.805 1.50 + +loop_ +_chem_mod_plane_atom.mod_id +_chem_mod_plane_atom.function +_chem_mod_plane_atom.plane_id +_chem_mod_plane_atom.atom_id +_chem_mod_plane_atom.new_dist_esd +HISmod3 delete plan-1 CB 0.020 +HISmod3 delete plan-1 CD2 0.020 +HISmod3 delete plan-1 CE1 0.020 +HISmod3 delete plan-1 CG 0.020 +HISmod3 delete plan-1 HD1 0.020 +HISmod3 delete plan-1 HD2 0.020 +HISmod3 delete plan-1 HE1 0.020 +HISmod3 delete plan-1 HE2 0.020 +HISmod3 delete plan-1 ND1 0.020 +HISmod3 delete plan-1 NE2 0.020 + +data_mod_TYRmod2 +loop_ +_chem_mod_atom.mod_id +_chem_mod_atom.function +_chem_mod_atom.atom_id +_chem_mod_atom.new_atom_id +_chem_mod_atom.new_type_symbol +_chem_mod_atom.new_type_energy +_chem_mod_atom.new_charge +TYRmod2 delete HE2 . H H 0 +TYRmod2 change CE2 . C CR6 0 + +loop_ +_chem_mod_bond.mod_id +_chem_mod_bond.function +_chem_mod_bond.atom_id_1 +_chem_mod_bond.atom_id_2 +_chem_mod_bond.new_type +_chem_mod_bond.new_value_dist +_chem_mod_bond.new_value_dist_esd +_chem_mod_bond.new_value_dist_nucleus +_chem_mod_bond.new_value_dist_nucleus_esd +TYRmod2 delete CE2 HE2 single . . . . +TYRmod2 change CG CD2 single 1.374 0.0100 1.374 0.0100 + +loop_ +_chem_mod_angle.mod_id +_chem_mod_angle.function +_chem_mod_angle.atom_id_1 +_chem_mod_angle.atom_id_2 +_chem_mod_angle.atom_id_3 +_chem_mod_angle.new_value_angle +_chem_mod_angle.new_value_angle_esd +TYRmod2 delete CD2 CE2 HE2 . . +TYRmod2 delete CZ CE2 HE2 . . +TYRmod2 change CB CG CD2 121.348 2.28 + +loop_ +_chem_mod_plane_atom.mod_id +_chem_mod_plane_atom.function +_chem_mod_plane_atom.plane_id +_chem_mod_plane_atom.atom_id +_chem_mod_plane_atom.new_dist_esd +TYRmod2 delete plan-1 CB 0.020 +TYRmod2 delete plan-1 CD1 0.020 +TYRmod2 delete plan-1 CD2 0.020 +TYRmod2 delete plan-1 CE1 0.020 +TYRmod2 delete plan-1 CE2 0.020 +TYRmod2 delete plan-1 CG 0.020 +TYRmod2 delete plan-1 CZ 0.020 +TYRmod2 delete plan-1 HD1 0.020 +TYRmod2 delete plan-1 HD2 0.020 +TYRmod2 delete plan-1 HE1 0.020 +TYRmod2 delete plan-1 HE2 0.020 +TYRmod2 delete plan-1 OH 0.020 + +data_mod_LYSmod1 +loop_ +_chem_mod_atom.mod_id +_chem_mod_atom.function +_chem_mod_atom.atom_id +_chem_mod_atom.new_atom_id +_chem_mod_atom.new_type_symbol +_chem_mod_atom.new_type_energy +_chem_mod_atom.new_charge +LYSmod1 delete HZ2 . H H 0 +LYSmod1 delete HZ3 . H H 0 +LYSmod1 change NZ . N NT1 0 + +loop_ +_chem_mod_bond.mod_id +_chem_mod_bond.function +_chem_mod_bond.atom_id_1 +_chem_mod_bond.atom_id_2 +_chem_mod_bond.new_type +_chem_mod_bond.new_value_dist +_chem_mod_bond.new_value_dist_esd +_chem_mod_bond.new_value_dist_nucleus +_chem_mod_bond.new_value_dist_nucleus_esd +LYSmod1 delete NZ HZ2 single . . . . +LYSmod1 delete NZ HZ3 single . . . . +LYSmod1 change CE NZ single 1.468 0.0134 1.468 0.0134 +LYSmod1 change NZ HZ1 single 0.914 0.010 1.036 0.016 + +loop_ +_chem_mod_angle.mod_id +_chem_mod_angle.function +_chem_mod_angle.atom_id_1 +_chem_mod_angle.atom_id_2 +_chem_mod_angle.atom_id_3 +_chem_mod_angle.new_value_angle +_chem_mod_angle.new_value_angle_esd +LYSmod1 delete CE NZ HZ2 . . +LYSmod1 delete CE NZ HZ3 . . +LYSmod1 delete HZ1 NZ HZ2 . . +LYSmod1 delete HZ1 NZ HZ3 . . +LYSmod1 delete HZ2 NZ HZ3 . . +LYSmod1 change CE NZ HZ1 111.861 3.00 + +data_mod_CYSmod2 +loop_ +_chem_mod_atom.mod_id +_chem_mod_atom.function +_chem_mod_atom.atom_id +_chem_mod_atom.new_atom_id +_chem_mod_atom.new_type_symbol +_chem_mod_atom.new_type_energy +_chem_mod_atom.new_charge +CYSmod2 delete HG . H HSH1 0 +CYSmod2 change SG . S S2 0 + +loop_ +_chem_mod_bond.mod_id +_chem_mod_bond.function +_chem_mod_bond.atom_id_1 +_chem_mod_bond.atom_id_2 +_chem_mod_bond.new_type +_chem_mod_bond.new_value_dist +_chem_mod_bond.new_value_dist_esd +_chem_mod_bond.new_value_dist_nucleus +_chem_mod_bond.new_value_dist_nucleus_esd +CYSmod2 delete SG HG single . . . . +CYSmod2 change CB SG single 1.805 0.0100 1.805 0.0100 + +loop_ +_chem_mod_angle.mod_id +_chem_mod_angle.function +_chem_mod_angle.atom_id_1 +_chem_mod_angle.atom_id_2 +_chem_mod_angle.atom_id_3 +_chem_mod_angle.new_value_angle +_chem_mod_angle.new_value_angle_esd +CYSmod2 delete CB SG HG . . + +loop_ +_chem_mod_tor.mod_id +_chem_mod_tor.function +_chem_mod_tor.atom_id_1 +_chem_mod_tor.atom_id_2 +_chem_mod_tor.atom_id_3 +_chem_mod_tor.atom_id_4 +_chem_mod_tor.new_value_angle +_chem_mod_tor.new_value_angle_esd +CYSmod2 delete CA CB SG HG . . + +data_mod_LYSmod2 +loop_ +_chem_mod_atom.mod_id +_chem_mod_atom.function +_chem_mod_atom.atom_id +_chem_mod_atom.new_atom_id +_chem_mod_atom.new_type_symbol +_chem_mod_atom.new_type_energy +_chem_mod_atom.new_charge +LYSmod2 delete HZ1 . H H 0 +LYSmod2 delete HZ2 . H H 0 +LYSmod2 delete HZ3 . H H 0 +LYSmod2 change NZ . N N 0 + +loop_ +_chem_mod_bond.mod_id +_chem_mod_bond.function +_chem_mod_bond.atom_id_1 +_chem_mod_bond.atom_id_2 +_chem_mod_bond.new_type +_chem_mod_bond.new_value_dist +_chem_mod_bond.new_value_dist_esd +_chem_mod_bond.new_value_dist_nucleus +_chem_mod_bond.new_value_dist_nucleus_esd +LYSmod2 delete NZ HZ1 single . . . . +LYSmod2 delete NZ HZ2 single . . . . +LYSmod2 delete NZ HZ3 single . . . . +LYSmod2 change CE NZ single 1.480 0.0168 1.480 0.0168 + +loop_ +_chem_mod_angle.mod_id +_chem_mod_angle.function +_chem_mod_angle.atom_id_1 +_chem_mod_angle.atom_id_2 +_chem_mod_angle.atom_id_3 +_chem_mod_angle.new_value_angle +_chem_mod_angle.new_value_angle_esd +LYSmod2 delete CE NZ HZ1 . . +LYSmod2 delete CE NZ HZ2 . . +LYSmod2 delete CE NZ HZ3 . . +LYSmod2 delete HZ1 NZ HZ2 . . +LYSmod2 delete HZ1 NZ HZ3 . . +LYSmod2 delete HZ2 NZ HZ3 . . + +loop_ +_chem_mod_tor.mod_id +_chem_mod_tor.function +_chem_mod_tor.atom_id_1 +_chem_mod_tor.atom_id_2 +_chem_mod_tor.atom_id_3 +_chem_mod_tor.atom_id_4 +_chem_mod_tor.new_value_angle +_chem_mod_tor.new_value_angle_esd +LYSmod2 delete CD CE NZ HZ3 . . + +data_mod_LYSmod3 +loop_ +_chem_mod_atom.mod_id +_chem_mod_atom.function +_chem_mod_atom.atom_id +_chem_mod_atom.new_atom_id +_chem_mod_atom.new_type_symbol +_chem_mod_atom.new_type_energy +_chem_mod_atom.new_charge +LYSmod3 delete HZ2 . H H 0 +LYSmod3 delete HZ3 . H H 0 +LYSmod3 change NZ . N NH1 0 + +loop_ +_chem_mod_bond.mod_id +_chem_mod_bond.function +_chem_mod_bond.atom_id_1 +_chem_mod_bond.atom_id_2 +_chem_mod_bond.new_type +_chem_mod_bond.new_value_dist +_chem_mod_bond.new_value_dist_esd +_chem_mod_bond.new_value_dist_nucleus +_chem_mod_bond.new_value_dist_nucleus_esd +LYSmod3 delete NZ HZ2 single . . . . +LYSmod3 delete NZ HZ3 single . . . . +LYSmod3 change CE NZ single 1.456 0.0109 1.456 0.0109 +LYSmod3 change NZ HZ1 single 0.914 0.010 1.036 0.016 + +loop_ +_chem_mod_angle.mod_id +_chem_mod_angle.function +_chem_mod_angle.atom_id_1 +_chem_mod_angle.atom_id_2 +_chem_mod_angle.atom_id_3 +_chem_mod_angle.new_value_angle +_chem_mod_angle.new_value_angle_esd +LYSmod3 delete CE NZ HZ2 . . +LYSmod3 delete CE NZ HZ3 . . +LYSmod3 delete HZ1 NZ HZ2 . . +LYSmod3 delete HZ1 NZ HZ3 . . +LYSmod3 delete HZ2 NZ HZ3 . . +LYSmod3 change CE NZ HZ1 118.241 1.90 + +data_mod_ASNmod1 +loop_ +_chem_mod_atom.mod_id +_chem_mod_atom.function +_chem_mod_atom.atom_id +_chem_mod_atom.new_atom_id +_chem_mod_atom.new_type_symbol +_chem_mod_atom.new_type_energy +_chem_mod_atom.new_charge +ASNmod1 delete ND2 . N NH2 0 +ASNmod1 delete HD21 . H H 0 +ASNmod1 delete HD22 . H H 0 + +loop_ +_chem_mod_bond.mod_id +_chem_mod_bond.function +_chem_mod_bond.atom_id_1 +_chem_mod_bond.atom_id_2 +_chem_mod_bond.new_type +_chem_mod_bond.new_value_dist +_chem_mod_bond.new_value_dist_esd +_chem_mod_bond.new_value_dist_nucleus +_chem_mod_bond.new_value_dist_nucleus_esd +ASNmod1 delete CG ND2 single . . . . +ASNmod1 delete ND2 HD21 single . . . . +ASNmod1 delete ND2 HD22 single . . . . +ASNmod1 change CB CG single 1.508 0.0116 1.508 0.0116 + +loop_ +_chem_mod_angle.mod_id +_chem_mod_angle.function +_chem_mod_angle.atom_id_1 +_chem_mod_angle.atom_id_2 +_chem_mod_angle.atom_id_3 +_chem_mod_angle.new_value_angle +_chem_mod_angle.new_value_angle_esd +ASNmod1 delete CB CG ND2 . . +ASNmod1 delete OD1 CG ND2 . . +ASNmod1 delete CG ND2 HD21 . . +ASNmod1 delete CG ND2 HD22 . . +ASNmod1 delete HD21 ND2 HD22 . . +ASNmod1 change CB CG OD1 121.400 1.50 + +loop_ +_chem_mod_tor.mod_id +_chem_mod_tor.function +_chem_mod_tor.atom_id_1 +_chem_mod_tor.atom_id_2 +_chem_mod_tor.atom_id_3 +_chem_mod_tor.atom_id_4 +_chem_mod_tor.new_value_angle +_chem_mod_tor.new_value_angle_esd +ASNmod1 delete CB CG ND2 HD21 . . + +loop_ +_chem_mod_plane_atom.mod_id +_chem_mod_plane_atom.function +_chem_mod_plane_atom.plane_id +_chem_mod_plane_atom.atom_id +_chem_mod_plane_atom.new_dist_esd +ASNmod1 delete plan-2 CB 0.020 +ASNmod1 delete plan-2 CG 0.020 +ASNmod1 delete plan-2 ND2 0.020 +ASNmod1 delete plan-2 OD1 0.020 +ASNmod1 delete plan-3 CG 0.020 +ASNmod1 delete plan-3 HD21 0.020 +ASNmod1 delete plan-3 HD22 0.020 +ASNmod1 delete plan-3 ND2 0.020 + +data_mod_METmod1 +loop_ +_chem_mod_atom.mod_id +_chem_mod_atom.function +_chem_mod_atom.atom_id +_chem_mod_atom.new_atom_id +_chem_mod_atom.new_type_symbol +_chem_mod_atom.new_type_energy +_chem_mod_atom.new_charge +METmod1 change SD . S S3 1 + +loop_ +_chem_mod_bond.mod_id +_chem_mod_bond.function +_chem_mod_bond.atom_id_1 +_chem_mod_bond.atom_id_2 +_chem_mod_bond.new_type +_chem_mod_bond.new_value_dist +_chem_mod_bond.new_value_dist_esd +_chem_mod_bond.new_value_dist_nucleus +_chem_mod_bond.new_value_dist_nucleus_esd +METmod1 change CG SD single 1.808 0.0100 1.808 0.0100 +METmod1 change CE HE3 single 0.967 0.0100 1.089 0.0100 +METmod1 change CE HE2 single 0.967 0.0100 1.089 0.0100 +METmod1 change CE HE1 single 0.967 0.0100 1.089 0.0100 + +loop_ +_chem_mod_angle.mod_id +_chem_mod_angle.function +_chem_mod_angle.atom_id_1 +_chem_mod_angle.atom_id_2 +_chem_mod_angle.atom_id_3 +_chem_mod_angle.new_value_angle +_chem_mod_angle.new_value_angle_esd +METmod1 change CA CB CG 114.058 2.21 +METmod1 change CG CB HB3 108.377 2.40 +METmod1 change CG CB HB2 108.377 2.40 +METmod1 change CB CG SD 110.122 1.50 +METmod1 change CB CG HG3 108.661 3.00 +METmod1 change CB CG HG2 108.661 3.00 + +loop_ +_chem_mod_tor.mod_id +_chem_mod_tor.function +_chem_mod_tor.atom_id_1 +_chem_mod_tor.atom_id_2 +_chem_mod_tor.atom_id_3 +_chem_mod_tor.atom_id_4 +_chem_mod_tor.id +_chem_mod_tor.new_value_angle +_chem_mod_tor.new_value_angle_esd +_chem_mod_tor.new_period +METmod1 change CA CB CG SD sp3_sp3_19 180.000 10.0 3 +METmod1 change CB CG SD CE sp3_sp3_28 180.000 10.0 3 + +data_mod_TYRmod3 +loop_ +_chem_mod_atom.mod_id +_chem_mod_atom.function +_chem_mod_atom.atom_id +_chem_mod_atom.new_atom_id +_chem_mod_atom.new_type_symbol +_chem_mod_atom.new_type_energy +_chem_mod_atom.new_charge +TYRmod3 delete HE1 . H H 0 +TYRmod3 change CE1 . C CR6 0 + +loop_ +_chem_mod_bond.mod_id +_chem_mod_bond.function +_chem_mod_bond.atom_id_1 +_chem_mod_bond.atom_id_2 +_chem_mod_bond.new_type +_chem_mod_bond.new_value_dist +_chem_mod_bond.new_value_dist_esd +_chem_mod_bond.new_value_dist_nucleus +_chem_mod_bond.new_value_dist_nucleus_esd +TYRmod3 delete CE1 HE1 single . . . . +TYRmod3 change CE1 CZ double 1.395 0.0152 1.395 0.0152 +TYRmod3 change CD1 HD1 single 0.940 0.0104 1.082 0.0130 + +loop_ +_chem_mod_angle.mod_id +_chem_mod_angle.function +_chem_mod_angle.atom_id_1 +_chem_mod_angle.atom_id_2 +_chem_mod_angle.atom_id_3 +_chem_mod_angle.new_value_angle +_chem_mod_angle.new_value_angle_esd +TYRmod3 delete CD1 CE1 HE1 . . +TYRmod3 delete CZ CE1 HE1 . . +TYRmod3 change CB CG CD1 121.186 2.28 +TYRmod3 change CG CD1 HD1 119.873 2.79 +TYRmod3 change CD1 CE1 CZ 119.634 2.58 + +loop_ +_chem_mod_tor.mod_id +_chem_mod_tor.function +_chem_mod_tor.atom_id_1 +_chem_mod_tor.atom_id_2 +_chem_mod_tor.atom_id_3 +_chem_mod_tor.atom_id_4 +_chem_mod_tor.id +_chem_mod_tor.new_value_angle +_chem_mod_tor.new_value_angle_esd +_chem_mod_tor.new_period +TYRmod3 change CB CG CD1 CE1 const_sp2_sp2_3 180.000 0.0 2 + +loop_ +_chem_mod_plane_atom.mod_id +_chem_mod_plane_atom.function +_chem_mod_plane_atom.plane_id +_chem_mod_plane_atom.atom_id +_chem_mod_plane_atom.new_dist_esd +TYRmod3 delete plan-1 CB 0.020 +TYRmod3 delete plan-1 CD1 0.020 +TYRmod3 delete plan-1 CD2 0.020 +TYRmod3 delete plan-1 CE1 0.020 +TYRmod3 delete plan-1 CE2 0.020 +TYRmod3 delete plan-1 CG 0.020 +TYRmod3 delete plan-1 CZ 0.020 +TYRmod3 delete plan-1 HD1 0.020 +TYRmod3 delete plan-1 HD2 0.020 +TYRmod3 delete plan-1 HE1 0.020 +TYRmod3 delete plan-1 HE2 0.020 +TYRmod3 delete plan-1 OH 0.020 + +data_mod_LEUmod1 +loop_ +_chem_mod_atom.mod_id +_chem_mod_atom.function +_chem_mod_atom.atom_id +_chem_mod_atom.new_atom_id +_chem_mod_atom.new_type_symbol +_chem_mod_atom.new_type_energy +_chem_mod_atom.new_charge +LEUmod1 delete OXT . O OC -1 + +loop_ +_chem_mod_bond.mod_id +_chem_mod_bond.function +_chem_mod_bond.atom_id_1 +_chem_mod_bond.atom_id_2 +_chem_mod_bond.new_type +_chem_mod_bond.new_value_dist +_chem_mod_bond.new_value_dist_esd +_chem_mod_bond.new_value_dist_nucleus +_chem_mod_bond.new_value_dist_nucleus_esd +LEUmod1 delete C OXT single . . . . +LEUmod1 change CA C single 1.527 0.0100 1.527 0.0100 +LEUmod1 change C O double 1.229 0.0102 1.229 0.0102 + +loop_ +_chem_mod_angle.mod_id +_chem_mod_angle.function +_chem_mod_angle.atom_id_1 +_chem_mod_angle.atom_id_2 +_chem_mod_angle.atom_id_3 +_chem_mod_angle.new_value_angle +_chem_mod_angle.new_value_angle_esd +LEUmod1 delete CA C OXT . . +LEUmod1 delete O C OXT . . +LEUmod1 change CA C O 121.041 1.50 + +loop_ +_chem_mod_plane_atom.mod_id +_chem_mod_plane_atom.function +_chem_mod_plane_atom.plane_id +_chem_mod_plane_atom.atom_id +_chem_mod_plane_atom.new_dist_esd +LEUmod1 delete plan-1 C 0.020 +LEUmod1 delete plan-1 CA 0.020 +LEUmod1 delete plan-1 O 0.020 +LEUmod1 delete plan-1 OXT 0.020 + +data_mod_LYSmod4 +loop_ +_chem_mod_atom.mod_id +_chem_mod_atom.function +_chem_mod_atom.atom_id +_chem_mod_atom.new_atom_id +_chem_mod_atom.new_type_symbol +_chem_mod_atom.new_type_energy +_chem_mod_atom.new_charge +LYSmod4 delete HZ1 . H H 0 +LYSmod4 delete HZ2 . H H 0 +LYSmod4 delete HZ3 . H H 0 +LYSmod4 change NZ . N N 0 + +loop_ +_chem_mod_bond.mod_id +_chem_mod_bond.function +_chem_mod_bond.atom_id_1 +_chem_mod_bond.atom_id_2 +_chem_mod_bond.new_type +_chem_mod_bond.new_value_dist +_chem_mod_bond.new_value_dist_esd +_chem_mod_bond.new_value_dist_nucleus +_chem_mod_bond.new_value_dist_nucleus_esd +LYSmod4 delete NZ HZ1 single . . . . +LYSmod4 delete NZ HZ2 single . . . . +LYSmod4 delete NZ HZ3 single . . . . +LYSmod4 change CE NZ single 1.462 0.0100 1.462 0.0100 + +loop_ +_chem_mod_angle.mod_id +_chem_mod_angle.function +_chem_mod_angle.atom_id_1 +_chem_mod_angle.atom_id_2 +_chem_mod_angle.atom_id_3 +_chem_mod_angle.new_value_angle +_chem_mod_angle.new_value_angle_esd +LYSmod4 delete CE NZ HZ1 . . +LYSmod4 delete CE NZ HZ2 . . +LYSmod4 delete CE NZ HZ3 . . +LYSmod4 delete HZ1 NZ HZ2 . . +LYSmod4 delete HZ1 NZ HZ3 . . +LYSmod4 delete HZ2 NZ HZ3 . . + +loop_ +_chem_mod_tor.mod_id +_chem_mod_tor.function +_chem_mod_tor.atom_id_1 +_chem_mod_tor.atom_id_2 +_chem_mod_tor.atom_id_3 +_chem_mod_tor.atom_id_4 +_chem_mod_tor.new_value_angle +_chem_mod_tor.new_value_angle_esd +LYSmod4 delete CD CE NZ HZ1 . . + +data_mod_TRPmod1 +loop_ +_chem_mod_atom.mod_id +_chem_mod_atom.function +_chem_mod_atom.atom_id +_chem_mod_atom.new_atom_id +_chem_mod_atom.new_type_symbol +_chem_mod_atom.new_type_energy +_chem_mod_atom.new_charge +TRPmod1 delete HH2 . H H 0 +TRPmod1 change CH2 . C CR6 0 + +loop_ +_chem_mod_bond.mod_id +_chem_mod_bond.function +_chem_mod_bond.atom_id_1 +_chem_mod_bond.atom_id_2 +_chem_mod_bond.new_type +_chem_mod_bond.new_value_dist +_chem_mod_bond.new_value_dist_esd +_chem_mod_bond.new_value_dist_nucleus +_chem_mod_bond.new_value_dist_nucleus_esd +TRPmod1 delete CH2 HH2 single . . . . +TRPmod1 change CE2 CZ2 single 1.395 0.0185 1.395 0.0185 +TRPmod1 change CE3 CZ3 double 1.379 0.0158 1.379 0.0158 +TRPmod1 change CZ2 CH2 double 1.391 0.0100 1.391 0.0100 +TRPmod1 change CZ3 CH2 single 1.412 0.0100 1.412 0.0100 +TRPmod1 change CZ2 HZ2 single 0.950 0.0100 1.082 0.0130 + +loop_ +_chem_mod_angle.mod_id +_chem_mod_angle.function +_chem_mod_angle.atom_id_1 +_chem_mod_angle.atom_id_2 +_chem_mod_angle.atom_id_3 +_chem_mod_angle.new_value_angle +_chem_mod_angle.new_value_angle_esd +TRPmod1 delete CZ2 CH2 HH2 . . +TRPmod1 delete CZ3 CH2 HH2 . . +TRPmod1 change CE2 CZ2 CH2 119.258 1.50 +TRPmod1 change CZ2 CH2 CZ3 119.154 1.50 + +loop_ +_chem_mod_plane_atom.mod_id +_chem_mod_plane_atom.function +_chem_mod_plane_atom.plane_id +_chem_mod_plane_atom.atom_id +_chem_mod_plane_atom.new_dist_esd +TRPmod1 delete plan-1 CD2 0.020 +TRPmod1 delete plan-1 CE2 0.020 +TRPmod1 delete plan-1 CE3 0.020 +TRPmod1 delete plan-1 CG 0.020 +TRPmod1 delete plan-1 CH2 0.020 +TRPmod1 delete plan-1 CZ2 0.020 +TRPmod1 delete plan-1 CZ3 0.020 +TRPmod1 delete plan-1 HE3 0.020 +TRPmod1 delete plan-1 HH2 0.020 +TRPmod1 delete plan-1 HZ2 0.020 +TRPmod1 delete plan-1 HZ3 0.020 +TRPmod1 delete plan-1 NE1 0.020 + +data_mod_TYRmod4 +loop_ +_chem_mod_atom.mod_id +_chem_mod_atom.function +_chem_mod_atom.atom_id +_chem_mod_atom.new_atom_id +_chem_mod_atom.new_type_symbol +_chem_mod_atom.new_type_energy +_chem_mod_atom.new_charge +TYRmod4 delete HE2 . H H 0 +TYRmod4 change CE2 . C CR6 0 + +loop_ +_chem_mod_bond.mod_id +_chem_mod_bond.function +_chem_mod_bond.atom_id_1 +_chem_mod_bond.atom_id_2 +_chem_mod_bond.new_type +_chem_mod_bond.new_value_dist +_chem_mod_bond.new_value_dist_esd +_chem_mod_bond.new_value_dist_nucleus +_chem_mod_bond.new_value_dist_nucleus_esd +TYRmod4 delete CE2 HE2 single . . . . +TYRmod4 change CG CD2 single 1.391 0.0149 1.391 0.0149 +TYRmod4 change CD2 CE2 double 1.396 0.0127 1.396 0.0127 +TYRmod4 change CE2 CZ single 1.400 0.0131 1.400 0.0131 + +loop_ +_chem_mod_angle.mod_id +_chem_mod_angle.function +_chem_mod_angle.atom_id_1 +_chem_mod_angle.atom_id_2 +_chem_mod_angle.atom_id_3 +_chem_mod_angle.new_value_angle +_chem_mod_angle.new_value_angle_esd +TYRmod4 delete CD2 CE2 HE2 . . +TYRmod4 delete CZ CE2 HE2 . . +TYRmod4 change CB CG CD2 121.325 2.28 +TYRmod4 change CD1 CG CD2 117.170 2.83 +TYRmod4 change CG CD2 CE2 123.240 3.00 +TYRmod4 change CD2 CE2 CZ 118.013 1.50 + +loop_ +_chem_mod_plane_atom.mod_id +_chem_mod_plane_atom.function +_chem_mod_plane_atom.plane_id +_chem_mod_plane_atom.atom_id +_chem_mod_plane_atom.new_dist_esd +TYRmod4 delete plan-1 CB 0.020 +TYRmod4 delete plan-1 CD1 0.020 +TYRmod4 delete plan-1 CD2 0.020 +TYRmod4 delete plan-1 CE1 0.020 +TYRmod4 delete plan-1 CE2 0.020 +TYRmod4 delete plan-1 CG 0.020 +TYRmod4 delete plan-1 CZ 0.020 +TYRmod4 delete plan-1 HD1 0.020 +TYRmod4 delete plan-1 HD2 0.020 +TYRmod4 delete plan-1 HE1 0.020 +TYRmod4 delete plan-1 HE2 0.020 +TYRmod4 delete plan-1 OH 0.020 + +data_mod_TYRmod5 +loop_ +_chem_mod_atom.mod_id +_chem_mod_atom.function +_chem_mod_atom.atom_id +_chem_mod_atom.new_atom_id +_chem_mod_atom.new_type_symbol +_chem_mod_atom.new_type_energy +_chem_mod_atom.new_charge +TYRmod5 delete HH . H H 0 +TYRmod5 change OH . O O 0 + +loop_ +_chem_mod_bond.mod_id +_chem_mod_bond.function +_chem_mod_bond.atom_id_1 +_chem_mod_bond.atom_id_2 +_chem_mod_bond.new_type +_chem_mod_bond.new_value_dist +_chem_mod_bond.new_value_dist_esd +_chem_mod_bond.new_value_dist_nucleus +_chem_mod_bond.new_value_dist_nucleus_esd +TYRmod5 delete OH HH single . . . . +TYRmod5 change CZ OH single 1.410 0.0100 1.410 0.0100 + +loop_ +_chem_mod_angle.mod_id +_chem_mod_angle.function +_chem_mod_angle.atom_id_1 +_chem_mod_angle.atom_id_2 +_chem_mod_angle.atom_id_3 +_chem_mod_angle.new_value_angle +_chem_mod_angle.new_value_angle_esd +TYRmod5 delete CZ OH HH . . +TYRmod5 change CE1 CZ CE2 121.469 1.50 + +loop_ +_chem_mod_tor.mod_id +_chem_mod_tor.function +_chem_mod_tor.atom_id_1 +_chem_mod_tor.atom_id_2 +_chem_mod_tor.atom_id_3 +_chem_mod_tor.atom_id_4 +_chem_mod_tor.id +_chem_mod_tor.new_value_angle +_chem_mod_tor.new_value_angle_esd +_chem_mod_tor.new_period +TYRmod5 delete CE1 CZ OH HH . . . 0 + +data_mod_LYSmod5 +loop_ +_chem_mod_atom.mod_id +_chem_mod_atom.function +_chem_mod_atom.atom_id +_chem_mod_atom.new_atom_id +_chem_mod_atom.new_type_symbol +_chem_mod_atom.new_type_energy +_chem_mod_atom.new_charge +LYSmod5 delete HZ2 . H H 0 +LYSmod5 delete HZ3 . H H 0 +LYSmod5 change NZ . N NH1 0 + +loop_ +_chem_mod_bond.mod_id +_chem_mod_bond.function +_chem_mod_bond.atom_id_1 +_chem_mod_bond.atom_id_2 +_chem_mod_bond.new_type +_chem_mod_bond.new_value_dist +_chem_mod_bond.new_value_dist_esd +_chem_mod_bond.new_value_dist_nucleus +_chem_mod_bond.new_value_dist_nucleus_esd +LYSmod5 delete NZ HZ2 single . . . . +LYSmod5 delete NZ HZ3 single . . . . +LYSmod5 change CE NZ single 1.456 0.0109 1.456 0.0109 +LYSmod5 change NZ HZ1 single 0.914 0.010 1.036 0.016 + +loop_ +_chem_mod_angle.mod_id +_chem_mod_angle.function +_chem_mod_angle.atom_id_1 +_chem_mod_angle.atom_id_2 +_chem_mod_angle.atom_id_3 +_chem_mod_angle.new_value_angle +_chem_mod_angle.new_value_angle_esd +LYSmod5 delete CE NZ HZ2 . . +LYSmod5 delete CE NZ HZ3 . . +LYSmod5 delete HZ1 NZ HZ2 . . +LYSmod5 delete HZ1 NZ HZ3 . . +LYSmod5 delete HZ2 NZ HZ3 . . +LYSmod5 change CE NZ HZ1 118.176 1.90 + +data_mod_MS6mod2 +loop_ +_chem_mod_atom.mod_id +_chem_mod_atom.function +_chem_mod_atom.atom_id +_chem_mod_atom.new_atom_id +_chem_mod_atom.new_type_symbol +_chem_mod_atom.new_type_energy +_chem_mod_atom.new_charge +MS6mod2 delete H2 . H H 0 +MS6mod2 delete H3 . H H 0 +MS6mod2 change N . N NH1 0 + +loop_ +_chem_mod_bond.mod_id +_chem_mod_bond.function +_chem_mod_bond.atom_id_1 +_chem_mod_bond.atom_id_2 +_chem_mod_bond.new_type +_chem_mod_bond.new_value_dist +_chem_mod_bond.new_value_dist_esd +_chem_mod_bond.new_value_dist_nucleus +_chem_mod_bond.new_value_dist_nucleus_esd +MS6mod2 delete N H2 single . . . . +MS6mod2 delete N H3 single . . . . +MS6mod2 change N CA single 1.454 0.0100 1.454 0.0100 +MS6mod2 change N H single 0.871 0.0200 1.016 0.0100 + +loop_ +_chem_mod_angle.mod_id +_chem_mod_angle.function +_chem_mod_angle.atom_id_1 +_chem_mod_angle.atom_id_2 +_chem_mod_angle.atom_id_3 +_chem_mod_angle.new_value_angle +_chem_mod_angle.new_value_angle_esd +MS6mod2 delete CA N H2 . . +MS6mod2 delete CA N H3 . . +MS6mod2 delete H N H2 . . +MS6mod2 delete H N H3 . . +MS6mod2 delete H2 N H3 . . +MS6mod2 change CA N H 119.298 3.00 +MS6mod2 change N CA C 111.439 3.00 + +data_mod_ASPprot +loop_ +_chem_mod_atom.mod_id +_chem_mod_atom.function +_chem_mod_atom.atom_id +_chem_mod_atom.new_atom_id +_chem_mod_atom.new_type_symbol +_chem_mod_atom.new_type_energy +_chem_mod_atom.new_charge +ASPprot change OD2 . O OH1 0 +ASPprot add . HD2 H H 0 + +loop_ +_chem_mod_bond.mod_id +_chem_mod_bond.function +_chem_mod_bond.atom_id_1 +_chem_mod_bond.atom_id_2 +_chem_mod_bond.new_type +_chem_mod_bond.new_value_dist +_chem_mod_bond.new_value_dist_esd +_chem_mod_bond.new_value_dist_nucleus +_chem_mod_bond.new_value_dist_nucleus_esd +ASPprot change CB CG single 1.505 0.0100 1.505 0.0100 +ASPprot change CG OD1 double 1.217 0.0198 1.217 0.0198 +ASPprot change CG OD2 single 1.308 0.0191 1.308 0.0191 +ASPprot add OD2 HD2 single 0.876 0.0200 0.966 0.0059 + +loop_ +_chem_mod_angle.mod_id +_chem_mod_angle.function +_chem_mod_angle.atom_id_1 +_chem_mod_angle.atom_id_2 +_chem_mod_angle.atom_id_3 +_chem_mod_angle.new_value_angle +_chem_mod_angle.new_value_angle_esd +ASPprot change CA CB CG 113.488 1.82 +ASPprot change CG CB HB3 108.725 1.50 +ASPprot change CG CB HB2 108.725 1.50 +ASPprot change CB CG OD1 123.540 1.50 +ASPprot change CB CG OD2 113.234 2.02 +ASPprot add CG OD2 HD2 110.209 3.00 + +loop_ +_chem_mod_tor.mod_id +_chem_mod_tor.function +_chem_mod_tor.atom_id_1 +_chem_mod_tor.atom_id_2 +_chem_mod_tor.atom_id_3 +_chem_mod_tor.atom_id_4 +_chem_mod_tor.id +_chem_mod_tor.new_value_angle +_chem_mod_tor.new_value_angle_esd +_chem_mod_tor.new_period +ASPprot add CB CG OD2 HD2 sp2_sp2_1 180.000 5.0 2 + +data_mod_GLUprot +loop_ +_chem_mod_atom.mod_id +_chem_mod_atom.function +_chem_mod_atom.atom_id +_chem_mod_atom.new_atom_id +_chem_mod_atom.new_type_symbol +_chem_mod_atom.new_type_energy +_chem_mod_atom.new_charge +GLUprot change OE2 . O OH1 0 +GLUprot add . HE2 H H 0 + +loop_ +_chem_mod_bond.mod_id +_chem_mod_bond.function +_chem_mod_bond.atom_id_1 +_chem_mod_bond.atom_id_2 +_chem_mod_bond.new_type +_chem_mod_bond.new_value_dist +_chem_mod_bond.new_value_dist_esd +_chem_mod_bond.new_value_dist_nucleus +_chem_mod_bond.new_value_dist_nucleus_esd +GLUprot change CG CD single 1.504 0.0100 1.504 0.0100 +GLUprot change CD OE1 double 1.217 0.0198 1.217 0.0198 +GLUprot change CD OE2 single 1.308 0.0191 1.308 0.0191 +GLUprot add OE2 HE2 single 0.876 0.0200 0.966 0.0059 + +loop_ +_chem_mod_angle.mod_id +_chem_mod_angle.function +_chem_mod_angle.atom_id_1 +_chem_mod_angle.atom_id_2 +_chem_mod_angle.atom_id_3 +_chem_mod_angle.new_value_angle +_chem_mod_angle.new_value_angle_esd +GLUprot change CG CD OE1 123.741 1.99 +GLUprot change CG CD OE2 113.306 2.95 +GLUprot add CD OE2 HE2 110.209 3.00 + +loop_ +_chem_mod_tor.mod_id +_chem_mod_tor.function +_chem_mod_tor.atom_id_1 +_chem_mod_tor.atom_id_2 +_chem_mod_tor.atom_id_3 +_chem_mod_tor.atom_id_4 +_chem_mod_tor.id +_chem_mod_tor.new_value_angle +_chem_mod_tor.new_value_angle_esd +_chem_mod_tor.new_period +GLUprot add CG CD OE2 HE2 sp2_sp2_1 180.000 5.0 2 + +data_mod_HISprot1 +loop_ +_chem_mod_atom.mod_id +_chem_mod_atom.function +_chem_mod_atom.atom_id +_chem_mod_atom.new_atom_id +_chem_mod_atom.new_type_symbol +_chem_mod_atom.new_type_energy +_chem_mod_atom.new_charge +HISprot1 delete HD1 . H H 0 +HISprot1 change ND1 . N NRD5 0 + +loop_ +_chem_mod_bond.mod_id +_chem_mod_bond.function +_chem_mod_bond.atom_id_1 +_chem_mod_bond.atom_id_2 +_chem_mod_bond.new_type +_chem_mod_bond.new_value_dist +_chem_mod_bond.new_value_dist_esd +_chem_mod_bond.new_value_dist_nucleus +_chem_mod_bond.new_value_dist_nucleus_esd +HISprot1 delete ND1 HD1 single . . . . +HISprot1 change CB CG single 1.491 0.0100 1.491 0.0100 +HISprot1 change CG CD2 double 1.359 0.0100 1.359 0.0100 +HISprot1 change CD2 NE2 single 1.373 0.0100 1.373 0.0100 +HISprot1 change CE1 NE2 single 1.335 0.0127 1.335 0.0127 +HISprot1 change CB HB3 single 0.981 0.0100 1.092 0.0100 +HISprot1 change CB HB2 single 0.981 0.0100 1.092 0.0100 + +loop_ +_chem_mod_angle.mod_id +_chem_mod_angle.function +_chem_mod_angle.atom_id_1 +_chem_mod_angle.atom_id_2 +_chem_mod_angle.atom_id_3 +_chem_mod_angle.new_value_angle +_chem_mod_angle.new_value_angle_esd +HISprot1 delete CG ND1 HD1 . . +HISprot1 delete CE1 ND1 HD1 . . +HISprot1 change CA N H 109.786 3.00 +HISprot1 change CA N H2 109.786 3.00 +HISprot1 change CA N H3 109.786 3.00 +HISprot1 change N CA HA 108.404 1.50 +HISprot1 change CB CA HA 109.001 1.50 +HISprot1 change CA C O 117.155 2.01 +HISprot1 change CA C OXT 117.155 2.01 +HISprot1 change HB3 CB HB2 107.622 1.50 +HISprot1 change CB CG ND1 121.338 1.81 +HISprot1 change ND1 CG CD2 108.617 1.58 +HISprot1 change CG ND1 CE1 105.858 1.50 +HISprot1 change ND1 CE1 NE2 111.595 1.50 +HISprot1 change ND1 CE1 HE1 124.330 1.50 +HISprot1 change NE2 CE1 HE1 124.075 2.88 +HISprot1 change CD2 NE2 CE1 107.204 3.00 + +loop_ +_chem_mod_plane_atom.mod_id +_chem_mod_plane_atom.function +_chem_mod_plane_atom.plane_id +_chem_mod_plane_atom.atom_id +_chem_mod_plane_atom.new_dist_esd +HISprot1 delete plan-1 CB 0.020 +HISprot1 delete plan-1 CD2 0.020 +HISprot1 delete plan-1 CE1 0.020 +HISprot1 delete plan-1 CG 0.020 +HISprot1 delete plan-1 HD1 0.020 +HISprot1 delete plan-1 HD2 0.020 +HISprot1 delete plan-1 HE1 0.020 +HISprot1 delete plan-1 HE2 0.020 +HISprot1 delete plan-1 ND1 0.020 +HISprot1 delete plan-1 NE2 0.020 +HISprot1 add plan-1 CB 0.020 +HISprot1 add plan-1 CD2 0.020 +HISprot1 add plan-1 CE1 0.020 +HISprot1 add plan-1 CG 0.020 +HISprot1 add plan-1 HD2 0.020 +HISprot1 add plan-1 HE1 0.020 +HISprot1 add plan-1 HE2 0.020 +HISprot1 add plan-1 ND1 0.020 +HISprot1 add plan-1 NE2 0.020 + +data_mod_HISprot2 +loop_ +_chem_mod_atom.mod_id +_chem_mod_atom.function +_chem_mod_atom.atom_id +_chem_mod_atom.new_atom_id +_chem_mod_atom.new_type_symbol +_chem_mod_atom.new_type_energy +_chem_mod_atom.new_charge +HISprot2 delete HE2 . H H 0 +HISprot2 change ND1 . N NR15 0 +HISprot2 change NE2 . N NRD5 0 + +loop_ +_chem_mod_bond.mod_id +_chem_mod_bond.function +_chem_mod_bond.atom_id_1 +_chem_mod_bond.atom_id_2 +_chem_mod_bond.new_type +_chem_mod_bond.new_value_dist +_chem_mod_bond.new_value_dist_esd +_chem_mod_bond.new_value_dist_nucleus +_chem_mod_bond.new_value_dist_nucleus_esd +HISprot2 delete NE2 HE2 single . . . . +HISprot2 change CB CG single 1.494 0.0100 1.494 0.0100 +HISprot2 change CG CD2 double 1.356 0.0100 1.356 0.0100 +HISprot2 change ND1 CE1 single 1.346 0.0100 1.346 0.0100 +HISprot2 change CD2 NE2 single 1.380 0.0100 1.380 0.0100 +HISprot2 change CE1 NE2 double 1.308 0.0100 1.308 0.0100 +HISprot2 change CB HB3 single 0.981 0.0100 1.092 0.0100 +HISprot2 change CB HB2 single 0.981 0.0100 1.092 0.0100 +HISprot2 change ND1 HD1 single 0.919 0.0200 1.013 0.0120 +HISprot2 change CD2 HD2 single 0.929 0.0143 1.085 0.0150 + +loop_ +_chem_mod_angle.mod_id +_chem_mod_angle.function +_chem_mod_angle.atom_id_1 +_chem_mod_angle.atom_id_2 +_chem_mod_angle.atom_id_3 +_chem_mod_angle.new_value_angle +_chem_mod_angle.new_value_angle_esd +HISprot2 delete CD2 NE2 HE2 . . +HISprot2 delete CE1 NE2 HE2 . . +HISprot2 change CA N H 109.786 3.00 +HISprot2 change CA N H2 109.786 3.00 +HISprot2 change CA N H3 109.786 3.00 +HISprot2 change N CA HA 108.404 1.50 +HISprot2 change CB CA HA 109.001 1.50 +HISprot2 change CA C O 117.155 2.01 +HISprot2 change CA C OXT 117.155 2.01 +HISprot2 change HB3 CB HB2 107.622 1.50 +HISprot2 change CB CG CD2 132.429 1.50 +HISprot2 change CG ND1 CE1 107.807 1.50 +HISprot2 change CG CD2 NE2 110.147 1.50 +HISprot2 change CG CD2 HD2 124.943 1.50 +HISprot2 change ND1 CE1 NE2 111.530 1.50 +HISprot2 change ND1 CE1 HE1 123.708 1.50 +HISprot2 change NE2 CE1 HE1 124.763 3.00 +HISprot2 change CD2 NE2 CE1 105.756 3.00 + +loop_ +_chem_mod_plane_atom.mod_id +_chem_mod_plane_atom.function +_chem_mod_plane_atom.plane_id +_chem_mod_plane_atom.atom_id +_chem_mod_plane_atom.new_dist_esd +HISprot2 delete plan-1 CB 0.020 +HISprot2 delete plan-1 CD2 0.020 +HISprot2 delete plan-1 CE1 0.020 +HISprot2 delete plan-1 CG 0.020 +HISprot2 delete plan-1 HD1 0.020 +HISprot2 delete plan-1 HD2 0.020 +HISprot2 delete plan-1 HE1 0.020 +HISprot2 delete plan-1 HE2 0.020 +HISprot2 delete plan-1 ND1 0.020 +HISprot2 delete plan-1 NE2 0.020 +HISprot2 add plan-1 CB 0.020 +HISprot2 add plan-1 CD2 0.020 +HISprot2 add plan-1 CE1 0.020 +HISprot2 add plan-1 CG 0.020 +HISprot2 add plan-1 HD1 0.020 +HISprot2 add plan-1 HD2 0.020 +HISprot2 add plan-1 HE1 0.020 +HISprot2 add plan-1 ND1 0.020 +HISprot2 add plan-1 NE2 0.020 diff --git a/image_analysis/structure_refinement/monomers/metals.cif b/image_analysis/structure_refinement/monomers/metals.cif new file mode 100644 index 000000000..ef6358c3c --- /dev/null +++ b/image_analysis/structure_refinement/monomers/metals.cif @@ -0,0 +1,197 @@ +data_metal_coordination +loop_ +_metal_coordination.metal +_metal_coordination.ligand +_metal_coordination.coordination +_metal_coordination.distance +_metal_coordination.std +_metal_coordination.count +Ca O 4 2.3410 0.0508 11 +Ca O 5 2.3739 0.0757 42 +Ca O 6 2.3394 0.0530 1553 +Ca O 8 2.4677 0.0959 1383 +Ca O 10 2.6507 0.0849 20 +Ca O 11 2.2922 0.0000 1 +Ca O 12 2.3827 0.0231 12 +Ca O 13 2.4900 0.0362 9 +Ca N 4 2.3575 0.0404 16 +Ca N 5 2.3958 0.0865 27 +Ca N 6 2.4784 0.0664 88 +Ca N 8 2.5801 0.0620 140 +Ca N 9 2.2771 0.0055 2 +Ca N 12 2.5812 0.0464 4 +Ca S 8 2.9364 0.0301 64 +Cd O 4 2.2696 0.0541 1231 +Cd O 5 2.3075 0.0823 1290 +Cd O 6 2.3098 0.0733 9252 +Cd O 8 2.4498 0.1269 995 +Cd N 2 2.0928 0.0679 4 +Cd N 4 2.2704 0.0584 1034 +Cd N 5 2.3182 0.0729 978 +Cd N 6 2.3420 0.0567 7948 +Cd N 8 2.4168 0.0730 251 +Cd S 4 2.5344 0.0403 865 +Cd S 5 2.6051 0.0822 139 +Cd S 6 2.7112 0.0790 651 +Cd S 8 2.7723 0.0830 22 +Co O 2 1.8382 0.0023 4 +Co O 3 1.9027 0.0645 25 +Co O 4 1.9674 0.0748 2524 +Co O 5 2.0540 0.1288 2442 +Co O 6 2.0794 0.0873 31908 +Co O 8 2.0525 0.1404 23 +Co O 12 2.0981 0.0038 36 +Co N 2 1.8597 0.0228 19 +Co N 3 1.9920 0.0856 235 +Co N 4 1.9857 0.0829 3126 +Co N 5 2.0660 0.1097 2890 +Co N 6 2.0556 0.1079 23780 +Co N 7 1.8744 0.0681 30 +Co N 8 1.9732 0.0457 57 +Co N 9 1.9558 0.0000 1 +Co N 10 2.0748 0.0032 2 +Co N 12 1.9696 0.0309 12 +Co S 3 2.5588 0.1295 8 +Co S 4 2.2766 0.0681 327 +Co S 5 2.2863 0.1133 230 +Co S 6 2.3645 0.1482 797 +Co S 7 2.1350 0.0240 62 +Co S 8 2.2357 0.0388 110 +Co S 9 2.2874 0.0020 2 +Cu O 2 1.8209 0.0270 17 +Cu O 3 2.1634 0.2038 278 +Cu O 4 1.9484 0.0691 9401 +Cu O 5 2.0597 0.1858 18517 +Cu O 6 2.1733 0.2472 18687 +Cu N 2 1.8821 0.0563 144 +Cu N 3 1.9652 0.0713 2191 +Cu N 4 2.0018 0.0671 13836 +Cu N 5 2.0314 0.0969 20631 +Cu N 6 2.0861 0.1672 13385 +Cu N 7 2.0480 0.0464 10 +Cu S 2 2.1481 0.0143 21 +Cu S 3 2.2507 0.0481 651 +Cu S 4 2.3296 0.0931 2190 +Cu S 5 2.4463 0.2184 425 +Cu S 6 2.5901 0.2628 147 +Fe O 2 1.8469 0.0002 2 +Fe O 3 1.9645 0.1260 120 +Fe O 4 1.9111 0.0994 1017 +Fe O 5 1.9840 0.1333 1160 +Fe O 6 2.0322 0.0892 18340 +Fe O 7 2.0055 0.0302 14 +Fe O 8 2.2664 0.1337 37 +Fe N 2 1.8946 0.0223 22 +Fe N 3 1.9782 0.0914 396 +Fe N 4 1.9621 0.1558 1500 +Fe N 5 2.0733 0.1352 2715 +Fe N 6 2.0641 0.1154 22783 +Fe N 7 2.0293 0.1030 17 +Fe N 8 2.0743 0.1851 201 +Fe N 10 2.0233 0.0311 38 +Fe S 3 2.3024 0.0660 15 +Fe S 4 2.3269 0.0592 294 +Fe S 5 2.2888 0.0897 323 +Fe S 6 2.3543 0.1142 752 +Fe S 7 2.3237 0.0000 1 +Fe S 8 2.2729 0.0686 31 +Fe S 11 2.1977 0.0000 1 +K O 2 2.9059 0.5750 8 +K O 3 2.8089 0.1893 36 +K O 4 2.6188 0.0582 34 +K O 6 2.7546 0.1389 722 +K O 8 2.8184 0.0605 4680 +K O 9 2.8434 0.0817 18 +K O 10 2.8835 0.0759 87 +K O 11 2.6983 0.0465 4 +K O 12 2.8222 0.1108 16 +K O 16 2.7728 0.0428 16 +K N 3 2.8173 0.0237 3 +K N 4 2.7418 0.0241 3 +K N 6 2.8734 0.1215 408 +K N 8 2.9957 0.0534 1141 +K N 12 3.0862 0.0013 2 +K S 3 3.1901 0.0274 9 +K S 4 3.3220 0.1171 8 +K S 6 3.2685 0.0823 18 +K S 8 3.2406 0.1292 41 +Mg O 2 2.0554 0.0097 4 +Mg O 3 1.9937 0.0918 12 +Mg O 4 1.9685 0.0894 352 +Mg O 5 2.0575 0.0846 285 +Mg O 6 2.0741 0.0443 5665 +Mg O 8 2.0342 0.0034 2 +Mg O 12 2.0810 0.0003 12 +Mg N 2 2.0210 0.0000 2 +Mg N 3 2.0244 0.0434 50 +Mg N 4 2.0668 0.0526 431 +Mg N 5 2.1362 0.0752 213 +Mg N 6 2.1893 0.0689 532 +Mg N 7 2.0256 0.0253 12 +Mg S 4 2.4449 0.0066 4 +Mg S 6 2.6233 0.0847 18 +Mn O 3 2.1300 0.0000 1 +Mn O 4 1.9886 0.1364 712 +Mn O 5 2.0454 0.1325 2352 +Mn O 6 2.1235 0.1389 24192 +Mn O 8 2.3379 0.1153 187 +Mn N 2 1.9518 0.0006 2 +Mn N 3 2.1064 0.0836 30 +Mn N 4 2.1247 0.0998 452 +Mn N 5 2.1128 0.1560 1294 +Mn N 6 2.1915 0.1254 12485 +Mn N 7 2.0334 0.0117 8 +Mn N 8 2.1638 0.2290 63 +Mn S 4 2.4160 0.0516 82 +Mn S 5 2.3974 0.1473 65 +Mn S 6 2.5308 0.1543 759 +Mn S 8 2.7530 0.4496 4 +Na O 2 2.7451 0.2229 9 +Na O 3 2.5148 0.2189 356 +Na O 4 2.3601 0.1126 936 +Na O 5 2.3785 0.0889 1964 +Na O 6 2.4167 0.0890 10682 +Na O 8 2.5803 0.1583 1174 +Na O 11 2.4729 0.0682 11 +Na O 12 2.4485 0.0245 12 +Na O 16 2.4544 0.0868 64 +Na N 3 2.3817 0.0468 19 +Na N 4 2.4397 0.0763 110 +Na N 5 2.4662 0.0916 162 +Na N 6 2.5158 0.0858 535 +Na N 8 2.6107 0.1369 108 +Na S 3 3.0905 0.0704 9 +Na S 4 2.8085 0.0742 22 +Na S 5 2.9437 0.0994 24 +Na S 6 2.9463 0.0887 217 +Na S 8 3.0014 0.0301 8 +Ni O 2 1.7925 0.0333 3 +Ni O 3 2.0494 0.0771 147 +Ni O 4 1.8650 0.0474 1934 +Ni O 5 2.0181 0.1088 684 +Ni O 6 2.0680 0.0569 22549 +Ni N 2 1.8330 0.1294 18 +Ni N 3 1.9148 0.0996 263 +Ni N 4 1.9086 0.0578 7110 +Ni N 5 2.0509 0.0767 1323 +Ni N 6 2.0921 0.0531 18876 +Ni N 7 1.8852 0.1013 24 +Ni S 3 2.1662 0.0390 33 +Ni S 4 2.1727 0.0306 4582 +Ni S 5 2.2907 0.0973 198 +Ni S 6 2.4548 0.0691 1081 +Ni S 7 2.1761 0.0533 15 +Zn O 2 2.1082 0.0000 1 +Zn O 3 2.0096 0.0923 171 +Zn O 4 1.9578 0.0451 15632 +Zn O 5 2.0414 0.0799 10506 +Zn O 6 2.1095 0.0766 13008 +Zn N 2 1.8575 0.0462 21 +Zn N 3 2.0281 0.0767 383 +Zn N 4 2.0304 0.0529 10112 +Zn N 5 2.1003 0.0802 7734 +Zn N 6 2.1602 0.0689 6819 +Zn S 3 2.4083 0.0793 16 +Zn S 4 2.3391 0.0545 1189 +Zn S 5 2.4363 0.1220 308 +Zn S 6 2.5526 0.0669 103 diff --git a/image_analysis/structure_refinement/monomers/update_monomers.py b/image_analysis/structure_refinement/monomers/update_monomers.py new file mode 100644 index 000000000..dfd8a3a04 --- /dev/null +++ b/image_analysis/structure_refinement/monomers/update_monomers.py @@ -0,0 +1,133 @@ +#!/usr/bin/env python3 +# SPDX-FileCopyrightText: 2026 Filip Leonarski, Paul Scherrer Institute +# SPDX-License-Identifier: GPL-3.0-only +"""Copy the subset of the CCP4 Monomer Library (https://github.com/MonomerLibrary/monomers, LGPL-3.0) +that rugnux's restrained refinement carries in its binary into this directory. + + update_monomers.py /path/to/monomers + +COMPOUNDS below is THE list: a compound named there is restrained by the refinement, everything else +is held fixed. To add one, add its code and run this again; CMake embeds every .cif of this directory +(MonomerLibrary.cpp), so nothing else needs to change. + +The compound files are copied verbatim. links_and_mods.cif is cut down to the links and modifications +that can apply to these compounds (the polymer links, the termini, the disulfide, ...), and ener_lib.cif +to its atom-type table (_lib_atom: the van der Waals and ion radii and the hydrogen-bond types). +metals.json, the library's statistics of metal-ligand distances, becomes metals.cif: for each metal ion of +COMPOUNDS and each donor element of METAL_LIGANDS, the distance per coordination number (the restraints of +metal sites the links of links_and_mods.cif do not describe). +Requires the gemmi Python module.""" + +import json +import os +import shutil +import sys + +import gemmi + +AMINO_ACIDS = ["ALA", "ARG", "ASN", "ASP", "CYS", "GLN", "GLU", "GLY", "HIS", "ILE", + "LEU", "LYS", "MET", "PHE", "PRO", "SER", "THR", "TRP", "TYR", "VAL", "MSE"] +NUCLEOTIDES = ["DA", "DC", "DG", "DT", "A", "C", "G", "U"] +# The modified nucleotides of tRNA and rRNA most often met, polymer residues joined by the same backbone link. +MODIFIED_NUCLEOTIDES = ["PSU", "5MC", "1MA", "OMG", "OMC", "OMU", "H2U", "M2G", "7MG", "2MG", "5MU"] +NUCLEOTIDE_LIGANDS = ["ATP", "ADP", "AMP", "GTP", "GDP", "GMP"] +# The cofactors most often met, and the oxygen a heme iron binds. (Not carbon monoxide: CMO.cif has C-O at 1.25 A, +# where bound CO is near 1.15 A.) +COFACTORS = ["NAD", "NAI", "NAP", "NDP", "FAD", "FMN", "HEM", "HEC", "SAM", "SAH", "OXY"] +ADDITIVES = ["DMS", "PEG", "PGE", "PG4", "1PE", "GOL", "EDO", "SO4", "PO4", "ACT", "MPD"] +WATER_AND_IONS = ["HOH", "NA", "K", "MG", "CA", "ZN", "MN", "FE", "FE2", "NI", "CU", "CO", "CD", + "CL", "BR", "IOD"] +COMPOUNDS = (AMINO_ACIDS + NUCLEOTIDES + MODIFIED_NUCLEOTIDES + NUCLEOTIDE_LIGANDS + COFACTORS + ADDITIVES + + WATER_AND_IONS) +# The donor elements of metal sites whose distances metals.cif carries. +METAL_LIGANDS = ["O", "N", "S"] + +# Groups of the polymers above; links and modifications of other groups (sugars) are left out. +GROUPS = {".", "peptide", "P-peptide", "M-peptide", "DNA/RNA", "NON-POLYMER"} + + +def compound_path(lib, code): + return os.path.join(lib, code[0].lower(), code + ".cif") + + +def applies(comp, group): + return (comp == "." or comp in COMPOUNDS) and group in GROUPS + + +def trim_links_and_mods(lib, out): + doc = gemmi.cif.read(os.path.join(lib, "links_and_mods.cif")) + links = doc.find_block("link_list").find("_chem_link.", ["id", "comp_id_1", "mod_id_1", "group_comp_1", + "comp_id_2", "mod_id_2", "group_comp_2", "name"]) + mods = doc.find_block("mod_list").find("_chem_mod.", ["id", "name", "comp_id", "group_id"]) + keep_links = [list(r) for r in links if applies(r[1], r[3]) and applies(r[4], r[6])] + keep_mods = [list(r) for r in mods if applies(r[2], r[3])] + keep = {"link_" + r[0] for r in keep_links} | {"mod_" + r[0] for r in keep_mods} + + new = gemmi.cif.Document() + for name, tag, rows in (("link_list", "_chem_link.", keep_links), ("mod_list", "_chem_mod.", keep_mods)): + block = new.add_new_block(name) + old = doc.find_block(name).find_loop_item(tag + "id").loop + loop = block.init_loop(tag, [t[len(tag):] for t in old.tags]) + for r in rows: + loop.add_row(r) + for block in doc: + if block.name in keep: + new.add_copied_block(block) + new.write_file(out) + return len(keep_links), len(keep_mods) + + +def trim_ener_lib(lib, out): + doc = gemmi.cif.read(os.path.join(lib, "ener_lib.cif")) + atoms = doc[0].find_loop_item("_lib_atom.type").loop + new = gemmi.cif.Document() + block = new.add_new_block(doc[0].name) + loop = block.init_loop("_lib_atom.", [t[len("_lib_atom."):] for t in atoms.tags]) + for i in range(atoms.length()): + loop.add_row([atoms[i, j] for j in range(atoms.width())]) + new.write_file(out) + + +def trim_metals(lib, out): + """metals.json -> metals.cif: one row per metal ion of COMPOUNDS, ligand element and coordination number, + with the mean distance, its standard deviation and the number of sites behind it.""" + with open(os.path.join(lib, "metals.json")) as f: + table = json.load(f)["metal_coordination"] + metals = set() + for code in WATER_AND_IONS: + for atom in gemmi.make_chemcomp_from_block(gemmi.cif.read(compound_path(lib, code))[-1]).atoms: + if atom.el.is_metal: + metals.add(atom.el.name) + new = gemmi.cif.Document() + block = new.add_new_block("metal_coordination") + loop = block.init_loop("_metal_coordination.", ["metal", "ligand", "coordination", "distance", "std", "count"]) + n = 0 + for metal in sorted(metals): + for ligand in METAL_LIGANDS: + for row in table.get(metal, {}).get(ligand, []): + loop.add_row([metal, ligand, str(row["coord"]), "%.4f" % row["mean"], "%.4f" % row["std"], + str(row["count"])]) + n += 1 + new.write_file(out) + return n + + +def main(): + if len(sys.argv) != 2: + sys.exit(__doc__) + lib = sys.argv[1] + here = os.path.dirname(os.path.abspath(__file__)) + for f in os.listdir(here): + if f.endswith(".cif"): + os.remove(os.path.join(here, f)) + for code in COMPOUNDS: + shutil.copyfile(compound_path(lib, code), os.path.join(here, code + ".cif")) + n_links, n_mods = trim_links_and_mods(lib, os.path.join(here, "links_and_mods.cif")) + trim_ener_lib(lib, os.path.join(here, "ener_lib.cif")) + n_metal_rows = trim_metals(lib, os.path.join(here, "metals.cif")) + shutil.copyfile(os.path.join(lib, "COPYING"), os.path.join(here, "COPYING")) + print(f"{len(COMPOUNDS)} compounds, {n_links} links, {n_mods} modifications, {n_metal_rows} metal distances") + + +if __name__ == "__main__": + main() diff --git a/licenses/COLLECT.sh b/licenses/COLLECT.sh index 772ff0748..014dcfa5d 100644 --- a/licenses/COLLECT.sh +++ b/licenses/COLLECT.sh @@ -48,7 +48,6 @@ copy_license libtiff.txt "$(find_dep tiff-src/LICENSE.md)" copy_license fftw.txt "$(find_dep fftw-src/COPYING)" copy_license ceres-solver.txt "$(find_dep ceres-src/LICENSE)" copy_license abseil.txt "$(find_dep ceres-src/third_party/abseil-cpp/LICENSE)" -copy_license fast-feedback-indexer.txt "$(find_dep fast-indexer-src/LICENSE.md)" copy_license eigen.txt "$(find_dep eigen3-src/COPYING.MPL2)" copy_license eigen-README.txt "$(find_dep eigen3-src/COPYING.README)" copy_license zlib.txt "$(find_dep zlib-src/LICENSE.md)" @@ -75,6 +74,8 @@ copy_license bitshuffle-hperf.txt compression/bitshuffle_hperf/LICENSE-APACHE copy_license lz4.txt compression/lz4/LICENSE copy_license xilinx-hls-headers.txt fpga/include/LICENSE.HLS_Headers copy_license gemmi.txt gemmi_gph/LICENSE.txt +copy_license fast-feedback-indexer.txt image_analysis/indexing/fast-feedback-indexer/LICENSE.md +copy_license ccp4-monomer-library.txt image_analysis/structure_refinement/monomers/COPYING # GEMMI bundles six third-party headers under its own include tree, each under its own licence # (see THIRD_PARTY_NOTICES.md). Only PEGTL ships a LICENSE file; sajson, fast_float, half, pocketfft # and tinydir carry their terms in a comment at the top of the header, so licenses/sajson.txt, diff --git a/licenses/ccp4-monomer-library.txt b/licenses/ccp4-monomer-library.txt new file mode 100644 index 000000000..3f7b8b1e5 --- /dev/null +++ b/licenses/ccp4-monomer-library.txt @@ -0,0 +1,166 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. + diff --git a/reader/HDF5MetadataSource.cpp b/reader/HDF5MetadataSource.cpp index 8b2299cee..d53bee837 100644 --- a/reader/HDF5MetadataSource.cpp +++ b/reader/HDF5MetadataSource.cpp @@ -944,6 +944,8 @@ HDF5MetadataSource::OpenResult HDF5MetadataSource::Open(const std::string &filen .beta = tmp[4], .gamma = tmp[5] }); + if (const auto e = master_file->ReadOptVector("/entry/sample/unit_cell_esd"); e.size() == 6) + dataset->unit_cell_esd = UnitCell{.a = e[0], .b = e[1], .c = e[2], .alpha = e[3], .beta = e[4], .gamma = e[5]}; // The name carries the setting, the number cannot ("R 3:R" reads back as "R 3:H"), so the // name is preferred; the number is the fallback for a file written before it was recorded. if (const auto *sg = gemmi::find_spacegroup_by_name(master_file->GetString("/entry/sample/space_group"))) @@ -957,6 +959,18 @@ HDF5MetadataSource::OpenResult HDF5MetadataSource::Open(const std::string &filen if (const auto m = master_file->ReadOptVector("/entry/MX/reindexMatrix"); m.size() == 9) dataset->reindex_matrix = std::array{m[0], m[1], m[2], m[3], m[4], m[5], m[6], m[7], m[8]}; + if (const auto f = master_file->ReadOptVector("/entry/MX/stillsRockingWidthFormula"); f.size() == 3) { + StillsRunWidth w{.gamma0 = f[0], .gamma_e = f[1], .bandwidth_sigma = f[2]}; + if (const auto r = master_file->ReadOptVector("/entry/MX/stillsRadialScale"); r.size() == 1) + w.radial_scale = r[0]; + w.table_dstar = master_file->ReadOptVector("/entry/MX/stillsRockingWidthTableDstar"); + w.table_s = master_file->ReadOptVector("/entry/MX/stillsRockingWidthTable"); + if (w.table_dstar.size() != w.table_s.size()) { + w.table_dstar.clear(); + w.table_s.clear(); + } + dataset->stills_run_width = w; + } dataset->experiment.SampleName(master_file->GetString("/entry/sample/name")); diff --git a/reader/JFJochReaderDataset.h b/reader/JFJochReaderDataset.h index 9d82b2b5a..53c898d33 100644 --- a/reader/JFJochReaderDataset.h +++ b/reader/JFJochReaderDataset.h @@ -12,6 +12,7 @@ #include "../common/DiffractionGeometry.h" #include "../common/DiffractionExperiment.h" +#include "../common/StillsRunWidth.h" #include "../common/PixelMask.h" #include "../common/AzimuthalIntegrationMapping.h" @@ -41,6 +42,11 @@ struct JFJochReaderDataset { // /entry/MX/reindexMatrix; the reader applies it, so everything this class hands out is already in // the cell's setting. std::optional> reindex_matrix; + // The e.s.d.s of the experiment's unit cell, a b c alpha beta gamma (/entry/sample/unit_cell_esd); empty + // where the file has none. + std::optional unit_cell_esd; + // Stills: the rocking curve the run's partialities were computed from (/entry/MX/stillsRockingWidth*). + std::optional stills_run_width; std::vector az_int_bin_to_q; std::vector az_int_bin_to_phi; diff --git a/receiver/JFJochReceiver.cpp b/receiver/JFJochReceiver.cpp index 516f48900..8ecc77425 100644 --- a/receiver/JFJochReceiver.cpp +++ b/receiver/JFJochReceiver.cpp @@ -210,6 +210,9 @@ void JFJochReceiver::SendEndMessage() { message.merged.reset(); message.map_coefficients.reset(); message.placed_model.reset(); + message.refined_model.reset(); + message.refined_map_coefficients.reset(); + message.blobs.reset(); if (zmq_metadata_socket != nullptr) zmq_metadata_socket->EndDataCollection(message); diff --git a/receiver/JFJochReceiverRugnux.cpp b/receiver/JFJochReceiverRugnux.cpp index 955cd1820..08cab131f 100644 --- a/receiver/JFJochReceiverRugnux.cpp +++ b/receiver/JFJochReceiverRugnux.cpp @@ -96,6 +96,90 @@ namespace { } } +namespace { + // A score the status carries only where it is a number: JSON has no NaN or infinity (nlohmann writes null) + void SetIfFinite(std::optional &out, double v) { + if (std::isfinite(v)) + out = v; + } +} + +std::optional LiveModel(const ProcessResult &result) { + if (!result.model_validation && !result.model_prior) + return std::nullopt; + RugnuxLiveModel m; + m.placement = result.model_placement; + if (result.model_prior) { + const MolecularReplacementResult &mr = *result.model_prior; + m.model_name = mr.model_name; + m.predicted = mr.predicted_model; + m.mr_decision = mr.decision; + if (!mr.ok) + m.reason = mr.failure_reason; + if (mr.chosen >= 0) { + const MRCandidate &c = mr.candidates[mr.chosen]; + m.mr_space_group = c.space_group.xhm(); + m.copies = c.copies; + SetIfFinite(m.tf_z, c.tf_z); + SetIfFinite(m.rf_z, c.rf_z); + SetIfFinite(m.llg_z, c.llg_z); + SetIfFinite(m.fit_sigma, c.null_sigma); + SetIfFinite(m.mr_d_min, mr.d_min_search); + } + } + if (result.model_validation) { + const ModelValidationResult &v = *result.model_validation; + if (!v.model_name.empty()) + m.model_name = v.model_name; + if (!v.ok) { + if (m.reason.empty()) + m.reason = v.failure_reason; + } else { + SetIfFinite(m.r_work, v.r_work); + SetIfFinite(m.r_free, v.r_free); + SetIfFinite(m.cc_model, v.cc_model_overall); + if (v.fit_tested) + SetIfFinite(m.fit_sigma, v.r_work_sigma); + SetIfFinite(m.map_atom_sigma, v.mean_atom_density_sigma); + if (v.rigid_body_applied) { + SetIfFinite(m.rigid_body_angle_deg, v.rigid_body_angle_deg); + SetIfFinite(m.rigid_body_shift_A, v.rigid_body_shift_A); + } + if (!v.anomalous_sites.empty()) { + m.anomalous_site = v.anomalous_sites.front().label; + SetIfFinite(m.anomalous_site_sigma, v.anomalous_sites.front().sigma); + } + } + } + if (result.refinement) { + const RefinementResult &rf = *result.refinement; + RugnuxLiveRefinement r; + r.performed = rf.ok; + r.cancelled = rf.cancelled; + r.reason = rf.failure_reason; + r.on_gpu = rf.on_gpu; + r.seconds = rf.seconds; + if (rf.ok) { + SetIfFinite(r.r_work, rf.restrained ? rf.r_work : rf.r_work_placement); + SetIfFinite(r.r_free, rf.restrained ? rf.r_free : rf.r_free_placement); + if (rf.restrained) { + SetIfFinite(r.rmsd_bonds_A, rf.geometry.rmsd_bonds); + SetIfFinite(r.rmsd_angles_deg, rf.geometry.rmsd_angles); + } + } + r.blob_count = static_cast(rf.blobs.size()); + for (size_t i = 0; i < std::min(rf.blobs.size(), RugnuxLiveRefinement::MAX_BLOBS); i++) { + const DensityBlob &b = rf.blobs[i]; + RugnuxLiveBlob blob{DensityBlobKindName(b.kind), b.centroid.x, b.centroid.y, b.centroid.z, b.peak_sigma, + b.volume, b.nearest_atom, std::nullopt}; + SetIfFinite(blob.nearest_atom_distance_A, b.nearest_atom_distance); // infinite: no atom near + r.blobs.push_back(blob); + } + m.refinement = std::move(r); + } + return m; +} + JFJochReceiverRugnux::JFJochReceiverRugnux(const DiffractionExperiment &in_experiment, const PixelMask &in_pixel_mask, ImagePuller &in_image_puller, @@ -159,7 +243,7 @@ JFJochReceiverRugnux::~JFJochReceiverRugnux() { } void JFJochReceiverRugnux::MeasurementThread() { - std::future rugnux_done, probe_done; + std::future rugnux_done, rugnux_out, probe_done; try { // Waiting for the start message, as JFJochReceiverLite::MeasurementThread. std::optional give_up_at; @@ -201,7 +285,7 @@ void JFJochReceiverRugnux::MeasurementThread() { logger.Error("{}", skipped_warning); live_status.Finish(RugnuxLiveState::Skipped, "the image buffer cannot hold the whole collection"); } else - StartRugnux(rugnux_done, probe_done); + StartRugnux(rugnux_done, rugnux_out, probe_done); measurement_started.count_down(); } catch (const JFJochException &e) { logger.ErrorException(e); @@ -226,12 +310,12 @@ void JFJochReceiverRugnux::MeasurementThread() { logger.Info("Receiving finished, {} images", images_collected.load()); std::optional done_s; - if (rugnux_done.valid()) { + if (rugnux_out.valid()) { // The fixed cutoff: the analysis gets deadline_s after the last image, then gives what it has. - if (deadline_s > 0 && rugnux_done.wait_for(std::chrono::duration(deadline_s)) + if (deadline_s > 0 && rugnux_out.wait_for(std::chrono::duration(deadline_s)) == std::future_status::timeout) Cut("deadline"); - rugnux_done.wait(); + rugnux_out.wait(); if (last_image) done_s = SecondsSince(last_image.value()); } @@ -251,7 +335,7 @@ void JFJochReceiverRugnux::MeasurementThread() { } if (push_images_to_writer) writer_error = image_pusher.Finalize(); - if (rugnux_done.valid()) { + if (rugnux_out.valid()) { // The run's outcome, in one line: its results are in the live status, the end message and the files. const auto live = live_status.Get(); std::string outcome = "rugnux live: " + StateName(live.state); @@ -272,13 +356,17 @@ void JFJochReceiverRugnux::MeasurementThread() { } logger.Info("{}", outcome); } + // The run's teardown, which went on beside the end message and the writer. + if (rugnux_done.valid()) + rugnux_done.wait(); end_time = std::chrono::system_clock::now(); current_status.SetProgress({}); current_status.SetStatus(GetStatus()); } -void JFJochReceiverRugnux::StartRugnux(std::future &rugnux_done, std::future &probe_done) { +void JFJochReceiverRugnux::StartRugnux(std::future &rugnux_done, std::future &rugnux_out, + std::future &probe_done) { // A failure here costs the analysis only: the images go on to the writer as they would without it. try { // The start message as the writer gets it, so rugnux sees the dataset an HDF5 master states. @@ -286,6 +374,7 @@ void JFJochReceiverRugnux::StartRugnux(std::future &rugnux_done, std::futu image_buffer.GetStartMessage(start_cbor); reader.Open(CBORStream2Deserialize(start_cbor)->start_message.value()); rugnux_done = std::async(std::launch::async, &JFJochReceiverRugnux::RugnuxThread, this); + rugnux_out = rugnux_published.get_future(); probe_done = std::async(std::launch::async, &JFJochReceiverRugnux::ProbeThread, this); } catch (const std::exception &e) { logger.Error("rugnux live: cannot start - {}", e.what()); @@ -294,6 +383,7 @@ void JFJochReceiverRugnux::StartRugnux(std::future &rugnux_done, std::futu } void JFJochReceiverRugnux::RugnuxThread() { + bool published = false; try { const auto dataset = reader.GetDataset(); RugnuxLiveSetup setup = MakeRugnuxLiveSetup(*dataset, rugnux_nthreads, model); @@ -313,12 +403,13 @@ void JFJochReceiverRugnux::RugnuxThread() { } }); LiveObserver observer(plots, scan_result, *az_int_mapping, live_status); - ProcessResult result; - { - Rugnux process(reader, setup.experiment, *dataset->pixel_mask, setup.config); - Reachable reachable(rugnux_m, rugnux, process, cut, cancelled); - result = process.Run(&observer); - } + // The run goes - with the pinned buffers its engines kept - once its results are out (below), beside + // the end message, which reads only the result: a value of its own, no part of the run. + std::optional process; + process.emplace(reader, setup.experiment, *dataset->pixel_mask, setup.config); + std::optional reachable; + reachable.emplace(rugnux_m, rugnux, *process, cut, cancelled); + ProcessResult result = process->Run(&observer); // The verdict and summary of the report a `rugnux` run writes, without writing it. const ReportDocument doc = BuildReportDocument(experiment.GetFilePrefix(), experiment.GetFilePrefix(), setup.experiment, result); @@ -326,24 +417,55 @@ void JFJochReceiverRugnux::RugnuxThread() { for (const auto &w: doc.warnings) if (!w.developer_only) warnings.push_back(w.text); - live_status.Result(doc.verdict, doc.verdict_text, doc.summary_rows, warnings); - // The placed model and a copy of its map coefficients (the end message takes the originals), for - // the broker's viewer routes. + const double cc_anom = result.merge_statistics.overall.cc_anom; + live_status.Result(doc.verdict, doc.verdict_text, doc.summary_rows, warnings, + std::isfinite(cc_anom) && cc_anom > CC_ANOM_SIGNAL); + if (const auto m = LiveModel(result)) + live_status.Model(*m); + // The numbers the summary's Space group, Resolution and Signal rows give + std::optional d_min, isa; + if (result.has_merge_statistics) + SetIfFinite(d_min, result.merge_statistics.overall.d_min); + if (result.error_model_isa_resolved && result.error_model_isa > 0.0) + isa = result.error_model_isa; + live_status.Headline(result.space_group ? result.space_group->xhm() : "", d_min, isa); + // The placed model and a copy of its map coefficients (the end message takes the originals), and the + // refined model with its own, for the broker's viewer routes. if (result.outputs && result.outputs->placed_model) { - const PlacedModelOutput &p = *result.outputs->placed_model; + const RugnuxOutputs &o = *result.outputs; + const PlacedModelOutput &p = *o.placed_model; std::optional coefficients; - if (result.outputs->maps) - coefficients = result.outputs->maps->coefficients; + if (o.maps) + coefficients = o.maps->coefficients; + std::shared_ptr refined; + if (o.refined_model) { + std::optional refined_coefficients; + if (o.refined_maps) + refined_coefficients = o.refined_maps->coefficients; + refined = std::make_shared(o.refined_model->model, o.refined_model->cell, + o.refined_model->space_group, + std::move(refined_coefficients)); + } live_status.Structure(std::make_shared(p.model, p.cell, p.space_group, - std::move(coefficients))); + std::move(coefficients)), + std::move(refined)); } live_status.Finish(result.cancelled ? RugnuxLiveState::Cancelled : RugnuxLiveState::Done); - std::unique_lock ul(rugnux_m); - rugnux_result = std::move(result); + reachable.reset(); + { + std::unique_lock ul(rugnux_m); + rugnux_result = std::move(result); + } + published = true; + rugnux_published.set_value(); + process.reset(); + Rugnux::ReleasePinnedPool(); } catch (const std::exception &e) { logger.Error("rugnux live: {}", e.what()); live_status.Finish(RugnuxLiveState::Failed, e.what()); } + if (!published) + rugnux_published.set_value(); } void JFJochReceiverRugnux::ProbeThread() { @@ -409,6 +531,7 @@ void JFJochReceiverRugnux::AddToEndMessage(EndMessage &message) { message.rotation_lattice_type = r.rotation_lattice_type; message.rotation_extra_lattices = r.rotation_extra_lattices; message.unit_cell = r.unit_cell; + message.unit_cell_esd = r.unit_cell_esd; message.space_group_name = r.space_group_name; message.space_group_number = r.space_group_number; message.reindex_matrix = r.reindex_matrix; @@ -430,6 +553,14 @@ void JFJochReceiverRugnux::AddToEndMessage(EndMessage &message) { if (o.placed_model) message.placed_model = PlacedModelFromStructure(*o.placed_model->model, o.placed_model->cell, o.placed_model->space_group.xhm()); + // And the refinement's, as the CLI writes them (_refined_model.cif, _refined_maps.mtz, _blobs.json). + if (o.refined_model) + message.refined_model = PlacedModelFromStructure(*o.refined_model->model, o.refined_model->cell, + o.refined_model->space_group.xhm()); + if (o.refined_maps) + message.refined_map_coefficients = std::move(o.refined_maps->coefficients); + if (o.blobs) + message.blobs = DensityBlobsToMessage(*o.blobs); // Every pusher serialises END into a buffer of MESSAGE_SIZE_FOR_START_END, and an END that does // not fit there fails the collection. So it is serialised here first, into a buffer of the same @@ -440,7 +571,7 @@ void JFJochReceiverRugnux::AddToEndMessage(EndMessage &message) { try { serializer.SerializeSequenceEnd(message); } catch (const JFJochException &e) { - const std::string text = fmt::format("the merged data, map coefficients and placed model do not " + const std::string text = fmt::format("the merged data, map coefficients and models do not " "fit in the end message ({} MiB) and are not written", MESSAGE_SIZE_FOR_START_END / (1024 * 1024)); logger.Error("rugnux live: {} - {}", text, e.what()); @@ -448,12 +579,18 @@ void JFJochReceiverRugnux::AddToEndMessage(EndMessage &message) { message.merged.reset(); message.map_coefficients.reset(); message.placed_model.reset(); + message.refined_model.reset(); + message.refined_map_coefficients.reset(); + message.blobs.reset(); } } catch (const std::exception &e) { logger.Error("rugnux live: the end message goes without the analysis results - {}", e.what()); message.merged.reset(); message.map_coefficients.reset(); message.placed_model.reset(); + message.refined_model.reset(); + message.refined_map_coefficients.reset(); + message.blobs.reset(); } } diff --git a/receiver/JFJochReceiverRugnux.h b/receiver/JFJochReceiverRugnux.h index ee795c049..dabd7f6e5 100644 --- a/receiver/JFJochReceiverRugnux.h +++ b/receiver/JFJochReceiverRugnux.h @@ -12,6 +12,9 @@ #include "../rugnux/Rugnux.h" #include "RugnuxLiveStatus.h" +// What the run made of the model it was given, for the live status; none where no model was given. +std::optional LiveModel(const ProcessResult &result); + // A DECTRIS rotation collection forwarded to the writer as JFJochReceiverLite does, but analysed by // rugnux while it arrives instead of image by image: the forward threads put each image into the // image buffer and send it on, and one rugnux thread reads the collection back from that buffer. The @@ -44,13 +47,15 @@ class JFJochReceiverRugnux : public JFJochReceiver { Rugnux *rugnux = nullptr; // while it runs, for Cut Rugnux *probe = nullptr; // the same for the lattice probe std::optional rugnux_result; + std::promise rugnux_published; // rugnux_result is in place, or the run has failed (RugnuxThread) bool cut = false; std::atomic images_done{false}; // the forward threads have ended void MeasurementThread(); // Opens the reader on the collection and starts the rugnux and probe threads; a failure is the - // analysis's alone (live status Failed), never the collection's. - void StartRugnux(std::future &rugnux_done, std::future &probe_done); + // analysis's alone (live status Failed), never the collection's. rugnux_out is ready once the run's + // result is in place, rugnux_done once the run is gone as well. + void StartRugnux(std::future &rugnux_done, std::future &rugnux_out, std::future &probe_done); void ForwardThread(uint32_t id); void RugnuxThread(); void ProbeThread(); diff --git a/receiver/RugnuxLiveStatus.cpp b/receiver/RugnuxLiveStatus.cpp index f8341653e..f0467352c 100644 --- a/receiver/RugnuxLiveStatus.cpp +++ b/receiver/RugnuxLiveStatus.cpp @@ -69,12 +69,26 @@ void RugnuxLiveStatus::Finish(RugnuxLiveState state, const std::string &message) void RugnuxLiveStatus::Result(const std::string &verdict, const std::string &verdict_text, const std::vector> &summary, - const std::vector &warnings) { + const std::vector &warnings, bool anomalous_signal) { std::unique_lock ul(m); s.verdict = verdict; s.verdict_text = verdict_text; s.summary = summary; s.warnings = warnings; + s.anomalous_signal = anomalous_signal; +} + +void RugnuxLiveStatus::Model(const RugnuxLiveModel &model) { + std::unique_lock ul(m); + s.model = model; +} + +void RugnuxLiveStatus::Headline(const std::string &space_group, std::optional d_min, + std::optional isa) { + std::unique_lock ul(m); + s.space_group = space_group; + s.d_min = d_min; + s.isa = isa; } void RugnuxLiveStatus::Latency(double last_image_to_written_s) { @@ -106,9 +120,11 @@ void RugnuxLiveStatus::Warning(const std::string &text) { s.warnings.push_back(text); } -void RugnuxLiveStatus::Structure(std::shared_ptr structure) { +void RugnuxLiveStatus::Structure(std::shared_ptr structure, + std::shared_ptr refined_structure) { std::unique_lock ul(m); s.structure = std::move(structure); + s.refined_structure = std::move(refined_structure); } void RugnuxLiveStatus::Clear() { diff --git a/receiver/RugnuxLiveStatus.h b/receiver/RugnuxLiveStatus.h index 5d3b0b9af..01e76643a 100644 --- a/receiver/RugnuxLiveStatus.h +++ b/receiver/RugnuxLiveStatus.h @@ -30,6 +30,58 @@ struct RugnuxLiveStep { std::vector notes; }; +// A blob of the refined model's mFo-DFc map it leaves unexplained (DensityBlob), with its likely reading. +struct RugnuxLiveBlob { + std::string kind; // DensityBlobKindName: WATER | ION | LIGAND | MODEL_ERROR | UNASSIGNED + double x = 0, y = 0, z = 0; // the centroid, A, in the refined model's frame + double peak_sigma = 0; + double volume_A3 = 0; + std::string nearest_atom; + std::optional nearest_atom_distance_A; // unset where no atom is within reach +}; + +// The placed model refined (ProcessResult::refinement), in the numbers of the report's REFINE_ keys. +struct RugnuxLiveRefinement { + // The strongest blobs the status lists; blob_count says how many there are + static constexpr size_t MAX_BLOBS = 50; + bool performed = false; + bool cancelled = false; // cut short by the deadline or a cancel: the trials that ran + std::string reason; // why it did not run to the end + bool on_gpu = false; + double seconds = 0; + // After the restrained stage, else after the rigid body and grouped B + std::optional r_work, r_free; + std::optional rmsd_bonds_A, rmsd_angles_deg; // where the restrained stage ran + int64_t blob_count = 0; + std::vector blobs; // strongest first +}; + +// What the run made of the model it was given (ProcessResult::model_validation and ::model_prior), in the +// numbers the report's MODEL VALIDATION section gives. Unset values were not computed: the model was not +// placed, or the placement was not by molecular replacement. +struct RugnuxLiveModel { + std::string placement; // RIGID_BODY | MR | NOT_PLACED + std::string model_name; + bool predicted = false; // searched as a predicted model + std::string reason; // why it was not placed or not validated + // The placed model against the merge, with nothing refined: coordinates and B factors as given + std::optional r_work, r_free; + std::optional cc_model; // CC(model, data) of the intensities, all reflections + std::optional fit_sigma; // R-work above its random-orientation null, in sd + std::optional map_atom_sigma; // mean 2mFo-DFc at the atom centres, in sigma + std::optional rigid_body_angle_deg, rigid_body_shift_A; + // Molecular replacement's choice + std::string mr_decision; + std::string mr_space_group; + std::optional copies; + std::optional tf_z, rf_z, llg_z; + std::optional mr_d_min; // the search's high-resolution limit + // The strongest peak of the anomalous difference map at the model's atoms + std::string anomalous_site; + std::optional anomalous_site_sigma; + std::optional refinement; +}; + struct RugnuxLiveSnapshot { RugnuxLiveState state = RugnuxLiveState::Idle; std::string message; // why it failed or was skipped @@ -54,8 +106,16 @@ struct RugnuxLiveSnapshot { std::string verdict_text; std::vector> summary; std::vector warnings; - // The placed model and its maps, once the run has placed one; for the viewer routes. + bool anomalous_signal = false; // the summary's "Anomalous" row says the data carry usable signal + std::optional model; // where a model was given + // The headline numbers of the result, once the run is over + std::string space_group; + std::optional d_min; // of the merge + std::optional isa; // where the error model determined it + // The placed model and its maps, once the run has placed one, and the refined model and its maps, once the + // run has refined it; for the viewer routes. std::shared_ptr structure; + std::shared_ptr refined_structure; }; class RugnuxLiveStatus { @@ -79,14 +139,17 @@ public: void Finish(RugnuxLiveState state, const std::string &message = ""); void Result(const std::string &verdict, const std::string &verdict_text, const std::vector> &summary, - const std::vector &warnings); + const std::vector &warnings, bool anomalous_signal = false); + void Model(const RugnuxLiveModel &model); + void Headline(const std::string &space_group, std::optional d_min, std::optional isa); void Latency(double last_image_to_written_s); // The collection is over: last_image_s is set, and the last image's time is returned (none if no image came). std::optional LastImage(); void Cut(const std::string &reason); void Probe(const std::string &text); void Warning(const std::string &text); - void Structure(std::shared_ptr structure); + void Structure(std::shared_ptr structure, + std::shared_ptr refined_structure = nullptr); // Back to Idle with nothing of the last run, as before any collection. void Clear(); RugnuxLiveSnapshot Get() const; diff --git a/rugnux/CMakeLists.txt b/rugnux/CMakeLists.txt index e0696c1b3..396d610f5 100644 --- a/rugnux/CMakeLists.txt +++ b/rugnux/CMakeLists.txt @@ -21,6 +21,8 @@ ADD_LIBRARY(JFJochRugnux STATIC RugnuxDefaults.h RugnuxLive.cpp RugnuxLive.h + RugnuxRefine.cpp + RugnuxRefine.h Rugnux.h RugnuxCommandLine.cpp RugnuxCommandLine.h @@ -38,8 +40,8 @@ TARGET_LINK_LIBRARIES(JFJochRugnux JFJochReader JFJochImageAnalysis JFJochPrevie # The files of a run, written by the programs that run one (rugnux, the viewer) from what JFJochRugnux # returns: the library itself writes none. -ADD_LIBRARY(JFJochRugnuxOutput STATIC RugnuxOutputFiles.cpp RugnuxOutputFiles.h) -TARGET_LINK_LIBRARIES(JFJochRugnuxOutput JFJochRugnux JFJochWriter JFJochModelWriter) +ADD_LIBRARY(JFJochRugnuxOutput STATIC RugnuxOutputFiles.cpp RugnuxOutputFiles.h RugnuxInputKind.cpp RugnuxInputKind.h) +TARGET_LINK_LIBRARIES(JFJochRugnuxOutput JFJochRugnux JFJochWriter JFJochModelWriter ZLIB::ZLIB) # rugnux is the single offline analysis CLI; --mode picks what it does: mx (the full pipeline, the # default), azint, scale (re-scale/merge stored reflections) or calibration (powder-ring geometry). diff --git a/rugnux/ResultReport.cpp b/rugnux/ResultReport.cpp index a172fc49e..0596612a9 100644 --- a/rugnux/ResultReport.cpp +++ b/rugnux/ResultReport.cpp @@ -44,6 +44,8 @@ namespace { // 16: FILE_DIRECT_BEAM / BACKGROUND_DIRECT_BEAM / BEAM_CENTRE_SHIFT / BEAM_CENTRE_TOLERANCE in // section 1 and the BEAM_CENTRE_OFF flag - the file's beam centre against the refined one; // the XDS GEOMETRY KEYWORDS section; OVERLOADED_* / OVERLAPPED_* and the OVERLOADS / OVERLAPS flags. + // 17: INDEXING_AMBIGUITY_RESOLVED and the AMBIGUITY_* keys in section 2 - serial stills, the + // indexing ambiguity resolved from the data alone (or measured against the reference's answer). // 8: every line that is not `KEY= value` and not blank starts with `#`, warnings included // (`# WARNING:`); the header gains RUGNUX_DOWNLOAD and BUILD_CXX_FLAGS, and RUGNUX_GIT is // the full build-time hash. @@ -413,25 +415,10 @@ namespace { } return 0.0; } -} -// ---------------------------------------------------------------------------- the emitter -// Populates the document. Nothing here writes to a stream: the order of the FILE is the renderer's -// business, which is what lets the SUMMARY sit above the sections whose warnings it reports. -ReportDocument BuildReportDocument(const std::string &output_prefix, - const std::string &input_file, - const DiffractionExperiment &experiment, - const ProcessResult &result, - const RunProvenance &provenance) { - ReportDocument doc; - const bool rotation = experiment.IsRotationIndexing(); - const bool merged = result.has_merge_statistics; - doc.warnings = result.warnings; - // SUMMARY rows filled by the sections that measure them; empty leaves the row out. - std::string beam_centre_row, overload_row, overlap_row; - - // ------------------------------------------------------------------ header block - { + // The header block of every report: the version, the build, the input and how the run was invoked. + ReportSection HeaderSection(const std::string &output_prefix, const std::string &input_file, + const RunProvenance &provenance) { ReportSection h; Add(h, KeyInt("REPORT_VERSION", REPORT_VERSION)); Add(h, KeyText("RUGNUX_VERSION", jfjoch_version())); @@ -465,9 +452,140 @@ ReportDocument BuildReportDocument(const std::string &output_prefix, if (!provenance.gpu_description.empty()) Add(h, KeyText("GPU", provenance.gpu_description)); } - doc.sections.push_back(std::move(h)); + return h; } + // The refinement's keys (Refinement.h): REFINE_ of the refinement of a placed model and of --mode refine, with every term of the + // score of the model as given under REFINE_SCORE_. + void AddRefinementKeys(ReportSection &s, const RefinementResult &rf, const std::string &output_prefix) { + Add(s, Blank()); + if (!rf.ok) { + Add(s, KeyEnum("REFINE", "NOT_PERFORMED", {"PERFORMED", "NOT_PERFORMED"})); + Add(s, KeyText("REFINE_REASON", rf.failure_reason)); + } else { + Add(s, KeyEnum("REFINE", "PERFORMED", {"PERFORMED", "NOT_PERFORMED"})); + Add(s, KeyText("REFINE_DEVICE", rf.on_gpu ? "GPU" : "CPU", true)); + Add(s, KeyReal("REFINE_SECONDS", rf.seconds, "{:.1f}", true)); + Add(s, KeyReal("REFINE_D_MIN", rf.d_min, "{:.2f}")); + Add(s, KeyReal("REFINE_R_WORK_START", rf.r_work_start, "{:.4f}")); + Add(s, KeyReal("REFINE_R_FREE_START", rf.r_free_start, "{:.4f}")); + Add(s, KeyInt("REFINE_RIGID_BODIES", rf.rigid_bodies)); + Add(s, KeyReal("REFINE_R_WORK_PLACEMENT", rf.r_work_placement, "{:.4f}")); + Add(s, KeyReal("REFINE_R_FREE_PLACEMENT", rf.r_free_placement, "{:.4f}")); + if (rf.restrained) { + Add(s, KeyReal("REFINE_R_WORK", rf.r_work, "{:.4f}")); + Add(s, KeyReal("REFINE_R_FREE", rf.r_free, "{:.4f}")); + Add(s, KeyReal("REFINE_RMSD_BONDS", rf.geometry.rmsd_bonds, "{:.4f}")); + if (rf.geometry.metal_bonds > 0) + Add(s, KeyReal("REFINE_RMSD_METAL_BONDS", rf.geometry.rmsd_metal, "{:.4f}")); + Add(s, KeyReal("REFINE_RMSD_ANGLES", rf.geometry.rmsd_angles, "{:.2f}")); + Add(s, KeyReal("REFINE_RMSD_BONDS_START", rf.geometry_start.rmsd_bonds, "{:.4f}", true)); + Add(s, KeyReal("REFINE_RMSD_ANGLES_START", rf.geometry_start.rmsd_angles, "{:.2f}", true)); + Add(s, KeyInt("REFINE_CLASHES", rf.geometry.clashes)); + Add(s, KeyReal("REFINE_XRAY_WEIGHT", rf.weight, "{:.4g}", true)); + Add(s, KeyInt("REFINE_ATOMS", rf.atoms)); + Add(s, KeyInt("REFINE_ATOMS_REFINED", rf.refined_atoms)); + Add(s, KeyInt("REFINE_RESIDUES_FIXED", rf.fixed_residues)); + if (!rf.fixed_names.empty()) { + std::string names; + for (const std::string &n : rf.fixed_names) + names += (names.empty() ? "" : " ") + n; + Add(s, KeyText("REFINE_RESIDUES_FIXED_NAMES", names)); + } + } + Add(s, KeyReal("REFINE_BULK_SOLVENT_K_SOL", rf.k_sol, "{:.3f}", true)); + Add(s, KeyReal("REFINE_BULK_SOLVENT_B_SOL", rf.b_sol, "{:.1f}", true)); + int kinds[5] = {0, 0, 0, 0, 0}; + for (const DensityBlob &b : rf.blobs) + kinds[static_cast(b.kind)]++; + Add(s, KeyInt("REFINE_BLOBS", static_cast(rf.blobs.size()))); + Add(s, KeyInt("REFINE_BLOBS_LIGAND", kinds[static_cast(DensityBlob::Kind::Ligand)])); + Add(s, KeyInt("REFINE_BLOBS_WATER", kinds[static_cast(DensityBlob::Kind::Water)])); + Add(s, KeyInt("REFINE_BLOBS_ION", kinds[static_cast(DensityBlob::Kind::Ion)])); + Add(s, KeyInt("REFINE_BLOBS_MODEL_ERROR", kinds[static_cast(DensityBlob::Kind::ModelError)])); + std::string top; + for (size_t i = 0; i < std::min(rf.blobs.size(), 5); i++) { + const DensityBlob &b = rf.blobs[i]; + top += fmt::format("\n {:<11} peak {:5.1f} sigma, {:6.1f} A^3, at {:7.2f} {:7.2f} {:7.2f}, {:.1f} A from {}", + DensityBlobKindName(b.kind), b.peak_sigma, b.volume, b.centroid.x, b.centroid.y, + b.centroid.z, b.nearest_atom_distance, b.nearest_atom); + } + Add(s, Prose(fmt::format( + " The placed model was refined against these data: each chain as a rigid body and\n" + " one B per residue, then every atom restrained by the dictionary carried in rugnux, the\n" + " X-ray weight chosen by R-free with the geometry held within bounds. REFINE_ keys describe\n" + " the refined model, which is written as {}_refined_model.cif with its maps; R_WORK and\n" + " R_FREE above remain the model as given. The refinement decided nothing about the\n" + " processing. The strongest unexplained blobs of its difference map ({}_blobs.json):{}", + output_prefix, output_prefix, top.empty() ? std::string(" none") : top))); + } + if (rf.ok) { + const RefinementScore &sc = rf.score_start; + Add(s, KeyReal("REFINE_SCORE_R_WORK", sc.r_work, "{:.4f}")); + Add(s, KeyReal("REFINE_SCORE_R_FREE", sc.r_free, "{:.4f}")); + Add(s, KeyInt("REFINE_SCORE_N_WORK", sc.n_work)); + Add(s, KeyInt("REFINE_SCORE_N_FREE", sc.n_free)); + Add(s, KeyReal("REFINE_SCORE_K_OVERALL", sc.k_overall, "{:.5g}", true)); + Add(s, KeyReal("REFINE_SCORE_B_ISO", sc.b_iso, "{:.2f}", true)); + Add(s, KeyText("REFINE_SCORE_B_ANISO", fmt::format("{:.2f} {:.2f} {:.2f} {:.2f} {:.2f} {:.2f}", sc.b_aniso[0], + sc.b_aniso[1], sc.b_aniso[2], sc.b_aniso[3], sc.b_aniso[4], + sc.b_aniso[5]), true)); + Add(s, KeyReal("REFINE_SCORE_K_SOL", sc.k_sol, "{:.4f}", true)); + Add(s, KeyReal("REFINE_SCORE_B_SOL", sc.b_sol, "{:.2f}", true)); + Add(s, KeyReal("REFINE_SCORE_MASK_SPACING", sc.mask_spacing, "{:.3f}", true)); + Add(s, KeyInt("REFINE_SCORE_HYDROGENS", sc.hydrogens, true)); + Add(s, KeyReal("REFINE_SCORE_NLL_WORK", sc.nll_work, "{:.1f}", true)); + Add(s, KeyReal("REFINE_SCORE_NLL_FREE", sc.nll_free, "{:.1f}", true)); + Add(s, KeyReal("REFINE_SCORE_FOM", sc.fom, "{:.4f}", true)); + Add(s, KeyReal("REFINE_SCORE_RMSD_BONDS", rf.geometry_start.rmsd_bonds, "{:.4f}", true)); + Add(s, KeyReal("REFINE_SCORE_RMSZ_BONDS", rf.geometry_start.rmsz_bonds, "{:.3f}", true)); + Add(s, KeyReal("REFINE_SCORE_RMSD_METAL_BONDS", rf.geometry_start.rmsd_metal, "{:.4f}", true)); + Add(s, KeyReal("REFINE_SCORE_RMSD_BONDS_ALL", rf.geometry_start.RmsdAllBonds(), "{:.4f}", true)); + Add(s, KeyReal("REFINE_SCORE_RMSD_ANGLES", rf.geometry_start.rmsd_angles, "{:.3f}", true)); + Add(s, KeyReal("REFINE_SCORE_RMSZ_ANGLES", rf.geometry_start.rmsz_angles, "{:.3f}", true)); + if (!sc.shells.empty()) { + ReportEntry e; + e.kind = ReportEntry::Kind::Table; + e.developer_only = true; + e.table.columns = {"D_MAX", "D_MIN", "N_WORK", "N_FREE", "R_WORK", "R_FREE"}; + e.table.text_header = " D_MAX D_MIN N_WORK N_FREE R_WORK R_FREE"; + for (const RefinementShell &sh : sc.shells) { + e.table.text_rows.push_back(fmt::format("{:8.2f}{:8.2f}{:8d}{:8d}{:8.4f}{:8.4f}", sh.d_max, sh.d_min, + sh.n_work, sh.n_free, sh.r_work, sh.r_free)); + std::vector row; + for (double v : {sh.d_max, sh.d_min, double(sh.n_work), double(sh.n_free), sh.r_work, sh.r_free}) { + ReportValue rv; + rv.type = ReportValue::Type::Real; + rv.real = v; + rv.text = fmt::format("{}", v); + row.push_back(rv); + } + e.table.cells.push_back(std::move(row)); + } + Add(s, std::move(e)); + } + } + } +} + +// ---------------------------------------------------------------------------- the emitter +// Populates the document. Nothing here writes to a stream: the order of the FILE is the renderer's +// business, which is what lets the SUMMARY sit above the sections whose warnings it reports. +ReportDocument BuildReportDocument(const std::string &output_prefix, + const std::string &input_file, + const DiffractionExperiment &experiment, + const ProcessResult &result, + const RunProvenance &provenance) { + ReportDocument doc; + const bool rotation = experiment.IsRotationIndexing(); + const bool merged = result.has_merge_statistics; + doc.warnings = result.warnings; + // SUMMARY rows filled by the sections that measure them; empty leaves the row out. + std::string beam_centre_row, overload_row, overlap_row; + + // ------------------------------------------------------------------ header block + doc.sections.push_back(HeaderSection(output_prefix, input_file, provenance)); + // ------------------------------------------------- 1. DATA SET AND GEOMETRY { ReportSection s; @@ -752,8 +870,40 @@ ReportDocument BuildReportDocument(const std::string &output_prefix, Add(s, KeyBool("LATTICE_FOUND", result.consensus_cell.has_value())); if (!result.indexing_ambiguity_operators.empty()) Add(s, KeyText("INDEXING_AMBIGUITY_OPERATORS", result.indexing_ambiguity_operators)); + // Serial stills: the indexing ambiguity from the data alone - deciding the merge where no reference + // or model was given, otherwise measured against the reference's answer (REINDEXED is then the + // number of crystals on which the two disagree). + if (result.ambiguity_reference_free) { + Add(s, KeyText("INDEXING_AMBIGUITY_RESOLVED", + result.ambiguity_reference_free_applied ? "data" : "reference")); + Add(s, KeyInt("AMBIGUITY_CRYSTALS", static_cast(result.ambiguity_crystals))); + Add(s, KeyInt(result.ambiguity_reference_free_applied ? "AMBIGUITY_REINDEXED" + : "AMBIGUITY_DATA_DISAGREES", + static_cast(result.ambiguity_reindexed))); + Add(s, KeyReal("AMBIGUITY_SEPARATION_SIGMA", result.ambiguity_separation_sigma, "{:.2f}")); + Add(s, KeyReal("AMBIGUITY_DECIDED_FRACTION", result.ambiguity_decided_fraction, "{:.3f}")); + Add(s, KeyReal("AMBIGUITY_TIME_S", result.ambiguity_time_s, "{:.3f}", /*dev=*/true)); + } if (result.consensus_cell.has_value()) Add(s, KeyText("UNIT_CELL_CONSTANTS", CellString(*result.consensus_cell))); + // The cell's e.s.d.s as XDS's E.S.D. OF CELL PARAMETERS (CellEsd.h): the written one (the .ins's + // ZERR, the mmCIF's _cell.*_esd) is per parameter the larger of the least-squares e.s.d. and the + // scatter of the cells fitted on blocks of frames. + if (result.cell_esd.has_value()) { + const CellEsd &e = *result.cell_esd; + const auto esd_string = [](const std::array &v) { + return fmt::format("{:.2E} {:.2E} {:.2E} {:.2E} {:.2E} {:.2E}", v[0], v[1], v[2], v[3], v[4], v[5]); + }; + Add(s, KeyText("CELL_ESD", esd_string(e.esd))); + Add(s, KeyText("CELL_ESD_LSQ", esd_string(e.esd_lsq))); + if (e.esd_blocks) + Add(s, KeyText("CELL_ESD_BLOCKS", esd_string(*e.esd_blocks))); + Add(s, KeyInt("CELL_ESD_BLOCK_COUNT", e.blocks)); + Add(s, KeyInt("CELL_ESD_REFLECTIONS", e.reflections)); + Add(s, KeyInt("CELL_ESD_OBSERVATIONS", e.observations, /*dev=*/true)); + Add(s, KeyText("CELL_ESD_THETA_RANGE_DEG", fmt::format("{:.2f} {:.2f}", e.theta_min_deg, e.theta_max_deg))); + Add(s, KeyText("CELL_DSPACING_FIT", CellString(e.fitted), /*dev=*/true)); + } // Kabsch's sigma_M, the Gaussian e.s.d. of the rocking width in degrees - XDS's // REFLECTING_RANGE_E.S.D. - that the merge computed partiality from. if (std::isfinite(result.mosaicity_deg)) { @@ -2739,6 +2889,10 @@ ReportDocument BuildReportDocument(const std::string &output_prefix, mp.t_rotation, mp.t_translation, mp.t_rescore, mp.t_null, mp.t_domains, mp.hand_check.seconds), true)); } } + // The placed model refined (Refinement.h; always, where a model is placed). Keys of their own: R_WORK / R_FREE above stay the + // unrefined model's. + if (result.refinement.has_value()) + AddRefinementKeys(s, *result.refinement, output_prefix); doc.sections.push_back(std::move(s)); } @@ -2926,7 +3080,7 @@ ReportDocument BuildReportDocument(const std::string &output_prefix, sig += fmt::format(" ISa {:.1f}", result.error_model_isa); row("Signal", sig); if (std::isfinite(o.cc_anom)) - row("Anomalous", o.cc_anom > 0.15 + row("Anomalous", o.cc_anom > CC_ANOM_SIGNAL ? fmt::format("signal present (CC_anom {:.2f})", o.cc_anom) : fmt::format("no usable signal (CC_anom {:.2f})", o.cc_anom)); const auto &an = result.merge_statistics.anisotropy; @@ -3062,6 +3216,42 @@ ReportDocument BuildReportDocument(const std::string &output_prefix, // -------------------------------------------------------------------------- the text rendering // Reads only from the document. Nothing here decides what the report SAYS; it decides only how the // text file looks, which is what makes a second rendering a second function rather than a fork. +// --mode refine: the header, what the input was and what had to be made of it, and the refinement's keys. +ReportDocument BuildRefineReportDocument(const std::string &output_prefix, const std::string &input_file, + const std::string &model_file, const RefineOnlyResult &r, + const RunProvenance &provenance) { + ReportDocument doc; + doc.sections.push_back(HeaderSection(output_prefix, input_file, provenance)); + const RefinementResult &rf = r.refinement; + ReportSection s; + s.title = "1. REFINEMENT"; + Add(s, KeyText("MODEL_FILE", model_file)); + Add(s, KeyText("SPACE_GROUP", r.space_group)); + Add(s, KeyReal("WAVELENGTH", r.wavelength_A, "{:.5f}")); + Add(s, KeyInt("REFINE_REFLECTIONS", r.reflections)); + Add(s, KeyInt("REFINE_FREE_REFLECTIONS", r.free_reflections)); + Add(s, KeyBool("REFINE_FRENCH_WILSON", r.french_wilson)); + Add(s, KeyEnum("REFINE_FREE_FLAGS", r.free_flags_generated ? "GENERATED" : "FILE", {"FILE", "GENERATED"})); + if (r.d_min_limit > 0) + Add(s, KeyReal("REFINE_D_MIN_LIMIT", r.d_min_limit, "{:.3f}")); + AddRefinementKeys(s, rf, output_prefix); + doc.sections.push_back(std::move(s)); + doc.verdict = rf.ok ? "OK" : "FAILED"; + if (!rf.ok) + doc.verdict_text = "Refinement did not run: " + rf.failure_reason; + else if (r.score_only) + doc.verdict_text = fmt::format("Scored as given, nothing refined: R-work {:.4f}, R-free {:.4f}.", + rf.r_work_start, rf.r_free_start); + else + doc.verdict_text = fmt::format("Refined: R-work {:.4f}, R-free {:.4f} (as given {:.4f}, {:.4f}).", + rf.restrained ? rf.r_work : rf.r_work_placement, + rf.restrained ? rf.r_free : rf.r_free_placement, rf.r_work_start, rf.r_free_start); + Add(doc.sections.back(), KeyEnum("VERDICT", doc.verdict, {"OK", "WARNINGS", "UNUSABLE", "FAILED"})); + Add(doc.sections.back(), KeyText("VERDICT_TEXT", doc.verdict_text)); + doc.summary_rows.push_back({"Refinement", doc.verdict_text}); + return doc; +} + std::string RenderReportText(const ReportDocument &doc, bool developer) { std::ostringstream os; // Everything that is not a `KEY= value` line and not blank is written as a `#` comment, so a diff --git a/rugnux/ResultReport.h b/rugnux/ResultReport.h index bdbbe1b72..5078a22cf 100644 --- a/rugnux/ResultReport.h +++ b/rugnux/ResultReport.h @@ -9,6 +9,7 @@ #include "../common/Logger.h" #include "ReportDocument.h" #include "Rugnux.h" +#include "RugnuxRefine.h" // _report.txt - what the run DETERMINED, written next to the .mtz/.cif/.hkl on every run // that has an output prefix. Modelled on XDS's CORRECT.LP: prose and tables a crystallographer @@ -55,6 +56,9 @@ inline constexpr const char *RUGNUX_ACKNOWLEDGEMENT = "are credited in ACKNOWLEDGEMENT.md, with the licence terms in LICENSE and\n" "THIRD_PARTY_NOTICES.md - all three ship with this package."; +// The overall CC_anom above which the summary says the data carry anomalous signal. +inline constexpr double CC_ANOM_SIGNAL = 0.15; + // The emitter. Populates the result object every rendering reads from; it writes no text itself. ReportDocument BuildReportDocument(const std::string &output_prefix, const std::string &input_file, @@ -62,6 +66,11 @@ ReportDocument BuildReportDocument(const std::string &output_prefix, const ProcessResult &result, const RunProvenance &provenance = {}); +// --mode refine's report: the header, the input as read and the REFINE_ keys. +ReportDocument BuildRefineReportDocument(const std::string &output_prefix, const std::string &input_file, + const std::string &model_file, const RefineOnlyResult &result, + const RunProvenance &provenance = {}); + // The text rendering of that document - XDS-style prose, tables and `KEY= value` lines. Reads only // from the document, so a second rendering is a second function of the same input. std::string RenderReportText(const ReportDocument &doc, bool developer); diff --git a/rugnux/Rugnux.cpp b/rugnux/Rugnux.cpp index e7aa66f59..6eb5ee2f4 100644 --- a/rugnux/Rugnux.cpp +++ b/rugnux/Rugnux.cpp @@ -147,7 +147,14 @@ RotationScaleWalk WalkRotationScale(double first_fit, for (int round = 0; round < max_rounds && next != walk.scale; ++round) { const ValidationSpotEvidence e = index_at(next); walk.trail += fmt::format(", {:.5f}: {:.1f}%", next, score(e)); - if (!ValidationEvidencePrefers(walk.evidence, e)) + // The stored angles are left only where the validation frames prefer the fit. Once they are + // left, the refit is the estimate and the frames only guard it: a first pass indexes through a + // degree of drift late in the sweep, so they can score two scales alike while integration at + // the less refitted one loses half its signal. A refit step is refused only where they score + // it worse. + const bool refused = walk.scale == 1.0f ? !ValidationEvidencePrefers(walk.evidence, e) + : ValidationEvidencePrefers(e, walk.evidence); + if (refused) break; const double step = next - walk.scale; walk.scale = next; @@ -493,14 +500,19 @@ ProcessResult Rugnux::Run(RugnuxObserver *observer) { if (result.consensus_cell) header_experiment.SetUnitCell(*result.consensus_cell); result.beam_centre_need_pxl = BeamCenterNeed_pxl(header_experiment); -#ifdef JFJOCH_USE_CUDA - // The engines went with their passes; the pinned buffers they kept for each other go with the run. - const size_t pinned_bytes = cuda_release_pinned_pool(); - Logger("Rugnux").Debug("Pinned host memory kept between engines, released: {:.1f} MB", pinned_bytes / 1e6); -#endif return result; } +void Rugnux::ReleasePinnedPool() { +#ifdef JFJOCH_USE_CUDA + Logger logger("Rugnux"); + TimingMark mark(logger, "pinned pool release"); + const size_t bytes = cuda_release_pinned_pool(); + mark.Stop(); + logger.Debug("Pinned host memory kept between engines, released: {:.1f} MB", bytes / 1e6); +#endif +} + void Rugnux::StartNearTieRecheck(std::shared_ptr run, bool geometry_prepass) { // The pass again, up to its first pass, as the probe it would be: the same inputs, no memo to // answer from, nothing started beside it. @@ -780,6 +792,8 @@ ProcessResult Rugnux::RunPipeline(RugnuxObserver *observer, bool write_output, b ProcessResult result; TimingMark pass_mark(logger, geometry_prepass ? "pass (geometry pre-pass)" : write_output ? "pass (output)" : "pass (probe)"); + // Started where the pass returns: the time its locals - engines, indexers, outcomes - take to go. + std::optional teardown_mark; // Only a pass that makes the result is shown as steps; a probe pass is part of the step that ran it. steps_ = (write_output || geometry_prepass) ? observer : nullptr; @@ -1118,6 +1132,16 @@ ProcessResult Rugnux::RunPipeline(RugnuxObserver *observer, bool write_output, b std::atomic total_uncompressed_bytes = 0; EndMessage end_msg; std::future unmerged_mtz; + // The pass's integrated observations - gigabytes, in mappings of their own (ReflectionArena) - are handed + // back on a thread of their own as the pass returns: nothing after it reads them, and unmapping them was most + // of the time the pass took to end. The unmerged table made from them beside the refinement goes first. + const auto retire_outcomes = [&] { + retired_outcomes_ = std::async(std::launch::async, + [i = std::move(indexer), u = std::move(unmerged_mtz)]() mutable { + u = {}; + i.reset(); + }).share(); + }; PipelineLocals p{ .logger = logger, .result = result, .observer = observer, .geometry_prepass = geometry_prepass, .full = full, .calibration = calibration, @@ -1203,8 +1227,11 @@ ProcessResult Rugnux::RunPipeline(RugnuxObserver *observer, bool write_output, b for (const auto ¬e : p.postrefine_notes) Note(note); } - if (finished) + if (finished) { + retire_outcomes(); + teardown_mark.emplace(logger, "pass teardown"); return result; + } } TimingMark output_mark(logger, "outputs"); @@ -1298,6 +1325,12 @@ ProcessResult Rugnux::RunPipeline(RugnuxObserver *observer, bool write_output, b end_msg.image_scale_mosaicity = scaling.mosaicity_deg; } + if (result.cell_esd) { + const std::array &e = result.cell_esd->esd; + end_msg.unit_cell_esd = UnitCell{static_cast(e[0]), static_cast(e[1]), static_cast(e[2]), + static_cast(e[3]), static_cast(e[4]), static_cast(e[5])}; + } + if (sink) sink->End(end_msg); result.end_message = end_msg; @@ -1341,5 +1374,7 @@ ProcessResult Rugnux::RunPipeline(RugnuxObserver *observer, bool write_output, b TimingMark mark(logger, "leftover-lattice census wait"); result.leftover_lattices = census_future.get(); } + retire_outcomes(); + teardown_mark.emplace(logger, "pass teardown"); return result; } diff --git a/rugnux/Rugnux.h b/rugnux/Rugnux.h index 1441847a7..8ce4222a2 100644 --- a/rugnux/Rugnux.h +++ b/rugnux/Rugnux.h @@ -30,10 +30,13 @@ #include "../image_analysis/scale_merge/Merge.h" // MergeStatistics #include "../image_analysis/scale_merge/TwinningAnalysis.h" // TwinningAnalysisResult #include "../image_analysis/scale_merge/CentreOfSymmetry.h" // CentreOfSymmetryResult +#include "../image_analysis/scale_merge/StillsPartialityRefine.h" // StillsPartialityRefine::RunWidth #include "../image_analysis/scale_merge/TranslationalNCS.h" // TranslationalNCSResult #include "../image_analysis/indexing/HarmonicContamination.h" // HarmonicContaminationResult +#include "../image_analysis/geom_refinement/CellEsd.h" // CellEsd #include "../image_analysis/structure_refinement/ModelValidation.h" // ModelValidationResult #include "../image_analysis/structure_refinement/MolecularReplacement.h" // MolecularReplacementResult +#include "../image_analysis/structure_refinement/Refinement.h" // RefinementResult #include "../image_analysis/indexing/LeftoverLattices.h" // LeftoverLatticeCensus #include "ReportDocument.h" // ReportWarning, PathologyCode #include "../image_analysis/scale_merge/SearchSpaceGroup.h" // SearchSpaceGroupResult @@ -260,6 +263,13 @@ struct ProcessConfig { // did not place, is searched for anyway. bool force_mr = false; + // A placed model refined against the merge it was placed on - each chain as a rigid body and a B per residue, + // then every atom restrained (Refinement.h) - and what it leaves in the difference map listed (DensityBlobs.h). + // Reported in keys of its own; it decides nothing about the processing or the files the run writes otherwise. + // On in the rugnux CLI (--no-refine turns it off), the viewer and the broker's live mode: giving a model is the + // opt-in. + bool refine = false; + // --finalist-ledger: report-only symmetry evidence table (and the twin-immune zones), folded from // a merge of its own in P1 that only this flag makes. bool finalist_ledger = false; @@ -330,7 +340,8 @@ std::pair ValidationEvidenceDifference(const ValidationSpotEvide // stops them tracking the rest, so one fit reads only part of the error. So: index the lattice under // the fitted scale and under the angles in hand; where the fitted one scores better on the validation // frames (ValidationEvidencePrefers), adopt it, fit again there and repeat. The stored angles (k = 1) -// are the first hypothesis, and stand unless the evidence moves the run off them. +// are the first hypothesis, and stand unless the evidence moves the run off them; once off them, a +// refit step is taken unless the frames score it worse. // index_at(k): the validation evidence of the lattice indexed with the stored angles scaled by k // refit_at(k): the scale the post-refinement fits on reflections integrated at k, relative to k; // empty where it fitted none @@ -383,6 +394,7 @@ struct MergedOutput { ErrorModelReport error_model; TwinningAnalysisResult twinning; // a twin hypothesis' law and fraction, for its mmCIF std::vector scaled_fulls; // the .hkl's records, where the merge made them (rotation) + std::optional cell_esd; // the cell's e.s.d.s: the mmCIF's _cell.*_esd and the .ins's ZERR }; // An atomic model as placed against the data (_model.cif, WritePlacedModel): `cell` and @@ -403,6 +415,9 @@ struct RugnuxOutputs { std::shared_ptr model_prior_maps; // the same at _mr std::optional placed_model; // _model.cif/.pdb std::optional model_prior_placed_model; // _mr_model.cif/.pdb + std::optional refined_model; // _refined_model.cif/.pdb (ProcessConfig::refine) + std::shared_ptr refined_maps; // _refined_maps.mtz + std::optional> blobs; // _blobs.json std::optional unmerged; // _unmerged.mtz std::optional unmerged_partials; // _unmerged_partials.mtz std::string detector_jpeg; // _detector.jpg; empty: none drawn @@ -469,6 +484,8 @@ struct ProcessResult { // file's. The report's XDS keyword block reads it. Empty on stills. std::optional used_rotation_axis; std::optional consensus_cell; + // The e.s.d.s of consensus_cell (CellEsd.h); rotation only. + std::optional cell_esd; // The centring `consensus_cell` is written in; empty when nothing named one (the stills path // averages per-image cells and has no lattice search behind them). A conventional cell says // nothing about size on its own - a centred one is an exact integer multiple of its primitive @@ -646,6 +663,18 @@ struct ProcessResult { // it matters only against other data. Empty where there is none, or where it was resolved. std::string indexing_ambiguity_operators; + // Serial stills: the indexing ambiguity resolved from the data alone (ReferenceFreeReindex.h), where + // the cell and space group admit one. Without a reference or model it decides the merge; with one, it + // is only measured against the reference's answer (ambiguity_reference_free_applied = false, and + // ambiguity_reindexed is then the number of crystals on which the two disagree). + bool ambiguity_reference_free = false; + bool ambiguity_reference_free_applied = false; + size_t ambiguity_crystals = 0; + size_t ambiguity_reindexed = 0; + double ambiguity_separation_sigma = NAN; + double ambiguity_decided_fraction = NAN; + double ambiguity_time_s = NAN; + // The same analysis measured BEFORE the space group was decided, on the subgroup merge the search // was given. It is the only twinning number a promotion cannot contaminate: once a higher Laue // class is adopted, its own twinning test can say no more than "no twin law exists inside this @@ -711,6 +740,8 @@ struct ProcessResult { std::string model_placement; // What molecular replacement found, where it ran; failure_reason says why where it could not. std::optional model_prior; + // What refinement made of the placed model; unset where nothing was placed (or refine was off). + std::optional refinement; // The file suffix the model's choice of another group or the twin hypothesis' subgroup is written under // (_mr), and that group; empty where nothing was. std::string model_prior_file_suffix; @@ -934,6 +965,8 @@ class Rugnux { CancelFlag &operator=(bool v) { flag->store(v); return *this; } // A flag of its own that cancelling the run still sets. CancelFlag Own() const { CancelFlag f; f.run = flag; return f; } + // The flag Cancel() on the run sets, for work that takes a plain atomic (RefinementSettings::cancel). + const std::atomic *RunFlag() const { return run ? run.get() : flag.get(); } }; CancelFlag cancelled_; // fast_live: the last pass that ran to its end. Where a cancel cuts the pass after it short, Run() @@ -964,6 +997,11 @@ class Rugnux { // describes neither geometry. The two travel together or not at all. std::optional> prepass_detector_geometry_; + // The space group a search of the geometry pre-pass's P1 merge finds. A prediction only: the canonical + // pass merges in it ahead, on a copy of its engine, and keeps that merge only where its own decision + // lands on the same group on the same ingest (ScaleMergeAndSymmetry). It decides nothing. + std::shared_future> predicted_group_; + // The goniometer rotation scale the run adopted (WalkRotationScale, in RunAllPasses), applied to the // second pass's goniometer - and, while the walk runs, the scale its current probe pass is at. // Empty where the stored angles stand. @@ -1074,6 +1112,9 @@ class Rugnux { // The pixels the pre-scan's own frames show to be defective (HotPixelFinder) are measured once, // on the pre-scan that also measures the width, and stay in pixel_mask_ for every pass after it. bool hot_pixels_measured_ = false; + // The polarization the pre-scan took from the background where it turned the stated plane, kept with + // the shadow it was decided with (PreScan). + std::optional polarization_from_background_; // The integration radii in force before the measured spot width widened them, so a widening that // turns out to cost data can be given back exactly rather than to a written-down default. std::optional bragg_before_adaptive_; @@ -1449,6 +1490,12 @@ class Rugnux { // Stills: the cell the user gave (-C / reference), kept apart from the one the geometry refinement // writes into experiment_. See RefineStillsGeometry. std::optional stills_user_cell_; + // Stills: the rocking width measured before the image pass, on a sample of its frames, which every + // frame is then predicted through (ImagePass) and the partialities are computed from (ScaleMerge). + std::optional stills_run_width_; + static constexpr double STILLS_WINDOW_SIGMAS = 2.0; // the window's half-width, in rocking widths + static constexpr int STILLS_WINDOW_MIN_FRAMES = 2000; // the sample: a tenth of the run, at least this + static constexpr int STILLS_WINDOW_FRACTION = 10; // Stills: where the frames' pixel values pile up, against the file's saturation limit (see there). static constexpr int SATURATION_SAMPLE_FRAMES = 40; saturation_ceiling::Histogram SampleSaturation(int start_image, int images_to_process); @@ -1566,6 +1613,12 @@ public: // Runs the configured workflow to completion or until Cancel(). Throws on setup failure. ProcessResult Run(RugnuxObserver *observer = nullptr); + + // The pinned host buffers the engines of a run kept for each other (CUDAMemHelpers.h), handed back to the + // driver. Not part of Run: a process that outlives the run (the broker, the viewer) calls it once the + // results are out, as it takes a tenth of a second the user would otherwise wait for; one that ends + // after the run does not need it. + static void ReleasePinnedPool(); // The pre-scan's powder measurement, for a report on a run that ended without a result. const PowderRings &GetPowderRings() const { return powder_; } @@ -1575,4 +1628,8 @@ public: // pass cut short gives way to the last complete one. void Cancel() { cancelled_ = true; } bool IsCancelled() const { return cancelled_; } + +private: + // The last pass's integrated observations being handed back (RunPipeline); last, so it is waited for first. + std::shared_future retired_outcomes_; }; diff --git a/rugnux/RugnuxCommandLine.cpp b/rugnux/RugnuxCommandLine.cpp index 9bdb53dd1..52167a8ea 100644 --- a/rugnux/RugnuxCommandLine.cpp +++ b/rugnux/RugnuxCommandLine.cpp @@ -86,6 +86,8 @@ std::string RugnuxCommandLine(const ProcessConfig &config, } if (config.model) add(config.force_mr ? "--mr" : "--model", config.model->name); + if (config.model && !config.refine) + args.emplace_back("--no-refine"); } if (config.start_image != 0) add("-s", std::to_string(config.start_image)); diff --git a/rugnux/RugnuxDefaults.cpp b/rugnux/RugnuxDefaults.cpp index 352e11050..8ef13bbb4 100644 --- a/rugnux/RugnuxDefaults.cpp +++ b/rugnux/RugnuxDefaults.cpp @@ -11,6 +11,10 @@ namespace { constexpr double SMOOTH_G_DEG = 5.0; // Per-observation outlier rejection for the rotation combine, in sigma. constexpr double REJECT_OUTLIERS_NSIGMA = 6.0; + // The same for the stills merge, set wider: a still's partials scatter with heavier tails than the + // error model's normal band, and what has to go - a powder grain or a neighbour's spot in the box - sits + // tens to hundreds of sigma out. + constexpr double REJECT_OUTLIERS_NSIGMA_STILLS = 10.0; } void ApplyRugnuxExperimentDefaults(DiffractionExperiment &experiment) { @@ -52,12 +56,20 @@ ScalingSettings RugnuxDefaultScalingSettings(bool rotation) { // I/sigma floor and falls back to P1. s.MinCapturedFraction(rotation ? 0.7 : 0.0); + // A still's intensity is divided by the partiality its excitation error gives. Below about one half + // the error of that model (the run's curve is an average over crystals, and mis-oriented crystals + // leave a floor far out on its tail) dominates, and dividing by a small p turns it into a bias that + // no variance term weights away. So stills merge only the reflections the model calls at least half + // recorded; rotation sums its partials into fulls and keeps the permissive floor. + s.MinPartiality(rotation ? 0.02 : 0.5); + // Capture-aware systematic sigma: down-weights the over-extrapolated under-captured fulls. s.CaptureUncertaintyCoeff(rotation ? 1.0 : 0.0); // A single un-rejected artifact wrecks the intensity-correlation and second-moment statistics the - // space-group and twinning tests are built on. - s.OutlierRejectNsigma(rotation ? REJECT_OUTLIERS_NSIGMA : 0.0); + // space-group and twinning tests are built on. On stills one powder grain or neighbour's spot in a + // reflection's box can be its whole merged intensity, whatever its multiplicity. + s.OutlierRejectNsigma(rotation ? REJECT_OUTLIERS_NSIGMA : REJECT_OUTLIERS_NSIGMA_STILLS); // Run the de-novo space-group search a second time on a merge of only the well-measured // observations and keep whichever found more symmetry. It cannot lose symmetry, so an imperfect cut diff --git a/rugnux/RugnuxFirstPass.h b/rugnux/RugnuxFirstPass.h index f055a6e11..024164fc9 100644 --- a/rugnux/RugnuxFirstPass.h +++ b/rugnux/RugnuxFirstPass.h @@ -80,6 +80,8 @@ struct Rugnux::FirstPassRun { FirstPass SubLatticeHypothesis(FirstPass best); FirstPass TwinCompositeHypothesis(FirstPass best); FirstPass Pass1Fallback(FirstPass best); + // Pass 1's lattice refit at the rotation scale the pass runs at (see Pass1Fallback). + RotationIndexerResult RefitAtScale(RotationIndexerResult pass1_lattice); std::optional FirstPassLadder(int score_before, int min_gain, int min_score); // The pooled spots of the validation frames on the lattice the pass ended on, and their share. diff --git a/rugnux/RugnuxFirstPassRescues.cpp b/rugnux/RugnuxFirstPassRescues.cpp index 554ca3fb3..9784a8464 100644 --- a/rugnux/RugnuxFirstPassRescues.cpp +++ b/rugnux/RugnuxFirstPassRescues.cpp @@ -11,6 +11,7 @@ #include "../image_analysis/hot_pixels/HotPixels.h" #include "../image_analysis/SensorAbsorption.h" #include "DiagnosticOutput.h" +#include "../image_analysis/geom_refinement/XtalOptimizer.h" #include #include @@ -1009,6 +1010,55 @@ auto Rugnux::FirstPassRun::SubLatticeHypothesis(FirstPass best) -> FirstPass { return best; } +// Pass 1's lattice refit at the rotation scale this pass runs at (see Pass1Fallback): cell and +// orientation, at pass 1's detector geometry and with the detector and the axis held, on the spots of +// the validation frames of the whole sweep. +auto Rugnux::FirstPassRun::RefitAtScale(RotationIndexerResult pass1_lattice) -> RotationIndexerResult { + const UnitCell before = pass1_lattice.lattice.GetUnitCell(); + const std::vector frames = AllValidationFrames(); + PrefetchSpots(frames); + // XtalOptimizer reads a frame's angle off its place in the list, so the list is indexed by image. + std::vector> spots; + for (const int f : frames) { + if (f >= static_cast(spots.size())) + spots.resize(f + 1); + spots[f] = spot_cache.at(f); + } + XtalOptimizerData d{ + .geom = pass1_lattice.geom, + .latt = pass1_lattice.lattice, + .crystal_system = pass1_lattice.search_result.system == gemmi::CrystalSystem::Trigonal + ? gemmi::CrystalSystem::Hexagonal : pass1_lattice.search_result.system, + .min_spots = rx.experiment_.GetIndexingSettings().GetViableCellMinSpots(), + .max_length_A = 1.2f * static_cast(std::max({before.a, before.b, before.c})), + // The indexers' bounds, as RotationIndexer::RefineConstrained sets them. + .min_angle_deg = 30.0f, + .max_angle_deg = 150.0f, + .refine_beam_center = false, + .refine_detector_angles = false, + .refine_rotation_axis = false, + .index_ice_rings = false, + .max_iterations = 50, + .axis = pass1_lattice.axis + }; + if (!XtalOptimizer(d, spots, 4)) { + logger.Info("Two-pass: pass-1's lattice refit at rotation scale {:.5f} on {} validation frames did not " + "converge - pass-1's lattice is kept as it is", *rx.prepass_rotation_scale_, frames.size()); + return pass1_lattice; + } + RotationIndexerResult refit = pass1_lattice; + refit.lattice = d.latt; + const int n_before = CountIndexed(*indexer, pass1_lattice, frames); + const int n_after = CountIndexed(*indexer, refit, frames); + const UnitCell uc = d.latt.GetUnitCell(); + logger.Info("Two-pass: pass-1's lattice refit at rotation scale {:.5f} on {} validation frames: {:.3f} {:.3f} " + "{:.3f} {:.2f} {:.2f} {:.2f} from {:.3f} {:.3f} {:.3f} {:.2f} {:.2f} {:.2f}, indexing {} of them " + "against {} - {}", *rx.prepass_rotation_scale_, frames.size(), uc.a, uc.b, uc.c, uc.alpha, uc.beta, + uc.gamma, before.a, before.b, before.c, before.alpha, before.beta, before.gamma, n_after, n_before, + n_after >= n_before ? "taken" : "refused"); + return n_after >= n_before ? refit : pass1_lattice; +} + // A lattice that indexes almost none of the validation frames is not this crystal's lattice. // Forcing it anyway integrates every image against it; the few partials that survive yield no // fulls in the 3D combine, and the run then dies inside the merge complaining about resolution - @@ -1033,6 +1083,13 @@ auto Rugnux::FirstPassRun::Pass1Fallback(FirstPass best) -> FirstPass { // uncorrected angles back (the same repair as the supercell re-run in RunAllPasses). if (rx.prepass_rotation_scale_ && pass1_lattice.axis) pass1_lattice.axis = ScaleRotation(*pass1_lattice.axis, *rx.prepass_rotation_scale_); + // Pass 1's cell and orientation were fitted at the angles pass 1 ran at, and where the run now + // tries another rotation scale, a stage that turned at the wrong rate has put part of that error + // into the cell: carried as it is, the cell undoes the scale it is integrated at. So refit them at + // the angles this pass uses, on the validation frames of the whole sweep - the lattice pass 1 + // chose, not a new one - and keep the refit where it indexes no fewer of those frames. + if (rx.prepass_rotation_scale_ && pass1_lattice.axis) + pass1_lattice = RefitAtScale(std::move(pass1_lattice)); // Pass 1's lattice was FITTED at pass 1's detector distance, and this pass // integrates at the post-refined one. Re-scoring it here is not the same as // re-fitting it: a real-space cell is measured against the distance the spots were diff --git a/rugnux/RugnuxImagePass.cpp b/rugnux/RugnuxImagePass.cpp index 24cee59e4..92edbe15f 100644 --- a/rugnux/RugnuxImagePass.cpp +++ b/rugnux/RugnuxImagePass.cpp @@ -255,7 +255,27 @@ void Rugnux::ImagePass(PipelineLocals &p) { // A pre-pass of the pre-pass subset (prepass_subset_only_) integrates its frames and no other. const std::vector subset = prepass_subset_only_ ? PrepassSubset(prepass_images) : std::vector(); - auto full_worker = [&]() { + // Stills: the window each frame predicts through. Twice the frame's own profile radius is one width at + // every resolution and differs eightfold between frames, while the rocking curve widens with d*: it + // predicted five to eight widths at low resolution, mostly empty, and cut the curve at one or two at + // high resolution, so the partials there were never integrated. So the run's width is measured first, + // on a sample of the frames integrated the old way (MeasureRunWidth, as the merge measures it), and + // every frame is then predicted through STILLS_WINDOW_SIGMAS of it. + std::vector window_frames; + const bool stills_window = full && per_image_analysis && !calibration && !geometry_prepass && indexer + && !experiment_.IsRotationIndexing() && config_.spot_finding.indexing + && experiment_.GetScalingSettings().GetStillsPartialityRefine(); + if (stills_window) { + stills_run_width_.reset(); + indexer->SetStillsWindow(std::nullopt); + const int n_sample = std::min(images_to_process, + std::max(STILLS_WINDOW_MIN_FRAMES, images_to_process / STILLS_WINDOW_FRACTION)); + for (int j = 0; j < n_sample; ++j) + window_frames.push_back(static_cast(static_cast(j) * images_to_process / n_sample)); + } + std::atomic next_window_frame = 0; + + auto full_worker_impl = [&](bool measure) { pin_gpu(); // round-robin per worker thread; must precede engine construction // Before the analysis engine, which page-locks these bytes for its uploads and unregisters // them when it is destroyed: it must not outlive the buffer it was given. @@ -272,7 +292,13 @@ void Rugnux::ImagePass(PipelineLocals &p) { analysis.CountCrowdingAt(*crowding_at); while (!cancelled_) { - const int ordinal = next_ordinal.fetch_add(1); + int ordinal; + if (measure) { + const size_t j = next_window_frame.fetch_add(1); + if (j >= window_frames.size()) break; + ordinal = window_frames[j]; + } else + ordinal = next_ordinal.fetch_add(1); const int image_idx = start_image + ordinal * config_.stride; if (image_idx >= loop_end) break; if (!subset.empty() && !subset[ordinal]) @@ -320,6 +346,8 @@ void Rugnux::ImagePass(PipelineLocals &p) { // rather than merge what the machine dropped. indexer->RethrowIndexerError(); pinned.reset(); + if (measure) + continue; msg.processing_time_s = std::chrono::duration(std::chrono::steady_clock::now() - t0).count(); msg.run_number = experiment_.GetRunNumber(); msg.run_name = experiment_.GetRunName(); @@ -353,6 +381,8 @@ void Rugnux::ImagePass(PipelineLocals &p) { if (observer) observer->OnProgress(done, images_to_process); } + if (measure) + return; { std::lock_guard lock(harmonic_m); harmonic_evidence.Add(worker_harmonic); @@ -375,6 +405,7 @@ void Rugnux::ImagePass(PipelineLocals &p) { bragg_overlapped_major += bragg.overlapped_major; bragg_overloads_kept += bragg.overloads_kept; }; + auto full_worker = [&]() { full_worker_impl(false); }; if (observer) { observer->OnPhase("Processing images"); @@ -403,6 +434,33 @@ void Rugnux::ImagePass(PipelineLocals &p) { std::vector > futures; futures.reserve(image_workers); const auto image_loop_start = std::chrono::steady_clock::now(); + if (!window_frames.empty()) { + // The sample is integrated, scaled against its own merge and measured; then it is forgotten, and + // its frames are integrated again in the pass proper like every other. + for (int i = 0; i < image_workers; ++i) + futures.push_back(std::async(std::launch::async, [&] { full_worker_impl(true); })); + for (auto &f: futures) + f.get(); + futures.clear(); + auto &outcomes = indexer->GetIntegrationOutcome(); + indexer->ScaleAllImages(MergeAll(experiment_, outcomes, config_.nthreads, stills_user_cell_), config_.nthreads); + const StillsPartialityRefine refine(experiment_); + double radial_scale = 1.0; + for (int i = 0; i < 3; ++i) + radial_scale = refine.MeasureRadialScale(outcomes, stills_user_cell_, radial_scale); + stills_run_width_ = refine.MeasureRunWidth(outcomes, stills_user_cell_, radial_scale); + for (const int o: window_frames) + outcomes[o] = IntegrationOutcome{}; + if (stills_run_width_) { + const auto k = static_cast(STILLS_WINDOW_SIGMAS); + indexer->SetStillsWindow(StillsWindow{.c0 = k * static_cast(stills_run_width_->gamma0), + .ang = k * static_cast(stills_run_width_->gamma_e), + .bw = k * static_cast(stills_run_width_->bandwidth_sigma), + .q_scale = static_cast(stills_run_width_->radial_scale)}); + Note(fmt::format("prediction window {:.1f} x the rocking width measured on {} frames, centred at " + "radial scale {:+.2e}", STILLS_WINDOW_SIGMAS, window_frames.size(), radial_scale - 1.0)); + } + } for (int i = 0; i < image_workers; ++i) futures.push_back(std::async(std::launch::async, worker)); for (auto &f: futures) diff --git a/rugnux/RugnuxInputKind.cpp b/rugnux/RugnuxInputKind.cpp new file mode 100644 index 000000000..565ead494 --- /dev/null +++ b/rugnux/RugnuxInputKind.cpp @@ -0,0 +1,137 @@ +// SPDX-FileCopyrightText: 2026 Filip Leonarski, Paul Scherrer Institute +// SPDX-License-Identifier: GPL-3.0-only + +#include "RugnuxInputKind.h" + +#include +#include +#include +#include + +#include + +const char *RugnuxInputKindName(RugnuxInputKind kind) { + switch (kind) { + case RugnuxInputKind::Images: return "images"; + case RugnuxInputKind::Model: return "model"; + case RugnuxInputKind::Reflections: return "reflections"; + case RugnuxInputKind::Ambiguous: return "ambiguous"; + } + return "?"; +} + +namespace { + // The record names a PDB file starts with (its first line that is not blank) + constexpr const char *PDB_RECORDS[] = {"HEADER", "TITLE ", "COMPND", "SOURCE", "KEYWDS", "EXPDTA", "AUTHOR", + "REVDAT", "REMARK", "SEQRES", "CRYST1", "MODEL ", "ATOM ", "HETATM"}; + + // The rule, fed one line at a time; done() once the answer cannot change. + class Sniffer { + enum class Text { Unknown, Cif, Pdb } text = Text::Unknown; + bool atoms = false, reflections = false; + std::optional decided; + public: + explicit Sniffer(const std::string &head) { + if (head.starts_with("MTZ ")) + decided = RugnuxInputKind::Reflections; + else if (head.starts_with("\x89HDF\r\n\x1a\n") || head.starts_with("###CBF") + || head.find('\0') != std::string::npos) + decided = RugnuxInputKind::Images; + } + bool done() const { return decided.has_value(); } + void line(const std::string &l) { + if (decided) + return; + if (text == Text::Unknown) { + const size_t i = l.find_first_not_of(" \t\r"); + if (i == std::string::npos || l[i] == '#') + return; + if (l.compare(i, 5, "data_") == 0) + text = Text::Cif; + else if (std::any_of(std::begin(PDB_RECORDS), std::end(PDB_RECORDS), + [&](const char *r) { return l.starts_with(r); })) + text = Text::Pdb; + else + decided = RugnuxInputKind::Images; // not a model nor reflections: for the image readers + } + if (text == Text::Pdb && (l.starts_with("ATOM ") || l.starts_with("HETATM"))) + decided = RugnuxInputKind::Model; + if (text == Text::Cif) { + if (l.starts_with("_array_data")) + decided = RugnuxInputKind::Images; // a CBF without its ###CBF line + atoms = atoms || l.starts_with("_atom_site."); + reflections = reflections || l.starts_with("_refln.") || l.starts_with("_diffrn_refln."); + } + } + RugnuxInputKind kind() const { + if (decided) + return *decided; + if (atoms && reflections) + return RugnuxInputKind::Ambiguous; + if (atoms) + return RugnuxInputKind::Model; + if (reflections) + return RugnuxInputKind::Reflections; + return RugnuxInputKind::Images; + } + }; + + // A text line is shorter than this + constexpr int MAX_LINE = 4096; + constexpr int HEAD = 16; +} + +RugnuxInputKind ClassifyRugnuxInputContent(const std::string &head, const std::vector &lines) { + Sniffer s(head); + for (const auto &l : lines) + s.line(l); + return s.kind(); +} + +RugnuxInputKind ClassifyRugnuxInput(const std::string &path) { + gzFile f = gzopen(path.c_str(), "rb"); + if (f == nullptr) + throw std::runtime_error("cannot open " + path); + std::string head(HEAD, '\0'); + head.resize(std::max(gzread(f, head.data(), HEAD), 0)); + Sniffer s(head); + gzrewind(f); + std::string buf(MAX_LINE, '\0'); + while (!s.done() && gzgets(f, buf.data(), MAX_LINE) != nullptr) { + std::string l(buf.c_str()); + if (!l.empty() && l.back() == '\n') + l.pop_back(); + s.line(l); + } + gzclose(f); + return s.kind(); +} + +RugnuxPositionalInputs SplitRugnuxInputs(const std::vector &paths) { + RugnuxPositionalInputs out; + for (const std::string &p : paths) { + // what is not a file (a missing path, a broker URL) is left to the image readers to report + const RugnuxInputKind kind = std::filesystem::is_regular_file(p) ? ClassifyRugnuxInput(p) + : RugnuxInputKind::Images; + switch (kind) { + case RugnuxInputKind::Images: + out.images.push_back(p); + break; + case RugnuxInputKind::Model: + if (!out.model.empty()) + throw std::runtime_error("two atomic models given, " + out.model + " and " + p + "; give one"); + out.model = p; + break; + case RugnuxInputKind::Reflections: + if (!out.reflections.empty()) + throw std::runtime_error("two reflection files given, " + out.reflections + " and " + p + + "; give one"); + out.reflections = p; + break; + case RugnuxInputKind::Ambiguous: + throw std::runtime_error(p + " holds both atomic coordinates (_atom_site) and reflections (_refln); " + "give it with --model or -z"); + } + } + return out; +} diff --git a/rugnux/RugnuxInputKind.h b/rugnux/RugnuxInputKind.h new file mode 100644 index 000000000..a34d23809 --- /dev/null +++ b/rugnux/RugnuxInputKind.h @@ -0,0 +1,37 @@ +// SPDX-FileCopyrightText: 2026 Filip Leonarski, Paul Scherrer Institute +// SPDX-License-Identifier: GPL-3.0-only + +#pragma once + +#include +#include + +// What a file given to rugnux as a positional argument holds, read from its contents, never its name, so that +// `rugnux ` works in any order without --model or -z: +// Reflections MTZ (the "MTZ " magic), or an mmCIF with a _refln or _diffrn_refln loop (a PDB -sf.cif) +// Model PDB (a file starting with a PDB record, with an ATOM or HETATM record), or an mmCIF with an +// _atom_site loop +// Images anything else - HDF5, CBF (an mmCIF-like file starting ###CBF, or with _array_data), and every +// other format the readers take, which then decide. A file whose first line is neither "data_" +// nor a PDB record is decided on that line, so an image file is not read through. +// An mmCIF holding both atoms and reflections is Ambiguous: it has to be given with --model or -z. Gzipped files +// are read through. +enum class RugnuxInputKind { Images, Model, Reflections, Ambiguous }; + +const char *RugnuxInputKindName(RugnuxInputKind kind); + +// Classifies a file (reads it, gunzipping where it is gzipped) +RugnuxInputKind ClassifyRugnuxInput(const std::string &path); + +// The rule itself, on decompressed content: `head` is the first 16 bytes, `lines` the lines from the start. +RugnuxInputKind ClassifyRugnuxInputContent(const std::string &head, const std::vector &lines); + +// The positional inputs of a rugnux command line, split by what they hold +struct RugnuxPositionalInputs { + std::vector images; + std::string model; // empty: none + std::string reflections; // empty: none +}; + +// Throws std::runtime_error (with a message for the user) on two models, two reflection files or an ambiguous file. +RugnuxPositionalInputs SplitRugnuxInputs(const std::vector &paths); diff --git a/rugnux/RugnuxLive.cpp b/rugnux/RugnuxLive.cpp index 886db699c..90cf5f755 100644 --- a/rugnux/RugnuxLive.cpp +++ b/rugnux/RugnuxLive.cpp @@ -56,6 +56,8 @@ RugnuxLiveSetup MakeRugnuxLiveSetup(const JFJochReaderDataset &dataset, int nthr c.measure_spot_budget = true; c.run_scaling = true; c.model = std::move(model); + // The placed model is refined, as in `rugnux`: the uploaded model is the opt-in. + c.refine = true; c.live = true; c.fast_live = true; // Decided late, on the whole sweep, as it re-checks its radius there - which fast_live does not. diff --git a/rugnux/RugnuxOutputFiles.cpp b/rugnux/RugnuxOutputFiles.cpp index ea118d3fd..e7d3e7a4e 100644 --- a/rugnux/RugnuxOutputFiles.cpp +++ b/rugnux/RugnuxOutputFiles.cpp @@ -12,6 +12,17 @@ namespace { +// The unexplained blobs of the refined model's difference map (DensityBlobs.h), strongest first. +void WriteDensityBlobs(const std::vector &blobs, const std::string &path, Logger &logger) { + std::ofstream f(path, std::ofstream::out | std::ofstream::trunc); + if (!f) { + logger.Warning("Cannot open {} for writing", path); + return; + } + f << DensityBlobsJson(DensityBlobsToMessage(blobs)); + logger.Info("Difference-map blobs written to {}", path); +} + // The files of one output pass at `prefix`, all but its _process.h5. void WriteOutputs(const RugnuxOutputs &o, const std::string &prefix, const OutputProvenance &provenance, size_t nthreads, Logger &logger) { @@ -30,6 +41,13 @@ void WriteOutputs(const RugnuxOutputs &o, const std::string &prefix, const Outpu if (o.model_prior_placed_model) WritePlacedModel(*o.model_prior_placed_model->model, o.model_prior_placed_model->cell, o.model_prior_placed_model->space_group, prefix + "_mr", logger); + if (o.refined_model) + WritePlacedModel(*o.refined_model->model, o.refined_model->cell, o.refined_model->space_group, + prefix + "_refined", logger); + if (o.refined_maps) + WriteModelMaps(*o.refined_maps, prefix + "_refined", logger); + if (o.blobs) + WriteDensityBlobs(*o.blobs, prefix + "_blobs.json", logger); if (o.unmerged) { WriteMtz(*o.unmerged, prefix + "_unmerged.mtz"); logger.Info("Unmerged observations written to {}_unmerged.mtz", prefix); @@ -105,20 +123,24 @@ void WriteRugnuxOutputs(const ProcessResult &result, const std::string &prefix, void WriteMergedOutput(const MergedOutput &merged, const std::string &prefix, const OutputProvenance &provenance, size_t nthreads, bool hkl) { - // An MTZ, an mmCIF and a SHELX HKLF-4 .hkl - each has its uses downstream (MTZ for the CCP4 / phenix + // An MTZ, an mmCIF and a SHELX HKLF-4 .hkl with its .ins - each has its uses downstream (MTZ for the CCP4 / phenix // reflection tools, mmCIF for deposition and as the self-describing native format, HKLF-4 for SHELXL // refinement and SHELXC / ANODE substructure solution). The .hkl holds the unmerged scaled fulls where the // merge provides them (rotation), the merged reflections otherwise (stills). const std::string file = prefix + merged.suffix; WriteMtz(merged.mtz, file + ".mtz"); + const CellEsd *esd = merged.cell_esd ? &*merged.cell_esd : nullptr; WriteMmcifReflections(merged.reflections, merged.cell, merged.experiment, merged.statistics, merged.error_model, - merged.twinning, provenance, file + ".cif", nthreads); + merged.twinning, provenance, file + ".cif", nthreads, esd); if (!hkl) return; if (!merged.scaled_fulls.empty()) WriteShelxHklReflections(merged.scaled_fulls, file + ".hkl", nthreads); else WriteShelxHklReflections(merged.reflections, merged.experiment, file + ".hkl", nthreads); + // The SHELX instructions beside it, with the cell's e.s.d.s as ZERR where the run measured them. + WriteShelxIns(merged.cell, esd, merged.experiment, std::filesystem::path(file).filename().string(), + file + ".ins"); } void WriteModelMaps(const ModelMaps &maps, const std::string &prefix, Logger &logger) { @@ -156,3 +178,29 @@ ReportDocument WriteResultReport(const std::string &output_prefix, } return doc; } + +ReportDocument WriteRefineOutputs(const RefineOnlyResult &result, const std::string &prefix, + const std::string &input_file, const std::string &model_file, Logger &logger, + const RunProvenance &provenance) { + ReportDocument doc = BuildRefineReportDocument(prefix, input_file, model_file, result, provenance); + if (prefix.empty()) + return doc; + const RefinementResult &rf = result.refinement; + if (rf.ok) { + const gemmi::SpaceGroup *sg = gemmi::find_spacegroup_by_name(result.space_group); + const gemmi::UnitCell &c = rf.model->cell; + const UnitCell cell{static_cast(c.a), static_cast(c.b), static_cast(c.c), + static_cast(c.alpha), static_cast(c.beta), static_cast(c.gamma)}; + WritePlacedModel(*rf.model, cell, *sg, prefix + "_refined", logger); + WriteModelMaps(*rf.maps, prefix + "_refined", logger); + WriteDensityBlobs(rf.blobs, prefix + "_blobs.json", logger); + } + try { + std::ofstream file(prefix + "_report.txt"); + file.exceptions(std::ios::failbit | std::ios::badbit); + file << RenderReportText(doc, provenance.developer); + } catch (const std::exception &e) { + logger.Warning("Could not write the results report {}_report.txt: {}", prefix, e.what()); + } + return doc; +} diff --git a/rugnux/RugnuxOutputFiles.h b/rugnux/RugnuxOutputFiles.h index 5821bd21c..ee3cab6af 100644 --- a/rugnux/RugnuxOutputFiles.h +++ b/rugnux/RugnuxOutputFiles.h @@ -42,6 +42,12 @@ void WriteMergedOutput(const MergedOutput &merged, const std::string &prefix, co // A model validation's map coefficients at `prefix`: _maps.mtz. void WriteModelMaps(const ModelMaps &maps, const std::string &prefix, Logger &logger); +// --mode refine's files under `prefix`: _refined_model.cif, _refined_maps.mtz, _blobs.json +// and _report.txt; returns the report's document. Writes nothing when the prefix is empty. +ReportDocument WriteRefineOutputs(const RefineOnlyResult &result, const std::string &prefix, + const std::string &input_file, const std::string &model_file, Logger &logger, + const RunProvenance &provenance = {}); + // _plot.txt (PerImagePlotText). void WritePerImagePlot(const std::string &prefix, const PerImagePlot &plot); diff --git a/rugnux/RugnuxPreScan.cpp b/rugnux/RugnuxPreScan.cpp index 9534da056..582eb6294 100644 --- a/rugnux/RugnuxPreScan.cpp +++ b/rugnux/RugnuxPreScan.cpp @@ -199,6 +199,10 @@ void Rugnux::PreScan(int start_image, int images_to_process, int frame_count, Ru const bool have_shadow = std::any_of(current.begin(), current.end(), [](uint32_t v) { return (v & (1u << PixelMask::BeamStopPixelBit)) != 0; }); const bool want_shadow = config_.detect_beam_stop.has_value() && !have_shadow; + // The plane was decided with that shadow; a pass that starts again from an experiment taken before + // the decision (the measured-centre arm, the no-lattice pass) carries it on rather than the stated one. + if (have_shadow && polarization_from_background_) + experiment_.PolarizationFactor(polarization_from_background_); // The spot width is a property of the crystal, not of the geometry, so the second pass reuses the // radius the first one measured rather than re-reading the frames. const bool want_width = config_.adaptive_integration_radius && !spot_width_measured_; @@ -978,6 +982,7 @@ void Rugnux::PreScan(int start_image, int images_to_process, int frame_count, Ru // Where the scattered background puts the beam, when the projection exists to say so. std::optional> ring_centre; std::vector opaque_shadow; + std::vector dead_pixels; // reported by the shadow finder, counted nothing (below) // The mean projection, taken once and shared read-only by everything below that reads it - the // ring-centre fit here, and the diagnostic picture and the beam-centre capture on threads of // their own. It is 4 bytes a pixel, and a copy for each of them was a copy on this thread. @@ -1028,6 +1033,12 @@ void Rugnux::PreScan(int start_image, int images_to_process, int frame_count, Ru shadow = finder->GetMask(config_.nthreads); shadow_frames = finder->GetFrameCount(); polarization = finder->GetAppliedPolarization(); + if (const auto e = finder->GetPlaneEvidence()) + logger.Info("Polarization plane: the background's cos 2phi harmonic has correlation {:+.3f} and " + "modulation {:+.3f} against a polarized source's (positive towards the plane turned by " + "90 degrees from lab x; the plane follows the background beyond {} and {}, the " + "modulation under {})", e->correlation, e->modulation, shadow_finder::PLANE_CORRELATION, + shadow_finder::PLANE_MODULATION, shadow_finder::PLANE_MODULATION_MAX); finder.reset(); BeamStopMemo::Entry entry{shadow_key, {}, projection, ring_centre, centre_line, frames_read.load(), @@ -1051,7 +1062,24 @@ void Rugnux::PreScan(int start_image, int images_to_process, int frame_count, Ru *polarization); Note("polarization plane taken from the background, turned by 90 degrees"); experiment_.PolarizationFactor(polarization); + polarization_from_background_ = polarization; } + // A pixel whose mean is negative holds the detector's own mark for no data - a module gap a PILATUS + // CBF leaves at -1 - and is the darkest pixel there is, so the shadow finder reports it. It is dead + // rather than shadowed, and goes to the defective pixels (after MaskDefectivePixels below), so that + // the shadow bit holds only what something in the beam shadowed: what the share reported here + // counts, and what the integration's shadow test reads (MXAnalysisWithoutFPGA::DropShadowClipped). + // A mean of zero is not enough: a deep shadow on a low background counts nothing in the frames + // projected, and on a still it often does. + dead_pixels.assign(shadow.size(), 0); + for (size_t i = 0; i < shadow.size(); i++) + if (shadow[i] != 0 && !((*projection)[i] > -0.5f)) { + shadow[i] = 0; + dead_pixels[i] = 1; + } + if (const auto dead = std::count(dead_pixels.begin(), dead_pixels.end(), 1u); dead > 0) + logger.Info("Beam stop: {} pixels reading the detector's no-data mark in {} images are masked as dead, " + "not as shadow", dead, shadow_frames); const auto shadowed = std::count_if(shadow.begin(), shadow.end(), [](uint32_t v) { return v != 0; }); pixel_mask_.LoadBeamStopMask(experiment_, shadow); opaque_shadow = shadow; @@ -1107,6 +1135,12 @@ void Rugnux::PreScan(int start_image, int images_to_process, int frame_count, Ru measured.emplace(); MaskDefectivePixels(start_image, shadow_sample, ring_centre, frame, measured->defects); } + if (!dead_pixels.empty()) { + const auto &m = pixel_mask_.GetMask(); + for (size_t i = 0; i < m.size(); i++) + dead_pixels[i] |= (m[i] >> PixelMask::HotPixelBit) & 1u; + pixel_mask_.LoadHotPixelMask(experiment_, dead_pixels); + } // The centre is fitted with the shadow masked but NOT the transmitting pieces the shadow finder // adds after it. Their dimming is multiplicative in azimuth, which the fit's per-sector amplitude diff --git a/rugnux/RugnuxRefine.cpp b/rugnux/RugnuxRefine.cpp new file mode 100644 index 000000000..8d897eab6 --- /dev/null +++ b/rugnux/RugnuxRefine.cpp @@ -0,0 +1,59 @@ +// SPDX-FileCopyrightText: 2026 Filip Leonarski, Paul Scherrer Institute +// SPDX-License-Identifier: GPL-3.0-only + +#include "RugnuxRefine.h" + +#include + +#include "../common/UnitCell.h" +#include "../image_analysis/scale_merge/FrenchWilson.h" +#include "../image_analysis/scale_merge/RfreeFlags.h" + +RefineOnlyResult RunRefineOnly(RugnuxReflections data, const gemmi::Structure &model, double d_min_limit, + const RefinementSettings &settings, Logger &logger) { + RefineOnlyResult out; + out.d_min_limit = d_min_limit; + out.score_only = settings.score_only; + const gemmi::SpaceGroup *sg = gemmi::find_spacegroup_by_name(data.space_group); + if (sg == nullptr) { + out.refinement.failure_reason = "unknown space group " + data.space_group; + return out; + } + out.space_group = sg->xhm(); + out.wavelength_A = data.wavelength_A > 0 ? data.wavelength_A : 1.0; + std::vector &refl = data.reflections; + if (d_min_limit > 0) + std::erase_if(refl, [&](const MergedReflection &r) { return r.d < d_min_limit; }); + if (!data.amplitudes) { + FrenchWilsonOptions fw; + fw.num_threads = static_cast(settings.nthreads); + ApplyFrenchWilson(refl, *sg, fw); + out.french_wilson = true; + } + std::erase_if(refl, [](const MergedReflection &r) { return !std::isfinite(r.F); }); + if (data.free_column.empty()) { + const UnitCell cell{static_cast(data.cell.a), static_cast(data.cell.b), + static_cast(data.cell.c), static_cast(data.cell.alpha), + static_cast(data.cell.beta), static_cast(data.cell.gamma)}; + AssignRfreeFlags(refl, *sg, 0.05, 500, cell, settings.nthreads); + out.free_flags_generated = true; + } + out.reflections = static_cast(refl.size()); + for (const MergedReflection &r : refl) + out.free_reflections += r.rfree_flag; + logger.Info("Refinement input: {} ({}), {} {} in {}, {} free ({}){}", data.name, data.source, refl.size(), + data.amplitudes ? "amplitudes " + data.value_column + : "amplitudes by French-Wilson from " + data.value_column, + out.space_group, out.free_reflections, + out.free_flags_generated ? "drawn here, the file has no free set" : "column " + data.free_column, + d_min_limit > 0 ? fmt::format(", to {:.2f} A", d_min_limit) : std::string()); + if (const gemmi::SpaceGroup *msg = model.find_spacegroup(); msg != nullptr && msg->number != sg->number) + logger.Warning("The model names space group {}, the data {}: refined in the data's", msg->xhm(), sg->xhm()); + try { + out.refinement = RefineModel(model, refl, data.cell, *sg, out.wavelength_A, logger, settings); + } catch (const std::exception &e) { + out.refinement = RefinementResult(); + out.refinement.failure_reason = std::string("refinement failed: ") + e.what(); + } + return out; +} diff --git a/rugnux/RugnuxRefine.h b/rugnux/RugnuxRefine.h new file mode 100644 index 000000000..78e2bf2af --- /dev/null +++ b/rugnux/RugnuxRefine.h @@ -0,0 +1,31 @@ +// SPDX-FileCopyrightText: 2026 Filip Leonarski, Paul Scherrer Institute +// SPDX-License-Identifier: GPL-3.0-only + +#pragma once + +#include + +#include "gemmi/model.hpp" + +#include "../common/Logger.h" +#include "../image_analysis/structure_refinement/Refinement.h" +#include "../writer/RugnuxReflectionFile.h" + +// rugnux --mode refine: a model refined against merged structure factors it is given, nothing processed. The +// reflections and the model come in parsed (RugnuxReflectionFile.h, RugnuxModelFile.h); the refinement and what +// had to be made of the input to run it go out. No file is read or written here. +struct RefineOnlyResult { + RefinementResult refinement; + std::string space_group; // the data's, which the model is refined in + double wavelength_A = 0; // the file's, or 1 A where it states none + bool french_wilson = false; // amplitudes made here from the file's intensities + bool free_flags_generated = false; // the file has no free set: one was drawn here (AssignRfreeFlags) + int reflections = 0; // amplitudes refined against, after the resolution limit + int free_reflections = 0; + double d_min_limit = 0; // the limit asked for (0: none) + bool score_only = false; // the model only scored (RefinementSettings::score_only) +}; + +// `data` as parsed; `d_min_limit`: leave out reflections finer than this (0: keep all). +RefineOnlyResult RunRefineOnly(RugnuxReflections data, const gemmi::Structure &model, double d_min_limit, + const RefinementSettings &settings, Logger &logger); diff --git a/rugnux/RugnuxScaleMerge.cpp b/rugnux/RugnuxScaleMerge.cpp index 815b0edec..fc1cc42de 100644 --- a/rugnux/RugnuxScaleMerge.cpp +++ b/rugnux/RugnuxScaleMerge.cpp @@ -76,6 +76,7 @@ #include "../image_analysis/scale_merge/ScaleOnTheFly.h" #include "../image_analysis/scale_merge/StillsPartialityRefine.h" #include "../image_analysis/scale_merge/SublatticeRelabel.h" +#include "../image_analysis/scale_merge/ReferenceFreeReindex.h" #include "../image_analysis/WriteReflections.h" #include "../image_analysis/bragg_integration/CalcISigma.h" #include "../common/Definitions.h" @@ -88,6 +89,73 @@ using namespace rugnux_internal; namespace { + // The space-group search's resolution cut on a P1 merge: where the best non-increasing fit of its + // thin-shell drops under 1 (0: no cut). See the search below. + double SearchCut(const std::vector &merged) { + double d_min_search = 0.0; + std::vector> rs; // (d, I/sigma) over the full P1 merge + rs.reserve(merged.size()); + for (const auto &m : merged) + if (std::isfinite(m.I) && std::isfinite(m.sigma) && m.sigma > 0.0f && + std::isfinite(m.d) && m.d > 0.0f) + rs.emplace_back(m.d, m.I / m.sigma); + if (rs.size() >= 400) { + std::sort(rs.begin(), rs.end(), + [](const auto &a, const auto &b) { return a.first > b.first; }); // low -> high res + const int bins = std::clamp(static_cast(rs.size() / 100), 1, 40); + const size_t per = (rs.size() + bins - 1) / static_cast(bins); + // The shell means, then their best NON-INCREASING fit (pool adjacent violators, weighted + // by shell size). The cut is where the FIT drops under 1, not where the first shell + // does: on a merge whose is flat near 1 - its ISa has collapsed - the first + // single shell to dip under 1 is a coin toss that moved the cut from 0.85 to 1.19 A + // between two compiler flags on one crystal, and the coarser cut left its glide zones + // too few absences to be judged. The fit moves by as much as its input does. + std::vector mean, weight; + for (size_t lo = 0; lo < rs.size(); lo += per) { + const size_t hi = std::min(rs.size(), lo + per); + double sum = 0.0; + for (size_t j = lo; j < hi; ++j) sum += rs[j].second; + mean.push_back(sum / static_cast(hi - lo)); + weight.push_back(static_cast(hi - lo)); + } + std::vector block_mean, block_weight; + std::vector block_size; + for (size_t b = 0; b < mean.size(); ++b) { + block_mean.push_back(mean[b]); block_weight.push_back(weight[b]); block_size.push_back(1); + while (block_mean.size() > 1 && block_mean[block_mean.size() - 2] < block_mean.back()) { + const size_t k = block_mean.size() - 1; + const double w = block_weight[k - 1] + block_weight[k]; + block_mean[k - 1] = (block_mean[k - 1] * block_weight[k - 1] + block_mean[k] * block_weight[k]) / w; + block_weight[k - 1] = w; + block_size[k - 1] += block_size[k]; + block_mean.pop_back(); block_weight.pop_back(); block_size.pop_back(); + } + } + std::vector fit; + for (size_t k = 0; k < block_mean.size(); ++k) + fit.insert(fit.end(), block_size[k], block_mean[k]); + for (size_t b = 0; b < fit.size(); ++b) { + const size_t lo = b * per; + if (fit[b] < 1.0) { + // Cut the noise-dominated high-res shells. When even the lowest-res shell fails, + // keep that shell alone rather than abandoning the cut. The bound is absolute + // while the merged I/sigma it tests saturates at the merge's own ISa (times the + // square root of the multiplicity), so a merge whose ISa has collapsed towards 1 + // can fail it in every shell - and that is exactly the merge the search must not + // be handed whole, since the noise which drove ISa down is what the cut exists to + // remove. Abandoning it feeds back: more noise into the search, a weaker operator + // statistic, and a lost symmetry. + if (b > 0) + d_min_search = rs[lo].first; + else if (per >= 400) + d_min_search = rs[per - 1].first; + break; + } + } + } + return d_min_search; + } + // How precisely the measured beam centre has to be placed before the post-refinement takes it as a // second place the centre is believed to be (the bound on its beam move). The ceiling is the larger // of this and what the geometry asks of the centre (BeamCenterNeed_pxl). @@ -469,6 +537,9 @@ bool Rugnux::ScaleMergeAndSymmetry(PipelineLocals &p) { }; phase("Scaling and merging"); Step(geometry_prepass ? "Scaling and post-refinement" : "Scaling and merging"); + // Whether the reflections the engine ingested are still indexed as they were (the final merge made + // ahead, below): every change of basis of the integrated reflections clears it. + bool spec_same_ingest = true; // Ice-ring handling (--detect-ice-rings): flag reflections sitting on a hexagonal-ice powder // ring. Their integrated intensity is contaminated by the strong, variable ice background, so @@ -505,8 +576,32 @@ bool Rugnux::ScaleMergeAndSymmetry(PipelineLocals &p) { // drops the whole rocking event) - they are the strongest reflections, mostly at low resolution, // and what a model's low-resolution terms rest on. The ice flags are set in the same sweep. Integer // counts, one image per task: the totals do not depend on the split. + TimingMark ends_mark(logger, "sweep ends, overloads, ice rings"); + // One walk over the reflections, per frame, for all three: what the sweep ends are decided on, the + // overload counts and the ice flags. The counts are added up below over the frames still in. + auto &outcomes = indexer->GetIntegrationOutcome(); + struct FrameCounts { int64_t all = 0, low = 0, over = 0, over_low = 0, on_ice = 0; }; + std::vector tally(outcomes.size()); + std::vector counts(outcomes.size()); + ParallelFor(static_cast(outcomes.size()), config_.nthreads, [&](int o) { + tally[o] = TallySweepEnd(outcomes[o]); + FrameCounts &c = counts[o]; + for (auto &r : outcomes[o].reflections) { + const bool low_res = r.d >= OVERLOAD_LOW_RES_A; + ++c.all; + c.low += low_res; + if (r.overloaded) { + ++c.over; + c.over_low += low_res; + } + if (flag_ice) { + r.on_ice_ring = IsOnIceRing(r.d, ice_width); + c.on_ice += r.on_ice_ring; + } + } + }); if (experiment_.IsRotationIndexing()) { - const auto [at_start, at_end] = TrimBlankSweepEnds(indexer->GetIntegrationOutcome(), config_.nthreads); + const auto [at_start, at_end] = TrimBlankSweepEnds(outcomes, tally); result.blank_start_frames = at_start; result.blank_end_frames = at_end; if (at_start + at_end > 0) @@ -516,7 +611,6 @@ bool Rugnux::ScaleMergeAndSymmetry(PipelineLocals &p) { // Stills given a cell: only the frames whose refined cell belongs to its population are merged // (see GivenCellPopulation) - a second crystal form, fitted to the same cell, is left out. if (!experiment_.IsRotationIndexing() && stills_user_cell_) { - auto &outcomes = indexer->GetIntegrationOutcome(); const double given = CrystalLattice(*stills_user_cell_).CalcVolume(); std::vector rel; for (const auto &o : outcomes) @@ -548,25 +642,13 @@ bool Rugnux::ScaleMergeAndSymmetry(PipelineLocals &p) { } size_t ice_flagged = 0, ice_total = 0; { - auto &outcomes = indexer->GetIntegrationOutcome(); - std::atomic n_all{0}, n_low{0}, n_over{0}, n_over_low{0}, n_ice{0}; - ParallelFor(static_cast(outcomes.size()), config_.nthreads, [&](int o) { - int64_t all = 0, low = 0, over = 0, over_low = 0, on_ice = 0; - for (auto &r : outcomes[o].reflections) { - const bool low_res = r.d >= OVERLOAD_LOW_RES_A; - ++all; - low += low_res; - if (r.overloaded) { - ++over; - over_low += low_res; - } - if (flag_ice) { - r.on_ice_ring = IsOnIceRing(r.d, ice_width); - on_ice += r.on_ice_ring; - } - } - n_all += all; n_low += low; n_over += over; n_over_low += over_low; n_ice += on_ice; - }); + int64_t n_all = 0, n_low = 0, n_over = 0, n_over_low = 0, n_ice = 0; + for (size_t o = 0; o < outcomes.size(); ++o) { + if (outcomes[o].reflections.empty()) // a frame left out above counts nothing + continue; + const FrameCounts &c = counts[o]; + n_all += c.all; n_low += c.low; n_over += c.over; n_over_low += c.over_low; n_ice += c.on_ice; + } result.integrated_reflections += n_all; result.integrated_reflections_low_res += n_low; result.overloaded_reflections += n_over; @@ -584,6 +666,7 @@ bool Rugnux::ScaleMergeAndSymmetry(PipelineLocals &p) { result.integrated_reflections_low_res, OVERLOAD_LOW_RES_A); } + ends_mark.Stop(); if (experiment_.IsDetectIceRings() && !ice_present) { logger.Info("Ice-ring handling: measured ice score {:.2f} < {:.2f} and spot ratio {:.2f} < " "{:.2f}, no ice detected - ice-ring handling skipped entirely", @@ -671,6 +754,7 @@ bool Rugnux::ScaleMergeAndSymmetry(PipelineLocals &p) { r.l = static_cast(std::lround(reindex.a[2][0]*h + reindex.a[2][1]*k + reindex.a[2][2]*l)); } } + spec_same_ingest = false; result.consensus_cell = cand.conventional.GetUnitCell(); result.consensus_centering = cand.centering; end_msg.unit_cell = result.consensus_cell; @@ -697,6 +781,7 @@ bool Rugnux::ScaleMergeAndSymmetry(PipelineLocals &p) { r.h = h[0]; r.k = h[1]; r.l = h[2]; } }); + spec_same_ingest = false; result.consensus_cell = CellInBasis(*result.consensus_cell, cob); end_msg.unit_cell = result.consensus_cell; if (end_msg.rotation_lattice.has_value()) @@ -1207,6 +1292,40 @@ bool Rugnux::ScaleMergeAndSymmetry(PipelineLocals &p) { // a search that turns out not to need it (no point group from the first arm) does not read it. // Declared before the future, which waits for the merge when it goes, so the engine outlives it. std::unique_ptr rsm_all; + // The final merge made ahead: copies of the engine merging, beside the P1 merges, the search and the + // decisions, in the groups the run is expected to adopt - the one a search of the geometry pre-pass's + // merge predicted (predicted_group_), and the first arm's where that differs - each on a spare card + // (cards_ahead). Taken where the decision lands on that group on this ingest: no merge depends on the + // merges before it (RunArm), so it is the merge the engine would make. A decision that re-indexes the + // reflections clears spec_same_ingest. A deque, so that a second one does not move the first under its + // thread; declared before anything a merge reads, as rsm_all. + struct MergeAhead { + gemmi::SpaceGroup group; + std::unique_ptr rsm; + Logger log = Logger::Buffered(); + // ... with the intensity statistics for the centre on it (below), which read that merge alone. + std::future> ahead; + }; + std::deque merges_ahead; + std::vector cards_ahead; // the cards one may go on, in the order they are taken (below) + const auto merge_ahead = [&](const gemmi::SpaceGroup &g) { + MergeAhead &m = merges_ahead.emplace_back(); + m.group = g; + m.rsm = rsm->CloneIngest(cards_ahead[merges_ahead.size() - 1], m.log); + // As scale_and_merge sets them for the merge that may be written. + m.rsm->SetExportScaledFulls(write_output && config_.write_merged); + m.rsm->SetFrenchWilson(false); + m.rsm->IngestDevice(&*rsm); + m.ahead = std::async(std::launch::async, [&m, nthreads = config_.nthreads] { + pin_gpu(m.rsm->GetGpuDevice()); + TimingMark mark(m.log, "merge " + m.group.short_name() + " (ahead)"); + auto r = m.rsm->Run(/*for_search=*/false, /*full_stats=*/true, + /*measure_cc_before_corrections=*/false, &m.group); + mark.Stop(); + CentreOfSymmetryResult centre = AnalyzeCentreOfSymmetry(r.merged, m.group, nthreads); + return std::make_pair(std::move(r), std::move(centre)); + }); + }; Logger all_arm_log = Logger::Buffered(); std::future all_arm_ahead; const auto start_all_arm = [&rsm_all, &all_arm_log] { @@ -1323,6 +1442,72 @@ bool Rugnux::ScaleMergeAndSymmetry(PipelineLocals &p) { p.postrefine_ahead.wait(); postrefine_beside = false; } + // The cards for the merges made ahead (merges_ahead), decided here from the card count so that a run + // on one card is exactly what it is without them: spare cards only - card 3 from four cards up, then + // card 2, the all-observation arm's, whose merge is done when a second one is asked for; on two or + // three cards the last card, beside the engine already there, where one more engine fits its total + // memory. And only where one more merge fits the host budget. GPU engines only: on the host it would + // take the threads the chain runs on. + if (!geometry_prepass && !experiment_.GetGemmiSpaceGroup().has_value() && config_.reference_data.empty() + && write_output && cards >= 2 && rsm->OnGPU()) { + const bool host_fits = host_engine + (all_arm ? 3 : 2) * host_merge + + (postrefine_beside ? host_postrefine : 0) <= host_budget_; + if (cards >= 4) + cards_ahead = {3, 2}; + else if ((2 + (all_arm && all_arm_device == cards - 1 ? 1 : 0)) * rsm->DeviceBytes() + CARD_BYTES_RESERVED + <= get_gpu_total_memory(cards - 1)) + cards_ahead = {cards - 1}; + if (!host_fits) + cards_ahead.clear(); + logger.Debug("Final merge ahead: {}", !host_fits ? "no room on the host" : cards_ahead.empty() + ? "no room on a card" : fmt::format("on card {}, {} at most", cards_ahead.front(), cards_ahead.size())); + } + if (!cards_ahead.empty() && p.gpu_merge) + p.gpu_merge->Holds(((all_arm ? 2 : 1) + cards_ahead.size()) * rsm->DeviceBytes()); + // The geometry pre-pass decides no group, but a search of a P1 merge of ALL its observations predicts + // the one the canonical pass will most likely adopt, and that pass merges in it ahead (merges_ahead). + // All observations, on a copy of the engine, because the pre-pass's own merge is Lorentz-filtered and + // a screw axis is read on the weak reflections the filter discards: searched on that merge a 4(1) + // crystal was predicted as its symmorphic group every time. On the last card, beside the rest of the + // pre-pass and the second pass, under the same card and host rule as a merge ahead; set up as the + // canonical search is. It decides nothing. + if (geometry_prepass && !experiment_.GetGemmiSpaceGroup().has_value() && config_.reference_data.empty() + && cards >= 2 && rsm->OnGPU() && rsm->GetSearchMinZeta() > 0.0 + && host_engine + 2 * host_merge + (postrefine_beside ? host_postrefine : 0) <= host_budget_ + && (cards >= 4 || 2 * rsm->DeviceBytes() + CARD_BYTES_RESERVED <= get_gpu_total_memory(cards - 1))) { + struct Prediction { + Logger log = Logger::Buffered(); + std::unique_ptr rsm; + }; + auto prediction = std::make_shared(); + prediction->rsm = rsm->CloneIngest(cards - 1, prediction->log); + prediction->rsm->SetSearchMinZeta(0.0); + prediction->rsm->SetExportScaledFulls(false); + prediction->rsm->SetFrenchWilson(false); + prediction->rsm->IngestDevice(&*rsm); + SearchSpaceGroupOptions o; + o.nthreads = static_cast(std::max(1, config_.nthreads)); + o.merge_friedel = experiment_.GetScalingSettings().GetMergeFriedel(); + if (end_msg.rotation_lattice_type.has_value()) { + o.lattice_system = end_msg.rotation_lattice_type->crystal_system; + o.lattice_centring = end_msg.rotation_lattice_type->centering; + } + if (result.consensus_cell.has_value()) + o.cell = gemmi::UnitCell(*result.consensus_cell); + o.enumerate_all_settings = true; + o.enumerate_all_rotation_sets = true; + const double d_manual = experiment_.GetScalingSettings().GetHighResolutionLimit_A().value_or(0.0); + predicted_group_ = std::async(std::launch::async, [prediction, o, d_manual]() mutable + -> std::optional { + pin_gpu(prediction->rsm->GetGpuDevice()); + auto merge = prediction->rsm->Run(/*for_search=*/true, /*full_stats=*/false, + /*measure_cc_before_corrections=*/false); + prediction.reset(); // the card is given back before the search + o.d_min_limit_A = std::max(SearchCut(merge.merged), d_manual); + o.merge_isa = merge.isa; + return SearchSpaceGroup(merge.merged, o).best_space_group; + }).share(); + } bool all_arm_beside = false; if (all_arm) { rsm_all = rsm->CloneIngest(all_arm_device, all_arm_log); @@ -1346,6 +1531,19 @@ bool Rugnux::ScaleMergeAndSymmetry(PipelineLocals &p) { if (all_arm_beside) all_arm_ahead = start_all_arm(); } + // The pre-pass's prediction, where it is in: a search still running is one the merge is not waited for. + if (!cards_ahead.empty() && predicted_group_.valid() + && predicted_group_.wait_for(std::chrono::seconds(0)) == std::future_status::ready) { + std::optional predicted; + try { + predicted = predicted_group_.get(); + } catch (const std::exception &e) { + logger.Debug("Final merge ahead: the pre-pass search failed ({})", e.what()); + } + logger.Debug("Final merge ahead: the pre-pass predicts {}", predicted ? predicted->xhm() : "no group"); + if (predicted) + merge_ahead(*predicted); + } } // The geometry pre-pass reads the per-image reflections exactly twice more: they were just @@ -1427,7 +1625,8 @@ bool Rugnux::ScaleMergeAndSymmetry(PipelineLocals &p) { phase("Partiality post-refine (" + label + ")"); TimingMark refine_mark(logger, "stills partiality post-refine " + label); StillsPartialityRefine refiner(experiment_); - const double mean_tilt = refiner.Run(indexer->GetIntegrationOutcome(), config_.nthreads, result.consensus_cell); + const double mean_tilt = refiner.Run(indexer->GetIntegrationOutcome(), config_.nthreads, result.consensus_cell, + stills_run_width_, &end_msg.stills_run_width); logger.Info("Stills partiality post-refine: mean |dpsi| = {:.3f} deg", mean_tilt); // The refine fits its OWN per-image scale, with no floor, and adopts it unconditionally // when the image has no prior CC - which is exactly the state the guard above leaves. So @@ -1493,6 +1692,7 @@ bool Rugnux::ScaleMergeAndSymmetry(PipelineLocals &p) { { // stills: no asymptote tier, and its ISa already IS the whole-range 1/b const auto em = ToXdsErrorModel(merge_engine.ErrorModelA(), merge_engine.ErrorModelB()); result.error_model_isa = em.isa; + result.error_model_isa_resolved = merge_engine.ErrorModelBResolved(); result.error_model_a = em.a; result.error_model_b = em.b; } @@ -1507,6 +1707,25 @@ bool Rugnux::ScaleMergeAndSymmetry(PipelineLocals &p) { const bool guard_beside = merge_first_part && guard_ahead.valid(); if (guard_beside) rsm->SetWriteBackPerFrameScale(false); + // Stills with a reference or a model: each image was put into the indexing that agrees best with it, + // image by image. Where the crystals' own cells decide an indexing, those cells come first, and the + // reference decides only the crystals they leave open. Before the relabel below, which changes axes. + if (!rsm && ambiguity_reference && result.consensus_cell && experiment_.GetUnitCell() + && experiment_.GetGemmiSpaceGroup()) { + const auto ops = ReindexAmbiguityOperators(*experiment_.GetUnitCell(), experiment_.GetSpaceGroupOrP1()); + if (!ops.empty()) { + const auto anchored = AnchorReferenceReindex(indexer->GetIntegrationOutcome(), *result.consensus_cell, + ops); + for (size_t i = 0; i < ops.size(); ++i) + logger.Info("Indexing ambiguity {}: {:.1f}% of the crystals' own cells fit better as indexed{}", + IndexTriplet(ops[i]), 100.0 * anchored.metric_preference[i], + anchored.metric_preference[i] >= METRIC_DECIDED + ? " - the cells decide it; the reference decides only crystals whose cell does not" + : ""); + logger.Info("Indexing ambiguity: {} crystal(s) the reference had put against their own cell kept " + "in an indexing the cell allows", anchored.overruled); + } + } // Stills: a crystal indexed in a lattice that contains the run's - an axis multiple, or the run's in // another setting - is put on the run's cell before anything is scaled, rather than left out. if (!rsm && result.consensus_cell) { @@ -1517,6 +1736,47 @@ bool Rugnux::ScaleMergeAndSymmetry(PipelineLocals &p) { relabel.frames, relabel.reflections_kept, relabel.reflections_dropped); } const auto initial_sg = experiment_.GetGemmiSpaceGroup(); + // Stills in a group whose lattice admits alternative indexings: each crystal was indexed in one of + // them at random. With a reference or a model each image has already been put into the reference's + // (IndexAndRefine::ScaleImage); without one the indexings are made consistent here, from the data + // alone, before anything is scaled. With one, the same is done only to measure it against the + // reference's answer. + if (!rsm && initial_sg && result.consensus_cell) { + const auto ops = ReindexAmbiguityOperators(*result.consensus_cell, *initial_sg); + if (!ops.empty()) { + const auto t0 = std::chrono::steady_clock::now(); + const auto rf = ResolveReindexReferenceFree(indexer->GetIntegrationOutcome(), experiment_, + *result.consensus_cell, ops, config_.nthreads, + /*apply=*/!ambiguity_reference); + result.ambiguity_time_s = std::chrono::duration(std::chrono::steady_clock::now() - t0).count(); + for (size_t i = 0; i < ops.size(); ++i) + logger.Info("Indexing ambiguity {}: {:.1f}% of the crystals' own cells fit better as indexed{}", + IndexTriplet(ops[i]), 100.0 * rf.metric_preference[i], + rf.metric_preference[i] >= METRIC_DECIDED + ? " - the cells decide it; only crystals whose cell does not are decided by " + "the intensities" : ""); + result.ambiguity_reference_free = true; + result.ambiguity_reference_free_applied = !ambiguity_reference; + result.ambiguity_crystals = rf.crystals; + result.ambiguity_reindexed = rf.reindexed; + result.ambiguity_separation_sigma = rf.median_sigma; + result.ambiguity_decided_fraction = rf.decided_fraction; + if (!ambiguity_reference) + logger.Info("Indexing ambiguity resolved from the data: {} of {} crystals reindexed; median " + "separation {:.1f} sigma, {:.0f}% of crystals decided at over 3 sigma (CC with the " + "rest {:.3f} as chosen, {:.3f} otherwise); {} sweeps, {:.2f} s", + rf.reindexed, rf.crystals, rf.median_sigma, 100.0 * rf.decided_fraction, + rf.cc_chosen, rf.cc_other, rf.sweeps, result.ambiguity_time_s); + else + logger.Info("Indexing ambiguity from the data alone, against the reference's: it would put {} " + "of {} crystals into another indexing; median separation {:.1f} sigma, {:.0f}% of " + "crystals decided at over 3 sigma; {:.2f} s", rf.reindexed, rf.crystals, + rf.median_sigma, 100.0 * rf.decided_fraction, result.ambiguity_time_s); + Note(fmt::format("indexing ambiguity from the data: {} of {} crystals {}", rf.reindexed, rf.crystals, + ambiguity_reference ? "disagree with the reference" : "reindexed")); + ambiguity_reference = true; + } + } auto sm = scale_and_merge(initial_sg ? initial_sg->short_name() : "P1", !initial_sg.has_value(), /*measure_cc=*/true); if (guard_beside) { @@ -1695,66 +1955,7 @@ bool Rugnux::ScaleMergeAndSymmetry(PipelineLocals &p) { double d_min_search = 0.0; if (search_space_group) { - std::vector> rs; // (d, I/sigma) over the full P1 merge - rs.reserve(sm.merged.size()); - for (const auto &m : sm.merged) - if (std::isfinite(m.I) && std::isfinite(m.sigma) && m.sigma > 0.0f && - std::isfinite(m.d) && m.d > 0.0f) - rs.emplace_back(m.d, m.I / m.sigma); - if (rs.size() >= 400) { - std::sort(rs.begin(), rs.end(), - [](const auto &a, const auto &b) { return a.first > b.first; }); // low -> high res - const int bins = std::clamp(static_cast(rs.size() / 100), 1, 40); - const size_t per = (rs.size() + bins - 1) / static_cast(bins); - // The shell means, then their best NON-INCREASING fit (pool adjacent violators, weighted - // by shell size). The cut is where the FIT drops under 1, not where the first shell - // does: on a merge whose is flat near 1 - its ISa has collapsed - the first - // single shell to dip under 1 is a coin toss that moved the cut from 0.85 to 1.19 A - // between two compiler flags on one crystal, and the coarser cut left its glide zones - // too few absences to be judged. The fit moves by as much as its input does. - std::vector mean, weight; - for (size_t lo = 0; lo < rs.size(); lo += per) { - const size_t hi = std::min(rs.size(), lo + per); - double sum = 0.0; - for (size_t j = lo; j < hi; ++j) sum += rs[j].second; - mean.push_back(sum / static_cast(hi - lo)); - weight.push_back(static_cast(hi - lo)); - } - std::vector block_mean, block_weight; - std::vector block_size; - for (size_t b = 0; b < mean.size(); ++b) { - block_mean.push_back(mean[b]); block_weight.push_back(weight[b]); block_size.push_back(1); - while (block_mean.size() > 1 && block_mean[block_mean.size() - 2] < block_mean.back()) { - const size_t k = block_mean.size() - 1; - const double w = block_weight[k - 1] + block_weight[k]; - block_mean[k - 1] = (block_mean[k - 1] * block_weight[k - 1] + block_mean[k] * block_weight[k]) / w; - block_weight[k - 1] = w; - block_size[k - 1] += block_size[k]; - block_mean.pop_back(); block_weight.pop_back(); block_size.pop_back(); - } - } - std::vector fit; - for (size_t k = 0; k < block_mean.size(); ++k) - fit.insert(fit.end(), block_size[k], block_mean[k]); - for (size_t b = 0; b < fit.size(); ++b) { - const size_t lo = b * per; - if (fit[b] < 1.0) { - // Cut the noise-dominated high-res shells. When even the lowest-res shell fails, - // keep that shell alone rather than abandoning the cut. The bound is absolute - // while the merged I/sigma it tests saturates at the merge's own ISa (times the - // square root of the multiplicity), so a merge whose ISa has collapsed towards 1 - // can fail it in every shell - and that is exactly the merge the search must not - // be handed whole, since the noise which drove ISa down is what the cut exists to - // remove. Abandoning it feeds back: more noise into the search, a weaker operator - // statistic, and a lost symmetry. - if (b > 0) - d_min_search = rs[lo].first; - else if (per >= 400) - d_min_search = rs[per - 1].first; - break; - } - } - } + d_min_search = SearchCut(sm.merged); const double d_manual = experiment_.GetScalingSettings().GetHighResolutionLimit_A().value_or(0.0); if (rsm && d_min_search > d_manual) { logger.Info("Space-group search: re-scaling the P1 pass at {:.2f} A ( >= 1)", d_min_search); @@ -1852,6 +2053,11 @@ bool Rugnux::ScaleMergeAndSymmetry(PipelineLocals &p) { // else. Whether the all-observation arm is wanted at all is known only from the first arm // (below), so nothing of it reaches the run before then. A merge that failed beside the // others is made again where it is wanted, in series, as it would have been without it. + // The first arm's search runs beside the wait for that merge and the search on it. + TimingMark first_arm_mark(logger, "SearchSpaceGroup (first arm)"); + auto first_search_ahead = std::async(std::launch::async, [&merged = sm.merged, sg_opts] { + return SearchSpaceGroup(merged, sg_opts); + }); std::optional all_merge; std::future all_search_ahead; if (rsm_all && !all_arm_ahead.valid()) @@ -1866,6 +2072,29 @@ bool Rugnux::ScaleMergeAndSymmetry(PipelineLocals &p) { } wait_mark.Stop(); } + // The twinning evidence measured before any promotion (see the decisions below), on the merge the arms + // carry forward - the all-observation one wherever it is there. Where the final merge is being made + // ahead, nothing else is left to hide that measurement behind, so it starts here, on a copy of the + // all-observation merge, beside the searches, and is taken below where that merge is carried forward + // in the same cell and centring. + const auto pre_promotion_analysis = [nthreads = config_.nthreads](const std::vector &merged, + std::optional cell, char centring) { + TranslationalNCSResult tncs; + if (cell) + tncs = AnalyzeTranslationalNCS(merged, gemmi::UnitCell(*cell), nullptr, 30, 0, nthreads); + auto twinning = AnalyzeTwinning(merged, nullptr, 20, TranslationalNCSVectorForLTest(tncs), centring); + return std::make_pair(tncs, twinning); + }; + const std::optional early_cell = result.consensus_cell; + const char early_centring = end_msg.rotation_lattice_type.has_value() + ? end_msg.rotation_lattice_type->centering : 'P'; + std::future> pre_promotion_early; + bool all_merge_carried = false; + if (all_merge && !cards_ahead.empty()) + pre_promotion_early = std::async(std::launch::async, [pre_promotion_analysis, merged = all_merge->merged, + early_cell, early_centring] { + return pre_promotion_analysis(merged, early_cell, early_centring); + }); if (all_merge) { SearchSpaceGroupOptions all_opts = sg_opts; all_opts.merge_isa = all_merge->isa; // as take_merge leaves it below @@ -1873,9 +2102,18 @@ bool Rugnux::ScaleMergeAndSymmetry(PipelineLocals &p) { return SearchSpaceGroup(merged, all_opts); }); } - TimingMark first_arm_mark(logger, "SearchSpaceGroup (first arm)"); - auto sg_search = SearchSpaceGroup(sm.merged, sg_opts); + auto sg_search = first_search_ahead.get(); first_arm_mark.Stop(); + // The first arm's group, merged ahead as well where it is not the one the pre-pass predicted and a card + // is left for it: the pre-pass's merge is of a third of the frames, and a screw axis its few axial + // reflections could not settle is read here on all of them. Where the first arm has no group either, + // nothing is merged ahead - the decisions are what will make one. + if (sg_search.best_space_group && merges_ahead.size() < cards_ahead.size() + && std::none_of(merges_ahead.begin(), merges_ahead.end(), [&](const MergeAhead &m) { + return std::strcmp(m.group.hall, sg_search.best_space_group->hall) == 0; })) { + logger.Debug("Final merge ahead: the first arm finds {}", sg_search.best_space_group->xhm()); + merge_ahead(*sg_search.best_space_group); + } // The Lorentz-filtered arm's merge, kept past the point where the all-observation one // replaces it. The metric re-ask below is a search like any other and answers to the same @@ -2073,6 +2311,7 @@ bool Rugnux::ScaleMergeAndSymmetry(PipelineLocals &p) { // second opinion reported above. merged_filtered = std::move(sm.merged); sm = std::move(sm_all); + all_merge_carried = all_merge.has_value(); } // The arm merged beside the search is done with - or was not needed - before anything below @@ -2110,15 +2349,12 @@ bool Rugnux::ScaleMergeAndSymmetry(PipelineLocals &p) { // cell is taken now: a change of basis committed below replaces it. const char lattice_centring = end_msg.rotation_lattice_type.has_value() ? end_msg.rotation_lattice_type->centering : 'P'; - auto pre_promotion = std::async(std::launch::async, - [&merged = sm.merged, cell = result.consensus_cell, - lattice_centring, nthreads = config_.nthreads] { - TranslationalNCSResult tncs; - if (cell) - tncs = AnalyzeTranslationalNCS(merged, gemmi::UnitCell(*cell), nullptr, 30, 0, nthreads); - auto twinning = AnalyzeTwinning(merged, nullptr, 20, TranslationalNCSVectorForLTest(tncs), - lattice_centring); - return std::make_pair(tncs, twinning); + auto pre_promotion = pre_promotion_early.valid() && all_merge_carried && early_cell == result.consensus_cell + && early_centring == lattice_centring + ? std::move(pre_promotion_early) + : std::async(std::launch::async, [&merged = sm.merged, cell = result.consensus_cell, lattice_centring, + pre_promotion_analysis] { + return pre_promotion_analysis(merged, cell, lattice_centring); }); TranslationalNCSResult pre_tncs; const auto join_pre_promotion = [&] { @@ -2706,6 +2942,7 @@ bool Rugnux::ScaleMergeAndSymmetry(PipelineLocals &p) { static_cast(config_.scaling_iter), config_.nthreads, logger, config_.observation_dump); rsm->Ingest(); + spec_same_ingest = false; } const auto &uc = *result.consensus_cell; logger.Info("{} names a cell of {}x the volume of its reference setting: the " @@ -2945,6 +3182,7 @@ bool Rugnux::ScaleMergeAndSymmetry(PipelineLocals &p) { result.consensus_cell, static_cast(config_.scaling_iter), config_.nthreads, logger, config_.observation_dump); rsm->Ingest(); + spec_same_ingest = false; } } } @@ -2959,6 +3197,7 @@ bool Rugnux::ScaleMergeAndSymmetry(PipelineLocals &p) { for (auto &r : io.reflections) reindex_hkl(r, *commit_reindex); } + spec_same_ingest = false; result.consensus_cell = commit_cell; result.consensus_centering = commit_lattice_type->centering; end_msg.unit_cell = commit_cell; @@ -2972,6 +3211,7 @@ bool Rugnux::ScaleMergeAndSymmetry(PipelineLocals &p) { static_cast(config_.scaling_iter), config_.nthreads, logger, config_.observation_dump); rsm->Ingest(); + spec_same_ingest = false; } } experiment_.SetSpaceGroup(sg); @@ -2980,15 +3220,52 @@ bool Rugnux::ScaleMergeAndSymmetry(PipelineLocals &p) { result.space_group = sg; decisions_mark.Stop(); phase("Re-scaling in space group " + sg.short_name()); - auto adopted = scale_and_merge(sg.short_name(), false); + // The merge made ahead in this group on this ingest is taken, with its per-frame scales and its + // partial-scaling choice, which the merges after it keep as they would on this engine. The others + // are left to end on their own (merges_ahead reaps them when the step is over): one started at the + // first arm's answer is still merging here, and waiting for it put the whole of it on the critical + // path - 0.9 s of a 2.8 s step on a four-card server. + std::optional> ahead; + for (MergeAhead &m : merges_ahead) { + if (!spec_same_ingest || std::strcmp(m.group.hall, sg.hall) != 0) { + logger.Debug("Final merge ahead: made in {}, the run adopts {}{} - not taken", m.group.xhm(), + sg.xhm(), spec_same_ingest ? "" : " on a new ingest"); + continue; + } + TimingMark mark(logger, "merge " + sg.short_name() + " (made ahead, wait)"); + try { + ahead = m.ahead.get(); + } catch (const std::exception &e) { + logger.Warning("The final merge made ahead failed ({}); it is made again", e.what()); + } + mark.Stop(); + m.log.ReplayInto(logger); + if (ahead) { + m.rsm->WriteBackPerFrameScale(); + rsm->TakeScalePartialsChoice(*m.rsm); + } + m.rsm.reset(); + } + ScaleMergeResult adopted; + if (ahead) { + logger.Info("Final merge: made ahead in {}", sg.xhm()); + adopted = take_merge(sg.short_name(), false, std::move(ahead->first)); + } else { + adopted = scale_and_merge(sg.short_name(), false); + } + TimingMark pre_promotion_mark(logger, "pre-promotion analyses wait"); join_pre_promotion(); + pre_promotion_mark.Stop(); sm = std::move(adopted); // The intensity statistics for the centre, on this merge - the full one, resolution-cut and // corrected, in the adopted group. Read on every run and reported, Sohncke groups included, // so a chiral small molecule's reader sees them too; they decide only between a glide // group and its partner with the same absences (see above). - result.centre_statistics = AnalyzeCentreOfSymmetry(sm.merged, sg); + { + TimingMark centre_mark(logger, "centre-of-symmetry statistics"); + result.centre_statistics = ahead ? ahead->second : AnalyzeCentreOfSymmetry(sm.merged, sg, config_.nthreads); + } if (centre_partner && sg.is_centrosymmetric() && result.centre_statistics->reads_acentric && result.centre_twinning_excluded) { logger.Info("Centre of symmetry: {} and {} predict the same absences; the intensity " @@ -3604,7 +3881,9 @@ bool Rugnux::ScaleMergeAndSymmetry(PipelineLocals &p) { // Diffraction anisotropy (see where it is reported, below), made beside the analyses that come // before it: it reads the merge, the integrated observations and the per-frame scales the merge - // wrote back, none of which they change, and most of it is gathering the observations. + // wrote back, none of which they change, and most of it is gathering the observations. It runs on + // beside the molecular replacement too (finish_analyses), so it takes its own copy of the group: the + // enantiomorph relabelling there changes the experiment's. std::future anisotropy; if (!geometry_prepass && !superseded && result.consensus_cell) { AnisotropyRunInfo aniso_run; @@ -3612,14 +3891,16 @@ bool Rugnux::ScaleMergeAndSymmetry(PipelineLocals &p) { aniso_run.observed_rotation_deg = sm.statistics.sweep_quality.sweep_deg; aniso_run.dose_term_in_scale_model = experiment_.GetScalingSettings().GetCorrectionSurfaces(); aniso_run.radiation_damage_relative_b = sm.statistics.radiation_damage_delta_b; + aniso_run.nthreads = config_.nthreads; const float wedge_deg = experiment_.GetGoniometer() ? experiment_.GetGoniometer()->GetWedge_deg() : 0.0f; anisotropy = std::async(std::launch::async, - [&, aniso_run, wedge_deg, cell = *result.consensus_cell, + [&, aniso_run, wedge_deg, cell = *result.consensus_cell, sg = twin_sg_opt, rotation = experiment_.IsRotationIndexing()] { + const gemmi::SpaceGroup *g = sg ? &*sg : nullptr; return AnalyzeAnisotropy(sm.merged, - ScaledObservations(indexer->GetIntegrationOutcome(), rotation, twin_sg, + ScaledObservations(indexer->GetIntegrationOutcome(), rotation, g, wedge_deg, 0.5, config_.nthreads), - cell, twin_sg, aniso_run); + cell, g, aniso_run); }); } // fast_live, cut (the broker's deadline or a cancel): the model is left out, and the files are written @@ -3758,6 +4039,47 @@ bool Rugnux::ScaleMergeAndSymmetry(PipelineLocals &p) { report_shell_d_min, first_schedule); }); } + // The molecular replacement (below): the search started on the geometry pre-pass's merge, where there is one, + // taken over where it holds on this one - not where the twin hypothesis' merge is searched too, as that search + // is this merge's own - and this merge searched itself where it does not. + const auto search_model = [&](const std::vector &merges, Logger &log) { + if (early_mr_ && merges.size() == 1) { + TimingMark early_mark(log, "early molecular replacement wait"); + try { + MolecularReplacementResult early = early_mr_->run.get(); + early_mark.Stop(); + early_mr_->log.ReplayInto(log); + if (auto carried = CarryMolecularReplacement( + early, {"geometry pre-pass's merge", &early_mr_->merged, early_mr_->cell, early_mr_->space_group}, + merges[0], log, static_cast(config_.nthreads), merge_on_card)) + return std::move(*carried); + } catch (const std::exception &e) { + log.Warning("Molecular replacement on the geometry pre-pass's merge failed ({}) - searched again", + e.what()); + } + } + return RunMolecularReplacement(*config_.model, merges, log, static_cast(config_.nthreads), + merge_on_card); + }; + // A prediction, or --mr, has no validation to start here, but the search reads of the merge only its amplitudes + // too. Where there is no twin hypothesis' merge to search beside it and no reference to take the free set from, + // nothing up to the search changes the merge or the group, so it starts here the same way, beside the analyses, + // on a copy given the same amplitudes. Its log is held, and printed where it is taken. + Logger model_search_log = Logger::Buffered(); + std::future model_search_run; + if (model_run && (model_predicted || config_.force_mr) && !twin_merge && !model_twin_merge + && config_.reference_data.empty()) { + model_merged = sm.merged; + model_search_run = std::async(std::launch::async, + [&, device = get_gpu(), sg = experiment_.GetSpaceGroupOrP1()] { + set_gpu(device); + FrenchWilsonOptions fw_opts; + fw_opts.num_threads = config_.nthreads; + fw_opts.anisotropy_hkl = AnisotropyPriorHKL(model_merged, gemmi::UnitCell(*result.consensus_cell), twin_sg); + ApplyFrenchWilson(model_merged, sg, fw_opts); + return search_model({{"MERGE", &model_merged, *result.consensus_cell, sg}}, model_search_log); + }); + } // Not on the geometry pre-pass, nor on a superseded one: the analysis goes into that pass's // statistics text and its written reflections, and neither survives the run. The promotion flag // below is a different thing - it is what the SEARCH did, the second pass reads it, and it is @@ -3766,9 +4088,11 @@ bool Rugnux::ScaleMergeAndSymmetry(PipelineLocals &p) { // Translational pseudo-symmetry first: its verdict is an input to the twinning analysis, // which must not read its own L-test when a non-half-integer pseudo-translation has biased // it. Reporting only - no reflection and no merge depends on the outcome. + TimingMark tncs_mark(logger, "analyses/tNCS"); if (result.consensus_cell) result.tncs = AnalyzeTranslationalNCS(sm.merged, gemmi::UnitCell(*result.consensus_cell), twin_sg, 30, 0, config_.nthreads); + tncs_mark.Stop(); if (result.tncs.detected) logger.Warning("Translational pseudo-symmetry: Patterson off-origin peak {:.1f}% of the " "origin at ({:.3f}, {:.3f}, {:.3f}), {:.1f} A - declare it to the " @@ -3786,9 +4110,11 @@ bool Rugnux::ScaleMergeAndSymmetry(PipelineLocals &p) { ? end_msg.rotation_lattice_type->centering : 'P'; const std::optional twin_cell = result.consensus_cell ? std::optional(*result.consensus_cell) : std::nullopt; + TimingMark twinning_mark(logger, "analyses/twinning"); result.twinning = AnalyzeTwinning(sm.merged, twin_sg, 20, TranslationalNCSVectorForLTest(result.tncs), twin_centring, twin_cell ? &*twin_cell : nullptr); + twinning_mark.Stop(); // Set on the struct the text below is rendered from. AnalyzeTwinning returns a fresh result // with this flag clear, so setting it only afterwards left the statistics text asserting // "No twinning: the Laue class is holohedral" as a fact while the report, rendering the same @@ -3963,13 +4289,17 @@ bool Rugnux::ScaleMergeAndSymmetry(PipelineLocals &p) { const std::string msg = fmt::format( "Indexing ambiguity: this cell / space group admits alternative indexing " "(reindex operator(s): {}). Serial-stills crystals are indexed in one hand at random, " - "and rugnux can only break this against an external reference. WITHOUT one the merge " - "mixes the hands and CC1/2 is degraded; a reference MTZ (-z) or a model (--model, " - "which needs -C and -S here) resolves it.", laws); + "and rugnux makes them consistent from the data only where the space group is given: " + "here it was determined by the run, so the merge mixes the hands and CC1/2 is degraded. " + "Giving the space group (-S) resolves it from the data; a reference MTZ (-z) or a model " + "(--model, which needs -C and -S here) resolves it against them.", laws); logger.Warning("{}", msg); ambiguity_warning_text = " !! " + msg + "\n\n"; stats_text << ambiguity_warning_text; result.warnings.push_back({PathologyCode::INDEXING_AMBIGUITY, msg}); + } else if (result.ambiguity_reference_free_applied) { + logger.Info("Indexing ambiguity present (reindex operator(s): {}); resolved " + "from the data.", laws); } else { logger.Info("Indexing ambiguity present (reindex operator(s): {}); resolved " "against the supplied reference.", laws); @@ -3998,15 +4328,16 @@ bool Rugnux::ScaleMergeAndSymmetry(PipelineLocals &p) { // tensor directions the symmetry forbids - the only place a dataset measures its own // systematic error - are identically zero in it. if (anisotropy.valid()) { - sm.statistics.anisotropy = anisotropy.get(); - stats_text << AnisotropyToText(sm.statistics.anisotropy) << "\n"; // The amplitudes are the one place the tensor is used: French-Wilson with the Wilson // prior of each reflection taken along its own direction. The intensities and - // everything measured on them above are left as they are. + // everything measured on them above are left as they are. The tensor is the analysis' + // own, fitted to the merge alone (AnisotropyPriorHKL), so the model work does not wait for + // the rest of the analysis, which is taken once that is done (finish_analyses). The analysis + // reads the intensities only; French-Wilson writes the amplitudes only. FrenchWilsonOptions fw_opts; fw_opts.num_threads = config_.nthreads; - fw_opts.anisotropy_hkl = AnisotropyTensorHKL(sm.statistics.anisotropy, - gemmi::UnitCell(*result.consensus_cell)); + fw_opts.anisotropy_hkl = AnisotropyPriorHKL(sm.merged, gemmi::UnitCell(*result.consensus_cell), + twin_sg); ApplyFrenchWilson(sm.merged, experiment_.GetSpaceGroupOrP1(), fw_opts); } else if (rsm) { // No tensor: the isotropic prior. The rotation merge leaves its amplitudes to here. @@ -4016,10 +4347,21 @@ bool Rugnux::ScaleMergeAndSymmetry(PipelineLocals &p) { } } - stats_text << sm.statistics; - result.merge_statistics_text = stats_text.str(); - result.has_merge_statistics = true; - result.merge_statistics = sm.statistics; + // The anisotropy and the statistics text it ends, once the model work has gone ahead: before the + // validation below, which edits the text and moves the merge to the model's frame, or after the + // molecular replacement. + const auto finish_analyses = [&] { + if (anisotropy.valid()) { + TimingMark anisotropy_mark(logger, "analyses/anisotropy wait"); + sm.statistics.anisotropy = anisotropy.get(); + anisotropy_mark.Stop(); + stats_text << AnisotropyToText(sm.statistics.anisotropy) << "\n"; + } + stats_text << sm.statistics; + result.merge_statistics_text = stats_text.str(); + result.has_merge_statistics = true; + result.merge_statistics = sm.statistics; + }; result.reference_merge_statistics = sm.reference_statistics; result.reference_isa = sm.reference_isa; @@ -4353,6 +4695,8 @@ bool Rugnux::ScaleMergeAndSymmetry(PipelineLocals &p) { std::optional model_prior_file; // The coordinates that go with the maps beside the answer's files, kept once the model is done. std::optional placed_model_out; + // The merge that placement was made against, which refinement refines it against. + const std::vector *placed_merged = nullptr; // The twin hypothesis the model is asked about: its own subgroup's merge where it has one, the data's // otherwise - and whether that merge was made only for the model, so is written only where it chooses it. std::optional &model_twin = model_twin_merge ? model_twin_file : twin_file; @@ -4364,7 +4708,10 @@ bool Rugnux::ScaleMergeAndSymmetry(PipelineLocals &p) { // for by molecular replacement below. bool placed_by_rigid_body = false; bool twin_chosen_by_model = false; - if (model_run && !model_predicted && !config_.force_mr) { + const bool validated_first = model_run && !model_predicted && !config_.force_mr; + if (validated_first) + finish_analyses(); + if (validated_first) { phase("Validating against model"); Step("Model validation"); TimingMark mark(logger, "model validation"); @@ -4532,8 +4879,10 @@ bool Rugnux::ScaleMergeAndSymmetry(PipelineLocals &p) { twin_validation.r_free_twin, twin_validation.twin_fraction) : std::string(), maps_from_twin ? "the merge in " + mt.space_group.xhm() : "the answer's merge"); - if (maps_from_twin && twin_validation.placed_model) + if (maps_from_twin && twin_validation.placed_model) { placed_model_out = PlacedModelOutput{twin_validation.placed_model, mt.cell, mt.space_group}; + placed_merged = &mt.merged; + } // The model placed there and fitting better there chooses the subgroup: its files, _mr. They // carry the model's own group where it has the subgroup's rotations - the screws and the hand are the // model's, as the coordinates beside them are, unless the anomalous map at its atoms is inverted - and @@ -4559,9 +4908,11 @@ bool Rugnux::ScaleMergeAndSymmetry(PipelineLocals &p) { mt_report.maps_from_this_merge = maps_from_twin; mt_report.model_validation = std::move(twin_validation); } - if (validation.placed_model && !maps_from_twin) + if (validation.placed_model && !maps_from_twin) { placed_model_out = PlacedModelOutput{validation.placed_model, *result.consensus_cell, experiment_.GetSpaceGroupOrP1()}; + placed_merged = &sm.merged; + } } prepare_twin_file(); @@ -4581,31 +4932,19 @@ bool Rugnux::ScaleMergeAndSymmetry(PipelineLocals &p) { if (!ledger_ahead.valid()) rsm.reset(); const size_t merge_on_card = rsm && rsm->OnGPU() ? rsm->DeviceBytes() : 0; - std::vector merges{{"MERGE", &sm.merged, *result.consensus_cell, experiment_.GetSpaceGroupOrP1()}}; - if (model_twin) - merges.push_back({"TWIN_SUBGROUP_MERGE", &model_twin->merged, model_twin->cell, model_twin->space_group, - model_twin->law}); - // The search started on the geometry pre-pass's merge, where there is one, taken over where it holds on - // this one. Not where the twin hypothesis' merge is searched too: that search is this merge's own. - std::optional carried; - if (early_mr_ && !model_twin) { - TimingMark early_mark(logger, "early molecular replacement wait"); - try { - MolecularReplacementResult early = early_mr_->run.get(); - early_mark.Stop(); - early_mr_->log.ReplayInto(logger); - carried = CarryMolecularReplacement( - early, {"geometry pre-pass's merge", &early_mr_->merged, early_mr_->cell, early_mr_->space_group}, - merges[0], logger, static_cast(config_.nthreads), merge_on_card); - } catch (const std::exception &e) { - logger.Warning("Molecular replacement on the geometry pre-pass's merge failed ({}) - searched again", - e.what()); - } + MolecularReplacementResult mr; + if (model_search_run.valid()) { + TimingMark wait_mark(logger, "molecular replacement (beside the analyses) wait"); + mr = model_search_run.get(); + wait_mark.Stop(); + model_search_log.ReplayInto(logger); + } else { + std::vector merges{{"MERGE", &sm.merged, *result.consensus_cell, experiment_.GetSpaceGroupOrP1()}}; + if (model_twin) + merges.push_back({"TWIN_SUBGROUP_MERGE", &model_twin->merged, model_twin->cell, + model_twin->space_group, model_twin->law}); + mr = search_model(merges, logger); } - MolecularReplacementResult mr = carried ? std::move(*carried) - : RunMolecularReplacement(*config_.model, merges, logger, - static_cast(config_.nthreads), - merge_on_card); if (mr.chosen >= 0) { const MRCandidate &c = mr.candidates[mr.chosen]; if (mr.decision == "ENANTIOMORPH") @@ -4665,13 +5004,46 @@ bool Rugnux::ScaleMergeAndSymmetry(PipelineLocals &p) { } if (own) model_prior_file->placed = v.placed_model; - else + else { placed_model_out = PlacedModelOutput{v.placed_model, cell, data_sg}; + placed_merged = &sm.merged; + } result.model_validation = std::move(v); } } result.model_prior = std::move(mr); } + if (!validated_first) + finish_analyses(); + + // The cell's e.s.d.s (CellEsd.h), from the same integrated observations and at the same point as the + // unmerged MTZ below: the indexing and the group are final here, once the model has been read. Rotation + // only - a stills run keeps no per-image reflections to the end, and its crystals' cells differ by more than + // any one is measured to. Made beside the refinement, which reads neither. + std::future> cell_esd; + if (is_rotation && !geometry_prepass && !superseded && result.consensus_cell) + cell_esd = std::async(std::launch::async, [&outcomes = indexer->GetIntegrationOutcome(), + sg = experiment_.GetSpaceGroupOrP1(), + wavelength = experiment_.GetWavelength_A(), + nthreads = config_.nthreads, &logger = logger] { + TimingMark mark(logger, "cell e.s.d."); + return EstimateCellEsd(GatherCellObservations(outcomes, nthreads), sg, wavelength); + }); + + // The unmerged MTZ (kept with the other outputs, see there) is built from here on, beside the + // refinement and the reflection files: the indexing and the group it is written in are final once the + // model has been read, and nothing after this changes the integrated observations it reads. It gets its + // own copy of the experiment. + if (full && write_output && !geometry_prepass && !superseded && result.consensus_cell + && config_.export_unmerged) { + unmerged_mtz = std::async(std::launch::async, + [&outcomes = indexer->GetIntegrationOutcome(), + cell = *result.consensus_cell, x = experiment_, + &provenance = config_.provenance, nthreads = config_.nthreads] { + return UnmergedMtzTable(outcomes, cell, x, true, provenance, nthreads); + }); + } + if (model_run) { result.model_placement = placed_by_rigid_body ? "RIGID_BODY" : result.model_prior && result.model_prior->chosen >= 0 ? "MR" : "NOT_PLACED"; @@ -4692,20 +5064,75 @@ bool Rugnux::ScaleMergeAndSymmetry(PipelineLocals &p) { if (model_prior_file) result.model_prior_file_space_group = model_prior_file->space_group.xhm(); result.outputs->placed_model = placed_model_out; + // The outcome, as notes of the step that decided it + if (result.model_prior) { + const MolecularReplacementResult &mp = *result.model_prior; + if (mp.chosen >= 0) { + const MRCandidate &c = mp.candidates[mp.chosen]; + Note(fmt::format("placed {} {} in {}: TFZ {:.1f}, RFZ {:.1f}", c.copies, c.copies == 1 ? "copy" : "copies", + c.space_group.xhm(), c.tf_z, c.rf_z)); + } else + Note(mp.ok ? mp.decision : "not searched: " + mp.failure_reason); + } + if (result.model_validation && result.model_validation->ok) { + const ModelValidationResult &v = *result.model_validation; + std::string note = fmt::format("R-work {:.3f}, R-free {:.3f} (unrefined)", v.r_work, v.r_free); + if (std::isfinite(v.cc_model_overall)) + note += fmt::format(", CC(model, data) {:.3f}", v.cc_model_overall); + Note(note); + if (v.rigid_body_applied) + Note(fmt::format("rigid body: {:.2f} deg, {:.2f} A", v.rigid_body_angle_deg, v.rigid_body_shift_A)); + } + // The placed model refined against the merge it was placed on, after everything above has been decided, + // so that nothing reads what it finds - and after the notes above, which belong to the step that placed + // the model. Only a model that was placed: one the rigid body rejected and molecular replacement did not + // place has nothing to refine. Left out, as the model is, on a cut. + const bool refine_cut = config_.fast_live && cancelled_; + if (refine_cut && config_.refine && result.model_placement != "NOT_PLACED") + Note("cut: the refinement is left out"); + if (config_.refine && !refine_cut && result.model_placement != "NOT_PLACED" && placed_model_out + && placed_merged != nullptr && result.model_validation && result.model_validation->ok) { + phase("Refining the model"); + Step("Refinement"); + TimingMark mark(logger, "refinement"); + RefinementSettings settings; + settings.nthreads = static_cast(config_.nthreads); + settings.gpu_resident_bytes = rsm && rsm->OnGPU() ? rsm->DeviceBytes() : 0; + // A cut (the broker's deadline or cancel, Ctrl+C) cuts a running refinement short, keeping what it has + settings.cancel = cancelled_.RunFlag(); + const PlacedModelOutput &p = *placed_model_out; + // processing-inert: a refinement that fails is reported, and the run goes on to its other outputs + RefinementResult refined; + try { + refined = RefineModel(*p.model, *placed_merged, gemmi::UnitCell(p.cell), p.space_group, + experiment_.GetWavelength_A(), logger, settings); + } catch (const std::exception &e) { + refined = RefinementResult(); + refined.failure_reason = std::string("refinement failed: ") + e.what(); + } + if (refined.ok) { + result.outputs->refined_model = PlacedModelOutput{refined.model, p.cell, p.space_group}; + result.outputs->refined_maps = refined.maps; + result.outputs->blobs = refined.blobs; + Note(fmt::format("refined{}: R-work {:.3f}, R-free {:.3f}, rmsd bonds {:.3f} A, {} blobs", + refined.cancelled ? " (cut short)" : "", refined.r_work, refined.r_free, + refined.geometry.rmsd_bonds, refined.blobs.size())); + } else + logger.Warning("Refinement did not run: {}", refined.failure_reason); + result.refinement = std::move(refined); + } } - // The unmerged MTZ (kept with the other outputs, see there) is built from here on, beside the - // reflection files: the indexing and the group it is written in are final once the model has been - // read, and nothing after this changes the integrated observations it reads. It gets its own copy of - // the experiment. - if (full && write_output && !geometry_prepass && !superseded && result.consensus_cell - && config_.export_unmerged) { - unmerged_mtz = std::async(std::launch::async, - [&outcomes = indexer->GetIntegrationOutcome(), - cell = *result.consensus_cell, x = experiment_, - &provenance = config_.provenance, nthreads = config_.nthreads] { - return UnmergedMtzTable(outcomes, cell, x, true, provenance, nthreads); - }); + if (cell_esd.valid()) { + result.cell_esd = cell_esd.get(); + if (result.cell_esd) { + const CellEsd &e = *result.cell_esd; + logger.Info("Cell e.s.d.s from {} observations of {} reflections: {:.5f} {:.5f} {:.5f} {:.4f} {:.4f} {:.4f}" + " (least squares {:.5f} {:.5f} {:.5f} {:.4f} {:.4f} {:.4f}, {} frame blocks)", + e.observations, e.reflections, e.esd[0], e.esd[1], e.esd[2], e.esd[3], e.esd[4], e.esd[5], + e.esd_lsq[0], e.esd_lsq[1], e.esd_lsq[2], e.esd_lsq[3], e.esd_lsq[4], e.esd_lsq[5], + e.blocks); + } } // Not on the geometry pre-pass, and not on a pass that is going to be re-run. Pass 1 exists to @@ -4735,6 +5162,7 @@ bool Rugnux::ScaleMergeAndSymmetry(PipelineLocals &p) { config_.provenance), sm.merged, *result.consensus_cell, experiment_, sm.statistics, em_report, result.twinning, std::move(sm.scaled_fulls)}; + result.outputs->merged->cell_esd = result.cell_esd; if (keep_merged_reflections_) result.merged_reflections = sm.merged; // The twin hypothesis beside it (see prepare_twin_file): the reflection files only, with the diff --git a/rugnux/RugnuxStills.cpp b/rugnux/RugnuxStills.cpp index 29872e86b..1911dadc6 100644 --- a/rugnux/RugnuxStills.cpp +++ b/rugnux/RugnuxStills.cpp @@ -61,6 +61,7 @@ #include "../image_analysis/image_preprocessing/ImagePreprocessorBufferGPU.h" #include "../image_analysis/spot_finding/AdaptiveSpotFinderGPU.h" #endif +#include "../image_analysis/scale_merge/CellPopulation.h" #include "../image_analysis/scale_merge/Merge.h" #include "../image_analysis/scale_merge/RfreeFlags.h" #include "../image_analysis/scale_merge/RotationScaleMerge.h" @@ -304,6 +305,29 @@ void Rugnux::RefineStillsGeometry(int start_image, int end_image, int images_to_ if (cancelled_) return; + // A sample holding two crystal forms indexes both against the given cell, and a fit on both puts the + // cell, and with it the distance, between them. Only the frames of the given cell's population are + // fitted, the population the merge keeps (GivenCellPopulation); a run of one form keeps every frame. + // The population is told from the strong frames, whose cells are refined well enough to show the + // valley between two forms: at the start geometry, a weak frame's cell spreads across it. + { + const double given = CrystalLattice(*cell).CalcVolume(); + std::vector rel; + for (const auto &f : frames) + if (static_cast(f.spots.size()) >= MIN_STRONG_SPOTS) + rel.push_back(f.lattice.CalcVolume() / given - 1.0); + const auto [low, high] = GivenCellPopulation(rel); + const size_t before = frames.size(); + std::erase_if(frames, [&](const GeomRefineFrame &f) { + const double r = f.lattice.CalcVolume() / given - 1.0; + return r < low || r > high; + }); + if (frames.size() != before) + logger.Info("Geometry refinement: {} of {} sampled frames refined to a cell outside the given cell's " + "population ({:+.1f}% to {:+.1f}% in volume) and are not fitted", + before - frames.size(), before, 100 * low, 100 * high); + } + // Keep the strongest frames (most indexed spots) for the bundle - the true cell indexes many // spots per frame, and orientation diversity comes for free from independent serial stills. std::vector strong; diff --git a/rugnux/rugnux_cli.cpp b/rugnux/rugnux_cli.cpp index c7b3e8fd7..938e87c92 100644 --- a/rugnux/rugnux_cli.cpp +++ b/rugnux/rugnux_cli.cpp @@ -77,11 +77,14 @@ #include "Rugnux.h" #include "RugnuxDefaults.h" #include "../image_analysis/structure_refinement/ModelValidation.h" +#include "../writer/RugnuxReflectionFile.h" +#include "RugnuxRefine.h" #include "../writer/WriteModel.h" #include "../writer/RugnuxModelFile.h" #include "ResultReport.h" #include "RugnuxOutputFiles.h" #include "RugnuxConsole.h" +#include "RugnuxInputKind.h" #ifdef __APPLE__ #include "../image_analysis/bragg_integration/BraggIntegrationEngineMetal.h" #endif @@ -95,7 +98,7 @@ constexpr double RELATIVE_B_DEFAULT_DEG = 10.0; // What the run does (--mode). Each of these was once a flag of its own; one option keeps them // mutually exclusive by construction. -enum class RugnuxMode { MX, Azint, Scale, Calibration }; +enum class RugnuxMode { MX, Azint, Scale, Calibration, Refine }; // Azimuthal sectors used by --mode calibration --calibration rings when --azim-phi-bins was not given. // The default of 1 is a plain radial profile, in which a ring has been averaged over every direction so @@ -113,6 +116,12 @@ void print_usage() { "together, the indexing rate reported per master as well; these must share the detector, " "wavelength, distance and beam centre. Several inputs must be one format; rotation sweeps (name " "one frame of a CBF/marCCD/SMV sweep), --mode other than mx and following a broker take one" << std::endl; + std::cout << " An atomic model and a reference reflection file can be given among the inputs, in any order, instead of " + "--model and -z: each file is told by its contents, not its name - an MTZ (the MTZ magic) or an mmCIF " + "with a _refln or _diffrn_refln loop is reflections (-z; the input itself in --mode refine), a PDB file " + "or an mmCIF with an _atom_site loop is a model (--model), anything else is images. An mmCIF holding " + "both coordinates and reflections has to be given with --model or -z. At most one of each, also " + "counting --model/--mr and -z; gzipped or not. E.g. rugnux data_master.h5 model.cif" << std::endl; std::cout << " With a broker URL (http://host:port/) and no on disk yet, follows the broker's current " "collection while it is written: must be the path its master file will have, the data " "files are read next to it as the broker reports them closed, and the run ends with the images the " @@ -151,6 +160,13 @@ void print_usage() { std::cout << " azint Only azimuthal integration (no spot finding/indexing); writes _process.h5" << std::endl; std::cout << " scale Only re-scale/merge the already-integrated reflections in (no re-integration)" << std::endl; std::cout << " calibration Determine the detector geometry from powder rings; writes .poni for pyFAI and .json, whose dataset_settings member is a jfjoch_broker dataset_settings body as it stands" << std::endl; + std::cout << " refine Refine the --model against merged structure factors: is an MTZ or a structure-factor mmCIF (gzipped or not), nothing is processed. As a placed model is refined after a merge, and written alike: _refined_model.cif, _refined_maps.mtz, _blobs.json and REFINE_ keys in _report.txt" << std::endl; + std::cout << std::endl; + + std::cout << " Refinement (--mode refine)" << std::endl; + std::cout << " The columns are found, not named: amplitudes with their sigmas (F/SIGF, FP/SIGFP, ...) where the file has them, else intensities (IMEAN/SIGIMEAN, I/SIGI, ...) made into amplitudes by French-Wilson, else the mean of the anomalous pairs; the free set from a FreeR_flag-like column (0 the test set, or the minority value where 0 is the majority, as phenix writes it), drawn here where the file has none. The model is taken as placed in the data's cell, and refined in the data's space group" << std::endl; + std::cout << " --refine-score-only Score the model as given and refine nothing: R-work/R-free, the scale, the bulk solvent, the likelihood and the geometry, each term under REFINE_SCORE_ (--developer prints them all)" << std::endl; + std::cout << " --refine-d-min Leave out reflections finer than this (A)" << std::endl; std::cout << std::endl; std::cout << " Calibration (--mode calibration)" << std::endl; @@ -167,7 +183,7 @@ void print_usage() { std::cout << " Detector mask" << std::endl; std::cout << " --mask-good [:][@] HDF5/CXI stills: a mask array in the frames' own layout (as stored, before the panels are placed) - in , or without it in each data file (a per-frame mask stored beside the frames); a pixel is usable only where it is non-zero, or with only where it has all of them. May be given more than once" << std::endl; std::cout << " --mask-bad [:][@] As --mask-good, but a pixel is unusable where the array is non-zero, or with where it has any of them (e.g. @0xfeff)" << std::endl; - std::cout << " --detect-beam-stop[=N|off] Find the beam stop and its holder in a projection of N images and add them to the pixel mask (bit 9), so nothing shadowed by them is integrated. ON by default (60 images); =off disables. Reflections behind the stop are attenuated but not flagged, so they are integrated low with a plausible sigma and no existing rejection catches them" << std::endl; + std::cout << " --detect-beam-stop[=N|off] Find the beam stop and its holder in a projection of N images and add them to the pixel mask (bit 9), so nothing shadowed by them is integrated. ON by default (60 images); =off disables. A reflection whose signal disk reaches into the shadow is not integrated: the rest of such a disk lies in the stop's half-shadow and reads low. Pixels the finder reports that hold the detector's no-data mark (a PILATUS gap) are masked as dead instead" << std::endl; std::cout << " --beam-center-check[=off] Measure the beam centre from the isotropy of the scattered background on EVERY run, report how far the file's value is from it, and index a second first pass with it to see whether the two centres give the same lattice. The fit reads the projection --detect-beam-stop already builds, so it costs no extra frames. On a run that indexes, the measured centre is adopted where the file's centre indexes nothing and the measured one indexes a majority, and where the two centres return cells related by an integer volume factor, in either direction, and the measured centre's lattice carries materially more of the pooled spots against its own chance level - the axis harmonic a centre error along the spindle produces, which nothing downstream repairs. Where the indexing cannot tell the two centres apart - the same cell with a different metric symmetry, or the same lattice found at both only by reading less of each frame - the first pass is run at both and the run keeps the one that merges better (on the same lattice: the one that measures more reflections at I/sigma >= 2). ON by default; =off disables On stills, where there is no first pass, the file's centre, the measured one and the point-symmetry capture's are each indexed on a sample of frames and the run takes the one that puts materially more spots on the lattice of their frame; with a reference cell (-C) the detector distance is searched too, over 30-3000 mm at every centre, the file's value being one hypothesis, before the stills geometry refinement" << std::endl; std::cout << std::endl; @@ -199,10 +215,10 @@ void print_usage() { "CPU (FFTW); cuFFT and FFTW name one implementation each, and cuFFT needs a GPU. FFBIDX is the known-cell " "fast-feedback indexer for stills, likewise on the GPU where there is one and otherwise on the CPU; " "Auto picks it for stills whenever a cell is known" << std::endl; - std::cout << " -S, --space-group Space group number (96) or symbol (P43212) - for indexing and scaling" << std::endl; + std::cout << " -S, --space-group Space group number (96) or symbol (P43212) - for indexing and scaling; on serial stills where the space group admits two indexings, the crystals are put on one from the data (or from --model/-z when given)" << std::endl; std::cout << " -C, --unit-cell Fix reference unit cell: \"a,b,c,alpha,beta,gamma\"" << std::endl; std::cout << " --fft-min-unit-cell Shortest cell axis the FFT search accepts, in A (default: 10). A candidate with a shorter axis is discarded, but a de-novo rotation run also tries a second first-pass hypothesis with the floor at 5 A, so a small-molecule cell is indexed without this flag; -C lowers it on its own to cover the cell given" << std::endl; - std::cout << " -r, --refine Geometry refinement algorithm (none|orientation|beam_and_lattice|flex); flex tries all three per image and keeps whichever indexes the most spots (alias: multi)" << std::endl; + std::cout << " -r, --geom-refine Geometry refinement algorithm (none|orientation|beam_and_lattice|flex); flex tries all three per image and keeps whichever indexes the most spots (alias: multi)" << std::endl; std::cout << " --refine-geometry[=N|off] Stills: extra first pass that bundle-adjusts the shared beam/distance/cell from N strongly-indexed frames (default: 200) then re-indexes (lifts weak-stills indexing). Default ON for stills when a reference cell is given (-C / reference MTZ); =off disables" << std::endl; std::cout << " --refine-modules[=on|off|diagnose] Stills, in that bundle adjustment: a detector of several modules (the input's own - NXdetector_module groups, SACLA sensors, geometry-file panels - or --module-geometry) has each placed as a rigid block - shift and in-plane turn - where that predicts the spots better on frames held out of the fit (default: on). Used from there on for the panels of a foreign detector (SACLA sensors, geometry-file panels); for a JUNGFRAU measured and reported only. The placement is written to _modules.h5" << std::endl; std::cout << " --module-geometry Where the detector's modules are: an NXmx file with one NXdetector_module group per module (module_0, module_1, ...; what a run writes as _modules.h5), or a CrystFEL geometry file whose panels are laid on the image (fs = column, ss = row). Replaces the input's own modules" << std::endl; @@ -222,26 +238,27 @@ void print_usage() { std::cout << " --no-expected-variance-merge stills: disable the default expected-variance merge weighting (which rebuilds each weak observation's signal variance at the reflection mean to de-bias the inverse-variance merge); restores observed-sigma weighting" << std::endl; std::cout << " -A, --anomalous Anomalous mode (don't merge Friedel pairs)" << std::endl; std::cout << " --scaling-high-resolution High resolution limit for scaling/merging (manual override; default: no limit)" << std::endl; - std::cout << " --scaling-low-resolution Low resolution limit for scaling/merging, in A (default: 50, also XDS's own default; 0 = no limit). The beam stop suppresses air scatter well beyond the shadow the beam-stop mask covers, so reflections coarser than this are measured on a depressed background and mostly integrate negative; masking does not reach them" << std::endl; + std::cout << " --scaling-low-resolution Low resolution limit of the scale fit, in A (default: 50, also XDS's own default; 0 = no limit). Coarser reflections are merged and written, but kept out of the scale model, which a few of them on a large cell can bend" << std::endl; std::cout << " --resolution-cutoff Automatic high-resolution cutoff for the written reflections + reported shells: cc-logistic|off (default: cc-logistic; ignored when --scaling-high-resolution is set)" << std::endl; std::cout << " --resolution-cc-target CC1/2 target defining the cc-logistic fall-off (default: 0.30)" << std::endl; std::cout << " --resolution-shells Number of resolution shells in the reported statistics table (default: 9, as XDS)" << std::endl; std::cout << " --report-resolution [,] Also report the merging statistics over this resolution range (A, either order; dmax defaults to the run's own low-resolution limit) as a second table beside the run's own - the REFRES_* keys of the report - binned from the same merged reflections, so a run can be read against another program's table at that program's range. Report-only: the cut, the scaling, the error model and every decision stay the run's own, and shells finer than the run's own limit are empty rather than filled from data the run did not keep" << std::endl; std::cout << " --ice-min-score Ice-presence gate: measured ice score (1 = no ice) a run must reach before ANY ice handling is applied - the flagging and the exclusion from scaling (default: 1.5). The eleven hexagonal bands cover 16-26% of the unique reflections whether or not the crystal has ice, so handling ice on a clean crystal is a pure loss. 0 = no gate (always handle ice)" << std::endl; std::cout << " --ice-min-spot-ratio Second ice-presence channel: found spots on the hexagonal rings over the same q width of ice-free flanks beside them (1 = spots spread evenly). Ice in large crystallites diffracts as discrete spots and leaves the radial profile flat, so --ice-min-score alone is blind to it. Default 2.0; 0 disables this channel" << std::endl; - std::cout << " --min-partiality Minimum partiality to accept reflection (default: 0.02)" << std::endl; + std::cout << " --min-partiality Minimum partiality to accept reflection (default: 0.02 for rotation, 0.5 for stills)" << std::endl; std::cout << " --capture-uncertainty Systematic sigma num*(1-captured fraction)*: on rot3d fulls, the share of the rocking curve not captured; on stills, the share of each partial its partiality does not see (default: 1.0 for rot3d, 0 otherwise)" << std::endl; std::cout << " --min-captured-fraction rot3d: drop a combined full whose rocking curve was captured below this fraction (edge-of-sweep truncated fulls) (default: 0.7 for rotation, 0 otherwise; 0 = off)" << std::endl; std::cout << " --mosaicity Diagnostic: fix the scaling mosaicity (deg) instead of the per-image seed" << std::endl; std::cout << " --prediction-mosaicity Diagnostic: fix the rocking width the PREDICTION window opens to (deg), leaving the partiality on the per-image sigma_M. Prediction and partiality are one number by default, so a sigma_M that moves takes the integrated reflection population with it" << std::endl; - std::cout << " --reject-outliers Per-observation merge outlier rejection, N sigma from the per-reflection median, the systematic part of the band multiplicative (default: 6 for rot3d, XDS/DIALS-style; 0 = off)" << std::endl; + std::cout << " --reject-outliers Per-observation merge outlier rejection, N sigma from the per-reflection median, the systematic part of the band multiplicative on rotation and linear on stills (default: 6 for rotation, XDS/DIALS-style, and 10 for stills; 0 = off)" << std::endl; std::cout << " --search-min-zeta De-novo space-group search only: also search a merge of just the observations whose Lorentz geometry |zeta| reaches this, and report both answers (default: 0.85 for rotation, 0 = single search). Reflections crossing the Ewald sphere near-tangentially are measured worst and can make a real symmetry operator look like a twin law; where the two searches disagree, the merge of ALL the observations decides" << std::endl; std::cout << " --min-image-cc Per-image CC limit in percent (default: no limit)" << std::endl; std::cout << " --scaling-iterations Cap on the per-frame scaling iterations; the loop stops earlier once the scales settle (default: 100)" << std::endl; std::cout << " -z, --reference Reference data of the same crystal form: an MTZ, or a PDB structure-factor mmCIF (e.g. 1abc-sf.cif, first merged block with a usable column; R-free set from _refln.status f/o, else pdbx_r_free_flag). Gzipped or not, recognised by content. --reference-mtz is the same option" << std::endl; std::cout << " --reference-column