Belle II Software development
QcsmonitorStudyModule.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#include <beast/qcsmonitor/modules/QcsmonitorStudyModule.h>
10#include <beast/qcsmonitor/dataobjects/QcsmonitorSimHit.h>
11#include <beast/qcsmonitor/dataobjects/QcsmonitorHit.h>
12#include <generators/SAD/dataobjects/SADMetaHit.h>
13#include <framework/datastore/StoreArray.h>
14#include <framework/gearbox/GearDir.h>
15#include <framework/logging/Logger.h>
16#include <framework/gearbox/Const.h>
17#include <cmath>
18
19#include <fstream>
20#include <string>
21
22// ROOT
23#include <TH1.h>
24#include <TH2.h>
25
26int eventNum = 0;
27
28using namespace std;
29
30using namespace Belle2;
31using namespace qcsmonitor;
32
33//-----------------------------------------------------------------
34// Register the Module
35//-----------------------------------------------------------------
36REG_MODULE(QcsmonitorStudy);
37
38//-----------------------------------------------------------------
39// Implementation
40//-----------------------------------------------------------------
41
43{
44 // Set module properties
45 setDescription("Study module for Qcsmonitors (BEAST)");
46
47 addParam("Ethres", m_Ethres, "Energy threshold in MeV", 0.0);
48}
49
51{
52}
53
54//This module is a histomodule. Any histogram created here will be saved by the HistoManager module
56{
57 for (int i = 0; i < 40; i++) {
58 h_qcss_Evtof1[i] = new TH2F(TString::Format("qcss_Evtof1_%d", i), "Energy deposited [MeV] vs TOF [ns] - all", 500, 0., 1000.,
59 100, 0., 10.);
60 h_qcss_Evtof2[i] = new TH2F(TString::Format("qcss_Evtof2_%d", i), "Energy deposited [MeV] vs TOF [ns] - only photons", 500, 0.,
61 100., 1000, 0., 10.);
62 h_qcss_Evtof3[i] = new TH2F(TString::Format("qcss_Evtof3_%d", i), "Energy deposited [MeV] vs TOF [ns] - only e+/e-", 500, 0.,
63 100., 1000, 0., 10.);
64 h_qcss_Evtof4[i] = new TH2F(TString::Format("qcss_Evtof4_%d", i), "Energy deposited [MeV] vs TOF [ns] - only e+/e-", 500, 0.,
65 100., 1000, 0., 10.);
66 h_qcss_edep[i] = new TH1F(TString::Format("qcss_edep_%d", i), "Energy deposited [MeV]", 5000, 0., 10.);
67 h_Wqcss_edep[i] = new TH1F(TString::Format("Wqcss_edep_%d", i), "Energy deposited [MeV]", 5000, 0., 10.);
68 }
69
70 h_qcss_hitrate0 = new TH1F("qcss_hitrate0", "Hit distributions", 100, 0., 100.);
71 h_qcss_hitrate1 = new TH1F("qcss_hitrate1", "Hit distributions", 100, 0., 100.);
72 h_qcss_hitrate2 = new TH1F("qcss_hitrate2", "Hit distributions", 100, 0., 100.);
73 h_qcss_hitrate1W = new TH1F("qcss_hitrate1W", "Hit distributions", 100, 0., 100.);
74 h_qcss_hitrate2W = new TH1F("qcss_hitrate2W", "Hit distributions", 100, 0., 100.);
75
76 h_qcss_hitrate0->Sumw2();
77 h_qcss_hitrate1->Sumw2();
78 h_qcss_hitrate1W->Sumw2();
79 h_qcss_hitrate2->Sumw2();
80 h_qcss_hitrate2W->Sumw2();
81
82 h_qcss_rs_hitrate1 = new TH2F("qcss_rs_hitrate1", "Hit distributions vs rs", 100, 0., 100., 12, 0., 12.);
83 h_qcss_rs_hitrate2 = new TH2F("qcss_rs_hitrate2", "Hit distributions vs rs", 100, 0., 100., 12, 0., 12.);
84 h_qcss_rs_hitrate1W = new TH2F("qcss_rs_hitrate1W", "Hit distributions vs rs", 100, 0., 100., 12, 0., 12.);
85 h_qcss_rs_hitrate2W = new TH2F("qcss_rs_hitrate2W", "Hit distributions vs rs", 100, 0., 100., 12, 0., 12.);
86
87 h_qcss_rs_hitrate1->Sumw2();
88 h_qcss_rs_hitrate1W->Sumw2();
89 h_qcss_rs_hitrate2->Sumw2();
90 h_qcss_rs_hitrate2W->Sumw2();
91
92 for (int i = 0; i < 40; i++) {
93 h_qcss_rate1[i] = new TH1F(TString::Format("qcss_rate1_%d", i), "PE distributions", 500, 0., 500.);
94 h_qcss_rate2[i] = new TH1F(TString::Format("qcss_rate2_%d", i), "PE distributions", 500, 0., 500.);
95 h_qcss_rate1W[i] = new TH1F(TString::Format("qcss_rate1W_%d", i), "PE distributions", 500, 0., 500.);
96 h_qcss_rate2W[i] = new TH1F(TString::Format("qcss_rate2W_%d", i), "PE distributions", 500, 0., 500.);
97 h_qcss_pe1[i] = new TH2F(TString::Format("qcss_pe1_%d", i), "PE distributions", 500, 0., 500., 100, 0., 1000.);
98 h_qcss_pe2[i] = new TH2F(TString::Format("qcss_pe2_%d", i), "PE distributions", 500, 0., 500., 100, 0., 1000.);
99 h_qcss_pe1W[i] = new TH2F(TString::Format("qcss_pe1W_%d", i), "PE distributions", 500, 0., 500., 100, 0., 1000.);
100 h_qcss_pe2W[i] = new TH2F(TString::Format("qcss_pe2W_%d", i), "PE distributions", 500, 0., 500., 100, 0., 1000.);
101
102 h_qcss_rs_rate1[i] = new TH2F(TString::Format("qcss_rs_rate1_%d", i), "PE distributions", 500, 0., 500., 12, 0., 12.);
103 h_qcss_rs_rate2[i] = new TH2F(TString::Format("qcss_rs_rate2_%d", i), "PE distributions", 500, 0., 500., 12, 0., 12.);
104 h_qcss_rs_rate1W[i] = new TH2F(TString::Format("qcss_rs_rate1W_%d", i), "PE distributions", 500, 0., 500., 12, 0., 12.);
105 h_qcss_rs_rate2W[i] = new TH2F(TString::Format("qcss_rs_rate2W_%d", i), "PE distributions", 500, 0., 500., 12, 0., 12.);
106
107 h_qcss_rate1[i]->Sumw2();
108 h_qcss_rate2[i]->Sumw2();
109 h_qcss_rate1W[i]->Sumw2();
110 h_qcss_rate2W[i]->Sumw2();
111 h_qcss_rs_rate1[i]->Sumw2();
112 h_qcss_rs_rate2[i]->Sumw2();
113 h_qcss_rs_rate1W[i]->Sumw2();
114 h_qcss_rs_rate2W[i]->Sumw2();
115 h_qcss_pe1[i]->Sumw2();
116 h_qcss_pe2[i]->Sumw2();
117 h_qcss_pe1W[i]->Sumw2();
118 h_qcss_pe2W[i]->Sumw2();
119 }
120}
121
122
124{
125 B2INFO("QcsmonitorStudyModule: Initialize");
126
127 REG_HISTOGRAM
128
129 //get QCSMONITORS paramters ie energy threshold
130 getXMLData();
131}
132
134{
135}
136
138{
139 //Here comes the actual event processing
142 StoreArray<SADMetaHit> MetaHits;
143
144 double rate = 0;
145 int ring_section = -1;
146 for (const auto& MetaHit : MetaHits) {
147 rate = MetaHit.getrate();
148 ring_section = MetaHit.getring_section() - 1;
149 }
150
151 //number of entries in SimHits
152 int nSimHits = SimHits.getEntries();
153
154 //loop over all SimHit entries
155 for (int i = 0; i < nSimHits; i++) {
156 QcsmonitorSimHit* aHit = SimHits[i];
157 int detNB = aHit->getCellId();
158 if (detNB < 40) {
159 //int trkID = aHit->getTrackId();
160 int pdg = aHit->getPDGCode();
161 double Edep = aHit->getEnergyDep() * 1e3; //GeV -> MeV
162 double tof = aHit->getFlightTime(); //ns
163
164 h_qcss_hitrate0->Fill(detNB);
165 h_qcss_Evtof1[detNB]->Fill(tof, Edep);
166 if (pdg == Const::photon.getPDGCode()) h_qcss_Evtof2[detNB]->Fill(tof, Edep);
167 else if (fabs(pdg) == Const::electron.getPDGCode()) h_qcss_Evtof3[detNB]->Fill(tof, Edep);
168 else h_qcss_Evtof4[detNB]->Fill(tof, Edep);
169 if (Edep > m_Ethres) {
170 h_qcss_edep[detNB]->Fill(Edep);
171 h_Wqcss_edep[detNB]->Fill(Edep, rate);
172 }
173 }
174 }
175
176 for (const auto& Hit : Hits) {
177 const int detNb = Hit.getdetNb();
178 if (detNb < 40) {
179 const int timebin = Hit.gettime();
180 const float edep = Hit.getedep();
181 const float pe = Hit.getPE();
182 h_qcss_hitrate1->Fill(detNb);
183 h_qcss_hitrate1W->Fill(detNb, rate);
184 h_qcss_rate1[detNb]->Fill(pe);
185 h_qcss_rate1W[detNb]->Fill(pe, rate);
186 h_qcss_rs_rate1[detNb]->Fill(pe, ring_section);
187 h_qcss_rs_rate1W[detNb]->Fill(pe, ring_section, rate);
188 h_qcss_rs_hitrate1->Fill(detNb, ring_section);
189 h_qcss_rs_hitrate1W->Fill(detNb, ring_section, rate);
190 h_qcss_pe1[detNb]->Fill(timebin, pe);
191 h_qcss_pe1W[detNb]->Fill(timebin, pe, rate);
192 if (edep > m_Ethres) {
193 h_qcss_hitrate2->Fill(detNb);
194 h_qcss_hitrate2W->Fill(detNb, rate);
195 h_qcss_rate2[detNb]->Fill(pe);
196 h_qcss_rate2W[detNb]->Fill(pe, rate);
197 h_qcss_rs_rate2[detNb]->Fill(pe, ring_section);
198 h_qcss_rs_rate2W[detNb]->Fill(pe, ring_section, rate);
199 h_qcss_rs_hitrate2->Fill(detNb, ring_section);
200 h_qcss_rs_hitrate2W->Fill(detNb, ring_section, rate);
201 h_qcss_pe2[detNb]->Fill(timebin, pe);
202 h_qcss_pe2W[detNb]->Fill(timebin, pe, rate);
203 }
204 }
205 }
206
207}
208
209//read energy threshold from QCSMONITOR.xml
211{
212 GearDir content = GearDir("/Detector/DetectorComponent[@name=\"QCSMONITOR\"]/Content/");
213 m_Ethres = content.getDouble("Ethres");
214
215 B2INFO("QcsmonitorStudy");
216}
217
218
220{
221
222
223
224}
225
227{
228}
229
230
static const ParticleType photon
photon particle
Definition: Const.h:673
static const ChargedStable electron
electron particle
Definition: Const.h:659
GearDir is the basic class used for accessing the parameter store.
Definition: GearDir.h:31
HistoModule.h is supposed to be used instead of Module.h for the modules with histogram definitions t...
Definition: HistoModule.h:29
void setDescription(const std::string &description)
Sets the description of the module.
Definition: Module.cc:214
ClassQcsmonitorSimHit - Geant4 simulated hit for the Qcsmonitor crystal in beast.
int getPDGCode() const
Get Particle PDG (can be one of secondaries)
int getCellId() const
Get Cell ID.
double getFlightTime() const
Get Flight time from IP.
double getEnergyDep() const
Get Deposit energy.
Accessor to arrays stored in the data store.
Definition: StoreArray.h:113
int getEntries() const
Get the number of objects in the array.
Definition: StoreArray.h:216
TH2F * h_qcss_Evtof3[48]
Energy deposited vs TOF.
virtual void initialize() override
Initialize the Module.
virtual void event() override
Event processor.
TH2F * h_qcss_Evtof1[48]
Energy deposited vs TOF.
virtual void endRun() override
End-of-run action.
TH2F * h_qcss_Evtof2[48]
Energy deposited vs TOF.
virtual void getXMLData()
reads data from QCSMONITOR.xml
virtual void terminate() override
Termination action.
QcsmonitorStudyModule()
Constructor: Sets the description, the properties and the parameters of the module.
virtual void beginRun() override
Called when entering a new run.
TH2F * h_qcss_Evtof4[48]
Energy deposited vs TOF.
virtual void defineHisto() override
Defines the histograms.
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
Abstract base class for different kinds of events.
STL namespace.
Structure to hold some of the calpulse data.