CMS 3D CMS Logo

HcalTBDigiProducer.cc
Go to the documentation of this file.
9 
19 
21 
23  edm::ProducesCollector producesCollector,
25  : theParameterMap(new HcalTBSimParameterMap(ps)),
26  paraMap(new HcalSimParameterMap(ps)),
27  theHcalShape(new HcalShape()),
28  theHcalIntegratedShape(new CaloShapeIntegrator(theHcalShape)),
29  theHBHEResponse(new CaloHitResponse(theParameterMap, theHcalIntegratedShape)),
30  theHOResponse(new CaloHitResponse(theParameterMap, theHcalIntegratedShape)),
31  theAmplifier(nullptr),
32  theCoderFactory(nullptr),
33  theElectronicsSim(nullptr),
34  theTimeSlewSim(nullptr),
35  theHBHEDigitizer(nullptr),
36  theHODigitizer(nullptr),
37  theHBHEHits(),
38  theHOHits(),
39  thisPhaseShift(0) {
40  std::string const instance("simHcalDigis");
41  producesCollector.produces<HBHEDigiCollection>(instance);
42  producesCollector.produces<HODigiCollection>(instance);
43  iC.consumes<std::vector<PCaloHit>>(edm::InputTag("g4SimHits", "HcalHits"));
44 
45  DetId detId(DetId::Hcal, 1);
48 
51 
52  bool doNoise = ps.getParameter<bool>("doNoise");
53  bool dummy1 = false;
54  bool dummy2 = false; // extra arguments for premixing
55  theAmplifier = new HcalAmplifier(theParameterMap, doNoise, dummy1, dummy2);
58 
59  double minFCToDelay = ps.getParameter<double>("minFCToDelay");
60  bool doTimeSlew = ps.getParameter<bool>("doTimeSlew");
61 
62  hcalTimeSlew_delay_ = nullptr;
63  if (doTimeSlew) {
64  // no time slewing for HF
65  theTimeSlewSim = new HcalTimeSlewSim(theParameterMap, minFCToDelay);
67  }
68 
71 
72  tunePhaseShift = ps.getUntrackedParameter<double>("tunePhaseShiftTB", 1.);
73  ecalTBInfoLabel = ps.getUntrackedParameter<std::string>("EcalTBInfoLabel", "SimEcalTBG4Object");
74  edm::LogInfo("HcalSim") << "HcalTBDigiProducer initialized with doNoise = " << doNoise
75  << ", doTimeSlew = " << doTimeSlew << " and doPhaseShift = " << doPhaseShift
76  << " tunePhasShift = " << tunePhaseShift;
77 
78  if (doPhaseShift) {
80  }
81 }
82 
84  if (theHBHEDigitizer)
85  delete theHBHEDigitizer;
86  if (theHODigitizer)
87  delete theHODigitizer;
88  if (theParameterMap)
89  delete theParameterMap;
90  if (theHcalShape)
91  delete theHcalShape;
94  if (theHBHEResponse)
95  delete theHBHEResponse;
96  if (theHOResponse)
97  delete theHOResponse;
99  delete theElectronicsSim;
100  if (theAmplifier)
101  delete theAmplifier;
102  if (theCoderFactory)
103  delete theCoderFactory;
104  if (theTimeSlewSim)
105  delete theTimeSlewSim;
106 }
107 
109  // get the appropriate gains, noises, & widths for this event
110  edm::ESHandle<HcalDbService> conditions;
111  eventSetup.get<HcalDbRecord>().get(conditions);
112  theAmplifier->setDbService(conditions.product());
113  theCoderFactory->setDbService(conditions.product());
114 
115  // get the correct geometry
116  checkGeometry(eventSetup);
117 
118  // Cache random number engine
120  randomEngine_ = &rng->getEngine(e.streamID());
121 
122  theHBHEHits.clear();
123  theHOHits.clear();
124  if (doPhaseShift) {
125  edm::Handle<PEcalTBInfo> theEcalTBInfo;
126  e.getByLabel(ecalTBInfoLabel, theEcalTBInfo);
127  thisPhaseShift = theEcalTBInfo->phaseShift();
128 
129  DetId detIdHB(DetId::Hcal, 1);
130  setPhaseShift(detIdHB);
131  DetId detIdHO(DetId::Hcal, 3);
132  setPhaseShift(detIdHO);
133  }
134 
136  eventSetup.get<HcalTimeSlewRecord>().get("HBHE", delay);
137  hcalTimeSlew_delay_ = &*delay;
138 
140 
143 }
144 
145 void HcalTBDigiProducer::accumulateCaloHits(edm::Handle<std::vector<PCaloHit>> const &hcalHandle, int bunchCrossing) {
146  LogDebug("HcalSim") << "HcalTBDigiProducer::accumulate trying to get SimHit";
147 
148  if (hcalHandle.isValid()) {
149  std::vector<PCaloHit> hits = *hcalHandle.product();
150  LogDebug("HcalSim") << "HcalTBDigiProducer::accumulate Hits corrected";
151  theHBHEDigitizer->add(hits, bunchCrossing, randomEngine_);
152  theHODigitizer->add(hits, bunchCrossing, randomEngine_);
153  }
154 }
155 
157  // Step A: Get Inputs, and accumulate digis
158 
159  edm::InputTag hcalTag("g4SimHits", "HcalHits");
161  e.getByLabel(hcalTag, hcalHandle);
162 
163  accumulateCaloHits(hcalHandle, 0);
164 }
165 
167  edm::EventSetup const &,
168  edm::StreamID const &streamID) {
169  // Step A: Get Inputs, and accumulate digis
170 
171  edm::InputTag hcalTag("g4SimHits", "HcalHits");
173  e.getByLabel(hcalTag, hcalHandle);
174 
175  accumulateCaloHits(hcalHandle, e.bunchCrossing());
176 }
177 
179  // Step B: Create empty output
180  std::unique_ptr<HBHEDigiCollection> hbheResult(new HBHEDigiCollection());
181  std::unique_ptr<HODigiCollection> hoResult(new HODigiCollection());
182  LogDebug("HcalSim") << "HcalTBDigiProducer::produce Empty collection created";
183  // Step C: Invoke the algorithm, getting back outputs.
184  theHBHEDigitizer->run(*hbheResult, randomEngine_);
185  edm::LogInfo("HcalSim") << "HcalTBDigiProducer: HBHE digis : " << hbheResult->size();
186  theHODigitizer->run(*hoResult, randomEngine_);
187  edm::LogInfo("HcalSim") << "HcalTBDigiProducer: HO digis : " << hoResult->size();
188 
189  // Step D: Put outputs into event
190  std::string const instance("simHcalDigis");
191  e.put(std::move(hbheResult), instance);
192  e.put(std::move(hoResult), instance);
193 
194  randomEngine_ = nullptr; // to prevent access outside event
195 }
196 
198  for (edm::PCaloHitContainer::const_iterator hitItr = hits.begin(); hitItr != hits.end(); ++hitItr) {
199  HcalSubdetector subdet = HcalDetId(hitItr->id()).subdet();
200  if (subdet == HcalBarrel || subdet == HcalEndcap) {
201  theHBHEHits.push_back(*hitItr);
202  } else if (subdet == HcalOuter) {
203  theHOHits.push_back(*hitItr);
204  } else {
205  edm::LogError("HcalSim") << "Bad HcalHit subdetector " << subdet;
206  }
207  }
208 }
209 
211  // TODO find a way to avoid doing this every event
213  eventSetup.get<CaloGeometryRecord>().get(geometry);
214 
215  const CaloGeometry *pGeometry = &*geometry;
216 
217  // see if we need to update
218  if (pGeometry != theGeometry) {
219  theGeometry = pGeometry;
220  updateGeometry();
221  }
222 }
223 
227 
228  // Get cells for HB and HE
229  hbheCells.clear();
231  std::vector<DetId> heCells = theGeometry->getValidDetIds(DetId::Hcal, HcalEndcap);
232  // combine HB & HE
233  hbheCells.insert(hbheCells.end(), heCells.begin(), heCells.end());
234 
235  // Get cells for HO
236  hoCells.clear();
238 
239  edm::LogInfo("HcalSim") << "HcalTBDigiProducer update Geometry with " << hbheCells.size() << " cells in HB/HE and "
240  << hoCells.size() << " cells in HO";
241 
243  LogDebug("HcalSim") << "HcalTBDigiProducer: Set DetID's for HB/HE";
245  LogDebug("HcalSim") << "HcalTBDigiProducer: Set DetID's for HO";
246 }
247 
250  if (!parameters.syncPhase()) {
251  int myDet = detId.subdetId();
252  double passPhaseShift = thisPhaseShift + tunePhaseShift;
253  if (myDet <= 2) {
254  theHBHEResponse->setPhaseShift(passPhaseShift);
255  } else {
256  theHOResponse->setPhaseShift(passPhaseShift);
257  }
258  }
259 }
#define LogDebug(id)
void setPhaseShift(const DetId &detId)
EDGetTokenT< ProductType > consumes(edm::InputTag const &tag)
T getParameter(std::string const &) const
void setGeometry(const CaloGeometry *geometry)
geometry needed for time-of-flight
void setDbService(const HcalDbService *service)
the Producer will probably update this every event
T getUntrackedParameter(std::string const &, T const &) const
void finalizeEvent(edm::Event &e, edm::EventSetup const &c) override
void sortHits(const edm::PCaloHitContainer &hits)
fills the vectors for each subdetector
std::vector< PCaloHit > PCaloHitContainer
std::vector< DetId > hoCells
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:131
CaloHitResponse * theHBHEResponse
void add(const std::vector< PCaloHit > &hits, int bunchCrossing, CLHEP::HepRandomEngine *engine)
ProductRegistryHelper::BranchAliasSetterT< ProductType > produces()
static PFTauRenderPlugin instance
HBHEHitFilter theHBHEHitFilter
HcalSimParameterMap * paraMap
#define nullptr
HODigitizer * theHODigitizer
HcalElectronicsSim * theElectronicsSim
HOHitFilter theHOHitFilter
virtual CLHEP::HepRandomEngine & getEngine(StreamID const &)=0
Use this engine in event methods.
HcalTBSimParameterMap * theParameterMap
Main class for Parameters in different subdetectors.
const CaloGeometry * theGeometry
void setPhaseShift(const double &thePhaseShift)
setting the phase shift for asynchronous trigger (e.g. test beams)
CaloTDigitizer< HBHEDigitizerTraits > HBHEDigitizer
std::vector< PCaloHit > theHBHEHits
CaloTDigitizer< HODigitizerTraits > HODigitizer
edm::SortedCollection< HODataFrame > HODigiCollection
CaloVShape * theHcalIntegratedShape
void setHitFilter(const CaloVHitFilter *filter)
Creates electronics signals from hits.
void initializeHits()
HBHEDigitizer * theHBHEDigitizer
void setTimeSlew(const HcalTimeSlew *timeSlew)
Definition: HcalAmplifier.h:38
constexpr int subdetId() const
get the contents of the subdetector field (not cast into any detector&#39;s numbering enum) ...
Definition: DetId.h:48
HcalSubdetector
Definition: HcalAssistant.h:31
void checkGeometry(const edm::EventSetup &eventSetup)
shaper for Hcal (not for HF)
Definition: HcalShape.h:15
HcalTBDigiProducer(const edm::ParameterSet &ps, edm::ProducesCollector, edm::ConsumesCollector &iC)
std::vector< DetId > hbheCells
bool getByLabel(InputTag const &tag, Handle< PROD > &result) const
Definition: Event.h:488
void accumulate(edm::Event const &e, edm::EventSetup const &c) override
std::vector< PCaloHit > theHOHits
Definition: DetId.h:17
CaloHitResponse * theHOResponse
const CaloSimParameters & simParameters(const DetId &id) const override
void setTimeSlewSim(HcalTimeSlewSim *timeSlewSim)
Definition: HcalAmplifier.h:35
~HcalTBDigiProducer() override
void setDbService(const HcalDbService *service)
void run(MixCollection< PCaloHit > &, DigiCollection &)
turns hits into digis
HcalAmplifier * theAmplifier
std::string ecalTBInfoLabel
std::vector< DetId > getValidDetIds() const
Get the list of all valid detector ids.
Definition: CaloGeometry.cc:75
CLHEP::HepRandomEngine * randomEngine_
HcalCoderFactory * theCoderFactory
double phaseShift() const
Definition: PEcalTBInfo.h:37
ESHandle< TrackerGeometry > geometry
CaloVShape * theHcalShape
void initializeEvent(edm::Event const &e, edm::EventSetup const &c) override
bool getByLabel(edm::InputTag const &tag, edm::Handle< T > &result) const
T get() const
Definition: EventSetup.h:73
StreamID streamID() const
Definition: Event.h:96
T const * product() const
Definition: ESHandle.h:86
const HcalTimeSlew * hcalTimeSlew_delay_
void accumulateCaloHits(edm::Handle< std::vector< PCaloHit >> const &hits, int bunchCrossing)
def move(src, dest)
Definition: eostools.py:511
void setDetIds(const std::vector< DetId > &detIds)
edm::SortedCollection< HBHEDataFrame > HBHEDigiCollection
bool syncPhase() const
HcalTimeSlewSim * theTimeSlewSim