CMS 3D CMS Logo

AlignmentStats.cc
Go to the documentation of this file.
1 // system includes
2 #include <fstream>
3 #include <string>
4 #include <vector>
5 #include <map>
6 
7 // user includes
41 
42 // ROOT includes
43 #include "TFile.h"
44 #include "TTree.h"
45 
46 namespace aliStats {
47  struct GeoInfo {
48  public:
49  void printAll() const {
50  edm::LogInfo("GeoInfo") << "DetId: " << id_ << " subdet: " << subdet_ << " layer:" << layer_
51  << " (pox,posy,posz) = (" << posX_ << "," << posY_ << "," << posZ_ << ")"
52  << " posEta: " << posEta_ << " posPhi: " << posPhi_ << " posR: " << posR_
53  << " is2D:" << is2D_ << " isStereo:" << isStereo_;
54  }
55  unsigned int id_;
56  float posX_;
57  float posY_;
58  float posZ_;
59  float posEta_;
60  float posPhi_;
61  float posR_;
62  int subdet_;
63  unsigned int layer_;
64  bool is2D_;
65  bool isStereo_;
66  };
67 } // namespace aliStats
68 
69 class AlignmentStats : public edm::one::EDAnalyzer<edm::one::WatchRuns> {
70 public:
71  AlignmentStats(const edm::ParameterSet &iConfig);
72  ~AlignmentStats() override = default;
73  static void fillDescriptions(edm::ConfigurationDescriptions &descriptions);
74 
75  void beginRun(edm::Run const &, edm::EventSetup const &) override{};
76  void analyze(const edm::Event &iEvent, const edm::EventSetup &iSetup) override;
77  void endRun(edm::Run const &iRun, edm::EventSetup const &iSetup) override;
78  void beginJob() override;
79  void endJob() override;
80 
81 private:
82  std::vector<aliStats::GeoInfo> geomInfoList_;
83 
84  // esToken
87 
91  const bool keepTrackStats_;
92  const bool keepHitPopulation_;
95  const uint32_t prescale_;
96 
99 
101  uint32_t tmpPresc_;
102 
103  //Track stats
104  TFile *treefile_;
105  TTree *outtree_;
106  static const int MAXTRKS_ = 200;
107  int run_, event_;
108  unsigned int ntracks;
110  int Nhits[MAXTRKS_][7]; //0=total, 1-6=Subdets
111 
112  //Hit Population
113  TFile *hitsfile_;
114  TTree *hitstree_;
115  unsigned int id_, nhits_, noverlaps_;
116  float posX_, posY_, posZ_;
118  int subdet_;
119  unsigned int layer_;
121 
122  typedef std::map<uint32_t, uint32_t> DetHitMap;
125 
126  std::unique_ptr<TrackerTopology> trackerTopology_;
127 };
128 
129 using namespace std;
130 
132  : esTokenTTopoER_(esConsumes<edm::Transition::EndRun>()),
133  esTokenTkGeoER_(esConsumes<edm::Transition::EndRun>()),
134  src_(iConfig.getParameter<edm::InputTag>("src")),
135  overlapAM_(iConfig.getParameter<edm::InputTag>("OverlapAssoMap")),
136  keepTrackStats_(iConfig.getParameter<bool>("keepTrackStats")),
137  keepHitPopulation_(iConfig.getParameter<bool>("keepHitStats")),
138  statsTreeName_(iConfig.getParameter<string>("TrkStatsFileName")),
139  hitsTreeName_(iConfig.getParameter<string>("HitStatsFileName")),
140  prescale_(iConfig.getParameter<uint32_t>("TrkStatsPrescale")),
141  trackToken_(consumes<reco::TrackCollection>(src_)),
142  mapToken_(consumes<AliClusterValueMap>(overlapAM_)) {
143  //sanity checks
144 
145  //init
146  outtree_ = nullptr;
147 
148 } //end constructor
149 
152  desc.add<edm::InputTag>("src", edm::InputTag("generalTracks"));
153  desc.add<edm::InputTag>("OverlapAssoMap", edm::InputTag("OverlapAssoMap"));
154  desc.add<bool>("keepTrackStats", false);
155  desc.add<bool>("keepHitStats", false);
156  desc.add<std::string>("TrkStatsFileName", "tracks_statistics.root");
157  desc.add<std::string>("HitStatsFileName", "HitMaps.root");
158  desc.add<unsigned int>("TrkStatsPrescale", 1);
159  descriptions.add("AlignmentStats", desc);
160 }
161 
162 void AlignmentStats::beginJob() { // const edm::EventSetup &iSetup
163 
164  //book track stats tree
165  treefile_ = new TFile(statsTreeName_.c_str(), "RECREATE");
166  treefile_->cd();
167  outtree_ = new TTree("AlignmentTrackStats", "Statistics of Tracks used for Alignment");
168  // int nHitsinPXB[MAXTRKS_], nHitsinPXE[MAXTRKS_], nHitsinTEC[MAXTRKS_], nHitsinTIB[MAXTRKS_],nHitsinTOB[MAXTRKS_],nHitsinTID[MAXTRKS_];
169 
170  outtree_->Branch("Ntracks", &ntracks, "Ntracks/i");
171  outtree_->Branch("Run_", &run_, "Run_Nr/I");
172  outtree_->Branch("Event", &event_, "EventNr/I");
173  outtree_->Branch("Eta", &Eta, "Eta[Ntracks]/F");
174  outtree_->Branch("Phi", &Phi, "Phi[Ntracks]/F");
175  outtree_->Branch("P", &P, "P[Ntracks]/F");
176  outtree_->Branch("Pt", &Pt, "Pt[Ntracks]/F");
177  outtree_->Branch("Chi2n", &Chi2n, "Chi2n[Ntracks]/F");
178  outtree_->Branch("Nhits", &Nhits, "Nhits[Ntracks][7]/I");
179  /*
180  outtree_->Branch("NhitsPXB" , ,);
181  outtree_->Branch("NhitsPXE" , ,);
182  outtree_->Branch("NhitsTIB" , ,);
183  outtree_->Branch("NhitsTID" , ,);
184  outtree_->Branch("NhitsTOB" , ,);
185  outtree_->Branch("NhitsTOB" , ,);
186  */
187 
189 
190  // create tree with hit maps (hitstree)
191  // book hits stats tree
192  hitsfile_ = new TFile(hitsTreeName_.c_str(), "RECREATE");
193  hitsfile_->cd();
194  hitstree_ = new TTree("AlignmentHitMap", "Maps of Hits used for Alignment");
195  hitstree_->Branch("DetId", &id_, "DetId/i");
196  hitstree_->Branch("Nhits", &nhits_, "Nhits/i");
197  hitstree_->Branch("Noverlaps", &noverlaps_, "Noverlaps/i");
198  hitstree_->Branch("SubDet", &subdet_, "SubDet/I");
199  hitstree_->Branch("Layer", &layer_, "Layer/i");
200  hitstree_->Branch("is2D", &is2D_, "is2D/B");
201  hitstree_->Branch("isStereo", &isStereo_, "isStereo/B");
202  hitstree_->Branch("posX", &posX_, "posX/F");
203  hitstree_->Branch("posY", &posY_, "posY/F");
204  hitstree_->Branch("posZ", &posZ_, "posZ/F");
205  hitstree_->Branch("posR", &posR_, "posR/F");
206  hitstree_->Branch("posEta", &posEta_, "posEta/F");
207  hitstree_->Branch("posPhi", &posPhi_, "posPhi/F");
208 } //end beginJob
209 
210 // ------------ method called once every run before doing the event loop ----------------
211 void AlignmentStats::endRun(edm::Run const &iRun, edm::EventSetup const &iSetup) {
212  if (!trackerTopology_) {
213  trackerTopology_ = std::make_unique<TrackerTopology>(iSetup.getData(esTokenTTopoER_));
214  const TrackerGeometry *trackerGeometry_ = &iSetup.getData(esTokenTkGeoER_);
215  auto theAliTracker = std::make_unique<AlignableTracker>(trackerGeometry_, trackerTopology_.get());
216 
217  hitsfile_->cd();
218  for (const auto &detUnit : theAliTracker->deepComponents()) {
219  aliStats::GeoInfo detUnitInfo;
220  detUnitInfo.id_ = static_cast<uint32_t>(detUnit->id());
221  DetId detid(detUnitInfo.id_);
222  detUnitInfo.subdet_ = detid.subdetId();
223 
224  //take other geometrical infos from the det
225  detUnitInfo.posX_ = detUnit->globalPosition().x();
226  detUnitInfo.posY_ = detUnit->globalPosition().y();
227  detUnitInfo.posZ_ = detUnit->globalPosition().z();
228 
229  align::GlobalVector vec(detUnitInfo.posX_, detUnitInfo.posY_, detUnitInfo.posZ_);
230  detUnitInfo.posR_ = vec.perp();
231  detUnitInfo.posPhi_ = vec.phi();
232  detUnitInfo.posEta_ = vec.eta();
233  // detUnitInfo.posPhi_ = atan2(posY_,posX_);
234 
235  //get layers, petals, etc...
236  if (detUnitInfo.subdet_ == PixelSubdetector::PixelBarrel) { //PXB
237  detUnitInfo.layer_ = trackerTopology_->pxbLayer(detUnitInfo.id_);
238  detUnitInfo.is2D_ = true;
239  detUnitInfo.isStereo_ = false;
240  } else if (detUnitInfo.subdet_ == PixelSubdetector::PixelEndcap) {
241  detUnitInfo.layer_ = trackerTopology_->pxfDisk(detUnitInfo.id_);
242  detUnitInfo.is2D_ = true;
243  detUnitInfo.isStereo_ = false;
244  } else if (detUnitInfo.subdet_ == SiStripDetId::TIB) {
245  detUnitInfo.layer_ = trackerTopology_->tibLayer(detUnitInfo.id_);
246  detUnitInfo.is2D_ = trackerTopology_->tibIsDoubleSide(detUnitInfo.id_);
247  detUnitInfo.isStereo_ = trackerTopology_->tibIsStereo(detUnitInfo.id_);
248  } else if (detUnitInfo.subdet_ == SiStripDetId::TID) {
249  detUnitInfo.layer_ = trackerTopology_->tidWheel(detUnitInfo.id_);
250  detUnitInfo.is2D_ = trackerTopology_->tidIsDoubleSide(detUnitInfo.id_);
251  detUnitInfo.isStereo_ = trackerTopology_->tidIsStereo(detUnitInfo.id_);
252  } else if (detUnitInfo.subdet_ == SiStripDetId::TOB) {
253  detUnitInfo.layer_ = trackerTopology_->tobLayer(detUnitInfo.id_);
254  detUnitInfo.is2D_ = trackerTopology_->tobIsDoubleSide(detUnitInfo.id_);
255  detUnitInfo.isStereo_ = trackerTopology_->tobIsStereo(detUnitInfo.id_);
256  } else if (detUnitInfo.subdet_ == SiStripDetId::TEC) {
257  detUnitInfo.layer_ = trackerTopology_->tecWheel(detUnitInfo.id_);
258  detUnitInfo.is2D_ = trackerTopology_->tecIsDoubleSide(detUnitInfo.id_);
259  detUnitInfo.isStereo_ = trackerTopology_->tecIsStereo(detUnitInfo.id_);
260  } else {
261  edm::LogError("AlignmentStats")
262  << "Detector not belonging neither to pixels nor to strips! Skipping it. SubDet= " << detUnitInfo.subdet_;
263  }
264 
265  LogDebug("AlignmentStats") << "id " << detUnitInfo.id_ << " detid.rawId()" << detid.rawId() << " subdet "
266  << detUnitInfo.subdet_;
267 
268  // push back in the list
269  geomInfoList_.push_back(detUnitInfo);
270  } // end loop over detunits
271 
272  int ndetunits = geomInfoList_.size();
273  edm::LogInfo("AlignmentStats") << __PRETTY_FUNCTION__
274  << " Number of DetUnits in the AlignableTracker: " << ndetunits;
275  }
276 }
277 
279  //take trajectories and tracks to loop on
280  // edm::Handle<TrajTrackAssociationCollection> TrackAssoMap;
282 
283  //take overlap HitAssomap
284  const edm::Handle<AliClusterValueMap> &hMap = iEvent.getHandle(mapToken_);
285  const AliClusterValueMap &OverlapMap = *hMap;
286 
287  // Initialise
288  run_ = 1;
289  event_ = 1;
290  ntracks = 0;
291  run_ = iEvent.id().run();
292  event_ = iEvent.id().event();
293  ntracks = Tracks->size();
294  if (ntracks > 1)
295  edm::LogVerbatim("AlignmenStats") << "~~~~~~~~~~~~\n For this event processing " << ntracks << " tracks";
296 
297  unsigned int trk_cnt = 0;
298 
299  for (int j = 0; j < MAXTRKS_; j++) {
300  Eta[j] = -9999.0;
301  Phi[j] = -8888.0;
302  P[j] = -7777.0;
303  Pt[j] = -6666.0;
304  Chi2n[j] = -2222.0;
305  for (int k = 0; k < 7; k++) {
306  Nhits[j][k] = 0;
307  }
308  }
309 
310  // int npxbhits=0;
311 
312  //loop on tracks
313  for (const auto &ittrk : *Tracks) {
314  Eta[trk_cnt] = ittrk.eta();
315  Phi[trk_cnt] = ittrk.phi();
316  Chi2n[trk_cnt] = ittrk.normalizedChi2();
317  P[trk_cnt] = ittrk.p();
318  Pt[trk_cnt] = ittrk.pt();
319  Nhits[trk_cnt][0] = ittrk.numberOfValidHits();
320 
321  if (ntracks > 1)
322  edm::LogVerbatim("AlignmenStats") << "Track #" << trk_cnt + 1 << " params: Eta=" << Eta[trk_cnt]
323  << " Phi=" << Phi[trk_cnt] << " P=" << P[trk_cnt]
324  << " Nhits=" << Nhits[trk_cnt][0];
325 
326  //loop on tracking rechits
327  //edm::LogVerbatim("AlignmenStats") << " loop on hits of track #" << (itt - tracks->begin());
328  for (auto const &hit : ittrk.recHits()) {
329  if (!hit->isValid())
330  continue;
331  DetId detid = hit->geographicalId();
332  int subDet = detid.subdetId();
333  uint32_t rawId = hit->geographicalId().rawId();
334 
335  // if(subDet==1)npxbhits++;
336 
337  //look if you find this detid in the map
338  DetHitMap::iterator mapiter;
339  mapiter = hitmap_.find(rawId);
340  if (mapiter != hitmap_.end()) { //present, increase its value by one
341  // hitmap_[rawId]=hitmap_[rawId]+1;
342  ++(hitmap_[rawId]);
343  } else { //not present, let's add this key to the map with value=1
344  hitmap_.insert(pair<uint32_t, uint32_t>(rawId, 1));
345  }
346 
347  AlignmentClusterFlag inval;
348 
349  bool hitInPixel = (subDet == PixelSubdetector::PixelBarrel) || (subDet == PixelSubdetector::PixelEndcap);
350  bool hitInStrip = (subDet == SiStripDetId::TIB) || (subDet == SiStripDetId::TID) ||
351  (subDet == SiStripDetId::TOB) || (subDet == SiStripDetId::TEC);
352 
353  if (!(hitInPixel || hitInStrip)) {
354  //skip only this hit, don't stop everything throwing an exception
355  edm::LogError("AlignmentStats") << "Hit not belonging neither to pixels nor to strips! Skipping it. SubDet= "
356  << subDet;
357  continue;
358  }
359 
360  //check also if the hit is an overlap. If yes fill a dedicated hitmap
361  if (hitInStrip) {
362  const std::type_info &type = typeid(*hit);
363 
364  if (type == typeid(SiStripRecHit1D)) {
365  //Notice the difference respect to when one loops on Trajectories: the recHit is a TrackingRecHit and not a TransientTrackingRecHit
366  const SiStripRecHit1D *striphit = dynamic_cast<const SiStripRecHit1D *>(hit);
367  if (striphit != nullptr) {
368  SiStripRecHit1D::ClusterRef stripclust(striphit->cluster());
369  inval = OverlapMap[stripclust];
370  } else {
371  // edm::LogError("AlignmentStats")<<"ERROR in <AlignmentStats::analyze>: Dynamic cast of Strip RecHit1D failed! TypeId of the RecHit: "<<className(*hit);
372  throw cms::Exception("NullPointerError")
373  << "ERROR in <AlignmentStats::analyze>: Dynamic cast of Strip RecHit1D failed! TypeId of the RecHit: "
374  << className(*hit);
375  }
376  } //end if sistriprechit1D
377  if (type == typeid(SiStripRecHit2D)) {
378  const SiStripRecHit2D *striphit = dynamic_cast<const SiStripRecHit2D *>(hit);
379  if (striphit != nullptr) {
380  SiStripRecHit2D::ClusterRef stripclust(striphit->cluster());
381  inval = OverlapMap[stripclust];
382  //edm::LogVerbatim("AlignmenStats")<<"Taken the Strip Cluster with ProdId "<<stripclust.id() <<"; the Value in the map is "<<inval<<" (DetId is "<<hit->geographicalId().rawId()<<")";
383  } else {
384  throw cms::Exception("NullPointerError")
385  << "ERROR in <AlignmentStats::analyze>: Dynamic cast of Strip RecHit2D failed! TypeId of the RecHit: "
386  << className(*hit);
387  // edm::LogError("AlignmentStats")<<"ERROR in <AlignmentStats::analyze>: Dynamic cast of Strip RecHit2D failed! TypeId of the RecHit: "<<className(*hit);
388  }
389  } //end if sistriprechit2D
390 
391  } //end if hit in Strips
392  else {
393  const SiPixelRecHit *pixelhit = dynamic_cast<const SiPixelRecHit *>(hit);
394  if (pixelhit != nullptr) {
395  SiPixelClusterRefNew pixclust(pixelhit->cluster());
396  inval = OverlapMap[pixclust];
397  //edm::LogVerbatim("AlignmenStats")<<"Taken the Pixel Cluster with ProdId "<<pixclust.id() <<"; the Value in the map is "<<inval<<" (DetId is "<<hit->geographicalId().rawId()<<")";
398  } else {
399  edm::LogError("AlignmentStats")
400  << "ERROR in <AlignmentStats::analyze>: Dynamic cast of Pixel RecHit failed! TypeId of the RecHit: "
401  << className(*hit);
402  }
403  } //end else hit is in Pixel
404 
405  bool isOverlapHit(inval.isOverlap());
406 
407  if (isOverlapHit) {
408  edm::LogVerbatim("AlignmenStats") << "This hit is an overlap !";
409  DetHitMap::iterator overlapiter;
410  overlapiter = overlapmap_.find(rawId);
411 
412  if (overlapiter !=
413  overlapmap_.end()) { //the det already collected at least an overlap, increase its value by one
415  } else { //first overlap on det unit, let's add it to the map
416  overlapmap_.insert(pair<uint32_t, uint32_t>(rawId, 1));
417  }
418  } //end if the hit is an overlap
419 
420  int subdethit = static_cast<int>(hit->geographicalId().subdetId());
421  if (ntracks > 1)
422  edm::LogVerbatim("AlignmenStats") << "Hit in SubDet=" << subdethit;
423  Nhits[trk_cnt][subdethit] = Nhits[trk_cnt][subdethit] + 1;
424  } //end loop on trackingrechits
425  trk_cnt++;
426 
427  } //end loop on tracks
428 
429  //edm::LogVerbatim("AlignmenStats")<<"Total number of pixel hits is " << npxbhits;
430 
431  tmpPresc_--;
432  if (tmpPresc_ < 1) {
433  outtree_->Fill();
435  }
436  if (trk_cnt != ntracks)
437  edm::LogError("AlignmentStats") << "\nERROR! trk_cnt=" << trk_cnt << " ntracks=" << ntracks;
438 
439  return;
440 }
441 
443  treefile_->cd();
444  edm::LogInfo("AlignmentStats") << "Writing out the TrackStatistics in " << gDirectory->GetPath();
445  outtree_->Write();
446  delete outtree_;
447 
448  int ndetunits = geomInfoList_.size();
449  edm::LogInfo("AlignmentStats") << __PRETTY_FUNCTION__ << "Number of DetUnits in the AlignableTracker: " << ndetunits
450  << std::endl;
451 
452  hitsfile_->cd();
453  // save the information on hits and overlaps
454  for (const auto &detUnitInfo : geomInfoList_) {
455  detUnitInfo.printAll();
456 
457  // copy the values from the struct to the TTree
458  id_ = detUnitInfo.id_;
459  posX_ = detUnitInfo.posX_;
460  posY_ = detUnitInfo.posY_;
461  posZ_ = detUnitInfo.posZ_;
462  posEta_ = detUnitInfo.posEta_;
463  posPhi_ = detUnitInfo.posPhi_;
464  posR_ = detUnitInfo.posR_;
465  subdet_ = detUnitInfo.subdet_;
466  layer_ = detUnitInfo.layer_;
467  is2D_ = detUnitInfo.is2D_;
468  isStereo_ = detUnitInfo.isStereo_;
469 
470  if (hitmap_.find(id_) != hitmap_.end()) {
471  nhits_ = hitmap_[id_];
472  }
473  //if not, save nhits=0
474  else {
475  nhits_ = 0;
476  hitmap_.insert(pair<uint32_t, uint32_t>(id_, 0));
477  }
478 
479  if (overlapmap_.find(id_) != overlapmap_.end()) {
481  }
482  //if not, save nhits=0
483  else {
484  noverlaps_ = 0;
485  overlapmap_.insert(pair<uint32_t, uint32_t>(id_, 0));
486  }
487  //write in the hitstree
488  hitstree_->Fill();
489  } //end loop over detunits
490 
491  //save hitstree
492  hitstree_->Write();
493  delete hitstree_;
494  hitmap_.clear();
495  overlapmap_.clear();
496  delete hitsfile_;
497 }
498 // ========= MODULE DEF ==============
float Eta[MAXTRKS_]
Log< level::Info, true > LogVerbatim
ESGetTokenH3DDVariant esConsumes(std::string const &Record, edm::ConsumesCollector &)
Definition: DeDxTools.cc:283
const std::string hitsTreeName_
T perp() const
Definition: PV3DBase.h:69
void beginRun(edm::Run const &, edm::EventSetup const &) override
T const & getData(const ESGetToken< T, R > &iToken) const noexcept(false)
Definition: EventSetup.h:119
~AlignmentStats() override=default
unsigned int layer_
static constexpr auto TID
Definition: SiStripDetId.h:38
const bool keepHitPopulation_
Geom::Phi< T > phi() const
Definition: PV3DBase.h:66
DetHitMap overlapmap_
T eta() const
Definition: PV3DBase.h:73
std::vector< Track > TrackCollection
collection of Tracks
Definition: TrackFwd.h:14
float Chi2n[MAXTRKS_]
const uint32_t prescale_
const edm::ESGetToken< TrackerGeometry, TrackerDigiGeometryRecord > esTokenTkGeoER_
unsigned int layer_
std::vector< aliStats::GeoInfo > geomInfoList_
Log< level::Error, false > LogError
unsigned int id_
ClusterRef cluster() const
const edm::EDGetTokenT< reco::TrackCollection > trackToken_
int iEvent
Definition: GenABIO.cc:224
unsigned int nhits_
const edm::InputTag overlapAM_
std::map< uint32_t, uint32_t > DetHitMap
float Phi[MAXTRKS_]
Transition
Definition: Transition.h:12
unsigned int id_
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
constexpr int subdetId() const
get the contents of the subdetector field (not cast into any detector&#39;s numbering enum) ...
Definition: DetId.h:48
const edm::InputTag src_
static constexpr auto TOB
Definition: SiStripDetId.h:39
void endRun(edm::Run const &iRun, edm::EventSetup const &iSetup) override
const edm::ESGetToken< TrackerTopology, TrackerTopologyRcd > esTokenTTopoER_
Log< level::Info, false > LogInfo
Definition: DetId.h:17
const std::string statsTreeName_
const edm::EDGetTokenT< AliClusterValueMap > mapToken_
constexpr uint32_t rawId() const
get the raw id
Definition: DetId.h:57
AlignmentStats(const edm::ParameterSet &iConfig)
static const int MAXTRKS_
void add(std::string const &label, ParameterSetDescription const &psetDescription)
std::pair< OmniClusterRef, TrackingParticleRef > P
static constexpr auto TIB
Definition: SiStripDetId.h:37
unsigned int ntracks
fixed size matrix
int Nhits[MAXTRKS_][7]
HLT enums.
float Pt[MAXTRKS_]
const bool keepTrackStats_
void beginJob() override
unsigned int noverlaps_
ClusterRef cluster() const
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
std::unique_ptr< TrackerTopology > trackerTopology_
static constexpr auto TEC
Definition: SiStripDetId.h:40
void printAll() const
std::string className(const T &t)
Definition: ClassName.h:31
void endJob() override
Definition: Run.h:45
Our base class.
Definition: SiPixelRecHit.h:23
#define LogDebug(id)
void analyze(const edm::Event &iEvent, const edm::EventSetup &iSetup) override