// SPDX-FileCopyrightText: 2025 Filip Leonarski, Paul Scherrer Institute // SPDX-License-Identifier: GPL-3.0-only #ifndef JFJOCH_ROTATIONINDEXER_H #define JFJOCH_ROTATIONINDEXER_H #include #include #include "../common/DiffractionSpot.h" #include "../common/DiffractionExperiment.h" #include "indexing/IndexerThreadPool.h" #include "lattice_search/LatticeSearch.h" // RotationIndexer works as following: // 1. First accumulates spot results from rotation images (only images within a certain stride are included) // 2. When a minimum number of images is reached (at least 10 images AND at least 10 deg), indexing is attempted // 3. If indexing is successful - lattice is provided that is used by subsequent images // 4. If indexing is not-successful - accumulation procedure is continued struct RotationIndexerResult { CrystalLattice lattice; LatticeSearchResult search_result; DiffractionGeometry geom; }; class RotationIndexer { mutable std::mutex m; const DiffractionExperiment& experiment; constexpr static int64_t max_spots = 10000; constexpr static int64_t min_images_for_indexing = 10; const bool index_ice_rings; bool indexing_tried = false; std::vector v_; std::vector coords_; std::optional axis_; const DiffractionGeometry geom_; DiffractionGeometry updated_geom_; LatticeSearchResult search_result_; IndexerThreadPool &indexer_; int64_t last_accumulated_image = -1; int64_t accumulated_images = 0; int64_t image_stride; int64_t first_image_to_try_indexing; std::optional indexed_lattice; void TryIndex(); public: RotationIndexer(const DiffractionExperiment& x, IndexerThreadPool& indexer); void SetLattice(const CrystalLattice &lattice); std::optional ProcessImage(int64_t image, const std::vector& spots); std::optional GetLattice(); }; #endif //JFJOCH_ROTATIONINDEXER_H