File indexing completed on 2025-09-18 09:33:53
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012 #ifndef ROOT_THnSparse
0013 #define ROOT_THnSparse
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023 #include "THnBase.h"
0024 #include "TExMap.h"
0025 #include "THnSparse_Internal.h"
0026
0027
0028 #include "TArrayF.h"
0029 #include "TArrayL.h"
0030 #include "TArrayL64.h"
0031 #include "TArrayI.h"
0032 #include "TArrayS.h"
0033 #include "TArrayC.h"
0034
0035 class THnSparseCompactBinCoord;
0036
0037 class THnSparse: public THnBase {
0038 private:
0039 Int_t fChunkSize;
0040 Long64_t fFilledBins;
0041 TObjArray fBinContent;
0042 TExMap fBins;
0043 TExMap fBinsContinued;
0044 THnSparseCompactBinCoord *fCompactCoord;
0045
0046 THnSparse(const THnSparse&) = delete;
0047 THnSparse& operator=(const THnSparse&) = delete;
0048
0049 protected:
0050
0051 THnSparseCompactBinCoord* GetCompactCoord() const;
0052 THnSparseArrayChunk* GetChunk(Int_t idx) const {
0053 return (THnSparseArrayChunk*) fBinContent[idx]; }
0054
0055 THnSparseArrayChunk* AddChunk();
0056 void Reserve(Long64_t nbins) override;
0057 void FillExMap();
0058 virtual TArray* GenerateArray() const = 0;
0059 Long64_t GetBinIndexForCurrentBin(Bool_t allocate);
0060
0061
0062
0063 void FillBin(Long64_t bin, Double_t w) override {
0064 THnSparseArrayChunk* chunk = GetChunk(bin / fChunkSize);
0065 chunk->AddBinContent(bin % fChunkSize, w);
0066 FillBinBase(w);
0067 }
0068 void InitStorage(Int_t* nbins, Int_t chunkSize) override;
0069
0070 public:
0071
0072 THnSparse();
0073 THnSparse(const char* name, const char* title, Int_t dim,
0074 const Int_t* nbins, const Double_t* xmin = nullptr, const Double_t* xmax = nullptr,
0075 Int_t chunksize = 1024 * 16);
0076 THnSparse(const char* name, const char* title,
0077 const std::vector<TAxis>& axes,
0078 Int_t chunksize = 1024 * 16);
0079
0080 ~THnSparse() override;
0081
0082 static THnSparse* CreateSparse(const char* name, const char* title,
0083 const TH1* h1, Int_t chunkSize = 1024 * 16) {
0084 return (THnSparse*) CreateHnAny(name, title, h1, kTRUE ,
0085 chunkSize);
0086 }
0087 static THnSparse* CreateSparse(const char* name, const char* title,
0088 const THnBase* hn, Int_t chunkSize = 1024 * 16) {
0089 return (THnSparse*) CreateHnAny(name, title, hn, kTRUE ,
0090 chunkSize);
0091 }
0092
0093 Int_t GetChunkSize() const { return fChunkSize; }
0094 Int_t GetNChunks() const { return fBinContent.GetEntriesFast(); }
0095
0096 ROOT::Internal::THnBaseBinIter* CreateIter(Bool_t respectAxisRange) const override;
0097
0098 Long64_t GetNbins() const override { return fFilledBins; }
0099 void SetFilledBins(Long64_t nbins) override { fFilledBins = nbins; }
0100
0101 Long64_t GetBin(const Int_t* idx) const override { return const_cast<THnSparse*>(this)->GetBin(idx, kFALSE); }
0102 Long64_t GetBin(const Double_t* x) const override { return const_cast<THnSparse*>(this)->GetBin(x, kFALSE); }
0103 Long64_t GetBin(const char* name[]) const override { return const_cast<THnSparse*>(this)->GetBin(name, kFALSE); }
0104 Long64_t GetBin(const Int_t* idx, Bool_t allocate = kTRUE) override;
0105 Long64_t GetBin(const Double_t* x, Bool_t allocate = kTRUE) override;
0106 Long64_t GetBin(const char* name[], Bool_t allocate = kTRUE) override;
0107
0108
0109
0110 void SetBinContent(const Int_t* idx, Double_t v) {
0111 THnBase::SetBinContent(idx, v);
0112 }
0113 void SetBinContent(Long64_t bin, Double_t v) override;
0114 void SetBinError2(Long64_t bin, Double_t e2) override;
0115
0116
0117
0118 void AddBinContent(const Int_t* idx, Double_t v = 1.) {
0119 THnBase::AddBinContent(idx, v);
0120 }
0121 void AddBinContent(Long64_t bin, Double_t v = 1.) override;
0122 void AddBinError2(Long64_t bin, Double_t e2) override;
0123
0124
0125
0126 Double_t GetBinContent(const Int_t *idx) const {
0127
0128 return THnBase::GetBinContent(idx);
0129 }
0130 Double_t GetBinContent(Long64_t bin, Int_t* idx = nullptr) const override;
0131 Double_t GetBinError2(Long64_t linidx) const override;
0132
0133 Double_t GetSparseFractionBins() const;
0134 Double_t GetSparseFractionMem() const;
0135
0136
0137
0138
0139 TH1D* Projection(Int_t xDim, Option_t* option = "") const{
0140 return THnBase::Projection(xDim, option);
0141 }
0142
0143
0144
0145
0146 TH2D* Projection(Int_t yDim, Int_t xDim,
0147 Option_t* option = "") const {
0148 return THnBase::Projection(yDim, xDim, option);
0149 }
0150
0151
0152
0153
0154 TH3D* Projection(Int_t xDim, Int_t yDim, Int_t zDim,
0155 Option_t* option = "") const {
0156 return THnBase::Projection(xDim, yDim, zDim, option);
0157 }
0158
0159 THnSparse* Projection(Int_t ndim, const Int_t* dim,
0160 Option_t* option = "") const {
0161 return (THnSparse*) ProjectionND(ndim, dim, option);
0162 }
0163
0164 THnSparse* Rebin(Int_t group) const {
0165 return (THnSparse*) RebinBase(group);
0166 }
0167 THnSparse* Rebin(const Int_t* group) const {
0168 return (THnSparse*) RebinBase(group);
0169 }
0170
0171 void Reset(Option_t* option = "") override;
0172 void Sumw2() override;
0173
0174 ClassDefOverride(THnSparse, 3);
0175 };
0176
0177
0178
0179
0180
0181
0182
0183
0184
0185
0186
0187
0188
0189
0190
0191
0192
0193
0194
0195
0196
0197
0198
0199
0200
0201
0202
0203
0204
0205
0206
0207
0208
0209
0210
0211 template <class CONT>
0212 class THnSparseT: public THnSparse {
0213 public:
0214 using THnSparse::THnSparse;
0215
0216 TArray* GenerateArray() const override { return new CONT(GetChunkSize()); }
0217 private:
0218 ClassDefOverride(THnSparseT, 1);
0219 };
0220
0221 typedef THnSparseT<TArrayD> THnSparseD;
0222 typedef THnSparseT<TArrayF> THnSparseF;
0223 typedef THnSparseT<TArrayL64> THnSparseL;
0224 typedef THnSparseT<TArrayI> THnSparseI;
0225 typedef THnSparseT<TArrayS> THnSparseS;
0226 typedef THnSparseT<TArrayC> THnSparseC;
0227
0228
0229 #endif