File indexing completed on 2026-04-04 08:08:17
0001 #ifndef __WRAPPER_ASYM_ARRAYS_H__
0002 #define __WRAPPER_ASYM_ARRAYS_H__
0003
0004 #include "AsymmetryCalc/Constants.h"
0005
0006 #include <iostream>
0007 #include <array>
0008 #include <string>
0009 #include <cstdlib>
0010 #include <cstdint>
0011
0012 namespace AsymmetryCalc {
0013 class pt_asym_array {
0014 public:
0015 static constexpr int nDimensions = 6;
0016
0017 static constexpr size_t dim_sizes[nDimensions] = {ASYM_CONSTANTS::nBeams, ASYM_CONSTANTS::nParticles, ASYM_CONSTANTS::nRegions, ASYM_CONSTANTS::nPtBins, ASYM_CONSTANTS::nDirections, ASYM_CONSTANTS::nPhiBins};
0018
0019 static constexpr const char* dim_names[nDimensions] = {"beam", "particle", "region", "pt", "direction", "phi"};
0020
0021 static constexpr size_t size_array = dim_sizes[0] * dim_sizes[1] * dim_sizes[2] * dim_sizes[3] * dim_sizes[4] * dim_sizes[5];
0022
0023 using storage_type = std::array<double, size_array>;
0024
0025 double& operator()(size_t iBeam,
0026 size_t iParticle,
0027 size_t iRegion,
0028 size_t iPt,
0029 size_t iDir,
0030 size_t iPhi)
0031 {
0032 check_bounds(iBeam, iParticle, iRegion, iPt, iDir, iPhi);
0033 return data_[index(iBeam, iParticle, iRegion, iPt, iDir, iPhi)];
0034 }
0035
0036 const double& operator()(size_t iBeam,
0037 size_t iParticle,
0038 size_t iRegion,
0039 size_t iPt,
0040 size_t iDir,
0041 size_t iPhi) const
0042 {
0043 check_bounds(iBeam, iParticle, iRegion, iPt, iDir, iPhi);
0044 return data_[index(iBeam, iParticle, iRegion, iPt, iDir, iPhi)];
0045 }
0046
0047 private:
0048
0049 storage_type data_{};
0050
0051 void check_bounds(size_t iBeam,
0052 size_t iParticle,
0053 size_t iRegion,
0054 size_t iPt,
0055 size_t iDir,
0056 size_t iPhi) const
0057 {
0058 size_t indices[nDimensions] = {iBeam, iParticle, iRegion, iPt, iDir, iPhi};
0059 for (int iDim = 0; iDim < nDimensions; iDim++)
0060 {
0061 if (indices[iDim] > dim_sizes[iDim])
0062 {
0063 std::cerr << "Error: " << dim_names[iDim] << " index out of bounds" << std::endl;
0064 std::exit(1);
0065 }
0066 }
0067 }
0068
0069 static constexpr size_t index(size_t iBeam,
0070 size_t iParticle,
0071 size_t iRegion,
0072 size_t iPt,
0073 size_t iDir,
0074 size_t iPhi)
0075 {
0076 return (((((iBeam * ASYM_CONSTANTS::nParticles + iParticle)
0077 * ASYM_CONSTANTS::nRegions + iRegion)
0078 * ASYM_CONSTANTS::nPtBins + iPt)
0079 * ASYM_CONSTANTS::nDirections + iDir)
0080 * ASYM_CONSTANTS::nPhiBins +iPhi);
0081 }
0082 };
0083
0084 class pt_nodir_asym_array {
0085 public:
0086 static constexpr int nDimensions = 5;
0087
0088 static constexpr size_t dim_sizes[nDimensions] = {ASYM_CONSTANTS::nBeams, ASYM_CONSTANTS::nParticles, ASYM_CONSTANTS::nRegions, ASYM_CONSTANTS::nPtBins, ASYM_CONSTANTS::nPhiBins};
0089
0090 static constexpr const char* dim_names[nDimensions] = {"beam", "particle", "region", "pt", "phi"};
0091
0092 static constexpr size_t size_array = dim_sizes[0] * dim_sizes[1] * dim_sizes[2] * dim_sizes[3] * dim_sizes[4];
0093
0094 using storage_type = std::array<double, size_array>;
0095
0096 double& operator()(size_t iBeam,
0097 size_t iParticle,
0098 size_t iRegion,
0099 size_t iPt,
0100 size_t iPhi)
0101 {
0102 check_bounds(iBeam, iParticle, iRegion, iPt, iPhi);
0103 return data_[index(iBeam, iParticle, iRegion, iPt, iPhi)];
0104 }
0105
0106 const double& operator()(size_t iBeam,
0107 size_t iParticle,
0108 size_t iRegion,
0109 size_t iPt,
0110 size_t iPhi) const
0111 {
0112 check_bounds(iBeam, iParticle, iRegion, iPt, iPhi);
0113 return data_[index(iBeam, iParticle, iRegion, iPt, iPhi)];
0114 }
0115
0116 private:
0117
0118 storage_type data_{};
0119
0120 void check_bounds(size_t iBeam,
0121 size_t iParticle,
0122 size_t iRegion,
0123 size_t iPt,
0124 size_t iPhi) const
0125 {
0126 size_t indices[nDimensions] = {iBeam, iParticle, iRegion, iPt, iPhi};
0127 for (int iDim = 0; iDim < nDimensions; iDim++)
0128 {
0129 if (indices[iDim] > dim_sizes[iDim])
0130 {
0131 std::cerr << "Error: " << dim_names[iDim] << " index out of bounds" << std::endl;
0132 std::exit(1);
0133 }
0134 }
0135 }
0136
0137 static constexpr size_t index(size_t iBeam,
0138 size_t iParticle,
0139 size_t iRegion,
0140 size_t iPt,
0141 size_t iPhi)
0142 {
0143 return ((((iBeam * ASYM_CONSTANTS::nParticles + iParticle)
0144 * ASYM_CONSTANTS::nRegions + iRegion)
0145 * ASYM_CONSTANTS::nPtBins + iPt)
0146 * ASYM_CONSTANTS::nPhiBins +iPhi);
0147 }
0148 };
0149
0150 class eta_asym_array {
0151 public:
0152 static constexpr int nDimensions = 5;
0153
0154 static constexpr size_t dim_sizes[nDimensions] = {ASYM_CONSTANTS::nBeams, ASYM_CONSTANTS::nParticles, ASYM_CONSTANTS::nRegions, ASYM_CONSTANTS::nEtaBins, ASYM_CONSTANTS::nPhiBins};
0155
0156 static constexpr const char* dim_names[nDimensions] = {"beam", "particle", "region", "eta", "phi"};
0157
0158 static constexpr size_t size_array = dim_sizes[0] * dim_sizes[1] * dim_sizes[2] * dim_sizes[3] * dim_sizes[4];
0159
0160 using storage_type = std::array<double, size_array>;
0161
0162 double& operator()(size_t iBeam,
0163 size_t iParticle,
0164 size_t iRegion,
0165 size_t iEta,
0166 size_t iPhi)
0167 {
0168 check_bounds(iBeam, iParticle, iRegion, iEta, iPhi);
0169 return data_[index(iBeam, iParticle, iRegion, iEta, iPhi)];
0170 }
0171
0172 const double& operator()(size_t iBeam,
0173 size_t iParticle,
0174 size_t iRegion,
0175 size_t iEta,
0176 size_t iPhi) const
0177 {
0178 check_bounds(iBeam, iParticle, iRegion, iEta, iPhi);
0179 return data_[index(iBeam, iParticle, iRegion, iEta, iPhi)];
0180 }
0181
0182 private:
0183
0184 storage_type data_{};
0185
0186 void check_bounds(size_t iBeam,
0187 size_t iParticle,
0188 size_t iRegion,
0189 size_t iEta,
0190 size_t iPhi) const
0191 {
0192 size_t indices[nDimensions] = {iBeam, iParticle, iRegion, iEta, iPhi};
0193 for (int iDim = 0; iDim < nDimensions; iDim++)
0194 {
0195 if (indices[iDim] > dim_sizes[iDim])
0196 {
0197 std::cerr << "Error: " << dim_names[iDim] << " index out of bounds" << std::endl;
0198 std::exit(1);
0199 }
0200 }
0201 }
0202
0203 static constexpr size_t index(size_t iBeam,
0204 size_t iParticle,
0205 size_t iRegion,
0206 size_t iEta,
0207 size_t iPhi)
0208 {
0209 return ((((iBeam * ASYM_CONSTANTS::nParticles + iParticle)
0210 * ASYM_CONSTANTS::nRegions + iRegion)
0211 * ASYM_CONSTANTS::nEtaBins + iEta)
0212 * ASYM_CONSTANTS::nPhiBins +iPhi);
0213 }
0214 };
0215
0216 class xf_asym_array {
0217 public:
0218 static constexpr int nDimensions = 5;
0219
0220 static constexpr size_t dim_sizes[nDimensions] = {ASYM_CONSTANTS::nBeams, ASYM_CONSTANTS::nParticles, ASYM_CONSTANTS::nRegions, ASYM_CONSTANTS::nXfBins, ASYM_CONSTANTS::nPhiBins};
0221
0222 static constexpr const char* dim_names[nDimensions] = {"beam", "particle", "region", "xf", "phi"};
0223
0224 static constexpr size_t size_array = dim_sizes[0] * dim_sizes[1] * dim_sizes[2] * dim_sizes[3] * dim_sizes[4];
0225
0226 using storage_type = std::array<double, size_array>;
0227
0228 double& operator()(size_t iBeam,
0229 size_t iParticle,
0230 size_t iRegion,
0231 size_t iXf,
0232 size_t iPhi)
0233 {
0234 check_bounds(iBeam, iParticle, iRegion, iXf, iPhi);
0235 return data_[index(iBeam, iParticle, iRegion, iXf, iPhi)];
0236 }
0237
0238 const double& operator()(size_t iBeam,
0239 size_t iParticle,
0240 size_t iRegion,
0241 size_t iXf,
0242 size_t iPhi) const
0243 {
0244 check_bounds(iBeam, iParticle, iRegion, iXf, iPhi);
0245 return data_[index(iBeam, iParticle, iRegion, iXf, iPhi)];
0246 }
0247
0248 private:
0249
0250 storage_type data_{};
0251
0252 void check_bounds(size_t iBeam,
0253 size_t iParticle,
0254 size_t iRegion,
0255 size_t iXf,
0256 size_t iPhi) const
0257 {
0258 size_t indices[nDimensions] = {iBeam, iParticle, iRegion, iXf, iPhi};
0259 for (int iDim = 0; iDim < nDimensions; iDim++)
0260 {
0261 if (indices[iDim] > dim_sizes[iDim])
0262 {
0263 std::cerr << "Error: " << dim_names[iDim] << " index out of bounds" << std::endl;
0264 std::exit(1);
0265 }
0266 }
0267 }
0268
0269 static constexpr size_t index(size_t iBeam,
0270 size_t iParticle,
0271 size_t iRegion,
0272 size_t iXf,
0273 size_t iPhi)
0274 {
0275 return ((((iBeam * ASYM_CONSTANTS::nParticles + iParticle)
0276 * ASYM_CONSTANTS::nRegions + iRegion)
0277 * ASYM_CONSTANTS::nXfBins + iXf)
0278 * ASYM_CONSTANTS::nPhiBins +iPhi);
0279 }
0280 };
0281 };
0282
0283 #endif