Belle II Software release-09-00-00
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/core/ModuleParam.templateDetails.h>
14#include <framework/core/Environment.h>
15#include <analysis/VariableManager/Manager.h>
16#include <analysis/dataobjects/ParticleList.h>
17
18#include <map>
19#include <TRandom.h>
20#include <Math/Vector4D.h>
21
22using namespace Belle2;
23
24REG_MODULE(TrackingEnergyLossCorrection);
25
27{
29 R"DOC(Module to modify Energy of tracks from the lists. Include in your code as
30
31.. code:: python
32
33 mypath.add_module("TrackingEnergyLossCorrection", particleLists=['pi+:cut'], correction=0.001)
34
35The module modifies the input particleLists by subtracting the correction value to the track energy and rescaling the momenta
36
37 )DOC");
38 // Parameter definitions
39 addParam("particleLists", m_ParticleLists, "input particle lists");
40 addParam("correction", m_correction, "correction value to be subtracted from the particle energy",
41 nan("")); // Nan
42 addParam("payloadName", m_payloadName, "ID of table used for reweighing", std::string(""));
43 addParam("correctionName", m_correctionName, "Label for the correction in the look up table", std::string(""));
44}
45
47{
48 if (!isnan(m_correction) && !m_payloadName.empty()) {
49 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!");
50 } else if (isnan(m_correction) && m_payloadName.empty()) {
51 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!");
52 } else if (!m_payloadName.empty()) {
53 if (Environment::Instance().isMC()) {
54 m_payloadName += "_MC";
55 } else {
56 m_payloadName += "_Data";
57 }
58 m_ParticleWeightingLookUpTable = std::make_unique<DBObjPtr<ParticleWeightingLookUpTable>>(m_payloadName);
59
60 std::vector<std::string> variables = Variable::Manager::Instance().resolveCollections((
61 *m_ParticleWeightingLookUpTable.get())->getAxesNames());
62 for (const auto& i_variable : variables) {
64 if (!var) {
65 B2FATAL("Variable '" << i_variable << "' is not available in Variable::Manager!");
66 }
67 }
68 }
69}
70
72{
73 for (auto& iList : m_ParticleLists) {
74 StoreObjPtr<ParticleList> particleList(iList);
75
76 //check particle List exists and has particles
77 if (!particleList) {
78 B2ERROR("ParticleList " << iList << " not found");
79 continue;
80 }
81
82 size_t nPart = particleList->getListSize();
83 for (size_t iPart = 0; iPart < nPart; iPart++) {
84 auto particle = particleList->getParticle(iPart);
85 if (particle->getParticleSource() != Particle::EParticleSourceObject::c_Composite and
86 particle->getParticleSource() != Particle::EParticleSourceObject::c_V0 and
87 particle->getParticleSource() != Particle::EParticleSourceObject::c_Track) {
88 B2WARNING("particle source " << particle->getParticleSource() <<
89 " is not within the expected values. please check before continuing");
90 continue;
91 }
93 }
94 }
95}
96
97
98// Getting LookUp info for given particle in given event
100{
101 std::vector<std::string> variables = Variable::Manager::Instance().resolveCollections((
102 *m_ParticleWeightingLookUpTable.get())->getAxesNames());
103
104 std::map<std::string, double> values;
105 for (const auto& i_variable : variables) {
107 double value = std::get<double>(var->function(particle));
108 values.insert(std::make_pair(i_variable, value));
109 }
110 WeightInfo info = (*m_ParticleWeightingLookUpTable.get())->getInfo(values);
111 for (const auto& entry : info) {
112 particle->writeExtraInfo(m_payloadName + "_" + entry.first, entry.second);
113 }
114
115 return particle->getExtraInfo(m_payloadName + "_" + m_correctionName);
116}
117
118
119
121{
122 if (particle->getParticleSource() == Particle::EParticleSourceObject::c_Composite or
123 particle->getParticleSource() == Particle::EParticleSourceObject::c_V0) {
124 for (auto daughter : particle->getDaughters()) {
125 setEnergyLossCorrection(daughter);
126 }
127 double px = 0;
128 double py = 0;
129 double pz = 0;
130 double E = 0;
131 for (auto daughter : particle->getDaughters()) {
132 px += daughter->getPx();
133 py += daughter->getPy();
134 pz += daughter->getPz();
135 E += daughter->getEnergy();
136 }
137 const ROOT::Math::PxPyPzEVector vec(px, py, pz, E);
138 particle->set4Vector(vec);
139 } else if (particle->getParticleSource() == Particle::EParticleSourceObject::c_Track) {
140 if (!isnan(m_correction)) {
141 particle->setEnergyLossCorrection(m_correction);
142 } else if (!m_correctionName.empty()) {
143 particle->setEnergyLossCorrection(getCorrectionValue(particle));
144 }
145 }
146
147
148}
R E
internal precision of FFTW codelets
static Environment & Instance()
Static method to get a reference to the Environment instance.
Definition: Environment.cc:28
Base class for Modules.
Definition: Module.h:72
void setDescription(const std::string &description)
Sets the description of the module.
Definition: Module.cc:214
Class to store reconstructed particles.
Definition: Particle.h:75
Type-safe access to single objects in the data store.
Definition: StoreObjPtr.h:96
std::vector< std::string > m_ParticleLists
input particle lists
virtual void initialize() override
Initializes the modules and checks the validity of the input parameters.
virtual 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.
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:179
const Var * getVariable(std::string name)
Get the variable belonging to the given key.
Definition: Manager.cc:57
static Manager & Instance()
get singleton instance.
Definition: Manager.cc:25
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:560
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Definition: Module.h:650
TString getInfo(const TObject *obj)
Get object info HTML (e.g.
Definition: ObjectInfo.cc:55
Abstract base class for different kinds of events.
A variable returning a floating-point value for a given Particle.
Definition: Manager.h:146