9 #include <analysis/utility/PCmsLabTransform.h>
11 #include <analysis/modules/EventKinematics/EventKinematicsModule.h>
13 #include <analysis/dataobjects/ParticleList.h>
14 #include <analysis/dataobjects/Particle.h>
16 #include <framework/logging/Logger.h>
17 #include <framework/gearbox/Const.h>
36 setDescription(
"Module to compute global event kinematic attributes like missing momentum and energy.");
39 addParam(
"particleLists", m_particleLists,
"List of the ParticleLists", vector<string>());
40 addParam(
"usingMC", m_usingMC,
"is built using generated particles",
false);
44 EventKinematicsModule::~EventKinematicsModule() =
default;
46 void EventKinematicsModule::initialize()
48 auto arrayName = (!m_usingMC) ?
"EventKinematics" :
"EventKinematicsFromMC";
49 m_eventKinematics.registerInDataStore(arrayName);
53 void EventKinematicsModule::event()
55 if (!m_eventKinematics) m_eventKinematics.construct(m_usingMC);
56 EventKinematicsModule::getParticleMomentumLists(m_particleLists);
58 TVector3 missingMomentum = EventKinematicsModule::getMissingMomentum();
59 m_eventKinematics->addMissingMomentum(missingMomentum);
61 TVector3 missingMomentumCMS = EventKinematicsModule::getMissingMomentumCMS();
62 m_eventKinematics->addMissingMomentumCMS(missingMomentumCMS);
64 float missingEnergyCMS = EventKinematicsModule::getMissingEnergyCMS();
65 m_eventKinematics->addMissingEnergyCMS(missingEnergyCMS);
67 float missingMass2 = missingEnergyCMS * missingEnergyCMS - missingMomentumCMS.Mag() * missingMomentumCMS.Mag();
68 m_eventKinematics->addMissingMass2(missingMass2);
70 float visibleEnergyCMS = EventKinematicsModule::getVisibleEnergyCMS();
71 m_eventKinematics->addVisibleEnergyCMS(visibleEnergyCMS);
73 float totalPhotonsEnergy = EventKinematicsModule::getTotalPhotonsEnergy();
74 m_eventKinematics->addTotalPhotonsEnergy(totalPhotonsEnergy);
77 void EventKinematicsModule::terminate()
81 void EventKinematicsModule::getParticleMomentumLists(vector<string> particleLists)
85 m_particleMomentumList.clear();
86 m_photonsMomentumList.clear();
87 m_particleMomentumListCMS.clear();
89 int nParticleLists = particleLists.size();
90 B2DEBUG(10,
"Number of ParticleLists to calculate Event Kinematics variables: " << nParticleLists);
92 for (
int i_pl = 0; i_pl != nParticleLists; ++i_pl) {
93 string particleListName = particleLists[i_pl];
94 B2DEBUG(10,
"ParticleList: " << particleListName);
96 int m_part = plist->getListSize();
97 for (
int i = 0; i < m_part; i++) {
98 const Particle* part = plist->getParticle(i);
99 if (part->getParticleSource() == Particle::EParticleSourceObject::c_MCParticle and !m_usingMC) {
100 B2FATAL(
"EventKinematics received MCParticles as an input, but usingMC flag is false");
102 if (part->getParticleSource() != Particle::EParticleSourceObject::c_MCParticle and m_usingMC) {
103 B2FATAL(
"EventKinematics received reconstructed Particles as an input, but usingMC flag is true");
106 TLorentzVector p_lab = part->get4Vector();
107 m_particleMomentumList.push_back(p_lab);
109 if ((part->getParticleSource() == Particle::EParticleSourceObject::c_ECLCluster or
110 part->getParticleSource() == Particle::EParticleSourceObject::c_MCParticle)
111 and (part->getPDGCode() == Const::photon.getPDGCode()))
112 m_photonsMomentumList.push_back(p_lab);
115 m_particleMomentumListCMS.push_back(p_cms);
122 TVector3 EventKinematicsModule::getMissingMomentum()
126 TVector3 p = beam.Vect();
127 int nParticles = m_particleMomentumList.size();
128 for (
int i = 0; i < nParticles; ++i) {
129 p -= m_particleMomentumList.at(i).Vect();
134 TVector3 EventKinematicsModule::getMissingMomentumCMS()
136 TVector3 p(0., 0., 0.);
137 int nParticles = m_particleMomentumListCMS.size();
138 for (
int i = 0; i < nParticles; ++i) {
139 p -= m_particleMomentumListCMS.at(i).Vect();
144 float EventKinematicsModule::getMissingEnergyCMS()
148 int nParticles = m_particleMomentumListCMS.size();
149 for (
int i = 0; i < nParticles; ++i) {
150 ECMS -= m_particleMomentumListCMS.at(i).E();
155 float EventKinematicsModule::getVisibleEnergyCMS()
157 float visibleE = 0.0;
158 int nParticles = m_particleMomentumListCMS.size();
159 for (
int i = 0; i < nParticles; ++i) {
160 visibleE += m_particleMomentumListCMS.at(i).E();
165 float EventKinematicsModule::getTotalPhotonsEnergy()
167 float photonsEnergy = 0.0;
168 int nParticles = m_photonsMomentumList.size();
169 for (
int i = 0; i < nParticles; ++i) {
170 photonsEnergy += m_photonsMomentumList.at(i).E();
172 return photonsEnergy;
Module to compute global quantities related to the event kinematics, like total missing energy and ma...
Class for collecting variables related to the global kinematics of the event.
Class to store reconstructed particles.
Type-safe access to single objects 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.