// SPDX-FileCopyrightText: 2025 Filip Leonarski, Paul Scherrer Institute // SPDX-License-Identifier: GPL-3.0-only #pragma once #include #include "../../common/UnitCell.h" #include "../../common/SpotToSave.h" #include "RingOptimizer.h" struct RingClusters { std::vector spots; float R_obs; int ring_idx = -1; }; struct FindCircleCenterResult { int64_t total_votes; int64_t votes_for_beam_center; float x; float y; }; FindCircleCenterResult FindCircleCenter(const std::vector &v, int64_t width = 4000, int64_t height = 4000, int64_t max_spots = 500); std::vector> ClusterSpotsIntoRings(const std::vector& r, float eps = 1.5, int minPts = 5); std::vector AnalyzeClusters(const std::vector& r, const std::vector> &clusters); std::vector CalculateXtalRings(const UnitCell &cell, int hkl_max = 6); std::vector CalculateCubicXtalRings( float a, int hkl_max = 4); float GuessDetectorDistance(const DiffractionGeometry& geom, float ring_radius_pxl, float d_A); std::vector GuessInitialGeometry(DiffractionGeometry &geom, const std::vector &v, float calibrant_a_A); void GuessGeometry(DiffractionGeometry &geom, const std::vector &v, const UnitCell &calibrant); void OptimizeGeometry(DiffractionGeometry &geom, const std::vector &v, const UnitCell &calibrant);