Viewer: the crystal in the settings panel is the crystal the run uses

"Analyze dataset" cleared the stored cell and space group unless "Use the stored
unit cell / space group" was ticked, and that checkbox defaulted off. But the
settings panel writes the user's own cell and space group onto the experiment, so
a cell typed into the panel was discarded too - while the checkbox label said
"stored", implying it came from the file.

It also contradicted the dialog next to it: "Refine geometry (stills)" is offered
and default-ticked precisely because a cell is present, and the run then removed
that cell. The default dialog state on a stills dataset with a known cell ran the
bundle adjustment with nothing to anchor on and dropped indexing off ffbidx, which
needs a cell, onto de-novo FFT.

Drop the checkbox and take the crystal from the panel, which already has exactly
the right semantics: "Unit cell known" ticked writes the cell and group, unticked
clears both, and a space group of 0 means none. So ticked = -C/-S, unticked =
bare rugnux, and what a run will use is always what is on screen. That also keeps
the copied command line honest, since RugnuxCommandLine emits -C/-S from the same
experiment. The panel is refilled from the file when one is opened, so a finished
job's _process.h5 becoming the active snapshot now shows its group and can be
cleared, instead of silently pinning every later run to it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-31 11:50:54 +02:00
co-authored by Claude Opus 5
parent dd30061005
commit 76395539fd
2 changed files with 7 additions and 28 deletions
+7 -25
View File
@@ -224,20 +224,6 @@ int JFJochProcessingJobsWindow::askJob(const ReprocessingInputs &inputs, JobSpec
"axis from the whole sweep, then re-integrates at the refined geometry. The refined pass is the "
"canonical <prefix> output; the header-geometry pass is kept as <prefix>_01. Default on; a no-op for stills.");
// De-novo by default, exactly as `rugnux` with no -C / -S: it discards any cell and space group
// stored in the input file so neither indexing nor the space-group search is biased by them. This is
// offered only when there IS something stored - most often because a previous run of this very
// dataset wrote it, which is how a run that once ended in P1 used to pin every later run to P1.
const bool has_stored_crystal = inputs.experiment.GetUnitCell().has_value()
|| inputs.experiment.GetSpaceGroupNumber().has_value();
auto *keep_crystal = new QCheckBox("Use the stored unit cell / space group", &dlg);
keep_crystal->setChecked(false);
keep_crystal->setEnabled(has_stored_crystal && !azint);
keep_crystal->setToolTip(
"Off (default): the cell and space group are determined from the data, discarding whatever the "
"file carries - the same as running rugnux with no -C / -S. On: index and merge with the stored "
"values instead, which is what you want for serial stills with a known cell.");
auto *form = new QFormLayout;
form->addRow("Start image", start_image);
form->addRow("End image", end_image);
@@ -248,8 +234,6 @@ int JFJochProcessingJobsWindow::askJob(const ReprocessingInputs &inputs, JobSpec
form->addRow(scaling);
form->addRow(refineRow);
form->addRow(postrefine);
if (has_stored_crystal && !azint)
form->addRow(keep_crystal);
int result = 0;
auto *run = new QPushButton("Run locally", &dlg);
@@ -279,7 +263,6 @@ int JFJochProcessingJobsWindow::askJob(const ReprocessingInputs &inputs, JobSpec
spec.save_h5 = save_h5->isChecked();
spec.save_merged = save_merged->isEnabled() && save_merged->isChecked();
spec.prefix = prefix->text();
spec.keep_stored_crystal = keep_crystal->isEnabled() && keep_crystal->isChecked();
spec.scaling = scaling->isEnabled() && scaling->isChecked();
spec.refine_geometry = refine_geometry->isEnabled() && refine_geometry->isChecked();
spec.refine_geometry_frames = refine_frames->value();
@@ -336,17 +319,16 @@ void JFJochProcessingJobsWindow::newJob(bool azint) {
// The experiment carries the panel's indexing settings — including RotationIndexing set by "Process
// as stills" (needed so IndexAndRefine builds a rotation indexer). On top of that it gets exactly
// the defaults `rugnux` with no options would apply, so the two front ends agree: the analysis
// policy the panel does not expose (the polarization factor), the rotation scaling defaults, and
// the de-novo starting point.
// policy the panel does not expose (the polarization factor) and the rotation scaling defaults.
//
// Clearing the stored crystal is the important one. Without it the space group carried in the file
// is left on the experiment, Rugnux skips the whole search (it only searches when none is set) and
// reports that group straight back — and since a finished job's own _process.h5 becomes the active
// snapshot, a run that ended in P1 pinned every later run to P1 as well.
// The cell and space group come from the settings panel and nowhere else: with "Unit cell known"
// ticked they are indexed and merged with, unticked the panel clears both and the run determines
// them from the data (-C / -S versus bare `rugnux`). The panel is filled from the file when one is
// opened, so what a run will use is always the crystal shown on screen - including after a finished
// job's _process.h5 becomes the active snapshot, where a run that ended in P1 shows P1 and can be
// cleared, rather than silently pinning every later run to it.
DiffractionExperiment experiment = inputs.experiment;
ApplyRugnuxExperimentDefaults(experiment);
if (!spec.keep_stored_crystal)
ClearStoredCrystal(experiment);
if (spec.mode == ProcessMode::FullAnalysis && spec.scaling) {
ScalingSettings scaling = RugnuxDefaultScalingSettings(config.rotation_indexing);
// Keep what the settings dock does expose; take the rest from the shared defaults.
@@ -85,9 +85,6 @@ private:
bool refine_geometry = false; // stills-only global geometry bundle-adjust (needs a known cell)
int refine_geometry_frames = 200; // strong indexed frames fed to that bundle adjustment
bool rotation_postrefine = true; // rotation-only two-pass geometry post-refine (default on)
// Process with the unit cell / space group the input file carries, instead of determining them
// de novo. Off by default, which is what `rugnux` with no -C/-S does.
bool keep_stored_crystal = false;
};
// Returns 0 = cancel, 1 = run locally, 2 = copy command line; fills spec from the dialog.