Belle II Software light-2501-betelgeuse
TrackingMomentumScaleFactors.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/TrackingMomentumScaleFactors.h>
11
12#include <framework/datastore/StoreObjPtr.h>
13#include <framework/core/ModuleParam.templateDetails.h>
14#include <analysis/VariableManager/Manager.h>
15#include <analysis/dataobjects/ParticleList.h>
16
17#include <map>
18#include <TRandom.h>
19#include <Math/Vector4D.h>
20
21using namespace Belle2;
22
23REG_MODULE(TrackingMomentumScaleFactors);
24
26{
28 R"DOC(Module to modify momentum of tracks from the lists. Include in your code as
29
30.. code:: python
31
32 mypath.add_module("TrackingMomentumScaleFactors", particleLists=['pi+:cut'], scale=0.999)
33
34The module modifies the input particleLists by scaling track momenta as given by the parameter scale
35
36 )DOC");
38 // Parameter definitions
39 addParam("particleLists", m_ParticleLists, "input particle lists");
40 addParam("scale", m_scale, "scale factor to be applied to 3-momentum", nan(""));
41 addParam("payloadName", m_payloadName, "ID of table used for reweighing", std::string(""));
42 addParam("scalingFactorName", m_scalingFactorName, "Label for the scale factor in the look up table", std::string(""));
43 addParam("smearingFactorName", m_smearingFactorName, "Label for the smearing factor in the look up table", std::string(""));
44}
45
47{
48 if (!isnan(m_scale) && !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_scale) && 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_scalingFactorName.empty() && !m_smearingFactorName.empty()) {
53 B2FATAL("It's not allowed to provide both a valid value for the scalingFactorName and smearingFactorName. Please set (exactly) one of the two options!");
54 } else if (!m_payloadName.empty()) {
55 m_ParticleWeightingLookUpTable = std::make_unique<DBObjPtr<ParticleWeightingLookUpTable>>(m_payloadName);
56
57 std::vector<std::string> variables = Variable::Manager::Instance().resolveCollections((
58 *m_ParticleWeightingLookUpTable.get())->getAxesNames());
59 for (const auto& i_variable : variables) {
61 if (!var) {
62 B2FATAL("Variable '" << i_variable << "' is not available in Variable::Manager!");
63 }
64 }
65 }
66}
67
69{
70 for (auto& iList : m_ParticleLists) {
71 StoreObjPtr<ParticleList> particleList(iList);
72
73 //check particle List exists and has particles
74 if (!particleList) {
75 B2ERROR("ParticleList " << iList << " not found");
76 continue;
77 }
78
79 size_t nPart = particleList->getListSize();
80 for (size_t iPart = 0; iPart < nPart; iPart++) {
81 auto particle = particleList->getParticle(iPart);
83 }
84 }
85}
86
87
88// Getting LookUp info for given particle in given event
90{
91 std::vector<std::string> variables = Variable::Manager::Instance().resolveCollections((
92 *m_ParticleWeightingLookUpTable.get())->getAxesNames());
93
94 std::map<std::string, double> values;
95 for (const auto& i_variable : variables) {
97 double value = std::get<double>(var->function(particle));
98 values.insert(std::make_pair(i_variable, value));
99 }
100
101 WeightInfo info = (*m_ParticleWeightingLookUpTable.get())->getInfo(values);
102 for (const auto& entry : info) {
103 particle->writeExtraInfo(m_payloadName + "_" + entry.first, entry.second);
104 }
105
106 return particle->getExtraInfo(m_payloadName + "_" + m_scalingFactorName);
107}
108
109
110
112{
113 std::vector<std::string> variables = Variable::Manager::Instance().resolveCollections((
114 *m_ParticleWeightingLookUpTable.get())->getAxesNames());
115
116 std::map<std::string, double> values;
117 for (const auto& i_variable : variables) {
119 double value = std::get<double>(var->function(particle));
120 values.insert(std::make_pair(i_variable, value));
121 }
122
123 WeightInfo info = (*m_ParticleWeightingLookUpTable.get())->getInfo(values);
124 for (const auto& entry : info) {
125 particle->writeExtraInfo(m_payloadName + "_" + entry.first, gRandom->Gaus(1, entry.second));
126 }
127 return particle->getExtraInfo(m_payloadName + "_" + m_smearingFactorName);
128}
129
130
131
133{
134 if (particle->getParticleSource() == Particle::EParticleSourceObject::c_Composite or
135 particle->getParticleSource() == Particle::EParticleSourceObject::c_V0) {
136 for (auto daughter : particle->getDaughters()) {
137 setMomentumScalingFactor(daughter);
138 }
139 double px = 0;
140 double py = 0;
141 double pz = 0;
142 double E = 0;
143 for (auto daughter : particle->getDaughters()) {
144 px += daughter->getPx();
145 py += daughter->getPy();
146 pz += daughter->getPz();
147 E += daughter->getEnergy();
148 }
149 const ROOT::Math::PxPyPzEVector vec(px, py, pz, E);
150 particle->set4Vector(vec);
151 } else if (particle->getParticleSource() == Particle::EParticleSourceObject::c_Track) {
152 if (!isnan(m_scale)) {
154 } else if (!m_scalingFactorName.empty()) {
155 particle->setMomentumScalingFactor(getScalingFactor(particle));
156 } else if (!m_smearingFactorName.empty()) {
157 particle->setMomentumSmearingFactor(getSmearingFactor(particle));
158 }
159 }
160
161
162}
Base class for Modules.
Definition: Module.h:72
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
@ 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
void writeExtraInfo(const std::string &name, const double value)
Sets the user defined extraInfo.
Definition: Particle.cc:1392
void setMomentumScalingFactor(double momentumScalingFactor)
Sets momentum scaling.
Definition: Particle.h:345
std::vector< Belle2::Particle * > getDaughters() const
Returns a vector of pointers to daughter particles.
Definition: Particle.cc:667
void setMomentumSmearingFactor(double momentumSmearingFactor)
Sets momentum smearing.
Definition: Particle.h:355
void set4Vector(const ROOT::Math::PxPyPzEVector &p4)
Sets Lorentz vector.
Definition: Particle.h:282
EParticleSourceObject getParticleSource() const
Returns particle source as defined with enum EParticleSourceObject.
Definition: Particle.h:489
double getExtraInfo(const std::string &name) const
Return given value if set.
Definition: Particle.cc:1373
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.
std::string m_scalingFactorName
Name of the scale factor from table.
std::unique_ptr< DBObjPtr< ParticleWeightingLookUpTable > > m_ParticleWeightingLookUpTable
Pointer to the table in DB.
void setMomentumScalingFactor(Particle *particle)
function to set momentum scaling factor
TrackingMomentumScaleFactorsModule()
Constructor: Sets the description, the properties and the parameters of the module.
double getSmearingFactor(Particle *particle)
Returns the needed smearing factor for particle based on payloadName and smearingFactorName.
std::string m_smearingFactorName
Name of the smear factor from table.
double getScalingFactor(Particle *particle)
Returns the needed scale factor for particle based on payloadName and scalingFactorName.
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.
Definition: ClusterUtils.h:24
A variable returning a floating-point value for a given Particle.
Definition: Manager.h:145