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