Cut strings and selections
7.1.3. Cut strings and selections#
Cut strings in basf2
analysis scripts work quite intuitively, particularly if you’re comfortable with python logic.
There are some minor differences with respect to ROOT cut strings.
Cut strings are used to manipulate candidates (i.e. ParticleList s) with modularAnalysis.applyCuts
, and modularAnalysis.cutAndCopyList
.
Events selections are applied with modularAnalysis.applyEventCuts
.
Allowed comparisons are <
, <=
, >
, >=
, ==
and !=
.
Two-sided inequalities like 1.2 < M < 1.5
also work as expected.
You can use logical operators and
and or
to combine your cuts into more complex conditions.
Use not
to negate conditional statements.
Square brackets [
, ]
are for grouping conditional statements.
Cut strings support writing formulas in cuts directly. Operator precedences work as expected.
Formulas in conditions can be written freely e.g 0.2 <= dx**2+dy**2 <= 0.7
as one would expect in python.
Common arithmetic operators +
, -
, *
, /
can be used. For the exponentiation operator both **
and ^
are valid.
You can use parenthesis (
)
to group expressions in formulas.
Formulas as arguments for MetaVariables are also supported e.g abs(dx+dy) < 1
.
Cuts supports writing numeric literals of different data types in different formats. Double values can be written in scientific notation.
You can also compare to special values like nan
and inf
. Integer literals can also be given in hexadecimal notation e.g 0xABC
(case insensitive).
Boolean literals can be written in both python True/False
and c++ true/false
style.
Warning
You should not use square brackets [
, ]
for grouping expressions in formulas. Use parenthesis (
)
only.
Hint
Be aware of operator precedence not > and > or
when combining your statements
e.g condition1 and condition2 or condition3
is evaluated equivalent to [condition1 and condition2] or condition3
,
not condition1 and condition2
is evaluated equivalent to [not condition1] and condition2
.
If necessary, square brackets can be used to group conditional statements and apply operators as desired.
Hint
For a more in-depth documentation of cut strings for developers, you can refer to the doxygen documentation
for the GeneralCut
class.
Hint
In previous versions the formula
MetaVariable was needed to support formulas in cuts. This is still supported but not necessary anymore.
This logic can become quite powerful. Here are some examples.
from modularAnalysis import applyEventCuts, fillParticleLists
fillParticleLists([("gamma:allecl", "isFromECL"), ("e+:clusters", "clusterE > 0")], path=mypath)
total_ecl_clusters = "nParticlesInList(gamma:allecl) + nParticlesInList(e+:clusters)"
applyEventCuts(f"[nTracks > 10] and [{total_ecl_clusters} > 4]", path=mypath)
The above example can be made even more readable with the use of variable aliases (VariableManager.addAlias
).
from modularAnalysis import applyEventCuts
from variables import variables as vm
vm.addAlias("totalECLClusters", "nParticlesInList(gamma:all) + nParticlesInList(e+:clusters)")
applyEventCuts("[nTracks > 10] and [totalECLClusters > 4]", path=mypath)