Files
Jungfraujoch/tests/XtalOptimizerTest.cpp
2025-08-27 06:21:10 +02:00

107 lines
3.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 <iostream>
#include "../image_analysis/geom_refinement/XtalOptimizer.h"
#include "../image_analysis/bragg_integration/BraggPrediction.h"
TEST_CASE("XtalOptimizer") {
DiffractionExperiment exp_i;
exp_i.IncidentEnergy_keV(WVL_1A_IN_KEV)
.BeamX_pxl(1000)
.BeamY_pxl(1000)
.PoniRot1_rad(0.01)
.PoniRot2_rad(0.02)
.DetectorDistance_mm(200);
CrystalLattice latt_i(40,40,80,90,90,90);
auto pred = CalcBraggPredictions(exp_i, latt_i,1.5, 0.1);
std::vector<SpotToSave> spots;
for (const auto &[ang, refl]: pred) {
spots.push_back(SpotToSave{
refl.center_x_pxl,
refl.center_y_pxl
});
}
XtalOptimizerData xtal_opt;
xtal_opt.latt = CrystalLattice(40.2,39.4,80.2, 90,91, 89);
xtal_opt.geom.BeamX_pxl(1010).BeamY_pxl(995).DetectorDistance_mm(200)
.PoniRot1_rad(0.01).PoniRot2_rad(0.02);
auto start = std::chrono::high_resolution_clock::now();
XtalOptimizer(xtal_opt, spots, false);
auto end = std::chrono::high_resolution_clock::now();
std::cout << "XtalOptimizer took " << std::chrono::duration_cast<std::chrono::microseconds>(end - start).count()
<< " microseconds" << std::endl;
auto uc_i = latt_i.GetUnitCell();
auto uc_o = xtal_opt.latt.GetUnitCell();
std::cout << "Beam center: " << xtal_opt.geom.GetBeamX_pxl() << " " << xtal_opt.geom.GetBeamY_pxl() << std::endl;
std::cout << "Unit cell: " << uc_o.a << " " << uc_o.b << " " << uc_o.c << std::endl;
CHECK(fabsf(xtal_opt.geom.GetBeamX_pxl() - exp_i.GetBeamX_pxl()) < 0.05);
CHECK(fabsf(xtal_opt.geom.GetBeamY_pxl() - exp_i.GetBeamY_pxl()) < 0.05);
CHECK(fabsf(uc_i.a - uc_o.a) < 0.1);
CHECK(fabsf(uc_i.b - uc_o.b) < 0.1);
CHECK(fabsf(uc_i.c - uc_o.c) < 0.2);
CHECK(fabsf(uc_i.alpha - uc_o.alpha) < 0.1);
CHECK(fabsf(uc_i.beta - uc_o.beta) < 0.1);
CHECK(fabsf(uc_i.gamma - uc_o.gamma) < 0.1);
}
TEST_CASE("XtalOptimizer_tetragonal") {
DiffractionExperiment exp_i;
exp_i.IncidentEnergy_keV(WVL_1A_IN_KEV)
.BeamX_pxl(1000)
.BeamY_pxl(1000)
.PoniRot1_rad(0.01)
.PoniRot2_rad(0.02)
.DetectorDistance_mm(200);
CrystalLattice latt_i(40,40,80,90,90,90);
auto pred = CalcBraggPredictions(exp_i, latt_i,1.5, 0.1);
std::vector<SpotToSave> spots;
for (const auto &[ang, refl]: pred) {
spots.push_back(SpotToSave{
refl.center_x_pxl,
refl.center_y_pxl
});
}
XtalOptimizerData xtal_opt;
xtal_opt.latt = CrystalLattice(40.6,39.3,80.5, 90,91, 89);
xtal_opt.geom.BeamX_pxl(1010).BeamY_pxl(995).DetectorDistance_mm(200)
.PoniRot1_rad(0.01).PoniRot2_rad(0.02);
auto start = std::chrono::high_resolution_clock::now();
XtalOptimizer(xtal_opt, spots, true);
auto end = std::chrono::high_resolution_clock::now();
std::cout << "XtalOptimizer took " << std::chrono::duration_cast<std::chrono::microseconds>(end - start).count()
<< " microseconds" << std::endl;
auto uc_i = latt_i.GetUnitCell();
auto uc_o = xtal_opt.latt.GetUnitCell();
std::cout << "Beam center: " << xtal_opt.geom.GetBeamX_pxl() << " " << xtal_opt.geom.GetBeamY_pxl() << std::endl;
std::cout << "Unit cell: " << uc_o.a << " " << uc_o.b << " " << uc_o.c << std::endl;
CHECK(fabsf(xtal_opt.geom.GetBeamX_pxl() - exp_i.GetBeamX_pxl()) < 0.05);
CHECK(fabsf(xtal_opt.geom.GetBeamY_pxl() - exp_i.GetBeamY_pxl()) < 0.05);
CHECK(fabsf(uc_i.a - uc_o.a) < 0.1);
CHECK(fabsf(uc_i.b - uc_o.b) < 0.1);
CHECK(fabsf(uc_i.c - uc_o.c) < 0.2);
CHECK(uc_o.alpha == Catch::Approx(90.0));
CHECK(uc_o.beta == Catch::Approx(90.0));
CHECK(uc_o.gamma == Catch::Approx(90.0));
}