14 #include "CLHEP/Random/RandPoissonQ.h"
26 HighFidelityPreMix(HighFidelity),
56 photonTimeMap::iterator channelPhotons;
62 const unsigned int size(signal.
size());
64 for (
unsigned int i(0);
i !=
size; ++
i) {
94 for (
int i = 0;
i < signal.
size(); ++
i) {
95 unsigned int photons(signal[
i] + 0.5);
106 unsigned int photons(signal + 0.5);
119 LogDebug(
"HcalSiPMHitResponse") <<
" fCtoGeV: " << pars.fCtoGeV(
id)
120 <<
" samplingFactor: " << pars.samplingFactor(
id)
121 <<
" photoelectronsToAnalog: " << pars.photoelectronsToAnalog(
id)
122 <<
" simHitToPhotoelectrons: " << pars.simHitToPhotoelectrons(
id);
123 LogDebug(
"HcalSiPMHitResponse") <<
" energy: " <<
hit.energy() <<
" photons: " <<
photons <<
" time: " <<
time;
124 LogDebug(
"HcalSiPMHitResponse") <<
" timePhase: " << pars.timePhase() <<
" tof: " << tof
125 <<
" binOfMaximum: " << pars.binOfMaximum() <<
" phaseShift: " <<
thePhaseShift_;
129 LogDebug(
"HcalSiPMHitResponse") <<
" corrected tzero: " << tzero_bin <<
'\n';
132 unsigned signalShape = pars.signalShape(
id);
133 for (
unsigned int pe(0); pe <
photons; ++pe) {
135 t_bin =
int(t_pe *
invdt + tzero_bin + 0.5);
136 LogDebug(
"HcalSiPMHitResponse") <<
"t_pe: " << t_pe <<
" t_pe + tzero: " << (t_pe + tzero_bin *
dt)
137 <<
" t_bin: " << t_bin <<
'\n';
146 for (std::vector<DetId>::const_iterator idItr =
theDetIds->begin(); idItr !=
theDetIds->end(); ++idItr) {
158 unsigned int sumnoisePE(0);
159 double elapsedTime(0.);
160 for (
int tprecise(0); tprecise < nPreciseBins; ++tprecise) {
161 int noisepe = CLHEP::RandPoissonQ::shoot(engine, dc_pe_avg);
172 sumnoisePE += noisepe;
179 LogDebug(
"HcalSiPMHitResponse") <<
" total noise (PEs): " << sumnoisePE;
196 CLHEP::HepRandomEngine* engine) {
205 int sampleBin(0), preciseBin(0);
208 double hitPixels(0.), elapsedTime(0.);
209 unsigned int sumPE(0);
214 std::list<std::pair<double, double> > pulses;
215 std::list<std::pair<double, double> >::iterator
pulse;
216 double timeDiff, pulseBit;
219 for (
unsigned int tbin(0); tbin < photonTimeBins.size(); ++tbin) {
220 pe = photonTimeBins[tbin];
223 sampleBin = preciseBin /
nbins;
227 signal[sampleBin] += pe;
234 sumHits += hitPixels;
235 LogDebug(
"HcalSiPMHitResponse") <<
" elapsedTime: " << elapsedTime <<
" sampleBin: " << sampleBin
236 <<
" preciseBin: " << preciseBin <<
" pe: " << pe <<
" hitPixels: " << hitPixels;
238 pulses.push_back(std::pair<double, double>(elapsedTime, hitPixels));
240 signal[sampleBin] += hitPixels;
250 pulse = pulses.begin();
251 while (
pulse != pulses.end()) {
252 timeDiff = elapsedTime -
pulse->first;
253 pulseBit = sipmPulseShape(timeDiff) *
pulse->second;
254 LogDebug(
"HcalSiPMHitResponse") <<
" pulse t: " <<
pulse->first <<
" pulse A: " <<
pulse->second
255 <<
" timeDiff: " << timeDiff <<
" pulseBit: " << pulseBit;
256 signal[sampleBin] += pulseBit;
259 if (timeDiff > 1 && sipmPulseShape(timeDiff) < 1
e-7)