9 #include <analysis/modules/VariablesToEventExtraInfo/VariablesToEventExtraInfoModule.h>
11 #include <framework/logging/Logger.h>
12 #include <framework/core/ModuleParam.templateDetails.h>
13 #include <framework/datastore/StoreArray.h>
20 VariablesToEventExtraInfoModule::VariablesToEventExtraInfoModule()
22 setDescription(
"For each particle in the input list the selected variables are saved in an event-extra-info field with the given name. Can be used to save MC truth information, for example, in a ntuple of reconstructed particles.");
23 setPropertyFlags(c_ParallelProcessingCertified);
25 std::map<std::string, std::string> emptymap;
26 addParam(
"particleList", m_inputListName,
"Name of particle list with reconstructed particles.");
27 addParam(
"variables", m_variables,
28 "Dictionary of variables and extraInfo names to save in the event-extra-info field.\n"
29 "Variables are taken from Variable::Manager, and are identical to those available to e.g. ParticleSelector.",
31 addParam(
"overwrite", m_overwrite,
32 "-1/0/1/2: Overwrite if lower / don't overwrite / overwrite if higher / always overwrite, in case if extra info with given name already exists",
36 VariablesToEventExtraInfoModule::~VariablesToEventExtraInfoModule() =
default;
38 void VariablesToEventExtraInfoModule::initialize()
41 m_inputList.isRequired(m_inputListName);
44 for (
const auto& pair : m_variables) {
47 B2ERROR(
"Variable '" << pair.first <<
"' is not available in Variable::Manager!");
49 m_functions.push_back(var->function);
50 m_extraInfoNames.push_back(pair.second);
56 void VariablesToEventExtraInfoModule::event()
59 B2WARNING(
"Input list " << m_inputList.getName() <<
" was not created?");
63 const unsigned int numParticles = m_inputList->getListSize();
64 for (
unsigned int i = 0; i < numParticles; i++) {
65 Particle* p = m_inputList->getParticle(i);
71 void VariablesToEventExtraInfoModule::addEventExtraInfo(
const Particle* source)
73 if (not m_eventExtraInfo.isValid()) m_eventExtraInfo.create();
75 const unsigned int nVars = m_functions.size();
76 for (
unsigned int iVar = 0; iVar < nVars; iVar++) {
77 double value = std::numeric_limits<double>::quiet_NaN();
78 if (std::holds_alternative<double>(m_functions[iVar](source))) {
79 value = std::get<double>(m_functions[iVar](source));
80 }
else if (std::holds_alternative<int>(m_functions[iVar](source))) {
81 value = std::get<int>(m_functions[iVar](source));
82 }
else if (std::holds_alternative<bool>(m_functions[iVar](source))) {
83 value = std::get<bool>(m_functions[iVar](source));
86 if (m_eventExtraInfo->hasExtraInfo(m_extraInfoNames[iVar])) {
87 double current = m_eventExtraInfo->getExtraInfo(m_extraInfoNames[iVar]);
88 if (m_overwrite == -1) {
90 m_eventExtraInfo->setExtraInfo(m_extraInfoNames[iVar], value);
91 }
else if (m_overwrite == 1) {
93 m_eventExtraInfo->setExtraInfo(m_extraInfoNames[iVar], value);
94 }
else if (m_overwrite == 0) {
95 B2WARNING(
"Extra info with given name " << m_extraInfoNames[iVar] <<
" already set, I won't set it again.");
96 }
else if (m_overwrite == 2) {
97 m_eventExtraInfo->setExtraInfo(m_extraInfoNames[iVar], value);
101 m_eventExtraInfo->addExtraInfo(m_extraInfoNames[iVar], value);
Class to store reconstructed particles.
bool isRequired(const std::string &name="")
Ensure this array/object has been registered previously.
Accessor to arrays stored in the data store.
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Abstract base class for different kinds of events.
A variable returning a floating-point value for a given Particle.