77 lines
2.5 KiB
C++
77 lines
2.5 KiB
C++
// SPDX-FileCopyrightText: 2024 Filip Leonarski, Paul Scherrer Institute <filip.leonarski@psi.ch>
|
|
// SPDX-License-Identifier: GPL-3.0-only
|
|
|
|
#include <catch2/catch_all.hpp>
|
|
#include "../writer/HDF5Objects.h"
|
|
#include "../image_analysis/indexing/IndexerFactory.h"
|
|
|
|
inline double round_err(double x) {
|
|
return std::abs(x - std::round(x));
|
|
}
|
|
|
|
#ifdef JFJOCH_USE_CUDA
|
|
|
|
#include <Eigen/Dense>
|
|
|
|
TEST_CASE("FastFeedbackIndexer","[Indexing]") {
|
|
std::vector<Coord> hkl;
|
|
for (int i = 1; i < 7; i++)
|
|
for (int j = 1; j<6; j++)
|
|
for (int k = 1; k < 4; k++)
|
|
hkl.emplace_back(i,j,k);
|
|
|
|
std::vector<UnitCell> cells;
|
|
cells.emplace_back(30,40,50,90,90,90);
|
|
cells.emplace_back(80,80,90,90,90,120);
|
|
cells.emplace_back(40,45,80,90,82.5,90);
|
|
|
|
DiffractionExperiment experiment;
|
|
experiment.SetUnitCell(cells[0]);
|
|
experiment.IndexingAlgorithm(IndexingAlgorithmEnum::FFBIDX);
|
|
|
|
REQUIRE(experiment.GetIndexingAlgorithm() == IndexingAlgorithmEnum::FFBIDX);
|
|
|
|
std::unique_ptr<Indexer> indexer = CreateIndexer(experiment);
|
|
|
|
for (auto &c: cells) {
|
|
CrystalLattice l(c);
|
|
|
|
Eigen::Matrix3f m;
|
|
m << l.Vec0().x, l.Vec0().y, l.Vec0().z,
|
|
l.Vec1().x, l.Vec1().y, l.Vec1().z,
|
|
l.Vec2().x, l.Vec2().y, l.Vec2().z;
|
|
auto m1 = m.transpose().inverse();
|
|
|
|
CrystalLattice recip_l(Coord(m1(0,0), m1(0,1), m1(0,2)),
|
|
Coord(m1(1,0), m1(1,1), m1(1,2)),
|
|
Coord(m1(2,0), m1(2,1), m1(2,2)));
|
|
|
|
std::vector<Coord> recip;
|
|
recip.reserve(hkl.size());
|
|
for (const auto &i: hkl)
|
|
recip.emplace_back(i.x * recip_l.Vec0() + i.y * recip_l.Vec1() + i.z * recip_l.Vec2());
|
|
|
|
experiment.SetUnitCell(c);
|
|
|
|
indexer->Setup(experiment);
|
|
auto ret = indexer->Run(recip, recip.size());
|
|
REQUIRE(!ret.empty());
|
|
|
|
//auto uc = ret[0].GetUnitCell();
|
|
//REQUIRE(c.a == Catch::Approx(uc.a));
|
|
//REQUIRE(c.b == Catch::Approx(uc.b));
|
|
//REQUIRE(c.c == Catch::Approx(uc.c));
|
|
|
|
double err[3] = {0.0, 0.0, 0.0};
|
|
for (const auto &iter: recip) {
|
|
err[0] += round_err(ret[0].Vec0() * iter);
|
|
err[1] += round_err(ret[0].Vec1() * iter);
|
|
err[2] += round_err(ret[0].Vec2() * iter);
|
|
}
|
|
REQUIRE (err[0] < 0.001 * recip.size());
|
|
REQUIRE (err[1] < 0.001 * recip.size());
|
|
REQUIRE (err[2] < 0.001 * recip.size());
|
|
}
|
|
}
|
|
|
|
#endif |