// SPDX-FileCopyrightText: 2025 Filip Leonarski, Paul Scherrer Institute // SPDX-License-Identifier: GPL-3.0-only #pragma once #include #include #include "../common/DiffractionSpot.h" #include "../common/DiffractionExperiment.h" #include "bragg_prediction/BraggPrediction.h" #include "indexing/IndexerThreadPool.h" #include "lattice_search/LatticeSearch.h" #include "scale_merge/Merge.h" #include "RotationIndexer.h" #include "RotationParameters.h" #include "scale_merge/ScaleOnTheFly.h" #include "scale_merge/ScalingResult.h" class IndexAndRefine { const bool index_ice_rings; const DiffractionExperiment& experiment; const DiffractionGeometry geom_; std::optional indexed_lattice; std::optional axis_; IndexerThreadPool *indexer_; std::unique_ptr rotation_indexer; RotationParameters rotation_parameters; struct IndexingOutcome { std::optional lattice_candidate; DiffractionExperiment experiment; LatticeMessage symmetry{ .centering = 'P', .niggli_class = 0, .crystal_system = gemmi::CrystalSystem::Triclinic }; bool beam_center_updated = false; explicit IndexingOutcome(const DiffractionExperiment& experiment_ref) : experiment(experiment_ref) {} }; mutable std::mutex reflections_mutex; std::vector> reflections; std::vector mosaicity; std::vector scale_cc; std::vector > unit_cells; IndexingOutcome DetermineLatticeAndSymmetryRotation(DataMessage &msg); IndexingOutcome DetermineLatticeAndSymmetry(DataMessage &msg); void RefineGeometryIfNeeded(DataMessage &msg, IndexingOutcome &outcome); void QuickPredictAndIntegrate(DataMessage &msg, const SpotFindingSettings &spot_finding_settings, const CompressedImage &image, BraggPrediction &prediction, const IndexingOutcome &outcome); std::unique_ptr scaling_engine; void ScaleImage(DataMessage &msg); public: IndexAndRefine(const DiffractionExperiment &x, IndexerThreadPool *indexer); void ProcessImage(DataMessage &msg, const SpotFindingSettings &settings, const CompressedImage &image, BraggPrediction &prediction); IndexAndRefine& ReferenceIntensities(std::vector &reference); ScalingResult ScaleAllImages(const std::vector &reference, size_t nthreads = 0); std::optional Finalize(); std::optional GetConsensusUnitCell() const; // Not thread safe, need to be run after processing is all done const std::vector> &GetReflections() const; std::vector> &GetReflections(); const std::vector &GetImageCC() const; const std::vector > &GetUnitCells() const; };