rugnux: Bruker SFRM frames are planned as sweeps too

With the SFRM reader and the sweep planner on one branch, an .sfrm frame names its sweep as any other
frame file does: several runs of SFRM frames are several sweeps (one per file-name template), read with
the SFRM reader for their rotation and wavelength, and their unlisted neighbours named.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HVeDQqN9qRD57vnShzTC37
This commit is contained in:
leonarski_fandClaude Opus 5.5 committed 2026-10-28 21:48:27 +01:00
1 parent e19eb9942f
commit e839cd08c7
3 files changed
+10 -4

No files matched your search

+1 -1
View File
@@ -99,7 +99,7 @@ indexing rate reported per master as well. Such masters must share the detector,
distance and beam centre. Several inputs must be one format; any `--mode` other than `mx`, and
following a broker, take one.
Several rotation sweeps are told apart from the files: one sweep per CBF/marCCD/SMV file-name
Several rotation sweeps are told apart from the files: one sweep per CBF/marCCD/SMV/SFRM file-name
template (the name with its frame number taken out - any frame of a sweep names the whole sweep, so
`rugnux a_*.cbf` is the one sweep `a`), one per rotation master. Only the inputs given are processed;
other sweeps beside them are named in the log. A mix of rotation and stills masters is refused, and
+1 -1
View File
@@ -8,7 +8,7 @@
#include <vector>
// The rotation sweeps a rugnux command line names, decided from the files in the order given:
// - frame files (CBF, marCCD, SMV): one sweep per file-name template - the name with its last run of
// - frame files (CBF, marCCD, SMV, Bruker SFRM): one sweep per file-name template - the name with its last run of
// digits, the frame number, taken out. Any frame of a sweep names the whole sweep, so several frames
// of one template are one sweep;
// - masters: one sweep per rotation master. Several stills masters stay one stills run, as before, and
+8 -2
View File
@@ -3844,7 +3844,8 @@ int RugnuxCli::Run() {
RugnuxInputDescription d;
if (!crystfel_geometry.empty())
d.foreign = true;
else if (JFJochCBFReader::CanRead(f) || JFJochMarCCDReader::CanRead(f) || JFJochSMVReader::CanRead(f))
else if (JFJochCBFReader::CanRead(f) || JFJochMarCCDReader::CanRead(f) || JFJochSMVReader::CanRead(f)
|| JFJochSFRMReader::CanRead(f))
d.frame_template = RugnuxFrameTemplate(f);
else
d.foreign = JFJochXFELReader::CanReadPanelTable(f) || JFJochXFELReader::CanReadCXI(f)
@@ -3868,6 +3869,11 @@ int RugnuxCli::Run() {
r.ReadFiles(f);
return r.GetDataset();
}
if (JFJochSFRMReader::CanRead(f)) {
JFJochSFRMReader r;
r.ReadFiles(f);
return r.GetDataset();
}
JFJochHDF5Reader r;
r.ReadFile(f);
return r.GetDataset();
@@ -3908,7 +3914,7 @@ int RugnuxCli::Run() {
for (size_t k = 0; k < plan.sweeps.size(); k++)
logger.Info("Sweep {}: {}", k + 1, plan.sweeps[k].label);
for (const auto &s: RugnuxSiblingSweeps(plan, {".cbf", ".img", ".mccd", ".osc"}))
for (const auto &s: RugnuxSiblingSweeps(plan, {".cbf", ".img", ".mccd", ".osc", ".sfrm"}))
logger.Info("Also beside these inputs, not given and so not processed: {}", s);
if (start_image != 0 || end_image >= 0) {
logger.Error("-s / -e select images of one sweep; with several sweeps give each sweep's frames instead");