Belle II Software  release-08-01-10
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 
26 int eventNum = 0;
27 
28 using namespace std;
29 
30 using namespace Belle2;
31 using namespace qcsmonitor;
32 
33 //-----------------------------------------------------------------
34 // Register the Module
35 //-----------------------------------------------------------------
36 REG_MODULE(QcsmonitorStudy);
37 
38 //-----------------------------------------------------------------
39 // Implementation
40 //-----------------------------------------------------------------
41 
42 QcsmonitorStudyModule::QcsmonitorStudyModule() : HistoModule()
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:664
static const ChargedStable electron
electron particle
Definition: Const.h:650
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.
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.
Structure to hold some of the calpulse data.