Files
Jungfraujoch/image_analysis/MXAnalysisAfterFPGA.cpp
Filip Leonarski e0ddbfa644
Some checks failed
Build Packages / build:rpm (ubuntu2404_nocuda) (push) Failing after 9m36s
Build Packages / build:rpm (rocky8_nocuda) (push) Failing after 10m41s
Build Packages / Generate python client (push) Successful in 35s
Build Packages / build:rpm (ubuntu2204_nocuda) (push) Failing after 11m31s
Build Packages / Build documentation (push) Successful in 57s
Build Packages / Create release (push) Has been skipped
Build Packages / build:rpm (rocky9_nocuda) (push) Failing after 12m18s
Build Packages / build:rpm (rocky8_sls9) (push) Successful in 13m4s
Build Packages / build:rpm (ubuntu2204) (push) Successful in 12m58s
Build Packages / build:rpm (rocky8) (push) Successful in 13m3s
Build Packages / build:rpm (rocky9) (push) Successful in 13m18s
Build Packages / build:rpm (ubuntu2404) (push) Successful in 7m42s
Build Packages / Unit tests (push) Successful in 53m14s
IndexAndRefine: Use rotation method prediction for reflections
2026-01-30 16:16:17 +01:00

98 lines
3.2 KiB
C++

// SPDX-FileCopyrightText: 2024 Filip Leonarski, Paul Scherrer Institute <filip.leonarski@psi.ch>
// SPDX-License-Identifier: GPL-3.0-only
#include "MXAnalysisAfterFPGA.h"
#include "spot_finding/DetModuleSpotFinder_cpu.h"
#include "../common/CUDAWrapper.h"
#include "spot_finding/SpotUtils.h"
#include "bragg_prediction/BraggPredictionFactory.h"
double stddev(const std::vector<float> &v) {
if (v.size() <= 1)
return 0.0;
double mean = 0.0f;
for (const auto &i: v)
mean += i;
mean /= v.size();
double stddev = 0.0f;
for (const auto &i: v)
stddev += (i - mean) * (i - mean);
return sqrt(stddev / (v.size() - 1));
}
MXAnalysisAfterFPGA::MXAnalysisAfterFPGA(const DiffractionExperiment &in_experiment, IndexAndRefine &indexer)
: experiment(in_experiment),
indexer(indexer),
prediction(CreateBraggPrediction(experiment.IsRotationIndexing())) {
if (experiment.IsSpotFindingEnabled())
find_spots = true;
}
void MXAnalysisAfterFPGA::ReadFromFPGA(const DeviceOutput *output, const SpotFindingSettings &settings, size_t module_number) {
if (!find_spots || !settings.enable)
return;
StrongPixelSet strong_pixel_set;
strong_pixel_set.ReadFPGAOutput(experiment, *output);
strong_pixel_set.FindSpots(experiment, settings, spots, module_number);
}
void MXAnalysisAfterFPGA::ReadFromCPU(DeviceOutput *output, const SpotFindingSettings &settings, size_t module_number) {
std::unique_lock ul(read_from_cpu_mutex);
if (!find_spots)
return;
std::vector<float> d_map(RAW_MODULE_SIZE);
experiment.CalcSpotFinderResolutionMap(d_map.data(), module_number);
arr_mean.resize(RAW_MODULE_SIZE);
arr_sttdev.resize(RAW_MODULE_SIZE);
arr_valid_count.resize(RAW_MODULE_SIZE);
arr_strong_pixel.resize(RAW_MODULE_SIZE);
if (experiment.GetByteDepthImage() == 2)
FindSpots(*output,
settings,
d_map.data(),
arr_mean.data(),
arr_sttdev.data(),
arr_valid_count.data(),
arr_strong_pixel.data());
else if (experiment.GetByteDepthImage() == 4)
FindSpots<int32_t>(*output,
settings,
d_map.data(),
arr_mean.data(),
arr_sttdev.data(),
arr_valid_count.data(),
arr_strong_pixel.data());
else if (experiment.GetByteDepthImage() == 1)
FindSpots<int8_t>(*output,
settings,
d_map.data(),
arr_mean.data(),
arr_sttdev.data(),
arr_valid_count.data(),
arr_strong_pixel.data());
ReadFromFPGA(output, settings, module_number);
}
void MXAnalysisAfterFPGA::Process(DataMessage &message, const SpotFindingSettings& spot_finding_settings) {
if (!find_spots)
return;
SpotAnalyze(experiment, spot_finding_settings, spots, message);
if (spot_finding_settings.indexing)
indexer.ProcessImage(message, spot_finding_settings, message.image, *prediction);
spots.clear();
}