55 lines
1.9 KiB
C++
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
|
|
}
|