CMS 3D CMS Logo

HGCFEElectronics.cc
Go to the documentation of this file.
4 
5 #include "vdt/vdtMath.h"
6 
7 using namespace hgc_digi;
8 
9 //
10 template <class DFr>
12  : fwVersion_{ps.getParameter<uint32_t>("fwVersion")},
13  adcPulse_{},
14  pulseAvgT_{},
15  tdcForToAOnset_fC_{},
16  adcSaturation_fC_{-1.0},
17  adcLSB_fC_{},
18  tdcLSB_fC_{},
19  tdcSaturation_fC_{-1.0},
20  adcThreshold_fC_{},
21  tdcOnset_fC_{},
22  toaLSB_ns_{},
23  tdcResolutionInNs_{1e-9}, // set time resolution very small by default
24  targetMIPvalue_ADC_{},
25  jitterNoise2_ns_{},
26  jitterConstant2_ns_{},
27  noise_fC_{},
28  toaMode_(WEIGHTEDBYE) {
29  edm::LogVerbatim("HGCFE") << "[HGCFEElectronics] running with version " << fwVersion_ << std::endl;
30  if (ps.exists("adcPulse")) {
31  auto temp = ps.getParameter<std::vector<double> >("adcPulse");
32  for (unsigned i = 0; i < temp.size(); ++i) {
33  adcPulse_[i] = (float)temp[i];
34  }
35  // normalize adc pulse
36  for (unsigned i = 0; i < adcPulse_.size(); ++i) {
37  adcPulse_[i] = adcPulse_[i] / adcPulse_[2];
38  }
39  temp = ps.getParameter<std::vector<double> >("pulseAvgT");
40  for (unsigned i = 0; i < temp.size(); ++i) {
41  pulseAvgT_[i] = (float)temp[i];
42  }
43  }
44  if (ps.exists("adcNbits")) {
45  uint32_t adcNbits = ps.getParameter<uint32_t>("adcNbits");
46  adcSaturation_fC_ = ps.getParameter<double>("adcSaturation_fC");
47  adcLSB_fC_ = adcSaturation_fC_ / pow(2., adcNbits);
48  edm::LogVerbatim("HGCFE") << "[HGCFEElectronics] " << adcNbits << " bit ADC defined"
49  << " with LSB=" << adcLSB_fC_ << " saturation to occur @ " << adcSaturation_fC_
50  << std::endl;
51  }
52 
53  if (ps.exists("tdcNbits")) {
54  uint32_t tdcNbits = ps.getParameter<uint32_t>("tdcNbits");
55  tdcSaturation_fC_ = ps.getParameter<double>("tdcSaturation_fC");
56  tdcLSB_fC_ = tdcSaturation_fC_ / pow(2., tdcNbits);
57  // lower tdcSaturation_fC_ by one part in a million
58  // to ensure largest charge converted in bits is 0xfff and not 0x000
59  tdcSaturation_fC_ *= (1. - 1e-6);
60  edm::LogVerbatim("HGCFE") << "[HGCFEElectronics] " << tdcNbits << " bit TDC defined with LSB=" << tdcLSB_fC_
61  << " saturation to occur @ " << tdcSaturation_fC_
62  << " (NB lowered by 1 part in a million)" << std::endl;
63  }
64  if (ps.exists("targetMIPvalue_ADC"))
65  targetMIPvalue_ADC_ = ps.getParameter<uint32_t>("targetMIPvalue_ADC");
66  if (ps.exists("adcThreshold_fC"))
67  adcThreshold_fC_ = ps.getParameter<double>("adcThreshold_fC");
68  if (ps.exists("tdcOnset_fC"))
69  tdcOnset_fC_ = ps.getParameter<double>("tdcOnset_fC");
70  if (ps.exists("tdcForToAOnset_fC")) {
71  auto temp = ps.getParameter<std::vector<double> >("tdcForToAOnset_fC");
72  if (temp.size() == tdcForToAOnset_fC_.size()) {
73  std::copy_n(temp.begin(), temp.size(), tdcForToAOnset_fC_.begin());
74  } else {
75  throw cms::Exception("BadConfiguration") << " HGCFEElectronics wrong size for ToA thresholds ";
76  }
77  }
78  if (ps.exists("toaLSB_ns"))
79  toaLSB_ns_ = ps.getParameter<double>("toaLSB_ns");
80  if (ps.exists("tdcChargeDrainParameterisation")) {
81  for (auto val : ps.getParameter<std::vector<double> >("tdcChargeDrainParameterisation")) {
82  tdcChargeDrainParameterisation_.push_back((float)val);
83  }
84  }
85  if (ps.exists("tdcResolutionInPs"))
86  tdcResolutionInNs_ = ps.getParameter<double>("tdcResolutionInPs") * 1e-3; // convert to ns
87  if (ps.exists("toaMode"))
88  toaMode_ = ps.getParameter<uint32_t>("toaMode");
89 
90  if (ps.exists("jitterNoise_ns")) {
91  auto temp = ps.getParameter<std::vector<double> >("jitterNoise_ns");
92  if (temp.size() == jitterNoise2_ns_.size()) {
93  std::copy_n(temp.begin(), temp.size(), jitterNoise2_ns_.begin());
94  } else {
95  throw cms::Exception("BadConfiguration") << " HGCFEElectronics wrong size for ToA jitterNoise ";
96  }
97  }
98  if (ps.exists("jitterConstant_ns")) {
99  auto temp = ps.getParameter<std::vector<double> >("jitterConstant_ns");
100  if (temp.size() == jitterConstant2_ns_.size()) {
101  std::copy_n(temp.begin(), temp.size(), jitterConstant2_ns_.begin());
102  } else {
103  throw cms::Exception("BadConfiguration") << " HGCFEElectronics wrong size for ToA jitterConstant ";
104  }
105  }
106 }
107 
108 //
109 template <class DFr>
111  DFr& dataFrame, HGCSimHitData& chargeColl, uint32_t thrADC, float lsbADC, uint32_t gainIdx, float maxADC) {
112  bool debug(false);
113 
114 #ifdef EDM_ML_DEBUG
115  for (int it = 0; it < (int)(chargeColl.size()); it++)
116  debug |= (chargeColl[it] > adcThreshold_fC_);
117 #endif
118 
119  if (debug)
120  edm::LogVerbatim("HGCFE") << "[runTrivialShaper]" << std::endl;
121 
122  if (lsbADC < 0)
123  lsbADC = adcLSB_fC_;
124  if (maxADC < 0)
125  // lower adcSaturation_fC_ by one part in a million
126  // to ensure largest charge converted in bits is 0xfff==4095, not 0x1000
127  // no effect on charges loewer than; no impact on cpu time, only done once
128  maxADC = adcSaturation_fC_ * (1 - 1e-6);
129  for (int it = 0; it < (int)(chargeColl.size()); it++) {
130  //brute force saturation, maybe could to better with an exponential like saturation
131  const uint32_t adc = std::floor(std::min(chargeColl[it], maxADC) / lsbADC);
132  HGCSample newSample;
133  newSample.set(adc > thrADC, false, gainIdx, 0, adc);
134  dataFrame.setSample(it, newSample);
135 
136  if (debug)
137  edm::LogVerbatim("HGCFE") << adc << " (" << chargeColl[it] << "/" << adcLSB_fC_ << ") ";
138  }
139 
140  if (debug) {
141  std::ostringstream msg;
142  dataFrame.print(msg);
143  edm::LogVerbatim("HGCFE") << msg.str() << std::endl;
144  }
145 }
146 
147 //
148 template <class DFr>
150  HGCSimHitData& chargeColl,
151  uint32_t thrADC,
152  float lsbADC,
153  uint32_t gainIdx,
154  float maxADC,
156  //convolute with pulse shape to compute new ADCs
157  newCharge.fill(0.f);
158  bool debug(false);
159  for (int it = 0; it < (int)(chargeColl.size()); it++) {
160  const float charge(chargeColl[it]);
161  if (charge == 0.f)
162  continue;
163 
164 #ifdef EDM_ML_DEBUG
165  debug |= (charge > adcThreshold_fC_);
166 #endif
167 
168  if (debug)
169  edm::LogVerbatim("HGCFE") << "\t Redistributing SARS ADC" << charge << " @ " << it;
170 
171  for (int ipulse = -2; ipulse < (int)(adcPulse.size()) - 2; ipulse++) {
172  if (it + ipulse < 0)
173  continue;
174  if (it + ipulse >= (int)(dataFrame.size()))
175  continue;
176  const float chargeLeak = charge * adcPulse[(ipulse + 2)];
177  newCharge[it + ipulse] += chargeLeak;
178 
179  if (debug)
180  edm::LogVerbatim("HGCFE") << " | " << it + ipulse << " " << chargeLeak;
181  }
182 
183  if (debug)
184  edm::LogVerbatim("HGCFE") << std::endl;
185  }
186 
187  for (int it = 0; it < (int)(newCharge.size()); it++) {
188  //brute force saturation, maybe could to better with an exponential like saturation
189  const uint32_t adc = std::floor(std::min(newCharge[it], maxADC) / lsbADC);
190  HGCSample newSample;
191  newSample.set(adc > thrADC, false, gainIdx, 0, adc);
192  dataFrame.setSample(it, newSample);
193 
194  if (debug)
195  edm::LogVerbatim("HGCFE") << adc << " (" << std::min(newCharge[it], maxADC) << "/" << lsbADC << " ) ";
196  }
197 
198  if (debug) {
199  std::ostringstream msg;
200  dataFrame.print(msg);
201  edm::LogVerbatim("HGCFE") << msg.str() << std::endl;
202  }
203 }
204 
205 //
206 template <class DFr>
208  HGCSimHitData& chargeColl,
209  HGCSimHitData& toaColl,
210  CLHEP::HepRandomEngine* engine,
211  uint32_t thrADC,
212  float lsbADC,
213  uint32_t gainIdx,
214  float maxADC,
215  int thickness,
216  float tdcOnsetAuto,
218  busyFlags.fill(false);
219  totFlags.fill(false);
220  toaFlags.fill(false);
221  newCharge.fill(0.f);
222  toaFromToT.fill(0.f);
223 
224 #ifdef EDM_ML_DEBUG
225  constexpr bool debug_state(true);
226 #else
227  constexpr bool debug_state(false);
228 #endif
229 
230  bool debug = debug_state;
231  float timeToA = 0.f;
232 
233  //first look at time
234  //for pileup look only at intime signals
235  //ToA is in central BX if fired -- std::floor(BX/25.)+9;
236  int fireBX = 9;
237  //noise fluctuation on charge is added after ToA computation
238  //do not recheck the ToA firing threshold tdcForToAOnset_fC_[thickness-1] not to bias the efficiency
239  //to be done properly with realistic ToA shaper and jitter for the moment accounted in the smearing
240  if (toaColl[fireBX] != 0.f) {
241  timeToA = toaColl[fireBX];
242  float jitter = getTimeJitter(chargeColl[fireBX], thickness);
243  if (jitter != 0)
244  timeToA = CLHEP::RandGaussQ::shoot(engine, timeToA, jitter);
245  else if (tdcResolutionInNs_ != 0)
246  timeToA = CLHEP::RandGaussQ::shoot(engine, timeToA, tdcResolutionInNs_);
247  if (timeToA >= 0.f && timeToA <= 25.f)
248  toaFlags[fireBX] = true;
249  }
250 
251  //now look at charge
252  //first identify bunches which will trigger ToT
253  //if(debug_state) edm::LogVerbatim("HGCFE") << "[runShaperWithToT]" << std::endl;
254  for (int it = 0; it < (int)(chargeColl.size()); ++it) {
255  debug = debug_state;
256  //if already flagged as busy it can't be re-used to trigger the ToT
257  if (busyFlags[it])
258  continue;
259 
260  if (tdcOnsetAuto < 0) {
261  tdcOnsetAuto = tdcOnset_fC_;
262  }
263  //if below TDC onset will be handled by SARS ADC later
264  float charge = chargeColl[it];
265  if (charge < tdcOnsetAuto) {
266  debug = false;
267  continue;
268  }
269 
270  //raise TDC mode for charge computation
271  //ToA anyway fired independently will be sorted out with realistic ToA dedicated shaper
272  float toa = timeToA;
273  totFlags[it] = true;
274 
275  if (debug)
276  edm::LogVerbatim("HGCFE") << "\t q=" << charge << " fC with <toa>=" << toa << " ns, triggers ToT @ " << it
277  << std::endl;
278 
279  //compute total charge to be integrated and integration time
280  //needs a loop as ToT will last as long as there is charge to dissipate
281  int busyBxs(0);
282  float totalCharge(charge), finalToA(toa), integTime(0);
283  while (true) {
284  //compute integration time in ns and # bunches
285  //float newIntegTime(0);
286  int poffset = 0;
287  float charge_offset = 0.f;
288  const float charge_kfC(totalCharge * 1e-3);
289  if (charge_kfC < tdcChargeDrainParameterisation_[3]) {
290  //newIntegTime=tdcChargeDrainParameterisation_[0]*pow(charge_kfC,2)+tdcChargeDrainParameterisation_[1]*charge_kfC+tdcChargeDrainParameterisation_[2];
291  } else if (charge_kfC < tdcChargeDrainParameterisation_[7]) {
292  poffset = 4;
293  charge_offset = tdcChargeDrainParameterisation_[3];
294  //newIntegTime=tdcChargeDrainParameterisation_[4]*pow(charge_kfC-tdcChargeDrainParameterisation_[3],2)+tdcChargeDrainParameterisation_[5]*(charge_kfC-tdcChargeDrainParameterisation_[3])+tdcChargeDrainParameterisation_[6];
295  } else {
296  poffset = 8;
297  charge_offset = tdcChargeDrainParameterisation_[7];
298  //newIntegTime=tdcChargeDrainParameterisation_[8]*pow(charge_kfC-tdcChargeDrainParameterisation_[7],2)+tdcChargeDrainParameterisation_[9]*(charge_kfC-tdcChargeDrainParameterisation_[7])+tdcChargeDrainParameterisation_[10];
299  }
300  const float charge_mod = charge_kfC - charge_offset;
301  const float newIntegTime =
302  ((tdcChargeDrainParameterisation_[poffset] * charge_mod + tdcChargeDrainParameterisation_[poffset + 1]) *
303  charge_mod +
304  tdcChargeDrainParameterisation_[poffset + 2]);
305 
306  const int newBusyBxs = std::floor(newIntegTime / 25.f) + 1;
307 
308  //if no update is needed regarding the number of bunches,
309  //then the ToT integration time has converged
310  integTime = newIntegTime;
311  if (newBusyBxs == busyBxs)
312  break;
313 
314  //update charge integrated during ToT
315  if (debug) {
316  if (busyBxs == 0)
317  edm::LogVerbatim("HGCFE") << "\t Intial busy estimate=" << integTime << " ns = " << newBusyBxs << " bxs"
318  << std::endl;
319  else
320  edm::LogVerbatim("HGCFE") << "\t ...integrated charge overflows initial busy estimate, interating again"
321  << std::endl;
322  }
323 
324  //update number of busy bunches
325  busyBxs = newBusyBxs;
326 
327  //reset charge to be integrated
328  totalCharge = charge;
329  if (toaMode_ == WEIGHTEDBYE)
330  finalToA = toa * charge;
331 
332  //add leakage from previous bunches in SARS ADC mode
333  for (int jt = 0; jt < it; ++jt) {
334  const unsigned int deltaT = (it - jt);
335  if ((deltaT + 2) >= adcPulse.size() || chargeColl[jt] == 0.f || totFlags[jt] || busyFlags[jt])
336  continue;
337 
338  const float leakCharge = chargeColl[jt] * adcPulse[deltaT + 2];
339  totalCharge += leakCharge;
340  if (toaMode_ == WEIGHTEDBYE)
341  finalToA += leakCharge * pulseAvgT_[deltaT + 2];
342 
343  if (debug)
344  edm::LogVerbatim("HGCFE") << "\t\t leaking " << chargeColl[jt] << " fC @ deltaT=-" << deltaT << " -> +"
345  << leakCharge << " with avgT=" << pulseAvgT_[deltaT + 2] << std::endl;
346  }
347 
348  //add contamination from posterior bunches
349  for (int jt = it + 1; jt < it + busyBxs && jt < dataFrame.size(); ++jt) {
350  //this charge will be integrated in TDC mode
351  //disable for SARS ADC
352  busyFlags[jt] = true;
353 
354  const float extraCharge = chargeColl[jt];
355  if (extraCharge == 0.f)
356  continue;
357  if (debug)
358  edm::LogVerbatim("HGCFE") << "\t\t adding " << extraCharge << " fC @ deltaT=+" << (jt - it) << std::endl;
359 
360  totalCharge += extraCharge;
361  if (toaMode_ == WEIGHTEDBYE)
362  finalToA += extraCharge * toaColl[jt];
363  }
364 
365  //finalize ToA contamination
366  if (toaMode_ == WEIGHTEDBYE)
367  finalToA /= totalCharge;
368  }
369  newCharge[it] = (totalCharge - tdcOnsetAuto);
370 
371  if (debug)
372  edm::LogVerbatim("HGCFE") << "\t Final busy estimate=" << integTime << " ns = " << busyBxs << " bxs" << std::endl
373  << "\t Total integrated=" << totalCharge << " fC <toa>=" << toaFromToT[it]
374  << " (raw=" << finalToA << ") ns " << std::endl;
375 
376  //last fC (tdcOnset) are dissipated trough pulse
377  if (it + busyBxs < (int)(newCharge.size())) {
378  const float deltaT2nextBx((busyBxs * 25 - integTime));
379  const float tdcOnsetLeakage(tdcOnsetAuto * vdt::fast_expf(-deltaT2nextBx / tdcChargeDrainParameterisation_[11]));
380  if (debug)
381  edm::LogVerbatim("HGCFE") << "\t Leaking remainder of TDC onset " << tdcOnsetAuto << " fC, to be dissipated in "
382  << deltaT2nextBx << " DeltaT/tau=" << deltaT2nextBx << " / "
383  << tdcChargeDrainParameterisation_[11] << " ns, adds " << tdcOnsetLeakage << " fC @ "
384  << it + busyBxs << " bx (first free bx)" << std::endl;
385  newCharge[it + busyBxs] += tdcOnsetLeakage;
386  }
387  }
388 
389  //including the leakage from bunches in SARS ADC when not declared busy or in ToT
390  auto runChargeSharing = [&]() {
391  int ipulse = 0;
392  for (int it = 0; it < (int)(chargeColl.size()); ++it) {
393  //if busy, charge has been already integrated
394  //if(debug) edm::LogVerbatim("HGCFE") << "\t SARS ADC pulse activated @ " << it << " : ";
395  if (!totFlags[it] & !busyFlags[it]) {
396  const int start = std::max(0, 2 - it);
397  const int stop = std::min((int)adcPulse.size(), (int)newCharge.size() - it + 2);
398  for (ipulse = start; ipulse < stop; ++ipulse) {
399  const int itoffset = it + ipulse - 2;
400  //notice that if the channel is already busy,
401  //it has already been affected by the leakage of the SARS ADC
402  //if(totFlags[itoffset] || busyFlags[itoffset]) continue;
403  if (!totFlags[itoffset] & !busyFlags[itoffset]) {
404  newCharge[itoffset] += chargeColl[it] * adcPulse[ipulse];
405  }
406  //if(debug) edm::LogVerbatim("HGCFE") << " | " << itoffset << " " << chargeColl[it]*adcPulse[ipulse] << "( " << chargeColl[it] << "->";
407  //if(debug) edm::LogVerbatim("HGCFE") << newCharge[itoffset] << ") ";
408  }
409  }
410 
411  if (debug)
412  edm::LogVerbatim("HGCFE") << std::endl;
413  }
414  };
415  runChargeSharing();
416 
417  //For the future need to understand how to deal with toa for out of time signals
418  //and for that should keep track of the BX firing the ToA somewhere (also to restore the use of finalToA)
419  /*
420  float finalToA(0.);
421  for(int it=0; it<(int)(newCharge.size()); it++){
422  if(toaFlags[it]){
423  finalToA = toaFromToT[it];
424  //to avoid +=25 for small negative time taken as 0
425  while(finalToA < -1.e-5) finalToA+=25.f;
426  while(finalToA > 25.f) finalToA-=25.f;
427  toaFromToT[it] = finalToA;
428  }
429  }
430  */
431  //timeToA is already in 0-25ns range by construction
432 
433  //set new ADCs and ToA
434  if (debug)
435  edm::LogVerbatim("HGCFE") << "\t final result : ";
436  if (lsbADC < 0)
437  lsbADC = adcLSB_fC_;
438  if (maxADC < 0)
439  maxADC = adcSaturation_fC_;
440  for (int it = 0; it < (int)(newCharge.size()); it++) {
441  if (debug)
442  edm::LogVerbatim("HGCFE") << chargeColl[it] << " -> " << newCharge[it] << " ";
443 
444  HGCSample newSample;
445  if (totFlags[it] || busyFlags[it]) {
446  if (totFlags[it]) {
447  //brute force saturation, maybe could to better with an exponential like saturation
448  const float saturatedCharge(std::min(newCharge[it], tdcSaturation_fC_));
449  //working version for in-time PU and signal
450  newSample.set(
451  true, true, gainIdx, (uint16_t)(timeToA / toaLSB_ns_), (uint16_t)(std::floor(saturatedCharge / tdcLSB_fC_)));
452  if (toaFlags[it])
453  newSample.setToAValid(true);
454  } else {
455  newSample.set(false, true, gainIdx, 0, 0);
456  }
457  } else {
458  //brute force saturation, maybe could to better with an exponential like saturation
459  const uint16_t adc = std::floor(std::min(newCharge[it], maxADC) / lsbADC);
460  //working version for in-time PU and signal
461  newSample.set(adc > thrADC, false, gainIdx, (uint16_t)(timeToA / toaLSB_ns_), adc);
462  if (toaFlags[it])
463  newSample.setToAValid(true);
464  }
465  dataFrame.setSample(it, newSample);
466  }
467 
468  if (debug) {
469  std::ostringstream msg;
470  dataFrame.print(msg);
471  edm::LogVerbatim("HGCFE") << msg.str() << std::endl;
472  }
473 }
474 
475 // cause the compiler to generate the appropriate code
477 template class HGCFEElectronics<HGCEEDataFrame>;
478 template class HGCFEElectronics<HGCBHDataFrame>;
479 template class HGCFEElectronics<HGCalDataFrame>;
HGCFEElectronics::HGCFEElectronics
HGCFEElectronics(const edm::ParameterSet &ps)
CTOR.
Definition: HGCFEElectronics.cc:11
mps_fire.i
i
Definition: mps_fire.py:428
start
Definition: start.py:1
dqmMemoryStats.float
float
Definition: dqmMemoryStats.py:127
f
double f[11][100]
Definition: MuScleFitUtils.cc:78
min
T min(T a, T b)
Definition: MathUtil.h:58
gpuClustering::adc
uint16_t *__restrict__ uint16_t const *__restrict__ adc
Definition: gpuClusterChargeCut.h:20
HGCSample::set
void set(bool thr, bool mode, uint16_t gain, uint16_t toa, uint16_t data)
Definition: HGCSample.h:49
mps_check.msg
tuple msg
Definition: mps_check.py:285
HGCFEElectronics::runSimpleShaper
void runSimpleShaper(DFr &dataFrame, hgc::HGCSimHitData &chargeColl, uint32_t thrADC, float lsbADC, uint32_t gainIdx, float maxADC, const hgc_digi::FEADCPulseShape &adcPulse)
applies a shape to each time sample and propagates the tails to the subsequent time samples
Definition: HGCFEElectronics.cc:149
groupFilesInBlocks.temp
list temp
Definition: groupFilesInBlocks.py:142
hgc_digi::FEADCPulseShape
std::array< float, 6 > FEADCPulseShape
Definition: HGCFEElectronics.h:20
hgc_digi
Definition: HGCDigitizerTypes.h:10
HGCSample::setToAValid
void setToAValid(bool toaFired)
Definition: HGCSample.h:47
debug
#define debug
Definition: HDRShower.cc:19
myMath::fast_expf
float fast_expf(float x)
Definition: EcalUncalibRecHitRatioMethodAlgo.h:27
Calorimetry_cff.thickness
thickness
Definition: Calorimetry_cff.py:115
HGCFEElectronics::runTrivialShaper
void runTrivialShaper(DFr &dataFrame, hgc::HGCSimHitData &chargeColl, uint32_t thrADC, float lsbADC, uint32_t gainIdx, float maxADC)
converts charge to digis without pulse shape
Definition: HGCFEElectronics.cc:110
hgc_digi::HGCSimHitData
std::array< HGCSimData_t, nSamples > HGCSimHitData
Definition: HGCDigitizerTypes.h:17
hgcROCParameters_cfi.adcPulse
adcPulse
Definition: hgcROCParameters_cfi.py:10
HGCSample
wrapper for a data word
Definition: HGCSample.h:13
HGCFEElectronics
models the behavior of the front-end electronics
Definition: HGCFEElectronics.h:24
ALCARECOTkAlJpsiMuMu_cff.charge
charge
Definition: ALCARECOTkAlJpsiMuMu_cff.py:47
edm::ParameterSet
Definition: ParameterSet.h:47
SiStripPI::max
Definition: SiStripPayloadInspectorHelper.h:169
HLTEgPhaseIITestSequence_cff.adcNbits
adcNbits
Definition: HLTEgPhaseIITestSequence_cff.py:945
HGCFEElectronics::runShaperWithToT
void runShaperWithToT(DFr &dataFrame, hgc::HGCSimHitData &chargeColl, hgc::HGCSimHitData &toa, CLHEP::HepRandomEngine *engine, uint32_t thrADC, float lsbADC, uint32_t gainIdx, float maxADC, int thickness, float tdcOnsetAuto, const hgc_digi::FEADCPulseShape &adcPulse)
implements pulse shape and switch to time over threshold including deadtime
Definition: HGCFEElectronics.cc:207
createfilelist.int
int
Definition: createfilelist.py:10
HGCDigiCollections.h
heppy_batch.val
val
Definition: heppy_batch.py:351
edm::LogVerbatim
Log< level::Info, true > LogVerbatim
Definition: MessageLogger.h:128
transform.h
Exception
Definition: hltDiff.cc:245
HGCFEElectronics.h
edm::ParameterSet::getParameter
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
HLTEgPhaseIITestSequence_cff.tdcNbits
tdcNbits
Definition: HLTEgPhaseIITestSequence_cff.py:949
funct::pow
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:29
MillePedeFileConverter_cfg.e
e
Definition: MillePedeFileConverter_cfg.py:37