CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
ESElectronicsSim.cc
Go to the documentation of this file.
4 
7 #include "CLHEP/Random/RandGaussQ.h"
9 #include <iostream>
10 
12  addNoise_(addNoise), peds_(0), mips_(0)
13 {
14  // Preshower Electronics Simulation
15  // gain = 1 : low gain for data taking
16  // gain = 2 : high gain for calibration and low energy runs
17  // For 300(310/320) um Si, the MIP is 78.47(81.08/83.7) keV
18 }
19 
21 {}
22 
24 {
25 
26  std::vector<ESSample> essamples = encode(cs);
27 
28  df.setSize(cs.size());
29  for(int i=0; i<df.size(); i++) {
30  df.setSample(i, essamples[i]);
31  }
32 
33 }
34 
36 {
37 
38  for(int i = 0; i < df.size(); i++) {
39  cs[i] = decode(df[i], df.id());
40  }
41 
42 }
43 
44 std::vector<ESSample>
45 ESElectronicsSim::encode(const CaloSamples& timeframe) const
46 {
48  if ( ! rng.isAvailable()) {
49  throw cms::Exception("Configuration")
50  << "ESElectroncSim requires the RandomNumberGeneratorService\n"
51  "which is not present in the configuration file. You must add the service\n"
52  "in the configuration file or remove the modules that require it.";
53  }
54 
55 
56  std::vector<ESSample> results;
57  results.reserve(timeframe.size());
58 
59  ESPedestals::const_iterator it_ped = peds_->find(timeframe.id());
61  int baseline_ = (int) it_ped->getMean();
62  double sigma_ = (double) it_ped->getRms();
63  double MIPADC_ = (double) (*it_mip);
64 
65  int adc = 0;
66  double ADCGeV = MIPADC_/MIPToGeV_;
67 
68  for (int i=0; i<timeframe.size(); i++) {
69 
70  double noi = 0;
71  double signal = 0;
72 
73  if (addNoise_) {
74  CLHEP::RandGaussQ gaussQDistribution(rng->getEngine(), 0., sigma_);
75  noi = gaussQDistribution.fire();
76  }
77 
78  signal = timeframe[i]*ADCGeV + noi + baseline_;
79 
80  if (signal>0)
81  signal += 0.5;
82  else if (signal<0)
83  signal -= 0.5;
84 
85  adc = int(signal);
86 
87  if (adc>MAXADC) adc = MAXADC;
88  if (adc<MINADC) adc = MINADC;
89 
90  results.push_back(ESSample(adc));
91  }
92 
93  return results;
94 }
95 
96 double ESElectronicsSim::decode(const ESSample & sample, const DetId & id) const
97 {
98  return 0. ;
99 }
100 
101 
102 
int adc(sample_type sample)
get the ADC sample (12 bits)
int i
Definition: DBlmapReader.cc:9
auto_ptr< ClusterSequence > cs
const ESIntercalibConstants * mips_
virtual void digitalToAnalog(const ESDataFrame &df, CaloSamples &cs) const
const ESDetId & id() const
Definition: ESDataFrame.h:21
const self & getMap() const
int size() const
Definition: ESDataFrame.h:23
std::vector< ESSample > encode(const CaloSamples &timeframe) const
void setSize(int size)
Definition: ESDataFrame.cc:27
ESElectronicsSim(bool addNoise)
const_iterator find(uint32_t rawId) const
double decode(const ESSample &sample, const DetId &detId) const
bool isAvailable() const
Definition: Service.h:47
virtual CLHEP::HepRandomEngine & getEngine() const =0
Use this to get the random number engine, this is the only function most users should call...
void setSample(int i, const ESSample &sam)
Definition: ESDataFrame.h:30
virtual void analogToDigital(const CaloSamples &cs, ESDataFrame &df) const
Definition: DetId.h:20
int size() const
get the size
Definition: CaloSamples.h:24
std::vector< Item >::const_iterator const_iterator
virtual ~ESElectronicsSim()
DetId id() const
get the (generic) id
Definition: CaloSamples.h:21
const ESPedestals * peds_