I am using RDataFrame with pyROOT. I was applying a filter in the following way:
rdf = RDataFrame('ttree', 'file')
sel = rdf.Filter('1. < var < 2.')
The problem now was that my resulting histogram
histo = sel.Histo1D('var')
did not just show values of ‘var’ between 1 and 2, as expected, but had not been filtered at all. I believe that the reason for this is that I had not entered valid C++ code for my filter. However, ROOT did not throw an error. If the string in the filter was ‘1 < var < 2’, I did get an error, but changing the ints to floats prevented ROOT from showing them.
interesting riddle
The filter strings, as well as the define ones, are proper C++. What is happening is that your expression is evaluated as follows: (1. < var) < 2. which is always true.
The right string to use is 1. < var && var < .2.
thank you for that explanation! Now I understand, why ROOT gives me that error message, when both bounds are integers. However it does not give me that error, if the right value is a double, as you wrote. Is there a possibility to make ROOT do that? (like typecasting both numbers in the check or similar)
ROOT internally picks your string, which must be valid C++, and constructs a C++ function which is then jitted by ROOT’s interpreter. I think there is not much to do on ROOT’s side while on the other hand, on the user side, there is quite some freedom.