75e401f0e5
Build Packages / Unit tests (push) Successful in 1h31m59s
Build Packages / build:rpm (rocky8_nocuda) (push) Successful in 8m43s
Build Packages / build:rpm (rocky9_nocuda) (push) Successful in 10m5s
Build Packages / build:rpm (ubuntu2204_nocuda) (push) Successful in 9m27s
Build Packages / build:rpm (ubuntu2404_nocuda) (push) Successful in 8m56s
Build Packages / build:rpm (rocky8_sls9) (push) Successful in 9m24s
Build Packages / build:rpm (rocky9_sls9) (push) Successful in 10m27s
Build Packages / build:rpm (rocky8) (push) Successful in 9m20s
Build Packages / build:rpm (rocky9) (push) Successful in 10m50s
Build Packages / build:rpm (ubuntu2204) (push) Successful in 9m54s
Build Packages / build:rpm (ubuntu2404) (push) Successful in 8m38s
Build Packages / DIALS test (push) Successful in 12m13s
Build Packages / XDS test (durin plugin) (push) Successful in 7m8s
Build Packages / XDS test (JFJoch plugin) (push) Successful in 7m8s
Build Packages / XDS test (neggia plugin) (push) Successful in 7m50s
Build Packages / Generate python client (push) Successful in 16s
Build Packages / Build documentation (push) Successful in 50s
Build Packages / Create release (push) Skipped
This is an UNSTABLE release. It includes many experimental features, as well as many AI generated fixes. We recommend using rc.152 for production use. * jfjoch_broker: Add EXPERIMENTAL pixelrefine mode for image processing * jfjoch_broker: Allow to load user mask from 8-bit and 16-bit TIFF files * jfjoch_broker: Add ROI calculation in non-FPGA workflow * jfjoch_broker: Fixes to TCP image pusher * jfjoch_broker: Remove NUMA bindings * jfjoch_broker: Improvements to indexing * jfjoch_broker: For PSI EIGER, trimming energies are taken from the detector configuration (now compulsory) instead of hardcoded values * jfjoch_writer: Save ROI definitions and the per-pixel ROI bitmap in the master file; azimuthal ROIs support phi (angular) sectors * jfjoch_viewer: Major redesign with dockable panels and saved layouts, plus on-canvas creation/move/resize of box, circle and azimuthal ROIs * jfjoch_viewer: Run jfjoch_process reprocessing jobs from inside the GUI and overlay per-run results Reviewed-on: #63
52 lines
1.4 KiB
C++
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;
|
|
}
|
|
|