v1.0.0-rc.41

This commit is contained in:
2025-06-10 18:14:04 +02:00
parent 72cdbd04a5
commit 41a3e671f4
244 changed files with 3064 additions and 705 deletions

View File

@@ -49,18 +49,23 @@ TEST_CASE("RecipToDetector_3", "[LinearAlgebra][Coord]") {
REQUIRE(geom.DistFromEwaldSphere(recip) < 4e-4);
}
TEST_CASE("Phi","") {
TEST_CASE("DiffractionGeometry_Phi","") {
DiffractionExperiment x(DetJF4M());
x.DetectorDistance_mm(75).IncidentEnergy_keV(WVL_1A_IN_KEV);
x.BeamX_pxl(1000).BeamY_pxl(1000);
DiffractionGeometry geom = x.GetDiffractionGeometry();
REQUIRE(geom.Phi(2000, 1000) == Catch::Approx(0.0));
REQUIRE(geom.Phi(1000, 2000) == Catch::Approx(M_PI_2));
REQUIRE(geom.Phi(2000, 2000) == Catch::Approx(M_PI_4));
CHECK(geom.Phi(2000, 1000) * (180.0 / M_PI) == Catch::Approx(0.0));
CHECK(geom.Phi(2000, 0) * (180.0 / M_PI) == Catch::Approx(45.0f));
CHECK(geom.Phi(1000, 0) * (180.0 / M_PI) == Catch::Approx(90.0f));
CHECK(geom.Phi(0, 0) * (180.0 / M_PI) == Catch::Approx(135.0f));
CHECK(geom.Phi(0, 1000) * (180.0 / M_PI) == Catch::Approx(180.0f));
CHECK(geom.Phi(1000, 2000) * (180.0 / M_PI) == Catch::Approx(270.f));
CHECK(geom.Phi(2000, 2000) * (180.0 / M_PI) == Catch::Approx(315.0f));
}
TEST_CASE("Cos2Theta","") {
TEST_CASE("DiffractionGeometry_Cos2Theta","") {
DiffractionExperiment x(DetJF4M());
x.DetectorDistance_mm(75).IncidentEnergy_keV(WVL_1A_IN_KEV);
x.BeamX_pxl(1000).BeamY_pxl(1000);
@@ -69,10 +74,10 @@ TEST_CASE("Cos2Theta","") {
// det distance == 1000 pixel
// theta = 30 deg
// tan(2 * theta) = sqrt(3)
REQUIRE(geom.CosTwoTheta(1000, 1000 * (1.0 + sqrt(3))) == Catch::Approx(0.5f));
REQUIRE(cosf(geom.TwoTheta(1000, 1000 * (1.0 + sqrt(3)))) == Catch::Approx(0.5f));
}
TEST_CASE("PxlToRes","") {
TEST_CASE("DiffractionGeometry_PxlToRes","") {
DiffractionExperiment x(DetJF4M());
x.DetectorDistance_mm(75).IncidentEnergy_keV(WVL_1A_IN_KEV);
DiffractionGeometry geom = x.GetDiffractionGeometry();
@@ -90,7 +95,7 @@ TEST_CASE("PxlToRes","") {
}
TEST_CASE("ResToPxl","") {
TEST_CASE("DiffractionGeometry_ResToPxl","") {
DiffractionExperiment x(DetJF4M());
x.DetectorDistance_mm(75).IncidentEnergy_keV(WVL_1A_IN_KEV);
DiffractionGeometry geom = x.GetDiffractionGeometry();
@@ -106,7 +111,7 @@ TEST_CASE("ResToPxl","") {
REQUIRE(geom.ResToPxl(2.0) == Catch::Approx(1000 * 0.55328333517));
}
TEST_CASE("SolidAngleCorrection","") {
TEST_CASE("DiffractionGeometry_SolidAngleCorrection","") {
DiffractionExperiment x;
x.IncidentEnergy_keV(WVL_1A_IN_KEV);
x.BeamX_pxl(1000).BeamY_pxl(1000).DetectorDistance_mm(75);
@@ -121,7 +126,7 @@ TEST_CASE("SolidAngleCorrection","") {
REQUIRE(geom.CalcAzIntSolidAngleCorr(1000 * (1.0 + sqrt(3)), 1000) == Catch::Approx(0.5f * 0.5f * 0.5f));
}
TEST_CASE("PolarizationCorrection","") {
TEST_CASE("DiffractionGeometry_PolarizationCorrection","") {
DiffractionExperiment x;
x.IncidentEnergy_keV(WVL_1A_IN_KEV);
x.BeamX_pxl(1000).BeamY_pxl(1000).DetectorDistance_mm(75);
@@ -144,3 +149,60 @@ TEST_CASE("PolarizationCorrection","") {
REQUIRE(geom.CalcAzIntPolarizationCorr(1000 * (1.0 + sqrt(3)), 1000, 1) == Catch::Approx(0.5f * 0.5f));
REQUIRE(geom.CalcAzIntPolarizationCorr(1000 * (1.0 - sqrt(3)), 1000, 1) == Catch::Approx(0.5f * 0.5f));
}
TEST_CASE("DiffractionGeometry_AngleFromEwaldSphere") {
DiffractionGeometry geom;
geom.Wavelength_A(1.0);
// Center of Ewald sphere == (0,0,-1)
// Points on Ewald sphere
REQUIRE(geom.AngleFromEwaldSphere(Coord(1,0,-1)) == 0.0f);
REQUIRE(geom.AngleFromEwaldSphere(Coord(1.0f/sqrtf(2.0f),1.0f/sqrtf(2.0f),-1)) == 0.0f);
REQUIRE(geom.AngleFromEwaldSphere(Coord(1,0,1)) == Catch::Approx(90.0f));
REQUIRE(geom.AngleFromEwaldSphere(Coord(-sqrtf(2.0f),0,0)) == Catch::Approx(45.0f));
REQUIRE(geom.AngleFromEwaldSphere(Coord(-sqrtf(3.0f),0,0)) == Catch::Approx(60.0f));
float cos_1deg = cosf(1.0f * M_PI / 180.0f);
float sin_1deg = sinf(1.0f * M_PI / 180.0f);
REQUIRE(fabsf(geom.AngleFromEwaldSphere((Coord(cos_1deg - sin_1deg, 0, -(cos_1deg + sin_1deg)))) - 1.0f) < 0.0005);
// Cannot be rotated to fit into the Ewald sphere
REQUIRE(isnanf(geom.AngleFromEwaldSphere(Coord(0,0,1))));
}
TEST_CASE("DiffractionGeometry_DirectBeam") {
DiffractionGeometry geom;
geom.Wavelength_A(1.0);
geom.BeamX_pxl(1230).BeamY_pxl(1450);
auto [x, y] = geom.GetDirectBeam_pxl();
REQUIRE(x == Catch::Approx(1230.0f));
REQUIRE(y == Catch::Approx(1450.0f));
}
TEST_CASE("DiffractionGeometry_DirectBeam_RotZ") {
DiffractionGeometry geom;
geom.Wavelength_A(1.0);
geom.BeamX_pxl(1230).BeamY_pxl(1450);
geom.PoniRot3_rad(M_PI_2);
auto [x, y] = geom.GetDirectBeam_pxl();
REQUIRE(x == Catch::Approx(1230.0f));
REQUIRE(y == Catch::Approx(1450.0f));
}
TEST_CASE("DiffractionGeometry_DirectBeam_RotY") {
DiffractionGeometry geom;
geom.Wavelength_A(1.0);
geom.DetectorDistance_mm(100);
geom.PixelSize_mm(1.0);
geom.BeamX_pxl(1230).BeamY_pxl(1450);
geom.PoniRot2_rad(M_PI_4); // 45 deg rotation
auto [x, y] = geom.GetDirectBeam_pxl();
CHECK(x == Catch::Approx(1230.0f)); // no Change for X
CHECK(y >1450.0f);
}