9 #include <analysis/modules/BestCandidateSelection/BestCandidateSelectionModule.h>
11 #include <analysis/utility/ValueIndexPairSorting.h>
13 #include <analysis/VariableManager/Utility.h>
15 #include <framework/logging/Logger.h>
16 #include <framework/utilities/MakeROOTCompatible.h>
25 BestCandidateSelectionModule::BestCandidateSelectionModule():
29 setDescription(R
"DOC(Sort particles by the value of a given ``variable``
30 in the input list and optionally remove particles after the nth position.
32 Per default particles are sorted in descending order but it can be switched to
33 an ascending order by setting ``selectLowest=True``. The convenience functions
34 `modularAnalysis.rankByHighest` and `modularAnalysis.rankByLowest` set this
35 parameter automatically based on their names.
37 Particles will receive an extra-info field containing their rank as an integer
38 starting at 1 (best). The name of this extra-info field defaults to
39 ``${variable}_rank`` but can be chosen freely using the ``outputVariable``
42 The ranking also takes antiparticles into account, so there will only be one
43 B+- candidate with ``rank=1``. The remaining list is sorted from best to worst
44 candidate (each charge, e.g. B+/B-, separately). The sorting is guaranteed
45 to be stable between particle and anti particle list: particles with the same
46 value for ``variable`` will keep their relative order. That is, a particle "A"
47 which was before another particle "B" in the same list and has the same value
48 for ``variable`` will also stay before "B" after sorting.
50 If ``allowMultiRank=False`` (the default) candidates with same value of
51 ``variable`` will have different ranks. If ``allowMultiRank=True`` they will
54 IF ``numBest>0`` only candidates with this rank or better will remain in the
55 output list. If ``allowMultiRank=True`` that means that there can be more than
56 ``numBest`` candidates in the output list if they share ranks.
62 addParam(
"variable",
m_variableName,
"Variable which defines the candidate ranking (see ``selectLowest`` for ordering)");
63 addParam(
"selectLowest",
m_selectLowest,
"If true, candidate with lower values of ``variable`` are better, otherwise higher is better",
false);
65 addParam(
"numBest",
m_numBest,
"Keep only particles with this rank or better. If ``allowMultiRank=False`` this is "
66 "identical to the maximum amount of candidates left in the list. Otherwise there may be more candidates if "
67 "some share the same rank (0: keep all)", 0);
68 addParam(
"cut",
m_cutParameter,
"Only candidates passing the cut will be ranked. The others will have rank -1.", std::string(
""));
70 "Name for created variable, which contains the rank for the particle. If not provided, the standard name ``${variable}_rank`` is used.");
83 B2ERROR(
"Variable '" <<
m_variableName <<
"' is not available in Variable::Manager!");
86 B2ERROR(
"Variable '" <<
m_variableName <<
"' has wrong data type! It must be either double or integer.");
89 B2ERROR(
"value of numBest must be >= 0!");
104 B2WARNING(
"Input list " <<
m_inputList.getName() <<
" was not created?");
109 typedef std::pair<double, unsigned int> ValueIndexPair;
110 std::vector<ValueIndexPair> valueToIndex;
111 const unsigned int numParticles =
m_inputList->getListSize();
112 valueToIndex.reserve(numParticles);
116 if (std::holds_alternative<double>(var_result)) {
117 value = std::get<double>(var_result);
118 }
else if (std::holds_alternative<int>(var_result)) {
119 value = std::get<int>(var_result);
121 valueToIndex.emplace_back(value, p.getArrayIndex());
127 std::stable_sort(valueToIndex.begin(), valueToIndex.end(), ValueIndexPairSorting::lowerPair<ValueIndexPair>);
129 std::stable_sort(valueToIndex.begin(), valueToIndex.end(), ValueIndexPairSorting::higherPair<ValueIndexPair>);
135 double previous_val{0};
136 bool first_candidate{
true};
137 for (
const auto& candidate : valueToIndex) {
139 if (!
m_cut->check(p)) {
144 if (first_candidate) {
145 first_candidate =
false;
154 previous_val = candidate.first;
bool m_allowMultiRank
Give the same rank to candidates with the same value.
virtual void initialize() override
Initialize the module (set up datastore)
virtual void event() override
Process an event.
std::string m_variableName
Variable which defines the candidate ranking.
StoreArray< Particle > m_particles
StoreArray of Particle objects.
bool m_selectLowest
Select the candidate with the lowest value (instead of highest).
virtual ~BestCandidateSelectionModule() override
Destructor.
std::unique_ptr< Variable::Cut > m_cut
cut object which performs the cuts
StoreObjPtr< ParticleList > m_inputList
input particle list
const Variable::Manager::Var * m_variable
Variable which defines the candidate ranking.
std::string m_cutParameter
Selection for candidates to be ranked.
int m_numBest
Number of best candidates to keep.
std::string m_outputVariableName
Name of generated Ranking-Variable, if specified by user.
std::string m_inputListName
name of input particle list.
static std::unique_ptr< GeneralCut > compile(const std::string &cut)
Creates an instance of a cut and returns a unique_ptr to it, if you need a copy-able object instead y...
static std::string makeROOTCompatible(std::string str)
Remove special characters that ROOT dislikes in branch names, e.g.
void setDescription(const std::string &description)
Sets the description of the module.
void setPropertyFlags(unsigned int propertyFlags)
Sets the flags for the module properties.
@ c_ParallelProcessingCertified
This module can be run in parallel processing mode safely (All I/O must be done through the data stor...
Class to store reconstructed particles.
const Var * getVariable(std::string name)
Get the variable belonging to the given key.
static Manager & Instance()
get singleton instance.
void addParam(const std::string &name, T ¶mVariable, const std::string &description, const T &defaultValue)
Adds a new parameter to the module.
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Abstract base class for different kinds of events.
VariableDataType variabletype
data type of variable
FunctionPtr function
Pointer to function.