Go to the documentation of this file.00001 #include "SimCalorimetry/EcalSimAlgos/interface/ESElectronicsSim.h"
00002 #include "DataFormats/EcalDigi/interface/ESSample.h"
00003 #include "DataFormats/EcalDetId/interface/ESDetId.h"
00004
00005 #include "FWCore/ServiceRegistry/interface/Service.h"
00006 #include "FWCore/Utilities/interface/RandomNumberGenerator.h"
00007 #include "CLHEP/Random/RandGaussQ.h"
00008 #include "FWCore/Utilities/interface/Exception.h"
00009 #include <iostream>
00010
00011 ESElectronicsSim::ESElectronicsSim (bool addNoise):
00012 addNoise_(addNoise), peds_(0), mips_(0)
00013 {
00014
00015
00016
00017
00018 }
00019
00020 ESElectronicsSim::~ESElectronicsSim ()
00021 {}
00022
00023 void ESElectronicsSim::analogToDigital(const CaloSamples& cs, ESDataFrame& df) const
00024 {
00025
00026 std::vector<ESSample> essamples = encode(cs);
00027
00028 df.setSize(cs.size());
00029 for(int i=0; i<df.size(); i++) {
00030 df.setSample(i, essamples[i]);
00031 }
00032
00033 }
00034
00035 void ESElectronicsSim::digitalToAnalog(const ESDataFrame& df, CaloSamples& cs) const
00036 {
00037
00038 for(int i = 0; i < df.size(); i++) {
00039 cs[i] = decode(df[i], df.id());
00040 }
00041
00042 }
00043
00044 std::vector<ESSample>
00045 ESElectronicsSim::encode(const CaloSamples& timeframe) const
00046 {
00047 edm::Service<edm::RandomNumberGenerator> rng;
00048 if ( ! rng.isAvailable()) {
00049 throw cms::Exception("Configuration")
00050 << "ESElectroncSim requires the RandomNumberGeneratorService\n"
00051 "which is not present in the configuration file. You must add the service\n"
00052 "in the configuration file or remove the modules that require it.";
00053 }
00054
00055
00056 std::vector<ESSample> results;
00057 results.reserve(timeframe.size());
00058
00059 ESPedestals::const_iterator it_ped = peds_->find(timeframe.id());
00060 ESIntercalibConstantMap::const_iterator it_mip = mips_->getMap().find(timeframe.id());
00061 int baseline_ = (int) it_ped->getMean();
00062 double sigma_ = (double) it_ped->getRms();
00063 double MIPADC_ = (double) (*it_mip);
00064
00065 int adc = 0;
00066 double ADCGeV = MIPADC_/MIPToGeV_;
00067
00068 for (int i=0; i<timeframe.size(); i++) {
00069
00070 double noi = 0;
00071 double signal = 0;
00072
00073 if (addNoise_) {
00074 CLHEP::RandGaussQ gaussQDistribution(rng->getEngine(), 0., sigma_);
00075 noi = gaussQDistribution.fire();
00076 }
00077
00078 signal = timeframe[i]*ADCGeV + noi + baseline_;
00079
00080 if (signal>0)
00081 signal += 0.5;
00082 else if (signal<0)
00083 signal -= 0.5;
00084
00085 adc = int(signal);
00086
00087 if (adc>MAXADC) adc = MAXADC;
00088 if (adc<MINADC) adc = MINADC;
00089
00090 results.push_back(ESSample(adc));
00091 }
00092
00093 return results;
00094 }
00095
00096 double ESElectronicsSim::decode(const ESSample & sample, const DetId & id) const
00097 {
00098 return 0. ;
00099 }
00100
00101
00102