12 #ifndef ROOT_THnSparse
13 #define ROOT_THnSparse
34 class THnSparseCompactBinCoord;
36 class THnSparse:
public THnBase {
40 TObjArray fBinContent;
42 TExMap fBinsContinued;
43 THnSparseCompactBinCoord *fCompactCoord;
45 THnSparse(
const THnSparse&);
46 THnSparse& operator=(
const THnSparse&);
51 THnSparse(
const char* name,
const char* title, Int_t dim,
52 const Int_t* nbins,
const Double_t* xmin,
const Double_t* xmax,
54 THnSparseCompactBinCoord* GetCompactCoord()
const;
55 THnSparseArrayChunk* GetChunk(Int_t idx)
const {
56 return (THnSparseArrayChunk*) fBinContent[idx]; }
58 THnSparseArrayChunk* AddChunk();
59 void Reserve(Long64_t nbins);
61 virtual TArray* GenerateArray()
const = 0;
62 Long64_t GetBinIndexForCurrentBin(Bool_t allocate);
66 void FillBin(Long64_t bin, Double_t w) {
67 THnSparseArrayChunk* chunk = GetChunk(bin / fChunkSize);
68 chunk->AddBinContent(bin % fChunkSize, w);
71 void InitStorage(Int_t* nbins, Int_t chunkSize);
76 static THnSparse* CreateSparse(
const char* name,
const char* title,
77 const TH1* h1, Int_t chunkSize = 1024 * 16) {
78 return (THnSparse*) CreateHnAny(name, title, h1, kTRUE ,
81 static THnSparse* CreateSparse(
const char* name,
const char* title,
82 const THnBase* hn, Int_t chunkSize = 1024 * 16) {
83 return (THnSparse*) CreateHnAny(name, title, hn, kTRUE ,
87 Int_t GetChunkSize()
const {
return fChunkSize; }
88 Int_t GetNChunks()
const {
return fBinContent.GetEntriesFast(); }
90 ROOT::Internal::THnBaseBinIter* CreateIter(Bool_t respectAxisRange)
const;
92 Long64_t GetNbins()
const {
return fFilledBins; }
93 void SetFilledBins(Long64_t nbins) { fFilledBins = nbins; }
95 Long64_t GetBin(
const Int_t* idx)
const {
return const_cast<THnSparse*
>(
this)->GetBin(idx, kFALSE); }
96 Long64_t GetBin(
const Double_t* x)
const {
return const_cast<THnSparse*
>(
this)->GetBin(x, kFALSE); }
97 Long64_t GetBin(
const char* name[])
const {
return const_cast<THnSparse*
>(
this)->GetBin(name, kFALSE); }
98 Long64_t GetBin(
const Int_t* idx, Bool_t allocate = kTRUE);
99 Long64_t GetBin(
const Double_t* x, Bool_t allocate = kTRUE);
100 Long64_t GetBin(
const char* name[], Bool_t allocate = kTRUE);
104 void SetBinContent(
const Int_t* idx, Double_t v) {
105 THnBase::SetBinContent(idx, v);
107 void SetBinContent(Long64_t bin, Double_t v);
108 void SetBinError2(Long64_t bin, Double_t e2);
112 void AddBinContent(
const Int_t* idx, Double_t v = 1.) {
113 THnBase::AddBinContent(idx, v);
115 void AddBinContent(Long64_t bin, Double_t v = 1.);
116 void AddBinError2(Long64_t bin, Double_t e2);
120 Double_t GetBinContent(
const Int_t *idx)
const {
122 return THnBase::GetBinContent(idx);
124 Double_t GetBinContent(Long64_t bin, Int_t* idx = 0)
const;
125 Double_t GetBinError2(Long64_t linidx)
const;
127 Double_t GetSparseFractionBins()
const;
128 Double_t GetSparseFractionMem()
const;
133 TH1D* Projection(Int_t xDim, Option_t* option =
"")
const{
134 return THnBase::Projection(xDim, option);
140 TH2D* Projection(Int_t yDim, Int_t xDim,
141 Option_t* option =
"")
const {
142 return THnBase::Projection(yDim, xDim, option);
148 TH3D* Projection(Int_t xDim, Int_t yDim, Int_t zDim,
149 Option_t* option =
"")
const {
150 return THnBase::Projection(xDim, yDim, zDim, option);
153 THnSparse* Projection(Int_t ndim,
const Int_t* dim,
154 Option_t* option =
"")
const {
155 return (THnSparse*) ProjectionND(ndim, dim, option);
158 THnSparse* Rebin(Int_t group)
const {
159 return (THnSparse*) RebinBase(group);
161 THnSparse* Rebin(
const Int_t* group)
const {
162 return (THnSparse*) RebinBase(group);
165 void Reset(Option_t* option =
"");
168 ClassDef(THnSparse, 3);
205 template <
class CONT>
206 class THnSparseT:
public THnSparse {
209 THnSparseT(
const char* name,
const char* title, Int_t dim,
210 const Int_t* nbins,
const Double_t* xmin = 0,
211 const Double_t* xmax = 0, Int_t chunksize = 1024 * 16):
212 THnSparse(name, title, dim, nbins, xmin, xmax, chunksize) {}
214 TArray* GenerateArray()
const {
return new CONT(GetChunkSize()); }
216 ClassDef(THnSparseT, 1);
219 typedef THnSparseT<TArrayD> THnSparseD;
220 typedef THnSparseT<TArrayF> THnSparseF;
221 typedef THnSparseT<TArrayL> THnSparseL;
222 typedef THnSparseT<TArrayI> THnSparseI;
223 typedef THnSparseT<TArrayS> THnSparseS;
224 typedef THnSparseT<TArrayC> THnSparseC;
227 #endif // ROOT_THnSparse