import ROOT
fill_tree_code = '''
void fill_tree(const char *filename, const char *treeName)
{
TFile f(filename, "RECREATE");
TTree t(treeName, treeName);
double b1;
int b2;
t.Branch("b1", &b1);
t.Branch("b2", &b2);
for (int i = 0; i < 10; ++i) {
b1 = i;
b2 = i * i;
t.Fill();
}
t.Write();
f.Close();
return;
}
'''
fileName = "tdf001_introduction_py.root"
treeName = "myTree"
ROOT.gInterpreter.Declare(fill_tree_code)
ROOT.fill_tree(fileName, treeName)
TDF = ROOT.ROOT.Experimental.TDataFrame
d = TDF(treeName, fileName)
cutb1 = 'b1 < 5.'
cutb1b2 = 'b2 % 2 && b1 < 4.'
entries1 = d.Filter(cutb1) \
.Filter(cutb1b2) \
.Count();
print("%s entries passed all filters" %entries1.GetValue())
entries2 = d.Filter("b1 < 5.").Count();
print("%s entries passed all filters" %entries2.GetValue())
b1b2_cut = d.Filter(cutb1b2)
minVal = b1b2_cut.Min('b1')
maxVal = b1b2_cut.Max('b1')
meanVal = b1b2_cut.Mean('b1')
nonDefmeanVal = b1b2_cut.Mean("b2")
print("The mean is always included between the min and the max: %s <= %s <= %s" %(minVal.GetValue(), meanVal.GetValue(), maxVal.GetValue()))
hist = d.Filter(cutb1).Histo1D('b1')
print("Filled h %s times, mean: %s" %(hist.GetEntries(), hist.GetMean()))
cutb1_result = d.Filter(cutb1);
cutb1b2_result = d.Filter(cutb1b2);
cutb1_cutb1b2_result = cutb1_result.Filter(cutb1b2)
evts_cutb1_result = cutb1_result.Count()
evts_cutb1b2_result = cutb1b2_result.Count()
evts_cutb1_cutb1b2_result = cutb1_cutb1b2_result.Count()
print("Events passing cutb1: %s" %evts_cutb1_result.GetValue())
print("Events passing cutb1b2: %s" %evts_cutb1b2_result.GetValue())
print("Events passing both: %s" %evts_cutb1_cutb1b2_result.GetValue())
entries_sum = d.Define('sum', 'b2 + b1') \
.Filter('sum > 4.2') \
.Count()
print(entries_sum.GetValue())