ATLAS Offline Software
Loading...
Searching...
No Matches
LUCID_DigitizationToolBox Class Reference

#include <LUCID_DigitizationToolBox.h>

Inheritance diagram for LUCID_DigitizationToolBox:
Collaboration diagram for LUCID_DigitizationToolBox:

Public Member Functions

 LUCID_DigitizationToolBox ()
 LUCID_DigitizationToolBox (int numTubes, double qdcChannelsPerPE, double qdcPedestal, double qdcFedNoiseFactor, double tdcPmtNoiseFactor, double tdcFedNoiseFactor, double TotalPMTgain, double AmpFactor, double Q1bin, int NoiseCharge, int numDyinodes, double dynodeGammaFactor, std::vector< double > pmtSmearing, std::vector< double > pmtScaling, std::vector< double > gasScaling, std::vector< double > npeThreshold, bool fillRootTree)
StatusCode recordContainers (const ServiceHandle< StoreGateSvc > &, const std::string &)
StatusCode fillDigitContainer (TimedHitCollection< LUCID_SimHit > &, CLHEP::HepRandomEngine *)
StatusCode fillDigitContainer (LUCID_SimHitCollection *, CLHEP::HepRandomEngine *)
StatusCode setDebugTree ()

Protected Member Functions

TTree * getDebugTree ()
StatusCode createAndStoreDigit (unsigned short tubeID, CLHEP::HepRandomEngine *rndEngine)
double DynodeChainSimulation (double npe, CLHEP::HepRandomEngine *rndEngine) const

Static Protected Member Functions

static unsigned int roundoff (double x)
static double DynodeGainSmearing (double npe, CLHEP::HepRandomEngine *rndEngine)

Protected Attributes

LUCID_DigitContainerm_digitContainer {}
int m_numTubes {}
double m_qdcChannelsPerPE {}
double m_qdcPedestal {}
double m_qdcFedNoiseFactor {}
double m_tdcPmtNoiseFactor {}
double m_tdcFedNoiseFactor {}
double m_TotalPMTgain {}
double m_AmpFactor {}
double m_Q1bin {}
int m_NoiseCharge {}
int m_numDyinodes {}
double m_dynodeGammaFactor {}
double m_gainPerDynode {}
double m_ChargeToQdcFactor {}
std::vector< double > m_pmtSmearing {}
std::vector< double > m_pmtScaling {}
std::vector< double > m_gasScaling {}
std::vector< double > m_npeThreshold {}
bool m_fillRootTree {}
unsigned short m_tubeID {}
double m_npe {}
unsigned short m_npeGas {}
unsigned short m_npePmt {}
unsigned short m_qdc {}
double m_tdcTot {}
unsigned short m_tdc {}
TTree * m_tubeInfo {}

Detailed Description

Definition at line 18 of file LUCID_DigitizationToolBox.h.

Constructor & Destructor Documentation

◆ LUCID_DigitizationToolBox() [1/2]

LUCID_DigitizationToolBox::LUCID_DigitizationToolBox ( )

Definition at line 19 of file LUCID_DigitizationToolBox.cxx.

19 :
20 m_tubeID(0),
21 m_npe (0),
22 m_npeGas(0),
23 m_npePmt(0),
24 m_qdc (0),
25 m_tdcTot(0),
26 m_tdc (0)
27{
28 m_digitContainer = nullptr;
29 m_tubeInfo = nullptr;
30
31 m_numTubes = 0;
33 m_qdcPedestal = 0;
37
39 m_AmpFactor = 0;
40 m_Q1bin = 0;
41 m_NoiseCharge = 0;
42 m_numDyinodes = 0;
46
48}
LUCID_DigitContainer * m_digitContainer

◆ LUCID_DigitizationToolBox() [2/2]

LUCID_DigitizationToolBox::LUCID_DigitizationToolBox ( int numTubes,
double qdcChannelsPerPE,
double qdcPedestal,
double qdcFedNoiseFactor,
double tdcPmtNoiseFactor,
double tdcFedNoiseFactor,
double TotalPMTgain,
double AmpFactor,
double Q1bin,
int NoiseCharge,
int numDyinodes,
double dynodeGammaFactor,
std::vector< double > pmtSmearing,
std::vector< double > pmtScaling,
std::vector< double > gasScaling,
std::vector< double > npeThreshold,
bool fillRootTree )

Definition at line 51 of file LUCID_DigitizationToolBox.cxx.

67 :
68 m_numTubes (numTubes),
69 m_qdcChannelsPerPE (qdcChannelsPerPE),
70 m_qdcPedestal (qdcPedestal),
71 m_qdcFedNoiseFactor (qdcFedNoiseFactor),
72 m_tdcPmtNoiseFactor (tdcPmtNoiseFactor),
73 m_tdcFedNoiseFactor (tdcFedNoiseFactor),
74 m_TotalPMTgain (TotalPMTgain),
75 m_AmpFactor (AmpFactor),
76 m_Q1bin (Q1bin),
77 m_NoiseCharge (NoiseCharge),
78 m_numDyinodes (numDyinodes),
79 m_dynodeGammaFactor (dynodeGammaFactor),
80 m_pmtSmearing (std::move(pmtSmearing)),
81 m_pmtScaling (std::move(pmtScaling)),
82 m_gasScaling (std::move(gasScaling)),
83 m_npeThreshold (std::move(npeThreshold)),
84 m_fillRootTree (fillRootTree),
85 m_tubeID (0),
86 m_npe (0),
87 m_npeGas (0),
88 m_npePmt (0),
89 m_qdc (0),
90 m_tdcTot (0),
91 m_tdc (0)
92{
93 m_gainPerDynode = std::pow(m_TotalPMTgain/m_dynodeGammaFactor, 1.0/static_cast<double>(m_numDyinodes));
95
96 m_digitContainer = nullptr;
97 m_tubeInfo = nullptr;
98}

Member Function Documentation

◆ createAndStoreDigit()

StatusCode LUCID_DigitizationToolBox::createAndStoreDigit ( unsigned short tubeID,
CLHEP::HepRandomEngine * rndEngine )
protected

Definition at line 133 of file LUCID_DigitizationToolBox.cxx.

133 {
134
135 double npePmt = m_npePmt * m_pmtScaling[tubeID] * CLHEP::RandGaussQ::shoot(rndEngine, 1, m_pmtSmearing[tubeID]);
136 double npeGas = m_npeGas * m_gasScaling[tubeID];
137 double npeTot = npeGas + npePmt;
138 double qdcSmeared = DynodeChainSimulation(npeTot, rndEngine);
139
140 m_qdc = roundoff(qdcSmeared);
141
143
144 double tdcTotSmeared = 0;
145
146 tdcTotSmeared = CLHEP::RandGaussQ::shoot(rndEngine, m_tdcTot , m_tdcPmtNoiseFactor);
147 tdcTotSmeared = CLHEP::RandGaussQ::shoot(rndEngine, tdcTotSmeared, m_tdcFedNoiseFactor);
148 tdcTotSmeared = (npeTot) ? tdcTotSmeared/npeTot : tdcTotSmeared;
149 tdcTotSmeared = (tdcTotSmeared < 0) ? 0 : tdcTotSmeared;
150
151 m_tdc = static_cast<unsigned int>(tdcTotSmeared);
152
153 if (m_fillRootTree) m_tubeInfo->Fill();
154
155 m_digitContainer->push_back(new LUCID_Digit(m_tubeID,
156 m_npe,
157 m_npeGas,
158 m_npePmt,
159 m_qdc,
160 m_tdc,
161 m_npe > m_npeThreshold[tubeID]));
162 return StatusCode::SUCCESS;
163}
double DynodeChainSimulation(double npe, CLHEP::HepRandomEngine *rndEngine) const
static unsigned int roundoff(double x)

◆ DynodeChainSimulation()

double LUCID_DigitizationToolBox::DynodeChainSimulation ( double npe,
CLHEP::HepRandomEngine * rndEngine ) const
protected

Definition at line 242 of file LUCID_DigitizationToolBox.cxx.

242 {
243
244 double smearedQDC = 0;
245
246 if (npe == 0) return CLHEP::RandGaussQ::shoot(rndEngine, npe, m_ChargeToQdcFactor * m_NoiseCharge) + m_qdcPedestal;
247
248 for (int i_pe=1; i_pe <= m_numDyinodes; i_pe++ ) {
249
250 if (i_pe == 1) smearedQDC = DynodeGainSmearing(npe * m_gainPerDynode * m_dynodeGammaFactor, rndEngine);
251 else smearedQDC = DynodeGainSmearing(smearedQDC * m_gainPerDynode , rndEngine);
252 }
253
254 smearedQDC = smearedQDC*m_ChargeToQdcFactor;
255
256 return static_cast<double>(CLHEP::RandGaussQ::shoot(rndEngine, smearedQDC, m_NoiseCharge * m_ChargeToQdcFactor)) + m_qdcPedestal;
257}
static double DynodeGainSmearing(double npe, CLHEP::HepRandomEngine *rndEngine)

◆ DynodeGainSmearing()

double LUCID_DigitizationToolBox::DynodeGainSmearing ( double npe,
CLHEP::HepRandomEngine * rndEngine )
staticprotected

Definition at line 260 of file LUCID_DigitizationToolBox.cxx.

260 {
261
262 if (npe < 20) return CLHEP::RandPoissonQ::shoot(rndEngine, npe);
263 else return CLHEP::RandGaussQ::shoot (rndEngine, npe, std::sqrt(npe));
264}

◆ fillDigitContainer() [1/2]

StatusCode LUCID_DigitizationToolBox::fillDigitContainer ( LUCID_SimHitCollection * thpclucid,
CLHEP::HepRandomEngine * rndEngine )

Definition at line 199 of file LUCID_DigitizationToolBox.cxx.

199 {
200
201 for (m_tubeID = 0; m_tubeID < m_numTubes; m_tubeID++) {
202
203 if (m_tubeID >= 16 && m_tubeID <= 19) continue; // skip fiber tubes on sideA
204 if (m_tubeID >= 36 && m_tubeID <= 39) continue; // skip fiber tubes on sideC
205
207
209 LUCID_SimHitCollection::const_iterator hitItE = thpclucid->end();
210
211 for (; hitIt != hitItE; ++hitIt) {
212
213 if (m_tubeID != (*hitIt).GetTubeID()) continue;
214
215 if (!(*hitIt).isDetected(rndEngine)) continue; // applying quantum efficiency
216
217 if ((*hitIt).GetGenVolume() == 1) m_npeGas++;
218 if ((*hitIt).GetGenVolume() == 2) m_npeGas++;
219 if ((*hitIt).GetGenVolume() == 3) m_npePmt++;
220
221 m_tdcTot += (*hitIt).GetPreStepTime();
222 }
223
224 if (createAndStoreDigit(m_tubeID, rndEngine).isFailure()) return StatusCode::FAILURE;
225 }
226
227 return StatusCode::SUCCESS;
228}
CONT::const_iterator const_iterator
const_iterator begin() const
const_iterator end() const
StatusCode createAndStoreDigit(unsigned short tubeID, CLHEP::HepRandomEngine *rndEngine)

◆ fillDigitContainer() [2/2]

StatusCode LUCID_DigitizationToolBox::fillDigitContainer ( TimedHitCollection< LUCID_SimHit > & thpclucid,
CLHEP::HepRandomEngine * rndEngine )

Definition at line 166 of file LUCID_DigitizationToolBox.cxx.

166 {
167
168 for (m_tubeID = 0; m_tubeID < m_numTubes; m_tubeID++) {
169
170 if (m_tubeID >= 16 && m_tubeID <= 19) continue; // skip fiber tubes on sideA
171 if (m_tubeID >= 36 && m_tubeID <= 39) continue; // skip fiber tubes on sideC
172
174
175 TimedHitCollection<LUCID_SimHit> thpc = thpclucid;
177
178 while (thpc.nextDetectorElement(i, e)) for (hitIt = i; hitIt != e; ++hitIt) {
179
180 if (m_tubeID != (*hitIt)->GetTubeID()) continue;
181
182 if (!(*hitIt)->isDetected(rndEngine)) continue; // applying quantum efficiency
183
184 if ((*hitIt)->GetGenVolume() == 1) m_npeGas++;
185 if ((*hitIt)->GetGenVolume() == 2) m_npeGas++;
186 if ((*hitIt)->GetGenVolume() == 3) m_npePmt++;
187
188 m_tdcTot += (*hitIt)->GetPreStepTime();
189 }
190
191 if (createAndStoreDigit(m_tubeID, rndEngine).isFailure()) return StatusCode::FAILURE;
192 }
193
194 return StatusCode::SUCCESS;
195
196}
bool nextDetectorElement(const_iterator &b, const_iterator &e)
sets an iterator range with the hits of current detector element returns a bool when done
TimedVector::const_iterator const_iterator

◆ getDebugTree()

TTree * LUCID_DigitizationToolBox::getDebugTree ( )
inlineprotected

Definition at line 50 of file LUCID_DigitizationToolBox.h.

50{ return m_tubeInfo; }

◆ recordContainers()

StatusCode LUCID_DigitizationToolBox::recordContainers ( const ServiceHandle< StoreGateSvc > & digitsStore,
const std::string & key_digitCnt )

Definition at line 232 of file LUCID_DigitizationToolBox.cxx.

232 {
233
234 m_digitContainer = new LUCID_DigitContainer();
235
236 StatusCode sc = digitsStore->record(m_digitContainer, key_digitCnt);
237
238 return sc;
239}
static Double_t sc
::StatusCode StatusCode
StatusCode definition for legacy code.

◆ roundoff()

unsigned int LUCID_DigitizationToolBox::roundoff ( double x)
staticprotected

Definition at line 122 of file LUCID_DigitizationToolBox.cxx.

122 {
123
124 assert(x >= INT_MIN-0.5);
125 assert(x <= INT_MAX+0.5);
126
127 if (x >= 0) return static_cast<int>(x+0.5);
128
129 return static_cast<int>(x-0.5);
130}
#define x

◆ setDebugTree()

StatusCode LUCID_DigitizationToolBox::setDebugTree ( )

Definition at line 101 of file LUCID_DigitizationToolBox.cxx.

101 {
102 SmartIF<ITHistSvc> digitHistSvc{Gaudi::svcLocator()->service("THistSvc")};
103 if (!digitHistSvc) { return StatusCode::FAILURE; }
104
105 m_tubeInfo = new TTree("t", "LUCID_LUMI_SUMMARY");
106
107 StatusCode sc = digitHistSvc->regTree("/AANT/LUCID_LUMI_SUMMARY", m_tubeInfo);
108
109 if (sc.isFailure()) return StatusCode::FAILURE;
110
111 m_tubeInfo->Branch("tubeID", &m_tubeID, "tubeID/s");
112 m_tubeInfo->Branch("npe" , &m_npe , "npe/D");
113 m_tubeInfo->Branch("npeGas", &m_npeGas, "npeGas/s");
114 m_tubeInfo->Branch("npePmt", &m_npePmt, "npePmt/s");
115 m_tubeInfo->Branch("qdc" , &m_qdc , "qdc/s");
116 m_tubeInfo->Branch("tdc" , &m_tdc , "tdc/s");
117
118 return StatusCode::SUCCESS;
119}

Member Data Documentation

◆ m_AmpFactor

double LUCID_DigitizationToolBox::m_AmpFactor {}
protected

Definition at line 69 of file LUCID_DigitizationToolBox.h.

69{};

◆ m_ChargeToQdcFactor

double LUCID_DigitizationToolBox::m_ChargeToQdcFactor {}
protected

Definition at line 76 of file LUCID_DigitizationToolBox.h.

76{};

◆ m_digitContainer

LUCID_DigitContainer* LUCID_DigitizationToolBox::m_digitContainer {}
protected

Definition at line 59 of file LUCID_DigitizationToolBox.h.

59{};

◆ m_dynodeGammaFactor

double LUCID_DigitizationToolBox::m_dynodeGammaFactor {}
protected

Definition at line 73 of file LUCID_DigitizationToolBox.h.

73{};

◆ m_fillRootTree

bool LUCID_DigitizationToolBox::m_fillRootTree {}
protected

Definition at line 83 of file LUCID_DigitizationToolBox.h.

83{};

◆ m_gainPerDynode

double LUCID_DigitizationToolBox::m_gainPerDynode {}
protected

Definition at line 75 of file LUCID_DigitizationToolBox.h.

75{};

◆ m_gasScaling

std::vector<double> LUCID_DigitizationToolBox::m_gasScaling {}
protected

Definition at line 80 of file LUCID_DigitizationToolBox.h.

80{};

◆ m_NoiseCharge

int LUCID_DigitizationToolBox::m_NoiseCharge {}
protected

Definition at line 71 of file LUCID_DigitizationToolBox.h.

71{};

◆ m_npe

double LUCID_DigitizationToolBox::m_npe {}
protected

Definition at line 86 of file LUCID_DigitizationToolBox.h.

86{};

◆ m_npeGas

unsigned short LUCID_DigitizationToolBox::m_npeGas {}
protected

Definition at line 87 of file LUCID_DigitizationToolBox.h.

87{};

◆ m_npePmt

unsigned short LUCID_DigitizationToolBox::m_npePmt {}
protected

Definition at line 88 of file LUCID_DigitizationToolBox.h.

88{};

◆ m_npeThreshold

std::vector<double> LUCID_DigitizationToolBox::m_npeThreshold {}
protected

Definition at line 81 of file LUCID_DigitizationToolBox.h.

81{};

◆ m_numDyinodes

int LUCID_DigitizationToolBox::m_numDyinodes {}
protected

Definition at line 72 of file LUCID_DigitizationToolBox.h.

72{};

◆ m_numTubes

int LUCID_DigitizationToolBox::m_numTubes {}
protected

Definition at line 61 of file LUCID_DigitizationToolBox.h.

61{};

◆ m_pmtScaling

std::vector<double> LUCID_DigitizationToolBox::m_pmtScaling {}
protected

Definition at line 79 of file LUCID_DigitizationToolBox.h.

79{};

◆ m_pmtSmearing

std::vector<double> LUCID_DigitizationToolBox::m_pmtSmearing {}
protected

Definition at line 78 of file LUCID_DigitizationToolBox.h.

78{};

◆ m_Q1bin

double LUCID_DigitizationToolBox::m_Q1bin {}
protected

Definition at line 70 of file LUCID_DigitizationToolBox.h.

70{};

◆ m_qdc

unsigned short LUCID_DigitizationToolBox::m_qdc {}
protected

Definition at line 89 of file LUCID_DigitizationToolBox.h.

89{};

◆ m_qdcChannelsPerPE

double LUCID_DigitizationToolBox::m_qdcChannelsPerPE {}
protected

Definition at line 62 of file LUCID_DigitizationToolBox.h.

62{};

◆ m_qdcFedNoiseFactor

double LUCID_DigitizationToolBox::m_qdcFedNoiseFactor {}
protected

Definition at line 64 of file LUCID_DigitizationToolBox.h.

64{};

◆ m_qdcPedestal

double LUCID_DigitizationToolBox::m_qdcPedestal {}
protected

Definition at line 63 of file LUCID_DigitizationToolBox.h.

63{};

◆ m_tdc

unsigned short LUCID_DigitizationToolBox::m_tdc {}
protected

Definition at line 91 of file LUCID_DigitizationToolBox.h.

91{};

◆ m_tdcFedNoiseFactor

double LUCID_DigitizationToolBox::m_tdcFedNoiseFactor {}
protected

Definition at line 66 of file LUCID_DigitizationToolBox.h.

66{};

◆ m_tdcPmtNoiseFactor

double LUCID_DigitizationToolBox::m_tdcPmtNoiseFactor {}
protected

Definition at line 65 of file LUCID_DigitizationToolBox.h.

65{};

◆ m_tdcTot

double LUCID_DigitizationToolBox::m_tdcTot {}
protected

Definition at line 90 of file LUCID_DigitizationToolBox.h.

90{};

◆ m_TotalPMTgain

double LUCID_DigitizationToolBox::m_TotalPMTgain {}
protected

Definition at line 68 of file LUCID_DigitizationToolBox.h.

68{};

◆ m_tubeID

unsigned short LUCID_DigitizationToolBox::m_tubeID {}
protected

Definition at line 85 of file LUCID_DigitizationToolBox.h.

85{};

◆ m_tubeInfo

TTree* LUCID_DigitizationToolBox::m_tubeInfo {}
protected

Definition at line 93 of file LUCID_DigitizationToolBox.h.

93{};

The documentation for this class was generated from the following files: