Hello,
Using this code
[code]
#include
#include
#include “TFile.h”
#include “TTree.h”
#include “TRandom3.h”
#include “TString.h”
#include “TTreeFormula.h”
#include “TTreeFormulaManager.h”
#include “TMath.h”
#ifdef MAKECINT
#pragma link C++ class vector<Int_t>+;
#endif
using namespace std;
void write() {
TFile *f = TFile::Open(“test.root”,“recreate”);
TTree *t = new TTree(“t”,"");
Int_t na = 0, nb = 0;
vector<Int_t> a;
vector<Int_t> b;
t->Branch(“a”, &a);
t->Branch(“b”, &b);
t->Branch(“na”, &na, “na/I”);
t->Branch(“nb”, &nb, “nb/I”);
TRandom3 r;
r.SetSeed(12345678);
for (Int_t i = 0; i < 100; ++i) {
a.clear();
b.clear();
na = r.Integer(10);
nb = r.Integer(10);
for (Int_t j = 0; j < na; ++j) {
a.push_back(r.Integer(100));
}
for (Int_t j = 0; j < nb; ++j) {
b.push_back(r.Integer(100));
}
t->Fill();
}
t->Write();
f->Close();
}
void read() {
TFile *f = TFile::Open(“test.root”,“read”);
TTree *t = (TTree *)f->Get(“t”);
Int_t na = 0, nb = 0;
t->SetBranchAddress(“na”, &na);
t->SetBranchAddress(“nb”, &nb);
TTreeFormula *tfa = new TTreeFormula(“tfa”, “a”, t);
TTreeFormula *tfb = new TTreeFormula(“tfb”, “b”, t);
TTreeFormulaManager *m = new TTreeFormulaManager();
m->Add(tfa);
m->Add(tfb);
m->Sync();
for (Int_t i = 0; i < t->GetEntries(); ++i) {
t->GetEntry(i);
//if (m->GetNdata() != TMath::Min(na, nb))
cout << TString::Format(“i: %3i na: %3i tfaN: %3i nb: %3i tfbN: %3i mN: %3i”,
i, na, tfa->GetNdata(), nb, tfb->GetNdata(), m->GetNdata() ) << endl;
}
}
void test() {
write();
read();
}
#ifndef CINT
int main() {
test();
}
#endif
[/code] I get the following output
i: 0 na: 2 tfaN: 2 nb: 7 tfbN: 2 mN: 2
i: 1 na: 1 tfaN: 3 nb: 3 tfbN: 3 mN: 3
i: 2 na: 3 tfaN: 3 nb: 7 tfbN: 3 mN: 3
i: 3 na: 6 tfaN: 5 nb: 5 tfbN: 5 mN: 5
i: 4 na: 7 tfaN: 2 nb: 2 tfbN: 2 mN: 2
i: 5 na: 4 tfaN: 4 nb: 7 tfbN: 4 mN: 4
i: 6 na: 6 tfaN: 6 nb: 6 tfbN: 6 mN: 6
i: 7 na: 1 tfaN: 7 nb: 7 tfbN: 7 mN: 7
i: 8 na: 0 tfaN: 0 nb: 1 tfbN: 0 mN: 0
i: 9 na: 1 tfaN: 6 nb: 6 tfbN: 6 mN: 6
i: 10 na: 7 tfaN: 7 nb: 8 tfbN: 7 mN: 7
i: 11 na: 3 tfaN: 3 nb: 4 tfbN: 3 mN: 3
i: 12 na: 5 tfaN: 4 nb: 4 tfbN: 4 mN: 4
i: 13 na: 3 tfaN: 3 nb: 3 tfbN: 3 mN: 3
i: 14 na: 2 tfaN: 2 nb: 2 tfbN: 2 mN: 2
i: 15 na: 6 tfaN: 5 nb: 5 tfbN: 5 mN: 5
i: 16 na: 9 tfaN: 5 nb: 5 tfbN: 5 mN: 5
i: 17 na: 2 tfaN: 2 nb: 7 tfbN: 2 mN: 2
i: 18 na: 2 tfaN: 2 nb: 3 tfbN: 2 mN: 2
i: 19 na: 6 tfaN: 6 nb: 7 tfbN: 6 mN: 6
i: 20 na: 0 tfaN: 0 nb: 5 tfbN: 0 mN: 0
i: 21 na: 6 tfaN: 6 nb: 8 tfbN: 6 mN: 6
i: 22 na: 6 tfaN: 2 nb: 2 tfbN: 2 mN: 2
i: 23 na: 0 tfaN: 0 nb: 1 tfbN: 0 mN: 0
i: 24 na: 7 tfaN: 3 nb: 3 tfbN: 3 mN: 3
i: 25 na: 6 tfaN: 6 nb: 9 tfbN: 6 mN: 6
i: 26 na: 8 tfaN: 5 nb: 5 tfbN: 5 mN: 5
i: 27 na: 9 tfaN: 5 nb: 5 tfbN: 5 mN: 5
i: 28 na: 2 tfaN: 2 nb: 9 tfbN: 2 mN: 2
i: 29 na: 6 tfaN: 2 nb: 2 tfbN: 2 mN: 2
i: 30 na: 9 tfaN: 3 nb: 3 tfbN: 3 mN: 3
i: 31 na: 6 tfaN: 6 nb: 6 tfbN: 6 mN: 6
i: 32 na: 1 tfaN: 2 nb: 2 tfbN: 2 mN: 2
i: 33 na: 4 tfaN: 4 nb: 5 tfbN: 4 mN: 4
i: 34 na: 1 tfaN: 6 nb: 6 tfbN: 6 mN: 6
i: 35 na: 0 tfaN: 0 nb: 1 tfbN: 0 mN: 0
i: 36 na: 0 tfaN: 0 nb: 4 tfbN: 0 mN: 0
i: 37 na: 9 tfaN: 0 nb: 0 tfbN: 0 mN: 0
i: 38 na: 0 tfaN: 0 nb: 1 tfbN: 0 mN: 0
i: 39 na: 8 tfaN: 7 nb: 7 tfbN: 7 mN: 7
i: 40 na: 4 tfaN: 4 nb: 9 tfbN: 4 mN: 4
i: 41 na: 0 tfaN: 0 nb: 7 tfbN: 0 mN: 0
i: 42 na: 4 tfaN: 4 nb: 8 tfbN: 4 mN: 4
i: 43 na: 2 tfaN: 2 nb: 7 tfbN: 2 mN: 2
i: 44 na: 4 tfaN: 4 nb: 4 tfbN: 4 mN: 4
i: 45 na: 7 tfaN: 2 nb: 2 tfbN: 2 mN: 2
i: 46 na: 6 tfaN: 4 nb: 4 tfbN: 4 mN: 4
i: 47 na: 0 tfaN: 0 nb: 4 tfbN: 0 mN: 0
i: 48 na: 5 tfaN: 4 nb: 4 tfbN: 4 mN: 4
i: 49 na: 2 tfaN: 2 nb: 7 tfbN: 2 mN: 2
i: 50 na: 9 tfaN: 2 nb: 2 tfbN: 2 mN: 2
i: 51 na: 0 tfaN: 0 nb: 7 tfbN: 0 mN: 0
i: 52 na: 6 tfaN: 6 nb: 7 tfbN: 6 mN: 6
i: 53 na: 8 tfaN: 1 nb: 1 tfbN: 1 mN: 1
i: 54 na: 4 tfaN: 4 nb: 8 tfbN: 4 mN: 4
i: 55 na: 4 tfaN: 4 nb: 9 tfbN: 4 mN: 4
i: 56 na: 7 tfaN: 3 nb: 3 tfbN: 3 mN: 3
i: 57 na: 5 tfaN: 5 nb: 7 tfbN: 5 mN: 5
i: 58 na: 5 tfaN: 3 nb: 3 tfbN: 3 mN: 3
i: 59 na: 1 tfaN: 4 nb: 4 tfbN: 4 mN: 4
i: 60 na: 1 tfaN: 9 nb: 9 tfbN: 9 mN: 9
i: 61 na: 4 tfaN: 0 nb: 0 tfbN: 0 mN: 0
i: 62 na: 8 tfaN: 7 nb: 7 tfbN: 7 mN: 7
i: 63 na: 2 tfaN: 2 nb: 8 tfbN: 2 mN: 2
i: 64 na: 9 tfaN: 9 nb: 9 tfbN: 9 mN: 9
i: 65 na: 1 tfaN: 4 nb: 4 tfbN: 4 mN: 4
i: 66 na: 6 tfaN: 6 nb: 7 tfbN: 6 mN: 6
i: 67 na: 5 tfaN: 5 nb: 9 tfbN: 5 mN: 5
i: 68 na: 8 tfaN: 4 nb: 4 tfbN: 4 mN: 4
i: 69 na: 9 tfaN: 7 nb: 7 tfbN: 7 mN: 7
i: 70 na: 2 tfaN: 2 nb: 9 tfbN: 2 mN: 2
i: 71 na: 1 tfaN: 7 nb: 7 tfbN: 7 mN: 7
i: 72 na: 6 tfaN: 4 nb: 4 tfbN: 4 mN: 4
i: 73 na: 3 tfaN: 2 nb: 2 tfbN: 2 mN: 2
i: 74 na: 9 tfaN: 8 nb: 8 tfbN: 8 mN: 8
i: 75 na: 2 tfaN: 2 nb: 7 tfbN: 2 mN: 2
i: 76 na: 5 tfaN: 1 nb: 1 tfbN: 1 mN: 1
i: 77 na: 2 tfaN: 2 nb: 5 tfbN: 2 mN: 2
i: 78 na: 0 tfaN: 0 nb: 8 tfbN: 0 mN: 0
i: 79 na: 5 tfaN: 1 nb: 1 tfbN: 1 mN: 1
i: 80 na: 5 tfaN: 3 nb: 3 tfbN: 3 mN: 3
i: 81 na: 6 tfaN: 6 nb: 8 tfbN: 6 mN: 6
i: 82 na: 2 tfaN: 2 nb: 2 tfbN: 2 mN: 2
i: 83 na: 1 tfaN: 8 nb: 8 tfbN: 8 mN: 8
i: 84 na: 3 tfaN: 2 nb: 2 tfbN: 2 mN: 2
i: 85 na: 0 tfaN: 0 nb: 0 tfbN: 0 mN: 0
i: 86 na: 0 tfaN: 0 nb: 0 tfbN: 0 mN: 0
i: 87 na: 0 tfaN: 0 nb: 9 tfbN: 0 mN: 0
i: 88 na: 3 tfaN: 0 nb: 0 tfbN: 0 mN: 0
i: 89 na: 3 tfaN: 3 nb: 5 tfbN: 3 mN: 3
i: 90 na: 6 tfaN: 5 nb: 5 tfbN: 5 mN: 5
i: 91 na: 6 tfaN: 2 nb: 2 tfbN: 2 mN: 2
i: 92 na: 0 tfaN: 0 nb: 1 tfbN: 0 mN: 0
i: 93 na: 6 tfaN: 2 nb: 2 tfbN: 2 mN: 2
i: 94 na: 1 tfaN: 3 nb: 3 tfbN: 3 mN: 3
i: 95 na: 3 tfaN: 3 nb: 9 tfbN: 3 mN: 3
i: 96 na: 8 tfaN: 7 nb: 7 tfbN: 7 mN: 7
i: 97 na: 8 tfaN: 8 nb: 9 tfbN: 8 mN: 8
i: 98 na: 9 tfaN: 6 nb: 6 tfbN: 6 mN: 6
i: 99 na: 9 tfaN: 4 nb: 4 tfbN: 4 mN: 4
With uncommented " if (m->GetNdata() != TMath::Min(na, nb)) " row the output is
i: 1 na: 1 tfaN: 3 nb: 3 tfbN: 3 mN: 3
i: 7 na: 1 tfaN: 7 nb: 7 tfbN: 7 mN: 7
i: 9 na: 1 tfaN: 6 nb: 6 tfbN: 6 mN: 6
i: 32 na: 1 tfaN: 2 nb: 2 tfbN: 2 mN: 2
i: 34 na: 1 tfaN: 6 nb: 6 tfbN: 6 mN: 6
i: 59 na: 1 tfaN: 4 nb: 4 tfbN: 4 mN: 4
i: 60 na: 1 tfaN: 9 nb: 9 tfbN: 9 mN: 9
i: 65 na: 1 tfaN: 4 nb: 4 tfbN: 4 mN: 4
i: 71 na: 1 tfaN: 7 nb: 7 tfbN: 7 mN: 7
i: 83 na: 1 tfaN: 8 nb: 8 tfbN: 8 mN: 8
i: 94 na: 1 tfaN: 3 nb: 3 tfbN: 3 mN: 3
and it is just each row with na == 1.
Without adding to manager tfa->GetNdata() is equal to na, and so for tfb and nb.
If I swap “m->Add(tfa);” and “m->Add(tfb);” rows, output becomes (with uncommented " if (m->GetNdata() != TMath::Min(na, nb)) ")
i: 53 na: 8 tfaN: 8 nb: 1 tfbN: 8 mN: 8
i: 76 na: 5 tfaN: 5 nb: 1 tfbN: 5 mN: 5
i: 79 na: 5 tfaN: 5 nb: 1 tfbN: 5 mN: 5
which again just each row with (now) nb == 1.
It does not seem to me that it is expected behavior.
It is same with
root -l test.cxx+
and g++ `root-config --cflags --libs` -lTreePlayer test.cxx -o test
, both on ROOT versions 5.34/34 and /24, both on g++ versions 4.9.2 and 4.4.7, both on Debian 8.0 and Scientific Linux 6.7. So it is obviously ROOTs own behaviour.
Since I have to use ROOT v5.34/24 with g++ 4.4.7, bugfix will not be very helpful for me just now, so I would like to know a workaround how to make TTreeFormulaManager::GetNdata() give me the real minimum of all TTreeFormula::GetNdata(). Maybe a small class derived from TTreeFormulaManager with overloaded Sync() or GetNdata() function, but keeping all other functionality.