CMS 3D CMS Logo

HcalDigitizer.cc
Go to the documentation of this file.
27 #include <boost/foreach.hpp>
34 
35 //#define DebugLog
36 
38  theGeometry(nullptr),
39  theRecNumber(nullptr),
40  theParameterMap(ps),
41  theShapes(),
42  theHBHEResponse(std::make_unique<CaloHitResponse>(&theParameterMap,&theShapes)),
43  theHBHESiPMResponse(std::make_unique<HcalSiPMHitResponse>(&theParameterMap, &theShapes, ps.getParameter<bool>("HcalPreMixStage1"), true)),
44  theHOResponse(std::make_unique<CaloHitResponse>(&theParameterMap,&theShapes)),
45  theHOSiPMResponse(std::make_unique<HcalSiPMHitResponse>(&theParameterMap, &theShapes, ps.getParameter<bool>("HcalPreMixStage1"), false)),
46  theHFResponse(std::make_unique<CaloHitResponse>(&theParameterMap,&theShapes)),
47  theHFQIE10Response(std::make_unique<CaloHitResponse>(&theParameterMap,&theShapes)),
48  theZDCResponse(std::make_unique<CaloHitResponse>(&theParameterMap,&theShapes)),
49  theHBHEAmplifier(nullptr),
50  theHFAmplifier(nullptr),
51  theHOAmplifier(nullptr),
52  theZDCAmplifier(nullptr),
53  theHFQIE10Amplifier(nullptr),
54  theHBHEQIE11Amplifier(nullptr),
55  theIonFeedback(nullptr),
56  theCoderFactory(nullptr),
57  theHBHEElectronicsSim(nullptr),
58  theHFElectronicsSim(nullptr),
59  theHOElectronicsSim(nullptr),
60  theZDCElectronicsSim(nullptr),
61  theHFQIE10ElectronicsSim(nullptr),
62  theHBHEQIE11ElectronicsSim(nullptr),
63  theHBHEHitFilter(),
64  theHBHEQIE11HitFilter(),
65  theHFHitFilter(),
66  theHFQIE10HitFilter(),
67  theHOHitFilter(),
68  theHOSiPMHitFilter(),
69  theZDCHitFilter(),
70  theHBHEDigitizer(nullptr),
71  theHODigitizer(nullptr),
72  theHOSiPMDigitizer(nullptr),
73  theHFDigitizer(nullptr),
74  theZDCDigitizer(nullptr),
75  theHFQIE10Digitizer(nullptr),
76  theHBHEQIE11Digitizer(nullptr),
77  theRelabeller(nullptr),
78  isZDC(true),
79  isHCAL(true),
80  zdcgeo(true),
81  hbhegeo(true),
82  hogeo(true),
83  hfgeo(true),
84  doHFWindow_(ps.getParameter<bool>("doHFWindow")),
85  killHE_(ps.getParameter<bool>("killHE")),
86  debugCS_(ps.getParameter<bool>("debugCaloSamples")),
87  ignoreTime_(ps.getParameter<bool>("ignoreGeantTime")),
88  injectTestHits_(ps.getParameter<bool>("injectTestHits")),
89  hitsProducer_(ps.getParameter<std::string>("hitsProducer")),
90  theHOSiPMCode(ps.getParameter<edm::ParameterSet>("ho").getParameter<int>("siPMCode")),
91  deliveredLumi(0.),
92  agingFlagHB(ps.getParameter<bool>("HBDarkening")),
93  agingFlagHE(ps.getParameter<bool>("HEDarkening")),
94  m_HBDarkening(nullptr),
95  m_HEDarkening(nullptr),
96  m_HFRecalibration(nullptr),
97  injectedHitsEnergy_(ps.getParameter<std::vector<double>>("injectTestHitsEnergy")),
98  injectedHitsTime_(ps.getParameter<std::vector<double>>("injectTestHitsTime")),
99  injectedHitsCells_(ps.getParameter<std::vector<int>>("injectTestHitsCells"))
100 {
101  iC.consumes<std::vector<PCaloHit> >(edm::InputTag(hitsProducer_, "ZDCHITS"));
102  iC.consumes<std::vector<PCaloHit> >(edm::InputTag(hitsProducer_, "HcalHits"));
103 
104  bool doNoise = ps.getParameter<bool>("doNoise");
105 
106  bool PreMix1 = ps.getParameter<bool>("HcalPreMixStage1"); // special threshold/pedestal treatment
107  bool PreMix2 = ps.getParameter<bool>("HcalPreMixStage2"); // special threshold/pedestal treatment
108  bool doEmpty = ps.getParameter<bool>("doEmpty");
109  deliveredLumi = ps.getParameter<double>("DelivLuminosity");
110  bool agingFlagHF = ps.getParameter<bool>("HFDarkening");
111  double minFCToDelay= ps.getParameter<double>("minFCToDelay");
112 
113  if(PreMix1 && PreMix2) {
114  throw cms::Exception("Configuration")
115  << "HcalDigitizer cannot operate in PreMixing digitization and PreMixing\n"
116  "digi combination modes at the same time. Please set one mode to False\n"
117  "in the configuration file.";
118  }
119 
120  // need to make copies, because they might get different noise generators
121  theHBHEAmplifier = std::make_unique<HcalAmplifier>(&theParameterMap, doNoise, PreMix1, PreMix2);
122  theHFAmplifier = std::make_unique<HcalAmplifier>(&theParameterMap, doNoise, PreMix1, PreMix2);
123  theHOAmplifier = std::make_unique<HcalAmplifier>(&theParameterMap, doNoise, PreMix1, PreMix2);
124  theZDCAmplifier = std::make_unique<HcalAmplifier>(&theParameterMap, doNoise, PreMix1, PreMix2);
125  theHFQIE10Amplifier = std::make_unique<HcalAmplifier>(&theParameterMap, doNoise, PreMix1, PreMix2);
126  theHBHEQIE11Amplifier = std::make_unique<HcalAmplifier>(&theParameterMap, doNoise, PreMix1, PreMix2);
127 
128  theCoderFactory = std::make_unique<HcalCoderFactory>(HcalCoderFactory::DB);
129 
130  theHBHEElectronicsSim = std::make_unique<HcalElectronicsSim>(theHBHEAmplifier.get(), theCoderFactory.get(), PreMix1);
131  theHFElectronicsSim = std::make_unique<HcalElectronicsSim>(theHFAmplifier.get(), theCoderFactory.get(), PreMix1);
132  theHOElectronicsSim = std::make_unique<HcalElectronicsSim>(theHOAmplifier.get(), theCoderFactory.get(), PreMix1);
133  theZDCElectronicsSim = std::make_unique<HcalElectronicsSim>(theZDCAmplifier.get(), theCoderFactory.get(), PreMix1);
134  theHFQIE10ElectronicsSim = std::make_unique<HcalElectronicsSim>(theHFQIE10Amplifier.get(), theCoderFactory.get(), PreMix1); //should this use a different coder factory?
135  theHBHEQIE11ElectronicsSim = std::make_unique<HcalElectronicsSim>(theHBHEQIE11Amplifier.get(), theCoderFactory.get(), PreMix1); //should this use a different coder factory?
136 
137  bool doHOHPD = (theHOSiPMCode != 1);
138  bool doHOSiPM = (theHOSiPMCode != 0);
139  if(doHOHPD) {
140  theHOResponse = std::make_unique<CaloHitResponse>(&theParameterMap,&theShapes);
141  theHOResponse->setHitFilter(&theHOHitFilter);
142  theHODigitizer = std::make_unique<HODigitizer>(theHOResponse.get(), theHOElectronicsSim.get(), doEmpty);
143  }
144  if(doHOSiPM) {
145  theHOSiPMResponse->setHitFilter(&theHOSiPMHitFilter);
146  theHOSiPMDigitizer = std::make_unique<HODigitizer>(theHOSiPMResponse.get(), theHOElectronicsSim.get(), doEmpty);
147  }
148 
149  theHBHEResponse->setHitFilter(&theHBHEHitFilter);
151 
152  //QIE8 and QIE11 can coexist in HBHE
153  theHBHEQIE11Digitizer = std::make_unique<QIE11Digitizer>(theHBHESiPMResponse.get(), theHBHEQIE11ElectronicsSim.get(), doEmpty);
154  theHBHEDigitizer = std::make_unique<HBHEDigitizer>(theHBHEResponse.get(), theHBHEElectronicsSim.get(), doEmpty);
155 
156  bool doTimeSlew = ps.getParameter<bool>("doTimeSlew");
157  //initialize: they won't be called later if flag is set
158  hcalTimeSlew_delay_ = nullptr;
159  theTimeSlewSim.reset(nullptr);
160  if(doTimeSlew) {
161  // no time slewing for HF
162  theTimeSlewSim = std::make_unique<HcalTimeSlewSim>(&theParameterMap,minFCToDelay);
163  theHBHEAmplifier->setTimeSlewSim(theTimeSlewSim.get());
164  theHBHEQIE11Amplifier->setTimeSlewSim(theTimeSlewSim.get());
165  theHOAmplifier->setTimeSlewSim(theTimeSlewSim.get());
166  theZDCAmplifier->setTimeSlewSim(theTimeSlewSim.get());
167  }
168 
169  theHFResponse->setHitFilter(&theHFHitFilter);
170  theHFQIE10Response->setHitFilter(&theHFQIE10HitFilter);
171  theZDCResponse->setHitFilter(&theZDCHitFilter);
172 
173  //QIE8 and QIE10 can coexist in HF
174  theHFQIE10Digitizer = std::make_unique<QIE10Digitizer>(theHFQIE10Response.get(), theHFQIE10ElectronicsSim.get(), doEmpty);
175  theHFDigitizer = std::make_unique<HFDigitizer>(theHFResponse.get(), theHFElectronicsSim.get(), doEmpty);
176 
177  theZDCDigitizer = std::make_unique<ZDCDigitizer>(theZDCResponse.get(), theZDCElectronicsSim.get(), doEmpty);
178 
179  testNumbering_ = ps.getParameter<bool>("TestNumbering");
180 // std::cout << "Flag to see if Hit Relabeller to be initiated " << testNumbering_ << std::endl;
181  if (testNumbering_) theRelabeller=std::make_unique<HcalHitRelabeller>(ps.getParameter<bool>("doNeutralDensityFilter"));
182 
183  if(ps.getParameter<bool>("doIonFeedback") && theHBHEResponse) {
184  theIonFeedback = std::make_unique<HPDIonFeedbackSim>(ps,&theShapes);
185  theHBHEResponse->setPECorrection(theIonFeedback.get());
186  if(ps.getParameter<bool>("doThermalNoise")) {
187  theHBHEAmplifier->setIonFeedbackSim(theIonFeedback.get());
188  }
189  }
190 
191  //option to save CaloSamples as event product for debugging
192  if(debugCS_){
193  if(theHBHEDigitizer) theHBHEDigitizer->setDebugCaloSamples(true);
194  if(theHBHEQIE11Digitizer) theHBHEQIE11Digitizer->setDebugCaloSamples(true);
195  if(theHODigitizer) theHODigitizer->setDebugCaloSamples(true);
196  if(theHOSiPMDigitizer) theHOSiPMDigitizer->setDebugCaloSamples(true);
197  if(theHFDigitizer) theHFDigitizer->setDebugCaloSamples(true);
198  if(theHFQIE10Digitizer) theHFQIE10Digitizer->setDebugCaloSamples(true);
199  theZDCDigitizer->setDebugCaloSamples(true);
200  }
201 
202  //option to ignore Geant time distribution in SimHits, for debugging
203  if(ignoreTime_){
204  theHBHEResponse->setIgnoreGeantTime(ignoreTime_);
205  theHBHESiPMResponse->setIgnoreGeantTime(ignoreTime_);
206  theHOResponse->setIgnoreGeantTime(ignoreTime_);
207  theHOSiPMResponse->setIgnoreGeantTime(ignoreTime_);
208  theHFResponse->setIgnoreGeantTime(ignoreTime_);
209  theHFQIE10Response->setIgnoreGeantTime(ignoreTime_);
210  theZDCResponse->setIgnoreGeantTime(ignoreTime_);
211  }
212 
213  if(agingFlagHF) m_HFRecalibration.reset(new HFRecalibration(ps.getParameter<edm::ParameterSet>("HFRecalParameterBlock")));
214 }
215 
216 
218 }
219 
220 
222  noiseGenerator->setParameterMap(&theParameterMap);
223  noiseGenerator->setElectronicsSim(theHBHEElectronicsSim.get());
224  if (theHBHEDigitizer) theHBHEDigitizer->setNoiseSignalGenerator(noiseGenerator);
225  theHBHEAmplifier->setNoiseSignalGenerator(noiseGenerator);
226 }
227 
229  noiseGenerator->setParameterMap(&theParameterMap);
230  noiseGenerator->setElectronicsSim(theHBHEQIE11ElectronicsSim.get());
231  if(theHBHEQIE11Digitizer) theHBHEQIE11Digitizer->setNoiseSignalGenerator(noiseGenerator);
232  theHBHEQIE11Amplifier->setNoiseSignalGenerator(noiseGenerator);
233 }
234 
236  noiseGenerator->setParameterMap(&theParameterMap);
237  noiseGenerator->setElectronicsSim(theHFElectronicsSim.get());
238  if(theHFDigitizer) theHFDigitizer->setNoiseSignalGenerator(noiseGenerator);
239  theHFAmplifier->setNoiseSignalGenerator(noiseGenerator);
240 }
241 
243  noiseGenerator->setParameterMap(&theParameterMap);
244  noiseGenerator->setElectronicsSim(theHFQIE10ElectronicsSim.get());
245  if(theHFQIE10Digitizer) theHFQIE10Digitizer->setNoiseSignalGenerator(noiseGenerator);
246  theHFQIE10Amplifier->setNoiseSignalGenerator(noiseGenerator);
247 }
248 
250  noiseGenerator->setParameterMap(&theParameterMap);
251  noiseGenerator->setElectronicsSim(theHOElectronicsSim.get());
252  if(theHODigitizer) theHODigitizer->setNoiseSignalGenerator(noiseGenerator);
253  if(theHOSiPMDigitizer) theHOSiPMDigitizer->setNoiseSignalGenerator(noiseGenerator);
254  theHOAmplifier->setNoiseSignalGenerator(noiseGenerator);
255 }
256 
258  noiseGenerator->setParameterMap(&theParameterMap);
259  noiseGenerator->setElectronicsSim(theZDCElectronicsSim.get());
260  theZDCDigitizer->setNoiseSignalGenerator(noiseGenerator);
261  theZDCAmplifier->setNoiseSignalGenerator(noiseGenerator);
262 }
263 
265  setup(eventSetup);
266 
267  // get the appropriate gains, noises, & widths for this event
268  edm::ESHandle<HcalDbService> conditions;
269  eventSetup.get<HcalDbRecord>().get(conditions);
270 
271  theShapes.setDbService(conditions.product());
272 
273  theHBHEAmplifier->setDbService(conditions.product());
274  theHFAmplifier->setDbService(conditions.product());
275  theHOAmplifier->setDbService(conditions.product());
276  theZDCAmplifier->setDbService(conditions.product());
277  theHFQIE10Amplifier->setDbService(conditions.product());
278  theHBHEQIE11Amplifier->setDbService(conditions.product());
279 
280  theHFQIE10ElectronicsSim->setDbService(conditions.product());
281  theHBHEQIE11ElectronicsSim->setDbService(conditions.product());
282 
283  theCoderFactory->setDbService(conditions.product());
284  theParameterMap.setDbService(conditions.product());
285 
286  //initialize hits
287  if(theHBHEDigitizer) theHBHEDigitizer->initializeHits();
288  if(theHBHEQIE11Digitizer) theHBHEQIE11Digitizer->initializeHits();
289  if(theHODigitizer) theHODigitizer->initializeHits();
290  if(theHOSiPMDigitizer) theHOSiPMDigitizer->initializeHits();
291  if(theHFQIE10Digitizer) theHFQIE10Digitizer->initializeHits();
292  if(theHFDigitizer) theHFDigitizer->initializeHits();
293  theZDCDigitizer->initializeHits();
294 
295 }
296 
297 void HcalDigitizer::accumulateCaloHits(edm::Handle<std::vector<PCaloHit> > const& hcalHandle, edm::Handle<std::vector<PCaloHit> > const& zdcHandle, int bunchCrossing, CLHEP::HepRandomEngine* engine, const HcalTopology *htopoP) {
298 
299  // Step A: pass in inputs, and accumulate digis
300  if(isHCAL) {
301  std::vector<PCaloHit> hcalHitsOrig = *hcalHandle.product();
302  if(injectTestHits_) hcalHitsOrig = injectedHits_;
303  std::vector<PCaloHit> hcalHits;
304  hcalHits.reserve(hcalHitsOrig.size());
305 
306  //evaluate darkening before relabeling
307  if (testNumbering_) {
309  darkening(hcalHitsOrig);
310  }
311  // Relabel PCaloHits if necessary
312  edm::LogInfo("HcalDigitizer") << "Calling Relabeller";
313  theRelabeller->process(hcalHitsOrig);
314  }
315 
316  //eliminate bad hits
317  for (unsigned int i=0; i< hcalHitsOrig.size(); i++) {
318  DetId id(hcalHitsOrig[i].id());
319  HcalDetId hid(id);
320  if (!htopoP->validHcal(hid)) {
321  edm::LogError("HcalDigitizer") << "bad hcal id found in digitizer. Skipping " << id.rawId() << " " << hid << std::endl;
322  continue;
323  }
324  else if(hid.subdet()==HcalForward && !doHFWindow_ && hcalHitsOrig[i].depth()!=0){
325  //skip HF window hits unless desired
326  continue;
327  }
328  else if( killHE_ && hid.subdet()==HcalEndcap ) {
329  // remove HE hits if asked for (phase 2)
330  continue;
331  }
332  else {
333 #ifdef DebugLog
334  std::cout << "HcalDigitizer format " << hid.oldFormat() << " for " << hid << std::endl;
335 #endif
336  DetId newid = DetId(hid.newForm());
337 #ifdef DebugLog
338  std::cout << "Hit " << i << " out of " << hcalHits.size() << " " << std::hex << id.rawId() << " --> " << newid.rawId() << std::dec << " " << HcalDetId(newid.rawId()) << '\n';
339 #endif
340  hcalHitsOrig[i].setID(newid.rawId());
341  hcalHits.push_back(hcalHitsOrig[i]);
342  }
343  }
344 
345  if(hbhegeo) {
346  if(theHBHEDigitizer) theHBHEDigitizer->add(hcalHits, bunchCrossing, engine);
347  if(theHBHEQIE11Digitizer) theHBHEQIE11Digitizer->add(hcalHits, bunchCrossing, engine);
348  }
349 
350  if(hogeo) {
351  if(theHODigitizer) theHODigitizer->add(hcalHits, bunchCrossing, engine);
352  if(theHOSiPMDigitizer) theHOSiPMDigitizer->add(hcalHits, bunchCrossing, engine);
353  }
354 
355  if(hfgeo) {
356  if(theHFDigitizer) theHFDigitizer->add(hcalHits, bunchCrossing, engine);
357  if(theHFQIE10Digitizer) theHFQIE10Digitizer->add(hcalHits, bunchCrossing, engine);
358  }
359  } else {
360  edm::LogInfo("HcalDigitizer") << "We don't have HCAL hit collection available ";
361  }
362 
363  if(isZDC) {
364  if(zdcgeo) {
365  theZDCDigitizer->add(*zdcHandle.product(), bunchCrossing, engine);
366  }
367  } else {
368  edm::LogInfo("HcalDigitizer") << "We don't have ZDC hit collection available ";
369  }
370 }
371 
372 void HcalDigitizer::accumulate(edm::Event const& e, edm::EventSetup const& eventSetup, CLHEP::HepRandomEngine* engine) {
373  // Step A: Get Inputs
374  edm::InputTag zdcTag(hitsProducer_, "ZDCHITS");
376  e.getByLabel(zdcTag, zdcHandle);
377  isZDC = zdcHandle.isValid();
378 
379  edm::InputTag hcalTag(hitsProducer_, "HcalHits");
381  e.getByLabel(hcalTag, hcalHandle);
382  isHCAL = hcalHandle.isValid() or injectTestHits_;
383 
385  eventSetup.get<HcalRecNumberingRecord>().get(htopo);
386  const HcalTopology *htopoP=htopo.product();
387 
388  accumulateCaloHits(hcalHandle, zdcHandle, 0, engine, htopoP);
389 }
390 
391 void HcalDigitizer::accumulate(PileUpEventPrincipal const& e, edm::EventSetup const& eventSetup, CLHEP::HepRandomEngine* engine) {
392  // Step A: Get Inputs
393  edm::InputTag zdcTag(hitsProducer_, "ZDCHITS");
395  e.getByLabel(zdcTag, zdcHandle);
396  isZDC = zdcHandle.isValid();
397 
398  edm::InputTag hcalTag(hitsProducer_, "HcalHits");
400  e.getByLabel(hcalTag, hcalHandle);
401  isHCAL = hcalHandle.isValid();
402 
404  eventSetup.get<HcalRecNumberingRecord>().get(htopo);
405  const HcalTopology *htopoP=htopo.product();
406 
407  accumulateCaloHits(hcalHandle, zdcHandle, e.bunchCrossing(), engine, htopoP);
408 }
409 
410 void HcalDigitizer::finalizeEvent(edm::Event& e, const edm::EventSetup& eventSetup, CLHEP::HepRandomEngine* engine) {
411 
412  // Step B: Create empty output
413  std::unique_ptr<HBHEDigiCollection> hbheResult(new HBHEDigiCollection());
414  std::unique_ptr<HODigiCollection> hoResult(new HODigiCollection());
415  std::unique_ptr<HFDigiCollection> hfResult(new HFDigiCollection());
416  std::unique_ptr<ZDCDigiCollection> zdcResult(new ZDCDigiCollection());
417  std::unique_ptr<QIE10DigiCollection> hfQIE10Result(
419  !theHFQIE10DetIds.empty() ?
422  )
423  );
424  std::unique_ptr<QIE11DigiCollection> hbheQIE11Result(
426  !theHBHEQIE11DetIds.empty() ?
427  theHBHESiPMResponse.get()->getReadoutFrameSize(theHBHEQIE11DetIds[0]) :
428 // theParameterMap->simParameters(theHBHEQIE11DetIds[0]).readoutFrameSize() :
430  )
431  );
432 
433  // Step C: Invoke the algorithm, getting back outputs.
434  if(isHCAL&&hbhegeo){
435  if(theHBHEDigitizer) theHBHEDigitizer->run(*hbheResult, engine);
436  if(theHBHEQIE11Digitizer) theHBHEQIE11Digitizer->run(*hbheQIE11Result, engine);
437  }
438  if(isHCAL&&hogeo) {
439  if(theHODigitizer) theHODigitizer->run(*hoResult, engine);
440  if(theHOSiPMDigitizer) theHOSiPMDigitizer->run(*hoResult, engine);
441  }
442  if(isHCAL&&hfgeo) {
443  if(theHFDigitizer) theHFDigitizer->run(*hfResult, engine);
444  if(theHFQIE10Digitizer) theHFQIE10Digitizer->run(*hfQIE10Result, engine);
445  }
446  if(isZDC&&zdcgeo) {
447  theZDCDigitizer->run(*zdcResult, engine);
448  }
449 
450  edm::LogInfo("HcalDigitizer") << "HCAL HBHE digis : " << hbheResult->size();
451  edm::LogInfo("HcalDigitizer") << "HCAL HO digis : " << hoResult->size();
452  edm::LogInfo("HcalDigitizer") << "HCAL HF digis : " << hfResult->size();
453  edm::LogInfo("HcalDigitizer") << "HCAL ZDC digis : " << zdcResult->size();
454  edm::LogInfo("HcalDigitizer") << "HCAL HF QIE10 digis : " << hfQIE10Result->size();
455  edm::LogInfo("HcalDigitizer") << "HCAL HBHE QIE11 digis : " << hbheQIE11Result->size();
456 
457 #ifdef DebugLog
458  std::cout << std::endl;
459  std::cout << "HCAL HBHE digis : " << hbheResult->size() << std::endl;
460  std::cout << "HCAL HO digis : " << hoResult->size() << std::endl;
461  std::cout << "HCAL HF digis : " << hfResult->size() << std::endl;
462  std::cout << "HCAL ZDC digis : " << zdcResult->size() << std::endl;
463  std::cout << "HCAL HF QIE10 digis : " << hfQIE10Result->size() << std::endl;
464  std::cout << "HCAL HBHE QIE11 digis : " << hbheQIE11Result->size() << std::endl;
465 #endif
466 
467  // Step D: Put outputs into event
468  e.put(std::move(hbheResult));
469  e.put(std::move(hoResult));
470  e.put(std::move(hfResult));
471  e.put(std::move(zdcResult));
472  e.put(std::move(hfQIE10Result), "HFQIE10DigiCollection");
473  e.put(std::move(hbheQIE11Result), "HBHEQIE11DigiCollection");
474 
475  if(debugCS_){
476  std::unique_ptr<CaloSamplesCollection> csResult(new CaloSamplesCollection());
477  //smush together all the results
478  if(theHBHEDigitizer) csResult->insert(csResult->end(),theHBHEDigitizer->getCaloSamples().begin(),theHBHEDigitizer->getCaloSamples().end());
479  if(theHBHEQIE11Digitizer) csResult->insert(csResult->end(),theHBHEQIE11Digitizer->getCaloSamples().begin(),theHBHEQIE11Digitizer->getCaloSamples().end());
480  if(theHODigitizer) csResult->insert(csResult->end(),theHODigitizer->getCaloSamples().begin(),theHODigitizer->getCaloSamples().end());
481  if(theHOSiPMDigitizer) csResult->insert(csResult->end(),theHOSiPMDigitizer->getCaloSamples().begin(),theHOSiPMDigitizer->getCaloSamples().end());
482  if(theHFDigitizer) csResult->insert(csResult->end(),theHFDigitizer->getCaloSamples().begin(),theHFDigitizer->getCaloSamples().end());
483  if(theHFQIE10Digitizer) csResult->insert(csResult->end(),theHFQIE10Digitizer->getCaloSamples().begin(),theHFQIE10Digitizer->getCaloSamples().end());
484  csResult->insert(csResult->end(),theZDCDigitizer->getCaloSamples().begin(),theZDCDigitizer->getCaloSamples().end());
485  e.put(std::move(csResult),"HcalSamples");
486  }
487 
488  if(injectTestHits_){
489  std::unique_ptr<edm::PCaloHitContainer> pcResult(new edm::PCaloHitContainer());
490  pcResult->insert(pcResult->end(),injectedHits_.begin(),injectedHits_.end());
491  e.put(std::move(pcResult),"HcalHits");
492  }
493 
494 #ifdef DebugLog
495  std::cout << std::endl << "========> HcalDigitizer e.put " << std::endl << std::endl;
496 #endif
497 
498 }
499 
500 
502  checkGeometry(es);
503 
504  if (agingFlagHB) {
506  es.get<HBHEDarkeningRecord>().get("HB",hdark);
507  m_HBDarkening = &*hdark;
508  }
509  if (agingFlagHE) {
511  es.get<HBHEDarkeningRecord>().get("HE",hdark);
512  m_HEDarkening = &*hdark;
513  }
514 
516  es.get<HcalTimeSlewRecord>().get("HBHE", delay);
517  hcalTimeSlew_delay_ = &*delay;
518 
521  theHOAmplifier->setTimeSlew(hcalTimeSlew_delay_);
522  theZDCAmplifier->setTimeSlew(hcalTimeSlew_delay_);
523 }
524 
525 
528  eventSetup.get<CaloGeometryRecord>().get(geometry);
529  theGeometry = &*geometry;
531  eventSetup.get<HcalRecNumberingRecord>().get(pHRNDC);
532  theRecNumber= &*pHRNDC;
533 
534  if(theHBHEResponse) theHBHEResponse->setGeometry(theGeometry);
536  if(theHOResponse) theHOResponse->setGeometry(theGeometry);
538  theHFResponse->setGeometry(theGeometry);
539  theHFQIE10Response->setGeometry(theGeometry);
540  theZDCResponse->setGeometry(theGeometry);
541  if(theRelabeller) theRelabeller->setGeometry(theRecNumber);
542 
543  // See if it's been updated
544  bool check1 = theGeometryWatcher_.check(eventSetup);
545  bool check2 = theRecNumberWatcher_.check(eventSetup);
546  if (check1 or check2) {
547  updateGeometry(eventSetup);
548  }
549 }
550 
551 
553  const std::vector<DetId>& hbCells = theGeometry->getValidDetIds(DetId::Hcal, HcalBarrel);
554  const std::vector<DetId>& heCells = theGeometry->getValidDetIds(DetId::Hcal, HcalEndcap);
555  const std::vector<DetId>& hoCells = theGeometry->getValidDetIds(DetId::Hcal, HcalOuter);
556  const std::vector<DetId>& hfCells = theGeometry->getValidDetIds(DetId::Hcal, HcalForward);
557  const std::vector<DetId>& zdcCells = theGeometry->getValidDetIds(DetId::Calo, HcalZDCDetId::SubdetectorId);
558  //const std::vector<DetId>& hcalTrigCells = geometry->getValidDetIds(DetId::Hcal, HcalTriggerTower);
559  //const std::vector<DetId>& hcalCalib = geometry->getValidDetIds(DetId::Calo, HcalCastorDetId::SubdetectorId);
560 // std::cout<<"HcalDigitizer::CheckGeometry number of cells: "<<zdcCells.size()<<std::endl;
561  if(zdcCells.empty()) zdcgeo = false;
562  if(hbCells.empty() && heCells.empty()) hbhegeo = false;
563  if(hoCells.empty()) hogeo = false;
564  if(hfCells.empty()) hfgeo = false;
565  // combine HB & HE
566 
567  hbheCells = hbCells;
568  if( !killHE_) {
569  hbheCells.insert(hbheCells.end(), heCells.begin(), heCells.end());
570  }
571  //handle mixed QIE8/11 scenario in HBHE
572  buildHBHEQIECells(hbheCells,eventSetup);
575 
576  if(theHOSiPMDigitizer) {
577  buildHOSiPMCells(hoCells, eventSetup);
579  theHOSiPMResponse->setDetIds(hoCells);
580  }
581 
582  //handle mixed QIE8/10 scenario in HF
583  buildHFQIECells(hfCells,eventSetup);
584 
585  theZDCDigitizer->setDetIds(zdcCells);
586 
587  //fill test hits collection if desired and empty
588  if(injectTestHits_ && injectedHits_.empty() && !injectedHitsCells_.empty() && !injectedHitsEnergy_.empty()){
589  //make list of specified cells if desired
590  std::vector<DetId> testCells;
591  if(injectedHitsCells_.size()>=4){
592  testCells.reserve(injectedHitsCells_.size()/4);
593  for(unsigned ic = 0; ic < injectedHitsCells_.size(); ic += 4){
594  if(ic+4 > injectedHitsCells_.size()) break;
595  testCells.push_back(HcalDetId((HcalSubdetector)injectedHitsCells_[ic],injectedHitsCells_[ic+1],
597  }
598  }
599  else{
600  int testSubdet = injectedHitsCells_[0];
601  if(testSubdet==HcalBarrel) testCells = hbCells;
602  else if(testSubdet==HcalEndcap) testCells = heCells;
603  else if(testSubdet==HcalForward) testCells = hfCells;
604  else if(testSubdet==HcalOuter) testCells = hoCells;
605  else throw cms::Exception("Configuration") << "Unknown subdet " << testSubdet << " for HCAL test hit injection";
606  }
607  bool useHitTimes = (injectedHitsTime_.size()==injectedHitsEnergy_.size());
608  injectedHits_.reserve(testCells.size()*injectedHitsEnergy_.size());
609  for(unsigned ih = 0; ih < injectedHitsEnergy_.size(); ++ih){
610  double tmp = useHitTimes ? injectedHitsTime_[ih] : 0.;
611  for(auto& aCell: testCells){
612  injectedHits_.emplace_back(aCell,injectedHitsEnergy_[ih],tmp);
613  }
614  }
615  }
616 }
617 
618 void HcalDigitizer::buildHFQIECells(const std::vector<DetId>& allCells, const edm::EventSetup & eventSetup) {
619  //if results are already cached, no need to look again
620  if(!theHFQIE8DetIds.empty() || !theHFQIE10DetIds.empty()) return;
621 
622  //get the QIETypes
624  eventSetup.get<HcalQIETypesRcd>().get(q);
626  eventSetup.get<HcalRecNumberingRecord>().get(htopo);
627 
628  HcalQIETypes qieTypes(*q.product());
629  if (qieTypes.topo()==nullptr) {
630  qieTypes.setTopo(htopo.product());
631  }
632 
633  for(std::vector<DetId>::const_iterator detItr = allCells.begin(); detItr != allCells.end(); ++detItr) {
634  HcalQIENum qieType = HcalQIENum(qieTypes.getValues(*detItr)->getValue());
635  if(qieType == QIE8) {
636  theHFQIE8DetIds.push_back(*detItr);
637  } else if(qieType == QIE10) {
638  theHFQIE10DetIds.push_back(*detItr);
639  } else { //default is QIE8
640  theHFQIE8DetIds.push_back(*detItr);
641  }
642  }
643 
644  if(!theHFQIE8DetIds.empty()) theHFDigitizer->setDetIds(theHFQIE8DetIds);
645  else {
646  theHFDigitizer.reset();
647  }
648 
649  if(!theHFQIE10DetIds.empty()) theHFQIE10Digitizer->setDetIds(theHFQIE10DetIds);
650  else {
651  theHFQIE10Digitizer.reset();
652  }
653 }
654 
655 void HcalDigitizer::buildHBHEQIECells(const std::vector<DetId>& allCells, const edm::EventSetup & eventSetup) {
656  //if results are already cached, no need to look again
657  if(!theHBHEQIE8DetIds.empty() || !theHBHEQIE11DetIds.empty()) return;
658 
659  //get the QIETypes
661  eventSetup.get<HcalQIETypesRcd>().get(q);
663  eventSetup.get<HcalRecNumberingRecord>().get(htopo);
664 
665  HcalQIETypes qieTypes(*q.product());
666  if (qieTypes.topo()==nullptr) {
667  qieTypes.setTopo(htopo.product());
668  }
669 
670  for(std::vector<DetId>::const_iterator detItr = allCells.begin(); detItr != allCells.end(); ++detItr) {
671  HcalQIENum qieType = HcalQIENum(qieTypes.getValues(*detItr)->getValue());
672  if(qieType == QIE8) {
673  theHBHEQIE8DetIds.push_back(*detItr);
674  }
675  else if(qieType == QIE11) {
676  theHBHEQIE11DetIds.push_back(*detItr);
677  }
678  else { //default is QIE8
679  theHBHEQIE8DetIds.push_back(*detItr);
680  }
681  }
682 
683  if(!theHBHEQIE8DetIds.empty()) theHBHEDigitizer->setDetIds(theHBHEQIE8DetIds);
684  else {
685  theHBHEDigitizer.reset();
686  }
687 
689  else {
690  theHBHEQIE11Digitizer.reset();
691  }
692 
693  if(!theHBHEQIE8DetIds.empty() && !theHBHEQIE11DetIds.empty()){
696  }
697 }
698 
699 void HcalDigitizer::buildHOSiPMCells(const std::vector<DetId>& allCells, const edm::EventSetup & eventSetup) {
700  // all HPD
701 
702  if(theHOSiPMCode == 0) {
703  theHODigitizer->setDetIds(allCells);
704  } else if(theHOSiPMCode == 1) {
705  theHOSiPMDigitizer->setDetIds(allCells);
706  // FIXME pick Zecotek or hamamatsu?
707  } else if(theHOSiPMCode == 2) {
708  std::vector<HcalDetId> zecotekDetIds, hamamatsuDetIds;
710  eventSetup.get<HcalMCParamsRcd>().get(p);
712  eventSetup.get<HcalRecNumberingRecord>().get(htopo);
713 
714  HcalMCParams mcParams(*p.product());
715  if (mcParams.topo()==nullptr) {
716  mcParams.setTopo(htopo.product());
717  }
718 
719  for(std::vector<DetId>::const_iterator detItr = allCells.begin(); detItr != allCells.end(); ++detItr) {
720  int shapeType = mcParams.getValues(*detItr)->signalShape();
721  if(shapeType == HcalShapes::ZECOTEK) {
722  zecotekDetIds.emplace_back(*detItr);
723  theHOSiPMDetIds.push_back(*detItr);
724  } else if(shapeType == HcalShapes::HAMAMATSU) {
725  hamamatsuDetIds.emplace_back(*detItr);
726  theHOSiPMDetIds.push_back(*detItr);
727  } else {
728  theHOHPDDetIds.push_back(*detItr);
729  }
730  }
731 
732  if(!theHOHPDDetIds.empty()) theHODigitizer->setDetIds(theHOHPDDetIds);
733  else {
734  theHODigitizer.reset();
735  }
736 
737  if(!theHOSiPMDetIds.empty()) theHOSiPMDigitizer->setDetIds(theHOSiPMDetIds);
738  else {
739  theHOSiPMDigitizer.reset();
740  }
741 
742  if(!theHOHPDDetIds.empty() && !theHOSiPMDetIds.empty()){
745  }
746 
747  theParameterMap.setHOZecotekDetIds(zecotekDetIds);
748  theParameterMap.setHOHamamatsuDetIds(hamamatsuDetIds);
749 
750  // make sure we don't got through this exercise again
751  theHOSiPMCode = -2;
752  }
753 }
754 
755 void HcalDigitizer::darkening(std::vector<PCaloHit>& hcalHits) {
756 
757  for (unsigned int ii=0; ii<hcalHits.size(); ++ii) {
758  uint32_t tmpId = hcalHits[ii].id();
759  int det, z, depth, ieta, phi, lay;
760  HcalTestNumbering::unpackHcalIndex(tmpId,det,z,depth,ieta,phi,lay);
761 
762  bool darkened = false;
763  float dweight = 1.;
764 
765  if(det==int(HcalBarrel) && m_HBDarkening){
766  //HB darkening
767  dweight = m_HBDarkening->degradation(deliveredLumi,ieta,lay);
768  darkened = true;
769  }
770  else if(det==int(HcalEndcap) && m_HEDarkening){
771  //HE darkening
772  dweight = m_HEDarkening->degradation(deliveredLumi,ieta,lay);
773  darkened = true;
774  }
775  else if(det==int(HcalForward) && m_HFRecalibration){
776  //HF darkening - approximate: invert recalibration factor
777  dweight = 1.0/m_HFRecalibration->getCorr(ieta,depth,deliveredLumi);
778  darkened = true;
779  }
780 
781  //reset hit energy
782  if(darkened) hcalHits[ii].setEnergy(hcalHits[ii].energy()*dweight);
783  }
784 
785 }
786 
787 
HFHitFilter theHFQIE10HitFilter
std::vector< DetId > theHFQIE10DetIds
EDGetTokenT< ProductType > consumes(edm::InputTag const &tag)
T getParameter(std::string const &) const
std::vector< int > injectedHitsCells_
HBHEHitFilter theHBHEHitFilter
std::vector< PCaloHit > PCaloHitContainer
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:137
void setQIE10NoiseSignalGenerator(HcalBaseSignalGenerator *noiseGenerator)
std::vector< CaloSamples > CaloSamplesCollection
Definition: CaloSamples.h:88
const HcalDDDRecConstants * theRecNumber
Definition: HcalDigitizer.h:78
void setParameterMap(HcalSimParameterMap *map)
HcalSubdetector subdet() const
get the subdetector
Definition: HcalDetId.h:146
std::unique_ptr< CaloHitResponse > theHFResponse
std::unique_ptr< HcalTimeSlewSim > theTimeSlewSim
std::unique_ptr< HcalAmplifier > theHBHEAmplifier
virtual ~HcalDigitizer()
std::unique_ptr< HBHEDigitizer > theHBHEDigitizer
void buildHFQIECells(const std::vector< DetId > &allCells, const edm::EventSetup &eventSetup)
Definition: HcalQIENum.h:4
HOHitFilter theHOHitFilter
constexpr uint32_t rawId() const
get the raw id
Definition: DetId.h:50
std::unique_ptr< ZDCDigitizer > theZDCDigitizer
void darkening(std::vector< PCaloHit > &hcalHits)
std::unique_ptr< HcalHitRelabeller > theRelabeller
HFHitFilter theHFHitFilter
void checkGeometry(const edm::EventSetup &eventSetup)
bool validHcal(const HcalDetId &id) const
#define nullptr
void buildHBHEQIECells(const std::vector< DetId > &allCells, const edm::EventSetup &eventSetup)
std::unique_ptr< HFDigitizer > theHFDigitizer
std::unique_ptr< HODigitizer > theHODigitizer
std::unique_ptr< HcalAmplifier > theHFAmplifier
edm::SortedCollection< ZDCDataFrame > ZDCDigiCollection
std::unique_ptr< HcalCoderFactory > theCoderFactory
HcalDataFrameContainer< QIE10DataFrame > QIE10DigiCollection
void initializeEvent(edm::Event const &e, edm::EventSetup const &c)
std::unique_ptr< HcalElectronicsSim > theZDCElectronicsSim
std::unique_ptr< HFRecalibration > m_HFRecalibration
void accumulate(edm::Event const &e, edm::EventSetup const &c, CLHEP::HepRandomEngine *)
std::vector< double > injectedHitsEnergy_
void setQIE11NoiseSignalGenerator(HcalBaseSignalGenerator *noiseGenerator)
void setHOZecotekDetIds(const std::vector< HcalDetId > &ids)
std::unique_ptr< HcalElectronicsSim > theHFQIE10ElectronicsSim
const HBHEDarkening * m_HEDarkening
std::unique_ptr< HcalElectronicsSim > theHFElectronicsSim
edm::ESWatcher< HcalRecNumberingRecord > theRecNumberWatcher_
Definition: HcalDigitizer.h:76
edm::SortedCollection< HODataFrame > HODigiCollection
std::string hitsProducer_
double deliveredLumi
void setElectronicsSim(HcalElectronicsSim *electronicsSim)
std::unique_ptr< HODigitizer > theHOSiPMDigitizer
Creates electronics signals from hits.
const HcalTimeSlew * hcalTimeSlew_delay_
void setHFNoiseSignalGenerator(HcalBaseSignalGenerator *noiseGenerator)
std::unique_ptr< HcalAmplifier > theHBHEQIE11Amplifier
void buildHOSiPMCells(const std::vector< DetId > &allCells, const edm::EventSetup &eventSetup)
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e< void, edm::EventID const &, edm::Timestamp const & > We also list in braces which AR_WATCH_USING_METHOD_ is used for those or
Definition: Activities.doc:12
ZDCHitFilter theZDCHitFilter
std::unique_ptr< HcalSiPMHitResponse > theHBHESiPMResponse
HcalSubdetector
Definition: HcalAssistant.h:31
static void unpackHcalIndex(const uint32_t &idx, int &det, int &z, int &depth, int &eta, int &phi, int &lay)
std::vector< double > injectedHitsTime_
HcalQIENum
Definition: HcalQIENum.h:4
HcalShapes theShapes
Definition: HcalDigitizer.h:97
std::unique_ptr< CaloHitResponse > theHBHEResponse
Definition: HcalDigitizer.h:99
std::vector< DetId > theHOHPDDetIds
int readoutFrameSize() const
for now, the LinearFrames and trhe digis will be one-to-one.
bool isValid() const
Definition: HandleBase.h:74
bool getByLabel(InputTag const &tag, Handle< PROD > &result) const
Definition: Event.h:535
bool oldFormat() const
Definition: HcalDetId.h:147
HcalSimParameterMap theParameterMap
Definition: HcalDigitizer.h:96
std::unique_ptr< HcalElectronicsSim > theHBHEElectronicsSim
ii
Definition: cuy.py:590
HcalDataFrameContainer< QIE11DataFrame > QIE11DigiCollection
std::unique_ptr< CaloHitResponse > theHOResponse
std::unique_ptr< HPDIonFeedbackSim > theIonFeedback
Definition: DetId.h:18
std::unique_ptr< HcalAmplifier > theZDCAmplifier
edm::ESWatcher< CaloGeometryRecord > theGeometryWatcher_
Definition: HcalDigitizer.h:75
static const int SubdetectorId
Definition: HcalZDCDetId.h:25
void setHOHamamatsuDetIds(const std::vector< HcalDetId > &ids)
void accumulateCaloHits(edm::Handle< std::vector< PCaloHit > > const &hcalHits, edm::Handle< std::vector< PCaloHit > > const &zdcHits, int bunchCrossing, CLHEP::HepRandomEngine *, const HcalTopology *h)
void setDbService(const HcalDbService *service)
Definition: HcalShapes.h:25
std::vector< DetId > theHFQIE8DetIds
std::unique_ptr< QIE11Digitizer > theHBHEQIE11Digitizer
uint32_t newForm() const
Definition: HcalDetId.h:198
std::unique_ptr< QIE10Digitizer > theHFQIE10Digitizer
void setDetIds(const std::vector< DetId > &detIds)
Definition: HcalHitFilter.h:17
std::vector< DetId > theHOSiPMDetIds
HOHitFilter theHOSiPMHitFilter
std::unique_ptr< CaloHitResponse > theZDCResponse
bool check(const edm::EventSetup &iSetup)
Definition: ESWatcher.h:57
const CaloGeometry * theGeometry
Definition: HcalDigitizer.h:77
std::unique_ptr< HcalAmplifier > theHOAmplifier
std::unique_ptr< HcalSiPMHitResponse > theHOSiPMResponse
std::vector< DetId > getValidDetIds() const
Get the list of all valid detector ids.
std::vector< DetId > hbheCells
std::vector< std::vector< double > > tmp
Definition: MVATrainer.cc:100
ESHandle< TrackerGeometry > geometry
const HBHEDarkening * m_HBDarkening
HLT enums.
std::unique_ptr< HcalElectronicsSim > theHOElectronicsSim
HBHEHitFilter theHBHEQIE11HitFilter
bool getByLabel(edm::InputTag const &tag, edm::Handle< T > &result) const
void setZDCNoiseSignalGenerator(HcalBaseSignalGenerator *noiseGenerator)
T get() const
Definition: EventSetup.h:68
std::vector< DetId > theHBHEQIE8DetIds
std::unique_ptr< CaloHitResponse > theHFQIE10Response
edm::SortedCollection< HFDataFrame > HFDigiCollection
std::unique_ptr< HcalAmplifier > theHFQIE10Amplifier
const CaloSimParameters & simParameters(const DetId &id) const override
std::unique_ptr< HcalElectronicsSim > theHBHEQIE11ElectronicsSim
void updateGeometry(const edm::EventSetup &eventSetup)
void setHBHENoiseSignalGenerator(HcalBaseSignalGenerator *noiseGenerator)
void setup(const edm::EventSetup &es)
T const * product() const
Definition: ESHandle.h:84
std::vector< DetId > theHBHEQIE11DetIds
def move(src, dest)
Definition: eostools.py:511
void setTopo(const HcalTopology *topo)
void setDbService(const HcalDbService *service)
edm::SortedCollection< HBHEDataFrame > HBHEDigiCollection
float degradation(float intlumi, int ieta, int lay) const
std::vector< PCaloHit > injectedHits_
void finalizeEvent(edm::Event &e, edm::EventSetup const &c, CLHEP::HepRandomEngine *)
void setHONoiseSignalGenerator(HcalBaseSignalGenerator *noiseGenerator)
HcalDigitizer(const edm::ParameterSet &ps, edm::ConsumesCollector &iC)