// SPDX-FileCopyrightText: 2025 Filip Leonarski, Paul Scherrer Institute // SPDX-License-Identifier: GPL-3.0-only #include "Indexer.h" void Indexer::Setup(const DiffractionExperiment& experiment) { geom = experiment.GetDiffractionGeometry(); indexing_tolerance = experiment.GetIndexingSettings().GetTolerance(); dist_tolerance_vs_reference = experiment.GetIndexingSettings().GetUnitCellDistTolerance(); viable_cell_min_spots = experiment.GetIndexingSettings().GetViableCellMinSpots(); index_ice_rings = experiment.GetIndexingSettings().GetIndexIceRings(); SetupUnitCell(experiment.GetUnitCell()); } std::optional Indexer::Run(DataMessage &message) { auto start = std::chrono::high_resolution_clock::now(); std::vector recip; recip.reserve(message.spots.size()); for (const auto &i: message.spots) { if (index_ice_rings || !i.ice_ring) recip.push_back(i.ReciprocalCoord(geom)); } auto ret = Run(recip, recip.size()); auto end = std::chrono::high_resolution_clock::now(); std::chrono::duration duration = end - start; message.indexing_time_s = duration.count(); if (ret.empty()) return {}; return ret[0]; }