diff --git a/image_analysis/scale_merge/RotationScaleMerge.cpp b/image_analysis/scale_merge/RotationScaleMerge.cpp index aa891fca2..e5e0e8d24 100644 --- a/image_analysis/scale_merge/RotationScaleMerge.cpp +++ b/image_analysis/scale_merge/RotationScaleMerge.cpp @@ -1206,14 +1206,14 @@ void RotationScaleMerge::BuildInRangeObservations(std::unique_ptr &ke ingest_zeta.reset(new float[n_keep]); if (x.GetBandwidthFWHM().value_or(0.0f) > 0.0f) ingest_d.reset(new float[n_keep]); - std::atomic n_resolved{0}; + std::atomic n_resolved{0}, n_negative_var{0}; partials.clear(); partials.resize(n_keep); corr_ingested.resize(n_keep); ParallelFor(n_frames, nthreads, [&](int o) { int32_t src = src_start[o]; int32_t at = frame_start[o]; - int64_t resolved = 0; + int64_t resolved = 0, negative_var = 0; for (const auto &r : partials_out[o].reflections) { if (!keep[src]) { ++src; continue; } ++src; @@ -1228,7 +1228,8 @@ void RotationScaleMerge::BuildInRangeObservations(std::unique_ptr &ke obs.frame = o; obs.corr = r.image_scale_corr; finite_ok[at] = (std::isfinite(r.I) && std::isfinite(obs.prescaling_corr) && obs.prescaling_corr != 0.0f - && std::isfinite(r.sigma) && r.sigma > 0.0f) ? 1 : 0; + && std::isfinite(r.sigma) && r.sigma > 0.0f && !(r.var_bkg < 0.0f)) ? 1 : 0; + negative_var += r.var_bkg < 0.0f; // refused as in AcceptReflection ingest_delta_phi[at] = SmoothedDeltaPhi(sg, o, r.h, r.k, r.l, r.delta_phi_deg, resolved); ingest_partiality[at] = r.partiality; ingest_image_number[at] = r.image_number; @@ -1238,6 +1239,7 @@ void RotationScaleMerge::BuildInRangeObservations(std::unique_ptr &ke ++at; } n_resolved += resolved; + n_negative_var += negative_var; }); n_partials_obs = n_keep; @@ -1245,6 +1247,9 @@ void RotationScaleMerge::BuildInRangeObservations(std::unique_ptr &ke logger->Info("Smoothed per-frame geometry over +-{} frames (chosen by cross-validation); " "recomputed delta_phi for {} of {} partials", sg.half, n_resolved.load(), n_keep); + if (n_negative_var > 0) + logger->Info("RotationScaleMerge: {} observations left out - their background variance is below zero", + n_negative_var.load()); if (n_keep < n_obs) logger->Info("RotationScaleMerge: dropped {} of {} observations ({} of {} distinct hkl) outside the " "requested resolution range - nothing downstream could have merged them",