ROOT Version: Not Provided
Platform: Not Provided
Compiler: Not Provided
Hello,
is there any way to do something like this :
x , y : tree branches variables
TCut cut(x*y<1);
TTreeReader loop:
while(R.next){
if (cut.IsPass()) do something
}
Any idea is welcome,
Thank you!
Hi @panagiotis_bellos,
with TTreeReader you don’t really need to use a TCut, you can directly write (not tested but should give you the idea):
TFile f("f.root");
TTreeReader r("tree", &f);
TTreeReaderValue<float> x_reader(r, "x");
TTreeReaderValue<float> y_reader(r, "y");
while(r.Next()) {
float x = *x_reader;
float y = *y_reader;
if (x * y < 1)
do_something();
}
If you have ROOT v6.14 (latest release), RDataFrame offers a nicer syntax to accomplish pretty much the same thing:
ROOT::RDataFrame df("tree", "f.root");
df.Filter("x*y < 1").Foreach(do_something);
where do_something is the name of some function that you want to execute for each event that passes the filter. More RDF tutorials here.
If you really have to use a TCut object in conjuction with a TTreeReader: I don’t think there is a direct way to do that, but you should be able to produce a TEntryList from a TCut using TTree::Draw and then you can use the TEntryList with TTreeReader.
Cheers,
Enrico
Hi Enrico,
thanks for your reply. Actually I would like to create an array of cuts and apply them through an iteration. It is much more flexible than changing them inside the reader loop each time. I tried to find out how the TCut works in the TTree->Draw() function but is seems quite complex.
The RDataFrame solution seems to be very convenient.
cheers,
Panagiotis
Hi,
note that the strings passed to RDataFrame must be valid C++ code, they do not follow any other special syntax other than the fact that you can use branch names as variables. But yes, in general RDataFrame is pretty flexible.
Using TTree::Draw to fill a TEntryList is actually quite simple: tree.Draw(">>yplus","y>0") fills a TEntryList called yplus with the entries for which y > 0 is true. You can read more at the TTree::Draw docs (search for " Saving the result of Draw to a TEventList, a TEntryList or a TEntryListArray").
Cheers,
Enrico