11 #include <beast/pindiode/modules/PindiodeStudyModule.h>
12 #include <beast/pindiode/dataobjects/PindiodeSimHit.h>
13 #include <beast/pindiode/dataobjects/PindiodeHit.h>
14 #include <generators/SAD/dataobjects/SADMetaHit.h>
15 #include <framework/datastore/StoreArray.h>
16 #include <framework/logging/Logger.h>
17 #include <framework/gearbox/GearDir.h>
31 using namespace pindiode;
45 setDescription(
"Study module for Pindiodes (BEAST)");
48 addParam(
"CrematGain", m_CrematGain,
"Charge sensitive preamplifier gain [volts/C] ", 1.4);
49 addParam(
"WorkFunction", m_WorkFunction,
"Convert eV to e [e/eV] ", 1.12);
50 addParam(
"FanoFactor", m_FanoFactor,
"e resolution ", 0.1);
53 PindiodeStudyModule::~PindiodeStudyModule()
58 void PindiodeStudyModule::defineHisto()
61 for (
int i = 0; i < 4; i++) {
62 h_pin_rate[i] =
new TH1F(TString::Format(
"pin_rate_%d", i),
"Count", 64, 0., 64.);
63 h_pin_rate[i]->Sumw2();
65 for (
int i = 0; i < 2; i++) {
66 h_pin_rs_rate[i] =
new TH2F(TString::Format(
"pin_rs_rate_%d", i),
"Count vs. ring section", 64, 0., 64., 12, 0., 12.);
67 h_pin_rs_rate[i]->Sumw2();
69 for (
int i = 0; i < 64; i++) {
70 h_pin_dose1[i] =
new TH1F(TString::Format(
"pin_dose1_%d", i),
"", 10000, 0., 10000.);
71 h_pin_dose2[i] =
new TH1F(TString::Format(
"pin_dose2_%d", i),
"", 10000, 0., 10000.);
72 h_pin_dose1Weight[i] =
new TH1F(TString::Format(
"pin_dose1Weight_%d", i),
"", 10000, 0., 10000.);
73 h_pin_dose2Weight[i] =
new TH1F(TString::Format(
"pin_dose2Weight_%d", i),
"", 10000, 0., 10000.);
74 h_pin_volt[i] =
new TH1F(TString::Format(
"pin_volt_%d", i),
"", 10000, 0., 100.);
75 h_pin_time[i] =
new TH1F(TString::Format(
"pin_time_%d", i),
"", 1000, 0., 100.);
76 h_pin_vtime[i] =
new TH1F(TString::Format(
"pin_vtime_%d", i),
"", 1000, 0., 100.);
78 h_pin_idose[i] =
new TH1F(TString::Format(
"pin_idose_%d", i),
"", 10000, 0., 10000.);
79 h_pin_idoseWeight[i] =
new TH1F(TString::Format(
"pin_idoseWeight_%d", i),
"", 10000, 0., 10000.);
81 h_pin_rs_idose[i] =
new TH2F(TString::Format(
"pin_rs_idose_%d", i),
"", 10000, 0., 10000., 12, 0., 12.);
82 h_pin_rs_idoseWeight[i] =
new TH2F(TString::Format(
"pin_rs_idoseWeight_%d", i),
"", 10000, 0., 10000., 12, 0., 12.);
84 h_pin_ivolt[i] =
new TH1F(TString::Format(
"pin_ivolt_%d", i),
"", 10000, 0., 100.);
85 h_pin_itime[i] =
new TH1F(TString::Format(
"pin_itime_%d", i),
"", 1000, 0., 100.);
86 h_pin_ivtime[i] =
new TH1F(TString::Format(
"pin_ivtime_%d", i),
"", 1000, 0., 100.);
88 h_pin_dose1[i]->Sumw2();
89 h_pin_dose2[i]->Sumw2();
90 h_pin_dose1Weight[i]->Sumw2();
91 h_pin_dose2Weight[i]->Sumw2();
92 h_pin_idose[i]->Sumw2();
93 h_pin_idoseWeight[i]->Sumw2();
94 h_pin_rs_idose[i]->Sumw2();
95 h_pin_rs_idoseWeight[i]->Sumw2();
101 void PindiodeStudyModule::initialize()
103 B2INFO(
"PindiodeStudyModule: Initialize");
112 void PindiodeStudyModule::beginRun()
116 void PindiodeStudyModule::event()
126 int ring_section = -1;
127 int section_ordering[12] = {1, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2};
128 for (
const auto& MetaHit : MetaHits) {
129 rate = MetaHit.getrate();
130 double sad_ssraw = MetaHit.getssraw();
132 if (sad_ssraw >= 0) ssraw = sad_ssraw / 100.;
133 else if (sad_ssraw < 0) ssraw = 3000. + sad_ssraw / 100.;
134 ring_section = section_ordering[(int)((ssraw) / 250.)] - 1;
143 for (
const auto& SimHit : SimHits) {
144 int detNb = SimHit.getCellId();
146 double edep = SimHit.getEnergyDep();
147 double time = SimHit.getFlightTime();
149 const double meanEl = edep / m_WorkFunction * 1e9;
150 const double sigma = sqrt(m_FanoFactor * meanEl);
151 const int NbEle = (int)gRandom->Gaus(meanEl, sigma);
152 double volt = NbEle * 1.602176565e-19 * m_CrematGain * 1e12;
153 h_pin_dose1[detNb]->Fill(edep * 1e6);
154 h_pin_dose1Weight[detNb]->Fill(edep * 1e6, rate);
155 if ((edep * 1e9) > m_WorkFunction) {
156 h_pin_dose2[detNb]->Fill(edep * 1e6);
157 h_pin_dose2Weight[detNb]->Fill(edep * 1e6, rate);
158 h_pin_volt[detNb]->Fill(volt * 1e3);
159 h_pin_time[detNb]->Fill(time);
160 h_pin_vtime[detNb]->Fill(time, volt);
161 h_pin_rate[0]->Fill(detNb);
162 h_pin_rate[1]->Fill(detNb, rate);
167 for (
const auto&
Hit : Hits) {
168 int detNb =
Hit.getdetNb();
170 double edep =
Hit.getedep();
171 double volt =
Hit.getV();
172 double time =
Hit.gettime();
173 h_pin_idose[detNb]->Fill(edep);
174 h_pin_idoseWeight[detNb]->Fill(edep, rate);
175 h_pin_ivolt[detNb]->Fill(volt * 1e3);
176 h_pin_itime[detNb]->Fill(time);
177 h_pin_ivtime[detNb]->Fill(time, volt);
178 h_pin_rate[2]->Fill(detNb);
179 h_pin_rate[3]->Fill(detNb, rate);
181 h_pin_rs_rate[0]->Fill(detNb, ring_section);
182 h_pin_rs_rate[1]->Fill(detNb, ring_section, rate);
183 h_pin_rs_idose[detNb]->Fill(edep, ring_section);
184 h_pin_rs_idoseWeight[detNb]->Fill(edep, ring_section, rate);
191 void PindiodeStudyModule::getXMLData()
193 GearDir content =
GearDir(
"/Detector/DetectorComponent[@name=\"PINDIODE\"]/Content/");
203 m_CrematGain = content.getDouble(
"CrematGain");
204 m_WorkFunction = content.getDouble(
"WorkFunction");
205 m_FanoFactor = content.getDouble(
"FanoFactor");
207 B2INFO(
"PinDigitizer");
210 void PindiodeStudyModule::endRun()
216 void PindiodeStudyModule::terminate()