Build Packages / Create release (push) Successful in 16s
Build Packages / build:rugnux:aarch64 (cross) (push) Successful in 8m27s
Build Packages / build:rugnux-tgz (x86_64) (push) Successful in 9m15s
Build Packages / build:viewer-tgz:cpu (push) Successful in 10m11s
Build Packages / build:viewer-tgz:cuda (push) Successful in 12m6s
Build Packages / build:rpm (rocky8_nocuda) (push) Successful in 15m44s
Build Packages / build:rpm (rocky9_nocuda) (push) Successful in 16m1s
Build Packages / build:windows:nocuda (push) Successful in 17m29s
Build Packages / build:windows:cuda (push) Successful in 19m58s
Build Packages / HDF5 consumer tests (DIALS, XDS) (push) Successful in 24m7s
Build Packages / build:rpm (ubuntu2404_nocuda) (push) Successful in 19m8s
Build Packages / build:rugnux:windows (push) Successful in 10m58s
Build Packages / build:rpm (ubuntu2204_nocuda) (push) Successful in 20m46s
Build Packages / Generate python client (push) Successful in 53s
Build Packages / build:rpm (rocky8_sls9) (push) Successful in 20m13s
Build Packages / Build documentation (push) Successful in 1m36s
Build Packages / build:rpm (rocky9_sls9) (push) Successful in 19m57s
Build Packages / build:rpm (rocky8) (push) Successful in 18m7s
Build Packages / build:rpm (rocky9) (push) Successful in 18m54s
Build Packages / build:rpm (ubuntu2204) (push) Successful in 19m32s
Build Packages / build:rpm (ubuntu2404) (push) Successful in 17m30s
Build Packages / Unit tests (push) Successful in 1h39m2s
* Fixed `jfjoch_broker` cancelling every data collection with a CUDA "out of memory" error after long operation: GPU memory no longer leaks with each collection. * Rugnux scales a rotation sweep until the per-frame scales settle instead of for a fixed three rounds, and says so when they did not - merged intensities, and the space group, resolution cut and frame rejection read off them, change accordingly; `--scaling-iterations` is now the cap on that loop (default 100). * Rugnux places every frame of a marCCD, SMV or miniCBF series at the spindle angle its own header states, so a series with missing frames, or with angles written modulo 360, is no longer read at the wrong geometry or refused. * Every rotation run writes two diagnostic files beside its reflections: `<prefix>_detector.jpg`, the detector projection with the pixel mask and the detected beam-stop shadow drawn on it, and `<prefix>_plot.txt`, one row per image. Reviewed-on: #82 Co-authored-by: Filip Leonarski <filip.leonarski@psi.ch>
35 lines
862 B
C++
35 lines
862 B
C++
//
|
|
// Created by leonarski_f on 18.05.2026.
|
|
//
|
|
|
|
#include <cmath>
|
|
|
|
#include "CorrelationCoefficient.h"
|
|
|
|
void CorrelationCoefficient::Add(double x, double y, double w) {
|
|
sum_x += w * x;
|
|
sum_y += w * y;
|
|
sum_x2 += w * x * x;
|
|
sum_y2 += w * y * y;
|
|
sum_xy += w * x * y;
|
|
sum_w += w;
|
|
n_cc++;
|
|
}
|
|
|
|
double CorrelationCoefficient::GetCC() const {
|
|
if (n_cc < 2 || !(sum_w > 0.0))
|
|
return NAN;
|
|
const double n = sum_w;
|
|
const double mean_x = sum_x / n;
|
|
const double mean_y = sum_y / n;
|
|
|
|
const double cov = sum_xy / n - mean_x * mean_y;
|
|
const double var_x = sum_x2 / n - mean_x * mean_x;
|
|
const double var_y = sum_y2 / n - mean_y * mean_y;
|
|
|
|
if (!(var_x > 0.0 && var_y > 0.0))
|
|
return NAN;
|
|
|
|
return cov / std::sqrt(var_x * var_y);
|
|
}
|