19#include "gtest/gtest.h"
24 std::filesystem::path referenceElectronEnergyPath() {
25 return std::filesystem::path(OPALX_TEST_SOURCE_DIR) /
"data"
26 /
"cain_linear_breit_wheeler_head_on_electron_energy.csv";
29 std::filesystem::path referencePositronEnergyPath() {
30 return std::filesystem::path(OPALX_TEST_SOURCE_DIR) /
"data"
31 /
"cain_linear_breit_wheeler_head_on_positron_energy.csv";
34 std::filesystem::path referenceElectronThetaPath() {
35 return std::filesystem::path(OPALX_TEST_SOURCE_DIR) /
"data"
36 /
"cain_linear_breit_wheeler_head_on_electron_theta.csv";
39 std::filesystem::path referencePositronThetaPath() {
40 return std::filesystem::path(OPALX_TEST_SOURCE_DIR) /
"data"
41 /
"cain_linear_breit_wheeler_head_on_positron_theta.csv";
44 std::filesystem::path referenceElectronJointPath() {
45 return std::filesystem::path(OPALX_TEST_SOURCE_DIR) /
"data"
46 /
"cain_linear_breit_wheeler_head_on_electron_joint.csv";
49 std::filesystem::path referencePositronJointPath() {
50 return std::filesystem::path(OPALX_TEST_SOURCE_DIR) /
"data"
51 /
"cain_linear_breit_wheeler_head_on_positron_joint.csv";
54 std::filesystem::path referenceFinitePhotonBeamElectronEnergyPath() {
55 return std::filesystem::path(OPALX_TEST_SOURCE_DIR) /
"data"
56 /
"cain_linear_breit_wheeler_finite_photon_beam_electron_energy.csv";
59 std::filesystem::path referenceFinitePhotonBeamPositronEnergyPath() {
60 return std::filesystem::path(OPALX_TEST_SOURCE_DIR) /
"data"
61 /
"cain_linear_breit_wheeler_finite_photon_beam_positron_energy.csv";
64 std::filesystem::path referenceFinitePhotonBeamElectronThetaPath() {
65 return std::filesystem::path(OPALX_TEST_SOURCE_DIR) /
"data"
66 /
"cain_linear_breit_wheeler_finite_photon_beam_electron_theta.csv";
69 std::filesystem::path referenceFinitePhotonBeamPositronThetaPath() {
70 return std::filesystem::path(OPALX_TEST_SOURCE_DIR) /
"data"
71 /
"cain_linear_breit_wheeler_finite_photon_beam_positron_theta.csv";
74 std::filesystem::path referenceFinitePhotonBeamElectronJointPath() {
75 return std::filesystem::path(OPALX_TEST_SOURCE_DIR) /
"data"
76 /
"cain_linear_breit_wheeler_finite_photon_beam_electron_joint.csv";
79 std::filesystem::path referenceFinitePhotonBeamPositronJointPath() {
80 return std::filesystem::path(OPALX_TEST_SOURCE_DIR) /
"data"
81 /
"cain_linear_breit_wheeler_finite_photon_beam_positron_joint.csv";
84 std::filesystem::path referenceFinitePhotonBeamEnergySpreadElectronEnergyPath() {
85 return std::filesystem::path(OPALX_TEST_SOURCE_DIR) /
"data"
86 /
"cain_linear_breit_wheeler_finite_photon_beam_energy_spread_electron_energy.csv";
89 std::filesystem::path referenceFinitePhotonBeamEnergySpreadPositronEnergyPath() {
90 return std::filesystem::path(OPALX_TEST_SOURCE_DIR) /
"data"
91 /
"cain_linear_breit_wheeler_finite_photon_beam_energy_spread_positron_energy.csv";
94 std::filesystem::path referenceFinitePhotonBeamEnergySpreadElectronThetaPath() {
95 return std::filesystem::path(OPALX_TEST_SOURCE_DIR) /
"data"
96 /
"cain_linear_breit_wheeler_finite_photon_beam_energy_spread_electron_theta.csv";
99 std::filesystem::path referenceFinitePhotonBeamEnergySpreadPositronThetaPath() {
100 return std::filesystem::path(OPALX_TEST_SOURCE_DIR) /
"data"
101 /
"cain_linear_breit_wheeler_finite_photon_beam_energy_spread_positron_theta.csv";
104 std::filesystem::path referenceFinitePhotonBeamEnergySpreadElectronJointPath() {
105 return std::filesystem::path(OPALX_TEST_SOURCE_DIR) /
"data"
106 /
"cain_linear_breit_wheeler_finite_photon_beam_energy_spread_electron_joint.csv";
109 std::filesystem::path referenceFinitePhotonBeamEnergySpreadPositronJointPath() {
110 return std::filesystem::path(OPALX_TEST_SOURCE_DIR) /
"data"
111 /
"cain_linear_breit_wheeler_finite_photon_beam_energy_spread_positron_joint.csv";
114 std::filesystem::path referenceOverlapElectronEnergyPath() {
115 return std::filesystem::path(OPALX_TEST_SOURCE_DIR) /
"data"
116 /
"cain_linear_breit_wheeler_overlap_electron_energy.csv";
119 std::filesystem::path referenceOverlapPositronEnergyPath() {
120 return std::filesystem::path(OPALX_TEST_SOURCE_DIR) /
"data"
121 /
"cain_linear_breit_wheeler_overlap_positron_energy.csv";
124 std::filesystem::path referenceOverlapElectronThetaPath() {
125 return std::filesystem::path(OPALX_TEST_SOURCE_DIR) /
"data"
126 /
"cain_linear_breit_wheeler_overlap_electron_theta.csv";
129 std::filesystem::path referenceOverlapPositronThetaPath() {
130 return std::filesystem::path(OPALX_TEST_SOURCE_DIR) /
"data"
131 /
"cain_linear_breit_wheeler_overlap_positron_theta.csv";
135TEST(TestLinearBreitWheelerSpectrum, ElectronEnergySpectrumMatchesCainReference) {
147 ASSERT_EQ(
opalx.centers.size(), cain.centers.size());
159TEST(TestLinearBreitWheelerSpectrum, PositronEnergySpectrumMatchesCainReference) {
171 ASSERT_EQ(
opalx.centers.size(), cain.centers.size());
183TEST(TestLinearBreitWheelerSpectrum, ElectronAngularSpectrumMatchesCainReference) {
195 ASSERT_EQ(
opalx.centers.size(), cain.centers.size());
207TEST(TestLinearBreitWheelerSpectrum, PositronAngularSpectrumMatchesCainReference) {
219 ASSERT_EQ(
opalx.centers.size(), cain.centers.size());
231TEST(TestLinearBreitWheelerSpectrum, ElectronJointSpectrumMatchesCainReference) {
241 ASSERT_EQ(
opalx.energyCentersGeV.size(), cain.energyCentersGeV.size());
242 ASSERT_EQ(
opalx.thetaCentersRad.size(), cain.thetaCentersRad.size());
258TEST(TestLinearBreitWheelerSpectrum, PositronJointSpectrumMatchesCainReference) {
268 ASSERT_EQ(
opalx.energyCentersGeV.size(), cain.energyCentersGeV.size());
269 ASSERT_EQ(
opalx.thetaCentersRad.size(), cain.thetaCentersRad.size());
285TEST(TestLinearBreitWheelerSpectrum, FinitePhotonBeamElectronEnergySpectrumMatchesCainReference) {
298 referenceFinitePhotonBeamElectronEnergyPath());
300 ASSERT_EQ(
opalx.centers.size(), cain.centers.size());
312TEST(TestLinearBreitWheelerSpectrum, FinitePhotonBeamPositronEnergySpectrumMatchesCainReference) {
325 referenceFinitePhotonBeamPositronEnergyPath());
327 ASSERT_EQ(
opalx.centers.size(), cain.centers.size());
339TEST(TestLinearBreitWheelerSpectrum, FinitePhotonBeamElectronAngularSpectrumMatchesCainReference) {
352 referenceFinitePhotonBeamElectronThetaPath());
354 ASSERT_EQ(
opalx.centers.size(), cain.centers.size());
366TEST(TestLinearBreitWheelerSpectrum, FinitePhotonBeamPositronAngularSpectrumMatchesCainReference) {
379 referenceFinitePhotonBeamPositronThetaPath());
381 ASSERT_EQ(
opalx.centers.size(), cain.centers.size());
393TEST(TestLinearBreitWheelerSpectrum, FinitePhotonBeamElectronJointSpectrumMatchesCainReference) {
407 referenceFinitePhotonBeamElectronJointPath());
409 ASSERT_EQ(
opalx.energyCentersGeV.size(), cain.energyCentersGeV.size());
410 ASSERT_EQ(
opalx.thetaCentersRad.size(), cain.thetaCentersRad.size());
426TEST(TestLinearBreitWheelerSpectrum, FinitePhotonBeamPositronJointSpectrumMatchesCainReference) {
440 referenceFinitePhotonBeamPositronJointPath());
442 ASSERT_EQ(
opalx.energyCentersGeV.size(), cain.energyCentersGeV.size());
443 ASSERT_EQ(
opalx.thetaCentersRad.size(), cain.thetaCentersRad.size());
459TEST(TestLinearBreitWheelerSpectrum,
460 FinitePhotonBeamEnergySpreadElectronEnergySpectrumMatchesCainReference) {
474 referenceFinitePhotonBeamEnergySpreadElectronEnergyPath());
476 ASSERT_EQ(
opalx.centers.size(), cain.centers.size());
488TEST(TestLinearBreitWheelerSpectrum,
489 FinitePhotonBeamEnergySpreadPositronEnergySpectrumMatchesCainReference) {
503 referenceFinitePhotonBeamEnergySpreadPositronEnergyPath());
505 ASSERT_EQ(
opalx.centers.size(), cain.centers.size());
517TEST(TestLinearBreitWheelerSpectrum,
518 FinitePhotonBeamEnergySpreadElectronAngularSpectrumMatchesCainReference) {
532 referenceFinitePhotonBeamEnergySpreadElectronThetaPath());
534 ASSERT_EQ(
opalx.centers.size(), cain.centers.size());
546TEST(TestLinearBreitWheelerSpectrum,
547 FinitePhotonBeamEnergySpreadPositronAngularSpectrumMatchesCainReference) {
561 referenceFinitePhotonBeamEnergySpreadPositronThetaPath());
563 ASSERT_EQ(
opalx.centers.size(), cain.centers.size());
575TEST(TestLinearBreitWheelerSpectrum,
576 FinitePhotonBeamEnergySpreadElectronJointSpectrumMatchesCainReference) {
591 referenceFinitePhotonBeamEnergySpreadElectronJointPath());
593 ASSERT_EQ(
opalx.energyCentersGeV.size(), cain.energyCentersGeV.size());
594 ASSERT_EQ(
opalx.thetaCentersRad.size(), cain.thetaCentersRad.size());
610TEST(TestLinearBreitWheelerSpectrum,
611 FinitePhotonBeamEnergySpreadPositronJointSpectrumMatchesCainReference) {
626 referenceFinitePhotonBeamEnergySpreadPositronJointPath());
628 ASSERT_EQ(
opalx.energyCentersGeV.size(), cain.energyCentersGeV.size());
629 ASSERT_EQ(
opalx.thetaCentersRad.size(), cain.thetaCentersRad.size());
645TEST(TestLinearBreitWheelerSpectrum, OverlapWeightedElectronEnergySpectrumMatchesCainReference) {
667 ASSERT_EQ(
opalx.centers.size(), cain.centers.size());
678TEST(TestLinearBreitWheelerSpectrum, OverlapWeightedPositronEnergySpectrumMatchesCainReference) {
700 ASSERT_EQ(
opalx.centers.size(), cain.centers.size());
711TEST(TestLinearBreitWheelerSpectrum, OverlapWeightedElectronAngularSpectrumMatchesCainReference) {
733 ASSERT_EQ(
opalx.centers.size(), cain.centers.size());
744TEST(TestLinearBreitWheelerSpectrum, OverlapWeightedPositronAngularSpectrumMatchesCainReference) {
766 ASSERT_EQ(
opalx.centers.size(), cain.centers.size());
TEST(TestLinearBreitWheelerSpectrum, ElectronEnergySpectrumMatchesCainReference)
double histogramMean(const Histogram &histogram)
double histogramL1Distance(const Histogram &lhs, const Histogram &rhs)
double relativeEnergySpread
JointHistogram sampleFinitePhotonBeamJointHistogram(const FinitePhotonBeamJointConfig &config, FinalState state, std::size_t sampleCount, std::uint64_t streamIndex=0)
Sample the joint Breit-Wheeler laboratory distribution in energy and polar angle.
Histogram sampleFinitePhotonBeamHistogram(const FinitePhotonBeamConfig &config, FinalState state, Observable observable, std::size_t sampleCount, std::uint64_t streamIndex=0)
Sample a one-dimensional Breit-Wheeler histogram for a finite incoming photon beam.
double relativeEnergySpread
Histogram sampleHistogram(const HistogramConfig &config, FinalState state, Observable observable, std::size_t sampleCount, std::uint64_t streamIndex=0)
Sample a one-dimensional Breit-Wheeler benchmark histogram.
JointHistogram sampleJointHistogram(const JointHistogramConfig &config, FinalState state, std::size_t sampleCount, std::uint64_t streamIndex=0)
double jointHistogramMeanEnergyGeV(const JointHistogram &histogram)
double histogramArea(const Histogram &histogram)
JointHistogram readJointHistogramCSV(const std::filesystem::path &inputPath)
double jointHistogramL1Distance(const JointHistogram &lhs, const JointHistogram &rhs)
double jointHistogramArea(const JointHistogram &histogram)
Histogram readHistogramCSV(const std::filesystem::path &inputPath)
double jointHistogramMeanThetaRad(const JointHistogram &histogram)
Configuration for folding the linear Breit-Wheeler kernel over a finite incoming photon beam.
int seed
The current random seed.
constexpr double c
The velocity of light in m/s.