From 87a9a0b745fcb4ce3fca20942b1d40ca9d85c1cb Mon Sep 17 00:00:00 2001 From: Filip Leonarski Date: Sat, 29 Nov 2025 14:07:24 +0100 Subject: [PATCH] SpotAnalyze: Extract spot analysis function into a dedicated --- image_analysis/SpotAnalyze.cpp | 23 ++--------------- image_analysis/spot_finding/SpotUtils.cpp | 30 ++++++++++++++++++++++- image_analysis/spot_finding/SpotUtils.h | 3 +++ 3 files changed, 34 insertions(+), 22 deletions(-) diff --git a/image_analysis/SpotAnalyze.cpp b/image_analysis/SpotAnalyze.cpp index d3fd817e..ea71fb6e 100644 --- a/image_analysis/SpotAnalyze.cpp +++ b/image_analysis/SpotAnalyze.cpp @@ -18,27 +18,9 @@ void SpotAnalyze(const DiffractionExperiment &experiment, BraggPrediction &prediction, IndexerThreadPool *indexer, DataMessage &output) { - std::vector spots_out; - auto geom = experiment.GetDiffractionGeometry(); - for (const auto &spot: spots) - spots_out.push_back(spot.Export(geom)); - if (spot_finding_settings.high_res_gap_Q_recipA.has_value()) - FilterSpuriousHighResolutionSpots(spots_out, spot_finding_settings.high_res_gap_Q_recipA.value()); - - if (experiment.GetDatasetSettings().IsDetectIceRings() && spot_finding_settings.ice_ring_width_Q_recipA > 0.0f) - MarkIceRings(spots_out, spot_finding_settings.ice_ring_width_Q_recipA); - - CountSpots(output, spots_out, spot_finding_settings.cutoff_spot_count_low_res); - - GenerateSpotPlot(output, spot_finding_settings.high_resolution_limit); - - output.resolution_estimate = GetResolution(spots_out); - - FilterSpotsByCount(spots_out, experiment.GetMaxSpotCount()); - - output.spots = spots_out; + SpotAnalyze(experiment, spot_finding_settings, spots, output); if ((indexer != nullptr) && spot_finding_settings.indexing) { std::vector recip; @@ -49,8 +31,7 @@ void SpotAnalyze(const DiffractionExperiment &experiment, recip.push_back(i.ReciprocalCoord(geom)); } - auto latt_f = indexer->Run(experiment, recip); - auto indexer_result = latt_f.get(); + auto indexer_result = indexer->Run(experiment, recip).get(); output.indexing_time_s = indexer_result.indexing_time_s; if (indexer_result.lattice.empty()) diff --git a/image_analysis/spot_finding/SpotUtils.cpp b/image_analysis/spot_finding/SpotUtils.cpp index 48ee0e86..ad1fb119 100644 --- a/image_analysis/spot_finding/SpotUtils.cpp +++ b/image_analysis/spot_finding/SpotUtils.cpp @@ -50,7 +50,7 @@ void FilterSpotsByCount(std::vector &input, int64_t count) { } void FilterSpuriousHighResolutionSpots(std::vector &spots, float threshold) { - std::ranges::sort(spots, [] (SpotToSave &a, SpotToSave &b) { + std::ranges::sort(spots, [](SpotToSave &a, SpotToSave &b) { return a.d_A > b.d_A; }); @@ -125,3 +125,31 @@ void GenerateSpotPlot(DataMessage &msg, float d_min_A) { msg.spot_plot_intensity = result; msg.spot_plot_count = count; } + +void SpotAnalyze(const DiffractionExperiment &experiment, + const SpotFindingSettings &spot_finding_settings, + const std::vector &spots, + DataMessage &output) { + auto geom = experiment.GetDiffractionGeometry(); + + std::vector spots_out; + + for (const auto &spot: spots) + spots_out.push_back(spot.Export(geom)); + + if (spot_finding_settings.high_res_gap_Q_recipA.has_value()) + FilterSpuriousHighResolutionSpots(spots_out, spot_finding_settings.high_res_gap_Q_recipA.value()); + + if (experiment.GetDatasetSettings().IsDetectIceRings() && spot_finding_settings.ice_ring_width_Q_recipA > 0.0f) + MarkIceRings(spots_out, spot_finding_settings.ice_ring_width_Q_recipA); + + CountSpots(output, spots_out, spot_finding_settings.cutoff_spot_count_low_res); + + GenerateSpotPlot(output, spot_finding_settings.high_resolution_limit); + + output.resolution_estimate = GetResolution(spots_out); + + FilterSpotsByCount(spots_out, experiment.GetMaxSpotCount()); + + output.spots = spots_out; +} diff --git a/image_analysis/spot_finding/SpotUtils.h b/image_analysis/spot_finding/SpotUtils.h index bfe880d5..e07c7e5c 100644 --- a/image_analysis/spot_finding/SpotUtils.h +++ b/image_analysis/spot_finding/SpotUtils.h @@ -28,4 +28,7 @@ void FilterSpuriousHighResolutionSpots(std::vector &spots, float thr // For 20 spots or more - take the 95% percentile best high resolution spot std::optional GetResolution(const std::vector &spots); +void SpotAnalyze(const DiffractionExperiment &experiment, const SpotFindingSettings &settings, + const std::vector &spots, DataMessage &message); + #endif //JFJOCH_SPOTANALYSIS_H