Files
Jungfraujoch/RUGNUX_REPORT.html
T
2026-10-06 20:38:39 +00:00

32 lines
133 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html> <html lang=en data-content_root="./"> <meta charset=utf-8 /> <meta name=viewport content="width=device-width, initial-scale=1.0" /><meta name=viewport content="width=device-width, initial-scale=1" /> <meta name=viewport content="width=device-width,initial-scale=1"> <meta http-equiv=x-ua-compatible content="ie=edge"> <meta name="lang:clipboard.copy" content="Copy to clipboard"> <meta name="lang:clipboard.copied" content="Copied to clipboard"> <meta name="lang:search.language" content=en > <meta name="lang:search.pipeline.stopwords" content=True > <meta name="lang:search.pipeline.trimmer" content=True > <meta name="lang:search.result.none" content="No matching documents"> <meta name="lang:search.result.one" content="1 matching document"> <meta name="lang:search.result.other" content="# matching documents"> <meta name="lang:search.tokenizer" content="[\s\-]+"> <link href="https://fonts.gstatic.com/" rel=preconnect crossorigin> <link href="https://fonts.googleapis.com/css?family=Roboto+Mono:400,500,700|Roboto:300,400,400i,700&display=fallback" rel=stylesheet > <style> body, input { font-family: "Roboto", "Helvetica Neue", Helvetica, Arial, sans-serif } code, kbd, pre { font-family: "Roboto Mono", "Courier New", Courier, monospace } </style> <link rel=stylesheet href="_static/stylesheets/application.css"/> <link rel=stylesheet href="_static/stylesheets/application-palette.css"/> <link rel=stylesheet href="_static/stylesheets/application-fixes.css"/> <link rel=stylesheet href="_static/fonts/material-icons.css"/> <meta name=theme-color content="#3f51b5"> <script src="_static/javascripts/modernizr.js"></script> <title>The results report &#8212; Jungfraujoch 1.0.0-rc.174 documentation</title> <link rel=stylesheet type="text/css" href="_static/pygments.css?v=83e35b93" /> <link rel=stylesheet type="text/css" href="_static/material.css?v=79c92029" /> <script src="_static/documentation_options.js?v=3dccfb20"></script> <script src="_static/doctools.js?v=9bcbadda"></script> <script src="_static/sphinx_highlight.js?v=dc90522c"></script> <link rel=icon href="_static/jfjoch.png"/> <link rel=index title=Index href=genindex.html /> <link rel=search title=Search href=search.html /> <link rel=next title="Advanced Rugnux" href=RUGNUX_ADVANCED.html /> <link rel=prev title="Rugnux with other programs" href=RUGNUX_INTEGRATION.html /> <body dir=ltr data-md-color-primary=indigo data-md-color-accent=lime> <svg class=md-svg > <defs data-children-count=0 > <svg xmlns="http://www.w3.org/2000/svg" width=500 height=500 viewBox="0 0 500 500" id=__gitlab ><path fill=currentColor d="M93.667 473.347l90.684-279.097H2.983l90.684 279.097z" transform="translate(156.198 1.16)"/><path fill=currentColor d="M221.333 473.345L130.649 194.25H3.557l217.776 279.095z" transform="translate(28.531 1.16)" opacity=.7 /><path fill=currentColor d="M32 195.155L4.441 279.97a18.773 18.773 0 0 0 6.821 20.99l238.514 173.29L32 195.155z" transform="translate(.089 .256)" opacity=.5 /><path fill=currentColor d="M2.667-84.844h127.092L75.14-252.942c-2.811-8.649-15.047-8.649-17.856 0L2.667-84.844z" transform="translate(29.422 280.256)"/><path fill=currentColor d="M2.667 473.345L93.351 194.25h127.092L2.667 473.345z" transform="translate(247.198 1.16)" opacity=.7 /><path fill=currentColor d="M221.334 195.155l27.559 84.815a18.772 18.772 0 0 1-6.821 20.99L3.557 474.25l217.777-279.095z" transform="translate(246.307 .256)" opacity=.5 /><path fill=currentColor d="M130.667-84.844H3.575l54.618-168.098c2.811-8.649 15.047-8.649 17.856 0l54.618 168.098z" transform="translate(336.974 280.256)"/></svg> </defs> </svg> <input class=md-toggle data-md-toggle=drawer type=checkbox id=__drawer > <input class=md-toggle data-md-toggle=search type=checkbox id=__search > <label class=md-overlay data-md-component=overlay for=__drawer ></label> <a href="#RUGNUX_REPORT" tabindex=1 class=md-skip > Skip to content </a> <header class=md-header data-md-component=header > <nav class="md-header-nav md-grid"> <div class="md-flex navheader"> <div class="md-flex__cell md-flex__cell--shrink"> <a href=index.html title="Jungfraujoch 1.0.0-rc.174 documentation" class="md-header-nav__button md-logo"> <i class=md-icon >&#xe30d</i> </a> </div> <div class="md-flex__cell md-flex__cell--shrink"> <label class="md-icon md-icon--menu md-header-nav__button" for=__drawer ></label> </div> <div class="md-flex__cell md-flex__cell--stretch"> <div class="md-flex__ellipsis md-header-nav__title" data-md-component=title > <span class=md-header-nav__topic >PSI Jungfraujoch</span> <span class=md-header-nav__topic > The results report </span> </div> </div> <div class="md-flex__cell md-flex__cell--shrink"> <label class="md-icon md-icon--search md-header-nav__button" for=__search ></label> <div class=md-search data-md-component=search role=dialog > <label class=md-search__overlay for=__search ></label> <div class=md-search__inner role=search > <form class=md-search__form action=search.html method=get name=search > <input type=text class=md-search__input name=q placeholder=""Search"" autocapitalize=off autocomplete=off spellcheck=false data-md-component=query data-md-state=active > <label class="md-icon md-search__icon" for=__search ></label> <button type=reset class="md-icon md-search__icon" data-md-component=reset tabindex=-1 > &#xE5CD; </button> </form> <div class=md-search__output > <div class=md-search__scrollwrap data-md-scrollfix> <div class=md-search-result data-md-component=result > <div class=md-search-result__meta > Type to start searching </div> <ol class=md-search-result__list ></ol> </div> </div> </div> </div> </div> </div> <div class="md-flex__cell md-flex__cell--shrink"> <div class=md-header-nav__source > <a href="https://gitea.psi.ch/mx/jungfraujoch" title="Go to repository" class=md-source data-md-source=github > <div class=md-source__icon > <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 24 24" width=28 height=28 > <use xlink:href="#__gitlab" width=24 height=24 ></use> </svg> </div> <div class=md-source__repository > Jungfraujoch </div> </a> </div> </div> <script src="_static/javascripts/version_dropdown.js"></script> <script> var json_loc = ""versions.json"", target_loc = "../", text = "Versions"; $( document ).ready( add_version_dropdown(json_loc, target_loc, text)); </script> </div> </nav> </header> <div class=md-container > <nav class=md-tabs data-md-component=tabs > <div class="md-tabs__inner md-grid"> <ul class=md-tabs__list > <li class=md-tabs__item ><a href=index.html class=md-tabs__link >Jungfraujoch 1.0.0-rc.174 documentation</a> </ul> </div> </nav> <main class=md-main > <div class="md-main__inner md-grid" data-md-component=container > <div class="md-sidebar md-sidebar--primary" data-md-component=navigation > <div class=md-sidebar__scrollwrap > <div class=md-sidebar__inner > <nav class="md-nav md-nav--primary" data-md-level=0 > <label class="md-nav__title md-nav__title--site" for=__drawer > <a href=index.html title="Jungfraujoch 1.0.0-rc.174 documentation" class="md-nav__button md-logo"> <i class=md-icon >&#xe30d</i> </a> <a href=index.html title="Jungfraujoch 1.0.0-rc.174 documentation">PSI Jungfraujoch</a> </label> <div class=md-nav__source > <a href="https://gitea.psi.ch/mx/jungfraujoch" title="Go to repository" class=md-source data-md-source=github > <div class=md-source__icon > <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 24 24" width=28 height=28 > <use xlink:href="#__gitlab" width=24 height=24 ></use> </svg> </div> <div class=md-source__repository > Jungfraujoch </div> </a> </div> <ul class=md-nav__list > <li class=md-nav__item > <span class="md-nav__link caption"><span class=caption-text >rugnux — data processing</span></span> <li class=md-nav__item > <a href=RUGNUX.html class=md-nav__link >Rugnux</a> <li class=md-nav__item > <a href=RUGNUX_OVERVIEW.html class=md-nav__link >What Rugnux does</a> <li class=md-nav__item > <a href=RUGNUX_INSTALL.html class=md-nav__link >Installing Rugnux</a> <li class=md-nav__item > <a href=RUGNUX_FORMATS.html class=md-nav__link >What Rugnux reads</a> <li class=md-nav__item > <a href=RUGNUX_TUTORIAL.html class=md-nav__link >Running Rugnux</a> <li class=md-nav__item > <a href=RUGNUX_INTEGRATION.html class=md-nav__link >Rugnux with other programs</a> <li class=md-nav__item > <input class="md-toggle md-nav__toggle" data-md-toggle=toc type=checkbox id=__toc > <label class="md-nav__link md-nav__link--active" for=__toc > The results report </label> <a href="#" class="md-nav__link md-nav__link--active">The results report</a> <nav class="md-nav md-nav--secondary"> <ul class=md-nav__list data-md-scrollfix=""> </ul> </nav> <ul class=md-nav__list > <li class=md-nav__item > <a href="#format" class=md-nav__link >Format</a> <li class=md-nav__item > <a href="#the-summary-and-what-the-run-decided" class=md-nav__link >The summary, and what the run decided</a> <li class=md-nav__item > <a href="#the-reference-range-table" class=md-nav__link >The reference-range table</a> <li class=md-nav__item > <a href="#the-developer-report" class=md-nav__link >The developer report</a> <li class=md-nav__item > <a href="#the-space-group-and-the-sohncke-answer-beside-it" class=md-nav__link >The space group, and the Sohncke answer beside it</a> <li class=md-nav__item > <a href="#sweep-quality-the-disposition-and-their-vocabularies" class=md-nav__link >Sweep quality, the disposition, and their vocabularies</a> <li class=md-nav__item > <a href="#powder-contamination" class=md-nav__link >Powder contamination</a> <li class=md-nav__item > <a href="#index-2-superstructure" class=md-nav__link >Index-2 superstructure</a> <li class=md-nav__item > <a href="#further-lattices" class=md-nav__link >Further lattices</a> <li class=md-nav__item > <a href="#mosaicity" class=md-nav__link >Mosaicity</a> <li class=md-nav__item > <a href="#translational-pseudo-symmetry" class=md-nav__link >Translational pseudo-symmetry</a> <li class=md-nav__item > <a href="#diffraction-anisotropy" class=md-nav__link >Diffraction anisotropy</a> <li class=md-nav__item > <a href="#model-validation" class=md-nav__link >Model validation</a> </ul> <li class=md-nav__item > <a href=RUGNUX_ADVANCED.html class=md-nav__link >Advanced Rugnux</a> <li class=md-nav__item > <a href=RUGNUX_CALIBRATION.html class=md-nav__link >Detector calibration from powder rings (<code class="docutils literal notranslate"><span class=pre >rugnux</span> <span class=pre >--mode</span> <span class=pre >calibration</span></code>)</a> <li class=md-nav__item > <a href=CPU_DATA_ANALYSIS.html class=md-nav__link >CPU-side crystallographic data analysis (Jungfraujoch)</a> <li class=md-nav__item > <a href=CPU_DATA_ANALYSIS_IMAGE.html class=md-nav__link >Data analysis: from images to spots (§0–§3)</a> <li class=md-nav__item > <a href=CPU_DATA_ANALYSIS_INDEXING.html class=md-nav__link >Data analysis: indexing and geometry (§4–§7)</a> <li class=md-nav__item > <a href=CPU_DATA_ANALYSIS_INTEGRATION.html class=md-nav__link >Data analysis: integration, scaling and merging (§8–§12)</a> <li class=md-nav__item > <a href=CPU_DATA_ANALYSIS_DECISIONS.html class=md-nav__link >Data analysis: space group and validation (§13–§14)</a> <li class=md-nav__item > <span class="md-nav__link caption"><span class=caption-text >Jungfraujoch — acquisition</span></span> <li class=md-nav__item > <a href=JFJOCH_BROKER.html class=md-nav__link >jfjoch_broker</a> <li class=md-nav__item > <a href=JFJOCH_WRITER.html class=md-nav__link >jfjoch_writer</a> <li class=md-nav__item > <a href=JFJOCH_VIEWER.html class=md-nav__link >jfjoch_viewer</a> <li class=md-nav__item > <a href=SOFTWARE_INTEGRATION.html class=md-nav__link >Integration with MX data processing software</a> <li class=md-nav__item > <a href=TOOLS.html class=md-nav__link >Tools</a> <li class=md-nav__item > <a href=DEPLOYMENT.html class=md-nav__link >Deployment</a> <li class=md-nav__item > <a href=DETECTORS.html class=md-nav__link >Supported detectors</a> <li class=md-nav__item > <a href=HARDWARE.html class=md-nav__link >Hardware requirements</a> <li class=md-nav__item > <a href=SOFTWARE.html class=md-nav__link >Software requirements</a> <li class=md-nav__item > <span class="md-nav__link caption"><span class=caption-text >FPGA</span></span> <li class=md-nav__item > <a href=FPGA.html class=md-nav__link >FPGA smartNIC</a> <li class=md-nav__item > <a href=FPGA_LICENSE.html class=md-nav__link >FPGA license</a> <li class=md-nav__item > <a href=FPGA_DESIGN.html class=md-nav__link >FPGA data flow</a> <li class=md-nav__item > <a href=FPGA_NETWORK.html class=md-nav__link >FPGA network</a> <li class=md-nav__item > <a href=FPGA_PCIE_DRIVER.html class=md-nav__link >FPGA PCIe driver</a> <li class=md-nav__item > <a href=FPGA_SETTINGS.html class=md-nav__link >FPGA advanced reference</a> <li class=md-nav__item > <a href=FPGA_DATA_ANALYSIS.html class=md-nav__link >FPGA data analysis</a> <li class=md-nav__item > <span class="md-nav__link caption"><span class=caption-text >Reference</span></span> <li class=md-nav__item > <a href=DETECTOR_GEOMETRY.html class=md-nav__link >Detector geometry</a> <li class=md-nav__item > <a href=OPENAPI.html class=md-nav__link >OpenAPI</a> <li class=md-nav__item > <a href=OPENAPI_SPECS.html class=md-nav__link >OpenAPI specification</a> <li class=md-nav__item > <a href=PYTHON_CLIENT.html class=md-nav__link >OpenAPI Python client</a> <li class=md-nav__item > <a href=CBOR.html class=md-nav__link >CBOR messages</a> <li class=md-nav__item > <a href=HDF5.html class=md-nav__link >HDF5 / NeXus data format</a> <li class=md-nav__item > <a href=IMAGE_STREAM.html class=md-nav__link >Data streams</a> <li class=md-nav__item > <a href=PIXEL_MASK.html class=md-nav__link >Pixel mask</a> <li class=md-nav__item > <a href=WEB_FRONTEND.html class=md-nav__link >Web frontend</a> <li class=md-nav__item > <a href=TESTS.html class=md-nav__link >Tests</a> <li class=md-nav__item > <span class="md-nav__link caption"><span class=caption-text >Project</span></span> <li class=md-nav__item > <a href=ACKNOWLEDGEMENT.html class=md-nav__link >Acknowledgements</a> <li class=md-nav__item > <a href=EXTERNAL_TEST_DATA.html class=md-nav__link >External test data</a> <li class=md-nav__item > <a href=LICENSE.html class=md-nav__link >License</a> <li class=md-nav__item > <a href=THIRD_PARTY_NOTICES.html class=md-nav__link >Third-party software notices</a> <li class=md-nav__item > <a href=VERSIONING.html class=md-nav__link >Semantic versioning</a> <li class=md-nav__item > <a href=SECURITY.html class=md-nav__link >Security</a> <li class=md-nav__item > <a href=RELEASE_CONTENTS.html class=md-nav__link >Release contents</a> <li class=md-nav__item > <a href=REPOSITORIES.html class=md-nav__link >Linux package repositories</a> <li class=md-nav__item > <a href=NAMING.html class=md-nav__link >Naming</a> <li class=md-nav__item > <a href=CHANGELOG.html class=md-nav__link >Changelog</a> </ul> </nav> </div> </div> </div> <div class="md-sidebar md-sidebar--secondary" data-md-component=toc > <div class=md-sidebar__scrollwrap > <div class=md-sidebar__inner > <nav class="md-nav md-nav--secondary"> <ul class=md-nav__list data-md-scrollfix=""> </ul> </nav> </div> </div> </div> <div class=md-content > <article class="md-content__inner md-typeset" role=main > <section class="tex2jax_ignore mathjax_ignore" id=the-results-report > <h1 id=rugnux-report--page-root >The results report<a class=headerlink href="#rugnux-report--page-root" title="Link to this heading"></a></h1> <nav class="contents local" id=on-this-page > <p class=topic-title >On this page</p> <ul class=simple > <li><p><a class="reference internal" href="#format" id=id1 >Format</a></p> <li><p><a class="reference internal" href="#the-summary-and-what-the-run-decided" id=id2 >The summary, and what the run decided</a></p> <li><p><a class="reference internal" href="#the-reference-range-table" id=id3 >The reference-range table</a></p> <li><p><a class="reference internal" href="#the-developer-report" id=id4 >The developer report</a></p> <li><p><a class="reference internal" href="#the-space-group-and-the-sohncke-answer-beside-it" id=id5 >The space group, and the Sohncke answer beside it</a></p> <li><p><a class="reference internal" href="#sweep-quality-the-disposition-and-their-vocabularies" id=id6 >Sweep quality, the disposition, and their vocabularies</a></p> <ul> <li><p><a class="reference internal" href="#what-the-disposition-means-and-what-decides-it" id=id7 >What the disposition means, and what decides it</a></p> </ul> <li><p><a class="reference internal" href="#powder-contamination" id=id8 >Powder contamination</a></p> <li><p><a class="reference internal" href="#index-2-superstructure" id=id9 >Index-2 superstructure</a></p> <li><p><a class="reference internal" href="#further-lattices" id=id10 >Further lattices</a></p> <li><p><a class="reference internal" href="#mosaicity" id=id11 >Mosaicity</a></p> <li><p><a class="reference internal" href="#translational-pseudo-symmetry" id=id12 >Translational pseudo-symmetry</a></p> <li><p><a class="reference internal" href="#diffraction-anisotropy" id=id13 >Diffraction anisotropy</a></p> <li><p><a class="reference internal" href="#model-validation" id=id14 >Model validation</a></p> <ul> <li><p><a class="reference internal" href="#comparing-two-runs-r-model-shell-scaled" id=id15 >Comparing two runs: <code class="docutils literal notranslate"><span class=pre >R_MODEL_SHELL_SCALED</span></code></a></p> <li><p><a class="reference internal" href="#cc-model-data" id=id16 >CC(model, data)</a></p> </ul> </ul> </nav> <p><code class="docutils literal notranslate"><span class=pre >&lt;prefix&gt;_report.txt</span></code> records <strong>what the run determined</strong>, next to the reflection files. It is written on every <code class="docutils literal notranslate"><span class=pre >--mode</span> <span class=pre >mx</span></code> and <code class="docutils literal notranslate"><span class=pre >--mode</span> <span class=pre >scale</span></code> run that has an output prefix — there is no option to enable or disable it. Two cases follow from that:</p> <ul class=simple > <li><p>An <strong>empty output prefix</strong> (<code class="docutils literal notranslate"><span class=pre >-o</span> <span class=pre >""</span></code>, the “compute the statistics, persist nothing” mode) writes nothing, the report included.</p> <li><p><strong><code class="docutils literal notranslate"><span class=pre >--no-merge</span></code></strong> still writes a report. It determined an indexing and a geometry result, and those are recorded; the merging section then says <code class="docutils literal notranslate"><span class=pre >MERGE=</span> <span class=pre >NOT_PERFORMED</span></code> rather than being omitted, so the absence is a statement and not something a reader has to infer.</p> </ul> <p>The report is never allowed to fail a run: if it cannot be written (unwritable path, full disk) the failure is logged as a warning and the run finishes normally.</p> <p><strong>Exit status.</strong> Rugnux exits 0 when the run completed — everything it determined, declined to determine (<code class="docutils literal notranslate"><span class=pre >CANNOT_DETERMINE</span></code>) or warned about is in the report — and non-zero when the run stopped: unreadable input, no usable lattice, a <code class="docutils literal notranslate"><span class=pre >-S</span></code> group the indexed lattice cannot host, an indexer that could not run. The reason goes to the terminal, and the report may not exist in that case — so a script branches on the exit status first and greps the report second.</p> <section id=format > <h2 id=format ><a class=toc-backref href="#id1" role=doc-backlink >Format</a><a class=headerlink href="#format" title="Link to this heading"></a></h2> <p>The model is XDS’s <code class="docutils literal notranslate"><span class=pre >CORRECT.LP</span></code>: prose and tables a crystallographer reads top to bottom, with a structure a script can consume without parsing prose. Every line is one of three kinds — a <code class="docutils literal notranslate"><span class=pre >KEY=</span> <span class=pre >value</span></code> data line, a <code class="docutils literal notranslate"><span class=pre >#</span></code> comment, or blank — so <code class="docutils literal notranslate"><span class=pre >grep</span> <span class=pre >-v</span> <span class=pre >'^#'</span></code> leaves the data alone (since <code class="docutils literal notranslate"><span class=pre >REPORT_VERSION=</span> <span class=pre >8</span></code>; before that, comment lines had no prefix).</p> <ul class=simple > <li><p><strong><code class="docutils literal notranslate"><span class=pre >KEY=</span> <span class=pre >value</span></code> assignment lines.</strong> Every number worth extracting is one, so a consumer gets it with a single <code class="docutils literal notranslate"><span class=pre >grep</span> <span class=pre >'^ISA=</span> <span class=pre >'</span></code> and never has to read a sentence. Key names are stable.</p> <li><p><strong><code class="docutils literal notranslate"><span class=pre >#</span></code> comment lines</strong> — everything else: the prose, the section banners, and the fixed-width tables (stable header row; the resolution shells, the space-group candidates, the sweep-quality ranges).</p> <li><p><strong><code class="docutils literal notranslate"><span class=pre >#</span> <span class=pre >WARNING:</span></code> lines</strong>, one per finding, in plain English: <code class="docutils literal notranslate"><span class=pre >#</span> <span class=pre >WARNING:</span> <span class=pre >Frames</span> <span class=pre >500-600</span> <span class=pre >out</span> <span class=pre >of</span> <span class=pre >beam</span> <span class=pre >(10.1</span> <span class=pre >deg,</span> <span class=pre >scale</span> <span class=pre >0.12</span> <span class=pre >and</span> <span class=pre >CC</span> <span class=pre >0.30</span> <span class=pre >of</span> <span class=pre >the</span> <span class=pre >run,</span> <span class=pre >2%</span> <span class=pre >scaled)</span></code>. <code class="docutils literal notranslate"><span class=pre >grep</span> <span class=pre >'^#</span> <span class=pre >WARNING:'</span></code> finds every one.</p> </ul> <p>The worked examples on this page are shown with the leading <code class="docutils literal notranslate"><span class=pre >#</span></code> stripped for readability; in the file itself every such line starts with <code class="docutils literal notranslate"><span class=pre >#</span></code>.</p> <p><strong>A quantity the run did not measure writes no key at all</strong>, and the fixed-width tables print <code class="docutils literal notranslate"><span class=pre >-</span></code> in its place. There is one rule and no placeholders — no <code class="docutils literal notranslate"><span class=pre >nan</span></code>, and no <code class="docutils literal notranslate"><span class=pre >0.0%</span></code> that reads as a measured total failure — so a consumer must treat an absent key as <em>not measured</em> rather than assume every key it knows about is present. A measured value always prints, including a negative one. The keys a script meets this on first are <code class="docutils literal notranslate"><span class=pre >SIGANO=</span></code> and <code class="docutils literal notranslate"><span class=pre >CC_ANOM=</span></code>: a rotation merge measures them whether or not <code class="docutils literal notranslate"><span class=pre >-A</span></code> was given, but where no Bijvoet pair could be split in both hands — a stills merge without <code class="docutils literal notranslate"><span class=pre >-A</span></code>, or too few pairs — the quantity does not exist and the key is absent; <code class="docutils literal notranslate"><span class=pre >COMPLETENESS=</span></code>, <code class="docutils literal notranslate"><span class=pre >MULTIPLICITY=</span></code>, <code class="docutils literal notranslate"><span class=pre >I_OVER_SIGMA=</span></code>, <code class="docutils literal notranslate"><span class=pre >R_MEAS=</span></code>, <code class="docutils literal notranslate"><span class=pre >CC_HALF=</span></code> and <code class="docutils literal notranslate"><span class=pre >WILSON_B=</span></code> follow the same rule.</p> <p><strong><code class="docutils literal notranslate"><span class=pre >R_MEAS=</span></code></strong> is the ordinary R_meas, every observation counted once, as XDS and AIMLESS count it - the one to set beside theirs. <strong><code class="docutils literal notranslate"><span class=pre >R_MEAS_WEIGHTED=</span></code></strong> (and <code class="docutils literal notranslate"><span class=pre >REFRES_R_MEAS_WEIGHTED=</span></code>) weights each observation as the merge weights it - by 1/sigma^2 under the error model - with each reflection’s weights normalised to their effective number, so where a reflection’s observations share one sigma it equals <code class="docutils literal notranslate"><span class=pre >R_MEAS=</span></code>. A stretch the crystal barely diffracted over is in the merge at the small weight its scaled-up counting error gives it, and is in <code class="docutils literal notranslate"><span class=pre >R_MEAS_WEIGHTED=</span></code> at that weight too, rather than setting the number with its noise; a large gap between the two says weak frames are kept at low weight. <code class="docutils literal notranslate"><span class=pre >MULTIPLICITY=</span></code> stays a count of observations.</p> <p><strong><code class="docutils literal notranslate"><span class=pre >OBSERVATIONS_REJECTED=</span></code></strong> counts the observations the merge’s outlier tests removed, and <strong><code class="docutils literal notranslate"><span class=pre >OBSERVATIONS_REJECTED_WILSON=</span></code></strong> the part of them the Wilson test took (each listed in the developer report). <strong><code class="docutils literal notranslate"><span class=pre >OBSERVATIONS_REJECTED_OVERLOAD=</span></code></strong> is separate from both: the rotation measurements left out because a pixel of the spot was overloaded on one of its frames, as XDS leaves out an overloaded reflection. Outlier rejection takes observations out of <code class="docutils literal notranslate"><span class=pre >R_MEAS=</span></code> and <code class="docutils literal notranslate"><span class=pre >CC_HALF=</span></code> too, so a run that rejects much scores better on both; read the counts beside them.</p> <p>The last blocks before <code class="docutils literal notranslate"><span class=pre >END</span> <span class=pre >OF</span> <span class=pre >REPORT</span></code> are the authorship and the acknowledgement: who wrote rugnux, its licence (GPLv3 — free to use for academic institutions and commercial companies alike) and where releases are published, then the credit to the X-ray research community whose methods rugnux implements and the open-source projects it is built on — both credited in <code class="docutils literal notranslate"><span class=pre >ACKNOWLEDGEMENT.md</span></code> beside <code class="docutils literal notranslate"><span class=pre >LICENSE</span></code> and <code class="docutils literal notranslate"><span class=pre >THIRD_PARTY_NOTICES.md</span></code> in the installed package. rugnux prints the acknowledgement at startup as well.</p> <p><code class="docutils literal notranslate"><span class=pre >REPORT_VERSION=</span></code> is the format’s own version. Key names, table columns and the reason vocabulary below are an interface other software may depend on: they do not change without that number moving. Adding a key does not move it — a consumer that greps for what it needs is unaffected by one more line. It counts releases, not changes: it moves at most once per release, however many format changes that release carries, because a reader only ever meets the format that was released.</p> <p>The header block above section 1 records <strong>how the result was produced</strong>: <code class="docutils literal notranslate"><span class=pre >RUGNUX_VERSION=</span></code> and <code class="docutils literal notranslate"><span class=pre >RUGNUX_DOWNLOAD=</span></code> (the release page of exactly that version), <code class="docutils literal notranslate"><span class=pre >DATE=</span></code>, <code class="docutils literal notranslate"><span class=pre >INPUT_FILE=</span></code> and <code class="docutils literal notranslate"><span class=pre >OUTPUT_PREFIX=</span></code>, plus</p> <ul class=simple > <li><p><strong><code class="docutils literal notranslate"><span class=pre >RUGNUX_GIT=</span></code></strong> — the commit the binary was built from, stamped at build time so it cannot go stale in a reconfigured tree; a <code class="docutils literal notranslate"><span class=pre >-dirty</span></code> suffix marks a build from uncommitted changes.</p> <li><p><strong><code class="docutils literal notranslate"><span class=pre >BUILD_CXX_FLAGS=</span></code></strong> — the compiler flags of the build (<code class="docutils literal notranslate"><span class=pre >NONE</span></code> for a plain configure). The build is set up so that the CPU level it targets (<code class="docutils literal notranslate"><span class=pre >-march</span></code>) does not change the results, only the speed; where two reports of one commit still disagree, this is the first line to compare.</p> <li><p><strong><code class="docutils literal notranslate"><span class=pre >COMMAND_LINE=</span></code></strong> — the invocation as one shell-ready line, arguments containing spaces quoted.</p> <li><p><strong><code class="docutils literal notranslate"><span class=pre >WALL_TIME=</span></code></strong> — the whole invocation in seconds. It covers everything the process did, opening the file and setting up included, so it is a little larger than the <code class="docutils literal notranslate"><span class=pre >Processing</span> <span class=pre >time</span></code> printed on stdout, which starts once the analysis does.</p> <li><p><strong><code class="docutils literal notranslate"><span class=pre >GPU_COUNT=</span></code></strong> and <strong><code class="docutils literal notranslate"><span class=pre >GPU=</span></code></strong> — how many GPUs were visible and what they are, e.g. <code class="docutils literal notranslate"><span class=pre >GPU=</span> <span class=pre >4x</span> <span class=pre >NVIDIA</span> <span class=pre >A100-SXM4-80GB</span></code>; several models on one machine are listed as separate groups. <code class="docutils literal notranslate"><span class=pre >GPU_COUNT=</span> <span class=pre >0</span></code> appears on its own, with no <code class="docutils literal notranslate"><span class=pre >GPU=</span></code> line, when nothing was visible — which is the first thing to check when a run took far longer than expected. Rugnux prints the same line at startup, before the run, so a missing GPU can be caught while there is still time to stop.</p> </ul> <p>Rates, per-image costs and progress remain on stdout only.</p> <p>Sections, in order: the <code class="docutils literal notranslate"><span class=pre >SUMMARY</span></code>, then <code class="docutils literal notranslate"><span class=pre >1.</span> <span class=pre >DATA</span> <span class=pre >SET</span> <span class=pre >AND</span> <span class=pre >GEOMETRY</span></code>, <code class="docutils literal notranslate"><span class=pre >2.</span> <span class=pre >CRYSTAL</span></code>, <code class="docutils literal notranslate"><span class=pre >3.</span> <span class=pre >MERGED</span> <span class=pre >DATA</span></code>, <code class="docutils literal notranslate"><span class=pre >4.</span> <span class=pre >DIAGNOSTICS</span></code>, and <code class="docutils literal notranslate"><span class=pre >5.</span> <span class=pre >MODEL</span> <span class=pre >VALIDATION</span></code> only with <code class="docutils literal notranslate"><span class=pre >--model</span></code> (see <a class="reference internal" href="#the-summary-and-what-the-run-decided">The summary</a> below). The numbering is contiguous, and the fifth section appearing renumbers nothing; a stage that did not run states that inside its section — <code class="docutils literal notranslate"><span class=pre >MERGE=</span> <span class=pre >NOT_PERFORMED</span></code> — rather than the section disappearing.</p> <p><strong><code class="docutils literal notranslate"><span class=pre >SPOT_RESOLUTION_ESTIMATE=</span></code></strong> in section 1 is how far the merged data are expected to reach, read off the found spots alone — no lattice, no integration, no merge — so it is there on a run that never merges, and on a run that does it can be read against <code class="docutils literal notranslate"><span class=pre >INCLUDE_RESOLUTION_RANGE</span></code> in section 3. It is a prediction, good to about 0.2 Å on rotation data; nothing is cut on it. It is <strong>not</strong> limited to what the detector records: where it reads finer than the high-resolution end of <code class="docutils literal notranslate"><span class=pre >INCLUDE_RESOLUTION_RANGE</span></code>, the crystal diffracts past the corner and the run was detector-limited.</p> <p><strong><code class="docutils literal notranslate"><span class=pre >JFJOCH_DATASET_SETTINGS=</span></code></strong> in section 1 is the geometry the run integrated at — on a rotation run the post-refined one — written as the object <code class="docutils literal notranslate"><span class=pre >jfjoch_broker</span></code> takes it in: the four required properties of <code class="docutils literal notranslate"><span class=pre >dataset_settings</span></code> in <code class="docutils literal notranslate"><span class=pre >broker/jfjoch_api.yaml</span></code>, joined by the three <code class="docutils literal notranslate"><span class=pre >poni_rot*_rad</span></code> angles whenever any of them is non-zero (a body without them states a flat detector), on one line of valid JSON, so a refined beam centre and distance can go back to the instrument for the next collection without anyone retyping them.</p> <div class="highlight-default notranslate"><div class=highlight ><pre><span></span><span class=n >JFJOCH_DATASET_SETTINGS</span><span class=o >=</span> <span class=p >{</span><span class=s2 >"beam_x_pxl"</span><span class=p >:</span> <span class=mf >2078.24</span><span class=p >,</span> <span class=s2 >"beam_y_pxl"</span><span class=p >:</span> <span class=mf >2233.92</span><span class=p >,</span> <span class=s2 >"detector_distance_mm"</span><span class=p >:</span> <span class=mf >190.311</span><span class=p >,</span> <span class=s2 >"incident_energy_keV"</span><span class=p >:</span> <span class=mf >12.4000</span><span class=p >}</span>
</pre></div> </div> <div class="highlight-bash notranslate"><div class=highlight ><pre><span></span>grep<span class=w > </span><span class=s1 >'^JFJOCH_DATASET_SETTINGS='</span><span class=w > </span>out_report.txt<span class=w > </span><span class=p >|</span><span class=w > </span>cut<span class=w > </span>-d<span class=s1 >' '</span><span class=w > </span>-f2-<span class=w > </span>&gt;<span class=w > </span>geometry.json
</pre></div> </div> <p><strong>Which pass.</strong> A rotation run integrates twice — once at the geometry in the input file, then again at the post-refined geometry — and can integrate a third time if a guard rejects the second pass. There is <strong>one</strong> report, for the pass that became the canonical output, and <code class="docutils literal notranslate"><span class=pre >PASS=</span></code> / <code class="docutils literal notranslate"><span class=pre >PASS_DECISION=</span></code> (<code class="docutils literal notranslate"><span class=pre >--developer</span></code>) in section 1 say which pass that is and on what evidence, so no number in the file is ambiguous about which geometry produced it.</p> <p><strong>Not in the report:</strong> timing, frame rates, thread counts, per-image progress and library banners. Those are process, not result, and stay on stdout.</p> </section> <section id=the-summary-and-what-the-run-decided > <h2 id=the-summary-and-what-the-run-decided ><a class=toc-backref href="#id2" role=doc-backlink >The summary, and what the run decided</a><a class=headerlink href="#the-summary-and-what-the-run-decided" title="Link to this heading"></a></h2> <p>The file opens with a <strong><code class="docutils literal notranslate"><span class=pre >SUMMARY</span></code></strong> section, above everything it summarises. It exists because the report used to have no evaluative line anywhere until its last section: a run that produced garbage and a run that produced a textbook data set read identically for their first three hundred lines.</p> <ul class=simple > <li><p><strong><code class="docutils literal notranslate"><span class=pre >VERDICT=</span></code></strong> is a closed vocabulary — <code class="docutils literal notranslate"><span class=pre >OK</span></code>, <code class="docutils literal notranslate"><span class=pre >WARNINGS</span></code>, <code class="docutils literal notranslate"><span class=pre >UNUSABLE</span></code>, <code class="docutils literal notranslate"><span class=pre >FAILED</span></code>. <code class="docutils literal notranslate"><span class=pre >FAILED</span></code> means no lattice was determined or the run was cancelled (a sample with no crystal in the beam ends here, with <code class="docutils literal notranslate"><span class=pre >NO_LATTICE</span></code>, and the run exits with status 1); <code class="docutils literal notranslate"><span class=pre >UNUSABLE</span></code> means the data merged but carry no usable signal; <code class="docutils literal notranslate"><span class=pre >WARNINGS</span></code> means something else needs attention; <code class="docutils literal notranslate"><span class=pre >OK</span></code> means nothing did. It is decided from the warnings the rest of the report produced, so it introduces no new analysis and cannot disagree with the sections below it.</p> <li><p><strong><code class="docutils literal notranslate"><span class=pre >VERDICT_TEXT=</span></code></strong> is one to three sentences of free text saying the same thing in English.</p> <li><p><strong><code class="docutils literal notranslate"><span class=pre >PATHOLOGY_FLAGS=</span></code></strong> is the <em>type</em> of each condition that fired, from a closed vocabulary, so a consumer switches on a code rather than parsing a sentence: <code class="docutils literal notranslate"><span class=pre >NO_LATTICE</span></code>, <code class="docutils literal notranslate"><span class=pre >INDEXING_AMBIGUITY</span></code>, <code class="docutils literal notranslate"><span class=pre >SYMMETRY_AMBIGUITY</span></code>, <code class="docutils literal notranslate"><span class=pre >CENTERING_UNTESTED</span></code>, <code class="docutils literal notranslate"><span class=pre >UNUSABLE_MERGE</span></code>, <code class="docutils literal notranslate"><span class=pre >LOW_COMPLETENESS</span></code>, <code class="docutils literal notranslate"><span class=pre >SWEEP_GAPS</span></code>, <code class="docutils literal notranslate"><span class=pre >GONIO_SCALE</span></code>, <code class="docutils literal notranslate"><span class=pre >SPINDLE_CAP</span></code>, <code class="docutils literal notranslate"><span class=pre >ANISOTROPY</span></code>, <code class="docutils literal notranslate"><span class=pre >TWINNING</span></code>, <code class="docutils literal notranslate"><span class=pre >PSEUDO_TRANSLATION</span></code>, <code class="docutils literal notranslate"><span class=pre >LATTICE_TRANSLATION</span></code>, <code class="docutils literal notranslate"><span class=pre >MODEL_HAND</span></code>, <code class="docutils literal notranslate"><span class=pre >MODEL_NOT_VALIDATED</span></code>, <code class="docutils literal notranslate"><span class=pre >REFERENCE_MISMATCH</span></code>, <code class="docutils literal notranslate"><span class=pre >CANCELLED</span></code>, <code class="docutils literal notranslate"><span class=pre >RESOLUTION_FIT</span></code>, <code class="docutils literal notranslate"><span class=pre >FLIGHT_PATH</span></code>, <code class="docutils literal notranslate"><span class=pre >GEOMETRY_NOT_CONVERGED</span></code>, <code class="docutils literal notranslate"><span class=pre >SCALING_NOT_CONVERGED</span></code>, <code class="docutils literal notranslate"><span class=pre >HARMONIC_CONTAMINATION</span></code>, <code class="docutils literal notranslate"><span class=pre >SUPERCELL_POSSIBLE</span></code>, <code class="docutils literal notranslate"><span class=pre >MULTIPLE_LATTICES</span></code>, <code class="docutils literal notranslate"><span class=pre >ICE_RINGS</span></code>, <code class="docutils literal notranslate"><span class=pre >POWDER_RINGS</span></code>. <code class="docutils literal notranslate"><span class=pre >NONE</span></code> when nothing fired. A code appears if and only if its warning fired, so the flags and the <code class="docutils literal notranslate"><span class=pre >WARNING:</span></code> lines are two renderings of one list. Thresholds are deliberately low: a warning is a prompt to check something, not a verdict, and some of them fire on data that turn out fine — the closed type for machinery, the open sentence for a person.</p> <li><p>Below them, one line each, the facts a reader needs before reading further: space group, cell, mosaicity, the powder and ice rings, multiple lattices, resolution, completeness, signal, anomalous signal, anisotropy, pseudo-symmetry, twinning, supercell, radiation damage and the sweep. A line states a finding that is not a condition too - weak powder rings, a possible supercell no stronger than correct cells show, an arbitrary indexing choice (<code class="docutils literal notranslate"><span class=pre >Indexing</span> <span class=pre >choice</span></code>, a rotation sweep whose cell admits alternative indexing: one sweep is indexed consistently, so it matters only against other data; the operators are <strong><code class="docutils literal notranslate"><span class=pre >INDEXING_AMBIGUITY_OPERATORS=</span></code></strong> in section 2). On serial stills the same ambiguity mixes the hands in the merge, and is an <code class="docutils literal notranslate"><span class=pre >INDEXING_AMBIGUITY</span></code> warning. <code class="docutils literal notranslate"><span class=pre >INDEXING_RATE=</span></code> - the share of frames the per-image indexer took - is a stills measure: a rotation run indexes the sweep as a whole, so there it is written only with <code class="docutils literal notranslate"><span class=pre >--developer</span></code>, and <code class="docutils literal notranslate"><span class=pre >NO_LATTICE</span></code> rests on whether the sweep was indexed.</p> <li><p><strong><code class="docutils literal notranslate"><span class=pre >WARNING_COUNT=</span></code></strong> and the <strong><code class="docutils literal notranslate"><span class=pre >WARNING:</span></code></strong> lines follow, in the same section. They are what they always were; they have moved from the bottom of the file to the top.</p> </ul> <p>Then the numbered sections: <strong>1. DATA SET AND GEOMETRY</strong>, <strong>2. CRYSTAL</strong>, <strong>3. MERGED DATA</strong>, <strong>4. DIAGNOSTICS</strong>, and <strong>5. MODEL VALIDATION</strong> only with <code class="docutils literal notranslate"><span class=pre >--model</span></code>.</p> </section> <section id=the-reference-range-table > <h2 id=the-reference-range-table ><a class=toc-backref href="#id3" role=doc-backlink >The reference-range table</a><a class=headerlink href="#the-reference-range-table" title="Link to this heading"></a></h2> <p><code class="docutils literal notranslate"><span class=pre >--report-resolution</span> <span class=pre >&lt;dmin&gt;[,&lt;dmax&gt;]</span></code> adds a second block of merging statistics to section 3, the <code class="docutils literal notranslate"><span class=pre >REFRES_*</span></code> keys and a second shell table, over the resolution range it is given rather than the range the run chose. It exists for comparison: another program’s table is at that program’s range, and running rugnux <em>at</em> that range (<code class="docutils literal notranslate"><span class=pre >--scaling-high-resolution</span></code>) is not the same run — the cut moves, and with it the symmetry decision and everything downstream of it. The reference table is instead the same merged reflections binned again, so nothing is processed differently whether or not it is asked for; the merged files and every decision are byte-for-byte the run’s own.</p> <ul class=simple > <li><p><strong><code class="docutils literal notranslate"><span class=pre >REFRES_RANGE=</span></code></strong> is the requested range (<code class="docutils literal notranslate"><span class=pre >dmax</span> <span class=pre >dmin</span></code>, as <code class="docutils literal notranslate"><span class=pre >INCLUDE_RESOLUTION_RANGE</span></code>; <code class="docutils literal notranslate"><span class=pre >INF</span></code> when the run has no low-resolution limit and none was given). <strong><code class="docutils literal notranslate"><span class=pre >REFRES_MEASURED_RANGE=</span></code></strong> is the coarsest and finest merged reflection that actually landed in it.</p> <li><p><strong><code class="docutils literal notranslate"><span class=pre >REFRES_COMPLETENESS=</span></code></strong>, <strong><code class="docutils literal notranslate"><span class=pre >REFRES_MULTIPLICITY=</span></code></strong>, <strong><code class="docutils literal notranslate"><span class=pre >REFRES_I_OVER_SIGMA=</span></code></strong>, <strong><code class="docutils literal notranslate"><span class=pre >REFRES_R_MEAS=</span></code></strong>, <strong><code class="docutils literal notranslate"><span class=pre >REFRES_CC_HALF=</span></code></strong>, <strong><code class="docutils literal notranslate"><span class=pre >REFRES_SIGANO=</span></code></strong>, <strong><code class="docutils literal notranslate"><span class=pre >REFRES_CC_ANOM=</span></code></strong>, <strong><code class="docutils literal notranslate"><span class=pre >REFRES_UNIQUE_REFLECTIONS=</span></code></strong> and <strong><code class="docutils literal notranslate"><span class=pre >REFRES_TOTAL_OBSERVATIONS=</span></code></strong> are the overall numbers over that range, under the same absent-when-unmeasured rule as their section-3 namesakes. <strong><code class="docutils literal notranslate"><span class=pre >REFRES_ISA=</span></code></strong> is the error model refitted on the reflections of this table alone, in XDS’s convention, so it reads against an <code class="docutils literal notranslate"><span class=pre >ISa</span></code> produced at that range; the table itself is merged under the run’s own model.</p> <li><p><strong>The table holds only what the run kept.</strong> Where the reference range is finer than the run’s own limit, the shells past that limit are empty by the run’s decision — it judged them to carry no signal and did not merge them — and are printed as <code class="docutils literal notranslate"><span class=pre >past</span> <span class=pre >the</span> <span class=pre >run's</span> <span class=pre >own</span> <span class=pre >limit</span> <span class=pre >of</span> <span class=pre >X</span> <span class=pre >A:</span> <span class=pre >not</span> <span class=pre >merged</span> <span class=pre >(N</span> <span class=pre >possible)</span></code> rather than as zeros; the shell the limit falls inside is marked. <strong><code class="docutils literal notranslate"><span class=pre >REFRES_SHELLS_PAST_LIMIT=</span></code></strong> counts those shells (0 when the range lies within the run’s own), so a consumer can tell <em>not merged</em> from a measured zero. <code class="docutils literal notranslate"><span class=pre >REFRES_COMPLETENESS</span></code> counts their reflections as missing; every other overall number is over the shells the run reached.</p> </ul> <p>The shells are equal steps in 1/d² between the two bounds, as XDS’s are, so at XDS’s <code class="docutils literal notranslate"><span class=pre >INCLUDE_RESOLUTION_RANGE</span></code> the two tables read row for row.</p> </section> <section id=the-developer-report > <h2 id=the-developer-report ><a class=toc-backref href="#id4" role=doc-backlink >The developer report</a><a class=headerlink href="#the-developer-report" title="Link to this heading"></a></h2> <p><code class="docutils literal notranslate"><span class=pre >--developer</span></code> renders the same report in full. The default report carries what a person deciding <em>keep or recollect</em> acts on; <code class="docutils literal notranslate"><span class=pre >--developer</span></code> adds the pipeline’s own internals — the anisotropy detection gate’s parameters, the space-group operator and candidate tables, the model-fit null, the sweep-quality internals, the twinning statistics measured before the search, and the long explanatory passages — plus advisories about the cut’s own behaviour that no user can act on.</p> <p>Nothing is computed differently and nothing is lost by leaving the flag off: the report is built once, in full, and the flag selects how much of it is written. Every key the default report writes, <code class="docutils literal notranslate"><span class=pre >--developer</span></code> writes too.</p> </section> <section id=the-space-group-and-the-sohncke-answer-beside-it > <h2 id=the-space-group-and-the-sohncke-answer-beside-it ><a class=toc-backref href="#id5" role=doc-backlink >The space group, and the Sohncke answer beside it</a><a class=headerlink href="#the-space-group-and-the-sohncke-answer-beside-it" title="Link to this heading"></a></h2> <p>The space group lives in section 2: <code class="docutils literal notranslate"><span class=pre >SPACE_GROUP_NAME=</span></code> / <code class="docutils literal notranslate"><span class=pre >SPACE_GROUP_NUMBER=</span></code>, with <code class="docutils literal notranslate"><span class=pre >SPACE_GROUP_ALTERNATIVES=</span></code> naming the candidates the data could not separate — an enantiomorphic partner among them — and, on a group that has such a partner, <code class="docutils literal notranslate"><span class=pre >SPACE_GROUP_ENANTIOMORPH=</span></code> saying whether the hand is open (<code class="docutils literal notranslate"><span class=pre >UNDETERMINED</span></code>), asserted by the user (<code class="docutils literal notranslate"><span class=pre >GIVEN</span></code>), or taken from an accepted model (<code class="docutils literal notranslate"><span class=pre >ASSUMED_FROM_MODEL</span></code>).</p> <p><code class="docutils literal notranslate"><span class=pre >SPACE_GROUP_SCREW_UNDETERMINED=</span></code> names the <strong>axes whose screw these data could not decide at all</strong>, as one or more of <code class="docutils literal notranslate"><span class=pre >a</span></code>, <code class="docutils literal notranslate"><span class=pre >b</span></code>, <code class="docutils literal notranslate"><span class=pre >c</span></code>; when every screw the data could show was judged it reads <code class="docutils literal notranslate"><span class=pre >NONE</span></code> and, like the other keys whose answer is “nothing to report”, is written only with <code class="docutils literal notranslate"><span class=pre >--developer</span></code>. It fires when the axial row a screw lives on was never recorded — it lay in the spindle’s blind cone, or outside the resolution range — so nothing was measured that could confirm or refuse the screw. On such an axis <code class="docutils literal notranslate"><span class=pre >SPACE_GROUP_NAME=</span></code> is not an answer: the answer is that group <strong>or</strong> any of <code class="docutils literal notranslate"><span class=pre >SPACE_GROUP_ALTERNATIVES</span></code>, and no measurement in the run chooses between them. What is written to the <code class="docutils literal notranslate"><span class=pre >.mtz</span></code>/<code class="docutils literal notranslate"><span class=pre >.cif</span></code>/<code class="docutils literal notranslate"><span class=pre >.hkl</span></code> is unchanged — the member claiming no screw, because a reflection file must carry one group — and the report prints the axis, why the row could not be judged, and what the alternatives are. To settle it, record the missing row: a different crystal orientation, or a sweep that reaches it. With <code class="docutils literal notranslate"><span class=pre >--developer</span></code> the space-group section names the same axes in prose beside the per-zone screw table.</p> <p><code class="docutils literal notranslate"><span class=pre >SETTING_OPERATOR=</span></code> and <code class="docutils literal notranslate"><span class=pre >SETTING_SOURCE=</span></code> in section 2 say which axes the files are on: the reindexing operator from the axes the space group was determined on (CCP4 style, <code class="docutils literal notranslate"><span class=pre >h,k,l</span></code> where nothing moved) and what chose the setting - <code class="docutils literal notranslate"><span class=pre >STANDARD</span></code>, <code class="docutils literal notranslate"><span class=pre >CELL</span></code> (<code class="docutils literal notranslate"><span class=pre >-C</span></code>), <code class="docutils literal notranslate"><span class=pre >SPACE_GROUP</span></code> (a non-standard <code class="docutils literal notranslate"><span class=pre >-S</span></code>), <code class="docutils literal notranslate"><span class=pre >MODEL</span></code> (a <code class="docutils literal notranslate"><span class=pre >--model</span></code> that fits) or <code class="docutils literal notranslate"><span class=pre >REFERENCE</span></code> (<code class="docutils literal notranslate"><span class=pre >-z</span></code>). <code class="docutils literal notranslate"><span class=pre >SPACE_GROUP_NAME</span></code>, the cell and every file the run writes are in that setting (see RUGNUX_ADVANCED.md, “The setting the files are written in”).</p> <p><code class="docutils literal notranslate"><span class=pre >SOHNCKE_SPACE_GROUP=</span></code> in section 2 is written on every run whose space group was determined by the search; a run given its group with <code class="docutils literal notranslate"><span class=pre >-S</span></code> has no Sohncke candidate to name and omits the key. Where the search found a glide plane, <code class="docutils literal notranslate"><span class=pre >SPACE_GROUP_NAME=</span></code> names the group with it and this names the best group without - a crystal of chiral molecules, which is any protein, cannot have a glide plane or an inversion centre, so a reader who knows their sample is a protein reads this key and needs no second run. Where no glide was found the two keys read the same, deliberately: greppability is the point, and a key that appears only sometimes has to be tested for before it can be read.</p> <p><code class="docutils literal notranslate"><span class=pre >SPACE_GROUP_CENTRE=</span></code> says how the <strong>centre of symmetry</strong> of a glide group was settled; it is written only where a non-Sohncke group was adopted. <code class="docutils literal notranslate"><span class=pre >IMPLIED_BY_ABSENCES</span></code> - the group is centrosymmetric and no group without a centre predicts its absences (P2_1/c, Pbca, Ia-3d), so the screws and glides found imply the centre. <code class="docutils literal notranslate"><span class=pre >ABSENT_BY_ABSENCES</span></code> - the reverse (I-42d, Fdd2): no centrosymmetric group predicts these absences. <code class="docutils literal notranslate"><span class=pre >NOT_DETERMINED</span></code> - a group with exactly the same absences and the other answer exists (C2/c and Cc, Pnma and Pna2_1), and it is in <code class="docutils literal notranslate"><span class=pre >SPACE_GROUP_ALTERNATIVES</span></code>. Friedel’s law hides the centre from the symmetry of merged intensities, so the centrosymmetric group is written by default: a missed centre is the common error in small-molecule space-group assignment. <code class="docutils literal notranslate"><span class=pre >ABSENT_BY_STATISTICS</span></code> - the same situation, but the intensity distribution read acentric and the lattice ruled twinning out, so the group without a centre was written; <code class="docutils literal notranslate"><span class=pre >CENTRE_TWINNING_EXCLUDED=</span></code> says, for these two, whether the lattice ruled twinning out. Two non-centrosymmetric groups can also share absences (I-42d and I4_1md); the lowest-numbered is written and the other listed as the alternative.</p> <p><code class="docutils literal notranslate"><span class=pre >CENTRE_STATISTICS_*</span></code> are the intensity statistics behind that, read on every searched run on the general reflections - those no operator of the Laue class but the identity maps to themselves, which are centric exactly when the crystal is centrosymmetric; <code class="docutils literal notranslate"><span class=pre >CENTRE_STATISTICS_REFLECTIONS=</span></code> is how many there were. <code class="docutils literal notranslate"><span class=pre >CENTRE_STATISTICS_L=</span></code> is &lt;|L|&gt; (Padilla &amp; Yeates; 0.5 acentric, 2/pi centric), <code class="docutils literal notranslate"><span class=pre >CENTRE_STATISTICS_E2_MINUS_1=</span></code> &lt;|E^2-1|&gt; (0.736 / 0.968) and <code class="docutils literal notranslate"><span class=pre >CENTRE_STATISTICS_NZ01=</span></code> N(0.1), the fraction with E^2 &lt; 0.1 (0.095 / 0.248). Each has an <code class="docutils literal notranslate"><span class=pre >_F</span></code> beside it (<code class="docutils literal notranslate"><span class=pre >CENTRE_STATISTICS_L_F=</span></code>, <code class="docutils literal notranslate"><span class=pre >_E2_MINUS_1_F=</span></code>, <code class="docutils literal notranslate"><span class=pre >_NZ01_F=</span></code>) that places the statistic between the values the same reflections read when simulated acentric (0) and centric (1) with their own shell means and sigmas; <code class="docutils literal notranslate"><span class=pre >CENTRE_STATISTICS_CONTROL_F=</span></code> does the same for the reflections centric in every candidate, which must read centric. The statistics are written only where L-test pairs and control reflections were found. <code class="docutils literal notranslate"><span class=pre >CENTRE_STATISTICS_VERDICT=</span></code> is <code class="docutils literal notranslate"><span class=pre >ACENTRIC</span></code> when &lt;|L|&gt; reads <code class="docutils literal notranslate"><span class=pre >_F</span></code> &lt;= 0.3 and the other two &lt;= 0.5, <code class="docutils literal notranslate"><span class=pre >NOT_APPLICABLE</span></code> when any of the three falls outside -0.3..1.3 (a structure with a few heavy atoms on special positions reads beyond centric) or the control reads below 0.5, and <code class="docutils literal notranslate"><span class=pre >INCONCLUSIVE</span></code> otherwise. A twinned crystal reads acentric whether or not it has a centre, which is why the verdict decides only with twinning excluded by the lattice.</p> <p><code class="docutils literal notranslate"><span class=pre >SPACE_GROUP_ENANTIOMORPH=</span></code> in section 2 reads <strong><code class="docutils literal notranslate"><span class=pre >ASSUMED_FROM_MODEL</span></code></strong> when the hand written in the files is the model’s. Assumed, not determined: merged intensities cannot see the hand at all — |F| is invariant under the change of hand — so an accepted model asserts it out of prior chemical knowledge. It is only ever written where <code class="docutils literal notranslate"><span class=pre >MODEL_FIT=</span> <span class=pre >ACCEPTED</span></code>, and the anomalous difference map vetoes it outright where the map says the model and the data are in opposite hands. (Before <code class="docutils literal notranslate"><span class=pre >REPORT_VERSION=</span> <span class=pre >6</span></code> this value was spelled <code class="docutils literal notranslate"><span class=pre >DETERMINED_FROM_MODEL</span></code> and was emitted whenever a model file merely parsed.)</p> </section> <section id=sweep-quality-the-disposition-and-their-vocabularies > <h2 id=sweep-quality-the-disposition-and-their-vocabularies ><a class=toc-backref href="#id6" role=doc-backlink >Sweep quality, the disposition, and their vocabularies</a><a class=headerlink href="#sweep-quality-the-disposition-and-their-vocabularies" title="Link to this heading"></a></h2> <p>Section 4 lists the stretches of the sweep over which the crystal delivered much less than the rest of the run — the feedback a beamline control system needs to tell an operator that a crystal should be recentred or recollected — says what became of each of them, measures what keeping each one costs the merged intensities, and drops the stretches that cost too much.</p> <div class="highlight-default notranslate"><div class=highlight ><pre><span></span><span class=n >SWEEP_QUALITY_STATUS</span><span class=o >=</span> <span class=n >COMPUTED</span>
<span class=n >SWEEP_QUALITY_COUNT</span><span class=o >=</span> <span class=mi >2</span>
<span class=n >SWEEP_QUALITY_REASONS</span><span class=o >=</span> <span class=n >no_diffraction</span> <span class=n >crystal_out_of_beam</span> <span class=n >weak_diffraction</span> <span class=n >loss_of_centring</span> <span class=n >radiation_damage</span> <span class=n >inconsistent_with_merge</span>
<span class=n >SWEEP_DISPOSITIONS</span><span class=o >=</span> <span class=n >merged</span> <span class=n >downgraded</span> <span class=n >rejected</span>
<span class=n >FRAMES_MERGED</span><span class=o >=</span> <span class=mi >1663</span>
<span class=n >FRAMES_DOWNGRADED</span><span class=o >=</span> <span class=mi >101</span>
<span class=n >FRAMES_REJECTED</span><span class=o >=</span> <span class=mi >36</span>
<span class=n >FRAMES_REJECTED_PCT</span><span class=o >=</span> <span class=mf >2.00</span>
<span class=n >ROTATION_REJECTED_DEG</span><span class=o >=</span> <span class=mf >3.6</span>
<span class=n >SWEEP_ROTATION</span><span class=o >=</span> <span class=mf >180.0</span>
<span class=n >FLUX_PEAK_TO_TROUGH</span><span class=o >=</span> <span class=mf >1.03</span>
<span class=n >SCALE_MODULATION_PEAK_TO_TROUGH</span><span class=o >=</span> <span class=mf >1.00</span>
<span class=n >FIRST_IMAGE</span> <span class=n >LAST_IMAGE</span> <span class=n >N_IMAGES</span> <span class=n >ROTATION</span> <span class=n >REASON</span> <span class=n >SEVERITY</span> <span class=n >SCALE</span> <span class=n >CC</span> <span class=n >INDEXED</span> <span class=n >DISPOSITION</span> <span class=n >DELTA_CC_HALF</span> <span class=n >DELTA_CC_HALF_SE</span>
<span class=o >-----------</span> <span class=o >-----------</span> <span class=o >---------</span> <span class=o >--------</span> <span class=o >-----------------------</span> <span class=o >--------</span> <span class=o >------</span> <span class=o >------</span> <span class=o >--------</span> <span class=o >-----------</span> <span class=o >-------------</span> <span class=o >----------------</span>
<span class=mi >500</span> <span class=mi >600</span> <span class=mi >101</span> <span class=mf >10.1</span> <span class=n >crystal_out_of_beam</span> <span class=mf >0.83</span> <span class=mf >0.12</span> <span class=mf >0.30</span> <span class=mf >0.02</span> <span class=n >downgraded</span> <span class=o >+</span><span class=mf >0.0004</span> <span class=mf >0.0031</span>
<span class=mi >612</span> <span class=mi >630</span> <span class=mi >19</span> <span class=mf >1.9</span> <span class=n >no_diffraction</span> <span class=mf >0.98</span> <span class=mf >0.02</span> <span class=mf >0.00</span> <span class=mf >0.00</span> <span class=n >rejected</span> <span class=o >-</span><span class=mf >0.0481</span> <span class=mf >0.0110</span>
<span class=o >-----------</span> <span class=o >-----------</span> <span class=o >---------</span> <span class=o >--------</span> <span class=o >-----------------------</span> <span class=o >--------</span> <span class=o >------</span> <span class=o >------</span> <span class=o >--------</span> <span class=o >-----------</span> <span class=o >-------------</span> <span class=o >----------------</span>
</pre></div> </div> <p>Of those keys, <code class="docutils literal notranslate"><span class=pre >SWEEP_QUALITY_COUNT</span></code> and the five disposition keys (<code class="docutils literal notranslate"><span class=pre >FRAMES_MERGED</span></code>, <code class="docutils literal notranslate"><span class=pre >FRAMES_DOWNGRADED</span></code>, <code class="docutils literal notranslate"><span class=pre >FRAMES_REJECTED</span></code>, <code class="docutils literal notranslate"><span class=pre >FRAMES_REJECTED_PCT</span></code>, <code class="docutils literal notranslate"><span class=pre >ROTATION_REJECTED_DEG</span></code>) are in the default report; <code class="docutils literal notranslate"><span class=pre >SWEEP_QUALITY_STATUS</span></code>, <code class="docutils literal notranslate"><span class=pre >SWEEP_QUALITY_REASONS</span></code>, <code class="docutils literal notranslate"><span class=pre >SWEEP_DISPOSITIONS</span></code>, <code class="docutils literal notranslate"><span class=pre >SWEEP_ROTATION</span></code>, <code class="docutils literal notranslate"><span class=pre >FLUX_PEAK_TO_TROUGH</span></code> and <code class="docutils literal notranslate"><span class=pre >SCALE_MODULATION_PEAK_TO_TROUGH</span></code> appear with <code class="docutils literal notranslate"><span class=pre >--developer</span></code> (the default report states in prose whether the diagnostic ran).</p> <p>The three frame counts <strong>partition the sweep</strong> — every processed image is exactly one of them and they add up to the frame count — so <code class="docutils literal notranslate"><span class=pre >FRAMES_REJECTED_PCT</span></code> is the answer to “how much of this experiment was useless”. It is reported beside <code class="docutils literal notranslate"><span class=pre >ROTATION_REJECTED_DEG</span></code> on purpose: a percentage of <em>frames</em> moves when the same experiment is re-sliced, and a percentage of the <em>rotation</em> does not. The prose headline above the table states both.</p> <p>A <code class="docutils literal notranslate"><span class=pre >SWEEP_GAPS</span></code> warning is given, one per range, where the degraded ranges together cover at least 1 % of the sweep’s rotation; below that - a frame or two - they are in the table and the summary’s <code class="docutils literal notranslate"><span class=pre >Sweep</span></code> line, and the warning lines in <code class="docutils literal notranslate"><span class=pre >--developer</span></code>.</p> <p><code class="docutils literal notranslate"><span class=pre >SWEEP_QUALITY_STATUS</span></code> distinguishes <strong><code class="docutils literal notranslate"><span class=pre >COMPUTED</span></code></strong> (the diagnostic ran; a count of 0 means the sweep was clean throughout) from <strong><code class="docutils literal notranslate"><span class=pre >NOT_COMPUTED</span></code></strong> (it did not run — no scaling and merging, or stills data). A consumer must not read a missing table or a zero count as “clean” without checking it. <code class="docutils literal notranslate"><span class=pre >SWEEP_QUALITY_REASONS</span></code> lists the whole vocabulary this version can emit, so an unknown code is distinguishable from a missing one.</p> <table> <thead> <tr class=row-odd ><th class=head ><p>Reason code</p> <th class=head ><p>Meaning</p> <tr class=row-even ><td><p><code class="docutils literal notranslate"><span class=pre >no_diffraction</span></code></p> <td><p>The range recorded essentially no diffraction from the indexed lattice.</p> <tr class=row-odd ><td><p><code class="docutils literal notranslate"><span class=pre >crystal_out_of_beam</span></code></p> <td><p>Frames were lost: over the range a per-image scale could be fitted far less often than over the run.</p> <tr class=row-even ><td><p><code class="docutils literal notranslate"><span class=pre >weak_diffraction</span></code></p> <td><p>The frames all still index, but with much less intensity — the cause was not determined.</p> <tr class=row-odd ><td><p><code class="docutils literal notranslate"><span class=pre >loss_of_centring</span></code></p> <td><p>One cycle of modulation per revolution: the crystal is off the rotation axis.</p> <tr class=row-even ><td><p><code class="docutils literal notranslate"><span class=pre >radiation_damage</span></code></p> <td><p>The range runs to the end of a sweep whose quality was already decaying.</p> <tr class=row-odd ><td><p><code class="docutils literal notranslate"><span class=pre >inconsistent_with_merge</span></code></p> <td><p>The frames diffract as the run does, but their intensities do not agree with it — the only evidence is <code class="docutils literal notranslate"><span class=pre >DELTA_CC_HALF</span></code>, so the cause is not named.</p> </table> <p>The vocabulary is <strong>closed and stable</strong>: a code is never renamed, and never reused for a different meaning. New codes are only ever added, and adding one moves <code class="docutils literal notranslate"><span class=pre >REPORT_VERSION</span></code> at the next release.</p> <p>The columns are: <code class="docutils literal notranslate"><span class=pre >FIRST_IMAGE</span></code>/<code class="docutils literal notranslate"><span class=pre >LAST_IMAGE</span></code> — inclusive, in processed-image ordinals (the numbering of <code class="docutils literal notranslate"><span class=pre >&lt;prefix&gt;_plot.txt</span></code> and of every other per-image array <code class="docutils literal notranslate"><span class=pre >rugnux</span></code> writes; with <code class="docutils literal notranslate"><span class=pre >-s</span></code>/<code class="docutils literal notranslate"><span class=pre >--stride</span></code> the source image is <code class="docutils literal notranslate"><span class=pre >start</span> <span class=pre >+</span> <span class=pre >ordinal</span> <span class=pre >*</span> <span class=pre >stride</span></code>); <code class="docutils literal notranslate"><span class=pre >ROTATION</span></code> — the width of the range in degrees; <code class="docutils literal notranslate"><span class=pre >SEVERITY</span></code> — the fraction of the run’s typical diffracting power missing over the range, 0 (as good as the run) to 1 (nothing at all); <code class="docutils literal notranslate"><span class=pre >SCALE</span></code> and <code class="docutils literal notranslate"><span class=pre >CC</span></code> — the range’s mean per-image scale and CC-to-merge relative to the run median; <code class="docutils literal notranslate"><span class=pre >INDEXED</span></code> — the fraction of the range’s frames that were scaled at all; <code class="docutils literal notranslate"><span class=pre >DISPOSITION</span></code> — what became of it; <code class="docutils literal notranslate"><span class=pre >DELTA_CC_HALF</span></code> and <code class="docutils literal notranslate"><span class=pre >DELTA_CC_HALF_SE</span></code> — what keeping it costs the merged intensities, and how precisely that is known. Every range also appears as a <code class="docutils literal notranslate"><span class=pre >WARNING:</span></code> sentence in the SUMMARY, with the same cost in words. A range is split where its disposition changes, so each row is wholly kept or wholly rejected.</p> <section id=what-the-disposition-means-and-what-decides-it > <h3 id=what-the-disposition-means-and-what-decides-it ><a class=toc-backref href="#id7" role=doc-backlink >What the disposition means, and what decides it</a><a class=headerlink href="#what-the-disposition-means-and-what-decides-it" title="Link to this heading"></a></h3> <table> <thead> <tr class=row-odd ><th class=head ><p>Disposition</p> <th class=head ><p>Meaning</p> <tr class=row-even ><td><p><code class="docutils literal notranslate"><span class=pre >merged</span></code></p> <td><p>The frame’s observations are in the merged data at their own weight.</p> <tr class=row-odd ><td><p><code class="docutils literal notranslate"><span class=pre >downgraded</span></code></p> <td><p>They are in the merged data, but over a stretch the run itself flagged, carried at the reduced weight the frame’s own scale and sigmas give it. Nothing extra is subtracted: for weak-but-consistent data that reduced weight <em>is</em> the honest weight, and a second, invented per-frame weight would double-count with the σ’s.</p> <tr class=row-even ><td><p><code class="docutils literal notranslate"><span class=pre >rejected</span></code></p> <td><p>Nothing of the frame reached the merge — because ΔCC1/2 convicted it, because an earlier guard dropped a frame whose scale had collapsed to an unusable number, or because the frame recorded nothing to drop in the first place. To a user asking how much of the experiment was useless these are the same answer, and the <code class="docutils literal notranslate"><span class=pre >REASON</span></code> column separates them.</p> </table> <p><code class="docutils literal notranslate"><span class=pre >DELTA_CC_HALF</span></code> is <strong>ΔCC1/2</strong>: the overall CC1/2 of the merged data <strong>with</strong> the range minus the CC1/2 <strong>without</strong> it, evaluated over the reflections the range touches. Negative means keeping the range makes the merged intensities worse. It is computed in the σ-τ form — no random half-dataset split, so the same input gives the same answer every run — with each reflection’s error variance taken from the observed scatter of its own observations, not from the error model’s σ’s (a bad stretch claims the same σ’s as a good one, so an error-model estimate would read a stretch that adds noise as one that adds precision). It is a CC1/2 over <strong>the range’s own reflections</strong>, not over the whole dataset — a range that touches a few hundred reflections can carry a large ΔCC1/2 without the dataset’s headline CC1/2 moving by anything like as much. <code class="docutils literal notranslate"><span class=pre >DELTA_CC_HALF_SE</span></code> is the standard error of a CC1/2 on that many reflections, in the same units, and a ΔCC1/2 smaller than it says nothing.</p> <p>A range is rejected only where ΔCC1/2 is <strong>both well below the rest of this run’s own batches and several standard errors below zero</strong>, and only where <strong>every frame in it is one the per-image channels call worse than the run’s typical frame</strong> — the scale and the CC to the merge, frame by frame and never as an average over the stretch, because an average cannot tell a uniformly bad stretch from a healthy arc lying beside a dead one. All three are needed: a healthy crystal merges at CC1/2 ≈ 0.999, where a harm of 0.001 in CC is already many standard errors, so significance alone convicts frames on clean data whose removal moves nothing; and ΔCC1/2 is itself measured against the merge, so removing whichever frames disagree with it most improves every agreement statistic whether or not anything was wrong with them — the decision has to be triggered by a channel that owes nothing to the merge, and only then confirmed by what the merge does. The test runs last, after the per-frame scale, the decay slope and the per-batch relative-<em>B</em> have been fitted, so it judges corrected data. The decision is taken over 10° batches — the same batches as the radiation-damage curve — and over those batches doubled, and doubled again, up to a quarter of the sweep: a defect much longer than a batch is invisible one batch at a time, because each batch inside it is judged against a merge that still contains the rest of the defect. Where the harm lies is then settled finely: each edge of the convicted stretch is slid frame by frame with the <em>whole</em> stretch re-measured at every position, so the range is reported where it actually lies rather than at the batch grid, and the reflection count the verdict rests on never shrinks with the edge. Each edge is then pulled back off any frame the per-image channels call normal, and what is left has to carry the verdict again on its own: a stretch that cannot be taken without healthy frames holds more than one thing and is not removed at all. A rejected stretch is never narrower than one rocking event, because the partials of one event are combined into the same intensities and inside it no frame can be judged apart from its neighbours. Never more than a quarter of the sweep is removed.</p> <p><strong>What ΔCC1/2 cannot do</strong>, because the report must not imply otherwise:</p> <ul class=simple > <li><p>it says nothing about the <strong>cause</strong>: a shutter fault and a crystal that slipped have the identical signature, both integrating background, so the cause comes from the <code class="docutils literal notranslate"><span class=pre >REASON</span></code> column and never from the ΔCC1/2 itself;</p> <li><p>a <strong>second lattice entering</strong> is invisible to it: those spots were never integrated, so they are not in the merged intensities it measures;</p> <li><p>a <strong>centring drift that is pure attenuation</strong> reads ≈ 0. That is the right answer, not a blind spot: the data are weak but consistent, the σ’s already say so, and their ΔCC1/2 is the evidence that discarding them would cost completeness for nothing;</p> <li><p>it is attributed to the frame carrying a rocking event’s <strong>peak</strong> partial, so it cannot resolve a single frame: a stretch narrower than one rocking event is never rejected, and the edges of a rejected stretch are soft to within half an event;</p> <li><p><code class="docutils literal notranslate"><span class=pre >loss_of_centring</span></code> needs ≥ 350° of sweep to be named at all. On a 90° sweep the same drift is still <em>detected</em>, only as <code class="docutils literal notranslate"><span class=pre >crystal_out_of_beam</span></code> or <code class="docutils literal notranslate"><span class=pre >weak_diffraction</span></code> — “cause not determined” here means this sweep cannot determine it, not that it is undeterminable.</p> </ul> <p>The same finding is written <strong>per image</strong> into the <code class="docutils literal notranslate"><span class=pre >_process.h5</span></code> as <code class="docutils literal notranslate"><span class=pre >/entry/MX/sweepQuality</span></code> and <code class="docutils literal notranslate"><span class=pre >/entry/MX/frameDisposition</span></code>, when one is written — see <a class="reference internal" href="HDF5.html#entry-mx-spot-finding-and-indexing-cxi-style"><span class="std std-ref">HDF5</span></a>.</p> <p><code class="docutils literal notranslate"><span class=pre >SPINDLE_SYMMETRY_AXIS_ANGLE_DEG=</span></code> and <code class="docutils literal notranslate"><span class=pre >SPINDLE_SYMMETRY_AXIS_ORDER=</span></code> (<code class="docutils literal notranslate"><span class=pre >--developer</span></code>) in section 4 say how the crystal sat on the goniometer: the angle between the spindle and the nearest symmetry axis, and that axis’s order. They are descriptive: neither convicts nor clears the mounting on its own, because an aligned axis of any order maps the sweep’s blind cone onto itself while an axis near perpendicular does the same only when it is a lone 2-fold, and only the nearest axis is reported. (New in <code class="docutils literal notranslate"><span class=pre >REPORT_VERSION=</span> <span class=pre >7</span></code>.)</p> <p><code class="docutils literal notranslate"><span class=pre >SPINDLE_LOST_UNIQUE_FRACTION=</span></code> in section 4 is the exact verdict the angle cannot give: the fraction (0-1, so 0.0300 means 3%) of unique reflections, to this run’s resolution limit, that the mounting made unmeasurable - the part of the sweep’s blind double cone that no operator of the measured point group maps onto measured territory, computed in the crystal’s actual indexed orientation. 0.0000 means the mounting cost nothing; the run warns when the group recovers less than half of the cone’s content. The same number is written to the master file as <code class="docutils literal notranslate"><span class=pre >/entry/MX/spindleLostUniqueFraction</span></code>, so a pipeline can read it from either output without parsing prose. Written on every rotation run that determined a space group and merged reflections.</p> </section> </section> <section id=powder-contamination > <h2 id=powder-contamination ><a class=toc-backref href="#id8" role=doc-backlink >Powder contamination</a><a class=headerlink href="#powder-contamination" title="Link to this heading"></a></h2> <p>A crystalline phase other than the crystal, diffracting as rings among its reflections — hexagonal ice, a shower of microcrystals, a salt out of the cryoprotectant. It is measured on <strong>every</strong> run, in the pre-scan, from the spots found there, and reported whether or not anything acted on it: a user whose crystal sat in a powder is told so even where the run indexed perfectly well. Only hexagonal ice has rings that can be named in advance, so <code class="docutils literal notranslate"><span class=pre >POWDER_RINGS_A</span></code> is what <em>this</em> sample showed.</p> <div class="highlight-default notranslate"><div class=highlight ><pre><span></span><span class=n >POWDER_RINGS_DETECTED</span><span class=o >=</span> <span class=n >TRUE</span>
<span class=n >POWDER_RING_COUNT</span><span class=o >=</span> <span class=mi >24</span>
<span class=n >POWDER_SPOT_FRACTION</span><span class=o >=</span> <span class=mf >0.412</span>
<span class=n >POWDER_RINGS_SEPARABLE_TO</span><span class=o >=</span> <span class=mf >2.31</span>
<span class=n >POWDER_RINGS_A</span><span class=o >=</span> <span class=mf >3.897</span> <span class=mf >3.671</span> <span class=mf >3.447</span> <span class=o >...</span>
<span class=n >POWDER_EXCLUDED_FROM_INDEXING</span><span class=o >=</span> <span class=n >TRUE</span>
<span class=n >POWDER_INDEXING_D_MIN</span><span class=o >=</span> <span class=mf >4.91</span>
</pre></div> </div> <p><code class="docutils literal notranslate"><span class=pre >POWDER_RINGS_DETECTED</span></code> is written on every merging run and is <code class="docutils literal notranslate"><span class=pre >FALSE</span></code> on nearly all of them; the rest of the keys appear only where rings were found. <code class="docutils literal notranslate"><span class=pre >POWDER_SPOT_FRACTION</span></code> is the share of the pre-scan’s spots the rings hold <em>over</em> the smooth fall-off around them — what the contaminant contributes, not what happens to lie in a ring band. <code class="docutils literal notranslate"><span class=pre >POWDER_RINGS_SEPARABLE_TO</span></code> is the resolution past which the rings crowd together too tightly to be told apart, and so the finest an indexing pass can be asked to trust on such a pattern; it is absent where they stay separable over the whole range, which is the ordinary case. <code class="docutils literal notranslate"><span class=pre >POWDER_EXCLUDED_FROM_INDEXING</span></code> says whether the run needed them left out to index at all (with <code class="docutils literal notranslate"><span class=pre >POWDER_INDEXING_D_MIN</span></code> the resolution the retried first pass used). Rings are detected far more often than they are excluded: exclusion happens only where a first pass found no usable lattice. The rings are split between those on a hexagonal-ice position (<strong><code class="docutils literal notranslate"><span class=pre >POWDER_ICE_RING_COUNT=</span></code></strong>, <strong><code class="docutils literal notranslate"><span class=pre >POWDER_ICE_SPOT_FRACTION=</span></code></strong>) and the rest - a salt, microcrystals, another phase (<strong><code class="docutils literal notranslate"><span class=pre >POWDER_NON_ICE_SPOT_FRACTION=</span></code></strong>); the two fractions add up to <code class="docutils literal notranslate"><span class=pre >POWDER_SPOT_FRACTION=</span></code>. The summary’s <code class="docutils literal notranslate"><span class=pre >Powder</span></code> line gives both. A warning under the <code class="docutils literal notranslate"><span class=pre >ICE_RINGS</span></code> flag is given where the ice rings hold at least 5 % of the spots, and one under <code class="docutils literal notranslate"><span class=pre >POWDER_RINGS</span></code> where the other rings do.</p> <p>Hexagonal ice is also measured by the merge itself, which leaves reflections on the ice rings out of scaling (and keeps them in the merge) where it finds ice:</p> <div class="highlight-default notranslate"><div class=highlight ><pre><span></span><span class=n >ICE_RINGS_DETECTED</span><span class=o >=</span> <span class=n >TRUE</span>
<span class=n >ICE_RING_SCORE</span><span class=o >=</span> <span class=mf >2.69</span>
<span class=n >ICE_SPOT_RATIO</span><span class=o >=</span> <span class=mf >1.08</span>
<span class=n >ICE_REFLECTIONS_ON_RINGS_PCT</span><span class=o >=</span> <span class=mf >25.7</span>
</pre></div> </div> <p><strong><code class="docutils literal notranslate"><span class=pre >ICE_RING_SCORE=</span></code></strong> is the strongest ice ring over the smooth radial background (fine-grained ice that makes a smooth ring), <strong><code class="docutils literal notranslate"><span class=pre >ICE_SPOT_RATIO=</span></code></strong> the pile-up of found spots on the ring positions against the ice-free flanks beside them (ice in large crystallites); 1 is no ice on either. <strong><code class="docutils literal notranslate"><span class=pre >ICE_RINGS_DETECTED=</span></code></strong> is <code class="docutils literal notranslate"><span class=pre >TRUE</span></code> where either passes its gate (1.5 and 2.0), and <strong><code class="docutils literal notranslate"><span class=pre >ICE_REFLECTIONS_ON_RINGS_PCT=</span></code></strong> is then the share of the integrated reflections set aside from scaling. The summary has an <code class="docutils literal notranslate"><span class=pre >Ice</span></code> line, and where the merge found ice an <code class="docutils literal notranslate"><span class=pre >ICE_RINGS</span></code> warning prompts a look at the ice-ring shells (one warning line, whichever of the two measurements raised it). The measurement is described in <a class="reference internal" href="CPU_DATA_ANALYSIS_IMAGE.html#resolution-and-ice-ring-handling"><span class="std std-ref">CPU/GPU data analysis ▸ Resolution and ice-ring handling</span></a>.</p> </section> <section id=index-2-superstructure > <h2 id=index-2-superstructure ><a class=toc-backref href="#id9" role=doc-backlink >Index-2 superstructure</a><a class=headerlink href="#index-2-superstructure" title="Link to this heading"></a></h2> <p>On rotation data, section 4 reports whether the lattice the run adopted has intensity at half-integer positions it does not index. On 60 frames spread over the sweep, after each frame’s own integration, the lattice is predicted doubled along all three primitive axes and integrated to 3 Å; the reflections split into eight parity classes of h, k and l, of which <code class="docutils literal notranslate"><span class=pre >0</span> <span class=pre >0</span> <span class=pre >0</span></code> is the lattice itself and each of the other seven is one index-2 superstructure. Nothing is decided on it: whether a superstructure belongs in the cell is as much the depositor’s call as the data’s, and several crystals whose accepted cell is the sub-cell carry one.</p> <p><strong><code class="docutils literal notranslate"><span class=pre >SUPERCELL_CLASS=</span></code></strong> is the parity class with the most intensity over 20–3 Å. <strong><code class="docutils literal notranslate"><span class=pre >SUPERCELL_OCCUPANCY_PCT=</span></code></strong> is its mean intensity against the lattice’s own reflections on the same frames, and <strong><code class="docutils literal notranslate"><span class=pre >SUPERCELL_ROCK_PCT=</span></code></strong> (± <strong><code class="docutils literal notranslate"><span class=pre >SUPERCELL_ROCK_SE_PCT=</span></code></strong>) the part of it that follows the partiality the way a Bragg reflection does, from a fit I = a + b p over the class, on the same scale. <strong><code class="docutils literal notranslate"><span class=pre >SUPERCELL_I_OVER_SIGMA=</span></code></strong> is its mean I/σ. A class near zero on both is empty. One that is occupied and rocks is a superstructure whose reflections this run did not integrate; <strong><code class="docutils literal notranslate"><span class=pre >SUPERCELL_DOUBLED_CELL=</span></code></strong> is the Niggli-reduced cell the lattice would double to, to give with <code class="docutils literal notranslate"><span class=pre >-C</span></code> to process on it. One that is occupied but hardly rocks is diffuse or disordered intensity rather than Bragg reflections.</p> <p><strong><code class="docutils literal notranslate"><span class=pre >SUPERCELL_POSSIBLE=</span></code></strong> is <code class="docutils literal notranslate"><span class=pre >TRUE</span></code> where the class is measured (<code class="docutils literal notranslate"><span class=pre >SUPERCELL_I_OVER_SIGMA=</span></code> at least 0.5) and part of it rocks like Bragg reflections (<code class="docutils literal notranslate"><span class=pre >SUPERCELL_ROCK_PCT=</span></code> at least 2 %, three standard errors clear of zero). It is advice to check, not a finding: the same numbers come from a real doubled cell and from a correct cell with weak ordered intensity between its reflections - or with further lattice domains whose spots land on the half-integer positions - and which of the two a structure is decided by refinement. Process both settings - the run’s cell, and <code class="docutils literal notranslate"><span class=pre >SUPERCELL_DOUBLED_CELL=</span></code> given with <code class="docutils literal notranslate"><span class=pre >-C</span></code> - and compare them there. A <code class="docutils literal notranslate"><span class=pre >TRUE</span></code> is also a warning under the <code class="docutils literal notranslate"><span class=pre >SUPERCELL_POSSIBLE</span></code> flag, worded as a prompt to check: on a battery of rotation data sets most of the crystals it named refine normally in the sub-cell (rocking parts of 2-16 %), but a real doubled cell can read inside that range too. The summary’s <code class="docutils literal notranslate"><span class=pre >Supercell</span></code> line carries the same advice, and says where further lattice domains were found that may put spots on the half-integer positions.</p> </section> <section id=further-lattices > <h2 id=further-lattices ><a class=toc-backref href="#id10" role=doc-backlink >Further lattices</a><a class=headerlink href="#further-lattices" title="Link to this heading"></a></h2> <p>On rotation data, once the first pass has its lattice, section 4 reports what the spots that lattice leaves over index to. Every spot of the spread and validation frames the main lattice takes is set aside; the rest, ice left out, go to a fresh rotation indexer. A lattice it finds is kept when the leftover validation spots sit on it far more often than they do with each frame’s spots displaced to another frame’s spindle angle - the null the first pass judges its own lattice against - by at least five standard deviations (<strong><code class="docutils literal notranslate"><span class=pre >EXTRA_LATTICE_&lt;n&gt;_Z=</span></code></strong>). Its spots are set aside in turn and the search goes on, up to three lattices. A lattice of the same cell within 1° of the main one is the main lattice’s own spots its tolerance missed, and is not listed. Nothing is decided on any of this: only the main lattice is integrated, whatever is found.</p> <p><strong><code class="docutils literal notranslate"><span class=pre >MAIN_LATTICE_SPOTS_PCT=</span></code></strong> and <strong><code class="docutils literal notranslate"><span class=pre >MAIN_LATTICE_INTENSITY_PCT=</span></code></strong> are the main lattice’s share of the non-ice spots of those frames and of their summed intensity; <strong><code class="docutils literal notranslate"><span class=pre >EXTRA_LATTICE_COUNT=</span></code></strong> is the number of lattices listed. For each, numbered from 1 in the order found:</p> <ul class=simple > <li><p><strong><code class="docutils literal notranslate"><span class=pre >EXTRA_LATTICE_&lt;n&gt;_KIND=</span></code></strong> — <code class="docutils literal notranslate"><span class=pre >DOMAIN</span></code>: the same cell, misoriented, over the whole sweep (a split crystal; more than 10° from the main lattice, the report calls it a second crystal); <code class="docutils literal notranslate"><span class=pre >TWIN_DOMAIN</span></code>: the same, turned by 180° (within 3°) — a non-merohedral twin domain; <code class="docutils literal notranslate"><span class=pre >SEGMENTED</span></code>: the same cell, with at least 60 % of its spots in 2 of 8 equal blocks of the sweep — the crystal in the beam changes along the rotation; <code class="docutils literal notranslate"><span class=pre >RELATED_CELL</span></code>: a cell whose volume is 1 to 8 times, or a 1/2 to 1/8 of, the main one’s — a question about the main cell (see the supercell keys above and the harmonic) rather than a second crystal; <code class="docutils literal notranslate"><span class=pre >FOREIGN</span></code>: an unrelated cell — a second crystal, or a main lattice that is not the crystal’s.</p> <li><p><strong><code class="docutils literal notranslate"><span class=pre >EXTRA_LATTICE_&lt;n&gt;_LATTICE=</span></code></strong> and <strong><code class="docutils literal notranslate"><span class=pre >EXTRA_LATTICE_&lt;n&gt;_CELL=</span></code></strong> — its crystal system, centring and conventional cell.</p> <li><p><strong><code class="docutils literal notranslate"><span class=pre >EXTRA_LATTICE_&lt;n&gt;_VOLUME_RATIO=</span></code></strong> — its reduced cell volume over the main one’s.</p> <li><p><strong><code class="docutils literal notranslate"><span class=pre >EXTRA_LATTICE_&lt;n&gt;_MISORIENTATION_DEG=</span></code></strong> — for the same cell only: the smallest rotation taking the main lattice onto it, over every basis whose metric matches, so a symmetry of the lattice is not read as a misorientation.</p> <li><p><strong><code class="docutils literal notranslate"><span class=pre >EXTRA_LATTICE_&lt;n&gt;_SPOTS_PCT=</span></code></strong>, <strong><code class="docutils literal notranslate"><span class=pre >EXTRA_LATTICE_&lt;n&gt;_INTENSITY_PCT=</span></code></strong> — its share of the non-ice spots and of their intensity.</p> <li><p><strong><code class="docutils literal notranslate"><span class=pre >EXTRA_LATTICE_&lt;n&gt;_SWEEP_CONCENTRATION=</span></code></strong> — the share of its spots in the 2 densest of 8 blocks of the sweep; 0.25 is uniform.</p> </ul> <p><strong><code class="docutils literal notranslate"><span class=pre >EXTRA_LATTICE_INTENSITY_PCT=</span></code></strong> sums the intensity share of the domains (<code class="docutils literal notranslate"><span class=pre >DOMAIN</span></code>, <code class="docutils literal notranslate"><span class=pre >TWIN_DOMAIN</span></code>, <code class="docutils literal notranslate"><span class=pre >SEGMENTED</span></code>); a <code class="docutils literal notranslate"><span class=pre >RELATED_CELL</span></code> or <code class="docutils literal notranslate"><span class=pre >FOREIGN</span></code> lattice is listed but not counted, since it is as often a wrong main lattice or tNCS as a second crystal, and <strong><code class="docutils literal notranslate"><span class=pre >MULTIPLE_LATTICES=</span></code></strong> is <code class="docutils literal notranslate"><span class=pre >TRUE</span></code>, with a warning under the <code class="docutils literal notranslate"><span class=pre >MULTIPLE_LATTICES</span></code> flag, where that sum is at least 10 % - the domains together, not the strongest alone. It is information, not a failure: a split crystal whose second domain is half as strong as the main one can still give data as good as XDS’s, since the domains’ reflections are only a problem where they overlap the main lattice’s. Look at the crystal, and at the result. The summary at the top of the report has a <code class="docutils literal notranslate"><span class=pre >Multiple</span> <span class=pre >lattices</span></code> line, <code class="docutils literal notranslate"><span class=pre >none</span> <span class=pre >found</span></code> where nothing was listed.</p> </section> <section id=mosaicity > <h2 id=mosaicity ><a class=toc-backref href="#id11" role=doc-backlink >Mosaicity</a><a class=headerlink href="#mosaicity" title="Link to this heading"></a></h2> <p><strong><code class="docutils literal notranslate"><span class=pre >MOSAICITY_DEG=</span></code></strong> (section 2, and a <code class="docutils literal notranslate"><span class=pre >Mosaicity</span></code> line in the summary) is the mosaic spread the merge computed partiality from, on rotation data: Kabsch’s σ_M, the standard deviation (not the FWHM) of a reflection’s rocking curve in degrees, in the same partiality model as XDS - so it is the number to set beside XDS’s <code class="docutils literal notranslate"><span class=pre >REFLECTING_RANGE_E.S.D.</span></code>: the value under <em>SUGGESTED VALUES FOR INPUT PARAMETERS</em> at the end of <code class="docutils literal notranslate"><span class=pre >INTEGRATE.LP</span></code>, which <code class="docutils literal notranslate"><span class=pre >CORRECT.LP</span></code> repeats. On in-house rotation data it reads 0.90× that value (median over 34 data sets). XDS’s per-image <code class="docutils literal notranslate"><span class=pre >SIGMAR</span></code> column and the per-block <em>CRYSTAL MOSAICITY</em> in <code class="docutils literal notranslate"><span class=pre >INTEGRATE.LP</span></code> are a different number - they run about 1.35× higher - and are not the comparison. It is fitted on every frame by maximum likelihood from the rocking offsets of that frame’s 250 strongest indexed spots, with the energy bandwidth taken out where the beam has one (XDS keeps it in), and smoothed in frame order; the value is the median over the frames, with <strong><code class="docutils literal notranslate"><span class=pre >MOSAICITY_DEG_P10=</span></code></strong> and <strong><code class="docutils literal notranslate"><span class=pre >MOSAICITY_DEG_P90=</span></code></strong> for its spread. The per-frame values are the <code class="docutils literal notranslate"><span class=pre >sigma_M_deg</span></code> column of <code class="docutils literal notranslate"><span class=pre >_plot.txt</span></code>.</p> </section> <section id=translational-pseudo-symmetry > <h2 id=translational-pseudo-symmetry ><a class=toc-backref href="#id12" role=doc-backlink >Translational pseudo-symmetry</a><a class=headerlink href="#translational-pseudo-symmetry" title="Link to this heading"></a></h2> <p>Two copies of the contents of the asymmetric unit related by a pure translation that is not a lattice vector. It is the pathology that most reliably breaks molecular replacement, because the modulation it puts on the intensities is not in the search model. Section 4 reports it beside twinning, because the two interact. The algorithm is in <a class="reference internal" href="CPU_DATA_ANALYSIS_DECISIONS.html#twinning-check-and-translational-pseudo-symmetry"><span class="std std-ref">CPU/GPU data analysis ▸ Twinning and translational pseudo-symmetry</span></a>.</p> <p><strong><code class="docutils literal notranslate"><span class=pre >TNCS_DETECTED=</span></code></strong> is <code class="docutils literal notranslate"><span class=pre >TRUE</span></code>, <code class="docutils literal notranslate"><span class=pre >FALSE</span></code>, <code class="docutils literal notranslate"><span class=pre >INCONCLUSIVE</span></code> or <code class="docutils literal notranslate"><span class=pre >NOT_MEASURED</span></code>. The last two are not <code class="docutils literal notranslate"><span class=pre >FALSE</span></code>: <code class="docutils literal notranslate"><span class=pre >NOT_MEASURED</span></code> means the merge has too few reflections in 20–5 Å to compute the statistic at all, <code class="docutils literal notranslate"><span class=pre >INCONCLUSIVE</span></code> means the Patterson was measured but too few acentric reflections remain to test whether the vector it names modulates the intensities. Neither is a statement that the crystal has no pseudo-symmetry.</p> <p>A warning under the <code class="docutils literal notranslate"><span class=pre >PSEUDO_TRANSLATION</span></code> flag is given wherever <code class="docutils literal notranslate"><span class=pre >TNCS_DETECTED=</span> <span class=pre >TRUE</span></code>. Below a Patterson peak of 20 % of the origin (the height phenix.xtriage flags) the detection is significant but its modulation is small; the warning and the summary call it weak and ask to check whether molecular replacement needs it.</p> <p><code class="docutils literal notranslate"><span class=pre >TRUE</span></code> requires <strong>both</strong> of two tests, because either alone over-calls by about a factor of two:</p> <ul class=simple > <li><p><strong><code class="docutils literal notranslate"><span class=pre >TNCS_PATTERSON_PEAK_PCT=</span></code></strong> — the largest off-origin peak of the native Patterson, as a percentage of the origin peak, counting only peaks farther than 15 Å from any origin-equivalent lattice point. <strong><code class="docutils literal notranslate"><span class=pre >TNCS_PATTERSON_PEAK_Z=</span></code></strong> scores it against <strong><code class="docutils literal notranslate"><span class=pre >TNCS_PATTERSON_NULL_PCT=</span></code></strong>, the same map recomputed with the intensities permuted within resolution shells. The null is per dataset and not a table: the noise floor of this statistic runs from about 1% on a large merge to about 18% on a small one, so no fixed percentage separates the two populations.</p> <li><p><strong><code class="docutils literal notranslate"><span class=pre >TNCS_MODULATION=</span></code></strong> — the ratio of the strongest to the weakest bin mean of ⟨E²⟩ over the phase frac(<strong>h</strong>·<strong>u</strong>), with <strong>u</strong> the refined peak vector (<strong><code class="docutils literal notranslate"><span class=pre >TNCS_VECTOR=</span></code></strong>, fractional, and <strong><code class="docutils literal notranslate"><span class=pre >TNCS_VECTOR_LENGTH=</span></code></strong> in Å). <strong><code class="docutils literal notranslate"><span class=pre >TNCS_MODULATION_NULL=</span></code></strong> is the same search started from random vectors, so the contrast the search itself can manufacture is measured rather than assumed.</p> </ul> <p>The vector is good to about 0.05 fractional. It is a starting point for a program that refines it, not a refined result: the refinement maximises the modulation, not the accuracy of the vector.</p> <p><strong><code class="docutils literal notranslate"><span class=pre >TNCS_PSEUDO_CENTRED=</span></code></strong> and <strong><code class="docutils literal notranslate"><span class=pre >TNCS_SUBLATTICE=</span></code></strong> are separate claims and are deliberately not merged. A vector that is a rational translation <code class="docutils literal notranslate"><span class=pre >1/q</span></code> of the cell means the crystal is pseudo-centred; the cell itself is not in question, because the suppressed class is weak rather than absent and a smaller cell would contradict it. Only <code class="docutils literal notranslate"><span class=pre >TNCS_SUBLATTICE=</span> <span class=pre >NEAR_EXTINCT_CLASS</span></code> — the suppressed class almost gone — says the reported cell may be a supercell.</p> <p><strong><code class="docutils literal notranslate"><span class=pre >UNDECLARED_LATTICE_TRANSLATION=</span></code></strong> is a different finding, and is reported instead of a pseudo-symmetry rather than as one: a translation at which the Patterson reaches at least 75 % of the origin, <strong><code class="docutils literal notranslate"><span class=pre >UNDECLARED_LATTICE_TRANSLATION_PCT=</span></code></strong>. Near 100 % the merged data are invariant under it, and a translation the data are invariant under is a lattice vector by definition — so the centring or the cell is wrong, not the packing; an undeclared centring reads 83-102 %. Every one is a warning under the <code class="docutils literal notranslate"><span class=pre >LATTICE_TRANSLATION</span></code> flag, asking to check the centring and the cell; below 90 % the warning also names the other reading, a very strong pseudo-translation that molecular replacement needs declared, which refinement in the cell tells apart. It is what a centred lattice merged in P1 looks like, which <code class="docutils literal notranslate"><span class=pre >--mode</span> <span class=pre >scale</span></code> on a file with no space group produces by design. The pseudo-symmetry search continues underneath it, so a real pseudo-translation sitting under an undeclared centring is still found.</p> <p><strong><code class="docutils literal notranslate"><span class=pre >L_TEST_VS_TNCS=</span></code></strong> says how the twinning L-test beside it coped. A pseudo-translation <strong>u</strong> biases ⟨|L|⟩ upwards unless the partner reflection at <strong>h</strong> + <strong>s</strong> shares its class, which happens exactly when <strong>s</strong>·<strong>u</strong> is an integer; a half-integer <strong>u</strong> — a pseudo-centering — is preserved by the ordinary axis step of 2 and reads <code class="docutils literal notranslate"><span class=pre >UNAFFECTED</span></code>. Where it is not, the steps are restricted to those that do preserve the class (<code class="docutils literal notranslate"><span class=pre >REPAIRED</span></code>), and where no step does, <code class="docutils literal notranslate"><span class=pre >UNREADABLE</span></code> says the statistic was dropped from the twin verdict <strong>in both directions</strong>: it can no longer indicate a twin, and it can no longer be read as proof that there is none. The second moment then decides alone.</p> <p><strong><code class="docutils literal notranslate"><span class=pre >TWINNING_VERDICT=</span></code></strong> is <code class="docutils literal notranslate"><span class=pre >NO_INDICATION</span></code>, <code class="docutils literal notranslate"><span class=pre >INDICATED</span></code> (⟨|L|⟩ below 0.44, the phenix.xtriage convention, or the second moment low, in a Laue class that admits a twin law), <code class="docutils literal notranslate"><span class=pre >SYMMETRY_SUSPECT</span></code> (the same low reading in a holohedral class, where no twin law exists and a false adopted operator gives the same distribution) or <code class="docutils literal notranslate"><span class=pre >NOT_READABLE</span></code>. ⟨|L|⟩ has a physical range: 0.5 untwinned, 0.375 a perfect twin, whatever the law. Where it reads below 0.375, or above 0.55 (on this merge or on the one before the space-group search), no twin fraction explains it - the statistic is distorted, by tNCS, anisotropy, overlapping reflections of a very long cell, or too few reflections - and the verdict is <code class="docutils literal notranslate"><span class=pre >NOT_READABLE</span></code>, with no warning: it says nothing about twinning, nor about the space group.</p> </section> <section id=diffraction-anisotropy > <h2 id=diffraction-anisotropy ><a class=toc-backref href="#id13" role=doc-backlink >Diffraction anisotropy</a><a class=headerlink href="#diffraction-anisotropy" title="Link to this heading"></a></h2> <p>Section 4 also reports how much the fall-off with resolution depends on <strong>direction</strong>, and whether that is established above the data set’s own systematic error. It runs automatically on every merging run — there is no flag — and it is a <strong>description only</strong>: no intensity is corrected, no reflection is removed on a directional criterion, and the merged data and the written reflection files do not depend on direction at all. The algorithm is in <a class="reference internal" href="CPU_DATA_ANALYSIS_DECISIONS.html#diffraction-anisotropy"><span class="std std-ref">CPU/GPU data analysis ▸ Diffraction anisotropy</span></a>.</p> <p>Two different quantities are reported and they are not interchangeable. <code class="docutils literal notranslate"><span class=pre >ANISOTROPY_DELTA_B</span></code> is a <em>rate</em> — the range of the principal components of the anisotropy tensor, on the ordinary crystallographic <em>B</em> scale, so it is directly comparable with phenix.xtriage’s <code class="docutils literal notranslate"><span class=pre >B_cart</span></code>, ctruncate’s anisotropic <em>B</em> and AIMLESS’s anisotropic Δ<em>B</em>. <code class="docutils literal notranslate"><span class=pre >ANISOTROPY_D_MIN_PRINCIPAL</span></code> is where the signal actually <em>runs out</em> along each principal direction. A crystal can have a large Δ<em>B</em> and almost no spread in directional limit, or the reverse.</p> <table> <thead> <tr class=row-odd ><th class=head ><p>key</p> <th class=head ><p>meaning</p> <tr class=row-even ><td><p><code class="docutils literal notranslate"><span class=pre >ANISOTROPY_VERDICT</span></code></p> <td><p><code class="docutils literal notranslate"><span class=pre >DETECTED</span></code> | <code class="docutils literal notranslate"><span class=pre >NOT_DETECTED</span></code> | <code class="docutils literal notranslate"><span class=pre >CANNOT_DETERMINE</span></code></p> <tr class=row-odd ><td><p><code class="docutils literal notranslate"><span class=pre >ANISOTROPY_FREE_DIRECTIONS</span></code></p> <td><p>Deviatoric directions the Laue class allows — 5 triclinic, 3 monoclinic, 2 orthorhombic, 1 tetragonal/trigonal/hexagonal, <strong>0 cubic</strong></p> <tr class=row-even ><td><p><code class="docutils literal notranslate"><span class=pre >ANISOTROPY_DELTA_B</span></code></p> <td><p>The anisotropic Δ<em>B</em> (Ų), fitted on intensities with nothing dropped</p> <tr class=row-odd ><td><p><code class="docutils literal notranslate"><span class=pre >ANISOTROPY_DELTA_B_LINEAR</span></code></p> <td><p>The part of it that follows exp(−½ <strong>s</strong>ᵀ<em>B</em><strong>s</strong>). <strong>This is the number the verdict is gated on</strong>, and the report says which of the two it is quoting</p> <tr class=row-even ><td><p><code class="docutils literal notranslate"><span class=pre >ANISOTROPY_PRINCIPAL_B</span></code></p> <td><p>The three principal components, relative to the weakest</p> <tr class=row-odd ><td><p><code class="docutils literal notranslate"><span class=pre >ANISOTROPY_D_MIN_PRINCIPAL</span></code></p> <td><p>Diffraction limit (Å) along each principal direction — where ⟨I/σ(I)⟩ in a 20° cone about it falls through 2</p> <tr class=row-even ><td><p><code class="docutils literal notranslate"><span class=pre >ANISOTROPY_D_MIN_CENSORED</span></code></p> <td><p>One flag per direction. <code class="docutils literal notranslate"><span class=pre >1</span></code> means ⟨I/σ(I)⟩ never fell through 2, so the limit is the <strong>edge of the measured data</strong>, a bound and not a measurement. The prose marks it with a <code class="docutils literal notranslate"><span class=pre >&lt;</span></code></p> <tr class=row-odd ><td><p><code class="docutils literal notranslate"><span class=pre >ANISOTROPY_D_MIN_SPREAD</span></code></p> <td><p>Range of the three limits — itself a lower bound if any is censored</p> <tr class=row-even ><td><p><code class="docutils literal notranslate"><span class=pre >ANISOTROPY_SHAPE</span></code></p> <td><p><code class="docutils literal notranslate"><span class=pre >LINEAR</span></code> (a real Debye–Waller <em>B</em>) | <code class="docutils literal notranslate"><span class=pre >FLAT</span></code> (the deficit does not follow a <em>B</em> at all, so Δ<em>B</em> may be an <strong>under</strong>-estimate) | <code class="docutils literal notranslate"><span class=pre >CONVEX</span></code> (grows faster than a <em>B</em> can) | <code class="docutils literal notranslate"><span class=pre >UNDETERMINED</span></code> (the verdict moved on rebinning)</p> <tr class=row-odd ><td><p><code class="docutils literal notranslate"><span class=pre >ANISOTROPY_FLOOR</span></code>, <code class="docutils literal notranslate"><span class=pre >ANISOTROPY_SIGNIFICANCE</span></code></p> <td><p>The data set’s own systematic-error floor (Ų) and Δ<em>B</em><sub>linear</sub> over it. Banded: below 2 not established, 2–3.5 marginal, above 3.5 established, above 5 strong</p> <tr class=row-even ><td><p><code class="docutils literal notranslate"><span class=pre >ANISOTROPY_DETECTION_LIMIT</span></code></p> <td><p>The smallest Δ<em>B</em> that could have been established on these data. It is set by systematic error, not by counting, so it does <strong>not</strong> improve with more reflections or a longer exposure</p> <tr class=row-odd ><td><p><code class="docutils literal notranslate"><span class=pre >ANISOTROPY_N_OBSERVATIONS</span></code>, <code class="docutils literal notranslate"><span class=pre >ANISOTROPY_FORBIDDEN_Z</span></code>, <code class="docutils literal notranslate"><span class=pre >ANISOTROPY_SIGMA_SYSTEMATIC</span></code></p> <td><p>The unmerged observations the floor was measured on, that measurement against its own counting noise, and the floor before the counting part is added back</p> </table> <p>The default report carries <code class="docutils literal notranslate"><span class=pre >ANISOTROPY_VERDICT</span></code>, <code class="docutils literal notranslate"><span class=pre >ANISOTROPY_DELTA_B</span></code>, <code class="docutils literal notranslate"><span class=pre >ANISOTROPY_D_MIN_PRINCIPAL</span></code> and <code class="docutils literal notranslate"><span class=pre >ANISOTROPY_D_MIN_SPREAD</span></code>; the rest of this table — the detection gate’s own parameters — is written with <code class="docutils literal notranslate"><span class=pre >--developer</span></code>.</p> <p><strong><code class="docutils literal notranslate"><span class=pre >CANNOT_DETERMINE</span></code> is a real answer, not an evasion.</strong> The verdict is not measured against counting statistics — real data carry systematic error far larger than that, and gating on counting error reports anisotropy on data sets that have none. Instead the data set measures its own systematic error in the tensor directions its Laue class <em>forbids</em>, where the true value is exactly zero whatever the crystal is. Where that measurement cannot be made, the run says so and gives the reason: a <strong>triclinic</strong> Laue class (no forbidden direction exists), an observed rotation under about 90°, merged data at the noise floor, a scale model carrying no dose term (<code class="docutils literal notranslate"><span class=pre >--no-scaling-corrections</span></code>), or no unmerged observations. A <strong>cubic</strong> Laue class is different again — symmetry forces Δ<em>B</em> to be exactly zero, and the run says that rather than reporting a measurement.</p> <p>Where anisotropy is detected and the directional limits differ by more than 0.5 Å, a <code class="docutils literal notranslate"><span class=pre >WARNING:</span></code> line says so, since refinement and map interpretation should allow for it.</p> </section> <section id=model-validation > <h2 id=model-validation ><a class=toc-backref href="#id14" role=doc-backlink >Model validation</a><a class=headerlink href="#model-validation" title="Link to this heading"></a></h2> <p>Section 5 appears only with <code class="docutils literal notranslate"><span class=pre >--model</span></code>. It reports the supplied model against the merged data — R-factors, maps, anomalous sites — and, separately, whether the data accepted the model at all.</p> <p>The two are not the same question, and the report keeps them apart. <strong>The R-factors, the maps and the rigid-body placement describe the model</strong>: they are computed and reported whatever the answer, because a model that does not belong to this crystal still has an R against it, and that is the negative result. <strong><code class="docutils literal notranslate"><span class=pre >MODEL_FIT=</span></code> is the answer</strong>, and it is what governs whether the model was allowed to change anything about the written reflections.</p> <p>There is no threshold on R behind it. What a model that explains nothing reaches against a given data set depends on its atom count and B-factors as much as on the data, so the same model is refitted — and re-placed as a rigid body, exactly as the real one is — from <code class="docutils literal notranslate"><span class=pre >MODEL_FIT_NULL_REPLICATES</span></code> random orientations about its own centroid, and <code class="docutils literal notranslate"><span class=pre >MODEL_FIT_SIGMA</span></code> is how far the real fit sits above that distribution. The statistic is R-work, not R-free - not because nothing is refined against the working set (the placement’s six parameters are), but because every null replicate is placed the same way, so what they buy is bought on both sides and cancels; and it is decided on an order of magnitude more reflections than R-free.</p> <p>That null is <strong>only built where the model claims one of the two things it could change</strong> — the enantiomorph, or an indexing other than the one the data were merged in. A model already in the data’s space group on a crystal with no merohedral ambiguity, which is the isomorphous case a screening campaign is made of, claims neither: <code class="docutils literal notranslate"><span class=pre >MODEL_FIT=</span> <span class=pre >NOT_TESTED</span></code>, <code class="docutils literal notranslate"><span class=pre >MODEL_DECISIONS_TAKEN=</span> <span class=pre >NONE</span></code>, and the run does not pay for a null that would gate nothing. <strong><code class="docutils literal notranslate"><span class=pre >NOT_TESTED</span></code> is not <code class="docutils literal notranslate"><span class=pre >REJECTED</span></code></strong> — it says the question was never put, not that the data answered it badly — and the three values are distinguishable by grepping the one key. The <code class="docutils literal notranslate"><span class=pre >MODEL_FIT_NULL_*</span></code> and <code class="docutils literal notranslate"><span class=pre >MODEL_FIT_SIGMA</span></code> keys are absent in that case, since there is no null to report; <code class="docutils literal notranslate"><span class=pre >R_WORK</span></code>, <code class="docutils literal notranslate"><span class=pre >R_FREE</span></code>, the maps and the rigid-body shift are all there as usual.</p> <table> <thead> <tr class=row-odd ><th class=head ><p>key</p> <th class=head ><p>meaning</p> <tr class=row-even ><td><p><code class="docutils literal notranslate"><span class=pre >MODEL_VALIDATION</span></code></p> <td><p><code class="docutils literal notranslate"><span class=pre >PERFORMED</span></code> | <code class="docutils literal notranslate"><span class=pre >NOT_PERFORMED</span></code> (with <code class="docutils literal notranslate"><span class=pre >MODEL_VALIDATION_REASON</span></code>, and no R-factors)</p> <tr class=row-odd ><td><p><code class="docutils literal notranslate"><span class=pre >MODEL_FIT</span></code></p> <td><p><code class="docutils literal notranslate"><span class=pre >ACCEPTED</span></code> | <code class="docutils literal notranslate"><span class=pre >REJECTED</span></code> | <code class="docutils literal notranslate"><span class=pre >NOT_TESTED</span></code> — whether the model may decide anything, or had nothing to decide</p> <tr class=row-even ><td><p><code class="docutils literal notranslate"><span class=pre >MODEL_FIT_STATISTIC</span></code></p> <td><p>What the verdict was taken on; <code class="docutils literal notranslate"><span class=pre >R_WORK</span></code></p> <tr class=row-odd ><td><p><code class="docutils literal notranslate"><span class=pre >MODEL_FIT_VALUE</span></code>, <code class="docutils literal notranslate"><span class=pre >MODEL_FIT_NULL_MEAN</span></code>, <code class="docutils literal notranslate"><span class=pre >MODEL_FIT_NULL_SD</span></code>, <code class="docutils literal notranslate"><span class=pre >MODEL_FIT_NULL_REPLICATES</span></code></p> <td><p>The real fit, and the null of the same model in random orientations. Absent when <code class="docutils literal notranslate"><span class=pre >NOT_TESTED</span></code></p> <tr class=row-even ><td><p><code class="docutils literal notranslate"><span class=pre >MODEL_FIT_SIGMA</span></code></p> <td><p>The real fit above that null, in its standard deviations. Signed. Absent when <code class="docutils literal notranslate"><span class=pre >NOT_TESTED</span></code></p> <tr class=row-odd ><td><p><code class="docutils literal notranslate"><span class=pre >MODEL_DECISIONS_TAKEN</span></code></p> <td><p><code class="docutils literal notranslate"><span class=pre >NONE</span></code> | <code class="docutils literal notranslate"><span class=pre >ENANTIOMORPH</span></code> | <code class="docutils literal notranslate"><span class=pre >INDEXING</span></code> | <code class="docutils literal notranslate"><span class=pre >ENANTIOMORPH+INDEXING</span></code></p> <tr class=row-even ><td><p><code class="docutils literal notranslate"><span class=pre >MODEL_ENANTIOMORPH_ADOPTED</span></code>, <code class="docutils literal notranslate"><span class=pre >MODEL_INDEXING_OPERATOR</span></code></p> <td><p>The two decisions individually; <code class="docutils literal notranslate"><span class=pre >x,y,z</span></code> is no reindexing</p> <tr class=row-odd ><td><p><code class="docutils literal notranslate"><span class=pre >MODEL_CHANGE_OF_BASIS</span></code>, <code class="docutils literal notranslate"><span class=pre >MODEL_SETTING_AS_READ</span></code></p> <td><p>Present only where the model was written in another description of the lattice (other axes, other centring, or another point group) and was put into the data’s to be scored. Where such a model fits, the data are then written in the model’s setting instead (<code class="docutils literal notranslate"><span class=pre >SETTING_SOURCE=MODEL</span></code>) and these keys are absent, since the model no longer moves. An alternative indexing of the same point group is settled here only where a reference MTZ (<code class="docutils literal notranslate"><span class=pre >-z</span></code>) has already fixed the data’s indexing; otherwise the data are reindexed into the model’s, and that is <code class="docutils literal notranslate"><span class=pre >MODEL_INDEXING_OPERATOR</span></code></p> <tr class=row-even ><td><p><code class="docutils literal notranslate"><span class=pre >MODEL_INDEXING_MARGIN</span></code>, <code class="docutils literal notranslate"><span class=pre >MODEL_INDEXING_MARGIN_NULL</span></code>, <code class="docutils literal notranslate"><span class=pre >MODEL_INDEXING_MARGIN_SIGMA</span></code></p> <td><p>Present only where a merohedral ambiguity was probed. The winner’s lead over the runner-up in R-free, against the lead a random placement of the same model produces</p> </table> <p>The null’s own numbers — <code class="docutils literal notranslate"><span class=pre >MODEL_FIT_STATISTIC</span></code>, <code class="docutils literal notranslate"><span class=pre >MODEL_FIT_VALUE</span></code>, the <code class="docutils literal notranslate"><span class=pre >MODEL_FIT_NULL_*</span></code> keys and the <code class="docutils literal notranslate"><span class=pre >MODEL_INDEXING_MARGIN*</span></code> keys — are written with <code class="docutils literal notranslate"><span class=pre >--developer</span></code>; the default report carries the verdict (<code class="docutils literal notranslate"><span class=pre >MODEL_FIT</span></code>, <code class="docutils literal notranslate"><span class=pre >MODEL_FIT_SIGMA</span></code>, <code class="docutils literal notranslate"><span class=pre >MODEL_DECISIONS_TAKEN</span></code> and the two decisions).</p> <section id=comparing-two-runs-r-model-shell-scaled > <h3 id=comparing-two-runs-r-model-shell-scaled ><a class=toc-backref href="#id15" role=doc-backlink >Comparing two runs: <code class="docutils literal notranslate"><span class=pre >R_MODEL_SHELL_SCALED</span></code></a><a class=headerlink href="#comparing-two-runs-r-model-shell-scaled" title="Link to this heading"></a></h3> <p><code class="docutils literal notranslate"><span class=pre >R_WORK</span></code> and <code class="docutils literal notranslate"><span class=pre >R_FREE</span></code> describe <em>this</em> dataset against <em>this</em> model, and that is all they describe. They are <strong>not comparable with another run’s</strong>. The model is scaled to the data by an overall factor and a symmetry-constrained anisotropic <em>B</em> — a shape that can only bend one way with resolution, kept that way on purpose so that a batch of maps stays on one scale (see <a class="reference internal" href=CPU_DATA_ANALYSIS_DECISIONS.html ><span class="std std-doc">CPU_DATA_ANALYSIS_DECISIONS</span></a>). Whatever the amplitudes’ own radial profile does that this shape cannot follow is then reported as R. Two reductions of one crystal whose merged amplitudes have different radial profiles therefore differ in <code class="docutils literal notranslate"><span class=pre >R_FREE</span></code> for a reason that has nothing to do with either fitting the model better, and by more than a real change in the data moves it.</p> <p><code class="docutils literal notranslate"><span class=pre >R_MODEL_SHELL_SCALED</span></code> is the same sum with that taken out: one free scale per resolution shell — the merge table’s own shells — fitted on the shell’s reflections, so only the agreement <em>inside</em> each shell is left. <code class="docutils literal notranslate"><span class=pre >R_MODEL</span></code> is the same sum without the per-shell scale, so the gap between the two is what the radial profile cost, and <code class="docutils literal notranslate"><span class=pre >MODEL_RADIAL_MISFIT</span></code> is the size of the rescale that closed it (the RMS of ln <em>k</em><sub>shell</sub> about its mean). When the misfit moves between two runs, <code class="docutils literal notranslate"><span class=pre >R_FREE</span></code> between those two runs cannot be read; <code class="docutils literal notranslate"><span class=pre >R_MODEL_SHELL_SCALED</span></code> can.</p> <p>Both R values are over <strong>all</strong> the reflections, not the free 5%. Nothing here is refined — the coordinates, the B-factors and the occupancies are the model’s own, and only the scale and the placement are fitted — so work and free estimate the same quantity (they differ by a median 0.001 over our corpus) and the split buys no cross-validation while costing a factor of √20 in precision.</p> <p>None of this touches the maps: the map coefficients, the <code class="docutils literal notranslate"><span class=pre >.ccp4</span></code> files and <code class="docutils literal notranslate"><span class=pre >R_WORK</span></code> / <code class="docutils literal notranslate"><span class=pre >R_FREE</span></code> are computed from the scale described above and are unchanged by these keys.</p> <table> <thead> <tr class=row-odd ><th class=head ><p>key</p> <th class=head ><p>meaning</p> <tr class=row-even ><td><p><code class="docutils literal notranslate"><span class=pre >R_MODEL</span></code>, <code class="docutils literal notranslate"><span class=pre >R_MODEL_REFLECTIONS</span></code></p> <td><p>R over every reflection, on the scale the maps use</p> <tr class=row-odd ><td><p><code class="docutils literal notranslate"><span class=pre >R_MODEL_SHELL_SCALED</span></code></p> <td><p>The same, with one free scale per resolution shell — <strong>the number to compare between runs</strong></p> <tr class=row-even ><td><p><code class="docutils literal notranslate"><span class=pre >MODEL_RADIAL_MISFIT</span></code></p> <td><p>How large that per-shell rescale had to be: RMS of its logarithm. Near zero means the maps’ own scale already described the radial profile, and then the two R values agree</p> </table> </section> <section id=cc-model-data > <h3 id=cc-model-data ><a class=toc-backref href="#id16" role=doc-backlink >CC(model, data)</a><a class=headerlink href="#cc-model-data" title="Link to this heading"></a></h3> <p>Beside the R-factors, section 5 carries the <strong>correlation of the merged intensities with the placed, scaled model</strong>, |<em>F</em><sub>model</sub>|², by resolution shell. The shells are the merge table’s own, so a row here can be read straight across from that shell’s CC1/2 and R<sub>meas</sub> in section 3. It is a correlation of <em>intensities</em>, like CC1/2 and CCref beside it, and the observed value is the merged intensity itself rather than the French–Wilson |<em>F</em>|² the R-factors use — that amplitude is a posterior mean under a Wilson prior, which pulls a weak reflection towards its shell mean and would show up as correlation in exactly the outer shells this number is read in.</p> <p>Nothing here was refined against these reflections — the model is placed and scaled with eleven parameters — so there is no work/free distinction to draw: the correlation is unbiased on <strong>all</strong> the reflections of a shell, not only the few hundred free ones, and <code class="docutils literal notranslate"><span class=pre >SIGMA</span></code> is correspondingly sharp.</p> <table> <thead> <tr class=row-odd ><th class=head ><p>key</p> <th class=head ><p>meaning</p> <tr class=row-even ><td><p><code class="docutils literal notranslate"><span class=pre >CC_MODEL_OVERALL</span></code>, <code class="docutils literal notranslate"><span class=pre >CC_MODEL_REFLECTIONS</span></code></p> <td><p>The correlation over every reflection in the table, and how many — the <code class="docutils literal notranslate"><span class=pre >N</span></code> column sums to it. Like any overall correlation it is shell-weighted and can take any value between the best shell and the worst; the table is what to read</p> <tr class=row-odd ><td><p><code class="docutils literal notranslate"><span class=pre >CC_MODEL_CONFIRMED_TO_D_MIN</span></code></p> <td><p>The finest shell whose correlation reaches 3 σ, or <code class="docutils literal notranslate"><span class=pre >NONE</span></code>. A <strong>lower bound</strong> on the useful resolution</p> <tr class=row-even ><td><p>the <code class="docutils literal notranslate"><span class=pre >D_MIN</span> <span class=pre >/</span> <span class=pre >CC_MODEL</span> <span class=pre >/</span> <span class=pre >N</span> <span class=pre >/</span> <span class=pre >SIGMA</span></code> table</p> <td><p>Per shell: the correlation, the reflections it was formed on, and how far above zero it sits (Fisher’s transform, <code class="docutils literal notranslate"><span class=pre >atanh(CC)·√(N−3)</span></code>)</p> </table> <p><strong>Read it in one direction only.</strong> A shell whose correlation is significantly above zero carries signal — a model cannot agree by accident with measurements it was never fitted to — so <code class="docutils literal notranslate"><span class=pre >CC_MODEL_CONFIRMED_TO_D_MIN</span></code> is evidence for keeping <em>more</em> data. A shell whose correlation is near zero says nothing about the data: the model may be incomplete, in the wrong hand, or simply wrong for this crystal, and cutting on it would be cutting because the model is poor. Nothing in the pipeline acts on these numbers; they are reported and no more. This is the same asymmetry cryo-EM works under, where the half-map FSC sets the resolution and the model–map FSC only validates it.</p> <p>A <em>significantly negative</em> correlation in a shell is worth chasing rather than ignoring: it cannot be signal, so it points at a systematic error — an indexing the model disagrees with, or an outer shell the scaling has mistreated.</p> <p><code class="docutils literal notranslate"><span class=pre >MODEL_DECISIONS_TAKEN=</span> <span class=pre >NONE</span></code> — whether the model was rejected or never tested — means the reflection files are <strong>byte for byte</strong> what a run with no model would have written — same space group, same indexing, same <code class="docutils literal notranslate"><span class=pre >.mtz</span></code>, <code class="docutils literal notranslate"><span class=pre >.cif</span></code>, <code class="docutils literal notranslate"><span class=pre >.hkl</span></code> and <code class="docutils literal notranslate"><span class=pre >_unmerged.mtz</span></code>. A rejected model is therefore safe to try: it costs the null’s compute and changes nothing else.</p> </section> </section> </section> </article> </div> </div> </main> </div> <footer class=md-footer > <div class=md-footer-nav > <nav class="md-footer-nav__inner md-grid"> <a href=RUGNUX_INTEGRATION.html title="Rugnux with other programs" class="md-flex md-footer-nav__link md-footer-nav__link--prev" rel=prev > <div class="md-flex__cell md-flex__cell--shrink"> <i class="md-icon md-icon--arrow-back md-footer-nav__button"></i> </div> <div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title"> <span class=md-flex__ellipsis > <span class=md-footer-nav__direction > "Previous" </span> Rugnux with other programs </span> </div> </a> <a href=RUGNUX_ADVANCED.html title="Advanced Rugnux" class="md-flex md-footer-nav__link md-footer-nav__link--next" rel=next > <div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title"><span class=md-flex__ellipsis > <span class=md-footer-nav__direction > "Next" </span> Advanced Rugnux </span> </div> <div class="md-flex__cell md-flex__cell--shrink"><i class="md-icon md-icon--arrow-forward md-footer-nav__button"></i> </div> </a> </nav> </div> <div class="md-footer-meta md-typeset"> <div class="md-footer-meta__inner md-grid"> <div class=md-footer-copyright > <div class=md-footer-copyright__highlight > &#169; Copyright 2024, Paul Scherrer Institute. </div> Created using <a href="http://www.sphinx-doc.org/">Sphinx</a> 8.1.3. and <a href="https://github.com/bashtage/sphinx-material/">Material for Sphinx</a> </div> </div> </div> </footer> <script src="_static/javascripts/application.js"></script> <script>app.initialize({version: "1.0.4", url: {base: ".."}})</script>