// SPDX-FileCopyrightText: 2025 Filip Leonarski, Paul Scherrer Institute // SPDX-License-Identifier: GPL-3.0-only #pragma once #include "Indexer.h" #include "../../common/UnitCell.h" #include "../../common/Coord.h" #include "../../common/CrystalLattice.h" #include "../../common/IndexingSettings.h" #include "FFTResult.h" #define FFT_MAX_SPOTS (64*1024) class FFTIndexer : public Indexer { protected: const float min_length_A; const float max_length_A; const float min_angle_deg; const float max_angle_deg; const int nDirections; float histogram_spacing; int64_t histogram_size; std::vector direction_vectors; size_t input_size; size_t output_size; // Per-direction best peaks (host) std::vector result_fft; void SetupUnitCell(const std::optional &cell) override; std::vector ReduceResults(const std::vector &results) const; std::vector FilterFFTResults() const; void SetupDirectionVectors(); virtual void ExecuteFFT(const std::vector &coord, size_t nspots) = 0; public: explicit FFTIndexer(const IndexingSettings& settings); ~FFTIndexer() override = default; std::vector RunInternal(const std::vector &coord, size_t nspots) override; };