File indexing completed on 2024-04-06 12:29:27
0001 #include "SimCalorimetry/EcalSimAlgos/interface/ESElectronicsSim.h"
0002 #include "DataFormats/EcalDigi/interface/ESSample.h"
0003 #include "DataFormats/EcalDetId/interface/ESDetId.h"
0004
0005 #include "FWCore/ServiceRegistry/interface/Service.h"
0006 #include "FWCore/Utilities/interface/RandomNumberGenerator.h"
0007 #include "CLHEP/Random/RandGaussQ.h"
0008 #include "FWCore/Utilities/interface/Exception.h"
0009 #include <iostream>
0010
0011 ESElectronicsSim::ESElectronicsSim(bool addNoise) : addNoise_(addNoise), peds_(nullptr), mips_(nullptr) {
0012
0013
0014
0015
0016 }
0017
0018 ESElectronicsSim::~ESElectronicsSim() {}
0019
0020 void ESElectronicsSim::analogToDigital(CLHEP::HepRandomEngine* engine, const CaloSamples& cs, ESDataFrame& df) const {
0021 std::vector<ESSample> essamples = encode(cs, engine);
0022
0023 df.setSize(cs.size());
0024 for (int i = 0; i < df.size(); i++) {
0025 df.setSample(i, essamples[i]);
0026 }
0027 }
0028
0029 void ESElectronicsSim::digitalToAnalog(const ESDataFrame& df, CaloSamples& cs) const {
0030 for (int i = 0; i < df.size(); i++) {
0031 cs[i] = decode(df[i], df.id());
0032 }
0033 }
0034
0035 std::vector<ESSample> ESElectronicsSim::encode(const CaloSamples& timeframe, CLHEP::HepRandomEngine* engine) const {
0036 edm::Service<edm::RandomNumberGenerator> rng;
0037 if (!rng.isAvailable()) {
0038 throw cms::Exception("Configuration")
0039 << "ESElectroncSim requires the RandomNumberGeneratorService\n"
0040 "which is not present in the configuration file. You must add the service\n"
0041 "in the configuration file or remove the modules that require it.";
0042 }
0043
0044 std::vector<ESSample> results;
0045 results.reserve(timeframe.size());
0046
0047 ESPedestals::const_iterator it_ped = peds_->find(timeframe.id());
0048 ESIntercalibConstantMap::const_iterator it_mip = mips_->getMap().find(timeframe.id());
0049 int baseline_ = (int)it_ped->getMean();
0050 double sigma_ = (double)it_ped->getRms();
0051 double MIPADC_ = (double)(*it_mip);
0052
0053 int adc = 0;
0054 double ADCGeV = MIPADC_ / MIPToGeV_;
0055
0056 for (int i = 0; i < timeframe.size(); i++) {
0057 double noi = 0;
0058 double signal = 0;
0059
0060 if (addNoise_) {
0061 noi = CLHEP::RandGaussQ::shoot(engine, 0., sigma_);
0062 }
0063
0064 signal = timeframe[i] * ADCGeV + noi + baseline_;
0065
0066 if (signal > 0)
0067 signal += 0.5;
0068 else if (signal < 0)
0069 signal -= 0.5;
0070
0071 adc = int(signal);
0072
0073 if (adc > MAXADC)
0074 adc = MAXADC;
0075 if (adc < MINADC)
0076 adc = MINADC;
0077
0078 results.emplace_back(adc);
0079 }
0080
0081 return results;
0082 }
0083
0084 double ESElectronicsSim::decode(const ESSample& sample, const DetId& id) const { return 0.; }