diff --git a/broker/OpenAPIConvert.cpp b/broker/OpenAPIConvert.cpp
index a9f7800c8..6527d4b84 100644
--- a/broker/OpenAPIConvert.cpp
+++ b/broker/OpenAPIConvert.cpp
@@ -730,7 +730,8 @@ DatasetSettings Convert(const org::openapitools::server::model::Dataset_settings
ret.SpotFindingEnable(input.isSpotFinding());
ret.MaxSpotCount(input.getMaxSpotCount());
- ret.DetectIceRings(input.isDetectIceRings());
+ if (input.detectIceRingsIsSet())
+ ret.DetectIceRings(input.isDetectIceRings());
if (input.xrayFluorescenceSpectrumIsSet()) {
auto fl = input.getXrayFluorescenceSpectrum();
diff --git a/broker/gen/model/Dataset_settings.h b/broker/gen/model/Dataset_settings.h
index 601df8418..6a91d8d51 100644
--- a/broker/gen/model/Dataset_settings.h
+++ b/broker/gen/model/Dataset_settings.h
@@ -325,7 +325,7 @@ public:
bool maxSpotCountIsSet() const;
void unsetMax_spot_count();
///
- /// Flag spots as ice rings and reduce their effect on indexing
+ /// Flag spots as ice rings and reduce their effect on indexing. Left out, the broker's own spot finding treats no spot as an ice ring, rugnux live decides as a bare `rugnux` would (on for a rotation sweep, off for stills), and the master file carries no `detect_ice_rings`.
///
bool isDetectIceRings() const;
void setDetectIceRings(bool const value);
diff --git a/broker/gen/model/Rugnux_live_status.h b/broker/gen/model/Rugnux_live_status.h
index 1113d4d96..06f4edded 100644
--- a/broker/gen/model/Rugnux_live_status.h
+++ b/broker/gen/model/Rugnux_live_status.h
@@ -162,12 +162,12 @@ public:
bool isaIsSet() const;
void unsetIsa();
///
- /// Answer of the early lattice probe on the first 60 degrees; empty until it answers
+ /// Answer of the early lattice probe on the first 60 degrees; empty until it answers, and the run's own lattice once the run has indexed
///
std::string getProbe() const;
void setProbe(std::string const& value);
///
- /// When the probe answered, since the first image
+ /// When the probe answered (or the run indexed), since the first image
///
double getProbeS() const;
void setProbeS(double const value);
diff --git a/broker/jfjoch_api.yaml b/broker/jfjoch_api.yaml
index 5201be5e1..2a2237417 100644
--- a/broker/jfjoch_api.yaml
+++ b/broker/jfjoch_api.yaml
@@ -671,7 +671,10 @@ components:
description: Maximum number of spots that are saved/used for indexing; spots with highest intensity are selected
detect_ice_rings:
type: boolean
- description: Flag spots as ice rings and reduce their effect on indexing
+ description: |
+ Flag spots as ice rings and reduce their effect on indexing. Left out, the broker's own
+ spot finding treats no spot as an ice ring, rugnux live decides as a bare `rugnux` would (on
+ for a rotation sweep, off for stills), and the master file carries no `detect_ice_rings`.
async_start:
type: boolean
default: false
@@ -3345,11 +3348,11 @@ components:
description: ISa of the error model; absent until the run is over, or where it was not determined
probe:
type: string
- description: Answer of the early lattice probe on the first 60 degrees; empty until it answers
+ description: Answer of the early lattice probe on the first 60 degrees; empty until it answers, and the run's own lattice once the run has indexed
probe_s:
type: number
format: double
- description: When the probe answered, since the first image
+ description: When the probe answered (or the run indexed), since the first image
start_to_first_image_s:
type: number
format: double
diff --git a/common/DatasetSettings.cpp b/common/DatasetSettings.cpp
index aa82553a6..601b5114b 100644
--- a/common/DatasetSettings.cpp
+++ b/common/DatasetSettings.cpp
@@ -30,8 +30,6 @@ DatasetSettings::DatasetSettings() {
poni_rot_3_rad = 0.0f;
max_spot_count = std::min(MAX_SPOT_COUNT, 250);
-
- detect_ice_rings = false;
}
DatasetSettings &DatasetSettings::ImagesPerTrigger(int64_t input) {
@@ -542,6 +540,10 @@ DatasetSettings & DatasetSettings::DetectIceRings(bool input) {
}
bool DatasetSettings::IsDetectIceRings() const {
+ return detect_ice_rings.value_or(false);
+}
+
+std::optional DatasetSettings::GetDetectIceRings() const {
return detect_ice_rings;
}
diff --git a/common/DatasetSettings.h b/common/DatasetSettings.h
index 1d3cd785a..208c521ca 100644
--- a/common/DatasetSettings.h
+++ b/common/DatasetSettings.h
@@ -75,7 +75,9 @@ class DatasetSettings {
bool spot_finding_enable;
int64_t max_spot_count;
- bool detect_ice_rings; // Enable special handling of ice rings
+ // Special handling of ice rings; unset where the user did not ask either way, so that the analysis takes its own
+ // default (rugnux: on for a rotation sweep, off for stills) and the master file carries no detect_ice_rings
+ std::optional detect_ice_rings;
XrayFluorescenceSpectrum fluorescence_spectrum;
std::optional smargon_position;
@@ -186,7 +188,8 @@ public:
bool IsSpotFindingEnabled() const;
int64_t GetMaxSpotCount() const;
- bool IsDetectIceRings() const;
+ bool IsDetectIceRings() const; // false where unset
+ std::optional GetDetectIceRings() const;
const XrayFluorescenceSpectrum &GetFluorescenceSpectrum() const;
std::optional GetSmargonPosition() const;
};
diff --git a/common/DiffractionExperiment.cpp b/common/DiffractionExperiment.cpp
index e97974bdc..d31d4926e 100644
--- a/common/DiffractionExperiment.cpp
+++ b/common/DiffractionExperiment.cpp
@@ -773,7 +773,7 @@ void DiffractionExperiment::FillMessage(StartMessage &message) const {
message.poni_rot2 = dataset.GetPoniRot2_rad();
message.poni_rot3 = dataset.GetPoniRot3_rad();
- message.detect_ice_rings = dataset.IsDetectIceRings();
+ message.detect_ice_rings = dataset.GetDetectIceRings();
message.channels = {"default"};
diff --git a/common/Logger.cpp b/common/Logger.cpp
index e48564d7a..cccee71f4 100644
--- a/common/Logger.cpp
+++ b/common/Logger.cpp
@@ -7,6 +7,7 @@
#include "spdlog/fmt/bin_to_hex.h"
#include