// SPDX-FileCopyrightText: 2024 Filip Leonarski, Paul Scherrer Institute // 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 &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 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(*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(*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(); }