// SPDX-FileCopyrightText: 2025 Filip Leonarski, Paul Scherrer Institute // SPDX-License-Identifier: GPL-3.0-only #include #include #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 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(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 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(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)); }