18 ClassImp(TTreeFormulaManager);
30 TTreeFormulaManager::TTreeFormulaManager() : TObject()
33 fMultiVarDim = kFALSE;
37 for (Int_t i = 0; i < kMAXFORMDIM + 1; i++) {
39 fCumulUsedSizes[i] = 1;
41 fVirtUsedSizes[i] = 1;
43 fCumulUsedVarDims = 0;
49 TTreeFormulaManager::~TTreeFormulaManager()
51 for (
int l = 0; l < kMAXFORMDIM; l++) {
52 if (fVarDims[l])
delete fVarDims[l];
55 if (fCumulUsedVarDims)
delete fCumulUsedVarDims;
61 void TTreeFormulaManager::Remove(TTreeFormula *adding)
63 fFormulas.Remove(adding);
71 void TTreeFormulaManager::Add(TTreeFormula *adding)
73 TTreeFormulaManager *old = adding->fManager;
77 if (fFormulas.FindObject(adding))
return;
79 old->fFormulas.Remove(adding);
80 if (old->fFormulas.GetLast() == -1)
delete adding->fManager;
84 if (adding->TestBit(TTreeFormula::kNeedEntries)) {
85 SetBit(TTreeFormula::kNeedEntries);
88 fFormulas.Add(adding);
89 adding->fManager =
this;
96 void TTreeFormulaManager::AddVarDims(Int_t virt_dim)
98 if (!fVarDims[virt_dim]) fVarDims[virt_dim] =
new TArrayI;
105 void TTreeFormulaManager::CancelDimension(Int_t virt_dim)
107 fCumulUsedSizes[virt_dim] = 0;
113 void TTreeFormulaManager::EnableMultiVarDims()
115 fMultiVarDim = kTRUE;
116 if (!fCumulUsedVarDims) fCumulUsedVarDims =
new TArrayI;
122 Int_t TTreeFormulaManager::GetNdata(Bool_t forceLoadDim)
128 if (fMultiplicity == 0)
return fNdata;
130 if (fMultiplicity == 2)
return fNdata;
135 for (k = 0; k <= kMAXFORMDIM; k++) {
136 fUsedSizes[k] = TMath::Abs(fVirtUsedSizes[k]);
138 for (Int_t i0 = 0; i0 < fVarDims[k]->GetSize(); i0++) {
139 fVarDims[k]->AddAt(0, i0);
143 if (fCumulUsedVarDims) {
144 for (Int_t i0 = 0; i0 < fCumulUsedVarDims->GetSize(); ++i0) {
145 fCumulUsedVarDims->AddAt(0, i0);
149 TTreeFormula *current = 0;
151 Int_t size = fFormulas.GetLast() + 1;
153 for (Int_t i = 0; i < size; i++) {
155 current = (TTreeFormula *)fFormulas.UncheckedAt(i);
156 if (current->fMultiplicity != 1 && !current->fHasCast)
continue;
157 if (!current->LoadCurrentDim()) {
159 for (Int_t j = i + 1; j < size; j++) {
160 current = (TTreeFormula *)fFormulas.UncheckedAt(j);
161 if (current->fMultiplicity != 1 && !current->fHasCast)
continue;
162 current->LoadCurrentDim();
170 if (fMultiplicity == -1) {
172 return fCumulUsedSizes[0];
177 for (k = kMAXFORMDIM; (k >= 0); k--) {
178 if (fUsedSizes[k] >= 0) {
179 overall *= fUsedSizes[k];
180 fCumulUsedSizes[k] = overall;
182 Error(
"GetNdata",
"a dimension is still negative!");
187 if (fCumulUsedVarDims && fUsedSizes[0] > fCumulUsedVarDims->GetSize()) fCumulUsedVarDims->Set(fUsedSizes[0]);
188 for (Int_t i = 0; i < fUsedSizes[0]; i++) {
189 Int_t local_overall = 1;
190 for (k = kMAXFORMDIM; (k > 0); k--) {
192 Int_t index = fVarDims[k]->At(i);
193 if (fCumulUsedVarDims && fCumulUsedVarDims->At(i) == 1 && index) index = 1;
194 if (fUsedSizes[k] == 1 || (index != 1 && index < fUsedSizes[k]))
195 local_overall *= index;
197 local_overall *= fUsedSizes[k];
199 local_overall *= fUsedSizes[k];
204 if (fCumulUsedVarDims->At(i) < 0)
205 fCumulUsedVarDims->AddAt(0, i);
207 fCumulUsedVarDims->AddAt(local_overall, i);
208 overall += local_overall;
219 Bool_t TTreeFormulaManager::Sync()
221 if (!fNeedSync)
return true;
223 TTreeFormula *current = 0;
224 Bool_t hasCast = kFALSE;
229 for (Int_t i = 0; i < fFormulas.GetLast() + 1; i++) {
230 current = (TTreeFormula *)fFormulas.UncheckedAt(i);
232 hasCast |= current->fHasCast;
236 current->ResetDimensions();
237 switch (current->GetMultiplicity()) {
241 case 1: fMultiplicity = 1;
break;
243 if (fMultiplicity != 1) fMultiplicity = 2;
245 default: Error(
"Sync",
"Unexpected case!");
252 fCumulUsedSizes[kMAXFORMDIM] = fUsedSizes[kMAXFORMDIM];
253 for (Int_t k = kMAXFORMDIM; (k > 0); k--) {
254 if (fUsedSizes[k - 1] >= 0) {
255 fCumulUsedSizes[k - 1] = fUsedSizes[k - 1] * fCumulUsedSizes[k];
257 fCumulUsedSizes[k - 1] = -TMath::Abs(fCumulUsedSizes[k]);
263 if (fCumulUsedSizes[0] == 1 && fMultiplicity > 0) {
267 }
else if (fCumulUsedSizes[0] < 0 && fMultiplicity == 2) {
271 }
else if (fMultiplicity == 0 && hasCast) {
275 switch (fMultiplicity) {
276 case 0: fNdata = 1;
break;
277 case 2: fNdata = fCumulUsedSizes[0];
break;
291 void TTreeFormulaManager::UpdateFormulaLeaves()
296 Int_t size = fFormulas.GetLast() + 1;
298 for (Int_t i = 0; i < size; i++) {
300 TTreeFormula *current = (TTreeFormula *)fFormulas.UncheckedAt(i);
301 current->UpdateFormulaLeaves();
308 void TTreeFormulaManager::UpdateUsedSize(Int_t &virt_dim, Int_t vsize)
311 fVirtUsedSizes[virt_dim] = -1 * TMath::Abs(fVirtUsedSizes[virt_dim]);
312 else if (TMath::Abs(fVirtUsedSizes[virt_dim]) == 1 || (vsize < TMath::Abs(fVirtUsedSizes[virt_dim]))) {
317 if (fVirtUsedSizes[virt_dim] < 0) {
318 fVirtUsedSizes[virt_dim] = -1 * vsize;
320 fVirtUsedSizes[virt_dim] = vsize;
323 fUsedSizes[virt_dim] = fVirtUsedSizes[virt_dim];