Files
Jungfraujoch/JFJOCH_BROKER.html
2025-12-16 15:41:07 +00:00

127 lines
44 KiB
HTML

<!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>jfjoch_broker &#8212; Jungfraujoch 1.0.0-rc.122 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=7ebc78e1"></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=jfjoch_writer href=JFJOCH_WRITER.html /> <link rel=prev title=Changelog href=CHANGELOG.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="#JFJOCH_BROKER" 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.122 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 > jfjoch_broker </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.122 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.122 documentation" class="md-nav__button md-logo"> <i class=md-icon >&#xe30d</i> </a> <a href=index.html title="Jungfraujoch 1.0.0-rc.122 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 > <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 > jfjoch_broker </label> <a href="#" class="md-nav__link md-nav__link--active">jfjoch_broker</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="#external-interfaces" class=md-nav__link >External interfaces</a> <li class=md-nav__item > <a href="#broker-configuration" class=md-nav__link >Broker configuration</a> <li class=md-nav__item > <a href="#setting-up-a-local-test-for-jungfraujoch" class=md-nav__link >Setting up a local test for Jungfraujoch</a> </ul> <li class=md-nav__item > <a href=JFJOCH_WRITER.html class=md-nav__link >jfjoch_writer</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 > <a href=CPU_DATA_ANALYSIS.html class=md-nav__link >Algorithms for data analysis</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=CBOR.html class=md-nav__link >CBOR messages</a> <li class=md-nav__item > <a href=ZEROMQ_STREAM.html class=md-nav__link >ZeroMQ socket</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#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 id=jfjoch-broker > <h1 id=jfjoch-broker--page-root >jfjoch_broker<a class=headerlink href="#jfjoch-broker--page-root" title="Link to this heading"></a></h1> <p><code class="docutils literal notranslate"><span class=pre >jfjoch_broker</span></code> is the main service for the Jungfraujoch application. It is responsible for:</p> <ul class=simple > <li><p>Providing user interface via HTTP and OpenAPI</p> <li><p>Configuring FPGA firmware</p> <li><p>Building images from FPGA output and forwarding the results over ZeroMQ</p> </ul> <section id=external-interfaces > <h2 id=external-interfaces >External interfaces<a class=headerlink href="#external-interfaces" title="Link to this heading"></a></h2> <p>Broker operates four external interfaces.</p> <p><strong>Image stream</strong> ZeroMQ PULL socket with CBOR serialization is used to send images, metadata and processing results for writing or downstream processing. See details <a class="reference internal" href="ZEROMQ_STREAM.html#image-stream"><span class="std std-ref">here</span></a>.</p> <p><strong>Preview stream</strong> ZeroMQ PUB socket, as above but limited to subset of frames (1 image/s by default). See details <a class="reference internal" href="ZEROMQ_STREAM.html#preview-stream"><span class="std std-ref">here</span></a>.</p> <p><strong>Metadata stream</strong> ZeroMQ PUB socket, contains metadata for all the images, with bundling. See details <a class="reference internal" href="ZEROMQ_STREAM.html#metadata-stream"><span class="std std-ref">here</span></a>.</p> <p><strong>Configuration, status and results interface</strong> HTTP/REST interface described in the OpenAPI format. Description of the API is presented in the <a class="reference download internal" download="" href="_downloads/625caea52ebbd47be3d6ed9efa4ee972/redoc-static.html"><span class="xref download myst">OpenAPI description</span></a>.</p> </section> <section id=broker-configuration > <h2 id=broker-configuration >Broker configuration<a class=headerlink href="#broker-configuration" title="Link to this heading"></a></h2> <p><code class="docutils literal notranslate"><span class=pre >jfjoch_broker</span></code> requires JSON configuration files. The file is described by OpenAPI structure <code class="docutils literal notranslate"><span class=pre >jfjoch_settings</span></code> defined in <code class="docutils literal notranslate"><span class=pre >jfjoch_api.yaml</span></code> file. It is recommended to go through example files in the <code class="docutils literal notranslate"><span class=pre >etc/</span></code>.</p> <p>Example with all fields:</p> <div class="highlight-json notranslate"><div class=highlight ><pre><span></span><span class=p >{</span>
<span class=w > </span><span class=nt >"pcie"</span><span class=p >:</span><span class=w > </span><span class=p >[</span>
<span class=w > </span><span class=p >{</span>
<span class=w > </span><span class=nt >"blk"</span><span class=p >:</span><span class=w > </span><span class=s2 >"/dev/jfjoch0"</span><span class=p >,</span>
<span class=w > </span><span class=nt >"ipv4"</span><span class=p >:</span><span class=w > </span><span class=s2 >"10.1.1.7"</span>
<span class=w > </span><span class=p >},</span>
<span class=w > </span><span class=p >{</span>
<span class=w > </span><span class=nt >"blk"</span><span class=p >:</span><span class=w > </span><span class=s2 >"/dev/jfjoch1"</span><span class=p >,</span>
<span class=w > </span><span class=nt >"ipv4"</span><span class=p >:</span><span class=w > </span><span class=s2 >"10.1.1.8"</span>
<span class=w > </span><span class=p >}</span>
<span class=w > </span><span class=p >],</span>
<span class=w > </span><span class=nt >"zeromq"</span><span class=p >:</span><span class=w > </span><span class=p >{</span>
<span class=w > </span><span class=nt >"send_watermark"</span><span class=p >:</span><span class=w > </span><span class=mi >100</span><span class=p >,</span>
<span class=w > </span><span class=nt >"send_buffer_size"</span><span class=p >:</span><span class=w > </span><span class=mi >1024</span><span class=p >,</span>
<span class=w > </span><span class=nt >"image_socket"</span><span class=p >:</span><span class=w > </span><span class=p >[</span>
<span class=w > </span><span class=s2 >"tcp://1.2.3.4:5000"</span><span class=p >,</span>
<span class=w > </span><span class=s2 >"tcp://1.2.3.4:5001"</span>
<span class=w > </span><span class=p >],</span>
<span class=w > </span><span class=nt >"writer_notification_socket"</span><span class=p >:</span><span class=w > </span><span class=s2 >"tcp://1.3.4.6:7000"</span>
<span class=w > </span><span class=p >},</span>
<span class=w > </span><span class=nt >"instrument"</span><span class=p >:</span><span class=w > </span><span class=p >{</span>
<span class=w > </span><span class=nt >"source_name"</span><span class=p >:</span><span class=w > </span><span class=s2 >"Swiss Light Source"</span><span class=p >,</span>
<span class=w > </span><span class=nt >"source_type"</span><span class=p >:</span><span class=w > </span><span class=s2 >"Synchrotron X-ray Source"</span><span class=p >,</span>
<span class=w > </span><span class=nt >"instrument_name"</span><span class=p >:</span><span class=w > </span><span class=s2 >"X06SA"</span><span class=p >,</span>
<span class=w > </span><span class=nt >"pulsed_source"</span><span class=p >:</span><span class=w > </span><span class=kc >false</span><span class=p >,</span>
<span class=w > </span><span class=nt >"electron_source"</span><span class=p >:</span><span class=w > </span><span class=kc >false</span>
<span class=w > </span><span class=p >},</span>
<span class=w > </span><span class=nt >"detector"</span><span class=p >:</span><span class=w > </span><span class=p >[</span>
<span class=w > </span><span class=p >{</span>
<span class=w > </span><span class=nt >"description"</span><span class=p >:</span><span class=w > </span><span class=s2 >"EIGER 1M"</span><span class=p >,</span>
<span class=w > </span><span class=nt >"serial_number"</span><span class=p >:</span><span class=w > </span><span class=s2 >"E1M-01"</span><span class=p >,</span>
<span class=w > </span><span class=nt >"type"</span><span class=p >:</span><span class=w > </span><span class=s2 >"EIGER"</span><span class=p >,</span>
<span class=w > </span><span class=nt >"high_voltage_V"</span><span class=p >:</span><span class=w > </span><span class=mi >150</span><span class=p >,</span>
<span class=w > </span><span class=nt >"udp_interface_count"</span><span class=p >:</span><span class=w > </span><span class=mi >1</span><span class=p >,</span>
<span class=w > </span><span class=nt >"module_sync"</span><span class=p >:</span><span class=w > </span><span class=kc >true</span><span class=p >,</span>
<span class=w > </span><span class=nt >"sensor_thickness_um"</span><span class=p >:</span><span class=w > </span><span class=mi >320</span><span class=p >,</span>
<span class=w > </span><span class=nt >"calibration_file"</span><span class=p >:</span><span class=w > </span><span class=p >[</span>
<span class=w > </span><span class=s2 >"gainMaps.bin"</span>
<span class=w > </span><span class=p >],</span>
<span class=w > </span><span class=nt >"hostname"</span><span class=p >:</span><span class=w > </span><span class=p >[</span>
<span class=w > </span><span class=s2 >"e1m-01"</span><span class=p >,</span>
<span class=w > </span><span class=s2 >"e1m-02"</span>
<span class=w > </span><span class=p >],</span>
<span class=w > </span><span class=nt >"readout_time_us"</span><span class=p >:</span><span class=w > </span><span class=mi >3</span><span class=p >,</span>
<span class=w > </span><span class=nt >"sensor_material"</span><span class=p >:</span><span class=w > </span><span class=s2 >"Si"</span><span class=p >,</span>
<span class=w > </span><span class=nt >"tx_delay"</span><span class=p >:</span><span class=w > </span><span class=p >[</span>
<span class=w > </span><span class=mi >0</span><span class=p >,</span><span class=mi >1</span>
<span class=w > </span><span class=p >],</span>
<span class=w > </span><span class=nt >"base_data_ipv4_address"</span><span class=p >:</span><span class=w > </span><span class=s2 >"10.10.10.50"</span><span class=p >,</span>
<span class=w > </span><span class=nt >"standard_geometry"</span><span class=p >:</span><span class=w > </span><span class=p >{</span>
<span class=w > </span><span class=nt >"nmodules"</span><span class=p >:</span><span class=w > </span><span class=mi >1</span><span class=p >,</span>
<span class=w > </span><span class=nt >"gap_x"</span><span class=p >:</span><span class=w > </span><span class=mi >8</span><span class=p >,</span>
<span class=w > </span><span class=nt >"gap_y"</span><span class=p >:</span><span class=w > </span><span class=mi >36</span><span class=p >,</span>
<span class=w > </span><span class=nt >"modules_in_row"</span><span class=p >:</span><span class=w > </span><span class=mi >1</span>
<span class=w > </span><span class=p >},</span>
<span class=w > </span><span class=nt >"custom_geometry"</span><span class=p >:</span><span class=w > </span><span class=p >[</span>
<span class=w > </span><span class=p >{</span>
<span class=w > </span><span class=nt >"x0"</span><span class=p >:</span><span class=w > </span><span class=mi >0</span><span class=p >,</span>
<span class=w > </span><span class=nt >"y0"</span><span class=p >:</span><span class=w > </span><span class=mi >0</span><span class=p >,</span>
<span class=w > </span><span class=nt >"fast_axis"</span><span class=p >:</span><span class=w > </span><span class=s2 >"Xp"</span><span class=p >,</span>
<span class=w > </span><span class=nt >"slow_axis"</span><span class=p >:</span><span class=w > </span><span class=s2 >"Xp"</span>
<span class=w > </span><span class=p >}</span>
<span class=w > </span><span class=p >],</span>
<span class=w > </span><span class=nt >"mirror_y"</span><span class=p >:</span><span class=w > </span><span class=kc >true</span>
<span class=w > </span><span class=p >}</span>
<span class=w > </span><span class=p >],</span>
<span class=w > </span><span class=nt >"detector_settings"</span><span class=p >:</span><span class=w > </span><span class=p >{</span>
<span class=w > </span><span class=nt >"frame_time_us"</span><span class=p >:</span><span class=w > </span><span class=mi >450</span><span class=p >,</span>
<span class=w > </span><span class=nt >"count_time_us"</span><span class=p >:</span><span class=w > </span><span class=mi >0</span><span class=p >,</span>
<span class=w > </span><span class=nt >"internal_frame_generator"</span><span class=p >:</span><span class=w > </span><span class=kc >false</span><span class=p >,</span>
<span class=w > </span><span class=nt >"internal_frame_generator_images"</span><span class=p >:</span><span class=w > </span><span class=mi >1</span><span class=p >,</span>
<span class=w > </span><span class=nt >"detector_trigger_delay_ns"</span><span class=p >:</span><span class=w > </span><span class=mi >0</span><span class=p >,</span>
<span class=w > </span><span class=nt >"timing"</span><span class=p >:</span><span class=w > </span><span class=s2 >"auto"</span><span class=p >,</span>
<span class=w > </span><span class=nt >"eiger_threshold_keV"</span><span class=p >:</span><span class=w > </span><span class=mf >6.0</span><span class=p >,</span>
<span class=w > </span><span class=nt >"jungfrau_pedestal_g0_frames"</span><span class=p >:</span><span class=w > </span><span class=mi >2000</span><span class=p >,</span>
<span class=w > </span><span class=nt >"jungfrau_pedestal_g1_frames"</span><span class=p >:</span><span class=w > </span><span class=mi >300</span><span class=p >,</span>
<span class=w > </span><span class=nt >"jungfrau_pedestal_g2_frames"</span><span class=p >:</span><span class=w > </span><span class=mi >300</span><span class=p >,</span>
<span class=w > </span><span class=nt >"jungfrau_pedestal_g0_rms_limit"</span><span class=p >:</span><span class=w > </span><span class=mi >100</span><span class=p >,</span>
<span class=w > </span><span class=nt >"jungfrau_pedestal_min_image_count"</span><span class=p >:</span><span class=w > </span><span class=mi >128</span><span class=p >,</span>
<span class=w > </span><span class=nt >"jungfrau_storage_cell_count"</span><span class=p >:</span><span class=w > </span><span class=mi >1</span><span class=p >,</span>
<span class=w > </span><span class=nt >"jungfrau_storage_cell_delay_ns"</span><span class=p >:</span><span class=w > </span><span class=mi >5000</span><span class=p >,</span>
<span class=w > </span><span class=nt >"jungfrau_fixed_gain_g1"</span><span class=p >:</span><span class=w > </span><span class=kc >false</span><span class=p >,</span>
<span class=w > </span><span class=nt >"jungfrau_use_gain_hg0"</span><span class=p >:</span><span class=w > </span><span class=kc >false</span>
<span class=w > </span><span class=p >},</span>
<span class=w > </span><span class=nt >"azim_int"</span><span class=p >:</span><span class=w > </span><span class=p >{</span>
<span class=w > </span><span class=nt >"polarization_factor"</span><span class=p >:</span><span class=w > </span><span class=mi >-1</span><span class=p >,</span>
<span class=w > </span><span class=nt >"solid_angle_corr"</span><span class=p >:</span><span class=w > </span><span class=kc >true</span><span class=p >,</span>
<span class=w > </span><span class=nt >"high_q_recipA"</span><span class=p >:</span><span class=w > </span><span class=mi >0</span><span class=p >,</span>
<span class=w > </span><span class=nt >"low_q_recipA"</span><span class=p >:</span><span class=w > </span><span class=mi >0</span><span class=p >,</span>
<span class=w > </span><span class=nt >"q_spacing"</span><span class=p >:</span><span class=w > </span><span class=mi >0</span>
<span class=w > </span><span class=p >},</span>
<span class=w > </span><span class=nt >"image_format"</span><span class=p >:</span><span class=w > </span><span class=p >{</span>
<span class=w > </span><span class=nt >"summation"</span><span class=p >:</span><span class=w > </span><span class=kc >true</span><span class=p >,</span>
<span class=w > </span><span class=nt >"geometry_transform"</span><span class=p >:</span><span class=w > </span><span class=kc >true</span><span class=p >,</span>
<span class=w > </span><span class=nt >"jungfrau_conversion"</span><span class=p >:</span><span class=w > </span><span class=kc >true</span><span class=p >,</span>
<span class=w > </span><span class=nt >"jungfrau_conversion_factor_keV"</span><span class=p >:</span><span class=w > </span><span class=mf >0.001</span><span class=p >,</span>
<span class=w > </span><span class=nt >"bit_depth_image"</span><span class=p >:</span><span class=w > </span><span class=mi >16</span><span class=p >,</span>
<span class=w > </span><span class=nt >"signed_output"</span><span class=p >:</span><span class=w > </span><span class=kc >true</span><span class=p >,</span>
<span class=w > </span><span class=nt >"mask_module_edges"</span><span class=p >:</span><span class=w > </span><span class=kc >true</span><span class=p >,</span>
<span class=w > </span><span class=nt >"mask_chip_edges"</span><span class=p >:</span><span class=w > </span><span class=kc >true</span>
<span class=w > </span><span class=p >},</span>
<span class=w > </span><span class=nt >"image_buffer_MiB"</span><span class=p >:</span><span class=w > </span><span class=mi >2048</span><span class=p >,</span>
<span class=w > </span><span class=nt >"receiver_threads"</span><span class=p >:</span><span class=w > </span><span class=mi >64</span><span class=p >,</span>
<span class=w > </span><span class=nt >"numa_policy"</span><span class=p >:</span><span class=w > </span><span class=s2 >"n2g2"</span><span class=p >,</span>
<span class=w > </span><span class=nt >"frontend_directory"</span><span class=p >:</span><span class=w > </span><span class=s2 >"/usr/share/jfjoch/frontend"</span><span class=p >,</span>
<span class=w > </span><span class=nt >"image_pusher"</span><span class=p >:</span><span class=w > </span><span class=s2 >"ZeroMQ"</span><span class=p >,</span>
<span class=w > </span><span class=nt >"zeromq_metadata"</span><span class=p >:</span><span class=w > </span><span class=p >{</span>
<span class=w > </span><span class=nt >"enabled"</span><span class=p >:</span><span class=w > </span><span class=kc >true</span><span class=p >,</span>
<span class=w > </span><span class=nt >"period_ms"</span><span class=p >:</span><span class=w > </span><span class=mi >1000</span><span class=p >,</span>
<span class=w > </span><span class=nt >"socket_address"</span><span class=p >:</span><span class=w > </span><span class=s2 >"tcp://0.0.0.0:4357"</span>
<span class=w > </span><span class=p >},</span>
<span class=w > </span><span class=nt >"zeromq_preview"</span><span class=p >:</span><span class=w > </span><span class=p >{</span>
<span class=w > </span><span class=nt >"enabled"</span><span class=p >:</span><span class=w > </span><span class=kc >true</span><span class=p >,</span>
<span class=w > </span><span class=nt >"period_ms"</span><span class=p >:</span><span class=w > </span><span class=mi >1000</span><span class=p >,</span>
<span class=w > </span><span class=nt >"socket_address"</span><span class=p >:</span><span class=w > </span><span class=s2 >"tcp://0.0.0.0:4356"</span>
<span class=w > </span><span class=p >}</span>
<span class=p >}</span>
</pre></div> </div> </section> <section id=setting-up-a-local-test-for-jungfraujoch > <h2 id=setting-up-a-local-test-for-jungfraujoch >Setting up a local test for Jungfraujoch<a class=headerlink href="#setting-up-a-local-test-for-jungfraujoch" title="Link to this heading"></a></h2> <p>For development, it is possible to set up a local installation of Jungfraujoch. This will work without FPGA installed in the computer and allows to test Jungfraujoch software layer, including ZeroMQ streaming and file writing.</p> <p>The workflow simulates FPGA behavior, by running high-level synthesis code on the CPU - the performance is therefore very low, as fixed-point calculations have large performance penalty on CPU. In the CPU simulation mode, one can simulate using only a single FPGA device.</p> <p>To run the test:</p> <section id=compile-jungfraujoch-with-frontend > <h3 id=compile-jungfraujoch-with-frontend >Compile Jungfraujoch with frontend<a class=headerlink href="#compile-jungfraujoch-with-frontend" title="Link to this heading"></a></h3> <div class="highlight-default notranslate"><div class=highlight ><pre><span></span><span class=n >mkdir</span> <span class=n >build</span>
<span class=n >cd</span> <span class=n >build</span>
<span class=n >cmake</span> <span class=o >..</span>
<span class=n >make</span> <span class=n >jfjoch</span>
<span class=n >make</span> <span class=n >frontend</span>
</pre></div> </div> <p>Alternatively, for RHEL8 system, you can use RPM generated by automated pipeline. Solely <code class="docutils literal notranslate"><span class=pre >jfjoch</span></code> one is enough. In this case - it is necessary to update <code class="docutils literal notranslate"><span class=pre >etc/broker_local.json</span></code> file with frontend path in <code class="docutils literal notranslate"><span class=pre >/usr/share/jfjoch/frontend</span></code>.</p> </section> <section id=start-service > <h3 id=start-service >Start service<a class=headerlink href="#start-service" title="Link to this heading"></a></h3> <p>Start broker:</p> <div class="highlight-default notranslate"><div class=highlight ><pre><span></span><span class=n >cd</span> <span class=n >build</span><span class=o >/</span><span class=n >broker</span>
<span class=o >./</span><span class=n >jfjoch_broker</span> <span class=o >../../</span><span class=n >etc</span><span class=o >/</span><span class=n >broker_local</span><span class=o >.</span><span class=n >json</span> <span class=mi >5232</span>
</pre></div> </div> </section> <section id=run-tests > <h3 id=run-tests >Run tests<a class=headerlink href="#run-tests" title="Link to this heading"></a></h3> <p>To run test a Python script is provided:</p> <div class="highlight-default notranslate"><div class=highlight ><pre><span></span><span class=n >cd</span> <span class=n >tests</span><span class=o >/</span><span class=n >test_data</span>
<span class=n >python</span> <span class=n >jfjoch_broker_test</span><span class=o >.</span><span class=n >py</span>
</pre></div> </div> <p>The script will initialize Jungfraujoch, import test image and start data collection.</p> </section> <section id=expected-result > <h3 id=expected-result >Expected result<a class=headerlink href="#expected-result" title="Link to this heading"></a></h3> <p>You can observe online data analysis by opening the following web page: <a class="reference external" href="http://localhost:5232">http://localhost:5232</a>. Also, a dataset with images should be written in the <code class="docutils literal notranslate"><span class=pre >build/broker</span></code> directory.</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=CHANGELOG.html title=Changelog 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> Changelog </span> </div> </a> <a href=JFJOCH_WRITER.html title=jfjoch_writer 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> jfjoch_writer </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>