107 lines
3.9 KiB
C++
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));
|
|
}
|