In my tree I have a couple of branches whose names are not legal C++ variable names, such as muplus_cpt_0.10
(and I don’t have any influence on this naming scheme).
When using the new TDataFrame
in C++, this is no problem, since I can e.g. do:
auto isolation = [](double cpt_0_5, double cpt_0_1) { return cpt_0_5 - cpt_0_1; };
auto selected = df.Define("muplus_isolation", isolation, {"muplus_cpt_0.50", "muplus_cpt_0.10"});
However, when using PyROOT, this does not work (no way to do a lambda, or is there?), because I have to use the pure string interface (which JIT compiles the string to be faster), but this fails:
>>> selected = df.Define("muplus_isolation", "muplus_cpt_0.50 - muplus_cpt_0.10")
input_line_81:2:20: error: expected ';' after top level declarator
double muplus_cpt_0.10;
^
;
input_line_81:3:8: error: redefinition of 'muplus_cpt_0'
double muplus_cpt_0.50;
^
input_line_81:2:8: note: previous definition is here
double muplus_cpt_0.10;
^
input_line_81:3:20: error: expected ';' after top level declarator
double muplus_cpt_0.50;
^
;
Traceback (most recent call last):
File "reduce_df.py", line 64, in <module>
reduce_df(sys.argv[1])
File "reduce_df.py", line 36, in reduce_df
.Define("muplus_isolation", "muplus_cpt_0.50 - muplus_cpt_0.10") \
Exception: ROOT::Experimental::TDF::TInterface<ROOT::Detail::TDF::TCustomColumnBase> ROOT::Experimental::TDF::TInterface<ROOT::Detail::TDF::TFilterBase>::Define(experimental::basic_string_view<char,char_traits<char> > name, experimental::basic_string_view<char,char_traits<char> > expression) =>
Cannot declare these variables namespace __tdf_7 {
double muplus_cpt_0.10;
double muplus_cpt_0.50;
}
Interpreter error code is 1. (C++ exception of type runtime_error)