86 if (!nearlyEqual(field.
norm2(), 1.0, 5.0e-6)) {
87 return fail(errorMessage,
"Gaussian packet is not normalized");
94 const double cellArea =
static_cast<double>(field.
dx()) *
95 static_cast<double>(field.
dy());
97 for (std::size_t y = 0; y < field.
height(); ++y) {
99 for (std::size_t x = 0; x < field.
width(); ++x) {
101 const double probability =
static_cast<double>(std::norm(field(x, y)));
102 const double w = probability * cellArea;
106 meanX2 += xx * xx * w;
107 meanY2 += yy * yy * w;
111 if (!nearlyEqual(meanX, p.
centerX, 2.0e-3) ||
112 !nearlyEqual(meanY, p.
centerY, 2.0e-3)) {
113 return fail(errorMessage,
"Gaussian packet centre is incorrect");
116 const double varX = meanX2 - meanX * meanX;
117 const double varY = meanY2 - meanY * meanY;
118 const double expectedVariance =
static_cast<double>(p.
sigma) * p.
sigma;
120 if (!nearlyEqual(varX, expectedVariance, 3.0e-3) ||
121 !nearlyEqual(varY, expectedVariance, 3.0e-3)) {
122 return fail(errorMessage,
"Gaussian packet sigma is incorrect");
126 const std::size_t cx = field.
width() / 2;
127 const std::size_t cy = field.
height() / 2;
128 const std::complex<float> a = field(cx, cy);
129 const std::complex<float> b = field(cx + 1, cy);
130 const double measuredPhaseStep = std::arg(b * std::conj(a));
131 const double expectedPhaseStep =
134 if (std::abs(wrappedAngleDifference(measuredPhaseStep, expectedPhaseStep)) > 2.0e-5) {
135 return fail(errorMessage,
"Gaussian packet X phase gradient is incorrect");
139 const std::complex<float> c = field(cx, cy + 1);
140 const double measuredPhaseStepY = std::arg(c * std::conj(a));
141 const double expectedPhaseStepY =
144 if (std::abs(wrappedAngleDifference(measuredPhaseStepY, expectedPhaseStepY)) > 2.0e-5) {
145 return fail(errorMessage,
"Gaussian packet Y phase gradient is incorrect");
148 bool invalidSigmaRejected =
false;
153 }
catch (
const std::invalid_argument &) {
154 invalidSigmaRejected =
true;
157 if (!invalidSigmaRejected) {
158 return fail(errorMessage,
"invalid sigma was not rejected");
160 }
catch (
const std::exception &e) {
161 errorMessage = e.what();