Unify still processing on one --force-still flag; scaling follows rotation indexing

Fold the two overlapping knobs into one. Rotation-vs-stills is now a single decision
(IsRotationIndexing() = goniometer && rotation-indexing) that drives BOTH indexing and
scaling/merging - there is no independent scaling-model switch:

- ScalingSettings: drop combine_3d and force_still_processing (and Combine3D/GetCombine3D,
  ForceStillProcessing/GetForceStillProcessing). The scaling stage reads
  experiment.IsRotationIndexing() instead - rotation indexing implies RotationScaleMerge,
  no rotation indexing implies per-image ScaleOnTheFly.
- jfjoch_process: merge --process-as-stills and --force-still-processing into one
  --force-still (turns rotation processing off entirely: still indexing + still scaling).
  The rotation-specific scaling defaults (scale-fulls, smooth-G, capture uncertainty,
  outlier rejection) now key on rotation_indexing.
- jfjoch_scale: replace -P fixed|rot3d with --force-still; rotation is auto-detected from the
  goniometer (RotationIndexing set accordingly) so it matches jfjoch_process.
- jfjoch_viewer: the "process as stills" toggle already sets RotationIndexing; drop the now
  redundant Combine3D/ForceStillProcessing calls.

Rotation path unchanged (lyso 16.4/99.6%/87.3%); --force-still routes to ScaleOnTheFly; the
-R + --force-still conflict still errors. CUDA + non-CUDA + viewer all build.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-03 12:20:45 +02:00
co-authored by Claude Opus 4.8
parent b4d3d40cd8
commit 7d5fb15413
7 changed files with 41 additions and 90 deletions
+1 -1
View File
@@ -440,7 +440,7 @@ ProcessResult JFJochProcess::Run(JFJochProcessObserver *observer) {
// (forced) mosaicity is handled by the recompute. It does NOT support external-reference scaling,
// B-factor refinement, an absorption surface, or wedge refinement - reject those combinations.
const auto &rot_ss = experiment_.GetScalingSettings();
const bool is_rotation = rot_ss.GetCombine3D(); // set for rotation data unless force-still
const bool is_rotation = experiment_.IsRotationIndexing(); // rotation indexing -> rotation scaling/merge
std::optional<RotationScaleMerge> rsm;
if (is_rotation) {
if (!config_.reference_data.empty() || rot_ss.GetRefineB() || rot_ss.GetAbsorptionIter() > 0