29 std::vector<PositionMeasurement2DPoint> result;
34 const double cx = 0.5 *
static_cast<double>(field.
width() - 1u);
35 const double cy = 0.5 *
static_cast<double>(field.
height() - 1u);
36 const double dx =
static_cast<double>(field.
dx());
37 const double dy =
static_cast<double>(field.
dy());
38 const double halfThickness = 0.5 *
static_cast<double>(params.
thickness);
40 std::vector<double> weights(field.
height(), 0.0);
42 bool selectedAnyColumn =
false;
44 for (std::size_t x = 0; x < field.
width(); ++x) {
45 const double physicalX = (
static_cast<double>(x) - cx) * dx;
46 if (std::fabs(physicalX -
static_cast<double>(params.
detectorX)) > halfThickness) {
49 selectedAnyColumn =
true;
50 for (std::size_t y = 0; y < field.
height(); ++y) {
52 const double re =
static_cast<double>(v.real());
53 const double im =
static_cast<double>(v.imag());
54 const double p = re * re + im * im;
55 if (std::isfinite(p) && p > 0.0) {
63 if (!selectedAnyColumn) {
64 const double gridX =
static_cast<double>(params.
detectorX) / dx + cx;
65 long nearest =
static_cast<long>(std::lround(gridX));
66 nearest = std::max<long>(0, std::min<long>(
static_cast<long>(field.
width()) - 1, nearest));
67 const std::size_t x =
static_cast<std::size_t
>(nearest);
68 for (std::size_t y = 0; y < field.
height(); ++y) {
70 const double re =
static_cast<double>(v.real());
71 const double im =
static_cast<double>(v.imag());
72 const double p = re * re + im * im;
73 if (std::isfinite(p) && p > 0.0) {
80 if (!(total > 0.0) || !std::isfinite(total)) {
84 std::discrete_distribution<std::size_t> distribution(weights.begin(), weights.end());
85 result.reserve(shots);
86 for (std::size_t shot = 0; shot < shots; ++shot) {
87 const std::size_t yIndex = distribution(engine);
90 point.
y =
static_cast<float>((
static_cast<double>(yIndex) - cy) * dy);
91 result.push_back(point);
104 std::random_device rd;
105 std::seed_seq seed{rd(), rd(), rd(), rd(),
106 static_cast<unsigned int>(field.
width()),
107 static_cast<unsigned int>(field.
height()),
108 static_cast<unsigned int>(shots)};
109 std::mt19937 engine(seed);
110 return sampleWithEngine(field, params, shots, engine);
119 std::mt19937 engine(seed);
120 return sampleWithEngine(field, params, shots, engine);
124 const std::vector<PositionMeasurement2DPoint> &hits,
129 std::vector<std::size_t> histogram;
130 if (!(yMax > yMin) || bins == 0u) {
133 histogram.assign(bins, 0u);
134 const double span =
static_cast<double>(yMax - yMin);
135 for (std::size_t i = 0; i < hits.size(); ++i) {
136 const double u = (
static_cast<double>(hits[i].y) -
static_cast<double>(yMin)) / span;
137 if (u < 0.0 || u > 1.0) {
140 std::size_t index =
static_cast<std::size_t
>(u *
static_cast<double>(bins));
Owning Cartesian grid of complex scalar samples.
bool empty() const noexcept
Returns whether the field contains no samples.
float dx() const noexcept
Returns the X grid spacing.
std::size_t height() const noexcept
Returns the number of samples along Y.
std::complex< float > Value
float dy() const noexcept
Returns the Y grid spacing.
std::size_t width() const noexcept
Returns the number of samples along X.
static std::vector< PositionMeasurement2DPoint > sample(const ComplexField2D &field, const DetectorScreenMeasurement2DParams ¶ms, std::size_t shots)
Performs sample.
static std::vector< PositionMeasurement2DPoint > sampleSeeded(const ComplexField2D &field, const DetectorScreenMeasurement2DParams ¶ms, std::size_t shots, std::uint32_t seed)
Samples seeded.
static std::vector< std::size_t > histogramY(const std::vector< PositionMeasurement2DPoint > &hits, float yMin, float yMax, std::size_t bins)
Performs histogram y.
Declares the complex scalar field container representing two-dimensional wave functions.
Declares the detectorscreenmeasurement2d physics/numerical component used by QPE experiments.
std::vector< PositionMeasurement2DPoint > sampleWithEngine(const ComplexField2D &field, const DetectorScreenMeasurement2DParams ¶ms, std::size_t shots, std::mt19937 &engine)
Configuration values for Detector Screen Measurement2D Params.
Data record containing Position Measurement2D Point.