CMS 3D CMS Logo

GlobalHitsProducer.cc
Go to the documentation of this file.
1 
12 using CLHEP::micrometer;
13 using CLHEP::millimeter;
14 
16  : fName(""),
17  verbosity(0),
18  frequency(0),
19  vtxunit(0),
20  label(""),
21  getAllProvenances(false),
22  printProvenanceInfo(false),
23  nRawGenPart(0),
24  G4VtxSrc_Token_(consumes<edm::SimVertexContainer>((iPSet.getParameter<edm::InputTag>("G4VtxSrc")))),
25  G4TrkSrc_Token_(consumes<edm::SimTrackContainer>(iPSet.getParameter<edm::InputTag>("G4TrkSrc"))),
26  tGeomToken_(esConsumes()),
27  cscGeomToken_(esConsumes()),
28  dtGeomToken_(esConsumes()),
29  rpcGeomToken_(esConsumes()),
30  caloGeomToken_(esConsumes()),
31  count(0) {
32  std::string MsgLoggerCat = "GlobalHitsProducer_GlobalHitsProducer";
33 
34  // get information from parameter set
35  fName = iPSet.getUntrackedParameter<std::string>("Name");
36  verbosity = iPSet.getUntrackedParameter<int>("Verbosity");
37  frequency = iPSet.getUntrackedParameter<int>("Frequency");
38  vtxunit = iPSet.getUntrackedParameter<int>("VtxUnit");
39  label = iPSet.getParameter<std::string>("Label");
40  edm::ParameterSet m_Prov = iPSet.getParameter<edm::ParameterSet>("ProvenanceLookup");
41  getAllProvenances = m_Prov.getUntrackedParameter<bool>("GetAllProvenances");
42  printProvenanceInfo = m_Prov.getUntrackedParameter<bool>("PrintProvenanceInfo");
43 
44  // get Labels to use to extract information
45  PxlBrlLowSrc_ = iPSet.getParameter<edm::InputTag>("PxlBrlLowSrc");
46  PxlBrlHighSrc_ = iPSet.getParameter<edm::InputTag>("PxlBrlHighSrc");
47  PxlFwdLowSrc_ = iPSet.getParameter<edm::InputTag>("PxlFwdLowSrc");
48  PxlFwdHighSrc_ = iPSet.getParameter<edm::InputTag>("PxlFwdHighSrc");
49 
50  SiTIBLowSrc_ = iPSet.getParameter<edm::InputTag>("SiTIBLowSrc");
51  SiTIBHighSrc_ = iPSet.getParameter<edm::InputTag>("SiTIBHighSrc");
52  SiTOBLowSrc_ = iPSet.getParameter<edm::InputTag>("SiTOBLowSrc");
53  SiTOBHighSrc_ = iPSet.getParameter<edm::InputTag>("SiTOBHighSrc");
54  SiTIDLowSrc_ = iPSet.getParameter<edm::InputTag>("SiTIDLowSrc");
55  SiTIDHighSrc_ = iPSet.getParameter<edm::InputTag>("SiTIDHighSrc");
56  SiTECLowSrc_ = iPSet.getParameter<edm::InputTag>("SiTECLowSrc");
57  SiTECHighSrc_ = iPSet.getParameter<edm::InputTag>("SiTECHighSrc");
58 
59  MuonCscSrc_ = iPSet.getParameter<edm::InputTag>("MuonCscSrc");
60  MuonDtSrc_ = iPSet.getParameter<edm::InputTag>("MuonDtSrc");
61  MuonRpcSrc_ = iPSet.getParameter<edm::InputTag>("MuonRpcSrc");
62 
63  ECalEBSrc_ = iPSet.getParameter<edm::InputTag>("ECalEBSrc");
64  ECalEESrc_ = iPSet.getParameter<edm::InputTag>("ECalEESrc");
65  ECalESSrc_ = iPSet.getParameter<edm::InputTag>("ECalESSrc");
66 
67  HCalSrc_ = iPSet.getParameter<edm::InputTag>("HCalSrc");
68 
69  // fix for consumes
70  PxlBrlLowSrc_Token_ = consumes<edm::PSimHitContainer>(iPSet.getParameter<edm::InputTag>("PxlBrlLowSrc"));
71  PxlBrlHighSrc_Token_ = consumes<edm::PSimHitContainer>(iPSet.getParameter<edm::InputTag>("PxlBrlHighSrc"));
72  PxlFwdLowSrc_Token_ = consumes<edm::PSimHitContainer>(iPSet.getParameter<edm::InputTag>("PxlFwdLowSrc"));
73  PxlFwdHighSrc_Token_ = consumes<edm::PSimHitContainer>(iPSet.getParameter<edm::InputTag>("PxlFwdHighSrc"));
74 
75  SiTIBLowSrc_Token_ = consumes<edm::PSimHitContainer>(iPSet.getParameter<edm::InputTag>("SiTIBLowSrc"));
76  SiTIBHighSrc_Token_ = consumes<edm::PSimHitContainer>(iPSet.getParameter<edm::InputTag>("SiTIBHighSrc"));
77  SiTOBLowSrc_Token_ = consumes<edm::PSimHitContainer>(iPSet.getParameter<edm::InputTag>("SiTOBLowSrc"));
78  SiTOBHighSrc_Token_ = consumes<edm::PSimHitContainer>(iPSet.getParameter<edm::InputTag>("SiTOBHighSrc"));
79  SiTIDLowSrc_Token_ = consumes<edm::PSimHitContainer>(iPSet.getParameter<edm::InputTag>("SiTIDLowSrc"));
80  SiTIDHighSrc_Token_ = consumes<edm::PSimHitContainer>(iPSet.getParameter<edm::InputTag>("SiTIDHighSrc"));
81  SiTECLowSrc_Token_ = consumes<edm::PSimHitContainer>(iPSet.getParameter<edm::InputTag>("SiTECLowSrc"));
82  SiTECHighSrc_Token_ = consumes<edm::PSimHitContainer>(iPSet.getParameter<edm::InputTag>("SiTECHighSrc"));
83 
84  MuonCscSrc_Token_ = consumes<edm::PSimHitContainer>(iPSet.getParameter<edm::InputTag>("MuonCscSrc"));
85  MuonDtSrc_Token_ = consumes<edm::PSimHitContainer>(iPSet.getParameter<edm::InputTag>("MuonDtSrc"));
86  MuonRpcSrc_Token_ = consumes<edm::PSimHitContainer>(iPSet.getParameter<edm::InputTag>("MuonRpcSrc"));
87 
88  ECalEBSrc_Token_ = consumes<edm::PCaloHitContainer>(iPSet.getParameter<edm::InputTag>("ECalEBSrc"));
89  ECalEESrc_Token_ = consumes<edm::PCaloHitContainer>(iPSet.getParameter<edm::InputTag>("ECalEESrc"));
90  ECalESSrc_Token_ = consumes<edm::PCaloHitContainer>(iPSet.getParameter<edm::InputTag>("ECalESSrc"));
91  HCalSrc_Token_ = consumes<edm::PCaloHitContainer>(iPSet.getParameter<edm::InputTag>("HCalSrc"));
92 
93  // use value of first digit to determine default output level (inclusive)
94  // 0 is none, 1 is basic, 2 is fill output, 3 is gather output
95  verbosity %= 10;
96 
97  // create persistent object
98  produces<PGlobalSimHit>(label);
99 
100  // print out Parameter Set information being used
101  if (verbosity >= 0) {
102  edm::LogInfo(MsgLoggerCat)
103  << "\n===============================\n"
104  << "Initialized as EDProducer with parameter values:\n"
105  << " Name = " << fName << "\n"
106  << " Verbosity = " << verbosity << "\n"
107  << " Frequency = " << frequency << "\n"
108  << " VtxUnit = " << vtxunit << "\n"
109  << " Label = " << label << "\n"
110  << " GetProv = " << getAllProvenances << "\n"
111  << " PrintProv = " << printProvenanceInfo << "\n"
112  << " PxlBrlLowSrc = " << PxlBrlLowSrc_.label() << ":" << PxlBrlLowSrc_.instance() << "\n"
113  << " PxlBrlHighSrc = " << PxlBrlHighSrc_.label() << ":" << PxlBrlHighSrc_.instance() << "\n"
114  << " PxlFwdLowSrc = " << PxlFwdLowSrc_.label() << ":" << PxlBrlLowSrc_.instance() << "\n"
115  << " PxlFwdHighSrc = " << PxlFwdHighSrc_.label() << ":" << PxlBrlHighSrc_.instance() << "\n"
116  << " SiTIBLowSrc = " << SiTIBLowSrc_.label() << ":" << SiTIBLowSrc_.instance() << "\n"
117  << " SiTIBHighSrc = " << SiTIBHighSrc_.label() << ":" << SiTIBHighSrc_.instance() << "\n"
118  << " SiTOBLowSrc = " << SiTOBLowSrc_.label() << ":" << SiTOBLowSrc_.instance() << "\n"
119  << " SiTOBHighSrc = " << SiTOBHighSrc_.label() << ":" << SiTOBHighSrc_.instance() << "\n"
120  << " SiTIDLowSrc = " << SiTIDLowSrc_.label() << ":" << SiTIDLowSrc_.instance() << "\n"
121  << " SiTIDHighSrc = " << SiTIDHighSrc_.label() << ":" << SiTIDHighSrc_.instance() << "\n"
122  << " SiTECLowSrc = " << SiTECLowSrc_.label() << ":" << SiTECLowSrc_.instance() << "\n"
123  << " SiTECHighSrc = " << SiTECHighSrc_.label() << ":" << SiTECHighSrc_.instance() << "\n"
124  << " MuonCscSrc = " << MuonCscSrc_.label() << ":" << MuonCscSrc_.instance() << "\n"
125  << " MuonDtSrc = " << MuonDtSrc_.label() << ":" << MuonDtSrc_.instance() << "\n"
126  << " MuonRpcSrc = " << MuonRpcSrc_.label() << ":" << MuonRpcSrc_.instance() << "\n"
127  << " ECalEBSrc = " << ECalEBSrc_.label() << ":" << ECalEBSrc_.instance() << "\n"
128  << " ECalEESrc = " << ECalEESrc_.label() << ":" << ECalEESrc_.instance() << "\n"
129  << " ECalESSrc = " << ECalESSrc_.label() << ":" << ECalESSrc_.instance() << "\n"
130  << " HCalSrc = " << HCalSrc_.label() << ":" << HCalSrc_.instance() << "\n"
131  << "===============================\n";
132  }
133 
134  // migrated here from beginJob
135  clear();
136 }
137 
139 
140 void GlobalHitsProducer::beginJob(void) { return; }
141 
143  std::string MsgLoggerCat = "GlobalHitsProducer_endJob";
144  if (verbosity >= 0)
145  edm::LogInfo(MsgLoggerCat) << "Terminating having processed " << count << " events.";
146  return;
147 }
148 
150  std::string MsgLoggerCat = "GlobalHitsProducer_produce";
151 
152  // keep track of number of events processed
153  ++count;
154 
155  // get event id information
156  edm::RunNumber_t nrun = iEvent.id().run();
157  edm::EventNumber_t nevt = iEvent.id().event();
158 
159  if (verbosity > 0) {
160  edm::LogInfo(MsgLoggerCat) << "Processing run " << nrun << ", event " << nevt << " (" << count << " events total)";
161  } else if (verbosity == 0) {
162  if (nevt % frequency == 0 || nevt == 1) {
163  edm::LogInfo(MsgLoggerCat) << "Processing run " << nrun << ", event " << nevt << " (" << count
164  << " events total)";
165  }
166  }
167 
168  // clear event holders
169  clear();
170 
171  // look at information available in the event
172  if (getAllProvenances) {
173  std::vector<const edm::StableProvenance *> AllProv;
174  iEvent.getAllStableProvenance(AllProv);
175 
176  if (verbosity >= 0)
177  edm::LogInfo(MsgLoggerCat) << "Number of Provenances = " << AllProv.size();
178 
179  if (printProvenanceInfo && (verbosity >= 0)) {
180  TString eventout("\nProvenance info:\n");
181 
182  for (unsigned int i = 0; i < AllProv.size(); ++i) {
183  eventout += "\n ******************************";
184  eventout += "\n Module : ";
185  eventout += AllProv[i]->moduleLabel();
186  eventout += "\n ProductID : ";
187  eventout += AllProv[i]->productID().id();
188  eventout += "\n ClassName : ";
189  eventout += AllProv[i]->className();
190  eventout += "\n InstanceName : ";
191  eventout += AllProv[i]->productInstanceName();
192  eventout += "\n BranchName : ";
193  eventout += AllProv[i]->branchName();
194  }
195  eventout += "\n ******************************\n";
196  edm::LogInfo(MsgLoggerCat) << eventout << "\n";
197  printProvenanceInfo = false;
198  }
199  getAllProvenances = false;
200  }
201 
202  // call fill functions
203  // gather G4MC information from event
204  fillG4MC(iEvent);
205  // gather Tracker information from event
206  fillTrk(iEvent, iSetup);
207  // gather muon information from event
208  fillMuon(iEvent, iSetup);
209  // gather Ecal information from event
210  fillECal(iEvent, iSetup);
211  // gather Hcal information from event
212  fillHCal(iEvent, iSetup);
213 
214  if (verbosity > 0)
215  edm::LogInfo(MsgLoggerCat) << "Done gathering data from event.";
216 
217  // produce object to put into event
218  std::unique_ptr<PGlobalSimHit> pOut(new PGlobalSimHit);
219 
220  if (verbosity > 2)
221  edm::LogInfo(MsgLoggerCat) << "Saving event contents:";
222 
223  // call store functions
224  // store G4MC information in product
225  storeG4MC(*pOut);
226  // store Tracker information in produce
227  storeTrk(*pOut);
228  // store Muon information in produce
229  storeMuon(*pOut);
230  // store ECal information in produce
231  storeECal(*pOut);
232  // store HCal information in produce
233  storeHCal(*pOut);
234 
235  // store information in event
236  iEvent.put(std::move(pOut), label);
237 
238  return;
239 }
240 
241 //==================fill and store functions================================
243  std::string MsgLoggerCat = "GlobalHitsProducer_fillG4MC";
244 
245  TString eventout;
246  if (verbosity > 0)
247  eventout = "\nGathering info:";
248 
250  // get MC information
253  std::vector<edm::Handle<edm::HepMCProduct>> AllHepMCEvt;
254 
255  //iEvent.getManyByType(AllHepMCEvt);
256  throw cms::Exception("UnsupportedFunction") << "GlobalHitsProducer::fillG4MC: "
257  << "getManyByType has not been supported by the Framework since 2015. "
258  << "This module has been broken since then. Maybe it should be deleted. "
259  << "Another possibility is to upgrade to use GetterOfProducts instead.";
260 
261  // loop through products and extract VtxSmearing if available. Any of them
262  // should have the information needed
263  for (unsigned int i = 0; i < AllHepMCEvt.size(); ++i) {
264  HepMCEvt = AllHepMCEvt[i];
265  if ((HepMCEvt.provenance()->branchDescription()).moduleLabel() == "generatorSmeared")
266  break;
267  }
268 
269  if (!HepMCEvt.isValid()) {
270  edm::LogWarning(MsgLoggerCat) << "Unable to find HepMCProduct in event!";
271  return;
272  } else {
273  eventout += "\n Using HepMCProduct: ";
274  eventout += (HepMCEvt.provenance()->branchDescription()).moduleLabel();
275  }
276  const HepMC::GenEvent *MCEvt = HepMCEvt->GetEvent();
277  nRawGenPart = MCEvt->particles_size();
278 
279  if (verbosity > 1) {
280  eventout += "\n Number of Raw Particles collected:......... ";
281  eventout += nRawGenPart;
282  }
283 
285  // get G4Vertex information
287  // convert unit stored in SimVertex to mm
288  float unit = 0.;
289  if (vtxunit == 0)
290  unit = 1.; // already in mm
291  if (vtxunit == 1)
292  unit = 10.; // stored in cm, convert to mm
293 
295  iEvent.getByToken(G4VtxSrc_Token_, G4VtxContainer);
296  if (!G4VtxContainer.isValid()) {
297  edm::LogWarning(MsgLoggerCat) << "Unable to find SimVertex in event!";
298  return;
299  }
300  int i = 0;
301  edm::SimVertexContainer::const_iterator itVtx;
302  for (itVtx = G4VtxContainer->begin(); itVtx != G4VtxContainer->end(); ++itVtx) {
303  ++i;
304 
305  const math::XYZTLorentzVector G4Vtx1(
306  itVtx->position().x(), itVtx->position().y(), itVtx->position().z(), itVtx->position().e());
307  double G4Vtx[4];
308  G4Vtx1.GetCoordinates(G4Vtx);
309 
310  G4VtxX.push_back((G4Vtx[0] * unit) / micrometer);
311  G4VtxY.push_back((G4Vtx[1] * unit) / micrometer);
312  G4VtxZ.push_back((G4Vtx[2] * unit) / millimeter);
313  }
314 
315  if (verbosity > 1) {
316  eventout += "\n Number of G4Vertices collected:............ ";
317  eventout += i;
318  }
319 
321  // get G4Track information
324  iEvent.getByToken(G4TrkSrc_Token_, G4TrkContainer);
325 
326  if (!G4TrkContainer.isValid()) {
327  edm::LogWarning(MsgLoggerCat) << "Unable to find SimTrack in event!";
328  return;
329  }
330  i = 0;
331  edm::SimTrackContainer::const_iterator itTrk;
332  for (itTrk = G4TrkContainer->begin(); itTrk != G4TrkContainer->end(); ++itTrk) {
333  ++i;
334 
335  const math::XYZTLorentzVector G4Trk1(
336  itTrk->momentum().x(), itTrk->momentum().y(), itTrk->momentum().z(), itTrk->momentum().e());
337  double G4Trk[4];
338  G4Trk1.GetCoordinates(G4Trk);
339 
340  G4TrkPt.push_back(sqrt(G4Trk[0] * G4Trk[0] + G4Trk[1] * G4Trk[1])); // GeV
341  G4TrkE.push_back(G4Trk[3]); // GeV
342  }
343 
344  if (verbosity > 1) {
345  eventout += "\n Number of G4Tracks collected:.............. ";
346  eventout += i;
347  }
348 
349  if (verbosity > 0)
350  edm::LogInfo(MsgLoggerCat) << eventout << "\n";
351 
352  return;
353 }
354 
356  std::string MsgLoggerCat = "GlobalHitsProducer_storeG4MC";
357 
358  if (verbosity > 2) {
359  TString eventout("\n nRawGenPart = ");
360  eventout += nRawGenPart;
361  eventout += "\n nG4Vtx = ";
362  eventout += G4VtxX.size();
363  for (unsigned int i = 0; i < G4VtxX.size(); ++i) {
364  eventout += "\n (x,y,z) = (";
365  eventout += G4VtxX[i];
366  eventout += ", ";
367  eventout += G4VtxY[i];
368  eventout += ", ";
369  eventout += G4VtxZ[i];
370  eventout += ")";
371  }
372  eventout += "\n nG4Trk = ";
373  eventout += G4TrkPt.size();
374  for (unsigned int i = 0; i < G4TrkPt.size(); ++i) {
375  eventout += "\n (pt,e) = (";
376  eventout += G4TrkPt[i];
377  eventout += ", ";
378  eventout += G4TrkE[i];
379  eventout += ")";
380  }
381  edm::LogInfo(MsgLoggerCat) << eventout << "\n";
382  } // end verbose output
383 
384  product.putRawGenPart(nRawGenPart);
385  product.putG4Vtx(G4VtxX, G4VtxY, G4VtxZ);
386  product.putG4Trk(G4TrkPt, G4TrkE);
387 
388  return;
389 }
390 
392  std::string MsgLoggerCat = "GlobalHitsProducer_fillTrk";
393 
394  TString eventout;
395  if (verbosity > 0)
396  eventout = "\nGathering info:";
397 
398  // access the tracker geometry
399  const auto &theTrackerGeometry = iSetup.getHandle(tGeomToken_);
400  if (!theTrackerGeometry.isValid()) {
401  edm::LogWarning(MsgLoggerCat) << "Unable to find TrackerDigiGeometryRecord in event!";
402  return;
403  }
404  const TrackerGeometry &theTracker(*theTrackerGeometry);
405 
406  // iterator to access containers
407  edm::PSimHitContainer::const_iterator itHit;
408 
410  // get Pixel Barrel information
412  edm::PSimHitContainer thePxlBrlHits;
413  // extract low container
414  edm::Handle<edm::PSimHitContainer> PxlBrlLowContainer;
415  iEvent.getByToken(PxlBrlLowSrc_Token_, PxlBrlLowContainer);
416  if (!PxlBrlLowContainer.isValid()) {
417  edm::LogWarning(MsgLoggerCat) << "Unable to find TrackerHitsPixelBarrelLowTof in event!";
418  return;
419  }
420  // extract high container
421  edm::Handle<edm::PSimHitContainer> PxlBrlHighContainer;
422  iEvent.getByToken(PxlBrlHighSrc_Token_, PxlBrlHighContainer);
423  if (!PxlBrlHighContainer.isValid()) {
424  edm::LogWarning(MsgLoggerCat) << "Unable to find TrackerHitsPixelBarrelHighTof in event!";
425  return;
426  }
427  // place both containers into new container
428  thePxlBrlHits.insert(thePxlBrlHits.end(), PxlBrlLowContainer->begin(), PxlBrlLowContainer->end());
429  thePxlBrlHits.insert(thePxlBrlHits.end(), PxlBrlHighContainer->begin(), PxlBrlHighContainer->end());
430 
431  // cycle through new container
432  int i = 0, j = 0;
433  for (itHit = thePxlBrlHits.begin(); itHit != thePxlBrlHits.end(); ++itHit) {
434  ++i;
435 
436  // create a DetId from the detUnitId
437  DetId theDetUnitId(itHit->detUnitId());
438  int detector = theDetUnitId.det();
439  int subdetector = theDetUnitId.subdetId();
440 
441  // check that expected detector is returned
442  if ((detector == dTrk) && (subdetector == sdPxlBrl)) {
443  // get the GeomDetUnit from the geometry using theDetUnitID
444  const GeomDetUnit *theDet = theTracker.idToDetUnit(theDetUnitId);
445 
446  if (!theDet) {
447  edm::LogWarning(MsgLoggerCat) << "Unable to get GeomDetUnit from PxlBrlHits for Hit " << i;
448  continue;
449  }
450 
451  ++j;
452 
453  // get the Surface of the hit (knows how to go from local <-> global)
454  const BoundPlane &bSurface = theDet->surface();
455 
456  // gather necessary information
457  PxlBrlToF.push_back(itHit->tof());
458  PxlBrlR.push_back(bSurface.toGlobal(itHit->localPosition()).perp());
459  PxlBrlPhi.push_back(bSurface.toGlobal(itHit->localPosition()).phi());
460  PxlBrlEta.push_back(bSurface.toGlobal(itHit->localPosition()).eta());
461 
462  } else {
463  edm::LogWarning(MsgLoggerCat) << "PxlBrl PSimHit " << i << " is expected to be (det,subdet) = (" << dTrk << ","
464  << sdPxlBrl << "); value returned is: (" << detector << "," << subdetector << ")";
465  continue;
466  } // end detector type check
467  } // end loop through PxlBrl Hits
468 
469  if (verbosity > 1) {
470  eventout += "\n Number of Pixel Barrel Hits collected:..... ";
471  eventout += j;
472  }
473 
475  // get Pixel Forward information
477  edm::PSimHitContainer thePxlFwdHits;
478  // extract low container
479  edm::Handle<edm::PSimHitContainer> PxlFwdLowContainer;
480  iEvent.getByToken(PxlFwdLowSrc_Token_, PxlFwdLowContainer);
481  if (!PxlFwdLowContainer.isValid()) {
482  edm::LogWarning(MsgLoggerCat) << "Unable to find TrackerHitsPixelEndcapLowTof in event!";
483  return;
484  }
485  // extract high container
486  edm::Handle<edm::PSimHitContainer> PxlFwdHighContainer;
487  iEvent.getByToken(PxlFwdHighSrc_Token_, PxlFwdHighContainer);
488  if (!PxlFwdHighContainer.isValid()) {
489  edm::LogWarning("GlobalHitsProducer_fillTrk") << "Unable to find TrackerHitsPixelEndcapHighTof in event!";
490  return;
491  }
492  // place both containers into new container
493  thePxlFwdHits.insert(thePxlFwdHits.end(), PxlFwdLowContainer->begin(), PxlFwdLowContainer->end());
494  thePxlFwdHits.insert(thePxlFwdHits.end(), PxlFwdHighContainer->begin(), PxlFwdHighContainer->end());
495 
496  // cycle through new container
497  i = 0;
498  j = 0;
499  for (itHit = thePxlFwdHits.begin(); itHit != thePxlFwdHits.end(); ++itHit) {
500  ++i;
501 
502  // create a DetId from the detUnitId
503  DetId theDetUnitId(itHit->detUnitId());
504  int detector = theDetUnitId.det();
505  int subdetector = theDetUnitId.subdetId();
506 
507  // check that expected detector is returned
508  if ((detector == dTrk) && (subdetector == sdPxlFwd)) {
509  // get the GeomDetUnit from the geometry using theDetUnitID
510  const GeomDetUnit *theDet = theTracker.idToDetUnit(theDetUnitId);
511 
512  if (!theDet) {
513  edm::LogWarning(MsgLoggerCat) << "Unable to get GeomDetUnit from PxlFwdHits for Hit " << i;
514  ;
515  continue;
516  }
517 
518  ++j;
519 
520  // get the Surface of the hit (knows how to go from local <-> global)
521  const BoundPlane &bSurface = theDet->surface();
522 
523  // gather necessary information
524  PxlFwdToF.push_back(itHit->tof());
525  PxlFwdZ.push_back(bSurface.toGlobal(itHit->localPosition()).z());
526  PxlFwdPhi.push_back(bSurface.toGlobal(itHit->localPosition()).phi());
527  PxlFwdEta.push_back(bSurface.toGlobal(itHit->localPosition()).eta());
528  } else {
529  edm::LogWarning(MsgLoggerCat) << "PxlFwd PSimHit " << i << " is expected to be (det,subdet) = (" << dTrk << ","
530  << sdPxlFwd << "); value returned is: (" << detector << "," << subdetector << ")";
531  continue;
532  } // end detector type check
533  } // end loop through PxlFwd Hits
534 
535  if (verbosity > 1) {
536  eventout += "\n Number of Pixel Forward Hits collected:.... ";
537  eventout += j;
538  }
539 
541  // get Silicon Barrel information
543  edm::PSimHitContainer theSiBrlHits;
544  // extract TIB low container
545  edm::Handle<edm::PSimHitContainer> SiTIBLowContainer;
546  iEvent.getByToken(SiTIBLowSrc_Token_, SiTIBLowContainer);
547  if (!SiTIBLowContainer.isValid()) {
548  edm::LogWarning(MsgLoggerCat) << "Unable to find TrackerHitsTIBLowTof in event!";
549  return;
550  }
551  // extract TIB high container
552  edm::Handle<edm::PSimHitContainer> SiTIBHighContainer;
553  iEvent.getByToken(SiTIBHighSrc_Token_, SiTIBHighContainer);
554  if (!SiTIBHighContainer.isValid()) {
555  edm::LogWarning(MsgLoggerCat) << "Unable to find TrackerHitsTIBHighTof in event!";
556  return;
557  }
558  // extract TOB low container
559  edm::Handle<edm::PSimHitContainer> SiTOBLowContainer;
560  iEvent.getByToken(SiTOBLowSrc_Token_, SiTOBLowContainer);
561  if (!SiTOBLowContainer.isValid()) {
562  edm::LogWarning(MsgLoggerCat) << "Unable to find TrackerHitsTOBLowTof in event!";
563  return;
564  }
565  // extract TOB high container
566  edm::Handle<edm::PSimHitContainer> SiTOBHighContainer;
567  iEvent.getByToken(SiTOBHighSrc_Token_, SiTOBHighContainer);
568  if (!SiTOBHighContainer.isValid()) {
569  edm::LogWarning(MsgLoggerCat) << "Unable to find TrackerHitsTOBHighTof in event!";
570  return;
571  }
572  // place all containers into new container
573  theSiBrlHits.insert(theSiBrlHits.end(), SiTIBLowContainer->begin(), SiTIBLowContainer->end());
574  theSiBrlHits.insert(theSiBrlHits.end(), SiTIBHighContainer->begin(), SiTIBHighContainer->end());
575  theSiBrlHits.insert(theSiBrlHits.end(), SiTOBLowContainer->begin(), SiTOBLowContainer->end());
576  theSiBrlHits.insert(theSiBrlHits.end(), SiTOBHighContainer->begin(), SiTOBHighContainer->end());
577 
578  // cycle through new container
579  i = 0;
580  j = 0;
581  for (itHit = theSiBrlHits.begin(); itHit != theSiBrlHits.end(); ++itHit) {
582  ++i;
583 
584  // create a DetId from the detUnitId
585  DetId theDetUnitId(itHit->detUnitId());
586  int detector = theDetUnitId.det();
587  int subdetector = theDetUnitId.subdetId();
588 
589  // check that expected detector is returned
590  if ((detector == dTrk) && ((subdetector == sdSiTIB) || (subdetector == sdSiTOB))) {
591  // get the GeomDetUnit from the geometry using theDetUnitID
592  const GeomDetUnit *theDet = theTracker.idToDetUnit(theDetUnitId);
593 
594  if (!theDet) {
595  edm::LogWarning(MsgLoggerCat) << "Unable to get GeomDetUnit from SiBrlHits for Hit " << i;
596  continue;
597  }
598 
599  ++j;
600 
601  // get the Surface of the hit (knows how to go from local <-> global)
602  const BoundPlane &bSurface = theDet->surface();
603 
604  // gather necessary information
605  SiBrlToF.push_back(itHit->tof());
606  SiBrlR.push_back(bSurface.toGlobal(itHit->localPosition()).perp());
607  SiBrlPhi.push_back(bSurface.toGlobal(itHit->localPosition()).phi());
608  SiBrlEta.push_back(bSurface.toGlobal(itHit->localPosition()).eta());
609  } else {
610  edm::LogWarning(MsgLoggerCat) << "SiBrl PSimHit " << i << " is expected to be (det,subdet) = (" << dTrk << ","
611  << sdSiTIB << " || " << sdSiTOB << "); value returned is: (" << detector << ","
612  << subdetector << ")";
613  continue;
614  } // end detector type check
615  } // end loop through SiBrl Hits
616 
617  if (verbosity > 1) {
618  eventout += "\n Number of Silicon Barrel Hits collected:... ";
619  eventout += j;
620  }
621 
623  // get Silicon Forward information
625  edm::PSimHitContainer theSiFwdHits;
626  // extract TID low container
627  edm::Handle<edm::PSimHitContainer> SiTIDLowContainer;
628  iEvent.getByToken(SiTIDLowSrc_Token_, SiTIDLowContainer);
629  if (!SiTIDLowContainer.isValid()) {
630  edm::LogWarning(MsgLoggerCat) << "Unable to find TrackerHitsTIDLowTof in event!";
631  return;
632  }
633  // extract TID high container
634  edm::Handle<edm::PSimHitContainer> SiTIDHighContainer;
635  iEvent.getByToken(SiTIDHighSrc_Token_, SiTIDHighContainer);
636  if (!SiTIDHighContainer.isValid()) {
637  edm::LogWarning("GlobalHitsProducer_fillTrk") << "Unable to find TrackerHitsTIDHighTof in event!";
638  return;
639  }
640  // extract TEC low container
641  edm::Handle<edm::PSimHitContainer> SiTECLowContainer;
642  iEvent.getByToken(SiTECLowSrc_Token_, SiTECLowContainer);
643  if (!SiTECLowContainer.isValid()) {
644  edm::LogWarning(MsgLoggerCat) << "Unable to find TrackerHitsTECLowTof in event!";
645  return;
646  }
647  // extract TEC high container
648  edm::Handle<edm::PSimHitContainer> SiTECHighContainer;
649  iEvent.getByToken(SiTECHighSrc_Token_, SiTECHighContainer);
650  if (!SiTECHighContainer.isValid()) {
651  edm::LogWarning(MsgLoggerCat) << "Unable to find TrackerHitsTECHighTof in event!";
652  return;
653  }
654  // place all containers into new container
655  theSiFwdHits.insert(theSiFwdHits.end(), SiTIDLowContainer->begin(), SiTIDLowContainer->end());
656  theSiFwdHits.insert(theSiFwdHits.end(), SiTIDHighContainer->begin(), SiTIDHighContainer->end());
657  theSiFwdHits.insert(theSiFwdHits.end(), SiTECLowContainer->begin(), SiTECLowContainer->end());
658  theSiFwdHits.insert(theSiFwdHits.end(), SiTECHighContainer->begin(), SiTECHighContainer->end());
659 
660  // cycle through container
661  i = 0;
662  j = 0;
663  for (itHit = theSiFwdHits.begin(); itHit != theSiFwdHits.end(); ++itHit) {
664  ++i;
665 
666  // create a DetId from the detUnitId
667  DetId theDetUnitId(itHit->detUnitId());
668  int detector = theDetUnitId.det();
669  int subdetector = theDetUnitId.subdetId();
670 
671  // check that expected detector is returned
672  if ((detector == dTrk) && ((subdetector == sdSiTID) || (subdetector == sdSiTEC))) {
673  // get the GeomDetUnit from the geometry using theDetUnitID
674  const GeomDetUnit *theDet = theTracker.idToDetUnit(theDetUnitId);
675 
676  if (!theDet) {
677  edm::LogWarning(MsgLoggerCat) << "Unable to get GeomDetUnit from SiFwdHits Hit " << i;
678  return;
679  }
680 
681  ++j;
682 
683  // get the Surface of the hit (knows how to go from local <-> global)
684  const BoundPlane &bSurface = theDet->surface();
685 
686  // gather necessary information
687  SiFwdToF.push_back(itHit->tof());
688  SiFwdZ.push_back(bSurface.toGlobal(itHit->localPosition()).z());
689  SiFwdPhi.push_back(bSurface.toGlobal(itHit->localPosition()).phi());
690  SiFwdEta.push_back(bSurface.toGlobal(itHit->localPosition()).eta());
691  } else {
692  edm::LogWarning(MsgLoggerCat) << "SiFwd PSimHit " << i << " is expected to be (det,subdet) = (" << dTrk << ","
693  << sdSiTOB << " || " << sdSiTEC << "); value returned is: (" << detector << ","
694  << subdetector << ")";
695  continue;
696  } // end check detector type
697  } // end loop through SiFwd Hits
698 
699  if (verbosity > 1) {
700  eventout += "\n Number of Silicon Forward Hits collected:.. ";
701  eventout += j;
702  }
703 
704  if (verbosity > 0)
705  edm::LogInfo(MsgLoggerCat) << eventout << "\n";
706 
707  return;
708 }
709 
711  std::string MsgLoggerCat = "GlobalHitsProducer_storeTrk";
712 
713  if (verbosity > 2) {
714  TString eventout("\n nPxlBrlHits = ");
715  eventout += PxlBrlToF.size();
716  for (unsigned int i = 0; i < PxlBrlToF.size(); ++i) {
717  eventout += "\n (tof,r,phi,eta) = (";
718  eventout += PxlBrlToF[i];
719  eventout += ", ";
720  eventout += PxlBrlR[i];
721  eventout += ", ";
722  eventout += PxlBrlPhi[i];
723  eventout += ", ";
724  eventout += PxlBrlEta[i];
725  eventout += ")";
726  } // end PxlBrl output
727  eventout += "\n nPxlFwdHits = ";
728  eventout += PxlFwdToF.size();
729  for (unsigned int i = 0; i < PxlFwdToF.size(); ++i) {
730  eventout += "\n (tof,z,phi,eta) = (";
731  eventout += PxlFwdToF[i];
732  eventout += ", ";
733  eventout += PxlFwdZ[i];
734  eventout += ", ";
735  eventout += PxlFwdPhi[i];
736  eventout += ", ";
737  eventout += PxlFwdEta[i];
738  eventout += ")";
739  } // end PxlFwd output
740  eventout += "\n nSiBrlHits = ";
741  eventout += SiBrlToF.size();
742  for (unsigned int i = 0; i < SiBrlToF.size(); ++i) {
743  eventout += "\n (tof,r,phi,eta) = (";
744  eventout += SiBrlToF[i];
745  eventout += ", ";
746  eventout += SiBrlR[i];
747  eventout += ", ";
748  eventout += SiBrlPhi[i];
749  eventout += ", ";
750  eventout += SiBrlEta[i];
751  eventout += ")";
752  } // end SiBrl output
753  eventout += "\n nSiFwdHits = ";
754  eventout += SiFwdToF.size();
755  for (unsigned int i = 0; i < SiFwdToF.size(); ++i) {
756  eventout += "\n (tof,z,phi,eta) = (";
757  eventout += SiFwdToF[i];
758  eventout += ", ";
759  eventout += SiFwdZ[i];
760  eventout += ", ";
761  eventout += SiFwdPhi[i];
762  eventout += ", ";
763  eventout += SiFwdEta[i];
764  eventout += ")";
765  } // end SiFwd output
766  edm::LogInfo(MsgLoggerCat) << eventout << "\n";
767  } // end verbose output
768 
773 
774  return;
775 }
776 
778  std::string MsgLoggerCat = "GlobalHitsProducer_fillMuon";
779 
780  TString eventout;
781  if (verbosity > 0)
782  eventout = "\nGathering info:";
783 
784  // iterator to access containers
785  edm::PSimHitContainer::const_iterator itHit;
786 
787  // int i = 0, j = 0;
789  // access the CSC Muon
791  // access the CSC Muon geometry
792  const auto &theCSCGeometry = iSetup.getHandle(cscGeomToken_);
793  if (!theCSCGeometry.isValid()) {
794  edm::LogWarning(MsgLoggerCat) << "Unable to find MuonGeometryRecord for the CSCGeometry in event!";
795  return;
796  }
797  const CSCGeometry &theCSCMuon(*theCSCGeometry);
798 
799  // get Muon CSC information
800  edm::Handle<edm::PSimHitContainer> MuonCSCContainer;
801  iEvent.getByToken(MuonCscSrc_Token_, MuonCSCContainer);
802  if (!MuonCSCContainer.isValid()) {
803  edm::LogWarning(MsgLoggerCat) << "Unable to find MuonCSCHits in event!";
804  return;
805  }
806 
807  // cycle through container
808  int i = 0, j = 0;
809  for (itHit = MuonCSCContainer->begin(); itHit != MuonCSCContainer->end(); ++itHit) {
810  ++i;
811 
812  // create a DetId from the detUnitId
813  DetId theDetUnitId(itHit->detUnitId());
814  int detector = theDetUnitId.det();
815  int subdetector = theDetUnitId.subdetId();
816 
817  // check that expected detector is returned
818  if ((detector == dMuon) && (subdetector == sdMuonCSC)) {
819  // get the GeomDetUnit from the geometry using theDetUnitID
820  const GeomDetUnit *theDet = theCSCMuon.idToDetUnit(theDetUnitId);
821 
822  if (!theDet) {
823  edm::LogWarning(MsgLoggerCat) << "Unable to get GeomDetUnit from theCSCMuon for hit " << i;
824  continue;
825  }
826 
827  ++j;
828 
829  // get the Surface of the hit (knows how to go from local <-> global)
830  const BoundPlane &bSurface = theDet->surface();
831 
832  // gather necessary information
833  MuonCscToF.push_back(itHit->tof());
834  MuonCscZ.push_back(bSurface.toGlobal(itHit->localPosition()).z());
835  MuonCscPhi.push_back(bSurface.toGlobal(itHit->localPosition()).phi());
836  MuonCscEta.push_back(bSurface.toGlobal(itHit->localPosition()).eta());
837  } else {
838  edm::LogWarning(MsgLoggerCat) << "MuonCsc PSimHit " << i << " is expected to be (det,subdet) = (" << dMuon << ","
839  << sdMuonCSC << "); value returned is: (" << detector << "," << subdetector << ")";
840  continue;
841  } // end detector type check
842  } // end loop through CSC Hits
843 
844  if (verbosity > 1) {
845  eventout += "\n Number of CSC muon Hits collected:......... ";
846  eventout += j;
847  }
848 
849  // i = 0, j = 0;
851  // access the DT Muon
853  // access the DT Muon geometry
854  const auto &theDTGeometry = iSetup.getHandle(dtGeomToken_);
855  if (!theDTGeometry.isValid()) {
856  edm::LogWarning(MsgLoggerCat) << "Unable to find MuonGeometryRecord for the DTGeometry in event!";
857  return;
858  }
859  const DTGeometry &theDTMuon(*theDTGeometry);
860 
861  // get Muon DT information
862  edm::Handle<edm::PSimHitContainer> MuonDtContainer;
863  iEvent.getByToken(MuonDtSrc_Token_, MuonDtContainer);
864  if (!MuonDtContainer.isValid()) {
865  edm::LogWarning(MsgLoggerCat) << "Unable to find MuonDTHits in event!";
866  return;
867  }
868 
869  // cycle through container
870  i = 0, j = 0;
871  for (itHit = MuonDtContainer->begin(); itHit != MuonDtContainer->end(); ++itHit) {
872  ++i;
873 
874  // create a DetId from the detUnitId
875  DetId theDetUnitId(itHit->detUnitId());
876  int detector = theDetUnitId.det();
877  int subdetector = theDetUnitId.subdetId();
878 
879  // check that expected detector is returned
880  if ((detector == dMuon) && (subdetector == sdMuonDT)) {
881  // CSC uses wires and layers rather than the full detID
882  // get the wireId
883  DTWireId wireId(itHit->detUnitId());
884 
885  // get the DTLayer from the geometry using the wireID
886  const DTLayer *theDet = theDTMuon.layer(wireId.layerId());
887 
888  if (!theDet) {
889  edm::LogWarning(MsgLoggerCat) << "Unable to get GeomDetUnit from theDtMuon for hit " << i;
890  continue;
891  }
892 
893  ++j;
894 
895  // get the Surface of the hit (knows how to go from local <-> global)
896  const BoundPlane &bSurface = theDet->surface();
897 
898  // gather necessary information
899  MuonDtToF.push_back(itHit->tof());
900  MuonDtR.push_back(bSurface.toGlobal(itHit->localPosition()).perp());
901  MuonDtPhi.push_back(bSurface.toGlobal(itHit->localPosition()).phi());
902  MuonDtEta.push_back(bSurface.toGlobal(itHit->localPosition()).eta());
903  } else {
904  edm::LogWarning(MsgLoggerCat) << "MuonDt PSimHit " << i << " is expected to be (det,subdet) = (" << dMuon << ","
905  << sdMuonDT << "); value returned is: (" << detector << "," << subdetector << ")";
906  continue;
907  } // end detector type check
908  } // end loop through DT Hits
909 
910  if (verbosity > 1) {
911  eventout += "\n Number of DT muon Hits collected:.......... ";
912  eventout += j;
913  }
914 
915  // i = 0, j = 0;
916  // int RPCBrl = 0, RPCFwd = 0;
918  // access the RPC Muon
920  // access the RPC Muon geometry
921  const auto &theRPCGeometry = iSetup.getHandle(rpcGeomToken_);
922  if (!theRPCGeometry.isValid()) {
923  edm::LogWarning(MsgLoggerCat) << "Unable to find MuonGeometryRecord for the RPCGeometry in event!";
924  return;
925  }
926  const RPCGeometry &theRPCMuon(*theRPCGeometry);
927 
928  // get Muon RPC information
929  edm::Handle<edm::PSimHitContainer> MuonRPCContainer;
930  iEvent.getByToken(MuonRpcSrc_Token_, MuonRPCContainer);
931  if (!MuonRPCContainer.isValid()) {
932  edm::LogWarning(MsgLoggerCat) << "Unable to find MuonRPCHits in event!";
933  return;
934  }
935 
936  // cycle through container
937  i = 0, j = 0;
938  int RPCBrl = 0, RPCFwd = 0;
939  for (itHit = MuonRPCContainer->begin(); itHit != MuonRPCContainer->end(); ++itHit) {
940  ++i;
941 
942  // create a DetID from the detUnitId
943  DetId theDetUnitId(itHit->detUnitId());
944  int detector = theDetUnitId.det();
945  int subdetector = theDetUnitId.subdetId();
946 
947  // check that expected detector is returned
948  if ((detector == dMuon) && (subdetector == sdMuonRPC)) {
949  // get an RPCDetID from the detUnitID
950  RPCDetId RPCId(itHit->detUnitId());
951 
952  // find the region of the RPC hit
953  int region = RPCId.region();
954 
955  // get the GeomDetUnit from the geometry using the RPCDetId
956  const GeomDetUnit *theDet = theRPCMuon.idToDetUnit(theDetUnitId);
957 
958  if (!theDet) {
959  edm::LogWarning(MsgLoggerCat) << "Unable to get GeomDetUnit from theRPCMuon for hit " << i;
960  continue;
961  }
962 
963  ++j;
964 
965  // get the Surface of the hit (knows how to go from local <-> global)
966  const BoundPlane &bSurface = theDet->surface();
967 
968  // gather necessary information
969  if ((region == sdMuonRPCRgnFwdp) || (region == sdMuonRPCRgnFwdn)) {
970  ++RPCFwd;
971 
972  MuonRpcFwdToF.push_back(itHit->tof());
973  MuonRpcFwdZ.push_back(bSurface.toGlobal(itHit->localPosition()).z());
974  MuonRpcFwdPhi.push_back(bSurface.toGlobal(itHit->localPosition()).phi());
975  MuonRpcFwdEta.push_back(bSurface.toGlobal(itHit->localPosition()).eta());
976  } else if (region == sdMuonRPCRgnBrl) {
977  ++RPCBrl;
978 
979  MuonRpcBrlToF.push_back(itHit->tof());
980  MuonRpcBrlR.push_back(bSurface.toGlobal(itHit->localPosition()).perp());
981  MuonRpcBrlPhi.push_back(bSurface.toGlobal(itHit->localPosition()).phi());
982  MuonRpcBrlEta.push_back(bSurface.toGlobal(itHit->localPosition()).eta());
983  } else {
984  edm::LogWarning(MsgLoggerCat) << "Invalid region for RPC Muon hit" << i;
985  continue;
986  } // end check of region
987  } else {
988  edm::LogWarning(MsgLoggerCat) << "MuonRpc PSimHit " << i << " is expected to be (det,subdet) = (" << dMuon << ","
989  << sdMuonRPC << "); value returned is: (" << detector << "," << subdetector << ")";
990  continue;
991  } // end detector type check
992  } // end loop through RPC Hits
993 
994  if (verbosity > 1) {
995  eventout += "\n Number of RPC muon Hits collected:......... ";
996  eventout += j;
997  eventout += "\n RPC Barrel muon Hits:............ ";
998  eventout += RPCBrl;
999  eventout += "\n RPC Forward muon Hits:........... ";
1000  eventout += RPCFwd;
1001  }
1002 
1003  if (verbosity > 0)
1004  edm::LogInfo(MsgLoggerCat) << eventout << "\n";
1005 
1006  return;
1007 }
1008 
1010  std::string MsgLoggerCat = "GlobalHitsProducer_storeMuon";
1011 
1012  if (verbosity > 2) {
1013  TString eventout("\n nMuonCSCHits = ");
1014  eventout += MuonCscToF.size();
1015  for (unsigned int i = 0; i < MuonCscToF.size(); ++i) {
1016  eventout += "\n (tof,z,phi,eta) = (";
1017  eventout += MuonCscToF[i];
1018  eventout += ", ";
1019  eventout += MuonCscZ[i];
1020  eventout += ", ";
1021  eventout += MuonCscPhi[i];
1022  eventout += ", ";
1023  eventout += MuonCscEta[i];
1024  eventout += ")";
1025  } // end MuonCsc output
1026  eventout += "\n nMuonDtHits = ";
1027  eventout += MuonDtToF.size();
1028  for (unsigned int i = 0; i < MuonDtToF.size(); ++i) {
1029  eventout += "\n (tof,r,phi,eta) = (";
1030  eventout += MuonDtToF[i];
1031  eventout += ", ";
1032  eventout += MuonDtR[i];
1033  eventout += ", ";
1034  eventout += MuonDtPhi[i];
1035  eventout += ", ";
1036  eventout += MuonDtEta[i];
1037  eventout += ")";
1038  } // end MuonDt output
1039  eventout += "\n nMuonRpcBrlHits = ";
1040  eventout += MuonRpcBrlToF.size();
1041  for (unsigned int i = 0; i < MuonRpcBrlToF.size(); ++i) {
1042  eventout += "\n (tof,r,phi,eta) = (";
1043  eventout += MuonRpcBrlToF[i];
1044  eventout += ", ";
1045  eventout += MuonRpcBrlR[i];
1046  eventout += ", ";
1047  eventout += MuonRpcBrlPhi[i];
1048  eventout += ", ";
1049  eventout += MuonRpcBrlEta[i];
1050  eventout += ")";
1051  } // end MuonRpcBrl output
1052  eventout += "\n nMuonRpcFwdHits = ";
1053  eventout += MuonRpcFwdToF.size();
1054  for (unsigned int i = 0; i < MuonRpcFwdToF.size(); ++i) {
1055  eventout += "\n (tof,z,phi,eta) = (";
1056  eventout += MuonRpcFwdToF[i];
1057  eventout += ", ";
1058  eventout += MuonRpcFwdZ[i];
1059  eventout += ", ";
1060  eventout += MuonRpcFwdPhi[i];
1061  eventout += ", ";
1062  eventout += MuonRpcFwdEta[i];
1063  eventout += ")";
1064  } // end MuonRpcFwd output
1065  edm::LogInfo(MsgLoggerCat) << eventout << "\n";
1066  } // end verbose output
1067 
1072 
1073  return;
1074 }
1075 
1077  std::string MsgLoggerCat = "GlobalHitsProducer_fillECal";
1078 
1079  TString eventout;
1080  if (verbosity > 0)
1081  eventout = "\nGathering info:";
1082 
1083  // access the calorimeter geometry
1084  const auto &theCaloGeometry = iSetup.getHandle(caloGeomToken_);
1085  if (!theCaloGeometry.isValid()) {
1086  edm::LogWarning(MsgLoggerCat) << "Unable to find CaloGeometryRecord in event!";
1087  return;
1088  }
1089  const CaloGeometry &theCalo(*theCaloGeometry);
1090 
1091  // iterator to access containers
1092  edm::PCaloHitContainer::const_iterator itHit;
1093 
1095  // get ECal information
1097  edm::PCaloHitContainer theECalHits;
1098  // extract EB container
1100  iEvent.getByToken(ECalEBSrc_Token_, EBContainer);
1101  if (!EBContainer.isValid()) {
1102  edm::LogWarning(MsgLoggerCat) << "Unable to find EcalHitsEB in event!";
1103  return;
1104  }
1105  // extract EE container
1107  iEvent.getByToken(ECalEESrc_Token_, EEContainer);
1108  if (!EEContainer.isValid()) {
1109  edm::LogWarning(MsgLoggerCat) << "Unable to find EcalHitsEE in event!";
1110  return;
1111  }
1112  // place both containers into new container
1113  theECalHits.insert(theECalHits.end(), EBContainer->begin(), EBContainer->end());
1114  theECalHits.insert(theECalHits.end(), EEContainer->begin(), EEContainer->end());
1115 
1116  // cycle through new container
1117  int i = 0, j = 0;
1118  for (itHit = theECalHits.begin(); itHit != theECalHits.end(); ++itHit) {
1119  ++i;
1120 
1121  // create a DetId from the detUnitId
1122  DetId theDetUnitId(itHit->id());
1123  int detector = theDetUnitId.det();
1124  int subdetector = theDetUnitId.subdetId();
1125 
1126  // check that expected detector is returned
1127  if ((detector == dEcal) && ((subdetector == sdEcalBrl) || (subdetector == sdEcalFwd))) {
1128  // get the Cell geometry
1129  auto theDet = (theCalo.getSubdetectorGeometry(theDetUnitId))->getGeometry(theDetUnitId);
1130 
1131  if (!theDet) {
1132  edm::LogWarning(MsgLoggerCat) << "Unable to get CaloCellGeometry from ECalHits for Hit " << i;
1133  continue;
1134  }
1135 
1136  ++j;
1137 
1138  // get the global position of the cell
1139  const GlobalPoint &globalposition = theDet->getPosition();
1140 
1141  // gather necessary information
1142  ECalE.push_back(itHit->energy());
1143  ECalToF.push_back(itHit->time());
1144  ECalPhi.push_back(globalposition.phi());
1145  ECalEta.push_back(globalposition.eta());
1146 
1147  } else {
1148  edm::LogWarning(MsgLoggerCat) << "ECal PCaloHit " << i << " is expected to be (det,subdet) = (" << dEcal << ","
1149  << sdEcalBrl << " || " << sdEcalFwd << "); value returned is: (" << detector << ","
1150  << subdetector << ")";
1151  continue;
1152  } // end detector type check
1153  } // end loop through ECal Hits
1154 
1155  if (verbosity > 1) {
1156  eventout += "\n Number of ECal Hits collected:............. ";
1157  eventout += j;
1158  }
1159 
1161  // Get Preshower information
1163  // extract PreShower container
1164  edm::Handle<edm::PCaloHitContainer> PreShContainer;
1165  iEvent.getByToken(ECalESSrc_Token_, PreShContainer);
1166  if (!PreShContainer.isValid()) {
1167  edm::LogWarning(MsgLoggerCat) << "Unable to find EcalHitsES in event!";
1168  return;
1169  }
1170 
1171  // cycle through container
1172  i = 0, j = 0;
1173  for (itHit = PreShContainer->begin(); itHit != PreShContainer->end(); ++itHit) {
1174  ++i;
1175 
1176  // create a DetId from the detUnitId
1177  DetId theDetUnitId(itHit->id());
1178  int detector = theDetUnitId.det();
1179  int subdetector = theDetUnitId.subdetId();
1180 
1181  // check that expected detector is returned
1182  if ((detector == dEcal) && (subdetector == sdEcalPS)) {
1183  // get the Cell geometry
1184  auto theDet = (theCalo.getSubdetectorGeometry(theDetUnitId))->getGeometry(theDetUnitId);
1185 
1186  if (!theDet) {
1187  edm::LogWarning(MsgLoggerCat) << "Unable to get CaloCellGeometry from PreShContainer for Hit " << i;
1188  continue;
1189  }
1190 
1191  ++j;
1192 
1193  // get the global position of the cell
1194  const GlobalPoint &globalposition = theDet->getPosition();
1195 
1196  // gather necessary information
1197  PreShE.push_back(itHit->energy());
1198  PreShToF.push_back(itHit->time());
1199  PreShPhi.push_back(globalposition.phi());
1200  PreShEta.push_back(globalposition.eta());
1201 
1202  } else {
1203  edm::LogWarning(MsgLoggerCat) << "PreSh PCaloHit " << i << " is expected to be (det,subdet) = (" << dEcal << ","
1204  << sdEcalPS << "); value returned is: (" << detector << "," << subdetector << ")";
1205  continue;
1206  } // end detector type check
1207  } // end loop through PreShower Hits
1208 
1209  if (verbosity > 1) {
1210  eventout += "\n Number of PreSh Hits collected:............ ";
1211  eventout += j;
1212  }
1213 
1214  if (verbosity > 0)
1215  edm::LogInfo(MsgLoggerCat) << eventout << "\n";
1216 
1217  return;
1218 }
1219 
1221  std::string MsgLoggerCat = "GlobalHitsProducer_storeECal";
1222 
1223  if (verbosity > 2) {
1224  TString eventout("\n nECalHits = ");
1225  eventout += ECalE.size();
1226  for (unsigned int i = 0; i < ECalE.size(); ++i) {
1227  eventout += "\n (e,tof,phi,eta) = (";
1228  eventout += ECalE[i];
1229  eventout += ", ";
1230  eventout += ECalToF[i];
1231  eventout += ", ";
1232  eventout += ECalPhi[i];
1233  eventout += ", ";
1234  eventout += ECalEta[i];
1235  eventout += ")";
1236  } // end ECal output
1237  eventout += "\n nPreShHits = ";
1238  eventout += PreShE.size();
1239  for (unsigned int i = 0; i < PreShE.size(); ++i) {
1240  eventout += "\n (e,tof,phi,eta) = (";
1241  eventout += PreShE[i];
1242  eventout += ", ";
1243  eventout += PreShToF[i];
1244  eventout += ", ";
1245  eventout += PreShPhi[i];
1246  eventout += ", ";
1247  eventout += PreShEta[i];
1248  eventout += ")";
1249  } // end PreShower output
1250  edm::LogInfo(MsgLoggerCat) << eventout << "\n";
1251  } // end verbose output
1252 
1253  product.putECalHits(ECalE, ECalToF, ECalPhi, ECalEta);
1255 
1256  return;
1257 }
1258 
1260  std::string MsgLoggerCat = "GlobalHitsProducer_fillHCal";
1261 
1262  TString eventout;
1263  if (verbosity > 0)
1264  eventout = "\nGathering info:";
1265 
1266  // access the calorimeter geometry
1267  const auto &theCaloGeometry = iSetup.getHandle(caloGeomToken_);
1268  if (!theCaloGeometry.isValid()) {
1269  edm::LogWarning(MsgLoggerCat) << "Unable to find CaloGeometryRecord in event!";
1270  return;
1271  }
1272  const CaloGeometry &theCalo(*theCaloGeometry);
1273 
1274  // iterator to access containers
1275  edm::PCaloHitContainer::const_iterator itHit;
1276 
1278  // get HCal information
1280  // extract HCal container
1282  iEvent.getByToken(HCalSrc_Token_, HCalContainer);
1283  if (!HCalContainer.isValid()) {
1284  edm::LogWarning(MsgLoggerCat) << "Unable to find HCalHits in event!";
1285  return;
1286  }
1287 
1288  // cycle through container
1289  int i = 0, j = 0;
1290  for (itHit = HCalContainer->begin(); itHit != HCalContainer->end(); ++itHit) {
1291  ++i;
1292 
1293  // create a DetId from the detUnitId
1294  DetId theDetUnitId(itHit->id());
1295  int detector = theDetUnitId.det();
1296  int subdetector = theDetUnitId.subdetId();
1297 
1298  // check that expected detector is returned
1299  if ((detector == dHcal) && ((subdetector == sdHcalBrl) || (subdetector == sdHcalEC) || (subdetector == sdHcalOut) ||
1300  (subdetector == sdHcalFwd))) {
1301  // get the Cell geometry
1302  const HcalGeometry *theDet = dynamic_cast<const HcalGeometry *>(theCalo.getSubdetectorGeometry(theDetUnitId));
1303 
1304  if (!theDet) {
1305  edm::LogWarning(MsgLoggerCat) << "Unable to get CaloCellGeometry from HCalContainer for Hit " << i;
1306  continue;
1307  }
1308 
1309  ++j;
1310 
1311  // get the global position of the cell
1312  const GlobalPoint &globalposition = theDet->getPosition(theDetUnitId);
1313 
1314  // gather necessary information
1315  HCalE.push_back(itHit->energy());
1316  HCalToF.push_back(itHit->time());
1317  HCalPhi.push_back(globalposition.phi());
1318  HCalEta.push_back(globalposition.eta());
1319 
1320  } else {
1321  edm::LogWarning(MsgLoggerCat) << "HCal PCaloHit " << i << " is expected to be (det,subdet) = (" << dHcal << ","
1322  << sdHcalBrl << " || " << sdHcalEC << " || " << sdHcalOut << " || " << sdHcalFwd
1323  << "); value returned is: (" << detector << "," << subdetector << ")";
1324  continue;
1325  } // end detector type check
1326  } // end loop through HCal Hits
1327 
1328  if (verbosity > 1) {
1329  eventout += "\n Number of HCal Hits collected:............. ";
1330  eventout += j;
1331  }
1332 
1333  if (verbosity > 0)
1334  edm::LogInfo(MsgLoggerCat) << eventout << "\n";
1335 
1336  return;
1337 }
1338 
1340  std::string MsgLoggerCat = "GlobalHitsProducer_storeHCal";
1341 
1342  if (verbosity > 2) {
1343  TString eventout("\n nHCalHits = ");
1344  eventout += HCalE.size();
1345  for (unsigned int i = 0; i < HCalE.size(); ++i) {
1346  eventout += "\n (e,tof,phi,eta) = (";
1347  eventout += HCalE[i];
1348  eventout += ", ";
1349  eventout += HCalToF[i];
1350  eventout += ", ";
1351  eventout += HCalPhi[i];
1352  eventout += ", ";
1353  eventout += HCalEta[i];
1354  eventout += ")";
1355  } // end HCal output
1356  edm::LogInfo(MsgLoggerCat) << eventout << "\n";
1357  } // end verbose output
1358 
1359  product.putHCalHits(HCalE, HCalToF, HCalPhi, HCalEta);
1360 
1361  return;
1362 }
1363 
1365  std::string MsgLoggerCat = "GlobalHitsProducer_clear";
1366 
1367  if (verbosity > 0)
1368  edm::LogInfo(MsgLoggerCat) << "Clearing event holders";
1369 
1370  // reset G4MC info
1371  nRawGenPart = 0;
1372  G4VtxX.clear();
1373  G4VtxY.clear();
1374  G4VtxZ.clear();
1375  G4TrkPt.clear();
1376  G4TrkE.clear();
1377 
1378  // reset electromagnetic info
1379  // reset ECal info
1380  ECalE.clear();
1381  ECalToF.clear();
1382  ECalPhi.clear();
1383  ECalEta.clear();
1384  // reset Preshower info
1385  PreShE.clear();
1386  PreShToF.clear();
1387  PreShPhi.clear();
1388  PreShEta.clear();
1389 
1390  // reset hadronic info
1391  // reset HCal info
1392  HCalE.clear();
1393  HCalToF.clear();
1394  HCalPhi.clear();
1395  HCalEta.clear();
1396 
1397  // reset tracker info
1398  // reset Pixel info
1399  PxlBrlToF.clear();
1400  PxlBrlR.clear();
1401  PxlBrlPhi.clear();
1402  PxlBrlEta.clear();
1403  PxlFwdToF.clear();
1404  PxlFwdZ.clear();
1405  PxlFwdPhi.clear();
1406  PxlFwdEta.clear();
1407  // reset strip info
1408  SiBrlToF.clear();
1409  SiBrlR.clear();
1410  SiBrlPhi.clear();
1411  SiBrlEta.clear();
1412  SiFwdToF.clear();
1413  SiFwdZ.clear();
1414  SiFwdPhi.clear();
1415  SiFwdEta.clear();
1416 
1417  // reset muon info
1418  // reset muon DT info
1419  MuonDtToF.clear();
1420  MuonDtR.clear();
1421  MuonDtPhi.clear();
1422  MuonDtEta.clear();
1423  // reset muon CSC info
1424  MuonCscToF.clear();
1425  MuonCscZ.clear();
1426  MuonCscPhi.clear();
1427  MuonCscEta.clear();
1428  // rest muon RPC info
1429  MuonRpcBrlToF.clear();
1430  MuonRpcBrlR.clear();
1431  MuonRpcBrlPhi.clear();
1432  MuonRpcBrlEta.clear();
1433  MuonRpcFwdToF.clear();
1434  MuonRpcFwdZ.clear();
1435  MuonRpcFwdPhi.clear();
1436  MuonRpcFwdEta.clear();
1437 
1438  return;
1439 }
edm::InputTag ECalESSrc_
void storeECal(PGlobalSimHit &)
edm::EDGetTokenT< edm::PSimHitContainer > SiTIBHighSrc_Token_
static const int dEcal
ESGetTokenH3DDVariant esConsumes(std::string const &Record, edm::ConsumesCollector &)
Definition: DeDxTools.cc:283
static const int dTrk
T getParameter(std::string const &) const
Definition: ParameterSet.h:307
edm::EDGetTokenT< edm::PSimHitContainer > SiTECHighSrc_Token_
std::vector< PCaloHit > PCaloHitContainer
static const int sdMuonRPCRgnFwdn
const TrackerGeomDet * idToDetUnit(DetId) const override
Return the pointer to the GeomDetUnit corresponding to a given DetId.
void produce(edm::Event &, const edm::EventSetup &) override
edm::ESGetToken< CaloGeometry, CaloGeometryRecord > caloGeomToken_
static const int sdHcalOut
edm::InputTag ECalEESrc_
void putHCalHits(const std::vector< float > &e, const std::vector< float > &tof, const std::vector< float > &phi, const std::vector< float > &eta)
edm::ESGetToken< CSCGeometry, MuonGeometryRecord > cscGeomToken_
static const int sdMuonDT
edm::EDGetTokenT< edm::PSimHitContainer > MuonRpcSrc_Token_
edm::InputTag MuonCscSrc_
void putMuonRpcFwdHits(const std::vector< float > &tof, const std::vector< float > &z, const std::vector< float > &phi, const std::vector< float > &eta)
std::string const & instance() const
Definition: InputTag.h:37
TString subdetector
edm::InputTag MuonDtSrc_
Geom::Phi< T > phi() const
Definition: PV3DBase.h:66
void putMuonRpcBrlHits(const std::vector< float > &tof, const std::vector< float > &r, const std::vector< float > &phi, const std::vector< float > &eta)
static const int sdSiTID
T eta() const
Definition: PV3DBase.h:73
edm::InputTag SiTOBHighSrc_
edm::InputTag PxlBrlHighSrc_
edm::InputTag PxlBrlLowSrc_
unsigned long long EventNumber_t
static const int sdEcalPS
void putMuonCscHits(const std::vector< float > &tof, const std::vector< float > &z, const std::vector< float > &phi, const std::vector< float > &eta)
void putECalHits(const std::vector< float > &e, const std::vector< float > &tof, const std::vector< float > &phi, const std::vector< float > &eta)
void storeMuon(PGlobalSimHit &)
const GeomDet * idToDetUnit(DetId) const override
Return the pointer to the GeomDetUnit corresponding to a given DetId.
Definition: RPCGeometry.cc:30
edm::InputTag PxlFwdLowSrc_
static const int sdMuonRPC
std::string const & label() const
Definition: InputTag.h:36
void storeG4MC(PGlobalSimHit &)
Provenance const * provenance() const
Definition: HandleBase.h:74
edm::EDGetTokenT< edm::PSimHitContainer > PxlBrlHighSrc_Token_
edm::InputTag SiTIDLowSrc_
void storeTrk(PGlobalSimHit &)
void beginJob(void) override
T getUntrackedParameter(std::string const &, T const &) const
edm::EDGetTokenT< edm::PSimHitContainer > PxlFwdHighSrc_Token_
edm::InputTag SiTECHighSrc_
XYZTLorentzVectorD XYZTLorentzVector
Lorentz vector with cylindrical internal representation using pseudorapidity.
Definition: LorentzVector.h:29
edm::EDGetTokenT< edm::PSimHitContainer > SiTIBLowSrc_Token_
char const * label
edm::InputTag ECalEBSrc_
void fillMuon(edm::Event &, const edm::EventSetup &)
void putG4Trk(const std::vector< float > &pt, const std::vector< float > &e)
edm::EDGetTokenT< edm::PCaloHitContainer > HCalSrc_Token_
edm::EDGetTokenT< edm::PSimHitContainer > MuonCscSrc_Token_
int iEvent
Definition: GenABIO.cc:224
GlobalHitsProducer(const edm::ParameterSet &)
static const int sdSiTIB
static const int sdPxlBrl
void endJob() override
T sqrt(T t)
Definition: SSEVec.h:23
void putSiBrlHits(const std::vector< float > &tof, const std::vector< float > &r, const std::vector< float > &phi, const std::vector< float > &eta)
static const int sdMuonCSC
void putPxlFwdHits(const std::vector< float > &tof, const std::vector< float > &z, const std::vector< float > &phi, const std::vector< float > &eta)
static const int sdEcalFwd
void fillTrk(edm::Event &, const edm::EventSetup &)
edm::InputTag SiTIBLowSrc_
edm::EDGetTokenT< edm::PSimHitContainer > SiTIDLowSrc_Token_
edm::InputTag SiTECLowSrc_
BranchDescription const & branchDescription() const
Definition: Provenance.h:45
static const int sdSiTOB
static const int sdEcalBrl
static const int sdMuonRPCRgnFwdp
static const int sdMuonRPCRgnBrl
edm::InputTag SiTIDHighSrc_
edm::ESGetToken< TrackerGeometry, TrackerDigiGeometryRecord > tGeomToken_
edm::EDGetTokenT< edm::PSimHitContainer > SiTOBLowSrc_Token_
void putSiFwdHits(const std::vector< float > &tof, const std::vector< float > &z, const std::vector< float > &phi, const std::vector< float > &eta)
ESHandle< T > getHandle(const ESGetToken< T, R > &iToken) const
Definition: EventSetup.h:130
T perp() const
Magnitude of transverse component.
Basic3DVector unit() const
edm::EDGetTokenT< edm::SimTrackContainer > G4TrkSrc_Token_
edm::InputTag PxlFwdHighSrc_
const HepMC::GenEvent * GetEvent() const
Definition: HepMCProduct.h:37
edm::EDGetTokenT< edm::PCaloHitContainer > ECalESSrc_Token_
const int verbosity
Log< level::Info, false > LogInfo
Definition: DetId.h:17
static const int dHcal
edm::EDGetTokenT< edm::PSimHitContainer > SiTOBHighSrc_Token_
const Plane & surface() const
The nominal surface of the GeomDet.
Definition: GeomDet.h:37
void putPreShHits(const std::vector< float > &e, const std::vector< float > &tof, const std::vector< float > &phi, const std::vector< float > &eta)
void fillECal(edm::Event &, const edm::EventSetup &)
void fillHCal(edm::Event &, const edm::EventSetup &)
edm::ESGetToken< RPCGeometry, MuonGeometryRecord > rpcGeomToken_
std::vector< SimVertex > SimVertexContainer
edm::EDGetTokenT< edm::PSimHitContainer > SiTIDHighSrc_Token_
static const int sdHcalFwd
static const int sdHcalBrl
bool isValid() const
Definition: HandleBase.h:70
void storeHCal(PGlobalSimHit &)
edm::InputTag SiTOBLowSrc_
edm::EDGetTokenT< edm::PSimHitContainer > PxlFwdLowSrc_Token_
edm::EDGetTokenT< edm::PSimHitContainer > MuonDtSrc_Token_
edm::EDGetTokenT< edm::PSimHitContainer > PxlBrlLowSrc_Token_
edm::EDGetTokenT< edm::SimVertexContainer > G4VtxSrc_Token_
static const int sdSiTEC
static const int dMuon
edm::EDGetTokenT< edm::PCaloHitContainer > ECalEBSrc_Token_
edm::EDGetTokenT< edm::PCaloHitContainer > ECalEESrc_Token_
HLT enums.
GlobalPoint getPosition(const DetId &id) const
void putPxlBrlHits(const std::vector< float > &tof, const std::vector< float > &r, const std::vector< float > &phi, const std::vector< float > &eta)
void putRawGenPart(int n)
void putG4Vtx(const std::vector< float > &x, const std::vector< float > &y, const std::vector< float > &z)
void fillG4MC(edm::Event &)
void putMuonDtHits(const std::vector< float > &tof, const std::vector< float > &r, const std::vector< float > &phi, const std::vector< float > &eta)
std::vector< PSimHit > PSimHitContainer
edm::EDGetTokenT< edm::PSimHitContainer > SiTECLowSrc_Token_
unsigned int RunNumber_t
static const int sdPxlFwd
Log< level::Warning, false > LogWarning
edm::InputTag SiTIBHighSrc_
std::vector< SimTrack > SimTrackContainer
const CaloSubdetectorGeometry * getSubdetectorGeometry(const DetId &id) const
access the subdetector geometry for the given subdetector directly
Definition: CaloGeometry.cc:34
edm::InputTag MuonRpcSrc_
static const int sdHcalEC
def move(src, dest)
Definition: eostools.py:511
edm::ESGetToken< DTGeometry, MuonGeometryRecord > dtGeomToken_
const GeomDet * idToDetUnit(DetId) const override
Return the pointer to the GeomDetUnit corresponding to a given DetId.
Definition: CSCGeometry.cc:89
const DTLayer * layer(const DTLayerId &id) const
Return a layer given its id.
Definition: DTGeometry.cc:96