Back to home page

sPhenix code displayed by LXR

 
 

    


File indexing completed on 2026-04-04 08:08:17

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