Files
Jungfraujoch/tests/FFTIndexerTest.cpp
2025-06-10 18:14:04 +02:00

55 lines
1.9 KiB
C++

// SPDX-FileCopyrightText: 2025 Filip Leonarski, Paul Scherrer Institute <filip.leonarski@psi.ch>
// SPDX-License-Identifier: GPL-3.0-only
#include <catch2/catch_all.hpp>
#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> indexer = CreateIndexer(experiment);
REQUIRE(indexer);
std::vector<Coord> 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<std::chrono::milliseconds>(end - start).count());
#endif
}