// SPDX-FileCopyrightText: 2025 Filip Leonarski, Paul Scherrer Institute // SPDX-License-Identifier: GPL-3.0-only #include "BraggPrediction.h" BraggPrediction::BraggPrediction(const DiffractionExperiment &experiment, const CrystalLattice &lattice, float high_res_A, float angle_dist_cutoff) { auto geom = experiment.GetDiffractionGeometry(); auto det_width_pxl = static_cast(experiment.GetXPixelsNum()); auto det_height_pxl = static_cast(experiment.GetYPixelsNum()); Coord Astar = lattice.Astar(); Coord Bstar = lattice.Bstar(); Coord Cstar = lattice.Cstar(); for (int h = -max_hkl; h < max_hkl; h++) { for (int k = -max_hkl; k < max_hkl; k++) { for (int l = -max_hkl; l < max_hkl; l++) { Coord recip = Astar * static_cast(h) + Bstar * static_cast(k) + Cstar * static_cast(l); float d = 1.0f / recip.Length(); if (d < high_res_A) continue; float dist_ewald_sphere = geom.DistFromEwaldSphere(recip); float angle_ewald_sphere = geom.AngleFromEwaldSphere(recip); if (!std::isfinite(angle_ewald_sphere) || angle_ewald_sphere > angle_dist_cutoff ) continue; auto [x,y] = geom.RecipToDector(recip); if ((x < 0) || (x >= det_width_pxl) || (y < 0) || (y >= det_height_pxl)) continue; reflections.insert(std::make_pair(angle_ewald_sphere, Reflection{ .h = h, .k = k, .l = l, .center_x_pxl = x, .center_y_pxl = y, .radius_ewald_sphere = dist_ewald_sphere, .angle_ewald_sphere = angle_ewald_sphere, .d = d })); } } } } const std::multimap &BraggPrediction::GetReflections() const { return reflections; } std::vector BraggPrediction::GetReflections(float max_radius) const { std::vector result; auto it = reflections.upper_bound(max_radius); for (auto iter = reflections.begin(); iter != it; ++iter) result.push_back(iter->second); return result; }