Belle II Software  release-06-00-14
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 
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 
50 QcsmonitorStudyModule::~QcsmonitorStudyModule()
51 {
52 }
53 
54 //This module is a histomodule. Any histogram created here will be saved by the HistoManager module
55 void QcsmonitorStudyModule::defineHisto()
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 
123 void QcsmonitorStudyModule::initialize()
124 {
125  B2INFO("QcsmonitorStudyModule: Initialize");
126 
127  REG_HISTOGRAM
128 
129  //get QCSMONITORS paramters ie energy threshold
130  getXMLData();
131 }
132 
133 void QcsmonitorStudyModule::beginRun()
134 {
135 }
136 
137 void QcsmonitorStudyModule::event()
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
210 void QcsmonitorStudyModule::getXMLData()
211 {
212  GearDir content = GearDir("/Detector/DetectorComponent[@name=\"QCSMONITOR\"]/Content/");
213  m_Ethres = content.getDouble("Ethres");
214 
215  B2INFO("QcsmonitorStudy");
216 }
217 
218 
219 void QcsmonitorStudyModule::endRun()
220 {
221 
222 
223 
224 }
225 
226 void QcsmonitorStudyModule::terminate()
227 {
228 }
229 
230 
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
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
Study module for Qcsmonitor (BEAST)
#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.