// SPDX-FileCopyrightText: 2025 Filip Leonarski, Paul Scherrer Institute // SPDX-License-Identifier: GPL-3.0-only #include #include "../image_analysis/indexing/IndexerFactory.h" #include "../common/Logger.h" TEST_CASE("FFTIndexer") { Logger logger("FFTIndexer"); UnitCell uc(39,45,78,90,90,90); CrystalLattice cl(uc); DiffractionExperiment experiment; IndexingSettings settings; settings.Algorithm(IndexingAlgorithmEnum::FFT) .FFT_MaxUnitCell_A(250.0).FFT_HighResolution_A(2 * M_PI / 3.0); experiment.ImportIndexingSettings(settings).SetUnitCell(uc); #ifndef JFJOCH_USE_CUDA REQUIRE(experiment.GetIndexingAlgorithm() == IndexingAlgorithmEnum::None); #else REQUIRE(experiment.GetIndexingAlgorithm() == IndexingAlgorithmEnum::FFT); REQUIRE(experiment.GetIndexingSettings().GetTolerance() == Catch::Approx(0.1f)); std::unique_ptr indexer = CreateIndexer(experiment); REQUIRE(indexer); std::vector vec; for (int h = -2; h < 10; h++) { for (int k = -5; k < 10; k++) { for (int l = -3; l < 10; l++) { vec.push_back(h * cl.Astar() + k * cl.Bstar() + l * cl.Cstar()); } } } logger.Info("Spots {}", vec.size()); auto start = std::chrono::high_resolution_clock::now(); auto result = indexer->Run(vec, vec.size()); auto end = std::chrono::high_resolution_clock::now(); REQUIRE(result.size() == 1); auto uc_out = result[0].GetUnitCell(); CHECK(uc_out.a == Catch::Approx(uc.a));; CHECK(uc_out.b == Catch::Approx(uc.b));; CHECK(uc_out.c == Catch::Approx(uc.c));; CHECK(uc_out.alpha == Catch::Approx(uc.alpha));; CHECK(uc_out.beta == Catch::Approx(uc.beta));; CHECK(uc_out.gamma == Catch::Approx(uc.gamma));; logger.Info("Time: {} ms", std::chrono::duration_cast(end - start).count()); #endif }