CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
HitParentTest.cc
Go to the documentation of this file.
1 #include <algorithm>
2 #include <fstream>
3 #include <iomanip>
4 #include <iostream>
5 #include <map>
6 #include <memory>
7 #include <string>
8 #include <vector>
9 
10 #include <TH1F.h>
11 
30 
31 class HitParentTest : public edm::one::EDAnalyzer<edm::one::WatchRuns, edm::one::SharedResources> {
32 public:
34  ~HitParentTest() override {}
35  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
36 
37 protected:
38  void beginJob() override;
39  void beginRun(edm::Run const&, edm::EventSetup const&) override {}
40  void analyze(const edm::Event& e, const edm::EventSetup& c) override;
41  void endRun(edm::Run const&, edm::EventSetup const&) override {}
42  void endJob() override;
43 
44 private:
46  void analyzeHits(const std::vector<PCaloHit>&,
49  int type);
50  void analyzeAPDHits(const std::vector<PCaloHit>&,
53  int depth);
54 
58  edm::SimTrackContainer::const_iterator track);
59  edm::SimTrackContainer::const_iterator parentSimTrack(const edm::Handle<edm::SimTrackContainer>&,
61  edm::SimTrackContainer::const_iterator thisTrkItr);
64  unsigned int simTkId,
65  edm::SimTrackContainer::const_iterator thisTrkItr);
66 
67 private:
75 
77  unsigned int total_num_apd_hits_seen[2];
78  unsigned int num_apd_hits_no_parent[2];
79 
82  unsigned int num_apd_hits_no_simtrack[2];
83 
86 
89  std::map<int, unsigned> particle_type_count;
90 
92  bool histos;
93  unsigned int totalHits[7], noParent[7];
94  unsigned int noSimTrack[7], noGenParticle[7];
95  TH1F *hitType[7], *hitRho[7], *hitZ[7];
96 };
97 
99  : sourceLabel(ps.getUntrackedParameter<std::string>("SourceLabel", "VtxSmeared")),
100  g4Label_(ps.getUntrackedParameter<std::string>("ModuleLabel", "g4SimHits")),
101  hitLabEB_(ps.getUntrackedParameter<std::string>("EBCollection", "EcalHitsEB")),
102  hitLabEE_(ps.getUntrackedParameter<std::string>("EECollection", "EcalHitsEE")),
103  hitLabES_(ps.getUntrackedParameter<std::string>("ESCollection", "EcalHitsES")),
104  hitLabHC_(ps.getUntrackedParameter<std::string>("HCCollection", "HcalHits")),
105  tok_eb_(consumes<edm::PCaloHitContainer>(edm::InputTag(g4Label_, hitLabEB_))),
106  tok_ee_(consumes<edm::PCaloHitContainer>(edm::InputTag(g4Label_, hitLabEE_))),
107  tok_es_(consumes<edm::PCaloHitContainer>(edm::InputTag(g4Label_, hitLabES_))),
108  tok_hc_(consumes<edm::PCaloHitContainer>(edm::InputTag(g4Label_, hitLabHC_))),
109  tok_tk_(consumes<edm::SimTrackContainer>(edm::InputTag(g4Label_))),
110  tok_vtx_(consumes<edm::SimVertexContainer>(edm::InputTag(g4Label_))) {
111  usesResource(TFileService::kSharedResource);
112 
113  edm::LogVerbatim("HitParentTest") << "Module Label: " << g4Label_ << " Hits: " << hitLabEB_ << ", " << hitLabEE_
114  << ", " << hitLabES_ << ", " << hitLabHC_;
115 
116  for (unsigned int i = 0; i < 2; ++i) {
121  }
122  std::string dets[7] = {"EB", "EE", "ES", "HB", "HE", "HO", "HF"};
123  for (unsigned int i = 0; i < 7; ++i) {
124  detector[i] = dets[i];
125  totalHits[i] = 0;
126  noParent[i] = 0;
127  noSimTrack[i] = 0;
128  noGenParticle[i] = 0;
129  }
130 }
131 
134  desc.addUntracked<std::string>("SourceLabel", "generatorSmeared");
135  desc.addUntracked<std::string>("ModuleLabel", "g4SimHits");
136  desc.addUntracked<std::string>("EBCollection", "EcalHitsEB");
137  desc.addUntracked<std::string>("EECollection", "EcalHitsEE");
138  desc.addUntracked<std::string>("ESCollection", "EcalHitsES");
139  desc.addUntracked<std::string>("HCCollection", "HcalHits");
140  descriptions.add("HitParentTest", desc);
141 }
142 
145  if (!tfile.isAvailable()) {
146  edm::LogVerbatim("HitParentTest") << "TFileService unavailable: no histograms";
147  histos = false;
148  } else {
149  char name[20], title[100];
150  histos = true;
151  for (unsigned int i = 0; i < 7; ++i) {
152  sprintf(name, "HitType%d", i);
153  sprintf(title, "Hit types for %s", detector[i].c_str());
154  hitType[i] = tfile->make<TH1F>(name, title, 10, 0., 10.);
155  hitType[i]->GetXaxis()->SetTitle(title);
156  hitType[i]->GetYaxis()->SetTitle("Hits");
157  sprintf(name, "RhoVertex%d", i);
158  sprintf(title, "#rho of the vertex for %s Hits", detector[i].c_str());
159  hitRho[i] = tfile->make<TH1F>(name, title, 10000, 0., 100.);
160  hitRho[i]->GetXaxis()->SetTitle(title);
161  hitRho[i]->GetYaxis()->SetTitle("Hits");
162  sprintf(name, "ZVertex%d", i);
163  sprintf(title, "z of the vertex for %s Hits", detector[i].c_str());
164  hitZ[i] = tfile->make<TH1F>(name, title, 2000, -100., 100.);
165  hitZ[i]->GetXaxis()->SetTitle(title);
166  hitZ[i]->GetYaxis()->SetTitle("Hits");
167  }
168  }
169 }
170 
172  edm::LogVerbatim("HitParentTest") << "HitParentTes::Run = " << e.id().run() << " Event = " << e.id().event();
173 
174  // get PCaloHits for ecal barrel
176 
177  // get PCaloHits for ecal endcap
179 
180  // get PCaloHits for preshower
182 
183  // get PCaloHits for hcal
185 
186  // get sim tracks
188 
189  // get sim vertices
191 
192  edm::LogVerbatim("HitParentTest") << "HitParentTest: hits valid[EB]: " << caloHitEB.isValid()
193  << " valid[EE]: " << caloHitEE.isValid() << " valid[ES]: " << caloHitES.isValid()
194  << " valid[HC]: " << caloHitHC.isValid();
195 
196  if (caloHitEB.isValid()) {
197  for (int depth = 1; depth <= 2; ++depth)
198  analyzeAPDHits(*caloHitEB, simTk, simVtx, depth);
199  analyzeHits(*caloHitEB, simTk, simVtx, 0);
200  }
201  if (caloHitEE.isValid())
202  analyzeHits(*caloHitEE, simTk, simVtx, 1);
203  if (caloHitES.isValid())
204  analyzeHits(*caloHitES, simTk, simVtx, 2);
205  if (caloHitHC.isValid())
206  analyzeHits(*caloHitHC, simTk, simVtx, 3);
207 }
208 
211 protected:
212  const std::map<int, unsigned>& particle_type_count;
213 
214 public:
215  HitParentTestComparison(const std::map<int, unsigned>& _particle_type_count)
216  : particle_type_count(_particle_type_count) {}
217 
218  bool operator()(int pid1, int pid2) const { return particle_type_count.at(pid1) > particle_type_count.at(pid2); }
219 };
220 
222  edm::LogVerbatim("HitParentTest") << "HitParentTest::Total number of APD hits seen: "
224  for (unsigned int depth = 0; depth < 2; ++depth) {
225  edm::LogVerbatim("HitParentTest") << "APD Hits in depth = " << depth + 1
226  << " Total = " << total_num_apd_hits_seen[depth];
227  edm::LogVerbatim("HitParentTest") << "summary of errors:\n"
228  << " number of APD hits with zero geant track id: "
229  << num_apd_hits_no_parent[depth] << "\n"
230  << "number of APD hits for which the parent simtrack was not found "
231  << "in the simtrack collection: " << num_apd_hits_no_simtrack[depth] << "\n"
232  << "number of APD hits for which no generator particle was "
233  << "found: " << num_apd_hits_no_gen_particle[depth] << "\n";
234  }
235 
236  for (unsigned int det = 0; det < 7; ++det) {
237  edm::LogVerbatim("HitParentTest") << "Total number of hits seen in " << detector[det] << ": " << totalHits[det];
238  edm::LogVerbatim("HitParentTest") << "summary of errors:\n"
239  << "number of hits with zero geant track id: " << noParent[det] << "\n"
240  << "number of hits for which the parent simtrack was not found in "
241  << "the simtrack collection: " << noSimTrack[det] << "\n"
242  << "number of hits for which no generator particle was found: "
243  << noGenParticle[det] << "\n";
244  }
245 
246  // sort in decreasing order of occurence
247  std::vector<int> sorted_pids;
248  for (std::map<int, unsigned>::const_iterator it = particle_type_count.begin(); it != particle_type_count.end(); ++it)
249  sorted_pids.push_back(it->first);
250 
251  // now sort the pids
252 
253  std::sort(sorted_pids.begin(), sorted_pids.end(), HitParentTestComparison(particle_type_count));
254 
255  edm::LogVerbatim("HitParentTest") << "HitParentTest::Frequency particle types through the APD "
256  << "(pid/frequency):";
257  for (unsigned i = 0; i < sorted_pids.size(); ++i) {
258  int pid = sorted_pids[i];
259  edm::LogVerbatim("HitParentTest") << " pid " << std::setw(6) << pid << ": count " << std::setw(6)
260  << particle_type_count[pid];
261  }
262 }
263 
264 void HitParentTest::analyzeHits(const std::vector<PCaloHit>& hits,
267  int type) {
268  for (std::vector<PCaloHit>::const_iterator hit_it = hits.begin(); hit_it != hits.end(); ++hit_it) {
269  int id(type), flag(0);
270  if (type == 3) {
271  HcalDetId id_ = HcalDetId(hit_it->id());
272  int subdet = id_.subdet();
273  if (subdet == static_cast<int>(HcalEndcap))
274  id = type + 1;
275  else if (subdet == static_cast<int>(HcalOuter))
276  id = type + 2;
277  else if (subdet == static_cast<int>(HcalForward))
278  id = type + 3;
279  }
280  ++totalHits[id];
281 
282  // get the geant track id
283  int hit_geant_track_id = hit_it->geantTrackId();
284 
285  if (hit_geant_track_id <= 0) {
286  ++noParent[id];
287  flag = 1;
288  } else {
289  bool found = false;
290  flag = 2;
291  // check whether this id is actually there in the list of simtracks
292  for (edm::SimTrackContainer::const_iterator simTrkItr = simTk->begin(); simTrkItr != simTk->end() && !found;
293  ++simTrkItr) {
294  if (hit_geant_track_id == (int)(simTrkItr->trackId())) {
295  found = true;
296  flag = 3;
297  bool match = validSimTrack(simTk, simVtx, hit_geant_track_id, simTrkItr);
298 
299  edm::LogVerbatim("HitParentTest")
300  << "[" << detector[type] << "] Match = " << match << " hit_geant_track_id=" << hit_geant_track_id
301  << " particle id=" << simTrkItr->type();
302 
303  if (!match) {
304  edm::LogVerbatim("HitParentTest") << "NO MATCH FOUND !";
305  ++noGenParticle[id];
306  }
307 
308  // beam pipe...
309  int pid = simTrkItr->type();
310  math::XYZTLorentzVectorD oldest_parent_vertex = getOldestParentVertex(simTk, simVtx, simTrkItr);
311 
312  edm::SimTrackContainer::const_iterator oldest_parent_track = parentSimTrack(simTk, simVtx, simTrkItr);
313 
314  edm::LogVerbatim("HitParentTest")
315  << "[" << detector[type] << "] Hit pid = " << pid << " hit track id = " << hit_geant_track_id
316  << " Oldest Parent's Vertex: " << oldest_parent_vertex << " rho = " << oldest_parent_vertex.Rho()
317  << " Oldest Parent's pid: " << oldest_parent_track->type()
318  << " Oldest Parent's track id: " << oldest_parent_track->trackId()
319  << "\nHit vertex index: " << simTrkItr->vertIndex() << " (tot #vertices: " << simVtx->size() << ")"
320  << "\nHit vertex parent track: " << (*simVtx)[simTrkItr->vertIndex()].parentIndex()
321  << " present=" << simTrackPresent(simTk, (*simVtx)[simTrkItr->vertIndex()].parentIndex());
322  if (histos) {
323  hitRho[id]->Fill(oldest_parent_vertex.Rho());
324  hitZ[id]->Fill(oldest_parent_vertex.Z());
325  }
326  } // a match was found
327  } // geant track id found in simtracks
328 
329  if (!found)
330  ++noSimTrack[id];
331  } // hits with a valid SimTrack Id
332  if (histos)
333  hitType[id]->Fill((double)(flag));
334  } // loop over all calohits (of the given depth)
335 }
336 
337 void HitParentTest::analyzeAPDHits(const std::vector<PCaloHit>& hits,
340  int depth) {
341  for (std::vector<PCaloHit>::const_iterator hit_it = hits.begin(); hit_it != hits.end(); ++hit_it) {
342  if (hit_it->depth() == depth) {
343  ++total_num_apd_hits_seen[depth - 1];
344 
345  // get the geant track id
346  int hit_geant_track_id = hit_it->geantTrackId();
347 
348  if (hit_geant_track_id <= 0) {
349  ++num_apd_hits_no_parent[depth - 1];
350  } else {
351  bool found = false;
352  // check whether this id is actually there in the list of simtracks
353  for (edm::SimTrackContainer::const_iterator simTrkItr = simTk->begin(); simTrkItr != simTk->end() && !found;
354  ++simTrkItr) {
355  if (hit_geant_track_id == (int)(simTrkItr->trackId())) {
356  found = true;
357  bool match = validSimTrack(simTk, simVtx, hit_geant_track_id, simTrkItr);
358 
359  edm::LogVerbatim("HitParentTest")
360  << "APDHIT Match = " << match << " hit_geant_track_id = " << hit_geant_track_id
361  << " particle id=" << simTrkItr->type();
362 
363  if (!match) {
364  edm::LogVerbatim("HitParentTest") << "NO MATCH FOUND !";
365  ++num_apd_hits_no_gen_particle[depth - 1];
366  }
367 
368  int apd_pid = simTrkItr->type();
369  std::map<int, unsigned>::iterator count_it = particle_type_count.find(apd_pid);
370  if (count_it == particle_type_count.end())
371  // first occurence of this particle pid
372  particle_type_count[apd_pid] = 1;
373  else
374  ++count_it->second;
375 
376  //--------------------
377  // check where the oldest parent has its vertex. Should be close to the
378  // beam pipe...
379  math::XYZTLorentzVectorD oldest_parent_vertex = getOldestParentVertex(simTk, simVtx, simTrkItr);
380 
381  edm::SimTrackContainer::const_iterator oldest_parent_track = parentSimTrack(simTk, simVtx, simTrkItr);
382 
383  edm::LogVerbatim("HitParentTest")
384  << "APD hit pid = " << apd_pid << " APD hit track id = " << hit_geant_track_id
385  << " depth = " << hit_it->depth() << " OLDEST PARENT'S VERTEX: " << oldest_parent_vertex
386  << " rho = " << oldest_parent_vertex.Rho() << " OLDEST PARENT'S PID: " << oldest_parent_track->type()
387  << " OLDEST PARENT'S track id: " << oldest_parent_track->trackId() << "\n"
388  << "APD hit vertex index: " << simTrkItr->vertIndex() << " (tot #vertices: " << simVtx->size() << ")"
389  << "\n"
390  << "APD hit vertex parent track: " << (*simVtx)[simTrkItr->vertIndex()].parentIndex()
391  << " present=" << simTrackPresent(simTk, (*simVtx)[simTrkItr->vertIndex()].parentIndex());
392 
393  } // a match was found
394  } // geant track id found in simtracks
395 
396  if (!found)
397  ++num_apd_hits_no_simtrack[depth - 1];
398  } // hits with a valid SimTrack Id
399  } // right depth index
400  } // loop over all calohits (of the given depth)
401 }
402 
404  for (edm::SimTrackContainer::const_iterator simTrkItr = simTk->begin(); simTrkItr != simTk->end(); ++simTrkItr) {
405  if ((int)(simTrkItr->trackId()) == id)
406  return true;
407  }
408  return false;
409 }
410 
413  edm::SimTrackContainer::const_iterator track) {
414  static const math::XYZTLorentzVectorD invalid_vertex(
415  10000, 10000, 10000, 10000); // default value if no valid vertex found
416 
417  edm::SimTrackContainer::const_iterator oldest_parent_track = parentSimTrack(simTk, simVtx, track);
418 
419  int vertex_index = oldest_parent_track->vertIndex();
420 
421  // sanity checks
422  if (vertex_index < 0 || vertex_index >= (int)(simVtx->size()))
423  return invalid_vertex;
424 
425  return (*simVtx)[vertex_index].position();
426 }
427 
428 edm::SimTrackContainer::const_iterator HitParentTest::parentSimTrack(const edm::Handle<edm::SimTrackContainer>& simTk,
430  edm::SimTrackContainer::const_iterator thisTrkItr) {
431  edm::SimTrackContainer::const_iterator itr = simTk->end();
432 
433  int vertIndex = thisTrkItr->vertIndex();
434  int type = thisTrkItr->type();
435  int charge = (int)thisTrkItr->charge();
436  edm::LogVerbatim("HitParentTest") << "SimTrackParent:: " << thisTrkItr->trackId() << " Vertex " << vertIndex
437  << " Type " << type << " Charge " << charge;
438 
439  if (vertIndex == -1)
440  return thisTrkItr;
441  else if (vertIndex >= (int)simVtx->size())
442  return itr;
443 
444  edm::SimVertexContainer::const_iterator simVtxItr = simVtx->begin();
445  for (int iv = 0; iv < vertIndex; iv++)
446  simVtxItr++;
447  int parent = simVtxItr->parentIndex();
448 
449  if (parent < 0 && simVtxItr != simVtx->begin()) {
450  const math::XYZTLorentzVectorD pos1 = simVtxItr->position();
451  for (simVtxItr = simVtx->begin(); simVtxItr != simVtx->end(); ++simVtxItr) {
452  if (simVtxItr->parentIndex() > 0) {
453  const math::XYZTLorentzVectorD pos2 = pos1 - simVtxItr->position();
454  double dist = pos2.P();
455  if (dist < 0.001) {
456  parent = simVtxItr->parentIndex();
457  break;
458  }
459  }
460  }
461  }
462  for (edm::SimTrackContainer::const_iterator simTrkItr = simTk->begin(); simTrkItr != simTk->end(); simTrkItr++) {
463  if ((int)simTrkItr->trackId() == parent && simTrkItr != thisTrkItr)
464  return parentSimTrack(simTk, simVtx, simTrkItr);
465  }
466 
467  return thisTrkItr;
468 }
469 
472  unsigned int simTkId,
473  edm::SimTrackContainer::const_iterator thisTrkItr) {
474  edm::LogVerbatim("HitParentTest") << "Inside validSimTrack: trackId " << thisTrkItr->trackId() << " vtxIndex "
475  << thisTrkItr->vertIndex() << " to be matched to " << simTkId;
476 
477  //This track originates from simTkId
478  if (thisTrkItr->trackId() == simTkId)
479  return true;
480 
481  //Otherwise trace back the history using SimTracks and SimVertices
482  int vertIndex = thisTrkItr->vertIndex();
483  if (vertIndex == -1 || vertIndex >= (int)simVtx->size())
484  return false;
485  edm::SimVertexContainer::const_iterator simVtxItr = simVtx->begin();
486  for (int iv = 0; iv < vertIndex; iv++)
487  simVtxItr++;
488  int parent = simVtxItr->parentIndex();
489  edm::LogVerbatim("HitParentTest") << "validSimTrack:: parent index " << parent << " ";
490  if (parent < 0 && simVtxItr != simVtx->begin()) {
491  const math::XYZTLorentzVectorD pos1 = simVtxItr->position();
492  for (simVtxItr = simVtx->begin(); simVtxItr != simVtx->end(); ++simVtxItr) {
493  if (simVtxItr->parentIndex() > 0) {
494  const math::XYZTLorentzVectorD pos2 = pos1 - simVtxItr->position();
495  double dist = pos2.P();
496  if (dist < 0.001) {
497  parent = simVtxItr->parentIndex();
498  break;
499  }
500  }
501  }
502  }
503  edm::LogVerbatim("HitParentTest") << "HitParentTes::final index " << parent;
504  for (edm::SimTrackContainer::const_iterator simTrkItr = simTk->begin(); simTrkItr != simTk->end(); simTrkItr++) {
505  if ((int)simTrkItr->trackId() == parent && simTrkItr != thisTrkItr)
506  return validSimTrack(simTk, simVtx, simTkId, simTrkItr);
507  }
508 
509  return false;
510 }
511 
512 //define this as a plug-in
RunNumber_t run() const
Definition: EventID.h:38
static const std::string kSharedResource
Definition: TFileService.h:76
Log< level::Info, true > LogVerbatim
EventNumber_t event() const
Definition: EventID.h:40
void beginJob() override
bool simTrackPresent(const edm::Handle< edm::SimTrackContainer > &, int id)
std::vector< PCaloHit > PCaloHitContainer
const edm::EventSetup & c
void analyzeHits(const std::vector< PCaloHit > &, const edm::Handle< edm::SimTrackContainer > &, const edm::Handle< edm::SimVertexContainer > &, int type)
TH1F * hitRho[7]
int32_t *__restrict__ iv
ROOT::Math::LorentzVector< ROOT::Math::PxPyPzE4D< double > > XYZTLorentzVectorD
Lorentz vector with cylindrical internal representation using pseudorapidity.
Definition: LorentzVector.h:14
ParameterDescriptionBase * addUntracked(U const &iLabel, T const &value)
uint16_t *__restrict__ id
edm::SimTrackContainer::const_iterator parentSimTrack(const edm::Handle< edm::SimTrackContainer > &, const edm::Handle< edm::SimVertexContainer > &, edm::SimTrackContainer::const_iterator thisTrkItr)
unsigned int noGenParticle[7]
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
bool validSimTrack(const edm::Handle< edm::SimTrackContainer > &, const edm::Handle< edm::SimVertexContainer > &, unsigned int simTkId, edm::SimTrackContainer::const_iterator thisTrkItr)
bool operator()(int pid1, int pid2) const
const edm::EDGetTokenT< edm::PCaloHitContainer > tok_eb_
unsigned int num_apd_hits_no_simtrack[2]
const std::map< int, unsigned > & particle_type_count
unsigned int noSimTrack[7]
T * make(const Args &...args) const
make new ROOT object
Definition: TFileService.h:64
std::string detector[7]
unsigned int noParent[7]
const std::string hitLabES_
constexpr HcalSubdetector subdet() const
get the subdetector
Definition: HcalDetId.h:138
Handle< PROD > getHandle(EDGetTokenT< PROD > token) const
Definition: Event.h:563
unsigned int num_apd_hits_no_gen_particle[2]
void analyze(const edm::Event &e, const edm::EventSetup &c) override
const std::string sourceLabel
const std::string hitLabEE_
TH1F * hitZ[7]
const edm::EDGetTokenT< edm::SimVertexContainer > tok_vtx_
const edm::EDGetTokenT< edm::PCaloHitContainer > tok_hc_
void endRun(edm::Run const &, edm::EventSetup const &) override
bool isAvailable() const
Definition: Service.h:40
std::map< int, unsigned > particle_type_count
HitParentTest(const edm::ParameterSet &ps)
bool isValid() const
Definition: HandleBase.h:70
unsigned int num_apd_hits_no_parent[2]
const edm::EDGetTokenT< edm::PCaloHitContainer > tok_es_
const edm::EDGetTokenT< edm::SimTrackContainer > tok_tk_
HitParentTestComparison(const std::map< int, unsigned > &_particle_type_count)
const std::string g4Label_
std::vector< SimVertex > SimVertexContainer
void beginRun(edm::Run const &, edm::EventSetup const &) override
void add(std::string const &label, ParameterSetDescription const &psetDescription)
unsigned int total_num_apd_hits_seen[2]
edm::EventID id() const
Definition: EventBase.h:59
TH1F * hitType[7]
const edm::EDGetTokenT< edm::PCaloHitContainer > tok_ee_
unsigned int totalHits[7]
std::pair< typename Association::data_type::first_type, double > match(Reference key, Association association, bool bestMatchByMaxValue)
Generic matching function.
Definition: Utils.h:10
tuple tfile
Definition: compare.py:324
void endJob() override
math::XYZTLorentzVectorD getOldestParentVertex(const edm::Handle< edm::SimTrackContainer > &, const edm::Handle< edm::SimVertexContainer > &, edm::SimTrackContainer::const_iterator track)
~HitParentTest() override
std::vector< SimTrack > SimTrackContainer
const std::string hitLabHC_
void analyzeAPDHits(const std::vector< PCaloHit > &, const edm::Handle< edm::SimTrackContainer > &, const edm::Handle< edm::SimVertexContainer > &, int depth)
Definition: Run.h:45
const std::string hitLabEB_
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)