Merge: Some clean-up of CC merge mask + add unit cell handling in IndexAndRefine

This commit is contained in:
2026-05-17 14:32:39 +02:00
parent 25d3f660be
commit 1bf70dcae7
5 changed files with 31 additions and 20 deletions
+13 -10
View File
@@ -20,7 +20,8 @@ IndexAndRefine::IndexAndRefine(const DiffractionExperiment &x, IndexerThreadPool
rotation_indexer = std::make_unique<RotationIndexer>(x, *indexer);
reflections.resize(x.GetImageNum());
mosaicity.resize(x.GetImageNum(), NAN);
merge_mask.resize(x.GetImageNum(), 0);
scale_cc.resize(x.GetImageNum(), 0);
unit_cells.resize(x.GetImageNum());
}
IndexAndRefine::IndexingOutcome IndexAndRefine::DetermineLatticeAndSymmetryRotation(DataMessage &msg) {
@@ -256,12 +257,13 @@ void IndexAndRefine::ProcessImage(DataMessage &msg,
if (experiment.GetIndexingSettings().GetGeomRefinementAlgorithm() != GeomRefinementAlgorithmEnum::None)
RefineGeometryIfNeeded(msg, outcome);
if (!outcome.lattice_candidate)
if (!outcome.lattice_candidate.has_value())
return;
if (!AnalyzeIndexing(msg, outcome.experiment, *outcome.lattice_candidate))
return;
unit_cells[msg.number] = outcome.lattice_candidate->GetUnitCell();
msg.lattice_type = outcome.symmetry;
if (spot_finding_settings.quick_integration)
@@ -289,10 +291,7 @@ void IndexAndRefine::ScaleImage(DataMessage &msg) {
msg.image_scale_factor = scaling_result.G;
msg.image_scale_mosaicity = scaling_result.mos;
msg.image_scale_cc = scaling_result.cc;
if (scaling_result.cc >= experiment.GetScalingSettings().GetMinCCForImage())
merge_mask[msg.number] = 1;
else
merge_mask[msg.number] = 0;
scale_cc[msg.number] = scaling_result.cc;
auto scaling_end_time = std::chrono::steady_clock::now();
msg.image_scale_time_s = std::chrono::duration<float>(scaling_end_time - scaling_start_time).count();
@@ -301,15 +300,19 @@ void IndexAndRefine::ScaleImage(DataMessage &msg) {
ScalingResult IndexAndRefine::ScaleAllImages(const std::vector<MergedReflection> &reference, size_t nthreads) {
ScaleOnTheFly scaling(experiment, reference);
auto result = scaling.Scale(reflections, mosaicity, nthreads);
merge_mask = CalcMergeMask(experiment, result);
scale_cc = result.image_cc;
return result;
}
MergeResult IndexAndRefine::Merge(bool calc_statistics, bool apply_cc_limit) const {
MergeResult out;
const auto& mask = apply_cc_limit ? merge_mask : std::vector<uint8_t>{};
out.merged = MergeAll(experiment, reflections, mask);
std::vector<uint8_t> merge_mask(reflections.size(), 1);
if (apply_cc_limit)
CalcMergeMask(experiment, scale_cc, merge_mask);
out.merged = MergeAll(experiment, reflections, merge_mask);
if (calc_statistics)
out.statistics = MergeStats(experiment, out.merged, reflections, mask);
out.statistics = MergeStats(experiment, out.merged, reflections, merge_mask);
return out;
}