Belle II Software development
TrackingEnergyLossCorrection.cc
1/**************************************************************************
2 * basf2 (Belle II Analysis Software Framework) *
3 * Author: The Belle II Collaboration *
4 * *
5 * See git log for contributors and copyright holders. *
6 * This file is licensed under LGPL-3.0, see LICENSE.md. *
7 **************************************************************************/
8
9// Own header.
10#include <analysis/modules/TrackingSystematics/TrackingEnergyLossCorrection.h>
11
12#include <framework/datastore/StoreObjPtr.h>
13#include <framework/database/DBObjPtr.h>
14#include <framework/dataobjects/EventMetaData.h>
15#include <framework/core/ModuleParam.templateDetails.h>
16#include <framework/logging/Logger.h>
17
18#include <analysis/VariableManager/Manager.h>
19#include <analysis/dataobjects/Particle.h>
20#include <analysis/dataobjects/ParticleList.h>
21#include <analysis/dbobjects/ParticleWeightingLookUpTable.h>
22
23#include <Math/Vector4D.h>
24
25#include <cmath>
26#include <map>
27
28using namespace Belle2;
29
30REG_MODULE(TrackingEnergyLossCorrection);
31
33{
35 R"DOC(Module to modify Energy of tracks from the lists. Include in your code as
36
37.. code:: python
38
39 mypath.add_module("TrackingEnergyLossCorrection", particleLists=['pi+:cut'], correction=0.001)
40
41The module modifies the input particleLists by subtracting the correction value to the track energy and rescaling the momenta
42
43 )DOC");
45 // Parameter definitions
46 addParam("particleLists", m_ParticleLists, "input particle lists");
47 addParam("correction", m_correction, "correction value to be subtracted from the particle energy",
48 nan("")); // Nan
49 addParam("payloadName", m_payloadName, "ID of table used for reweighing", std::string(""));
50 addParam("correctionName", m_correctionName, "Label for the correction in the look up table", std::string(""));
51}
52
54{
55 if (!std::isnan(m_correction) && !m_payloadName.empty()) {
56 B2FATAL("It's not allowed to provide both a valid value for the scale parameter and a non-empty table name. Please decide for one of the two options!");
57 } else if (std::isnan(m_correction) && m_payloadName.empty()) {
58 B2FATAL("Neither a valid value for the scale parameter nor a non-empty table name was provided. Please set (exactly) one of the two options!");
59 } else if (!m_payloadName.empty()) {
60 m_ParticleWeightingLookUpTable = std::make_unique<DBObjPtr<ParticleWeightingLookUpTable>>(m_payloadName);
61 }
62}
63
65{
66 if (m_ParticleWeightingLookUpTable != nullptr) {
67 if (not(*m_ParticleWeightingLookUpTable.get()).isValid()) {
68 StoreObjPtr<EventMetaData> evt;
69 B2FATAL("There is no valid payload for this run!"
70 << LogVar("payload", m_payloadName)
71 << LogVar("experiment", evt->getExperiment())
72 << LogVar("run", evt->getRun())
73 );
74 }
75
76 std::vector<std::string> variables = Variable::Manager::Instance().resolveCollections((
77 *m_ParticleWeightingLookUpTable.get())->getAxesNames());
78 for (const auto& i_variable : variables) {
80 if (!var) {
81 B2FATAL("Variable '" << i_variable << "' is not available in Variable::Manager!");
82 }
83 }
84 }
85}
86
88{
89 for (auto& iList : m_ParticleLists) {
90 StoreObjPtr<ParticleList> particleList(iList);
91
92 //check particle List exists and has particles
93 if (!particleList) {
94 B2ERROR("ParticleList " << iList << " not found");
95 continue;
96 }
97
98 size_t nPart = particleList->getListSize();
99 for (size_t iPart = 0; iPart < nPart; iPart++) {
100 auto particle = particleList->getParticle(iPart);
101 if (particle->getParticleSource() != Particle::EParticleSourceObject::c_Composite and
102 particle->getParticleSource() != Particle::EParticleSourceObject::c_V0 and
103 particle->getParticleSource() != Particle::EParticleSourceObject::c_Track) {
104 B2WARNING("particle source " << particle->getParticleSource() <<
105 " is not within the expected values. please check before continuing");
106 continue;
108 setEnergyLossCorrection(particle);
109 }
110 }
111}
112
113
114// Getting LookUp info for given particle in given event
116{
117 std::vector<std::string> variables = Variable::Manager::Instance().resolveCollections((
118 *m_ParticleWeightingLookUpTable.get())->getAxesNames());
119
120 std::map<std::string, double> values;
121 for (const auto& i_variable : variables) {
122 const Variable::Manager::Var* var = Variable::Manager::Instance().getVariable(i_variable);
123 double value = std::get<double>(var->function(particle));
124 values.insert(std::make_pair(i_variable, value));
125 }
126 WeightInfo info = (*m_ParticleWeightingLookUpTable.get())->getInfo(values);
127 for (const auto& entry : info) {
128 particle->writeExtraInfo(m_payloadName + "_" + entry.first, entry.second);
129 }
130
131 return particle->getExtraInfo(m_payloadName + "_" + m_correctionName);
132}
133
134
135
137{
138 if (particle->getParticleSource() == Particle::EParticleSourceObject::c_Composite or
139 particle->getParticleSource() == Particle::EParticleSourceObject::c_V0) {
140 for (auto daughter : particle->getDaughters()) {
141 setEnergyLossCorrection(daughter);
142 }
143 double px = 0;
144 double py = 0;
145 double pz = 0;
146 double E = 0;
147 for (auto daughter : particle->getDaughters()) {
148 px += daughter->getPx();
149 py += daughter->getPy();
150 pz += daughter->getPz();
151 E += daughter->getEnergy();
152 }
153 const ROOT::Math::PxPyPzEVector vec(px, py, pz, E);
154 particle->set4Vector(vec);
155 } else if (particle->getParticleSource() == Particle::EParticleSourceObject::c_Track) {
156 if (!std::isnan(m_correction)) {
157 particle->setEnergyLossCorrection(m_correction);
158 } else if (!m_correctionName.empty()) {
159 particle->setEnergyLossCorrection(getCorrectionValue(particle));
160 }
161 }
162
163
164}
R E
internal precision of FFTW codelets
void setDescription(const std::string &description)
Sets the description of the module.
Definition Module.cc:214
void setPropertyFlags(unsigned int propertyFlags)
Sets the flags for the module properties.
Definition Module.cc:208
Module()
Constructor.
Definition Module.cc:30
@ c_ParallelProcessingCertified
This module can be run in parallel processing mode safely (All I/O must be done through the data stor...
Definition Module.h:80
Class to store reconstructed particles.
Definition Particle.h:76
std::vector< std::string > m_ParticleLists
input particle lists
void initialize() override
Initializes the modules and checks the validity of the input parameters.
void event() override
Function to be executed at each event.
double getCorrectionValue(Particle *particle)
Returns the needed correction for particle based on payloadName and correctionName.
TrackingEnergyLossCorrectionModule()
Constructor: Sets the description, the properties and the parameters of the module.
void setEnergyLossCorrection(Particle *particle)
function to set the Energy correction value
std::unique_ptr< DBObjPtr< ParticleWeightingLookUpTable > > m_ParticleWeightingLookUpTable
Pointer to the table in DB.
void beginRun() override
Function to be executed at each beginning of a run.
std::string m_correctionName
Name of the correction from table.
std::vector< std::string > resolveCollections(const std::vector< std::string > &variables)
Resolve Collection Returns variable names corresponding to the given collection or if it is not a col...
Definition Manager.cc:180
const Var * getVariable(std::string name)
Get the variable belonging to the given key.
Definition Manager.cc:58
static Manager & Instance()
get singleton instance.
Definition Manager.cc:26
std::map< std::string, double > WeightInfo
Weight information: a line from the weight lookup table.
void addParam(const std::string &name, T &paramVariable, const std::string &description, const T &defaultValue)
Adds a new parameter to the module.
Definition Module.h:559
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Definition Module.h:649
Abstract base class for different kinds of events.
A variable returning a floating-point value for a given Particle.
Definition Manager.h:146