44 class TNDArray:
public TObject {
46 TNDArray(): fNdimPlusOne(), fSizes() {}
48 TNDArray(Int_t ndim,
const Int_t* nbins,
bool addOverflow =
false):
49 fNdimPlusOne(), fSizes() {
50 TNDArray::Init(ndim, nbins, addOverflow);
56 virtual void Init(Int_t ndim,
const Int_t* nbins,
bool addOverflow =
false) {
60 fNdimPlusOne = ndim + 1;
61 fSizes =
new Long64_t[ndim + 1];
62 Int_t overBins = addOverflow ? 2 : 0;
64 for (Int_t i = 0; i < ndim; ++i) {
65 fSizes[ndim - i - 1] = fSizes[ndim - i] * (nbins[ndim - i - 1] + overBins);
69 virtual void Reset(Option_t* option =
"") = 0;
71 Int_t GetNdimensions()
const {
return fNdimPlusOne - 1; }
72 Long64_t GetNbins()
const {
return fSizes[0]; }
73 Long64_t GetCellSize(Int_t dim)
const {
return fSizes[dim + 1]; }
75 Long64_t GetBin(
const Int_t* idx)
const {
77 Long64_t bin = idx[fNdimPlusOne - 2];
78 for (Int_t d = 0; d < fNdimPlusOne - 2; ++d) {
79 bin += fSizes[d + 1] * idx[d];
84 virtual Double_t AtAsDouble(ULong64_t linidx)
const = 0;
85 virtual void SetAsDouble(ULong64_t linidx, Double_t value) = 0;
86 virtual void AddAt(ULong64_t linidx, Double_t value) = 0;
89 TNDArray(
const TNDArray&);
90 TNDArray& operator=(
const TNDArray&);
95 ClassDef(TNDArray, 1);
101 TNDArrayRef(
const T* data,
const Long64_t* sizes):
102 fData(data), fSizes(sizes) {}
104 TNDArrayRef<T> operator[] (Int_t idx)
const {
105 if (!fData)
return TNDArrayRef<T>(0, 0);
106 R__ASSERT(idx < fSizes[-1] / fSizes[0] &&
"index out of range!");
107 return TNDArrayRef<T>(fData + idx * fSizes[0], (fSizes[0] == 1) ? 0 : (fSizes + 1));
110 if (!fData)
return T();
111 R__ASSERT(fSizes == 0 &&
"Element operator can only be used on non-array element. Missing an operator[] level?");
117 const Long64_t* fSizes;
118 ClassDefNV(TNDArrayRef, 0);
121 template <
typename T>
122 class TNDArrayT:
public TNDArray {
124 TNDArrayT(): fNumData(), fData() {}
126 TNDArrayT(Int_t ndim,
const Int_t* nbins,
bool addOverflow =
false):
127 TNDArray(ndim, nbins, addOverflow),
128 fNumData(), fData() {
129 fNumData = fSizes[0];
135 void Init(Int_t ndim,
const Int_t* nbins,
bool addOverflow =
false) {
138 TNDArray::Init(ndim, nbins, addOverflow);
139 fNumData = fSizes[0];
142 void Reset(Option_t* =
"") {
147 new (fData) T[fNumData]();
152 TNDArrayRef<T> operator[](Int_t idx)
const {
153 if (!fData)
return TNDArrayRef<T>(0, 0);
154 R__ASSERT(idx < fSizes[0] / fSizes[1] &&
"index out of range!");
155 return TNDArrayRef<T>(fData + idx * fSizes[1], fSizes + 2);
159 T At(
const Int_t* idx)
const {
160 return At(GetBin(idx));
162 T& At(
const Int_t* idx) {
163 return At(GetBin(idx));
165 T At(ULong64_t linidx)
const {
166 if (!fData)
return T();
167 return fData[linidx];
169 T& At(ULong64_t linidx) {
170 if (!fData) fData =
new T[fNumData]();
171 return fData[linidx];
174 Double_t AtAsDouble(ULong64_t linidx)
const {
175 if (!fData)
return 0.;
176 return fData[linidx];
178 void SetAsDouble(ULong64_t linidx, Double_t value) {
179 if (!fData) fData =
new T[fNumData]();
180 fData[linidx] = (T) value;
182 void AddAt(ULong64_t linidx, Double_t value) {
183 if (!fData) fData =
new T[fNumData]();
184 fData[linidx] += (T) value;
190 ClassDef(TNDArrayT, 1);
201 template<>
void TNDArrayT<double>::Streamer(TBuffer &R__b);
202 template<> TClass *TNDArrayT<double>::Class();
205 #endif // ROOT_TNDArray