48 std::pair<double, double>
const &r_limits,
49 std::pair<double, double>
const &phi_limits,
50 std::pair<double, double>
const &z_limits, std::size_t n_r_bins,
51 std::size_t n_phi_bins, std::size_t n_z_bins,
double sampling_density) {
52 auto constexpr endpoint =
false;
54 (r_limits.second - r_limits.first) /
static_cast<double>(n_r_bins);
55 auto const delta_phi =
56 (phi_limits.second - phi_limits.first) /
static_cast<double>(n_phi_bins);
61 auto const smallest_bin_volume =
62 Utils::sqr(r_limits.first + delta_r) * delta_phi / 2.;
63 auto const min_n_samples =
64 std::max(n_z_bins,
static_cast<std::size_t
>(std::round(
65 smallest_bin_volume * sampling_density)));
67 (z_limits.second - z_limits.first) /
static_cast<double>(min_n_samples);
70 r_limits.second, n_r_bins, endpoint);
71 auto const phi_range =
72 make_lin_space(phi_limits.first + .5 * delta_phi, phi_limits.second,
73 n_phi_bins, endpoint);
75 z_limits.second, min_n_samples, endpoint);
78 std::vector<Vector3d> sampling_positions;
79 for (
auto const z : z_range) {
80 for (
auto const phi : phi_range) {
81 sampling_positions.push_back(
Vector3d{{*r_range.
begin(), phi, z}});
86 auto phis = [n_phi_bins, phi_limits](
long r_bin) {
88 phi_limits.first, phi_limits.second,
89 n_phi_bins * (
static_cast<std::size_t
>(r_bin) + 1), endpoint);
94 for (
auto const z : z_range) {
96 for (
auto r = ++r_range.begin(); r != r_range.end(); ++r) {
98 for (
auto const phi : phis(std::distance(r_range.begin(), r))) {
99 sampling_positions.push_back(
Vector3d{{*r, phi, z}});
104 return sampling_positions;
std::vector< Vector3d > get_cylindrical_sampling_positions(std::pair< double, double > const &r_limits, std::pair< double, double > const &phi_limits, std::pair< double, double > const &z_limits, std::size_t n_r_bins, std::size_t n_phi_bins, std::size_t n_z_bins, double sampling_density)
Generate sampling positions for a cylindrical histogram.