Files
Jungfraujoch/image_analysis/indexing/FitProfileRadius.cpp
T
leonarski_f 32e91f7287
Build Packages / build:rpm (rocky8_nocuda) (push) Successful in 9m46s
Build Packages / build:rpm (ubuntu2404_nocuda) (push) Successful in 9m52s
Build Packages / build:rpm (ubuntu2204_nocuda) (push) Successful in 10m54s
Build Packages / build:rpm (rocky8_sls9) (push) Successful in 11m35s
Build Packages / build:rpm (rocky9_nocuda) (push) Successful in 11m49s
Build Packages / build:rpm (rocky9_sls9) (push) Successful in 11m9s
Build Packages / build:rpm (rocky8) (push) Successful in 9m57s
Build Packages / build:rpm (ubuntu2204) (push) Successful in 9m53s
Build Packages / build:rpm (rocky9) (push) Successful in 11m18s
Build Packages / Generate python client (push) Successful in 16s
Build Packages / build:rpm (ubuntu2404) (push) Successful in 10m3s
Build Packages / Create release (push) Skipped
Build Packages / Build documentation (push) Successful in 34s
Build Packages / XDS test (durin plugin) (push) Successful in 8m20s
Build Packages / DIALS test (push) Successful in 12m28s
Build Packages / XDS test (JFJoch plugin) (push) Successful in 6m23s
Build Packages / XDS test (neggia plugin) (push) Successful in 5m23s
Build Packages / Unit tests (push) Successful in 54m9s
Minor fixes
2026-06-08 15:56:20 +02:00

52 lines
1.4 KiB
C++

// SPDX-FileCopyrightText: 2025 Filip Leonarski, Paul Scherrer Institute <filip.leonarski@psi.ch>
// SPDX-License-Identifier: GPL-3.0-only
#include "FitProfileRadius.h"
#include <algorithm> // std::nth_element
#include <cmath> // std::fabs
std::optional<float> FitProfileRadius_MAD(const std::vector<SpotToSave>& xs) {
std::vector<float> absx;
absx.reserve(xs.size());
for (const auto &s: xs) {
if (s.indexed)
absx.push_back(std::fabs(s.dist_ewald_sphere));
}
if (absx.empty())
return std::nullopt;
std::nth_element(absx.begin(), absx.begin() + absx.size() / 2, absx.end());
float med;
if (absx.size() % 2 == 1) {
med = absx[absx.size() / 2];
} else {
auto it1 = absx.begin() + (absx.size() / 2 - 1);
auto it2 = absx.begin() + (absx.size() / 2);
float a = *it1;
float b = *it2;
med = 0.5f * (a + b);
}
// Normal consistency factor for MAD
return 1.4826f * med;
}
std::optional<float> FitProfileRadius(const std::vector<SpotToSave>& spots) {
float sum_squares = 0.0f;
int count = 0;
for (const auto &s: spots) {
if (s.indexed) {
sum_squares += s.dist_ewald_sphere * s.dist_ewald_sphere;
count++;
}
}
if (count == 0)
return std::nullopt;
auto std_dev = std::sqrt(sum_squares / count);
return std_dev;
}