test
CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
HcalDigitizer.cc
Go to the documentation of this file.
30 #include <boost/foreach.hpp>
35 
36 //#define DebugLog
37 
39  theGeometry(0),
40  theRecNumber(0),
41  theParameterMap(new HcalSimParameterMap(ps)),
42  theShapes(new HcalShapes()),
43  theHBHEResponse(new CaloHitResponse(theParameterMap, theShapes)),
44  theHBHESiPMResponse(new HcalSiPMHitResponse(theParameterMap, theShapes, ps.getParameter<bool>("HcalPreMixStage1"))),
45  theHOResponse(new CaloHitResponse(theParameterMap, theShapes)),
46  theHOSiPMResponse(new HcalSiPMHitResponse(theParameterMap, theShapes)),
47  theHFResponse(new CaloHitResponse(theParameterMap, theShapes)),
48  theHFQIE10Response(new CaloHitResponse(theParameterMap, theShapes)),
49  theZDCResponse(new CaloHitResponse(theParameterMap, theShapes)),
50  theHBHEAmplifier(0),
51  theHFAmplifier(0),
52  theHOAmplifier(0),
53  theZDCAmplifier(0),
54  theHFQIE10Amplifier(0),
55  theHBHEQIE11Amplifier(0),
56  theIonFeedback(0),
57  theCoderFactory(0),
58  theHBHEElectronicsSim(0),
59  theHFElectronicsSim(0),
60  theHOElectronicsSim(0),
61  theZDCElectronicsSim(0),
62  theHFQIE10ElectronicsSim(0),
63  theHBHEQIE11ElectronicsSim(0),
64  theHBHEHitFilter(),
65  theHBHEQIE11HitFilter(),
66  theHFHitFilter(),
67  theHFQIE10HitFilter(),
68  theHOHitFilter(),
69  theHOSiPMHitFilter(),
70  theZDCHitFilter(),
71  theHBHEDigitizer(0),
72  theHODigitizer(0),
73  theHOSiPMDigitizer(0),
74  theHFDigitizer(0),
75  theZDCDigitizer(0),
76  theHFQIE10Digitizer(0),
77  theHBHEQIE11Digitizer(0),
78  theRelabeller(0),
79  isZDC(true),
80  isHCAL(true),
81  zdcgeo(true),
82  hbhegeo(true),
83  hogeo(true),
84  hfgeo(true),
85  doHFWindow_(ps.getParameter<bool>("doHFWindow")),
86  killHE_(ps.getParameter<bool>("killHE")),
87  debugCS_(ps.getParameter<bool>("debugCaloSamples")),
88  ignoreTime_(ps.getParameter<bool>("ignoreGeantTime")),
89  injectTestHits_(ps.getParameter<bool>("injectTestHits")),
90  hitsProducer_(ps.getParameter<std::string>("hitsProducer")),
91  theHOSiPMCode(ps.getParameter<edm::ParameterSet>("ho").getParameter<int>("siPMCode")),
92  deliveredLumi(0.),
93  m_HEDarkening(0),
94  m_HFRecalibration(0),
95  injectedHitsEnergy_(ps.getParameter<std::vector<double>>("injectTestHitsEnergy")),
96  injectedHitsTime_(ps.getParameter<std::vector<double>>("injectTestHitsTime")),
97  injectedHitsCells_(ps.getParameter<std::vector<int>>("injectTestHitsCells"))
98 {
99  iC.consumes<std::vector<PCaloHit> >(edm::InputTag(hitsProducer_, "ZDCHITS"));
100  iC.consumes<std::vector<PCaloHit> >(edm::InputTag(hitsProducer_, "HcalHits"));
101 
102  bool doNoise = ps.getParameter<bool>("doNoise");
103 
104  bool PreMix1 = ps.getParameter<bool>("HcalPreMixStage1"); // special threshold/pedestal treatment
105  bool PreMix2 = ps.getParameter<bool>("HcalPreMixStage2"); // special threshold/pedestal treatment
106  bool doEmpty = ps.getParameter<bool>("doEmpty");
107  deliveredLumi = ps.getParameter<double>("DelivLuminosity");
108  bool agingFlagHE = ps.getParameter<bool>("HEDarkening");
109  bool agingFlagHF = ps.getParameter<bool>("HFDarkening");
110  double minFCToDelay= ps.getParameter<double>("minFCToDelay");
111 
112  if(PreMix1 && PreMix2) {
113  throw cms::Exception("Configuration")
114  << "HcalDigitizer cannot operate in PreMixing digitization and PreMixing\n"
115  "digi combination modes at the same time. Please set one mode to False\n"
116  "in the configuration file.";
117  }
118 
119  // need to make copies, because they might get different noise generators
120  theHBHEAmplifier = new HcalAmplifier(theParameterMap, doNoise, PreMix1, PreMix2);
121  theHFAmplifier = new HcalAmplifier(theParameterMap, doNoise, PreMix1, PreMix2);
122  theHOAmplifier = new HcalAmplifier(theParameterMap, doNoise, PreMix1, PreMix2);
123  theZDCAmplifier = new HcalAmplifier(theParameterMap, doNoise, PreMix1, PreMix2);
124  theHFQIE10Amplifier = new HcalAmplifier(theParameterMap, doNoise, PreMix1, PreMix2);
125  theHBHEQIE11Amplifier = new HcalAmplifier(theParameterMap, doNoise, PreMix1, PreMix2);
126 
128 
133  theHFQIE10ElectronicsSim = new HcalElectronicsSim(theHFQIE10Amplifier, theCoderFactory, PreMix1); //should this use a different coder factory?
134  theHBHEQIE11ElectronicsSim = new HcalElectronicsSim(theHBHEQIE11Amplifier, theCoderFactory, PreMix1); //should this use a different coder factory?
135 
136  bool doHOHPD = (theHOSiPMCode != 1);
137  bool doHOSiPM = (theHOSiPMCode != 0);
138  if(doHOHPD) {
142  }
143  if(doHOSiPM) {
147  }
148 
151 
152  //QIE8 and QIE11 can coexist in HBHE
155 
156  bool doTimeSlew = ps.getParameter<bool>("doTimeSlew");
157  //initialize: they won't be called later if flag is set
158  theTimeSlewSim = 0;
159  if(doTimeSlew) {
160  // no time slewing for HF
161  theTimeSlewSim = new HcalTimeSlewSim(theParameterMap,minFCToDelay);
162  theHBHEAmplifier->setTimeSlewSim(theTimeSlewSim);
163  theHBHEQIE11Amplifier->setTimeSlewSim(theTimeSlewSim);
164  theHOAmplifier->setTimeSlewSim(theTimeSlewSim);
165  theZDCAmplifier->setTimeSlewSim(theTimeSlewSim);
166  }
167 
171 
172  //QIE8 and QIE10 can coexist in HF
175 
177 
178  testNumbering_ = ps.getParameter<bool>("TestNumbering");
179 // std::cout << "Flag to see if Hit Relabeller to be initiated " << testNumbering_ << std::endl;
181 
182  if(ps.getParameter<bool>("doIonFeedback") && theHBHEResponse) {
185  if(ps.getParameter<bool>("doThermalNoise")) {
187  }
188  }
189 
190  //option to save CaloSamples as event product for debugging
191  if(debugCS_){
199  }
200 
201  //option to ignore Geant time distribution in SimHits, for debugging
202  if(ignoreTime_){
210  }
211 
212  if(agingFlagHE) m_HEDarkening = new HEDarkening();
213  if(agingFlagHF) m_HFRecalibration = new HFRecalibration(ps.getParameter<edm::ParameterSet>("HFRecalParameterBlock"));
214 }
215 
216 
220  if(theHODigitizer) delete theHODigitizer;
222  if(theHFDigitizer) delete theHFDigitizer;
224  delete theZDCDigitizer;
225  delete theParameterMap;
226  delete theHBHEResponse;
227  delete theHBHESiPMResponse;
228  delete theHOResponse;
229  delete theHOSiPMResponse;
230  delete theHFResponse;
231  delete theHFQIE10Response;
232  delete theZDCResponse;
233  delete theHBHEElectronicsSim;
234  delete theHFElectronicsSim;
235  delete theHOElectronicsSim;
236  delete theZDCElectronicsSim;
239  delete theHBHEAmplifier;
240  delete theHFAmplifier;
241  delete theHOAmplifier;
242  delete theZDCAmplifier;
243  delete theHFQIE10Amplifier;
244  delete theHBHEQIE11Amplifier;
245  delete theCoderFactory;
246  if (theRelabeller) delete theRelabeller;
247 }
248 
249 
251  noiseGenerator->setParameterMap(theParameterMap);
252  noiseGenerator->setElectronicsSim(theHBHEElectronicsSim);
254  theHBHEAmplifier->setNoiseSignalGenerator(noiseGenerator);
255 }
256 
258  noiseGenerator->setParameterMap(theParameterMap);
262 }
263 
265  noiseGenerator->setParameterMap(theParameterMap);
266  noiseGenerator->setElectronicsSim(theHFElectronicsSim);
268  theHFAmplifier->setNoiseSignalGenerator(noiseGenerator);
269 }
270 
272  noiseGenerator->setParameterMap(theParameterMap);
276 }
277 
279  noiseGenerator->setParameterMap(theParameterMap);
280  noiseGenerator->setElectronicsSim(theHOElectronicsSim);
283  theHOAmplifier->setNoiseSignalGenerator(noiseGenerator);
284 }
285 
287  noiseGenerator->setParameterMap(theParameterMap);
288  noiseGenerator->setElectronicsSim(theZDCElectronicsSim);
289  theZDCDigitizer->setNoiseSignalGenerator(noiseGenerator);
290  theZDCAmplifier->setNoiseSignalGenerator(noiseGenerator);
291 }
292 
294  // get the appropriate gains, noises, & widths for this event
295  edm::ESHandle<HcalDbService> conditions;
296  eventSetup.get<HcalDbRecord>().get(conditions);
297 
298  theHBHEAmplifier->setDbService(conditions.product());
299  theHFAmplifier->setDbService(conditions.product());
300  theHOAmplifier->setDbService(conditions.product());
301  theZDCAmplifier->setDbService(conditions.product());
304 
307 
308  theCoderFactory->setDbService(conditions.product());
309  theParameterMap->setDbService(conditions.product());
310 
311  //initialize hits
319 
320 }
321 
322 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) {
323 
324  // Step A: pass in inputs, and accumulate digis
325  if(isHCAL) {
326  std::vector<PCaloHit> hcalHitsOrig = *hcalHandle.product();
327  if(injectTestHits_) hcalHitsOrig = injectedHits_;
328  std::vector<PCaloHit> hcalHits;
329  hcalHits.reserve(hcalHitsOrig.size());
330 
331  //evaluate darkening before relabeling
332  if (testNumbering_) {
334  darkening(hcalHitsOrig);
335  }
336  // Relabel PCaloHits if necessary
337  edm::LogInfo("HcalDigitizer") << "Calling Relabeller";
338  theRelabeller->process(hcalHitsOrig);
339  }
340 
341  //eliminate bad hits
342  for (unsigned int i=0; i< hcalHitsOrig.size(); i++) {
343  DetId id(hcalHitsOrig[i].id());
344  HcalDetId hid(id);
345  if (!htopoP->validHcal(hid)) {
346  edm::LogError("HcalDigitizer") << "bad hcal id found in digitizer. Skipping " << id.rawId() << " " << hid << std::endl;
347  continue;
348  }
349  else if(hid.subdet()==HcalForward && !doHFWindow_ && hcalHitsOrig[i].depth()!=0){
350  //skip HF window hits unless desired
351  continue;
352  }
353  else if( killHE_ && hid.subdet()==HcalEndcap ) {
354  // remove HE hits if asked for (phase 2)
355  continue;
356  }
357  else {
358 #ifdef DebugLog
359  std::cout << "HcalDigitizer format " << hid.oldFormat() << " for " << hid << std::endl;
360 #endif
361  DetId newid = DetId(hid.newForm());
362 #ifdef DebugLog
363  std::cout << "Hit " << i << " out of " << hcalHits.size() << " " << std::hex << id.rawId() << " --> " << newid.rawId() << std::dec << " " << HcalDetId(newid.rawId()) << '\n';
364 #endif
365  hcalHitsOrig[i].setID(newid.rawId());
366  hcalHits.push_back(hcalHitsOrig[i]);
367  }
368  }
369 
370  if(hbhegeo) {
371  if(theHBHEDigitizer) theHBHEDigitizer->add(hcalHits, bunchCrossing, engine);
372  if(theHBHEQIE11Digitizer) theHBHEQIE11Digitizer->add(hcalHits, bunchCrossing, engine);
373  }
374 
375  if(hogeo) {
376  if(theHODigitizer) theHODigitizer->add(hcalHits, bunchCrossing, engine);
377  if(theHOSiPMDigitizer) theHOSiPMDigitizer->add(hcalHits, bunchCrossing, engine);
378  }
379 
380  if(hfgeo) {
381  if(theHFDigitizer) theHFDigitizer->add(hcalHits, bunchCrossing, engine);
382  if(theHFQIE10Digitizer) theHFQIE10Digitizer->add(hcalHits, bunchCrossing, engine);
383  }
384  } else {
385  edm::LogInfo("HcalDigitizer") << "We don't have HCAL hit collection available ";
386  }
387 
388  if(isZDC) {
389  if(zdcgeo) {
390  theZDCDigitizer->add(*zdcHandle.product(), bunchCrossing, engine);
391  }
392  } else {
393  edm::LogInfo("HcalDigitizer") << "We don't have ZDC hit collection available ";
394  }
395 }
396 
397 void HcalDigitizer::accumulate(edm::Event const& e, edm::EventSetup const& eventSetup, CLHEP::HepRandomEngine* engine) {
398  // Step A: Get Inputs
399  edm::InputTag zdcTag(hitsProducer_, "ZDCHITS");
401  e.getByLabel(zdcTag, zdcHandle);
402  isZDC = zdcHandle.isValid();
403 
404  edm::InputTag hcalTag(hitsProducer_, "HcalHits");
406  e.getByLabel(hcalTag, hcalHandle);
407  isHCAL = hcalHandle.isValid() or injectTestHits_;
408 
410  eventSetup.get<HcalRecNumberingRecord>().get(htopo);
411  const HcalTopology *htopoP=htopo.product();
412 
413  accumulateCaloHits(hcalHandle, zdcHandle, 0, engine, htopoP);
414 }
415 
416 void HcalDigitizer::accumulate(PileUpEventPrincipal const& e, edm::EventSetup const& eventSetup, CLHEP::HepRandomEngine* engine) {
417  // Step A: Get Inputs
418  edm::InputTag zdcTag(hitsProducer_, "ZDCHITS");
420  e.getByLabel(zdcTag, zdcHandle);
421  isZDC = zdcHandle.isValid();
422 
423  edm::InputTag hcalTag(hitsProducer_, "HcalHits");
425  e.getByLabel(hcalTag, hcalHandle);
426  isHCAL = hcalHandle.isValid();
427 
429  eventSetup.get<HcalRecNumberingRecord>().get(htopo);
430  const HcalTopology *htopoP=htopo.product();
431 
432  accumulateCaloHits(hcalHandle, zdcHandle, e.bunchCrossing(), engine, htopoP);
433 }
434 
435 void HcalDigitizer::finalizeEvent(edm::Event& e, const edm::EventSetup& eventSetup, CLHEP::HepRandomEngine* engine) {
436 
437  // Step B: Create empty output
438  std::unique_ptr<HBHEDigiCollection> hbheResult(new HBHEDigiCollection());
439  std::unique_ptr<HODigiCollection> hoResult(new HODigiCollection());
440  std::unique_ptr<HFDigiCollection> hfResult(new HFDigiCollection());
441  std::unique_ptr<ZDCDigiCollection> zdcResult(new ZDCDigiCollection());
442  std::unique_ptr<QIE10DigiCollection> hfQIE10Result(
444  theHFQIE10DetIds.size()>0 ?
447  )
448  );
449  std::unique_ptr<QIE11DigiCollection> hbheQIE11Result(
451  theHBHEQIE11DetIds.size()>0 ?
454  )
455  );
456 
457  // Step C: Invoke the algorithm, getting back outputs.
458  if(isHCAL&&hbhegeo){
459  if(theHBHEDigitizer) theHBHEDigitizer->run(*hbheResult, engine);
460  if(theHBHEQIE11Digitizer) theHBHEQIE11Digitizer->run(*hbheQIE11Result, engine);
461  }
462  if(isHCAL&&hogeo) {
463  if(theHODigitizer) theHODigitizer->run(*hoResult, engine);
464  if(theHOSiPMDigitizer) theHOSiPMDigitizer->run(*hoResult, engine);
465  }
466  if(isHCAL&&hfgeo) {
467  if(theHFDigitizer) theHFDigitizer->run(*hfResult, engine);
468  if(theHFQIE10Digitizer) theHFQIE10Digitizer->run(*hfQIE10Result, engine);
469  }
470  if(isZDC&&zdcgeo) {
471  theZDCDigitizer->run(*zdcResult, engine);
472  }
473 
474  edm::LogInfo("HcalDigitizer") << "HCAL HBHE digis : " << hbheResult->size();
475  edm::LogInfo("HcalDigitizer") << "HCAL HO digis : " << hoResult->size();
476  edm::LogInfo("HcalDigitizer") << "HCAL HF digis : " << hfResult->size();
477  edm::LogInfo("HcalDigitizer") << "HCAL ZDC digis : " << zdcResult->size();
478  edm::LogInfo("HcalDigitizer") << "HCAL HF QIE10 digis : " << hfQIE10Result->size();
479  edm::LogInfo("HcalDigitizer") << "HCAL HBHE QIE11 digis : " << hbheQIE11Result->size();
480 
481 #ifdef DebugLog
482  std::cout << std::endl;
483  std::cout << "HCAL HBHE digis : " << hbheResult->size() << std::endl;
484  std::cout << "HCAL HO digis : " << hoResult->size() << std::endl;
485  std::cout << "HCAL HF digis : " << hfResult->size() << std::endl;
486  std::cout << "HCAL ZDC digis : " << zdcResult->size() << std::endl;
487  std::cout << "HCAL HF QIE10 digis : " << hfQIE10Result->size() << std::endl;
488  std::cout << "HCAL HBHE QIE11 digis : " << hbheQIE11Result->size() << std::endl;
489 #endif
490 
491  // Step D: Put outputs into event
492  e.put(std::move(hbheResult));
493  e.put(std::move(hoResult));
494  e.put(std::move(hfResult));
495  e.put(std::move(zdcResult));
496  e.put(std::move(hfQIE10Result), "HFQIE10DigiCollection");
497  e.put(std::move(hbheQIE11Result), "HBHEQIE11DigiCollection");
498 
499  if(debugCS_){
500  std::unique_ptr<CaloSamplesCollection> csResult(new CaloSamplesCollection());
501  //smush together all the results
502  if(theHBHEDigitizer) csResult->insert(csResult->end(),theHBHEDigitizer->getCaloSamples().begin(),theHBHEDigitizer->getCaloSamples().end());
503  if(theHBHEQIE11Digitizer) csResult->insert(csResult->end(),theHBHEQIE11Digitizer->getCaloSamples().begin(),theHBHEQIE11Digitizer->getCaloSamples().end());
504  if(theHODigitizer) csResult->insert(csResult->end(),theHODigitizer->getCaloSamples().begin(),theHODigitizer->getCaloSamples().end());
505  if(theHOSiPMDigitizer) csResult->insert(csResult->end(),theHOSiPMDigitizer->getCaloSamples().begin(),theHOSiPMDigitizer->getCaloSamples().end());
506  if(theHFDigitizer) csResult->insert(csResult->end(),theHFDigitizer->getCaloSamples().begin(),theHFDigitizer->getCaloSamples().end());
507  if(theHFQIE10Digitizer) csResult->insert(csResult->end(),theHFQIE10Digitizer->getCaloSamples().begin(),theHFQIE10Digitizer->getCaloSamples().end());
508  csResult->insert(csResult->end(),theZDCDigitizer->getCaloSamples().begin(),theZDCDigitizer->getCaloSamples().end());
509  e.put(std::move(csResult),"HcalSamples");
510  }
511 
512  if(injectTestHits_){
513  std::unique_ptr<edm::PCaloHitContainer> pcResult(new edm::PCaloHitContainer());
514  pcResult->insert(pcResult->end(),injectedHits_.begin(),injectedHits_.end());
515  e.put(std::move(pcResult),"HcalHits");
516  }
517 
518 #ifdef DebugLog
519  std::cout << std::endl << "========> HcalDigitizer e.put " << std::endl << std::endl;
520 #endif
521 
522 }
523 
524 
526  checkGeometry(es);
527  theShapes->beginRun(es);
528 }
529 
530 
532  theShapes->endRun();
533 }
534 
535 
537  // TODO find a way to avoid doing this every event
539  eventSetup.get<CaloGeometryRecord>().get(geometry);
541  eventSetup.get<HcalRecNumberingRecord>().get(pHRNDC);
542 
543  // See if it's been updated
544  if (&*geometry != theGeometry) {
545  theGeometry = &*geometry;
546  theRecNumber= &*pHRNDC;
547  updateGeometry(eventSetup);
548  }
549 }
550 
551 
561 
562  const std::vector<DetId>& hbCells = theGeometry->getValidDetIds(DetId::Hcal, HcalBarrel);
563  const std::vector<DetId>& heCells = theGeometry->getValidDetIds(DetId::Hcal, HcalEndcap);
564  const std::vector<DetId>& hoCells = theGeometry->getValidDetIds(DetId::Hcal, HcalOuter);
565  const std::vector<DetId>& hfCells = theGeometry->getValidDetIds(DetId::Hcal, HcalForward);
566  const std::vector<DetId>& zdcCells = theGeometry->getValidDetIds(DetId::Calo, HcalZDCDetId::SubdetectorId);
567  //const std::vector<DetId>& hcalTrigCells = geometry->getValidDetIds(DetId::Hcal, HcalTriggerTower);
568  //const std::vector<DetId>& hcalCalib = geometry->getValidDetIds(DetId::Calo, HcalCastorDetId::SubdetectorId);
569 // std::cout<<"HcalDigitizer::CheckGeometry number of cells: "<<zdcCells.size()<<std::endl;
570  if(zdcCells.empty()) zdcgeo = false;
571  if(hbCells.empty() && heCells.empty()) hbhegeo = false;
572  if(hoCells.empty()) hogeo = false;
573  if(hfCells.empty()) hfgeo = false;
574  // combine HB & HE
575 
576  hbheCells = hbCells;
577  if( !killHE_) {
578  hbheCells.insert(hbheCells.end(), heCells.begin(), heCells.end());
579  }
580  //handle mixed QIE8/11 scenario in HBHE
581  buildHBHEQIECells(hbheCells,eventSetup);
584 
585  if(theHOSiPMDigitizer) {
586  buildHOSiPMCells(hoCells, eventSetup);
588  ((HcalSiPMHitResponse *)theHOSiPMResponse)->setDetIds(hoCells);
589  }
590 
591  //handle mixed QIE8/10 scenario in HF
592  buildHFQIECells(hfCells,eventSetup);
593 
594  theZDCDigitizer->setDetIds(zdcCells);
595 
596  //fill test hits collection if desired and empty
597  if(injectTestHits_ && injectedHits_.size()==0 && injectedHitsCells_.size()>0 && injectedHitsEnergy_.size()>0){
598  //make list of specified cells if desired
599  std::vector<DetId> testCells;
600  if(injectedHitsCells_.size()>=4){
601  testCells.reserve(injectedHitsCells_.size()/4);
602  for(unsigned ic = 0; ic < injectedHitsCells_.size(); ic += 4){
603  if(ic+4 > injectedHitsCells_.size()) break;
604  testCells.push_back(HcalDetId((HcalSubdetector)injectedHitsCells_[ic],injectedHitsCells_[ic+1],
606  }
607  }
608  else{
609  int testSubdet = injectedHitsCells_[0];
610  if(testSubdet==HcalBarrel) testCells = hbCells;
611  else if(testSubdet==HcalEndcap) testCells = heCells;
612  else if(testSubdet==HcalForward) testCells = hfCells;
613  else if(testSubdet==HcalOuter) testCells = hoCells;
614  else throw cms::Exception("Configuration") << "Unknown subdet " << testSubdet << " for HCAL test hit injection";
615  }
616  bool useHitTimes = (injectedHitsTime_.size()==injectedHitsEnergy_.size());
617  injectedHits_.reserve(testCells.size()*injectedHitsEnergy_.size());
618  for(unsigned ih = 0; ih < injectedHitsEnergy_.size(); ++ih){
619  double tmp = useHitTimes ? injectedHitsTime_[ih] : 0.;
620  for(auto& aCell: testCells){
621  injectedHits_.emplace_back(aCell,injectedHitsEnergy_[ih],tmp);
622  }
623  }
624  }
625 }
626 
627 void HcalDigitizer::buildHFQIECells(const std::vector<DetId>& allCells, const edm::EventSetup & eventSetup) {
628  //if results are already cached, no need to look again
629  if(theHFQIE8DetIds.size()>0 || theHFQIE10DetIds.size()>0) return;
630 
631  //get the QIETypes
633  eventSetup.get<HcalQIETypesRcd>().get(q);
635  eventSetup.get<HcalRecNumberingRecord>().get(htopo);
636 
637  HcalQIETypes qieTypes(*q.product());
638  if (qieTypes.topo()==0) {
639  qieTypes.setTopo(htopo.product());
640  }
641 
642  for(std::vector<DetId>::const_iterator detItr = allCells.begin(); detItr != allCells.end(); ++detItr) {
643  HcalQIENum qieType = HcalQIENum(qieTypes.getValues(*detItr)->getValue());
644  if(qieType == QIE8) {
645  theHFQIE8DetIds.push_back(*detItr);
646  } else if(qieType == QIE10) {
647  theHFQIE10DetIds.push_back(*detItr);
648  } else { //default is QIE8
649  theHFQIE8DetIds.push_back(*detItr);
650  }
651  }
652 
654  else {
655  delete theHFDigitizer;
657  }
658 
660  else {
661  delete theHFQIE10Digitizer;
663  }
664 }
665 
666 void HcalDigitizer::buildHBHEQIECells(const std::vector<DetId>& allCells, const edm::EventSetup & eventSetup) {
667  //if results are already cached, no need to look again
668  if(theHBHEQIE8DetIds.size()>0 || theHBHEQIE11DetIds.size()>0) return;
669 
670  //get the QIETypes
672  eventSetup.get<HcalQIETypesRcd>().get(q);
674  eventSetup.get<HcalRecNumberingRecord>().get(htopo);
675 
676  HcalQIETypes qieTypes(*q.product());
677  if (qieTypes.topo()==0) {
678  qieTypes.setTopo(htopo.product());
679  }
680 
681  for(std::vector<DetId>::const_iterator detItr = allCells.begin(); detItr != allCells.end(); ++detItr) {
682  HcalQIENum qieType = HcalQIENum(qieTypes.getValues(*detItr)->getValue());
683  if(qieType == QIE8) {
684  theHBHEQIE8DetIds.push_back(*detItr);
685  }
686  else if(qieType == QIE11) {
687  theHBHEQIE11DetIds.push_back(*detItr);
688  }
689  else { //default is QIE8
690  theHBHEQIE8DetIds.push_back(*detItr);
691  }
692  }
693 
695  else {
696  delete theHBHEDigitizer;
698  }
699 
701  else {
702  delete theHBHEQIE11Digitizer;
704  }
705 
706  if(theHBHEQIE8DetIds.size()>0 && theHBHEQIE11DetIds.size()>0){
709  }
710 }
711 
712 void HcalDigitizer::buildHOSiPMCells(const std::vector<DetId>& allCells, const edm::EventSetup & eventSetup) {
713  // all HPD
714 
715  if(theHOSiPMCode == 0) {
716  theHODigitizer->setDetIds(allCells);
717  } else if(theHOSiPMCode == 1) {
718  theHOSiPMDigitizer->setDetIds(allCells);
719  // FIXME pick Zecotek or hamamatsu?
720  } else if(theHOSiPMCode == 2) {
721  std::vector<HcalDetId> zecotekDetIds, hamamatsuDetIds;
723  eventSetup.get<HcalMCParamsRcd>().get(p);
725  eventSetup.get<HcalRecNumberingRecord>().get(htopo);
726 
727  HcalMCParams mcParams(*p.product());
728  if (mcParams.topo()==0) {
729  mcParams.setTopo(htopo.product());
730  }
731 
732  for(std::vector<DetId>::const_iterator detItr = allCells.begin(); detItr != allCells.end(); ++detItr) {
733  int shapeType = mcParams.getValues(*detItr)->signalShape();
734  if(shapeType == HcalShapes::ZECOTEK) {
735  zecotekDetIds.emplace_back(*detItr);
736  theHOSiPMDetIds.push_back(*detItr);
737  } else if(shapeType == HcalShapes::HAMAMATSU) {
738  hamamatsuDetIds.emplace_back(*detItr);
739  theHOSiPMDetIds.push_back(*detItr);
740  } else {
741  theHOHPDDetIds.push_back(*detItr);
742  }
743  }
744 
746  else {
747  delete theHODigitizer;
749  }
750 
752  else {
753  delete theHOSiPMDigitizer;
755  }
756 
757  if(theHOHPDDetIds.size()>0 && theHOSiPMDetIds.size()>0){
760  }
761 
762  theParameterMap->setHOZecotekDetIds(zecotekDetIds);
763  theParameterMap->setHOHamamatsuDetIds(hamamatsuDetIds);
764 
765  // make sure we don't got through this exercise again
766  theHOSiPMCode = -2;
767  }
768 }
769 
770 void HcalDigitizer::darkening(std::vector<PCaloHit>& hcalHits) {
771 
772  for (unsigned int ii=0; ii<hcalHits.size(); ++ii) {
773  uint32_t tmpId = hcalHits[ii].id();
774  int det, z, depth, ieta, phi, lay;
775  HcalTestNumbering::unpackHcalIndex(tmpId,det,z,depth,ieta,phi,lay);
776 
777  bool darkened = false;
778  float dweight = 1.;
779 
780  if(det==int(HcalEndcap) && m_HEDarkening){
781  //HE darkening
782  dweight = m_HEDarkening->degradation(deliveredLumi,ieta,lay-2);//NB:diff. layer count
783  darkened = true;
784  } else if(det==int(HcalForward) && m_HFRecalibration){
785  //HF darkening - approximate: invert recalibration factor
786  dweight = 1.0/m_HFRecalibration->getCorr(ieta,depth,deliveredLumi);
787  darkened = true;
788  }
789 
790  //create new hit with darkened energy
791  //if(darkened) hcalHits[ii] = PCaloHit(hcalHits[ii].energyEM()*dweight,hcalHits[ii].energyHad()*dweight,hcalHits[ii].time(),hcalHits[ii].geantTrackId(),hcalHits[ii].id());
792 
793  //reset hit energy
794  if(darkened) hcalHits[ii].setEnergy(hcalHits[ii].energy()*dweight);
795  }
796 
797 }
798 
799 
HFHitFilter theHFQIE10HitFilter
std::vector< DetId > theHFQIE10DetIds
EDGetTokenT< ProductType > consumes(edm::InputTag const &tag)
QIE10Digitizer * theHFQIE10Digitizer
T getParameter(std::string const &) const
std::vector< int > injectedHitsCells_
void setGeometry(const CaloGeometry *geometry)
geometry needed for time-of-flight
void setDbService(const HcalDbService *service)
the Producer will probably update this every event
HBHEHitFilter theHBHEHitFilter
int i
Definition: DBlmapReader.cc:9
CaloHitResponse * theHFQIE10Response
Definition: HcalDigitizer.h:97
void setGeometry(const CaloGeometry *&, const HcalDDDRecConstants *&)
std::vector< PCaloHit > PCaloHitContainer
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:122
void setQIE10NoiseSignalGenerator(HcalBaseSignalGenerator *noiseGenerator)
std::vector< CaloSamples > CaloSamplesCollection
Definition: CaloSamples.h:85
const HcalDDDRecConstants * theRecNumber
Definition: HcalDigitizer.h:71
void add(const std::vector< PCaloHit > &hits, int bunchCrossing, CLHEP::HepRandomEngine *engine)
void setParameterMap(HcalSimParameterMap *map)
HcalSubdetector subdet() const
get the subdetector
Definition: HcalDetId.h:49
virtual const CaloSimParameters & simParameters(const DetId &id) const
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::EventIDconst &, edm::Timestampconst & > We also list in braces which AR_WATCH_USING_METHOD_ is used for those or
Definition: Activities.doc:12
virtual ~HcalDigitizer()
HcalElectronicsSim * theHFElectronicsSim
void buildHFQIECells(const std::vector< DetId > &allCells, const edm::EventSetup &eventSetup)
Definition: HcalQIENum.h:4
HBHEDigitizer * theHBHEDigitizer
HcalElectronicsSim * theHBHEQIE11ElectronicsSim
HOHitFilter theHOHitFilter
void darkening(std::vector< PCaloHit > &hcalHits)
#define NULL
Definition: scimark2.h:8
HFDigitizer * theHFDigitizer
HFHitFilter theHFHitFilter
CaloTDigitizer< HODigitizerTraits, CaloTDigitizerQIE8Run > HODigitizer
Definition: HcalDigitizer.h:83
void checkGeometry(const edm::EventSetup &eventSetup)
HcalSimParameterMap * theParameterMap
Definition: HcalDigitizer.h:89
bool validHcal(const HcalDetId &id) const
void setPECorrection(const CaloVPECorrection *peCorrection)
if you want to correct the photoelectrons
CaloTDigitizer< HBHEDigitizerTraits, CaloTDigitizerQIE8Run > HBHEDigitizer
Definition: HcalDigitizer.h:82
int ii
Definition: cuy.py:588
HcalTimeSlewSim * theTimeSlewSim
void buildHBHEQIECells(const std::vector< DetId > &allCells, const edm::EventSetup &eventSetup)
HcalAmplifier * theHFAmplifier
HcalCoderFactory * theCoderFactory
HcalHitRelabeller * theRelabeller
edm::SortedCollection< ZDCDataFrame > ZDCDigiCollection
HcalDataFrameContainer< QIE10DataFrame > QIE10DigiCollection
void initializeEvent(edm::Event const &e, edm::EventSetup const &c)
void setDbService(const HcalDbService *service)
void setIonFeedbackSim(HPDIonFeedbackSim *feedbackSim)
Definition: HcalAmplifier.h:27
HcalAmplifier * theHBHEQIE11Amplifier
uint32_t rawId() const
get the raw id
Definition: DetId.h:43
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)
HcalAmplifier * theHBHEAmplifier
edm::SortedCollection< HODataFrame > HODigiCollection
std::string hitsProducer_
HcalElectronicsSim * theHOElectronicsSim
double deliveredLumi
void setElectronicsSim(HcalElectronicsSim *electronicsSim)
void setHitFilter(const CaloVHitFilter *filter)
if you want to reject hits, for example, from a certain subdetector, set this
double getCorr(int ieta, int idepth, double lumi)
HcalShapes * theShapes
Definition: HcalDigitizer.h:90
Creates electronics signals from hits.
void setHFNoiseSignalGenerator(HcalBaseSignalGenerator *noiseGenerator)
void initializeHits()
void buildHOSiPMCells(const std::vector< DetId > &allCells, const edm::EventSetup &eventSetup)
ZDCHitFilter theZDCHitFilter
HPDIonFeedbackSim * theIonFeedback
def move
Definition: eostools.py:510
CaloTDigitizer< ZDCDigitizerTraits, CaloTDigitizerQIE8Run > ZDCDigitizer
Definition: HcalDigitizer.h:85
CaloHitResponse * theHOResponse
Definition: HcalDigitizer.h:94
CaloHitResponse * theHOSiPMResponse
Definition: HcalDigitizer.h:95
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
ZDCDigitizer * theZDCDigitizer
void setNoiseSignalGenerator(CaloVNoiseSignalGenerator *generator)
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:75
bool getByLabel(InputTag const &tag, Handle< PROD > &result) const
Definition: Event.h:413
bool oldFormat() const
Definition: HcalDetId.h:50
CaloHitResponse * theZDCResponse
Definition: HcalDigitizer.h:98
void endRun()
Definition: HcalShapes.cc:103
CaloTDigitizer< HFDigitizerTraits, CaloTDigitizerQIE8Run > HFDigitizer
Definition: HcalDigitizer.h:84
void setNoiseSignalGenerator(const CaloVNoiseSignalGenerator *noiseSignalGenerator)
Definition: HcalAmplifier.h:31
HcalDataFrameContainer< QIE11DataFrame > QIE11DigiCollection
Definition: DetId.h:18
HcalElectronicsSim * theZDCElectronicsSim
static const int SubdetectorId
Definition: HcalZDCDetId.h:25
void beginRun(const edm::EventSetup &es)
void process(std::vector< PCaloHit > &hcalHits)
void setTimeSlewSim(HcalTimeSlewSim *timeSlewSim)
Definition: HcalAmplifier.h:34
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)
HcalAmplifier * theHOAmplifier
std::vector< DetId > theHFQIE8DetIds
void setDbService(const HcalDbService *service)
HFRecalibration * m_HFRecalibration
const T & get() const
Definition: EventSetup.h:56
HcalElectronicsSim * theHBHEElectronicsSim
T const * product() const
Definition: ESHandle.h:86
uint32_t newForm() const
Definition: HcalDetId.cc:142
void run(MixCollection< PCaloHit > &, DigiCollection &)
turns hits into digis
CaloHitResponse * theHBHEResponse
Definition: HcalDigitizer.h:92
HODigitizer * theHODigitizer
void setDetIds(const std::vector< DetId > &detIds)
Definition: HcalHitFilter.h:17
std::vector< DetId > theHOSiPMDetIds
HOHitFilter theHOSiPMHitFilter
const CaloGeometry * theGeometry
Definition: HcalDigitizer.h:70
std::vector< DetId > getValidDetIds() const
Get the list of all valid detector ids.
Definition: CaloGeometry.cc:92
std::vector< DetId > hbheCells
std::vector< std::vector< double > > tmp
Definition: MVATrainer.cc:100
ESHandle< TrackerGeometry > geometry
CaloHitResponse * theHFResponse
Definition: HcalDigitizer.h:96
CaloTDigitizer< HcalQIE11DigitizerTraits, CaloTDigitizerQIE1011Run > QIE11Digitizer
Definition: HcalDigitizer.h:87
HcalElectronicsSim * theHFQIE10ElectronicsSim
HODigitizer * theHOSiPMDigitizer
QIE11Digitizer * theHBHEQIE11Digitizer
HBHEHitFilter theHBHEQIE11HitFilter
bool getByLabel(edm::InputTag const &tag, edm::Handle< T > &result) const
void setZDCNoiseSignalGenerator(HcalBaseSignalGenerator *noiseGenerator)
std::vector< DetId > theHBHEQIE8DetIds
HEDarkening * m_HEDarkening
edm::SortedCollection< HFDataFrame > HFDigiCollection
void beginRun(edm::EventSetup const &es)
Definition: HcalShapes.cc:88
void setDebugCaloSamples(bool debug)
CaloHitResponse * theHBHESiPMResponse
Definition: HcalDigitizer.h:93
tuple cout
Definition: gather_cfg.py:145
CaloTDigitizer< HcalQIE10DigitizerTraits, CaloTDigitizerQIE1011Run > QIE10Digitizer
Definition: HcalDigitizer.h:86
void updateGeometry(const edm::EventSetup &eventSetup)
float degradation(float intlumi, int ieta, int lay)
Definition: HEDarkening.cc:52
void setHBHENoiseSignalGenerator(HcalBaseSignalGenerator *noiseGenerator)
HcalAmplifier * theZDCAmplifier
std::vector< DetId > theHBHEQIE11DetIds
const CaloSamplesCollection & getCaloSamples() const
void setTopo(const HcalTopology *topo)
void setDbService(const HcalDbService *service)
void setDetIds(const std::vector< DetId > &detIds)
void setIgnoreGeantTime(bool gt)
edm::SortedCollection< HBHEDataFrame > HBHEDigiCollection
std::vector< PCaloHit > injectedHits_
void finalizeEvent(edm::Event &e, edm::EventSetup const &c, CLHEP::HepRandomEngine *)
HcalAmplifier * theHFQIE10Amplifier
void setHONoiseSignalGenerator(HcalBaseSignalGenerator *noiseGenerator)
HcalDigitizer(const edm::ParameterSet &ps, edm::ConsumesCollector &iC)