// SPDX-FileCopyrightText: 2025 Filip Leonarski, Paul Scherrer Institute // SPDX-License-Identifier: GPL-3.0-only #pragma once #include enum class IndexingAlgorithmEnum {FFBIDX, FFT, FFTW, Auto, None}; enum class GeomRefinementAlgorithmEnum {None, OrientationOnly, BeamCenter, PixelRefine}; class IndexingSettings { IndexingAlgorithmEnum algorithm; int64_t fft_num_vectors = 16*1024; float fft_max_unit_cell_A = 500.0; float fft_min_unit_cell_A = 10.0; float fft_max_angle_deg = 150.0; float fft_min_angle_deg = 30.0; float fft_high_resolution_A = 2.0; float indexing_tolerance = 0.1; float max_angle_from_ewald_deg = 2.0; float unit_cell_dist_tolerance_vs_reference = 0.05; // relative static constexpr float unit_cell_angle_tolerance_deg = 5.0; // degree int64_t indexing_threads = 4; int64_t viable_cell_min_spots = 9; int64_t max_extra_lattices = 2; bool blocking_behavior = true; bool index_ice_rings = false; bool enable_rotation_indexing = false; float rotation_indexing_min_angular_range_deg = 20.0; float rotation_indexing_angular_stride_deg = 0.5; GeomRefinementAlgorithmEnum refinement = GeomRefinementAlgorithmEnum::BeamCenter; public: IndexingSettings(); IndexingSettings& ViableCellMinSpots(int64_t input); IndexingSettings& Algorithm(IndexingAlgorithmEnum input); IndexingSettings& FFT_MaxUnitCell_A(float input); IndexingSettings& FFT_MinUnitCell_A(float input); IndexingSettings& FFT_MaxAngle_deg(float input); IndexingSettings& FFT_MinAngle_deg(float input); IndexingSettings& FFT_NumVectors(int64_t input); IndexingSettings& FFT_HighResolution_A(float input); IndexingSettings& Tolerance(float input); IndexingSettings& IndexingThreads(int64_t input); IndexingSettings& UnitCellDistTolerance(float input); IndexingSettings& GeomRefinementAlgorithm(GeomRefinementAlgorithmEnum input); IndexingSettings& IndexIceRings(bool input); IndexingSettings& RotationIndexing(bool input); IndexingSettings& RotationIndexingMinAngularRange_deg(float input); IndexingSettings& RotationIndexingAngularStride_deg(float input); IndexingSettings& BlockingBehavior(bool input); IndexingSettings& MaxExtraLattices(int64_t input); [[nodiscard]] int64_t GetViableCellMinSpots() const; [[nodiscard]] IndexingAlgorithmEnum GetAlgorithm() const; [[nodiscard]] GeomRefinementAlgorithmEnum GetGeomRefinementAlgorithm() const; [[nodiscard]] float GetFFT_MaxUnitCell_A() const; [[nodiscard]] float GetFFT_MinUnitCell_A() const; [[nodiscard]] int64_t GetFFT_NumVectors() const; [[nodiscard]] float GetFFT_HighResolution_A() const; [[nodiscard]] float GetTolerance() const; [[nodiscard]] float GetFFT_MinAngle_deg() const; [[nodiscard]] float GetFFT_MaxAngle_deg() const; [[nodiscard]] int64_t GetIndexingThreads() const; [[nodiscard]] float GetUnitCellDistTolerance() const; [[nodiscard]] float GetUnitCellAngleTolerance_deg() const; [[nodiscard]] bool GetIndexIceRings() const; [[nodiscard]] bool GetRotationIndexing() const; [[nodiscard]] float GetRotationIndexingMinAngularRange_deg() const; [[nodiscard]] float GetRotationIndexingAngularStride_deg() const; [[nodiscard]] bool GetBlockingBehavior() const; [[nodiscard]] int64_t GetMaxExtraLattices() const; };