Files
Jungfraujoch/CPU_DATA_ANALYSIS.html
T
2026-04-16 12:12:54 +00:00

1 line
74 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>CPU-side crystallographic data analysis (Jungfraujoch) &#8212; Jungfraujoch 1.0.0-rc.135 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=d1fa3868"></script> <script src="_static/doctools.js?v=9bcbadda"></script> <script src="_static/sphinx_highlight.js?v=dc90522c"></script> <script>window.MathJax = {"tex": {"tags": "ams", "inlineMath": [["\\(", "\\)"], ["$", "$"]], "displayMath": [["\\[", "\\]"], ["$$", "$$"]], "processEscapes": true}, "options": {"processHtmlClass": "tex2jax_process|mathjax_process|math|output_area"}}</script> <script defer=defer src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></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=OpenAPI href=OPENAPI.html /> <link rel=prev title="Detector geometry" href=DETECTOR_GEOMETRY.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="#CPU_DATA_ANALYSIS" 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.135 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 > CPU-side crystallographic data analysis (Jungfraujoch) </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.135 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.135 documentation" class="md-nav__button md-logo"> <i class=md-icon >&#xe30d</i> </a> <a href=index.html title="Jungfraujoch 1.0.0-rc.135 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 >General</span></span> <li class=md-nav__item > <a href=ACKNOWLEDGEMENT.html class=md-nav__link >Acknowledgements</a> <li class=md-nav__item > <a href=LICENSE.html class=md-nav__link >License</a> <li class=md-nav__item > <a href=DETECTORS.html class=md-nav__link >Supported detectors</a> <li class=md-nav__item > <a href="DETECTORS.html#dectris-detectors" class=md-nav__link >DECTRIS 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 > <a href=VERSIONING.html class=md-nav__link >Semantic versioning</a> <li class=md-nav__item > <a href=DEPLOYMENT.html class=md-nav__link >Deployment</a> <li class=md-nav__item > <a href=CHANGELOG.html class=md-nav__link >Changelog</a> <li class=md-nav__item > <span class="md-nav__link caption"><span class=caption-text >Software</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=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 > <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 > <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 > CPU-side crystallographic data analysis (Jungfraujoch) </label> <a href="#" class="md-nav__link md-nav__link--active">CPU-side crystallographic data analysis (Jungfraujoch)</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="#references" class=md-nav__link >References</a> <li class=md-nav__item > <a href="#geometry-reciprocal-space-mapping-and-basic-quantities" class=md-nav__link >1. Geometry, reciprocal-space mapping, and basic quantities</a> <li class=md-nav__item > <a href="#azimuthal-integration-radial-profiles" class=md-nav__link >2. Azimuthal integration (radial profiles)</a> <li class=md-nav__item > <a href="#spot-finding-strong-pixels-bragg-spots" class=md-nav__link >3. Spot finding (strong pixels → Bragg spots)</a> <li class=md-nav__item > <a href="#indexing-overview" class=md-nav__link >4. Indexing overview</a> <li class=md-nav__item > <a href="#fft-indexing-unknown-unit-cell" class=md-nav__link >5. FFT indexing (unknown unit cell)</a> <li class=md-nav__item > <a href="#bravais-lattice-centering-inference-lattice-search" class=md-nav__link >6. Bravais lattice / centering inference (“lattice search”)</a> <li class=md-nav__item > <a href="#geometry-and-lattice-refinement" class=md-nav__link >7. Geometry and lattice refinement</a> <li class=md-nav__item > <a href="#reflection-prediction" class=md-nav__link >8. Reflection prediction</a> <li class=md-nav__item > <a href="#a-gaussian-mosaicity-model-yields-a-partiality-fraction-over-an-oscillation-width-delta-phi-p-phi-sigma-m-zeta-delta-phi-frac-1-2-left-mathrm-erf-left-frac-phi-delta-phi-2-sqrt-2-sigma-m-zeta-right" class=md-nav__link >A Gaussian mosaicity model yields a partiality fraction over an oscillation width <span class="math notranslate nohighlight">\(\Delta\phi\)</span>: $ P(\phi;\sigma_M,\zeta,\Delta\phi) = \frac{1}{2}\left[ \mathrm{erf}!\left(\frac{\phi+\Delta\phi/2}{\sqrt{2},\sigma_M/\zeta}\right)</a> <li class=md-nav__item > <a href="#d-summation-integration-three-ring-method" class=md-nav__link >9. 2D summation integration (three-ring method)</a> <li class=md-nav__item > <a href="#scaling-and-merging" class=md-nav__link >10. Scaling and merging</a> <li class=md-nav__item > <a href="#mosaicity-and-profile-radius-monitoring" class=md-nav__link >11. Mosaicity and “profile radius” monitoring</a> <li class=md-nav__item > <a href="#wilson-statistics-and-frenchwilson-treatment" class=md-nav__link >12. Wilson statistics and FrenchWilson treatment</a> <li class=md-nav__item > <a href="#practical-notes-and-limitations" class=md-nav__link >13. Practical notes and limitations</a> </ul> <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=CBOR.html class=md-nav__link >CBOR messages</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 >OpenAPI Python client</span></span> <li class=md-nav__item > <a href="python_client/README.html" class=md-nav__link >jfjoch-client</a> <li class=md-nav__item > <a href="python_client/README.html#license-clarification" class=md-nav__link >License Clarification</a> <li class=md-nav__item > <a href="python_client/docs/DefaultApi.html" class=md-nav__link >jfjoch_client.DefaultApi</a> <li class=md-nav__item > <a href="python_client/docs/DefaultApi.html#cancel-post" class=md-nav__link ><strong>cancel_post</strong></a> <li class=md-nav__item > <a href="python_client/docs/DefaultApi.html#config-azim-int-get" class=md-nav__link ><strong>config_azim_int_get</strong></a> <li class=md-nav__item > <a href="python_client/docs/DefaultApi.html#config-azim-int-put" class=md-nav__link ><strong>config_azim_int_put</strong></a> <li class=md-nav__item > <a href="python_client/docs/DefaultApi.html#config-dark-mask-get" class=md-nav__link ><strong>config_dark_mask_get</strong></a> <li class=md-nav__item > <a href="python_client/docs/DefaultApi.html#config-dark-mask-put" class=md-nav__link ><strong>config_dark_mask_put</strong></a> <li class=md-nav__item > <a href="python_client/docs/DefaultApi.html#config-detector-get" class=md-nav__link ><strong>config_detector_get</strong></a> <li class=md-nav__item > <a href="python_client/docs/DefaultApi.html#config-detector-put" class=md-nav__link ><strong>config_detector_put</strong></a> <li class=md-nav__item > <a href="python_client/docs/DefaultApi.html#config-file-writer-get" class=md-nav__link ><strong>config_file_writer_get</strong></a> <li class=md-nav__item > <a href="python_client/docs/DefaultApi.html#config-file-writer-put" class=md-nav__link ><strong>config_file_writer_put</strong></a> <li class=md-nav__item > <a href="python_client/docs/DefaultApi.html#config-image-format-conversion-post" class=md-nav__link ><strong>config_image_format_conversion_post</strong></a> <li class=md-nav__item > <a href="python_client/docs/DefaultApi.html#config-image-format-get" class=md-nav__link ><strong>config_image_format_get</strong></a> <li class=md-nav__item > <a href="python_client/docs/DefaultApi.html#config-image-format-put" class=md-nav__link ><strong>config_image_format_put</strong></a> <li class=md-nav__item > <a href="python_client/docs/DefaultApi.html#config-image-format-raw-post" class=md-nav__link ><strong>config_image_format_raw_post</strong></a> <li class=md-nav__item > <a href="python_client/docs/DefaultApi.html#config-indexing-get" class=md-nav__link ><strong>config_indexing_get</strong></a> <li class=md-nav__item > <a href="python_client/docs/DefaultApi.html#config-indexing-put" class=md-nav__link ><strong>config_indexing_put</strong></a> <li class=md-nav__item > <a href="python_client/docs/DefaultApi.html#config-instrument-get" class=md-nav__link ><strong>config_instrument_get</strong></a> <li class=md-nav__item > <a href="python_client/docs/DefaultApi.html#config-instrument-put" class=md-nav__link ><strong>config_instrument_put</strong></a> <li class=md-nav__item > <a href="python_client/docs/DefaultApi.html#config-internal-generator-image-put" class=md-nav__link ><strong>config_internal_generator_image_put</strong></a> <li class=md-nav__item > <a href="python_client/docs/DefaultApi.html#config-internal-generator-image-tiff-put" class=md-nav__link ><strong>config_internal_generator_image_tiff_put</strong></a> <li class=md-nav__item > <a href="python_client/docs/DefaultApi.html#config-mask-get" class=md-nav__link ><strong>config_mask_get</strong></a> <li class=md-nav__item > <a href="python_client/docs/DefaultApi.html#config-mask-tiff-get" class=md-nav__link ><strong>config_mask_tiff_get</strong></a> <li class=md-nav__item > <a href="python_client/docs/DefaultApi.html#config-roi-get" class=md-nav__link ><strong>config_roi_get</strong></a> <li class=md-nav__item > <a href="python_client/docs/DefaultApi.html#config-roi-put" class=md-nav__link ><strong>config_roi_put</strong></a> <li class=md-nav__item > <a href="python_client/docs/DefaultApi.html#config-select-detector-get" class=md-nav__link ><strong>config_select_detector_get</strong></a> <li class=md-nav__item > <a href="python_client/docs/DefaultApi.html#config-select-detector-put" class=md-nav__link ><strong>config_select_detector_put</strong></a> <li class=md-nav__item > <a href="python_client/docs/DefaultApi.html#config-spot-finding-get" class=md-nav__link ><strong>config_spot_finding_get</strong></a> <li class=md-nav__item > <a href="python_client/docs/DefaultApi.html#config-spot-finding-put" class=md-nav__link ><strong>config_spot_finding_put</strong></a> <li class=md-nav__item > <a href="python_client/docs/DefaultApi.html#config-user-mask-get" class=md-nav__link ><strong>config_user_mask_get</strong></a> <li class=md-nav__item > <a href="python_client/docs/DefaultApi.html#config-user-mask-put" class=md-nav__link ><strong>config_user_mask_put</strong></a> <li class=md-nav__item > <a href="python_client/docs/DefaultApi.html#config-user-mask-tiff-get" class=md-nav__link ><strong>config_user_mask_tiff_get</strong></a> <li class=md-nav__item > <a href="python_client/docs/DefaultApi.html#config-user-mask-tiff-put" class=md-nav__link ><strong>config_user_mask_tiff_put</strong></a> <li class=md-nav__item > <a href="python_client/docs/DefaultApi.html#config-zeromq-metadata-get" class=md-nav__link ><strong>config_zeromq_metadata_get</strong></a> <li class=md-nav__item > <a href="python_client/docs/DefaultApi.html#config-zeromq-metadata-put" class=md-nav__link ><strong>config_zeromq_metadata_put</strong></a> <li class=md-nav__item > <a href="python_client/docs/DefaultApi.html#config-zeromq-preview-get" class=md-nav__link ><strong>config_zeromq_preview_get</strong></a> <li class=md-nav__item > <a href="python_client/docs/DefaultApi.html#config-zeromq-preview-put" class=md-nav__link ><strong>config_zeromq_preview_put</strong></a> <li class=md-nav__item > <a href="python_client/docs/DefaultApi.html#deactivate-post" class=md-nav__link ><strong>deactivate_post</strong></a> <li class=md-nav__item > <a href="python_client/docs/DefaultApi.html#detector-status-get" class=md-nav__link ><strong>detector_status_get</strong></a> <li class=md-nav__item > <a href="python_client/docs/DefaultApi.html#fpga-status-get" class=md-nav__link ><strong>fpga_status_get</strong></a> <li class=md-nav__item > <a href="python_client/docs/DefaultApi.html#image-buffer-clear-post" class=md-nav__link ><strong>image_buffer_clear_post</strong></a> <li class=md-nav__item > <a href="python_client/docs/DefaultApi.html#image-buffer-image-cbor-get" class=md-nav__link ><strong>image_buffer_image_cbor_get</strong></a> <li class=md-nav__item > <a href="python_client/docs/DefaultApi.html#image-buffer-image-jpeg-get" class=md-nav__link ><strong>image_buffer_image_jpeg_get</strong></a> <li class=md-nav__item > <a href="python_client/docs/DefaultApi.html#image-buffer-image-tiff-get" class=md-nav__link ><strong>image_buffer_image_tiff_get</strong></a> <li class=md-nav__item > <a href="python_client/docs/DefaultApi.html#image-buffer-start-cbor-get" class=md-nav__link ><strong>image_buffer_start_cbor_get</strong></a> <li class=md-nav__item > <a href="python_client/docs/DefaultApi.html#image-buffer-status-get" class=md-nav__link ><strong>image_buffer_status_get</strong></a> <li class=md-nav__item > <a href="python_client/docs/DefaultApi.html#image-pusher-status-get" class=md-nav__link ><strong>image_pusher_status_get</strong></a> <li class=md-nav__item > <a href="python_client/docs/DefaultApi.html#initialize-post" class=md-nav__link ><strong>initialize_post</strong></a> <li class=md-nav__item > <a href="python_client/docs/DefaultApi.html#pedestal-post" class=md-nav__link ><strong>pedestal_post</strong></a> <li class=md-nav__item > <a href="python_client/docs/DefaultApi.html#preview-pedestal-tiff-get" class=md-nav__link ><strong>preview_pedestal_tiff_get</strong></a> <li class=md-nav__item > <a href="python_client/docs/DefaultApi.html#preview-plot-bin-get" class=md-nav__link ><strong>preview_plot_bin_get</strong></a> <li class=md-nav__item > <a href="python_client/docs/DefaultApi.html#preview-plot-get" class=md-nav__link ><strong>preview_plot_get</strong></a> <li class=md-nav__item > <a href="python_client/docs/DefaultApi.html#result-scan-get" class=md-nav__link ><strong>result_scan_get</strong></a> <li class=md-nav__item > <a href="python_client/docs/DefaultApi.html#start-post" class=md-nav__link ><strong>start_post</strong></a> <li class=md-nav__item > <a href="python_client/docs/DefaultApi.html#statistics-calibration-get" class=md-nav__link ><strong>statistics_calibration_get</strong></a> <li class=md-nav__item > <a href="python_client/docs/DefaultApi.html#statistics-data-collection-get" class=md-nav__link ><strong>statistics_data_collection_get</strong></a> <li class=md-nav__item > <a href="python_client/docs/DefaultApi.html#statistics-get" class=md-nav__link ><strong>statistics_get</strong></a> <li class=md-nav__item > <a href="python_client/docs/DefaultApi.html#status-get" class=md-nav__link ><strong>status_get</strong></a> <li class=md-nav__item > <a href="python_client/docs/DefaultApi.html#trigger-post" class=md-nav__link ><strong>trigger_post</strong></a> <li class=md-nav__item > <a href="python_client/docs/DefaultApi.html#version-get" class=md-nav__link ><strong>version_get</strong></a> <li class=md-nav__item > <a href="python_client/docs/DefaultApi.html#wait-till-done-post" class=md-nav__link ><strong>wait_till_done_post</strong></a> <li class=md-nav__item > <a href="python_client/docs/DefaultApi.html#xfel-event-code-get" class=md-nav__link ><strong>xfel_event_code_get</strong></a> <li class=md-nav__item > <a href="python_client/docs/DefaultApi.html#xfel-pulse-id-get" class=md-nav__link ><strong>xfel_pulse_id_get</strong></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=cpu-side-crystallographic-data-analysis-jungfraujoch > <h1 id=cpu-data-analysis--page-root >CPU-side crystallographic data analysis (Jungfraujoch)<a class=headerlink href="#cpu-data-analysis--page-root" title="Link to this heading"></a></h1> <p>This document describes the crystallographic algorithms implemented in Jungfraujoch for <strong>CPU</strong>- and <strong>GPU</strong>-side realtime and nearrealtime data analysis.</p> <p><strong>Scope.</strong> The pipeline covered here comprises:</p> <ol class="arabic simple"> <li><p>geometry mapping and corrections,</p> <li><p>azimuthal integration (powder/radial profiles),</p> <li><p>Bragg spot finding (strong pixels → connected components → spot descriptors),</p> <li><p>indexing (still and rotation modes),</p> <li><p>Bravais lattice / centering inference,</p> <li><p>geometry and lattice refinement,</p> <li><p>reflection prediction (still and rotation),</p> <li><p>2D summation integration,</p> <li><p>scaling and merging,</p> <li><p>auxiliary statistics (Wilson plot, ⟨I/σ(I)⟩, FrenchWilson).</p> </ol> <section id=references > <h2 id=references >References<a class=headerlink href="#references" title="Link to this heading"></a></h2> <p>The methods are inspired and reuising solutions implemented in:</p> <ul class=simple > <li><p>W. Kabsch, “XDS”, <em>Acta Cryst.</em> <strong>D66</strong> (2010), 125132 and related XDS papers (rotation geometry, partiality, scaling concepts).</p> <li><p>W. Kabsch, “Integration, scaling, space-group assignment and post-refinement”, <em>Acta Cryst.</em> <strong>D66</strong> (2010), 133144 (mosaicity/partiality likelihood treatment; notation such as ζ and rotation factors).</p> <li><p>T. A. White et al., CrystFEL method papers (spot finding, threering integration, serial/still diffraction processing concepts).</p> <li><p>J. Kieffer &amp; J. P. Wright, “PyFAI: a Python library for high performance azimuthal integration on GPU”, <em>Powder Diffraction</em> <strong>28</strong> (2013), S339-S350 (detector geometry definition, azimuthal integration)</p> <li><p>H. Powell, “The Rossmann Fourier autoindexing algorithm in MOSFLM”, <em>Acta Cryst.</em> <strong>D55</strong> (1999), 1690-1695 (FFT indexing) (list is not exhaustive)</p> </ul> </section> <section id=geometry-reciprocal-space-mapping-and-basic-quantities > <h2 id=geometry-reciprocal-space-mapping-and-basic-quantities >1. Geometry, reciprocal-space mapping, and basic quantities<a class=headerlink href="#geometry-reciprocal-space-mapping-and-basic-quantities" title="Link to this heading"></a></h2> <section id=coordinate-conventions > <h3 id=coordinate-conventions >1.1 Coordinate conventions<a class=headerlink href="#coordinate-conventions" title="Link to this heading"></a></h3> <p>For a pixel coordinate <span class="math notranslate nohighlight">\((x,y)\)</span> (in pixels), Jungfraujoch converts to a laboratory direction vector via:</p> <ol class="arabic simple"> <li><p>shift by direct-beam position <span class="math notranslate nohighlight">\((x_\mathrm{beam}, y_\mathrm{beam})\)</span>,</p> <li><p>scale by pixel size <span class="math notranslate nohighlight">\(p\)</span> (mm),</p> <li><p>set detector distance <span class="math notranslate nohighlight">\(D\)</span> (mm),</p> <li><p>apply detector orientation rotation <span class="math notranslate nohighlight">\(R_\mathrm{det}\)</span> (PyFAI-like parameterization).</p> </ol> <p>The unnormalized detector coordinate (mm) is: <span class="math notranslate nohighlight">\( \mathbf{r}_\mathrm{det}(x,y) = \begin{pmatrix} (x-x_\mathrm{beam})p\\ (y-y_\mathrm{beam})p\\ D \end{pmatrix}. \)</span></p> <p>The lab-frame vector is: <span class="math notranslate nohighlight">\( \mathbf{r}_\mathrm{lab} = R_\mathrm{det}\,\mathbf{r}_\mathrm{det}. \)</span></p> <p>Let the incident wavevector magnitude be <span class="math notranslate nohighlight">\(k = 1/\lambda\)</span> in Å<span class="math notranslate nohighlight">\(^{-1}\)</span>, and define: <span class="math notranslate nohighlight">\( \mathbf{S}_0 = (0,0,k). \)</span></p> <p>The <strong>reciprocal-space scattering vector</strong> associated with pixel <span class="math notranslate nohighlight">\((x,y)\)</span> is: <span class="math notranslate nohighlight">\( \mathbf{s}(x,y) = k\,\frac{\mathbf{r}_\mathrm{lab}}{\lVert \mathbf{r}_\mathrm{lab}\rVert} - \mathbf{S}_0. \)</span></p> <p>This <span class="math notranslate nohighlight">\(\mathbf{s}\)</span> is the fundamental quantity used for spot finding (resolution filters), indexing, and refinement.</p> </section> <section id=two-theta-azimuth-resolution-and-q > <h3 id=two-theta-azimuth-resolution-and-q >1.2 Two-theta, azimuth, resolution and <span class="math notranslate nohighlight">\(q\)</span><a class=headerlink href="#two-theta-azimuth-resolution-and-q" title="Link to this heading"></a></h3> <p>The scattering angle <span class="math notranslate nohighlight">\(2\theta\)</span> is computed from <span class="math notranslate nohighlight">\(\mathbf{r}_\mathrm{lab}\)</span> via: <span class="math notranslate nohighlight">\( 2\theta = \arctan\!\left(\frac{\sqrt{x_\mathrm{lab}^2 + y_\mathrm{lab}^2}}{z_\mathrm{lab}}\right). \)</span></p> <p>Resolution (Å) at a pixel is: <span class="math notranslate nohighlight">\( d = \frac{\lambda}{2\sin(\theta)} = \frac{\lambda}{2\sin(2\theta/2)}. \)</span></p> <p>The magnitude <span class="math notranslate nohighlight">\(q = 2\pi/d\)</span> is used for radial binning and ice-ring handling.</p> </section> <section id=distance-from-the-ewald-sphere > <h3 id=distance-from-the-ewald-sphere >1.3 Distance from the Ewald sphere<a class=headerlink href="#distance-from-the-ewald-sphere" title="Link to this heading"></a></h3> <p>For a reciprocal lattice point <span class="math notranslate nohighlight">\(\mathbf{p}\)</span><span class="math notranslate nohighlight">\(^{-1}\)</span>), define: <span class="math notranslate nohighlight">\( \Delta_\mathrm{Ewald}(\mathbf{p}) = \lVert \mathbf{p} + \mathbf{S}_0\rVert - k. \)</span> Jungfraujoch uses <span class="math notranslate nohighlight">\(|\Delta_\mathrm{Ewald}|\)</span> as an operational proxy for excitation error. This appears in:</p> <ul class=simple > <li><p>still prediction (accept if <span class="math notranslate nohighlight">\(|\Delta_\mathrm{Ewald}|\le \Delta_\mathrm{cut}\)</span>),</p> <li><p>profile radius estimation (see §7.1),</p> <li><p>still partiality option in scaling/merging (§9.3).</p> </ul> </section> </section> <hr class=docutils /> <section id=azimuthal-integration-radial-profiles > <h2 id=azimuthal-integration-radial-profiles >2. Azimuthal integration (radial profiles)<a class=headerlink href="#azimuthal-integration-radial-profiles" title="Link to this heading"></a></h2> <p>Azimuthal integration produces a 1D radial profile <span class="math notranslate nohighlight">\(I(q)\)</span> or <span class="math notranslate nohighlight">\(I(d)\)</span> by histogramming pixels into radial bins. Pixels are <strong>not split</strong> across bins; each pixel contributes wholly to a single bin.</p> <section id=histogram-estimator > <h3 id=histogram-estimator >2.1 Histogram estimator<a class=headerlink href="#histogram-estimator" title="Link to this heading"></a></h3> <p>Let bin index <span class="math notranslate nohighlight">\(b(x,y)\in\{0,\dots,B-1\}\)</span> be precomputed from <span class="math notranslate nohighlight">\(q(x,y)\)</span> (or equivalently from <span class="math notranslate nohighlight">\(d(x,y)\)</span>). For each bin <span class="math notranslate nohighlight">\(b\)</span>:</p> <ul class=simple > <li><p>accumulate corrected intensity: <span class="math notranslate nohighlight">\( S_b = \sum_{(x,y):\,b(x,y)=b} I(x,y)\,C(x,y), \)</span></p> <li><p>and count: <span class="math notranslate nohighlight">\( N_b = \#\{(x,y):\,b(x,y)=b \text{ and pixel is valid}\}. \)</span></p> </ul> <p>A simple mean profile is then <span class="math notranslate nohighlight">\( \bar{I}_b = S_b / N_b\)</span> (when <span class="math notranslate nohighlight">\(N_b&gt;0\)</span>). Invalid pixels (masked, saturated, detector error codes) are excluded.</p> </section> <section id=corrections-applied > <h3 id=corrections-applied >2.2 Corrections applied<a class=headerlink href="#corrections-applied" title="Link to this heading"></a></h3> <p>Two standard corrections are available:</p> <p><strong>(i) Solid angle / geometric correction.</strong> A commonly used approximation for flat detectors gives a <span class="math notranslate nohighlight">\(\cos^3(2\theta)\)</span> factor: <span class="math notranslate nohighlight">\( C_\Omega(2\theta) = \cos^3(2\theta). \)</span></p> <p><strong>(ii) Polarization correction.</strong> With polarization coefficient <span class="math notranslate nohighlight">\(P\)</span> (beamline dependent) and azimuth <span class="math notranslate nohighlight">\(\phi\)</span>: <span class="math notranslate nohighlight">\( C_\mathrm{pol}(2\theta,\phi) = \frac{1}{2}\left(1+\cos^2(2\theta) - P\cos(2\phi)\left(1-\cos^2(2\theta)\right)\right), \)</span> applied as a divisor to intensities (i.e. scale by <span class="math notranslate nohighlight">\(1/C_\mathrm{pol}\)</span>) when enabled.</p> </section> <section id=background-estimate-for-profiles > <h3 id=background-estimate-for-profiles >2.3 Background estimate for profiles<a class=headerlink href="#background-estimate-for-profiles" title="Link to this heading"></a></h3> <p>A background estimate is derived from the integrated profile using the azimuthal integration settings (details depend on the configured estimator). This background is used for monitoring and diagnostics; it is <strong>not</strong> the same as local Bragg-spot background used in summation integration (§8).</p> </section> </section> <hr class=docutils /> <section id=spot-finding-strong-pixels-bragg-spots > <h2 id=spot-finding-strong-pixels-bragg-spots >3. Spot finding (strong pixels → Bragg spots)<a class=headerlink href="#spot-finding-strong-pixels-bragg-spots" title="Link to this heading"></a></h2> <p>Spot finding is a two-stage process:</p> <ol class="arabic simple"> <li><p><strong>Strong-pixel selection</strong> using intensity and/or local signal-to-noise criteria.</p> <li><p><strong>Connected-component labeling (CCL)</strong> to group strong pixels into candidate spots, followed by spot-level filtering and feature extraction.</p> </ol> <section id=strong-pixel-detection-by-local-statistics > <h3 id=strong-pixel-detection-by-local-statistics >3.1 Strong-pixel detection by local statistics<a class=headerlink href="#strong-pixel-detection-by-local-statistics" title="Link to this heading"></a></h3> <p>For each pixel <span class="math notranslate nohighlight">\(i\)</span> with value <span class="math notranslate nohighlight">\(v_i\)</span>, consider a square window (nominally <span class="math notranslate nohighlight">\(31\times 31\)</span> pixels) around it. Let the window contain <span class="math notranslate nohighlight">\(n\)</span> valid pixels (excluding masked/bad/saturated), and define: <span class="math notranslate nohighlight">\( \Sigma = \sum v,\qquad \Sigma_2 = \sum v^2. \)</span></p> <p>To avoid biasing the local statistics by the test pixel itself, Jungfraujoch evaluates the pixel against the window with the pixel removed: <span class="math notranslate nohighlight">\( \Sigma' = \Sigma - v_i,\quad \Sigma_2' = \Sigma_2 - v_i^2,\quad n' = n-1. \)</span></p> <p>A variance-like quantity proportional to <span class="math notranslate nohighlight">\(n'^2\)</span> is formed: <span class="math notranslate nohighlight">\( V = n'\Sigma_2' - (\Sigma')^2, \)</span> and the deviation-from-mean quantity: <span class="math notranslate nohighlight">\( \Delta = v_i n' - \Sigma'. \)</span></p> <p>A pixel is considered strong if:</p> <ul class=simple > <li><p>it is above a photon/count threshold, and</p> <li><p><span class="math notranslate nohighlight">\(\Delta&gt;0\)</span>, and</p> <li><p>the squared deviation exceeds a scaled variance: <span class="math notranslate nohighlight">\( \Delta^2 &gt; V\cdot T^2, \)</span> where <span class="math notranslate nohighlight">\(T\)</span> is the configured signal-to-noise threshold.</p> </ul> <p>This is equivalent to a local z-score criterion but implemented in integer arithmetic to be robust and fast.</p> <p>Special cases:</p> <ul class=simple > <li><p>saturated pixels can be forced to “strong” (useful for detecting overloaded Bragg spots),</p> <li><p>invalid pixels are never strong.</p> </ul> </section> <section id=resolution-and-ice-ring-handling > <h3 id=resolution-and-ice-ring-handling >3.2 Resolution and ice-ring handling<a class=headerlink href="#resolution-and-ice-ring-handling" title="Link to this heading"></a></h3> <p>Spot finding can be restricted to a resolution range <span class="math notranslate nohighlight">\([d_\mathrm{high}, d_\mathrm{low}]\)</span> by masking pixels outside the range. Optionally, pixels in identified ice-ring regions can be tagged so that subsequent indexing/refinement may include or exclude them (see §4 and §6).</p> <p>A further optional safeguard removes isolated high-resolution “spur” spots by detecting large gaps in <span class="math notranslate nohighlight">\(1/d\)</span> (or <span class="math notranslate nohighlight">\(q\)</span>) space and discarding spots beyond the gap. This is intended for macromolecular diffraction where edge-of-detector backgrounds can be extremely low.</p> </section> <section id=connected-component-labeling-ccl > <h3 id=connected-component-labeling-ccl >3.3 Connected-component labeling (CCL)<a class=headerlink href="#connected-component-labeling-ccl" title="Link to this heading"></a></h3> <p>Strong pixels are grouped into connected components (adjacent strong pixels) using a CCL algorithm. Each component yields a candidate spot with:</p> <ul class=simple > <li><p>centroid <span class="math notranslate nohighlight">\((x,y)\)</span> (often intensity-weighted),</p> <li><p>pixel count (spot size),</p> <li><p>integrated spot intensity proxy (sum of pixel values),</p> <li><p>resolution <span class="math notranslate nohighlight">\(d\)</span> at the centroid (or mean over pixels),</p> <li><p>and quality flags (e.g. ice-ring classification).</p> </ul> <p>Spot-level filters include minimum/maximum pixel count and resolution limits.</p> </section> </section> <hr class=docutils /> <section id=indexing-overview > <h2 id=indexing-overview >4. Indexing overview<a class=headerlink href="#indexing-overview" title="Link to this heading"></a></h2> <p>Indexing maps observed reciprocal-space vectors <span class="math notranslate nohighlight">\(\mathbf{s}_i\)</span> to a lattice such that: <span class="math notranslate nohighlight">\( \mathbf{s}_i \approx h_i\mathbf{a}^* + k_i\mathbf{b}^* + l_i\mathbf{c}^*, \)</span> with integer <span class="math notranslate nohighlight">\((h_i,k_i,l_i)\)</span>.</p> <p>Jungfraujoch supports two complementary indexing strategies:</p> <ol class="arabic simple"> <li><p><strong>FFT-based indexing</strong> (Rossmann-type): does not require an a priori unit cell; suitable for unknown samples.</p> <li><p><strong>Fast-feedback indexing</strong> (TORO-like): requires an approximate unit cell; optimized for speed and feedback.</p> </ol> <p>Both feed into a common robust refinement/selection stage which maximizes the number of inliers under an indexing tolerance.</p> <section id=indexed-spot-decision-inlier-test > <h3 id=indexed-spot-decision-inlier-test >4.1 Indexed-spot decision (inlier test)<a class=headerlink href="#indexed-spot-decision-inlier-test" title="Link to this heading"></a></h3> <p>Given a trial lattice with direct basis vectors <span class="math notranslate nohighlight">\(\mathbf{a},\mathbf{b},\mathbf{c}\)</span> (used here as reciprocal-space dot-test vectors), fractional indices are estimated by: <span class="math notranslate nohighlight">\( h_f = \mathbf{s}\cdot\mathbf{a},\quad k_f = \mathbf{s}\cdot\mathbf{b},\quad l_f = \mathbf{s}\cdot\mathbf{c}. \)</span> Let <span class="math notranslate nohighlight">\((h,k,l)=(\mathrm{round}(h_f),\mathrm{round}(k_f),\mathrm{round}(l_f))\)</span> and define the fractional residual: <span class="math notranslate nohighlight">\( \delta^2 = (h_f-h)^2 + (k_f-k)^2 + (l_f-l)^2. \)</span> A spot is indexed if <span class="math notranslate nohighlight">\(\delta^2 \le \tau^2\)</span>, where <span class="math notranslate nohighlight">\(\tau\)</span> is the configured tolerance.</p> <p>For indexed spots, the reciprocal lattice point <span class="math notranslate nohighlight">\(\mathbf{p} = h\mathbf{a}^*+k\mathbf{b}^*+l\mathbf{c}^*\)</span> is used to compute <span class="math notranslate nohighlight">\(\Delta_\mathrm{Ewald}(\mathbf{p})\)</span> (stored as a diagnostic and later used in profile-radius estimation).</p> </section> </section> <hr class=docutils /> <section id=fft-indexing-unknown-unit-cell > <h2 id=fft-indexing-unknown-unit-cell >5. FFT indexing (unknown unit cell)<a class=headerlink href="#fft-indexing-unknown-unit-cell" title="Link to this heading"></a></h2> <p>FFT indexing follows a classical approach: detect dominant periodicities by projecting reciprocal-space points onto many directions and Fourier transforming the resulting 1D histograms.</p> <section id=directional-projections-and-histograms > <h3 id=directional-projections-and-histograms >5.1 Directional projections and histograms<a class=headerlink href="#directional-projections-and-histograms" title="Link to this heading"></a></h3> <p>Choose a set of unit vectors <span class="math notranslate nohighlight">\(\{\mathbf{u}_d\}\)</span> on a half-sphere (a near-uniform distribution generated via a golden-angle construction). For each direction <span class="math notranslate nohighlight">\(d\)</span>, form a histogram in the scalar projection: <span class="math notranslate nohighlight">\( t_{id} = \left|\mathbf{u}_d\cdot \mathbf{s}_i\right|. \)</span></p> <p>Bin width is chosen approximately as: <span class="math notranslate nohighlight">\( \Delta t \approx \frac{1}{2 L_\mathrm{max}}, \)</span> where <span class="math notranslate nohighlight">\(L_\mathrm{max}\)</span> is the maximum expected real-space unit-cell edge (Å). The histogram extent is tied to the maximum <span class="math notranslate nohighlight">\(q\)</span> used (set by a high-resolution cutoff for indexing).</p> </section> <section id=fft-peak-picking-and-candidate-vectors > <h3 id=fft-peak-picking-and-candidate-vectors >5.2 FFT peak picking and candidate vectors<a class=headerlink href="#fft-peak-picking-and-candidate-vectors" title="Link to this heading"></a></h3> <p>For each direction, the FFT magnitude spectrum is computed; peaks correspond to periodicities along <span class="math notranslate nohighlight">\(\mathbf{u}_d\)</span>. Each direction yields a candidate real-space length <span class="math notranslate nohighlight">\(L\)</span> with maximum spectral magnitude (subject to <span class="math notranslate nohighlight">\(L\ge L_\mathrm{min}\)</span>).</p> <p>Candidate vectors are <span class="math notranslate nohighlight">\(\mathbf{v}_d = L_d\,\mathbf{u}_d\)</span>.</p> <p>A collinearity filter removes nearly parallel vectors (e.g. within 5°) and attempts to resolve harmonic ambiguity: shorter “fundamental” vectors may be preferred over longer harmonics if their peak magnitude is sufficiently strong relative to the dominant peak.</p> </section> <section id=lattice-reduction-and-cell-candidates > <h3 id=lattice-reduction-and-cell-candidates >5.3 Lattice reduction and cell candidates<a class=headerlink href="#lattice-reduction-and-cell-candidates" title="Link to this heading"></a></h3> <p>Triples of candidate vectors are combined to form candidate bases <span class="math notranslate nohighlight">\((\mathbf{A},\mathbf{B},\mathbf{C})\)</span>. A simple reduction is applied: <span class="math notranslate nohighlight">\( \mathbf{B} \leftarrow \mathbf{B} - \mathrm{round}\!\left(\frac{\mathbf{B}\cdot\mathbf{A}}{\mathbf{A}\cdot\mathbf{A}}\right)\mathbf{A}, \)</span> $ \mathbf{C} \leftarrow \mathbf{C} - \mathrm{round}!\left(\frac{\mathbf{C}\cdot\mathbf{A}}{\mathbf{A}\cdot\mathbf{A}}\right)\mathbf{A}</p> <ul class=simple > <li><p>\mathrm{round}!\left(\frac{\mathbf{C}\cdot\mathbf{B}}{\mathbf{B}\cdot\mathbf{B}}\right)\mathbf{B}. $</p> </ul> <p>Candidates are filtered by allowed length and angle ranges.</p> </section> <section id=robust-refinement-and-best-cell-selection > <h3 id=robust-refinement-and-best-cell-selection >5.4 Robust refinement and best-cell selection<a class=headerlink href="#robust-refinement-and-best-cell-selection" title="Link to this heading"></a></h3> <p>Candidate bases are refined against observed spots using an iterative inlierfocused leastsquares procedure (trimmed/contracting threshold). The output cell is chosen to:</p> <ol class="arabic simple"> <li><p>maximize the number of indexed spots under the tolerance <span class="math notranslate nohighlight">\(\tau\)</span>, and</p> <li><p>break ties by a refined score (smaller residual threshold/score is preferred).</p> </ol> <p>An optional reference unit cell (if supplied) restricts acceptance to cells within a relative distance tolerance in edge lengths (permutation-invariant).</p> </section> </section> <hr class=docutils /> <section id=bravais-lattice-centering-inference-lattice-search > <h2 id=bravais-lattice-centering-inference-lattice-search >6. Bravais lattice / centering inference (“lattice search”)<a class=headerlink href="#bravais-lattice-centering-inference-lattice-search" title="Link to this heading"></a></h2> <p>If the space group is supplied by the user, its lattice constraints are assumed for refinement and subsequent processing.</p> <p>If not, Jungfraujoch attempts to infer the most plausible Bravais lattice type from the metric tensor after Niggli reduction:</p> <ol class="arabic simple"> <li><p><strong>Niggli reduction</strong> is performed to obtain a reduced cell in <span class="math notranslate nohighlight">\(G^6\)</span> representation (Gruber vector).</p> <li><p>The reduced cell is compared against a list of Niggli classes corresponding to Bravais lattices and centerings.</p> <li><p>The highest-symmetry class that matches within tolerances is selected (relative metric tolerance and angular tolerance).</p> </ol> <p>The output includes:</p> <ul class=simple > <li><p>a conventional cell,</p> <li><p>crystal system (triclinic, monoclinic, …),</p> <li><p>centering symbol <span class="math notranslate nohighlight">\(P, A, B, C, I, F, R\)</span>.</p> </ul> <p>This stage provides centering information used for systematic absences in prediction (§7.3) and for reporting.</p> <p><strong>Note.</strong> In ambiguous or special cases, forcing space group to <span class="math notranslate nohighlight">\(P1\)</span> (no symmetry assumptions) is recommended.</p> </section> <hr class=docutils /> <section id=geometry-and-lattice-refinement > <h2 id=geometry-and-lattice-refinement >7. Geometry and lattice refinement<a class=headerlink href="#geometry-and-lattice-refinement" title="Link to this heading"></a></h2> <p>Refinement adjusts experimental geometry and crystal parameters to minimize discrepancies between observed spot reciprocal vectors and those predicted by a lattice model with integer indices.</p> <section id=parameterization > <h3 id=parameterization >7.1 Parameterization<a class=headerlink href="#parameterization" title="Link to this heading"></a></h3> <p>The refinement jointly optimizes, depending on mode and constraints:</p> <ul class=simple > <li><p>beam center <span class="math notranslate nohighlight">\((x_\mathrm{beam}, y_\mathrm{beam})\)</span>,</p> <li><p>detector distance <span class="math notranslate nohighlight">\(D\)</span>,</p> <li><p>detector tilt angles (two-angle model; third rotation often held at 0),</p> <li><p>rotation axis direction (for rotation datasets),</p> <li><p>crystal orientation (a global rotation),</p> <li><p>unit-cell parameters, with constraints determined by inferred crystal system.</p> </ul> <p>For higher symmetries, constraints are enforced, e.g.</p> <ul class=simple > <li><p>cubic: <span class="math notranslate nohighlight">\(a=b=c,\ \alpha=\beta=\gamma=90^\circ\)</span>,</p> <li><p>tetragonal: <span class="math notranslate nohighlight">\(a=b\)</span>,</p> <li><p>hexagonal: <span class="math notranslate nohighlight">\(a=b,\ \gamma=120^\circ\)</span>,</p> <li><p>monoclinic (unique axis <span class="math notranslate nohighlight">\(b\)</span>): <span class="math notranslate nohighlight">\(\alpha=\gamma=90^\circ\)</span>, <span class="math notranslate nohighlight">\(\beta\)</span> refined.</p> </ul> </section> <section id=residuals-and-objective > <h3 id=residuals-and-objective >7.2 Residuals and objective<a class=headerlink href="#residuals-and-objective" title="Link to this heading"></a></h3> <p>For each indexed spot assigned integer <span class="math notranslate nohighlight">\((h,k,l)\)</span>, compute:</p> <ul class=simple > <li><p>observed reciprocal vector <span class="math notranslate nohighlight">\(\mathbf{s}_\mathrm{obs}\)</span> from its detector position and current geometry,</p> <li><p>predicted reciprocal vector <span class="math notranslate nohighlight">\(\mathbf{s}_\mathrm{pred}(h,k,l;\ \text{lattice params})\)</span>.</p> </ul> <p>Residual is: <span class="math notranslate nohighlight">\( \mathbf{r} = \mathbf{s}_\mathrm{obs} - \mathbf{s}_\mathrm{pred}. \)</span></p> <p>A non-linear least squares solver minimizes <span class="math notranslate nohighlight">\(\sum \|\mathbf{r}\|^2\)</span> over all selected inlier spots.</p> </section> <section id=rotation-datasets-bringing-observations-to-a-common-reference-frame > <h3 id=rotation-datasets-bringing-observations-to-a-common-reference-frame >7.3 Rotation datasets: bringing observations to a common reference frame<a class=headerlink href="#rotation-datasets-bringing-observations-to-a-common-reference-frame" title="Link to this heading"></a></h3> <p>For oscillation/rotation data, each image corresponds to a rotation angle <span class="math notranslate nohighlight">\(\phi\)</span> about an axis <span class="math notranslate nohighlight">\(\mathbf{m}_2\)</span>. Observed reciprocal vectors are rotated “back to start” so that all images are refined in a single reference crystal frame: <span class="math notranslate nohighlight">\( \mathbf{s}_\mathrm{obs,ref} = R(\phi)\,\mathbf{s}_\mathrm{obs}, \)</span> with <span class="math notranslate nohighlight">\(R(\phi)\)</span> constructed from the axis-angle representation of the goniometer model.</p> </section> <section id=multi-stage-tightening-of-inlier-tolerance > <h3 id=multi-stage-tightening-of-inlier-tolerance >7.4 Multi-stage tightening of inlier tolerance<a class=headerlink href="#multi-stage-tightening-of-inlier-tolerance" title="Link to this heading"></a></h3> <p>Refinement is performed in stages with decreasing acceptance tolerance for including reflections (e.g. from coarse to fine), which stabilizes convergence when starting from imperfect indexing and approximate geometry.</p> </section> </section> <hr class=docutils /> <section id=reflection-prediction > <h2 id=reflection-prediction >8. Reflection prediction<a class=headerlink href="#reflection-prediction" title="Link to this heading"></a></h2> <p>Jungfraujoch predicts reflection positions for integration by enumerating Miller indices within a resolution cutoff and accepting those that satisfy a diffraction condition model.</p> <section id=enumerating-reciprocal-lattice-points > <h3 id=enumerating-reciprocal-lattice-points >8.1 Enumerating reciprocal lattice points<a class=headerlink href="#enumerating-reciprocal-lattice-points" title="Link to this heading"></a></h3> <p>For a maximum resolution <span class="math notranslate nohighlight">\(d_\mathrm{min}\)</span>, accept <span class="math notranslate nohighlight">\((h,k,l)\)</span> such that: <span class="math notranslate nohighlight">\( \lVert \mathbf{p}(h,k,l)\rVert^2 = \lVert h\mathbf{a}^* + k\mathbf{b}^* + l\mathbf{c}^*\rVert^2 \le \left(\frac{1}{d_\mathrm{min}}\right)^2. \)</span></p> </section> <section id=still-prediction-excitation-error-cutoff > <h3 id=still-prediction-excitation-error-cutoff >8.2 Still prediction (excitation-error cutoff)<a class=headerlink href="#still-prediction-excitation-error-cutoff" title="Link to this heading"></a></h3> <p>For still images, the diffracting condition is approximated by an excitation-error cutoff: <span class="math notranslate nohighlight">\( \left|\Delta_\mathrm{Ewald}(\mathbf{p})\right| \le \Delta_\mathrm{cut}. \)</span> Accepted reflections are projected to the detector by intersecting the diffracted direction <span class="math notranslate nohighlight">\(\mathbf{S}=\mathbf{S}_0+\mathbf{p}\)</span> with the detector plane, using the current geometry.</p> </section> <section id=rotation-prediction-laue-equation-partiality-model > <h3 id=rotation-prediction-laue-equation-partiality-model >8.3 Rotation prediction (Laue equation + partiality model)<a class=headerlink href="#rotation-prediction-laue-equation-partiality-model" title="Link to this heading"></a></h3> <p>For rotation/oscillation datasets, Jungfraujoch solves for rotation angles <span class="math notranslate nohighlight">\(\phi\)</span> where the rotated reciprocal lattice point satisfies the Ewald-sphere condition. In an XDS-like notation, define:</p> <ul class=simple > <li><p>rotation axis unit vector <span class="math notranslate nohighlight">\(\mathbf{m}_2\)</span>,</p> <li><p><span class="math notranslate nohighlight">\(\mathbf{S}_0\)</span> incident vector,</p> <li><p><span class="math notranslate nohighlight">\(\mathbf{S}(\phi)=\mathbf{S}_0+\mathbf{p}(\phi)\)</span>.</p> </ul> <p>A key quantity is: <span class="math notranslate nohighlight">\( \zeta = \left|\mathbf{m}_2\cdot \mathbf{e}_1\right|,\quad \mathbf{e}_1 = \frac{\mathbf{S}\times \mathbf{S}_0}{\lVert \mathbf{S}\times \mathbf{S}_0\rVert}, \)</span> which also appears in XDS as the Lorentz component linked to the rotation axis.</p> </section> </section> <section id=a-gaussian-mosaicity-model-yields-a-partiality-fraction-over-an-oscillation-width-delta-phi-p-phi-sigma-m-zeta-delta-phi-frac-1-2-left-mathrm-erf-left-frac-phi-delta-phi-2-sqrt-2-sigma-m-zeta-right > <h2 id=a-gaussian-mosaicity-model-yields-a-partiality-fraction-over-an-oscillation-width-delta-phi-p-phi-sigma-m-zeta-delta-phi-frac-1-2-left-mathrm-erf-left-frac-phi-delta-phi-2-sqrt-2-sigma-m-zeta-right >A Gaussian mosaicity model yields a partiality fraction over an oscillation width <span class="math notranslate nohighlight">\(\Delta\phi\)</span>: $ P(\phi;\sigma_M,\zeta,\Delta\phi) = \frac{1}{2}\left[ \mathrm{erf}!\left(\frac{\phi+\Delta\phi/2}{\sqrt{2},\sigma_M/\zeta}\right)<a class=headerlink href="#a-gaussian-mosaicity-model-yields-a-partiality-fraction-over-an-oscillation-width-delta-phi-p-phi-sigma-m-zeta-delta-phi-frac-1-2-left-mathrm-erf-left-frac-phi-delta-phi-2-sqrt-2-sigma-m-zeta-right" title="Link to this heading"></a></h2> <p>\mathrm{erf}!\left(\frac{\phi-\Delta\phi/2}{\sqrt{2},\sigma_M/\zeta}\right) \right], <span class="math notranslate nohighlight">\( with mosaicity \)</span>\sigma_M$ in radians.</p> <p>Reflections are predicted if they meet minimum <span class="math notranslate nohighlight">\(\zeta\)</span> and mosaicity-window criteria, and their predicted detector coordinates fall on the active detector area.</p> <section id=systematic-absences-centering > <h3 id=systematic-absences-centering >8.4 Systematic absences (centering)<a class=headerlink href="#systematic-absences-centering" title="Link to this heading"></a></h3> <p>Systematic absences are applied at least at the centering level (prior to full space-group symmetry). For centering symbol <span class="math notranslate nohighlight">\(C\)</span>:</p> <ul class=simple > <li><p><span class="math notranslate nohighlight">\(I\)</span>: absent if <span class="math notranslate nohighlight">\(h+k+l\)</span> odd,</p> <li><p><span class="math notranslate nohighlight">\(A\)</span>: absent if <span class="math notranslate nohighlight">\(k+l\)</span> odd,</p> <li><p><span class="math notranslate nohighlight">\(B\)</span>: absent if <span class="math notranslate nohighlight">\(h+l\)</span> odd,</p> <li><p><span class="math notranslate nohighlight">\(C\)</span>: absent if <span class="math notranslate nohighlight">\(h+k\)</span> odd,</p> <li><p><span class="math notranslate nohighlight">\(F\)</span>: absent if any of <span class="math notranslate nohighlight">\(h+k, h+l, k+l\)</span> is odd,</p> <li><p><span class="math notranslate nohighlight">\(R\)</span>: absent if <span class="math notranslate nohighlight">\((-h+k+l)\bmod 3 \ne 0\)</span>,</p> <li><p><span class="math notranslate nohighlight">\(P\)</span>: no centering absences.</p> </ul> </section> </section> <hr class=docutils /> <section id=d-summation-integration-three-ring-method > <h2 id=d-summation-integration-three-ring-method >9. 2D summation integration (three-ring method)<a class=headerlink href="#d-summation-integration-three-ring-method" title="Link to this heading"></a></h2> <p>Jungfraujoch integrates predicted reflections by <strong>summation</strong> (no profile fitting), using a CrystFEL-inspired “three-circle / three-ring” method in the detector plane.</p> <section id=regions-of-interest > <h3 id=regions-of-interest >9.1 Regions of interest<a class=headerlink href="#regions-of-interest" title="Link to this heading"></a></h3> <p>For each predicted reflection at <span class="math notranslate nohighlight">\((x_p,y_p)\)</span>, define three radii:</p> <ul class=simple > <li><p><span class="math notranslate nohighlight">\(r_1\)</span>: inner signal radius,</p> <li><p><span class="math notranslate nohighlight">\(r_2\)</span>: inner background radius,</p> <li><p><span class="math notranslate nohighlight">\(r_3\)</span>: outer background radius.</p> </ul> <p>Pixels are classified by their squared distance <span class="math notranslate nohighlight">\(r^2=(x-x_p)^2+(y-y_p)^2\)</span>:</p> <ul class=simple > <li><p><strong>signal region:</strong> <span class="math notranslate nohighlight">\(r^2 &lt; r_1^2\)</span>,</p> <li><p><strong>background annulus:</strong> <span class="math notranslate nohighlight">\(r_2^2 \le r^2 &lt; r_3^2\)</span>.</p> </ul> <p>Invalid pixels (masked/bad/saturated) are excluded from both sums.</p> </section> <section id=background-subtraction-and-intensity-estimate > <h3 id=background-subtraction-and-intensity-estimate >9.2 Background subtraction and intensity estimate<a class=headerlink href="#background-subtraction-and-intensity-estimate" title="Link to this heading"></a></h3> <p>Let:</p> <ul class=simple > <li><p><span class="math notranslate nohighlight">\(S = \sum I(x,y)\)</span> over signal pixels,</p> <li><p><span class="math notranslate nohighlight">\(n_S\)</span> = number of valid signal pixels,</p> <li><p><span class="math notranslate nohighlight">\(B = \sum I(x,y)\)</span> over background pixels,</p> <li><p><span class="math notranslate nohighlight">\(n_B\)</span> = number of valid background pixels.</p> </ul> <p>Background per pixel: <span class="math notranslate nohighlight">\( \hat{b} = \frac{B}{n_B}, \)</span> integrated intensity: <span class="math notranslate nohighlight">\( \hat{I} = S - n_S \hat{b}. \)</span></p> <p>A reflection is accepted as “observed” only if all signal pixels were valid and <span class="math notranslate nohighlight">\(n_B\)</span> exceeds a minimum (to avoid unstable background estimates).</p> </section> <section id=uncertainty-model > <h3 id=uncertainty-model >9.3 Uncertainty model<a class=headerlink href="#uncertainty-model" title="Link to this heading"></a></h3> <p>A Poisson-like estimator is used for the raw summed counts: <span class="math notranslate nohighlight">\( \sigma(\hat{I}) \approx \sqrt{S}, \)</span> with a minimum <span class="math notranslate nohighlight">\(\sigma\ge 1\)</span> to avoid singular weights. (This is a pragmatic online estimate; more elaborate models may be applied downstream.)</p> </section> <section id=lorentzpolarization-factor-handling > <h3 id=lorentzpolarization-factor-handling >9.4 Lorentzpolarization factor handling<a class=headerlink href="#lorentzpolarization-factor-handling" title="Link to this heading"></a></h3> <p>For integrated reflections, polarization correction can be applied as a multiplicative correction to the reflection scale via the geometry-based polarization term (§2.2). A Lorentz-like factor is carried as <code class="docutils literal notranslate"><span class=pre >rlp</span></code> in predictions, and used during scaling/merging (§10).</p> </section> </section> <hr class=docutils /> <section id=scaling-and-merging > <h2 id=scaling-and-merging >10. Scaling and merging<a class=headerlink href="#scaling-and-merging" title="Link to this heading"></a></h2> <p>After per-image integration, Jungfraujoch scales observations and merges them into unique reflections. The design is intentionally compatible with XDS/XSCALE concepts, while supporting both still and rotation partiality models.</p> <section id=observation-model > <h3 id=observation-model >10.1 Observation model<a class=headerlink href="#observation-model" title="Link to this heading"></a></h3> <p>For an observation <span class="math notranslate nohighlight">\(j\)</span> of a unique reflection <span class="math notranslate nohighlight">\(h\)</span> on image (or image group) <span class="math notranslate nohighlight">\(i\)</span>, the predicted measured intensity is modeled as: <span class="math notranslate nohighlight">\( I_{ij} \approx G_i \, L_{ij}\, P_{ij}\, I_h, \)</span> where:</p> <ul class=simple > <li><p><span class="math notranslate nohighlight">\(G_i\)</span> is the image scale factor,</p> <li><p><span class="math notranslate nohighlight">\(L_{ij}\)</span> is a Lorentz-like / geometry factor (stored as <code class="docutils literal notranslate"><span class=pre >rlp</span></code> or derived),</p> <li><p><span class="math notranslate nohighlight">\(P_{ij}\)</span> is a partiality term (model-dependent),</p> <li><p><span class="math notranslate nohighlight">\(I_h\)</span> is the merged (true) intensity parameter for that unique reflection.</p> </ul> <p>A least-squares objective is minimized: <span class="math notranslate nohighlight">\( \sum_{ij} \left(\frac{I_{ij}^{\mathrm{pred}} - I_{ij}^{\mathrm{obs}}}{\sigma_{ij}}\right)^2 \)</span> with regularization on <span class="math notranslate nohighlight">\(G_i\)</span> and optional smoothness constraints (particularly meaningful for rotation series).</p> </section> <section id=partiality-models-available > <h3 id=partiality-models-available >10.2 Partiality models available<a class=headerlink href="#partiality-models-available" title="Link to this heading"></a></h3> <p>Jungfraujoch supports several partiality choices:</p> <ol class=arabic > <li><p class=rubric id=rotation-partiality-xds-like-see-8-3-p-ij-frac-1-2-left-mathrm-erf-left-frac-delta-phi-ij-delta-phi-2-sqrt-2-sigma-m-i-zeta-ij-right ><strong>Rotation partiality</strong> (XDS-like; see §8.3): $ P_{ij} = \frac{1}{2}\left[ \mathrm{erf}!\left(\frac{\Delta\phi_{ij}+\Delta\phi/2}{\sqrt{2},\sigma_{M,i}/\zeta_{ij}}\right)</p> <p>\mathrm{erf}!\left(\frac{\Delta\phi_{ij}-\Delta\phi/2}{\sqrt{2},\sigma_{M,i}/\zeta_{ij}}\right) \right]. <span class="math notranslate nohighlight">\( Mosaicity \)</span>\sigma_{M,i}$ can be refined per image group with bounds.</p> <li><p><strong>Still partiality</strong> (excitation-error proxy): <span class="math notranslate nohighlight">\( P_{ij} = \exp\!\left(-\frac{\Delta_\mathrm{Ewald}^2}{R_i^2}\right), \)</span> where <span class="math notranslate nohighlight">\(R_i^2\)</span> is a refined width parameter (bounded).</p> <li><p><strong>Unity</strong>: <span class="math notranslate nohighlight">\(P_{ij}=1\)</span>.</p> <li><p><strong>Fixed</strong>: use the per-reflection partiality carried from prediction.</p> </ol> <p>Reflections below a minimum partiality can be rejected from merging to avoid unstable corrections.</p> </section> <section id=regularization-and-smoothness > <h3 id=regularization-and-smoothness >10.3 Regularization and smoothness<a class=headerlink href="#regularization-and-smoothness" title="Link to this heading"></a></h3> <p>To stabilize scale determination, a weak prior <span class="math notranslate nohighlight">\(G_i\approx 1\)</span> is used. For rotation datasets, optional smoothness encourages slowly varying scales and mosaicity: <span class="math notranslate nohighlight">\( \log G_{i-1} - 2\log G_i + \log G_{i+1} \approx 0, \)</span> (and similarly for mosaicity), reflecting the expectation of gradual changes during a rotation scan.</p> </section> <section id=merging-estimator > <h3 id=merging-estimator >10.4 Merging estimator<a class=headerlink href="#merging-estimator" title="Link to this heading"></a></h3> <p>After refinement, corrected observations are formed: <span class="math notranslate nohighlight">\( I^{\mathrm{corr}}_{ij} = \frac{I^{\mathrm{obs}}_{ij}}{G_i L_{ij} P_{ij}},\qquad \sigma^{\mathrm{corr}}_{ij} = \frac{\sigma^{\mathrm{obs}}_{ij}}{G_i L_{ij} P_{ij}}. \)</span></p> <p>Unique intensities are merged by inverse-variance weighted mean: <span class="math notranslate nohighlight">\( I_h = \frac{\sum_j w_j I^{\mathrm{corr}}_{ij}}{\sum_j w_j},\qquad w_j = \frac{1}{(\sigma^{\mathrm{corr}}_{ij})^2}. \)</span></p> <p>An internal-consistency term can inflate uncertainties when multiple observations are present, in the spirit of XSCALE.</p> </section> <section id=merging-statistics > <h3 id=merging-statistics >10.5 Merging statistics<a class=headerlink href="#merging-statistics" title="Link to this heading"></a></h3> <p>Per-shell and overall merging statistics are computed on corrected intensities, including:</p> <ul class=simple > <li><p>number of observations,</p> <li><p>number of unique reflections,</p> <li><p>mean <span class="math notranslate nohighlight">\(I/\sigma(I)\)</span>,</p> <li><p>an R<span class="math notranslate nohighlight">\(_\mathrm{meas}\)</span>-like quantity derived from withinHKL deviations (shell-binned).</p> </ul> <p>Completeness requires enumeration of possible reflections given a unit cell and symmetry; where this is not fully available, completeness may be reported as 0 or omitted.</p> </section> </section> <hr class=docutils /> <section id=mosaicity-and-profile-radius-monitoring > <h2 id=mosaicity-and-profile-radius-monitoring >11. Mosaicity and “profile radius” monitoring<a class=headerlink href="#mosaicity-and-profile-radius-monitoring" title="Link to this heading"></a></h2> <section id=profile-radius-still-excitation-error-width > <h3 id=profile-radius-still-excitation-error-width >11.1 Profile radius (still excitation error width)<a class=headerlink href="#profile-radius-still-excitation-error-width" title="Link to this heading"></a></h3> <p>A simple scalar “profile radius” is estimated from indexed spots using the distribution of <span class="math notranslate nohighlight">\(\Delta_\mathrm{Ewald}\)</span>. Two estimators are available:</p> <ul class=simple > <li><p>standard deviation: <span class="math notranslate nohighlight">\( R \approx \sqrt{\frac{1}{N}\sum_i \Delta_{\mathrm{Ewald},i}^2}, \)</span></p> <li><p>robust MAD-based alternative (median absolute deviation), scaled by 1.4826.</p> </ul> <p>Operationally, predictions for still data may use a cutoff proportional to this width (e.g. <span class="math notranslate nohighlight">\(\Delta_\mathrm{cut}\approx 2R\)</span>).</p> </section> <section id=mosaicity-from-rotation-data-maximum-likelihood > <h3 id=mosaicity-from-rotation-data-maximum-likelihood >11.2 Mosaicity from rotation data (maximum likelihood)<a class=headerlink href="#mosaicity-from-rotation-data-maximum-likelihood" title="Link to this heading"></a></h3> <p>For rotation data, Jungfraujoch can estimate mosaicity by maximizing a likelihood based on the XDS reflection fraction <span class="math notranslate nohighlight">\(R(\tau;\sigma_M/\zeta)\)</span> as described by Kabsch (2010). In brief:</p> <ul class=simple > <li><p>compute angular deviations <span class="math notranslate nohighlight">\(\tau\)</span> from predicted Bragg positions,</p> <li><p>compute <span class="math notranslate nohighlight">\(\zeta\)</span> for each reflection,</p> <li><p>maximize <span class="math notranslate nohighlight">\(\sum \log R(\tau)\)</span> over <span class="math notranslate nohighlight">\(\sigma_M\)</span>.</p> </ul> <p>This yields a physically meaningful mosaicity estimate tied to the rotation partiality model.</p> </section> </section> <hr class=docutils /> <section id=wilson-statistics-and-frenchwilson-treatment > <h2 id=wilson-statistics-and-frenchwilson-treatment >12. Wilson statistics and FrenchWilson treatment<a class=headerlink href="#wilson-statistics-and-frenchwilson-treatment" title="Link to this heading"></a></h2> <section id=per-shell-i-i > <h3 id=per-shell-i-i >12.1 Per-shell ⟨I/σ(I)⟩<a class=headerlink href="#per-shell-i-i" title="Link to this heading"></a></h3> <p>For monitoring integration quality, Jungfraujoch reports mean <span class="math notranslate nohighlight">\(\langle I/\sigma(I)\rangle\)</span> in a fixed number of resolution shells. Shelling is performed in <span class="math notranslate nohighlight">\(1/d^2\)</span> space (typical of crystallographic practice).</p> </section> <section id=wilson-plot-b-factor-proxy > <h3 id=wilson-plot-b-factor-proxy >12.2 Wilson plot (B-factor proxy)<a class=headerlink href="#wilson-plot-b-factor-proxy" title="Link to this heading"></a></h3> <p>A Wilson-type analysis is computed by binning intensities by resolution and fitting: <span class="math notranslate nohighlight">\( \langle I\rangle \propto \exp\!\left(-\frac{B}{2}\frac{1}{d^2}\right), \)</span> i.e. <span class="math notranslate nohighlight">\( \log \langle I\rangle = \mathrm{const} - \frac{B}{2}\left(\frac{1}{d^2}\right). \)</span> A linear regression of <span class="math notranslate nohighlight">\(\log\langle I\rangle\)</span> vs <span class="math notranslate nohighlight">\(1/d^2\)</span> provides an estimate of <span class="math notranslate nohighlight">\(B\)</span>, subject to basic quality checks (e.g. <span class="math notranslate nohighlight">\(R^2\)</span> threshold).</p> </section> <section id=frenchwilson-posterior-expectation-of-i-and-f > <h3 id=frenchwilson-posterior-expectation-of-i-and-f >12.3 FrenchWilson (posterior expectation of I and |F|)<a class=headerlink href="#frenchwilson-posterior-expectation-of-i-and-f" title="Link to this heading"></a></h3> <p>To mitigate negative intensities and obtain physically meaningful amplitudes, Jungfraujoch implements a FrenchWilson style Bayesian treatment using per-shell mean intensity as a prior scale.</p> <p>For each merged observation <span class="math notranslate nohighlight">\(I_\mathrm{obs}\)</span> with uncertainty <span class="math notranslate nohighlight">\(\sigma\)</span>, the posterior over true intensity <span class="math notranslate nohighlight">\(I\ge 0\)</span> is: <span class="math notranslate nohighlight">\( p(I\mid I_\mathrm{obs}) \propto p(I)\,\exp\!\left(-\frac{(I_\mathrm{obs}-I)^2}{2\sigma^2}\right), \)</span> with priors differing between acentric and centric cases (standard Wilson distributions).</p> <p>Numerical quadrature over a scaled intensity variable is used to compute posterior moments:</p> <ul class=simple > <li><p><span class="math notranslate nohighlight">\(\langle I\rangle\)</span>,</p> <li><p><span class="math notranslate nohighlight">\(\langle |F|\rangle = \langle \sqrt{I}\rangle\)</span>, and an amplitude uncertainty estimate via: <span class="math notranslate nohighlight">\( \sigma_F \approx \sqrt{\langle I\rangle - \langle |F|\rangle^2}. \)</span></p> </ul> </section> </section> <hr class=docutils /> <section id=practical-notes-and-limitations > <h2 id=practical-notes-and-limitations >13. Practical notes and limitations<a class=headerlink href="#practical-notes-and-limitations" title="Link to this heading"></a></h2> <ul class=simple > <li><p><strong>No profile fitting</strong> is currently performed for Bragg integration; all integration is summation-based (§9). This is appropriate for fast feedback and many serial/streaming use cases, but differs from full profile fitting workflows.</p> <li><p><strong>Space-group symmetry</strong> beyond centering absences is not necessarily enforced during prediction/integration unless the space group is supplied and used downstream.</p> <li><p><strong>Resolution masking and ice rings</strong> are controllable; including ice-ring spots in indexing can improve robustness for some samples but may bias refinement in others.</p> <li><p><strong>Rotation vs still modes</strong> differ substantially in prediction and scaling because partiality is angle-driven in rotation data and excitation-error-driven in still data.</p> </ul> <hr class=docutils /> </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=DETECTOR_GEOMETRY.html title="Detector geometry" 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> Detector geometry </span> </div> </a> <a href=OPENAPI.html title=OpenAPI 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> OpenAPI </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>