v1.0.0.rc-161 (#71)
Build Packages / build:windows:nocuda (push) Successful in 20m4s
Build Packages / Unit tests (push) Skipped
Build Packages / build:viewer-tgz:cpu (push) Successful in 16m5s
Build Packages / build:viewer-tgz:cuda (push) Successful in 17m26s
Build Packages / build:rpm (rocky8_nocuda) (push) Successful in 27m46s
Build Packages / build:rpm (rocky9_nocuda) (push) Successful in 20m17s
Build Packages / build:rpm (ubuntu2204_nocuda) (push) Successful in 26m13s
Build Packages / build:rpm (ubuntu2404_nocuda) (push) Successful in 23m17s
Build Packages / build:rpm (rocky8_sls9) (push) Successful in 28m11s
Build Packages / build:rpm (rocky9_sls9) (push) Successful in 19m30s
Build Packages / build:rpm (rocky8) (push) Successful in 24m34s
Build Packages / build:rpm (rocky9) (push) Successful in 21m30s
Build Packages / build:rpm (ubuntu2204) (push) Successful in 23m33s
Build Packages / build:rpm (ubuntu2404) (push) Successful in 20m18s
Build Packages / DIALS test (push) Successful in 18m23s
Build Packages / XDS test (durin plugin) (push) Successful in 11m30s
Build Packages / XDS test (JFJoch plugin) (push) Successful in 10m16s
Build Packages / XDS test (neggia plugin) (push) Successful in 8m2s
Build Packages / Generate python client (push) Successful in 49s
Build Packages / Build documentation (push) Successful in 1m21s
Build Packages / Create release (push) Skipped
Build Packages / build:windows:cuda (push) Successful in 29m45s

This is an UNSTABLE release. It includes many experimental features, as well as many AI generated fixes. We recommend using rc.152 for production use.

* **rugnux: significantly better quality of results, and faster.** A large rework of integration, scaling, merging, geometry refinement and space-group determination, together with measurements the program previously made no attempt at - the direct beam before indexing, the beam stop, the goniometer rotation scale, and the stretches of a sweep the crystal did not deliver. A rotation dataset typically gains observations at better <I/sigma> and R_meas, and every `mx` and `scale` run writes a `<prefix>_report.txt` results report modelled on XDS's `CORRECT.LP`. Many defaults moved with it: spot detection is self-calibrating, beam-stop detection and rotation geometry post-refinement are on, resolution limits default to as far as the detector reaches, and ice-ring handling engages only where the crystal is measured to have ice.
* **jfjoch_viewer:** the beam-stop shadow, the detector calibration and the beam-centre measurement are reachable from "Analyze dataset"; the settings panel reports how the sample moved and how polarized the beam was; image rendering and interaction are faster.
* **Performance:** bitshuffle+LZ4 images are decoded on the GPU rather than on the host, with the bitshuffle inverse fused into preprocessing so the decompressed frame is never held in device memory.
* **Broker, writer, packaging and build:** image-slot lifetime and locking fixes, per-image datasets sized by the images actually written, the Debian/Ubuntu broker package renamed to `jfjoch`, and `image_analysis` compiling under MSVC again.

**Breaking change to the rugnux command line:**
* `--azint-only` and `--scale` are **removed**, replaced by `--mode azint` and `--mode scale`; the full pipeline is `--mode mx` and remains the default. A script passing the old flags now fails with the list of valid modes rather than silently running the wrong one.
* `-t`/`--stride` is **refused on rotation data**: skipping frames cuts every reflection's rocking curve, so the combined fulls and their partiality would be measured over frames the sweep never recorded. Select a contiguous range with `-s`/`-e` instead. `--mode azint` and `--force-still` still take a stride.

**Breaking changes to OpenAPI** - regenerate the client (`jfjoch-client` 1.0.0-rc.161, `frontend/src/client`) or read the affected fields as optional:
* `image_scale_b` is removed from the `plot_type` enum, so a client requesting that plot now gets an error rather than a curve.
* `azim_int_settings.high_q_recipA`, `spot_finding_settings.high_resolution_limit` and `spot_finding_settings.low_resolution_limit` are no longer `required`. All three mean "no limit at that end" when unset and are omitted from the response instead of carrying a placeholder value, which raises in a client generated from an rc.160-or-earlier spec. A value of 0 is still accepted and means the same thing.

**Breaking changes to the stored formats** - a consumer reading these fields must treat them as optional:
* The per-image image-scale B factor is no longer computed, so `/entry/MX/imageScaleBFactor` is absent from newly written HDF5 files and the corresponding key is absent from the CBOR DataMessage and END blocks. Files written by rc.160 and earlier still contain it and still open; nothing in the pipeline reads it any more.
* `_reflns.jfjoch_diffrn_ISa` now carries the whole-range `1/sqrt(a*b)` that XDS's ISa denotes, and the error-model `a` and `b` are reported in XDS's convention; the strong-reflection asymptote moves to `_reflns.jfjoch_diffrn_ISa_asymptotic`. **A file written by an earlier version carries the asymptote under the plain `ISa` name.**

Reviewed-on: #71
Co-authored-by: Filip Leonarski <filip.leonarski@psi.ch>
This commit was merged in pull request #71.
This commit is contained in:
2026-08-13 17:03:10 +02:00
committed by leonarski_f
parent 67dca388bd
commit 538f3504d3
457 changed files with 24381 additions and 4603 deletions
+4 -4
View File
@@ -22,8 +22,8 @@ communicate through network calls or other mechanisms.
This Python package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project:
- API version: 1.0.0-rc.160
- Package version: 1.0.0-rc.160
- API version: 1.0.0-rc.161
- Package version: 1.0.0-rc.161
- Generator version: 7.20.0
- Build package: org.openapitools.codegen.languages.PythonClientCodegen
@@ -37,9 +37,9 @@ Python 3.9+
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
pip install git+https://gitea.psi.ch/mx/jungfraujoch.git
```
(you may need to run `pip` with root permission: `sudo pip install git+https://git.psi.ch/jungfraujoch/jungfraujoch.git`)
(you may need to run `pip` with root permission: `sudo pip install git+https://gitea.psi.ch/mx/jungfraujoch.git`)
Then import the package:
```python
+1 -1
View File
@@ -7,7 +7,7 @@ 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** | |
**high_q_recip_a** | **float** | Upper q limit of the azimuthal integration [1/Angstrom]. Optional: if omitted, the integration (and the adaptive spot detection that shares these q bins) extends to the highest q the detector reaches. | [optional]
**low_q_recip_a** | **float** | |
**q_spacing** | **float** | |
**azimuthal_bins** | **int** | Numer of azimuthal (phi) bins; 1 &#x3D; standard 1D azimuthal integration | [optional] [default to 1]
@@ -0,0 +1,31 @@
# BraggIntegrationSettings
Settings for Bragg spot integration
## Properties
Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**integration_model** | [**IntegrationModel**](IntegrationModel.md) | | [default to IntegrationModel.PROFILEGAUSSIAN]
**max_hkl** | **int** | How far the Bragg predictor walks the lattice: reflections with |h|,|k|,|l| above this are never predicted. An axis is truncated once a/d_min exceeds it, so a long axis - or a short one taken to high resolution - loses its outermost reflections. The cost grows as the cube (2n+1)^3 of candidates per image, which is why online keeps a fixed, predictable value instead of taking it from whichever crystal is mounted. Omitting the field selects the default above; it is never interpreted as \&quot;choose per crystal\&quot;. The offline tools (rugnux, viewer) do derive it from the refined cell when it is left unset there, but that is their own default and is not reachable through this API. | [optional] [default to 100]
## Example
```python
from jfjoch_client.models.bragg_integration_settings import BraggIntegrationSettings
# TODO update the JSON string below
json = "{}"
# create an instance of BraggIntegrationSettings from a JSON string
bragg_integration_settings_instance = BraggIntegrationSettings.from_json(json)
# print the JSON string representation of the object
print(BraggIntegrationSettings.to_json())
# convert the object into a dict
bragg_integration_settings_dict = bragg_integration_settings_instance.to_dict()
# create an instance of BraggIntegrationSettings from a dict
bragg_integration_settings_from_dict = BraggIntegrationSettings.from_dict(bragg_integration_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)
-16
View File
@@ -1,16 +0,0 @@
# 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)
@@ -1,35 +0,0 @@
# 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)
@@ -1,36 +0,0 @@
# 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)
-30
View File
@@ -1,30 +0,0 @@
# 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)
-30
View File
@@ -1,30 +0,0 @@
# 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)
-35
View File
@@ -1,35 +0,0 @@
# 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)
@@ -1,36 +0,0 @@
# 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)
@@ -0,0 +1,15 @@
# IntegrationModel
Bragg spot integration model. ProfileGaussian - profile fit with a measured-width Gaussian (Kabsch-style), the default; more accurate intensities than box summation. ProfileEmpirical - profile fit with a per-resolution-shell empirical profile learned from strong spots. BoxSum - classical uniform box summation minus a ring-mean background; the simpler, faster fallback.
## Enum
* `PROFILEGAUSSIAN` (value: `'ProfileGaussian'`)
* `PROFILEEMPIRICAL` (value: `'ProfileEmpirical'`)
* `BOXSUM` (value: `'BoxSum'`)
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
@@ -1,77 +0,0 @@
# 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)
@@ -1,30 +0,0 @@
# 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)
-48
View File
@@ -1,48 +0,0 @@
# 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)
@@ -1,36 +0,0 @@
# 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)
@@ -11,12 +11,14 @@ Name | Type | Description | Notes
**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** | **float** | High resolution limit for spot finding [Angstrom]. Optional: if omitted, spot finding extends as far as the detector reaches, i.e. the detection is not clipped in resolution. | [optional]
**low_resolution_limit** | **float** | Low resolution limit for spot finding [Angstrom]. Optional: if omitted, spot finding is not clipped at the low-resolution end. A value of 0 is accepted and means the same thing. | [optional]
**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]
**ice_ring_width_q_recip_a** | **float** | Half-width of the ice ring band in q (1/A). Matches the offline default in image_analysis/spot_finding/SpotFindingSettings.h, which was set from a measured ring FWHM of ~0.06; the two must agree or the same data gets a narrower ice band online. | [default to 0.03]
**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]
**adaptive_threshold** | **bool** | Self-calibrating spot detection: replace the fixed photon_count_threshold by a per-resolution-ring threshold derived from each image&#39;s own noise, so the same setting works across datasets without per-dataset tuning. photon_count_threshold is then ignored and false_pixels_per_frame sets the operating point instead. Only available on detectors whose images are analysed in software (the DECTRIS/SIMPLON workflow). The JUNGFRAU and EIGER workflows find spots on the FPGA, which applies its own fixed threshold, so enabling this there is rejected rather than silently ignored. | [optional] [default to False]
**false_pixels_per_frame** | **float** | Operating point of the adaptive threshold: the number of noise pixels tolerated per frame. About 100 suits a multi-megapixel detector. Ignored unless adaptive_threshold is set. | [optional] [default to 100.0]
## Example