11 #include <beast/he3tube/modules/He3DigitizerModule.h>
12 #include <beast/he3tube/dataobjects/He3tubeSimHit.h>
14 #include <mdst/dataobjects/MCParticle.h>
15 #include <framework/datastore/RelationArray.h>
16 #include <framework/datastore/RelationIndex.h>
17 #include <framework/logging/Logger.h>
18 #include <framework/gearbox/GearDir.h>
22 #include <boost/foreach.hpp>
32 using namespace he3tube;
47 setDescription(
"He3tube digitizer module");
49 addParam(
"conversionFactor", m_ConversionFactor,
50 "Conversion factor for pulse heights", 0.303132019);
51 addParam(
"useMCParticles", m_mcpExist,
"Use MCParticles to determine if neutrons are present",
true);
55 He3DigitizerModule::~He3DigitizerModule()
59 void He3DigitizerModule::initialize()
61 B2INFO(
"He3Digitizer: Initializing");
62 m_he3tubeHit.registerInDataStore();
71 void He3DigitizerModule::beginRun()
75 void He3DigitizerModule::event()
77 B2DEBUG(250,
"Beginning of event method");
82 auto peak =
new double[numOfTubes]();
83 auto lowTime =
new double[numOfTubes]();
84 std::fill_n(lowTime, numOfTubes, 9999999999999);
85 auto edepDet =
new double[numOfTubes]();
86 auto NbEle_tot =
new double[numOfTubes]();
90 B2DEBUG(250,
"Skipping event #" << Event <<
" since there are no sim hits");
95 auto definiteNeutron =
new bool[numOfTubes]();
104 for (
int i = 0; i < nMCParticles; ++i) {
110 BOOST_FOREACH(
const relMCSimHit_Element & relation, relMCSimHit.
getElementsFrom(mcp)) {
116 if (mom == NULL)
continue;
119 if (mom->
getPDG() == 2112) {
122 definiteNeutron[detNB] =
true;
123 ProcessHit(aHit, lowTime, edepDet, NbEle_tot);
132 for (
int i = 0; i < nentries; i++) {
135 if (pdg == 2212 || pdg == 1000010030) ProcessHit(aHit, lowTime, edepDet, NbEle_tot);
142 for (
int i = 0; i < numOfTubes; i++) {
143 peak[i] = (double)NbEle_tot[i] * m_ConversionFactor;
149 B2DEBUG(80,
"He3Digitizer: " << edepDet[i] <<
"MeV deposited in tube #" << i <<
" with waveform peak of " << peak[i]);
160 delete[] definiteNeutron;
165 void He3DigitizerModule::ProcessHit(
He3tubeSimHit* aHit,
double* lowTime,
double* edepDet,
double* NbEle_tot)
173 if (time < lowTime[detNB]) lowTime[detNB] =
176 if (detNB >= numOfTubes) {
177 B2WARNING(
"He3Digitizer: Detector number of He3tubeSimHit is greater than number implemented! Ignoring He3tubeSimHit.");
182 double ionEn = (edep - niel) * 1e3;
184 if ((ionEn * 1e3) < m_Workfct)
return;
186 if ((ionEn * 1e3) > m_Workfct) {
188 double meanE1 = ionEn * 1e3 / m_Workfct;
189 double sigma = sqrt(m_Fanofac * meanE1);
190 const int NbEle = (int)gRandom->Gaus(meanE1,
193 NbEle_tot[detNB] = NbEle_tot[detNB] + NbEle;
197 edepDet[detNB] = edepDet[detNB] + edep;
202 void He3DigitizerModule::getXMLData()
204 GearDir content =
GearDir(
"/Detector/DetectorComponent[@name=\"HE3TUBE\"]/Content/");
207 BOOST_FOREACH(
const GearDir & activeParams, content.getNodes(
"Active")) {
208 B2DEBUG(250,
"Tubes located at x=" << activeParams.
getLength(
"x_he3tube"));
213 B2INFO(
"He3Digitizer: There are " << numOfTubes <<
" tubes implemented");
217 void He3DigitizerModule::endRun()
221 void He3DigitizerModule::terminate()