Back to home page

sPhenix code displayed by LXR

 
 

    


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