From 5fdda01ff45574181cd4997370adabb7a2c9a8c4 Mon Sep 17 00:00:00 2001 From: "Filip Leonarski (Gitea)" Date: Fri, 1 May 2026 16:49:38 +0000 Subject: [PATCH] Deploy site --- .buildinfo | 4 + .doctrees/ACKNOWLEDGEMENT.doctree | Bin 0 -> 5635 bytes .doctrees/CBOR.doctree | Bin 0 -> 261650 bytes .doctrees/CHANGELOG.doctree | Bin 0 -> 211956 bytes .doctrees/CPU_DATA_ANALYSIS.doctree | Bin 0 -> 134759 bytes .doctrees/DEPLOYMENT.doctree | Bin 0 -> 29808 bytes .doctrees/DETECTORS.doctree | Bin 0 -> 5850 bytes .doctrees/DETECTOR_GEOMETRY.doctree | Bin 0 -> 8230 bytes .doctrees/FPGA.doctree | Bin 0 -> 18321 bytes .doctrees/FPGA_DATA_ANALYSIS.doctree | Bin 0 -> 21118 bytes .doctrees/FPGA_DESIGN.doctree | Bin 0 -> 7876 bytes .doctrees/FPGA_LICENSE.doctree | Bin 0 -> 44414 bytes .doctrees/FPGA_NETWORK.doctree | Bin 0 -> 12724 bytes .doctrees/FPGA_PCIE_DRIVER.doctree | Bin 0 -> 22530 bytes .doctrees/FPGA_SETTINGS.doctree | Bin 0 -> 96731 bytes .doctrees/HARDWARE.doctree | Bin 0 -> 14348 bytes .doctrees/IMAGE_STREAM.doctree | Bin 0 -> 88075 bytes .doctrees/JFJOCH_BROKER.doctree | Bin 0 -> 22075 bytes .doctrees/JFJOCH_VIEWER.doctree | Bin 0 -> 7349 bytes .doctrees/JFJOCH_WRITER.doctree | Bin 0 -> 75095 bytes .doctrees/LICENSE.doctree | Bin 0 -> 117769 bytes .doctrees/OPENAPI.doctree | Bin 0 -> 5645 bytes .doctrees/OPENAPI_SPECS.doctree | Bin 0 -> 3144 bytes .doctrees/PIXEL_MASK.doctree | Bin 0 -> 8126 bytes .doctrees/REPOSITORIES.doctree | Bin 0 -> 15473 bytes .doctrees/SOFTWARE.doctree | Bin 0 -> 18937 bytes .doctrees/SOFTWARE_INTEGRATION.doctree | Bin 0 -> 9353 bytes .doctrees/TESTS.doctree | Bin 0 -> 6224 bytes .doctrees/TOOLS.doctree | Bin 0 -> 9085 bytes .doctrees/VERSIONING.doctree | Bin 0 -> 5132 bytes .doctrees/WEB_FRONTEND.doctree | Bin 0 -> 4959 bytes .doctrees/environment.pickle | Bin 0 -> 442916 bytes .doctrees/index.doctree | Bin 0 -> 5370 bytes .doctrees/python_client/README.doctree | Bin 0 -> 153780 bytes .../docs/AzimIntSettings.doctree | Bin 0 -> 14266 bytes .../python_client/docs/BrokerStatus.doctree | Bin 0 -> 14505 bytes .../docs/CalibrationStatisticsInner.doctree | Bin 0 -> 16808 bytes .../python_client/docs/ColorScale.doctree | Bin 0 -> 6448 bytes .../docs/DarkMaskSettings.doctree | Bin 0 -> 13949 bytes .../docs/DatasetSettings.doctree | Bin 0 -> 59657 bytes .../docs/DatasetSettingsUnitCell.doctree | Bin 0 -> 13864 bytes ...etSettingsXrayFluorescenceSpectrum.doctree | Bin 0 -> 10590 bytes .../python_client/docs/DefaultApi.doctree | Bin 0 -> 840171 bytes .doctrees/python_client/docs/Detector.doctree | Bin 0 -> 32992 bytes .../python_client/docs/DetectorList.doctree | Bin 0 -> 9729 bytes .../docs/DetectorListDetectorsInner.doctree | Bin 0 -> 15799 bytes .../docs/DetectorListElement.doctree | Bin 0 -> 20976 bytes .../python_client/docs/DetectorModule.doctree | Bin 0 -> 12106 bytes .../docs/DetectorModuleDirection.doctree | Bin 0 -> 6412 bytes .../docs/DetectorPowerState.doctree | Bin 0 -> 6185 bytes .../docs/DetectorSelection.doctree | Bin 0 -> 8484 bytes .../docs/DetectorSettings.doctree | Bin 0 -> 28504 bytes .../python_client/docs/DetectorState.doctree | Bin 0 -> 7084 bytes .../python_client/docs/DetectorStatus.doctree | Bin 0 -> 14574 bytes .../python_client/docs/DetectorTiming.doctree | Bin 0 -> 6436 bytes .../python_client/docs/DetectorType.doctree | Bin 0 -> 5967 bytes .../python_client/docs/ErrorMessage.doctree | Bin 0 -> 9495 bytes .../docs/FileWriterFormat.doctree | Bin 0 -> 9014 bytes .../docs/FileWriterSettings.doctree | Bin 0 -> 10353 bytes .../docs/FpgaStatusInner.doctree | Bin 0 -> 21654 bytes .../docs/GeomRefinementAlgorithm.doctree | Bin 0 -> 6005 bytes .doctrees/python_client/docs/GridPlot.doctree | Bin 0 -> 9213 bytes .../python_client/docs/GridPlots.doctree | Bin 0 -> 9546 bytes .doctrees/python_client/docs/GridScan.doctree | Bin 0 -> 13831 bytes .../python_client/docs/GridScanResult.doctree | Bin 0 -> 13806 bytes .../docs/GridScanResultImagesInner.doctree | Bin 0 -> 16609 bytes .../docs/ImageBufferStatus.doctree | Bin 0 -> 17419 bytes .../docs/ImageFormatSettings.doctree | Bin 0 -> 21690 bytes .../docs/ImagePusherStatus.doctree | Bin 0 -> 16265 bytes .../docs/ImagePusherType.doctree | Bin 0 -> 6869 bytes .../docs/IndexingAlgorithm.doctree | Bin 0 -> 7088 bytes .../docs/IndexingSettings.doctree | Bin 0 -> 27652 bytes .../docs/InstrumentMetadata.doctree | Bin 0 -> 14708 bytes .../docs/JfjochBrokerApi.doctree | Bin 0 -> 20611 bytes .../python_client/docs/JfjochSettings.doctree | Bin 0 -> 34773 bytes .../docs/JfjochSettingsSsl.doctree | Bin 0 -> 9486 bytes .../docs/JfjochStatistics.doctree | Bin 0 -> 36014 bytes .../docs/MeasurementStatistics.doctree | Bin 0 -> 34504 bytes .../docs/PcieDevicesInner.doctree | Bin 0 -> 9705 bytes .../docs/PixelMaskStatistics.doctree | Bin 0 -> 11203 bytes .doctrees/python_client/docs/Plot.doctree | Bin 0 -> 11603 bytes .../python_client/docs/PlotTypeEnum.doctree | Bin 0 -> 14888 bytes .../python_client/docs/PlotUnitX.doctree | Bin 0 -> 7389 bytes .doctrees/python_client/docs/Plots.doctree | Bin 0 -> 13038 bytes .../docs/PreviewSettings.doctree | Bin 0 -> 15825 bytes .../python_client/docs/RoiAzimList.doctree | Bin 0 -> 8882 bytes .../python_client/docs/RoiAzimuthal.doctree | Bin 0 -> 10825 bytes .doctrees/python_client/docs/RoiBox.doctree | Bin 0 -> 12901 bytes .../python_client/docs/RoiBoxList.doctree | Bin 0 -> 8804 bytes .../python_client/docs/RoiCircle.doctree | Bin 0 -> 11845 bytes .../python_client/docs/RoiCircleList.doctree | Bin 0 -> 8869 bytes .../python_client/docs/RoiDefinitions.doctree | Bin 0 -> 11461 bytes .../python_client/docs/RotationAxis.doctree | Bin 0 -> 14584 bytes .../python_client/docs/ScanResult.doctree | Bin 0 -> 12650 bytes .../docs/ScanResultImagesInner.doctree | Bin 0 -> 29983 bytes .../docs/SpotFindingSettings.doctree | Bin 0 -> 22815 bytes .../docs/StandardDetectorGeometry.doctree | Bin 0 -> 12614 bytes .../python_client/docs/TcpSettings.doctree | Bin 0 -> 11486 bytes .doctrees/python_client/docs/UnitCell.doctree | Bin 0 -> 13390 bytes .../docs/ZeromqMetadataSettings.doctree | Bin 0 -> 11798 bytes .../docs/ZeromqPreviewSettings.doctree | Bin 0 -> 12258 bytes .../python_client/docs/ZeromqSettings.doctree | Bin 0 -> 14563 bytes ACKNOWLEDGEMENT.html | 1 + CBOR.html | 1 + CHANGELOG.html | 1 + CPU_DATA_ANALYSIS.html | 1 + DEPLOYMENT.html | 36 + DETECTORS.html | 1 + DETECTOR_GEOMETRY.html | 1 + FPGA.html | 16 + FPGA_DATA_ANALYSIS.html | 1 + FPGA_DESIGN.html | 1 + FPGA_LICENSE.html | 7 + FPGA_NETWORK.html | 1 + FPGA_PCIE_DRIVER.html | 10 + FPGA_SETTINGS.html | 1 + HARDWARE.html | 1 + IMAGE_STREAM.html | 30 + JFJOCH_BROKER.html | 127 + JFJOCH_VIEWER.html | 1 + JFJOCH_WRITER.html | 70 + LICENSE.html | 20 + OPENAPI.html | 2 + OPENAPI_SPECS.html | 1 + PIXEL_MASK.html | 13 + REPOSITORIES.html | 5 + SOFTWARE.html | 1 + SOFTWARE_INTEGRATION.html | 2 + TESTS.html | 1 + TOOLS.html | 13 + VERSIONING.html | 1 + WEB_FRONTEND.html | 1 + .../redoc-static.html | 943 ++++ _images/jfjoch.png | Bin 0 -> 64403 bytes _sources/ACKNOWLEDGEMENT.md.txt | 10 + _sources/CBOR.md.txt | 303 ++ _sources/CHANGELOG.md.txt | 950 ++++ _sources/CPU_DATA_ANALYSIS.md.txt | 617 +++ _sources/DEPLOYMENT.md.txt | 159 + _sources/DETECTORS.md.txt | 13 + _sources/DETECTOR_GEOMETRY.md.txt | 24 + _sources/FPGA.md.txt | 81 + _sources/FPGA_DATA_ANALYSIS.md.txt | 74 + _sources/FPGA_DESIGN.md.txt | 21 + _sources/FPGA_LICENSE.md.txt | 295 ++ _sources/FPGA_NETWORK.md.txt | 39 + _sources/FPGA_PCIE_DRIVER.md.txt | 100 + _sources/FPGA_SETTINGS.md.txt | 121 + _sources/HARDWARE.md.txt | 55 + _sources/IMAGE_STREAM.md.txt | 235 + _sources/JFJOCH_BROKER.md.txt | 189 + _sources/JFJOCH_VIEWER.md.txt | 19 + _sources/JFJOCH_WRITER.md.txt | 219 + _sources/LICENSE.md.txt | 690 +++ _sources/OPENAPI.md.txt | 13 + _sources/OPENAPI_SPECS.rst.txt | 4 + _sources/PIXEL_MASK.md.txt | 46 + _sources/REPOSITORIES.md.txt | 47 + _sources/SOFTWARE.md.txt | 49 + _sources/SOFTWARE_INTEGRATION.md.txt | 24 + _sources/TESTS.md.txt | 10 + _sources/TOOLS.md.txt | 47 + _sources/VERSIONING.md.txt | 13 + _sources/WEB_FRONTEND.md.txt | 9 + _sources/index.rst.txt | 67 + _sources/python_client/README.md.txt | 238 + .../python_client/docs/AzimIntSettings.md.txt | 34 + .../python_client/docs/BrokerStatus.md.txt | 34 + .../docs/CalibrationStatisticsInner.md.txt | 37 + _sources/python_client/docs/ColorScale.md.txt | 16 + .../docs/DarkMaskSettings.md.txt | 34 + .../python_client/docs/DatasetSettings.md.txt | 66 + .../docs/DatasetSettingsUnitCell.md.txt | 35 + ...setSettingsXrayFluorescenceSpectrum.md.txt | 30 + _sources/python_client/docs/DefaultApi.md.txt | 4213 +++++++++++++++++ _sources/python_client/docs/Detector.md.txt | 49 + .../python_client/docs/DetectorList.md.txt | 30 + .../docs/DetectorListDetectorsInner.md.txt | 36 + .../docs/DetectorListElement.md.txt | 41 + .../python_client/docs/DetectorModule.md.txt | 32 + .../docs/DetectorModuleDirection.md.txt | 16 + .../docs/DetectorPowerState.md.txt | 15 + .../docs/DetectorSelection.md.txt | 29 + .../docs/DetectorSettings.md.txt | 44 + .../python_client/docs/DetectorState.md.txt | 19 + .../python_client/docs/DetectorStatus.md.txt | 34 + .../python_client/docs/DetectorTiming.md.txt | 16 + .../python_client/docs/DetectorType.md.txt | 14 + .../python_client/docs/ErrorMessage.md.txt | 30 + .../docs/FileWriterFormat.md.txt | 23 + .../docs/FileWriterSettings.md.txt | 30 + .../python_client/docs/FpgaStatusInner.md.txt | 42 + .../docs/GeomRefinementAlgorithm.md.txt | 13 + _sources/python_client/docs/GridPlot.md.txt | 30 + _sources/python_client/docs/GridPlots.md.txt | 30 + _sources/python_client/docs/GridScan.md.txt | 34 + .../python_client/docs/GridScanResult.md.txt | 35 + .../docs/GridScanResultImagesInner.md.txt | 36 + .../docs/ImageBufferStatus.md.txt | 36 + .../docs/ImageFormatSettings.md.txt | 39 + .../docs/ImagePusherStatus.md.txt | 35 + .../python_client/docs/ImagePusherType.md.txt | 18 + .../docs/IndexingAlgorithm.md.txt | 19 + .../docs/IndexingSettings.md.txt | 44 + .../docs/InstrumentMetadata.md.txt | 34 + .../python_client/docs/JfjochBrokerApi.md.txt | 77 + .../python_client/docs/JfjochSettings.md.txt | 49 + .../docs/JfjochSettingsSsl.md.txt | 30 + .../docs/JfjochStatistics.md.txt | 49 + .../docs/MeasurementStatistics.md.txt | 51 + .../docs/PcieDevicesInner.md.txt | 30 + .../docs/PixelMaskStatistics.md.txt | 31 + _sources/python_client/docs/Plot.md.txt | 33 + .../python_client/docs/PlotTypeEnum.md.txt | 48 + _sources/python_client/docs/PlotUnitX.md.txt | 20 + _sources/python_client/docs/Plots.md.txt | 33 + .../python_client/docs/PreviewSettings.md.txt | 36 + .../python_client/docs/RoiAzimList.md.txt | 30 + .../python_client/docs/RoiAzimuthal.md.txt | 32 + _sources/python_client/docs/RoiBox.md.txt | 34 + _sources/python_client/docs/RoiBoxList.md.txt | 30 + _sources/python_client/docs/RoiCircle.md.txt | 33 + .../python_client/docs/RoiCircleList.md.txt | 30 + .../python_client/docs/RoiDefinitions.md.txt | 32 + .../python_client/docs/RotationAxis.md.txt | 35 + _sources/python_client/docs/ScanResult.md.txt | 33 + .../docs/ScanResultImagesInner.md.txt | 48 + .../docs/SpotFindingSettings.md.txt | 40 + .../docs/StandardDetectorGeometry.md.txt | 33 + .../python_client/docs/TcpSettings.md.txt | 32 + _sources/python_client/docs/UnitCell.md.txt | 35 + .../docs/ZeromqMetadataSettings.md.txt | 31 + .../docs/ZeromqPreviewSettings.md.txt | 31 + .../python_client/docs/ZeromqSettings.md.txt | 33 + _static/basic.css | 1 + _static/doctools.js | 149 + _static/documentation_options.js | 13 + _static/file.png | Bin 0 -> 286 bytes _static/fonts/font-awesome.css | 1 + _static/fonts/material-icons.css | 1 + _static/fonts/specimen/FontAwesome.ttf | Bin 0 -> 165548 bytes _static/fonts/specimen/FontAwesome.woff | Bin 0 -> 98024 bytes _static/fonts/specimen/FontAwesome.woff2 | Bin 0 -> 77160 bytes .../fonts/specimen/MaterialIcons-Regular.ttf | Bin 0 -> 128180 bytes .../fonts/specimen/MaterialIcons-Regular.woff | Bin 0 -> 57620 bytes .../specimen/MaterialIcons-Regular.woff2 | Bin 0 -> 44300 bytes _static/images/favicon.png | Bin 0 -> 521 bytes _static/images/icons/bitbucket.1b09e088.svg | 1 + _static/images/icons/bitbucket.svg | 1 + _static/images/icons/github.f0b8504a.svg | 1 + _static/images/icons/github.svg | 1 + _static/images/icons/gitlab.6dd19c00.svg | 1 + _static/images/icons/gitlab.svg | 1 + _static/javascripts/application.js | 2540 ++++++++++ _static/javascripts/lunr/lunr.da.js | 1 + _static/javascripts/lunr/lunr.de.js | 1 + _static/javascripts/lunr/lunr.du.js | 1 + _static/javascripts/lunr/lunr.es.js | 1 + _static/javascripts/lunr/lunr.fi.js | 1 + _static/javascripts/lunr/lunr.fr.js | 1 + _static/javascripts/lunr/lunr.hu.js | 1 + _static/javascripts/lunr/lunr.it.js | 1 + _static/javascripts/lunr/lunr.ja.js | 1 + _static/javascripts/lunr/lunr.jp.js | 1 + _static/javascripts/lunr/lunr.multi.js | 1 + _static/javascripts/lunr/lunr.nl.js | 1 + _static/javascripts/lunr/lunr.no.js | 1 + _static/javascripts/lunr/lunr.pt.js | 1 + _static/javascripts/lunr/lunr.ro.js | 1 + _static/javascripts/lunr/lunr.ru.js | 1 + .../javascripts/lunr/lunr.stemmer.support.js | 1 + _static/javascripts/lunr/lunr.sv.js | 1 + _static/javascripts/lunr/lunr.th.js | 1 + _static/javascripts/lunr/lunr.tr.js | 1 + _static/javascripts/lunr/tinyseg.js | 1 + _static/javascripts/lunr/wordcut.js | 1 + _static/javascripts/modernizr.js | 1 + _static/javascripts/version_dropdown.js | 29 + _static/jfjoch.png | Bin 0 -> 64403 bytes _static/jquery.js | 2 + _static/jquery.min.map | 1 + _static/language_data.js | 192 + _static/material.css | 1 + _static/minus.png | Bin 0 -> 90 bytes _static/plus.png | Bin 0 -> 90 bytes _static/pygments.css | 1 + _static/redoc-static.html | 943 ++++ _static/searchtools.js | 632 +++ _static/sphinx_highlight.js | 154 + _static/stylesheets/application-fixes.css | 1 + _static/stylesheets/application-palette.css | 1 + _static/stylesheets/application.css | 1 + genindex.html | 1 + index.html | 1 + objects.inv | Bin 0 -> 1867 bytes python_client/README.html | 29 + python_client/docs/AzimIntSettings.html | 14 + python_client/docs/BrokerStatus.html | 14 + .../docs/CalibrationStatisticsInner.html | 14 + python_client/docs/ColorScale.html | 1 + python_client/docs/DarkMaskSettings.html | 14 + python_client/docs/DatasetSettings.html | 14 + .../docs/DatasetSettingsUnitCell.html | 14 + ...tasetSettingsXrayFluorescenceSpectrum.html | 14 + python_client/docs/DefaultApi.html | 1450 ++++++ python_client/docs/Detector.html | 14 + python_client/docs/DetectorList.html | 14 + .../docs/DetectorListDetectorsInner.html | 14 + python_client/docs/DetectorListElement.html | 14 + python_client/docs/DetectorModule.html | 14 + .../docs/DetectorModuleDirection.html | 1 + python_client/docs/DetectorPowerState.html | 1 + python_client/docs/DetectorSelection.html | 14 + python_client/docs/DetectorSettings.html | 14 + python_client/docs/DetectorState.html | 1 + python_client/docs/DetectorStatus.html | 14 + python_client/docs/DetectorTiming.html | 1 + python_client/docs/DetectorType.html | 1 + python_client/docs/ErrorMessage.html | 14 + python_client/docs/FileWriterFormat.html | 1 + python_client/docs/FileWriterSettings.html | 14 + python_client/docs/FpgaStatusInner.html | 14 + .../docs/GeomRefinementAlgorithm.html | 1 + python_client/docs/GridPlot.html | 14 + python_client/docs/GridPlots.html | 14 + python_client/docs/GridScan.html | 14 + python_client/docs/GridScanResult.html | 14 + .../docs/GridScanResultImagesInner.html | 14 + python_client/docs/ImageBufferStatus.html | 14 + python_client/docs/ImageFormatSettings.html | 14 + python_client/docs/ImagePusherStatus.html | 14 + python_client/docs/ImagePusherType.html | 1 + python_client/docs/IndexingAlgorithm.html | 1 + python_client/docs/IndexingSettings.html | 14 + python_client/docs/InstrumentMetadata.html | 14 + python_client/docs/JfjochBrokerApi.html | 24 + python_client/docs/JfjochSettings.html | 14 + python_client/docs/JfjochSettingsSsl.html | 14 + python_client/docs/JfjochStatistics.html | 14 + python_client/docs/MeasurementStatistics.html | 14 + python_client/docs/PcieDevicesInner.html | 14 + python_client/docs/PixelMaskStatistics.html | 14 + python_client/docs/Plot.html | 14 + python_client/docs/PlotTypeEnum.html | 1 + python_client/docs/PlotUnitX.html | 1 + python_client/docs/Plots.html | 14 + python_client/docs/PreviewSettings.html | 14 + python_client/docs/RoiAzimList.html | 14 + python_client/docs/RoiAzimuthal.html | 14 + python_client/docs/RoiBox.html | 14 + python_client/docs/RoiBoxList.html | 14 + python_client/docs/RoiCircle.html | 14 + python_client/docs/RoiCircleList.html | 14 + python_client/docs/RoiDefinitions.html | 14 + python_client/docs/RotationAxis.html | 14 + python_client/docs/ScanResult.html | 14 + python_client/docs/ScanResultImagesInner.html | 14 + python_client/docs/SpotFindingSettings.html | 14 + .../docs/StandardDetectorGeometry.html | 14 + python_client/docs/TcpSettings.html | 14 + python_client/docs/UnitCell.html | 14 + .../docs/ZeromqMetadataSettings.html | 14 + python_client/docs/ZeromqPreviewSettings.html | 14 + python_client/docs/ZeromqSettings.html | 14 + search.html | 1 + searchindex.js | 1 + 366 files changed, 19524 insertions(+) create mode 100644 .buildinfo create mode 100644 .doctrees/ACKNOWLEDGEMENT.doctree create mode 100644 .doctrees/CBOR.doctree create mode 100644 .doctrees/CHANGELOG.doctree create mode 100644 .doctrees/CPU_DATA_ANALYSIS.doctree create mode 100644 .doctrees/DEPLOYMENT.doctree create mode 100644 .doctrees/DETECTORS.doctree create mode 100644 .doctrees/DETECTOR_GEOMETRY.doctree create mode 100644 .doctrees/FPGA.doctree create mode 100644 .doctrees/FPGA_DATA_ANALYSIS.doctree create mode 100644 .doctrees/FPGA_DESIGN.doctree create mode 100644 .doctrees/FPGA_LICENSE.doctree create mode 100644 .doctrees/FPGA_NETWORK.doctree create mode 100644 .doctrees/FPGA_PCIE_DRIVER.doctree create mode 100644 .doctrees/FPGA_SETTINGS.doctree create mode 100644 .doctrees/HARDWARE.doctree create mode 100644 .doctrees/IMAGE_STREAM.doctree create mode 100644 .doctrees/JFJOCH_BROKER.doctree create mode 100644 .doctrees/JFJOCH_VIEWER.doctree create mode 100644 .doctrees/JFJOCH_WRITER.doctree create mode 100644 .doctrees/LICENSE.doctree create mode 100644 .doctrees/OPENAPI.doctree create mode 100644 .doctrees/OPENAPI_SPECS.doctree create mode 100644 .doctrees/PIXEL_MASK.doctree create mode 100644 .doctrees/REPOSITORIES.doctree create mode 100644 .doctrees/SOFTWARE.doctree create mode 100644 .doctrees/SOFTWARE_INTEGRATION.doctree create mode 100644 .doctrees/TESTS.doctree create mode 100644 .doctrees/TOOLS.doctree create mode 100644 .doctrees/VERSIONING.doctree create mode 100644 .doctrees/WEB_FRONTEND.doctree create mode 100644 .doctrees/environment.pickle create mode 100644 .doctrees/index.doctree create mode 100644 .doctrees/python_client/README.doctree create mode 100644 .doctrees/python_client/docs/AzimIntSettings.doctree create mode 100644 .doctrees/python_client/docs/BrokerStatus.doctree create mode 100644 .doctrees/python_client/docs/CalibrationStatisticsInner.doctree create mode 100644 .doctrees/python_client/docs/ColorScale.doctree create mode 100644 .doctrees/python_client/docs/DarkMaskSettings.doctree create mode 100644 .doctrees/python_client/docs/DatasetSettings.doctree create mode 100644 .doctrees/python_client/docs/DatasetSettingsUnitCell.doctree create mode 100644 .doctrees/python_client/docs/DatasetSettingsXrayFluorescenceSpectrum.doctree create mode 100644 .doctrees/python_client/docs/DefaultApi.doctree create mode 100644 .doctrees/python_client/docs/Detector.doctree create mode 100644 .doctrees/python_client/docs/DetectorList.doctree create mode 100644 .doctrees/python_client/docs/DetectorListDetectorsInner.doctree create mode 100644 .doctrees/python_client/docs/DetectorListElement.doctree create mode 100644 .doctrees/python_client/docs/DetectorModule.doctree create mode 100644 .doctrees/python_client/docs/DetectorModuleDirection.doctree create mode 100644 .doctrees/python_client/docs/DetectorPowerState.doctree create mode 100644 .doctrees/python_client/docs/DetectorSelection.doctree create mode 100644 .doctrees/python_client/docs/DetectorSettings.doctree create mode 100644 .doctrees/python_client/docs/DetectorState.doctree create mode 100644 .doctrees/python_client/docs/DetectorStatus.doctree create mode 100644 .doctrees/python_client/docs/DetectorTiming.doctree create mode 100644 .doctrees/python_client/docs/DetectorType.doctree create mode 100644 .doctrees/python_client/docs/ErrorMessage.doctree create mode 100644 .doctrees/python_client/docs/FileWriterFormat.doctree create mode 100644 .doctrees/python_client/docs/FileWriterSettings.doctree create mode 100644 .doctrees/python_client/docs/FpgaStatusInner.doctree create mode 100644 .doctrees/python_client/docs/GeomRefinementAlgorithm.doctree create mode 100644 .doctrees/python_client/docs/GridPlot.doctree create mode 100644 .doctrees/python_client/docs/GridPlots.doctree create mode 100644 .doctrees/python_client/docs/GridScan.doctree create mode 100644 .doctrees/python_client/docs/GridScanResult.doctree create mode 100644 .doctrees/python_client/docs/GridScanResultImagesInner.doctree create mode 100644 .doctrees/python_client/docs/ImageBufferStatus.doctree create mode 100644 .doctrees/python_client/docs/ImageFormatSettings.doctree create mode 100644 .doctrees/python_client/docs/ImagePusherStatus.doctree create mode 100644 .doctrees/python_client/docs/ImagePusherType.doctree create mode 100644 .doctrees/python_client/docs/IndexingAlgorithm.doctree create mode 100644 .doctrees/python_client/docs/IndexingSettings.doctree create mode 100644 .doctrees/python_client/docs/InstrumentMetadata.doctree create mode 100644 .doctrees/python_client/docs/JfjochBrokerApi.doctree create mode 100644 .doctrees/python_client/docs/JfjochSettings.doctree create mode 100644 .doctrees/python_client/docs/JfjochSettingsSsl.doctree create mode 100644 .doctrees/python_client/docs/JfjochStatistics.doctree create mode 100644 .doctrees/python_client/docs/MeasurementStatistics.doctree create mode 100644 .doctrees/python_client/docs/PcieDevicesInner.doctree create mode 100644 .doctrees/python_client/docs/PixelMaskStatistics.doctree create mode 100644 .doctrees/python_client/docs/Plot.doctree create mode 100644 .doctrees/python_client/docs/PlotTypeEnum.doctree create mode 100644 .doctrees/python_client/docs/PlotUnitX.doctree create mode 100644 .doctrees/python_client/docs/Plots.doctree create mode 100644 .doctrees/python_client/docs/PreviewSettings.doctree create mode 100644 .doctrees/python_client/docs/RoiAzimList.doctree create mode 100644 .doctrees/python_client/docs/RoiAzimuthal.doctree create mode 100644 .doctrees/python_client/docs/RoiBox.doctree create mode 100644 .doctrees/python_client/docs/RoiBoxList.doctree create mode 100644 .doctrees/python_client/docs/RoiCircle.doctree create mode 100644 .doctrees/python_client/docs/RoiCircleList.doctree create mode 100644 .doctrees/python_client/docs/RoiDefinitions.doctree create mode 100644 .doctrees/python_client/docs/RotationAxis.doctree create mode 100644 .doctrees/python_client/docs/ScanResult.doctree create mode 100644 .doctrees/python_client/docs/ScanResultImagesInner.doctree create mode 100644 .doctrees/python_client/docs/SpotFindingSettings.doctree create mode 100644 .doctrees/python_client/docs/StandardDetectorGeometry.doctree create mode 100644 .doctrees/python_client/docs/TcpSettings.doctree create mode 100644 .doctrees/python_client/docs/UnitCell.doctree create mode 100644 .doctrees/python_client/docs/ZeromqMetadataSettings.doctree create mode 100644 .doctrees/python_client/docs/ZeromqPreviewSettings.doctree create mode 100644 .doctrees/python_client/docs/ZeromqSettings.doctree create mode 100644 ACKNOWLEDGEMENT.html create mode 100644 CBOR.html create mode 100644 CHANGELOG.html create mode 100644 CPU_DATA_ANALYSIS.html create mode 100644 DEPLOYMENT.html create mode 100644 DETECTORS.html create mode 100644 DETECTOR_GEOMETRY.html create mode 100644 FPGA.html create mode 100644 FPGA_DATA_ANALYSIS.html create mode 100644 FPGA_DESIGN.html create mode 100644 FPGA_LICENSE.html create mode 100644 FPGA_NETWORK.html create mode 100644 FPGA_PCIE_DRIVER.html create mode 100644 FPGA_SETTINGS.html create mode 100644 HARDWARE.html create mode 100644 IMAGE_STREAM.html create mode 100644 JFJOCH_BROKER.html create mode 100644 JFJOCH_VIEWER.html create mode 100644 JFJOCH_WRITER.html create mode 100644 LICENSE.html create mode 100644 OPENAPI.html create mode 100644 OPENAPI_SPECS.html create mode 100644 PIXEL_MASK.html create mode 100644 REPOSITORIES.html create mode 100644 SOFTWARE.html create mode 100644 SOFTWARE_INTEGRATION.html create mode 100644 TESTS.html create mode 100644 TOOLS.html create mode 100644 VERSIONING.html create mode 100644 WEB_FRONTEND.html create mode 100644 _downloads/625caea52ebbd47be3d6ed9efa4ee972/redoc-static.html create mode 100644 _images/jfjoch.png create mode 100644 _sources/ACKNOWLEDGEMENT.md.txt create mode 100644 _sources/CBOR.md.txt create mode 100644 _sources/CHANGELOG.md.txt create mode 100644 _sources/CPU_DATA_ANALYSIS.md.txt create mode 100644 _sources/DEPLOYMENT.md.txt create mode 100644 _sources/DETECTORS.md.txt create mode 100644 _sources/DETECTOR_GEOMETRY.md.txt create mode 100644 _sources/FPGA.md.txt create mode 100644 _sources/FPGA_DATA_ANALYSIS.md.txt create mode 100644 _sources/FPGA_DESIGN.md.txt create mode 100644 _sources/FPGA_LICENSE.md.txt create mode 100644 _sources/FPGA_NETWORK.md.txt create mode 100644 _sources/FPGA_PCIE_DRIVER.md.txt create mode 100644 _sources/FPGA_SETTINGS.md.txt create mode 100644 _sources/HARDWARE.md.txt create mode 100644 _sources/IMAGE_STREAM.md.txt create mode 100644 _sources/JFJOCH_BROKER.md.txt create mode 100644 _sources/JFJOCH_VIEWER.md.txt create mode 100644 _sources/JFJOCH_WRITER.md.txt create mode 100644 _sources/LICENSE.md.txt create mode 100644 _sources/OPENAPI.md.txt create mode 100644 _sources/OPENAPI_SPECS.rst.txt create mode 100644 _sources/PIXEL_MASK.md.txt create mode 100644 _sources/REPOSITORIES.md.txt create mode 100644 _sources/SOFTWARE.md.txt create mode 100644 _sources/SOFTWARE_INTEGRATION.md.txt create mode 100644 _sources/TESTS.md.txt create mode 100644 _sources/TOOLS.md.txt create mode 100644 _sources/VERSIONING.md.txt create mode 100644 _sources/WEB_FRONTEND.md.txt create mode 100644 _sources/index.rst.txt create mode 100644 _sources/python_client/README.md.txt create mode 100644 _sources/python_client/docs/AzimIntSettings.md.txt create mode 100644 _sources/python_client/docs/BrokerStatus.md.txt create mode 100644 _sources/python_client/docs/CalibrationStatisticsInner.md.txt create mode 100644 _sources/python_client/docs/ColorScale.md.txt create mode 100644 _sources/python_client/docs/DarkMaskSettings.md.txt create mode 100644 _sources/python_client/docs/DatasetSettings.md.txt create mode 100644 _sources/python_client/docs/DatasetSettingsUnitCell.md.txt create mode 100644 _sources/python_client/docs/DatasetSettingsXrayFluorescenceSpectrum.md.txt create mode 100644 _sources/python_client/docs/DefaultApi.md.txt create mode 100644 _sources/python_client/docs/Detector.md.txt create mode 100644 _sources/python_client/docs/DetectorList.md.txt create mode 100644 _sources/python_client/docs/DetectorListDetectorsInner.md.txt create mode 100644 _sources/python_client/docs/DetectorListElement.md.txt create mode 100644 _sources/python_client/docs/DetectorModule.md.txt create mode 100644 _sources/python_client/docs/DetectorModuleDirection.md.txt create mode 100644 _sources/python_client/docs/DetectorPowerState.md.txt create mode 100644 _sources/python_client/docs/DetectorSelection.md.txt create mode 100644 _sources/python_client/docs/DetectorSettings.md.txt create mode 100644 _sources/python_client/docs/DetectorState.md.txt create mode 100644 _sources/python_client/docs/DetectorStatus.md.txt create mode 100644 _sources/python_client/docs/DetectorTiming.md.txt create mode 100644 _sources/python_client/docs/DetectorType.md.txt create mode 100644 _sources/python_client/docs/ErrorMessage.md.txt create mode 100644 _sources/python_client/docs/FileWriterFormat.md.txt create mode 100644 _sources/python_client/docs/FileWriterSettings.md.txt create mode 100644 _sources/python_client/docs/FpgaStatusInner.md.txt create mode 100644 _sources/python_client/docs/GeomRefinementAlgorithm.md.txt create mode 100644 _sources/python_client/docs/GridPlot.md.txt create mode 100644 _sources/python_client/docs/GridPlots.md.txt create mode 100644 _sources/python_client/docs/GridScan.md.txt create mode 100644 _sources/python_client/docs/GridScanResult.md.txt create mode 100644 _sources/python_client/docs/GridScanResultImagesInner.md.txt create mode 100644 _sources/python_client/docs/ImageBufferStatus.md.txt create mode 100644 _sources/python_client/docs/ImageFormatSettings.md.txt create mode 100644 _sources/python_client/docs/ImagePusherStatus.md.txt create mode 100644 _sources/python_client/docs/ImagePusherType.md.txt create mode 100644 _sources/python_client/docs/IndexingAlgorithm.md.txt create mode 100644 _sources/python_client/docs/IndexingSettings.md.txt create mode 100644 _sources/python_client/docs/InstrumentMetadata.md.txt create mode 100644 _sources/python_client/docs/JfjochBrokerApi.md.txt create mode 100644 _sources/python_client/docs/JfjochSettings.md.txt create mode 100644 _sources/python_client/docs/JfjochSettingsSsl.md.txt create mode 100644 _sources/python_client/docs/JfjochStatistics.md.txt create mode 100644 _sources/python_client/docs/MeasurementStatistics.md.txt create mode 100644 _sources/python_client/docs/PcieDevicesInner.md.txt create mode 100644 _sources/python_client/docs/PixelMaskStatistics.md.txt create mode 100644 _sources/python_client/docs/Plot.md.txt create mode 100644 _sources/python_client/docs/PlotTypeEnum.md.txt create mode 100644 _sources/python_client/docs/PlotUnitX.md.txt create mode 100644 _sources/python_client/docs/Plots.md.txt create mode 100644 _sources/python_client/docs/PreviewSettings.md.txt create mode 100644 _sources/python_client/docs/RoiAzimList.md.txt create mode 100644 _sources/python_client/docs/RoiAzimuthal.md.txt create mode 100644 _sources/python_client/docs/RoiBox.md.txt create mode 100644 _sources/python_client/docs/RoiBoxList.md.txt create mode 100644 _sources/python_client/docs/RoiCircle.md.txt create mode 100644 _sources/python_client/docs/RoiCircleList.md.txt create mode 100644 _sources/python_client/docs/RoiDefinitions.md.txt create mode 100644 _sources/python_client/docs/RotationAxis.md.txt create mode 100644 _sources/python_client/docs/ScanResult.md.txt create mode 100644 _sources/python_client/docs/ScanResultImagesInner.md.txt create mode 100644 _sources/python_client/docs/SpotFindingSettings.md.txt create mode 100644 _sources/python_client/docs/StandardDetectorGeometry.md.txt create mode 100644 _sources/python_client/docs/TcpSettings.md.txt create mode 100644 _sources/python_client/docs/UnitCell.md.txt create mode 100644 _sources/python_client/docs/ZeromqMetadataSettings.md.txt create mode 100644 _sources/python_client/docs/ZeromqPreviewSettings.md.txt create mode 100644 _sources/python_client/docs/ZeromqSettings.md.txt create mode 100644 _static/basic.css create mode 100644 _static/doctools.js create mode 100644 _static/documentation_options.js create mode 100644 _static/file.png create mode 100644 _static/fonts/font-awesome.css create mode 100644 _static/fonts/material-icons.css create mode 100644 _static/fonts/specimen/FontAwesome.ttf create mode 100644 _static/fonts/specimen/FontAwesome.woff create mode 100644 _static/fonts/specimen/FontAwesome.woff2 create mode 100644 _static/fonts/specimen/MaterialIcons-Regular.ttf create mode 100644 _static/fonts/specimen/MaterialIcons-Regular.woff create mode 100644 _static/fonts/specimen/MaterialIcons-Regular.woff2 create mode 100644 _static/images/favicon.png create mode 100644 _static/images/icons/bitbucket.1b09e088.svg create mode 100644 _static/images/icons/bitbucket.svg create mode 100644 _static/images/icons/github.f0b8504a.svg create mode 100644 _static/images/icons/github.svg create mode 100644 _static/images/icons/gitlab.6dd19c00.svg create mode 100644 _static/images/icons/gitlab.svg create mode 100644 _static/javascripts/application.js create mode 100644 _static/javascripts/lunr/lunr.da.js create mode 100644 _static/javascripts/lunr/lunr.de.js create mode 100644 _static/javascripts/lunr/lunr.du.js create mode 100644 _static/javascripts/lunr/lunr.es.js create mode 100644 _static/javascripts/lunr/lunr.fi.js create mode 100644 _static/javascripts/lunr/lunr.fr.js create mode 100644 _static/javascripts/lunr/lunr.hu.js create mode 100644 _static/javascripts/lunr/lunr.it.js create mode 100644 _static/javascripts/lunr/lunr.ja.js create mode 100644 _static/javascripts/lunr/lunr.jp.js create mode 100644 _static/javascripts/lunr/lunr.multi.js create mode 100644 _static/javascripts/lunr/lunr.nl.js create mode 100644 _static/javascripts/lunr/lunr.no.js create mode 100644 _static/javascripts/lunr/lunr.pt.js create mode 100644 _static/javascripts/lunr/lunr.ro.js create mode 100644 _static/javascripts/lunr/lunr.ru.js create mode 100644 _static/javascripts/lunr/lunr.stemmer.support.js create mode 100644 _static/javascripts/lunr/lunr.sv.js create mode 100644 _static/javascripts/lunr/lunr.th.js create mode 100644 _static/javascripts/lunr/lunr.tr.js create mode 100644 _static/javascripts/lunr/tinyseg.js create mode 100644 _static/javascripts/lunr/wordcut.js create mode 100644 _static/javascripts/modernizr.js create mode 100644 _static/javascripts/version_dropdown.js create mode 100644 _static/jfjoch.png create mode 100644 _static/jquery.js create mode 100644 _static/jquery.min.map create mode 100644 _static/language_data.js create mode 100644 _static/material.css create mode 100644 _static/minus.png create mode 100644 _static/plus.png create mode 100644 _static/pygments.css create mode 100644 _static/redoc-static.html create mode 100644 _static/searchtools.js create mode 100644 _static/sphinx_highlight.js create mode 100644 _static/stylesheets/application-fixes.css create mode 100644 _static/stylesheets/application-palette.css create mode 100644 _static/stylesheets/application.css create mode 100644 genindex.html create mode 100644 index.html create mode 100644 objects.inv create mode 100644 python_client/README.html create mode 100644 python_client/docs/AzimIntSettings.html create mode 100644 python_client/docs/BrokerStatus.html create mode 100644 python_client/docs/CalibrationStatisticsInner.html create mode 100644 python_client/docs/ColorScale.html create mode 100644 python_client/docs/DarkMaskSettings.html create mode 100644 python_client/docs/DatasetSettings.html create mode 100644 python_client/docs/DatasetSettingsUnitCell.html create mode 100644 python_client/docs/DatasetSettingsXrayFluorescenceSpectrum.html create mode 100644 python_client/docs/DefaultApi.html create mode 100644 python_client/docs/Detector.html create mode 100644 python_client/docs/DetectorList.html create mode 100644 python_client/docs/DetectorListDetectorsInner.html create mode 100644 python_client/docs/DetectorListElement.html create mode 100644 python_client/docs/DetectorModule.html create mode 100644 python_client/docs/DetectorModuleDirection.html create mode 100644 python_client/docs/DetectorPowerState.html create mode 100644 python_client/docs/DetectorSelection.html create mode 100644 python_client/docs/DetectorSettings.html create mode 100644 python_client/docs/DetectorState.html create mode 100644 python_client/docs/DetectorStatus.html create mode 100644 python_client/docs/DetectorTiming.html create mode 100644 python_client/docs/DetectorType.html create mode 100644 python_client/docs/ErrorMessage.html create mode 100644 python_client/docs/FileWriterFormat.html create mode 100644 python_client/docs/FileWriterSettings.html create mode 100644 python_client/docs/FpgaStatusInner.html create mode 100644 python_client/docs/GeomRefinementAlgorithm.html create mode 100644 python_client/docs/GridPlot.html create mode 100644 python_client/docs/GridPlots.html create mode 100644 python_client/docs/GridScan.html create mode 100644 python_client/docs/GridScanResult.html create mode 100644 python_client/docs/GridScanResultImagesInner.html create mode 100644 python_client/docs/ImageBufferStatus.html create mode 100644 python_client/docs/ImageFormatSettings.html create mode 100644 python_client/docs/ImagePusherStatus.html create mode 100644 python_client/docs/ImagePusherType.html create mode 100644 python_client/docs/IndexingAlgorithm.html create mode 100644 python_client/docs/IndexingSettings.html create mode 100644 python_client/docs/InstrumentMetadata.html create mode 100644 python_client/docs/JfjochBrokerApi.html create mode 100644 python_client/docs/JfjochSettings.html create mode 100644 python_client/docs/JfjochSettingsSsl.html create mode 100644 python_client/docs/JfjochStatistics.html create mode 100644 python_client/docs/MeasurementStatistics.html create mode 100644 python_client/docs/PcieDevicesInner.html create mode 100644 python_client/docs/PixelMaskStatistics.html create mode 100644 python_client/docs/Plot.html create mode 100644 python_client/docs/PlotTypeEnum.html create mode 100644 python_client/docs/PlotUnitX.html create mode 100644 python_client/docs/Plots.html create mode 100644 python_client/docs/PreviewSettings.html create mode 100644 python_client/docs/RoiAzimList.html create mode 100644 python_client/docs/RoiAzimuthal.html create mode 100644 python_client/docs/RoiBox.html create mode 100644 python_client/docs/RoiBoxList.html create mode 100644 python_client/docs/RoiCircle.html create mode 100644 python_client/docs/RoiCircleList.html create mode 100644 python_client/docs/RoiDefinitions.html create mode 100644 python_client/docs/RotationAxis.html create mode 100644 python_client/docs/ScanResult.html create mode 100644 python_client/docs/ScanResultImagesInner.html create mode 100644 python_client/docs/SpotFindingSettings.html create mode 100644 python_client/docs/StandardDetectorGeometry.html create mode 100644 python_client/docs/TcpSettings.html create mode 100644 python_client/docs/UnitCell.html create mode 100644 python_client/docs/ZeromqMetadataSettings.html create mode 100644 python_client/docs/ZeromqPreviewSettings.html create mode 100644 python_client/docs/ZeromqSettings.html create mode 100644 search.html create mode 100644 searchindex.js diff --git a/.buildinfo b/.buildinfo new file mode 100644 index 00000000..6886abc5 --- /dev/null +++ b/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file records the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 0632690ccc7c654437bb17d1f52d1e78 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/.doctrees/ACKNOWLEDGEMENT.doctree b/.doctrees/ACKNOWLEDGEMENT.doctree new file mode 100644 index 0000000000000000000000000000000000000000..78f8f3d5e641f8f112c6938c4996653d278383dd GIT binary patch literal 5635 zcmd5=+io1U8MbWeusX|$-2k>y#zh*b)vgYJ|uK1H8+$K!NrhdeJ^YZt@s;iT1J|=dim{BwGerqXyO*l0V7+@ckz~AN_J2&4*_&g@8_{4`?HWZ!1XKc;uvdz!fp_1Dzdo~o3Wm{>J+EHpuBATgzluoKMBG68P zVLzl=V-nwkl19bXNRY<8L6iEs32Ql;)D9ckc1szb;_u%b;InpR@rg=ybxeJ>80|0K zNoBj0&~!)nd=Y%<#hdGQw?2RP+2+Qr&3l_$_Zv}=@r!(%U*c!dCWNg)6538^%=>in zC>=O;YF!xW)Omw^(jcEPC268}#R9q4ARi|wbjOkfvW_Jcv#0g-lu4g1kedy1Pd$A~ zrEsH98+A}@8ybX;`nOo5hVA5J>r@*ShE%cz@-Y^emdq@WI}P$s?F5|=+cCZE^GFy& zs0`fA52Pk)V|jULZE<_~+S1bM+S=;M%F^=E%C+l{=eRMkzOe{{h=xkqi^r1AH*yTl z@e7X{|JN4y;rU?_Sy zM1u>jqv~DytNu$V|0z73e}I7UGyFcp?<4%?;pszQCQU?U=TD4_EakuCYjAl8#TP08 zA=(8y&^S(Rb}S3-w0hrZRWxW6QP-*FK4&CO)DC=s2u*Yv$0~7t)$EWPUDdprs;8Rm zlc}cSYp|5E;;UxInrRp^W^=xsNqskzdxy>stvDK)NgLy+aO;_ zvBwf*(2jEulnD`eA`F}Y)j*zARf_=DOrnY*_}(u8qE*Yd zJY6a8e|SSrp?`TZg^rX8{qso`T5Tv5dVJ8eLq!bB?7%PbcuxCpTSdBFsN(mzi@T-D zNa_^)KqMj%8YLKQM>JRMZHdGt6_g#SB%-kR* z7?x{>tg>5WjkkAU&p7{lGvkaN%nLnT+i6tE2Wxri^6s3SG;Dumhwgi#ErCaL4G}fG zZ-TkpeB}NzU%R9<3R9ul&QtH1*CC_Z1Mmg=u1ToWVeTs)@@X3`QS<oB}-KQUg-6n%vq(aabj+i09-x}6Y=FAb9cs*DFTOwmwO^^P4< zsfkmQZSkosTWd3v?-X@zh5>42rVWi^48{_r3|M6?u@9&&W_GM#0l8Q1f?%{9rb&p= zgi*fddK9+`RtCXy(#h<(7LJk1u)f6?cEWXNGL5`_l;KhK!cHPnir51xiw)2d&uYk}`e2Nyk-Br5SZA|9F$ zSirIBo6JrXn(sShFh3=;vxim=9l`%)CyPUS3{+b$9b7oH(@r}906fj1pAZ6Nb^@(d zJEd&~bq5%qMjLJ4Nf_dE-~|kMFu*kenAx&JzLG7-2z7{{LIWSNlQcET>rL6y0$7^} z(kS-2c!XB-2>~c3l7{ZUseC3!x-)%mD%LCwl(!!_G)=SpSZU_<@5~|M8*k4wayee7 zJOn|C5C%a?E{7{WfzORY7!A+Joeqailw@8@ghhva!F}NpjUEv77!2c13t;atyf<`* zcL(f@b2h+6wt>P>pcBpRO@Cx3V-|bep27(;?q-@4ygR?J?^UHergbCk7_MaA`epXK zqs$oqrH6tQ<}onG2`5Lon0I??5zIzQ2vy!`zjdugY2M;Zi6SNMkb0la5J<#0c)BMLA3I)zJX zDC(VjTnxQX`LtB+tdDM-`Y?RqY|wJ9LhRm6V_e~0ZStp>G6uW^dXz6@3m7Pa!Z{Zu zblN;bCL)L3P|?B@-TTTeA~%bgEP(rVzyW8>;EwY?sCGSuA}{ptzT|>#&hQ0 z$SX4t16VY8rvlCb_m1NpfTr+h6Zk5XrtZG*@>H`wIZP^KaeWoR(UzUQzE-7c_gN%T zesO0Fj|KXOGWo|B(W(tan%P;!HkZ{P$xM%`oJJIhR`R)n7dTveevQB#FoQ01iW9-8b@ z*AARmt8UFVojY(ovKat~@O1w0S>+0f3dHCfU@jAlp*jqKOkfZxdU)Ld5A)wb_;0c= z5pVDYh{%QaM-3M%F6@Tt1Jh&O=^XQ8Li%AEIInCwxQ_-do0Ngq)k$_V_Z%Ijs8gP0 HX|wSk1*9R@ literal 0 HcmV?d00001 diff --git a/.doctrees/CBOR.doctree b/.doctrees/CBOR.doctree new file mode 100644 index 0000000000000000000000000000000000000000..5abb83b749720fbdcc2f507202a888d92e1230e4 GIT binary patch literal 261650 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%0AZB(+Fef8rNt1lwC?-mK^i*ALx0ZO50(D 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 A5dZ)H literal 0 HcmV?d00001 diff --git a/.doctrees/CHANGELOG.doctree b/.doctrees/CHANGELOG.doctree new file mode 100644 index 0000000000000000000000000000000000000000..8e617a771ae2bd18433bac125e2638c1c067f081 GIT binary patch literal 211956 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

7zv zi$PYC{FdZbB!?~pxsK$ei$H!y(zXQTe3FMq?kBml3*=&w3Q3XV?n^-KBw2YW$Yms7 zBYBkMl4T%ENWM(+C6ae82e}rcQf;C)~!74>hdhx%p2#0hWRE9u2cOJ1 z;RH|QjVH3k6FK9FjKNc8@mtCkPvi=oB4x@GPh^QFa>NrEf;WV~@I-caA~!sd8J@@s zPh^EBa>5fC;fZ|kL^gOL7d(*(p2!1FWPvAgz!MqZ$^7?Z?t3!tJ(=^K%y&=bIz$EZwK6o-0fCi?3Cv(7)@$bplN4qf4JsI>N>r8}sgMN8ktl4$8k<53bVoutwhEj@1{N}{FjXGyg5i!6zj-a=I^ zTKYd&5-ojrGD@PQpJz$5boUgLL`%QGl4$7zQ&AEvJ-G=b(b7L+NwoAC(@+vE{WF$C zOMh}YN}{EAH}hLeo4!|B5-t5n{wZ4eH!O*kzHcTVCE?;{SZr{rKg>Yl4$9>SrRQh z{}hx&OJB#5Xz6dVBwBh0Rkdj8e_~0r^em&Lcd;Z|`j0G$mVWj$ltfE!rm7Y#{Wwda zrDLa~BwD(cCDGEesj5Xwe~cy3(r=xMl4$8Ku_Rjhe50j3mPAYci6zm}yD_Jgmi`J$ zqNUrZs+VI@_r1!JXz4Zl^A{waA`vb9980352dT70OD{57dOu5|rJrI+wDdeGZPC)# zya^@I(!XR$v~)97wP@)NvLsr1J5{x4=|@-+Ej^Q}TD0^bmPAW0rK%P!{dtx|OE06U z7A^e+mPAXp7%hDROQNO!oh8xIE2*GGOM5Jdmi|6VqNR63q9`r>1WTf&*HBf9mi_@t zqNNwMqa<4T7M4Uy{|if^r8^;Kl$Jigl4$9#vm{!2GbE4F(lwSuOE*zfi8A?Q>|yo828dlPY#yhC>+-*Wu@Z(K*|pNb zHQfdUgXwR|DqJ4st<^iR)$059@)J(jIIeVkZ99w^xSI;Ih>mi=UGZ#V2O9SAbn~%n msHgjJz_I1;CD*hRO;x^Chj!TNG})GyauwJ?57sK(ZT|;&C7dk) literal 0 HcmV?d00001 diff --git a/.doctrees/CPU_DATA_ANALYSIS.doctree b/.doctrees/CPU_DATA_ANALYSIS.doctree new file mode 100644 index 0000000000000000000000000000000000000000..d0ca05b1f2c3c3f3c1288c02de4c31f870772580 GIT binary patch literal 134759 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

Yw4{>W>CgvBg6#Yaumc! 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 IE-V%P4 literal 0 HcmV?d00001 diff --git a/.doctrees/DETECTORS.doctree b/.doctrees/DETECTORS.doctree new file mode 100644 index 0000000000000000000000000000000000000000..bf5aa191bcc5c0e51651e8265ab69eaa36f0363c GIT binary patch literal 5850 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 PwjQQ}Y)G2R`rZElxApdX literal 0 HcmV?d00001 diff --git a/.doctrees/FPGA.doctree b/.doctrees/FPGA.doctree new file mode 100644 index 0000000000000000000000000000000000000000..fd5570faca3f001f6b606214f38eef881ad39615 GIT binary patch literal 18321 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 Y@|DW1P#`EO(k{e)ia_lBe%h%0AAC9m4FCWD literal 0 HcmV?d00001 diff --git a/.doctrees/FPGA_DATA_ANALYSIS.doctree b/.doctrees/FPGA_DATA_ANALYSIS.doctree new file mode 100644 index 0000000000000000000000000000000000000000..36232d7ab510f48d9b151182cc902ece6d626daf GIT binary patch literal 21118 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 literal 0 HcmV?d00001 diff --git a/.doctrees/FPGA_DESIGN.doctree b/.doctrees/FPGA_DESIGN.doctree new file mode 100644 index 0000000000000000000000000000000000000000..455c091caa60114be6488ef27540ff69256eac54 GIT binary patch literal 7876 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 literal 0 HcmV?d00001 diff --git a/.doctrees/FPGA_LICENSE.doctree b/.doctrees/FPGA_LICENSE.doctree new file mode 100644 index 0000000000000000000000000000000000000000..0a9d5c28d4705a7cc285d3b5839907c267cb2853 GIT binary patch literal 44414 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 literal 0 HcmV?d00001 diff --git a/.doctrees/FPGA_NETWORK.doctree b/.doctrees/FPGA_NETWORK.doctree new file mode 100644 index 0000000000000000000000000000000000000000..1143c4d8c169adf22fcf2a08861295f729c61151 GIT binary patch literal 12724 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 literal 0 HcmV?d00001 diff --git a/.doctrees/FPGA_PCIE_DRIVER.doctree b/.doctrees/FPGA_PCIE_DRIVER.doctree new file mode 100644 index 0000000000000000000000000000000000000000..87921dc31a1cd8deffb7b5f46df9c2a0f439ec40 GIT binary patch literal 22530 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 K?bXWImj4IRsQM8A literal 0 HcmV?d00001 diff --git a/.doctrees/HARDWARE.doctree b/.doctrees/HARDWARE.doctree new file mode 100644 index 0000000000000000000000000000000000000000..3fdd994578f2f453a3147158b8a8ca5ac2ba3bce GIT binary patch literal 14348 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

r0qW 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 P6)yd;mv)G9X|w)+0d^#A literal 0 HcmV?d00001 diff --git a/.doctrees/JFJOCH_VIEWER.doctree b/.doctrees/JFJOCH_VIEWER.doctree new file mode 100644 index 0000000000000000000000000000000000000000..a9544ee72bb7301ddf0f891ec48900c49bd4bc6d GIT binary patch literal 7349 zcmc&(TW=h<6_zYZvQ~FHaSg{fcr{pwb<&2rsz79lRmzm$`?!>Ni?)qX+ zq&W#f?)bLYCk=+XKg$c1rVsuBvJN*bu662nG7SUC zpb6hoP~J?t0apr*c%F=SSUjEZvZQ(GaCbKqU6RSnwB|kP%H^Uwzd0_?nOD~L;&fLf z+!gEL{`$2n>UC3|kxA>&ORZmf>)MS=SDX*7UjFd%t#;_;@&!33&&r9c13PD62k)gk zk$pb-Xye$}SpQ7S^ShYUx|J1xF z_O51u-${9T!0w7vp^yD&m0=9yK@jgLrehW-B4SrI-ufZy`T@rDL?lwKg~vJv?Di++ zZtbPM7U?HKKL1QV*x^el^_N}Y$F;8ef zCr;HW(=yI_l3~NNAN9ysD0~3zL#*pri(HPuf_d>?6vW(vf=MdYI+-76)=lG(y$w;$ zQV|HQ1WR~Ntg<*Q`Ubpv>*n?Ki#N9+n#9V70=`h~)_X#*+Z!SY;sXkYJ1ZNPZ@zQm z7uPRuZDSiRuoC91i#fwM70i$D7?v*ImZY=AG%Gdbfr^#8ZHz;wkx(*Yrz2M?1xJv_c~&pZ9@;qu#{9{D2Z?K}9rgx|~fT>!1f@5^hT6L?at z!mDqAvIc}#%yDauIUXJ;or~eY8yIx4SPK)J-y9pBpnm|^Ty(uSOrwjGP{5YGD7{(Xd~U zcjU)M;`cX?gJ0ft-^p;h*RdKWwyS7_k{HJ&hMDCX9hm|LreiW~Q1;SC#S%H#f##`bNeR6P+xK-+7}P39f9&D60aqxaPXx zq?B%U9z$hBq!B3OpkRtYMRA{}yF8I8w%Ok1=^~G-FJ0`bD>g2Wyg18nd!_3$^Fv&a zYef8?R&Tud?lGn$$54fqZk!v?>|l;WeZ5Y1}NhSxWUSr>f@DT_LBiYwg=0u5yr9wvC1 zP2*TYRnhhLb2Gk<1gcQM!MeK;XqB&78sKeS$F4&aGU|mYlh8Rm$j!+vrUBoGzRvq* zo=PTB7CQS>D9P`e1*%^q4mg#_OJTwniWbytY>Pujp;J}quwFT!EZc3FIjY&D+6ly6 z0e2oVEy;uWb^>|m!O(lkyTiE3JaIwoKM+g#kJ7Yon#%`$0c$<4W;o}npr zeuo$^3&p&R4%O(hgB?SI%@WxF>?sKs1+WQs_JBvd3}FtBdw4&F60SLw3O7zY#}iaK z!7?a*!4Fd)oG#3SM|`gWgq$)9Jkzn$G?`Qa@~u#&(=Q``Syd zyas)G7O3ygEVbaukcnwdY)k zlD3N@s)#pu*}4#;ce4ab&<6wi6`-VnL!c*isd!rR!bu_um34;1>=A{vcoB?L;NQ&w z8OqWT!3WSl3KX#p&GRm#b{&B#SK#2=2Jx=ddbzCH0;@r{;Iup0$r-AyHO{e6 z_3f98`{v|ep91Hgvehvs3jRUB1G_#-kBBDi6a_Quj%AnuENXlr0nR-7kU(D`7V*`< zbK@-1YxJb(o5#0?Mg6E)z9MlsX(nEM?bRw3vCqYcDPP$6JIF!}6%HxmdT^=!vu)?E zbk5?w23wXJokBmdA4_)rhVJ@)G+r-_r+VRkj#~JL`9>_AnUe#y7hhkF^wZ8?u-uWV z{sSEuZAiBoZmX5_splT*lhjx|ugEXu7dtv*YAfc96~9GBe*FRCdLAR6i{PQ6LvB#GRE~fsX!`LJm8IAPhTkP(#s* zJ~z}@OV13t-7%vwq|TnFn5td&C(nkItZyt|`GXEgNqt$dKUN I%d<}Ve-M49?EnA( literal 0 HcmV?d00001 diff --git a/.doctrees/JFJOCH_WRITER.doctree b/.doctrees/JFJOCH_WRITER.doctree new file mode 100644 index 0000000000000000000000000000000000000000..deea57557e02dbae97fd71cae378c4083a073932 GIT binary patch literal 75095 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 ZSqS&AWfG1F1Lik6_%_Hh-OgO;{{j<>XB_|l literal 0 HcmV?d00001 diff --git a/.doctrees/LICENSE.doctree b/.doctrees/LICENSE.doctree new file mode 100644 index 0000000000000000000000000000000000000000..cd919bd4cc5268d8d8ed732153bc3ed0af2b55cb GIT binary patch literal 117769 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 KH%@vx=l^e2XbO@5 literal 0 HcmV?d00001 diff --git a/.doctrees/OPENAPI.doctree b/.doctrees/OPENAPI.doctree new file mode 100644 index 0000000000000000000000000000000000000000..a8996efc4cb5245bdd2ece990d3e13ac03588967 GIT binary patch literal 5645 zcmcIoTW=f371oWSNQsoC*lti;&L%}_y0u87NP)r+X@k^-6Tz|&8vzo**bH}voS}Ai zw!5=36~KUtB7gir9IYC4aucPD@&^RIHbV`2Op)H1QaVz z=~N#*Tlgx?q*x6J&Xg(JQZ2g_k}a#%T(*6+;_-l{`^k`~Hjy&o!$d+St-~^RV=Zsf z@kktF65ox0_}SN*n}oB$kT^#X9ch|GH6+`d@ z9l-IP=E!#T*)6Rqdkgxpw_&~S;rA|nxAD6J+1U?`%u8&C-Nm-uT#%M(!IWeik&sod z;{7L-T7_Y)=Ug(&rIK)uy4GP$!e_l)Mf=IYgAbqdqgdYQ8?k%ry1H=zpLC|h&#GFm z1+@VnxI7r!Q`o*DSB4%yW0eQyehXZ(#=MCPhAuGN(ZP(Re|2$*U3nBAU_U^yN)4zD8vZnZu;1JbY0zt#C$)GoZ5Tk56W z221_4bi@BtUD@KX<%mE=!qX05+~MKVrw4;i9z1z!@j%jOga`l^86oK81SGJkj>1RW zAvzfL+rJQzW_L^j=;YA5)^lowkvQfqwQ7o4B(@GGBOOh4GXp&9F)73N{$LQEguE}J z@c=s~2(yD4-QW&59dHYQ>4=PJzx`A|&R7!9vm~RrIjs|sSPleDVrqR6^6(2w3gO)^ z-S_kVpA{;A{7v=JG+NsiEbjhK);pIG0w4T{B8woCRijAFjAi((&(84n=c?%SC{o3n z@#7@osk(j1`!f;yPk?AMho~`FkJ+su`FJ~zo!~S-r+N(J>XDn;DnZ>0d3{|6!4rGNT3ukYsPOgGI^n`O%Rph%+ zq;#0t<+ls{E+WZfM4I>}z91>9HID@21pbMrj@UsG4;i5~^}YM1qCj~SMl`0;F*R`b zhk?Say*3yZO3WhGL!D|5QEONwu&q%feB5nF4YV&a*A^^MV6UizQ=3Z1~TctwPwE?PXQ=u;F ztGckTDr$XpS6!7631ZLWR~rd&47bT@{e~1sdgIyWB+{LPUG@zd z#Z1;esI{0%iBc5p(3UQUO@9NwLedZ1RIPqWyabIykwVm}NMxAEbf0bRt5)f6sO4HN zK?fpM<=P;9)V3D zB&{sIQXSoQ1&MD@M#H9#fceNwpdA%3(uo(J6-&C6P&75H(c8rNd;5NMX;W)Djv3)o~L)v`a|Bux7%PpaJnT!%Z_|z^-q9 zHWkJ+afOZa0;(%$8$?X)>P~|aN7~0c=138mm+kVH3_S`(aw(gItHA9xpiB(sFn$N} zPEKZz&?uU=`nvwYAxL7n_Ql<3ZZ58T9S;fRaBop9Cm zCN!-KdczQChwR!l)SG2NMZ>tC#W7PCr|O!fGy;Iqmej}fNLtY(78LP!7_h?m5m9p z`zQ(1Q}Y~S-dOT5a0>JYhX*5IAdd^%I#9&PaE^@os7Y`Z$(&I?r5vSzj6b9 zFpBQ=R9$mGb!1btx1NoMBOP~*)LZ$}53uTuvY2+NmT7Q|8+=o@)idK5sB-g8^h#~l z*J8vRG`2&vmc<`9Jh030H~?>wcGf8yq-{YBU{NAK181nFviQG=_Zim_Ng#Li7amkv z>O1qKJjjkOf;e6imfrhuQJv_|qM)1n5uxI&nohlTP&J88evfTBu|boqnM6Jh%%jxg z4_GeCr^S24$@nS{{_A-MpTX~(qZ74V(>#0S(l27K2|xKAjyqG-zhEKJ*D)%#o90G8 zsl7lMt0%MX-sCPwC%5sByb?P&bIw*=ya=Zwls>6luNrp++j^zlJftN!t)$L9o{Bm y_+)lq8QW{q>*cg@l64+9UgByu9_t6rwyV=m9;tP0rP{{TVlP2$^CC@#{r>`CbWv9T literal 0 HcmV?d00001 diff --git a/.doctrees/OPENAPI_SPECS.doctree b/.doctrees/OPENAPI_SPECS.doctree new file mode 100644 index 0000000000000000000000000000000000000000..2c353cb880b74328471935f11ea2d5e802e06e3c GIT binary patch literal 3144 zcmb7GTWcFf6t-hawroqblh~xhP8~{`gvL?}g z`~%)`Eh9|AX0F`M?>WnUeg4~l&RHZzBBI6P@BsYFf3Qg~?K9(D0Uf^nXk%OyIk&d&!*{oj=U#r2KOvj^71HzQF$;{`c{Jh{P=y37MDU+Az^7 z;oWCf2FP3f75^@{S2)!+RE^oR4B*k;r@~u$P}}9Y62PXpI1Iqnp4Nso7X{+OMQwR) zB7YhTIdW@FRAYa%SlPAfZe5whD-y)63|7!{$oKgp;BUD`upLexxSd%qrsX;Hre>I{ z-^Qz;Vhy5~%Jdbg0QFBKur68t$lWxGW;!Wa0?CyeE2hhmZ5e53;*S>GTFt`{r3D-G zExKN0RcHvLDgTX{QnmrNs+ln&8>8cGhsr8i*htCDuq^hj{gNgY^yXr8XC5Sz}qE-C9I&3Q0Am=YtUCc zsQTQo+fXc*%8-P;WeDdrx5jDG99wRiO$4HdmST0y)N-wu4ec1}dS_H+h$1)?qbVpI zq$6U%rC^`P5Ho_tAY*WO*Rf`F`2C?4_};sGNtjYn5l*u>VG0=trbfoQ%`);cQd)%+ z@Al_z=0xy+U9S{6HK2aFcll!OrP~S)0C<`sJ_#K1uA9(oZ0VRG+%eAAF#p^Q#UiO< z5;GKg3^f9nId<(xW+V8BaEQ1@18=(?wMLRD$z2n`S~s?7P8vKSss%v+iYlW?5V%=T z3Z#eBPf59EHkM?P1~hH4NiH=bvo8yXM25T-T9^W_nub zPMYQxoY@GJA%*RsF5E3{Os;<%3_#ZX{M>Mv^`#o4oOS|dVE{OZVJXsMkd9T*5AS{b zE#lczqi9ZipiISoS&K*I(ty`fruu@JQK19fU=ZddlywXpqJ(0@{n4u12Ov|@RA%D< zDMr1&a9jF3Gju|@81n>wfOk2O0rwj^rKqw$ElOG=P&bNmc_fL9XcgN1h-3aoNPJmr zh;k7^ygs!#RD^Y_*rBQ(Z~^qlNMs{mplS-&LzmEYIL9W^fZasWvJ%5Obm{?_bjV_q z?>Q{s4CC&??L^=@B`n2)L9iHxrdwFOU9EP&YBDMt+J#$U+1s#Ixz)0jpmu>ok;MYF zVMsYd3*2nOC?LzA*8(+hSfbvc)m@^Nix$X`Hfj!GGKL)u^p!v?zaQ{7e9T|+6YDyG zYR+?*8TNuV7yRW1%kPHoG4`?({>-}WY~~7C-AII83C2KvNeKm7^OZ)=Qc6B78OU@x zlt}}Ig7xMcvElAqlGv%W7LTr9l8;8K42HeinU_`FVBVp9MAC-lfZ-C!Bte+r1E$By zC+U@}*dgENc;xoCu6)YPxHtd$zB1 zRqxIk3{JqH4fPOk=OHh759G~|>oHHxe_${el9xQ@FUaxxs;`-qR@UY)gv7A&bY0(3 zzwfM%rhoeBnIq;uy(DAT3r8L9IAP=nndw<4veQ6>D*Gf`{bBZD*3ylH@5m@kY?0|B zSYf-K?<6A3?q+(CmMhPfonrqnDQx9MVYS_zc4ypUce9q;(9_COz8IU*%^TiG_$=UZ zE2C9d^!RNtBI*-!A7?o)GcgBcmANarVO6ZUNA*m>;ii7v_d=0vrai8kT&cwCr3#Xf zBu70*64%FUpG%2B{GJYZkpG%>(zyQUaeFHfeOi<1V~P)GDsz|I)7PflQ@Y*ViIOcD zb6a$SQTLrR9P|^O4kO#`f-l*+a+x@RDs`#d(hfWH^M!lJCY4VC=%}byX^hVJHe=6@@~sjDwY?! z-GGNF_dB5&r7{S1937s)iFi$c7)5bLl zhjGcyZ?t=!VreM7L5LwQRAL|!#*>8avZ&9b_km!_6-?s7Xb1iF0zMF(=H)1KJi`Q2 zkwINS7N{B{)7xcIDCLC%#u@aaJUjJy!iX^TMWN`h+b%fU0ZEMER~$*{^?Xo{mI2^yKk#6L z>KPD96ED-3{v|9KsDBsMIbA^A2n2gOsh>IkW(P`tQcpD>GWq@5Y5iN_`4Ey1;s*wO z`q~jA;h+CkfL+6D0J} zbEX~*_~e?2v&KHxTyypf;%uF@*?`BamAi@^Pq{3Nz-1_-WVPh(QI^&m{^)QV&K=0% zJ>u{jI21`zx$qWw^BcFWvUlFweEZ7HH{QEgcrzywGCZq{hT|lP;k5_c3z-A+hpUYR z9KGWHnsI{PdF%4+n^$j@d&$MZ5tD;=ghGx{k)zz9(!-Ar&(NPf`q_VmrCQ%VIh?*1 z4%GKANW2TscNlrH3@ZofyHqH9d!609ev5onv<;;zHxbf}eCL6h-XZY&d@w+iGH9bf z%l-0}9G+}3hbzu(qy~AiM-j*i5m>qJePDuobs_&n9M|{t^TXZO(t-E&4Bgi&xUW<~ z?~dprHFd_a-IMwuD{6jzc{qMn4&>)0;^#cMlpu0aq!Pjz2-b>1-yM$UCl2I!!|+T_28BnQb4*EJ5=TB)P-pHKTX}j!No2+PKeM%#;IqR?aAHz| zIwa{ia#8I(E6#YCqUXa!YJ%ahjJ=7lP-g6pP&O=IPNj;19AtGVbyD9yQA_v7N0*Lj zo~H`wzNBr)IqE3oPvn>=5vW{17M#X@#2seu_^^b&3X5d=y4_ zetmt7U07dV%}LRWNv+tq{Pg$B1$WscjNyb^d^<1Ka_SI|7dH-RnT7Efs30ftTO3!DMV zkgq5FC>&6}2p>a>O=vZ~qSd2lyPB83sQbPKN|k3AuE2Z`=Nwk|IfvS%uHAM;SUOOW z(TE3mCtR&jcv88Y=KXYitU)sm`->O=Q+iBvn_BNwZ9$let5Bt;+vwBIig#?I3 z8G4NXi+r_fM`7O^bm{)A%CcGe&W-nOvv!+OOmuoep6s&MtLf6-_18eDw2fgK8hTXo zn3k^a{cN~|J;P=ELuFoR5Y&My3}P%jSk6Oan-tL|Nyl=8Vy*`H{fR;unTteW?BJ$x z%40{i^r8}@jUgXd$myd5=DdhjqdPVrsC%gMoq3{qUuJ^#r|Bgg%~OGgwRVc8th=V4 zR0$6y5;k-IEfjwP!hmVYPOAt-Uv}+?ZkB6=gU^&SH>DQ=DQfvzRfBiF9LXEKdba4* zp?kejwWIqX|52ajLRScWF~M^2R30$qXL=9hIO#jE}h_iWFEy z(mu-cR5#OeISUr(Zec;Q_ypwfwV)!~qNXv;f|Y6Toa|=$cpt}vkrHE*_w)j_$r0wQ z5v7IMJ-sN=sg5l>3aI%map1H0i139OvB+OqW#bz3iVa04dsELRf|3Wz7uy2rd`vf8 z?pL4FdPR&pXi;&M%5u@Po_0hp9e~{84o^b3Rjfc-5n!Z&>#zlhMErRnbY_{>CRV}y zr>ft6rH$e+)6Y##TBaLdxjb}yk>Cc1Ra<3xDcAhiDbwbZOrP2}v+s!EE-Xne=I7Qt zl)ImsoY=QnFOv+woY3b8 zkw!eH1cW=I7kR28s~*yid4Su3gXGPsAPL2q0aLM{jHUyZ%!mOy-F`h3OOZN}g}{nc z%VLD4varT?8kE?|+V-TELw3n>Jju~`h9KllvGG`GDlofw2qV$RHg<=(g<_dSxukjj zI7z=i1kT6UrU>aY2Uk9acOP6;{&{UmuaLa~IpF|6^u54S+4beKdNCHURW*xAn0XrM zaqv#2p`R}Mx)_$7Jbf^a1DQTSD-8o!X`$@I^(b7&EXLa}u3vyY7n8od?|2%ikN;+Q zJVgwGEFw+E6RK}$z#(+$sR8EOP`n2#a+I50o7Ja)$-t_Nvl76{Q<^=!EO$c%Pw9FC z*T*05`#7Z@nVy#cT2a;yQdqTwqMk6{`KN`no)@Y;WxIG|v61iR_698*6=L^R8fSav z^~^kp6>eY;=!tAE>;nUZUpP*VLZ-ca%glQQXmQ6FBfWWTWq?e8R}xt8E;w+7P@r+b z#;Pq#1l;qjBK8`tSBjT9VAb#EK5b7Q72!5+@aX_efLb{Qs^;AU(jK3jLl;tI_tKu8 z&HWDy9@zEp&H`&vmg31kz@H(gtUwH4QQ^H1F#yew-2X4(A83F@>8AtIT-xjW1O9%SOaK4? literal 0 HcmV?d00001 diff --git a/.doctrees/REPOSITORIES.doctree b/.doctrees/REPOSITORIES.doctree new file mode 100644 index 0000000000000000000000000000000000000000..df5fbb6c12d6ef224c8734ac088a02f71f777c3a GIT binary patch literal 15473 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 literal 0 HcmV?d00001 diff --git a/.doctrees/SOFTWARE.doctree b/.doctrees/SOFTWARE.doctree new file mode 100644 index 0000000000000000000000000000000000000000..70ab166850280e43b57fb3a0ec6fb1db0ab23609 GIT binary patch literal 18937 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 literal 0 HcmV?d00001 diff --git a/.doctrees/SOFTWARE_INTEGRATION.doctree b/.doctrees/SOFTWARE_INTEGRATION.doctree new file mode 100644 index 0000000000000000000000000000000000000000..1caad7a25ee9b63c7d085d9fc3fc6c586287309d GIT binary patch literal 9353 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 DvPDG6 literal 0 HcmV?d00001 diff --git a/.doctrees/TESTS.doctree b/.doctrees/TESTS.doctree new file mode 100644 index 0000000000000000000000000000000000000000..f4c55c8e88dab153232c9b810e5d0b15df1952c8 GIT binary patch literal 6224 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 HwBP*?&N>F* literal 0 HcmV?d00001 diff --git a/.doctrees/VERSIONING.doctree b/.doctrees/VERSIONING.doctree new file mode 100644 index 0000000000000000000000000000000000000000..fd7f07b610151baae1e9985c174ad4b69fcf1ecf GIT binary patch literal 5132 zcmdT|TW=h<6_zZoq+Lm?i!Tje%buV}li`NA{}sMxJycN zE6K4|1q`$(0@wgwicFvT6Z#YKl0Vdc(C^G`FOsbIB}fD;G(#Se=klF%KF;4;|DL}( zSNz#^oeCL`dMpUyB;Y!?%R%C25syv&W&XiG@|XD?+g9vYCz!HdruDb4j%WSAQv~ps<u$}s|RX{ORdbLW^l0UyA4jCdiOeE;d5!zT8*SNi(8{WgxOA_l|z zWVqNq5Vt5O;x-~7-bKuRh~Inoy^r4q@Ur-c*oAi?Dt4y)wc=%A$c-CHJqGF|(%LlR zO2eZGhn7GTy%N`=Wp6)8c}za>lXxJ9nPLQ8N5+P$0peJD=R&!$X^-E|v{q%>hb0u= z?28BRMZMs+6?Puh#+)+FdHCSTGXOvV$)%o>VKb8T1TA48X3-v;|mrKxdv46UVFev2K1&l{zsWMj>jG5 z`$?3tSn|N}PUUHt+zEBPuo3Q9Di~U{@7S69rzzUvRkdlI;i8H8LR0;H;Ma=Tu7eqxta zu}f~ZXJ%%$5dX8?a?`N__0pTu6EiFA1{nb0X#xL)L@e!Ehz6daUc%i0-Y?-kWv?ji zCn|6QjshIu7&HO6WwE5Ecxua_MuS+iU6z@|9S_+{5?EUcvM6;MJi@ERKtXEJUTDMh zVx&Mig?>DgYMup&JBkQR8|de_MYxkI3yAo}eId0h@w)B?QZp|kLx@CU;ZmI^$hlP* zqmda!(qV3`5_5^U71yon^n^peREd2fFtl5Mc(35%*}U%0+f7O~z$P97g`te3$v@e6 z-*!`;x=0Z;z}PPwwn`%&h>S~lVc!wPr21aJk73B1gYS0%Z3UOH5Fb^pd7?JNU z+id_ca+}O-3~-ApWd7Q2=#$u>UJ5xBA$|bw4ju4m`()+ghsIr#p02cNOuIY(!9Ys&KS>j!-) zIi>tz567LU>hCa-Q8)(ma=S<^46c2NPc1Z9K8vr#SK78|z?`H2#miiL{aTB6@&7Ba zs_j~X0IV-oulW*5M)7M#s0!9{Wt=BRN;yOy=@fZM*np}Ky*e}4NVlhUY}cn2i?*ir zM>hiiQJ${N?p4izRG>x|0HaQ{;^Qk0kO>>mqL&^L@G$-*jQ=8khI#|GkIIElP#P&# u9@v!Xso|AoxWN1hn0lB6l$Aq*dncf7QWaj}Nw!mDjt(>Ml$Uwt_5Kf##+zIK literal 0 HcmV?d00001 diff --git a/.doctrees/WEB_FRONTEND.doctree b/.doctrees/WEB_FRONTEND.doctree new file mode 100644 index 0000000000000000000000000000000000000000..f5dce32d8d4ce77501ca4825101d9c61c20ab0dd GIT binary patch literal 4959 zcmc&&TW=h<71qVO((1CZ-a~(xawX`atxm&=Dh;b1sn&w~T zuIr~8E_AQbU(qx&T&9gWYq2(4`7+;Q9oI742s$(5Hol<4V5DSfXd35!9;V$mq!YjY zh0$;F@;vQ~V0V+VZPy8#PpA0_kCBS!=ZLoW6*$#oS0~lniNXBLjGMQZ^;5wksEYC6; z2dCVy;DD0I><@|df*I2VBdG$bsoEbY4pWM=fKD>%pCj4}9#$3(7}0@Y6w`%}r#u}8 zGV|`zAC|_y<9@sYRQ`pL`rb%vcfj88E@VH2-`Ja=#?SD33%_^pdlx=oKWF>!#S+_P z_vdW8KD0tm6AG@UM4n}0$B%^E&}7E=B~e+g6(9>{dW$5#2U^~tV|()$6j-zgQs|3^xth-J~|DK{MW|5C!2 z$eQ!?{=cm^HP%0`XRMXVSpT@Hv1*0NSoDP{)V0e@nY+dJihTN;nT%1_s%b*}eN#wK znNAfqDBA%~gTu3oK8Y013~CK35iCy76a<>m;H$d4_rD5au8Mql)+^|>$L_cf{)Z*= zsU`n4Ye`hq6=W$mP|T!t*J(~rlX^xnUFtuxOT9d={u@^6R8A>QfQo*{tarMwnUZ6ajk3vV8Hv!!A1}DIdJc{8YCXtB*R6_a z*feY#wWMs^+^VKUB|=BK-L#kubl3hP5f&X=)1$VfHJLT}fNc$2XG~Kc#Hh=7iBYc+ z=t+i`btR?2QR#?JK>2>|*2^QHQ%H|7VXb<#O5knN$SCwppdZCiT4(^&S?+d5SSFQ* z&I~?xo4)l$_6#Rz#*+NG>uPkKSs2O0H`E#n-Yq3m&_WXWo-V8#QS4VKRGsO-Z77;a zg+7L!P?&SctuZ2+*OuF+6K+D^l2~0&YPnWShjxtZx~D{?$by)mC`lmcz#S3wko@_0 z3Y&#!5oL^7x$9Un+W+;w=6Jq0KNwP_qzV~9Z%I`S8UR~la<^4lerArT&5Yu}q6xS;HAdJN#6W-yTerrd1`l8!A(HY^_FeF;|-cMAzesyK{k zhPD{naL{Jp+EGy>yhV6i6N0r}mslgismLwy7%Rs%$-;(`Fl-^-&>{b|aO@_h)@s$jUD|M(K>^1;KqfINS z6vj5IY2k>A@)mQ)KVcKx2YjOj-}u#HxO^RVx#sopqTBZI2Iiz=5K-`ioBXqz@3?M8 zvk*~2(eg%x!8W|a-#bDd8t!#wOr}5V_aWB3?94Ek_M{pkqHg<{#Q`ugM28Lc7`S5< z^8L5o|0V3%Rio&_@?J7s{_T2s1TXQFJ*KM1sTmb}AR+XbNdz|Q7&1f@#fIgNSKTf+ znS@PnHUPrnj+URhoBAv@$d!zbnZOVHy&0lRvjZw_4^O1U$IQ)3SVrhNv+`K0{gA1`Ke~;2QvV7W=!h zzhrOWVjM@(re@zip_%NspIn?;G+uLG3f$7KKB!Bye=KV#yLr(MSj44N`O%)UR@>`natj%{eS*)Rb5h4yB| z5oF$fjl^fcdS2=0SxGq$-bXkkLn#_k6;ofkAZ%uL=2q;~yB112bL*p^fq+O)w=b?$ zji9eUjxGr1i_v<7&l!j*U_g~#dEki$`L_W7O@4rUgHJ8UT=>SL{f*8Occ)3!bK>`duk)wqjdt2IJ@4u23V-NrU literal 0 HcmV?d00001 diff --git a/.doctrees/environment.pickle b/.doctrees/environment.pickle new file mode 100644 index 0000000000000000000000000000000000000000..f0c4e594ba6f3382f1b542361ef3450fbbbf30d5 GIT binary patch literal 442916 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 literal 0 HcmV?d00001 diff --git a/.doctrees/index.doctree b/.doctrees/index.doctree new file mode 100644 index 0000000000000000000000000000000000000000..2f2a0b0142aa9df6ee609f6051d851ce5489c33a GIT binary patch literal 5370 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 CkMn2% literal 0 HcmV?d00001 diff --git a/.doctrees/python_client/README.doctree b/.doctrees/python_client/README.doctree new file mode 100644 index 0000000000000000000000000000000000000000..bb2afcf8ca90fc742961d99ba9be7fff1631b57b GIT binary patch literal 153780 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 TJhDF|GmF>gO$g8R#zy`(LcwkN literal 0 HcmV?d00001 diff --git a/.doctrees/python_client/docs/AzimIntSettings.doctree b/.doctrees/python_client/docs/AzimIntSettings.doctree new file mode 100644 index 0000000000000000000000000000000000000000..21924011eb42ed3b0ccb7c8ba7a8998ee899293c GIT binary patch literal 14266 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 literal 0 HcmV?d00001 diff --git a/.doctrees/python_client/docs/BrokerStatus.doctree b/.doctrees/python_client/docs/BrokerStatus.doctree new file mode 100644 index 0000000000000000000000000000000000000000..41549241cfc9194023b1177dd7e3cc5014a77db7 GIT binary patch literal 14505 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 O6}t%%n&)ZK-Tp5>kSM_b literal 0 HcmV?d00001 diff --git a/.doctrees/python_client/docs/DarkMaskSettings.doctree b/.doctrees/python_client/docs/DarkMaskSettings.doctree new file mode 100644 index 0000000000000000000000000000000000000000..1887b9fe692d07b70bfc52c7e7768a3dd74ac191 GIT binary patch literal 13949 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 YZj=ExOR{K{M_y>h_^|6n64y8X2MIMBc>n+a literal 0 HcmV?d00001 diff --git a/.doctrees/python_client/docs/DatasetSettings.doctree b/.doctrees/python_client/docs/DatasetSettings.doctree new file mode 100644 index 0000000000000000000000000000000000000000..32ee748e1735c6d89eb4ee305e449ce5255e0ef0 GIT binary patch literal 59657 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 literal 0 HcmV?d00001 diff --git a/.doctrees/python_client/docs/DatasetSettingsXrayFluorescenceSpectrum.doctree b/.doctrees/python_client/docs/DatasetSettingsXrayFluorescenceSpectrum.doctree new file mode 100644 index 0000000000000000000000000000000000000000..208fa598479971ec9564c1926788e1c0b6866081 GIT binary patch literal 10590 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 U2;7up$)@tW#7ny*xwO6cUzc17Q~&?~ literal 0 HcmV?d00001 diff --git a/.doctrees/python_client/docs/DefaultApi.doctree b/.doctrees/python_client/docs/DefaultApi.doctree new file mode 100644 index 0000000000000000000000000000000000000000..6ba9caf58e82b5c80f0959ad76312a4e26fcd413 GIT binary patch literal 840171 zcmeEv37i~Noqr%9f#D_xM<7%Zfyv0sK)53yAqgQsAd(;`;Lw?=N%zpx-FElnK)e?f z7)5lv?^So*^}dhwzFl2i&sFi(^}-WZ*Iixx|9(~P_j^^ZUcIBbd%!=#XK|V8_j~Vm ze(P7Se(zULI^cQx&D(Dt{xf}et5L4h_70WC#%lGkur)J%;8=ZhYBH>~XP!H==E*aU zpXr}Is9D<6s!ugX!yWOnpoN9yEDCYdiSPMj& zUNl-QwOViy{`-JhX)^w=1IMNs@{gUR(VLs$IF6Z`Ueqq_!k=c!hnH7ezF+x->5GQ< z)SEZA8l};2cyjOXWmC0XBpj{6J%I$Vz-SBX=K3b}l>#g>> zv(}!mb|BJde|g#TvAL8pLY1)mFfLy{;mYy~&=xRpU^v+*ms*upl82?*mB@4lfr>(~ z2sjQoQ~7{t6V0-`UnO4;Px4hNp9rQauLMt74ga15|DFQ>t^w06gvFhAqcuNRv-wy;_`W5+VMEdDNG+glObM| z!_rt*;De^;H|u*c*CU7l1ZeKd{8SzyF{c-94I%m<#t>kZ@t@MgX53sXw(s)t-D!oI zJ?Jj5z;v3R{A^-PxPfH#kV|*$*aorv*r~7uxE3>u6wL#7 zi1I>dpg$%Jgb3AYH|w=siP@(!Q$SRuuJLRW`$6K7oY3rbe+7tIB=Gr<09DKwsQr&E z1$z6Z7er!DFPPj1!4f9#1{kV;0HWWy8W)nDaD1#jS*p}#rsu;wdnUTlE;V4Skf9$OiMzmh7BZcNdHwn-M@B>NiS%)~O#S~O?4w^6N(R@yVqK#6{vP|q(> zGDvH3;hWIv=dLP10z|8yqzMc@d&I!NwyU=97#IkKV~I8XG;yBd0TY;uQd~?gzzGQG z;yn#>(hY1}-O-!oUbxbWk~Q8#7=xe-bSxRsvxMV5!v$gXY93IJ*-vl0Kd+ z1aSbzi6?jnE%0&TaTyu|L>@CRuz6FAkdapolk4i7>tj5#&bj8pM1+*le@o~2SB22s zd1%Q9D31i7RJfFD&`5ejG{-su%7>XNyGIpL?kStYc7O_U*DB!xl#ND4$cXFqEHbY^HlQkq4Fr1+aO z*|EyR_FyASqt*Mbg8W0lNqE6iHDpMUa&Aaj+1?1xXL|5SoJhfDDZpNw;0& zilke4W-XG!M1%?R@xP_>>`(~ZorjjRBPoq^N7BofE4xP(QtpWx1YU-EJSA;e$4O02 zG0(2Z*<^}Nr0gkjUMO?Wu~PHqk;zi)W@8eX8fC@KB_az=QR%?*rK~EQf9FpF=&Aov z+U?cK)b*91p1}#P7<`81VC0 zH4|kg(>d6G@YFg7Go+&5Q3&1Lhn9>0^e9e6C7aSmX{bAbeudexJ5?d|o`bn)D{Qyn z>Ae+<*PHMN-@I9Uj>oq(@Q!A53SQoX0ip*XYhik+mA|r#u88|*rszZ~vyZrt*yKL; zv%ieMr~-(KNfYk2q_;&UPM&W{SF_kb(`XSFf0T9`RHn9v%)tV2ktqdn@scm%u4V@8 zZqQrAMa2|BTvEu1LJ}9mJ>ElVf`nr;G-kw2XRPd+ItMH9)LO*NPg%Fmm$r)Pa$-79$GR2UAg1R zTuKL}k?xrLQ|8L%1Y8rea^+ME{hDg~KFG#0TX8qxA@)1nYiEOiumyprq zr>caPFvuS-F;~(gs_R%!I+xDGKFy-TOZ-imY`rqE*<|>J>QI4~$dZDWc*z$p&tV4a z9?(;~M7SS>}giop*hi1##ym*nb=oV=yV?baaNel!%Y(bg691!E%;ewdb0%)L=O`nii{~B zikEyr^droG-66UOqIs$*f}^C84+vRYaP)m1a#N_kJ40i@(dFv?YQoucj`mlcT<2(p z)N|nhKB-gEg=onLN|*2sYm!mvsWjLfP5;ai*;B)T~GI_p&z2hOts z`Z|r3F7RDtVY3ThE^>r`Vq{r?V!Y%F#b0Fx>>kxkD0b3Qk=&N_^F<+;3od`&LkR>L zpUu!1aJfHG=pPq|COs63Mn!DsoOAKQbiSG{^fMj+I8GsTcQ0Brg6V)$-8{CXM-!nt zWFNsy+Fh`a_RrhE#aS^JiT7No69U1WO1m74Pr(^c#T*dT9n2s#^Dvgv74FYvicU1s zQ@G!l1NXZO2Mdx;gzv+wuzs`-)`3tLEjw9fIw&{J1cuK2U7E3?EMSkRBL!q5YYJrJ zC11!MVFv78(M`zC)lCtYCY@X_gmHoC>pTP}ptvSOV}R-7)h&pmr|O*TWjwpi*$jIS zuTcoyorsopQq)ZmBqg2vrx3;kNq^uWI0gB4Gc;x-O>aabJyqvy zrz|ohxrUvHA%)Q0iD*eTB&E^rNcs@w%v(D05FosSLH>A&kD!{3fIC=ExUuz|!L~ucX+~bWU~^&#gt% z{0>-;R0!Q2h?b1dbg_J*mwZY$rLpdKdIj@k_p3q*j$b!1v%zH8E@AV)NV^bvxxY)P z_ArmG$k}F!PNcdYkQ4G0!?QXgCk!isoR|e^^3RvEwscOdK>(UZkDU0cG~R2K$?cAR zv_MW|OF>S&zvGxhkj2Xbax;hN^dyGI~WLZIByyT0*Cou!|Xz3;jJL#ziCX;?v3c*}3d4-1(2r`yu zXbhN)b+D-(gxGRa7aBU}9Oacf5qd%)bayUVGD7H;iQG1aYw6HL>5kVoF_(4^ETsIw zE9#}OU}vRPYVH#SSlDKZOb}eMZS(qoAu6%}1hOZU)WDrAk84)^45sKr13g9c@#KDj z-U&w9mGN;b#`1@DqO{_BKkqtNc+kbs+gQ!IIP#ks9K@YK`o?<|7VHsutbluDUV(eO z4I70)Nc9^lu_}NB^HQt9FMhWQK=E=)YsjC6~BkzZZ>^e(Ax!`TS8# z(TVguMgB7-@>`qM(f})tA1-j52z1_mKI=y3{n{A-l{43+c{V5$+N0t)0lvtJ0={_3 z7ktlS2JF`ECirG_QUqg37iS3}TrhU6hrkrv!xFbS7mYa+2cSt(7N$-#u0Q5kG(A|A#$p}DYUvJ5#^idk>j-r3bsLIS3e3fg$ zOT8!NqbMe$jG@+XQpz=6szd}mnJMg{lkY@5MbNb}ziiek#u5ebyA?GL6WOI0ufxl2 ztQZ|$>LviBR4+@*T&qlH_9eu~;{`?{BML_1C0~r($_&^I-A#;CRZ;{UNfld!3@+$+ ziHE%8*c&o526SAkW|rVgI!C&bC)GKU0T-X65W2ezEg9kBA)HtugVG~ukUJtigBh~B zP%)JvB3^yf7RV>ZE42!KZmSik6hdpU?l&pT+nG1l-0>|;(TOy(iF~G=Q$#ZO-3$3( zyv||2$%@fAY%-o{0tNZ-vb433B*$hY)RV@3#bP;f^(mC|L7R|wr*hL$uU9}RLxzN45S zy9*Uk>9T7YReT4P1AciwOO;)~9J=D)I;QAErk>*8Wis@feHW}chX^6Dy&B`+NKv*HL6B$&n6EFE=Xi!}@*fmJcUPh%BTPMpvq_a%>9s`Q zj;}9e=Im}(NY%$&QE9;kU3Zr%)zVJr@=7?u>1F-^Dc7f%OIM8jI8$^Y*ZqaDkhJ8! zsaLG;lzZj{HKmctj{L7!c{*3OO=iH@bbk7KWf^;5oG36B8B{P9FZp8Zz082!NoE6M zi{`4NmY)cDTrl=W9plI&z(u_}37O?w$ARrW3Qy>&C`9kOvGhp|MZbE3TZi?inq?5-A zVO;RD<{>x*_01U?1Ab;2|0Nwx=WK81*>%olNKoIW5V|`NEg6BQZ2XtvR5~k-c1O;) zFlTn}Dx~D-Ejb>o3L4G&XxM52T<8z{JB*Z)-ot#mqU+b0q7zB)7j!iyt4SD!fyK}j z^CHa|to;u+WeZw_pqcW}6@QmzJV;r<9vCYHx*}@|y5c2Ybp5M`SM(fRQ8z`(xqAqEw1s}zV3W!W~NvTm* z1f|lL6qU}Sr&(3Hd?9}tu$=x!X}9MpQ`>!hl>km;N&!y1GNoWK zUh>7_#ms=+4SI{kMKf4Z$l*c~7c4%+LuvwxgEBN`EKX;z?3y|(egsdg#p3+*^*V*n z-F;|D2P~$c?pS;!vt@UxLh4;3>H^#W*MmZ$>OPjk6;*dLMJJN?6jd*k)dTF5@ex$F zG?yy%t-0>8qIMv=iY^9T$(qx}fMqT~TEhrw(0^1GvB%3p1l%Hf3f$r)U$}i4Ghp|R zZo;iWJ4Nze(#ng3I4+p`d=JqH6rP)*F<|ZrwQhhNFSj`V9-d$4bcQ7O2MVFPBhiu( z@E*-&0}8LwWof)S`hJ~xv-?;fMPJ-eCY&nb@5WS8SM!fdCu(M^V4eRwrszah_Y+>b zrNYiV0&*}SCn+9a&FMnNGFLucr_yYQyIi2BPe^nuLcO+WU6|ZT$J6`W(-t0bB zNYQ~UTaNNEh)MfEiM7vUu47Y}HHuh!2UBz+XHT&4c{b?NatSa~|nw@n7NH4Twg{TF2!vsDprPZofS3@U(&mwW;Dt;~SkNxBKRCiN7_ zkV!3X6!N$r?mv6TPC)RF85#rPW-4nH=hHdfuXzET;~7%qKPZImu0%^lkSi-|Rc58v z5`jDB{(_mayICPsug3l0M+1gzeFQf-3|jTko8fXRY`3A5fs1UN#!6|AKFT-CUBVQd zNPB-FuPMz{e8OqpH!sw465R_~dAb0wO=dvebgH{aS;ihNrwHUl1{LJROTNhaFlNB+ zB(s6MMRQ$J%Q-?G7vw$DLw16L(=#+?nYYIc7TN&Hk#q?O1Q@* z$xRHk=D4&AkX=RR@1JJP>HOU?S7Jv&vzj#M7nDWJ2E_!oU%)J~r@$;;@`c$?Favh~ z=qAh>^j9RmC9Ql!h~t8?AM_BNLjPYfGzOH->;R`-LFaVy7pIdcrE)C)`v-jrp}Ql| zk`c(t9bko5>9RE59b@M)Z+0Imr0C^|>{b9mCaX1$k zSQuIqVKH~o)Z|{xn)5(dnkye+afCGJqm)JLfw4v)EV8E{EMD?O*sGWUyMN3A!lHJH zAS`L+av_cj!d~hjItBiw42>CKwRx=YS)J28ljqktogs~#Q3%}~iI#LlSQ_t+uy-(T zb{{LG=;etlHWy({V`Mt^XJzOEs zx%0PJH#&FL&H%`nxh~D~LuEp{n-2)QL{=2M#7n+-`3+{kZtZU3Wkx4OP?B`hU<%$ZWM~X13Efq@SaA_Q>(%Nsm|rm%ighQYVFUJhRTZ z3~!@erx3b34=owNC44MfTgn-&oFPU z2>D5-=tP>HA|$4b`0Uj;oyk(?)e>X`cU9CbT>BsR9j= z6$K6Pk}n$mk{PgDyPIg3(Mb^`BwhSW2;qW+KlTuqg7t?P8UqqS+6eoNm^CKMu5+e` zE;Xf%1{7SY5V|`JEg7L8H04inD4mi<*}J zW5(?6RY=Q6Z9s?+--L=$gMd``la%G#%$X~Iev>IWk)@{qdW8z0u{lR~!Z%xYh3)K7 z)ug$_S6yka6-bvGh;{zGV3{dTu+9d6Y8)d?d$6*QJsO4ts3MCBsNyAGP~DFiuzN~3 zLDi_ABEU*|`9IhB=r)7(A}A6 z$p~7HRiHIuJ?2(AE>XDS>-o%`-O~tP{gjOfYs4%Rj<#B*T_JpNHP~?RRaXb__0`Ez z{AL$oGio_t94O`7#az2$?-)~bBIo^qy%UXamoxU#;6m6-#5(tX7VA&v{yN-9&6b0` zJVu)KdCEfea2XcZi!3VGi?OTCT?piYy?^H+Ji)<}Gc-l9 z7sb^%-)DFQo%0#6_umylcW0s{4cHrTD;<|8+_CqQ%$?oS3Mu<+#9n&c9z!c&?`7LI zZ5G%IEncD~gwO$|KA9`bB6{mm26rJeg{=jK!B;b@I)8IllO~krTIp%2J z962>x4o>qJY1$K&h3uhqn!ssfQNd}v&hBZ&l&!_-=v&pA961B% z$$?VN$1&Hg*t?f0I+1gBu@|<&o9z+Wa{Z4{ z)BcmPkUd;Z7ubs|D%gvce6jZx%z)ifdWXG=eu`i(>E$ItAQ$X?p@;AU2hYpU_+xJ* zZtniXw|NDf^BHpFA1Q?H&O}RUu{Xi3bX=lv$KG!;cXm%JrfkIC?T8{S`xC~2QqBX8 zNoQeZo#HvG{h6W@IeUt|nU`x|;@py~=xJj_yoHkkt(cpBts@C_czY`AOy}~(nE-2Z zf0t%FLs`IVMm$}$R^TkMrr<1I^2OOT%z)i1x{0&7x+#LOq?40`FfJIo%0qAp`x7%X z28@+oJV<(~p;T)Z&#rSe1HRT2LU$*kB_n)=FCOSPmCj0|-LZ9yIkS6LAtguOw2osK zixt{s*!!Kt9pD%jxMIONPD*(f^BkMOtW8ALX{P8z%2`6z##E~eWeXDb@-o`YKv!hV z5bBWiU92;mvkP?4&m@sG`@1yb2b2ZOW<+E?Lm(@%rXVX`@!nh#o8$1N3p#P@~jR&&Eq8gC(w>-Pf*$l|~M}^SciD=0*vZgte&Pt=*k@Z*1 znccezDOsuUicvM@KZ<9FLemf_+p)*`W~$4Wq7&JAil8+}Smr-{>AOiqXAa@ zJY1Pkhnp9%Zgj4!odGPBxh~DKS((u8;%5q+L{=1>#7n+7c>yzEw{|yiGNY3s_(-}q zPYB_Hk7s)bOrd*5hQ@%8P!`K&UF?E7XL=mZs&gh|IoDGZQg^qZMI&T{(^S&w6KA4n zkUJpmWrpl-R7k7+^6Lfi5J0Im7DON1DvdsNs?vhb8`NtAkM0CA8eh#)#1=8D6_d|b zGDRnH_Y^Eo1F&p_V1Ux@q^GhnxIHz88dND+V}O?*sF^Xmq~mBQ@gVc>ijMa)kx_2|Lt_b@Mrszbvo+2!M zq>!<%3g6P+S*htOUUj3axVl6~rGwP(u&Q+4oj(njPyeH|+kYxk+x`C>0i?*30;G7! z7fA162JCLoO(4}PrU-_TLjFTY;)0=H@sOHA`->SG1BS|v6f!P>0}p`%>m2OZ<)%#4 z0H1+E=9M-}nbVLeH-xxGNv%xsDu@5er zs_hzYmZm1^qvZe}@>?PN4*+Ykv?l=Fmzw)Tf$LDP5kI(%ZC2o;+q)}c;aE^=1^s8N z9o$)IuL;Jh^%8viFeWKAo27k2!H#mJMfI^`^{`btdG#6RJ**wHo26Q7vI3_WYH?K- z>?Q=Io%N}9aNS^OZ>4o=P_I?@1-nbtsSy5X)dL*d!dG9_3J}8D@LilJ-7eiynVf2u zOI4Vx9qs}VVX`4gynpe45c>yDdeN*1Ej@5O`;+V4?LwyL!~=VJcRO3XyY14Qqf6bR zV1)Iqc7#fy1DrCeM|VflPXTwc><`jLb!AFB6rC&XWXOziC&Np=ce0Qfu$#P_ce1Qf zirmFW86_cw%U$d-9ugDGUZ0^c+{Kpifw<)DLFZ7f=4o{fWw?X=vqI?ZHne1P2Rkf% z2TSZp(=hkD*DIMNyCW4+>nb~p6XLrJl`;5P=G+x0Kg|@K$l6n!#Fuu>ur*a}kF-Wh zIS&BJ04qu!t`O*a`aaf;&Zo6A07ho6OY{7XGNIkq&l3=dtSAtPmwX}e*UW(3+TDc6 zj82LmB_Ogi`Y8YKq=S+jg7fkWbR0!RjhL(%~5_;Jr zIh0OGqulXvfH|^zQ8A@r>FxMbwHlx{gP3nZ#3kAvr99U#cdi(CHB)pVPfsy$05A~V z!@-G$M!lu!wjh7AB43{ztMk)aSs6OeQ;7lZl9!|vo~le^_u6#=>W~2i>hO{;)a_#i z>_+V-)FstX1m#E#Q-XgNlxup(NV&=^qeaQVV5@*bVzyqhP~Igasd+Xod=cW0qR zBZylRU@=)U*`%F*cL%q3FfVq$DWuE8wnt|Q)OTv?Wf@A}WsY0{?OROIi3~jjH2eY~ z7^_`rwJW2okx?kf+8J+l=r?%t$65jJxO`fjA1^$?bfdOS27qW9BCUF;vW(s5A0_}2 z8B_ogFZlxGd}hGzB;5o^lX{8(CaLAG!s%TA^UnnW|d z=m6C42z{wS=v*lSZ!5&R|9+%9Bt!QZEO$WNf~ z)C`RQe^>LyrF6z&#Tj*u_*q^==ZFRj{*prI?oza5gu%zBFj!?+dN2{W!m7_@cpL+b}8P@0ep(JpK(+bRuI<@px?-k9X-_`AC;Ve7554Vd?QYw?1x# zDW}y<0C=iimX=wmOlNoY3j}^5BMN@vC13nJni;Sgx|{f^s-y^Bk}4Jp8C>x42oHHF zcn{6c81Qnj1}}AvbPZ4HiH|oZgzhdwOGfwz2M?sTCtmWtK07%Y;!B(3mzWg5HVUMR2*8BnkeFZp8KtC#`1QM-wCNp%##Ia0&R1ph8L_hJuO zDJWl%p)uebY-Ea055&%+bDZz;ggVDDAES_yok0q*$rEoR2< zHicAqG~!#T;3}a~2&dfNWo#`vF`br}6^6&A7BEF8QuP$!h9JXhH!Hh#!Et^4%bMh` zR+Kv=Ia=qgL#z^=yJpG3H0g`d9%m_2neBlmrXDV^4w+D}4lns)-9woHyLr2bb!mkZ zK|4~!DMA7lw0nq$v=pK%Gc*RYJ5s*35niNopbAf^b0Fi3n}$N_?l81ygm?!9!^EF- zMjGJ`dE?BD-Fph@bLDm{CvDZovHUTL@aWTg(7i-`o8vH2N_sc*9UH)`MTEg;F-0em z_7nzB1sL2NHe0#7jENtuAb4X*nUL+6@Sx^uV zFZm+iJDCByWxI)hDSZ?HK+?log#a!9_$CiwDPUipp)mm95uEM`2husu?|4R?^BD5I z|5XUxorRVp^ds)1BhmHsKzBI3g_*LuR3YsidoAEW zeC9_sAqfx~BK1Pl8AeFSUdw#OdN(T%lgGbjicTc!DO_Sl(a4rlH2}h!01Ok1gAj%P=>|;qlwS;Wj#*kY>QT=Ga!$?C5I`b?rubjMo(j6*y_E*L!|4KM%n_=JMG&bLYImUFTa=Yz zQ)X%e6_xd9dgT?LKfzKbb3(MwOU_FTf+##FTxj#S1BNShpD#n~ex6ikxn z0^xhCAzdKk%mEmy`9&J)C(5MuAlWDo7THk{7BBfC?6;W#yWP8quo|rt!B^78H-s22 z`1&;ukqH96oS`w`>#{Vyl4I$dYWXTtT53SoRSKcIFM;<#>Z-+C_ogw|i3M&uM-_wUCr0o~?VdyTK zzA7btm6ybWz}=-n;+HdbMlDUe6vs)jgiw;{6&oTG2jV$bt-mI#*@j86-svsYWkM_+ zf7d-~zj^aE)F&sg7tJNE?}wp|mm zvJ*NkK^JTIt_HMzihD)D{Pkc@6FM?Ahx#^G;5j*7P)Gn%PnK@R8Cz4(I10u>gQn3C zPpa>WxmOeAXksc3I2GGIO;&c5VVTm+ArulI&lUV15Pnak4Na?dmPT(5O5?x)q~fvO zm`NCQ)0VMncvDnP8pd6r`XMMsdaU9^A=<|j|A5u^>ofm;ZI29OUNwg+y0Zb_GY>=q zn}j-OdQlZ!vs6vs*z^K)2@3T14;jwiR?KBaoO@!#xk5xV**eO;7Ln7*$?133tZT*P zG_wvXrZ3nso{4yfxEeHf6YzFwDjLhsudP-O!trrvT+A)fI-EsH_j@1Jl@Z{#Ws%Tu ze_pg{Z)vh2O~-#r78b5fXWT~XMR&mMf`$2lGP(mED!gVSx)UaR=emF2f8M;xWTOt> zxDzk%;~bZX^vGz48Z09@n2>l>9#dq=|tHm8fnHX2Q6SVzCdfA#gP4mO4eUx1hh z+~qn>0e$ZxLg;Z9_2G}xrWS%=x!rE88yb3F8t|`$G zuMsu!3rf&H59Wjdgc5cOnQEXcfaj^fL8FAX2Z)^3P+$6&3(|5AZAdQC-xt6?5z`k0 ztF*kW>RZ!?Vs3(FeNEs7W`~@w4L6uJHXwxC9o(cK38SxEt>3mK5Gsy_q*V-R-4NxH z{V6WjU}r)|D@B61E@EqSu%Q`Z1H{}_O08Bj5-FJvRba3WCath?zgz)iLdo0BeeqiO z2drmIH6jWem|Sisl|4m6!pLs|b{~{2l*>eJ)W1spyr&E|VQ_~kI+5gd@WRB@>w=S7 zH`G=ICk5e}J^_VuzO9;i&bRR~?Qh$+<9h=<9xVfaZ|%&#Axs}wE!B2SL4rIpy|A&b zU4{>wOdqs&vbwI-fRuG+`atOD*9x1vLwwMkSc3P96QbnkkubZweaL6+=|!QqVMR~3 z^h}q$ES{S2L6vSqbf=&0YlhJFUkAknaFjtHQ=(v zflr7Haeq8rPy!?JVQL_1@CqfqjXK`Tu*GYXebmC}31OeSk8rl(Ln8UU*o$vWEt(m= z6Nc%N_qTZGfo+riC1D=Y1DR*yG+@bMmV?EPR(oHA^Uc&XDd6>90-|BsLcr^EhB5rHq>*$~h@S%S zQ$qD5sgLRpT@O8h>&?n7Q9ED?3gxO4^C@0pqWbp=F`uYY|FKur1K1yv41f*bvq?>e zWYMJFFhX+mY%i`*`L|@aN+|!(6ibTZXMRi=fMoSCz>-UM?AR8GjahIxER8`jNz&_o zl!E`0m*8lQTZQ2NAkBdrS+LI#wns4IO(gNO^LNnnLHNrEJRweIeomm=2?GO=3AAy? zatB26z`(lTN_fPAUB^mISQPdY$_pj`A5r*E*P|SgoQ+hHz9^^qv@%ux4Gj16aG&rA zLKVbB^e}p8nrAsbjdFh^rTIU|sy6a8@qQd9*?KRNO?&|UlXep`yNgE;46Gl;Cng7d z|4htDLZtP*FrJ4rO@B%q{6--+$`k4Mi9*M;uvy16irAAeiM!r(@1ZSpjANSr$E++P zPo!falRC~{YI_m{`h7s@B% ztA>?eW5v$X2hxj_nafvV;D(Sxu4NW^&+UOe-_sO%?@a&QZ+MS-@b>61I&1)p$>b<` zP1^1TR*Xy5iWR$$VhU2FF@DN-0nH;bG$!shhON*Djd0n}0Fh!5J zKjLai2`Pj{7-fHua@@gOxytc$rszZt2|sESVc^^WmfP;R&TaZ&`(fI7%O1|WXkcLN zX{QYgM6RGD18-;UV!fqrPV<3|94Pv4sqptHgk~4UTmNkWvS>-XEhY03x*iR)yctI2 zVko_Zxo|h)8#6S9P`ZM)$>O^Tet{%Th{rS5|+;6rHeYkJo?pTn8!|G&jfmb=0DU ziDAov6O-`jLR-u5)NB$Uw?E!-{q+~)+eg@khZnIo-q^o-O&~Af&NV(?!1bY_;j1^T z-?(+t(B#J?`5Rv3r-Vy5)=$sVh6!4*jRnC z1fPMra(WT`5$z8|(?=C+&>9$8e$A8@PQwPmc(}Jwt&CRMuwe%9^;=l(1ch0A{Td{M z$^4$HnCYWfA#7SgZrx8Z5;rJ3q=DR~u#1@59+l=Iz9sRtrg$qNTyiE-T&%{**v#~a z7XO6Z(a0pDGZUwPja8fItgzzpr;9KmZAZ^bId&i^^Idd$30oo&A!G~vkJ1|BtWO;- z+N?3k)Wm1nn#rfRE?DE3tTp05e;}CQ2sVR&8Ztrl2dVzsS%F2=|1_qa4fS8y9beDC zQ^iS^j1T#&DQTvciihs_$rq~T;wRtqQ+G5-ZuQDRiG4hJqE#Qe6KjcTwLz?a6GeFw zQ*d*f*bV;^7vH4{+Db`y$47fnr3Tf9QSqPYtp)7x#BXg!@EdOM#Q%OWyF%2WYcxmBpbIcY0mcvZl-olybKhs z+>>SIangFw*p^y*d)RKnYhEbeieAH~6e&yc97ju~e8)>ExM6jNP|7_lfKicDsz+o} z?!><9DcC+i`+2`~wE|h%dAt<#K5s#%g`irF7sI0rRM16dlA+9CAC{^SciP`1C-Y7= zB~{703Sq{xvYZ%R5puDNcvRrOB@0J-v4C#-Y{9}|f)d&+@ojC0 zp`b;sO%*h0kDn{J!BV2Rf}2#qjU!;BDsTAh=mkn4jt)_oQdHgSfEq2H0BWjI`%CpPBz>WRNCDX*l7CV#Zrb{#CmW)X9+ZxWGnANkyc!eaf<7^!)P{+uP_9Z(crzP9w~eJfuVGxg zM|i>;SQ80^GSq_!P7EU?S0C`=3i0QC8Lra0K2y>4YgAp6SU$Se*MA8?^*>4(zv?9; zYX1E~#xJqvC*A{M&||8o2Q!x=`4@rxOyM&PKIwWdA$t0v6!|yGRCd_;pb(juh&J4F zi@<11~v> z(y8=IsGI(jiatgmHwqQu`-g<0Y2irGN3DZrNrhRt2n}`DHZ5|PV9x@gq-`RT+Lp1c z)>2F?fp?_QyJSofMJ*VaO9qadU>cIdvlMVR9_C0Ti4=K0;E+?wC2W@StJLl#UM56% z_=qs!2G(wm3%#yo7U?G5S>f0$%r`rQUQcGlxZG5+I^_vWL8>%|EEak_E<p$6(Ch2WU97kCy~j}K^<9O~?85jC>JtL8XvyT01@?lV>(MaBLa(nf7w$&V|)2irz?&TWYneKb>`$4T!k4m?=78)gCcl z@KgzwT4f_9f1OOJ)eg&o`K4AL%if0N3(p5>snr&C6I~40YE>=)YE!DHR5x^5YIU)~ ztXgW7`8|JgM^{fJ?p(T`BxsZs9@3F$Q&`B<_NeSaaZgW5tv)5fh_oF&kfchj=ofi& z=vArJovhCy?)wa;o)v3!x74c3X2@1lQ6iVA!IHu7CRSh(^}n8}XG8skHW#x>&c9R9 z<|5I^r#(r7&$MSN&$MrW5|Pw1Ej=!(&$NkYM9tA)32GJwp{{8VOH`wJt$wwdN?V?k zsj3q7K?SR-8dGqHPPbd~eKv9IAnA-X!y3#(S)2AZ>3Kg@CQie!x;u&)?PmmR5ld=D zOV=f6Nqy@c7x2NJ=KPM}##U8zu3AL}0{5d0quMkoNVy<$g-;z6pFpZ^|22NO zv>Xm5YptT5C)70z8|G}Ol}6jpjx2!VBguA8o>Y?ihj?@U`7HOH)n}dM#R3MvzY7-D z3QDy;>lO3o>a*tRK6=v-De7#bVrQVX*jW!F5_PQoYoKkCaxJ(ufKy==0bI@M5|Z5%jQDWt$$h;Fw&tKXA7`{wgK+9U8~ai zGE69M;4)cJgTduT95J0N`5V}lIuAu>COALWATv>8!ObAMS7Ag z^uFzHdA<(b-z~TjT0v62AO9iK;#ae3bz2PTgC6dDzmh4)7{;fSs5QgOGBk$Q3=6PH z5Az%SA^CkD&*aMQyP2X#{HER}n%^*fk$G|D{_{-HBkm7?R!AYYVG(~xegBl#cjfp$ znW7VpB~0oz2k>3ui#^xDcZnJx>EK=B(t&}@R)T(?=E#Bco~*a#_sY&sDPb+~%W{G5aL&sd|1&E0PUKrLjN8Ds?e7 zZY=&mNcLet2{L1PYBv;!3r-9pBv*g*;tG}i=L}Z~r7wV^M5ifQH}x7N5qwlE;9{JF8Ze_l~q80ukNyB^hGK6 zsmfGlxgq`AI&VKAIB|j5#k9HBnT9&oI?Gj7v3iZHiDG9-cOui7Ys>qSwdME?g5gFL z+6+OLF|~ACV~DMa_R@x+!g65(`co=@heB?Y5bMmh?nla}l_TY^SQi*Mmn#yPyCHbR z%UGdCHpvi7Ck-L-Kz$n1m7Pmd$_SG)Oe3NwrxWA8q~@NZ6tzCUl2dFh%$oD7)cI4r ztPIeybv{}7Nv!kU?2U2L(HZ8E(zZf-W3xG52YXo_O-Db-ig8JbaA)gZn1WPkjF;#k z;yoD}!=tRnPSIC+URUnF#1uW^K3j4w;wbxr4542zSFUpWj43*iL*k8!Som0g`$zBe zTnG1$G{L6qAN6;u>*&%`(`ilm24yHlKVBg;`!L>`77=LCn#o-UtVXBnQTpJxFLV^M z;cmvmGc<-^QtHlyFDh51Bc9K5yE@`|Owk(&a;wp|^TMvIZexm0ShdH@A(?eN-TlnG zCc90ZIhI**cc7#Fj`{fC(ysdyLc6;kNbXK+s_stLecZjyY`9yXnxQec`^qgfC@sJb zvb6C01(ZeYE>$bgO&5x}g0R`FH%UPbBc=LY#5}nA+Vh#BH>W<9|!LeoY~?hs8k@7PO`s7IfVwEI!9e85%=aoVf{I zKl=Jyr50Q^Roew0MxC0d!-qw&F?}!y?Wm!MaH@^LGYOwW#Sf^G&WaIBCI5jrb@j;K zF-33mksCaR4yMxyvp--q+{YB1uv#Q|%rv+koXx}XX=p!~zK}g}wbe~Y9dddtYp{s^ z|DLI5L;pn%Iq9^Vf47R?B(IP}@>U~>qAgUVu~^(?S~j!PHISCulj3@`o-S?EK(-5sz#o->xp#*8fm6|=%bqQ!v=ejK_+)d_5zb5#x9e_GzBdBdFXie=a zozjAAEbTmAs^)*aR0FRUw;o2S`EQoOs84aeNzzH_6ECUH!5)-!q$_~0aKM*knm1=Y zF9VMJIakfKGK3@o>B#RSy-t z)&EeDbT77u==!WWc9*qlys+rq=&*$-u^@n=O!GA>|f>3 z2Rb#w{nQ9L&4aEJ^jz@btzhmbu{E=YqEd&E$iVf^bcr*tdm^ ztwFdackAHM)}{NwjPfoo^Udh_L21IOKYApy1^n^kKndrx)p# zK7pc?`%+!OdT60hZ&q%JyJtwp_%NGAw|%8<6=1NeBggmvt0e(ph8kbNieZFg>+@c0 zAwZpg~ zGG8{Cj2}5elw+#L+n3;%5RGNNGAMn3Bd3yA*fQr=Y1&75nHHgA1DW=btn?n&`A#s8 zbo=kD&UY5(o1Hq}8CHzT4HzpM?q&*7r8$=Iu;8;YG=`!Sk2>Gi^SrLyzm6$-#C^7$ zSHw~F2N^;iWv*Q1_z+WcB8LPV6|$(#_fF4su+CQ#97>(9XWir4yaKO#nY&nT>6?)%Y6MQbJ>O0dkAuDiaX!dUt#v*B*V|IE-BVo53J6|SgUm40~CX+9Yd zN^m$+^hSc*lB_knuxrSi%oLrlY7dzoWDI2XE-cB)hD`oCnUbtsmId=mvNn-ZCvLX>bfG zTn4d-#n6vhU)rQLq~_A1qE%T?>7{RV^n12`>^td%Hp?BBjESU9|D(+9{;W)$Mrn1c z6;s~J3Dt-zHRYx264RvGbq^Hy?9Y?lC-|{dWj!oYiUvaWqcP(OH+p+|LG}`NrtWAC zslsKa`=!S#wq8LhTr5aUsR4uvRc|q!)KX%X`~2-ty%novDsD(!poFWlNu*K+yp?h# zDMc&XXLgjKgEjnLy;j{9H0rHZWoI=Eq8``vMu_sl39gNsHte{1%XUPCaI{@-wt`YS zXv6o&C+m}8t^Kf|(uQL#)oQR4T6kAm^`NvH(4&Mi;am1?+qVRpwrt*XHIlV}1Qvo) zmZ83A@zGK(ULANT-AErq<@gk807IyJZ{IzV$19w@tsnr`0|wAxTF*NP9yz{|Di zTklVi633d(RZNA+BE3GxM_A48r#LFau*$@@R>`kTPA^FIBai<;UwYnt^Y)vE|2!U= zek`B3RN>SJRulKY0st-B$gfC_C=1*F)WDg!10r)0qKdzyt3SGXTrEJCapvnl@-1Rb zUXa{XyT{#u?80(-QmXsjI@====bhDSKHW#eGTv@>kWc)bAXV!%KQULYIal(9<;{Tk zl^P&-Z4^#Cjz{;B_1m@tqt#NY6_r~h3nMd~+&6~frKxIreWTKk<3_6$xC_OFlG(f@ zORW^1M~&b&Di<9(!FQ4uq)N(26GI&&U(tl!?i4ST30Yve|8$%OUpE)fb2XgdTtK&O z{+kczIQM{T@Og0W?pj^vwOH3FvjO?U8f`+TEfN=ndrOmzYM9=3;H-i&o37S%zQsGs zX;GH*M$U42^Fp1Qz<-2!q;0A~FVz2*=j-4Fy|JnM?^(6F{X=!524BM6#}s4?rvTh=-FHMlYC5`P^L9& z0JmB95_l6w>NYD~cim=1NVtjFa5wpl85#p5%z9b+-OQcNUfJq%D!Wl1qY|4gFI1-V zuoZHXv=gWtFZq_GKZ`lAo5}q0bGFLT*<0@rtXp=p%jk_y_Yf0b7-7wrk2g9tnE!N- z*>G<#|83^P6~n*D6n0O^SD_ulAMLpgR@sQM?6gy-p0Z#Y0AG;bIo6@Qr*Td4RaW!X{`uQoL? z9Wh}ceN?YMMIyx3|0pFM^^zD3@f4EyCN_ls5tD+w=JzPvrr*S;kCX@nq%TUrpP)=- zPc#0G1Sc+{H(BPh4>Z*M{S2?tX7w6bqq7f8_gJPgA2#Wz*ZeCK?WGMtCryM2=ufHq ze^AJc5=IA4ZX@N>%8~Njd(9J>yCHbRm$E{QY?2|EP8vcYg8GoAJ%qxhlo2Lph;E_k zL1%|UC>*vv(2{e^MA$XwS83+2dYKu)<>_SRFR{{lvuDQ5;eX6LQVLgS&ulj5>tK(| zquKlsXZmDE_&{+eQ;;f+0TVq?^krxakGCE>NT=|;uDSd}n4(AAXV035ILiJYL+C>0 z%2kesF-0eGNWf7c3!h_fUulu&I=HW-2{vV4scX&VcQJdqoe9G!l$t_l_F>#Bx|2YQ z)=cg}VBrj1_t`5NV>aB)Sjx~Cf=M}VB79M~Djo4zJh!VO-pLfbks$XJ%4>OHS62U? zDLP@*9y5>0tmAp;D!1AE$9ZP0yXQBX|Exl2clT*>cUn_*ce?K5?jK<`+%53I42{9v z9a_kX5O5eN!{T1%!PVD($`rkkG&d~vKg;)q{@1RsItyWu+iZTNB6IpVC2BA)tgbYh z?^g)zVew1~3tCeR3%c$T7Au$ycV}6ip)rI-v3~JFXT^wR@LbBAx(3fCrs$16a)W1t z7j|X!2BzqQ)gr-Trop}8Y#x?RLwm#AZ2pItC#H08E9@5@tQ`noB+8&nXmwWeLv-!Iyj!50n zW?1TEBmE+8HoZF8_!U-Y5&!)nQ_qSyx_h#*+jb~)vhlxJgGKcJUraq4`Y&{{QKRMj zyA|$E;CmS+lD8U36z!p^y$M}THuCnQx`~>YJA1Mb&jXfl8zs|iUVl6=bFz_+=eeA0 zJX-df7pJiD+s!}p?DP{sIy)9!^GE2270yHDHrn50Vz*YAI1SNiwH)rD+)a>1JgM0; zU6+6+b*|f@!rf$^v|sRJJJxveMxisP*~b%YEpebPr32Y(-gUTC%oSdWK}UWLDP{}H zVALiZR%ALUd-7E^_NOMprcW)BiH|c3kpkW1Ezk@Jq-AXJ1~~FTC;UpaeeKF*NE~T@ zldROdS$V#OmCnvWJ<*E?^wAd*54W;?Czh_3XY;Omc7d}{6!}za7f|bZ#l7cR*Uz=C z*S4m8isD zN#ml<^U5{1&hrXUlxZuS=YOOKkbX!!LVaSQWIg+XH2A&Bl*R{|sQl}Lq!Z*O`Dh41 ziI;p!{J+l}bh_=KE%8^?+J(;ZtbuO})=j&FdMe%B5EmK)A3+bbJedVtZ zTmPe!c(a$pXo!!K#2eWV{$;`bo#(Gt7)_&7y7*Vfp1vq$-lsz1AK~f zO)E#bHdkNMPn+-GZhMI2>+kRh~+xpK9_iA>Rn91?I; z$fBa(doz|ZTN{ghHNl}2{dyKb=60UHoV5_^Eqzlm)cjtp5SoR;TmQciX3?6-hZ3y$ zrR%QmtI!)SWj5TcxG6(ph$W@ESGb~bRr+C*=XUkOI#cvUg53J7+j(JER-eWcov>;T znTtKw!TPLh$mFk+sn7b9B}Vh>vp!2sowyOphp7i?eb)Qgemc*xl^eYms7+7mU9Qi1 zr^2jSpOyK&2lZL^C_JRW)TXenGqpV|AE@izYR%bzVn7$X%HEjAgaMRgrhBvG-6A7L6 zH<{MmpiG$N=<0vTMJvz$QN3?mrJ|DARHeD{^4pcTB=rd z#+~y|4Jt$7(5XQq91EfQZxx0DO&trvM(foo5QJkvX;-OI3rgeduo;Y^GOz_bbeo6I zQqY3kZ5`jYWn9+GVLSYqXgMD@<_;44Hk$R(aBK?1rGEF}-f(m(VtcAxpM-w-ATG4h zA4HB}*yL2JjpEhn!F7Yp(mw38AGJFsZw_EKAz&an?$>KWT9#_1(RO8b7&pKdz3@Sc z(Ea|@pcd|7?J#dGFvQrY!Op2RuAi_2k09=4`~0Uq0IZwr8m9QK+C~3`+20Fv(N|}2 z>Y^Vv&wri5fEfZr^Zc(-jM2hTBAITUPe0KncbX?l^ZfU9k1Mr#zL_uCD_`8RP!D} zK`=2sQ6DXfuPh90sMnxOPkaffKdNOc*I|JRf>rnlv30}4)jDJvcx~NTYtLA_s&7qS zU*GCrQw{UE60X}0_u}`0+U5MuK;Q=*`l2D})!~y58=|j0^ryI76F?p*KLxQaVrzA< zq1of!^z^_&d1>}r6H3KU{H+P)qQkc)j1L8=^6kvWB#1}XhpK3{u761)!9}{NGY0hQ z=3;fO;<{%Q*8%)P&s)5oFc+)Qr``BdI)fL+kSZ&%0Ws3C8fOgf9_wLn$L(4L_II%Y zTi(NE@)2zps{Kv%71*2$P(ISt3hYOE=O%xm++;iFCcP)15 zr8LHGM7)Gmt9#R;JXl06xL?Q=WDMiBKvX>QybO)ug}?C|5pUy}T={)7Q}l>mk7A$C zFfXp$f08MB#J%Mk5#QtWT{-?XQ*^?yL`vOOJofT?j^{d9)}sNE4$69#!Z#u)_oFOX z|61grhov9i)2~I2%*;YBMKr(2C)*>GNzGx1uSDkUAHC~<@1_V+^_2)+cYP&-1wad# z4R?Fb&(Ij~VAfBMoWtD3KA*N$_K=9!x5@q>ZFQkCrH8GMo1~pU<#@^W^vIdaf!$2z z8im<9J;L64nqb{jlM=t9T|P1BAtut`2O@mD(eVQjwH~wK{(*?6GAFJ8{v@WbdrH0v z?EpT{a~&))%K~`*I#guFABY&U+%fWt%>I&1dF8rMDzA3T&po@x*|SeJ?{RkTUs$Uy z_QrSG`_o5EeEhbU8-1;>=| z5E7iYh~Czkk0{YldV4E(7 zphasY_aN}F7+v?-E9zr5+|9TsLt_Xg}PS<_heHXLgZh^53 zjlta=KKmd-z+t2ei@TWzS6_P;Q}jmC+^~2ZFYLZyihbijL`pGY89cvYPF+3nUZ&`c zK5~QSfD6;d#Gv)QI`YAygjLIq9*3f96-jCyZY}#XbAGtYjho6m>E{JMwv)&Yy#$nZZKS*H%9kP(UC56`c+p4|-RGqu zd_i;^sp!`%jZv?3-k9m67838SkHODDpm0I#Gkl7aternV3bXLxeo69*t;drvTBfvL zgb>dj+TSEAOT1ZGp<$)7vrH#>@qnHh5D%*asd|>_rT%A`k{(N?cl5!Cte?+)GGgwN z5!z2i=&&Jm;>hyBh@=}9{bqzR$Nlu#2$c)nmm}ulbf~c}7@s@L)U(4(QS50xA2AoF zbb!eir*WnLTVZFwowjRdm{#u(Gs=5+;;8^z9;waP^=Ftk2cVRwt7n+5^v+2xqMYP% z&Pft^qt7QHMCRs0A``kBycows`Qj|&ib2#S?YWhxtOFmLcvPZJc?pM^;zkm#sk6%P z^#cQ!WS(L0I}+KeE?<&3DoYkU7bxG7xI+;m{WzI733lDk%r8xUw=%8qaVL6=yo9ua z93>wiAw2Pt?}>n?GY6gSlAP4o*Dlv<;u!t#SbelLtP#EoUzA`SJXJ7n+9sxL6DE>w zrNoTdraZrnm|fH-XguqPKgovCZGI&;4^cu4oJ+|yKE`TEz?q>+SfH0-g!I_2c(H|G zby=3JwBpZH8|Innh*?M<)$2=zh1mKZrNqDVk{Atf1xfsKHiUm2vHuq(_PZ#(N0G*; zbhWUMJ$+Hie4sLw9ha^onTd;N<39I`5;V%aXq6ZE3oF&g6&0;A-Jh7wTs`dlMTs?v zveJ5|5@Dfn`cvxqG=S83W2FViA)Jc3Mn11r79Rl*JCkrIH; zs)T1@zS*e~elaV?)6A8t9G_r{PUMh)qe2#@TUaH0x92)oC9DY!rApYdYBKkW62E2cV!fqrN`@lg zKPrS~7sfYR*AQmWn#so!EE1;cu5Y$5mVU)-xLfhw42>a{lyYFCs$^* zpae^qqBj!c7IY2s!mc56DpPdAsy$?WnlX@Bjabl?4VnCPG6h|emId<*y0(*3CvLV>?b~cZZ^$N3UL09JY9u#yvS>Yk=?ly%zfvN3b*@X(C6Jg6{ zY7+VqLXYQqZ4h2@3_{1j!LT;gs8?$3){J7HMa^)$y{{3@Of1`P-n?jEC*0epRz@rB znP=c#^0#nvxR&CG)Ezymqzby|7kPW=RYBKlSfNGy_f?)v z`u{jn&xZaB6?AE|oPW2Xok=E=w;D+lJ?^S~C0q)+_(@WI-c8Ic>YN70VMBc|u8uK$ zR3fh`DpS@)RY}Fmx}dO3-$Ut7>;tg}rPEp+hghQ~lDoX0WtO-9#XeacCclp&d?U`( z+p^#NPLE(OniL&#MA6j*%jr<}K0G7UB1UhpO5_ty5u|F7;JfCE1m}v6dfxS1cZ19{Q@$iq zgb=kp&t7(Key+Pcr3w+%*5^q^{ciU?>4C1WlWwgX=U~^(MetntVDGp! z7N?c?{jQwO=t;c+prj)>PJ&@e_PKC(?pk5t7#0@F`@Kw5q9=1G*tyq@!z-n_--X67Ga9%*l+&|BQU<@q{zD{O3z{ySE!ZqrJ6x`~>j|Ar~Z z7{(`}s9V%8Gc<;GSH|Y(eH(oCFz`*)BBtmOzaHuTd9Q|Bg-<9LD zn4%MoB~t3Pk?;-m&oe${_CtI_tpSn_-cTPiFp#{Z(5+a%w^w4d==S!O=q93_J^hbz z*QTsYZPo+s>)l2WPF$(`dUV}&Uk?NAG0cX$;jhoo7=Yn^s*b*kdDK}>R{|||WOYAD zt36+t*28MZQPN_de7xja9X-t)*bQcW12=os(d@a;5X@V)P@`McZ61Q+dkZXG^6^Z^ zj_IH5F&pk3)9+zUTv7e&Okwwxd==VJ{W{Neu!tgy>iO$X5e0Wlf4}86l3zseR02_% z2g`M%{9bJ#oqJA&Q)-_S-{YLh;*CC86TYN*Ith1#AO*aU6(Xi~=mPvqLnH{U^kNKm za&ONvrf6MlvYUU>fra!@yXQ%VbzTyp>hB~8&(W#gaE?J}-Y`Nc{!%ZtQ1Q>qvZW|q z?aX01>A*tzs9t}VL5QvYQA%9$k{Atf7fJjWHiZ94hk_l`rxb3}uY%Jj8-xPV7p360 zDpT1Ljk`&3;v#x`WiG*|q4YLO`i3rnM~C87nyg+UYgB^IbakdPpLyu0WBSV!?WGMt z2Ofk8=ufHq*C^yh38V85&mra0%8~NjJEjwvyCHbR7qdc*Y?2|EP8uTL>e{mqY)Tnn za)#&@s-C@dI19mH>jN!0ryYb{bAFX({<4>u5nN`-%>T|x@69e6cR2qM^GGRNpX4laHmNVY|2hk*E*($%${z4!f+U(st}re8261{ zNT5Y)CU+t5Fa%xq**DtBY`B|oBtv5eCgs?J@I~dSbi`?%+tm?oXNulPkb4;7)x5AP ztFL5=PFS_a%ng}!JkS2*c1-^$&#ZO#{Eq3LQ3&ns{vvXBT2pm*y6)rdA7VD#E%5#f zjlta=`k;#ta2P4W;%Cf*tFQf-DS9JmZdlB_#P^2&e_dg97Q!O8WBQ4T%<1Qps7t!A zy3#TIWQEWk7B8l-pf%O7pzA(iaXho(?kvY)5{*^{MJEmerv2gS*p}#uAEj5bK!68QWM%4&XgBwk9IAexLsjZ zJz$sly$1*E-mLJD_CA}!-oVuMur$BkyZ<_-zm(#L)Qz{AbnANhMc!+YCTe1C-2pp1kfv{%o_9VibHI+yhq)ZEJB9nES0+ol!Vx&uJ6URvz=5&dVY3AX zeMcJgR?ca=HJj5<3F(Y^wK#NUnwJW6oW{yz@HA!NG_0#NcewBJa)LqPSF1;?l@Yia%BNX|z7(7_B+9gp!=$E!#k zTCpB5XYs0vVCi#j#$Y>$MSc6Ju;?LHz#XYu}leBv#FR6UEgeEz(7mB~iE z*$yVgC+eeR(fM<(&;DGW{Y;uNjQ{CZ#((nsx{^}qvO65@0EXGy|SbgDO0`wGn) zMo7h<>%|r-{@=1}DT-GcJDKW%Sx6t%>q~xx*!mx(#EFu#=T)*)Uo7NbAFYk{g{_&5jws?ru{H0 zy~owQUtu2Ubw_8_zOyjj>{R>yg%zWFi=^(pW3}&}n1WPk44A0e_m3GGLurafweQj` zKA9VGe-u;ni2H0&uZW}U4>E*KWv*PUu!bo*kwXHG?uLZbzQ4~{&TMV0_SFPOud02o zVKu~xOW&0Y)xI|lMDJ zT$M81%5%Fq;y$M6jRd)sStJFTg@J6-p2_ct>e?iP4MhQ{FT#VQj;R1_nY!SfB~)YT)u#uUBLM{e-^ zh8K2a^_NW139Chd$4rA|joBMcK24^q@r#x_Tz*;O*C<31X{_7@dXSbiuD;BalG&>C z0-&D7vc}^TX4PuC%u8$iFvn@z9E z8bem74jFCc*vZthVvg>XHFnz$g~}SA!5S>0|J#^)HuPVptWl%o{JRyEH8PRB)kvaf zvq|E)`#iMoaP@}T=MK{jCts(b!nF4-HSs)GO>UIh~R(_knk9bq_ zY`QL?Pg+O!)Q%f$Jn4G{Kel4V!7W%YdP!v6?P0qOJwu^Wee~8m{Yn|sA&VM4sic~| z?WHE%82=8b>6-estwh;qQ;S)qH=$iqWsodl<$!! zT9y`XfI0{IG(f4guU(l8i5=~4l9j)Dv+@HCE1eae9dWrS{Zj(~ef3Ag!=ZvyEk1jt zNAcNYeJrfDhEi1!)QJ!b9aXStTz#&NZLW?jQ^%Hr4XN^*X4q=fYpoC}nyl405p*(j zqY2;H>R+`3s+f2ZsA}36j+dsYZ75wDyf6oU*WFNC6&Ji=5l|zZ2v?_hW}zAmWYJc@ z&BbcHHrMoh_KWG}V$}>8!AUJZjo_ppT+=rbXAH1!wgT?BT`R-;36|l>d$>$eqsJ4q z4WYjJj&lJ@jk;QWcb<1{vS5CcbuXVdn{$&y_UKbeC$^Yw(z%q#QJe7PS5UH}`h<>W1?5}WGP?aT-2>Mle_2jOpf|7;wQN6xMQi!epQA+%EFNqPyjv$G@%7&PY3d&z7jHY2KT`VbN zPhXTW|4y084opXp%)~{s*PmNKNu%5g`gnn#u~Lm(Q9&Qm{g~;xTtT_yiuBe&pF$n4(AAXA31o9A$ryA@p|U z%2kfHFhwVFNWf7c3lmDLpuE*{9ju_#1cy>V=~+>>_O#RVZ^XXE+{JoJ-;@jmls{Am z%`S{@x{f8xqBWDxCD<;NuDibJ!dUtSv*B*VuVrWqv80qr3RhIFN^jSW`88lilT#;d#1Hx! zu&wMTI?uAz&|C)8rW{h)3h1=8-6aaMY7JQC_xz2bqprWWGIUN4 z0o_j$HL3~^X?M3NtisgxuzaA_fGwvuB6Ua4DybSU`bFLzdQ}5<7b~=g|4uXYteB&_ zHDKMgL!lb5x3LC`=>N@3JsbKjv@@yEa{k?lb|#rf-fAQfKJK2ao~U=J0pll0^?5fj zw)gbW(4LZSdnZluNZ;p{Y2`G(-xt+*_c4 z1ky70fN5N}MiDICB+l5l?sSFJ7&#N7aos9X3oRUF2dC%Ry2DsB)4{i;D{(1w;GD}rxiiV4*4a9QqP+Vkatx5E~?ME|* zdq=}YJJ=NcKkWVr{nWy^jT*8kDjVg`d&*%gfHrScs4BM>I08r7%EGxwo~tYj<|4UN z8x6I+{{99cIZldUul5OWx9(cqVgG!XQQrS$;u1X)tL@J8b%&fsP%hKey2BTF=QSHC zuX#S_HNAPgdn|4)grLBGW*%wNq|oc#zvcNlcwM~U%91>#6aOKf0Kdbk)$L}f`vmw( z=pLpZV;G;1q82+}&(IiNYAx8YufeB^;y)z6zvr1;`Mr-Rdc?2C3++R$^4maIK5-CJ z^oaWduB^Ai7VRvFzofob^ZKs(4w#}7jwMp+wwCbK^;bRZim$FUK+?gh>thE7w5hdz z%kK)-i*CzrsdgqZOU|#-Oxu;o%^``~eOm~{i7$1#kFL9J_aQcHVK&@te@TYMfDQLw z{q!x&rp|oY8fmdxtNl%y?#ar;9;QQ{l4b)7;3ePs={?MW-D>7nbhB7L&HmdG+*@{5 z%jlmC4@oikz~Uw!|12+zY<}Y7XZp)4;q~fj`1d6E_Z0Yd&5bkh%aY|2Z|yM~(|y;| z(>W|0zvE3_lFs)@=EN1=KgJYxXUSKg9o{#1u7hP3S$NN1hsrD#Ad@!%@jqJbC;4R- zn+Zx~LM+#f5`DG3Zti&&&aHiNeUI}je_^e<*c;#ATu#FMNst2I$Qlw;t7zePrXkW1 z5839I8Lim5HOrWyb+tul{#ghX(nsx{XCY4Vk`PsY6-l^Ckfu~`IO!lXZx|sJe})%Z zxVQd@EL)1=)pj4Ivk)w#kLvZu9fa8WAEm@scu9-DqwCc48tCe$GH!0kv-xR0MJ_rS*FG|68DO1@qjcZ77;sUdc zX>*Z24W-vy(l_+C!xdY3l^a>TM%JiEpXnaWbmmhL{R0E*M{#=?m5<-<7;aSItD~nn z8R8j=_R@x+BN4&`^ruw*T?)BT!svv=BT4zRa-{qf7S830MCNV?Uhy_osF6)F1k*`F z7tr1AcT72}c};RD4Vn1WPk44CMF z;&&Mu!vn9!=F$<5@JpfKKs;0Qi2LlJ2oXowAEXsdVXj=Q@DQfxL=Fi!x*HX4IsGPM zIkUBK%SjV#%9c}qw~k9}V>QHzOW&ak$0e>+2+dOA?$HedTC^tKo09#e>AKJE(N<=| z-HexIXbi!m9E=dYs9cqfxQFL}PS<_h{hyf)cMJSuhQ{FTE4S3(#cR+g z!RM8sxS`$*c9*IZ_&P3@MTE^}y-5mk7%A2F73RU!*S^RUy^%CGEbirnU0MApQ*^@W zEQCdF8}`1d(`kTm7szkJexyQZ4~xf8SkRhkSkQH!uvo-wxLaUBhQ<&U#X6~rn?*5V z89b*mr>-73#1y^JM{e+3$_u-)x``<|VYNu`m}zitIGcy%)6m}VeA*lSoF(zg-y423 zg-GJ*PHvw*NZYVKj{QXES+)~pdx6^YvZu>O@Y)Kq>Jhxm?>#tz_hN;IG&I{3_5!B1 zho$-b-jZ~Gq^mcr-?(+tOu8G=^oh_mX=)PoIio}ayD|?#spnu=8*9{|tz>IPG0-CD zkJQGJkBMd2JxSj#=_ZOJQg^f&mO6q*zsQ?Sua4k-fE8NAf8WQ{vto|!9>MFj9SR-6 z`yOksi2lFL)U%=gLPzj4TF$>);Y|wP%P^6=)kvaf4^?fe=W+y(wkgyQg!JrW9walr<;qfN z3|GqpaFb;xVIFa*rq^^`BAzsgZVwB$n|abB1wXbEc`HmxknPrO!=xh4@=^qP_9!W0 zE%R*D9-X3NIw@=7-E}{_j*C9Lp8Ci+m^Xk&Wc<8)wHl7%vocxQoj?k^#aq~rgw-w~N$53r7h+`h*?*L~p#(JXucIJ+^yXsVD5rd^w%4 zdusQ%)19zWIW*%4#w6P#;ijFPuzR_Wh|vkV3G#`T2vYTg-JkcLH%~OyPaSreYpFli zQa^iS&GB~Net?Zqh5lJ+dQWR<&!^4BfpXZ9ZvD|CYJX(WG9-y`C~{S~-EOQK9q=`MNikvGlgX-jRztUukw_b|GTcJ*}Er@Zf}Pp5n8$N8R`$eDdw z#ETts9}<~2f7Od|Oh|6eGOidzZPA=th08kdv57|&?ytOr!>6`8Nw|A;Rxy>>3M-g~ zNUi_bi!s#tGqa2-T36fL=2zjekUnbntioNoBmKZ{eD;Wv%)3a!qXa2Dc*q@mLyfJ_ zykUe?{Aw?@Q1N$X*-9(^9JS$+sS1~c^ijRO&{l}8|4~YOzL&%p1J5Oi&tpUQSK*$J zt-^%^aKTtOUa5s+(UZPXfV)j$H2pp`U27|3PhXTWU#m=Ic0Sw!dLGG4TtrX3xgE)A z6g>b-kI-!gp&Ri6TUn__uBhab=`LeBbM5W%$=X|&!soq;veJ5|0$ZVR`cvxqi3+(< zs;J)f`J`)FInuSc*qMg9E1XxEV#OI*BZV`aRCvC1wKcYEG8sQ|2FzH_QO~10)Yx)R z`T$2x6|Jyk&acw6Z}KuNLdOfqw6ABS_qfLPL(C(+WazBMb{6KFof_Mpv0`-ZZq#jX ztg-zuQ;;f+0Tb2O{xCyhCa(W@HUi&zb@`=;+oh8o+=3ZdBx@ZSGY0xen-??=fRTe|N0 z`Ulv-1K<`xsajAz!mdwwzDYZOAeyT6Rwoz_&{ov!=1`-_gtgnVT#`9BR6>N;e}mU{W?>0!fKJ=G1Fi%VfKcTPm?Joe81%mmtRcyVhWK& z8Y{OV9;C&Dhdt7ilG$qG4hHI3EGAr}Fsl|5W`6HMG2x)XLmHZG3L9W*dsseDiwR#r zaYX8lp7c}2g!GHN+4QQIa2qRBhm1CJY-Q?MF-Lcc3A=5FLdAqF)?g9+H~t@cZvrn@ zQRR<^9UdY(0)cRou)IWG0)c=;K|=@-A%GAhvW3oj{qp+pUiYKBUlwoy286+&s6i1| z6lKI+$G?oYE9#6RBZ>nmuH(3miu;24t8;IiQ@75os$12!Zv+1{pBd!c+o$T(Id!T| zo%)`0iMki^?+8q2kg|QZLNFl_sjWs4#la$8)5Hf%NO2e*ElRa5@pO7Ue{s7#1SmcW zqR@@O%T)G944eimGyCD8C;otY0!{l&1!3^ zQEycR2FX|%9p|9feI%YNRnL5tz#LHn0)uo)b+j@)(H20Xp_2?t?vjh^a}rEi+(uFq z9eTw!N&>8<#$d#$^=(rmX;&inI2$0zL{<8zH9ZAOO?5=yRUoTdl=T&8wAO+F4MmnI z?7vLnx%yZ)G1(c`t#6ygkYkgR7mj+f6+1^V2+>IZcJ7Rz!GTu(69;#?Nh?pkX#RZe#?7C9$sm8W zU~)u$SIi!g+k+FC@I;rf0qBQBa}y#=n0=uXzK%8NJkZ2gm-|sBz)kvSD2x&wg_aP$ zgg7V~2AQj;7>iuu*20Wf^^D_=q9P=L7f9A!QDBUU5RsZn%uaZjIy>5tre%ns1fm_^ zKx*+_!oGqN<8>sK)Dq^vGRhUp@e4Iy?+#)M7O1ag*F&uwWWd2M>}^om?UKj_4jBx-O#~|G|W%%N^m3QsVfhlJ$5Kgg~Nhpl)ALMRjOSa zq*_=yzJaP;BuRy8FUI(nEKy(4{~j!cPCS)(#O?nH-(GLfj#DHUpA8rQT9ZV9qI4Qe zjCLH)&^Qn)0cgh?s9j&~uOo_*xX*$br5$BoC=+@UapgOX*AqpNai|5yv>^f7aa~|P zfOa$(8$&w=qQ4f|DlC41xJ%@wZ%PiZyop#WiTOB6*|%{Q4(1d0Uk zT3M5^_mjbEEz9Z9j@SAYPU_S~tl~jiDPHRtG*3)MkcW3!ET~;4byiz!7g1Ymq%kRq z{BJpHGb=O(@7k57xKG(KwxhA^*v#>x8M7R(m3eOu4()Z($(7;Dqjn=s4u=pweVfPh zO060fFdp>9G*4iwh&taapQw1P@1h-{xZ|^mhS$P3YI`UPuXQB}w3GR}fv9_;j_%^M zx~+$f@LF#q33ej?+ljgt^6w}zX^^sgx5CII5vi?45yi({p8f8F*P@doKkug6me8f4 zn!MZ{f(5k#4)5Uj^qd(p#@CB~RpH`bvk~Q#L1!V#NZh=L+ZSQ#4hV?>oh1s%nbBDf zkm{3(qkFR%-k>0zbm)xl)B^o5Ygk{P@yY~000-Xg_i;f(p18M*&((6KByKuOz_Fhi zy(QQl=TLP_9s@cF44;EorDdD631{tyRfWb_GB0d5~QFumHE zvjW^fjMS|^Spn`xC>HEE_5$<@aQF%%lsZp272pwI=r7uGQ501>geJZm!&r z_z=sBiJ5VMh%;n1O2FA6kbOB@TzQI% z0n;Y=hLYLXJa7>nuj$@3{Yb46A0SSAx19G9MgB~&i!gryUl7<2Kp(OTxV;~QK5P$6 zUM7fNm9t~mp%1&_!l_(d)i1d6&*0^0tr;ccJ%@Pn0U0GfC8_%88*W;5$HDzbl8V(v z;W}KUmgU0d`iYu|e+*&_Lb7{i8DmoCB|h!>2{gzMu?OZS>~V33uLPps8%MaCB-KRk z$Ucygcl<&LepV1$AozW=Y%#&}av84t1R7+B=*=kza@gjVYQ)C}jTjX1G#v4OWmaR3e+xd2yVvl}>%KgDY)H8;%L;jER^ z%jqOuCu^9gKy=HA&Yh_+n6AqV-?UgbH6h?qM~Wo$sfpTfoHV>}yd}Sa#cE@>nDlf- zV48wd0sg6ke3PgyKfpGo`#Al3;wiBRJlEpD0k2PJ@XL6yM3vIF7dg z;iJD&yT082i6~0qKAWf@?I`;~X<@HRLL4Q~!tO*-WE^V2F>O>3RQgt+ydbD#Fg6xc z8thgI!!t5hH!>5k7sru(hLhQ9`0m7#G=_t`7z;yM+o=d=K!Anw}NS0-xW zgRg*Xs5YC8CJM;omr8t}Bp!U{+Q*2ZoRM11;=ie5Usk_H6h&C=fmv9~nE#$eU^EMR z8S}>&VZK?+L9@UxOLLyUt|jVxvvgnX?V}egI(PZfQ&ukD zqE{%|e2A!HG(9Q4_!>JJL!*u6kN}bnRqG>D4S}F+ZD9&xsfr>>KU&=g@wi%h%Z*@x zkBS4wp=d`a?l>5xrN!YJwb_)F7WXeC&`##>+ljg->gaA-T(|YmQCi%WNP?Zn|BFQ3 z3;B1H7H5#MeYXM=fqNMuQd^B8iesp}u$@m@9EB%&5H;0yCM`}JJABjPlAj(S?y2Wp zvIT}RAclhJT|Q}X2c(LYx7y8k<*}D7{|6~QnL2umWM9IMr(42PlI5*(?si-g;@m+T z<#1fqkT32*<8!sBDY=`%R1i_7Mjw-d%}b6GMFDZVE355_I3dPg{Z5LP;~S8vDqkK# z0s^{q#*A%dz&`+um^mH=NeX875h$sHC8^5=5c3E#;fPKNBXxiMw4^91jxiEdX5-sl6fWr$+9qLX-8N=+*-yQXIip$5^Yk0e2!Nk^K=uBTPbsm z39VpqvM{ago9NW0NSt)~1!e(W2V1 zl~)>{G^;4*|Si57+`3y zd)P4abEK^i0M8lPSE~OcYgP~RaV$BUAkRbT07vQ5qcBf+6q*U}Vd9`@bmTBSSSYKT zbDgm0VMpN-lEDWg^Eqe3I9x(RYFaUy;YD-p_+gr&Ax0C3AO0OF#uW78Qv(d=e4HAO zl2}s9nFAdxS1-pe)QsKsvXGbuELIm}*mSfi+sxcqO zn#y07F2XS*7jeMeTHhRhOeLBP_EvM-bg{eigh9mj8p zqR2SZg2R_AxU>Rv@FxTN0d%mzI2bxO5G`q~Z+=Kc_tW%E$pH>NoDsUGFdRwN;+lnh zrjI3X`-9JYFSWpy4k9-EwRk{=#$ihg1}vu{d#dK)snoXbJX}T;<&3}z@zRBzt*be}?vL<8iCj;bqeU6RVfn1m2q)u(bTRo8L7Sf+-X650MZWh$8lRCo* z6|Han&x~0PfJ3gyuKrVcvwuiESTwf)D zb~1nei>P~|j_v}vx~+$ffLy;P33ej?-w<^#f}gTi{Tc8s`W{>KM!=AY$giN%Pjad|Cs405-$3dKT&h zZ{N7Pq+K?~q_u_N4uqoM_P8ARUphgdu{N#bT)JKj{hik;ZM6GlB z6A>|@+Ii*~)jKcRj1uH?g9Hf?;&mv<(`d|2=_A&Q=#;Ed0q+B;s4R{;1NUw>v=|!jLm@+qtDM(yPP|`|@+#-=>!ShtP@`qd zYRQF@agR{=(G#Qb(ecLcm@J9DAbXK7tDPe$f)PUMog*!6O#~WD7j0K{&hhs_dwkqx z_p6I@0)HPB^dQhx6TqPLfrG7n{MLvin!~i#eUp1^xzeM9#lKLa!umnEic?> zMh}vwfZj@1(Swf!doDMl=kg8mT*|qsrAp=hM?7Kxq@%0aCv$rRu6~`B&u0(op#|r8 zM&QY2j?W?rREC=dYRk^d&^RuroR!a?K`oggX*^m1{4OSnlK2g{oIaa)@#X$Zq9}>` zoXY2;)W0vs!$eVpW3^J60!DBRy?;c>!0f1G$U>CFUk zmT_0pE2Xv1v1S9b1{|d|CWH@yNQXBo#* zH$*#3;uc&)l@qM`jh%a59NL;RvfH(K|8~q~smHP=a3{ z#1;tt_AFaW@Vw@RE0=)=86tXfx`G_G`K221D}qK0ig*K#crz&?JeQ%vTIg?M-0IGv zp1U9gpg&Xtzne9suW$Uk1n%LRaNx*Ad|BlN+2c>~@=DDOllKl2ih6kqiPy;*g6xUz zjYQ|pYA93-{Yy-Gx*{;8L8<`%RKou%BX^E4&Tx1$3Lkrph3{Vr9m)I^K|Owv1nOiH z6+v`L5q7N`vmHp4%ED9&@fOOnYdx|Z$ZSKF7E3;Z)T`yKQu8*|5QhpDmpf3+eEvq&&L-Vq#iPap~urPE;I1I2L}8plyL zAfR*}wd>3MIYdzs_t~TdsetSYrG;_g%6A;=h@!|i)PiH$s36RAOkh6{W-=HX3o~`C z7W%7+y+m;O4&_L9xSbKY=P)=1Z^uOo`%Fh6Al(6Qro^0@gqc0&IqjO4i8YrzO3F)6h&Cgx0#zV{RC$BSZksGnp!qacY7`LKQhAn z>HZF!?${@v?)W@py8j=s;je+8WoR7J-J`;}Gy#uaDzkXnXo!mgyW~DZQO-!MX0d=e z_BD&A6GahLdtesUTIefj1V*#4*Fs;#2=mS2E;I}5lbZ!T4>6195*z*+I4witFpJL0 znM+IQj93{@n>h8Ikyj8!Ir6X?&&#M|Usi7?<;QRkbb`+D#3tA+kfv?COE91PP^=5&lIvb{$eHv26?z8{99w8^tzFBXr6dQ|pLMNhWpm zJ#=QHG7_z=)ho?SqRzIMV{tKD@wJb50!F8vbK25~W+BdzKq@ut&B4QdFAm$t{`X?` zbNOBnts1L|4~bUlQKLSwDH;>Sz^e7AR*zPUOjM(m_~1!3YK%thv8pJ`)~*fo zZuN@kny3_w;#oVY$h6ziPV~GisAljb>X62 z<_!!C%#D_VhZ4nKyJ=T9wv&BX?C*d(uhfTWJ70RvifDMECO&F55O3XjCg{?s+OqiN zVB!u+KITQ0Rs?CA3FVTQt-0kV!1c`#R-;IMWn=lq;cC3-L>tD0wqUav9M^O%w%TG{4Cedvt z=rGz8|F;s}eT*&Y%ejgm|~ zQQ~|qYa~FN*gqF1J`WM+bBK*{#F^twW1{K0lG)JK0OzvsLgK`CS=dArMMT)ivf!ox z6i?PavC|-mhcY~WlQ|{nlhlslc?d0Eo#<4*@ky0`zQ>y3Nr%Ib!)ic==f9HneDn<$ zfREtdJ|Ibj9V&>DD}7T=Jl9Xu0`Zw3#^83~J6Xn<)cGe+>=~Xk$PlpyW_W%pXoMj8 z@8Jj^Hi_PmzbPf}_=OVuPlMP3!T%u3R!Z-5amfE5O@ya-&d+|XD*f%G#&EmZ9ugJfs+GxjFJ<4?+mCUrJ2QG# zrxb+#Pzm5*)|6WSa7_9U3IMr)-FWkXOGGetYN9qA2bmXYBT&5|iGQXc^|rTU)CK4h zn<{1+65Sp|=T7nyA$3Ch?!dWTuNBGdiW<@lPd$<%~RE|mHG2%gE5_x)TFFQwXiu}KzO|~k9E%a^!RF#t7YW73+w(cc8Dai(|0Pa$?2}J-d>%60FC#YmHE>CW#xdPz zuc!+Yb2L?Hwqn?0Gg@DnsEx#~c~osS8%>PRdHhnD#ZAP6?_9fqD9RbB)hzCyj(u5u z6HydlwG*>&(?BpQyOr2!FqlOtY1d}#P@nepVAjuZ@~0eB74O+fQ_>!!d19Jbc_}>) z2x`{}w#zALUuMjTgSwUpm3d!6O4@H35BluO6WFhbI^Qgxs3~c`Mms`r$H#YzB5;^x zrKIgQq5Fzq>e!p8kx!jI9Wm>II=Y*Z)@?m>l#+G=NwAak<2a)3h5S28Ni#^1^bEtvjGm7zrh6) zx#wOtKKJ#yA>2ldj!S;>($|*crLUoIvOstgSCJ-^0AC&?K)9FrEeh~uG*+k7F_Dev zl#Eh0d{2+_3RbN+^;G{fwjdfc`YlptLpKgW5z)aYL}fKN==wv9z@ZnE0J$9jC25hCJL) zYk{7&_D}t^H9cdcpDzQsJV_FoIc;slDW#>Y`E4(qC9T;v?A~UsAs@!{wZ1v_)7LQj zYEUJ}_016y2CGS)V0Sav%;uOlqaynHU9oR=EsgCTkjAEVV&y_4hg|+80&^Z4ZRzOi zb~TUfFTpOx%pKx`*v#=il8aFel7aHhcAdm17CCc;^4Ok)?G->qIP=(^O`bS%5Zz7kjHjHhQ@K9<;-JyKDFe_?|DQ~62Af1jY;Cgm-}&|D2e-=Jhtno ze_xKTA&Md#tEJL(+5(iuae@5+O2c6IMNk@!Jht}`cZuBeNSrl~?Oz$0+q58h7U61) zJ@V)oKKG5D0p96uV#8mDcV%cCHtxz}dypD3iO!M7_AN#jAUy1o3lE=%2=4)6qa@+U zWVQ6M3`3BnS1Qi-SK`dqnEyl+C5^>9k8Q6y`T)MX?@km&c+X#m?##$21p4C4V_QT+ zFqwigkL?6Tnr{rVaV5cCxiR4L5Mx+KZ1^kT$PA5RCCSfYdjU0P5@ITAO#;PIPn79g z#u^C_C-%?9iO)mC`Fvud9C3Q)vAw8dHvIG0UPYYvE(@<9iXtNHWLa?20Q4v8pV(;- z`a^kaJ7?A*eUjRtKeN#C)rn5^n;cd7x7)0VY;-ydIjsgHvi%3C&qv{K6*w11_XSBR z3{e4_Tv=*zL2&&0fF$VVqhh-V#V&|W?vS+fk9hA*vi%}B`A*dGnpe%RoNXDmr4ARrofQJ^TD787TyeKJGiICBL=JRhNUeYyVzQIy1eHYrUiAp1gT z;kU$K%<6h+3NRvf-&VYb@G0{ekDsKGdj#6exzY6nf}o{GL9IkMH}GD7zphW-9n zT(q!He&WXGAt&wwhz)-=?w6r)7!%7&lXHc0|25mq}f3pWjftg>5)od!czl&yAK z&faAYSuMiJpK?%DP-iR6R{I&v6VuGfOTPNCpzdL|+W#gaB^TDSGkQMTIIB*9MPenkBQ_4itR-=fLI1n%M=aa2QAr>A8 zN;NJMufa@Ld!kuP(u2wsx57QAGqGi*jtz8oZGp?+TEEs@6j80EXL{qhm)d}Nx z77UzMtwv|9p4{8@ zU)?vUem;~jAF6Lsj?Zy36)uZqvlR_dFe_F839 zIF`-C+Y`Q02#NBOW(6@0e$q&mai)=@c};FBbdQ7(qLcvW-tj@B1GS9e=#Dk1B_H~` zob{+5I8#7hdF7CLqLgwbYsBq1!bPO`y4u0QZ=N}h{qsX6KKDIjf~KiaB@3=;UOd^3 z79_!js5%fWSPzmLsCyjccDYI24lJNlpW_!woi7Yx3nV|0Ws6Immn(9i1!dNuiw7lRAFlQF8>tBwqmW7i+5 zF~6TRm2b6EIA-J`4u$WwM0}H1F|9hlU-?7XsDpQqP@P;Ml#S@#Ms#kx;Gya2_SQoE zAV4Pn2bj=w`6FCVN*@1IB6*mRJ4Y9z2d_YxW6!b7{XQ>%B>oDZ-tH$sI$1;o5S>zh zS^#)Z(1;}@6)JmDEyRw~(L5R414~F&8nTjD(1KE_mbXgBJGDZ6s}|~bdr2yEe6bEY z9;@ho4;I7z?N2;X^s1A5al$6{puOH;2~Q@$m@as@V+>frXA=dA(rGa2XU!9?G*wP^<*Xot# zrl`_vRyIY0$3}3?^vr0w-m0w=9v9ufoYZVCDN^w;KZI{oJ2NT*!Q1=j5wH;%Y z7TTOa9%WEcCrC5*K}qeeqom?GbfRzb z$CuwmN>8SY9*Nl}eGQBaAzsS-Qn_?@v!?aMnI8hd8@>t`GvtbU!}we+WlGqlvj&71 zsnNGce)2$5u{WEzwx;1LcIis=wLJOFB> zD%U;lcWP)42M_JVI5Z=R6X%UJrYA-KGgYfcm#r9?s9pvTsCLy0Hx&k(!esKzyJ@|q zAWT1E!yA7@*e!;UHg6B?p+zKrD9QYik-GKwEzz#f`_(8M>^R=hcajotFvj6qNRM$# z@qR97H3xUrQ4hFdh(3mb&|8k)+@=jCLZV8|qhjE#1EyUbIA611dAT0dwVxyv%ges0 zdIzgl^}$V{ncyehXW8JV9KZ*0q84s2`3~ATFu3)DxwY7qdp3hkzKYa5u7z{qtimKKDHagQlrbB@3=;US-G* z>mtF1s5%hV^_C#Hfx6#~a(kmm-44)}RG;G)N}cZwVhbey-Yi>O@;tB41?!?wddvRS zZDxqXT=CD?4x7yoE-3)>OEvZ{1dSb3@_roq=SU^Jz;}I%F{&G`4&{<#*B`1e|9~}> zZ@wSIF(Vi80p5!5!e8MrUCj+sL<=Sqb?`6=)yWmYi-_*)MCZnLY4zYz#q2<24AHgS zdi~(6OB^9wQr7sVlJWo}caA4sBtL{w#-3v-+lubtkNky9?az>`xvthks2PP!bV|r} zjT$jrq$XuEs)fW$;^21=3>R6V_p%{Y3kyn1s?qXRY4wC4t-^ZoVbtnzB=wRpT+byQ zDTY-D!_|ZKdV}F=lVD7jNjww=7_KXb0!8UIWB6i6JwxNbodjUGUPkTua(^RHl*D}& zswM3x`$Cz}TZt>*alDx*ii|_8IHp|)zKd~rU_XH2G8jim7_Ki7ccyzS2ZrmbjLSeOhb^yAi+@EF<&58o?%HL8?#Q_H56j+;L{Ws*e1rQ;phy7Sl{GkfKN)n_X*nI*(On-w zlSpmjTRpn#Su{^fMv#Y&IYCgnTu@e&X%|t2X{0e(snxffwV73Df_LpoQ(ywNjO}Qw z*EDl{F=LjayE5-fKzCilc+gETPhhKwI^QgxsOYYH(T-5u@gYY;ci|hgxs-+OdNB#K zllglUQTIe0-9>kGTMr$fyY3(fb|U{b5p^%*-x0dYAZ7b*h3GCKQd^B8iciancw({- zx{D5?{J5NITmqmHbQj!FIv`$Vuv7-;b(J)DADq`-g!5`PYW8ASUnj*U(?*ZXJXJ!R zWD|&F;g6Lo_XulFUzGW=5d7nh<06KfaQ_&et0hbc*>w7VKmj%SRmo2ts_T$*8#Pg* zqy|-(M8OlRhb70YKwY`NQ=<4okSHK>_X!lmZ;5NC{1DScbZWGz`=z}B)pPFIE0T=Y zWPGSd<2yBkfsJ9_?yQxc!XczsDTcY38N>r9|1-$L{*shqZq^52ZYCQe)rr;umP`u zuZ!BEj?P#EnrKChDVUp;2~q1|1e6J=krsRteXQM{TC#BAL_^f(fFCbeyy%!kq7{Hz zB?dg*jH`7nnA#K<39CdCHPNQ1%Tp0W##+-;z@8`~q5W8ulV~j%(BGWM2DvP*9w$2) zjA1A-(kLXh=E1j{0SS{(CPk3uM$4L2ffcm(Qfal~0RScO!3Qk#6N1@c z))#`)p%sXT{3|R;+Q$i-gT0$jIeiQ4TcFj>`xZD{jhFhOAD=f`V6wZ5;LkjfDMRBxXau00?xJ>mxxbSrO5#2XYLa%8eW6U~6U3G8IPN8iBI8gi4qvmt zrv$Xq4T1dt+R0!XC83>uOxz`M(|08Y+Ub{!&^?9WHs_DHW?`S{Q^}whH9q&f%>i5b zA+h1F#qVcm9JaLW*=OL52>hp-aZkNc-_P9w0A6<`igI|hB9jiIj(v?|4p9_gHQzYC zlTn3RjDSqa8i&1~3^Hjrr$ak3>GwE&Q(Nv@?r|-3u>3U$j<#mkx9>E z%yMK>=Dj@vwAV!^SB5W#3pTiaf*Z3-aFsBU^_&q9T+2jCO?L zj*lf8G6~Bo6Y)ppg({6OKljnzq!NdX$u% zOcmWzO>-ogz{Qw9Rtxc;SabS9%p<4Zzy1{$F64y!ulQUoTS~B|(*YdhsnK6be)7;r z3lq4-8lj*yVxWWYzbW*|iR^DG%M?tfM77sdVV>@+m5-sQc9*2CU0%$3L@N=Ul13^x zz2Es$6OGD<4X|W;tp;*<@Id~K14%Jd46}565Dzd#X6zVGsF~x(k}&l;LD%##OMT3e z4H;DgF##W4W9x}18Kfhu&eiTy2j@j|8S*W9VH6D_K22b|pi%bWIkR08swoY(S`fJW z#f^0P`*0u=vG(dkPm&b^1d;Y+2!m-@yiFs}++Idqb~66nU5?D-;Cv|Q|&T|+W$ zx1(rL?ZV2tOMG%(1;vbHqU{`AimoD=E(>-q4ng{;FmN*mq^BQB0ys>1CI|FBsdeW7lq8gu^nSgAMzqm zgKD<8uo19V)0VigWHvSrT!iOgx;08aQuFR+;>35kzKJOE=ZRf}`OEb{U_Wqin_aH$ z{ouvz_Q2$2g1DZuKiDsB=ip+g99-3J;<@uGdRD|cIm;o=djR77J`$^s!XY|%IF9Z! zl2j}<>RS51^^Mv{G+3RSYHx}}zTuQeV68@L8zY-2Fzot?nu%WvVhj+ygIUJ7*m*HB zJC>S886x*UEcGvfh6u8sk3;;aN%jt;wA^qUzfh9@OAuQi`6IJzG07jp6Wd)_Y8qvT z?9Fg#Id1byHRQctqT zJ)TJdb+UjS}0d$I1>=v$NnZas?;y5}%>2FK%~g?*-@5CFHv z=OHnoeTWTzHSU?AaTwEX%hy+%B0m%goG9cqd#WblNz}IQM0_SulrsV=2>X2M*q7CF ziJ}Or`8M;^Oh19s{n(?9GKWgr)N(RrHr)jshDW!9|5kdviV@~d_h;aA$3FRV$LAr_ z{R(2kUjy|FjbpmcUQri70w|}`f*IdvM(ZmRwUIcJFse42jV21n%)vN-z-i*v%o&NS>W>! zv$&tw@YleXGBggeICeQq{kZ0ns4)E8>H50SW@UQ3F+3Lgh|y5g67{PZ(`_)G$!e=r zSyx?vGV6?33HeXNsqc*ZJyDb+53BL){u14taL)(uhMz(dMOf{`c-%A)AI|z=b{dQi zZ-?>WSLZl>_W1B(G?CQlPDN0+(htg?O!LHK1bKNX&lc3K3!g40_B@j@%M*Jt?@LJR zsW2XNQ_K_Cr9_=?mhS7lee~)o=PqA*%F5+i^nxmz4-rLIrYA+syx7qg64l#>1jurz zS|6Eeh;KZ$wlD>GRa|){+7XI7j)rN8J@`g#Hf1IDTt@=!Wd2@5)ICv0cN2TMt%r^h zd+s6$b|U{fiMki^?J~pR&}B}+!lE%ZSg;iroH6ww@C5Hw9yZY2TI7Np*eK^ zTt87R-Vaze`eMy70T4|&5f?Y)ko(d2TrF)%_@-bL#FeShhb2FG$v^W>krF%;YP8y= zp^6d*P$=;{79<{+*e9WQ{!Alr$`liRh)zi$b$h*kJj}}aN^PRDcA_c@+a~je@NM=V zsKM-Ub(oJlYvprrFh-`1UM4HrilVs0kSNA0K7TSSfZyWV^U3rSuh(vhrd!n!oSPj` zs$t9u9>&RrVHC?w z2)ZQalS`6vIYY`Y%Zu_566Md01~Cpk_Gp%It`S}$)rw;!A%rL;0LS{0pwWS+C=hxF zi^KlR@fVuZGFMb?PP=$ew>kZ{Pu1q9qzPi5oPCLS3u9V8d}hf-m{EVIwEKG2l=CnY zW68#G{J=%}a4AFrk3tg$UP&Aj4WS&OM-=0F&6+6n;9^J76dL`_l5JP?7^5jfq^1lv z2wnixjxeVA7h(~C2;;AiPE0{D9(Dk$n7~=_Ws*y3v2x&t<=W)si4`-zgc9y*5m_5Q-iEam? zbK{DGt2H0Pgr&`EKFG1 zQTBy0p|28GzT@~Wq9`&Bwc_wK3-QCR59|l$US0wu9iHd6w`SFLIc$3 zwvwMb2-s2!>PrY<5H-Cf(YyeGoS1z?g+IE`k`m|PLE?lM@{3WNb7|yG9Ux?k=#<1# zA@SYMi=l>u%)&{Ld9GMr63qJ5$hwJz)dz1gV}_QpB0i+v*bsk>UFfdeY)nLx;`8ja zsWhSuKHR=gq`Wk%>x9~d8lyu3hh2p)#EUPiuM%H+A8t%e!pGfHjg2)LqL@pgu7Gh- z{FQn5Fno-S8eDNoG$y`uEWBmVgb4aB=c6bs(H-HrCfh5~$i~%U4l}n0X5Z zmW@^F>mVr&r;wn6FTz(LUY+3ZpyA6_)GNd7+WP8cQA@zd;p^!m$uFDLE2eABs%TSu zufAOqd2LrFUz*3ex6LcNDyCGP)agv6;3W>Y-?twRA-h?!u#Eep7}OD-N^U6v zCS~)^s7tS!Y%wV0RUtAM zgO&aU6u?GF%At^VZ8u|vL^En7woP!xNl__bqO|}GQ7!lp!$T&^p;%H(t-$hv1WTuC z%Qwo8izmOGnrezQ2;V1v4Ghc$e2Oq=u`s|oGuD76S`ijBi_KqrkDww}xOm|iYqzJC zEL=Fz7_LmfkC!Z7bj%{r%6TGzFWJhbo5`{;wJ8#bC{d+fKf1K~(T4fL>$#sI*LIpX zaY^^gQ;(|dY$w)$mU+lZe{Uvkw%Y~XTP$Beu%p+PPF&5^eUt5*Y_pnpJrU07s4*HZ zjqqi#;fW#uNkA_5O?C>bjkL$MobhCCufYAcvn2daNwlW$91nEB z9oLVD0+r#OGEj#1e=;R#kTSaX6tNeKx8po0_lmd9u(IbuWriVUI z?>#f;6^uEJ?WkmXJuzrfnWYU8buqkAjc#U*1}F^pNh?dp9Ug@uzpo_@@^$6DU_8`; z{3d;{+7cbzu+W@+vE|AL1%O5b`}Zx*a8{SZ@>n##IU)FV`Fe<<%niv>?XdHt2m>#<3nc%cEL&Xiye5e&mxD$bB71YX zh8(x~r5f@DK|=;jd>DtkiZl_P%h6%A_{$l$x}T`$Zb$*>57oe%tf_og<0Ck5hazA`*isK;cODSj!0Aqk^c>Cvefi zKGT5+NcX_!AyK2%#D>2b&(F{}qDCySL(WC^R87Qdscqkh_!6QhX9U)CkJnMhzO256 zD2lL}Z!_m+`U%W#vQ~?~hgvpHcYC$?Pcp*%>HbNa?${@v?)W@px__A1@YlcxGc=Cr z?ok6?nt;bIm05h3c<`NTj}S#UBej~vAE;wrR)0$rMOf{DSy-#Z?|Xyp#OMc=xI(_u$&Yhd>bjl(QDEBG#D))}!fo@WuKzBBR!q9{im zR^vI3I`(Dt9HJ<~YA43yrh)iy)(^AOV0@UW#Xpqe_}SybA43yKo$i!(zm-;te<{rq z)6B}ti2El&?Yi*kath%~7_$Hlk5UNf%=;2j2;a_l(3j>sfxVTe^UczI!}s`Ai~kJT z5sEvGhFKJW!z?R>@QWnSPUi1@M2&pv>P%y7x}c8krVw^p4;`ft{+uM(iTr;;)V+{@ zM;F`%Dcg6e$c3VghKDk*Rt*u)l zJ`ApjRuzyBq*7vfPLP=3-snCQ(}^@9r))7Jkm!^oQkUAZPlJrLO1lEdZo}eRQ2-#; zGEY$V9=}w>TNOOKFW~TuZ0@}*DIPxpX?d0Urgm+TzJ+Rhr&w7V%*wwTSSgkd)e7PP z=I@t~hbhwb_`Y*hF52q5w+qgP(x$PFO6)i&x2`l*c3vJ&&6ViW3Ht!HAC z(`pkhLWI+<5xa2LvZC&XtSGgwrw$f7)JBdzmRDsqXGM{Nfc{cfv!dP*?6CYC9hTRT z!;*3{L#n{b&~pfh^7ifyVjTSH|I0GYHNvYkTOq9^gb<|!Kw3W=G&=Aje}$v_lu0c| zi@XAZ;|G}qhQ~g+1$!IlOxXnwvytf6Hr7@|G}8D^O@QyRhMi}m`26`OiU@d0pFM?@ z!lTd(gRc_@MFTE}8!`+`^6f&2c@n|{l6zOk8AC8cq$U?P9bUEA4ojw)8e%(vu;hLI zS&x3WCkNQiZ*g+$DM`fyQ5PBx(6L;_9KTR=c1{pmuxR~0%NCbBub<_DCDSNFWN$_u z%W<1usv$o!Xvm<6KjM&|L7E7MC5M-oKbtYCFH}1CSdLwPsK)$!)|7kpL1^sHIA-J` zz6P+Cn8#oFV_>O+GfAjUt`GxDbSsF?4Mq+wF~5NcOP4z$j-|x$PbKRYGjivs;%(qB zC~NFFmbJUYJpR;Q;M7Z-1m|Q81x|EI;L6}RfX@gzCY34sQ7t6#a-NUx0XinD3|ToW zuwto9%Uh+}_XOz{){e(ew|A4&O9mZ(f_OwHpcv@52krF+bo>(%jOj8feHoZ|88gTK zmncw_PK${_$3Mu>I1n-cpyPi~yT05%MieD+pT!nSJIcOLCbZv8A&wA0zxO7JBI8gi z4qvlC+W1NgA4$=LhJ;KT0Cu~9od?C*w+SRJRfQheC^Nq?r9l?QivkDzuP*1L=k zdnaR-Z@Ce6$w$TJuq|#5DDL>MqT$2v zjoKc{!iW8a1lq~`{S{I7L>=A5hjm*I9pS_FeVNOd%QJ_)h`JZ@?+71ekg|QZ!r&wk zsWYD9=i`GGgpxP(a!wZ!Gpkc4D8>dRYERT*R$qM8aI!vsdnT%u_O z&4a{>b=TI&BjDYnhi84Se7$p62l}ebPk!J6Z;z`S^2S|Ye6H3wr3KRg17ZQx=&6#Q zJY?7@CKQ+$`XH#65O;{DInnr(%F1`AF(uUTAfZC&cn1{fIvT%I6Nn=tIwiMMBz(VR zF;s3^R5S+xL~_>S^sv2F19@@qKz71`7#Uh(K#UzJ>ch7hqF81PipvA&O%z9*sEPvZ zqJ*X>)7+e{L+NH@x=0ghV4H&nwu@n4#qeiu4B`Q-WLMvEqb)*J@jjVp5-o_o~hHm_v_O%v|>8Z2kLpc|V*+;Z2ebf61k;k6dFY8R z5qHSY*e*V9oiRhi>cl@|J8X8A@18?VnnGnJ#t$KiG8h;92Hbw0K)m>Je;iSi#C=Zr z?sKSrUyfH2MG=nGnrR9{z&+=-f&IWer(s1YaL;+b{P{-b+8iF*MEsh@Yj7SLt|ScgsnY(c-y;(O_TbJm|7Xx zGrm)*doOD^Ky|=VT5UoD@F)~-dna*_uQm65P7m?6G=JYBxp!URArj_|0V4$(sOcRt zKRs)Df2U+N{A+sumN@ZU-hWLL`IE&i!u;iZDzG28lg}>i_I~hAo@#nOnDI7sOSIp~ z58+a(JY&^w;_~wn$JPW0^0Gs`{(uCCr{5gn_(34^XdK<3Bo!-;LL79hruPX!j6od! zm@H#l?7Rr99XwB?43T>vc>dg=A%g4|;}Fj_$=(5tms^kH7it5#EQl?T{P9_~xa4`| z2p4#sMj0Y|Gd^C9+x$`uc~j7kK@%t7kk^wY!ol+$*7UxaajRb}>R@>(0R5pF_!icb zzQpn46ZnbG#DOCh;Be&B^v0k1qq?b=n@GG)))3WAbT<&48%8faxwCW_zC${H{*tI& z-Pm3@HBqV6V@G>%Y`^sPTRzNWrHdUA^HSjWrxNwY7`byiF@XMAC~E9E7WGp!K2`hp zBYz=N`yV7>IhjHs6P*&WGIxGFGeYM{P0D&y3&{@2lQun|^JJ4D>xKm!FV$#ytEB$( zAg#j6aT03vCnWW9;$~D|`!V7XU9^tkX1#2$K%7gf%`MfaJyXg%{N*9e4;*Oc5(SFV zX)*DEAEOVAAf#k4HWpIqTD|TU5qqW(gabQ&9V2wlVc7Lg#zhPJOotf&JCDypqC-~_8~$qC zkfCuH6GO?%xyYWXiFhZq?K=_gAc}HEV8zbgOC9^NdJj<)VKv`o+L?X=Q$?)xy1z*+ z8>hRyUibGIVg7VqhSMGU2Z?iYTQMvvAWu_$s@V*l93)MJ0#-oN@Ye9oWNH&%w!`a!^%( zXDdx9IfLejX~E5dgr6>`UGZp^v9OECSQu$c!a4M;%`ANZ-nA>ubya~B-qD!MFmwDA z#w<@M$-FNirDUA(pwGTMfvqFze6w_4K|FpXhnJ%rp}6DYyOvUdZ`3wYR!YguB+yRg z?@dJA6LoYqrKH<>=qRP+{UpIoBt&7v_4y)^v8$x7>Td!^wY(j+kX zzxznstkw|X1ERyhBMN*Fub66WvDT6sDOV_Qk;+Uv#K#|#jnQ{zotrJaIb6^|yT zTkU9VHCj=xwQH4$+LhIj1rgK@h0#VZYa&s}vn?un;&WcD1!6Iw~59)-@UkWh65jiDD^DM1|(ET}ULf-07+@{AxJz!J|w9v0J#*0WWv49Hdy=cOBOFWW|3&+ylPdizTGdDT5gJosaR?^)}Bbq7NH8pCq|~^ z5w;5usecV*t%b*_0J6@5srqr>3ZwDS@y77jn&F9>s0gqC6OH210E4mK>EKW69d7wWB>g0iO+pcpP*@KRLO#Cn%8r*;|EEwA*v3<4}LO8ZlLaI zl-tKl>UN+5rO`Qlq15^1AhtmA8?tOM$sflni@5NEG|CX!n<0X7+~${R$Uh1iGH7BG z4*7pb6XE#5@Z!6FVT|hbs-pzu*!72M%-g&&BuoMzf~#=M$VD6ww-(>UU-<*tsDnR} zP@QWD0@{e~cSPq#4IY|C4OXV0m{jcPEo=<8tL>pyTYQaT(u5(L!-S^GA3=js^7yBc z`8-DM99@hdd?CsldyZv(;1c1FTDVrdA&I{NsJBBTqj`a_kIfa6Xx2)iQwmTE0FM?L z5rw2eWlySw*l{|Jr`dWS3du@CRuT(lP%72(R!Mzzkd9$3c`@qve3E*}h{782i1!i2 z5QRNxuQ!OoSCe2&*E~Fs4v4~Ahyq3FHfq31+?=6tph5x=g?CfCzTDqM6eV$=1rAC( z%Dzx0^l9SCcO0J}iX!7sD-K_?5K(wjU_XE;G#Cd%6b2%!ti^bLM%ht@M;W1e z3WG0jEv{MEC->m-xxWWLbNt7|hQAhnn4xjl($M*I;UexLk}H--6rh}}w4=de<4dMz zM$`3HZC$-OLU%8LRB9gY`Kk~X3s#e-5=A)@up+MpsbgQ0JB%obu$pgj-_I!6Jv#w; zl{GngKN;lJXikTA=OF&*- z$#~GGd!E2H5Ouy;K2ecZ*P$JuxZ^{QhP=WzYI`XQdG$sTXeaaccB1ZyI=YLz>b4#_ zLSB7}B-n}kKTg!Wkbg(WD}$8nyA>j@h)8WUiYPfR^Bi>_&rAhDuU1a zQe4)MEABJnbG4``v71gL5ImqpAC>&%VXh9z0L{dp2iG=6Hk}CnBCj|1cS;odzB5*6~R3kGrrH6$Q50$U^gPaI{U>c-0ClqlybKsA-&;l^}b z)E*X(*NTXyXt6OBwZhNRsy0<@Gd?RAZi%{RSOS$3D|J(*de&uN}cr<3~=C?7?)rtZjm5p z1F7?43#17wiNT+>dU9g|SW9Fh(0lFZ8S_MW zIo%!;peXV6gX+2jbFcuT&zpDCrp6XE4UcEjaQu-uGiJ=YX3LAV3_{g4m_xXhC4VT= zXERdg+BNjD=ZrAjEK{dTk^{89uKQ zBm2SCuXCAMQJ#+N#7v8JdZ>??7wu%chs%UAYBWp#>mIV`)V5R%sd`h$!ZHT_%NAT! zZjhwHf7w^uD&a!5I_e`;b(GpN`C);r9U}+D(7|IBwa?FL)T^RsGr?6nN}A_xIEcU} z#F`tZsyop!QF%x<(V4M&dEZw0c+wbCFOaN*FkchIY67h6+sa{4bsjpR;+EhxvEy_N z_4!&reX2c79o&;(46j^gMt#y|h#PWOQJ)_Q-kd*(oAdi=b1ny&KsCKTM?8|dJ&LYC zPBqTWJByFkY^aU2$F`jDWNxnj(!p6H{7)oWQy`TGtl&2C_e6opa2^!nYDvGz&^Yd6 zou$Ed-x3y8nmPUyq9}>q04&Dg#EY-A=MqIp+~<@AKau+P<#-8E6yaDcm8KXc)N%S% zW=^^1A)qb{3rPXg#m)jrEnH1=ka?8EUDhJRV=&l4xUOUq}8qKF9dmzGNc`vG)Gc4@KqgXj_}Oa1Abwakt# z`7m0(a>i7@iI>T%^jb4n$gvA?Gy^hO{!U``Q8>hb{tZX>S4k=iQDJAgR+joH;>#ps z2Z?*egMAo-{-5@}JDI#U;**v?5c)%<^L4DL z{QdZ|C;;RF_T$Zd`3^{ewyh?M$+3hPM!j7^;&!r#2`5B%A^Tyg9xSsKoSt z5s&D;6-zMbL3;(lE?RkNsYdOYQr@3QFn<2W%<(@E1&Y#XF>w&)w;3A8*(@NavBzt| zyr-GtyAef6+-LJhqyn-plopO4u6(s{C{Yv{hgxw=I}(ICex1>rTiX!oFc=35b#$#{ z^*JPlL~#1Ha6PuT2!?@NLZtc{z3L%j(OBq6n+`mU3FApTIOKYoY4*P|L@4@_wBQAe3W;sdYM9R;>e z2s)e#+rfV;z3#~f^G)bK(S)#1ZbJAx#DsPtHvBcPeTK$iLdPy|Hid0K5h{TneeQI9 z-DtBi4W+OII99-HhoY9KeAk$63#dmlS#7l{>#7MRR2+vpBUVB_nmF~Hkqd~T9C=uc z=XC1Wm(}G&QH0e_jK@s_k>jkVW~af(F;#^B&m7m#9y$IZnn>#Wr(&yHX+`*}Xr7p6 zR$iLjMnUb$S?F?JVw*7wkm@M4Y-ZkE61 zTek)hBa>S2?b_(5y&(KPx4E3;1FWr~>+JZ2^7Ur2PV8n5DulqxS8$a>{SFukLba7w ztvK~mO4#g1Q%XQ9f(7(76p(SCy{OtQBfq`qN(t(MU_pJ|AgE$#H)BCOfIU8hJXC2m z>uEPP^wVzoX*W=wpQjSUsV(j1rlbruB;i1<|F%f9g^c13zH|{UVjY%;#|?HcRam+y z(r5?g1XZWTW*+xK@x+K$r#e~JR`*S^pWS23?&+JPNcD%0l0@`v63Do(swGN(I6}SN zFjlRLS_2akQ2Ri9szk1ILnm3CO+Dc*+5bgIZ@t(*yOu=sO-LeAJ96r9vqNp<=;L_# zYI711ZSClXbv23TmBFsYAJEl!Ik_4s2RNh-y!7uvNR*%U<{-wwud0A^K z;Fg3CqLcu@?L9%G0}t>oIJys;)RGU_|2*qazv4;3^QG2OPn1%=%o=f?sN&POhR|uY%+T>i#>*?H49>I}p55eU4u!b^a}g zEs*?-ont-C99L{{$@4l^E{rdYGDP-;Fuwb}P7mU^XE11DTO9JJp6&T>#mBvA34Cgvl*d#3d4TCE3R4CC->6vxxbe_ zbNp$FKGuUG)g!lKI8qgJ{$oUP^rV&f$}YqMXrNAy})aV_#O!CyFAh z=9}A|f&BmkD{F4{elifO*W}o@9fGwB8boRn-|8V)FC+b#W>y}e=te=^LkQM&j9CuB z%DgWDf^|3JL0^dT1a=ou=bL30Fh7TkG=`@qMHXsYsBTCUp&b$>sfMcck*S8bqG@em z7`dIA)zP-dSKTtc-!?O5Y!(5QQBlBEe44A)-f|=Cu#bw3WjC}V6nA{Y(I8m(Mr|!+ zL9o6|0_|k}{s&R_L>=9QV0Bv$9YL^uO%m)x{{KhRy^w!L5G;d~?YmWSO?1v~jKNQs#R2L)_>P1C*k#v;$ zM#6@gNLdwM0T6Zcq1=6KL{_p-O5cm@Bq;eGN03`d29gMK+pE&AV-r50Dt&{Ix@}rk zrQZk51v`!%LPJ%0e2?L7@ZYf*=%6?l8s0yCRp|}PSeQlMMGWWhtV-Vz!zEXx?}(=( zF}F4S@d(?3kjlX6sI$;&^c{8b_*A3sh}Ef70In7FVm(tkHD}oEMu8hbOHXR2E{5a% zOvnltm(QPt%ikv@DKDQtyN~1T<9JOt-g3+5dsfYl@vizYqU6%~*rN{TOAc|X`^M5o z*di3PhxPNHWX6*0nZjlMir90yhJBsAvuIK6Vru(MLRP%SrWyN6+aYerUB$lsJa~J4 z7H-c!q3yXG>;@IQe~fsflR=>Z`cK043SdE;1@w=4gB~Juo=?Z1uJ#a7pfcPvuMjlz zGc=AHYi9xd)2Jm=c$`NYf!|Yzq9lF;&?=V_FTUJgL=+`)pHo18n)>(UxJeX6I95xg zDc}pZlp_NB0bGi~@C)EloCWmXMC>Jk(}5|@0{U-fq;C6yi271olCf7FQOD=L5p^(} z*ApB5io7jD<1qAmJpO&uoJoi&^u4^WNIg-9;QwTe1c(#+=i#ZDu~CjVJqzgn zv}88?3+VryIPqOt{z?=@M3}#{+#1*qU~sZai@hJj;7|emKW7{qeUjQSIL}7QSI(H~ zH}NugJ#lM34>@)rj%GkU&v9=I@ipL5ZyAp67)dG&Q6Y@FRzUxhAjTj}wmi!i7dx-K zY)`JCQHIDpFuCTEpdo_nPs1TzXp+4nbp|hw&k`SN7T*AFG;3GJXqmXEd`)~^I2B>O zJcuoj{E94FT=Kjaiz~T?Mj0aeLdiAP1q~TAaRv_g8q!2~a*e3gzKj*nPi0Vm&RC|$ zZH!Odfzi`wq{{V&Y6pHZYf4|-xYG^}%}N|HauMHv*|I+HM|cgUCWOg(gjq!G-%28N zGKE7s>w=la(%Z%&3t9$3K;*zre_yqly!3&O%XR&#|c8Me^~d{sO07 zK2CyjvW5aDIwf$sc8zH^q%vhas)b~Sc2g4?((xmE#=L z?Qcoy<%DXeNd8W5!aW{cv|?#CJ!r2$XhkcCFV(0$Q_4G<1mo-NE+7gNrPE^KG@GYq zXdLISfWXD+)UGf0%ZZ{S?z7o6QUTc)N(*a6Ql38L={+r@R?m3*Q;J3sICK53BLa zrH*}BjfkQMtDP8+n+8H#*=@#7gP|>|@V$Lze(APPnkS~2 zm6t7bo}lhwdfC~GS)N{&d0#?$*)-!ppM7}(YZ7(7Sw2zI%Pv4WLUG3jd@a2U->A)| ztn{+mNT8j}-&={gC+g^KdRe#i&{2BXy(Ga-4Xl!G-~u0lApW`vturd1-Vkn@w{rgEh;m%#K&;rlIjMzsN&xp z(JGPc@s==OdDhAcQDnPGQkS0~><07Ch)zi*bwxM#v}!v7F|2%^_~K78pQ2V{_;T^M zCFOyW!Rxnbh=&Fb@nRfeiq&G+_QgRwz$Cg9d00eZ)@xMX8-Q(}6kk=EXf5Cq2?Z+> zoTeJhME;Xk@M$LbxeQjD|}wHwh`yFImJ;lhcANaundFIl|km_?$M^TfBI63duw z#`lE_rZz#T5|P0*Q4?)8MkA5`6}6_PU{E3fO#5*(RcThl3=oPl`*FwEuR^V7hMXuVzC*iKT;Ds}O3xK_JT9~NJ>8jU5e^qdvZ z@I*}%2^fg8(sZc45bLt|<)FspJSgreN(rnEEF_0725H)ANZPX(w=#&dCfPO8p*Qqvk%GhA7cm)$OfZQ?{Td zKn3yv)XuMb&g6{2>+zcN0my|wH>Ruk0G9^4G%rS%<|1-wQXXJPVQU#E4k1zg;6xDP z00Ox>%Q)8vuhVPA&XEv8loEiQyFO@i;Aviqqr29mmg6s)KmS7G@nrt|O9stv7EF%F z5A)dLbo-e}V;`RZjBaN`(oc`BhD03E_FBz{J6QAir^f40V!&DY#3+mw9<|o0>5&}G z_Z3B*;>u3((R}QPOSX*7yJQPQ75*S-UP~Mljh4)t+9ZHLoO(Hq1m|Q81x|EI z;L6~6^wNllB$X-qQ7t5kHP21;z(kT&hO8VG)T30U<*m|fBS^QfcDw?0J3&$}854Om z@rZsvF-&9++UpG_@@^80&lU_hX?GC?iqdH@F(&fP42=Wf5`c;PG_~u?{U?Z`B<{1& zM`=gd7s`YlCa!$P@pYmoG7h!k@HGn@Xuw3?5!er4A`QmDFp+_1F>C4ZZQkng1{{#c zof)Bf3Iina)wpJ1pXt*H6#ByFzV}&ROMefPE+lgQHACaDrQMdVuQtWO1+E6pJ_E0L z*i$tR2ZO`{BRGsG{O4iF2(0+7XH&<%Ci5(!D8g#K$^0p!AouJ7d{@?F?EPf$T`$V% z(2nnVB~I$pM!ePIyP7mlOfxGFuGA3JF0Y+cr`|=BqaG2Z6>D`7C}5?k;aw6&*fO@G zv2gXw@yi*r9N(3BZ;u=8bTgMP!_)HUrC^y%-;_Xbx+jMA-?O@ZDwpU1O73Z#jKUx zR!B!cuZKvKohaf#qV9zvI*L*nq-@`|5a>ljYR^$b$-$SW%liPm=uF8^zNy9~)@kU< zIO;xxXc$K!aThu&1NB05QZcBPfSs93iSPP0m$Pf*6i{q(6?gqat>$~NZuHfh2W7!E zel4zk$RT%)@wr<2lu}Fw4~P*^qdQA}@}OQTEr16o1DGgW!RZj5bE55qykyyLbC+9H zVm>lR%n)S04aGcTS4eB|;gSs6DWnymi&SH^& z?sR?KXtOds-WVPepH{9%>#FstfG1TInr*V$YKboqMyP$wBIu7WZ^G}vgw*}Fv zF#(B^zZhi7dM#jZ==&K_O1}+$@O;lr~ z5uh`n)#>5(v}gc;Ny3+drdti!^_t4ah`35`9VrL|3!*WoKr7lC9;?*X2^7`(S|vJt z)v9x1oR;`SZC$+~+7czQ&pCfpT(Uu6!c>jy(cVZTRU+anrdDt=(>1OQ?~e?TXGdM( zt|*vkKQ8)E)1Hsty}E%dzrir=i{T&}Oh?Y8A+GUz2l6mM>xqto{ML3eW=JHW2B0&+ z7W+8J8ltWGILKfeBoqy{ZN&oDsLj3w7aB1WgY%-f@v@(V*+wsnqCo`13Lq);#z2>@ zO;AHy=D{mF^ETox$_7{o){NDO`(}=o+lM=s3wQ3DxsX85%{=i_M3DJKVxR9Cj`B{x zQ7X?txje}co|j%T<0#1mLGQn-ILh0CU7}B+OLQx_MCDveQ(fhE5|8B17OJcKBy6w1 zMYprA^0!H}rtljNWWZ(CH;Dq3;r628I_{wijpI7bSy%aY)RHg1j}k>m{03ab?|P>m zopMVKq`fmyl*D~bUFA8{zpuOxA&Md#tEJKu`+`gN2LtsAm+l6`FL3EDYUbJeadU9; z3=&NuOdTJ#zpXJ0P1=8;PTA+OF5EK=0+aXQa*o{bz$8BR4NStcJ)PL_p9IS@G>%2$ z34jaVMEshxX#;-CFthEo(&W{w`2bAS@!zuw*ll%$1LWwKMgGL!5`$9<`X9NuyH1S_JtM=ns{@G0K|C_ctEEfg=~-b8L2JAK*{@vk$13i%Gmr z)-d~k=w3i{?sSjA`SX_!4_BuIvS3LBl@k_DO^9pCBa<)r<|yI@COusdnCl@`fPX6C zznqafM;MpG{wfL|dya)aD~EH{Ba-amCU=deB~h z=$KXpTdGlerj++55{!?71jpdt69tOWX)*Dk;x`!@$1yk{_O$yu!n~-N<4+-qlDN-i zdq@RjUnngcPF(qFVJ=Y=8HZYN_?iW08Hh;zDx*2Kwjm;AFb)=x>RM^+vq=nz;PfrZ zkq7d8M(7?D#FQS!MGO0c&1q~$r9^xl5>q;p*zi~5iVTgzm{`V#oQv$K8pC>O+jk_}|*Yhb$!jl(QDEB`Jxi_VCZ@f<~*`p(E9q9{imR^vI1I`(Dt z6rw1?YA43yrh)iy)(^AOV0@Tr$A2lu@w3N={~Jvtb-Gg#)UC93{FO9MOfxGlRc?cz zc3t>%Ik&LIm<8B(l=3Dr?@P!nd>!LKUz+m-_8OwjH%s?5-#&Wzr*oGtJ!R$cEqbM= z&4-ApP}7s5>S*j}42jCAL!yq}P_;fX)u`3mtu0JJEZEwVv#i|0kC8w-nZN%=)X1l<&NL>c3+m`Fx6qPO*lj&@lv4Ozl3*wD ze}t%eA^(n23Jp@W?^a+Ua5FYRJtRMQ`GiL&c?RbsLKF!Crpoatp{T;~9Z)K99UCMrnEl^H zaUD$~bIKU=0*OvZBz46-GgXILj*`;jQ2)-~s3DymJf!dAkW#D_OOJX%5Dze6{s(z@ zK8aONk9zNRou)_Otf6#6tx7zbai(mmevx=X0sF1ANIW-AEnNvqIJ=9(<9sYw8$Q*{ z<69a&&4^Y~ItgX0?ptpE^A1mdy6}C=&D5p0T5jS^h-lV2u^V?SiRnj>#H9B3lwZF? zZRF?^c(r765)(NJ=&W=#iRs#4$7Q=+V!wFi_)ExfN%?glmEC3JH-toaeYXTL4vy>& zS;o0Wcok(UqLhRXqLctc={ti)2ma(vIJ$S3)Uue0!JnfaIObC=c=p1l6#Tx%GfeEh zGql|&*m(526GuBDC}?@Brow%!ap&B>2#SD!DtP+6#{aOeVZPFivM-bgJw{ylj^ocnQDhuy#o=of zI9!1Ly)UpI!2cSIgW-Pz@sQRs@Q2;4dusZweNQO)kC#jL;5q#tUTn=s|B^|u+ES`Ma#gyf-%dX zTABAHK(#*1c+eNqJb`_XsPoOT3)rAipjro_9ih16!-@vg!Z&JrC=06fFbTAi`TKRE z?uk0O3)Skj9y)?*{gouxiTwXW)V+{@N5M&hln*LR>JD<@~X*E{M`X>$^f+xUQ`IEB|u~5gr9})ayhsbJ^_LzJw3-Sl-GA0>qK9_ zc^DR);e&9!L;kokjL+3-r}SYuYCu$g8a-0-lLyp#t{L?vhL3gMrK;B;-UiFQ^XF9c zy_-!c0iP2jUTnwh z+sAd{*H&7hY`m0)Dhz+By)b-;DQ(1SzT(m zP?D=)sXl*>4$?>!pJ#8vYR}^`jgE?j<+PNZM~*x3cgn0gpW@3{cD`@ieGq0ZK$xkb z^Ef5Zy!ysH)f9P&gL9T|gyLXO9AU#)wJttUG%*2n6Hcj)R;DM~OGOUjN!CM_Zrq7a zB0|~k6nlEtaGLXX5iKe&LAf_c#DEt(G~+bM-N2JaS8- z3ta8bq+;`YgEmJ)HxS2(EcNUDr?Grh-0U$HYJIPc(=TQnxD68`p=aP)j=b?mC_eX% zgo4Gji4Ff5a7Bj3u|hoFp!2sAvnEAaVC9HMGeg^z65q`l4^SfTl~$n81w0A`oxhbh z$k(6yO0%b+bDGOqUlK+B zbg_#tf5EQ@_5;9_?1FFa2Z1S6WB#idw^O%8J1}JhF00B#R{etSFCbw_nFaJ%Hd`}- z$lVTc{{u3D=DjDx1B9Edl{mV?C8=0*6zryJHRg{GVhn=AXJ;AXV&_GP?HMFA$`H8+ zW{{i{G(?d7^KghOO|tJ&2FayCY=Pv@%d*8K&nua@GDv8YA+j%&L9!ue$e@Yyama1b zM0f^Chc)J3#< zPi>%HZY1$KS;N!@qPw2x+_@x$YRrF#Nl#Y_534}dO1Nhsxki;;t}1rVmT%~Xs4Y{O1){oEWBw{)&lIe1B$-^x2;FlSJcCPd(ZW8{ z!3an)!RH~-q>aRezZ$3iAA4T{W=B!&A4tLy_FV}}Ls%wbW|BZajYbVgz@Pz4f}nuO z%}h_`4tMSy?vlmjxjr{Waf!R)zC3;I%M(}JK%W~fC<=T zvidQmD8g#K&oop0IObGk)|kJATh^L;c8&Sl1!2CqZz6N2KBc+Sa~E^Jnc1+{z_(L0 z26MNl93Q!W#hc14?qeQoZS5aSQO-y+-Qwu?yH4mwFhvno``{LtHRjLa5op~ayT<&( z1!2BhY$ms$KBZgGa~HQbgW0gxz~U5*!7aKg6CZg>cf`thE@w_{o#zQmQI0$^ou|be z+p;>v6h&C=#(B&%xIdg;hh@{y{xH{=zbEy@lyr{l{o%{WMPgrfY6o=>tug-&wiBIY z<>leM6{t-IK0Quce4}7iCN8FaFClU9OM-`__2mid^Gu!ZmgZBw`>)3Q7V;w!cd#3l zNL-{})MQgu;^G}F&~EJamrUIkb@VoIvDbR&Dsl0E515v9dG4?uQ};vuT_rARq?|ol z;qC;U%rKFfY7|kpi7JZ|+9WRW{-oSRjWwQ;xQO|E72Hf2nCP55Yu3az_#Yn+8m0~D zeyPMoO1HB~Ts&fMaMZ7iw5!`HZGY2Lqm_}a_(-;a(1Vk^`G<%$2$++4uGV$uiUyMr zT6efIN)e5Ck&9<~uHu=JxNe6EHy4M&RBej`dQiEzc4{9q7O3U0Q zHjFnqwNY=2?^WyG=Cz|We>2|nws{TS@3z@%!7VKQ@Vr%x$;nE66ox>C+w$NdxQbU9 zxvEobRRh#BzJTLu;lR{r$E#b%y={$JyRy~y@ST+#)~*_!r#kLn9$uxky|S|fe87D# ze$Y&C=NvRN)!6Pgy|HFv5>oq=6jjFFL8>VjL+qgASwdJ7w}Eq0O}*(kI9QT@_=l47 z3k9j!4sL~Z!G5YFYU(&x0L(#oT5~lw5InIJ{iXPNeed|%H&U*FHJPbM`}3Tl9zsO zZ~JQ(X6{MY!|zEjOB~#y5@Bs&Jdy z@Tx|Ath%)m=F1HP3K@sRC!}wkJl>wM@XRIJ?q}iQ>;xNzH$!yqS$f!2m>#C)3pLS& z-(|AewLU$JCmx#odYT^g2j_|KYMKat&l6#6Y3@>!KiXV(AyKP{dz~1^Rm6+Zj7yEk zD%hEzT^53iQXD|L$9&MV*C9VF@f+|O8r_i*DXf&$mUGWQyQexahGKtdnlUMMSxGn> zw9BJ(k-H;k_YqD*MA^TbhWId@?0W>-eXJ8(DEU{U*^-i%HLXmbT^^;2>QhDp}A4iOFmR_?HQse<7aXJ8GQ|nnYakPku%G_(_8e# zsZ2t*y@Yne9c*Kv8o45bDATo=&J5LcF8lswA*`g_36C2|oc>g@ewQFOjw+D#Yf0AB zb0BMT*>`%?Uf|rzwJbOzYb0={Qv%P{t`?HZDpUTWS_oGyGO67HlFMG{5;+P&a=-7S zTZ|pAC*6LRrCu^5_YUTf_gcEiduNDmAKL2=B=_(Sxh#JWl6weKkSL8F6F_ngOwkzd zBMy+r#ojdKys%9q1lEJlKUnKTGS^_NaOn`CDL=-^CUFKF=oSFjUy=feGyZXGqy}%)jPRkTUOu36h&Cg_omIMejLHNnW)4Y zxMi&)WTO(lE(r4-;mza-)TeX=dhX%~Utl)uHE?~3#^4Cu0Slwp-5s%Vp5HU4wifwY zrYJ`qna(rk!>$X0y_lj1tKB${nFdjb>8U82CWT7;WoprwbdGFP;U_7{T~Uc|B|jo@2b%y1 zR3iPNCY!QQi91=K-PrFortXV6dW%ZzwH~@cCBB{|*p2*O!_@tde^;nPjg+%zD?%kQ zk(z20QLvA+R2E3FK_&7Qjoe6zH6DZO4IvaT1B)1YEjUnz*G|7;7u7+S2cK4is{^_tCh~uSfjkp%G7^ufYw04fXjwTil5=A$fd8F; z@df9dyME=x%pI|n`<`O)2xk`Gtzoekrt1_Z9?(+%lXy5OB9)k~e|InRPAZO!*Q-uW zHJWWGSsO-&Q1tTx>}3*6GJ^@*!x1x@AdmpcaQ%@LUS+DfiOa4Fi^GX0LWg0A>8O(O zM!@-U1K{}a63UtemS0{!IYgKRZG??ruhd4*;b*DIQwu?xaY(OL1%w%B5Nct2t&Xv7T?4T1Cm$<4zeF@={CEja zE#D?dASdxpKyXHUUG(;Mz%#4?{LI5eu=fB+o_V<1Lz^&CA;`M%Ow`L zdW38IjuTrLmcEx}OGPQ}UsTO8bhY@}trZY0Sh$u+5%{YoxdAVRqcX|6`#VxgwYy)BTO<%(%ux3DU~c zRING^+@H31qSdG`^4k86_Ts5prCQg`4g*4PNgWWVF_J$0spP&`kQ+xB%m%lT+^Oe4 z?ofi%$hqo~$m|utJ)Rmdn-hOY5lp8Pp#p*2p48$US(VDKR14vnQ)X#c;2qgpT_Q?B zyyKIc^o%j(N2KS=Sn4I?9UIIetqY2kAnikY{lPoFh6Q6YH6ujpl}tgRG&?rlYw+?E zjRBeBfOq@=w` zY&5b(@l+Y&F&|4VyUb$25gf@B<%}Q`m^I8D+xpCdn4$=)`9AaOw1TdtN)_R)EdvIP z?K?QQY{@eHJx}X+1X^O3Y2Pz{`MvtqrNwUmxzxN78q{XYC&2x3GZRC zRzxG=pQbjH(A&(pt%Y926y?Y#)0wX3j%`_eK2sE7wGYme2@!rbk3j28*%09m3c`G6 z`Z+lh^(mc+p1U~HJDCl84ZJNyV{oQLLHQcbua7i3bvV+2!=B(WR5+|a7lX=2h@lsV z0yiS%EZ<_zY%TB`Oi|AGGo9rQ?%0;qUou4zR=aT)GYvw5)2p>?niM3smYV94&X5fW zzMWhm_6@klLxSi3mudNxhj4uWP@DEIdR(aVNWrXx1gCz_KB_qUvU4gUS7Jn2dC}V7 zoEZRd`@(U_7{T_M50BtIf?2YY4-NHG1PCYQ1x!B?QZnett zD>jf|-o=!At+B=#H#^h{5T-+LR+s?`=2v6DhcqDbiPN~}HoSLH`o z@1fNsH&G4|ZBSrNJy%irlcK?7RF>y`__g_KiekizTp-hP6~mO2b$eI1&CHE{Fybc< z4t)A!0pWDnxgfI;EV;H`_nTLELI4U8Z2i6x&CO1t!86A@NHpK(Q5fY(pkSs`qmLb- z9*Yp8&?XVmb?!yyt%T3vZPgKH37xlBu0|_2s5+;dt@2EDkB&Z zjT=880w~tuBqro5{xJrgijQ1@xtB8sMfVm?)&O&bW_I-enacvWG~(Q}vr0P+Or(rU zx{fSjmyOJ2OLg%bM`Z5nSS_|;?MO0=SF>DVVXa5V-2ZT53xn3tX|{yq&yZ=~CS)#; z(na=#kh!0C8Zt(*2hfl|%bEy~xv$u3)?TylKLT@LMvA(Z9{rx+I2o~$XxwNDOFmTb z=|`fe{P=V%4W76Nw!JeUy7U%J-^w<0n@4C++`)HPx<;-D8On4wF`ZfP&ZS516~ao& zop893#OY5Z>$%sttYmO=Za&GHdJbf5E-2SbB8Ku^)uuYMf0#aUBaTp0Q+!{t)Q~<}Q?5a#k`RalbAI%_fZV z(Mc4usL%NK2_kXnx$R*Q`qCGe4SOwKpQ17NlEB~|Ye_eCAO#Y6R44_)D*Ue6NjM*gp1>VC+-D?F4&%Gt9O?NTz4nrakL z_`NHOYuMnS_)}7T@WvVsKtuUhs1&v+RU(nFJvKO~`GbSiNw~0f)0WQInBRnw4t}L+ zxUBgm)_Z6*$))Tu8Ep|RD)V=>w)?*5AQ`3QVG=HRPo=0vyvZdmJy$VJNnQ6rf#3ez z=+`5D^6*g)%ow^tL>b;t!@t{U__!H&8V&z0=F})N!ay;d8ewd+`tVg~2!PVT%Zx+Y zASLR4QUjR#Nw)>>3F`)E09r=s8~LW?I5QqxpB$WV!|^s$aKtN`M;f&n+&c~UnPG1g zoQA_y&y9L*r`PP%!`zJXJN2z&%}NI^i}b23$Z~2k5#(%OBjIJsusZ2?w@QFVI16x4 zBfw&yu~VFQKz~_8Je(Af%A$?8&0NHrL|n{VQ;N5>>TA5EgHHnKML3t?%$OUz?(Z1! zr`q0{;Qt^jc$Jptt5R}N4Mz2Ikiazp75p%RO95hr9+A;a68;fxT3k9~=K@(YW9R=` zb{@`Duo-j)MEahU7+gFLT2ym~TA+n%ZdtQS4|C#4h*lCkg*mNro)p*8q{8xm zIWdM}zc9_16uYc@lns&LQM$<86(Zv_M3nvGXo#=Y$-Y+*87H<-@*C1@Ny*DJC=*16 zN9iK_Vh|apA)_WPrXhcpHPMgab>9<=CN~h0AeboXB_FD|_9M}h@v}ET?p;D-CN6>v z&}?Lk=s=l-ZrcFuh&%WW3)RRKA!C^CCZ_8(GDeIgDR+XxL=vYzm8|D}%H^{jw`DFR zS>MY;!j$E7!Ma!}7JAhl8N2)wm`k~4D2cp}?m;0pwGKMKgltzyUkufP6 z!)d+?GKSl=<^I`BQ4;rQ08A7V(?6*2_y*?6b{wx|iX!7s5l1&81;`l3egb4nie_9O zV+MK#jp43z=Lsfgj36}IFiuEMqM&s{L@Lh-=(+7VK>&?mHtf}SeTv55OmkK@>OO6~ zhkq!u`#ra0Yj(e7igNhP2Eu&WWdRWYVVI%_tN9-C>6AzujXSf7)&d@Z*0{5)XblR& zeB<6k#!Y=n#_cg1_8K@oMPo4T?(WKs;&FGx%6ZObPHmm%JfR z+#HHE9zv{!Ldecg0OvAYxSNT{N}Cl6t^ zXv@wvV6vK(ogplXAbUw+3{*!~ROte&qo>`7l#niP5)y8GkCKoc!{aeZmT+iHr{oYj zBn__n3r6To`mGkC(V%?ws&g(}j|i~I3fHC1e^Cu?i}T>dXmDC4F9VE28!n1zd1D>8 z|1o4Yz@$~`qri8&5@5?byzVm^O9xPEBaKPl3+|l7Vl7aI+t)zZ$hb@GLy2a}Sv2Ds z(G)|UJ=2K?^rZ>n;osQyk|oOyoil4zbmwmZg*8)eY!9zDhIfiqN1+_j&{DWtv|4X_ zPxaOYpx3plG18!ChAtbGiJc2t z+e8y|G>33A7Pl3L4TOW8+Xh{M0sfiWD*!H-a{=5!PoEXxA8P&oKP+0^evbS&#$&oWnSzvI z{Ok+h1iwkq7!HZ%Y}`4e_znJ0{ODq&+Ig%p=0Bs%t11Q;%}1ik{nURiVo~k=d|U;Uy^=gNwtx zZt&@)7u|EXA)V-E10BgO__q??)q>DLc+{s99zAyv-ZPnvl7x5F+J1kplECkWo|Ssv z!*aEaMDJpXk~DGbW%M0?g?CxvJD#uXF}MRg9Z1Qvg~DM5(}?!UDn(VNi2V3vDzpcw>)1; zqq`>}g;=G~3`bq`xLpWTLfX@}ctDmS`&9YhOoWCN9ux zr!(_r=q>v+4(_1JLN#(lc{5Bm#&qVqnc=~~l_QuIJ~)`nM8Uo9MX*CYRjZCva5H}K zM5|E`qMxWnzDtNNsR>G*iF81JD(SyYkQ>JtWG%g(q)$Bu(m%zDf7LG$+bf0peJKmq z$Sf&^>Bg8&1qJ!}rp>KkwJIM|Ere6I%m}u~tzpk~i7o|mYyR6w+ZbQ2C2ilx(ko{> z?IhYxyOnvQwPRP?Y5i=k!1mVx8-m;B;Piczca;*)l*`QhTyl+MwEl7YQr?>>NR(!p zYk=mywD@0=tSTH^*g0%29ml-btSOQE2Qo!T+^17$qA;2ML22Pk=E`;)OPHd_I8?-u zF$*0Bx19cw(wte_xaFjAHnHW@v)r1?Sq!1zk`t97w`N2Tnn#7(PH&;0MSaR;Jw3Ny z*3X}K0<&SS#>b~<4BJjeuJ_weT`GB&P9Hq_AC*}?n|rb~%V#h}IpfJpA9yWyY|HAa zn4$=)`5v?()sM@DD{LDsTe3|5eS00ZtTle1BSp`~e=EISF9`FE|E*;F)TcCldhTNU zA7eJ`HSpmSjluYz6mA=05wt15h(IkS!n=eh4nVc|Re--VgF0zD0dg|wS6Uss=^je2 zRcd&@Jrq~-r)rfEc(!FHT*6lOcSOh(E~Hj=H%f6o;nCY#`Hz^Q92sXi9L%xk1lKPYmNzYvz@(5sQZ`<_YA?TOomJSUP3b5I|L8O(3~f* zw=#9UTkfvOaPJ^LB5~tXGo46=qhHiyQ&uwES6HCk*zXNY-4}KAHW{whdgv+{?oO6q zH}d}tQ};vuT_wY5q?|ol;UtA;L`j^q*ImKS-g@y7N|ofee3pRBa5T#@`U`nlPthCjeRqDQT%M!OY04E`BC-r`p# zH;urzv)>GVj6Hx?DzLp2944($|6Jq+EM3*9)T-^BE8>4p_kL?r6KW7gJVbvj!dm5x z=8E8dV{byzn0gWZSQu%3Ml_q!qEQCF(#ha4j{OH2{3F;ljb1_tj!dU)I=0k48!0l&cA5Qc~OF+*J)ur>Ji8oY)pDBzuksE8KBuMxe~<1&VqOk2_iP2Vi|v9 zPCQ_scrWoV!pcZy{9U`>Ovc|B-gE$0dSC(S;h8$zVIA(>KC1^AOioLXx_54+*76}k zaZ967gA~OLFpEK8fX!K)#j^4T1EPgN8eh;LOlKKQt-o-sSAiYf7F?MT%X!SmOO)*f zGa|ISvDuM4;!oaKwLXe547Qme&C0G1Y%9ikY+luOgfDpEOl&oVSo=InL(69lF9Ru$ z)fyGd1l^#13er6>DH9?v%*6F}Gf4RirIm=^5A&*H!Jhe4v$3r@>W?l$iNfszopyr> z;WyYdhuw6%hy)Zl8q;B*u=u(F_*%MT3FoIiE?hczjWI8nCxUgYH-N7UdE?cs<1p_% z%)>uwjqSK1h_#)_F9nL2h(SBSvIBZsGK|@1;&Fj1+ zHUM}DWEPACEWQ#9D65yq)&rfin>*F@5etHf14&Ln6uC1uXVqdhE-*FKsDo$cC+F^Y z3t5&_clpO8u-zd4m|4-~AJ42*X7Z2!IrEQaRw}q4h^-`WZ((MoGP6<oJ+#(87vd$ch% z%^OqYz_+=2!JC*zIydSHzWvYKUI93`u^Pg6S+u$XJ$WjE5bAF+1u4V0M;uf`_(qDx zfD$rRL--xHWXtazOi>cQ4uJK&znDDiGD{AneP7w!=Tt*@pfkruGer@3t5B&sNJD7) zR~;pT&~!~8DFRJ5ltVa&r4ZU_5(}7F4q>ezGaCpVQr=3@n0l0ll=R&8kP@x#k<5m@ z4j-PPG5ENt972^F(uvMc4q-|VItY*Yl)|IuF2WmQHcArS{ZN!3!eHJHJ*#89m#|!I zL;s7Iq9je2Y8^x(Grgk5_D<&1c5H8BiXvmn53>(V_2ZJiaQNV0@}Nhb%5WohqI3C! zlT8rrLq1m0{Dx>QKM>qTQIt55fq` zkdP!9{-NaeCqe2UKk8M=kDj~8?{~~bN%A{5dB{lOkdKvMj{1`8`t5M0C}|AGXH;Yf zPIb5_OU_$rgo~J8+d#CCDT<7+>_Bv26o}w}Snn>6?WDmGYzKF7o>mvr&@#P7A_PE}V&s&GvO=h$r6Qx_UZ}DM}jiaT%*8Jn`hk zlldhzzO$KI+fa2TQxq9r*`eylC{)GHef0tB@jM)zlN}latXLytN$DSyOs^14<~!f* z6ugKV>3sCu#rZZc8}^F2C`Hq4@Om1zq?4;Lcs)muI>?WDmGYzKF7kUavr&@#jt_!Y z7DSRPE$1y|c5h>TZC&}zOi|JZ%~2>?R+(Q?ZRmF%_eUQ49 z2cmPPd5WBjCjLlC@Mof#e8>6;1t#J^Iu<>5ajaXI4STiRoT4!Vru_#81C*>@n0w!t zoYIrW9CHIol4JCj65;-W*g=HUuM{CYcM;)zDRGz?!HQN+BD}JXAZrqKU;9)lUFf7z zJZd_PDM~Wnd1{GA!ihgpyg!OLv5kopWyi!r2M6O&d%YuX=Ar1K;(_r7NQ%ja zN{(AaQ)X|%Gt8e-WF#)6ThntFx4weeuvg9#Q#6LiXgb4u9yg>Dr{N6q#e&d5c+{s9 z9zAyv-gB6Zl7zR^ImLs_t_wLOgmzY=E z(S4pNij1!82zD54-beX6`VjU@9*fTB4hp_LDFcX%Njz1eyi+um?}tC5AVz#hKcwd_ ze)uzH!(KnPr)Ug8%)Goi@XH03cSi_f2N6=gQiSx}MTGk^8zqTwF!=P0C0}J{kCEBA zkSLoxlSg9f-bVwtmJ-{?nO|Es{U}qEG{O@yR#0J5 z3dfmBNUcqlrDIxyY<8Bg+|lH;F6Q~56T z3yM#~g>*4`?&4y1G8^{F`Av$(5TA@VtfRkTT0k$0YA7xBsMa?wj+ETQxq9tH{r@mgXKcg82xM- zDi_LkX}uvQDImLC=np9JsH`T{ZRXg6L^#v!np}K!da=Tuq?jGHx^(`m1u)f%xX||-~A0i}gx=V{k z=_30=cWM3BX~?LFyJ*P2W=-_tF0Fe7qe*{FUYixUZ1SP<+PVLoT)*Ud?H_2e7 z_FY=^mi@I&+`->js79{n+9sy^3)7kJ(t?{8)LmLZ5u(L-5(4Fp;2MC%a4$f$Zg->B zX+nreeb5zJktXO*rGp_sZX9iJqt@M|1L`@@0o({?Jqp!3HDRwH?tMYTxT$J1R8b`b zF`ZJ73J@|8P5vqHmj@LfznqBJ`>q7Yu1qA`4=I;1JT zkK487{yj`l68Gurvmynge^6TZ5_4rcj?Xhik#VSqBV!ibtMy{XelU4i<7`Eemtj-& zj3rC-dq8(Fd!gWx)0N>~tv?Auvkl|f|2-76s86}Xr|0%d{P`2VV>ay7ct?uH;7kWy z6t8DXTNC1`GQ^|4>avEyaBw(Nlrw_NyGIsr$F@GRkSU6=n(s5eOe^T>@~0^MPm?N*;iaevApbVltVUo z^tM*sV2W~NoavA+;EruseJ)cJVYM#~nKA#oi${>*kV`1!!qs+5VprR}Ul8Uy7jE3d%zD-s)&r@zrlO8+__%@uqT% zZ!!knjEvt`WiXyCb z<2+^>JTXdt7-iGYi4k8gH<4OZCY>Yu#OP1tBC+ijb*8e1UNEi{U}rSMIF7pV6NAC=<0>UmnL$p03m?uY!l zx?oNt9bHN-R7|3IdSmU}2=I{*6@q)P^fhfF_?sP!p zExckEj%^-n0MdnM-Cr=*u8xgmUodyb*G-FN-Q{uA9(`jP-%;zoqeVx_NKU8`8anQM z-b;~>c$AB5damN0(u{6v8Bc+@(E}rXaxR#gUSzyoj)W23E=O0dIT9%$EpZYOf(Gs* zAr0|(jFP2G$(T;bAqIKTUv08+?YZYhmy(h4^IuehTkSl!y$%ReJAWd^WU-6JE_UJp z4Q4j+u$~2+ylCvuIWrfH&0I7F_gbx-st(|tKH+_9;k`uFQMlP>2rpBD1t45>w05$x z)%Vt}hCgH1Y;Ea`jrq-CZ^M*7Qmxc*x2of}mLnnD;S}6670^XQ;p>aMp);08zt%_n z9dLzIfL@@c!?&`oH5!5onXKDaXnLzGK}9g!DSksPSF@nM2wed z{E%C+<@ftcQ4+rnD7Cwp7hCS{Vv3Tu&$&!vzi%YBBFwr*`Ni|)pCK09ndy+c#&ub9JETK?gT-p2aNP17q|tpfB86C`j_&i*A#W2s zCTFBr@?&JUu_ww-e=Zuy53!4gZR%f!SbA;yA zZ@R3aP~F2Mx4k3Mgt~i_4tazVTX?duB+ZtT{4ybVQ#vG%(na=#(jgZ)4H-3Y1`T;3 zYoZ_NkdG3KCjB*;`53uu@}ctD^F&kmUb~FOOkAMXW~W2aTlU#@+`$SKs*x+owqv^G zOlMAqJUX2Yi5oz{QQ5%w(c}9lF^vl`B_&Q7j*+bCPetAk{~=d(8rn7yM^@?)X0FX{Pj;L>^=0 zmWgM|cYeSUvRQ87C-C=}f@ErRonV*iJ1H8&C$Ph=(I2>7Tke0)6eV$=PGO7`kp4kw zVc(lvRzawRIZRPx94hq4;6=HOH#y1+_mVVTC-#yCTsD(Txs6L$450xeXC^~#0uPTs86|Gr|0(T_4yM+%!a)h2U9c#XA)VAku8d+$`CK%wrw41BU6+!f=t+Z zojbN=^-88F!fL+HoSy2((cCk08(+jNYt217w{e#s%s2Okletr$(%k8}i@Cp$*|68Z z^HMYhbN4Q2z!|8&t?F-&;3Z9eq|qD&v`MSsja4|4D*r|06dz#@Y%T4BOi|7_Go9kA z+_5dIUuKFTtajrRW*XcsOHU-(G_+mDxgh_UGjnBcmpznBKekR)8%ldwxGA}2EK}#ZI8{+pS)AM)=i7epiF?AeNPL6}HQHHs+Q z4w8i`ZE`_)r$z1u#TwV;g5buQV=f4R#$az-7~fIrziUND`HSaAQRE{Y<>Hy1tGK5$qx%%c?K5t4SHw?VF39N_ zxgbel3~(BV_4`URA9oTBo|CL3(R`FgVU#CjfH0jJee9GkNbJ~vM&nKTtrnuz0e!ye zoD0|MGC+(ks=8L#U$DZ}J- z;VceYWPgQOuxCjb=VMZanpf45H2e~gh1B&)89YJL8mOm98ApEGw5uXf`M6*hqXolZ z5h<+2)o$M4#_?*)qna1qXv1%L^+wyP`>HMo$d)z-;QjN?jq zJk7Y&h%B(4iP~c!xG2Q|wf8Wm(V+GD}GsM-;=*L0E_s=H2dYv|P7Bh=nA zoY+FiPo>!sl0Qq<;xM81c$6-(FNE5Ajnj}(6HOZOD_Il$K<&L(Fq-t&BtS26+2ljz zwI2~p<$G;7o0@Fcxu4=Cdf-pxWaaz%hLrh6yTnNfSg zanxRA3X5O`<(n4cUYXtX1vd-vB{f0ty+{Z2r;`3{g4{UHAZB(*`qXnE{Zp2E7W}Jz ziP&B#-0!zpxJG74DNLu7qJo0loztTHSgp#(R13jk>MWVzYJu`&&vl6|1yOzne8+XY zwVkxRUqlMpzC2mldAySRd!QI9?>Od>4hMGo_A*d@JqGuk%YxCJxyZ#b!pc@L1&Pw= zF#)*mQ7IY&K*IstcLld=%l#9Xq9pFq7``Y>rhia@tIb^5j^iq(C^8Neab(OQaNi2Y zeh}QJakjF+eQ#j)bO$^JaNpYmq1lEJ-1ig;TGXdp*3)zQW&Qk#*D@RSYJ63S#^6jx zuJ_xWX59;R3h3a2K2!BSDzp3|_hf69pJR%0#*>L^x|KV&W%U-OD8g#K2klDr(<`Xo z-?(M1@n=K*_WG{NjE%{4qsiF#e+e>Nn|ETAikkM`Z%v zm+`AI|C5}=gmdEwOi|8=GR^-X+_A0spT!hKSnY%PXI4kQgh!w?|Lp4MPZEUrvHxjg z{?w;5e|qj>{u`MMdks7;MPo4k?h2eo%a!hkmGk@?b82gmPhpC3P6cPJnwiBIYPU^nq&kg5A2|E>_R8YySbR)mOUA~n@0qHya})+(_< z#PY7B+&hgmov=^1IZq*v?)}ncB zth^e$=uK9)j<uE<6Tm1HRAKs=qt&5}fEA>$?{P!@%p%8%rwK=9Y zmLa;>0qEO=wsDa%&;0xIcNf8%*~}OQ&7m;R4P_`!Ig%8uIpSfAc&^5gilMH*B-CpR zIpY|0uO=Qo&v7b=x_+Aj>Uy#<>epJsfsrSpF!;+<12Ft+Wyqd4)@)1)gk{rjwTS?V z*>la~@ZG5ZZ%e<2f6be>0Bayu>lise&E9wen`l9V!QcUmhYk+Iw%gfI?J2+UurLYol6pysmI>P+Eyz~K`w zD^OW$cwX|C6=IN(GN3vc2*8v9(<{7_wY;4?4+`Z2gKO#lS%cI9Xua+4XnWhM?Qs|# z1RjX7^^qXRq6Ai6wAKr60GJoNGLe9egIHJ9s<68{kl=EmS82iFJ>4C!JYZ{qx2ow^ z+J1H~l~yZw6DgSwIbcx{p`H71*ObAJt24zTt69hiB0hV*_h zBE8jIt`;HT7q+YssYiPAqJUQTJwgFY zE4=rn8J8MaCTd4!BE4A%E=qAgdLQ*Y)2^Z12EeuB`)PECN2IU~pbig)E*l(7E%yco zuNX)@9G)DFk|4A9rVmR|1>d@&p5dSvLvpVqqYd~p(EOs*zEm`7UR2}$$OlO<$WMH4 z1bh=8wYDfL!0nK{E!oqV1NxlF=E1x}eoFHGP`D_xwKy%=;8MX!az zv&xkJs20LtE%OR3pz!RKE|H@k6#hOZ-D2$c6zTRKEcKG1@P~e%R%f&XCPFqCbItG%Wp*FumTb-LqfAi_znO5wZ*s@BtbUCt zim;mRA-$BPU^nvr98>p0{#|Y4Yowe#ThT^7 z6RD|25run0vci!K)|a@bGoWLW7~d)) z=DcvYq;S(KYCuEI1Nt%zD8^VZK;k2uct8{RZ{p!$EYu_*@r~UA5)&pv_`%@tGj1z0 zfJ9s>%>WX2hTum83NG-nUD5%In6STYv52Wg?jI~-nhhNmamH0=u!#3B7BN11&bVrr zW|o8vhwBB{TzD+Zw>^U)ejQmFPeoIS} zQC^zF)@?4B!e|HAg+#6EI!=ruy64U`<3b~6%VL9;v(2V&x9e;TlT0p?%)^}s*x)~#WCHHOlKDSfC+}U z$ioc1#gG|X)j|@_5rRwVfG~)W^yyC}_qBrDIKlvu_*arU^&H6kgft{E!MW;@$m|ut zJwB2JYGjiX!E{OyDiBDhj~1TDs#JcZS_rnF&z8wB7Vt#&R+orU5T3ZhNzWKl{!V)C zu+&S2C%%Arq@_VIcw!&g>kmBf!z>t^sTmPfA7Ba+rO{&oc;b6gGzQR#13dA+xm{cC zZ)A#+xKE=HqX3!yK?Sa#GFP_a_%Txy8Hb8EGG^gI?1iB1cRTij@I;Mslm$0Gaa;Mo8R2o9>>B1 z7e0m#Xv9-xh)cO`TSFXXigHGfiMe_-cWle*8m1`1YQE3xmFlNgfW@ucayVvT?%9CF zx**Iq_gM!9c07NA`jqBQ&t1%Yl-aP?KqWRXti2&>&Vi4NcmaTg{K=Br~6P;z{;q7h)YSWgNz`yMuz!fL)d$lWo;bJ%Wd1D9#huADKGeEqj27D+QpqH%%=h?%*>&0Z^o0)Z|hYK=Ihyk}F6z zbsWRgeNjhm0gAoWLstOB6)eGS;>U8P?uY!l+TzzpIeWIk&o10(W+FA!D57w8NEYU> z0Vwjui`*WHH68&JrvglyH9#?ZJyz2uU4)dtbv6LSBcKRrz1pr;YSkzEo2H-unjV;V z73)8=p5%h~5YYxL_)^c+nr??^Fc}WyQ3ZY%&Y@^VyvT(zJy)?zNn7{XjXPxAXg%U5 z4~Te}7^;FBYJO3}eVNm6(K6@KaIay`j4~onA=9Z5#ZGhv*0Q#t3|<>*YU2I$SQ8J+ zY*t3D>Qq}`4pHhnOxyMZYOwEc9_+p}SS{1XZ5VHKYNJ?Rv(t)dYi@5qG0m3WT28iR zen~O+5ohN1Pc!F!GIQc;k~UN$gyNu^*VZdg&~%%>IrvBlGaIq;=ON<7SX#%I1?v;H zovhA>ruU;3Nh0cj8vRY83A0Jv3hjd_&LaU31Hn3CpNMhQIQ?vYEWj;)DdNktMn&Z8 zr{F{^&e7+Y&Uij^>8X%5A_TiR_=JtbKkw3^W@V?>8t=5Rtm0$`N<4zOjno=oaKqlb z;1XdjQwzlwq4s0br<#dA+$P-K-e_J4ng#MPr~pf4dCAG3jn!d6Th&TbxtCt?szIqr zY<3cIRYt+mAuR_iKB#25`JxLqZ1fgS`J+%3vr^lvisl9-AK`0zc;4DE&`G0-K;aR; zR)Z3bP|6lv2F`Jyx}m?rAL*cTd+q9^uZq@=`P<=-dZ+ETh6CftvBSHC5hd+#ZXj1O z!sst$B!3meRu*^wSs-C!H-N|1Y!v=5yc|CB^;sg1_R^SW)V}}s$O`L8m%-R^V$Sg z06f&YILMiuB?^vAr-Ea4XWBDU4$Io<_=>=$VH&HncGgF{u}(dx%nfC=Awxg7S3Rh# zi-9W&TH7nt_9m#vUE4GYuWZJ!=GXCFuejP;a5sD1R{bPT8 z(Z7tfhqD$O8$AP}e$O%pjyVuoRP%_M0K?rmSqD^~LBJCdO^Q9uAb6eg1i6$Z$XD|O z8QY|BNe75PFD@i%b@3lgjN_X0%rxUtBeFhdW(ENZ!9^(!83dnq8XfKio<*bktWGV* zZfjIWy#ar6s=ZU)6tJZ+x-+U;eDt*G6(#nYoESr~KRC^p6uYdkn2ki|QM$<85sCgA zry-*3A4)^~l}`3OLZaW}#1=~aVQIFca1smE$QA8$ zGTjMGXWZ$Wb}oqfSRt&W+zD5UyHe-lGNLoW0T|auh_IKg&tC7{$*a-9DYAUNYkR z<;)}R-Hj!4X2wr^8f3kk1a+;T#D08Rae6QUQ>IRA)aKZrQjI7eBC^CNFhu3M7Rk^yl(Ul5vY7?B0%QqZD4 zaY7p3M=6n>+ae1Paef%HVXwx6Q#1x=I-2*zf~zy}G!`$SquuPRpVg=y#=Y5^=0ljG zoH1p>YS(kewya*r6h&Cg_o4$*{qzcheigSIj#)TBHU@o%Ak24w^T+|HPw4>k+{FRv z%!a)Nu1wJw9H6_pw^7XQj#xR*tC>?f4Pw&M zQ&2Wd3X}eloH;KWlfIf{7VRvyIqcAz%leR_;Zzf~}cAb@z$+|=(S zVAA*cNpew>49$50yO&3h@0PnOCVegW5s5qa_|H%T4YMpv`YDCfaS~G#pGkGbKe2kC zj^1L@d##7AFzM&91iOhJtC_kV^6v_hu90%~Y()qTCQ?(4A`1489xSUg*Yc`*6Rz3@gMQfHAfXx!2=u40wnJM< zE{6|Fv_RiL;;CA_Jxer}?YO8E{6>5X#Vz7PE|KZE?GhPx%ec`U5kGn8^FtEDRM_*> zb2Zf0I}H_&JRVC!eGPMEln)`#nNE!+cBpyksz$8_cymCS15S3N(`-VOn&3utgr*V( zmNaMiwi@OKoQHV<4O7eRxff3XB;IcU%Dh(H5?%pMnBMa*zTmub*RQ;oxgPe`MS$S| z**#h#RJTI2J+$lgV&JyVh(RX7ZFAN_$0We;4<(-)1gTl05qRw)5)pMAOxF8`!0%xL zV=AQRcAwD5xM{8QeIqE>Tc3nTH#>EJ9s=fi3ZUDND$oqfs@8y1e8gjKjkJfL=ax6{ z2yf|9qFfaxt5GtsyfiaBHE-i(=7I<@x7spU3iHN~eGlyE;g&lMLyWwcsx zAyI3XbDbE+rSrBl<5DBCIBF&alZD`-6bB6ECa2NiN@WL)?sA=4OaRMB4W?I=*e9JB zL$Ne6 zlSk;F6H_PB@?bbGmgL{^f24-~7?yM%e9lbGGUz5ZY@pU8sI9dOBw8ib8q z!W1M*qsIgo%#A4;18T+rgLxIVYs-C|DN5o#4YiDdV)_Ra9-q%#*^cAinWD%zRK$@n zi!hjvbLOp*3xoMVW>0tKX24*6To9UV7|+*UKtYT8#0e>m!KCN5=WFOp?_)OX z)%czijlr2jec#9y#ZzU7w{Y9GhIlhmlrw@%(AfWQ$F{8A$rMFc&G(sirTXa=;_~31 zC#TxvDr|N(;_@g#m~ZYcBy*=erMc5{7jr*=*|68ZekmG*xpxPejJ%>dV&yz%F{ic` zc?MIIBackyc`SEq%j#ODD8gzt&SR!Q#ASNI$)-smE{9UynsknA#O3qIMPkd?JsxrS zbhZh}^5m)8m&lGc|eu-7qlzFYPH;#W!);A!$B5_j;a zpFmvFFKV(W3vu~57HBv2`x&P0i#mFXxa_qaxS{g8iGh)a!>vu7(p zTr!cGY7|kpTO_Mm*dQ)>BSvl)#TsXbq6u%wFJ+)D2}fvywuDXLsiwcJ>Tln~$K~zn z*ce_!t*`z2fM1xF#ShGEji6|TH`MCxMA1nyPRpGV{9=4D#WmtjE}`kUifT&kx({;P zcjrcriulPxWS+fcXWOqdv3O{vAO^NVA^lA?f16)hGV4eyQ-U{!mv%LifUG<*o zod==A3qprCuw;?9bdh()!T>bY8cDvmAy)X;t9K^102X$jF@^O6D>Xfg%iysI@K)1r zO*QIJ&U1x_kQpwm=MwO^!Kk#}MgV)!g*12yL86CXRu{sI&9gDfB$p)cepZvov<3r>^%e3y%IrnYOSEw zrr`&Ntmmc&)$yW(7Ct=%)jiL75%dvS1U-irLFJr1KM=p&uwKurnMe92?dt6LpSisP zXW4Tus7$Jyq2Ld-4*wd9R<~Iozsc~x?JG<{$}oOe1gFHG!nax%$C_gKAB$-&k4B(g-!4Ja3$*$Vmh7M@kJVMKfkK;MU1? z6s3s+xphL%ZMRNPw-07E>~*^=MPu;&eetfUj6JFfH>4BgY@j0<2LD#V8yAEQ!lOQ= z@aVaV@SenMlq9?(bsv%>6a9}$NY7{PY(vw(GetS$8Q&*3RnDsH7jEp%pLl&w*vOAJ zOH=*0U=sEj9Bhr~L&PVzVVzy?-5Mbk;y;zbJ}1cXt@;xb5~xRM)%4uOs{f1Gu(yJb zq-eSf2|wkAbfPnaggXSGgYc+NDLi^^CA?ScHEXX~_#ar|VqpC-^HY)(kI?KLkzHwj zQ--$RuUwY^bD5%~(agJycD@TIHoAVdpF_4OoJ$m^ztQ} zhEN)FFivg;;#cIXm$FeB|3z^_eekJ%!!KD`A3HM{i9a4)K4u+~kuG8N*(e@GsHIaFXItCw~9wW7&>7c zH>zYIH7&~;XXih$U|m%0nE&)*C%K`zuP3=(ty6c8@}FMs#1B|cU^;XD)6s*2D@X8xrNP1FUUd@gqg;#-gCNSm-I8%w z_uWEFNr_XcQzUEpQ%U(Rg4{TsAoJ-)k}~xiNcq47pQ?R&$zI6Z{#`6ABU2<~rc**z zPA>O3v^h_#Cgn4#gqeP^ya--q@J>=Pfbpq-VZqp}vhV|E6H|~VjUE&18eg8G zF?=RE?85Hkc5S)e#uO!SpH6Lx!eROcrG=L;SGMDL5mOWyhl)5dX5qI6?#({Iu^-%< z)i_6yy;;~vJY&fc{gVAUW-k<6azZlXJY6pc%{GkNuwSR3MSaR;Iz6{vrq7@F7_(uo z#t)}x49;}es#rz5U~;Fg7tJrqAb-Mr*c#-In4+AKWTtQ2!yVhQ`bVZH!fL+nd?3}2 z%RVER{jw~xKl+a3lq<|0=t#@6@!v|X#|y%Iv;PK}J@qNgo}Rmy{SnNDy#@|V(HP8r z;oAB(F#OQ~sTCoz8qLIg>k;gV1m!@X#JPfbvbDYCOi|9rGu>n(cWle*p)8K}3 zdd-zhLmSGoX+!y})I^mu`0NekuaeovzU0)F>qjoT?3~KTm3V!6yD@de6$1+vdg{^2 zi`IIzYO4*;hldxhU$b)cx;4X-qYFkGBb`a8W*A(QGX$9QApngI`SsDM2AmAH;!UiB z51g81Ba`@Uf;#L{bRUBK2eMPDqQgws>q!hQ7CnB!cA~Sayezh#0(BqL{(dBwm1%#e z-%CjQoBf;Qawchgc>oa=v7 zLHslpXgBt|fT{bUj^3vI^;!>IrTwjC33em@bD6py^6x6`Pb1~**(yYboUo3G)KsI0 z!VObdNYN(k?q2*IOW6*QO48|ZjcW_4qnEU3q+7k+Dl))KuK&i>3|Q2r32O) z?M+)CQ!O(S@M&xap&2DtzejSqM64l>5ZWJAgm{iCe%*(<`o6bxwKoL=_QslxN$>nled}1W(!ne*uTqCqKP<8^ z8L(N|?ty7lnmePEz+rE7rCsqVO{m)6Y;3FICqf0P^PhRf(3Wa@p*L1*RN6!m;0N)aD=Wa3NpFQI>eHpYexeqy; z-1o@jVy06p8}kcJJfI`rLOfj0W}nQ)yl&1+Hs(w=rlt}&W@};8hHS^v@&7mZJ1Ub? zHUD(T$!xWokduiy2pB(_{#6iDFoIwN3^E)c$Ri#6Uz!ZFE0Apcg=>Rwvwge@Q8Eag z5RX)2xmlZgO62u8X*8bWnVE%}J?(NkF3G2{=I*z=(>M>hl+&3YHj{FinQ}T4#G)1F z{knXd31XQ+EL>y4R`a)Djn=cg+FLQNR;~KfH(&TgFKhJc^J;ndNK4qB=GETmyqx_j zEoXnj%h_`9O`He&|CmSG^yv!U^v~R00lbtkuXgEgO`FqluLBWM!%RWSFn+@a2&o69 zXbi`8#=P1`b4$A2Lmj_sn4%MgM_pp8UCTRIo=^i%?^eekoQtdre5U+ zBt5s?fJ9G!J+oo2$=9T444w`kAoz;ai|+<*NGHD8Ku6LG{;h=fbwTJLJnB;lkDj{- z?+eUENy0l?|LIRs$@*Cd>i5i{t!w|5Dasj>WhU)jzoR*;2pjnk=9Q`8IwIU)>qT$e zC-Mli#tn3&#@YC9rL)rnVZL$SN0EX0l*UcZU5xuUX2V_s4@}W?85z#yhP1-VjtuJr zp@ZRVzbvlfkV%qxGo|EzgNJo{9N1r7Cj~pr(>D5k)g((C?ETlXe6l``Kg1e zz}dt$^)JH}J+}{6u|}0Fq^9NdRoS_=ELay+JLcN{pOf5B-E&E9f6%GBN4d6p-ASt! z8!N=)@_o~6Ny*Dn(575l9;J)y3+37#>ojE4#QrqoV zg3+YECevyomrXuYUVD~kD&K1lpfM8{=(X9ow)B>L8Yp-0AQq~TD@p@px&fv$3m(## zRIY7hYN}Qp31F^^8zXJMJp?N=zcRVVYx_Iei>GQ(O*UA8h%DU43jro|L20*<7U)kU z|0@K!ail>O?tvtK>N$}AY0II&ti=da&qQvo818uk3)sjmDTe8kVpL#|`z6}^Tvn~} zGu1*keaoVc7WujCy)F@^V1DkjlfE&=98CIt0ZYA{{cFyreFO7I>&LG4ulw0vf&J!0 zE^g$fiD$}XZe+pO&583TzQ`0LN~6aFyU(9X(HOow9d>hn%{2F`i-z|67#KWV= zk4W6Xr+wnSLHb2aBV{EX4zobJvEK(Vbzjuc+r-0O>!GW}!^g1%yOI9|Ox+Lpca?ak zk#hEIMTv(@q^2506z&AcqNz5ChrG!mw}N7gQlU(&4n#d-^tV#OhPW_-3bkm~AWN6l%?Hog)jJT2OVS26t znG&_``x>{xxY1`t{N$w=Zo3G?-%6$z!jPlXLQr8Hmc1*Y|6k;dRco~s_&5qi`q3iHd#krMb?Vjj3iVIURlL8tSBiUwlj86c=K-X+x3Y|l+NPvO zrc=6!ok5%mQEy6)!@1}$l(lMS~*o+vjc05LgHumZg?*o{T}``Z{7mD zVy=p=;Zl(iQ?#(W$auRwwS4j7T4SVA!Ht32rkImLldp!LBui|}@237CM4CbKYhm7+I5KZ2Dk z4R0L8a0^st4ljdV!qnxbdgtQ9An!Ox_w#E$Mq)6oamZ}m?nCDDWVO`-3mNS+(JV(X zA$p`ytN9~nS6-~oAb~9%x}nQ+D>cYoUf^wMG-{BVxOU8&^ee4SGw913hm`8Aje4~a zn4E|C&^WYe-5*^PW*&w~(%yFDwdup`2^rgM$X5?*<$zagt@+wkn@|d^HBzbT+r!-N zCj|M|vgxfzIMrxXag2++Cx*Xo@i7ZKNC8Lh1P&`CyK{poYsg=GWcXHe%O#Ady0zYD z0(nei2{i>$3RR_MIFR1s;O5AY>eNb3?YtN!!H^S52*+IT;mn4qfvgKQ^HMcAGtoN3 zu@5spGv%5t3B28}sgl^gE=_V~BAS_qur}C8tl{hsyw1Sq$KN zBe83GyUwYcnTTd4B3LiXOhhi9p#M4(QTVL~hZ{eDZ>654x}JCtw5Yzm)ZRn5ha|6K z(WkodXB>S>_B7S?kItW!E9tZHZvLz+2P(v=sdN8__Uvh!u`8(1KXZEpphw13*N3ub zb^E_^&kYmc&SnZyhH>X602`f|qA?s78&h2`;+AarUB?t9@#_GN+RD7xazDxxC2^mV z>iTcozb(g4VTvLgt5B)iro~j(C64_d3`!G7iol?Zsjly2{zAzmH^_~tuJ041W(Pwg z)VUOssaLrXPS0&O!qL;;#%$PY^35q4gQuHPUBAH%>BMJ9b-h^-ItY*Yl)|IuF2egN zvr&@pvT|9YgO;qH)u#5Jm_u9F{$HjjXH1riME&cOGLXz9Fy|5o}N77dt%fKlQ+iW1bfG<16IV(6zZ8}>$VQi{eL zC18tBFT@MDA)OEncgS8W2pxn+eM;fca~I(~hS?}dcn>`%cQgI81v}1M{jk)II$7Sb z{1(#N@v-de4iC{b%ru#zB%wS|-9YPI7C$WD3uz5+CF@+1A_d zVTzKZWS!lA*xj^ZvgQ3?rYORD*^vtFF-;%3>fLTB4@l>Bho_q%6Vm;ptl}Y}*?fmw zOEHZ&k`77FT^w?l*|1mFgHkkxm|bepWSreZBr^@B;iV5VvS}y{kBeOGo!Z+> z`bTye-f9Xl>iAdn8=PxDbV+ze5}h7SXBN5Qqhyz(ZHFRP8(4id3P;TJV`+33MWhe| zRFdIQmkkaEpy$ECD+Ypp!0m+*5I;LtZEo;p;E$rL%ede#c}5hYgG{;TFJ;XQL7Y?| z34eUy6}vF41^0h1puu6k@!$s5gpXQVlqT`mEiW6+XAbhc!<-HGfGJ3bZ`30w*J8L2 zvb8vr+BDS78f#aY03EE3?&>N9h=*N?_%)?GQVI|gDML`g3C(<|F!SsRUu;z_cJ5f= z>uszITU)<~%;C)}mzb^hsKVEWoY=zLko9S{q~ztTZ>9=gJW3bY7pm~}Ri`0i)Y(Ww z{xWN#9~HiC7mOyuPqLU-bgY^miuX@D2e-Y;jTyl=^vC9-oaeij^nLNQDht{;>egq z6}=jc{UDT0<7`EsY^I7{-(>be!6m0CLq)Ie2|}|C;}^;m6tt+%_*cpR44a<2Y{7hu z*|1mRS5hDPpMXxgjp;=gH@J}Lxr#_{@({mStU&w6OYv8mLjltk8>U2du zVDYAMiw(?!ty^5g6y=OG(=8^rV_R0YGDQ(qyKxIM4Q?f-CzEU%+Dhb#UXMxnVbbig zw-PTS~M7EA@N!F6rTyol_aP5-U4k zCTOkNYV#hy?k5#BJ|%caT3?>Pu4C$aw~UKx;v^xX=_8YSnCsW9T)l41uH^pZ^obz* zPEha#)9Z&IiG2uCScl*i_NfM-TwA+@f`m?RGgNBfgms(Ak4W6XCw-!#7yY89k+Ld! z-Od8-#(r;O>b|I>w-vp5t%t5EdhPuu(}FF}9q#L^{JYxD*GM^gwxaEPCQ?(4A_{kc z3tZZ9lu0B85kSF51nVVP78nXMv~lJ1&=i?142+HR@0s zYDK^;jeR&3dYHec`MQpX@J$S+QpYP9_e57S%kfR%PLmTHb-DFL1&WHZ2-@THxgE z&I^d=(E{Qvynu+Us0KHVLqR+GVE0BFP@k|4WeMv(mdC5_R23xoY7Z9@wfg$76XUpq zd_kIVsS$ZMUM4h;h2WwT2WZ~coJNQ1x~pk)U(u=MM1bb0B^l!L)L%9ry?N?&9a8V7 zg5Bg-k|c(0u=pdT(>p{n#ua`5*LV?)8aar67lGs9BUjAckC}s_8!X2s_qzhjUQCF| zjjyi0^m*(*jF>jkv55@@*~nKXw1Y#u-kmla_<6|1*77%vHX8}%N{Sr9bC*pHF8CGF{WG3 zbY|e*aVFrNZWefk5LQy|gwBg3PJb#{KTnVwM-@c>SCXu$=Rnqnr@?wLfzzw@0_R?y z#)31lMgnI#C2-~Na$imh&|{S;|4}W3Ye-on&jO&wUg;7!3Ig;#=A>JU9j_+cewd|R zGC=P}=8@+9VgS89wAUYi-rX!1-I0Gf5;~WQ_8$GQ|eB zZflA)rYL6&nMkDPa>ur;KAS0uu$u2Rk4*LB4A5JqKeK#0x2!ezWlNUP5!Y<|x6 z3c`GYe*+mj^(hUWp1TMKl9&WJM2|L5GXEvr9aiXyD`!Tir!vP5tGd;cXl;fr_=bfoFo_;01x{RLsZ z`Cm)sPkl=Br{^x_e_t0G_(zJyVE)V2;H|R3xni~Mo!_Z%g^Of56OEB^ICC8Jy&HjE|_Umw)(tV+a0kI@ zM6sqh}^*tS=KhBtvtaz^-BHe7D?PQLJwwKO%7ldtC_>EB&G- zo3c=>A7z1dW4|9_>b|I>w!B+Y>n$w7ZsdP6Q};vuU7c-dq?|ol(b*Ogsi{U0 z;dbenu-vP}cQK}IP^`QYDfdfbjYojbA^e~)TuGb4g;vG|hLv!cHW*eYwFQWMzj6lPV%;G~^^EJQRE@iD{5WWRxwzTA5Bs zB6h}k@CGysIBjafU5t$;=~g~gjIVTN{O!cJj)6(txT8jlm-103V%PJE#A|OosGhU%M9yo#V1@p85A9b-FWz2H`87rf`4WP~)9U`@1dWJd7%Fz3@x}6G;gkp>bi7r1m!@(bx4( zqNkulbAyKJn*7NAaGYH*HV+g_Y517S@W*jk@IDFyAC5?2S#Z<>6?rb*;hxeU7YCHr zusU2tY>1|YndF8&Jh=hW8B(^Ax{)<$Gy@AE140-QTz(z9{dt})XCj)?qvaFlJz%y3 zr$+=!l;C^7V!azQ;Rmy zZM>K$2Y1Hzt^R>|oNb#?G?bW8SigBn_t}u&hcHD+{5l}*)-x}*++WBPC2^l~ ze`}Tdx8-<@DT;8cLZxo26Yp=G@7NDw>NJ5wVCq~DMn?_~%1Kp^w|E(|8VWIqw>VTb zLSMn@AJli~YebV~AH@CUZ&TPNZsdM5J-6L&M(4VQ*|1mkbc)6h3>HFKmiQ3B+${0P zCPC{EK@&(>)KkBnS<@*>+XC#Yq@F7^-6$G#P!sYJR}n}XAGzjheVRGQ*O2*S_he1J zmXv7^lD61RuZuW09pr}xTk|JA<}ga6!AZ%*4s%u+#Kt`(voURbW7~m$cb(VwXNr77 z$rfRL+^_ zc;xrJG-Fcivg&qr1}2ZvMedFnm{&Rt5oLc14RKs2`yORr?sQ@cCI7=TTT=4N1U|r& zfytwEk$s^I%$GS088vYm4fz_@gnI_&$%BKduog|dJ+u)DAPx>{66`Q%KrA=jA-GMh z3zHd_QOZH`q4Ki#il&kwPJS2Rdho|IaN;638Z@T{(yR8TAKc4ZS-eKpC^eAj-o$j~ zT+GBJ3hK&)MNk|Ei%wQ>7k)8bOQ2i#eM3kusR&BMj8s5>D&gNO$c-Zm@-lBH;Zx6n z@Zk~#Bj>6|BC}Tn_xM#7sF6)l1k))+sE{DP&9ph1tV-o!s)cYCm32NWax~d*U1CeY z9L+iZa9LDgbonXid9R2R^nAJ4x~e4q9w?Smc@*yn$Iu>{c&f(mX>Qxr5I?~b z<%}RR%jUb>u`R3LVu~WH=KIWxQvEoZd*&4i|HmzB%{}`Hg}({Hd~^R5nLG6<&7GdR znEM}?4SNmzK1E|NcZ-V=qHt{SrgDp8|DVee2WQD+n4+AKX1c{v?%38XhMA%Wt9@{b z%*@S;cm!Iv$j;onL=fh?#jnXNs88t@^xVZQ)-fCQ8aO{iV{nV^k}o4q>5f=A&vxe2 z(js3mYZl(Ak(mZJiqi|SY#Q1q=8H%UPsQJ) zmt=1g|D1d!_L--)Quojl&d;%(=qxKQBk?mpZ94hsaSG=r1hWX3_F`D()bAyvaQ;N_ zkhH!$f&GZ7^WD;X(0Bh`MDiQ*BN8{xIa!LJVV0G`Is0DIQYcRyvzVIrOsX@!CEEja z^fraF*LvtGh4VC)U^nq&0aN!w{#~VTYNVV!TZKo=C#+*4HPtAha5q)f=(S1VOA%zPZeT*{0qNaDGXsl-jnO|(heJRwNjYy%j$I?~z%DQ(p)&0q^Z`yP@fvcf}i zNp6rF3&78e=4h+H^om;JRYW)0UX2>V?Udh9P$LfILYki2E~If|nH#+%;wLZBbH!sp zn3t_mlH9-oSzE9B%`1YOFulOl^(6&cQDS_GlNj-A@=g-t4j!>l_LK<9bV^e3V{W`> zA!c7ODX?7_UQq+O#(6+@(SWp!JyPk%t3XEMRI{64R<(N4`@+=Bd7 zC_m$k_z0Qzrz+qmkT*%(7j8!l@eR&H{DWqQ#d4qC=fneg%Ks7%?_s-1=01JGJ@+YQ zFqrd7fu)L$M0rrzt~QerwTGuf>2jB{gG?fiiIF(s)|Z$S#*K5U-yT@V4Omht2;i;X$WHFOe)!$p2V*VFfO|TQ1?rzGq`G0jU4p$klgZC+z zrF)it^{0cNMK$lozGZ@1H}W0_ef||MAZVS|)BLONJ1=MsKREbMm_PAdUeLrAv@UnW zMBCmjBx*JIODD#01%G6kaj6k`ze6URmWAM=6bCr%y-uUUb>`7Dy1(nxvIg=P^1i?@ zu_1faXp`gM<#iE!6$ljK5%(qcxso5wc1^-AUH*&8c8(QY8b9QMkLU-GbdlTm2Q)Z1 zK5|WqIFvakx;-?cNsGwVqPWkwt9>Ju#evZvO#9@tZ^T5(Jf-u=n-a1?)okl7-scFa zzK}Jf+y0AhpW+bF1CJ#ec`VB%78rX3s=mUBEew0drP&gaUn+~PnLyP%N*CD|0#$Ew z8Zv6)1R8RSHQ^4bK0Xbqj^7Z2lb48OFBFU>BUutU9nF2ohblt7R5Xoy>f|u!@!*pgSwez($9}>b!%AN4ik;LgwCF|=1xp7p%Y;Y3E zntBdoZN{$CtM&rtUf$1wGqOekXF4TtehV3oe9A zAM4l;LZ&s&At2L^5YjWUZaH`|a~H}jIV%|u)6W!yW)sFEzSAjYQJ?WI6ui}jp4%Sr zp)YM`Hte<7PSF^ANnoQRQxs2?9ln{{wzb1+nWCH#WP;j0&K=vb`cbAR!fL+DT;&WYn>Vc#j9Q{f_mgv#dN&&>cW+`dIHVsO=YmS&5}e z{aym7ZQfp{HAJ4k_GRjPx9kCm>O{DNxHAc9yaCo^2udms!FK%+UDn;&B@`s?ihvE1 zF@Fc9n^xPqo{zKS-7q;UBtIf?2Old5bRqqsriZdXZ9^>3ZtQoEsr#ai-h$eCt%t5a zZ5OcwyOIAortXLQyV{)8NI849qRmMrQd5m03cq({p$!{Q8-Gg558hbgG1S*k?BvdH zML~>0BGUjCCvGbsoR$sf4XOyl4gg1?B>-|=z)^1@PSiC==R)LzZf??v)>RrX^jn1qt(Xd(!!gh-j z4`}OW5Dz!A9V8)apLK_@O)77QLD&eqruCH>+}aFo&4Zggb}nZy%L30FCHO^4)QdI* zb0co}HBDRhBZf`KjSj~)@Vfwu~->S_D^1+R%|HnuKcFPw4Z^vXP0&_7&n zz|P&TV7~4dnC+~Cp+&U{L8e99*DfS#U3iESg!vF`ncXub~~-0L}PSnZjz(xbcfCKqFjA!a}~{ z-?red_{bHTwwyUAy2~@5!KUe@+=IfsEQYfq{!KgGwDZG6%Fv`6$>MO?ur#(>7e8`@ zrR`+p=r-_lA?}G}9@|(hF<kkTI$~ ziH7_J)sbu|gL2evXFcDNp*3@$#Ycnj3UbPoE z_woZ4oRKvWIMXSCXKPmrOJkKO|4}W3t5BIzVF62HuXKqV1z~B2&vsp?j*xB-iAX`W z1OKl;(V8@rLA`C2VrR%=Mb>8o>lUE8?zS*E;%h3 zaB1%mgk~GYleeuDw5ZSc*9qd%=(+958#>dQnGJh2UYnvZIFmr2MYbrODntA#w{2^P zUuKGOMv#e1`x$p^%j)e+QH0fepLt!XA4eGGvL(y(mmlplCppy$a|b#)%bSh=R(jn} z5ayfvIGH>3Db1apyO{gEDan`_!K-Edo}w|B`+^G^@^sUi@|yrYf=kfhdUkKD!WYzA zy{kkx;3PtH?o*k<-rihBo9P;lVgsm68(9JoxIaJuM;nusYJJxQ(*hodzqKn(sL8Qw ze4k*$O@amIPh2UOm5|NU?PUd+__Zn?WcHYdoBNZi4P{Qqz7O2FhQ zs&z=nzK5MGbP_@)A(Mmn?q(H{-|fefg<-r%%82D%eJPvuE{Ccpo4;cVR%8F)uyix*UlnE3!^-}>m0Y-I zA=T9=q0(BAewjlU$|f(f=!-$N$ZcH3R_s@|Djr(^ZPO;@#q@JiHzmU`40UsygStsA zy!Tjm_`smC@F*KqQ*;t^!kOBC{k0n2jnkrYHq`oF1SW(@*|14X^bxXrubMSwc(3_3 zmeo1ZA!U6kQ86bU+LcIm#JpLUlyk+p4Dm~4j#)`-JcVT#eV{{=eO5pdk3^;cgyrZDGmHQ8>#P89f44fGV{>R1A zCeX${vm&>|D^nuiX4atAwS%c1L_n8W>%akI3w*DvdeG9TTuNXeRh4u{(QiBQ=KylO zH1QNe4&Yl{E?z4_`n((7a;dBtZ?Ii#jaZ#Hfc*wJR~LdSESjjx+-m8T*U#MsaR51& zCbqAM1Gtk>mQfOy%PenS7Ny0CJEr#Qr+tJsn2Kh8HC?NwsIz@?(*4T)l=G!(m*#6x z1s5|`eZD30EVU5J*}fb=`K$1hG)`b98#PcXNl9b5=`0s)c;l<-j?;|gw7Vqzl`SqG zm91B4;(@smeZUpc)-q*b>tGI`{AqZDb1KKM;R02Y24^{CaOLp&`kp5Tkc&+DkBUKz zGw10iQ9^J4*(*(2jv6_D=NXkP+K#Ja*=}O1H<$zX4c1YP0BYj^HX**|Z~%YGh6&RJ zgW2!^OGr}&dW_%z-sh4D;Bgpm0H5M`!)pI~mS~XnZmM6oQFQ-7HIHwzR$=q;CQHNZKJcZTS&i_exPwb3z?U?#U%4u3Z&f{9!f}VKhl^RFF*)$%Ii1J}hgEeY zOVpxjWtZ93Fdgum+%Dsvj*I7XX$2qk=Q&+1E48g7{@C-JzRcz4RkJG5cFrT|pviij zc}`!@l+}4ouD>^c=k#4o2WMki$za#9bY-{PQh83-NUwqP~({~Jp;!~RwAoII@T-&@JWNfuIFjS?!&clC4r zVR%kFmDDG^w#aS7p8#Hy?N_)X&dpmwXrd zD>Y=BtwrN(eDyU{jAXBqjg{0uAIZx1s;N@O^qMDNO3#t*TGpo$cWI{sGU>He=2($U z!R{&LR&kaBexb5|uu=B0R(rk7{!-R7&}NdW#BwT!wx#DCmJwI!(0po5S0P2bgI*g zbU@9#S?aKX%iBq(N|@8B+C|+JbgFz--t}g$(0w$jJ{pxLjmo2mU`kY_3!!8K$pRrc zR3*882Y;%ZvKM!%&+BrymotiwP3L=h(wQ6`QgeKFG=fi1cUw6tlbt=x`Imhoi4vi+ zBN?Y_SZ5!YPIblC>HU9%jJ3&&Y6=;)1|z4w{Wj{d(N9OY{sx* z!=^@-rYLq|a8c|zYeO!wKAwyDvzd_8F!2*->Wh2g2MRq}99qtZM6(gp>5`JA%MSlN zx3TqkU8xtRm8Jsqf^{QG-3p?V>Q~h;u{5C9ZyfR_N^u7*M=^CJN?mO{V0csx7_Q_2 zgKeN^!g?w%x0;Bk(bg?SieqH^m|JnZMD&}8e2G$Q1d~EBAWA)Clsk;$9+$a$(5qOc z5>d)N00T+N{v3uNHNr07MUHw}Q`))R;1;LFIOj`Mx-V)`1x`W4hWPJf{-K3^%0@1T zSEi(>r&xnp7aDf)AVoP$SqDNC=l;pE+Cgiqa?OE-RF%;kLceFnpAg0M&%`4P2~iV< zI@bh(YX!XGNm(m)DvMIhP%HR#B1FwJQVUJdAKYr`me)_U1ree+mnOEai4b+5QI=5> zPsuFr&n3|eLevSGqFS3oBf}gG+gev_?6KsG-;WS=vKCcv?ZZ;ipJkq<7GmAomk=d? z6`r5N39MkF25KewIV^WH%hj0>b*5%4r`;t3%9jxJc}+YpSEBuYTH0EsENmT2h>|}I zZ*WfKbT(X|YSQ2=rwpzfUSBlyBt&tMDgRM1l*W@f@je70ioMdL<*1Pmb(>MyqV4#L zEZbYy>J27D{gic-y?#Gf zY=x5DoV`*2A!@lM7@R5e{V&KiOQva`lYkH<--q2sLTy~aYJ@Mv#V(luU(%>gl?YKO zjyr5UT+0%T$$>8+>Re7Ztg2_TL@laTcA5PQ(*YsM?K1x9xCl`XRPa%MLez7zQrkLW zHJ$pHUi@?im!DV7s>JWPjiiGn>vbkX-K;6A6QW#yZvY|ccbX2)#aNSa$rRvd&V`4`naG>Q=QJ{z=}`ui?RH>Ei0ONgp>IaEc6nm9aYP+G|yc4p~j z*uN@5l!ul5dn>s($wI2DQ9@$AyQhAvISe6+r;_@F*A{u1NfbbavU81G-{O>9pD;wI zF*9f8GVwKQtV~-E?LK;6=X5j|amhiQqt+4j2zU+4@lvg;uhgP)Hof}v4dd8XWK$)z z(8sazy=thGDZOS1n9y^i%gg#yqC<_c=SOj%^w%n*8KaD1P4-op(KPE6XdOv>VmXx; z+YV|Cu}P^UKP(=|pqpccLft`cfZ# z$wgnP=;*^D<^MqXh^L6bn(DA-I~z9f8*4*{)su@X75^hDB8VcE`WR-J)};QtK4zsN z#9v9qQ)?nitga}1)s{#nt^3*I_Pn8~uYx-ryN@X(h)TqMLRHm1!TKLn!ApG;t(0u0 zw!LnIp0`2hQN4v4=#&Pe`t>2+gdXm8WKUdILeC?V-`E5idrtJ4&FLdNbc3Tti=o^2 z#6x9K8sVu$9TRp=O@y958Yzwu+ZeavdWq=Qiue+G*a#+tVnFD5$0&CwmT@w7Z+R8V z&g;_g&Pa>Z-ILoG$ynK*bSi5_+S8pIXUI`o&`;FRZNLbV`U10W>sCxRyM8r;KW&6_ zX<~O%+K5pWVf*c67I!L(I$WY&v=JkB&ZqA9cyO;K&iZA2TE6F8mC6{wXoGs`J6`zPi}7U6>`Wx7Pfk$$s(+yT!O8UEYkS+nnV`ijD#7B3bF`GNK*!SOo=Sw zk_p)0HX)0QG#eQaS%f7TqW2VOVpxjWrx|%Fdab^aXE~CI&P|nOW0YN{i!08 zWtFyd!)jIG<4P6b^7E=$m9~0sBk5*RMKonyR1y8}ji8EXX*g?NC4>Ejr7OGTmP!?w zCjIEEi0OBJbiIaEg#85J}nt>g|nvvf1;Ulmov z!^-}>m86QWkm_obP-(WSAM6Z672%1bKHarNF3A_IU~iO`-dYm*DgF8-))81(ZZFE; z2!@CI-WsEh1;ztM4RW z7&~3IRZ<6i7%Sh09mZll&yg-K>r;sLq$dkJx9Ie=j}ZQV7~$kEgKHo{L!#ag9Vg8%g(o z5kcQ!ixS(17CEs6p9Ry$^L`16NPM&?O$u>oybtq6NPz-LB!iqaE7QM5;1n-fi30p~!4Ulfx1rE}^jr zHv1MDd(vLl(Db>JR=a5Dr|&A6T%S966Rv#SsnqY%lIJzlZ`F;CGG{c!sCq)%xO8B= zbI(2X%NxAuDBPvWZoRH_l>3ak_`_rue-C%@w$V}3=qQgEDURXb5pKox645Vp@TH@$ z5ljljfR6H_QSLDEI#TBDIj>?Fj0-(8-t_f%w6vTPk^v+q2eKlphNvHEf`Nl;v88*o zR8pp?PeA1RuoDoJD@Uqwu9vHR^4_2C!e%rnSVO+cq|rgE1p34cg?p^D+xW65*-b6h z)`{;j%SbI){y4W)}pHHwV#rCmRg7 z=kz3_@zPzg8r|hA%}h>MvBihDKODoHig_TDvjM(&4r6_+C-pCyPXV_SQ zN=YNLoHDX&)B`Y!~)Klh&d}w#)5CrHb}ql`Pd;+3F2u zyFAD`%2njr*e*?ouQ_a&x7aXVn4JXR3?s;nc&{)NYn&Odfq1F<;<>!>W1?OVpxjWvANTFdZ;r+)m}6j*AiVlL}t! z&xko$R(o4lttMF?Q%1~PTz+0PtJ044?IhhqM$BeSS)CE%`g;QyF;8kbIGfu_2Ky~b zS9Z%Sl@Ze}{YaWyOk^C482J~~fi#K{^C26wn)>@5OE;xB>dT0!cR5tWh}mUq(6F_V zJ4|5dX4tQlyNdj(9kw5YNj+Eqk zgyF-``J(mFc&;rMPbS+s(+rD;v0@aTau|j>@DT1mZOLr&#U#RSCGS1E#nH^8HoV2)rmLCb|!1{{)XM?6LyJLi0 zCemYd5|M@Eh=&4dN;YP7&K`D5K2>I^(CdzLceh}sq^)cuMd$FMU0oDGq@@FQP$XwW zGUZ=u(a(yI@j!1$B{zc2Vx_YA4BZj4G1U>vq*H17x|1UdY2s>R#1%5@qZw9I2Lbf;k5P(v_FaBq4t=?<$C>03OdZ{biS7460BVN0p@ zraA>Ls`N_yI-SkN+mjSgdp<|U)amPL#GbL&q-d8#2iSA5XpZZNYweBCtgSZPP@%SY{Qa~4c2lXErmI)ErX@XUT5T-A zpJ*lwZ1rR4>UyLO_m@SftJ`jBzkV~$>OG^kB{p#7VSOw>Cn>IvwuH82hG6BDn=B#@ zE|?pcNz}Jnt{4dKc|5fht8?(>76V^~H zvf#g1N4Yjs)js!sa(p%Hn{U0GzRfA8*rf+G>fCc&(4w8bVuHQqxhx?IBY2c}KFPGY zWCC{gwzhu(s`Q}rJ(OeeTIBW8cNt4GNMD1U{V3}aR{N7#qCwgZq`QEutgIg8CuQ#q zoPJo1^DI$|#;U3GT4ckG6*CRf!5+RxLsG*Y{&2c6x-?exX4_uL8hR~r4lc_|)AO@3 z{(Z{M6CJZcGWB5kw|z0_C#nt& z+QzhZ9KaH_6Qk< z`c;X(hcS5UX)+czIE=9$7hjmlj0LcZWbPJ~MXAwHRFa^JKV?k}xIR?X#KVmg!#ecE zZpC!7>le@YpOxTTn%Ld&tb}EhMcDpQnZ73yy;|m$`=NV9mwD*|as6me_f6yErxo-E>PpeW101 zd2{D_uN8cS)hij!*)0VeoVZvM46eiI{J$+5Et#giRv_P-tQCBT)d*jVUv$X?81LvM zA`T`Sg#3nb&`Sdb- z%&QUU>gwWCjnVC#v#@S(D@!!Se!hn?9^r(;s`?O1)S_x-kNtux9YbfE@8@iP<(NI4 zjpStA7=W-U*S9sn%Fgy3>1;Ah-Pz=O6K8vc)d*h#FS=v`oNX7mpw<)3&<+eS3L`}4 z1fi=vohMdgB)DSC6 zr=FYdd!F-z=4A%rJyTNtR4P=_S8_4%2Zm<=r5xxXIa+O+u8_bl$s*Dxwpz{^8 zA}NbV@I?B=C8C&~q=`B&)-R={OhlBU?9Mp}Tl-pAqA_{*b(8}*;jpTHk|kENt=l??V(magoUTk4_k8>AmebE8}FD+rm*MjZ;joef$| z{k@f?rJl~>v~LU6p*ZS$D7@a~P}QOE-?Ig)vH$N_x*7Jb>QK0cmHm4wbW&glu#oC% zlu&8APrsiu%%O1JNz?cHY>{sRDts#rw6@~tZP3>e#80&Y-R_Sj$ivQI4vCL19}>@} zNP)KUN!Ngb;-hv58Vv6sSpDv}@c`3JY|E>D<3wxxxQ|`Xt=&WP)i;ig1^d;IUj&_&Nl#30R*~1!t zhIY$2Fubafmb487kJc&y#wYfJ=^lS??pbCJ1$-2g9V2C7OFGT0XF&BpUVF=EJ2rc` zS#778Gg>JJHbvqz^Bq!$G`C;Q)6B>Boo4Pk&5SR~&_`;v&|{b7elg%cvwOtk8a6cG zP_sK#&x6f<9@clTc?&<-{GaM!r9m()uzr?$x4NBiz8hzpRez~E`qDgB{~m+)8E5Wz zb4C~{axmfRE z|H<*yz;O*c$h14 z9c|`Zn%KUkqs{vmWf>*$yv*_fE{SFwZ9YO%)H$#+I@-KKi>mS{;YFEesRc#}{zseT zufm_SgWP23HQRPg^{XHgl0F|4}iN`bhmAybwp5*(*(2jv9|PUvE^lXggk! zWqU1Ky)ny3d=&WytfL&H)poSG3Gvmi?Bh7bTps>9-l_5K3v8G$!yilupJfSY%0Q2a zVG-zQmrTHv&|p#JpB!&k?cZmK25Dc_(dKP;HW>(^6vnbdE%{I_j^1Wr$q!2{PZ`<^ zOD!JGp)Ix4?P&A9Y=%+=aCS=pN1K;ug28nd>npFzMoXrN4kIz}FCK7zgxm(S2uu=exKk}ovT{`=MZ)AFfh8&{;0wFv8aQI=>-UVV=N zoW==jhplHnWQoS)($^)P;Dp1f`Z!C}qG}Ud!uJ^R zyPN}0m+(J^{E;SD*(LraT|%a*yM%mi;u3GO8sSUeO_xl7OH_A~xa=p@2`lHBG~RRw zG@d0IV-H{F*^3hn>pb&Vq83$~;ygabkXLXHe4NMc81jjlU}fidQ#y}KQ+FQu-o$y1 zW;Mc>z;c&Nfb#?#GA?^az%P^=oW^N}ty>#dqA@x1b%P5y;jpTn&l0t$+7vhNIfi^Q z=fKAe{Ei{tp$S%YgSVs`$TW2~knc_0;6_#>d|^);5LMb&B?C0GV~itgFHzl_{dc~WU&2My0Tl=;oR#ko#~Ez zH+>aM+}hCEmCm%%XSiDFBZfU`y5K+CTO5?Jy68u}iRpCQsyLXQavOWB-UOWw?N_9| z-7aebZmo^ydN*M~?@e09dRzLDG&i~x=P_jY7uB&e>KJk-8`P_1tW+FPmTpRM)b|*2 zz00AhW5{1%3sz(Qb6C0=_OI#~vWJ!Zd#e)7)#f6qt5HIwt-1Mh;CCv0F<~10n|@Mn zG0ZV!-u2S==4_FRv$?I}Oh{{)Pakv?+4m@K6k5e*oYadv4I{UgM`^aY z(g)1)y=vE#@BgIxFM|wwDpGrrNcR4(s&7DZi^GOkp%(w98sw@6Znc|N|rT`!1 zU1^FZS?fUi$pgnMr*dnfHtl_kmCI*Rk(CE6Jv<^Rhq#`OzUfSt*NLy-<}(?5AXi+G z8dYDjmPKBD1j-nHGd9M1(ionZij*@I&19k*aSNrMJE?r-A1Wn3GFI{f4<&0m<~e#| z(AZFSAk_7LN*zX&MfH!?Ci;$f_8s%|I_4?PMbam)7xMASsnT6^cdFP}a1{9Dto))a zeG1p{1zOLhl_h&|=xX+4 zQvc*_MXxLM;_TmA9ZMZmdMJ%3;$kmESXWGg}=nnnTy_C_^#t2^kK3k5lOhnXZ>mVb=F+QH; zR$MO;{ZmxF2Nc){CWT^fK%vbjcNoV-WbRgZ70bw(GkJ>QJ*Vr|QgqJghO)FQHQO6i zC^;>X!1;$@{7#W-%k=g6n|vR3{)Up~NR=)0lGeW<_O|v(!SYCy!hhp${lW=p&=?l+|gY4a#4Ir|5G6kFZe#wUQKlmV1ch z>U<{RJ&qT~|D1)<{GPrVheSOXI zOavF1@*fpLX`rOvn-Stn1bd}P%TeQ*h&e`Oi?*XxmhG&vD3$Fh?WT*U^SPzAGYtE) zj&k{ai;u54XCe}87_VIsedP>n{532gO&RDh;!H%ROD2F;VQ?nmERHv<_Mc&i25Dc_ znTShRtFZaFh$U*thiY;3HcOs~h#IDYGZ7xn)~GWPKVtQ~wqyd%L_DYo2G?P9NPEae zOQxw0+2#B2L-z5BAF>+Zi}7xkOn@_Ow-g&&<-LpYt)etYDbtaB{;Fm+FL7F7E9Ubo z(U=_hGLQbn35QknLzbvT)yh6}hbtZ9lMg-=y-B+`hgHr|8GUq3QS=a2D9X&sv_yV%@(Z2{%^8$Gwfd# zNzcQ|{=JnX>9LUNYLt*zD_Wr6F%^cS$ICGKVv#L!!CY$<1gKW9<64OwSK7a8N#v*W z>z7zZU}2r0=t**Ok@FPFhzAEZ6ikE&s5X?~$!rs_@F;|^Jlcj`*oyT*8cuu2XP zuHpfLZ9r+lz~l4V;dy>)bhX(?ag3l(b}O!zhAEiX>X=cmQfNhndRwR63rm(?WZZ~^j9O&-cl{9;M#{ZnS{)<)IzK;`;zwLuflW4 zIDtiM)IhByX^-XhX1O|(_PR78Be)koMRsO<2%!}EvqUZVP%Vz$W=YcCBZl?@Y0tws8b#Wh&1NW70B5%pK-$|& z6AZ4y==@KSjh0MPAF|8$;fL(w6T7n-;ft}wB@^IGt zr#X&O3F}(Nuta0>;>$rwa>8L%jk828s#f-%X|8nYMb|rzWA?20{&c+yG{MRhKO-x? zOjED;^1VsL-^6N!FM)GiG65CehQ7ms z7FDZpm0%gr_1qnezl@8ncU^^^&7ZE9mJVSXzN$rtkLjIyA96kMs#%rTXYY}86X|;I zXv*qzJ=fnGK-U{THE7IN$zVIObY-{PQt5g*=||GsVv6se>&d^UuBB0Qz5Upr)zsfb zEZvmis4rcw-sMmgT`$TOtj7K)vvf1;Ulm=?!^-}>m89#jkm_obP-&G&zi}Z9U5^)F z^kpJjfDyXOgO?($OcL#X;G0KGR|K#%2|_&1IsgY*O6g z+18Uuuc2#+vc2@(^5Vc;Iu}j$9@eioO#X%@Hiz}g!*E*_M|G60RBJ28wY)e&zM-2< ztls6tAz3Szqf1WcHqf!SFEkfVW@mS0(y1KXyg@gF9v@BSt!(dwy`{6G#X;$Ot|y=C zT^<{~yf}1?m9jF?TslKB4W(<_tZXjY-9rz8_<8 z3@bn8Gf8?HnM-%HwMRSF;;-4>*!jhAT@(Rb_hH#yZz_(=(#$QD?{3>b9Fp$dO~p~! zTqfQ_mkf5}qSGuzHNN!5N?PJg+xmDe*4B}XX0wzHN~tWsFGggno^&SHmLx(Z8M1$I zSS*_4$AQJM)`obljq;VtXXTFu76*1(?fEqn->CJ`Op5GBzsOk8ZhAA63Zlb8W}sg@ zMb>JwQbhEmU-cG;=5t-Gd$(re6rSMxW1E%9q%&=?XsR=5WytnWwIkPC99^=xEtY{I zmfqq-?JrssiMy#eD2^({t8|dk6P$n0go|U42dZ`17?~(ZdFm~WOh!{{@8Mt0`A zd)l}%l3~RQx`@llq@qa_-DvSfRCAQRdexJ)@}23n4c(|pW9ZJ>G^njMNl{BWa&7D4 z*?6h4j&AFWXQS;&WTdR+VCf{}a3d%)S#k^EaTMvu^3U43;z`OJF>|*^h!V+K8C)1d zWrNr{smO|$d}%xUQYb*bY|B~QR6IER_|t<3DWmFp5|P*X4`mg`PZVncJ$cJiXmT&(x7A;pPQ zC%fC&IXMGu*&fu8LUBxXBi%T>p)D3)6HC%Rs=r$&)2R9*vfWW~v{Ulr)mbvsHsZPT z*p^JwZA&H7PV9(9NgpcslE0Cag$YS|ZN7(+7)9FU;yJQ^sTn9x?MZjUQ(aUC%I(59 zG!)r1PG)7cqy4$Tz^5Bi6LChjHcA>ak2mNYoo7EkSC)=W(ooI1| z)?*PfN<3>NyGpHDp*X-wt)ptPWB0~vP8mm3)i{1kxgF>HTb9}!x>dQoIHc76ki%2m zji)-} zl)P-dV*`s@@3mm=T*=igJ(OnfG>`m%nhP)XOVO2>y<OS;rg`~wZ6N7RX7q(>fw z(j~>kE!lB0@EN_u!FX8;w(BPfOi%XyakxL zj35H|{-Fe$0Z$)6@DyOwu>`{bR~}FBO~6B+B6tw+-pK@i2TW}zhyadWL$DmMCP~l< zIO7z8QvsLf2)+*Z)p~+o0$x3p;3dH0XA=Ax@UOE8J_PKviC}xcf#(tI5BSsh1b+a$ zegVO&fKita3?!r63^dA!J3fTDpf*k-uA0`+C`0AqsUk04`IKfK5TTc+Y0a*J-f*2tGG(iS1 z?m2?dfb}mE zoZw)&iHtRQMwLDa5-s96P3s|un<6+~?+h?-OowWuI!P(jq5 zf~Yx^3RRebs4)dmTMDA46htj4h#FE5wWAdAWD*u3a}tbupmmWAWE(v zO06JDtdNgQrj|}LN3jv2ElQj=g(}L-sRRQ6#{l*KYy_+XTmd)}u;Z=--$v*LG-i|V zC|Z}h@VLir1fu{a02Tng16T!k7;pn%zv%?OM(9y0{KSEH6fM)A@Oaz|f_Z?uW)hr; z&@%|#2N<$D!HWo;iqI&)gRKOgMM$)2zs2JxXA?{SbODwEZU-a*e*)YCIBE{Ta|k_$ z7V&sIiWc!LJbq^nf^z^P_9XZ&LVF@K4)AHfK7d~WRs(iMYx--1L~GiD$8P~n2mBOp z4Pb{)5d0FM{ScZ6xCyXCz&;fEK0=};J_e6REF_o-xMdN+u?Rhh&>et&|3&a;gfa*X z0^GMB!3KmxEB*)`mwu993LptM3~&!119%Sb0O0uj30^_y74!hB@F;qKf8g<&0|?Fr z3|m5QJwkgRGzPE|@Cm>#04D=>Tt@J}2#MZfH#|NDxC!t+;7P#bg9-Wp4hBpI+yz(; zxc*Rr`w$X6&z*Rjdl!vA>cB=^MD@%Myw!s6`?&58V9%r zun*vC#}izSkmxP1#^d-C2>yZ40SHY7TnIQAa2McGz^s)7_aSs2HGYYCcoaSDBX~UR z(*!F4PoGF|7D9tp5xjuM*$9mUTmhI5c>QF8ZzCjn=@0RkZ6i1e@O8jOz^i~O0OM8@ zyot~`2<<4KokCwkNc8Z#;qfuRO@O^S37$l#4Wa!2p9ffge*lVrgVqpygpe2=tia7NPqA!_FXh8KKh=8Uy&nnFMDeBt~IR z;PJ@M63hau0~`nV8Q^rl>wt#=tIr~M8=<$)Cg{SW7{T@b9EC0eYyk8-m*7f-rXw^6 zupH0|xDT)bFlrOQPZ1KMzX^D}5YPj-3vel5c!A(PgytbM7H~CSZvp2~=sJYN$nhXN z-UIkLV9J*W9zf_2gjxVSfFl8a0jvW&c0R#N2#HbWGk9G26@tA0X97+Jd>?Qw;3>cl z07rh6;8}#8y@232Jc<$Pn|QqLLV_;<-svT{384uW5qyBh0}+}6xD9X!V8A5=cOxW5 zyJPXV319)f2lz7J1;A~9k(Uy@hR~S^Z6n|^3Z09P7%5N2<6i*x0$ML8cnP5u2<-_t z4e)8eUjb(U{`4(^|3gTOvR}jFaaRz`1Dp;x5%4hJY{1)q#{gYd61< zL;jmW=L3>}x34C+2%+)U5WJ7a0}z@FxD{|Pp#QZ5cOfK3_haz55pX=<3c#6wHv!)U z?D#(f?;`X?geD2No3Bz)XfBcMQAUCwgs#LECM_NXb0T8ncz1Fi5bbmcwBNT!DPT%z@dO208Rls z3%DO}+-(FeBlO?56P$=gF`Ky=k2~K%@Ge4&5sCmV04xLC3AhBX`<(>$B6ROv1bg67 z%!D4sPyz4^;6A{yzaV%Kp^tt^ z@F_fs+1rSRDU=5s1Ng}!1g9bNAwmxUrv8ecKj0$348Z3fCAbVBG4t!icq703Cq81HK4& z@d<(t5fU@bckp=flLU(Z=K?wbzXhBJ_$T0xfb{PP1^`z7ksyyy=4pZy9xr%`APu+^ za0%dPz`cOMepwqJ3M{{a3Wy&3k2sNbS^?G05<^615A36;1-0EFB9yFM=`@b6_3vX?gMOo zmEdKBUP0(iz}VLa{)W)!5ZVEdd!3+wkeHpHjmK934+0K-i{MR!E<@-j!2N(L0rUTl z;6a3@y+g1Nk78!OCmz26*a&z4a1~(NzZ3i%p+yMo4EQc!G2nxL5Nt+BtO^W$k3zo% zYz8d)fZ&e^wIj3`PyoaL9{|n=9P$ytRv!|G6@?S<_z2*7z&n8701o;W!3PL+BXl_6 z&w#7|tVTSKkXVg43y=Q*JPz2UKfy-`^&m72a4}#VVCVpX%Mp5iYl6{u6e}4+u&{9o zU^(CtzHX$TdL3YLCWq=KU`vF%1wi!zBAVLcf+6iz2 zV1EHvLAeDXv4XN3k3Rui1$Yhc5MY}T1aBd<5TTs_Hvsk*fYp~<5E82|%kg+Spcn8b zz&(KNMiV@T(0?H`9&jVz00CIJxfLO?a&r_Op9kCz*lQbtR}or;&?3O+0PTQx00qE5 z>C1kJ4-gWoKKPPY;sQV#@RuD4EI| zLzn%E4-_PhM+i6iC%y#0#p#J#0k~g0u^U|umcaeIi5;-ogxgodYEuF`u!(N~aAGp? z002h}6Ym3Xk}ENJG64=eB`yTuz(C@hsRY;*&KF18cO}Gf?MV7`VQJHp)^kg5u=yl^ zS6W`Tzrl`)cuTt&-RdA*X&;f+{b^TdJ3X%QUuYwj zw#LM|KK1~Im)WYc^iMmqgAc@dKfS+@7NZkCr>q~5+A4c)?=iIBL#xfSb3`lNS=yc} zrOaDpj@QHawb*kQ9#3^7^Yo3jWO@xYwuW`$?!NM}bZkOwKyjGZxyUB-v`KtMZ@zu@ F{{uL7m8t*$ literal 0 HcmV?d00001 diff --git a/.doctrees/python_client/docs/Detector.doctree b/.doctrees/python_client/docs/Detector.doctree new file mode 100644 index 0000000000000000000000000000000000000000..0e03ef0ee9f8fd61e44b0dce6f15705bf8829dee GIT binary patch literal 32992 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 literal 0 HcmV?d00001 diff --git a/.doctrees/python_client/docs/DetectorList.doctree b/.doctrees/python_client/docs/DetectorList.doctree new file mode 100644 index 0000000000000000000000000000000000000000..02c21f45bb0062c156a47850c458006b4e38a640 GIT binary patch literal 9729 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 a28h`xP26meMavv{fgNFyb2E-=YySndI+(8j literal 0 HcmV?d00001 diff --git a/.doctrees/python_client/docs/DetectorListElement.doctree b/.doctrees/python_client/docs/DetectorListElement.doctree new file mode 100644 index 0000000000000000000000000000000000000000..7c0a47e6cbf76070a167db278da243e6f15e0bbc GIT binary patch literal 20976 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 SMH(#f0y{#Hb3cySJO2x}*G`}S literal 0 HcmV?d00001 diff --git a/.doctrees/python_client/docs/DetectorModule.doctree b/.doctrees/python_client/docs/DetectorModule.doctree new file mode 100644 index 0000000000000000000000000000000000000000..f8a8e619610cd0dcfe4efada72ea4fb1afb819dd GIT binary patch literal 12106 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 XoZ@<>gi0;z_)5GK3C*)C?d^XHcWffj literal 0 HcmV?d00001 diff --git a/.doctrees/python_client/docs/DetectorPowerState.doctree b/.doctrees/python_client/docs/DetectorPowerState.doctree new file mode 100644 index 0000000000000000000000000000000000000000..878f7cc30ac05caf7575e9dcc911b3abfba6bf65 GIT binary patch literal 6185 zcmcIoZEqY$9k*kj&*z8pLz58U*uAPsV?%sb6@*ZwN|-hg!NiG@P(a0O_IBrP=DfSJ z?9Rq#i3pIW6iXu{)a?i072kkwfYcX!2EGK)*Zs}x&hFm%96LlBJ0BLtF4r-(5?Mxx+#CsIp)z(9NG@) z_`}Xmlc3*=>}0?l+5ug0Cp;092bSY8(3^qI^4|8{ly1-^dXvs1T?nB8{_K8ahqNlS zH7%_c4_ds}+Iw>U<2V!Abva=t7ZuQU6k57@K(~}M=-UtheFw6B7r$Hh-NtVR?9uPi zU9g3t^iGAE#mpW`g{~TaoV^<)zM&yol+XU?^3N)1*79dRDul4uO+1eX%VTkAmL(aG zlG?GDAbv$knc2~HLFCr6M-P8-_wmDnXRYn$wwI6(ThDH5Nj?m2KikpdD=V#gz!ceD z1(&SnR}GKFx@7Y=muK_WV6&dH`OBQm>#|Xhm6llbw$T|qESPB&lpB&Nkn(!?rbJEe zoJS0~(0~k!KhIcvwZ%QD$mCHjlc$E=GrDZ$y1aMqtTKDOQk$i~<}(f6yJzH80!ndx z`Fi4N_4Wh}!sl{o4M`P9Nz}jI zl&BH?jSzFO{tS!%xUBxngWP6TZv%``6Dt`!SMeOYqhM z6dPVkMeW1G?RLBK`0m~(5AGuSy=!u~t%``<9*=f?bvE87LP(#kKK$jJ!NTM})brN^REGBOj7BX0wo|-z} zNVesyCPdEqCrE*0EL#tj)$NVJLV*N%duxB{RY@LI9qGB;w^@+N8Av_V5Mf7sB2syE zv|P!=mC8k2%8oEMl{d~)Rx0N-b|Aeqib$72XX_r6U<&g|NYcRuxX=%gVdyc3iS#8Z zlEJ)UZfk!zbJ)Rb&MT^<>vFnPCaGe_xa**Sqoavr(5!&udZD<&u#DO!ZIw#(pE31W8a$hw% zIlED6GiQmdXqVodW#@5rknvV+*u>BI^n-j7I}HGeh11&aLrDY;(ouM3{*5 zfUX?KMxO*|GSK;^Sh(nWAvZt7Vlm=efK<|BLuA$tqHab4`k&wk2Nv>W5_woH3+`B| zIaRwLr3RX#6Lifzpb5AjmCcuOS+(a-w>3m+_0yNK8KWZ(Er5qYMBZCl+Xoz*p z1V!7LHOP1`zfb^{A`P*ghZ)sKX(OB}E?#ATx^u4p#{oSt=2|-5>784Bt0LH!TuHJhG@AxE_h10Y$2V zY_^g~zJjHuv7~ZyY-bF`;O{C9HZ!~>4d(XE(T%aoa#isF+lwhgPbA=>QzJvpS^Bqdq+9 znmVZoz)1^p1E>d+Cpi!J?ydK~4|z7Do->ACK}z)R8T4>oTbb+;iQ0^ao_+%Xp+kl5 z;jxCWyYM1c&~$%ZZo(#gt8mVO0ZY%0(o?w_p9BICld?Yb@Pqx%dR&?QQtYGKuzs7s zt78c2Expc`md71C7wx7)F*S0a_{`rRWi3M7K1xD7p{90v6qkpAQ&!@2cLifN>D(a%4-fz9a#hwre|TksN$}sdM%$2 z!dAUr7Sm4U3<;jYOm3+9wiJ#wRi?*@FXj5^UW}N7%CIZvv-ksthwULw04-Hu#UKIFQ)D$y!N~&jLNA9Q+sCrg)Xp#mo3A9-g~$&chS%o%3`e z*GD+d#-0)g>gbv4y1Y>{))y%76)^kW9-IQl;7{t`@72HG;a?&f z>V)b6w0`uNQ@wwh(04$KzCf4sY5Gwjm#a>s-&jVskY#!hkwH|fH0LsFs6v#3Ybcz~ z?{cp&Jq^4%1}siDMld$atNPOV2!5nJm??tTwQ*ee4yq4Ca&3kxWi2`!qfR|RM=q~_ ztjrVeFCf9s)5nNPmXnUDkvp99Ef9jJ4Bmu|6>|Zpr&e%GpeygAbALRaw^x#`%<-$@txo(~jk_WGC+EvY`tR zTAf(noOG@!%Z%s@vxcKb5rFuvdAgf^&6#mf4m!HA8?r8~iRG-&do-2sWqxUUlCR6J zZteNuZWQPS+j9F`ug6}m8|ty`8+;3VMO(qX;J&9Bjs<>G(8$T#u9@%)e1Tu&Q*npS zr{XW=w~_;7F460F;RbxULf}zP`gRkp%dYI5xiw@m|62Y5cC@w}B(^ zXVp=r`8t0N+cq;6NMm|uKx3&gp`RJi3;j5#D6`b_tl>LRz>JZ}BRPOo`OcnY3Z87A zCw9IDHg2ZegQZK`6OhPjxd1XIjylf&IWm$uXSz8my}FzV{k;*maxK_ZxIZ!lMb+UX zdN0%iUYV8CJIa8`*Un~x(rn&)bhCK?J$+|TPsiKYJJ_&4xPjjvQtWs0F`~eJ06)vv zRD+Vuk59(thl5oAlWfl4V3848fr@+?w*#<}=}%9_^iMuJrfWMsg~E*8Y*aG(+mkW+ zo5y679T^)a9PGhr#7QWGW8w!nR>wETcu7AuxIBg(ZILtAu36@_Yf5Y_ewNRa68l?K zViY1H5&B-Q>UO6r#Q4;j>9gGX&+6XeP4n*vhjUq^RwNM`$MKQJ&Eq9Y4*b`XNR}M< zFM}J7ao|~q%M)YeWnY|}n5Z6`|07oe?q<5yQ$eZkLQ?jXpA-+v10jgZk&-D_H2By`VUO}{&ex~Uk{tLPe|oM{D) zmqt;v357<~Tl8lG!~?J;M%WBl5V8olnNFzzu|o&(J2r|PSOd1SMvmSVeu{cygQQ^i z-aX{{m5n%_@SA$mw18v`=LCmT#?0hrA`-N!MVy~dY)4U5BFRXPo~f8^jbV#+Z8S2w z{oICzO#O2kN;?Co(K9=aMcX?dQ=df#p(Hur`@z20lVUR7H^z93sAu9l}dCwUi$*W~GOr^_#!@ss7v^UGszo|c?ejL2zsKN1NWx>oI< z)9wrQrv;LSCtYY;v99U6y5%Ku3Q~u50TFuGVcMN@u&YeIdJVKgo_txvHFOmX(5? z&*W_#`)631C(fz<>|azsa;?x?VOP1<#!Zzv`(wsKPH8ajYT3WSygJTN`uanG;AHx; ze}|1HSJ#uH>KgEmQfv0_iNI%}ll-6$)yhhtmCRLhos3SD8ksrRX|Qhrg$89x?5ERr3*yd =AlwRgFnH5GI=ECZh*mj==%b! zvaZ!nkfrl1W1$-bE>HWcrU9FF+ z)lClM5)}-AX810>YD7SFA%&m>Q4np<5>%+9Zvdc_Z72W>NWf5|Xb!u_Ajng)!F8t? z*5oSdTaX`8{5Z-N)nv_Nowx^bOM80g(Nzn)Om_jPLlFj}!w`R#2We@{Gkm&`aZAOb zyZORqWa0bb;H1XF&<{1Pd#1xe$evg=aGNcsGOu8%DJ+RxADS6LVSf`5MJ}ayOCIvw z7Y8SXHp>+{1FSCM5Rrp3B`6KEtO^o0F+PQNBKbtf3_mnAlTq3MGW2kP;DFMmi(^6} zmYJIZpOH&cTWcjqQmafZnz0+8a?Feof>i({J}mTf6!AN9SwWPUllDtc5V6?wHDq^K zwStS+j~EKPa;LHqLumJ`$V!cM83j^Aj~_Tl#^r48ByhL|943NWD31fu#cY|@wHzD{ zPf2I#i>gR^sKMJ0^9Y*>mCxfrtr%`k%2o0-SdQ0&Av%_el;GCNRk;+fK!blU_@|)+ zhO8}swS#wZ3VDtT5kxO;Z2=s$(>$c@hdubx8Ct0rz)DRp^abF1l+?0d^Xcnff;^YP zt}%q3ASL=|a`bRpolJI@g>8$8uA+fZu*HSzfLI-mMDQZ@crz#0VUw;_IA?JHEzPSB zL-|pNgdsMyUK6q z8Tmdkd;+H5E&Do_+RxIT_mFYf@6w-VXm~~8sMA_12b8AN>O-~iP^~(Q`DO5?5by=H zn{TSEs_=~EV%5DA^+gmC>Fp2pQV2!Sd|hfMRS3Dhg2El$j_(vkseq@4fW_+i0LFSw zRc%@uz>fC@ zp64UDXiBgM^#kDf0<3&y-tr75Hp#1d6qwO6!)=rWZc4IbLwR20#7J`PCvm6!Z#T#k Ai~s-t literal 0 HcmV?d00001 diff --git a/.doctrees/python_client/docs/DetectorSettings.doctree b/.doctrees/python_client/docs/DetectorSettings.doctree new file mode 100644 index 0000000000000000000000000000000000000000..33d0ddd3416f3b158828e4ee3fc76f2ab5e1f120 GIT binary patch literal 28504 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 YxO1}OSrk-!R_0giCMalLq)B`Cza=XPod5s; literal 0 HcmV?d00001 diff --git a/.doctrees/python_client/docs/DetectorStatus.doctree b/.doctrees/python_client/docs/DetectorStatus.doctree new file mode 100644 index 0000000000000000000000000000000000000000..4594dc1fe3f05d1f835ae731ab2d23e0d2ee27a1 GIT binary patch literal 14574 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 BDL()J literal 0 HcmV?d00001 diff --git a/.doctrees/python_client/docs/DetectorType.doctree b/.doctrees/python_client/docs/DetectorType.doctree new file mode 100644 index 0000000000000000000000000000000000000000..0edc6f014bb18d558460ef55f979be3d1698f341 GIT binary patch literal 5967 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 VXSz^{N$Fpa8{Pi literal 0 HcmV?d00001 diff --git a/.doctrees/python_client/docs/FileWriterSettings.doctree b/.doctrees/python_client/docs/FileWriterSettings.doctree new file mode 100644 index 0000000000000000000000000000000000000000..685c58985e6d340964cea64391b746db771b46bd GIT binary patch literal 10353 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 literal 0 HcmV?d00001 diff --git a/.doctrees/python_client/docs/FpgaStatusInner.doctree b/.doctrees/python_client/docs/FpgaStatusInner.doctree new file mode 100644 index 0000000000000000000000000000000000000000..d32f8e7a4c20962156bbaca5f90851df93acb9d7 GIT binary patch literal 21654 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 fRNZ0|bIoL{Q95z6O%|$#;RQ=$b)Bj@buQmI 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 SOSVdm=U$ffw*C#WJ>Zo9 literal 0 HcmV?d00001 diff --git a/.doctrees/python_client/docs/GridPlots.doctree b/.doctrees/python_client/docs/GridPlots.doctree new file mode 100644 index 0000000000000000000000000000000000000000..34a2f5f08346c27c7def3f14d4beb293bdf8dd87 GIT binary patch literal 9546 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 literal 0 HcmV?d00001 diff --git a/.doctrees/python_client/docs/GridScan.doctree b/.doctrees/python_client/docs/GridScan.doctree new file mode 100644 index 0000000000000000000000000000000000000000..9f1d0d3f22d697469b1a88f192a3b3bf19b2ac7e GIT binary patch literal 13831 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 J7Dx5kzX2^M&1(Pv literal 0 HcmV?d00001 diff --git a/.doctrees/python_client/docs/GridScanResult.doctree b/.doctrees/python_client/docs/GridScanResult.doctree new file mode 100644 index 0000000000000000000000000000000000000000..c2f6b12d068bc55c43a5c0564642f7abc1c4032d GIT binary patch literal 13806 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 XC=T2#$)Yvxd7c>{$+;5-o%VkLg+Q-# literal 0 HcmV?d00001 diff --git a/.doctrees/python_client/docs/GridScanResultImagesInner.doctree b/.doctrees/python_client/docs/GridScanResultImagesInner.doctree new file mode 100644 index 0000000000000000000000000000000000000000..83dc92e04a7a346be8cd8707529efe305ab9e670 GIT binary patch literal 16609 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 B+>8JK literal 0 HcmV?d00001 diff --git a/.doctrees/python_client/docs/ImageFormatSettings.doctree b/.doctrees/python_client/docs/ImageFormatSettings.doctree new file mode 100644 index 0000000000000000000000000000000000000000..0841baa00ab718136e849dd9d67b50e62777503a GIT binary patch literal 21690 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 I;;^~;zjb4%iU0rr literal 0 HcmV?d00001 diff --git a/.doctrees/python_client/docs/ImagePusherStatus.doctree b/.doctrees/python_client/docs/ImagePusherStatus.doctree new file mode 100644 index 0000000000000000000000000000000000000000..cbae23e75714e29a90ba84d60b50fae51b99bc10 GIT binary patch literal 16265 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 literal 0 HcmV?d00001 diff --git a/.doctrees/python_client/docs/ImagePusherType.doctree b/.doctrees/python_client/docs/ImagePusherType.doctree new file mode 100644 index 0000000000000000000000000000000000000000..81220bc980378ecadbe30cdbc7a30037e0ef0f93 GIT binary patch literal 6869 zcmcIp&2Jn@6}RJ=vBw|dk4-{E;;ffdumiCj5J;;%tk_MAHfzPnhOmcSMeUyMnyG5{ z7v0s#7!+v{T8O2(r9tAzKLLWn{sEl$1CY3I;j+>mxbv&3uI`@6_=`X!M_sS#y?XEc z-m7}`=JV!n|N6}d^-nCOF=gRk%XZx`a!Hzt88>pWfP_4Mncw_n{yg6h?ZkeTMp@#J zTufkvLz(X;B+Q@Wq9d1c=BHZ)|8zD6|}(L0?T8v3e_Tb9$A|(`$4p>(V*x z_{wujh9DX{VHRj7T`mTNL%@Gq^3&BldR^K~--My`Ex7Y-{N2FcI{t3L2>M;6e1opi zTVUHPwrz{KZsz-hTRuxG{3|uuqAh1E#z{~EQR55H+JMCFCw5G0v*OzRr#p`x-2Zrg zZR4r!XXM?r{q;{t65aoJegCF1MTW+-52=am*Ew67(U@z7mBA0sZZMp(+bRtHs4)1l zXqP(Wl~grt+(;jkzMnB_8-*%D#oT>el_qZ!MqcYplDI)-vwAy~PoAt#KB^q_LjZ_ekQnF6t275W{6n3^7gSZiG=X_PU; zN}b=ot~x_#4XJTDTE@7~wQ;ATWf;za)}0R?JgTE5$79iw6UIReHK^S4<@ww*TcGuq zlhIPsW6@Gd8f9ARdRVFRx7Sr?2(2MCPDjfa_ouU>Wf)FJ>+=5NI}ht%VK@$}DbS5~ z)OY2Yf1l4a^9530pNy269)nbKU214lDMqC--t^?e#Ovxa1l5opr$c3|`|7Mv8HUrL zy0X9bU~i|6)m{{mabPv%LgOMms62G*+#c#^#Jr7y6J^5q!?0X22DjF_($;8YhLv9L z{crTDgZGL)r{iaAy;0hF`q^0U&;r8aHxVseEX3SQ3@h1*G=@LXIR zuC%qgaxn)cy@a{BxN;m=xo9cr5c;iQL8^)$DcSLKkYeSN#rp+JP`i*p>@$b)`~_-k zk4np~?=BUY>lTKp%$;1Tsyxrkn2hxpmYT{-qvwS+l2|EGE2GL_Hg2jy?01C@W~br2 z+VFmkd1cOVXuT{2oDVJU*I+z9SZ}@x)=+j-n0Z2O@c+QX75rq8dzIov0A` zbLr4=&$crl^2btuQFIv8dfL_V=f6W_uS}BHb@=fow0xh+*G!Q(=6zZ*hz60bVB0)w z%W>_2I|~8kfm^(*YXTOTY&*oN?Vxg4$=VPdP6pri?19DlVU(cX(Ftr$YXp@SVhsDp z)@Td>j;nZ%t0(;lkeGG_y(KR4#12zm-6B?;ME!)Mx?R!a5y#tjcS6jXHN?d*lfIf1 z9Vbghr zikyWiP3W8)=3=D>F=50>ZSsX!kgX&DZ4Gdv2KfuoNzucJEhh?OgDQo%u?GghfT3e1`J;0HqTPCs41E*>1KUw*Lh|q zp}b)sm)HR)ZNT9WX_C~Bh47h0LMM{d4H92=DR*oPZrIx6;9IUmKnnVHQi$2E<-U;UXV4Hw$8` z3`sav5m4`tB(!}ga8XfIuuJqSQk;^^jjTZ+18NC3Zj=(M&Z(lr;nq`@G99vumdjGR z>q|olEvHSYAnoR1Op4@Cc?Y2j#WJhMeBBScEWfZxN)lP&0UIgJ1>|$+jh4gRNwF;R z4UrS}5r{quPz&5&S{I#|#1^uIAWI$PFcfPsq8+-+)DTxF=W+V(_BP1rmM%ZGqNIkaU5z%c{*=8fAwfImA)&lwRfDV6wd8}Ue9TZZfbNwyf_J+%i8gl)jS23V@wnIDOz^f2T&E-C9%AAgA7h9Ak$pHBlDiT1M$ zS)IaBZ>X^zT7Kl%g=<$Gil(6h;B~&i%gTk|KFDHhAv?^fZCo4!M~I%tVPOw3P@D@Z z@}Nkw?#MEA#$zvAC!_2JALIy`pi5k2@F6sy1a;$)xa45ffkjYQ`WAZO^4wKgFBjcx z#H!!ZXWEgNBH>en$rV}FR?bnO%2ez7g;*J$OL69)ChUqCef}Wf5xWf4IrAW+ zS*{!PW4+}41lx^Om0%*1aP$njDs1Gh0?$#}OQQbX@cxAY%loJN?;rBNzvI75wB-s} zIVgP8njMLm zLr)Peju6Y$?IDS6v#VlS8Iq4{4`GT!?9!;LVg}U*PI487^2(ZXBK%sQe(k|sK7B`q zC+IKX!7uVhIF;~o0M0l3rjp_k(HoWr`Ve`pB&*DrW1-_`F3!=YFMpVsb>*E?9M7_# S60<75Qa?jM^E}VGTmJ!Z5YlT6Gyp`H3P;Mr%{_HVMM*_LR<vn& zZpvY&v}?+B5^2MX?U5t_5#Nn~`1)(sNuzSmCH7%Vdy*#=Go1A0RK}Lst-VRMA%4_( z62^x~L~Ppehn*j%LBAK1bP(FC1HF;_w4H`!F$g$r6R zkMv^_v8v0y_aXJPkK19dO@g+YyRc1+58G)%op$%AT~$Ooc3phs^|{xfVn?dTHul*q z=~(t6yvbeyYA@sORs3z@ZyTOs-)1}T5Lnr370c#zV3m=vVhCdTZjk07u$~XfZGUj_ zZ6z>`eA~AQht79X&!gP(+@y@}QVn=q&R8y|e#PTDe%WrJD zl-_PX+SHWIN88HHGT3K4$cc$pktCX$%|Ky>rHMbkxQRc5i8Hy0ALk~ni&mjiR!UXV z1~2xoFl5%KZ4@dA<>KghRhryBO%-}>=okY((gvO#YadoT@_z1-17qw76xV^`K^?+_ z62H<(Q(!axQQxI&KEIr6S~*(3%XK>iEj2v`tp?CK*fgr-qf(haJ+Cq~oN7v(kCQR& zx7xJxaWV_e$LYGn>A?t455^%iEg6k}^q_Rl-!A8#`5ddio{g279)nd=V)dW^%M43( z{{Fn`)X=J_aXwncxIbSMEwkVvXx;hf;JqqZcTygXMN2XkXsJQrp25`Q#Kh%1w3q|- z-?ITz(_;ZsdK!J2n|fGkbnR=7m<~_RzA%Z185j5>?OmGqK@(qCF?{i5p~M3SQ3?g_F2Xc_yybpAOnxnV82S&Eh(l zxPBT~nP@8M5c*18kb0J!c!S_IBn2NuG#ebl2(=F#MxJZCJbQ+Ue(+e@c581n&)qmT zRpstvyDaqvX2#^~;0ajk<=Eg?6_Qvha4X`DgLoSY~T`Agx@agW3cAo67) zz$jV=wVHU<4Ekz_>=$YBybeG8j5e>~JaJflESC$!G?kBEVxG~(xbmEyL*|)xZQdxT z2v{|(fT9zirEQ5NPKR#{$k1~8K^UWvv*Z)bDg>1oVyu9X?a}W5Bsb6iP<@IsU@=`7 z_L{iLV-h5ux=XAm4*M}pbQh+cwHeadRM(ekz~nNpW?EW|;CQ<=H-4-WRPt4e&_kVVq&$5cGyP z@gof8<1pk(GO^Z!m>}e| zGWkp_$}SnewuZP@{p^`oO3<2$EIagN?=6AA8=8V%kD^#l&>TbmNO!8RU%sFqEW|Vl zWArxYV+wa(5p#@q#jqh((Po1eIpJwym>Qzt&~Dntc1ur49LReXaw+jaX#ozKN|U61 zZUCQIG_XT?8{>*fd2i?YJBf?$oApVH#&H;1j0BEHV;~?^wQ-d#YtL7tG?bJ~Y>do| zh#0(b1*hPWmRsszR^O~oj4T!_(gws{!r&qgHf3VbBSAkUeF~2|7+*m*Q@jvUJB%I6 zp|a+{HZH;jCxaaZJ(vlPxQ+=3))Y$w4;!l_i7WCZUUX7FvWk#|V-*2a4~+xjNrB6X zqJmwbUy`DPrcP)LeHl*N^EXDb`w{J?6T#!3F&&$kX*|dlPXBN1sIbc zIaJ<3=wi-h^;}Q4IoIVEHc4nK>pWm1r8$6n9&O)ZxHl zQbZ#QSwfMewsIIswg}M<-DPTs>x}a#x!vi2ob2i%WH*fa$f#?QQz-yW3tczB!vV)E z=sT~z{$2QUDel=L;w7aN|4kzv$xCF&9@2Q%rM##1z=6~ zN#81xvoOF?P2B8QtRzPP$AQV*KJ)O0_?`Ab8Tt!}PmpN8NRibE9QA@4>!Ia^HpyMP zVKek^Z2+(H4PI6*#OlK|!WOc5t~%oRF>s9N32is%AqMhuVND(sN!lG@bA1`RUPyE@ z$|m<=hLG{Q)IkOxK?6onJsyi|HnQxW9wSVy z%i^|ljtW&*b@iW#wfbCwGY55HSIp}32MLeZ#XaOAo4BP*RMlEvg&BxNjsqHT=E!Ec z?7}ajbMDw-8t@(YmB`-zH%3|AKyP0u@~^z{rYS_^r!GBEdOJ8Ok}*x`lN*srpL)>6 zGI_DVlGRcp-wo8y1p^z?rgRmPubZ9mRcy>p+jxw;Q?^dUTFr9(`@>i-4G6Xyt7?LY zRKn3S%T;kBf9!aQ@?H}4_txOwD6$6slK=fv{`U|3mx`9;kS_p*kK#F2^T#QB3A(5S zY(a6ew^FfKO(M0&BHjx6riT)mBF{?0r=y`tkqNG-NIJh8dPV3d;?)si!QHA!Y?)ov zqP3cQTzd#p9Aei-W#u!dK5&w&FqBu;ydC0)0`)@{?(&%*%J2mJGkEaR>;s%i_+DH}Ux}BZpn005-QE8I DkSqzx literal 0 HcmV?d00001 diff --git a/.doctrees/python_client/docs/IndexingSettings.doctree b/.doctrees/python_client/docs/IndexingSettings.doctree new file mode 100644 index 0000000000000000000000000000000000000000..37184839fa4668f212e30e6ea0a41891793ce683 GIT binary patch literal 27652 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 VrfF6<$70X30(@WVm0_^a_+Mof)u;df literal 0 HcmV?d00001 diff --git a/.doctrees/python_client/docs/InstrumentMetadata.doctree b/.doctrees/python_client/docs/InstrumentMetadata.doctree new file mode 100644 index 0000000000000000000000000000000000000000..4e94a6699760a61a5dd1b95219268115779c12d7 GIT binary patch literal 14708 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 wadO3Ts+glmiJy{a`Dw$sqP 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 literal 0 HcmV?d00001 diff --git a/.doctrees/python_client/docs/JfjochSettingsSsl.doctree b/.doctrees/python_client/docs/JfjochSettingsSsl.doctree new file mode 100644 index 0000000000000000000000000000000000000000..ca6161de1c98e6368c373d4fa71832a704a3146e GIT binary patch literal 9486 zcmeHN%WEXZ8JAYi8NF8W?%HM_9(%Lvk!(pDlS44Ev12c>Ei4<`2?nz?J>4}^-Rf7m zt5+lJ4RL~D1$A==Lk*&;dseTfxnP2OE_UrqVqXE&lm1wZQhV`!Vw;;4axP_x^8Ik zx0w)5&`aJM5e`d{r>K2Y0&G&W=f*%g0EyZIubk#49j!CZw?xfe8;ylewi=xD|{yH z@TFY+mHy6afNZ`QhY^c~16Gx~E)9SR^?=qbqQ$T7^J}C5{uspOk3+rJ@wt2VWtLy%PXlecV1X=Vb_Oh#8x!`K7ri)4qna@*J1ztYPsP-CiCJqlr;3~A>SMkxv5De8o zkeI#LjCgHS&h9G*rdYdFyi{)U>$AJfhp^Kx2JLjZpM3y?qd^3IZ^*E}((lLuM-k$z zU{k$RZ2opKHa{6$_3LDF>1CE!u@kAxS8zK3tC;?LGN%9V%`rWXly8BmMca$s>5r;vq9)L?VBH9K6u!`D$>eNnm+kYcfE*4o_F@dx>jx(K8PuDsH z_dh4mItBMX1`$pP?uD%_=w+-1-7C{mQ+2WV7urH{21r_C>bcaEdwmG&%*ra)8`4(^ zS2|VO&;wQGK3a02)qFZ16KU-MdmjZ0%;vuEE#Tp;ug=5i%BHOF_aS$iAd=yK2kdCP z|3xM5dGS>DKOmLF1g7YN<_mh&) zsNzlz+)szF&aODU-mu~{d=kZFB^Td};?5YmfBbf^@t3cKjfo@pbcDZ+?&~Kb$XRMc zvb|Z#iZ224g~4Po=w)(M_aMo(nTjwohkK;w5wP=l!0H~UT3j}xsw*>fi!}tTHC#;) z(+$@ddcK9*ebbN7ixu@+`Cet8*>i(?=Ad}P!cgzJRAis&0uw>hkSm@eSZsPm#|y24 zTFvtA^O)9+L%-#!uDxhycYGWj-~^xmCM@sejU@3}jvs}wXpQu`&F1yiJ8!)FMk|eM zR8cK7JgwK>eq+Cd6oG?)R)=}vVbe{*p!HnqiTCe4f%#U88_)B_Hp7&7dUO-k#PC4C@i=G+uQnQEi%lZ5uE|ZPE z?>(yy>~Nx~VmQ9b=pfA9pj=4jVAu9mK)se4t7D1J-h1!II1y|iOkbzu*Ycc1+_}@< z+1Y*T_KPpSej8_b*Y$yLl_7hZf&d zf!5|zaybGPQmWC%`DHDc7qtj_QzuYor24#<&&dnpq|+PE_`zxy`hKyOj6Zg4%UQ*U zob`_qk+Gp&$=xOF%kI-9kq1{|IG|=-JM>K_$m9&P4(kFU%(%xyCNB)0z2@r5D0=74nnAPSU>U{%Msaqa+2|c1U={|+2x(&|l=iaJ;KYal)k1x}TjD;&ANiZZ#Xz-yqP^1CR1 z^_5GF%z9qJ=vo$~EV=>QnzZGrVEt!Yvu`-PAdIo4too+lHGm2cIhMfC^0+yIZ7$=6 zM&09Y+uKXMUeGCqiL*+1`|F>N(8DYf9bEG`gEKrrR>3 zyc=8Ako=BJE^2Xc=|%yj?)6aB1p-?LLh5Ixm*T)!ZxnJqOhuH6Y@e^~%SMj{=o&;A zXLzBa9yPij;bkcfLjhJ<*Xd_+dKbAjXTiX_2bj<-Uenma+lmM+gYMgC6vxva$c-)t z1URg&f$z%|x@inj-{@m&^|SkOm3oKButJ~iFB6cuoI{w$6vQ}m1V_`7-}Ygp0-*#f zqnt;(VtDK>gCft#CO5tEbxy9cz61TC*iREZX->}BtdsVz-0Gnj2ej3KE;D^V8Zd;# zNEqVJ37{>51y)EKGIps{bhm%Foj7>DGB{|kI1Xcjn}O}I7`i7`E$n7%xz1};<`k7o zUL6`4BH{j(65(o2x8gx#Ul|-2LYC)A26$brDXB!nro}RCkzl9vg3%FtmCVrt%U?7lA75oS+9s^c){0 z!RzOrl&cYo48#XRd|FCjsM;cUJ9wv{kdJU7qU71#U4WCFybjq3;~rw^BF$6`V5T7$ z&Ik~DRMfI)`^K#wK%c8|*BT;Ekc#|GO&(!ulFJ^jc*kL)tJXj&*yY0auvi1v!H6Pt zO}i+s!Y6&B49-#jBd@EE<@w|YopImbPLF%|!GC8xx(AWViEkp%ex9l;sQdCE^`5^P zICd}#)n2tYZZ9pEFON59S*Z}%2e^DbRv#d!uL_DZa18GWEhp&02a3F~L5U(sJ44eP z9~}YKGV@@h4+Rb~xQyRnHX`^49B_sL@>pK9Fzdizs4zVPpGr{1g_Z8h_2Od(_^Q{< zv)QqnVZmLv$s<(XR?1PX>Ztp{`*LG&EJ4meY1omAdHzAb!*?B&?T98}l+nn8tK%*@UlB`!8`A(odxo|IGSXZxd`j%c9Pvyc-p0w~7dM7NM%8dcZ^KUrD zYRSET<;Jpl69XxkqpQ(XeM29N+(U&=!2G%G{vK)7{T==LFV0KdFX-QA^!h3OrLsYD zsU1+3QnQcM%wsj{IOUInH${LiD{Q{4P*vlZ%9VO}snu7|NaVXe*vlc5MfJSgPwEf~ zeFa50`kl}#ol*fW3<1m8jRA@cy{bam7@&_05e|&>c5#?iF@lN&IbJy^ZDvb2XZ7IO z@L_y$wD1x+F5n+Sw;yG1Az$H(1!O*ah?5{h^99RPKLB1T!765!oWSx@o1(f$iMeUh WZd4?0Dzao#MPA~iJ05f@P`LP1yW=#Ci@xTYo^Lk2KAsDwjy~o{@~#bLSn$ zs(LJ3)wbhSlNYS|PSw?0K~t~#u4a2}-Sw&s-QUu6yV`ag+t=+@RfGRKQRM3l*SV~_ zao7)qBlAy^22)(eDH^wJ7{@R##_f;{;||FAarpl(`2QaGe+2?8@`=4x=(UG+^Qq9+Q`VIUXkxPO#*R`&wh5kmDMMv`zS%t`qbU zIpgI&*>o(gr#CYPbAtfQ=2%;1%QyOGZ^ejw2qN)ptRA9r?CdV6l@HSZ5D|G1{eSKZ z@nPs%D;vG(aIfoZW$Y1gpyAxBnM1}JjafLh5%n@s=MZ_o3*~3!3uP5D^D~2)DK731 z2HY4NVEiHm(m=;BrAp z&em!z-G`@p$F0?(=q($Ej0qOF&hFj2b|qtnc=UXD4%$pKB&;}y6Pf^S;I1kuSA{j( znZmP=ot=)k&2#`ObM#S`7RMf2{C`wpk1hURg98fUdC&8;+9?tXTo46bt#)a7&;rYZ zl{ikj!r2}?m7DfveH+#$iHP#&BGZo6KXfH$jED1s?nGI8AQkG)G#F@A2ps@8(|&p8 z9!a@V${cD*X3aR#L6g@QOw@8X7R4YO>t6NzzMfh~bl!s+j&$y0QfR*O#lWgpZ?~MT zX4?I5FRbGFk;T{CP2KN@cL_W?1OlO>RL3Q&5cCI))ai{ga5CQ0z1RDzOtt?Z#|uku(ABSW6Bw=*TOggwee+>G{OTHreRCLnt-0a;J? zeOQLUYE9I}kFv>#+IWe9mU^ME6&&FWeLCe-s-b5HaH*nXQzLMxT?M$0Fd_1(`u@zA z0^q(Y0o;o$&>XtdCJ)|43JN+@l(jC?D9W1H1pqjEfalClxm3y->PhAc(uJlWAlzXx z$}?6BVbMA^6Wg5uF)iIT5ibMcrou!i0aZ#<62z~LScW`^e}^fN1@UjO5#_a#AHtD> z_|{s@>}s2O9d3koHNQ?VDu(e}Y(k>8J}C4=ft+)cH~60_Rus0qsN$x@&pz$`fkBOSrp`*!89%AT|~bOrvE!rc!fd7dl4O#VwJ@7 z`xQb?QKuq99@7_@5?M^2XCunXC13kUF?|bQ+J<|-(Ob*)uI_6s&DX?`_SkfU-7WA# z5xrk@jCc37l;greqqiyM2%xE|WQQZ5sa*xoJtjmxVcpD_0zj`Lpjo`nv2X*QGgf&# z@5>Gr(fMVjRFuCwCje*BA)dY0Q*M>AhnkX^gT$d}2sVF;$tcfVF`Mrau{o2T{?4G8 zmhmqU`7&t!d4;J`uBeo$B$~fDVj1#i{zs-n7R`UpMwC}eeh5d3=EJpG+qCrhmTUUD zTe5(j8!K9Q9S}L9a26lr{e2+iTB^V237x5~WRD}Asa=K66(&SJXOo#RC3HRwA%8B4 zcyjfewJOj#J6J^L_c5hHI_Ee+Itvc*?43-xRmvV}N@flcho&Lu{1B5-o;!6q3nH*H zbf#r|Kanp(=XWbim7+zZOeN{;j#!2~oj=Z$$kO>^Y(#mr z_dI;NzxWo%=h&P?{e3vk8Krdo3B1?8n7V{iuP+c%Q+>&PM^aO}3aMXZLge%Ja%M~c zsqsd~#h&AzHlt5kBvCCe%d>jFV6+INWHxl-7u6ssh!XUFLZt~}(!$dKpt9ZZQV zuaB`2H=})|yk4l)y1M2Cu8tp~7vJD`oJ~X2)ia6ll*$7(-o-zdawOHoiv+|}MY59- z#MG_=;`cKl@`-t0W=sKy9{>=a<8kHR7r=YY!UOU!J}4Y7!m-07ixOAh2Y{S&lqd5_ z%DGZ9QCTvPkViBPfn6JO7aDWEWZ`t4-&eIfq&O8G$@$=pC{&@=>CCzy=#>=c7l^y#;OcjCS;Ho=OQy z^7JuZQZ?u>)Dh| zo~j3hE=72Kg^3j2iXQo7!x&OdMl$T0=2uI3XxUtaGEVJRl zH{~5$ypUa(ELt?pB*s$$57>AIA4)lr>frqZ#8gGHixI@st^(p&CPY3l)0r^^Abyg9 z_z50des_U0IsdRco~sc!^F761RZ4w{@&ucWh}3c}0ovs!^6Z~VT~aCgs5hB;NIaT` z;P=B!MtSaw`MoOOcYYdn2<5aL-brQ9V^?vGf8Jj!n{C9)|0Nj9Rq zYVt!kQk3tj)voET(|rNn)zhz-`j(jHzs6=F>iqdZ7Zm7eGwH~!7R73FmFhobzs-%fZyp5X_D<3&sCZ!pQC^cDEQCARn~ zJel80Iaf+1DoZ93@`$D(5d9ZSMtLfW5iPn|EDplX+}xmr{Z%pp89M)|!fYv8R0>y; z&ht}rl~*40VPweD`8ZP|OXn&ZaWmRSO6UEI&cz>7eu7O!)ZYu&V!~4&l+PJE@9C#f z4yAhfAOSR0lk95*G_|V$`Y|R%K1nAsV+sKMAOkf0XmXa&=_B%pJ`{5!?Lfrn7no{M z4vQQCr1K8*jBcmgD`gb5C9?_1MAHzIwwa9bd=^uBMX-?0iT2K5nwEEmOhE?In+nsV zd{il4Nld>!Vj1$7{(YuI7Sq4WMwC}feh5d3={fvhoO`+6)x68%_48k`Nr;+znvJGt zPFQ#g|82^NR0|&>P^Jo!ZH!Q+b`>bU&4kFOrs--%lqInXfN%By&)L3|OQoElo@BltU1%BtyHiX?dB%#dEBvN)DlI#7*MgSr z7!fZ6+}#QjrL<5fO-bOM9I*^};6BHc$O88nHln;%@6wM{qd9=ss6o%Fqdjb_AoM++EtkAGa>R>c_A~VfVuej;`12P2)gW7UGYso zfmxos`vs##@O_Pm6(ua!3-DKXjHmDmDaT4FL{-W3LH5uz1cE=qWRxec7{Q{?7mI?t zGs|9D%%39qWhnefg}G9Ms1&Oth2I&m40#IwD^ns%;eTQy%F87`gd?T!WUb~prg*`- zR4H0Y!EfZ6l)KU2yju^a21<47VFFxw)nvyaaH(AdxbsYid;(@NV+w$azp;72F;D4j z(>C#q)aW-h2QBiLogW-1BJ86~ortg^2LRW!nP=*B%AHcCP)jmPkR&t>!PQ5YjPg7c zb5-<1nyIMn3{q*iK18I;AoT%-X;L1jl%ph4uZ&oRJW_v(DUn6$bvB~BQu0GMQl!GC zgSBgQGw<6Pzs_bL>fniZCcC({&*=QiRvHm_Si-gdTve89Ptcw^I(4(uHc0se(+QX$Zi+ z$z+r#s~E7N&#t8dyEBBPMf)|PU52oKt}suE2bH3fB<$i0T{)G9dl(t=guRO?ktOV% zY{boIA2necK^wLr5wBaHWHS&o@kBh75tcmUE&GAgaH*F49zs}p?PS{`VX0k(uqT-i z`Aj^T8B;*mRUmBi>s=?KX!0*%WQ_8ZUCN9Van@rpMJdYh0i+ci;fcGJa;lU#RFq5_ z;7HJg;eVvA8hHE~bZyfIBx!S0thwiCqA1vj=$24y0Tv z-8QShum?%YsN@+^c_SA@F$kX=2 zOo=RQKgdRu*Ghf}M@rj8`UAwhz%%kzxL4UcMBO}VM!#SjJD}7ZH1aO~NXnH|7at|$ zr8<(GjO3+u74lwTLgaJfWyTbcm#ucsN0Cjfc9TYV_Qvbc(v{Oes863RIH6 z-x{$DdH((zQzFaXe_H!P=lIkC6g zhwg=+>xOM)yL9{5cu(84F6FRi@W>@iNo;4e`xOLhY z&$!8Lx2h$*RWh>RZa?vGBI95U9n|sC%lOXUZmg*Y9sw|U1sg?&QR1OP7|{*48gP`S_`GPr`!pINfnP>i$*Oeq=R<;7XN`e*F9y$+23` zT!rmCdkz4=OS*_Jn7Vkp2k3I?CUXZw^Po>3;)DFT?|lQlEGY59ehB>VoXOskZ&wI(cf`AoIWlc(}XT=OLm;=yv9%3E9UI!b*dtLv)B= zX`97Tw04t7M!+0=N0M=SHW>pY{+-APooH!R7FkwEx6zzr5Ack9k_B|gjQj#~K!xV7 z)^5H%_y)8$+XQ^QOINr?VokdWV5N=2;mXH^lR8<&@&$6jl<Meef#@5+IHRCv>g|o6y{-HC?jErwx5BRQTdsg(UfWO+j32Q{J{~`z*_Z?re`e%2A6?%@|f`a5a_yo4?wZ;e-l# z7`PTZn)97zy#Y^;cocR`55s+JaA3n8>Iw7paL$8uupM;k+qgAX|9Uu&Yx`ck>2&d@ zQ9W>VB(~^Q^kb=BearNXdehQ852gWEA_JIV7M4!%YNBrGS9A#Ep0HwQ7JE1zF2S1~ z5Wi^eYNpwHXW9_0x^6ce+*TVF5rN-c zeQ4D);qRk^2kW})I&R(2?3Sgw5POu`gpHvW;+QAAj7MJj;cclSDHomp033w#v0tu% zjy^hgAT>B##5q9Kc?N{Yf;si!H5^$MLBw0|c#jS{S?_oCrsKBiEgd%xhs&5zq$l8& zNE@aJ5iwh|6pV>*9$y64xhdRZLZQvIf^Luf3^@iiGQi43cWn(`ZEu7NktHf~%sw~u zJUwVRby%LkS&Oivwd3jd*()|Os*;yvMfPw&;CKXm9%_!V}z2<*MygK7uu*c9Pm!}ojM!|Ur{_SWLX%9`VDLN6V} zGa~_TX5H7}1w8Z~u1fXZ>RtEU5AmFL+s%}Fv~c%#Q}_7m?O3vxb$89w{dRN>K*74< zcP+Tsw68Uwi(0Sl>u^s%BcZ*mX=tDaHx7xK5~3W15Jq1Pdi@(v8cx$UeTaXI zfg4agPSdp8Py>Vu`w$df&`6yY-xRkTEpEoK2u4sc-G<(R9={3-3?24jzY!j6!daK= zI&9W%)wNa&i5sb2LeH3SPq*4J&2EHyb^8ir@Gx!_&w~?{YV?U)c zA4q2SHpas}58h8#BKT*#_J9{H56+8U5`~!yX^E%i&I2$EpVD9^OI%Ucv;$0X=e=;4 z?pPh}zK>oR{$dyYfxHU~{N-Fa2=@)l+}65qaeRKvi0|AFmlH}o4F>{DN1G0hmiQ)w z_QifUiN^Tv<<3_CtDQf>f9}SAj^jUni2wWn{1b%Jc&>l77i);lz7d^yBRcCwVB7)P zA_vB7G}<^34UJwo2H{+?y`rnnHO=^r5Vmw|L5kAz;yOuM;`4x0(2m`PW3i%)PCbw^ zva_cLJWkWAMuYYZ_=hJ%C}6W(kSP(NUvVdki3W=y+j1uY<~vx#7?wD8%8fEyQCVI}H3&k8m% JazSJ5{{Zm{d~^T+ literal 0 HcmV?d00001 diff --git a/.doctrees/python_client/docs/MeasurementStatistics.doctree b/.doctrees/python_client/docs/MeasurementStatistics.doctree new file mode 100644 index 0000000000000000000000000000000000000000..b77e22299b1eed19126d83cd4511e6a7328bd123 GIT binary patch literal 34504 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­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 literal 0 HcmV?d00001 diff --git a/.doctrees/python_client/docs/RoiAzimuthal.doctree b/.doctrees/python_client/docs/RoiAzimuthal.doctree new file mode 100644 index 0000000000000000000000000000000000000000..4126adbde894cad0886ef889e1cbd226f2b72aec GIT binary patch literal 10825 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 SWU+>bywHwN^(0L=wYNR9D^Zs-Ehq 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 HxYzwREm>bv literal 0 HcmV?d00001 diff --git a/.doctrees/python_client/docs/RoiCircle.doctree b/.doctrees/python_client/docs/RoiCircle.doctree new file mode 100644 index 0000000000000000000000000000000000000000..d8e59efc16a5deaf2099544df77c179e42f88fee GIT binary patch literal 11845 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 WN)k5}S-d79&$mJpIrpNl-TF6%c`GUa literal 0 HcmV?d00001 diff --git a/.doctrees/python_client/docs/RoiCircleList.doctree b/.doctrees/python_client/docs/RoiCircleList.doctree new file mode 100644 index 0000000000000000000000000000000000000000..8ca60c05ba39f20c3d97c4ccbb66828ce7496b1a GIT binary patch literal 8869 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 F{{y=>!2bXM literal 0 HcmV?d00001 diff --git a/.doctrees/python_client/docs/RotationAxis.doctree b/.doctrees/python_client/docs/RotationAxis.doctree new file mode 100644 index 0000000000000000000000000000000000000000..9b21768c69b32657cac2e5e1ce3085aae11010a8 GIT binary patch literal 14584 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 UX;!qrW6!rj)E&MZhnvm+1ssbTj{pDw literal 0 HcmV?d00001 diff --git a/.doctrees/python_client/docs/StandardDetectorGeometry.doctree b/.doctrees/python_client/docs/StandardDetectorGeometry.doctree new file mode 100644 index 0000000000000000000000000000000000000000..15ca3463aea102abe27b6b9c663ad7d5e66eedbc GIT binary patch literal 12614 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 literal 0 HcmV?d00001 diff --git a/.doctrees/python_client/docs/UnitCell.doctree b/.doctrees/python_client/docs/UnitCell.doctree new file mode 100644 index 0000000000000000000000000000000000000000..15a4fc95704027358aaff93938028a83b0b50360 GIT binary patch literal 13390 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 literal 0 HcmV?d00001 diff --git a/.doctrees/python_client/docs/ZeromqPreviewSettings.doctree b/.doctrees/python_client/docs/ZeromqPreviewSettings.doctree new file mode 100644 index 0000000000000000000000000000000000000000..b29431be3065ba7cc76b1ab1bb292ba3f83b7148 GIT binary patch literal 12258 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 literal 0 HcmV?d00001 diff --git a/.doctrees/python_client/docs/ZeromqSettings.doctree b/.doctrees/python_client/docs/ZeromqSettings.doctree new file mode 100644 index 0000000000000000000000000000000000000000..380e3e7d1501548dd78f353135be29d6f5219a18 GIT binary patch literal 14563 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 Acknowledgements — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

Acknowledgements

Citation: F. Leonarski, M. Bruckner, C. Lopez-Cuenca, A. Mozzanica, H.-C. Stadler, Z. Matej, A. Castellane, B. Mesnet, J. Wojdyla, B. Schmitt and M. Wang “Jungfraujoch: hardware-accelerated data-acquisition system for kilohertz pixel-array X-ray detectors” (2023), J. Synchrotron Rad., 30, 227-234 doi:10.1107/S1600577522010268.

The project is supported by :

  • Innosuisse via Innovation Project “NextGenDCU high data rate acquisition system for X-ray detectors in structural biology applications” (101.535.1 IP-ENG; Apr 2023 - Sep 2025).

  • ETH Domain via Open Research Data Contribute project (Jan - Dec 2023)

  • AMD University Program with donation of licenses of Ethernet IP cores and Vivado software

This software uses Viridis, Magma and Inferno colormaps from Matplotlib under its BSD-compatible license

\ No newline at end of file diff --git a/CBOR.html b/CBOR.html new file mode 100644 index 00000000..21b52e3d --- /dev/null +++ b/CBOR.html @@ -0,0 +1 @@ + CBOR messages — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

CBOR messages

To communicate between FPGA-equipped receiver system and writers, Jungfraujoch is using binary CBOR encoding with tinycbor library (Intel). The protocol is based on and compatible with DECTRIS Stream2. There are minor differences at the moment:

  • LZ4 alone is not allowed; Bitshuffle+LZ4 and Bitshuffle+Zstandard are allowed

  • Few fields are currently absent

  • Extra fields are present beyond DECTRIS standard

  • There are calibration and metadata messages defined beyond DECTRIS specification

Start message

Field name

Type

Description

Present in DECTRIS format

type

String

value “start”

X

magic_number

uint64

Number used to describe version of the Jungfraujoch data interface - to allow to detect inconsistency between sender and receiver

detector_distance

float

Detector distance [m]

detector_translation

Array(float)

Detector translation vector [m]

X

beam_center_x

float

Beam center in X direction [pixels]

X

beam_center_y

float

Beam center in Y direction [pixels]

X

countrate_correction_enabled

bool

Countrate correction enabled

X

flatfield_enabled

bool

Flatfield enabled

X

number_of_images

uint64

Number of images in the series

X

image_size_x

uint64

Image width [pixels]

X

image_size_y

uint64

Image height [pixels]

X

incident_energy

float

X-ray energy [eV]

X

incident_wavelength

float

X-ray wavelength [Angstrom]

X

frame_time

float

Frame time, if multiple frames per trigger [s]

X

count_time

float

Exposure time [s]

X

saturation_value

int64

Maximum valid sample value

X

error_value

int64 (optional)

Value used in images to describe pixels that are in error state or missing

pixel_size_x

float

Pixel width [m]

X

pixel_size_y

float

Pixel height [m]

X

sensor_thickness

float

Sensor thickness [m]

X

sensor_material

string

Sensor material

X

arm_date

date

Approximate date of arming

X

pixel_mask_enabled

bool

Pixel mask applied on images

X

detector_description

string

Name of the detector

X

detector_serial_number

string

Detector serial number

X

series_unique_id

string

Unique text ID of the series (run_name parameter)

X

series_id

uint64

Unique numeric ID of the series (run_number parameter)

X

fluorescence

object (optional)

X-ray fluorescence spectrum collected at start

- energy

Array(float)

Energy of measuring point [eV]

- data

Array(float)

Fluorescence scan result data [arbitrary units]; must be strictly the same length as energy

goniometer

Map

Definition of rotation axis (optional)

X

- AXIS

string

Rotation axis name (e.g. omega) - only one axis is supported in Jungfraujoch

X

- - increment

float

Rotation axis increment (per image) in degree [deg]

X

- - start

float

Rotation axis start angle [deg]

X

- - axis

Array(float)

Vector for the rotation axis

- - helical_step

Array(float)

Translation for helical scan for 1 image [m]

- - screening_wedge

Array(float)

Wedge for screening [deg] (increment would correspond to difference between screening points)

grid_scan

object

Grid scan definition (optional and exclusive with rotation axis)

- n_fast

uint64

Number of elements along fast axis

- n_slow

uint64

Number of elements along slow axis

- step_x_axis

float

Step along X axis, can be negative [m]

- step_y_axis

float

Step along Y axis, can be negative [m]

- snake_scan

bool

Snake scan (rows alternate direction)

- vertical_scan

bool

Vertical scan (enabled: fast direction = Y, disabled: fast direction = X)

jungfrau_conversion_enabled

bool (optional)

Applying JUNGFRAU pixel conversion (to photons or keV)

jungfrau_conversion_factor

float (optional)

Factor used for JUNGFRAU conversion [eV]

geometry_transformation_enabled

bool (optional)

Transformation from detector module geometry (512x1024) to full detector geometry

pixel_mask

Map(string -> Image)

Pixel mask - multiple in case of storage cells

X

channels

Array(string)

List of image channels

X

max_spot_count

uint64

Maximum number of spots identified in spot finding

storage_cell_number

uint64 (optional)

Number of storage cells used by JUNGFRAU

storage_cell_delay

Rational

Delay of storage cells in JUNGFRAU

threshold_energy

float

Threshold energy for EIGER detector [eV]

image_dtype

string

Pixel bit type (e.g. uint16)

X

unit_cell

object (optional)

Unit cell of the system: a, b, c [angstrom] and alpha, beta, gamma [degree]

az_int_q_bin_count

uint64

Number of azimuthal integration bins in the radial direction

az_int_phi_bin_count

uint64

Number of azimuthal integration bins in the phi angle direction

az_int_bin_to_q

Array(float)

Q value for each azimuthal integration bin [angstrom^-1]

az_int_bin_to_two_theta

Array(float)

Two theta angle value for each azimuthal integration bin [deg]

az_int_bin_to_phi

Array(float)

Phi value for each azimuthal integration bin [deg]

summation

uint64

Factor of frame summation

user_data

string

JSON serialized to string that can contain the following fields (all fields are optional):

X

- file_prefix

string

File prefix

- images_per_file

uint64

Number of images written per file

- images_per_trigger

uint64

Number of images collected per trigger

- source_name

string

Facility name

- source_type

string

Type of X-ray source (use NXsource/type values, for example “Synchrotron X-ray Source” or “Free-Electron Laser”)

- instrument_name

string

Instrument name

- sample_name

string

Name of the sample

- user

any valid JSON

Value of header_appendix provided at collection start to Jungfraujoch

- attenuator_transmission

float

Attenuator transmission []

- total_flux

float

Total flux [ph/s]

- space_group_number

uint64

Space group number

- summation_mode

string

Summation mode (internal|fpga|cpu)

- overwrite

bool

Overwrite existing HDF5 files

- file_format

int

File writer format: 0 = no master file, 1 = soft links, 2 = virtual dataset, 3 = CBF, 4 = TIFF

- roi

Array(object)

ROI configurations; each element is one of:

type “box”: xmin, xmax, ymin, ymax (numbers)

type “circle”: r, x, y (numbers)

type “azim”: qmin, qmax (numbers)

- gain_file_names

Array(string)

Names of JUNGFRAU gain files used for the current detector

- write_master_file

bool

With multiple sockets, it selects which socket will provide master file

- data_reduction_factor_serialmx

uint64

Data reduction factor for serial MX

- experiment_group

string

ID of instrument user, e.g., p-group (SLS/SwissFEL) or proposal number

- jfjoch_release

string

Jungfraujoch release number

- socket_number

uint64

Number of ZeroMQ socket (on jfjoch_broker side) used for transmission

- bit_depth_readout

uint64

Bit depth of the detector readout

- writer_notification_zmq_addr

string

ZeroMQ address to inform jfjoch_broker about writers that finished operation

- xfel_pulse_id

uint64

Pulse IDs are recorded for images

- ring_current_mA

float

Ring current at the start of the measurement

- sample_temperature_K

float

Sample temperature [K]

- detect_ice_rings

bool

Ice ring detection feature is enabled

- indexing_algorithm

string

Indexing algorithm used on-the-fly; allowed values: ffbidx, fft, fftw, none

- geom_refinement_algorithm

string

Post-indexing detector geometry refinement algorithm; allowed values: none, beam_center, beam_center_tetragonal

- poni_rot1

float

Tilt of the detector rot1 according to PyFAI PONI convention [rad]

- poni_rot2

float

Tilt of the detector rot2 according to PyFAI PONI convention [rad]

- poni_rot3

float

Tilt of the detector rot3 according to PyFAI PONI convention [rad]

See DECTRIS documentation for definition of Image as MultiDimArray with optional compression.

Image message

Field name

Type

Description

Present in DECTRIS format

Optional

type

String

value “image”

X

magic_number

uint64

Number used to describe version of the Jungfraujoch data interface - to allow to detect inconsistency between sender and receiver

series_unique_id

string

Unique text ID of the series (run_name parameter)

X

series_id

uint64

Unique numeric ID of the series (run_number parameter)

X

image_id

uint64

Number of image within the series; for MX lossy compression this is sequential excluding removed frames

X

original_image_id

uint64

Number of image within the series; for MX lossy compression this includes removed frames in the count

real_time

Rational

Exposure time

X

start_time

Rational

Exposure start time (highly approximate)

X

end_time

Rational

Exposure end time (highly approximate)

X

spots

Array(object)

Spots:

- x

float

observed position in x (pixels)

- y

float

observed position in y (pixels)

- I

float

intensity (photons)

- maxc

int64

max count (photons)

- ice_ring

bool

spot in resolution range for ice rings

- indexed

bool

indexed solution

reflections

Array(object)

Reflections:

- h

int64

Miller index

- k

int64

Miller index

- l

int64

Miller index

- x

float

position in x (pixels)

- y

float

position in y (pixels)

- d

float

resolution [Angstrom]

- I

float

integrated intensity (photons)

- bkg

float

mean background value (photons)

- sigma

float

standard deviation, estimated from counting statistics (photons)

- image

float

image number (present for each spot)

- dist_ewald

float

distance to Ewald sphere (present only for indexed spots)

- rlp

float

Reciprocal Lorentz and polarization corrections

- partiality

float

Partiality of the reflection

spot_count

uint64

Spot count

spot_count_ice_rings

uint64

Number of spots within identified rings (experimental)

spot_count_low_res

uint64

Number of spots in low resolution (prior to filtering)

spot_count_indexed

uint64

Number of spots which fit indexing solution within a given tolerance

az_int_profile

Array(float)

Azimuthal integration results, use az_int_bin_to_q from start message for legend

NaN is used for empty bins and has to be taken care by the receiver

indexing_result

bool

Indexing successful

indexing_lattice

Array(9 * float)

Indexing result real lattice; present only if indexed

X

indexing_unit_cell

object

Indexing result unit cell: a, b, c [angstrom] and alpha, beta, gamma [degree]; present only if indexed

X

Unit cell is redundant to lattice - yet to simplify downstream programs to analyze results, both are provided

profile_radius

float

Profile radius of the image - describes distance of observed reflections from the Ewald sphere [Angstrom^-1]

integrated_reflections

int64

Count of integrated reflections

mosaicity

float

Angular range of spots in image from a rotation scan [degree]

b_factor

float

Estimated B-factor (Angstrom^2)

compression_time

float

Time spent on compression/decompressing image [s]

preprocessing_time

float

Time spent on preparing the image for analysis [s]

azint_time

float

Time spent on azimuthal integration [s]

spot_finding_time

float

Time spent on spot finding [s]

indexing_time

float

Time spent on indexing [s]

refinement_time

float

Time spent on refinement of indexing solution and experimental geometry [s]

index_analysis_time

float

Time spent on analyzing idnexing solution, calculating profile radius and mosaicity [s]

bragg_prediction_time

float

Time spent on predicting Bragg spots [s]

integration_time

float

Time spent on Bragg integration [s]

processing_time

float

Total processing time [s]

xfel_pulse_id

uint64

Bunch ID (for pulsed source, e.g., SwissFEL)

X

xfel_event_code

uint64

Event code (for pulsed source, e.g., SwissFEL)

X

lattice_type

object

Bravais lattice classification of the indexing result (present only if available)

X

- centering

string

One-letter centering code: P, A, B, C, I, F, or R

- niggli_class

int64

Integer identifier for the Niggli-reduced Bravais class

- system

string

Crystal system: triclinic, monoclinic, orthorhombic, tetragonal, trigonal, hexagonal, cubic

jf_info

uint64

Detector info field

receiver_aq_dev_delay

uint64

Receiver internal delay

receiver_free_send_buf

uint64

Receiver internal number of available buffer locations

receiver_buf_in_sending

uint64

Receiver internal number of buffer locations currently in sending/writing

receiver_buf_in_preparation

uint64

Receiver internal number of buffer locations currently in processing

storage_cell

uint64

Storage cell number

saturated_pixel_count

uint64

Saturated pixel count

pixel_sum

uint64

Sum of all pixels, excl. error and saturation

error_pixel_count

uint64

Error pixel count

strong_pixel_count

uint64

Strong pixel count (first stage of spot finding)

min_viable_pixel_value

int64

Minimal pixel value, excl. error and saturation

max_viable_pixel_value

int64

Maximal pixel value, excl. error and saturation

resolution_estimate

float

Diffraction resolution estimation [Angstrom]

X

data_collection_efficiency

float

Image collection efficiency []

packets_expected

uint64

Number of packets expected per image (in units of 2 kB)

packets_received

uint64

Number of packets received per image (in units of 2 kB)

bkg_estimate

float

Mean value for pixels in resolution range from 3.0 to 5.0 A [photons]

beam_center_x

float

Beam center X from post-indexing refinement [pixel]

X

beam_center_y

float

Beam center Y from post-indexing refinement [pixel]

X

beam_corr_x

float

Beam center correction X applied during processing [pixel]

X

beam_corr_y

float

Beam center correction Y applied during processing [pixel]

X

adu_histogram

Array(uint64)

ADU histogram

roi_integrals

object

Results of ROI calculation

X

- sum

int64

Sum of pixels in ROI area [photons]

- sum_square

int64

Sum of squares of pixels in ROI area [photons]

- pixels

uint64

Valid pixels in ROI area

- max_count

int64

Highest count in ROI area [photons]

- x_weighted_sum

int64

ROI pixel X position multiplied by photon count [photons * pixels]

- y_weighted_sum

int64

ROI pixel Y position multiplied by photon count [photons * pixels]

user_data

string

Optional user defined text information - this is image_appendix serialized to JSON format

X

data

Map(string -> Image)

Image

X

Metadata message

Field name

Type

Description

Present in DECTRIS format

Optional

type

String

value “metadata”

X

magic_number

uint64

Number used to describe version of the Jungfraujoch data interface - to allow to detect inconsistency between sender and receiver

series_unique_id

string

Unique text ID of the series (run_name parameter)

X

series_id

uint64

Unique numeric ID of the series (run_number parameter)

X

images

Array(object)

Array of images (order and size of the array are not guaranteed)

X

- image_id

uint64

Number of image within the series; for MX lossy compression this is sequential excluding removed frames

X

- original_image_id

uint64

Number of image within the series; for MX lossy compression this includes removed frames in the count

- real_time

Rational

Exposure time

X

- start_time

Rational

Exposure start time (highly approximate)

X

- end_time

Rational

Exposure end time (highly approximate)

X

- spot_count

uint64

Spot count

- spot_count_ice_rings

uint64

Number of spots within identified rings (experimental)

- az_int_profile

Array(float)

Azimuthal integration results, use az_int_bin_to_q from start message for legend

- indexing_result

bool

Indexing successful

- indexing_lattice

Array(9 * float)

Indexing result real lattice; present only if indexed

X

- indexing_unit_cell

object

Indexing result unit cell: a, b, c [angstrom] and alpha, beta, gamma [degree]; present only if indexed

X

Unit cell is redundant to lattice - yet to simplify downstream programs to analyze results, both are provided

- xfel_pulse_id

uint64

Bunch ID (for pulsed source, e.g., SwissFEL)

X

- xfel_event_code

uint64

Event code (for pulsed source, e.g., SwissFEL)

X

- jf_info

uint64

Detector info field

- receiver_aq_dev_delay

uint64

Receiver internal delay

- receiver_free_send_buf

uint64

Receiver internal number of available send buffers

- storage_cell

uint64

Storage cell number

- saturated_pixel_count

uint64

Saturated pixel count

- error_pixel_count

uint64

Error pixel count

- strong_pixel_count

uint64

Strong pixel count (first stage of spot finding)

- data_collection_efficiency

float

Image collection efficiency []

- bkg_estimate

float

Mean value for pixels in resolution range from 3.0 to 5.0 A [photons] (with solid angle/polarization corrections, if applied)

X

- resolution_estimate

float

Diffraction resolution estimation

X

- adu_histogram

Array(uint64)

ADU histogram

X

- roi_integrals

object

Results of ROI calculation

X

- - sum

int64

Sum of pixels in ROI area [photons]

- - sum_square

int64

Sum of squares of pixels in ROI area [photons]

- - pixels

uint64

Valid pixels in ROI area

- - max_count

int64

Highest count in ROI area [photons]

End message

Field name

Type

Description

Present in DECTRIS format

type

String

value “end”

X

magic_number

uint64

Number used to describe version of the Jungfraujoch data interface - to allow to detect inconsistency between sender and receiver

series_unique_id

string

Unique text ID of the series (run_name parameter)

X

series_id

uint64

Unique numeric ID of the series (run_number parameter)

X

end_date

date

Approximate end date

max_image_number

uint64

Number of image with the highest number (this is counted from 1 - to distinguish zero images and one image)

images_collected

uint64

Number of image collected

images_sent_to_write

uint64

Number of image sent to writer; if writer queues were full, it is possible this is less than images collected

data_collection_efficiency

float

Network packets collected / Network packets expected []

az_int_result

Map(text->Array(float))

Azimuthal integration results, use az_int_bin_to_q from start message for legend

adu_histogram

Map(text->Array(uint64))

ADU values histogram

adu_histogram_bin_width

uint64

Width of bins in the above histogram [ADU]

max_receiver_delay

uint64

Internal performance of Jungfraujoch

bkg_estimate

float

Mean background estimate for the whole run

indexing_rate

float

Mean indexing rate for the whole run

rotation_lattice_type

object

Bravais lattice classification of the total rotation solution over the run (if available); same schema as lattice_type

- centering

string

One-letter centering code: P, A, B, C, I, F, or R

- niggli_class

int64

Integer identifier for the Niggli-reduced Bravais class

- system

string

Crystal system: triclinic, monoclinic, orthorhombic, tetragonal, trigonal, hexagonal, cubic

rotation_lattice

Array(9 * float)

Real-space lattice basis (flattened 3x3 in row-major), corresponding to the rotation indexing result

Calibration message

Field name

Type

Description

Present in DECTRIS format

type

String

value “calibration”

magic_number

uint64

Number used to describe version of the Jungfraujoch data interface - to allow to detect inconsistency between sender and receiver

data

Map(string -> Image)

Calibration map (only single pedestal array per message)

User data

In many cases there is an interest from facilities to forward more metadata, than available explicitly in the Jungfraujoch. For this reason two fields can be provided: header_appendix (sent with start message) and image_appendix (send with image message). To increase flexibility, both appendices can contain any valid JSON message. These appendices are serialized into string and stored in CBOR messages as user_data.

Notably for start message, user_data can contain more information (non-DECTRIS compliant metadata). Therefore user_data is serialized by Jungfraujoch as CBOR object. There is member user which contains header_appendix defined in OpenAPI of Jungfraujoch.

Notes on images and compression

  • Images are encoded as DECTRIS MultiDimArray with typed array tags:

    • For RGB: shape [3, height, width], type: u8

    • For grayscale: shape [height, width], type according to bit depth and sign (e.g., uint16 LE)

  • Compression:

    • Uncompressed: raw CBOR byte string

    • Bitshuffle+LZ4: tag with [“bslz4”, elem_size, bytes]

    • Bitshuffle+Zstandard: tag with [“bszstd”, elem_size, bytes]

\ No newline at end of file diff --git a/CHANGELOG.html b/CHANGELOG.html new file mode 100644 index 00000000..bcf7489c --- /dev/null +++ b/CHANGELOG.html @@ -0,0 +1 @@ + Changelog — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

Changelog

1.0.0

1.0.0-rc.144

This is an UNSTABLE release. The release has significant modifications and bug fixes, if things go wrong, it is better to revert to 1.0.0-rc.132.

  • jfjoch_broker: Improve performance of preview JPEG image generator at receiver startup (saving about 150 ms on measurement start for 16M)

1.0.0-rc.143

This is an UNSTABLE release. The release has significant modifications and bug fixes, if things go wrong, it is better to revert to 1.0.0-rc.132.

  • jfjoch_broker: Avoid copying gain calibration together with DiffractionExperiment

1.0.0-rc.142

This is an UNSTABLE release. The release has significant modifications and bug fixes, if things go wrong, it is better to revert to 1.0.0-rc.132.

  • Support for newer CUDA architectures (notably Blackwell); minimum CUDA version 12.8

  • Minor changes to jfjoch_process, jfjoch_fpga_test and jfjoch_lite_perf_test to make them more consistent

1.0.0-rc.141

This is an UNSTABLE release. The release has significant modifications and bug fixes, if things go wrong, it is better to revert to 1.0.0-rc.132.

  • jfjoch_broker: Azimuthal integration mapping is generated with parallel computations, significantly reducing setup times

  • frontend: Fix selection of FFTW in indexing settings

1.0.0-rc.140

This is an UNSTABLE release. The release has significant modifications and bug fixes, if things go wrong, it is better to revert to 1.0.0-rc.132.

  • jfjoch_broker: For DECTRIS detectors, ZeroMQ link is persistent, to save time for establishing new connection

  • jfjoch_broker: Minor bug fixes for rare conditions

  • jfjoch_process: Significantly improve performance

1.0.0-rc.139

This is an UNSTABLE release. The release has significant modifications and bug fixes, if things go wrong, it is better to revert to 1.0.0-rc.132.

  • jfjoch_broker: Further reduce startup time for DECTRIS detectors by selectively modifying SIMPLON parameters on /start

  • jfjoch_broker: Further reduce startup time for DECTRIS detectors by not setting beam center and detector distance via SIMPLON API on ‘/start’

  • jfjoch_broker: Add an extra message to ZeroMQ puller ready to monitor Lite worklow preparation time

  • jfjoch_broker: Image buffer configuration is postponed for Lite receiver flow till start message is received

  • jfjoch_broker: Use nanoseconds internally for frame/image/readout time

  • jfjoch_broker: Extra messages added for receiver operation (to be removed after debugging finished)

  • jfojch_broker: Improve profiling of different data analysis steps

  • jfjoch_broker: Record integration reflection count

  • jfjoch_broker: Fix bug where ZeroMQ preview frequency was confusing time units (micro vs. milliseconds)

  • jfjoch_broker: Fix bug where ‘/wait_till_done’ got deadlocked

  • jfjoch_writer: Fix confusion between NaN and zero in floating-point datasets

Breaking changes: detector definition is now using nanoseconds to define minimum frame time, minimum count time and readout time.

1.0.0-rc.138

This is an UNSTABLE release. The release has significant modifications and bug fixes, if things go wrong, it is better to revert to 1.0.0-rc.132.

  • jfjoch_broker: Cleanup DECTRIS start-up code to enable a shorter start time

  • jfjoch_broker: Allow for asynchronous start to allow overlapping detector configuration with other beamline preparations

  • jfjoch_broker: Goniometer axis name is converted to lowercase

  • jfjoch_broker: Fix bug, where wrong HTTP error codes were returned

  • jfjoch_process: Improve sigma estimation during merging (K. Takaba)

  • jfjoch_process: Modify spot finding thresholds

1.0.0-rc.137

This is an UNSTABLE release. The release has significant modifications and bug fixes, if things go wrong, it is better to revert to 1.0.0-rc.132.

  • jfjoch_broker: Better track time for each operation in the processing stack

  • jfjoch_broker: Rewrite preprocessing of diffraction images in the non-FPGA workflow to better use GPUs (work in progress)

  • jfjoch_broker: Remove ROI calculation in the non-FPGA workflow (work in progress)

  • jfjoch_viewer: Toolbar displays image number starting from 1 (instead of 0)

1.0.0-rc.136

This is an UNSTABLE release. The release has significant modifications and bug fixes, if things go wrong, it is better to revert to 1.0.0-rc.132.

  • jfjoch_broker: Improve logic regarding indexing architecture and thread pools (work in progress).

1.0.0-rc.135

This is an UNSTABLE release. The release has significant modifications and bug fixes, if things go wrong, it is better to revert to 1.0.0-rc.132.

  • Multiple small bug fixes scattered across the whole code base. (detected with GPT-5.4)

  • jfjoch_viewer: Improve image render performance

1.0.0-rc.134

This is an UNSTABLE release. The release has significant modifications and bug fixes, if things go wrong, it is better to revert to 1.0.0-rc.132.

  • jfjoch_broker: Add better locking for detector object - should help, when detector initialization takes too long

  • jfjoch_writer: Enable writing single, integrated HDF5 file with both data and metadata

  • XDS plugin: Add generation of Jungfraujoch plugin for XDS

  • CI: Add tests with XDS and DIALS (xia2.ssx)

1.0.0-rc.133

This is an UNSTABLE release. The release has significant modifications and bug fixes, if things go wrong, it is better to revert to 1.0.0-rc.132.

  • jfjoch_broker: Use httplib for HTTP server instead of Pistache

  • jfjoch_broker: Drop OpenSSL support

  • jfjoch_broker: Base work for multi-lattice support in the future

  • jfjoch_broker: Improve recording time of data analysis steps

  • jfjoch_writer: Save per-image information about data analysis timing

  • Update dependencies to more recent versions (spdlog, HDF5, Catch2, httplib)

1.0.0-rc.132

This is an UNSTABLE release. The release has significant modifications and bug fixes, if things go wrong, it is better to revert to 1.0.0-rc.124.

  • Documentation: Fix equation rendering

1.0.0-rc.131

This is an UNSTABLE release. The release has significant modifications and bug fixes, if things go wrong, it is better to revert to 1.0.0-rc.124.

  • jfjoch_broker: Fix bug in saving JUNGFRAU calibration (pedestal/pedestalRMS)

  • jfjoch_viewer: Fix calibration (pedestal) images being open flipped

  • jfjoch_process: Add space group detection (EXPERIMENTAL)

1.0.0-rc.130

This is an UNSTABLE release. The release has significant modifications and bug fixes, if things go wrong, it is better to revert to 1.0.0-rc.124.

  • jfjoch_broker: Rotation indexer has two retries if failes

  • jfjoch_broker: Rotation indexer handles small number of rotation images (like test shot)

  • jfjoch_broker: Integration calculates background mask based on R2 radius

  • jfjoch_process: HDF5 files are not saved by default

1.0.0-rc.129

This is an UNSTABLE release. The release has significant modifications and bug fixes, if things go wrong, it is better to revert to 1.0.0-rc.124.

  • jfjoch_broker: Significant improvements in TCP image socket, as a viable alternative for ZeroMQ sockets (only a single port on broker side, dynamically change number of writers, acknowledgments for written files)

  • jfjoch_broker: Delta phi is calculated also for still data in Bragg prediction

  • jfjoch_broker: Image pusher statistics are accessible via the REST interface

  • jfjoch_writer: Supports TCP image socket and for these auto-forking option

1.0.0-rc.128

This is an UNSTABLE release. The release has significant modifications and bug fixes, if things go wrong, it is better to revert to 1.0.0-rc.124.

  • jfjoch_broker: Handle properly reuse of image buffer locations

  • jfjoch_broker: Fix bug in counting idle slots

  • jfjoch_broker: Force obtuse angle for monoclinic cells

  • jfjoch_process: Change scaling refinement tolerance

1.0.0-rc.127

This is an UNSTABLE release. The release has significant modifications and bug fixes, if things go wrong, it is better to revert to 1.0.0-rc.124.

  • jfjoch_broker: Default EIGER readout time is 20 microseconds

  • jfjoch_broker: Multiple improvements regarding performance

  • jfjoch_broker: Image buffer allows to track frames in preparation and sending

  • jfjoch_broker: Dedicated thread for ZeroMQ transmission to better utilize the image buffer

  • jfjoch_broker: Experimental implementation of transmission with raw TCP/IP sockets

  • jfjoch_writer: Fixes regarding properly closing files in long data collections

  • jfjoch_process: Scale & merge has been significantly improved, but it is not yet integrated into mainstream code

1.0.0-rc.126

This is an UNSTABLE release. If things go wrong with analysis, it is better to revert to 1.0.0-rc.124.

  • jfjoch_broker: Fix bug for monoclinic space groups being wrongly refined when beta is much different from 90 deg.

1.0.0-rc.125

This is an UNSTABLE release. This version adds scalign and merging. These are experimental at the moment, and should not be used for production analysis. If things go wrong with analysis, it is better to revert to 1.0.0-rc.124.

  • jfjoch_broker: Improve logic on switching on/off spot finding

  • jfjoch_broker: Increase maximum spot count for FFBIDX to 65536

  • jfjoch_broker: Increase default maximum unit cell for FFT to 500 A (could have performance impact, TBD)

  • jfjoch_process: Add scalign and merging functionality - program is experimental at the moment and should not be used for production analysis

  • jfjoch_viewer: Display partiality and reciprocal Lorentz-polarization correction for each reflection

  • jfjoch_writer: Save more information about each reflection

1.0.0-rc.124

This is an UNSTABLE release. This version significantly rewrites code to predict reflection position and integrate them, especially in case of rotation crystallography. If things go wrong with analysis, it is better to revert to 1.0.0-rc.123.

  • jfjoch_broker: Improve refection position prediction and Bragg integration code.

  • jfjoch_broker: Align with XDS way of calculating Lorentz correction and general notation.

  • jfjoch_writer: Fix saving mosaicity properly in HDF5 file.

  • jfjoch_viewer: Introduce high-dynamic range mode for images

  • jfjoch_viewer: Ctrl+mouse wheel has exponential change in foreground (+/-15%)

  • jfjoch_viewer: Zoom-in numbers have better readability

1.0.0-rc.123

This is an UNSTABLE release.

  • jfjoch_broker: Use newer version of Google Ceres for (potential) CUDA 13 compatibility

  • jfjoch_broker: Improve performance of generating preview images, especially for large detectors (9M-16M)

  • jfjoch_viewer: Improve performance of displaying images, especially for large detectors (9M-16M)

  • jfjoch_viewer: Add more color schemes for better image readability

  • HDF5: Common mutex for reading and writing HDF5 if both operations were to happen in the same executable

  • HDF5: suppress warning if path (upstream group) doesn’t exists when checking if leaf exists

1.0.0-rc.122

This is an UNSTABLE release.

  • jfjoch_broker: Add thresholding to prefer shorter vectors after FFT

  • jfjoch_broker: Add experimental mosaicity estimation for rotation experiments (this is work in progress)

  • jfjoch_broker: Update nlohmann::json to 3.12.0

  • jfjoch_viewer: Display file opening errors

  • jfjoch_viewer: When loading files over DBus add retry/back-off till the file is available

1.0.0-rc.121

This is an UNSTABLE release.

  • jfjoch_broker: Report changes in the image buffer, so viewer doesn’t reload constantly

  • jfjoch_viewer: Improve performance of loading images

  • jfjoch_viewer: Auto-throttle image loading in HTTP-sync / movie modes

  • jfjoch_viewer: Auto-foreground calculated with histogram

  • jfjoch_viewer: Fix rare segmentation fault

1.0.0-rc.120

This is an UNSTABLE release.

  • jfjoch_broker: Improve performance of binary plot export

1.0.0-rc.119

This is an UNSTABLE release and not recommended for production use (please use rc.111 instead).

  • jfjoch_broker: Add binary export of data analysis plots over OpenAPI

  • jfjoch_broker: Minor fixes to HTTP error handling

  • jfjoch_viewer: Prefer binary plots over JSON plots

  • jfjoch_viewer: Change foreground with F button + wheel

  • jfjoch_viewer: Change way how angles are displayed

  • jfjoch_viewer: Display resolution of the mouse cursor in top left corner

1.0.0-rc.118

This is an UNSTABLE release and not recommended for production use (please use rc.111 instead).

  • jfjoch_viewer: Fix issue when HTTP sync silently disconnected when it was enabled when the broker was starting measurement.

  • jfjoch_broker: Add protections on time of geometry optimization and reduce rotation recalculations

1.0.0-rc.117

This is an UNSTABLE release and not recommended for production use (please use rc.111 instead).

  • jfjoch_viewer: Add ROI results to the dataset info plots

  • jfjoch_writer: Remove HTTP interface, as it is not needed/used at the moment

1.0.0-rc.116

This is an UNSTABLE release and not recommended for production use (please use rc.111 instead).

  • jfjoch_viewer: Add binning options in the context menu

1.0.0-rc.115

This is an UNSTABLE release and not recommended for production use (please use rc.111 instead).

  • jfjoch_broker: Default spot finding settings can be configured via config JSON

  • jfjoch_viewer: FFT analysis of data in the dataset plot

1.0.0-rc.114

This is an UNSTABLE release and not recommended for production use (please use rc.111 instead).

  • jfjoch_broker: Fix generating JPEG images with resolution estimation

1.0.0-rc.113

This is an UNSTABLE release and not recommended for production use (please use rc.111 instead).

  • jfjoch_broker: Improve handling of rotation indexing

  • jfjoch_broker: More information saved in CBOR end message (WIP)

  • jfjoch_writer: Save rotation indexing lattice parameters and Niggli class

  • jfjoch_viewer: Remove (for now) primitive cell information

  • jfjoch_viewer: Use angle for dataset info plot for rotation scans

1.0.0-rc.112

This is an UNSTABLE release and not recommended for production use (please use rc.111 instead).

  • jfjoch_broker: Experimental rotation (3D) indexing

  • jfjoch_broker: Minor fix to error in optimizer potentially returning NaN values

1.0.0-rc.111

This is an UNSTABLE release.

  • jfjoch_viewer: Remove 3D lattice viewer (not really useful at this moment)

  • jfjoch_viewer: Fix auto contrast not refreshing image

1.0.0-rc.110

This is an UNSTABLE release.

  • jfjoch_broker: Add auto-contrast option for preview images

  • Frontend: Add logo image

  • jfjoch_viewer: Add logo image

  • jfjoch_viewer: For image chart allow to set min value to zero

  • jfjoch_viewer: For resolution estimation plots, visualization uses 1/d^2 as measure

  • jfjoch_viewer: Add 3D unit cell visualization (experimental/WIP/not really there)

  • Documentation: Add logo image

1.0.0-rc.109

This is an UNSTABLE release.

  • jfjoch_viewer: Add keyboard shortcuts and option to copy image to clipboard

  • jfjoch_broker: Fix bit-width and exposure time for PSI EIGER detectors

1.0.0-rc.108

This is an UNSTABLE release.

  • jfjoch_viewer: Fix bug when resolution estimation/B-Factor/Profile radius were not set (NaN)

  • jfjoch_viewer: Show spots is off by default, resolution ring mode is enabled by default

  • jfjoch_viewer: Fit to window of image is now default when size of the grid changes

1.0.0-rc.107

This is an UNSTABLE release.

  • jfjoch_viewer: Minor polishing of new functionality

  • jfjoch_broker: User NaN for empty azimuthal bins

1.0.0-rc.106

This is an UNSTABLE release.

  • jfjoch_viewer: Allow for multiple dataset info plots

  • jfjoch_viewer: Highlight current element in grid

1.0.0-rc.105

This is an UNSTABLE release.

  • jfjoch_viewer: Clean-up widgets slightly

  • jfjoch_viewer: Limit right panel to 600 pixels

  • jfjoch_viewer: Parse crystal symmetry type

  • jfjoch_viewer: Grid scan view takes color map and can be fit to zoom

1.0.0-rc.104

This is an UNSTABLE release.

  • jfjoch_writer: Fix and improve the way grid scan geometry is saved (non-NXmx extension makes it way easier)

  • jfjoch_viewer: Display grid scan results in 2D (work in progress)

  • jfjoch_viewer: Improve auto-scaling on start of images (work in progress)

  • jfjoch_viewer: Add B-factor and resolution estimate to the dataset info plots

1.0.0-rc.103

This is an UNSTABLE release.

  • jfjoch_viewer: Minor improvements to the viewer

  • jfjoch_broker: Change behavior for modular detectors: coordinates of 0-th pixel can be now arbitrary and detector will be cropped to the smallest rectangle limited by module coordinates

1.0.0-rc.102

This is an UNSTABLE release.

  • jfjoch_viewer: Minor improvements to the viewer

1.0.0-rc.101

This is an UNSTABLE release.

  • jfjoch_viewer: Auto load is better handling change of states

  • jfjoch_viewer: Fix DBus registration

  • jfjoch_viewer: Handle charts better with vertical lines on hover and status bar update

  • jfjoch_viewer: Calculate ROI in a more efficient way

1.0.0-rc.100

This is an UNSTABLE release.

  • jfjoch_viewer: Fix dbus registration

  • jfjoch_viewer: Remove background slider for diffraction image

  • jfjoch_viewer: Adjustments for 2D azimuthal image viewer

1.0.0-rc.99

This is an UNSTABLE release.

  • jfjoch_broker: Fix output during mask data collection

1.0.0-rc.98

This is an UNSTABLE release and not recommended for production use (please use rc.96 instead).

  • jfjoch_broker: For DECTRIS detectors fix dark data collection during initialization

1.0.0-rc.97

This is an UNSTABLE release and not recommended for production use (please use rc.96 instead).

  • jfjoch_broker: For DECTRIS detectors add dark data collection during initialization for bad pixel mask

  • jfjoch_broker: Refactor of calibration logic for more clear code (likely to introduce problems)

  • jfjoch_viewer: Add option to handle user pixel mask (experimental)

  • jfjoch_viewer: More options for ROI

  • jfjoch_viewer: Add window to display calibration

1.0.0-rc.96

This is an UNSTABLE release.

  • Fixes in CI pipeline

  • jfjoch_broker: Remove PNG preview, no dependency on libpng

  • jfjoch_writer: Fix UTC timestamp being generated wrong (mix between milli- and microseconds)

  • jfjoch_viewer: Show data collection time in dataset tooltip

  • jfjoch_viewer: Allow to choose the calibrant (presets for LaB6 and silver behenate)

  • jfjoch_viewer: Auto foreground value

  • Use external libjpeg-turbo and libtiff: simpler build stack, these are built and linked statically in automated Docker builds

  • Remove OpenBLAS dependency

1.0.0-rc.95

This is an UNSTABLE release.

  • Fixes in CI pipeline

  • Add git-lfs to Rocky8 docker image

Previous releases (91-94) had a wrong FPGA image upload to Gitlab release. This is now solved.

1.0.0-rc.94

This is an UNSTABLE release.

  • FFTIndexer: Add limit on angles to avoid colinear vectors

  • Docker images: Add 3D Qt

  • Gitea: Fixes to the pipeline

1.0.0-rc.93

This is an UNSTABLE release.

  • CI: Fixes to Gitlab based pipeline

  • PCIe driver: Fix PCIe revision being hex number

1.0.0-rc.92

This is an UNSTABLE release.

  • jfjoch_broker: Fix code that predicted Bragg reflections scattering back from the sample.

1.0.0-rc.91

This is an UNSTABLE release. This release introduces new features, which usually means these need more field testing before enough maturity. For production use we recommend waiting for a future bug-fix release.

  • FPGA: Implement high pixel value threshold - pixels above the given value will be considered saturated

  • jfjoch_broker: Spot finding and integration predictions are ported to a GPU

  • jfjoch_broker: Estimate resolution

  • jfjoch_broker: Lattice search

  • jfjoch_broker: Many more improvements in image analysis

1.0.0-rc.90

This is an UNSTABLE release.

  • jfjoch_broker: for indexing min index spots for a viable cells can be changed via OpenAPI

  • jfjoch_viewer: Optional auto-reanalyze images

  • jfjoch_writer: Add option where no files at all are saved

  • Documentation: improvements

1.0.0-rc.89

This is an UNSTABLE release.

  • jfjoch_broker: Fix resolution estimation code

  • jfjoch_broker: Fix Wilson B-factor calculation code

  • jfjoch_viewer: Improve display of plots

  • jfjoch_viewer: Fix segmentation fault

  • jfjoch_viewer: Display missing metadata when using HTTP

  • jfjoch_viewer: Fix bug when opening the same file twice

1.0.0-rc.88

This is an UNSTABLE release.

  • jfjoch_viewer: Add resolution estimation to the image information

  • jfjoch_broker: Minor changes to resolution estimate routine

1.0.0-rc.87

This is an UNSTABLE release.

  • jfjoch_viewer: Display more image metadata (angle / exposure time)

  • jfjoch_viewer: Improve I/sigma and B-factor plots

  • jfjoch_broker: Estimate resolution based on visible spots

1.0.0-rc.86

This is an UNSTABLE release.

  • jfjoch_broker: Update logic when initializing detector to make it a bit more resilient

  • Gitea pipelines have nocuda option for all architectures

1.0.0-rc.85

This is an UNSTABLE release.

  • jfjoch_viewer: When using online view, dataset info plots are not switched back to the first category for each image

  • jfjoch_viewer: Handle spot count better in dataset info plots

  • jfjoch_viewer: Highlight spots in ice ring resolutions in cyan, when detection is enabled

1.0.0-rc.84

This is an UNSTABLE release.

  • jfjoch_broker: Write in log which detector is being initialized

  • Changes to automated build system

1.0.0-rc.83

This is an UNSTABLE release.

  • jfjoch_viewer: Fix in generating preview image for signed data (wrong bit-width was assumed before)

  • CI: Fix script to generate python client

1.0.0-rc.82

This is an UNSTABLE release.

  • jfjoch_viewer: Enable FFTW based indexing in viewer (very slow at the moment)

  • Frontend: Minor fixes

  • Build scripts: Minor fixes to FFTW

1.0.0-rc.81

This is an UNSTABLE release. This release introduces new features, which usually means these need more field testing before enough maturity. For production use we recommend waiting for a future bug-fix release.

  • jfjoch_broker: Add option to detect ice rings, adjust width of ice ring and change of logic to exclude ice rings in indexing

  • jfjoch_broker: Add FFTW based indexer for CPU only indexing

  • jfjoch_broker: Enable saving X-ray fluorescence spectra

  • jfjoch_writer: Write total spot count (before filtering)

  • jfjoch_viewer: Add more information on source, sample, and buttom to show ice rings

  • jfjoch_viewer: Enable data processing inside the viewer

CI: Moving from Gitlab to Gitea at PSI

1.0.0-rc.80

This is an UNSTABLE release.

  • jfjoch_broker: Fix bug when wrong value for a plot (NaN or infinity) would lead to a null in a plot, which cannot be parsed by viewer

1.0.0-rc.79

This is an UNSTABLE release.

  • jfjoch_viewer: Fix bug when loading new dataset was creating a cascade of signals leading to poor performance

  • jfjoch_writer: Save nimages_per_trigger in detectorSpecific

1.0.0-rc.78

This is an UNSTABLE release.

  • jfjoch_viewer: Using a single event loop (reading images is not in dedicated thread anymore)

1.0.0-rc.77

This is an UNSTABLE release.

  • jfjoch_viewer: Display detector and dataset settings with tooltips

  • jfjoch_viewer: Clean excessive HDF5 warnings

  • jfjoch_viewer: Display unit cell

  • jfjoch_extract_hkl: Write a tool to extract reflection intensity from a dataset

1.0.0-rc.76

This is an UNSTABLE release.

  • jfjoch_broker: Increase predicted hkl to 100.0, use lighter math to exclude too-high resolution ones

  • jfjoch_broker: Use standard deviation formula to find profile radius (not the one using median)

  • jfjoch_writer: Save space group number (non-NXmx addition) in addition to name

  • jfjoch_viewer: Fix the bug on reading space_group as string

  • jfjoch_viewer: Add missing resolution labels on rings

  • jfjoch_viewer: Remove Q value from the status bar

1.0.0-rc.75

This is an UNSTABLE release.

  • jfjoch_broker: EIGER2 missing minimum threshold - hardcoded to 2.7 keV for the time being

1.0.0-rc.74

This is an UNSTABLE release.

  • jfjoch_broker: Fix for EIGER UDP port settings (vertical half of the module missing)

  • jfjoch_broker: Detector settings were not applied for EIGER/DECTRIS detector when changed after initialization

1.0.0-rc.73

This is an UNSTABLE release.

  • jfjoch_broker: Space group number treatment in OpenAPI was wrong, zero value is no longer allowed and no longer default

1.0.0-rc.72

This is an UNSTABLE release. This release introduces new features, which usually means these need more field testing before enough maturity. For production use we recommend waiting for a future bug-fix release.

  • jfjoch_broker: Refactor of indexing and geometry refinement code

  • jfjoch_broker: Handle space group/centering in refinement code

  • jfjoch_broker: Replace mosaicity with profile radius: refining the former is difficult with still images

  • jfjoch_broker: There is no longer 0.5 pxl offset for spots-to-reciprocal-space conversion

  • jfjoch_writer: Experimental saving of reflections

  • jfjoch_writer: Save space group name as string

  • jfjoch_viewer: Add profile radius and B-factor

  • jfjoch_viewer: Show 4 digits for wavelength

  • jfjoch_viewer: Match rings between calibrant and observation (will handle missing/wrong rings)

  • FPGA: Use UDP destination port to distinguish between detector modules and data streams

  • FPGA: Add experimental PTP core (PTP over L2, only Sync/Follow_up)

  • FPGA driver: Fix for Linux kernel 6.12+ (thanks to Tim Gruene)

1.0.0-rc.71

This is an UNSTABLE release.

  • jfjoch_broker: Remove resolution estimation via machine learning

  • jfjoch_broker: Harmonize code to analyze spot finding results (indexing/refinement/integration) between CPU and FPGA receivers

  • jfjoch_viewer: Fix error when HDF5 files with indexing results couldn’t be loaded on a machine without GPU

1.0.0-rc.70

This is an UNSTABLE release. This release introduces new features (geometry refinement), which usually means these need more field testing before enough maturity. For production use we recommend waiting for a future bug-fix release.

  • jfjoch_broker: Fix bug when PSI EIGER frame time was not set properly at the start of the measurement

  • jfjoch_broker: Fix PONI rot2 angle rotating detector in a wrong direction (PyFAI convention is for this angle to rotate detector downwards)

  • jfjoch_broker: Enable geometry refinement - first try (work in progress)

  • jfjoch_viewer: Fix deadlock when opening HTTP connections

  • jfjoch_viewer: Display rings as ellipses with detector tilt

  • jfjoch_viewer: Add button to calibrate detector geometry based on LaB6 image

  • jfjoch_writer: Save detector tilt angles (rot1, rot2, rot3)

  • Add Google Ceres a non-linear least-square optimization library to Jungfraujoch

  • Add experimental detector calibration routines (for LaB6)

  • Improve documentation on the ZeroMQ writer notification socket and detector geometry

1.0.0-rc.69

This is an UNSTABLE release.

  • jfjoch_viewer: Metadata can be modified for an open dataset (no option to save)

  • jfjoch_viewer: Refactor multiple issues in the viewer regarding image reading code to allow for further developments

  • jfjoch_viewer: Resolution rings not enabled by default

  • jfjoch_broker: Handle properly PONI rotations in dataset settings though still not updated properly in the HDF5 file

1.0.0-rc.68

This is an UNSTABLE release.

  • jfjoch_broker: Temperature threshold can be changed for JUNGFRAU detector

  • jfjoch_broker: Default detector settings can be configured for each detector separately

  • jfjoch_broker: Refactor spot filtering code, max spot count can be modified for dataset settings

  • jfjoch_broker: Refactor indexing refinement, make it the same for both FFBIDX and FFT indexing

  • jfjoch_broker: Reference unit cell will be taken into account for FFT indexing to filter

  • jfjoch_broker: Review PONI rotation angles and azimuthal angle conventions along with PyFAI

1.0.0-rc.67

This is an UNSTABLE release.

  • jfjoch_broker: Enable SSL

  • jfjoch_broker: Wilson B-factor only provided is fit is relatively OK (R^2 > 0.3); this will be refined much more in the future

1.0.0-rc.66

This is an UNSTABLE release.

  • jfjoch_broker: Indexers operate as thread pool, which is operating

  • jfjoch_viewer: Increase interval between loading images + fix too many verbose messages

1.0.0-rc.65

This is an UNSTABLE release.

  • jfjoch_broker: Print information regarding used image pushers

  • jfjoch_viewer: Allow syncing with Jungfraujoch server

  • OpenAPI: Clarify licensing terms in the file

1.0.0-rc.64

This is an UNSTABLE release.

  • jfjoch_broker: Fix issue in receiver light with very long preparation time for threads

  • jfjoch_broker: Add verbose option

  • jfjoch_broker: Don’t trigger pedestal if critical settings are not changed when loading detector settings

  • jfjoch_broker: Detector left in busy state when detector settings were improper

  • jfjoch_viewer: Modify DBus interface to avoid loading same file and image 0 multiple times

  • jfjoch_lite_perf_test: Add verbose option

1.0.0-rc.63

This is an UNSTABLE release.

  • jfjoch_broker: Save NX/NY for grid scan result

  • jfjoch_broker: Add processing time to CBOR output and plot

  • jfjoch_writer: Add processing time to data file

1.0.0-rc.62

This is an UNSTABLE release.

  • jfjoch_broker: Fix bug where low resolution spots were not counted properly

  • jfjoch_broker: Spot count is provided prior to filtering of spots to max_spot_count

  • jfjoch_broker: Add more spot count information to CBOR

  • jfjoch_viewer: Fix issue with ROI drawing resulting in multiple overlapping rectangles

1.0.0-rc.61

This is an UNSTABLE release.

  • jfjoch_broker: Fix bug where FFT indexing could result in a very short or even zero length vector

  • jfjoch_broker: Ice ring and indexed spot count enabled as plots and saved in grid scan results

  • jfjoch_broker: High resolution limit for low res. spot counting can be adjusted

1.0.0-rc.60

This is an UNSTABLE release.

  • jfjoch_broker: Fix bug when the neural network inference client was busy and this status was never released

  • jfjoch_broker: Revert the indexing threshold with distance from integer for Miller indices

  • jfjoch_broker: Fix bug in scattering vector calculation, resulting in indexing not working outside 1.0 A X-ray wavelength

1.0.0-rc.59

This is an UNSTABLE release.

  • jfjoch_broker: Fix bug when broker was waiting for notification message before sending end message, resulting in deadlock.

  • jfjoch_writer: Verbose option for debugging.

1.0.0-rc.58

This is an UNSTABLE release.

  • jfjoch_viewer: Fix memory leak

  • jfjoch_writer: Add detector_number/serial_number to master file

1.0.0-rc.57

This is an UNSTABLE release.

  • jfjoch_broker: Fix bug when enabling ML resolution estimation was not possible

  • jfjoch_viewer: “Movie” mode

1.0.0-rc.56

This is an UNSTABLE release.

  • jfjoch_broker: Fixing more bugs related to neural network inference for ML estimation

1.0.0-rc.55

This is an UNSTABLE release.

  • jfjoch_broker: Fixing minor bugs related to neural network inference for ML estimation

1.0.0-rc.54

This is an UNSTABLE release.

  • jfjoch_broker: Indexing with AUTO settings (FFBIDX if unit cell provided; FFT if not)

  • jfjoch_broker: Don’t remove shared memory area when deactivating detector

  • jfjoch_writer: Save writer release

  • jfjoch_viewer: Increase time for the messages in the status bar

1.0.0-rc.53

This is an UNSTABLE release.

  • PCIe driver: Imperfect solution for RHEL 9.5+ changes

  • jfjoch_writer: Fix to angle containers for AutoProc compatibility

  • jfjoch_fpga_test: Use consecutive number for devices, not interleaved

1.0.0-rc.52

This is an UNSTABLE release.

  • jfjoch_viewer: Use warmer colors to distinguish from AareGUI

  • jfjoch_viewer: Minor adjustments to DBus setting image number

  • jfjoch_broker: Fix in low resolution spot count plotting

1.0.0-rc.51

This is an UNSTABLE release.

  • jfjoch_broker: Send preview in PNG format

  • jfjoch_broker: Provide count of spots in 50.0 - 5.0 A range

  • jfjoch_broker: Provide ML resolution estimation in scan result

  • jfjoch_broker: Allow removing beam center in web preview

1.0.0-rc.50

This is an UNSTABLE release.

  • The release fixes some of many bugs introduced in recent releases

  • jfjoch_viewer: display predictions for indexed cells

1.0.0-rc.49

This is an UNSTABLE release.

  • jfjoch_broker: Handle sample temperature (K) and ring current (mA) to metadata

  • jfjoch_writer: For angle containers in NXmx add _end dataset, sample temp. and ring current

1.0.0-rc.48

This is an UNSTABLE release.

  • jfjoch_broker: fix the bug when a unit cell was not exported for a scan result.

1.0.0-rc.47

This is an UNSTABLE release.

  • jfjoch_viewer: fix dbus service path

  • jfjoch_writer: fix CBF/TIFF writing

1.0.0-rc.46

This is an UNSTABLE release.

  • jfjoch_viewer: remove dependency on image analysis

1.0.0-rc.45

This is an UNSTABLE release.

  • jfjoch_broker: Detector list returns pixel size (mm)

1.0.0-rc.44

This is an UNSTABLE release.

  • jfjoch_broker: more general definition of scan result export

Braking changes:

  • It removes additions to OpenAPI from 1.0.0-rc.43

  • It makes changes to the “unit_cell” definition in OpenAPI specs. It might be harmless in some languages and may result in errors in other implementations.

1.0.0-rc.43

This is an UNSTABLE release.

  • jfjoch_broker: Export grid scan results into a single data structure

1.0.0-rc.42

This is an UNSTABLE release.

  • jfjoch_broker: Add pixel_sum to CBOR output.

  • jfjoch_broker: Changes to sigma estimation in QuickIntegrate routine

  • jfjoch_writer: Save pixel_sum

1.0.0-rc.41

This is an UNSTABLE release. This release includes multiple new features, it should not be used in production at the moment.

  • jfjoch_broker: Estimate B-factor, mosaicity to evaluate crystal diffraction

  • jfjoch_broker: Export GPU count via OpenAPI

  • jfjoch_broker: Enable 2D azimuthal integration and PONI rotations for detector

  • FPGA: Increase the number of integration bins to 2048

1.0.0-rc.40

This is an UNSTABLE release. This release includes multiple new features, it should not be used in production at the moment.

  • jfjoch_broker: Jungfraujoch supports grid scan metadata, including dedicated plotting schemes and NXmx structures

  • jfjoch_broker: Improve metadata for rotation data collection

  • jfjoch_broker: Better handling of plotting

  • jfjoch_broker: FFT based indexing

  • jfjoch_broker: Integration, first try, results not saved at the moment

  • jfjoch_broker: Internal improvements in image handling

  • jfjoch_writer: Multiple adjustments adapt to changes in this release for new features

  • jfjoch_writer: New state management model to improve clarity of error reporting

  • jfjoch_viewer: Remote control via DBus

  • Frontend: Multiple adjustments for new features

  • Frontend: Grid scan plots

WARNING! OpenAPI contains breaking changes in regard to plotting results, so care has to be taken.

1.0.0-rc.39

  • FPGA: Bugfix for pixel masked for data analysis if summation was on

  • jfjoch_viewer: Fix segmentation fault when cursor was outside of image

1.0.0-rc.38

  • jfjoch_broker: Neural net model is not linked with C++ code due to deployment issues, it is rather distributed as python code, connected via RES

  • jfjoch_broker: Neural net model can use all 4 quadrants of the detector

  • jfjoch_broker: For EIGER image time can be provided through /start

  • jfjoch_viewer: Add image list option

  • jfjoch_viewer: Drawing circular ROIs with shift

  • jfjoch_viewer: Enable image summation

  • jfjoch_viewer: Image reader is significantly reworked, hopefully without affecting the viewer

1.0.0-rc.37

  • jfjoch_broker: Make locking rules more flexible

  • jfjoch_broker: Load mask via SIMPLON interface for DECTRIS detectors

  • jfjoch_viewer: Add status bar

1.0.0-rc.36

This is UNSTABLE release. Wait for new version to use in a production environment.

  • jfjoch_broker: Support for Jungfraujoch Lite is enabled - software-based receiver for DECTRIS detectors (required a lot of refactoring, potentially leading to unstable code)

  • jfjoch_broker: Enable Resonet support (ML-based diffraction resolution estimation)

  • jfjoch_broker: Fix error in compression, where bitshuffle/LZ4 and bitshuffle/Zstd HDF5 headers were wrongly generated for 8-bit and 32-bit data

  • jfjoch_writer: Increase buffering to 1000 images in the receiver

  • jfjoch_writer: Images can be written as CBF or TIFF in addition to HDF5

1.0.0-rc.35

This is UNSTABLE release, not properly tested. Wait for new version for using production.

  • jfjoch_broker: If module is delayed by more than 50 frames versus other modules, it will be ignored and receiver is not waiting.

  • jfjoch_writer: Save EIGER energy threshold

  • jfjoch_writer: Add /entry/sample/goniometer for compatibility with eiger2cbf program

1.0.0-rc.34

This is UNSTABLE release - introducing new features, but not properly tested. Wait for new version for using production.

  • jfjoch_broker: More consistency for file format definition (breaking change in API from 1.0.0-rc.31 for file writer settings)

  • jfjoch_broker: For storage cells mask is logical sum of detector bad pixels for all storage cells

  • jfjoch_broker: Handle situation when detector doesn’t want to gracefully stop (to be tested)

  • jfjoch_broker: Center-of-mass position and mean for ROI is added to available plots

  • jfjoch_viewer: Can extract data analysis results from “legacy” format

  • jfjoch_viewer: Display dataset name

  • FPGA: Pixel mask is used for data analysis part even if it is not applied to pixels

  • FPGA: Add pixel sum to module statistics

  • FPGA: ROI number is reduced to 16, but pixel can belong to every defined ROI

  • FPGA: Spot finder is back to full dynamic range (24-bit)

  • FPGA: More debug features for internal FIFOs

Known issues:

  • ROI count flag was added to firmware. For the time being the flag will be wrongly set to 10 due to mismatch of FPGA build scripts.

  • EIGER data acquisition has an issue that is currently debugged

1.0.0-rc.33

  • jfjoch_broker: Fix issue with EIGER settings being loaded improperly

1.0.0-rc.32

  • jfjoch_broker: Refactor code for azimuthal integration for further improvements

  • jfjoch_broker: Minor fix for EIGER (trim energies are manually set for E9M, to be fixed properly later)

  • jfjoch_writer: Fix too much verbose information

  • FPGA: Minor fixes to spot finder (enable two-pass operation and limit number range to int20)

1.0.0-rc.31

This is UNSTABLE release - introducing many features, but still needs more testing. Expecting soon to put bugfix release.

  • jfjoch_writer: Allow to enable overwriting existing files (not enabled by default)

  • jfjoch_writer: Add new HDF5 master file format, which uses HDF5 virtual data sets and links processing results to data files (not enabled by default)

  • jfjoch_viewer: Image viewer work early test version

  • jfjoch_broker: Fixes to counting packets per dataset/image

  • jfjoch_broker: Image buffer is accessible for outside to check images

  • jfjoch_broker: error/saturated pixels and dedicated ROI “beam” can be tracked online

  • jfjoch_broker: Fix bug in handling pedestal G1/G2 count time for JUNGFRAU

  • jfjoch_broker: Fix bug in applying pixel mask interfering with pedestal calculation

  • jfjoch_broker: Fix bug in EIGER initializing

  • jfjoch_broker: Save maximum pixel value to HDF5 file and export as Web plot

  • PCIe driver: Add PCIe link speed and width

  • FPGA: Improve counting error/saturated/min/max pixels

  • FPGA: Spot finder is gradual column-wise (15 columns up/down) and fixed row-wise (32 pixel boxes); previously it was fixed both column- and row-wise with 32x32 pixel areas

  • FPGA: Require Vivado 2022.2

Warning: There are breaking changes to HDF5 file format, renaming entries regarding image storage cell number and image collection efficiency.

1.0.0-rc.30

  • jfjoch_writer: replace non-blocking with blocking operation on internal queues - less likely to “loose” images within the writer

1.0.0-rc.29

  • jfjoch_broker: refactor logic regarding frame time and count time for more flexibility for EIGER and JUNGFRAU

  • jfjoch_broker: readout time for EIGER is 3 us and JUNGFRAU is 20 us, this can be changed in input file

  • jfjoch_broker: OpenAPI interface includes more ways to provide information on the status (error/warning/info)

  • jfjoch_broker: ROIs handling via OpenAPI and frontend is more user friendly

Warning - two breaking changes to OpenAPI:

  • Handling of ROIs is through /config/roi path only for both circle and box ROIs, path in /roi are no longer accessible

  • broker_status structure introduced in 1.0.0-rc.28 has member message and not error_message to allow handling info/warning messages as well

1.0.0-rc.28

  • jfjoch_broker: save error message for initialization and data collection and provide these with OpenAPI

  • jfjoch_broker: fixed issue when in error state, response to /wait_till_done was not complaint to OpenAPI specs

  • jfjoch_test: remove header that failed when CUDA is absent during compilation

  • frontend: add soft trigger button in data collection tab

  • frontend: show error message when in error state

  • CMake: add option to force compilation without CUDA (-DJFJOCH_USE_CUDA=OFF)

1.0.0-rc.27

  • jfjoch_broker: add option to select electron source in instrument metadata, adapt wavelength calculation

  • jfjoch_broker: update pistache web server version

  • jfjoch_writer: minor changes to republish logic

  • Improvements to documentation

1.0.0-rc.26

  • jfjoch_broker: implement ZeroMQ stream for image metadata information

  • jfjoch_broker: refactor ZeroMQ stream for preview: start/end messages always sent

  • jfjoch_broker: add crystal lattice plots

  • jfjoch_broker: remove empty bins from the plots

  • jfjoch_broker: Fix bugs in ModuleSummation and MXAnalyzer for CPU “long” summation

  • jfjoch_broker: Fix bug when mean background estimation / indexing rate where affected by previous experiment

  • jfjoch_writer: fix missing “-w” parameter

  • jfjoch_writer: temporary files have “.tmp” suffix

  • jfjoch_writer: refactor logic for watermarks

  • jfjoch_writer: report on internal FIFO utilization

  • jfjoch_writer: clean-up naming for azimuthal integration and background estimate

  • jfjoch_writer: write final background estimate and indexing rate in the master file

  • tools/: remove unnecessary tools, make naming consistent

  • CBOR: Add indexing rate and background estimate to end message

  • CBOR: Clean-up documentation

1.0.0-rc.25

  • Updates to documentation

  • License set to GPLv3 / OHL-S

  • Fix bug in DiffractionExperiment::GetDefaultPlotBinning() - resulting in division by 0 if image time longer than 500ms

  • Add information on JUNGFRAU conversion and geometry transformation to CBOR and HDF5

1.0.0-rc.24

New FPGA functionality:

  • EIGER supports 8, 16 and 32-bit data input (for 8-bit mode at half performance; for 32-bit “real” depth is 23-bit + 1-bit signed)

  • Output possible to 8, 16 and 32-bit data

  • Threshold is applied before summation

  • Pixel mask can be applied on FPGA

  • Mark pixels with ADC content = 0 as bad pixels

  • FPGA stores semantic version information (access via /sys/class/misc/jfjoch…/version)

New software functionality:

  • Long summation (above 256 frames) done on CPU

  • Mechanism to save arbitrary data to HDF5 file

  • ZeroMQ preview has option to send start message

  • Rework pixel mask + add statistics displayed in web interface

Bug fixes:

  • Web frontend: Update preview image automatically during data acquisition

  • jfjoch_broker: Error handling if CUDA driver is not installed

  • jfjoch_broker: Correctly update progress during pedestal

  • jfjoch_broker: Provide proper error when uploaded file is not a proper TIFF

  • jfjoch_action_test: enable HLS simulation

Documentation improvement and placement in a dedicated directory

\ No newline at end of file diff --git a/CPU_DATA_ANALYSIS.html b/CPU_DATA_ANALYSIS.html new file mode 100644 index 00000000..58dbcfc0 --- /dev/null +++ b/CPU_DATA_ANALYSIS.html @@ -0,0 +1 @@ + CPU-side crystallographic data analysis (Jungfraujoch) — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

CPU-side crystallographic data analysis (Jungfraujoch)

This document describes the crystallographic algorithms implemented in Jungfraujoch for CPU- and GPU-side real‑time and near‑real‑time data analysis.

Scope. The pipeline covered here comprises:

  1. geometry mapping and corrections,

  2. azimuthal integration (powder/radial profiles),

  3. Bragg spot finding (strong pixels → connected components → spot descriptors),

  4. indexing (still and rotation modes),

  5. Bravais lattice / centering inference,

  6. geometry and lattice refinement,

  7. reflection prediction (still and rotation),

  8. 2D summation integration,

  9. scaling and merging,

  10. auxiliary statistics (Wilson plot, ⟨I/σ(I)⟩, French–Wilson).

References

The methods are inspired and reuising solutions implemented in:

  • W. Kabsch, “XDS”, Acta Cryst. D66 (2010), 125–132 and related XDS papers (rotation geometry, partiality, scaling concepts).

  • W. Kabsch, “Integration, scaling, space-group assignment and post-refinement”, Acta Cryst. D66 (2010), 133–144 (mosaicity/partiality likelihood treatment; notation such as ζ and rotation factors).

  • T. A. White et al., CrystFEL method papers (spot finding, three‑ring integration, serial/still diffraction processing concepts).

  • J. Kieffer & J. P. Wright, “PyFAI: a Python library for high performance azimuthal integration on GPU”, Powder Diffraction 28 (2013), S339-S350 (detector geometry definition, azimuthal integration)

  • H. Powell, “The Rossmann Fourier autoindexing algorithm in MOSFLM”, Acta Cryst. D55 (1999), 1690-1695 (FFT indexing) (list is not exhaustive)

1. Geometry, reciprocal-space mapping, and basic quantities

1.1 Coordinate conventions

For a pixel coordinate \((x,y)\) (in pixels), Jungfraujoch converts to a laboratory direction vector via:

  1. shift by direct-beam position \((x_\mathrm{beam}, y_\mathrm{beam})\),

  2. scale by pixel size \(p\) (mm),

  3. set detector distance \(D\) (mm),

  4. apply detector orientation rotation \(R_\mathrm{det}\) (PyFAI-like parameterization).

The unnormalized detector coordinate (mm) is: \( \mathbf{r}_\mathrm{det}(x,y) = \begin{pmatrix} (x-x_\mathrm{beam})p\\ (y-y_\mathrm{beam})p\\ D \end{pmatrix}. \)

The lab-frame vector is: \( \mathbf{r}_\mathrm{lab} = R_\mathrm{det}\,\mathbf{r}_\mathrm{det}. \)

Let the incident wavevector magnitude be \(k = 1/\lambda\) in Å\(^{-1}\), and define: \( \mathbf{S}_0 = (0,0,k). \)

The reciprocal-space scattering vector associated with pixel \((x,y)\) is: \( \mathbf{s}(x,y) = k\,\frac{\mathbf{r}_\mathrm{lab}}{\lVert \mathbf{r}_\mathrm{lab}\rVert} - \mathbf{S}_0. \)

This \(\mathbf{s}\) is the fundamental quantity used for spot finding (resolution filters), indexing, and refinement.

1.2 Two-theta, azimuth, resolution and \(q\)

The scattering angle \(2\theta\) is computed from \(\mathbf{r}_\mathrm{lab}\) via: \( 2\theta = \arctan\!\left(\frac{\sqrt{x_\mathrm{lab}^2 + y_\mathrm{lab}^2}}{z_\mathrm{lab}}\right). \)

Resolution (Å) at a pixel is: \( d = \frac{\lambda}{2\sin(\theta)} = \frac{\lambda}{2\sin(2\theta/2)}. \)

The magnitude \(q = 2\pi/d\) is used for radial binning and ice-ring handling.

1.3 Distance from the Ewald sphere

For a reciprocal lattice point \(\mathbf{p}\)\(^{-1}\)), define: \( \Delta_\mathrm{Ewald}(\mathbf{p}) = \lVert \mathbf{p} + \mathbf{S}_0\rVert - k. \) Jungfraujoch uses \(|\Delta_\mathrm{Ewald}|\) as an operational proxy for excitation error. This appears in:

  • still prediction (accept if \(|\Delta_\mathrm{Ewald}|\le \Delta_\mathrm{cut}\)),

  • profile radius estimation (see §7.1),

  • still partiality option in scaling/merging (§9.3).


2. Azimuthal integration (radial profiles)

Azimuthal integration produces a 1D radial profile \(I(q)\) or \(I(d)\) by histogramming pixels into radial bins. Pixels are not split across bins; each pixel contributes wholly to a single bin.

2.1 Histogram estimator

Let bin index \(b(x,y)\in\{0,\dots,B-1\}\) be precomputed from \(q(x,y)\) (or equivalently from \(d(x,y)\)). For each bin \(b\):

  • accumulate corrected intensity: \( S_b = \sum_{(x,y):\,b(x,y)=b} I(x,y)\,C(x,y), \)

  • and count: \( N_b = \#\{(x,y):\,b(x,y)=b \text{ and pixel is valid}\}. \)

A simple mean profile is then \( \bar{I}_b = S_b / N_b\) (when \(N_b>0\)). Invalid pixels (masked, saturated, detector error codes) are excluded.

2.2 Corrections applied

Two standard corrections are available:

(i) Solid angle / geometric correction. A commonly used approximation for flat detectors gives a \(\cos^3(2\theta)\) factor: \( C_\Omega(2\theta) = \cos^3(2\theta). \)

(ii) Polarization correction. With polarization coefficient \(P\) (beamline dependent) and azimuth \(\phi\): \( 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), \) applied as a divisor to intensities (i.e. scale by \(1/C_\mathrm{pol}\)) when enabled.

2.3 Background estimate for profiles

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 not the same as local Bragg-spot background used in summation integration (§8).


3. Spot finding (strong pixels → Bragg spots)

Spot finding is a two-stage process:

  1. Strong-pixel selection using intensity and/or local signal-to-noise criteria.

  2. Connected-component labeling (CCL) to group strong pixels into candidate spots, followed by spot-level filtering and feature extraction.

3.1 Strong-pixel detection by local statistics

For each pixel \(i\) with value \(v_i\), consider a square window (nominally \(31\times 31\) pixels) around it. Let the window contain \(n\) valid pixels (excluding masked/bad/saturated), and define: \( \Sigma = \sum v,\qquad \Sigma_2 = \sum v^2. \)

To avoid biasing the local statistics by the test pixel itself, Jungfraujoch evaluates the pixel against the window with the pixel removed: \( \Sigma' = \Sigma - v_i,\quad \Sigma_2' = \Sigma_2 - v_i^2,\quad n' = n-1. \)

A variance-like quantity proportional to \(n'^2\) is formed: \( V = n'\Sigma_2' - (\Sigma')^2, \) and the deviation-from-mean quantity: \( \Delta = v_i n' - \Sigma'. \)

A pixel is considered strong if:

  • it is above a photon/count threshold, and

  • \(\Delta>0\), and

  • the squared deviation exceeds a scaled variance: \( \Delta^2 > V\cdot T^2, \) where \(T\) is the configured signal-to-noise threshold.

This is equivalent to a local z-score criterion but implemented in integer arithmetic to be robust and fast.

Special cases:

  • saturated pixels can be forced to “strong” (useful for detecting overloaded Bragg spots),

  • invalid pixels are never strong.

3.2 Resolution and ice-ring handling

Spot finding can be restricted to a resolution range \([d_\mathrm{high}, d_\mathrm{low}]\) 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).

A further optional safeguard removes isolated high-resolution “spur” spots by detecting large gaps in \(1/d\) (or \(q\)) space and discarding spots beyond the gap. This is intended for macromolecular diffraction where edge-of-detector backgrounds can be extremely low.

3.3 Connected-component labeling (CCL)

Strong pixels are grouped into connected components (adjacent strong pixels) using a CCL algorithm. Each component yields a candidate spot with:

  • centroid \((x,y)\) (often intensity-weighted),

  • pixel count (spot size),

  • integrated spot intensity proxy (sum of pixel values),

  • resolution \(d\) at the centroid (or mean over pixels),

  • and quality flags (e.g. ice-ring classification).

Spot-level filters include minimum/maximum pixel count and resolution limits.


4. Indexing overview

Indexing maps observed reciprocal-space vectors \(\mathbf{s}_i\) to a lattice such that: \( \mathbf{s}_i \approx h_i\mathbf{a}^* + k_i\mathbf{b}^* + l_i\mathbf{c}^*, \) with integer \((h_i,k_i,l_i)\).

Jungfraujoch supports two complementary indexing strategies:

  1. FFT-based indexing (Rossmann-type): does not require an a priori unit cell; suitable for unknown samples.

  2. Fast-feedback indexing (TORO-like): requires an approximate unit cell; optimized for speed and feedback.

Both feed into a common robust refinement/selection stage which maximizes the number of inliers under an indexing tolerance.

4.1 Indexed-spot decision (inlier test)

Given a trial lattice with direct basis vectors \(\mathbf{a},\mathbf{b},\mathbf{c}\) (used here as reciprocal-space dot-test vectors), fractional indices are estimated by: \( h_f = \mathbf{s}\cdot\mathbf{a},\quad k_f = \mathbf{s}\cdot\mathbf{b},\quad l_f = \mathbf{s}\cdot\mathbf{c}. \) Let \((h,k,l)=(\mathrm{round}(h_f),\mathrm{round}(k_f),\mathrm{round}(l_f))\) and define the fractional residual: \( \delta^2 = (h_f-h)^2 + (k_f-k)^2 + (l_f-l)^2. \) A spot is indexed if \(\delta^2 \le \tau^2\), where \(\tau\) is the configured tolerance.

For indexed spots, the reciprocal lattice point \(\mathbf{p} = h\mathbf{a}^*+k\mathbf{b}^*+l\mathbf{c}^*\) is used to compute \(\Delta_\mathrm{Ewald}(\mathbf{p})\) (stored as a diagnostic and later used in profile-radius estimation).


5. FFT indexing (unknown unit cell)

FFT indexing follows a classical approach: detect dominant periodicities by projecting reciprocal-space points onto many directions and Fourier transforming the resulting 1D histograms.

5.1 Directional projections and histograms

Choose a set of unit vectors \(\{\mathbf{u}_d\}\) on a half-sphere (a near-uniform distribution generated via a golden-angle construction). For each direction \(d\), form a histogram in the scalar projection: \( t_{id} = \left|\mathbf{u}_d\cdot \mathbf{s}_i\right|. \)

Bin width is chosen approximately as: \( \Delta t \approx \frac{1}{2 L_\mathrm{max}}, \) where \(L_\mathrm{max}\) is the maximum expected real-space unit-cell edge (Å). The histogram extent is tied to the maximum \(q\) used (set by a high-resolution cutoff for indexing).

5.2 FFT peak picking and candidate vectors

For each direction, the FFT magnitude spectrum is computed; peaks correspond to periodicities along \(\mathbf{u}_d\). Each direction yields a candidate real-space length \(L\) with maximum spectral magnitude (subject to \(L\ge L_\mathrm{min}\)).

Candidate vectors are \(\mathbf{v}_d = L_d\,\mathbf{u}_d\).

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.

5.3 Lattice reduction and cell candidates

Triples of candidate vectors are combined to form candidate bases \((\mathbf{A},\mathbf{B},\mathbf{C})\). A simple reduction is applied: \( \mathbf{B} \leftarrow \mathbf{B} - \mathrm{round}\!\left(\frac{\mathbf{B}\cdot\mathbf{A}}{\mathbf{A}\cdot\mathbf{A}}\right)\mathbf{A}, \) $ \mathbf{C} \leftarrow \mathbf{C} - \mathrm{round}!\left(\frac{\mathbf{C}\cdot\mathbf{A}}{\mathbf{A}\cdot\mathbf{A}}\right)\mathbf{A}

  • \mathrm{round}!\left(\frac{\mathbf{C}\cdot\mathbf{B}}{\mathbf{B}\cdot\mathbf{B}}\right)\mathbf{B}. $

Candidates are filtered by allowed length and angle ranges.

5.4 Robust refinement and best-cell selection

Candidate bases are refined against observed spots using an iterative inlier‑focused least‑squares procedure (trimmed/contracting threshold). The output cell is chosen to:

  1. maximize the number of indexed spots under the tolerance \(\tau\), and

  2. break ties by a refined score (smaller residual threshold/score is preferred).

An optional reference unit cell (if supplied) restricts acceptance to cells within a relative distance tolerance in edge lengths (permutation-invariant).



7. Geometry and lattice refinement

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.

7.1 Parameterization

The refinement jointly optimizes, depending on mode and constraints:

  • beam center \((x_\mathrm{beam}, y_\mathrm{beam})\),

  • detector distance \(D\),

  • detector tilt angles (two-angle model; third rotation often held at 0),

  • rotation axis direction (for rotation datasets),

  • crystal orientation (a global rotation),

  • unit-cell parameters, with constraints determined by inferred crystal system.

For higher symmetries, constraints are enforced, e.g.

  • cubic: \(a=b=c,\ \alpha=\beta=\gamma=90^\circ\),

  • tetragonal: \(a=b\),

  • hexagonal: \(a=b,\ \gamma=120^\circ\),

  • monoclinic (unique axis \(b\)): \(\alpha=\gamma=90^\circ\), \(\beta\) refined.

7.2 Residuals and objective

For each indexed spot assigned integer \((h,k,l)\), compute:

  • observed reciprocal vector \(\mathbf{s}_\mathrm{obs}\) from its detector position and current geometry,

  • predicted reciprocal vector \(\mathbf{s}_\mathrm{pred}(h,k,l;\ \text{lattice params})\).

Residual is: \( \mathbf{r} = \mathbf{s}_\mathrm{obs} - \mathbf{s}_\mathrm{pred}. \)

A non-linear least squares solver minimizes \(\sum \|\mathbf{r}\|^2\) over all selected inlier spots.

7.3 Rotation datasets: bringing observations to a common reference frame

For oscillation/rotation data, each image corresponds to a rotation angle \(\phi\) about an axis \(\mathbf{m}_2\). Observed reciprocal vectors are rotated “back to start” so that all images are refined in a single reference crystal frame: \( \mathbf{s}_\mathrm{obs,ref} = R(\phi)\,\mathbf{s}_\mathrm{obs}, \) with \(R(\phi)\) constructed from the axis-angle representation of the goniometer model.

7.4 Multi-stage tightening of inlier tolerance

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.


8. Reflection prediction

Jungfraujoch predicts reflection positions for integration by enumerating Miller indices within a resolution cutoff and accepting those that satisfy a diffraction condition model.

8.1 Enumerating reciprocal lattice points

For a maximum resolution \(d_\mathrm{min}\), accept \((h,k,l)\) such that: \( \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. \)

8.2 Still prediction (excitation-error cutoff)

For still images, the diffracting condition is approximated by an excitation-error cutoff: \( \left|\Delta_\mathrm{Ewald}(\mathbf{p})\right| \le \Delta_\mathrm{cut}. \) Accepted reflections are projected to the detector by intersecting the diffracted direction \(\mathbf{S}=\mathbf{S}_0+\mathbf{p}\) with the detector plane, using the current geometry.

8.3 Rotation prediction (Laue equation + partiality model)

For rotation/oscillation datasets, Jungfraujoch solves for rotation angles \(\phi\) where the rotated reciprocal lattice point satisfies the Ewald-sphere condition. In an XDS-like notation, define:

  • rotation axis unit vector \(\mathbf{m}_2\),

  • \(\mathbf{S}_0\) incident vector,

  • \(\mathbf{S}(\phi)=\mathbf{S}_0+\mathbf{p}(\phi)\).

A key quantity is: \( \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}, \) which also appears in XDS as the Lorentz component linked to the rotation axis.

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)

\mathrm{erf}!\left(\frac{\phi-\Delta\phi/2}{\sqrt{2},\sigma_M/\zeta}\right) \right], \( with mosaicity \)\sigma_M$ in radians.

Reflections are predicted if they meet minimum \(\zeta\) and mosaicity-window criteria, and their predicted detector coordinates fall on the active detector area.

8.4 Systematic absences (centering)

Systematic absences are applied at least at the centering level (prior to full space-group symmetry). For centering symbol \(C\):

  • \(I\): absent if \(h+k+l\) odd,

  • \(A\): absent if \(k+l\) odd,

  • \(B\): absent if \(h+l\) odd,

  • \(C\): absent if \(h+k\) odd,

  • \(F\): absent if any of \(h+k, h+l, k+l\) is odd,

  • \(R\): absent if \((-h+k+l)\bmod 3 \ne 0\),

  • \(P\): no centering absences.


9. 2D summation integration (three-ring method)

Jungfraujoch integrates predicted reflections by summation (no profile fitting), using a CrystFEL-inspired “three-circle / three-ring” method in the detector plane.

9.1 Regions of interest

For each predicted reflection at \((x_p,y_p)\), define three radii:

  • \(r_1\): inner signal radius,

  • \(r_2\): inner background radius,

  • \(r_3\): outer background radius.

Pixels are classified by their squared distance \(r^2=(x-x_p)^2+(y-y_p)^2\):

  • signal region: \(r^2 < r_1^2\),

  • background annulus: \(r_2^2 \le r^2 < r_3^2\).

Invalid pixels (masked/bad/saturated) are excluded from both sums.

9.2 Background subtraction and intensity estimate

Let:

  • \(S = \sum I(x,y)\) over signal pixels,

  • \(n_S\) = number of valid signal pixels,

  • \(B = \sum I(x,y)\) over background pixels,

  • \(n_B\) = number of valid background pixels.

Background per pixel: \( \hat{b} = \frac{B}{n_B}, \) integrated intensity: \( \hat{I} = S - n_S \hat{b}. \)

A reflection is accepted as “observed” only if all signal pixels were valid and \(n_B\) exceeds a minimum (to avoid unstable background estimates).

9.3 Uncertainty model

A Poisson-like estimator is used for the raw summed counts: \( \sigma(\hat{I}) \approx \sqrt{S}, \) with a minimum \(\sigma\ge 1\) to avoid singular weights. (This is a pragmatic online estimate; more elaborate models may be applied downstream.)

9.4 Lorentz–polarization factor handling

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 rlp in predictions, and used during scaling/merging (§10).


10. Scaling and merging

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.

10.1 Observation model

For an observation \(j\) of a unique reflection \(h\) on image (or image group) \(i\), the predicted measured intensity is modeled as: \( I_{ij} \approx G_i \, L_{ij}\, P_{ij}\, I_h, \) where:

  • \(G_i\) is the image scale factor,

  • \(L_{ij}\) is a Lorentz-like / geometry factor (stored as rlp or derived),

  • \(P_{ij}\) is a partiality term (model-dependent),

  • \(I_h\) is the merged (true) intensity parameter for that unique reflection.

A least-squares objective is minimized: \( \sum_{ij} \left(\frac{I_{ij}^{\mathrm{pred}} - I_{ij}^{\mathrm{obs}}}{\sigma_{ij}}\right)^2 \) with regularization on \(G_i\) and optional smoothness constraints (particularly meaningful for rotation series).

10.2 Partiality models available

Jungfraujoch supports several partiality choices:

  1. 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)

    \mathrm{erf}!\left(\frac{\Delta\phi_{ij}-\Delta\phi/2}{\sqrt{2},\sigma_{M,i}/\zeta_{ij}}\right) \right]. \( Mosaicity \)\sigma_{M,i}$ can be refined per image group with bounds.

  2. Still partiality (excitation-error proxy): \( P_{ij} = \exp\!\left(-\frac{\Delta_\mathrm{Ewald}^2}{R_i^2}\right), \) where \(R_i^2\) is a refined width parameter (bounded).

  3. Unity: \(P_{ij}=1\).

  4. Fixed: use the per-reflection partiality carried from prediction.

Reflections below a minimum partiality can be rejected from merging to avoid unstable corrections.

10.3 Regularization and smoothness

To stabilize scale determination, a weak prior \(G_i\approx 1\) is used. For rotation datasets, optional smoothness encourages slowly varying scales and mosaicity: \( \log G_{i-1} - 2\log G_i + \log G_{i+1} \approx 0, \) (and similarly for mosaicity), reflecting the expectation of gradual changes during a rotation scan.

10.4 Merging estimator

After refinement, corrected observations are formed: \( 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}}. \)

Unique intensities are merged by inverse-variance weighted mean: \( 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}. \)

An internal-consistency term can inflate uncertainties when multiple observations are present, in the spirit of XSCALE.

10.5 Merging statistics

Per-shell and overall merging statistics are computed on corrected intensities, including:

  • number of observations,

  • number of unique reflections,

  • mean \(I/\sigma(I)\),

  • an R\(_\mathrm{meas}\)-like quantity derived from within‑HKL deviations (shell-binned).

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.


11. Mosaicity and “profile radius” monitoring

11.1 Profile radius (still excitation error width)

A simple scalar “profile radius” is estimated from indexed spots using the distribution of \(\Delta_\mathrm{Ewald}\). Two estimators are available:

  • standard deviation: \( R \approx \sqrt{\frac{1}{N}\sum_i \Delta_{\mathrm{Ewald},i}^2}, \)

  • robust MAD-based alternative (median absolute deviation), scaled by 1.4826.

Operationally, predictions for still data may use a cutoff proportional to this width (e.g. \(\Delta_\mathrm{cut}\approx 2R\)).

11.2 Mosaicity from rotation data (maximum likelihood)

For rotation data, Jungfraujoch can estimate mosaicity by maximizing a likelihood based on the XDS reflection fraction \(R(\tau;\sigma_M/\zeta)\) as described by Kabsch (2010). In brief:

  • compute angular deviations \(\tau\) from predicted Bragg positions,

  • compute \(\zeta\) for each reflection,

  • maximize \(\sum \log R(\tau)\) over \(\sigma_M\).

This yields a physically meaningful mosaicity estimate tied to the rotation partiality model.


12. Wilson statistics and French–Wilson treatment

12.1 Per-shell ⟨I/σ(I)⟩

For monitoring integration quality, Jungfraujoch reports mean \(\langle I/\sigma(I)\rangle\) in a fixed number of resolution shells. Shelling is performed in \(1/d^2\) space (typical of crystallographic practice).

12.2 Wilson plot (B-factor proxy)

A Wilson-type analysis is computed by binning intensities by resolution and fitting: \( \langle I\rangle \propto \exp\!\left(-\frac{B}{2}\frac{1}{d^2}\right), \) i.e. \( \log \langle I\rangle = \mathrm{const} - \frac{B}{2}\left(\frac{1}{d^2}\right). \) A linear regression of \(\log\langle I\rangle\) vs \(1/d^2\) provides an estimate of \(B\), subject to basic quality checks (e.g. \(R^2\) threshold).

12.3 French–Wilson (posterior expectation of I and |F|)

To mitigate negative intensities and obtain physically meaningful amplitudes, Jungfraujoch implements a French–Wilson style Bayesian treatment using per-shell mean intensity as a prior scale.

For each merged observation \(I_\mathrm{obs}\) with uncertainty \(\sigma\), the posterior over true intensity \(I\ge 0\) is: \( p(I\mid I_\mathrm{obs}) \propto p(I)\,\exp\!\left(-\frac{(I_\mathrm{obs}-I)^2}{2\sigma^2}\right), \) with priors differing between acentric and centric cases (standard Wilson distributions).

Numerical quadrature over a scaled intensity variable is used to compute posterior moments:

  • \(\langle I\rangle\),

  • \(\langle |F|\rangle = \langle \sqrt{I}\rangle\), and an amplitude uncertainty estimate via: \( \sigma_F \approx \sqrt{\langle I\rangle - \langle |F|\rangle^2}. \)


13. Practical notes and limitations

  • No profile fitting 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.

  • Space-group symmetry beyond centering absences is not necessarily enforced during prediction/integration unless the space group is supplied and used downstream.

  • Resolution masking and ice rings are controllable; including ice-ring spots in indexing can improve robustness for some samples but may bias refinement in others.

  • Rotation vs still modes differ substantially in prediction and scaling because partiality is angle-driven in rotation data and excitation-error-driven in still data.


\ No newline at end of file diff --git a/DEPLOYMENT.html b/DEPLOYMENT.html new file mode 100644 index 00000000..f8d32691 --- /dev/null +++ b/DEPLOYMENT.html @@ -0,0 +1,36 @@ + Deployment — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

Deployment

To deploy Jungfraujoch, one needs to follow four steps:

  1. Install main Jungfraujoch code and frontend web interface

  2. Flash the U55C FPGA card with a proper image and install Linux kernel driver

  3. Install Jungfraujoch writer

  4. Install Python OpenAPI client

Installation procedure depend a lot on the operating system. For RedHat Enterprise Linux 8, Rocky 8, or compatible installation can be done with prebuilt RPMs and is relatively straightforward. For other systems one needs to build software from source. Both ways will be presented.

Install main Jungfraujoch code and frontend web interface

On RHEL 8 systems there is a jfjoch-<version>-1.el8.x86_64.rpm that needs to be installed and contains all the necessary software and web interface.

On other OSes one needs to compile Jungfraujoch from source (from the repo directory):

$ mkdir build
+$ cd build
+$ cmake .. -DCMAKE_INSTALL_PREFIX=<directory to install>
+$ make
+$ sudo make install  
+

For manual installation, we recommend to use non-standard directory (like /opt/jfjoch), to facilitate upgrades and removal. For DKMS to manage kernel module sources it is necessary to copy driver sources to /usr/src/jfjoch-<VERSION> directory. This requires extra flag in cmake -DJFJOCH_INSTALL_DRIVER_SOURCE=ON.

Frontend web user interface has to be built separately with:

$ cd build
+$ make frontend
+

Frontend files (.html and .js) will be placed in frontend/dist (outside of build/ directory!) and has to be copied to a general location, e.g. /usr/local/jfjoch/frontend or /opt/jfjoch/frotend.

Flash the U55C FPGA card with a proper image and install Linux kernel driver.

Firmware flashing

  1. Check that the card is detected by OS with “lspci |grep Xilinx” and check the PCIe bus/device/function (BDF) number, 11:00.0 in this case:

$ lspci |grep Xilinx
+23:00.0 Processing accelerators: Xilinx Corporation Device 3450 (rev 2)
+

Note the device number 3450 that identifies Jungfraujoch device (Jungfraujoch pass is 3450 m above sea level) and rev 2 identifying release of the firmware.

  1. Check the speed of the card, that it is detected as PCIe Gen4x8 device (needs to be done as root, otherwise configuration details are not given):

$ sudo lspci -vv -s <PCIe slot number>
+23:00.0 Processing accelerators: Xilinx Corporation Device 3450
+(...)
+LnkSta:     Speed 16GT/s (ok), Width x8 (ok)
+(...)
+
  1. Download the MCS image from release files or build it using Vivado (WARNING! building time can be about 8 hours and doesn’t allways reach correct timing).

  2. Flash the card with xbflash.qspi tool (part of Jungfraujoch). For fresh card use:

sudo xbflash.qspi --primary <path to MCS file> --card <PCIe slot from above> --bar-offset 0x1f06000 
+

For card that was already flashed with Jungfraujoch images:

sudo xbflash.qspi --primary <path to MCS file> --card <PCIe slot from above>
+

It is necessary to confirm the operation by pressing Y key or one can add --force option to avoid confirmation. It is safe to run multiple flashing processes in parallel for different cards, for example in separate screen sessions.

  1. Cold reboot:

sudo ipmitool chassis power cycle
+

Install PCIe driver

For first run it is though recommended to try the driver without installing to the kernel directory:

$ cd fpga/pcie_driver
+$ make
+$ sudo insmod jfjoch.ko
+

Check with dmesg that the device was properly found:

$ dmesg |grep jfjoch
+[  431.624933] jfjoch 0000:23:00.0: enabling device (0140 -> 0142)
+[  431.919147] misc jfjoch0: Jungfraujoch FPGA loaded with FW build: 5610030a
+

If things work, it is recommended to install the driver with DKMS, so it is rebuilt for kernel updates. On RHEL 8 you can install prebuilt RPM provided in the Gitlab package registry. On other systems follow procedure in PCIe driver.

NOTE: Driver installation procedure on non-RHEL 8 systems is not well understood/optimized at the moment.

NOTE: In case driver is included in the init RAM-disk image, it is necessary to rebuild the RAM-disk if driver is updated:

$ sudo dracut -f
+

Configure network

Configure switch according to FPGA network guide - specifically set manual speed and turn off auto-negotiation for the port used to connect U55C card and connect card to switch.

Running Jungfraujoch software

Main Jungfraujoch service is called jfjoch_broker. It is responsible for handling data from FPGAs, doing processing, analysis, compression and sending images on ZeroMQ output. It is recommended to run the service as systemd service.

jfjoch_broker takes two parameters: JSON configuration file and HTTP port (default is 5232). Example JSON files are placed in etc/ folder. JSON file format is also explained in the OpenAPI definition, as jfjoch_settings data structure.

When running the service can be accessed via HTTP interface from a web browser for configuration and monitoring.

To prepare the configuration file one also needs to reference calibration files: gain files for PSI JUNGFRAU and trim-bit files for PSI EIGER. These need to be obtained from the PSI Detector Group.

Card verification

To test that FPGA board is working properly without access to a JUNGFRAU detector, you can use jfjoch_fpga_test tool. For example to simulate 10M pixel system with 4 FPGA cards and 200k images on a 2 CPU system with 2 GPUs:

jfjoch_fpga_test ~/nextgendcu/ -m20 -s4 -i 200000 -Pn2g2
+

Or 1M pixel system with one FPGA card:

jfjoch_fpga_test ~/nextgendcu/ -m2 -s1 -i 200000
+

Install Jungfraujoch writer

Jungfraujoch writer is an additional service, that can connect to jfjoch_broker ZeroMQ interface and writes files according to NeXus/NXmx HDF5 standard.

At the moment it is better to have a separate machine, with access to distributed file system, for writing images.

Writer can be installed with a dedicated RPM file or compiled from source. For compilation, you can use the following commands:

mkdir build
+cd build
+cmake -DJFJOCH_WRITER_ONLY=ON -DCMAKE_INSTALL_PREFIX=<directory to install> ..
+make jfjoch
+

Install Jungfraujoch image viewer

Jungfraujoch viewer is X-ray diffraction image viewer, that is optimized to open Jungfraujoch HDF5 files.

The viewer is a Qt application and it requires recent version of the library, therefore it is an optional dependency.

To include it in the building of Jungfraujoch use -DJFJOCH_VIEWER_BUILD=ON directive for CMake:

mkdir build
+cd build
+cmake -DJFJOCH_VIEWER_BUILD=ON -DCMAKE_INSTALL_PREFIX=<directory to install> ..
+make jfjoch
+

Install Jungfraujoch Python client

Use pip:

pip install jfjoch-client
+
\ No newline at end of file diff --git a/DETECTORS.html b/DETECTORS.html new file mode 100644 index 00000000..9cc5c9ca --- /dev/null +++ b/DETECTORS.html @@ -0,0 +1 @@ + Supported detectors — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

Supported detectors

PSI detectors

Jungfraujoch supports PSI JUNGFRAU and PSI EIGER detectors. Jungfruajoch controls the detector via statically compiled slsDetectorPackage into its source code. It is important that detector firmware has to match slsDetectorPackage version used in Jungfraujoch (8.0.2 at the moment). See PSI Detector group website for details.

DECTRIS detectors

Jungfraujoch can be used with DECTRIS detectors, as a data analysis tool. In this solution Jungfraujoch controls the Detector Control Unit (DCU) of the detector, and handles output data stream of the DCU. This mode, called “lite” mode, doesn’t use FPGA boards, but mostly CPUs and GPUs for indexing. The mode is currently experimental and intended for low data rates (100 Hz).

\ No newline at end of file diff --git a/DETECTOR_GEOMETRY.html b/DETECTOR_GEOMETRY.html new file mode 100644 index 00000000..f94da667 --- /dev/null +++ b/DETECTOR_GEOMETRY.html @@ -0,0 +1 @@ + Detector geometry — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

Detector geometry

At the moment Jungfraujoch supports solely flat detectors. The default option is to place modules in their actual location vs. detector frame. It is not recommended to place detector modules stacked.

The simplest case is detector perpendicular to the beam. In this case it is enough to provide beam center, detector distance and wavelength.

For more complex case, one can provide tilt of the detector rotation in PyFAI convention. This convention uses Point Of Nominal Interaction (PONI) definition. Beam X and Y would correspond to the location on the detector, where beam from the sample is perpendicular to the detector surface and not to the actual direct beam location. Then tilt of the detector is defined with three rotation angles: rot1 (rotating detector right), rot2 (rotating detector downwards), rot3 (rotating detector clockwise). See PyFAI documentation for more details.

Macromolecular crystallography convention for the vertical direction

One place of confusion is the convention to have point (0,0) of the detector in the top left corner of the detector, with Y values increasing downwards. This is also consistent with computer image formats.

However, other techniques (as well as internal operation of PSI X-ray detectors) might follow convention, for point (0,0) being in the bottom left corner and Y values increasing upwards. Such a convention is used, for example, by PyFAI.

In general, convention is controlled in Jungfraujoch with a setting in the JSON configuration file, which allows mirroring detector in Y.

Extra care has to be taken by the user to ensure that no errors are made.

\ No newline at end of file diff --git a/FPGA.html b/FPGA.html new file mode 100644 index 00000000..73fb0e0e --- /dev/null +++ b/FPGA.html @@ -0,0 +1,16 @@ + FPGA smartNIC — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

FPGA smartNIC

See separate document for installation instructions.

Hardware

Currently supported FPGA is only Xilinx Alveo U55C.

See AMD/Xilinx webpage for card user guide (UG1469). According to the user guide:

Alveo data center accelerator cards are designed to be installed into a data center server, where controlled air flow provides direct cooling.
+

Card needs to be placed in PCI Express (PCIe) Gen4 x8 slot, though mechanically slot has to accommodate x16 card. There is no need to connect additional power cable, as power of the card is not exceeding 75 W load available from PCIe edge connector. Current power estimation is about 30 W when idle and 45 W in operation. The card has built-in protection, which will cut power to the card if HBM temperature is above 120°C.

Two variants of the card are available:

  • 100g - this variant operates one port in 100 Gbit/s mode and should be used when connecting detector via a switch.

  • 8x10g - this variant operates both QSFP ports at 4x10 Gbit/s. QSFP+ (40 Gbit/s) transceivers and MTO/MTP harness cables are necessary. It is designed for detector directly connected to the Jungfraujoch server, without switch.

See network documentation for details of network.

Building firmware

Xilinx Vivado version has to precisely match version described in [the system requirements](../README.md. only when vivado and vitis_hls are detected in the path.

Xilinx Vivado

The following procedures require having AMD (Xilinx) Vivado and Vitis HLS toolsets version 2022.2 installed on the machine. Due to the nature of TCL scripts used to generate board designs Vivado version has to exactly match one provided above - specifically newer versions of Vivado will not work.

In additional to Intellectual Property (IP) cores included in Vivado, two additional licenses are necessary:

  • Non-cost license for Ultrascale+ 100G core has to be requested from AMD/Xilinx website, see Xilinx website, to build 100g design.

  • Paid 10G/25G Subsystem for Ultrascale+ to build 8x10g design. PSI received non-cost licenses from Xilinx University Program for the latter cores. Therefore, usage of bitstreams generated by PSI continuous integration pipeline for 8x10g is only allowed for non-commercial use.

HLS compilation

Make HLS routines:

mkdir build
+cd build
+cmake ..
+make hls
+

Synthesis

Create PCIe 100g bitstream with the following command:

mkdir build
+cd build
+cmake ..
+make pcie_100g
+

and 8x10g:

mkdir build
+cd build
+cmake ..
+make pcie_8x10g
+

When Vivado is not present

During CMake execution, the following executables: vivado and vitis_hls must be present in the path. If not, build targets will not be generated, and such or similar error message will show up:

$ make pcie_100g
+make: *** No rule to make target 'pcie_100g'.  Stop.
+

Gitlab CI

If Gitlab CI is properly set-up, firmware will be automatically built for every commit that starts with FPGA. Built firmware should be downloaded as MCS files.

Frame generator

Jungfraujoch card is equipped with frame generator. It allows to simulate JUNGFRAU detector without having access to such system. It is placed in parallel to Ethernet MAC - so it is placed before the network stack and before any processing happening on the card. In the future a redirection will be possible to send the simulated stream through the 100G TX network link. Frame generator is written in HLS and controlled with AXI-Lite.

\ No newline at end of file diff --git a/FPGA_DATA_ANALYSIS.html b/FPGA_DATA_ANALYSIS.html new file mode 100644 index 00000000..db949f47 --- /dev/null +++ b/FPGA_DATA_ANALYSIS.html @@ -0,0 +1 @@ + FPGA data analysis — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

FPGA data analysis

Jungfraujoch FPGA design has incorporated X-ray diffraction image analysis capabilities.

Pixel mask

Pixels can be masked. For each module a 32-bit map of pixels is loaded to FPGA, with non-zero value meaning masked pixels. According to this map, pixels will be assigned a special value (minimum number for signed types and maximum number for non-signed types) and will be excluded from a subsequent analysis.

ADU histogram

Before conversion to photons/energy, an ADU histogram can be calculated for a module. This allows to preserve some signature of unconverted values. This is done on a module-basis and works with bins with 32 ADU width.

For EIGER this can be used as just a histogram procedure.

JUNGFRAU conversion

For JUNGFRAU module images are converted from ADUs to energy value and divided by a given number to keV units. Result of the operation is rounded to integers.

Pixel thresholding

Pixel range can be specified. Pixels below a minimum threshold will be assigned zero. Pixels above a maximum threshold will be assigned saturated pixel value (the largest number for a given bit-width and sign type). This is specifically designed to operate on unsummed frames, so frame-specific parameters (overload/noise) can be handled.

Frame summation

Frames can be summed together (on a per-module basis) in Jungfraujoch, with a limit of 256 frames added together.

Azimuthal integration

To implement azimuthal integration, FPGA is able to sum pixels based on a provided integration map and per-pixel corrections. This way Jungfraujoch implements azimuthal integration with solid angle and polarization corrections. Corrections were implemented according to formulas developed by Jensen et al. (J. Synchr. Rad., 29, 1420-1428, 2022).

Given FPGA limitations, split-pixels cannot be implemented and number of bins is limited as 1024 per detector module. This way 2D azimuthal integration, as needed for example by SAS-TT, cannot be currently implemented with the FPGA card and needs to be done on a CPU. One needs to be careful with per-pixel corrections - their acceptable range is constrained by 16-bit pixed point integer implementation and is tuned for standard SAXS/WAXS range.

Spot finding

Jungfraujoch FPGA implements a built-in spot finder. Spot finder allows to apply the following criteria for finding strong pixels:

  1. Resolution criterion - pixels only within a provided resolution range can be considered as strong pixels (calculating resolution map needs to happen on CPU before data collection run).

  2. Bad pixels - pixels marked as bad, as well as chip edges and module edges are excluded from spot finding,

  3. Overloads - pixels marked as overloads on JUNGFRAU are always included in the strong pixel output, but are excluded for signal-to-noise ratio calculation,

  4. Pixel value - pixels above certain threshold value can be marked as strong,

  5. Signal-to-noise (SNR) ratio - pixels with SNR above a threshold can be marked as strong,

  6. Connected pixels - strong pixels can be discarded if they are “alone”, so their 8 directly neighboring pixels are not counted as strong pixels.

While besides bad pixels criterion, all the above are optional (can be turned off), only pixels that fulfill all enabled criteria are selected as strong pixels.

SNR ratio calculation

Signal-to-noise ratio is calculated for a rectangular area. In horizontal direction the area is fixed - line of 1024 pixels is divided into 32 areas each of 32 pixels. This is dictated by the data flow within the FPGA. In vertical direction the area is flexible - it is 15 lines above and below of the given pixel. Given very large box size, approximation are made, for example that N N-1 in calculating standard deviation.

Region-of-interest (ROI) integration

Each pixel in a module can be assigned to one of 64 ROIs. For each ROIs, sum, sum of squares, max count, and number of valid pixels will be calculated. Jungfraujoch also calculates X and Y values weighted by pixel values, though this feature is not properly tested at the moment and not integrated in downstream analysis.

Pixel statisitics

The following statistics are collected for each module:

  • Number of masked pixels

  • Number of saturated pixels (excl.masked)

  • Number of error pixels (excl. masked)

  • Sum of valid pixels in the module

  • Minimum value of valid pixels in the module

  • Maximum value of valid pixels in the module Valid pixels are not masked, not saturated, not error pixels.

Square root compression

Jungfraujoch FPGA includes lossy compression preserving counting statistic properties of X-ray image, while reducing bit width of an image. Scheme was described in Wakonig et al., J. Appl. Cryst., 53, 574-586, 2020. Pixel value X is replaced with sqrt(N*X), where N is integer constant in range 1 to 16.

\ No newline at end of file diff --git a/FPGA_DESIGN.html b/FPGA_DESIGN.html new file mode 100644 index 00000000..b43726bd --- /dev/null +++ b/FPGA_DESIGN.html @@ -0,0 +1 @@ + FPGA data flow — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

FPGA data flow

The following steps are performed on FPGA (in the order of operation):

  1. UDP header decoding

  2. SLS detector header decoding

  3. State machine that controls data acquisition (start/stop/cancel)

  4. High-bandwidth memory cache to buffer network packets and reorder them to form full modules

  5. ADU histogram for JUNGFRAU

  6. Mask pixels from missing packets with special value

  7. Reorder lines for EIGER to form a proper module

  8. Mask pixels based on provided pixel mask

  9. JUNGFRAU conversion with gain and pedestal corrections

  10. Threshold to zero pixels below certain count value

  11. Integration according to predefined map (e.g., 1D azimuthal integration)

  12. Spot finding

  13. ROI calculation

  14. Image lossy compression using N*sqrt(pixel) values

  15. Send images, analysis results and metadata to host memory via PCI Express

Each step has dedicated core, written in the high-level synthesis. Exact operation of cores for data analysis is explained in dedicated document.

\ No newline at end of file diff --git a/FPGA_LICENSE.html b/FPGA_LICENSE.html new file mode 100644 index 00000000..899c358f --- /dev/null +++ b/FPGA_LICENSE.html @@ -0,0 +1,7 @@ + FPGA license — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

FPGA license

FPGA components of Jungfraujoch are licensed using OHL-S license. See full text below. The license is equivalent of GNU Public License with adaptations for hardware. See OHL webpage for details and FAQs.

CERN Open Hardware Licence Version 2 - Strongly Reciprocal

Preamble

CERN has developed this licence to promote collaboration among hardware designers and to provide a legal tool which supports the freedom to use, study, modify, share and distribute hardware designs and products based on those designs. Version 2 of the CERN Open Hardware Licence comes in three variants: CERN-OHL-P (permissive); and two reciprocal licences: CERN-OHL-W (weakly reciprocal) and this licence, CERN-OHL-S (strongly reciprocal).

The CERN-OHL-S is copyright CERN 2020. Anyone is welcome to use it, in unmodified form only.

Use of this Licence does not imply any endorsement by CERN of any Licensor or their designs nor does it imply any involvement by CERN in their development.

1 Definitions

1.1 ‘Licence’ means this CERN-OHL-S.

1.2 ‘Compatible Licence’ means

a) any earlier version of the CERN Open Hardware licence, or

b) any version of the CERN-OHL-S, or

c) any licence which permits You to treat the Source to which it applies as licensed under CERN-OHL-S provided that on Conveyance of any such Source, or any associated Product You treat the Source in question as being licensed under CERN-OHL-S.

1.3 ‘Source’ means information such as design materials or digital code which can be applied to Make or test a Product or to prepare a Product for use, Conveyance or sale, regardless of its medium or how it is expressed. It may include Notices.

1.4 ‘Covered Source’ means Source that is explicitly made available under this Licence.

1.5 ‘Product’ means any device, component, work or physical object, whether in finished or intermediate form, arising from the use, application or processing of Covered Source.

1.6 ‘Make’ means to create or configure something, whether by manufacture, assembly, compiling, loading or applying Covered Source or another Product or otherwise.

1.7 ‘Available Component’ means any part, sub-assembly, library or code which:

a) is licensed to You as Complete Source under a Compatible Licence; or

b) is available, at the time a Product or the Source containing it is first Conveyed, to You and any other prospective licensees

i) as a physical part with sufficient rights and information (including any configuration and programming files and information about its characteristics and interfaces) to enable it either to be Made itself, or to be sourced and used to Make the Product; or ii) as part of the normal distribution of a tool used to design or Make the Product.

1.8 ‘Complete Source’ means the set of all Source necessary to Make a Product, in the preferred form for making modifications, including necessary installation and interfacing information both for the Product, and for any included Available Components. If the format is proprietary, it must also be made available in a format (if the proprietary tool can create it) which is viewable with a tool available to potential licensees and licensed under a licence approved by the Free Software Foundation or the Open Source Initiative. Complete Source need not include the Source of any Available Component, provided that You include in the Complete Source sufficient information to enable a recipient to Make or source and use the Available Component to Make the Product.

1.9 ‘Source Location’ means a location where a Licensor has placed Covered Source, and which that Licensor reasonably believes will remain easily accessible for at least three years for anyone to obtain a digital copy.

1.10 ‘Notice’ means copyright, acknowledgement and trademark notices, Source Location references, modification notices (subsection 3.3(b)) and all notices that refer to this Licence and to the disclaimer of warranties that are included in the Covered Source.

1.11 ‘Licensee’ or ‘You’ means any person exercising rights under this Licence.

1.12 ‘Licensor’ means a natural or legal person who creates or modifies Covered Source. A person may be a Licensee and a Licensor at the same time.

1.13 ‘Convey’ means to communicate to the public or distribute.

2 Applicability

2.1 This Licence governs the use, copying, modification, Conveying of Covered Source and Products, and the Making of Products. By exercising any right granted under this Licence, You irrevocably accept these terms and conditions.

2.2 This Licence is granted by the Licensor directly to You, and shall apply worldwide and without limitation in time.

2.3 You shall not attempt to restrict by contract or otherwise the rights granted under this Licence to other Licensees.

2.4 This Licence is not intended to restrict fair use, fair dealing, or any other similar right.

3 Copying, Modifying and Conveying Covered Source

3.1 You may copy and Convey verbatim copies of Covered Source, in any medium, provided You retain all Notices.

3.2 You may modify Covered Source, other than Notices, provided that You irrevocably undertake to make that modified Covered Source available from a Source Location should You Convey a Product in circumstances where the recipient does not otherwise receive a copy of the modified Covered Source. In each case subsection 3.3 shall apply.

  You may only delete Notices if they are no longer applicable to
+  the corresponding Covered Source as modified by You and You may
+  add additional Notices applicable to Your modifications.
+  Including Covered Source in a larger work is modifying the
+  Covered Source, and the larger work becomes modified Covered
+  Source.
+

3.3 You may Convey modified Covered Source (with the effect that You shall also become a Licensor) provided that You:

a) retain Notices as required in subsection 3.2;

b) add a Notice to the modified Covered Source stating that You have modified it, with the date and brief description of how You have modified it;

c) add a Source Location Notice for the modified Covered Source if You Convey in circumstances where the recipient does not otherwise receive a copy of the modified Covered Source; and

d) license the modified Covered Source under the terms and conditions of this Licence (or, as set out in subsection 8.3, a later version, if permitted by the licence of the original Covered Source). Such modified Covered Source must be licensed as a whole, but excluding Available Components contained in it, which remain licensed under their own applicable licences.

4 Making and Conveying Products

You may Make Products, and/or Convey them, provided that You either provide each recipient with a copy of the Complete Source or ensure that each recipient is notified of the Source Location of the Complete Source. That Complete Source is Covered Source, and You must accordingly satisfy Your obligations set out in subsection 3.3. If specified in a Notice, the Product must visibly and securely display the Source Location on it or its packaging or documentation in the manner specified in that Notice.

5 Research and Development

You may Convey Covered Source, modified Covered Source or Products to a legal entity carrying out development, testing or quality assurance work on Your behalf provided that the work is performed on terms which prevent the entity from both using the Source or Products for its own internal purposes and Conveying the Source or Products or any modifications to them to any person other than You. Any modifications made by the entity shall be deemed to be made by You pursuant to subsection 3.2.

6 DISCLAIMER AND LIABILITY

6.1 DISCLAIMER OF WARRANTY – The Covered Source and any Products are provided ‘as is’ and any express or implied warranties, including, but not limited to, implied warranties of merchantability, of satisfactory quality, non-infringement of third party rights, and fitness for a particular purpose or use are disclaimed in respect of any Source or Product to the maximum extent permitted by law. The Licensor makes no representation that any Source or Product does not or will not infringe any patent, copyright, trade secret or other proprietary right. The entire risk as to the use, quality, and performance of any Source or Product shall be with You and not the Licensor. This disclaimer of warranty is an essential part of this Licence and a condition for the grant of any rights granted under this Licence.

6.2 EXCLUSION AND LIMITATION OF LIABILITY – The Licensor shall, to the maximum extent permitted by law, have no liability for direct, indirect, special, incidental, consequential, exemplary, punitive or other damages of any character including, without limitation, procurement of substitute goods or services, loss of use, data or profits, or business interruption, however caused and on any theory of contract, warranty, tort (including negligence), product liability or otherwise, arising in any way in relation to the Covered Source, modified Covered Source and/or the Making or Conveyance of a Product, even if advised of the possibility of such damages, and You shall hold the Licensor(s) free and harmless from any liability, costs, damages, fees and expenses, including claims by third parties, in relation to such use.

7 Patents

7.1 Subject to the terms and conditions of this Licence, each Licensor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in subsections 7.2 and 8.4) patent licence to Make, have Made, use, offer to sell, sell, import, and otherwise transfer the Covered Source and Products, where such licence applies only to those patent claims licensable by such Licensor that are necessarily infringed by exercising rights under the Covered Source as Conveyed by that Licensor.

7.2 If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Covered Source or a Product constitutes direct or contributory patent infringement, or You seek any declaration that a patent licensed to You under this Licence is invalid or unenforceable then any rights granted to You under this Licence shall terminate as of the date such process is initiated.

8 General

8.1 If any provisions of this Licence are or subsequently become invalid or unenforceable for any reason, the remaining provisions shall remain effective.

8.2 You shall not use any of the name (including acronyms and abbreviations), image, or logo by which the Licensor or CERN is known, except where needed to comply with section 3, or where the use is otherwise allowed by law. Any such permitted use shall be factual and shall not be made so as to suggest any kind of endorsement or implication of involvement by the Licensor or its personnel.

8.3 CERN may publish updated versions and variants of this Licence which it considers to be in the spirit of this version, but may differ in detail to address new problems or concerns. New versions will be published with a unique version number and a variant identifier specifying the variant. If the Licensor has specified that a given variant applies to the Covered Source without specifying a version, You may treat that Covered Source as being released under any version of the CERN-OHL with that variant. If no variant is specified, the Covered Source shall be treated as being released under CERN-OHL-S. The Licensor may also specify that the Covered Source is subject to a specific version of the CERN-OHL or any later version in which case You may apply this or any later version of CERN-OHL with the same variant identifier published by CERN.

8.4 This Licence shall terminate with immediate effect if You fail to comply with any of its terms and conditions.

8.5 However, if You cease all breaches of this Licence, then Your Licence from any Licensor is reinstated unless such Licensor has terminated this Licence by giving You, while You remain in breach, a notice specifying the breach and requiring You to cure it within 30 days, and You have failed to come into compliance in all material respects by the end of the 30 day period. Should You repeat the breach after receipt of a cure notice and subsequent reinstatement, this Licence will terminate immediately and permanently. Section 6 shall continue to apply after any termination.

8.6 This Licence shall not be enforceable except by a Licensor acting as such, and third party beneficiary rights are specifically excluded.

\ No newline at end of file diff --git a/FPGA_NETWORK.html b/FPGA_NETWORK.html new file mode 100644 index 00000000..5dfca790 --- /dev/null +++ b/FPGA_NETWORK.html @@ -0,0 +1 @@ + FPGA network — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

FPGA network

The U55C card is equipped with two network connectors - QSFP0 is the upper port and QSFP1 is lower port (when PCIe connector is on the bottom). The card FPGA design is offered in two variants 100g and 8x10g. These have different behavior regarding the network:

100g this variant operates QSFP0 port in 100 Gbit/s mode and should be used when connecting detector via a switch. QSFP28 transceivers are necessary.

8x10g this variant operates both QSFP ports at 4x10 Gbit/s. QSFP+ (40 Gbit/s) transceivers and MTO/MTP harness cables are necessary. It is designed for detector directly connected to the Jungfraujoch server, without switch.

Transceivers

AMD doesn’t provide transceiver compatibility matrix for Alveo U55C. In our experience operating the card we haven’t seen issues with transceivers from various providers (FS.com, Mellanox, Finnisar). We have also successfully operated card with correct direct attach cables instead of fiber optics. Given the card doesn’t support link training functionality of 100 Gbit/s ethernet, it could result in performance problems with copper cables, though we haven’t encountered such a situation.

Switch configuration

Special care has to be taken for switch operation, given the FPGA core doesn’t support auto-negotiation. It is necessary to configure switch port to fixed speed (100 Gbit/s or 10 Gbit/s) and to disable auto-negotiation. It is also necessary to enable jumbo frames (MTU of 9000).

Network LEDs

Each QSFP connector is equipped with green and orange LEDs. These LEDs are connected to Ethernet physical layer status port (rx_status). LED on corresponds to having a physical connection to a switch/computer/detector on the other side of the network. For 100 Gbit/s only green is used, for 8x10 Gbit/s green LEDs means all ports connected, orange LEDs at least one of the ports connected.

Network stack

Each Ethernet link has its own basic network stack. Functionality for Ethernet/ARP/IPv4/ICMP is therefore separately handled for each port. Each link will get dedicated MAC address, and IPv4 addresses can be also assigned independently if needed.

The card will send gratuitous ARP messages every 5 seconds to keep its entry in switch MAC table. The card will also reply to ARP requests for its IP and to ICMP ping requests sent with the card IPv4 address. The card won’t respond to broadcast ICMP pings.

Each link can be put in direct mode. In this case destination Ethernet MAC and IPv4 addresses are not enforced for incoming UDP packets. This settings should be used for connecting detector modules directly to the FPGA card, so any detector module can be connected to any 10 Gbit/s link on the same card. Currently direct mode is turned OFF for 100g design and ON for 8x10g design. This can be manually adjusted for each link.

\ No newline at end of file diff --git a/FPGA_PCIE_DRIVER.html b/FPGA_PCIE_DRIVER.html new file mode 100644 index 00000000..919cc347 --- /dev/null +++ b/FPGA_PCIE_DRIVER.html @@ -0,0 +1,10 @@ + FPGA PCIe driver — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

FPGA PCIe driver

Compilation

To compile kernel module type:

make
+

Installation

To install kernel module, you need to have root permissions and run:

sudo make install
+

Loading driver into kernel

After installing the kernel driver, it should be possible to insert it into the kernel via:

modprobe jfjoch
+

Ownership of the character devices

By default, character devices /dev/jfjoch<device number> are owned by root (user/group) and are not accessible by others. This means that jfjoch_broker must be running as superuser, which might not be optimal for security reasons in most cases. The behavior can be changed by creating udev rules. Create a file called /etc/udev/rules.d/99-jfjoch.rules with the following content:

KERNEL=="jfjoch*" OWNER="<UNIX username>" GROUP="<UNIX group>"
+

It is OK to provide only group, for example to make the devices accessible by group jungfrau:

KERNEL=="jfjoch*" GROUP="jungfrau"
+

DKMS

To avoid problems with updating the kernel, it is possible to use DKMS to autobuild Jungfraujoch kernel module, when new kernel is installed. For RHEL 8 it is well tested to use the RPM module built automatically from Jungfraujoch source. For other systems, it is necessary to follow the procedure below, though it is not well tested.

This first requires to install DKMS - for RHEL it is available via EPEL repository:

sudo dnf install dkms
+

Then use script provided in the driver directory to copy driver code to DKMS directory:

./install_dkms.sh
+

If upgrading the driver, please first remove current driver from DKMS system:

dkms remove jfjoch -v <version> --all
+

Driver parameters

Currently, there is one driver parameter nbuffers, that defines count of exchange buffers (see below). This can be adjusted in the modprobe operation, for example:

modprobe jfjoch nbuffers=1024
+

Exchange buffers

The parameter defines number of buffers used to exchange data between card and host application. Each buffer can hold one detector module (1024x512) in 16-bit or 32-bit mode + associated processing results and metadata. These buffers are used by both card-to-host and host-to-card operations.

Buffers use special allocation, as they are continuous in physical address space, which helps the FPGA card to transfer all data associated with detector module in two DMA transfers (one data, one metadata). Useful buffer size is a bit more than 2 MiB, but given that kernel allocates physical memory in power of two, 4 MiB is safe number for one buffer size. Buffer can be mapped into user space, but performing mmap system call on the /dev/jfjoch<number of device> character device.

Buffer count can be adjusted by setting nbuffers parameter. There are two considerations for setting optimal value:

  1. For card-to-host transfers, minimal value is roughly <number of threads in receiver> * <number of modules processed by thread; usually equal to number of modules per card>, this way each thread can have enough data for operation. Default thread count for Jungfraujoch receiver is 64.

  2. For host-to-card transfers, full detector calibration has to fit into memory and one buffer accommodates one calibration set for one module. So minimal count is <number of modules> * (3 + 3 * <number of storage cells>).

Based on both rules, optimal number is 512 buffers (2 GiB), though this can be adjusted for particular system and configuration.

Known problems

To avoid inconsistent behavior, this driver won’t load if release number differs between the kernel driver and FPGA card.

CMake file

While CMake file is present in the driver directory, it is only for the purpose of proper detection of the files in CLion IDE. It is not made for actual compilation of the kernel driver and should not be used for that purpose.

Character device access

For each FPGA device a character device is created called /dev/jfjoch<number of device>. When device is opened two operations are possible: mmap() to map exchange buffers ioctl() to communicate with the cards Interfacing should be done through the JungfraujochDevice class in fpga/host_library directory.

Sysfs access

Certain performance counters can be read through sysfs mechanism in the kernel. One needs to cat files in /sys/class/misc/jfjoch<number of device>/ directory.

RHEL 9.5+ issue

RedHat Enterprise Linux 9.5 backported modification to settings virtual memory flags from Linux kernel 6.3, while still operating kernel version 5.14. It is complicated to come up with a single rule to select when newer functions should be used, so it works with RHEL 9.5+, while still being compatible with other Linux distributions. It is even more complex given not all RHEL compatible distributions adopted the change at the same version. For the moment the quick fix is to define an environment variable HAVE_VM_FLAGS_SET before making the kernel.

\ No newline at end of file diff --git a/FPGA_SETTINGS.html b/FPGA_SETTINGS.html new file mode 100644 index 00000000..4aed9f26 --- /dev/null +++ b/FPGA_SETTINGS.html @@ -0,0 +1 @@ + FPGA advanced reference — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

FPGA advanced reference

Register map

FPGA setup can be done via registers:

Address

Bits

Meaning

Mode

Notes

0x000000 - 0x00FFFF

Reserved (in case using MicroBlaze in the future, this has to be reserved for internal memory)

0x010000

32

Action Control Register

Bit 0 - Action start

R/W

Bit 1 - Action idle

R

Bit 2 - Action cancel

R/W

cleared on reset or action start

Bit 3 - Clear network counters

R/W

cleared on reset

Bit 12:4 - Debug signals (see action_config.v for details)

R

Bit 16 - AXI Mailbox interrupt 0

R

0x010004

32

Reserved

-

0x010008

32

Reserved

-

0x01000C

32

GIT SHA1

R

0x010010

32

Reserved

R

0x010014

32

Reserved

R

0x010018

32

Jungfraujoch FPGA variant

R

0x01001C

32

Reserved

R

0x010020

32

Max. number supported detector modules

R

constant

0x010024

32

Reserved

R

constant

0x010028

64

Pipeline stalls before writing to host memory

R

reset on action start

0x010030

64

Pipeline stalls before accessing HBM

R

reset on action start

0x010038

32

FIFO status (see action_config.v for details)

R

0x01003C

32

Size of single HBM channel in bytes (default value for the particular card)

R/W

should not be altered for standard operation

0x010040

64

Packets processed by the action

R

cleared on reset or action start

0x010048

64

Valid ethernet packets

R

cleared on reset

0x010050

64

Valid ICMP packets

R

cleared on reset

0x010058

64

Valid UDP packets

R

cleared on reset

0x010060

64

Valid detector packets processed by the card

R

cleared on reset

0x010068

64

Packets flagged as errors by CMAC

R

cleared on reset

0x010070

64

Pipeline stalls before data processing

R

reset on action start

0x010078

64

AXI-beats before accessing HBM

R

reset on action start

0x010080

64

AXI-beats before data processing

R

reset on action start

0x010088

64

AXI-beats before host writer

R

reset on action start

0x010090

64

Last encountered SwissFEL pulse ID

R

cleared on reset

0x010100

32

Spot finder photon count threshold

R/W

0x010104

32

Spot finder signal-to-noise ratio threshold (single-precision float)

R/W

0x010200

64

MAC address source for internal frame generator

R/W

network byte order

0x010208

32

IPv4 address source for internal frame generator

R/W

network byte order

0x01020C

32

Number of detector modules (value minus one: 0 => 1 module, 1 => 2 modules, etc.)

R/W

0x010210

32

Data collection mode

R/W

Bit 0 - Conversion to photons

Bit 1 - Output extend to 32-bit

Bit 2 - Output is unsigned integer

Bit 3 - Use sq. root lossy compression

Bit 7 - JUNGFRAU fixed G1 mode

Bit 8 - Set to zero values below threshold

Bit 16:31 - Data collection ID (carried with completions)

0x010214

32

Photon energy in keV (single-precision float)

R/W

0x010218

32

Number of frames expected in the data collection (defines termination condition)

R/W

0x01021C

32

Number of storage cells

R/W

0x010220

32

Summation on card (value minus one: 0 => summation of 1, 1 => summation of 2, etc.)

R/W

0x010224

32

Coefficient for sq. root compression (need to set bit in data collection mode to apply)

R/W

0x010225

32

Threshold; set values below set to zero (need to set bit in data collection mode to apply)

R/W

0x030000 - 0x03FFFF

AXI Mailbox for Work Request / Work Completion

See Xilinx PG114 for register map

0x040000 - 0x04FFFF

QuadSPI flash

See Xilinx PG153 for register map

0x050000 - 0x05FFFF

Interrupt controller

See Xilinx PG099 for register map

0x060000 - 0x06FFFF

Load calibration (HLS)

0x070000 - 0x07FFFF

AXI Firewall

See Xilinx PG293 for register map

0x080000 - 0x08FFFF

Frame generator (HLS)

0x090000 - 0x09FFFF

PCIe DMA control

See Xilinx PG195 for register map

0x0A0000 - 0x0AFFFF

I2C clock generator

See Xilinx PG195 for register map

0x0C0000 - 0x0FFFFF

Xilinx Card Management Solution Subsystem management subsystem

See Xilinx PG348 for register map

0x100000 - 0x10FFFF

MAC 10G / CMAC 100G

See Xilinx PG210/PG203 for register map

0x110000 - 0x11FFFF

MAC 10G

See Xilinx PG210 for register map

0x120000 - 0x12FFFF

MAC 10G

See Xilinx PG210 for register map

0x130000 - 0x13FFFF

MAC 10G

See Xilinx PG210 for register map

0x140000 - 0x14FFFF

MAC 10G

See Xilinx PG210 for register map

0x150000 - 0x15FFFF

MAC 10G

See Xilinx PG210 for register map

0x160000 - 0x16FFFF

MAC 10G

See Xilinx PG210 for register map

0x170000 - 0x17FFFF

MAC 10G

See Xilinx PG210 for register map

0x200000 - 0x20FFFF

Eth/IPv4 network stack for interface #0

0x210000 - 0x21FFFF

Eth/IPv4 network stack for interface #1

0x220000 - 0x22FFFF

Eth/IPv4 network stack for interface #2

0x230000 - 0x23FFFF

Eth/IPv4 network stack for interface #3

0x240000 - 0x24FFFF

Eth/IPv4 network stack for interface #4

0x250000 - 0x25FFFF

Eth/IPv4 network stack for interface #5

0x260000 - 0x26FFFF

Eth/IPv4 network stack for interface #6

0x270000 - 0x27FFFF

Eth/IPv4 network stack for interface #7

0x400000 - 0x47FFFF

64

Address table: decodes handles used by load_calibration and host_writer to DMA addresses

AXI Mailbox

AXI mailbox is used to send work request from host to action, and receive work completions. Messages are exchanged through AXI Mailbox IP from Xilinx (see Xilinx PG114).

Work request has the following structure:

Bit start

Bit end

Meaning

0

15

Work request ID (handle)

Work completion has the following structure:

Bit start

Bit end

Meaning

0

15

Work request ID (handle)

Special values:

65534 - start of data collection

65535 - end of data collection

15

31

Data collection ID

HBM memory

Interface number

Core

Meaning

0-1

jf_conversion

Gain factor G0

2-3

jf_conversion

Gain factor G1

4-5

jf_conversion

Gain factor G2

6-7

jf_conversion

Pedestal G0

8-9

jf_conversion

Pedestal G1

10-11

jf_conversion

Pedestal G2

12-13

integration

Integration map

14-15

integration

Integration weights

16-17

spot_finder_mask

Spot finder resolution

18-19

roi_calc

ROI calculation

20-21

frame_generator

Frame generator

22-27

load_from_hbm

Frame summation

\ No newline at end of file diff --git a/HARDWARE.html b/HARDWARE.html new file mode 100644 index 00000000..3cce3b0b --- /dev/null +++ b/HARDWARE.html @@ -0,0 +1 @@ + Hardware requirements — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

Hardware requirements

Operating Jungfraujoch requires the following:

  1. High performance server

  2. FPGA board(s) installed in the server

  3. (optionally) GPU boards

  4. (optionally) 100G switch to connect FPGA and the detector

Unfortunately, at the moment it is not possible to purchase server configuration from a major vendor that would include AMD FPGA boards. Therefore, the two has to be purchases separately. This might have impact on the warranty for the hardware and has to be clarified with the vendor. PSI only supports the system on the best effort basis and doesn’t take any responsibility for warranty limitations for operating FPGA boards in the server. Having said this - we didn’t encounter any hardware issues so far.

High performance server

PSI is using HPE DL380 Gen11 servers are the moment to operate Jungfraujoch systems. However, this is because of general preference for this vendor, there is no Jungfraujoch-specific reason to buy from this vendor. We do expect that system from any other vendor with similar specification should work as well.

At PSI, we use the following configuration of HPE DL380 Gen11 to operate 9M pixel detectors at 2 kHz is as follows:

  • 2 x Intel Xeon 8558P

  • 512 GB RAM

  • 2 x Nvidia L4 GPU (for indexing)

  • 1 x Nvidia Connect-X 6 200G ethernet/IB network (for outgoing traffic; this can be substituted according to facility needs)

  • Copper 1G/10G network

PCI slots

When ordering the system it is important to ensure enough PCIe cards can be accommodated in the system. In case of our system we need to put at least seven PCIe cards: 4 x FPGA, 2x GPU, 1x network

Note - for FPGA x8 lane electrically/x16 lane mechanically PCIe slots are OK.

FPGA

Jungfraujoch is built for AMD/Xilinx U55C (A-U55C-P00G-PQ-G) card. Other FPGA cards are currently not supported.

Single U55C card supports roughly 5 detector modules (2.5M pixels) at 2 kHz and 10 detector modules (5M pixels) at 1 kHz. For detectors operating at lower frame rates (e.g., 100 Hz) larger detectors can be supported by a single U55C card, though it requires using TX delay functionality in the detector.

GPUs

Operating fast-feedback indexer code requires operation of a graphic processing unit from Nvidia. For practical reasons, i.e. power consumption and cost, we choose inference grade card Nvidia L4. In the past we have also used T4 cards. So, in principle any recent CUDA compatible GPU should work.

Network switch

Small detectors (up to 4M pixel) can be in principle operated without switch. In this case one needs 8x10g variant of the Jungfraujoch FPGA image, which allows to directly connect 4 JUNGFRAU modules to one U55C card.

Such configuration is however impractical for larger systems or more complex deployments, like multiple detectors operated from one Jungfraujochs server. In this case one needs a network switch.

We currently use Nvidia/Mellanox SN2100 switch, though there is no reason not to use other models/other vendors. For switches with only 100G ports it is important to ensure, that these can be split into 4x10G ports to connect the detector.

\ No newline at end of file diff --git a/IMAGE_STREAM.html b/IMAGE_STREAM.html new file mode 100644 index 00000000..000393ab --- /dev/null +++ b/IMAGE_STREAM.html @@ -0,0 +1,30 @@ + Data streams — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

Data streams

Jungfraujoch process (jfjoch_broker) operates three outputs. All three can be operated/enabled independently. These are:

  • Image - all the images including metadata (ZeroMQ PUSH socket or custom TCP/IP socket)

  • Preview - images with metadata at a reduced frame rate (PUB socket)

  • Metadata - only metadata for all the images, bundled into packages (PUB socket)

Image stream

Images (with metadata) are serialized as CBOR image message. The stream will also include CBOR start message, calibration messages and end message with run metadata.

If file_prefix is not provided for a data collection, images won’t be sent to image stream (or its HDF5/CBOR replacements).

Splitting image stream

Image stream can be split into multiple sockets to increase performance, in this case images will be split according to file number to which the image belongs. All sockets will forward start and end messages. Only first socket will forward calibration messages and will be marked to write master file.

ZeroMQ image stream

This is using PUSH ZeroMQ socket(s). It should be strictly avoided to have multiple receivers connected to one PUSH ZeroMQ socket. ZeroMQ will send the images in a round-robin basis to the receivers. In this case start and end messages will end up only with one receiver. Instead, Jungfraujoch feature of multiple sockets should be used. For ZeroMQ image stream, each writer connects to a different port.

Behavior is as following:

  • Start message is sent with timeout of 1s per socket. If within the time the message cannot be put in the outgoing queue or there is no connected puller, an exception is thrown — data collection is stopped with an error due to absence of a writer.

  • Calibration message is sent to the first socket only, with timeout of 1s.

  • Images are sent via a per-socket writer thread. If a send times out, the pusher switches to non-blocking mode for the remainder of the collection (images may be dropped).

  • End message is sent with timeout of 1s per socket. No exception is thrown on timeout, but a transmission error is recorded.

The format is generally interchangeable with DECTRIS Stream2 format.

ZeroMQ configuration

ZeroMQ image stream is configured in the broker JSON configuration file under the zeromq_settings section:

{
+  "image_socket": ["tcp://192.168.0.1:9000", "tcp://192.168.0.1:9001"],
+  "send_watermark": 100,
+  "send_buffer_size": 67108864,
+  "writer_notification_socket": "tcp://192.168.0.1:*"
+}
+
  • image_socket: one or more PUSH socket addresses. Multiple entries split the image stream across sockets. Addresses follow ZeroMQ conventions (tcp://, ipc://). 0.0.0.0 binds on all network interfaces.

  • send_watermark (optional): ZeroMQ send high-water mark (number of outstanding messages per socket).

  • send_buffer_size (optional): OS-level send buffer size for the ZeroMQ socket.

  • writer_notification_socket (optional): see Writer notification socket below.

TCP/IP image stream

This is using TCP/IP socket(s) with a fixed binary frame header followed by payload bytes. This format was introduced to Jungfraujoch as an alternative to ZeroMQ image stream. It allows two-way communication between the data collection and the writer, and is therefore more robust than ZeroMQ.

For TCP/IP image stream, Jungfraujoch listens on a single TCP port and all writers connect to it. Connections are persistent — writers connect once and stay connected across multiple data collections. Jungfraujoch sends periodic KEEPALIVE frames when no data collection is active to detect dead connections; writers are expected to respond with a KEEPALIVE pong.

Using * as port number (e.g. tcp://127.0.0.1:*) is supported — the OS assigns a free port and the actual bound address can be queried via GetAddress().

Payloads for START, DATA, CALIBRATION and END frames are CBOR messages, equivalent in content to the ZeroMQ image stream messages.
ACK, CANCEL, and KEEPALIVE are control frames (no CBOR payload).

The data collection lifecycle on each connection follows: STARTCALIBRATION (socket 0 only) → DATA (repeated) → END

If a START ACK fails on any connection, Jungfraujoch sends CANCEL to all already-started connections and rolls back.

For each frame:

  1. Read one TcpFrameHeader (fixed size, 64-byte aligned).

  2. Validate magic (0x4A464A54 / "JFJT") and version (2).

  3. Read payload_size bytes (if non-zero).

When image stream is split into multiple connections:

  • START and END are sent on all connections,

  • CALIBRATION is sent only on connection 0,

  • DATA frames are distributed by file grouping: connection index = (image_number / images_per_file) % num_connections.

TCP/IP configuration

TCP/IP image stream is configured in the broker JSON configuration file under the tcp_settings section:

{
+  "image_socket": "tcp://192.168.0.1:9100",
+  "nwriters": 2,
+  "send_buffer_size": 67108864
+}
+
  • addr: listen address in tcp://<IP>:<port> format. 0.0.0.0 binds on all interfaces. * as port selects a random free port.

  • nwriters (optional): maximum number of simultaneous writer connections accepted.

  • send_buffer_size (optional): OS-level SO_SNDBUF size for accepted connections.

ACK handling

ACK handling is mandatory for correct operation:

  • START must be acknowledged (ACK with ack_for=START) on each connection within 5 seconds, otherwise collection start fails and a rollback is triggered.

  • END must be acknowledged (ack_for=END) on each connection within 10 seconds for successful completion.

  • CANCEL should be acknowledged during rollback paths (500ms timeout).

  • DATA should be acknowledged for every frame. A DATA ACK with FATAL flag set reports a downstream error (e.g. disk full) which is propagated to jfjoch_broker via Finalize(). A failed DATA ACK does not break the TCP connection on its own — data continues to flow.

  • CALIBRATION is not acknowledged at this time.

  • KEEPALIVE frames are not acknowledged via ACK; the writer responds with a KEEPALIVE pong frame instead.

Keepalive

When no data collection is active, Jungfraujoch sends KEEPALIVE frames approximately every 5 seconds on each persistent connection. Writers should respond with a KEEPALIVE frame (pong). OS-level TCP keepalive is also enabled (TCP_KEEPIDLE=30s, TCP_KEEPINTVL=10s, TCP_KEEPCNT=3) as a secondary safety net. Dead connections are automatically removed from the pool.

Zero-copy transmission

On Linux, large payload transmission (DATA and CALIBRATION frames) can use kernel TCP zero-copy (SO_ZEROCOPY/MSG_ZEROCOPY) when available. If the kernel does not support it or the socket option fails, transmission transparently falls back to normal send() behavior. Zero-copy completion notifications are processed by a dedicated per-connection thread.

Frame types

Value

Name

Purpose

1

START

Start-of-run metadata

2

DATA

One image payload

3

CALIBRATION

Calibration payload

4

END

End-of-run metadata

5

ACK

Acknowledgement / error reporting

6

CANCEL

Cancel run initialization/stream

7

KEEPALIVE

Connection liveness probe/pong

TCP frame header (TcpFrameHeader)

Field

Type

Description

magic

uint32_t

Protocol magic (0x4A464A54, "JFJT")

version

uint16_t

Protocol version (2)

type

uint16_t

Frame type (see table above)

image_number

uint64_t

Image index for DATA frames

payload_size

uint64_t

Number of payload bytes after header

socket_number

uint32_t

Connection index in split-stream mode

flags

uint32_t

ACK flags (OK, FATAL, HAS_ERROR_TEXT)

run_number

uint64_t

Run identifier

ack_processed_images

uint32_t

In ACK: number of images processed by receiver

ack_code

uint16_t

In ACK: error/status code

ack_for

uint16_t

In ACK: frame type being acknowledged

ack_fifo_occupancy

uint16_t

In ACK: occupancy of input FIFO in the jfjoch_writer

ack_fifo_max_occupancy

uint64_t

In ACK: max occupancy of input FIFO

The header is 64-byte aligned (alignas(64)).

ACK semantics

  • ACK frames use ack_for to indicate which frame type is acknowledged.

  • flags:

    • OK (bit 0): operation accepted/successful,

    • FATAL (bit 1): receiver reports unrecoverable error (primarily for DATA),

    • HAS_ERROR_TEXT (bit 2): ACK payload contains UTF-8 error text.

  • ack_code can be used to categorize errors:

Code

Name

Meaning

0

None

No error

1

StartFailed

START processing failed

2

DataWriteFailed

Image write failed

3

EndFailed

END processing failed

4

DiskQuotaExceeded

Disk quota exceeded

5

NoSpaceLeft

No space left on device

6

PermissionDenied

Permission denied

7

IoError

General I/O error

8

ProtocolError

Protocol-level error

Image stream replacement

Image stream can be replaced with direct HDF5 writer and CBOR dump image pushers, or it can be disabled by selecting “None” image pusher for all the measurements.

Writer notification socket

The writer notification socket is used only with ZeroMQ image stream. Since ZeroMQ is asynchronous, jfjoch_broker does not know whether messages were properly handled downstream (e.g. written to disk). The writer notification socket allows downstream code to report back.

For TCP/IP image stream, this mechanism is not needed — ACK frames provide synchronous feedback for each control and data frame.

To use writer notification socket, it has to be first enabled in the JSON configuration file of broker with writer_notification_socket entry:

{
+  "writer_notification_socket":"tcp://192.168.0.1:*"
+}
+

Such entry will create PULL socket on 192.168.0.1 network interface listening on one, random TCP port. When data processing is started, the image stream will send CBOR start message. This message will include information on writer_notification_zmq_addr, which needs to be used by downstream code. Since the start message must reference the address of jfjoch_broker host, notification socket should always listen on a particular network interface, and should not be configured with placeholder address 0.0.0.0. It is, however, OK to use placeholder :* for network port, as it will be substituted for the one chosen by ZeroMQ.

For every image stream socket, downstream code must send the following message to the PULL socket:

{
+  "run_number":135,
+  "run_name": "lysozyme_1",
+  "socket_number": 1,
+  "processed_images":250,
+  "ok": true
+}
+

Here run_number, run_name and socket_number must match information from the start message. ok is boolean confirming if the writing process was OK. processed_images is number of images that were written/processed, this is to track how many images were ignored by non-blocking ZeroMQ procedures. If not, it is possible to include error message:

{
+  "run_number":135,
+  "run_name": "lysozyme_1",
+  "socket_number": 1,
+  "processed_images": 0,
+  "ok": false,
+  "error": "Permission error"
+}
+

This way errors from the downstream code are propagated to jfjoch_broker.

If writer notification socket is configured, but downstream code doesn’t send proper notification, jfjoch_broker will time out after 60 seconds producing an error message.

Preview stream

Jungfraujoch can also send images (with metadata) at a reduced frame rate for preview purpose. Images are serialized as CBOR image message. The stream will also include CBOR start message and end message with run metadata. Only start and image messages are sent.

This is using PUB socket with conflate option. I.e., only the last message is kept by ZeroMQ, so if receiver cannot cope with the messages, it will always receive the last generated message (no backlog). For this reason it is also recommended to use the same option on receiver side.

Given PUB socket properties, it is possible to connect multiple viewers to a single socket — all the viewers should receive all the images sent.

Metadata stream

Jungfraujoch can also send pure metadata for the purpose of archiving such information. Metadata are serialized as CBOR metadata message. This is very similar as image message, but excludes the actual image array and spot positions. As metadata are relatively small, to avoid large number of messages, Jungfraujoch bundles metadata of many images in one message. Order of images within bundle, as well a size of the bundle, are not guaranteed. The stream will also include CBOR start message and end message with run metadata.

This is using PUB socket with watermark, so there is some queuing of messages with ZeroMQ. Multiple receivers can be connected.

\ No newline at end of file diff --git a/JFJOCH_BROKER.html b/JFJOCH_BROKER.html new file mode 100644 index 00000000..f3a2f7f5 --- /dev/null +++ b/JFJOCH_BROKER.html @@ -0,0 +1,127 @@ + jfjoch_broker — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

jfjoch_broker

jfjoch_broker is the main service for the Jungfraujoch application. It is responsible for:

  • Providing user interface via HTTP and OpenAPI

  • Configuring FPGA firmware

  • Building images from FPGA output and forwarding the results over ZeroMQ

External interfaces

Broker operates four external interfaces.

Image stream ZeroMQ PULL socket with CBOR serialization is used to send images, metadata and processing results for writing or downstream processing. See details here.

Preview stream ZeroMQ PUB socket, as above but limited to subset of frames (1 image/s by default). See details here.

Metadata stream ZeroMQ PUB socket, contains metadata for all the images, with bundling. See details here.

Configuration, status and results interface HTTP/REST interface described in the OpenAPI format. Description of the API is presented in the OpenAPI description.

Broker configuration

jfjoch_broker requires JSON configuration files. The file is described by OpenAPI structure jfjoch_settings defined in jfjoch_api.yaml file. It is recommended to go through example files in the etc/.

Example with all fields:

{
+  "pcie": [
+    {
+      "blk": "/dev/jfjoch0",
+      "ipv4": "10.1.1.7"
+    },
+    {
+      "blk": "/dev/jfjoch1",
+      "ipv4": "10.1.1.8"
+    }
+  ],
+  "zeromq": {
+    "send_watermark": 100,
+    "send_buffer_size": 1024,
+    "image_socket": [
+      "tcp://1.2.3.4:5000",
+      "tcp://1.2.3.4:5001"
+    ],
+    "writer_notification_socket": "tcp://1.3.4.6:7000"
+  },
+  "instrument": {
+    "source_name": "Swiss Light Source",
+    "source_type": "Synchrotron X-ray Source",
+    "instrument_name": "X06SA",
+    "pulsed_source": false,
+    "electron_source": false
+  },
+  "detector": [
+    {
+      "description": "EIGER 1M",
+      "serial_number": "E1M-01",
+      "type": "EIGER",
+      "high_voltage_V": 150,
+      "udp_interface_count": 1,
+      "module_sync": true,
+      "sensor_thickness_um": 320,
+      "calibration_file": [
+        "gainMaps.bin"
+      ],
+      "hostname": [
+        "e1m-01",
+        "e1m-02"
+      ],
+      "readout_time_us": 3,
+      "sensor_material": "Si",
+      "tx_delay": [
+        0,1
+      ],
+      "base_data_ipv4_address": "10.10.10.50",
+      "standard_geometry": {
+        "nmodules": 1,
+        "gap_x": 8,
+        "gap_y": 36,
+        "modules_in_row": 1
+      },
+      "custom_geometry": [
+        {
+          "x0": 0,
+          "y0": 0,
+          "fast_axis": "Xp",
+          "slow_axis": "Xp"
+        }
+      ],
+      "mirror_y": true
+    }
+  ],
+  "detector_settings": {
+    "frame_time_us": 450,
+    "count_time_us": 0,
+    "internal_frame_generator": false,
+    "internal_frame_generator_images": 1,
+    "detector_trigger_delay_ns": 0,
+    "timing": "auto",
+    "eiger_threshold_keV": 6.0,
+    "jungfrau_pedestal_g0_frames": 2000,
+    "jungfrau_pedestal_g1_frames": 300,
+    "jungfrau_pedestal_g2_frames": 300,
+    "jungfrau_pedestal_g0_rms_limit": 100,
+    "jungfrau_pedestal_min_image_count": 128,
+    "jungfrau_storage_cell_count": 1,
+    "jungfrau_storage_cell_delay_ns": 5000,
+    "jungfrau_fixed_gain_g1": false,
+    "jungfrau_use_gain_hg0": false
+  },
+  "azim_int": {
+    "polarization_factor": -1,
+    "solid_angle_corr": true,
+    "high_q_recipA": 0,
+    "low_q_recipA": 0,
+    "q_spacing": 0
+  },
+  "image_format": {
+    "summation": true,
+    "geometry_transform": true,
+    "jungfrau_conversion": true,
+    "jungfrau_conversion_factor_keV": 0.001,
+    "bit_depth_image": 16,
+    "signed_output": true,
+    "mask_module_edges": true,
+    "mask_chip_edges": true
+  },
+  "image_buffer_MiB": 2048,
+  "receiver_threads": 64,
+  "numa_policy": "n2g2",
+  "frontend_directory": "/usr/share/jfjoch/frontend",
+  "image_pusher": "ZeroMQ",
+  "zeromq_metadata": {
+    "enabled": true,
+    "period_ms": 1000,
+    "socket_address": "tcp://0.0.0.0:4357"
+  },
+  "zeromq_preview": {
+    "enabled": true,
+    "period_ms": 1000,
+    "socket_address": "tcp://0.0.0.0:4356"
+  }
+}
+

Setting up a local test for Jungfraujoch

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.

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.

To run the test:

Compile Jungfraujoch with frontend

mkdir build
+cd build
+cmake ..
+make jfjoch
+make frontend
+

Alternatively, for RHEL8 system, you can use RPM generated by automated pipeline. Solely jfjoch one is enough. In this case - it is necessary to update etc/broker_local.json file with frontend path in /usr/share/jfjoch/frontend.

Start service

Start broker:

cd build/broker
+./jfjoch_broker ../../etc/broker_local.json 5232
+

Run tests

To run test a Python script is provided:

cd tests/test_data
+python jfjoch_broker_test.py
+

The script will initialize Jungfraujoch, import test image and start data collection.

Expected result

You can observe online data analysis by opening the following web page: http://localhost:5232. Also, a dataset with images should be written in the build/broker directory.

\ No newline at end of file diff --git a/JFJOCH_VIEWER.html b/JFJOCH_VIEWER.html new file mode 100644 index 00000000..b62509db --- /dev/null +++ b/JFJOCH_VIEWER.html @@ -0,0 +1 @@ + jfjoch_viewer — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

jfjoch_viewer

Jungfraujoch diffraction viewer is distributed as a standalone application. It uses Qt library version 6, and allows to open HDF5 files generated by jfjoch_writer. It as well allows to open NXmx files written by DECTRIS detectors, though testing is very limited. It can be downloaded pre-built from Gitea release page, or from Jungfraujoch RPM/APT repositories. See Deployment section for more information. This viewer can be also sync online with jfjoch_broker HTTP interface to visualize data during data collection.

Data processing pipeline

Viewer contains embedded data processing pipeline, which is the same as the one used in Jungfraujoch installation. On systems equipped with GPU, it is preferable to use version compiled with CUDA support (proper RPM/APT repositories).

At the moment data processing results are not saved to disk.

DBus interface

Viewer can be controlled externally with DBus interface, allowing to open file, open detector via HTTP or load image.

\ No newline at end of file diff --git a/JFJOCH_WRITER.html b/JFJOCH_WRITER.html new file mode 100644 index 00000000..94b3a64d --- /dev/null +++ b/JFJOCH_WRITER.html @@ -0,0 +1,70 @@ + jfjoch_writer — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

jfjoch_writer

jfjoch_writer is NeXus compliant HDF5 file writer.

Acknowledgements

  • Zdenek Matej (MAX IV)

  • Felix Engelmann (MAX IV) for testing and multiple improvement suggestions.

Running directory

Writer needs to be running in base directory for writing files - file_prefix will be always relative in regard to writer running directory. Writer detects and protects for basic security issues, like file_prefix starting with a slash, or starting with ../, or containing /../.

Usage

Writer needs to be started as a background service, with the following command:

jfjoch_writer {options} <address to connect via ZeroMQ to DCU>
+
+Options:
+-R<int> | --root_dir=<int>           Root directory for file writing
+-H<int> | --http_port=<int>          HTTP port for statistics
+-r<int> | --zmq_repub_port=<int>     ZeroMQ port for PUSH socket to republish images
+-f<int> | --zmq_file_port=<int>      ZeroMQ port for PUB socket for notifications on finalized files
+-w<int> | --rcv_watermark=<int>      Receiving ZeroMQ socket watermark (default = 100)
+-W<int> | --repub_watermark=<int>    Republish ZeroMQ socket watermark (default = 1000)
+

for example:

jfjoch_writer -H5234 tcp://dcu-address:5400 
+

HTTP interface

Writer has dedicated status interface via HTTP. It allows for two operations:

  • check state of the writer to check if the writer is properly synchronized with DCU (e.g., that file_prefix agrees with what was set on the DCU) and monitor progress.

  • cancel writing this will close all the HDF5 files being written and restart writer - the option should be used only if DCU process was terminated or disconnected, it SHOULD NOT be used as standard cancellation procedure (when DCU received cancel command it should properly finish writing as well)

Republish

Republish creates a PULL socket on the writer, where all the messages are republished for further use by data analysis pipeline. Republish is non-blocking, so if there is no receiver on other end or the sending queue is full - images won’t be republished. In case of START/END messages republishing will attempt sending for 100 ms, but if send times out it won’t be retried.

Republish functionality is optional, if republish port number is omitted this functionality is not enabled.

Overwriting files

When jfjoch_writer creates a HDF5 file, it first adds suffix .<random>.tmp. Random value depends on current time-stamp and likely will be different from each file of the particular series. After file is all saved and closed, it is renamed to remove the suffix. By default, renaming won’t happen if this would overwrite existing file. However, this behavior can be changed by setting overwrite parameter to true in the file writer configuration.

Finalized files information

Creates PUB socket to inform about finalized data files. For each closed file, the socket will send a JSON message, with the following structure:

{
+  "filename": <string>: HDF5 data file name (relative to writer root directory),
+  "nimages": <int> number of images in the file (counting from 1!),
+  "file_number": <int> number of file within the acquisition,
+  "sample_name": <string> name of sample,
+  "run_name": <string> name of run,
+  "run_number": <int> number of run,
+  "experiment_group": <string> number of p-group / proposal (optional),
+  "user_data": <any json> user_data,
+  "beam_x_pxl": <float> beam center (X) in pixels,
+  "beam_y_pxl": <float> beam center (Y) in pixels,
+  "detector_distance_m": <float> detector distance (X) in m,
+  "detector_height_pxl": <int> detector size (X) in pixels,
+  "detector_width_pxl": <int> detector size (Y) in pixels,
+  "incident_energy_eV": <float> photon energy of the X-ray beam,
+  "pixel_size_m": <float> pixel size in meter (assuming pixel X == Y),
+  "saturation": <int> this count and higher mean saturation,
+  "space_group_number": <int> space group number (optional),
+  "underload": <int> pixels with this count should be excluded,
+  "unit_cell": <optinal> unit cell dimensions in Angstrom/degree {
+    "a": <float>, "b": <float>, "c": <float>,
+    "alpha": <float>, "beta": <float>, "gamma": <float>
+  },
+}
+

user_data is defined as header_appendix in the /start operation in the jfjoch_broker. Other metadata are also carried over from /start operation.

If the header_appendix is a string with valid JSON meaning, it will be embedded as JSON, otherwise it will be escaped as string. For example header_appendix of {"param1": "test1", "param2": ["test1", "test2"]}, than example message will look as follows:

{
+  "filename": "dataset_name_data_000001.h5",
+  "nimages": 1000,
+  "file_number": 0,
+  "sample_name": "lysozyme",
+  "run_name": "lyso_cryo",
+  "run_number": 25,
+  "experiment_group": "p00001",
+  "beam_x_pxl": 1200,
+  "beam_y_pxl": 1500,
+  "detector_distance_m": 0.155,
+  "detector_height_pxl": 2164,
+  "detector_width_pxl": 2068,
+  "image_time_s": 0.001,
+  "nimages": 2,
+  "incident_energy_eV": 12400.0,
+  "pixel_size_m": 7.5e-05,
+  "saturation": 32766,
+  "space_group_number": 96,
+  "underload": -32768,
+  "unit_cell": {
+    "a": 78.0,
+    "alpha": 90.0,
+    "b": 78.0,
+    "beta": 90.0,
+    "c": 39.0,
+    "gamma": 90.0
+  },
+  "user_data": {
+    "param1": "test1", 
+    "param2": ["test1", "test2"]
+  }
+}
+

Notifications for finalized files are optional, if notification port number is omitted this functionality is not enabled.

HDF5 file structure

Jungfraujoch aims to generate files compliant with NXmx format.

Master file

There are custom extension to NXmx format. These will be documented in the future.

Specifically, if data collection was configured with header_appendix having key equal to hdf5 and value as JSON object with number and string values. These will be added to /entry/user.

There are three versions of master file possible.

Legacy version (NXmxLegacy)

By default, legacy version is used. This version is compatible with DECTRIS file writer version 1.0 format. This ensures the file compatibility of Neggia and Durin XDS plugins, as well as DECTRIS Albula viewer version 4.0. Distinct feature is that if images are split into data files, there will be multiple links in /entry/data, each corresponding to a data file. Yet, certain new HDF5 features, like virtual datasets, are not possible in this format since it has to be compatible with HDF5 1.8 features.

VDS format (NXmxVDS)

Therefore, we have enabled format VDS version. This will link to all data files via a single virtual dataset /entry/data/data. The same way spot finding, azimuthal integration and others, will be linked between master and data files. This format allows to display processing results in currently developed Jungfraujoch Viewer. For the time being it only works with Durin XDS plugin, and require DECTRIS Albula viewer version 4.1+.

Integrated format (NXmxIntegrated)

This is format, where no data files are created, but both images and metadata are stored in the same master file. This is generally equivalent to VDS format described above.

Data file

Data file has the following structure:

Location

Description

Optional

Linked in master file v. 2

/entry/data/data

Images

X

/entry/detector/timestamp

Timestamp of the image

/entry/detector/exptime

Exposure time of the image

/entry/detector/number

Image number; if image rejection was used this will be the original image number

/entry/detector/det_info

Debug field of the JF detector

X

/entry/detector/storage_cell_image

Storage cell number

X

X *

/entry/detector/rcv_delay

Receiver delay for the image (Jungfraujoch debugging)

X

/entry/detector/rcv_free_send_buffers

Receiver number of free send buffers at the time of sending the image (Jungfraujoch debugging)

X

/entry/detector/data_collection_efficiency_image

Ratio of received and expected UDP packets

X

X *

/entry/detector/packets_expected

Number of UDP packets expected for the image

X

/entry/detector/packets_received

Number of UDP packets received for the image

X

/entry/image/max_value

Max viable value of the image (excl. overloads, etc.)

X

/entry/azint/bin_to_q

Azimuthal integration - bin-to-Q mapping

X

/entry/azint/image

Azimuthal integration - per image

X

X

/entry/MX/peakXPosRaw

Peak position X (see CXI format)

X

X

/entry/MX/peakYPosRaw

Peak position Y (see CXI format)

X

X

/entry/MX/peakTotalIntensity

Peak total intensity (see CXI format)

X

X

/entry/MX/peakH

Miller index h for each detected (indexed) peak

X

X

/entry/MX/peakK

Miller index k for each detected (indexed) peak

X

X

/entry/MX/peakL

Miller index l for each detected (indexed) peak

X

X

/entry/MX/peakDistEwaldSphere

Distance of the peak from the Ewald sphere (prediction)

X

X

/entry/MX/nPeaks

Number of peaks per image (see CXI format)

X

X

/entry/MX/strongPixels

Number of strong pixel per image

X

X

/entry/MX/nPeaksRingFiltered

Number of peaks not belonging to rings

X

X

/entry/MX/imageIndexed

Image is successfully indexed

X

X

/entry/MX/profileRadius

Crystal profile radius for indexed images

X

X

/entry/MX/latticeIndexed

Crystal lattice for the image, assuming it is indexed

X

X

/entry/MX/bkgEstimate

Mean value of pixels in the radius of 3-5 A

X

X

/entry/MX/resolutionEstimate

Resolution estimate based on on-the-fly integration

X

X

/entry/MX/beam_corr_x

Beam center correction applied during processing (X) [pixel]

X

X

/entry/MX/beam_corr_y

Beam center correction applied during processing (Y) [pixel]

X

X

/entry/MX/niggli_class

Niggli class identifier of the indexed Bravais lattice (per image) - see International Tables for Crystallography A (2016). Vol. A, Table 3.1.3.1

X

X

/entry/MX/bravais_lattice

Bravais lattice short code (per image), e.g., aP, mC, oF, tI, hP, hR, cF

X

X

/entry/roi/{roi_name}/max

Max pixel value for roi named {roi_name}

X

X

/entry/roi/{roi_name}/sum

Sum pixel value for roi named {roi_name}

X

X

/entry/roi/{roi_name}/sum_sq

Sum pixel values squared for roi named {roi_name}

X

X

/entry/roi/{roi_name}/npixel

Number of valid pixel for roi named {roi_name}

X

X

/entry/roi/{roi_name}/x

Weighted X-coordinate for roi named {roi_name}

X

X

/entry/roi/{roi_name}/y

Weighted Y-coordinate for roi named {roi_name}

X

X

/entry/xfel/pulseID

Pulse ID (for XFEL only)

X

X

/entry/xfel/eventCode

Event code (for XFEL only)

X

X

* - Datasets from /entry/detector in data file are mapped to /entry/instrument/detector/detectorSpecific in master file.

If spot finding is enabled, spots are written in the CXI format and are recognized by CrystFEL. The following has to be added to the CrystFEL geometry file:

peak_list = /opt/MX
+peak_list_type = cxi
+

Other formats (CBF and TIFF)

In addition to HDF5 format, Jungfraujoch allows to save images in the Crystallographic Binary File (CBF) format. CBF files are written according to miniCBF format, with only basic header, and always with 32-bit signed integer format. Dynamic range is reduced to max 2^24, negative numbers are zeroed, and masked, and/or bad pixels are set to -1.

Also writing to TIFF files is possible, though no metadata are saved in this case.

No file option(s)

There are two options to disable writing of files by the writer:

  • Setting file_prefix to empty string - this will disable sending files on ZeroMQ image socket.

  • Setting file format to NoFile - files are streamed over ZeroMQ socket, but jfjoch_writer will not write anything. This can be useful for debugging purposes, or if you only rely on republishing functionality of the jfjoch_writer

\ No newline at end of file diff --git a/LICENSE.html b/LICENSE.html new file mode 100644 index 00000000..76105b6b --- /dev/null +++ b/LICENSE.html @@ -0,0 +1,20 @@ + License — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

License

Jungfraujoch software is licensed with GPLv3 license. Jungfraujoch FPGA is licensed with CERN OHL-S license (see FPGA license).

GNU GENERAL PUBLIC LICENSE

Version 3, 29 June 2007

Copyright (C) 2007 Free Software Foundation, Inc. https://fsf.org/ Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.

Preamble

The GNU General Public License is a free, copyleft license for software and other kinds of works.

The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program–to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too.

When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things.

To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others.

For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.

Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it.

For the developers’ and authors’ protection, the GPL clearly explains that there is no warranty for this free software. For both users’ and authors’ sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions.

Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users’ freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users.

Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free.

The precise terms and conditions for copying, distribution and modification follow.

TERMS AND CONDITIONS

  1. Definitions.

“This License” refers to version 3 of the GNU General Public License.

“Copyright” also means copyright-like laws that apply to other kinds of works, such as semiconductor masks.

“The Program” refers to any copyrightable work licensed under this License. Each licensee is addressed as “you”. “Licensees” and “recipients” may be individuals or organizations.

To “modify” a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a “modified version” of the earlier work or a work “based on” the earlier work.

A “covered work” means either the unmodified Program or a work based on the Program.

To “propagate” a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well.

To “convey” a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying.

An interactive user interface displays “Appropriate Legal Notices” to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion.

  1. Source Code.

The “source code” for a work means the preferred form of the work for making modifications to it. “Object code” means any non-source form of a work.

A “Standard Interface” means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language.

The “System Libraries” of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A “Major Component”, in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it.

The “Corresponding Source” for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work’s System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work.

The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source.

The Corresponding Source for a work in source code form is that same work.

  1. Basic Permissions.

All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law.

You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you.

Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary.

  1. Protecting Users’ Legal Rights From Anti-Circumvention Law.

No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures.

When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work’s users, your or third parties’ legal rights to forbid circumvention of technological measures.

  1. Conveying Verbatim Copies.

You may convey verbatim copies of the Program’s source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program.

You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee.

  1. Conveying Modified Source Versions.

You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions:

a) The work must carry prominent notices stating that you modified it, and giving a relevant date.

b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to “keep intact all notices”.

c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it.

d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so.

A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an “aggregate” if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation’s users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate.

  1. Conveying Non-Source Forms.

You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways:

a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange.

b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge.

c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b.

d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements.

e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d.

A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work.

A “User Product” is either (1) a “consumer product”, which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, “normally used” refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product.

“Installation Information” for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made.

If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM).

The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network.

Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying.

  1. Additional Terms.

“Additional permissions” are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions.

When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission.

Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms:

a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or

b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or

c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or

d) Limiting the use for publicity purposes of names of licensors or authors of the material; or

e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or

f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors.

All other non-permissive additional terms are considered “further restrictions” within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying.

If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms.

Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way.

  1. Termination.

You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11).

However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation.

Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice.

Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10.

  1. Acceptance Not Required for Having Copies.

You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so.

  1. Automatic Licensing of Downstream Recipients.

Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License.

An “entity transaction” is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party’s predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts.

You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it.

  1. Patents.

A “contributor” is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor’s “contributor version”.

A contributor’s “essential patent claims” are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, “control” includes the right to grant patent sublicenses in a manner consistent with the requirements of this License.

Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor’s essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version.

In the following three paragraphs, a “patent license” is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To “grant” such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party.

If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. “Knowingly relying” means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient’s use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid.

If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it.

A patent license is “discriminatory” if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007.

Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law.

  1. No Surrender of Others’ Freedom.

If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program.

  1. Use with the GNU Affero General Public License.

Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such.

  1. Revised Versions of this License.

The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.

Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License “or any later version” applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation.

If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy’s public statement of acceptance of a version permanently authorizes you to choose that version for the Program.

Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version.

  1. Disclaimer of Warranty.

THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

  1. Limitation of Liability.

IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

  1. Interpretation of Sections 15 and 16.

If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.

END OF TERMS AND CONDITIONS

How to Apply These Terms to Your New Programs

If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.

To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the “copyright” line and a pointer to where the full notice is found.

<one line to give the program's name and a brief idea of what it does.>
+Copyright (C) <year>  <name of author>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <https://www.gnu.org/licenses/>.
+

Also add information on how to contact you by electronic and paper mail.

If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode:

<program>  Copyright (C) <year>  <name of author>
+This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+This is free software, and you are welcome to redistribute it
+under certain conditions; type `show c' for details.
+

The hypothetical commands show w and show c should show the appropriate parts of the General Public License. Of course, your program’s commands might be different; for a GUI interface, you would use an “about box”.

You should also get your employer (if you work as a programmer) or school, if any, to sign a “copyright disclaimer” for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see https://www.gnu.org/licenses/.

The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read https://www.gnu.org/licenses/why-not-lgpl.html.

Jungfraujoch exceptions to GPL

As a special exception, we specifically permit linking Jungfraujoch code with Nvidia CUDA libraries.

We also permit to link Jungfraujoch software (GPLv3) with Jungfraujoch high-level synthesis code (CERN OHL 2.0) for the purpose of simulating FPGA design on CPU.

If OpenAPI definition file (jfjoch_api.yaml) is solely used to generate client code or to interact with the Jungfraujoch API it may be distributed under terms of your choosing without being subject to GPL requirements.

\ No newline at end of file diff --git a/OPENAPI.html b/OPENAPI.html new file mode 100644 index 00000000..beb82681 --- /dev/null +++ b/OPENAPI.html @@ -0,0 +1,2 @@ + OpenAPI — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

OpenAPI

OpenAPI specs

See document with detailed OpenAPI specs.

Python client

Jungfraujoch is controlled with HTTP/REST interface defined with an OpenAPI specification. For convenience, we provide Python client as jfjoch-client PyPi package. To install the client you can use pip tool:

pip install jfjoch-client
+

See API reference from the OpenAPI generator.

\ No newline at end of file diff --git a/OPENAPI_SPECS.html b/OPENAPI_SPECS.html new file mode 100644 index 00000000..e46d2bdb --- /dev/null +++ b/OPENAPI_SPECS.html @@ -0,0 +1 @@ + OpenAPI specification — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

OpenAPI specification

See document with detailed OpenAPI specs generated with Redocly.

\ No newline at end of file diff --git a/PIXEL_MASK.html b/PIXEL_MASK.html new file mode 100644 index 00000000..8f50c242 --- /dev/null +++ b/PIXEL_MASK.html @@ -0,0 +1,13 @@ + Pixel mask — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

Pixel mask

Mask format

Jungfraujoch follows generally NXmx format format for pixel mask. Pixel mask is described as 32-bit unsigned integer array of size the same as the image. Conditions to mask pixel are described by setting a particular bit to one. This way it is possible to encode reason why pixel is included in the pixel mask, also for one pixel there can be multiple reasons encoded at the same time.

Bit values are set as follows:

Bit 0 - gap (pixel with no sensor)

Bit 1 - error pixel (for PSI JUNGFRAU: pixel doesn’t set proper gain during pedestal, for DECTRIS: pixel is part of detector pixel mask)

Bit 4 - noisy pixel (for PSI JUNGFRAU: pixel pedestal G0 RMS is over threshold, for DECTRIS: pixel was flagged with signal during dark data collection at initialization)

Bit 8 - user defined mask

Bit 30 - module edge (only for PSI systems)

Bit 31 - chip edge interpolated pixel (multipixel)

Custom user mask

Jungfraujoch allows to upload custom user mask. This happens in two steps. First create mask in TIFF format:

import numpy as np
+import tifffile as tiff
+
+# Create a 2068x2164 numpy array filled with zeros, with 32-bit unsigned integers
+array = np.zeros((2068, 2164), dtype=np.uint32)
+
+# Mark the pixel (300, 400) with the value 1
+array[300, 400] = 1
+
+# Save the array as a TIFF file
+tiff.imwrite('mask.tiff', array)
+

Pixels with non-zero value in the TIFF file will be marked as belonging to the user mask (bit 8).

Then upload the mask to Jungfraujoch server:

curl -v http://<jfjoch_broker http address>/config/user_mask.tiff -XPUT --data-binary @mask.tiff
+
\ No newline at end of file diff --git a/REPOSITORIES.html b/REPOSITORIES.html new file mode 100644 index 00000000..8dcb5a69 --- /dev/null +++ b/REPOSITORIES.html @@ -0,0 +1,5 @@ + Linux package repositories — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

Linux package repositories

For convenience, we are providing package repositories. With versions including and excluding CUDA linking. We recommend to install Jungfraujoch viewer from nocuda repository and remaining packages from cuda12/cuda13 repository.

RHEL based systems

For RHEL systems we provide the following repositories:

RHEL version

CUDA

Repository file

8.x

12.x

https://gitea.psi.ch/api/packages/mx/rpm/centos/el8/slsdet8-cuda12.repo

8.x

-

https://gitea.psi.ch/api/packages/mx/rpm/centos/el8/slsdet8-nocuda.repo

9.x

13.x

https://gitea.psi.ch/api/packages/mx/rpm/centos/el8/slsdet9-cuda13.repo

9.x

-

https://gitea.psi.ch/api/packages/mx/rpm/centos/el8/slsdet9-nocuda.repo

To install the repository, run:

dnf config-manager --add-repo https://gitea.psi.ch/api/packages/mx/rpm/centos/el8/slsdet8-cuda12.repo
+

Currently signing of RPMs is not supported, so the repository file needs to be manually modified to set gpgcheck=0 or installation must run with --nogpgcheck.

We provide the following packages in the repository:

  • jfjoch

  • jfjoch-driver

  • jfjoch-writer

  • jfjoch-viewer

Ubuntu based systems

For Ubuntu systems, we also provide the following repositories:

sudo curl https://gitea.psi.ch/api/packages/mx/debian/repository.key -o /etc/apt/keyrings/gitea-mx.asc
+echo "deb [signed-by=/etc/apt/keyrings/gitea-mx.asc] https://gitea.psi.ch/api/packages/mx/debian $distribution $component" | sudo tee -a /etc/apt/sources.list.d/gitea.list
+sudo apt update
+

$distribution uses Ubuntu names jammy (22.04) and noble (24.04). $component can be set to cuda13 and nocuda.

We provide the following packages in the repository:

  • jfjoch-jfjoch

  • jfjoch-driver

  • jfjoch-writer

  • jfjoch-viewer

Ubuntu packages are currently only going through a very limited testing.

\ No newline at end of file diff --git a/SOFTWARE.html b/SOFTWARE.html new file mode 100644 index 00000000..92648ce4 --- /dev/null +++ b/SOFTWARE.html @@ -0,0 +1 @@ + Software requirements — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

Software requirements

Operating system

Recommended operating system is Red Hat Enterprise Linux (RHEL) / Rocky Linux versions 8 or 9. For this operating systems we provide RPMs with pre-built binaries to simplify deployment. On experimental basis we also build repositories for Ubuntu 22.04 and 24.04.

Running Jungfraujoch on Red Hat Enterprise Linux 7 is currently not tested and not recommended, but likely possible with providing some packages from external repositories.

Software dependencies

Required:

Optional:

  • CUDA compiler version 12.7 or newer - required for MX fast feedback indexer

  • FFTW library - for indexing if GPU/CUDA is absent

  • NUMA library - to pin threads to nodes/CPUs

  • Node.js - to make frontend

  • Qt version 6 (for jfjoch_viewer)

Automatically downloaded by CMake and statically linked:

Directly included in the repository:

For license check LICENSE file in respective directory

\ No newline at end of file diff --git a/SOFTWARE_INTEGRATION.html b/SOFTWARE_INTEGRATION.html new file mode 100644 index 00000000..23400914 --- /dev/null +++ b/SOFTWARE_INTEGRATION.html @@ -0,0 +1,2 @@ + Integration with MX data processing software — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

Integration with MX data processing software

XDS

Jungfraujoch files are compatible with XDS, but there is a need of a dedicated plugin. First we recommend to use Jungfraujoch own XDS plugin. It is available for Linux only and can be downloaded from Gitea release directory (compiled on RHEL 8), it is also distributed in jfjoch_viewer RPM/APT packages. To use the plugin, download the file libjfjoch_xds_plugin.so.1.0.0 (three numbers at the end represent version of the plugin, and can differ later in time), save it to common directory (e.g., /opt/xds) and add the following line in the XDS.INP file:

LIB="/opt/xds/libjfjoch_xds_plugin.so.1.0.0"
+

We are also testing XDS with Durin and Neggia plugins, though they don’t have full functionality:

  • Neggia plugin doesn’t support HDF5 virtual data sets. It can be downloaded from github.com/dectris/neggia.

  • Durin has known bugs with handling non-DECTRIS files (so with virtual data sets or single format HDF5 file format). We recommend Durin plugin prepared by the Global Phasing consortium: github.com/CV-GPhL/durin, rather than original from the Diamond Light Source.

DIALS

Jungfraujoch files are tested regularly with DIALS (currently v. 3.27.0) xia2.ssx pipeline for serial crystallography. There is one known limitation: files generated with NXmxLegacy format (mimicking DECTRIS filewriter1 format) are not handled properly with DIALS. VDS based HDF5 format (NXmxVDS) is recommended, when using DIALS.

CrystFEL

Jungfraujoch files are compatible with CrystFEL.

\ No newline at end of file diff --git a/TESTS.html b/TESTS.html new file mode 100644 index 00000000..5edecae6 --- /dev/null +++ b/TESTS.html @@ -0,0 +1 @@ + Tests — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

Tests

Automated test routine is then accessible as tests/jfjoch_test. There are also benchmark routines:

  • jfjoch_hdf5_test to measure HDF5 dataset writing speed (single threaded)

  • jfjoch_offline_process to apply spot finding and indexing routines in Jungfraujoch to an example dataset - this is equivalent to FPGA spot finding algorithm, but NOT performance equivalent as it is particularly not-efficient

  • jfjoch_fpga_test to test quality/performance of FPGA card(s) and software routines

In addition, tests are executed to verify that datasets written by Jungfraujoch are readable with XDS Durin plugin, XDS Neggia plygin and CrystFEL. Input files for these programs are placed in xds_durin, xds_neggia and crystfel folders. See .gitlab-ci.yml for details.

\ No newline at end of file diff --git a/TOOLS.html b/TOOLS.html new file mode 100644 index 00000000..7b556cef --- /dev/null +++ b/TOOLS.html @@ -0,0 +1,13 @@ + Tools — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

Tools

jfjoch_pcie_status

Prints detailed status information about the card. Execute by adding device path, e.g.:

./jfjoch_pcie_status /dev/jfjoch0
+

The program is safe to execute during a running data collection.

jfjoch_pcie_clear_net_counters

Network counters in the card give information about Ethernet, UDP and ICMP packets encountered by the network stack prior to Jungfraujoch logic. These counters are running from the moment card is powered on. They can be reset by running the program with device name, e.g.:

./jfjoch_pcie_clear_net_counters /dev/jfjoch0
+

jfjoch_pcie_net_cfg

Network configuration can be retrieved and modified with jfjoch_pcie_net_cfg tool. Usage:

jfjoch_pcie_net_cfg <device name>
+     Read configuration for all network interface of a device
+jfjoch_pcie_net_cfg <device name> <if number>|fgen
+     Read configuration for a particular network interface / internal frame generator"
+jfjoch_pcie_net_cfg <device name> <if number>|fgen ipv4 <IPv4 address>
+     Set IPv4 address for a particular network interface / internal frame generator
+jfjoch_pcie_net_cfg <device name> <if number>|fgen direct 0|1
+     Set direct mode for a particular network interface / internal frame generator
+jfjoch_pcie_net_cfg <device name> <if number>|fgen clear
+     Clear Ethernet counter for a particular network interface / internal frame generator
+

jfjoch_hdf5_tools

Tool to test single threaded HDF5 writer performance

jfjoch_offline_process

Tool to run offline processing on existing HDF5 dataset

jfjoch_udp_simulator

UDP simulator to test Jungfraujoch FPGA

jfjoch_pcie_read_register

Tool to read verbatim Jungfraujoch FPGA registers

\ No newline at end of file diff --git a/VERSIONING.html b/VERSIONING.html new file mode 100644 index 00000000..fbde7193 --- /dev/null +++ b/VERSIONING.html @@ -0,0 +1 @@ + Semantic versioning — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

Semantic versioning

Jungfraujoch is following semantic versioning. For this purpose we define public API as following:

  • OpenAPI configuration interface

  • CBOR serialization ZeroMQ stream

  • HDF5 file format

This means that changes in the format of thereof must be accompanied by version change - major version in case of breaking changes, minor version in case of feature expansion.

NOTE: FPGA design, PCIe driver, and internal libraries are not part of the public API and are considered internals of Jungfraujoch. Breaking changes in these components can happen without incrementing major version of the whole package. It will be marked in changelog.

\ No newline at end of file diff --git a/WEB_FRONTEND.html b/WEB_FRONTEND.html new file mode 100644 index 00000000..4ec2e615 --- /dev/null +++ b/WEB_FRONTEND.html @@ -0,0 +1 @@ + Web frontend — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

Web frontend

Jungfraujoch is equipped with React-based web frontend for user-friendly experience. Frontend has the following options:

  • Presenting current state of the detector

  • Plotting results of online quality calculations

  • Showing live view images from the detector

  • JUNGFRAU calibration numbers

  • Configuring the detector, as well as pedestal/initialization operations

Frontend is written in TypeScript. For details see frontend/ directory.

\ No newline at end of file diff --git a/_downloads/625caea52ebbd47be3d6ed9efa4ee972/redoc-static.html b/_downloads/625caea52ebbd47be3d6ed9efa4ee972/redoc-static.html new file mode 100644 index 00000000..c492e4e5 --- /dev/null +++ b/_downloads/625caea52ebbd47be3d6ed9efa4ee972/redoc-static.html @@ -0,0 +1,943 @@ + + + + + + Jungfraujoch + + + + + + + + + +

Jungfraujoch (1.0.0-rc.144)

Download OpenAPI specification:

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

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

+

License Clarification

While this API definition is licensed under GPL-3.0, the GPL copyleft provisions do not apply +when this file is used solely to generate OpenAPI clients or when implementing applications that +interact with the API. Generated client code and applications using this API definition are not +subject to the GPL license requirements and may be distributed under terms of your choosing.

+

This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and +the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that +user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not +derivative works of the kernel and are not subject to the terms of the GPL.

+

This exception is intended to allow wider use of this API specification without imposing GPL +requirements on applications that merely interact with the API, regardless of whether they +communicate through network calls or other mechanisms.

+

Initialize detector and data acquisition

Should be used in two cases:

+
    +
  • Detector is in Inactive state
  • +
  • Detector is in Error state +X-ray shutter must be closed. +This operation will reconfigure network interface of the detector. +During operation of the detector it is recommended to use the POST /pedestal operation instead. +If storage cells are used, the execution time might be few minutes.
  • +
+

This is async function - one needs to use POST /wait_till_done to ensure operation is done.

+

Responses

Response samples

Content type
application/json
{
  • "msg": "Detector in wrong state",
  • "reason": "WrongDAQState"
}

Collect dark current for the detector

Updates calibration of the JUNGFRAU detector. Must be in Idle state.

+

X-ray shutter must be closed. Recommended to run once per hour for long integration times (> 100 us).

+

This is async function - one needs to use POST /wait_till_done to ensure operation is done.

+

Responses

Response samples

Content type
application/json
{
  • "msg": "Detector in wrong state",
  • "reason": "WrongDAQState"
}

Start detector

Start data acquisition. +Detector must be in Idle state. +Default behavior is for the call to block until detector is ready to accept soft/TTL triggers. +However, this behavior can be changed by settings async_start to true in the request body, +in which case the call will return immediately and one needs to use /wait_until_running to ensure detector is ready to run.

+
Request Body schema: application/json
images_per_trigger
integer <int64> >= 1
Default: 1

For standard synchrotron data collection - this is number of images collected per one TTL trigger +For XFEL (pulsed source) - this number is ignored and set to 1 +For storage cell mode - this number is ignored and set to number of storage cells

+
ntrigger
integer <int64> >= 1
Default: 1

Number of TTL trigger that the detector is expected to receive during data collection

+
image_time_us
integer <int64> >= 0

Image time. +If not provided (or zero value) the frame time is assumed as default. +For JUNGFRAU image time must be multiple of frame time and max value is 256 * frame_time.
In XFEL mode: summation happens for frames collected with multiple triggers. +Ignored for storage cells and if raw data are saved.

+
beam_x_pxl
required
number <float>

/entry/detector/beam_center_x in NXmx +Beam center in X direction [pixels]

+
beam_y_pxl
required
number <float>

/entry/detector/beam_center_y in NXmx +Beam center in X direction [pixels]

+
detector_distance_mm
required
number <float> >= 0

/entry/detector/distance in NXmx Detector distance [mm]

+
incident_energy_keV
required
number <float> [ 0.001 .. 500 ]

Used to calculate /entry/beam/incident_wavelength in NXmx +Incident particle (photon, electron) energy in keV

+
file_prefix
string
Default: ""

Prefix for filenames. If left empty, no file will be saved.

+
images_per_file
integer <int64> >= 0
Default: 1000

Number of files in a single HDF5 data file (0 = write all images to a single data file).

+
space_group_number
integer <int64> [ 1 .. 194 ]

Number of space group for the crystal. Currently used solely as metadata, not relevant for image processing done in Jungfraujoch.

+
sample_name
string
Default: ""

/entry/sample/name in NXmx +Sample name

+
compression
string
Default: "bslz4"
Enum: "bslz4" "bszstd" "bszstd_rle" "none"

Compression type for the images transferred over ZeroMQ and saved to HDF5 file.

+
total_flux
number <float>

/entry/beam/total_flux in NXmx +Flux incident on beam plane in photons per second. In other words this is the flux integrated over area. [photons/s]

+
transmission
number <float> [ 0 .. 1 ]

/entry/instrument/attenuator/attenuator_transmission +Transmission of attenuator (filter) [no units]

+
object (rotation_axis)

Definition of a crystal rotation axis

+
object (grid_scan)

Definition of a grid scan (mutually exclusive with rotation_axis)

+
header_appendix
any

Header appendix, added as user_data/user to start ZeroMQ message (can be any valid JSON) +In general, it is not saved in HDF5 file.

+

However, if values are placed in "hdf5" object, jfjoch_writer will write them in /entry/data of the HDF5 file. +This applies solely to string and number (double floating-point). No arrays/sub-objects is allowed. +For example {"hdf5": {"val1":1, "val2":"xyz"}}, will write /entry/user/val1 and /entry/user/val2.

+
image_appendix
any

Image appendix, added as user_data to image ZeroMQ message (can be any valid JSON) +Not saved in HDF5 file

+
data_reduction_factor_serialmx
number <float> [ 0 .. 1 ]
Default: 1

Rate at which non-indexed images are accepted to be forwarded to writer. +Value of 1.0 (default) means that all images are written. +Values below zero mean that non-indexed images will be accepted with a given probability.

+
pixel_value_low_threshold
integer <int64> >= 0

Set all counts lower than the value to zero. +When the value is set, negative numbers other than error pixel value are always set to zero. +Setting to zero is equivalent to turning the option off.

+
run_number
integer <int64> >= 0

Number of run within an experimental session. +Transferred over CBOR stream as "series ID", though not saved in HDF5 file. +It is highly recommended to keep this number unique for each data collection during experimental series. +If not provided, the number will be automatically incremented.

+
run_name
string

Unique ID of run. +Transferred over CBOR stream as "unique series ID", though not saved in HDF5 file. +It is highly recommended to keep this name unique for each data collection during experimental series. +If not provided, the name will be automatically generated as number + colon + file_prefix.

+
experiment_group
string

Name of group owning the data (e.g. p-group or proposal number). +Transferred over CBOR stream, though not saved in HDF5 file.

+
poisson_compression
integer <int64> [ 0 .. 16 ]

Enable lossy compression of pixel values that preserves Poisson statistics. +Requires to provide a numerical factor SQ. +Pixel value P will be transformed to round(sqrt(P) * SQ), with rounding to the closest integer. +Compression is turned off if the value is missing or it is set to zero.

+
write_nxmx_hdf5_master
boolean
Default: true

Write NXmx formatted HDF5 master file. Recommended to use for macromolecular crystallography experiments +and to turn off for other experiments.

+
save_calibration
boolean

Forward image calibration (at the moment pedestal and pedestal RMS for JUNGFRAU) using the ZeroMQ stream to writer. +If parameter is not provided calibration will be saved only if more than 4 images are recorded.

+
polarization_factor
number <float> [ -1 .. 1 ]

Polarization factor for integration; 1.0 is horizontal polarization; -1.0 is vertical polarization

+
ring_current_mA
number <float> >= 0

Ring current at the beginning of the data collection

+
sample_temperature_K
number <float> >= 0

Sample temperature in Kelvin

+
poni_rot1_rad
number <float> [ -6.28318530718 .. 6.28318530718 ]
Default: 0

PONI angle rot1 (see PyFAI documentation for details) in radians

+
poni_rot2_rad
number <float> [ -6.28318530718 .. 6.28318530718 ]
Default: 0

PONI angle rot2 (see PyFAI documentation for details) in radians

+
poni_rot3_rad
number <float> [ -6.28318530718 .. 6.28318530718 ]
Default: 0

PONI angle rot3 (see PyFAI documentation for details) in radians

+
object (unit_cell)

Unit cell parameters. Necessary to run indexing. Units of angstrom and degree

+
spot_finding
boolean
Default: true

Enable spot finding and save spots

+
max_spot_count
integer [ 10 .. 2000 ]
Default: 250

Maximum number of spots that are saved/used for indexing; spots with highest intensity are selected

+
detect_ice_rings
boolean

Flag spots as ice rings and reduce their effect on indexing

+
async_start
boolean
Default: false

When set to true, /start will not wait for detector and Jungfraujoch to be ready for the measurement.

+
object

Responses

Request samples

Content type
application/json
{
  • "images_per_trigger": 1,
  • "ntrigger": 1,
  • "image_time_us": 0,
  • "beam_x_pxl": 0.1,
  • "beam_y_pxl": 0.1,
  • "detector_distance_mm": 0.1,
  • "incident_energy_keV": 0.001,
  • "file_prefix": "",
  • "images_per_file": 1000,
  • "space_group_number": 1,
  • "sample_name": "",
  • "compression": "bslz4",
  • "total_flux": 0.1,
  • "transmission": 1,
  • "goniometer": {
    },
  • "grid_scan": {
    },
  • "header_appendix": null,
  • "image_appendix": null,
  • "data_reduction_factor_serialmx": 1,
  • "pixel_value_low_threshold": 0,
  • "run_number": 0,
  • "run_name": "string",
  • "experiment_group": "string",
  • "poisson_compression": 16,
  • "write_nxmx_hdf5_master": true,
  • "save_calibration": true,
  • "polarization_factor": -1,
  • "ring_current_mA": 0.1,
  • "sample_temperature_K": 0.1,
  • "poni_rot1_rad": 0,
  • "poni_rot2_rad": 0,
  • "poni_rot3_rad": 0,
  • "unit_cell": {
    },
  • "spot_finding": true,
  • "max_spot_count": 250,
  • "detect_ice_rings": true,
  • "async_start": false,
  • "xray_fluorescence_spectrum": {
    }
}

Response samples

Content type
application/json
{
  • "msg": "Detector in wrong state",
  • "reason": "WrongDAQState"
}

Wait for acquisition running

Block execution of external script till detector and Jungfraujoch are ready to collect data. +To not block web server for a indefinite period of time, the procedure is provided with a timeout. +Extending timeout is possible, but requires to ensure safety that client will not close the connection and retry the connection.

+
query Parameters
timeout
integer [ 0 .. 3600 ]
Default: 60

Timeout in seconds (0 == immediate response)

+

Responses

Response samples

Content type
application/json
{
  • "msg": "Detector in wrong state",
  • "reason": "WrongDAQState"
}

Wait for acquisition done

Block execution of external script till initialization, data collection or pedestal is finished. +Running this command does not affect (cancel) running data collection, it is only to ensure synchronous execution of other software.

+

To not block web server for a indefinite period of time, the procedure is provided with a timeout. +Extending timeout is possible, but requires to ensure safety that client will not close the connection and retry the connection.

+
query Parameters
timeout
integer [ 0 .. 3600 ]
Default: 60

Timeout in seconds (0 == immediate response)

+

Responses

Response samples

Content type
application/json
{
  • "msg": "Detector in wrong state",
  • "reason": "WrongDAQState"
}

Send soft trigger to the detector

Generate soft trigger

+

Responses

Cancel running data collection

Command will inform FPGA network card to stop pedestal or data collection at the current stage. +Any frame that is currently being processed by CPU will be finished and sent to writer. +Given the command is making sure to gracefully stop data acquisition and detector, it might take some time to switch back after command finished to Idle state.

+

If data collection is not running, the command has no effect.

+

Responses

Prepare detector to turn off

Should be in Idle or Error state. +Command deactivates data acquisition and turns off detector high voltage and ASIC. +Should be used always before turning off power from the detector.

+

Responses

Response samples

Content type
application/json
{
  • "msg": "Detector in wrong state",
  • "reason": "WrongDAQState"
}

Change detector configuration

Detector settings are ones that have effect on calibration, i.e., pedestal has to be collected again after changing these settings. +This can only be done when detector is Idle, Error or Inactive states. +If detector is in Idle state , pedestal procedure will be executed automatically - there must be no X-rays on the detector during the operation. +If detector is in Inactive or Error states, new settings will be saved, but no calibration will be executed.

+
Request Body schema: application/json
frame_time_us
required
integer <int64> >= 1

Interval between consecutive frames. +This is internal frame time for the JUNGFRAU detector, image time has to be integer multiply of this number. +For EIGER detector this is default frame time, not used otherwise

+
count_time_us
integer <int64>

Integration time of the detector. +If not provided count time will be set to maximum value for a given frame time.

+
internal_frame_generator
boolean
Default: false

Use internal frame generator in FPGA instead of getting data from a real detector

+
internal_frame_generator_images
integer <int64> [ 1 .. 64 ]
Default: 1

Number of images stored in the internal frame generator.

+
detector_trigger_delay_ns
integer <int64> >= 0
Default: 0

Delay between TTL trigger and acquisition start [ns]

+
timing
string (detector_timing)
Default: "trigger"
Enum: "auto" "trigger" "burst" "gated"
eiger_threshold_keV
number <float> [ 1 .. 100 ]

Threshold for the PSI EIGER detector and all DECTRIS detectors. +If value is provided, it will be used for all subsequent acquisitions, irrespective of beam energy. +If value is not provided, threshold will be determined on start of acquisition as half of incident energy. +This might lead to increased start time.

+
eiger_bit_depth
integer <int64>
Enum: 8 16 32

Bit depth of PSI EIGER read-out. This is
If value is not provided, depth will be determined based on the image time:

+
    +
  • Exposure time < 500 microseconds depth of 8 bit will be used,
  • +
  • 500 <= exposure time < 2622 microseconds depth of 16 bit will be used
  • +
  • Exposure time >= 2622 microseconds depth of 32 bit will be used.
  • +
+
jungfrau_pedestal_g0_frames
integer <int64> >= 0
Default: 2000
jungfrau_pedestal_g1_frames
integer <int64> >= 0
Default: 300
jungfrau_pedestal_g2_frames
integer <int64> >= 0
Default: 300
jungfrau_pedestal_min_image_count
integer <int64> >= 32
Default: 128

Minimum number of collected images for pedestal to consider it viable

+
jungfrau_storage_cell_count
integer <int64> [ 1 .. 16 ]
Default: 1
jungfrau_storage_cell_delay_ns
integer <int64> >= 2100
Default: 5000

Delay between two storage cells [ns]

+
jungfrau_fixed_gain_g1
boolean
Default: false

Fix gain to G1 (can be useful for storage cells)

+
jungfrau_use_gain_hg0
boolean
Default: false

Use high G0 (for low energy applications)

+

Responses

Request samples

Content type
application/json
{
  • "frame_time_us": 1,
  • "count_time_us": 0,
  • "internal_frame_generator": false,
  • "internal_frame_generator_images": 1,
  • "detector_trigger_delay_ns": 0,
  • "timing": "auto",
  • "eiger_threshold_keV": 1,
  • "eiger_bit_depth": 8,
  • "jungfrau_pedestal_g0_frames": 2000,
  • "jungfrau_pedestal_g1_frames": 300,
  • "jungfrau_pedestal_g2_frames": 300,
  • "jungfrau_pedestal_min_image_count": 128,
  • "jungfrau_storage_cell_count": 1,
  • "jungfrau_storage_cell_delay_ns": 5000,
  • "jungfrau_fixed_gain_g1": false,
  • "jungfrau_use_gain_hg0": false
}

Response samples

Content type
application/json
{
  • "msg": "Detector in wrong state",
  • "reason": "WrongDAQState"
}

Get detector configuration

Can be done anytime

+

Responses

Response samples

Content type
application/json
{
  • "frame_time_us": 1,
  • "count_time_us": 0,
  • "internal_frame_generator": false,
  • "internal_frame_generator_images": 1,
  • "detector_trigger_delay_ns": 0,
  • "timing": "auto",
  • "eiger_threshold_keV": 1,
  • "eiger_bit_depth": 8,
  • "jungfrau_pedestal_g0_frames": 2000,
  • "jungfrau_pedestal_g1_frames": 300,
  • "jungfrau_pedestal_g2_frames": 300,
  • "jungfrau_pedestal_min_image_count": 128,
  • "jungfrau_storage_cell_count": 1,
  • "jungfrau_storage_cell_delay_ns": 5000,
  • "jungfrau_fixed_gain_g1": false,
  • "jungfrau_use_gain_hg0": false
}

Change indexing algorithm settings

This can only be done when detector is Idle, Error or Inactive states.

+
Request Body schema: application/json
algorithm
required
string (indexing_algorithm)
Default: "FFBIDX"
Enum: "FFBIDX" "FFT" "FFTW" "Auto" "None"

Selection of an indexing algorithm used by Jungfraujoch

+
fft_max_unit_cell_A
required
number <float> [ 50 .. 500 ]
Default: 250

Largest unit cell to be indexed by FFT algorithm; parameter value affects execution time of FFT

+
fft_min_unit_cell_A
required
number <float> [ 5 .. 40 ]
Default: 10

Smallest unit cell to be indexed by FFT algorithm; parameter value affects execution time of FFT

+
fft_high_resolution_A
required
number <float> [ 0.5 .. 6 ]
Default: 2

Highest resolution of spots used for FFT algorithm; parameter value affects execution time of FFT. +There is also correlation between smallest unit cell and max resolution, which need to be checked for very small systems.

+
fft_num_vectors
required
integer <int64> >= 128
Default: 16384

Number of search directions for the FFT algorithm; parameter value affects execution time of FFT.

+
tolerance
required
number <float> [ 0 .. 0.5 ]

Acceptance tolerance for spots after the indexing run - the larger the number, the more spots will be accepted

+
thread_count
required
integer <int64> [ 1 .. 64 ]

Thread count for indexing algorithm

+
geom_refinement_algorithm
required
string (geom_refinement_algorithm)
Enum: "BeamCenter" "None"

Selection of an post-indexing detector geometry refinement algorithm used by Jungfraujoch. +This option is using non-linear least squares optimization to find unit cell and beam center.

+
unit_cell_dist_tolerance
required
number <float> [ 0.0001 .. 0.2001 ]
Default: 0.05

Relative distance tolerance for unit cell vs. reference; Lattices outside given tolerance will be ignored

+
viable_cell_min_spots
required
integer <int64> >= 5
Default: 10

Minimum number of indexed spots required for a cell to be considered viable

+
index_ice_rings
required
boolean
Default: false

Include spots marked as ice rings in the indexing run. +If dataset_settings doesn't have detect_ice_rings on, this option will have no effect on processing.

+
rotation_indexing
required
boolean
Default: false
rotation_indexing_min_angular_range_deg
required
number <float> >= 1
Default: 20
rotation_indexing_angular_stride_deg
required
number <float> >= 0
Default: 0.5
blocking
required
boolean
Default: true

Indexing in Jungfraujoch goes with a dedicated thread pool. +If set to false, the thread pool is non-blocking, i.e. if there are no threads available, image indexing will be skipped. This option is recommended for real-time processing at high frame rates. +If set to true, the thread pool will block until a thread is available.

+

Responses

Request samples

Content type
application/json
{
  • "algorithm": "FFBIDX",
  • "fft_max_unit_cell_A": 250,
  • "fft_min_unit_cell_A": 10,
  • "fft_high_resolution_A": 2,
  • "fft_num_vectors": 16384,
  • "tolerance": 0.5,
  • "thread_count": 1,
  • "geom_refinement_algorithm": "BeamCenter",
  • "unit_cell_dist_tolerance": 0.05,
  • "viable_cell_min_spots": 10,
  • "index_ice_rings": false,
  • "rotation_indexing": false,
  • "rotation_indexing_min_angular_range_deg": 20,
  • "rotation_indexing_angular_stride_deg": 0.5,
  • "blocking": true
}

Response samples

Content type
application/json
{
  • "msg": "Detector in wrong state",
  • "reason": "WrongDAQState"
}

Get indexing configuration

Can be done anytime

+

Responses

Response samples

Content type
application/json
{
  • "algorithm": "FFBIDX",
  • "fft_max_unit_cell_A": 250,
  • "fft_min_unit_cell_A": 10,
  • "fft_high_resolution_A": 2,
  • "fft_num_vectors": 16384,
  • "tolerance": 0.5,
  • "thread_count": 1,
  • "geom_refinement_algorithm": "BeamCenter",
  • "unit_cell_dist_tolerance": 0.05,
  • "viable_cell_min_spots": 10,
  • "index_ice_rings": false,
  • "rotation_indexing": false,
  • "rotation_indexing_min_angular_range_deg": 20,
  • "rotation_indexing_angular_stride_deg": 0.5,
  • "blocking": true
}

Change file writer settings

This can only be done when detector is Idle, Error or Inactive states.

+
Request Body schema: application/json
overwrite
boolean
Default: false

Inform jfjoch_write to overwrite existing files. Otherwise files would be saved with .h5.{timestamp}.tmp suffix.

+
format
string (file_writer_format)
Default: "NXmxLegacy"
Enum: "NXmxOnlyData" "NXmxLegacy" "NXmxVDS" "NXmxIntegrated" "CBF" "TIFF" "NoFileWritten"

NoFileWritten - no files are written at all +NXmxOnlyData - only data files are written, no master file +NXmxLegacy - legacy format with soft links to data files in the master file; necessary for DECTRIS Albula 4.0 and DECTRIS Neggia
NXmxVDS - newer format with virtual dataset linking data files in the master file, also includes better metadata handling +NXmxIntegrated - single HDF5 per dataset +CBF - CBF format (limited metadata) +TIFF - TIFF format (no metadata)

+

Responses

Request samples

Content type
application/json
{
  • "overwrite": false,
  • "format": "NXmxOnlyData"
}

Response samples

Content type
application/json
{
  • "msg": "Detector in wrong state",
  • "reason": "WrongDAQState"
}

Get file writer settings

Can be done anytime

+

Responses

Response samples

Content type
application/json
{
  • "overwrite": false,
  • "format": "NXmxOnlyData"
}

Change instrument metadata

This can only be done when detector is Idle, Error or Inactive states.

+
Request Body schema: application/json
source_name
required
string
source_type
string
Default: ""

Type of radiation source. NXmx gives a fixed dictionary, though Jungfraujoch is not enforcing compliance. +https://manual.nexusformat.org/classes/base_classes/NXsource.html#nxsource +NXsource allows the following:

+

Spallation Neutron Source +Pulsed Reactor Neutron Source +Reactor Neutron Source +Synchrotron X-ray Source +Pulsed Muon Source +Rotating Anode X-ray +Fixed Tube X-ray +UV Laser +Free-Electron Laser +Optical Laser +Ion Source +UV Plasma Source +Metal Jet X-ray

+
instrument_name
required
string
pulsed_source
boolean
Default: false

Settings specific to XFEL (e.g., every image has to come from TTL trigger, save pulse ID and event code)

+
electron_source
boolean
Default: false

Settings specific to electron source (e.g., wavelength definition)

+

Responses

Request samples

Content type
application/json
{
  • "source_name": "Swiss Light Source",
  • "source_type": "Synchrotron X-ray Source",
  • "instrument_name": "CristallinaMX",
  • "pulsed_source": false,
  • "electron_source": false
}

Response samples

Content type
application/json
{
  • "msg": "Detector in wrong state",
  • "reason": "WrongDAQState"
}

Get instrument metadata

Can be done anytime

+

Responses

Response samples

Content type
application/json
{
  • "source_name": "Swiss Light Source",
  • "source_type": "Synchrotron X-ray Source",
  • "instrument_name": "CristallinaMX",
  • "pulsed_source": false,
  • "electron_source": false
}

Change image output format

This can only be done when detector is Idle, Error or Inactive states.

+
Request Body schema: application/json
summation
required
boolean

Enable summation of images to a given image_time +If disabled images are saved according to original detector speed, but image count is adjusted

+
geometry_transform
required
boolean

Place module read-out into their location on composed detector and extend multipixels

+
jungfrau_conversion
required
boolean

Convert pixel value in ADU to photon counts/energy +Only affects JUNGFRAU detector

+
jungfrau_conversion_factor_keV
number <float> [ 0.001 .. 500 ]

Used to convert energy deposited into pixel to counts +If not provided incident_energy_keV is used

+
bit_depth_image
integer <int64>
Enum: 8 16 32

Bit depth of resulting image (it doesn't affect the detector read-out value) +If not provided value is adjusted automatically

+
signed_output
boolean

Controls if pixels have signed output +If not provided value is adjusted automatically

+
mask_module_edges
required
boolean
Default: true

Mask 1 pixel on the module boundary

+
mask_chip_edges
required
boolean
Default: true

Mask multipixels on chip boundary

+
jungfrau_mask_pixels_without_g0
boolean
Default: true

JUNGFRAU: mask pixels that don't operate in G0, but do operate in G1 and G1. +This should be turned off for cases, where detector is operated at room temperature with long exposure time.

+
apply_mask
required
boolean
Default: false

Masked pixels are set to special value in the images produced by Jungfraujoch

+
jungfrau_pedestal_g0_rms_limit
integer <int64> >= 0
Default: 100

Pixels with pedestal G0 RMS above the threshold are marked as masked pixels

+

Responses

Request samples

Content type
application/json
{
  • "summation": true,
  • "geometry_transform": true,
  • "jungfrau_conversion": true,
  • "jungfrau_conversion_factor_keV": 0.001,
  • "bit_depth_image": 8,
  • "signed_output": true,
  • "mask_module_edges": true,
  • "mask_chip_edges": true,
  • "jungfrau_mask_pixels_without_g0": true,
  • "apply_mask": false,
  • "jungfrau_pedestal_g0_rms_limit": 100
}

Response samples

Content type
application/json
{
  • "msg": "Detector in wrong state",
  • "reason": "WrongDAQState"
}

Get image output format

Can be done anytime

+

Responses

Response samples

Content type
application/json
{
  • "summation": true,
  • "geometry_transform": true,
  • "jungfrau_conversion": true,
  • "jungfrau_conversion_factor_keV": 0.001,
  • "bit_depth_image": 8,
  • "signed_output": true,
  • "mask_module_edges": true,
  • "mask_chip_edges": true,
  • "jungfrau_mask_pixels_without_g0": true,
  • "apply_mask": false,
  • "jungfrau_pedestal_g0_rms_limit": 100
}

Configure format for raw data collection

This can only be done when detector is Idle, Error or Inactive states.

+

Responses

Response samples

Content type
application/json
{
  • "msg": "Detector in wrong state",
  • "reason": "WrongDAQState"
}

Configure format for data collection with full conversion

This can only be done when detector is Idle, Error or Inactive states.

+

Responses

Response samples

Content type
application/json
{
  • "msg": "Detector in wrong state",
  • "reason": "WrongDAQState"
}

Configure spot finding

Can be done anytime, also while data collection is running

+
Request Body schema: application/json
enable
required
boolean
Default: true

Enable spot finding. This is temporary setting, i.e. can be changed anytime during data collection. +Even if disabled spot finding information will still be send and written, though always with zero spots.

+
indexing
required
boolean
Default: true

Enable indexing. This is temporary setting, i.e. can be changed anytime during data collection.

+
signal_to_noise_threshold
required
number <float> >= 0
photon_count_threshold
required
integer <int64> >= 0
min_pix_per_spot
required
integer <int64> >= 1
max_pix_per_spot
required
integer <int64> >= 1
high_resolution_limit
required
number <float>

High resolution limit for spot finding [Angstrom]

+
low_resolution_limit
required
number <float>

Low resolution limit for spot finding [Angstrom]

+
high_resolution_limit_for_spot_count_low_res
required
number <float> [ 2 .. 8 ]

High resolution threshold to consider spot "low resolution" [Angstrom]

+
quick_integration
required
boolean
Default: false

Quick integration of Bragg spots in diffraction images. +If enabled it will likely reduce performance of Jungfraujoch for datasets with a very high indexing rate. +(experimental feature)

+
ice_ring_width_q_recipA
required
number <float> [ 0 .. 1 ]
Default: 0.02

Width of ice ring in q-space in reciprocal space

+
high_res_gap_Q_recipA
number <float> [ 0.1 .. 5 ]
Default: 1.5

This parameter is used to remove spurious spots at a very high resolution, that sometimes appear due to very low background close to the edge of the detector. +If there is a gap in (1/d)-space between spots of at least this size, spots on the side of the gap with high resolution will be discarded. This is optional parameter. +This option should be turned OFF for small molecule datasets or for crystals with very low mosaicity, when it is expected to see only few spots in any case.

+

Responses

Request samples

Content type
application/json
{
  • "enable": true,
  • "indexing": true,
  • "signal_to_noise_threshold": 0.1,
  • "photon_count_threshold": 0,
  • "min_pix_per_spot": 1,
  • "max_pix_per_spot": 1,
  • "high_resolution_limit": 0.1,
  • "low_resolution_limit": 0.1,
  • "high_resolution_limit_for_spot_count_low_res": 2,
  • "quick_integration": false,
  • "ice_ring_width_q_recipA": 0.02,
  • "high_res_gap_Q_recipA": 1.5
}

Get data processing configuration

Can be done anytime

+

Responses

Response samples

Content type
application/json
{
  • "enable": true,
  • "indexing": true,
  • "signal_to_noise_threshold": 0.1,
  • "photon_count_threshold": 0,
  • "min_pix_per_spot": 1,
  • "max_pix_per_spot": 1,
  • "high_resolution_limit": 0.1,
  • "low_resolution_limit": 0.1,
  • "high_resolution_limit_for_spot_count_low_res": 2,
  • "quick_integration": false,
  • "ice_ring_width_q_recipA": 0.02,
  • "high_res_gap_Q_recipA": 1.5
}

Configure azimuthal integration

Can be done when detector is Inactive or Idle

+
Request Body schema: application/json
polarization_corr
required
boolean
Default: true

Apply polarization correction for azimuthal integration (polarization factor must be configured in dataset settings)

+
solid_angle_corr
required
boolean
Default: true

Apply solid angle correction for azimuthal integration

+
high_q_recipA
required
number <float>
low_q_recipA
required
number <float>
q_spacing
required
number <float>
azimuthal_bins
integer <int64> [ 1 .. 256 ]
Default: 1

Numer of azimuthal (phi) bins; 1 = standard 1D azimuthal integration

+

Responses

Request samples

Content type
application/json
{
  • "polarization_corr": true,
  • "solid_angle_corr": true,
  • "high_q_recipA": 0.1,
  • "low_q_recipA": 0.1,
  • "q_spacing": 0.1,
  • "azimuthal_bins": 1
}

Response samples

Content type
application/json
{
  • "msg": "Detector in wrong state",
  • "reason": "WrongDAQState"
}

Get azimuthal integration configuration

Can be done anytime

+

Responses

Response samples

Content type
application/json
{
  • "polarization_corr": true,
  • "solid_angle_corr": true,
  • "high_q_recipA": 0.1,
  • "low_q_recipA": 0.1,
  • "q_spacing": 0.1,
  • "azimuthal_bins": 1
}

Load binary image for internal FPGA generator

Load image for internal FPGA generator. This can only happen in Idle state of the detector. +Requires binary blob with 16-bit integer numbers of size of detector in raw/converted coordinates +(depending on detector settings).

+
query Parameters
id
integer <int64> [ 0 .. 127 ]

Image id to upload

+
Request Body schema: application/octet-stream
string <binary>

Responses

Load TIFF image for internal FPGA generator

Load image for internal FPGA generator. This can only happen in Idle state of the detector. +Requires TIFF with 16-bit integer numbers of size of detector in raw/converted coordinates +(depending on detector settings).

+
query Parameters
id
integer [ 0 .. 127 ]

Image ID to upload

+
Request Body schema: image/tiff
string <binary>

Responses

Select detector

Jungfraujoch allows to control multiple detectors and/or region-of-interests. +The command allows to choose one detector from the list (ID has to be consistent with one provided by GET response). +Changing detector will set detector to Inactive state and will require reinitialization.

+
Request Body schema: application/json
id
required
integer <int64>

Responses

Request samples

Content type
application/json
{
  • "id": 1
}

Response samples

Content type
application/json
{
  • "msg": "Detector in wrong state",
  • "reason": "WrongDAQState"
}

List available detectors

Configured detectors that can be selected by used

+

Responses

Response samples

Content type
application/json
{
  • "detectors": [
    ],
  • "current_id": 0
}

Set ZeroMQ preview settings

Jungfraujoch can generate preview message stream on ZeroMQ SUB socket. +Here settings of the socket can be adjusted. +While the data structure contains also socket_address, this cannot be changed via HTTP and is ignore in PUT request. +Options set with this PUT request have no effect on HTTP based preview.

+
Request Body schema: application/json
enabled
required
boolean
Default: true

ZeroMQ preview socket is enabled.

+
period_ms
required
integer <int64>
Default: 1000

Period for generating preview image sent to the ZeroMQ interface in milliseconds. Default is 1 second. +If set to zero, all images will be sent ZeroMQ (should be used only in case of relatively slow data collection). +This has no effect on HTTP based preview, which updates always at rate of 1 second.

+
socket_address
string

PUB ZeroMQ socket for preview images. This socket operates at a reduced frame rate. +Images are serialized using CBOR. +Address follows ZeroMQ convention for sockets - in practice ipc:// and tcp://: sockets are OK. +0.0.0.0 instead of IP address is accepted and means listening on all network interfaces.

+

Responses

Request samples

Content type
application/json
{
  • "enabled": true,
  • "period_ms": 1000,
  • "socket_address": "string"
}

Response samples

Content type
application/json
{
  • "msg": "Detector in wrong state",
  • "reason": "WrongDAQState"
}

Get ZeroMQ preview settings

Responses

Response samples

Content type
application/json
{
  • "enabled": true,
  • "period_ms": 1000,
  • "socket_address": "string"
}

Set ZeroMQ metadata settings

Jungfraujoch can generate metadata message stream on ZeroMQ PUB socket. This stream covers all images. +Here settings of the socket can be adjusted. +While the data structure contains also socket_address, this cannot be changed via HTTP and is ignore in PUT request.

+
Request Body schema: application/json
enabled
required
boolean
Default: true

ZeroMQ metadata socket is enabled.

+
period_ms
required
integer <int64> >= 1
Default: 1000

Period for generating metadata package sent to the ZeroMQ interface in milliseconds.

+
socket_address
string

PUB ZeroMQ socket for image metadata information. +Image metadata are serialized using CBOR. +Address follows ZeroMQ convention for sockets - in practice ipc:// and tcp://: sockets are OK. +0.0.0.0 instead of IP address is accepted and means listening on all network interfaces.

+

Responses

Request samples

Content type
application/json
{
  • "enabled": true,
  • "period_ms": 1000,
  • "socket_address": "string"
}

Response samples

Content type
application/json
{
  • "msg": "Detector in wrong state",
  • "reason": "WrongDAQState"
}

Get ZeroMQ metadata socket settings

Responses

Response samples

Content type
application/json
{
  • "enabled": true,
  • "period_ms": 1000,
  • "socket_address": "string"
}

Set configuration for dark data collection to calculate mask

This is only possible when operating DECTRIS detectors at the moment; it will be also available for PSI EIGER at some point. +This can only be done when detector is Idle, Error or Inactive states.

+
Request Body schema: application/json
detector_threshold_keV
required
number <float> [ 2.5 .. 100 ]
Default: 3.5

Energy threshold for dark image collection

+
frame_time_us
required
integer <int64> [ 500 .. 100000 ]
Default: 10000

Time between frames for dark image collection

+
number_of_frames
required
integer <int64> >= 0
Default: 1000

Number of frames for dark image collection; zero means no dark collection

+
max_allowed_pixel_count
required
integer <int64> >= 0
Default: 1

Maximum count in a pixel considered normal (not-masked)

+
max_frames_with_signal
required
integer <int64> >= 0
Default: 10

Maximum number of frames with signal in a pixel considered normal (not-masked)

+

Responses

Request samples

Content type
application/json
{
  • "detector_threshold_keV": 3.5,
  • "frame_time_us": 10000,
  • "number_of_frames": 1000,
  • "max_allowed_pixel_count": 1,
  • "max_frames_with_signal": 10
}

Response samples

Content type
application/json
{
  • "msg": "Detector in wrong state",
  • "reason": "WrongDAQState"
}

Get settings for dark data collection to calculate mask

Responses

Response samples

Content type
application/json
{
  • "detector_threshold_keV": 3.5,
  • "frame_time_us": 10000,
  • "number_of_frames": 1000,
  • "max_allowed_pixel_count": 1,
  • "max_frames_with_signal": 10
}

Get Jungfraujoch status

Status of the data acquisition

+

Responses

Response samples

Content type
application/json
{
  • "state": "Inactive",
  • "progress": 1,
  • "message": "string",
  • "message_severity": "success",
  • "gpu_count": 0,
  • "broker_version": "1.0.0-rc.128"
}

Get status of FPGA devices

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Return XFEL pulse IDs for the current data acquisition

Return array of XFEL pulse IDs - (-1) if image not recorded

+

Responses

Response samples

Content type
application/json
[
  • 0
]

Return XFEL event codes for the current data acquisition

Return array of XFEL event codes

+

Responses

Response samples

Content type
application/json
[
  • 0
]

Get status of image pusher

Responses

Response samples

Content type
application/json
{
  • "pusher_type": "ZeroMQ",
  • "addr": [
    ],
  • "connected_writers": 0,
  • "images_written": 0,
  • "images_write_error": 0,
  • "writer_fifo_utilization": [
    ]
}

Get detector status

Status of the JUNGFRAU detector

+

Responses

Response samples

Content type
application/json
{
  • "state": "Idle",
  • "powerchip": "PowerOn",
  • "server_version": "string",
  • "number_of_triggers_left": 0,
  • "fpga_temp_degC": [
    ],
  • "high_voltage_V": [
    ]
}

Get ROI definitions

Responses

Response samples

Content type
application/json
{
  • "box": {
    },
  • "circle": {
    },
  • "azim": {
    }
}

Upload ROI definitions

Request Body schema: application/json
required
object (roi_box_list)

List of box ROIs

+
required
object (roi_circle_list)

List of circular ROIs

+
required
object (roi_azim_list)

List of azimuthal ROIs

+

Responses

Request samples

Content type
application/json
{
  • "box": {
    },
  • "circle": {
    },
  • "azim": {
    }
}

Response samples

Content type
application/json
{
  • "msg": "Detector in wrong state",
  • "reason": "WrongDAQState"
}

Get general statistics

Responses

Response samples

Content type
application/json
{
  • "detector": {
    },
  • "detector_list": {
    },
  • "detector_settings": {
    },
  • "image_format_settings": {
    },
  • "instrument_metadata": {
    },
  • "file_writer_settings": {
    },
  • "data_processing_settings": {
    },
  • "measurement": {
    },
  • "broker": {
    },
  • "fpga": [
    ],
  • "calibration": [
    ],
  • "zeromq_preview": {
    },
  • "zeromq_metadata": {
    },
  • "dark_mask": {
    },
  • "pixel_mask": {
    },
  • "roi": {
    },
  • "az_int": {
    },
  • "buffer": {
    },
  • "indexing": {
    },
  • "image_pusher": {
    }
}

Get data collection statistics

Results of the last data collection

+

Responses

Response samples

Content type
application/json
{
  • "file_prefix": "string",
  • "run_number": 0,
  • "experiment_group": "string",
  • "images_expected": 0,
  • "images_collected": 0,
  • "images_sent": 0,
  • "images_written": 0,
  • "images_discarded_lossy_compression": 0,
  • "max_image_number_sent": 0,
  • "collection_efficiency": 1,
  • "compression_ratio": 5.3,
  • "cancelled": true,
  • "max_receiver_delay": 0,
  • "indexing_rate": 0.1,
  • "detector_width": 0,
  • "detector_height": 0,
  • "detector_pixel_depth": 2,
  • "bkg_estimate": 0.1,
  • "unit_cell": "string",
  • "error_pixels": 0.1,
  • "saturated_pixels": 0.1,
  • "roi_beam_pixels": 0.1,
  • "roi_beam_sum": 0.1
}

Get calibration statistics

Statistics are provided for each module/storage cell separately

+

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Get mask of the detector (binary)

Detector must be Initialized. +Get full pixel mask of the detector. +See NXmx standard for meaning of pixel values.

+

Responses

Detector must be Initialized. +Get user mask of the detector (binary) +

Get user pixel mask of the detector in the actual detector coordinates: 0 - good pixel, 1 - masked

+

Responses

Upload user mask of the detector (binary)

Should be in Idle state. +Upload user mask of the detector - this is for example to account for beam stop shadow or misbehaving regions. +If detector is conversion mode the mask can be both in raw (1024x512; stacked modules) or converted coordinates. +In the latter case - module gaps are ignored and don't need to be assigned value. +Mask is expected as binary array (4-byte; unsigned). +0 - good pixel, other value - masked +User mask is stored in NXmx pixel mask (bit 8), as well as used in spot finding and azimuthal integration.

+
Request Body schema: application/octet-stream
string <binary>

Responses

Response samples

Content type
application/json
{
  • "msg": "Detector in wrong state",
  • "reason": "WrongDAQState"
}

Get mask of the detector (TIFF)

Should be in Idle state. +Get full pixel mask of the detector +See NXmx standard for meaning of pixel values

+

Responses

Detector must be Initialized. +Get user mask of the detector (TIFF) +

Get user pixel mask of the detector in the actual detector coordinates: 0 - good pixel, 1 - masked

+

Responses

Upload user mask of the detector

Should be in Idle state. +Upload user mask of the detector - this is for example to account for beam stop shadow or misbehaving regions. +If detector is conversion mode the mask can be both in raw (1024x512; stacked modules) or converted coordinates. +In the latter case - module gaps are ignored and don't need to be assigned value. +Mask is expected as TIFF (4-byte; unsigned). +0 - good pixel, other value - masked +User mask is stored in NXmx pixel mask (bit 8), as well as used in spot finding and azimuthal integration. +User mask is not automatically applied - i.e. pixels with user mask will have a valid pixel value in the images.

+
Request Body schema: image/tiff
string <binary>

Responses

Response samples

Content type
application/json
{
  • "msg": "Detector in wrong state",
  • "reason": "WrongDAQState"
}

Get pedestal in TIFF format

query Parameters
gain_level
required
integer

Gain level (0, 1, 2)

+
sc
integer

Storage cell number

+

Responses

Generate 1D plot from Jungfraujoch

query Parameters
binning
integer
Default: 1

Binning of frames for the plot (0 = default binning)

+
type
required
string
Enum: "bkg_estimate" "azint" "azint_1d" "spot_count" "spot_count_low_res" "spot_count_indexed" "spot_count_ice" "indexing_rate" "indexing_unit_cell_length" "indexing_unit_cell_angle" "profile_radius" "mosaicity" "b_factor" "error_pixels" "saturated_pixels" "image_collection_efficiency" "receiver_delay" "receiver_free_send_buf" "strong_pixels" "roi_sum" "roi_mean" "roi_max_count" "roi_pixels" "roi_weighted_x" "roi_weighted_y" "packets_received" "max_pixel_value" "resolution_estimate" "pixel_sum" "processing_time" "beam_center_x" "beam_center_y" "integrated_reflections"

Type of requested plot

+
fill
number <float>

Fill value for elements that were missed during data collection

+
experimental_coord
boolean
Default: false

If measurement has goniometer axis defined, plot X-axis will represent rotation angle +If measurement has grid scan defined, plot X-axis and Y-axis will represent grid position, Z will be used as the final value +For still measurement the number is ignored

+
azint_unit
string
Default: "Q_recipA"
Enum: "Q_recipA" "d_A" "two_theta_deg"

Unit used for azim int.

+

Responses

Response samples

Content type
application/json
{
  • "title": "string",
  • "unit_x": "image_number",
  • "size_x": 0.1,
  • "size_y": 0.1,
  • "plot": [
    ]
}

Generate 1D plot from Jungfraujoch and send in raw binary format. +Data are provided as (32-bit) float binary array. +This format doesn't transmit information about X-axis, only values, so it is of limited use for azimuthal integration. +

query Parameters
type
required
string
Enum: "bkg_estimate" "azint" "azint_1d" "spot_count" "spot_count_low_res" "spot_count_indexed" "spot_count_ice" "indexing_rate" "indexing_unit_cell_length" "indexing_unit_cell_angle" "profile_radius" "mosaicity" "b_factor" "error_pixels" "saturated_pixels" "image_collection_efficiency" "receiver_delay" "receiver_free_send_buf" "strong_pixels" "roi_sum" "roi_mean" "roi_max_count" "roi_pixels" "roi_weighted_x" "roi_weighted_y" "packets_received" "max_pixel_value" "resolution_estimate" "pixel_sum" "processing_time" "beam_center_x" "beam_center_y" "integrated_reflections"

Type of requested plot

+
roi
string non-empty

Name of ROI for which plot is requested

+

Responses

Get full scan result

Responses

Response samples

Content type
application/json
{
  • "file_prefix": "string",
  • "rotation_unit_cell": {
    },
  • "rotation_crystal_lattice": [
    ],
  • "images": [
    ]
}

Get Start message in CBOR format

Contains metadata for a dataset (e.g., experimental geometry)

+

Responses

Response samples

Content type
application/json
{
  • "msg": "Detector in wrong state",
  • "reason": "WrongDAQState"
}

Get image message in CBOR format

Contains full image data and metadata. The image must come from the latest data collection.

+
query Parameters
id
integer <int64> >= -2
Default: -1

Image ID in the image buffer. Special values: -1 - last image in the buffer, -2: last indexed image in the buffer

+

Responses

Response samples

Content type
application/json
{
  • "msg": "Detector in wrong state",
  • "reason": "WrongDAQState"
}

Get preview image in JPEG format using custom settings

query Parameters
id
integer <int64> >= -2
Default: -1

Image ID in the image buffer. Special values: -1 - last image in the buffer, -2: last indexed image in the buffer

+
show_user_mask
boolean
Default: false

Show user mask

+
show_roi
boolean
Default: false

Show ROI areas on the image

+
show_spots
boolean
Default: true

Show spot finding results on the image

+
show_beam_center
boolean
Default: true

Show beam center on the image

+
saturation
number <float> [ -32767 .. 32767 ]

Saturation value to set contrast in the preview image; if not provided, then autocontrast procedure is used

+
jpeg_quality
integer <int64> [ 0 .. 100 ]
Default: 100

Quality of JPEG image (100 - highest; 0 - lowest)

+
show_res_ring
number <float> [ 0.1 .. 100 ]
Default: 0.1

Show resolution ring, provided in Angstrom

+
color
string
Default: "indigo"
Enum: "indigo" "viridis" "bw" "wb" "green" "heat" "magma" "inferno"

Color scale for preview image

+
show_res_est
boolean
Default: false

Show resolution estimation as a ring

+

Responses

Response samples

Content type
application/json
{
  • "msg": "Detector in wrong state",
  • "reason": "WrongDAQState"
}

Get preview image in TIFF format

query Parameters
id
integer <int64> >= -2
Default: -1

Image ID in the image buffer. Special values: -1 - last image in the buffer, -2: last indexed image in the buffer

+

Responses

Clear image buffer

Turns off image buffer for the last data collection. Can be only run when Jungfraujoch is not collecting data.

+

Responses

Response samples

Content type
application/json
{
  • "msg": "Detector in wrong state",
  • "reason": "WrongDAQState"
}

Get status of the image buffers

Can be run at any stage of Jungfraujoch operation, including during data collection. +The status of the image buffer is volatile during data collection - if data collection goes for more images than available buffer slots, +then image might be replaced in the buffer between calling /images and /image.cbor.

+

Responses

Response samples

Content type
application/json
{
  • "min_image_number": 0,
  • "max_image_number": 0,
  • "image_numbers": [
    ],
  • "total_slots": 0,
  • "available_slots": 0,
  • "in_preparation_slots": 0,
  • "in_sending_slots": 0,
  • "current_counter": 0
}

Get Jungfraujoch version of jfjoch_broker

Responses

+ + + + diff --git a/_images/jfjoch.png b/_images/jfjoch.png new file mode 100644 index 0000000000000000000000000000000000000000..aa75a7ea89115bc5e941bac654951a95eec602ba GIT binary patch literal 64403 zcmX6_2Rzm5|NoMNtR(wJWt=30kjf^j5{g1bLZytX>@76R?2zn`q>PYMLPa*2$tF_S z zMNQ{4LAdb~giioLtl)q7j1z>DC_zk`5`;_~L9p5-m7hC-zo0bNJf%!*ZvB&5nH7cq zv%^vSw91Z&ot#V*LdpsQN%&zxU0FfTwP)JX%0O?dW1)EQ@#XQG9Ij}=Ze#AuQQ z8+W)}sOYR@3{fVRt>+ftRVODHDQfJKG}2qLCCG{Ggd<@g7O#`@Ui2QXI)%c<_@VV# z<_2z0vdygR*Co{>H8LV=hvq8WO;~?UR=b|bu@+>LGq3U6F2tfK#Nz$J*E@wL<-}WV zKEatf`=r{Tr3%|Ntd!++*Q-~OGRY5yrC&ahTY0zn{bv-} z8X0*Bcbz@6O1I5Itch2d>u+;E9)gg5FfZM!x?ORQ!e8}j<5kfS%2IN-vjX z3u5!!K6R$aBApxyQ8rTOt*+;0167`Sg6DJe%1cYN;*a!QI{P~IEt&r#(x)FYSFQcrrk2ptegi5%Qa%6?!Ms8}=NkeHCbB62zD(IeFi9eb|D z#Xp9{*P^zc$`|=HN%(KK&~RZ`{Mf-lTl?U@sHY$o zsF>C|G1ina@Z8K_i(ly+vqJdOU z4c5GU`*vaGyWHm5ZI-a@r^)N=1!FiE8SN(94!XO$$7=I96doYVmH5*wEM4Tk6t~h^!N1iOpYkCcTp6pv0!&|CntKof9KN)Nl6(9 z*)3pWV?$yN)yZL|qVV_kX9`gkj%A>utHj3kzq#X3#?_%Ncg)x1Pzvqf04cZBC{5c= zI;o?hazZ(PeEEtOv&ln znmc0@+rNF=MMbf1-#&t18_%Pt6{QIzCrUk*Uo=p!eOvthU$WX*XU33xCaZPA>TA+} zyN{K>dUe70^v&M5BZjYUmK2xVymqVOTkDOf>2p%z*T!eX#g63PtGKcAIY;!fJ=FfS z{uLD!PX8RuvS|0t$bGYo)49U7FjO0ykia36ym63brDXmf^+xhYR>{}V(W80#a$aj} z1S2!EwEY^dvGHkn1v}cS;}e485@t7|qLc+oJ%cbc`A_`-;S!uq`#;Vuj?Xp=u1CN%&){LGQTTqnQ1xK-VSGEW(qRX%w3_Mi!!-CEKLm7M+wBl#Jqa-N-TalYGKm> zjicIsjiUSG*q_boH7c0FUzaJX#O2Yar^)3BvrcS0(s~6M zg=SaMdF*qn!{K{q{+YyHyc-2Wy`)1sYt^H;#>XTv#_;>Gu1c zLKZ6vYqf@Zds`bXGfi?*(r8mkp*HEUtS8MrhRt#F+`K%i&v9uP8QW`aqt;?S2{6ok zS8-~1XaA_CrslBWt0Y-Z4zJGd-`yJ@9rlnl5!(CY+<4}R;u^KXBNef~PHr>S68-$e zIG1;NT4>4N?_-dv$Z5KrnqeCoWFjID=R-q(j@XX9irYiq%I)8`c`FnkyaVL2z%bhYZ{IebvDb!R5MQAIhwcfjTue`im z>-1?kW-rnq5luC%eLkAC%dFxW?P=`LDP_VYP#_z28^hr%P z*4u%+T3PlVnOE2v@A%m>XCBT)|=t|x6%uKwH<@j9q zw$%l>JFA&(9T5$)w4JSFS_`c|c_sDxK7a1*?#{``;N#&*Eh)(;&J*9a&&=HMFM1}4 z`B`>$c2(8oQ>RX)X|Ek<4<_d%-?nWVPF=b-iE;1ZDY>j_9}h7f69I0iGEv$q#oYs5 zt20m4qsl8P#=az?Mh(xOKWhKu{nMvU*~KlfvM$cfA1{Zrx3xc(xVDyGtRJdHs}_*p zJ=*d>w=RRX^!DcEJ1X6M?u!S4PBH&vMHRiTs}s5S@@;@sc>MZ<59SyT+_D~}IXO8m zUN9x}4qRp;*CrT!2tVFkK9|e?D%qNdpo6wCuky{;6JCK>oLG&F##oVoQu_lBhIi0& zE&T`+5jHNDa9^0-!LWB}Wo6#=O>5TK!poKAB_;p*^H=jOhF-l&kNEd421^_1b(b!ExBMEP&&E`AG3n8-%eD+DIjxy8GBOK`i;D{jip`q? z6(ov{V6tdMf+MDUH@laAq-R5;IED)YEgsFt+wcbWAR164xez5a}; zub1DG(@5#R*50=Jpyn4hz4yfoBTu!Ccz(EE_&g&0V%tJN$EyzKKt+W#?NXy(O~$N# zx@tZVB;Qm$3jNeiokwE%KR>QZ)s{W_VIya2A9>}-{-&I`O6duwqkUn;-`?$=soSXIhy?P<$lk}vpfXj8!BdE>7s;i=PcKhgMcru6(>#-_&GlZ5?;g-Pui5W~bTG z%4&bv?Z(fwQ73IbUa2NNeweCnWKCzcee7A5HJMo0q(=Qpe){&GSL>ho_Ql)so<7Pk zYN_|&lCG!H)jRBj4=**vTh~qRjco)Y5wR_SNkyBfEA8(c=7wXmH{=fr4C&%x7U&x{!=k+?pLLIqSUQ&w;`jrhi7kID~pf6I1ui0%_h3L z%Q-FA{EW`KsSPhF$*7oci@E6xVGT#qPr>^XT4q+Y1XYOu-XlzWWP$W*H1br!e#gu{ zN3a(`nw&+52P@W}Fg*C)BR+-E{P9mqG;WCP_lwY~hNJQjcTB^|rX z!O6Lc;^Ir|Zy&-~xlg!iYirN7>znl9rSsMY?qrpekU*Jo%Q#ZiKHteItgNCkF*Q~9 z{=KrYvi0?AdyhNYe7qMA5Jh)-M)OgAPq9@~?CL_Yw7vPS-ZD=8f=gnaZaaAD_h>$* zS)!ynef^<{_Sd9`rbmwK6layGV6Ic=X?=3;8TETM1*3}+wn^q^NCu92Pu@=1jcf~u z%;D9f&LvXi_w68ED84cK{O%A73yVY98aHoq%1>RYzYITzWmy56HrDRw>FHg$k{%LL zUvi@pEx-|L`|R1X!m5?Y$@aYU_4PlaUpTqA?uCSOqge#k-dUPUD=&AmvzuF8oCUZv zi7-kmm`p?E6aKK!tS6st_`FHi5zqO1oa(CYJ$bdC9K@dwEyVU+8G2m08Uqml%&{$M z>^n&Y63un9EAx#a2jw!~rI@ExZ-LC&yMiMsi~+SnTfct(XFag1udgrqAezPf`}Z-< zWxdvxGBjha-?*V)U=%XEgc0!ZKBtwL**Rn5u>vW^xS6qE3spO%%K4R0oY9` zDJd5xr#o)0vhE8uYfHaHOsZ&UXhI)8eEss}%i@y!nOmLBozph?63u#1JNYQh_EDos z9UJ!YrM6l;V#^5Ny)ZmKL@}ZM>El6_Q}#a&6Z>_}@MTLRscxt6W0DS4qtX&q%3+>N zKJGIA=a1ZJ&5e6#Gby1Os}qhgemqkh`H6DgRcgGU4<6vv7gbiS1FnrYEdT1O7#<$J zas7JL+Po&Siucmc4rAj!v)Ul_jFzshu93!AunzadUu9*eg?K(bzV7eeIXO7`%bjj4 zOn09@f8Iz~-`KeF#fz4&UonnvZLBRTDJgLX(XrgGv1mRQAR&IFGhH-zrTh}#izr@p ze*R?U&}%xsRmx5%9cyD?W}_G7Iz`2&zMsaY(N|G@P%KH_E=iFTEw91zR54B3X)>CI z^>01(T0Y*)=2=%=v`f19TRgN@c-h)?&yQM_%4Urx3f+sUO0cAFRGr4iz_lJDm^_NINr$T;N;{K(2CPGG6Kdr$V9u3nUXsEan-GR3VZ0Ob`jPZ?COJxOgkt-$bG_zeFQzR zA$L@ei6AHZD0q2%nZT%hC`uJWc+?aX70t}{Mb)qUq}V9fdJB7E7K*#4!CpRn`V<|_ zEFA0pZ?b*2z!_~)v~h(q4%wG@@v*)N7mTFuuWjo@Q8v@~&%6uyAkG1QdVENXabqIx#i5>QH(QYo=FC$I>Z!$pU~0O4W{FKl$`v#Ld#>5(X>uYuCMJR)sZ*@k_U#TQ*4{;Nshq=+1?O#7`z;_aw|k2+AK<z~VS?82souB3B=g-W_ zDmHj_ma42e<}4*Km~)rs?!0%GdjhsmQ&aP_me$^rZd;=hn!~?Nlhx(r!BnCV34KG}{aO>7B!Uv-n z&=E&V;Ot`qJT6_bym~b!FVFDOrOb?sW5DfhFvNgM)+H=0+t(pJEzg*ay7H{QUgB zzCKk|)!HDs3j5)Yz$?zbdY2(-03bZzl=?a_z@xgTPTOnv33EKi*}0>{pOFl$cjfeT)9K$WqH2{#d*l9G~`2qi_K%t$z@z5uxQ=66X7g#g8&;kt*fZMw;c zyJ2CR#~gThPYwNc#Vf_R!VABC{rcGyStn;_es!_Khp{V7#J8bbif|A6X9yS zP~>>1LX=xNJFTp($0sK_n3*Xm9QN+ryVd6Tq{;b#!t{mh<-d_C)2xUWU5gAk1i1v%O`yY1+-!FKw&W zo!9~tc7QZuZ;m0F*=uqdgi~hq) z*dmt0mw2PavA{ozuGfc`bw|J76Z>FMh?T8ITIp3~F&`RmuMn>SC| zbcxajxAygg8E1y(?fuFusnXk@&|%?;(DVw=qV#ab(xrtONg!S+myk5iz-$fSs%OC4D8Oxd5y%OYBD%UsWy}uE9J!jLu5!8=Fj1#;j=6CJELiQe?uKIf_3PJ( zy&}@malG}A$)cm9ji9k&mZQ-B6={1K8yQ)MT?DW(-+JsP-ZnG{3JKY?WuLmB2-Vy+mt(2V}%VO!;`3pajv6^7tZlkdY1GykCXYA znYFUq*46boJFsC~!6I~d`sYtxmavOL9cfCzP&SQ>jG{HJYHBv3|8Aj;3>~b6hsWCd zNF&x_{%1%;M8y63Uz(e>F;y~8ClUm>A`Jt>4&sgHYDaCYKX3idpBBc(#yfTd2Lw={ zKRx30l?G?^BqOzQ$Hye#=Hur5?qAoA4s`6Us?LKz#m=?$I`_}^nm&%ehPpH3i zyW06XJ?z#=QHi7fF;Z8{dRTn*D!D<7Ghyl!bJDJmKcNO`4>o_LGa45;$|C zn$7F2BMXc3rAwE9y(x%N@6D>LEP>=RXrM1J$cu`K^aLSN<`fiUYLnQ4oLpSM_0boo z%%w2D**G}LU1l$TI{kD-K0~JrY&b+&kud;c6+eivqaNAb-VPdw-+uM#RSAxK0FGzR zwEi`V(sD}LbV2Lhzkh#FP|(JzcE+YY?V!N3WY|K8J+ zz;ib+UESUOHFkD(t{ZD*;N-fxc?AV% zSsl&IT~(eH+9X;kDz;+|7WVe`XU{&I+-A>}B4xYxv)Q0!5sn+P%0;0IYFm%Hj~-pP zaU)MpaAta%IYjxxhYxrX+x|D#Zr=3#{o_NPeqn)8nV4<=iSZp9iAit06BRb|Jx;W! zWaz-rz+A3-@SmZHiLIsOqralm*EcaMQhK$x_PBeJB$SJJrL5|wBgo8r6@0ht_vP^K zYin~|{hEJ2QL-V1hU5ODn3xY^f3mdV$tPSeB9DM-2*z9j=>7KXi1~Xe;%#j(gQtf_ zsZoJ}5YYNwNgFmIH8qt7hm5x#(BXOaba;69ix)3&;;Z@A^_D3N2EhHleEDMd%I28& z#u~~Jt1rz(AE=1q0G%6W0Pk&A*oP?o(=VPs&n_(7YC%|qqM{=~X6Q{QYD{1>@|)Jy zJnAo=JW&Kmsxgg=i)-uXz!@DK8L1Jq9eNi?OF0Z|hVKK8iWM;dY7~1gtQjlpx$^g5 z;+GAPTITgwcb}AilQ?PWaDQqm!IPbEU~pGU9+XLx(W)6 zPD<(j8vbG_x)S)rw(5B0pW^?tWRyaNJ!Ch*dLT%Ac9EPX@tD~mIm$&}7%dgJ~ zM|To$$Nn5TbjW3ezr2G53yMP!mnb6VRiP~T~f=L4QGlzXZ zuhkQb;kgS=fcm#9Gm7M;qowum^hDc&@&c^JvS-g8ZtiOH51~Ncg@&(%Wo7%@+ha5` z9Ljoiv(Ef>eS^hBuNwRLQ$F&^CPzp9rX@pai&tsfZ)`Uf-@iu=${@&){EYY7lKs`I z?Xm8Q5n8#51t;8&6*#RJ(KJ;}eBvMKGo+!JsffzTR6YHJog-vKELw5-SH-Ml)8qWK zG~ZNfE2}Zg`LWOO+X&a+KLXK3lav4R<6)fJwkQR-d7tfwA8&n95*P5dU`$V6Uvf;$ z(VIOIk-TWoH6n-djFuKJl_C!#6@?#`mQ(5$TEeZCr|RhE&%Z*L&)>e2CF!L5 ztL$uR2*fxcK!PVvo;;v>&$PJv@ZrM{-UDC#9Y|XrtnMOY=~qx{K$;jzJQb!edGNI; zZB*lke&J;tz`o~ZCu0<^>W+^Ue2_`((i*5pboqJ6vmk!0t7t0aro^9@^fWt}cKfJU z@%FyCddqTjW+q>ol+E1mZ%PW99XoB1JdZ1s`g`o+73SIn{jh99)6@;4>1xh%+Eiqp&^4}#VKE3TN4u# zLkU+`dt+Pl^;rp1JG*d=3{_=if&fK&swe3EIDN5@Z!>vc^QQBiT>E#9yxl@7Hqm-KqB!ntUC4Q=?k2kJhdNJV@JaZJPy6h z-ez;__?aUk@y{M|rB4mjx3x}8&F*xxKejQF_M*He=uyz8Bk2j3rlh$_{=R0nq5IeC zM_#4{b|-269s}jksfT;P<{%(lgHq$U>O9gALkdN=rw&x4>Y^Z0sZ`0CRmgbA6qqQM zR5Uu;+s|ujr)FhINl0K7F#slJXH%l0qLP!ha59*$w2TZEqf246;^EGZf1%=`^jTt-$klz>>)IWALv5K)6)pv5a90q?f zmXWu2wHE&r;N!1f9c^uG?d|^^cNPk+jcEKi^WV(Hix+ir+CFu;{&*Ho&(aY`pZ=pE zrXx(M?W%`Tj$O3P-EX`%cd$KaYIFEcz}cb9Fm8Z<_p)+;2fMwGf{Khx56z#jc!|-@ zQxDu=)+b5ZM`Vp*jKZgeW!~G@hsleYx^m^p`Sb1nraDt(Jy(8z*iBL(^EpG#lq$x& z7Ww=xuR2X&%l{ZIpJd`m=V=2<|KIQtp;XF~A^GgbtgHm4EjDL@v)^Qdgs8i? zNQHg)VJ9tkFIgu?LR@@mc2-JM)EYg<#zsO^RJ;45Ngw4#-uO4Uy%UqaeqmzGqg<^e z5@1ugxR?}~ZRggdeKVcqaKQZ!sNh$tX427*PeU%NOsw7@B*ql@Wmdo;Gk`QKl$ zzit27%+$W=t*^@LS!I}<<(pV=v8JZlU;OG7@b1FjzZ67oXc!_9%0s0rgoKYe8JQ?K zBf&@t4Sz4Pv&2lkkVbQG&EDFY6x)aa)%V&qrK(Cc?8BBAWN65FUsadHoXfM9B~?gB z2=uMDr-!EIju1;;MMa`&dd+1{n-jp5^WDW(TL{5NPyCz_x#WZb`3Aot*ysmC5 z6gL_gnn6t&$MI(LL{ZuUR8O+9b}Vf2F;PFPyY1|JA*}}PBl;7jE=X>ENl9K-#r@>} zqBLx;U;E;2(%jY}C=lJjk{NON*XM=)U(s#3(eAwq7e-Unv@%{fu<6;l6lOHizB~1r zUgL7Lm$B}}g1oc|WC5n8!cwh=R{dI9Uc|L#eLpTE`E0<{)@o7m&{RW7p7G2~ZiT7# zxFvJj{RT7szyL(^1EHMcmDb|p((V_JJHdfta+ zNngT$lXBY<+feO@!w`kr?c3sn{Har8aD1s47(|4GKw+M0lb%~L)S46Wcw(G4b@dSC z{of#@I6D6Q``4nlTP*O&i)TXBJk=Q)D#>5$ot@_w{&cpr=%|g%Ha5!YUHI$l%x-EB zkSBiXg#1sdL#?eUS7T@>KAm>G!~2fzK3CcG& zNraQ+shPuhe-|GU`$^u?+Irl3!vhUCIQW#7*5|k*S5mKktgBOUIL@rHuYCg24;FF4 zu{3djMD0l2QrK$>w3poK^*n_<%d%k}C+R#9= z-)x`dFOlHA>mo;p_HMMa-Fx^&FlvHGCHsF3mB;*Fd`H>Zos13pG&Qr@T2-?r2fAGRy<-u#~q zwrS4k@wep_PIi8NyJ+OEMGcjR)gOwGzI!I6FeGF|TGfpH$N0kDZ@0a;=?*ZGA5c%F z;PoY!{~>2`z_038bD9!fqFDUr?(Sm;4*2s>0nf-JpGnh(<4{~&+}hfT@q`+iVT3Y*@A!v7Z#kIoc=*EJ$}3*H#ZmG0Z}~1i}hh0C$b>W9`?08yaC~2+-V2BNS@!RI-=kYq(9n0_M=ZA%13?E*r1O=NF6VJ=L zJ}wj#mUqL>?zv3tp>3(-r$;Mp4;VHsJy1N>W1v(MQ!073<|)0CvnX=_M~oPW<7sO= z)z@6rPbV^#YEw(~g!9jnVkovl?s$LcaAlJO*jTvoIH6EA!Sa4ig_m0Uo}VCD2+1yh zkW1u7-^$R52Ri8J;Af=bWeUm27=a-J%$IuIL7EE-^x}mWURc-u=8g_YDXB4sGAXb! z=V>^U2}_&>TcgwI;Xckf|-S7bZl&Apdy+y@Cqv{t27lQ zVSVcs$^wlkO(%PSexXKTUysZs!l!4n+@(;A;|6Eh%A27B!4=)zp{pyuru!S8eP+1Q z65bTIs~ecc1s8?}SHO=3^Y9pi$e-L-wDFJw*+X#!Hf>{&-D{VVv{&lX3=Fua?!bbBVun

7y94>5o#N2I}JDAQO*@D=%ZXYC7e48+?09Ny%TH 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 %ds*FYKo={H?g?v+C~H@sV#j@IfUSNNm9j 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 Image) | Pixel mask - multiple in case of storage cells | X | +| channels | Array(string) | List of image channels | X | +| max_spot_count | uint64 | Maximum number of spots identified in spot finding | | +| storage_cell_number | uint64 (optional) | Number of storage cells used by JUNGFRAU | | +| storage_cell_delay | Rational | Delay of storage cells in JUNGFRAU | | +| threshold_energy | float | Threshold energy for EIGER detector \[eV\] | | +| image_dtype | string | Pixel bit type (e.g. uint16) | X | +| unit_cell | object (optional) | Unit cell of the system: a, b, c \[angstrom\] and alpha, beta, gamma \[degree\] | | +| az_int_q_bin_count | uint64 | Number of azimuthal integration bins in the radial direction | | +| az_int_phi_bin_count | uint64 | Number of azimuthal integration bins in the phi angle direction | | +| az_int_bin_to_q | Array(float) | Q value for each azimuthal integration bin \[angstrom^-1\] | | +| az_int_bin_to_two_theta | Array(float) | Two theta angle value for each azimuthal integration bin \[deg\] | | +| az_int_bin_to_phi | Array(float) | Phi value for each azimuthal integration bin \[deg\] | | +| summation | uint64 | Factor of frame summation | | +| user_data | string | JSON serialized to string that can contain the following fields (all fields are optional): | X | +| - file_prefix | string | File prefix | | +| - images_per_file | uint64 | Number of images written per file | | +| - images_per_trigger | uint64 | Number of images collected per trigger | | +| - source_name | string | Facility name | | +| - source_type | string | Type of X-ray source (use NXsource/type values, for example "Synchrotron X-ray Source" or "Free-Electron Laser") | | +| - instrument_name | string | Instrument name | | +| - sample_name | string | Name of the sample | | +| - user | any valid JSON | Value of header_appendix provided at collection start to Jungfraujoch | | +| - attenuator_transmission | float | Attenuator transmission \[\] | | +| - total_flux | float | Total flux \[ph/s\] | | +| - space_group_number | uint64 | Space group number | | +| - summation_mode | string | Summation mode (internal\|fpga\|cpu) | | +| - overwrite | bool | Overwrite existing HDF5 files | | +| - file_format | int | File writer format: 0 = no master file, 1 = soft links, 2 = virtual dataset, 3 = CBF, 4 = TIFF | | +| - roi | Array(object) | ROI configurations; each element is one of: | | +| | | type "box": xmin, xmax, ymin, ymax (numbers) | | +| | | type "circle": r, x, y (numbers) | | +| | | type "azim": qmin, qmax (numbers) | | +| - gain_file_names | Array(string) | Names of JUNGFRAU gain files used for the current detector | | +| - write_master_file | bool | With multiple sockets, it selects which socket will provide master file | | +| - data_reduction_factor_serialmx | uint64 | Data reduction factor for serial MX | | +| - experiment_group | string | ID of instrument user, e.g., p-group (SLS/SwissFEL) or proposal number | | +| - jfjoch_release | string | Jungfraujoch release number | | +| - socket_number | uint64 | Number of ZeroMQ socket (on `jfjoch_broker` side) used for transmission | | +| - bit_depth_readout | uint64 | Bit depth of the detector readout | | +| - writer_notification_zmq_addr | string | ZeroMQ address to inform `jfjoch_broker` about writers that finished operation | | +| - xfel_pulse_id | uint64 | Pulse IDs are recorded for images | | +| - ring_current_mA | float | Ring current at the start of the measurement | | +| - sample_temperature_K | float | Sample temperature \[K\] | | +| - detect_ice_rings | bool | Ice ring detection feature is enabled | | +| - indexing_algorithm | string | Indexing algorithm used on-the-fly; allowed values: ffbidx, fft, fftw, none | | +| - geom_refinement_algorithm | string | Post-indexing detector geometry refinement algorithm; allowed values: none, beam_center, beam_center_tetragonal | | +| - poni_rot1 | float | Tilt of the detector rot1 according to PyFAI PONI convention \[rad\] | | +| - poni_rot2 | float | Tilt of the detector rot2 according to PyFAI PONI convention \[rad\] | | +| - poni_rot3 | float | Tilt of the detector rot3 according to PyFAI PONI convention \[rad\] | | + +See [DECTRIS documentation](https://github.com/dectris/documentation/tree/main/stream_v2) for definition of Image as MultiDimArray with optional compression. + +## Image message + +| Field name | Type | Description | Present in DECTRIS format | Optional | +|-----------------------------|----------------------|-----------------------------------------------------------------------------------------------------------------------------------|:-------------------------:|:--------:| +| type | String | value "image" | X | | +| magic_number | uint64 | Number used to describe version of the Jungfraujoch data interface - to allow to detect inconsistency between sender and receiver | | | +| series_unique_id | string | Unique text ID of the series (run_name parameter) | X | | +| series_id | uint64 | Unique numeric ID of the series (run_number parameter) | X | | +| image_id | uint64 | Number of image within the series; for MX lossy compression this is sequential excluding removed frames | X | | +| original_image_id | uint64 | Number of image within the series; for MX lossy compression this includes removed frames in the count | | | +| real_time | Rational | Exposure time | X | | +| start_time | Rational | Exposure start time (highly approximate) | X | | +| end_time | Rational | Exposure end time (highly approximate) | X | | +| spots | Array(object) | Spots: | | | +| - x | float | observed position in x (pixels) | | | +| - y | float | observed position in y (pixels) | | | +| - I | float | intensity (photons) | | | +| - maxc | int64 | max count (photons) | | | +| - ice_ring | bool | spot in resolution range for ice rings | | | +| - indexed | bool | indexed solution | | | +| reflections | Array(object) | Reflections: | | | +| - h | int64 | Miller index | | | +| - k | int64 | Miller index | | | +| - l | int64 | Miller index | | | +| - x | float | position in x (pixels) | | | +| - y | float | position in y (pixels) | | | +| - d | float | resolution \[Angstrom\] | | | +| - I | float | integrated intensity (photons) | | | +| - bkg | float | mean background value (photons) | | | +| - sigma | float | standard deviation, estimated from counting statistics (photons) | | | +| - image | float | image number (present for each spot) | | | +| - dist_ewald | float | distance to Ewald sphere (present only for indexed spots) | | | +| - rlp | float | Reciprocal Lorentz and polarization corrections | | | +| - partiality | float | Partiality of the reflection | | | +| spot_count | uint64 | Spot count | | | +| spot_count_ice_rings | uint64 | Number of spots within identified rings (experimental) | | | +| spot_count_low_res | uint64 | Number of spots in low resolution (prior to filtering) | | | +| spot_count_indexed | uint64 | Number of spots which fit indexing solution within a given tolerance | | | +| az_int_profile | Array(float) | Azimuthal integration results, use az_int_bin_to_q from start message for legend | | | +| | | NaN is used for empty bins and has to be taken care by the receiver | | | +| indexing_result | bool | Indexing successful | | | +| indexing_lattice | Array(9 * float) | Indexing result real lattice; present only if indexed | | X | +| indexing_unit_cell | object | Indexing result unit cell: a, b, c \[angstrom\] and alpha, beta, gamma \[degree\]; present only if indexed | | X | +| | | Unit cell is redundant to lattice - yet to simplify downstream programs to analyze results, both are provided | | | +| profile_radius | float | Profile radius of the image - describes distance of observed reflections from the Ewald sphere \[Angstrom^-1\] | | | +| integrated_reflections | int64 | Count of integrated reflections | | | +| mosaicity | float | Angular range of spots in image from a rotation scan \[degree\] | | | +| b_factor | float | Estimated B-factor (Angstrom^2) | | | +| compression_time | float | Time spent on compression/decompressing image \[s\] | | | +| preprocessing_time | float | Time spent on preparing the image for analysis \[s\] | | | +| azint_time | float | Time spent on azimuthal integration \[s\] | | | +| spot_finding_time | float | Time spent on spot finding \[s\] | | | +| indexing_time | float | Time spent on indexing \[s\] | | | +| refinement_time | float | Time spent on refinement of indexing solution and experimental geometry \[s\] | | | +| index_analysis_time | float | Time spent on analyzing idnexing solution, calculating profile radius and mosaicity \[s\] | | | +| bragg_prediction_time | float | Time spent on predicting Bragg spots \[s\] | | | +| integration_time | float | Time spent on Bragg integration \[s\] | | | +| processing_time | float | Total processing time \[s\] | | | +| xfel_pulse_id | uint64 | Bunch ID (for pulsed source, e.g., SwissFEL) | | X | +| xfel_event_code | uint64 | Event code (for pulsed source, e.g., SwissFEL) | | X | +| lattice_type | object | Bravais lattice classification of the indexing result (present only if available) | | X | +| - centering | string | One-letter centering code: P, A, B, C, I, F, or R | | | +| - niggli_class | int64 | Integer identifier for the Niggli-reduced Bravais class | | | +| - system | string | Crystal system: triclinic, monoclinic, orthorhombic, tetragonal, trigonal, hexagonal, cubic | | | +| jf_info | uint64 | Detector info field | | | +| receiver_aq_dev_delay | uint64 | Receiver internal delay | | | +| receiver_free_send_buf | uint64 | Receiver internal number of available buffer locations | | | +| receiver_buf_in_sending | uint64 | Receiver internal number of buffer locations currently in sending/writing | | | +| receiver_buf_in_preparation | uint64 | Receiver internal number of buffer locations currently in processing | | | +| storage_cell | uint64 | Storage cell number | | | +| saturated_pixel_count | uint64 | Saturated pixel count | | | +| pixel_sum | uint64 | Sum of all pixels, excl. error and saturation | | | +| error_pixel_count | uint64 | Error pixel count | | | +| strong_pixel_count | uint64 | Strong pixel count (first stage of spot finding) | | | +| min_viable_pixel_value | int64 | Minimal pixel value, excl. error and saturation | | | +| max_viable_pixel_value | int64 | Maximal pixel value, excl. error and saturation | | | +| resolution_estimate | float | Diffraction resolution estimation \[Angstrom\] | | X | +| data_collection_efficiency | float | Image collection efficiency \[\] | | | +| packets_expected | uint64 | Number of packets expected per image (in units of 2 kB) | | | +| packets_received | uint64 | Number of packets received per image (in units of 2 kB) | | | +| bkg_estimate | float | Mean value for pixels in resolution range from 3.0 to 5.0 A \[photons\] | | | +| beam_center_x | float | Beam center X from post-indexing refinement \[pixel\] | | X | +| beam_center_y | float | Beam center Y from post-indexing refinement \[pixel\] | | X | +| beam_corr_x | float | Beam center correction X applied during processing \[pixel\] | | X | +| beam_corr_y | float | Beam center correction Y applied during processing \[pixel\] | | X | +| adu_histogram | Array(uint64) | ADU histogram | | | +| roi_integrals | object | Results of ROI calculation | | X | +| - sum | int64 | Sum of pixels in ROI area \[photons\] | | | +| - sum_square | int64 | Sum of squares of pixels in ROI area \[photons\] | | | +| - pixels | uint64 | Valid pixels in ROI area | | | +| - max_count | int64 | Highest count in ROI area \[photons\] | | | +| - x_weighted_sum | int64 | ROI pixel X position multiplied by photon count \[photons * pixels\] | | | +| - y_weighted_sum | int64 | ROI pixel Y position multiplied by photon count \[photons * pixels\] | | | +| user_data | string | Optional user defined text information - this is image_appendix serialized to JSON format | X | | +| data | Map(string -> Image) | Image | X | | + +## Metadata message + +| Field name | Type | Description | Present in DECTRIS format | Optional | +|------------------------------|------------------|-----------------------------------------------------------------------------------------------------------------------------------|:-------------------------:|:--------:| +| type | String | value "metadata" | X | | +| magic_number | uint64 | Number used to describe version of the Jungfraujoch data interface - to allow to detect inconsistency between sender and receiver | | | +| series_unique_id | string | Unique text ID of the series (run_name parameter) | X | | +| series_id | uint64 | Unique numeric ID of the series (run_number parameter) | X | | +| images | Array(object) | Array of images (order and size of the array are not guaranteed) | X | | +| - image_id | uint64 | Number of image within the series; for MX lossy compression this is sequential excluding removed frames | X | | +| - original_image_id | uint64 | Number of image within the series; for MX lossy compression this includes removed frames in the count | | | +| - real_time | Rational | Exposure time | X | | +| - start_time | Rational | Exposure start time (highly approximate) | X | | +| - end_time | Rational | Exposure end time (highly approximate) | X | | +| - spot_count | uint64 | Spot count | | | +| - spot_count_ice_rings | uint64 | Number of spots within identified rings (experimental) | | | +| - az_int_profile | Array(float) | Azimuthal integration results, use az_int_bin_to_q from start message for legend | | | +| - indexing_result | bool | Indexing successful | | | +| - indexing_lattice | Array(9 * float) | Indexing result real lattice; present only if indexed | | X | +| - indexing_unit_cell | object | Indexing result unit cell: a, b, c \[angstrom\] and alpha, beta, gamma \[degree\]; present only if indexed | | X | +| | | Unit cell is redundant to lattice - yet to simplify downstream programs to analyze results, both are provided | | | +| - xfel_pulse_id | uint64 | Bunch ID (for pulsed source, e.g., SwissFEL) | | X | +| - xfel_event_code | uint64 | Event code (for pulsed source, e.g., SwissFEL) | | X | +| - jf_info | uint64 | Detector info field | | | +| - receiver_aq_dev_delay | uint64 | Receiver internal delay | | | +| - receiver_free_send_buf | uint64 | Receiver internal number of available send buffers | | | +| - storage_cell | uint64 | Storage cell number | | | +| - saturated_pixel_count | uint64 | Saturated pixel count | | | +| - error_pixel_count | uint64 | Error pixel count | | | +| - strong_pixel_count | uint64 | Strong pixel count (first stage of spot finding) | | | +| - data_collection_efficiency | float | Image collection efficiency \[\] | | | +| - bkg_estimate | float | Mean value for pixels in resolution range from 3.0 to 5.0 A \[photons\] (with solid angle/polarization corrections, if applied) | | X | +| - resolution_estimate | float | Diffraction resolution estimation | | X | +| - adu_histogram | Array(uint64) | ADU histogram | | X | +| - roi_integrals | object | Results of ROI calculation | | X | +| - - sum | int64 | Sum of pixels in ROI area \[photons\] | | | +| - - sum_square | int64 | Sum of squares of pixels in ROI area \[photons\] | | | +| - - pixels | uint64 | Valid pixels in ROI area | | | +| - - max_count | int64 | Highest count in ROI area \[photons\] | | | + +## End message + +| Field name | Type | Description | Present in DECTRIS format | +|----------------------------|--------------------------|-----------------------------------------------------------------------------------------------------------------------------------|:-------------------------:| +| type | String | value "end" | X | +| magic_number | uint64 | Number used to describe version of the Jungfraujoch data interface - to allow to detect inconsistency between sender and receiver | | +| series_unique_id | string | Unique text ID of the series (run_name parameter) | X | +| series_id | uint64 | Unique numeric ID of the series (run_number parameter) | X | +| end_date | date | Approximate end date | | +| max_image_number | uint64 | Number of image with the highest number (this is counted from 1 - to distinguish zero images and one image) | | +| images_collected | uint64 | Number of image collected | | +| images_sent_to_write | uint64 | Number of image sent to writer; if writer queues were full, it is possible this is less than images collected | | +| data_collection_efficiency | float | Network packets collected / Network packets expected \[\] | | +| az_int_result | Map(text->Array(float)) | Azimuthal integration results, use az_int_bin_to_q from start message for legend | | +| adu_histogram | Map(text->Array(uint64)) | ADU values histogram | | +| adu_histogram_bin_width | uint64 | Width of bins in the above histogram \[ADU\] | | +| max_receiver_delay | uint64 | Internal performance of Jungfraujoch | | +| bkg_estimate | float | Mean background estimate for the whole run | | +| indexing_rate | float | Mean indexing rate for the whole run | | +| rotation_lattice_type | object | Bravais lattice classification of the total rotation solution over the run (if available); same schema as `lattice_type` | | +| - centering | string | One-letter centering code: P, A, B, C, I, F, or R | | +| - niggli_class | int64 | Integer identifier for the Niggli-reduced Bravais class | | +| - system | string | Crystal system: triclinic, monoclinic, orthorhombic, tetragonal, trigonal, hexagonal, cubic | | +| rotation_lattice | Array(9 * float) | Real-space lattice basis (flattened 3x3 in row-major), corresponding to the rotation indexing result | | + +## Calibration message + +| Field name | Type | Description | Present in DECTRIS format | +|--------------|----------------------|-----------------------------------------------------------------------------------------------------------------------------------|:-------------------------:| +| type | String | value "calibration" | | +| magic_number | uint64 | Number used to describe version of the Jungfraujoch data interface - to allow to detect inconsistency between sender and receiver | | +| data | Map(string -> Image) | Calibration map (only single pedestal array per message) | | + +## User data +In many cases there is an interest from facilities to forward more metadata, than available explicitly in the Jungfraujoch. +For this reason two fields can be provided: `header_appendix` (sent with start message) and `image_appendix` (send with image message). +To increase flexibility, both appendices can contain any valid JSON message. +These appendices are serialized into string and stored in CBOR messages as `user_data`. + +Notably for start message, `user_data` can contain more information (non-DECTRIS compliant metadata). +Therefore `user_data` is serialized by Jungfraujoch as CBOR object. There is member `user` which contains `header_appendix` defined in OpenAPI of Jungfraujoch. + +### Notes on images and compression + +- Images are encoded as DECTRIS MultiDimArray with typed array tags: + - For RGB: shape \[3, height, width\], type: u8 + - For grayscale: shape \[height, width\], type according to bit depth and sign (e.g., uint16 LE) +- Compression: + - Uncompressed: raw CBOR byte string + - Bitshuffle+LZ4: tag with \["bslz4", elem_size, bytes\] + - Bitshuffle+Zstandard: tag with \["bszstd", elem_size, bytes\] \ No newline at end of file diff --git a/_sources/CHANGELOG.md.txt b/_sources/CHANGELOG.md.txt new file mode 100644 index 00000000..fa160ed9 --- /dev/null +++ b/_sources/CHANGELOG.md.txt @@ -0,0 +1,950 @@ +# Changelog +## 1.0.0 +### 1.0.0-rc.144 +This is an UNSTABLE release. The release has significant modifications and bug fixes, if things go wrong, it is better to revert to 1.0.0-rc.132. + +* jfjoch_broker: Improve performance of preview JPEG image generator at receiver startup (saving about 150 ms on measurement start for 16M) + +### 1.0.0-rc.143 +This is an UNSTABLE release. The release has significant modifications and bug fixes, if things go wrong, it is better to revert to 1.0.0-rc.132. + +* jfjoch_broker: Avoid copying gain calibration together with DiffractionExperiment + +### 1.0.0-rc.142 +This is an UNSTABLE release. The release has significant modifications and bug fixes, if things go wrong, it is better to revert to 1.0.0-rc.132. + +* Support for newer CUDA architectures (notably Blackwell); minimum CUDA version 12.8 +* Minor changes to jfjoch_process, jfjoch_fpga_test and jfjoch_lite_perf_test to make them more consistent + +### 1.0.0-rc.141 +This is an UNSTABLE release. The release has significant modifications and bug fixes, if things go wrong, it is better to revert to 1.0.0-rc.132. + +* jfjoch_broker: Azimuthal integration mapping is generated with parallel computations, significantly reducing setup times +* frontend: Fix selection of FFTW in indexing settings + +### 1.0.0-rc.140 +This is an UNSTABLE release. The release has significant modifications and bug fixes, if things go wrong, it is better to revert to 1.0.0-rc.132. + +* jfjoch_broker: For DECTRIS detectors, ZeroMQ link is persistent, to save time for establishing new connection +* jfjoch_broker: Minor bug fixes for rare conditions +* jfjoch_process: Significantly improve performance + +### 1.0.0-rc.139 +This is an UNSTABLE release. The release has significant modifications and bug fixes, if things go wrong, it is better to revert to 1.0.0-rc.132. + +* jfjoch_broker: Further reduce startup time for DECTRIS detectors by selectively modifying SIMPLON parameters on `/start` +* jfjoch_broker: Further reduce startup time for DECTRIS detectors by not setting beam center and detector distance via SIMPLON API on '/start' +* jfjoch_broker: Add an extra message to ZeroMQ puller ready to monitor Lite worklow preparation time +* jfjoch_broker: Image buffer configuration is postponed for Lite receiver flow till start message is received +* jfjoch_broker: Use nanoseconds internally for frame/image/readout time +* jfjoch_broker: Extra messages added for receiver operation (to be removed after debugging finished) +* jfojch_broker: Improve profiling of different data analysis steps +* jfjoch_broker: Record integration reflection count +* jfjoch_broker: Fix bug where ZeroMQ preview frequency was confusing time units (micro vs. milliseconds) +* jfjoch_broker: Fix bug where '/wait_till_done' got deadlocked +* jfjoch_writer: Fix confusion between NaN and zero in floating-point datasets + +**Breaking changes**: detector definition is now using nanoseconds to define minimum frame time, minimum count time and readout time. + +### 1.0.0-rc.138 +This is an UNSTABLE release. The release has significant modifications and bug fixes, if things go wrong, it is better to revert to 1.0.0-rc.132. + +* jfjoch_broker: Cleanup DECTRIS start-up code to enable a shorter start time +* jfjoch_broker: Allow for asynchronous start to allow overlapping detector configuration with other beamline preparations +* jfjoch_broker: Goniometer axis name is converted to lowercase +* jfjoch_broker: Fix bug, where wrong HTTP error codes were returned +* jfjoch_process: Improve sigma estimation during merging (K. Takaba) +* jfjoch_process: Modify spot finding thresholds +### 1.0.0-rc.137 +This is an UNSTABLE release. The release has significant modifications and bug fixes, if things go wrong, it is better to revert to 1.0.0-rc.132. + +* jfjoch_broker: Better track time for each operation in the processing stack +* jfjoch_broker: Rewrite preprocessing of diffraction images in the non-FPGA workflow to better use GPUs (work in progress) +* jfjoch_broker: Remove ROI calculation in the non-FPGA workflow (work in progress) +* jfjoch_viewer: Toolbar displays image number starting from 1 (instead of 0) + +### 1.0.0-rc.136 +This is an UNSTABLE release. The release has significant modifications and bug fixes, if things go wrong, it is better to revert to 1.0.0-rc.132. + +* jfjoch_broker: Improve logic regarding indexing architecture and thread pools (work in progress). + +### 1.0.0-rc.135 +This is an UNSTABLE release. The release has significant modifications and bug fixes, if things go wrong, it is better to revert to 1.0.0-rc.132. + +* Multiple small bug fixes scattered across the whole code base. (detected with GPT-5.4) +* jfjoch_viewer: Improve image render performance + +### 1.0.0-rc.134 +This is an UNSTABLE release. The release has significant modifications and bug fixes, if things go wrong, it is better to revert to 1.0.0-rc.132. + +* jfjoch_broker: Add better locking for detector object - should help, when detector initialization takes too long +* jfjoch_writer: Enable writing single, integrated HDF5 file with both data and metadata +* XDS plugin: Add generation of Jungfraujoch plugin for XDS +* CI: Add tests with XDS and DIALS (`xia2.ssx`) + +### 1.0.0-rc.133 +This is an UNSTABLE release. The release has significant modifications and bug fixes, if things go wrong, it is better to revert to 1.0.0-rc.132. + +* jfjoch_broker: Use httplib for HTTP server instead of Pistache +* jfjoch_broker: Drop OpenSSL support +* jfjoch_broker: Base work for multi-lattice support in the future +* jfjoch_broker: Improve recording time of data analysis steps +* jfjoch_writer: Save per-image information about data analysis timing +* Update dependencies to more recent versions (spdlog, HDF5, Catch2, httplib) + +### 1.0.0-rc.132 +This is an UNSTABLE release. The release has significant modifications and bug fixes, if things go wrong, it is better to revert to 1.0.0-rc.124. + +* Documentation: Fix equation rendering + +### 1.0.0-rc.131 +This is an UNSTABLE release. The release has significant modifications and bug fixes, if things go wrong, it is better to revert to 1.0.0-rc.124. + +* jfjoch_broker: Fix bug in saving JUNGFRAU calibration (pedestal/pedestalRMS) +* jfjoch_viewer: Fix calibration (pedestal) images being open flipped +* jfjoch_process: Add space group detection (EXPERIMENTAL) + +### 1.0.0-rc.130 +This is an UNSTABLE release. The release has significant modifications and bug fixes, if things go wrong, it is better to revert to 1.0.0-rc.124. + +* jfjoch_broker: Rotation indexer has two retries if failes +* jfjoch_broker: Rotation indexer handles small number of rotation images (like test shot) +* jfjoch_broker: Integration calculates background mask based on R2 radius +* jfjoch_process: HDF5 files are not saved by default + +### 1.0.0-rc.129 +This is an UNSTABLE release. The release has significant modifications and bug fixes, if things go wrong, it is better to revert to 1.0.0-rc.124. + +* jfjoch_broker: Significant improvements in TCP image socket, as a viable alternative for ZeroMQ sockets (only a single port on broker side, dynamically change number of writers, acknowledgments for written files) +* jfjoch_broker: Delta phi is calculated also for still data in Bragg prediction +* jfjoch_broker: Image pusher statistics are accessible via the REST interface +* jfjoch_writer: Supports TCP image socket and for these auto-forking option + +### 1.0.0-rc.128 +This is an UNSTABLE release. The release has significant modifications and bug fixes, if things go wrong, it is better to revert to 1.0.0-rc.124. + +* jfjoch_broker: Handle properly reuse of image buffer locations +* jfjoch_broker: Fix bug in counting idle slots +* jfjoch_broker: Force obtuse angle for monoclinic cells +* jfjoch_process: Change scaling refinement tolerance + +### 1.0.0-rc.127 +This is an UNSTABLE release. The release has significant modifications and bug fixes, if things go wrong, it is better to revert to 1.0.0-rc.124. + +* jfjoch_broker: Default EIGER readout time is 20 microseconds +* jfjoch_broker: Multiple improvements regarding performance +* jfjoch_broker: Image buffer allows to track frames in preparation and sending +* jfjoch_broker: Dedicated thread for ZeroMQ transmission to better utilize the image buffer +* jfjoch_broker: Experimental implementation of transmission with raw TCP/IP sockets +* jfjoch_writer: Fixes regarding properly closing files in long data collections +* jfjoch_process: Scale & merge has been significantly improved, but it is not yet integrated into mainstream code + +### 1.0.0-rc.126 +This is an UNSTABLE release. If things go wrong with analysis, it is better to revert to 1.0.0-rc.124. + +* jfjoch_broker: Fix bug for monoclinic space groups being wrongly refined when beta is much different from 90 deg. + +### 1.0.0-rc.125 +This is an UNSTABLE release. This version adds scalign and merging. These are experimental at the moment, and should not be used for production analysis. +If things go wrong with analysis, it is better to revert to 1.0.0-rc.124. + +* jfjoch_broker: Improve logic on switching on/off spot finding +* jfjoch_broker: Increase maximum spot count for FFBIDX to 65536 +* jfjoch_broker: Increase default maximum unit cell for FFT to 500 A (could have performance impact, TBD) +* jfjoch_process: Add scalign and merging functionality - program is experimental at the moment and should not be used for production analysis +* jfjoch_viewer: Display partiality and reciprocal Lorentz-polarization correction for each reflection +* jfjoch_writer: Save more information about each reflection + +### 1.0.0-rc.124 +This is an UNSTABLE release. This version significantly rewrites code to predict reflection position and integrate them, +especially in case of rotation crystallography. If things go wrong with analysis, it is better to revert to 1.0.0-rc.123. + +* jfjoch_broker: Improve refection position prediction and Bragg integration code. +* jfjoch_broker: Align with XDS way of calculating Lorentz correction and general notation. +* jfjoch_writer: Fix saving mosaicity properly in HDF5 file. +* jfjoch_viewer: Introduce high-dynamic range mode for images +* jfjoch_viewer: Ctrl+mouse wheel has exponential change in foreground (+/-15%) +* jfjoch_viewer: Zoom-in numbers have better readability + +### 1.0.0-rc.123 +This is an UNSTABLE release. + +* jfjoch_broker: Use newer version of Google Ceres for (potential) CUDA 13 compatibility +* jfjoch_broker: Improve performance of generating preview images, especially for large detectors (9M-16M) +* jfjoch_viewer: Improve performance of displaying images, especially for large detectors (9M-16M) +* jfjoch_viewer: Add more color schemes for better image readability +* HDF5: Common mutex for reading and writing HDF5 if both operations were to happen in the same executable +* HDF5: suppress warning if path (upstream group) doesn't exists when checking if leaf exists + +### 1.0.0-rc.122 +This is an UNSTABLE release. + +* jfjoch_broker: Add thresholding to prefer shorter vectors after FFT +* jfjoch_broker: Add experimental mosaicity estimation for rotation experiments (this is work in progress) +* jfjoch_broker: Update nlohmann::json to 3.12.0 +* jfjoch_viewer: Display file opening errors +* jfjoch_viewer: When loading files over DBus add retry/back-off till the file is available + +### 1.0.0-rc.121 +This is an UNSTABLE release. + +* jfjoch_broker: Report changes in the image buffer, so viewer doesn't reload constantly +* jfjoch_viewer: Improve performance of loading images +* jfjoch_viewer: Auto-throttle image loading in HTTP-sync / movie modes +* jfjoch_viewer: Auto-foreground calculated with histogram +* jfjoch_viewer: Fix rare segmentation fault + +### 1.0.0-rc.120 +This is an UNSTABLE release. + +* jfjoch_broker: Improve performance of binary plot export + +### 1.0.0-rc.119 +This is an UNSTABLE release and not recommended for production use (please use rc.111 instead). + +* jfjoch_broker: Add binary export of data analysis plots over OpenAPI +* jfjoch_broker: Minor fixes to HTTP error handling +* jfjoch_viewer: Prefer binary plots over JSON plots +* jfjoch_viewer: Change foreground with F button + wheel +* jfjoch_viewer: Change way how angles are displayed +* jfjoch_viewer: Display resolution of the mouse cursor in top left corner + +### 1.0.0-rc.118 +This is an UNSTABLE release and not recommended for production use (please use rc.111 instead). + +* jfjoch_viewer: Fix issue when HTTP sync silently disconnected when it was enabled when the broker was starting measurement. +* jfjoch_broker: Add protections on time of geometry optimization and reduce rotation recalculations + +### 1.0.0-rc.117 +This is an UNSTABLE release and not recommended for production use (please use rc.111 instead). + +* jfjoch_viewer: Add ROI results to the dataset info plots +* jfjoch_writer: Remove HTTP interface, as it is not needed/used at the moment + +### 1.0.0-rc.116 +This is an UNSTABLE release and not recommended for production use (please use rc.111 instead). + +* jfjoch_viewer: Add binning options in the context menu + +### 1.0.0-rc.115 +This is an UNSTABLE release and not recommended for production use (please use rc.111 instead). + +* jfjoch_broker: Default spot finding settings can be configured via config JSON +* jfjoch_viewer: FFT analysis of data in the dataset plot + +### 1.0.0-rc.114 +This is an UNSTABLE release and not recommended for production use (please use rc.111 instead). + +* jfjoch_broker: Fix generating JPEG images with resolution estimation + +### 1.0.0-rc.113 +This is an UNSTABLE release and not recommended for production use (please use rc.111 instead). + +* jfjoch_broker: Improve handling of rotation indexing +* jfjoch_broker: More information saved in CBOR end message (WIP) +* jfjoch_writer: Save rotation indexing lattice parameters and Niggli class +* jfjoch_viewer: Remove (for now) primitive cell information +* jfjoch_viewer: Use angle for dataset info plot for rotation scans + +### 1.0.0-rc.112 +This is an UNSTABLE release and not recommended for production use (please use rc.111 instead). + +* jfjoch_broker: Experimental rotation (3D) indexing +* jfjoch_broker: Minor fix to error in optimizer potentially returning NaN values + +### 1.0.0-rc.111 +This is an UNSTABLE release. + +* jfjoch_viewer: Remove 3D lattice viewer (not really useful at this moment) +* jfjoch_viewer: Fix auto contrast not refreshing image + +### 1.0.0-rc.110 +This is an UNSTABLE release. + +* jfjoch_broker: Add auto-contrast option for preview images +* Frontend: Add logo image +* jfjoch_viewer: Add logo image +* jfjoch_viewer: For image chart allow to set min value to zero +* jfjoch_viewer: For resolution estimation plots, visualization uses 1/d^2 as measure +* jfjoch_viewer: Add 3D unit cell visualization (experimental/WIP/not really there) +* Documentation: Add logo image + +### 1.0.0-rc.109 +This is an UNSTABLE release. + +* jfjoch_viewer: Add keyboard shortcuts and option to copy image to clipboard +* jfjoch_broker: Fix bit-width and exposure time for PSI EIGER detectors + +### 1.0.0-rc.108 +This is an UNSTABLE release. + +* jfjoch_viewer: Fix bug when resolution estimation/B-Factor/Profile radius were not set (NaN) +* jfjoch_viewer: Show spots is off by default, resolution ring mode is enabled by default +* jfjoch_viewer: Fit to window of image is now default when size of the grid changes + +### 1.0.0-rc.107 +This is an UNSTABLE release. + +* jfjoch_viewer: Minor polishing of new functionality +* jfjoch_broker: User NaN for empty azimuthal bins + +### 1.0.0-rc.106 +This is an UNSTABLE release. + +* jfjoch_viewer: Allow for multiple dataset info plots +* jfjoch_viewer: Highlight current element in grid + +### 1.0.0-rc.105 +This is an UNSTABLE release. + +* jfjoch_viewer: Clean-up widgets slightly +* jfjoch_viewer: Limit right panel to 600 pixels +* jfjoch_viewer: Parse crystal symmetry type +* jfjoch_viewer: Grid scan view takes color map and can be fit to zoom + +### 1.0.0-rc.104 +This is an UNSTABLE release. + +* jfjoch_writer: Fix and improve the way grid scan geometry is saved (non-NXmx extension makes it way easier) +* jfjoch_viewer: Display grid scan results in 2D (work in progress) +* jfjoch_viewer: Improve auto-scaling on start of images (work in progress) +* jfjoch_viewer: Add B-factor and resolution estimate to the dataset info plots + +### 1.0.0-rc.103 +This is an UNSTABLE release. + +* jfjoch_viewer: Minor improvements to the viewer +* jfjoch_broker: Change behavior for modular detectors: coordinates of 0-th pixel can be now arbitrary and detector will be cropped to the smallest rectangle limited by module coordinates + +### 1.0.0-rc.102 +This is an UNSTABLE release. + +* jfjoch_viewer: Minor improvements to the viewer + +### 1.0.0-rc.101 +This is an UNSTABLE release. + +* jfjoch_viewer: Auto load is better handling change of states +* jfjoch_viewer: Fix DBus registration +* jfjoch_viewer: Handle charts better with vertical lines on hover and status bar update +* jfjoch_viewer: Calculate ROI in a more efficient way + +### 1.0.0-rc.100 +This is an UNSTABLE release. + +* jfjoch_viewer: Fix dbus registration +* jfjoch_viewer: Remove background slider for diffraction image +* jfjoch_viewer: Adjustments for 2D azimuthal image viewer + +### 1.0.0-rc.99 +This is an UNSTABLE release. + +* jfjoch_broker: Fix output during mask data collection + +### 1.0.0-rc.98 +This is an UNSTABLE release and not recommended for production use (please use rc.96 instead). + +* jfjoch_broker: For DECTRIS detectors fix dark data collection during initialization + +### 1.0.0-rc.97 +This is an UNSTABLE release and not recommended for production use (please use rc.96 instead). + +* jfjoch_broker: For DECTRIS detectors add dark data collection during initialization for bad pixel mask +* jfjoch_broker: Refactor of calibration logic for more clear code (likely to introduce problems) +* jfjoch_viewer: Add option to handle user pixel mask (experimental) +* jfjoch_viewer: More options for ROI +* jfjoch_viewer: Add window to display calibration + +### 1.0.0-rc.96 +This is an UNSTABLE release. + +* Fixes in CI pipeline +* jfjoch_broker: Remove PNG preview, no dependency on libpng +* jfjoch_writer: Fix UTC timestamp being generated wrong (mix between milli- and microseconds) +* jfjoch_viewer: Show data collection time in dataset tooltip +* jfjoch_viewer: Allow to choose the calibrant (presets for LaB6 and silver behenate) +* jfjoch_viewer: Auto foreground value +* Use external libjpeg-turbo and libtiff: simpler build stack, these are built and linked statically in automated Docker builds +* Remove OpenBLAS dependency + +### 1.0.0-rc.95 +This is an UNSTABLE release. + +* Fixes in CI pipeline +* Add git-lfs to Rocky8 docker image + +Previous releases (91-94) had a wrong FPGA image upload to Gitlab release. This is now solved. + +### 1.0.0-rc.94 +This is an UNSTABLE release. + +* FFTIndexer: Add limit on angles to avoid colinear vectors +* Docker images: Add 3D Qt +* Gitea: Fixes to the pipeline + +### 1.0.0-rc.93 +This is an UNSTABLE release. + +* CI: Fixes to Gitlab based pipeline +* PCIe driver: Fix PCIe revision being hex number + +### 1.0.0-rc.92 +This is an UNSTABLE release. + +* jfjoch_broker: Fix code that predicted Bragg reflections scattering back from the sample. + +### 1.0.0-rc.91 +This is an UNSTABLE release. This release introduces new features, which usually means these need more field testing before enough maturity. +For production use we recommend waiting for a future bug-fix release. + +* FPGA: Implement high pixel value threshold - pixels above the given value will be considered saturated +* jfjoch_broker: Spot finding and integration predictions are ported to a GPU +* jfjoch_broker: Estimate resolution +* jfjoch_broker: Lattice search +* jfjoch_broker: Many more improvements in image analysis + +### 1.0.0-rc.90 +This is an UNSTABLE release. + +* jfjoch_broker: for indexing min index spots for a viable cells can be changed via OpenAPI +* jfjoch_viewer: Optional auto-reanalyze images +* jfjoch_writer: Add option where no files at all are saved +* Documentation: improvements + +### 1.0.0-rc.89 +This is an UNSTABLE release. + +* jfjoch_broker: Fix resolution estimation code +* jfjoch_broker: Fix Wilson B-factor calculation code +* jfjoch_viewer: Improve display of plots +* jfjoch_viewer: Fix segmentation fault +* jfjoch_viewer: Display missing metadata when using HTTP +* jfjoch_viewer: Fix bug when opening the same file twice + +### 1.0.0-rc.88 +This is an UNSTABLE release. + +* jfjoch_viewer: Add resolution estimation to the image information +* jfjoch_broker: Minor changes to resolution estimate routine + +### 1.0.0-rc.87 +This is an UNSTABLE release. + +* jfjoch_viewer: Display more image metadata (angle / exposure time) +* jfjoch_viewer: Improve I/sigma and B-factor plots +* jfjoch_broker: Estimate resolution based on visible spots + +### 1.0.0-rc.86 +This is an UNSTABLE release. + +* jfjoch_broker: Update logic when initializing detector to make it a bit more resilient +* Gitea pipelines have nocuda option for all architectures + +### 1.0.0-rc.85 +This is an UNSTABLE release. + +* jfjoch_viewer: When using online view, dataset info plots are not switched back to the first category for each image +* jfjoch_viewer: Handle spot count better in dataset info plots +* jfjoch_viewer: Highlight spots in ice ring resolutions in cyan, when detection is enabled + +### 1.0.0-rc.84 +This is an UNSTABLE release. + +* jfjoch_broker: Write in log which detector is being initialized +* Changes to automated build system + +### 1.0.0-rc.83 +This is an UNSTABLE release. + +* jfjoch_viewer: Fix in generating preview image for signed data (wrong bit-width was assumed before) +* CI: Fix script to generate python client + +### 1.0.0-rc.82 +This is an UNSTABLE release. + +* jfjoch_viewer: Enable FFTW based indexing in viewer (very slow at the moment) +* Frontend: Minor fixes +* Build scripts: Minor fixes to FFTW + +### 1.0.0-rc.81 +This is an UNSTABLE release. This release introduces new features, which usually means these need more field testing before enough maturity. +For production use we recommend waiting for a future bug-fix release. + +* jfjoch_broker: Add option to detect ice rings, adjust width of ice ring and change of logic to exclude ice rings in indexing +* jfjoch_broker: Add FFTW based indexer for CPU only indexing +* jfjoch_broker: Enable saving X-ray fluorescence spectra +* jfjoch_writer: Write total spot count (before filtering) +* jfjoch_viewer: Add more information on source, sample, and buttom to show ice rings +* jfjoch_viewer: Enable data processing inside the viewer + +CI: Moving from Gitlab to Gitea at PSI + +### 1.0.0-rc.80 +This is an UNSTABLE release. + +* jfjoch_broker: Fix bug when wrong value for a plot (NaN or infinity) would lead to a null in a plot, which cannot be parsed by viewer + +### 1.0.0-rc.79 +This is an UNSTABLE release. + +* jfjoch_viewer: Fix bug when loading new dataset was creating a cascade of signals leading to poor performance +* jfjoch_writer: Save nimages_per_trigger in detectorSpecific + +### 1.0.0-rc.78 +This is an UNSTABLE release. + +* jfjoch_viewer: Using a single event loop (reading images is not in dedicated thread anymore) + +### 1.0.0-rc.77 +This is an UNSTABLE release. + +* jfjoch_viewer: Display detector and dataset settings with tooltips +* jfjoch_viewer: Clean excessive HDF5 warnings +* jfjoch_viewer: Display unit cell +* jfjoch_extract_hkl: Write a tool to extract reflection intensity from a dataset + +### 1.0.0-rc.76 +This is an UNSTABLE release. + +* jfjoch_broker: Increase predicted hkl to 100.0, use lighter math to exclude too-high resolution ones +* jfjoch_broker: Use standard deviation formula to find profile radius (not the one using median) +* jfjoch_writer: Save space group number (non-NXmx addition) in addition to name +* jfjoch_viewer: Fix the bug on reading space_group as string +* jfjoch_viewer: Add missing resolution labels on rings +* jfjoch_viewer: Remove Q value from the status bar + +### 1.0.0-rc.75 +This is an UNSTABLE release. + +* jfjoch_broker: EIGER2 missing minimum threshold - hardcoded to 2.7 keV for the time being + +### 1.0.0-rc.74 +This is an UNSTABLE release. + +* jfjoch_broker: Fix for EIGER UDP port settings (vertical half of the module missing) +* jfjoch_broker: Detector settings were not applied for EIGER/DECTRIS detector when changed after initialization + +### 1.0.0-rc.73 +This is an UNSTABLE release. + +* jfjoch_broker: Space group number treatment in OpenAPI was wrong, zero value is no longer allowed and no longer default + +### 1.0.0-rc.72 +This is an UNSTABLE release. +This release introduces new features, which usually means these need more field testing before enough maturity. +For production use we recommend waiting for a future bug-fix release. + +* jfjoch_broker: Refactor of indexing and geometry refinement code +* jfjoch_broker: Handle space group/centering in refinement code +* jfjoch_broker: Replace mosaicity with profile radius: refining the former is difficult with still images +* jfjoch_broker: There is no longer 0.5 pxl offset for spots-to-reciprocal-space conversion +* jfjoch_writer: Experimental saving of reflections +* jfjoch_writer: Save space group name as string +* jfjoch_viewer: Add profile radius and B-factor +* jfjoch_viewer: Show 4 digits for wavelength +* jfjoch_viewer: Match rings between calibrant and observation (will handle missing/wrong rings) +* FPGA: Use UDP destination port to distinguish between detector modules and data streams +* FPGA: Add experimental PTP core (PTP over L2, only Sync/Follow_up) +* FPGA driver: Fix for Linux kernel 6.12+ (thanks to Tim Gruene) + +### 1.0.0-rc.71 +This is an UNSTABLE release. + +* jfjoch_broker: Remove resolution estimation via machine learning +* jfjoch_broker: Harmonize code to analyze spot finding results (indexing/refinement/integration) between CPU and FPGA receivers +* jfjoch_viewer: Fix error when HDF5 files with indexing results couldn't be loaded on a machine without GPU + +### 1.0.0-rc.70 +This is an UNSTABLE release. +This release introduces new features (geometry refinement), which usually means these need more field testing before enough maturity. +For production use we recommend waiting for a future bug-fix release. + +* jfjoch_broker: Fix bug when PSI EIGER frame time was not set properly at the start of the measurement +* jfjoch_broker: Fix PONI rot2 angle rotating detector in a wrong direction (PyFAI convention is for this angle to rotate detector downwards) +* jfjoch_broker: Enable geometry refinement - first try (work in progress) +* jfjoch_viewer: Fix deadlock when opening HTTP connections +* jfjoch_viewer: Display rings as ellipses with detector tilt +* jfjoch_viewer: Add button to calibrate detector geometry based on LaB6 image +* jfjoch_writer: Save detector tilt angles (rot1, rot2, rot3) + +* Add Google Ceres a non-linear least-square optimization library to Jungfraujoch +* Add experimental detector calibration routines (for LaB6) +* Improve documentation on the ZeroMQ writer notification socket and detector geometry + +### 1.0.0-rc.69 +This is an UNSTABLE release. + +* jfjoch_viewer: Metadata can be modified for an open dataset (no option to save) +* jfjoch_viewer: Refactor multiple issues in the viewer regarding image reading code to allow for further developments +* jfjoch_viewer: Resolution rings not enabled by default +* jfjoch_broker: Handle properly PONI rotations in dataset settings though still not updated properly in the HDF5 file + +### 1.0.0-rc.68 +This is an UNSTABLE release. + +* jfjoch_broker: Temperature threshold can be changed for JUNGFRAU detector +* jfjoch_broker: Default detector settings can be configured for each detector separately +* jfjoch_broker: Refactor spot filtering code, max spot count can be modified for dataset settings +* jfjoch_broker: Refactor indexing refinement, make it the same for both FFBIDX and FFT indexing +* jfjoch_broker: Reference unit cell will be taken into account for FFT indexing to filter +* jfjoch_broker: Review PONI rotation angles and azimuthal angle conventions along with PyFAI + +### 1.0.0-rc.67 +This is an UNSTABLE release. + +* jfjoch_broker: Enable SSL +* jfjoch_broker: Wilson B-factor only provided is fit is relatively OK (R^2 > 0.3); this will be refined much more in the future + +### 1.0.0-rc.66 +This is an UNSTABLE release. + +* jfjoch_broker: Indexers operate as thread pool, which is operating +* jfjoch_viewer: Increase interval between loading images + fix too many verbose messages + +### 1.0.0-rc.65 +This is an UNSTABLE release. + +* jfjoch_broker: Print information regarding used image pushers +* jfjoch_viewer: Allow syncing with Jungfraujoch server +* OpenAPI: Clarify licensing terms in the file + +### 1.0.0-rc.64 +This is an UNSTABLE release. + +* jfjoch_broker: Fix issue in receiver light with very long preparation time for threads +* jfjoch_broker: Add verbose option +* jfjoch_broker: Don't trigger pedestal if critical settings are not changed when loading detector settings +* jfjoch_broker: Detector left in busy state when detector settings were improper +* jfjoch_viewer: Modify DBus interface to avoid loading same file and image 0 multiple times +* jfjoch_lite_perf_test: Add verbose option + +### 1.0.0-rc.63 +This is an UNSTABLE release. + +* jfjoch_broker: Save NX/NY for grid scan result +* jfjoch_broker: Add processing time to CBOR output and plot +* jfjoch_writer: Add processing time to data file + +### 1.0.0-rc.62 +This is an UNSTABLE release. + +* jfjoch_broker: Fix bug where low resolution spots were not counted properly +* jfjoch_broker: Spot count is provided prior to filtering of spots to max_spot_count +* jfjoch_broker: Add more spot count information to CBOR +* jfjoch_viewer: Fix issue with ROI drawing resulting in multiple overlapping rectangles + +### 1.0.0-rc.61 +This is an UNSTABLE release. + +* jfjoch_broker: Fix bug where FFT indexing could result in a very short or even zero length vector +* jfjoch_broker: Ice ring and indexed spot count enabled as plots and saved in grid scan results +* jfjoch_broker: High resolution limit for low res. spot counting can be adjusted + +### 1.0.0-rc.60 +This is an UNSTABLE release. + +* jfjoch_broker: Fix bug when the neural network inference client was busy and this status was never released +* jfjoch_broker: Revert the indexing threshold with distance from integer for Miller indices +* jfjoch_broker: Fix bug in scattering vector calculation, resulting in indexing not working outside 1.0 A X-ray wavelength + +### 1.0.0-rc.59 +This is an UNSTABLE release. + +* jfjoch_broker: Fix bug when broker was waiting for notification message before sending end message, resulting in deadlock. +* jfjoch_writer: Verbose option for debugging. + +### 1.0.0-rc.58 +This is an UNSTABLE release. + +* jfjoch_viewer: Fix memory leak +* jfjoch_writer: Add detector_number/serial_number to master file + +### 1.0.0-rc.57 +This is an UNSTABLE release. + +* jfjoch_broker: Fix bug when enabling ML resolution estimation was not possible +* jfjoch_viewer: "Movie" mode + +### 1.0.0-rc.56 +This is an UNSTABLE release. + +* jfjoch_broker: Fixing more bugs related to neural network inference for ML estimation + +### 1.0.0-rc.55 +This is an UNSTABLE release. + +* jfjoch_broker: Fixing minor bugs related to neural network inference for ML estimation + +### 1.0.0-rc.54 +This is an UNSTABLE release. + +* jfjoch_broker: Indexing with AUTO settings (FFBIDX if unit cell provided; FFT if not) +* jfjoch_broker: Don't remove shared memory area when deactivating detector +* jfjoch_writer: Save writer release +* jfjoch_viewer: Increase time for the messages in the status bar + +### 1.0.0-rc.53 +This is an UNSTABLE release. + +* PCIe driver: Imperfect solution for RHEL 9.5+ changes +* jfjoch_writer: Fix to angle containers for AutoProc compatibility +* jfjoch_fpga_test: Use consecutive number for devices, not interleaved + +### 1.0.0-rc.52 +This is an UNSTABLE release. + +* jfjoch_viewer: Use warmer colors to distinguish from AareGUI +* jfjoch_viewer: Minor adjustments to DBus setting image number +* jfjoch_broker: Fix in low resolution spot count plotting + +### 1.0.0-rc.51 +This is an UNSTABLE release. + +* jfjoch_broker: Send preview in PNG format +* jfjoch_broker: Provide count of spots in 50.0 - 5.0 A range +* jfjoch_broker: Provide ML resolution estimation in scan result +* jfjoch_broker: Allow removing beam center in web preview + +### 1.0.0-rc.50 +This is an UNSTABLE release. + +* The release fixes some of many bugs introduced in recent releases +* jfjoch_viewer: display predictions for indexed cells + +### 1.0.0-rc.49 +This is an UNSTABLE release. + +* jfjoch_broker: Handle sample temperature (K) and ring current (mA) to metadata +* jfjoch_writer: For angle containers in NXmx add _end dataset, sample temp. and ring current + +### 1.0.0-rc.48 +This is an UNSTABLE release. + +* jfjoch_broker: fix the bug when a unit cell was not exported for a scan result. + +### 1.0.0-rc.47 +This is an UNSTABLE release. + +* jfjoch_viewer: fix dbus service path +* jfjoch_writer: fix CBF/TIFF writing + +### 1.0.0-rc.46 +This is an UNSTABLE release. + +* jfjoch_viewer: remove dependency on image analysis + +### 1.0.0-rc.45 +This is an UNSTABLE release. + +* jfjoch_broker: Detector list returns pixel size (mm) + +### 1.0.0-rc.44 +This is an UNSTABLE release. + +* jfjoch_broker: more general definition of scan result export + +Braking changes: +* It removes additions to OpenAPI from 1.0.0-rc.43 +* It makes changes to the "unit_cell" definition in OpenAPI specs. It might be harmless in some languages and may result in errors in other implementations. + +### 1.0.0-rc.43 +This is an UNSTABLE release. + +* jfjoch_broker: Export grid scan results into a single data structure + +### 1.0.0-rc.42 +This is an UNSTABLE release. + +* jfjoch_broker: Add pixel_sum to CBOR output. +* jfjoch_broker: Changes to sigma estimation in QuickIntegrate routine +* jfjoch_writer: Save pixel_sum + +### 1.0.0-rc.41 +This is an UNSTABLE release. This release includes multiple new features, it should not be used in production at the moment. + +* jfjoch_broker: Estimate B-factor, mosaicity to evaluate crystal diffraction +* jfjoch_broker: Export GPU count via OpenAPI +* jfjoch_broker: Enable 2D azimuthal integration and PONI rotations for detector + +* FPGA: Increase the number of integration bins to 2048 + +### 1.0.0-rc.40 +This is an UNSTABLE release. This release includes multiple new features, it should not be used in production at the moment. + +* jfjoch_broker: Jungfraujoch supports grid scan metadata, including dedicated plotting schemes and NXmx structures +* jfjoch_broker: Improve metadata for rotation data collection +* jfjoch_broker: Better handling of plotting +* jfjoch_broker: FFT based indexing +* jfjoch_broker: Integration, first try, results not saved at the moment +* jfjoch_broker: Internal improvements in image handling + +* jfjoch_writer: Multiple adjustments adapt to changes in this release for new features +* jfjoch_writer: New state management model to improve clarity of error reporting + +* jfjoch_viewer: Remote control via DBus + +* Frontend: Multiple adjustments for new features +* Frontend: Grid scan plots + +WARNING! OpenAPI contains breaking changes in regard to plotting results, so care has to be taken. + +### 1.0.0-rc.39 +* FPGA: Bugfix for pixel masked for data analysis if summation was on +* jfjoch_viewer: Fix segmentation fault when cursor was outside of image + +### 1.0.0-rc.38 +* jfjoch_broker: Neural net model is not linked with C++ code due to deployment issues, it is rather distributed as python code, connected via RES +* jfjoch_broker: Neural net model can use all 4 quadrants of the detector +* jfjoch_broker: For EIGER image time can be provided through /start +* jfjoch_viewer: Add image list option +* jfjoch_viewer: Drawing circular ROIs with shift +* jfjoch_viewer: Enable image summation +* jfjoch_viewer: Image reader is significantly reworked, hopefully without affecting the viewer + +### 1.0.0-rc.37 +* jfjoch_broker: Make locking rules more flexible +* jfjoch_broker: Load mask via SIMPLON interface for DECTRIS detectors +* jfjoch_viewer: Add status bar + +### 1.0.0-rc.36 +This is UNSTABLE release. Wait for new version to use in a production environment. + +* jfjoch_broker: Support for Jungfraujoch Lite is enabled - software-based receiver for DECTRIS detectors (required a lot of refactoring, potentially leading to unstable code) +* jfjoch_broker: Enable Resonet support (ML-based diffraction resolution estimation) +* jfjoch_broker: Fix error in compression, where bitshuffle/LZ4 and bitshuffle/Zstd HDF5 headers were wrongly generated for 8-bit and 32-bit data +* jfjoch_writer: Increase buffering to 1000 images in the receiver +* jfjoch_writer: Images can be written as CBF or TIFF in addition to HDF5 + +### 1.0.0-rc.35 +This is UNSTABLE release, not properly tested. Wait for new version for using production. + +* jfjoch_broker: If module is delayed by more than 50 frames versus other modules, it will be ignored and receiver is not waiting. +* jfjoch_writer: Save EIGER energy threshold +* jfjoch_writer: Add `/entry/sample/goniometer` for compatibility with `eiger2cbf` program + +### 1.0.0-rc.34 +This is UNSTABLE release - introducing new features, but not properly tested. Wait for new version for using production. + +* jfjoch_broker: More consistency for file format definition (breaking change in API from 1.0.0-rc.31 for file writer settings) +* jfjoch_broker: For storage cells mask is logical sum of detector bad pixels for all storage cells +* jfjoch_broker: Handle situation when detector doesn't want to gracefully stop (to be tested) +* jfjoch_broker: Center-of-mass position and mean for ROI is added to available plots +* jfjoch_viewer: Can extract data analysis results from "legacy" format +* jfjoch_viewer: Display dataset name +* FPGA: Pixel mask is used for data analysis part even if it is not applied to pixels +* FPGA: Add pixel sum to module statistics +* FPGA: ROI number is reduced to 16, but pixel can belong to every defined ROI +* FPGA: Spot finder is back to full dynamic range (24-bit) +* FPGA: More debug features for internal FIFOs + +Known issues: +* ROI count flag was added to firmware. For the time being the flag will be wrongly set to 10 due to mismatch of FPGA build scripts. +* EIGER data acquisition has an issue that is currently debugged + +### 1.0.0-rc.33 +* jfjoch_broker: Fix issue with EIGER settings being loaded improperly + +### 1.0.0-rc.32 +* jfjoch_broker: Refactor code for azimuthal integration for further improvements +* jfjoch_broker: Minor fix for EIGER (trim energies are manually set for E9M, to be fixed properly later) +* jfjoch_writer: Fix too much verbose information +* FPGA: Minor fixes to spot finder (enable two-pass operation and limit number range to int20) + +### 1.0.0-rc.31 +This is UNSTABLE release - introducing many features, but still needs more testing. +Expecting soon to put bugfix release. + +* jfjoch_writer: Allow to enable overwriting existing files (not enabled by default) +* jfjoch_writer: Add new HDF5 master file format, which uses HDF5 virtual data sets and links processing results to data files (not enabled by default) +* jfjoch_viewer: Image viewer work early test version +* jfjoch_broker: Fixes to counting packets per dataset/image +* jfjoch_broker: Image buffer is accessible for outside to check images +* jfjoch_broker: error/saturated pixels and dedicated ROI "beam" can be tracked online +* jfjoch_broker: Fix bug in handling pedestal G1/G2 count time for JUNGFRAU +* jfjoch_broker: Fix bug in applying pixel mask interfering with pedestal calculation +* jfjoch_broker: Fix bug in EIGER initializing +* jfjoch_broker: Save maximum pixel value to HDF5 file and export as Web plot +* PCIe driver: Add PCIe link speed and width +* FPGA: Improve counting error/saturated/min/max pixels +* FPGA: Spot finder is gradual column-wise (15 columns up/down) and fixed row-wise (32 pixel boxes); previously it was fixed both column- and row-wise with 32x32 pixel areas +* FPGA: Require Vivado 2022.2 + +Warning: +There are breaking changes to HDF5 file format, renaming entries regarding image storage cell number and image collection efficiency. + +### 1.0.0-rc.30 +* jfjoch_writer: replace non-blocking with blocking operation on internal queues - less likely to "loose" images within the writer + +### 1.0.0-rc.29 +* jfjoch_broker: refactor logic regarding frame time and count time for more flexibility for EIGER and JUNGFRAU +* jfjoch_broker: readout time for EIGER is 3 us and JUNGFRAU is 20 us, this can be changed in input file +* jfjoch_broker: OpenAPI interface includes more ways to provide information on the status (error/warning/info) +* jfjoch_broker: ROIs handling via OpenAPI and frontend is more user friendly + +Warning - two breaking changes to OpenAPI: +* Handling of ROIs is through `/config/roi` path only for both circle and box ROIs, path in `/roi` are no longer accessible +* `broker_status` structure introduced in 1.0.0-rc.28 has member `message` and not `error_message` to allow +handling info/warning messages as well + +### 1.0.0-rc.28 +* jfjoch_broker: save error message for initialization and data collection and provide these with OpenAPI +* jfjoch_broker: fixed issue when in error state, response to /wait_till_done was not complaint to OpenAPI specs +* jfjoch_test: remove header that failed when CUDA is absent during compilation +* frontend: add soft trigger button in data collection tab +* frontend: show error message when in error state +* CMake: add option to force compilation without CUDA (-DJFJOCH_USE_CUDA=OFF) + +### 1.0.0-rc.27 +* jfjoch_broker: add option to select electron source in instrument metadata, adapt wavelength calculation +* jfjoch_broker: update pistache web server version +* jfjoch_writer: minor changes to republish logic +* Improvements to documentation + +### 1.0.0-rc.26 +* jfjoch_broker: implement ZeroMQ stream for image metadata information +* jfjoch_broker: refactor ZeroMQ stream for preview: start/end messages always sent +* jfjoch_broker: add crystal lattice plots +* jfjoch_broker: remove empty bins from the plots +* jfjoch_broker: Fix bugs in ModuleSummation and MXAnalyzer for CPU "long" summation +* jfjoch_broker: Fix bug when mean background estimation / indexing rate where affected by previous experiment +* jfjoch_writer: fix missing "-w" parameter +* jfjoch_writer: temporary files have ".tmp" suffix +* jfjoch_writer: refactor logic for watermarks +* jfjoch_writer: report on internal FIFO utilization +* jfjoch_writer: clean-up naming for azimuthal integration and background estimate +* jfjoch_writer: write final background estimate and indexing rate in the master file +* tools/: remove unnecessary tools, make naming consistent +* CBOR: Add indexing rate and background estimate to end message +* CBOR: Clean-up documentation + +### 1.0.0-rc.25 + +* Updates to documentation +* License set to GPLv3 / OHL-S +* Fix bug in DiffractionExperiment::GetDefaultPlotBinning() - resulting in division by 0 if image time longer than 500ms +* Add information on JUNGFRAU conversion and geometry transformation to CBOR and HDF5 + +### 1.0.0-rc.24 + +New FPGA functionality: +* EIGER supports 8, 16 and 32-bit data input (for 8-bit mode at half performance; for 32-bit "real" depth is 23-bit + 1-bit signed) +* Output possible to 8, 16 and 32-bit data +* Threshold is applied before summation +* Pixel mask can be applied on FPGA +* Mark pixels with ADC content = 0 as bad pixels +* FPGA stores semantic version information (access via /sys/class/misc/jfjoch.../version) + +New software functionality: +* Long summation (above 256 frames) done on CPU +* Mechanism to save arbitrary data to HDF5 file +* ZeroMQ preview has option to send start message +* Rework pixel mask + add statistics displayed in web interface + +Bug fixes: +* Web frontend: Update preview image automatically during data acquisition +* jfjoch_broker: Error handling if CUDA driver is not installed +* jfjoch_broker: Correctly update progress during pedestal +* jfjoch_broker: Provide proper error when uploaded file is not a proper TIFF +* jfjoch_action_test: enable HLS simulation + +Documentation improvement and placement in a dedicated directory \ No newline at end of file diff --git a/_sources/CPU_DATA_ANALYSIS.md.txt b/_sources/CPU_DATA_ANALYSIS.md.txt new file mode 100644 index 00000000..2d443b67 --- /dev/null +++ b/_sources/CPU_DATA_ANALYSIS.md.txt @@ -0,0 +1,617 @@ +# CPU-side crystallographic data analysis (Jungfraujoch) + +This document describes the crystallographic algorithms implemented in Jungfraujoch for **CPU**- and **GPU**-side real‑time and near‑real‑time data analysis. + +**Scope.** The pipeline covered here comprises: + +1. geometry mapping and corrections, +2. azimuthal integration (powder/radial profiles), +3. Bragg spot finding (strong pixels → connected components → spot descriptors), +4. indexing (still and rotation modes), +5. Bravais lattice / centering inference, +6. geometry and lattice refinement, +7. reflection prediction (still and rotation), +8. 2D summation integration, +9. scaling and merging, +10. auxiliary statistics (Wilson plot, ⟨I/σ(I)⟩, French–Wilson). + +## References + +The methods are inspired and reuising solutions implemented in: + +- W. Kabsch, “XDS”, *Acta Cryst.* **D66** (2010), 125–132 and related XDS papers (rotation geometry, partiality, scaling concepts). +- W. Kabsch, “Integration, scaling, space-group assignment and post-refinement”, *Acta Cryst.* **D66** (2010), 133–144 (mosaicity/partiality likelihood treatment; notation such as ζ and rotation factors). +- T. A. White et al., CrystFEL method papers (spot finding, three‑ring integration, serial/still diffraction processing concepts). +- J. Kieffer & J. P. Wright, "PyFAI: a Python library for high performance azimuthal integration on GPU", *Powder Diffraction* **28** (2013), S339-S350 (detector geometry definition, azimuthal integration) +- H. Powell, "The Rossmann Fourier autoindexing algorithm in MOSFLM", *Acta Cryst.* **D55** (1999), 1690-1695 (FFT indexing) +(list is not exhaustive) + +## 1. Geometry, reciprocal-space mapping, and basic quantities + +### 1.1 Coordinate conventions + +For a pixel coordinate $(x,y)$ (in pixels), Jungfraujoch converts to a laboratory direction vector via: + +1. shift by direct-beam position $(x_\mathrm{beam}, y_\mathrm{beam})$, +2. scale by pixel size $p$ (mm), +3. set detector distance $D$ (mm), +4. apply detector orientation rotation $R_\mathrm{det}$ (PyFAI-like parameterization). + +The unnormalized detector coordinate (mm) is: +$ +\mathbf{r}_\mathrm{det}(x,y) = +\begin{pmatrix} +(x-x_\mathrm{beam})p\\ +(y-y_\mathrm{beam})p\\ +D +\end{pmatrix}. +$ + +The lab-frame vector is: +$ +\mathbf{r}_\mathrm{lab} = R_\mathrm{det}\,\mathbf{r}_\mathrm{det}. +$ + +Let the incident wavevector magnitude be $k = 1/\lambda$ in Å$^{-1}$, and define: +$ +\mathbf{S}_0 = (0,0,k). +$ + +The **reciprocal-space scattering vector** associated with pixel $(x,y)$ is: +$ +\mathbf{s}(x,y) = k\,\frac{\mathbf{r}_\mathrm{lab}}{\lVert \mathbf{r}_\mathrm{lab}\rVert} - \mathbf{S}_0. +$ + +This $\mathbf{s}$ is the fundamental quantity used for spot finding (resolution filters), indexing, and refinement. + +### 1.2 Two-theta, azimuth, resolution and $q$ + +The scattering angle $2\theta$ is computed from $\mathbf{r}_\mathrm{lab}$ via: +$ +2\theta = \arctan\!\left(\frac{\sqrt{x_\mathrm{lab}^2 + y_\mathrm{lab}^2}}{z_\mathrm{lab}}\right). +$ + +Resolution (Å) at a pixel is: +$ +d = \frac{\lambda}{2\sin(\theta)} = \frac{\lambda}{2\sin(2\theta/2)}. +$ + +The magnitude $q = 2\pi/d$ is used for radial binning and ice-ring handling. + +### 1.3 Distance from the Ewald sphere + +For a reciprocal lattice point $\mathbf{p}$ (Å$^{-1}$), define: +$ +\Delta_\mathrm{Ewald}(\mathbf{p}) = \lVert \mathbf{p} + \mathbf{S}_0\rVert - k. +$ +Jungfraujoch uses $|\Delta_\mathrm{Ewald}|$ as an operational proxy for excitation error. This appears in: +- still prediction (accept if $|\Delta_\mathrm{Ewald}|\le \Delta_\mathrm{cut}$), +- profile radius estimation (see §7.1), +- still partiality option in scaling/merging (§9.3). + +--- + +## 2. Azimuthal integration (radial profiles) + +Azimuthal integration produces a 1D radial profile $I(q)$ or $I(d)$ by histogramming pixels into radial bins. Pixels are **not split** across bins; each pixel contributes wholly to a single bin. + +### 2.1 Histogram estimator + +Let bin index $b(x,y)\in\{0,\dots,B-1\}$ be precomputed from $q(x,y)$ (or equivalently from $d(x,y)$). For each bin $b$: + +- accumulate corrected intensity: + $ + S_b = \sum_{(x,y):\,b(x,y)=b} I(x,y)\,C(x,y), + $ +- and count: + $ + N_b = \#\{(x,y):\,b(x,y)=b \text{ and pixel is valid}\}. + $ + +A simple mean profile is then $ \bar{I}_b = S_b / N_b$ (when $N_b>0$). Invalid pixels (masked, saturated, detector error codes) are excluded. + +### 2.2 Corrections applied + +Two standard corrections are available: + +**(i) Solid angle / geometric correction.** A commonly used approximation for flat detectors gives a $\cos^3(2\theta)$ factor: +$ +C_\Omega(2\theta) = \cos^3(2\theta). +$ + +**(ii) Polarization correction.** With polarization coefficient $P$ (beamline dependent) and azimuth $\phi$: +$ +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), +$ +applied as a divisor to intensities (i.e. scale by $1/C_\mathrm{pol}$) when enabled. + +### 2.3 Background estimate for profiles + +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 **not** the same as local Bragg-spot background used in summation integration (§8). + +--- + +## 3. Spot finding (strong pixels → Bragg spots) + +Spot finding is a two-stage process: + +1. **Strong-pixel selection** using intensity and/or local signal-to-noise criteria. +2. **Connected-component labeling (CCL)** to group strong pixels into candidate spots, followed by spot-level filtering and feature extraction. + +### 3.1 Strong-pixel detection by local statistics + +For each pixel $i$ with value $v_i$, consider a square window (nominally $31\times 31$ pixels) around it. Let the window contain $n$ valid pixels (excluding masked/bad/saturated), and define: +$ +\Sigma = \sum v,\qquad \Sigma_2 = \sum v^2. +$ + +To avoid biasing the local statistics by the test pixel itself, Jungfraujoch evaluates the pixel against the window with the pixel removed: +$ +\Sigma' = \Sigma - v_i,\quad \Sigma_2' = \Sigma_2 - v_i^2,\quad n' = n-1. +$ + +A variance-like quantity proportional to $n'^2$ is formed: +$ +V = n'\Sigma_2' - (\Sigma')^2, +$ +and the deviation-from-mean quantity: +$ +\Delta = v_i n' - \Sigma'. +$ + +A pixel is considered strong if: +- it is above a photon/count threshold, and +- $\Delta>0$, and +- the squared deviation exceeds a scaled variance: + $ + \Delta^2 > V\cdot T^2, + $ + where $T$ is the configured signal-to-noise threshold. + +This is equivalent to a local z-score criterion but implemented in integer arithmetic to be robust and fast. + +Special cases: +- saturated pixels can be forced to “strong” (useful for detecting overloaded Bragg spots), +- invalid pixels are never strong. + +### 3.2 Resolution and ice-ring handling + +Spot finding can be restricted to a resolution range $[d_\mathrm{high}, d_\mathrm{low}]$ 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). + +A further optional safeguard removes isolated high-resolution “spur” spots by detecting large gaps in $1/d$ (or $q$) space and discarding spots beyond the gap. This is intended for macromolecular diffraction where edge-of-detector backgrounds can be extremely low. + +### 3.3 Connected-component labeling (CCL) + +Strong pixels are grouped into connected components (adjacent strong pixels) using a CCL algorithm. Each component yields a candidate spot with: + +- centroid $(x,y)$ (often intensity-weighted), +- pixel count (spot size), +- integrated spot intensity proxy (sum of pixel values), +- resolution $d$ at the centroid (or mean over pixels), +- and quality flags (e.g. ice-ring classification). + +Spot-level filters include minimum/maximum pixel count and resolution limits. + +--- + +## 4. Indexing overview + +Indexing maps observed reciprocal-space vectors $\mathbf{s}_i$ to a lattice such that: +$ +\mathbf{s}_i \approx h_i\mathbf{a}^* + k_i\mathbf{b}^* + l_i\mathbf{c}^*, +$ +with integer $(h_i,k_i,l_i)$. + +Jungfraujoch supports two complementary indexing strategies: + +1. **FFT-based indexing** (Rossmann-type): does not require an a priori unit cell; suitable for unknown samples. +2. **Fast-feedback indexing** (TORO-like): requires an approximate unit cell; optimized for speed and feedback. + +Both feed into a common robust refinement/selection stage which maximizes the number of inliers under an indexing tolerance. + +### 4.1 Indexed-spot decision (inlier test) + +Given a trial lattice with direct basis vectors $\mathbf{a},\mathbf{b},\mathbf{c}$ (used here as reciprocal-space dot-test vectors), fractional indices are estimated by: +$ +h_f = \mathbf{s}\cdot\mathbf{a},\quad +k_f = \mathbf{s}\cdot\mathbf{b},\quad +l_f = \mathbf{s}\cdot\mathbf{c}. +$ +Let $(h,k,l)=(\mathrm{round}(h_f),\mathrm{round}(k_f),\mathrm{round}(l_f))$ and define the fractional residual: +$ +\delta^2 = (h_f-h)^2 + (k_f-k)^2 + (l_f-l)^2. +$ +A spot is indexed if $\delta^2 \le \tau^2$, where $\tau$ is the configured tolerance. + +For indexed spots, the reciprocal lattice point $\mathbf{p} = h\mathbf{a}^*+k\mathbf{b}^*+l\mathbf{c}^*$ is used to compute $\Delta_\mathrm{Ewald}(\mathbf{p})$ (stored as a diagnostic and later used in profile-radius estimation). + +--- + +## 5. FFT indexing (unknown unit cell) + +FFT indexing follows a classical approach: detect dominant periodicities by projecting reciprocal-space points onto many directions and Fourier transforming the resulting 1D histograms. + +### 5.1 Directional projections and histograms + +Choose a set of unit vectors $\{\mathbf{u}_d\}$ on a half-sphere (a near-uniform distribution generated via a golden-angle construction). For each direction $d$, form a histogram in the scalar projection: +$ +t_{id} = \left|\mathbf{u}_d\cdot \mathbf{s}_i\right|. +$ + +Bin width is chosen approximately as: +$ +\Delta t \approx \frac{1}{2 L_\mathrm{max}}, +$ +where $L_\mathrm{max}$ is the maximum expected real-space unit-cell edge (Å). The histogram extent is tied to the maximum $q$ used (set by a high-resolution cutoff for indexing). + +### 5.2 FFT peak picking and candidate vectors + +For each direction, the FFT magnitude spectrum is computed; peaks correspond to periodicities along $\mathbf{u}_d$. Each direction yields a candidate real-space length $L$ with maximum spectral magnitude (subject to $L\ge L_\mathrm{min}$). + +Candidate vectors are $\mathbf{v}_d = L_d\,\mathbf{u}_d$. + +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. + +### 5.3 Lattice reduction and cell candidates + +Triples of candidate vectors are combined to form candidate bases $(\mathbf{A},\mathbf{B},\mathbf{C})$. A simple reduction is applied: +$ +\mathbf{B} \leftarrow \mathbf{B} - \mathrm{round}\!\left(\frac{\mathbf{B}\cdot\mathbf{A}}{\mathbf{A}\cdot\mathbf{A}}\right)\mathbf{A}, +$ +$ +\mathbf{C} \leftarrow \mathbf{C} - \mathrm{round}\!\left(\frac{\mathbf{C}\cdot\mathbf{A}}{\mathbf{A}\cdot\mathbf{A}}\right)\mathbf{A} +- \mathrm{round}\!\left(\frac{\mathbf{C}\cdot\mathbf{B}}{\mathbf{B}\cdot\mathbf{B}}\right)\mathbf{B}. +$ + +Candidates are filtered by allowed length and angle ranges. + +### 5.4 Robust refinement and best-cell selection + +Candidate bases are refined against observed spots using an iterative inlier‑focused least‑squares procedure (trimmed/contracting threshold). The output cell is chosen to: +1. maximize the number of indexed spots under the tolerance $\tau$, and +2. break ties by a refined score (smaller residual threshold/score is preferred). + +An optional reference unit cell (if supplied) restricts acceptance to cells within a relative distance tolerance in edge lengths (permutation-invariant). + +--- + +## 6. Bravais lattice / centering inference (“lattice search”) + +If the space group is supplied by the user, its lattice constraints are assumed for refinement and subsequent processing. + +If not, Jungfraujoch attempts to infer the most plausible Bravais lattice type from the metric tensor after Niggli reduction: + +1. **Niggli reduction** is performed to obtain a reduced cell in $G^6$ representation (Gruber vector). +2. The reduced cell is compared against a list of Niggli classes corresponding to Bravais lattices and centerings. +3. The highest-symmetry class that matches within tolerances is selected (relative metric tolerance and angular tolerance). + +The output includes: +- a conventional cell, +- crystal system (triclinic, monoclinic, …), +- centering symbol $P, A, B, C, I, F, R$. + +This stage provides centering information used for systematic absences in prediction (§7.3) and for reporting. + +**Note.** In ambiguous or special cases, forcing space group to $P1$ (no symmetry assumptions) is recommended. + +--- + +## 7. Geometry and lattice refinement + +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. + +### 7.1 Parameterization + +The refinement jointly optimizes, depending on mode and constraints: + +- beam center $(x_\mathrm{beam}, y_\mathrm{beam})$, +- detector distance $D$, +- detector tilt angles (two-angle model; third rotation often held at 0), +- rotation axis direction (for rotation datasets), +- crystal orientation (a global rotation), +- unit-cell parameters, with constraints determined by inferred crystal system. + +For higher symmetries, constraints are enforced, e.g. +- cubic: $a=b=c,\ \alpha=\beta=\gamma=90^\circ$, +- tetragonal: $a=b$, +- hexagonal: $a=b,\ \gamma=120^\circ$, +- monoclinic (unique axis $b$): $\alpha=\gamma=90^\circ$, $\beta$ refined. + +### 7.2 Residuals and objective + +For each indexed spot assigned integer $(h,k,l)$, compute: + +- observed reciprocal vector $\mathbf{s}_\mathrm{obs}$ from its detector position and current geometry, +- predicted reciprocal vector $\mathbf{s}_\mathrm{pred}(h,k,l;\ \text{lattice params})$. + +Residual is: +$ +\mathbf{r} = \mathbf{s}_\mathrm{obs} - \mathbf{s}_\mathrm{pred}. +$ + +A non-linear least squares solver minimizes $\sum \|\mathbf{r}\|^2$ over all selected inlier spots. + +### 7.3 Rotation datasets: bringing observations to a common reference frame + +For oscillation/rotation data, each image corresponds to a rotation angle $\phi$ about an axis $\mathbf{m}_2$. Observed reciprocal vectors are rotated “back to start” so that all images are refined in a single reference crystal frame: +$ +\mathbf{s}_\mathrm{obs,ref} = R(\phi)\,\mathbf{s}_\mathrm{obs}, +$ +with $R(\phi)$ constructed from the axis-angle representation of the goniometer model. + +### 7.4 Multi-stage tightening of inlier tolerance + +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. + +--- + +## 8. Reflection prediction + +Jungfraujoch predicts reflection positions for integration by enumerating Miller indices within a resolution cutoff and accepting those that satisfy a diffraction condition model. + +### 8.1 Enumerating reciprocal lattice points + +For a maximum resolution $d_\mathrm{min}$, accept $(h,k,l)$ such that: +$ +\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. +$ + +### 8.2 Still prediction (excitation-error cutoff) + +For still images, the diffracting condition is approximated by an excitation-error cutoff: +$ +\left|\Delta_\mathrm{Ewald}(\mathbf{p})\right| \le \Delta_\mathrm{cut}. +$ +Accepted reflections are projected to the detector by intersecting the diffracted direction $\mathbf{S}=\mathbf{S}_0+\mathbf{p}$ with the detector plane, using the current geometry. + +### 8.3 Rotation prediction (Laue equation + partiality model) + +For rotation/oscillation datasets, Jungfraujoch solves for rotation angles $\phi$ where the rotated reciprocal lattice point satisfies the Ewald-sphere condition. In an XDS-like notation, define: + +- rotation axis unit vector $\mathbf{m}_2$, +- $\mathbf{S}_0$ incident vector, +- $\mathbf{S}(\phi)=\mathbf{S}_0+\mathbf{p}(\phi)$. + +A key quantity is: +$ +\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}, +$ +which also appears in XDS as the Lorentz component linked to the rotation axis. + +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) +- +\mathrm{erf}\!\left(\frac{\phi-\Delta\phi/2}{\sqrt{2}\,\sigma_M/\zeta}\right) +\right], +$ +with mosaicity $\sigma_M$ in radians. + +Reflections are predicted if they meet minimum $\zeta$ and mosaicity-window criteria, and their predicted detector coordinates fall on the active detector area. + +### 8.4 Systematic absences (centering) + +Systematic absences are applied at least at the centering level (prior to full space-group symmetry). For centering symbol $C$: + +- $I$: absent if $h+k+l$ odd, +- $A$: absent if $k+l$ odd, +- $B$: absent if $h+l$ odd, +- $C$: absent if $h+k$ odd, +- $F$: absent if any of $h+k, h+l, k+l$ is odd, +- $R$: absent if $(-h+k+l)\bmod 3 \ne 0$, +- $P$: no centering absences. + +--- + +## 9. 2D summation integration (three-ring method) + +Jungfraujoch integrates predicted reflections by **summation** (no profile fitting), using a CrystFEL-inspired “three-circle / three-ring” method in the detector plane. + +### 9.1 Regions of interest + +For each predicted reflection at $(x_p,y_p)$, define three radii: + +- $r_1$: inner signal radius, +- $r_2$: inner background radius, +- $r_3$: outer background radius. + +Pixels are classified by their squared distance $r^2=(x-x_p)^2+(y-y_p)^2$: + +- **signal region:** $r^2 < r_1^2$, +- **background annulus:** $r_2^2 \le r^2 < r_3^2$. + +Invalid pixels (masked/bad/saturated) are excluded from both sums. + +### 9.2 Background subtraction and intensity estimate + +Let: +- $S = \sum I(x,y)$ over signal pixels, +- $n_S$ = number of valid signal pixels, +- $B = \sum I(x,y)$ over background pixels, +- $n_B$ = number of valid background pixels. + +Background per pixel: +$ +\hat{b} = \frac{B}{n_B}, +$ +integrated intensity: +$ +\hat{I} = S - n_S \hat{b}. +$ + +A reflection is accepted as “observed” only if all signal pixels were valid and $n_B$ exceeds a minimum (to avoid unstable background estimates). + +### 9.3 Uncertainty model + +A Poisson-like estimator is used for the raw summed counts: +$ +\sigma(\hat{I}) \approx \sqrt{S}, +$ +with a minimum $\sigma\ge 1$ to avoid singular weights. (This is a pragmatic online estimate; more elaborate models may be applied downstream.) + +### 9.4 Lorentz–polarization factor handling + +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 `rlp` in predictions, and used during scaling/merging (§10). + +--- + +## 10. Scaling and merging + +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. + +### 10.1 Observation model + +For an observation $j$ of a unique reflection $h$ on image (or image group) $i$, the predicted measured intensity is modeled as: +$ +I_{ij} \approx G_i \, L_{ij}\, P_{ij}\, I_h, +$ +where: + +- $G_i$ is the image scale factor, +- $L_{ij}$ is a Lorentz-like / geometry factor (stored as `rlp` or derived), +- $P_{ij}$ is a partiality term (model-dependent), +- $I_h$ is the merged (true) intensity parameter for that unique reflection. + +A least-squares objective is minimized: +$ +\sum_{ij} \left(\frac{I_{ij}^{\mathrm{pred}} - I_{ij}^{\mathrm{obs}}}{\sigma_{ij}}\right)^2 +$ +with regularization on $G_i$ and optional smoothness constraints (particularly meaningful for rotation series). + +### 10.2 Partiality models available + +Jungfraujoch supports several partiality choices: + +1. **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) + - + \mathrm{erf}\!\left(\frac{\Delta\phi_{ij}-\Delta\phi/2}{\sqrt{2}\,\sigma_{M,i}/\zeta_{ij}}\right) + \right]. + $ + Mosaicity $\sigma_{M,i}$ can be refined per image group with bounds. + +2. **Still partiality** (excitation-error proxy): + $ + P_{ij} = \exp\!\left(-\frac{\Delta_\mathrm{Ewald}^2}{R_i^2}\right), + $ + where $R_i^2$ is a refined width parameter (bounded). + +3. **Unity**: $P_{ij}=1$. + +4. **Fixed**: use the per-reflection partiality carried from prediction. + +Reflections below a minimum partiality can be rejected from merging to avoid unstable corrections. + +### 10.3 Regularization and smoothness + +To stabilize scale determination, a weak prior $G_i\approx 1$ is used. For rotation datasets, optional smoothness encourages slowly varying scales and mosaicity: +$ +\log G_{i-1} - 2\log G_i + \log G_{i+1} \approx 0, +$ +(and similarly for mosaicity), reflecting the expectation of gradual changes during a rotation scan. + +### 10.4 Merging estimator + +After refinement, corrected observations are formed: +$ +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}}. +$ + +Unique intensities are merged by inverse-variance weighted mean: +$ +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}. +$ + +An internal-consistency term can inflate uncertainties when multiple observations are present, in the spirit of XSCALE. + +### 10.5 Merging statistics + +Per-shell and overall merging statistics are computed on corrected intensities, including: +- number of observations, +- number of unique reflections, +- mean $I/\sigma(I)$, +- an R$_\mathrm{meas}$-like quantity derived from within‑HKL deviations (shell-binned). + +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. + +--- + +## 11. Mosaicity and “profile radius” monitoring + +### 11.1 Profile radius (still excitation error width) + +A simple scalar “profile radius” is estimated from indexed spots using the distribution of $\Delta_\mathrm{Ewald}$. Two estimators are available: + +- standard deviation: + $ + R \approx \sqrt{\frac{1}{N}\sum_i \Delta_{\mathrm{Ewald},i}^2}, + $ +- robust MAD-based alternative (median absolute deviation), scaled by 1.4826. + +Operationally, predictions for still data may use a cutoff proportional to this width (e.g. $\Delta_\mathrm{cut}\approx 2R$). + +### 11.2 Mosaicity from rotation data (maximum likelihood) + +For rotation data, Jungfraujoch can estimate mosaicity by maximizing a likelihood based on the XDS reflection fraction $R(\tau;\sigma_M/\zeta)$ as described by Kabsch (2010). In brief: + +- compute angular deviations $\tau$ from predicted Bragg positions, +- compute $\zeta$ for each reflection, +- maximize $\sum \log R(\tau)$ over $\sigma_M$. + +This yields a physically meaningful mosaicity estimate tied to the rotation partiality model. + +--- + +## 12. Wilson statistics and French–Wilson treatment + +### 12.1 Per-shell ⟨I/σ(I)⟩ + +For monitoring integration quality, Jungfraujoch reports mean $\langle I/\sigma(I)\rangle$ in a fixed number of resolution shells. Shelling is performed in $1/d^2$ space (typical of crystallographic practice). + +### 12.2 Wilson plot (B-factor proxy) + +A Wilson-type analysis is computed by binning intensities by resolution and fitting: +$ +\langle I\rangle \propto \exp\!\left(-\frac{B}{2}\frac{1}{d^2}\right), +$ +i.e. +$ +\log \langle I\rangle = \mathrm{const} - \frac{B}{2}\left(\frac{1}{d^2}\right). +$ +A linear regression of $\log\langle I\rangle$ vs $1/d^2$ provides an estimate of $B$, subject to basic quality checks (e.g. $R^2$ threshold). + +### 12.3 French–Wilson (posterior expectation of I and |F|) + +To mitigate negative intensities and obtain physically meaningful amplitudes, Jungfraujoch implements a French–Wilson style Bayesian treatment using per-shell mean intensity as a prior scale. + +For each merged observation $I_\mathrm{obs}$ with uncertainty $\sigma$, the posterior over true intensity $I\ge 0$ is: +$ +p(I\mid I_\mathrm{obs}) \propto p(I)\,\exp\!\left(-\frac{(I_\mathrm{obs}-I)^2}{2\sigma^2}\right), +$ +with priors differing between acentric and centric cases (standard Wilson distributions). + +Numerical quadrature over a scaled intensity variable is used to compute posterior moments: +- $\langle I\rangle$, +- $\langle |F|\rangle = \langle \sqrt{I}\rangle$, + and an amplitude uncertainty estimate via: + $ + \sigma_F \approx \sqrt{\langle I\rangle - \langle |F|\rangle^2}. + $ + +--- + +## 13. Practical notes and limitations + +- **No profile fitting** 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. +- **Space-group symmetry** beyond centering absences is not necessarily enforced during prediction/integration unless the space group is supplied and used downstream. +- **Resolution masking and ice rings** are controllable; including ice-ring spots in indexing can improve robustness for some samples but may bias refinement in others. +- **Rotation vs still modes** differ substantially in prediction and scaling because partiality is angle-driven in rotation data and excitation-error-driven in still data. + +--- diff --git a/_sources/DEPLOYMENT.md.txt b/_sources/DEPLOYMENT.md.txt new file mode 100644 index 00000000..fb91982c --- /dev/null +++ b/_sources/DEPLOYMENT.md.txt @@ -0,0 +1,159 @@ +# Deployment + +To deploy Jungfraujoch, one needs to follow four steps: + +1. Install main Jungfraujoch code and frontend web interface +2. Flash the U55C FPGA card with a proper image and install Linux kernel driver +3. Install Jungfraujoch writer +4. Install Python OpenAPI client + +Installation procedure depend a lot on the operating system. For RedHat Enterprise Linux 8, Rocky 8, or compatible +installation can be done with prebuilt RPMs and is relatively straightforward. For other systems one needs to build +software from source. Both ways will be presented. + + +## Install main Jungfraujoch code and frontend web interface + +On RHEL 8 systems there is a `jfjoch--1.el8.x86_64.rpm` that needs to be installed and contains all the necessary software and web interface. + +On other OSes one needs to compile Jungfraujoch from source (from the repo directory): +``` +$ mkdir build +$ cd build +$ cmake .. -DCMAKE_INSTALL_PREFIX= +$ make +$ sudo make install +``` +For manual installation, we recommend to use non-standard directory (like `/opt/jfjoch`), to facilitate upgrades and removal. +For DKMS to manage kernel module sources it is necessary to copy driver sources to `/usr/src/jfjoch-` directory. This requires extra flag in cmake `-DJFJOCH_INSTALL_DRIVER_SOURCE=ON`. + +Frontend web user interface has to be built separately with: +``` +$ cd build +$ make frontend +``` +Frontend files (.html and .js) will be placed in `frontend/dist` (outside of `build/` directory!) and has to be copied to a general location, e.g. `/usr/local/jfjoch/frontend` or `/opt/jfjoch/frotend`. + +## Flash the U55C FPGA card with a proper image and install Linux kernel driver. + +### Firmware flashing +1. Check that the card is detected by OS with "lspci |grep Xilinx" and check the PCIe bus/device/function (BDF) number, `11:00.0` in this case: +``` +$ lspci |grep Xilinx +23:00.0 Processing accelerators: Xilinx Corporation Device 3450 (rev 2) +``` +Note the device number `3450` that identifies Jungfraujoch device (Jungfraujoch pass is 3450 m above sea level) and `rev 2` identifying release of the firmware. + +2. Check the speed of the card, that it is detected as PCIe Gen4x8 device (needs to be done as root, otherwise configuration details are not given): +``` +$ sudo lspci -vv -s +23:00.0 Processing accelerators: Xilinx Corporation Device 3450 +(...) +LnkSta: Speed 16GT/s (ok), Width x8 (ok) +(...) +``` + +3. Download the MCS image from release files or build it using Vivado (WARNING! building time can be about 8 hours and doesn't allways reach correct timing). +4. Flash the card with `xbflash.qspi` tool (part of Jungfraujoch). For fresh card use: +``` +sudo xbflash.qspi --primary --card --bar-offset 0x1f06000 +``` +For card that was already flashed with Jungfraujoch images: + +``` +sudo xbflash.qspi --primary --card +``` +It is necessary to confirm the operation by pressing `Y` key or one can add `--force` option to avoid confirmation. +It is safe to run multiple flashing processes in parallel for different cards, for example in separate screen sessions. + +5. Cold reboot: +``` +sudo ipmitool chassis power cycle +``` + +### Install PCIe driver + +For first run it is though recommended to try the driver without installing to the kernel directory: +``` +$ cd fpga/pcie_driver +$ make +$ sudo insmod jfjoch.ko +``` + +Check with `dmesg` that the device was properly found: +``` +$ dmesg |grep jfjoch +[ 431.624933] jfjoch 0000:23:00.0: enabling device (0140 -> 0142) +[ 431.919147] misc jfjoch0: Jungfraujoch FPGA loaded with FW build: 5610030a +``` + +If things work, it is recommended to install the driver with DKMS, so it is rebuilt for kernel updates. +On RHEL 8 you can install prebuilt RPM provided in the Gitlab package registry. On other systems follow procedure in +[PCIe driver](FPGA_PCIE_DRIVER.md). + +NOTE: Driver installation procedure on non-RHEL 8 systems is not well understood/optimized at the moment. + +NOTE: In case driver is included in the init RAM-disk image, it is necessary to rebuild the RAM-disk if driver is updated: +``` +$ sudo dracut -f +``` +### Configure network +Configure switch according to [FPGA network guide](FPGA_NETWORK.md) - specifically set manual speed and turn off auto-negotiation +for the port used to connect U55C card and connect card to switch. + +### Running Jungfraujoch software +Main Jungfraujoch service is called `jfjoch_broker`. It is responsible for handling data from FPGAs, doing processing, analysis, compression and sending images on ZeroMQ output. +It is recommended to run the service as `systemd` service. + +`jfjoch_broker` takes two parameters: JSON configuration file and HTTP port (default is 5232). +Example JSON files are placed in `etc/` folder. JSON file format is also explained in the OpenAPI definition, as `jfjoch_settings` data structure. + +When running the service can be accessed via HTTP interface from a web browser for configuration and monitoring. + +To prepare the configuration file one also needs to reference calibration files: gain files for PSI JUNGFRAU and trim-bit files for PSI EIGER. +These need to be obtained from the PSI Detector Group. + +### Card verification + +To test that FPGA board is working properly without access to a JUNGFRAU detector, you can use `jfjoch_fpga_test` tool. +For example to simulate 10M pixel system with 4 FPGA cards and 200k images on a 2 CPU system with 2 GPUs: +``` +jfjoch_fpga_test ~/nextgendcu/ -m20 -s4 -i 200000 -Pn2g2 +``` +Or 1M pixel system with one FPGA card: +``` +jfjoch_fpga_test ~/nextgendcu/ -m2 -s1 -i 200000 +``` + +## Install Jungfraujoch writer +Jungfraujoch writer is an additional service, that can connect to `jfjoch_broker` ZeroMQ interface and writes files according to NeXus/NXmx HDF5 standard. + +At the moment it is better to have a separate machine, with access to distributed file system, for writing images. + +Writer can be installed with a dedicated RPM file or compiled from source. For compilation, you can use the following commands: +``` +mkdir build +cd build +cmake -DJFJOCH_WRITER_ONLY=ON -DCMAKE_INSTALL_PREFIX= .. +make jfjoch +``` + +## Install Jungfraujoch image viewer +Jungfraujoch viewer is X-ray diffraction image viewer, that is optimized to open Jungfraujoch HDF5 files. + +The viewer is a Qt application and it requires recent version of the library, therefore it is an optional dependency. + +To include it in the building of Jungfraujoch use `-DJFJOCH_VIEWER_BUILD=ON` directive for CMake: +``` +mkdir build +cd build +cmake -DJFJOCH_VIEWER_BUILD=ON -DCMAKE_INSTALL_PREFIX= .. +make jfjoch +``` + + +## Install Jungfraujoch Python client +Use pip: +```shell +pip install jfjoch-client +``` \ No newline at end of file diff --git a/_sources/DETECTORS.md.txt b/_sources/DETECTORS.md.txt new file mode 100644 index 00000000..4e817fe3 --- /dev/null +++ b/_sources/DETECTORS.md.txt @@ -0,0 +1,13 @@ +# Supported detectors + +## PSI detectors +Jungfraujoch supports PSI JUNGFRAU and PSI EIGER detectors. Jungfruajoch controls the detector via statically compiled `slsDetectorPackage` into its source code. +It is important that detector firmware has to match `slsDetectorPackage` version used in Jungfraujoch (8.0.2 at the moment). +See [PSI Detector group website](https://www.psi.ch/en/lxn/software-releases) for details. + +# DECTRIS detectors + +Jungfraujoch can be used with DECTRIS detectors, as a data analysis tool. +In this solution Jungfraujoch controls the Detector Control Unit (DCU) of the detector, and handles output data stream of the DCU. +This mode, called "lite" mode, doesn't use FPGA boards, but mostly CPUs and GPUs for indexing. +The mode is currently experimental and intended for low data rates (100 Hz). diff --git a/_sources/DETECTOR_GEOMETRY.md.txt b/_sources/DETECTOR_GEOMETRY.md.txt new file mode 100644 index 00000000..15534556 --- /dev/null +++ b/_sources/DETECTOR_GEOMETRY.md.txt @@ -0,0 +1,24 @@ +# Detector geometry + +At the moment Jungfraujoch supports solely flat detectors. The default option is to place modules in their actual location +vs. detector frame. It is not recommended to place detector modules stacked. + +The simplest case is detector perpendicular to the beam. In this case it is enough to provide beam center, detector distance +and wavelength. + +For more complex case, one can provide tilt of the detector rotation in PyFAI convention. +This convention uses Point Of Nominal Interaction (PONI) definition. Beam X and Y would correspond to the location on the detector, +where beam from the sample is perpendicular to the detector surface and not to the actual direct beam location. Then tilt of the detector +is defined with three rotation angles: `rot1` (rotating detector right), `rot2` (rotating detector downwards), `rot3` (rotating detector clockwise). +See [PyFAI documentation](https://pyfai.readthedocs.io/en/stable/) for more details. + +## Macromolecular crystallography convention for the vertical direction +One place of confusion is the convention to have point (0,0) of the detector in the top left corner of the detector, +with Y values increasing downwards. This is also consistent with computer image formats. + +However, other techniques (as well as internal operation of PSI X-ray detectors) might follow convention, for point (0,0) +being in the bottom left corner and Y values increasing upwards. Such a convention is used, for example, by PyFAI. + +In general, convention is controlled in Jungfraujoch with a setting in the JSON configuration file, which allows mirroring detector in Y. + +Extra care has to be taken by the user to ensure that no errors are made. \ No newline at end of file diff --git a/_sources/FPGA.md.txt b/_sources/FPGA.md.txt new file mode 100644 index 00000000..61a4fcc7 --- /dev/null +++ b/_sources/FPGA.md.txt @@ -0,0 +1,81 @@ +# FPGA smartNIC + +See separate document for [installation instructions](DEPLOYMENT.md). + +## Hardware +Currently supported FPGA is only **Xilinx Alveo U55C**. + +See AMD/Xilinx webpage for [card user guide (UG1469)](https://docs.xilinx.com/r/en-US/ug1469-alveo-u55c). +According to the user guide: +``` +Alveo data center accelerator cards are designed to be installed into a data center server, where controlled air flow provides direct cooling. +``` + +Card needs to be placed in PCI Express (PCIe) Gen4 x8 slot, though mechanically slot has to accommodate x16 card. +There is no need to connect additional power cable, as power of the card is not exceeding 75 W load available from PCIe edge connector. +Current power estimation is about 30 W when idle and 45 W in operation. The card has built-in protection, which will cut power to the card if HBM temperature is above 120°C. + +Two variants of the card are available: +* `100g` - this variant operates one port in 100 Gbit/s mode and should be used when connecting detector via a switch. +* `8x10g` - this variant operates both QSFP ports at 4x10 Gbit/s. QSFP+ (40 Gbit/s) transceivers and MTO/MTP harness cables +are necessary. It is designed for detector directly connected to the Jungfraujoch server, without switch. + +See [network documentation](FPGA_NETWORK.md) for details of network. + +## Building firmware +Xilinx Vivado version has to precisely match version described in [the system requirements](../README.md. +only when `vivado` and `vitis_hls` are detected in the path. + +### Xilinx Vivado +The following procedures require having AMD (Xilinx) Vivado and Vitis HLS toolsets version **2022.2** installed on the machine. +Due to the nature of TCL scripts used to generate board designs Vivado version has to exactly match one provided above - +specifically newer versions of Vivado will not work. + +In additional to Intellectual Property (IP) cores included in Vivado, two additional licenses are necessary: +* Non-cost license for Ultrascale+ 100G core has to be requested from AMD/Xilinx website, see [Xilinx website](https://www.xilinx.com/products/intellectual-property/cmac_usplus.html), to build `100g` design. +* Paid 10G/25G Subsystem for Ultrascale+ to build `8x10g` design. +PSI received non-cost licenses from Xilinx University Program for the latter cores. Therefore, usage of bitstreams +generated by PSI continuous integration pipeline for `8x10g` is only allowed for non-commercial use. +### HLS compilation +Make HLS routines: +``` +mkdir build +cd build +cmake .. +make hls +``` + +### Synthesis +Create PCIe `100g` bitstream with the following command: +``` +mkdir build +cd build +cmake .. +make pcie_100g +``` +and `8x10g`: +``` +mkdir build +cd build +cmake .. +make pcie_8x10g +``` +### When Vivado is not present + +During CMake execution, the following executables: `vivado` and `vitis_hls` must be present in the path. +If not, build targets will not be generated, and such or similar error message will show up: +``` +$ make pcie_100g +make: *** No rule to make target 'pcie_100g'. Stop. +``` + +### Gitlab CI +If Gitlab CI is properly set-up, firmware will be automatically built for every commit that starts with FPGA. +Built firmware should be downloaded as MCS files. + +### Frame generator + +Jungfraujoch card is equipped with frame generator. It allows to simulate JUNGFRAU detector without having access to such system. +It is placed in parallel to Ethernet MAC - so it is placed before the network stack and before any processing happening on the card. +In the future a redirection will be possible to send the simulated stream through the 100G TX network link. +Frame generator is written in HLS and controlled with AXI-Lite. \ No newline at end of file diff --git a/_sources/FPGA_DATA_ANALYSIS.md.txt b/_sources/FPGA_DATA_ANALYSIS.md.txt new file mode 100644 index 00000000..493ca232 --- /dev/null +++ b/_sources/FPGA_DATA_ANALYSIS.md.txt @@ -0,0 +1,74 @@ +# FPGA data analysis + +Jungfraujoch FPGA design has incorporated X-ray diffraction image analysis capabilities. + +## Pixel mask +Pixels can be masked. For each module a 32-bit map of pixels is loaded to FPGA, with non-zero value meaning masked pixels. +According to this map, pixels will be assigned a special value (minimum number for signed types and maximum number for non-signed types) +and will be excluded from a subsequent analysis. + +## ADU histogram +Before conversion to photons/energy, an ADU histogram can be calculated for a module. This allows to preserve some signature +of unconverted values. This is done on a module-basis and works with bins with 32 ADU width. + +For EIGER this can be used as just a histogram procedure. + +## JUNGFRAU conversion +For JUNGFRAU module images are converted from ADUs to energy value and divided by a given number to keV units. +Result of the operation is rounded to integers. + +## Pixel thresholding +Pixel range can be specified. +Pixels below a minimum threshold will be assigned zero. +Pixels above a maximum threshold will be assigned saturated pixel value (the largest number for a given bit-width and sign type). +This is specifically designed to operate on unsummed frames, so frame-specific parameters (overload/noise) can be handled. + +## Frame summation +Frames can be summed together (on a per-module basis) in Jungfraujoch, with a limit of 256 frames added together. + +## Azimuthal integration +To implement azimuthal integration, FPGA is able to sum pixels based on a provided integration map and per-pixel corrections. +This way Jungfraujoch implements azimuthal integration with solid angle and polarization corrections. +Corrections were implemented according to formulas developed by [Jensen et al. (J. Synchr. Rad., 29, 1420-1428, 2022)](https://journals.iucr.org/s/issues/2022/06/00/fv5148/). + +Given FPGA limitations, split-pixels cannot be implemented and number of bins is limited as 1024 per detector module. +This way 2D azimuthal integration, as needed for example by SAS-TT, cannot be currently implemented with the FPGA card and needs to be done on a CPU. +One needs to be careful with per-pixel corrections - their acceptable range is constrained by 16-bit pixed point integer implementation +and is tuned for standard SAXS/WAXS range. + +## Spot finding +Jungfraujoch FPGA implements a built-in spot finder. Spot finder allows to apply the following criteria for finding strong pixels: +1. Resolution criterion - pixels only within a provided resolution range can be considered as strong pixels (calculating resolution map needs to happen on CPU before data collection run). +2. Bad pixels - pixels marked as bad, as well as chip edges and module edges are excluded from spot finding, +3. Overloads - pixels marked as overloads on JUNGFRAU are always included in the strong pixel output, but are excluded for signal-to-noise ratio calculation, +4. Pixel value - pixels above certain threshold value can be marked as strong, +5. Signal-to-noise (SNR) ratio - pixels with SNR above a threshold can be marked as strong, +6. Connected pixels - strong pixels can be discarded if they are "alone", so their 8 directly neighboring pixels are not counted as strong pixels. + +While besides bad pixels criterion, all the above are optional (can be turned off), only pixels that fulfill all enabled criteria are selected as strong pixels. + +### SNR ratio calculation +Signal-to-noise ratio is calculated for a rectangular area. +In horizontal direction the area is fixed - line of 1024 pixels is divided into 32 areas each of 32 pixels. +This is dictated by the data flow within the FPGA. +In vertical direction the area is flexible - it is 15 lines above and below of the given pixel. +Given very large box size, approximation are made, for example that `N ≈ N-1` in calculating standard deviation. + +## Region-of-interest (ROI) integration +Each pixel in a module can be assigned to one of 64 ROIs. For each ROIs, sum, sum of squares, max count, and number of valid pixels will be calculated. +Jungfraujoch also calculates X and Y values weighted by pixel values, though this feature is not properly tested at the moment and not integrated in downstream analysis. + +## Pixel statisitics +The following statistics are collected for each module: +* Number of masked pixels +* Number of saturated pixels (excl.masked) +* Number of error pixels (excl. masked) +* Sum of valid pixels in the module +* Minimum value of valid pixels in the module +* Maximum value of valid pixels in the module +Valid pixels are not masked, not saturated, not error pixels. + +## Square root compression +Jungfraujoch FPGA includes lossy compression preserving counting statistic properties of X-ray image, while reducing bit width of an image. +Scheme was described in [Wakonig et al., J. Appl. Cryst., 53, 574-586, 2020](https://doi.org/10.1107/S1600576720001776). +Pixel value `X` is replaced with `sqrt(N*X)`, where `N` is integer constant in range 1 to 16. diff --git a/_sources/FPGA_DESIGN.md.txt b/_sources/FPGA_DESIGN.md.txt new file mode 100644 index 00000000..56cd1c19 --- /dev/null +++ b/_sources/FPGA_DESIGN.md.txt @@ -0,0 +1,21 @@ +# FPGA data flow + +The following steps are performed on FPGA (in the order of operation): + +1. UDP header decoding +2. SLS detector header decoding +3. State machine that controls data acquisition (start/stop/cancel) +4. High-bandwidth memory cache to buffer network packets and reorder them to form full modules +5. ADU histogram for JUNGFRAU +6. Mask pixels from missing packets with special value +7. Reorder lines for EIGER to form a proper module +8. Mask pixels based on provided pixel mask +9. JUNGFRAU conversion with gain and pedestal corrections +10. Threshold to zero pixels below certain count value +11. Integration according to predefined map (e.g., 1D azimuthal integration) +12. Spot finding +13. ROI calculation +14. Image lossy compression using N*sqrt(pixel) values +15. Send images, analysis results and metadata to host memory via PCI Express + +Each step has dedicated core, written in the high-level synthesis. Exact operation of cores for data analysis is explained in dedicated [document](FPGA_DATA_ANALYSIS.md). \ No newline at end of file diff --git a/_sources/FPGA_LICENSE.md.txt b/_sources/FPGA_LICENSE.md.txt new file mode 100644 index 00000000..540a9605 --- /dev/null +++ b/_sources/FPGA_LICENSE.md.txt @@ -0,0 +1,295 @@ +# FPGA license + +FPGA components of Jungfraujoch are licensed using OHL-S license. See full text below. +The license is equivalent of GNU Public License with adaptations for hardware. +See [OHL webpage](https://ohwr.org/project/cernohl/-/wikis/Documents/CERN-OHL-version-2) for details and FAQs. + +## CERN Open Hardware Licence Version 2 - Strongly Reciprocal + + +Preamble + +CERN has developed this licence to promote collaboration among +hardware designers and to provide a legal tool which supports the +freedom to use, study, modify, share and distribute hardware designs +and products based on those designs. Version 2 of the CERN Open +Hardware Licence comes in three variants: CERN-OHL-P (permissive); and +two reciprocal licences: CERN-OHL-W (weakly reciprocal) and this +licence, CERN-OHL-S (strongly reciprocal). + +The CERN-OHL-S is copyright CERN 2020. Anyone is welcome to use it, in +unmodified form only. + +Use of this Licence does not imply any endorsement by CERN of any +Licensor or their designs nor does it imply any involvement by CERN in +their development. + + +1 Definitions + +1.1 'Licence' means this CERN-OHL-S. + +1.2 'Compatible Licence' means + +a) any earlier version of the CERN Open Hardware licence, or + +b) any version of the CERN-OHL-S, or + +c) any licence which permits You to treat the Source to which + it applies as licensed under CERN-OHL-S provided that on + Conveyance of any such Source, or any associated Product You + treat the Source in question as being licensed under + CERN-OHL-S. + +1.3 'Source' means information such as design materials or digital +code which can be applied to Make or test a Product or to +prepare a Product for use, Conveyance or sale, regardless of its +medium or how it is expressed. It may include Notices. + +1.4 'Covered Source' means Source that is explicitly made available +under this Licence. + +1.5 'Product' means any device, component, work or physical object, +whether in finished or intermediate form, arising from the use, +application or processing of Covered Source. + +1.6 'Make' means to create or configure something, whether by +manufacture, assembly, compiling, loading or applying Covered +Source or another Product or otherwise. + +1.7 'Available Component' means any part, sub-assembly, library or +code which: + +a) is licensed to You as Complete Source under a Compatible + Licence; or + +b) is available, at the time a Product or the Source containing + it is first Conveyed, to You and any other prospective + licensees + +i) as a physical part with sufficient rights and + information (including any configuration and + programming files and information about its + characteristics and interfaces) to enable it either to + be Made itself, or to be sourced and used to Make the + Product; or +ii) as part of the normal distribution of a tool used to + design or Make the Product. + +1.8 'Complete Source' means the set of all Source necessary to Make +a Product, in the preferred form for making modifications, +including necessary installation and interfacing information +both for the Product, and for any included Available Components. +If the format is proprietary, it must also be made available in +a format (if the proprietary tool can create it) which is +viewable with a tool available to potential licensees and +licensed under a licence approved by the Free Software +Foundation or the Open Source Initiative. Complete Source need +not include the Source of any Available Component, provided that +You include in the Complete Source sufficient information to +enable a recipient to Make or source and use the Available +Component to Make the Product. + +1.9 'Source Location' means a location where a Licensor has placed +Covered Source, and which that Licensor reasonably believes will +remain easily accessible for at least three years for anyone to +obtain a digital copy. + +1.10 'Notice' means copyright, acknowledgement and trademark notices, +Source Location references, modification notices (subsection +3.3(b)) and all notices that refer to this Licence and to the +disclaimer of warranties that are included in the Covered +Source. + +1.11 'Licensee' or 'You' means any person exercising rights under +this Licence. + +1.12 'Licensor' means a natural or legal person who creates or +modifies Covered Source. A person may be a Licensee and a +Licensor at the same time. + +1.13 'Convey' means to communicate to the public or distribute. + + +2 Applicability + +2.1 This Licence governs the use, copying, modification, Conveying +of Covered Source and Products, and the Making of Products. By +exercising any right granted under this Licence, You irrevocably +accept these terms and conditions. + +2.2 This Licence is granted by the Licensor directly to You, and +shall apply worldwide and without limitation in time. + +2.3 You shall not attempt to restrict by contract or otherwise the +rights granted under this Licence to other Licensees. + +2.4 This Licence is not intended to restrict fair use, fair dealing, +or any other similar right. + + +3 Copying, Modifying and Conveying Covered Source + +3.1 You may copy and Convey verbatim copies of Covered Source, in +any medium, provided You retain all Notices. + +3.2 You may modify Covered Source, other than Notices, provided that +You irrevocably undertake to make that modified Covered Source +available from a Source Location should You Convey a Product in +circumstances where the recipient does not otherwise receive a +copy of the modified Covered Source. In each case subsection 3.3 +shall apply. + + You may only delete Notices if they are no longer applicable to + the corresponding Covered Source as modified by You and You may + add additional Notices applicable to Your modifications. + Including Covered Source in a larger work is modifying the + Covered Source, and the larger work becomes modified Covered + Source. + +3.3 You may Convey modified Covered Source (with the effect that You +shall also become a Licensor) provided that You: + +a) retain Notices as required in subsection 3.2; + +b) add a Notice to the modified Covered Source stating that You + have modified it, with the date and brief description of how + You have modified it; + +c) add a Source Location Notice for the modified Covered Source + if You Convey in circumstances where the recipient does not + otherwise receive a copy of the modified Covered Source; and + +d) license the modified Covered Source under the terms and + conditions of this Licence (or, as set out in subsection + 8.3, a later version, if permitted by the licence of the + original Covered Source). Such modified Covered Source must + be licensed as a whole, but excluding Available Components + contained in it, which remain licensed under their own + applicable licences. + + +4 Making and Conveying Products + +You may Make Products, and/or Convey them, provided that You either +provide each recipient with a copy of the Complete Source or ensure +that each recipient is notified of the Source Location of the Complete +Source. That Complete Source is Covered Source, and You must +accordingly satisfy Your obligations set out in subsection 3.3. If +specified in a Notice, the Product must visibly and securely display +the Source Location on it or its packaging or documentation in the +manner specified in that Notice. + + +5 Research and Development + +You may Convey Covered Source, modified Covered Source or Products to +a legal entity carrying out development, testing or quality assurance +work on Your behalf provided that the work is performed on terms which +prevent the entity from both using the Source or Products for its own +internal purposes and Conveying the Source or Products or any +modifications to them to any person other than You. Any modifications +made by the entity shall be deemed to be made by You pursuant to +subsection 3.2. + + +6 DISCLAIMER AND LIABILITY + +6.1 DISCLAIMER OF WARRANTY -- The Covered Source and any Products +are provided 'as is' and any express or implied warranties, +including, but not limited to, implied warranties of +merchantability, of satisfactory quality, non-infringement of +third party rights, and fitness for a particular purpose or use +are disclaimed in respect of any Source or Product to the +maximum extent permitted by law. The Licensor makes no +representation that any Source or Product does not or will not +infringe any patent, copyright, trade secret or other +proprietary right. The entire risk as to the use, quality, and +performance of any Source or Product shall be with You and not +the Licensor. This disclaimer of warranty is an essential part +of this Licence and a condition for the grant of any rights +granted under this Licence. + +6.2 EXCLUSION AND LIMITATION OF LIABILITY -- The Licensor shall, to +the maximum extent permitted by law, have no liability for +direct, indirect, special, incidental, consequential, exemplary, +punitive or other damages of any character including, without +limitation, procurement of substitute goods or services, loss of +use, data or profits, or business interruption, however caused +and on any theory of contract, warranty, tort (including +negligence), product liability or otherwise, arising in any way +in relation to the Covered Source, modified Covered Source +and/or the Making or Conveyance of a Product, even if advised of +the possibility of such damages, and You shall hold the +Licensor(s) free and harmless from any liability, costs, +damages, fees and expenses, including claims by third parties, +in relation to such use. + + +7 Patents + +7.1 Subject to the terms and conditions of this Licence, each +Licensor hereby grants to You a perpetual, worldwide, +non-exclusive, no-charge, royalty-free, irrevocable (except as +stated in subsections 7.2 and 8.4) patent licence to Make, have +Made, use, offer to sell, sell, import, and otherwise transfer +the Covered Source and Products, where such licence applies only +to those patent claims licensable by such Licensor that are +necessarily infringed by exercising rights under the Covered +Source as Conveyed by that Licensor. + +7.2 If You institute patent litigation against any entity (including +a cross-claim or counterclaim in a lawsuit) alleging that the +Covered Source or a Product constitutes direct or contributory +patent infringement, or You seek any declaration that a patent +licensed to You under this Licence is invalid or unenforceable +then any rights granted to You under this Licence shall +terminate as of the date such process is initiated. + + +8 General + +8.1 If any provisions of this Licence are or subsequently become +invalid or unenforceable for any reason, the remaining +provisions shall remain effective. + +8.2 You shall not use any of the name (including acronyms and +abbreviations), image, or logo by which the Licensor or CERN is +known, except where needed to comply with section 3, or where +the use is otherwise allowed by law. Any such permitted use +shall be factual and shall not be made so as to suggest any kind +of endorsement or implication of involvement by the Licensor or +its personnel. + +8.3 CERN may publish updated versions and variants of this Licence +which it considers to be in the spirit of this version, but may +differ in detail to address new problems or concerns. New +versions will be published with a unique version number and a +variant identifier specifying the variant. If the Licensor has +specified that a given variant applies to the Covered Source +without specifying a version, You may treat that Covered Source +as being released under any version of the CERN-OHL with that +variant. If no variant is specified, the Covered Source shall be +treated as being released under CERN-OHL-S. The Licensor may +also specify that the Covered Source is subject to a specific +version of the CERN-OHL or any later version in which case You +may apply this or any later version of CERN-OHL with the same +variant identifier published by CERN. + +8.4 This Licence shall terminate with immediate effect if You fail +to comply with any of its terms and conditions. + +8.5 However, if You cease all breaches of this Licence, then Your +Licence from any Licensor is reinstated unless such Licensor has +terminated this Licence by giving You, while You remain in +breach, a notice specifying the breach and requiring You to cure +it within 30 days, and You have failed to come into compliance +in all material respects by the end of the 30 day period. Should +You repeat the breach after receipt of a cure notice and +subsequent reinstatement, this Licence will terminate +immediately and permanently. Section 6 shall continue to apply +after any termination. + +8.6 This Licence shall not be enforceable except by a Licensor +acting as such, and third party beneficiary rights are +specifically excluded. \ No newline at end of file diff --git a/_sources/FPGA_NETWORK.md.txt b/_sources/FPGA_NETWORK.md.txt new file mode 100644 index 00000000..cad5e8d4 --- /dev/null +++ b/_sources/FPGA_NETWORK.md.txt @@ -0,0 +1,39 @@ +# FPGA network + +The U55C card is equipped with two network connectors - QSFP0 is the upper port and QSFP1 is lower port (when PCIe connector is on the bottom). +The card FPGA design is offered in two variants `100g` and `8x10g`. These have different behavior regarding the network: + +`100g` this variant operates QSFP0 port in 100 Gbit/s mode and should be used when connecting detector via a **switch**. +QSFP28 transceivers are necessary. + +`8x10g` this variant operates both QSFP ports at 4x10 Gbit/s. QSFP+ (40 Gbit/s) transceivers and MTO/MTP harness cables + are necessary. It is designed for **detector directly connected** to the Jungfraujoch server, without switch. + +## Transceivers +AMD doesn't provide transceiver compatibility matrix for Alveo U55C. +In our experience operating the card we haven't seen issues with transceivers from various providers (FS.com, Mellanox, Finnisar). +We have also successfully operated card with correct direct attach cables instead of fiber optics. Given the card doesn't +support link training functionality of 100 Gbit/s ethernet, it could result in performance problems with copper cables, though we haven't +encountered such a situation. + +## Switch configuration +Special care has to be taken for switch operation, given the FPGA core doesn't support auto-negotiation. It is necessary to configure switch port +to fixed speed (100 Gbit/s or 10 Gbit/s) and to disable auto-negotiation. It is also necessary to enable jumbo frames (MTU of 9000). + +## Network LEDs +Each QSFP connector is equipped with green and orange LEDs. These LEDs are connected to Ethernet physical layer status port (rx_status). +LED on corresponds to having a physical connection to a switch/computer/detector on the other side of the network. +For 100 Gbit/s only green is used, for 8x10 Gbit/s green LEDs means all ports connected, orange LEDs at least one of the ports connected. + +## Network stack +Each Ethernet link has its own basic network stack. Functionality for Ethernet/ARP/IPv4/ICMP is therefore separately handled for each port. +Each link will get dedicated MAC address, and IPv4 addresses can be also assigned independently if needed. + +The card will send gratuitous ARP messages every 5 seconds to keep its entry in switch MAC table. +The card will also reply to ARP requests for its IP and to ICMP ping requests sent with the card IPv4 address. +The card won't respond to broadcast ICMP pings. + +Each link can be put in `direct` mode. In this case destination Ethernet MAC and IPv4 addresses are not enforced for incoming UDP packets. +This settings should be used for connecting detector modules directly to the FPGA card, so any detector module can be connected to any +10 Gbit/s link on the same card. Currently `direct` mode is turned OFF for `100g` design and ON for `8x10g` design. +This can be manually adjusted for each link. \ No newline at end of file diff --git a/_sources/FPGA_PCIE_DRIVER.md.txt b/_sources/FPGA_PCIE_DRIVER.md.txt new file mode 100644 index 00000000..743d7f24 --- /dev/null +++ b/_sources/FPGA_PCIE_DRIVER.md.txt @@ -0,0 +1,100 @@ +# FPGA PCIe driver + +## Compilation +To compile kernel module type: +``` +make +``` + +## Installation +To install kernel module, you need to have root permissions and run: +``` +sudo make install +``` + +## Loading driver into kernel +After installing the kernel driver, it should be possible to insert it into the kernel via: +``` +modprobe jfjoch +``` + +## Ownership of the character devices +By default, character devices `/dev/jfjoch` are owned by root (user/group) and are not accessible by others. +This means that `jfjoch_broker` must be running as superuser, which might not be optimal for security reasons in most cases. +The behavior can be changed by creating `udev` rules. Create a file called `/etc/udev/rules.d/99-jfjoch.rules` +with the following content: +``` +KERNEL=="jfjoch*" OWNER="" GROUP="" +``` +It is OK to provide only group, for example to make the devices accessible by group `jungfrau`: +``` +KERNEL=="jfjoch*" GROUP="jungfrau" +``` + +## DKMS +To avoid problems with updating the kernel, it is possible to use DKMS to autobuild Jungfraujoch kernel +module, when new kernel is installed. For RHEL 8 it is well tested to use the RPM module built automatically from Jungfraujoch source. +For other systems, it is necessary to follow the procedure below, though it is not well tested. + +This first requires to install DKMS - for RHEL it is available via EPEL repository: +``` +sudo dnf install dkms +``` +Then use script provided in the driver directory to copy driver code to DKMS directory: +``` +./install_dkms.sh +``` +If upgrading the driver, please first remove current driver from DKMS system: +``` +dkms remove jfjoch -v --all +``` + +## Driver parameters +Currently, there is one driver parameter `nbuffers`, that defines count of exchange buffers (see below). +This can be adjusted in the modprobe operation, for example: +``` +modprobe jfjoch nbuffers=1024 +``` + +## Exchange buffers +The parameter defines number of buffers used to exchange data between card and host application. +Each buffer can hold one detector module (1024x512) in 16-bit or 32-bit mode + associated processing results and metadata. +These buffers are used by both card-to-host and host-to-card operations. + +Buffers use special allocation, as they are continuous in physical address space, which helps the FPGA card to transfer all +data associated with detector module in two DMA transfers (one data, one metadata). +Useful buffer size is a bit more than 2 MiB, but given that kernel allocates physical memory in power of two, **4 MiB** is safe number for one buffer size. +Buffer can be mapped into user space, but performing `mmap` system call on the `/dev/jfjoch` character device. + +Buffer count can be adjusted by setting `nbuffers` parameter. There are two considerations for setting optimal value: +1. For card-to-host transfers, minimal value is roughly +` * `, +this way each thread can have enough data for operation. Default thread count for Jungfraujoch receiver is 64. +2. For host-to-card transfers, full detector calibration has to fit into memory and one buffer accommodates one calibration set for one module. +So minimal count is ` * (3 + 3 * )`. + +Based on both rules, optimal number is 512 buffers (2 GiB), though this can be adjusted for particular system and configuration. + +## Known problems +To avoid inconsistent behavior, this driver won't load if release number differs between the kernel driver and FPGA card. + +## CMake file +While CMake file is present in the driver directory, it is only for the purpose of proper detection of the files in CLion IDE. +It is not made for actual compilation of the kernel driver and should not be used for that purpose. + +## Character device access +For each FPGA device a character device is created called `/dev/jfjoch`. +When device is opened two operations are possible: +mmap() to map exchange buffers +ioctl() to communicate with the cards +Interfacing should be done through the JungfraujochDevice class in `fpga/host_library` directory. + +## Sysfs access +Certain performance counters can be read through sysfs mechanism in the kernel. +One needs to `cat` files in `/sys/class/misc/jfjoch/` directory. + +## RHEL 9.5+ issue +RedHat Enterprise Linux 9.5 backported modification to settings virtual memory flags from Linux kernel 6.3, while still operating kernel version 5.14. +It is complicated to come up with a single rule to select when newer functions should be used, so it works with RHEL 9.5+, +while still being compatible with other Linux distributions. It is even more complex given not all RHEL compatible distributions adopted the change at the same version. +For the moment the quick fix is to define an environment variable `HAVE_VM_FLAGS_SET` before making the kernel. diff --git a/_sources/FPGA_SETTINGS.md.txt b/_sources/FPGA_SETTINGS.md.txt new file mode 100644 index 00000000..b5e7bce0 --- /dev/null +++ b/_sources/FPGA_SETTINGS.md.txt @@ -0,0 +1,121 @@ +# FPGA advanced reference +## Register map +FPGA setup can be done via registers: + +| Address | Bits | Meaning | Mode | Notes | +|---------------------|------|------------------------------------------------------------------------------------------------|:-----|----------------------------------------------| +| 0x000000 - 0x00FFFF | | Reserved (in case using MicroBlaze in the future, this has to be reserved for internal memory) | | | +| 0x010000 | 32 | Action Control Register | | | +| | | Bit 0 - Action start | R/W | | +| | | Bit 1 - Action idle | R | | +| | | Bit 2 - Action cancel | R/W | cleared on reset or action start | +| | | Bit 3 - Clear network counters | R/W | cleared on reset | +| | | Bit 12:4 - Debug signals (see action_config.v for details) | R | | +| | | Bit 16 - AXI Mailbox interrupt 0 | R | | +| 0x010004 | 32 | Reserved | - | | +| 0x010008 | 32 | Reserved | - | | +| 0x01000C | 32 | GIT SHA1 | R | | +| 0x010010 | 32 | Reserved | R | | +| 0x010014 | 32 | Reserved | R | | +| 0x010018 | 32 | Jungfraujoch FPGA variant | R | | +| 0x01001C | 32 | Reserved | R | | +| 0x010020 | 32 | Max. number supported detector modules | R | constant | +| 0x010024 | 32 | Reserved | R | constant | +| 0x010028 | 64 | Pipeline stalls before writing to host memory | R | reset on action start | +| 0x010030 | 64 | Pipeline stalls before accessing HBM | R | reset on action start | +| 0x010038 | 32 | FIFO status (see action_config.v for details) | R | | +| 0x01003C | 32 | Size of single HBM channel in bytes (default value for the particular card) | R/W | should not be altered for standard operation | +| 0x010040 | 64 | Packets processed by the action | R | cleared on reset or action start | +| 0x010048 | 64 | Valid ethernet packets | R | cleared on reset | +| 0x010050 | 64 | Valid ICMP packets | R | cleared on reset | +| 0x010058 | 64 | Valid UDP packets | R | cleared on reset | +| 0x010060 | 64 | Valid detector packets processed by the card | R | cleared on reset | +| 0x010068 | 64 | Packets flagged as errors by CMAC | R | cleared on reset | +| 0x010070 | 64 | Pipeline stalls before data processing | R | reset on action start | +| 0x010078 | 64 | AXI-beats before accessing HBM | R | reset on action start | +| 0x010080 | 64 | AXI-beats before data processing | R | reset on action start | +| 0x010088 | 64 | AXI-beats before host writer | R | reset on action start | +| 0x010090 | 64 | Last encountered SwissFEL pulse ID | R | cleared on reset | +| 0x010100 | 32 | Spot finder photon count threshold | R/W | | +| 0x010104 | 32 | Spot finder signal-to-noise ratio threshold (single-precision float) | R/W | | +| 0x010200 | 64 | MAC address source for internal frame generator | R/W | network byte order | +| 0x010208 | 32 | IPv4 address source for internal frame generator | R/W | network byte order | +| 0x01020C | 32 | Number of detector modules (value minus one: 0 => 1 module, 1 => 2 modules, etc.) | R/W | | +| 0x010210 | 32 | Data collection mode | R/W | | +| | | Bit 0 - Conversion to photons | | | +| | | Bit 1 - Output extend to 32-bit | | | +| | | Bit 2 - Output is unsigned integer | | | +| | | Bit 3 - Use sq. root lossy compression | | | +| | | Bit 7 - JUNGFRAU fixed G1 mode | | | +| | | Bit 8 - Set to zero values below threshold | | | +| | | Bit 16:31 - Data collection ID (carried with completions) | | | +| 0x010214 | 32 | Photon energy in keV (single-precision float) | R/W | | +| 0x010218 | 32 | Number of frames expected in the data collection (defines termination condition) | R/W | | +| 0x01021C | 32 | Number of storage cells | R/W | | +| 0x010220 | 32 | Summation on card (value minus one: 0 => summation of 1, 1 => summation of 2, etc.) | R/W | | +| 0x010224 | 32 | Coefficient for sq. root compression (need to set bit in data collection mode to apply) | R/W | | +| 0x010225 | 32 | Threshold; set values below set to zero (need to set bit in data collection mode to apply) | R/W | | +| 0x030000 - 0x03FFFF | | AXI Mailbox for Work Request / Work Completion | | See Xilinx PG114 for register map | +| 0x040000 - 0x04FFFF | | QuadSPI flash | | See Xilinx PG153 for register map | +| 0x050000 - 0x05FFFF | | Interrupt controller | | See Xilinx PG099 for register map | +| 0x060000 - 0x06FFFF | | Load calibration (HLS) | | | +| 0x070000 - 0x07FFFF | | AXI Firewall | | See Xilinx PG293 for register map | +| 0x080000 - 0x08FFFF | | Frame generator (HLS) | | | +| 0x090000 - 0x09FFFF | | PCIe DMA control | | See Xilinx PG195 for register map | +| 0x0A0000 - 0x0AFFFF | | I2C clock generator | | See Xilinx PG195 for register map | +| 0x0C0000 - 0x0FFFFF | | Xilinx Card Management Solution Subsystem management subsystem | | See Xilinx PG348 for register map | +| 0x100000 - 0x10FFFF | | MAC 10G / CMAC 100G | | See Xilinx PG210/PG203 for register map | +| 0x110000 - 0x11FFFF | | MAC 10G | | See Xilinx PG210 for register map | +| 0x120000 - 0x12FFFF | | MAC 10G | | See Xilinx PG210 for register map | +| 0x130000 - 0x13FFFF | | MAC 10G | | See Xilinx PG210 for register map | +| 0x140000 - 0x14FFFF | | MAC 10G | | See Xilinx PG210 for register map | +| 0x150000 - 0x15FFFF | | MAC 10G | | See Xilinx PG210 for register map | +| 0x160000 - 0x16FFFF | | MAC 10G | | See Xilinx PG210 for register map | +| 0x170000 - 0x17FFFF | | MAC 10G | | See Xilinx PG210 for register map | +| 0x200000 - 0x20FFFF | | Eth/IPv4 network stack for interface #0 | | | +| 0x210000 - 0x21FFFF | | Eth/IPv4 network stack for interface #1 | | | +| 0x220000 - 0x22FFFF | | Eth/IPv4 network stack for interface #2 | | | +| 0x230000 - 0x23FFFF | | Eth/IPv4 network stack for interface #3 | | | +| 0x240000 - 0x24FFFF | | Eth/IPv4 network stack for interface #4 | | | +| 0x250000 - 0x25FFFF | | Eth/IPv4 network stack for interface #5 | | | +| 0x260000 - 0x26FFFF | | Eth/IPv4 network stack for interface #6 | | | +| 0x270000 - 0x27FFFF | | Eth/IPv4 network stack for interface #7 | | | +| 0x400000 - 0x47FFFF | 64 | Address table: decodes handles used by load_calibration and host_writer to DMA addresses | | | + +## AXI Mailbox + +AXI mailbox is used to send work request from host to action, and receive work completions. +Messages are exchanged through AXI Mailbox IP from Xilinx (see Xilinx PG114). + +Work request has the following structure: + +| Bit start | Bit end | Meaning | +|-----------|---------|----------------------------------------------------| +| 0 | 15 | Work request ID (handle) | + +Work completion has the following structure: + +| Bit start | Bit end | Meaning | +|-----------|---------|----------------------------------| +| 0 | 15 | Work request ID (handle) | +| | | Special values: | +| | | 65534 - start of data collection | +| | | 65535 - end of data collection | +| 15 | 31 | Data collection ID | + +## HBM memory + +| Interface number | Core | Meaning | +|------------------|------------------|---------------------------------------------| +| 0-1 | jf_conversion | Gain factor G0 | +| 2-3 | jf_conversion | Gain factor G1 | +| 4-5 | jf_conversion | Gain factor G2 | +| 6-7 | jf_conversion | Pedestal G0 | +| 8-9 | jf_conversion | Pedestal G1 | +| 10-11 | jf_conversion | Pedestal G2 | +| 12-13 | integration | Integration map | +| 14-15 | integration | Integration weights | +| 16-17 | spot_finder_mask | Spot finder resolution | +| 18-19 | roi_calc | ROI calculation | +| 20-21 | frame_generator | Frame generator | +| 22-27 | load_from_hbm | Frame summation | diff --git a/_sources/HARDWARE.md.txt b/_sources/HARDWARE.md.txt new file mode 100644 index 00000000..527c2844 --- /dev/null +++ b/_sources/HARDWARE.md.txt @@ -0,0 +1,55 @@ +# Hardware requirements +Operating Jungfraujoch requires the following: + +1. High performance server +2. FPGA board(s) installed in the server +3. (optionally) GPU boards +4. (optionally) 100G switch to connect FPGA and the detector + +Unfortunately, at the moment it is not possible to purchase server configuration from a major vendor that would include +AMD FPGA boards. Therefore, the two has to be purchases separately. This might have impact on the warranty for the hardware +and has to be clarified with the vendor. PSI only supports the system on the best effort basis and doesn't take any responsibility +for warranty limitations for operating FPGA boards in the server. Having said this - we didn't encounter any hardware issues so far. + +## High performance server +PSI is using HPE DL380 Gen11 servers are the moment to operate Jungfraujoch systems. However, this is because of general +preference for this vendor, there is no Jungfraujoch-specific reason to buy from this vendor. We do expect that system +from any other vendor with similar specification should work as well. + +At PSI, we use the following configuration of HPE DL380 Gen11 to operate 9M pixel detectors at 2 kHz is as follows: +* 2 x Intel Xeon 8558P +* 512 GB RAM +* 2 x Nvidia L4 GPU (for indexing) +* 1 x Nvidia Connect-X 6 200G ethernet/IB network (for outgoing traffic; this can be substituted according to facility needs) +* Copper 1G/10G network + +### PCI slots +When ordering the system it is important to ensure enough PCIe cards can be accommodated in the system. +In case of our system we need to put at least seven PCIe cards: 4 x FPGA, 2x GPU, 1x network + +Note - for FPGA x8 lane electrically/x16 lane mechanically PCIe slots are OK. + +## FPGA +Jungfraujoch is built for [AMD/Xilinx U55C](https://www.amd.com/en/products/accelerators/alveo/u55c/a-u55c-p00g-pq-g.html) +(A-U55C-P00G-PQ-G) card. Other FPGA cards are currently not supported. + +Single U55C card supports roughly 5 detector modules (2.5M pixels) at 2 kHz and 10 detector modules (5M pixels) at 1 kHz. +For detectors operating at lower frame rates (e.g., 100 Hz) larger detectors can be supported by a single U55C card, though it requires +using TX delay functionality in the detector. + +## GPUs +Operating fast-feedback indexer code requires operation of a graphic processing unit from Nvidia. +For practical reasons, i.e. power consumption and cost, we choose inference grade card Nvidia L4. +In the past we have also used T4 cards. So, in principle any recent CUDA compatible GPU should work. + +## Network switch +Small detectors (up to 4M pixel) can be in principle operated without switch. In this case one needs `8x10g` variant +of the Jungfraujoch FPGA image, which allows to directly connect 4 JUNGFRAU modules to one U55C card. + +Such configuration is however +impractical for larger systems or more complex deployments, like multiple detectors operated from one Jungfraujochs server. +In this case one needs a network switch. + +We currently use Nvidia/Mellanox SN2100 switch, though there is no reason not to use other models/other vendors. +For switches with only 100G ports it is important to ensure, that these can be split into 4x10G ports to connect the detector. + diff --git a/_sources/IMAGE_STREAM.md.txt b/_sources/IMAGE_STREAM.md.txt new file mode 100644 index 00000000..38b90b31 --- /dev/null +++ b/_sources/IMAGE_STREAM.md.txt @@ -0,0 +1,235 @@ + +# Data streams + +Jungfraujoch process (`jfjoch_broker`) operates three outputs. +All three can be operated/enabled independently. +These are: +* **Image** - all the images including metadata (ZeroMQ PUSH socket or custom TCP/IP socket) +* **Preview** - images with metadata at a reduced frame rate (PUB socket) +* **Metadata** - only metadata for all the images, bundled into packages (PUB socket) + +## Image stream +Images (with metadata) are serialized as CBOR [image message](CBOR.md#image-message). +The stream will also include CBOR [start message](CBOR.md#start-message), [calibration messages](CBOR.md#calibration-message) and [end message](CBOR.md#end-message) with run metadata. + +If `file_prefix` is not provided for a data collection, images won't be sent to image stream (or its HDF5/CBOR replacements). + +### Splitting image stream +Image stream can be split into multiple sockets to increase performance, in this case images will be split according to file number to which the image belongs. +All sockets will forward start and end messages. Only first socket will forward calibration messages and will be marked to write master file. + +### ZeroMQ image stream +This is using PUSH ZeroMQ socket(s). +It should be strictly avoided to have multiple receivers connected to one PUSH ZeroMQ socket. +ZeroMQ will send the images in a round-robin basis to the receivers. +In this case start and end messages will end up only with one receiver. +Instead, Jungfraujoch feature of multiple sockets should be used. +For ZeroMQ image stream, each writer connects to a different port. + +Behavior is as following: +* Start message is sent with timeout of 1s per socket. If within the time the message cannot be put in the outgoing queue or there is no connected puller, an exception is thrown — data collection is stopped with an error due to absence of a writer. +* Calibration message is sent to the first socket only, with timeout of 1s. +* Images are sent via a per-socket writer thread. If a send times out, the pusher switches to non-blocking mode for the remainder of the collection (images may be dropped). +* End message is sent with timeout of 1s per socket. No exception is thrown on timeout, but a transmission error is recorded. + +The format is generally interchangeable with DECTRIS Stream2 format. + +#### ZeroMQ configuration + +ZeroMQ image stream is configured in the broker JSON configuration file under the `zeromq_settings` section: +```json +{ + "image_socket": ["tcp://192.168.0.1:9000", "tcp://192.168.0.1:9001"], + "send_watermark": 100, + "send_buffer_size": 67108864, + "writer_notification_socket": "tcp://192.168.0.1:*" +} +``` + +- `image_socket`: one or more PUSH socket addresses. Multiple entries split the image stream across sockets. Addresses follow ZeroMQ conventions (`tcp://`, `ipc://`). `0.0.0.0` binds on all network interfaces. +- `send_watermark` (optional): ZeroMQ send high-water mark (number of outstanding messages per socket). +- `send_buffer_size` (optional): OS-level send buffer size for the ZeroMQ socket. +- `writer_notification_socket` (optional): see [Writer notification socket](#writer-notification-socket) below. + +### TCP/IP image stream +This is using TCP/IP socket(s) with a fixed binary frame header followed by payload bytes. +This format was introduced to Jungfraujoch as an alternative to ZeroMQ image stream. It allows two-way communication +between the data collection and the writer, and is therefore more robust than ZeroMQ. + +For TCP/IP image stream, Jungfraujoch **listens** on a single TCP port and all writers **connect** to it. Connections are persistent — writers connect once and stay connected across multiple data collections. Jungfraujoch sends periodic `KEEPALIVE` frames when no data collection is active to detect dead connections; writers are expected to respond with a `KEEPALIVE` pong. + +Using `*` as port number (e.g. `tcp://127.0.0.1:*`) is supported — the OS assigns a free port and the actual bound address can be queried via `GetAddress()`. + +Payloads for `START`, `DATA`, `CALIBRATION` and `END` frames are CBOR messages, equivalent in content to the ZeroMQ image stream messages. +`ACK`, `CANCEL`, and `KEEPALIVE` are control frames (no CBOR payload). + +The data collection lifecycle on each connection follows: +`START` → `CALIBRATION` (socket 0 only) → `DATA` (repeated) → `END` + +If a `START` ACK fails on any connection, Jungfraujoch sends `CANCEL` to all already-started connections and rolls back. + +For each frame: +1. Read one `TcpFrameHeader` (fixed size, 64-byte aligned). +2. Validate `magic` (`0x4A464A54` / `"JFJT"`) and `version` (`2`). +3. Read `payload_size` bytes (if non-zero). + +When image stream is split into multiple connections: +- `START` and `END` are sent on all connections, +- `CALIBRATION` is sent only on connection 0, +- `DATA` frames are distributed by file grouping: connection index = `(image_number / images_per_file) % num_connections`. + +#### TCP/IP configuration + +TCP/IP image stream is configured in the broker JSON configuration file under the `tcp_settings` section: +```json +{ + "image_socket": "tcp://192.168.0.1:9100", + "nwriters": 2, + "send_buffer_size": 67108864 +} +``` + +- `addr`: listen address in `tcp://:` format. `0.0.0.0` binds on all interfaces. `*` as port selects a random free port. +- `nwriters` (optional): maximum number of simultaneous writer connections accepted. +- `send_buffer_size` (optional): OS-level `SO_SNDBUF` size for accepted connections. + +#### ACK handling + +ACK handling is mandatory for correct operation: +- `START` **must** be acknowledged (`ACK` with `ack_for=START`) on each connection within 5 seconds, otherwise collection start fails and a rollback is triggered. +- `END` **must** be acknowledged (`ack_for=END`) on each connection within 10 seconds for successful completion. +- `CANCEL` should be acknowledged during rollback paths (500ms timeout). +- `DATA` should be acknowledged for every frame. A `DATA` ACK with `FATAL` flag set reports a downstream error (e.g. disk full) which is propagated to `jfjoch_broker` via `Finalize()`. A failed `DATA` ACK does **not** break the TCP connection on its own — data continues to flow. +- `CALIBRATION` is not acknowledged at this time. +- `KEEPALIVE` frames are not acknowledged via ACK; the writer responds with a `KEEPALIVE` pong frame instead. + +#### Keepalive + +When no data collection is active, Jungfraujoch sends `KEEPALIVE` frames approximately every 5 seconds on each persistent connection. Writers should respond with a `KEEPALIVE` frame (pong). OS-level TCP keepalive is also enabled (`TCP_KEEPIDLE=30s`, `TCP_KEEPINTVL=10s`, `TCP_KEEPCNT=3`) as a secondary safety net. Dead connections are automatically removed from the pool. + +#### Zero-copy transmission + +On Linux, large payload transmission (`DATA` and `CALIBRATION` frames) can use kernel TCP zero-copy (`SO_ZEROCOPY`/`MSG_ZEROCOPY`) when available. If the kernel does not support it or the socket option fails, transmission transparently falls back to normal `send()` behavior. Zero-copy completion notifications are processed by a dedicated per-connection thread. + +#### Frame types + +| Value | Name | Purpose | +|---:|---|---| +| 1 | `START` | Start-of-run metadata | +| 2 | `DATA` | One image payload | +| 3 | `CALIBRATION` | Calibration payload | +| 4 | `END` | End-of-run metadata | +| 5 | `ACK` | Acknowledgement / error reporting | +| 6 | `CANCEL` | Cancel run initialization/stream | +| 7 | `KEEPALIVE` | Connection liveness probe/pong | + +#### TCP frame header (`TcpFrameHeader`) + +| Field | Type | Description | +|--------------------------|---|----------------------------------------------------------| +| `magic` | `uint32_t` | Protocol magic (`0x4A464A54`, `"JFJT"`) | +| `version` | `uint16_t` | Protocol version (`2`) | +| `type` | `uint16_t` | Frame type (see table above) | +| `image_number` | `uint64_t` | Image index for `DATA` frames | +| `payload_size` | `uint64_t` | Number of payload bytes after header | +| `socket_number` | `uint32_t` | Connection index in split-stream mode | +| `flags` | `uint32_t` | ACK flags (`OK`, `FATAL`, `HAS_ERROR_TEXT`) | +| `run_number` | `uint64_t` | Run identifier | +| `ack_processed_images` | `uint32_t` | In `ACK`: number of images processed by receiver | +| `ack_code` | `uint16_t` | In `ACK`: error/status code | +| `ack_for` | `uint16_t` | In `ACK`: frame type being acknowledged | +| `ack_fifo_occupancy` | `uint16_t` | In `ACK`: occupancy of input FIFO in the `jfjoch_writer` | +| `ack_fifo_max_occupancy` | `uint64_t` | In `ACK`: max occupancy of input FIFO | + +The header is 64-byte aligned (`alignas(64)`). + +#### ACK semantics + +- `ACK` frames use `ack_for` to indicate which frame type is acknowledged. +- `flags`: + - `OK` (bit 0): operation accepted/successful, + - `FATAL` (bit 1): receiver reports unrecoverable error (primarily for `DATA`), + - `HAS_ERROR_TEXT` (bit 2): ACK payload contains UTF-8 error text. +- `ack_code` can be used to categorize errors: + +| Code | Name | Meaning | +|---:|---|---| +| 0 | `None` | No error | +| 1 | `StartFailed` | START processing failed | +| 2 | `DataWriteFailed` | Image write failed | +| 3 | `EndFailed` | END processing failed | +| 4 | `DiskQuotaExceeded` | Disk quota exceeded | +| 5 | `NoSpaceLeft` | No space left on device | +| 6 | `PermissionDenied` | Permission denied | +| 7 | `IoError` | General I/O error | +| 8 | `ProtocolError` | Protocol-level error | + +### Image stream replacement +Image stream can be replaced with direct HDF5 writer and CBOR dump image pushers, or it can be disabled by selecting "None" image pusher for all the measurements. + +## Writer notification socket +The writer notification socket is used **only with ZeroMQ image stream**. Since ZeroMQ is asynchronous, `jfjoch_broker` does not know whether messages were properly handled downstream (e.g. written to disk). The writer notification socket allows downstream code to report back. + +For TCP/IP image stream, this mechanism is not needed — ACK frames provide synchronous feedback for each control and data frame. + +To use writer notification socket, it has to be first enabled in the JSON configuration file of broker with `writer_notification_socket` entry: +```json +{ + "writer_notification_socket":"tcp://192.168.0.1:*" +} +``` +Such entry will create PULL socket on `192.168.0.1` network interface listening on one, random TCP port. When data processing is started, the +image stream will send CBOR [start message](CBOR.md#start-message). This message will include information on `writer_notification_zmq_addr`, +which needs to be used by downstream code. Since the start message must reference the address of `jfjoch_broker` host, notification +socket should always listen on a particular network interface, and should not be configured with placeholder address `0.0.0.0`. It is, however, OK +to use placeholder `:*` for network port, as it will be substituted for the one chosen by ZeroMQ. + +For every image stream socket, downstream code must send the following message to the PULL socket: +```json +{ + "run_number":135, + "run_name": "lysozyme_1", + "socket_number": 1, + "processed_images":250, + "ok": true +} +``` +Here `run_number`, `run_name` and `socket_number` must match information from the start message. +`ok` is boolean confirming if the writing process was OK. +`processed_images` is number of images that were written/processed, this is to track how many images were ignored by non-blocking ZeroMQ procedures. +If not, it is possible to include error message: +```json +{ + "run_number":135, + "run_name": "lysozyme_1", + "socket_number": 1, + "processed_images": 0, + "ok": false, + "error": "Permission error" +} +``` +This way errors from the downstream code are propagated to `jfjoch_broker`. + +If writer notification socket is configured, but downstream code doesn't send proper notification, `jfjoch_broker` will time out after 60 seconds producing an error message. + +## Preview stream +Jungfraujoch can also send images (with metadata) at a reduced frame rate for preview purpose. +Images are serialized as CBOR [image message](CBOR.md#image-message). +The stream will also include CBOR [start message](CBOR.md#start-message) and [end message](CBOR.md#end-message) with run metadata. +Only start and image messages are sent. + +This is using PUB socket with conflate option. I.e., only the last message is kept by ZeroMQ, so if receiver cannot cope +with the messages, it will always receive the last generated message (no backlog). +For this reason it is also recommended to use the same option on receiver side. + +Given PUB socket properties, it is possible to connect multiple viewers to a single socket --- all the viewers should receive all the images sent. + +## Metadata stream +Jungfraujoch can also send pure metadata for the purpose of archiving such information. +Metadata are serialized as CBOR [metadata message](CBOR.md#metadata-message). +This is very similar as image message, but excludes the actual image array and spot positions. +As metadata are relatively small, to avoid large number of messages, Jungfraujoch bundles metadata of many images in one message. +Order of images within bundle, as well a size of the bundle, are not guaranteed. +The stream will also include CBOR [start message](CBOR.md#start-message) and [end message](CBOR.md#end-message) with run metadata. + +This is using PUB socket with watermark, so there is some queuing of messages with ZeroMQ. Multiple receivers can be connected. \ No newline at end of file diff --git a/_sources/JFJOCH_BROKER.md.txt b/_sources/JFJOCH_BROKER.md.txt new file mode 100644 index 00000000..d7e58f0b --- /dev/null +++ b/_sources/JFJOCH_BROKER.md.txt @@ -0,0 +1,189 @@ +# jfjoch_broker + +`jfjoch_broker` is the main service for the Jungfraujoch application. It is responsible for: + +* Providing user interface via HTTP and OpenAPI +* Configuring FPGA firmware +* Building images from FPGA output and forwarding the results over ZeroMQ + +## External interfaces +Broker operates four external interfaces. + +**Image stream** ZeroMQ PULL socket with CBOR serialization is used to send images, metadata and processing results for writing or downstream +processing. See details [here](IMAGE_STREAM.md#image-stream). + +**Preview stream** ZeroMQ PUB socket, as above but limited to subset of frames (1 image/s by default). See details [here](IMAGE_STREAM.md#preview-stream). + +**Metadata stream** ZeroMQ PUB socket, contains metadata for all the images, with bundling. See details [here](IMAGE_STREAM.md#metadata-stream). + +**Configuration, status and results interface** HTTP/REST interface described in the OpenAPI format. +Description of the API is presented in the [OpenAPI description](../broker/redoc-static.html). + +## Broker configuration +`jfjoch_broker` requires JSON configuration files. The file is described by OpenAPI structure `jfjoch_settings` defined in `jfjoch_api.yaml` file. +It is recommended to go through example files in the `etc/`. + +Example with all fields: + +```json +{ + "pcie": [ + { + "blk": "/dev/jfjoch0", + "ipv4": "10.1.1.7" + }, + { + "blk": "/dev/jfjoch1", + "ipv4": "10.1.1.8" + } + ], + "zeromq": { + "send_watermark": 100, + "send_buffer_size": 1024, + "image_socket": [ + "tcp://1.2.3.4:5000", + "tcp://1.2.3.4:5001" + ], + "writer_notification_socket": "tcp://1.3.4.6:7000" + }, + "instrument": { + "source_name": "Swiss Light Source", + "source_type": "Synchrotron X-ray Source", + "instrument_name": "X06SA", + "pulsed_source": false, + "electron_source": false + }, + "detector": [ + { + "description": "EIGER 1M", + "serial_number": "E1M-01", + "type": "EIGER", + "high_voltage_V": 150, + "udp_interface_count": 1, + "module_sync": true, + "sensor_thickness_um": 320, + "calibration_file": [ + "gainMaps.bin" + ], + "hostname": [ + "e1m-01", + "e1m-02" + ], + "readout_time_us": 3, + "sensor_material": "Si", + "tx_delay": [ + 0,1 + ], + "base_data_ipv4_address": "10.10.10.50", + "standard_geometry": { + "nmodules": 1, + "gap_x": 8, + "gap_y": 36, + "modules_in_row": 1 + }, + "custom_geometry": [ + { + "x0": 0, + "y0": 0, + "fast_axis": "Xp", + "slow_axis": "Xp" + } + ], + "mirror_y": true + } + ], + "detector_settings": { + "frame_time_us": 450, + "count_time_us": 0, + "internal_frame_generator": false, + "internal_frame_generator_images": 1, + "detector_trigger_delay_ns": 0, + "timing": "auto", + "eiger_threshold_keV": 6.0, + "jungfrau_pedestal_g0_frames": 2000, + "jungfrau_pedestal_g1_frames": 300, + "jungfrau_pedestal_g2_frames": 300, + "jungfrau_pedestal_g0_rms_limit": 100, + "jungfrau_pedestal_min_image_count": 128, + "jungfrau_storage_cell_count": 1, + "jungfrau_storage_cell_delay_ns": 5000, + "jungfrau_fixed_gain_g1": false, + "jungfrau_use_gain_hg0": false + }, + "azim_int": { + "polarization_factor": -1, + "solid_angle_corr": true, + "high_q_recipA": 0, + "low_q_recipA": 0, + "q_spacing": 0 + }, + "image_format": { + "summation": true, + "geometry_transform": true, + "jungfrau_conversion": true, + "jungfrau_conversion_factor_keV": 0.001, + "bit_depth_image": 16, + "signed_output": true, + "mask_module_edges": true, + "mask_chip_edges": true + }, + "image_buffer_MiB": 2048, + "receiver_threads": 64, + "numa_policy": "n2g2", + "frontend_directory": "/usr/share/jfjoch/frontend", + "image_pusher": "ZeroMQ", + "zeromq_metadata": { + "enabled": true, + "period_ms": 1000, + "socket_address": "tcp://0.0.0.0:4357" + }, + "zeromq_preview": { + "enabled": true, + "period_ms": 1000, + "socket_address": "tcp://0.0.0.0:4356" + } +} +``` + +## Setting up a local test for Jungfraujoch +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. + +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. + +To run the test: + +### Compile Jungfraujoch with frontend +``` +mkdir build +cd build +cmake .. +make jfjoch +make frontend +``` +Alternatively, for RHEL8 system, you can use RPM generated by automated pipeline. +Solely `jfjoch` one is enough. +In this case - it is necessary to update `etc/broker_local.json` file with frontend path in `/usr/share/jfjoch/frontend`. + +### Start service +Start broker: +``` +cd build/broker +./jfjoch_broker ../../etc/broker_local.json 5232 +``` + +### Run tests +To run test a Python script is provided: +``` +cd tests/test_data +python jfjoch_broker_test.py +``` +The script will initialize Jungfraujoch, import test image and start data collection. + +### Expected result +You can observe online data analysis by opening the following web page: [http://localhost:5232](http://localhost:5232). +Also, a dataset with images should be written in the `build/broker` directory. + diff --git a/_sources/JFJOCH_VIEWER.md.txt b/_sources/JFJOCH_VIEWER.md.txt new file mode 100644 index 00000000..9e160be8 --- /dev/null +++ b/_sources/JFJOCH_VIEWER.md.txt @@ -0,0 +1,19 @@ +# jfjoch_viewer + +Jungfraujoch diffraction viewer is distributed as a standalone application. +It uses Qt library version 6, and allows to open HDF5 files generated by [`jfjoch_writer`](JFJOCH_WRITER.md). +It as well allows to open NXmx files written by DECTRIS detectors, though testing is very limited. +It can be downloaded pre-built from Gitea release page, or from Jungfraujoch RPM/APT repositories. +See [Deployment](DEPLOYMENT.md) section for more information. +This viewer can be also sync online with [`jfjoch_broker`](JFJOCH_BROKER.md) HTTP interface +to visualize data during data collection. + +# Data processing pipeline +Viewer contains embedded data processing pipeline, which is the same as the one used +in Jungfraujoch installation. On systems equipped with GPU, it is preferable to use version +compiled with CUDA support (proper RPM/APT repositories). + +At the moment data processing results are not saved to disk. + +# DBus interface +Viewer can be controlled externally with DBus interface, allowing to open file, open detector via HTTP or load image. \ No newline at end of file diff --git a/_sources/JFJOCH_WRITER.md.txt b/_sources/JFJOCH_WRITER.md.txt new file mode 100644 index 00000000..9fbbb384 --- /dev/null +++ b/_sources/JFJOCH_WRITER.md.txt @@ -0,0 +1,219 @@ +# jfjoch_writer + +`jfjoch_writer` is NeXus compliant HDF5 file writer. + +## Acknowledgements +* Zdenek Matej (MAX IV) +* Felix Engelmann (MAX IV) +for testing and multiple improvement suggestions. + +## Running directory +Writer needs to be running in base directory for writing files - `file_prefix` will be always relative in regard to writer running directory. +Writer detects and protects for basic security issues, like `file_prefix` starting with a slash, or starting with `../`, or containing `/../`. + +## Usage +Writer needs to be started as a background service, with the following command: +``` +jfjoch_writer {options}

+ +Options: +-R | --root_dir= Root directory for file writing +-H | --http_port= HTTP port for statistics +-r | --zmq_repub_port= ZeroMQ port for PUSH socket to republish images +-f | --zmq_file_port= ZeroMQ port for PUB socket for notifications on finalized files +-w | --rcv_watermark= Receiving ZeroMQ socket watermark (default = 100) +-W | --repub_watermark= Republish ZeroMQ socket watermark (default = 1000) +``` +for example: +``` +jfjoch_writer -H5234 tcp://dcu-address:5400 +``` + +## HTTP interface +Writer has dedicated status interface via HTTP. It allows for two operations: +* ***check state of the writer*** to check if the writer is properly synchronized with DCU (e.g., that `file_prefix` agrees with what was set on the DCU) and monitor progress. +* ***cancel writing*** this will close all the HDF5 files being written and restart writer - the option should be used only if DCU process was terminated or disconnected, it SHOULD NOT be used as standard cancellation procedure (when DCU received cancel command it should properly finish writing as well) + +## Republish +Republish creates a PULL socket on the writer, where all the messages are republished for further use by data analysis pipeline. +Republish is non-blocking, so if there is no receiver on other end or the sending queue is full - images won't be republished. +In case of START/END messages republishing will attempt sending for 100 ms, but if send times out it won't be retried. + +Republish functionality is optional, if republish port number is omitted this functionality is not enabled. + +## Overwriting files +When `jfjoch_writer` creates a HDF5 file, it first adds suffix `..tmp`. +Random value depends on current time-stamp and likely will be different from each file of the particular series. +After file is all saved and closed, it is renamed to remove the suffix. +By default, renaming won't happen if this would overwrite existing file. +However, this behavior can be changed by setting `overwrite` parameter to true in the file writer configuration. + +## Finalized files information +Creates PUB socket to inform about finalized data files. For each closed file, the socket will send a JSON message, with the following structure: + +``` +{ + "filename": : HDF5 data file name (relative to writer root directory), + "nimages": number of images in the file (counting from 1!), + "file_number": number of file within the acquisition, + "sample_name": name of sample, + "run_name": name of run, + "run_number": number of run, + "experiment_group": number of p-group / proposal (optional), + "user_data": user_data, + "beam_x_pxl": beam center (X) in pixels, + "beam_y_pxl": beam center (Y) in pixels, + "detector_distance_m": detector distance (X) in m, + "detector_height_pxl": detector size (X) in pixels, + "detector_width_pxl": detector size (Y) in pixels, + "incident_energy_eV": photon energy of the X-ray beam, + "pixel_size_m": pixel size in meter (assuming pixel X == Y), + "saturation": this count and higher mean saturation, + "space_group_number": space group number (optional), + "underload": pixels with this count should be excluded, + "unit_cell": unit cell dimensions in Angstrom/degree { + "a": , "b": , "c": , + "alpha": , "beta": , "gamma": + }, +} +``` +`user_data` is defined as `header_appendix` in the `/start` operation in the `jfjoch_broker`. +Other metadata are also carried over from `/start` operation. + +If the `header_appendix` is a string with valid JSON meaning, it will be embedded as JSON, otherwise it will be escaped as string. +For example `header_appendix` of `{"param1": "test1", "param2": ["test1", "test2"]}`, than example message will look as follows: +```json +{ + "filename": "dataset_name_data_000001.h5", + "nimages": 1000, + "file_number": 0, + "sample_name": "lysozyme", + "run_name": "lyso_cryo", + "run_number": 25, + "experiment_group": "p00001", + "beam_x_pxl": 1200, + "beam_y_pxl": 1500, + "detector_distance_m": 0.155, + "detector_height_pxl": 2164, + "detector_width_pxl": 2068, + "image_time_s": 0.001, + "nimages": 2, + "incident_energy_eV": 12400.0, + "pixel_size_m": 7.5e-05, + "saturation": 32766, + "space_group_number": 96, + "underload": -32768, + "unit_cell": { + "a": 78.0, + "alpha": 90.0, + "b": 78.0, + "beta": 90.0, + "c": 39.0, + "gamma": 90.0 + }, + "user_data": { + "param1": "test1", + "param2": ["test1", "test2"] + } +} +``` + +Notifications for finalized files are optional, if notification port number is omitted this functionality is not enabled. + +## HDF5 file structure +Jungfraujoch aims to generate files compliant with NXmx format. + +### Master file + +There are custom extension to NXmx format. These will be documented in the future. + +Specifically, if data collection was configured with `header_appendix` having key equal to `hdf5` and value as JSON +object with number and string values. These will be added to `/entry/user`. + +There are three versions of master file possible. + +#### Legacy version (NXmxLegacy) +By default, *legacy version* is used. This version is compatible with DECTRIS file writer version 1.0 format. +This ensures the file compatibility of Neggia and Durin XDS plugins, as well as DECTRIS Albula viewer version 4.0. +Distinct feature is that if images are split into data files, there will be multiple links in `/entry/data`, +each corresponding to a data file. +Yet, certain new HDF5 features, like virtual datasets, are not possible in this format since it has to be compatible with HDF5 1.8 features. + +#### VDS format (NXmxVDS) +Therefore, we have enabled format *VDS version*. This will link to all data files via a single virtual dataset `/entry/data/data`. +The same way spot finding, azimuthal integration and others, will be linked between master and data files. +This format allows to display processing results in currently developed Jungfraujoch Viewer. +For the time being it only works with Durin XDS plugin, and require DECTRIS Albula viewer version 4.1+. + +#### Integrated format (NXmxIntegrated) +This is format, where no data files are created, but both images and metadata are stored in the same master file. +This is generally equivalent to VDS format described above. + +### Data file + +Data file has the following structure: + +| Location | Description | Optional | Linked in master file v. 2 | +|--------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:--------:|:--------------------------:| +| /entry/data/data | Images | | X | +| /entry/detector/timestamp | Timestamp of the image | | | +| /entry/detector/exptime | Exposure time of the image | | | +| /entry/detector/number | Image number; if image rejection was used this will be the original image number | | | +| /entry/detector/det_info | Debug field of the JF detector | X | | +| /entry/detector/storage_cell_image | Storage cell number | X | X * | +| /entry/detector/rcv_delay | Receiver delay for the image (Jungfraujoch debugging) | X | | +| /entry/detector/rcv_free_send_buffers | Receiver number of free send buffers at the time of sending the image (Jungfraujoch debugging) | X | | +| /entry/detector/data_collection_efficiency_image | Ratio of received and expected UDP packets | X | X * | +| /entry/detector/packets_expected | Number of UDP packets expected for the image | X | | +| /entry/detector/packets_received | Number of UDP packets received for the image | X | | +| /entry/image/max_value | Max viable value of the image (excl. overloads, etc.) | X | | +| /entry/azint/bin_to_q | Azimuthal integration - bin-to-Q mapping | X | | +| /entry/azint/image | Azimuthal integration - per image | X | X | +| /entry/MX/peakXPosRaw | Peak position X (see [CXI format](https://raw.githubusercontent.com/cxidb/CXI/master/cxi_file_format.pdf)) | X | X | +| /entry/MX/peakYPosRaw | Peak position Y (see [CXI format](https://raw.githubusercontent.com/cxidb/CXI/master/cxi_file_format.pdf)) | X | X | +| /entry/MX/peakTotalIntensity | Peak total intensity (see [CXI format](https://raw.githubusercontent.com/cxidb/CXI/master/cxi_file_format.pdf)) | X | X | +| /entry/MX/peakH | Miller index h for each detected (indexed) peak | X | X | +| /entry/MX/peakK | Miller index k for each detected (indexed) peak | X | X | +| /entry/MX/peakL | Miller index l for each detected (indexed) peak | X | X | +| /entry/MX/peakDistEwaldSphere | Distance of the peak from the Ewald sphere (prediction) | X | X | +| /entry/MX/nPeaks | Number of peaks per image (see [CXI format](https://raw.githubusercontent.com/cxidb/CXI/master/cxi_file_format.pdf)) | X | X | +| /entry/MX/strongPixels | Number of strong pixel per image | X | X | +| /entry/MX/nPeaksRingFiltered | Number of peaks not belonging to rings | X | X | +| /entry/MX/imageIndexed | Image is successfully indexed | X | X | +| /entry/MX/profileRadius | Crystal profile radius for indexed images | X | X | +| /entry/MX/latticeIndexed | Crystal lattice for the image, assuming it is indexed | X | X | +| /entry/MX/bkgEstimate | Mean value of pixels in the radius of 3-5 A | X | X | +| /entry/MX/resolutionEstimate | Resolution estimate based on on-the-fly integration | X | X | +| /entry/MX/beam_corr_x | Beam center correction applied during processing (X) [pixel] | X | X | +| /entry/MX/beam_corr_y | Beam center correction applied during processing (Y) [pixel] | X | X | +| /entry/MX/niggli_class | Niggli class identifier of the indexed Bravais lattice (per image) - see [International Tables for Crystallography A (2016). Vol. A, Table 3.1.3.1](https://onlinelibrary.wiley.com/iucr/itc/Ac/ch3o1v0001/table3o1o3o1.pdf) | X | X | +| /entry/MX/bravais_lattice | Bravais lattice short code (per image), e.g., aP, mC, oF, tI, hP, hR, cF | X | X | +| /entry/roi/{roi_name}/max | Max pixel value for roi named {roi_name} | X | X | +| /entry/roi/{roi_name}/sum | Sum pixel value for roi named {roi_name} | X | X | +| /entry/roi/{roi_name}/sum_sq | Sum pixel values squared for roi named {roi_name} | X | X | +| /entry/roi/{roi_name}/npixel | Number of valid pixel for roi named {roi_name} | X | X | +| /entry/roi/{roi_name}/x | Weighted X-coordinate for roi named {roi_name} | X | X | +| /entry/roi/{roi_name}/y | Weighted Y-coordinate for roi named {roi_name} | X | X | +| /entry/xfel/pulseID | Pulse ID (for XFEL only) | X | X | +| /entry/xfel/eventCode | Event code (for XFEL only) | X | X | + +\* - Datasets from `/entry/detector` in data file are mapped to `/entry/instrument/detector/detectorSpecific` in master file. + +If spot finding is enabled, spots are written in the [CXI format](https://raw.githubusercontent.com/cxidb/CXI/master/cxi_file_format.pdf) and are recognized by CrystFEL. The following has to be added to the CrystFEL geometry file: +``` +peak_list = /opt/MX +peak_list_type = cxi +``` + +## Other formats (CBF and TIFF) +In addition to HDF5 format, Jungfraujoch allows to save images in the Crystallographic Binary File (CBF) format. +CBF files are written according to miniCBF format, with only basic header, and always with 32-bit signed integer format. +Dynamic range is reduced to max 2^24, negative numbers are zeroed, and masked, and/or bad pixels are set to -1. + +Also writing to TIFF files is possible, though no metadata are saved in this case. + +## No file option(s) +There are two options to disable writing of files by the writer: +* Setting `file_prefix` to empty string - this will disable sending files on ZeroMQ image socket. +* Setting file format to `NoFile` - files are streamed over ZeroMQ socket, but `jfjoch_writer` will not write anything. +This can be useful for debugging purposes, or if you only rely on republishing functionality of the `jfjoch_writer` \ No newline at end of file diff --git a/_sources/LICENSE.md.txt b/_sources/LICENSE.md.txt new file mode 100644 index 00000000..8b19c24c --- /dev/null +++ b/_sources/LICENSE.md.txt @@ -0,0 +1,690 @@ +# License + +Jungfraujoch software is licensed with GPLv3 license. +Jungfraujoch FPGA is licensed with CERN OHL-S license (see [FPGA license](FPGA_LICENSE.md)). + +## GNU GENERAL PUBLIC LICENSE +Version 3, 29 June 2007 + +Copyright (C) 2007 Free Software Foundation, Inc. +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. + +### Preamble + +The GNU General Public License is a free, copyleft license for +software and other kinds of works. + +The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + +When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + +To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + +For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + +Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + +For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + +Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + +Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + +The precise terms and conditions for copying, distribution and +modification follow. + +### TERMS AND CONDITIONS + +0. Definitions. + +"This License" refers to version 3 of the GNU General Public License. + +"Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + +"The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + +To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + +A "covered work" means either the unmodified Program or a work based +on the Program. + +To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + +To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + +An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + +1. Source Code. + +The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + +A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + +The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + +The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + +The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + +The Corresponding Source for a work in source code form is that +same work. + +2. Basic Permissions. + +All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + +You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + +Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + +3. Protecting Users' Legal Rights From Anti-Circumvention Law. + +No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + +When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + +4. Conveying Verbatim Copies. + +You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + +You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + +5. Conveying Modified Source Versions. + +You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + +a) The work must carry prominent notices stating that you modified +it, and giving a relevant date. + +b) The work must carry prominent notices stating that it is +released under this License and any conditions added under section +7. This requirement modifies the requirement in section 4 to +"keep intact all notices". + +c) You must license the entire work, as a whole, under this +License to anyone who comes into possession of a copy. This +License will therefore apply, along with any applicable section 7 +additional terms, to the whole of the work, and all its parts, +regardless of how they are packaged. This License gives no +permission to license the work in any other way, but it does not +invalidate such permission if you have separately received it. + +d) If the work has interactive user interfaces, each must display +Appropriate Legal Notices; however, if the Program has interactive +interfaces that do not display Appropriate Legal Notices, your +work need not make them do so. + +A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + +6. Conveying Non-Source Forms. + +You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + +a) Convey the object code in, or embodied in, a physical product +(including a physical distribution medium), accompanied by the +Corresponding Source fixed on a durable physical medium +customarily used for software interchange. + +b) Convey the object code in, or embodied in, a physical product +(including a physical distribution medium), accompanied by a +written offer, valid for at least three years and valid for as +long as you offer spare parts or customer support for that product +model, to give anyone who possesses the object code either (1) a +copy of the Corresponding Source for all the software in the +product that is covered by this License, on a durable physical +medium customarily used for software interchange, for a price no +more than your reasonable cost of physically performing this +conveying of source, or (2) access to copy the +Corresponding Source from a network server at no charge. + +c) Convey individual copies of the object code with a copy of the +written offer to provide the Corresponding Source. This +alternative is allowed only occasionally and noncommercially, and +only if you received the object code with such an offer, in accord +with subsection 6b. + +d) Convey the object code by offering access from a designated +place (gratis or for a charge), and offer equivalent access to the +Corresponding Source in the same way through the same place at no +further charge. You need not require recipients to copy the +Corresponding Source along with the object code. If the place to +copy the object code is a network server, the Corresponding Source +may be on a different server (operated by you or a third party) +that supports equivalent copying facilities, provided you maintain +clear directions next to the object code saying where to find the +Corresponding Source. Regardless of what server hosts the +Corresponding Source, you remain obligated to ensure that it is +available for as long as needed to satisfy these requirements. + +e) Convey the object code using peer-to-peer transmission, provided +you inform other peers where the object code and Corresponding +Source of the work are being offered to the general public at no +charge under subsection 6d. + +A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + +A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + +"Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + +If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + +The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + +Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + +7. Additional Terms. + +"Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + +When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + +Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + +a) Disclaiming warranty or limiting liability differently from the +terms of sections 15 and 16 of this License; or + +b) Requiring preservation of specified reasonable legal notices or +author attributions in that material or in the Appropriate Legal +Notices displayed by works containing it; or + +c) Prohibiting misrepresentation of the origin of that material, or +requiring that modified versions of such material be marked in +reasonable ways as different from the original version; or + +d) Limiting the use for publicity purposes of names of licensors or +authors of the material; or + +e) Declining to grant rights under trademark law for use of some +trade names, trademarks, or service marks; or + +f) Requiring indemnification of licensors and authors of that +material by anyone who conveys the material (or modified versions of +it) with contractual assumptions of liability to the recipient, for +any liability that these contractual assumptions directly impose on +those licensors and authors. + +All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + +If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + +Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + +8. Termination. + +You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + +However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + +Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + +Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + +9. Acceptance Not Required for Having Copies. + +You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + +10. Automatic Licensing of Downstream Recipients. + +Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + +An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + +You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + +11. Patents. + +A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + +A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + +Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + +In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + +If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + +If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + +A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + +Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + +12. No Surrender of Others' Freedom. + +If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + +13. Use with the GNU Affero General Public License. + +Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + +14. Revised Versions of this License. + +The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + +If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + +Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + +15. Disclaimer of Warranty. + +THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + +16. Limitation of Liability. + +IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + +17. Interpretation of Sections 15 and 16. + +If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + +END OF TERMS AND CONDITIONS + +### How to Apply These Terms to Your New Programs + +If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + +To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + +If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w` and `show c` should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + +You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + +The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. + + +## Jungfraujoch exceptions to GPL + +As a special exception, we specifically permit linking Jungfraujoch code with Nvidia CUDA libraries. + +We also permit to link Jungfraujoch software (GPLv3) with Jungfraujoch high-level synthesis code (CERN OHL 2.0) for the purpose +of simulating FPGA design on CPU. + +If OpenAPI definition file (jfjoch_api.yaml) is solely used to generate client code or to interact with the Jungfraujoch +API it may be distributed under terms of your choosing without being subject to GPL requirements. diff --git a/_sources/OPENAPI.md.txt b/_sources/OPENAPI.md.txt new file mode 100644 index 00000000..a13a3280 --- /dev/null +++ b/_sources/OPENAPI.md.txt @@ -0,0 +1,13 @@ +# OpenAPI +## OpenAPI specs + +See document with detailed [OpenAPI specs](OPENAPI_SPECS.rst). + +## Python client +Jungfraujoch is controlled with HTTP/REST interface defined with an OpenAPI specification. +For convenience, we provide Python client as [jfjoch-client](https://pypi.org/project/jfjoch-client/) PyPi package. +To install the client you can use `pip` tool: +``` +pip install jfjoch-client +``` +See [API reference from the OpenAPI generator](python_client/README.md). \ No newline at end of file diff --git a/_sources/OPENAPI_SPECS.rst.txt b/_sources/OPENAPI_SPECS.rst.txt new file mode 100644 index 00000000..15bf4e7f --- /dev/null +++ b/_sources/OPENAPI_SPECS.rst.txt @@ -0,0 +1,4 @@ +OpenAPI specification +===================== + +See document with detailed `OpenAPI specs <_static/redoc-static.html>`_ generated with Redocly. \ No newline at end of file diff --git a/_sources/PIXEL_MASK.md.txt b/_sources/PIXEL_MASK.md.txt new file mode 100644 index 00000000..143f0fd5 --- /dev/null +++ b/_sources/PIXEL_MASK.md.txt @@ -0,0 +1,46 @@ +# Pixel mask + +## Mask format + +Jungfraujoch follows generally [NXmx format](https://manual.nexusformat.org/classes/applications/NXmx.html) format for pixel mask. +Pixel mask is described as 32-bit unsigned integer array of size the same as the image. +Conditions to mask pixel are described by setting a particular bit to one. This way it is possible to encode reason why pixel is included in the pixel mask, also for one pixel there can be multiple reasons encoded at the same time. + +Bit values are set as follows: + +Bit 0 - gap (pixel with no sensor) + +Bit 1 - error pixel (for PSI JUNGFRAU: pixel doesn't set proper gain during pedestal, for DECTRIS: pixel is part of detector pixel mask) + +Bit 4 - noisy pixel (for PSI JUNGFRAU: pixel pedestal G0 RMS is over threshold, for DECTRIS: pixel was flagged with signal during dark data collection at initialization) + +Bit 8 - user defined mask + +Bit 30 - module edge (only for PSI systems) + +Bit 31 - chip edge interpolated pixel (multipixel) + +## Custom user mask + +Jungfraujoch allows to upload custom user mask. This happens in two steps. First create mask in TIFF format: + +```python +import numpy as np +import tifffile as tiff + +# Create a 2068x2164 numpy array filled with zeros, with 32-bit unsigned integers +array = np.zeros((2068, 2164), dtype=np.uint32) + +# Mark the pixel (300, 400) with the value 1 +array[300, 400] = 1 + +# Save the array as a TIFF file +tiff.imwrite('mask.tiff', array) +``` + +Pixels with non-zero value in the TIFF file will be marked as belonging to the user mask (bit 8). + +Then upload the mask to Jungfraujoch server: +```shell +curl -v http:///config/user_mask.tiff -XPUT --data-binary @mask.tiff +``` diff --git a/_sources/REPOSITORIES.md.txt b/_sources/REPOSITORIES.md.txt new file mode 100644 index 00000000..b03b211f --- /dev/null +++ b/_sources/REPOSITORIES.md.txt @@ -0,0 +1,47 @@ +# Linux package repositories +For convenience, we are providing package repositories. With versions including and excluding CUDA linking. +We recommend to install Jungfraujoch viewer from `nocuda` repository and remaining packages from `cuda12`/`cuda13` repository. + +## RHEL based systems + +For RHEL systems we provide the following repositories: + +| RHEL version | CUDA | Repository file | +|--------------|------|-------------------------------------------------------------------------| +| 8.x | 12.x | https://gitea.psi.ch/api/packages/mx/rpm/centos/el8/slsdet8-cuda12.repo | +| 8.x | - | https://gitea.psi.ch/api/packages/mx/rpm/centos/el8/slsdet8-nocuda.repo | +| 9.x | 13.x | https://gitea.psi.ch/api/packages/mx/rpm/centos/el8/slsdet9-cuda13.repo | +| 9.x | - | https://gitea.psi.ch/api/packages/mx/rpm/centos/el8/slsdet9-nocuda.repo | + +To install the repository, run: + +```bash +dnf config-manager --add-repo https://gitea.psi.ch/api/packages/mx/rpm/centos/el8/slsdet8-cuda12.repo +``` +Currently signing of RPMs is not supported, so the repository file needs to be manually modified to set `gpgcheck=0` +or installation must run with `--nogpgcheck`. + +We provide the following packages in the repository: +* jfjoch +* jfjoch-driver +* jfjoch-writer +* jfjoch-viewer + +## Ubuntu based systems + +For Ubuntu systems, we also provide the following repositories: +``` +sudo curl https://gitea.psi.ch/api/packages/mx/debian/repository.key -o /etc/apt/keyrings/gitea-mx.asc +echo "deb [signed-by=/etc/apt/keyrings/gitea-mx.asc] https://gitea.psi.ch/api/packages/mx/debian $distribution $component" | sudo tee -a /etc/apt/sources.list.d/gitea.list +sudo apt update +``` + +`$distribution` uses Ubuntu names `jammy` (22.04) and `noble` (24.04). `$component` can be set to `cuda13` and `nocuda`. + +We provide the following packages in the repository: +* jfjoch-jfjoch +* jfjoch-driver +* jfjoch-writer +* jfjoch-viewer + +Ubuntu packages are currently only going through a very limited testing. \ No newline at end of file diff --git a/_sources/SOFTWARE.md.txt b/_sources/SOFTWARE.md.txt new file mode 100644 index 00000000..d64671e8 --- /dev/null +++ b/_sources/SOFTWARE.md.txt @@ -0,0 +1,49 @@ +# Software requirements +## Operating system +Recommended operating system is Red Hat Enterprise Linux (RHEL) / Rocky Linux versions 8 or 9. +For this operating systems we provide RPMs with pre-built binaries to simplify deployment. +On experimental basis we also build repositories for Ubuntu 22.04 and 24.04. + +Running Jungfraujoch on Red Hat Enterprise Linux 7 is currently not tested and not recommended, +but likely possible with providing some packages from external repositories. + + +## Software dependencies +Required: +* C++20 compiler and C++20 standard library; recommended GCC 11+ or clang 14+ (Intel OneAPI, AMD AOCC) +* CMake version 3.21 or newer + GNU make tool +* zlib compression library +* EIGEN library (only on a compilation system) +* HDF5 library version 1.10 or newer - see [github.com/HDFGroup/hdf5](https://github.com/HDFGroup/hdf5) +* TIFF library - see [gitlab.com/libtiff/libtiff](https://gitlab.com/libtiff/libtiff) +* JPEG library (preferably jpeg-turbo) - see [github.com/libjpeg-turbo/libjpeg-turbo](https://github.com/libjpeg-turbo/libjpeg-turbo) + +Optional: +* CUDA compiler version 12.7 or newer - required for MX fast feedback indexer +* FFTW library - for indexing if GPU/CUDA is absent +* NUMA library - to pin threads to nodes/CPUs +* Node.js - to make frontend +* Qt version 6 (for jfjoch_viewer) + +Automatically downloaded by CMake and statically linked: +* SLS Detector Package - see [github.com/slsdetectorgroup/slsDetectorPackage](https://github.com/slsdetectorgroup/slsDetectorPackage) +* Zstandard (Facebook) - see [github.com/facebook/zstd](https://github.com/facebook/zstd) +* Cpp-http library for HTTP server and client - see [github.com/yhirose/cpp-httplib](https://github.com/yhirose/cpp-httplib) +* Fast feedback indexer (Hans-Christian Stadler, PSI) - see [github.com/paulscherrerinstitute/fast-feedback-indexer](https://github.com/paulscherrerinstitute/fast-feedback-indexer) +* Catch2 testing library - see [github.com/catchorg/Catch2](https://github.com/catchorg/Catch2) +* Ceres Solver library for least square optimization - see [http://ceres-solver.org/] +* Spdlog logging library - see [github.com/gabime/spdlog](https://github.com/gabime/spdlog) +Please follow the link provided above to check for LICENSE file. Building code with dependencies above requires access from the build system to github.com. + +Directly included in the repository: +* JSON parser/writer from N. Lohmann - see [github.com/nlohmann/json](https://github.com/nlohmann/json) +* Xilinx arbitrary precision arithmetic headers - see [github.com/Xilinx/HLS_arbitrary_Precision_Types](https://github.com/Xilinx/HLS_arbitrary_Precision_Types) +* Bitshuffle filter from K. Masui - see [github.com/kiyo-masui/bitshuffle](https://github.com/kiyo-masui/bitshuffle) +* Fast replacement for Bitshuffle pre-compression filter (Kal Cutter, DECTRIS) - see [github.com/kalcutter/bitshuffle](https://github.com/kalcutter/bitshuffle) +* Tinycbor (Intel) - see [github.com/intel/tinycbor](https://github.com/intel/tinycbor) +* LZ4 compression by Y.Collet - see [github.com/lz4/lz4](https://github.com/lz4/lz4) +* ZeroMQ library (through slsDetectorPackage) - see [github.com/zeromq/libzmq](https://github.com/zeromq/libzmq) +* Base64 decoder/encoder - see [gist.github.com/tomykaira](https://gist.github.com/tomykaira/f0fd86b6c73063283afe550bc5d77594) +* GEMMI library by Global Phasing - see [github.com/project-gemmi/gemmi](https://github.com/project-gemmi/gemmi) + +For license check LICENSE file in respective directory diff --git a/_sources/SOFTWARE_INTEGRATION.md.txt b/_sources/SOFTWARE_INTEGRATION.md.txt new file mode 100644 index 00000000..c8db92b1 --- /dev/null +++ b/_sources/SOFTWARE_INTEGRATION.md.txt @@ -0,0 +1,24 @@ +# Integration with MX data processing software + +## XDS +Jungfraujoch files are compatible with XDS, but there is a need of a dedicated plugin. +First we recommend to use Jungfraujoch own XDS plugin. It is available for Linux only and can +be downloaded from Gitea release directory (compiled on RHEL 8), it is also distributed in [`jfjoch_viewer`](JFJOCH_VIEWER.md) RPM/APT packages. +To use the plugin, download the file `libjfjoch_xds_plugin.so.1.0.0` (three numbers at the end represent version of the plugin, and can differ later in time), +save it to common directory (e.g., `/opt/xds`) and add the following line in the XDS.INP file: +``` +LIB="/opt/xds/libjfjoch_xds_plugin.so.1.0.0" +``` +We are also testing XDS with Durin and Neggia plugins, though they don't have full functionality: + +* Neggia plugin doesn't support HDF5 virtual data sets. It can be downloaded from [github.com/dectris/neggia](https://github.com/dectris/neggia/). +* Durin has known bugs with handling non-DECTRIS files (so with virtual data sets or single format HDF5 file format). +We recommend Durin plugin prepared by the Global Phasing consortium: [github.com/CV-GPhL/durin](https://github.com/CV-GPhL/durin), rather than original from the Diamond Light Source. + +## DIALS +Jungfraujoch files are tested regularly with DIALS (currently v. 3.27.0) `xia2.ssx` pipeline for serial crystallography. +There is one known limitation: files generated with NXmxLegacy format (mimicking DECTRIS filewriter1 format) +are not handled properly with DIALS. VDS based HDF5 format (NXmxVDS) is recommended, when using DIALS. + +## CrystFEL +Jungfraujoch files are compatible with CrystFEL. \ No newline at end of file diff --git a/_sources/TESTS.md.txt b/_sources/TESTS.md.txt new file mode 100644 index 00000000..89042e6a --- /dev/null +++ b/_sources/TESTS.md.txt @@ -0,0 +1,10 @@ +# Tests + +Automated test routine is then accessible as `tests/jfjoch_test`. There are also benchmark routines: + +* `jfjoch_hdf5_test` to measure HDF5 dataset writing speed (single threaded) +* `jfjoch_offline_process` to apply spot finding and indexing routines in Jungfraujoch to an example dataset - this is equivalent to FPGA spot finding algorithm, but NOT performance equivalent as it is particularly not-efficient +* `jfjoch_fpga_test` to test quality/performance of FPGA card(s) and software routines + +In addition, tests are executed to verify that datasets written by Jungfraujoch are readable with XDS Durin plugin, XDS Neggia plygin and CrystFEL. +Input files for these programs are placed in `xds_durin`, `xds_neggia` and `crystfel` folders. See `.gitlab-ci.yml` for details. diff --git a/_sources/TOOLS.md.txt b/_sources/TOOLS.md.txt new file mode 100644 index 00000000..d567125f --- /dev/null +++ b/_sources/TOOLS.md.txt @@ -0,0 +1,47 @@ +# Tools + +## jfjoch_pcie_status +Prints detailed status information about the card. Execute by adding device path, e.g.: +``` +./jfjoch_pcie_status /dev/jfjoch0 +``` +The program is safe to execute during a running data collection. + +## jfjoch_pcie_clear_net_counters +Network counters in the card give information about Ethernet, UDP and ICMP packets encountered by the network stack prior to Jungfraujoch logic. +These counters are running from the moment card is powered on. They can be reset by running the program with device name, e.g.: +``` +./jfjoch_pcie_clear_net_counters /dev/jfjoch0 +``` + +## jfjoch_pcie_net_cfg +Network configuration can be retrieved and modified with `jfjoch_pcie_net_cfg` tool. Usage: + +``` +jfjoch_pcie_net_cfg + Read configuration for all network interface of a device +jfjoch_pcie_net_cfg |fgen + Read configuration for a particular network interface / internal frame generator" +jfjoch_pcie_net_cfg |fgen ipv4 + Set IPv4 address for a particular network interface / internal frame generator +jfjoch_pcie_net_cfg |fgen direct 0|1 + Set direct mode for a particular network interface / internal frame generator +jfjoch_pcie_net_cfg |fgen clear + Clear Ethernet counter for a particular network interface / internal frame generator +``` + +## jfjoch_hdf5_tools + +Tool to test single threaded HDF5 writer performance + +## jfjoch_offline_process + +Tool to run offline processing on existing HDF5 dataset + +## jfjoch_udp_simulator + +UDP simulator to test Jungfraujoch FPGA + +## jfjoch_pcie_read_register + +Tool to read verbatim Jungfraujoch FPGA registers \ No newline at end of file diff --git a/_sources/VERSIONING.md.txt b/_sources/VERSIONING.md.txt new file mode 100644 index 00000000..aac81542 --- /dev/null +++ b/_sources/VERSIONING.md.txt @@ -0,0 +1,13 @@ +# Semantic versioning + +Jungfraujoch is following semantic versioning. For this purpose we define public API as following: + +* OpenAPI configuration interface +* CBOR serialization ZeroMQ stream +* HDF5 file format + +This means that changes in the format of thereof must be accompanied by version change - major version in case of breaking changes, minor version in case of feature expansion. + +NOTE: FPGA design, PCIe driver, and internal libraries are not part of the public API and are considered internals of Jungfraujoch. +Breaking changes in these components can happen without incrementing major version of the whole package. +It will be marked in changelog. \ No newline at end of file diff --git a/_sources/WEB_FRONTEND.md.txt b/_sources/WEB_FRONTEND.md.txt new file mode 100644 index 00000000..51cf14d0 --- /dev/null +++ b/_sources/WEB_FRONTEND.md.txt @@ -0,0 +1,9 @@ +# Web frontend +Jungfraujoch is equipped with React-based web frontend for user-friendly experience. Frontend has the following options: +* Presenting current state of the detector +* Plotting results of online quality calculations +* Showing live view images from the detector +* JUNGFRAU calibration numbers +* Configuring the detector, as well as pedestal/initialization operations + +Frontend is written in TypeScript. For details see `frontend/` directory. \ No newline at end of file diff --git a/_sources/index.rst.txt b/_sources/index.rst.txt new file mode 100644 index 00000000..2e7a0350 --- /dev/null +++ b/_sources/index.rst.txt @@ -0,0 +1,67 @@ +.. image:: jfjoch.png + :width: 256 + :align: left + +PSI Jungfraujoch +================ + +Jungfraujoch is data acquisition and on-the-fly analysis system developed by the `Paul Scherrer Institut `__. + +It can be currently used with PSI and DECTRIS detectors. + +Jungfraujoch is distributed under the GPLv3 license. + +.. toctree:: + :maxdepth: 1 + :caption: General + + ACKNOWLEDGEMENT + LICENSE + DETECTORS + HARDWARE + SOFTWARE + VERSIONING + DEPLOYMENT + CHANGELOG + +.. toctree:: + :maxdepth: 1 + :caption: Software + + JFJOCH_BROKER + JFJOCH_WRITER + SOFTWARE_INTEGRATION + TOOLS + +.. toctree:: + :maxdepth: 1 + :caption: FPGA + + FPGA + FPGA_LICENSE + FPGA_DESIGN + FPGA_NETWORK + FPGA_PCIE_DRIVER + FPGA_SETTINGS + FPGA_DATA_ANALYSIS + +.. toctree:: + :maxdepth: 1 + :caption: Reference + + DETECTOR_GEOMETRY + CPU_DATA_ANALYSIS + OPENAPI + OPENAPI_SPECS + CBOR + IMAGE_STREAM + PIXEL_MASK + WEB_FRONTEND + TESTS + +.. toctree:: + :maxdepth: 1 + :caption: OpenAPI Python client + + python_client/README + python_client/docs/DefaultApi \ No newline at end of file diff --git a/_sources/python_client/README.md.txt b/_sources/python_client/README.md.txt new file mode 100644 index 00000000..b69aa63f --- /dev/null +++ b/_sources/python_client/README.md.txt @@ -0,0 +1,238 @@ +# jfjoch-client +API to control Jungfraujoch developed by the Paul Scherrer Institute (Switzerland). +Jungfraujoch is a data acquisition and analysis system for pixel array detectors, primarly PSI JUNGFRAU. +Jungfraujoch uses FPGA boards to acquire data at high data rates. + +# License Clarification + +While this API definition is licensed under GPL-3.0, **the GPL copyleft provisions do not apply** +when this file is used solely to generate OpenAPI clients or when implementing applications that +interact with the API. Generated client code and applications using this API definition are not +subject to the GPL license requirements and may be distributed under terms of your choosing. + +This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and +the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that +user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not +derivative works of the kernel and are not subject to the terms of the GPL. + +This exception is intended to allow wider use of this API specification without imposing GPL +requirements on applications that merely interact with the API, regardless of whether they +communicate through network calls or other mechanisms. + + +This Python package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project: + +- API version: 1.0.0-rc.144 +- Package version: 1.0.0-rc.144 +- Generator version: 7.20.0 +- Build package: org.openapitools.codegen.languages.PythonClientCodegen + +## Requirements. + +Python 3.9+ + +## Installation & Usage +### pip install + +If the python package is hosted on a repository, you can install directly using: + +```sh +pip install git+https://git.psi.ch/jungfraujoch/jungfraujoch.git +``` +(you may need to run `pip` with root permission: `sudo pip install git+https://git.psi.ch/jungfraujoch/jungfraujoch.git`) + +Then import the package: +```python +import jfjoch_client +``` + +### Setuptools + +Install via [Setuptools](http://pypi.python.org/pypi/setuptools). + +```sh +python setup.py install --user +``` +(or `sudo python setup.py install` to install the package for all users) + +Then import the package: +```python +import jfjoch_client +``` + +### Tests + +Execute `pytest` to run the tests. + +## Getting Started + +Please follow the [installation procedure](#installation--usage) and then run the following: + +```python + +import jfjoch_client +from jfjoch_client.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost:5232 +# See configuration.py for a list of all supported configuration parameters. +configuration = jfjoch_client.Configuration( + host = "http://localhost:5232" +) + + + +# Enter a context with an instance of the API client +with jfjoch_client.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = jfjoch_client.DefaultApi(api_client) + + try: + # Cancel running data collection + api_instance.cancel_post() + except ApiException as e: + print("Exception when calling DefaultApi->cancel_post: %s\n" % e) + +``` + +## Documentation for API Endpoints + +All URIs are relative to *http://localhost:5232* + +Class | Method | HTTP request | Description +------------ | ------------- | ------------- | ------------- +*DefaultApi* | [**cancel_post**](docs/DefaultApi.md#cancel_post) | **POST** /cancel | Cancel running data collection +*DefaultApi* | [**config_azim_int_get**](docs/DefaultApi.md#config_azim_int_get) | **GET** /config/azim_int | Get azimuthal integration configuration +*DefaultApi* | [**config_azim_int_put**](docs/DefaultApi.md#config_azim_int_put) | **PUT** /config/azim_int | Configure azimuthal integration +*DefaultApi* | [**config_dark_mask_get**](docs/DefaultApi.md#config_dark_mask_get) | **GET** /config/dark_mask | Get settings for dark data collection to calculate mask +*DefaultApi* | [**config_dark_mask_put**](docs/DefaultApi.md#config_dark_mask_put) | **PUT** /config/dark_mask | Set configuration for dark data collection to calculate mask +*DefaultApi* | [**config_detector_get**](docs/DefaultApi.md#config_detector_get) | **GET** /config/detector | Get detector configuration +*DefaultApi* | [**config_detector_put**](docs/DefaultApi.md#config_detector_put) | **PUT** /config/detector | Change detector configuration +*DefaultApi* | [**config_file_writer_get**](docs/DefaultApi.md#config_file_writer_get) | **GET** /config/file_writer | Get file writer settings +*DefaultApi* | [**config_file_writer_put**](docs/DefaultApi.md#config_file_writer_put) | **PUT** /config/file_writer | Change file writer settings +*DefaultApi* | [**config_image_format_conversion_post**](docs/DefaultApi.md#config_image_format_conversion_post) | **POST** /config/image_format/conversion | Configure format for data collection with full conversion +*DefaultApi* | [**config_image_format_get**](docs/DefaultApi.md#config_image_format_get) | **GET** /config/image_format | Get image output format +*DefaultApi* | [**config_image_format_put**](docs/DefaultApi.md#config_image_format_put) | **PUT** /config/image_format | Change image output format +*DefaultApi* | [**config_image_format_raw_post**](docs/DefaultApi.md#config_image_format_raw_post) | **POST** /config/image_format/raw | Configure format for raw data collection +*DefaultApi* | [**config_indexing_get**](docs/DefaultApi.md#config_indexing_get) | **GET** /config/indexing | Get indexing configuration +*DefaultApi* | [**config_indexing_put**](docs/DefaultApi.md#config_indexing_put) | **PUT** /config/indexing | Change indexing algorithm settings +*DefaultApi* | [**config_instrument_get**](docs/DefaultApi.md#config_instrument_get) | **GET** /config/instrument | Get instrument metadata +*DefaultApi* | [**config_instrument_put**](docs/DefaultApi.md#config_instrument_put) | **PUT** /config/instrument | Change instrument metadata +*DefaultApi* | [**config_internal_generator_image_put**](docs/DefaultApi.md#config_internal_generator_image_put) | **PUT** /config/internal_generator_image | Load binary image for internal FPGA generator +*DefaultApi* | [**config_internal_generator_image_tiff_put**](docs/DefaultApi.md#config_internal_generator_image_tiff_put) | **PUT** /config/internal_generator_image.tiff | Load TIFF image for internal FPGA generator +*DefaultApi* | [**config_mask_get**](docs/DefaultApi.md#config_mask_get) | **GET** /config/mask | Get mask of the detector (binary) +*DefaultApi* | [**config_mask_tiff_get**](docs/DefaultApi.md#config_mask_tiff_get) | **GET** /config/mask.tiff | Get mask of the detector (TIFF) +*DefaultApi* | [**config_roi_get**](docs/DefaultApi.md#config_roi_get) | **GET** /config/roi | Get ROI definitions +*DefaultApi* | [**config_roi_put**](docs/DefaultApi.md#config_roi_put) | **PUT** /config/roi | Upload ROI definitions +*DefaultApi* | [**config_select_detector_get**](docs/DefaultApi.md#config_select_detector_get) | **GET** /config/select_detector | List available detectors +*DefaultApi* | [**config_select_detector_put**](docs/DefaultApi.md#config_select_detector_put) | **PUT** /config/select_detector | Select detector +*DefaultApi* | [**config_spot_finding_get**](docs/DefaultApi.md#config_spot_finding_get) | **GET** /config/spot_finding | Get data processing configuration +*DefaultApi* | [**config_spot_finding_put**](docs/DefaultApi.md#config_spot_finding_put) | **PUT** /config/spot_finding | Configure spot finding +*DefaultApi* | [**config_user_mask_get**](docs/DefaultApi.md#config_user_mask_get) | **GET** /config/user_mask | Detector must be Initialized. Get user mask of the detector (binary) +*DefaultApi* | [**config_user_mask_put**](docs/DefaultApi.md#config_user_mask_put) | **PUT** /config/user_mask | Upload user mask of the detector (binary) +*DefaultApi* | [**config_user_mask_tiff_get**](docs/DefaultApi.md#config_user_mask_tiff_get) | **GET** /config/user_mask.tiff | Detector must be Initialized. Get user mask of the detector (TIFF) +*DefaultApi* | [**config_user_mask_tiff_put**](docs/DefaultApi.md#config_user_mask_tiff_put) | **PUT** /config/user_mask.tiff | Upload user mask of the detector +*DefaultApi* | [**config_zeromq_metadata_get**](docs/DefaultApi.md#config_zeromq_metadata_get) | **GET** /config/zeromq_metadata | Get ZeroMQ metadata socket settings +*DefaultApi* | [**config_zeromq_metadata_put**](docs/DefaultApi.md#config_zeromq_metadata_put) | **PUT** /config/zeromq_metadata | Set ZeroMQ metadata settings +*DefaultApi* | [**config_zeromq_preview_get**](docs/DefaultApi.md#config_zeromq_preview_get) | **GET** /config/zeromq_preview | Get ZeroMQ preview settings +*DefaultApi* | [**config_zeromq_preview_put**](docs/DefaultApi.md#config_zeromq_preview_put) | **PUT** /config/zeromq_preview | Set ZeroMQ preview settings +*DefaultApi* | [**deactivate_post**](docs/DefaultApi.md#deactivate_post) | **POST** /deactivate | Prepare detector to turn off +*DefaultApi* | [**detector_status_get**](docs/DefaultApi.md#detector_status_get) | **GET** /detector/status | Get detector status +*DefaultApi* | [**fpga_status_get**](docs/DefaultApi.md#fpga_status_get) | **GET** /fpga_status | Get status of FPGA devices +*DefaultApi* | [**image_buffer_clear_post**](docs/DefaultApi.md#image_buffer_clear_post) | **POST** /image_buffer/clear | Clear image buffer +*DefaultApi* | [**image_buffer_image_cbor_get**](docs/DefaultApi.md#image_buffer_image_cbor_get) | **GET** /image_buffer/image.cbor | Get image message in CBOR format +*DefaultApi* | [**image_buffer_image_jpeg_get**](docs/DefaultApi.md#image_buffer_image_jpeg_get) | **GET** /image_buffer/image.jpeg | Get preview image in JPEG format using custom settings +*DefaultApi* | [**image_buffer_image_tiff_get**](docs/DefaultApi.md#image_buffer_image_tiff_get) | **GET** /image_buffer/image.tiff | Get preview image in TIFF format +*DefaultApi* | [**image_buffer_start_cbor_get**](docs/DefaultApi.md#image_buffer_start_cbor_get) | **GET** /image_buffer/start.cbor | Get Start message in CBOR format +*DefaultApi* | [**image_buffer_status_get**](docs/DefaultApi.md#image_buffer_status_get) | **GET** /image_buffer/status | Get status of the image buffers +*DefaultApi* | [**image_pusher_status_get**](docs/DefaultApi.md#image_pusher_status_get) | **GET** /image_pusher/status | Get status of image pusher +*DefaultApi* | [**initialize_post**](docs/DefaultApi.md#initialize_post) | **POST** /initialize | Initialize detector and data acquisition +*DefaultApi* | [**pedestal_post**](docs/DefaultApi.md#pedestal_post) | **POST** /pedestal | Collect dark current for the detector +*DefaultApi* | [**preview_pedestal_tiff_get**](docs/DefaultApi.md#preview_pedestal_tiff_get) | **GET** /preview/pedestal.tiff | Get pedestal in TIFF format +*DefaultApi* | [**preview_plot_bin_get**](docs/DefaultApi.md#preview_plot_bin_get) | **GET** /preview/plot.bin | Generate 1D plot from Jungfraujoch and send in raw binary format. Data are provided as (32-bit) float binary array. This format doesn't transmit information about X-axis, only values, so it is of limited use for azimuthal integration. +*DefaultApi* | [**preview_plot_get**](docs/DefaultApi.md#preview_plot_get) | **GET** /preview/plot | Generate 1D plot from Jungfraujoch +*DefaultApi* | [**result_scan_get**](docs/DefaultApi.md#result_scan_get) | **GET** /result/scan | Get full scan result +*DefaultApi* | [**start_post**](docs/DefaultApi.md#start_post) | **POST** /start | Start detector +*DefaultApi* | [**statistics_calibration_get**](docs/DefaultApi.md#statistics_calibration_get) | **GET** /statistics/calibration | Get calibration statistics +*DefaultApi* | [**statistics_data_collection_get**](docs/DefaultApi.md#statistics_data_collection_get) | **GET** /statistics/data_collection | Get data collection statistics +*DefaultApi* | [**statistics_get**](docs/DefaultApi.md#statistics_get) | **GET** /statistics | Get general statistics +*DefaultApi* | [**status_get**](docs/DefaultApi.md#status_get) | **GET** /status | Get Jungfraujoch status +*DefaultApi* | [**trigger_post**](docs/DefaultApi.md#trigger_post) | **POST** /trigger | Send soft trigger to the detector +*DefaultApi* | [**version_get**](docs/DefaultApi.md#version_get) | **GET** /version | Get Jungfraujoch version of jfjoch_broker +*DefaultApi* | [**wait_till_done_post**](docs/DefaultApi.md#wait_till_done_post) | **POST** /wait_till_done | Wait for acquisition done +*DefaultApi* | [**wait_until_running_post**](docs/DefaultApi.md#wait_until_running_post) | **POST** /wait_until_running | Wait for acquisition running +*DefaultApi* | [**xfel_event_code_get**](docs/DefaultApi.md#xfel_event_code_get) | **GET** /xfel/event_code | Return XFEL event codes for the current data acquisition +*DefaultApi* | [**xfel_pulse_id_get**](docs/DefaultApi.md#xfel_pulse_id_get) | **GET** /xfel/pulse_id | Return XFEL pulse IDs for the current data acquisition + + +## Documentation For Models + + - [AzimIntSettings](docs/AzimIntSettings.md) + - [BrokerStatus](docs/BrokerStatus.md) + - [CalibrationStatisticsInner](docs/CalibrationStatisticsInner.md) + - [DarkMaskSettings](docs/DarkMaskSettings.md) + - [DatasetSettings](docs/DatasetSettings.md) + - [DatasetSettingsXrayFluorescenceSpectrum](docs/DatasetSettingsXrayFluorescenceSpectrum.md) + - [Detector](docs/Detector.md) + - [DetectorList](docs/DetectorList.md) + - [DetectorListElement](docs/DetectorListElement.md) + - [DetectorModule](docs/DetectorModule.md) + - [DetectorModuleDirection](docs/DetectorModuleDirection.md) + - [DetectorPowerState](docs/DetectorPowerState.md) + - [DetectorSelection](docs/DetectorSelection.md) + - [DetectorSettings](docs/DetectorSettings.md) + - [DetectorState](docs/DetectorState.md) + - [DetectorStatus](docs/DetectorStatus.md) + - [DetectorTiming](docs/DetectorTiming.md) + - [DetectorType](docs/DetectorType.md) + - [ErrorMessage](docs/ErrorMessage.md) + - [FileWriterFormat](docs/FileWriterFormat.md) + - [FileWriterSettings](docs/FileWriterSettings.md) + - [FpgaStatusInner](docs/FpgaStatusInner.md) + - [GeomRefinementAlgorithm](docs/GeomRefinementAlgorithm.md) + - [GridScan](docs/GridScan.md) + - [ImageBufferStatus](docs/ImageBufferStatus.md) + - [ImageFormatSettings](docs/ImageFormatSettings.md) + - [ImagePusherStatus](docs/ImagePusherStatus.md) + - [ImagePusherType](docs/ImagePusherType.md) + - [IndexingAlgorithm](docs/IndexingAlgorithm.md) + - [IndexingSettings](docs/IndexingSettings.md) + - [InstrumentMetadata](docs/InstrumentMetadata.md) + - [JfjochSettings](docs/JfjochSettings.md) + - [JfjochStatistics](docs/JfjochStatistics.md) + - [MeasurementStatistics](docs/MeasurementStatistics.md) + - [PcieDevicesInner](docs/PcieDevicesInner.md) + - [PixelMaskStatistics](docs/PixelMaskStatistics.md) + - [Plot](docs/Plot.md) + - [PlotUnitX](docs/PlotUnitX.md) + - [Plots](docs/Plots.md) + - [RoiAzimList](docs/RoiAzimList.md) + - [RoiAzimuthal](docs/RoiAzimuthal.md) + - [RoiBox](docs/RoiBox.md) + - [RoiBoxList](docs/RoiBoxList.md) + - [RoiCircle](docs/RoiCircle.md) + - [RoiCircleList](docs/RoiCircleList.md) + - [RoiDefinitions](docs/RoiDefinitions.md) + - [RotationAxis](docs/RotationAxis.md) + - [ScanResult](docs/ScanResult.md) + - [ScanResultImagesInner](docs/ScanResultImagesInner.md) + - [SpotFindingSettings](docs/SpotFindingSettings.md) + - [StandardDetectorGeometry](docs/StandardDetectorGeometry.md) + - [TcpSettings](docs/TcpSettings.md) + - [UnitCell](docs/UnitCell.md) + - [ZeromqMetadataSettings](docs/ZeromqMetadataSettings.md) + - [ZeromqPreviewSettings](docs/ZeromqPreviewSettings.md) + - [ZeromqSettings](docs/ZeromqSettings.md) + + + +## Documentation For Authorization + +Endpoints do not require authorization. + + +## Author + +filip.leonarski@psi.ch + + diff --git a/_sources/python_client/docs/AzimIntSettings.md.txt b/_sources/python_client/docs/AzimIntSettings.md.txt new file mode 100644 index 00000000..da7c1aae --- /dev/null +++ b/_sources/python_client/docs/AzimIntSettings.md.txt @@ -0,0 +1,34 @@ +# AzimIntSettings + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**polarization_corr** | **bool** | Apply polarization correction for azimuthal integration (polarization factor must be configured in dataset settings) | [default to True] +**solid_angle_corr** | **bool** | Apply solid angle correction for azimuthal integration | [default to True] +**high_q_recip_a** | **float** | | +**low_q_recip_a** | **float** | | +**q_spacing** | **float** | | +**azimuthal_bins** | **int** | Numer of azimuthal (phi) bins; 1 = standard 1D azimuthal integration | [optional] [default to 1] + +## Example + +```python +from jfjoch_client.models.azim_int_settings import AzimIntSettings + +# TODO update the JSON string below +json = "{}" +# create an instance of AzimIntSettings from a JSON string +azim_int_settings_instance = AzimIntSettings.from_json(json) +# print the JSON string representation of the object +print(AzimIntSettings.to_json()) + +# convert the object into a dict +azim_int_settings_dict = azim_int_settings_instance.to_dict() +# create an instance of AzimIntSettings from a dict +azim_int_settings_from_dict = AzimIntSettings.from_dict(azim_int_settings_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/_sources/python_client/docs/BrokerStatus.md.txt b/_sources/python_client/docs/BrokerStatus.md.txt new file mode 100644 index 00000000..85b8d321 --- /dev/null +++ b/_sources/python_client/docs/BrokerStatus.md.txt @@ -0,0 +1,34 @@ +# BrokerStatus + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**state** | **str** | | +**progress** | **float** | Progress of data collection (only available if receiving is running) | [optional] +**message** | **str** | Message to display besides state of the jfjoch_broker; mostly used for errors and warnings This matters especially for async functions (start/initialize), where API won't return reason for the error during async operation. | [optional] +**message_severity** | **str** | Level of the message to display | [optional] [default to 'error'] +**gpu_count** | **int** | Number of installed GPUs | [optional] +**broker_version** | **str** | Version of the jfjoch_broker | [optional] + +## Example + +```python +from jfjoch_client.models.broker_status import BrokerStatus + +# TODO update the JSON string below +json = "{}" +# create an instance of BrokerStatus from a JSON string +broker_status_instance = BrokerStatus.from_json(json) +# print the JSON string representation of the object +print(BrokerStatus.to_json()) + +# convert the object into a dict +broker_status_dict = broker_status_instance.to_dict() +# create an instance of BrokerStatus from a dict +broker_status_from_dict = BrokerStatus.from_dict(broker_status_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/_sources/python_client/docs/CalibrationStatisticsInner.md.txt b/_sources/python_client/docs/CalibrationStatisticsInner.md.txt new file mode 100644 index 00000000..e6c03dd0 --- /dev/null +++ b/_sources/python_client/docs/CalibrationStatisticsInner.md.txt @@ -0,0 +1,37 @@ +# CalibrationStatisticsInner + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**module_number** | **int** | | +**storage_cell_number** | **int** | | +**pedestal_g0_mean** | **float** | | +**pedestal_g1_mean** | **float** | | +**pedestal_g2_mean** | **float** | | +**gain_g0_mean** | **float** | | +**gain_g1_mean** | **float** | | +**gain_g2_mean** | **float** | | +**masked_pixels** | **int** | | + +## Example + +```python +from jfjoch_client.models.calibration_statistics_inner import CalibrationStatisticsInner + +# TODO update the JSON string below +json = "{}" +# create an instance of CalibrationStatisticsInner from a JSON string +calibration_statistics_inner_instance = CalibrationStatisticsInner.from_json(json) +# print the JSON string representation of the object +print(CalibrationStatisticsInner.to_json()) + +# convert the object into a dict +calibration_statistics_inner_dict = calibration_statistics_inner_instance.to_dict() +# create an instance of CalibrationStatisticsInner from a dict +calibration_statistics_inner_from_dict = CalibrationStatisticsInner.from_dict(calibration_statistics_inner_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/_sources/python_client/docs/ColorScale.md.txt b/_sources/python_client/docs/ColorScale.md.txt new file mode 100644 index 00000000..51ad5d79 --- /dev/null +++ b/_sources/python_client/docs/ColorScale.md.txt @@ -0,0 +1,16 @@ +# ColorScale + + +## Enum + +* `INDIGO` (value: `'Indigo'`) + +* `VIRIDIS` (value: `'Viridis'`) + +* `BLACKWHITE` (value: `'BlackWhite'`) + +* `HEAT` (value: `'Heat'`) + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/_sources/python_client/docs/DarkMaskSettings.md.txt b/_sources/python_client/docs/DarkMaskSettings.md.txt new file mode 100644 index 00000000..58102d94 --- /dev/null +++ b/_sources/python_client/docs/DarkMaskSettings.md.txt @@ -0,0 +1,34 @@ +# DarkMaskSettings + +Settings for collection of dark images to be used for mask calculation + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**detector_threshold_ke_v** | **float** | Energy threshold for dark image collection | [default to 3.5] +**frame_time_us** | **int** | Time between frames for dark image collection | [default to 10000] +**number_of_frames** | **int** | Number of frames for dark image collection; zero means no dark collection | [default to 1000] +**max_allowed_pixel_count** | **int** | Maximum count in a pixel considered normal (not-masked) | [default to 1] +**max_frames_with_signal** | **int** | Maximum number of frames with signal in a pixel considered normal (not-masked) | [default to 10] + +## Example + +```python +from jfjoch_client.models.dark_mask_settings import DarkMaskSettings + +# TODO update the JSON string below +json = "{}" +# create an instance of DarkMaskSettings from a JSON string +dark_mask_settings_instance = DarkMaskSettings.from_json(json) +# print the JSON string representation of the object +print(DarkMaskSettings.to_json()) + +# convert the object into a dict +dark_mask_settings_dict = dark_mask_settings_instance.to_dict() +# create an instance of DarkMaskSettings from a dict +dark_mask_settings_from_dict = DarkMaskSettings.from_dict(dark_mask_settings_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/_sources/python_client/docs/DatasetSettings.md.txt b/_sources/python_client/docs/DatasetSettings.md.txt new file mode 100644 index 00000000..8143b0e8 --- /dev/null +++ b/_sources/python_client/docs/DatasetSettings.md.txt @@ -0,0 +1,66 @@ +# DatasetSettings + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**images_per_trigger** | **int** | For standard synchrotron data collection - this is number of images collected per one TTL trigger For XFEL (pulsed source) - this number is ignored and set to 1 For storage cell mode - this number is ignored and set to number of storage cells | [optional] [default to 1] +**ntrigger** | **int** | Number of TTL trigger that the detector is expected to receive during data collection | [optional] [default to 1] +**image_time_us** | **int** | Image time. If not provided (or zero value) the frame time is assumed as default. For JUNGFRAU image time must be multiple of frame time and max value is 256 * frame_time. In XFEL mode: summation happens for frames collected with multiple triggers. Ignored for storage cells and if raw data are saved. | [optional] +**beam_x_pxl** | **float** | /entry/detector/beam_center_x in NXmx Beam center in X direction [pixels] | +**beam_y_pxl** | **float** | /entry/detector/beam_center_y in NXmx Beam center in X direction [pixels] | +**detector_distance_mm** | **float** | /entry/detector/distance in NXmx Detector distance [mm] | +**incident_energy_ke_v** | **float** | Used to calculate /entry/beam/incident_wavelength in NXmx Incident particle (photon, electron) energy in keV | +**file_prefix** | **str** | Prefix for filenames. If left empty, no file will be saved. | [optional] [default to ''] +**images_per_file** | **int** | Number of files in a single HDF5 data file (0 = write all images to a single data file). | [optional] [default to 1000] +**space_group_number** | **int** | Number of space group for the crystal. Currently used solely as metadata, not relevant for image processing done in Jungfraujoch. | [optional] +**sample_name** | **str** | /entry/sample/name in NXmx Sample name | [optional] [default to ''] +**compression** | **str** | Compression type for the images transferred over ZeroMQ and saved to HDF5 file. | [optional] [default to 'bslz4'] +**total_flux** | **float** | /entry/beam/total_flux in NXmx Flux incident on beam plane in photons per second. In other words this is the flux integrated over area. [photons/s] | [optional] +**transmission** | **float** | /entry/instrument/attenuator/attenuator_transmission Transmission of attenuator (filter) [no units] | [optional] +**goniometer** | [**RotationAxis**](RotationAxis.md) | | [optional] +**grid_scan** | [**GridScan**](GridScan.md) | | [optional] +**header_appendix** | **object** | Header appendix, added as user_data/user to start ZeroMQ message (can be any valid JSON) In general, it is not saved in HDF5 file. However, if values are placed in \"hdf5\" object, `jfjoch_writer` will write them in /entry/data of the HDF5 file. This applies solely to string and number (double floating-point). No arrays/sub-objects is allowed. For example {\"hdf5\": {\"val1\":1, \"val2\":\"xyz\"}}, will write /entry/user/val1 and /entry/user/val2. | [optional] +**image_appendix** | **object** | Image appendix, added as user_data to image ZeroMQ message (can be any valid JSON) Not saved in HDF5 file | [optional] +**data_reduction_factor_serialmx** | **float** | Rate at which non-indexed images are accepted to be forwarded to writer. Value of 1.0 (default) means that all images are written. Values below zero mean that non-indexed images will be accepted with a given probability. | [optional] [default to 1.0] +**pixel_value_low_threshold** | **int** | Set all counts lower than the value to zero. When the value is set, negative numbers other than error pixel value are always set to zero. Setting to zero is equivalent to turning the option off. | [optional] +**run_number** | **int** | Number of run within an experimental session. Transferred over CBOR stream as \"series ID\", though not saved in HDF5 file. It is highly recommended to keep this number unique for each data collection during experimental series. If not provided, the number will be automatically incremented. | [optional] +**run_name** | **str** | Unique ID of run. Transferred over CBOR stream as \"unique series ID\", though not saved in HDF5 file. It is highly recommended to keep this name unique for each data collection during experimental series. If not provided, the name will be automatically generated as number + colon + file_prefix. | [optional] +**experiment_group** | **str** | Name of group owning the data (e.g. p-group or proposal number). Transferred over CBOR stream, though not saved in HDF5 file. | [optional] +**poisson_compression** | **int** | Enable lossy compression of pixel values that preserves Poisson statistics. Requires to provide a numerical factor SQ. Pixel value P will be transformed to round(sqrt(P) * SQ), with rounding to the closest integer. Compression is turned off if the value is missing or it is set to zero. | [optional] +**write_nxmx_hdf5_master** | **bool** | Write NXmx formatted HDF5 master file. Recommended to use for macromolecular crystallography experiments and to turn off for other experiments. | [optional] [default to True] +**save_calibration** | **bool** | Forward image calibration (at the moment pedestal and pedestal RMS for JUNGFRAU) using the ZeroMQ stream to writer. If parameter is not provided calibration will be saved only if more than 4 images are recorded. | [optional] +**polarization_factor** | **float** | Polarization factor for integration; 1.0 is horizontal polarization; -1.0 is vertical polarization | [optional] +**ring_current_m_a** | **float** | Ring current at the beginning of the data collection | [optional] +**sample_temperature_k** | **float** | Sample temperature in Kelvin | [optional] +**poni_rot1_rad** | **float** | PONI angle rot1 (see PyFAI documentation for details) in radians | [optional] [default to 0.0] +**poni_rot2_rad** | **float** | PONI angle rot2 (see PyFAI documentation for details) in radians | [optional] [default to 0.0] +**poni_rot3_rad** | **float** | PONI angle rot3 (see PyFAI documentation for details) in radians | [optional] [default to 0.0] +**unit_cell** | [**UnitCell**](UnitCell.md) | | [optional] +**spot_finding** | **bool** | Enable spot finding and save spots | [optional] [default to True] +**max_spot_count** | **int** | Maximum number of spots that are saved/used for indexing; spots with highest intensity are selected | [optional] [default to 250] +**detect_ice_rings** | **bool** | Flag spots as ice rings and reduce their effect on indexing | [optional] +**async_start** | **bool** | When set to true, `/start` will not wait for detector and Jungfraujoch to be ready for the measurement. | [optional] [default to False] +**xray_fluorescence_spectrum** | [**DatasetSettingsXrayFluorescenceSpectrum**](DatasetSettingsXrayFluorescenceSpectrum.md) | | [optional] + +## Example + +```python +from jfjoch_client.models.dataset_settings import DatasetSettings + +# TODO update the JSON string below +json = "{}" +# create an instance of DatasetSettings from a JSON string +dataset_settings_instance = DatasetSettings.from_json(json) +# print the JSON string representation of the object +print(DatasetSettings.to_json()) + +# convert the object into a dict +dataset_settings_dict = dataset_settings_instance.to_dict() +# create an instance of DatasetSettings from a dict +dataset_settings_from_dict = DatasetSettings.from_dict(dataset_settings_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/_sources/python_client/docs/DatasetSettingsUnitCell.md.txt b/_sources/python_client/docs/DatasetSettingsUnitCell.md.txt new file mode 100644 index 00000000..891252b1 --- /dev/null +++ b/_sources/python_client/docs/DatasetSettingsUnitCell.md.txt @@ -0,0 +1,35 @@ +# DatasetSettingsUnitCell + +Unit cell parameters. Necessary to run indexing. Units of angstrom and degree + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**a** | **float** | | +**b** | **float** | | +**c** | **float** | | +**alpha** | **float** | | +**beta** | **float** | | +**gamma** | **float** | | + +## Example + +```python +from jfjoch_client.models.dataset_settings_unit_cell import DatasetSettingsUnitCell + +# TODO update the JSON string below +json = "{}" +# create an instance of DatasetSettingsUnitCell from a JSON string +dataset_settings_unit_cell_instance = DatasetSettingsUnitCell.from_json(json) +# print the JSON string representation of the object +print(DatasetSettingsUnitCell.to_json()) + +# convert the object into a dict +dataset_settings_unit_cell_dict = dataset_settings_unit_cell_instance.to_dict() +# create an instance of DatasetSettingsUnitCell from a dict +dataset_settings_unit_cell_from_dict = DatasetSettingsUnitCell.from_dict(dataset_settings_unit_cell_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/_sources/python_client/docs/DatasetSettingsXrayFluorescenceSpectrum.md.txt b/_sources/python_client/docs/DatasetSettingsXrayFluorescenceSpectrum.md.txt new file mode 100644 index 00000000..98802cfa --- /dev/null +++ b/_sources/python_client/docs/DatasetSettingsXrayFluorescenceSpectrum.md.txt @@ -0,0 +1,30 @@ +# DatasetSettingsXrayFluorescenceSpectrum + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**energy_e_v** | **List[float]** | X-ray fluorescence scan energy for each measurement point | +**data** | **List[float]** | X-ray fluorescence scan result in arbitrary units; must be exactly the same length, as energy_eV | + +## Example + +```python +from jfjoch_client.models.dataset_settings_xray_fluorescence_spectrum import DatasetSettingsXrayFluorescenceSpectrum + +# TODO update the JSON string below +json = "{}" +# create an instance of DatasetSettingsXrayFluorescenceSpectrum from a JSON string +dataset_settings_xray_fluorescence_spectrum_instance = DatasetSettingsXrayFluorescenceSpectrum.from_json(json) +# print the JSON string representation of the object +print(DatasetSettingsXrayFluorescenceSpectrum.to_json()) + +# convert the object into a dict +dataset_settings_xray_fluorescence_spectrum_dict = dataset_settings_xray_fluorescence_spectrum_instance.to_dict() +# create an instance of DatasetSettingsXrayFluorescenceSpectrum from a dict +dataset_settings_xray_fluorescence_spectrum_from_dict = DatasetSettingsXrayFluorescenceSpectrum.from_dict(dataset_settings_xray_fluorescence_spectrum_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/_sources/python_client/docs/DefaultApi.md.txt b/_sources/python_client/docs/DefaultApi.md.txt new file mode 100644 index 00000000..7db29ad4 --- /dev/null +++ b/_sources/python_client/docs/DefaultApi.md.txt @@ -0,0 +1,4213 @@ +# jfjoch_client.DefaultApi + +All URIs are relative to *http://localhost:5232* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**cancel_post**](DefaultApi.md#cancel_post) | **POST** /cancel | Cancel running data collection +[**config_azim_int_get**](DefaultApi.md#config_azim_int_get) | **GET** /config/azim_int | Get azimuthal integration configuration +[**config_azim_int_put**](DefaultApi.md#config_azim_int_put) | **PUT** /config/azim_int | Configure azimuthal integration +[**config_dark_mask_get**](DefaultApi.md#config_dark_mask_get) | **GET** /config/dark_mask | Get settings for dark data collection to calculate mask +[**config_dark_mask_put**](DefaultApi.md#config_dark_mask_put) | **PUT** /config/dark_mask | Set configuration for dark data collection to calculate mask +[**config_detector_get**](DefaultApi.md#config_detector_get) | **GET** /config/detector | Get detector configuration +[**config_detector_put**](DefaultApi.md#config_detector_put) | **PUT** /config/detector | Change detector configuration +[**config_file_writer_get**](DefaultApi.md#config_file_writer_get) | **GET** /config/file_writer | Get file writer settings +[**config_file_writer_put**](DefaultApi.md#config_file_writer_put) | **PUT** /config/file_writer | Change file writer settings +[**config_image_format_conversion_post**](DefaultApi.md#config_image_format_conversion_post) | **POST** /config/image_format/conversion | Configure format for data collection with full conversion +[**config_image_format_get**](DefaultApi.md#config_image_format_get) | **GET** /config/image_format | Get image output format +[**config_image_format_put**](DefaultApi.md#config_image_format_put) | **PUT** /config/image_format | Change image output format +[**config_image_format_raw_post**](DefaultApi.md#config_image_format_raw_post) | **POST** /config/image_format/raw | Configure format for raw data collection +[**config_indexing_get**](DefaultApi.md#config_indexing_get) | **GET** /config/indexing | Get indexing configuration +[**config_indexing_put**](DefaultApi.md#config_indexing_put) | **PUT** /config/indexing | Change indexing algorithm settings +[**config_instrument_get**](DefaultApi.md#config_instrument_get) | **GET** /config/instrument | Get instrument metadata +[**config_instrument_put**](DefaultApi.md#config_instrument_put) | **PUT** /config/instrument | Change instrument metadata +[**config_internal_generator_image_put**](DefaultApi.md#config_internal_generator_image_put) | **PUT** /config/internal_generator_image | Load binary image for internal FPGA generator +[**config_internal_generator_image_tiff_put**](DefaultApi.md#config_internal_generator_image_tiff_put) | **PUT** /config/internal_generator_image.tiff | Load TIFF image for internal FPGA generator +[**config_mask_get**](DefaultApi.md#config_mask_get) | **GET** /config/mask | Get mask of the detector (binary) +[**config_mask_tiff_get**](DefaultApi.md#config_mask_tiff_get) | **GET** /config/mask.tiff | Get mask of the detector (TIFF) +[**config_roi_get**](DefaultApi.md#config_roi_get) | **GET** /config/roi | Get ROI definitions +[**config_roi_put**](DefaultApi.md#config_roi_put) | **PUT** /config/roi | Upload ROI definitions +[**config_select_detector_get**](DefaultApi.md#config_select_detector_get) | **GET** /config/select_detector | List available detectors +[**config_select_detector_put**](DefaultApi.md#config_select_detector_put) | **PUT** /config/select_detector | Select detector +[**config_spot_finding_get**](DefaultApi.md#config_spot_finding_get) | **GET** /config/spot_finding | Get data processing configuration +[**config_spot_finding_put**](DefaultApi.md#config_spot_finding_put) | **PUT** /config/spot_finding | Configure spot finding +[**config_user_mask_get**](DefaultApi.md#config_user_mask_get) | **GET** /config/user_mask | Detector must be Initialized. Get user mask of the detector (binary) +[**config_user_mask_put**](DefaultApi.md#config_user_mask_put) | **PUT** /config/user_mask | Upload user mask of the detector (binary) +[**config_user_mask_tiff_get**](DefaultApi.md#config_user_mask_tiff_get) | **GET** /config/user_mask.tiff | Detector must be Initialized. Get user mask of the detector (TIFF) +[**config_user_mask_tiff_put**](DefaultApi.md#config_user_mask_tiff_put) | **PUT** /config/user_mask.tiff | Upload user mask of the detector +[**config_zeromq_metadata_get**](DefaultApi.md#config_zeromq_metadata_get) | **GET** /config/zeromq_metadata | Get ZeroMQ metadata socket settings +[**config_zeromq_metadata_put**](DefaultApi.md#config_zeromq_metadata_put) | **PUT** /config/zeromq_metadata | Set ZeroMQ metadata settings +[**config_zeromq_preview_get**](DefaultApi.md#config_zeromq_preview_get) | **GET** /config/zeromq_preview | Get ZeroMQ preview settings +[**config_zeromq_preview_put**](DefaultApi.md#config_zeromq_preview_put) | **PUT** /config/zeromq_preview | Set ZeroMQ preview settings +[**deactivate_post**](DefaultApi.md#deactivate_post) | **POST** /deactivate | Prepare detector to turn off +[**detector_status_get**](DefaultApi.md#detector_status_get) | **GET** /detector/status | Get detector status +[**fpga_status_get**](DefaultApi.md#fpga_status_get) | **GET** /fpga_status | Get status of FPGA devices +[**image_buffer_clear_post**](DefaultApi.md#image_buffer_clear_post) | **POST** /image_buffer/clear | Clear image buffer +[**image_buffer_image_cbor_get**](DefaultApi.md#image_buffer_image_cbor_get) | **GET** /image_buffer/image.cbor | Get image message in CBOR format +[**image_buffer_image_jpeg_get**](DefaultApi.md#image_buffer_image_jpeg_get) | **GET** /image_buffer/image.jpeg | Get preview image in JPEG format using custom settings +[**image_buffer_image_tiff_get**](DefaultApi.md#image_buffer_image_tiff_get) | **GET** /image_buffer/image.tiff | Get preview image in TIFF format +[**image_buffer_start_cbor_get**](DefaultApi.md#image_buffer_start_cbor_get) | **GET** /image_buffer/start.cbor | Get Start message in CBOR format +[**image_buffer_status_get**](DefaultApi.md#image_buffer_status_get) | **GET** /image_buffer/status | Get status of the image buffers +[**image_pusher_status_get**](DefaultApi.md#image_pusher_status_get) | **GET** /image_pusher/status | Get status of image pusher +[**initialize_post**](DefaultApi.md#initialize_post) | **POST** /initialize | Initialize detector and data acquisition +[**pedestal_post**](DefaultApi.md#pedestal_post) | **POST** /pedestal | Collect dark current for the detector +[**preview_pedestal_tiff_get**](DefaultApi.md#preview_pedestal_tiff_get) | **GET** /preview/pedestal.tiff | Get pedestal in TIFF format +[**preview_plot_bin_get**](DefaultApi.md#preview_plot_bin_get) | **GET** /preview/plot.bin | Generate 1D plot from Jungfraujoch and send in raw binary format. Data are provided as (32-bit) float binary array. This format doesn't transmit information about X-axis, only values, so it is of limited use for azimuthal integration. +[**preview_plot_get**](DefaultApi.md#preview_plot_get) | **GET** /preview/plot | Generate 1D plot from Jungfraujoch +[**result_scan_get**](DefaultApi.md#result_scan_get) | **GET** /result/scan | Get full scan result +[**start_post**](DefaultApi.md#start_post) | **POST** /start | Start detector +[**statistics_calibration_get**](DefaultApi.md#statistics_calibration_get) | **GET** /statistics/calibration | Get calibration statistics +[**statistics_data_collection_get**](DefaultApi.md#statistics_data_collection_get) | **GET** /statistics/data_collection | Get data collection statistics +[**statistics_get**](DefaultApi.md#statistics_get) | **GET** /statistics | Get general statistics +[**status_get**](DefaultApi.md#status_get) | **GET** /status | Get Jungfraujoch status +[**trigger_post**](DefaultApi.md#trigger_post) | **POST** /trigger | Send soft trigger to the detector +[**version_get**](DefaultApi.md#version_get) | **GET** /version | Get Jungfraujoch version of jfjoch_broker +[**wait_till_done_post**](DefaultApi.md#wait_till_done_post) | **POST** /wait_till_done | Wait for acquisition done +[**wait_until_running_post**](DefaultApi.md#wait_until_running_post) | **POST** /wait_until_running | Wait for acquisition running +[**xfel_event_code_get**](DefaultApi.md#xfel_event_code_get) | **GET** /xfel/event_code | Return XFEL event codes for the current data acquisition +[**xfel_pulse_id_get**](DefaultApi.md#xfel_pulse_id_get) | **GET** /xfel/pulse_id | Return XFEL pulse IDs for the current data acquisition + + +# **cancel_post** +> cancel_post() + +Cancel running data collection + +Command will inform FPGA network card to stop pedestal or data collection at the current stage. +Any frame that is currently being processed by CPU will be finished and sent to writer. +Given the command is making sure to gracefully stop data acquisition and detector, it might take some time to switch back after command finished to `Idle` state. + +If data collection is not running, the command has no effect. + + +### Example + + +```python +import jfjoch_client +from jfjoch_client.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost:5232 +# See configuration.py for a list of all supported configuration parameters. +configuration = jfjoch_client.Configuration( + host = "http://localhost:5232" +) + + +# Enter a context with an instance of the API client +with jfjoch_client.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = jfjoch_client.DefaultApi(api_client) + + try: + # Cancel running data collection + api_instance.cancel_post() + except Exception as e: + print("Exception when calling DefaultApi->cancel_post: %s\n" % e) +``` + + + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +void (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: Not defined + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Cancel request sent to FPGAs (or ignored, as data collection is not running) | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **config_azim_int_get** +> AzimIntSettings config_azim_int_get() + +Get azimuthal integration configuration + +Can be done anytime + +### Example + + +```python +import jfjoch_client +from jfjoch_client.models.azim_int_settings import AzimIntSettings +from jfjoch_client.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost:5232 +# See configuration.py for a list of all supported configuration parameters. +configuration = jfjoch_client.Configuration( + host = "http://localhost:5232" +) + + +# Enter a context with an instance of the API client +with jfjoch_client.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = jfjoch_client.DefaultApi(api_client) + + try: + # Get azimuthal integration configuration + api_response = api_instance.config_azim_int_get() + print("The response of DefaultApi->config_azim_int_get:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling DefaultApi->config_azim_int_get: %s\n" % e) +``` + + + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**AzimIntSettings**](AzimIntSettings.md) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Everything OK | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **config_azim_int_put** +> config_azim_int_put(azim_int_settings=azim_int_settings) + +Configure azimuthal integration + +Can be done when detector is Inactive or Idle + +### Example + + +```python +import jfjoch_client +from jfjoch_client.models.azim_int_settings import AzimIntSettings +from jfjoch_client.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost:5232 +# See configuration.py for a list of all supported configuration parameters. +configuration = jfjoch_client.Configuration( + host = "http://localhost:5232" +) + + +# Enter a context with an instance of the API client +with jfjoch_client.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = jfjoch_client.DefaultApi(api_client) + azim_int_settings = jfjoch_client.AzimIntSettings() # AzimIntSettings | (optional) + + try: + # Configure azimuthal integration + api_instance.config_azim_int_put(azim_int_settings=azim_int_settings) + except Exception as e: + print("Exception when calling DefaultApi->config_azim_int_put: %s\n" % e) +``` + + + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **azim_int_settings** | [**AzimIntSettings**](AzimIntSettings.md)| | [optional] + +### Return type + +void (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: application/json + - **Accept**: text/plain, application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Everything OK | - | +**400** | Input parsing or validation error | - | +**500** | Error within Jungfraujoch code - see output message. | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **config_dark_mask_get** +> DarkMaskSettings config_dark_mask_get() + +Get settings for dark data collection to calculate mask + +### Example + + +```python +import jfjoch_client +from jfjoch_client.models.dark_mask_settings import DarkMaskSettings +from jfjoch_client.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost:5232 +# See configuration.py for a list of all supported configuration parameters. +configuration = jfjoch_client.Configuration( + host = "http://localhost:5232" +) + + +# Enter a context with an instance of the API client +with jfjoch_client.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = jfjoch_client.DefaultApi(api_client) + + try: + # Get settings for dark data collection to calculate mask + api_response = api_instance.config_dark_mask_get() + print("The response of DefaultApi->config_dark_mask_get:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling DefaultApi->config_dark_mask_get: %s\n" % e) +``` + + + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**DarkMaskSettings**](DarkMaskSettings.md) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Everything OK | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **config_dark_mask_put** +> config_dark_mask_put(dark_mask_settings=dark_mask_settings) + +Set configuration for dark data collection to calculate mask + +This is only possible when operating DECTRIS detectors at the moment; it will be also available for PSI EIGER at some point. +This can only be done when detector is `Idle`, `Error` or `Inactive` states. + + +### Example + + +```python +import jfjoch_client +from jfjoch_client.models.dark_mask_settings import DarkMaskSettings +from jfjoch_client.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost:5232 +# See configuration.py for a list of all supported configuration parameters. +configuration = jfjoch_client.Configuration( + host = "http://localhost:5232" +) + + +# Enter a context with an instance of the API client +with jfjoch_client.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = jfjoch_client.DefaultApi(api_client) + dark_mask_settings = jfjoch_client.DarkMaskSettings() # DarkMaskSettings | (optional) + + try: + # Set configuration for dark data collection to calculate mask + api_instance.config_dark_mask_put(dark_mask_settings=dark_mask_settings) + except Exception as e: + print("Exception when calling DefaultApi->config_dark_mask_put: %s\n" % e) +``` + + + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **dark_mask_settings** | [**DarkMaskSettings**](DarkMaskSettings.md)| | [optional] + +### Return type + +void (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: application/json + - **Accept**: text/plain, application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Everything OK | - | +**400** | Input parsing or validation error | - | +**500** | Error within Jungfraujoch code - see output message. | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **config_detector_get** +> DetectorSettings config_detector_get() + +Get detector configuration + +Can be done anytime + +### Example + + +```python +import jfjoch_client +from jfjoch_client.models.detector_settings import DetectorSettings +from jfjoch_client.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost:5232 +# See configuration.py for a list of all supported configuration parameters. +configuration = jfjoch_client.Configuration( + host = "http://localhost:5232" +) + + +# Enter a context with an instance of the API client +with jfjoch_client.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = jfjoch_client.DefaultApi(api_client) + + try: + # Get detector configuration + api_response = api_instance.config_detector_get() + print("The response of DefaultApi->config_detector_get:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling DefaultApi->config_detector_get: %s\n" % e) +``` + + + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**DetectorSettings**](DetectorSettings.md) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Everything OK | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **config_detector_put** +> config_detector_put(detector_settings=detector_settings) + +Change detector configuration + +Detector settings are ones that have effect on calibration, i.e., pedestal has to be collected again after changing these settings. +This can only be done when detector is `Idle`, `Error` or `Inactive` states. +If detector is in `Idle` state , pedestal procedure will be executed automatically - there must be no X-rays on the detector during the operation. +If detector is in `Inactive` or `Error` states, new settings will be saved, but no calibration will be executed. + + +### Example + + +```python +import jfjoch_client +from jfjoch_client.models.detector_settings import DetectorSettings +from jfjoch_client.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost:5232 +# See configuration.py for a list of all supported configuration parameters. +configuration = jfjoch_client.Configuration( + host = "http://localhost:5232" +) + + +# Enter a context with an instance of the API client +with jfjoch_client.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = jfjoch_client.DefaultApi(api_client) + detector_settings = jfjoch_client.DetectorSettings() # DetectorSettings | (optional) + + try: + # Change detector configuration + api_instance.config_detector_put(detector_settings=detector_settings) + except Exception as e: + print("Exception when calling DefaultApi->config_detector_put: %s\n" % e) +``` + + + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **detector_settings** | [**DetectorSettings**](DetectorSettings.md)| | [optional] + +### Return type + +void (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: application/json + - **Accept**: text/plain, application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Everything OK | - | +**400** | Input parsing or validation error | - | +**500** | Error within Jungfraujoch code - see output message. | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **config_file_writer_get** +> FileWriterSettings config_file_writer_get() + +Get file writer settings + +Can be done anytime + +### Example + + +```python +import jfjoch_client +from jfjoch_client.models.file_writer_settings import FileWriterSettings +from jfjoch_client.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost:5232 +# See configuration.py for a list of all supported configuration parameters. +configuration = jfjoch_client.Configuration( + host = "http://localhost:5232" +) + + +# Enter a context with an instance of the API client +with jfjoch_client.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = jfjoch_client.DefaultApi(api_client) + + try: + # Get file writer settings + api_response = api_instance.config_file_writer_get() + print("The response of DefaultApi->config_file_writer_get:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling DefaultApi->config_file_writer_get: %s\n" % e) +``` + + + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**FileWriterSettings**](FileWriterSettings.md) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Everything OK | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **config_file_writer_put** +> config_file_writer_put(file_writer_settings=file_writer_settings) + +Change file writer settings + +This can only be done when detector is `Idle`, `Error` or `Inactive` states. + + +### Example + + +```python +import jfjoch_client +from jfjoch_client.models.file_writer_settings import FileWriterSettings +from jfjoch_client.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost:5232 +# See configuration.py for a list of all supported configuration parameters. +configuration = jfjoch_client.Configuration( + host = "http://localhost:5232" +) + + +# Enter a context with an instance of the API client +with jfjoch_client.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = jfjoch_client.DefaultApi(api_client) + file_writer_settings = jfjoch_client.FileWriterSettings() # FileWriterSettings | (optional) + + try: + # Change file writer settings + api_instance.config_file_writer_put(file_writer_settings=file_writer_settings) + except Exception as e: + print("Exception when calling DefaultApi->config_file_writer_put: %s\n" % e) +``` + + + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **file_writer_settings** | [**FileWriterSettings**](FileWriterSettings.md)| | [optional] + +### Return type + +void (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: application/json + - **Accept**: text/plain, application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Everything OK | - | +**400** | Input parsing or validation error | - | +**500** | Error within Jungfraujoch code - see output message. | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **config_image_format_conversion_post** +> config_image_format_conversion_post() + +Configure format for data collection with full conversion + +This can only be done when detector is `Idle`, `Error` or `Inactive` states. + + +### Example + + +```python +import jfjoch_client +from jfjoch_client.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost:5232 +# See configuration.py for a list of all supported configuration parameters. +configuration = jfjoch_client.Configuration( + host = "http://localhost:5232" +) + + +# Enter a context with an instance of the API client +with jfjoch_client.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = jfjoch_client.DefaultApi(api_client) + + try: + # Configure format for data collection with full conversion + api_instance.config_image_format_conversion_post() + except Exception as e: + print("Exception when calling DefaultApi->config_image_format_conversion_post: %s\n" % e) +``` + + + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +void (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Everything OK | - | +**500** | Error within Jungfraujoch code - see output message. | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **config_image_format_get** +> ImageFormatSettings config_image_format_get() + +Get image output format + +Can be done anytime + +### Example + + +```python +import jfjoch_client +from jfjoch_client.models.image_format_settings import ImageFormatSettings +from jfjoch_client.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost:5232 +# See configuration.py for a list of all supported configuration parameters. +configuration = jfjoch_client.Configuration( + host = "http://localhost:5232" +) + + +# Enter a context with an instance of the API client +with jfjoch_client.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = jfjoch_client.DefaultApi(api_client) + + try: + # Get image output format + api_response = api_instance.config_image_format_get() + print("The response of DefaultApi->config_image_format_get:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling DefaultApi->config_image_format_get: %s\n" % e) +``` + + + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**ImageFormatSettings**](ImageFormatSettings.md) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Everything OK | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **config_image_format_put** +> config_image_format_put(image_format_settings=image_format_settings) + +Change image output format + +This can only be done when detector is `Idle`, `Error` or `Inactive` states. + + +### Example + + +```python +import jfjoch_client +from jfjoch_client.models.image_format_settings import ImageFormatSettings +from jfjoch_client.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost:5232 +# See configuration.py for a list of all supported configuration parameters. +configuration = jfjoch_client.Configuration( + host = "http://localhost:5232" +) + + +# Enter a context with an instance of the API client +with jfjoch_client.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = jfjoch_client.DefaultApi(api_client) + image_format_settings = jfjoch_client.ImageFormatSettings() # ImageFormatSettings | (optional) + + try: + # Change image output format + api_instance.config_image_format_put(image_format_settings=image_format_settings) + except Exception as e: + print("Exception when calling DefaultApi->config_image_format_put: %s\n" % e) +``` + + + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **image_format_settings** | [**ImageFormatSettings**](ImageFormatSettings.md)| | [optional] + +### Return type + +void (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: application/json + - **Accept**: text/plain, application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Everything OK | - | +**400** | Input parsing or validation error | - | +**500** | Error within Jungfraujoch code - see output message. | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **config_image_format_raw_post** +> config_image_format_raw_post() + +Configure format for raw data collection + +This can only be done when detector is `Idle`, `Error` or `Inactive` states. + + +### Example + + +```python +import jfjoch_client +from jfjoch_client.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost:5232 +# See configuration.py for a list of all supported configuration parameters. +configuration = jfjoch_client.Configuration( + host = "http://localhost:5232" +) + + +# Enter a context with an instance of the API client +with jfjoch_client.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = jfjoch_client.DefaultApi(api_client) + + try: + # Configure format for raw data collection + api_instance.config_image_format_raw_post() + except Exception as e: + print("Exception when calling DefaultApi->config_image_format_raw_post: %s\n" % e) +``` + + + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +void (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Everything OK | - | +**500** | Error within Jungfraujoch code - see output message. | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **config_indexing_get** +> IndexingSettings config_indexing_get() + +Get indexing configuration + +Can be done anytime + +### Example + + +```python +import jfjoch_client +from jfjoch_client.models.indexing_settings import IndexingSettings +from jfjoch_client.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost:5232 +# See configuration.py for a list of all supported configuration parameters. +configuration = jfjoch_client.Configuration( + host = "http://localhost:5232" +) + + +# Enter a context with an instance of the API client +with jfjoch_client.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = jfjoch_client.DefaultApi(api_client) + + try: + # Get indexing configuration + api_response = api_instance.config_indexing_get() + print("The response of DefaultApi->config_indexing_get:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling DefaultApi->config_indexing_get: %s\n" % e) +``` + + + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**IndexingSettings**](IndexingSettings.md) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Everything OK | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **config_indexing_put** +> config_indexing_put(indexing_settings=indexing_settings) + +Change indexing algorithm settings + +This can only be done when detector is `Idle`, `Error` or `Inactive` states. + + +### Example + + +```python +import jfjoch_client +from jfjoch_client.models.indexing_settings import IndexingSettings +from jfjoch_client.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost:5232 +# See configuration.py for a list of all supported configuration parameters. +configuration = jfjoch_client.Configuration( + host = "http://localhost:5232" +) + + +# Enter a context with an instance of the API client +with jfjoch_client.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = jfjoch_client.DefaultApi(api_client) + indexing_settings = jfjoch_client.IndexingSettings() # IndexingSettings | (optional) + + try: + # Change indexing algorithm settings + api_instance.config_indexing_put(indexing_settings=indexing_settings) + except Exception as e: + print("Exception when calling DefaultApi->config_indexing_put: %s\n" % e) +``` + + + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **indexing_settings** | [**IndexingSettings**](IndexingSettings.md)| | [optional] + +### Return type + +void (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: application/json + - **Accept**: text/plain, application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Everything OK | - | +**400** | Input parsing or validation error | - | +**500** | Error within Jungfraujoch code - see output message. | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **config_instrument_get** +> InstrumentMetadata config_instrument_get() + +Get instrument metadata + +Can be done anytime + +### Example + + +```python +import jfjoch_client +from jfjoch_client.models.instrument_metadata import InstrumentMetadata +from jfjoch_client.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost:5232 +# See configuration.py for a list of all supported configuration parameters. +configuration = jfjoch_client.Configuration( + host = "http://localhost:5232" +) + + +# Enter a context with an instance of the API client +with jfjoch_client.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = jfjoch_client.DefaultApi(api_client) + + try: + # Get instrument metadata + api_response = api_instance.config_instrument_get() + print("The response of DefaultApi->config_instrument_get:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling DefaultApi->config_instrument_get: %s\n" % e) +``` + + + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**InstrumentMetadata**](InstrumentMetadata.md) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Everything OK | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **config_instrument_put** +> config_instrument_put(instrument_metadata=instrument_metadata) + +Change instrument metadata + +This can only be done when detector is `Idle`, `Error` or `Inactive` states. + + +### Example + + +```python +import jfjoch_client +from jfjoch_client.models.instrument_metadata import InstrumentMetadata +from jfjoch_client.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost:5232 +# See configuration.py for a list of all supported configuration parameters. +configuration = jfjoch_client.Configuration( + host = "http://localhost:5232" +) + + +# Enter a context with an instance of the API client +with jfjoch_client.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = jfjoch_client.DefaultApi(api_client) + instrument_metadata = jfjoch_client.InstrumentMetadata() # InstrumentMetadata | (optional) + + try: + # Change instrument metadata + api_instance.config_instrument_put(instrument_metadata=instrument_metadata) + except Exception as e: + print("Exception when calling DefaultApi->config_instrument_put: %s\n" % e) +``` + + + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **instrument_metadata** | [**InstrumentMetadata**](InstrumentMetadata.md)| | [optional] + +### Return type + +void (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: application/json + - **Accept**: text/plain, application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Everything OK | - | +**400** | Input parsing or validation error | - | +**500** | Error within Jungfraujoch code - see output message. | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **config_internal_generator_image_put** +> config_internal_generator_image_put(id=id, body=body) + +Load binary image for internal FPGA generator + +Load image for internal FPGA generator. This can only happen in Idle state of the detector. +Requires binary blob with 16-bit integer numbers of size of detector in raw/converted coordinates +(depending on detector settings). + + +### Example + + +```python +import jfjoch_client +from jfjoch_client.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost:5232 +# See configuration.py for a list of all supported configuration parameters. +configuration = jfjoch_client.Configuration( + host = "http://localhost:5232" +) + + +# Enter a context with an instance of the API client +with jfjoch_client.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = jfjoch_client.DefaultApi(api_client) + id = 56 # int | Image id to upload (optional) + body = None # bytearray | (optional) + + try: + # Load binary image for internal FPGA generator + api_instance.config_internal_generator_image_put(id=id, body=body) + except Exception as e: + print("Exception when calling DefaultApi->config_internal_generator_image_put: %s\n" % e) +``` + + + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **id** | **int**| Image id to upload | [optional] + **body** | **bytearray**| | [optional] + +### Return type + +void (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: application/octet-stream + - **Accept**: text/plain + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Everything OK | - | +**400** | Input parsing or validation error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **config_internal_generator_image_tiff_put** +> config_internal_generator_image_tiff_put(id=id, body=body) + +Load TIFF image for internal FPGA generator + +Load image for internal FPGA generator. This can only happen in Idle state of the detector. +Requires TIFF with 16-bit integer numbers of size of detector in raw/converted coordinates +(depending on detector settings). + + +### Example + + +```python +import jfjoch_client +from jfjoch_client.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost:5232 +# See configuration.py for a list of all supported configuration parameters. +configuration = jfjoch_client.Configuration( + host = "http://localhost:5232" +) + + +# Enter a context with an instance of the API client +with jfjoch_client.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = jfjoch_client.DefaultApi(api_client) + id = 56 # int | Image ID to upload (optional) + body = None # bytearray | (optional) + + try: + # Load TIFF image for internal FPGA generator + api_instance.config_internal_generator_image_tiff_put(id=id, body=body) + except Exception as e: + print("Exception when calling DefaultApi->config_internal_generator_image_tiff_put: %s\n" % e) +``` + + + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **id** | **int**| Image ID to upload | [optional] + **body** | **bytearray**| | [optional] + +### Return type + +void (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: image/tiff + - **Accept**: text/plain + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Everything OK | - | +**400** | Input parsing or validation error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **config_mask_get** +> bytearray config_mask_get() + +Get mask of the detector (binary) + +Detector must be Initialized. +Get full pixel mask of the detector. +See NXmx standard for meaning of pixel values. + + +### Example + + +```python +import jfjoch_client +from jfjoch_client.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost:5232 +# See configuration.py for a list of all supported configuration parameters. +configuration = jfjoch_client.Configuration( + host = "http://localhost:5232" +) + + +# Enter a context with an instance of the API client +with jfjoch_client.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = jfjoch_client.DefaultApi(api_client) + + try: + # Get mask of the detector (binary) + api_response = api_instance.config_mask_get() + print("The response of DefaultApi->config_mask_get:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling DefaultApi->config_mask_get: %s\n" % e) +``` + + + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +**bytearray** + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/octet-stream + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Binary array (4 byte; unsigned) | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **config_mask_tiff_get** +> bytearray config_mask_tiff_get() + +Get mask of the detector (TIFF) + +Should be in `Idle` state. +Get full pixel mask of the detector +See NXmx standard for meaning of pixel values + + +### Example + + +```python +import jfjoch_client +from jfjoch_client.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost:5232 +# See configuration.py for a list of all supported configuration parameters. +configuration = jfjoch_client.Configuration( + host = "http://localhost:5232" +) + + +# Enter a context with an instance of the API client +with jfjoch_client.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = jfjoch_client.DefaultApi(api_client) + + try: + # Get mask of the detector (TIFF) + api_response = api_instance.config_mask_tiff_get() + print("The response of DefaultApi->config_mask_tiff_get:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling DefaultApi->config_mask_tiff_get: %s\n" % e) +``` + + + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +**bytearray** + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: image/tiff + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Pixel mask in TIFF format (4 byte; unsigned) | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **config_roi_get** +> RoiDefinitions config_roi_get() + +Get ROI definitions + +### Example + + +```python +import jfjoch_client +from jfjoch_client.models.roi_definitions import RoiDefinitions +from jfjoch_client.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost:5232 +# See configuration.py for a list of all supported configuration parameters. +configuration = jfjoch_client.Configuration( + host = "http://localhost:5232" +) + + +# Enter a context with an instance of the API client +with jfjoch_client.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = jfjoch_client.DefaultApi(api_client) + + try: + # Get ROI definitions + api_response = api_instance.config_roi_get() + print("The response of DefaultApi->config_roi_get:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling DefaultApi->config_roi_get: %s\n" % e) +``` + + + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**RoiDefinitions**](RoiDefinitions.md) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | OK | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **config_roi_put** +> config_roi_put(roi_definitions=roi_definitions) + +Upload ROI definitions + +### Example + + +```python +import jfjoch_client +from jfjoch_client.models.roi_definitions import RoiDefinitions +from jfjoch_client.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost:5232 +# See configuration.py for a list of all supported configuration parameters. +configuration = jfjoch_client.Configuration( + host = "http://localhost:5232" +) + + +# Enter a context with an instance of the API client +with jfjoch_client.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = jfjoch_client.DefaultApi(api_client) + roi_definitions = jfjoch_client.RoiDefinitions() # RoiDefinitions | (optional) + + try: + # Upload ROI definitions + api_instance.config_roi_put(roi_definitions=roi_definitions) + except Exception as e: + print("Exception when calling DefaultApi->config_roi_put: %s\n" % e) +``` + + + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **roi_definitions** | [**RoiDefinitions**](RoiDefinitions.md)| | [optional] + +### Return type + +void (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: application/json + - **Accept**: text/plain, application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Everything OK | - | +**400** | Input parsing or validation error | - | +**500** | Error within Jungfraujoch code - see output message. | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **config_select_detector_get** +> DetectorList config_select_detector_get() + +List available detectors + +Configured detectors that can be selected by used + +### Example + + +```python +import jfjoch_client +from jfjoch_client.models.detector_list import DetectorList +from jfjoch_client.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost:5232 +# See configuration.py for a list of all supported configuration parameters. +configuration = jfjoch_client.Configuration( + host = "http://localhost:5232" +) + + +# Enter a context with an instance of the API client +with jfjoch_client.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = jfjoch_client.DefaultApi(api_client) + + try: + # List available detectors + api_response = api_instance.config_select_detector_get() + print("The response of DefaultApi->config_select_detector_get:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling DefaultApi->config_select_detector_get: %s\n" % e) +``` + + + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**DetectorList**](DetectorList.md) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Everything OK | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **config_select_detector_put** +> config_select_detector_put(detector_selection=detector_selection) + +Select detector + +Jungfraujoch allows to control multiple detectors and/or region-of-interests. +The command allows to choose one detector from the list (ID has to be consistent with one provided by GET response). +Changing detector will set detector to `Inactive` state and will require reinitialization. + + +### Example + + +```python +import jfjoch_client +from jfjoch_client.models.detector_selection import DetectorSelection +from jfjoch_client.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost:5232 +# See configuration.py for a list of all supported configuration parameters. +configuration = jfjoch_client.Configuration( + host = "http://localhost:5232" +) + + +# Enter a context with an instance of the API client +with jfjoch_client.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = jfjoch_client.DefaultApi(api_client) + detector_selection = jfjoch_client.DetectorSelection() # DetectorSelection | (optional) + + try: + # Select detector + api_instance.config_select_detector_put(detector_selection=detector_selection) + except Exception as e: + print("Exception when calling DefaultApi->config_select_detector_put: %s\n" % e) +``` + + + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **detector_selection** | [**DetectorSelection**](DetectorSelection.md)| | [optional] + +### Return type + +void (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: application/json + - **Accept**: text/plain, application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Everything OK | - | +**400** | Input parsing or validation error | - | +**500** | Error within Jungfraujoch code - see output message. | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **config_spot_finding_get** +> SpotFindingSettings config_spot_finding_get() + +Get data processing configuration + +Can be done anytime + +### Example + + +```python +import jfjoch_client +from jfjoch_client.models.spot_finding_settings import SpotFindingSettings +from jfjoch_client.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost:5232 +# See configuration.py for a list of all supported configuration parameters. +configuration = jfjoch_client.Configuration( + host = "http://localhost:5232" +) + + +# Enter a context with an instance of the API client +with jfjoch_client.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = jfjoch_client.DefaultApi(api_client) + + try: + # Get data processing configuration + api_response = api_instance.config_spot_finding_get() + print("The response of DefaultApi->config_spot_finding_get:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling DefaultApi->config_spot_finding_get: %s\n" % e) +``` + + + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**SpotFindingSettings**](SpotFindingSettings.md) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Everything OK | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **config_spot_finding_put** +> config_spot_finding_put(spot_finding_settings=spot_finding_settings) + +Configure spot finding + +Can be done anytime, also while data collection is running + +### Example + + +```python +import jfjoch_client +from jfjoch_client.models.spot_finding_settings import SpotFindingSettings +from jfjoch_client.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost:5232 +# See configuration.py for a list of all supported configuration parameters. +configuration = jfjoch_client.Configuration( + host = "http://localhost:5232" +) + + +# Enter a context with an instance of the API client +with jfjoch_client.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = jfjoch_client.DefaultApi(api_client) + spot_finding_settings = jfjoch_client.SpotFindingSettings() # SpotFindingSettings | (optional) + + try: + # Configure spot finding + api_instance.config_spot_finding_put(spot_finding_settings=spot_finding_settings) + except Exception as e: + print("Exception when calling DefaultApi->config_spot_finding_put: %s\n" % e) +``` + + + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **spot_finding_settings** | [**SpotFindingSettings**](SpotFindingSettings.md)| | [optional] + +### Return type + +void (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: application/json + - **Accept**: text/plain + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Everything OK | - | +**400** | Input parsing or validation error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **config_user_mask_get** +> bytearray config_user_mask_get() + +Detector must be Initialized. Get user mask of the detector (binary) + +Get user pixel mask of the detector in the actual detector coordinates: 0 - good pixel, 1 - masked + +### Example + + +```python +import jfjoch_client +from jfjoch_client.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost:5232 +# See configuration.py for a list of all supported configuration parameters. +configuration = jfjoch_client.Configuration( + host = "http://localhost:5232" +) + + +# Enter a context with an instance of the API client +with jfjoch_client.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = jfjoch_client.DefaultApi(api_client) + + try: + # Detector must be Initialized. Get user mask of the detector (binary) + api_response = api_instance.config_user_mask_get() + print("The response of DefaultApi->config_user_mask_get:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling DefaultApi->config_user_mask_get: %s\n" % e) +``` + + + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +**bytearray** + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/octet-stream + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | User mask in binary format (4 byte; unsigned) | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **config_user_mask_put** +> config_user_mask_put(body=body) + +Upload user mask of the detector (binary) + +Should be in `Idle` state. +Upload user mask of the detector - this is for example to account for beam stop shadow or misbehaving regions. +If detector is conversion mode the mask can be both in raw (1024x512; stacked modules) or converted coordinates. +In the latter case - module gaps are ignored and don't need to be assigned value. +Mask is expected as binary array (4-byte; unsigned). +0 - good pixel, other value - masked +User mask is stored in NXmx pixel mask (bit 8), as well as used in spot finding and azimuthal integration. + + +### Example + + +```python +import jfjoch_client +from jfjoch_client.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost:5232 +# See configuration.py for a list of all supported configuration parameters. +configuration = jfjoch_client.Configuration( + host = "http://localhost:5232" +) + + +# Enter a context with an instance of the API client +with jfjoch_client.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = jfjoch_client.DefaultApi(api_client) + body = None # bytearray | (optional) + + try: + # Upload user mask of the detector (binary) + api_instance.config_user_mask_put(body=body) + except Exception as e: + print("Exception when calling DefaultApi->config_user_mask_put: %s\n" % e) +``` + + + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **body** | **bytearray**| | [optional] + +### Return type + +void (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: application/octet-stream + - **Accept**: application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | All good | - | +**400** | Mask is not 4-byte unsigned integer array or empty body | - | +**500** | Error within Jungfraujoch code - see output message. | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **config_user_mask_tiff_get** +> bytearray config_user_mask_tiff_get() + +Detector must be Initialized. Get user mask of the detector (TIFF) + +Get user pixel mask of the detector in the actual detector coordinates: 0 - good pixel, 1 - masked + +### Example + + +```python +import jfjoch_client +from jfjoch_client.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost:5232 +# See configuration.py for a list of all supported configuration parameters. +configuration = jfjoch_client.Configuration( + host = "http://localhost:5232" +) + + +# Enter a context with an instance of the API client +with jfjoch_client.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = jfjoch_client.DefaultApi(api_client) + + try: + # Detector must be Initialized. Get user mask of the detector (TIFF) + api_response = api_instance.config_user_mask_tiff_get() + print("The response of DefaultApi->config_user_mask_tiff_get:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling DefaultApi->config_user_mask_tiff_get: %s\n" % e) +``` + + + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +**bytearray** + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: image/tiff + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | User mask in TIFF format (4 byte; unsigned) | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **config_user_mask_tiff_put** +> config_user_mask_tiff_put(body=body) + +Upload user mask of the detector + +Should be in `Idle` state. +Upload user mask of the detector - this is for example to account for beam stop shadow or misbehaving regions. +If detector is conversion mode the mask can be both in raw (1024x512; stacked modules) or converted coordinates. +In the latter case - module gaps are ignored and don't need to be assigned value. +Mask is expected as TIFF (4-byte; unsigned). +0 - good pixel, other value - masked +User mask is stored in NXmx pixel mask (bit 8), as well as used in spot finding and azimuthal integration. +User mask is not automatically applied - i.e. pixels with user mask will have a valid pixel value in the images. + + +### Example + + +```python +import jfjoch_client +from jfjoch_client.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost:5232 +# See configuration.py for a list of all supported configuration parameters. +configuration = jfjoch_client.Configuration( + host = "http://localhost:5232" +) + + +# Enter a context with an instance of the API client +with jfjoch_client.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = jfjoch_client.DefaultApi(api_client) + body = None # bytearray | (optional) + + try: + # Upload user mask of the detector + api_instance.config_user_mask_tiff_put(body=body) + except Exception as e: + print("Exception when calling DefaultApi->config_user_mask_tiff_put: %s\n" % e) +``` + + + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **body** | **bytearray**| | [optional] + +### Return type + +void (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: image/tiff + - **Accept**: application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | All good | - | +**500** | Error within Jungfraujoch code - see output message. | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **config_zeromq_metadata_get** +> ZeromqMetadataSettings config_zeromq_metadata_get() + +Get ZeroMQ metadata socket settings + +### Example + + +```python +import jfjoch_client +from jfjoch_client.models.zeromq_metadata_settings import ZeromqMetadataSettings +from jfjoch_client.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost:5232 +# See configuration.py for a list of all supported configuration parameters. +configuration = jfjoch_client.Configuration( + host = "http://localhost:5232" +) + + +# Enter a context with an instance of the API client +with jfjoch_client.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = jfjoch_client.DefaultApi(api_client) + + try: + # Get ZeroMQ metadata socket settings + api_response = api_instance.config_zeromq_metadata_get() + print("The response of DefaultApi->config_zeromq_metadata_get:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling DefaultApi->config_zeromq_metadata_get: %s\n" % e) +``` + + + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**ZeromqMetadataSettings**](ZeromqMetadataSettings.md) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Everything OK | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **config_zeromq_metadata_put** +> config_zeromq_metadata_put(zeromq_metadata_settings=zeromq_metadata_settings) + +Set ZeroMQ metadata settings + +Jungfraujoch can generate metadata message stream on ZeroMQ PUB socket. This stream covers all images. +Here settings of the socket can be adjusted. +While the data structure contains also socket_address, this cannot be changed via HTTP and is ignore in PUT request. + + +### Example + + +```python +import jfjoch_client +from jfjoch_client.models.zeromq_metadata_settings import ZeromqMetadataSettings +from jfjoch_client.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost:5232 +# See configuration.py for a list of all supported configuration parameters. +configuration = jfjoch_client.Configuration( + host = "http://localhost:5232" +) + + +# Enter a context with an instance of the API client +with jfjoch_client.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = jfjoch_client.DefaultApi(api_client) + zeromq_metadata_settings = jfjoch_client.ZeromqMetadataSettings() # ZeromqMetadataSettings | (optional) + + try: + # Set ZeroMQ metadata settings + api_instance.config_zeromq_metadata_put(zeromq_metadata_settings=zeromq_metadata_settings) + except Exception as e: + print("Exception when calling DefaultApi->config_zeromq_metadata_put: %s\n" % e) +``` + + + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **zeromq_metadata_settings** | [**ZeromqMetadataSettings**](ZeromqMetadataSettings.md)| | [optional] + +### Return type + +void (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: application/json + - **Accept**: text/plain, application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Everything OK | - | +**400** | Input parsing or validation error | - | +**500** | Error within Jungfraujoch code - see output message. | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **config_zeromq_preview_get** +> ZeromqPreviewSettings config_zeromq_preview_get() + +Get ZeroMQ preview settings + +### Example + + +```python +import jfjoch_client +from jfjoch_client.models.zeromq_preview_settings import ZeromqPreviewSettings +from jfjoch_client.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost:5232 +# See configuration.py for a list of all supported configuration parameters. +configuration = jfjoch_client.Configuration( + host = "http://localhost:5232" +) + + +# Enter a context with an instance of the API client +with jfjoch_client.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = jfjoch_client.DefaultApi(api_client) + + try: + # Get ZeroMQ preview settings + api_response = api_instance.config_zeromq_preview_get() + print("The response of DefaultApi->config_zeromq_preview_get:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling DefaultApi->config_zeromq_preview_get: %s\n" % e) +``` + + + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**ZeromqPreviewSettings**](ZeromqPreviewSettings.md) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Everything OK | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **config_zeromq_preview_put** +> config_zeromq_preview_put(zeromq_preview_settings=zeromq_preview_settings) + +Set ZeroMQ preview settings + +Jungfraujoch can generate preview message stream on ZeroMQ SUB socket. +Here settings of the socket can be adjusted. +While the data structure contains also socket_address, this cannot be changed via HTTP and is ignore in PUT request. +Options set with this PUT request have no effect on HTTP based preview. + + +### Example + + +```python +import jfjoch_client +from jfjoch_client.models.zeromq_preview_settings import ZeromqPreviewSettings +from jfjoch_client.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost:5232 +# See configuration.py for a list of all supported configuration parameters. +configuration = jfjoch_client.Configuration( + host = "http://localhost:5232" +) + + +# Enter a context with an instance of the API client +with jfjoch_client.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = jfjoch_client.DefaultApi(api_client) + zeromq_preview_settings = jfjoch_client.ZeromqPreviewSettings() # ZeromqPreviewSettings | (optional) + + try: + # Set ZeroMQ preview settings + api_instance.config_zeromq_preview_put(zeromq_preview_settings=zeromq_preview_settings) + except Exception as e: + print("Exception when calling DefaultApi->config_zeromq_preview_put: %s\n" % e) +``` + + + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **zeromq_preview_settings** | [**ZeromqPreviewSettings**](ZeromqPreviewSettings.md)| | [optional] + +### Return type + +void (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: application/json + - **Accept**: text/plain, application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Everything OK | - | +**400** | Input parsing or validation error | - | +**500** | Error within Jungfraujoch code - see output message. | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **deactivate_post** +> deactivate_post() + +Prepare detector to turn off + +Should be in `Idle` or `Error` state. +Command deactivates data acquisition and turns off detector high voltage and ASIC. +Should be used always before turning off power from the detector. + + +### Example + + +```python +import jfjoch_client +from jfjoch_client.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost:5232 +# See configuration.py for a list of all supported configuration parameters. +configuration = jfjoch_client.Configuration( + host = "http://localhost:5232" +) + + +# Enter a context with an instance of the API client +with jfjoch_client.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = jfjoch_client.DefaultApi(api_client) + + try: + # Prepare detector to turn off + api_instance.deactivate_post() + except Exception as e: + print("Exception when calling DefaultApi->deactivate_post: %s\n" % e) +``` + + + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +void (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Detector ready to turn off | - | +**500** | Error within Jungfraujoch code - see output message. | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **detector_status_get** +> DetectorStatus detector_status_get() + +Get detector status + +Status of the JUNGFRAU detector + +### Example + + +```python +import jfjoch_client +from jfjoch_client.models.detector_status import DetectorStatus +from jfjoch_client.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost:5232 +# See configuration.py for a list of all supported configuration parameters. +configuration = jfjoch_client.Configuration( + host = "http://localhost:5232" +) + + +# Enter a context with an instance of the API client +with jfjoch_client.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = jfjoch_client.DefaultApi(api_client) + + try: + # Get detector status + api_response = api_instance.detector_status_get() + print("The response of DefaultApi->detector_status_get:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling DefaultApi->detector_status_get: %s\n" % e) +``` + + + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**DetectorStatus**](DetectorStatus.md) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json, text/plain + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Everything OK | - | +**404** | Running in \"simulator\" mode - no detector present | - | +**500** | Error encountered when trying to read status | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **fpga_status_get** +> List[FpgaStatusInner] fpga_status_get() + +Get status of FPGA devices + +### Example + + +```python +import jfjoch_client +from jfjoch_client.models.fpga_status_inner import FpgaStatusInner +from jfjoch_client.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost:5232 +# See configuration.py for a list of all supported configuration parameters. +configuration = jfjoch_client.Configuration( + host = "http://localhost:5232" +) + + +# Enter a context with an instance of the API client +with jfjoch_client.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = jfjoch_client.DefaultApi(api_client) + + try: + # Get status of FPGA devices + api_response = api_instance.fpga_status_get() + print("The response of DefaultApi->fpga_status_get:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling DefaultApi->fpga_status_get: %s\n" % e) +``` + + + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**List[FpgaStatusInner]**](FpgaStatusInner.md) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Everything OK | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **image_buffer_clear_post** +> image_buffer_clear_post() + +Clear image buffer + +Turns off image buffer for the last data collection. Can be only run when Jungfraujoch is not collecting data. + +### Example + + +```python +import jfjoch_client +from jfjoch_client.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost:5232 +# See configuration.py for a list of all supported configuration parameters. +configuration = jfjoch_client.Configuration( + host = "http://localhost:5232" +) + + +# Enter a context with an instance of the API client +with jfjoch_client.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = jfjoch_client.DefaultApi(api_client) + + try: + # Clear image buffer + api_instance.image_buffer_clear_post() + except Exception as e: + print("Exception when calling DefaultApi->image_buffer_clear_post: %s\n" % e) +``` + + + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +void (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Done | - | +**500** | Error within Jungfraujoch code - see output message. | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **image_buffer_image_cbor_get** +> bytearray image_buffer_image_cbor_get(id=id) + +Get image message in CBOR format + +Contains full image data and metadata. The image must come from the latest data collection. + +### Example + + +```python +import jfjoch_client +from jfjoch_client.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost:5232 +# See configuration.py for a list of all supported configuration parameters. +configuration = jfjoch_client.Configuration( + host = "http://localhost:5232" +) + + +# Enter a context with an instance of the API client +with jfjoch_client.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = jfjoch_client.DefaultApi(api_client) + id = -1 # int | Image ID in the image buffer. Special values: -1 - last image in the buffer, -2: last indexed image in the buffer (optional) (default to -1) + + try: + # Get image message in CBOR format + api_response = api_instance.image_buffer_image_cbor_get(id=id) + print("The response of DefaultApi->image_buffer_image_cbor_get:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling DefaultApi->image_buffer_image_cbor_get: %s\n" % e) +``` + + + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **id** | **int**| Image ID in the image buffer. Special values: -1 - last image in the buffer, -2: last indexed image in the buffer | [optional] [default to -1] + +### Return type + +**bytearray** + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/cbor, application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Return image message | - | +**404** | Image not present in the buffer - either not yet measured or already replaced by a next image. | - | +**500** | Error within Jungfraujoch code - see output message. | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **image_buffer_image_jpeg_get** +> bytearray image_buffer_image_jpeg_get(id=id, show_user_mask=show_user_mask, show_roi=show_roi, show_spots=show_spots, show_beam_center=show_beam_center, saturation=saturation, jpeg_quality=jpeg_quality, show_res_ring=show_res_ring, color=color, show_res_est=show_res_est) + +Get preview image in JPEG format using custom settings + +### Example + + +```python +import jfjoch_client +from jfjoch_client.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost:5232 +# See configuration.py for a list of all supported configuration parameters. +configuration = jfjoch_client.Configuration( + host = "http://localhost:5232" +) + + +# Enter a context with an instance of the API client +with jfjoch_client.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = jfjoch_client.DefaultApi(api_client) + id = -1 # int | Image ID in the image buffer. Special values: -1 - last image in the buffer, -2: last indexed image in the buffer (optional) (default to -1) + show_user_mask = False # bool | Show user mask (optional) (default to False) + show_roi = False # bool | Show ROI areas on the image (optional) (default to False) + show_spots = True # bool | Show spot finding results on the image (optional) (default to True) + show_beam_center = True # bool | Show beam center on the image (optional) (default to True) + saturation = 3.4 # float | Saturation value to set contrast in the preview image; if not provided, then autocontrast procedure is used (optional) + jpeg_quality = 100 # int | Quality of JPEG image (100 - highest; 0 - lowest) (optional) (default to 100) + show_res_ring = 0.1 # float | Show resolution ring, provided in Angstrom (optional) (default to 0.1) + color = indigo # str | Color scale for preview image (optional) (default to indigo) + show_res_est = False # bool | Show resolution estimation as a ring (optional) (default to False) + + try: + # Get preview image in JPEG format using custom settings + api_response = api_instance.image_buffer_image_jpeg_get(id=id, show_user_mask=show_user_mask, show_roi=show_roi, show_spots=show_spots, show_beam_center=show_beam_center, saturation=saturation, jpeg_quality=jpeg_quality, show_res_ring=show_res_ring, color=color, show_res_est=show_res_est) + print("The response of DefaultApi->image_buffer_image_jpeg_get:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling DefaultApi->image_buffer_image_jpeg_get: %s\n" % e) +``` + + + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **id** | **int**| Image ID in the image buffer. Special values: -1 - last image in the buffer, -2: last indexed image in the buffer | [optional] [default to -1] + **show_user_mask** | **bool**| Show user mask | [optional] [default to False] + **show_roi** | **bool**| Show ROI areas on the image | [optional] [default to False] + **show_spots** | **bool**| Show spot finding results on the image | [optional] [default to True] + **show_beam_center** | **bool**| Show beam center on the image | [optional] [default to True] + **saturation** | **float**| Saturation value to set contrast in the preview image; if not provided, then autocontrast procedure is used | [optional] + **jpeg_quality** | **int**| Quality of JPEG image (100 - highest; 0 - lowest) | [optional] [default to 100] + **show_res_ring** | **float**| Show resolution ring, provided in Angstrom | [optional] [default to 0.1] + **color** | **str**| Color scale for preview image | [optional] [default to indigo] + **show_res_est** | **bool**| Show resolution estimation as a ring | [optional] [default to False] + +### Return type + +**bytearray** + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: image/jpeg, text/plain, application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Preview image | - | +**404** | Image not present in the buffer - either not yet measured or already replaced by a next image. | - | +**400** | Input parsing or validation error | - | +**500** | Error within Jungfraujoch code - see output message. | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **image_buffer_image_tiff_get** +> bytearray image_buffer_image_tiff_get(id=id) + +Get preview image in TIFF format + +### Example + + +```python +import jfjoch_client +from jfjoch_client.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost:5232 +# See configuration.py for a list of all supported configuration parameters. +configuration = jfjoch_client.Configuration( + host = "http://localhost:5232" +) + + +# Enter a context with an instance of the API client +with jfjoch_client.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = jfjoch_client.DefaultApi(api_client) + id = -1 # int | Image ID in the image buffer. Special values: -1 - last image in the buffer, -2: last indexed image in the buffer (optional) (default to -1) + + try: + # Get preview image in TIFF format + api_response = api_instance.image_buffer_image_tiff_get(id=id) + print("The response of DefaultApi->image_buffer_image_tiff_get:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling DefaultApi->image_buffer_image_tiff_get: %s\n" % e) +``` + + + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **id** | **int**| Image ID in the image buffer. Special values: -1 - last image in the buffer, -2: last indexed image in the buffer | [optional] [default to -1] + +### Return type + +**bytearray** + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: image/tiff + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Preview image | - | +**404** | No preview image recorded so far | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **image_buffer_start_cbor_get** +> bytearray image_buffer_start_cbor_get() + +Get Start message in CBOR format + +Contains metadata for a dataset (e.g., experimental geometry) + +### Example + + +```python +import jfjoch_client +from jfjoch_client.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost:5232 +# See configuration.py for a list of all supported configuration parameters. +configuration = jfjoch_client.Configuration( + host = "http://localhost:5232" +) + + +# Enter a context with an instance of the API client +with jfjoch_client.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = jfjoch_client.DefaultApi(api_client) + + try: + # Get Start message in CBOR format + api_response = api_instance.image_buffer_start_cbor_get() + print("The response of DefaultApi->image_buffer_start_cbor_get:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling DefaultApi->image_buffer_start_cbor_get: %s\n" % e) +``` + + + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +**bytearray** + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/cbor, application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Return start message | - | +**404** | No measurement so far | - | +**500** | Error within Jungfraujoch code - see output message. | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **image_buffer_status_get** +> ImageBufferStatus image_buffer_status_get() + +Get status of the image buffers + +Can be run at any stage of Jungfraujoch operation, including during data collection. +The status of the image buffer is volatile during data collection - if data collection goes for more images than available buffer slots, +then image might be replaced in the buffer between calling /images and /image.cbor. + + +### Example + + +```python +import jfjoch_client +from jfjoch_client.models.image_buffer_status import ImageBufferStatus +from jfjoch_client.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost:5232 +# See configuration.py for a list of all supported configuration parameters. +configuration = jfjoch_client.Configuration( + host = "http://localhost:5232" +) + + +# Enter a context with an instance of the API client +with jfjoch_client.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = jfjoch_client.DefaultApi(api_client) + + try: + # Get status of the image buffers + api_response = api_instance.image_buffer_status_get() + print("The response of DefaultApi->image_buffer_status_get:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling DefaultApi->image_buffer_status_get: %s\n" % e) +``` + + + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**ImageBufferStatus**](ImageBufferStatus.md) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Done | - | +**500** | Error within Jungfraujoch code - see output message. | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **image_pusher_status_get** +> ImagePusherStatus image_pusher_status_get() + +Get status of image pusher + +### Example + + +```python +import jfjoch_client +from jfjoch_client.models.image_pusher_status import ImagePusherStatus +from jfjoch_client.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost:5232 +# See configuration.py for a list of all supported configuration parameters. +configuration = jfjoch_client.Configuration( + host = "http://localhost:5232" +) + + +# Enter a context with an instance of the API client +with jfjoch_client.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = jfjoch_client.DefaultApi(api_client) + + try: + # Get status of image pusher + api_response = api_instance.image_pusher_status_get() + print("The response of DefaultApi->image_pusher_status_get:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling DefaultApi->image_pusher_status_get: %s\n" % e) +``` + + + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**ImagePusherStatus**](ImagePusherStatus.md) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json, text/plain + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Everything OK | - | +**500** | Error encountered when trying to read status | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **initialize_post** +> initialize_post() + +Initialize detector and data acquisition + +Should be used in two cases: + - Detector is in `Inactive` state + - Detector is in `Error` state +X-ray shutter must be closed. +This operation will reconfigure network interface of the detector. +During operation of the detector it is recommended to use the `POST /pedestal` operation instead. +If storage cells are used, the execution time might be few minutes. + +This is async function - one needs to use `POST /wait_till_done` to ensure operation is done. + + +### Example + + +```python +import jfjoch_client +from jfjoch_client.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost:5232 +# See configuration.py for a list of all supported configuration parameters. +configuration = jfjoch_client.Configuration( + host = "http://localhost:5232" +) + + +# Enter a context with an instance of the API client +with jfjoch_client.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = jfjoch_client.DefaultApi(api_client) + + try: + # Initialize detector and data acquisition + api_instance.initialize_post() + except Exception as e: + print("Exception when calling DefaultApi->initialize_post: %s\n" % e) +``` + + + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +void (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Initialization started | - | +**500** | Error within Jungfraujoch code - see output message. | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **pedestal_post** +> pedestal_post() + +Collect dark current for the detector + +Updates calibration of the JUNGFRAU detector. Must be in `Idle` state. + +X-ray shutter must be closed. Recommended to run once per hour for long integration times (> 100 us). + +This is async function - one needs to use `POST /wait_till_done` to ensure operation is done. + + +### Example + + +```python +import jfjoch_client +from jfjoch_client.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost:5232 +# See configuration.py for a list of all supported configuration parameters. +configuration = jfjoch_client.Configuration( + host = "http://localhost:5232" +) + + +# Enter a context with an instance of the API client +with jfjoch_client.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = jfjoch_client.DefaultApi(api_client) + + try: + # Collect dark current for the detector + api_instance.pedestal_post() + except Exception as e: + print("Exception when calling DefaultApi->pedestal_post: %s\n" % e) +``` + + + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +void (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Everything OK | - | +**500** | Error within Jungfraujoch code - see output message. | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **preview_pedestal_tiff_get** +> bytearray preview_pedestal_tiff_get(gain_level, sc=sc) + +Get pedestal in TIFF format + +### Example + + +```python +import jfjoch_client +from jfjoch_client.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost:5232 +# See configuration.py for a list of all supported configuration parameters. +configuration = jfjoch_client.Configuration( + host = "http://localhost:5232" +) + + +# Enter a context with an instance of the API client +with jfjoch_client.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = jfjoch_client.DefaultApi(api_client) + gain_level = 56 # int | Gain level (0, 1, 2) + sc = 56 # int | Storage cell number (optional) + + try: + # Get pedestal in TIFF format + api_response = api_instance.preview_pedestal_tiff_get(gain_level, sc=sc) + print("The response of DefaultApi->preview_pedestal_tiff_get:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling DefaultApi->preview_pedestal_tiff_get: %s\n" % e) +``` + + + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **gain_level** | **int**| Gain level (0, 1, 2) | + **sc** | **int**| Storage cell number | [optional] + +### Return type + +**bytearray** + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: image/tiff + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Calibration image | - | +**400** | Invalid gain level or storage cell number | - | +**404** | No calibration recorded so far | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **preview_plot_bin_get** +> bytearray preview_plot_bin_get(type, roi=roi) + +Generate 1D plot from Jungfraujoch and send in raw binary format. Data are provided as (32-bit) float binary array. This format doesn't transmit information about X-axis, only values, so it is of limited use for azimuthal integration. + +### Example + + +```python +import jfjoch_client +from jfjoch_client.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost:5232 +# See configuration.py for a list of all supported configuration parameters. +configuration = jfjoch_client.Configuration( + host = "http://localhost:5232" +) + + +# Enter a context with an instance of the API client +with jfjoch_client.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = jfjoch_client.DefaultApi(api_client) + type = 'type_example' # str | Type of requested plot + roi = 'roi_example' # str | Name of ROI for which plot is requested (optional) + + try: + # Generate 1D plot from Jungfraujoch and send in raw binary format. Data are provided as (32-bit) float binary array. This format doesn't transmit information about X-axis, only values, so it is of limited use for azimuthal integration. + api_response = api_instance.preview_plot_bin_get(type, roi=roi) + print("The response of DefaultApi->preview_plot_bin_get:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling DefaultApi->preview_plot_bin_get: %s\n" % e) +``` + + + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **type** | **str**| Type of requested plot | + **roi** | **str**| Name of ROI for which plot is requested | [optional] + +### Return type + +**bytearray** + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/octet-stream, text/plain + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Everything OK. | - | +**400** | Input parsing or validation error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **preview_plot_get** +> Plots preview_plot_get(type, binning=binning, fill=fill, experimental_coord=experimental_coord, azint_unit=azint_unit) + +Generate 1D plot from Jungfraujoch + +### Example + + +```python +import jfjoch_client +from jfjoch_client.models.plots import Plots +from jfjoch_client.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost:5232 +# See configuration.py for a list of all supported configuration parameters. +configuration = jfjoch_client.Configuration( + host = "http://localhost:5232" +) + + +# Enter a context with an instance of the API client +with jfjoch_client.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = jfjoch_client.DefaultApi(api_client) + type = 'type_example' # str | Type of requested plot + binning = 1 # int | Binning of frames for the plot (0 = default binning) (optional) (default to 1) + fill = 3.4 # float | Fill value for elements that were missed during data collection (optional) + experimental_coord = False # bool | If measurement has goniometer axis defined, plot X-axis will represent rotation angle If measurement has grid scan defined, plot X-axis and Y-axis will represent grid position, Z will be used as the final value For still measurement the number is ignored (optional) (default to False) + azint_unit = Q_recipA # str | Unit used for azim int. (optional) (default to Q_recipA) + + try: + # Generate 1D plot from Jungfraujoch + api_response = api_instance.preview_plot_get(type, binning=binning, fill=fill, experimental_coord=experimental_coord, azint_unit=azint_unit) + print("The response of DefaultApi->preview_plot_get:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling DefaultApi->preview_plot_get: %s\n" % e) +``` + + + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **type** | **str**| Type of requested plot | + **binning** | **int**| Binning of frames for the plot (0 = default binning) | [optional] [default to 1] + **fill** | **float**| Fill value for elements that were missed during data collection | [optional] + **experimental_coord** | **bool**| If measurement has goniometer axis defined, plot X-axis will represent rotation angle If measurement has grid scan defined, plot X-axis and Y-axis will represent grid position, Z will be used as the final value For still measurement the number is ignored | [optional] [default to False] + **azint_unit** | **str**| Unit used for azim int. | [optional] [default to Q_recipA] + +### Return type + +[**Plots**](Plots.md) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json, text/plain + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Everything OK. | - | +**400** | Input parsing or validation error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **result_scan_get** +> ScanResult result_scan_get() + +Get full scan result + +### Example + + +```python +import jfjoch_client +from jfjoch_client.models.scan_result import ScanResult +from jfjoch_client.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost:5232 +# See configuration.py for a list of all supported configuration parameters. +configuration = jfjoch_client.Configuration( + host = "http://localhost:5232" +) + + +# Enter a context with an instance of the API client +with jfjoch_client.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = jfjoch_client.DefaultApi(api_client) + + try: + # Get full scan result + api_response = api_instance.result_scan_get() + print("The response of DefaultApi->result_scan_get:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling DefaultApi->result_scan_get: %s\n" % e) +``` + + + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**ScanResult**](ScanResult.md) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Everything OK. | - | +**404** | No grid scan recorded | - | +**500** | Error within Jungfraujoch code - see output message. | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **start_post** +> start_post(dataset_settings=dataset_settings) + +Start detector + +Start data acquisition. +Detector must be in `Idle` state. +Default behavior is for the call to block until detector is ready to accept soft/TTL triggers. +However, this behavior can be changed by settings `async_start` to true in the request body, +in which case the call will return immediately and one needs to use `/wait_until_running` to ensure detector is ready to run. + + +### Example + + +```python +import jfjoch_client +from jfjoch_client.models.dataset_settings import DatasetSettings +from jfjoch_client.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost:5232 +# See configuration.py for a list of all supported configuration parameters. +configuration = jfjoch_client.Configuration( + host = "http://localhost:5232" +) + + +# Enter a context with an instance of the API client +with jfjoch_client.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = jfjoch_client.DefaultApi(api_client) + dataset_settings = jfjoch_client.DatasetSettings() # DatasetSettings | (optional) + + try: + # Start detector + api_instance.start_post(dataset_settings=dataset_settings) + except Exception as e: + print("Exception when calling DefaultApi->start_post: %s\n" % e) +``` + + + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **dataset_settings** | [**DatasetSettings**](DatasetSettings.md)| | [optional] + +### Return type + +void (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: application/json + - **Accept**: text/plain, application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Everything OK | - | +**400** | Input parsing or validation error | - | +**500** | Error within Jungfraujoch code - see output message. | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **statistics_calibration_get** +> List[CalibrationStatisticsInner] statistics_calibration_get() + +Get calibration statistics + +Statistics are provided for each module/storage cell separately + +### Example + + +```python +import jfjoch_client +from jfjoch_client.models.calibration_statistics_inner import CalibrationStatisticsInner +from jfjoch_client.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost:5232 +# See configuration.py for a list of all supported configuration parameters. +configuration = jfjoch_client.Configuration( + host = "http://localhost:5232" +) + + +# Enter a context with an instance of the API client +with jfjoch_client.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = jfjoch_client.DefaultApi(api_client) + + try: + # Get calibration statistics + api_response = api_instance.statistics_calibration_get() + print("The response of DefaultApi->statistics_calibration_get:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling DefaultApi->statistics_calibration_get: %s\n" % e) +``` + + + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**List[CalibrationStatisticsInner]**](CalibrationStatisticsInner.md) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Everything OK | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **statistics_data_collection_get** +> MeasurementStatistics statistics_data_collection_get() + +Get data collection statistics + +Results of the last data collection + +### Example + + +```python +import jfjoch_client +from jfjoch_client.models.measurement_statistics import MeasurementStatistics +from jfjoch_client.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost:5232 +# See configuration.py for a list of all supported configuration parameters. +configuration = jfjoch_client.Configuration( + host = "http://localhost:5232" +) + + +# Enter a context with an instance of the API client +with jfjoch_client.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = jfjoch_client.DefaultApi(api_client) + + try: + # Get data collection statistics + api_response = api_instance.statistics_data_collection_get() + print("The response of DefaultApi->statistics_data_collection_get:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling DefaultApi->statistics_data_collection_get: %s\n" % e) +``` + + + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**MeasurementStatistics**](MeasurementStatistics.md) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Everything OK | - | +**404** | No data collection performed so far | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **statistics_get** +> JfjochStatistics statistics_get() + +Get general statistics + +### Example + + +```python +import jfjoch_client +from jfjoch_client.models.jfjoch_statistics import JfjochStatistics +from jfjoch_client.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost:5232 +# See configuration.py for a list of all supported configuration parameters. +configuration = jfjoch_client.Configuration( + host = "http://localhost:5232" +) + + +# Enter a context with an instance of the API client +with jfjoch_client.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = jfjoch_client.DefaultApi(api_client) + + try: + # Get general statistics + api_response = api_instance.statistics_get() + print("The response of DefaultApi->statistics_get:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling DefaultApi->statistics_get: %s\n" % e) +``` + + + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**JfjochStatistics**](JfjochStatistics.md) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Everything OK | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **status_get** +> BrokerStatus status_get() + +Get Jungfraujoch status + +Status of the data acquisition + +### Example + + +```python +import jfjoch_client +from jfjoch_client.models.broker_status import BrokerStatus +from jfjoch_client.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost:5232 +# See configuration.py for a list of all supported configuration parameters. +configuration = jfjoch_client.Configuration( + host = "http://localhost:5232" +) + + +# Enter a context with an instance of the API client +with jfjoch_client.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = jfjoch_client.DefaultApi(api_client) + + try: + # Get Jungfraujoch status + api_response = api_instance.status_get() + print("The response of DefaultApi->status_get:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling DefaultApi->status_get: %s\n" % e) +``` + + + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +[**BrokerStatus**](BrokerStatus.md) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Everything OK | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **trigger_post** +> trigger_post() + +Send soft trigger to the detector + +Generate soft trigger + +### Example + + +```python +import jfjoch_client +from jfjoch_client.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost:5232 +# See configuration.py for a list of all supported configuration parameters. +configuration = jfjoch_client.Configuration( + host = "http://localhost:5232" +) + + +# Enter a context with an instance of the API client +with jfjoch_client.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = jfjoch_client.DefaultApi(api_client) + + try: + # Send soft trigger to the detector + api_instance.trigger_post() + except Exception as e: + print("Exception when calling DefaultApi->trigger_post: %s\n" % e) +``` + + + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +void (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: Not defined + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Trigger sent | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **version_get** +> str version_get() + +Get Jungfraujoch version of jfjoch_broker + +### Example + + +```python +import jfjoch_client +from jfjoch_client.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost:5232 +# See configuration.py for a list of all supported configuration parameters. +configuration = jfjoch_client.Configuration( + host = "http://localhost:5232" +) + + +# Enter a context with an instance of the API client +with jfjoch_client.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = jfjoch_client.DefaultApi(api_client) + + try: + # Get Jungfraujoch version of jfjoch_broker + api_response = api_instance.version_get() + print("The response of DefaultApi->version_get:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling DefaultApi->version_get: %s\n" % e) +``` + + + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +**str** + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: text/plain + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Release number of Jungfraujoch | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **wait_till_done_post** +> wait_till_done_post(timeout=timeout) + +Wait for acquisition done + +Block execution of external script till initialization, data collection or pedestal is finished. +Running this command does not affect (cancel) running data collection, it is only to ensure synchronous execution of other software. + +To not block web server for a indefinite period of time, the procedure is provided with a timeout. +Extending timeout is possible, but requires to ensure safety that client will not close the connection and retry the connection. + + +### Example + + +```python +import jfjoch_client +from jfjoch_client.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost:5232 +# See configuration.py for a list of all supported configuration parameters. +configuration = jfjoch_client.Configuration( + host = "http://localhost:5232" +) + + +# Enter a context with an instance of the API client +with jfjoch_client.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = jfjoch_client.DefaultApi(api_client) + timeout = 60 # int | Timeout in seconds (0 == immediate response) (optional) (default to 60) + + try: + # Wait for acquisition done + api_instance.wait_till_done_post(timeout=timeout) + except Exception as e: + print("Exception when calling DefaultApi->wait_till_done_post: %s\n" % e) +``` + + + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **timeout** | **int**| Timeout in seconds (0 == immediate response) | [optional] [default to 60] + +### Return type + +void (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Detector in `Idle` state, another data collection can start immediately | - | +**400** | Timeout parameter out of bounds | - | +**500** | Error within Jungfraujoch code - see output message. | - | +**502** | Detector is inactive mode | - | +**504** | Timeout reached, need to restart operation | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **wait_until_running_post** +> wait_until_running_post(timeout=timeout) + +Wait for acquisition running + +Block execution of external script till detector and Jungfraujoch are ready to collect data. +To not block web server for a indefinite period of time, the procedure is provided with a timeout. +Extending timeout is possible, but requires to ensure safety that client will not close the connection and retry the connection. + + +### Example + + +```python +import jfjoch_client +from jfjoch_client.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost:5232 +# See configuration.py for a list of all supported configuration parameters. +configuration = jfjoch_client.Configuration( + host = "http://localhost:5232" +) + + +# Enter a context with an instance of the API client +with jfjoch_client.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = jfjoch_client.DefaultApi(api_client) + timeout = 60 # int | Timeout in seconds (0 == immediate response) (optional) (default to 60) + + try: + # Wait for acquisition running + api_instance.wait_until_running_post(timeout=timeout) + except Exception as e: + print("Exception when calling DefaultApi->wait_until_running_post: %s\n" % e) +``` + + + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **timeout** | **int**| Timeout in seconds (0 == immediate response) | [optional] [default to 60] + +### Return type + +void (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Detector in `Measuring` state | - | +**400** | Timeout parameter out of bounds | - | +**500** | Error within Jungfraujoch code - see output message. | - | +**502** | Detector is inactive mode | - | +**504** | Timeout reached, need to restart operation | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **xfel_event_code_get** +> List[int] xfel_event_code_get() + +Return XFEL event codes for the current data acquisition + +Return array of XFEL event codes + +### Example + + +```python +import jfjoch_client +from jfjoch_client.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost:5232 +# See configuration.py for a list of all supported configuration parameters. +configuration = jfjoch_client.Configuration( + host = "http://localhost:5232" +) + + +# Enter a context with an instance of the API client +with jfjoch_client.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = jfjoch_client.DefaultApi(api_client) + + try: + # Return XFEL event codes for the current data acquisition + api_response = api_instance.xfel_event_code_get() + print("The response of DefaultApi->xfel_event_code_get:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling DefaultApi->xfel_event_code_get: %s\n" % e) +``` + + + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +**List[int]** + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Event codes collected | - | +**404** | Not in XFEL mode or no acquisition recorded | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **xfel_pulse_id_get** +> List[int] xfel_pulse_id_get() + +Return XFEL pulse IDs for the current data acquisition + +Return array of XFEL pulse IDs - (-1) if image not recorded + +### Example + + +```python +import jfjoch_client +from jfjoch_client.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost:5232 +# See configuration.py for a list of all supported configuration parameters. +configuration = jfjoch_client.Configuration( + host = "http://localhost:5232" +) + + +# Enter a context with an instance of the API client +with jfjoch_client.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = jfjoch_client.DefaultApi(api_client) + + try: + # Return XFEL pulse IDs for the current data acquisition + api_response = api_instance.xfel_pulse_id_get() + print("The response of DefaultApi->xfel_pulse_id_get:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling DefaultApi->xfel_pulse_id_get: %s\n" % e) +``` + + + +### Parameters + +This endpoint does not need any parameter. + +### Return type + +**List[int]** + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Pulse ID collected | - | +**404** | Not in XFEL mode or no acquisition recorded | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + diff --git a/_sources/python_client/docs/Detector.md.txt b/_sources/python_client/docs/Detector.md.txt new file mode 100644 index 00000000..4c3a6497 --- /dev/null +++ b/_sources/python_client/docs/Detector.md.txt @@ -0,0 +1,49 @@ +# Detector + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**description** | **str** | | +**serial_number** | **str** | | [optional] [default to 'Unknown'] +**type** | [**DetectorType**](DetectorType.md) | | [optional] +**high_voltage_v** | **int** | | [optional] [default to 0] +**udp_interface_count** | **int** | | [optional] [default to 1] +**module_sync** | **bool** | Use module 0 as master for timing. Only applies to JUNGFRAU detector (this cannot be turned off for EIGER). | [optional] [default to True] +**sensor_thickness_um** | **float** | | [optional] [default to 320] +**readout_time_ns** | **int** | Minimum difference between frame time and count time in microseconds Defaults are 3'000 ns for EIGER and 20'000 ns for JUNGFRAU | [optional] +**min_count_time_ns** | **int** | Minimum count time available for the detector. | [optional] +**min_frame_time_ns** | **int** | Minimum frame time available for the detector. | [optional] +**calibration_file** | **List[str]** | Can be empty for all detectors - default calibration used. For JUNGFRAU: list of gain files, one entry per module. For EIGER: one directory (with detector settings) or list of trim bit files, one entry per half-module. | [optional] +**hostname** | **List[str]** | Hostname for detector module. One entry per module One entry per module. Either empty or number of module entries. | [optional] +**sensor_material** | **str** | | [optional] [default to 'Si'] +**tx_delay** | **List[int]** | | [optional] +**base_data_ipv4_address** | **str** | | [optional] +**standard_geometry** | [**StandardDetectorGeometry**](StandardDetectorGeometry.md) | | [optional] +**custom_geometry** | [**List[DetectorModule]**](DetectorModule.md) | | [optional] +**roi_mode** | **str** | ROI setting for DECTRIS detectors | [optional] [default to ''] +**mirror_y** | **bool** | Mirror detector in Y direction to account for MX convention of (0,0) point in top left corner | [optional] [default to True] +**temp_thresold_deg_c** | **int** | Temperature threshold for JUNGFRAU detector modules | [optional] [default to 55] +**default_settings** | [**DetectorSettings**](DetectorSettings.md) | | [optional] + +## Example + +```python +from jfjoch_client.models.detector import Detector + +# TODO update the JSON string below +json = "{}" +# create an instance of Detector from a JSON string +detector_instance = Detector.from_json(json) +# print the JSON string representation of the object +print(Detector.to_json()) + +# convert the object into a dict +detector_dict = detector_instance.to_dict() +# create an instance of Detector from a dict +detector_from_dict = Detector.from_dict(detector_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/_sources/python_client/docs/DetectorList.md.txt b/_sources/python_client/docs/DetectorList.md.txt new file mode 100644 index 00000000..c9928a2e --- /dev/null +++ b/_sources/python_client/docs/DetectorList.md.txt @@ -0,0 +1,30 @@ +# DetectorList + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**detectors** | [**List[DetectorListElement]**](DetectorListElement.md) | | +**current_id** | **int** | | + +## Example + +```python +from jfjoch_client.models.detector_list import DetectorList + +# TODO update the JSON string below +json = "{}" +# create an instance of DetectorList from a JSON string +detector_list_instance = DetectorList.from_json(json) +# print the JSON string representation of the object +print(DetectorList.to_json()) + +# convert the object into a dict +detector_list_dict = detector_list_instance.to_dict() +# create an instance of DetectorList from a dict +detector_list_from_dict = DetectorList.from_dict(detector_list_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/_sources/python_client/docs/DetectorListDetectorsInner.md.txt b/_sources/python_client/docs/DetectorListDetectorsInner.md.txt new file mode 100644 index 00000000..99845c5b --- /dev/null +++ b/_sources/python_client/docs/DetectorListDetectorsInner.md.txt @@ -0,0 +1,36 @@ +# DetectorListDetectorsInner + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**id** | **int** | | +**description** | **str** | | +**serial_number** | **str** | | +**base_ipv4_addr** | **str** | | +**udp_interface_count** | **int** | Number of UDP interfaces per detector module | +**nmodules** | **int** | | +**width** | **int** | | +**height** | **int** | | + +## Example + +```python +from jfjoch_client.models.detector_list_detectors_inner import DetectorListDetectorsInner + +# TODO update the JSON string below +json = "{}" +# create an instance of DetectorListDetectorsInner from a JSON string +detector_list_detectors_inner_instance = DetectorListDetectorsInner.from_json(json) +# print the JSON string representation of the object +print(DetectorListDetectorsInner.to_json()) + +# convert the object into a dict +detector_list_detectors_inner_dict = detector_list_detectors_inner_instance.to_dict() +# create an instance of DetectorListDetectorsInner from a dict +detector_list_detectors_inner_from_dict = DetectorListDetectorsInner.from_dict(detector_list_detectors_inner_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/_sources/python_client/docs/DetectorListElement.md.txt b/_sources/python_client/docs/DetectorListElement.md.txt new file mode 100644 index 00000000..34c0dc10 --- /dev/null +++ b/_sources/python_client/docs/DetectorListElement.md.txt @@ -0,0 +1,41 @@ +# DetectorListElement + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**id** | **int** | | +**description** | **str** | | +**serial_number** | **str** | | +**base_ipv4_addr** | **str** | | +**udp_interface_count** | **int** | Number of UDP interfaces per detector module | +**nmodules** | **int** | | +**width** | **int** | | +**height** | **int** | | +**pixel_size_mm** | **float** | | [optional] +**readout_time_ns** | **int** | | +**min_frame_time_ns** | **int** | | +**min_count_time_ns** | **int** | | +**type** | [**DetectorType**](DetectorType.md) | | [optional] + +## Example + +```python +from jfjoch_client.models.detector_list_element import DetectorListElement + +# TODO update the JSON string below +json = "{}" +# create an instance of DetectorListElement from a JSON string +detector_list_element_instance = DetectorListElement.from_json(json) +# print the JSON string representation of the object +print(DetectorListElement.to_json()) + +# convert the object into a dict +detector_list_element_dict = detector_list_element_instance.to_dict() +# create an instance of DetectorListElement from a dict +detector_list_element_from_dict = DetectorListElement.from_dict(detector_list_element_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/_sources/python_client/docs/DetectorModule.md.txt b/_sources/python_client/docs/DetectorModule.md.txt new file mode 100644 index 00000000..d5b6f2d7 --- /dev/null +++ b/_sources/python_client/docs/DetectorModule.md.txt @@ -0,0 +1,32 @@ +# DetectorModule + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**x0** | **float** | | +**y0** | **float** | | +**fast_axis** | [**DetectorModuleDirection**](DetectorModuleDirection.md) | | +**slow_axis** | [**DetectorModuleDirection**](DetectorModuleDirection.md) | | + +## Example + +```python +from jfjoch_client.models.detector_module import DetectorModule + +# TODO update the JSON string below +json = "{}" +# create an instance of DetectorModule from a JSON string +detector_module_instance = DetectorModule.from_json(json) +# print the JSON string representation of the object +print(DetectorModule.to_json()) + +# convert the object into a dict +detector_module_dict = detector_module_instance.to_dict() +# create an instance of DetectorModule from a dict +detector_module_from_dict = DetectorModule.from_dict(detector_module_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/_sources/python_client/docs/DetectorModuleDirection.md.txt b/_sources/python_client/docs/DetectorModuleDirection.md.txt new file mode 100644 index 00000000..bbdac0cd --- /dev/null +++ b/_sources/python_client/docs/DetectorModuleDirection.md.txt @@ -0,0 +1,16 @@ +# DetectorModuleDirection + + +## Enum + +* `XP` (value: `'Xp'`) + +* `XN` (value: `'Xn'`) + +* `YP` (value: `'Yp'`) + +* `YN` (value: `'Yn'`) + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/_sources/python_client/docs/DetectorPowerState.md.txt b/_sources/python_client/docs/DetectorPowerState.md.txt new file mode 100644 index 00000000..21627663 --- /dev/null +++ b/_sources/python_client/docs/DetectorPowerState.md.txt @@ -0,0 +1,15 @@ +# DetectorPowerState + +Power on of ASICs + +## Enum + +* `POWERON` (value: `'PowerOn'`) + +* `POWEROFF` (value: `'PowerOff'`) + +* `PARTIAL` (value: `'Partial'`) + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/_sources/python_client/docs/DetectorSelection.md.txt b/_sources/python_client/docs/DetectorSelection.md.txt new file mode 100644 index 00000000..993fc33c --- /dev/null +++ b/_sources/python_client/docs/DetectorSelection.md.txt @@ -0,0 +1,29 @@ +# DetectorSelection + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**id** | **int** | | + +## Example + +```python +from jfjoch_client.models.detector_selection import DetectorSelection + +# TODO update the JSON string below +json = "{}" +# create an instance of DetectorSelection from a JSON string +detector_selection_instance = DetectorSelection.from_json(json) +# print the JSON string representation of the object +print(DetectorSelection.to_json()) + +# convert the object into a dict +detector_selection_dict = detector_selection_instance.to_dict() +# create an instance of DetectorSelection from a dict +detector_selection_from_dict = DetectorSelection.from_dict(detector_selection_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/_sources/python_client/docs/DetectorSettings.md.txt b/_sources/python_client/docs/DetectorSettings.md.txt new file mode 100644 index 00000000..659508a7 --- /dev/null +++ b/_sources/python_client/docs/DetectorSettings.md.txt @@ -0,0 +1,44 @@ +# DetectorSettings + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**frame_time_us** | **int** | Interval between consecutive frames. This is internal frame time for the JUNGFRAU detector, image time has to be integer multiply of this number. For EIGER detector this is default frame time, not used otherwise | +**count_time_us** | **int** | Integration time of the detector. If not provided count time will be set to maximum value for a given frame time. | [optional] +**internal_frame_generator** | **bool** | Use internal frame generator in FPGA instead of getting data from a real detector | [optional] [default to False] +**internal_frame_generator_images** | **int** | Number of images stored in the internal frame generator. | [optional] [default to 1] +**detector_trigger_delay_ns** | **int** | Delay between TTL trigger and acquisition start [ns] | [optional] [default to 0] +**timing** | [**DetectorTiming**](DetectorTiming.md) | | [optional] [default to DetectorTiming.TRIGGER] +**eiger_threshold_ke_v** | **float** | Threshold for the PSI EIGER detector and all DECTRIS detectors. If value is provided, it will be used for all subsequent acquisitions, irrespective of beam energy. If value is not provided, threshold will be determined on start of acquisition as half of incident energy. This might lead to increased start time. | [optional] +**eiger_bit_depth** | **int** | Bit depth of PSI EIGER read-out. This is If value is not provided, depth will be determined based on the image time: * Exposure time < 500 microseconds depth of 8 bit will be used, * 500 <= exposure time < 2622 microseconds depth of 16 bit will be used * Exposure time >= 2622 microseconds depth of 32 bit will be used. | [optional] +**jungfrau_pedestal_g0_frames** | **int** | | [optional] [default to 2000] +**jungfrau_pedestal_g1_frames** | **int** | | [optional] [default to 300] +**jungfrau_pedestal_g2_frames** | **int** | | [optional] [default to 300] +**jungfrau_pedestal_min_image_count** | **int** | Minimum number of collected images for pedestal to consider it viable | [optional] [default to 128] +**jungfrau_storage_cell_count** | **int** | | [optional] [default to 1] +**jungfrau_storage_cell_delay_ns** | **int** | Delay between two storage cells [ns] | [optional] [default to 5000] +**jungfrau_fixed_gain_g1** | **bool** | Fix gain to G1 (can be useful for storage cells) | [optional] [default to False] +**jungfrau_use_gain_hg0** | **bool** | Use high G0 (for low energy applications) | [optional] [default to False] + +## Example + +```python +from jfjoch_client.models.detector_settings import DetectorSettings + +# TODO update the JSON string below +json = "{}" +# create an instance of DetectorSettings from a JSON string +detector_settings_instance = DetectorSettings.from_json(json) +# print the JSON string representation of the object +print(DetectorSettings.to_json()) + +# convert the object into a dict +detector_settings_dict = detector_settings_instance.to_dict() +# create an instance of DetectorSettings from a dict +detector_settings_from_dict = DetectorSettings.from_dict(detector_settings_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/_sources/python_client/docs/DetectorState.md.txt b/_sources/python_client/docs/DetectorState.md.txt new file mode 100644 index 00000000..cb7ab7a0 --- /dev/null +++ b/_sources/python_client/docs/DetectorState.md.txt @@ -0,0 +1,19 @@ +# DetectorState + +Current state of the detector + +## Enum + +* `IDLE` (value: `'Idle'`) + +* `WAITING` (value: `'Waiting'`) + +* `BUSY` (value: `'Busy'`) + +* `ERROR` (value: `'Error'`) + +* `NOT_CONNECTED` (value: `'Not connected'`) + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/_sources/python_client/docs/DetectorStatus.md.txt b/_sources/python_client/docs/DetectorStatus.md.txt new file mode 100644 index 00000000..a2b08e6d --- /dev/null +++ b/_sources/python_client/docs/DetectorStatus.md.txt @@ -0,0 +1,34 @@ +# DetectorStatus + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**state** | [**DetectorState**](DetectorState.md) | | +**powerchip** | [**DetectorPowerState**](DetectorPowerState.md) | | +**server_version** | **str** | Detector server (on read-out boards) version | +**number_of_triggers_left** | **int** | Remaining triggers to the detector (max of all modules) | +**fpga_temp_deg_c** | **List[int]** | Temperature of detector FPGAs | +**high_voltage_v** | **List[int]** | High voltage for detector modules | + +## Example + +```python +from jfjoch_client.models.detector_status import DetectorStatus + +# TODO update the JSON string below +json = "{}" +# create an instance of DetectorStatus from a JSON string +detector_status_instance = DetectorStatus.from_json(json) +# print the JSON string representation of the object +print(DetectorStatus.to_json()) + +# convert the object into a dict +detector_status_dict = detector_status_instance.to_dict() +# create an instance of DetectorStatus from a dict +detector_status_from_dict = DetectorStatus.from_dict(detector_status_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/_sources/python_client/docs/DetectorTiming.md.txt b/_sources/python_client/docs/DetectorTiming.md.txt new file mode 100644 index 00000000..65eedbfd --- /dev/null +++ b/_sources/python_client/docs/DetectorTiming.md.txt @@ -0,0 +1,16 @@ +# DetectorTiming + + +## Enum + +* `AUTO` (value: `'auto'`) + +* `TRIGGER` (value: `'trigger'`) + +* `BURST` (value: `'burst'`) + +* `GATED` (value: `'gated'`) + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/_sources/python_client/docs/DetectorType.md.txt b/_sources/python_client/docs/DetectorType.md.txt new file mode 100644 index 00000000..223c249b --- /dev/null +++ b/_sources/python_client/docs/DetectorType.md.txt @@ -0,0 +1,14 @@ +# DetectorType + + +## Enum + +* `EIGER` (value: `'EIGER'`) + +* `JUNGFRAU` (value: `'JUNGFRAU'`) + +* `DECTRIS` (value: `'DECTRIS'`) + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/_sources/python_client/docs/ErrorMessage.md.txt b/_sources/python_client/docs/ErrorMessage.md.txt new file mode 100644 index 00000000..89b25cc7 --- /dev/null +++ b/_sources/python_client/docs/ErrorMessage.md.txt @@ -0,0 +1,30 @@ +# ErrorMessage + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**msg** | **str** | Human readable message | +**reason** | **str** | Enumerate field for automated analysis | + +## Example + +```python +from jfjoch_client.models.error_message import ErrorMessage + +# TODO update the JSON string below +json = "{}" +# create an instance of ErrorMessage from a JSON string +error_message_instance = ErrorMessage.from_json(json) +# print the JSON string representation of the object +print(ErrorMessage.to_json()) + +# convert the object into a dict +error_message_dict = error_message_instance.to_dict() +# create an instance of ErrorMessage from a dict +error_message_from_dict = ErrorMessage.from_dict(error_message_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/_sources/python_client/docs/FileWriterFormat.md.txt b/_sources/python_client/docs/FileWriterFormat.md.txt new file mode 100644 index 00000000..b37c2016 --- /dev/null +++ b/_sources/python_client/docs/FileWriterFormat.md.txt @@ -0,0 +1,23 @@ +# FileWriterFormat + +NoFileWritten - no files are written at all NXmxOnlyData - only data files are written, no master file NXmxLegacy - legacy format with soft links to data files in the master file; necessary for DECTRIS Albula 4.0 and DECTRIS Neggia NXmxVDS - newer format with virtual dataset linking data files in the master file, also includes better metadata handling NXmxIntegrated - single HDF5 per dataset CBF - CBF format (limited metadata) TIFF - TIFF format (no metadata) + +## Enum + +* `NXMXONLYDATA` (value: `'NXmxOnlyData'`) + +* `NXMXLEGACY` (value: `'NXmxLegacy'`) + +* `NXMXVDS` (value: `'NXmxVDS'`) + +* `NXMXINTEGRATED` (value: `'NXmxIntegrated'`) + +* `CBF` (value: `'CBF'`) + +* `TIFF` (value: `'TIFF'`) + +* `NOFILEWRITTEN` (value: `'NoFileWritten'`) + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/_sources/python_client/docs/FileWriterSettings.md.txt b/_sources/python_client/docs/FileWriterSettings.md.txt new file mode 100644 index 00000000..3b041f79 --- /dev/null +++ b/_sources/python_client/docs/FileWriterSettings.md.txt @@ -0,0 +1,30 @@ +# FileWriterSettings + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**overwrite** | **bool** | Inform jfjoch_write to overwrite existing files. Otherwise files would be saved with .h5.{timestamp}.tmp suffix. | [optional] [default to False] +**format** | [**FileWriterFormat**](FileWriterFormat.md) | | [optional] [default to FileWriterFormat.NXMXLEGACY] + +## Example + +```python +from jfjoch_client.models.file_writer_settings import FileWriterSettings + +# TODO update the JSON string below +json = "{}" +# create an instance of FileWriterSettings from a JSON string +file_writer_settings_instance = FileWriterSettings.from_json(json) +# print the JSON string representation of the object +print(FileWriterSettings.to_json()) + +# convert the object into a dict +file_writer_settings_dict = file_writer_settings_instance.to_dict() +# create an instance of FileWriterSettings from a dict +file_writer_settings_from_dict = FileWriterSettings.from_dict(file_writer_settings_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/_sources/python_client/docs/FpgaStatusInner.md.txt b/_sources/python_client/docs/FpgaStatusInner.md.txt new file mode 100644 index 00000000..7461249f --- /dev/null +++ b/_sources/python_client/docs/FpgaStatusInner.md.txt @@ -0,0 +1,42 @@ +# FpgaStatusInner + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**pci_dev_id** | **str** | | +**serial_number** | **str** | | +**fw_version** | **str** | | +**base_mac_addr** | **str** | | +**eth_link_count** | **int** | | +**eth_link_status** | **int** | | +**power_usage_w** | **float** | | +**fpga_temp_c** | **float** | | +**hbm_temp_c** | **float** | | +**packets_udp** | **int** | | +**packets_sls** | **int** | | +**idle** | **bool** | | +**pcie_link_speed** | **int** | PCIe link speed measured by generation (expected value is 4 == PCIe Gen4) | +**pcie_link_width** | **int** | PCIe link width (expected value is 8 == x8) | + +## Example + +```python +from jfjoch_client.models.fpga_status_inner import FpgaStatusInner + +# TODO update the JSON string below +json = "{}" +# create an instance of FpgaStatusInner from a JSON string +fpga_status_inner_instance = FpgaStatusInner.from_json(json) +# print the JSON string representation of the object +print(FpgaStatusInner.to_json()) + +# convert the object into a dict +fpga_status_inner_dict = fpga_status_inner_instance.to_dict() +# create an instance of FpgaStatusInner from a dict +fpga_status_inner_from_dict = FpgaStatusInner.from_dict(fpga_status_inner_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/_sources/python_client/docs/GeomRefinementAlgorithm.md.txt b/_sources/python_client/docs/GeomRefinementAlgorithm.md.txt new file mode 100644 index 00000000..cc250fe0 --- /dev/null +++ b/_sources/python_client/docs/GeomRefinementAlgorithm.md.txt @@ -0,0 +1,13 @@ +# GeomRefinementAlgorithm + +Selection of an post-indexing detector geometry refinement algorithm used by Jungfraujoch. This option is using non-linear least squares optimization to find unit cell and beam center. + +## Enum + +* `BEAMCENTER` (value: `'BeamCenter'`) + +* `NONE` (value: `'None'`) + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/_sources/python_client/docs/GridPlot.md.txt b/_sources/python_client/docs/GridPlot.md.txt new file mode 100644 index 00000000..4f16bdb9 --- /dev/null +++ b/_sources/python_client/docs/GridPlot.md.txt @@ -0,0 +1,30 @@ +# GridPlot + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**data** | **List[float]** | | +**width** | **int** | | + +## Example + +```python +from jfjoch_client.models.grid_plot import GridPlot + +# TODO update the JSON string below +json = "{}" +# create an instance of GridPlot from a JSON string +grid_plot_instance = GridPlot.from_json(json) +# print the JSON string representation of the object +print(GridPlot.to_json()) + +# convert the object into a dict +grid_plot_dict = grid_plot_instance.to_dict() +# create an instance of GridPlot from a dict +grid_plot_from_dict = GridPlot.from_dict(grid_plot_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/_sources/python_client/docs/GridPlots.md.txt b/_sources/python_client/docs/GridPlots.md.txt new file mode 100644 index 00000000..309772c1 --- /dev/null +++ b/_sources/python_client/docs/GridPlots.md.txt @@ -0,0 +1,30 @@ +# GridPlots + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**plots** | [**List[GridPlot]**](GridPlot.md) | | +**width** | **int** | | + +## Example + +```python +from jfjoch_client.models.grid_plots import GridPlots + +# TODO update the JSON string below +json = "{}" +# create an instance of GridPlots from a JSON string +grid_plots_instance = GridPlots.from_json(json) +# print the JSON string representation of the object +print(GridPlots.to_json()) + +# convert the object into a dict +grid_plots_dict = grid_plots_instance.to_dict() +# create an instance of GridPlots from a dict +grid_plots_from_dict = GridPlots.from_dict(grid_plots_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/_sources/python_client/docs/GridScan.md.txt b/_sources/python_client/docs/GridScan.md.txt new file mode 100644 index 00000000..81b36bf6 --- /dev/null +++ b/_sources/python_client/docs/GridScan.md.txt @@ -0,0 +1,34 @@ +# GridScan + +Definition of a grid scan (mutually exclusive with `rotation_axis`) + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**n_fast** | **int** | Number of elements in the fast direction | +**step_x_um** | **float** | Step in grid along the fast direction. Can be negative. Positive number: left to right Negative number: right to left | +**step_y_um** | **float** | Step in grid along the slow direction. Can be negative. Positive number: top to bottom Negative number: bottom to top | +**vertical** | **bool** | If disabled: fast direction = X, slow direction = Y If enabled: fast direction = Y, slow direction = X | [optional] [default to False] +**snake** | **bool** | Flip fast direction for every second row | [optional] [default to False] + +## Example + +```python +from jfjoch_client.models.grid_scan import GridScan + +# TODO update the JSON string below +json = "{}" +# create an instance of GridScan from a JSON string +grid_scan_instance = GridScan.from_json(json) +# print the JSON string representation of the object +print(GridScan.to_json()) + +# convert the object into a dict +grid_scan_dict = grid_scan_instance.to_dict() +# create an instance of GridScan from a dict +grid_scan_from_dict = GridScan.from_dict(grid_scan_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/_sources/python_client/docs/GridScanResult.md.txt b/_sources/python_client/docs/GridScanResult.md.txt new file mode 100644 index 00000000..afc0caae --- /dev/null +++ b/_sources/python_client/docs/GridScanResult.md.txt @@ -0,0 +1,35 @@ +# GridScanResult + +Results of a grid scan + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**det_img** | **List[int]** | Detector image number for a given cell | +**bkg_estimate** | **List[float]** | | +**spot_count** | **List[int]** | | +**indexed_lattices** | **List[int]** | | +**mosaicity** | **List[float]** | | +**b_factor** | **List[float]** | | + +## Example + +```python +from jfjoch_client.models.grid_scan_result import GridScanResult + +# TODO update the JSON string below +json = "{}" +# create an instance of GridScanResult from a JSON string +grid_scan_result_instance = GridScanResult.from_json(json) +# print the JSON string representation of the object +print(GridScanResult.to_json()) + +# convert the object into a dict +grid_scan_result_dict = grid_scan_result_instance.to_dict() +# create an instance of GridScanResult from a dict +grid_scan_result_from_dict = GridScanResult.from_dict(grid_scan_result_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/_sources/python_client/docs/GridScanResultImagesInner.md.txt b/_sources/python_client/docs/GridScanResultImagesInner.md.txt new file mode 100644 index 00000000..08c5fcfc --- /dev/null +++ b/_sources/python_client/docs/GridScanResultImagesInner.md.txt @@ -0,0 +1,36 @@ +# GridScanResultImagesInner + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**efficiency** | **float** | | +**number** | **int** | Detector image number for a given cell | +**bkg** | **float** | Background estimate | [optional] +**spots** | **int** | Spot count | [optional] +**index** | **int** | Indexing solution | [optional] +**mos** | **float** | Mosaicity estimate | [optional] +**b** | **float** | B-Factor estimate | [optional] +**uc** | [**UnitCell**](UnitCell.md) | | [optional] + +## Example + +```python +from jfjoch_client.models.grid_scan_result_images_inner import GridScanResultImagesInner + +# TODO update the JSON string below +json = "{}" +# create an instance of GridScanResultImagesInner from a JSON string +grid_scan_result_images_inner_instance = GridScanResultImagesInner.from_json(json) +# print the JSON string representation of the object +print(GridScanResultImagesInner.to_json()) + +# convert the object into a dict +grid_scan_result_images_inner_dict = grid_scan_result_images_inner_instance.to_dict() +# create an instance of GridScanResultImagesInner from a dict +grid_scan_result_images_inner_from_dict = GridScanResultImagesInner.from_dict(grid_scan_result_images_inner_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/_sources/python_client/docs/ImageBufferStatus.md.txt b/_sources/python_client/docs/ImageBufferStatus.md.txt new file mode 100644 index 00000000..c2111ace --- /dev/null +++ b/_sources/python_client/docs/ImageBufferStatus.md.txt @@ -0,0 +1,36 @@ +# ImageBufferStatus + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**min_image_number** | **int** | Smallest image number available in the buffer | +**max_image_number** | **int** | Largest image number available in the buffer | +**image_numbers** | **List[int]** | Image numbers currently present in the buffer. | +**total_slots** | **int** | Number of slots in the image buffer. This number, compared to number of images in data collection and frame rate will determine \"retention\" rate of the image buffer. | +**available_slots** | **int** | Slots available for the data collection | +**in_preparation_slots** | **int** | Number of slots in the image buffer that are currently in preparation for sending. | +**in_sending_slots** | **int** | Number of slots in the image buffer that are currently sending/writing data. | +**current_counter** | **int** | Counter of changes in the image buffer - either new start message or new image added. For optimization one can only load new images/datasets from the HTTP if this value changes. Counter is optional as it was not implemented in older versions to avoid breaking change | [optional] + +## Example + +```python +from jfjoch_client.models.image_buffer_status import ImageBufferStatus + +# TODO update the JSON string below +json = "{}" +# create an instance of ImageBufferStatus from a JSON string +image_buffer_status_instance = ImageBufferStatus.from_json(json) +# print the JSON string representation of the object +print(ImageBufferStatus.to_json()) + +# convert the object into a dict +image_buffer_status_dict = image_buffer_status_instance.to_dict() +# create an instance of ImageBufferStatus from a dict +image_buffer_status_from_dict = ImageBufferStatus.from_dict(image_buffer_status_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/_sources/python_client/docs/ImageFormatSettings.md.txt b/_sources/python_client/docs/ImageFormatSettings.md.txt new file mode 100644 index 00000000..5fc22d63 --- /dev/null +++ b/_sources/python_client/docs/ImageFormatSettings.md.txt @@ -0,0 +1,39 @@ +# ImageFormatSettings + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**summation** | **bool** | Enable summation of images to a given image_time If disabled images are saved according to original detector speed, but image count is adjusted | +**geometry_transform** | **bool** | Place module read-out into their location on composed detector and extend multipixels | +**jungfrau_conversion** | **bool** | Convert pixel value in ADU to photon counts/energy Only affects JUNGFRAU detector | +**jungfrau_conversion_factor_ke_v** | **float** | Used to convert energy deposited into pixel to counts If not provided incident_energy_keV is used | [optional] +**bit_depth_image** | **int** | Bit depth of resulting image (it doesn't affect the detector read-out value) If not provided value is adjusted automatically | [optional] +**signed_output** | **bool** | Controls if pixels have signed output If not provided value is adjusted automatically | [optional] +**mask_module_edges** | **bool** | Mask 1 pixel on the module boundary | [default to True] +**mask_chip_edges** | **bool** | Mask multipixels on chip boundary | [default to True] +**jungfrau_mask_pixels_without_g0** | **bool** | JUNGFRAU: mask pixels that don't operate in G0, but do operate in G1 and G1. This should be turned off for cases, where detector is operated at room temperature with long exposure time. | [optional] [default to True] +**apply_mask** | **bool** | Masked pixels are set to special value in the images produced by Jungfraujoch | [default to False] +**jungfrau_pedestal_g0_rms_limit** | **int** | Pixels with pedestal G0 RMS above the threshold are marked as masked pixels | [optional] [default to 100] + +## Example + +```python +from jfjoch_client.models.image_format_settings import ImageFormatSettings + +# TODO update the JSON string below +json = "{}" +# create an instance of ImageFormatSettings from a JSON string +image_format_settings_instance = ImageFormatSettings.from_json(json) +# print the JSON string representation of the object +print(ImageFormatSettings.to_json()) + +# convert the object into a dict +image_format_settings_dict = image_format_settings_instance.to_dict() +# create an instance of ImageFormatSettings from a dict +image_format_settings_from_dict = ImageFormatSettings.from_dict(image_format_settings_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/_sources/python_client/docs/ImagePusherStatus.md.txt b/_sources/python_client/docs/ImagePusherStatus.md.txt new file mode 100644 index 00000000..d9e8e355 --- /dev/null +++ b/_sources/python_client/docs/ImagePusherStatus.md.txt @@ -0,0 +1,35 @@ +# ImagePusherStatus + +Informs about status of the image pusher. + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**pusher_type** | [**ImagePusherType**](ImagePusherType.md) | | [default to ImagePusherType.NONE] +**addr** | **List[str]** | List of addresses of image pushers. For HDF5 socket - no addresses will be returned. For ZeroMQ - list of addresses for each socket will be provided. For TCP/IP - single address to connect all writers will be provided. | +**connected_writers** | **int** | Number of connected writers For ZeroMQ image socket: number is constant For TCP/IP image socket: number is updated live during operation | +**images_written** | **int** | Number of images written to the image socket. This number is updated live during operation for TCP/IP image socket and direct HDF5 writer. It is updated at the end of experiment for ZeroMQ image socket. | [optional] +**images_write_error** | **int** | Number of images that could not be written to the image socket. This number is updated live during operation for TCP/IP image socket. No other socket use it. | [optional] +**writer_fifo_utilization** | **List[int]** | Utilization of internal writer FIFO. This number is updated live during operation for TCP/IP image socket. No other socket use it. | [optional] + +## Example + +```python +from jfjoch_client.models.image_pusher_status import ImagePusherStatus + +# TODO update the JSON string below +json = "{}" +# create an instance of ImagePusherStatus from a JSON string +image_pusher_status_instance = ImagePusherStatus.from_json(json) +# print the JSON string representation of the object +print(ImagePusherStatus.to_json()) + +# convert the object into a dict +image_pusher_status_dict = image_pusher_status_instance.to_dict() +# create an instance of ImagePusherStatus from a dict +image_pusher_status_from_dict = ImagePusherStatus.from_dict(image_pusher_status_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/_sources/python_client/docs/ImagePusherType.md.txt b/_sources/python_client/docs/ImagePusherType.md.txt new file mode 100644 index 00000000..5ae75c87 --- /dev/null +++ b/_sources/python_client/docs/ImagePusherType.md.txt @@ -0,0 +1,18 @@ +# ImagePusherType + + +## Enum + +* `ZEROMQ` (value: `'ZeroMQ'`) + +* `HDF5` (value: `'HDF5'`) + +* `CBOR` (value: `'CBOR'`) + +* `TCP` (value: `'TCP'`) + +* `NONE` (value: `'None'`) + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/_sources/python_client/docs/IndexingAlgorithm.md.txt b/_sources/python_client/docs/IndexingAlgorithm.md.txt new file mode 100644 index 00000000..67381323 --- /dev/null +++ b/_sources/python_client/docs/IndexingAlgorithm.md.txt @@ -0,0 +1,19 @@ +# IndexingAlgorithm + +Selection of an indexing algorithm used by Jungfraujoch + +## Enum + +* `FFBIDX` (value: `'FFBIDX'`) + +* `FFT` (value: `'FFT'`) + +* `FFTW` (value: `'FFTW'`) + +* `AUTO` (value: `'Auto'`) + +* `NONE` (value: `'None'`) + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/_sources/python_client/docs/IndexingSettings.md.txt b/_sources/python_client/docs/IndexingSettings.md.txt new file mode 100644 index 00000000..6f9a6d58 --- /dev/null +++ b/_sources/python_client/docs/IndexingSettings.md.txt @@ -0,0 +1,44 @@ +# IndexingSettings + +Settings for crystallography indexing + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**algorithm** | [**IndexingAlgorithm**](IndexingAlgorithm.md) | | [default to IndexingAlgorithm.FFBIDX] +**fft_max_unit_cell_a** | **float** | Largest unit cell to be indexed by FFT algorithm; parameter value affects execution time of FFT | [default to 250] +**fft_min_unit_cell_a** | **float** | Smallest unit cell to be indexed by FFT algorithm; parameter value affects execution time of FFT | [default to 10.0] +**fft_high_resolution_a** | **float** | Highest resolution of spots used for FFT algorithm; parameter value affects execution time of FFT. There is also correlation between smallest unit cell and max resolution, which need to be checked for very small systems. | [default to 2.0] +**fft_num_vectors** | **int** | Number of search directions for the FFT algorithm; parameter value affects execution time of FFT. | [default to 16384] +**tolerance** | **float** | Acceptance tolerance for spots after the indexing run - the larger the number, the more spots will be accepted | +**thread_count** | **int** | Thread count for indexing algorithm | +**geom_refinement_algorithm** | [**GeomRefinementAlgorithm**](GeomRefinementAlgorithm.md) | | +**unit_cell_dist_tolerance** | **float** | Relative distance tolerance for unit cell vs. reference; Lattices outside given tolerance will be ignored | [default to 0.05] +**viable_cell_min_spots** | **int** | Minimum number of indexed spots required for a cell to be considered viable | [default to 10] +**index_ice_rings** | **bool** | Include spots marked as ice rings in the indexing run. If `dataset_settings` doesn't have `detect_ice_rings` on, this option will have no effect on processing. | [default to False] +**rotation_indexing** | **bool** | | [default to False] +**rotation_indexing_min_angular_range_deg** | **float** | | [default to 20.0] +**rotation_indexing_angular_stride_deg** | **float** | | [default to 0.5] +**blocking** | **bool** | Indexing in Jungfraujoch goes with a dedicated thread pool. If set to false, the thread pool is non-blocking, i.e. if there are no threads available, image indexing will be skipped. This option is recommended for real-time processing at high frame rates. If set to true, the thread pool will block until a thread is available. | [default to True] + +## Example + +```python +from jfjoch_client.models.indexing_settings import IndexingSettings + +# TODO update the JSON string below +json = "{}" +# create an instance of IndexingSettings from a JSON string +indexing_settings_instance = IndexingSettings.from_json(json) +# print the JSON string representation of the object +print(IndexingSettings.to_json()) + +# convert the object into a dict +indexing_settings_dict = indexing_settings_instance.to_dict() +# create an instance of IndexingSettings from a dict +indexing_settings_from_dict = IndexingSettings.from_dict(indexing_settings_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/_sources/python_client/docs/InstrumentMetadata.md.txt b/_sources/python_client/docs/InstrumentMetadata.md.txt new file mode 100644 index 00000000..7908c65c --- /dev/null +++ b/_sources/python_client/docs/InstrumentMetadata.md.txt @@ -0,0 +1,34 @@ +# InstrumentMetadata + +Metadata for a measurement instrument + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**source_name** | **str** | | +**source_type** | **str** | Type of radiation source. NXmx gives a fixed dictionary, though Jungfraujoch is not enforcing compliance. https://manual.nexusformat.org/classes/base_classes/NXsource.html#nxsource NXsource allows the following: Spallation Neutron Source Pulsed Reactor Neutron Source Reactor Neutron Source Synchrotron X-ray Source Pulsed Muon Source Rotating Anode X-ray Fixed Tube X-ray UV Laser Free-Electron Laser Optical Laser Ion Source UV Plasma Source Metal Jet X-ray | [optional] [default to ''] +**instrument_name** | **str** | | +**pulsed_source** | **bool** | Settings specific to XFEL (e.g., every image has to come from TTL trigger, save pulse ID and event code) | [optional] [default to False] +**electron_source** | **bool** | Settings specific to electron source (e.g., wavelength definition) | [optional] [default to False] + +## Example + +```python +from jfjoch_client.models.instrument_metadata import InstrumentMetadata + +# TODO update the JSON string below +json = "{}" +# create an instance of InstrumentMetadata from a JSON string +instrument_metadata_instance = InstrumentMetadata.from_json(json) +# print the JSON string representation of the object +print(InstrumentMetadata.to_json()) + +# convert the object into a dict +instrument_metadata_dict = instrument_metadata_instance.to_dict() +# create an instance of InstrumentMetadata from a dict +instrument_metadata_from_dict = InstrumentMetadata.from_dict(instrument_metadata_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/_sources/python_client/docs/JfjochBrokerApi.md.txt b/_sources/python_client/docs/JfjochBrokerApi.md.txt new file mode 100644 index 00000000..28cd069a --- /dev/null +++ b/_sources/python_client/docs/JfjochBrokerApi.md.txt @@ -0,0 +1,77 @@ +# jfjoch_client.JfjochBrokerApi + +All URIs are relative to *http://localhost:5232* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**config_zeromq_metadata_put**](JfjochBrokerApi.md#config_zeromq_metadata_put) | **PUT** /config/zeromq_metadata | Set ZeroMQ metadata settings + + +# **config_zeromq_metadata_put** +> config_zeromq_metadata_put(zeromq_metadata_settings=zeromq_metadata_settings) + +Set ZeroMQ metadata settings + +Jungfraujoch can generate metadata message stream on ZeroMQ PUB socket. This stream covers all images. Here settings of the socket can be adjusted. While the data structure contains also socket_address, this cannot be changed via HTTP and is ignore in PUT request. + +### Example + + +```python +import jfjoch_client +from jfjoch_client.models.zeromq_metadata_settings import ZeromqMetadataSettings +from jfjoch_client.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost:5232 +# See configuration.py for a list of all supported configuration parameters. +configuration = jfjoch_client.Configuration( + host = "http://localhost:5232" +) + + +# Enter a context with an instance of the API client +with jfjoch_client.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = jfjoch_client.JfjochBrokerApi(api_client) + zeromq_metadata_settings = jfjoch_client.ZeromqMetadataSettings() # ZeromqMetadataSettings | (optional) + + try: + # Set ZeroMQ metadata settings + api_instance.config_zeromq_metadata_put(zeromq_metadata_settings=zeromq_metadata_settings) + except Exception as e: + print("Exception when calling JfjochBrokerApi->config_zeromq_metadata_put: %s\n" % e) +``` + + + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **zeromq_metadata_settings** | [**ZeromqMetadataSettings**](ZeromqMetadataSettings.md)| | [optional] + +### Return type + +void (empty response body) + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: application/json + - **Accept**: text/plain, application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Everything OK | - | +**400** | Input parsing or validation error | - | +**500** | Error within Jungfraujoch code - see output message. | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + diff --git a/_sources/python_client/docs/JfjochSettings.md.txt b/_sources/python_client/docs/JfjochSettings.md.txt new file mode 100644 index 00000000..360eb37b --- /dev/null +++ b/_sources/python_client/docs/JfjochSettings.md.txt @@ -0,0 +1,49 @@ +# JfjochSettings + +Default settings for Jungfraujoch software. This structure is used to provide default settings using configuration JSON file and is not used in HTTP. + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**pcie** | [**List[PcieDevicesInner]**](PcieDevicesInner.md) | | [optional] +**zeromq** | [**ZeromqSettings**](ZeromqSettings.md) | | [optional] +**tcp** | [**TcpSettings**](TcpSettings.md) | | [optional] +**instrument** | [**InstrumentMetadata**](InstrumentMetadata.md) | | [optional] +**file_writer** | [**FileWriterSettings**](FileWriterSettings.md) | | [optional] +**detector** | [**List[Detector]**](Detector.md) | | +**indexing** | [**IndexingSettings**](IndexingSettings.md) | | [optional] +**detector_settings** | [**DetectorSettings**](DetectorSettings.md) | | [optional] +**azim_int** | [**AzimIntSettings**](AzimIntSettings.md) | | [optional] +**image_format** | [**ImageFormatSettings**](ImageFormatSettings.md) | | [optional] +**image_buffer_mi_b** | **int** | Size of internal buffer in MiB for images before they are sent to a stream | [optional] [default to 2048] +**verbose** | **bool** | Print extra debug information | [optional] [default to False] +**receiver_threads** | **int** | Number of threads used by the receiver | [optional] [default to 64] +**numa_policy** | **str** | NUMA policy to bind CPUs | [optional] +**frontend_directory** | **str** | Location of built JavaScript web frontend | +**spot_finding** | [**SpotFindingSettings**](SpotFindingSettings.md) | | [optional] +**image_pusher** | [**ImagePusherType**](ImagePusherType.md) | | [default to ImagePusherType.NONE] +**zeromq_preview** | [**ZeromqPreviewSettings**](ZeromqPreviewSettings.md) | | [optional] +**zeromq_metadata** | [**ZeromqMetadataSettings**](ZeromqMetadataSettings.md) | | [optional] +**dark_mask** | [**DarkMaskSettings**](DarkMaskSettings.md) | | [optional] + +## Example + +```python +from jfjoch_client.models.jfjoch_settings import JfjochSettings + +# TODO update the JSON string below +json = "{}" +# create an instance of JfjochSettings from a JSON string +jfjoch_settings_instance = JfjochSettings.from_json(json) +# print the JSON string representation of the object +print(JfjochSettings.to_json()) + +# convert the object into a dict +jfjoch_settings_dict = jfjoch_settings_instance.to_dict() +# create an instance of JfjochSettings from a dict +jfjoch_settings_from_dict = JfjochSettings.from_dict(jfjoch_settings_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/_sources/python_client/docs/JfjochSettingsSsl.md.txt b/_sources/python_client/docs/JfjochSettingsSsl.md.txt new file mode 100644 index 00000000..058fb06a --- /dev/null +++ b/_sources/python_client/docs/JfjochSettingsSsl.md.txt @@ -0,0 +1,30 @@ +# JfjochSettingsSsl + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**certificate** | **str** | | +**key** | **str** | | + +## Example + +```python +from jfjoch_client.models.jfjoch_settings_ssl import JfjochSettingsSsl + +# TODO update the JSON string below +json = "{}" +# create an instance of JfjochSettingsSsl from a JSON string +jfjoch_settings_ssl_instance = JfjochSettingsSsl.from_json(json) +# print the JSON string representation of the object +print(JfjochSettingsSsl.to_json()) + +# convert the object into a dict +jfjoch_settings_ssl_dict = jfjoch_settings_ssl_instance.to_dict() +# create an instance of JfjochSettingsSsl from a dict +jfjoch_settings_ssl_from_dict = JfjochSettingsSsl.from_dict(jfjoch_settings_ssl_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/_sources/python_client/docs/JfjochStatistics.md.txt b/_sources/python_client/docs/JfjochStatistics.md.txt new file mode 100644 index 00000000..52c6a5c5 --- /dev/null +++ b/_sources/python_client/docs/JfjochStatistics.md.txt @@ -0,0 +1,49 @@ +# JfjochStatistics + +Pool statistics for Jungfraujoch to reduce transfers between frontend and jfjoch_broker + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**detector** | [**DetectorStatus**](DetectorStatus.md) | | [optional] +**detector_list** | [**DetectorList**](DetectorList.md) | | [optional] +**detector_settings** | [**DetectorSettings**](DetectorSettings.md) | | [optional] +**image_format_settings** | [**ImageFormatSettings**](ImageFormatSettings.md) | | [optional] +**instrument_metadata** | [**InstrumentMetadata**](InstrumentMetadata.md) | | [optional] +**file_writer_settings** | [**FileWriterSettings**](FileWriterSettings.md) | | [optional] +**data_processing_settings** | [**SpotFindingSettings**](SpotFindingSettings.md) | | [optional] +**measurement** | [**MeasurementStatistics**](MeasurementStatistics.md) | | [optional] +**broker** | [**BrokerStatus**](BrokerStatus.md) | | [optional] +**fpga** | [**List[FpgaStatusInner]**](FpgaStatusInner.md) | | [optional] +**calibration** | [**List[CalibrationStatisticsInner]**](CalibrationStatisticsInner.md) | | [optional] +**zeromq_preview** | [**ZeromqPreviewSettings**](ZeromqPreviewSettings.md) | | [optional] +**zeromq_metadata** | [**ZeromqMetadataSettings**](ZeromqMetadataSettings.md) | | [optional] +**dark_mask** | [**DarkMaskSettings**](DarkMaskSettings.md) | | [optional] +**pixel_mask** | [**PixelMaskStatistics**](PixelMaskStatistics.md) | | [optional] +**roi** | [**RoiDefinitions**](RoiDefinitions.md) | | [optional] +**az_int** | [**AzimIntSettings**](AzimIntSettings.md) | | [optional] +**buffer** | [**ImageBufferStatus**](ImageBufferStatus.md) | | [optional] +**indexing** | [**IndexingSettings**](IndexingSettings.md) | | [optional] +**image_pusher** | [**ImagePusherStatus**](ImagePusherStatus.md) | | [optional] + +## Example + +```python +from jfjoch_client.models.jfjoch_statistics import JfjochStatistics + +# TODO update the JSON string below +json = "{}" +# create an instance of JfjochStatistics from a JSON string +jfjoch_statistics_instance = JfjochStatistics.from_json(json) +# print the JSON string representation of the object +print(JfjochStatistics.to_json()) + +# convert the object into a dict +jfjoch_statistics_dict = jfjoch_statistics_instance.to_dict() +# create an instance of JfjochStatistics from a dict +jfjoch_statistics_from_dict = JfjochStatistics.from_dict(jfjoch_statistics_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/_sources/python_client/docs/MeasurementStatistics.md.txt b/_sources/python_client/docs/MeasurementStatistics.md.txt new file mode 100644 index 00000000..18dd5ec5 --- /dev/null +++ b/_sources/python_client/docs/MeasurementStatistics.md.txt @@ -0,0 +1,51 @@ +# MeasurementStatistics + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**file_prefix** | **str** | | [optional] +**run_number** | **int** | Number of data collection run. This can be either automatically incremented or provided externally for each data collection. | [optional] +**experiment_group** | **str** | Name of group owning the data (e.g. p-group or proposal number). | [optional] +**images_expected** | **int** | | [optional] +**images_collected** | **int** | Images collected by the receiver. This number will be lower than images expected if there were issues with data collection performance. | [optional] +**images_sent** | **int** | Images sent to the writer. The value does not include images discarded by lossy compression filter and images not forwarded due to full ZeroMQ queue. | [optional] +**images_written** | **int** | Images successfully written to disk. The value is live updated for TCP/IP socket and direct HDF5 writer, while for ZeroMQ it is only updated at the end of experiment. | [optional] +**images_discarded_lossy_compression** | **int** | Images discarded by the lossy compression filter | [optional] +**max_image_number_sent** | **int** | | [optional] +**collection_efficiency** | **float** | | [optional] +**compression_ratio** | **float** | | [optional] +**cancelled** | **bool** | | [optional] +**max_receiver_delay** | **int** | | [optional] +**indexing_rate** | **float** | | [optional] +**detector_width** | **int** | | [optional] +**detector_height** | **int** | | [optional] +**detector_pixel_depth** | **int** | | [optional] +**bkg_estimate** | **float** | | [optional] +**unit_cell** | **str** | | [optional] +**error_pixels** | **float** | Moving average of 1000 images counting number of error pixels on the detector | [optional] +**saturated_pixels** | **float** | Moving average of 1000 images counting number of saturated pixels on the detector | [optional] +**roi_beam_pixels** | **float** | If there is an ROI defined with name \"beam\", this number will hold moving average of 1000 images for number of valid pixels within this ROI | [optional] +**roi_beam_sum** | **float** | If there is an ROI defined with name \"beam\", this number will hold moving average of 1000 images for sum of valid pixels within this ROI | [optional] + +## Example + +```python +from jfjoch_client.models.measurement_statistics import MeasurementStatistics + +# TODO update the JSON string below +json = "{}" +# create an instance of MeasurementStatistics from a JSON string +measurement_statistics_instance = MeasurementStatistics.from_json(json) +# print the JSON string representation of the object +print(MeasurementStatistics.to_json()) + +# convert the object into a dict +measurement_statistics_dict = measurement_statistics_instance.to_dict() +# create an instance of MeasurementStatistics from a dict +measurement_statistics_from_dict = MeasurementStatistics.from_dict(measurement_statistics_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/_sources/python_client/docs/PcieDevicesInner.md.txt b/_sources/python_client/docs/PcieDevicesInner.md.txt new file mode 100644 index 00000000..26bf9cc1 --- /dev/null +++ b/_sources/python_client/docs/PcieDevicesInner.md.txt @@ -0,0 +1,30 @@ +# PcieDevicesInner + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**blk** | **str** | Block device name | [optional] +**ipv4** | **str** | IPv4 address of the block device | [optional] + +## Example + +```python +from jfjoch_client.models.pcie_devices_inner import PcieDevicesInner + +# TODO update the JSON string below +json = "{}" +# create an instance of PcieDevicesInner from a JSON string +pcie_devices_inner_instance = PcieDevicesInner.from_json(json) +# print the JSON string representation of the object +print(PcieDevicesInner.to_json()) + +# convert the object into a dict +pcie_devices_inner_dict = pcie_devices_inner_instance.to_dict() +# create an instance of PcieDevicesInner from a dict +pcie_devices_inner_from_dict = PcieDevicesInner.from_dict(pcie_devices_inner_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/_sources/python_client/docs/PixelMaskStatistics.md.txt b/_sources/python_client/docs/PixelMaskStatistics.md.txt new file mode 100644 index 00000000..5b707d19 --- /dev/null +++ b/_sources/python_client/docs/PixelMaskStatistics.md.txt @@ -0,0 +1,31 @@ +# PixelMaskStatistics + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**user_mask** | **int** | Number of pixels masked using the user mask | [optional] +**too_high_pedestal_rms** | **int** | Number of pixels with G0 pedestal RMS higher than provided threshold | [optional] +**wrong_gain** | **int** | Number of pixels that show wrong gain level during the pedestal procedure | [optional] + +## Example + +```python +from jfjoch_client.models.pixel_mask_statistics import PixelMaskStatistics + +# TODO update the JSON string below +json = "{}" +# create an instance of PixelMaskStatistics from a JSON string +pixel_mask_statistics_instance = PixelMaskStatistics.from_json(json) +# print the JSON string representation of the object +print(PixelMaskStatistics.to_json()) + +# convert the object into a dict +pixel_mask_statistics_dict = pixel_mask_statistics_instance.to_dict() +# create an instance of PixelMaskStatistics from a dict +pixel_mask_statistics_from_dict = PixelMaskStatistics.from_dict(pixel_mask_statistics_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/_sources/python_client/docs/Plot.md.txt b/_sources/python_client/docs/Plot.md.txt new file mode 100644 index 00000000..24ddb47c --- /dev/null +++ b/_sources/python_client/docs/Plot.md.txt @@ -0,0 +1,33 @@ +# Plot + +x and y coordinates for plotting, it is OK to assume that both arrays have the same size; layout is optimized for Plotly + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**title** | **str** | | [default to ''] +**x** | **List[float]** | | +**y** | **List[Optional[float]]** | | +**z** | **List[Optional[float]]** | | [optional] + +## Example + +```python +from jfjoch_client.models.plot import Plot + +# TODO update the JSON string below +json = "{}" +# create an instance of Plot from a JSON string +plot_instance = Plot.from_json(json) +# print the JSON string representation of the object +print(Plot.to_json()) + +# convert the object into a dict +plot_dict = plot_instance.to_dict() +# create an instance of Plot from a dict +plot_from_dict = Plot.from_dict(plot_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/_sources/python_client/docs/PlotTypeEnum.md.txt b/_sources/python_client/docs/PlotTypeEnum.md.txt new file mode 100644 index 00000000..272e8743 --- /dev/null +++ b/_sources/python_client/docs/PlotTypeEnum.md.txt @@ -0,0 +1,48 @@ +# PlotTypeEnum + + +## Enum + +* `BKG_ESTIMATE` (value: `'bkg_estimate'`) + +* `AZINT` (value: `'azint'`) + +* `SPOT_COUNT` (value: `'spot_count'`) + +* `INDEXING_RATE` (value: `'indexing_rate'`) + +* `INDEXING_UNIT_CELL_LENGTH` (value: `'indexing_unit_cell_length'`) + +* `INDEXING_UNIT_CELL_ANGLE` (value: `'indexing_unit_cell_angle'`) + +* `ERROR_PIXELS` (value: `'error_pixels'`) + +* `IMAGE_COLLECTION_EFFICIENCY` (value: `'image_collection_efficiency'`) + +* `RECEIVER_DELAY` (value: `'receiver_delay'`) + +* `RECEIVER_FREE_SEND_BUF` (value: `'receiver_free_send_buf'`) + +* `STRONG_PIXELS` (value: `'strong_pixels'`) + +* `ROI_SUM` (value: `'roi_sum'`) + +* `ROI_MEAN` (value: `'roi_mean'`) + +* `ROI_MAX_COUNT` (value: `'roi_max_count'`) + +* `ROI_PIXELS` (value: `'roi_pixels'`) + +* `ROI_WEIGHTED_X` (value: `'roi_weighted_x'`) + +* `ROI_WEIGHTED_Y` (value: `'roi_weighted_y'`) + +* `PACKETS_RECEIVED` (value: `'packets_received'`) + +* `MAX_PIXEL_VALUE` (value: `'max_pixel_value'`) + +* `RESOLUTION_ESTIMATE` (value: `'resolution_estimate'`) + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/_sources/python_client/docs/PlotUnitX.md.txt b/_sources/python_client/docs/PlotUnitX.md.txt new file mode 100644 index 00000000..2b0f2e93 --- /dev/null +++ b/_sources/python_client/docs/PlotUnitX.md.txt @@ -0,0 +1,20 @@ +# PlotUnitX + + +## Enum + +* `IMAGE_NUMBER` (value: `'image_number'`) + +* `Q_RECIP_A` (value: `'q_recipA'`) + +* `D_A` (value: `'d_A'`) + +* `ANGLE_DEG` (value: `'angle_deg'`) + +* `ADU` (value: `'ADU'`) + +* `GRID_UM` (value: `'grid_um'`) + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/_sources/python_client/docs/Plots.md.txt b/_sources/python_client/docs/Plots.md.txt new file mode 100644 index 00000000..2efd9e2a --- /dev/null +++ b/_sources/python_client/docs/Plots.md.txt @@ -0,0 +1,33 @@ +# Plots + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**title** | **str** | | [optional] +**unit_x** | [**PlotUnitX**](PlotUnitX.md) | | [default to PlotUnitX.IMAGE_NUMBER] +**size_x** | **float** | Max X range of the plot | [optional] +**size_y** | **float** | Max Y range of the plot | [optional] +**plot** | [**List[Plot]**](Plot.md) | | + +## Example + +```python +from jfjoch_client.models.plots import Plots + +# TODO update the JSON string below +json = "{}" +# create an instance of Plots from a JSON string +plots_instance = Plots.from_json(json) +# print the JSON string representation of the object +print(Plots.to_json()) + +# convert the object into a dict +plots_dict = plots_instance.to_dict() +# create an instance of Plots from a dict +plots_from_dict = Plots.from_dict(plots_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/_sources/python_client/docs/PreviewSettings.md.txt b/_sources/python_client/docs/PreviewSettings.md.txt new file mode 100644 index 00000000..0ffb0f04 --- /dev/null +++ b/_sources/python_client/docs/PreviewSettings.md.txt @@ -0,0 +1,36 @@ +# PreviewSettings + +Settings for JPEG rendering of preview images + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**saturation** | **int** | Saturation value to set contrast in the preview image | +**show_spots** | **bool** | Show spot finding results on the image | [optional] [default to True] +**show_roi** | **bool** | Show ROI areas on the image | [optional] [default to False] +**jpeg_quality** | **int** | Quality of JPEG image (100 - highest; 0 - lowest) | [optional] [default to 100] +**show_indexed** | **bool** | Preview indexed images only | [optional] [default to False] +**show_user_mask** | **bool** | Show user mask | [optional] [default to False] +**resolution_ring** | **float** | | [optional] [default to 0.1] + +## Example + +```python +from jfjoch_client.models.preview_settings import PreviewSettings + +# TODO update the JSON string below +json = "{}" +# create an instance of PreviewSettings from a JSON string +preview_settings_instance = PreviewSettings.from_json(json) +# print the JSON string representation of the object +print(PreviewSettings.to_json()) + +# convert the object into a dict +preview_settings_dict = preview_settings_instance.to_dict() +# create an instance of PreviewSettings from a dict +preview_settings_from_dict = PreviewSettings.from_dict(preview_settings_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/_sources/python_client/docs/RoiAzimList.md.txt b/_sources/python_client/docs/RoiAzimList.md.txt new file mode 100644 index 00000000..fe7b3fe9 --- /dev/null +++ b/_sources/python_client/docs/RoiAzimList.md.txt @@ -0,0 +1,30 @@ +# RoiAzimList + +List of azimuthal ROIs + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**rois** | [**List[RoiAzimuthal]**](RoiAzimuthal.md) | | [optional] + +## Example + +```python +from jfjoch_client.models.roi_azim_list import RoiAzimList + +# TODO update the JSON string below +json = "{}" +# create an instance of RoiAzimList from a JSON string +roi_azim_list_instance = RoiAzimList.from_json(json) +# print the JSON string representation of the object +print(RoiAzimList.to_json()) + +# convert the object into a dict +roi_azim_list_dict = roi_azim_list_instance.to_dict() +# create an instance of RoiAzimList from a dict +roi_azim_list_from_dict = RoiAzimList.from_dict(roi_azim_list_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/_sources/python_client/docs/RoiAzimuthal.md.txt b/_sources/python_client/docs/RoiAzimuthal.md.txt new file mode 100644 index 00000000..b736ad68 --- /dev/null +++ b/_sources/python_client/docs/RoiAzimuthal.md.txt @@ -0,0 +1,32 @@ +# RoiAzimuthal + +ROI as Q-range (or resolution range) + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**name** | **str** | Name for the ROI; used in the plots | +**q_min_recip_a** | **float** | Minimum Q-range for the ROI | +**q_max_recip_a** | **float** | Maximum Q-range for the ROI | + +## Example + +```python +from jfjoch_client.models.roi_azimuthal import RoiAzimuthal + +# TODO update the JSON string below +json = "{}" +# create an instance of RoiAzimuthal from a JSON string +roi_azimuthal_instance = RoiAzimuthal.from_json(json) +# print the JSON string representation of the object +print(RoiAzimuthal.to_json()) + +# convert the object into a dict +roi_azimuthal_dict = roi_azimuthal_instance.to_dict() +# create an instance of RoiAzimuthal from a dict +roi_azimuthal_from_dict = RoiAzimuthal.from_dict(roi_azimuthal_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/_sources/python_client/docs/RoiBox.md.txt b/_sources/python_client/docs/RoiBox.md.txt new file mode 100644 index 00000000..f485d133 --- /dev/null +++ b/_sources/python_client/docs/RoiBox.md.txt @@ -0,0 +1,34 @@ +# RoiBox + +Box ROI + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**name** | **str** | Name for the ROI; used in the plots | +**min_x_pxl** | **int** | Lower bound (inclusive) in X coordinate for the box | +**max_x_pxl** | **int** | Upper bound (inclusive) in X coordinate for the box | +**min_y_pxl** | **int** | Lower bound (inclusive) in Y coordinate for the box | +**max_y_pxl** | **int** | Upper bound (inclusive) in Y coordinate for the box | + +## Example + +```python +from jfjoch_client.models.roi_box import RoiBox + +# TODO update the JSON string below +json = "{}" +# create an instance of RoiBox from a JSON string +roi_box_instance = RoiBox.from_json(json) +# print the JSON string representation of the object +print(RoiBox.to_json()) + +# convert the object into a dict +roi_box_dict = roi_box_instance.to_dict() +# create an instance of RoiBox from a dict +roi_box_from_dict = RoiBox.from_dict(roi_box_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/_sources/python_client/docs/RoiBoxList.md.txt b/_sources/python_client/docs/RoiBoxList.md.txt new file mode 100644 index 00000000..7cd200d0 --- /dev/null +++ b/_sources/python_client/docs/RoiBoxList.md.txt @@ -0,0 +1,30 @@ +# RoiBoxList + +List of box ROIs + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**rois** | [**List[RoiBox]**](RoiBox.md) | | [optional] + +## Example + +```python +from jfjoch_client.models.roi_box_list import RoiBoxList + +# TODO update the JSON string below +json = "{}" +# create an instance of RoiBoxList from a JSON string +roi_box_list_instance = RoiBoxList.from_json(json) +# print the JSON string representation of the object +print(RoiBoxList.to_json()) + +# convert the object into a dict +roi_box_list_dict = roi_box_list_instance.to_dict() +# create an instance of RoiBoxList from a dict +roi_box_list_from_dict = RoiBoxList.from_dict(roi_box_list_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/_sources/python_client/docs/RoiCircle.md.txt b/_sources/python_client/docs/RoiCircle.md.txt new file mode 100644 index 00000000..b2dabb67 --- /dev/null +++ b/_sources/python_client/docs/RoiCircle.md.txt @@ -0,0 +1,33 @@ +# RoiCircle + +Circular ROI + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**name** | **str** | Name for the ROI; used in the plots | +**center_x_pxl** | **float** | X coordinate of center of the circle [pixels] | +**center_y_pxl** | **float** | Y coordinate of center of the circle [pixels] | +**radius_pxl** | **float** | Radius of the circle [pixels] | + +## Example + +```python +from jfjoch_client.models.roi_circle import RoiCircle + +# TODO update the JSON string below +json = "{}" +# create an instance of RoiCircle from a JSON string +roi_circle_instance = RoiCircle.from_json(json) +# print the JSON string representation of the object +print(RoiCircle.to_json()) + +# convert the object into a dict +roi_circle_dict = roi_circle_instance.to_dict() +# create an instance of RoiCircle from a dict +roi_circle_from_dict = RoiCircle.from_dict(roi_circle_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/_sources/python_client/docs/RoiCircleList.md.txt b/_sources/python_client/docs/RoiCircleList.md.txt new file mode 100644 index 00000000..5873af15 --- /dev/null +++ b/_sources/python_client/docs/RoiCircleList.md.txt @@ -0,0 +1,30 @@ +# RoiCircleList + +List of circular ROIs + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**rois** | [**List[RoiCircle]**](RoiCircle.md) | | + +## Example + +```python +from jfjoch_client.models.roi_circle_list import RoiCircleList + +# TODO update the JSON string below +json = "{}" +# create an instance of RoiCircleList from a JSON string +roi_circle_list_instance = RoiCircleList.from_json(json) +# print the JSON string representation of the object +print(RoiCircleList.to_json()) + +# convert the object into a dict +roi_circle_list_dict = roi_circle_list_instance.to_dict() +# create an instance of RoiCircleList from a dict +roi_circle_list_from_dict = RoiCircleList.from_dict(roi_circle_list_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/_sources/python_client/docs/RoiDefinitions.md.txt b/_sources/python_client/docs/RoiDefinitions.md.txt new file mode 100644 index 00000000..f47c4c10 --- /dev/null +++ b/_sources/python_client/docs/RoiDefinitions.md.txt @@ -0,0 +1,32 @@ +# RoiDefinitions + +ROI defintions + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**box** | [**RoiBoxList**](RoiBoxList.md) | | +**circle** | [**RoiCircleList**](RoiCircleList.md) | | +**azim** | [**RoiAzimList**](RoiAzimList.md) | | + +## Example + +```python +from jfjoch_client.models.roi_definitions import RoiDefinitions + +# TODO update the JSON string below +json = "{}" +# create an instance of RoiDefinitions from a JSON string +roi_definitions_instance = RoiDefinitions.from_json(json) +# print the JSON string representation of the object +print(RoiDefinitions.to_json()) + +# convert the object into a dict +roi_definitions_dict = roi_definitions_instance.to_dict() +# create an instance of RoiDefinitions from a dict +roi_definitions_from_dict = RoiDefinitions.from_dict(roi_definitions_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/_sources/python_client/docs/RotationAxis.md.txt b/_sources/python_client/docs/RotationAxis.md.txt new file mode 100644 index 00000000..a78b26ba --- /dev/null +++ b/_sources/python_client/docs/RotationAxis.md.txt @@ -0,0 +1,35 @@ +# RotationAxis + +Definition of a crystal rotation axis + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**name** | **str** | Name of rotation axis (e.g., omega, phi) | [optional] [default to 'omega'] +**step** | **float** | Angle step (per image) in degrees | +**start** | **float** | Start angle in degrees | [optional] [default to 0] +**vector** | **List[float]** | Rotation axis | +**helical_step_um** | **List[float]** | Translation (per image) for helical scan | [optional] +**screening_wedge_deg** | **float** | Wedge angle value; used if rotation per image is smaller than increment between images (so particularly in screening) | [optional] + +## Example + +```python +from jfjoch_client.models.rotation_axis import RotationAxis + +# TODO update the JSON string below +json = "{}" +# create an instance of RotationAxis from a JSON string +rotation_axis_instance = RotationAxis.from_json(json) +# print the JSON string representation of the object +print(RotationAxis.to_json()) + +# convert the object into a dict +rotation_axis_dict = rotation_axis_instance.to_dict() +# create an instance of RotationAxis from a dict +rotation_axis_from_dict = RotationAxis.from_dict(rotation_axis_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/_sources/python_client/docs/ScanResult.md.txt b/_sources/python_client/docs/ScanResult.md.txt new file mode 100644 index 00000000..73857ff6 --- /dev/null +++ b/_sources/python_client/docs/ScanResult.md.txt @@ -0,0 +1,33 @@ +# ScanResult + +Results of a scan + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**file_prefix** | **str** | | [optional] +**rotation_unit_cell** | [**UnitCell**](UnitCell.md) | | [optional] +**rotation_crystal_lattice** | **List[float]** | Real-space crystal lattice 3D vectors in Angstrom. Order is 1st vector (x,y,z), 2nd vector (x,y,z) and 3rd vector (x,y,z) | [optional] +**images** | [**List[ScanResultImagesInner]**](ScanResultImagesInner.md) | | + +## Example + +```python +from jfjoch_client.models.scan_result import ScanResult + +# TODO update the JSON string below +json = "{}" +# create an instance of ScanResult from a JSON string +scan_result_instance = ScanResult.from_json(json) +# print the JSON string representation of the object +print(ScanResult.to_json()) + +# convert the object into a dict +scan_result_dict = scan_result_instance.to_dict() +# create an instance of ScanResult from a dict +scan_result_from_dict = ScanResult.from_dict(scan_result_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/_sources/python_client/docs/ScanResultImagesInner.md.txt b/_sources/python_client/docs/ScanResultImagesInner.md.txt new file mode 100644 index 00000000..129b827d --- /dev/null +++ b/_sources/python_client/docs/ScanResultImagesInner.md.txt @@ -0,0 +1,48 @@ +# ScanResultImagesInner + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**efficiency** | **float** | | +**number** | **int** | Detector image number for a given cell | +**nx** | **int** | Cell position in X for grid scan | [optional] +**ny** | **int** | Cell position in Y for grid scan | [optional] +**angle** | **float** | Rotation angle associated with the image | [optional] +**bkg** | **float** | Background estimate | [optional] +**spots** | **int** | Spot count | [optional] +**spots_low_res** | **int** | Spot count in low resolution range | [optional] +**spots_indexed** | **int** | Spot count within indexing tolerance | [optional] +**spots_ice** | **int** | Spot count within common ice ring resolutions | [optional] +**index** | **int** | Indexing solution | [optional] +**pr** | **float** | Profile radius, i.e. how far reflections are from the Ewald sphere | [optional] +**b** | **float** | B-Factor estimate | [optional] +**uc** | [**UnitCell**](UnitCell.md) | | [optional] +**xfel_pulseid** | **int** | XFEL pulse ID | [optional] +**pixel_sum** | **int** | Total sum of all pixels | [optional] +**max** | **int** | Max viable pixel | [optional] +**sat** | **int** | Number of saturated pixels | [optional] +**err** | **int** | Number of error pixels | [optional] +**res** | **float** | Diffraction resolution estimate | [optional] + +## Example + +```python +from jfjoch_client.models.scan_result_images_inner import ScanResultImagesInner + +# TODO update the JSON string below +json = "{}" +# create an instance of ScanResultImagesInner from a JSON string +scan_result_images_inner_instance = ScanResultImagesInner.from_json(json) +# print the JSON string representation of the object +print(ScanResultImagesInner.to_json()) + +# convert the object into a dict +scan_result_images_inner_dict = scan_result_images_inner_instance.to_dict() +# create an instance of ScanResultImagesInner from a dict +scan_result_images_inner_from_dict = ScanResultImagesInner.from_dict(scan_result_images_inner_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/_sources/python_client/docs/SpotFindingSettings.md.txt b/_sources/python_client/docs/SpotFindingSettings.md.txt new file mode 100644 index 00000000..a15baaac --- /dev/null +++ b/_sources/python_client/docs/SpotFindingSettings.md.txt @@ -0,0 +1,40 @@ +# SpotFindingSettings + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**enable** | **bool** | Enable spot finding. This is temporary setting, i.e. can be changed anytime during data collection. Even if disabled spot finding information will still be send and written, though always with zero spots. | [default to True] +**indexing** | **bool** | Enable indexing. This is temporary setting, i.e. can be changed anytime during data collection. | [default to True] +**signal_to_noise_threshold** | **float** | | +**photon_count_threshold** | **int** | | +**min_pix_per_spot** | **int** | | +**max_pix_per_spot** | **int** | | +**high_resolution_limit** | **float** | High resolution limit for spot finding [Angstrom] | +**low_resolution_limit** | **float** | Low resolution limit for spot finding [Angstrom] | +**high_resolution_limit_for_spot_count_low_res** | **float** | High resolution threshold to consider spot \"low resolution\" [Angstrom] | +**quick_integration** | **bool** | Quick integration of Bragg spots in diffraction images. If enabled it will likely reduce performance of Jungfraujoch for datasets with a very high indexing rate. (experimental feature) | [default to False] +**ice_ring_width_q_recip_a** | **float** | Width of ice ring in q-space in reciprocal space | [default to 0.02] +**high_res_gap_q_recip_a** | **float** | This parameter is used to remove spurious spots at a very high resolution, that sometimes appear due to very low background close to the edge of the detector. If there is a gap in (1/d)-space between spots of at least this size, spots on the side of the gap with high resolution will be discarded. This is optional parameter. This option should be turned OFF for small molecule datasets or for crystals with very low mosaicity, when it is expected to see only few spots in any case. | [optional] [default to 1.5] + +## Example + +```python +from jfjoch_client.models.spot_finding_settings import SpotFindingSettings + +# TODO update the JSON string below +json = "{}" +# create an instance of SpotFindingSettings from a JSON string +spot_finding_settings_instance = SpotFindingSettings.from_json(json) +# print the JSON string representation of the object +print(SpotFindingSettings.to_json()) + +# convert the object into a dict +spot_finding_settings_dict = spot_finding_settings_instance.to_dict() +# create an instance of SpotFindingSettings from a dict +spot_finding_settings_from_dict = SpotFindingSettings.from_dict(spot_finding_settings_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/_sources/python_client/docs/StandardDetectorGeometry.md.txt b/_sources/python_client/docs/StandardDetectorGeometry.md.txt new file mode 100644 index 00000000..cf66170f --- /dev/null +++ b/_sources/python_client/docs/StandardDetectorGeometry.md.txt @@ -0,0 +1,33 @@ +# StandardDetectorGeometry + +Regular rectangular geometry, first module is in the bottom left corner of the detector + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**nmodules** | **int** | Number of modules in the detector | +**gap_x** | **int** | Gap size in X direction [pixels] | [optional] [default to 8] +**gap_y** | **int** | Gap size in Y direction [pixels] | [optional] [default to 36] +**modules_in_row** | **int** | Number of modules in one row | [optional] [default to 1] + +## Example + +```python +from jfjoch_client.models.standard_detector_geometry import StandardDetectorGeometry + +# TODO update the JSON string below +json = "{}" +# create an instance of StandardDetectorGeometry from a JSON string +standard_detector_geometry_instance = StandardDetectorGeometry.from_json(json) +# print the JSON string representation of the object +print(StandardDetectorGeometry.to_json()) + +# convert the object into a dict +standard_detector_geometry_dict = standard_detector_geometry_instance.to_dict() +# create an instance of StandardDetectorGeometry from a dict +standard_detector_geometry_from_dict = StandardDetectorGeometry.from_dict(standard_detector_geometry_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/_sources/python_client/docs/TcpSettings.md.txt b/_sources/python_client/docs/TcpSettings.md.txt new file mode 100644 index 00000000..39df8093 --- /dev/null +++ b/_sources/python_client/docs/TcpSettings.md.txt @@ -0,0 +1,32 @@ +# TcpSettings + +TCP image stream configuration for Jungfraujoch software. This structure is used to provide default settings using configuration JSON file and is not used in HTTP. + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**send_buffer_size** | **int** | Send buffer size for TCP/IP socket | [optional] +**image_socket** | **str** | tcp://<IP address>:<port> 0.0.0.0 instead of IP address is accepted and means listening on all network interfaces | [optional] +**nwriters** | **int** | Number of TCP/IP writers to be used for streaming images | [optional] [default to 32] + +## Example + +```python +from jfjoch_client.models.tcp_settings import TcpSettings + +# TODO update the JSON string below +json = "{}" +# create an instance of TcpSettings from a JSON string +tcp_settings_instance = TcpSettings.from_json(json) +# print the JSON string representation of the object +print(TcpSettings.to_json()) + +# convert the object into a dict +tcp_settings_dict = tcp_settings_instance.to_dict() +# create an instance of TcpSettings from a dict +tcp_settings_from_dict = TcpSettings.from_dict(tcp_settings_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/_sources/python_client/docs/UnitCell.md.txt b/_sources/python_client/docs/UnitCell.md.txt new file mode 100644 index 00000000..80e2f4e7 --- /dev/null +++ b/_sources/python_client/docs/UnitCell.md.txt @@ -0,0 +1,35 @@ +# UnitCell + +Unit cell parameters. Necessary to run indexing. Units of angstrom and degree + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**a** | **float** | | +**b** | **float** | | +**c** | **float** | | +**alpha** | **float** | | +**beta** | **float** | | +**gamma** | **float** | | + +## Example + +```python +from jfjoch_client.models.unit_cell import UnitCell + +# TODO update the JSON string below +json = "{}" +# create an instance of UnitCell from a JSON string +unit_cell_instance = UnitCell.from_json(json) +# print the JSON string representation of the object +print(UnitCell.to_json()) + +# convert the object into a dict +unit_cell_dict = unit_cell_instance.to_dict() +# create an instance of UnitCell from a dict +unit_cell_from_dict = UnitCell.from_dict(unit_cell_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/_sources/python_client/docs/ZeromqMetadataSettings.md.txt b/_sources/python_client/docs/ZeromqMetadataSettings.md.txt new file mode 100644 index 00000000..e584ac88 --- /dev/null +++ b/_sources/python_client/docs/ZeromqMetadataSettings.md.txt @@ -0,0 +1,31 @@ +# ZeromqMetadataSettings + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**enabled** | **bool** | ZeroMQ metadata socket is enabled. | [default to True] +**period_ms** | **int** | Period for generating metadata package sent to the ZeroMQ interface in milliseconds. | [default to 1000] +**socket_address** | **str** | PUB ZeroMQ socket for image metadata information. Image metadata are serialized using CBOR. Address follows ZeroMQ convention for sockets - in practice ipc://<socket file> and tcp://<IP address>:<port> sockets are OK. 0.0.0.0 instead of IP address is accepted and means listening on all network interfaces. | [optional] + +## Example + +```python +from jfjoch_client.models.zeromq_metadata_settings import ZeromqMetadataSettings + +# TODO update the JSON string below +json = "{}" +# create an instance of ZeromqMetadataSettings from a JSON string +zeromq_metadata_settings_instance = ZeromqMetadataSettings.from_json(json) +# print the JSON string representation of the object +print(ZeromqMetadataSettings.to_json()) + +# convert the object into a dict +zeromq_metadata_settings_dict = zeromq_metadata_settings_instance.to_dict() +# create an instance of ZeromqMetadataSettings from a dict +zeromq_metadata_settings_from_dict = ZeromqMetadataSettings.from_dict(zeromq_metadata_settings_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/_sources/python_client/docs/ZeromqPreviewSettings.md.txt b/_sources/python_client/docs/ZeromqPreviewSettings.md.txt new file mode 100644 index 00000000..2198076a --- /dev/null +++ b/_sources/python_client/docs/ZeromqPreviewSettings.md.txt @@ -0,0 +1,31 @@ +# ZeromqPreviewSettings + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**enabled** | **bool** | ZeroMQ preview socket is enabled. | [default to True] +**period_ms** | **int** | Period for generating preview image sent to the ZeroMQ interface in milliseconds. Default is 1 second. If set to zero, all images will be sent ZeroMQ (should be used only in case of relatively slow data collection). This has no effect on HTTP based preview, which updates always at rate of 1 second. | [default to 1000] +**socket_address** | **str** | PUB ZeroMQ socket for preview images. This socket operates at a reduced frame rate. Images are serialized using CBOR. Address follows ZeroMQ convention for sockets - in practice ipc://<socket file> and tcp://<IP address>:<port> sockets are OK. 0.0.0.0 instead of IP address is accepted and means listening on all network interfaces. | [optional] + +## Example + +```python +from jfjoch_client.models.zeromq_preview_settings import ZeromqPreviewSettings + +# TODO update the JSON string below +json = "{}" +# create an instance of ZeromqPreviewSettings from a JSON string +zeromq_preview_settings_instance = ZeromqPreviewSettings.from_json(json) +# print the JSON string representation of the object +print(ZeromqPreviewSettings.to_json()) + +# convert the object into a dict +zeromq_preview_settings_dict = zeromq_preview_settings_instance.to_dict() +# create an instance of ZeromqPreviewSettings from a dict +zeromq_preview_settings_from_dict = ZeromqPreviewSettings.from_dict(zeromq_preview_settings_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/_sources/python_client/docs/ZeromqSettings.md.txt b/_sources/python_client/docs/ZeromqSettings.md.txt new file mode 100644 index 00000000..ededb477 --- /dev/null +++ b/_sources/python_client/docs/ZeromqSettings.md.txt @@ -0,0 +1,33 @@ +# ZeromqSettings + +ZeroMQ configuration for Jungfraujoch software. This structure is used to provide default settings using configuration JSON file and is not used in HTTP. + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**send_watermark** | **int** | Watermark for ZeroMQ send queue (number of outstanding messages queued on Jungfraujoch server per queue) | [optional] [default to 100] +**send_buffer_size** | **int** | Send buffer size for ZeroMQ socket | [optional] +**image_socket** | **List[str]** | PUSH ZeroMQ socket for images. In case multiple sockets are provided, images are streamed over multiple sockets. Images are serialized using CBOR. Address follows ZeroMQ convention for sockets - in practice ipc://<socket file> and tpc://<IP address>:<port> sockets are OK. 0.0.0.0 instead of IP address is accepted and means listening on all network interfaces. | [optional] +**writer_notification_socket** | **str** | PULL ZeroMQ socket for notifications from writer that it finished operation. This allows Jungfraujoch to operate in a synchronous manner, with end of acquisition being also end of writing. Address follows ZeroMQ convention for sockets - in practice ipc://<socket file> and tpc://<IP address>:<port> sockets are OK. 0.0.0.0 instead of IP address should be avoided, as this socket address is forwarded to the writer process via START ZerOMQ message and in case of multiple ineterfaces the address might be ambigous. Using * (star) instead of port number is allowed and it means a random free port number. | [optional] + +## Example + +```python +from jfjoch_client.models.zeromq_settings import ZeromqSettings + +# TODO update the JSON string below +json = "{}" +# create an instance of ZeromqSettings from a JSON string +zeromq_settings_instance = ZeromqSettings.from_json(json) +# print the JSON string representation of the object +print(ZeromqSettings.to_json()) + +# convert the object into a dict +zeromq_settings_dict = zeromq_settings_instance.to_dict() +# create an instance of ZeromqSettings from a dict +zeromq_settings_from_dict = ZeromqSettings.from_dict(zeromq_settings_dict) +``` +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/_static/basic.css b/_static/basic.css new file mode 100644 index 00000000..95140fbf --- /dev/null +++ b/_static/basic.css @@ -0,0 +1 @@ +@charset "utf-8"; div.clearer{clear:both}div.section::after{display:block;content:'';clear:left}div.related{width:100%;font-size:90%}div.related h3{display:none}div.related ul{margin:0;padding:0 0 0 10px;list-style:none}div.related li{display:inline}div.related li.right{float:right;margin-right:5px}div.sphinxsidebarwrapper{padding:10px 5px 0 10px}div.sphinxsidebar{float:left;width:230px;margin-left:-100%;font-size:90%;word-wrap:break-word;overflow-wrap:break-word}div.sphinxsidebar ul{list-style:none}div.sphinxsidebar ul ul,div.sphinxsidebar ul.want-points{margin-left:20px;list-style:square}div.sphinxsidebar ul ul{margin-top:0;margin-bottom:0}div.sphinxsidebar form{margin-top:10px}div.sphinxsidebar input{border:1px solid #98dbcc;font-family:sans-serif;font-size:1em}div.sphinxsidebar #searchbox form.search{overflow:hidden}div.sphinxsidebar #searchbox input[type=text]{float:left;width:80%;padding:.25em;box-sizing:border-box}div.sphinxsidebar #searchbox input[type=submit]{float:left;width:20%;border-left:none;padding:.25em;box-sizing:border-box}img{border:0;max-width:100%}ul.search{margin-top:10px}ul.search li{padding:5px 0}ul.search li a{font-weight:bold}ul.search li p.context{color:#888;margin:2px 0 0 30px;text-align:left}ul.keywordmatches li.goodmatch a{font-weight:bold}table.contentstable{width:90%;margin-left:auto;margin-right:auto}table.contentstable p.biglink{line-height:150%}a.biglink{font-size:1.3em}span.linkdescr{font-style:italic;padding-top:5px;font-size:90%}table.indextable{width:100%}table.indextable td{text-align:left;vertical-align:top}table.indextable ul{margin-top:0;margin-bottom:0;list-style-type:none}table.indextable>tbody>tr>td>ul{padding-left:0}table.indextable tr.pcap{height:10px}table.indextable tr.cap{margin-top:10px;background-color:#f2f2f2}img.toggler{margin-right:3px;margin-top:3px;cursor:pointer}div.modindex-jumpbox{border-top:1px solid #ddd;border-bottom:1px solid #ddd;margin:1em 0 1em 0;padding:.4em}div.genindex-jumpbox{border-top:1px solid #ddd;border-bottom:1px solid #ddd;margin:1em 0 1em 0;padding:.4em}table.modindextable td{padding:2px;border-collapse:collapse}div.body{min-width:360px;max-width:800px}div.body p,div.body dd,div.body li,div.body blockquote{-moz-hyphens:auto;-ms-hyphens:auto;-webkit-hyphens:auto;hyphens:auto}a.headerlink{visibility:hidden}a:visited{color:#551A8B}h1:hover>a.headerlink,h2:hover>a.headerlink,h3:hover>a.headerlink,h4:hover>a.headerlink,h5:hover>a.headerlink,h6:hover>a.headerlink,dt:hover>a.headerlink,caption:hover>a.headerlink,p.caption:hover>a.headerlink,div.code-block-caption:hover>a.headerlink{visibility:visible}div.body p.caption{text-align:inherit}div.body td{text-align:left}.first{margin-top:0 !important}p.rubric{margin-top:30px;font-weight:bold}img.align-left,figure.align-left,.figure.align-left,object.align-left{clear:left;float:left;margin-right:1em}img.align-right,figure.align-right,.figure.align-right,object.align-right{clear:right;float:right;margin-left:1em}img.align-center,figure.align-center,.figure.align-center,object.align-center{display:block;margin-left:auto;margin-right:auto}img.align-default,figure.align-default,.figure.align-default{display:block;margin-left:auto;margin-right:auto}.align-left{text-align:left}.align-center{text-align:center}.align-default{text-align:center}.align-right{text-align:right}div.sidebar,aside.sidebar{margin:0 0 .5em 1em;border:1px solid #ddb;padding:7px;background-color:#ffe;width:40%;float:right;clear:right;overflow-x:auto}p.sidebar-title{font-weight:bold}nav.contents,aside.topic,div.admonition,div.topic,blockquote{clear:left}nav.contents,aside.topic,div.topic{border:1px solid #ccc;padding:7px;margin:10px 0 10px 0}p.topic-title{font-size:1.1em;font-weight:bold;margin-top:10px}div.admonition{margin-top:10px;margin-bottom:10px;padding:7px}div.admonition dt{font-weight:bold}p.admonition-title{margin:0 10px 5px 0;font-weight:bold}div.body p.centered{text-align:center;margin-top:25px}div.sidebar>:last-child,aside.sidebar>:last-child,nav.contents>:last-child,aside.topic>:last-child,div.topic>:last-child,div.admonition>:last-child{margin-bottom:0}div.sidebar::after,aside.sidebar::after,nav.contents::after,aside.topic::after,div.topic::after,div.admonition::after,blockquote::after{display:block;content:'';clear:both}table.docutils{margin-top:10px;margin-bottom:10px;border:0;border-collapse:collapse}table.align-center{margin-left:auto;margin-right:auto}table.align-default{margin-left:auto;margin-right:auto}table caption span.caption-number{font-style:italic}table caption span.caption-text{}table.docutils td,table.docutils th{padding:1px 8px 1px 5px;border-top:0;border-left:0;border-right:0;border-bottom:1px solid #aaa}th{text-align:left;padding-right:5px}table.citation{border-left:solid 1px gray;margin-left:1px}table.citation td{border-bottom:none}th>:first-child,td>:first-child{margin-top:0}th>:last-child,td>:last-child{margin-bottom:0}div.figure,figure{margin:.5em;padding:.5em}div.figure p.caption,figcaption{padding:.3em}div.figure p.caption span.caption-number,figcaption span.caption-number{font-style:italic}div.figure p.caption span.caption-text,figcaption span.caption-text{}table.field-list td,table.field-list th{border:0 !important}.field-list ul{margin:0;padding-left:1em}.field-list p{margin:0}.field-name{-moz-hyphens:manual;-ms-hyphens:manual;-webkit-hyphens:manual;hyphens:manual}table.hlist{margin:1em 0}table.hlist td{vertical-align:top}.sig{font-family:'Consolas','Menlo','DejaVu Sans Mono','Bitstream Vera Sans Mono',monospace}.sig-name,code.descname{background-color:transparent;font-weight:bold}.sig-name{font-size:1.1em}code.descname{font-size:1.2em}.sig-prename,code.descclassname{background-color:transparent}.optional{font-size:1.3em}.sig-paren{font-size:larger}.sig-param.n{font-style:italic}.sig-inline.c-texpr,.sig-inline.cpp-texpr{font-family:unset}.sig.c .k,.sig.c .kt,.sig.cpp .k,.sig.cpp .kt{color:#0033B3}.sig.c .m,.sig.cpp .m{color:#1750EB}.sig.c .s,.sig.c .sc,.sig.cpp .s,.sig.cpp .sc{color:#067D17}ol.arabic{list-style:decimal}ol.loweralpha{list-style:lower-alpha}ol.upperalpha{list-style:upper-alpha}ol.lowerroman{list-style:lower-roman}ol.upperroman{list-style:upper-roman}:not(li)>ol>li:first-child>:first-child,:not(li)>ul>li:first-child>:first-child{margin-top:0}:not(li)>ol>li:last-child>:last-child,:not(li)>ul>li:last-child>:last-child{margin-bottom:0}ol.simple ol p,ol.simple ul p,ul.simple ol p,ul.simple ul p{margin-top:0}ol.simple>li:not(:first-child)>p,ul.simple>li:not(:first-child)>p{margin-top:0}ol.simple p,ul.simple p{margin-bottom:0}aside.footnote>span,div.citation>span{float:left}aside.footnote>span:last-of-type,div.citation>span:last-of-type{padding-right:.5em}aside.footnote>p{margin-left:2em}div.citation>p{margin-left:4em}aside.footnote>p:last-of-type,div.citation>p:last-of-type{margin-bottom:0}aside.footnote>p:last-of-type:after,div.citation>p:last-of-type:after{content:"";clear:both}dl.field-list{display:grid;grid-template-columns:fit-content(30%) auto}dl.field-list>dt{font-weight:bold;word-break:break-word;padding-left:.5em;padding-right:5px}dl.field-list>dd{padding-left:.5em;margin-top:0;margin-left:0;margin-bottom:0}dl{margin-bottom:15px}dd>:first-child{margin-top:0}dd ul,dd table{margin-bottom:10px}dd{margin-top:3px;margin-bottom:10px;margin-left:30px}.sig dd{margin-top:0;margin-bottom:0}.sig dl{margin-top:0;margin-bottom:0}dl>dd:last-child,dl>dd:last-child>:last-child{margin-bottom:0}dt:target,span.highlighted{background-color:#fbe54e}rect.highlighted{fill:#fbe54e}dl.glossary dt{font-weight:bold;font-size:1.1em}.versionmodified{font-style:italic}.system-message{background-color:#fda;padding:5px;border:3px solid red}.footnote:target{background-color:#ffa}.line-block{display:block;margin-top:1em;margin-bottom:1em}.line-block .line-block{margin-top:0;margin-bottom:0;margin-left:1.5em}.guilabel,.menuselection{font-family:sans-serif}.accelerator{text-decoration:underline}.classifier{font-style:oblique}.classifier:before{font-style:normal;margin:0 .5em;content:":";display:inline-block}abbr,acronym{border-bottom:dotted 1px;cursor:help}.translated{background-color:rgba(207,255,207,0.2)}.untranslated{background-color:rgba(255,207,207,0.2)}pre{overflow:auto;overflow-y:hidden}pre,div[class*="highlight-"]{clear:both}span.pre{-moz-hyphens:none;-ms-hyphens:none;-webkit-hyphens:none;hyphens:none;white-space:nowrap}div[class*="highlight-"]{margin:1em 0}td.linenos pre{border:0;background-color:transparent;color:#aaa}table.highlighttable{display:block}table.highlighttable tbody{display:block}table.highlighttable tr{display:flex}table.highlighttable td{margin:0;padding:0}table.highlighttable td.linenos{padding-right:.5em}table.highlighttable td.code{flex:1;overflow:hidden}.highlight .hll{display:block}div.highlight pre,table.highlighttable pre{margin:0}div.code-block-caption + div{margin-top:0}div.code-block-caption{margin-top:1em;padding:2px 5px;font-size:small}div.code-block-caption code{background-color:transparent}table.highlighttable td.linenos,span.linenos,div.highlight span.gp{user-select:none;-webkit-user-select:text;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}div.code-block-caption span.caption-number{padding:.1em .3em;font-style:italic}div.code-block-caption span.caption-text{}div.literal-block-wrapper{margin:1em 0}code.xref,a code{background-color:transparent;font-weight:bold}h1 code,h2 code,h3 code,h4 code,h5 code,h6 code{background-color:transparent}.viewcode-link{float:right}.viewcode-back{float:right;font-family:sans-serif}div.viewcode-block:target{margin:-1px -10px;padding:0 10px}img.math{vertical-align:middle}div.body div.math p{text-align:center}span.eqno{float:right}span.eqno a.headerlink{position:absolute;z-index:1}div.math:hover a.headerlink{visibility:visible}@media print{div.document,div.documentwrapper,div.bodywrapper{margin:0 !important;width:100%}div.sphinxsidebar,div.related,div.footer,#top-link{display:none}} \ No newline at end of file diff --git a/_static/doctools.js b/_static/doctools.js new file mode 100644 index 00000000..0398ebb9 --- /dev/null +++ b/_static/doctools.js @@ -0,0 +1,149 @@ +/* + * Base JavaScript utilities for all Sphinx HTML documentation. + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/_static/documentation_options.js b/_static/documentation_options.js new file mode 100644 index 00000000..8c47fc59 --- /dev/null +++ b/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '1.0.0-rc.144', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/_static/file.png b/_static/file.png new file mode 100644 index 0000000000000000000000000000000000000000..a858a410e4faa62ce324d814e4b816fff83a6fb3 GIT binary patch literal 286 zcmV+(0pb3MP)s`hMrGg#P~ix$^RISR_I47Y|r1 z_CyJOe}D1){SET-^Amu_i71Lt6eYfZjRyw@I6OQAIXXHDfiX^GbOlHe=Ae4>0m)d(f|Me07*qoM6N<$f}vM^LjV8( literal 0 HcmV?d00001 diff --git a/_static/fonts/font-awesome.css b/_static/fonts/font-awesome.css new file mode 100644 index 00000000..e7dcefb8 --- /dev/null +++ b/_static/fonts/font-awesome.css @@ -0,0 +1 @@ +@charset "utf-8";/*!* Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license(Font:SIL OFL 1.1,CSS:MIT License) */@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(specimen/FontAwesome.woff2) format("woff2"),url(specimen/FontAwesome.woff) format("woff"),url(specimen/FontAwesome.ttf) format("truetype")}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0,mirror=1)";-webkit-transform:scale(-1,1);-ms-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2,mirror=1)";-webkit-transform:scale(1,-1);-ms-transform:scale(1,-1);transform:scale(1,-1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-vcard:before,.fa-address-card:before{content:"\f2bb"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto} \ No newline at end of file diff --git a/_static/fonts/material-icons.css b/_static/fonts/material-icons.css new file mode 100644 index 00000000..76de20cb --- /dev/null +++ b/_static/fonts/material-icons.css @@ -0,0 +1 @@ +@charset "utf-8";/*!* Licensed under the Apache License,Version 2.0(the "License");you may not * use this file except in compliance with the License. You may obtain a copy * of the License at:* * http://www.apache.org/licenses/LICENSE-2.0 * * UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING,SOFTWARE * DISTRIBUTED UNDER THE LICENSE IS DISTRIBUTED ON AN "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,EITHER EXPRESS OR IMPLIED. * SEE THE LICENSE FOR THE SPECIFIC LANGUAGE GOVERNING PERMISSIONS AND * LIMITATIONS UNDER THE LICENSE. */@font-face{font-display:swap;font-family:"Material Icons";font-style:normal;font-weight:400;src:local("Material Icons"),local("MaterialIcons-Regular"),url(specimen/MaterialIcons-Regular.woff2) format("woff2"),url(specimen/MaterialIcons-Regular.woff) format("woff"),url(specimen/MaterialIcons-Regular.ttf) format("truetype")} \ No newline at end of file diff --git a/_static/fonts/specimen/FontAwesome.ttf b/_static/fonts/specimen/FontAwesome.ttf new file mode 100644 index 0000000000000000000000000000000000000000..35acda2fa1196aad98c2adf4378a7611dd713aa3 GIT binary patch literal 165548 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 z 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 d0mRO}xo^G_%I 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 SdSQM28?+M|D(2r_;{O0|uQ74} literal 0 HcmV?d00001 diff --git a/_static/fonts/specimen/FontAwesome.woff2 b/_static/fonts/specimen/FontAwesome.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..4d13fc60404b91e398a37200c4a77b645cfd9586 GIT binary patch literal 77160 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 literal 0 HcmV?d00001 diff --git a/_static/fonts/specimen/MaterialIcons-Regular.ttf b/_static/fonts/specimen/MaterialIcons-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..7015564ad166a3e9d88c82f17829f0cc01ebe29a GIT binary patch literal 128180 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 ohyj3!`#ee%L;DTjx@8!5k5~VH0QmdE^#A|> literal 0 HcmV?d00001 diff --git a/_static/fonts/specimen/MaterialIcons-Regular.woff b/_static/fonts/specimen/MaterialIcons-Regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..b648a3eea2d16b6ce783906d6b7d5f251b9eb56c GIT binary patch literal 57620 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

wF7DI|Kx|V1sBQ9FYs>m5C)C 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 BJ$(QG literal 0 HcmV?d00001 diff --git a/_static/fonts/specimen/MaterialIcons-Regular.woff2 b/_static/fonts/specimen/MaterialIcons-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..9fa211252080046a23b2449dbdced6abc2b0bb34 GIT binary patch literal 44300 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 QW8}wPUeo^@jR61v08@RD2LJ#7 literal 0 HcmV?d00001 diff --git a/_static/images/favicon.png b/_static/images/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..76d17f57ad903c3ea2f1b564cafb95bf9af84ee3 GIT binary patch literal 521 zcmV+k0`~ohP)kdg0005dNkl2WptjAn6@db&Pvy?U$ zv>P|<&rCZfZF0jmq0opf8)91(A<*iIVPPJJT((+JiF~>9KAA3%heFdnI;SaK+~|aU zQ~!x`%y{jX1<~SK2RxN7Db8`yWBbf6p7&07{VXfaam*cUs&eu*Zu(xaIL8rP){;a< zS~$}^Td32Rw+W1TqTd|L{#~jJet4!qwKsb5hq%YXiiUV!yH=ltu0>s|FLsT+Iy7K~ z!6*Z0a@vQ;AiZo!=s{{fqR+ct6YQPzbk+j}*qe7vtu39I7 zrOtZqU}=NnLchJxsU9iY+}3TYDl|BvPsX%E@dlyLgdV%q$UP|Y?DfcGb`}K&$;drd z+hL;zy7UTccUYU+h`ONIU|d=%`(0$=KW4%tVWXj~AE \ No newline at end of file diff --git a/_static/images/icons/bitbucket.svg b/_static/images/icons/bitbucket.svg new file mode 100644 index 00000000..cf58c14f --- /dev/null +++ b/_static/images/icons/bitbucket.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/_static/images/icons/github.f0b8504a.svg b/_static/images/icons/github.f0b8504a.svg new file mode 100644 index 00000000..3d13b197 --- /dev/null +++ b/_static/images/icons/github.f0b8504a.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/_static/images/icons/github.svg b/_static/images/icons/github.svg new file mode 100644 index 00000000..3d13b197 --- /dev/null +++ b/_static/images/icons/github.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/_static/images/icons/gitlab.6dd19c00.svg b/_static/images/icons/gitlab.6dd19c00.svg new file mode 100644 index 00000000..1d9fffa7 --- /dev/null +++ b/_static/images/icons/gitlab.6dd19c00.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/_static/images/icons/gitlab.svg b/_static/images/icons/gitlab.svg new file mode 100644 index 00000000..1d9fffa7 --- /dev/null +++ b/_static/images/icons/gitlab.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/_static/javascripts/application.js b/_static/javascripts/application.js new file mode 100644 index 00000000..7c724d2e --- /dev/null +++ b/_static/javascripts/application.js @@ -0,0 +1,2540 @@ +! function(e, t) { + for (var n in t) e[n] = t[n] +}(window, function(n) { + var r = {}; + + function i(e) { + if (r[e]) return r[e].exports; + var t = r[e] = { + i: e, + l: !1, + exports: {} + }; + return n[e].call(t.exports, t, t.exports, i), t.l = !0, t.exports + } + return i.m = n, i.c = r, i.d = function(e, t, n) { + i.o(e, t) || Object.defineProperty(e, t, { + enumerable: !0, + get: n + }) + }, i.r = function(e) { + "undefined" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(e, Symbol.toStringTag, { + value: "Module" + }), Object.defineProperty(e, "__esModule", { + value: !0 + }) + }, i.t = function(t, e) { + if (1 & e && (t = i(t)), 8 & e) return t; + if (4 & e && "object" == typeof t && t && t.__esModule) return t; + var n = Object.create(null); + if (i.r(n), Object.defineProperty(n, "default", { + enumerable: !0, + value: t + }), 2 & e && "string" != typeof t) + for (var r in t) i.d(n, r, function(e) { + return t[e] + }.bind(null, r)); + return n + }, i.n = function(e) { + var t = e && e.__esModule ? function() { + return e.default + } : function() { + return e + }; + return i.d(t, "a", t), t + }, i.o = function(e, t) { + return Object.prototype.hasOwnProperty.call(e, t) + }, i.p = "", i(i.s = 13) +}([function(e, t, n) { + "use strict"; + var r = { + Listener: function() { + function e(e, t, n) { + var r = this; + this.els_ = Array.prototype.slice.call("string" == typeof e ? document.querySelectorAll(e) : [].concat(e)), this.handler_ = "function" == typeof n ? { + update: n + } : n, this.events_ = [].concat(t), this.update_ = function(e) { + return r.handler_.update(e) + } + } + var t = e.prototype; + return t.listen = function() { + var n = this; + this.els_.forEach(function(t) { + n.events_.forEach(function(e) { + t.addEventListener(e, n.update_, !1) + }) + }), "function" == typeof this.handler_.setup && this.handler_.setup() + }, t.unlisten = function() { + var n = this; + this.els_.forEach(function(t) { + n.events_.forEach(function(e) { + t.removeEventListener(e, n.update_) + }) + }), "function" == typeof this.handler_.reset && this.handler_.reset() + }, e + }(), + MatchMedia: function(e, t) { + this.handler_ = function(e) { + e.matches ? t.listen() : t.unlisten() + }; + var n = window.matchMedia(e); + n.addListener(this.handler_), this.handler_(n) + } + }, + i = { + Shadow: function() { + function e(e, t) { + var n = "string" == typeof e ? document.querySelector(e) : e; + if (!(n instanceof HTMLElement && n.parentNode instanceof HTMLElement)) throw new ReferenceError; + if (this.el_ = n.parentNode, !((n = "string" == typeof t ? document.querySelector(t) : t) instanceof HTMLElement)) throw new ReferenceError; + this.header_ = n, this.height_ = 0, this.active_ = !1 + } + var t = e.prototype; + return t.setup = function() { + for (var e = this.el_; e = e.previousElementSibling;) { + if (!(e instanceof HTMLElement)) throw new ReferenceError; + this.height_ += e.offsetHeight + } + this.update() + }, t.update = function(e) { + if (!e || "resize" !== e.type && "orientationchange" !== e.type) { + var t = window.pageYOffset >= this.height_; + t !== this.active_ && (this.header_.dataset.mdState = (this.active_ = t) ? "shadow" : "") + } else this.height_ = 0, this.setup() + }, t.reset = function() { + this.header_.dataset.mdState = "", this.height_ = 0, this.active_ = !1 + }, e + }(), + Title: function() { + function e(e, t) { + var n = "string" == typeof e ? document.querySelector(e) : e; + if (!(n instanceof HTMLElement)) throw new ReferenceError; + if (this.el_ = n, !((n = "string" == typeof t ? document.querySelector(t) : t) instanceof HTMLHeadingElement)) throw new ReferenceError; + this.header_ = n, this.active_ = !1 + } + var t = e.prototype; + return t.setup = function() { + var t = this; + Array.prototype.forEach.call(this.el_.children, function(e) { + e.style.width = t.el_.offsetWidth - 20 + "px" + }) + }, t.update = function(e) { + var t = this, + n = window.pageYOffset >= this.header_.offsetTop; + n !== this.active_ && (this.el_.dataset.mdState = (this.active_ = n) ? "active" : ""), "resize" !== e.type && "orientationchange" !== e.type || Array.prototype.forEach.call(this.el_.children, function(e) { + e.style.width = t.el_.offsetWidth - 20 + "px" + }) + }, t.reset = function() { + this.el_.dataset.mdState = "", this.el_.style.width = "", this.active_ = !1 + }, e + }() + }, + o = { + Blur: function() { + function e(e) { + this.els_ = "string" == typeof e ? document.querySelectorAll(e) : e, this.index_ = 0, this.offset_ = window.pageYOffset, this.dir_ = !1, this.anchors_ = [].reduce.call(this.els_, function(e, t) { + var n = decodeURIComponent(t.hash); + return e.concat(document.getElementById(n.substring(1)) || []) + }, []) + } + var t = e.prototype; + return t.setup = function() { + this.update() + }, t.update = function() { + var e = window.pageYOffset, + t = this.offset_ - e < 0; + if (this.dir_ !== t && (this.index_ = this.index_ = t ? 0 : this.els_.length - 1), 0 !== this.anchors_.length) { + if (this.offset_ <= e) + for (var n = this.index_ + 1; n < this.els_.length && this.anchors_[n].offsetTop - 80 <= e; n++) 0 < n && (this.els_[n - 1].dataset.mdState = "blur"), this.index_ = n; + else + for (var r = this.index_; 0 <= r; r--) { + if (!(this.anchors_[r].offsetTop - 80 > e)) { + this.index_ = r; + break + } + 0 < r && (this.els_[r - 1].dataset.mdState = "") + } + this.offset_ = e, this.dir_ = t + } + }, t.reset = function() { + Array.prototype.forEach.call(this.els_, function(e) { + e.dataset.mdState = "" + }), this.index_ = 0, this.offset_ = window.pageYOffset + }, e + }(), + Collapse: function() { + function e(e) { + var t = "string" == typeof e ? document.querySelector(e) : e; + if (!(t instanceof HTMLElement)) throw new ReferenceError; + this.el_ = t + } + var t = e.prototype; + return t.setup = function() { + var e = this.el_.getBoundingClientRect().height; + this.el_.style.display = e ? "block" : "none", this.el_.style.overflow = e ? "visible" : "hidden" + }, t.update = function() { + var e = this, + t = this.el_.getBoundingClientRect().height; + this.el_.style.display = "block", this.el_.style.overflow = ""; + var r = this.el_.previousElementSibling.previousElementSibling.checked; + if (r) this.el_.style.maxHeight = t + "px", requestAnimationFrame(function() { + e.el_.setAttribute("data-md-state", "animate"), e.el_.style.maxHeight = "0px" + }); + else { + this.el_.setAttribute("data-md-state", "expand"), this.el_.style.maxHeight = ""; + var n = this.el_.getBoundingClientRect().height; + this.el_.removeAttribute("data-md-state"), this.el_.style.maxHeight = "0px", requestAnimationFrame(function() { + e.el_.setAttribute("data-md-state", "animate"), e.el_.style.maxHeight = n + "px" + }) + } + this.el_.addEventListener("transitionend", function e(t) { + var n = t.target; + if (!(n instanceof HTMLElement)) throw new ReferenceError; + n.removeAttribute("data-md-state"), n.style.maxHeight = "", n.style.display = r ? "none" : "block", n.style.overflow = r ? "hidden" : "visible", n.removeEventListener("transitionend", e) + }, !1) + }, t.reset = function() { + this.el_.dataset.mdState = "", this.el_.style.maxHeight = "", this.el_.style.display = "", this.el_.style.overflow = "" + }, e + }(), + Scrolling: function() { + function e(e) { + var t = "string" == typeof e ? document.querySelector(e) : e; + if (!(t instanceof HTMLElement)) throw new ReferenceError; + this.el_ = t + } + var t = e.prototype; + return t.setup = function() { + this.el_.children[this.el_.children.length - 1].style.webkitOverflowScrolling = "touch"; + var e = this.el_.querySelectorAll("[data-md-toggle]"); + Array.prototype.forEach.call(e, function(e) { + if (!(e instanceof HTMLInputElement)) throw new ReferenceError; + if (e.checked) { + var t = e.nextElementSibling; + if (!(t instanceof HTMLElement)) throw new ReferenceError; + for (; + "NAV" !== t.tagName && t.nextElementSibling;) t = t.nextElementSibling; + if (!(e.parentNode instanceof HTMLElement && e.parentNode.parentNode instanceof HTMLElement)) throw new ReferenceError; + var n = e.parentNode.parentNode, + r = t.children[t.children.length - 1]; + n.style.webkitOverflowScrolling = "", r.style.webkitOverflowScrolling = "touch" + } + }) + }, t.update = function(e) { + var t = e.target; + if (!(t instanceof HTMLElement)) throw new ReferenceError; + var n = t.nextElementSibling; + if (!(n instanceof HTMLElement)) throw new ReferenceError; + for (; + "NAV" !== n.tagName && n.nextElementSibling;) n = n.nextElementSibling; + if (!(t.parentNode instanceof HTMLElement && t.parentNode.parentNode instanceof HTMLElement)) throw new ReferenceError; + var r = t.parentNode.parentNode, + i = n.children[n.children.length - 1]; + if (r.style.webkitOverflowScrolling = "", i.style.webkitOverflowScrolling = "", !t.checked) { + n.addEventListener("transitionend", function e() { + n instanceof HTMLElement && (r.style.webkitOverflowScrolling = "touch", n.removeEventListener("transitionend", e)) + }, !1) + } + if (t.checked) { + n.addEventListener("transitionend", function e() { + n instanceof HTMLElement && (i.style.webkitOverflowScrolling = "touch", n.removeEventListener("transitionend", e)) + }, !1) + } + }, t.reset = function() { + this.el_.children[1].style.webkitOverflowScrolling = ""; + var e = this.el_.querySelectorAll("[data-md-toggle]"); + Array.prototype.forEach.call(e, function(e) { + if (!(e instanceof HTMLInputElement)) throw new ReferenceError; + if (e.checked) { + var t = e.nextElementSibling; + if (!(t instanceof HTMLElement)) throw new ReferenceError; + for (; + "NAV" !== t.tagName && t.nextElementSibling;) t = t.nextElementSibling; + if (!(e.parentNode instanceof HTMLElement && e.parentNode.parentNode instanceof HTMLElement)) throw new ReferenceError; + var n = e.parentNode.parentNode, + r = t.children[t.children.length - 1]; + n.style.webkitOverflowScrolling = "", r.style.webkitOverflowScrolling = "" + } + }) + }, e + }() + }, + a = { + Lock: function() { + function e(e) { + var t = "string" == typeof e ? document.querySelector(e) : e; + if (!(t instanceof HTMLInputElement)) throw new ReferenceError; + if (this.el_ = t, !document.body) throw new ReferenceError; + this.lock_ = document.body + } + var t = e.prototype; + return t.setup = function() { + this.update() + }, t.update = function() { + var e = this; + this.el_.checked ? (this.offset_ = window.pageYOffset, setTimeout(function() { + window.scrollTo(0, 0), e.el_.checked && (e.lock_.dataset.mdState = "lock") + }, 400)) : (this.lock_.dataset.mdState = "", setTimeout(function() { + void 0 !== e.offset_ && window.scrollTo(0, e.offset_) + }, 100)) + }, t.reset = function() { + "lock" === this.lock_.dataset.mdState && window.scrollTo(0, this.offset_), this.lock_.dataset.mdState = "" + }, e + }(), + Result: n(9).a + }, + s = { + Position: function() { + function e(e, t) { + var n = "string" == typeof e ? document.querySelector(e) : e; + if (!(n instanceof HTMLElement && n.parentNode instanceof HTMLElement)) throw new ReferenceError; + if (this.el_ = n, this.parent_ = n.parentNode, !((n = "string" == typeof t ? document.querySelector(t) : t) instanceof HTMLElement)) throw new ReferenceError; + this.header_ = n, this.height_ = 0, this.pad_ = "fixed" === window.getComputedStyle(this.header_).position + } + var t = e.prototype; + return t.setup = function() { + var e = Array.prototype.reduce.call(this.parent_.children, function(e, t) { + return Math.max(e, t.offsetTop) + }, 0); + this.offset_ = e - (this.pad_ ? this.header_.offsetHeight : 0), this.update() + }, t.update = function(e) { + var t = window.pageYOffset, + n = window.innerHeight; + e && "resize" === e.type && this.setup(); + var r = this.pad_ ? this.header_.offsetHeight : 0, + i = this.parent_.offsetTop + this.parent_.offsetHeight, + o = n - r - Math.max(0, this.offset_ - t) - Math.max(0, t + n - i); + o !== this.height_ && (this.el_.style.height = (this.height_ = o) + "px"), t >= this.offset_ ? "lock" !== this.el_.dataset.mdState && (this.el_.dataset.mdState = "lock") : "lock" === this.el_.dataset.mdState && (this.el_.dataset.mdState = "") + }, t.reset = function() { + this.el_.dataset.mdState = "", this.el_.style.height = "", this.height_ = 0 + }, e + }() + }, + c = n(6), + l = n.n(c); + var u = { + Adapter: { + GitHub: function(o) { + var e, t; + + function n(e) { + var t; + t = o.call(this, e) || this; + var n = /^.+github\.com\/([^/]+)\/?([^/]+)?.*$/.exec(t.base_); + if (n && 3 === n.length) { + var r = n[1], + i = n[2]; + t.base_ = "https://api.github.com/users/" + r + "/repos", t.name_ = i + } + return t + } + return t = o, (e = n).prototype = Object.create(t.prototype), (e.prototype.constructor = e).__proto__ = t, n.prototype.fetch_ = function() { + var i = this; + return function n(r) { + return void 0 === r && (r = 0), fetch(i.base_ + "?per_page=30&page=" + r).then(function(e) { + return e.json() + }).then(function(e) { + if (!(e instanceof Array)) throw new TypeError; + if (i.name_) { + var t = e.find(function(e) { + return e.name === i.name_ + }); + return t || 30 !== e.length ? t ? [i.format_(t.stargazers_count) + " Stars", i.format_(t.forks_count) + " Forks"] : [] : n(r + 1) + } + return [e.length + " Repositories"] + }) + }() + }, n + }(function() { + function e(e) { + var t = "string" == typeof e ? document.querySelector(e) : e; + if (!(t instanceof HTMLAnchorElement)) throw new ReferenceError; + this.el_ = t, this.base_ = this.el_.href, this.salt_ = this.hash_(this.base_) + } + var t = e.prototype; + return t.fetch = function() { + var n = this; + return new Promise(function(t) { + var e = l.a.getJSON(n.salt_ + ".cache-source"); + void 0 !== e ? t(e) : n.fetch_().then(function(e) { + l.a.set(n.salt_ + ".cache-source", e, { + expires: 1 / 96 + }), t(e) + }) + }) + }, t.fetch_ = function() { + throw new Error("fetch_(): Not implemented") + }, t.format_ = function(e) { + return 1e4 < e ? (e / 1e3).toFixed(0) + "k" : 1e3 < e ? (e / 1e3).toFixed(1) + "k" : "" + e + }, t.hash_ = function(e) { + var t = 0; + if (0 === e.length) return t; + for (var n = 0, r = e.length; n < r; n++) t = (t << 5) - t + e.charCodeAt(n), t |= 0; + return t + }, e + }()) + }, + Repository: n(10).a + }, + f = { + Toggle: function() { + function e(e) { + var t = "string" == typeof e ? document.querySelector(e) : e; + if (!(t instanceof Node)) throw new ReferenceError; + this.el_ = t; + var n = document.querySelector("[data-md-component=header]"); + this.height_ = n.offsetHeight, this.active_ = !1 + } + var t = e.prototype; + return t.update = function() { + var e = window.pageYOffset >= this.el_.children[0].offsetTop + (5 - this.height_); + e !== this.active_ && (this.el_.dataset.mdState = (this.active_ = e) ? "hidden" : "") + }, t.reset = function() { + this.el_.dataset.mdState = "", this.active_ = !1 + }, e + }() + }; + t.a = { + Event: r, + Header: i, + Nav: o, + Search: a, + Sidebar: s, + Source: u, + Tabs: f + } +}, function(t, e, n) { + (function(e) { + t.exports = e.lunr = n(24) + }).call(this, n(4)) +}, function(e, f, d) { + "use strict"; + (function(t) { + var e = d(8), + n = setTimeout; + + function r() {} + + function o(e) { + if (!(this instanceof o)) throw new TypeError("Promises must be constructed via new"); + if ("function" != typeof e) throw new TypeError("not a function"); + this._state = 0, this._handled = !1, this._value = void 0, this._deferreds = [], u(e, this) + } + + function i(n, r) { + for (; 3 === n._state;) n = n._value; + 0 !== n._state ? (n._handled = !0, o._immediateFn(function() { + var e = 1 === n._state ? r.onFulfilled : r.onRejected; + if (null !== e) { + var t; + try { + t = e(n._value) + } catch (e) { + return void s(r.promise, e) + } + a(r.promise, t) + } else(1 === n._state ? a : s)(r.promise, n._value) + })) : n._deferreds.push(r) + } + + function a(t, e) { + try { + if (e === t) throw new TypeError("A promise cannot be resolved with itself."); + if (e && ("object" == typeof e || "function" == typeof e)) { + var n = e.then; + if (e instanceof o) return t._state = 3, t._value = e, void c(t); + if ("function" == typeof n) return void u((r = n, i = e, function() { + r.apply(i, arguments) + }), t) + } + t._state = 1, t._value = e, c(t) + } catch (e) { + s(t, e) + } + var r, i + } + + function s(e, t) { + e._state = 2, e._value = t, c(e) + } + + function c(e) { + 2 === e._state && 0 === e._deferreds.length && o._immediateFn(function() { + e._handled || o._unhandledRejectionFn(e._value) + }); + for (var t = 0, n = e._deferreds.length; t < n; t++) i(e, e._deferreds[t]); + e._deferreds = null + } + + function l(e, t, n) { + this.onFulfilled = "function" == typeof e ? e : null, this.onRejected = "function" == typeof t ? t : null, this.promise = n + } + + function u(e, t) { + var n = !1; + try { + e(function(e) { + n || (n = !0, a(t, e)) + }, function(e) { + n || (n = !0, s(t, e)) + }) + } catch (e) { + if (n) return; + n = !0, s(t, e) + } + } + o.prototype.catch = function(e) { + return this.then(null, e) + }, o.prototype.then = function(e, t) { + var n = new this.constructor(r); + return i(this, new l(e, t, n)), n + }, o.prototype.finally = e.a, o.all = function(t) { + return new o(function(r, i) { + if (!t || void 0 === t.length) throw new TypeError("Promise.all accepts an array"); + var o = Array.prototype.slice.call(t); + if (0 === o.length) return r([]); + var a = o.length; + + function s(t, e) { + try { + if (e && ("object" == typeof e || "function" == typeof e)) { + var n = e.then; + if ("function" == typeof n) return void n.call(e, function(e) { + s(t, e) + }, i) + } + o[t] = e, 0 == --a && r(o) + } catch (e) { + i(e) + } + } + for (var e = 0; e < o.length; e++) s(e, o[e]) + }) + }, o.resolve = function(t) { + return t && "object" == typeof t && t.constructor === o ? t : new o(function(e) { + e(t) + }) + }, o.reject = function(n) { + return new o(function(e, t) { + t(n) + }) + }, o.race = function(i) { + return new o(function(e, t) { + for (var n = 0, r = i.length; n < r; n++) i[n].then(e, t) + }) + }, o._immediateFn = "function" == typeof t && function(e) { + t(e) + } || function(e) { + n(e, 0) + }, o._unhandledRejectionFn = function(e) { + "undefined" != typeof console && console && console.warn("Possible Unhandled Promise Rejection:", e) + }, f.a = o + }).call(this, d(21).setImmediate) +}, function(e, t, n) { + "use strict"; + + function r(e, t) { + var n = document.createElement(e); + t && Array.prototype.forEach.call(Object.keys(t), function(e) { + n.setAttribute(e, t[e]) + }); + for (var r = arguments.length, i = new Array(2 < r ? r - 2 : 0), o = 2; o < r; o++) i[o - 2] = arguments[o]; + return function t(e) { + Array.prototype.forEach.call(e, function(e) { + "string" == typeof e || "number" == typeof e ? n.textContent += e : Array.isArray(e) ? t(e) : void 0 !== e.__html ? n.innerHTML += e.__html : e instanceof Node && n.appendChild(e) + }) + }(i), n + } + n.r(t), n.d(t, "createElement", function() { + return r + }) +}, function(e, t) { + var n; + n = function() { + return this + }(); + try { + n = n || new Function("return this")() + } catch (e) { + "object" == typeof window && (n = window) + } + e.exports = n +}, function(e, t, n) { + var r; + r = function() { + return function(n) { + var r = {}; + + function i(e) { + if (r[e]) return r[e].exports; + var t = r[e] = { + i: e, + l: !1, + exports: {} + }; + return n[e].call(t.exports, t, t.exports, i), t.l = !0, t.exports + } + return i.m = n, i.c = r, i.d = function(e, t, n) { + i.o(e, t) || Object.defineProperty(e, t, { + enumerable: !0, + get: n + }) + }, i.r = function(e) { + "undefined" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(e, Symbol.toStringTag, { + value: "Module" + }), Object.defineProperty(e, "__esModule", { + value: !0 + }) + }, i.t = function(t, e) { + if (1 & e && (t = i(t)), 8 & e) return t; + if (4 & e && "object" == typeof t && t && t.__esModule) return t; + var n = Object.create(null); + if (i.r(n), Object.defineProperty(n, "default", { + enumerable: !0, + value: t + }), 2 & e && "string" != typeof t) + for (var r in t) i.d(n, r, function(e) { + return t[e] + }.bind(null, r)); + return n + }, i.n = function(e) { + var t = e && e.__esModule ? function() { + return e.default + } : function() { + return e + }; + return i.d(t, "a", t), t + }, i.o = function(e, t) { + return Object.prototype.hasOwnProperty.call(e, t) + }, i.p = "", i(i.s = 0) + }([function(e, t, n) { + "use strict"; + var i = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(e) { + return typeof e + } : function(e) { + return e && "function" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e + }, + o = function() { + function r(e, t) { + for (var n = 0; n < t.length; n++) { + var r = t[n]; + r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(e, r.key, r) + } + } + return function(e, t, n) { + return t && r(e.prototype, t), n && r(e, n), e + } + }(), + a = r(n(1)), + s = r(n(3)), + c = r(n(4)); + + function r(e) { + return e && e.__esModule ? e : { + default: e + } + } + var l = function(e) { + function r(e, t) { + ! function(e, t) { + if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function") + }(this, r); + var n = function(e, t) { + if (!e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + return !t || "object" != typeof t && "function" != typeof t ? e : t + }(this, (r.__proto__ || Object.getPrototypeOf(r)).call(this)); + return n.resolveOptions(t), n.listenClick(e), n + } + return function(e, t) { + if ("function" != typeof t && null !== t) throw new TypeError("Super expression must either be null or a function, not " + typeof t); + e.prototype = Object.create(t && t.prototype, { + constructor: { + value: e, + enumerable: !1, + writable: !0, + configurable: !0 + } + }), t && (Object.setPrototypeOf ? Object.setPrototypeOf(e, t) : e.__proto__ = t) + }(r, s.default), o(r, [{ + key: "resolveOptions", + value: function() { + var e = 0 < arguments.length && void 0 !== arguments[0] ? arguments[0] : {}; + this.action = "function" == typeof e.action ? e.action : this.defaultAction, this.target = "function" == typeof e.target ? e.target : this.defaultTarget, this.text = "function" == typeof e.text ? e.text : this.defaultText, this.container = "object" === i(e.container) ? e.container : document.body + } + }, { + key: "listenClick", + value: function(e) { + var t = this; + this.listener = (0, c.default)(e, "click", function(e) { + return t.onClick(e) + }) + } + }, { + key: "onClick", + value: function(e) { + var t = e.delegateTarget || e.currentTarget; + this.clipboardAction && (this.clipboardAction = null), this.clipboardAction = new a.default({ + action: this.action(t), + target: this.target(t), + text: this.text(t), + container: this.container, + trigger: t, + emitter: this + }) + } + }, { + key: "defaultAction", + value: function(e) { + return u("action", e) + } + }, { + key: "defaultTarget", + value: function(e) { + var t = u("target", e); + if (t) return document.querySelector(t) + } + }, { + key: "defaultText", + value: function(e) { + return u("text", e) + } + }, { + key: "destroy", + value: function() { + this.listener.destroy(), this.clipboardAction && (this.clipboardAction.destroy(), this.clipboardAction = null) + } + }], [{ + key: "isSupported", + value: function() { + var e = 0 < arguments.length && void 0 !== arguments[0] ? arguments[0] : ["copy", "cut"], + t = "string" == typeof e ? [e] : e, + n = !!document.queryCommandSupported; + return t.forEach(function(e) { + n = n && !!document.queryCommandSupported(e) + }), n + } + }]), r + }(); + + function u(e, t) { + var n = "data-clipboard-" + e; + if (t.hasAttribute(n)) return t.getAttribute(n) + } + e.exports = l + }, function(e, t, n) { + "use strict"; + var r, i = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(e) { + return typeof e + } : function(e) { + return e && "function" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? "symbol" : typeof e + }, + o = function() { + function r(e, t) { + for (var n = 0; n < t.length; n++) { + var r = t[n]; + r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(e, r.key, r) + } + } + return function(e, t, n) { + return t && r(e.prototype, t), n && r(e, n), e + } + }(), + a = n(2), + s = (r = a) && r.__esModule ? r : { + default: r + }; + var c = function() { + function t(e) { + ! function(e, t) { + if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function") + }(this, t), this.resolveOptions(e), this.initSelection() + } + return o(t, [{ + key: "resolveOptions", + value: function() { + var e = 0 < arguments.length && void 0 !== arguments[0] ? arguments[0] : {}; + this.action = e.action, this.container = e.container, this.emitter = e.emitter, this.target = e.target, this.text = e.text, this.trigger = e.trigger, this.selectedText = "" + } + }, { + key: "initSelection", + value: function() { + this.text ? this.selectFake() : this.target && this.selectTarget() + } + }, { + key: "selectFake", + value: function() { + var e = this, + t = "rtl" == document.documentElement.getAttribute("dir"); + this.removeFake(), this.fakeHandlerCallback = function() { + return e.removeFake() + }, this.fakeHandler = this.container.addEventListener("click", this.fakeHandlerCallback) || !0, this.fakeElem = document.createElement("textarea"), this.fakeElem.style.fontSize = "12pt", this.fakeElem.style.border = "0", this.fakeElem.style.padding = "0", this.fakeElem.style.margin = "0", this.fakeElem.style.position = "absolute", this.fakeElem.style[t ? "right" : "left"] = "-9999px"; + var n = window.pageYOffset || document.documentElement.scrollTop; + this.fakeElem.style.top = n + "px", this.fakeElem.setAttribute("readonly", ""), this.fakeElem.value = this.text, this.container.appendChild(this.fakeElem), this.selectedText = (0, s.default)(this.fakeElem), this.copyText() + } + }, { + key: "removeFake", + value: function() { + this.fakeHandler && (this.container.removeEventListener("click", this.fakeHandlerCallback), this.fakeHandler = null, this.fakeHandlerCallback = null), this.fakeElem && (this.container.removeChild(this.fakeElem), this.fakeElem = null) + } + }, { + key: "selectTarget", + value: function() { + this.selectedText = (0, s.default)(this.target), this.copyText() + } + }, { + key: "copyText", + value: function() { + var t = void 0; + try { + t = document.execCommand(this.action) + } catch (e) { + t = !1 + } + this.handleResult(t) + } + }, { + key: "handleResult", + value: function(e) { + this.emitter.emit(e ? "success" : "error", { + action: this.action, + text: this.selectedText, + trigger: this.trigger, + clearSelection: this.clearSelection.bind(this) + }) + } + }, { + key: "clearSelection", + value: function() { + this.trigger && this.trigger.focus(), window.getSelection().removeAllRanges() + } + }, { + key: "destroy", + value: function() { + this.removeFake() + } + }, { + key: "action", + set: function() { + var e = 0 < arguments.length && void 0 !== arguments[0] ? arguments[0] : "copy"; + if (this._action = e, "copy" !== this._action && "cut" !== this._action) throw new Error('Invalid "action" value, use either "copy" or "cut"') + }, + get: function() { + return this._action + } + }, { + key: "target", + set: function(e) { + if (void 0 !== e) { + if (!e || "object" !== (void 0 === e ? "undefined" : i(e)) || 1 !== e.nodeType) throw new Error('Invalid "target" value, use a valid Element'); + if ("copy" === this.action && e.hasAttribute("disabled")) throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute'); + if ("cut" === this.action && (e.hasAttribute("readonly") || e.hasAttribute("disabled"))) throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes'); + this._target = e + } + }, + get: function() { + return this._target + } + }]), t + }(); + e.exports = c + }, function(e, t) { + e.exports = function(e) { + var t; + if ("SELECT" === e.nodeName) e.focus(), t = e.value; + else if ("INPUT" === e.nodeName || "TEXTAREA" === e.nodeName) { + var n = e.hasAttribute("readonly"); + n || e.setAttribute("readonly", ""), e.select(), e.setSelectionRange(0, e.value.length), n || e.removeAttribute("readonly"), t = e.value + } else { + e.hasAttribute("contenteditable") && e.focus(); + var r = window.getSelection(), + i = document.createRange(); + i.selectNodeContents(e), r.removeAllRanges(), r.addRange(i), t = r.toString() + } + return t + } + }, function(e, t) { + function n() {} + n.prototype = { + on: function(e, t, n) { + var r = this.e || (this.e = {}); + return (r[e] || (r[e] = [])).push({ + fn: t, + ctx: n + }), this + }, + once: function(e, t, n) { + var r = this; + + function i() { + r.off(e, i), t.apply(n, arguments) + } + return i._ = t, this.on(e, i, n) + }, + emit: function(e) { + for (var t = [].slice.call(arguments, 1), n = ((this.e || (this.e = {}))[e] || []).slice(), r = 0, i = n.length; r < i; r++) n[r].fn.apply(n[r].ctx, t); + return this + }, + off: function(e, t) { + var n = this.e || (this.e = {}), + r = n[e], + i = []; + if (r && t) + for (var o = 0, a = r.length; o < a; o++) r[o].fn !== t && r[o].fn._ !== t && i.push(r[o]); + return i.length ? n[e] = i : delete n[e], this + } + }, e.exports = n + }, function(e, t, n) { + var d = n(5), + h = n(6); + e.exports = function(e, t, n) { + if (!e && !t && !n) throw new Error("Missing required arguments"); + if (!d.string(t)) throw new TypeError("Second argument must be a String"); + if (!d.fn(n)) throw new TypeError("Third argument must be a Function"); + if (d.node(e)) return u = t, f = n, (l = e).addEventListener(u, f), { + destroy: function() { + l.removeEventListener(u, f) + } + }; + if (d.nodeList(e)) return a = e, s = t, c = n, Array.prototype.forEach.call(a, function(e) { + e.addEventListener(s, c) + }), { + destroy: function() { + Array.prototype.forEach.call(a, function(e) { + e.removeEventListener(s, c) + }) + } + }; + if (d.string(e)) return r = e, i = t, o = n, h(document.body, r, i, o); + throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList"); + var r, i, o, a, s, c, l, u, f + } + }, function(e, n) { + n.node = function(e) { + return void 0 !== e && e instanceof HTMLElement && 1 === e.nodeType + }, n.nodeList = function(e) { + var t = Object.prototype.toString.call(e); + return void 0 !== e && ("[object NodeList]" === t || "[object HTMLCollection]" === t) && "length" in e && (0 === e.length || n.node(e[0])) + }, n.string = function(e) { + return "string" == typeof e || e instanceof String + }, n.fn = function(e) { + return "[object Function]" === Object.prototype.toString.call(e) + } + }, function(e, t, n) { + var a = n(7); + + function o(e, t, n, r, i) { + var o = function(t, n, e, r) { + return function(e) { + e.delegateTarget = a(e.target, n), e.delegateTarget && r.call(t, e) + } + }.apply(this, arguments); + return e.addEventListener(n, o, i), { + destroy: function() { + e.removeEventListener(n, o, i) + } + } + } + e.exports = function(e, t, n, r, i) { + return "function" == typeof e.addEventListener ? o.apply(null, arguments) : "function" == typeof n ? o.bind(null, document).apply(null, arguments) : ("string" == typeof e && (e = document.querySelectorAll(e)), Array.prototype.map.call(e, function(e) { + return o(e, t, n, r, i) + })) + } + }, function(e, t) { + if ("undefined" != typeof Element && !Element.prototype.matches) { + var n = Element.prototype; + n.matches = n.matchesSelector || n.mozMatchesSelector || n.msMatchesSelector || n.oMatchesSelector || n.webkitMatchesSelector + } + e.exports = function(e, t) { + for (; e && 9 !== e.nodeType;) { + if ("function" == typeof e.matches && e.matches(t)) return e; + e = e.parentNode + } + } + }]) + }, e.exports = r() +}, function(r, i, o) { + var a, s; + ! function(e) { + if (void 0 === (s = "function" == typeof(a = e) ? a.call(i, o, i, r) : a) || (r.exports = s), !0, r.exports = e(), !!0) { + var t = window.Cookies, + n = window.Cookies = e(); + n.noConflict = function() { + return window.Cookies = t, n + } + } + }(function() { + function m() { + for (var e = 0, t = {}; e < arguments.length; e++) { + var n = arguments[e]; + for (var r in n) t[r] = n[r] + } + return t + } + return function e(h) { + function p(e, t, n) { + var r; + if ("undefined" != typeof document) { + if (1 < arguments.length) { + if ("number" == typeof(n = m({ + path: "/" + }, p.defaults, n)).expires) { + var i = new Date; + i.setMilliseconds(i.getMilliseconds() + 864e5 * n.expires), n.expires = i + } + n.expires = n.expires ? n.expires.toUTCString() : ""; + try { + r = JSON.stringify(t), /^[\{\[]/.test(r) && (t = r) + } catch (e) {} + t = h.write ? h.write(t, e) : encodeURIComponent(String(t)).replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g, decodeURIComponent), e = (e = (e = encodeURIComponent(String(e))).replace(/%(23|24|26|2B|5E|60|7C)/g, decodeURIComponent)).replace(/[\(\)]/g, escape); + var o = ""; + for (var a in n) n[a] && (o += "; " + a, !0 !== n[a] && (o += "=" + n[a])); + return document.cookie = e + "=" + t + o + } + e || (r = {}); + for (var s = document.cookie ? document.cookie.split("; ") : [], c = /(%[0-9A-Z]{2})+/g, l = 0; l < s.length; l++) { + var u = s[l].split("="), + f = u.slice(1).join("="); + this.json || '"' !== f.charAt(0) || (f = f.slice(1, -1)); + try { + var d = u[0].replace(c, decodeURIComponent); + if (f = h.read ? h.read(f, d) : h(f, d) || f.replace(c, decodeURIComponent), this.json) try { + f = JSON.parse(f) + } catch (e) {} + if (e === d) { + r = f; + break + } + e || (r[d] = f) + } catch (e) {} + } + return r + } + } + return (p.set = p).get = function(e) { + return p.call(p, e) + }, p.getJSON = function() { + return p.apply({ + json: !0 + }, [].slice.call(arguments)) + }, p.defaults = {}, p.remove = function(e, t) { + p(e, "", m(t, { + expires: -1 + })) + }, p.withConverter = e, p + }(function() {}) + }) +}, function(e, t, n) { + "use strict"; + n.r(t); + var r = "function" == typeof fetch ? fetch.bind() : function(i, o) { + return o = o || {}, new Promise(function(e, t) { + var n = new XMLHttpRequest; + for (var r in n.open(o.method || "get", i, !0), o.headers) n.setRequestHeader(r, o.headers[r]); + + function s() { + var r, i = [], + o = [], + a = {}; + return n.getAllResponseHeaders().replace(/^(.*?):[^\S\n]*([\s\S]*?)$/gm, function(e, t, n) { + i.push(t = t.toLowerCase()), o.push([t, n]), r = a[t], a[t] = r ? r + "," + n : n + }), { + ok: 2 == (n.status / 100 | 0), + status: n.status, + statusText: n.statusText, + url: n.responseURL, + clone: s, + text: function() { + return Promise.resolve(n.responseText) + }, + json: function() { + return Promise.resolve(n.responseText).then(JSON.parse) + }, + blob: function() { + return Promise.resolve(new Blob([n.response])) + }, + headers: { + keys: function() { + return i + }, + entries: function() { + return o + }, + get: function(e) { + return a[e.toLowerCase()] + }, + has: function(e) { + return e.toLowerCase() in a + } + } + } + } + n.withCredentials = "include" == o.credentials, n.onload = function() { + e(s()) + }, n.onerror = t, n.send(o.body || null) + }) + }; + t.default = r +}, function(e, t, n) { + "use strict"; + t.a = function(t) { + var n = this.constructor; + return this.then(function(e) { + return n.resolve(t()).then(function() { + return e + }) + }, function(e) { + return n.resolve(t()).then(function() { + return n.reject(e) + }) + }) + } +}, function(e, n, r) { + "use strict"; + (function(f) { + r.d(n, "a", function() { + return t + }); + var e = r(1), + d = r.n(e), + h = function(e) { + var t = document.getElementsByName("lang:" + e)[0]; + if (!(t instanceof HTMLMetaElement)) throw new ReferenceError; + return t.content + }, + t = function() { + function e(e, t) { + var n = "string" == typeof e ? document.querySelector(e) : e; + if (!(n instanceof HTMLElement)) throw new ReferenceError; + this.el_ = n; + var r = Array.prototype.slice.call(this.el_.children), + i = r[0], + o = r[1]; + this.data_ = t, this.meta_ = i, this.list_ = o, this.message_ = { + placeholder: this.meta_.textContent, + none: h("search.result.none"), + one: h("search.result.one"), + other: h("search.result.other") + }; + var a = h("search.tokenizer"); + a.length && (d.a.tokenizer.separator = a), this.lang_ = h("search.language").split(",").filter(Boolean).map(function(e) { + return e.trim() + }) + } + return e.prototype.update = function(e) { + var t, a = this; + if ("focus" !== e.type || this.index_) { + if ("focus" === e.type || "keyup" === e.type) { + var n = e.target; + if (!(n instanceof HTMLInputElement)) throw new ReferenceError; + if (!this.index_ || n.value === this.value_) return; + for (; this.list_.firstChild;) this.list_.removeChild(this.list_.firstChild); + if (this.value_ = n.value, 0 === this.value_.length) return void(this.meta_.textContent = this.message_.placeholder); + var r = this.index_.query(function(t) { + a.value_.toLowerCase().split(" ").filter(Boolean).forEach(function(e) { + t.term(e, { + wildcard: d.a.Query.wildcard.TRAILING + }) + }) + }).reduce(function(e, t) { + var n = a.docs_.get(t.ref); + if (n.parent) { + var r = n.parent.location; + e.set(r, (e.get(r) || []).concat(t)) + } else { + var i = n.location; + e.set(i, e.get(i) || []) + } + return e + }, new Map), + i = (t = this.value_.trim(), t.replace(/[|\\{}()[\]^$+*?.-]/g, "\\$&")).replace(new RegExp(d.a.tokenizer.separator, "img"), "|"), + s = new RegExp("(^|" + d.a.tokenizer.separator + ")(" + i + ")", "img"), + c = function(e, t, n) { + return t + "" + n + "" + }; + this.stack_ = [], r.forEach(function(e, t) { + var n, r = a.docs_.get(t), + i = f.createElement("li", { + class: "md-search-result__item" + }, f.createElement("a", { + href: r.location, + title: r.title, + class: "md-search-result__link", + tabindex: "-1" + }, f.createElement("article", { + class: "md-search-result__article md-search-result__article--document" + }, f.createElement("h1", { + class: "md-search-result__title" + }, { + __html: r.title.replace(s, c) + }), r.text.length ? f.createElement("p", { + class: "md-search-result__teaser" + }, { + __html: r.text.replace(s, c) + }) : {}))), + o = e.map(function(t) { + return function() { + var e = a.docs_.get(t.ref); + i.appendChild(f.createElement("a", { + href: e.location, + title: e.title, + class: "md-search-result__link", + "data-md-rel": "anchor", + tabindex: "-1" + }, f.createElement("article", { + class: "md-search-result__article" + }, f.createElement("h1", { + class: "md-search-result__title" + }, { + __html: e.title.replace(s, c) + }), e.text.length ? f.createElement("p", { + class: "md-search-result__teaser" + }, { + __html: function(e, t) { + var n = t; + if (e.length > n) { + for (; + " " !== e[n] && 0 < --n;); + return e.substring(0, n) + "..." + } + return e + }(e.text.replace(s, c), 400) + }) : {}))) + } + }); + (n = a.stack_).push.apply(n, [function() { + return a.list_.appendChild(i) + }].concat(o)) + }); + var o = this.el_.parentNode; + if (!(o instanceof HTMLElement)) throw new ReferenceError; + for (; this.stack_.length && o.offsetHeight >= o.scrollHeight - 16;) this.stack_.shift()(); + var l = this.list_.querySelectorAll("[data-md-rel=anchor]"); + switch (Array.prototype.forEach.call(l, function(r) { + ["click", "keydown"].forEach(function(n) { + r.addEventListener(n, function(e) { + if ("keydown" !== n || 13 === e.keyCode) { + var t = document.querySelector("[data-md-toggle=search]"); + if (!(t instanceof HTMLInputElement)) throw new ReferenceError; + t.checked && (t.checked = !1, t.dispatchEvent(new CustomEvent("change"))), e.preventDefault(), setTimeout(function() { + document.location.href = r.href + }, 100) + } + }) + }) + }), r.size) { + case 0: + this.meta_.textContent = this.message_.none; + break; + case 1: + this.meta_.textContent = this.message_.one; + break; + default: + this.meta_.textContent = this.message_.other.replace("#", r.size) + } + } + } else { + var u = function(e) { + a.docs_ = e.reduce(function(e, t) { + var n, r, i, o = t.location.split("#"), + a = o[0], + s = o[1]; + return t.text = (n = t.text, r = document.createTextNode(n), (i = document.createElement("p")).appendChild(r), i.innerHTML), s && (t.parent = e.get(a), t.parent && !t.parent.done && (t.parent.title = t.title, t.parent.text = t.text, t.parent.done = !0)), t.text = t.text.replace(/\n/g, " ").replace(/\s+/g, " ").replace(/\s+([,.:;!?])/g, function(e, t) { + return t + }), t.parent && t.parent.title === t.title || e.set(t.location, t), e + }, new Map); + var i = a.docs_, + o = a.lang_; + a.stack_ = [], a.index_ = d()(function() { + var e, t = this, + n = { + "search.pipeline.trimmer": d.a.trimmer, + "search.pipeline.stopwords": d.a.stopWordFilter + }, + r = Object.keys(n).reduce(function(e, t) { + return h(t).match(/^false$/i) || e.push(n[t]), e + }, []); + this.pipeline.reset(), r && (e = this.pipeline).add.apply(e, r), 1 === o.length && "en" !== o[0] && d.a[o[0]] ? this.use(d.a[o[0]]) : 1 < o.length && this.use(d.a.multiLanguage.apply(d.a, o)), this.field("title", { + boost: 10 + }), this.field("text"), this.ref("location"), i.forEach(function(e) { + return t.add(e) + }) + }); + var t = a.el_.parentNode; + if (!(t instanceof HTMLElement)) throw new ReferenceError; + t.addEventListener("scroll", function() { + for (; a.stack_.length && t.scrollTop + t.offsetHeight >= t.scrollHeight - 16;) a.stack_.splice(0, 10).forEach(function(e) { + return e() + }) + }) + }; + setTimeout(function() { + return "function" == typeof a.data_ ? a.data_().then(u) : u(a.data_) + }, 250) + } + }, e + }() + }).call(this, r(3)) +}, function(e, n, r) { + "use strict"; + (function(t) { + r.d(n, "a", function() { + return e + }); + var e = function() { + function e(e) { + var t = "string" == typeof e ? document.querySelector(e) : e; + if (!(t instanceof HTMLElement)) throw new ReferenceError; + this.el_ = t + } + return e.prototype.initialize = function(e) { + e.length && this.el_.children.length && this.el_.children[this.el_.children.length - 1].appendChild(t.createElement("ul", { + class: "md-source__facts" + }, e.map(function(e) { + return t.createElement("li", { + class: "md-source__fact" + }, e) + }))), this.el_.dataset.mdState = "done" + }, e + }() + }).call(this, r(3)) +}, , , function(e, n, c) { + "use strict"; + c.r(n), + function(o) { + c.d(n, "app", function() { + return t + }); + c(14), c(15), c(16), c(17), c(18), c(19), c(20); + var r = c(2), + e = c(5), + a = c.n(e), + i = c(0); + window.Promise = window.Promise || r.a; + var s = function(e) { + var t = document.getElementsByName("lang:" + e)[0]; + if (!(t instanceof HTMLMetaElement)) throw new ReferenceError; + return t.content + }; + var t = { + initialize: function(t) { + new i.a.Event.Listener(document, "DOMContentLoaded", function() { + if (!(document.body instanceof HTMLElement)) throw new ReferenceError; + Modernizr.addTest("ios", function() { + return !!navigator.userAgent.match(/(iPad|iPhone|iPod)/g) + }); + var e = document.querySelectorAll("table:not([class])"); + if (Array.prototype.forEach.call(e, function(e) { + var t = o.createElement("div", { + class: "md-typeset__scrollwrap" + }, o.createElement("div", { + class: "md-typeset__table" + })); + e.nextSibling ? e.parentNode.insertBefore(t, e.nextSibling) : e.parentNode.appendChild(t), t.children[0].appendChild(e) + }), a.a.isSupported()) { + var t = document.querySelectorAll(".codehilite > pre, pre > code"); + Array.prototype.forEach.call(t, function(e, t) { + var n = "__code_" + t, + r = o.createElement("button", { + class: "md-clipboard", + title: s("clipboard.copy"), + "data-clipboard-target": "#" + n + " pre, #" + n + " code" + }, o.createElement("span", { + class: "md-clipboard__message" + })), + i = e.parentNode; + i.id = n, i.insertBefore(r, e) + }), new a.a(".md-clipboard").on("success", function(e) { + var t = e.trigger.querySelector(".md-clipboard__message"); + if (!(t instanceof HTMLElement)) throw new ReferenceError; + e.clearSelection(), t.dataset.mdTimer && clearTimeout(parseInt(t.dataset.mdTimer, 10)), t.classList.add("md-clipboard__message--active"), t.innerHTML = s("clipboard.copied"), t.dataset.mdTimer = setTimeout(function() { + t.classList.remove("md-clipboard__message--active"), t.dataset.mdTimer = "" + }, 2e3).toString() + }) + } + if (!Modernizr.details) { + var n = document.querySelectorAll("details > summary"); + Array.prototype.forEach.call(n, function(e) { + e.addEventListener("click", function(e) { + var t = e.target.parentNode; + t.hasAttribute("open") ? t.removeAttribute("open") : t.setAttribute("open", "") + }) + }) + } + var r = function() { + if (document.location.hash) { + var e = document.getElementById(document.location.hash.substring(1)); + if (!e) return; + for (var t = e.parentNode; t && !(t instanceof HTMLDetailsElement);) t = t.parentNode; + if (t && !t.open) { + t.open = !0; + var n = location.hash; + location.hash = " ", location.hash = n + } + } + }; + if (window.addEventListener("hashchange", r), r(), Modernizr.ios) { + var i = document.querySelectorAll("[data-md-scrollfix]"); + Array.prototype.forEach.call(i, function(t) { + t.addEventListener("touchstart", function() { + var e = t.scrollTop; + 0 === e ? t.scrollTop = 1 : e + t.offsetHeight === t.scrollHeight && (t.scrollTop = e - 1) + }) + }) + } + }).listen(), new i.a.Event.Listener(window, ["scroll", "resize", "orientationchange"], new i.a.Header.Shadow("[data-md-component=container]", "[data-md-component=header]")).listen(), new i.a.Event.Listener(window, ["scroll", "resize", "orientationchange"], new i.a.Header.Title("[data-md-component=title]", ".md-typeset h1")).listen(), document.querySelector("[data-md-component=hero]") && new i.a.Event.Listener(window, ["scroll", "resize", "orientationchange"], new i.a.Tabs.Toggle("[data-md-component=hero]")).listen(), document.querySelector("[data-md-component=tabs]") && new i.a.Event.Listener(window, ["scroll", "resize", "orientationchange"], new i.a.Tabs.Toggle("[data-md-component=tabs]")).listen(), new i.a.Event.MatchMedia("(min-width: 1220px)", new i.a.Event.Listener(window, ["scroll", "resize", "orientationchange"], new i.a.Sidebar.Position("[data-md-component=navigation]", "[data-md-component=header]"))), document.querySelector("[data-md-component=toc]") && new i.a.Event.MatchMedia("(min-width: 960px)", new i.a.Event.Listener(window, ["scroll", "resize", "orientationchange"], new i.a.Sidebar.Position("[data-md-component=toc]", "[data-md-component=header]"))), new i.a.Event.MatchMedia("(min-width: 960px)", new i.a.Event.Listener(window, "scroll", new i.a.Nav.Blur("[data-md-component=toc] .md-nav__link"))); + var e = document.querySelectorAll("[data-md-component=collapsible]"); + Array.prototype.forEach.call(e, function(e) { + new i.a.Event.MatchMedia("(min-width: 1220px)", new i.a.Event.Listener(e.previousElementSibling, "click", new i.a.Nav.Collapse(e))) + }), new i.a.Event.MatchMedia("(max-width: 1219px)", new i.a.Event.Listener("[data-md-component=navigation] [data-md-toggle]", "change", new i.a.Nav.Scrolling("[data-md-component=navigation] nav"))), document.querySelector("[data-md-component=search]") && (new i.a.Event.MatchMedia("(max-width: 959px)", new i.a.Event.Listener("[data-md-toggle=search]", "change", new i.a.Search.Lock("[data-md-toggle=search]")))), + new i.a.Event.Listener(document.body, "keydown", function(e) { + if (9 === e.keyCode) { + var t = document.querySelectorAll("[data-md-component=navigation] .md-nav__link[for]:not([tabindex])"); + Array.prototype.forEach.call(t, function(e) { + e.offsetHeight && (e.tabIndex = 0) + }) + } + }).listen(), new i.a.Event.Listener(document.body, "mousedown", function() { + var e = document.querySelectorAll("[data-md-component=navigation] .md-nav__link[tabindex]"); + Array.prototype.forEach.call(e, function(e) { + e.removeAttribute("tabIndex") + }) + }).listen(), document.body.addEventListener("click", function() { + "tabbing" === document.body.dataset.mdState && (document.body.dataset.mdState = "") + }), new i.a.Event.MatchMedia("(max-width: 959px)", new i.a.Event.Listener("[data-md-component=navigation] [href^='#']", "click", function() { + var e = document.querySelector("[data-md-toggle=drawer]"); + if (!(e instanceof HTMLInputElement)) throw new ReferenceError; + e.checked && (e.checked = !1, e.dispatchEvent(new CustomEvent("change"))) + })), + function() { + var e = document.querySelector("[data-md-source]"); + if (!e) return r.a.resolve([]); + if (!(e instanceof HTMLAnchorElement)) throw new ReferenceError; + switch (e.dataset.mdSource) { + case "github": + return new i.a.Source.Adapter.GitHub(e).fetch(); + default: + return r.a.resolve([]) + } + }().then(function(t) { + var e = document.querySelectorAll("[data-md-source]"); + Array.prototype.forEach.call(e, function(e) { + new i.a.Source.Repository(e).initialize(t) + }) + }); + var n = function() { + var e = document.querySelectorAll("details"); + Array.prototype.forEach.call(e, function(e) { + e.setAttribute("open", "") + }) + }; + new i.a.Event.MatchMedia("print", { + listen: n, + unlisten: function() {} + }), window.onbeforeprint = n + } + } + }.call(this, c(3)) +}, function(e, t, n) { + e.exports = n.p + "assets/images/icons/bitbucket.1b09e088.svg" +}, function(e, t, n) { + e.exports = n.p + "assets/images/icons/github.f0b8504a.svg" +}, function(e, t, n) { + e.exports = n.p + "assets/images/icons/gitlab.6dd19c00.svg" +}, function(e, t) { + e.exports = "/Users/squidfunk/Desktop/General/Sources/mkdocs-material/material/application.4031d38b.css" +}, function(e, t) { + e.exports = "/Users/squidfunk/Desktop/General/Sources/mkdocs-material/material/application-palette.224b79ff.css" +}, function(e, t) { + ! function() { + if ("undefined" != typeof window) try { + var e = new window.CustomEvent("test", { + cancelable: !0 + }); + if (e.preventDefault(), !0 !== e.defaultPrevented) throw new Error("Could not prevent default") + } catch (e) { + var t = function(e, t) { + var n, r; + return (t = t || {}).bubbles = !!t.bubbles, t.cancelable = !!t.cancelable, (n = document.createEvent("CustomEvent")).initCustomEvent(e, t.bubbles, t.cancelable, t.detail), r = n.preventDefault, n.preventDefault = function() { + r.call(this); + try { + Object.defineProperty(this, "defaultPrevented", { + get: function() { + return !0 + } + }) + } catch (e) { + this.defaultPrevented = !0 + } + }, n + }; + t.prototype = window.Event.prototype, window.CustomEvent = t + } + }() +}, function(e, t, n) { + window.fetch || (window.fetch = n(7).default || n(7)) +}, function(e, i, o) { + (function(e) { + var t = void 0 !== e && e || "undefined" != typeof self && self || window, + n = Function.prototype.apply; + + function r(e, t) { + this._id = e, this._clearFn = t + } + i.setTimeout = function() { + return new r(n.call(setTimeout, t, arguments), clearTimeout) + }, i.setInterval = function() { + return new r(n.call(setInterval, t, arguments), clearInterval) + }, i.clearTimeout = i.clearInterval = function(e) { + e && e.close() + }, r.prototype.unref = r.prototype.ref = function() {}, r.prototype.close = function() { + this._clearFn.call(t, this._id) + }, i.enroll = function(e, t) { + clearTimeout(e._idleTimeoutId), e._idleTimeout = t + }, i.unenroll = function(e) { + clearTimeout(e._idleTimeoutId), e._idleTimeout = -1 + }, i._unrefActive = i.active = function(e) { + clearTimeout(e._idleTimeoutId); + var t = e._idleTimeout; + 0 <= t && (e._idleTimeoutId = setTimeout(function() { + e._onTimeout && e._onTimeout() + }, t)) + }, o(22), i.setImmediate = "undefined" != typeof self && self.setImmediate || void 0 !== e && e.setImmediate || this && this.setImmediate, i.clearImmediate = "undefined" != typeof self && self.clearImmediate || void 0 !== e && e.clearImmediate || this && this.clearImmediate + }).call(this, o(4)) +}, function(e, t, n) { + (function(e, p) { + ! function(n, r) { + "use strict"; + if (!n.setImmediate) { + var i, o, t, a, e, s = 1, + c = {}, + l = !1, + u = n.document, + f = Object.getPrototypeOf && Object.getPrototypeOf(n); + f = f && f.setTimeout ? f : n, i = "[object process]" === {}.toString.call(n.process) ? function(e) { + p.nextTick(function() { + h(e) + }) + } : function() { + if (n.postMessage && !n.importScripts) { + var e = !0, + t = n.onmessage; + return n.onmessage = function() { + e = !1 + }, n.postMessage("", "*"), n.onmessage = t, e + } + }() ? (a = "setImmediate$" + Math.random() + "$", e = function(e) { + e.source === n && "string" == typeof e.data && 0 === e.data.indexOf(a) && h(+e.data.slice(a.length)) + }, n.addEventListener ? n.addEventListener("message", e, !1) : n.attachEvent("onmessage", e), function(e) { + n.postMessage(a + e, "*") + }) : n.MessageChannel ? ((t = new MessageChannel).port1.onmessage = function(e) { + h(e.data) + }, function(e) { + t.port2.postMessage(e) + }) : u && "onreadystatechange" in u.createElement("script") ? (o = u.documentElement, function(e) { + var t = u.createElement("script"); + t.onreadystatechange = function() { + h(e), t.onreadystatechange = null, o.removeChild(t), t = null + }, o.appendChild(t) + }) : function(e) { + setTimeout(h, 0, e) + }, f.setImmediate = function(e) { + "function" != typeof e && (e = new Function("" + e)); + for (var t = new Array(arguments.length - 1), n = 0; n < t.length; n++) t[n] = arguments[n + 1]; + var r = { + callback: e, + args: t + }; + return c[s] = r, i(s), s++ + }, f.clearImmediate = d + } + + function d(e) { + delete c[e] + } + + function h(e) { + if (l) setTimeout(h, 0, e); + else { + var t = c[e]; + if (t) { + l = !0; + try { + ! function(e) { + var t = e.callback, + n = e.args; + switch (n.length) { + case 0: + t(); + break; + case 1: + t(n[0]); + break; + case 2: + t(n[0], n[1]); + break; + case 3: + t(n[0], n[1], n[2]); + break; + default: + t.apply(r, n) + } + }(t) + } finally { + d(e), l = !1 + } + } + } + } + }("undefined" == typeof self ? void 0 === e ? this : e : self) + }).call(this, n(4), n(23)) +}, function(e, t) { + var n, r, i = e.exports = {}; + + function o() { + throw new Error("setTimeout has not been defined") + } + + function a() { + throw new Error("clearTimeout has not been defined") + } + + function s(t) { + if (n === setTimeout) return setTimeout(t, 0); + if ((n === o || !n) && setTimeout) return n = setTimeout, setTimeout(t, 0); + try { + return n(t, 0) + } catch (e) { + try { + return n.call(null, t, 0) + } catch (e) { + return n.call(this, t, 0) + } + } + }! function() { + try { + n = "function" == typeof setTimeout ? setTimeout : o + } catch (e) { + n = o + } + try { + r = "function" == typeof clearTimeout ? clearTimeout : a + } catch (e) { + r = a + } + }(); + var c, l = [], + u = !1, + f = -1; + + function d() { + u && c && (u = !1, c.length ? l = c.concat(l) : f = -1, l.length && h()) + } + + function h() { + if (!u) { + var e = s(d); + u = !0; + for (var t = l.length; t;) { + for (c = l, l = []; ++f < t;) c && c[f].run(); + f = -1, t = l.length + } + c = null, u = !1, + function(t) { + if (r === clearTimeout) return clearTimeout(t); + if ((r === a || !r) && clearTimeout) return r = clearTimeout, clearTimeout(t); + try { + r(t) + } catch (e) { + try { + return r.call(null, t) + } catch (e) { + return r.call(this, t) + } + } + }(e) + } + } + + function p(e, t) { + this.fun = e, this.array = t + } + + function m() {} + i.nextTick = function(e) { + var t = new Array(arguments.length - 1); + if (1 < arguments.length) + for (var n = 1; n < arguments.length; n++) t[n - 1] = arguments[n]; + l.push(new p(e, t)), 1 !== l.length || u || s(h) + }, p.prototype.run = function() { + this.fun.apply(null, this.array) + }, i.title = "browser", i.browser = !0, i.env = {}, i.argv = [], i.version = "", i.versions = {}, i.on = m, i.addListener = m, i.once = m, i.off = m, i.removeListener = m, i.removeAllListeners = m, i.emit = m, i.prependListener = m, i.prependOnceListener = m, i.listeners = function(e) { + return [] + }, i.binding = function(e) { + throw new Error("process.binding is not supported") + }, i.cwd = function() { + return "/" + }, i.chdir = function(e) { + throw new Error("process.chdir is not supported") + }, i.umask = function() { + return 0 + } +}, function(i, o, a) { + var s, c; + /** + * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 2.3.6 + * Copyright (C) 2019 Oliver Nightingale + * @license MIT + */ + ! function() { + var t, l, u, e, n, f, d, h, p, m, y, v, g, w, _, E, x, b, k, S, T, L, R, O, C, r, D = function(e) { + var t = new D.Builder; + return t.pipeline.add(D.trimmer, D.stopWordFilter, D.stemmer), t.searchPipeline.add(D.stemmer), e.call(t, t), t.build() + }; + D.version = "2.3.6", D.utils = {}, D.utils.warn = (t = this, function(e) { + t.console && console.warn && console.warn(e) + }), D.utils.asString = function(e) { + return null == e ? "" : e.toString() + }, D.utils.clone = function(e) { + if (null == e) return e; + for (var t = Object.create(null), n = Object.keys(e), r = 0; r < n.length; r++) { + var i = n[r], + o = e[i]; + if (Array.isArray(o)) t[i] = o.slice(); + else { + if ("string" != typeof o && "number" != typeof o && "boolean" != typeof o) throw new TypeError("clone is not deep and does not support nested objects"); + t[i] = o + } + } + return t + }, D.FieldRef = function(e, t, n) { + this.docRef = e, this.fieldName = t, this._stringValue = n + }, D.FieldRef.joiner = "/", D.FieldRef.fromString = function(e) { + var t = e.indexOf(D.FieldRef.joiner); + if (-1 === t) throw "malformed field ref string"; + var n = e.slice(0, t), + r = e.slice(t + 1); + return new D.FieldRef(r, n, e) + }, D.FieldRef.prototype.toString = function() { + return null == this._stringValue && (this._stringValue = this.fieldName + D.FieldRef.joiner + this.docRef), this._stringValue + }, D.Set = function(e) { + if (this.elements = Object.create(null), e) { + this.length = e.length; + for (var t = 0; t < this.length; t++) this.elements[e[t]] = !0 + } else this.length = 0 + }, D.Set.complete = { + intersect: function(e) { + return e + }, + union: function(e) { + return e + }, + contains: function() { + return !0 + } + }, D.Set.empty = { + intersect: function() { + return this + }, + union: function(e) { + return e + }, + contains: function() { + return !1 + } + }, D.Set.prototype.contains = function(e) { + return !!this.elements[e] + }, D.Set.prototype.intersect = function(e) { + var t, n, r, i = []; + if (e === D.Set.complete) return this; + if (e === D.Set.empty) return e; + n = this.length < e.length ? (t = this, e) : (t = e, this), r = Object.keys(t.elements); + for (var o = 0; o < r.length; o++) { + var a = r[o]; + a in n.elements && i.push(a) + } + return new D.Set(i) + }, D.Set.prototype.union = function(e) { + return e === D.Set.complete ? D.Set.complete : e === D.Set.empty ? this : new D.Set(Object.keys(this.elements).concat(Object.keys(e.elements))) + }, D.idf = function(e, t) { + var n = 0; + for (var r in e) "_index" != r && (n += Object.keys(e[r]).length); + var i = (t - n + .5) / (n + .5); + return Math.log(1 + Math.abs(i)) + }, D.Token = function(e, t) { + this.str = e || "", this.metadata = t || {} + }, D.Token.prototype.toString = function() { + return this.str + }, D.Token.prototype.update = function(e) { + return this.str = e(this.str, this.metadata), this + }, D.Token.prototype.clone = function(e) { + return e = e || function(e) { + return e + }, new D.Token(e(this.str, this.metadata), this.metadata) + }, D.tokenizer = function(e, t) { + if (null == e || null == e) return []; + if (Array.isArray(e)) return e.map(function(e) { + return new D.Token(D.utils.asString(e).toLowerCase(), D.utils.clone(t)) + }); + for (var n = e.toString().trim().toLowerCase(), r = n.length, i = [], o = 0, a = 0; o <= r; o++) { + var s = o - a; + if (n.charAt(o).match(D.tokenizer.separator) || o == r) { + if (0 < s) { + var c = D.utils.clone(t) || {}; + c.position = [a, s], c.index = i.length, i.push(new D.Token(n.slice(a, o), c)) + } + a = o + 1 + } + } + return i + }, D.tokenizer.separator = /[\s\-]+/, D.Pipeline = function() { + this._stack = [] + }, D.Pipeline.registeredFunctions = Object.create(null), D.Pipeline.registerFunction = function(e, t) { + t in this.registeredFunctions && D.utils.warn("Overwriting existing registered function: " + t), e.label = t, D.Pipeline.registeredFunctions[e.label] = e + }, D.Pipeline.warnIfFunctionNotRegistered = function(e) { + e.label && e.label in this.registeredFunctions || D.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n", e) + }, D.Pipeline.load = function(e) { + var n = new D.Pipeline; + return e.forEach(function(e) { + var t = D.Pipeline.registeredFunctions[e]; + if (!t) throw new Error("Cannot load unregistered function: " + e); + n.add(t) + }), n + }, D.Pipeline.prototype.add = function() { + Array.prototype.slice.call(arguments).forEach(function(e) { + D.Pipeline.warnIfFunctionNotRegistered(e), this._stack.push(e) + }, this) + }, D.Pipeline.prototype.after = function(e, t) { + D.Pipeline.warnIfFunctionNotRegistered(t); + var n = this._stack.indexOf(e); + if (-1 == n) throw new Error("Cannot find existingFn"); + n += 1, this._stack.splice(n, 0, t) + }, D.Pipeline.prototype.before = function(e, t) { + D.Pipeline.warnIfFunctionNotRegistered(t); + var n = this._stack.indexOf(e); + if (-1 == n) throw new Error("Cannot find existingFn"); + this._stack.splice(n, 0, t) + }, D.Pipeline.prototype.remove = function(e) { + var t = this._stack.indexOf(e); - 1 != t && this._stack.splice(t, 1) + }, D.Pipeline.prototype.run = function(e) { + for (var t = this._stack.length, n = 0; n < t; n++) { + for (var r = this._stack[n], i = [], o = 0; o < e.length; o++) { + var a = r(e[o], o, e); + if (void 0 !== a && "" !== a) + if (Array.isArray(a)) + for (var s = 0; s < a.length; s++) i.push(a[s]); + else i.push(a) + } + e = i + } + return e + }, D.Pipeline.prototype.runString = function(e, t) { + var n = new D.Token(e, t); + return this.run([n]).map(function(e) { + return e.toString() + }) + }, D.Pipeline.prototype.reset = function() { + this._stack = [] + }, D.Pipeline.prototype.toJSON = function() { + return this._stack.map(function(e) { + return D.Pipeline.warnIfFunctionNotRegistered(e), e.label + }) + }, D.Vector = function(e) { + this._magnitude = 0, this.elements = e || [] + }, D.Vector.prototype.positionForIndex = function(e) { + if (0 == this.elements.length) return 0; + for (var t = 0, n = this.elements.length / 2, r = n - t, i = Math.floor(r / 2), o = this.elements[2 * i]; 1 < r && (o < e && (t = i), e < o && (n = i), o != e);) r = n - t, i = t + Math.floor(r / 2), o = this.elements[2 * i]; + return o == e ? 2 * i : e < o ? 2 * i : o < e ? 2 * (i + 1) : void 0 + }, D.Vector.prototype.insert = function(e, t) { + this.upsert(e, t, function() { + throw "duplicate index" + }) + }, D.Vector.prototype.upsert = function(e, t, n) { + this._magnitude = 0; + var r = this.positionForIndex(e); + this.elements[r] == e ? this.elements[r + 1] = n(this.elements[r + 1], t) : this.elements.splice(r, 0, e, t) + }, D.Vector.prototype.magnitude = function() { + if (this._magnitude) return this._magnitude; + for (var e = 0, t = this.elements.length, n = 1; n < t; n += 2) { + var r = this.elements[n]; + e += r * r + } + return this._magnitude = Math.sqrt(e) + }, D.Vector.prototype.dot = function(e) { + for (var t = 0, n = this.elements, r = e.elements, i = n.length, o = r.length, a = 0, s = 0, c = 0, l = 0; c < i && l < o;)(a = n[c]) < (s = r[l]) ? c += 2 : s < a ? l += 2 : a == s && (t += n[c + 1] * r[l + 1], c += 2, l += 2); + return t + }, D.Vector.prototype.similarity = function(e) { + return this.dot(e) / this.magnitude() || 0 + }, D.Vector.prototype.toArray = function() { + for (var e = new Array(this.elements.length / 2), t = 1, n = 0; t < this.elements.length; t += 2, n++) e[n] = this.elements[t]; + return e + }, D.Vector.prototype.toJSON = function() { + return this.elements + }, D.stemmer = (l = { + ational: "ate", + tional: "tion", + enci: "ence", + anci: "ance", + izer: "ize", + bli: "ble", + alli: "al", + entli: "ent", + eli: "e", + ousli: "ous", + ization: "ize", + ation: "ate", + ator: "ate", + alism: "al", + iveness: "ive", + fulness: "ful", + ousness: "ous", + aliti: "al", + iviti: "ive", + biliti: "ble", + logi: "log" + }, u = { + icate: "ic", + ative: "", + alize: "al", + iciti: "ic", + ical: "ic", + ful: "", + ness: "" + }, e = "[aeiouy]", n = "[^aeiou][^aeiouy]*", f = new RegExp("^([^aeiou][^aeiouy]*)?[aeiouy][aeiou]*[^aeiou][^aeiouy]*"), d = new RegExp("^([^aeiou][^aeiouy]*)?[aeiouy][aeiou]*[^aeiou][^aeiouy]*[aeiouy][aeiou]*[^aeiou][^aeiouy]*"), h = new RegExp("^([^aeiou][^aeiouy]*)?[aeiouy][aeiou]*[^aeiou][^aeiouy]*([aeiouy][aeiou]*)?$"), p = new RegExp("^([^aeiou][^aeiouy]*)?[aeiouy]"), m = /^(.+?)(ss|i)es$/, y = /^(.+?)([^s])s$/, v = /^(.+?)eed$/, g = /^(.+?)(ed|ing)$/, w = /.$/, _ = /(at|bl|iz)$/, E = new RegExp("([^aeiouylsz])\\1$"), x = new RegExp("^" + n + e + "[^aeiouwxy]$"), b = /^(.+?[^aeiou])y$/, k = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/, S = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/, T = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/, L = /^(.+?)(s|t)(ion)$/, R = /^(.+?)e$/, O = /ll$/, C = new RegExp("^" + n + e + "[^aeiouwxy]$"), r = function(e) { + var t, n, r, i, o, a, s; + if (e.length < 3) return e; + if ("y" == (r = e.substr(0, 1)) && (e = r.toUpperCase() + e.substr(1)), o = y, (i = m).test(e) ? e = e.replace(i, "$1$2") : o.test(e) && (e = e.replace(o, "$1$2")), o = g, (i = v).test(e)) { + var c = i.exec(e); + (i = f).test(c[1]) && (i = w, e = e.replace(i, "")) + } else if (o.test(e)) { + t = (c = o.exec(e))[1], (o = p).test(t) && (a = E, s = x, (o = _).test(e = t) ? e += "e" : a.test(e) ? (i = w, e = e.replace(i, "")) : s.test(e) && (e += "e")) + }(i = b).test(e) && (e = (t = (c = i.exec(e))[1]) + "i"); + (i = k).test(e) && (t = (c = i.exec(e))[1], n = c[2], (i = f).test(t) && (e = t + l[n])); + (i = S).test(e) && (t = (c = i.exec(e))[1], n = c[2], (i = f).test(t) && (e = t + u[n])); + if (o = L, (i = T).test(e)) t = (c = i.exec(e))[1], (i = d).test(t) && (e = t); + else if (o.test(e)) { + t = (c = o.exec(e))[1] + c[2], (o = d).test(t) && (e = t) + }(i = R).test(e) && (t = (c = i.exec(e))[1], o = h, a = C, ((i = d).test(t) || o.test(t) && !a.test(t)) && (e = t)); + return o = d, (i = O).test(e) && o.test(e) && (i = w, e = e.replace(i, "")), "y" == r && (e = r.toLowerCase() + e.substr(1)), e + }, function(e) { + return e.update(r) + }), D.Pipeline.registerFunction(D.stemmer, "stemmer"), D.generateStopWordFilter = function(e) { + var t = e.reduce(function(e, t) { + return e[t] = t, e + }, {}); + return function(e) { + if (e && t[e.toString()] !== e.toString()) return e + } + }, D.stopWordFilter = D.generateStopWordFilter(["a", "able", "about", "across", "after", "all", "almost", "also", "am", "among", "an", "and", "any", "are", "as", "at", "be", "because", "been", "but", "by", "can", "cannot", "could", "dear", "did", "do", "does", "either", "else", "ever", "every", "for", "from", "get", "got", "had", "has", "have", "he", "her", "hers", "him", "his", "how", "however", "i", "if", "in", "into", "is", "it", "its", "just", "least", "let", "like", "likely", "may", "me", "might", "most", "must", "my", "neither", "no", "nor", "not", "of", "off", "often", "on", "only", "or", "other", "our", "own", "rather", "said", "say", "says", "she", "should", "since", "so", "some", "than", "that", "the", "their", "them", "then", "there", "these", "they", "this", "tis", "to", "too", "twas", "us", "wants", "was", "we", "were", "what", "when", "where", "which", "while", "who", "whom", "why", "will", "with", "would", "yet", "you", "your"]), D.Pipeline.registerFunction(D.stopWordFilter, "stopWordFilter"), D.trimmer = function(e) { + return e.update(function(e) { + return e.replace(/^\W+/, "").replace(/\W+$/, "") + }) + }, D.Pipeline.registerFunction(D.trimmer, "trimmer"), D.TokenSet = function() { + this.final = !1, this.edges = {}, this.id = D.TokenSet._nextId, D.TokenSet._nextId += 1 + }, D.TokenSet._nextId = 1, D.TokenSet.fromArray = function(e) { + for (var t = new D.TokenSet.Builder, n = 0, r = e.length; n < r; n++) t.insert(e[n]); + return t.finish(), t.root + }, D.TokenSet.fromClause = function(e) { + return "editDistance" in e ? D.TokenSet.fromFuzzyString(e.term, e.editDistance) : D.TokenSet.fromString(e.term) + }, D.TokenSet.fromFuzzyString = function(e, t) { + for (var n = new D.TokenSet, r = [{ + node: n, + editsRemaining: t, + str: e + }]; r.length;) { + var i = r.pop(); + if (0 < i.str.length) { + var o, a = i.str.charAt(0); + a in i.node.edges ? o = i.node.edges[a] : (o = new D.TokenSet, i.node.edges[a] = o), 1 == i.str.length && (o.final = !0), r.push({ + node: o, + editsRemaining: i.editsRemaining, + str: i.str.slice(1) + }) + } + if (0 != i.editsRemaining) { + if ("*" in i.node.edges) var s = i.node.edges["*"]; + else { + s = new D.TokenSet; + i.node.edges["*"] = s + } + if (0 == i.str.length && (s.final = !0), r.push({ + node: s, + editsRemaining: i.editsRemaining - 1, + str: i.str + }), 1 < i.str.length && r.push({ + node: i.node, + editsRemaining: i.editsRemaining - 1, + str: i.str.slice(1) + }), 1 == i.str.length && (i.node.final = !0), 1 <= i.str.length) { + if ("*" in i.node.edges) var c = i.node.edges["*"]; + else { + c = new D.TokenSet; + i.node.edges["*"] = c + } + 1 == i.str.length && (c.final = !0), r.push({ + node: c, + editsRemaining: i.editsRemaining - 1, + str: i.str.slice(1) + }) + } + if (1 < i.str.length) { + var l, u = i.str.charAt(0), + f = i.str.charAt(1); + f in i.node.edges ? l = i.node.edges[f] : (l = new D.TokenSet, i.node.edges[f] = l), 1 == i.str.length && (l.final = !0), r.push({ + node: l, + editsRemaining: i.editsRemaining - 1, + str: u + i.str.slice(2) + }) + } + } + } + return n + }, D.TokenSet.fromString = function(e) { + for (var t = new D.TokenSet, n = t, r = 0, i = e.length; r < i; r++) { + var o = e[r], + a = r == i - 1; + if ("*" == o)(t.edges[o] = t).final = a; + else { + var s = new D.TokenSet; + s.final = a, t.edges[o] = s, t = s + } + } + return n + }, D.TokenSet.prototype.toArray = function() { + for (var e = [], t = [{ + prefix: "", + node: this + }]; t.length;) { + var n = t.pop(), + r = Object.keys(n.node.edges), + i = r.length; + n.node.final && (n.prefix.charAt(0), e.push(n.prefix)); + for (var o = 0; o < i; o++) { + var a = r[o]; + t.push({ + prefix: n.prefix.concat(a), + node: n.node.edges[a] + }) + } + } + return e + }, D.TokenSet.prototype.toString = function() { + if (this._str) return this._str; + for (var e = this.final ? "1" : "0", t = Object.keys(this.edges).sort(), n = t.length, r = 0; r < n; r++) { + var i = t[r]; + e = e + i + this.edges[i].id + } + return e + }, D.TokenSet.prototype.intersect = function(e) { + for (var t = new D.TokenSet, n = void 0, r = [{ + qNode: e, + output: t, + node: this + }]; r.length;) { + n = r.pop(); + for (var i = Object.keys(n.qNode.edges), o = i.length, a = Object.keys(n.node.edges), s = a.length, c = 0; c < o; c++) + for (var l = i[c], u = 0; u < s; u++) { + var f = a[u]; + if (f == l || "*" == l) { + var d = n.node.edges[f], + h = n.qNode.edges[l], + p = d.final && h.final, + m = void 0; + f in n.output.edges ? (m = n.output.edges[f]).final = m.final || p : ((m = new D.TokenSet).final = p, n.output.edges[f] = m), r.push({ + qNode: h, + output: m, + node: d + }) + } + } + } + return t + }, D.TokenSet.Builder = function() { + this.previousWord = "", this.root = new D.TokenSet, this.uncheckedNodes = [], this.minimizedNodes = {} + }, D.TokenSet.Builder.prototype.insert = function(e) { + var t, n = 0; + if (e < this.previousWord) throw new Error("Out of order word insertion"); + for (var r = 0; r < e.length && r < this.previousWord.length && e[r] == this.previousWord[r]; r++) n++; + this.minimize(n), t = 0 == this.uncheckedNodes.length ? this.root : this.uncheckedNodes[this.uncheckedNodes.length - 1].child; + for (r = n; r < e.length; r++) { + var i = new D.TokenSet, + o = e[r]; + t.edges[o] = i, this.uncheckedNodes.push({ + parent: t, + char: o, + child: i + }), t = i + } + t.final = !0, this.previousWord = e + }, D.TokenSet.Builder.prototype.finish = function() { + this.minimize(0) + }, D.TokenSet.Builder.prototype.minimize = function(e) { + for (var t = this.uncheckedNodes.length - 1; e <= t; t--) { + var n = this.uncheckedNodes[t], + r = n.child.toString(); + r in this.minimizedNodes ? n.parent.edges[n.char] = this.minimizedNodes[r] : (n.child._str = r, this.minimizedNodes[r] = n.child), this.uncheckedNodes.pop() + } + }, D.Index = function(e) { + this.invertedIndex = e.invertedIndex, this.fieldVectors = e.fieldVectors, this.tokenSet = e.tokenSet, this.fields = e.fields, this.pipeline = e.pipeline + }, D.Index.prototype.search = function(t) { + return this.query(function(e) { + new D.QueryParser(t, e).parse() + }) + }, D.Index.prototype.query = function(e) { + for (var t = new D.Query(this.fields), n = Object.create(null), r = Object.create(null), i = Object.create(null), o = Object.create(null), a = Object.create(null), s = 0; s < this.fields.length; s++) r[this.fields[s]] = new D.Vector; + e.call(t, t); + for (s = 0; s < t.clauses.length; s++) { + var c = t.clauses[s], + l = null, + u = D.Set.complete; + l = c.usePipeline ? this.pipeline.runString(c.term, { + fields: c.fields + }) : [c.term]; + for (var f = 0; f < l.length; f++) { + var d = l[f]; + c.term = d; + var h = D.TokenSet.fromClause(c), + p = this.tokenSet.intersect(h).toArray(); + if (0 === p.length && c.presence === D.Query.presence.REQUIRED) { + for (var m = 0; m < c.fields.length; m++) { + o[Q = c.fields[m]] = D.Set.empty + } + break + } + for (var y = 0; y < p.length; y++) { + var v = p[y], + g = this.invertedIndex[v], + w = g._index; + for (m = 0; m < c.fields.length; m++) { + var _ = g[Q = c.fields[m]], + E = Object.keys(_), + x = v + "/" + Q, + b = new D.Set(E); + if (c.presence == D.Query.presence.REQUIRED && (u = u.union(b), void 0 === o[Q] && (o[Q] = D.Set.complete)), c.presence != D.Query.presence.PROHIBITED) { + if (r[Q].upsert(w, c.boost, function(e, t) { + return e + t + }), !i[x]) { + for (var k = 0; k < E.length; k++) { + var S, T = E[k], + L = new D.FieldRef(T, Q), + R = _[T]; + void 0 === (S = n[L]) ? n[L] = new D.MatchData(v, Q, R) : S.add(v, Q, R) + } + i[x] = !0 + } + } else void 0 === a[Q] && (a[Q] = D.Set.empty), a[Q] = a[Q].union(b) + } + } + } + if (c.presence === D.Query.presence.REQUIRED) + for (m = 0; m < c.fields.length; m++) { + o[Q = c.fields[m]] = o[Q].intersect(u) + } + } + var O = D.Set.complete, + C = D.Set.empty; + for (s = 0; s < this.fields.length; s++) { + var Q; + o[Q = this.fields[s]] && (O = O.intersect(o[Q])), a[Q] && (C = C.union(a[Q])) + } + var P = Object.keys(n), + A = [], + I = Object.create(null); + if (t.isNegated()) { + P = Object.keys(this.fieldVectors); + for (s = 0; s < P.length; s++) { + L = P[s]; + var M = D.FieldRef.fromString(L); + n[L] = new D.MatchData + } + } + for (s = 0; s < P.length; s++) { + var N = (M = D.FieldRef.fromString(P[s])).docRef; + if (O.contains(N) && !C.contains(N)) { + var j, F = this.fieldVectors[M], + H = r[M.fieldName].similarity(F); + if (void 0 !== (j = I[N])) j.score += H, j.matchData.combine(n[M]); + else { + var q = { + ref: N, + score: H, + matchData: n[M] + }; + I[N] = q, A.push(q) + } + } + } + return A.sort(function(e, t) { + return t.score - e.score + }) + }, D.Index.prototype.toJSON = function() { + var e = Object.keys(this.invertedIndex).sort().map(function(e) { + return [e, this.invertedIndex[e]] + }, this), + t = Object.keys(this.fieldVectors).map(function(e) { + return [e, this.fieldVectors[e].toJSON()] + }, this); + return { + version: D.version, + fields: this.fields, + fieldVectors: t, + invertedIndex: e, + pipeline: this.pipeline.toJSON() + } + }, D.Index.load = function(e) { + var t = {}, + n = {}, + r = e.fieldVectors, + i = Object.create(null), + o = e.invertedIndex, + a = new D.TokenSet.Builder, + s = D.Pipeline.load(e.pipeline); + e.version != D.version && D.utils.warn("Version mismatch when loading serialised index. Current version of lunr '" + D.version + "' does not match serialized index '" + e.version + "'"); + for (var c = 0; c < r.length; c++) { + var l = (f = r[c])[0], + u = f[1]; + n[l] = new D.Vector(u) + } + for (c = 0; c < o.length; c++) { + var f, d = (f = o[c])[0], + h = f[1]; + a.insert(d), i[d] = h + } + return a.finish(), t.fields = e.fields, t.fieldVectors = n, t.invertedIndex = i, t.tokenSet = a.root, t.pipeline = s, new D.Index(t) + }, D.Builder = function() { + this._ref = "id", this._fields = Object.create(null), this._documents = Object.create(null), this.invertedIndex = Object.create(null), this.fieldTermFrequencies = {}, this.fieldLengths = {}, this.tokenizer = D.tokenizer, this.pipeline = new D.Pipeline, this.searchPipeline = new D.Pipeline, this.documentCount = 0, this._b = .75, this._k1 = 1.2, this.termIndex = 0, this.metadataWhitelist = [] + }, D.Builder.prototype.ref = function(e) { + this._ref = e + }, D.Builder.prototype.field = function(e, t) { + if (/\//.test(e)) throw new RangeError("Field '" + e + "' contains illegal character '/'"); + this._fields[e] = t || {} + }, D.Builder.prototype.b = function(e) { + this._b = e < 0 ? 0 : 1 < e ? 1 : e + }, D.Builder.prototype.k1 = function(e) { + this._k1 = e + }, D.Builder.prototype.add = function(e, t) { + var n = e[this._ref], + r = Object.keys(this._fields); + this._documents[n] = t || {}, this.documentCount += 1; + for (var i = 0; i < r.length; i++) { + var o = r[i], + a = this._fields[o].extractor, + s = a ? a(e) : e[o], + c = this.tokenizer(s, { + fields: [o] + }), + l = this.pipeline.run(c), + u = new D.FieldRef(n, o), + f = Object.create(null); + this.fieldTermFrequencies[u] = f, this.fieldLengths[u] = 0, this.fieldLengths[u] += l.length; + for (var d = 0; d < l.length; d++) { + var h = l[d]; + if (null == f[h] && (f[h] = 0), f[h] += 1, null == this.invertedIndex[h]) { + var p = Object.create(null); + p._index = this.termIndex, this.termIndex += 1; + for (var m = 0; m < r.length; m++) p[r[m]] = Object.create(null); + this.invertedIndex[h] = p + } + null == this.invertedIndex[h][o][n] && (this.invertedIndex[h][o][n] = Object.create(null)); + for (var y = 0; y < this.metadataWhitelist.length; y++) { + var v = this.metadataWhitelist[y], + g = h.metadata[v]; + null == this.invertedIndex[h][o][n][v] && (this.invertedIndex[h][o][n][v] = []), this.invertedIndex[h][o][n][v].push(g) + } + } + } + }, D.Builder.prototype.calculateAverageFieldLengths = function() { + for (var e = Object.keys(this.fieldLengths), t = e.length, n = {}, r = {}, i = 0; i < t; i++) { + var o = D.FieldRef.fromString(e[i]), + a = o.fieldName; + r[a] || (r[a] = 0), r[a] += 1, n[a] || (n[a] = 0), n[a] += this.fieldLengths[o] + } + var s = Object.keys(this._fields); + for (i = 0; i < s.length; i++) { + var c = s[i]; + n[c] = n[c] / r[c] + } + this.averageFieldLength = n + }, D.Builder.prototype.createFieldVectors = function() { + for (var e = {}, t = Object.keys(this.fieldTermFrequencies), n = t.length, r = Object.create(null), i = 0; i < n; i++) { + for (var o = D.FieldRef.fromString(t[i]), a = o.fieldName, s = this.fieldLengths[o], c = new D.Vector, l = this.fieldTermFrequencies[o], u = Object.keys(l), f = u.length, d = this._fields[a].boost || 1, h = this._documents[o.docRef].boost || 1, p = 0; p < f; p++) { + var m, y, v, g = u[p], + w = l[g], + _ = this.invertedIndex[g]._index; + void 0 === r[g] ? (m = D.idf(this.invertedIndex[g], this.documentCount), r[g] = m) : m = r[g], y = m * ((this._k1 + 1) * w) / (this._k1 * (1 - this._b + this._b * (s / this.averageFieldLength[a])) + w), y *= d, y *= h, v = Math.round(1e3 * y) / 1e3, c.insert(_, v) + } + e[o] = c + } + this.fieldVectors = e + }, D.Builder.prototype.createTokenSet = function() { + this.tokenSet = D.TokenSet.fromArray(Object.keys(this.invertedIndex).sort()) + }, D.Builder.prototype.build = function() { + return this.calculateAverageFieldLengths(), this.createFieldVectors(), this.createTokenSet(), new D.Index({ + invertedIndex: this.invertedIndex, + fieldVectors: this.fieldVectors, + tokenSet: this.tokenSet, + fields: Object.keys(this._fields), + pipeline: this.searchPipeline + }) + }, D.Builder.prototype.use = function(e) { + var t = Array.prototype.slice.call(arguments, 1); + t.unshift(this), e.apply(this, t) + }, D.MatchData = function(e, t, n) { + for (var r = Object.create(null), i = Object.keys(n || {}), o = 0; o < i.length; o++) { + var a = i[o]; + r[a] = n[a].slice() + } + this.metadata = Object.create(null), void 0 !== e && (this.metadata[e] = Object.create(null), this.metadata[e][t] = r) + }, D.MatchData.prototype.combine = function(e) { + for (var t = Object.keys(e.metadata), n = 0; n < t.length; n++) { + var r = t[n], + i = Object.keys(e.metadata[r]); + null == this.metadata[r] && (this.metadata[r] = Object.create(null)); + for (var o = 0; o < i.length; o++) { + var a = i[o], + s = Object.keys(e.metadata[r][a]); + null == this.metadata[r][a] && (this.metadata[r][a] = Object.create(null)); + for (var c = 0; c < s.length; c++) { + var l = s[c]; + null == this.metadata[r][a][l] ? this.metadata[r][a][l] = e.metadata[r][a][l] : this.metadata[r][a][l] = this.metadata[r][a][l].concat(e.metadata[r][a][l]) + } + } + } + }, D.MatchData.prototype.add = function(e, t, n) { + if (!(e in this.metadata)) return this.metadata[e] = Object.create(null), void(this.metadata[e][t] = n); + if (t in this.metadata[e]) + for (var r = Object.keys(n), i = 0; i < r.length; i++) { + var o = r[i]; + o in this.metadata[e][t] ? this.metadata[e][t][o] = this.metadata[e][t][o].concat(n[o]) : this.metadata[e][t][o] = n[o] + } else this.metadata[e][t] = n + }, D.Query = function(e) { + this.clauses = [], this.allFields = e + }, D.Query.wildcard = new String("*"), D.Query.wildcard.NONE = 0, D.Query.wildcard.LEADING = 1, D.Query.wildcard.TRAILING = 2, D.Query.presence = { + OPTIONAL: 1, + REQUIRED: 2, + PROHIBITED: 3 + }, D.Query.prototype.clause = function(e) { + return "fields" in e || (e.fields = this.allFields), "boost" in e || (e.boost = 1), "usePipeline" in e || (e.usePipeline = !0), "wildcard" in e || (e.wildcard = D.Query.wildcard.NONE), e.wildcard & D.Query.wildcard.LEADING && e.term.charAt(0) != D.Query.wildcard && (e.term = "*" + e.term), e.wildcard & D.Query.wildcard.TRAILING && e.term.slice(-1) != D.Query.wildcard && (e.term = e.term + "*"), "presence" in e || (e.presence = D.Query.presence.OPTIONAL), this.clauses.push(e), this + }, D.Query.prototype.isNegated = function() { + for (var e = 0; e < this.clauses.length; e++) + if (this.clauses[e].presence != D.Query.presence.PROHIBITED) return !1; + return !0 + }, D.Query.prototype.term = function(e, t) { + if (Array.isArray(e)) return e.forEach(function(e) { + this.term(e, D.utils.clone(t)) + }, this), this; + var n = t || {}; + return n.term = e.toString(), this.clause(n), this + }, D.QueryParseError = function(e, t, n) { + this.name = "QueryParseError", this.message = e, this.start = t, this.end = n + }, D.QueryParseError.prototype = new Error, D.QueryLexer = function(e) { + this.lexemes = [], this.str = e, this.length = e.length, this.pos = 0, this.start = 0, this.escapeCharPositions = [] + }, D.QueryLexer.prototype.run = function() { + for (var e = D.QueryLexer.lexText; e;) e = e(this) + }, D.QueryLexer.prototype.sliceString = function() { + for (var e = [], t = this.start, n = this.pos, r = 0; r < this.escapeCharPositions.length; r++) n = this.escapeCharPositions[r], e.push(this.str.slice(t, n)), t = n + 1; + return e.push(this.str.slice(t, this.pos)), this.escapeCharPositions.length = 0, e.join("") + }, D.QueryLexer.prototype.emit = function(e) { + this.lexemes.push({ + type: e, + str: this.sliceString(), + start: this.start, + end: this.pos + }), this.start = this.pos + }, D.QueryLexer.prototype.escapeCharacter = function() { + this.escapeCharPositions.push(this.pos - 1), this.pos += 1 + }, D.QueryLexer.prototype.next = function() { + if (this.pos >= this.length) return D.QueryLexer.EOS; + var e = this.str.charAt(this.pos); + return this.pos += 1, e + }, D.QueryLexer.prototype.width = function() { + return this.pos - this.start + }, D.QueryLexer.prototype.ignore = function() { + this.start == this.pos && (this.pos += 1), this.start = this.pos + }, D.QueryLexer.prototype.backup = function() { + this.pos -= 1 + }, D.QueryLexer.prototype.acceptDigitRun = function() { + for (var e, t; 47 < (t = (e = this.next()).charCodeAt(0)) && t < 58;); + e != D.QueryLexer.EOS && this.backup() + }, D.QueryLexer.prototype.more = function() { + return this.pos < this.length + }, D.QueryLexer.EOS = "EOS", D.QueryLexer.FIELD = "FIELD", D.QueryLexer.TERM = "TERM", D.QueryLexer.EDIT_DISTANCE = "EDIT_DISTANCE", D.QueryLexer.BOOST = "BOOST", D.QueryLexer.PRESENCE = "PRESENCE", D.QueryLexer.lexField = function(e) { + return e.backup(), e.emit(D.QueryLexer.FIELD), e.ignore(), D.QueryLexer.lexText + }, D.QueryLexer.lexTerm = function(e) { + if (1 < e.width() && (e.backup(), e.emit(D.QueryLexer.TERM)), e.ignore(), e.more()) return D.QueryLexer.lexText + }, D.QueryLexer.lexEditDistance = function(e) { + return e.ignore(), e.acceptDigitRun(), e.emit(D.QueryLexer.EDIT_DISTANCE), D.QueryLexer.lexText + }, D.QueryLexer.lexBoost = function(e) { + return e.ignore(), e.acceptDigitRun(), e.emit(D.QueryLexer.BOOST), D.QueryLexer.lexText + }, D.QueryLexer.lexEOS = function(e) { + 0 < e.width() && e.emit(D.QueryLexer.TERM) + }, D.QueryLexer.termSeparator = D.tokenizer.separator, D.QueryLexer.lexText = function(e) { + for (;;) { + var t = e.next(); + if (t == D.QueryLexer.EOS) return D.QueryLexer.lexEOS; + if (92 != t.charCodeAt(0)) { + if (":" == t) return D.QueryLexer.lexField; + if ("~" == t) return e.backup(), 0 < e.width() && e.emit(D.QueryLexer.TERM), D.QueryLexer.lexEditDistance; + if ("^" == t) return e.backup(), 0 < e.width() && e.emit(D.QueryLexer.TERM), D.QueryLexer.lexBoost; + if ("+" == t && 1 === e.width()) return e.emit(D.QueryLexer.PRESENCE), D.QueryLexer.lexText; + if ("-" == t && 1 === e.width()) return e.emit(D.QueryLexer.PRESENCE), D.QueryLexer.lexText; + if (t.match(D.QueryLexer.termSeparator)) return D.QueryLexer.lexTerm + } else e.escapeCharacter() + } + }, D.QueryParser = function(e, t) { + this.lexer = new D.QueryLexer(e), this.query = t, this.currentClause = {}, this.lexemeIdx = 0 + }, D.QueryParser.prototype.parse = function() { + this.lexer.run(), this.lexemes = this.lexer.lexemes; + for (var e = D.QueryParser.parseClause; e;) e = e(this); + return this.query + }, D.QueryParser.prototype.peekLexeme = function() { + return this.lexemes[this.lexemeIdx] + }, D.QueryParser.prototype.consumeLexeme = function() { + var e = this.peekLexeme(); + return this.lexemeIdx += 1, e + }, D.QueryParser.prototype.nextClause = function() { + var e = this.currentClause; + this.query.clause(e), this.currentClause = {} + }, D.QueryParser.parseClause = function(e) { + var t = e.peekLexeme(); + if (null != t) switch (t.type) { + case D.QueryLexer.PRESENCE: + return D.QueryParser.parsePresence; + case D.QueryLexer.FIELD: + return D.QueryParser.parseField; + case D.QueryLexer.TERM: + return D.QueryParser.parseTerm; + default: + var n = "expected either a field or a term, found " + t.type; + throw 1 <= t.str.length && (n += " with value '" + t.str + "'"), new D.QueryParseError(n, t.start, t.end) + } + }, D.QueryParser.parsePresence = function(e) { + var t = e.consumeLexeme(); + if (null != t) { + switch (t.str) { + case "-": + e.currentClause.presence = D.Query.presence.PROHIBITED; + break; + case "+": + e.currentClause.presence = D.Query.presence.REQUIRED; + break; + default: + var n = "unrecognised presence operator'" + t.str + "'"; + throw new D.QueryParseError(n, t.start, t.end) + } + var r = e.peekLexeme(); + if (null == r) { + n = "expecting term or field, found nothing"; + throw new D.QueryParseError(n, t.start, t.end) + } + switch (r.type) { + case D.QueryLexer.FIELD: + return D.QueryParser.parseField; + case D.QueryLexer.TERM: + return D.QueryParser.parseTerm; + default: + n = "expecting term or field, found '" + r.type + "'"; + throw new D.QueryParseError(n, r.start, r.end) + } + } + }, D.QueryParser.parseField = function(e) { + var t = e.consumeLexeme(); + if (null != t) { + if (-1 == e.query.allFields.indexOf(t.str)) { + var n = e.query.allFields.map(function(e) { + return "'" + e + "'" + }).join(", "), + r = "unrecognised field '" + t.str + "', possible fields: " + n; + throw new D.QueryParseError(r, t.start, t.end) + } + e.currentClause.fields = [t.str]; + var i = e.peekLexeme(); + if (null == i) { + r = "expecting term, found nothing"; + throw new D.QueryParseError(r, t.start, t.end) + } + switch (i.type) { + case D.QueryLexer.TERM: + return D.QueryParser.parseTerm; + default: + r = "expecting term, found '" + i.type + "'"; + throw new D.QueryParseError(r, i.start, i.end) + } + } + }, D.QueryParser.parseTerm = function(e) { + var t = e.consumeLexeme(); + if (null != t) { + e.currentClause.term = t.str.toLowerCase(), -1 != t.str.indexOf("*") && (e.currentClause.usePipeline = !1); + var n = e.peekLexeme(); + if (null != n) switch (n.type) { + case D.QueryLexer.TERM: + return e.nextClause(), D.QueryParser.parseTerm; + case D.QueryLexer.FIELD: + return e.nextClause(), D.QueryParser.parseField; + case D.QueryLexer.EDIT_DISTANCE: + return D.QueryParser.parseEditDistance; + case D.QueryLexer.BOOST: + return D.QueryParser.parseBoost; + case D.QueryLexer.PRESENCE: + return e.nextClause(), D.QueryParser.parsePresence; + default: + var r = "Unexpected lexeme type '" + n.type + "'"; + throw new D.QueryParseError(r, n.start, n.end) + } else e.nextClause() + } + }, D.QueryParser.parseEditDistance = function(e) { + var t = e.consumeLexeme(); + if (null != t) { + var n = parseInt(t.str, 10); + if (isNaN(n)) { + var r = "edit distance must be numeric"; + throw new D.QueryParseError(r, t.start, t.end) + } + e.currentClause.editDistance = n; + var i = e.peekLexeme(); + if (null != i) switch (i.type) { + case D.QueryLexer.TERM: + return e.nextClause(), D.QueryParser.parseTerm; + case D.QueryLexer.FIELD: + return e.nextClause(), D.QueryParser.parseField; + case D.QueryLexer.EDIT_DISTANCE: + return D.QueryParser.parseEditDistance; + case D.QueryLexer.BOOST: + return D.QueryParser.parseBoost; + case D.QueryLexer.PRESENCE: + return e.nextClause(), D.QueryParser.parsePresence; + default: + r = "Unexpected lexeme type '" + i.type + "'"; + throw new D.QueryParseError(r, i.start, i.end) + } else e.nextClause() + } + }, D.QueryParser.parseBoost = function(e) { + var t = e.consumeLexeme(); + if (null != t) { + var n = parseInt(t.str, 10); + if (isNaN(n)) { + var r = "boost must be numeric"; + throw new D.QueryParseError(r, t.start, t.end) + } + e.currentClause.boost = n; + var i = e.peekLexeme(); + if (null != i) switch (i.type) { + case D.QueryLexer.TERM: + return e.nextClause(), D.QueryParser.parseTerm; + case D.QueryLexer.FIELD: + return e.nextClause(), D.QueryParser.parseField; + case D.QueryLexer.EDIT_DISTANCE: + return D.QueryParser.parseEditDistance; + case D.QueryLexer.BOOST: + return D.QueryParser.parseBoost; + case D.QueryLexer.PRESENCE: + return e.nextClause(), D.QueryParser.parsePresence; + default: + r = "Unexpected lexeme type '" + i.type + "'"; + throw new D.QueryParseError(r, i.start, i.end) + } else e.nextClause() + } + }, void 0 === (c = "function" == typeof(s = function() { + return D + }) ? s.call(o, a, o, i) : s) || (i.exports = c) + }() +}])); \ No newline at end of file diff --git a/_static/javascripts/lunr/lunr.da.js b/_static/javascripts/lunr/lunr.da.js new file mode 100644 index 00000000..34910dfe --- /dev/null +++ b/_static/javascripts/lunr/lunr.da.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var r,m,i;e.da=function(){this.pipeline.reset(),this.pipeline.add(e.da.trimmer,e.da.stopWordFilter,e.da.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.da.stemmer))},e.da.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.da.trimmer=e.trimmerSupport.generateTrimmer(e.da.wordCharacters),e.Pipeline.registerFunction(e.da.trimmer,"trimmer-da"),e.da.stemmer=(r=e.stemmerSupport.Among,m=e.stemmerSupport.SnowballProgram,i=new function(){var i,t,n,s=[new r("hed",-1,1),new r("ethed",0,1),new r("ered",-1,1),new r("e",-1,1),new r("erede",3,1),new r("ende",3,1),new r("erende",5,1),new r("ene",3,1),new r("erne",3,1),new r("ere",3,1),new r("en",-1,1),new r("heden",10,1),new r("eren",10,1),new r("er",-1,1),new r("heder",13,1),new r("erer",13,1),new r("s",-1,2),new r("heds",16,1),new r("es",16,1),new r("endes",18,1),new r("erendes",19,1),new r("enes",18,1),new r("ernes",18,1),new r("eres",18,1),new r("ens",16,1),new r("hedens",24,1),new r("erens",24,1),new r("ers",16,1),new r("ets",16,1),new r("erets",28,1),new r("et",-1,1),new r("eret",30,1)],o=[new r("gd",-1,-1),new r("dt",-1,-1),new r("gt",-1,-1),new r("kt",-1,-1)],a=[new r("ig",-1,1),new r("lig",0,1),new r("elig",1,1),new r("els",-1,1),new r("løst",-1,2)],d=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,48,0,128],u=[239,254,42,3,0,0,0,0,0,0,0,0,0,0,0,0,16],c=new m;function l(){var e,r=c.limit-c.cursor;c.cursor>=t&&(e=c.limit_backward,c.limit_backward=t,c.ket=c.cursor,c.find_among_b(o,4)?(c.bra=c.cursor,c.limit_backward=e,c.cursor=c.limit-r,c.cursor>c.limit_backward&&(c.cursor--,c.bra=c.cursor,c.slice_del())):c.limit_backward=e)}this.setCurrent=function(e){c.setCurrent(e)},this.getCurrent=function(){return c.getCurrent()},this.stem=function(){var e,r=c.cursor;return function(){var e,r=c.cursor+3;if(t=c.limit,0<=r&&r<=c.limit){for(i=r;;){if(e=c.cursor,c.in_grouping(d,97,248)){c.cursor=e;break}if((c.cursor=e)>=c.limit)return;c.cursor++}for(;!c.out_grouping(d,97,248);){if(c.cursor>=c.limit)return;c.cursor++}(t=c.cursor)=t&&(r=c.limit_backward,c.limit_backward=t,c.ket=c.cursor,e=c.find_among_b(s,32),c.limit_backward=r,e))switch(c.bra=c.cursor,e){case 1:c.slice_del();break;case 2:c.in_grouping_b(u,97,229)&&c.slice_del()}}(),c.cursor=c.limit,l(),c.cursor=c.limit,function(){var e,r,i,n=c.limit-c.cursor;if(c.ket=c.cursor,c.eq_s_b(2,"st")&&(c.bra=c.cursor,c.eq_s_b(2,"ig")&&c.slice_del()),c.cursor=c.limit-n,c.cursor>=t&&(r=c.limit_backward,c.limit_backward=t,c.ket=c.cursor,e=c.find_among_b(a,5),c.limit_backward=r,e))switch(c.bra=c.cursor,e){case 1:c.slice_del(),i=c.limit-c.cursor,l(),c.cursor=c.limit-i;break;case 2:c.slice_from("løs")}}(),c.cursor=c.limit,c.cursor>=t&&(e=c.limit_backward,c.limit_backward=t,c.ket=c.cursor,c.out_grouping_b(d,97,248)?(c.bra=c.cursor,n=c.slice_to(n),c.limit_backward=e,c.eq_v_b(n)&&c.slice_del()):c.limit_backward=e),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return i.setCurrent(e),i.stem(),i.getCurrent()}):(i.setCurrent(e),i.stem(),i.getCurrent())}),e.Pipeline.registerFunction(e.da.stemmer,"stemmer-da"),e.da.stopWordFilter=e.generateStopWordFilter("ad af alle alt anden at blev blive bliver da de dem den denne der deres det dette dig din disse dog du efter eller en end er et for fra ham han hans har havde have hende hendes her hos hun hvad hvis hvor i ikke ind jeg jer jo kunne man mange med meget men mig min mine mit mod ned noget nogle nu når og også om op os over på selv sig sin sine sit skal skulle som sådan thi til ud under var vi vil ville vor være været".split(" ")),e.Pipeline.registerFunction(e.da.stopWordFilter,"stopWordFilter-da")}}); \ No newline at end of file diff --git a/_static/javascripts/lunr/lunr.de.js b/_static/javascripts/lunr/lunr.de.js new file mode 100644 index 00000000..1529892c --- /dev/null +++ b/_static/javascripts/lunr/lunr.de.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var _,p,r;e.de=function(){this.pipeline.reset(),this.pipeline.add(e.de.trimmer,e.de.stopWordFilter,e.de.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.de.stemmer))},e.de.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.de.trimmer=e.trimmerSupport.generateTrimmer(e.de.wordCharacters),e.Pipeline.registerFunction(e.de.trimmer,"trimmer-de"),e.de.stemmer=(_=e.stemmerSupport.Among,p=e.stemmerSupport.SnowballProgram,r=new function(){var r,n,i,s=[new _("",-1,6),new _("U",0,2),new _("Y",0,1),new _("ä",0,3),new _("ö",0,4),new _("ü",0,5)],o=[new _("e",-1,2),new _("em",-1,1),new _("en",-1,2),new _("ern",-1,1),new _("er",-1,1),new _("s",-1,3),new _("es",5,2)],c=[new _("en",-1,1),new _("er",-1,1),new _("st",-1,2),new _("est",2,1)],u=[new _("ig",-1,1),new _("lich",-1,1)],a=[new _("end",-1,1),new _("ig",-1,2),new _("ung",-1,1),new _("lich",-1,3),new _("isch",-1,2),new _("ik",-1,2),new _("heit",-1,3),new _("keit",-1,4)],t=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,8,0,32,8],d=[117,30,5],l=[117,30,4],m=new p;function h(e,r,n){return!(!m.eq_s(1,e)||(m.ket=m.cursor,!m.in_grouping(t,97,252)))&&(m.slice_from(r),m.cursor=n,!0)}function w(){for(;!m.in_grouping(t,97,252);){if(m.cursor>=m.limit)return!0;m.cursor++}for(;!m.out_grouping(t,97,252);){if(m.cursor>=m.limit)return!0;m.cursor++}return!1}function f(){return i<=m.cursor}function b(){return n<=m.cursor}this.setCurrent=function(e){m.setCurrent(e)},this.getCurrent=function(){return m.getCurrent()},this.stem=function(){var e=m.cursor;return function(){for(var e,r,n,i,s=m.cursor;;)if(e=m.cursor,m.bra=e,m.eq_s(1,"ß"))m.ket=m.cursor,m.slice_from("ss");else{if(e>=m.limit)break;m.cursor=e+1}for(m.cursor=s;;)for(r=m.cursor;;){if(n=m.cursor,m.in_grouping(t,97,252)){if(i=m.cursor,m.bra=i,h("u","U",n))break;if(m.cursor=i,h("y","Y",n))break}if(n>=m.limit)return m.cursor=r;m.cursor=n+1}}(),m.cursor=e,function(){i=m.limit,n=i;var e=m.cursor+3;0<=e&&e<=m.limit&&(r=e,w()||((i=m.cursor)=m.limit)return;m.cursor++}}}(),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return r.setCurrent(e),r.stem(),r.getCurrent()}):(r.setCurrent(e),r.stem(),r.getCurrent())}),e.Pipeline.registerFunction(e.de.stemmer,"stemmer-de"),e.de.stopWordFilter=e.generateStopWordFilter("aber alle allem allen aller alles als also am an ander andere anderem anderen anderer anderes anderm andern anderr anders auch auf aus bei bin bis bist da damit dann das dasselbe dazu daß dein deine deinem deinen deiner deines dem demselben den denn denselben der derer derselbe derselben des desselben dessen dich die dies diese dieselbe dieselben diesem diesen dieser dieses dir doch dort du durch ein eine einem einen einer eines einig einige einigem einigen einiger einiges einmal er es etwas euch euer eure eurem euren eurer eures für gegen gewesen hab habe haben hat hatte hatten hier hin hinter ich ihm ihn ihnen ihr ihre ihrem ihren ihrer ihres im in indem ins ist jede jedem jeden jeder jedes jene jenem jenen jener jenes jetzt kann kein keine keinem keinen keiner keines können könnte machen man manche manchem manchen mancher manches mein meine meinem meinen meiner meines mich mir mit muss musste nach nicht nichts noch nun nur ob oder ohne sehr sein seine seinem seinen seiner seines selbst sich sie sind so solche solchem solchen solcher solches soll sollte sondern sonst um und uns unse unsem unsen unser unses unter viel vom von vor war waren warst was weg weil weiter welche welchem welchen welcher welches wenn werde werden wie wieder will wir wird wirst wo wollen wollte während würde würden zu zum zur zwar zwischen über".split(" ")),e.Pipeline.registerFunction(e.de.stopWordFilter,"stopWordFilter-de")}}); \ No newline at end of file diff --git a/_static/javascripts/lunr/lunr.du.js b/_static/javascripts/lunr/lunr.du.js new file mode 100644 index 00000000..52632004 --- /dev/null +++ b/_static/javascripts/lunr/lunr.du.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var v,q,r;console.warn('[Lunr Languages] Please use the "nl" instead of the "du". The "nl" code is the standard code for Dutch language, and "du" will be removed in the next major versions.'),e.du=function(){this.pipeline.reset(),this.pipeline.add(e.du.trimmer,e.du.stopWordFilter,e.du.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.du.stemmer))},e.du.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.du.trimmer=e.trimmerSupport.generateTrimmer(e.du.wordCharacters),e.Pipeline.registerFunction(e.du.trimmer,"trimmer-du"),e.du.stemmer=(v=e.stemmerSupport.Among,q=e.stemmerSupport.SnowballProgram,r=new function(){var r,i,u,o=[new v("",-1,6),new v("á",0,1),new v("ä",0,1),new v("é",0,2),new v("ë",0,2),new v("í",0,3),new v("ï",0,3),new v("ó",0,4),new v("ö",0,4),new v("ú",0,5),new v("ü",0,5)],n=[new v("",-1,3),new v("I",0,2),new v("Y",0,1)],t=[new v("dd",-1,-1),new v("kk",-1,-1),new v("tt",-1,-1)],c=[new v("ene",-1,2),new v("se",-1,3),new v("en",-1,2),new v("heden",2,1),new v("s",-1,3)],a=[new v("end",-1,1),new v("ig",-1,2),new v("ing",-1,1),new v("lijk",-1,3),new v("baar",-1,4),new v("bar",-1,5)],l=[new v("aa",-1,-1),new v("ee",-1,-1),new v("oo",-1,-1),new v("uu",-1,-1)],m=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,128],d=[1,0,0,17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,128],f=[17,67,16,1,0,0,0,0,0,0,0,0,0,0,0,0,128],_=new q;function s(e){return(_.cursor=e)>=_.limit||(_.cursor++,!1)}function w(){for(;!_.in_grouping(m,97,232);){if(_.cursor>=_.limit)return!0;_.cursor++}for(;!_.out_grouping(m,97,232);){if(_.cursor>=_.limit)return!0;_.cursor++}return!1}function b(){return i<=_.cursor}function p(){return r<=_.cursor}function g(){var e=_.limit-_.cursor;_.find_among_b(t,3)&&(_.cursor=_.limit-e,_.ket=_.cursor,_.cursor>_.limit_backward&&(_.cursor--,_.bra=_.cursor,_.slice_del()))}function h(){var e;u=!1,_.ket=_.cursor,_.eq_s_b(1,"e")&&(_.bra=_.cursor,b()&&(e=_.limit-_.cursor,_.out_grouping_b(m,97,232)&&(_.cursor=_.limit-e,_.slice_del(),u=!0,g())))}function k(){var e;b()&&(e=_.limit-_.cursor,_.out_grouping_b(m,97,232)&&(_.cursor=_.limit-e,_.eq_s_b(3,"gem")||(_.cursor=_.limit-e,_.slice_del(),g())))}this.setCurrent=function(e){_.setCurrent(e)},this.getCurrent=function(){return _.getCurrent()},this.stem=function(){var e=_.cursor;return function(){for(var e,r,i,n=_.cursor;;){if(_.bra=_.cursor,e=_.find_among(o,11))switch(_.ket=_.cursor,e){case 1:_.slice_from("a");continue;case 2:_.slice_from("e");continue;case 3:_.slice_from("i");continue;case 4:_.slice_from("o");continue;case 5:_.slice_from("u");continue;case 6:if(_.cursor>=_.limit)break;_.cursor++;continue}break}for(_.cursor=n,_.bra=n,_.eq_s(1,"y")?(_.ket=_.cursor,_.slice_from("Y")):_.cursor=n;;)if(r=_.cursor,_.in_grouping(m,97,232)){if(i=_.cursor,_.bra=i,_.eq_s(1,"i"))_.ket=_.cursor,_.in_grouping(m,97,232)&&(_.slice_from("I"),_.cursor=r);else if(_.cursor=i,_.eq_s(1,"y"))_.ket=_.cursor,_.slice_from("Y"),_.cursor=r;else if(s(r))break}else if(s(r))break}(),_.cursor=e,i=_.limit,r=i,w()||((i=_.cursor)<3&&(i=3),w()||(r=_.cursor)),_.limit_backward=e,_.cursor=_.limit,function(){var e,r,i,n,o,t,s=_.limit-_.cursor;if(_.ket=_.cursor,e=_.find_among_b(c,5))switch(_.bra=_.cursor,e){case 1:b()&&_.slice_from("heid");break;case 2:k();break;case 3:b()&&_.out_grouping_b(f,97,232)&&_.slice_del()}if(_.cursor=_.limit-s,h(),_.cursor=_.limit-s,_.ket=_.cursor,_.eq_s_b(4,"heid")&&(_.bra=_.cursor,p()&&(r=_.limit-_.cursor,_.eq_s_b(1,"c")||(_.cursor=_.limit-r,_.slice_del(),_.ket=_.cursor,_.eq_s_b(2,"en")&&(_.bra=_.cursor,k())))),_.cursor=_.limit-s,_.ket=_.cursor,e=_.find_among_b(a,6))switch(_.bra=_.cursor,e){case 1:if(p()){if(_.slice_del(),i=_.limit-_.cursor,_.ket=_.cursor,_.eq_s_b(2,"ig")&&(_.bra=_.cursor,p()&&(n=_.limit-_.cursor,!_.eq_s_b(1,"e")))){_.cursor=_.limit-n,_.slice_del();break}_.cursor=_.limit-i,g()}break;case 2:p()&&(o=_.limit-_.cursor,_.eq_s_b(1,"e")||(_.cursor=_.limit-o,_.slice_del()));break;case 3:p()&&(_.slice_del(),h());break;case 4:p()&&_.slice_del();break;case 5:p()&&u&&_.slice_del()}_.cursor=_.limit-s,_.out_grouping_b(d,73,232)&&(t=_.limit-_.cursor,_.find_among_b(l,4)&&_.out_grouping_b(m,97,232)&&(_.cursor=_.limit-t,_.ket=_.cursor,_.cursor>_.limit_backward&&(_.cursor--,_.bra=_.cursor,_.slice_del())))}(),_.cursor=_.limit_backward,function(){for(var e;;)if(_.bra=_.cursor,e=_.find_among(n,3))switch(_.ket=_.cursor,e){case 1:_.slice_from("y");break;case 2:_.slice_from("i");break;case 3:if(_.cursor>=_.limit)return;_.cursor++}}(),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return r.setCurrent(e),r.stem(),r.getCurrent()}):(r.setCurrent(e),r.stem(),r.getCurrent())}),e.Pipeline.registerFunction(e.du.stemmer,"stemmer-du"),e.du.stopWordFilter=e.generateStopWordFilter(" aan al alles als altijd andere ben bij daar dan dat de der deze die dit doch doen door dus een eens en er ge geen geweest haar had heb hebben heeft hem het hier hij hoe hun iemand iets ik in is ja je kan kon kunnen maar me meer men met mij mijn moet na naar niet niets nog nu of om omdat onder ons ook op over reeds te tegen toch toen tot u uit uw van veel voor want waren was wat werd wezen wie wil worden wordt zal ze zelf zich zij zijn zo zonder zou".split(" ")),e.Pipeline.registerFunction(e.du.stopWordFilter,"stopWordFilter-du")}}); \ No newline at end of file diff --git a/_static/javascripts/lunr/lunr.es.js b/_static/javascripts/lunr/lunr.es.js new file mode 100644 index 00000000..9de6c09c --- /dev/null +++ b/_static/javascripts/lunr/lunr.es.js @@ -0,0 +1 @@ +!function(e,s){"function"==typeof define&&define.amd?define(s):"object"==typeof exports?module.exports=s():s()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var C,P,s;e.es=function(){this.pipeline.reset(),this.pipeline.add(e.es.trimmer,e.es.stopWordFilter,e.es.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.es.stemmer))},e.es.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.es.trimmer=e.trimmerSupport.generateTrimmer(e.es.wordCharacters),e.Pipeline.registerFunction(e.es.trimmer,"trimmer-es"),e.es.stemmer=(C=e.stemmerSupport.Among,P=e.stemmerSupport.SnowballProgram,s=new function(){var r,n,i,a=[new C("",-1,6),new C("á",0,1),new C("é",0,2),new C("í",0,3),new C("ó",0,4),new C("ú",0,5)],t=[new C("la",-1,-1),new C("sela",0,-1),new C("le",-1,-1),new C("me",-1,-1),new C("se",-1,-1),new C("lo",-1,-1),new C("selo",5,-1),new C("las",-1,-1),new C("selas",7,-1),new C("les",-1,-1),new C("los",-1,-1),new C("selos",10,-1),new C("nos",-1,-1)],o=[new C("ando",-1,6),new C("iendo",-1,6),new C("yendo",-1,7),new C("ándo",-1,2),new C("iéndo",-1,1),new C("ar",-1,6),new C("er",-1,6),new C("ir",-1,6),new C("ár",-1,3),new C("ér",-1,4),new C("ír",-1,5)],s=[new C("ic",-1,-1),new C("ad",-1,-1),new C("os",-1,-1),new C("iv",-1,1)],u=[new C("able",-1,1),new C("ible",-1,1),new C("ante",-1,1)],w=[new C("ic",-1,1),new C("abil",-1,1),new C("iv",-1,1)],c=[new C("ica",-1,1),new C("ancia",-1,2),new C("encia",-1,5),new C("adora",-1,2),new C("osa",-1,1),new C("ista",-1,1),new C("iva",-1,9),new C("anza",-1,1),new C("logía",-1,3),new C("idad",-1,8),new C("able",-1,1),new C("ible",-1,1),new C("ante",-1,2),new C("mente",-1,7),new C("amente",13,6),new C("ación",-1,2),new C("ución",-1,4),new C("ico",-1,1),new C("ismo",-1,1),new C("oso",-1,1),new C("amiento",-1,1),new C("imiento",-1,1),new C("ivo",-1,9),new C("ador",-1,2),new C("icas",-1,1),new C("ancias",-1,2),new C("encias",-1,5),new C("adoras",-1,2),new C("osas",-1,1),new C("istas",-1,1),new C("ivas",-1,9),new C("anzas",-1,1),new C("logías",-1,3),new C("idades",-1,8),new C("ables",-1,1),new C("ibles",-1,1),new C("aciones",-1,2),new C("uciones",-1,4),new C("adores",-1,2),new C("antes",-1,2),new C("icos",-1,1),new C("ismos",-1,1),new C("osos",-1,1),new C("amientos",-1,1),new C("imientos",-1,1),new C("ivos",-1,9)],m=[new C("ya",-1,1),new C("ye",-1,1),new C("yan",-1,1),new C("yen",-1,1),new C("yeron",-1,1),new C("yendo",-1,1),new C("yo",-1,1),new C("yas",-1,1),new C("yes",-1,1),new C("yais",-1,1),new C("yamos",-1,1),new C("yó",-1,1)],l=[new C("aba",-1,2),new C("ada",-1,2),new C("ida",-1,2),new C("ara",-1,2),new C("iera",-1,2),new C("ía",-1,2),new C("aría",5,2),new C("ería",5,2),new C("iría",5,2),new C("ad",-1,2),new C("ed",-1,2),new C("id",-1,2),new C("ase",-1,2),new C("iese",-1,2),new C("aste",-1,2),new C("iste",-1,2),new C("an",-1,2),new C("aban",16,2),new C("aran",16,2),new C("ieran",16,2),new C("ían",16,2),new C("arían",20,2),new C("erían",20,2),new C("irían",20,2),new C("en",-1,1),new C("asen",24,2),new C("iesen",24,2),new C("aron",-1,2),new C("ieron",-1,2),new C("arán",-1,2),new C("erán",-1,2),new C("irán",-1,2),new C("ado",-1,2),new C("ido",-1,2),new C("ando",-1,2),new C("iendo",-1,2),new C("ar",-1,2),new C("er",-1,2),new C("ir",-1,2),new C("as",-1,2),new C("abas",39,2),new C("adas",39,2),new C("idas",39,2),new C("aras",39,2),new C("ieras",39,2),new C("ías",39,2),new C("arías",45,2),new C("erías",45,2),new C("irías",45,2),new C("es",-1,1),new C("ases",49,2),new C("ieses",49,2),new C("abais",-1,2),new C("arais",-1,2),new C("ierais",-1,2),new C("íais",-1,2),new C("aríais",55,2),new C("eríais",55,2),new C("iríais",55,2),new C("aseis",-1,2),new C("ieseis",-1,2),new C("asteis",-1,2),new C("isteis",-1,2),new C("áis",-1,2),new C("éis",-1,1),new C("aréis",64,2),new C("eréis",64,2),new C("iréis",64,2),new C("ados",-1,2),new C("idos",-1,2),new C("amos",-1,2),new C("ábamos",70,2),new C("áramos",70,2),new C("iéramos",70,2),new C("íamos",70,2),new C("aríamos",74,2),new C("eríamos",74,2),new C("iríamos",74,2),new C("emos",-1,1),new C("aremos",78,2),new C("eremos",78,2),new C("iremos",78,2),new C("ásemos",78,2),new C("iésemos",78,2),new C("imos",-1,2),new C("arás",-1,2),new C("erás",-1,2),new C("irás",-1,2),new C("ís",-1,2),new C("ará",-1,2),new C("erá",-1,2),new C("irá",-1,2),new C("aré",-1,2),new C("eré",-1,2),new C("iré",-1,2),new C("ió",-1,2)],d=[new C("a",-1,1),new C("e",-1,2),new C("o",-1,1),new C("os",-1,1),new C("á",-1,1),new C("é",-1,2),new C("í",-1,1),new C("ó",-1,1)],b=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,1,17,4,10],f=new P;function _(){if(f.out_grouping(b,97,252)){for(;!f.in_grouping(b,97,252);){if(f.cursor>=f.limit)return!0;f.cursor++}return!1}return!0}function h(){var e,s=f.cursor;if(function(){if(f.in_grouping(b,97,252)){var e=f.cursor;if(_()){if(f.cursor=e,!f.in_grouping(b,97,252))return!0;for(;!f.out_grouping(b,97,252);){if(f.cursor>=f.limit)return!0;f.cursor++}}return!1}return!0}()){if(f.cursor=s,!f.out_grouping(b,97,252))return;if(e=f.cursor,_()){if(f.cursor=e,!f.in_grouping(b,97,252)||f.cursor>=f.limit)return;f.cursor++}}i=f.cursor}function v(){for(;!f.in_grouping(b,97,252);){if(f.cursor>=f.limit)return!1;f.cursor++}for(;!f.out_grouping(b,97,252);){if(f.cursor>=f.limit)return!1;f.cursor++}return!0}function p(){return i<=f.cursor}function g(){return r<=f.cursor}function k(e,s){if(!g())return!0;f.slice_del(),f.ket=f.cursor;var r=f.find_among_b(e,s);return r&&(f.bra=f.cursor,1==r&&g()&&f.slice_del()),!1}function y(e){return!g()||(f.slice_del(),f.ket=f.cursor,f.eq_s_b(2,e)&&(f.bra=f.cursor,g()&&f.slice_del()),!1)}function q(){var e;if(f.ket=f.cursor,e=f.find_among_b(c,46)){switch(f.bra=f.cursor,e){case 1:if(!g())return!1;f.slice_del();break;case 2:if(y("ic"))return!1;break;case 3:if(!g())return!1;f.slice_from("log");break;case 4:if(!g())return!1;f.slice_from("u");break;case 5:if(!g())return!1;f.slice_from("ente");break;case 6:if(!(n<=f.cursor))return!1;f.slice_del(),f.ket=f.cursor,(e=f.find_among_b(s,4))&&(f.bra=f.cursor,g()&&(f.slice_del(),1==e&&(f.ket=f.cursor,f.eq_s_b(2,"at")&&(f.bra=f.cursor,g()&&f.slice_del()))));break;case 7:if(k(u,3))return!1;break;case 8:if(k(w,3))return!1;break;case 9:if(y("at"))return!1}return!0}return!1}this.setCurrent=function(e){f.setCurrent(e)},this.getCurrent=function(){return f.getCurrent()},this.stem=function(){var e,s=f.cursor;return e=f.cursor,i=f.limit,r=n=i,h(),f.cursor=e,v()&&(n=f.cursor,v()&&(r=f.cursor)),f.limit_backward=s,f.cursor=f.limit,function(){var e;if(f.ket=f.cursor,f.find_among_b(t,13)&&(f.bra=f.cursor,(e=f.find_among_b(o,11))&&p()))switch(e){case 1:f.bra=f.cursor,f.slice_from("iendo");break;case 2:f.bra=f.cursor,f.slice_from("ando");break;case 3:f.bra=f.cursor,f.slice_from("ar");break;case 4:f.bra=f.cursor,f.slice_from("er");break;case 5:f.bra=f.cursor,f.slice_from("ir");break;case 6:f.slice_del();break;case 7:f.eq_s_b(1,"u")&&f.slice_del()}}(),f.cursor=f.limit,q()||(f.cursor=f.limit,function(){var e,s;if(f.cursor>=i&&(s=f.limit_backward,f.limit_backward=i,f.ket=f.cursor,e=f.find_among_b(m,12),f.limit_backward=s,e)){if(f.bra=f.cursor,1==e){if(!f.eq_s_b(1,"u"))return!1;f.slice_del()}return!0}return!1}()||(f.cursor=f.limit,function(){var e,s,r,n;if(f.cursor>=i&&(s=f.limit_backward,f.limit_backward=i,f.ket=f.cursor,e=f.find_among_b(l,96),f.limit_backward=s,e))switch(f.bra=f.cursor,e){case 1:r=f.limit-f.cursor,f.eq_s_b(1,"u")?(n=f.limit-f.cursor,f.eq_s_b(1,"g")?f.cursor=f.limit-n:f.cursor=f.limit-r):f.cursor=f.limit-r,f.bra=f.cursor;case 2:f.slice_del()}}())),f.cursor=f.limit,function(){var e,s;if(f.ket=f.cursor,e=f.find_among_b(d,8))switch(f.bra=f.cursor,e){case 1:p()&&f.slice_del();break;case 2:p()&&(f.slice_del(),f.ket=f.cursor,f.eq_s_b(1,"u")&&(f.bra=f.cursor,s=f.limit-f.cursor,f.eq_s_b(1,"g")&&(f.cursor=f.limit-s,p()&&f.slice_del())))}}(),f.cursor=f.limit_backward,function(){for(var e;;){if(f.bra=f.cursor,e=f.find_among(a,6))switch(f.ket=f.cursor,e){case 1:f.slice_from("a");continue;case 2:f.slice_from("e");continue;case 3:f.slice_from("i");continue;case 4:f.slice_from("o");continue;case 5:f.slice_from("u");continue;case 6:if(f.cursor>=f.limit)break;f.cursor++;continue}break}}(),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return s.setCurrent(e),s.stem(),s.getCurrent()}):(s.setCurrent(e),s.stem(),s.getCurrent())}),e.Pipeline.registerFunction(e.es.stemmer,"stemmer-es"),e.es.stopWordFilter=e.generateStopWordFilter("a al algo algunas algunos ante antes como con contra cual cuando de del desde donde durante e el ella ellas ellos en entre era erais eran eras eres es esa esas ese eso esos esta estaba estabais estaban estabas estad estada estadas estado estados estamos estando estar estaremos estará estarán estarás estaré estaréis estaría estaríais estaríamos estarían estarías estas este estemos esto estos estoy estuve estuviera estuvierais estuvieran estuvieras estuvieron estuviese estuvieseis estuviesen estuvieses estuvimos estuviste estuvisteis estuviéramos estuviésemos estuvo está estábamos estáis están estás esté estéis estén estés fue fuera fuerais fueran fueras fueron fuese fueseis fuesen fueses fui fuimos fuiste fuisteis fuéramos fuésemos ha habida habidas habido habidos habiendo habremos habrá habrán habrás habré habréis habría habríais habríamos habrían habrías habéis había habíais habíamos habían habías han has hasta hay haya hayamos hayan hayas hayáis he hemos hube hubiera hubierais hubieran hubieras hubieron hubiese hubieseis hubiesen hubieses hubimos hubiste hubisteis hubiéramos hubiésemos hubo la las le les lo los me mi mis mucho muchos muy más mí mía mías mío míos nada ni no nos nosotras nosotros nuestra nuestras nuestro nuestros o os otra otras otro otros para pero poco por porque que quien quienes qué se sea seamos sean seas seremos será serán serás seré seréis sería seríais seríamos serían serías seáis sido siendo sin sobre sois somos son soy su sus suya suyas suyo suyos sí también tanto te tendremos tendrá tendrán tendrás tendré tendréis tendría tendríais tendríamos tendrían tendrías tened tenemos tenga tengamos tengan tengas tengo tengáis tenida tenidas tenido tenidos teniendo tenéis tenía teníais teníamos tenían tenías ti tiene tienen tienes todo todos tu tus tuve tuviera tuvierais tuvieran tuvieras tuvieron tuviese tuvieseis tuviesen tuvieses tuvimos tuviste tuvisteis tuviéramos tuviésemos tuvo tuya tuyas tuyo tuyos tú un una uno unos vosotras vosotros vuestra vuestras vuestro vuestros y ya yo él éramos".split(" ")),e.Pipeline.registerFunction(e.es.stopWordFilter,"stopWordFilter-es")}}); \ No newline at end of file diff --git a/_static/javascripts/lunr/lunr.fi.js b/_static/javascripts/lunr/lunr.fi.js new file mode 100644 index 00000000..2f9bf5ae --- /dev/null +++ b/_static/javascripts/lunr/lunr.fi.js @@ -0,0 +1 @@ +!function(i,e){"function"==typeof define&&define.amd?define(e):"object"==typeof exports?module.exports=e():e()(i.lunr)}(this,function(){return function(i){if(void 0===i)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===i.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var v,C,e;i.fi=function(){this.pipeline.reset(),this.pipeline.add(i.fi.trimmer,i.fi.stopWordFilter,i.fi.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(i.fi.stemmer))},i.fi.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",i.fi.trimmer=i.trimmerSupport.generateTrimmer(i.fi.wordCharacters),i.Pipeline.registerFunction(i.fi.trimmer,"trimmer-fi"),i.fi.stemmer=(v=i.stemmerSupport.Among,C=i.stemmerSupport.SnowballProgram,e=new function(){var n,t,l,o,r=[new v("pa",-1,1),new v("sti",-1,2),new v("kaan",-1,1),new v("han",-1,1),new v("kin",-1,1),new v("hän",-1,1),new v("kään",-1,1),new v("ko",-1,1),new v("pä",-1,1),new v("kö",-1,1)],s=[new v("lla",-1,-1),new v("na",-1,-1),new v("ssa",-1,-1),new v("ta",-1,-1),new v("lta",3,-1),new v("sta",3,-1)],a=[new v("llä",-1,-1),new v("nä",-1,-1),new v("ssä",-1,-1),new v("tä",-1,-1),new v("ltä",3,-1),new v("stä",3,-1)],u=[new v("lle",-1,-1),new v("ine",-1,-1)],c=[new v("nsa",-1,3),new v("mme",-1,3),new v("nne",-1,3),new v("ni",-1,2),new v("si",-1,1),new v("an",-1,4),new v("en",-1,6),new v("än",-1,5),new v("nsä",-1,3)],i=[new v("aa",-1,-1),new v("ee",-1,-1),new v("ii",-1,-1),new v("oo",-1,-1),new v("uu",-1,-1),new v("ää",-1,-1),new v("öö",-1,-1)],m=[new v("a",-1,8),new v("lla",0,-1),new v("na",0,-1),new v("ssa",0,-1),new v("ta",0,-1),new v("lta",4,-1),new v("sta",4,-1),new v("tta",4,9),new v("lle",-1,-1),new v("ine",-1,-1),new v("ksi",-1,-1),new v("n",-1,7),new v("han",11,1),new v("den",11,-1,q),new v("seen",11,-1,j),new v("hen",11,2),new v("tten",11,-1,q),new v("hin",11,3),new v("siin",11,-1,q),new v("hon",11,4),new v("hän",11,5),new v("hön",11,6),new v("ä",-1,8),new v("llä",22,-1),new v("nä",22,-1),new v("ssä",22,-1),new v("tä",22,-1),new v("ltä",26,-1),new v("stä",26,-1),new v("ttä",26,9)],w=[new v("eja",-1,-1),new v("mma",-1,1),new v("imma",1,-1),new v("mpa",-1,1),new v("impa",3,-1),new v("mmi",-1,1),new v("immi",5,-1),new v("mpi",-1,1),new v("impi",7,-1),new v("ejä",-1,-1),new v("mmä",-1,1),new v("immä",10,-1),new v("mpä",-1,1),new v("impä",12,-1)],_=[new v("i",-1,-1),new v("j",-1,-1)],k=[new v("mma",-1,1),new v("imma",0,-1)],b=[17,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8],d=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,8,0,32],e=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,32],f=[17,97,24,1,0,0,0,0,0,0,0,0,0,0,0,0,8,0,32],h=new C;function p(){for(var i;i=h.cursor,!h.in_grouping(d,97,246);){if((h.cursor=i)>=h.limit)return!0;h.cursor++}for(h.cursor=i;!h.out_grouping(d,97,246);){if(h.cursor>=h.limit)return!0;h.cursor++}return!1}function g(){var i,e;if(h.cursor>=o)if(e=h.limit_backward,h.limit_backward=o,h.ket=h.cursor,i=h.find_among_b(r,10)){switch(h.bra=h.cursor,h.limit_backward=e,i){case 1:if(!h.in_grouping_b(f,97,246))return;break;case 2:if(!(l<=h.cursor))return}h.slice_del()}else h.limit_backward=e}function j(){return h.find_among_b(i,7)}function q(){return h.eq_s_b(1,"i")&&h.in_grouping_b(e,97,246)}this.setCurrent=function(i){h.setCurrent(i)},this.getCurrent=function(){return h.getCurrent()},this.stem=function(){var i,e=h.cursor;return o=h.limit,l=o,p()||(o=h.cursor,p()||(l=h.cursor)),n=!1,h.limit_backward=e,h.cursor=h.limit,g(),h.cursor=h.limit,function(){var i,e,r;if(h.cursor>=o)if(e=h.limit_backward,h.limit_backward=o,h.ket=h.cursor,i=h.find_among_b(c,9))switch(h.bra=h.cursor,h.limit_backward=e,i){case 1:r=h.limit-h.cursor,h.eq_s_b(1,"k")||(h.cursor=h.limit-r,h.slice_del());break;case 2:h.slice_del(),h.ket=h.cursor,h.eq_s_b(3,"kse")&&(h.bra=h.cursor,h.slice_from("ksi"));break;case 3:h.slice_del();break;case 4:h.find_among_b(s,6)&&h.slice_del();break;case 5:h.find_among_b(a,6)&&h.slice_del();break;case 6:h.find_among_b(u,2)&&h.slice_del()}else h.limit_backward=e}(),h.cursor=h.limit,function(){var i,e,r;if(h.cursor>=o)if(e=h.limit_backward,h.limit_backward=o,h.ket=h.cursor,i=h.find_among_b(m,30)){switch(h.bra=h.cursor,h.limit_backward=e,i){case 1:if(!h.eq_s_b(1,"a"))return;break;case 2:case 9:if(!h.eq_s_b(1,"e"))return;break;case 3:if(!h.eq_s_b(1,"i"))return;break;case 4:if(!h.eq_s_b(1,"o"))return;break;case 5:if(!h.eq_s_b(1,"ä"))return;break;case 6:if(!h.eq_s_b(1,"ö"))return;break;case 7:if(r=h.limit-h.cursor,!j()&&(h.cursor=h.limit-r,!h.eq_s_b(2,"ie"))){h.cursor=h.limit-r;break}if(h.cursor=h.limit-r,h.cursor<=h.limit_backward){h.cursor=h.limit-r;break}h.cursor--,h.bra=h.cursor;break;case 8:if(!h.in_grouping_b(d,97,246)||!h.out_grouping_b(d,97,246))return}h.slice_del(),n=!0}else h.limit_backward=e}(),h.cursor=h.limit,function(){var i,e,r;if(h.cursor>=l)if(e=h.limit_backward,h.limit_backward=l,h.ket=h.cursor,i=h.find_among_b(w,14)){if(h.bra=h.cursor,h.limit_backward=e,1==i){if(r=h.limit-h.cursor,h.eq_s_b(2,"po"))return;h.cursor=h.limit-r}h.slice_del()}else h.limit_backward=e}(),h.cursor=h.limit,h.cursor=(n?h.cursor>=o&&(i=h.limit_backward,h.limit_backward=o,h.ket=h.cursor,h.find_among_b(_,2)?(h.bra=h.cursor,h.limit_backward=i,h.slice_del()):h.limit_backward=i):(h.cursor=h.limit,function(){var i,e,r,n,t,s;if(h.cursor>=o){if(e=h.limit_backward,h.limit_backward=o,h.ket=h.cursor,h.eq_s_b(1,"t")&&(h.bra=h.cursor,r=h.limit-h.cursor,h.in_grouping_b(d,97,246)&&(h.cursor=h.limit-r,h.slice_del(),h.limit_backward=e,n=h.limit-h.cursor,h.cursor>=l&&(h.cursor=l,t=h.limit_backward,h.limit_backward=h.cursor,h.cursor=h.limit-n,h.ket=h.cursor,i=h.find_among_b(k,2))))){if(h.bra=h.cursor,h.limit_backward=t,1==i){if(s=h.limit-h.cursor,h.eq_s_b(2,"po"))return;h.cursor=h.limit-s}return h.slice_del()}h.limit_backward=e}}()),h.limit),function(){var i,e,r,n;if(h.cursor>=o){for(i=h.limit_backward,h.limit_backward=o,e=h.limit-h.cursor,j()&&(h.cursor=h.limit-e,h.ket=h.cursor,h.cursor>h.limit_backward&&(h.cursor--,h.bra=h.cursor,h.slice_del())),h.cursor=h.limit-e,h.ket=h.cursor,h.in_grouping_b(b,97,228)&&(h.bra=h.cursor,h.out_grouping_b(d,97,246)&&h.slice_del()),h.cursor=h.limit-e,h.ket=h.cursor,h.eq_s_b(1,"j")&&(h.bra=h.cursor,r=h.limit-h.cursor,h.eq_s_b(1,"o")?h.slice_del():(h.cursor=h.limit-r,h.eq_s_b(1,"u")&&h.slice_del())),h.cursor=h.limit-e,h.ket=h.cursor,h.eq_s_b(1,"o")&&(h.bra=h.cursor,h.eq_s_b(1,"j")&&h.slice_del()),h.cursor=h.limit-e,h.limit_backward=i;;){if(n=h.limit-h.cursor,h.out_grouping_b(d,97,246)){h.cursor=h.limit-n;break}if(h.cursor=h.limit-n,h.cursor<=h.limit_backward)return;h.cursor--}h.ket=h.cursor,h.cursor>h.limit_backward&&(h.cursor--,h.bra=h.cursor,t=h.slice_to(),h.eq_v_b(t)&&h.slice_del())}}(),!0}},function(i){return"function"==typeof i.update?i.update(function(i){return e.setCurrent(i),e.stem(),e.getCurrent()}):(e.setCurrent(i),e.stem(),e.getCurrent())}),i.Pipeline.registerFunction(i.fi.stemmer,"stemmer-fi"),i.fi.stopWordFilter=i.generateStopWordFilter("ei eivät emme en et ette että he heidän heidät heihin heille heillä heiltä heissä heistä heitä hän häneen hänelle hänellä häneltä hänen hänessä hänestä hänet häntä itse ja johon joiden joihin joiksi joilla joille joilta joina joissa joista joita joka joksi jolla jolle jolta jona jonka jos jossa josta jota jotka kanssa keiden keihin keiksi keille keillä keiltä keinä keissä keistä keitä keneen keneksi kenelle kenellä keneltä kenen kenenä kenessä kenestä kenet ketkä ketkä ketä koska kuin kuka kun me meidän meidät meihin meille meillä meiltä meissä meistä meitä mihin miksi mikä mille millä miltä minkä minkä minua minulla minulle minulta minun minussa minusta minut minuun minä minä missä mistä mitkä mitä mukaan mutta ne niiden niihin niiksi niille niillä niiltä niin niin niinä niissä niistä niitä noiden noihin noiksi noilla noille noilta noin noina noissa noista noita nuo nyt näiden näihin näiksi näille näillä näiltä näinä näissä näistä näitä nämä ole olemme olen olet olette oli olimme olin olisi olisimme olisin olisit olisitte olisivat olit olitte olivat olla olleet ollut on ovat poikki se sekä sen siihen siinä siitä siksi sille sillä sillä siltä sinua sinulla sinulle sinulta sinun sinussa sinusta sinut sinuun sinä sinä sitä tai te teidän teidät teihin teille teillä teiltä teissä teistä teitä tuo tuohon tuoksi tuolla tuolle tuolta tuon tuona tuossa tuosta tuota tähän täksi tälle tällä tältä tämä tämän tänä tässä tästä tätä vaan vai vaikka yli".split(" ")),i.Pipeline.registerFunction(i.fi.stopWordFilter,"stopWordFilter-fi")}}); \ No newline at end of file diff --git a/_static/javascripts/lunr/lunr.fr.js b/_static/javascripts/lunr/lunr.fr.js new file mode 100644 index 00000000..078d0cab --- /dev/null +++ b/_static/javascripts/lunr/lunr.fr.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var r,y,s;e.fr=function(){this.pipeline.reset(),this.pipeline.add(e.fr.trimmer,e.fr.stopWordFilter,e.fr.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.fr.stemmer))},e.fr.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.fr.trimmer=e.trimmerSupport.generateTrimmer(e.fr.wordCharacters),e.Pipeline.registerFunction(e.fr.trimmer,"trimmer-fr"),e.fr.stemmer=(r=e.stemmerSupport.Among,y=e.stemmerSupport.SnowballProgram,s=new function(){var s,i,t,n=[new r("col",-1,-1),new r("par",-1,-1),new r("tap",-1,-1)],u=[new r("",-1,4),new r("I",0,1),new r("U",0,2),new r("Y",0,3)],o=[new r("iqU",-1,3),new r("abl",-1,3),new r("Ièr",-1,4),new r("ièr",-1,4),new r("eus",-1,2),new r("iv",-1,1)],c=[new r("ic",-1,2),new r("abil",-1,1),new r("iv",-1,3)],a=[new r("iqUe",-1,1),new r("atrice",-1,2),new r("ance",-1,1),new r("ence",-1,5),new r("logie",-1,3),new r("able",-1,1),new r("isme",-1,1),new r("euse",-1,11),new r("iste",-1,1),new r("ive",-1,8),new r("if",-1,8),new r("usion",-1,4),new r("ation",-1,2),new r("ution",-1,4),new r("ateur",-1,2),new r("iqUes",-1,1),new r("atrices",-1,2),new r("ances",-1,1),new r("ences",-1,5),new r("logies",-1,3),new r("ables",-1,1),new r("ismes",-1,1),new r("euses",-1,11),new r("istes",-1,1),new r("ives",-1,8),new r("ifs",-1,8),new r("usions",-1,4),new r("ations",-1,2),new r("utions",-1,4),new r("ateurs",-1,2),new r("ments",-1,15),new r("ements",30,6),new r("issements",31,12),new r("ités",-1,7),new r("ment",-1,15),new r("ement",34,6),new r("issement",35,12),new r("amment",34,13),new r("emment",34,14),new r("aux",-1,10),new r("eaux",39,9),new r("eux",-1,1),new r("ité",-1,7)],l=[new r("ira",-1,1),new r("ie",-1,1),new r("isse",-1,1),new r("issante",-1,1),new r("i",-1,1),new r("irai",4,1),new r("ir",-1,1),new r("iras",-1,1),new r("ies",-1,1),new r("îmes",-1,1),new r("isses",-1,1),new r("issantes",-1,1),new r("îtes",-1,1),new r("is",-1,1),new r("irais",13,1),new r("issais",13,1),new r("irions",-1,1),new r("issions",-1,1),new r("irons",-1,1),new r("issons",-1,1),new r("issants",-1,1),new r("it",-1,1),new r("irait",21,1),new r("issait",21,1),new r("issant",-1,1),new r("iraIent",-1,1),new r("issaIent",-1,1),new r("irent",-1,1),new r("issent",-1,1),new r("iront",-1,1),new r("ît",-1,1),new r("iriez",-1,1),new r("issiez",-1,1),new r("irez",-1,1),new r("issez",-1,1)],w=[new r("a",-1,3),new r("era",0,2),new r("asse",-1,3),new r("ante",-1,3),new r("ée",-1,2),new r("ai",-1,3),new r("erai",5,2),new r("er",-1,2),new r("as",-1,3),new r("eras",8,2),new r("âmes",-1,3),new r("asses",-1,3),new r("antes",-1,3),new r("âtes",-1,3),new r("ées",-1,2),new r("ais",-1,3),new r("erais",15,2),new r("ions",-1,1),new r("erions",17,2),new r("assions",17,3),new r("erons",-1,2),new r("ants",-1,3),new r("és",-1,2),new r("ait",-1,3),new r("erait",23,2),new r("ant",-1,3),new r("aIent",-1,3),new r("eraIent",26,2),new r("èrent",-1,2),new r("assent",-1,3),new r("eront",-1,2),new r("ât",-1,3),new r("ez",-1,2),new r("iez",32,2),new r("eriez",33,2),new r("assiez",33,3),new r("erez",32,2),new r("é",-1,2)],f=[new r("e",-1,3),new r("Ière",0,2),new r("ière",0,2),new r("ion",-1,1),new r("Ier",-1,2),new r("ier",-1,2),new r("ë",-1,4)],m=[new r("ell",-1,-1),new r("eill",-1,-1),new r("enn",-1,-1),new r("onn",-1,-1),new r("ett",-1,-1)],_=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,128,130,103,8,5],b=[1,65,20,0,0,0,0,0,0,0,0,0,0,0,0,0,128],d=new y;function k(e,r,s){return!(!d.eq_s(1,e)||(d.ket=d.cursor,!d.in_grouping(_,97,251)))&&(d.slice_from(r),d.cursor=s,!0)}function p(e,r,s){return!!d.eq_s(1,e)&&(d.ket=d.cursor,d.slice_from(r),d.cursor=s,!0)}function g(){for(;!d.in_grouping(_,97,251);){if(d.cursor>=d.limit)return!0;d.cursor++}for(;!d.out_grouping(_,97,251);){if(d.cursor>=d.limit)return!0;d.cursor++}return!1}function q(){return t<=d.cursor}function v(){return i<=d.cursor}function h(){return s<=d.cursor}function z(){if(!function(){var e,r;if(d.ket=d.cursor,e=d.find_among_b(a,43)){switch(d.bra=d.cursor,e){case 1:if(!h())return!1;d.slice_del();break;case 2:if(!h())return!1;d.slice_del(),d.ket=d.cursor,d.eq_s_b(2,"ic")&&(d.bra=d.cursor,h()?d.slice_del():d.slice_from("iqU"));break;case 3:if(!h())return!1;d.slice_from("log");break;case 4:if(!h())return!1;d.slice_from("u");break;case 5:if(!h())return!1;d.slice_from("ent");break;case 6:if(!q())return!1;if(d.slice_del(),d.ket=d.cursor,e=d.find_among_b(o,6))switch(d.bra=d.cursor,e){case 1:h()&&(d.slice_del(),d.ket=d.cursor,d.eq_s_b(2,"at")&&(d.bra=d.cursor,h()&&d.slice_del()));break;case 2:h()?d.slice_del():v()&&d.slice_from("eux");break;case 3:h()&&d.slice_del();break;case 4:q()&&d.slice_from("i")}break;case 7:if(!h())return!1;if(d.slice_del(),d.ket=d.cursor,e=d.find_among_b(c,3))switch(d.bra=d.cursor,e){case 1:h()?d.slice_del():d.slice_from("abl");break;case 2:h()?d.slice_del():d.slice_from("iqU");break;case 3:h()&&d.slice_del()}break;case 8:if(!h())return!1;if(d.slice_del(),d.ket=d.cursor,d.eq_s_b(2,"at")&&(d.bra=d.cursor,h()&&(d.slice_del(),d.ket=d.cursor,d.eq_s_b(2,"ic")))){d.bra=d.cursor,h()?d.slice_del():d.slice_from("iqU");break}break;case 9:d.slice_from("eau");break;case 10:if(!v())return!1;d.slice_from("al");break;case 11:if(h())d.slice_del();else{if(!v())return!1;d.slice_from("eux")}break;case 12:if(!v()||!d.out_grouping_b(_,97,251))return!1;d.slice_del();break;case 13:return q()&&d.slice_from("ant"),!1;case 14:return q()&&d.slice_from("ent"),!1;case 15:return r=d.limit-d.cursor,d.in_grouping_b(_,97,251)&&q()&&(d.cursor=d.limit-r,d.slice_del()),!1}return!0}return!1}()&&(d.cursor=d.limit,!function(){var e,r;if(d.cursor=t){if(s=d.limit_backward,d.limit_backward=t,d.ket=d.cursor,e=d.find_among_b(f,7))switch(d.bra=d.cursor,e){case 1:if(h()){if(i=d.limit-d.cursor,!d.eq_s_b(1,"s")&&(d.cursor=d.limit-i,!d.eq_s_b(1,"t")))break;d.slice_del()}break;case 2:d.slice_from("i");break;case 3:d.slice_del();break;case 4:d.eq_s_b(2,"gu")&&d.slice_del()}d.limit_backward=s}}();d.cursor=d.limit,d.ket=d.cursor,d.eq_s_b(1,"Y")?(d.bra=d.cursor,d.slice_from("i")):(d.cursor=d.limit,d.eq_s_b(1,"ç")&&(d.bra=d.cursor,d.slice_from("c")))}this.setCurrent=function(e){d.setCurrent(e)},this.getCurrent=function(){return d.getCurrent()},this.stem=function(){var e,r=d.cursor;return function(){for(var e,r;;){if(e=d.cursor,d.in_grouping(_,97,251)){if(d.bra=d.cursor,r=d.cursor,k("u","U",e))continue;if(d.cursor=r,k("i","I",e))continue;if(d.cursor=r,p("y","Y",e))continue}if(d.cursor=e,!k("y","Y",d.bra=e)){if(d.cursor=e,d.eq_s(1,"q")&&(d.bra=d.cursor,p("u","U",e)))continue;if((d.cursor=e)>=d.limit)return;d.cursor++}}}(),d.cursor=r,function(){var e=d.cursor;if(t=d.limit,s=i=t,d.in_grouping(_,97,251)&&d.in_grouping(_,97,251)&&d.cursor=d.limit){d.cursor=t;break}d.cursor++}while(!d.in_grouping(_,97,251))}t=d.cursor,d.cursor=e,g()||(i=d.cursor,g()||(s=d.cursor))}(),d.limit_backward=r,d.cursor=d.limit,z(),d.cursor=d.limit,e=d.limit-d.cursor,d.find_among_b(m,5)&&(d.cursor=d.limit-e,d.ket=d.cursor,d.cursor>d.limit_backward&&(d.cursor--,d.bra=d.cursor,d.slice_del())),d.cursor=d.limit,function(){for(var e,r=1;d.out_grouping_b(_,97,251);)r--;if(r<=0){if(d.ket=d.cursor,e=d.limit-d.cursor,!d.eq_s_b(1,"é")&&(d.cursor=d.limit-e,!d.eq_s_b(1,"è")))return;d.bra=d.cursor,d.slice_from("e")}}(),d.cursor=d.limit_backward,function(){for(var e,r;r=d.cursor,d.bra=r,e=d.find_among(u,4);)switch(d.ket=d.cursor,e){case 1:d.slice_from("i");break;case 2:d.slice_from("u");break;case 3:d.slice_from("y");break;case 4:if(d.cursor>=d.limit)return;d.cursor++}}(),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return s.setCurrent(e),s.stem(),s.getCurrent()}):(s.setCurrent(e),s.stem(),s.getCurrent())}),e.Pipeline.registerFunction(e.fr.stemmer,"stemmer-fr"),e.fr.stopWordFilter=e.generateStopWordFilter("ai aie aient aies ait as au aura aurai auraient aurais aurait auras aurez auriez aurions aurons auront aux avaient avais avait avec avez aviez avions avons ayant ayez ayons c ce ceci celà ces cet cette d dans de des du elle en es est et eu eue eues eurent eus eusse eussent eusses eussiez eussions eut eux eûmes eût eûtes furent fus fusse fussent fusses fussiez fussions fut fûmes fût fûtes ici il ils j je l la le les leur leurs lui m ma mais me mes moi mon même n ne nos notre nous on ont ou par pas pour qu que quel quelle quelles quels qui s sa sans se sera serai seraient serais serait seras serez seriez serions serons seront ses soi soient sois soit sommes son sont soyez soyons suis sur t ta te tes toi ton tu un une vos votre vous y à étaient étais était étant étiez étions été étée étées étés êtes".split(" ")),e.Pipeline.registerFunction(e.fr.stopWordFilter,"stopWordFilter-fr")}}); \ No newline at end of file diff --git a/_static/javascripts/lunr/lunr.hu.js b/_static/javascripts/lunr/lunr.hu.js new file mode 100644 index 00000000..56a4b0dc --- /dev/null +++ b/_static/javascripts/lunr/lunr.hu.js @@ -0,0 +1 @@ +!function(e,n){"function"==typeof define&&define.amd?define(n):"object"==typeof exports?module.exports=n():n()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var p,_,n;e.hu=function(){this.pipeline.reset(),this.pipeline.add(e.hu.trimmer,e.hu.stopWordFilter,e.hu.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.hu.stemmer))},e.hu.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.hu.trimmer=e.trimmerSupport.generateTrimmer(e.hu.wordCharacters),e.Pipeline.registerFunction(e.hu.trimmer,"trimmer-hu"),e.hu.stemmer=(p=e.stemmerSupport.Among,_=e.stemmerSupport.SnowballProgram,n=new function(){var r,i=[new p("cs",-1,-1),new p("dzs",-1,-1),new p("gy",-1,-1),new p("ly",-1,-1),new p("ny",-1,-1),new p("sz",-1,-1),new p("ty",-1,-1),new p("zs",-1,-1)],n=[new p("á",-1,1),new p("é",-1,2)],a=[new p("bb",-1,-1),new p("cc",-1,-1),new p("dd",-1,-1),new p("ff",-1,-1),new p("gg",-1,-1),new p("jj",-1,-1),new p("kk",-1,-1),new p("ll",-1,-1),new p("mm",-1,-1),new p("nn",-1,-1),new p("pp",-1,-1),new p("rr",-1,-1),new p("ccs",-1,-1),new p("ss",-1,-1),new p("zzs",-1,-1),new p("tt",-1,-1),new p("vv",-1,-1),new p("ggy",-1,-1),new p("lly",-1,-1),new p("nny",-1,-1),new p("tty",-1,-1),new p("ssz",-1,-1),new p("zz",-1,-1)],t=[new p("al",-1,1),new p("el",-1,2)],e=[new p("ba",-1,-1),new p("ra",-1,-1),new p("be",-1,-1),new p("re",-1,-1),new p("ig",-1,-1),new p("nak",-1,-1),new p("nek",-1,-1),new p("val",-1,-1),new p("vel",-1,-1),new p("ul",-1,-1),new p("nál",-1,-1),new p("nél",-1,-1),new p("ból",-1,-1),new p("ról",-1,-1),new p("tól",-1,-1),new p("bõl",-1,-1),new p("rõl",-1,-1),new p("tõl",-1,-1),new p("ül",-1,-1),new p("n",-1,-1),new p("an",19,-1),new p("ban",20,-1),new p("en",19,-1),new p("ben",22,-1),new p("képpen",22,-1),new p("on",19,-1),new p("ön",19,-1),new p("képp",-1,-1),new p("kor",-1,-1),new p("t",-1,-1),new p("at",29,-1),new p("et",29,-1),new p("ként",29,-1),new p("anként",32,-1),new p("enként",32,-1),new p("onként",32,-1),new p("ot",29,-1),new p("ért",29,-1),new p("öt",29,-1),new p("hez",-1,-1),new p("hoz",-1,-1),new p("höz",-1,-1),new p("vá",-1,-1),new p("vé",-1,-1)],s=[new p("án",-1,2),new p("én",-1,1),new p("ánként",-1,3)],c=[new p("stul",-1,2),new p("astul",0,1),new p("ástul",0,3),new p("stül",-1,2),new p("estül",3,1),new p("éstül",3,4)],w=[new p("á",-1,1),new p("é",-1,2)],o=[new p("k",-1,7),new p("ak",0,4),new p("ek",0,6),new p("ok",0,5),new p("ák",0,1),new p("ék",0,2),new p("ök",0,3)],l=[new p("éi",-1,7),new p("áéi",0,6),new p("ééi",0,5),new p("é",-1,9),new p("ké",3,4),new p("aké",4,1),new p("eké",4,1),new p("oké",4,1),new p("áké",4,3),new p("éké",4,2),new p("öké",4,1),new p("éé",3,8)],u=[new p("a",-1,18),new p("ja",0,17),new p("d",-1,16),new p("ad",2,13),new p("ed",2,13),new p("od",2,13),new p("ád",2,14),new p("éd",2,15),new p("öd",2,13),new p("e",-1,18),new p("je",9,17),new p("nk",-1,4),new p("unk",11,1),new p("ánk",11,2),new p("énk",11,3),new p("ünk",11,1),new p("uk",-1,8),new p("juk",16,7),new p("ájuk",17,5),new p("ük",-1,8),new p("jük",19,7),new p("éjük",20,6),new p("m",-1,12),new p("am",22,9),new p("em",22,9),new p("om",22,9),new p("ám",22,10),new p("ém",22,11),new p("o",-1,18),new p("á",-1,19),new p("é",-1,20)],m=[new p("id",-1,10),new p("aid",0,9),new p("jaid",1,6),new p("eid",0,9),new p("jeid",3,6),new p("áid",0,7),new p("éid",0,8),new p("i",-1,15),new p("ai",7,14),new p("jai",8,11),new p("ei",7,14),new p("jei",10,11),new p("ái",7,12),new p("éi",7,13),new p("itek",-1,24),new p("eitek",14,21),new p("jeitek",15,20),new p("éitek",14,23),new p("ik",-1,29),new p("aik",18,26),new p("jaik",19,25),new p("eik",18,26),new p("jeik",21,25),new p("áik",18,27),new p("éik",18,28),new p("ink",-1,20),new p("aink",25,17),new p("jaink",26,16),new p("eink",25,17),new p("jeink",28,16),new p("áink",25,18),new p("éink",25,19),new p("aitok",-1,21),new p("jaitok",32,20),new p("áitok",-1,22),new p("im",-1,5),new p("aim",35,4),new p("jaim",36,1),new p("eim",35,4),new p("jeim",38,1),new p("áim",35,2),new p("éim",35,3)],k=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,1,17,52,14],f=new _;function b(){return r<=f.cursor}function d(){var e=f.limit-f.cursor;return!!f.find_among_b(a,23)&&(f.cursor=f.limit-e,!0)}function g(){if(f.cursor>f.limit_backward){f.cursor--,f.ket=f.cursor;var e=f.cursor-1;f.limit_backward<=e&&e<=f.limit&&(f.cursor=e,f.bra=e,f.slice_del())}}function h(){f.ket=f.cursor,f.find_among_b(e,44)&&(f.bra=f.cursor,b()&&(f.slice_del(),function(){var e;if(f.ket=f.cursor,(e=f.find_among_b(n,2))&&(f.bra=f.cursor,b()))switch(e){case 1:f.slice_from("a");break;case 2:f.slice_from("e")}}()))}this.setCurrent=function(e){f.setCurrent(e)},this.getCurrent=function(){return f.getCurrent()},this.stem=function(){var e=f.cursor;return function(){var e,n=f.cursor;if(r=f.limit,f.in_grouping(k,97,252))for(;;){if(e=f.cursor,f.out_grouping(k,97,252))return f.cursor=e,f.find_among(i,8)||(f.cursor=e)=f.limit)return r=e;f.cursor++}if(f.cursor=n,f.out_grouping(k,97,252)){for(;!f.in_grouping(k,97,252);){if(f.cursor>=f.limit)return;f.cursor++}r=f.cursor}}(),f.limit_backward=e,f.cursor=f.limit,function(){var e;if(f.ket=f.cursor,(e=f.find_among_b(t,2))&&(f.bra=f.cursor,b())){if((1==e||2==e)&&!d())return;f.slice_del(),g()}}(),f.cursor=f.limit,h(),f.cursor=f.limit,function(){var e;if(f.ket=f.cursor,(e=f.find_among_b(s,3))&&(f.bra=f.cursor,b()))switch(e){case 1:f.slice_from("e");break;case 2:case 3:f.slice_from("a")}}(),f.cursor=f.limit,function(){var e;if(f.ket=f.cursor,(e=f.find_among_b(c,6))&&(f.bra=f.cursor,b()))switch(e){case 1:case 2:f.slice_del();break;case 3:f.slice_from("a");break;case 4:f.slice_from("e")}}(),f.cursor=f.limit,function(){var e;if(f.ket=f.cursor,(e=f.find_among_b(w,2))&&(f.bra=f.cursor,b())){if((1==e||2==e)&&!d())return;f.slice_del(),g()}}(),f.cursor=f.limit,function(){var e;if(f.ket=f.cursor,(e=f.find_among_b(l,12))&&(f.bra=f.cursor,b()))switch(e){case 1:case 4:case 7:case 9:f.slice_del();break;case 2:case 5:case 8:f.slice_from("e");break;case 3:case 6:f.slice_from("a")}}(),f.cursor=f.limit,function(){var e;if(f.ket=f.cursor,(e=f.find_among_b(u,31))&&(f.bra=f.cursor,b()))switch(e){case 1:case 4:case 7:case 8:case 9:case 12:case 13:case 16:case 17:case 18:f.slice_del();break;case 2:case 5:case 10:case 14:case 19:f.slice_from("a");break;case 3:case 6:case 11:case 15:case 20:f.slice_from("e")}}(),f.cursor=f.limit,function(){var e;if(f.ket=f.cursor,(e=f.find_among_b(m,42))&&(f.bra=f.cursor,b()))switch(e){case 1:case 4:case 5:case 6:case 9:case 10:case 11:case 14:case 15:case 16:case 17:case 20:case 21:case 24:case 25:case 26:case 29:f.slice_del();break;case 2:case 7:case 12:case 18:case 22:case 27:f.slice_from("a");break;case 3:case 8:case 13:case 19:case 23:case 28:f.slice_from("e")}}(),f.cursor=f.limit,function(){var e;if(f.ket=f.cursor,(e=f.find_among_b(o,7))&&(f.bra=f.cursor,b()))switch(e){case 1:f.slice_from("a");break;case 2:f.slice_from("e");break;case 3:case 4:case 5:case 6:case 7:f.slice_del()}}(),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return n.setCurrent(e),n.stem(),n.getCurrent()}):(n.setCurrent(e),n.stem(),n.getCurrent())}),e.Pipeline.registerFunction(e.hu.stemmer,"stemmer-hu"),e.hu.stopWordFilter=e.generateStopWordFilter("a abban ahhoz ahogy ahol aki akik akkor alatt amely amelyek amelyekben amelyeket amelyet amelynek ami amikor amit amolyan amíg annak arra arról az azok azon azonban azt aztán azután azzal azért be belül benne bár cikk cikkek cikkeket csak de e ebben eddig egy egyes egyetlen egyik egyre egyéb egész ehhez ekkor el ellen elsõ elég elõ elõször elõtt emilyen ennek erre ez ezek ezen ezt ezzel ezért fel felé hanem hiszen hogy hogyan igen ill ill. illetve ilyen ilyenkor ismét ison itt jobban jó jól kell kellett keressünk keresztül ki kívül között közül legalább legyen lehet lehetett lenne lenni lesz lett maga magát majd majd meg mellett mely melyek mert mi mikor milyen minden mindenki mindent mindig mint mintha mit mivel miért most már más másik még míg nagy nagyobb nagyon ne nekem neki nem nincs néha néhány nélkül olyan ott pedig persze rá s saját sem semmi sok sokat sokkal szemben szerint szinte számára talán tehát teljes tovább továbbá több ugyanis utolsó után utána vagy vagyis vagyok valaki valami valamint való van vannak vele vissza viszont volna volt voltak voltam voltunk által általában át én éppen és így õ õk õket össze úgy új újabb újra".split(" ")),e.Pipeline.registerFunction(e.hu.stopWordFilter,"stopWordFilter-hu")}}); \ No newline at end of file diff --git a/_static/javascripts/lunr/lunr.it.js b/_static/javascripts/lunr/lunr.it.js new file mode 100644 index 00000000..50dddaa0 --- /dev/null +++ b/_static/javascripts/lunr/lunr.it.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var z,P,r;e.it=function(){this.pipeline.reset(),this.pipeline.add(e.it.trimmer,e.it.stopWordFilter,e.it.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.it.stemmer))},e.it.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.it.trimmer=e.trimmerSupport.generateTrimmer(e.it.wordCharacters),e.Pipeline.registerFunction(e.it.trimmer,"trimmer-it"),e.it.stemmer=(z=e.stemmerSupport.Among,P=e.stemmerSupport.SnowballProgram,r=new function(){var o,t,s,a=[new z("",-1,7),new z("qu",0,6),new z("á",0,1),new z("é",0,2),new z("í",0,3),new z("ó",0,4),new z("ú",0,5)],u=[new z("",-1,3),new z("I",0,1),new z("U",0,2)],c=[new z("la",-1,-1),new z("cela",0,-1),new z("gliela",0,-1),new z("mela",0,-1),new z("tela",0,-1),new z("vela",0,-1),new z("le",-1,-1),new z("cele",6,-1),new z("gliele",6,-1),new z("mele",6,-1),new z("tele",6,-1),new z("vele",6,-1),new z("ne",-1,-1),new z("cene",12,-1),new z("gliene",12,-1),new z("mene",12,-1),new z("sene",12,-1),new z("tene",12,-1),new z("vene",12,-1),new z("ci",-1,-1),new z("li",-1,-1),new z("celi",20,-1),new z("glieli",20,-1),new z("meli",20,-1),new z("teli",20,-1),new z("veli",20,-1),new z("gli",20,-1),new z("mi",-1,-1),new z("si",-1,-1),new z("ti",-1,-1),new z("vi",-1,-1),new z("lo",-1,-1),new z("celo",31,-1),new z("glielo",31,-1),new z("melo",31,-1),new z("telo",31,-1),new z("velo",31,-1)],w=[new z("ando",-1,1),new z("endo",-1,1),new z("ar",-1,2),new z("er",-1,2),new z("ir",-1,2)],r=[new z("ic",-1,-1),new z("abil",-1,-1),new z("os",-1,-1),new z("iv",-1,1)],n=[new z("ic",-1,1),new z("abil",-1,1),new z("iv",-1,1)],i=[new z("ica",-1,1),new z("logia",-1,3),new z("osa",-1,1),new z("ista",-1,1),new z("iva",-1,9),new z("anza",-1,1),new z("enza",-1,5),new z("ice",-1,1),new z("atrice",7,1),new z("iche",-1,1),new z("logie",-1,3),new z("abile",-1,1),new z("ibile",-1,1),new z("usione",-1,4),new z("azione",-1,2),new z("uzione",-1,4),new z("atore",-1,2),new z("ose",-1,1),new z("ante",-1,1),new z("mente",-1,1),new z("amente",19,7),new z("iste",-1,1),new z("ive",-1,9),new z("anze",-1,1),new z("enze",-1,5),new z("ici",-1,1),new z("atrici",25,1),new z("ichi",-1,1),new z("abili",-1,1),new z("ibili",-1,1),new z("ismi",-1,1),new z("usioni",-1,4),new z("azioni",-1,2),new z("uzioni",-1,4),new z("atori",-1,2),new z("osi",-1,1),new z("anti",-1,1),new z("amenti",-1,6),new z("imenti",-1,6),new z("isti",-1,1),new z("ivi",-1,9),new z("ico",-1,1),new z("ismo",-1,1),new z("oso",-1,1),new z("amento",-1,6),new z("imento",-1,6),new z("ivo",-1,9),new z("ità",-1,8),new z("istà",-1,1),new z("istè",-1,1),new z("istì",-1,1)],l=[new z("isca",-1,1),new z("enda",-1,1),new z("ata",-1,1),new z("ita",-1,1),new z("uta",-1,1),new z("ava",-1,1),new z("eva",-1,1),new z("iva",-1,1),new z("erebbe",-1,1),new z("irebbe",-1,1),new z("isce",-1,1),new z("ende",-1,1),new z("are",-1,1),new z("ere",-1,1),new z("ire",-1,1),new z("asse",-1,1),new z("ate",-1,1),new z("avate",16,1),new z("evate",16,1),new z("ivate",16,1),new z("ete",-1,1),new z("erete",20,1),new z("irete",20,1),new z("ite",-1,1),new z("ereste",-1,1),new z("ireste",-1,1),new z("ute",-1,1),new z("erai",-1,1),new z("irai",-1,1),new z("isci",-1,1),new z("endi",-1,1),new z("erei",-1,1),new z("irei",-1,1),new z("assi",-1,1),new z("ati",-1,1),new z("iti",-1,1),new z("eresti",-1,1),new z("iresti",-1,1),new z("uti",-1,1),new z("avi",-1,1),new z("evi",-1,1),new z("ivi",-1,1),new z("isco",-1,1),new z("ando",-1,1),new z("endo",-1,1),new z("Yamo",-1,1),new z("iamo",-1,1),new z("avamo",-1,1),new z("evamo",-1,1),new z("ivamo",-1,1),new z("eremo",-1,1),new z("iremo",-1,1),new z("assimo",-1,1),new z("ammo",-1,1),new z("emmo",-1,1),new z("eremmo",54,1),new z("iremmo",54,1),new z("immo",-1,1),new z("ano",-1,1),new z("iscano",58,1),new z("avano",58,1),new z("evano",58,1),new z("ivano",58,1),new z("eranno",-1,1),new z("iranno",-1,1),new z("ono",-1,1),new z("iscono",65,1),new z("arono",65,1),new z("erono",65,1),new z("irono",65,1),new z("erebbero",-1,1),new z("irebbero",-1,1),new z("assero",-1,1),new z("essero",-1,1),new z("issero",-1,1),new z("ato",-1,1),new z("ito",-1,1),new z("uto",-1,1),new z("avo",-1,1),new z("evo",-1,1),new z("ivo",-1,1),new z("ar",-1,1),new z("ir",-1,1),new z("erà",-1,1),new z("irà",-1,1),new z("erò",-1,1),new z("irò",-1,1)],m=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,128,128,8,2,1],f=[17,65,0,0,0,0,0,0,0,0,0,0,0,0,0,128,128,8,2],v=[17],b=new P;function d(e,r,n){return!(!b.eq_s(1,e)||(b.ket=b.cursor,!b.in_grouping(m,97,249)))&&(b.slice_from(r),b.cursor=n,!0)}function _(e){if(b.cursor=e,!b.in_grouping(m,97,249))return!1;for(;!b.out_grouping(m,97,249);){if(b.cursor>=b.limit)return!1;b.cursor++}return!0}function g(){var e,r=b.cursor;if(!function(){if(b.in_grouping(m,97,249)){var e=b.cursor;if(b.out_grouping(m,97,249)){for(;!b.in_grouping(m,97,249);){if(b.cursor>=b.limit)return _(e);b.cursor++}return!0}return _(e)}return!1}()){if(b.cursor=r,!b.out_grouping(m,97,249))return;if(e=b.cursor,b.out_grouping(m,97,249)){for(;!b.in_grouping(m,97,249);){if(b.cursor>=b.limit)return b.cursor=e,void(b.in_grouping(m,97,249)&&b.cursor=b.limit)return;b.cursor++}s=b.cursor}function p(){for(;!b.in_grouping(m,97,249);){if(b.cursor>=b.limit)return!1;b.cursor++}for(;!b.out_grouping(m,97,249);){if(b.cursor>=b.limit)return!1;b.cursor++}return!0}function k(){return s<=b.cursor}function h(){return o<=b.cursor}function q(){var e;if(b.ket=b.cursor,!(e=b.find_among_b(i,51)))return!1;switch(b.bra=b.cursor,e){case 1:if(!h())return!1;b.slice_del();break;case 2:if(!h())return!1;b.slice_del(),b.ket=b.cursor,b.eq_s_b(2,"ic")&&(b.bra=b.cursor,h()&&b.slice_del());break;case 3:if(!h())return!1;b.slice_from("log");break;case 4:if(!h())return!1;b.slice_from("u");break;case 5:if(!h())return!1;b.slice_from("ente");break;case 6:if(!k())return!1;b.slice_del();break;case 7:if(!(t<=b.cursor))return!1;b.slice_del(),b.ket=b.cursor,(e=b.find_among_b(r,4))&&(b.bra=b.cursor,h()&&(b.slice_del(),1==e&&(b.ket=b.cursor,b.eq_s_b(2,"at")&&(b.bra=b.cursor,h()&&b.slice_del()))));break;case 8:if(!h())return!1;b.slice_del(),b.ket=b.cursor,(e=b.find_among_b(n,3))&&(b.bra=b.cursor,1==e&&h()&&b.slice_del());break;case 9:if(!h())return!1;b.slice_del(),b.ket=b.cursor,b.eq_s_b(2,"at")&&(b.bra=b.cursor,h()&&(b.slice_del(),b.ket=b.cursor,b.eq_s_b(2,"ic")&&(b.bra=b.cursor,h()&&b.slice_del())))}return!0}function C(){var e;e=b.limit-b.cursor,b.ket=b.cursor,b.in_grouping_b(f,97,242)&&(b.bra=b.cursor,k()&&(b.slice_del(),b.ket=b.cursor,b.eq_s_b(1,"i")&&(b.bra=b.cursor,k())))?b.slice_del():b.cursor=b.limit-e,b.ket=b.cursor,b.eq_s_b(1,"h")&&(b.bra=b.cursor,b.in_grouping_b(v,99,103)&&k()&&b.slice_del())}this.setCurrent=function(e){b.setCurrent(e)},this.getCurrent=function(){return b.getCurrent()},this.stem=function(){var e,r,n,i=b.cursor;return function(){for(var e,r,n,i,o=b.cursor;;){if(b.bra=b.cursor,e=b.find_among(a,7))switch(b.ket=b.cursor,e){case 1:b.slice_from("à");continue;case 2:b.slice_from("è");continue;case 3:b.slice_from("ì");continue;case 4:b.slice_from("ò");continue;case 5:b.slice_from("ù");continue;case 6:b.slice_from("qU");continue;case 7:if(b.cursor>=b.limit)break;b.cursor++;continue}break}for(b.cursor=o;;)for(r=b.cursor;;){if(n=b.cursor,b.in_grouping(m,97,249)){if(b.bra=b.cursor,i=b.cursor,d("u","U",n))break;if(b.cursor=i,d("i","I",n))break}if(b.cursor=n,b.cursor>=b.limit)return b.cursor=r;b.cursor++}}(),b.cursor=i,e=b.cursor,s=b.limit,o=t=s,g(),b.cursor=e,p()&&(t=b.cursor,p()&&(o=b.cursor)),b.limit_backward=i,b.cursor=b.limit,function(){var e;if(b.ket=b.cursor,b.find_among_b(c,37)&&(b.bra=b.cursor,(e=b.find_among_b(w,5))&&k()))switch(e){case 1:b.slice_del();break;case 2:b.slice_from("e")}}(),b.cursor=b.limit,q()||(b.cursor=b.limit,b.cursor>=s&&(n=b.limit_backward,b.limit_backward=s,b.ket=b.cursor,(r=b.find_among_b(l,87))&&(b.bra=b.cursor,1==r&&b.slice_del()),b.limit_backward=n)),b.cursor=b.limit,C(),b.cursor=b.limit_backward,function(){for(var e;b.bra=b.cursor,e=b.find_among(u,3);)switch(b.ket=b.cursor,e){case 1:b.slice_from("i");break;case 2:b.slice_from("u");break;case 3:if(b.cursor>=b.limit)return;b.cursor++}}(),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return r.setCurrent(e),r.stem(),r.getCurrent()}):(r.setCurrent(e),r.stem(),r.getCurrent())}),e.Pipeline.registerFunction(e.it.stemmer,"stemmer-it"),e.it.stopWordFilter=e.generateStopWordFilter("a abbia abbiamo abbiano abbiate ad agl agli ai al all alla alle allo anche avemmo avendo avesse avessero avessi avessimo aveste avesti avete aveva avevamo avevano avevate avevi avevo avrai avranno avrebbe avrebbero avrei avremmo avremo avreste avresti avrete avrà avrò avuta avute avuti avuto c che chi ci coi col come con contro cui da dagl dagli dai dal dall dalla dalle dallo degl degli dei del dell della delle dello di dov dove e ebbe ebbero ebbi ed era erano eravamo eravate eri ero essendo faccia facciamo facciano facciate faccio facemmo facendo facesse facessero facessi facessimo faceste facesti faceva facevamo facevano facevate facevi facevo fai fanno farai faranno farebbe farebbero farei faremmo faremo fareste faresti farete farà farò fece fecero feci fosse fossero fossi fossimo foste fosti fu fui fummo furono gli ha hai hanno ho i il in io l la le lei li lo loro lui ma mi mia mie miei mio ne negl negli nei nel nell nella nelle nello noi non nostra nostre nostri nostro o per perché più quale quanta quante quanti quanto quella quelle quelli quello questa queste questi questo sarai saranno sarebbe sarebbero sarei saremmo saremo sareste saresti sarete sarà sarò se sei si sia siamo siano siate siete sono sta stai stando stanno starai staranno starebbe starebbero starei staremmo staremo stareste staresti starete starà starò stava stavamo stavano stavate stavi stavo stemmo stesse stessero stessi stessimo steste stesti stette stettero stetti stia stiamo stiano stiate sto su sua sue sugl sugli sui sul sull sulla sulle sullo suo suoi ti tra tu tua tue tuo tuoi tutti tutto un una uno vi voi vostra vostre vostri vostro è".split(" ")),e.Pipeline.registerFunction(e.it.stopWordFilter,"stopWordFilter-it")}}); \ No newline at end of file diff --git a/_static/javascripts/lunr/lunr.ja.js b/_static/javascripts/lunr/lunr.ja.js new file mode 100644 index 00000000..69f62025 --- /dev/null +++ b/_static/javascripts/lunr/lunr.ja.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(m){if(void 0===m)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===m.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var l="2"==m.version[0];m.ja=function(){this.pipeline.reset(),this.pipeline.add(m.ja.trimmer,m.ja.stopWordFilter,m.ja.stemmer),l?this.tokenizer=m.ja.tokenizer:(m.tokenizer&&(m.tokenizer=m.ja.tokenizer),this.tokenizerFn&&(this.tokenizerFn=m.ja.tokenizer))};var j=new m.TinySegmenter;m.ja.tokenizer=function(e){var r,t,i,n,o,s,p,a,u;if(!arguments.length||null==e||null==e)return[];if(Array.isArray(e))return e.map(function(e){return l?new m.Token(e.toLowerCase()):e.toLowerCase()});for(r=(t=e.toString().toLowerCase().replace(/^\s+/,"")).length-1;0<=r;r--)if(/\S/.test(t.charAt(r))){t=t.substring(0,r+1);break}for(o=[],i=t.length,p=a=0;a<=i;a++)if(s=a-p,t.charAt(a).match(/\s/)||a==i){if(0=_.limit||(_.cursor++,!1)}function w(){for(;!_.in_grouping(m,97,232);){if(_.cursor>=_.limit)return!0;_.cursor++}for(;!_.out_grouping(m,97,232);){if(_.cursor>=_.limit)return!0;_.cursor++}return!1}function b(){return i<=_.cursor}function p(){return e<=_.cursor}function g(){var r=_.limit-_.cursor;_.find_among_b(t,3)&&(_.cursor=_.limit-r,_.ket=_.cursor,_.cursor>_.limit_backward&&(_.cursor--,_.bra=_.cursor,_.slice_del()))}function h(){var r;u=!1,_.ket=_.cursor,_.eq_s_b(1,"e")&&(_.bra=_.cursor,b()&&(r=_.limit-_.cursor,_.out_grouping_b(m,97,232)&&(_.cursor=_.limit-r,_.slice_del(),u=!0,g())))}function k(){var r;b()&&(r=_.limit-_.cursor,_.out_grouping_b(m,97,232)&&(_.cursor=_.limit-r,_.eq_s_b(3,"gem")||(_.cursor=_.limit-r,_.slice_del(),g())))}this.setCurrent=function(r){_.setCurrent(r)},this.getCurrent=function(){return _.getCurrent()},this.stem=function(){var r=_.cursor;return function(){for(var r,e,i,n=_.cursor;;){if(_.bra=_.cursor,r=_.find_among(o,11))switch(_.ket=_.cursor,r){case 1:_.slice_from("a");continue;case 2:_.slice_from("e");continue;case 3:_.slice_from("i");continue;case 4:_.slice_from("o");continue;case 5:_.slice_from("u");continue;case 6:if(_.cursor>=_.limit)break;_.cursor++;continue}break}for(_.cursor=n,_.bra=n,_.eq_s(1,"y")?(_.ket=_.cursor,_.slice_from("Y")):_.cursor=n;;)if(e=_.cursor,_.in_grouping(m,97,232)){if(i=_.cursor,_.bra=i,_.eq_s(1,"i"))_.ket=_.cursor,_.in_grouping(m,97,232)&&(_.slice_from("I"),_.cursor=e);else if(_.cursor=i,_.eq_s(1,"y"))_.ket=_.cursor,_.slice_from("Y"),_.cursor=e;else if(s(e))break}else if(s(e))break}(),_.cursor=r,i=_.limit,e=i,w()||((i=_.cursor)<3&&(i=3),w()||(e=_.cursor)),_.limit_backward=r,_.cursor=_.limit,function(){var r,e,i,n,o,t,s=_.limit-_.cursor;if(_.ket=_.cursor,r=_.find_among_b(c,5))switch(_.bra=_.cursor,r){case 1:b()&&_.slice_from("heid");break;case 2:k();break;case 3:b()&&_.out_grouping_b(f,97,232)&&_.slice_del()}if(_.cursor=_.limit-s,h(),_.cursor=_.limit-s,_.ket=_.cursor,_.eq_s_b(4,"heid")&&(_.bra=_.cursor,p()&&(e=_.limit-_.cursor,_.eq_s_b(1,"c")||(_.cursor=_.limit-e,_.slice_del(),_.ket=_.cursor,_.eq_s_b(2,"en")&&(_.bra=_.cursor,k())))),_.cursor=_.limit-s,_.ket=_.cursor,r=_.find_among_b(a,6))switch(_.bra=_.cursor,r){case 1:if(p()){if(_.slice_del(),i=_.limit-_.cursor,_.ket=_.cursor,_.eq_s_b(2,"ig")&&(_.bra=_.cursor,p()&&(n=_.limit-_.cursor,!_.eq_s_b(1,"e")))){_.cursor=_.limit-n,_.slice_del();break}_.cursor=_.limit-i,g()}break;case 2:p()&&(o=_.limit-_.cursor,_.eq_s_b(1,"e")||(_.cursor=_.limit-o,_.slice_del()));break;case 3:p()&&(_.slice_del(),h());break;case 4:p()&&_.slice_del();break;case 5:p()&&u&&_.slice_del()}_.cursor=_.limit-s,_.out_grouping_b(d,73,232)&&(t=_.limit-_.cursor,_.find_among_b(l,4)&&_.out_grouping_b(m,97,232)&&(_.cursor=_.limit-t,_.ket=_.cursor,_.cursor>_.limit_backward&&(_.cursor--,_.bra=_.cursor,_.slice_del())))}(),_.cursor=_.limit_backward,function(){for(var r;;)if(_.bra=_.cursor,r=_.find_among(n,3))switch(_.ket=_.cursor,r){case 1:_.slice_from("y");break;case 2:_.slice_from("i");break;case 3:if(_.cursor>=_.limit)return;_.cursor++}}(),!0}},function(r){return"function"==typeof r.update?r.update(function(r){return e.setCurrent(r),e.stem(),e.getCurrent()}):(e.setCurrent(r),e.stem(),e.getCurrent())}),r.Pipeline.registerFunction(r.nl.stemmer,"stemmer-nl"),r.nl.stopWordFilter=r.generateStopWordFilter(" aan al alles als altijd andere ben bij daar dan dat de der deze die dit doch doen door dus een eens en er ge geen geweest haar had heb hebben heeft hem het hier hij hoe hun iemand iets ik in is ja je kan kon kunnen maar me meer men met mij mijn moet na naar niet niets nog nu of om omdat onder ons ook op over reeds te tegen toch toen tot u uit uw van veel voor want waren was wat werd wezen wie wil worden wordt zal ze zelf zich zij zijn zo zonder zou".split(" ")),r.Pipeline.registerFunction(r.nl.stopWordFilter,"stopWordFilter-nl")}}); \ No newline at end of file diff --git a/_static/javascripts/lunr/lunr.no.js b/_static/javascripts/lunr/lunr.no.js new file mode 100644 index 00000000..3d156b9c --- /dev/null +++ b/_static/javascripts/lunr/lunr.no.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var r,n,i;e.no=function(){this.pipeline.reset(),this.pipeline.add(e.no.trimmer,e.no.stopWordFilter,e.no.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.no.stemmer))},e.no.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.no.trimmer=e.trimmerSupport.generateTrimmer(e.no.wordCharacters),e.Pipeline.registerFunction(e.no.trimmer,"trimmer-no"),e.no.stemmer=(r=e.stemmerSupport.Among,n=e.stemmerSupport.SnowballProgram,i=new function(){var o,s,a=[new r("a",-1,1),new r("e",-1,1),new r("ede",1,1),new r("ande",1,1),new r("ende",1,1),new r("ane",1,1),new r("ene",1,1),new r("hetene",6,1),new r("erte",1,3),new r("en",-1,1),new r("heten",9,1),new r("ar",-1,1),new r("er",-1,1),new r("heter",12,1),new r("s",-1,2),new r("as",14,1),new r("es",14,1),new r("edes",16,1),new r("endes",16,1),new r("enes",16,1),new r("hetenes",19,1),new r("ens",14,1),new r("hetens",21,1),new r("ers",14,1),new r("ets",14,1),new r("et",-1,1),new r("het",25,1),new r("ert",-1,3),new r("ast",-1,1)],m=[new r("dt",-1,-1),new r("vt",-1,-1)],l=[new r("leg",-1,1),new r("eleg",0,1),new r("ig",-1,1),new r("eig",2,1),new r("lig",2,1),new r("elig",4,1),new r("els",-1,1),new r("lov",-1,1),new r("elov",7,1),new r("slov",7,1),new r("hetslov",9,1)],u=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,48,0,128],d=[119,125,149,1],c=new n;this.setCurrent=function(e){c.setCurrent(e)},this.getCurrent=function(){return c.getCurrent()},this.stem=function(){var e,r,n,i,t=c.cursor;return function(){var e,r=c.cursor+3;if(s=c.limit,0<=r||r<=c.limit){for(o=r;;){if(e=c.cursor,c.in_grouping(u,97,248)){c.cursor=e;break}if(e>=c.limit)return;c.cursor=e+1}for(;!c.out_grouping(u,97,248);){if(c.cursor>=c.limit)return;c.cursor++}(s=c.cursor)=s&&(r=c.limit_backward,c.limit_backward=s,c.ket=c.cursor,e=c.find_among_b(a,29),c.limit_backward=r,e))switch(c.bra=c.cursor,e){case 1:c.slice_del();break;case 2:n=c.limit-c.cursor,c.in_grouping_b(d,98,122)?c.slice_del():(c.cursor=c.limit-n,c.eq_s_b(1,"k")&&c.out_grouping_b(u,97,248)&&c.slice_del());break;case 3:c.slice_from("er")}}(),c.cursor=c.limit,r=c.limit-c.cursor,c.cursor>=s&&(e=c.limit_backward,c.limit_backward=s,c.ket=c.cursor,c.find_among_b(m,2)?(c.bra=c.cursor,c.limit_backward=e,c.cursor=c.limit-r,c.cursor>c.limit_backward&&(c.cursor--,c.bra=c.cursor,c.slice_del())):c.limit_backward=e),c.cursor=c.limit,c.cursor>=s&&(i=c.limit_backward,c.limit_backward=s,c.ket=c.cursor,(n=c.find_among_b(l,11))?(c.bra=c.cursor,c.limit_backward=i,1==n&&c.slice_del()):c.limit_backward=i),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return i.setCurrent(e),i.stem(),i.getCurrent()}):(i.setCurrent(e),i.stem(),i.getCurrent())}),e.Pipeline.registerFunction(e.no.stemmer,"stemmer-no"),e.no.stopWordFilter=e.generateStopWordFilter("alle at av bare begge ble blei bli blir blitt både båe da de deg dei deim deira deires dem den denne der dere deres det dette di din disse ditt du dykk dykkar då eg ein eit eitt eller elles en enn er et ett etter for fordi fra før ha hadde han hans har hennar henne hennes her hjå ho hoe honom hoss hossen hun hva hvem hver hvilke hvilken hvis hvor hvordan hvorfor i ikke ikkje ikkje ingen ingi inkje inn inni ja jeg kan kom korleis korso kun kunne kva kvar kvarhelst kven kvi kvifor man mange me med medan meg meget mellom men mi min mine mitt mot mykje ned no noe noen noka noko nokon nokor nokre nå når og også om opp oss over på samme seg selv si si sia sidan siden sin sine sitt sjøl skal skulle slik so som som somme somt så sånn til um upp ut uten var vart varte ved vere verte vi vil ville vore vors vort vår være være vært å".split(" ")),e.Pipeline.registerFunction(e.no.stopWordFilter,"stopWordFilter-no")}}); \ No newline at end of file diff --git a/_static/javascripts/lunr/lunr.pt.js b/_static/javascripts/lunr/lunr.pt.js new file mode 100644 index 00000000..f50fc9fa --- /dev/null +++ b/_static/javascripts/lunr/lunr.pt.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var j,C,r;e.pt=function(){this.pipeline.reset(),this.pipeline.add(e.pt.trimmer,e.pt.stopWordFilter,e.pt.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.pt.stemmer))},e.pt.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.pt.trimmer=e.trimmerSupport.generateTrimmer(e.pt.wordCharacters),e.Pipeline.registerFunction(e.pt.trimmer,"trimmer-pt"),e.pt.stemmer=(j=e.stemmerSupport.Among,C=e.stemmerSupport.SnowballProgram,r=new function(){var s,n,i,o=[new j("",-1,3),new j("ã",0,1),new j("õ",0,2)],a=[new j("",-1,3),new j("a~",0,1),new j("o~",0,2)],r=[new j("ic",-1,-1),new j("ad",-1,-1),new j("os",-1,-1),new j("iv",-1,1)],t=[new j("ante",-1,1),new j("avel",-1,1),new j("ível",-1,1)],u=[new j("ic",-1,1),new j("abil",-1,1),new j("iv",-1,1)],w=[new j("ica",-1,1),new j("ância",-1,1),new j("ência",-1,4),new j("ira",-1,9),new j("adora",-1,1),new j("osa",-1,1),new j("ista",-1,1),new j("iva",-1,8),new j("eza",-1,1),new j("logía",-1,2),new j("idade",-1,7),new j("ante",-1,1),new j("mente",-1,6),new j("amente",12,5),new j("ável",-1,1),new j("ível",-1,1),new j("ución",-1,3),new j("ico",-1,1),new j("ismo",-1,1),new j("oso",-1,1),new j("amento",-1,1),new j("imento",-1,1),new j("ivo",-1,8),new j("aça~o",-1,1),new j("ador",-1,1),new j("icas",-1,1),new j("ências",-1,4),new j("iras",-1,9),new j("adoras",-1,1),new j("osas",-1,1),new j("istas",-1,1),new j("ivas",-1,8),new j("ezas",-1,1),new j("logías",-1,2),new j("idades",-1,7),new j("uciones",-1,3),new j("adores",-1,1),new j("antes",-1,1),new j("aço~es",-1,1),new j("icos",-1,1),new j("ismos",-1,1),new j("osos",-1,1),new j("amentos",-1,1),new j("imentos",-1,1),new j("ivos",-1,8)],m=[new j("ada",-1,1),new j("ida",-1,1),new j("ia",-1,1),new j("aria",2,1),new j("eria",2,1),new j("iria",2,1),new j("ara",-1,1),new j("era",-1,1),new j("ira",-1,1),new j("ava",-1,1),new j("asse",-1,1),new j("esse",-1,1),new j("isse",-1,1),new j("aste",-1,1),new j("este",-1,1),new j("iste",-1,1),new j("ei",-1,1),new j("arei",16,1),new j("erei",16,1),new j("irei",16,1),new j("am",-1,1),new j("iam",20,1),new j("ariam",21,1),new j("eriam",21,1),new j("iriam",21,1),new j("aram",20,1),new j("eram",20,1),new j("iram",20,1),new j("avam",20,1),new j("em",-1,1),new j("arem",29,1),new j("erem",29,1),new j("irem",29,1),new j("assem",29,1),new j("essem",29,1),new j("issem",29,1),new j("ado",-1,1),new j("ido",-1,1),new j("ando",-1,1),new j("endo",-1,1),new j("indo",-1,1),new j("ara~o",-1,1),new j("era~o",-1,1),new j("ira~o",-1,1),new j("ar",-1,1),new j("er",-1,1),new j("ir",-1,1),new j("as",-1,1),new j("adas",47,1),new j("idas",47,1),new j("ias",47,1),new j("arias",50,1),new j("erias",50,1),new j("irias",50,1),new j("aras",47,1),new j("eras",47,1),new j("iras",47,1),new j("avas",47,1),new j("es",-1,1),new j("ardes",58,1),new j("erdes",58,1),new j("irdes",58,1),new j("ares",58,1),new j("eres",58,1),new j("ires",58,1),new j("asses",58,1),new j("esses",58,1),new j("isses",58,1),new j("astes",58,1),new j("estes",58,1),new j("istes",58,1),new j("is",-1,1),new j("ais",71,1),new j("eis",71,1),new j("areis",73,1),new j("ereis",73,1),new j("ireis",73,1),new j("áreis",73,1),new j("éreis",73,1),new j("íreis",73,1),new j("ásseis",73,1),new j("ésseis",73,1),new j("ísseis",73,1),new j("áveis",73,1),new j("íeis",73,1),new j("aríeis",84,1),new j("eríeis",84,1),new j("iríeis",84,1),new j("ados",-1,1),new j("idos",-1,1),new j("amos",-1,1),new j("áramos",90,1),new j("éramos",90,1),new j("íramos",90,1),new j("ávamos",90,1),new j("íamos",90,1),new j("aríamos",95,1),new j("eríamos",95,1),new j("iríamos",95,1),new j("emos",-1,1),new j("aremos",99,1),new j("eremos",99,1),new j("iremos",99,1),new j("ássemos",99,1),new j("êssemos",99,1),new j("íssemos",99,1),new j("imos",-1,1),new j("armos",-1,1),new j("ermos",-1,1),new j("irmos",-1,1),new j("ámos",-1,1),new j("arás",-1,1),new j("erás",-1,1),new j("irás",-1,1),new j("eu",-1,1),new j("iu",-1,1),new j("ou",-1,1),new j("ará",-1,1),new j("erá",-1,1),new j("irá",-1,1)],c=[new j("a",-1,1),new j("i",-1,1),new j("o",-1,1),new j("os",-1,1),new j("á",-1,1),new j("í",-1,1),new j("ó",-1,1)],l=[new j("e",-1,1),new j("ç",-1,2),new j("é",-1,1),new j("ê",-1,1)],f=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,3,19,12,2],d=new C;function v(){if(d.out_grouping(f,97,250)){for(;!d.in_grouping(f,97,250);){if(d.cursor>=d.limit)return!0;d.cursor++}return!1}return!0}function p(){var e,r,s=d.cursor;if(d.in_grouping(f,97,250))if(e=d.cursor,v()){if(d.cursor=e,function(){if(d.in_grouping(f,97,250))for(;!d.out_grouping(f,97,250);){if(d.cursor>=d.limit)return!1;d.cursor++}return i=d.cursor,!0}())return}else i=d.cursor;if(d.cursor=s,d.out_grouping(f,97,250)){if(r=d.cursor,v()){if(d.cursor=r,!d.in_grouping(f,97,250)||d.cursor>=d.limit)return;d.cursor++}i=d.cursor}}function _(){for(;!d.in_grouping(f,97,250);){if(d.cursor>=d.limit)return!1;d.cursor++}for(;!d.out_grouping(f,97,250);){if(d.cursor>=d.limit)return!1;d.cursor++}return!0}function h(){return i<=d.cursor}function b(){return s<=d.cursor}function g(){var e;if(d.ket=d.cursor,!(e=d.find_among_b(w,45)))return!1;switch(d.bra=d.cursor,e){case 1:if(!b())return!1;d.slice_del();break;case 2:if(!b())return!1;d.slice_from("log");break;case 3:if(!b())return!1;d.slice_from("u");break;case 4:if(!b())return!1;d.slice_from("ente");break;case 5:if(!(n<=d.cursor))return!1;d.slice_del(),d.ket=d.cursor,(e=d.find_among_b(r,4))&&(d.bra=d.cursor,b()&&(d.slice_del(),1==e&&(d.ket=d.cursor,d.eq_s_b(2,"at")&&(d.bra=d.cursor,b()&&d.slice_del()))));break;case 6:if(!b())return!1;d.slice_del(),d.ket=d.cursor,(e=d.find_among_b(t,3))&&(d.bra=d.cursor,1==e&&b()&&d.slice_del());break;case 7:if(!b())return!1;d.slice_del(),d.ket=d.cursor,(e=d.find_among_b(u,3))&&(d.bra=d.cursor,1==e&&b()&&d.slice_del());break;case 8:if(!b())return!1;d.slice_del(),d.ket=d.cursor,d.eq_s_b(2,"at")&&(d.bra=d.cursor,b()&&d.slice_del());break;case 9:if(!h()||!d.eq_s_b(1,"e"))return!1;d.slice_from("ir")}return!0}function k(e,r){if(d.eq_s_b(1,e)){d.bra=d.cursor;var s=d.limit-d.cursor;if(d.eq_s_b(1,r))return d.cursor=d.limit-s,h()&&d.slice_del(),!1}return!0}function q(){if(!g()&&(d.cursor=d.limit,!function(){var e,r;if(d.cursor>=i){if(r=d.limit_backward,d.limit_backward=i,d.ket=d.cursor,e=d.find_among_b(m,120))return d.bra=d.cursor,1==e&&d.slice_del(),d.limit_backward=r,!0;d.limit_backward=r}return!1}()))return d.cursor=d.limit,d.ket=d.cursor,void((e=d.find_among_b(c,7))&&(d.bra=d.cursor,1==e&&h()&&d.slice_del()));var e;d.cursor=d.limit,d.ket=d.cursor,d.eq_s_b(1,"i")&&(d.bra=d.cursor,d.eq_s_b(1,"c")&&(d.cursor=d.limit,h()&&d.slice_del()))}this.setCurrent=function(e){d.setCurrent(e)},this.getCurrent=function(){return d.getCurrent()},this.stem=function(){var e,r=d.cursor;return function(){for(var e;;){if(d.bra=d.cursor,e=d.find_among(o,3))switch(d.ket=d.cursor,e){case 1:d.slice_from("a~");continue;case 2:d.slice_from("o~");continue;case 3:if(d.cursor>=d.limit)break;d.cursor++;continue}break}}(),d.cursor=r,e=d.cursor,i=d.limit,s=n=i,p(),d.cursor=e,_()&&(n=d.cursor,_()&&(s=d.cursor)),d.limit_backward=r,d.cursor=d.limit,q(),d.cursor=d.limit,function(){var e;if(d.ket=d.cursor,e=d.find_among_b(l,4))switch(d.bra=d.cursor,e){case 1:h()&&(d.slice_del(),d.ket=d.cursor,d.limit,d.cursor,k("u","g")&&k("i","c"));break;case 2:d.slice_from("c")}}(),d.cursor=d.limit_backward,function(){for(var e;;){if(d.bra=d.cursor,e=d.find_among(a,3))switch(d.ket=d.cursor,e){case 1:d.slice_from("ã");continue;case 2:d.slice_from("õ");continue;case 3:if(d.cursor>=d.limit)break;d.cursor++;continue}break}}(),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return r.setCurrent(e),r.stem(),r.getCurrent()}):(r.setCurrent(e),r.stem(),r.getCurrent())}),e.Pipeline.registerFunction(e.pt.stemmer,"stemmer-pt"),e.pt.stopWordFilter=e.generateStopWordFilter("a ao aos aquela aquelas aquele aqueles aquilo as até com como da das de dela delas dele deles depois do dos e ela elas ele eles em entre era eram essa essas esse esses esta estamos estas estava estavam este esteja estejam estejamos estes esteve estive estivemos estiver estivera estiveram estiverem estivermos estivesse estivessem estivéramos estivéssemos estou está estávamos estão eu foi fomos for fora foram forem formos fosse fossem fui fôramos fôssemos haja hajam hajamos havemos hei houve houvemos houver houvera houveram houverei houverem houveremos houveria houveriam houvermos houverá houverão houveríamos houvesse houvessem houvéramos houvéssemos há hão isso isto já lhe lhes mais mas me mesmo meu meus minha minhas muito na nas nem no nos nossa nossas nosso nossos num numa não nós o os ou para pela pelas pelo pelos por qual quando que quem se seja sejam sejamos sem serei seremos seria seriam será serão seríamos seu seus somos sou sua suas são só também te tem temos tenha tenham tenhamos tenho terei teremos teria teriam terá terão teríamos teu teus teve tinha tinham tive tivemos tiver tivera tiveram tiverem tivermos tivesse tivessem tivéramos tivéssemos tu tua tuas tém tínhamos um uma você vocês vos à às éramos".split(" ")),e.Pipeline.registerFunction(e.pt.stopWordFilter,"stopWordFilter-pt")}}); \ No newline at end of file diff --git a/_static/javascripts/lunr/lunr.ro.js b/_static/javascripts/lunr/lunr.ro.js new file mode 100644 index 00000000..b19627e1 --- /dev/null +++ b/_static/javascripts/lunr/lunr.ro.js @@ -0,0 +1 @@ +!function(e,i){"function"==typeof define&&define.amd?define(i):"object"==typeof exports?module.exports=i():i()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var h,z,i;e.ro=function(){this.pipeline.reset(),this.pipeline.add(e.ro.trimmer,e.ro.stopWordFilter,e.ro.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.ro.stemmer))},e.ro.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.ro.trimmer=e.trimmerSupport.generateTrimmer(e.ro.wordCharacters),e.Pipeline.registerFunction(e.ro.trimmer,"trimmer-ro"),e.ro.stemmer=(h=e.stemmerSupport.Among,z=e.stemmerSupport.SnowballProgram,i=new function(){var r,n,t,a,o=[new h("",-1,3),new h("I",0,1),new h("U",0,2)],s=[new h("ea",-1,3),new h("aţia",-1,7),new h("aua",-1,2),new h("iua",-1,4),new h("aţie",-1,7),new h("ele",-1,3),new h("ile",-1,5),new h("iile",6,4),new h("iei",-1,4),new h("atei",-1,6),new h("ii",-1,4),new h("ului",-1,1),new h("ul",-1,1),new h("elor",-1,3),new h("ilor",-1,4),new h("iilor",14,4)],c=[new h("icala",-1,4),new h("iciva",-1,4),new h("ativa",-1,5),new h("itiva",-1,6),new h("icale",-1,4),new h("aţiune",-1,5),new h("iţiune",-1,6),new h("atoare",-1,5),new h("itoare",-1,6),new h("ătoare",-1,5),new h("icitate",-1,4),new h("abilitate",-1,1),new h("ibilitate",-1,2),new h("ivitate",-1,3),new h("icive",-1,4),new h("ative",-1,5),new h("itive",-1,6),new h("icali",-1,4),new h("atori",-1,5),new h("icatori",18,4),new h("itori",-1,6),new h("ători",-1,5),new h("icitati",-1,4),new h("abilitati",-1,1),new h("ivitati",-1,3),new h("icivi",-1,4),new h("ativi",-1,5),new h("itivi",-1,6),new h("icităi",-1,4),new h("abilităi",-1,1),new h("ivităi",-1,3),new h("icităţi",-1,4),new h("abilităţi",-1,1),new h("ivităţi",-1,3),new h("ical",-1,4),new h("ator",-1,5),new h("icator",35,4),new h("itor",-1,6),new h("ător",-1,5),new h("iciv",-1,4),new h("ativ",-1,5),new h("itiv",-1,6),new h("icală",-1,4),new h("icivă",-1,4),new h("ativă",-1,5),new h("itivă",-1,6)],u=[new h("ica",-1,1),new h("abila",-1,1),new h("ibila",-1,1),new h("oasa",-1,1),new h("ata",-1,1),new h("ita",-1,1),new h("anta",-1,1),new h("ista",-1,3),new h("uta",-1,1),new h("iva",-1,1),new h("ic",-1,1),new h("ice",-1,1),new h("abile",-1,1),new h("ibile",-1,1),new h("isme",-1,3),new h("iune",-1,2),new h("oase",-1,1),new h("ate",-1,1),new h("itate",17,1),new h("ite",-1,1),new h("ante",-1,1),new h("iste",-1,3),new h("ute",-1,1),new h("ive",-1,1),new h("ici",-1,1),new h("abili",-1,1),new h("ibili",-1,1),new h("iuni",-1,2),new h("atori",-1,1),new h("osi",-1,1),new h("ati",-1,1),new h("itati",30,1),new h("iti",-1,1),new h("anti",-1,1),new h("isti",-1,3),new h("uti",-1,1),new h("işti",-1,3),new h("ivi",-1,1),new h("ităi",-1,1),new h("oşi",-1,1),new h("ităţi",-1,1),new h("abil",-1,1),new h("ibil",-1,1),new h("ism",-1,3),new h("ator",-1,1),new h("os",-1,1),new h("at",-1,1),new h("it",-1,1),new h("ant",-1,1),new h("ist",-1,3),new h("ut",-1,1),new h("iv",-1,1),new h("ică",-1,1),new h("abilă",-1,1),new h("ibilă",-1,1),new h("oasă",-1,1),new h("ată",-1,1),new h("ită",-1,1),new h("antă",-1,1),new h("istă",-1,3),new h("ută",-1,1),new h("ivă",-1,1)],w=[new h("ea",-1,1),new h("ia",-1,1),new h("esc",-1,1),new h("ăsc",-1,1),new h("ind",-1,1),new h("ând",-1,1),new h("are",-1,1),new h("ere",-1,1),new h("ire",-1,1),new h("âre",-1,1),new h("se",-1,2),new h("ase",10,1),new h("sese",10,2),new h("ise",10,1),new h("use",10,1),new h("âse",10,1),new h("eşte",-1,1),new h("ăşte",-1,1),new h("eze",-1,1),new h("ai",-1,1),new h("eai",19,1),new h("iai",19,1),new h("sei",-1,2),new h("eşti",-1,1),new h("ăşti",-1,1),new h("ui",-1,1),new h("ezi",-1,1),new h("âi",-1,1),new h("aşi",-1,1),new h("seşi",-1,2),new h("aseşi",29,1),new h("seseşi",29,2),new h("iseşi",29,1),new h("useşi",29,1),new h("âseşi",29,1),new h("işi",-1,1),new h("uşi",-1,1),new h("âşi",-1,1),new h("aţi",-1,2),new h("eaţi",38,1),new h("iaţi",38,1),new h("eţi",-1,2),new h("iţi",-1,2),new h("âţi",-1,2),new h("arăţi",-1,1),new h("serăţi",-1,2),new h("aserăţi",45,1),new h("seserăţi",45,2),new h("iserăţi",45,1),new h("userăţi",45,1),new h("âserăţi",45,1),new h("irăţi",-1,1),new h("urăţi",-1,1),new h("ârăţi",-1,1),new h("am",-1,1),new h("eam",54,1),new h("iam",54,1),new h("em",-1,2),new h("asem",57,1),new h("sesem",57,2),new h("isem",57,1),new h("usem",57,1),new h("âsem",57,1),new h("im",-1,2),new h("âm",-1,2),new h("ăm",-1,2),new h("arăm",65,1),new h("serăm",65,2),new h("aserăm",67,1),new h("seserăm",67,2),new h("iserăm",67,1),new h("userăm",67,1),new h("âserăm",67,1),new h("irăm",65,1),new h("urăm",65,1),new h("ârăm",65,1),new h("au",-1,1),new h("eau",76,1),new h("iau",76,1),new h("indu",-1,1),new h("ându",-1,1),new h("ez",-1,1),new h("ească",-1,1),new h("ară",-1,1),new h("seră",-1,2),new h("aseră",84,1),new h("seseră",84,2),new h("iseră",84,1),new h("useră",84,1),new h("âseră",84,1),new h("iră",-1,1),new h("ură",-1,1),new h("âră",-1,1),new h("ează",-1,1)],i=[new h("a",-1,1),new h("e",-1,1),new h("ie",1,1),new h("i",-1,1),new h("ă",-1,1)],m=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,2,32,0,0,4],l=new z;function f(e,i){l.eq_s(1,e)&&(l.ket=l.cursor,l.in_grouping(m,97,259)&&l.slice_from(i))}function p(){if(l.out_grouping(m,97,259)){for(;!l.in_grouping(m,97,259);){if(l.cursor>=l.limit)return!0;l.cursor++}return!1}return!0}function d(){var e,i,r=l.cursor;if(l.in_grouping(m,97,259)){if(e=l.cursor,!p())return void(a=l.cursor);if(l.cursor=e,!function(){if(l.in_grouping(m,97,259))for(;!l.out_grouping(m,97,259);){if(l.cursor>=l.limit)return!0;l.cursor++}return!1}())return void(a=l.cursor)}l.cursor=r,l.out_grouping(m,97,259)&&(i=l.cursor,p()&&(l.cursor=i,l.in_grouping(m,97,259)&&l.cursor=l.limit)return!1;l.cursor++}for(;!l.out_grouping(m,97,259);){if(l.cursor>=l.limit)return!1;l.cursor++}return!0}function v(){return t<=l.cursor}function _(){var e,i=l.limit-l.cursor;if(l.ket=l.cursor,(e=l.find_among_b(c,46))&&(l.bra=l.cursor,v())){switch(e){case 1:l.slice_from("abil");break;case 2:l.slice_from("ibil");break;case 3:l.slice_from("iv");break;case 4:l.slice_from("ic");break;case 5:l.slice_from("at");break;case 6:l.slice_from("it")}return r=!0,l.cursor=l.limit-i,!0}return!1}function g(){var e,i;for(r=!1;;)if(i=l.limit-l.cursor,!_()){l.cursor=l.limit-i;break}if(l.ket=l.cursor,(e=l.find_among_b(u,62))&&(l.bra=l.cursor,n<=l.cursor)){switch(e){case 1:l.slice_del();break;case 2:l.eq_s_b(1,"ţ")&&(l.bra=l.cursor,l.slice_from("t"));break;case 3:l.slice_from("ist")}r=!0}}function k(){var e;l.ket=l.cursor,(e=l.find_among_b(i,5))&&(l.bra=l.cursor,a<=l.cursor&&1==e&&l.slice_del())}this.setCurrent=function(e){l.setCurrent(e)},this.getCurrent=function(){return l.getCurrent()},this.stem=function(){var e,i=l.cursor;return function(){for(var e,i;e=l.cursor,l.in_grouping(m,97,259)&&(i=l.cursor,l.bra=i,f("u","U"),l.cursor=i,f("i","I")),l.cursor=e,!(l.cursor>=l.limit);)l.cursor++}(),l.cursor=i,e=l.cursor,a=l.limit,n=t=a,d(),l.cursor=e,b()&&(t=l.cursor,b()&&(n=l.cursor)),l.limit_backward=i,l.cursor=l.limit,function(){var e,i;if(l.ket=l.cursor,(e=l.find_among_b(s,16))&&(l.bra=l.cursor,v()))switch(e){case 1:l.slice_del();break;case 2:l.slice_from("a");break;case 3:l.slice_from("e");break;case 4:l.slice_from("i");break;case 5:i=l.limit-l.cursor,l.eq_s_b(2,"ab")||(l.cursor=l.limit-i,l.slice_from("i"));break;case 6:l.slice_from("at");break;case 7:l.slice_from("aţi")}}(),l.cursor=l.limit,g(),l.cursor=l.limit,r||(l.cursor=l.limit,function(){var e,i,r;if(l.cursor>=a){if(i=l.limit_backward,l.limit_backward=a,l.ket=l.cursor,e=l.find_among_b(w,94))switch(l.bra=l.cursor,e){case 1:if(r=l.limit-l.cursor,!l.out_grouping_b(m,97,259)&&(l.cursor=l.limit-r,!l.eq_s_b(1,"u")))break;case 2:l.slice_del()}l.limit_backward=i}}(),l.cursor=l.limit),k(),l.cursor=l.limit_backward,function(){for(var e;;){if(l.bra=l.cursor,e=l.find_among(o,3))switch(l.ket=l.cursor,e){case 1:l.slice_from("i");continue;case 2:l.slice_from("u");continue;case 3:if(l.cursor>=l.limit)break;l.cursor++;continue}break}}(),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return i.setCurrent(e),i.stem(),i.getCurrent()}):(i.setCurrent(e),i.stem(),i.getCurrent())}),e.Pipeline.registerFunction(e.ro.stemmer,"stemmer-ro"),e.ro.stopWordFilter=e.generateStopWordFilter("acea aceasta această aceea acei aceia acel acela acele acelea acest acesta aceste acestea aceşti aceştia acolo acord acum ai aia aibă aici al ale alea altceva altcineva am ar are asemenea asta astea astăzi asupra au avea avem aveţi azi aş aşadar aţi bine bucur bună ca care caut ce cel ceva chiar cinci cine cineva contra cu cum cumva curând curînd când cât câte câtva câţi cînd cît cîte cîtva cîţi că căci cărei căror cărui către da dacă dar datorită dată dau de deci deja deoarece departe deşi din dinaintea dintr- dintre doi doilea două drept după dă ea ei el ele eram este eu eşti face fata fi fie fiecare fii fim fiu fiţi frumos fără graţie halbă iar ieri la le li lor lui lângă lîngă mai mea mei mele mereu meu mi mie mine mult multă mulţi mulţumesc mâine mîine mă ne nevoie nici nicăieri nimeni nimeri nimic nişte noastre noastră noi noroc nostru nouă noştri nu opt ori oricare orice oricine oricum oricând oricât oricînd oricît oriunde patra patru patrulea pe pentru peste pic poate pot prea prima primul prin puţin puţina puţină până pînă rog sa sale sau se spate spre sub sunt suntem sunteţi sută sînt sîntem sînteţi să săi său ta tale te timp tine toate toată tot totuşi toţi trei treia treilea tu tăi tău un una unde undeva unei uneia unele uneori unii unor unora unu unui unuia unul vi voastre voastră voi vostru vouă voştri vreme vreo vreun vă zece zero zi zice îi îl îmi împotriva în înainte înaintea încotro încât încît între întrucât întrucît îţi ăla ălea ăsta ăstea ăştia şapte şase şi ştiu ţi ţie".split(" ")),e.Pipeline.registerFunction(e.ro.stopWordFilter,"stopWordFilter-ro")}}); \ No newline at end of file diff --git a/_static/javascripts/lunr/lunr.ru.js b/_static/javascripts/lunr/lunr.ru.js new file mode 100644 index 00000000..ac992480 --- /dev/null +++ b/_static/javascripts/lunr/lunr.ru.js @@ -0,0 +1 @@ +!function(e,n){"function"==typeof define&&define.amd?define(n):"object"==typeof exports?module.exports=n():n()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var h,g,n;e.ru=function(){this.pipeline.reset(),this.pipeline.add(e.ru.trimmer,e.ru.stopWordFilter,e.ru.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.ru.stemmer))},e.ru.wordCharacters="Ѐ-҄҇-ԯᴫᵸⷠ-ⷿꙀ-ꚟ︮︯",e.ru.trimmer=e.trimmerSupport.generateTrimmer(e.ru.wordCharacters),e.Pipeline.registerFunction(e.ru.trimmer,"trimmer-ru"),e.ru.stemmer=(h=e.stemmerSupport.Among,g=e.stemmerSupport.SnowballProgram,n=new function(){var n,e,r=[new h("в",-1,1),new h("ив",0,2),new h("ыв",0,2),new h("вши",-1,1),new h("ивши",3,2),new h("ывши",3,2),new h("вшись",-1,1),new h("ившись",6,2),new h("ывшись",6,2)],t=[new h("ее",-1,1),new h("ие",-1,1),new h("ое",-1,1),new h("ые",-1,1),new h("ими",-1,1),new h("ыми",-1,1),new h("ей",-1,1),new h("ий",-1,1),new h("ой",-1,1),new h("ый",-1,1),new h("ем",-1,1),new h("им",-1,1),new h("ом",-1,1),new h("ым",-1,1),new h("его",-1,1),new h("ого",-1,1),new h("ему",-1,1),new h("ому",-1,1),new h("их",-1,1),new h("ых",-1,1),new h("ею",-1,1),new h("ою",-1,1),new h("ую",-1,1),new h("юю",-1,1),new h("ая",-1,1),new h("яя",-1,1)],w=[new h("ем",-1,1),new h("нн",-1,1),new h("вш",-1,1),new h("ивш",2,2),new h("ывш",2,2),new h("щ",-1,1),new h("ющ",5,1),new h("ующ",6,2)],i=[new h("сь",-1,1),new h("ся",-1,1)],u=[new h("ла",-1,1),new h("ила",0,2),new h("ыла",0,2),new h("на",-1,1),new h("ена",3,2),new h("ете",-1,1),new h("ите",-1,2),new h("йте",-1,1),new h("ейте",7,2),new h("уйте",7,2),new h("ли",-1,1),new h("или",10,2),new h("ыли",10,2),new h("й",-1,1),new h("ей",13,2),new h("уй",13,2),new h("л",-1,1),new h("ил",16,2),new h("ыл",16,2),new h("ем",-1,1),new h("им",-1,2),new h("ым",-1,2),new h("н",-1,1),new h("ен",22,2),new h("ло",-1,1),new h("ило",24,2),new h("ыло",24,2),new h("но",-1,1),new h("ено",27,2),new h("нно",27,1),new h("ет",-1,1),new h("ует",30,2),new h("ит",-1,2),new h("ыт",-1,2),new h("ют",-1,1),new h("уют",34,2),new h("ят",-1,2),new h("ны",-1,1),new h("ены",37,2),new h("ть",-1,1),new h("ить",39,2),new h("ыть",39,2),new h("ешь",-1,1),new h("ишь",-1,2),new h("ю",-1,2),new h("ую",44,2)],s=[new h("а",-1,1),new h("ев",-1,1),new h("ов",-1,1),new h("е",-1,1),new h("ие",3,1),new h("ье",3,1),new h("и",-1,1),new h("еи",6,1),new h("ии",6,1),new h("ами",6,1),new h("ями",6,1),new h("иями",10,1),new h("й",-1,1),new h("ей",12,1),new h("ией",13,1),new h("ий",12,1),new h("ой",12,1),new h("ам",-1,1),new h("ем",-1,1),new h("ием",18,1),new h("ом",-1,1),new h("ям",-1,1),new h("иям",21,1),new h("о",-1,1),new h("у",-1,1),new h("ах",-1,1),new h("ях",-1,1),new h("иях",26,1),new h("ы",-1,1),new h("ь",-1,1),new h("ю",-1,1),new h("ию",30,1),new h("ью",30,1),new h("я",-1,1),new h("ия",33,1),new h("ья",33,1)],o=[new h("ост",-1,1),new h("ость",-1,1)],c=[new h("ейше",-1,1),new h("н",-1,2),new h("ейш",-1,1),new h("ь",-1,3)],m=[33,65,8,232],l=new g;function f(){for(;!l.in_grouping(m,1072,1103);){if(l.cursor>=l.limit)return!1;l.cursor++}return!0}function a(){for(;!l.out_grouping(m,1072,1103);){if(l.cursor>=l.limit)return!1;l.cursor++}return!0}function p(e,n){var r,t;if(l.ket=l.cursor,r=l.find_among_b(e,n)){switch(l.bra=l.cursor,r){case 1:if(t=l.limit-l.cursor,!l.eq_s_b(1,"а")&&(l.cursor=l.limit-t,!l.eq_s_b(1,"я")))return!1;case 2:l.slice_del()}return!0}return!1}function d(e,n){var r;return l.ket=l.cursor,!!(r=l.find_among_b(e,n))&&(l.bra=l.cursor,1==r&&l.slice_del(),!0)}function _(){return!!d(t,26)&&(p(w,8),!0)}function b(){var e;l.ket=l.cursor,(e=l.find_among_b(o,2))&&(l.bra=l.cursor,n<=l.cursor&&1==e&&l.slice_del())}this.setCurrent=function(e){l.setCurrent(e)},this.getCurrent=function(){return l.getCurrent()},this.stem=function(){return e=l.limit,n=e,f()&&(e=l.cursor,a()&&f()&&a()&&(n=l.cursor)),l.cursor=l.limit,!(l.cursor>3]&1<<(7&s))return this.cursor++,!0}return!1},in_grouping_b:function(r,t,i){if(this.cursor>this.limit_backward){var s=b.charCodeAt(this.cursor-1);if(s<=i&&t<=s&&r[(s-=t)>>3]&1<<(7&s))return this.cursor--,!0}return!1},out_grouping:function(r,t,i){if(this.cursor>3]&1<<(7&s)))return this.cursor++,!0}return!1},out_grouping_b:function(r,t,i){if(this.cursor>this.limit_backward){var s=b.charCodeAt(this.cursor-1);if(i>3]&1<<(7&s)))return this.cursor--,!0}return!1},eq_s:function(r,t){if(this.limit-this.cursor>1),a=0,f=u=(l=r[i]).s_size){if(this.cursor=e+l.s_size,!l.method)return l.result;var m=l.method();if(this.cursor=e+l.s_size,m)return l.result}if((i=l.substring_i)<0)return 0}},find_among_b:function(r,t){for(var i=0,s=t,e=this.cursor,n=this.limit_backward,u=0,o=0,h=!1;;){for(var c=i+(s-i>>1),a=0,f=u=(_=r[i]).s_size){if(this.cursor=e-_.s_size,!_.method)return _.result;var m=_.method();if(this.cursor=e-_.s_size,m)return _.result}if((i=_.substring_i)<0)return 0}},replace_s:function(r,t,i){var s=i.length-(t-r);return b=b.substring(0,r)+i+b.substring(t),this.limit+=s,this.cursor>=t?this.cursor+=s:this.cursor>r&&(this.cursor=r),s},slice_check:function(){if(this.bra<0||this.bra>this.ket||this.ket>this.limit||this.limit>b.length)throw"faulty slice operation"},slice_from:function(r){this.slice_check(),this.replace_s(this.bra,this.ket,r)},slice_del:function(){this.slice_from("")},insert:function(r,t,i){var s=this.replace_s(r,t,i);r<=this.bra&&(this.bra+=s),r<=this.ket&&(this.ket+=s)},slice_to:function(){return this.slice_check(),b.substring(this.bra,this.ket)},eq_v_b:function(r){return this.eq_s_b(r.length,r)}}}},r.trimmerSupport={generateTrimmer:function(r){var t=new RegExp("^[^"+r+"]+"),i=new RegExp("[^"+r+"]+$");return function(r){return"function"==typeof r.update?r.update(function(r){return r.replace(t,"").replace(i,"")}):r.replace(t,"").replace(i,"")}}}}}); \ No newline at end of file diff --git a/_static/javascripts/lunr/lunr.sv.js b/_static/javascripts/lunr/lunr.sv.js new file mode 100644 index 00000000..6daf5f9d --- /dev/null +++ b/_static/javascripts/lunr/lunr.sv.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var r,l,n;e.sv=function(){this.pipeline.reset(),this.pipeline.add(e.sv.trimmer,e.sv.stopWordFilter,e.sv.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.sv.stemmer))},e.sv.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.sv.trimmer=e.trimmerSupport.generateTrimmer(e.sv.wordCharacters),e.Pipeline.registerFunction(e.sv.trimmer,"trimmer-sv"),e.sv.stemmer=(r=e.stemmerSupport.Among,l=e.stemmerSupport.SnowballProgram,n=new function(){var n,t,i=[new r("a",-1,1),new r("arna",0,1),new r("erna",0,1),new r("heterna",2,1),new r("orna",0,1),new r("ad",-1,1),new r("e",-1,1),new r("ade",6,1),new r("ande",6,1),new r("arne",6,1),new r("are",6,1),new r("aste",6,1),new r("en",-1,1),new r("anden",12,1),new r("aren",12,1),new r("heten",12,1),new r("ern",-1,1),new r("ar",-1,1),new r("er",-1,1),new r("heter",18,1),new r("or",-1,1),new r("s",-1,2),new r("as",21,1),new r("arnas",22,1),new r("ernas",22,1),new r("ornas",22,1),new r("es",21,1),new r("ades",26,1),new r("andes",26,1),new r("ens",21,1),new r("arens",29,1),new r("hetens",29,1),new r("erns",21,1),new r("at",-1,1),new r("andet",-1,1),new r("het",-1,1),new r("ast",-1,1)],s=[new r("dd",-1,-1),new r("gd",-1,-1),new r("nn",-1,-1),new r("dt",-1,-1),new r("gt",-1,-1),new r("kt",-1,-1),new r("tt",-1,-1)],a=[new r("ig",-1,1),new r("lig",0,1),new r("els",-1,1),new r("fullt",-1,3),new r("löst",-1,2)],o=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,24,0,32],u=[119,127,149],m=new l;this.setCurrent=function(e){m.setCurrent(e)},this.getCurrent=function(){return m.getCurrent()},this.stem=function(){var e,r=m.cursor;return function(){var e,r=m.cursor+3;if(t=m.limit,0<=r||r<=m.limit){for(n=r;;){if(e=m.cursor,m.in_grouping(o,97,246)){m.cursor=e;break}if(m.cursor=e,m.cursor>=m.limit)return;m.cursor++}for(;!m.out_grouping(o,97,246);){if(m.cursor>=m.limit)return;m.cursor++}(t=m.cursor)=t&&(m.limit_backward=t,m.cursor=m.limit,m.ket=m.cursor,e=m.find_among_b(i,37),m.limit_backward=r,e))switch(m.bra=m.cursor,e){case 1:m.slice_del();break;case 2:m.in_grouping_b(u,98,121)&&m.slice_del()}}(),m.cursor=m.limit,e=m.limit_backward,m.cursor>=t&&(m.limit_backward=t,m.cursor=m.limit,m.find_among_b(s,7)&&(m.cursor=m.limit,m.ket=m.cursor,m.cursor>m.limit_backward&&(m.bra=--m.cursor,m.slice_del())),m.limit_backward=e),m.cursor=m.limit,function(){var e,r;if(m.cursor>=t){if(r=m.limit_backward,m.limit_backward=t,m.cursor=m.limit,m.ket=m.cursor,e=m.find_among_b(a,5))switch(m.bra=m.cursor,e){case 1:m.slice_del();break;case 2:m.slice_from("lös");break;case 3:m.slice_from("full")}m.limit_backward=r}}(),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return n.setCurrent(e),n.stem(),n.getCurrent()}):(n.setCurrent(e),n.stem(),n.getCurrent())}),e.Pipeline.registerFunction(e.sv.stemmer,"stemmer-sv"),e.sv.stopWordFilter=e.generateStopWordFilter("alla allt att av blev bli blir blivit de dem den denna deras dess dessa det detta dig din dina ditt du där då efter ej eller en er era ert ett från för ha hade han hans har henne hennes hon honom hur här i icke ingen inom inte jag ju kan kunde man med mellan men mig min mina mitt mot mycket ni nu när någon något några och om oss på samma sedan sig sin sina sitta själv skulle som så sådan sådana sådant till under upp ut utan vad var vara varför varit varje vars vart vem vi vid vilka vilkas vilken vilket vår våra vårt än är åt över".split(" ")),e.Pipeline.registerFunction(e.sv.stopWordFilter,"stopWordFilter-sv")}}); \ No newline at end of file diff --git a/_static/javascripts/lunr/lunr.th.js b/_static/javascripts/lunr/lunr.th.js new file mode 100644 index 00000000..ee8ef373 --- /dev/null +++ b/_static/javascripts/lunr/lunr.th.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(t){if(void 0===t)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===t.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var i="2"==t.version[0];t.th=function(){this.pipeline.reset(),this.pipeline.add(t.th.trimmer),i?this.tokenizer=t.th.tokenizer:(t.tokenizer&&(t.tokenizer=t.th.tokenizer),this.tokenizerFn&&(this.tokenizerFn=t.th.tokenizer))},t.th.wordCharacters="[฀-๿]",t.th.trimmer=t.trimmerSupport.generateTrimmer(t.th.wordCharacters),t.Pipeline.registerFunction(t.th.trimmer,"trimmer-th");var n=t.wordcut;n.init(),t.th.tokenizer=function(e){if(!arguments.length||null==e||null==e)return[];if(Array.isArray(e))return e.map(function(e){return i?new t.Token(e):e});var r=e.toString().replace(/^\s+/,"");return n.cut(r).split("|")}}}); \ No newline at end of file diff --git a/_static/javascripts/lunr/lunr.tr.js b/_static/javascripts/lunr/lunr.tr.js new file mode 100644 index 00000000..e8fb5a7d --- /dev/null +++ b/_static/javascripts/lunr/lunr.tr.js @@ -0,0 +1 @@ +!function(r,i){"function"==typeof define&&define.amd?define(i):"object"==typeof exports?module.exports=i():i()(r.lunr)}(this,function(){return function(r){if(void 0===r)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===r.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var mr,dr,i;r.tr=function(){this.pipeline.reset(),this.pipeline.add(r.tr.trimmer,r.tr.stopWordFilter,r.tr.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(r.tr.stemmer))},r.tr.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",r.tr.trimmer=r.trimmerSupport.generateTrimmer(r.tr.wordCharacters),r.Pipeline.registerFunction(r.tr.trimmer,"trimmer-tr"),r.tr.stemmer=(mr=r.stemmerSupport.Among,dr=r.stemmerSupport.SnowballProgram,i=new function(){var t,r=[new mr("m",-1,-1),new mr("n",-1,-1),new mr("miz",-1,-1),new mr("niz",-1,-1),new mr("muz",-1,-1),new mr("nuz",-1,-1),new mr("müz",-1,-1),new mr("nüz",-1,-1),new mr("mız",-1,-1),new mr("nız",-1,-1)],i=[new mr("leri",-1,-1),new mr("ları",-1,-1)],e=[new mr("ni",-1,-1),new mr("nu",-1,-1),new mr("nü",-1,-1),new mr("nı",-1,-1)],n=[new mr("in",-1,-1),new mr("un",-1,-1),new mr("ün",-1,-1),new mr("ın",-1,-1)],u=[new mr("a",-1,-1),new mr("e",-1,-1)],o=[new mr("na",-1,-1),new mr("ne",-1,-1)],s=[new mr("da",-1,-1),new mr("ta",-1,-1),new mr("de",-1,-1),new mr("te",-1,-1)],c=[new mr("nda",-1,-1),new mr("nde",-1,-1)],l=[new mr("dan",-1,-1),new mr("tan",-1,-1),new mr("den",-1,-1),new mr("ten",-1,-1)],a=[new mr("ndan",-1,-1),new mr("nden",-1,-1)],m=[new mr("la",-1,-1),new mr("le",-1,-1)],d=[new mr("ca",-1,-1),new mr("ce",-1,-1)],f=[new mr("im",-1,-1),new mr("um",-1,-1),new mr("üm",-1,-1),new mr("ım",-1,-1)],b=[new mr("sin",-1,-1),new mr("sun",-1,-1),new mr("sün",-1,-1),new mr("sın",-1,-1)],w=[new mr("iz",-1,-1),new mr("uz",-1,-1),new mr("üz",-1,-1),new mr("ız",-1,-1)],_=[new mr("siniz",-1,-1),new mr("sunuz",-1,-1),new mr("sünüz",-1,-1),new mr("sınız",-1,-1)],k=[new mr("lar",-1,-1),new mr("ler",-1,-1)],p=[new mr("niz",-1,-1),new mr("nuz",-1,-1),new mr("nüz",-1,-1),new mr("nız",-1,-1)],g=[new mr("dir",-1,-1),new mr("tir",-1,-1),new mr("dur",-1,-1),new mr("tur",-1,-1),new mr("dür",-1,-1),new mr("tür",-1,-1),new mr("dır",-1,-1),new mr("tır",-1,-1)],y=[new mr("casına",-1,-1),new mr("cesine",-1,-1)],z=[new mr("di",-1,-1),new mr("ti",-1,-1),new mr("dik",-1,-1),new mr("tik",-1,-1),new mr("duk",-1,-1),new mr("tuk",-1,-1),new mr("dük",-1,-1),new mr("tük",-1,-1),new mr("dık",-1,-1),new mr("tık",-1,-1),new mr("dim",-1,-1),new mr("tim",-1,-1),new mr("dum",-1,-1),new mr("tum",-1,-1),new mr("düm",-1,-1),new mr("tüm",-1,-1),new mr("dım",-1,-1),new mr("tım",-1,-1),new mr("din",-1,-1),new mr("tin",-1,-1),new mr("dun",-1,-1),new mr("tun",-1,-1),new mr("dün",-1,-1),new mr("tün",-1,-1),new mr("dın",-1,-1),new mr("tın",-1,-1),new mr("du",-1,-1),new mr("tu",-1,-1),new mr("dü",-1,-1),new mr("tü",-1,-1),new mr("dı",-1,-1),new mr("tı",-1,-1)],h=[new mr("sa",-1,-1),new mr("se",-1,-1),new mr("sak",-1,-1),new mr("sek",-1,-1),new mr("sam",-1,-1),new mr("sem",-1,-1),new mr("san",-1,-1),new mr("sen",-1,-1)],v=[new mr("miş",-1,-1),new mr("muş",-1,-1),new mr("müş",-1,-1),new mr("mış",-1,-1)],q=[new mr("b",-1,1),new mr("c",-1,2),new mr("d",-1,3),new mr("ğ",-1,4)],C=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,8,0,0,0,0,0,0,1],P=[1,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,1],F=[65],S=[65],W=[["a",[1,64,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],97,305],["e",[17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,130],101,252],["ı",[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],97,305],["i",[17],101,105],["o",F,111,117],["ö",S,246,252],["u",F,111,117]],L=new dr;function x(r,i,e){for(;;){var n=L.limit-L.cursor;if(L.in_grouping_b(r,i,e)){L.cursor=L.limit-n;break}if(L.cursor=L.limit-n,L.cursor<=L.limit_backward)return!1;L.cursor--}return!0}function A(){var r,i;r=L.limit-L.cursor,x(C,97,305);for(var e=0;eL.limit_backward&&(L.cursor--,e=L.limit-L.cursor,i()))?(L.cursor=L.limit-e,!0):(L.cursor=L.limit-n,r()?(L.cursor=L.limit-n,!1):(L.cursor=L.limit-n,!(L.cursor<=L.limit_backward)&&(L.cursor--,!!i()&&(L.cursor=L.limit-n,!0))))}function j(r){return E(r,function(){return L.in_grouping_b(C,97,305)})}function T(){return j(function(){return L.eq_s_b(1,"n")})}function Z(){return j(function(){return L.eq_s_b(1,"y")})}function B(){return L.find_among_b(r,10)&&E(function(){return L.in_grouping_b(P,105,305)},function(){return L.out_grouping_b(C,97,305)})}function D(){return A()&&L.in_grouping_b(P,105,305)&&j(function(){return L.eq_s_b(1,"s")})}function G(){return L.find_among_b(i,2)}function H(){return A()&&L.find_among_b(n,4)&&T()}function I(){return A()&&L.find_among_b(s,4)}function J(){return A()&&L.find_among_b(c,2)}function K(){return A()&&L.find_among_b(f,4)&&Z()}function M(){return A()&&L.find_among_b(b,4)}function N(){return A()&&L.find_among_b(w,4)&&Z()}function O(){return L.find_among_b(_,4)}function Q(){return A()&&L.find_among_b(k,2)}function R(){return A()&&L.find_among_b(g,8)}function U(){return A()&&L.find_among_b(z,32)&&Z()}function V(){return L.find_among_b(h,8)&&Z()}function X(){return A()&&L.find_among_b(v,4)&&Z()}function Y(){var r=L.limit-L.cursor;return!(X()||(L.cursor=L.limit-r,U()||(L.cursor=L.limit-r,V()||(L.cursor=L.limit-r,L.eq_s_b(3,"ken")&&Z()))))}function $(){if(L.find_among_b(y,2)){var r=L.limit-L.cursor;if(O()||(L.cursor=L.limit-r,Q()||(L.cursor=L.limit-r,K()||(L.cursor=L.limit-r,M()||(L.cursor=L.limit-r,N()||(L.cursor=L.limit-r))))),X())return!1}return!0}function rr(){if(!A()||!L.find_among_b(p,4))return!0;var r=L.limit-L.cursor;return!U()&&(L.cursor=L.limit-r,!V())}function ir(){var r,i,e,n=L.limit-L.cursor;if(L.ket=L.cursor,t=!0,Y()&&(L.cursor=L.limit-n,$()&&(L.cursor=L.limit-n,function(){if(Q()){L.bra=L.cursor,L.slice_del();var r=L.limit-L.cursor;return L.ket=L.cursor,R()||(L.cursor=L.limit-r,U()||(L.cursor=L.limit-r,V()||(L.cursor=L.limit-r,X()||(L.cursor=L.limit-r)))),t=!1}return!0}()&&(L.cursor=L.limit-n,rr()&&(L.cursor=L.limit-n,e=L.limit-L.cursor,!(O()||(L.cursor=L.limit-e,N()||(L.cursor=L.limit-e,M()||(L.cursor=L.limit-e,K()))))||(L.bra=L.cursor,L.slice_del(),i=L.limit-L.cursor,L.ket=L.cursor,X()||(L.cursor=L.limit-i),0)))))){if(L.cursor=L.limit-n,!R())return;L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,r=L.limit-L.cursor,O()||(L.cursor=L.limit-r,Q()||(L.cursor=L.limit-r,K()||(L.cursor=L.limit-r,M()||(L.cursor=L.limit-r,N()||(L.cursor=L.limit-r))))),X()||(L.cursor=L.limit-r)}L.bra=L.cursor,L.slice_del()}function er(){var r,i,e,n;if(L.ket=L.cursor,L.eq_s_b(2,"ki")){if(r=L.limit-L.cursor,I())return L.bra=L.cursor,L.slice_del(),i=L.limit-L.cursor,L.ket=L.cursor,Q()?(L.bra=L.cursor,L.slice_del(),er()):(L.cursor=L.limit-i,B()&&(L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,Q()&&(L.bra=L.cursor,L.slice_del(),er()))),!0;if(L.cursor=L.limit-r,H()){if(L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,e=L.limit-L.cursor,G())L.bra=L.cursor,L.slice_del();else{if(L.cursor=L.limit-e,L.ket=L.cursor,!B()&&(L.cursor=L.limit-e,!D()&&(L.cursor=L.limit-e,!er())))return!0;L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,Q()&&(L.bra=L.cursor,L.slice_del(),er())}return!0}if(L.cursor=L.limit-r,J()){if(n=L.limit-L.cursor,G())L.bra=L.cursor,L.slice_del();else if(L.cursor=L.limit-n,D())L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,Q()&&(L.bra=L.cursor,L.slice_del(),er());else if(L.cursor=L.limit-n,!er())return!1;return!0}}return!1}function nr(r){if(L.ket=L.cursor,!J()&&(L.cursor=L.limit-r,!A()||!L.find_among_b(o,2)))return!1;var i=L.limit-L.cursor;if(G())L.bra=L.cursor,L.slice_del();else if(L.cursor=L.limit-i,D())L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,Q()&&(L.bra=L.cursor,L.slice_del(),er());else if(L.cursor=L.limit-i,!er())return!1;return!0}function tr(r){if(L.ket=L.cursor,!(A()&&L.find_among_b(a,2)||(L.cursor=L.limit-r,A()&&L.find_among_b(e,4))))return!1;var i=L.limit-L.cursor;return!(!D()&&(L.cursor=L.limit-i,!G()))&&(L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,Q()&&(L.bra=L.cursor,L.slice_del(),er()),!0)}function ur(){var r,i=L.limit-L.cursor;return L.ket=L.cursor,!!(H()||(L.cursor=L.limit-i,A()&&L.find_among_b(m,2)&&Z()))&&(L.bra=L.cursor,L.slice_del(),r=L.limit-L.cursor,L.ket=L.cursor,!(!Q()||(L.bra=L.cursor,L.slice_del(),!er()))||(L.cursor=L.limit-r,L.ket=L.cursor,(B()||(L.cursor=L.limit-r,D()||(L.cursor=L.limit-r,er())))&&(L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,Q()&&(L.bra=L.cursor,L.slice_del(),er())),!0))}function or(){var r,i,e=L.limit-L.cursor;if(L.ket=L.cursor,!(I()||(L.cursor=L.limit-e,A()&&L.in_grouping_b(P,105,305)&&Z()||(L.cursor=L.limit-e,A()&&L.find_among_b(u,2)&&Z()))))return!1;if(L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,r=L.limit-L.cursor,B())L.bra=L.cursor,L.slice_del(),i=L.limit-L.cursor,L.ket=L.cursor,Q()||(L.cursor=L.limit-i);else if(L.cursor=L.limit-r,!Q())return!0;return L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,er(),!0}function sr(){var r,i,e=L.limit-L.cursor;if(L.ket=L.cursor,Q())return L.bra=L.cursor,L.slice_del(),void er();if(L.cursor=L.limit-e,L.ket=L.cursor,A()&&L.find_among_b(d,2)&&T())if(L.bra=L.cursor,L.slice_del(),r=L.limit-L.cursor,L.ket=L.cursor,G())L.bra=L.cursor,L.slice_del();else{if(L.cursor=L.limit-r,L.ket=L.cursor,!B()&&(L.cursor=L.limit-r,!D())){if(L.cursor=L.limit-r,L.ket=L.cursor,!Q())return;if(L.bra=L.cursor,L.slice_del(),!er())return}L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,Q()&&(L.bra=L.cursor,L.slice_del(),er())}else if(L.cursor=L.limit-e,!nr(e)&&(L.cursor=L.limit-e,!tr(e))){if(L.cursor=L.limit-e,L.ket=L.cursor,A()&&L.find_among_b(l,4))return L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,i=L.limit-L.cursor,void(B()?(L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,Q()&&(L.bra=L.cursor,L.slice_del(),er())):(L.cursor=L.limit-i,Q()?(L.bra=L.cursor,L.slice_del()):L.cursor=L.limit-i,er()));if(L.cursor=L.limit-e,!ur()){if(L.cursor=L.limit-e,G())return L.bra=L.cursor,void L.slice_del();L.cursor=L.limit-e,er()||(L.cursor=L.limit-e,or()||(L.cursor=L.limit-e,L.ket=L.cursor,(B()||(L.cursor=L.limit-e,D()))&&(L.bra=L.cursor,L.slice_del(),L.ket=L.cursor,Q()&&(L.bra=L.cursor,L.slice_del(),er()))))}}}function cr(r,i,e){if(L.cursor=L.limit-r,function(){for(;;){var r=L.limit-L.cursor;if(L.in_grouping_b(C,97,305)){L.cursor=L.limit-r;break}if(L.cursor=L.limit-r,L.cursor<=L.limit_backward)return!1;L.cursor--}return!0}()){var n=L.limit-L.cursor;if(!L.eq_s_b(1,i)&&(L.cursor=L.limit-n,!L.eq_s_b(1,e)))return!0;L.cursor=L.limit-r;var t=L.cursor;return L.insert(L.cursor,L.cursor,e),L.cursor=t,!1}return!0}function lr(r,i,e){for(;!L.eq_s(i,e);){if(L.cursor>=L.limit)return!0;L.cursor++}return i!=L.limit||(L.cursor=r,!1)}function ar(){var r,i,e=L.cursor;return!(!lr(r=L.cursor,2,"ad")||!lr(L.cursor=r,5,"soyad"))&&(L.limit_backward=e,L.cursor=L.limit,i=L.limit-L.cursor,(L.eq_s_b(1,"d")||(L.cursor=L.limit-i,L.eq_s_b(1,"g")))&&cr(i,"a","ı")&&cr(i,"e","i")&&cr(i,"o","u")&&cr(i,"ö","ü"),L.cursor=L.limit,function(){var r;if(L.ket=L.cursor,r=L.find_among_b(q,4))switch(L.bra=L.cursor,r){case 1:L.slice_from("p");break;case 2:L.slice_from("ç");break;case 3:L.slice_from("t");break;case 4:L.slice_from("k")}}(),!0)}this.setCurrent=function(r){L.setCurrent(r)},this.getCurrent=function(){return L.getCurrent()},this.stem=function(){return!!(function(){for(var r,i=L.cursor,e=2;;){for(r=L.cursor;!L.in_grouping(C,97,305);){if(L.cursor>=L.limit)return L.cursor=r,!(0e&&(this._events[n].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[n].length),"function"==typeof console.trace&&console.trace()));return this},r.prototype.once=function(n,t){if(!a(t))throw TypeError("listener must be a function");var e=!1;function r(){this.removeListener(n,r),e||(e=!0,t.apply(this,arguments))}return r.listener=t,this.on(n,r),this},r.prototype.removeListener=function(n,t){var e,r,i,o;if(!a(t))throw TypeError("listener must be a function");if(!this._events||!this._events[n])return this;if(i=(e=this._events[n]).length,r=-1,e===t||a(e.listener)&&e.listener===t)delete this._events[n],this._events.removeListener&&this.emit("removeListener",n,t);else if(c(e)){for(o=i;0this.maxLength)return i();if(!this.stat&&p(this.cache,o)){var t=this.cache[o];if(Array.isArray(t)&&(t="DIR"),!n||"DIR"===t)return i(null,t);if(n&&"FILE"===t)return i()}var e=this.statCache[o];if(void 0!==e){if(!1===e)return i(null,e);var s=e.isDirectory()?"DIR":"FILE";return n&&"FILE"===s?i():i(null,s,e)}var a=this,c=d("stat\0"+o,function(n,e){{if(e&&e.isSymbolicLink())return u.stat(o,function(n,t){n?a._stat2(r,o,null,e,i):a._stat2(r,o,n,t,i)});a._stat2(r,o,n,e,i)}});c&&u.lstat(o,c)},b.prototype._stat2=function(n,t,e,r,i){if(e)return this.statCache[t]=!1,i();var o="/"===n.slice(-1);if(this.statCache[t]=r,"/"===t.slice(-1)&&!r.isDirectory())return i(null,!1,r);var s=r.isDirectory()?"DIR":"FILE";return this.cache[t]=this.cache[t]||s,o&&"DIR"!==s?i():i(null,s,r)}}).call(this,_("_process"))},{"./common.js":15,"./sync.js":17,_process:24,assert:9,events:14,fs:12,inflight:18,inherits:19,minimatch:20,once:21,path:22,"path-is-absolute":23,util:28}],17:[function(e,r,n){(function(i){(r.exports=n).GlobSync=h;var s=e("fs"),c=e("minimatch"),g=(c.Minimatch,e("./glob.js").Glob,e("util"),e("path")),u=e("assert"),l=e("path-is-absolute"),t=e("./common.js"),o=(t.alphasort,t.alphasorti,t.setopts),a=t.ownProp,f=t.childrenIgnored;function n(n,t){if("function"==typeof t||3===arguments.length)throw new TypeError("callback provided to sync glob\nSee: https://github.com/isaacs/node-glob/issues/167");return new h(n,t).found}function h(n,t){if(!n)throw new Error("must provide pattern");if("function"==typeof t||3===arguments.length)throw new TypeError("callback provided to sync glob\nSee: https://github.com/isaacs/node-glob/issues/167");if(!(this instanceof h))return new h(n,t);if(o(this,n,t),this.noprocess)return this;var e=this.minimatch.set.length;this.matches=new Array(e);for(var r=0;rthis.maxLength)return!1;if(!this.stat&&a(this.cache,t)){var r=this.cache[t];if(Array.isArray(r)&&(r="DIR"),!e||"DIR"===r)return r;if(e&&"FILE"===r)return!1}var i=this.statCache[t];if(!i){var o;try{o=s.lstatSync(t)}catch(n){return!1}if(o.isSymbolicLink())try{i=s.statSync(t)}catch(n){i=o}else i=o}r=(this.statCache[t]=i).isDirectory()?"DIR":"FILE";return this.cache[t]=this.cache[t]||r,(!e||"DIR"===r)&&r},h.prototype._mark=function(n){return t.mark(this,n)},h.prototype._makeAbs=function(n){return t.makeAbs(this,n)}}).call(this,e("_process"))},{"./common.js":15,"./glob.js":16,_process:24,assert:9,fs:12,minimatch:20,path:22,"path-is-absolute":23,util:28}],18:[function(t,r,n){(function(s){var n=t("wrappy"),a=Object.create(null),e=t("once");r.exports=n(function(n,t){return a[n]?(a[n].push(t),null):(a[n]=[t],o=n,e(function n(){var t=a[o],e=t.length,r=function(n){for(var t=n.length,e=[],r=0;re?(t.splice(0,e),s.nextTick(function(){n.apply(null,r)})):delete a[o]}}));var o})}).call(this,t("_process"))},{_process:24,once:21,wrappy:29}],19:[function(n,t,e){"function"==typeof Object.create?t.exports=function(n,t){n.super_=t,n.prototype=Object.create(t.prototype,{constructor:{value:n,enumerable:!1,writable:!0,configurable:!0}})}:t.exports=function(n,t){n.super_=t;var e=function(){};e.prototype=t.prototype,n.prototype=new e,n.prototype.constructor=n}},{}],20:[function(n,t,e){(t.exports=s).Minimatch=i;var u={sep:"/"};try{u=n("path")}catch(n){}var M=s.GLOBSTAR=i.GLOBSTAR={},r=n("brace-expansion"),C={"!":{open:"(?:(?!(?:",close:"))[^/]*?)"},"?":{open:"(?:",close:")?"},"+":{open:"(?:",close:")+"},"*":{open:"(?:",close:")*"},"@":{open:"(?:",close:")"}},P="[^/]",z=P+"*?",B="().*{}+?[]^$\\!".split("").reduce(function(n,t){return n[t]=!0,n},{});var l=/\/+/;function o(t,e){t=t||{},e=e||{};var r={};return Object.keys(e).forEach(function(n){r[n]=e[n]}),Object.keys(t).forEach(function(n){r[n]=t[n]}),r}function s(n,t,e){if("string"!=typeof t)throw new TypeError("glob pattern string required");return e||(e={}),!(!e.nocomment&&"#"===t.charAt(0))&&(""===t.trim()?""===n:new i(t,e).match(n))}function i(n,t){if(!(this instanceof i))return new i(n,t);if("string"!=typeof n)throw new TypeError("glob pattern string required");t||(t={}),n=n.trim(),"/"!==u.sep&&(n=n.split(u.sep).join("/")),this.options=t,this.set=[],this.pattern=n,this.regexp=null,this.negate=!1,this.comment=!1,this.empty=!1,this.make()}function a(n,t){if(t||(t=this instanceof i?this.options:{}),void 0===(n=void 0===n?this.pattern:n))throw new TypeError("undefined pattern");return t.nobrace||!n.match(/\{.*\}/)?[n]:r(n)}s.filter=function(r,i){return i=i||{},function(n,t,e){return s(n,r,i)}},s.defaults=function(r){if(!r||!Object.keys(r).length)return s;var i=s,n=function(n,t,e){return i.minimatch(n,t,o(r,e))};return n.Minimatch=function(n,t){return new i.Minimatch(n,o(r,t))},n},i.defaults=function(n){return n&&Object.keys(n).length?s.defaults(n).Minimatch:i},i.prototype.debug=function(){},i.prototype.make=function(){if(this._made)return;var n=this.pattern,t=this.options;if(!t.nocomment&&"#"===n.charAt(0))return void(this.comment=!0);if(!n)return void(this.empty=!0);this.parseNegate();var e=this.globSet=this.braceExpand();t.debug&&(this.debug=console.error);this.debug(this.pattern,e),e=this.globParts=e.map(function(n){return n.split(l)}),this.debug(this.pattern,e),e=e.map(function(n,t,e){return n.map(this.parse,this)},this),this.debug(this.pattern,e),e=e.filter(function(n){return-1===n.indexOf(!1)}),this.debug(this.pattern,e),this.set=e},i.prototype.parseNegate=function(){var n=this.pattern,t=!1,e=this.options,r=0;if(e.nonegate)return;for(var i=0,o=n.length;i>> no match, partial?",n,f,t,h),f!==s))}if("string"==typeof u?(c=r.nocase?l.toLowerCase()===u.toLowerCase():l===u,this.debug("string match",u,l,c)):(c=l.match(u),this.debug("pattern match",u,l,c)),!c)return!1}if(i===s&&o===a)return!0;if(i===s)return e;if(o===a)return i===s-1&&""===n[i];throw new Error("wtf?")}},{"brace-expansion":11,path:22}],21:[function(n,t,e){var r=n("wrappy");function i(n){var t=function(){return t.called?t.value:(t.called=!0,t.value=n.apply(this,arguments))};return t.called=!1,t}function o(n){var t=function(){if(t.called)throw new Error(t.onceError);return t.called=!0,t.value=n.apply(this,arguments)},e=n.name||"Function wrapped with `once`";return t.onceError=e+" shouldn't be called more than once",t.called=!1,t}t.exports=r(i),t.exports.strict=r(o),i.proto=i(function(){Object.defineProperty(Function.prototype,"once",{value:function(){return i(this)},configurable:!0}),Object.defineProperty(Function.prototype,"onceStrict",{value:function(){return o(this)},configurable:!0})})},{wrappy:29}],22:[function(n,t,u){(function(i){function o(n,t){for(var e=0,r=n.length-1;0<=r;r--){var i=n[r];"."===i?n.splice(r,1):".."===i?(n.splice(r,1),e++):e&&(n.splice(r,1),e--)}if(t)for(;e--;e)n.unshift("..");return n}var t=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/,s=function(n){return t.exec(n).slice(1)};function a(n,t){if(n.filter)return n.filter(t);for(var e=[],r=0;r":">",'"':""","'":"'","`":"`"},D=d.invert(N),F=function(t){var e=function(n){return t[n]},n="(?:"+d.keys(t).join("|")+")",r=RegExp(n),i=RegExp(n,"g");return function(n){return n=null==n?"":""+n,r.test(n)?n.replace(i,e):n}};d.escape=F(N),d.unescape=F(D),d.result=function(n,t,e){var r=null==n?void 0:n[t];return void 0===r&&(r=e),d.isFunction(r)?r.call(n):r};var M=0;d.uniqueId=function(n){var t=++M+"";return n?n+t:t},d.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var C=/(.)^/,P={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},z=/\\|'|\r|\n|\u2028|\u2029/g,B=function(n){return"\\"+P[n]};d.template=function(o,n,t){!n&&t&&(n=t),n=d.defaults({},n,d.templateSettings);var e=RegExp([(n.escape||C).source,(n.interpolate||C).source,(n.evaluate||C).source].join("|")+"|$","g"),s=0,a="__p+='";o.replace(e,function(n,t,e,r,i){return a+=o.slice(s,i).replace(z,B),s=i+n.length,t?a+="'+\n((__t=("+t+"))==null?'':_.escape(__t))+\n'":e?a+="'+\n((__t=("+e+"))==null?'':__t)+\n'":r&&(a+="';\n"+r+"\n__p+='"),n}),a+="';\n",n.variable||(a="with(obj||{}){\n"+a+"}\n"),a="var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\n"+a+"return __p;\n";try{var r=new Function(n.variable||"obj","_",a)}catch(n){throw n.source=a,n}var i=function(n){return r.call(this,n,d)},c=n.variable||"obj";return i.source="function("+c+"){\n"+a+"}",i},d.chain=function(n){var t=d(n);return t._chain=!0,t};var U=function(n,t){return n._chain?d(t).chain():t};d.mixin=function(e){d.each(d.functions(e),function(n){var t=d[n]=e[n];d.prototype[n]=function(){var n=[this._wrapped];return i.apply(n,arguments),U(this,t.apply(d,n))}})},d.mixin(d),d.each(["pop","push","reverse","shift","sort","splice","unshift"],function(t){var e=r[t];d.prototype[t]=function(){var n=this._wrapped;return e.apply(n,arguments),"shift"!==t&&"splice"!==t||0!==n.length||delete n[0],U(this,n)}}),d.each(["concat","join","slice"],function(n){var t=r[n];d.prototype[n]=function(){return U(this,t.apply(this._wrapped,arguments))}}),d.prototype.value=function(){return this._wrapped},d.prototype.valueOf=d.prototype.toJSON=d.prototype.value,d.prototype.toString=function(){return""+this._wrapped}}).call(this)},{}],26:[function(n,t,e){arguments[4][19][0].apply(e,arguments)},{dup:19}],27:[function(n,t,e){t.exports=function(n){return n&&"object"==typeof n&&"function"==typeof n.copy&&"function"==typeof n.fill&&"function"==typeof n.readUInt8}},{}],28:[function(h,n,k){(function(r,i){var a=/%[sdj%]/g;k.format=function(n){if(!_(n)){for(var t=[],e=0;e@76R?2zn`q>PYMLPa*2$tF_S z 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

7y94>5o#N2I}JDAQO*@D=%ZXYC7e48+?09Ny%TH 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 %ds*FYKo={H?g?v+C~H@sV#j@IfUSNNm9j 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]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="

",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0"," ","+","~","preFilter","excess","unquoted","nodeNameSelector","pattern","operator","check","result","what","_argument","simple","forward","ofType","_context","xml","uniqueCache","outerCache","nodeIndex","start","parent","useCache","lastChild","uniqueID","pseudo","args","setFilters","idx","matched","not","matcher","unmatched","has","lang","elemLang","hash","location","root","focus","activeElement","hasFocus","href","tabIndex","enabled","checked","selected","selectedIndex","empty","header","button","_matchIndexes","lt","gt","radio","checkbox","file","password","image","submit","reset","tokens","combinator","base","skip","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","contexts","multipleContexts","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","filters","parseOnly","soFar","preFilters","cached","elementMatchers","setMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","token","compiled","_name","defaultValue","unique","isXMLDoc","escapeSelector","until","truncate","is","siblings","n","rneedsContext","rsingleTag","winnow","qualifier","self","rootjQuery","parseHTML","ready","rparentsprev","guaranteedUnique","children","contents","prev","sibling","targets","l","closest","index","prevAll","add","addBack","parents","parentsUntil","nextAll","nextUntil","prevUntil","contentDocument","content","reverse","rnothtmlwhite","Identity","v","Thrower","ex","adoptValue","resolve","reject","noValue","method","promise","fail","then","Callbacks","object","_","flag","firing","memory","fired","locked","queue","firingIndex","fire","once","stopOnFalse","remove","disable","lock","fireWith","Deferred","func","tuples","state","always","deferred","catch","pipe","fns","newDefer","tuple","returned","progress","notify","onFulfilled","onRejected","onProgress","maxDepth","depth","special","that","mightThrow","TypeError","notifyWith","resolveWith","process","exceptionHook","stackTrace","rejectWith","getStackHook","setTimeout","stateString","when","singleValue","remaining","resolveContexts","resolveValues","primary","updateFunc","rerrorNames","stack","console","warn","message","readyException","readyList","completed","removeEventListener","readyWait","wait","readyState","doScroll","access","chainable","emptyGet","raw","bulk","_key","rmsPrefix","rdashAlpha","fcamelCase","_all","letter","toUpperCase","camelCase","string","acceptData","owner","Data","uid","defineProperty","configurable","set","data","prop","hasData","dataPriv","dataUser","rbrace","rmultiDash","dataAttr","JSON","parse","removeData","_data","_removeData","dequeue","startLength","hooks","_queueHooks","stop","setter","clearQueue","count","defer","pnum","source","rcssNum","cssExpand","isAttached","composed","getRootNode","isHiddenWithinTree","style","display","css","adjustCSS","valueParts","tween","adjusted","scale","maxIterations","currentValue","initial","unit","cssNumber","initialInUnit","defaultDisplayMap","showHide","show","values","body","hide","toggle","div","rcheckableType","rtagName","rscriptType","createDocumentFragment","checkClone","cloneNode","noCloneChecked","option","wrapMap","thead","col","tr","td","_default","getAll","setGlobalEval","refElements","tbody","tfoot","colgroup","caption","th","optgroup","buildFragment","scripts","selection","ignored","wrap","attached","fragment","nodes","htmlPrefilter","createTextNode","rtypenamespace","returnTrue","returnFalse","expectSync","err","safeActiveElement","on","types","one","origFn","event","off","leverageNative","notAsync","saved","isTrigger","delegateType","stopPropagation","stopImmediatePropagation","preventDefault","trigger","Event","handleObjIn","eventHandle","events","t","handleObj","handlers","namespaces","origType","elemData","create","handle","triggered","dispatch","bindType","delegateCount","setup","mappedTypes","origCount","teardown","removeEvent","nativeEvent","handlerQueue","fix","delegateTarget","preDispatch","isPropagationStopped","currentTarget","isImmediatePropagationStopped","rnamespace","postDispatch","matchedHandlers","matchedSelectors","addProp","hook","enumerable","originalEvent","writable","load","noBubble","click","beforeunload","returnValue","props","isDefaultPrevented","defaultPrevented","relatedTarget","timeStamp","now","isSimulated","altKey","bubbles","cancelable","changedTouches","ctrlKey","detail","eventPhase","metaKey","pageX","pageY","shiftKey","view","char","charCode","keyCode","buttons","clientX","clientY","offsetX","offsetY","pointerId","pointerType","screenX","screenY","targetTouches","toElement","touches","which","blur","mouseenter","mouseleave","pointerenter","pointerleave","orig","related","rnoInnerhtml","rchecked","rcleanScript","manipulationTarget","disableScript","restoreScript","cloneCopyEvent","dest","udataOld","udataCur","domManip","collection","hasScripts","iNoClone","valueIsFunction","html","_evalUrl","keepData","cleanData","dataAndEvents","deepDataAndEvents","srcElements","destElements","inPage","detach","append","prepend","insertBefore","before","after","replaceWith","replaceChild","appendTo","prependTo","insertAfter","replaceAll","original","insert","rnumnonpx","getStyles","opener","getComputedStyle","swap","old","rboxStyle","curCSS","computed","width","minWidth","maxWidth","getPropertyValue","pixelBoxStyles","addGetHookIf","conditionFn","hookFn","computeStyleTests","container","cssText","divStyle","pixelPositionVal","reliableMarginLeftVal","roundPixelMeasures","marginLeft","right","pixelBoxStylesVal","boxSizingReliableVal","position","scrollboxSizeVal","offsetWidth","measure","round","parseFloat","reliableTrDimensionsVal","backgroundClip","clearCloneStyle","boxSizingReliable","pixelPosition","reliableMarginLeft","scrollboxSize","reliableTrDimensions","table","trChild","trStyle","height","parseInt","borderTopWidth","borderBottomWidth","offsetHeight","cssPrefixes","emptyStyle","vendorProps","finalPropName","final","cssProps","capName","vendorPropName","rdisplayswap","rcustomProp","cssShow","visibility","cssNormalTransform","letterSpacing","fontWeight","setPositiveNumber","subtract","max","boxModelAdjustment","dimension","box","isBorderBox","styles","computedVal","extra","delta","ceil","getWidthOrHeight","valueIsBorderBox","offsetProp","getClientRects","Tween","easing","cssHooks","opacity","animationIterationCount","columnCount","fillOpacity","flexGrow","flexShrink","gridArea","gridColumn","gridColumnEnd","gridColumnStart","gridRow","gridRowEnd","gridRowStart","lineHeight","order","orphans","widows","zIndex","zoom","origName","isCustomProp","setProperty","isFinite","getBoundingClientRect","scrollboxSizeBuggy","left","margin","padding","border","prefix","suffix","expand","expanded","parts","propHooks","run","percent","eased","duration","pos","step","fx","scrollTop","scrollLeft","linear","p","swing","cos","PI","fxNow","inProgress","opt","rfxtypes","rrun","schedule","hidden","requestAnimationFrame","interval","tick","createFxNow","genFx","includeWidth","createTween","animation","Animation","tweeners","properties","stopped","prefilters","currentTime","startTime","tweens","opts","specialEasing","originalProperties","originalOptions","gotoEnd","propFilter","bind","complete","timer","anim","*","tweener","oldfire","propTween","restoreDisplay","isBox","dataShow","unqueued","overflow","overflowX","overflowY","prefilter","speed","speeds","fadeTo","to","animate","optall","doAnimation","finish","stopQueue","timers","cssFn","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","slow","fast","delay","time","timeout","clearTimeout","checkOn","optSelected","radioValue","boolHook","removeAttr","nType","attrHooks","attrNames","getter","lowercaseName","rfocusable","rclickable","stripAndCollapse","getClass","classesToArray","removeProp","propFix","tabindex","for","class","addClass","classes","curValue","clazz","finalValue","removeClass","toggleClass","stateVal","isValidValue","classNames","hasClass","rreturn","valHooks","optionSet","focusin","rfocusMorph","stopPropagationCallback","onlyHandlers","bubbleType","ontype","lastElement","eventPath","parentWindow","simulate","triggerHandler","attaches","rquery","parseXML","parserErrorElem","DOMParser","parseFromString","rbracket","rCRLF","rsubmitterTypes","rsubmittable","buildParams","traditional","param","s","valueOrFunction","encodeURIComponent","serialize","serializeArray","r20","rhash","rantiCache","rheaders","rnoContent","rprotocol","transports","allTypes","originAnchor","addToPrefiltersOrTransports","structure","dataTypeExpression","dataType","dataTypes","inspectPrefiltersOrTransports","jqXHR","inspected","seekingTransport","inspect","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","ajaxSettings","active","lastModified","etag","url","isLocal","protocol","processData","async","contentType","accepts","json","responseFields","converters","* text","text html","text json","text xml","ajaxSetup","settings","ajaxPrefilter","ajaxTransport","ajax","transport","cacheURL","responseHeadersString","responseHeaders","timeoutTimer","urlAnchor","fireGlobals","uncached","callbackContext","globalEventContext","completeDeferred","statusCode","requestHeaders","requestHeadersNames","strAbort","getResponseHeader","getAllResponseHeaders","setRequestHeader","overrideMimeType","mimeType","status","abort","statusText","finalText","crossDomain","host","hasContent","ifModified","headers","beforeSend","success","send","nativeStatusText","responses","isSuccess","response","modified","ct","finalDataType","firstDataType","ajaxHandleResponses","conv2","current","conv","dataFilter","throws","ajaxConvert","getJSON","getScript","text script","wrapAll","firstElementChild","wrapInner","htmlIsFunction","unwrap","visible","xhr","XMLHttpRequest","xhrSuccessStatus","0","1223","xhrSupported","cors","errorCallback","open","username","xhrFields","onload","onerror","onabort","ontimeout","onreadystatechange","responseType","responseText","binary","scriptAttrs","charset","scriptCharset","evt","oldCallbacks","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","createHTMLDocument","implementation","keepScripts","parsed","params","animated","offset","setOffset","curPosition","curLeft","curCSSTop","curTop","curOffset","curCSSLeft","curElem","using","rect","win","pageYOffset","pageXOffset","offsetParent","parentOffset","scrollTo","Height","Width","","defaultExtra","funcName","unbind","delegate","undelegate","hover","fnOver","fnOut","proxy","holdReady","hold","parseJSON","isNumeric","isNaN","trim","define","amd","_jQuery","_$","$","noConflict"],"mappings":"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","file":"jquery-3.6.0.min.js"} \ No newline at end of file diff --git a/_static/language_data.js b/_static/language_data.js new file mode 100644 index 00000000..c7fe6c6f --- /dev/null +++ b/_static/language_data.js @@ -0,0 +1,192 @@ +/* + * This script contains the language-specific data used by searchtools.js, + * namely the list of stopwords, stemmer, scorer and splitter. + */ + +var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"]; + + +/* Non-minified version is copied as a separate JS file, if available */ + +/** + * Porter Stemmer + */ +var Stemmer = function() { + + var step2list = { + ational: 'ate', + tional: 'tion', + enci: 'ence', + anci: 'ance', + izer: 'ize', + bli: 'ble', + alli: 'al', + entli: 'ent', + eli: 'e', + ousli: 'ous', + ization: 'ize', + ation: 'ate', + ator: 'ate', + alism: 'al', + iveness: 'ive', + fulness: 'ful', + ousness: 'ous', + aliti: 'al', + iviti: 'ive', + biliti: 'ble', + logi: 'log' + }; + + var step3list = { + icate: 'ic', + ative: '', + alize: 'al', + iciti: 'ic', + ical: 'ic', + ful: '', + ness: '' + }; + + var c = "[^aeiou]"; // consonant + var v = "[aeiouy]"; // vowel + var C = c + "[^aeiouy]*"; // consonant sequence + var V = v + "[aeiou]*"; // vowel sequence + + var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/_static/material.css b/_static/material.css new file mode 100644 index 00000000..a3d9b27d --- /dev/null +++ b/_static/material.css @@ -0,0 +1 @@ +@charset "utf-8";.dropdown{width:125px;vertical-align:middle}.dropdownbutton{color:inherit;font-weight:700;font-size:.65rem}.dropdown-content{display:none;position:absolute;z-index:1;background-color:inherit}.dropdown-content a{display:block;width:125px;margin:8px;font-size:.65rem;font-weight:200}.dropdown-content a:hover{}.dropdown:hover .dropdown-content{display:block}.dropdown:hover .dropbtn{} \ No newline at end of file diff --git a/_static/minus.png b/_static/minus.png new file mode 100644 index 0000000000000000000000000000000000000000..d96755fdaf8bb2214971e0db9c1fd3077d7c419d GIT binary patch literal 90 zcmeAS@N?(olHy`uVBq!ia0vp^+#t*WBp7;*Yy1LIik>cxAr*|t7R?Mi>2?kWtu=nj kDsEF_5m^0CR;1wuP-*O&G^0G}KYk!hp00i_>zopr08q^qX#fBK literal 0 HcmV?d00001 diff --git a/_static/plus.png b/_static/plus.png new file mode 100644 index 0000000000000000000000000000000000000000..7107cec93a979b9a5f64843235a16651d563ce2d GIT binary patch literal 90 zcmeAS@N?(olHy`uVBq!ia0vp^+#t*WBp7;*Yy1LIik>cxAr*|t7R?Mi>2?kWtu>-2 m3q%Vub%g%s<8sJhVPMczOq}xhg9DJoz~JfX=d#Wzp$Pyb1r*Kz literal 0 HcmV?d00001 diff --git a/_static/pygments.css b/_static/pygments.css new file mode 100644 index 00000000..53526e7a --- /dev/null +++ b/_static/pygments.css @@ -0,0 +1 @@ +@charset "utf-8";pre{line-height:125%}td.linenos .normal{color:inherit;background-color:transparent;padding-left:5px;padding-right:5px}span.linenos{color:inherit;background-color:transparent;padding-left:5px;padding-right:5px}td.linenos .special{color:#000;background-color:#ffffc0;padding-left:5px;padding-right:5px}span.linenos.special{color:#000;background-color:#ffffc0;padding-left:5px;padding-right:5px}.highlight .hll{background-color:#ffc}.highlight{background:#f8f8f8}.highlight .c{color:#080;font-style:italic}.highlight .err{border:1px solid #F00}.highlight .k{color:#A2F;font-weight:bold}.highlight .o{color:#666}.highlight .ch{color:#080;font-style:italic}.highlight .cm{color:#080;font-style:italic}.highlight .cp{color:#080}.highlight .cpf{color:#080;font-style:italic}.highlight .c1{color:#080;font-style:italic}.highlight .cs{color:#080;font-weight:bold}.highlight .gd{color:#A00000}.highlight .ge{font-style:italic}.highlight .ges{font-weight:bold;font-style:italic}.highlight .gr{color:#F00}.highlight .gh{color:#000080;font-weight:bold}.highlight .gi{color:#00A000}.highlight .go{color:#888}.highlight .gp{color:#000080;font-weight:bold}.highlight .gs{font-weight:bold}.highlight .gu{color:#800080;font-weight:bold}.highlight .gt{color:#04D}.highlight .kc{color:#A2F;font-weight:bold}.highlight .kd{color:#A2F;font-weight:bold}.highlight .kn{color:#A2F;font-weight:bold}.highlight .kp{color:#A2F}.highlight .kr{color:#A2F;font-weight:bold}.highlight .kt{color:#0B0;font-weight:bold}.highlight .m{color:#666}.highlight .s{color:#B44}.highlight .na{color:#B44}.highlight .nb{color:#A2F}.highlight .nc{color:#00F}.highlight .no{color:#800}.highlight .nd{color:#A2F}.highlight .ni{color:#999;font-weight:bold}.highlight .ne{color:#D2413A;font-weight:bold}.highlight .nf{color:#00A000}.highlight .nl{color:#A0A000}.highlight .nn{color:#00F;font-weight:bold}.highlight .nt{color:#008000;font-weight:bold}.highlight .nv{color:#B8860B}.highlight .ow{color:#A2F;font-weight:bold}.highlight .w{color:#bbb}.highlight .mb{color:#666}.highlight .mf{color:#666}.highlight .mh{color:#666}.highlight .mi{color:#666}.highlight .mo{color:#666}.highlight .sa{color:#B44}.highlight .sb{color:#B44}.highlight .sc{color:#B44}.highlight .dl{color:#B44}.highlight .sd{color:#B44;font-style:italic}.highlight .s2{color:#B44}.highlight .se{color:#B62;font-weight:bold}.highlight .sh{color:#B44}.highlight .si{color:#B68;font-weight:bold}.highlight .sx{color:#008000}.highlight .sr{color:#B68}.highlight .s1{color:#B44}.highlight .ss{color:#B8860B}.highlight .bp{color:#A2F}.highlight .fm{color:#00A000}.highlight .vc{color:#B8860B}.highlight .vg{color:#B8860B}.highlight .vi{color:#B8860B}.highlight .vm{color:#B8860B}.highlight .il{color:#666} \ No newline at end of file diff --git a/_static/redoc-static.html b/_static/redoc-static.html new file mode 100644 index 00000000..c492e4e5 --- /dev/null +++ b/_static/redoc-static.html @@ -0,0 +1,943 @@ + + + + + + Jungfraujoch + + + + + + + + + +

Jungfraujoch (1.0.0-rc.144)

Download OpenAPI specification:

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

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

+

License Clarification

While this API definition is licensed under GPL-3.0, the GPL copyleft provisions do not apply +when this file is used solely to generate OpenAPI clients or when implementing applications that +interact with the API. Generated client code and applications using this API definition are not +subject to the GPL license requirements and may be distributed under terms of your choosing.

+

This exception is similar in spirit to the Linux Kernel's approach to userspace API headers and +the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that +user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not +derivative works of the kernel and are not subject to the terms of the GPL.

+

This exception is intended to allow wider use of this API specification without imposing GPL +requirements on applications that merely interact with the API, regardless of whether they +communicate through network calls or other mechanisms.

+

Initialize detector and data acquisition

Should be used in two cases:

+
    +
  • Detector is in Inactive state
  • +
  • Detector is in Error state +X-ray shutter must be closed. +This operation will reconfigure network interface of the detector. +During operation of the detector it is recommended to use the POST /pedestal operation instead. +If storage cells are used, the execution time might be few minutes.
  • +
+

This is async function - one needs to use POST /wait_till_done to ensure operation is done.

+

Responses

Response samples

Content type
application/json
{
  • "msg": "Detector in wrong state",
  • "reason": "WrongDAQState"
}

Collect dark current for the detector

Updates calibration of the JUNGFRAU detector. Must be in Idle state.

+

X-ray shutter must be closed. Recommended to run once per hour for long integration times (> 100 us).

+

This is async function - one needs to use POST /wait_till_done to ensure operation is done.

+

Responses

Response samples

Content type
application/json
{
  • "msg": "Detector in wrong state",
  • "reason": "WrongDAQState"
}

Start detector

Start data acquisition. +Detector must be in Idle state. +Default behavior is for the call to block until detector is ready to accept soft/TTL triggers. +However, this behavior can be changed by settings async_start to true in the request body, +in which case the call will return immediately and one needs to use /wait_until_running to ensure detector is ready to run.

+
Request Body schema: application/json
images_per_trigger
integer <int64> >= 1
Default: 1

For standard synchrotron data collection - this is number of images collected per one TTL trigger +For XFEL (pulsed source) - this number is ignored and set to 1 +For storage cell mode - this number is ignored and set to number of storage cells

+
ntrigger
integer <int64> >= 1
Default: 1

Number of TTL trigger that the detector is expected to receive during data collection

+
image_time_us
integer <int64> >= 0

Image time. +If not provided (or zero value) the frame time is assumed as default. +For JUNGFRAU image time must be multiple of frame time and max value is 256 * frame_time.
In XFEL mode: summation happens for frames collected with multiple triggers. +Ignored for storage cells and if raw data are saved.

+
beam_x_pxl
required
number <float>

/entry/detector/beam_center_x in NXmx +Beam center in X direction [pixels]

+
beam_y_pxl
required
number <float>

/entry/detector/beam_center_y in NXmx +Beam center in X direction [pixels]

+
detector_distance_mm
required
number <float> >= 0

/entry/detector/distance in NXmx Detector distance [mm]

+
incident_energy_keV
required
number <float> [ 0.001 .. 500 ]

Used to calculate /entry/beam/incident_wavelength in NXmx +Incident particle (photon, electron) energy in keV

+
file_prefix
string
Default: ""

Prefix for filenames. If left empty, no file will be saved.

+
images_per_file
integer <int64> >= 0
Default: 1000

Number of files in a single HDF5 data file (0 = write all images to a single data file).

+
space_group_number
integer <int64> [ 1 .. 194 ]

Number of space group for the crystal. Currently used solely as metadata, not relevant for image processing done in Jungfraujoch.

+
sample_name
string
Default: ""

/entry/sample/name in NXmx +Sample name

+
compression
string
Default: "bslz4"
Enum: "bslz4" "bszstd" "bszstd_rle" "none"

Compression type for the images transferred over ZeroMQ and saved to HDF5 file.

+
total_flux
number <float>

/entry/beam/total_flux in NXmx +Flux incident on beam plane in photons per second. In other words this is the flux integrated over area. [photons/s]

+
transmission
number <float> [ 0 .. 1 ]

/entry/instrument/attenuator/attenuator_transmission +Transmission of attenuator (filter) [no units]

+
object (rotation_axis)

Definition of a crystal rotation axis

+
object (grid_scan)

Definition of a grid scan (mutually exclusive with rotation_axis)

+
header_appendix
any

Header appendix, added as user_data/user to start ZeroMQ message (can be any valid JSON) +In general, it is not saved in HDF5 file.

+

However, if values are placed in "hdf5" object, jfjoch_writer will write them in /entry/data of the HDF5 file. +This applies solely to string and number (double floating-point). No arrays/sub-objects is allowed. +For example {"hdf5": {"val1":1, "val2":"xyz"}}, will write /entry/user/val1 and /entry/user/val2.

+
image_appendix
any

Image appendix, added as user_data to image ZeroMQ message (can be any valid JSON) +Not saved in HDF5 file

+
data_reduction_factor_serialmx
number <float> [ 0 .. 1 ]
Default: 1

Rate at which non-indexed images are accepted to be forwarded to writer. +Value of 1.0 (default) means that all images are written. +Values below zero mean that non-indexed images will be accepted with a given probability.

+
pixel_value_low_threshold
integer <int64> >= 0

Set all counts lower than the value to zero. +When the value is set, negative numbers other than error pixel value are always set to zero. +Setting to zero is equivalent to turning the option off.

+
run_number
integer <int64> >= 0

Number of run within an experimental session. +Transferred over CBOR stream as "series ID", though not saved in HDF5 file. +It is highly recommended to keep this number unique for each data collection during experimental series. +If not provided, the number will be automatically incremented.

+
run_name
string

Unique ID of run. +Transferred over CBOR stream as "unique series ID", though not saved in HDF5 file. +It is highly recommended to keep this name unique for each data collection during experimental series. +If not provided, the name will be automatically generated as number + colon + file_prefix.

+
experiment_group
string

Name of group owning the data (e.g. p-group or proposal number). +Transferred over CBOR stream, though not saved in HDF5 file.

+
poisson_compression
integer <int64> [ 0 .. 16 ]

Enable lossy compression of pixel values that preserves Poisson statistics. +Requires to provide a numerical factor SQ. +Pixel value P will be transformed to round(sqrt(P) * SQ), with rounding to the closest integer. +Compression is turned off if the value is missing or it is set to zero.

+
write_nxmx_hdf5_master
boolean
Default: true

Write NXmx formatted HDF5 master file. Recommended to use for macromolecular crystallography experiments +and to turn off for other experiments.

+
save_calibration
boolean

Forward image calibration (at the moment pedestal and pedestal RMS for JUNGFRAU) using the ZeroMQ stream to writer. +If parameter is not provided calibration will be saved only if more than 4 images are recorded.

+
polarization_factor
number <float> [ -1 .. 1 ]

Polarization factor for integration; 1.0 is horizontal polarization; -1.0 is vertical polarization

+
ring_current_mA
number <float> >= 0

Ring current at the beginning of the data collection

+
sample_temperature_K
number <float> >= 0

Sample temperature in Kelvin

+
poni_rot1_rad
number <float> [ -6.28318530718 .. 6.28318530718 ]
Default: 0

PONI angle rot1 (see PyFAI documentation for details) in radians

+
poni_rot2_rad
number <float> [ -6.28318530718 .. 6.28318530718 ]
Default: 0

PONI angle rot2 (see PyFAI documentation for details) in radians

+
poni_rot3_rad
number <float> [ -6.28318530718 .. 6.28318530718 ]
Default: 0

PONI angle rot3 (see PyFAI documentation for details) in radians

+
object (unit_cell)

Unit cell parameters. Necessary to run indexing. Units of angstrom and degree

+
spot_finding
boolean
Default: true

Enable spot finding and save spots

+
max_spot_count
integer [ 10 .. 2000 ]
Default: 250

Maximum number of spots that are saved/used for indexing; spots with highest intensity are selected

+
detect_ice_rings
boolean

Flag spots as ice rings and reduce their effect on indexing

+
async_start
boolean
Default: false

When set to true, /start will not wait for detector and Jungfraujoch to be ready for the measurement.

+
object

Responses

Request samples

Content type
application/json
{
  • "images_per_trigger": 1,
  • "ntrigger": 1,
  • "image_time_us": 0,
  • "beam_x_pxl": 0.1,
  • "beam_y_pxl": 0.1,
  • "detector_distance_mm": 0.1,
  • "incident_energy_keV": 0.001,
  • "file_prefix": "",
  • "images_per_file": 1000,
  • "space_group_number": 1,
  • "sample_name": "",
  • "compression": "bslz4",
  • "total_flux": 0.1,
  • "transmission": 1,
  • "goniometer": {
    },
  • "grid_scan": {
    },
  • "header_appendix": null,
  • "image_appendix": null,
  • "data_reduction_factor_serialmx": 1,
  • "pixel_value_low_threshold": 0,
  • "run_number": 0,
  • "run_name": "string",
  • "experiment_group": "string",
  • "poisson_compression": 16,
  • "write_nxmx_hdf5_master": true,
  • "save_calibration": true,
  • "polarization_factor": -1,
  • "ring_current_mA": 0.1,
  • "sample_temperature_K": 0.1,
  • "poni_rot1_rad": 0,
  • "poni_rot2_rad": 0,
  • "poni_rot3_rad": 0,
  • "unit_cell": {
    },
  • "spot_finding": true,
  • "max_spot_count": 250,
  • "detect_ice_rings": true,
  • "async_start": false,
  • "xray_fluorescence_spectrum": {
    }
}

Response samples

Content type
application/json
{
  • "msg": "Detector in wrong state",
  • "reason": "WrongDAQState"
}

Wait for acquisition running

Block execution of external script till detector and Jungfraujoch are ready to collect data. +To not block web server for a indefinite period of time, the procedure is provided with a timeout. +Extending timeout is possible, but requires to ensure safety that client will not close the connection and retry the connection.

+
query Parameters
timeout
integer [ 0 .. 3600 ]
Default: 60

Timeout in seconds (0 == immediate response)

+

Responses

Response samples

Content type
application/json
{
  • "msg": "Detector in wrong state",
  • "reason": "WrongDAQState"
}

Wait for acquisition done

Block execution of external script till initialization, data collection or pedestal is finished. +Running this command does not affect (cancel) running data collection, it is only to ensure synchronous execution of other software.

+

To not block web server for a indefinite period of time, the procedure is provided with a timeout. +Extending timeout is possible, but requires to ensure safety that client will not close the connection and retry the connection.

+
query Parameters
timeout
integer [ 0 .. 3600 ]
Default: 60

Timeout in seconds (0 == immediate response)

+

Responses

Response samples

Content type
application/json
{
  • "msg": "Detector in wrong state",
  • "reason": "WrongDAQState"
}

Send soft trigger to the detector

Generate soft trigger

+

Responses

Cancel running data collection

Command will inform FPGA network card to stop pedestal or data collection at the current stage. +Any frame that is currently being processed by CPU will be finished and sent to writer. +Given the command is making sure to gracefully stop data acquisition and detector, it might take some time to switch back after command finished to Idle state.

+

If data collection is not running, the command has no effect.

+

Responses

Prepare detector to turn off

Should be in Idle or Error state. +Command deactivates data acquisition and turns off detector high voltage and ASIC. +Should be used always before turning off power from the detector.

+

Responses

Response samples

Content type
application/json
{
  • "msg": "Detector in wrong state",
  • "reason": "WrongDAQState"
}

Change detector configuration

Detector settings are ones that have effect on calibration, i.e., pedestal has to be collected again after changing these settings. +This can only be done when detector is Idle, Error or Inactive states. +If detector is in Idle state , pedestal procedure will be executed automatically - there must be no X-rays on the detector during the operation. +If detector is in Inactive or Error states, new settings will be saved, but no calibration will be executed.

+
Request Body schema: application/json
frame_time_us
required
integer <int64> >= 1

Interval between consecutive frames. +This is internal frame time for the JUNGFRAU detector, image time has to be integer multiply of this number. +For EIGER detector this is default frame time, not used otherwise

+
count_time_us
integer <int64>

Integration time of the detector. +If not provided count time will be set to maximum value for a given frame time.

+
internal_frame_generator
boolean
Default: false

Use internal frame generator in FPGA instead of getting data from a real detector

+
internal_frame_generator_images
integer <int64> [ 1 .. 64 ]
Default: 1

Number of images stored in the internal frame generator.

+
detector_trigger_delay_ns
integer <int64> >= 0
Default: 0

Delay between TTL trigger and acquisition start [ns]

+
timing
string (detector_timing)
Default: "trigger"
Enum: "auto" "trigger" "burst" "gated"
eiger_threshold_keV
number <float> [ 1 .. 100 ]

Threshold for the PSI EIGER detector and all DECTRIS detectors. +If value is provided, it will be used for all subsequent acquisitions, irrespective of beam energy. +If value is not provided, threshold will be determined on start of acquisition as half of incident energy. +This might lead to increased start time.

+
eiger_bit_depth
integer <int64>
Enum: 8 16 32

Bit depth of PSI EIGER read-out. This is
If value is not provided, depth will be determined based on the image time:

+
    +
  • Exposure time < 500 microseconds depth of 8 bit will be used,
  • +
  • 500 <= exposure time < 2622 microseconds depth of 16 bit will be used
  • +
  • Exposure time >= 2622 microseconds depth of 32 bit will be used.
  • +
+
jungfrau_pedestal_g0_frames
integer <int64> >= 0
Default: 2000
jungfrau_pedestal_g1_frames
integer <int64> >= 0
Default: 300
jungfrau_pedestal_g2_frames
integer <int64> >= 0
Default: 300
jungfrau_pedestal_min_image_count
integer <int64> >= 32
Default: 128

Minimum number of collected images for pedestal to consider it viable

+
jungfrau_storage_cell_count
integer <int64> [ 1 .. 16 ]
Default: 1
jungfrau_storage_cell_delay_ns
integer <int64> >= 2100
Default: 5000

Delay between two storage cells [ns]

+
jungfrau_fixed_gain_g1
boolean
Default: false

Fix gain to G1 (can be useful for storage cells)

+
jungfrau_use_gain_hg0
boolean
Default: false

Use high G0 (for low energy applications)

+

Responses

Request samples

Content type
application/json
{
  • "frame_time_us": 1,
  • "count_time_us": 0,
  • "internal_frame_generator": false,
  • "internal_frame_generator_images": 1,
  • "detector_trigger_delay_ns": 0,
  • "timing": "auto",
  • "eiger_threshold_keV": 1,
  • "eiger_bit_depth": 8,
  • "jungfrau_pedestal_g0_frames": 2000,
  • "jungfrau_pedestal_g1_frames": 300,
  • "jungfrau_pedestal_g2_frames": 300,
  • "jungfrau_pedestal_min_image_count": 128,
  • "jungfrau_storage_cell_count": 1,
  • "jungfrau_storage_cell_delay_ns": 5000,
  • "jungfrau_fixed_gain_g1": false,
  • "jungfrau_use_gain_hg0": false
}

Response samples

Content type
application/json
{
  • "msg": "Detector in wrong state",
  • "reason": "WrongDAQState"
}

Get detector configuration

Can be done anytime

+

Responses

Response samples

Content type
application/json
{
  • "frame_time_us": 1,
  • "count_time_us": 0,
  • "internal_frame_generator": false,
  • "internal_frame_generator_images": 1,
  • "detector_trigger_delay_ns": 0,
  • "timing": "auto",
  • "eiger_threshold_keV": 1,
  • "eiger_bit_depth": 8,
  • "jungfrau_pedestal_g0_frames": 2000,
  • "jungfrau_pedestal_g1_frames": 300,
  • "jungfrau_pedestal_g2_frames": 300,
  • "jungfrau_pedestal_min_image_count": 128,
  • "jungfrau_storage_cell_count": 1,
  • "jungfrau_storage_cell_delay_ns": 5000,
  • "jungfrau_fixed_gain_g1": false,
  • "jungfrau_use_gain_hg0": false
}

Change indexing algorithm settings

This can only be done when detector is Idle, Error or Inactive states.

+
Request Body schema: application/json
algorithm
required
string (indexing_algorithm)
Default: "FFBIDX"
Enum: "FFBIDX" "FFT" "FFTW" "Auto" "None"

Selection of an indexing algorithm used by Jungfraujoch

+
fft_max_unit_cell_A
required
number <float> [ 50 .. 500 ]
Default: 250

Largest unit cell to be indexed by FFT algorithm; parameter value affects execution time of FFT

+
fft_min_unit_cell_A
required
number <float> [ 5 .. 40 ]
Default: 10

Smallest unit cell to be indexed by FFT algorithm; parameter value affects execution time of FFT

+
fft_high_resolution_A
required
number <float> [ 0.5 .. 6 ]
Default: 2

Highest resolution of spots used for FFT algorithm; parameter value affects execution time of FFT. +There is also correlation between smallest unit cell and max resolution, which need to be checked for very small systems.

+
fft_num_vectors
required
integer <int64> >= 128
Default: 16384

Number of search directions for the FFT algorithm; parameter value affects execution time of FFT.

+
tolerance
required
number <float> [ 0 .. 0.5 ]

Acceptance tolerance for spots after the indexing run - the larger the number, the more spots will be accepted

+
thread_count
required
integer <int64> [ 1 .. 64 ]

Thread count for indexing algorithm

+
geom_refinement_algorithm
required
string (geom_refinement_algorithm)
Enum: "BeamCenter" "None"

Selection of an post-indexing detector geometry refinement algorithm used by Jungfraujoch. +This option is using non-linear least squares optimization to find unit cell and beam center.

+
unit_cell_dist_tolerance
required
number <float> [ 0.0001 .. 0.2001 ]
Default: 0.05

Relative distance tolerance for unit cell vs. reference; Lattices outside given tolerance will be ignored

+
viable_cell_min_spots
required
integer <int64> >= 5
Default: 10

Minimum number of indexed spots required for a cell to be considered viable

+
index_ice_rings
required
boolean
Default: false

Include spots marked as ice rings in the indexing run. +If dataset_settings doesn't have detect_ice_rings on, this option will have no effect on processing.

+
rotation_indexing
required
boolean
Default: false
rotation_indexing_min_angular_range_deg
required
number <float> >= 1
Default: 20
rotation_indexing_angular_stride_deg
required
number <float> >= 0
Default: 0.5
blocking
required
boolean
Default: true

Indexing in Jungfraujoch goes with a dedicated thread pool. +If set to false, the thread pool is non-blocking, i.e. if there are no threads available, image indexing will be skipped. This option is recommended for real-time processing at high frame rates. +If set to true, the thread pool will block until a thread is available.

+

Responses

Request samples

Content type
application/json
{
  • "algorithm": "FFBIDX",
  • "fft_max_unit_cell_A": 250,
  • "fft_min_unit_cell_A": 10,
  • "fft_high_resolution_A": 2,
  • "fft_num_vectors": 16384,
  • "tolerance": 0.5,
  • "thread_count": 1,
  • "geom_refinement_algorithm": "BeamCenter",
  • "unit_cell_dist_tolerance": 0.05,
  • "viable_cell_min_spots": 10,
  • "index_ice_rings": false,
  • "rotation_indexing": false,
  • "rotation_indexing_min_angular_range_deg": 20,
  • "rotation_indexing_angular_stride_deg": 0.5,
  • "blocking": true
}

Response samples

Content type
application/json
{
  • "msg": "Detector in wrong state",
  • "reason": "WrongDAQState"
}

Get indexing configuration

Can be done anytime

+

Responses

Response samples

Content type
application/json
{
  • "algorithm": "FFBIDX",
  • "fft_max_unit_cell_A": 250,
  • "fft_min_unit_cell_A": 10,
  • "fft_high_resolution_A": 2,
  • "fft_num_vectors": 16384,
  • "tolerance": 0.5,
  • "thread_count": 1,
  • "geom_refinement_algorithm": "BeamCenter",
  • "unit_cell_dist_tolerance": 0.05,
  • "viable_cell_min_spots": 10,
  • "index_ice_rings": false,
  • "rotation_indexing": false,
  • "rotation_indexing_min_angular_range_deg": 20,
  • "rotation_indexing_angular_stride_deg": 0.5,
  • "blocking": true
}

Change file writer settings

This can only be done when detector is Idle, Error or Inactive states.

+
Request Body schema: application/json
overwrite
boolean
Default: false

Inform jfjoch_write to overwrite existing files. Otherwise files would be saved with .h5.{timestamp}.tmp suffix.

+
format
string (file_writer_format)
Default: "NXmxLegacy"
Enum: "NXmxOnlyData" "NXmxLegacy" "NXmxVDS" "NXmxIntegrated" "CBF" "TIFF" "NoFileWritten"

NoFileWritten - no files are written at all +NXmxOnlyData - only data files are written, no master file +NXmxLegacy - legacy format with soft links to data files in the master file; necessary for DECTRIS Albula 4.0 and DECTRIS Neggia
NXmxVDS - newer format with virtual dataset linking data files in the master file, also includes better metadata handling +NXmxIntegrated - single HDF5 per dataset +CBF - CBF format (limited metadata) +TIFF - TIFF format (no metadata)

+

Responses

Request samples

Content type
application/json
{
  • "overwrite": false,
  • "format": "NXmxOnlyData"
}

Response samples

Content type
application/json
{
  • "msg": "Detector in wrong state",
  • "reason": "WrongDAQState"
}

Get file writer settings

Can be done anytime

+

Responses

Response samples

Content type
application/json
{
  • "overwrite": false,
  • "format": "NXmxOnlyData"
}

Change instrument metadata

This can only be done when detector is Idle, Error or Inactive states.

+
Request Body schema: application/json
source_name
required
string
source_type
string
Default: ""

Type of radiation source. NXmx gives a fixed dictionary, though Jungfraujoch is not enforcing compliance. +https://manual.nexusformat.org/classes/base_classes/NXsource.html#nxsource +NXsource allows the following:

+

Spallation Neutron Source +Pulsed Reactor Neutron Source +Reactor Neutron Source +Synchrotron X-ray Source +Pulsed Muon Source +Rotating Anode X-ray +Fixed Tube X-ray +UV Laser +Free-Electron Laser +Optical Laser +Ion Source +UV Plasma Source +Metal Jet X-ray

+
instrument_name
required
string
pulsed_source
boolean
Default: false

Settings specific to XFEL (e.g., every image has to come from TTL trigger, save pulse ID and event code)

+
electron_source
boolean
Default: false

Settings specific to electron source (e.g., wavelength definition)

+

Responses

Request samples

Content type
application/json
{
  • "source_name": "Swiss Light Source",
  • "source_type": "Synchrotron X-ray Source",
  • "instrument_name": "CristallinaMX",
  • "pulsed_source": false,
  • "electron_source": false
}

Response samples

Content type
application/json
{
  • "msg": "Detector in wrong state",
  • "reason": "WrongDAQState"
}

Get instrument metadata

Can be done anytime

+

Responses

Response samples

Content type
application/json
{
  • "source_name": "Swiss Light Source",
  • "source_type": "Synchrotron X-ray Source",
  • "instrument_name": "CristallinaMX",
  • "pulsed_source": false,
  • "electron_source": false
}

Change image output format

This can only be done when detector is Idle, Error or Inactive states.

+
Request Body schema: application/json
summation
required
boolean

Enable summation of images to a given image_time +If disabled images are saved according to original detector speed, but image count is adjusted

+
geometry_transform
required
boolean

Place module read-out into their location on composed detector and extend multipixels

+
jungfrau_conversion
required
boolean

Convert pixel value in ADU to photon counts/energy +Only affects JUNGFRAU detector

+
jungfrau_conversion_factor_keV
number <float> [ 0.001 .. 500 ]

Used to convert energy deposited into pixel to counts +If not provided incident_energy_keV is used

+
bit_depth_image
integer <int64>
Enum: 8 16 32

Bit depth of resulting image (it doesn't affect the detector read-out value) +If not provided value is adjusted automatically

+
signed_output
boolean

Controls if pixels have signed output +If not provided value is adjusted automatically

+
mask_module_edges
required
boolean
Default: true

Mask 1 pixel on the module boundary

+
mask_chip_edges
required
boolean
Default: true

Mask multipixels on chip boundary

+
jungfrau_mask_pixels_without_g0
boolean
Default: true

JUNGFRAU: mask pixels that don't operate in G0, but do operate in G1 and G1. +This should be turned off for cases, where detector is operated at room temperature with long exposure time.

+
apply_mask
required
boolean
Default: false

Masked pixels are set to special value in the images produced by Jungfraujoch

+
jungfrau_pedestal_g0_rms_limit
integer <int64> >= 0
Default: 100

Pixels with pedestal G0 RMS above the threshold are marked as masked pixels

+

Responses

Request samples

Content type
application/json
{
  • "summation": true,
  • "geometry_transform": true,
  • "jungfrau_conversion": true,
  • "jungfrau_conversion_factor_keV": 0.001,
  • "bit_depth_image": 8,
  • "signed_output": true,
  • "mask_module_edges": true,
  • "mask_chip_edges": true,
  • "jungfrau_mask_pixels_without_g0": true,
  • "apply_mask": false,
  • "jungfrau_pedestal_g0_rms_limit": 100
}

Response samples

Content type
application/json
{
  • "msg": "Detector in wrong state",
  • "reason": "WrongDAQState"
}

Get image output format

Can be done anytime

+

Responses

Response samples

Content type
application/json
{
  • "summation": true,
  • "geometry_transform": true,
  • "jungfrau_conversion": true,
  • "jungfrau_conversion_factor_keV": 0.001,
  • "bit_depth_image": 8,
  • "signed_output": true,
  • "mask_module_edges": true,
  • "mask_chip_edges": true,
  • "jungfrau_mask_pixels_without_g0": true,
  • "apply_mask": false,
  • "jungfrau_pedestal_g0_rms_limit": 100
}

Configure format for raw data collection

This can only be done when detector is Idle, Error or Inactive states.

+

Responses

Response samples

Content type
application/json
{
  • "msg": "Detector in wrong state",
  • "reason": "WrongDAQState"
}

Configure format for data collection with full conversion

This can only be done when detector is Idle, Error or Inactive states.

+

Responses

Response samples

Content type
application/json
{
  • "msg": "Detector in wrong state",
  • "reason": "WrongDAQState"
}

Configure spot finding

Can be done anytime, also while data collection is running

+
Request Body schema: application/json
enable
required
boolean
Default: true

Enable spot finding. This is temporary setting, i.e. can be changed anytime during data collection. +Even if disabled spot finding information will still be send and written, though always with zero spots.

+
indexing
required
boolean
Default: true

Enable indexing. This is temporary setting, i.e. can be changed anytime during data collection.

+
signal_to_noise_threshold
required
number <float> >= 0
photon_count_threshold
required
integer <int64> >= 0
min_pix_per_spot
required
integer <int64> >= 1
max_pix_per_spot
required
integer <int64> >= 1
high_resolution_limit
required
number <float>

High resolution limit for spot finding [Angstrom]

+
low_resolution_limit
required
number <float>

Low resolution limit for spot finding [Angstrom]

+
high_resolution_limit_for_spot_count_low_res
required
number <float> [ 2 .. 8 ]

High resolution threshold to consider spot "low resolution" [Angstrom]

+
quick_integration
required
boolean
Default: false

Quick integration of Bragg spots in diffraction images. +If enabled it will likely reduce performance of Jungfraujoch for datasets with a very high indexing rate. +(experimental feature)

+
ice_ring_width_q_recipA
required
number <float> [ 0 .. 1 ]
Default: 0.02

Width of ice ring in q-space in reciprocal space

+
high_res_gap_Q_recipA
number <float> [ 0.1 .. 5 ]
Default: 1.5

This parameter is used to remove spurious spots at a very high resolution, that sometimes appear due to very low background close to the edge of the detector. +If there is a gap in (1/d)-space between spots of at least this size, spots on the side of the gap with high resolution will be discarded. This is optional parameter. +This option should be turned OFF for small molecule datasets or for crystals with very low mosaicity, when it is expected to see only few spots in any case.

+

Responses

Request samples

Content type
application/json
{
  • "enable": true,
  • "indexing": true,
  • "signal_to_noise_threshold": 0.1,
  • "photon_count_threshold": 0,
  • "min_pix_per_spot": 1,
  • "max_pix_per_spot": 1,
  • "high_resolution_limit": 0.1,
  • "low_resolution_limit": 0.1,
  • "high_resolution_limit_for_spot_count_low_res": 2,
  • "quick_integration": false,
  • "ice_ring_width_q_recipA": 0.02,
  • "high_res_gap_Q_recipA": 1.5
}

Get data processing configuration

Can be done anytime

+

Responses

Response samples

Content type
application/json
{
  • "enable": true,
  • "indexing": true,
  • "signal_to_noise_threshold": 0.1,
  • "photon_count_threshold": 0,
  • "min_pix_per_spot": 1,
  • "max_pix_per_spot": 1,
  • "high_resolution_limit": 0.1,
  • "low_resolution_limit": 0.1,
  • "high_resolution_limit_for_spot_count_low_res": 2,
  • "quick_integration": false,
  • "ice_ring_width_q_recipA": 0.02,
  • "high_res_gap_Q_recipA": 1.5
}

Configure azimuthal integration

Can be done when detector is Inactive or Idle

+
Request Body schema: application/json
polarization_corr
required
boolean
Default: true

Apply polarization correction for azimuthal integration (polarization factor must be configured in dataset settings)

+
solid_angle_corr
required
boolean
Default: true

Apply solid angle correction for azimuthal integration

+
high_q_recipA
required
number <float>
low_q_recipA
required
number <float>
q_spacing
required
number <float>
azimuthal_bins
integer <int64> [ 1 .. 256 ]
Default: 1

Numer of azimuthal (phi) bins; 1 = standard 1D azimuthal integration

+

Responses

Request samples

Content type
application/json
{
  • "polarization_corr": true,
  • "solid_angle_corr": true,
  • "high_q_recipA": 0.1,
  • "low_q_recipA": 0.1,
  • "q_spacing": 0.1,
  • "azimuthal_bins": 1
}

Response samples

Content type
application/json
{
  • "msg": "Detector in wrong state",
  • "reason": "WrongDAQState"
}

Get azimuthal integration configuration

Can be done anytime

+

Responses

Response samples

Content type
application/json
{
  • "polarization_corr": true,
  • "solid_angle_corr": true,
  • "high_q_recipA": 0.1,
  • "low_q_recipA": 0.1,
  • "q_spacing": 0.1,
  • "azimuthal_bins": 1
}

Load binary image for internal FPGA generator

Load image for internal FPGA generator. This can only happen in Idle state of the detector. +Requires binary blob with 16-bit integer numbers of size of detector in raw/converted coordinates +(depending on detector settings).

+
query Parameters
id
integer <int64> [ 0 .. 127 ]

Image id to upload

+
Request Body schema: application/octet-stream
string <binary>

Responses

Load TIFF image for internal FPGA generator

Load image for internal FPGA generator. This can only happen in Idle state of the detector. +Requires TIFF with 16-bit integer numbers of size of detector in raw/converted coordinates +(depending on detector settings).

+
query Parameters
id
integer [ 0 .. 127 ]

Image ID to upload

+
Request Body schema: image/tiff
string <binary>

Responses

Select detector

Jungfraujoch allows to control multiple detectors and/or region-of-interests. +The command allows to choose one detector from the list (ID has to be consistent with one provided by GET response). +Changing detector will set detector to Inactive state and will require reinitialization.

+
Request Body schema: application/json
id
required
integer <int64>

Responses

Request samples

Content type
application/json
{
  • "id": 1
}

Response samples

Content type
application/json
{
  • "msg": "Detector in wrong state",
  • "reason": "WrongDAQState"
}

List available detectors

Configured detectors that can be selected by used

+

Responses

Response samples

Content type
application/json
{
  • "detectors": [
    ],
  • "current_id": 0
}

Set ZeroMQ preview settings

Jungfraujoch can generate preview message stream on ZeroMQ SUB socket. +Here settings of the socket can be adjusted. +While the data structure contains also socket_address, this cannot be changed via HTTP and is ignore in PUT request. +Options set with this PUT request have no effect on HTTP based preview.

+
Request Body schema: application/json
enabled
required
boolean
Default: true

ZeroMQ preview socket is enabled.

+
period_ms
required
integer <int64>
Default: 1000

Period for generating preview image sent to the ZeroMQ interface in milliseconds. Default is 1 second. +If set to zero, all images will be sent ZeroMQ (should be used only in case of relatively slow data collection). +This has no effect on HTTP based preview, which updates always at rate of 1 second.

+
socket_address
string

PUB ZeroMQ socket for preview images. This socket operates at a reduced frame rate. +Images are serialized using CBOR. +Address follows ZeroMQ convention for sockets - in practice ipc:// and tcp://: sockets are OK. +0.0.0.0 instead of IP address is accepted and means listening on all network interfaces.

+

Responses

Request samples

Content type
application/json
{
  • "enabled": true,
  • "period_ms": 1000,
  • "socket_address": "string"
}

Response samples

Content type
application/json
{
  • "msg": "Detector in wrong state",
  • "reason": "WrongDAQState"
}

Get ZeroMQ preview settings

Responses

Response samples

Content type
application/json
{
  • "enabled": true,
  • "period_ms": 1000,
  • "socket_address": "string"
}

Set ZeroMQ metadata settings

Jungfraujoch can generate metadata message stream on ZeroMQ PUB socket. This stream covers all images. +Here settings of the socket can be adjusted. +While the data structure contains also socket_address, this cannot be changed via HTTP and is ignore in PUT request.

+
Request Body schema: application/json
enabled
required
boolean
Default: true

ZeroMQ metadata socket is enabled.

+
period_ms
required
integer <int64> >= 1
Default: 1000

Period for generating metadata package sent to the ZeroMQ interface in milliseconds.

+
socket_address
string

PUB ZeroMQ socket for image metadata information. +Image metadata are serialized using CBOR. +Address follows ZeroMQ convention for sockets - in practice ipc:// and tcp://: sockets are OK. +0.0.0.0 instead of IP address is accepted and means listening on all network interfaces.

+

Responses

Request samples

Content type
application/json
{
  • "enabled": true,
  • "period_ms": 1000,
  • "socket_address": "string"
}

Response samples

Content type
application/json
{
  • "msg": "Detector in wrong state",
  • "reason": "WrongDAQState"
}

Get ZeroMQ metadata socket settings

Responses

Response samples

Content type
application/json
{
  • "enabled": true,
  • "period_ms": 1000,
  • "socket_address": "string"
}

Set configuration for dark data collection to calculate mask

This is only possible when operating DECTRIS detectors at the moment; it will be also available for PSI EIGER at some point. +This can only be done when detector is Idle, Error or Inactive states.

+
Request Body schema: application/json
detector_threshold_keV
required
number <float> [ 2.5 .. 100 ]
Default: 3.5

Energy threshold for dark image collection

+
frame_time_us
required
integer <int64> [ 500 .. 100000 ]
Default: 10000

Time between frames for dark image collection

+
number_of_frames
required
integer <int64> >= 0
Default: 1000

Number of frames for dark image collection; zero means no dark collection

+
max_allowed_pixel_count
required
integer <int64> >= 0
Default: 1

Maximum count in a pixel considered normal (not-masked)

+
max_frames_with_signal
required
integer <int64> >= 0
Default: 10

Maximum number of frames with signal in a pixel considered normal (not-masked)

+

Responses

Request samples

Content type
application/json
{
  • "detector_threshold_keV": 3.5,
  • "frame_time_us": 10000,
  • "number_of_frames": 1000,
  • "max_allowed_pixel_count": 1,
  • "max_frames_with_signal": 10
}

Response samples

Content type
application/json
{
  • "msg": "Detector in wrong state",
  • "reason": "WrongDAQState"
}

Get settings for dark data collection to calculate mask

Responses

Response samples

Content type
application/json
{
  • "detector_threshold_keV": 3.5,
  • "frame_time_us": 10000,
  • "number_of_frames": 1000,
  • "max_allowed_pixel_count": 1,
  • "max_frames_with_signal": 10
}

Get Jungfraujoch status

Status of the data acquisition

+

Responses

Response samples

Content type
application/json
{
  • "state": "Inactive",
  • "progress": 1,
  • "message": "string",
  • "message_severity": "success",
  • "gpu_count": 0,
  • "broker_version": "1.0.0-rc.128"
}

Get status of FPGA devices

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Return XFEL pulse IDs for the current data acquisition

Return array of XFEL pulse IDs - (-1) if image not recorded

+

Responses

Response samples

Content type
application/json
[
  • 0
]

Return XFEL event codes for the current data acquisition

Return array of XFEL event codes

+

Responses

Response samples

Content type
application/json
[
  • 0
]

Get status of image pusher

Responses

Response samples

Content type
application/json
{
  • "pusher_type": "ZeroMQ",
  • "addr": [
    ],
  • "connected_writers": 0,
  • "images_written": 0,
  • "images_write_error": 0,
  • "writer_fifo_utilization": [
    ]
}

Get detector status

Status of the JUNGFRAU detector

+

Responses

Response samples

Content type
application/json
{
  • "state": "Idle",
  • "powerchip": "PowerOn",
  • "server_version": "string",
  • "number_of_triggers_left": 0,
  • "fpga_temp_degC": [
    ],
  • "high_voltage_V": [
    ]
}

Get ROI definitions

Responses

Response samples

Content type
application/json
{
  • "box": {
    },
  • "circle": {
    },
  • "azim": {
    }
}

Upload ROI definitions

Request Body schema: application/json
required
object (roi_box_list)

List of box ROIs

+
required
object (roi_circle_list)

List of circular ROIs

+
required
object (roi_azim_list)

List of azimuthal ROIs

+

Responses

Request samples

Content type
application/json
{
  • "box": {
    },
  • "circle": {
    },
  • "azim": {
    }
}

Response samples

Content type
application/json
{
  • "msg": "Detector in wrong state",
  • "reason": "WrongDAQState"
}

Get general statistics

Responses

Response samples

Content type
application/json
{
  • "detector": {
    },
  • "detector_list": {
    },
  • "detector_settings": {
    },
  • "image_format_settings": {
    },
  • "instrument_metadata": {
    },
  • "file_writer_settings": {
    },
  • "data_processing_settings": {
    },
  • "measurement": {
    },
  • "broker": {
    },
  • "fpga": [
    ],
  • "calibration": [
    ],
  • "zeromq_preview": {
    },
  • "zeromq_metadata": {
    },
  • "dark_mask": {
    },
  • "pixel_mask": {
    },
  • "roi": {
    },
  • "az_int": {
    },
  • "buffer": {
    },
  • "indexing": {
    },
  • "image_pusher": {
    }
}

Get data collection statistics

Results of the last data collection

+

Responses

Response samples

Content type
application/json
{
  • "file_prefix": "string",
  • "run_number": 0,
  • "experiment_group": "string",
  • "images_expected": 0,
  • "images_collected": 0,
  • "images_sent": 0,
  • "images_written": 0,
  • "images_discarded_lossy_compression": 0,
  • "max_image_number_sent": 0,
  • "collection_efficiency": 1,
  • "compression_ratio": 5.3,
  • "cancelled": true,
  • "max_receiver_delay": 0,
  • "indexing_rate": 0.1,
  • "detector_width": 0,
  • "detector_height": 0,
  • "detector_pixel_depth": 2,
  • "bkg_estimate": 0.1,
  • "unit_cell": "string",
  • "error_pixels": 0.1,
  • "saturated_pixels": 0.1,
  • "roi_beam_pixels": 0.1,
  • "roi_beam_sum": 0.1
}

Get calibration statistics

Statistics are provided for each module/storage cell separately

+

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Get mask of the detector (binary)

Detector must be Initialized. +Get full pixel mask of the detector. +See NXmx standard for meaning of pixel values.

+

Responses

Detector must be Initialized. +Get user mask of the detector (binary) +

Get user pixel mask of the detector in the actual detector coordinates: 0 - good pixel, 1 - masked

+

Responses

Upload user mask of the detector (binary)

Should be in Idle state. +Upload user mask of the detector - this is for example to account for beam stop shadow or misbehaving regions. +If detector is conversion mode the mask can be both in raw (1024x512; stacked modules) or converted coordinates. +In the latter case - module gaps are ignored and don't need to be assigned value. +Mask is expected as binary array (4-byte; unsigned). +0 - good pixel, other value - masked +User mask is stored in NXmx pixel mask (bit 8), as well as used in spot finding and azimuthal integration.

+
Request Body schema: application/octet-stream
string <binary>

Responses

Response samples

Content type
application/json
{
  • "msg": "Detector in wrong state",
  • "reason": "WrongDAQState"
}

Get mask of the detector (TIFF)

Should be in Idle state. +Get full pixel mask of the detector +See NXmx standard for meaning of pixel values

+

Responses

Detector must be Initialized. +Get user mask of the detector (TIFF) +

Get user pixel mask of the detector in the actual detector coordinates: 0 - good pixel, 1 - masked

+

Responses

Upload user mask of the detector

Should be in Idle state. +Upload user mask of the detector - this is for example to account for beam stop shadow or misbehaving regions. +If detector is conversion mode the mask can be both in raw (1024x512; stacked modules) or converted coordinates. +In the latter case - module gaps are ignored and don't need to be assigned value. +Mask is expected as TIFF (4-byte; unsigned). +0 - good pixel, other value - masked +User mask is stored in NXmx pixel mask (bit 8), as well as used in spot finding and azimuthal integration. +User mask is not automatically applied - i.e. pixels with user mask will have a valid pixel value in the images.

+
Request Body schema: image/tiff
string <binary>

Responses

Response samples

Content type
application/json
{
  • "msg": "Detector in wrong state",
  • "reason": "WrongDAQState"
}

Get pedestal in TIFF format

query Parameters
gain_level
required
integer

Gain level (0, 1, 2)

+
sc
integer

Storage cell number

+

Responses

Generate 1D plot from Jungfraujoch

query Parameters
binning
integer
Default: 1

Binning of frames for the plot (0 = default binning)

+
type
required
string
Enum: "bkg_estimate" "azint" "azint_1d" "spot_count" "spot_count_low_res" "spot_count_indexed" "spot_count_ice" "indexing_rate" "indexing_unit_cell_length" "indexing_unit_cell_angle" "profile_radius" "mosaicity" "b_factor" "error_pixels" "saturated_pixels" "image_collection_efficiency" "receiver_delay" "receiver_free_send_buf" "strong_pixels" "roi_sum" "roi_mean" "roi_max_count" "roi_pixels" "roi_weighted_x" "roi_weighted_y" "packets_received" "max_pixel_value" "resolution_estimate" "pixel_sum" "processing_time" "beam_center_x" "beam_center_y" "integrated_reflections"

Type of requested plot

+
fill
number <float>

Fill value for elements that were missed during data collection

+
experimental_coord
boolean
Default: false

If measurement has goniometer axis defined, plot X-axis will represent rotation angle +If measurement has grid scan defined, plot X-axis and Y-axis will represent grid position, Z will be used as the final value +For still measurement the number is ignored

+
azint_unit
string
Default: "Q_recipA"
Enum: "Q_recipA" "d_A" "two_theta_deg"

Unit used for azim int.

+

Responses

Response samples

Content type
application/json
{
  • "title": "string",
  • "unit_x": "image_number",
  • "size_x": 0.1,
  • "size_y": 0.1,
  • "plot": [
    ]
}

Generate 1D plot from Jungfraujoch and send in raw binary format. +Data are provided as (32-bit) float binary array. +This format doesn't transmit information about X-axis, only values, so it is of limited use for azimuthal integration. +

query Parameters
type
required
string
Enum: "bkg_estimate" "azint" "azint_1d" "spot_count" "spot_count_low_res" "spot_count_indexed" "spot_count_ice" "indexing_rate" "indexing_unit_cell_length" "indexing_unit_cell_angle" "profile_radius" "mosaicity" "b_factor" "error_pixels" "saturated_pixels" "image_collection_efficiency" "receiver_delay" "receiver_free_send_buf" "strong_pixels" "roi_sum" "roi_mean" "roi_max_count" "roi_pixels" "roi_weighted_x" "roi_weighted_y" "packets_received" "max_pixel_value" "resolution_estimate" "pixel_sum" "processing_time" "beam_center_x" "beam_center_y" "integrated_reflections"

Type of requested plot

+
roi
string non-empty

Name of ROI for which plot is requested

+

Responses

Get full scan result

Responses

Response samples

Content type
application/json
{
  • "file_prefix": "string",
  • "rotation_unit_cell": {
    },
  • "rotation_crystal_lattice": [
    ],
  • "images": [
    ]
}

Get Start message in CBOR format

Contains metadata for a dataset (e.g., experimental geometry)

+

Responses

Response samples

Content type
application/json
{
  • "msg": "Detector in wrong state",
  • "reason": "WrongDAQState"
}

Get image message in CBOR format

Contains full image data and metadata. The image must come from the latest data collection.

+
query Parameters
id
integer <int64> >= -2
Default: -1

Image ID in the image buffer. Special values: -1 - last image in the buffer, -2: last indexed image in the buffer

+

Responses

Response samples

Content type
application/json
{
  • "msg": "Detector in wrong state",
  • "reason": "WrongDAQState"
}

Get preview image in JPEG format using custom settings

query Parameters
id
integer <int64> >= -2
Default: -1

Image ID in the image buffer. Special values: -1 - last image in the buffer, -2: last indexed image in the buffer

+
show_user_mask
boolean
Default: false

Show user mask

+
show_roi
boolean
Default: false

Show ROI areas on the image

+
show_spots
boolean
Default: true

Show spot finding results on the image

+
show_beam_center
boolean
Default: true

Show beam center on the image

+
saturation
number <float> [ -32767 .. 32767 ]

Saturation value to set contrast in the preview image; if not provided, then autocontrast procedure is used

+
jpeg_quality
integer <int64> [ 0 .. 100 ]
Default: 100

Quality of JPEG image (100 - highest; 0 - lowest)

+
show_res_ring
number <float> [ 0.1 .. 100 ]
Default: 0.1

Show resolution ring, provided in Angstrom

+
color
string
Default: "indigo"
Enum: "indigo" "viridis" "bw" "wb" "green" "heat" "magma" "inferno"

Color scale for preview image

+
show_res_est
boolean
Default: false

Show resolution estimation as a ring

+

Responses

Response samples

Content type
application/json
{
  • "msg": "Detector in wrong state",
  • "reason": "WrongDAQState"
}

Get preview image in TIFF format

query Parameters
id
integer <int64> >= -2
Default: -1

Image ID in the image buffer. Special values: -1 - last image in the buffer, -2: last indexed image in the buffer

+

Responses

Clear image buffer

Turns off image buffer for the last data collection. Can be only run when Jungfraujoch is not collecting data.

+

Responses

Response samples

Content type
application/json
{
  • "msg": "Detector in wrong state",
  • "reason": "WrongDAQState"
}

Get status of the image buffers

Can be run at any stage of Jungfraujoch operation, including during data collection. +The status of the image buffer is volatile during data collection - if data collection goes for more images than available buffer slots, +then image might be replaced in the buffer between calling /images and /image.cbor.

+

Responses

Response samples

Content type
application/json
{
  • "min_image_number": 0,
  • "max_image_number": 0,
  • "image_numbers": [
    ],
  • "total_slots": 0,
  • "available_slots": 0,
  • "in_preparation_slots": 0,
  • "in_sending_slots": 0,
  • "current_counter": 0
}

Get Jungfraujoch version of jfjoch_broker

Responses

+ + + + diff --git a/_static/searchtools.js b/_static/searchtools.js new file mode 100644 index 00000000..2c774d17 --- /dev/null +++ b/_static/searchtools.js @@ -0,0 +1,632 @@ +/* + * Sphinx JavaScript utilities for the full-text search. + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename, kind] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +// Global search result kind enum, used by themes to style search results. +class SearchResultKind { + static get index() { return "index"; } + static get object() { return "object"; } + static get text() { return "text"; } + static get title() { return "title"; } +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms, highlightTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + const contentRoot = document.documentElement.dataset.content_root; + + const [docName, title, anchor, descr, score, _filename, kind] = item; + + let listItem = document.createElement("li"); + // Add a class representing the item's type: + // can be used by a theme's CSS selector for styling + // See SearchResultKind for the class names. + listItem.classList.add(`kind-${kind}`); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = contentRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = contentRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) { + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + // highlight search terms in the description + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + } + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms, anchor) + ); + // highlight search terms in the summary + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = Documentation.ngettext( + "Search finished, found one page matching the search query.", + "Search finished, found ${resultCount} pages matching the search query.", + resultCount, + ).replace('${resultCount}', resultCount); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms, + highlightTerms, +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms, highlightTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms, highlightTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; +// Helper function used by query() to order search results. +// Each input is an array of [docname, title, anchor, descr, score, filename, kind]. +// Order the results by score (in opposite order of appearance, since the +// `_displayNextItem` function uses pop() to retrieve items) and then alphabetically. +const _orderResultsByScoreThenName = (a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString, anchor) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + for (const removalQuery of [".headerlink", "script", "style"]) { + htmlElement.querySelectorAll(removalQuery).forEach((el) => { el.remove() }); + } + if (anchor) { + const anchorContent = htmlElement.querySelector(`[role="main"] ${anchor}`); + if (anchorContent) return anchorContent.textContent; + + console.warn( + `Anchored content block not found. Sphinx search tries to obtain it via DOM query '[role=main] ${anchor}'. Check your theme or template.` + ); + } + + // if anchor not specified or not found, fall back to main content + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent) return docContent.textContent; + + console.warn( + "Content block not found. Sphinx search tries to obtain it via DOM query '[role=main]'. Check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.setAttribute("role", "list"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + _parseQuery: (query) => { + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + return [query, searchTerms, excludedTerms, highlightTerms, objectTerms]; + }, + + /** + * execute search (requires search index to be loaded) + */ + _performSearch: (query, searchTerms, excludedTerms, highlightTerms, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // Collect multiple result groups to be sorted separately and then ordered. + // Each is an array of [docname, title, anchor, descr, score, filename, kind]. + const normalResults = []; + const nonMainIndexResults = []; + + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase().trim(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().trim().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + const score = Math.round(Scorer.title * queryLower.length / title.length); + const boost = titles[file] === title ? 1 : 0; // add a boost for document titles + normalResults.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score + boost, + filenames[file], + SearchResultKind.title, + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id, isMain] of foundEntries) { + const score = Math.round(100 * queryLower.length / entry.length); + const result = [ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + SearchResultKind.index, + ]; + if (isMain) { + normalResults.push(result); + } else { + nonMainIndexResults.push(result); + } + } + } + } + + // lookup as object + objectTerms.forEach((term) => + normalResults.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + normalResults.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) { + normalResults.forEach((item) => (item[4] = Scorer.score(item))); + nonMainIndexResults.forEach((item) => (item[4] = Scorer.score(item))); + } + + // Sort each group of results by score and then alphabetically by name. + normalResults.sort(_orderResultsByScoreThenName); + nonMainIndexResults.sort(_orderResultsByScoreThenName); + + // Combine the result groups in (reverse) order. + // Non-main index entries are typically arbitrary cross-references, + // so display them after other results. + let results = [...nonMainIndexResults, ...normalResults]; + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + return results.reverse(); + }, + + query: (query) => { + const [searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms] = Search._parseQuery(query); + const results = Search._performSearch(searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms, highlightTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + SearchResultKind.object, + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + if (!terms.hasOwnProperty(word)) { + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + } + if (!titleTerms.hasOwnProperty(word)) { + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: titleTerms[term], score: Scorer.partialTitle }); + }); + } + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (!fileMap.has(file)) fileMap.set(file, [word]); + else if (fileMap.get(file).indexOf(word) === -1) fileMap.get(file).push(word); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + SearchResultKind.text, + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords, anchor) => { + const text = Search.htmlToText(htmlText, anchor); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/_static/sphinx_highlight.js b/_static/sphinx_highlight.js new file mode 100644 index 00000000..8a96c69a --- /dev/null +++ b/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute("class", className); + addItems.push({ parent: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/_static/stylesheets/application-fixes.css b/_static/stylesheets/application-fixes.css new file mode 100644 index 00000000..bbe6ad0e --- /dev/null +++ b/_static/stylesheets/application-fixes.css @@ -0,0 +1 @@ +@charset "utf-8";.md-nav--primary ul,.md-nav--primary ul li ul,.md-nav--secondary ul,.md-nav--secondary ul li ul{margin:0;padding:0;list-style:none}.md-nav--primary ul li,.md-nav--primary ul li ul li,.md-nav--secondary ul li,.md-nav--secondary ul li ul li{padding:0 .6rem}.md-nav--primary a.reference,.md-nav--secondary a.reference{display:block;margin-top:.625em;transition:color .125s;text-overflow:ellipsis;cursor:pointer;overflow:hidden}.md-typeset td p,.md-typeset th p{margin:0}.md-typeset .admonition,.md-typeset details{font-size:.8rem}.classifier:before{font-style:normal;margin:.5em;content:":"}dl.footnote>dt,dl.citation>dt{float:left}code.xref{background-color:transparent;font-weight:bold}table.docutils{width:100%}.longtable tr td:first-child{width:50%;white-space:nowrap}dt:target{margin-top:-3.55rem;padding-top:3.45rem}.md-typeset code{margin:0}ul.search li div.context{color:#888;margin:2px 0 0 30px;text-align:left}span.highlighted{background-color:#fbe54e}p.rubric{margin-top:1rem;font-weight:bold}dl.field-list>dt{font-weight:bold;word-break:break-word;padding-left:.5em;padding-right:5px}table.longtable{border-collapse:collapse}.longtable tr{border:solid;border-width:1px 0}.longtable tr:first-child{border-top:none}.md-tabs code,kbd,pre,.md-footer-nav code,kbd,pre{color:#fff}.toctree-wrapper.compound li{list-style:none;padding:0;margin:0 0 .1rem .2rem}table.indextable.genindextable li{margin:0 .5rem}table.indextable.genindextable li ul li{list-style:none}p.highlight-link{margin:.625rem 0 0 0}table.longtable.docutils.align-default{width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}@media only screen and (max-width:40em){table.longtable.docutils.align-default{display:block}.longtable.docutils.align-default td{padding-right:1rem}}.md-nav__extra_link:after{font-family:Material Icons;font-style:normal;font-variant:normal;font-weight:400;line-height:1;text-transform:none;white-space:nowrap;speak:none;word-wrap:normal;direction:ltr}.md-nav__extra_link{display:block;margin-top:.625em;transition:color .125s;text-overflow:ellipsis;cursor:pointer;overflow:hidden}.md-nav__extra_link:active{color:#3f51b5}.md-nav__extra_link:focus,.md-nav__extra_link:hover{color:#536dfe}@media only screen and (max-width:76.1875em){.md-nav--primary .md-nav--secondary .md-nav__extra_link{position:static}.md-nav--primary .md-nav--secondary .md-nav .md-nav__extra_link{padding-left:1.4rem}.md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav__extra_link{padding-left:2.6rem}}[data-md-color-primary=red] .md-nav__extra_link:active{color:#ef5350}[data-md-color-primary=red] .md-nav__item--nested>.md-nav__extra_link{color:inherit}[data-md-color-primary=pink] .md-nav__extra_link:active{color:#e91e63}[data-md-color-primary=pink] .md-nav__item--nested>.md-nav__extra_link{color:inherit}[data-md-color-primary=purple] .md-nav__extra_link:active{color:#ab47bc}[data-md-color-primary=purple] .md-nav__item--nested>.md-nav__extra_link{color:inherit}[data-md-color-primary=deep-purple] .md-nav__extra_link:active{color:#7e57c2}[data-md-color-primary=deep-purple] .md-nav__item--nested>.md-nav__extra_link{color:inherit}[data-md-color-primary=indigo] .md-nav__extra_link:active{color:#3f51b5}[data-md-color-primary=indigo] .md-nav__item--nested>.md-nav__extra_link{color:inherit}[data-md-color-primary=blue] .md-nav__extra_link:active{color:#2196f3}[data-md-color-primary=blue] .md-nav__item--nested>.md-nav__extra_link{color:inherit}[data-md-color-primary=light-blue] .md-nav__extra_link:active{color:#03a9f4}[data-md-color-primary=light-blue] .md-nav__item--nested>.md-nav__extra_link{color:inherit}[data-md-color-primary=cyan] .md-nav__extra_link:active{color:#00bcd4}[data-md-color-primary=cyan] .md-nav__item--nested>.md-nav__extra_link{color:inherit}[data-md-color-primary=teal] .md-nav__extra_link:active{color:#009688}[data-md-color-primary=teal] .md-nav__item--nested>.md-nav__extra_link{color:inherit}[data-md-color-primary=green] .md-nav__extra_link:active{color:#4caf50}[data-md-color-primary=green] .md-nav__item--nested>.md-nav__extra_link{color:inherit}[data-md-color-primary=light-green] .md-nav__extra_link:active{color:#7cb342}[data-md-color-primary=light-green] .md-nav__item--nested>.md-nav__extra_link{color:inherit}[data-md-color-primary=lime] .md-nav__extra_link:active{color:#c0ca33}[data-md-color-primary=lime] .md-nav__item--nested>.md-nav__extra_link{color:inherit}[data-md-color-primary=yellow] .md-nav__extra_link:active{color:#f9a825}[data-md-color-primary=yellow] .md-nav__item--nested>.md-nav__extra_link{color:inherit}[data-md-color-primary=amber] .md-nav__extra_link:active{color:#ffa000}[data-md-color-primary=amber] .md-nav__item--nested>.md-nav__extra_link{color:inherit}[data-md-color-primary=orange] .md-nav__extra_link:active{color:#fb8c00}[data-md-color-primary=orange] .md-nav__item--nested>.md-nav__extra_link{color:inherit}[data-md-color-primary=deep-orange] .md-nav__extra_link:active{color:#ff7043}[data-md-color-primary=deep-orange] .md-nav__item--nested>.md-nav__extra_link{color:inherit}[data-md-color-primary=brown] .md-nav__extra_link:active{color:#795548}[data-md-color-primary=brown] .md-nav__item--nested>.md-nav__extra_link{color:inherit}[data-md-color-primary=grey] .md-nav__extra_link:active{color:#757575}[data-md-color-primary=grey] .md-nav__item--nested>.md-nav__extra_link{color:inherit}[data-md-color-primary=blue-grey] .md-nav__extra_link:active{color:#546e7a}[data-md-color-primary=blue-grey] .md-nav__item--nested>.md-nav__extra_link{color:inherit}[data-md-color-accent=red] .md-nav__extra_link:focus,[data-md-color-accent=red] .md-nav__extra_link:hover{color:#ff1744}[data-md-color-accent=pink] .md-nav__extra_link:focus,[data-md-color-accent=pink] .md-nav__extra_link:hover{color:#f50057}[data-md-color-accent=purple] .md-nav__extra_link:focus,[data-md-color-accent=purple] .md-nav__extra_link:hover{color:#e040fb}[data-md-color-accent=deep-purple] .md-nav__extra_link:focus,[data-md-color-accent=deep-purple] .md-nav__extra_link:hover{color:#7c4dff}[data-md-color-accent=indigo] .md-nav__extra_link:focus,[data-md-color-accent=indigo] .md-nav__extra_link:hover{color:#536dfe}[data-md-color-accent=blue] .md-nav__extra_link:focus,[data-md-color-accent=blue] .md-nav__extra_link:hover{color:#448aff}[data-md-color-accent=light-blue] .md-nav__extra_link:focus,[data-md-color-accent=light-blue] .md-nav__extra_link:hover{color:#0091ea}[data-md-color-accent=cyan] .md-nav__extra_link:focus,[data-md-color-accent=cyan] .md-nav__extra_link:hover{color:#00b8d4}[data-md-color-accent=teal] .md-nav__extra_link:focus,[data-md-color-accent=teal] .md-nav__extra_link:hover{color:#00bfa5}[data-md-color-accent=green] .md-nav__extra_link:focus,[data-md-color-accent=green] .md-nav__extra_link:hover{color:#00c853}[data-md-color-accent=light-green] .md-nav__extra_link:focus,[data-md-color-accent=light-green] .md-nav__extra_link:hover{color:#64dd17}[data-md-color-accent=lime] .md-nav__extra_link:focus,[data-md-color-accent=lime] .md-nav__extra_link:hover{color:#aeea00}[data-md-color-accent=yellow] .md-nav__extra_link:focus,[data-md-color-accent=yellow] .md-nav__extra_link:hover{color:#ffd600}[data-md-color-accent=amber] .md-nav__extra_link:focus,[data-md-color-accent=amber] .md-nav__extra_link:hover{color:#ffab00}[data-md-color-accent=orange] .md-nav__extra_link:focus,[data-md-color-accent=orange] .md-nav__extra_link:hover{color:#ff9100}[data-md-color-accent=deep-orange] .md-nav__extra_link:focus,[data-md-color-accent=deep-orange] .md-nav__extra_link:hover{color:#ff6e40}div.rendered_html table{font-size:.8rem !important}.md-nav span.caption{font-weight:700;pointer-events:none}.md-nav span.caption:hover,.md-nav span.caption:active{color:#000}.md-typeset img.align-right{clear:right;float:right;margin-left:1em}.md-typeset img.align-center{display:block;margin-left:auto;margin-right:auto}dl.citation dt span.brackets{margin-right:.3rem} \ No newline at end of file diff --git a/_static/stylesheets/application-palette.css b/_static/stylesheets/application-palette.css new file mode 100644 index 00000000..4623f093 --- /dev/null +++ b/_static/stylesheets/application-palette.css @@ -0,0 +1 @@ +@charset "utf-8";button[data-md-color-accent],button[data-md-color-primary]{width:6.5rem;margin-bottom:.2rem;padding:1.2rem .4rem .2rem;transition:background-color .25s,opacity .25s;border-radius:.1rem;color:#fff;font-size:.64rem;text-align:left;cursor:pointer}button[data-md-color-accent]:hover,button[data-md-color-primary]:hover{opacity:.75}button[data-md-color-primary=red]{background-color:#ef5350}[data-md-color-primary=red] .md-typeset a{color:#ef5350}[data-md-color-primary=red] .md-header,[data-md-color-primary=red] .md-hero{background-color:#ef5350}[data-md-color-primary=red] .md-nav__link--active,[data-md-color-primary=red] .md-nav__link:active{color:#ef5350}[data-md-color-primary=red] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-primary=pink]{background-color:#e91e63}[data-md-color-primary=pink] .md-typeset a{color:#e91e63}[data-md-color-primary=pink] .md-header,[data-md-color-primary=pink] .md-hero{background-color:#e91e63}[data-md-color-primary=pink] .md-nav__link--active,[data-md-color-primary=pink] .md-nav__link:active{color:#e91e63}[data-md-color-primary=pink] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-primary=purple]{background-color:#ab47bc}[data-md-color-primary=purple] .md-typeset a{color:#ab47bc}[data-md-color-primary=purple] .md-header,[data-md-color-primary=purple] .md-hero{background-color:#ab47bc}[data-md-color-primary=purple] .md-nav__link--active,[data-md-color-primary=purple] .md-nav__link:active{color:#ab47bc}[data-md-color-primary=purple] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-primary=deep-purple]{background-color:#7e57c2}[data-md-color-primary=deep-purple] .md-typeset a{color:#7e57c2}[data-md-color-primary=deep-purple] .md-header,[data-md-color-primary=deep-purple] .md-hero{background-color:#7e57c2}[data-md-color-primary=deep-purple] .md-nav__link--active,[data-md-color-primary=deep-purple] .md-nav__link:active{color:#7e57c2}[data-md-color-primary=deep-purple] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-primary=indigo]{background-color:#3f51b5}[data-md-color-primary=indigo] .md-typeset a{color:#3f51b5}[data-md-color-primary=indigo] .md-header,[data-md-color-primary=indigo] .md-hero{background-color:#3f51b5}[data-md-color-primary=indigo] .md-nav__link--active,[data-md-color-primary=indigo] .md-nav__link:active{color:#3f51b5}[data-md-color-primary=indigo] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-primary=blue]{background-color:#2196f3}[data-md-color-primary=blue] .md-typeset a{color:#2196f3}[data-md-color-primary=blue] .md-header,[data-md-color-primary=blue] .md-hero{background-color:#2196f3}[data-md-color-primary=blue] .md-nav__link--active,[data-md-color-primary=blue] .md-nav__link:active{color:#2196f3}[data-md-color-primary=blue] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-primary=light-blue]{background-color:#03a9f4}[data-md-color-primary=light-blue] .md-typeset a{color:#03a9f4}[data-md-color-primary=light-blue] .md-header,[data-md-color-primary=light-blue] .md-hero{background-color:#03a9f4}[data-md-color-primary=light-blue] .md-nav__link--active,[data-md-color-primary=light-blue] .md-nav__link:active{color:#03a9f4}[data-md-color-primary=light-blue] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-primary=cyan]{background-color:#00bcd4}[data-md-color-primary=cyan] .md-typeset a{color:#00bcd4}[data-md-color-primary=cyan] .md-header,[data-md-color-primary=cyan] .md-hero{background-color:#00bcd4}[data-md-color-primary=cyan] .md-nav__link--active,[data-md-color-primary=cyan] .md-nav__link:active{color:#00bcd4}[data-md-color-primary=cyan] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-primary=teal]{background-color:#009688}[data-md-color-primary=teal] .md-typeset a{color:#009688}[data-md-color-primary=teal] .md-header,[data-md-color-primary=teal] .md-hero{background-color:#009688}[data-md-color-primary=teal] .md-nav__link--active,[data-md-color-primary=teal] .md-nav__link:active{color:#009688}[data-md-color-primary=teal] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-primary=green]{background-color:#4caf50}[data-md-color-primary=green] .md-typeset a{color:#4caf50}[data-md-color-primary=green] .md-header,[data-md-color-primary=green] .md-hero{background-color:#4caf50}[data-md-color-primary=green] .md-nav__link--active,[data-md-color-primary=green] .md-nav__link:active{color:#4caf50}[data-md-color-primary=green] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-primary=light-green]{background-color:#7cb342}[data-md-color-primary=light-green] .md-typeset a{color:#7cb342}[data-md-color-primary=light-green] .md-header,[data-md-color-primary=light-green] .md-hero{background-color:#7cb342}[data-md-color-primary=light-green] .md-nav__link--active,[data-md-color-primary=light-green] .md-nav__link:active{color:#7cb342}[data-md-color-primary=light-green] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-primary=lime]{background-color:#c0ca33}[data-md-color-primary=lime] .md-typeset a{color:#c0ca33}[data-md-color-primary=lime] .md-header,[data-md-color-primary=lime] .md-hero{background-color:#c0ca33}[data-md-color-primary=lime] .md-nav__link--active,[data-md-color-primary=lime] .md-nav__link:active{color:#c0ca33}[data-md-color-primary=lime] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-primary=yellow]{background-color:#f9a825}[data-md-color-primary=yellow] .md-typeset a{color:#f9a825}[data-md-color-primary=yellow] .md-header,[data-md-color-primary=yellow] .md-hero{background-color:#f9a825}[data-md-color-primary=yellow] .md-nav__link--active,[data-md-color-primary=yellow] .md-nav__link:active{color:#f9a825}[data-md-color-primary=yellow] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-primary=amber]{background-color:#ffa000}[data-md-color-primary=amber] .md-typeset a{color:#ffa000}[data-md-color-primary=amber] .md-header,[data-md-color-primary=amber] .md-hero{background-color:#ffa000}[data-md-color-primary=amber] .md-nav__link--active,[data-md-color-primary=amber] .md-nav__link:active{color:#ffa000}[data-md-color-primary=amber] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-primary=orange]{background-color:#fb8c00}[data-md-color-primary=orange] .md-typeset a{color:#fb8c00}[data-md-color-primary=orange] .md-header,[data-md-color-primary=orange] .md-hero{background-color:#fb8c00}[data-md-color-primary=orange] .md-nav__link--active,[data-md-color-primary=orange] .md-nav__link:active{color:#fb8c00}[data-md-color-primary=orange] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-primary=deep-orange]{background-color:#ff7043}[data-md-color-primary=deep-orange] .md-typeset a{color:#ff7043}[data-md-color-primary=deep-orange] .md-header,[data-md-color-primary=deep-orange] .md-hero{background-color:#ff7043}[data-md-color-primary=deep-orange] .md-nav__link--active,[data-md-color-primary=deep-orange] .md-nav__link:active{color:#ff7043}[data-md-color-primary=deep-orange] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-primary=brown]{background-color:#795548}[data-md-color-primary=brown] .md-typeset a{color:#795548}[data-md-color-primary=brown] .md-header,[data-md-color-primary=brown] .md-hero{background-color:#795548}[data-md-color-primary=brown] .md-nav__link--active,[data-md-color-primary=brown] .md-nav__link:active{color:#795548}[data-md-color-primary=brown] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-primary=grey]{background-color:#757575}[data-md-color-primary=grey] .md-typeset a{color:#757575}[data-md-color-primary=grey] .md-header,[data-md-color-primary=grey] .md-hero{background-color:#757575}[data-md-color-primary=grey] .md-nav__link--active,[data-md-color-primary=grey] .md-nav__link:active{color:#757575}[data-md-color-primary=grey] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-primary=blue-grey]{background-color:#546e7a}[data-md-color-primary=blue-grey] .md-typeset a{color:#546e7a}[data-md-color-primary=blue-grey] .md-header,[data-md-color-primary=blue-grey] .md-hero{background-color:#546e7a}[data-md-color-primary=blue-grey] .md-nav__link--active,[data-md-color-primary=blue-grey] .md-nav__link:active{color:#546e7a}[data-md-color-primary=blue-grey] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-primary=white]{box-shadow:inset 0 0 .05rem rgba(0,0,0,.54)}[data-md-color-primary=white] .md-header,[data-md-color-primary=white] .md-hero,button[data-md-color-primary=white]{background-color:#fff;color:rgba(0,0,0,.87)}[data-md-color-primary=white] .md-hero--expand{border-bottom:.05rem solid rgba(0,0,0,.07)}button[data-md-color-accent=red]{background-color:#ff1744}[data-md-color-accent=red] .md-typeset a:active,[data-md-color-accent=red] .md-typeset a:hover{color:#ff1744}[data-md-color-accent=red] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover,[data-md-color-accent=red] .md-typeset pre code::-webkit-scrollbar-thumb:hover{background-color:#ff1744}[data-md-color-accent=red] .md-nav__link:focus,[data-md-color-accent=red] .md-nav__link:hover,[data-md-color-accent=red] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=red] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=red] .md-typeset .md-clipboard:active:before,[data-md-color-accent=red] .md-typeset .md-clipboard:hover:before,[data-md-color-accent=red] .md-typeset [id] .headerlink:focus,[data-md-color-accent=red] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=red] .md-typeset [id]:target .headerlink{color:#ff1744}[data-md-color-accent=red] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#ff1744}[data-md-color-accent=red] .md-search-result__link:hover,[data-md-color-accent=red] .md-search-result__link[data-md-state=active]{background-color:rgba(255,23,68,.1)}[data-md-color-accent=red] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#ff1744}[data-md-color-accent=red] .md-source-file:hover:before{background-color:#ff1744}button[data-md-color-accent=pink]{background-color:#f50057}[data-md-color-accent=pink] .md-typeset a:active,[data-md-color-accent=pink] .md-typeset a:hover{color:#f50057}[data-md-color-accent=pink] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover,[data-md-color-accent=pink] .md-typeset pre code::-webkit-scrollbar-thumb:hover{background-color:#f50057}[data-md-color-accent=pink] .md-nav__link:focus,[data-md-color-accent=pink] .md-nav__link:hover,[data-md-color-accent=pink] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=pink] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=pink] .md-typeset .md-clipboard:active:before,[data-md-color-accent=pink] .md-typeset .md-clipboard:hover:before,[data-md-color-accent=pink] .md-typeset [id] .headerlink:focus,[data-md-color-accent=pink] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=pink] .md-typeset [id]:target .headerlink{color:#f50057}[data-md-color-accent=pink] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#f50057}[data-md-color-accent=pink] .md-search-result__link:hover,[data-md-color-accent=pink] .md-search-result__link[data-md-state=active]{background-color:rgba(245,0,87,.1)}[data-md-color-accent=pink] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#f50057}[data-md-color-accent=pink] .md-source-file:hover:before{background-color:#f50057}button[data-md-color-accent=purple]{background-color:#e040fb}[data-md-color-accent=purple] .md-typeset a:active,[data-md-color-accent=purple] .md-typeset a:hover{color:#e040fb}[data-md-color-accent=purple] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover,[data-md-color-accent=purple] .md-typeset pre code::-webkit-scrollbar-thumb:hover{background-color:#e040fb}[data-md-color-accent=purple] .md-nav__link:focus,[data-md-color-accent=purple] .md-nav__link:hover,[data-md-color-accent=purple] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=purple] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=purple] .md-typeset .md-clipboard:active:before,[data-md-color-accent=purple] .md-typeset .md-clipboard:hover:before,[data-md-color-accent=purple] .md-typeset [id] .headerlink:focus,[data-md-color-accent=purple] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=purple] .md-typeset [id]:target .headerlink{color:#e040fb}[data-md-color-accent=purple] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#e040fb}[data-md-color-accent=purple] .md-search-result__link:hover,[data-md-color-accent=purple] .md-search-result__link[data-md-state=active]{background-color:rgba(224,64,251,.1)}[data-md-color-accent=purple] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#e040fb}[data-md-color-accent=purple] .md-source-file:hover:before{background-color:#e040fb}button[data-md-color-accent=deep-purple]{background-color:#7c4dff}[data-md-color-accent=deep-purple] .md-typeset a:active,[data-md-color-accent=deep-purple] .md-typeset a:hover{color:#7c4dff}[data-md-color-accent=deep-purple] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover,[data-md-color-accent=deep-purple] .md-typeset pre code::-webkit-scrollbar-thumb:hover{background-color:#7c4dff}[data-md-color-accent=deep-purple] .md-nav__link:focus,[data-md-color-accent=deep-purple] .md-nav__link:hover,[data-md-color-accent=deep-purple] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=deep-purple] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=deep-purple] .md-typeset .md-clipboard:active:before,[data-md-color-accent=deep-purple] .md-typeset .md-clipboard:hover:before,[data-md-color-accent=deep-purple] .md-typeset [id] .headerlink:focus,[data-md-color-accent=deep-purple] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=deep-purple] .md-typeset [id]:target .headerlink{color:#7c4dff}[data-md-color-accent=deep-purple] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#7c4dff}[data-md-color-accent=deep-purple] .md-search-result__link:hover,[data-md-color-accent=deep-purple] .md-search-result__link[data-md-state=active]{background-color:rgba(124,77,255,.1)}[data-md-color-accent=deep-purple] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#7c4dff}[data-md-color-accent=deep-purple] .md-source-file:hover:before{background-color:#7c4dff}button[data-md-color-accent=indigo]{background-color:#536dfe}[data-md-color-accent=indigo] .md-typeset a:active,[data-md-color-accent=indigo] .md-typeset a:hover{color:#536dfe}[data-md-color-accent=indigo] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover,[data-md-color-accent=indigo] .md-typeset pre code::-webkit-scrollbar-thumb:hover{background-color:#536dfe}[data-md-color-accent=indigo] .md-nav__link:focus,[data-md-color-accent=indigo] .md-nav__link:hover,[data-md-color-accent=indigo] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=indigo] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=indigo] .md-typeset .md-clipboard:active:before,[data-md-color-accent=indigo] .md-typeset .md-clipboard:hover:before,[data-md-color-accent=indigo] .md-typeset [id] .headerlink:focus,[data-md-color-accent=indigo] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=indigo] .md-typeset [id]:target .headerlink{color:#536dfe}[data-md-color-accent=indigo] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#536dfe}[data-md-color-accent=indigo] .md-search-result__link:hover,[data-md-color-accent=indigo] .md-search-result__link[data-md-state=active]{background-color:rgba(83,109,254,.1)}[data-md-color-accent=indigo] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#536dfe}[data-md-color-accent=indigo] .md-source-file:hover:before{background-color:#536dfe}button[data-md-color-accent=blue]{background-color:#448aff}[data-md-color-accent=blue] .md-typeset a:active,[data-md-color-accent=blue] .md-typeset a:hover{color:#448aff}[data-md-color-accent=blue] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover,[data-md-color-accent=blue] .md-typeset pre code::-webkit-scrollbar-thumb:hover{background-color:#448aff}[data-md-color-accent=blue] .md-nav__link:focus,[data-md-color-accent=blue] .md-nav__link:hover,[data-md-color-accent=blue] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=blue] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=blue] .md-typeset .md-clipboard:active:before,[data-md-color-accent=blue] .md-typeset .md-clipboard:hover:before,[data-md-color-accent=blue] .md-typeset [id] .headerlink:focus,[data-md-color-accent=blue] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=blue] .md-typeset [id]:target .headerlink{color:#448aff}[data-md-color-accent=blue] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#448aff}[data-md-color-accent=blue] .md-search-result__link:hover,[data-md-color-accent=blue] .md-search-result__link[data-md-state=active]{background-color:rgba(68,138,255,.1)}[data-md-color-accent=blue] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#448aff}[data-md-color-accent=blue] .md-source-file:hover:before{background-color:#448aff}button[data-md-color-accent=light-blue]{background-color:#0091ea}[data-md-color-accent=light-blue] .md-typeset a:active,[data-md-color-accent=light-blue] .md-typeset a:hover{color:#0091ea}[data-md-color-accent=light-blue] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover,[data-md-color-accent=light-blue] .md-typeset pre code::-webkit-scrollbar-thumb:hover{background-color:#0091ea}[data-md-color-accent=light-blue] .md-nav__link:focus,[data-md-color-accent=light-blue] .md-nav__link:hover,[data-md-color-accent=light-blue] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=light-blue] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=light-blue] .md-typeset .md-clipboard:active:before,[data-md-color-accent=light-blue] .md-typeset .md-clipboard:hover:before,[data-md-color-accent=light-blue] .md-typeset [id] .headerlink:focus,[data-md-color-accent=light-blue] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=light-blue] .md-typeset [id]:target .headerlink{color:#0091ea}[data-md-color-accent=light-blue] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#0091ea}[data-md-color-accent=light-blue] .md-search-result__link:hover,[data-md-color-accent=light-blue] .md-search-result__link[data-md-state=active]{background-color:rgba(0,145,234,.1)}[data-md-color-accent=light-blue] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#0091ea}[data-md-color-accent=light-blue] .md-source-file:hover:before{background-color:#0091ea}button[data-md-color-accent=cyan]{background-color:#00b8d4}[data-md-color-accent=cyan] .md-typeset a:active,[data-md-color-accent=cyan] .md-typeset a:hover{color:#00b8d4}[data-md-color-accent=cyan] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover,[data-md-color-accent=cyan] .md-typeset pre code::-webkit-scrollbar-thumb:hover{background-color:#00b8d4}[data-md-color-accent=cyan] .md-nav__link:focus,[data-md-color-accent=cyan] .md-nav__link:hover,[data-md-color-accent=cyan] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=cyan] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=cyan] .md-typeset .md-clipboard:active:before,[data-md-color-accent=cyan] .md-typeset .md-clipboard:hover:before,[data-md-color-accent=cyan] .md-typeset [id] .headerlink:focus,[data-md-color-accent=cyan] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=cyan] .md-typeset [id]:target .headerlink{color:#00b8d4}[data-md-color-accent=cyan] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#00b8d4}[data-md-color-accent=cyan] .md-search-result__link:hover,[data-md-color-accent=cyan] .md-search-result__link[data-md-state=active]{background-color:rgba(0,184,212,.1)}[data-md-color-accent=cyan] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#00b8d4}[data-md-color-accent=cyan] .md-source-file:hover:before{background-color:#00b8d4}button[data-md-color-accent=teal]{background-color:#00bfa5}[data-md-color-accent=teal] .md-typeset a:active,[data-md-color-accent=teal] .md-typeset a:hover{color:#00bfa5}[data-md-color-accent=teal] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover,[data-md-color-accent=teal] .md-typeset pre code::-webkit-scrollbar-thumb:hover{background-color:#00bfa5}[data-md-color-accent=teal] .md-nav__link:focus,[data-md-color-accent=teal] .md-nav__link:hover,[data-md-color-accent=teal] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=teal] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=teal] .md-typeset .md-clipboard:active:before,[data-md-color-accent=teal] .md-typeset .md-clipboard:hover:before,[data-md-color-accent=teal] .md-typeset [id] .headerlink:focus,[data-md-color-accent=teal] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=teal] .md-typeset [id]:target .headerlink{color:#00bfa5}[data-md-color-accent=teal] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#00bfa5}[data-md-color-accent=teal] .md-search-result__link:hover,[data-md-color-accent=teal] .md-search-result__link[data-md-state=active]{background-color:rgba(0,191,165,.1)}[data-md-color-accent=teal] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#00bfa5}[data-md-color-accent=teal] .md-source-file:hover:before{background-color:#00bfa5}button[data-md-color-accent=green]{background-color:#00c853}[data-md-color-accent=green] .md-typeset a:active,[data-md-color-accent=green] .md-typeset a:hover{color:#00c853}[data-md-color-accent=green] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover,[data-md-color-accent=green] .md-typeset pre code::-webkit-scrollbar-thumb:hover{background-color:#00c853}[data-md-color-accent=green] .md-nav__link:focus,[data-md-color-accent=green] .md-nav__link:hover,[data-md-color-accent=green] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=green] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=green] .md-typeset .md-clipboard:active:before,[data-md-color-accent=green] .md-typeset .md-clipboard:hover:before,[data-md-color-accent=green] .md-typeset [id] .headerlink:focus,[data-md-color-accent=green] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=green] .md-typeset [id]:target .headerlink{color:#00c853}[data-md-color-accent=green] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#00c853}[data-md-color-accent=green] .md-search-result__link:hover,[data-md-color-accent=green] .md-search-result__link[data-md-state=active]{background-color:rgba(0,200,83,.1)}[data-md-color-accent=green] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#00c853}[data-md-color-accent=green] .md-source-file:hover:before{background-color:#00c853}button[data-md-color-accent=light-green]{background-color:#64dd17}[data-md-color-accent=light-green] .md-typeset a:active,[data-md-color-accent=light-green] .md-typeset a:hover{color:#64dd17}[data-md-color-accent=light-green] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover,[data-md-color-accent=light-green] .md-typeset pre code::-webkit-scrollbar-thumb:hover{background-color:#64dd17}[data-md-color-accent=light-green] .md-nav__link:focus,[data-md-color-accent=light-green] .md-nav__link:hover,[data-md-color-accent=light-green] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=light-green] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=light-green] .md-typeset .md-clipboard:active:before,[data-md-color-accent=light-green] .md-typeset .md-clipboard:hover:before,[data-md-color-accent=light-green] .md-typeset [id] .headerlink:focus,[data-md-color-accent=light-green] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=light-green] .md-typeset [id]:target .headerlink{color:#64dd17}[data-md-color-accent=light-green] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#64dd17}[data-md-color-accent=light-green] .md-search-result__link:hover,[data-md-color-accent=light-green] .md-search-result__link[data-md-state=active]{background-color:rgba(100,221,23,.1)}[data-md-color-accent=light-green] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#64dd17}[data-md-color-accent=light-green] .md-source-file:hover:before{background-color:#64dd17}button[data-md-color-accent=lime]{background-color:#aeea00}[data-md-color-accent=lime] .md-typeset a:active,[data-md-color-accent=lime] .md-typeset a:hover{color:#aeea00}[data-md-color-accent=lime] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover,[data-md-color-accent=lime] .md-typeset pre code::-webkit-scrollbar-thumb:hover{background-color:#aeea00}[data-md-color-accent=lime] .md-nav__link:focus,[data-md-color-accent=lime] .md-nav__link:hover,[data-md-color-accent=lime] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=lime] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=lime] .md-typeset .md-clipboard:active:before,[data-md-color-accent=lime] .md-typeset .md-clipboard:hover:before,[data-md-color-accent=lime] .md-typeset [id] .headerlink:focus,[data-md-color-accent=lime] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=lime] .md-typeset [id]:target .headerlink{color:#aeea00}[data-md-color-accent=lime] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#aeea00}[data-md-color-accent=lime] .md-search-result__link:hover,[data-md-color-accent=lime] .md-search-result__link[data-md-state=active]{background-color:rgba(174,234,0,.1)}[data-md-color-accent=lime] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#aeea00}[data-md-color-accent=lime] .md-source-file:hover:before{background-color:#aeea00}button[data-md-color-accent=yellow]{background-color:#ffd600}[data-md-color-accent=yellow] .md-typeset a:active,[data-md-color-accent=yellow] .md-typeset a:hover{color:#ffd600}[data-md-color-accent=yellow] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover,[data-md-color-accent=yellow] .md-typeset pre code::-webkit-scrollbar-thumb:hover{background-color:#ffd600}[data-md-color-accent=yellow] .md-nav__link:focus,[data-md-color-accent=yellow] .md-nav__link:hover,[data-md-color-accent=yellow] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=yellow] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=yellow] .md-typeset .md-clipboard:active:before,[data-md-color-accent=yellow] .md-typeset .md-clipboard:hover:before,[data-md-color-accent=yellow] .md-typeset [id] .headerlink:focus,[data-md-color-accent=yellow] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=yellow] .md-typeset [id]:target .headerlink{color:#ffd600}[data-md-color-accent=yellow] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#ffd600}[data-md-color-accent=yellow] .md-search-result__link:hover,[data-md-color-accent=yellow] .md-search-result__link[data-md-state=active]{background-color:rgba(255,214,0,.1)}[data-md-color-accent=yellow] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#ffd600}[data-md-color-accent=yellow] .md-source-file:hover:before{background-color:#ffd600}button[data-md-color-accent=amber]{background-color:#ffab00}[data-md-color-accent=amber] .md-typeset a:active,[data-md-color-accent=amber] .md-typeset a:hover{color:#ffab00}[data-md-color-accent=amber] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover,[data-md-color-accent=amber] .md-typeset pre code::-webkit-scrollbar-thumb:hover{background-color:#ffab00}[data-md-color-accent=amber] .md-nav__link:focus,[data-md-color-accent=amber] .md-nav__link:hover,[data-md-color-accent=amber] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=amber] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=amber] .md-typeset .md-clipboard:active:before,[data-md-color-accent=amber] .md-typeset .md-clipboard:hover:before,[data-md-color-accent=amber] .md-typeset [id] .headerlink:focus,[data-md-color-accent=amber] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=amber] .md-typeset [id]:target .headerlink{color:#ffab00}[data-md-color-accent=amber] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#ffab00}[data-md-color-accent=amber] .md-search-result__link:hover,[data-md-color-accent=amber] .md-search-result__link[data-md-state=active]{background-color:rgba(255,171,0,.1)}[data-md-color-accent=amber] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#ffab00}[data-md-color-accent=amber] .md-source-file:hover:before{background-color:#ffab00}button[data-md-color-accent=orange]{background-color:#ff9100}[data-md-color-accent=orange] .md-typeset a:active,[data-md-color-accent=orange] .md-typeset a:hover{color:#ff9100}[data-md-color-accent=orange] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover,[data-md-color-accent=orange] .md-typeset pre code::-webkit-scrollbar-thumb:hover{background-color:#ff9100}[data-md-color-accent=orange] .md-nav__link:focus,[data-md-color-accent=orange] .md-nav__link:hover,[data-md-color-accent=orange] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=orange] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=orange] .md-typeset .md-clipboard:active:before,[data-md-color-accent=orange] .md-typeset .md-clipboard:hover:before,[data-md-color-accent=orange] .md-typeset [id] .headerlink:focus,[data-md-color-accent=orange] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=orange] .md-typeset [id]:target .headerlink{color:#ff9100}[data-md-color-accent=orange] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#ff9100}[data-md-color-accent=orange] .md-search-result__link:hover,[data-md-color-accent=orange] .md-search-result__link[data-md-state=active]{background-color:rgba(255,145,0,.1)}[data-md-color-accent=orange] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#ff9100}[data-md-color-accent=orange] .md-source-file:hover:before{background-color:#ff9100}button[data-md-color-accent=deep-orange]{background-color:#ff6e40}[data-md-color-accent=deep-orange] .md-typeset a:active,[data-md-color-accent=deep-orange] .md-typeset a:hover{color:#ff6e40}[data-md-color-accent=deep-orange] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover,[data-md-color-accent=deep-orange] .md-typeset pre code::-webkit-scrollbar-thumb:hover{background-color:#ff6e40}[data-md-color-accent=deep-orange] .md-nav__link:focus,[data-md-color-accent=deep-orange] .md-nav__link:hover,[data-md-color-accent=deep-orange] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=deep-orange] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=deep-orange] .md-typeset .md-clipboard:active:before,[data-md-color-accent=deep-orange] .md-typeset .md-clipboard:hover:before,[data-md-color-accent=deep-orange] .md-typeset [id] .headerlink:focus,[data-md-color-accent=deep-orange] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=deep-orange] .md-typeset [id]:target .headerlink{color:#ff6e40}[data-md-color-accent=deep-orange] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#ff6e40}[data-md-color-accent=deep-orange] .md-search-result__link:hover,[data-md-color-accent=deep-orange] .md-search-result__link[data-md-state=active]{background-color:rgba(255,110,64,.1)}[data-md-color-accent=deep-orange] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#ff6e40}[data-md-color-accent=deep-orange] .md-source-file:hover:before{background-color:#ff6e40}@media only screen and (max-width:59.9375em){[data-md-color-primary=red] .md-nav__source{background-color:rgba(190,66,64,.9675)}[data-md-color-primary=pink] .md-nav__source{background-color:rgba(185,24,79,.9675)}[data-md-color-primary=purple] .md-nav__source{background-color:rgba(136,57,150,.9675)}[data-md-color-primary=deep-purple] .md-nav__source{background-color:rgba(100,69,154,.9675)}[data-md-color-primary=indigo] .md-nav__source{background-color:rgba(50,64,144,.9675)}[data-md-color-primary=blue] .md-nav__source{background-color:rgba(26,119,193,.9675)}[data-md-color-primary=light-blue] .md-nav__source{background-color:rgba(2,134,194,.9675)}[data-md-color-primary=cyan] .md-nav__source{background-color:rgba(0,150,169,.9675)}[data-md-color-primary=teal] .md-nav__source{background-color:rgba(0,119,108,.9675)}[data-md-color-primary=green] .md-nav__source{background-color:rgba(60,139,64,.9675)}[data-md-color-primary=light-green] .md-nav__source{background-color:rgba(99,142,53,.9675)}[data-md-color-primary=lime] .md-nav__source{background-color:rgba(153,161,41,.9675)}[data-md-color-primary=yellow] .md-nav__source{background-color:rgba(198,134,29,.9675)}[data-md-color-primary=amber] .md-nav__source{background-color:rgba(203,127,0,.9675)}[data-md-color-primary=orange] .md-nav__source{background-color:rgba(200,111,0,.9675)}[data-md-color-primary=deep-orange] .md-nav__source{background-color:rgba(203,89,53,.9675)}[data-md-color-primary=brown] .md-nav__source{background-color:rgba(96,68,57,.9675)}[data-md-color-primary=grey] .md-nav__source{background-color:rgba(93,93,93,.9675)}[data-md-color-primary=blue-grey] .md-nav__source{background-color:rgba(67,88,97,.9675)}[data-md-color-primary=white] .md-nav__source{background-color:rgba(0,0,0,.07);color:rgba(0,0,0,.87)}}@media only screen and (max-width:76.1875em){html [data-md-color-primary=red] .md-nav--primary .md-nav__title--site{background-color:#ef5350}html [data-md-color-primary=pink] .md-nav--primary .md-nav__title--site{background-color:#e91e63}html [data-md-color-primary=purple] .md-nav--primary .md-nav__title--site{background-color:#ab47bc}html [data-md-color-primary=deep-purple] .md-nav--primary .md-nav__title--site{background-color:#7e57c2}html [data-md-color-primary=indigo] .md-nav--primary .md-nav__title--site{background-color:#3f51b5}html [data-md-color-primary=blue] .md-nav--primary .md-nav__title--site{background-color:#2196f3}html [data-md-color-primary=light-blue] .md-nav--primary .md-nav__title--site{background-color:#03a9f4}html [data-md-color-primary=cyan] .md-nav--primary .md-nav__title--site{background-color:#00bcd4}html [data-md-color-primary=teal] .md-nav--primary .md-nav__title--site{background-color:#009688}html [data-md-color-primary=green] .md-nav--primary .md-nav__title--site{background-color:#4caf50}html [data-md-color-primary=light-green] .md-nav--primary .md-nav__title--site{background-color:#7cb342}html [data-md-color-primary=lime] .md-nav--primary .md-nav__title--site{background-color:#c0ca33}html [data-md-color-primary=yellow] .md-nav--primary .md-nav__title--site{background-color:#f9a825}html [data-md-color-primary=amber] .md-nav--primary .md-nav__title--site{background-color:#ffa000}html [data-md-color-primary=orange] .md-nav--primary .md-nav__title--site{background-color:#fb8c00}html [data-md-color-primary=deep-orange] .md-nav--primary .md-nav__title--site{background-color:#ff7043}html [data-md-color-primary=brown] .md-nav--primary .md-nav__title--site{background-color:#795548}html [data-md-color-primary=grey] .md-nav--primary .md-nav__title--site{background-color:#757575}html [data-md-color-primary=blue-grey] .md-nav--primary .md-nav__title--site{background-color:#546e7a}html [data-md-color-primary=white] .md-nav--primary .md-nav__title--site{background-color:#fff;color:rgba(0,0,0,.87)}[data-md-color-primary=white] .md-hero{border-bottom:.05rem solid rgba(0,0,0,.07)}}@media only screen and (min-width:76.25em){[data-md-color-primary=red] .md-tabs{background-color:#ef5350}[data-md-color-primary=pink] .md-tabs{background-color:#e91e63}[data-md-color-primary=purple] .md-tabs{background-color:#ab47bc}[data-md-color-primary=deep-purple] .md-tabs{background-color:#7e57c2}[data-md-color-primary=indigo] .md-tabs{background-color:#3f51b5}[data-md-color-primary=blue] .md-tabs{background-color:#2196f3}[data-md-color-primary=light-blue] .md-tabs{background-color:#03a9f4}[data-md-color-primary=cyan] .md-tabs{background-color:#00bcd4}[data-md-color-primary=teal] .md-tabs{background-color:#009688}[data-md-color-primary=green] .md-tabs{background-color:#4caf50}[data-md-color-primary=light-green] .md-tabs{background-color:#7cb342}[data-md-color-primary=lime] .md-tabs{background-color:#c0ca33}[data-md-color-primary=yellow] .md-tabs{background-color:#f9a825}[data-md-color-primary=amber] .md-tabs{background-color:#ffa000}[data-md-color-primary=orange] .md-tabs{background-color:#fb8c00}[data-md-color-primary=deep-orange] .md-tabs{background-color:#ff7043}[data-md-color-primary=brown] .md-tabs{background-color:#795548}[data-md-color-primary=grey] .md-tabs{background-color:#757575}[data-md-color-primary=blue-grey] .md-tabs{background-color:#546e7a}[data-md-color-primary=white] .md-tabs{border-bottom:.05rem solid rgba(0,0,0,.07);background-color:#fff;color:rgba(0,0,0,.87)}}@media only screen and (min-width:60em){[data-md-color-primary=white] .md-search__input{background-color:rgba(0,0,0,.07)}[data-md-color-primary=white] .md-search__input::-webkit-input-placeholder{color:rgba(0,0,0,.54)}[data-md-color-primary=white] .md-search__input:-ms-input-placeholder{color:rgba(0,0,0,.54)}[data-md-color-primary=white] .md-search__input::-ms-input-placeholder{color:rgba(0,0,0,.54)}[data-md-color-primary=white] .md-search__input::placeholder{color:rgba(0,0,0,.54)}} \ No newline at end of file diff --git a/_static/stylesheets/application.css b/_static/stylesheets/application.css new file mode 100644 index 00000000..b5c5df3b --- /dev/null +++ b/_static/stylesheets/application.css @@ -0,0 +1 @@ +@charset "UTF-8";html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}html{-webkit-text-size-adjust:none;-moz-text-size-adjust:none;-ms-text-size-adjust:none;text-size-adjust:none}body{margin:0}hr{overflow:visible;box-sizing:content-box}a{-webkit-text-decoration-skip:objects}a,button,input,label{-webkit-tap-highlight-color:transparent}a{color:inherit;text-decoration:none}small,sub,sup{font-size:80%}sub,sup{position:relative;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}table{border-collapse:separate;border-spacing:0}td,th{font-weight:400;vertical-align:top}button{margin:0;padding:0;border:0;outline-style:none;background:transparent;font-size:inherit}input{border:0;outline:0}.md-clipboard:before,.md-icon,.md-nav__button,.md-nav__link:after,.md-nav__title:before,.md-search-result__article--document:before,.md-source-file:before,.md-typeset .admonition>.admonition-title:before,.md-typeset .admonition>summary:before,.md-typeset .critic.comment:before,.md-typeset .footnote-backref,.md-typeset .task-list-control .task-list-indicator:before,.md-typeset details>.admonition-title:before,.md-typeset details>summary:before,.md-typeset summary:after{font-family:Material Icons;font-style:normal;font-variant:normal;font-weight:400;line-height:1;text-transform:none;white-space:nowrap;speak:none;word-wrap:normal;direction:ltr}.md-content__icon,.md-footer-nav__button,.md-header-nav__button,.md-nav__button,.md-nav__title:before,.md-search-result__article--document:before{display:inline-block;margin:.2rem;padding:.4rem;font-size:1.2rem;cursor:pointer}.md-icon--arrow-back:before{content:""}.md-icon--arrow-forward:before{content:""}.md-icon--menu:before{content:""}.md-icon--search:before{content:""}[dir=rtl] .md-icon--arrow-back:before{content:""}[dir=rtl] .md-icon--arrow-forward:before{content:""}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body,input{color:rgba(0,0,0,.87);-webkit-font-feature-settings:"kern","liga";font-feature-settings:"kern","liga";font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif}code,kbd,pre{color:rgba(0,0,0,.87);-webkit-font-feature-settings:"kern";font-feature-settings:"kern";font-family:"Roboto Mono","Courier New",Courier,monospace}.md-typeset{font-size:.8rem;line-height:1.6;-webkit-print-color-adjust:exact}.md-typeset blockquote,.md-typeset ol,.md-typeset p,.md-typeset ul{margin:1em 0}.md-typeset h1{margin:0 0 2rem;color:rgba(0,0,0,.54);font-size:1.5625rem;line-height:1.3}.md-typeset h1,.md-typeset h2{font-weight:300;letter-spacing:-.01em}.md-typeset h2{margin:2rem 0 .8rem;font-size:1.25rem;line-height:1.4}.md-typeset h3{margin:1.6rem 0 .8rem;font-size:1rem;font-weight:400;letter-spacing:-.01em;line-height:1.5}.md-typeset h2+h3{margin-top:.8rem}.md-typeset h4{font-size:.8rem}.md-typeset h4,.md-typeset h5,.md-typeset h6{margin:.8rem 0;font-weight:700;letter-spacing:-.01em}.md-typeset h5,.md-typeset h6{color:rgba(0,0,0,.54);font-size:.64rem}.md-typeset h5{text-transform:uppercase}.md-typeset hr{margin:1.5em 0;border-bottom:.05rem dotted rgba(0,0,0,.26)}.md-typeset a{color:#3f51b5;word-break:break-word}.md-typeset a,.md-typeset a:before{transition:color .125s}.md-typeset a:active,.md-typeset a:hover{color:#536dfe}.md-typeset code,.md-typeset pre{background-color:hsla(0,0%,92.5%,.5);color:#37474f;font-size:85%;direction:ltr}.md-typeset code{margin:0 .29412em;padding:.07353em 0;border-radius:.1rem;word-break:break-word;-webkit-box-decoration-break:clone;box-decoration-break:clone}.md-typeset h1 code,.md-typeset h2 code,.md-typeset h3 code,.md-typeset h4 code,.md-typeset h5 code,.md-typeset h6 code{margin:0;background-color:transparent;box-shadow:none}.md-typeset a>code{margin:inherit;padding:inherit;border-radius:initial;background-color:inherit;color:inherit;box-shadow:none}.md-typeset pre{position:relative;margin:1em 0;border-radius:.1rem;line-height:1.4;-webkit-overflow-scrolling:touch}.md-typeset pre>code{margin:0;padding:.525rem .6rem;background-color:transparent;font-size:inherit;box-shadow:none;-webkit-box-decoration-break:slice;box-decoration-break:slice;overflow:auto}.md-typeset pre>code::-webkit-scrollbar{width:.2rem;height:.2rem}.md-typeset pre>code::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,.26)}.md-typeset pre>code::-webkit-scrollbar-thumb:hover{background-color:#536dfe}.md-typeset kbd{padding:0 .29412em;border-radius:.15rem;border:.05rem solid #c9c9c9;border-bottom-color:#bcbcbc;background-color:#fcfcfc;color:#555;font-size:85%;box-shadow:0 .05rem 0 #b0b0b0;word-break:break-word}.md-typeset mark{margin:0 .25em;padding:.0625em 0;border-radius:.1rem;background-color:rgba(255,235,59,.5);box-shadow:.25em 0 0 rgba(255,235,59,.5),-.25em 0 0 rgba(255,235,59,.5);word-break:break-word;-webkit-box-decoration-break:clone;box-decoration-break:clone}.md-typeset abbr{border-bottom:.05rem dotted rgba(0,0,0,.54);text-decoration:none;cursor:help}.md-typeset small{opacity:.75}.md-typeset sub,.md-typeset sup{margin-left:.07812em}[dir=rtl] .md-typeset sub,[dir=rtl] .md-typeset sup{margin-right:.07812em;margin-left:0}.md-typeset blockquote{padding-left:.6rem;border-left:.2rem solid rgba(0,0,0,.26);color:rgba(0,0,0,.54)}[dir=rtl] .md-typeset blockquote{padding-right:.6rem;padding-left:0;border-right:.2rem solid rgba(0,0,0,.26);border-left:initial}.md-typeset ul{list-style-type:disc}.md-typeset ol,.md-typeset ul{margin-left:.625em;padding:0}[dir=rtl] .md-typeset ol,[dir=rtl] .md-typeset ul{margin-right:.625em;margin-left:0}.md-typeset ol ol,.md-typeset ul ol{list-style-type:lower-alpha}.md-typeset ol ol ol,.md-typeset ul ol ol{list-style-type:lower-roman}.md-typeset ol li,.md-typeset ul li{margin-bottom:.5em;margin-left:1.25em}[dir=rtl] .md-typeset ol li,[dir=rtl] .md-typeset ul li{margin-right:1.25em;margin-left:0}.md-typeset ol li blockquote,.md-typeset ol li p,.md-typeset ul li blockquote,.md-typeset ul li p{margin:.5em 0}.md-typeset ol li:last-child,.md-typeset ul li:last-child{margin-bottom:0}.md-typeset ol li ol,.md-typeset ol li ul,.md-typeset ul li ol,.md-typeset ul li ul{margin:.5em 0 .5em .625em}[dir=rtl] .md-typeset ol li ol,[dir=rtl] .md-typeset ol li ul,[dir=rtl] .md-typeset ul li ol,[dir=rtl] .md-typeset ul li ul{margin-right:.625em;margin-left:0}.md-typeset dd{margin:1em 0 1em 1.875em}[dir=rtl] .md-typeset dd{margin-right:1.875em;margin-left:0}.md-typeset iframe,.md-typeset img,.md-typeset svg{max-width:100%}.md-typeset table:not([class]){box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12),0 3px 1px -2px rgba(0,0,0,.2);display:inline-block;max-width:100%;border-radius:.1rem;font-size:.64rem;overflow:auto;-webkit-overflow-scrolling:touch}.md-typeset table:not([class])+*{margin-top:1.5em}.md-typeset table:not([class]) td:not([align]),.md-typeset table:not([class]) th:not([align]){text-align:left}[dir=rtl] .md-typeset table:not([class]) td:not([align]),[dir=rtl] .md-typeset table:not([class]) th:not([align]){text-align:right}.md-typeset table:not([class]) th{min-width:5rem;padding:.6rem .8rem;background-color:rgba(0,0,0,.54);color:#fff;vertical-align:top}.md-typeset table:not([class]) td{padding:.6rem .8rem;border-top:.05rem solid rgba(0,0,0,.07);vertical-align:top}.md-typeset table:not([class]) tr{transition:background-color .125s}.md-typeset table:not([class]) tr:hover{background-color:rgba(0,0,0,.035);box-shadow:inset 0 .05rem 0 #fff}.md-typeset table:not([class]) tr:first-child td{border-top:0}.md-typeset table:not([class]) a{word-break:normal}.md-typeset__scrollwrap{margin:1em -.8rem;overflow-x:auto;-webkit-overflow-scrolling:touch}.md-typeset .md-typeset__table{display:inline-block;margin-bottom:.5em;padding:0 .8rem}.md-typeset .md-typeset__table table{display:table;width:100%;margin:0;overflow:hidden}html{font-size:125%;overflow-x:hidden}body,html{height:100%}body{position:relative;font-size:.5rem}hr{display:block;height:.05rem;padding:0;border:0}.md-svg{display:none}.md-grid{max-width:73rem;margin-right:auto;margin-left:auto}.md-container,.md-main{overflow:auto}.md-container{display:table;width:100%;height:100%;padding-top:2.4rem;table-layout:fixed}.md-main{display:table-row;height:100%}.md-main__inner{height:100%;padding-top:1.5rem;padding-bottom:.05rem}.md-toggle{display:none}.md-overlay{position:fixed;top:0;width:0;height:0;transition:width 0 .25s,height 0 .25s,opacity .25s;background-color:rgba(0,0,0,.54);opacity:0;z-index:3}.md-flex{display:table}.md-flex__cell{display:table-cell;position:relative;vertical-align:top}.md-flex__cell--shrink{width:0}.md-flex__cell--stretch{display:table;width:100%;table-layout:fixed}.md-flex__ellipsis{display:table-cell;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.md-skip{position:fixed;width:.05rem;height:.05rem;margin:.5rem;padding:.3rem .5rem;-webkit-transform:translateY(.4rem);transform:translateY(.4rem);border-radius:.1rem;background-color:rgba(0,0,0,.87);color:#fff;font-size:.64rem;opacity:0;overflow:hidden}.md-skip:focus{width:auto;height:auto;clip:auto;-webkit-transform:translateX(0);transform:translateX(0);transition:opacity .175s 75ms,-webkit-transform .25s cubic-bezier(.4,0,.2,1);transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .175s 75ms;transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .175s 75ms,-webkit-transform .25s cubic-bezier(.4,0,.2,1);opacity:1;z-index:10}@page{margin:25mm}.md-clipboard{position:absolute;top:.3rem;right:.3rem;width:1.4rem;height:1.4rem;border-radius:.1rem;font-size:.8rem;cursor:pointer;z-index:1;-webkit-backface-visibility:hidden;backface-visibility:hidden}.md-clipboard:before{transition:color .25s,opacity .25s;color:rgba(0,0,0,.07);content:"\E14D"}.codehilite:hover .md-clipboard:before,.md-typeset .highlight:hover .md-clipboard:before,pre:hover .md-clipboard:before{color:rgba(0,0,0,.54)}.md-clipboard:focus:before,.md-clipboard:hover:before{color:#536dfe}.md-clipboard__message{display:block;position:absolute;top:0;right:1.7rem;padding:.3rem .5rem;-webkit-transform:translateX(.4rem);transform:translateX(.4rem);transition:opacity .175s,-webkit-transform .25s cubic-bezier(.9,.1,.9,0);transition:transform .25s cubic-bezier(.9,.1,.9,0),opacity .175s;transition:transform .25s cubic-bezier(.9,.1,.9,0),opacity .175s,-webkit-transform .25s cubic-bezier(.9,.1,.9,0);border-radius:.1rem;background-color:rgba(0,0,0,.54);color:#fff;font-size:.64rem;white-space:nowrap;opacity:0;pointer-events:none}.md-clipboard__message--active{-webkit-transform:translateX(0);transform:translateX(0);transition:opacity .175s 75ms,-webkit-transform .25s cubic-bezier(.4,0,.2,1);transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .175s 75ms;transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .175s 75ms,-webkit-transform .25s cubic-bezier(.4,0,.2,1);opacity:1;pointer-events:auto}.md-clipboard__message:before{content:attr(aria-label)}.md-clipboard__message:after{display:block;position:absolute;top:50%;right:-.2rem;width:0;margin-top:-.2rem;border-color:transparent rgba(0,0,0,.54);border-style:solid;border-width:.2rem 0 .2rem .2rem;content:""}.md-content__inner{margin:0 .8rem 1.2rem;padding-top:.6rem}.md-content__inner:before{display:block;height:.4rem;content:""}.md-content__inner>:last-child{margin-bottom:0}.md-content__icon{position:relative;margin:.4rem 0;padding:0;float:right}.md-typeset .md-content__icon{color:rgba(0,0,0,.26)}.md-header{position:fixed;top:0;right:0;left:0;height:2.4rem;transition:background-color .25s,color .25s;background-color:#3f51b5;color:#fff;box-shadow:none;z-index:2;-webkit-backface-visibility:hidden;backface-visibility:hidden}.no-js .md-header{transition:none;box-shadow:none}.md-header[data-md-state=shadow]{transition:background-color .25s,color .25s,box-shadow .25s;box-shadow:0 0 .2rem rgba(0,0,0,.1),0 .2rem .4rem rgba(0,0,0,.2)}.md-header-nav{padding:0 .2rem}.md-header-nav__button{position:relative;transition:opacity .25s;z-index:1}.md-header-nav__button:hover{opacity:.7}.md-header-nav__button.md-logo *{display:block}.no-js .md-header-nav__button.md-icon--search{display:none}.md-header-nav__topic{display:block;position:absolute;transition:opacity .15s,-webkit-transform .4s cubic-bezier(.1,.7,.1,1);transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s;transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s,-webkit-transform .4s cubic-bezier(.1,.7,.1,1);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.md-header-nav__topic+.md-header-nav__topic{-webkit-transform:translateX(1.25rem);transform:translateX(1.25rem);transition:opacity .15s,-webkit-transform .4s cubic-bezier(1,.7,.1,.1);transition:transform .4s cubic-bezier(1,.7,.1,.1),opacity .15s;transition:transform .4s cubic-bezier(1,.7,.1,.1),opacity .15s,-webkit-transform .4s cubic-bezier(1,.7,.1,.1);opacity:0;z-index:-1;pointer-events:none}[dir=rtl] .md-header-nav__topic+.md-header-nav__topic{-webkit-transform:translateX(-1.25rem);transform:translateX(-1.25rem)}.no-js .md-header-nav__topic{position:static}.no-js .md-header-nav__topic+.md-header-nav__topic{display:none}.md-header-nav__title{padding:0 1rem;font-size:.9rem;line-height:2.4rem}.md-header-nav__title[data-md-state=active] .md-header-nav__topic{-webkit-transform:translateX(-1.25rem);transform:translateX(-1.25rem);transition:opacity .15s,-webkit-transform .4s cubic-bezier(1,.7,.1,.1);transition:transform .4s cubic-bezier(1,.7,.1,.1),opacity .15s;transition:transform .4s cubic-bezier(1,.7,.1,.1),opacity .15s,-webkit-transform .4s cubic-bezier(1,.7,.1,.1);opacity:0;z-index:-1;pointer-events:none}[dir=rtl] .md-header-nav__title[data-md-state=active] .md-header-nav__topic{-webkit-transform:translateX(1.25rem);transform:translateX(1.25rem)}.md-header-nav__title[data-md-state=active] .md-header-nav__topic+.md-header-nav__topic{-webkit-transform:translateX(0);transform:translateX(0);transition:opacity .15s,-webkit-transform .4s cubic-bezier(.1,.7,.1,1);transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s;transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s,-webkit-transform .4s cubic-bezier(.1,.7,.1,1);opacity:1;z-index:0;pointer-events:auto}.md-header-nav__source{display:none}.md-hero{transition:background .25s;background-color:#3f51b5;color:#fff;font-size:1rem;overflow:hidden}.md-hero__inner{margin-top:1rem;padding:.8rem .8rem .4rem;transition:opacity .25s,-webkit-transform .4s cubic-bezier(.1,.7,.1,1);transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .25s;transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .25s,-webkit-transform .4s cubic-bezier(.1,.7,.1,1);transition-delay:.1s}[data-md-state=hidden] .md-hero__inner{pointer-events:none;-webkit-transform:translateY(.625rem);transform:translateY(.625rem);transition:opacity .1s 0,-webkit-transform 0 .4s;transition:transform 0 .4s,opacity .1s 0;transition:transform 0 .4s,opacity .1s 0,-webkit-transform 0 .4s;opacity:0}.md-hero--expand .md-hero__inner{margin-bottom:1.2rem}.md-footer-nav{background-color:rgba(0,0,0,.87);color:#fff}.md-footer-nav__inner{padding:.2rem;overflow:auto}.md-footer-nav__link{padding-top:1.4rem;padding-bottom:.4rem;transition:opacity .25s}.md-footer-nav__link:hover{opacity:.7}.md-footer-nav__link--prev{width:25%;float:left}[dir=rtl] .md-footer-nav__link--prev{float:right}.md-footer-nav__link--next{width:75%;float:right;text-align:right}[dir=rtl] .md-footer-nav__link--next{float:left;text-align:left}.md-footer-nav__button{transition:background .25s}.md-footer-nav__title{position:relative;padding:0 1rem;font-size:.9rem;line-height:2.4rem}.md-footer-nav__direction{position:absolute;right:0;left:0;margin-top:-1rem;padding:0 1rem;color:hsla(0,0%,100%,.7);font-size:.75rem}.md-footer-meta{background-color:rgba(0,0,0,.895)}.md-footer-meta__inner{padding:.2rem;overflow:auto}html .md-footer-meta.md-typeset a{color:hsla(0,0%,100%,.7)}html .md-footer-meta.md-typeset a:focus,html .md-footer-meta.md-typeset a:hover{color:#fff}.md-footer-copyright{margin:0 .6rem;padding:.4rem 0;color:hsla(0,0%,100%,.3);font-size:.64rem}.md-footer-copyright__highlight{color:hsla(0,0%,100%,.7)}.md-footer-social{margin:0 .4rem;padding:.2rem 0 .6rem}.md-footer-social__link{display:inline-block;width:1.6rem;height:1.6rem;font-size:.8rem;text-align:center}.md-footer-social__link:before{line-height:1.9}.md-nav{font-size:.7rem;line-height:1.3}.md-nav__title{display:block;padding:0 .6rem;font-weight:700;text-overflow:ellipsis;overflow:hidden}.md-nav__title:before{display:none;content:"\E5C4"}[dir=rtl] .md-nav__title:before{content:"\E5C8"}.md-nav__title .md-nav__button{display:none}.md-nav__list{margin:0;padding:0;list-style:none}.md-nav__item{padding:0 .6rem}.md-nav__item:last-child{padding-bottom:.6rem}.md-nav__item .md-nav__item{padding-right:0}[dir=rtl] .md-nav__item .md-nav__item{padding-right:.6rem;padding-left:0}.md-nav__item .md-nav__item:last-child{padding-bottom:0}.md-nav__button img{width:100%;height:auto}.md-nav__link{display:block;margin-top:.625em;transition:color .125s;text-overflow:ellipsis;cursor:pointer;overflow:hidden}.md-nav__item--nested>.md-nav__link:after{content:"\E313"}html .md-nav__link[for=__toc],html .md-nav__link[for=__toc]+.md-nav__link:after,html .md-nav__link[for=__toc]~.md-nav{display:none}.md-nav__link[data-md-state=blur]{color:rgba(0,0,0,.54)}.md-nav__link--active,.md-nav__link:active{color:#3f51b5}.md-nav__item--nested>.md-nav__link{color:inherit}.md-nav__link:focus,.md-nav__link:hover{color:#536dfe}.md-nav__source,.no-js .md-search{display:none}.md-search__overlay{opacity:0;z-index:1}.md-search__form{position:relative}.md-search__input{position:relative;padding:0 2.2rem 0 3.6rem;text-overflow:ellipsis;z-index:2}[dir=rtl] .md-search__input{padding:0 3.6rem 0 2.2rem}.md-search__input::-webkit-input-placeholder{transition:color .25s cubic-bezier(.1,.7,.1,1)}.md-search__input:-ms-input-placeholder{transition:color .25s cubic-bezier(.1,.7,.1,1)}.md-search__input::-ms-input-placeholder{transition:color .25s cubic-bezier(.1,.7,.1,1)}.md-search__input::placeholder{transition:color .25s cubic-bezier(.1,.7,.1,1)}.md-search__input::-webkit-input-placeholder,.md-search__input~.md-search__icon{color:rgba(0,0,0,.54)}.md-search__input:-ms-input-placeholder,.md-search__input~.md-search__icon{color:rgba(0,0,0,.54)}.md-search__input::-ms-input-placeholder,.md-search__input~.md-search__icon{color:rgba(0,0,0,.54)}.md-search__input::placeholder,.md-search__input~.md-search__icon{color:rgba(0,0,0,.54)}.md-search__input::-ms-clear{display:none}.md-search__icon{position:absolute;transition:color .25s cubic-bezier(.1,.7,.1,1),opacity .25s;font-size:1.2rem;cursor:pointer;z-index:2}.md-search__icon:hover{opacity:.7}.md-search__icon[for=__search]{top:.3rem;left:.5rem}[dir=rtl] .md-search__icon[for=__search]{right:.5rem;left:auto}.md-search__icon[for=__search]:before{content:"\E8B6"}.md-search__icon[type=reset]{top:.3rem;right:.5rem;-webkit-transform:scale(.125);transform:scale(.125);transition:opacity .15s,-webkit-transform .15s cubic-bezier(.1,.7,.1,1);transition:transform .15s cubic-bezier(.1,.7,.1,1),opacity .15s;transition:transform .15s cubic-bezier(.1,.7,.1,1),opacity .15s,-webkit-transform .15s cubic-bezier(.1,.7,.1,1);opacity:0}[dir=rtl] .md-search__icon[type=reset]{right:auto;left:.5rem}[data-md-toggle=search]:checked~.md-header .md-search__input:valid~.md-search__icon[type=reset]{-webkit-transform:scale(1);transform:scale(1);opacity:1}[data-md-toggle=search]:checked~.md-header .md-search__input:valid~.md-search__icon[type=reset]:hover{opacity:.7}.md-search__output{position:absolute;width:100%;border-radius:0 0 .1rem .1rem;overflow:hidden;z-index:1}.md-search__scrollwrap{height:100%;background-color:#fff;box-shadow:inset 0 .05rem 0 rgba(0,0,0,.07);overflow-y:auto;-webkit-overflow-scrolling:touch}.md-search-result{color:rgba(0,0,0,.87);word-break:break-word}.md-search-result__meta{padding:0 .8rem;background-color:rgba(0,0,0,.07);color:rgba(0,0,0,.54);font-size:.64rem;line-height:1.8rem}.md-search-result__list{margin:0;padding:0;border-top:.05rem solid rgba(0,0,0,.07);list-style:none}.md-search-result__item{box-shadow:0 -.05rem 0 rgba(0,0,0,.07)}.md-search-result__link{display:block;transition:background .25s;outline:0;overflow:hidden}.md-search-result__link:hover,.md-search-result__link[data-md-state=active]{background-color:rgba(83,109,254,.1)}.md-search-result__link:hover .md-search-result__article:before,.md-search-result__link[data-md-state=active] .md-search-result__article:before{opacity:.7}.md-search-result__link:last-child .md-search-result__teaser{margin-bottom:.6rem}.md-search-result__article{position:relative;padding:0 .8rem;overflow:auto}.md-search-result__article--document:before{position:absolute;left:0;margin:.1rem;transition:opacity .25s;color:rgba(0,0,0,.54);content:"\E880"}[dir=rtl] .md-search-result__article--document:before{right:0;left:auto}.md-search-result__article--document .md-search-result__title{margin:.55rem 0;font-size:.8rem;font-weight:400;line-height:1.4}.md-search-result__title{margin:.5em 0;font-size:.64rem;font-weight:700;line-height:1.4}.md-search-result__teaser{display:-webkit-box;max-height:1.65rem;margin:.5em 0;color:rgba(0,0,0,.54);font-size:.64rem;line-height:1.4;text-overflow:ellipsis;overflow:hidden;-webkit-line-clamp:2}.md-search-result em{font-style:normal;font-weight:700;text-decoration:underline}.md-sidebar{position:absolute;width:12.1rem;padding:1.2rem 0;overflow:hidden}.md-sidebar[data-md-state=lock]{position:fixed;top:2.4rem}.md-sidebar--secondary{display:none}.md-sidebar__scrollwrap{max-height:100%;margin:0 .2rem;overflow-y:auto;-webkit-backface-visibility:hidden;backface-visibility:hidden}.md-sidebar__scrollwrap::-webkit-scrollbar{width:.2rem;height:.2rem}.md-sidebar__scrollwrap::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,.26)}.md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#536dfe}.rst-versions{font-size:.85rem}@-webkit-keyframes md-source__facts--done{0%{height:0}to{height:.65rem}}@keyframes md-source__facts--done{0%{height:0}to{height:.65rem}}@-webkit-keyframes md-source__fact--done{0%{-webkit-transform:translateY(100%);transform:translateY(100%);opacity:0}50%{opacity:0}to{-webkit-transform:translateY(0);transform:translateY(0);opacity:1}}@keyframes md-source__fact--done{0%{-webkit-transform:translateY(100%);transform:translateY(100%);opacity:0}50%{opacity:0}to{-webkit-transform:translateY(0);transform:translateY(0);opacity:1}}.md-source{display:block;padding-right:.6rem;transition:opacity .25s;font-size:.65rem;line-height:1.2;white-space:nowrap}[dir=rtl] .md-source{padding-right:0;padding-left:.6rem}.md-source:hover{opacity:.7}.md-source:after,.md-source__icon{display:inline-block;height:2.4rem;content:"";vertical-align:middle}.md-source__icon{width:2.4rem}.md-source__icon svg{width:1.2rem;height:1.2rem;margin-top:.6rem;margin-left:.6rem}[dir=rtl] .md-source__icon svg{margin-right:.6rem;margin-left:0}.md-source__icon+.md-source__repository{margin-left:-2rem;padding-left:2rem}[dir=rtl] .md-source__icon+.md-source__repository{margin-right:-2rem;margin-left:0;padding-right:2rem;padding-left:0}.md-source__repository{display:inline-block;max-width:100%;margin-left:.6rem;font-weight:700;text-overflow:ellipsis;overflow:hidden;vertical-align:middle}.md-source__facts{margin:0;padding:0;font-size:.55rem;font-weight:700;list-style-type:none;opacity:.75;overflow:hidden}[data-md-state=done] .md-source__facts{-webkit-animation:md-source__facts--done .25s ease-in;animation:md-source__facts--done .25s ease-in}.md-source__fact{float:left}[dir=rtl] .md-source__fact{float:right}[data-md-state=done] .md-source__fact{-webkit-animation:md-source__fact--done .4s ease-out;animation:md-source__fact--done .4s ease-out}.md-source__fact:before{margin:0 .1rem;content:"\00B7"}.md-source__fact:first-child:before{display:none}.md-source-file{display:inline-block;margin:1em .5em 1em 0;padding-right:.25rem;border-radius:.1rem;background-color:rgba(0,0,0,.07);font-size:.64rem;list-style-type:none;cursor:pointer;overflow:hidden}.md-source-file:before{display:inline-block;margin-right:.25rem;padding:.25rem;background-color:rgba(0,0,0,.26);color:#fff;font-size:.8rem;content:"\E86F";vertical-align:middle}html .md-source-file{transition:background .4s,color .4s,box-shadow .4s cubic-bezier(.4,0,.2,1)}html .md-source-file:before{transition:inherit}html body .md-typeset .md-source-file{color:rgba(0,0,0,.54)}.md-source-file:hover{box-shadow:0 0 8px rgba(0,0,0,.18),0 8px 16px rgba(0,0,0,.36)}.md-source-file:hover:before{background-color:#536dfe}.md-tabs{width:100%;transition:background .25s;background-color:#3f51b5;color:#fff;overflow:auto}.md-tabs__list{margin:0 0 0 .2rem;padding:0;list-style:none;white-space:nowrap}.md-tabs__item{display:inline-block;height:2.4rem;padding-right:.6rem;padding-left:.6rem}.md-tabs__link{display:block;margin-top:.8rem;transition:opacity .25s,-webkit-transform .4s cubic-bezier(.1,.7,.1,1);transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .25s;transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .25s,-webkit-transform .4s cubic-bezier(.1,.7,.1,1);font-size:.7rem;opacity:.7}.md-tabs__link--active,.md-tabs__link:hover{color:inherit;opacity:1}.md-tabs__item:nth-child(2) .md-tabs__link{transition-delay:.02s}.md-tabs__item:nth-child(3) .md-tabs__link{transition-delay:.04s}.md-tabs__item:nth-child(4) .md-tabs__link{transition-delay:.06s}.md-tabs__item:nth-child(5) .md-tabs__link{transition-delay:.08s}.md-tabs__item:nth-child(6) .md-tabs__link{transition-delay:.1s}.md-tabs__item:nth-child(7) .md-tabs__link{transition-delay:.12s}.md-tabs__item:nth-child(8) .md-tabs__link{transition-delay:.14s}.md-tabs__item:nth-child(9) .md-tabs__link{transition-delay:.16s}.md-tabs__item:nth-child(10) .md-tabs__link{transition-delay:.18s}.md-tabs__item:nth-child(11) .md-tabs__link{transition-delay:.2s}.md-tabs__item:nth-child(12) .md-tabs__link{transition-delay:.22s}.md-tabs__item:nth-child(13) .md-tabs__link{transition-delay:.24s}.md-tabs__item:nth-child(14) .md-tabs__link{transition-delay:.26s}.md-tabs__item:nth-child(15) .md-tabs__link{transition-delay:.28s}.md-tabs__item:nth-child(16) .md-tabs__link{transition-delay:.3s}.md-tabs[data-md-state=hidden]{pointer-events:none}.md-tabs[data-md-state=hidden] .md-tabs__link{-webkit-transform:translateY(50%);transform:translateY(50%);transition:color .25s,opacity .1s,-webkit-transform 0 .4s;transition:color .25s,transform 0 .4s,opacity .1s;transition:color .25s,transform 0 .4s,opacity .1s,-webkit-transform 0 .4s;opacity:0}.md-typeset .admonition,.md-typeset details{box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12),0 3px 1px -2px rgba(0,0,0,.2);position:relative;margin:1.5625em 0;padding:0 .6rem;border-left:.2rem solid #448aff;border-radius:.1rem;font-size:.64rem;overflow:auto}[dir=rtl] .md-typeset .admonition,[dir=rtl] .md-typeset details{border-right:.2rem solid #448aff;border-left:none}html .md-typeset .admonition>:last-child,html .md-typeset details>:last-child{margin-bottom:.6rem}.md-typeset .admonition .admonition,.md-typeset .admonition details,.md-typeset details .admonition,.md-typeset details details{margin:1em 0}.md-typeset .admonition>.admonition-title,.md-typeset .admonition>summary,.md-typeset details>.admonition-title,.md-typeset details>summary{margin:0 -.6rem;padding:.4rem .6rem .4rem 2rem;border-bottom:.05rem solid rgba(68,138,255,.1);background-color:rgba(68,138,255,.1);font-weight:700}[dir=rtl] .md-typeset .admonition>.admonition-title,[dir=rtl] .md-typeset .admonition>summary,[dir=rtl] .md-typeset details>.admonition-title,[dir=rtl] .md-typeset details>summary{padding:.4rem 2rem .4rem .6rem}.md-typeset .admonition>.admonition-title:last-child,.md-typeset .admonition>summary:last-child,.md-typeset details>.admonition-title:last-child,.md-typeset details>summary:last-child{margin-bottom:0}.md-typeset .admonition>.admonition-title:before,.md-typeset .admonition>summary:before,.md-typeset details>.admonition-title:before,.md-typeset details>summary:before{position:absolute;left:.6rem;color:#448aff;font-size:1rem;content:"\E3C9"}[dir=rtl] .md-typeset .admonition>.admonition-title:before,[dir=rtl] .md-typeset .admonition>summary:before,[dir=rtl] .md-typeset details>.admonition-title:before,[dir=rtl] .md-typeset details>summary:before{right:.6rem;left:auto}.md-typeset .admonition.abstract,.md-typeset .admonition.summary,.md-typeset .admonition.tldr,.md-typeset details.abstract,.md-typeset details.summary,.md-typeset details.tldr{border-left-color:#00b0ff}[dir=rtl] .md-typeset .admonition.abstract,[dir=rtl] .md-typeset .admonition.summary,[dir=rtl] .md-typeset .admonition.tldr,[dir=rtl] .md-typeset details.abstract,[dir=rtl] .md-typeset details.summary,[dir=rtl] .md-typeset details.tldr{border-right-color:#00b0ff}.md-typeset .admonition.abstract>.admonition-title,.md-typeset .admonition.abstract>summary,.md-typeset .admonition.summary>.admonition-title,.md-typeset .admonition.summary>summary,.md-typeset .admonition.tldr>.admonition-title,.md-typeset .admonition.tldr>summary,.md-typeset details.abstract>.admonition-title,.md-typeset details.abstract>summary,.md-typeset details.summary>.admonition-title,.md-typeset details.summary>summary,.md-typeset details.tldr>.admonition-title,.md-typeset details.tldr>summary{border-bottom-color:rgba(0,176,255,.1);background-color:rgba(0,176,255,.1)}.md-typeset .admonition.abstract>.admonition-title:before,.md-typeset .admonition.abstract>summary:before,.md-typeset .admonition.summary>.admonition-title:before,.md-typeset .admonition.summary>summary:before,.md-typeset .admonition.tldr>.admonition-title:before,.md-typeset .admonition.tldr>summary:before,.md-typeset details.abstract>.admonition-title:before,.md-typeset details.abstract>summary:before,.md-typeset details.summary>.admonition-title:before,.md-typeset details.summary>summary:before,.md-typeset details.tldr>.admonition-title:before,.md-typeset details.tldr>summary:before{color:#00b0ff;content:""}.md-typeset .admonition.info,.md-typeset .admonition.todo,.md-typeset details.info,.md-typeset details.todo{border-left-color:#00b8d4}[dir=rtl] .md-typeset .admonition.info,[dir=rtl] .md-typeset .admonition.todo,[dir=rtl] .md-typeset details.info,[dir=rtl] .md-typeset details.todo{border-right-color:#00b8d4}.md-typeset .admonition.info>.admonition-title,.md-typeset .admonition.info>summary,.md-typeset .admonition.todo>.admonition-title,.md-typeset .admonition.todo>summary,.md-typeset details.info>.admonition-title,.md-typeset details.info>summary,.md-typeset details.todo>.admonition-title,.md-typeset details.todo>summary{border-bottom-color:rgba(0,184,212,.1);background-color:rgba(0,184,212,.1)}.md-typeset .admonition.info>.admonition-title:before,.md-typeset .admonition.info>summary:before,.md-typeset .admonition.todo>.admonition-title:before,.md-typeset .admonition.todo>summary:before,.md-typeset details.info>.admonition-title:before,.md-typeset details.info>summary:before,.md-typeset details.todo>.admonition-title:before,.md-typeset details.todo>summary:before{color:#00b8d4;content:""}.md-typeset .admonition.hint,.md-typeset .admonition.important,.md-typeset .admonition.tip,.md-typeset details.hint,.md-typeset details.important,.md-typeset details.tip{border-left-color:#00bfa5}[dir=rtl] .md-typeset .admonition.hint,[dir=rtl] .md-typeset .admonition.important,[dir=rtl] .md-typeset .admonition.tip,[dir=rtl] .md-typeset details.hint,[dir=rtl] .md-typeset details.important,[dir=rtl] .md-typeset details.tip{border-right-color:#00bfa5}.md-typeset .admonition.hint>.admonition-title,.md-typeset .admonition.hint>summary,.md-typeset .admonition.important>.admonition-title,.md-typeset .admonition.important>summary,.md-typeset .admonition.tip>.admonition-title,.md-typeset .admonition.tip>summary,.md-typeset details.hint>.admonition-title,.md-typeset details.hint>summary,.md-typeset details.important>.admonition-title,.md-typeset details.important>summary,.md-typeset details.tip>.admonition-title,.md-typeset details.tip>summary{border-bottom-color:rgba(0,191,165,.1);background-color:rgba(0,191,165,.1)}.md-typeset .admonition.hint>.admonition-title:before,.md-typeset .admonition.hint>summary:before,.md-typeset .admonition.important>.admonition-title:before,.md-typeset .admonition.important>summary:before,.md-typeset .admonition.tip>.admonition-title:before,.md-typeset .admonition.tip>summary:before,.md-typeset details.hint>.admonition-title:before,.md-typeset details.hint>summary:before,.md-typeset details.important>.admonition-title:before,.md-typeset details.important>summary:before,.md-typeset details.tip>.admonition-title:before,.md-typeset details.tip>summary:before{color:#00bfa5;content:""}.md-typeset .admonition.check,.md-typeset .admonition.done,.md-typeset .admonition.success,.md-typeset details.check,.md-typeset details.done,.md-typeset details.success{border-left-color:#00c853}[dir=rtl] .md-typeset .admonition.check,[dir=rtl] .md-typeset .admonition.done,[dir=rtl] .md-typeset .admonition.success,[dir=rtl] .md-typeset details.check,[dir=rtl] .md-typeset details.done,[dir=rtl] .md-typeset details.success{border-right-color:#00c853}.md-typeset .admonition.check>.admonition-title,.md-typeset .admonition.check>summary,.md-typeset .admonition.done>.admonition-title,.md-typeset .admonition.done>summary,.md-typeset .admonition.success>.admonition-title,.md-typeset .admonition.success>summary,.md-typeset details.check>.admonition-title,.md-typeset details.check>summary,.md-typeset details.done>.admonition-title,.md-typeset details.done>summary,.md-typeset details.success>.admonition-title,.md-typeset details.success>summary{border-bottom-color:rgba(0,200,83,.1);background-color:rgba(0,200,83,.1)}.md-typeset .admonition.check>.admonition-title:before,.md-typeset .admonition.check>summary:before,.md-typeset .admonition.done>.admonition-title:before,.md-typeset .admonition.done>summary:before,.md-typeset .admonition.success>.admonition-title:before,.md-typeset .admonition.success>summary:before,.md-typeset details.check>.admonition-title:before,.md-typeset details.check>summary:before,.md-typeset details.done>.admonition-title:before,.md-typeset details.done>summary:before,.md-typeset details.success>.admonition-title:before,.md-typeset details.success>summary:before{color:#00c853;content:""}.md-typeset .admonition.faq,.md-typeset .admonition.help,.md-typeset .admonition.question,.md-typeset details.faq,.md-typeset details.help,.md-typeset details.question{border-left-color:#64dd17}[dir=rtl] .md-typeset .admonition.faq,[dir=rtl] .md-typeset .admonition.help,[dir=rtl] .md-typeset .admonition.question,[dir=rtl] .md-typeset details.faq,[dir=rtl] .md-typeset details.help,[dir=rtl] .md-typeset details.question{border-right-color:#64dd17}.md-typeset .admonition.faq>.admonition-title,.md-typeset .admonition.faq>summary,.md-typeset .admonition.help>.admonition-title,.md-typeset .admonition.help>summary,.md-typeset .admonition.question>.admonition-title,.md-typeset .admonition.question>summary,.md-typeset details.faq>.admonition-title,.md-typeset details.faq>summary,.md-typeset details.help>.admonition-title,.md-typeset details.help>summary,.md-typeset details.question>.admonition-title,.md-typeset details.question>summary{border-bottom-color:rgba(100,221,23,.1);background-color:rgba(100,221,23,.1)}.md-typeset .admonition.faq>.admonition-title:before,.md-typeset .admonition.faq>summary:before,.md-typeset .admonition.help>.admonition-title:before,.md-typeset .admonition.help>summary:before,.md-typeset .admonition.question>.admonition-title:before,.md-typeset .admonition.question>summary:before,.md-typeset details.faq>.admonition-title:before,.md-typeset details.faq>summary:before,.md-typeset details.help>.admonition-title:before,.md-typeset details.help>summary:before,.md-typeset details.question>.admonition-title:before,.md-typeset details.question>summary:before{color:#64dd17;content:""}.md-typeset .admonition.attention,.md-typeset .admonition.caution,.md-typeset .admonition.warning,.md-typeset details.attention,.md-typeset details.caution,.md-typeset details.warning{border-left-color:#ff9100}[dir=rtl] .md-typeset .admonition.attention,[dir=rtl] .md-typeset .admonition.caution,[dir=rtl] .md-typeset .admonition.warning,[dir=rtl] .md-typeset details.attention,[dir=rtl] .md-typeset details.caution,[dir=rtl] .md-typeset details.warning{border-right-color:#ff9100}.md-typeset .admonition.attention>.admonition-title,.md-typeset .admonition.attention>summary,.md-typeset .admonition.caution>.admonition-title,.md-typeset .admonition.caution>summary,.md-typeset .admonition.warning>.admonition-title,.md-typeset .admonition.warning>summary,.md-typeset details.attention>.admonition-title,.md-typeset details.attention>summary,.md-typeset details.caution>.admonition-title,.md-typeset details.caution>summary,.md-typeset details.warning>.admonition-title,.md-typeset details.warning>summary{border-bottom-color:rgba(255,145,0,.1);background-color:rgba(255,145,0,.1)}.md-typeset .admonition.attention>.admonition-title:before,.md-typeset .admonition.attention>summary:before,.md-typeset .admonition.caution>.admonition-title:before,.md-typeset .admonition.caution>summary:before,.md-typeset .admonition.warning>.admonition-title:before,.md-typeset .admonition.warning>summary:before,.md-typeset details.attention>.admonition-title:before,.md-typeset details.attention>summary:before,.md-typeset details.caution>.admonition-title:before,.md-typeset details.caution>summary:before,.md-typeset details.warning>.admonition-title:before,.md-typeset details.warning>summary:before{color:#ff9100;content:""}.md-typeset .admonition.fail,.md-typeset .admonition.failure,.md-typeset .admonition.missing,.md-typeset details.fail,.md-typeset details.failure,.md-typeset details.missing{border-left-color:#ff5252}[dir=rtl] .md-typeset .admonition.fail,[dir=rtl] .md-typeset .admonition.failure,[dir=rtl] .md-typeset .admonition.missing,[dir=rtl] .md-typeset details.fail,[dir=rtl] .md-typeset details.failure,[dir=rtl] .md-typeset details.missing{border-right-color:#ff5252}.md-typeset .admonition.fail>.admonition-title,.md-typeset .admonition.fail>summary,.md-typeset .admonition.failure>.admonition-title,.md-typeset .admonition.failure>summary,.md-typeset .admonition.missing>.admonition-title,.md-typeset .admonition.missing>summary,.md-typeset details.fail>.admonition-title,.md-typeset details.fail>summary,.md-typeset details.failure>.admonition-title,.md-typeset details.failure>summary,.md-typeset details.missing>.admonition-title,.md-typeset details.missing>summary{border-bottom-color:rgba(255,82,82,.1);background-color:rgba(255,82,82,.1)}.md-typeset .admonition.fail>.admonition-title:before,.md-typeset .admonition.fail>summary:before,.md-typeset .admonition.failure>.admonition-title:before,.md-typeset .admonition.failure>summary:before,.md-typeset .admonition.missing>.admonition-title:before,.md-typeset .admonition.missing>summary:before,.md-typeset details.fail>.admonition-title:before,.md-typeset details.fail>summary:before,.md-typeset details.failure>.admonition-title:before,.md-typeset details.failure>summary:before,.md-typeset details.missing>.admonition-title:before,.md-typeset details.missing>summary:before{color:#ff5252;content:""}.md-typeset .admonition.danger,.md-typeset .admonition.error,.md-typeset details.danger,.md-typeset details.error{border-left-color:#ff1744}[dir=rtl] .md-typeset .admonition.danger,[dir=rtl] .md-typeset .admonition.error,[dir=rtl] .md-typeset details.danger,[dir=rtl] .md-typeset details.error{border-right-color:#ff1744}.md-typeset .admonition.danger>.admonition-title,.md-typeset .admonition.danger>summary,.md-typeset .admonition.error>.admonition-title,.md-typeset .admonition.error>summary,.md-typeset details.danger>.admonition-title,.md-typeset details.danger>summary,.md-typeset details.error>.admonition-title,.md-typeset details.error>summary{border-bottom-color:rgba(255,23,68,.1);background-color:rgba(255,23,68,.1)}.md-typeset .admonition.danger>.admonition-title:before,.md-typeset .admonition.danger>summary:before,.md-typeset .admonition.error>.admonition-title:before,.md-typeset .admonition.error>summary:before,.md-typeset details.danger>.admonition-title:before,.md-typeset details.danger>summary:before,.md-typeset details.error>.admonition-title:before,.md-typeset details.error>summary:before{color:#ff1744;content:""}.md-typeset .admonition.bug,.md-typeset details.bug{border-left-color:#f50057}[dir=rtl] .md-typeset .admonition.bug,[dir=rtl] .md-typeset details.bug{border-right-color:#f50057}.md-typeset .admonition.bug>.admonition-title,.md-typeset .admonition.bug>summary,.md-typeset details.bug>.admonition-title,.md-typeset details.bug>summary{border-bottom-color:rgba(245,0,87,.1);background-color:rgba(245,0,87,.1)}.md-typeset .admonition.bug>.admonition-title:before,.md-typeset .admonition.bug>summary:before,.md-typeset details.bug>.admonition-title:before,.md-typeset details.bug>summary:before{color:#f50057;content:""}.md-typeset .admonition.example,.md-typeset details.example{border-left-color:#651fff}[dir=rtl] .md-typeset .admonition.example,[dir=rtl] .md-typeset details.example{border-right-color:#651fff}.md-typeset .admonition.example>.admonition-title,.md-typeset .admonition.example>summary,.md-typeset details.example>.admonition-title,.md-typeset details.example>summary{border-bottom-color:rgba(101,31,255,.1);background-color:rgba(101,31,255,.1)}.md-typeset .admonition.example>.admonition-title:before,.md-typeset .admonition.example>summary:before,.md-typeset details.example>.admonition-title:before,.md-typeset details.example>summary:before{color:#651fff;content:""}.md-typeset .admonition.cite,.md-typeset .admonition.quote,.md-typeset details.cite,.md-typeset details.quote{border-left-color:#9e9e9e}[dir=rtl] .md-typeset .admonition.cite,[dir=rtl] .md-typeset .admonition.quote,[dir=rtl] .md-typeset details.cite,[dir=rtl] .md-typeset details.quote{border-right-color:#9e9e9e}.md-typeset .admonition.cite>.admonition-title,.md-typeset .admonition.cite>summary,.md-typeset .admonition.quote>.admonition-title,.md-typeset .admonition.quote>summary,.md-typeset details.cite>.admonition-title,.md-typeset details.cite>summary,.md-typeset details.quote>.admonition-title,.md-typeset details.quote>summary{border-bottom-color:hsla(0,0%,62%,.1);background-color:hsla(0,0%,62%,.1)}.md-typeset .admonition.cite>.admonition-title:before,.md-typeset .admonition.cite>summary:before,.md-typeset .admonition.quote>.admonition-title:before,.md-typeset .admonition.quote>summary:before,.md-typeset details.cite>.admonition-title:before,.md-typeset details.cite>summary:before,.md-typeset details.quote>.admonition-title:before,.md-typeset details.quote>summary:before{color:#9e9e9e;content:""}.codehilite .o,.codehilite .ow,.highlight .o,.highlight .ow{color:inherit}.codehilite .ge,.highlight .ge{color:#000}.codehilite .gr,.highlight .gr{color:#a00}.codehilite .gh,.highlight .gh{color:#999}.codehilite .go,.highlight .go{color:#888}.codehilite .gp,.highlight .gp{color:#555}.codehilite .gs,.highlight .gs{color:inherit}.codehilite .gu,.highlight .gu{color:#aaa}.codehilite .gt,.highlight .gt{color:#a00}.codehilite .gd,.highlight .gd{background-color:#fdd}.codehilite .gi,.highlight .gi{background-color:#dfd}.codehilite .k,.highlight .k{color:#3b78e7}.codehilite .kc,.highlight .kc{color:#a71d5d}.codehilite .kd,.codehilite .kn,.highlight .kd,.highlight .kn{color:#3b78e7}.codehilite .kp,.highlight .kp{color:#a71d5d}.codehilite .kr,.codehilite .kt,.highlight .kr,.highlight .kt{color:#3e61a2}.codehilite .c,.codehilite .cm,.highlight .c,.highlight .cm{color:#999}.codehilite .cp,.highlight .cp{color:#666}.codehilite .c1,.codehilite .ch,.codehilite .cs,.highlight .c1,.highlight .ch,.highlight .cs{color:#999}.codehilite .na,.codehilite .nb,.highlight .na,.highlight .nb{color:#c2185b}.codehilite .bp,.highlight .bp{color:#3e61a2}.codehilite .nc,.highlight .nc{color:#c2185b}.codehilite .no,.highlight .no{color:#3e61a2}.codehilite .nd,.codehilite .ni,.highlight .nd,.highlight .ni{color:#666}.codehilite .ne,.codehilite .nf,.highlight .ne,.highlight .nf{color:#c2185b}.codehilite .nl,.highlight .nl{color:#3b5179}.codehilite .nn,.highlight .nn{color:#ec407a}.codehilite .nt,.highlight .nt{color:#3b78e7}.codehilite .nv,.codehilite .vc,.codehilite .vg,.codehilite .vi,.highlight .nv,.highlight .vc,.highlight .vg,.highlight .vi{color:#3e61a2}.codehilite .nx,.highlight .nx{color:#ec407a}.codehilite .il,.codehilite .m,.codehilite .mf,.codehilite .mh,.codehilite .mi,.codehilite .mo,.highlight .il,.highlight .m,.highlight .mf,.highlight .mh,.highlight .mi,.highlight .mo{color:#e74c3c}.codehilite .s,.codehilite .sb,.codehilite .sc,.highlight .s,.highlight .sb,.highlight .sc{color:#0d904f}.codehilite .sd,.highlight .sd{color:#999}.codehilite .s2,.highlight .s2{color:#0d904f}.codehilite .se,.codehilite .sh,.codehilite .si,.codehilite .sx,.highlight .se,.highlight .sh,.highlight .si,.highlight .sx{color:#183691}.codehilite .sr,.highlight .sr{color:#009926}.codehilite .s1,.codehilite .ss,.highlight .s1,.highlight .ss{color:#0d904f}.codehilite .err,.highlight .err{color:#a61717}.codehilite .w,.highlight .w{color:transparent}.codehilite .hll,.highlight .hll{display:block;margin:0 -.6rem;padding:0 .6rem;background-color:rgba(255,235,59,.5)}.md-typeset .codehilite,.highlight{position:relative;margin:1em 0;padding:0;border-radius:.1rem;background-color:hsla(0,0%,92.5%,.5);color:#37474f;line-height:1.4;-webkit-overflow-scrolling:touch}.md-typeset .codehilite code,.md-typeset .codehilite pre,.highlight code,.highlight pre{display:block;margin:0;padding:.525rem .6rem;background-color:transparent;overflow:auto;vertical-align:top}.md-typeset .codehilite code::-webkit-scrollbar,.md-typeset .codehilite pre::-webkit-scrollbar,.highlight code::-webkit-scrollbar,.highlight pre::-webkit-scrollbar{width:.2rem;height:.2rem}.md-typeset .codehilite code::-webkit-scrollbar-thumb,.md-typeset .codehilite pre::-webkit-scrollbar-thumb,.highlight code::-webkit-scrollbar-thumb,.highlight pre::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,.26)}.md-typeset .codehilite code::-webkit-scrollbar-thumb:hover,.md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover,.highlight code::-webkit-scrollbar-thumb:hover,.highlight pre::-webkit-scrollbar-thumb:hover{background-color:#536dfe}.md-typeset pre.codehilite,.md-typeset pre.highlight{overflow:visible}.md-typeset pre.codehilite code,.md-typeset pre.highlight code{display:block;padding:.525rem .6rem;overflow:auto}.md-typeset .codehilitetable,.md-typeset .highlighttable{display:block;margin:1em 0;border-radius:.2em;font-size:.8rem;overflow:hidden}.md-typeset .codehilitetable tbody,.md-typeset .codehilitetable td,.md-typeset .highlighttable tbody,.md-typeset .highlighttable td{display:block;padding:0}.md-typeset .codehilitetable tr,.md-typeset .highlighttable tr{display:flex}.md-typeset .codehilitetable .codehilite,.md-typeset .codehilitetable .highlight,.md-typeset .codehilitetable .linenodiv,.md-typeset .highlighttable .codehilite,.md-typeset .highlighttable .highlight,.md-typeset .highlighttable .linenodiv{margin:0;border-radius:0}.md-typeset .codehilitetable .linenodiv,.md-typeset .highlighttable .linenodiv{padding:.525rem .6rem}.md-typeset .codehilitetable .linenos,.md-typeset .highlighttable .linenos{background-color:rgba(0,0,0,.07);color:rgba(0,0,0,.26);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.md-typeset .codehilitetable .linenos pre,.md-typeset .highlighttable .linenos pre{margin:0;padding:0;background-color:transparent;color:inherit;text-align:right}.md-typeset .codehilitetable .code,.md-typeset .highlighttable .code{flex:1;overflow:hidden}.md-typeset>.codehilitetable,.md-typeset>.highlighttable{box-shadow:none}.md-typeset [id^="fnref:"]{display:inline-block}.md-typeset [id^="fnref:"]:target{margin-top:-3.8rem;padding-top:3.8rem;pointer-events:none}.md-typeset [id^="fn:"]:before{display:none;height:0;content:""}.md-typeset [id^="fn:"]:target:before{display:block;margin-top:-3.5rem;padding-top:3.5rem;pointer-events:none}.md-typeset .footnote{color:rgba(0,0,0,.54);font-size:.64rem}.md-typeset .footnote ol{margin-left:0}.md-typeset .footnote li{transition:color .25s}.md-typeset .footnote li:target{color:rgba(0,0,0,.87)}.md-typeset .footnote li :first-child{margin-top:0}.md-typeset .footnote li:hover .footnote-backref,.md-typeset .footnote li:target .footnote-backref{-webkit-transform:translateX(0);transform:translateX(0);opacity:1}.md-typeset .footnote li:hover .footnote-backref:hover,.md-typeset .footnote li:target .footnote-backref{color:#536dfe}.md-typeset .footnote-ref{display:inline-block;pointer-events:auto}.md-typeset .footnote-ref:before{display:inline;margin:0 .2em;border-left:.05rem solid rgba(0,0,0,.26);font-size:1.25em;content:"";vertical-align:-.25rem}.md-typeset .footnote-backref{display:inline-block;-webkit-transform:translateX(.25rem);transform:translateX(.25rem);transition:color .25s,opacity .125s .125s,-webkit-transform .25s .125s;transition:transform .25s .125s,color .25s,opacity .125s .125s;transition:transform .25s .125s,color .25s,opacity .125s .125s,-webkit-transform .25s .125s;color:rgba(0,0,0,.26);font-size:0;opacity:0;vertical-align:text-bottom}[dir=rtl] .md-typeset .footnote-backref{-webkit-transform:translateX(-.25rem);transform:translateX(-.25rem)}.md-typeset .footnote-backref:before{display:inline-block;font-size:.8rem;content:"\E31B"}[dir=rtl] .md-typeset .footnote-backref:before{-webkit-transform:scaleX(-1);transform:scaleX(-1)}.md-typeset .headerlink{display:inline-block;margin-left:.5rem;-webkit-transform:translateY(.25rem);transform:translateY(.25rem);transition:color .25s,opacity .125s .25s,-webkit-transform .25s .25s;transition:transform .25s .25s,color .25s,opacity .125s .25s;transition:transform .25s .25s,color .25s,opacity .125s .25s,-webkit-transform .25s .25s;opacity:0}[dir=rtl] .md-typeset .headerlink{margin-right:.5rem;margin-left:0}html body .md-typeset .headerlink{color:rgba(0,0,0,.26)}.md-typeset h1[id]:before{display:block;margin-top:-9px;padding-top:9px;content:""}.md-typeset h1[id]:target:before{margin-top:-3.45rem;padding-top:3.45rem}.md-typeset h1[id] .headerlink:focus,.md-typeset h1[id]:hover .headerlink,.md-typeset h1[id]:target .headerlink{-webkit-transform:translate(0);transform:translate(0);opacity:1}.md-typeset h1[id] .headerlink:focus,.md-typeset h1[id]:hover .headerlink:hover,.md-typeset h1[id]:target .headerlink{color:#536dfe}.md-typeset h2[id]:before{display:block;margin-top:-8px;padding-top:8px;content:""}.md-typeset h2[id]:target:before{margin-top:-3.4rem;padding-top:3.4rem}.md-typeset h2[id] .headerlink:focus,.md-typeset h2[id]:hover .headerlink,.md-typeset h2[id]:target .headerlink{-webkit-transform:translate(0);transform:translate(0);opacity:1}.md-typeset h2[id] .headerlink:focus,.md-typeset h2[id]:hover .headerlink:hover,.md-typeset h2[id]:target .headerlink{color:#536dfe}.md-typeset h3[id]:before{display:block;margin-top:-9px;padding-top:9px;content:""}.md-typeset h3[id]:target:before{margin-top:-3.45rem;padding-top:3.45rem}.md-typeset h3[id] .headerlink:focus,.md-typeset h3[id]:hover .headerlink,.md-typeset h3[id]:target .headerlink{-webkit-transform:translate(0);transform:translate(0);opacity:1}.md-typeset h3[id] .headerlink:focus,.md-typeset h3[id]:hover .headerlink:hover,.md-typeset h3[id]:target .headerlink{color:#536dfe}.md-typeset h4[id]:before{display:block;margin-top:-9px;padding-top:9px;content:""}.md-typeset h4[id]:target:before{margin-top:-3.45rem;padding-top:3.45rem}.md-typeset h4[id] .headerlink:focus,.md-typeset h4[id]:hover .headerlink,.md-typeset h4[id]:target .headerlink{-webkit-transform:translate(0);transform:translate(0);opacity:1}.md-typeset h4[id] .headerlink:focus,.md-typeset h4[id]:hover .headerlink:hover,.md-typeset h4[id]:target .headerlink{color:#536dfe}.md-typeset h5[id]:before{display:block;margin-top:-11px;padding-top:11px;content:""}.md-typeset h5[id]:target:before{margin-top:-3.55rem;padding-top:3.55rem}.md-typeset h5[id] .headerlink:focus,.md-typeset h5[id]:hover .headerlink,.md-typeset h5[id]:target .headerlink{-webkit-transform:translate(0);transform:translate(0);opacity:1}.md-typeset h5[id] .headerlink:focus,.md-typeset h5[id]:hover .headerlink:hover,.md-typeset h5[id]:target .headerlink{color:#536dfe}.md-typeset h6[id]:before{display:block;margin-top:-11px;padding-top:11px;content:""}.md-typeset h6[id]:target:before{margin-top:-3.55rem;padding-top:3.55rem}.md-typeset h6[id] .headerlink:focus,.md-typeset h6[id]:hover .headerlink,.md-typeset h6[id]:target .headerlink{-webkit-transform:translate(0);transform:translate(0);opacity:1}.md-typeset h6[id] .headerlink:focus,.md-typeset h6[id]:hover .headerlink:hover,.md-typeset h6[id]:target .headerlink{color:#536dfe}.md-typeset .MJXc-display{margin:.75em 0;padding:.75em 0;overflow:auto;-webkit-overflow-scrolling:touch}.md-typeset .MathJax_CHTML{outline:0}.md-typeset .critic.comment,.md-typeset del.critic,.md-typeset ins.critic{margin:0 .25em;padding:.0625em 0;border-radius:.1rem;-webkit-box-decoration-break:clone;box-decoration-break:clone}.md-typeset del.critic{background-color:#fdd;box-shadow:.25em 0 0 #fdd,-.25em 0 0 #fdd}.md-typeset ins.critic{background-color:#dfd;box-shadow:.25em 0 0 #dfd,-.25em 0 0 #dfd}.md-typeset .critic.comment{background-color:hsla(0,0%,92.5%,.5);color:#37474f;box-shadow:.25em 0 0 hsla(0,0%,92.5%,.5),-.25em 0 0 hsla(0,0%,92.5%,.5)}.md-typeset .critic.comment:before{padding-right:.125em;color:rgba(0,0,0,.26);content:"\E0B7";vertical-align:-.125em}.md-typeset .critic.block{display:block;margin:1em 0;padding-right:.8rem;padding-left:.8rem;box-shadow:none}.md-typeset .critic.block :first-child{margin-top:.5em}.md-typeset .critic.block :last-child{margin-bottom:.5em}.md-typeset details{display:block;padding-top:0}.md-typeset details[open]>summary:after{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.md-typeset details:not([open]){padding-bottom:0}.md-typeset details:not([open])>summary{border-bottom:none}.md-typeset details summary{padding-right:2rem}[dir=rtl] .md-typeset details summary{padding-left:2rem}.no-details .md-typeset details:not([open])>*{display:none}.no-details .md-typeset details:not([open]) summary{display:block}.md-typeset summary{display:block;outline:none;cursor:pointer}.md-typeset summary::-webkit-details-marker{display:none}.md-typeset summary:after{position:absolute;top:.4rem;right:.6rem;color:rgba(0,0,0,.26);font-size:1rem;content:"\E313"}[dir=rtl] .md-typeset summary:after{right:auto;left:.6rem}.md-typeset .emojione{width:1rem;vertical-align:text-top}.md-typeset code.codehilite,.md-typeset code.highlight{margin:0 .29412em;padding:.07353em 0}.md-typeset .superfences-content{display:none;order:99;width:100%;background-color:#fff}.md-typeset .superfences-content>*{margin:0;border-radius:0}.md-typeset .superfences-tabs{display:flex;position:relative;flex-wrap:wrap;margin:1em 0;border:.05rem solid rgba(0,0,0,.07);border-radius:.2em}.md-typeset .superfences-tabs>input{display:none}.md-typeset .superfences-tabs>input:checked+label{font-weight:700}.md-typeset .superfences-tabs>input:checked+label+.superfences-content{display:block}.md-typeset .superfences-tabs>label{width:auto;padding:.6rem;transition:color .125s;font-size:.64rem;cursor:pointer}html .md-typeset .superfences-tabs>label:hover{color:#536dfe}.md-typeset .task-list-item{position:relative;list-style-type:none}.md-typeset .task-list-item [type=checkbox]{position:absolute;top:.45em;left:-2em}[dir=rtl] .md-typeset .task-list-item [type=checkbox]{right:-2em;left:auto}.md-typeset .task-list-control .task-list-indicator:before{position:absolute;top:.15em;left:-1.25em;color:rgba(0,0,0,.26);font-size:1.25em;content:"\E835";vertical-align:-.25em}[dir=rtl] .md-typeset .task-list-control .task-list-indicator:before{right:-1.25em;left:auto}.md-typeset .task-list-control [type=checkbox]:checked+.task-list-indicator:before{content:"\E834"}.md-typeset .task-list-control [type=checkbox]{opacity:0;z-index:-1}@media print{.md-typeset a:after{color:rgba(0,0,0,.54);content:" [" attr(href) "]"}.md-typeset code,.md-typeset pre{white-space:pre-wrap}.md-typeset code{box-shadow:none;-webkit-box-decoration-break:initial;box-decoration-break:slice}.md-clipboard,.md-content__icon,.md-footer,.md-header,.md-sidebar,.md-tabs,.md-typeset .headerlink{display:none}}@media only screen and (max-width:44.9375em){.md-typeset pre{margin:1em -.8rem;border-radius:0}.md-typeset pre>code{padding:.525rem .8rem}.md-footer-nav__link--prev .md-footer-nav__title{display:none}.md-search-result__teaser{max-height:2.5rem;-webkit-line-clamp:3}.codehilite .hll,.md-typeset .highlight .hll{margin:0 -.8rem;padding:0 .8rem}.md-typeset>.codehilite,.md-typeset>.highlight{margin:1em -.8rem;border-radius:0}.md-typeset>.codehilite code,.md-typeset>.codehilite pre,.md-typeset>.highlight code,.md-typeset>.highlight pre{padding:.525rem .8rem}.md-typeset>.codehilitetable,.md-typeset>.highlighttable{margin:1em -.8rem;border-radius:0}.md-typeset>.codehilitetable .codehilite>code,.md-typeset>.codehilitetable .codehilite>pre,.md-typeset>.codehilitetable .highlight>code,.md-typeset>.codehilitetable .highlight>pre,.md-typeset>.codehilitetable .linenodiv,.md-typeset>.highlighttable .codehilite>code,.md-typeset>.highlighttable .codehilite>pre,.md-typeset>.highlighttable .highlight>code,.md-typeset>.highlighttable .highlight>pre,.md-typeset>.highlighttable .linenodiv{padding:.5rem .8rem}.md-typeset>p>.MJXc-display{margin:.75em -.8rem;padding:.25em .8rem}.md-typeset>.superfences-tabs{margin:1em -.8rem;border:0;border-top:.05rem solid rgba(0,0,0,.07);border-radius:0}.md-typeset>.superfences-tabs code,.md-typeset>.superfences-tabs pre{padding:.525rem .8rem}}@media only screen and (min-width:100em){html{font-size:137.5%}}@media only screen and (min-width:125em){html{font-size:150%}}@media only screen and (max-width:59.9375em){body[data-md-state=lock]{overflow:hidden}.ios body[data-md-state=lock] .md-container{display:none}html .md-nav__link[for=__toc]{display:block;padding-right:2.4rem}html .md-nav__link[for=__toc]:after{color:inherit;content:"\E8DE"}html .md-nav__link[for=__toc]+.md-nav__link{display:none}html .md-nav__link[for=__toc]~.md-nav{display:flex}html [dir=rtl] .md-nav__link{padding-right:.8rem;padding-left:2.4rem}.md-nav__source{display:block;padding:0 .2rem;background-color:rgba(50,64,144,.9675);color:#fff}.md-search__overlay{position:absolute;top:.2rem;left:.2rem;width:1.8rem;height:1.8rem;-webkit-transform-origin:center;transform-origin:center;transition:opacity .2s .2s,-webkit-transform .3s .1s;transition:transform .3s .1s,opacity .2s .2s;transition:transform .3s .1s,opacity .2s .2s,-webkit-transform .3s .1s;border-radius:1rem;background-color:#fff;overflow:hidden;pointer-events:none}[dir=rtl] .md-search__overlay{right:.2rem;left:auto}[data-md-toggle=search]:checked~.md-header .md-search__overlay{transition:opacity .1s,-webkit-transform .4s;transition:transform .4s,opacity .1s;transition:transform .4s,opacity .1s,-webkit-transform .4s;opacity:1}.md-search__inner{position:fixed;top:0;left:100%;width:100%;height:100%;-webkit-transform:translateX(5%);transform:translateX(5%);transition:right 0 .3s,left 0 .3s,opacity .15s .15s,-webkit-transform .15s cubic-bezier(.4,0,.2,1) .15s;transition:right 0 .3s,left 0 .3s,transform .15s cubic-bezier(.4,0,.2,1) .15s,opacity .15s .15s;transition:right 0 .3s,left 0 .3s,transform .15s cubic-bezier(.4,0,.2,1) .15s,opacity .15s .15s,-webkit-transform .15s cubic-bezier(.4,0,.2,1) .15s;opacity:0;z-index:2}[data-md-toggle=search]:checked~.md-header .md-search__inner{left:0;-webkit-transform:translateX(0);transform:translateX(0);transition:right 0 0,left 0 0,opacity .15s .15s,-webkit-transform .15s cubic-bezier(.1,.7,.1,1) .15s;transition:right 0 0,left 0 0,transform .15s cubic-bezier(.1,.7,.1,1) .15s,opacity .15s .15s;transition:right 0 0,left 0 0,transform .15s cubic-bezier(.1,.7,.1,1) .15s,opacity .15s .15s,-webkit-transform .15s cubic-bezier(.1,.7,.1,1) .15s;opacity:1}[dir=rtl] [data-md-toggle=search]:checked~.md-header .md-search__inner{right:0;left:auto}html [dir=rtl] .md-search__inner{right:100%;left:auto;-webkit-transform:translateX(-5%);transform:translateX(-5%)}.md-search__input{width:100%;height:2.4rem;font-size:.9rem}.md-search__icon[for=__search]{top:.6rem;left:.8rem}.md-search__icon[for=__search][for=__search]:before{content:"\E5C4"}[dir=rtl] .md-search__icon[for=__search][for=__search]:before{content:"\E5C8"}.md-search__icon[type=reset]{top:.6rem;right:.8rem}.md-search__output{top:2.4rem;bottom:0}.md-search-result__article--document:before{display:none}}@media only screen and (max-width:76.1875em){[data-md-toggle=drawer]:checked~.md-overlay{width:100%;height:100%;transition:width 0,height 0,opacity .25s;opacity:1}.md-header-nav__button.md-icon--home,.md-header-nav__button.md-logo{display:none}.md-hero__inner{margin-top:2.4rem;margin-bottom:1.2rem}.md-nav{background-color:#fff}.md-nav--primary,.md-nav--primary .md-nav{display:flex;position:absolute;top:0;right:0;left:0;flex-direction:column;height:100%;z-index:1}.md-nav--primary .md-nav__item,.md-nav--primary .md-nav__title{font-size:.8rem;line-height:1.5}html .md-nav--primary .md-nav__title{position:relative;height:5.6rem;padding:3rem .8rem .2rem;background-color:rgba(0,0,0,.07);color:rgba(0,0,0,.54);font-weight:400;line-height:2.4rem;white-space:nowrap;cursor:pointer}html .md-nav--primary .md-nav__title:before{display:block;position:absolute;top:.2rem;left:.2rem;width:2rem;height:2rem;color:rgba(0,0,0,.54)}html .md-nav--primary .md-nav__title~.md-nav__list{background-color:#fff;box-shadow:inset 0 .05rem 0 rgba(0,0,0,.07)}html .md-nav--primary .md-nav__title~.md-nav__list>.md-nav__item:first-child{border-top:0}html .md-nav--primary .md-nav__title--site{position:relative;background-color:#3f51b5;color:#fff}html .md-nav--primary .md-nav__title--site .md-nav__button{display:block;position:absolute;top:.2rem;left:.2rem;width:3.2rem;height:3.2rem;font-size:2.4rem}html .md-nav--primary .md-nav__title--site:before{display:none}html [dir=rtl] .md-nav--primary .md-nav__title--site .md-nav__button,html [dir=rtl] .md-nav--primary .md-nav__title:before{right:.2rem;left:auto}.md-nav--primary .md-nav__list{flex:1;overflow-y:auto}.md-nav--primary .md-nav__item{padding:0;border-top:.05rem solid rgba(0,0,0,.07)}[dir=rtl] .md-nav--primary .md-nav__item{padding:0}.md-nav--primary .md-nav__item--nested>.md-nav__link{padding-right:2.4rem}[dir=rtl] .md-nav--primary .md-nav__item--nested>.md-nav__link{padding-right:.8rem;padding-left:2.4rem}.md-nav--primary .md-nav__item--nested>.md-nav__link:after{content:"\E315"}[dir=rtl] .md-nav--primary .md-nav__item--nested>.md-nav__link:after{content:"\E314"}.md-nav--primary .md-nav__link{position:relative;margin-top:0;padding:.6rem .8rem}.md-nav--primary .md-nav__link:after{position:absolute;top:50%;right:.6rem;margin-top:-.6rem;color:inherit;font-size:1.2rem}[dir=rtl] .md-nav--primary .md-nav__link:after{right:auto;left:.6rem}.md-nav--primary .md-nav--secondary .md-nav__link{position:static}.md-nav--primary .md-nav--secondary .md-nav{position:static;background-color:transparent}.md-nav--primary .md-nav--secondary .md-nav .md-nav__link{padding-left:1.4rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav__link{padding-right:1.4rem;padding-left:0}.md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav__link{padding-left:2rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav__link{padding-right:2rem;padding-left:0}.md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav__link{padding-left:2.6rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav__link{padding-right:2.6rem;padding-left:0}.md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav .md-nav__link{padding-left:3.2rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav .md-nav__link{padding-right:3.2rem;padding-left:0}.md-nav__toggle~.md-nav{display:flex;-webkit-transform:translateX(100%);transform:translateX(100%);transition:opacity .125s .05s,-webkit-transform .25s cubic-bezier(.8,0,.6,1);transition:transform .25s cubic-bezier(.8,0,.6,1),opacity .125s .05s;transition:transform .25s cubic-bezier(.8,0,.6,1),opacity .125s .05s,-webkit-transform .25s cubic-bezier(.8,0,.6,1);opacity:0}[dir=rtl] .md-nav__toggle~.md-nav{-webkit-transform:translateX(-100%);transform:translateX(-100%)}.no-csstransforms3d .md-nav__toggle~.md-nav{display:none}.md-nav__toggle:checked~.md-nav{-webkit-transform:translateX(0);transform:translateX(0);transition:opacity .125s .125s,-webkit-transform .25s cubic-bezier(.4,0,.2,1);transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .125s .125s;transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .125s .125s,-webkit-transform .25s cubic-bezier(.4,0,.2,1);opacity:1}.no-csstransforms3d .md-nav__toggle:checked~.md-nav{display:flex}.md-sidebar--primary{position:fixed;top:0;left:-12.1rem;width:12.1rem;height:100%;-webkit-transform:translateX(0);transform:translateX(0);transition:box-shadow .25s,-webkit-transform .25s cubic-bezier(.4,0,.2,1);transition:transform .25s cubic-bezier(.4,0,.2,1),box-shadow .25s;transition:transform .25s cubic-bezier(.4,0,.2,1),box-shadow .25s,-webkit-transform .25s cubic-bezier(.4,0,.2,1);background-color:#fff;z-index:3}[dir=rtl] .md-sidebar--primary{right:-12.1rem;left:auto}.no-csstransforms3d .md-sidebar--primary{display:none}[data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{box-shadow:0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12),0 5px 5px -3px rgba(0,0,0,.4);-webkit-transform:translateX(12.1rem);transform:translateX(12.1rem)}[dir=rtl] [data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{-webkit-transform:translateX(-12.1rem);transform:translateX(-12.1rem)}.no-csstransforms3d [data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{display:block}.md-sidebar--primary .md-sidebar__scrollwrap{overflow:hidden;position:absolute;top:0;right:0;bottom:0;left:0;margin:0}.md-tabs{display:none}}@media only screen and (min-width:60em){.md-content{margin-right:12.1rem}[dir=rtl] .md-content{margin-right:0;margin-left:12.1rem}.md-header-nav__button.md-icon--search{display:none}.md-header-nav__source{display:block;width:11.7rem;max-width:11.7rem;padding-right:.6rem}[dir=rtl] .md-header-nav__source{padding-right:0;padding-left:.6rem}.md-search{padding:.2rem}.md-search__overlay{position:fixed;top:0;left:0;width:0;height:0;transition:width 0 .25s,height 0 .25s,opacity .25s;background-color:rgba(0,0,0,.54);cursor:pointer}[dir=rtl] .md-search__overlay{right:0;left:auto}[data-md-toggle=search]:checked~.md-header .md-search__overlay{width:100%;height:100%;transition:width 0,height 0,opacity .25s;opacity:1}.md-search__inner{position:relative;width:11.5rem;margin-right:.8rem;padding:.1rem 0;float:right;transition:width .25s cubic-bezier(.1,.7,.1,1)}[dir=rtl] .md-search__inner{margin-right:0;margin-left:.8rem;float:left}.md-search__form,.md-search__input{border-radius:.1rem}.md-search__input{width:100%;height:1.8rem;padding-left:2.2rem;transition:background-color .25s cubic-bezier(.1,.7,.1,1),color .25s cubic-bezier(.1,.7,.1,1);background-color:rgba(0,0,0,.26);color:inherit;font-size:.8rem}[dir=rtl] .md-search__input{padding-right:2.2rem}.md-search__input+.md-search__icon{color:inherit}.md-search__input::-webkit-input-placeholder{color:hsla(0,0%,100%,.7)}.md-search__input:-ms-input-placeholder{color:hsla(0,0%,100%,.7)}.md-search__input::-ms-input-placeholder{color:hsla(0,0%,100%,.7)}.md-search__input::placeholder{color:hsla(0,0%,100%,.7)}.md-search__input:hover{background-color:hsla(0,0%,100%,.12)}[data-md-toggle=search]:checked~.md-header .md-search__input{border-radius:.1rem .1rem 0 0;background-color:#fff;color:rgba(0,0,0,.87);text-overflow:clip}[data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon,[data-md-toggle=search]:checked~.md-header .md-search__input::-webkit-input-placeholder{color:rgba(0,0,0,.54)}[data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon,[data-md-toggle=search]:checked~.md-header .md-search__input:-ms-input-placeholder{color:rgba(0,0,0,.54)}[data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon,[data-md-toggle=search]:checked~.md-header .md-search__input::-ms-input-placeholder{color:rgba(0,0,0,.54)}[data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon,[data-md-toggle=search]:checked~.md-header .md-search__input::placeholder{color:rgba(0,0,0,.54)}.md-search__output{top:1.9rem;transition:opacity .4s;opacity:0}[data-md-toggle=search]:checked~.md-header .md-search__output{box-shadow:0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12),0 3px 5px -1px rgba(0,0,0,.4);opacity:1}.md-search__scrollwrap{max-height:0}[data-md-toggle=search]:checked~.md-header .md-search__scrollwrap{max-height:75vh}.md-search__scrollwrap::-webkit-scrollbar{width:.2rem;height:.2rem}.md-search__scrollwrap::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,.26)}.md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#536dfe}.md-search-result__meta{padding-left:2.2rem}[dir=rtl] .md-search-result__meta{padding-right:2.2rem;padding-left:0}.md-search-result__article{padding-left:2.2rem}[dir=rtl] .md-search-result__article{padding-right:2.2rem;padding-left:.8rem}.md-sidebar--secondary{display:block;margin-left:100%;-webkit-transform:translate(-100%);transform:translate(-100%)}[dir=rtl] .md-sidebar--secondary{margin-right:100%;margin-left:0;-webkit-transform:translate(100%);transform:translate(100%)}}@media only screen and (min-width:88.25em){.md-sidebar--secondary{margin-left:73rem}[dir=rtl] .md-sidebar--secondary{margin-right:73rem;margin-left:0}}@media only screen and (min-width:76.25em){.md-content{margin-left:12.1rem}[dir=rtl] .md-content{margin-right:12.1rem}.md-content__inner{margin-right:1.2rem;margin-left:1.2rem}.md-header-nav__button.md-icon--menu{display:none}.md-nav[data-md-state=animate]{transition:max-height .25s cubic-bezier(.86,0,.07,1)}.md-nav__toggle~.md-nav{max-height:0;overflow:hidden}.no-js .md-nav__toggle~.md-nav{display:none}.md-nav[data-md-state=expand],.md-nav__toggle:checked~.md-nav{max-height:100%}.no-js .md-nav[data-md-state=expand],.no-js .md-nav__toggle:checked~.md-nav{display:block}.md-nav__item--nested>.md-nav>.md-nav__title{display:none}.md-nav__item--nested>.md-nav__link:after{display:inline-block;-webkit-transform-origin:.45em .45em;transform-origin:.45em .45em;-webkit-transform-style:preserve-3d;transform-style:preserve-3d;vertical-align:-.125em}.js .md-nav__item--nested>.md-nav__link:after{transition:-webkit-transform .4s;transition:transform .4s;transition:transform .4s,-webkit-transform .4s}.md-nav__item--nested .md-nav__toggle:checked~.md-nav__link:after{-webkit-transform:rotateX(180deg);transform:rotateX(180deg)}.md-search__inner{margin-right:1.2rem}[dir=rtl] .md-search__inner{margin-left:1.2rem}.md-search__scrollwrap,[data-md-toggle=search]:checked~.md-header .md-search__inner{width:34.4rem}.md-tabs~.md-main .md-nav--primary>.md-nav__list>.md-nav__item--nested{font-size:0;visibility:hidden}.md-tabs--active~.md-main .md-nav--primary .md-nav__title{display:block;padding:0}.md-tabs--active~.md-main .md-nav--primary .md-nav__title--site{display:none}.no-js .md-tabs--active~.md-main .md-nav--primary .md-nav{display:block}.md-tabs--active~.md-main .md-nav--primary>.md-nav__list>.md-nav__item{font-size:0;visibility:hidden}.md-tabs--active~.md-main .md-nav--primary>.md-nav__list>.md-nav__item--nested{display:none;font-size:.7rem;overflow:auto;visibility:visible}.md-tabs--active~.md-main .md-nav--primary>.md-nav__list>.md-nav__item--nested>.md-nav__link{display:none}.md-tabs--active~.md-main .md-nav--primary>.md-nav__list>.md-nav__item--active{display:block}.md-tabs--active~.md-main .md-nav[data-md-level=1]{max-height:none;overflow:visible}.md-tabs--active~.md-main .md-nav[data-md-level=1]>.md-nav__list>.md-nav__item{padding-left:0}.md-tabs--active~.md-main .md-nav[data-md-level=1] .md-nav .md-nav__title{display:none}}@media only screen and (min-width:45em){.md-footer-nav__link{width:50%}.md-footer-copyright{max-width:75%;float:left}[dir=rtl] .md-footer-copyright{float:right}.md-footer-social{padding:.6rem 0;float:right}[dir=rtl] .md-footer-social{float:left}}@media only screen and (max-width:29.9375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{-webkit-transform:scale(45);transform:scale(45)}}@media only screen and (min-width:30em) and (max-width:44.9375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{-webkit-transform:scale(60);transform:scale(60)}}@media only screen and (min-width:45em) and (max-width:59.9375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{-webkit-transform:scale(75);transform:scale(75)}}@media only screen and (min-width:60em) and (max-width:76.1875em){.md-search__scrollwrap,[data-md-toggle=search]:checked~.md-header .md-search__inner{width:23.4rem}.md-search-result__teaser{max-height:2.5rem;-webkit-line-clamp:3}} \ No newline at end of file diff --git a/genindex.html b/genindex.html new file mode 100644 index 00000000..7f64d22c --- /dev/null +++ b/genindex.html @@ -0,0 +1 @@ + Index — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

Index

\ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 00000000..0d42bca1 --- /dev/null +++ b/index.html @@ -0,0 +1 @@ + PSI Jungfraujoch — Jungfraujoch 1.0.0-rc.144 documentation Skip to content
_images/jfjoch.png

PSI Jungfraujoch

Jungfraujoch is data acquisition and on-the-fly analysis system developed by the Paul Scherrer Institut.

It can be currently used with PSI and DECTRIS detectors.

Jungfraujoch is distributed under the GPLv3 license.

\ No newline at end of file diff --git a/objects.inv b/objects.inv new file mode 100644 index 0000000000000000000000000000000000000000..33509c07d90f4f175d2901475775fd2e82964b66 GIT binary patch literal 1867 zcmV-R2ekMjAX9K?X>NERX>N99Zgg*Qc_4OWa&u{KZXhxWBOp+6Z)#;@bUGkPb#7;7 za$$99Z)0c*BOq2~a&u{KZaN?eBOp|0Wgv28ZDDC{WMy(7Z)PBLXlZjGW@&6?AZc?T zV{dJ6a%FRKWn>_Ab7^j8AbM%xV)ZSsB2xguw*I`v4L9L!R?*O!OA2|hzuMj^ z)ZspLpW}<5t^K*TjlCP5j4Q+(rLd$>(6(Ok5=7r_Xfm$QO2{slybD@5_r2XB@_%^I z4OPi0bRLCHM$iW&LL&B(#NV!N+p0+@WRQJ;GUZ)N;2sjlf6kuVXz}7kT7{dKU_Jqo zT>ycc^!tp6oJ9V{U3t4Wi9C0sa@DvT5LE+HMj$BY?0NYd%%66TQSeQ#vX&6UU;Apf z@7@T0=arR!AHMfuWQv5w{6O&1F<&A-F)~F$V_pbioM{*g+BjItArOS#)(w3XCqn`k zoM6d68r&`py?Javi-g8;=n1B1k5a%8E@z?t>aBMhH`az)7ZuzPeZt%+0DYfDUKqqa zpQgU2IjZrdGUfTxIf3+@uYSC@v7@tj6*KijaLN~GR302EJ!gp*CtBs|fDlR`x}>7wi}K=IjaP zRV%aE0djT*KWj=3-gt*`QWI@jf&ZL!FsZB{!q|7z&0$vH%piNZJ~Roz+u-b+LusI7 zCurf79eI!R*i~$o=7{(CS3d6-8*QMN^6F%J5SgA1C)2O)zo_6NA%=|cmZrn1CbZoB z^`Ob+v0h+e2H1JZLWK%_HDVH9R~BpV&EK;I0d}d zCTv@vv}wOhvI{`oH+-3~?4drq*&y_&*@yuOnYE9G?)D)iXyNj`L~IW8{64paWpr(l z7VfVET$lM76G+o)tB(0bz{t6{uQWp{#?lRejirTqaL$=~LQ@55f!Y=;AYZzy*+d>D zrz`|aKY@-3uK9ei6s@4Ta21&nZ+=_N^ace9SV~%oPurm{2 z-ABZxEf)NUk=BQUd%Rkf$+S(5xrg{77JJ)Db_CtCi;vmGFu$vsEnYWk!{c6dOKT6_ zcN$q-8_XTeXK17_gzG@k=uS`;=6I^l8kp3VUt@yQQjzMCbV!q* zL`w_F3f3uBUt@w1r2GhCDJ#IbxQI<#_(k=wXfuokc_w2eZ7M^Zemw8@mY19xyu6I| z!-HO8>RL`t14HrC6N8T7nI7+{or+i7)bNCt#roVs-}nrz()G2PSJ!qCxWOxr2WoiC z%eJ$6aNTLNn@U>UB>49RGLVTk!EviTp)u>nO?J=qB|}`!r>`hIwCSGGgA99GwxkXg zj(Tj`BBuFWE*x(%;^7gm_HDt=s)cJ#ZPaA6fqzT0#DMSjw&eBv6$css0?1bn+ph#kHd1b5zr=v>mpmJyPaHbyP>y zHJwfyDB#vXiJ2`}{aWmPqG^K;+Q@eileqOUx_^WoKR*ATqw~nI+4{&FpD jfjoch-client — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

jfjoch-client

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

License Clarification

While this API definition is licensed under GPL-3.0, the GPL copyleft provisions do not apply when this file is used solely to generate OpenAPI clients or when implementing applications that interact with the API. Generated client code and applications using this API definition are not subject to the GPL license requirements and may be distributed under terms of your choosing.

This exception is similar in spirit to the Linux Kernel’s approach to userspace API headers and the GCC Runtime Library Exception. The Linux Kernel developers have explicitly stated that user programs that merely use the kernel interfaces (syscalls, ioctl definitions, etc.) are not derivative works of the kernel and are not subject to the terms of the GPL.

This exception is intended to allow wider use of this API specification without imposing GPL requirements on applications that merely interact with the API, regardless of whether they communicate through network calls or other mechanisms.

This Python package is automatically generated by the OpenAPI Generator project:

  • API version: 1.0.0-rc.144

  • Package version: 1.0.0-rc.144

  • Generator version: 7.20.0

  • Build package: org.openapitools.codegen.languages.PythonClientCodegen

Requirements.

Python 3.9+

Installation & Usage

pip install

If the python package is hosted on a repository, you can install directly using:

pip install git+https://git.psi.ch/jungfraujoch/jungfraujoch.git
+

(you may need to run pip with root permission: sudo pip install git+https://git.psi.ch/jungfraujoch/jungfraujoch.git)

Then import the package:

import jfjoch_client
+

Setuptools

Install via Setuptools.

python setup.py install --user
+

(or sudo python setup.py install to install the package for all users)

Then import the package:

import jfjoch_client
+

Tests

Execute pytest to run the tests.

Getting Started

Please follow the installation procedure and then run the following:


+import jfjoch_client
+from jfjoch_client.rest import ApiException
+from pprint import pprint
+
+# Defining the host is optional and defaults to http://localhost:5232
+# See configuration.py for a list of all supported configuration parameters.
+configuration = jfjoch_client.Configuration(
+    host = "http://localhost:5232"
+)
+
+
+
+# Enter a context with an instance of the API client
+with jfjoch_client.ApiClient(configuration) as api_client:
+    # Create an instance of the API class
+    api_instance = jfjoch_client.DefaultApi(api_client)
+
+    try:
+        # Cancel running data collection
+        api_instance.cancel_post()
+    except ApiException as e:
+        print("Exception when calling DefaultApi->cancel_post: %s\n" % e)
+
+

Documentation for API Endpoints

All URIs are relative to http://localhost:5232

Class

Method

HTTP request

Description

DefaultApi

cancel_post

POST /cancel

Cancel running data collection

DefaultApi

config_azim_int_get

GET /config/azim_int

Get azimuthal integration configuration

DefaultApi

config_azim_int_put

PUT /config/azim_int

Configure azimuthal integration

DefaultApi

config_dark_mask_get

GET /config/dark_mask

Get settings for dark data collection to calculate mask

DefaultApi

config_dark_mask_put

PUT /config/dark_mask

Set configuration for dark data collection to calculate mask

DefaultApi

config_detector_get

GET /config/detector

Get detector configuration

DefaultApi

config_detector_put

PUT /config/detector

Change detector configuration

DefaultApi

config_file_writer_get

GET /config/file_writer

Get file writer settings

DefaultApi

config_file_writer_put

PUT /config/file_writer

Change file writer settings

DefaultApi

config_image_format_conversion_post

POST /config/image_format/conversion

Configure format for data collection with full conversion

DefaultApi

config_image_format_get

GET /config/image_format

Get image output format

DefaultApi

config_image_format_put

PUT /config/image_format

Change image output format

DefaultApi

config_image_format_raw_post

POST /config/image_format/raw

Configure format for raw data collection

DefaultApi

config_indexing_get

GET /config/indexing

Get indexing configuration

DefaultApi

config_indexing_put

PUT /config/indexing

Change indexing algorithm settings

DefaultApi

config_instrument_get

GET /config/instrument

Get instrument metadata

DefaultApi

config_instrument_put

PUT /config/instrument

Change instrument metadata

DefaultApi

config_internal_generator_image_put

PUT /config/internal_generator_image

Load binary image for internal FPGA generator

DefaultApi

config_internal_generator_image_tiff_put

PUT /config/internal_generator_image.tiff

Load TIFF image for internal FPGA generator

DefaultApi

config_mask_get

GET /config/mask

Get mask of the detector (binary)

DefaultApi

config_mask_tiff_get

GET /config/mask.tiff

Get mask of the detector (TIFF)

DefaultApi

config_roi_get

GET /config/roi

Get ROI definitions

DefaultApi

config_roi_put

PUT /config/roi

Upload ROI definitions

DefaultApi

config_select_detector_get

GET /config/select_detector

List available detectors

DefaultApi

config_select_detector_put

PUT /config/select_detector

Select detector

DefaultApi

config_spot_finding_get

GET /config/spot_finding

Get data processing configuration

DefaultApi

config_spot_finding_put

PUT /config/spot_finding

Configure spot finding

DefaultApi

config_user_mask_get

GET /config/user_mask

Detector must be Initialized. Get user mask of the detector (binary)

DefaultApi

config_user_mask_put

PUT /config/user_mask

Upload user mask of the detector (binary)

DefaultApi

config_user_mask_tiff_get

GET /config/user_mask.tiff

Detector must be Initialized. Get user mask of the detector (TIFF)

DefaultApi

config_user_mask_tiff_put

PUT /config/user_mask.tiff

Upload user mask of the detector

DefaultApi

config_zeromq_metadata_get

GET /config/zeromq_metadata

Get ZeroMQ metadata socket settings

DefaultApi

config_zeromq_metadata_put

PUT /config/zeromq_metadata

Set ZeroMQ metadata settings

DefaultApi

config_zeromq_preview_get

GET /config/zeromq_preview

Get ZeroMQ preview settings

DefaultApi

config_zeromq_preview_put

PUT /config/zeromq_preview

Set ZeroMQ preview settings

DefaultApi

deactivate_post

POST /deactivate

Prepare detector to turn off

DefaultApi

detector_status_get

GET /detector/status

Get detector status

DefaultApi

fpga_status_get

GET /fpga_status

Get status of FPGA devices

DefaultApi

image_buffer_clear_post

POST /image_buffer/clear

Clear image buffer

DefaultApi

image_buffer_image_cbor_get

GET /image_buffer/image.cbor

Get image message in CBOR format

DefaultApi

image_buffer_image_jpeg_get

GET /image_buffer/image.jpeg

Get preview image in JPEG format using custom settings

DefaultApi

image_buffer_image_tiff_get

GET /image_buffer/image.tiff

Get preview image in TIFF format

DefaultApi

image_buffer_start_cbor_get

GET /image_buffer/start.cbor

Get Start message in CBOR format

DefaultApi

image_buffer_status_get

GET /image_buffer/status

Get status of the image buffers

DefaultApi

image_pusher_status_get

GET /image_pusher/status

Get status of image pusher

DefaultApi

initialize_post

POST /initialize

Initialize detector and data acquisition

DefaultApi

pedestal_post

POST /pedestal

Collect dark current for the detector

DefaultApi

preview_pedestal_tiff_get

GET /preview/pedestal.tiff

Get pedestal in TIFF format

DefaultApi

preview_plot_bin_get

GET /preview/plot.bin

Generate 1D plot from Jungfraujoch and send in raw binary format. Data are provided as (32-bit) float binary array. This format doesn’t transmit information about X-axis, only values, so it is of limited use for azimuthal integration.

DefaultApi

preview_plot_get

GET /preview/plot

Generate 1D plot from Jungfraujoch

DefaultApi

result_scan_get

GET /result/scan

Get full scan result

DefaultApi

start_post

POST /start

Start detector

DefaultApi

statistics_calibration_get

GET /statistics/calibration

Get calibration statistics

DefaultApi

statistics_data_collection_get

GET /statistics/data_collection

Get data collection statistics

DefaultApi

statistics_get

GET /statistics

Get general statistics

DefaultApi

status_get

GET /status

Get Jungfraujoch status

DefaultApi

trigger_post

POST /trigger

Send soft trigger to the detector

DefaultApi

version_get

GET /version

Get Jungfraujoch version of jfjoch_broker

DefaultApi

wait_till_done_post

POST /wait_till_done

Wait for acquisition done

DefaultApi

wait_until_running_post

POST /wait_until_running

Wait for acquisition running

DefaultApi

xfel_event_code_get

GET /xfel/event_code

Return XFEL event codes for the current data acquisition

DefaultApi

xfel_pulse_id_get

GET /xfel/pulse_id

Return XFEL pulse IDs for the current data acquisition

Documentation For Models

Documentation For Authorization

Endpoints do not require authorization.

Author

filip.leonarski@psi.ch

\ No newline at end of file diff --git a/python_client/docs/AzimIntSettings.html b/python_client/docs/AzimIntSettings.html new file mode 100644 index 00000000..d5e532de --- /dev/null +++ b/python_client/docs/AzimIntSettings.html @@ -0,0 +1,14 @@ + AzimIntSettings — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

AzimIntSettings

Properties

Name

Type

Description

Notes

polarization_corr

bool

Apply polarization correction for azimuthal integration (polarization factor must be configured in dataset settings)

[default to True]

solid_angle_corr

bool

Apply solid angle correction for azimuthal integration

[default to True]

high_q_recip_a

float

low_q_recip_a

float

q_spacing

float

azimuthal_bins

int

Numer of azimuthal (phi) bins; 1 = standard 1D azimuthal integration

[optional] [default to 1]

Example

from jfjoch_client.models.azim_int_settings import AzimIntSettings
+
+# TODO update the JSON string below
+json = "{}"
+# create an instance of AzimIntSettings from a JSON string
+azim_int_settings_instance = AzimIntSettings.from_json(json)
+# print the JSON string representation of the object
+print(AzimIntSettings.to_json())
+
+# convert the object into a dict
+azim_int_settings_dict = azim_int_settings_instance.to_dict()
+# create an instance of AzimIntSettings from a dict
+azim_int_settings_from_dict = AzimIntSettings.from_dict(azim_int_settings_dict)
+

[Back to Model list] [Back to API list] [Back to README]

\ No newline at end of file diff --git a/python_client/docs/BrokerStatus.html b/python_client/docs/BrokerStatus.html new file mode 100644 index 00000000..d4f82f43 --- /dev/null +++ b/python_client/docs/BrokerStatus.html @@ -0,0 +1,14 @@ + BrokerStatus — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

BrokerStatus

Properties

Name

Type

Description

Notes

state

str

progress

float

Progress of data collection (only available if receiving is running)

[optional]

message

str

Message to display besides state of the jfjoch_broker; mostly used for errors and warnings This matters especially for async functions (start/initialize), where API won’t return reason for the error during async operation.

[optional]

message_severity

str

Level of the message to display

[optional] [default to ‘error’]

gpu_count

int

Number of installed GPUs

[optional]

broker_version

str

Version of the jfjoch_broker

[optional]

Example

from jfjoch_client.models.broker_status import BrokerStatus
+
+# TODO update the JSON string below
+json = "{}"
+# create an instance of BrokerStatus from a JSON string
+broker_status_instance = BrokerStatus.from_json(json)
+# print the JSON string representation of the object
+print(BrokerStatus.to_json())
+
+# convert the object into a dict
+broker_status_dict = broker_status_instance.to_dict()
+# create an instance of BrokerStatus from a dict
+broker_status_from_dict = BrokerStatus.from_dict(broker_status_dict)
+

[Back to Model list] [Back to API list] [Back to README]

\ No newline at end of file diff --git a/python_client/docs/CalibrationStatisticsInner.html b/python_client/docs/CalibrationStatisticsInner.html new file mode 100644 index 00000000..5df512ac --- /dev/null +++ b/python_client/docs/CalibrationStatisticsInner.html @@ -0,0 +1,14 @@ + CalibrationStatisticsInner — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

CalibrationStatisticsInner

Properties

Name

Type

Description

Notes

module_number

int

storage_cell_number

int

pedestal_g0_mean

float

pedestal_g1_mean

float

pedestal_g2_mean

float

gain_g0_mean

float

gain_g1_mean

float

gain_g2_mean

float

masked_pixels

int

Example

from jfjoch_client.models.calibration_statistics_inner import CalibrationStatisticsInner
+
+# TODO update the JSON string below
+json = "{}"
+# create an instance of CalibrationStatisticsInner from a JSON string
+calibration_statistics_inner_instance = CalibrationStatisticsInner.from_json(json)
+# print the JSON string representation of the object
+print(CalibrationStatisticsInner.to_json())
+
+# convert the object into a dict
+calibration_statistics_inner_dict = calibration_statistics_inner_instance.to_dict()
+# create an instance of CalibrationStatisticsInner from a dict
+calibration_statistics_inner_from_dict = CalibrationStatisticsInner.from_dict(calibration_statistics_inner_dict)
+

[Back to Model list] [Back to API list] [Back to README]

\ No newline at end of file diff --git a/python_client/docs/ColorScale.html b/python_client/docs/ColorScale.html new file mode 100644 index 00000000..d7138d55 --- /dev/null +++ b/python_client/docs/ColorScale.html @@ -0,0 +1 @@ + ColorScale — Jungfraujoch 1.0.0-rc.144 documentation Skip to content
\ No newline at end of file diff --git a/python_client/docs/DarkMaskSettings.html b/python_client/docs/DarkMaskSettings.html new file mode 100644 index 00000000..f51adcdb --- /dev/null +++ b/python_client/docs/DarkMaskSettings.html @@ -0,0 +1,14 @@ + DarkMaskSettings — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

DarkMaskSettings

Settings for collection of dark images to be used for mask calculation

Properties

Name

Type

Description

Notes

detector_threshold_ke_v

float

Energy threshold for dark image collection

[default to 3.5]

frame_time_us

int

Time between frames for dark image collection

[default to 10000]

number_of_frames

int

Number of frames for dark image collection; zero means no dark collection

[default to 1000]

max_allowed_pixel_count

int

Maximum count in a pixel considered normal (not-masked)

[default to 1]

max_frames_with_signal

int

Maximum number of frames with signal in a pixel considered normal (not-masked)

[default to 10]

Example

from jfjoch_client.models.dark_mask_settings import DarkMaskSettings
+
+# TODO update the JSON string below
+json = "{}"
+# create an instance of DarkMaskSettings from a JSON string
+dark_mask_settings_instance = DarkMaskSettings.from_json(json)
+# print the JSON string representation of the object
+print(DarkMaskSettings.to_json())
+
+# convert the object into a dict
+dark_mask_settings_dict = dark_mask_settings_instance.to_dict()
+# create an instance of DarkMaskSettings from a dict
+dark_mask_settings_from_dict = DarkMaskSettings.from_dict(dark_mask_settings_dict)
+

[Back to Model list] [Back to API list] [Back to README]

\ No newline at end of file diff --git a/python_client/docs/DatasetSettings.html b/python_client/docs/DatasetSettings.html new file mode 100644 index 00000000..6d95b0d7 --- /dev/null +++ b/python_client/docs/DatasetSettings.html @@ -0,0 +1,14 @@ + DatasetSettings — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

DatasetSettings

Properties

Name

Type

Description

Notes

images_per_trigger

int

For standard synchrotron data collection - this is number of images collected per one TTL trigger For XFEL (pulsed source) - this number is ignored and set to 1 For storage cell mode - this number is ignored and set to number of storage cells

[optional] [default to 1]

ntrigger

int

Number of TTL trigger that the detector is expected to receive during data collection

[optional] [default to 1]

image_time_us

int

Image time. If not provided (or zero value) the frame time is assumed as default. For JUNGFRAU image time must be multiple of frame time and max value is 256 * frame_time. In XFEL mode: summation happens for frames collected with multiple triggers. Ignored for storage cells and if raw data are saved.

[optional]

beam_x_pxl

float

/entry/detector/beam_center_x in NXmx Beam center in X direction [pixels]

beam_y_pxl

float

/entry/detector/beam_center_y in NXmx Beam center in X direction [pixels]

detector_distance_mm

float

/entry/detector/distance in NXmx Detector distance [mm]

incident_energy_ke_v

float

Used to calculate /entry/beam/incident_wavelength in NXmx Incident particle (photon, electron) energy in keV

file_prefix

str

Prefix for filenames. If left empty, no file will be saved.

[optional] [default to ‘’]

images_per_file

int

Number of files in a single HDF5 data file (0 = write all images to a single data file).

[optional] [default to 1000]

space_group_number

int

Number of space group for the crystal. Currently used solely as metadata, not relevant for image processing done in Jungfraujoch.

[optional]

sample_name

str

/entry/sample/name in NXmx Sample name

[optional] [default to ‘’]

compression

str

Compression type for the images transferred over ZeroMQ and saved to HDF5 file.

[optional] [default to ‘bslz4’]

total_flux

float

/entry/beam/total_flux in NXmx Flux incident on beam plane in photons per second. In other words this is the flux integrated over area. [photons/s]

[optional]

transmission

float

/entry/instrument/attenuator/attenuator_transmission Transmission of attenuator (filter) [no units]

[optional]

goniometer

RotationAxis

[optional]

grid_scan

GridScan

[optional]

header_appendix

object

Header appendix, added as user_data/user to start ZeroMQ message (can be any valid JSON) In general, it is not saved in HDF5 file. However, if values are placed in &quot;hdf5&quot; object, `jfjoch_writer` will write them in /entry/data of the HDF5 file. This applies solely to string and number (double floating-point). No arrays/sub-objects is allowed. For example {&quot;hdf5&quot;: {&quot;val1&quot;:1, &quot;val2&quot;:&quot;xyz&quot;}}, will write /entry/user/val1 and /entry/user/val2.

[optional]

image_appendix

object

Image appendix, added as user_data to image ZeroMQ message (can be any valid JSON) Not saved in HDF5 file

[optional]

data_reduction_factor_serialmx

float

Rate at which non-indexed images are accepted to be forwarded to writer. Value of 1.0 (default) means that all images are written. Values below zero mean that non-indexed images will be accepted with a given probability.

[optional] [default to 1.0]

pixel_value_low_threshold

int

Set all counts lower than the value to zero. When the value is set, negative numbers other than error pixel value are always set to zero. Setting to zero is equivalent to turning the option off.

[optional]

run_number

int

Number of run within an experimental session. Transferred over CBOR stream as &quot;series ID&quot;, though not saved in HDF5 file. It is highly recommended to keep this number unique for each data collection during experimental series. If not provided, the number will be automatically incremented.

[optional]

run_name

str

Unique ID of run. Transferred over CBOR stream as &quot;unique series ID&quot;, though not saved in HDF5 file. It is highly recommended to keep this name unique for each data collection during experimental series. If not provided, the name will be automatically generated as number + colon + file_prefix.

[optional]

experiment_group

str

Name of group owning the data (e.g. p-group or proposal number). Transferred over CBOR stream, though not saved in HDF5 file.

[optional]

poisson_compression

int

Enable lossy compression of pixel values that preserves Poisson statistics. Requires to provide a numerical factor SQ. Pixel value P will be transformed to round(sqrt(P) * SQ), with rounding to the closest integer. Compression is turned off if the value is missing or it is set to zero.

[optional]

write_nxmx_hdf5_master

bool

Write NXmx formatted HDF5 master file. Recommended to use for macromolecular crystallography experiments and to turn off for other experiments.

[optional] [default to True]

save_calibration

bool

Forward image calibration (at the moment pedestal and pedestal RMS for JUNGFRAU) using the ZeroMQ stream to writer. If parameter is not provided calibration will be saved only if more than 4 images are recorded.

[optional]

polarization_factor

float

Polarization factor for integration; 1.0 is horizontal polarization; -1.0 is vertical polarization

[optional]

ring_current_m_a

float

Ring current at the beginning of the data collection

[optional]

sample_temperature_k

float

Sample temperature in Kelvin

[optional]

poni_rot1_rad

float

PONI angle rot1 (see PyFAI documentation for details) in radians

[optional] [default to 0.0]

poni_rot2_rad

float

PONI angle rot2 (see PyFAI documentation for details) in radians

[optional] [default to 0.0]

poni_rot3_rad

float

PONI angle rot3 (see PyFAI documentation for details) in radians

[optional] [default to 0.0]

unit_cell

UnitCell

[optional]

spot_finding

bool

Enable spot finding and save spots

[optional] [default to True]

max_spot_count

int

Maximum number of spots that are saved/used for indexing; spots with highest intensity are selected

[optional] [default to 250]

detect_ice_rings

bool

Flag spots as ice rings and reduce their effect on indexing

[optional]

async_start

bool

When set to true, `/start` will not wait for detector and Jungfraujoch to be ready for the measurement.

[optional] [default to False]

xray_fluorescence_spectrum

DatasetSettingsXrayFluorescenceSpectrum

[optional]

Example

from jfjoch_client.models.dataset_settings import DatasetSettings
+
+# TODO update the JSON string below
+json = "{}"
+# create an instance of DatasetSettings from a JSON string
+dataset_settings_instance = DatasetSettings.from_json(json)
+# print the JSON string representation of the object
+print(DatasetSettings.to_json())
+
+# convert the object into a dict
+dataset_settings_dict = dataset_settings_instance.to_dict()
+# create an instance of DatasetSettings from a dict
+dataset_settings_from_dict = DatasetSettings.from_dict(dataset_settings_dict)
+

[Back to Model list] [Back to API list] [Back to README]

\ No newline at end of file diff --git a/python_client/docs/DatasetSettingsUnitCell.html b/python_client/docs/DatasetSettingsUnitCell.html new file mode 100644 index 00000000..95a0a3cd --- /dev/null +++ b/python_client/docs/DatasetSettingsUnitCell.html @@ -0,0 +1,14 @@ + DatasetSettingsUnitCell — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

DatasetSettingsUnitCell

Unit cell parameters. Necessary to run indexing. Units of angstrom and degree

Properties

Name

Type

Description

Notes

a

float

b

float

c

float

alpha

float

beta

float

gamma

float

Example

from jfjoch_client.models.dataset_settings_unit_cell import DatasetSettingsUnitCell
+
+# TODO update the JSON string below
+json = "{}"
+# create an instance of DatasetSettingsUnitCell from a JSON string
+dataset_settings_unit_cell_instance = DatasetSettingsUnitCell.from_json(json)
+# print the JSON string representation of the object
+print(DatasetSettingsUnitCell.to_json())
+
+# convert the object into a dict
+dataset_settings_unit_cell_dict = dataset_settings_unit_cell_instance.to_dict()
+# create an instance of DatasetSettingsUnitCell from a dict
+dataset_settings_unit_cell_from_dict = DatasetSettingsUnitCell.from_dict(dataset_settings_unit_cell_dict)
+

[Back to Model list] [Back to API list] [Back to README]

\ No newline at end of file diff --git a/python_client/docs/DatasetSettingsXrayFluorescenceSpectrum.html b/python_client/docs/DatasetSettingsXrayFluorescenceSpectrum.html new file mode 100644 index 00000000..8387ed92 --- /dev/null +++ b/python_client/docs/DatasetSettingsXrayFluorescenceSpectrum.html @@ -0,0 +1,14 @@ + DatasetSettingsXrayFluorescenceSpectrum — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

DatasetSettingsXrayFluorescenceSpectrum

Properties

Name

Type

Description

Notes

energy_e_v

List[float]

X-ray fluorescence scan energy for each measurement point

data

List[float]

X-ray fluorescence scan result in arbitrary units; must be exactly the same length, as energy_eV

Example

from jfjoch_client.models.dataset_settings_xray_fluorescence_spectrum import DatasetSettingsXrayFluorescenceSpectrum
+
+# TODO update the JSON string below
+json = "{}"
+# create an instance of DatasetSettingsXrayFluorescenceSpectrum from a JSON string
+dataset_settings_xray_fluorescence_spectrum_instance = DatasetSettingsXrayFluorescenceSpectrum.from_json(json)
+# print the JSON string representation of the object
+print(DatasetSettingsXrayFluorescenceSpectrum.to_json())
+
+# convert the object into a dict
+dataset_settings_xray_fluorescence_spectrum_dict = dataset_settings_xray_fluorescence_spectrum_instance.to_dict()
+# create an instance of DatasetSettingsXrayFluorescenceSpectrum from a dict
+dataset_settings_xray_fluorescence_spectrum_from_dict = DatasetSettingsXrayFluorescenceSpectrum.from_dict(dataset_settings_xray_fluorescence_spectrum_dict)
+

[Back to Model list] [Back to API list] [Back to README]

\ No newline at end of file diff --git a/python_client/docs/DefaultApi.html b/python_client/docs/DefaultApi.html new file mode 100644 index 00000000..08117b60 --- /dev/null +++ b/python_client/docs/DefaultApi.html @@ -0,0 +1,1450 @@ + jfjoch_client.DefaultApi — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

jfjoch_client.DefaultApi

All URIs are relative to http://localhost:5232

Method

HTTP request

Description

cancel_post

POST /cancel

Cancel running data collection

config_azim_int_get

GET /config/azim_int

Get azimuthal integration configuration

config_azim_int_put

PUT /config/azim_int

Configure azimuthal integration

config_dark_mask_get

GET /config/dark_mask

Get settings for dark data collection to calculate mask

config_dark_mask_put

PUT /config/dark_mask

Set configuration for dark data collection to calculate mask

config_detector_get

GET /config/detector

Get detector configuration

config_detector_put

PUT /config/detector

Change detector configuration

config_file_writer_get

GET /config/file_writer

Get file writer settings

config_file_writer_put

PUT /config/file_writer

Change file writer settings

config_image_format_conversion_post

POST /config/image_format/conversion

Configure format for data collection with full conversion

config_image_format_get

GET /config/image_format

Get image output format

config_image_format_put

PUT /config/image_format

Change image output format

config_image_format_raw_post

POST /config/image_format/raw

Configure format for raw data collection

config_indexing_get

GET /config/indexing

Get indexing configuration

config_indexing_put

PUT /config/indexing

Change indexing algorithm settings

config_instrument_get

GET /config/instrument

Get instrument metadata

config_instrument_put

PUT /config/instrument

Change instrument metadata

config_internal_generator_image_put

PUT /config/internal_generator_image

Load binary image for internal FPGA generator

config_internal_generator_image_tiff_put

PUT /config/internal_generator_image.tiff

Load TIFF image for internal FPGA generator

config_mask_get

GET /config/mask

Get mask of the detector (binary)

config_mask_tiff_get

GET /config/mask.tiff

Get mask of the detector (TIFF)

config_roi_get

GET /config/roi

Get ROI definitions

config_roi_put

PUT /config/roi

Upload ROI definitions

config_select_detector_get

GET /config/select_detector

List available detectors

config_select_detector_put

PUT /config/select_detector

Select detector

config_spot_finding_get

GET /config/spot_finding

Get data processing configuration

config_spot_finding_put

PUT /config/spot_finding

Configure spot finding

config_user_mask_get

GET /config/user_mask

Detector must be Initialized. Get user mask of the detector (binary)

config_user_mask_put

PUT /config/user_mask

Upload user mask of the detector (binary)

config_user_mask_tiff_get

GET /config/user_mask.tiff

Detector must be Initialized. Get user mask of the detector (TIFF)

config_user_mask_tiff_put

PUT /config/user_mask.tiff

Upload user mask of the detector

config_zeromq_metadata_get

GET /config/zeromq_metadata

Get ZeroMQ metadata socket settings

config_zeromq_metadata_put

PUT /config/zeromq_metadata

Set ZeroMQ metadata settings

config_zeromq_preview_get

GET /config/zeromq_preview

Get ZeroMQ preview settings

config_zeromq_preview_put

PUT /config/zeromq_preview

Set ZeroMQ preview settings

deactivate_post

POST /deactivate

Prepare detector to turn off

detector_status_get

GET /detector/status

Get detector status

fpga_status_get

GET /fpga_status

Get status of FPGA devices

image_buffer_clear_post

POST /image_buffer/clear

Clear image buffer

image_buffer_image_cbor_get

GET /image_buffer/image.cbor

Get image message in CBOR format

image_buffer_image_jpeg_get

GET /image_buffer/image.jpeg

Get preview image in JPEG format using custom settings

image_buffer_image_tiff_get

GET /image_buffer/image.tiff

Get preview image in TIFF format

image_buffer_start_cbor_get

GET /image_buffer/start.cbor

Get Start message in CBOR format

image_buffer_status_get

GET /image_buffer/status

Get status of the image buffers

image_pusher_status_get

GET /image_pusher/status

Get status of image pusher

initialize_post

POST /initialize

Initialize detector and data acquisition

pedestal_post

POST /pedestal

Collect dark current for the detector

preview_pedestal_tiff_get

GET /preview/pedestal.tiff

Get pedestal in TIFF format

preview_plot_bin_get

GET /preview/plot.bin

Generate 1D plot from Jungfraujoch and send in raw binary format. Data are provided as (32-bit) float binary array. This format doesn’t transmit information about X-axis, only values, so it is of limited use for azimuthal integration.

preview_plot_get

GET /preview/plot

Generate 1D plot from Jungfraujoch

result_scan_get

GET /result/scan

Get full scan result

start_post

POST /start

Start detector

statistics_calibration_get

GET /statistics/calibration

Get calibration statistics

statistics_data_collection_get

GET /statistics/data_collection

Get data collection statistics

statistics_get

GET /statistics

Get general statistics

status_get

GET /status

Get Jungfraujoch status

trigger_post

POST /trigger

Send soft trigger to the detector

version_get

GET /version

Get Jungfraujoch version of jfjoch_broker

wait_till_done_post

POST /wait_till_done

Wait for acquisition done

wait_until_running_post

POST /wait_until_running

Wait for acquisition running

xfel_event_code_get

GET /xfel/event_code

Return XFEL event codes for the current data acquisition

xfel_pulse_id_get

GET /xfel/pulse_id

Return XFEL pulse IDs for the current data acquisition

cancel_post

cancel_post()

Cancel running data collection

Command will inform FPGA network card to stop pedestal or data collection at the current stage. Any frame that is currently being processed by CPU will be finished and sent to writer. Given the command is making sure to gracefully stop data acquisition and detector, it might take some time to switch back after command finished to Idle state.

If data collection is not running, the command has no effect.

Example

import jfjoch_client
+from jfjoch_client.rest import ApiException
+from pprint import pprint
+
+# Defining the host is optional and defaults to http://localhost:5232
+# See configuration.py for a list of all supported configuration parameters.
+configuration = jfjoch_client.Configuration(
+    host = "http://localhost:5232"
+)
+
+
+# Enter a context with an instance of the API client
+with jfjoch_client.ApiClient(configuration) as api_client:
+    # Create an instance of the API class
+    api_instance = jfjoch_client.DefaultApi(api_client)
+
+    try:
+        # Cancel running data collection
+        api_instance.cancel_post()
+    except Exception as e:
+        print("Exception when calling DefaultApi->cancel_post: %s\n" % e)
+

Parameters

This endpoint does not need any parameter.

Return type

void (empty response body)

Authorization

No authorization required

HTTP request headers

  • Content-Type: Not defined

  • Accept: Not defined

HTTP response details

Status code

Description

Response headers

200

Cancel request sent to FPGAs (or ignored, as data collection is not running)

-

[Back to top] [Back to API list] [Back to Model list] [Back to README]

config_azim_int_get

AzimIntSettings config_azim_int_get()

Get azimuthal integration configuration

Can be done anytime

Example

import jfjoch_client
+from jfjoch_client.models.azim_int_settings import AzimIntSettings
+from jfjoch_client.rest import ApiException
+from pprint import pprint
+
+# Defining the host is optional and defaults to http://localhost:5232
+# See configuration.py for a list of all supported configuration parameters.
+configuration = jfjoch_client.Configuration(
+    host = "http://localhost:5232"
+)
+
+
+# Enter a context with an instance of the API client
+with jfjoch_client.ApiClient(configuration) as api_client:
+    # Create an instance of the API class
+    api_instance = jfjoch_client.DefaultApi(api_client)
+
+    try:
+        # Get azimuthal integration configuration
+        api_response = api_instance.config_azim_int_get()
+        print("The response of DefaultApi->config_azim_int_get:\n")
+        pprint(api_response)
+    except Exception as e:
+        print("Exception when calling DefaultApi->config_azim_int_get: %s\n" % e)
+

Parameters

This endpoint does not need any parameter.

Return type

AzimIntSettings

Authorization

No authorization required

HTTP request headers

  • Content-Type: Not defined

  • Accept: application/json

HTTP response details

Status code

Description

Response headers

200

Everything OK

-

[Back to top] [Back to API list] [Back to Model list] [Back to README]

config_azim_int_put

config_azim_int_put(azim_int_settings=azim_int_settings)

Configure azimuthal integration

Can be done when detector is Inactive or Idle

Example

import jfjoch_client
+from jfjoch_client.models.azim_int_settings import AzimIntSettings
+from jfjoch_client.rest import ApiException
+from pprint import pprint
+
+# Defining the host is optional and defaults to http://localhost:5232
+# See configuration.py for a list of all supported configuration parameters.
+configuration = jfjoch_client.Configuration(
+    host = "http://localhost:5232"
+)
+
+
+# Enter a context with an instance of the API client
+with jfjoch_client.ApiClient(configuration) as api_client:
+    # Create an instance of the API class
+    api_instance = jfjoch_client.DefaultApi(api_client)
+    azim_int_settings = jfjoch_client.AzimIntSettings() # AzimIntSettings |  (optional)
+
+    try:
+        # Configure azimuthal integration
+        api_instance.config_azim_int_put(azim_int_settings=azim_int_settings)
+    except Exception as e:
+        print("Exception when calling DefaultApi->config_azim_int_put: %s\n" % e)
+

Parameters

Name

Type

Description

Notes

azim_int_settings

AzimIntSettings

[optional]

Return type

void (empty response body)

Authorization

No authorization required

HTTP request headers

  • Content-Type: application/json

  • Accept: text/plain, application/json

HTTP response details

Status code

Description

Response headers

200

Everything OK

-

400

Input parsing or validation error

-

500

Error within Jungfraujoch code - see output message.

-

[Back to top] [Back to API list] [Back to Model list] [Back to README]

config_dark_mask_get

DarkMaskSettings config_dark_mask_get()

Get settings for dark data collection to calculate mask

Example

import jfjoch_client
+from jfjoch_client.models.dark_mask_settings import DarkMaskSettings
+from jfjoch_client.rest import ApiException
+from pprint import pprint
+
+# Defining the host is optional and defaults to http://localhost:5232
+# See configuration.py for a list of all supported configuration parameters.
+configuration = jfjoch_client.Configuration(
+    host = "http://localhost:5232"
+)
+
+
+# Enter a context with an instance of the API client
+with jfjoch_client.ApiClient(configuration) as api_client:
+    # Create an instance of the API class
+    api_instance = jfjoch_client.DefaultApi(api_client)
+
+    try:
+        # Get settings for dark data collection to calculate mask
+        api_response = api_instance.config_dark_mask_get()
+        print("The response of DefaultApi->config_dark_mask_get:\n")
+        pprint(api_response)
+    except Exception as e:
+        print("Exception when calling DefaultApi->config_dark_mask_get: %s\n" % e)
+

Parameters

This endpoint does not need any parameter.

Return type

DarkMaskSettings

Authorization

No authorization required

HTTP request headers

  • Content-Type: Not defined

  • Accept: application/json

HTTP response details

Status code

Description

Response headers

200

Everything OK

-

[Back to top] [Back to API list] [Back to Model list] [Back to README]

config_dark_mask_put

config_dark_mask_put(dark_mask_settings=dark_mask_settings)

Set configuration for dark data collection to calculate mask

This is only possible when operating DECTRIS detectors at the moment; it will be also available for PSI EIGER at some point. This can only be done when detector is Idle, Error or Inactive states.

Example

import jfjoch_client
+from jfjoch_client.models.dark_mask_settings import DarkMaskSettings
+from jfjoch_client.rest import ApiException
+from pprint import pprint
+
+# Defining the host is optional and defaults to http://localhost:5232
+# See configuration.py for a list of all supported configuration parameters.
+configuration = jfjoch_client.Configuration(
+    host = "http://localhost:5232"
+)
+
+
+# Enter a context with an instance of the API client
+with jfjoch_client.ApiClient(configuration) as api_client:
+    # Create an instance of the API class
+    api_instance = jfjoch_client.DefaultApi(api_client)
+    dark_mask_settings = jfjoch_client.DarkMaskSettings() # DarkMaskSettings |  (optional)
+
+    try:
+        # Set configuration for dark data collection to calculate mask
+        api_instance.config_dark_mask_put(dark_mask_settings=dark_mask_settings)
+    except Exception as e:
+        print("Exception when calling DefaultApi->config_dark_mask_put: %s\n" % e)
+

Parameters

Name

Type

Description

Notes

dark_mask_settings

DarkMaskSettings

[optional]

Return type

void (empty response body)

Authorization

No authorization required

HTTP request headers

  • Content-Type: application/json

  • Accept: text/plain, application/json

HTTP response details

Status code

Description

Response headers

200

Everything OK

-

400

Input parsing or validation error

-

500

Error within Jungfraujoch code - see output message.

-

[Back to top] [Back to API list] [Back to Model list] [Back to README]

config_detector_get

DetectorSettings config_detector_get()

Get detector configuration

Can be done anytime

Example

import jfjoch_client
+from jfjoch_client.models.detector_settings import DetectorSettings
+from jfjoch_client.rest import ApiException
+from pprint import pprint
+
+# Defining the host is optional and defaults to http://localhost:5232
+# See configuration.py for a list of all supported configuration parameters.
+configuration = jfjoch_client.Configuration(
+    host = "http://localhost:5232"
+)
+
+
+# Enter a context with an instance of the API client
+with jfjoch_client.ApiClient(configuration) as api_client:
+    # Create an instance of the API class
+    api_instance = jfjoch_client.DefaultApi(api_client)
+
+    try:
+        # Get detector configuration
+        api_response = api_instance.config_detector_get()
+        print("The response of DefaultApi->config_detector_get:\n")
+        pprint(api_response)
+    except Exception as e:
+        print("Exception when calling DefaultApi->config_detector_get: %s\n" % e)
+

Parameters

This endpoint does not need any parameter.

Return type

DetectorSettings

Authorization

No authorization required

HTTP request headers

  • Content-Type: Not defined

  • Accept: application/json

HTTP response details

Status code

Description

Response headers

200

Everything OK

-

[Back to top] [Back to API list] [Back to Model list] [Back to README]

config_detector_put

config_detector_put(detector_settings=detector_settings)

Change detector configuration

Detector settings are ones that have effect on calibration, i.e., pedestal has to be collected again after changing these settings. This can only be done when detector is Idle, Error or Inactive states. If detector is in Idle state , pedestal procedure will be executed automatically - there must be no X-rays on the detector during the operation. If detector is in Inactive or Error states, new settings will be saved, but no calibration will be executed.

Example

import jfjoch_client
+from jfjoch_client.models.detector_settings import DetectorSettings
+from jfjoch_client.rest import ApiException
+from pprint import pprint
+
+# Defining the host is optional and defaults to http://localhost:5232
+# See configuration.py for a list of all supported configuration parameters.
+configuration = jfjoch_client.Configuration(
+    host = "http://localhost:5232"
+)
+
+
+# Enter a context with an instance of the API client
+with jfjoch_client.ApiClient(configuration) as api_client:
+    # Create an instance of the API class
+    api_instance = jfjoch_client.DefaultApi(api_client)
+    detector_settings = jfjoch_client.DetectorSettings() # DetectorSettings |  (optional)
+
+    try:
+        # Change detector configuration
+        api_instance.config_detector_put(detector_settings=detector_settings)
+    except Exception as e:
+        print("Exception when calling DefaultApi->config_detector_put: %s\n" % e)
+

Parameters

Name

Type

Description

Notes

detector_settings

DetectorSettings

[optional]

Return type

void (empty response body)

Authorization

No authorization required

HTTP request headers

  • Content-Type: application/json

  • Accept: text/plain, application/json

HTTP response details

Status code

Description

Response headers

200

Everything OK

-

400

Input parsing or validation error

-

500

Error within Jungfraujoch code - see output message.

-

[Back to top] [Back to API list] [Back to Model list] [Back to README]

config_file_writer_get

FileWriterSettings config_file_writer_get()

Get file writer settings

Can be done anytime

Example

import jfjoch_client
+from jfjoch_client.models.file_writer_settings import FileWriterSettings
+from jfjoch_client.rest import ApiException
+from pprint import pprint
+
+# Defining the host is optional and defaults to http://localhost:5232
+# See configuration.py for a list of all supported configuration parameters.
+configuration = jfjoch_client.Configuration(
+    host = "http://localhost:5232"
+)
+
+
+# Enter a context with an instance of the API client
+with jfjoch_client.ApiClient(configuration) as api_client:
+    # Create an instance of the API class
+    api_instance = jfjoch_client.DefaultApi(api_client)
+
+    try:
+        # Get file writer settings
+        api_response = api_instance.config_file_writer_get()
+        print("The response of DefaultApi->config_file_writer_get:\n")
+        pprint(api_response)
+    except Exception as e:
+        print("Exception when calling DefaultApi->config_file_writer_get: %s\n" % e)
+

Parameters

This endpoint does not need any parameter.

Return type

FileWriterSettings

Authorization

No authorization required

HTTP request headers

  • Content-Type: Not defined

  • Accept: application/json

HTTP response details

Status code

Description

Response headers

200

Everything OK

-

[Back to top] [Back to API list] [Back to Model list] [Back to README]

config_file_writer_put

config_file_writer_put(file_writer_settings=file_writer_settings)

Change file writer settings

This can only be done when detector is Idle, Error or Inactive states.

Example

import jfjoch_client
+from jfjoch_client.models.file_writer_settings import FileWriterSettings
+from jfjoch_client.rest import ApiException
+from pprint import pprint
+
+# Defining the host is optional and defaults to http://localhost:5232
+# See configuration.py for a list of all supported configuration parameters.
+configuration = jfjoch_client.Configuration(
+    host = "http://localhost:5232"
+)
+
+
+# Enter a context with an instance of the API client
+with jfjoch_client.ApiClient(configuration) as api_client:
+    # Create an instance of the API class
+    api_instance = jfjoch_client.DefaultApi(api_client)
+    file_writer_settings = jfjoch_client.FileWriterSettings() # FileWriterSettings |  (optional)
+
+    try:
+        # Change file writer settings
+        api_instance.config_file_writer_put(file_writer_settings=file_writer_settings)
+    except Exception as e:
+        print("Exception when calling DefaultApi->config_file_writer_put: %s\n" % e)
+

Parameters

Name

Type

Description

Notes

file_writer_settings

FileWriterSettings

[optional]

Return type

void (empty response body)

Authorization

No authorization required

HTTP request headers

  • Content-Type: application/json

  • Accept: text/plain, application/json

HTTP response details

Status code

Description

Response headers

200

Everything OK

-

400

Input parsing or validation error

-

500

Error within Jungfraujoch code - see output message.

-

[Back to top] [Back to API list] [Back to Model list] [Back to README]

config_image_format_conversion_post

config_image_format_conversion_post()

Configure format for data collection with full conversion

This can only be done when detector is Idle, Error or Inactive states.

Example

import jfjoch_client
+from jfjoch_client.rest import ApiException
+from pprint import pprint
+
+# Defining the host is optional and defaults to http://localhost:5232
+# See configuration.py for a list of all supported configuration parameters.
+configuration = jfjoch_client.Configuration(
+    host = "http://localhost:5232"
+)
+
+
+# Enter a context with an instance of the API client
+with jfjoch_client.ApiClient(configuration) as api_client:
+    # Create an instance of the API class
+    api_instance = jfjoch_client.DefaultApi(api_client)
+
+    try:
+        # Configure format for data collection with full conversion
+        api_instance.config_image_format_conversion_post()
+    except Exception as e:
+        print("Exception when calling DefaultApi->config_image_format_conversion_post: %s\n" % e)
+

Parameters

This endpoint does not need any parameter.

Return type

void (empty response body)

Authorization

No authorization required

HTTP request headers

  • Content-Type: Not defined

  • Accept: application/json

HTTP response details

Status code

Description

Response headers

200

Everything OK

-

500

Error within Jungfraujoch code - see output message.

-

[Back to top] [Back to API list] [Back to Model list] [Back to README]

config_image_format_get

ImageFormatSettings config_image_format_get()

Get image output format

Can be done anytime

Example

import jfjoch_client
+from jfjoch_client.models.image_format_settings import ImageFormatSettings
+from jfjoch_client.rest import ApiException
+from pprint import pprint
+
+# Defining the host is optional and defaults to http://localhost:5232
+# See configuration.py for a list of all supported configuration parameters.
+configuration = jfjoch_client.Configuration(
+    host = "http://localhost:5232"
+)
+
+
+# Enter a context with an instance of the API client
+with jfjoch_client.ApiClient(configuration) as api_client:
+    # Create an instance of the API class
+    api_instance = jfjoch_client.DefaultApi(api_client)
+
+    try:
+        # Get image output format
+        api_response = api_instance.config_image_format_get()
+        print("The response of DefaultApi->config_image_format_get:\n")
+        pprint(api_response)
+    except Exception as e:
+        print("Exception when calling DefaultApi->config_image_format_get: %s\n" % e)
+

Parameters

This endpoint does not need any parameter.

Return type

ImageFormatSettings

Authorization

No authorization required

HTTP request headers

  • Content-Type: Not defined

  • Accept: application/json

HTTP response details

Status code

Description

Response headers

200

Everything OK

-

[Back to top] [Back to API list] [Back to Model list] [Back to README]

config_image_format_put

config_image_format_put(image_format_settings=image_format_settings)

Change image output format

This can only be done when detector is Idle, Error or Inactive states.

Example

import jfjoch_client
+from jfjoch_client.models.image_format_settings import ImageFormatSettings
+from jfjoch_client.rest import ApiException
+from pprint import pprint
+
+# Defining the host is optional and defaults to http://localhost:5232
+# See configuration.py for a list of all supported configuration parameters.
+configuration = jfjoch_client.Configuration(
+    host = "http://localhost:5232"
+)
+
+
+# Enter a context with an instance of the API client
+with jfjoch_client.ApiClient(configuration) as api_client:
+    # Create an instance of the API class
+    api_instance = jfjoch_client.DefaultApi(api_client)
+    image_format_settings = jfjoch_client.ImageFormatSettings() # ImageFormatSettings |  (optional)
+
+    try:
+        # Change image output format
+        api_instance.config_image_format_put(image_format_settings=image_format_settings)
+    except Exception as e:
+        print("Exception when calling DefaultApi->config_image_format_put: %s\n" % e)
+

Parameters

Name

Type

Description

Notes

image_format_settings

ImageFormatSettings

[optional]

Return type

void (empty response body)

Authorization

No authorization required

HTTP request headers

  • Content-Type: application/json

  • Accept: text/plain, application/json

HTTP response details

Status code

Description

Response headers

200

Everything OK

-

400

Input parsing or validation error

-

500

Error within Jungfraujoch code - see output message.

-

[Back to top] [Back to API list] [Back to Model list] [Back to README]

config_image_format_raw_post

config_image_format_raw_post()

Configure format for raw data collection

This can only be done when detector is Idle, Error or Inactive states.

Example

import jfjoch_client
+from jfjoch_client.rest import ApiException
+from pprint import pprint
+
+# Defining the host is optional and defaults to http://localhost:5232
+# See configuration.py for a list of all supported configuration parameters.
+configuration = jfjoch_client.Configuration(
+    host = "http://localhost:5232"
+)
+
+
+# Enter a context with an instance of the API client
+with jfjoch_client.ApiClient(configuration) as api_client:
+    # Create an instance of the API class
+    api_instance = jfjoch_client.DefaultApi(api_client)
+
+    try:
+        # Configure format for raw data collection
+        api_instance.config_image_format_raw_post()
+    except Exception as e:
+        print("Exception when calling DefaultApi->config_image_format_raw_post: %s\n" % e)
+

Parameters

This endpoint does not need any parameter.

Return type

void (empty response body)

Authorization

No authorization required

HTTP request headers

  • Content-Type: Not defined

  • Accept: application/json

HTTP response details

Status code

Description

Response headers

200

Everything OK

-

500

Error within Jungfraujoch code - see output message.

-

[Back to top] [Back to API list] [Back to Model list] [Back to README]

config_indexing_get

IndexingSettings config_indexing_get()

Get indexing configuration

Can be done anytime

Example

import jfjoch_client
+from jfjoch_client.models.indexing_settings import IndexingSettings
+from jfjoch_client.rest import ApiException
+from pprint import pprint
+
+# Defining the host is optional and defaults to http://localhost:5232
+# See configuration.py for a list of all supported configuration parameters.
+configuration = jfjoch_client.Configuration(
+    host = "http://localhost:5232"
+)
+
+
+# Enter a context with an instance of the API client
+with jfjoch_client.ApiClient(configuration) as api_client:
+    # Create an instance of the API class
+    api_instance = jfjoch_client.DefaultApi(api_client)
+
+    try:
+        # Get indexing configuration
+        api_response = api_instance.config_indexing_get()
+        print("The response of DefaultApi->config_indexing_get:\n")
+        pprint(api_response)
+    except Exception as e:
+        print("Exception when calling DefaultApi->config_indexing_get: %s\n" % e)
+

Parameters

This endpoint does not need any parameter.

Return type

IndexingSettings

Authorization

No authorization required

HTTP request headers

  • Content-Type: Not defined

  • Accept: application/json

HTTP response details

Status code

Description

Response headers

200

Everything OK

-

[Back to top] [Back to API list] [Back to Model list] [Back to README]

config_indexing_put

config_indexing_put(indexing_settings=indexing_settings)

Change indexing algorithm settings

This can only be done when detector is Idle, Error or Inactive states.

Example

import jfjoch_client
+from jfjoch_client.models.indexing_settings import IndexingSettings
+from jfjoch_client.rest import ApiException
+from pprint import pprint
+
+# Defining the host is optional and defaults to http://localhost:5232
+# See configuration.py for a list of all supported configuration parameters.
+configuration = jfjoch_client.Configuration(
+    host = "http://localhost:5232"
+)
+
+
+# Enter a context with an instance of the API client
+with jfjoch_client.ApiClient(configuration) as api_client:
+    # Create an instance of the API class
+    api_instance = jfjoch_client.DefaultApi(api_client)
+    indexing_settings = jfjoch_client.IndexingSettings() # IndexingSettings |  (optional)
+
+    try:
+        # Change indexing algorithm settings
+        api_instance.config_indexing_put(indexing_settings=indexing_settings)
+    except Exception as e:
+        print("Exception when calling DefaultApi->config_indexing_put: %s\n" % e)
+

Parameters

Name

Type

Description

Notes

indexing_settings

IndexingSettings

[optional]

Return type

void (empty response body)

Authorization

No authorization required

HTTP request headers

  • Content-Type: application/json

  • Accept: text/plain, application/json

HTTP response details

Status code

Description

Response headers

200

Everything OK

-

400

Input parsing or validation error

-

500

Error within Jungfraujoch code - see output message.

-

[Back to top] [Back to API list] [Back to Model list] [Back to README]

config_instrument_get

InstrumentMetadata config_instrument_get()

Get instrument metadata

Can be done anytime

Example

import jfjoch_client
+from jfjoch_client.models.instrument_metadata import InstrumentMetadata
+from jfjoch_client.rest import ApiException
+from pprint import pprint
+
+# Defining the host is optional and defaults to http://localhost:5232
+# See configuration.py for a list of all supported configuration parameters.
+configuration = jfjoch_client.Configuration(
+    host = "http://localhost:5232"
+)
+
+
+# Enter a context with an instance of the API client
+with jfjoch_client.ApiClient(configuration) as api_client:
+    # Create an instance of the API class
+    api_instance = jfjoch_client.DefaultApi(api_client)
+
+    try:
+        # Get instrument metadata
+        api_response = api_instance.config_instrument_get()
+        print("The response of DefaultApi->config_instrument_get:\n")
+        pprint(api_response)
+    except Exception as e:
+        print("Exception when calling DefaultApi->config_instrument_get: %s\n" % e)
+

Parameters

This endpoint does not need any parameter.

Return type

InstrumentMetadata

Authorization

No authorization required

HTTP request headers

  • Content-Type: Not defined

  • Accept: application/json

HTTP response details

Status code

Description

Response headers

200

Everything OK

-

[Back to top] [Back to API list] [Back to Model list] [Back to README]

config_instrument_put

config_instrument_put(instrument_metadata=instrument_metadata)

Change instrument metadata

This can only be done when detector is Idle, Error or Inactive states.

Example

import jfjoch_client
+from jfjoch_client.models.instrument_metadata import InstrumentMetadata
+from jfjoch_client.rest import ApiException
+from pprint import pprint
+
+# Defining the host is optional and defaults to http://localhost:5232
+# See configuration.py for a list of all supported configuration parameters.
+configuration = jfjoch_client.Configuration(
+    host = "http://localhost:5232"
+)
+
+
+# Enter a context with an instance of the API client
+with jfjoch_client.ApiClient(configuration) as api_client:
+    # Create an instance of the API class
+    api_instance = jfjoch_client.DefaultApi(api_client)
+    instrument_metadata = jfjoch_client.InstrumentMetadata() # InstrumentMetadata |  (optional)
+
+    try:
+        # Change instrument metadata
+        api_instance.config_instrument_put(instrument_metadata=instrument_metadata)
+    except Exception as e:
+        print("Exception when calling DefaultApi->config_instrument_put: %s\n" % e)
+

Parameters

Name

Type

Description

Notes

instrument_metadata

InstrumentMetadata

[optional]

Return type

void (empty response body)

Authorization

No authorization required

HTTP request headers

  • Content-Type: application/json

  • Accept: text/plain, application/json

HTTP response details

Status code

Description

Response headers

200

Everything OK

-

400

Input parsing or validation error

-

500

Error within Jungfraujoch code - see output message.

-

[Back to top] [Back to API list] [Back to Model list] [Back to README]

config_internal_generator_image_put

config_internal_generator_image_put(id=id, body=body)

Load binary image for internal FPGA generator

Load image for internal FPGA generator. This can only happen in Idle state of the detector. Requires binary blob with 16-bit integer numbers of size of detector in raw/converted coordinates (depending on detector settings).

Example

import jfjoch_client
+from jfjoch_client.rest import ApiException
+from pprint import pprint
+
+# Defining the host is optional and defaults to http://localhost:5232
+# See configuration.py for a list of all supported configuration parameters.
+configuration = jfjoch_client.Configuration(
+    host = "http://localhost:5232"
+)
+
+
+# Enter a context with an instance of the API client
+with jfjoch_client.ApiClient(configuration) as api_client:
+    # Create an instance of the API class
+    api_instance = jfjoch_client.DefaultApi(api_client)
+    id = 56 # int | Image id to upload (optional)
+    body = None # bytearray |  (optional)
+
+    try:
+        # Load binary image for internal FPGA generator
+        api_instance.config_internal_generator_image_put(id=id, body=body)
+    except Exception as e:
+        print("Exception when calling DefaultApi->config_internal_generator_image_put: %s\n" % e)
+

Parameters

Name

Type

Description

Notes

id

int

Image id to upload

[optional]

body

bytearray

[optional]

Return type

void (empty response body)

Authorization

No authorization required

HTTP request headers

  • Content-Type: application/octet-stream

  • Accept: text/plain

HTTP response details

Status code

Description

Response headers

200

Everything OK

-

400

Input parsing or validation error

-

[Back to top] [Back to API list] [Back to Model list] [Back to README]

config_internal_generator_image_tiff_put

config_internal_generator_image_tiff_put(id=id, body=body)

Load TIFF image for internal FPGA generator

Load image for internal FPGA generator. This can only happen in Idle state of the detector. Requires TIFF with 16-bit integer numbers of size of detector in raw/converted coordinates (depending on detector settings).

Example

import jfjoch_client
+from jfjoch_client.rest import ApiException
+from pprint import pprint
+
+# Defining the host is optional and defaults to http://localhost:5232
+# See configuration.py for a list of all supported configuration parameters.
+configuration = jfjoch_client.Configuration(
+    host = "http://localhost:5232"
+)
+
+
+# Enter a context with an instance of the API client
+with jfjoch_client.ApiClient(configuration) as api_client:
+    # Create an instance of the API class
+    api_instance = jfjoch_client.DefaultApi(api_client)
+    id = 56 # int | Image ID to upload (optional)
+    body = None # bytearray |  (optional)
+
+    try:
+        # Load TIFF image for internal FPGA generator
+        api_instance.config_internal_generator_image_tiff_put(id=id, body=body)
+    except Exception as e:
+        print("Exception when calling DefaultApi->config_internal_generator_image_tiff_put: %s\n" % e)
+

Parameters

Name

Type

Description

Notes

id

int

Image ID to upload

[optional]

body

bytearray

[optional]

Return type

void (empty response body)

Authorization

No authorization required

HTTP request headers

  • Content-Type: image/tiff

  • Accept: text/plain

HTTP response details

Status code

Description

Response headers

200

Everything OK

-

400

Input parsing or validation error

-

[Back to top] [Back to API list] [Back to Model list] [Back to README]

config_mask_get

bytearray config_mask_get()

Get mask of the detector (binary)

Detector must be Initialized. Get full pixel mask of the detector. See NXmx standard for meaning of pixel values.

Example

import jfjoch_client
+from jfjoch_client.rest import ApiException
+from pprint import pprint
+
+# Defining the host is optional and defaults to http://localhost:5232
+# See configuration.py for a list of all supported configuration parameters.
+configuration = jfjoch_client.Configuration(
+    host = "http://localhost:5232"
+)
+
+
+# Enter a context with an instance of the API client
+with jfjoch_client.ApiClient(configuration) as api_client:
+    # Create an instance of the API class
+    api_instance = jfjoch_client.DefaultApi(api_client)
+
+    try:
+        # Get mask of the detector (binary)
+        api_response = api_instance.config_mask_get()
+        print("The response of DefaultApi->config_mask_get:\n")
+        pprint(api_response)
+    except Exception as e:
+        print("Exception when calling DefaultApi->config_mask_get: %s\n" % e)
+

Parameters

This endpoint does not need any parameter.

Return type

bytearray

Authorization

No authorization required

HTTP request headers

  • Content-Type: Not defined

  • Accept: application/octet-stream

HTTP response details

Status code

Description

Response headers

200

Binary array (4 byte; unsigned)

-

[Back to top] [Back to API list] [Back to Model list] [Back to README]

config_mask_tiff_get

bytearray config_mask_tiff_get()

Get mask of the detector (TIFF)

Should be in Idle state. Get full pixel mask of the detector See NXmx standard for meaning of pixel values

Example

import jfjoch_client
+from jfjoch_client.rest import ApiException
+from pprint import pprint
+
+# Defining the host is optional and defaults to http://localhost:5232
+# See configuration.py for a list of all supported configuration parameters.
+configuration = jfjoch_client.Configuration(
+    host = "http://localhost:5232"
+)
+
+
+# Enter a context with an instance of the API client
+with jfjoch_client.ApiClient(configuration) as api_client:
+    # Create an instance of the API class
+    api_instance = jfjoch_client.DefaultApi(api_client)
+
+    try:
+        # Get mask of the detector (TIFF)
+        api_response = api_instance.config_mask_tiff_get()
+        print("The response of DefaultApi->config_mask_tiff_get:\n")
+        pprint(api_response)
+    except Exception as e:
+        print("Exception when calling DefaultApi->config_mask_tiff_get: %s\n" % e)
+

Parameters

This endpoint does not need any parameter.

Return type

bytearray

Authorization

No authorization required

HTTP request headers

  • Content-Type: Not defined

  • Accept: image/tiff

HTTP response details

Status code

Description

Response headers

200

Pixel mask in TIFF format (4 byte; unsigned)

-

[Back to top] [Back to API list] [Back to Model list] [Back to README]

config_roi_get

RoiDefinitions config_roi_get()

Get ROI definitions

Example

import jfjoch_client
+from jfjoch_client.models.roi_definitions import RoiDefinitions
+from jfjoch_client.rest import ApiException
+from pprint import pprint
+
+# Defining the host is optional and defaults to http://localhost:5232
+# See configuration.py for a list of all supported configuration parameters.
+configuration = jfjoch_client.Configuration(
+    host = "http://localhost:5232"
+)
+
+
+# Enter a context with an instance of the API client
+with jfjoch_client.ApiClient(configuration) as api_client:
+    # Create an instance of the API class
+    api_instance = jfjoch_client.DefaultApi(api_client)
+
+    try:
+        # Get ROI definitions
+        api_response = api_instance.config_roi_get()
+        print("The response of DefaultApi->config_roi_get:\n")
+        pprint(api_response)
+    except Exception as e:
+        print("Exception when calling DefaultApi->config_roi_get: %s\n" % e)
+

Parameters

This endpoint does not need any parameter.

Return type

RoiDefinitions

Authorization

No authorization required

HTTP request headers

  • Content-Type: Not defined

  • Accept: application/json

HTTP response details

Status code

Description

Response headers

200

OK

-

[Back to top] [Back to API list] [Back to Model list] [Back to README]

config_roi_put

config_roi_put(roi_definitions=roi_definitions)

Upload ROI definitions

Example

import jfjoch_client
+from jfjoch_client.models.roi_definitions import RoiDefinitions
+from jfjoch_client.rest import ApiException
+from pprint import pprint
+
+# Defining the host is optional and defaults to http://localhost:5232
+# See configuration.py for a list of all supported configuration parameters.
+configuration = jfjoch_client.Configuration(
+    host = "http://localhost:5232"
+)
+
+
+# Enter a context with an instance of the API client
+with jfjoch_client.ApiClient(configuration) as api_client:
+    # Create an instance of the API class
+    api_instance = jfjoch_client.DefaultApi(api_client)
+    roi_definitions = jfjoch_client.RoiDefinitions() # RoiDefinitions |  (optional)
+
+    try:
+        # Upload ROI definitions
+        api_instance.config_roi_put(roi_definitions=roi_definitions)
+    except Exception as e:
+        print("Exception when calling DefaultApi->config_roi_put: %s\n" % e)
+

Parameters

Name

Type

Description

Notes

roi_definitions

RoiDefinitions

[optional]

Return type

void (empty response body)

Authorization

No authorization required

HTTP request headers

  • Content-Type: application/json

  • Accept: text/plain, application/json

HTTP response details

Status code

Description

Response headers

200

Everything OK

-

400

Input parsing or validation error

-

500

Error within Jungfraujoch code - see output message.

-

[Back to top] [Back to API list] [Back to Model list] [Back to README]

config_select_detector_get

DetectorList config_select_detector_get()

List available detectors

Configured detectors that can be selected by used

Example

import jfjoch_client
+from jfjoch_client.models.detector_list import DetectorList
+from jfjoch_client.rest import ApiException
+from pprint import pprint
+
+# Defining the host is optional and defaults to http://localhost:5232
+# See configuration.py for a list of all supported configuration parameters.
+configuration = jfjoch_client.Configuration(
+    host = "http://localhost:5232"
+)
+
+
+# Enter a context with an instance of the API client
+with jfjoch_client.ApiClient(configuration) as api_client:
+    # Create an instance of the API class
+    api_instance = jfjoch_client.DefaultApi(api_client)
+
+    try:
+        # List available detectors
+        api_response = api_instance.config_select_detector_get()
+        print("The response of DefaultApi->config_select_detector_get:\n")
+        pprint(api_response)
+    except Exception as e:
+        print("Exception when calling DefaultApi->config_select_detector_get: %s\n" % e)
+

Parameters

This endpoint does not need any parameter.

Return type

DetectorList

Authorization

No authorization required

HTTP request headers

  • Content-Type: Not defined

  • Accept: application/json

HTTP response details

Status code

Description

Response headers

200

Everything OK

-

[Back to top] [Back to API list] [Back to Model list] [Back to README]

config_select_detector_put

config_select_detector_put(detector_selection=detector_selection)

Select detector

Jungfraujoch allows to control multiple detectors and/or region-of-interests. The command allows to choose one detector from the list (ID has to be consistent with one provided by GET response). Changing detector will set detector to Inactive state and will require reinitialization.

Example

import jfjoch_client
+from jfjoch_client.models.detector_selection import DetectorSelection
+from jfjoch_client.rest import ApiException
+from pprint import pprint
+
+# Defining the host is optional and defaults to http://localhost:5232
+# See configuration.py for a list of all supported configuration parameters.
+configuration = jfjoch_client.Configuration(
+    host = "http://localhost:5232"
+)
+
+
+# Enter a context with an instance of the API client
+with jfjoch_client.ApiClient(configuration) as api_client:
+    # Create an instance of the API class
+    api_instance = jfjoch_client.DefaultApi(api_client)
+    detector_selection = jfjoch_client.DetectorSelection() # DetectorSelection |  (optional)
+
+    try:
+        # Select detector
+        api_instance.config_select_detector_put(detector_selection=detector_selection)
+    except Exception as e:
+        print("Exception when calling DefaultApi->config_select_detector_put: %s\n" % e)
+

Parameters

Name

Type

Description

Notes

detector_selection

DetectorSelection

[optional]

Return type

void (empty response body)

Authorization

No authorization required

HTTP request headers

  • Content-Type: application/json

  • Accept: text/plain, application/json

HTTP response details

Status code

Description

Response headers

200

Everything OK

-

400

Input parsing or validation error

-

500

Error within Jungfraujoch code - see output message.

-

[Back to top] [Back to API list] [Back to Model list] [Back to README]

config_spot_finding_get

SpotFindingSettings config_spot_finding_get()

Get data processing configuration

Can be done anytime

Example

import jfjoch_client
+from jfjoch_client.models.spot_finding_settings import SpotFindingSettings
+from jfjoch_client.rest import ApiException
+from pprint import pprint
+
+# Defining the host is optional and defaults to http://localhost:5232
+# See configuration.py for a list of all supported configuration parameters.
+configuration = jfjoch_client.Configuration(
+    host = "http://localhost:5232"
+)
+
+
+# Enter a context with an instance of the API client
+with jfjoch_client.ApiClient(configuration) as api_client:
+    # Create an instance of the API class
+    api_instance = jfjoch_client.DefaultApi(api_client)
+
+    try:
+        # Get data processing configuration
+        api_response = api_instance.config_spot_finding_get()
+        print("The response of DefaultApi->config_spot_finding_get:\n")
+        pprint(api_response)
+    except Exception as e:
+        print("Exception when calling DefaultApi->config_spot_finding_get: %s\n" % e)
+

Parameters

This endpoint does not need any parameter.

Return type

SpotFindingSettings

Authorization

No authorization required

HTTP request headers

  • Content-Type: Not defined

  • Accept: application/json

HTTP response details

Status code

Description

Response headers

200

Everything OK

-

[Back to top] [Back to API list] [Back to Model list] [Back to README]

config_spot_finding_put

config_spot_finding_put(spot_finding_settings=spot_finding_settings)

Configure spot finding

Can be done anytime, also while data collection is running

Example

import jfjoch_client
+from jfjoch_client.models.spot_finding_settings import SpotFindingSettings
+from jfjoch_client.rest import ApiException
+from pprint import pprint
+
+# Defining the host is optional and defaults to http://localhost:5232
+# See configuration.py for a list of all supported configuration parameters.
+configuration = jfjoch_client.Configuration(
+    host = "http://localhost:5232"
+)
+
+
+# Enter a context with an instance of the API client
+with jfjoch_client.ApiClient(configuration) as api_client:
+    # Create an instance of the API class
+    api_instance = jfjoch_client.DefaultApi(api_client)
+    spot_finding_settings = jfjoch_client.SpotFindingSettings() # SpotFindingSettings |  (optional)
+
+    try:
+        # Configure spot finding
+        api_instance.config_spot_finding_put(spot_finding_settings=spot_finding_settings)
+    except Exception as e:
+        print("Exception when calling DefaultApi->config_spot_finding_put: %s\n" % e)
+

Parameters

Name

Type

Description

Notes

spot_finding_settings

SpotFindingSettings

[optional]

Return type

void (empty response body)

Authorization

No authorization required

HTTP request headers

  • Content-Type: application/json

  • Accept: text/plain

HTTP response details

Status code

Description

Response headers

200

Everything OK

-

400

Input parsing or validation error

-

[Back to top] [Back to API list] [Back to Model list] [Back to README]

config_user_mask_get

bytearray config_user_mask_get()

Detector must be Initialized. Get user mask of the detector (binary)

Get user pixel mask of the detector in the actual detector coordinates: 0 - good pixel, 1 - masked

Example

import jfjoch_client
+from jfjoch_client.rest import ApiException
+from pprint import pprint
+
+# Defining the host is optional and defaults to http://localhost:5232
+# See configuration.py for a list of all supported configuration parameters.
+configuration = jfjoch_client.Configuration(
+    host = "http://localhost:5232"
+)
+
+
+# Enter a context with an instance of the API client
+with jfjoch_client.ApiClient(configuration) as api_client:
+    # Create an instance of the API class
+    api_instance = jfjoch_client.DefaultApi(api_client)
+
+    try:
+        # Detector must be Initialized. Get user mask of the detector (binary) 
+        api_response = api_instance.config_user_mask_get()
+        print("The response of DefaultApi->config_user_mask_get:\n")
+        pprint(api_response)
+    except Exception as e:
+        print("Exception when calling DefaultApi->config_user_mask_get: %s\n" % e)
+

Parameters

This endpoint does not need any parameter.

Return type

bytearray

Authorization

No authorization required

HTTP request headers

  • Content-Type: Not defined

  • Accept: application/octet-stream

HTTP response details

Status code

Description

Response headers

200

User mask in binary format (4 byte; unsigned)

-

[Back to top] [Back to API list] [Back to Model list] [Back to README]

config_user_mask_put

config_user_mask_put(body=body)

Upload user mask of the detector (binary)

Should be in Idle state. Upload user mask of the detector - this is for example to account for beam stop shadow or misbehaving regions. If detector is conversion mode the mask can be both in raw (1024x512; stacked modules) or converted coordinates. In the latter case - module gaps are ignored and don’t need to be assigned value. Mask is expected as binary array (4-byte; unsigned). 0 - good pixel, other value - masked User mask is stored in NXmx pixel mask (bit 8), as well as used in spot finding and azimuthal integration.

Example

import jfjoch_client
+from jfjoch_client.rest import ApiException
+from pprint import pprint
+
+# Defining the host is optional and defaults to http://localhost:5232
+# See configuration.py for a list of all supported configuration parameters.
+configuration = jfjoch_client.Configuration(
+    host = "http://localhost:5232"
+)
+
+
+# Enter a context with an instance of the API client
+with jfjoch_client.ApiClient(configuration) as api_client:
+    # Create an instance of the API class
+    api_instance = jfjoch_client.DefaultApi(api_client)
+    body = None # bytearray |  (optional)
+
+    try:
+        # Upload user mask of the detector (binary)
+        api_instance.config_user_mask_put(body=body)
+    except Exception as e:
+        print("Exception when calling DefaultApi->config_user_mask_put: %s\n" % e)
+

Parameters

Name

Type

Description

Notes

body

bytearray

[optional]

Return type

void (empty response body)

Authorization

No authorization required

HTTP request headers

  • Content-Type: application/octet-stream

  • Accept: application/json

HTTP response details

Status code

Description

Response headers

200

All good

-

400

Mask is not 4-byte unsigned integer array or empty body

-

500

Error within Jungfraujoch code - see output message.

-

[Back to top] [Back to API list] [Back to Model list] [Back to README]

config_user_mask_tiff_get

bytearray config_user_mask_tiff_get()

Detector must be Initialized. Get user mask of the detector (TIFF)

Get user pixel mask of the detector in the actual detector coordinates: 0 - good pixel, 1 - masked

Example

import jfjoch_client
+from jfjoch_client.rest import ApiException
+from pprint import pprint
+
+# Defining the host is optional and defaults to http://localhost:5232
+# See configuration.py for a list of all supported configuration parameters.
+configuration = jfjoch_client.Configuration(
+    host = "http://localhost:5232"
+)
+
+
+# Enter a context with an instance of the API client
+with jfjoch_client.ApiClient(configuration) as api_client:
+    # Create an instance of the API class
+    api_instance = jfjoch_client.DefaultApi(api_client)
+
+    try:
+        # Detector must be Initialized. Get user mask of the detector (TIFF) 
+        api_response = api_instance.config_user_mask_tiff_get()
+        print("The response of DefaultApi->config_user_mask_tiff_get:\n")
+        pprint(api_response)
+    except Exception as e:
+        print("Exception when calling DefaultApi->config_user_mask_tiff_get: %s\n" % e)
+

Parameters

This endpoint does not need any parameter.

Return type

bytearray

Authorization

No authorization required

HTTP request headers

  • Content-Type: Not defined

  • Accept: image/tiff

HTTP response details

Status code

Description

Response headers

200

User mask in TIFF format (4 byte; unsigned)

-

[Back to top] [Back to API list] [Back to Model list] [Back to README]

config_user_mask_tiff_put

config_user_mask_tiff_put(body=body)

Upload user mask of the detector

Should be in Idle state. Upload user mask of the detector - this is for example to account for beam stop shadow or misbehaving regions. If detector is conversion mode the mask can be both in raw (1024x512; stacked modules) or converted coordinates. In the latter case - module gaps are ignored and don’t need to be assigned value. Mask is expected as TIFF (4-byte; unsigned). 0 - good pixel, other value - masked User mask is stored in NXmx pixel mask (bit 8), as well as used in spot finding and azimuthal integration. User mask is not automatically applied - i.e. pixels with user mask will have a valid pixel value in the images.

Example

import jfjoch_client
+from jfjoch_client.rest import ApiException
+from pprint import pprint
+
+# Defining the host is optional and defaults to http://localhost:5232
+# See configuration.py for a list of all supported configuration parameters.
+configuration = jfjoch_client.Configuration(
+    host = "http://localhost:5232"
+)
+
+
+# Enter a context with an instance of the API client
+with jfjoch_client.ApiClient(configuration) as api_client:
+    # Create an instance of the API class
+    api_instance = jfjoch_client.DefaultApi(api_client)
+    body = None # bytearray |  (optional)
+
+    try:
+        # Upload user mask of the detector
+        api_instance.config_user_mask_tiff_put(body=body)
+    except Exception as e:
+        print("Exception when calling DefaultApi->config_user_mask_tiff_put: %s\n" % e)
+

Parameters

Name

Type

Description

Notes

body

bytearray

[optional]

Return type

void (empty response body)

Authorization

No authorization required

HTTP request headers

  • Content-Type: image/tiff

  • Accept: application/json

HTTP response details

Status code

Description

Response headers

200

All good

-

500

Error within Jungfraujoch code - see output message.

-

[Back to top] [Back to API list] [Back to Model list] [Back to README]

config_zeromq_metadata_get

ZeromqMetadataSettings config_zeromq_metadata_get()

Get ZeroMQ metadata socket settings

Example

import jfjoch_client
+from jfjoch_client.models.zeromq_metadata_settings import ZeromqMetadataSettings
+from jfjoch_client.rest import ApiException
+from pprint import pprint
+
+# Defining the host is optional and defaults to http://localhost:5232
+# See configuration.py for a list of all supported configuration parameters.
+configuration = jfjoch_client.Configuration(
+    host = "http://localhost:5232"
+)
+
+
+# Enter a context with an instance of the API client
+with jfjoch_client.ApiClient(configuration) as api_client:
+    # Create an instance of the API class
+    api_instance = jfjoch_client.DefaultApi(api_client)
+
+    try:
+        # Get ZeroMQ metadata socket settings
+        api_response = api_instance.config_zeromq_metadata_get()
+        print("The response of DefaultApi->config_zeromq_metadata_get:\n")
+        pprint(api_response)
+    except Exception as e:
+        print("Exception when calling DefaultApi->config_zeromq_metadata_get: %s\n" % e)
+

Parameters

This endpoint does not need any parameter.

Return type

ZeromqMetadataSettings

Authorization

No authorization required

HTTP request headers

  • Content-Type: Not defined

  • Accept: application/json

HTTP response details

Status code

Description

Response headers

200

Everything OK

-

[Back to top] [Back to API list] [Back to Model list] [Back to README]

config_zeromq_metadata_put

config_zeromq_metadata_put(zeromq_metadata_settings=zeromq_metadata_settings)

Set ZeroMQ metadata settings

Jungfraujoch can generate metadata message stream on ZeroMQ PUB socket. This stream covers all images. Here settings of the socket can be adjusted. While the data structure contains also socket_address, this cannot be changed via HTTP and is ignore in PUT request.

Example

import jfjoch_client
+from jfjoch_client.models.zeromq_metadata_settings import ZeromqMetadataSettings
+from jfjoch_client.rest import ApiException
+from pprint import pprint
+
+# Defining the host is optional and defaults to http://localhost:5232
+# See configuration.py for a list of all supported configuration parameters.
+configuration = jfjoch_client.Configuration(
+    host = "http://localhost:5232"
+)
+
+
+# Enter a context with an instance of the API client
+with jfjoch_client.ApiClient(configuration) as api_client:
+    # Create an instance of the API class
+    api_instance = jfjoch_client.DefaultApi(api_client)
+    zeromq_metadata_settings = jfjoch_client.ZeromqMetadataSettings() # ZeromqMetadataSettings |  (optional)
+
+    try:
+        # Set ZeroMQ metadata settings
+        api_instance.config_zeromq_metadata_put(zeromq_metadata_settings=zeromq_metadata_settings)
+    except Exception as e:
+        print("Exception when calling DefaultApi->config_zeromq_metadata_put: %s\n" % e)
+

Parameters

Name

Type

Description

Notes

zeromq_metadata_settings

ZeromqMetadataSettings

[optional]

Return type

void (empty response body)

Authorization

No authorization required

HTTP request headers

  • Content-Type: application/json

  • Accept: text/plain, application/json

HTTP response details

Status code

Description

Response headers

200

Everything OK

-

400

Input parsing or validation error

-

500

Error within Jungfraujoch code - see output message.

-

[Back to top] [Back to API list] [Back to Model list] [Back to README]

config_zeromq_preview_get

ZeromqPreviewSettings config_zeromq_preview_get()

Get ZeroMQ preview settings

Example

import jfjoch_client
+from jfjoch_client.models.zeromq_preview_settings import ZeromqPreviewSettings
+from jfjoch_client.rest import ApiException
+from pprint import pprint
+
+# Defining the host is optional and defaults to http://localhost:5232
+# See configuration.py for a list of all supported configuration parameters.
+configuration = jfjoch_client.Configuration(
+    host = "http://localhost:5232"
+)
+
+
+# Enter a context with an instance of the API client
+with jfjoch_client.ApiClient(configuration) as api_client:
+    # Create an instance of the API class
+    api_instance = jfjoch_client.DefaultApi(api_client)
+
+    try:
+        # Get ZeroMQ preview settings
+        api_response = api_instance.config_zeromq_preview_get()
+        print("The response of DefaultApi->config_zeromq_preview_get:\n")
+        pprint(api_response)
+    except Exception as e:
+        print("Exception when calling DefaultApi->config_zeromq_preview_get: %s\n" % e)
+

Parameters

This endpoint does not need any parameter.

Return type

ZeromqPreviewSettings

Authorization

No authorization required

HTTP request headers

  • Content-Type: Not defined

  • Accept: application/json

HTTP response details

Status code

Description

Response headers

200

Everything OK

-

[Back to top] [Back to API list] [Back to Model list] [Back to README]

config_zeromq_preview_put

config_zeromq_preview_put(zeromq_preview_settings=zeromq_preview_settings)

Set ZeroMQ preview settings

Jungfraujoch can generate preview message stream on ZeroMQ SUB socket. Here settings of the socket can be adjusted. While the data structure contains also socket_address, this cannot be changed via HTTP and is ignore in PUT request. Options set with this PUT request have no effect on HTTP based preview.

Example

import jfjoch_client
+from jfjoch_client.models.zeromq_preview_settings import ZeromqPreviewSettings
+from jfjoch_client.rest import ApiException
+from pprint import pprint
+
+# Defining the host is optional and defaults to http://localhost:5232
+# See configuration.py for a list of all supported configuration parameters.
+configuration = jfjoch_client.Configuration(
+    host = "http://localhost:5232"
+)
+
+
+# Enter a context with an instance of the API client
+with jfjoch_client.ApiClient(configuration) as api_client:
+    # Create an instance of the API class
+    api_instance = jfjoch_client.DefaultApi(api_client)
+    zeromq_preview_settings = jfjoch_client.ZeromqPreviewSettings() # ZeromqPreviewSettings |  (optional)
+
+    try:
+        # Set ZeroMQ preview settings
+        api_instance.config_zeromq_preview_put(zeromq_preview_settings=zeromq_preview_settings)
+    except Exception as e:
+        print("Exception when calling DefaultApi->config_zeromq_preview_put: %s\n" % e)
+

Parameters

Name

Type

Description

Notes

zeromq_preview_settings

ZeromqPreviewSettings

[optional]

Return type

void (empty response body)

Authorization

No authorization required

HTTP request headers

  • Content-Type: application/json

  • Accept: text/plain, application/json

HTTP response details

Status code

Description

Response headers

200

Everything OK

-

400

Input parsing or validation error

-

500

Error within Jungfraujoch code - see output message.

-

[Back to top] [Back to API list] [Back to Model list] [Back to README]

deactivate_post

deactivate_post()

Prepare detector to turn off

Should be in Idle or Error state. Command deactivates data acquisition and turns off detector high voltage and ASIC. Should be used always before turning off power from the detector.

Example

import jfjoch_client
+from jfjoch_client.rest import ApiException
+from pprint import pprint
+
+# Defining the host is optional and defaults to http://localhost:5232
+# See configuration.py for a list of all supported configuration parameters.
+configuration = jfjoch_client.Configuration(
+    host = "http://localhost:5232"
+)
+
+
+# Enter a context with an instance of the API client
+with jfjoch_client.ApiClient(configuration) as api_client:
+    # Create an instance of the API class
+    api_instance = jfjoch_client.DefaultApi(api_client)
+
+    try:
+        # Prepare detector to turn off
+        api_instance.deactivate_post()
+    except Exception as e:
+        print("Exception when calling DefaultApi->deactivate_post: %s\n" % e)
+

Parameters

This endpoint does not need any parameter.

Return type

void (empty response body)

Authorization

No authorization required

HTTP request headers

  • Content-Type: Not defined

  • Accept: application/json

HTTP response details

Status code

Description

Response headers

200

Detector ready to turn off

-

500

Error within Jungfraujoch code - see output message.

-

[Back to top] [Back to API list] [Back to Model list] [Back to README]

detector_status_get

DetectorStatus detector_status_get()

Get detector status

Status of the JUNGFRAU detector

Example

import jfjoch_client
+from jfjoch_client.models.detector_status import DetectorStatus
+from jfjoch_client.rest import ApiException
+from pprint import pprint
+
+# Defining the host is optional and defaults to http://localhost:5232
+# See configuration.py for a list of all supported configuration parameters.
+configuration = jfjoch_client.Configuration(
+    host = "http://localhost:5232"
+)
+
+
+# Enter a context with an instance of the API client
+with jfjoch_client.ApiClient(configuration) as api_client:
+    # Create an instance of the API class
+    api_instance = jfjoch_client.DefaultApi(api_client)
+
+    try:
+        # Get detector status
+        api_response = api_instance.detector_status_get()
+        print("The response of DefaultApi->detector_status_get:\n")
+        pprint(api_response)
+    except Exception as e:
+        print("Exception when calling DefaultApi->detector_status_get: %s\n" % e)
+

Parameters

This endpoint does not need any parameter.

Return type

DetectorStatus

Authorization

No authorization required

HTTP request headers

  • Content-Type: Not defined

  • Accept: application/json, text/plain

HTTP response details

Status code

Description

Response headers

200

Everything OK

-

404

Running in &quot;simulator&quot; mode - no detector present

-

500

Error encountered when trying to read status

-

[Back to top] [Back to API list] [Back to Model list] [Back to README]

fpga_status_get

List[FpgaStatusInner] fpga_status_get()

Get status of FPGA devices

Example

import jfjoch_client
+from jfjoch_client.models.fpga_status_inner import FpgaStatusInner
+from jfjoch_client.rest import ApiException
+from pprint import pprint
+
+# Defining the host is optional and defaults to http://localhost:5232
+# See configuration.py for a list of all supported configuration parameters.
+configuration = jfjoch_client.Configuration(
+    host = "http://localhost:5232"
+)
+
+
+# Enter a context with an instance of the API client
+with jfjoch_client.ApiClient(configuration) as api_client:
+    # Create an instance of the API class
+    api_instance = jfjoch_client.DefaultApi(api_client)
+
+    try:
+        # Get status of FPGA devices
+        api_response = api_instance.fpga_status_get()
+        print("The response of DefaultApi->fpga_status_get:\n")
+        pprint(api_response)
+    except Exception as e:
+        print("Exception when calling DefaultApi->fpga_status_get: %s\n" % e)
+

Parameters

This endpoint does not need any parameter.

Return type

List[FpgaStatusInner]

Authorization

No authorization required

HTTP request headers

  • Content-Type: Not defined

  • Accept: application/json

HTTP response details

Status code

Description

Response headers

200

Everything OK

-

[Back to top] [Back to API list] [Back to Model list] [Back to README]

image_buffer_clear_post

image_buffer_clear_post()

Clear image buffer

Turns off image buffer for the last data collection. Can be only run when Jungfraujoch is not collecting data.

Example

import jfjoch_client
+from jfjoch_client.rest import ApiException
+from pprint import pprint
+
+# Defining the host is optional and defaults to http://localhost:5232
+# See configuration.py for a list of all supported configuration parameters.
+configuration = jfjoch_client.Configuration(
+    host = "http://localhost:5232"
+)
+
+
+# Enter a context with an instance of the API client
+with jfjoch_client.ApiClient(configuration) as api_client:
+    # Create an instance of the API class
+    api_instance = jfjoch_client.DefaultApi(api_client)
+
+    try:
+        # Clear image buffer
+        api_instance.image_buffer_clear_post()
+    except Exception as e:
+        print("Exception when calling DefaultApi->image_buffer_clear_post: %s\n" % e)
+

Parameters

This endpoint does not need any parameter.

Return type

void (empty response body)

Authorization

No authorization required

HTTP request headers

  • Content-Type: Not defined

  • Accept: application/json

HTTP response details

Status code

Description

Response headers

200

Done

-

500

Error within Jungfraujoch code - see output message.

-

[Back to top] [Back to API list] [Back to Model list] [Back to README]

image_buffer_image_cbor_get

bytearray image_buffer_image_cbor_get(id=id)

Get image message in CBOR format

Contains full image data and metadata. The image must come from the latest data collection.

Example

import jfjoch_client
+from jfjoch_client.rest import ApiException
+from pprint import pprint
+
+# Defining the host is optional and defaults to http://localhost:5232
+# See configuration.py for a list of all supported configuration parameters.
+configuration = jfjoch_client.Configuration(
+    host = "http://localhost:5232"
+)
+
+
+# Enter a context with an instance of the API client
+with jfjoch_client.ApiClient(configuration) as api_client:
+    # Create an instance of the API class
+    api_instance = jfjoch_client.DefaultApi(api_client)
+    id = -1 # int | Image ID in the image buffer. Special values: -1 - last image in the buffer, -2: last indexed image in the buffer (optional) (default to -1)
+
+    try:
+        # Get image message in CBOR format
+        api_response = api_instance.image_buffer_image_cbor_get(id=id)
+        print("The response of DefaultApi->image_buffer_image_cbor_get:\n")
+        pprint(api_response)
+    except Exception as e:
+        print("Exception when calling DefaultApi->image_buffer_image_cbor_get: %s\n" % e)
+

Parameters

Name

Type

Description

Notes

id

int

Image ID in the image buffer. Special values: -1 - last image in the buffer, -2: last indexed image in the buffer

[optional] [default to -1]

Return type

bytearray

Authorization

No authorization required

HTTP request headers

  • Content-Type: Not defined

  • Accept: application/cbor, application/json

HTTP response details

Status code

Description

Response headers

200

Return image message

-

404

Image not present in the buffer - either not yet measured or already replaced by a next image.

-

500

Error within Jungfraujoch code - see output message.

-

[Back to top] [Back to API list] [Back to Model list] [Back to README]

image_buffer_image_jpeg_get

bytearray image_buffer_image_jpeg_get(id=id, show_user_mask=show_user_mask, show_roi=show_roi, show_spots=show_spots, show_beam_center=show_beam_center, saturation=saturation, jpeg_quality=jpeg_quality, show_res_ring=show_res_ring, color=color, show_res_est=show_res_est)

Get preview image in JPEG format using custom settings

Example

import jfjoch_client
+from jfjoch_client.rest import ApiException
+from pprint import pprint
+
+# Defining the host is optional and defaults to http://localhost:5232
+# See configuration.py for a list of all supported configuration parameters.
+configuration = jfjoch_client.Configuration(
+    host = "http://localhost:5232"
+)
+
+
+# Enter a context with an instance of the API client
+with jfjoch_client.ApiClient(configuration) as api_client:
+    # Create an instance of the API class
+    api_instance = jfjoch_client.DefaultApi(api_client)
+    id = -1 # int | Image ID in the image buffer. Special values: -1 - last image in the buffer, -2: last indexed image in the buffer (optional) (default to -1)
+    show_user_mask = False # bool | Show user mask (optional) (default to False)
+    show_roi = False # bool | Show ROI areas on the image (optional) (default to False)
+    show_spots = True # bool | Show spot finding results on the image (optional) (default to True)
+    show_beam_center = True # bool | Show beam center on the image (optional) (default to True)
+    saturation = 3.4 # float | Saturation value to set contrast in the preview image; if not provided, then autocontrast procedure is used (optional)
+    jpeg_quality = 100 # int | Quality of JPEG image (100 - highest; 0 - lowest) (optional) (default to 100)
+    show_res_ring = 0.1 # float | Show resolution ring, provided in Angstrom (optional) (default to 0.1)
+    color = indigo # str | Color scale for preview image (optional) (default to indigo)
+    show_res_est = False # bool | Show resolution estimation as a ring (optional) (default to False)
+
+    try:
+        # Get preview image in JPEG format using custom settings
+        api_response = api_instance.image_buffer_image_jpeg_get(id=id, show_user_mask=show_user_mask, show_roi=show_roi, show_spots=show_spots, show_beam_center=show_beam_center, saturation=saturation, jpeg_quality=jpeg_quality, show_res_ring=show_res_ring, color=color, show_res_est=show_res_est)
+        print("The response of DefaultApi->image_buffer_image_jpeg_get:\n")
+        pprint(api_response)
+    except Exception as e:
+        print("Exception when calling DefaultApi->image_buffer_image_jpeg_get: %s\n" % e)
+

Parameters

Name

Type

Description

Notes

id

int

Image ID in the image buffer. Special values: -1 - last image in the buffer, -2: last indexed image in the buffer

[optional] [default to -1]

show_user_mask

bool

Show user mask

[optional] [default to False]

show_roi

bool

Show ROI areas on the image

[optional] [default to False]

show_spots

bool

Show spot finding results on the image

[optional] [default to True]

show_beam_center

bool

Show beam center on the image

[optional] [default to True]

saturation

float

Saturation value to set contrast in the preview image; if not provided, then autocontrast procedure is used

[optional]

jpeg_quality

int

Quality of JPEG image (100 - highest; 0 - lowest)

[optional] [default to 100]

show_res_ring

float

Show resolution ring, provided in Angstrom

[optional] [default to 0.1]

color

str

Color scale for preview image

[optional] [default to indigo]

show_res_est

bool

Show resolution estimation as a ring

[optional] [default to False]

Return type

bytearray

Authorization

No authorization required

HTTP request headers

  • Content-Type: Not defined

  • Accept: image/jpeg, text/plain, application/json

HTTP response details

Status code

Description

Response headers

200

Preview image

-

404

Image not present in the buffer - either not yet measured or already replaced by a next image.

-

400

Input parsing or validation error

-

500

Error within Jungfraujoch code - see output message.

-

[Back to top] [Back to API list] [Back to Model list] [Back to README]

image_buffer_image_tiff_get

bytearray image_buffer_image_tiff_get(id=id)

Get preview image in TIFF format

Example

import jfjoch_client
+from jfjoch_client.rest import ApiException
+from pprint import pprint
+
+# Defining the host is optional and defaults to http://localhost:5232
+# See configuration.py for a list of all supported configuration parameters.
+configuration = jfjoch_client.Configuration(
+    host = "http://localhost:5232"
+)
+
+
+# Enter a context with an instance of the API client
+with jfjoch_client.ApiClient(configuration) as api_client:
+    # Create an instance of the API class
+    api_instance = jfjoch_client.DefaultApi(api_client)
+    id = -1 # int | Image ID in the image buffer. Special values: -1 - last image in the buffer, -2: last indexed image in the buffer (optional) (default to -1)
+
+    try:
+        # Get preview image in TIFF format
+        api_response = api_instance.image_buffer_image_tiff_get(id=id)
+        print("The response of DefaultApi->image_buffer_image_tiff_get:\n")
+        pprint(api_response)
+    except Exception as e:
+        print("Exception when calling DefaultApi->image_buffer_image_tiff_get: %s\n" % e)
+

Parameters

Name

Type

Description

Notes

id

int

Image ID in the image buffer. Special values: -1 - last image in the buffer, -2: last indexed image in the buffer

[optional] [default to -1]

Return type

bytearray

Authorization

No authorization required

HTTP request headers

  • Content-Type: Not defined

  • Accept: image/tiff

HTTP response details

Status code

Description

Response headers

200

Preview image

-

404

No preview image recorded so far

-

[Back to top] [Back to API list] [Back to Model list] [Back to README]

image_buffer_start_cbor_get

bytearray image_buffer_start_cbor_get()

Get Start message in CBOR format

Contains metadata for a dataset (e.g., experimental geometry)

Example

import jfjoch_client
+from jfjoch_client.rest import ApiException
+from pprint import pprint
+
+# Defining the host is optional and defaults to http://localhost:5232
+# See configuration.py for a list of all supported configuration parameters.
+configuration = jfjoch_client.Configuration(
+    host = "http://localhost:5232"
+)
+
+
+# Enter a context with an instance of the API client
+with jfjoch_client.ApiClient(configuration) as api_client:
+    # Create an instance of the API class
+    api_instance = jfjoch_client.DefaultApi(api_client)
+
+    try:
+        # Get Start message in CBOR format
+        api_response = api_instance.image_buffer_start_cbor_get()
+        print("The response of DefaultApi->image_buffer_start_cbor_get:\n")
+        pprint(api_response)
+    except Exception as e:
+        print("Exception when calling DefaultApi->image_buffer_start_cbor_get: %s\n" % e)
+

Parameters

This endpoint does not need any parameter.

Return type

bytearray

Authorization

No authorization required

HTTP request headers

  • Content-Type: Not defined

  • Accept: application/cbor, application/json

HTTP response details

Status code

Description

Response headers

200

Return start message

-

404

No measurement so far

-

500

Error within Jungfraujoch code - see output message.

-

[Back to top] [Back to API list] [Back to Model list] [Back to README]

image_buffer_status_get

ImageBufferStatus image_buffer_status_get()

Get status of the image buffers

Can be run at any stage of Jungfraujoch operation, including during data collection. The status of the image buffer is volatile during data collection - if data collection goes for more images than available buffer slots, then image might be replaced in the buffer between calling /images and /image.cbor.

Example

import jfjoch_client
+from jfjoch_client.models.image_buffer_status import ImageBufferStatus
+from jfjoch_client.rest import ApiException
+from pprint import pprint
+
+# Defining the host is optional and defaults to http://localhost:5232
+# See configuration.py for a list of all supported configuration parameters.
+configuration = jfjoch_client.Configuration(
+    host = "http://localhost:5232"
+)
+
+
+# Enter a context with an instance of the API client
+with jfjoch_client.ApiClient(configuration) as api_client:
+    # Create an instance of the API class
+    api_instance = jfjoch_client.DefaultApi(api_client)
+
+    try:
+        # Get status of the image buffers
+        api_response = api_instance.image_buffer_status_get()
+        print("The response of DefaultApi->image_buffer_status_get:\n")
+        pprint(api_response)
+    except Exception as e:
+        print("Exception when calling DefaultApi->image_buffer_status_get: %s\n" % e)
+

Parameters

This endpoint does not need any parameter.

Return type

ImageBufferStatus

Authorization

No authorization required

HTTP request headers

  • Content-Type: Not defined

  • Accept: application/json

HTTP response details

Status code

Description

Response headers

200

Done

-

500

Error within Jungfraujoch code - see output message.

-

[Back to top] [Back to API list] [Back to Model list] [Back to README]

image_pusher_status_get

ImagePusherStatus image_pusher_status_get()

Get status of image pusher

Example

import jfjoch_client
+from jfjoch_client.models.image_pusher_status import ImagePusherStatus
+from jfjoch_client.rest import ApiException
+from pprint import pprint
+
+# Defining the host is optional and defaults to http://localhost:5232
+# See configuration.py for a list of all supported configuration parameters.
+configuration = jfjoch_client.Configuration(
+    host = "http://localhost:5232"
+)
+
+
+# Enter a context with an instance of the API client
+with jfjoch_client.ApiClient(configuration) as api_client:
+    # Create an instance of the API class
+    api_instance = jfjoch_client.DefaultApi(api_client)
+
+    try:
+        # Get status of image pusher
+        api_response = api_instance.image_pusher_status_get()
+        print("The response of DefaultApi->image_pusher_status_get:\n")
+        pprint(api_response)
+    except Exception as e:
+        print("Exception when calling DefaultApi->image_pusher_status_get: %s\n" % e)
+

Parameters

This endpoint does not need any parameter.

Return type

ImagePusherStatus

Authorization

No authorization required

HTTP request headers

  • Content-Type: Not defined

  • Accept: application/json, text/plain

HTTP response details

Status code

Description

Response headers

200

Everything OK

-

500

Error encountered when trying to read status

-

[Back to top] [Back to API list] [Back to Model list] [Back to README]

initialize_post

initialize_post()

Initialize detector and data acquisition

Should be used in two cases:

  • Detector is in Inactive state

  • Detector is in Error state X-ray shutter must be closed. This operation will reconfigure network interface of the detector. During operation of the detector it is recommended to use the POST /pedestal operation instead. If storage cells are used, the execution time might be few minutes.

This is async function - one needs to use POST /wait_till_done to ensure operation is done.

Example

import jfjoch_client
+from jfjoch_client.rest import ApiException
+from pprint import pprint
+
+# Defining the host is optional and defaults to http://localhost:5232
+# See configuration.py for a list of all supported configuration parameters.
+configuration = jfjoch_client.Configuration(
+    host = "http://localhost:5232"
+)
+
+
+# Enter a context with an instance of the API client
+with jfjoch_client.ApiClient(configuration) as api_client:
+    # Create an instance of the API class
+    api_instance = jfjoch_client.DefaultApi(api_client)
+
+    try:
+        # Initialize detector and data acquisition
+        api_instance.initialize_post()
+    except Exception as e:
+        print("Exception when calling DefaultApi->initialize_post: %s\n" % e)
+

Parameters

This endpoint does not need any parameter.

Return type

void (empty response body)

Authorization

No authorization required

HTTP request headers

  • Content-Type: Not defined

  • Accept: application/json

HTTP response details

Status code

Description

Response headers

200

Initialization started

-

500

Error within Jungfraujoch code - see output message.

-

[Back to top] [Back to API list] [Back to Model list] [Back to README]

pedestal_post

pedestal_post()

Collect dark current for the detector

Updates calibration of the JUNGFRAU detector. Must be in Idle state.

X-ray shutter must be closed. Recommended to run once per hour for long integration times (> 100 us).

This is async function - one needs to use POST /wait_till_done to ensure operation is done.

Example

import jfjoch_client
+from jfjoch_client.rest import ApiException
+from pprint import pprint
+
+# Defining the host is optional and defaults to http://localhost:5232
+# See configuration.py for a list of all supported configuration parameters.
+configuration = jfjoch_client.Configuration(
+    host = "http://localhost:5232"
+)
+
+
+# Enter a context with an instance of the API client
+with jfjoch_client.ApiClient(configuration) as api_client:
+    # Create an instance of the API class
+    api_instance = jfjoch_client.DefaultApi(api_client)
+
+    try:
+        # Collect dark current for the detector
+        api_instance.pedestal_post()
+    except Exception as e:
+        print("Exception when calling DefaultApi->pedestal_post: %s\n" % e)
+

Parameters

This endpoint does not need any parameter.

Return type

void (empty response body)

Authorization

No authorization required

HTTP request headers

  • Content-Type: Not defined

  • Accept: application/json

HTTP response details

Status code

Description

Response headers

200

Everything OK

-

500

Error within Jungfraujoch code - see output message.

-

[Back to top] [Back to API list] [Back to Model list] [Back to README]

preview_pedestal_tiff_get

bytearray preview_pedestal_tiff_get(gain_level, sc=sc)

Get pedestal in TIFF format

Example

import jfjoch_client
+from jfjoch_client.rest import ApiException
+from pprint import pprint
+
+# Defining the host is optional and defaults to http://localhost:5232
+# See configuration.py for a list of all supported configuration parameters.
+configuration = jfjoch_client.Configuration(
+    host = "http://localhost:5232"
+)
+
+
+# Enter a context with an instance of the API client
+with jfjoch_client.ApiClient(configuration) as api_client:
+    # Create an instance of the API class
+    api_instance = jfjoch_client.DefaultApi(api_client)
+    gain_level = 56 # int | Gain level (0, 1, 2)
+    sc = 56 # int | Storage cell number (optional)
+
+    try:
+        # Get pedestal in TIFF format
+        api_response = api_instance.preview_pedestal_tiff_get(gain_level, sc=sc)
+        print("The response of DefaultApi->preview_pedestal_tiff_get:\n")
+        pprint(api_response)
+    except Exception as e:
+        print("Exception when calling DefaultApi->preview_pedestal_tiff_get: %s\n" % e)
+

Parameters

Name

Type

Description

Notes

gain_level

int

Gain level (0, 1, 2)

sc

int

Storage cell number

[optional]

Return type

bytearray

Authorization

No authorization required

HTTP request headers

  • Content-Type: Not defined

  • Accept: image/tiff

HTTP response details

Status code

Description

Response headers

200

Calibration image

-

400

Invalid gain level or storage cell number

-

404

No calibration recorded so far

-

[Back to top] [Back to API list] [Back to Model list] [Back to README]

preview_plot_bin_get

bytearray preview_plot_bin_get(type, roi=roi)

Generate 1D plot from Jungfraujoch and send in raw binary format. Data are provided as (32-bit) float binary array. This format doesn’t transmit information about X-axis, only values, so it is of limited use for azimuthal integration.

Example

import jfjoch_client
+from jfjoch_client.rest import ApiException
+from pprint import pprint
+
+# Defining the host is optional and defaults to http://localhost:5232
+# See configuration.py for a list of all supported configuration parameters.
+configuration = jfjoch_client.Configuration(
+    host = "http://localhost:5232"
+)
+
+
+# Enter a context with an instance of the API client
+with jfjoch_client.ApiClient(configuration) as api_client:
+    # Create an instance of the API class
+    api_instance = jfjoch_client.DefaultApi(api_client)
+    type = 'type_example' # str | Type of requested plot
+    roi = 'roi_example' # str | Name of ROI for which plot is requested (optional)
+
+    try:
+        # Generate 1D plot from Jungfraujoch and send in raw binary format. Data are provided as (32-bit) float binary array. This format doesn't transmit information about X-axis, only values, so it is of limited use for azimuthal integration. 
+        api_response = api_instance.preview_plot_bin_get(type, roi=roi)
+        print("The response of DefaultApi->preview_plot_bin_get:\n")
+        pprint(api_response)
+    except Exception as e:
+        print("Exception when calling DefaultApi->preview_plot_bin_get: %s\n" % e)
+

Parameters

Name

Type

Description

Notes

type

str

Type of requested plot

roi

str

Name of ROI for which plot is requested

[optional]

Return type

bytearray

Authorization

No authorization required

HTTP request headers

  • Content-Type: Not defined

  • Accept: application/octet-stream, text/plain

HTTP response details

Status code

Description

Response headers

200

Everything OK.

-

400

Input parsing or validation error

-

[Back to top] [Back to API list] [Back to Model list] [Back to README]

preview_plot_get

Plots preview_plot_get(type, binning=binning, fill=fill, experimental_coord=experimental_coord, azint_unit=azint_unit)

Generate 1D plot from Jungfraujoch

Example

import jfjoch_client
+from jfjoch_client.models.plots import Plots
+from jfjoch_client.rest import ApiException
+from pprint import pprint
+
+# Defining the host is optional and defaults to http://localhost:5232
+# See configuration.py for a list of all supported configuration parameters.
+configuration = jfjoch_client.Configuration(
+    host = "http://localhost:5232"
+)
+
+
+# Enter a context with an instance of the API client
+with jfjoch_client.ApiClient(configuration) as api_client:
+    # Create an instance of the API class
+    api_instance = jfjoch_client.DefaultApi(api_client)
+    type = 'type_example' # str | Type of requested plot
+    binning = 1 # int | Binning of frames for the plot (0 = default binning) (optional) (default to 1)
+    fill = 3.4 # float | Fill value for elements that were missed during data collection  (optional)
+    experimental_coord = False # bool | If measurement has goniometer axis defined, plot X-axis will represent rotation angle If measurement has grid scan defined, plot X-axis and Y-axis will represent grid position, Z will be used as the final value For still measurement the number is ignored  (optional) (default to False)
+    azint_unit = Q_recipA # str | Unit used for azim int.  (optional) (default to Q_recipA)
+
+    try:
+        # Generate 1D plot from Jungfraujoch
+        api_response = api_instance.preview_plot_get(type, binning=binning, fill=fill, experimental_coord=experimental_coord, azint_unit=azint_unit)
+        print("The response of DefaultApi->preview_plot_get:\n")
+        pprint(api_response)
+    except Exception as e:
+        print("Exception when calling DefaultApi->preview_plot_get: %s\n" % e)
+

Parameters

Name

Type

Description

Notes

type

str

Type of requested plot

binning

int

Binning of frames for the plot (0 = default binning)

[optional] [default to 1]

fill

float

Fill value for elements that were missed during data collection

[optional]

experimental_coord

bool

If measurement has goniometer axis defined, plot X-axis will represent rotation angle If measurement has grid scan defined, plot X-axis and Y-axis will represent grid position, Z will be used as the final value For still measurement the number is ignored

[optional] [default to False]

azint_unit

str

Unit used for azim int.

[optional] [default to Q_recipA]

Return type

Plots

Authorization

No authorization required

HTTP request headers

  • Content-Type: Not defined

  • Accept: application/json, text/plain

HTTP response details

Status code

Description

Response headers

200

Everything OK.

-

400

Input parsing or validation error

-

[Back to top] [Back to API list] [Back to Model list] [Back to README]

result_scan_get

ScanResult result_scan_get()

Get full scan result

Example

import jfjoch_client
+from jfjoch_client.models.scan_result import ScanResult
+from jfjoch_client.rest import ApiException
+from pprint import pprint
+
+# Defining the host is optional and defaults to http://localhost:5232
+# See configuration.py for a list of all supported configuration parameters.
+configuration = jfjoch_client.Configuration(
+    host = "http://localhost:5232"
+)
+
+
+# Enter a context with an instance of the API client
+with jfjoch_client.ApiClient(configuration) as api_client:
+    # Create an instance of the API class
+    api_instance = jfjoch_client.DefaultApi(api_client)
+
+    try:
+        # Get full scan result
+        api_response = api_instance.result_scan_get()
+        print("The response of DefaultApi->result_scan_get:\n")
+        pprint(api_response)
+    except Exception as e:
+        print("Exception when calling DefaultApi->result_scan_get: %s\n" % e)
+

Parameters

This endpoint does not need any parameter.

Return type

ScanResult

Authorization

No authorization required

HTTP request headers

  • Content-Type: Not defined

  • Accept: application/json

HTTP response details

Status code

Description

Response headers

200

Everything OK.

-

404

No grid scan recorded

-

500

Error within Jungfraujoch code - see output message.

-

[Back to top] [Back to API list] [Back to Model list] [Back to README]

start_post

start_post(dataset_settings=dataset_settings)

Start detector

Start data acquisition. Detector must be in Idle state. Default behavior is for the call to block until detector is ready to accept soft/TTL triggers. However, this behavior can be changed by settings async_start to true in the request body, in which case the call will return immediately and one needs to use /wait_until_running to ensure detector is ready to run.

Example

import jfjoch_client
+from jfjoch_client.models.dataset_settings import DatasetSettings
+from jfjoch_client.rest import ApiException
+from pprint import pprint
+
+# Defining the host is optional and defaults to http://localhost:5232
+# See configuration.py for a list of all supported configuration parameters.
+configuration = jfjoch_client.Configuration(
+    host = "http://localhost:5232"
+)
+
+
+# Enter a context with an instance of the API client
+with jfjoch_client.ApiClient(configuration) as api_client:
+    # Create an instance of the API class
+    api_instance = jfjoch_client.DefaultApi(api_client)
+    dataset_settings = jfjoch_client.DatasetSettings() # DatasetSettings |  (optional)
+
+    try:
+        # Start detector
+        api_instance.start_post(dataset_settings=dataset_settings)
+    except Exception as e:
+        print("Exception when calling DefaultApi->start_post: %s\n" % e)
+

Parameters

Name

Type

Description

Notes

dataset_settings

DatasetSettings

[optional]

Return type

void (empty response body)

Authorization

No authorization required

HTTP request headers

  • Content-Type: application/json

  • Accept: text/plain, application/json

HTTP response details

Status code

Description

Response headers

200

Everything OK

-

400

Input parsing or validation error

-

500

Error within Jungfraujoch code - see output message.

-

[Back to top] [Back to API list] [Back to Model list] [Back to README]

statistics_calibration_get

List[CalibrationStatisticsInner] statistics_calibration_get()

Get calibration statistics

Statistics are provided for each module/storage cell separately

Example

import jfjoch_client
+from jfjoch_client.models.calibration_statistics_inner import CalibrationStatisticsInner
+from jfjoch_client.rest import ApiException
+from pprint import pprint
+
+# Defining the host is optional and defaults to http://localhost:5232
+# See configuration.py for a list of all supported configuration parameters.
+configuration = jfjoch_client.Configuration(
+    host = "http://localhost:5232"
+)
+
+
+# Enter a context with an instance of the API client
+with jfjoch_client.ApiClient(configuration) as api_client:
+    # Create an instance of the API class
+    api_instance = jfjoch_client.DefaultApi(api_client)
+
+    try:
+        # Get calibration statistics
+        api_response = api_instance.statistics_calibration_get()
+        print("The response of DefaultApi->statistics_calibration_get:\n")
+        pprint(api_response)
+    except Exception as e:
+        print("Exception when calling DefaultApi->statistics_calibration_get: %s\n" % e)
+

Parameters

This endpoint does not need any parameter.

Return type

List[CalibrationStatisticsInner]

Authorization

No authorization required

HTTP request headers

  • Content-Type: Not defined

  • Accept: application/json

HTTP response details

Status code

Description

Response headers

200

Everything OK

-

[Back to top] [Back to API list] [Back to Model list] [Back to README]

statistics_data_collection_get

MeasurementStatistics statistics_data_collection_get()

Get data collection statistics

Results of the last data collection

Example

import jfjoch_client
+from jfjoch_client.models.measurement_statistics import MeasurementStatistics
+from jfjoch_client.rest import ApiException
+from pprint import pprint
+
+# Defining the host is optional and defaults to http://localhost:5232
+# See configuration.py for a list of all supported configuration parameters.
+configuration = jfjoch_client.Configuration(
+    host = "http://localhost:5232"
+)
+
+
+# Enter a context with an instance of the API client
+with jfjoch_client.ApiClient(configuration) as api_client:
+    # Create an instance of the API class
+    api_instance = jfjoch_client.DefaultApi(api_client)
+
+    try:
+        # Get data collection statistics
+        api_response = api_instance.statistics_data_collection_get()
+        print("The response of DefaultApi->statistics_data_collection_get:\n")
+        pprint(api_response)
+    except Exception as e:
+        print("Exception when calling DefaultApi->statistics_data_collection_get: %s\n" % e)
+

Parameters

This endpoint does not need any parameter.

Return type

MeasurementStatistics

Authorization

No authorization required

HTTP request headers

  • Content-Type: Not defined

  • Accept: application/json

HTTP response details

Status code

Description

Response headers

200

Everything OK

-

404

No data collection performed so far

-

[Back to top] [Back to API list] [Back to Model list] [Back to README]

statistics_get

JfjochStatistics statistics_get()

Get general statistics

Example

import jfjoch_client
+from jfjoch_client.models.jfjoch_statistics import JfjochStatistics
+from jfjoch_client.rest import ApiException
+from pprint import pprint
+
+# Defining the host is optional and defaults to http://localhost:5232
+# See configuration.py for a list of all supported configuration parameters.
+configuration = jfjoch_client.Configuration(
+    host = "http://localhost:5232"
+)
+
+
+# Enter a context with an instance of the API client
+with jfjoch_client.ApiClient(configuration) as api_client:
+    # Create an instance of the API class
+    api_instance = jfjoch_client.DefaultApi(api_client)
+
+    try:
+        # Get general statistics
+        api_response = api_instance.statistics_get()
+        print("The response of DefaultApi->statistics_get:\n")
+        pprint(api_response)
+    except Exception as e:
+        print("Exception when calling DefaultApi->statistics_get: %s\n" % e)
+

Parameters

This endpoint does not need any parameter.

Return type

JfjochStatistics

Authorization

No authorization required

HTTP request headers

  • Content-Type: Not defined

  • Accept: application/json

HTTP response details

Status code

Description

Response headers

200

Everything OK

-

[Back to top] [Back to API list] [Back to Model list] [Back to README]

status_get

BrokerStatus status_get()

Get Jungfraujoch status

Status of the data acquisition

Example

import jfjoch_client
+from jfjoch_client.models.broker_status import BrokerStatus
+from jfjoch_client.rest import ApiException
+from pprint import pprint
+
+# Defining the host is optional and defaults to http://localhost:5232
+# See configuration.py for a list of all supported configuration parameters.
+configuration = jfjoch_client.Configuration(
+    host = "http://localhost:5232"
+)
+
+
+# Enter a context with an instance of the API client
+with jfjoch_client.ApiClient(configuration) as api_client:
+    # Create an instance of the API class
+    api_instance = jfjoch_client.DefaultApi(api_client)
+
+    try:
+        # Get Jungfraujoch status
+        api_response = api_instance.status_get()
+        print("The response of DefaultApi->status_get:\n")
+        pprint(api_response)
+    except Exception as e:
+        print("Exception when calling DefaultApi->status_get: %s\n" % e)
+

Parameters

This endpoint does not need any parameter.

Return type

BrokerStatus

Authorization

No authorization required

HTTP request headers

  • Content-Type: Not defined

  • Accept: application/json

HTTP response details

Status code

Description

Response headers

200

Everything OK

-

[Back to top] [Back to API list] [Back to Model list] [Back to README]

trigger_post

trigger_post()

Send soft trigger to the detector

Generate soft trigger

Example

import jfjoch_client
+from jfjoch_client.rest import ApiException
+from pprint import pprint
+
+# Defining the host is optional and defaults to http://localhost:5232
+# See configuration.py for a list of all supported configuration parameters.
+configuration = jfjoch_client.Configuration(
+    host = "http://localhost:5232"
+)
+
+
+# Enter a context with an instance of the API client
+with jfjoch_client.ApiClient(configuration) as api_client:
+    # Create an instance of the API class
+    api_instance = jfjoch_client.DefaultApi(api_client)
+
+    try:
+        # Send soft trigger to the detector
+        api_instance.trigger_post()
+    except Exception as e:
+        print("Exception when calling DefaultApi->trigger_post: %s\n" % e)
+

Parameters

This endpoint does not need any parameter.

Return type

void (empty response body)

Authorization

No authorization required

HTTP request headers

  • Content-Type: Not defined

  • Accept: Not defined

HTTP response details

Status code

Description

Response headers

200

Trigger sent

-

[Back to top] [Back to API list] [Back to Model list] [Back to README]

version_get

str version_get()

Get Jungfraujoch version of jfjoch_broker

Example

import jfjoch_client
+from jfjoch_client.rest import ApiException
+from pprint import pprint
+
+# Defining the host is optional and defaults to http://localhost:5232
+# See configuration.py for a list of all supported configuration parameters.
+configuration = jfjoch_client.Configuration(
+    host = "http://localhost:5232"
+)
+
+
+# Enter a context with an instance of the API client
+with jfjoch_client.ApiClient(configuration) as api_client:
+    # Create an instance of the API class
+    api_instance = jfjoch_client.DefaultApi(api_client)
+
+    try:
+        # Get Jungfraujoch version of jfjoch_broker
+        api_response = api_instance.version_get()
+        print("The response of DefaultApi->version_get:\n")
+        pprint(api_response)
+    except Exception as e:
+        print("Exception when calling DefaultApi->version_get: %s\n" % e)
+

Parameters

This endpoint does not need any parameter.

Return type

str

Authorization

No authorization required

HTTP request headers

  • Content-Type: Not defined

  • Accept: text/plain

HTTP response details

Status code

Description

Response headers

200

Release number of Jungfraujoch

-

[Back to top] [Back to API list] [Back to Model list] [Back to README]

wait_till_done_post

wait_till_done_post(timeout=timeout)

Wait for acquisition done

Block execution of external script till initialization, data collection or pedestal is finished. Running this command does not affect (cancel) running data collection, it is only to ensure synchronous execution of other software.

To not block web server for a indefinite period of time, the procedure is provided with a timeout. Extending timeout is possible, but requires to ensure safety that client will not close the connection and retry the connection.

Example

import jfjoch_client
+from jfjoch_client.rest import ApiException
+from pprint import pprint
+
+# Defining the host is optional and defaults to http://localhost:5232
+# See configuration.py for a list of all supported configuration parameters.
+configuration = jfjoch_client.Configuration(
+    host = "http://localhost:5232"
+)
+
+
+# Enter a context with an instance of the API client
+with jfjoch_client.ApiClient(configuration) as api_client:
+    # Create an instance of the API class
+    api_instance = jfjoch_client.DefaultApi(api_client)
+    timeout = 60 # int | Timeout in seconds (0 == immediate response) (optional) (default to 60)
+
+    try:
+        # Wait for acquisition done
+        api_instance.wait_till_done_post(timeout=timeout)
+    except Exception as e:
+        print("Exception when calling DefaultApi->wait_till_done_post: %s\n" % e)
+

Parameters

Name

Type

Description

Notes

timeout

int

Timeout in seconds (0 == immediate response)

[optional] [default to 60]

Return type

void (empty response body)

Authorization

No authorization required

HTTP request headers

  • Content-Type: Not defined

  • Accept: application/json

HTTP response details

Status code

Description

Response headers

200

Detector in `Idle` state, another data collection can start immediately

-

400

Timeout parameter out of bounds

-

500

Error within Jungfraujoch code - see output message.

-

502

Detector is inactive mode

-

504

Timeout reached, need to restart operation

-

[Back to top] [Back to API list] [Back to Model list] [Back to README]

wait_until_running_post

wait_until_running_post(timeout=timeout)

Wait for acquisition running

Block execution of external script till detector and Jungfraujoch are ready to collect data. To not block web server for a indefinite period of time, the procedure is provided with a timeout. Extending timeout is possible, but requires to ensure safety that client will not close the connection and retry the connection.

Example

import jfjoch_client
+from jfjoch_client.rest import ApiException
+from pprint import pprint
+
+# Defining the host is optional and defaults to http://localhost:5232
+# See configuration.py for a list of all supported configuration parameters.
+configuration = jfjoch_client.Configuration(
+    host = "http://localhost:5232"
+)
+
+
+# Enter a context with an instance of the API client
+with jfjoch_client.ApiClient(configuration) as api_client:
+    # Create an instance of the API class
+    api_instance = jfjoch_client.DefaultApi(api_client)
+    timeout = 60 # int | Timeout in seconds (0 == immediate response) (optional) (default to 60)
+
+    try:
+        # Wait for acquisition running
+        api_instance.wait_until_running_post(timeout=timeout)
+    except Exception as e:
+        print("Exception when calling DefaultApi->wait_until_running_post: %s\n" % e)
+

Parameters

Name

Type

Description

Notes

timeout

int

Timeout in seconds (0 == immediate response)

[optional] [default to 60]

Return type

void (empty response body)

Authorization

No authorization required

HTTP request headers

  • Content-Type: Not defined

  • Accept: application/json

HTTP response details

Status code

Description

Response headers

200

Detector in `Measuring` state

-

400

Timeout parameter out of bounds

-

500

Error within Jungfraujoch code - see output message.

-

502

Detector is inactive mode

-

504

Timeout reached, need to restart operation

-

[Back to top] [Back to API list] [Back to Model list] [Back to README]

xfel_event_code_get

List[int] xfel_event_code_get()

Return XFEL event codes for the current data acquisition

Return array of XFEL event codes

Example

import jfjoch_client
+from jfjoch_client.rest import ApiException
+from pprint import pprint
+
+# Defining the host is optional and defaults to http://localhost:5232
+# See configuration.py for a list of all supported configuration parameters.
+configuration = jfjoch_client.Configuration(
+    host = "http://localhost:5232"
+)
+
+
+# Enter a context with an instance of the API client
+with jfjoch_client.ApiClient(configuration) as api_client:
+    # Create an instance of the API class
+    api_instance = jfjoch_client.DefaultApi(api_client)
+
+    try:
+        # Return XFEL event codes for the current data acquisition
+        api_response = api_instance.xfel_event_code_get()
+        print("The response of DefaultApi->xfel_event_code_get:\n")
+        pprint(api_response)
+    except Exception as e:
+        print("Exception when calling DefaultApi->xfel_event_code_get: %s\n" % e)
+

Parameters

This endpoint does not need any parameter.

Return type

List[int]

Authorization

No authorization required

HTTP request headers

  • Content-Type: Not defined

  • Accept: application/json

HTTP response details

Status code

Description

Response headers

200

Event codes collected

-

404

Not in XFEL mode or no acquisition recorded

-

[Back to top] [Back to API list] [Back to Model list] [Back to README]

xfel_pulse_id_get

List[int] xfel_pulse_id_get()

Return XFEL pulse IDs for the current data acquisition

Return array of XFEL pulse IDs - (-1) if image not recorded

Example

import jfjoch_client
+from jfjoch_client.rest import ApiException
+from pprint import pprint
+
+# Defining the host is optional and defaults to http://localhost:5232
+# See configuration.py for a list of all supported configuration parameters.
+configuration = jfjoch_client.Configuration(
+    host = "http://localhost:5232"
+)
+
+
+# Enter a context with an instance of the API client
+with jfjoch_client.ApiClient(configuration) as api_client:
+    # Create an instance of the API class
+    api_instance = jfjoch_client.DefaultApi(api_client)
+
+    try:
+        # Return XFEL pulse IDs for the current data acquisition
+        api_response = api_instance.xfel_pulse_id_get()
+        print("The response of DefaultApi->xfel_pulse_id_get:\n")
+        pprint(api_response)
+    except Exception as e:
+        print("Exception when calling DefaultApi->xfel_pulse_id_get: %s\n" % e)
+

Parameters

This endpoint does not need any parameter.

Return type

List[int]

Authorization

No authorization required

HTTP request headers

  • Content-Type: Not defined

  • Accept: application/json

HTTP response details

Status code

Description

Response headers

200

Pulse ID collected

-

404

Not in XFEL mode or no acquisition recorded

-

[Back to top] [Back to API list] [Back to Model list] [Back to README]

\ No newline at end of file diff --git a/python_client/docs/Detector.html b/python_client/docs/Detector.html new file mode 100644 index 00000000..f9e6167b --- /dev/null +++ b/python_client/docs/Detector.html @@ -0,0 +1,14 @@ + Detector — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

Detector

Properties

Name

Type

Description

Notes

description

str

serial_number

str

[optional] [default to ‘Unknown’]

type

DetectorType

[optional]

high_voltage_v

int

[optional] [default to 0]

udp_interface_count

int

[optional] [default to 1]

module_sync

bool

Use module 0 as master for timing. Only applies to JUNGFRAU detector (this cannot be turned off for EIGER).

[optional] [default to True]

sensor_thickness_um

float

[optional] [default to 320]

readout_time_ns

int

Minimum difference between frame time and count time in microseconds Defaults are 3’000 ns for EIGER and 20’000 ns for JUNGFRAU

[optional]

min_count_time_ns

int

Minimum count time available for the detector.

[optional]

min_frame_time_ns

int

Minimum frame time available for the detector.

[optional]

calibration_file

List[str]

Can be empty for all detectors - default calibration used. For JUNGFRAU: list of gain files, one entry per module. For EIGER: one directory (with detector settings) or list of trim bit files, one entry per half-module.

[optional]

hostname

List[str]

Hostname for detector module. One entry per module One entry per module. Either empty or number of module entries.

[optional]

sensor_material

str

[optional] [default to ‘Si’]

tx_delay

List[int]

[optional]

base_data_ipv4_address

str

[optional]

standard_geometry

StandardDetectorGeometry

[optional]

custom_geometry

List[DetectorModule]

[optional]

roi_mode

str

ROI setting for DECTRIS detectors

[optional] [default to ‘’]

mirror_y

bool

Mirror detector in Y direction to account for MX convention of (0,0) point in top left corner

[optional] [default to True]

temp_thresold_deg_c

int

Temperature threshold for JUNGFRAU detector modules

[optional] [default to 55]

default_settings

DetectorSettings

[optional]

Example

from jfjoch_client.models.detector import Detector
+
+# TODO update the JSON string below
+json = "{}"
+# create an instance of Detector from a JSON string
+detector_instance = Detector.from_json(json)
+# print the JSON string representation of the object
+print(Detector.to_json())
+
+# convert the object into a dict
+detector_dict = detector_instance.to_dict()
+# create an instance of Detector from a dict
+detector_from_dict = Detector.from_dict(detector_dict)
+

[Back to Model list] [Back to API list] [Back to README]

\ No newline at end of file diff --git a/python_client/docs/DetectorList.html b/python_client/docs/DetectorList.html new file mode 100644 index 00000000..31baea86 --- /dev/null +++ b/python_client/docs/DetectorList.html @@ -0,0 +1,14 @@ + DetectorList — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

DetectorList

Properties

Name

Type

Description

Notes

detectors

List[DetectorListElement]

current_id

int

Example

from jfjoch_client.models.detector_list import DetectorList
+
+# TODO update the JSON string below
+json = "{}"
+# create an instance of DetectorList from a JSON string
+detector_list_instance = DetectorList.from_json(json)
+# print the JSON string representation of the object
+print(DetectorList.to_json())
+
+# convert the object into a dict
+detector_list_dict = detector_list_instance.to_dict()
+# create an instance of DetectorList from a dict
+detector_list_from_dict = DetectorList.from_dict(detector_list_dict)
+

[Back to Model list] [Back to API list] [Back to README]

\ No newline at end of file diff --git a/python_client/docs/DetectorListDetectorsInner.html b/python_client/docs/DetectorListDetectorsInner.html new file mode 100644 index 00000000..3f48eaf8 --- /dev/null +++ b/python_client/docs/DetectorListDetectorsInner.html @@ -0,0 +1,14 @@ + DetectorListDetectorsInner — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

DetectorListDetectorsInner

Properties

Name

Type

Description

Notes

id

int

description

str

serial_number

str

base_ipv4_addr

str

udp_interface_count

int

Number of UDP interfaces per detector module

nmodules

int

width

int

height

int

Example

from jfjoch_client.models.detector_list_detectors_inner import DetectorListDetectorsInner
+
+# TODO update the JSON string below
+json = "{}"
+# create an instance of DetectorListDetectorsInner from a JSON string
+detector_list_detectors_inner_instance = DetectorListDetectorsInner.from_json(json)
+# print the JSON string representation of the object
+print(DetectorListDetectorsInner.to_json())
+
+# convert the object into a dict
+detector_list_detectors_inner_dict = detector_list_detectors_inner_instance.to_dict()
+# create an instance of DetectorListDetectorsInner from a dict
+detector_list_detectors_inner_from_dict = DetectorListDetectorsInner.from_dict(detector_list_detectors_inner_dict)
+

[Back to Model list] [Back to API list] [Back to README]

\ No newline at end of file diff --git a/python_client/docs/DetectorListElement.html b/python_client/docs/DetectorListElement.html new file mode 100644 index 00000000..bf7cfc95 --- /dev/null +++ b/python_client/docs/DetectorListElement.html @@ -0,0 +1,14 @@ + DetectorListElement — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

DetectorListElement

Properties

Name

Type

Description

Notes

id

int

description

str

serial_number

str

base_ipv4_addr

str

udp_interface_count

int

Number of UDP interfaces per detector module

nmodules

int

width

int

height

int

pixel_size_mm

float

[optional]

readout_time_ns

int

min_frame_time_ns

int

min_count_time_ns

int

type

DetectorType

[optional]

Example

from jfjoch_client.models.detector_list_element import DetectorListElement
+
+# TODO update the JSON string below
+json = "{}"
+# create an instance of DetectorListElement from a JSON string
+detector_list_element_instance = DetectorListElement.from_json(json)
+# print the JSON string representation of the object
+print(DetectorListElement.to_json())
+
+# convert the object into a dict
+detector_list_element_dict = detector_list_element_instance.to_dict()
+# create an instance of DetectorListElement from a dict
+detector_list_element_from_dict = DetectorListElement.from_dict(detector_list_element_dict)
+

[Back to Model list] [Back to API list] [Back to README]

\ No newline at end of file diff --git a/python_client/docs/DetectorModule.html b/python_client/docs/DetectorModule.html new file mode 100644 index 00000000..39762fc2 --- /dev/null +++ b/python_client/docs/DetectorModule.html @@ -0,0 +1,14 @@ + DetectorModule — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

DetectorModule

Properties

Name

Type

Description

Notes

x0

float

y0

float

fast_axis

DetectorModuleDirection

slow_axis

DetectorModuleDirection

Example

from jfjoch_client.models.detector_module import DetectorModule
+
+# TODO update the JSON string below
+json = "{}"
+# create an instance of DetectorModule from a JSON string
+detector_module_instance = DetectorModule.from_json(json)
+# print the JSON string representation of the object
+print(DetectorModule.to_json())
+
+# convert the object into a dict
+detector_module_dict = detector_module_instance.to_dict()
+# create an instance of DetectorModule from a dict
+detector_module_from_dict = DetectorModule.from_dict(detector_module_dict)
+

[Back to Model list] [Back to API list] [Back to README]

\ No newline at end of file diff --git a/python_client/docs/DetectorModuleDirection.html b/python_client/docs/DetectorModuleDirection.html new file mode 100644 index 00000000..adf7ff68 --- /dev/null +++ b/python_client/docs/DetectorModuleDirection.html @@ -0,0 +1 @@ + DetectorModuleDirection — Jungfraujoch 1.0.0-rc.144 documentation Skip to content
\ No newline at end of file diff --git a/python_client/docs/DetectorPowerState.html b/python_client/docs/DetectorPowerState.html new file mode 100644 index 00000000..8c07baaf --- /dev/null +++ b/python_client/docs/DetectorPowerState.html @@ -0,0 +1 @@ + DetectorPowerState — Jungfraujoch 1.0.0-rc.144 documentation Skip to content
\ No newline at end of file diff --git a/python_client/docs/DetectorSelection.html b/python_client/docs/DetectorSelection.html new file mode 100644 index 00000000..f2113bbc --- /dev/null +++ b/python_client/docs/DetectorSelection.html @@ -0,0 +1,14 @@ + DetectorSelection — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

DetectorSelection

Properties

Name

Type

Description

Notes

id

int

Example

from jfjoch_client.models.detector_selection import DetectorSelection
+
+# TODO update the JSON string below
+json = "{}"
+# create an instance of DetectorSelection from a JSON string
+detector_selection_instance = DetectorSelection.from_json(json)
+# print the JSON string representation of the object
+print(DetectorSelection.to_json())
+
+# convert the object into a dict
+detector_selection_dict = detector_selection_instance.to_dict()
+# create an instance of DetectorSelection from a dict
+detector_selection_from_dict = DetectorSelection.from_dict(detector_selection_dict)
+

[Back to Model list] [Back to API list] [Back to README]

\ No newline at end of file diff --git a/python_client/docs/DetectorSettings.html b/python_client/docs/DetectorSettings.html new file mode 100644 index 00000000..daf6b25a --- /dev/null +++ b/python_client/docs/DetectorSettings.html @@ -0,0 +1,14 @@ + DetectorSettings — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

DetectorSettings

Properties

Name

Type

Description

Notes

frame_time_us

int

Interval between consecutive frames. This is internal frame time for the JUNGFRAU detector, image time has to be integer multiply of this number. For EIGER detector this is default frame time, not used otherwise

count_time_us

int

Integration time of the detector. If not provided count time will be set to maximum value for a given frame time.

[optional]

internal_frame_generator

bool

Use internal frame generator in FPGA instead of getting data from a real detector

[optional] [default to False]

internal_frame_generator_images

int

Number of images stored in the internal frame generator.

[optional] [default to 1]

detector_trigger_delay_ns

int

Delay between TTL trigger and acquisition start [ns]

[optional] [default to 0]

timing

DetectorTiming

[optional] [default to DetectorTiming.TRIGGER]

eiger_threshold_ke_v

float

Threshold for the PSI EIGER detector and all DECTRIS detectors. If value is provided, it will be used for all subsequent acquisitions, irrespective of beam energy. If value is not provided, threshold will be determined on start of acquisition as half of incident energy. This might lead to increased start time.

[optional]

eiger_bit_depth

int

Bit depth of PSI EIGER read-out. This is If value is not provided, depth will be determined based on the image time: * Exposure time < 500 microseconds depth of 8 bit will be used, * 500 <= exposure time < 2622 microseconds depth of 16 bit will be used * Exposure time >= 2622 microseconds depth of 32 bit will be used.

[optional]

jungfrau_pedestal_g0_frames

int

[optional] [default to 2000]

jungfrau_pedestal_g1_frames

int

[optional] [default to 300]

jungfrau_pedestal_g2_frames

int

[optional] [default to 300]

jungfrau_pedestal_min_image_count

int

Minimum number of collected images for pedestal to consider it viable

[optional] [default to 128]

jungfrau_storage_cell_count

int

[optional] [default to 1]

jungfrau_storage_cell_delay_ns

int

Delay between two storage cells [ns]

[optional] [default to 5000]

jungfrau_fixed_gain_g1

bool

Fix gain to G1 (can be useful for storage cells)

[optional] [default to False]

jungfrau_use_gain_hg0

bool

Use high G0 (for low energy applications)

[optional] [default to False]

Example

from jfjoch_client.models.detector_settings import DetectorSettings
+
+# TODO update the JSON string below
+json = "{}"
+# create an instance of DetectorSettings from a JSON string
+detector_settings_instance = DetectorSettings.from_json(json)
+# print the JSON string representation of the object
+print(DetectorSettings.to_json())
+
+# convert the object into a dict
+detector_settings_dict = detector_settings_instance.to_dict()
+# create an instance of DetectorSettings from a dict
+detector_settings_from_dict = DetectorSettings.from_dict(detector_settings_dict)
+

[Back to Model list] [Back to API list] [Back to README]

\ No newline at end of file diff --git a/python_client/docs/DetectorState.html b/python_client/docs/DetectorState.html new file mode 100644 index 00000000..9288762b --- /dev/null +++ b/python_client/docs/DetectorState.html @@ -0,0 +1 @@ + DetectorState — Jungfraujoch 1.0.0-rc.144 documentation Skip to content
\ No newline at end of file diff --git a/python_client/docs/DetectorStatus.html b/python_client/docs/DetectorStatus.html new file mode 100644 index 00000000..719bf551 --- /dev/null +++ b/python_client/docs/DetectorStatus.html @@ -0,0 +1,14 @@ + DetectorStatus — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

DetectorStatus

Properties

Name

Type

Description

Notes

state

DetectorState

powerchip

DetectorPowerState

server_version

str

Detector server (on read-out boards) version

number_of_triggers_left

int

Remaining triggers to the detector (max of all modules)

fpga_temp_deg_c

List[int]

Temperature of detector FPGAs

high_voltage_v

List[int]

High voltage for detector modules

Example

from jfjoch_client.models.detector_status import DetectorStatus
+
+# TODO update the JSON string below
+json = "{}"
+# create an instance of DetectorStatus from a JSON string
+detector_status_instance = DetectorStatus.from_json(json)
+# print the JSON string representation of the object
+print(DetectorStatus.to_json())
+
+# convert the object into a dict
+detector_status_dict = detector_status_instance.to_dict()
+# create an instance of DetectorStatus from a dict
+detector_status_from_dict = DetectorStatus.from_dict(detector_status_dict)
+

[Back to Model list] [Back to API list] [Back to README]

\ No newline at end of file diff --git a/python_client/docs/DetectorTiming.html b/python_client/docs/DetectorTiming.html new file mode 100644 index 00000000..97c034ae --- /dev/null +++ b/python_client/docs/DetectorTiming.html @@ -0,0 +1 @@ + DetectorTiming — Jungfraujoch 1.0.0-rc.144 documentation Skip to content
\ No newline at end of file diff --git a/python_client/docs/DetectorType.html b/python_client/docs/DetectorType.html new file mode 100644 index 00000000..004cdc28 --- /dev/null +++ b/python_client/docs/DetectorType.html @@ -0,0 +1 @@ + DetectorType — Jungfraujoch 1.0.0-rc.144 documentation Skip to content
\ No newline at end of file diff --git a/python_client/docs/ErrorMessage.html b/python_client/docs/ErrorMessage.html new file mode 100644 index 00000000..b8fff212 --- /dev/null +++ b/python_client/docs/ErrorMessage.html @@ -0,0 +1,14 @@ + ErrorMessage — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

ErrorMessage

Properties

Name

Type

Description

Notes

msg

str

Human readable message

reason

str

Enumerate field for automated analysis

Example

from jfjoch_client.models.error_message import ErrorMessage
+
+# TODO update the JSON string below
+json = "{}"
+# create an instance of ErrorMessage from a JSON string
+error_message_instance = ErrorMessage.from_json(json)
+# print the JSON string representation of the object
+print(ErrorMessage.to_json())
+
+# convert the object into a dict
+error_message_dict = error_message_instance.to_dict()
+# create an instance of ErrorMessage from a dict
+error_message_from_dict = ErrorMessage.from_dict(error_message_dict)
+

[Back to Model list] [Back to API list] [Back to README]

\ No newline at end of file diff --git a/python_client/docs/FileWriterFormat.html b/python_client/docs/FileWriterFormat.html new file mode 100644 index 00000000..ea011479 --- /dev/null +++ b/python_client/docs/FileWriterFormat.html @@ -0,0 +1 @@ + FileWriterFormat — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

FileWriterFormat

NoFileWritten - no files are written at all NXmxOnlyData - only data files are written, no master file NXmxLegacy - legacy format with soft links to data files in the master file; necessary for DECTRIS Albula 4.0 and DECTRIS Neggia NXmxVDS - newer format with virtual dataset linking data files in the master file, also includes better metadata handling NXmxIntegrated - single HDF5 per dataset CBF - CBF format (limited metadata) TIFF - TIFF format (no metadata)

Enum

  • NXMXONLYDATA (value: 'NXmxOnlyData')

  • NXMXLEGACY (value: 'NXmxLegacy')

  • NXMXVDS (value: 'NXmxVDS')

  • NXMXINTEGRATED (value: 'NXmxIntegrated')

  • CBF (value: 'CBF')

  • TIFF (value: 'TIFF')

  • NOFILEWRITTEN (value: 'NoFileWritten')

[Back to Model list] [Back to API list] [Back to README]

\ No newline at end of file diff --git a/python_client/docs/FileWriterSettings.html b/python_client/docs/FileWriterSettings.html new file mode 100644 index 00000000..9ed22247 --- /dev/null +++ b/python_client/docs/FileWriterSettings.html @@ -0,0 +1,14 @@ + FileWriterSettings — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

FileWriterSettings

Properties

Name

Type

Description

Notes

overwrite

bool

Inform jfjoch_write to overwrite existing files. Otherwise files would be saved with .h5.{timestamp}.tmp suffix.

[optional] [default to False]

format

FileWriterFormat

[optional] [default to FileWriterFormat.NXMXLEGACY]

Example

from jfjoch_client.models.file_writer_settings import FileWriterSettings
+
+# TODO update the JSON string below
+json = "{}"
+# create an instance of FileWriterSettings from a JSON string
+file_writer_settings_instance = FileWriterSettings.from_json(json)
+# print the JSON string representation of the object
+print(FileWriterSettings.to_json())
+
+# convert the object into a dict
+file_writer_settings_dict = file_writer_settings_instance.to_dict()
+# create an instance of FileWriterSettings from a dict
+file_writer_settings_from_dict = FileWriterSettings.from_dict(file_writer_settings_dict)
+

[Back to Model list] [Back to API list] [Back to README]

\ No newline at end of file diff --git a/python_client/docs/FpgaStatusInner.html b/python_client/docs/FpgaStatusInner.html new file mode 100644 index 00000000..ea2de4c3 --- /dev/null +++ b/python_client/docs/FpgaStatusInner.html @@ -0,0 +1,14 @@ + FpgaStatusInner — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

FpgaStatusInner

Properties

Name

Type

Description

Notes

pci_dev_id

str

serial_number

str

fw_version

str

base_mac_addr

str

eth_link_count

int

eth_link_status

int

power_usage_w

float

fpga_temp_c

float

hbm_temp_c

float

packets_udp

int

packets_sls

int

idle

bool

pcie_link_speed

int

PCIe link speed measured by generation (expected value is 4 == PCIe Gen4)

pcie_link_width

int

PCIe link width (expected value is 8 == x8)

Example

from jfjoch_client.models.fpga_status_inner import FpgaStatusInner
+
+# TODO update the JSON string below
+json = "{}"
+# create an instance of FpgaStatusInner from a JSON string
+fpga_status_inner_instance = FpgaStatusInner.from_json(json)
+# print the JSON string representation of the object
+print(FpgaStatusInner.to_json())
+
+# convert the object into a dict
+fpga_status_inner_dict = fpga_status_inner_instance.to_dict()
+# create an instance of FpgaStatusInner from a dict
+fpga_status_inner_from_dict = FpgaStatusInner.from_dict(fpga_status_inner_dict)
+

[Back to Model list] [Back to API list] [Back to README]

\ No newline at end of file diff --git a/python_client/docs/GeomRefinementAlgorithm.html b/python_client/docs/GeomRefinementAlgorithm.html new file mode 100644 index 00000000..6b469f74 --- /dev/null +++ b/python_client/docs/GeomRefinementAlgorithm.html @@ -0,0 +1 @@ + GeomRefinementAlgorithm — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

GeomRefinementAlgorithm

Selection of an post-indexing detector geometry refinement algorithm used by Jungfraujoch. This option is using non-linear least squares optimization to find unit cell and beam center.

Enum

  • BEAMCENTER (value: 'BeamCenter')

  • NONE (value: 'None')

[Back to Model list] [Back to API list] [Back to README]

\ No newline at end of file diff --git a/python_client/docs/GridPlot.html b/python_client/docs/GridPlot.html new file mode 100644 index 00000000..145deaf1 --- /dev/null +++ b/python_client/docs/GridPlot.html @@ -0,0 +1,14 @@ + GridPlot — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

GridPlot

Properties

Name

Type

Description

Notes

data

List[float]

width

int

Example

from jfjoch_client.models.grid_plot import GridPlot
+
+# TODO update the JSON string below
+json = "{}"
+# create an instance of GridPlot from a JSON string
+grid_plot_instance = GridPlot.from_json(json)
+# print the JSON string representation of the object
+print(GridPlot.to_json())
+
+# convert the object into a dict
+grid_plot_dict = grid_plot_instance.to_dict()
+# create an instance of GridPlot from a dict
+grid_plot_from_dict = GridPlot.from_dict(grid_plot_dict)
+

[Back to Model list] [Back to API list] [Back to README]

\ No newline at end of file diff --git a/python_client/docs/GridPlots.html b/python_client/docs/GridPlots.html new file mode 100644 index 00000000..8c33a69a --- /dev/null +++ b/python_client/docs/GridPlots.html @@ -0,0 +1,14 @@ + GridPlots — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

GridPlots

Properties

Name

Type

Description

Notes

plots

List[GridPlot]

width

int

Example

from jfjoch_client.models.grid_plots import GridPlots
+
+# TODO update the JSON string below
+json = "{}"
+# create an instance of GridPlots from a JSON string
+grid_plots_instance = GridPlots.from_json(json)
+# print the JSON string representation of the object
+print(GridPlots.to_json())
+
+# convert the object into a dict
+grid_plots_dict = grid_plots_instance.to_dict()
+# create an instance of GridPlots from a dict
+grid_plots_from_dict = GridPlots.from_dict(grid_plots_dict)
+

[Back to Model list] [Back to API list] [Back to README]

\ No newline at end of file diff --git a/python_client/docs/GridScan.html b/python_client/docs/GridScan.html new file mode 100644 index 00000000..fa5bfc7c --- /dev/null +++ b/python_client/docs/GridScan.html @@ -0,0 +1,14 @@ + GridScan — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

GridScan

Definition of a grid scan (mutually exclusive with rotation_axis)

Properties

Name

Type

Description

Notes

n_fast

int

Number of elements in the fast direction

step_x_um

float

Step in grid along the fast direction. Can be negative. Positive number: left to right Negative number: right to left

step_y_um

float

Step in grid along the slow direction. Can be negative. Positive number: top to bottom Negative number: bottom to top

vertical

bool

If disabled: fast direction = X, slow direction = Y If enabled: fast direction = Y, slow direction = X

[optional] [default to False]

snake

bool

Flip fast direction for every second row

[optional] [default to False]

Example

from jfjoch_client.models.grid_scan import GridScan
+
+# TODO update the JSON string below
+json = "{}"
+# create an instance of GridScan from a JSON string
+grid_scan_instance = GridScan.from_json(json)
+# print the JSON string representation of the object
+print(GridScan.to_json())
+
+# convert the object into a dict
+grid_scan_dict = grid_scan_instance.to_dict()
+# create an instance of GridScan from a dict
+grid_scan_from_dict = GridScan.from_dict(grid_scan_dict)
+

[Back to Model list] [Back to API list] [Back to README]

\ No newline at end of file diff --git a/python_client/docs/GridScanResult.html b/python_client/docs/GridScanResult.html new file mode 100644 index 00000000..6ede2bf1 --- /dev/null +++ b/python_client/docs/GridScanResult.html @@ -0,0 +1,14 @@ + GridScanResult — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

GridScanResult

Results of a grid scan

Properties

Name

Type

Description

Notes

det_img

List[int]

Detector image number for a given cell

bkg_estimate

List[float]

spot_count

List[int]

indexed_lattices

List[int]

mosaicity

List[float]

b_factor

List[float]

Example

from jfjoch_client.models.grid_scan_result import GridScanResult
+
+# TODO update the JSON string below
+json = "{}"
+# create an instance of GridScanResult from a JSON string
+grid_scan_result_instance = GridScanResult.from_json(json)
+# print the JSON string representation of the object
+print(GridScanResult.to_json())
+
+# convert the object into a dict
+grid_scan_result_dict = grid_scan_result_instance.to_dict()
+# create an instance of GridScanResult from a dict
+grid_scan_result_from_dict = GridScanResult.from_dict(grid_scan_result_dict)
+

[Back to Model list] [Back to API list] [Back to README]

\ No newline at end of file diff --git a/python_client/docs/GridScanResultImagesInner.html b/python_client/docs/GridScanResultImagesInner.html new file mode 100644 index 00000000..8099b92f --- /dev/null +++ b/python_client/docs/GridScanResultImagesInner.html @@ -0,0 +1,14 @@ + GridScanResultImagesInner — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

GridScanResultImagesInner

Properties

Name

Type

Description

Notes

efficiency

float

number

int

Detector image number for a given cell

bkg

float

Background estimate

[optional]

spots

int

Spot count

[optional]

index

int

Indexing solution

[optional]

mos

float

Mosaicity estimate

[optional]

b

float

B-Factor estimate

[optional]

uc

UnitCell

[optional]

Example

from jfjoch_client.models.grid_scan_result_images_inner import GridScanResultImagesInner
+
+# TODO update the JSON string below
+json = "{}"
+# create an instance of GridScanResultImagesInner from a JSON string
+grid_scan_result_images_inner_instance = GridScanResultImagesInner.from_json(json)
+# print the JSON string representation of the object
+print(GridScanResultImagesInner.to_json())
+
+# convert the object into a dict
+grid_scan_result_images_inner_dict = grid_scan_result_images_inner_instance.to_dict()
+# create an instance of GridScanResultImagesInner from a dict
+grid_scan_result_images_inner_from_dict = GridScanResultImagesInner.from_dict(grid_scan_result_images_inner_dict)
+

[Back to Model list] [Back to API list] [Back to README]

\ No newline at end of file diff --git a/python_client/docs/ImageBufferStatus.html b/python_client/docs/ImageBufferStatus.html new file mode 100644 index 00000000..ba3418d8 --- /dev/null +++ b/python_client/docs/ImageBufferStatus.html @@ -0,0 +1,14 @@ + ImageBufferStatus — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

ImageBufferStatus

Properties

Name

Type

Description

Notes

min_image_number

int

Smallest image number available in the buffer

max_image_number

int

Largest image number available in the buffer

image_numbers

List[int]

Image numbers currently present in the buffer.

total_slots

int

Number of slots in the image buffer. This number, compared to number of images in data collection and frame rate will determine &quot;retention&quot; rate of the image buffer.

available_slots

int

Slots available for the data collection

in_preparation_slots

int

Number of slots in the image buffer that are currently in preparation for sending.

in_sending_slots

int

Number of slots in the image buffer that are currently sending/writing data.

current_counter

int

Counter of changes in the image buffer - either new start message or new image added. For optimization one can only load new images/datasets from the HTTP if this value changes. Counter is optional as it was not implemented in older versions to avoid breaking change

[optional]

Example

from jfjoch_client.models.image_buffer_status import ImageBufferStatus
+
+# TODO update the JSON string below
+json = "{}"
+# create an instance of ImageBufferStatus from a JSON string
+image_buffer_status_instance = ImageBufferStatus.from_json(json)
+# print the JSON string representation of the object
+print(ImageBufferStatus.to_json())
+
+# convert the object into a dict
+image_buffer_status_dict = image_buffer_status_instance.to_dict()
+# create an instance of ImageBufferStatus from a dict
+image_buffer_status_from_dict = ImageBufferStatus.from_dict(image_buffer_status_dict)
+

[Back to Model list] [Back to API list] [Back to README]

\ No newline at end of file diff --git a/python_client/docs/ImageFormatSettings.html b/python_client/docs/ImageFormatSettings.html new file mode 100644 index 00000000..9b483f45 --- /dev/null +++ b/python_client/docs/ImageFormatSettings.html @@ -0,0 +1,14 @@ + ImageFormatSettings — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

ImageFormatSettings

Properties

Name

Type

Description

Notes

summation

bool

Enable summation of images to a given image_time If disabled images are saved according to original detector speed, but image count is adjusted

geometry_transform

bool

Place module read-out into their location on composed detector and extend multipixels

jungfrau_conversion

bool

Convert pixel value in ADU to photon counts/energy Only affects JUNGFRAU detector

jungfrau_conversion_factor_ke_v

float

Used to convert energy deposited into pixel to counts If not provided incident_energy_keV is used

[optional]

bit_depth_image

int

Bit depth of resulting image (it doesn’t affect the detector read-out value) If not provided value is adjusted automatically

[optional]

signed_output

bool

Controls if pixels have signed output If not provided value is adjusted automatically

[optional]

mask_module_edges

bool

Mask 1 pixel on the module boundary

[default to True]

mask_chip_edges

bool

Mask multipixels on chip boundary

[default to True]

jungfrau_mask_pixels_without_g0

bool

JUNGFRAU: mask pixels that don’t operate in G0, but do operate in G1 and G1. This should be turned off for cases, where detector is operated at room temperature with long exposure time.

[optional] [default to True]

apply_mask

bool

Masked pixels are set to special value in the images produced by Jungfraujoch

[default to False]

jungfrau_pedestal_g0_rms_limit

int

Pixels with pedestal G0 RMS above the threshold are marked as masked pixels

[optional] [default to 100]

Example

from jfjoch_client.models.image_format_settings import ImageFormatSettings
+
+# TODO update the JSON string below
+json = "{}"
+# create an instance of ImageFormatSettings from a JSON string
+image_format_settings_instance = ImageFormatSettings.from_json(json)
+# print the JSON string representation of the object
+print(ImageFormatSettings.to_json())
+
+# convert the object into a dict
+image_format_settings_dict = image_format_settings_instance.to_dict()
+# create an instance of ImageFormatSettings from a dict
+image_format_settings_from_dict = ImageFormatSettings.from_dict(image_format_settings_dict)
+

[Back to Model list] [Back to API list] [Back to README]

\ No newline at end of file diff --git a/python_client/docs/ImagePusherStatus.html b/python_client/docs/ImagePusherStatus.html new file mode 100644 index 00000000..b38e29f3 --- /dev/null +++ b/python_client/docs/ImagePusherStatus.html @@ -0,0 +1,14 @@ + ImagePusherStatus — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

ImagePusherStatus

Informs about status of the image pusher.

Properties

Name

Type

Description

Notes

pusher_type

ImagePusherType

[default to ImagePusherType.NONE]

addr

List[str]

List of addresses of image pushers. For HDF5 socket - no addresses will be returned. For ZeroMQ - list of addresses for each socket will be provided. For TCP/IP - single address to connect all writers will be provided.

connected_writers

int

Number of connected writers For ZeroMQ image socket: number is constant For TCP/IP image socket: number is updated live during operation

images_written

int

Number of images written to the image socket. This number is updated live during operation for TCP/IP image socket and direct HDF5 writer. It is updated at the end of experiment for ZeroMQ image socket.

[optional]

images_write_error

int

Number of images that could not be written to the image socket. This number is updated live during operation for TCP/IP image socket. No other socket use it.

[optional]

writer_fifo_utilization

List[int]

Utilization of internal writer FIFO. This number is updated live during operation for TCP/IP image socket. No other socket use it.

[optional]

Example

from jfjoch_client.models.image_pusher_status import ImagePusherStatus
+
+# TODO update the JSON string below
+json = "{}"
+# create an instance of ImagePusherStatus from a JSON string
+image_pusher_status_instance = ImagePusherStatus.from_json(json)
+# print the JSON string representation of the object
+print(ImagePusherStatus.to_json())
+
+# convert the object into a dict
+image_pusher_status_dict = image_pusher_status_instance.to_dict()
+# create an instance of ImagePusherStatus from a dict
+image_pusher_status_from_dict = ImagePusherStatus.from_dict(image_pusher_status_dict)
+

[Back to Model list] [Back to API list] [Back to README]

\ No newline at end of file diff --git a/python_client/docs/ImagePusherType.html b/python_client/docs/ImagePusherType.html new file mode 100644 index 00000000..88e07bd4 --- /dev/null +++ b/python_client/docs/ImagePusherType.html @@ -0,0 +1 @@ + ImagePusherType — Jungfraujoch 1.0.0-rc.144 documentation Skip to content
\ No newline at end of file diff --git a/python_client/docs/IndexingAlgorithm.html b/python_client/docs/IndexingAlgorithm.html new file mode 100644 index 00000000..dd65333d --- /dev/null +++ b/python_client/docs/IndexingAlgorithm.html @@ -0,0 +1 @@ + IndexingAlgorithm — Jungfraujoch 1.0.0-rc.144 documentation Skip to content
\ No newline at end of file diff --git a/python_client/docs/IndexingSettings.html b/python_client/docs/IndexingSettings.html new file mode 100644 index 00000000..28bc1896 --- /dev/null +++ b/python_client/docs/IndexingSettings.html @@ -0,0 +1,14 @@ + IndexingSettings — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

IndexingSettings

Settings for crystallography indexing

Properties

Name

Type

Description

Notes

algorithm

IndexingAlgorithm

[default to IndexingAlgorithm.FFBIDX]

fft_max_unit_cell_a

float

Largest unit cell to be indexed by FFT algorithm; parameter value affects execution time of FFT

[default to 250]

fft_min_unit_cell_a

float

Smallest unit cell to be indexed by FFT algorithm; parameter value affects execution time of FFT

[default to 10.0]

fft_high_resolution_a

float

Highest resolution of spots used for FFT algorithm; parameter value affects execution time of FFT. There is also correlation between smallest unit cell and max resolution, which need to be checked for very small systems.

[default to 2.0]

fft_num_vectors

int

Number of search directions for the FFT algorithm; parameter value affects execution time of FFT.

[default to 16384]

tolerance

float

Acceptance tolerance for spots after the indexing run - the larger the number, the more spots will be accepted

thread_count

int

Thread count for indexing algorithm

geom_refinement_algorithm

GeomRefinementAlgorithm

unit_cell_dist_tolerance

float

Relative distance tolerance for unit cell vs. reference; Lattices outside given tolerance will be ignored

[default to 0.05]

viable_cell_min_spots

int

Minimum number of indexed spots required for a cell to be considered viable

[default to 10]

index_ice_rings

bool

Include spots marked as ice rings in the indexing run. If `dataset_settings` doesn’t have `detect_ice_rings` on, this option will have no effect on processing.

[default to False]

rotation_indexing

bool

[default to False]

rotation_indexing_min_angular_range_deg

float

[default to 20.0]

rotation_indexing_angular_stride_deg

float

[default to 0.5]

blocking

bool

Indexing in Jungfraujoch goes with a dedicated thread pool. If set to false, the thread pool is non-blocking, i.e. if there are no threads available, image indexing will be skipped. This option is recommended for real-time processing at high frame rates. If set to true, the thread pool will block until a thread is available.

[default to True]

Example

from jfjoch_client.models.indexing_settings import IndexingSettings
+
+# TODO update the JSON string below
+json = "{}"
+# create an instance of IndexingSettings from a JSON string
+indexing_settings_instance = IndexingSettings.from_json(json)
+# print the JSON string representation of the object
+print(IndexingSettings.to_json())
+
+# convert the object into a dict
+indexing_settings_dict = indexing_settings_instance.to_dict()
+# create an instance of IndexingSettings from a dict
+indexing_settings_from_dict = IndexingSettings.from_dict(indexing_settings_dict)
+

[Back to Model list] [Back to API list] [Back to README]

\ No newline at end of file diff --git a/python_client/docs/InstrumentMetadata.html b/python_client/docs/InstrumentMetadata.html new file mode 100644 index 00000000..2dbfc919 --- /dev/null +++ b/python_client/docs/InstrumentMetadata.html @@ -0,0 +1,14 @@ + InstrumentMetadata — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

InstrumentMetadata

Metadata for a measurement instrument

Properties

Name

Type

Description

Notes

source_name

str

source_type

str

Type of radiation source. NXmx gives a fixed dictionary, though Jungfraujoch is not enforcing compliance. https://manual.nexusformat.org/classes/base_classes/NXsource.html#nxsource NXsource allows the following: Spallation Neutron Source Pulsed Reactor Neutron Source Reactor Neutron Source Synchrotron X-ray Source Pulsed Muon Source Rotating Anode X-ray Fixed Tube X-ray UV Laser Free-Electron Laser Optical Laser Ion Source UV Plasma Source Metal Jet X-ray

[optional] [default to ‘’]

instrument_name

str

pulsed_source

bool

Settings specific to XFEL (e.g., every image has to come from TTL trigger, save pulse ID and event code)

[optional] [default to False]

electron_source

bool

Settings specific to electron source (e.g., wavelength definition)

[optional] [default to False]

Example

from jfjoch_client.models.instrument_metadata import InstrumentMetadata
+
+# TODO update the JSON string below
+json = "{}"
+# create an instance of InstrumentMetadata from a JSON string
+instrument_metadata_instance = InstrumentMetadata.from_json(json)
+# print the JSON string representation of the object
+print(InstrumentMetadata.to_json())
+
+# convert the object into a dict
+instrument_metadata_dict = instrument_metadata_instance.to_dict()
+# create an instance of InstrumentMetadata from a dict
+instrument_metadata_from_dict = InstrumentMetadata.from_dict(instrument_metadata_dict)
+

[Back to Model list] [Back to API list] [Back to README]

\ No newline at end of file diff --git a/python_client/docs/JfjochBrokerApi.html b/python_client/docs/JfjochBrokerApi.html new file mode 100644 index 00000000..326fdc64 --- /dev/null +++ b/python_client/docs/JfjochBrokerApi.html @@ -0,0 +1,24 @@ + jfjoch_client.JfjochBrokerApi — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

jfjoch_client.JfjochBrokerApi

All URIs are relative to http://localhost:5232

Method

HTTP request

Description

config_zeromq_metadata_put

PUT /config/zeromq_metadata

Set ZeroMQ metadata settings

config_zeromq_metadata_put

config_zeromq_metadata_put(zeromq_metadata_settings=zeromq_metadata_settings)

Set ZeroMQ metadata settings

Jungfraujoch can generate metadata message stream on ZeroMQ PUB socket. This stream covers all images. Here settings of the socket can be adjusted. While the data structure contains also socket_address, this cannot be changed via HTTP and is ignore in PUT request.

Example

import jfjoch_client
+from jfjoch_client.models.zeromq_metadata_settings import ZeromqMetadataSettings
+from jfjoch_client.rest import ApiException
+from pprint import pprint
+
+# Defining the host is optional and defaults to http://localhost:5232
+# See configuration.py for a list of all supported configuration parameters.
+configuration = jfjoch_client.Configuration(
+    host = "http://localhost:5232"
+)
+
+
+# Enter a context with an instance of the API client
+with jfjoch_client.ApiClient(configuration) as api_client:
+    # Create an instance of the API class
+    api_instance = jfjoch_client.JfjochBrokerApi(api_client)
+    zeromq_metadata_settings = jfjoch_client.ZeromqMetadataSettings() # ZeromqMetadataSettings |  (optional)
+
+    try:
+        # Set ZeroMQ metadata settings
+        api_instance.config_zeromq_metadata_put(zeromq_metadata_settings=zeromq_metadata_settings)
+    except Exception as e:
+        print("Exception when calling JfjochBrokerApi->config_zeromq_metadata_put: %s\n" % e)
+

Parameters

Name

Type

Description

Notes

zeromq_metadata_settings

ZeromqMetadataSettings

[optional]

Return type

void (empty response body)

Authorization

No authorization required

HTTP request headers

  • Content-Type: application/json

  • Accept: text/plain, application/json

HTTP response details

Status code

Description

Response headers

200

Everything OK

-

400

Input parsing or validation error

-

500

Error within Jungfraujoch code - see output message.

-

[Back to top] [Back to API list] [Back to Model list] [Back to README]

\ No newline at end of file diff --git a/python_client/docs/JfjochSettings.html b/python_client/docs/JfjochSettings.html new file mode 100644 index 00000000..6cd793dc --- /dev/null +++ b/python_client/docs/JfjochSettings.html @@ -0,0 +1,14 @@ + JfjochSettings — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

JfjochSettings

Default settings for Jungfraujoch software. This structure is used to provide default settings using configuration JSON file and is not used in HTTP.

Properties

Name

Type

Description

Notes

pcie

List[PcieDevicesInner]

[optional]

zeromq

ZeromqSettings

[optional]

tcp

TcpSettings

[optional]

instrument

InstrumentMetadata

[optional]

file_writer

FileWriterSettings

[optional]

detector

List[Detector]

indexing

IndexingSettings

[optional]

detector_settings

DetectorSettings

[optional]

azim_int

AzimIntSettings

[optional]

image_format

ImageFormatSettings

[optional]

image_buffer_mi_b

int

Size of internal buffer in MiB for images before they are sent to a stream

[optional] [default to 2048]

verbose

bool

Print extra debug information

[optional] [default to False]

receiver_threads

int

Number of threads used by the receiver

[optional] [default to 64]

numa_policy

str

NUMA policy to bind CPUs

[optional]

frontend_directory

str

Location of built JavaScript web frontend

spot_finding

SpotFindingSettings

[optional]

image_pusher

ImagePusherType

[default to ImagePusherType.NONE]

zeromq_preview

ZeromqPreviewSettings

[optional]

zeromq_metadata

ZeromqMetadataSettings

[optional]

dark_mask

DarkMaskSettings

[optional]

Example

from jfjoch_client.models.jfjoch_settings import JfjochSettings
+
+# TODO update the JSON string below
+json = "{}"
+# create an instance of JfjochSettings from a JSON string
+jfjoch_settings_instance = JfjochSettings.from_json(json)
+# print the JSON string representation of the object
+print(JfjochSettings.to_json())
+
+# convert the object into a dict
+jfjoch_settings_dict = jfjoch_settings_instance.to_dict()
+# create an instance of JfjochSettings from a dict
+jfjoch_settings_from_dict = JfjochSettings.from_dict(jfjoch_settings_dict)
+

[Back to Model list] [Back to API list] [Back to README]

\ No newline at end of file diff --git a/python_client/docs/JfjochSettingsSsl.html b/python_client/docs/JfjochSettingsSsl.html new file mode 100644 index 00000000..7e9bd5ca --- /dev/null +++ b/python_client/docs/JfjochSettingsSsl.html @@ -0,0 +1,14 @@ + JfjochSettingsSsl — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

JfjochSettingsSsl

Properties

Name

Type

Description

Notes

certificate

str

key

str

Example

from jfjoch_client.models.jfjoch_settings_ssl import JfjochSettingsSsl
+
+# TODO update the JSON string below
+json = "{}"
+# create an instance of JfjochSettingsSsl from a JSON string
+jfjoch_settings_ssl_instance = JfjochSettingsSsl.from_json(json)
+# print the JSON string representation of the object
+print(JfjochSettingsSsl.to_json())
+
+# convert the object into a dict
+jfjoch_settings_ssl_dict = jfjoch_settings_ssl_instance.to_dict()
+# create an instance of JfjochSettingsSsl from a dict
+jfjoch_settings_ssl_from_dict = JfjochSettingsSsl.from_dict(jfjoch_settings_ssl_dict)
+

[Back to Model list] [Back to API list] [Back to README]

\ No newline at end of file diff --git a/python_client/docs/JfjochStatistics.html b/python_client/docs/JfjochStatistics.html new file mode 100644 index 00000000..b6e3d736 --- /dev/null +++ b/python_client/docs/JfjochStatistics.html @@ -0,0 +1,14 @@ + JfjochStatistics — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

JfjochStatistics

Pool statistics for Jungfraujoch to reduce transfers between frontend and jfjoch_broker

Properties

Name

Type

Description

Notes

detector

DetectorStatus

[optional]

detector_list

DetectorList

[optional]

detector_settings

DetectorSettings

[optional]

image_format_settings

ImageFormatSettings

[optional]

instrument_metadata

InstrumentMetadata

[optional]

file_writer_settings

FileWriterSettings

[optional]

data_processing_settings

SpotFindingSettings

[optional]

measurement

MeasurementStatistics

[optional]

broker

BrokerStatus

[optional]

fpga

List[FpgaStatusInner]

[optional]

calibration

List[CalibrationStatisticsInner]

[optional]

zeromq_preview

ZeromqPreviewSettings

[optional]

zeromq_metadata

ZeromqMetadataSettings

[optional]

dark_mask

DarkMaskSettings

[optional]

pixel_mask

PixelMaskStatistics

[optional]

roi

RoiDefinitions

[optional]

az_int

AzimIntSettings

[optional]

buffer

ImageBufferStatus

[optional]

indexing

IndexingSettings

[optional]

image_pusher

ImagePusherStatus

[optional]

Example

from jfjoch_client.models.jfjoch_statistics import JfjochStatistics
+
+# TODO update the JSON string below
+json = "{}"
+# create an instance of JfjochStatistics from a JSON string
+jfjoch_statistics_instance = JfjochStatistics.from_json(json)
+# print the JSON string representation of the object
+print(JfjochStatistics.to_json())
+
+# convert the object into a dict
+jfjoch_statistics_dict = jfjoch_statistics_instance.to_dict()
+# create an instance of JfjochStatistics from a dict
+jfjoch_statistics_from_dict = JfjochStatistics.from_dict(jfjoch_statistics_dict)
+

[Back to Model list] [Back to API list] [Back to README]

\ No newline at end of file diff --git a/python_client/docs/MeasurementStatistics.html b/python_client/docs/MeasurementStatistics.html new file mode 100644 index 00000000..9d6e82ca --- /dev/null +++ b/python_client/docs/MeasurementStatistics.html @@ -0,0 +1,14 @@ + MeasurementStatistics — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

MeasurementStatistics

Properties

Name

Type

Description

Notes

file_prefix

str

[optional]

run_number

int

Number of data collection run. This can be either automatically incremented or provided externally for each data collection.

[optional]

experiment_group

str

Name of group owning the data (e.g. p-group or proposal number).

[optional]

images_expected

int

[optional]

images_collected

int

Images collected by the receiver. This number will be lower than images expected if there were issues with data collection performance.

[optional]

images_sent

int

Images sent to the writer. The value does not include images discarded by lossy compression filter and images not forwarded due to full ZeroMQ queue.

[optional]

images_written

int

Images successfully written to disk. The value is live updated for TCP/IP socket and direct HDF5 writer, while for ZeroMQ it is only updated at the end of experiment.

[optional]

images_discarded_lossy_compression

int

Images discarded by the lossy compression filter

[optional]

max_image_number_sent

int

[optional]

collection_efficiency

float

[optional]

compression_ratio

float

[optional]

cancelled

bool

[optional]

max_receiver_delay

int

[optional]

indexing_rate

float

[optional]

detector_width

int

[optional]

detector_height

int

[optional]

detector_pixel_depth

int

[optional]

bkg_estimate

float

[optional]

unit_cell

str

[optional]

error_pixels

float

Moving average of 1000 images counting number of error pixels on the detector

[optional]

saturated_pixels

float

Moving average of 1000 images counting number of saturated pixels on the detector

[optional]

roi_beam_pixels

float

If there is an ROI defined with name &quot;beam&quot;, this number will hold moving average of 1000 images for number of valid pixels within this ROI

[optional]

roi_beam_sum

float

If there is an ROI defined with name &quot;beam&quot;, this number will hold moving average of 1000 images for sum of valid pixels within this ROI

[optional]

Example

from jfjoch_client.models.measurement_statistics import MeasurementStatistics
+
+# TODO update the JSON string below
+json = "{}"
+# create an instance of MeasurementStatistics from a JSON string
+measurement_statistics_instance = MeasurementStatistics.from_json(json)
+# print the JSON string representation of the object
+print(MeasurementStatistics.to_json())
+
+# convert the object into a dict
+measurement_statistics_dict = measurement_statistics_instance.to_dict()
+# create an instance of MeasurementStatistics from a dict
+measurement_statistics_from_dict = MeasurementStatistics.from_dict(measurement_statistics_dict)
+

[Back to Model list] [Back to API list] [Back to README]

\ No newline at end of file diff --git a/python_client/docs/PcieDevicesInner.html b/python_client/docs/PcieDevicesInner.html new file mode 100644 index 00000000..66c1e61a --- /dev/null +++ b/python_client/docs/PcieDevicesInner.html @@ -0,0 +1,14 @@ + PcieDevicesInner — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

PcieDevicesInner

Properties

Name

Type

Description

Notes

blk

str

Block device name

[optional]

ipv4

str

IPv4 address of the block device

[optional]

Example

from jfjoch_client.models.pcie_devices_inner import PcieDevicesInner
+
+# TODO update the JSON string below
+json = "{}"
+# create an instance of PcieDevicesInner from a JSON string
+pcie_devices_inner_instance = PcieDevicesInner.from_json(json)
+# print the JSON string representation of the object
+print(PcieDevicesInner.to_json())
+
+# convert the object into a dict
+pcie_devices_inner_dict = pcie_devices_inner_instance.to_dict()
+# create an instance of PcieDevicesInner from a dict
+pcie_devices_inner_from_dict = PcieDevicesInner.from_dict(pcie_devices_inner_dict)
+

[Back to Model list] [Back to API list] [Back to README]

\ No newline at end of file diff --git a/python_client/docs/PixelMaskStatistics.html b/python_client/docs/PixelMaskStatistics.html new file mode 100644 index 00000000..7d2efc2e --- /dev/null +++ b/python_client/docs/PixelMaskStatistics.html @@ -0,0 +1,14 @@ + PixelMaskStatistics — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

PixelMaskStatistics

Properties

Name

Type

Description

Notes

user_mask

int

Number of pixels masked using the user mask

[optional]

too_high_pedestal_rms

int

Number of pixels with G0 pedestal RMS higher than provided threshold

[optional]

wrong_gain

int

Number of pixels that show wrong gain level during the pedestal procedure

[optional]

Example

from jfjoch_client.models.pixel_mask_statistics import PixelMaskStatistics
+
+# TODO update the JSON string below
+json = "{}"
+# create an instance of PixelMaskStatistics from a JSON string
+pixel_mask_statistics_instance = PixelMaskStatistics.from_json(json)
+# print the JSON string representation of the object
+print(PixelMaskStatistics.to_json())
+
+# convert the object into a dict
+pixel_mask_statistics_dict = pixel_mask_statistics_instance.to_dict()
+# create an instance of PixelMaskStatistics from a dict
+pixel_mask_statistics_from_dict = PixelMaskStatistics.from_dict(pixel_mask_statistics_dict)
+

[Back to Model list] [Back to API list] [Back to README]

\ No newline at end of file diff --git a/python_client/docs/Plot.html b/python_client/docs/Plot.html new file mode 100644 index 00000000..79ec64ac --- /dev/null +++ b/python_client/docs/Plot.html @@ -0,0 +1,14 @@ + Plot — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

Plot

x and y coordinates for plotting, it is OK to assume that both arrays have the same size; layout is optimized for Plotly

Properties

Name

Type

Description

Notes

title

str

[default to ‘’]

x

List[float]

y

List[Optional[float]]

z

List[Optional[float]]

[optional]

Example

from jfjoch_client.models.plot import Plot
+
+# TODO update the JSON string below
+json = "{}"
+# create an instance of Plot from a JSON string
+plot_instance = Plot.from_json(json)
+# print the JSON string representation of the object
+print(Plot.to_json())
+
+# convert the object into a dict
+plot_dict = plot_instance.to_dict()
+# create an instance of Plot from a dict
+plot_from_dict = Plot.from_dict(plot_dict)
+

[Back to Model list] [Back to API list] [Back to README]

\ No newline at end of file diff --git a/python_client/docs/PlotTypeEnum.html b/python_client/docs/PlotTypeEnum.html new file mode 100644 index 00000000..e7da1047 --- /dev/null +++ b/python_client/docs/PlotTypeEnum.html @@ -0,0 +1 @@ + PlotTypeEnum — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

PlotTypeEnum

Enum

  • BKG_ESTIMATE (value: 'bkg_estimate')

  • AZINT (value: 'azint')

  • SPOT_COUNT (value: 'spot_count')

  • INDEXING_RATE (value: 'indexing_rate')

  • INDEXING_UNIT_CELL_LENGTH (value: 'indexing_unit_cell_length')

  • INDEXING_UNIT_CELL_ANGLE (value: 'indexing_unit_cell_angle')

  • ERROR_PIXELS (value: 'error_pixels')

  • IMAGE_COLLECTION_EFFICIENCY (value: 'image_collection_efficiency')

  • RECEIVER_DELAY (value: 'receiver_delay')

  • RECEIVER_FREE_SEND_BUF (value: 'receiver_free_send_buf')

  • STRONG_PIXELS (value: 'strong_pixels')

  • ROI_SUM (value: 'roi_sum')

  • ROI_MEAN (value: 'roi_mean')

  • ROI_MAX_COUNT (value: 'roi_max_count')

  • ROI_PIXELS (value: 'roi_pixels')

  • ROI_WEIGHTED_X (value: 'roi_weighted_x')

  • ROI_WEIGHTED_Y (value: 'roi_weighted_y')

  • PACKETS_RECEIVED (value: 'packets_received')

  • MAX_PIXEL_VALUE (value: 'max_pixel_value')

  • RESOLUTION_ESTIMATE (value: 'resolution_estimate')

[Back to Model list] [Back to API list] [Back to README]

\ No newline at end of file diff --git a/python_client/docs/PlotUnitX.html b/python_client/docs/PlotUnitX.html new file mode 100644 index 00000000..036c3710 --- /dev/null +++ b/python_client/docs/PlotUnitX.html @@ -0,0 +1 @@ + PlotUnitX — Jungfraujoch 1.0.0-rc.144 documentation Skip to content
\ No newline at end of file diff --git a/python_client/docs/Plots.html b/python_client/docs/Plots.html new file mode 100644 index 00000000..b969e6af --- /dev/null +++ b/python_client/docs/Plots.html @@ -0,0 +1,14 @@ + Plots — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

Plots

Properties

Name

Type

Description

Notes

title

str

[optional]

unit_x

PlotUnitX

[default to PlotUnitX.IMAGE_NUMBER]

size_x

float

Max X range of the plot

[optional]

size_y

float

Max Y range of the plot

[optional]

plot

List[Plot]

Example

from jfjoch_client.models.plots import Plots
+
+# TODO update the JSON string below
+json = "{}"
+# create an instance of Plots from a JSON string
+plots_instance = Plots.from_json(json)
+# print the JSON string representation of the object
+print(Plots.to_json())
+
+# convert the object into a dict
+plots_dict = plots_instance.to_dict()
+# create an instance of Plots from a dict
+plots_from_dict = Plots.from_dict(plots_dict)
+

[Back to Model list] [Back to API list] [Back to README]

\ No newline at end of file diff --git a/python_client/docs/PreviewSettings.html b/python_client/docs/PreviewSettings.html new file mode 100644 index 00000000..9cc14aa9 --- /dev/null +++ b/python_client/docs/PreviewSettings.html @@ -0,0 +1,14 @@ + PreviewSettings — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

PreviewSettings

Settings for JPEG rendering of preview images

Properties

Name

Type

Description

Notes

saturation

int

Saturation value to set contrast in the preview image

show_spots

bool

Show spot finding results on the image

[optional] [default to True]

show_roi

bool

Show ROI areas on the image

[optional] [default to False]

jpeg_quality

int

Quality of JPEG image (100 - highest; 0 - lowest)

[optional] [default to 100]

show_indexed

bool

Preview indexed images only

[optional] [default to False]

show_user_mask

bool

Show user mask

[optional] [default to False]

resolution_ring

float

[optional] [default to 0.1]

Example

from jfjoch_client.models.preview_settings import PreviewSettings
+
+# TODO update the JSON string below
+json = "{}"
+# create an instance of PreviewSettings from a JSON string
+preview_settings_instance = PreviewSettings.from_json(json)
+# print the JSON string representation of the object
+print(PreviewSettings.to_json())
+
+# convert the object into a dict
+preview_settings_dict = preview_settings_instance.to_dict()
+# create an instance of PreviewSettings from a dict
+preview_settings_from_dict = PreviewSettings.from_dict(preview_settings_dict)
+

[Back to Model list] [Back to API list] [Back to README]

\ No newline at end of file diff --git a/python_client/docs/RoiAzimList.html b/python_client/docs/RoiAzimList.html new file mode 100644 index 00000000..fc40cb47 --- /dev/null +++ b/python_client/docs/RoiAzimList.html @@ -0,0 +1,14 @@ + RoiAzimList — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

RoiAzimList

List of azimuthal ROIs

Properties

Name

Type

Description

Notes

rois

List[RoiAzimuthal]

[optional]

Example

from jfjoch_client.models.roi_azim_list import RoiAzimList
+
+# TODO update the JSON string below
+json = "{}"
+# create an instance of RoiAzimList from a JSON string
+roi_azim_list_instance = RoiAzimList.from_json(json)
+# print the JSON string representation of the object
+print(RoiAzimList.to_json())
+
+# convert the object into a dict
+roi_azim_list_dict = roi_azim_list_instance.to_dict()
+# create an instance of RoiAzimList from a dict
+roi_azim_list_from_dict = RoiAzimList.from_dict(roi_azim_list_dict)
+

[Back to Model list] [Back to API list] [Back to README]

\ No newline at end of file diff --git a/python_client/docs/RoiAzimuthal.html b/python_client/docs/RoiAzimuthal.html new file mode 100644 index 00000000..e9941946 --- /dev/null +++ b/python_client/docs/RoiAzimuthal.html @@ -0,0 +1,14 @@ + RoiAzimuthal — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

RoiAzimuthal

ROI as Q-range (or resolution range)

Properties

Name

Type

Description

Notes

name

str

Name for the ROI; used in the plots

q_min_recip_a

float

Minimum Q-range for the ROI

q_max_recip_a

float

Maximum Q-range for the ROI

Example

from jfjoch_client.models.roi_azimuthal import RoiAzimuthal
+
+# TODO update the JSON string below
+json = "{}"
+# create an instance of RoiAzimuthal from a JSON string
+roi_azimuthal_instance = RoiAzimuthal.from_json(json)
+# print the JSON string representation of the object
+print(RoiAzimuthal.to_json())
+
+# convert the object into a dict
+roi_azimuthal_dict = roi_azimuthal_instance.to_dict()
+# create an instance of RoiAzimuthal from a dict
+roi_azimuthal_from_dict = RoiAzimuthal.from_dict(roi_azimuthal_dict)
+

[Back to Model list] [Back to API list] [Back to README]

\ No newline at end of file diff --git a/python_client/docs/RoiBox.html b/python_client/docs/RoiBox.html new file mode 100644 index 00000000..05619f62 --- /dev/null +++ b/python_client/docs/RoiBox.html @@ -0,0 +1,14 @@ + RoiBox — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

RoiBox

Box ROI

Properties

Name

Type

Description

Notes

name

str

Name for the ROI; used in the plots

min_x_pxl

int

Lower bound (inclusive) in X coordinate for the box

max_x_pxl

int

Upper bound (inclusive) in X coordinate for the box

min_y_pxl

int

Lower bound (inclusive) in Y coordinate for the box

max_y_pxl

int

Upper bound (inclusive) in Y coordinate for the box

Example

from jfjoch_client.models.roi_box import RoiBox
+
+# TODO update the JSON string below
+json = "{}"
+# create an instance of RoiBox from a JSON string
+roi_box_instance = RoiBox.from_json(json)
+# print the JSON string representation of the object
+print(RoiBox.to_json())
+
+# convert the object into a dict
+roi_box_dict = roi_box_instance.to_dict()
+# create an instance of RoiBox from a dict
+roi_box_from_dict = RoiBox.from_dict(roi_box_dict)
+

[Back to Model list] [Back to API list] [Back to README]

\ No newline at end of file diff --git a/python_client/docs/RoiBoxList.html b/python_client/docs/RoiBoxList.html new file mode 100644 index 00000000..7468ea5f --- /dev/null +++ b/python_client/docs/RoiBoxList.html @@ -0,0 +1,14 @@ + RoiBoxList — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

RoiBoxList

List of box ROIs

Properties

Name

Type

Description

Notes

rois

List[RoiBox]

[optional]

Example

from jfjoch_client.models.roi_box_list import RoiBoxList
+
+# TODO update the JSON string below
+json = "{}"
+# create an instance of RoiBoxList from a JSON string
+roi_box_list_instance = RoiBoxList.from_json(json)
+# print the JSON string representation of the object
+print(RoiBoxList.to_json())
+
+# convert the object into a dict
+roi_box_list_dict = roi_box_list_instance.to_dict()
+# create an instance of RoiBoxList from a dict
+roi_box_list_from_dict = RoiBoxList.from_dict(roi_box_list_dict)
+

[Back to Model list] [Back to API list] [Back to README]

\ No newline at end of file diff --git a/python_client/docs/RoiCircle.html b/python_client/docs/RoiCircle.html new file mode 100644 index 00000000..d450ecd6 --- /dev/null +++ b/python_client/docs/RoiCircle.html @@ -0,0 +1,14 @@ + RoiCircle — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

RoiCircle

Circular ROI

Properties

Name

Type

Description

Notes

name

str

Name for the ROI; used in the plots

center_x_pxl

float

X coordinate of center of the circle [pixels]

center_y_pxl

float

Y coordinate of center of the circle [pixels]

radius_pxl

float

Radius of the circle [pixels]

Example

from jfjoch_client.models.roi_circle import RoiCircle
+
+# TODO update the JSON string below
+json = "{}"
+# create an instance of RoiCircle from a JSON string
+roi_circle_instance = RoiCircle.from_json(json)
+# print the JSON string representation of the object
+print(RoiCircle.to_json())
+
+# convert the object into a dict
+roi_circle_dict = roi_circle_instance.to_dict()
+# create an instance of RoiCircle from a dict
+roi_circle_from_dict = RoiCircle.from_dict(roi_circle_dict)
+

[Back to Model list] [Back to API list] [Back to README]

\ No newline at end of file diff --git a/python_client/docs/RoiCircleList.html b/python_client/docs/RoiCircleList.html new file mode 100644 index 00000000..08ef1df3 --- /dev/null +++ b/python_client/docs/RoiCircleList.html @@ -0,0 +1,14 @@ + RoiCircleList — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

RoiCircleList

List of circular ROIs

Properties

Name

Type

Description

Notes

rois

List[RoiCircle]

Example

from jfjoch_client.models.roi_circle_list import RoiCircleList
+
+# TODO update the JSON string below
+json = "{}"
+# create an instance of RoiCircleList from a JSON string
+roi_circle_list_instance = RoiCircleList.from_json(json)
+# print the JSON string representation of the object
+print(RoiCircleList.to_json())
+
+# convert the object into a dict
+roi_circle_list_dict = roi_circle_list_instance.to_dict()
+# create an instance of RoiCircleList from a dict
+roi_circle_list_from_dict = RoiCircleList.from_dict(roi_circle_list_dict)
+

[Back to Model list] [Back to API list] [Back to README]

\ No newline at end of file diff --git a/python_client/docs/RoiDefinitions.html b/python_client/docs/RoiDefinitions.html new file mode 100644 index 00000000..73ca4e96 --- /dev/null +++ b/python_client/docs/RoiDefinitions.html @@ -0,0 +1,14 @@ + RoiDefinitions — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

RoiDefinitions

ROI defintions

Properties

Name

Type

Description

Notes

box

RoiBoxList

circle

RoiCircleList

azim

RoiAzimList

Example

from jfjoch_client.models.roi_definitions import RoiDefinitions
+
+# TODO update the JSON string below
+json = "{}"
+# create an instance of RoiDefinitions from a JSON string
+roi_definitions_instance = RoiDefinitions.from_json(json)
+# print the JSON string representation of the object
+print(RoiDefinitions.to_json())
+
+# convert the object into a dict
+roi_definitions_dict = roi_definitions_instance.to_dict()
+# create an instance of RoiDefinitions from a dict
+roi_definitions_from_dict = RoiDefinitions.from_dict(roi_definitions_dict)
+

[Back to Model list] [Back to API list] [Back to README]

\ No newline at end of file diff --git a/python_client/docs/RotationAxis.html b/python_client/docs/RotationAxis.html new file mode 100644 index 00000000..07abb19d --- /dev/null +++ b/python_client/docs/RotationAxis.html @@ -0,0 +1,14 @@ + RotationAxis — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

RotationAxis

Definition of a crystal rotation axis

Properties

Name

Type

Description

Notes

name

str

Name of rotation axis (e.g., omega, phi)

[optional] [default to ‘omega’]

step

float

Angle step (per image) in degrees

start

float

Start angle in degrees

[optional] [default to 0]

vector

List[float]

Rotation axis

helical_step_um

List[float]

Translation (per image) for helical scan

[optional]

screening_wedge_deg

float

Wedge angle value; used if rotation per image is smaller than increment between images (so particularly in screening)

[optional]

Example

from jfjoch_client.models.rotation_axis import RotationAxis
+
+# TODO update the JSON string below
+json = "{}"
+# create an instance of RotationAxis from a JSON string
+rotation_axis_instance = RotationAxis.from_json(json)
+# print the JSON string representation of the object
+print(RotationAxis.to_json())
+
+# convert the object into a dict
+rotation_axis_dict = rotation_axis_instance.to_dict()
+# create an instance of RotationAxis from a dict
+rotation_axis_from_dict = RotationAxis.from_dict(rotation_axis_dict)
+

[Back to Model list] [Back to API list] [Back to README]

\ No newline at end of file diff --git a/python_client/docs/ScanResult.html b/python_client/docs/ScanResult.html new file mode 100644 index 00000000..063c5afe --- /dev/null +++ b/python_client/docs/ScanResult.html @@ -0,0 +1,14 @@ + ScanResult — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

ScanResult

Results of a scan

Properties

Name

Type

Description

Notes

file_prefix

str

[optional]

rotation_unit_cell

UnitCell

[optional]

rotation_crystal_lattice

List[float]

Real-space crystal lattice 3D vectors in Angstrom. Order is 1st vector (x,y,z), 2nd vector (x,y,z) and 3rd vector (x,y,z)

[optional]

images

List[ScanResultImagesInner]

Example

from jfjoch_client.models.scan_result import ScanResult
+
+# TODO update the JSON string below
+json = "{}"
+# create an instance of ScanResult from a JSON string
+scan_result_instance = ScanResult.from_json(json)
+# print the JSON string representation of the object
+print(ScanResult.to_json())
+
+# convert the object into a dict
+scan_result_dict = scan_result_instance.to_dict()
+# create an instance of ScanResult from a dict
+scan_result_from_dict = ScanResult.from_dict(scan_result_dict)
+

[Back to Model list] [Back to API list] [Back to README]

\ No newline at end of file diff --git a/python_client/docs/ScanResultImagesInner.html b/python_client/docs/ScanResultImagesInner.html new file mode 100644 index 00000000..4e9fd957 --- /dev/null +++ b/python_client/docs/ScanResultImagesInner.html @@ -0,0 +1,14 @@ + ScanResultImagesInner — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

ScanResultImagesInner

Properties

Name

Type

Description

Notes

efficiency

float

number

int

Detector image number for a given cell

nx

int

Cell position in X for grid scan

[optional]

ny

int

Cell position in Y for grid scan

[optional]

angle

float

Rotation angle associated with the image

[optional]

bkg

float

Background estimate

[optional]

spots

int

Spot count

[optional]

spots_low_res

int

Spot count in low resolution range

[optional]

spots_indexed

int

Spot count within indexing tolerance

[optional]

spots_ice

int

Spot count within common ice ring resolutions

[optional]

index

int

Indexing solution

[optional]

pr

float

Profile radius, i.e. how far reflections are from the Ewald sphere

[optional]

b

float

B-Factor estimate

[optional]

uc

UnitCell

[optional]

xfel_pulseid

int

XFEL pulse ID

[optional]

pixel_sum

int

Total sum of all pixels

[optional]

max

int

Max viable pixel

[optional]

sat

int

Number of saturated pixels

[optional]

err

int

Number of error pixels

[optional]

res

float

Diffraction resolution estimate

[optional]

Example

from jfjoch_client.models.scan_result_images_inner import ScanResultImagesInner
+
+# TODO update the JSON string below
+json = "{}"
+# create an instance of ScanResultImagesInner from a JSON string
+scan_result_images_inner_instance = ScanResultImagesInner.from_json(json)
+# print the JSON string representation of the object
+print(ScanResultImagesInner.to_json())
+
+# convert the object into a dict
+scan_result_images_inner_dict = scan_result_images_inner_instance.to_dict()
+# create an instance of ScanResultImagesInner from a dict
+scan_result_images_inner_from_dict = ScanResultImagesInner.from_dict(scan_result_images_inner_dict)
+

[Back to Model list] [Back to API list] [Back to README]

\ No newline at end of file diff --git a/python_client/docs/SpotFindingSettings.html b/python_client/docs/SpotFindingSettings.html new file mode 100644 index 00000000..62205767 --- /dev/null +++ b/python_client/docs/SpotFindingSettings.html @@ -0,0 +1,14 @@ + SpotFindingSettings — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

SpotFindingSettings

Properties

Name

Type

Description

Notes

enable

bool

Enable spot finding. This is temporary setting, i.e. can be changed anytime during data collection. Even if disabled spot finding information will still be send and written, though always with zero spots.

[default to True]

indexing

bool

Enable indexing. This is temporary setting, i.e. can be changed anytime during data collection.

[default to True]

signal_to_noise_threshold

float

photon_count_threshold

int

min_pix_per_spot

int

max_pix_per_spot

int

high_resolution_limit

float

High resolution limit for spot finding [Angstrom]

low_resolution_limit

float

Low resolution limit for spot finding [Angstrom]

high_resolution_limit_for_spot_count_low_res

float

High resolution threshold to consider spot &quot;low resolution&quot; [Angstrom]

quick_integration

bool

Quick integration of Bragg spots in diffraction images. If enabled it will likely reduce performance of Jungfraujoch for datasets with a very high indexing rate. (experimental feature)

[default to False]

ice_ring_width_q_recip_a

float

Width of ice ring in q-space in reciprocal space

[default to 0.02]

high_res_gap_q_recip_a

float

This parameter is used to remove spurious spots at a very high resolution, that sometimes appear due to very low background close to the edge of the detector. If there is a gap in (1/d)-space between spots of at least this size, spots on the side of the gap with high resolution will be discarded. This is optional parameter. This option should be turned OFF for small molecule datasets or for crystals with very low mosaicity, when it is expected to see only few spots in any case.

[optional] [default to 1.5]

Example

from jfjoch_client.models.spot_finding_settings import SpotFindingSettings
+
+# TODO update the JSON string below
+json = "{}"
+# create an instance of SpotFindingSettings from a JSON string
+spot_finding_settings_instance = SpotFindingSettings.from_json(json)
+# print the JSON string representation of the object
+print(SpotFindingSettings.to_json())
+
+# convert the object into a dict
+spot_finding_settings_dict = spot_finding_settings_instance.to_dict()
+# create an instance of SpotFindingSettings from a dict
+spot_finding_settings_from_dict = SpotFindingSettings.from_dict(spot_finding_settings_dict)
+

[Back to Model list] [Back to API list] [Back to README]

\ No newline at end of file diff --git a/python_client/docs/StandardDetectorGeometry.html b/python_client/docs/StandardDetectorGeometry.html new file mode 100644 index 00000000..59af3c23 --- /dev/null +++ b/python_client/docs/StandardDetectorGeometry.html @@ -0,0 +1,14 @@ + StandardDetectorGeometry — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

StandardDetectorGeometry

Regular rectangular geometry, first module is in the bottom left corner of the detector

Properties

Name

Type

Description

Notes

nmodules

int

Number of modules in the detector

gap_x

int

Gap size in X direction [pixels]

[optional] [default to 8]

gap_y

int

Gap size in Y direction [pixels]

[optional] [default to 36]

modules_in_row

int

Number of modules in one row

[optional] [default to 1]

Example

from jfjoch_client.models.standard_detector_geometry import StandardDetectorGeometry
+
+# TODO update the JSON string below
+json = "{}"
+# create an instance of StandardDetectorGeometry from a JSON string
+standard_detector_geometry_instance = StandardDetectorGeometry.from_json(json)
+# print the JSON string representation of the object
+print(StandardDetectorGeometry.to_json())
+
+# convert the object into a dict
+standard_detector_geometry_dict = standard_detector_geometry_instance.to_dict()
+# create an instance of StandardDetectorGeometry from a dict
+standard_detector_geometry_from_dict = StandardDetectorGeometry.from_dict(standard_detector_geometry_dict)
+

[Back to Model list] [Back to API list] [Back to README]

\ No newline at end of file diff --git a/python_client/docs/TcpSettings.html b/python_client/docs/TcpSettings.html new file mode 100644 index 00000000..42c86355 --- /dev/null +++ b/python_client/docs/TcpSettings.html @@ -0,0 +1,14 @@ + TcpSettings — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

TcpSettings

TCP image stream configuration for Jungfraujoch software. This structure is used to provide default settings using configuration JSON file and is not used in HTTP.

Properties

Name

Type

Description

Notes

send_buffer_size

int

Send buffer size for TCP/IP socket

[optional]

image_socket

str

tcp://<IP address>:<port> 0.0.0.0 instead of IP address is accepted and means listening on all network interfaces

[optional]

nwriters

int

Number of TCP/IP writers to be used for streaming images

[optional] [default to 32]

Example

from jfjoch_client.models.tcp_settings import TcpSettings
+
+# TODO update the JSON string below
+json = "{}"
+# create an instance of TcpSettings from a JSON string
+tcp_settings_instance = TcpSettings.from_json(json)
+# print the JSON string representation of the object
+print(TcpSettings.to_json())
+
+# convert the object into a dict
+tcp_settings_dict = tcp_settings_instance.to_dict()
+# create an instance of TcpSettings from a dict
+tcp_settings_from_dict = TcpSettings.from_dict(tcp_settings_dict)
+

[Back to Model list] [Back to API list] [Back to README]

\ No newline at end of file diff --git a/python_client/docs/UnitCell.html b/python_client/docs/UnitCell.html new file mode 100644 index 00000000..f796d8a7 --- /dev/null +++ b/python_client/docs/UnitCell.html @@ -0,0 +1,14 @@ + UnitCell — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

UnitCell

Unit cell parameters. Necessary to run indexing. Units of angstrom and degree

Properties

Name

Type

Description

Notes

a

float

b

float

c

float

alpha

float

beta

float

gamma

float

Example

from jfjoch_client.models.unit_cell import UnitCell
+
+# TODO update the JSON string below
+json = "{}"
+# create an instance of UnitCell from a JSON string
+unit_cell_instance = UnitCell.from_json(json)
+# print the JSON string representation of the object
+print(UnitCell.to_json())
+
+# convert the object into a dict
+unit_cell_dict = unit_cell_instance.to_dict()
+# create an instance of UnitCell from a dict
+unit_cell_from_dict = UnitCell.from_dict(unit_cell_dict)
+

[Back to Model list] [Back to API list] [Back to README]

\ No newline at end of file diff --git a/python_client/docs/ZeromqMetadataSettings.html b/python_client/docs/ZeromqMetadataSettings.html new file mode 100644 index 00000000..8ccdcb04 --- /dev/null +++ b/python_client/docs/ZeromqMetadataSettings.html @@ -0,0 +1,14 @@ + ZeromqMetadataSettings — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

ZeromqMetadataSettings

Properties

Name

Type

Description

Notes

enabled

bool

ZeroMQ metadata socket is enabled.

[default to True]

period_ms

int

Period for generating metadata package sent to the ZeroMQ interface in milliseconds.

[default to 1000]

socket_address

str

PUB ZeroMQ socket for image metadata information. Image metadata are serialized using CBOR. Address follows ZeroMQ convention for sockets - in practice ipc://<socket file> and tcp://<IP address>:<port> sockets are OK. 0.0.0.0 instead of IP address is accepted and means listening on all network interfaces.

[optional]

Example

from jfjoch_client.models.zeromq_metadata_settings import ZeromqMetadataSettings
+
+# TODO update the JSON string below
+json = "{}"
+# create an instance of ZeromqMetadataSettings from a JSON string
+zeromq_metadata_settings_instance = ZeromqMetadataSettings.from_json(json)
+# print the JSON string representation of the object
+print(ZeromqMetadataSettings.to_json())
+
+# convert the object into a dict
+zeromq_metadata_settings_dict = zeromq_metadata_settings_instance.to_dict()
+# create an instance of ZeromqMetadataSettings from a dict
+zeromq_metadata_settings_from_dict = ZeromqMetadataSettings.from_dict(zeromq_metadata_settings_dict)
+

[Back to Model list] [Back to API list] [Back to README]

\ No newline at end of file diff --git a/python_client/docs/ZeromqPreviewSettings.html b/python_client/docs/ZeromqPreviewSettings.html new file mode 100644 index 00000000..e8f77c32 --- /dev/null +++ b/python_client/docs/ZeromqPreviewSettings.html @@ -0,0 +1,14 @@ + ZeromqPreviewSettings — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

ZeromqPreviewSettings

Properties

Name

Type

Description

Notes

enabled

bool

ZeroMQ preview socket is enabled.

[default to True]

period_ms

int

Period for generating preview image sent to the ZeroMQ interface in milliseconds. Default is 1 second. If set to zero, all images will be sent ZeroMQ (should be used only in case of relatively slow data collection). This has no effect on HTTP based preview, which updates always at rate of 1 second.

[default to 1000]

socket_address

str

PUB ZeroMQ socket for preview images. This socket operates at a reduced frame rate. Images are serialized using CBOR. Address follows ZeroMQ convention for sockets - in practice ipc://<socket file> and tcp://<IP address>:<port> sockets are OK. 0.0.0.0 instead of IP address is accepted and means listening on all network interfaces.

[optional]

Example

from jfjoch_client.models.zeromq_preview_settings import ZeromqPreviewSettings
+
+# TODO update the JSON string below
+json = "{}"
+# create an instance of ZeromqPreviewSettings from a JSON string
+zeromq_preview_settings_instance = ZeromqPreviewSettings.from_json(json)
+# print the JSON string representation of the object
+print(ZeromqPreviewSettings.to_json())
+
+# convert the object into a dict
+zeromq_preview_settings_dict = zeromq_preview_settings_instance.to_dict()
+# create an instance of ZeromqPreviewSettings from a dict
+zeromq_preview_settings_from_dict = ZeromqPreviewSettings.from_dict(zeromq_preview_settings_dict)
+

[Back to Model list] [Back to API list] [Back to README]

\ No newline at end of file diff --git a/python_client/docs/ZeromqSettings.html b/python_client/docs/ZeromqSettings.html new file mode 100644 index 00000000..af4ea185 --- /dev/null +++ b/python_client/docs/ZeromqSettings.html @@ -0,0 +1,14 @@ + ZeromqSettings — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

ZeromqSettings

ZeroMQ configuration for Jungfraujoch software. This structure is used to provide default settings using configuration JSON file and is not used in HTTP.

Properties

Name

Type

Description

Notes

send_watermark

int

Watermark for ZeroMQ send queue (number of outstanding messages queued on Jungfraujoch server per queue)

[optional] [default to 100]

send_buffer_size

int

Send buffer size for ZeroMQ socket

[optional]

image_socket

List[str]

PUSH ZeroMQ socket for images. In case multiple sockets are provided, images are streamed over multiple sockets. Images are serialized using CBOR. Address follows ZeroMQ convention for sockets - in practice ipc://<socket file> and tpc://<IP address>:<port> sockets are OK. 0.0.0.0 instead of IP address is accepted and means listening on all network interfaces.

[optional]

writer_notification_socket

str

PULL ZeroMQ socket for notifications from writer that it finished operation. This allows Jungfraujoch to operate in a synchronous manner, with end of acquisition being also end of writing. Address follows ZeroMQ convention for sockets - in practice ipc://<socket file> and tpc://<IP address>:<port> sockets are OK. 0.0.0.0 instead of IP address should be avoided, as this socket address is forwarded to the writer process via START ZerOMQ message and in case of multiple ineterfaces the address might be ambigous. Using * (star) instead of port number is allowed and it means a random free port number.

[optional]

Example

from jfjoch_client.models.zeromq_settings import ZeromqSettings
+
+# TODO update the JSON string below
+json = "{}"
+# create an instance of ZeromqSettings from a JSON string
+zeromq_settings_instance = ZeromqSettings.from_json(json)
+# print the JSON string representation of the object
+print(ZeromqSettings.to_json())
+
+# convert the object into a dict
+zeromq_settings_dict = zeromq_settings_instance.to_dict()
+# create an instance of ZeromqSettings from a dict
+zeromq_settings_from_dict = ZeromqSettings.from_dict(zeromq_settings_dict)
+

[Back to Model list] [Back to API list] [Back to README]

\ No newline at end of file diff --git a/search.html b/search.html new file mode 100644 index 00000000..509875b7 --- /dev/null +++ b/search.html @@ -0,0 +1 @@ + Search — Jungfraujoch 1.0.0-rc.144 documentation Skip to content

Search

Please activate JavaScript to enable the search functionality.

\ No newline at end of file diff --git a/searchindex.js b/searchindex.js new file mode 100644 index 00000000..38251d70 --- /dev/null +++ b/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"alltitles": {"1. Geometry, reciprocal-space mapping, and basic quantities": [[3, "geometry-reciprocal-space-mapping-and-basic-quantities"]], "1.0.0": [[2, "id1"]], "1.0.0-rc.100": [[2, "rc-100"]], "1.0.0-rc.101": [[2, "rc-101"]], "1.0.0-rc.102": [[2, "rc-102"]], "1.0.0-rc.103": [[2, "rc-103"]], "1.0.0-rc.104": [[2, "rc-104"]], "1.0.0-rc.105": [[2, "rc-105"]], "1.0.0-rc.106": [[2, "rc-106"]], "1.0.0-rc.107": [[2, "rc-107"]], "1.0.0-rc.108": [[2, "rc-108"]], "1.0.0-rc.109": [[2, "rc-109"]], "1.0.0-rc.110": [[2, "rc-110"]], "1.0.0-rc.111": [[2, "rc-111"]], "1.0.0-rc.112": [[2, "rc-112"]], "1.0.0-rc.113": [[2, "rc-113"]], "1.0.0-rc.114": [[2, "rc-114"]], "1.0.0-rc.115": [[2, "rc-115"]], "1.0.0-rc.116": [[2, "rc-116"]], "1.0.0-rc.117": [[2, "rc-117"]], "1.0.0-rc.118": [[2, "rc-118"]], "1.0.0-rc.119": [[2, "rc-119"]], "1.0.0-rc.120": [[2, "rc-120"]], "1.0.0-rc.121": [[2, "rc-121"]], "1.0.0-rc.122": [[2, "rc-122"]], "1.0.0-rc.123": [[2, "rc-123"]], "1.0.0-rc.124": [[2, "rc-124"]], "1.0.0-rc.125": [[2, "rc-125"]], "1.0.0-rc.126": [[2, "rc-126"]], "1.0.0-rc.127": [[2, "rc-127"]], "1.0.0-rc.128": [[2, "rc-128"]], "1.0.0-rc.129": [[2, "rc-129"]], "1.0.0-rc.130": [[2, "rc-130"]], "1.0.0-rc.131": [[2, "rc-131"]], "1.0.0-rc.132": [[2, "rc-132"]], "1.0.0-rc.133": [[2, "rc-133"]], "1.0.0-rc.134": [[2, "rc-134"]], "1.0.0-rc.135": [[2, "rc-135"]], "1.0.0-rc.136": [[2, "rc-136"]], "1.0.0-rc.137": [[2, "rc-137"]], "1.0.0-rc.138": [[2, "rc-138"]], "1.0.0-rc.139": [[2, "rc-139"]], "1.0.0-rc.140": [[2, "rc-140"]], "1.0.0-rc.141": [[2, "rc-141"]], "1.0.0-rc.142": [[2, "rc-142"]], "1.0.0-rc.143": [[2, "rc-143"]], "1.0.0-rc.144": [[2, "rc-144"]], "1.0.0-rc.24": [[2, "rc-24"]], "1.0.0-rc.25": [[2, "rc-25"]], "1.0.0-rc.26": [[2, "rc-26"]], "1.0.0-rc.27": [[2, "rc-27"]], "1.0.0-rc.28": [[2, "rc-28"]], "1.0.0-rc.29": [[2, "rc-29"]], "1.0.0-rc.30": [[2, "rc-30"]], "1.0.0-rc.31": [[2, "rc-31"]], "1.0.0-rc.32": [[2, "rc-32"]], "1.0.0-rc.33": [[2, "rc-33"]], "1.0.0-rc.34": [[2, "rc-34"]], "1.0.0-rc.35": [[2, "rc-35"]], "1.0.0-rc.36": [[2, "rc-36"]], "1.0.0-rc.37": [[2, "rc-37"]], "1.0.0-rc.38": [[2, "rc-38"]], "1.0.0-rc.39": [[2, "rc-39"]], "1.0.0-rc.40": [[2, "rc-40"]], "1.0.0-rc.41": [[2, "rc-41"]], "1.0.0-rc.42": [[2, "rc-42"]], "1.0.0-rc.43": [[2, "rc-43"]], "1.0.0-rc.44": [[2, "rc-44"]], "1.0.0-rc.45": [[2, "rc-45"]], "1.0.0-rc.46": [[2, "rc-46"]], "1.0.0-rc.47": [[2, "rc-47"]], "1.0.0-rc.48": [[2, "rc-48"]], "1.0.0-rc.49": [[2, "rc-49"]], "1.0.0-rc.50": [[2, "rc-50"]], "1.0.0-rc.51": [[2, "rc-51"]], "1.0.0-rc.52": [[2, "rc-52"]], "1.0.0-rc.53": [[2, "rc-53"]], "1.0.0-rc.54": [[2, "rc-54"]], "1.0.0-rc.55": [[2, "rc-55"]], "1.0.0-rc.56": [[2, "rc-56"]], "1.0.0-rc.57": [[2, "rc-57"]], "1.0.0-rc.58": [[2, "rc-58"]], "1.0.0-rc.59": [[2, "rc-59"]], "1.0.0-rc.60": [[2, "rc-60"]], "1.0.0-rc.61": [[2, "rc-61"]], "1.0.0-rc.62": [[2, "rc-62"]], "1.0.0-rc.63": [[2, "rc-63"]], "1.0.0-rc.64": [[2, "rc-64"]], "1.0.0-rc.65": [[2, "rc-65"]], "1.0.0-rc.66": [[2, "rc-66"]], "1.0.0-rc.67": [[2, "rc-67"]], "1.0.0-rc.68": [[2, "rc-68"]], "1.0.0-rc.69": [[2, "rc-69"]], "1.0.0-rc.70": [[2, "rc-70"]], "1.0.0-rc.71": [[2, "rc-71"]], "1.0.0-rc.72": [[2, "rc-72"]], "1.0.0-rc.73": [[2, "rc-73"]], "1.0.0-rc.74": [[2, "rc-74"]], "1.0.0-rc.75": [[2, "rc-75"]], "1.0.0-rc.76": [[2, "rc-76"]], "1.0.0-rc.77": [[2, "rc-77"]], "1.0.0-rc.78": [[2, "rc-78"]], "1.0.0-rc.79": [[2, "rc-79"]], "1.0.0-rc.80": [[2, "rc-80"]], "1.0.0-rc.81": [[2, "rc-81"]], "1.0.0-rc.82": [[2, "rc-82"]], "1.0.0-rc.83": [[2, "rc-83"]], "1.0.0-rc.84": [[2, "rc-84"]], "1.0.0-rc.85": [[2, "rc-85"]], "1.0.0-rc.86": [[2, "rc-86"]], "1.0.0-rc.87": [[2, "rc-87"]], "1.0.0-rc.88": [[2, "rc-88"]], "1.0.0-rc.89": [[2, "rc-89"]], "1.0.0-rc.90": [[2, "rc-90"]], "1.0.0-rc.91": [[2, "rc-91"]], "1.0.0-rc.92": [[2, "rc-92"]], "1.0.0-rc.93": [[2, "rc-93"]], "1.0.0-rc.94": [[2, "rc-94"]], "1.0.0-rc.95": [[2, "rc-95"]], "1.0.0-rc.96": [[2, "rc-96"]], "1.0.0-rc.97": [[2, "rc-97"]], "1.0.0-rc.98": [[2, "rc-98"]], "1.0.0-rc.99": [[2, "rc-99"]], "1.1 Coordinate conventions": [[3, "coordinate-conventions"]], "1.2 Two-theta, azimuth, resolution and q": [[3, "two-theta-azimuth-resolution-and-q"]], "1.3 Distance from the Ewald sphere": [[3, "distance-from-the-ewald-sphere"]], "10. Scaling and merging": [[3, "scaling-and-merging"]], "10.1 Observation model": [[3, "observation-model"]], "10.2 Partiality models available": [[3, "partiality-models-available"]], "10.3 Regularization and smoothness": [[3, "regularization-and-smoothness"]], "10.4 Merging estimator": [[3, "merging-estimator"]], "10.5 Merging statistics": [[3, "merging-statistics"]], "11. Mosaicity and \u201cprofile radius\u201d monitoring": [[3, "mosaicity-and-profile-radius-monitoring"]], "11.1 Profile radius (still excitation error width)": [[3, "profile-radius-still-excitation-error-width"]], "11.2 Mosaicity from rotation data (maximum likelihood)": [[3, "mosaicity-from-rotation-data-maximum-likelihood"]], "12. Wilson statistics and French\u2013Wilson treatment": [[3, "wilson-statistics-and-frenchwilson-treatment"]], "12.1 Per-shell \u27e8I/\u03c3(I)\u27e9": [[3, "per-shell-i-i"]], "12.2 Wilson plot (B-factor proxy)": [[3, "wilson-plot-b-factor-proxy"]], "12.3 French\u2013Wilson (posterior expectation of I and |F|)": [[3, "frenchwilson-posterior-expectation-of-i-and-f"]], "13. Practical notes and limitations": [[3, "practical-notes-and-limitations"]], "2. Azimuthal integration (radial profiles)": [[3, "azimuthal-integration-radial-profiles"]], "2.1 Histogram estimator": [[3, "histogram-estimator"]], "2.2 Corrections applied": [[3, "corrections-applied"]], "2.3 Background estimate for profiles": [[3, "background-estimate-for-profiles"]], "3. Spot finding (strong pixels \u2192 Bragg spots)": [[3, "spot-finding-strong-pixels-bragg-spots"]], "3.1 Strong-pixel detection by local statistics": [[3, "strong-pixel-detection-by-local-statistics"]], "3.2 Resolution and ice-ring handling": [[3, "resolution-and-ice-ring-handling"]], "3.3 Connected-component labeling (CCL)": [[3, "connected-component-labeling-ccl"]], "4. Indexing overview": [[3, "indexing-overview"]], "4.1 Indexed-spot decision (inlier test)": [[3, "indexed-spot-decision-inlier-test"]], "5. FFT indexing (unknown unit cell)": [[3, "fft-indexing-unknown-unit-cell"]], "5.1 Directional projections and histograms": [[3, "directional-projections-and-histograms"]], "5.2 FFT peak picking and candidate vectors": [[3, "fft-peak-picking-and-candidate-vectors"]], "5.3 Lattice reduction and cell candidates": [[3, "lattice-reduction-and-cell-candidates"]], "5.4 Robust refinement and best-cell selection": [[3, "robust-refinement-and-best-cell-selection"]], "6. Bravais lattice / centering inference (\u201clattice search\u201d)": [[3, "bravais-lattice-centering-inference-lattice-search"]], "7. Geometry and lattice refinement": [[3, "geometry-and-lattice-refinement"]], "7.1 Parameterization": [[3, "parameterization"]], "7.2 Residuals and objective": [[3, "residuals-and-objective"]], "7.3 Rotation datasets: bringing observations to a common reference frame": [[3, "rotation-datasets-bringing-observations-to-a-common-reference-frame"]], "7.4 Multi-stage tightening of inlier tolerance": [[3, "multi-stage-tightening-of-inlier-tolerance"]], "8. Reflection prediction": [[3, "reflection-prediction"]], "8.1 Enumerating reciprocal lattice points": [[3, "enumerating-reciprocal-lattice-points"]], "8.2 Still prediction (excitation-error cutoff)": [[3, "still-prediction-excitation-error-cutoff"]], "8.3 Rotation prediction (Laue equation + partiality model)": [[3, "rotation-prediction-laue-equation-partiality-model"]], "8.4 Systematic absences (centering)": [[3, "systematic-absences-centering"]], "9. 2D summation integration (three-ring method)": [[3, "d-summation-integration-three-ring-method"]], "9.1 Regions of interest": [[3, "regions-of-interest"]], "9.2 Background subtraction and intensity estimate": [[3, "background-subtraction-and-intensity-estimate"]], "9.3 Uncertainty model": [[3, "uncertainty-model"]], "9.4 Lorentz\u2013polarization factor handling": [[3, "lorentzpolarization-factor-handling"]], "A Gaussian mosaicity model yields a partiality fraction over an oscillation width \\Delta\\phi:\n$\nP(\\phi;\\sigma_M,\\zeta,\\Delta\\phi) = \\frac{1}{2}\\left[\n\\mathrm{erf}!\\left(\\frac{\\phi+\\Delta\\phi/2}{\\sqrt{2},\\sigma_M/\\zeta}\\right)": [[3, "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"]], "ACK handling": [[15, "ack-handling"]], "ACK semantics": [[15, "ack-semantics"]], "ADU histogram": [[8, "adu-histogram"]], "AXI Mailbox": [[13, "axi-mailbox"]], "Acknowledgements": [[0, null], [18, "acknowledgements"]], "Author": [[31, "author"]], "Authorization": [[40, "authorization"], [40, "id4"], [40, "id10"], [40, "id16"], [40, "id22"], [40, "id28"], [40, "id34"], [40, "id40"], [40, "id46"], [40, "id52"], [40, "id58"], [40, "id64"], [40, "id70"], [40, "id76"], [40, "id82"], [40, "id88"], [40, "id94"], [40, "id100"], [40, "id106"], [40, "id112"], [40, "id118"], [40, "id124"], [40, "id130"], [40, "id136"], [40, "id142"], [40, "id148"], [40, "id154"], [40, "id160"], [40, "id166"], [40, "id172"], [40, "id178"], [40, "id184"], [40, "id190"], [40, "id196"], [40, "id202"], [40, "id208"], [40, "id214"], [40, "id220"], [40, "id226"], [40, "id232"], [40, "id238"], [40, "id244"], [40, "id250"], [40, "id256"], [40, "id262"], [40, "id268"], [40, "id274"], [40, "id280"], [40, "id286"], [40, "id292"], [40, "id298"], [40, "id304"], [40, "id310"], [40, "id316"], [40, "id322"], [40, "id328"], [40, "id334"], [40, "id340"], [40, "id346"], [40, "id352"], [40, "id358"], [40, "id364"], [71, "authorization"]], "AzimIntSettings": [[32, null]], "Azimuthal integration": [[8, "azimuthal-integration"]], "Broker configuration": [[16, "broker-configuration"]], "BrokerStatus": [[33, null]], "Building firmware": [[7, "building-firmware"]], "CBOR messages": [[1, null]], "CERN Open Hardware Licence Version 2 - Strongly Reciprocal": [[10, "cern-open-hardware-licence-version-2-strongly-reciprocal"]], "CMake file": [[12, "cmake-file"]], "CPU-side crystallographic data analysis (Jungfraujoch)": [[3, null]], "Calibration message": [[1, "calibration-message"]], "CalibrationStatisticsInner": [[34, null]], "Card verification": [[4, "card-verification"]], "Changelog": [[2, null]], "Character device access": [[12, "character-device-access"]], "ColorScale": [[35, null]], "Compilation": [[12, "compilation"]], "Compile Jungfraujoch with frontend": [[16, "compile-jungfraujoch-with-frontend"]], "Configure network": [[4, "configure-network"]], "CrystFEL": [[25, "crystfel"]], "Custom user mask": [[22, "custom-user-mask"]], "DBus interface": [[17, "dbus-interface"]], "DECTRIS detectors": [[5, "dectris-detectors"]], "DIALS": [[25, "dials"]], "DKMS": [[12, "dkms"]], "DarkMaskSettings": [[36, null]], "Data file": [[18, "data-file"]], "Data processing pipeline": [[17, "data-processing-pipeline"]], "Data streams": [[15, null]], "DatasetSettings": [[37, null]], "DatasetSettingsUnitCell": [[38, null]], "DatasetSettingsXrayFluorescenceSpectrum": [[39, null]], "Deployment": [[4, null]], "Detector": [[41, null]], "Detector geometry": [[6, null]], "DetectorList": [[42, null]], "DetectorListDetectorsInner": [[43, null]], "DetectorListElement": [[44, null]], "DetectorModule": [[45, null]], "DetectorModuleDirection": [[46, null]], "DetectorPowerState": [[47, null]], "DetectorSelection": [[48, null]], "DetectorSettings": [[49, null]], "DetectorState": [[50, null]], "DetectorStatus": [[51, null]], "DetectorTiming": [[52, null]], "DetectorType": [[53, null]], "Documentation For Authorization": [[31, "documentation-for-authorization"]], "Documentation For Models": [[31, "documentation-for-models"]], "Documentation for API Endpoints": [[31, "documentation-for-api-endpoints"]], "Driver parameters": [[12, "driver-parameters"]], "End message": [[1, "end-message"]], "Enum": [[35, "enum"], [46, "enum"], [47, "enum"], [50, "enum"], [52, "enum"], [53, "enum"], [55, "enum"], [58, "enum"], [67, "enum"], [68, "enum"], [79, "enum"], [80, "enum"]], "ErrorMessage": [[54, null]], "Example": [[32, "example"], [33, "example"], [34, "example"], [36, "example"], [37, "example"], [38, "example"], [39, "example"], [40, "example"], [40, "id1"], [40, "id7"], [40, "id13"], [40, "id19"], [40, "id25"], [40, "id31"], [40, "id37"], [40, "id43"], [40, "id49"], [40, "id55"], [40, "id61"], [40, "id67"], [40, "id73"], [40, "id79"], [40, "id85"], [40, "id91"], [40, "id97"], [40, "id103"], [40, "id109"], [40, "id115"], [40, "id121"], [40, "id127"], [40, "id133"], [40, "id139"], [40, "id145"], [40, "id151"], [40, "id157"], [40, "id163"], [40, "id169"], [40, "id175"], [40, "id181"], [40, "id187"], [40, "id193"], [40, "id199"], [40, "id205"], [40, "id211"], [40, "id217"], [40, "id223"], [40, "id229"], [40, "id235"], [40, "id241"], [40, "id247"], [40, "id253"], [40, "id259"], [40, "id265"], [40, "id271"], [40, "id277"], [40, "id283"], [40, "id289"], [40, "id295"], [40, "id301"], [40, "id307"], [40, "id313"], [40, "id319"], [40, "id325"], [40, "id331"], [40, "id337"], [40, "id343"], [40, "id349"], [40, "id355"], [40, "id361"], [41, "example"], [42, "example"], [43, "example"], [44, "example"], [45, "example"], [48, "example"], [49, "example"], [51, "example"], [54, "example"], [56, "example"], [57, "example"], [59, "example"], [60, "example"], [61, "example"], [62, "example"], [63, "example"], [64, "example"], [65, "example"], [66, "example"], [69, "example"], [70, "example"], [71, "example"], [72, "example"], [73, "example"], [74, "example"], [75, "example"], [76, "example"], [77, "example"], [78, "example"], [81, "example"], [82, "example"], [83, "example"], [84, "example"], [85, "example"], [86, "example"], [87, "example"], [88, "example"], [89, "example"], [90, "example"], [91, "example"], [92, "example"], [93, "example"], [94, "example"], [95, "example"], [96, "example"], [97, "example"], [98, "example"], [99, "example"]], "Exchange buffers": [[12, "exchange-buffers"]], "Expected result": [[16, "expected-result"]], "External interfaces": [[16, "external-interfaces"]], "FPGA": [[14, "fpga"], [30, null]], "FPGA PCIe driver": [[12, null]], "FPGA advanced reference": [[13, null]], "FPGA data analysis": [[8, null]], "FPGA data flow": [[9, null]], "FPGA license": [[10, null]], "FPGA network": [[11, null]], "FPGA smartNIC": [[7, null]], "FileWriterFormat": [[55, null]], "FileWriterSettings": [[56, null]], "Finalized files information": [[18, "finalized-files-information"]], "Firmware flashing": [[4, "firmware-flashing"]], "Flash the U55C FPGA card with a proper image and install Linux kernel driver.": [[4, "flash-the-u55c-fpga-card-with-a-proper-image-and-install-linux-kernel-driver"]], "FpgaStatusInner": [[57, null]], "Frame generator": [[7, "frame-generator"]], "Frame summation": [[8, "frame-summation"]], "Frame types": [[15, "frame-types"]], "GNU GENERAL PUBLIC LICENSE": [[19, "gnu-general-public-license"]], "GPUs": [[14, "gpus"]], "General": [[30, null]], "GeomRefinementAlgorithm": [[58, null]], "Getting Started": [[31, "getting-started"]], "Gitlab CI": [[7, "gitlab-ci"]], "GridPlot": [[59, null]], "GridPlots": [[60, null]], "GridScan": [[61, null]], "GridScanResult": [[62, null]], "GridScanResultImagesInner": [[63, null]], "HBM memory": [[13, "hbm-memory"]], "HDF5 file structure": [[18, "hdf5-file-structure"]], "HLS compilation": [[7, "hls-compilation"]], "HTTP interface": [[18, "http-interface"]], "HTTP request headers": [[40, "http-request-headers"], [40, "id5"], [40, "id11"], [40, "id17"], [40, "id23"], [40, "id29"], [40, "id35"], [40, "id41"], [40, "id47"], [40, "id53"], [40, "id59"], [40, "id65"], [40, "id71"], [40, "id77"], [40, "id83"], [40, "id89"], [40, "id95"], [40, "id101"], [40, "id107"], [40, "id113"], [40, "id119"], [40, "id125"], [40, "id131"], [40, "id137"], [40, "id143"], [40, "id149"], [40, "id155"], [40, "id161"], [40, "id167"], [40, "id173"], [40, "id179"], [40, "id185"], [40, "id191"], [40, "id197"], [40, "id203"], [40, "id209"], [40, "id215"], [40, "id221"], [40, "id227"], [40, "id233"], [40, "id239"], [40, "id245"], [40, "id251"], [40, "id257"], [40, "id263"], [40, "id269"], [40, "id275"], [40, "id281"], [40, "id287"], [40, "id293"], [40, "id299"], [40, "id305"], [40, "id311"], [40, "id317"], [40, "id323"], [40, "id329"], [40, "id335"], [40, "id341"], [40, "id347"], [40, "id353"], [40, "id359"], [40, "id365"], [71, "http-request-headers"]], "HTTP response details": [[40, "http-response-details"], [40, "id6"], [40, "id12"], [40, "id18"], [40, "id24"], [40, "id30"], [40, "id36"], [40, "id42"], [40, "id48"], [40, "id54"], [40, "id60"], [40, "id66"], [40, "id72"], [40, "id78"], [40, "id84"], [40, "id90"], [40, "id96"], [40, "id102"], [40, "id108"], [40, "id114"], [40, "id120"], [40, "id126"], [40, "id132"], [40, "id138"], [40, "id144"], [40, "id150"], [40, "id156"], [40, "id162"], [40, "id168"], [40, "id174"], [40, "id180"], [40, "id186"], [40, "id192"], [40, "id198"], [40, "id204"], [40, "id210"], [40, "id216"], [40, "id222"], [40, "id228"], [40, "id234"], [40, "id240"], [40, "id246"], [40, "id252"], [40, "id258"], [40, "id264"], [40, "id270"], [40, "id276"], [40, "id282"], [40, "id288"], [40, "id294"], [40, "id300"], [40, "id306"], [40, "id312"], [40, "id318"], [40, "id324"], [40, "id330"], [40, "id336"], [40, "id342"], [40, "id348"], [40, "id354"], [40, "id360"], [40, "id366"], [71, "http-response-details"]], "Hardware": [[7, "hardware"]], "Hardware requirements": [[14, null]], "High performance server": [[14, "high-performance-server"]], "How to Apply These Terms to Your New Programs": [[19, "how-to-apply-these-terms-to-your-new-programs"]], "Image message": [[1, "image-message"]], "Image stream": [[15, "image-stream"]], "Image stream replacement": [[15, "image-stream-replacement"]], "ImageBufferStatus": [[64, null]], "ImageFormatSettings": [[65, null]], "ImagePusherStatus": [[66, null]], "ImagePusherType": [[67, null]], "IndexingAlgorithm": [[68, null]], "IndexingSettings": [[69, null]], "Install Jungfraujoch Python client": [[4, "install-jungfraujoch-python-client"]], "Install Jungfraujoch image viewer": [[4, "install-jungfraujoch-image-viewer"]], "Install Jungfraujoch writer": [[4, "install-jungfraujoch-writer"]], "Install PCIe driver": [[4, "install-pcie-driver"]], "Install main Jungfraujoch code and frontend web interface": [[4, "install-main-jungfraujoch-code-and-frontend-web-interface"]], "Installation": [[12, "installation"]], "Installation & Usage": [[31, "installation-usage"]], "InstrumentMetadata": [[70, null]], "Integrated format (NXmxIntegrated)": [[18, "integrated-format-nxmxintegrated"]], "Integration with MX data processing software": [[25, null]], "JUNGFRAU conversion": [[8, "jungfrau-conversion"]], "JfjochSettings": [[72, null]], "JfjochSettingsSsl": [[73, null]], "JfjochStatistics": [[74, null]], "Jungfraujoch exceptions to GPL": [[19, "jungfraujoch-exceptions-to-gpl"]], "Keepalive": [[15, "keepalive"]], "Known problems": [[12, "known-problems"]], "Legacy version (NXmxLegacy)": [[18, "legacy-version-nxmxlegacy"]], "License": [[19, null]], "License Clarification": [[31, "license-clarification"]], "Linux package repositories": [[23, null]], "Loading driver into kernel": [[12, "loading-driver-into-kernel"]], "Macromolecular crystallography convention for the vertical direction": [[6, "macromolecular-crystallography-convention-for-the-vertical-direction"]], "Mask format": [[22, "mask-format"]], "Master file": [[18, "master-file"]], "MeasurementStatistics": [[75, null]], "Metadata message": [[1, "metadata-message"]], "Metadata stream": [[15, "metadata-stream"]], "Network LEDs": [[11, "network-leds"]], "Network stack": [[11, "network-stack"]], "Network switch": [[14, "network-switch"]], "No file option(s)": [[18, "no-file-option-s"]], "Notes on images and compression": [[1, "notes-on-images-and-compression"]], "OpenAPI": [[20, null]], "OpenAPI Python client": [[30, null]], "OpenAPI specification": [[21, null]], "OpenAPI specs": [[20, "openapi-specs"]], "Operating system": [[24, "operating-system"]], "Other formats (CBF and TIFF)": [[18, "other-formats-cbf-and-tiff"]], "Overwriting files": [[18, "overwriting-files"]], "Ownership of the character devices": [[12, "ownership-of-the-character-devices"]], "PCI slots": [[14, "pci-slots"]], "PSI Jungfraujoch": [[30, null]], "PSI detectors": [[5, "psi-detectors"]], "Parameters": [[40, "parameters"], [40, "id2"], [40, "id8"], [40, "id14"], [40, "id20"], [40, "id26"], [40, "id32"], [40, "id38"], [40, "id44"], [40, "id50"], [40, "id56"], [40, "id62"], [40, "id68"], [40, "id74"], [40, "id80"], [40, "id86"], [40, "id92"], [40, "id98"], [40, "id104"], [40, "id110"], [40, "id116"], [40, "id122"], [40, "id128"], [40, "id134"], [40, "id140"], [40, "id146"], [40, "id152"], [40, "id158"], [40, "id164"], [40, "id170"], [40, "id176"], [40, "id182"], [40, "id188"], [40, "id194"], [40, "id200"], [40, "id206"], [40, "id212"], [40, "id218"], [40, "id224"], [40, "id230"], [40, "id236"], [40, "id242"], [40, "id248"], [40, "id254"], [40, "id260"], [40, "id266"], [40, "id272"], [40, "id278"], [40, "id284"], [40, "id290"], [40, "id296"], [40, "id302"], [40, "id308"], [40, "id314"], [40, "id320"], [40, "id326"], [40, "id332"], [40, "id338"], [40, "id344"], [40, "id350"], [40, "id356"], [40, "id362"], [71, "parameters"]], "PcieDevicesInner": [[76, null]], "Pixel mask": [[8, "pixel-mask"], [22, null]], "Pixel statisitics": [[8, "pixel-statisitics"]], "Pixel thresholding": [[8, "pixel-thresholding"]], "PixelMaskStatistics": [[77, null]], "Plot": [[78, null]], "PlotTypeEnum": [[79, null]], "PlotUnitX": [[80, null]], "Plots": [[81, null]], "Preamble": [[19, "preamble"]], "Preview stream": [[15, "preview-stream"]], "PreviewSettings": [[82, null]], "Properties": [[32, "properties"], [33, "properties"], [34, "properties"], [36, "properties"], [37, "properties"], [38, "properties"], [39, "properties"], [41, "properties"], [42, "properties"], [43, "properties"], [44, "properties"], [45, "properties"], [48, "properties"], [49, "properties"], [51, "properties"], [54, "properties"], [56, "properties"], [57, "properties"], [59, "properties"], [60, "properties"], [61, "properties"], [62, "properties"], [63, "properties"], [64, "properties"], [65, "properties"], [66, "properties"], [69, "properties"], [70, "properties"], [72, "properties"], [73, "properties"], [74, "properties"], [75, "properties"], [76, "properties"], [77, "properties"], [78, "properties"], [81, "properties"], [82, "properties"], [83, "properties"], [84, "properties"], [85, "properties"], [86, "properties"], [87, "properties"], [88, "properties"], [89, "properties"], [90, "properties"], [91, "properties"], [92, "properties"], [93, "properties"], [94, "properties"], [95, "properties"], [96, "properties"], [97, "properties"], [98, "properties"], [99, "properties"]], "Python client": [[20, "python-client"]], "RHEL 9.5+ issue": [[12, "rhel-9-5-issue"]], "RHEL based systems": [[23, "rhel-based-systems"]], "Reference": [[30, null]], "References": [[3, "references"]], "Region-of-interest (ROI) integration": [[8, "region-of-interest-roi-integration"]], "Register map": [[13, "register-map"]], "Republish": [[18, "republish"]], "Requirements.": [[31, "requirements"]], "Return type": [[40, "return-type"], [40, "id3"], [40, "id9"], [40, "id15"], [40, "id21"], [40, "id27"], [40, "id33"], [40, "id39"], [40, "id45"], [40, "id51"], [40, "id57"], [40, "id63"], [40, "id69"], [40, "id75"], [40, "id81"], [40, "id87"], [40, "id93"], [40, "id99"], [40, "id105"], [40, "id111"], [40, "id117"], [40, "id123"], [40, "id129"], [40, "id135"], [40, "id141"], [40, "id147"], [40, "id153"], [40, "id159"], [40, "id165"], [40, "id171"], [40, "id177"], [40, "id183"], [40, "id189"], [40, "id195"], [40, "id201"], [40, "id207"], [40, "id213"], [40, "id219"], [40, "id225"], [40, "id231"], [40, "id237"], [40, "id243"], [40, "id249"], [40, "id255"], [40, "id261"], [40, "id267"], [40, "id273"], [40, "id279"], [40, "id285"], [40, "id291"], [40, "id297"], [40, "id303"], [40, "id309"], [40, "id315"], [40, "id321"], [40, "id327"], [40, "id333"], [40, "id339"], [40, "id345"], [40, "id351"], [40, "id357"], [40, "id363"], [71, "return-type"]], "RoiAzimList": [[83, null]], "RoiAzimuthal": [[84, null]], "RoiBox": [[85, null]], "RoiBoxList": [[86, null]], "RoiCircle": [[87, null]], "RoiCircleList": [[88, null]], "RoiDefinitions": [[89, null]], "RotationAxis": [[90, null]], "Run tests": [[16, "run-tests"]], "Running Jungfraujoch software": [[4, "running-jungfraujoch-software"]], "Running directory": [[18, "running-directory"]], "SNR ratio calculation": [[8, "snr-ratio-calculation"]], "ScanResult": [[91, null]], "ScanResultImagesInner": [[92, null]], "Semantic versioning": [[28, null]], "Setting up a local test for Jungfraujoch": [[16, "setting-up-a-local-test-for-jungfraujoch"]], "Setuptools": [[31, "setuptools"]], "Software": [[30, null]], "Software dependencies": [[24, "software-dependencies"]], "Software requirements": [[24, null]], "Splitting image stream": [[15, "splitting-image-stream"]], "Spot finding": [[8, "spot-finding"]], "SpotFindingSettings": [[93, null]], "Square root compression": [[8, "square-root-compression"]], "StandardDetectorGeometry": [[94, null]], "Start message": [[1, "start-message"]], "Start service": [[16, "start-service"]], "Supported detectors": [[5, null]], "Switch configuration": [[11, "switch-configuration"]], "Synthesis": [[7, "synthesis"]], "Sysfs access": [[12, "sysfs-access"]], "TCP frame header (TcpFrameHeader)": [[15, "tcp-frame-header-tcpframeheader"]], "TCP/IP configuration": [[15, "tcp-ip-configuration"]], "TCP/IP image stream": [[15, "tcp-ip-image-stream"]], "TERMS AND CONDITIONS": [[19, "terms-and-conditions"]], "TcpSettings": [[95, null]], "Tests": [[26, null], [31, "tests"]], "Tools": [[27, null]], "Transceivers": [[11, "transceivers"]], "Ubuntu based systems": [[23, "ubuntu-based-systems"]], "UnitCell": [[96, null]], "Usage": [[18, "usage"]], "User data": [[1, "user-data"]], "VDS format (NXmxVDS)": [[18, "vds-format-nxmxvds"]], "Web frontend": [[29, null]], "When Vivado is not present": [[7, "when-vivado-is-not-present"]], "Writer notification socket": [[15, "writer-notification-socket"]], "XDS": [[25, "xds"]], "Xilinx Vivado": [[7, "xilinx-vivado"]], "Zero-copy transmission": [[15, "zero-copy-transmission"]], "ZeroMQ configuration": [[15, "zeromq-configuration"]], "ZeroMQ image stream": [[15, "zeromq-image-stream"]], "ZeromqMetadataSettings": [[97, null]], "ZeromqPreviewSettings": [[98, null]], "ZeromqSettings": [[99, null]], "cancel_post": [[40, "cancel-post"]], "config_azim_int_get": [[40, "config-azim-int-get"]], "config_azim_int_put": [[40, "config-azim-int-put"]], "config_dark_mask_get": [[40, "config-dark-mask-get"]], "config_dark_mask_put": [[40, "config-dark-mask-put"]], "config_detector_get": [[40, "config-detector-get"]], "config_detector_put": [[40, "config-detector-put"]], "config_file_writer_get": [[40, "config-file-writer-get"]], "config_file_writer_put": [[40, "config-file-writer-put"]], "config_image_format_conversion_post": [[40, "config-image-format-conversion-post"]], "config_image_format_get": [[40, "config-image-format-get"]], "config_image_format_put": [[40, "config-image-format-put"]], "config_image_format_raw_post": [[40, "config-image-format-raw-post"]], "config_indexing_get": [[40, "config-indexing-get"]], "config_indexing_put": [[40, "config-indexing-put"]], "config_instrument_get": [[40, "config-instrument-get"]], "config_instrument_put": [[40, "config-instrument-put"]], "config_internal_generator_image_put": [[40, "config-internal-generator-image-put"]], "config_internal_generator_image_tiff_put": [[40, "config-internal-generator-image-tiff-put"]], "config_mask_get": [[40, "config-mask-get"]], "config_mask_tiff_get": [[40, "config-mask-tiff-get"]], "config_roi_get": [[40, "config-roi-get"]], "config_roi_put": [[40, "config-roi-put"]], "config_select_detector_get": [[40, "config-select-detector-get"]], "config_select_detector_put": [[40, "config-select-detector-put"]], "config_spot_finding_get": [[40, "config-spot-finding-get"]], "config_spot_finding_put": [[40, "config-spot-finding-put"]], "config_user_mask_get": [[40, "config-user-mask-get"]], "config_user_mask_put": [[40, "config-user-mask-put"]], "config_user_mask_tiff_get": [[40, "config-user-mask-tiff-get"]], "config_user_mask_tiff_put": [[40, "config-user-mask-tiff-put"]], "config_zeromq_metadata_get": [[40, "config-zeromq-metadata-get"]], "config_zeromq_metadata_put": [[40, "config-zeromq-metadata-put"], [71, "config-zeromq-metadata-put"]], "config_zeromq_preview_get": [[40, "config-zeromq-preview-get"]], "config_zeromq_preview_put": [[40, "config-zeromq-preview-put"]], "deactivate_post": [[40, "deactivate-post"]], "detector_status_get": [[40, "detector-status-get"]], "fpga_status_get": [[40, "fpga-status-get"]], "image_buffer_clear_post": [[40, "image-buffer-clear-post"]], "image_buffer_image_cbor_get": [[40, "image-buffer-image-cbor-get"]], "image_buffer_image_jpeg_get": [[40, "image-buffer-image-jpeg-get"]], "image_buffer_image_tiff_get": [[40, "image-buffer-image-tiff-get"]], "image_buffer_start_cbor_get": [[40, "image-buffer-start-cbor-get"]], "image_buffer_status_get": [[40, "image-buffer-status-get"]], "image_pusher_status_get": [[40, "image-pusher-status-get"]], "initialize_post": [[40, "initialize-post"]], "jfjoch-client": [[31, null]], "jfjoch_broker": [[16, null]], "jfjoch_client.DefaultApi": [[40, null]], "jfjoch_client.JfjochBrokerApi": [[71, null]], "jfjoch_hdf5_tools": [[27, "jfjoch-hdf5-tools"]], "jfjoch_offline_process": [[27, "jfjoch-offline-process"]], "jfjoch_pcie_clear_net_counters": [[27, "jfjoch-pcie-clear-net-counters"]], "jfjoch_pcie_net_cfg": [[27, "jfjoch-pcie-net-cfg"]], "jfjoch_pcie_read_register": [[27, "jfjoch-pcie-read-register"]], "jfjoch_pcie_status": [[27, "jfjoch-pcie-status"]], "jfjoch_udp_simulator": [[27, "jfjoch-udp-simulator"]], "jfjoch_viewer": [[17, null]], "jfjoch_writer": [[18, null]], "pedestal_post": [[40, "pedestal-post"]], "pip install": [[31, "pip-install"]], "preview_pedestal_tiff_get": [[40, "preview-pedestal-tiff-get"]], "preview_plot_bin_get": [[40, "preview-plot-bin-get"]], "preview_plot_get": [[40, "preview-plot-get"]], "result_scan_get": [[40, "result-scan-get"]], "start_post": [[40, "start-post"]], "statistics_calibration_get": [[40, "statistics-calibration-get"]], "statistics_data_collection_get": [[40, "statistics-data-collection-get"]], "statistics_get": [[40, "statistics-get"]], "status_get": [[40, "status-get"]], "trigger_post": [[40, "trigger-post"]], "version_get": [[40, "version-get"]], "wait_till_done_post": [[40, "wait-till-done-post"]], "wait_until_running_post": [[40, "wait-until-running-post"]], "xfel_event_code_get": [[40, "xfel-event-code-get"]], "xfel_pulse_id_get": [[40, "xfel-pulse-id-get"]]}, "docnames": ["ACKNOWLEDGEMENT", "CBOR", "CHANGELOG", "CPU_DATA_ANALYSIS", "DEPLOYMENT", "DETECTORS", "DETECTOR_GEOMETRY", "FPGA", "FPGA_DATA_ANALYSIS", "FPGA_DESIGN", "FPGA_LICENSE", "FPGA_NETWORK", "FPGA_PCIE_DRIVER", "FPGA_SETTINGS", "HARDWARE", "IMAGE_STREAM", "JFJOCH_BROKER", "JFJOCH_VIEWER", "JFJOCH_WRITER", "LICENSE", "OPENAPI", "OPENAPI_SPECS", "PIXEL_MASK", "REPOSITORIES", "SOFTWARE", "SOFTWARE_INTEGRATION", "TESTS", "TOOLS", "VERSIONING", "WEB_FRONTEND", "index", "python_client/README", "python_client/docs/AzimIntSettings", "python_client/docs/BrokerStatus", "python_client/docs/CalibrationStatisticsInner", "python_client/docs/ColorScale", "python_client/docs/DarkMaskSettings", "python_client/docs/DatasetSettings", "python_client/docs/DatasetSettingsUnitCell", "python_client/docs/DatasetSettingsXrayFluorescenceSpectrum", "python_client/docs/DefaultApi", "python_client/docs/Detector", "python_client/docs/DetectorList", "python_client/docs/DetectorListDetectorsInner", "python_client/docs/DetectorListElement", "python_client/docs/DetectorModule", "python_client/docs/DetectorModuleDirection", "python_client/docs/DetectorPowerState", "python_client/docs/DetectorSelection", "python_client/docs/DetectorSettings", "python_client/docs/DetectorState", "python_client/docs/DetectorStatus", "python_client/docs/DetectorTiming", "python_client/docs/DetectorType", "python_client/docs/ErrorMessage", "python_client/docs/FileWriterFormat", "python_client/docs/FileWriterSettings", "python_client/docs/FpgaStatusInner", "python_client/docs/GeomRefinementAlgorithm", "python_client/docs/GridPlot", "python_client/docs/GridPlots", "python_client/docs/GridScan", "python_client/docs/GridScanResult", "python_client/docs/GridScanResultImagesInner", "python_client/docs/ImageBufferStatus", "python_client/docs/ImageFormatSettings", "python_client/docs/ImagePusherStatus", "python_client/docs/ImagePusherType", "python_client/docs/IndexingAlgorithm", "python_client/docs/IndexingSettings", "python_client/docs/InstrumentMetadata", "python_client/docs/JfjochBrokerApi", "python_client/docs/JfjochSettings", "python_client/docs/JfjochSettingsSsl", "python_client/docs/JfjochStatistics", "python_client/docs/MeasurementStatistics", "python_client/docs/PcieDevicesInner", "python_client/docs/PixelMaskStatistics", "python_client/docs/Plot", "python_client/docs/PlotTypeEnum", "python_client/docs/PlotUnitX", "python_client/docs/Plots", "python_client/docs/PreviewSettings", "python_client/docs/RoiAzimList", "python_client/docs/RoiAzimuthal", "python_client/docs/RoiBox", "python_client/docs/RoiBoxList", "python_client/docs/RoiCircle", "python_client/docs/RoiCircleList", "python_client/docs/RoiDefinitions", "python_client/docs/RotationAxis", "python_client/docs/ScanResult", "python_client/docs/ScanResultImagesInner", "python_client/docs/SpotFindingSettings", "python_client/docs/StandardDetectorGeometry", "python_client/docs/TcpSettings", "python_client/docs/UnitCell", "python_client/docs/ZeromqMetadataSettings", "python_client/docs/ZeromqPreviewSettings", "python_client/docs/ZeromqSettings"], "envversion": {"sphinx": 64, "sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2}, "filenames": ["ACKNOWLEDGEMENT.md", "CBOR.md", "CHANGELOG.md", "CPU_DATA_ANALYSIS.md", "DEPLOYMENT.md", "DETECTORS.md", "DETECTOR_GEOMETRY.md", "FPGA.md", "FPGA_DATA_ANALYSIS.md", "FPGA_DESIGN.md", "FPGA_LICENSE.md", "FPGA_NETWORK.md", "FPGA_PCIE_DRIVER.md", "FPGA_SETTINGS.md", "HARDWARE.md", "IMAGE_STREAM.md", "JFJOCH_BROKER.md", "JFJOCH_VIEWER.md", "JFJOCH_WRITER.md", "LICENSE.md", "OPENAPI.md", "OPENAPI_SPECS.rst", "PIXEL_MASK.md", "REPOSITORIES.md", "SOFTWARE.md", "SOFTWARE_INTEGRATION.md", "TESTS.md", "TOOLS.md", "VERSIONING.md", "WEB_FRONTEND.md", "index.rst", "python_client/README.md", "python_client/docs/AzimIntSettings.md", "python_client/docs/BrokerStatus.md", "python_client/docs/CalibrationStatisticsInner.md", "python_client/docs/ColorScale.md", "python_client/docs/DarkMaskSettings.md", "python_client/docs/DatasetSettings.md", "python_client/docs/DatasetSettingsUnitCell.md", "python_client/docs/DatasetSettingsXrayFluorescenceSpectrum.md", "python_client/docs/DefaultApi.md", "python_client/docs/Detector.md", "python_client/docs/DetectorList.md", "python_client/docs/DetectorListDetectorsInner.md", "python_client/docs/DetectorListElement.md", "python_client/docs/DetectorModule.md", "python_client/docs/DetectorModuleDirection.md", "python_client/docs/DetectorPowerState.md", "python_client/docs/DetectorSelection.md", "python_client/docs/DetectorSettings.md", "python_client/docs/DetectorState.md", "python_client/docs/DetectorStatus.md", "python_client/docs/DetectorTiming.md", "python_client/docs/DetectorType.md", "python_client/docs/ErrorMessage.md", "python_client/docs/FileWriterFormat.md", "python_client/docs/FileWriterSettings.md", "python_client/docs/FpgaStatusInner.md", "python_client/docs/GeomRefinementAlgorithm.md", "python_client/docs/GridPlot.md", "python_client/docs/GridPlots.md", "python_client/docs/GridScan.md", "python_client/docs/GridScanResult.md", "python_client/docs/GridScanResultImagesInner.md", "python_client/docs/ImageBufferStatus.md", "python_client/docs/ImageFormatSettings.md", "python_client/docs/ImagePusherStatus.md", "python_client/docs/ImagePusherType.md", "python_client/docs/IndexingAlgorithm.md", "python_client/docs/IndexingSettings.md", "python_client/docs/InstrumentMetadata.md", "python_client/docs/JfjochBrokerApi.md", "python_client/docs/JfjochSettings.md", "python_client/docs/JfjochSettingsSsl.md", "python_client/docs/JfjochStatistics.md", "python_client/docs/MeasurementStatistics.md", "python_client/docs/PcieDevicesInner.md", "python_client/docs/PixelMaskStatistics.md", "python_client/docs/Plot.md", "python_client/docs/PlotTypeEnum.md", "python_client/docs/PlotUnitX.md", "python_client/docs/Plots.md", "python_client/docs/PreviewSettings.md", "python_client/docs/RoiAzimList.md", "python_client/docs/RoiAzimuthal.md", "python_client/docs/RoiBox.md", "python_client/docs/RoiBoxList.md", "python_client/docs/RoiCircle.md", "python_client/docs/RoiCircleList.md", "python_client/docs/RoiDefinitions.md", "python_client/docs/RotationAxis.md", "python_client/docs/ScanResult.md", "python_client/docs/ScanResultImagesInner.md", "python_client/docs/SpotFindingSettings.md", "python_client/docs/StandardDetectorGeometry.md", "python_client/docs/TcpSettings.md", "python_client/docs/UnitCell.md", "python_client/docs/ZeromqMetadataSettings.md", "python_client/docs/ZeromqPreviewSettings.md", "python_client/docs/ZeromqSettings.md"], "indexentries": {}, "objects": {}, "objnames": {}, "objtypes": {}, "terms": {"": [1, 2, 3, 4, 7, 10, 11, 14, 15, 16, 19, 26, 31, 37, 40, 71], "0": [1, 3, 4, 5, 6, 13, 15, 16, 18, 19, 22, 23, 25, 27, 31, 37, 40, 41, 49, 55, 69, 82, 90, 93, 95, 97, 98, 99], "00": 4, "000": 41, "0000": 4, "001": [16, 18], "01": 16, "0140": 4, "0142": 4, "02": [16, 93], "04": [23, 24], "05": [18, 69], "0x000000": 13, "0x00ffff": 13, "0x010000": 13, "0x010004": 13, "0x010008": 13, "0x01000c": 13, "0x010010": 13, "0x010014": 13, "0x010018": 13, "0x01001c": 13, "0x010020": 13, "0x010024": 13, "0x010028": 13, "0x010030": 13, "0x010038": 13, "0x01003c": 13, "0x010040": 13, "0x010048": 13, "0x010050": 13, "0x010058": 13, "0x010060": 13, "0x010068": 13, "0x010070": 13, "0x010078": 13, "0x010080": 13, "0x010088": 13, "0x010090": 13, "0x010100": 13, "0x010104": 13, "0x010200": 13, "0x010208": 13, "0x01020c": 13, "0x010210": 13, "0x010214": 13, "0x010218": 13, "0x01021c": 13, "0x010220": 13, "0x010224": 13, "0x010225": 13, "0x030000": 13, "0x03ffff": 13, "0x040000": 13, "0x04ffff": 13, "0x050000": 13, "0x05ffff": 13, "0x060000": 13, "0x06ffff": 13, "0x070000": 13, "0x07ffff": 13, "0x080000": 13, "0x08ffff": 13, "0x090000": 13, "0x09ffff": 13, "0x0a0000": 13, "0x0affff": 13, "0x0c0000": 13, "0x0fffff": 13, "0x100000": 13, "0x10ffff": 13, "0x110000": 13, "0x11ffff": 13, "0x120000": 13, "0x12ffff": 13, "0x130000": 13, "0x13ffff": 13, "0x140000": 13, "0x14ffff": 13, "0x150000": 13, "0x15ffff": 13, "0x160000": 13, "0x16ffff": 13, "0x170000": 13, "0x17ffff": 13, "0x1f06000": 4, "0x200000": 13, "0x20ffff": 13, "0x210000": 13, "0x21ffff": 13, "0x220000": 13, "0x22ffff": 13, "0x230000": 13, "0x23ffff": 13, "0x240000": 13, "0x24ffff": 13, "0x250000": 13, "0x25ffff": 13, "0x260000": 13, "0x26ffff": 13, "0x270000": 13, "0x27ffff": 13, "0x400000": 13, "0x47ffff": 13, "0x4a464a54": 15, "1": [0, 1, 4, 8, 10, 13, 14, 15, 16, 18, 19, 22, 24, 25, 27, 31, 32, 36, 37, 40, 41, 49, 65, 82, 93, 94, 98], "10": [0, 2, 10, 11, 13, 14, 15, 16, 19, 24, 36, 69], "100": [5, 7, 11, 14, 15, 16, 18, 40, 65, 82, 99], "1000": [2, 16, 18, 36, 37, 75, 97, 98], "10000": 36, "100g": [7, 11, 13, 14], "101": 0, "1024": [8, 12, 16], "1024x512": [12, 40], "10g": [7, 13, 14], "10m": 4, "11": [4, 10, 13, 19, 24], "1107": 0, "12": [2, 10, 13, 23, 24], "120": [3, 7], "1200": 18, "12400": 18, "125": 3, "127": 15, "128": [16, 49], "13": [2, 10, 13, 19, 23], "132": 3, "133": 3, "135": 15, "14": [12, 13, 24], "1420": 8, "1428": 8, "144": [3, 31], "15": [2, 8, 13, 19], "150": [2, 16], "1500": 18, "155": 18, "16": [2, 8, 12, 13, 16, 19, 40, 49], "16384": 69, "168": 15, "1690": 3, "1695": 3, "16gt": 4, "16m": 2, "17": 13, "18": 13, "19": 13, "192": 15, "1996": 19, "1999": 3, "1d": [3, 9, 31, 32, 40], "1g": 14, "1m": [4, 16], "1st": 91, "1x": 14, "2": [1, 2, 4, 5, 7, 12, 13, 14, 15, 16, 18, 19, 40, 69], "20": [2, 13, 19, 24, 31, 41, 69], "200": [40, 71], "2000": [16, 49], "200000": 4, "2007": 19, "200g": 14, "200k": 4, "2010": 3, "2013": 3, "2016": 18, "2020": [8, 10], "2022": [2, 7, 8], "2023": 0, "2025": 0, "2048": [2, 16, 72], "2068": [18, 22], "2068x2164": 22, "21": [13, 24], "2164": [18, 22], "22": [13, 23, 24], "227": 0, "23": [2, 4], "234": 0, "24": [18, 23, 24], "25": 18, "250": [15, 37, 69], "256": [2, 8, 37], "25g": 7, "2622": 49, "27": [13, 25], "28": [3, 19], "29": [8, 19], "2d": [2, 8], "2nd": 91, "2r": 3, "2x": 14, "3": [1, 2, 10, 12, 13, 15, 16, 18, 19, 24, 25, 31, 36, 40, 41], "30": [0, 7, 10, 15, 19, 22], "300": [16, 22, 49], "31": [3, 13, 22], "32": [8, 12, 13, 18, 22, 31, 40, 49, 95], "320": [16, 41], "32766": 18, "32768": 18, "32x32": 2, "3450": 4, "36": [16, 94], "39": 18, "3d": [2, 91], "3rd": 91, "3x3": 1, "4": [1, 2, 4, 10, 12, 13, 14, 15, 16, 18, 19, 22, 37, 40, 55, 57], "40": [7, 11], "400": [22, 40, 71], "404": 40, "431": 4, "4356": 16, "4357": 16, "45": 7, "450": 16, "4826": 3, "4m": 14, "4x10": [7, 11], "4x10g": 14, "5": [1, 2, 10, 11, 13, 14, 15, 18, 19, 36, 69, 93], "50": 16, "500": [2, 40, 49, 71], "5000": [16, 49], "5001": 16, "500m": [2, 15], "502": 40, "504": 40, "512": [12, 14], "512x1024": 1, "5232": [4, 16, 31, 40, 71], "53": 8, "535": 0, "5400": 18, "55": 41, "56": 40, "5610030a": 4, "574": 8, "586": 8, "5e": 18, "5m": 14, "6": [2, 10, 12, 13, 14, 15, 16, 17, 24], "60": [15, 19, 40], "600": 2, "624933": 4, "64": [8, 12, 13, 15, 16, 72], "65534": 13, "65535": 13, "65536": 2, "67108864": 15, "6b": 19, "6d": 19, "7": [2, 10, 13, 15, 16, 18, 19, 24, 31], "7000": 16, "75": 7, "78": 18, "8": [2, 4, 5, 8, 10, 12, 13, 15, 16, 18, 22, 23, 24, 25, 40, 49, 57, 94], "8558p": 14, "8x10": 11, "8x10g": [7, 11, 14], "9": [1, 2, 10, 13, 23, 24, 31], "90": [3, 18], "9000": [11, 15], "9001": 15, "9100": 15, "919147": 4, "96": 18, "99": 12, "9m": [2, 14], "A": [0, 1, 2, 10, 14, 15, 18, 19], "AND": 10, "AS": 19, "And": 19, "As": [15, 19], "At": [4, 6, 14, 17], "BE": 19, "BEING": 19, "BUT": 19, "BY": 19, "But": 19, "By": [10, 12, 18, 19], "FOR": 19, "For": [1, 2, 3, 4, 6, 8, 11, 12, 14, 15, 16, 18, 19, 20, 23, 24, 28, 29, 37, 40, 41, 49, 64, 66], "IF": 19, "IN": 19, "If": [2, 3, 4, 7, 10, 12, 15, 18, 19, 31, 37, 40, 49, 61, 65, 69, 75, 93, 98], "In": [1, 3, 4, 5, 6, 7, 8, 10, 11, 14, 15, 16, 18, 19, 26, 37, 40, 99], "It": [2, 4, 5, 6, 7, 10, 11, 12, 15, 16, 17, 18, 19, 25, 28, 30, 37, 66], "NO": 19, "NOT": [18, 19, 26], "No": [3, 7, 15, 19, 37, 40, 66, 71], "Not": [19, 37, 40, 50], "OF": [10, 19], "ON": [4, 11], "OR": 19, "Of": [6, 19], "On": [4, 15, 17, 24], "One": [1, 6, 8, 12, 15, 41], "Or": 4, "SUCH": 19, "Such": [6, 10, 14, 15, 19], "THE": 19, "THERE": 19, "TO": 19, "That": 10, "The": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 15, 16, 18, 19, 27, 31, 40, 75], "Then": [6, 12, 22, 31], "There": [1, 2, 7, 12, 18, 25, 26, 69], "These": [1, 2, 4, 11, 12, 15, 18, 27], "To": [1, 3, 4, 8, 12, 15, 16, 19, 20, 23, 25, 40], "WILL": 19, "WITH": 19, "With": [1, 3, 23], "_": 3, "_0": 3, "_1": 3, "_2": 3, "_b": 3, "_d": 3, "_end": 2, "_i": 3, "aaregui": 2, "abbrevi": 10, "abil": 19, "abl": 8, "about": [1, 2, 3, 4, 7, 10, 18, 19, 27, 31, 40, 66], "abov": [1, 2, 3, 4, 7, 8, 15, 16, 18, 19, 24, 65], "absenc": [15, 19], "absent": [1, 2, 3, 24], "absolut": [3, 19], "abus": 19, "acceler": [0, 4, 7], "accept": [3, 8, 10, 15, 19, 37, 40, 69, 71, 95, 97, 98, 99], "access": [2, 4, 7, 10, 13, 19, 24, 26], "accommod": [7, 12, 14], "accompani": [19, 28], "accord": [1, 4, 7, 8, 9, 14, 15, 18, 19, 65], "accordingli": 10, "account": [2, 40, 41], "accumul": 3, "acentr": 3, "achiev": 19, "ack_cod": 15, "ack_fifo_max_occup": 15, "ack_fifo_occup": 15, "ack_for": 15, "ack_processed_imag": 15, "acknowledg": [2, 10, 15, 19, 30], "acquir": [19, 31], "acquisit": [0, 2, 9, 18, 30, 31, 40, 49, 99], "acronym": 10, "across": [2, 3, 15, 19], "act": 10, "acta": 3, "action": [13, 19], "action_config": 13, "activ": [3, 15, 19], "actual": [6, 12, 15, 19, 40], "ad": [2, 8, 18, 19, 27, 37, 64], "adapt": [2, 10, 19], "adc": 2, "add": [2, 4, 10, 18, 19, 23, 25], "addit": [2, 4, 7, 10, 18, 19, 26], "addr": [15, 66], "address": [1, 10, 11, 12, 13, 15, 18, 19, 22, 27, 66, 76, 95, 97, 98, 99], "adjac": 3, "adjust": [2, 3, 11, 12, 40, 65, 71], "adopt": [12, 19], "adu": [1, 9, 65, 80], "adu_histogram": 1, "adu_histogram_bin_width": 1, "advanc": 30, "advers": 19, "advis": [10, 19], "affect": [2, 19, 40, 65, 69], "affero": 19, "affirm": 19, "after": [2, 3, 10, 12, 15, 18, 19, 40, 69], "again": 40, "against": [3, 10, 19], "aggreg": 19, "agre": [18, 19], "agreement": 19, "aim": [18, 19], "air": 7, "al": [3, 8], "albula": [18, 55], "algorithm": [1, 3, 26, 31, 40, 58, 68, 69], "align": [2, 15], "aligna": 15, "all": [1, 2, 3, 4, 8, 10, 11, 12, 15, 16, 18, 19, 27, 31, 37, 40, 41, 49, 51, 55, 66, 71, 92, 95, 97, 98, 99], "alleg": [10, 19], "alloc": 12, "allow": [1, 2, 3, 6, 7, 8, 10, 14, 15, 16, 17, 18, 19, 22, 31, 37, 40, 70, 99], "allwai": 4, "alon": [1, 8], "along": [1, 2, 3, 19, 61], "alpha": [1, 3, 18, 38, 96], "alreadi": [4, 15, 19, 40], "also": [2, 3, 4, 6, 8, 10, 11, 14, 15, 16, 17, 18, 19, 22, 23, 24, 25, 26, 40, 55, 69, 71, 99], "alter": 13, "altern": [1, 2, 3, 15, 16, 19], "although": 19, "alveo": [7, 11], "alwai": [2, 8, 15, 18, 37, 40, 93, 98], "ambig": 99, "ambigu": 3, "amd": [0, 7, 11, 14, 24], "among": [10, 19], "amplitud": 3, "an": [1, 2, 4, 8, 10, 12, 15, 19, 20, 26, 31, 32, 33, 34, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 48, 49, 51, 54, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99], "analysi": [1, 2, 4, 5, 9, 16, 18, 30, 31, 54], "analyz": [1, 2], "ancillari": 19, "angl": [1, 2, 3, 6, 8, 32, 37, 40, 90, 92], "angle_deg": 80, "angstrom": [1, 18, 38, 40, 91, 93, 96], "angular": [1, 3], "ani": [1, 3, 7, 10, 11, 14, 15, 18, 19, 37, 40, 93], "annulu": 3, "anod": 70, "anoth": [10, 40], "anti": 19, "anymor": 2, "anyon": [10, 19], "anyth": [18, 19], "anytim": [40, 93], "aocc": 24, "ap": 18, "api": [2, 16, 19, 20, 23, 28, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99], "api_cli": [31, 40, 71], "api_inst": [31, 40, 71], "api_respons": 40, "apicli": [31, 40, 71], "apiexcept": [31, 40, 71], "appear": [3, 93], "appendic": 1, "appendix": 37, "appl": 8, "appli": [1, 2, 8, 10, 13, 18, 26, 31, 32, 37, 40, 41], "applic": [0, 4, 10, 12, 16, 17, 19, 31, 40, 49, 71], "apply_mask": 65, "approach": [3, 31], "appropri": [3, 19], "approv": 10, "approx": 3, "approxim": [1, 3, 8, 15, 19], "apr": 0, "apt": [17, 23, 25], "ar": [1, 2, 3, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17, 18, 19, 22, 23, 25, 26, 27, 28, 31, 37, 40, 41, 55, 64, 65, 69, 71, 72, 92, 97, 98, 99], "arbitrari": [1, 2, 24, 39], "architectur": 2, "archiv": 15, "arctan": 3, "area": [1, 2, 3, 8, 19, 37, 40, 82], "aris": [10, 19], "arithmet": [3, 24], "arm": 1, "arm_dat": 1, "around": 3, "arp": 11, "arrai": [0, 1, 15, 22, 31, 37, 40, 78], "arrang": 19, "articl": 19, "asc": 23, "asic": [40, 47], "ask": 19, "assembli": 10, "assert": 19, "asset": 19, "assign": [3, 8, 11, 15, 40], "associ": [3, 10, 12, 19, 92], "assum": [2, 3, 18, 19, 37, 78], "assumpt": [3, 19], "assur": [10, 19], "async": [33, 40], "async_start": [37, 40], "asynchron": [2, 15], "attach": [11, 19], "attempt": [3, 10, 18, 19], "attenu": [1, 37], "attenuator_transmiss": [1, 37], "attribut": 19, "author": 19, "auto": [2, 4, 11, 16, 52, 68], "autobuild": 12, "autocontrast": 40, "autoindex": 3, "autom": [2, 16, 26, 54], "automat": [2, 7, 12, 15, 19, 24, 31, 37, 40, 65, 75], "autoproc": 2, "auxiliari": 3, "avail": [1, 2, 7, 10, 12, 15, 19, 25, 31, 33, 40, 41, 64, 69], "available_slot": 64, "averag": 75, "avoid": [2, 3, 4, 12, 15, 19, 64, 99], "awai": 19, "axi": [1, 2, 3, 7, 31, 40, 90], "az_int": 74, "az_int_bin_to_phi": 1, "az_int_bin_to_q": 1, "az_int_bin_to_two_theta": 1, "az_int_phi_bin_count": 1, "az_int_profil": 1, "az_int_q_bin_count": 1, "az_int_result": 1, "azim": [1, 40, 89], "azim_int": [16, 31, 40, 72], "azim_int_set": [32, 40], "azim_int_settings_dict": 32, "azim_int_settings_from_dict": 32, "azim_int_settings_inst": 32, "azimintset": [31, 40, 72, 74], "azimuth": [1, 2, 9, 18, 31, 32, 40, 83], "azimuthal_bin": 32, "azint": [18, 79], "azint_tim": 1, "azint_unit": 40, "b": [0, 1, 2, 10, 18, 19, 38, 63, 92, 96], "b_factor": [1, 62], "back": [2, 3, 15, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99], "background": [1, 2, 18, 63, 92, 93], "backlog": 15, "backport": 12, "bad": [2, 3, 8, 18], "bandwidth": 9, "bar": [2, 3, 4], "base": [1, 2, 3, 8, 9, 10, 12, 18, 19, 25, 29, 40, 49, 98], "base64": 24, "base_class": 70, "base_data_ipv4_address": [16, 41], "base_ipv4_addr": [43, 44], "base_mac_addr": 57, "basi": [1, 3, 8, 14, 15, 24], "basic": [11, 18, 19], "bayesian": 3, "bdf": 4, "beam": [1, 2, 3, 6, 18, 37, 40, 49, 58, 75], "beam_cent": 1, "beam_center_i": [1, 37], "beam_center_tetragon": 1, "beam_center_x": [1, 37], "beam_corr_i": [1, 18], "beam_corr_x": [1, 18], "beam_x_pxl": [18, 37], "beam_y_pxl": [18, 37], "beamcent": 58, "beamlin": [2, 3], "beat": 13, "becaus": [3, 14, 19], "becom": 10, "been": [2, 19], "befor": [2, 7, 8, 12, 13, 40, 72], "begin": [3, 37], "behalf": [10, 19], "behavior": [2, 11, 12, 15, 16, 18, 40], "behen": 2, "being": [2, 6, 10, 12, 15, 18, 19, 40, 99], "believ": [10, 19], "belong": [2, 15, 18, 22], "below": [3, 8, 9, 10, 12, 13, 15, 19, 32, 33, 34, 36, 37, 38, 39, 41, 42, 43, 44, 45, 48, 49, 51, 54, 56, 57, 59, 60, 61, 62, 63, 64, 65, 66, 69, 70, 72, 73, 74, 75, 76, 77, 78, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99], "benchmark": 26, "beneficiari": 10, "benefit": 19, "besid": [8, 33], "best": [14, 19], "beta": [1, 2, 3, 18, 38, 96], "better": [2, 4, 55], "between": [1, 2, 3, 12, 15, 18, 19, 36, 40, 41, 49, 69, 74, 90, 93], "beyond": [1, 3, 19], "bia": 3, "bias": 3, "bin": [1, 2, 3, 8, 16, 18, 31, 32, 40], "bin_to_q": 18, "binari": [1, 2, 15, 18, 22, 24, 31, 40], "bind": [15, 72], "biologi": 0, "bit": [1, 2, 4, 8, 12, 13, 15, 18, 22, 31, 40, 41, 49, 65], "bit_depth_imag": [16, 65], "bit_depth_readout": 1, "bitshuffl": [1, 2, 24], "bitstream": 7, "bkg": [1, 63, 92], "bkg_estim": [1, 62, 75, 79], "bkgestim": 18, "blackwel": 2, "blackwhit": 35, "blk": [16, 76], "blob": 40, "block": [2, 15, 18, 40, 69, 76], "bmod": 3, "board": [4, 5, 7, 14, 31, 51], "bodi": [19, 40, 71], "bool": [1, 32, 37, 40, 41, 49, 56, 57, 61, 65, 69, 70, 72, 75, 82, 93, 97, 98], "boolean": 15, "both": [1, 2, 3, 4, 7, 10, 11, 12, 18, 19, 40, 78], "bottom": [6, 11, 61, 94], "bound": [3, 15, 40, 85], "boundari": 65, "box": [1, 2, 8, 19, 85, 86, 89], "bragg": [1, 2, 93], "bragg_prediction_tim": 1, "brake": 2, "bravai": [1, 18], "bravais_lattic": 18, "breach": 10, "break": [2, 3, 15, 28, 64], "brief": [3, 10, 19], "broadcast": 11, "broker": [2, 15, 74], "broker_loc": 16, "broker_statu": [2, 33, 40], "broker_status_dict": 33, "broker_status_from_dict": 33, "broker_status_inst": 33, "broker_vers": 33, "brokerstatu": [31, 40, 74], "browser": 4, "bruckner": 0, "bsd": 0, "bslz4": [1, 37], "bszstd": 1, "bu": 4, "buffer": [1, 2, 9, 15, 18, 31, 40, 64, 72, 74, 95, 99], "bug": [2, 25], "bugfix": 2, "bui": 14, "build": [2, 4, 16, 24, 31], "built": [2, 4, 7, 8, 12, 14, 17, 24, 72], "bunch": 1, "bundl": [15, 16], "burst": 52, "busi": [2, 10, 19, 50], "buttom": 2, "button": 2, "byte": [1, 13, 15, 40], "bytearrai": 40, "c": [0, 1, 2, 3, 7, 10, 18, 19, 24, 38, 96], "c_": 3, "cabl": [7, 11], "cach": 9, "calcul": [1, 2, 9, 13, 16, 29, 31, 36, 37, 40], "calibr": [2, 4, 12, 13, 15, 29, 31, 37, 40, 41, 74], "calibration_fil": [16, 41], "calibration_statistics_inn": [34, 40], "calibration_statistics_inner_dict": 34, "calibration_statistics_inner_from_dict": 34, "calibration_statistics_inner_inst": 34, "calibrationstatisticsinn": [31, 40, 74], "call": [4, 5, 12, 19, 31, 40, 71], "can": [1, 2, 3, 4, 5, 6, 8, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22, 23, 25, 27, 28, 30, 31, 37, 40, 41, 49, 61, 64, 71, 75, 93], "cancel": [9, 13, 15, 18, 31, 40, 75], "cancel_post": [30, 31], "cannot": [2, 8, 15, 19, 40, 41, 71], "capabl": 8, "card": [7, 8, 11, 12, 13, 14, 26, 27, 40], "care": [1, 2, 6, 8, 11], "carri": [3, 10, 13, 18, 19], "cascad": 2, "case": [1, 2, 3, 4, 6, 10, 11, 12, 13, 14, 15, 16, 18, 19, 28, 40, 65, 93, 98, 99], "castellan": 0, "cat": 12, "catch2": [2, 24], "catchorg": 24, "categor": 15, "categori": 2, "caus": [10, 19], "cbf": [1, 2, 55], "cbor": [2, 15, 16, 28, 30, 31, 37, 40, 67, 97, 98, 99], "cd": [4, 7, 16], "cdot": 3, "ceas": [10, 19], "cell": [1, 2, 12, 13, 18, 37, 38, 40, 49, 58, 62, 63, 69, 92, 96], "center": [1, 2, 6, 7, 18, 37, 40, 58, 87], "center_x_pxl": 87, "center_y_pxl": 87, "cento": 23, "centric": 3, "centroid": 3, "cere": [2, 24], "cern": 19, "certain": [8, 9, 12, 18, 19], "certif": 73, "cessat": 19, "cf": 18, "ch": [23, 31], "chang": [2, 3, 12, 18, 19, 28, 31, 40, 64, 71, 93], "changelog": [28, 30], "channel": [1, 13], "charact": 10, "character": 19, "characterist": 10, "charg": [10, 19], "chart": 2, "chassi": 4, "check": [2, 3, 4, 18, 24, 69], "chip": [8, 22, 65], "choic": 3, "choos": [2, 3, 14, 19, 31, 40], "chosen": [3, 15], "christian": 24, "ci": [2, 26], "circ": 3, "circl": [1, 2, 3, 87, 89], "circular": [2, 87, 88], "circumst": [10, 19], "circumvent": 19, "citat": 0, "civil": 19, "claim": [10, 19], "clang": 24, "clarif": 30, "clarifi": [2, 14], "clariti": 2, "class": [1, 2, 3, 12, 18, 19, 31, 40, 70, 71], "classic": 3, "classif": [1, 3], "classifi": 3, "clean": 2, "cleanup": 2, "clear": [2, 13, 19, 27, 31, 40], "clearli": 19, "client": [2, 19, 24, 40, 71], "clion": 12, "clipboard": 2, "clock": 13, "clockwis": 6, "close": [2, 18, 19, 40, 93], "closest": 37, "cmac": 13, "cmake": [2, 4, 7, 16, 24], "co": 3, "coars": 3, "code": [1, 2, 3, 5, 10, 12, 14, 15, 16, 18, 19, 24, 31, 40, 70, 71], "codegen": 31, "coeffici": [3, 13], "cold": 4, "colinear": 2, "collabor": 10, "collect": [1, 2, 8, 13, 15, 16, 17, 18, 19, 22, 27, 31, 33, 36, 37, 40, 49, 64, 75, 93, 98], "collection_effici": 75, "collet": 24, "collinear": 3, "colon": 37, "color": [2, 40], "colormap": 0, "column": 2, "com": [11, 24, 25], "combin": [3, 19], "come": [10, 12, 19, 40, 70], "command": [4, 7, 18, 19, 40], "commerci": [7, 19], "commit": [7, 19], "common": [2, 19, 25, 92], "commonli": 3, "commun": [1, 10, 12, 15, 19, 31], "compar": [3, 64], "compat": [0, 1, 2, 3, 4, 10, 11, 12, 14, 18, 25], "compil": [2, 4, 5, 10, 17, 19, 24, 25], "complaint": 2, "complementari": 3, "complet": [3, 10, 13, 15], "complex": [6, 12, 14], "compli": [10, 19], "complianc": [10, 19, 70], "compliant": [1, 18], "complic": 12, "compon": [10, 19, 23, 28], "compos": 65, "compress": [2, 4, 9, 13, 24, 37, 75], "compression_ratio": 75, "compression_tim": 1, "compris": 3, "comput": [2, 3, 6, 11, 16, 19], "concept": 3, "concern": [10, 19], "condit": [2, 3, 10, 13, 22], "config": [2, 22, 23, 31, 40, 71], "config_azim_int_get": [30, 31], "config_azim_int_put": [30, 31], "config_dark_mask_get": [30, 31], "config_dark_mask_put": [30, 31], "config_detector_get": [30, 31], "config_detector_put": [30, 31], "config_file_writer_get": [30, 31], "config_file_writer_put": [30, 31], "config_image_format_conversion_post": [30, 31], "config_image_format_get": [30, 31], "config_image_format_put": [30, 31], "config_image_format_raw_post": [30, 31], "config_indexing_get": [30, 31], "config_indexing_put": [30, 31], "config_instrument_get": [30, 31], "config_instrument_put": [30, 31], "config_internal_generator_image_put": [30, 31], "config_internal_generator_image_tiff_put": [30, 31], "config_mask_get": [30, 31], "config_mask_tiff_get": [30, 31], "config_roi_get": [30, 31], "config_roi_put": [30, 31], "config_select_detector_get": [30, 31], "config_select_detector_put": [30, 31], "config_spot_finding_get": [30, 31], "config_spot_finding_put": [30, 31], "config_user_mask_get": [30, 31], "config_user_mask_put": [30, 31], "config_user_mask_tiff_get": [30, 31], "config_user_mask_tiff_put": [30, 31], "config_zeromq_metadata_get": [30, 31], "config_zeromq_metadata_put": [30, 31], "config_zeromq_preview_get": [30, 31], "config_zeromq_preview_put": [30, 31], "configur": [1, 2, 3, 6, 10, 12, 14, 18, 27, 28, 29, 31, 32, 40, 71, 72, 95, 99], "confirm": [4, 15], "conflat": 15, "confus": [2, 6], "connect": [2, 4, 7, 8, 11, 14, 15, 18, 19, 40, 50, 66], "connected_writ": 66, "connector": [7, 11], "consecut": [2, 49], "consequ": 19, "consequenti": [10, 19], "consid": [2, 3, 8, 10, 19, 28, 36, 49, 69, 93], "consider": 12, "consist": [2, 3, 6, 19, 40], "consortium": 25, "conspicu": 19, "const": 3, "constant": [8, 13, 66], "constantli": [2, 19], "constitut": [10, 19], "constrain": 8, "constraint": 3, "constru": 19, "construct": 3, "consum": 19, "consumpt": 14, "contact": 19, "contain": [1, 2, 3, 4, 10, 15, 16, 17, 18, 19, 40, 71], "content": [2, 12, 15, 19, 40, 71], "context": [2, 19, 31, 40, 71], "continu": [7, 10, 12, 15, 19], "contract": [3, 10], "contractu": 19, "contradict": 19, "contrast": [2, 19, 40, 82], "contribut": [0, 3], "contributor": 19, "contributori": 10, "control": [2, 3, 5, 6, 7, 9, 13, 15, 17, 19, 20, 31, 40, 65], "convei": [10, 19], "conveni": [19, 20, 23], "convent": [1, 2, 15, 41, 97, 98, 99], "converg": 3, "convers": [1, 2, 9, 13, 31, 40], "convert": [2, 3, 8, 32, 33, 34, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 48, 49, 51, 54, 56, 57, 59, 60, 61, 62, 63, 64, 65, 66, 69, 70, 72, 73, 74, 75, 76, 77, 78, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99], "convey": [10, 19], "cool": 7, "coordin": [2, 18, 40, 78, 85, 87], "cope": 15, "copi": [2, 4, 10, 12, 19], "copper": [11, 14], "copyleft": [19, 31], "copyright": [10, 19], "core": [0, 2, 7, 9, 11, 13], "corner": [2, 6, 41, 94], "corpor": 4, "corr": 3, "correct": [1, 2, 4, 8, 9, 11, 15, 18, 19, 32], "correctli": 2, "correl": 69, "correspond": [1, 3, 6, 10, 11, 18, 19], "cost": [7, 10, 14, 19], "could": [2, 11, 19, 66], "couldn": 2, "count": [1, 2, 3, 8, 9, 12, 13, 18, 36, 37, 41, 49, 63, 65, 69, 75, 92], "count_tim": 1, "count_time_u": [16, 49], "counter": [12, 13, 27, 64], "counterclaim": [10, 19], "countrat": 1, "countrate_correction_en": 1, "countri": 19, "cours": 19, "court": 19, "coven": 19, "cover": [3, 10, 19, 40, 71], "coverag": 19, "cpp": 24, "cpu": [1, 2, 4, 5, 8, 16, 19, 24, 30, 40, 72], "creat": [2, 7, 10, 12, 15, 18, 22, 31, 32, 33, 34, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 48, 49, 51, 54, 56, 57, 59, 60, 61, 62, 63, 64, 65, 66, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99], "criteria": [3, 8], "criterion": [3, 8, 19], "critic": 2, "crop": 2, "cross": [10, 19], "cryst": [3, 8], "crystal": [1, 2, 3, 18, 37, 90, 91, 93], "crystallograph": [18, 30], "crystallographi": [2, 18, 25, 37, 69], "crystfel": [3, 18, 26], "ctrl": 2, "cubic": [1, 3], "cuda": [2, 14, 17, 19, 23, 24], "cuda12": 23, "cuda13": 23, "cuenca": 0, "cure": [10, 19], "curl": [22, 23], "current": [1, 2, 3, 5, 7, 8, 11, 12, 14, 18, 23, 24, 25, 29, 30, 31, 37, 40, 50, 64], "current_count": 64, "current_id": 42, "cursor": 2, "custom": [15, 18, 19, 31, 40], "custom_geometri": [16, 41], "customarili": 19, "cut": [3, 7], "cutter": 24, "cv": 25, "cxi": 18, "cyan": 2, "cycl": 4, "d": [1, 2, 3, 10, 12, 19, 23, 93], "d55": 3, "d66": 3, "d_": 3, "d_a": 80, "dai": [10, 19], "damag": [10, 19], "danger": 19, "dark": [2, 22, 31, 36, 40], "dark_mask": [31, 40, 72, 74], "dark_mask_set": [36, 40], "dark_mask_settings_dict": 36, "dark_mask_settings_from_dict": 36, "dark_mask_settings_inst": 36, "darkmaskset": [31, 40, 72, 74], "data": [0, 2, 4, 5, 7, 10, 12, 13, 16, 19, 22, 27, 30, 31, 33, 37, 39, 40, 49, 55, 59, 64, 71, 75, 93, 98], "data_collect": [31, 40], "data_collection_effici": 1, "data_collection_efficiency_imag": 18, "data_processing_set": 74, "data_reduction_factor_serialmx": [1, 37], "dataset": [1, 2, 16, 18, 26, 27, 32, 40, 55, 64, 93], "dataset_name_data_000001": 18, "dataset_set": [37, 40, 69], "dataset_settings_dict": 37, "dataset_settings_from_dict": 37, "dataset_settings_inst": 37, "dataset_settings_unit_cel": 38, "dataset_settings_unit_cell_dict": 38, "dataset_settings_unit_cell_from_dict": 38, "dataset_settings_unit_cell_inst": 38, "dataset_settings_xray_fluorescence_spectrum": 39, "dataset_settings_xray_fluorescence_spectrum_dict": 39, "dataset_settings_xray_fluorescence_spectrum_from_dict": 39, "dataset_settings_xray_fluorescence_spectrum_inst": 39, "datasetset": [31, 40], "datasetsettingsxrayfluorescencespectrum": [31, 37], "datawritefail": 15, "date": [1, 10, 19], "dbu": 2, "dcmake_install_prefix": 4, "dcu": [5, 18], "deactiv": [2, 31, 40], "deactivate_post": [30, 31], "dead": 15, "deadlock": 2, "deal": 10, "deb": 23, "debian": 23, "debug": [2, 13, 18, 72], "dec": 0, "decemb": 19, "decid": 19, "declar": 10, "declin": 19, "decod": [9, 13, 24], "decompress": 1, "decreas": 3, "dectri": [1, 2, 15, 17, 18, 22, 24, 25, 30, 40, 41, 49, 53, 55], "dedic": [2, 4, 9, 11, 15, 18, 25, 69], "deem": [10, 19], "default": [2, 4, 6, 12, 13, 16, 18, 31, 32, 33, 36, 37, 40, 41, 49, 56, 61, 65, 66, 69, 70, 71, 72, 78, 81, 82, 90, 93, 94, 95, 97, 98, 99], "default_set": 41, "defaultapi": [30, 31], "defect": 19, "defens": 19, "defin": [1, 2, 3, 6, 12, 13, 16, 18, 19, 20, 22, 28, 31, 40, 71, 75], "definit": [1, 2, 3, 4, 6, 10, 19, 31, 40, 61, 70, 90], "defint": 89, "deg": [1, 2], "degre": [1, 18, 38, 90, 96], "delai": [1, 2, 14, 18, 49], "delet": 10, "delta": 2, "delta_": 3, "deni": [15, 19], "denomin": 19, "depend": [2, 3, 4, 18, 40], "deploi": 4, "deploy": [2, 14, 17, 24, 30], "deposit": 65, "depriv": 19, "depth": [1, 2, 49, 65], "deriv": [3, 31], "describ": [1, 3, 7, 8, 16, 18, 22], "descript": [1, 10, 15, 16, 18, 31, 32, 33, 34, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 48, 49, 51, 54, 56, 57, 59, 60, 61, 62, 63, 64, 65, 66, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99], "descriptor": 3, "design": [3, 7, 8, 10, 11, 19, 28], "destin": [2, 11], "det": 3, "det_img": 62, "det_info": 18, "detail": [3, 4, 5, 6, 7, 10, 13, 16, 19, 20, 21, 26, 27, 29, 37], "detect": [1, 2, 4, 7, 12, 15, 18], "detect_ice_r": [1, 37, 69], "detector": [0, 1, 2, 3, 4, 7, 8, 9, 11, 12, 13, 14, 16, 17, 18, 22, 24, 29, 30, 31, 37, 40, 42, 43, 44, 49, 50, 51, 58, 62, 63, 65, 72, 74, 75, 92, 93, 94], "detector_descript": 1, "detector_dict": 41, "detector_dist": 1, "detector_distance_m": 18, "detector_distance_mm": 37, "detector_from_dict": 41, "detector_height": 75, "detector_height_pxl": 18, "detector_inst": 41, "detector_list": [40, 42, 74], "detector_list_detectors_inn": 43, "detector_list_detectors_inner_dict": 43, "detector_list_detectors_inner_from_dict": 43, "detector_list_detectors_inner_inst": 43, "detector_list_dict": 42, "detector_list_el": 44, "detector_list_element_dict": 44, "detector_list_element_from_dict": 44, "detector_list_element_inst": 44, "detector_list_from_dict": 42, "detector_list_inst": 42, "detector_modul": 45, "detector_module_dict": 45, "detector_module_from_dict": 45, "detector_module_inst": 45, "detector_numb": 2, "detector_pixel_depth": 75, "detector_select": [40, 48], "detector_selection_dict": 48, "detector_selection_from_dict": 48, "detector_selection_inst": 48, "detector_serial_numb": 1, "detector_set": [16, 40, 49, 72, 74], "detector_settings_dict": 49, "detector_settings_from_dict": 49, "detector_settings_inst": 49, "detector_statu": [40, 51], "detector_status_dict": 51, "detector_status_from_dict": 51, "detector_status_get": [30, 31], "detector_status_inst": 51, "detector_threshold_ke_v": 36, "detector_transl": 1, "detector_trigger_delay_n": [16, 49], "detector_width": 75, "detector_width_pxl": 18, "detectorlist": [31, 40, 74], "detectorlistel": [31, 42], "detectormodul": [31, 41], "detectormoduledirect": [31, 45], "detectorpowerst": [31, 51], "detectorselect": [31, 40], "detectorset": [31, 40, 41, 72, 74], "detectorspecif": [2, 18], "detectorst": [31, 51], "detectorstatu": [31, 40, 74], "detectortim": [31, 49], "detectortyp": [31, 41, 44], "determin": [3, 19, 49, 64], "dev": [12, 16, 27], "develop": [2, 8, 10, 16, 18, 19, 30, 31], "deviat": [1, 2, 3, 8], "devic": [2, 4, 10, 15, 16, 19, 27, 31, 40, 76], "diagnost": 3, "dial": 2, "diamond": 25, "dict": [32, 33, 34, 36, 37, 38, 39, 41, 42, 43, 44, 45, 48, 49, 51, 54, 56, 57, 59, 60, 61, 62, 63, 64, 65, 66, 69, 70, 72, 73, 74, 75, 76, 77, 78, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99], "dictat": 8, "dictionari": 70, "didn": 14, "differ": [1, 2, 3, 4, 10, 11, 12, 15, 18, 19, 25, 41], "difficult": 2, "diffract": [1, 2, 3, 4, 8, 17, 92, 93], "diffractionexperi": 2, "digit": [2, 10], "dimens": 18, "direct": [1, 2, 4, 7, 8, 10, 11, 15, 19, 27, 37, 41, 61, 66, 69, 75, 94], "directli": [7, 8, 10, 11, 14, 19, 24, 31], "directori": [2, 4, 12, 16, 24, 25, 29, 41], "disabl": [1, 11, 15, 18, 61, 65, 93], "discard": [3, 8, 75, 93], "disclaim": [10, 19], "disconnect": [2, 18], "discrep": 3, "discriminatori": 19, "disk": [4, 15, 17, 75], "diskquotaexceed": 15, "displai": [2, 10, 18, 19, 33], "dist": 4, "dist_ewald": 1, "distanc": [1, 2, 6, 18, 37, 69], "distinct": 18, "distinguish": [1, 2, 19], "distribut": [2, 3, 4, 10, 12, 15, 17, 19, 23, 25, 30, 31], "divid": 8, "divis": 2, "divisor": 3, "djfjoch_install_driver_sourc": 4, "djfjoch_use_cuda": 2, "djfjoch_viewer_build": 4, "djfjoch_writer_onli": 4, "dkm": 4, "dl380": 14, "dma": [12, 13], "dmesg": 4, "dnf": [12, 23], "do": [4, 14, 19, 31, 65], "docker": 2, "document": [1, 2, 3, 6, 7, 9, 10, 18, 19, 20, 21, 37], "doe": [3, 10, 15, 19, 40, 75], "doesn": [2, 4, 5, 11, 14, 15, 22, 25, 31, 40, 65, 69], "doi": 0, "domain": [0, 19], "domin": 3, "don": [2, 25, 40, 65], "donat": 0, "done": [2, 4, 8, 12, 13, 31, 37, 40], "dot": 3, "doubl": 37, "doubt": 19, "down": 2, "download": [4, 7, 17, 24, 25], "downstream": [1, 3, 8, 15, 16, 19], "downward": [2, 6], "dracut": 4, "draw": 2, "driven": 3, "driver": [2, 23, 28, 30], "drop": [2, 15], "dtype": 22, "due": [2, 7, 15, 75, 93], "dump": 15, "durabl": 19, "dure": [1, 2, 3, 7, 15, 17, 18, 22, 27, 33, 37, 40, 66, 77, 93], "durin": [18, 25, 26], "dwell": 19, "dynam": [2, 18, 19], "e": [1, 3, 4, 9, 14, 15, 18, 19, 25, 27, 31, 37, 40, 69, 70, 71, 75, 90, 92, 93], "e1m": 16, "e9m": 2, "each": [1, 2, 3, 8, 9, 10, 11, 12, 15, 18, 19, 37, 39, 40, 66, 75], "earli": 2, "earlier": [10, 19], "easier": 2, "easili": 10, "echo": 23, "edg": [3, 7, 8, 22, 93], "effect": [10, 19, 37, 40, 69, 98], "effici": [1, 2, 26, 63, 92], "effort": [14, 19], "eigen": 24, "eiger": [1, 2, 4, 5, 8, 9, 16, 40, 41, 49, 53], "eiger2": 2, "eiger2cbf": 2, "eiger_bit_depth": 49, "eiger_threshold_ke_v": 49, "eiger_threshold_kev": 16, "either": [10, 19, 40, 41, 64, 75], "el8": [4, 23], "elabor": 3, "electr": 14, "electron": [1, 2, 19, 37, 70], "electron_sourc": [16, 70], "elem_s": 1, "element": [1, 2, 40, 61], "ellips": 2, "embed": [17, 18], "embodi": 19, "employ": 19, "empti": [1, 2, 18, 37, 40, 41, 71], "enabl": [1, 2, 3, 4, 8, 10, 11, 15, 16, 18, 19, 37, 61, 65, 93, 97, 98], "encod": [1, 22, 24], "encount": [11, 13, 14, 27, 40], "encourag": 3, "end": [2, 3, 10, 13, 15, 18, 19, 25, 66, 75, 99], "end_dat": 1, "end_tim": 1, "endfail": 15, "endors": 10, "endpoint": 40, "energi": [1, 2, 8, 13, 18, 36, 37, 39, 49, 65], "energy_e_v": 39, "energy_ev": 39, "enforc": [3, 10, 11, 19, 70], "eng": 0, "engelmann": 18, "enough": [2, 6, 12, 14, 16], "ensur": [6, 10, 14, 18, 19, 40], "enter": [19, 31, 40, 71], "enterpris": [4, 12, 24], "entir": [10, 19], "entiti": [10, 19], "entri": [2, 11, 15, 18, 37, 41], "enumer": 54, "environ": [2, 12], "epel": 12, "equal": [12, 18], "equat": 2, "equip": [1, 7, 11, 17, 29], "equival": [3, 10, 15, 18, 19, 26, 37], "err": 92, "erron": 19, "error": [1, 2, 6, 7, 8, 13, 15, 22, 33, 37, 40, 50, 71, 75, 92], "error_messag": [2, 54], "error_message_dict": 54, "error_message_from_dict": 54, "error_message_inst": 54, "error_pixel": [75, 79], "error_pixel_count": 1, "error_valu": 1, "errormessag": 31, "escap": 18, "especi": [2, 33], "essenti": [10, 19], "establish": 2, "estim": [1, 2, 7, 18, 40, 63, 92], "et": [3, 8], "etc": [4, 12, 13, 16, 18, 23, 31], "eth": [0, 13], "eth_link_count": 57, "eth_link_statu": 57, "ethernet": [0, 7, 11, 13, 14, 27], "ev": 1, "evalu": [2, 3], "even": [2, 10, 12, 19, 93], "event": [1, 2, 18, 19, 31, 40, 70], "event_cod": [31, 40], "eventcod": 18, "ever": 19, "everi": [2, 7, 11, 15, 19, 61, 70], "everyon": 19, "everyth": [40, 71], "ewald": [1, 18, 92], "exact": [9, 19], "exactli": [7, 39], "exampl": [1, 4, 6, 8, 12, 16, 18, 19, 26], "exce": 3, "exceed": [7, 15], "except": [10, 15, 31, 40, 71], "excess": 2, "exchang": 13, "excl": [1, 8, 18], "exclud": [1, 2, 3, 8, 10, 15, 18, 19, 23], "exclus": [1, 10, 19, 61], "excus": 19, "execut": [2, 7, 19, 26, 27, 31, 40, 69], "exemplari": 10, "exercis": [10, 19], "exhaust": 3, "exist": [1, 2, 18, 27, 56], "exp": 3, "expans": 28, "expect": [1, 2, 13, 14, 15, 18, 19, 37, 40, 57, 75, 93], "expens": 10, "experi": [2, 11, 29, 37, 66, 75], "experiment": [1, 2, 3, 5, 24, 37, 40, 93], "experiment_group": [1, 18, 37, 75], "experimental_coord": 40, "explain": [4, 9, 19], "explicitli": [1, 10, 19, 31], "exponenti": 2, "export": 2, "exposur": [1, 2, 18, 49, 65], "express": [7, 9, 10, 19], "expressli": 19, "exptim": 18, "extend": [13, 19, 40, 65], "extens": [2, 18, 19], "extent": [3, 10, 19], "extern": [2, 17, 24, 40, 75], "extra": [1, 2, 4, 6, 72], "extract": [2, 3], "extrem": 3, "f": [0, 1, 2, 4, 11, 18, 19], "facebook": 24, "facil": [1, 14, 19], "facilit": 4, "factor": [1, 2, 13, 32, 37, 63, 92], "factual": 10, "fail": [2, 10, 15, 19], "failur": 19, "fair": [10, 19], "fall": [3, 15], "fals": [15, 16, 37, 40, 49, 56, 61, 65, 69, 70, 72, 82, 93], "famili": 19, "faq": 10, "far": [14, 40, 92], "fashion": 19, "fast": [1, 3, 14, 24, 61], "fast_axi": [16, 45], "fatal": 15, "fault": 2, "favor": 19, "featur": [1, 2, 3, 8, 15, 18, 19, 28, 93], "fee": [10, 19], "feed": 3, "feedback": [3, 14, 15, 24], "felix": 18, "few": [1, 40, 93], "ffbidx": [1, 2, 68, 69], "fft": [1, 2, 68, 69], "fft_high_resolution_a": 69, "fft_max_unit_cell_a": 69, "fft_min_unit_cell_a": 69, "fft_num_vector": 69, "fftindex": 2, "fftw": [1, 2, 24, 68], "fgen": 27, "fiber": 11, "field": [1, 2, 15, 16, 18, 54], "fifo": [2, 13, 15, 66], "file": [1, 2, 4, 6, 7, 10, 15, 16, 17, 19, 22, 23, 24, 25, 26, 28, 31, 37, 40, 41, 55, 56, 72, 95, 97, 98, 99], "file_format": 1, "file_numb": 18, "file_prefix": [1, 15, 18, 37, 75, 91], "file_writ": [31, 40, 72], "file_writer_set": [40, 56, 74], "file_writer_settings_dict": 56, "file_writer_settings_from_dict": 56, "file_writer_settings_inst": 56, "filenam": [18, 37], "filewriter1": 25, "filewriterformat": [31, 56], "filewriterset": [31, 40, 72, 74], "filip": 31, "fill": [22, 40], "filter": [1, 2, 3, 24, 37, 75], "final": [2, 15, 19, 40], "find": [1, 2, 9, 18, 19, 26, 31, 37, 40, 58, 82, 93], "finder": [2, 8, 13], "fine": 3, "finish": [1, 2, 10, 18, 40, 99], "finnisar": 11, "firewal": 13, "firmwar": [2, 5, 16], "first": [1, 2, 4, 10, 12, 15, 18, 19, 22, 25, 94], "fit": [1, 2, 3, 10, 12, 19], "fix": [2, 3, 8, 11, 12, 13, 15, 16, 19, 49, 70], "flag": [2, 3, 4, 12, 13, 15, 22, 37], "flash": 13, "flat": [3, 6], "flatfield": 1, "flatfield_en": 1, "flatten": 1, "flexibl": [1, 2, 8], "flip": [2, 61], "float": [1, 2, 13, 18, 31, 32, 33, 34, 36, 37, 38, 39, 40, 41, 44, 45, 49, 57, 59, 61, 62, 63, 65, 69, 75, 78, 81, 82, 84, 87, 90, 91, 92, 93, 96], "flow": [2, 7, 8, 15, 19, 30], "fluoresc": [1, 2, 39], "flux": [1, 37], "fly": [1, 18, 30], "focus": 3, "folder": [4, 26], "follow": [1, 3, 4, 6, 7, 8, 9, 12, 13, 14, 15, 16, 18, 19, 22, 23, 24, 25, 28, 29, 31, 70, 97, 98, 99], "follow_up": 2, "forbid": 19, "forc": [2, 3, 4, 19], "foreground": 2, "fork": 2, "form": [3, 9, 10, 19], "format": [1, 2, 4, 6, 10, 15, 16, 19, 25, 28, 31, 37, 40, 55, 56], "former": 2, "formula": [2, 8], "forward": [1, 15, 16, 37, 75, 99], "found": [4, 19], "foundat": [10, 19], "four": [4, 16], "fourier": 3, "fpga": [1, 2, 5, 16, 19, 26, 27, 28, 31, 40, 49, 51, 74], "fpga_statu": [31, 40], "fpga_status_get": [30, 31], "fpga_status_inn": [40, 57], "fpga_status_inner_dict": 57, "fpga_status_inner_from_dict": 57, "fpga_status_inner_inst": 57, "fpga_temp_c": 57, "fpga_temp_deg_c": 51, "fpgastatusinn": [31, 40, 74], "frame": [1, 2, 6, 11, 13, 14, 16, 27, 36, 37, 40, 41, 49, 64, 69, 98], "frame_gener": 13, "frame_tim": [1, 37], "frame_time_u": [16, 36, 49], "free": [1, 10, 15, 18, 19, 70, 99], "freedom": [10, 19], "frequenc": 2, "fresh": 4, "friendli": [2, 29], "from": [0, 1, 2, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 23, 24, 25, 27, 29, 31, 32, 33, 34, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 48, 49, 51, 54, 56, 57, 59, 60, 61, 62, 63, 64, 65, 66, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99], "from_dict": [32, 33, 34, 36, 37, 38, 39, 41, 42, 43, 44, 45, 48, 49, 51, 54, 56, 57, 59, 60, 61, 62, 63, 64, 65, 66, 69, 70, 72, 73, 74, 75, 76, 77, 78, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99], "from_json": [32, 33, 34, 36, 37, 38, 39, 41, 42, 43, 44, 45, 48, 49, 51, 54, 56, 57, 59, 60, 61, 62, 63, 64, 65, 66, 69, 70, 72, 73, 74, 75, 76, 77, 78, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99], "frontend": [2, 24, 30, 72, 74], "frontend_directori": [16, 72], "frotend": 4, "fsf": 19, "fulfil": [8, 19], "full": [1, 2, 3, 9, 10, 12, 15, 18, 19, 25, 31, 40, 75], "fulli": 3, "function": [2, 4, 11, 12, 14, 18, 19, 25, 33, 40], "fundament": [3, 19], "further": [2, 3, 18, 19], "futur": [2, 7, 13, 18, 19], "fw": 4, "fw_version": 57, "g": [1, 3, 4, 9, 14, 15, 18, 25, 27, 37, 40, 70, 75, 90], "g0": [13, 22, 49, 65, 77], "g1": [2, 13, 49, 65], "g2": [2, 13], "g_": 3, "g_i": 3, "gabim": 24, "gain": [1, 2, 4, 9, 13, 22, 40, 41, 49, 77], "gain_file_nam": 1, "gain_g0_mean": 34, "gain_g1_mean": 34, "gain_g2_mean": 34, "gain_level": 40, "gainmap": 16, "gamma": [1, 3, 18, 38, 96], "gap": [3, 22, 40, 93, 94], "gap_i": [16, 94], "gap_x": [16, 94], "gate": 52, "gb": 14, "gbit": [7, 11], "gcc": [24, 31], "ge": 3, "gemmi": 24, "gen11": 14, "gen4": [7, 57], "gen4x8": 4, "gener": [2, 3, 4, 6, 10, 13, 14, 15, 16, 17, 18, 20, 21, 22, 25, 27, 31, 37, 40, 49, 57, 71, 97, 98], "geom_refinement_algorithm": [1, 69], "geometr": 3, "geometri": [1, 2, 18, 30, 40, 58, 94], "geometry_transform": [16, 65], "geometry_transformation_en": 1, "geomrefinementalgorithm": [31, 69], "get": [11, 19, 40, 49], "getaddress": 15, "getdefaultplotbin": 2, "gib": 12, "gist": 24, "git": [2, 13, 31], "gitea": [2, 17, 23, 25], "github": [24, 25], "gitlab": [2, 4, 24, 26], "give": [3, 10, 19, 27, 70], "given": [1, 2, 3, 4, 8, 10, 11, 12, 15, 19, 37, 40, 49, 62, 63, 65, 69, 92], "global": [3, 24, 25], "gnu": [10, 24], "go": [2, 16, 23], "goe": [40, 69], "golden": 3, "goniomet": [1, 2, 3, 37, 40], "good": [10, 40], "googl": 2, "got": 2, "govern": [10, 19], "gpgcheck": 23, "gphl": 25, "gpl": 31, "gplv3": [2, 19, 30], "gpt": 2, "gpu": [2, 3, 4, 5, 17, 24, 33], "gpu_count": 33, "gracefulli": [2, 40], "grade": 14, "gradual": [2, 3], "grant": [10, 19], "graphic": 14, "grati": 19, "gratuit": 11, "grayscal": 1, "greatest": 19, "green": 11, "grep": 4, "grid": [1, 2, 40, 61, 62, 92], "grid_plot": [59, 60], "grid_plot_dict": 59, "grid_plot_from_dict": 59, "grid_plot_inst": 59, "grid_plots_dict": 60, "grid_plots_from_dict": 60, "grid_plots_inst": 60, "grid_scan": [1, 37, 61], "grid_scan_dict": 61, "grid_scan_from_dict": 61, "grid_scan_inst": 61, "grid_scan_result": 62, "grid_scan_result_dict": 62, "grid_scan_result_from_dict": 62, "grid_scan_result_images_inn": 63, "grid_scan_result_images_inner_dict": 63, "grid_scan_result_images_inner_from_dict": 63, "grid_scan_result_images_inner_inst": 63, "grid_scan_result_inst": 62, "grid_um": 80, "gridscan": [31, 37], "group": [1, 2, 3, 4, 5, 12, 15, 18, 37, 75], "gruber": 3, "gruen": 2, "guarante": [1, 15, 19], "gui": 19, "guid": [4, 7], "h": [0, 1, 3, 18], "h5": [18, 56], "h5234": 18, "h_f": 3, "h_i": 3, "ha": [1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 18, 19, 25, 29, 40, 49, 70, 98], "had": [2, 19], "half": [2, 3, 41, 49], "han": 24, "handl": [2, 4, 5, 8, 11, 13, 25, 55], "happen": [2, 7, 8, 18, 22, 28, 37, 40], "har": [7, 11], "hardcod": 2, "hardwar": [0, 30], "harmless": [2, 10], "harmon": [2, 3], "has_error_text": 15, "hat": [3, 24], "have": [2, 4, 6, 7, 10, 11, 12, 14, 15, 16, 18, 19, 25, 31, 40, 65, 69, 78], "have_vm_flags_set": 12, "haven": 11, "hbm": 7, "hbm_temp_c": 57, "hdf5": [1, 2, 4, 15, 17, 24, 25, 26, 27, 28, 37, 55, 66, 67, 75], "hdfgroup": 24, "header": [2, 9, 18, 24, 31, 37], "header_appendix": [1, 18, 37], "heat": 35, "height": [1, 43, 44], "held": 3, "helic": [1, 90], "helical_step": 1, "helical_step_um": 90, "help": [2, 12], "here": [3, 15, 16, 40, 71], "hereaft": 19, "herebi": 10, "hex": 2, "hexagon": [1, 3], "high": [0, 2, 3, 9, 15, 16, 19, 31, 40, 49, 51, 69, 93], "high_q_recip_a": 32, "high_q_recipa": 16, "high_res_gap_q_recip_a": 93, "high_resolution_limit": 93, "high_resolution_limit_for_spot_count_low_r": 93, "high_voltage_v": [16, 41, 51], "higher": [3, 18, 77], "highest": [1, 3, 37, 40, 69, 82], "highli": [1, 37], "highlight": 2, "histogram": [1, 2, 9], "hkl": [2, 3], "hl": [2, 13], "hls_arbitrary_precision_typ": 24, "hold": [10, 12, 75], "holder": 19, "hope": 19, "hopefulli": 2, "horizont": [8, 37], "host": [9, 12, 13, 15, 19, 31, 40, 71], "host_librari": 12, "host_writ": 13, "hostnam": [16, 41], "hour": [4, 40], "household": 19, "hover": 2, "how": [2, 10, 15, 92], "howev": [6, 10, 14, 15, 18, 19, 37, 40], "hp": 18, "hpe": 14, "hr": 18, "html": [4, 19, 70], "http": [2, 4, 16, 17, 19, 20, 22, 23, 24, 31, 64, 70, 72, 95, 98, 99], "http_port": 18, "httplib": [2, 24], "human": 54, "hypothet": 19, "hz": [5, 14], "i": [0, 1, 2, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 33, 37, 40, 49, 57, 58, 64, 65, 66, 69, 70, 71, 72, 75, 78, 90, 91, 92, 93, 94, 95, 97, 98, 99], "i2c": 13, "i_": 3, "i_h": 3, "ib": 14, "ic": [1, 2, 37, 69, 92, 93], "ice_r": 1, "ice_ring_width_q_recip_a": 93, "icmp": [11, 13, 27], "id": [1, 3, 12, 13, 18, 31, 37, 40, 43, 44, 48, 70, 92], "idea": 19, "identifi": [1, 3, 4, 10, 15, 18, 19], "idl": [2, 7, 13, 40, 50, 57], "idnex": 1, "ignor": [2, 15, 37, 40, 69, 71], "ii": [3, 10], "ij": 3, "imag": [2, 3, 6, 8, 9, 10, 14, 16, 17, 18, 22, 29, 31, 36, 37, 40, 49, 62, 63, 64, 65, 66, 69, 70, 71, 72, 75, 82, 90, 91, 92, 93, 95, 97, 98, 99], "image_appendix": [1, 37], "image_buff": [31, 40], "image_buffer_clear_post": [30, 31], "image_buffer_image_cbor_get": [30, 31], "image_buffer_image_jpeg_get": [30, 31], "image_buffer_image_tiff_get": [30, 31], "image_buffer_mi_b": 72, "image_buffer_mib": 16, "image_buffer_start_cbor_get": [30, 31], "image_buffer_statu": [40, 64], "image_buffer_status_dict": 64, "image_buffer_status_from_dict": 64, "image_buffer_status_get": [30, 31], "image_buffer_status_inst": 64, "image_collection_effici": 79, "image_dtyp": 1, "image_format": [16, 31, 40, 72], "image_format_set": [40, 65, 74], "image_format_settings_dict": 65, "image_format_settings_from_dict": 65, "image_format_settings_inst": 65, "image_id": 1, "image_numb": [15, 64, 80, 81], "image_push": [16, 31, 40, 72, 74], "image_pusher_statu": [40, 66], "image_pusher_status_dict": 66, "image_pusher_status_from_dict": 66, "image_pusher_status_get": [30, 31], "image_pusher_status_inst": 66, "image_size_i": 1, "image_size_x": 1, "image_socket": [15, 16, 95, 99], "image_tim": 65, "image_time_": 18, "image_time_u": 37, "imagebufferstatu": [31, 40, 74], "imageformatset": [31, 40, 72, 74], "imageindex": 18, "imagepusherstatu": [31, 40, 74], "imagepushertyp": [31, 66, 72], "images_collect": [1, 75], "images_discarded_lossy_compress": 75, "images_expect": 75, "images_per_fil": [1, 15, 37], "images_per_trigg": [1, 37], "images_s": 75, "images_sent_to_writ": 1, "images_write_error": 66, "images_written": [66, 75], "immedi": [10, 40], "impact": [2, 14], "imperfect": [2, 3], "implement": [2, 3, 8, 19, 31, 64], "impli": [10, 19], "implic": 10, "import": [5, 10, 14, 16, 19, 22, 31, 32, 33, 34, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 48, 49, 51, 54, 56, 57, 59, 60, 61, 62, 63, 64, 65, 66, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99], "impos": [19, 31], "impract": 14, "improp": 2, "improperli": 2, "improv": [2, 3, 18], "imwrit": 22, "in_preparation_slot": 64, "in_sending_slot": 64, "inabl": 19, "inaccur": 19, "inact": 40, "inc": 19, "incid": [3, 37, 49], "incident": [10, 19], "incident_energi": 1, "incident_energy_ev": 18, "incident_energy_ke_v": 37, "incident_energy_kev": 65, "incident_wavelength": [1, 37], "includ": [1, 2, 3, 4, 7, 8, 10, 14, 15, 16, 19, 22, 23, 24, 40, 55, 69, 75], "inclus": [19, 85], "incom": 11, "incompat": 19, "inconsist": [1, 12], "incorpor": [8, 19], "increas": [1, 2, 6, 15, 49], "increment": [1, 28, 37, 75, 90], "indefinit": 40, "indemnif": 19, "independ": [11, 15, 19], "index": [1, 2, 5, 14, 15, 18, 24, 26, 31, 37, 38, 40, 58, 63, 68, 69, 72, 74, 82, 92, 93, 96], "index_analysis_tim": 1, "index_ice_r": 69, "indexed_lattic": 62, "indexing_algorithm": 1, "indexing_lattic": 1, "indexing_r": [1, 75, 79], "indexing_result": 1, "indexing_set": [40, 69], "indexing_settings_dict": 69, "indexing_settings_from_dict": 69, "indexing_settings_inst": 69, "indexing_tim": 1, "indexing_unit_cel": 1, "indexing_unit_cell_angl": 79, "indexing_unit_cell_length": 79, "indexingalgorithm": [31, 69], "indexingset": [31, 40, 72, 74], "indic": [2, 3, 15, 19], "indigo": [35, 40], "indirect": 10, "individu": 19, "industri": 19, "ineterfac": 99, "infer": [2, 14], "inferno": 0, "infin": 2, "inflat": 3, "info": [1, 2], "inform": [1, 2, 3, 10, 15, 17, 19, 27, 31, 40, 56, 66, 72, 93, 97], "infring": [10, 19], "init": 4, "initi": [2, 10, 15, 16, 19, 22, 29, 31, 33, 40], "initialize_post": [30, 31], "inner": 3, "innosuiss": 0, "innov": 0, "inp": 25, "input": [2, 15, 26, 40, 71], "insert": 12, "insid": [2, 19], "insmod": 4, "inspir": 3, "instal": [2, 7, 10, 14, 16, 17, 19, 20, 23, 33], "install_dkm": 12, "instanc": [31, 32, 33, 34, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 48, 49, 51, 54, 56, 57, 59, 60, 61, 62, 63, 64, 65, 66, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99], "instead": [2, 11, 15, 19, 40, 49, 95, 97, 98, 99], "institut": [10, 30, 31], "instruct": 7, "instrument": [1, 2, 16, 18, 31, 37, 40, 70, 72], "instrument_metadata": [40, 70, 74], "instrument_metadata_dict": 70, "instrument_metadata_from_dict": 70, "instrument_metadata_inst": 70, "instrument_nam": [1, 16, 70], "instrumentmetadata": [31, 40, 72, 74], "int": [1, 18, 32, 33, 34, 36, 37, 40, 41, 42, 43, 44, 48, 49, 51, 57, 59, 60, 61, 62, 63, 64, 65, 66, 69, 72, 75, 77, 82, 85, 92, 93, 94, 95, 97, 98, 99], "int20": 2, "int64": 1, "intact": 19, "integ": [1, 2, 3, 8, 13, 18, 22, 37, 40, 49], "integr": [1, 2, 7, 9, 13, 30, 31, 32, 37, 40, 49, 93], "integrated_reflect": 1, "integration_tim": 1, "intel": [1, 14, 24], "intellectu": 7, "intend": [3, 5, 10, 19, 31], "intens": [1, 2, 18, 37], "intent": 19, "intention": 3, "interact": [6, 19, 31], "interchang": [15, 19], "interest": [1, 19, 40], "interf": [2, 19], "interfac": [1, 2, 10, 12, 13, 15, 19, 20, 27, 28, 31, 40, 43, 44, 95, 97, 98, 99], "interleav": 2, "intermedi": 10, "intern": [1, 2, 3, 6, 10, 13, 18, 27, 28, 31, 40, 49, 66, 72], "internal_frame_gener": [16, 49], "internal_frame_generator_imag": [16, 49], "internal_generator_imag": [31, 40], "interpol": 22, "interpret": 19, "interrupt": [10, 13], "intersect": 3, "interv": [2, 49], "intim": 19, "introduc": [2, 15], "invalid": [3, 10, 19, 40], "invari": 3, "invers": 3, "involv": 10, "ioctl": [12, 31], "ioerror": 15, "ion": 70, "ip": [0, 2, 7, 11, 13, 66, 75, 95, 97, 98, 99], "ipc": [15, 97, 98, 99], "ipmitool": 4, "ipv4": [11, 13, 16, 27, 76], "irrespect": 49, "irrevoc": [10, 19], "isol": 3, "issu": [2, 11, 14, 18, 75], "item": 19, "iter": 3, "its": [0, 3, 5, 10, 11, 15, 19], "itself": [3, 10, 19], "iv": 18, "j": [0, 3, 4, 8, 24], "jammi": 23, "jan": 0, "javascript": 72, "jensen": 8, "jet": 70, "jf": 18, "jf_convers": 13, "jf_info": 1, "jfjoch": [2, 4, 12, 16, 20, 23, 30], "jfjoch0": [4, 16, 27], "jfjoch1": 16, "jfjoch_action_test": 2, "jfjoch_api": [16, 19], "jfjoch_brok": [1, 2, 4, 12, 15, 17, 18, 22, 30, 31, 33, 40, 74], "jfjoch_broker_test": 16, "jfjoch_client": [30, 31, 32, 33, 34, 36, 37, 38, 39, 41, 42, 43, 44, 45, 48, 49, 51, 54, 56, 57, 59, 60, 61, 62, 63, 64, 65, 66, 69, 70, 72, 73, 74, 75, 76, 77, 78, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99], "jfjoch_extract_hkl": 2, "jfjoch_fpga_test": [2, 4, 26], "jfjoch_hdf5_test": 26, "jfjoch_lite_perf_test": 2, "jfjoch_offline_process": 26, "jfjoch_process": 2, "jfjoch_releas": 1, "jfjoch_set": [4, 16, 72], "jfjoch_settings_dict": 72, "jfjoch_settings_from_dict": 72, "jfjoch_settings_inst": 72, "jfjoch_settings_ssl": 73, "jfjoch_settings_ssl_dict": 73, "jfjoch_settings_ssl_from_dict": 73, "jfjoch_settings_ssl_inst": 73, "jfjoch_statist": [40, 74], "jfjoch_statistics_dict": 74, "jfjoch_statistics_from_dict": 74, "jfjoch_statistics_inst": 74, "jfjoch_test": [2, 26], "jfjoch_view": [2, 24, 25], "jfjoch_writ": [2, 15, 17, 30, 37, 56], "jfjochset": 31, "jfjochstatist": [31, 40], "jfjt": 15, "jfojch_brok": 2, "jointli": 3, "jpeg": [2, 24, 31, 40, 82], "jpeg_qual": [40, 82], "json": [1, 2, 4, 6, 15, 16, 18, 24, 32, 33, 34, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 48, 49, 51, 54, 56, 57, 59, 60, 61, 62, 63, 64, 65, 66, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99], "jumbo": 11, "june": 19, "jungfrau": [1, 2, 4, 5, 7, 9, 12, 13, 14, 22, 29, 31, 37, 40, 41, 49, 53, 65], "jungfrau_convers": [16, 65], "jungfrau_conversion_en": 1, "jungfrau_conversion_factor": 1, "jungfrau_conversion_factor_ke_v": 65, "jungfrau_conversion_factor_kev": 16, "jungfrau_fixed_gain_g1": [16, 49], "jungfrau_mask_pixels_without_g0": 65, "jungfrau_pedestal_g0_fram": [16, 49], "jungfrau_pedestal_g0_rms_limit": [16, 65], "jungfrau_pedestal_g1_fram": [16, 49], "jungfrau_pedestal_g2_fram": [16, 49], "jungfrau_pedestal_min_image_count": [16, 49], "jungfrau_storage_cell_count": [16, 49], "jungfrau_storage_cell_delay_n": [16, 49], "jungfrau_use_gain_hg0": [16, 49], "jungfraujoch": [0, 1, 2, 5, 6, 7, 8, 10, 11, 12, 13, 14, 15, 17, 18, 20, 22, 23, 24, 25, 26, 27, 28, 29, 31, 37, 40, 58, 65, 68, 69, 70, 71, 72, 74, 93, 95, 99], "jungfraujochdevic": 12, "jungfruajoch": 5, "just": 8, "k": [1, 2, 3, 18, 24], "k_f": 3, "k_i": 3, "kabsch": 3, "kal": 24, "kalcutt": 24, "kb": 1, "keep": [11, 19, 37], "kei": [3, 4, 18, 19, 23, 73], "kelvin": 37, "kept": 15, "kernel": [2, 15, 19, 31], "kev": [1, 2, 8, 13, 37], "keyboard": 2, "keyr": 23, "khz": 14, "kieffer": 3, "kilohertz": 0, "kind": [10, 19], "kiyo": 24, "know": [15, 19], "knowingli": 19, "knowledg": 19, "known": [2, 10, 25], "ko": 4, "l": [1, 3, 18], "l2": 2, "l4": 14, "l_": 3, "l_d": 3, "l_f": 3, "l_i": 3, "lab": 3, "lab6": 2, "label": 2, "laboratori": 3, "lambda": 3, "lane": 14, "langl": 3, "languag": [2, 19, 31], "larg": [2, 3, 8, 15, 16], "larger": [10, 14, 19, 69], "largest": [8, 64, 69], "laser": [1, 70], "last": [13, 15, 40], "later": [2, 3, 10, 19, 25], "latest": 40, "latter": [7, 40], "lattic": [1, 2, 18, 69, 91], "lattice_typ": 1, "latticeindex": 18, "law": [10, 19], "lawsuit": [10, 19], "layer": [11, 16], "layout": 78, "le": [1, 3], "lead": [2, 49], "leaf": 2, "leak": 2, "learn": 2, "least": [2, 3, 10, 11, 14, 19, 24, 58, 93], "left": [2, 6, 15, 37, 41, 61, 94], "leftarrow": 3, "legaci": [2, 55], "legal": [10, 19], "legend": 1, "length": [1, 2, 3, 39], "leonarski": [0, 31], "less": [1, 2], "lesser": 19, "let": 3, "letter": 1, "level": [3, 4, 9, 15, 16, 19, 33, 40, 77], "lf": 2, "lgpl": 19, "liabil": [10, 19], "liabl": 19, "lib": 25, "libjfjoch_xds_plugin": 25, "libjpeg": [2, 24], "libpng": 2, "librari": [1, 2, 3, 4, 10, 17, 19, 24, 28, 31], "libtiff": [2, 24], "libzmq": 24, "licens": [0, 2, 7, 24, 30], "license": [10, 19], "licensor": [10, 19], "lifecycl": 15, "light": [2, 16, 25], "lighter": 2, "like": [2, 3, 4, 14, 18, 19, 24, 93], "likewis": 19, "limit": [2, 8, 10, 14, 16, 17, 19, 23, 25, 31, 40, 55, 93], "line": [2, 8, 9, 19, 25], "linear": [2, 3, 58], "link": [1, 2, 3, 7, 11, 18, 19, 23, 24, 55, 57], "linux": [2, 12, 15, 24, 25, 31], "list": [1, 2, 3, 19, 23, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99], "listen": [15, 95, 97, 98, 99], "lite": [2, 5, 7], "litig": [10, 19], "live": [15, 29, 66, 75], "lnksta": 4, "load": [2, 4, 7, 8, 10, 13, 17, 31, 40, 64], "load_calibr": 13, "load_from_hbm": 13, "local": [4, 19], "localhost": [16, 31, 40, 71], "locat": [1, 2, 4, 6, 10, 18, 65, 72], "lock": 2, "log": [2, 3, 24], "logic": [2, 27], "logo": [2, 10], "lohmann": 24, "long": [2, 19, 40, 65], "longer": [2, 3, 10], "look": 18, "loop": 2, "loos": 2, "lopez": 0, "lorentz": [1, 2], "loss": [10, 19], "lossi": [1, 8, 9, 13, 37, 75], "lot": [2, 4], "low": [1, 2, 3, 5, 16, 49, 92, 93], "low_q_recip_a": 32, "low_q_recipa": 16, "low_resolution_limit": 93, "lower": [11, 14, 37, 75, 85], "lowercas": 2, "lowest": [40, 82], "lspci": 4, "lvert": 3, "lyso_cryo": 18, "lysozym": 18, "lysozyme_1": 15, "lz4": [1, 2, 24], "m": [0, 1, 2, 3, 4, 18], "m2": 4, "m20": 4, "ma": 2, "mac": [7, 11, 13], "machin": [2, 4, 7, 9, 19], "macromolecular": [3, 37], "mad": 3, "made": [6, 8, 10, 12, 19], "magic": 15, "magic_numb": 1, "magma": 0, "magnitud": 3, "mai": [2, 3, 10, 15, 19, 31], "mail": 19, "main": 16, "mainstream": 2, "maintain": 19, "major": [1, 14, 19, 28], "make": [2, 4, 7, 10, 12, 16, 19, 24, 40], "manag": [2, 4, 13, 23], "mandatori": 15, "mani": [1, 2, 3, 15], "manner": [10, 19, 99], "manual": [2, 4, 11, 23, 70], "manufactur": [10, 19], "map": [1, 2, 8, 9, 12, 18], "march": 19, "mark": [2, 8, 15, 19, 22, 28, 65, 69], "mask": [1, 2, 3, 9, 18, 19, 30, 31, 36, 40, 65, 77, 82], "mask_chip_edg": [16, 65], "mask_module_edg": [16, 65], "masked_pixel": 34, "mass": 2, "master": [1, 2, 15, 37, 41, 55], "masui": 24, "match": [2, 3, 5, 7, 15], "matej": [0, 18], "materi": [1, 10, 19], "math": 2, "mathbf": 3, "matplotlib": 0, "matrix": 11, "matter": 33, "matur": 2, "max": [1, 2, 3, 8, 13, 15, 18, 37, 51, 69, 81, 92], "max_allowed_pixel_count": 36, "max_count": 1, "max_frames_with_sign": 36, "max_image_numb": [1, 64], "max_image_number_s": 75, "max_pix_per_spot": 93, "max_pixel_valu": 79, "max_receiver_delai": [1, 75], "max_spot_count": [1, 2, 37], "max_valu": 18, "max_viable_pixel_valu": 1, "max_x_pxl": 85, "max_y_pxl": 85, "maxc": 1, "maxim": [1, 3], "maximum": [1, 2, 8, 10, 15, 36, 37, 49, 84], "mc": [4, 7, 18], "md": 7, "mea": 3, "mean": [1, 2, 3, 8, 10, 11, 12, 13, 15, 18, 19, 28, 36, 37, 40, 95, 97, 98, 99], "meaning": 3, "measur": [1, 2, 3, 15, 19, 26, 37, 39, 40, 57, 70, 74], "measurement_statist": [40, 75], "measurement_statistics_dict": 75, "measurement_statistics_from_dict": 75, "measurement_statistics_inst": 75, "measurementstatist": [31, 40, 74], "mechan": [2, 7, 12, 14, 15, 31], "median": [2, 3], "medium": [10, 19], "meet": [3, 19], "mellanox": [11, 14], "member": [1, 2], "memori": [2, 9, 12], "menu": [2, 19], "merchant": [10, 19], "mere": [19, 31], "merg": [2, 19], "mesnet": 0, "messag": [2, 7, 11, 13, 15, 18, 30, 31, 33, 37, 40, 54, 64, 71, 99], "message_sever": 33, "met": 19, "metadata": [2, 9, 12, 16, 18, 31, 37, 40, 55, 70, 71, 97], "metal": 70, "meter": 18, "method": [19, 31, 40, 71], "metric": 3, "mib": [12, 72], "micro": 2, "microblaz": 13, "microsecond": [2, 41, 49], "mid": 3, "might": [2, 6, 12, 14, 19, 40, 49, 99], "miller": [1, 2, 3, 18], "milli": 2, "millisecond": [2, 97, 98], "mimick": 25, "min": [2, 3], "min_count_time_n": [41, 44], "min_frame_time_n": [41, 44], "min_image_numb": 64, "min_pix_per_spot": 93, "min_viable_pixel_valu": 1, "min_x_pxl": 85, "min_y_pxl": 85, "minicbf": 18, "minim": [1, 3, 12], "minimum": [2, 3, 8, 41, 49, 69, 84], "minor": [1, 2, 28], "minu": 13, "minut": 40, "mirror": [6, 41], "mirror_i": [16, 41], "misbehav": 40, "misc": [2, 4, 12], "mismatch": 2, "misrepresent": 19, "miss": [1, 2, 9, 37, 40], "mitig": 3, "mix": 2, "mkdir": [4, 7, 16], "ml": 2, "mm": [2, 3, 37], "mmap": 12, "mo": 63, "mode": [1, 2, 3, 5, 7, 11, 12, 13, 15, 16, 19, 27, 37, 40], "model": [2, 14, 19, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99], "modif": [2, 10, 12, 19], "modifi": [2, 10, 19, 23, 27], "modprob": 12, "modul": [1, 2, 4, 6, 8, 9, 11, 12, 13, 14, 22, 40, 41, 43, 44, 51, 65, 94], "modular": 2, "module_numb": 34, "module_sync": [16, 41], "modules_in_row": [16, 94], "modulesumm": 2, "molecul": 93, "moment": [1, 2, 3, 4, 5, 6, 8, 12, 14, 17, 27, 37, 40], "monitor": [2, 4, 18], "monoclin": [1, 2, 3], "more": [1, 2, 3, 6, 12, 14, 15, 17, 19, 37, 40, 69], "moreov": 19, "mosaic": [1, 2, 62, 63, 93], "mosflm": 3, "most": [3, 12, 19], "mostli": [5, 33], "mous": 2, "move": [2, 75], "movi": 2, "mozzanica": 0, "msg": 54, "msg_zerocopi": 15, "mto": [7, 11], "mtp": [7, 11], "mtu": 11, "much": 2, "multi": 2, "multidimarrai": 1, "multipixel": [22, 65], "multipl": [1, 2, 3, 4, 14, 15, 18, 22, 37, 40, 99], "multipli": [1, 49], "muon": 70, "must": [1, 7, 10, 12, 15, 19, 23, 28, 31, 32, 37, 39, 40], "mutex": 2, "mutual": 61, "mx": [1, 18, 23, 24, 30, 41], "mxanalyz": 2, "n": [3, 8, 9, 24, 31, 40, 41, 49, 71], "n2g2": 16, "n_": 3, "n_b": 3, "n_fast": [1, 61], "n_slow": 1, "name": [1, 2, 10, 15, 18, 19, 23, 27, 32, 33, 34, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 48, 49, 51, 54, 56, 57, 59, 60, 61, 62, 63, 64, 65, 66, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99], "nan": [1, 2], "nanosecond": 2, "natur": [7, 10, 19], "nbuffer": 12, "ne": 3, "nearli": 3, "necessari": [4, 7, 10, 11, 12, 16, 19, 38, 55, 96], "necessarili": [3, 10], "need": [2, 4, 7, 8, 10, 11, 12, 13, 14, 15, 18, 19, 23, 25, 31, 40, 69], "neg": [1, 3, 18, 37, 61], "neggia": [18, 25, 26, 55], "neglig": 10, "negoti": [4, 11], "neighbor": 8, "neither": 19, "net": [2, 15], "network": [1, 2, 7, 9, 13, 15, 19, 27, 30, 31, 40, 95, 97, 98, 99], "neural": 2, "neutron": 70, "never": [2, 3], "new": [2, 10, 12, 18, 40, 64], "newer": [2, 7, 12, 24, 55], "next": [19, 40], "nextgendcu": [0, 4], "nexu": [4, 18], "nexusformat": 70, "niggli": [1, 2, 3, 18], "niggli_class": [1, 18], "nimag": 18, "nimages_per_trigg": 2, "nlohmann": [2, 24], "nmodul": [16, 43, 44, 94], "nobl": 23, "nocuda": [2, 23], "node": 24, "nofil": 18, "nofilewritten": 55, "nogpgcheck": 23, "nois": [3, 8, 13], "noisi": 22, "nomin": [3, 6], "non": [1, 2, 3, 4, 7, 8, 10, 15, 18, 19, 22, 25, 37, 58, 69], "noncommerci": 19, "none": [1, 15, 40, 58, 66, 67, 68, 72], "nor": [10, 19], "normal": [10, 15, 19, 36], "nospaceleft": 15, "not_connect": 50, "notabl": [1, 2], "notat": [2, 3], "note": [4, 13, 14, 28, 32, 33, 34, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 48, 49, 51, 54, 56, 57, 59, 60, 61, 62, 63, 64, 65, 66, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99], "noth": 19, "notic": [10, 19], "notif": [2, 18, 99], "notifi": [10, 19], "notwithstand": 19, "now": 2, "np": 22, "npeak": 18, "npeaksringfilt": 18, "npixel": 18, "ntrigger": 37, "null": 2, "num_connect": 15, "numa": [24, 72], "numa_polici": [16, 72], "number": [1, 2, 3, 4, 8, 10, 12, 13, 15, 18, 19, 25, 27, 29, 33, 36, 37, 40, 41, 43, 44, 49, 61, 62, 63, 64, 66, 69, 72, 75, 77, 92, 94, 95, 99], "number_of_fram": 36, "number_of_imag": 1, "number_of_triggers_left": 51, "numer": [1, 3, 32, 37], "numpi": 22, "nvidia": [14, 19], "nwriter": [15, 95], "nx": [2, 92], "nxmx": [2, 4, 17, 18, 22, 37, 40, 70], "nxmxintegr": 55, "nxmxlegaci": [25, 55, 56], "nxmxonlydata": 55, "nxmxvd": [25, 55], "nxsourc": [1, 70], "ny": [2, 92], "o": [4, 15, 23], "oF": 18, "ob": 3, "object": [1, 2, 10, 18, 19, 32, 33, 34, 36, 37, 38, 39, 41, 42, 43, 44, 45, 48, 49, 51, 54, 56, 57, 59, 60, 61, 62, 63, 64, 65, 66, 69, 70, 72, 73, 74, 75, 76, 77, 78, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99], "oblig": [10, 19], "observ": [1, 2, 16], "obtain": [3, 4, 10], "obtus": 2, "occasion": 19, "occup": 15, "occur": 19, "octet": 40, "odd": 3, "off": [2, 4, 8, 11, 31, 37, 40, 41, 65, 93], "offer": [10, 11, 19], "offici": 19, "offlin": 27, "offset": [2, 4], "often": 3, "ohl": [2, 10, 19], "ok": [2, 4, 12, 14, 15, 40, 71, 78, 97, 98, 99], "older": 64, "omega": [1, 3, 90], "omit": [3, 18], "onc": [15, 40], "one": [1, 2, 4, 6, 7, 8, 11, 12, 13, 14, 15, 16, 17, 19, 22, 25, 37, 40, 41, 64, 94], "oneapi": 24, "ones": [2, 40], "onli": [1, 2, 3, 7, 8, 10, 11, 12, 14, 15, 16, 18, 19, 22, 23, 24, 25, 31, 33, 37, 40, 41, 55, 64, 65, 75, 82, 93, 98], "onlin": [2, 3, 16, 17, 29], "onto": 3, "open": [0, 2, 4, 12, 16, 17], "openapi": [1, 2, 4, 16, 19, 28, 31], "openapitool": 31, "openbla": 2, "openssl": 2, "oper": [1, 2, 3, 4, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 18, 19, 29, 33, 40, 65, 66, 98, 99], "operation": 3, "opt": [4, 18, 25], "optic": [11, 70], "optim": [2, 3, 4, 12, 24, 58, 64, 78], "optin": 18, "option": [1, 2, 3, 4, 6, 8, 14, 15, 19, 24, 29, 31, 32, 33, 37, 40, 41, 44, 49, 56, 58, 61, 63, 64, 65, 66, 69, 70, 71, 72, 74, 75, 76, 77, 78, 81, 82, 83, 86, 90, 91, 92, 93, 94, 95, 97, 98, 99], "orang": 11, "order": [1, 9, 13, 14, 15, 19, 91], "org": [19, 24, 31, 70], "organ": 19, "orient": 3, "origin": [10, 18, 19, 25, 65], "original_image_id": 1, "orthorhomb": 1, "os": 4, "other": [2, 3, 4, 6, 10, 11, 12, 14, 19, 31, 37, 40, 66], "otherwis": [4, 10, 15, 18, 19, 49, 56], "our": [11, 14, 19], "out": [10, 15, 18, 19, 40, 49, 51, 65], "outer": 3, "outgo": [14, 15], "output": [2, 3, 4, 5, 8, 13, 15, 16, 19, 31, 40, 65, 71], "outsid": [2, 3, 4, 19, 69], "outstand": [15, 99], "over": [1, 2, 16, 18, 22, 37, 99], "overal": 3, "overlap": 2, "overload": [3, 8, 18], "overwrit": [1, 2, 56], "own": [10, 11, 12, 15, 19, 25, 37, 75], "owner": 12, "p": [1, 10, 18, 37, 75], "p00001": 18, "p00g": 14, "p1": 3, "p_": 3, "packag": [4, 10, 15, 19, 20, 24, 25, 28, 31, 97], "packet": [1, 2, 9, 11, 13, 18, 27], "packets_expect": [1, 18], "packets_receiv": [1, 18, 79], "packets_sl": 57, "packets_udp": 57, "page": [16, 17], "paid": 7, "panel": 2, "paper": [3, 19], "paragraph": 19, "parallel": [2, 3, 4, 7], "param": 3, "param1": 18, "param2": 18, "paramet": [1, 2, 3, 4, 8, 18, 31, 37, 38, 69, 93, 96], "pars": [2, 40, 71], "parser": 24, "part": [2, 4, 10, 19, 22, 28], "parti": [10, 19], "partial": [1, 2, 47], "particl": 37, "particular": [10, 12, 13, 15, 18, 19, 22, 27], "particularli": [3, 26, 90], "pass": [2, 4, 19], "password": 19, "past": 14, "patent": [10, 19], "path": [2, 4, 7, 15, 16, 27], "pattern": 19, "paul": [30, 31], "paulscherrerinstitut": 24, "payload": 15, "payload_s": 15, "payment": 19, "pci": [7, 9], "pci_dev_id": 57, "pcie": [2, 7, 11, 13, 14, 16, 28, 30, 57, 72], "pcie_100g": 7, "pcie_8x10g": 7, "pcie_devices_inn": 76, "pcie_devices_inner_dict": 76, "pcie_devices_inner_from_dict": 76, "pcie_devices_inner_inst": 76, "pcie_driv": 4, "pcie_link_spe": 57, "pcie_link_width": 57, "pciedevicesinn": [31, 72], "peak": 18, "peak_list": 18, "peak_list_typ": 18, "peakdistewaldspher": 18, "peakh": 18, "peakk": 18, "peakl": 18, "peaktotalintens": 18, "peakxposraw": 18, "peakyposraw": 18, "pedest": [1, 2, 9, 13, 22, 29, 31, 37, 40, 49, 65, 77], "pedestal_g0_mean": 34, "pedestal_g1_mean": 34, "pedestal_g2_mean": 34, "pedestal_post": [30, 31], "pedestalrm": 2, "peer": 19, "penalti": 16, "per": [1, 2, 8, 12, 15, 18, 37, 40, 41, 43, 44, 55, 90, 99], "perform": [1, 2, 3, 9, 10, 11, 12, 15, 16, 19, 26, 27, 40, 75, 93], "period": [3, 10, 15, 40, 97, 98], "period_m": [16, 97, 98], "perman": [10, 19], "permiss": [10, 12, 15, 19, 31], "permissiondeni": 15, "permit": [10, 19], "permut": 3, "perpendicular": 6, "perpetu": [10, 19], "persist": [2, 15], "person": [10, 19], "personnel": 10, "pertin": 19, "pg099": 13, "pg114": 13, "pg153": 13, "pg195": 13, "pg203": 13, "pg210": 13, "pg293": 13, "pg348": 13, "ph": 1, "phase": [24, 25], "phi": [1, 2, 32, 90], "phi_": 3, "photon": [1, 3, 8, 13, 18, 37, 65], "photon_count_threshold": 93, "physic": [3, 10, 11, 12, 19], "pi": 3, "piec": 19, "pin": 24, "ping": 11, "pip": [4, 20], "pipelin": [2, 3, 7, 13, 16, 18, 25], "pistach": 2, "pix": 8, "pixel": [0, 1, 2, 4, 9, 14, 18, 30, 31, 36, 37, 40, 65, 75, 77, 87, 92, 94], "pixel_mask": [1, 74], "pixel_mask_en": 1, "pixel_mask_statist": 77, "pixel_mask_statistics_dict": 77, "pixel_mask_statistics_from_dict": 77, "pixel_mask_statistics_inst": 77, "pixel_size_i": 1, "pixel_size_m": 18, "pixel_size_mm": 44, "pixel_size_x": 1, "pixel_sum": [1, 2, 92], "pixel_value_low_threshold": 37, "pixelmaskstatist": [31, 74], "place": [4, 6, 7, 10, 19, 26, 37, 65], "placehold": 15, "placement": 2, "plain": [40, 71], "plane": [3, 37], "plasma": 70, "plausibl": 3, "pleas": [2, 12, 19, 24, 31], "plot": [2, 29, 31, 40, 60, 84, 85, 87], "plot_dict": 78, "plot_from_dict": 78, "plot_inst": 78, "plotli": 78, "plots_dict": 81, "plots_from_dict": 81, "plots_inst": 81, "plotunitx": [31, 81], "plu": 19, "plugin": [2, 18, 25, 26], "plygin": 26, "pmatrix": 3, "pn2g2": 4, "png": 2, "point": [1, 2, 6, 8, 16, 37, 39, 40, 41], "pointer": 19, "poisson": [3, 37], "poisson_compress": 37, "pol": 3, "polar": [1, 2, 8, 32, 37], "polarization_corr": 32, "polarization_factor": [16, 37], "polici": 72, "polish": 2, "pong": 15, "poni": [1, 2, 6, 37], "poni_rot1": 1, "poni_rot1_rad": 37, "poni_rot2": 1, "poni_rot2_rad": 37, "poni_rot3": 1, "poni_rot3_rad": 37, "pool": [2, 15, 69, 74], "poor": 2, "port": [2, 4, 7, 11, 14, 15, 18, 95, 97, 98, 99], "portion": 19, "posit": [1, 2, 3, 15, 18, 40, 61, 92], "possess": 19, "possibl": [1, 2, 3, 7, 10, 12, 14, 15, 16, 18, 19, 22, 24, 40], "post": [1, 3, 31, 40, 58], "postpon": 2, "potenti": [2, 10], "powder": 3, "powel": 3, "power": [4, 7, 12, 14, 19, 27, 40, 47], "power_usage_w": 57, "powerchip": 51, "poweroff": 47, "poweron": 47, "pprint": [31, 40, 71], "pq": 14, "pr": 92, "practic": [14, 19, 97, 98, 99], "pragmat": 3, "pre": [17, 24], "preambl": 10, "prebuilt": 4, "precis": [7, 13, 19, 24], "precomput": 3, "pred": 3, "predecessor": 19, "predefin": 9, "predict": [1, 2, 18], "prefer": [2, 3, 10, 14, 17, 19, 24], "prefix": [1, 37], "prepar": [1, 2, 4, 10, 25, 31, 40, 64], "preprocess": 2, "preprocessing_tim": 1, "present": [1, 3, 4, 12, 16, 19, 29, 40, 64], "preserv": [8, 19, 37], "preset": 2, "press": 4, "prevent": [10, 19], "preview": [2, 16, 31, 40, 82, 98], "preview_pedestal_tiff_get": [30, 31], "preview_plot_bin_get": [30, 31], "preview_plot_get": [30, 31], "preview_set": 82, "preview_settings_dict": 82, "preview_settings_from_dict": 82, "preview_settings_inst": 82, "previou": [2, 19], "previous": 2, "price": 19, "primari": 4, "primarili": [15, 19], "primarli": 31, "primit": 2, "principl": 14, "print": [2, 27, 31, 32, 33, 34, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 48, 49, 51, 54, 56, 57, 59, 60, 61, 62, 63, 64, 65, 66, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99], "prior": [1, 2, 3, 19, 27], "priori": 3, "privat": 19, "probabl": 37, "probe": 15, "problem": [2, 10, 11, 19], "procedur": [3, 4, 7, 8, 12, 15, 18, 19, 31, 40, 77], "process": [1, 2, 3, 4, 7, 10, 12, 13, 14, 15, 16, 18, 27, 30, 31, 37, 40, 69, 99], "processed_imag": 15, "processing_tim": 1, "procur": [10, 19], "produc": [3, 15, 19, 65], "product": [2, 10, 19], "profil": [1, 2, 18, 92], "profile_radiu": 1, "profileradiu": 18, "profit": 10, "program": [0, 1, 2, 7, 10, 26, 27, 31], "programm": 19, "progress": [2, 18, 33], "prohibit": 19, "project": [0, 24, 31], "promin": 19, "promot": 10, "propag": [15, 19], "proper": [2, 9, 12, 15, 17, 22], "properli": [2, 4, 7, 8, 15, 18, 25], "properti": [7, 8, 15, 19], "proport": 3, "propos": [1, 18, 37, 75], "proprietari": [10, 19], "propto": 3, "prospect": 10, "protect": [2, 7, 18, 19], "protocol": [1, 15, 19], "protocolerror": 15, "prove": 19, "provid": [1, 2, 3, 4, 6, 7, 8, 9, 10, 11, 12, 15, 16, 19, 20, 23, 24, 31, 37, 40, 49, 65, 66, 72, 75, 77, 95, 99], "provis": [10, 19, 31], "provision": 19, "proxi": 19, "psi": [2, 4, 6, 7, 14, 22, 23, 24, 31, 40, 49], "ptp": 2, "pub": [15, 16, 18, 40, 71, 97, 98], "public": [10, 28], "publicli": 19, "publish": [10, 19], "pull": [15, 16, 18, 99], "puller": [2, 15], "puls": [1, 13, 18, 31, 37, 40, 70, 92], "pulse_id": [31, 40], "pulsed_sourc": [16, 70], "pulseid": 18, "punit": 10, "purchas": 14, "pure": 15, "purpos": [10, 12, 15, 18, 19, 28], "pursuant": [10, 19], "push": [15, 18, 99], "pusher": [2, 15, 31, 40, 66], "pusher_typ": 66, "put": [2, 11, 14, 15, 31, 40, 71], "pxl": 2, "py": [16, 31, 40, 71], "pyfai": [1, 2, 3, 6, 37], "pypi": 20, "pytest": 31, "python": [2, 3, 16, 31], "pythonclientcodegen": 31, "q": [1, 2, 18, 84, 93], "q_max_recip_a": 84, "q_min_recip_a": 84, "q_recip_a": 80, "q_recipa": [40, 80], "q_space": [16, 32], "qmax": 1, "qmin": 1, "qquad": 3, "qsfp": [7, 11], "qsfp0": 11, "qsfp1": 11, "qsfp28": 11, "qspi": 4, "qt": [2, 4, 17, 24], "quad": 3, "quadrant": 2, "quadratur": 3, "quadspi": 13, "qualifi": 19, "qualiti": [3, 10, 19, 26, 29, 40, 82], "queri": 15, "question": 10, "queu": [15, 99], "queue": [1, 2, 15, 18, 75, 99], "quick": [12, 93], "quick_integr": 93, "quickintegr": 2, "quot": [37, 40, 64, 75, 93], "quota": 15, "r": [1, 2, 3, 13, 18], "r2": 2, "r_": 3, "r_1": 3, "r_2": 3, "r_3": 3, "r_i": 3, "rad": [0, 1, 8], "radial": 1, "radian": [3, 37], "radiat": 70, "radii": 3, "radiu": [1, 2, 18, 87, 92], "radius_pxl": 87, "rai": [0, 1, 2, 4, 6, 8, 16, 18, 39, 40, 70], "ram": [4, 14], "random": [15, 18, 99], "rang": [1, 2, 3, 8, 18, 81, 84, 92], "rangl": 3, "rare": 2, "rate": [0, 1, 2, 5, 14, 15, 31, 37, 64, 69, 93, 98], "rather": [2, 25], "ratio": [13, 18], "ration": 1, "raw": [1, 2, 3, 31, 37, 40], "rc": 31, "rcv_delai": 18, "rcv_free_send_buff": 18, "rcv_watermark": 18, "re": [2, 92], "reach": [4, 40], "react": 29, "reactor": 70, "read": [2, 12, 15, 19, 27, 40, 49, 51, 65], "readabl": [2, 19, 26, 54], "reader": 2, "readi": [2, 19, 37, 40], "readili": 19, "readm": [7, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99], "readout": [1, 2], "readout_time_n": [41, 44], "readout_time_u": 16, "real": [1, 2, 3, 49, 69, 91], "real_tim": 1, "realli": 2, "reanalyz": 2, "reason": [1, 10, 12, 14, 15, 19, 22, 33, 54], "reboot": 4, "rebuild": 4, "rebuilt": 4, "recalcul": 2, "receipt": [10, 19], "receiv": [1, 2, 7, 10, 12, 13, 15, 18, 19, 33, 37, 72, 75], "receiver_aq_dev_delai": 1, "receiver_buf_in_prepar": 1, "receiver_buf_in_send": 1, "receiver_delai": 79, "receiver_free_send_buf": [1, 79], "receiver_thread": [16, 72], "recent": [2, 4, 14], "recipi": [10, 19], "reciproc": [1, 2, 93], "recogn": [18, 19], "recommend": [2, 3, 4, 6, 15, 16, 23, 24, 25, 37, 40, 69], "reconfigur": 40, "record": [1, 2, 15, 37, 40], "rectangl": 2, "rectangular": [8, 94], "red": 24, "redhat": [4, 12], "redirect": 7, "redistribut": 19, "redocli": 21, "reduc": [1, 2, 3, 8, 15, 18, 37, 74, 93, 98], "reduct": 1, "redund": 1, "ref": 3, "refactor": 2, "refect": 2, "refer": [2, 4, 10, 15, 19, 20, 69], "refin": [1, 2, 58], "refinement_tim": 1, "reflect": [1, 2, 92], "refrain": 19, "refresh": 2, "regard": [2, 11, 18, 19], "regardless": [10, 19, 31], "regener": 19, "region": 40, "regist": 27, "registr": 2, "registri": 4, "regress": 3, "regular": 94, "regularli": 25, "reiniti": 40, "reinstat": [10, 19], "reject": [3, 18], "rel": [2, 3, 4, 15, 18, 31, 40, 69, 71, 98], "relat": [2, 3, 10], "relationship": 19, "releas": [1, 2, 4, 10, 12, 17, 19, 25, 40], "relev": [19, 37], "reli": [18, 19], "relicens": 19, "reload": 2, "remain": [10, 19, 23, 51], "remaind": 15, "remot": 2, "remov": [1, 2, 3, 4, 12, 15, 18, 19, 93], "renam": [2, 18], "render": [2, 19, 82], "reorder": 9, "repair": 19, "repeat": [10, 15], "replac": [2, 8, 24, 40], "repli": 11, "repo": [4, 23], "report": [2, 3, 15], "repositori": [12, 17, 24, 31], "repres": [19, 25, 40], "represent": [3, 10, 32, 33, 34, 36, 37, 38, 39, 41, 42, 43, 44, 45, 48, 49, 51, 54, 56, 57, 59, 60, 61, 62, 63, 64, 65, 66, 69, 70, 72, 73, 74, 75, 76, 77, 78, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99], "repub_watermark": 18, "republish": 2, "request": [7, 11, 13, 31], "requir": [2, 3, 4, 7, 10, 12, 16, 18, 19, 30, 37, 40, 69, 71], "research": [0, 10], "reserv": 13, "reset": [13, 27], "resili": 2, "resolut": [1, 2, 8, 13, 18, 40, 69, 84, 92, 93], "resolution_estim": [1, 79], "resolution_r": 82, "resolutionestim": 18, "resolv": [3, 19], "resonet": 2, "respect": [10, 19, 24], "respond": [11, 15], "respons": [2, 4, 14, 16, 19], "rest": [2, 16, 20, 31, 40, 71], "restart": [18, 40], "restrict": [3, 10, 19], "result": [1, 2, 3, 8, 9, 11, 12, 17, 18, 19, 29, 31, 39, 40, 62, 65, 82, 91], "result_scan_get": [30, 31], "retain": [10, 19], "retent": 64, "retri": [2, 18, 40], "retriev": 27, "return": [2, 19, 31, 33, 66], "reuis": 3, "reus": 2, "rev": 4, "revert": 2, "review": [2, 19], "revis": [2, 19], "rework": 2, "rewrit": 2, "rgb": 1, "rhel": [2, 4, 24, 25], "rhel8": 16, "right": [2, 6, 10, 19, 61], "ring": [1, 2, 18, 37, 40, 69, 92, 93], "ring_current_m_a": 37, "ring_current_ma": 1, "risk": [10, 19], "rlp": [1, 3], "rm": [22, 37, 65, 77], "robin": 15, "robust": 15, "rocki": [4, 24], "rocky8": 2, "roi": [1, 2, 9, 13, 18, 31, 40, 41, 74, 75, 82, 83, 84, 85, 86, 87, 88, 89], "roi_azim_list": 83, "roi_azim_list_dict": 83, "roi_azim_list_from_dict": 83, "roi_azim_list_inst": 83, "roi_azimuth": 84, "roi_azimuthal_dict": 84, "roi_azimuthal_from_dict": 84, "roi_azimuthal_inst": 84, "roi_beam_pixel": 75, "roi_beam_sum": 75, "roi_box": 85, "roi_box_dict": 85, "roi_box_from_dict": 85, "roi_box_inst": 85, "roi_box_list": 86, "roi_box_list_dict": 86, "roi_box_list_from_dict": 86, "roi_box_list_inst": 86, "roi_calc": 13, "roi_circl": 87, "roi_circle_dict": 87, "roi_circle_from_dict": 87, "roi_circle_inst": 87, "roi_circle_list": 88, "roi_circle_list_dict": 88, "roi_circle_list_from_dict": 88, "roi_circle_list_inst": 88, "roi_definit": [40, 89], "roi_definitions_dict": 89, "roi_definitions_from_dict": 89, "roi_definitions_inst": 89, "roi_exampl": 40, "roi_integr": 1, "roi_max_count": 79, "roi_mean": 79, "roi_mod": 41, "roi_nam": 18, "roi_pixel": 79, "roi_sum": 79, "roi_weighted_i": 79, "roi_weighted_x": 79, "roiazimlist": [31, 89], "roiazimuth": [31, 83], "roibox": [31, 86], "roiboxlist": [31, 89], "roicircl": [31, 88], "roicirclelist": [31, 89], "roidefinit": [31, 40, 74], "roll": 15, "rollback": 15, "rom": 19, "room": 65, "root": [4, 12, 13, 18, 31], "root_dir": 18, "rossmann": 3, "rot1": [1, 2, 6, 37], "rot2": [1, 2, 6, 37], "rot3": [1, 2, 6, 37], "rotat": [1, 2, 6, 40, 70, 90, 92], "rotation_axi": [61, 90], "rotation_axis_dict": 90, "rotation_axis_from_dict": 90, "rotation_axis_inst": 90, "rotation_crystal_lattic": 91, "rotation_index": 69, "rotation_indexing_angular_stride_deg": 69, "rotation_indexing_min_angular_range_deg": 69, "rotation_lattic": 1, "rotation_lattice_typ": 1, "rotation_unit_cel": 91, "rotationaxi": [31, 37], "roughli": [12, 14], "round": [3, 8, 15, 37], "routin": [2, 7, 26], "row": [1, 2, 61, 94], "royalti": [10, 19], "rpm": [4, 12, 16, 17, 23, 24, 25], "rule": [2, 7, 12, 19], "run": [1, 8, 12, 15, 19, 23, 24, 27, 31, 33, 37, 38, 40, 69, 75, 96], "run_nam": [1, 15, 18, 37], "run_numb": [1, 15, 18, 37, 75], "runtim": 31, "rvert": 3, "rx_statu": 11, "s1": 4, "s1600577522010268": 0, "s339": 3, "s350": 3, "s4": 4, "s_b": 3, "sa": 8, "safe": [4, 12, 27], "safeguard": 3, "safest": 19, "safeti": [15, 40], "sai": 19, "said": 14, "sake": 19, "sale": [10, 19], "same": [1, 2, 3, 10, 11, 12, 15, 17, 18, 19, 22, 39, 78], "sampl": [1, 2, 3, 6, 18, 37], "sample_nam": [1, 18, 37], "sample_temperature_k": [1, 37], "sat": 92, "satisfactori": 10, "satisfi": [3, 10, 19], "satur": [1, 2, 3, 8, 18, 40, 75, 82, 92], "saturated_pixel": 75, "saturated_pixel_count": 1, "saturation_valu": 1, "save": [2, 17, 18, 22, 25, 37, 40, 56, 65, 70], "save_calibr": 37, "sax": 8, "sc": 40, "scalar": 3, "scale": [2, 40], "scalign": 2, "scan": [1, 2, 3, 31, 39, 40, 61, 62, 90, 91, 92], "scan_result": [40, 91], "scan_result_dict": 91, "scan_result_from_dict": 91, "scan_result_images_inn": 92, "scan_result_images_inner_dict": 92, "scan_result_images_inner_from_dict": 92, "scan_result_images_inner_inst": 92, "scan_result_inst": 91, "scanresult": [31, 40], "scanresultimagesinn": [31, 91], "scatter": [2, 3], "schema": 1, "scheme": [2, 8], "scherrer": [30, 31], "schmitt": 0, "school": 19, "scope": [3, 19], "score": 3, "screen": [1, 4, 90], "screening_wedg": 1, "screening_wedge_deg": 90, "script": [2, 7, 12, 16, 19, 40], "sea": 4, "search": [2, 69], "second": [11, 15, 37, 40, 61, 98], "secondari": 15, "secondarili": 19, "secret": 10, "section": [10, 15, 17, 19], "secur": [10, 12, 18], "see": [1, 3, 5, 6, 7, 10, 12, 13, 15, 16, 17, 18, 19, 20, 21, 24, 26, 29, 31, 37, 40, 71, 93], "seek": 10, "seen": 11, "segment": 2, "select": [1, 2, 8, 12, 15, 31, 37, 40, 58, 68], "select_detector": [31, 40], "sell": [10, 19], "semant": [2, 30], "semiconductor": 19, "send": [1, 2, 4, 7, 9, 11, 13, 15, 16, 18, 31, 40, 64, 93, 95, 99], "send_buffer_s": [15, 16, 95, 99], "send_watermark": [15, 16, 99], "sender": 1, "sensor": [1, 22], "sensor_materi": [1, 16, 41], "sensor_thick": 1, "sensor_thickness_um": [16, 41], "sent": [1, 2, 11, 15, 40, 72, 75, 97, 98], "sep": 0, "separ": [2, 4, 7, 11, 14, 19, 40], "sequenti": 1, "seri": [1, 3, 18, 37], "serial": [1, 3, 15, 16, 25, 28, 97, 98, 99], "serial_numb": [2, 16, 41, 43, 44, 57], "series_id": 1, "series_unique_id": 1, "serv": 19, "server": [2, 7, 11, 19, 22, 24, 40, 51, 99], "server_vers": 51, "servic": [2, 4, 10, 18, 19], "session": [4, 37], "set": [2, 3, 4, 6, 7, 10, 11, 12, 13, 15, 18, 22, 23, 25, 27, 31, 32, 36, 37, 40, 41, 49, 65, 69, 70, 71, 72, 82, 93, 95, 98, 99], "setup": [2, 13, 31], "seven": 14, "sever": 3, "sh": 12, "sha1": 13, "shadow": 40, "shall": [10, 19], "shape": 1, "share": [2, 10, 16, 19], "shift": [2, 3], "short": [2, 18, 19], "shortcut": 2, "shorter": [2, 3], "shot": 2, "should": [2, 7, 10, 11, 12, 13, 14, 15, 16, 18, 19, 40, 65, 93, 98, 99], "show": [2, 7, 19, 29, 40, 77, 82], "show_beam_cent": 40, "show_index": 82, "show_res_est": 40, "show_res_r": 40, "show_roi": [40, 82], "show_spot": [40, 82], "show_user_mask": [40, 82], "shutter": 40, "si": [16, 41], "side": [1, 2, 11, 15, 30, 93], "sigma": [1, 2, 3], "sigma_": 3, "sigma_2": 3, "sigma_f": 3, "sign": [1, 2, 8, 18, 19, 23, 65], "signal": [2, 3, 8, 13, 22, 36], "signal_to_noise_threshold": 93, "signatur": 8, "signed_output": [16, 65], "signific": [2, 19], "significantli": 2, "silent": 2, "silver": 2, "similar": [7, 10, 14, 15, 19, 31], "similarli": 3, "simpl": 3, "simpler": 2, "simplest": 6, "simplifi": [1, 24], "simplon": 2, "simul": [2, 4, 7, 16, 19, 27, 40], "simultan": [15, 19], "sin": 3, "sinc": [15, 18], "singl": [1, 2, 3, 12, 13, 14, 15, 16, 18, 19, 25, 26, 27, 37, 55, 66], "singular": 3, "situat": [2, 11], "size": [1, 2, 3, 8, 12, 13, 15, 18, 22, 40, 72, 78, 93, 94, 95, 99], "size_i": 81, "size_x": 81, "skip": 69, "sl": [1, 9, 24], "slash": 18, "slider": 2, "slightli": 2, "slot": [2, 4, 7, 40, 64], "slow": [1, 2, 61, 98], "slow_axi": [16, 45], "slowli": 3, "slsdet8": 23, "slsdet9": 23, "slsdetectorgroup": 24, "slsdetectorpackag": [5, 24], "small": [2, 14, 15, 69, 93], "smaller": [3, 90], "smallest": [2, 64, 69], "smartnic": 30, "sn2100": 14, "snake": [1, 61], "snake_scan": 1, "so": [2, 3, 4, 7, 8, 10, 11, 12, 14, 15, 18, 19, 23, 25, 31, 40, 90], "so_sndbuf": 15, "so_zerocopi": 15, "socket": [1, 2, 16, 18, 31, 40, 66, 71, 75, 95, 97, 98, 99], "socket_address": [16, 40, 71, 97, 98], "socket_numb": [1, 15], "soft": [1, 2, 31, 40, 55], "softwar": [0, 2, 10, 16, 19, 26, 40, 72, 95, 99], "sold": 19, "sole": [6, 16, 19, 31, 37], "solid": [1, 3, 8, 32], "solid_angle_corr": [16, 32], "solut": [1, 2, 3, 5, 13, 63, 92], "solv": [2, 3], "solver": [3, 24], "some": [2, 3, 8, 15, 19, 24, 40], "someth": 10, "sometim": 93, "soon": 2, "sourc": [1, 2, 4, 5, 10, 12, 13, 16, 19, 23, 25, 37, 70], "source_nam": [1, 16, 70], "source_typ": [1, 16, 70], "space": [1, 2, 12, 15, 18, 37, 91, 93], "space_group": 2, "space_group_numb": [1, 18, 37], "spallat": 70, "spare": 19, "spdlog": [2, 24], "speak": 19, "spec": [2, 21], "special": [3, 8, 9, 10, 11, 12, 13, 19, 40, 65], "specif": [1, 4, 7, 8, 10, 14, 18, 19, 20, 30, 31, 70], "specifi": [8, 10, 19], "spectra": 2, "spectral": 3, "spectrum": [1, 3], "speed": [2, 3, 4, 11, 26, 57, 65], "spent": 1, "sphere": [1, 18, 92], "spirit": [3, 10, 19, 31], "split": [3, 8, 14, 18], "spot": [1, 2, 9, 13, 15, 18, 26, 31, 37, 40, 63, 69, 82, 92, 93], "spot_count": [1, 62, 79], "spot_count_ice_r": 1, "spot_count_index": 1, "spot_count_low_r": 1, "spot_find": [31, 37, 40, 72], "spot_finder_mask": 13, "spot_finding_set": [40, 93], "spot_finding_settings_dict": 93, "spot_finding_settings_from_dict": 93, "spot_finding_settings_inst": 93, "spot_finding_tim": 1, "spotfindingset": [31, 40, 72, 74], "spots_ic": 92, "spots_index": 92, "spots_low_r": 92, "spur": 3, "spuriou": 93, "sq": [13, 37], "sqrt": [8, 9, 37], "squar": [1, 2, 3, 18, 24, 58], "src": 4, "ssl": 2, "ssx": [2, 25], "stabil": 3, "stack": [2, 6, 7, 13, 27, 40], "stadler": [0, 24], "stage": [1, 40], "stai": 15, "stall": 13, "stamp": 18, "stand": 19, "standalon": 17, "standard": [1, 2, 3, 4, 8, 13, 18, 19, 24, 32, 37, 40], "standard_detector_geometri": 94, "standard_detector_geometry_dict": 94, "standard_detector_geometry_from_dict": 94, "standard_detector_geometry_inst": 94, "standard_geometri": [16, 41], "standarddetectorgeometri": [31, 41], "star": 99, "start": [2, 3, 7, 9, 13, 15, 18, 19, 33, 37, 40, 49, 64, 90, 99], "start_post": [30, 31], "start_tim": 1, "startfail": 15, "startup": 2, "state": [1, 2, 9, 10, 18, 19, 29, 31, 33, 40, 50, 51], "statement": 19, "static": [2, 5, 24], "statist": [1, 2, 8, 18, 31, 37, 40, 74], "statistics_calibration_get": [30, 31], "statistics_data_collection_get": [30, 31], "statistics_get": [30, 31], "statu": [2, 11, 13, 15, 16, 18, 19, 27, 31, 40, 66, 71], "status_get": [30, 31], "step": [1, 2, 4, 9, 19, 22, 61, 90], "step_x_axi": 1, "step_x_um": 61, "step_y_axi": 1, "step_y_um": 61, "still": [2, 12, 40, 93], "stop": [2, 7, 9, 15, 40], "storag": [1, 2, 12, 13, 18, 19, 37, 40, 49], "storage_cel": 1, "storage_cell_delai": 1, "storage_cell_imag": 18, "storage_cell_numb": [1, 34], "store": [1, 2, 3, 18, 40, 49], "str": [33, 37, 40, 41, 43, 44, 51, 54, 57, 66, 70, 72, 73, 75, 76, 78, 81, 84, 85, 87, 90, 91, 95, 97, 98, 99], "straightforward": 4, "strategi": 3, "stream": [2, 3, 5, 7, 16, 18, 28, 30, 37, 40, 71, 72, 95, 99], "stream2": [1, 15], "strictli": [1, 15], "string": [1, 2, 18, 32, 33, 34, 36, 37, 38, 39, 41, 42, 43, 44, 45, 48, 49, 51, 54, 56, 57, 59, 60, 61, 62, 63, 64, 65, 66, 69, 70, 72, 73, 74, 75, 76, 77, 78, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99], "strong": [1, 8, 18], "strong_pixel": 79, "strong_pixel_count": 1, "strongpixel": 18, "structur": [0, 2, 4, 13, 16, 40, 71, 72, 95, 99], "studi": 10, "style": 3, "sub": [10, 37, 40], "subdivid": 19, "subject": [3, 10, 19, 31], "sublicens": 19, "subprogram": 19, "subroutin": 19, "subsect": [10, 19], "subsequ": [3, 8, 10, 49], "subset": 16, "substanti": [3, 19], "substitut": [10, 14, 15], "subsystem": [7, 13], "success": [1, 15], "successfulli": [11, 18, 75], "sudo": [4, 12, 23, 31], "sue": 19, "suffic": 19, "suffici": [3, 10], "suffix": [2, 18, 56], "suggest": [10, 18], "suitabl": 3, "sum": [1, 2, 3, 8, 18, 75, 92], "sum_": 3, "sum_i": 3, "sum_j": 3, "sum_sq": 18, "sum_squar": 1, "summat": [1, 2, 13, 16, 37, 65], "summation_mod": 1, "superus": 12, "supplement": 19, "suppli": 3, "support": [0, 1, 2, 3, 6, 7, 10, 11, 13, 14, 15, 17, 19, 23, 25, 30, 31, 40, 71], "suppress": 2, "sure": [19, 40], "surfac": 6, "surrend": 19, "surviv": 19, "sustain": 19, "swiss": 16, "swissfel": [1, 13], "switch": [2, 4, 7, 15, 40], "switzerland": 31, "sy": [2, 12], "symbol": 3, "symmetri": [2, 3], "sync": [2, 17], "synchr": 8, "synchron": [15, 18, 40, 99], "synchrotron": [0, 1, 16, 37, 70], "synthesi": [9, 16, 19], "syscal": 31, "system": [0, 1, 2, 3, 4, 7, 12, 14, 16, 17, 19, 22, 30, 31, 69], "systemat": 19, "systemd": 4, "t": [2, 3, 4, 5, 11, 12, 14, 15, 18, 22, 25, 31, 33, 40, 65, 69], "t4": 14, "t_": 3, "tab": 2, "tabl": [11, 13, 15, 18], "tag": [1, 3], "takaba": 2, "take": [2, 4, 14, 19, 40], "taken": [1, 2, 6, 11], "tangibl": 19, "target": 7, "tau": 3, "tbd": 2, "tcl": 7, "tcp": [2, 16, 18, 66, 67, 72, 75, 95, 97, 98], "tcp_keepcnt": 15, "tcp_keepidl": 15, "tcp_keepintvl": 15, "tcp_set": [15, 95], "tcp_settings_dict": 95, "tcp_settings_from_dict": 95, "tcp_settings_inst": 95, "tcpset": [31, 72], "techniqu": 6, "technolog": 19, "tee": 23, "tell": 19, "temp": 2, "temp_thresold_deg_c": 41, "temperatur": [1, 2, 7, 37, 41, 51, 65], "temporari": [2, 93], "tensor": 3, "term": [2, 3, 10, 31], "termin": [10, 13, 18, 19], "test": [2, 4, 8, 10, 12, 17, 18, 23, 24, 25, 27, 30], "test1": 18, "test2": 18, "test_data": 16, "tetragon": [1, 3], "text": [1, 3, 10, 15, 40, 71], "th": 2, "than": [1, 2, 10, 12, 15, 18, 19, 25, 37, 40, 75, 77, 90], "thank": 2, "thei": [3, 8, 10, 12, 19, 25, 27, 31, 72], "them": [2, 3, 9, 10, 19, 37], "theori": 10, "therefor": [1, 4, 7, 11, 14, 15, 16, 18, 19], "thereof": 28, "theta": 1, "thi": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 22, 24, 26, 28, 31, 33, 37, 40, 41, 49, 58, 64, 65, 66, 69, 71, 72, 75, 93, 95, 98, 99], "thick": 1, "thing": [2, 4, 19], "third": [3, 10, 19], "those": [3, 10, 19], "though": [2, 4, 7, 8, 11, 12, 14, 17, 18, 19, 25, 37, 70, 93], "thread": [2, 12, 15, 24, 26, 27, 69, 72], "thread_count": 69, "threaten": 19, "three": [6, 10, 15, 18, 19, 25], "threshold": [1, 2, 3, 9, 13, 22, 36, 41, 49, 65, 77, 93], "threshold_energi": 1, "throttl": 2, "through": [2, 7, 12, 13, 16, 19, 23, 24, 31], "thrown": 15, "thu": 19, "ti": [3, 18], "tiff": [1, 2, 22, 24, 31, 40, 55], "tifffil": 22, "till": [2, 40], "tilt": [1, 2, 3, 6], "tim": 2, "time": [1, 2, 3, 4, 10, 15, 16, 18, 19, 22, 25, 36, 37, 40, 41, 49, 65, 69], "timeout": [15, 40], "timestamp": [2, 18, 56], "tinycbor": [1, 24], "titl": [78, 81], "tmp": [2, 18, 56], "to_dict": [32, 33, 34, 36, 37, 38, 39, 41, 42, 43, 44, 45, 48, 49, 51, 54, 56, 57, 59, 60, 61, 62, 63, 64, 65, 66, 69, 70, 72, 73, 74, 75, 76, 77, 78, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99], "to_json": [32, 33, 34, 36, 37, 38, 39, 41, 42, 43, 44, 45, 48, 49, 51, 54, 56, 57, 59, 60, 61, 62, 63, 64, 65, 66, 69, 70, 72, 73, 74, 75, 76, 77, 78, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99], "todo": [32, 33, 34, 36, 37, 38, 39, 41, 42, 43, 44, 45, 48, 49, 51, 54, 56, 57, 59, 60, 61, 62, 63, 64, 65, 66, 69, 70, 72, 73, 74, 75, 76, 77, 78, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99], "togeth": [2, 8], "toler": [1, 2, 69, 92], "tomykaira": 24, "too": [2, 19], "too_high_pedestal_rm": 77, "tool": [2, 4, 5, 10, 19, 20, 24, 30], "toolbar": 2, "toolset": 7, "tooltip": 2, "top": [2, 6, 40, 41, 61, 71], "toro": 3, "tort": 10, "total": [1, 2, 18, 92], "total_flux": [1, 37], "total_slot": 64, "tpc": 99, "track": [2, 15], "trade": [10, 19], "trademark": [10, 19], "traffic": 14, "train": 11, "transact": 19, "transceiv": 7, "transfer": [10, 12, 19, 37, 74], "transform": [1, 2, 3, 37], "translat": [1, 90], "transmiss": [1, 2, 19, 37], "transmit": [31, 40], "transpar": 15, "treat": [10, 19], "treati": 19, "treatment": 2, "trial": 3, "triclin": [1, 3], "trigger": [1, 2, 15, 31, 37, 40, 49, 51, 52, 70], "trigger_post": [30, 31], "trigon": 1, "trim": [2, 3, 4, 41], "tripl": 3, "true": [3, 15, 16, 18, 32, 37, 40, 41, 65, 69, 82, 93, 97, 98], "try": [2, 4, 31, 40, 71], "tt": 8, "ttl": [37, 40, 49, 70], "tube": 70, "tune": 8, "turbo": [2, 24], "turn": [4, 8, 11, 31, 37, 40, 41, 65, 93], "twice": 2, "two": [1, 2, 4, 7, 10, 11, 12, 14, 15, 18, 19, 22, 40, 49], "tx": [7, 14], "tx_delai": [16, 41], "type": [1, 2, 3, 8, 12, 16, 19, 32, 33, 34, 36, 37, 38, 39, 41, 42, 43, 44, 45, 48, 49, 51, 54, 56, 57, 59, 60, 61, 62, 63, 64, 65, 66, 69, 70, 72, 73, 74, 75, 76, 77, 78, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99], "type_exampl": 40, "typescript": 29, "typic": [3, 19], "u": [2, 3, 40], "u55c": [7, 11, 14], "u8": 1, "ubuntu": 24, "uc": [63, 92], "udev": 12, "udp": [2, 9, 11, 13, 18, 27, 43, 44], "udp_interface_count": [16, 41, 43, 44], "ug1469": 7, "uint16": 1, "uint16_t": 15, "uint32": 22, "uint32_t": 15, "uint64": 1, "uint64_t": 15, "ultrascal": 7, "unaccept": 19, "uncompress": 1, "unconvert": 8, "under": [0, 3, 10, 15, 19, 30, 31], "underload": 18, "understood": 4, "undertak": 10, "unenforc": 10, "unfortun": 14, "uniform": 3, "uniqu": [1, 3, 10, 37], "unit": [1, 2, 5, 8, 14, 18, 37, 38, 39, 40, 58, 69, 96], "unit_cel": [1, 2, 18, 37, 75, 96], "unit_cell_dict": 96, "unit_cell_dist_toler": 69, "unit_cell_from_dict": 96, "unit_cell_inst": 96, "unit_x": 81, "unitcel": [31, 37, 63, 91, 92], "uniti": 3, "univers": [0, 7], "unix": 12, "unknown": 41, "unless": [3, 10, 19], "unlimit": 19, "unmodifi": [10, 19], "unnecessari": [2, 19], "unnorm": 3, "unpack": 19, "unrecover": 15, "unsign": [13, 22, 40], "unstabl": [2, 3], "unsum": 8, "until": [19, 40, 69], "up": [2, 7, 12, 14, 15], "updat": [2, 4, 10, 12, 16, 19, 23, 32, 33, 34, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 48, 49, 51, 54, 56, 57, 59, 60, 61, 62, 63, 64, 65, 66, 69, 70, 72, 73, 74, 75, 76, 77, 78, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99], "upgrad": [4, 12], "upload": [2, 22, 31, 40], "upper": [11, 85], "upstream": 2, "upward": 6, "uri": [31, 40, 71], "us": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 23, 25, 30, 31, 33, 36, 37, 40, 41, 49, 58, 65, 66, 68, 69, 72, 77, 84, 85, 87, 90, 93, 95, 97, 98, 99], "usag": [7, 27], "user": [2, 3, 4, 6, 7, 12, 16, 18, 19, 29, 31, 37, 40, 77, 82], "user_data": [1, 18, 37], "user_mask": [22, 31, 40, 77], "usernam": 12, "userspac": 31, "usr": [4, 16], "usual": [2, 12], "utc": 2, "utf": 15, "util": [2, 66], "uv": 70, "v": [2, 3, 6, 12, 13, 18, 22, 25, 69], "v_i": 3, "val1": 37, "val2": 37, "valid": [1, 3, 8, 13, 15, 18, 19, 37, 40, 71, 75], "valu": [1, 2, 3, 6, 8, 9, 12, 13, 15, 18, 22, 31, 35, 37, 40, 46, 47, 49, 50, 52, 53, 55, 57, 58, 64, 65, 67, 68, 69, 75, 79, 80, 82, 90], "vari": 3, "variabl": [3, 12], "varianc": 3, "variant": [7, 10, 11, 13, 14], "variou": 11, "vd": 25, "vector": [1, 2, 90, 91], "vendor": 14, "verbatim": [10, 19, 27], "verbos": [2, 72], "veri": [2, 8, 15, 16, 17, 23, 69, 93], "verifi": 26, "version": [1, 2, 4, 5, 7, 12, 15, 17, 19, 23, 24, 25, 30, 31, 33, 40, 51, 64], "version_get": [30, 31], "versu": 2, "vertic": [1, 2, 8, 37, 61], "vertical_scan": 1, "via": [0, 2, 3, 4, 5, 7, 9, 11, 12, 13, 15, 16, 17, 18, 31, 40, 71, 99], "viabl": [2, 18, 49, 69, 92], "viable_cell_min_spot": 69, "view": [2, 19, 29], "viewabl": 10, "viewer": [2, 15, 17, 18, 23], "violat": 19, "viridi": [0, 35], "virtual": [1, 2, 12, 18, 25, 55], "visibl": [2, 19], "visibli": 10, "visual": [2, 17], "viti": 7, "vitis_hl": 7, "vivado": [0, 2, 4], "void": [19, 40, 71], "vol": 18, "volatil": 40, "voltag": [40, 51], "volum": 19, "vv": 4, "w": [2, 3, 7, 10, 13, 18, 19], "w_j": 3, "wa": [2, 4, 8, 15, 18, 19, 22, 64], "wai": [2, 4, 8, 10, 12, 15, 18, 19, 22], "wait": [2, 31, 37, 40, 50], "wait_till_don": [2, 31, 40], "wait_till_done_post": [30, 31], "wait_until_run": [31, 40], "wait_until_running_post": [30, 31], "waiv": 19, "waiver": 19, "wakonig": 8, "wang": 0, "want": [2, 19], "warmer": 2, "warn": [2, 4, 33], "warranti": [10, 14, 19], "water": 15, "watermark": [2, 15, 18, 99], "wavelength": [1, 2, 6, 70], "wavevector": 3, "wax": 8, "we": [2, 4, 11, 14, 18, 19, 20, 23, 24, 25, 28], "weak": 3, "weakli": 10, "web": [2, 16, 30, 40, 72], "webpag": [7, 10], "websit": [5, 7], "wedg": [1, 90], "weight": [3, 8, 13, 18], "welcom": [10, 19], "well": [2, 4, 6, 8, 12, 14, 15, 17, 18, 19, 29, 40], "were": [1, 2, 3, 8, 15, 19, 40, 75], "what": [18, 19], "whatev": 19, "wheel": 2, "when": [2, 3, 4, 11, 12, 14, 15, 18, 19, 25, 31, 37, 40, 71, 93], "where": [2, 3, 6, 7, 8, 10, 18, 19, 33, 65], "whether": [10, 15, 19, 31], "which": [1, 2, 3, 6, 7, 10, 12, 14, 15, 17, 19, 37, 40, 69, 98], "while": [3, 8, 10, 12, 31, 40, 71, 75], "white": 3, "who": [10, 19], "whole": [1, 2, 10, 19, 28], "wholli": 3, "whom": 19, "whose": 19, "why": [19, 22], "wide": 19, "wider": 31, "widget": 2, "width": [1, 2, 4, 8, 43, 44, 57, 59, 60, 93], "wilson": 2, "window": [2, 3, 19], "wip": 2, "wipo": 19, "wise": 2, "wish": 19, "within": [1, 2, 3, 8, 10, 15, 18, 19, 37, 40, 71, 75, 92], "without": [2, 4, 7, 10, 11, 14, 16, 19, 28, 31], "wojdyla": 0, "won": [11, 12, 15, 18, 33], "word": 37, "work": [2, 4, 7, 8, 10, 12, 13, 14, 16, 18, 19, 31], "workflow": [2, 3, 16], "worklow": 2, "worldwid": [10, 19], "would": [1, 2, 6, 14, 18, 19, 56], "wright": 3, "write": [1, 2, 4, 13, 15, 16, 18, 19, 26, 37, 64, 99], "write_master_fil": 1, "write_nxmx_hdf5_mast": 37, "writer": [1, 2, 13, 18, 23, 24, 27, 31, 37, 40, 66, 75, 95, 99], "writer_fifo_util": 66, "writer_notification_socket": [15, 16, 99], "writer_notification_zmq_addr": [1, 15], "written": [1, 2, 7, 9, 15, 16, 17, 18, 19, 26, 29, 37, 55, 66, 75, 93], "wrong": [2, 77], "wrong_gain": 77, "wrongli": 2, "www": 19, "x": [0, 1, 2, 3, 4, 6, 8, 14, 16, 18, 23, 31, 37, 39, 40, 61, 70, 78, 81, 85, 87, 91, 92, 94], "x0": [16, 45], "x06sa": 16, "x16": [7, 14], "x8": [4, 7, 14, 57], "x86_64": 4, "x_": 3, "x_p": 3, "x_weighted_sum": 1, "xbflash": 4, "xd": [2, 3, 18, 26], "xds_durin": 26, "xds_neggia": 26, "xeon": 14, "xfel": [18, 31, 37, 40, 70, 92], "xfel_event_cod": 1, "xfel_event_code_get": [30, 31], "xfel_pulse_id": 1, "xfel_pulse_id_get": [30, 31], "xfel_pulseid": 92, "xia2": [2, 25], "xilinx": [4, 13, 14, 24], "xmax": 1, "xmin": 1, "xn": 46, "xp": [16, 46], "xput": 22, "xray_fluorescence_spectrum": 37, "xscale": 3, "xyz": 37, "y": [1, 3, 4, 6, 8, 18, 24, 40, 41, 61, 78, 81, 85, 87, 91, 92, 94], "y0": [16, 45], "y_": 3, "y_p": 3, "y_weighted_sum": 1, "yaml": [16, 19], "year": [10, 19], "yet": [1, 2, 18, 40], "yhiros": 24, "ymax": 1, "ymin": 1, "yml": 26, "yn": 46, "you": [4, 10, 12, 16, 18, 19, 20, 31], "your": [10, 31], "yourself": 19, "yp": 46, "z": [0, 3, 40, 78, 91], "z_": 3, "zdenek": 18, "zero": [1, 2, 8, 9, 13, 18, 22, 36, 37, 93, 98], "zeromq": [1, 2, 4, 16, 18, 24, 28, 31, 37, 40, 66, 67, 71, 72, 75, 97, 98, 99], "zeromq_metadata": [16, 31, 40, 71, 72, 74], "zeromq_metadata_set": [40, 71, 97], "zeromq_metadata_settings_dict": 97, "zeromq_metadata_settings_from_dict": 97, "zeromq_metadata_settings_inst": 97, "zeromq_preview": [16, 31, 40, 72, 74], "zeromq_preview_set": [40, 98], "zeromq_preview_settings_dict": 98, "zeromq_preview_settings_from_dict": 98, "zeromq_preview_settings_inst": 98, "zeromq_set": [15, 99], "zeromq_settings_dict": 99, "zeromq_settings_from_dict": 99, "zeromq_settings_inst": 99, "zeromqmetadataset": [31, 40, 71, 72, 74], "zeromqpreviewset": [31, 40, 72, 74], "zeromqset": [31, 72], "zeta_": 3, "zlib": 24, "zmq_file_port": 18, "zmq_repub_port": 18, "zoom": 2, "zstandard": [1, 24], "zstd": [2, 24], "\u00e5": 3, "\u03b6": 3}, "titles": ["Acknowledgements", "CBOR messages", "Changelog", "CPU-side crystallographic data analysis (Jungfraujoch)", "Deployment", "Supported detectors", "Detector geometry", "FPGA smartNIC", "FPGA data analysis", "FPGA data flow", "FPGA license", "FPGA network", "FPGA PCIe driver", "FPGA advanced reference", "Hardware requirements", "Data streams", "jfjoch_broker", "jfjoch_viewer", "jfjoch_writer", "License", "OpenAPI", "OpenAPI specification", "Pixel mask", "Linux package repositories", "Software requirements", "Integration with MX data processing software", "Tests", "Tools", "Semantic versioning", "Web frontend", "PSI Jungfraujoch", "jfjoch-client", "AzimIntSettings", "BrokerStatus", "CalibrationStatisticsInner", "ColorScale", "DarkMaskSettings", "DatasetSettings", "DatasetSettingsUnitCell", "DatasetSettingsXrayFluorescenceSpectrum", "jfjoch_client.DefaultApi", "Detector", "DetectorList", "DetectorListDetectorsInner", "DetectorListElement", "DetectorModule", "DetectorModuleDirection", "DetectorPowerState", "DetectorSelection", "DetectorSettings", "DetectorState", "DetectorStatus", "DetectorTiming", "DetectorType", "ErrorMessage", "FileWriterFormat", "FileWriterSettings", "FpgaStatusInner", "GeomRefinementAlgorithm", "GridPlot", "GridPlots", "GridScan", "GridScanResult", "GridScanResultImagesInner", "ImageBufferStatus", "ImageFormatSettings", "ImagePusherStatus", "ImagePusherType", "IndexingAlgorithm", "IndexingSettings", "InstrumentMetadata", "jfjoch_client.JfjochBrokerApi", "JfjochSettings", "JfjochSettingsSsl", "JfjochStatistics", "MeasurementStatistics", "PcieDevicesInner", "PixelMaskStatistics", "Plot", "PlotTypeEnum", "PlotUnitX", "Plots", "PreviewSettings", "RoiAzimList", "RoiAzimuthal", "RoiBox", "RoiBoxList", "RoiCircle", "RoiCircleList", "RoiDefinitions", "RotationAxis", "ScanResult", "ScanResultImagesInner", "SpotFindingSettings", "StandardDetectorGeometry", "TcpSettings", "UnitCell", "ZeromqMetadataSettings", "ZeromqPreviewSettings", "ZeromqSettings"], "titleterms": {"": 18, "0": 2, "1": [2, 3], "10": 3, "100": 2, "101": 2, "102": 2, "103": 2, "104": 2, "105": 2, "106": 2, "107": 2, "108": 2, "109": 2, "11": 3, "110": 2, "111": 2, "112": 2, "113": 2, "114": 2, "115": 2, "116": 2, "117": 2, "118": 2, "119": 2, "12": 3, "120": 2, "121": 2, "122": 2, "123": 2, "124": 2, "125": 2, "126": 2, "127": 2, "128": 2, "129": 2, "13": 3, "130": 2, "131": 2, "132": 2, "133": 2, "134": 2, "135": 2, "136": 2, "137": 2, "138": 2, "139": 2, "140": 2, "141": 2, "142": 2, "143": 2, "144": 2, "2": [3, 10], "24": 2, "25": 2, "26": 2, "27": 2, "28": 2, "29": 2, "2d": 3, "3": 3, "30": 2, "31": 2, "32": 2, "33": 2, "34": 2, "35": 2, "36": 2, "37": 2, "38": 2, "39": 2, "4": 3, "40": 2, "41": 2, "42": 2, "43": 2, "44": 2, "45": 2, "46": 2, "47": 2, "48": 2, "49": 2, "5": [3, 12], "50": 2, "51": 2, "52": 2, "53": 2, "54": 2, "55": 2, "56": 2, "57": 2, "58": 2, "59": 2, "6": 3, "60": 2, "61": 2, "62": 2, "63": 2, "64": 2, "65": 2, "66": 2, "67": 2, "68": 2, "69": 2, "7": 3, "70": 2, "71": 2, "72": 2, "73": 2, "74": 2, "75": 2, "76": 2, "77": 2, "78": 2, "79": 2, "8": 3, "80": 2, "81": 2, "82": 2, "83": 2, "84": 2, "85": 2, "86": 2, "87": 2, "88": 2, "89": 2, "9": [3, 12], "90": 2, "91": 2, "92": 2, "93": 2, "94": 2, "95": 2, "96": 2, "97": 2, "98": 2, "99": 2, "A": 3, "AND": 19, "For": 31, "No": 18, "These": 19, "absenc": 3, "access": 12, "ack": 15, "acknowledg": [0, 18], "adu": 8, "advanc": 13, "an": 3, "analysi": [3, 8], "api": 31, "appli": [3, 19], "author": [31, 40, 71], "avail": 3, "axi": 13, "azimintset": 32, "azimuth": [3, 8], "b": 3, "background": 3, "base": 23, "basic": 3, "best": 3, "bragg": 3, "bravai": 3, "bring": 3, "broker": 16, "brokerstatu": 33, "buffer": 12, "build": 7, "calcul": 8, "calibr": 1, "calibrationstatisticsinn": 34, "cancel_post": 40, "candid": 3, "card": 4, "cbf": 18, "cbor": 1, "ccl": 3, "cell": 3, "center": 3, "cern": 10, "changelog": 2, "charact": 12, "ci": 7, "clarif": 31, "client": [4, 20, 30, 31], "cmake": 12, "code": 4, "colorscal": 35, "common": 3, "compil": [7, 12, 16], "compon": 3, "compress": [1, 8], "condit": 19, "config_azim_int_get": 40, "config_azim_int_put": 40, "config_dark_mask_get": 40, "config_dark_mask_put": 40, "config_detector_get": 40, "config_detector_put": 40, "config_file_writer_get": 40, "config_file_writer_put": 40, "config_image_format_conversion_post": 40, "config_image_format_get": 40, "config_image_format_put": 40, "config_image_format_raw_post": 40, "config_indexing_get": 40, "config_indexing_put": 40, "config_instrument_get": 40, "config_instrument_put": 40, "config_internal_generator_image_put": 40, "config_internal_generator_image_tiff_put": 40, "config_mask_get": 40, "config_mask_tiff_get": 40, "config_roi_get": 40, "config_roi_put": 40, "config_select_detector_get": 40, "config_select_detector_put": 40, "config_spot_finding_get": 40, "config_spot_finding_put": 40, "config_user_mask_get": 40, "config_user_mask_put": 40, "config_user_mask_tiff_get": 40, "config_user_mask_tiff_put": 40, "config_zeromq_metadata_get": 40, "config_zeromq_metadata_put": [40, 71], "config_zeromq_preview_get": 40, "config_zeromq_preview_put": 40, "configur": [4, 11, 15, 16], "connect": 3, "convent": [3, 6], "convers": 8, "coordin": 3, "copi": 15, "correct": 3, "cpu": 3, "crystallograph": 3, "crystallographi": 6, "crystfel": 25, "custom": 22, "cutoff": 3, "darkmaskset": 36, "data": [1, 3, 8, 9, 15, 17, 18, 25], "dataset": 3, "datasetset": 37, "datasetsettingsunitcel": 38, "datasetsettingsxrayfluorescencespectrum": 39, "dbu": 17, "deactivate_post": 40, "decis": 3, "dectri": 5, "defaultapi": 40, "delta": 3, "depend": 24, "deploy": 4, "detail": [40, 71], "detect": 3, "detector": [5, 6, 41], "detector_status_get": 40, "detectorlist": 42, "detectorlistdetectorsinn": 43, "detectorlistel": 44, "detectormodul": 45, "detectormoduledirect": 46, "detectorpowerst": 47, "detectorselect": 48, "detectorset": 49, "detectorst": 50, "detectorstatu": 51, "detectortim": 52, "detectortyp": 53, "devic": 12, "dial": 25, "direct": [3, 6], "directori": 18, "distanc": 3, "dkm": 12, "document": 31, "driver": [4, 12], "end": 1, "endpoint": 31, "enum": [35, 46, 47, 50, 52, 53, 55, 58, 67, 68, 79, 80], "enumer": 3, "equat": 3, "erf": 3, "error": 3, "errormessag": 54, "estim": 3, "ewald": 3, "exampl": [32, 33, 34, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 48, 49, 51, 54, 56, 57, 59, 60, 61, 62, 63, 64, 65, 66, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99], "except": 19, "exchang": 12, "excit": 3, "expect": [3, 16], "extern": 16, "f": 3, "factor": 3, "fft": 3, "file": [12, 18], "filewriterformat": 55, "filewriterset": 56, "final": 18, "find": [3, 8], "firmwar": [4, 7], "flash": 4, "flow": 9, "format": [18, 22], "fpga": [4, 7, 8, 9, 10, 11, 12, 13, 14, 30], "fpga_status_get": 40, "fpgastatusinn": 57, "frac": 3, "fraction": 3, "frame": [3, 7, 8, 15], "french": 3, "from": 3, "frontend": [4, 16, 29], "gaussian": 3, "gener": [7, 19, 30], "geometri": [3, 6], "geomrefinementalgorithm": 58, "get": 31, "gitlab": 7, "gnu": 19, "gpl": 19, "gpu": 14, "gridplot": [59, 60], "gridscan": 61, "gridscanresult": 62, "gridscanresultimagesinn": 63, "handl": [3, 15], "hardwar": [7, 10, 14], "hbm": 13, "hdf5": 18, "header": [15, 40, 71], "high": 14, "histogram": [3, 8], "hl": 7, "how": 19, "http": [18, 40, 71], "i": [3, 7], "ic": 3, "imag": [1, 4, 15], "image_buffer_clear_post": 40, "image_buffer_image_cbor_get": 40, "image_buffer_image_jpeg_get": 40, "image_buffer_image_tiff_get": 40, "image_buffer_start_cbor_get": 40, "image_buffer_status_get": 40, "image_pusher_status_get": 40, "imagebufferstatu": 64, "imageformatset": 65, "imagepusherstatu": 66, "imagepushertyp": 67, "index": 3, "indexingalgorithm": 68, "indexingset": 69, "infer": 3, "inform": 18, "initialize_post": 40, "inlier": 3, "instal": [4, 12, 31], "instrumentmetadata": 70, "integr": [3, 8, 18, 25], "intens": 3, "interest": [3, 8], "interfac": [4, 16, 17, 18], "ip": 15, "issu": 12, "jfjoch": 31, "jfjoch_brok": 16, "jfjoch_client": [40, 71], "jfjoch_hdf5_tool": 27, "jfjoch_offline_process": 27, "jfjoch_pcie_clear_net_count": 27, "jfjoch_pcie_net_cfg": 27, "jfjoch_pcie_read_regist": 27, "jfjoch_pcie_statu": 27, "jfjoch_udp_simul": 27, "jfjoch_view": 17, "jfjoch_writ": 18, "jfjochbrokerapi": 71, "jfjochset": 72, "jfjochsettingsssl": 73, "jfjochstatist": 74, "jungfrau": 8, "jungfraujoch": [3, 4, 16, 19, 30], "keepal": 15, "kernel": [4, 12], "known": 12, "label": 3, "lattic": 3, "laue": 3, "led": 11, "left": 3, "legaci": 18, "licenc": 10, "licens": [10, 19, 31], "likelihood": 3, "limit": 3, "linux": [4, 23], "load": 12, "local": [3, 16], "lorentz": 3, "macromolecular": 6, "mailbox": 13, "main": 4, "map": [3, 13], "mask": [8, 22], "master": 18, "mathrm": 3, "maximum": 3, "measurementstatist": 75, "memori": 13, "merg": 3, "messag": 1, "metadata": [1, 15], "method": 3, "model": [3, 31], "monitor": 3, "mosaic": 3, "multi": 3, "mx": 25, "network": [4, 11, 14], "new": 19, "note": [1, 3], "notif": 15, "nxmxintegr": 18, "nxmxlegaci": 18, "nxmxvd": 18, "object": 3, "observ": 3, "open": 10, "openapi": [20, 21, 30], "oper": 24, "option": 18, "oscil": 3, "other": 18, "over": 3, "overview": 3, "overwrit": 18, "ownership": 12, "p": 3, "packag": 23, "paramet": [12, 40, 71], "parameter": 3, "partial": 3, "pci": 14, "pcie": [4, 12], "pciedevicesinn": 76, "peak": 3, "pedestal_post": 40, "per": 3, "perform": 14, "phi": 3, "pick": 3, "pip": 31, "pipelin": 17, "pixel": [3, 8, 22], "pixelmaskstatist": 77, "plot": [3, 78, 81], "plottypeenum": 79, "plotunitx": 80, "point": 3, "polar": 3, "posterior": 3, "practic": 3, "preambl": 19, "predict": 3, "present": 7, "preview": 15, "preview_pedestal_tiff_get": 40, "preview_plot_bin_get": 40, "preview_plot_get": 40, "previewset": 82, "problem": 12, "process": [17, 25], "profil": 3, "program": 19, "project": 3, "proper": 4, "properti": [32, 33, 34, 36, 37, 38, 39, 41, 42, 43, 44, 45, 48, 49, 51, 54, 56, 57, 59, 60, 61, 62, 63, 64, 65, 66, 69, 70, 72, 73, 74, 75, 76, 77, 78, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99], "proxi": 3, "psi": [5, 30], "public": 19, "python": [4, 20, 30], "q": 3, "quantiti": 3, "radial": 3, "radiu": 3, "ratio": 8, "rc": 2, "reciproc": [3, 10], "reduct": 3, "refer": [3, 13, 30], "refin": 3, "reflect": 3, "region": [3, 8], "regist": 13, "regular": 3, "replac": 15, "repositori": 23, "republish": 18, "request": [40, 71], "requir": [14, 24, 31], "residu": 3, "resolut": 3, "respons": [40, 71], "result": 16, "result_scan_get": 40, "return": [40, 71], "rhel": [12, 23], "right": 3, "ring": 3, "robust": 3, "roi": 8, "roiazimlist": 83, "roiazimuth": 84, "roibox": 85, "roiboxlist": 86, "roicircl": 87, "roicirclelist": 88, "roidefinit": 89, "root": 8, "rotat": 3, "rotationaxi": 90, "run": [4, 16, 18], "scale": 3, "scanresult": 91, "scanresultimagesinn": 92, "search": 3, "select": 3, "semant": [15, 28], "server": 14, "servic": 16, "set": 16, "setuptool": 31, "shell": 3, "side": 3, "sigma_m": 3, "slot": 14, "smartnic": 7, "smooth": 3, "snr": 8, "socket": 15, "softwar": [4, 24, 25, 30], "space": 3, "spec": 20, "specif": 21, "sphere": 3, "split": 15, "spot": [3, 8], "spotfindingset": 93, "sqrt": 3, "squar": 8, "stack": 11, "stage": 3, "standarddetectorgeometri": 94, "start": [1, 16, 31], "start_post": 40, "statisit": 8, "statist": 3, "statistics_calibration_get": 40, "statistics_data_collection_get": 40, "statistics_get": 40, "status_get": 40, "still": 3, "stream": 15, "strong": 3, "strongli": 10, "structur": 18, "subtract": 3, "summat": [3, 8], "support": 5, "switch": [11, 14], "synthesi": 7, "sysf": 12, "system": [23, 24], "systemat": 3, "tcp": 15, "tcpframehead": 15, "tcpset": 95, "term": 19, "test": [3, 16, 26, 31], "theta": 3, "three": 3, "threshold": 8, "tiff": 18, "tighten": 3, "toler": 3, "tool": 27, "transceiv": 11, "transmiss": 15, "treatment": 3, "trigger_post": 40, "two": 3, "type": [15, 40, 71], "u55c": 4, "ubuntu": 23, "uncertainti": 3, "unit": 3, "unitcel": 96, "unknown": 3, "up": 16, "usag": [18, 31], "user": [1, 22], "vd": 18, "vector": 3, "verif": 4, "version": [10, 18, 28], "version_get": 40, "vertic": 6, "viewer": 4, "vivado": 7, "wait_till_done_post": 40, "wait_until_running_post": 40, "web": [4, 29], "when": 7, "width": 3, "wilson": 3, "writer": [4, 15], "xd": 25, "xfel_event_code_get": 40, "xfel_pulse_id_get": 40, "xilinx": 7, "yield": 3, "your": 19, "zero": 15, "zeromq": 15, "zeromqmetadataset": 97, "zeromqpreviewset": 98, "zeromqset": 99, "zeta": 3, "\u03c3": 3}}) \ No newline at end of file