22 struct CounterRange_t {
35 class THnBinIter:
public ROOT::Internal::THnBaseBinIter {
37 THnBinIter(Int_t dim,
const TObjArray* axes,
const TNDArray* arr,
38 Bool_t respectAxisRange);
39 ~THnBinIter() {
delete [] fCounter; }
41 Long64_t Next(Int_t* coord = 0);
42 Int_t GetCoord(Int_t dim)
const {
return fCounter[dim].i; }
44 THnBinIter(
const THnBinIter&);
45 THnBinIter& operator=(
const THnBinIter&);
50 const TNDArray* fArray;
51 CounterRange_t* fCounter;
58 THnBinIter::THnBinIter(Int_t dim,
const TObjArray* axes,
59 const TNDArray* arr, Bool_t respectAxisRange):
60 ROOT::Internal::THnBaseBinIter(respectAxisRange),
61 fNdimensions(dim), fIndex(-1), fArray(arr) {
62 fCounter =
new CounterRange_t[dim]();
63 for (Int_t i = 0; i < dim; ++i) {
64 TAxis *axis = (TAxis*) axes->At(i);
65 fCounter[i].len = axis->GetNbins() + 2;
66 fCounter[i].cellSize = arr->GetCellSize(i);
67 if (!respectAxisRange || !axis->TestBit(TAxis::kAxisRange)) {
68 fCounter[i].first = 0;
69 fCounter[i].last = fCounter[i].len - 1;
73 fHaveSkippedBin = kTRUE;
74 Int_t min = axis->GetFirst();
75 Int_t max = axis->GetLast();
76 if (min == 0 && max == 0) {
81 max = axis->GetNbins();
83 fCounter[i].first = min;
84 fCounter[i].last = max;
86 fIndex += fCounter[i].first * fCounter[i].cellSize;
89 --fCounter[dim - 1].i;
96 Long64_t THnBinIter::Next(Int_t* coord ) {
97 if (fNdimensions < 0)
return -1;
98 ++fCounter[fNdimensions - 1].i;
101 for (Int_t d = fNdimensions - 1; d > 0 && fCounter[d].i > fCounter[d].last; --d) {
103 Int_t skippedCells = fCounter[d].len - (fCounter[d].last + 1);
104 skippedCells += fCounter[d].first;
105 fIndex += skippedCells * fCounter[d].cellSize;
106 fCounter[d].i = fCounter[d].first;
109 if (fCounter[0].i > fCounter[0].last) {
114 for (Int_t d = 0; d < fNdimensions; ++d) {
115 coord[d] = fCounter[d].i;
184 THn::THn(
const char* name,
const char* title,
185 Int_t dim,
const Int_t* nbins,
186 const Double_t* xmin,
const Double_t* xmax):
187 THnBase(name, title, dim, nbins, xmin, xmax),
188 fSumw2(dim, nbins, kTRUE ),
204 ROOT::Internal::THnBaseBinIter* THn::CreateIter(Bool_t respectAxisRange)
const
206 return new THnBinIter(GetNdimensions(), GetListOfAxes(), &GetArray(),
214 if (!GetCalculateErrors()) {
218 TNDArray & content = GetArray();
219 Long64_t nbins = GetNbins();
220 for (Long64_t ibin = 0; ibin < nbins; ++ibin)
221 fSumw2.At(ibin) = content.AtAsDouble(ibin);
229 void THn::AllocCoordBuf()
const
231 fCoordBuf =
new Int_t[fNdimensions]();
237 void THn::InitStorage(Int_t* nbins, Int_t )
239 fCoordBuf =
new Int_t[fNdimensions]();
240 GetArray().Init(fNdimensions, nbins,
true );
241 fSumw2.Init(fNdimensions, nbins,
true );
247 void THn::Reset(Option_t* option )
249 GetArray().Reset(option);
250 fSumw2.Reset(option);