// 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(); wavelength_A = experiment.GetWavelength_A(); spindle_axis = {}; if (const auto goniometer = experiment.GetGoniometer()) spindle_axis = goniometer->GetAxis(); spindle_theta_max_deg = SpindleThetaMax_deg(wavelength_A, experiment.GetDetectorMaxResolution_A()); SetupUnitCell(experiment.GetUnitCell()); } IndexerResult Indexer::Run(const std::vector &coord, bool severity_only) { IndexerResult ret; auto start = std::chrono::steady_clock::now(); std::optional severity; if (severity_only) { severity = RunSeverityOnly(coord); } else { ret.lattice = RunInternal(coord, coord.size()); ret.executed = true; severity = GetSpindleSeverity(); } auto end = std::chrono::steady_clock::now(); std::chrono::duration duration = end - start; ret.indexing_time_s = duration.count(); if (severity) { ret.spindle_blind_fraction = severity->score; ret.spindle_row_length_A = severity->row_length_A; ret.spindle_miss_angle_deg = severity->miss_angle_deg; } return ret; }