Belle II Software  release-05-01-25
EventKinematicsModule.cc
1 /**************************************************************************
2  * BASF2 (Belle Analysis Framework 2) *
3  * Copyright(C) 2018 - Belle II Collaboration *
4  * *
5  * Author: The Belle II Collaboration *
6  * Contributors: Michel Villanueva, Ami Rostomyan, Jorge Martinez *
7  * *
8  * This software is provided "as is" without any warranty. *
9  **************************************************************************/
10 
11 #include <analysis/utility/PCmsLabTransform.h>
12 
13 #include <analysis/modules/EventKinematics/EventKinematicsModule.h>
14 
15 #include <analysis/dataobjects/ParticleList.h>
16 #include <analysis/dataobjects/Particle.h>
17 #include <analysis/dataobjects/EventKinematics.h>
18 
19 #include <framework/datastore/StoreObjPtr.h>
20 
21 #include <framework/logging/Logger.h>
22 #include <framework/gearbox/Const.h>
23 
24 #include <iostream>
25 
26 using namespace std;
27 using namespace Belle2;
28 
29 //-----------------------------------------------------------------
30 // Register the Module
31 //-----------------------------------------------------------------
33 
34 //-----------------------------------------------------------------
35 // Implementation
36 //-----------------------------------------------------------------
37 
39 {
40  // Set module properties
41  setDescription("Module to compute global event kinematic attributes like missing momentum and energy.");
42 
43  // Parameter definitions
44  addParam("particleLists", m_particleLists, "List of the ParticleLists", vector<string>());
45 
46 }
47 
48 EventKinematicsModule::~EventKinematicsModule() = default;
49 
50 void EventKinematicsModule::initialize()
51 {
52  StoreObjPtr<EventKinematics> evtKinematics;
53  evtKinematics.registerInDataStore();
54 
55 }
56 
57 void EventKinematicsModule::beginRun()
58 {
59 }
60 
61 void EventKinematicsModule::event()
62 {
63  StoreObjPtr<EventKinematics> eventKinematics;
64  if (!eventKinematics) eventKinematics.create();
65  EventKinematicsModule::getParticleMomentumLists(m_particleLists);
66 
67  TVector3 missingMomentum = EventKinematicsModule::getMissingMomentum();
68  eventKinematics->addMissingMomentum(missingMomentum);
69 
70  TVector3 missingMomentumCMS = EventKinematicsModule::getMissingMomentumCMS();
71  eventKinematics->addMissingMomentumCMS(missingMomentumCMS);
72 
73  float missingEnergyCMS = EventKinematicsModule::getMissingEnergyCMS();
74  eventKinematics->addMissingEnergyCMS(missingEnergyCMS);
75 
76  float missingMass2 = missingEnergyCMS * missingEnergyCMS - missingMomentumCMS.Mag() * missingMomentumCMS.Mag();
77  eventKinematics->addMissingMass2(missingMass2);
78 
79  float visibleEnergyCMS = EventKinematicsModule::getVisibleEnergyCMS();
80  eventKinematics->addVisibleEnergyCMS(visibleEnergyCMS);
81 
82  float totalPhotonsEnergy = EventKinematicsModule::getTotalPhotonsEnergy();
83  eventKinematics->addTotalPhotonsEnergy(totalPhotonsEnergy);
84 }
85 
86 void EventKinematicsModule::endRun()
87 {
88 }
89 
90 void EventKinematicsModule::terminate()
91 {
92 }
93 
94 void EventKinematicsModule::getParticleMomentumLists(vector<string> particleLists)
95 {
97 
98  m_particleMomentumList.clear();
99  m_photonsMomentumList.clear();
100  m_particleMomentumListCMS.clear();
101 
102  int nParticleLists = particleLists.size();
103  B2DEBUG(10, "Number of ParticleLists to calculate Event Kinematics variables: " << nParticleLists);
104 
105  for (int i_pl = 0; i_pl != nParticleLists; ++i_pl) {
106  string particleListName = particleLists[i_pl];
107  B2DEBUG(10, "ParticleList: " << particleListName);
108  StoreObjPtr<ParticleList> plist(particleListName);
109  int m_part = plist->getListSize();
110  for (int i = 0; i < m_part; i++) {
111  const Particle* part = plist->getParticle(i);
112 
113  TLorentzVector p_lab = part->get4Vector();
114  m_particleMomentumList.push_back(p_lab);
115 
116  if ((part->getParticleSource() == Particle::EParticleSourceObject::c_ECLCluster)
117  and (part->getPDGCode() == Const::photon.getPDGCode()))
118  m_photonsMomentumList.push_back(p_lab);
119 
120  TLorentzVector p_cms = T.rotateLabToCms() * p_lab;
121  m_particleMomentumListCMS.push_back(p_cms);
122  }
123  }
124  return;
125 }
126 
127 
128 TVector3 EventKinematicsModule::getMissingMomentum()
129 {
131  TLorentzVector beam = T.getBeamFourMomentum();
132  TVector3 p = beam.Vect();
133  int nParticles = m_particleMomentumList.size();
134  for (int i = 0; i < nParticles; ++i) {
135  p -= m_particleMomentumList.at(i).Vect();
136  }
137  return p;
138 }
139 
140 TVector3 EventKinematicsModule::getMissingMomentumCMS()
141 {
142  TVector3 p(0., 0., 0.);
143  int nParticles = m_particleMomentumListCMS.size();
144  for (int i = 0; i < nParticles; ++i) {
145  p -= m_particleMomentumListCMS.at(i).Vect();
146  }
147  return p;
148 }
149 
150 float EventKinematicsModule::getMissingEnergyCMS()
151 {
153  float ECMS = T.getCMSEnergy();
154  int nParticles = m_particleMomentumListCMS.size();
155  for (int i = 0; i < nParticles; ++i) {
156  ECMS -= m_particleMomentumListCMS.at(i).E();
157  }
158  return ECMS;
159 }
160 
161 float EventKinematicsModule::getVisibleEnergyCMS()
162 {
163  float visibleE = 0.0;
164  int nParticles = m_particleMomentumListCMS.size();
165  for (int i = 0; i < nParticles; ++i) {
166  visibleE += m_particleMomentumListCMS.at(i).E();
167  }
168  return visibleE;
169 }
170 
171 float EventKinematicsModule::getTotalPhotonsEnergy()
172 {
173  float photonsEnergy = 0.0;
174  int nParticles = m_photonsMomentumList.size();
175  for (int i = 0; i < nParticles; ++i) {
176  photonsEnergy += m_photonsMomentumList.at(i).E();
177  }
178  return photonsEnergy;
179 }
REG_MODULE
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Definition: Module.h:652
Belle2::PCmsLabTransform::getCMSEnergy
double getCMSEnergy() const
Returns CMS energy of e+e- (aka.
Definition: PCmsLabTransform.h:57
Belle2::Module
Base class for Modules.
Definition: Module.h:74
Belle2::EventKinematicsModule
Module to compute global quantities related to the event kinematics, like total missing energy and ma...
Definition: EventKinematicsModule.h:36
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19
Belle2::StoreObjPtr
Type-safe access to single objects in the data store.
Definition: ParticleList.h:33
Belle2::PCmsLabTransform::getBeamFourMomentum
TLorentzVector getBeamFourMomentum() const
Returns LAB four-momentum of e+e-.
Definition: PCmsLabTransform.h:65
Belle2::EventKinematics
Class for collecting variables related to the global kinematics of the event.
Definition: EventKinematics.h:38
Belle2::Particle
Class to store reconstructed particles.
Definition: Particle.h:77
Belle2::PCmsLabTransform
Class to hold Lorentz transformations from/to CMS and boost vector.
Definition: PCmsLabTransform.h:37
Belle2::PCmsLabTransform::rotateLabToCms
const TLorentzRotation rotateLabToCms() const
Returns Lorentz transformation from Lab to CMS.
Definition: PCmsLabTransform.h:74