9 #include <beast/microtpc/modules/MicrotpcStudyModule.h>
10 #include <beast/microtpc/dataobjects/MicrotpcSimHit.h>
11 #include <beast/microtpc/dataobjects/TPCG4TrackInfo.h>
12 #include <beast/microtpc/dataobjects/MicrotpcHit.h>
13 #include <beast/microtpc/dataobjects/MicrotpcRecoTrack.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>
18 #include <framework/gearbox/Const.h>
20 #include <boost/foreach.hpp>
38 using namespace microtpc;
52 setDescription(
"Study module for Microtpcs (BEAST)");
55 addParam(
"ChipRowNb", m_ChipRowNb,
"Chip number of row", 226);
56 addParam(
"ChipColumnNb", m_ChipColumnNb,
"Chip number of column", 80);
57 addParam(
"ChipColumnX", m_ChipColumnX,
"Chip x dimension in cm / 2", 1.0);
58 addParam(
"ChipRowY", m_ChipRowY,
"Chip y dimension in cm / 2", 0.86);
59 addParam(
"z_DG", m_z_DG,
"Drift gap distance [cm]", 12.0);
62 MicrotpcStudyModule::~MicrotpcStudyModule()
67 void MicrotpcStudyModule::defineHisto()
69 for (
int i = 0 ; i < 6 ; i++) {
70 h_tpc_rate[i] =
new TH1F(TString::Format(
"h_tpc_rate_%d", i),
"detector #", 8, 0., 8.);
73 h_mctpc_recoil[0] =
new TH3F(
"h_mctpc_recoil_He",
"Neutron recoil energy [MeV]", 13, -0.5, 12.5, 8, -0.5, 7.5, 1000, 0., 10.);
74 h_mctpc_recoilW[0] =
new TH3F(
"h_mctpc_recoil_w_He",
"Neutron recoil energy [MeV]", 13, -0.5, 12.5, 8, -0.5, 7.5, 1000, 0., 10.);
75 h_mctpc_recoil[0]->Sumw2();
76 h_mctpc_recoilW[0]->Sumw2();
78 h_mctpc_recoil[1] =
new TH3F(
"h_mctpc_recoil_O",
"Neutron recoil energy [MeV]", 13, -0.5, 12.5, 8, -0.5, 7.5, 1000, 0., 10.);
79 h_mctpc_recoilW[1] =
new TH3F(
"h_mctpc_recoil_w_O",
"Neutron recoil energy [MeV]", 13, -0.5, 12.5, 8, -0.5, 7.5, 1000, 0., 10.);
80 h_mctpc_recoil[1]->Sumw2();
81 h_mctpc_recoilW[1]->Sumw2();
83 h_mctpc_recoil[2] =
new TH3F(
"h_mctpc_recoil_C",
"Neutron recoil energy [MeV]", 13, -0.5, 12.5, 8, -0.5, 7.5, 1000, 0., 10.);
84 h_mctpc_recoilW[2] =
new TH3F(
"h_mctpc_recoil_w_C",
"Neutron recoil energy [MeV]", 13, -0.5, 12.5, 8, -0.5, 7.5, 1000, 0., 10.);
85 h_mctpc_recoil[2]->Sumw2();
86 h_mctpc_recoilW[2]->Sumw2();
89 for (
int i = 0 ; i < 12 ; i++) {
90 h_mctpc_kinetic[i] =
new TH2F(TString::Format(
"h_mctpc_kinetic_%d", i),
"Neutron kin. energy [GeV]", 8, -0.5, 7.5, 1000, 0., 10.);
91 h_mctpc_kinetic_zoom[i] =
new TH2F(TString::Format(
"h_mctpc_kinetic_zoom_%d", i),
"Neutron kin. energy [MeV]", 8, -0.5, 7.5, 1000,
93 h_mctpc_tvp[i] =
new TH2F(TString::Format(
"h_mctpc_tvp_%d", i),
"theta v phi", 180, 0., 180., 360, -180., 180.);
94 h_mctpc_tvpW[i] =
new TH2F(TString::Format(
"h_mctpc_tvpW_%d", i),
"theta v phi weighted by kin", 180, 0., 180., 360, -180., 180.);
95 h_mctpc_zr[i] =
new TH2F(TString::Format(
"h_mctpc_zr_%d", i),
"r v z", 200, -400., 400., 200, 0., 400.);
96 h_mctpc_kinetic[i]->Sumw2();
97 h_mctpc_kinetic_zoom[i]->Sumw2();
98 h_mctpc_tvp[i]->Sumw2();
99 h_mctpc_tvpW[i]->Sumw2();
100 h_mctpc_zr[i]->Sumw2();
102 for (
int i = 0 ; i < 8 ; i++) {
103 for (
int j = 0; j < 12; j++) {
104 h_Wtvp1[i][j] =
new TH2F(TString::Format(
"h_Wtvp1_%d_%d", i, j),
"Phi [deg] v. theta [deg]", 180, 0., 180, 360, -180., 180.);
105 h_Wtvp2[i][j] =
new TH2F(TString::Format(
"h_Wtvp2_%d_%d", i, j),
"Phi [deg] v. theta [deg]", 180, 0., 180, 360, -180., 180.);
106 h_Wevtrl1[i][j] =
new TH2F(TString::Format(
"h_Wevtrl1_%d_%d", i, j),
"Deposited energy [keV] v. track length [cm]", 2000, 0., 10000,
108 h_Wevtrl2[i][j] =
new TH2F(TString::Format(
"h_Wevtrl2_%d_%d", i, j),
"Deposited energy [keV] v. track length [cm]", 2000, 0., 10000,
113 for (
int i = 0 ; i < 8 ; i++) {
114 h_z[i] =
new TH1F(TString::Format(
"h_z_%d", i),
"Charged density per cm^2", 2000, 0.0, 20.0);
116 h_zr[i] =
new TH2F(TString::Format(
"h_zr_%d", i),
"Charged density vs z vs r", 100, 0, 20, 100, 0., 5.);
118 h_xy[i] =
new TH2F(TString::Format(
"h_xy_%d", i),
"Charged density vs y vs x", 100, -5., 5., 100, -5., 5.);
120 h_zx[i] =
new TH2F(TString::Format(
"h_zx_%d", i),
"Charged density vs x vs r", 100, 0, 20, 100, -5., 5.);
122 h_zy[i] =
new TH2F(TString::Format(
"h_zy_%d", i),
"Charged density vs y vs r", 100, 0, 20, 100, -5., 5.);
124 h_evtrl[i] =
new TH2F(TString::Format(
"h_evtrl_%d", i),
"Deposited energy [keV] v. track length [cm]", 2000, 0., 10000, 200, 0.,
126 h_evtrlb[i] =
new TH2F(TString::Format(
"h_evtrlb_%d", i),
"Deposited energy [keV] v. track length [cm]", 2000, 0., 10000, 200, 0.,
128 h_evtrlc[i] =
new TH2F(TString::Format(
"h_evtrlc_%d", i),
"Deposited energy [keV] v. track length [cm]", 2000, 0., 10000, 200, 0.,
130 h_evtrld[i] =
new TH2F(TString::Format(
"h_evtrld_%d", i),
"Deposited energy [keV] v. track length [cm]", 2000, 0., 10000, 200, 0.,
133 h_evtrl_p[i] =
new TH2F(TString::Format(
"h_evtrl_p_%d", i),
"Deposited energy [keV] v. track length [cm]", 2000, 0., 2000, 200, 0.,
135 h_evtrl_x[i] =
new TH2F(TString::Format(
"h_evtrl_x_%d", i),
"Deposited energy [keV] v. track length [cm]", 2000, 0., 2000, 200, 0.,
137 h_evtrl_Hex[i] =
new TH2F(TString::Format(
"h_evtrl_Hex_%d", i),
"Deposited energy [keV] v. track length [cm]", 2000, 0., 2000, 200,
139 h_evtrl_He[i] =
new TH2F(TString::Format(
"h_evtrl_He_%d", i),
"Deposited energy [keV] v. track length [cm]", 2000, 0., 2000, 200,
141 h_evtrl_C[i] =
new TH2F(TString::Format(
"h_evtrl_C_%d", i),
"Deposited energy [keV] v. track length [cm]", 2000, 0., 2000, 200, 0.,
143 h_evtrl_O[i] =
new TH2F(TString::Format(
"h_evtrl_O_%d", i),
"Deposited energy [keV] v. track length [cm]", 2000, 0., 2000, 200, 0.,
145 h_evtrl_He_pure[i] =
new TH2F(TString::Format(
"h_evtrl_He_pure_%d", i),
"Deposited energy [keV] v. track length [cm]", 2000, 0.,
149 h_tevtrl[i] =
new TH2F(TString::Format(
"h_tevtrl_%d", i),
"t: Deposited energy [keV] v. track length [cm]", 2000, 0., 2000, 200, 0.,
151 h_tevtrl_p[i] =
new TH2F(TString::Format(
"h_tevtrl_p_%d", i),
"t: Deposited energy [keV] v. track length [cm]", 2000, 0., 2000, 200,
154 h_tevtrl_x[i] =
new TH2F(TString::Format(
"h_tevtrl_x_%d", i),
"t: Deposited energy [keV] v. track length [cm]", 2000, 0., 2000, 200,
157 h_tevtrl_Hex[i] =
new TH2F(TString::Format(
"h_tevtrl_Hex_%d", i),
"t: Deposited energy [keV] v. track length [cm]", 2000, 0., 2000,
160 h_tevtrl_He[i] =
new TH2F(TString::Format(
"h_tevtrl_He_%d", i),
"t: Deposited energy [keV] v. track length [cm]", 2000, 0., 2000,
163 h_tevtrl_C[i] =
new TH2F(TString::Format(
"h_tevtrl_C_%d", i),
"t: Deposited energy [keV] v. track length [cm]", 2000, 0., 2000, 200,
166 h_tevtrl_O[i] =
new TH2F(TString::Format(
"h_tevtrl_O_%d", i),
"t: Deposited energy [keV] v. track length [cm]", 2000, 0., 2000, 200,
169 h_tevtrl_He_pure[i] =
new TH2F(TString::Format(
"h_tevtrl_He_pure_%d", i),
"t: Deposited energy [keV] v. track length [cm]", 2000,
173 h_tvp[i] =
new TH2F(TString::Format(
"h_tvp_%d", i),
"Phi [deg] v. theta [deg]", 180, 0., 180, 360, -180., 180.);
174 h_wtvpb[i] =
new TH2F(TString::Format(
"h_wtvpb_%d", i),
"Phi [deg] v. theta [deg]", 180, 0., 180, 360, -180., 180.);
175 h_wtvpc[i] =
new TH2F(TString::Format(
"h_wtvpc_%d", i),
"Phi [deg] v. theta [deg]", 180, 0., 180, 360, -180., 180.);
176 h_wtvpd[i] =
new TH2F(TString::Format(
"h_wtvpd_%d", i),
"Phi [deg] v. theta [deg]", 180, 0., 180, 360, -180., 180.);
178 h_tvpb[i] =
new TH2F(TString::Format(
"h_tvpb_%d", i),
"Phi [deg] v. theta [deg]", 180, 0., 180, 360, -180., 180.);
179 h_tvpc[i] =
new TH2F(TString::Format(
"h_tvpc_%d", i),
"Phi [deg] v. theta [deg]", 180, 0., 180, 360, -180., 180.);
180 h_tvpd[i] =
new TH2F(TString::Format(
"h_tvpd_%d", i),
"Phi [deg] v. theta [deg]", 180, 0., 180, 360, -180., 180.);
181 h_ttvp[i] =
new TH2F(TString::Format(
"h_ttvp_%d", i),
"t: Phi [deg] v. theta [deg]", 180, 0., 180, 360, -180., 180.);
182 h_wtvp[i] =
new TH2F(TString::Format(
"h_wtvp_%d", i),
"Phi [deg] v. theta [deg] - weighted", 180, 0., 180, 360, -180., 180.);
183 h_tvp_x[i] =
new TH2F(TString::Format(
"h_tvp_x_%d", i),
"Phi [deg] v. theta [deg]", 180, 0., 180, 360, -180., 180.);
184 h_ttvp_x[i] =
new TH2F(TString::Format(
"h_ttvp_x_%d", i),
"t: Phi [deg] v. theta [deg]", 180, 0., 180, 360, -180., 180.);
185 h_wtvp_x[i] =
new TH2F(TString::Format(
"h_wtvp_x_%d", i),
"Phi [deg] v. theta [deg] - weighted", 180, 0., 180, 360, -180., 180.);
186 h_tvp_p[i] =
new TH2F(TString::Format(
"h_tvp_p_%d", i),
"Phi [deg] v. theta [deg]", 180, 0., 180, 360, -180., 180.);
187 h_ttvp_p[i] =
new TH2F(TString::Format(
"h_ttvp_p_%d", i),
"t: Phi [deg] v. theta [deg]", 180, 0., 180, 360, -180., 180.);
188 h_wtvp_p[i] =
new TH2F(TString::Format(
"h_wtvp_p_%d", i),
"Phi [deg] v. theta [deg] - weighted", 180, 0., 180, 360, -180., 180.);
189 h_tvp_He[i] =
new TH2F(TString::Format(
"h_tvp_He_%d", i),
"Phi [deg] v. theta [deg]", 180, 0., 180, 360, -180., 180.);
190 h_ttvp_He[i] =
new TH2F(TString::Format(
"h_ttvp_He_%d", i),
"t: Phi [deg] v. theta [deg]", 180, 0., 180, 360, -180., 180.);
191 h_wtvp_He[i] =
new TH2F(TString::Format(
"h_wtvp_He_%d", i),
"Phi [deg] v. theta [deg] - weighted", 180, 0., 180, 360, -180., 180.);
192 h_tvp_Hex[i] =
new TH2F(TString::Format(
"h_tvp_Hex_%d", i),
"Phi [deg] v. theta [deg]", 180, 0., 180, 360, -180., 180.);
193 h_ttvp_Hex[i] =
new TH2F(TString::Format(
"h_ttvp_Hex_%d", i),
"t: Phi [deg] v. theta [deg]", 180, 0., 180, 360, -180., 180.);
194 h_wtvp_Hex[i] =
new TH2F(TString::Format(
"h_wtvp_Hex_%d", i),
"Phi [deg] v. theta [deg] - weighted", 180, 0., 180, 360, -180.,
196 h_tvp_He_pure[i] =
new TH2F(TString::Format(
"h_tvp_He_pure_%d", i),
"Phi [deg] v. theta [deg]", 180, 0., 180, 360, -180., 180.);
197 h_ttvp_He_pure[i] =
new TH2F(TString::Format(
"h_ttvp_He_pure_%d", i),
"t: Phi [deg] v. theta [deg]", 180, 0., 180, 360, -180.,
199 h_wtvp_He_pure[i] =
new TH2F(TString::Format(
"h_wtvp_He_pure_%d", i),
"Phi [deg] v. theta [deg] - weighted", 180, 0., 180, 360,
201 h_twtvp_He_pure[i] =
new TH2F(TString::Format(
"h_twtvp_He_pure_%d", i),
"t: Phi [deg] v. theta [deg] - weighted", 180, 0., 180,
204 h_tvp_C[i] =
new TH2F(TString::Format(
"h_tvp_C_%d", i),
"Phi [deg] v. theta [deg]", 180, 0., 180, 360, -180., 180.);
205 h_ttvp_C[i] =
new TH2F(TString::Format(
"h_ttvp_C_%d", i),
"t: Phi [deg] v. theta [deg]", 180, 0., 180, 360, -180., 180.);
206 h_wtvp_C[i] =
new TH2F(TString::Format(
"h_wtvp_C_%d", i),
"Phi [deg] v. theta [deg] - weighted", 180, 0., 180, 360, -180., 180.);
207 h_tvp_O[i] =
new TH2F(TString::Format(
"h_tvp_O_%d", i),
"Phi [deg] v. theta [deg]", 180, 0., 180, 360, -180., 180.);
208 h_ttvp_O[i] =
new TH2F(TString::Format(
"h_ttvp_O_%d", i),
"t: Phi [deg] v. theta [deg]", 180, 0., 180, 360, -180., 180.);
209 h_wtvp_O[i] =
new TH2F(TString::Format(
"h_wtvp_O_%d", i),
"Phi [deg] v. theta [deg] - weighted", 180, 0., 180, 360, -180., 180.);
222 h_ttvp_x[i]->Sumw2();
224 h_ttvp_p[i]->Sumw2();
225 h_tvp_He[i]->Sumw2();
226 h_ttvp_He[i]->Sumw2();
228 h_wtvp_x[i]->Sumw2();
229 h_wtvp_p[i]->Sumw2();
230 h_wtvp_He[i]->Sumw2();
237 void MicrotpcStudyModule::initialize()
239 B2INFO(
"MicrotpcStudyModule: Initialize");
250 void MicrotpcStudyModule::beginRun()
254 void MicrotpcStudyModule::event()
264 int ring_section = 0;
265 int section_ordering[12] = {1, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2};
266 for (
const auto& sadMetaHit : sadMetaHits) {
267 rate = sadMetaHit.getrate();
268 double ss = sadMetaHit.getss() / 100.;
269 if (ss < 0) ss += 3000.;
270 int section = (int)(ss / 250.);
271 if (section >= 0 && section < 12) ring_section = section_ordering[section];
290 for (
int i = 0; i < 8; i++) {
305 auto phiArray =
new vector<double>[8]();
306 auto thetaArray =
new vector<double>[8]();
307 auto pidArray =
new vector<int>[8]();
309 auto esumArray =
new vector<double>[8]();
310 auto trlArray =
new vector<double>[8]();
314 for (
int i = 0; i < nSimHits; i++) {
317 TVector3 position = aHit->
gettkPos();
318 double xpos = position.X() / 100. - TPCCenter[detNb].X();
319 double ypos = position.Y() / 100. - TPCCenter[detNb].Y();
320 double zpos = position.Z() / 100. - TPCCenter[detNb].Z() + m_z_DG / 2.;
321 if (0. < zpos && zpos < m_z_DG) {
324 if (PDGid == 1000080160) ORec[detNb] =
true;
325 if (PDGid == 1000060120) CRec[detNb] =
true;
326 if (PDGid == 1000020040) HeRec[detNb] =
true;
327 if (PDGid == Const::proton.getPDGCode()) pRec[detNb] =
true;
328 if (fabs(PDGid) == Const::electron.getPDGCode() || PDGid == Const::photon.getPDGCode()) xRec[detNb] =
true;
332 double ioni = (edep - niel) * 1e3;
334 double r = sqrt(xpos * xpos + ypos * ypos);
335 h_z[detNb]->Fill(zpos, ioni);
336 h_zr[detNb]->Fill(zpos, r, ioni);
337 h_zx[detNb]->Fill(zpos, xpos, ioni);
338 h_xy[detNb]->Fill(xpos, ypos, ioni);
339 h_zy[detNb]->Fill(zpos, ypos, ioni);
341 double theta = direction.Theta() * TMath::RadToDeg();
342 double phi = direction.Phi() * TMath::RadToDeg();
344 if ((-m_ChipColumnX < xpos && xpos < m_ChipColumnX) &&
345 (-m_ChipRowY < ypos && ypos < m_ChipRowY) &&
346 (0. < zpos && zpos < m_z_DG)) {
353 if (pid_old[detNb] != PDGid) {
354 if (esum[detNb] > 0) {
355 esumArray[detNb].push_back(esum[detNb]);
357 BeginPoint.SetXYZ(xpos, ypos, zpos);
358 double trl0 = BeginPoint * direction.Unit();
359 double trl1 = EndPoint * direction.Unit();
360 trlArray[detNb].push_back(fabs(trl0 - trl1));
396 thetaArray[detNb].push_back(theta);
397 phiArray[detNb].push_back(phi);
398 pidArray[detNb].push_back(PDGid);
401 pid_old[detNb] = PDGid;
406 EndPoint.SetXYZ(xpos, ypos, zpos);
455 for (
const auto& mcpart : mcparts) {
456 const double energy = mcpart.getEnergy();
457 const double mass = mcpart.getMass();
458 double kin = energy - mass;
459 const double PDG = mcpart.getPDG();
460 const TVector3 vtx = mcpart.getProductionVertex();
461 const TVector3 mom = mcpart.getMomentum();
462 double theta = mom.Theta() * TMath::RadToDeg();
463 double phi = mom.Phi() * TMath::RadToDeg();
465 double r = sqrt(vtx.X() * vtx.X() + vtx.Y() * vtx.Y());
466 int partID[9] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
467 if (trID == mcpart.getTrackID())
continue;
468 else trID = mcpart.getTrackID();
471 for (
const auto& sHit : SimHits) {
472 if (sHit.gettkID() == trID) {
473 detNb = sHit.getdetNb(); nhit++;
474 kin = sHit.gettkKEnergy() / 1000;
479 if (PDG == Const::neutron.getPDGCode()) {
480 double trlen = abs(2. / TMath::Sin(mom.Theta()));
481 if (trlen > 10) trlen = 10.;
483 for (
auto fract : m_maxEnFrac) {
484 double recoil = gRandom->Uniform(fract) * kin * 1e3;
485 double weight = m_intProb[irecoil]->Eval(kin * 1e3) * trlen;
486 if (weight < 0) weight = 0;
487 h_mctpc_recoil[irecoil]->Fill(ring_section, detNb, recoil);
488 h_mctpc_recoilW[irecoil]->Fill(ring_section, detNb, recoil, weight);
495 if (PDG == Const::electron.getPDGCode()) partID[0] = 1;
496 else if (PDG == -Const::electron.getPDGCode()) partID[1] = 1;
497 else if (PDG == Const::photon.getPDGCode()) partID[2] = 1;
498 else if (PDG == Const::neutron.getPDGCode()) partID[3] = 1;
499 else if (PDG == Const::proton.getPDGCode()) partID[4] = 1;
500 else if (PDG == 1000080160) partID[5] = 1;
501 else if (PDG == 1000060120) partID[6] = 1;
502 else if (PDG == 1000020040) partID[7] = 1;
505 if (PDG == Const::neutron.getPDGCode()) {
508 h_mctpc_kinetic[9]->Fill(detNb, kin);
509 h_mctpc_kinetic_zoom[9]->Fill(detNb, kin * 1e3);
510 h_mctpc_tvp[9]->Fill(theta, phi);
511 h_mctpc_tvpW[9]->Fill(theta, phi, kin);
512 h_mctpc_zr[9]->Fill(z, r);
515 h_mctpc_kinetic[10]->Fill(detNb, kin);
516 h_mctpc_kinetic_zoom[10]->Fill(detNb, kin * 1e3);
517 h_mctpc_tvp[10]->Fill(theta, phi);
518 h_mctpc_tvpW[10]->Fill(theta, phi, kin);
519 h_mctpc_zr[10]->Fill(z, r);
523 for (
int i = 0; i < 9; i++) {
524 if (partID[i] == 1) {
525 h_mctpc_kinetic[i]->Fill(detNb, kin);
526 h_mctpc_kinetic_zoom[i]->Fill(detNb, kin * 1e3);
527 h_mctpc_tvp[i]->Fill(theta, phi);
528 h_mctpc_tvpW[i]->Fill(theta, phi, kin);
529 h_mctpc_zr[i]->Fill(z, r);
538 for (
const auto& aTrack : Tracks) {
539 const int detNb = aTrack.getdetNb();
540 const float phi = aTrack.getphi();
541 const float theta = aTrack.gettheta();
542 const float trl = aTrack.gettrl();
543 const float tesum = aTrack.getesum();
544 const int pixnb = aTrack.getpixnb();
547 for (
int j = 0; j < 16; j++) {
549 side[j] = aTrack.getside()[j];
551 Bool_t EdgeCuts =
false;
552 if (side[0] == 0 && side[1] == 0 && side[2] == 0 && side[3] == 0) EdgeCuts =
true;
553 Bool_t Asource =
false;
554 if (side[4] == 2 && side[5] == 2) Asource =
true;
561 for (
int j = 0; j < 6; j++) partID[j + 1] = aTrack.getpartID()[j];
563 if (ORec[detNb] || CRec[detNb] || HeRec[detNb])
564 h_tpc_rate[0]->Fill(detNb);
566 h_tpc_rate[1]->Fill(detNb);
568 h_tpc_rate[2]->Fill(detNb);
571 if (ORec[detNb] || CRec[detNb] || HeRec[detNb])
572 h_tpc_rate[3]->Fill(detNb);
574 h_tpc_rate[4]->Fill(detNb);
576 h_tpc_rate[5]->Fill(detNb);
579 h_evtrl[detNb]->Fill(tesum, trl);
580 h_tvp[detNb]->Fill(theta, phi);
581 h_wtvp[detNb]->Fill(theta, phi, tesum);
582 h_Wtvp1[detNb][0]->Fill(theta, phi, rate);
583 h_Wevtrl1[detNb][0]->Fill(tesum, trl, rate);
584 h_Wtvp2[detNb][0]->Fill(theta, phi, rate * tesum);
586 if (EdgeCuts && pixnb > 10. && tesum > 10.) {
587 h_evtrlb[detNb]->Fill(tesum, trl);
588 h_tvpb[detNb]->Fill(theta, phi);
589 h_wtvpb[detNb]->Fill(theta, phi, tesum);
590 h_Wtvp1[detNb][1]->Fill(theta, phi, rate);
591 h_Wevtrl1[detNb][1]->Fill(tesum, trl, rate);
592 h_Wtvp2[detNb][1]->Fill(theta, phi, rate * tesum);
595 for (
int j = 0; j < 7; j++) {
596 if (j == 3 && !EdgeCuts && (partID[1] == 1 || partID[2] == 1 || partID[4] == 1 || partID[5] == 1 || partID[6] == 1)) partID[j] = 0;
597 if ((j == 4 || j == 5) && !Asource) partID[j] = 0;
598 if (partID[j] == 1) {
599 h_Wtvp1[detNb][2 + j]->Fill(theta, phi, rate);
600 h_Wevtrl1[detNb][2 + j]->Fill(tesum, trl, rate);
601 h_Wtvp2[detNb][2 + j]->Fill(theta, phi, rate * tesum);
603 h_evtrlc[detNb]->Fill(tesum, trl);
604 h_tvpc[detNb]->Fill(theta, phi);
605 h_wtvpc[detNb]->Fill(theta, phi, tesum);
608 h_evtrld[detNb]->Fill(tesum, trl);
609 h_tvpd[detNb]->Fill(theta, phi);
610 h_wtvpd[detNb]->Fill(theta, phi, tesum);
613 h_evtrl_x[detNb]->Fill(tesum, trl);
614 h_tvp_x[detNb]->Fill(theta, phi);
615 h_wtvp_x[detNb]->Fill(theta, phi, tesum);
618 h_evtrl_p[detNb]->Fill(tesum, trl);
619 h_tvp_p[detNb]->Fill(theta, phi);
620 h_wtvp_p[detNb]->Fill(theta, phi, tesum);
623 h_evtrl_x[detNb]->Fill(tesum, trl);
624 h_tvp_x[detNb]->Fill(theta, phi);
625 h_wtvp_x[detNb]->Fill(theta, phi, tesum);
628 h_evtrl_He[detNb]->Fill(tesum, trl);
629 h_tvp_He[detNb]->Fill(theta, phi);
630 h_wtvp_He[detNb]->Fill(theta, phi, tesum);
633 h_evtrl_Hex[detNb]->Fill(tesum, trl);
634 h_tvp_Hex[detNb]->Fill(theta, phi);
635 h_wtvp_Hex[detNb]->Fill(theta, phi, tesum);
645 delete [] thetaArray;
653 void MicrotpcStudyModule::getXMLData()
655 GearDir content =
GearDir(
"/Detector/DetectorComponent[@name=\"MICROTPC\"]/Content/");
658 BOOST_FOREACH(
const GearDir & activeParams, content.getNodes(
"Active")) {
660 TPCCenter.push_back(TVector3(activeParams.
getLength(
"TPCpos_x"), activeParams.
getLength(
"TPCpos_y"),
665 m_ChipColumnNb = content.getInt(
"ChipColumnNb");
666 m_ChipRowNb = content.getInt(
"ChipRowNb");
667 m_ChipColumnX = content.getDouble(
"ChipColumnX");
668 m_ChipRowY = content.getDouble(
"ChipRowY");
669 m_z_DG = content.getDouble(
"z_DG");
671 GearDir content2 =
GearDir(
"/Detector/DetectorComponent[@name=\"MICROTPC\"]/Content/RecoilProbability");
673 m_maxEnFrac.push_back(recoil.getDouble(
"Fraction"));
674 istringstream probstream;
676 probstream.str(recoil.getString(
"Probability"));
677 TGraph* gr =
new TGraph();
679 while (probstream >> e >> prob) {
680 gr->SetPoint(i, e, prob);
683 m_intProb.push_back(gr);
686 B2INFO(
"TpcDigitizer: Aquired tpc locations and gas parameters");
687 B2INFO(
" from MICROTPC.xml. There are " << nTPC <<
" TPCs implemented");
690 void MicrotpcStudyModule::endRun()
700 void MicrotpcStudyModule::terminate()
GearDir is the basic class used for accessing the parameter store.
HistoModule.h is supposed to be used instead of Module.h for the modules with histogram definitions t...
ClassMicrotpcSimHit - Geant4 simulated hit for the Microtpc detector.
float getEnergyDep() const
Return the energy deposition in electrons.
TVector3 gettkPos() const
Return the track position.
float getdetNb() const
Return the TPC number.
float getEnergyNiel() const
Return the non-ionization energy in electrons.
TVector3 gettkMomDir() const
Return the track momentum direction.
int gettkPDG() const
Return the PDG number of the track.
Accessor to arrays stored in the data store.
int getEntries() const
Get the number of objects in the array.
double getLength(const std::string &path="") const noexcept(false)
Get the parameter path as a double converted to the standard length unit.
std::vector< GearDir > getNodes(const std::string &path="") const
Get vector of GearDirs which point to all the nodes the given path evaluates to.
Study module for Microtpcs (BEAST)
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Abstract base class for different kinds of events.