Hi,
I tried using RDataFrame in PyROOT using ROOT 6.14.04.
Running on lxplus using: ’ lsetup “root 6.14” ’
My code:
import ROOT
datatree = ROOT.TChain("trees_SRDV_")
datatree.Add("path/trees.root")
cut_volume = "DV_rxy<=300 && DV_rxy>10"
cut_quality = "DV_m<2.5 && DV_chisqPerDoF<3"
cut_kShort = "(DV_m>0.52 || DV_m<0.47 || DV_nTracks>2)"
rdf = ROOT.RDataFrame(datatree)
rdf2 = rdf.Filter(cut_volume,"Fiducial Volume").Filter(cut_quality,"Quality").Filter(cut_kShort, "K_short")
rep = rdf.Report()
rep.Print()
When running this the code crashes on the line “rep.Report()” However, the issue lies in rdf2.Filter() as it runs fine if this is commented away. Notice that the report is not based on the unfiltered rdf. Here is the output from running the code:
In file included from /mnt/build/jenkins/workspace/lcg_release_tar/BUILDTYPE/Release/COMPILER/gcc62binutils/LABEL/slc6/build/projects/ROOT-6.14.04/src/ROOT-6.14.04-build/input_line_12:21:
In file included from /cvmfs/sft.cern.ch/lcg/releases/ROOT/6.14.04-0d8dc/x86_64-slc6-gcc62-opt/etc/../etc/dictpch/allHeaders.h:688:
In file included from /cvmfs/sft.cern.ch/lcg/releases/ROOT/6.14.04-0d8dc/x86_64-slc6-gcc62-opt/etc/../include/TTreeAsFlatMatrix.h:17:
In file included from /cvmfs/sft.cern.ch/lcg/releases/ROOT/6.14.04-0d8dc/x86_64-slc6-gcc62-opt/etc/../include/ROOT/RDataFrame.hxx:26:
In file included from /cvmfs/sft.cern.ch/lcg/releases/ROOT/6.14.04-0d8dc/x86_64-slc6-gcc62-opt/include/ROOT/RDFInterface.hxx:32:
/cvmfs/sft.cern.ch/lcg/releases/ROOT/6.14.04-0d8dc/x86_64-slc6-gcc62-opt/etc/../include/ROOT/RDFInterfaceUtils.hxx:210:4: error: static_assert failed "filter functions must return a bool"
static_assert(std::is_same<FilterRet_t, bool>::value, "filter functions must return a bool");
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/cvmfs/sft.cern.ch/lcg/releases/ROOT/6.14.04-0d8dc/x86_64-slc6-gcc62-opt/etc/../include/ROOT/RDFInterfaceUtils.hxx:296:17: note: in instantiation of function template specialization 'ROOT::Internal::RDF::CheckFilter<(lambda at input_line_84:2:39)>' requested
here
RDFInternal::CheckFilter(f);
^
input_line_84:2:23: note: in instantiation of function template specialization 'ROOT::Internal::RDF::JitFilterHelper<(lambda at input_line_84:2:39),
ROOT::Detail::RDF::RLoopManager>' requested here
ROOT::Internal::RDF::JitFilterHelper([](ROOT::VecOps::RVec<double>& DV_rxy){return DV_rxy<=300 && DV_rxy>10
^
In file included from /mnt/build/jenkins/workspace/lcg_release_tar/BUILDTYPE/Release/COMPILER/gcc62binutils/LABEL/slc6/build/projects/ROOT-6.14.04/src/ROOT-6.14.04-build/input_line_12:21:
In file included from /cvmfs/sft.cern.ch/lcg/releases/ROOT/6.14.04-0d8dc/x86_64-slc6-gcc62-opt/etc/../etc/dictpch/allHeaders.h:688:
In file included from /cvmfs/sft.cern.ch/lcg/releases/ROOT/6.14.04-0d8dc/x86_64-slc6-gcc62-opt/etc/../include/TTreeAsFlatMatrix.h:17:
In file included from /cvmfs/sft.cern.ch/lcg/releases/ROOT/6.14.04-0d8dc/x86_64-slc6-gcc62-opt/etc/../include/ROOT/RDataFrame.hxx:26:
In file included from /cvmfs/sft.cern.ch/lcg/releases/ROOT/6.14.04-0d8dc/x86_64-slc6-gcc62-opt/include/ROOT/RDFInterface.hxx:32:
In file included from /cvmfs/sft.cern.ch/lcg/releases/ROOT/6.14.04-0d8dc/x86_64-slc6-gcc62-opt/etc/../include/ROOT/RDFInterfaceUtils.hxx:18:
/cvmfs/sft.cern.ch/lcg/releases/ROOT/6.14.04-0d8dc/x86_64-slc6-gcc62-opt/etc/../include/ROOT/RDFNodes.hxx:673:14: error: no viable conversion from returned value of type 'ROOT::VecOps::RVec<int>' to function return type 'bool'
return fFilter(std::get<S>(fValues[slot]).Get(entry)...);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/cvmfs/sft.cern.ch/lcg/releases/ROOT/6.14.04-0d8dc/x86_64-slc6-gcc62-opt/etc/../include/ROOT/RDFNodes.hxx:661:27: note: in instantiation of function template specialization 'ROOT::Detail::RDF::RFilter<(lambda at input_line_84:2:39),
ROOT::Detail::RDF::RLoopManager>::CheckFilterHelper<0>' requested here
auto passed = CheckFilterHelper(slot, entry, TypeInd_t());
^
/cvmfs/sft.cern.ch/lcg/releases/ROOT/6.14.04-0d8dc/x86_64-slc6-gcc62-opt/etc/../include/ROOT/RDFNodes.hxx:644:4: note: in instantiation of member function 'ROOT::Detail::RDF::RFilter<(lambda at input_line_84:2:39),
ROOT::Detail::RDF::RLoopManager>::CheckFilters' requested here
RFilter(FilterF &&f, const ColumnNames_t &bl, PrevDataFrame &pd, std::string_view name = "")
Just running datatree.Draw("DV_rxy, cut_x)
produces the expected result.
Cheers
Filip