On the LysozymeJet5 serial stills the default Gaussian profile-fit integrator (ProfileIntegrate2D) + reference scaling matched or beat whole-PixelRefine on every per-shell CC1/2 (overall 95.7% vs 91.9%), ISa (1.6 vs 1.2) and R-meas (98.5% vs 175%), with CCref a tie -- so PixelRefine has no remaining advantage. Reference-based per-image scaling is integrator-agnostic (IndexAndRefine::ReferenceIntensities builds a ScaleOnTheFly(experiment, reference) applied to any integrator's output), so the reference-dataset feature (CCref + reference scaling) is kept. Delete image_analysis/pixel_refinement/, GeomRefinementAlgorithmEnum:: PixelRefine and its gates, BraggIntegrationSettings::ProfileMultiplier (PixelRefine-only; R1 is shared and kept), and the -r pixelrefine / --profile-multiplier CLI. The inherited lessons (mean background, de-biased variance, tight-profile-loses / centroid floor, R-refinement futile) are folded into NEXTGEN_INTEGRATOR.md. NOTE: this transiently breaks the viewer build -- the committed viewer still references the removed enum and ProfileMultiplier. It is fixed in the next commit (the viewer feature work), held separate while the viewer UI is being tested. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
56 lines
3.0 KiB
C++
56 lines
3.0 KiB
C++
// SPDX-FileCopyrightText: 2025 Filip Leonarski, Paul Scherrer Institute <filip.leonarski@psi.ch>
|
|
// SPDX-License-Identifier: GPL-3.0-only
|
|
|
|
#pragma once
|
|
|
|
#include <optional>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
#include "../common/Reflection.h"
|
|
#include "../common/UnitCell.h"
|
|
|
|
// A column an MTZ offers as reference intensities/structure factors (type 'J' mean intensity or
|
|
// 'F' amplitude). Surfaced so the caller (CLI flag / viewer combo) can pick which one to scale
|
|
// against and report the choice, rather than the loader silently guessing.
|
|
struct ReferenceMtzColumn {
|
|
std::string label;
|
|
char type = '\0'; // 'J' = mean intensity, 'F' = structure-factor amplitude
|
|
};
|
|
|
|
// Reference reflections loaded from an MTZ, plus the metadata a user needs to judge whether the
|
|
// reference matches the data being scaled: which column was used, the cell / space group it was
|
|
// recorded in, its resolution range and reflection count.
|
|
struct ReferenceMtzData {
|
|
std::vector<MergedReflection> reflections; // h,k,l,I,d set (sigma stays NaN)
|
|
std::optional<UnitCell> cell;
|
|
std::optional<int> space_group_number;
|
|
std::string space_group_name; // Hermann-Mauguin short symbol, for display
|
|
std::string point_group; // point-group symbol, for the consistency check
|
|
std::string used_column;
|
|
char used_column_type = '\0';
|
|
bool squared = false; // an 'F' column was squared to an intensity
|
|
bool default_column = true; // column was auto-selected, not user-specified
|
|
std::vector<ReferenceMtzColumn> candidate_columns;
|
|
double d_min = 0.0;
|
|
double d_max = 0.0;
|
|
};
|
|
|
|
// Load reference reflections from an MTZ. With no column requested the smart default is used:
|
|
// a calculated structure factor F-model (squared to an intensity), else a merged/observed
|
|
// intensity column (IMEAN/I/IOBS/...), else any mean-intensity (J) column - this also lets
|
|
// reference-based scaling be self-seeded from the data's own previous merge. A requested column overrides
|
|
// the default (an 'F'-type column is squared, a 'J'-type used directly). Throws if the requested
|
|
// column is missing or no usable column exists.
|
|
ReferenceMtzData LoadReferenceMtz(const std::string& path,
|
|
const std::optional<std::string>& column = std::nullopt);
|
|
|
|
// Compare a loaded reference against the data it will scale. Returns an empty string when they are
|
|
// consistent (or when the data cell / space group is unknown, so nothing can be said); otherwise a
|
|
// one-line, human-readable description of the mismatch to warn the user about. Reference intensities
|
|
// keyed in a different point group or cell do not correspond to the data, so this is the check that
|
|
// makes reference-based scaling and CCref trustworthy.
|
|
std::string ReferenceConsistencyWarning(const ReferenceMtzData& reference,
|
|
const std::optional<UnitCell>& data_cell,
|
|
std::optional<int> data_space_group_number);
|