v1.0.0-rc.91
This commit is contained in:
@@ -0,0 +1,99 @@
|
||||
// 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 "SpotAnalyze.h"
|
||||
#include "bragg_integration/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)
|
||||
: experiment(in_experiment) {
|
||||
if (experiment.IsSpotFindingEnabled())
|
||||
find_spots = true;
|
||||
|
||||
prediction = CreateBraggPrediction();
|
||||
}
|
||||
|
||||
MXAnalysisAfterFPGA &MXAnalysisAfterFPGA::SetIndexer(IndexerThreadPool *input) {
|
||||
indexer = input;
|
||||
return *this;
|
||||
}
|
||||
|
||||
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.image, *prediction, indexer, message);
|
||||
|
||||
spots.clear();
|
||||
}
|
||||
Reference in New Issue
Block a user