Files
Jungfraujoch/image_analysis/RotationSpotAccumulator.cpp

116 lines
3.0 KiB
C++

//
// Created by jungfrau on 2/4/26.
//
#include "RotationSpotAccumulator.h"
RotationSpot3D::RotationSpot3D(SpotToSave s, float phi_deg, int64_t image) {
x = s.x * s.intensity;
y = s.y * s.intensity;
phi = phi_deg * s.intensity;
intensity = s.intensity;
maxc = s.maxc;
first_image = image;
last_image = image;
}
void RotationSpot3D::Add(const SpotToSave& s, float phi_deg, int64_t image) {
x += s.x * s.intensity;
y += s.y * s.intensity;
phi += phi_deg * s.intensity;
intensity += s.intensity;
maxc = std::max(maxc, s.maxc);
ice_ring = ice_ring || s.ice_ring;
first_image = std::min(first_image, image);
last_image = std::max(last_image, image);
}
float RotationSpot3D::calcX() const {
return x / intensity;
}
float RotationSpot3D::calcY() const {
return y / intensity;
}
float RotationSpot3D::calcPhi() const {
return phi / intensity;
}
float RotationSpot3D::calcI() const {
return intensity;
}
int64_t RotationSpot3D::calcMAXC() const {
return maxc;
}
int64_t RotationSpot3D::getLastImage() const {
return last_image;
}
void RotationSpotAccumulator::AddImage(int64_t image, const std::vector<SpotToSave>& in_spots) {
std::lock_guard<std::mutex> lock(mutex_);
spots[image] = in_spots;
}
std::vector<RotationSpot3D> RotationSpotAccumulator::FinalizeAll() {
std::lock_guard<std::mutex> lock(mutex_);
int64_t image0 = INT64_MIN;
std::vector<RotationSpot3D> completed_;
std::vector<RotationSpot3D> pending_;
for (auto& [image, v]: spots) {
float image_angle = axis_.GetIncrement_deg() * image + axis_.GetWedge_deg() / 2.0f;
std::vector<RotationSpot3D> tmp;
if (image == image0 + 1) {
for (const auto &p: pending_) {
if (p.getLastImage() != image - 1) {
completed_.push_back(p);
} else {
tmp.push_back(p);
}
}
for (const auto &s: v) {
bool matched = false;
for (int i = 0; i < tmp.size(); i++) {
float dist_x = s.x - tmp[i].calcX();
float dist_y = s.y - tmp[i].calcY();
if (std::fabs(dist_x * dist_x + dist_y * dist_y) < config_.xy_tolerance_pxl_sq) {
tmp[i].Add(s, image_angle, image);
matched = true;
break;
}
}
if (!matched)
tmp.emplace_back(s, image_angle, image);
}
} else {
for (const auto &p: pending_)
completed_.push_back(p);
for (const auto &s: v)
tmp.emplace_back(s, image_angle, image);
}
pending_ = tmp;
image0 = image;
}
for (const auto &p: pending_)
completed_.push_back(p);
return completed_;
}