Merge: Use random number generator with fixed seed to assign half-datasets. Also make it per image, not per reflection
Build Packages / build:rpm (ubuntu2404_nocuda) (push) Successful in 13m40s
Build Packages / build:rpm (rocky8_nocuda) (push) Successful in 15m13s
Build Packages / build:rpm (ubuntu2204_nocuda) (push) Successful in 15m37s
Build Packages / build:rpm (rocky9_nocuda) (push) Successful in 16m6s
Build Packages / build:rpm (rocky8_sls9) (push) Successful in 16m3s
Build Packages / build:rpm (rocky9_sls9) (push) Successful in 16m52s
Build Packages / build:rpm (rocky8) (push) Successful in 10m24s
Build Packages / XDS test (durin plugin) (push) Successful in 10m4s
Build Packages / build:rpm (ubuntu2204) (push) Successful in 12m40s
Build Packages / build:rpm (rocky9) (push) Successful in 13m33s
Build Packages / Generate python client (push) Successful in 31s
Build Packages / Create release (push) Skipped
Build Packages / build:rpm (ubuntu2404) (push) Successful in 12m49s
Build Packages / Build documentation (push) Successful in 48s
Build Packages / DIALS test (push) Successful in 15m15s
Build Packages / XDS test (JFJoch plugin) (push) Successful in 7m19s
Build Packages / XDS test (neggia plugin) (push) Successful in 5m32s
Build Packages / Unit tests (push) Failing after 58m36s

This commit is contained in:
2026-05-17 11:01:00 +02:00
parent 674ac4afa2
commit 3e9c9c3f9b
+12 -3
View File
@@ -6,6 +6,7 @@
#include <algorithm>
#include <cmath>
#include <limits>
#include <random>
#include <unordered_map>
#include "../../common/ResolutionShells.h"
@@ -25,7 +26,13 @@ std::vector<uint8_t> CalcMergeMask(const DiffractionExperiment &x,
std::vector<MergedReflection> MergeAll(const DiffractionExperiment &x,
const std::vector<std::vector<Reflection> > &reflections,
const std::vector<uint8_t> &merge_mask) {
if (!merge_mask.empty() && merge_mask.size() < reflections.size())
// To select images for half-datasets to calculate CC1/2, I use a random number generator with a fixed seed.
// This makes sure that images are selected randomly, but in a fully reproducible manner (at least for the same binary)
std::mt19937 rng(123456789u);
std::bernoulli_distribution half_dist(0.5);
if (!merge_mask.empty() && merge_mask.size() != reflections.size())
throw JFJochException(JFJochExceptionCategory::InputParameterInvalid, "Merge mask size mismatch");
auto scaling_settings = x.GetScalingSettings();
@@ -48,8 +55,11 @@ std::vector<MergedReflection> MergeAll(const DiffractionExperiment &x,
std::unordered_map<uint64_t, Accum> acc;
for (int i = 0; i < reflections.size(); ++i) {
const int half = half_dist(rng);
if (!merge_mask.empty() && merge_mask[i] == 0)
continue;
if (reflections[i].empty())
continue;
for (const auto &r: reflections[i]) {
if (r.image_scale_corr <= 0.0 || !std::isfinite(r.image_scale_corr))
continue;
@@ -80,7 +90,6 @@ std::vector<MergedReflection> MergeAll(const DiffractionExperiment &x,
it->second.sum_wI += wI;
it->second.sum_w += w;
const int half = ((it->second.n_half[0] + it->second.n_half[1]) % 2 == 0) ? 0 : 1;
it->second.sum_wI_half[half] += wI;
it->second.sum_w_half[half] += w;
it->second.n_half[half]++;
@@ -125,7 +134,7 @@ MergeStatistics MergeStats(const DiffractionExperiment &x,
const std::vector<std::vector<Reflection> > &reflections,
const std::vector<uint8_t> &merge_mask) {
if (!merge_mask.empty() && merge_mask.size() < reflections.size())
if (!merge_mask.empty() && merge_mask.size() != reflections.size())
throw JFJochException(JFJochExceptionCategory::InputParameterInvalid, "Merge mask size mismatch");
constexpr int n_shells = 10;