@@ -205,59 +205,69 @@ CaloSamples HcalSiPMHitResponse::makeSiPMSignal(DetId const& id,
205205 unsigned int pe (0 );
206206 double hitPixels (0 .), elapsedTime (0 .);
207207
208- auto & sipmPulseShape (shapeMap[pars.signalShape (id)]);
208+ auto const & sipmPulseShape (shapeMap[pars.signalShape (id)]);
209209
210- std::list<std::pair<double , double > > pulses;
211- std::list<std::pair<double , double > >::iterator pulse;
212- double timeDiff, pulseBit;
213210 LogDebug (" HcalSiPMHitResponse" ) << " makeSiPMSignal for " << HcalDetId (id);
214211
215- for (unsigned int tbin (0 ); tbin < photonTimeBins.size (); ++tbin) {
212+ const int nptb = photonTimeBins.size ();
213+ double sum[nptb];
214+ for (auto i = 0 ; i < nptb; ++i)
215+ sum[i] = 0 ;
216+ for (int tbin (0 ); tbin < nptb; ++tbin) {
216217 pe = photonTimeBins[tbin];
218+ if (pe <= 0 )
219+ continue ;
217220 preciseBin = tbin;
218221 sampleBin = preciseBin / nbins;
219- if (pe > 0 ) {
220- // skip saturation/recovery and pulse smearing for premix stage 1
221- if (PreMixDigis and HighFidelityPreMix) {
222- signal[sampleBin] += pe;
223- signal.preciseAtMod (preciseBin) += pe;
224- elapsedTime += dt;
225- continue ;
226- }
227-
228- hitPixels = theSiPM.hitCells (engine, pe, 0 ., elapsedTime);
229- LogDebug (" HcalSiPMHitResponse" ) << " elapsedTime: " << elapsedTime << " sampleBin: " << sampleBin
230- << " preciseBin: " << preciseBin << " pe: " << pe << " hitPixels: " << hitPixels;
231- if (pars.doSiPMSmearing ()) {
232- pulses.push_back (std::pair<double , double >(elapsedTime, hitPixels));
233- } else {
234- signal[sampleBin] += hitPixels;
235- signal.preciseAtMod (preciseBin) += 0.6 * hitPixels;
236- if (preciseBin > 0 )
237- signal.preciseAtMod (preciseBin - 1 ) += 0.2 * hitPixels;
238- if (preciseBin < signal.preciseSize () - 1 )
239- signal.preciseAtMod (preciseBin + 1 ) += 0.2 * hitPixels;
240- }
222+ // skip saturation/recovery and pulse smearing for premix stage 1
223+ if (PreMixDigis and HighFidelityPreMix) {
224+ signal[sampleBin] += pe;
225+ signal.preciseAtMod (preciseBin) += pe;
226+ elapsedTime += dt;
227+ continue ;
241228 }
242229
243- if (pars.doSiPMSmearing ()) {
244- pulse = pulses.begin ();
245- while (pulse != pulses.end ()) {
246- timeDiff = elapsedTime - pulse->first ;
247- pulseBit = sipmPulseShape (timeDiff) * pulse->second ;
248- LogDebug (" HcalSiPMHitResponse" ) << " pulse t: " << pulse->first << " pulse A: " << pulse->second
249- << " timeDiff: " << timeDiff << " pulseBit: " << pulseBit;
250- signal[sampleBin] += pulseBit;
251- signal.preciseAtMod (preciseBin) += pulseBit;
252-
253- if (timeDiff > 1 && sipmPulseShape (timeDiff) < 1e-7 )
254- pulse = pulses.erase (pulse);
255- else
256- ++pulse;
230+ hitPixels = theSiPM.hitCells (engine, pe, 0 ., elapsedTime);
231+ LogDebug (" HcalSiPMHitResponse" ) << " elapsedTime: " << elapsedTime << " sampleBin: " << sampleBin
232+ << " preciseBin: " << preciseBin << " pe: " << pe << " hitPixels: " << hitPixels;
233+ if (!pars.doSiPMSmearing ()) {
234+ signal[sampleBin] += hitPixels;
235+ signal.preciseAtMod (preciseBin) += 0.6 * hitPixels;
236+ if (preciseBin > 0 )
237+ signal.preciseAtMod (preciseBin - 1 ) += 0.2 * hitPixels;
238+ if (preciseBin < signal.preciseSize () - 1 )
239+ signal.preciseAtMod (preciseBin + 1 ) += 0.2 * hitPixels;
240+ } else {
241+ // add "my" smearing to future bins...
242+ // this loop can vectorize....
243+ for (auto i = tbin; i < nptb; ++i) {
244+ auto itdiff = i - tbin;
245+ if (itdiff == sipmPulseShape.nBins ())
246+ break ;
247+ auto shape = sipmPulseShape[itdiff];
248+ auto pulseBit = shape * hitPixels;
249+ sum[i] += pulseBit;
250+ if (shape < 1 .e -7 && itdiff > int (HcalPulseShapes::invDeltaTSiPM_))
251+ break ;
257252 }
258253 }
259254 elapsedTime += dt;
260255 }
256+ if (pars.doSiPMSmearing ())
257+ for (auto i = 0 ; i < nptb; ++i) {
258+ auto iSampleBin = i / nbins;
259+ signal[iSampleBin] += sum[i];
260+ signal.preciseAtMod (i) += sum[i];
261+ }
262+
263+ #ifdef EDM_ML_DEBUG
264+ LogDebug (" HcalSiPMHitResponse" ) << nbins << ' ' << nptb << ' ' << HcalDetId (id);
265+ for (auto i = 0 ; i < nptb; ++i) {
266+ auto iSampleBin = (nbins > 1 ) ? i / nbins : i;
267+ LogDebug (" HcalSiPMHitResponse" ) << i << ' ' << iSampleBin << ' ' << signal[iSampleBin] << ' '
268+ << signal.preciseAtMod (i);
269+ }
270+ #endif
261271
262272 return signal;
263273}
0 commit comments