File indexing completed on 2025-04-04 01:26:57
0001 #include <memory>
0002
0003 #include "DataFormats/EcalDigi/interface/EcalDigiCollections.h"
0004 #include "FWCore/Framework/interface/Event.h"
0005 #include "SimCalorimetry/CaloSimAlgos/interface/CaloHitResponse.h"
0006 #include "SimCalorimetry/EcalSimAlgos/interface/APDSimParameters.h"
0007 #include "SimCalorimetry/EcalSimAlgos/interface/ComponentSimParameterMap.h"
0008 #include "SimCalorimetry/EcalSimAlgos/interface/EBHitResponse.h"
0009 #include "SimCalorimetry/EcalSimAlgos/interface/EEHitResponse.h"
0010 #include "SimCalorimetry/EcalSimAlgos/interface/ESElectronicsSim.h"
0011 #include "SimCalorimetry/EcalSimAlgos/interface/ESElectronicsSimFast.h"
0012 #include "SimCalorimetry/EcalSimAlgos/interface/ESHitResponse.h"
0013 #include "SimCalorimetry/EcalSimAlgos/interface/EcalCoder.h"
0014 #include "SimCalorimetry/EcalSimAlgos/interface/EcalElectronicsSim.h"
0015 #include "SimCalorimetry/EcalSimAlgos/interface/EcalSimParameterMap.h"
0016 #include "SimCalorimetry/EcalSimProducers/interface/EcalDigiProducer.h"
0017 #include "CalibFormats/CaloObjects/interface/CaloSamples.h"
0018 #include "DataFormats/Common/interface/Handle.h"
0019 #include "FWCore/AbstractServices/interface/RandomNumberGenerator.h"
0020 #include "FWCore/Framework/interface/ConsumesCollector.h"
0021 #include "FWCore/Framework/interface/Event.h"
0022 #include "FWCore/Framework/interface/EventSetup.h"
0023 #include "FWCore/Framework/interface/LuminosityBlock.h"
0024 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0025 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0026 #include "FWCore/ServiceRegistry/interface/Service.h"
0027 #include "FWCore/Utilities/interface/Exception.h"
0028 #include "FWCore/Utilities/interface/StreamID.h"
0029 #include "Geometry/CaloGeometry/interface/CaloGeometry.h"
0030 #include "Geometry/CaloGeometry/interface/CaloSubdetectorGeometry.h"
0031 #include "SimCalorimetry/EcalSimAlgos/interface/ESDigitizer.h"
0032 #include "SimGeneral/MixingModule/interface/PileUpEventPrincipal.h"
0033
0034 #include "Geometry/EcalAlgo/interface/EcalEndcapGeometry.h"
0035
0036 EcalDigiProducer::EcalDigiProducer(const edm::ParameterSet ¶ms,
0037 edm::ProducesCollector producesCollector,
0038 edm::ConsumesCollector &iC)
0039 : EcalDigiProducer(params, iC) {
0040 if (m_apdSeparateDigi)
0041 producesCollector.produces<EBDigiCollection>(m_apdDigiTag);
0042
0043 if (m_componentSeparateDigi)
0044 producesCollector.produces<EBDigiCollection>(m_componentDigiTag);
0045
0046 producesCollector.produces<EBDigiCollection>(m_EBdigiCollection);
0047 producesCollector.produces<EEDigiCollection>(m_EEdigiCollection);
0048 producesCollector.produces<ESDigiCollection>(m_ESdigiCollection);
0049 }
0050
0051
0052 EcalDigiProducer::EcalDigiProducer(const edm::ParameterSet ¶ms, edm::ConsumesCollector &iC)
0053 : DigiAccumulatorMixMod(),
0054 m_APDShape(iC),
0055 m_ComponentShapes(iC),
0056 m_EBShape(iC),
0057 m_EEShape(iC),
0058 m_ESShape(),
0059 m_EBdigiCollection(params.getParameter<std::string>("EBdigiCollection")),
0060 m_EEdigiCollection(params.getParameter<std::string>("EEdigiCollection")),
0061 m_ESdigiCollection(params.getParameter<std::string>("ESdigiCollection")),
0062 m_hitsProducerTag(params.getParameter<std::string>("hitsProducer")),
0063 m_HitsEBToken_(iC.consumes<std::vector<PCaloHit>>(edm::InputTag(m_hitsProducerTag, "EcalHitsEB"))),
0064 m_HitsEEToken_(iC.consumes<std::vector<PCaloHit>>(edm::InputTag(m_hitsProducerTag, "EcalHitsEE"))),
0065 m_HitsESToken_(iC.consumes<std::vector<PCaloHit>>(edm::InputTag(m_hitsProducerTag, "EcalHitsES"))),
0066 m_pedestalsToken(iC.esConsumes()),
0067 m_icalToken(iC.esConsumes()),
0068 m_laserToken(iC.esConsumes()),
0069 m_agcToken(iC.esConsumes()),
0070 m_grToken(iC.esConsumes()),
0071 m_geometryToken(iC.esConsumes()),
0072 m_useLCcorrection(params.getUntrackedParameter<bool>("UseLCcorrection")),
0073 m_apdSeparateDigi(params.getParameter<bool>("apdSeparateDigi")),
0074 m_componentSeparateDigi(params.getParameter<bool>("componentSeparateDigi")),
0075
0076 m_EBs25notCont(params.getParameter<double>("EBs25notContainment")),
0077 m_EEs25notCont(params.getParameter<double>("EEs25notContainment")),
0078
0079 m_readoutFrameSize(ecalPh1::sampleSize),
0080 m_ParameterMap(new EcalSimParameterMap(params.getParameter<double>("simHitToPhotoelectronsBarrel"),
0081 params.getParameter<double>("simHitToPhotoelectronsEndcap"),
0082 params.getParameter<double>("photoelectronsToAnalogBarrel"),
0083 params.getParameter<double>("photoelectronsToAnalogEndcap"),
0084 params.getParameter<double>("samplingFactor"),
0085 params.getParameter<double>("timePhase"),
0086 m_readoutFrameSize,
0087 params.getParameter<int>("binOfMaximum"),
0088 params.getParameter<bool>("doPhotostatistics"),
0089 params.getParameter<bool>("syncPhase"))),
0090
0091 m_apdDigiTag(params.getParameter<std::string>("apdDigiTag")),
0092 m_apdParameters(new APDSimParameters(params.getParameter<bool>("apdAddToBarrel"),
0093 m_apdSeparateDigi,
0094 params.getParameter<double>("apdSimToPELow"),
0095 params.getParameter<double>("apdSimToPEHigh"),
0096 params.getParameter<double>("apdTimeOffset"),
0097 params.getParameter<double>("apdTimeOffWidth"),
0098 params.getParameter<bool>("apdDoPEStats"),
0099 m_apdDigiTag,
0100 params.getParameter<std::vector<double>>("apdNonlParms"))),
0101
0102 m_componentDigiTag(params.getParameter<std::string>("componentDigiTag")),
0103 m_componentParameters(
0104 std::make_unique<ComponentSimParameterMap>(params.getParameter<bool>("componentAddToBarrel"),
0105 m_componentSeparateDigi,
0106 params.getParameter<double>("simHitToPhotoelectronsBarrel"),
0107 0,
0108 params.getParameter<double>("photoelectronsToAnalogBarrel"),
0109 0,
0110 params.getParameter<double>("samplingFactor"),
0111 params.getParameter<double>("componentTimePhase"),
0112 m_readoutFrameSize,
0113 params.getParameter<int>("binOfMaximum"),
0114 params.getParameter<bool>("doPhotostatistics"),
0115 params.getParameter<bool>("syncPhase"))),
0116
0117 m_APDResponse(!m_apdSeparateDigi ? nullptr
0118 : new EBHitResponse(m_ParameterMap.get(),
0119 &m_EBShape,
0120 true,
0121 false,
0122 m_apdParameters.get(),
0123 &m_APDShape,
0124 m_componentParameters.get(),
0125 &m_ComponentShapes)),
0126
0127 m_ComponentResponse(!m_componentSeparateDigi
0128 ? nullptr
0129 : std::make_unique<EBHitResponse>(
0130 m_ParameterMap.get(),
0131 &m_EBShape,
0132 false,
0133 true,
0134 m_apdParameters.get(),
0135 &m_APDShape,
0136 m_componentParameters.get(),
0137 &m_ComponentShapes)),
0138
0139 m_EBResponse(new EBHitResponse(m_ParameterMap.get(),
0140 &m_EBShape,
0141 false,
0142 false,
0143 m_apdParameters.get(),
0144 &m_APDShape,
0145 m_componentParameters.get(),
0146 &m_ComponentShapes)),
0147
0148 m_EEResponse(new EEHitResponse(m_ParameterMap.get(), &m_EEShape)),
0149 m_ESResponse(new ESHitResponse(m_ParameterMap.get(), &m_ESShape)),
0150 m_ESOldResponse(new CaloHitResponse(m_ParameterMap.get(), &m_ESShape)),
0151
0152 m_addESNoise(params.getParameter<bool>("doESNoise")),
0153 m_PreMix1(params.getParameter<bool>("EcalPreMixStage1")),
0154 m_PreMix2(params.getParameter<bool>("EcalPreMixStage2")),
0155
0156 m_doFastES(params.getParameter<bool>("doFast")),
0157
0158 m_doEB(params.getParameter<bool>("doEB")),
0159 m_doEE(params.getParameter<bool>("doEE")),
0160 m_doES(params.getParameter<bool>("doES")),
0161
0162 m_ESElectronicsSim(m_doFastES ? nullptr : new ESElectronicsSim(m_addESNoise)),
0163
0164 m_ESOldDigitizer(m_doFastES ? nullptr
0165 : new ESOldDigitizer(m_ESOldResponse.get(), m_ESElectronicsSim.get(), m_addESNoise)),
0166
0167 m_ESElectronicsSimFast(!m_doFastES ? nullptr : new ESElectronicsSimFast(m_addESNoise, m_PreMix1)),
0168
0169 m_ESDigitizer(!m_doFastES ? nullptr
0170 : new ESDigitizer(m_ESResponse.get(), m_ESElectronicsSimFast.get(), m_addESNoise)),
0171
0172 m_APDDigitizer(nullptr),
0173 m_ComponentDigitizer(nullptr),
0174 m_BarrelDigitizer(nullptr),
0175 m_EndcapDigitizer(nullptr),
0176 m_ElectronicsSim(nullptr),
0177 m_Coder(nullptr),
0178 m_APDElectronicsSim(nullptr),
0179 m_APDCoder(nullptr),
0180 m_Geometry(nullptr),
0181 m_EBCorrNoise({{nullptr, nullptr, nullptr}}),
0182 m_EECorrNoise({{nullptr, nullptr, nullptr}}) {
0183
0184
0185
0186
0187
0188 if (m_doEB)
0189 iC.consumes<std::vector<PCaloHit>>(edm::InputTag(m_hitsProducerTag, "EcalHitsEB"));
0190 if (m_doEE)
0191 iC.consumes<std::vector<PCaloHit>>(edm::InputTag(m_hitsProducerTag, "EcalHitsEE"));
0192 if (m_doES) {
0193 iC.consumes<std::vector<PCaloHit>>(edm::InputTag(m_hitsProducerTag, "EcalHitsES"));
0194 m_esGainToken = iC.esConsumes();
0195 m_esMIPToGeVToken = iC.esConsumes();
0196 m_esPedestalsToken = iC.esConsumes();
0197 m_esMIPsToken = iC.esConsumes();
0198 }
0199
0200 const std::vector<double> ebCorMatG12 = params.getParameter<std::vector<double>>("EBCorrNoiseMatrixG12");
0201 const std::vector<double> eeCorMatG12 = params.getParameter<std::vector<double>>("EECorrNoiseMatrixG12");
0202 const std::vector<double> ebCorMatG06 = params.getParameter<std::vector<double>>("EBCorrNoiseMatrixG06");
0203 const std::vector<double> eeCorMatG06 = params.getParameter<std::vector<double>>("EECorrNoiseMatrixG06");
0204 const std::vector<double> ebCorMatG01 = params.getParameter<std::vector<double>>("EBCorrNoiseMatrixG01");
0205 const std::vector<double> eeCorMatG01 = params.getParameter<std::vector<double>>("EECorrNoiseMatrixG01");
0206
0207 const bool applyConstantTerm = params.getParameter<bool>("applyConstantTerm");
0208 const double rmsConstantTerm = params.getParameter<double>("ConstantTerm");
0209
0210 const bool addNoise = params.getParameter<bool>("doENoise");
0211 const bool cosmicsPhase = params.getParameter<bool>("cosmicsPhase");
0212 const double cosmicsShift = params.getParameter<double>("cosmicsShift");
0213
0214
0215
0216
0217 if (cosmicsPhase) {
0218 if (m_doEB)
0219 m_EBResponse->setPhaseShift(1. + cosmicsShift);
0220 if (m_doEE)
0221 m_EEResponse->setPhaseShift(1. + cosmicsShift);
0222 }
0223
0224 EcalCorrMatrix ebMatrix[3];
0225 EcalCorrMatrix eeMatrix[3];
0226
0227 assert(ebCorMatG12.size() == m_readoutFrameSize);
0228 assert(eeCorMatG12.size() == m_readoutFrameSize);
0229 assert(ebCorMatG06.size() == m_readoutFrameSize);
0230 assert(eeCorMatG06.size() == m_readoutFrameSize);
0231 assert(ebCorMatG01.size() == m_readoutFrameSize);
0232 assert(eeCorMatG01.size() == m_readoutFrameSize);
0233
0234 assert(1.e-7 > fabs(ebCorMatG12[0] - 1.0));
0235 assert(1.e-7 > fabs(ebCorMatG06[0] - 1.0));
0236 assert(1.e-7 > fabs(ebCorMatG01[0] - 1.0));
0237 assert(1.e-7 > fabs(eeCorMatG12[0] - 1.0));
0238 assert(1.e-7 > fabs(eeCorMatG06[0] - 1.0));
0239 assert(1.e-7 > fabs(eeCorMatG01[0] - 1.0));
0240
0241 for (unsigned int row(0); row != m_readoutFrameSize; ++row) {
0242 assert(0 == row || 1. >= ebCorMatG12[row]);
0243 assert(0 == row || 1. >= ebCorMatG06[row]);
0244 assert(0 == row || 1. >= ebCorMatG01[row]);
0245 assert(0 == row || 1. >= eeCorMatG12[row]);
0246 assert(0 == row || 1. >= eeCorMatG06[row]);
0247 assert(0 == row || 1. >= eeCorMatG01[row]);
0248 for (unsigned int column(0); column <= row; ++column) {
0249 const unsigned int index(row - column);
0250 ebMatrix[0](row, column) = ebCorMatG12[index];
0251 eeMatrix[0](row, column) = eeCorMatG12[index];
0252 ebMatrix[1](row, column) = ebCorMatG06[index];
0253 eeMatrix[1](row, column) = eeCorMatG06[index];
0254 ebMatrix[2](row, column) = ebCorMatG01[index];
0255 eeMatrix[2](row, column) = eeCorMatG01[index];
0256 }
0257 }
0258
0259 m_EBCorrNoise[0] = std::make_unique<CorrelatedNoisifier<EcalCorrMatrix>>(ebMatrix[0]);
0260 m_EECorrNoise[0] = std::make_unique<CorrelatedNoisifier<EcalCorrMatrix>>(eeMatrix[0]);
0261 m_EBCorrNoise[1] = std::make_unique<CorrelatedNoisifier<EcalCorrMatrix>>(ebMatrix[1]);
0262 m_EECorrNoise[1] = std::make_unique<CorrelatedNoisifier<EcalCorrMatrix>>(eeMatrix[1]);
0263 m_EBCorrNoise[2] = std::make_unique<CorrelatedNoisifier<EcalCorrMatrix>>(ebMatrix[2]);
0264 m_EECorrNoise[2] = std::make_unique<CorrelatedNoisifier<EcalCorrMatrix>>(eeMatrix[2]);
0265
0266 m_Coder = std::make_unique<EcalCoder>(addNoise,
0267 m_PreMix1,
0268 m_EBCorrNoise[0].get(),
0269 m_EECorrNoise[0].get(),
0270 m_EBCorrNoise[1].get(),
0271 m_EECorrNoise[1].get(),
0272 m_EBCorrNoise[2].get(),
0273 m_EECorrNoise[2].get());
0274
0275 m_ElectronicsSim =
0276 std::make_unique<EcalElectronicsSim_Ph1>(m_ParameterMap.get(), m_Coder.get(), applyConstantTerm, rmsConstantTerm);
0277
0278 if (m_apdSeparateDigi) {
0279 m_APDCoder = std::make_unique<EcalCoder>(false,
0280 m_PreMix1,
0281 m_EBCorrNoise[0].get(),
0282 m_EECorrNoise[0].get(),
0283 m_EBCorrNoise[1].get(),
0284 m_EECorrNoise[1].get(),
0285 m_EBCorrNoise[2].get(),
0286 m_EECorrNoise[2].get());
0287
0288 m_APDElectronicsSim = std::make_unique<EcalElectronicsSim_Ph1>(
0289 m_ParameterMap.get(), m_APDCoder.get(), applyConstantTerm, rmsConstantTerm);
0290
0291 m_APDDigitizer = std::make_unique<EBDigitizer>(m_APDResponse.get(), m_APDElectronicsSim.get(), false);
0292 }
0293 if (m_componentSeparateDigi) {
0294 m_ComponentCoder = std::make_unique<EcalCoder>(addNoise,
0295 m_PreMix1,
0296 m_EBCorrNoise[0].get(),
0297 m_EECorrNoise[0].get(),
0298 m_EBCorrNoise[1].get(),
0299 m_EECorrNoise[1].get(),
0300 m_EBCorrNoise[2].get(),
0301 m_EECorrNoise[2].get());
0302 m_ComponentElectronicsSim = std::make_unique<EcalElectronicsSim_Ph1>(
0303 m_ParameterMap.get(), m_ComponentCoder.get(), applyConstantTerm, rmsConstantTerm);
0304 m_ComponentDigitizer =
0305 std::make_unique<EBDigitizer>(m_ComponentResponse.get(), m_ComponentElectronicsSim.get(), addNoise);
0306 }
0307
0308 if (m_doEB) {
0309 m_BarrelDigitizer = std::make_unique<EBDigitizer>(m_EBResponse.get(), m_ElectronicsSim.get(), addNoise);
0310 }
0311
0312 if (m_doEE) {
0313 m_EndcapDigitizer = std::make_unique<EEDigitizer>(m_EEResponse.get(), m_ElectronicsSim.get(), addNoise);
0314 }
0315 }
0316
0317 EcalDigiProducer::~EcalDigiProducer() {}
0318
0319 void EcalDigiProducer::initializeEvent(edm::Event const &event, edm::EventSetup const &eventSetup) {
0320 edm::Service<edm::RandomNumberGenerator> rng;
0321 randomEngine_ = &rng->getEngine(event.streamID());
0322
0323 checkGeometry(eventSetup);
0324 checkCalibrations(event, eventSetup);
0325 if (m_doEB) {
0326 m_BarrelDigitizer->initializeHits();
0327 if (m_apdSeparateDigi) {
0328 m_APDDigitizer->initializeHits();
0329 }
0330 if (m_componentSeparateDigi) {
0331 m_ComponentDigitizer->initializeHits();
0332 }
0333 }
0334 if (m_doEE) {
0335 m_EndcapDigitizer->initializeHits();
0336 }
0337 if (m_doES) {
0338 if (m_doFastES) {
0339 m_ESDigitizer->initializeHits();
0340 } else {
0341 m_ESOldDigitizer->initializeHits();
0342 }
0343 }
0344 }
0345
0346 void EcalDigiProducer::accumulateCaloHits(HitsHandle const &ebHandle,
0347 HitsHandle const &eeHandle,
0348 HitsHandle const &esHandle,
0349 int bunchCrossing) {
0350 if (m_doEB && ebHandle.isValid()) {
0351 m_BarrelDigitizer->add(*ebHandle.product(), bunchCrossing, randomEngine_);
0352
0353 if (m_apdSeparateDigi) {
0354 m_APDDigitizer->add(*ebHandle.product(), bunchCrossing, randomEngine_);
0355 }
0356 if (m_componentSeparateDigi) {
0357 m_ComponentDigitizer->add(*ebHandle.product(), bunchCrossing, randomEngine_);
0358 }
0359 }
0360
0361 if (m_doEE && eeHandle.isValid()) {
0362 m_EndcapDigitizer->add(*eeHandle.product(), bunchCrossing, randomEngine_);
0363 }
0364
0365 if (m_doES && esHandle.isValid()) {
0366 if (m_doFastES) {
0367 m_ESDigitizer->add(*esHandle.product(), bunchCrossing, randomEngine_);
0368 } else {
0369 m_ESOldDigitizer->add(*esHandle.product(), bunchCrossing, randomEngine_);
0370 }
0371 }
0372 }
0373
0374 void EcalDigiProducer::accumulate(edm::Event const &e, edm::EventSetup const &eventSetup) {
0375
0376 const edm::Handle<std::vector<PCaloHit>> &ebHandle = e.getHandle(m_HitsEBToken_);
0377 if (m_doEB) {
0378 m_EBShape.setEventSetup(eventSetup);
0379 m_APDShape.setEventSetup(eventSetup);
0380 m_ComponentShapes.setEventSetup(eventSetup);
0381 }
0382
0383 const edm::Handle<std::vector<PCaloHit>> &eeHandle = e.getHandle(m_HitsEEToken_);
0384 if (m_doEE) {
0385 m_EEShape.setEventSetup(eventSetup);
0386 }
0387
0388 const edm::Handle<std::vector<PCaloHit>> &esHandle = e.getHandle(m_HitsESToken_);
0389
0390 accumulateCaloHits(ebHandle, eeHandle, esHandle, 0);
0391 }
0392
0393 void EcalDigiProducer::accumulate(PileUpEventPrincipal const &e,
0394 edm::EventSetup const &eventSetup,
0395 edm::StreamID const &streamID) {
0396
0397 edm::Handle<std::vector<PCaloHit>> ebHandle;
0398 if (m_doEB) {
0399 edm::InputTag ebTag(m_hitsProducerTag, "EcalHitsEB");
0400 e.getByLabel(ebTag, ebHandle);
0401 }
0402
0403 edm::Handle<std::vector<PCaloHit>> eeHandle;
0404 if (m_doEE) {
0405 edm::InputTag eeTag(m_hitsProducerTag, "EcalHitsEE");
0406 e.getByLabel(eeTag, eeHandle);
0407 }
0408
0409 edm::Handle<std::vector<PCaloHit>> esHandle;
0410 if (m_doES) {
0411 edm::InputTag esTag(m_hitsProducerTag, "EcalHitsES");
0412 e.getByLabel(esTag, esHandle);
0413 }
0414
0415 accumulateCaloHits(ebHandle, eeHandle, esHandle, e.bunchCrossing());
0416 }
0417
0418 void EcalDigiProducer::finalizeEvent(edm::Event &event, edm::EventSetup const &eventSetup) {
0419
0420 std::unique_ptr<EBDigiCollection> apdResult(!m_apdSeparateDigi || !m_doEB ? nullptr : new EBDigiCollection());
0421 std::unique_ptr<EBDigiCollection> componentResult(!m_componentSeparateDigi || !m_doEB ? nullptr
0422 : new EBDigiCollection());
0423 std::unique_ptr<EBDigiCollection> barrelResult(new EBDigiCollection());
0424 std::unique_ptr<EEDigiCollection> endcapResult(new EEDigiCollection());
0425 std::unique_ptr<ESDigiCollection> preshowerResult(new ESDigiCollection());
0426
0427
0428
0429 if (m_doEB) {
0430 m_BarrelDigitizer->run(*barrelResult, randomEngine_);
0431 cacheEBDigis(&*barrelResult);
0432
0433 edm::LogInfo("DigiInfo") << "EB Digis: " << barrelResult->size();
0434
0435 if (m_apdSeparateDigi) {
0436 m_APDDigitizer->run(*apdResult, randomEngine_);
0437 edm::LogInfo("DigiInfo") << "APD Digis: " << apdResult->size();
0438 }
0439 if (m_componentSeparateDigi) {
0440 m_ComponentDigitizer->run(*componentResult, randomEngine_);
0441 edm::LogInfo("DigiInfo") << "Component Digis: " << componentResult->size();
0442 }
0443 }
0444
0445 if (m_doEE) {
0446 m_EndcapDigitizer->run(*endcapResult, randomEngine_);
0447 edm::LogInfo("EcalDigi") << "EE Digis: " << endcapResult->size();
0448 cacheEEDigis(&*endcapResult);
0449 }
0450 if (m_doES) {
0451 if (m_doFastES) {
0452 m_ESDigitizer->run(*preshowerResult, randomEngine_);
0453 } else {
0454 m_ESOldDigitizer->run(*preshowerResult, randomEngine_);
0455 }
0456 edm::LogInfo("EcalDigi") << "ES Digis: " << preshowerResult->size();
0457 }
0458
0459
0460 if (m_apdSeparateDigi) {
0461
0462 }
0463
0464 event.put(std::move(barrelResult), m_EBdigiCollection);
0465 if (m_componentSeparateDigi) {
0466 event.put(std::move(componentResult), m_componentDigiTag);
0467 }
0468 event.put(std::move(endcapResult), m_EEdigiCollection);
0469 event.put(std::move(preshowerResult), m_ESdigiCollection);
0470
0471 randomEngine_ = nullptr;
0472 }
0473
0474 void EcalDigiProducer::beginLuminosityBlock(edm::LuminosityBlock const &lumi, edm::EventSetup const &setup) {
0475 edm::Service<edm::RandomNumberGenerator> rng;
0476 if (!rng.isAvailable()) {
0477 throw cms::Exception("Configuration") << "RandomNumberGenerator service is not available.\n"
0478 "You must add the service in the configuration file\n"
0479 "or remove the module that requires it.";
0480 }
0481 CLHEP::HepRandomEngine *engine = &rng->getEngine(lumi.index());
0482
0483 if (m_doEB) {
0484 if (nullptr != m_APDResponse)
0485 m_APDResponse->initialize(engine);
0486 if (nullptr != m_ComponentResponse)
0487 m_ComponentResponse->initialize(engine);
0488 m_EBResponse->initialize(engine);
0489 }
0490 }
0491
0492 void EcalDigiProducer::checkCalibrations(const edm::Event &event, const edm::EventSetup &eventSetup) {
0493
0494
0495 const EcalPedestals *pedestals = &eventSetup.getData(m_pedestalsToken);
0496
0497 m_Coder->setPedestals(pedestals);
0498 if (nullptr != m_APDCoder)
0499 m_APDCoder->setPedestals(pedestals);
0500 if (nullptr != m_ComponentCoder)
0501 m_ComponentCoder->setPedestals(pedestals);
0502
0503
0504 const EcalIntercalibConstantsMC *ical = &eventSetup.getData(m_icalToken);
0505
0506 m_Coder->setIntercalibConstants(ical);
0507 if (nullptr != m_APDCoder)
0508 m_APDCoder->setIntercalibConstants(ical);
0509 if (nullptr != m_ComponentCoder)
0510 m_ComponentCoder->setIntercalibConstants(ical);
0511
0512 m_EBResponse->setIntercal(ical);
0513 if (nullptr != m_APDResponse)
0514 m_APDResponse->setIntercal(ical);
0515 if (nullptr != m_ComponentResponse)
0516 m_ComponentResponse->setIntercal(ical);
0517
0518
0519 const EcalLaserDbService *laser = &eventSetup.getData(m_laserToken);
0520 const edm::TimeValue_t eventTimeValue = event.time().value();
0521
0522 m_EBResponse->setEventTime(eventTimeValue);
0523 m_EBResponse->setLaserConstants(laser, m_useLCcorrection);
0524
0525 m_EEResponse->setEventTime(eventTimeValue);
0526 m_EEResponse->setLaserConstants(laser, m_useLCcorrection);
0527
0528
0529 const EcalADCToGeVConstant *agc = &eventSetup.getData(m_agcToken);
0530
0531
0532 const EcalGainRatios *gr = &eventSetup.getData(m_grToken);
0533
0534 m_Coder->setGainRatios(gr);
0535 if (nullptr != m_APDCoder)
0536 m_APDCoder->setGainRatios(gr);
0537 if (nullptr != m_ComponentCoder)
0538 m_ComponentCoder->setGainRatios(gr);
0539
0540 EcalMGPAGainRatio *defaultRatios = new EcalMGPAGainRatio();
0541
0542 double theGains[m_Coder->NGAINS + 1];
0543 theGains[0] = 0.;
0544 theGains[3] = 1.;
0545 theGains[2] = defaultRatios->gain6Over1();
0546 theGains[1] = theGains[2] * (defaultRatios->gain12Over6());
0547
0548 LogDebug("EcalDigi") << " Gains: "
0549 << "\n"
0550 << " g1 = " << theGains[1] << "\n"
0551 << " g2 = " << theGains[2] << "\n"
0552 << " g3 = " << theGains[3];
0553
0554 delete defaultRatios;
0555
0556 const double EBscale((agc->getEBValue()) * theGains[1] * (m_Coder->MAXADC) * m_EBs25notCont);
0557
0558 LogDebug("EcalDigi") << " GeV/ADC = " << agc->getEBValue() << "\n"
0559 << " notCont = " << m_EBs25notCont << "\n"
0560 << " saturation for EB = " << EBscale << ", " << m_EBs25notCont;
0561
0562 const double EEscale((agc->getEEValue()) * theGains[1] * (m_Coder->MAXADC) * m_EEs25notCont);
0563
0564 LogDebug("EcalDigi") << " GeV/ADC = " << agc->getEEValue() << "\n"
0565 << " notCont = " << m_EEs25notCont << "\n"
0566 << " saturation for EB = " << EEscale << ", " << m_EEs25notCont;
0567
0568 m_Coder->setFullScaleEnergy(EBscale, EEscale);
0569 if (nullptr != m_APDCoder)
0570 m_APDCoder->setFullScaleEnergy(EBscale, EEscale);
0571 if (nullptr != m_ComponentCoder)
0572 m_ComponentCoder->setFullScaleEnergy(EBscale, EEscale);
0573
0574 if (m_doES) {
0575
0576 const ESGain *esgain = &eventSetup.getData(m_esGainToken);
0577 const ESPedestals *espeds = &eventSetup.getData(m_esPedestalsToken);
0578 const ESIntercalibConstants *esmips = &eventSetup.getData(m_esMIPsToken);
0579 const ESMIPToGeVConstant *esMipToGeV = &eventSetup.getData(m_esMIPToGeVToken);
0580 const int ESGain(1.1 > esgain->getESGain() ? 1 : 2);
0581 const double ESMIPToGeV((1 == ESGain) ? esMipToGeV->getESValueLow() : esMipToGeV->getESValueHigh());
0582
0583 m_ESShape.setGain(ESGain);
0584 if (!m_doFastES) {
0585 m_ESElectronicsSim->setGain(ESGain);
0586 m_ESElectronicsSim->setPedestals(espeds);
0587 m_ESElectronicsSim->setMIPs(esmips);
0588 m_ESElectronicsSim->setMIPToGeV(ESMIPToGeV);
0589 } else {
0590 m_ESDigitizer->setGain(ESGain);
0591 m_ESElectronicsSimFast->setPedestals(espeds);
0592 m_ESElectronicsSimFast->setMIPs(esmips);
0593 m_ESElectronicsSimFast->setMIPToGeV(ESMIPToGeV);
0594 }
0595 }
0596 }
0597
0598 void EcalDigiProducer::checkGeometry(const edm::EventSetup &eventSetup) {
0599 if (m_geometryWatcher.check(eventSetup)) {
0600 m_Geometry = &eventSetup.getData(m_geometryToken);
0601 updateGeometry();
0602 }
0603 }
0604
0605 void EcalDigiProducer::updateGeometry() {
0606 if (m_doEB) {
0607 if (nullptr != m_APDResponse)
0608 m_APDResponse->setGeometry(m_Geometry->getSubdetectorGeometry(DetId::Ecal, EcalBarrel));
0609 if (nullptr != m_ComponentResponse)
0610 m_ComponentResponse->setGeometry(m_Geometry->getSubdetectorGeometry(DetId::Ecal, EcalBarrel));
0611 m_EBResponse->setGeometry(m_Geometry->getSubdetectorGeometry(DetId::Ecal, EcalBarrel));
0612 }
0613 if (m_doEE) {
0614 m_EEResponse->setGeometry(m_Geometry->getSubdetectorGeometry(DetId::Ecal, EcalEndcap));
0615 }
0616 if (m_doES) {
0617 m_ESResponse->setGeometry(m_Geometry->getSubdetectorGeometry(DetId::Ecal, EcalPreshower));
0618 m_ESOldResponse->setGeometry(m_Geometry);
0619
0620 const std::vector<DetId> *theESDets(
0621 nullptr != m_Geometry->getSubdetectorGeometry(DetId::Ecal, EcalPreshower)
0622 ? &m_Geometry->getSubdetectorGeometry(DetId::Ecal, EcalPreshower)->getValidDetIds()
0623 : nullptr);
0624
0625 if (!m_doFastES) {
0626 if (nullptr != m_ESOldDigitizer && nullptr != theESDets)
0627 m_ESOldDigitizer->setDetIds(*theESDets);
0628 } else {
0629 if (nullptr != m_ESDigitizer && nullptr != theESDets)
0630 m_ESDigitizer->setDetIds(*theESDets);
0631 }
0632 }
0633 }
0634
0635 void EcalDigiProducer::setEBNoiseSignalGenerator(EcalBaseSignalGenerator *noiseGenerator) {
0636
0637 if (nullptr != m_BarrelDigitizer)
0638 m_BarrelDigitizer->setNoiseSignalGenerator(noiseGenerator);
0639 }
0640
0641 void EcalDigiProducer::setEENoiseSignalGenerator(EcalBaseSignalGenerator *noiseGenerator) {
0642
0643 if (nullptr != m_EndcapDigitizer)
0644 m_EndcapDigitizer->setNoiseSignalGenerator(noiseGenerator);
0645 }
0646
0647 void EcalDigiProducer::setESNoiseSignalGenerator(EcalBaseSignalGenerator *noiseGenerator) {
0648
0649 if (nullptr != m_ESDigitizer)
0650 m_ESDigitizer->setNoiseSignalGenerator(noiseGenerator);
0651 }