10#include <analysis/modules/TrackingSystematics/TrackingMomentumScaleFactors.h>
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>
19#include <Math/Vector4D.h>
28 R
"DOC(Module to modify momentum of tracks from the lists. Include in your code as
32 mypath.add_module("TrackingMomentumScaleFactors", particleLists=['pi+:cut'], scale=0.999)
34The module modifies the input particleLists by scaling track momenta as given by the parameter scale
39 addParam(
"scale",
m_scale,
"scale factor to be applied to 3-momentum", nan(
""));
48 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 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 B2FATAL(
"It's not allowed to provide both a valid value for the scalingFactorName and smearingFactorName. Please set (exactly) one of the two options!");
58 for (
const auto& i_variable : variables) {
61 B2FATAL(
"Variable '" << i_variable <<
"' is not available in Variable::Manager!");
74 B2ERROR(
"ParticleList " << iList <<
" not found");
78 size_t nPart = particleList->getListSize();
79 for (
size_t iPart = 0; iPart < nPart; iPart++) {
80 auto particle = particleList->getParticle(iPart);
93 std::map<std::string, double> values;
94 for (
const auto& i_variable : variables) {
96 double value = std::get<double>(var->function(particle));
97 values.insert(std::make_pair(i_variable, value));
101 for (
const auto& entry : info) {
115 std::map<std::string, double> values;
116 for (
const auto& i_variable : variables) {
118 double value = std::get<double>(var->function(particle));
119 values.insert(std::make_pair(i_variable, value));
123 for (
const auto& entry : info) {
124 particle->writeExtraInfo(
m_payloadName +
"_" + entry.first, gRandom->Gaus(1, entry.second));
133 if (particle->getParticleSource() == Particle::EParticleSourceObject::c_Composite or
134 particle->getParticleSource() == Particle::EParticleSourceObject::c_V0) {
135 for (
auto daughter : particle->getDaughters()) {
142 for (
auto daughter : particle->getDaughters()) {
143 px += daughter->getPx();
144 py += daughter->getPy();
145 pz += daughter->getPz();
146 E += daughter->getEnergy();
148 const ROOT::Math::PxPyPzEVector vec(px, py, pz,
E);
149 particle->set4Vector(vec);
150 }
else if (particle->getParticleSource() == Particle::EParticleSourceObject::c_Track) {
152 particle->setMomentumScalingFactor(
m_scale);
void setDescription(const std::string &description)
Sets the description of the module.
Class to store reconstructed particles.
Type-safe access to single objects in the data store.
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::string m_payloadName
Name of the 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 m_scale
input momentum scale modifier
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...
const Var * getVariable(std::string name)
Get the variable belonging to the given key.
static Manager & Instance()
get singleton instance.
std::map< std::string, double > WeightInfo
Weight information: a line from the weight lookup table.
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.
TString getInfo(const TObject *obj)
Get object info HTML (e.g.
Abstract base class for different kinds of events.
A variable returning a floating-point value for a given Particle.