diff --git a/news/x2xcorrphase-public.rst b/news/x2xcorrphase-public.rst new file mode 100644 index 0000000..45ccd5d --- /dev/null +++ b/news/x2xcorrphase-public.rst @@ -0,0 +1,23 @@ +**Added:** + +* Expose PowderPatternDiffraction.X2XCorrPhase + +**Changed:** + +* + +**Deprecated:** + +* + +**Removed:** + +* + +**Fixed:** + +* + +**Security:** + +* diff --git a/src/extensions/powderpatterndiffraction_ext.cpp b/src/extensions/powderpatterndiffraction_ext.cpp index def3afa..839c925 100644 --- a/src/extensions/powderpatterndiffraction_ext.cpp +++ b/src/extensions/powderpatterndiffraction_ext.cpp @@ -90,6 +90,7 @@ void wrap_powderpatterndiffraction() &PowderPatternDiffraction::GetNbReflBelowMaxSinThetaOvLambda) .def("GetFhklObsSq", &PowderPatternDiffraction::GetFhklObsSq, return_value_policy()) + .def("X2XCorrPhase", &PowderPatternDiffraction::X2XCorrPhase) ; } diff --git a/tests/test_powderpattern.py b/tests/test_powderpattern.py index b1d43dc..a5420a1 100644 --- a/tests/test_powderpattern.py +++ b/tests/test_powderpattern.py @@ -364,7 +364,35 @@ class TestPowderPatternBackground(unittest.TestCase): class TestPowderPatternDiffraction(unittest.TestCase): - pass + def test_X2XCorrPhase_flat_detector_displacement(self): + pp = PowderPattern() + pp.SetWavelength(1.54056) + pp.SetPowderPatternPar(np.deg2rad(5), np.deg2rad(0.1), 851) + crystal = makeCrystal(*makeScatterer()) + pdiff = pp.AddPowderPatternDiffraction(crystal) + + x = np.deg2rad(30) + self.assertAlmostEqual(pdiff.X2XCorrPhase(x), x) + + phase_ratio = 1e-4 + pdiff.GetPar("2ThetaFlatDetDispRatioPhase").SetValue(phase_ratio) + expected = x + np.arctan( + phase_ratio + * np.sin(2 * x) + / (2 - 2 * phase_ratio * np.sin(x) ** 2) + ) + self.assertAlmostEqual(pdiff.X2XCorrPhase(x), expected) + + pattern_ratio = 2e-4 + pp.GetPar("2ThetaFlatDetDispRatio").SetValue(pattern_ratio) + total_ratio = phase_ratio + pattern_ratio + expected = x + np.arctan( + total_ratio + * np.sin(2 * x) + / (2 - 2 * total_ratio * np.sin(x) ** 2) + ) + self.assertAlmostEqual(pdiff.X2XCorrPhase(x), expected) + # def test___init__(self): assert False # def test_ExtractLeBail(self): assert False # def test_GetExtractionMode(self): assert False