CMS 3D CMS Logo

PFAnalysisNtuplizer.cc
Go to the documentation of this file.
1 // Based on RecoNtuple/HGCalAnalysis with modifications for PF
2 //
3 // user include files
6 
10 
12 
38 
42 
48 
50 #include "Math/Transform3D.h"
55 
58 #include "TH1F.h"
59 #include "TVector2.h"
60 #include "TTree.h"
61 
62 #include <map>
63 #include <set>
64 #include <string>
65 #include <vector>
66 #include <set>
67 
68 using namespace std;
69 
71 public:
73  size_t idx_block;
74  size_t idx_elem;
75  ElementWithIndex(const reco::PFBlockElement& _orig, size_t _idx_block, size_t _idx_elem)
76  : orig(_orig), idx_block(_idx_block), idx_elem(_idx_elem){};
77 };
78 
79 vector<int> find_element_ref(const vector<ElementWithIndex>& vec, const edm::RefToBase<reco::Track>& r) {
80  vector<int> ret;
81  for (unsigned int i = 0; i < vec.size(); i++) {
82  const auto& elem = vec.at(i);
83  if (elem.orig.type() == reco::PFBlockElement::TRACK) {
84  const auto& ref = elem.orig.trackRef();
85  if (ref.isNonnull() && ref->extra().isNonnull()) {
86  if (ref.key() == r.key()) {
87  ret.push_back(i);
88  }
89  }
90  } else if (elem.orig.type() == reco::PFBlockElement::GSF) {
91  const auto& ref = ((const reco::PFBlockElementGsfTrack*)&elem.orig)->clusterRef();
92  if (ref.isNonnull()) {
93  if (ref.key() == r.key()) {
94  ret.push_back(i);
95  }
96  }
97  } else if (elem.orig.type() == reco::PFBlockElement::BREM) {
98  const auto& ref = ((const reco::PFBlockElementBrem*)&elem.orig)->clusterRef();
99  if (ref.isNonnull()) {
100  if (ref.key() == r.key()) {
101  ret.push_back(i);
102  }
103  }
104  }
105  }
106  return ret;
107 }
108 
109 double detid_compare(const map<uint64_t, double>& rechits, const map<uint64_t, double>& simhits) {
110  double ret = 0.0;
111 
112  for (const auto& rh : rechits) {
113  for (const auto& sh : simhits) {
114  if (rh.first == sh.first) {
115  //rechit energy times simhit fraction
116  ret += rh.second * sh.second;
117  break;
118  }
119  }
120  }
121  return ret;
122 }
123 
124 class PFAnalysis : public edm::one::EDAnalyzer<edm::one::WatchRuns, edm::one::SharedResources> {
125 public:
127 
128  PFAnalysis();
129  explicit PFAnalysis(const edm::ParameterSet&);
130  ~PFAnalysis() override;
131 
132  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
133  void beginRun(edm::Run const& iEvent, edm::EventSetup const&) override;
134  void endRun(edm::Run const& iEvent, edm::EventSetup const&) override;
135 
136 private:
137  void beginJob() override;
138  void analyze(const edm::Event&, const edm::EventSetup&) override;
139  void endJob() override;
140 
141  void processTrackingParticles(const edm::View<TrackingParticle>& trackingParticles,
142  edm::Handle<edm::View<TrackingParticle>>& trackingParticlesHandle);
143 
144  pair<vector<ElementWithIndex>, vector<tuple<int, int, float>>> processBlocks(
145  const std::vector<reco::PFBlock>& pfBlocks);
146 
147  void associateClusterToSimCluster(const vector<ElementWithIndex>& all_elements);
148 
149  void clearVariables();
150 
151  GlobalPoint getHitPosition(const DetId& id);
152  // ----------member data ---------------------------
153 
161 
162  TTree* t_;
163 
167 
168  vector<float> trackingparticle_eta_;
169  vector<float> trackingparticle_phi_;
170  vector<float> trackingparticle_pt_;
171  vector<float> trackingparticle_px_;
172  vector<float> trackingparticle_py_;
173  vector<float> trackingparticle_pz_;
175  vector<float> trackingparticle_dvx_;
176  vector<float> trackingparticle_dvy_;
177  vector<float> trackingparticle_dvz_;
178  vector<int> trackingparticle_bx_;
179  vector<int> trackingparticle_ev_;
180  vector<float> trackingparticle_ovx_;
181  vector<float> trackingparticle_ovy_;
182  vector<float> trackingparticle_ovz_;
183  vector<float> trackingparticle_exx_;
184  vector<float> trackingparticle_exy_;
187 
188  vector<float> simcluster_eta_;
189  vector<float> simcluster_phi_;
190  vector<float> simcluster_pt_;
191  vector<float> simcluster_energy_;
192  vector<float> simcluster_px_;
193  vector<float> simcluster_py_;
194  vector<float> simcluster_pz_;
195  vector<int> simcluster_bx_;
196  vector<int> simcluster_ev_;
197  vector<int> simcluster_pid_;
199  vector<int> simcluster_nhits_;
200  vector<std::map<uint64_t, double>> simcluster_detids_;
201 
202  vector<float> simhit_frac_;
203  vector<float> simhit_x_;
204  vector<float> simhit_y_;
205  vector<float> simhit_z_;
206  vector<float> simhit_eta_;
207  vector<float> simhit_phi_;
208  vector<int> simhit_det_;
209  vector<int> simhit_subdet_;
211  vector<uint64_t> simhit_detid_;
212 
213  vector<float> rechit_e_;
214  vector<float> rechit_x_;
215  vector<float> rechit_y_;
216  vector<float> rechit_z_;
217  vector<float> rechit_det_;
218  vector<float> rechit_subdet_;
219  vector<float> rechit_eta_;
220  vector<float> rechit_phi_;
221  vector<int> rechit_idx_element_;
222  vector<uint64_t> rechit_detid_;
223 
224  vector<float> simtrack_x_;
225  vector<float> simtrack_y_;
226  vector<float> simtrack_z_;
228  vector<int> simtrack_pid_;
229 
230  vector<float> gen_eta_;
231  vector<float> gen_phi_;
232  vector<float> gen_pt_;
233  vector<float> gen_px_;
234  vector<float> gen_py_;
235  vector<float> gen_pz_;
236  vector<float> gen_energy_;
237  vector<int> gen_charge_;
238  vector<int> gen_pdgid_;
239  vector<int> gen_status_;
240  vector<vector<int>> gen_daughters_;
241 
242  vector<float> element_pt_;
243  vector<float> element_px_;
244  vector<float> element_py_;
245  vector<float> element_pz_;
246  vector<float> element_deltap_;
247  vector<float> element_sigmadeltap_;
248  vector<float> element_eta_;
249  vector<float> element_phi_;
250  vector<float> element_energy_;
251  vector<float> element_corr_energy_;
252  vector<float> element_eta_ecal_;
253  vector<float> element_phi_ecal_;
254  vector<float> element_eta_hcal_;
255  vector<float> element_phi_hcal_;
256  vector<int> element_charge_;
257  vector<int> element_type_;
258  vector<int> element_layer_;
259  vector<float> element_depth_;
260  vector<float> element_trajpoint_;
261  vector<float> element_muon_dt_hits_;
262  vector<float> element_muon_csc_hits_;
263  vector<float> element_muon_type_;
264  vector<float> element_cluster_flags_;
266  vector<float> element_num_hits_;
267 
268  vector<int> element_distance_i_;
269  vector<int> element_distance_j_;
270  vector<float> element_distance_d_;
271 
272  vector<float> pfcandidate_eta_;
273  vector<float> pfcandidate_phi_;
274  vector<float> pfcandidate_pt_;
275  vector<float> pfcandidate_px_;
276  vector<float> pfcandidate_py_;
277  vector<float> pfcandidate_pz_;
278  vector<float> pfcandidate_energy_;
279  vector<int> pfcandidate_pdgid_;
280 
281  vector<pair<int, int>> trackingparticle_to_element;
282  vector<pair<int, int>> simcluster_to_element;
284  vector<pair<int, int>> element_to_candidate;
285 
286  // and also the magnetic field
288 
293 
297 
298  bool saveHits;
299 };
300 
302 
304  tracks_recotosim_ = consumes<reco::RecoToSimCollection>(edm::InputTag("trackingParticleRecoTrackAsssociation"));
305  trackingParticles_ = consumes<edm::View<TrackingParticle>>(edm::InputTag("mix", "MergedTrackTruth"));
306  caloParticles_ = consumes<edm::View<CaloParticle>>(edm::InputTag("mix", "MergedCaloTruth"));
307  genParticles_ = consumes<std::vector<reco::GenParticle>>(edm::InputTag("genParticles"));
308  pfBlocks_ = consumes<std::vector<reco::PFBlock>>(edm::InputTag("particleFlowBlock"));
309  pfCandidates_ = consumes<std::vector<reco::PFCandidate>>(edm::InputTag("particleFlow"));
310  tracks_ = consumes<edm::View<reco::Track>>(edm::InputTag("generalTracks"));
311  saveHits = iConfig.getUntrackedParameter<bool>("saveHits", false);
312 
313  geometryToken_ = esConsumes<CaloGeometry, CaloGeometryRecord>(edm::ESInputTag{});
314  topologyToken_ = esConsumes<HcalTopology, HcalRecNumberingRecord>(edm::ESInputTag{});
315  magFieldToken_ = esConsumes<edm::Transition::BeginRun>();
316  hcalDDDrecToken_ = esConsumes<edm::Transition::BeginRun>();
317 
318  usesResource(TFileService::kSharedResource);
320  fs->make<TH1F>("total", "total", 100, 0, 5.);
321 
322  t_ = fs->make<TTree>("pftree", "pftree");
323 
324  // event info
325  t_->Branch("event", &ev_event_);
326  t_->Branch("lumi", &ev_lumi_);
327  t_->Branch("run", &ev_run_);
328 
329  t_->Branch("trackingparticle_eta", &trackingparticle_eta_);
330  t_->Branch("trackingparticle_phi", &trackingparticle_phi_);
331  t_->Branch("trackingparticle_pt", &trackingparticle_pt_);
332  t_->Branch("trackingparticle_px", &trackingparticle_px_);
333  t_->Branch("trackingparticle_py", &trackingparticle_py_);
334  t_->Branch("trackingparticle_pz", &trackingparticle_pz_);
335  t_->Branch("trackingparticle_energy", &trackingparticle_energy_);
336  t_->Branch("trackingparticle_dvx", &trackingparticle_dvx_);
337  t_->Branch("trackingparticle_dvy", &trackingparticle_dvy_);
338  t_->Branch("trackingparticle_dvz", &trackingparticle_dvz_);
339  t_->Branch("trackingparticle_bx", &trackingparticle_bx_);
340  t_->Branch("trackingparticle_ev", &trackingparticle_ev_);
341  t_->Branch("trackingparticle_pid", &trackingparticle_pid_);
342 
343  t_->Branch("simcluster_eta", &simcluster_eta_);
344  t_->Branch("simcluster_phi", &simcluster_phi_);
345  t_->Branch("simcluster_pt", &simcluster_pt_);
346  t_->Branch("simcluster_px", &simcluster_px_);
347  t_->Branch("simcluster_py", &simcluster_py_);
348  t_->Branch("simcluster_pz", &simcluster_pz_);
349  t_->Branch("simcluster_energy", &simcluster_energy_);
350  t_->Branch("simcluster_bx", &simcluster_bx_);
351  t_->Branch("simcluster_ev", &simcluster_ev_);
352  t_->Branch("simcluster_pid", &simcluster_pid_);
353  t_->Branch("simcluster_idx_trackingparticle", &simcluster_idx_trackingparticle_);
354  t_->Branch("simcluster_nhits", &simcluster_nhits_);
355 
356  if (saveHits) {
357  t_->Branch("simhit_frac", &simhit_frac_);
358  t_->Branch("simhit_x", &simhit_x_);
359  t_->Branch("simhit_y", &simhit_y_);
360  t_->Branch("simhit_z", &simhit_z_);
361  t_->Branch("simhit_det", &simhit_det_);
362  t_->Branch("simhit_subdet", &simhit_subdet_);
363  t_->Branch("simhit_eta", &simhit_eta_);
364  t_->Branch("simhit_phi", &simhit_phi_);
365  t_->Branch("simhit_idx_simcluster", &simhit_idx_simcluster_);
366  t_->Branch("simhit_detid", &simhit_detid_);
367 
368  t_->Branch("rechit_e", &rechit_e_);
369  t_->Branch("rechit_x", &rechit_x_);
370  t_->Branch("rechit_y", &rechit_y_);
371  t_->Branch("rechit_z", &rechit_z_);
372  t_->Branch("rechit_det", &rechit_det_);
373  t_->Branch("rechit_subdet", &rechit_subdet_);
374  t_->Branch("rechit_eta", &rechit_eta_);
375  t_->Branch("rechit_phi", &rechit_phi_);
376  t_->Branch("rechit_idx_element", &rechit_idx_element_);
377  t_->Branch("rechit_detid", &rechit_detid_);
378  }
379 
380  t_->Branch("simtrack_x", &simtrack_x_);
381  t_->Branch("simtrack_y", &simtrack_y_);
382  t_->Branch("simtrack_z", &simtrack_z_);
383  t_->Branch("simtrack_idx_simcluster_", &simtrack_idx_simcluster_);
384  t_->Branch("simtrack_pid", &simtrack_pid_);
385 
386  t_->Branch("gen_eta", &gen_eta_);
387  t_->Branch("gen_phi", &gen_phi_);
388  t_->Branch("gen_pt", &gen_pt_);
389  t_->Branch("gen_px", &gen_px_);
390  t_->Branch("gen_py", &gen_py_);
391  t_->Branch("gen_pz", &gen_pz_);
392  t_->Branch("gen_energy", &gen_energy_);
393  t_->Branch("gen_charge", &gen_charge_);
394  t_->Branch("gen_pdgid", &gen_pdgid_);
395  t_->Branch("gen_status", &gen_status_);
396  t_->Branch("gen_daughters", &gen_daughters_);
397 
398  //PF Elements
399  t_->Branch("element_pt", &element_pt_);
400  t_->Branch("element_px", &element_px_);
401  t_->Branch("element_py", &element_py_);
402  t_->Branch("element_pz", &element_pz_);
403  t_->Branch("element_deltap", &element_deltap_);
404  t_->Branch("element_sigmadeltap", &element_sigmadeltap_);
405  t_->Branch("element_eta", &element_eta_);
406  t_->Branch("element_phi", &element_phi_);
407  t_->Branch("element_energy", &element_energy_);
408  t_->Branch("element_corr_energy", &element_corr_energy_);
409  t_->Branch("element_eta_ecal", &element_eta_ecal_);
410  t_->Branch("element_phi_ecal", &element_phi_ecal_);
411  t_->Branch("element_eta_hcal", &element_eta_hcal_);
412  t_->Branch("element_phi_hcal", &element_phi_hcal_);
413  t_->Branch("element_charge", &element_charge_);
414  t_->Branch("element_type", &element_type_);
415  t_->Branch("element_layer", &element_layer_);
416  t_->Branch("element_depth", &element_depth_);
417  t_->Branch("element_trajpoint", &element_trajpoint_);
418  t_->Branch("element_muon_dt_hits", &element_muon_dt_hits_);
419  t_->Branch("element_muon_csc_hits", &element_muon_csc_hits_);
420  t_->Branch("element_muon_type", &element_muon_type_);
421  t_->Branch("element_cluster_flags", &element_cluster_flags_);
422  t_->Branch("element_gsf_electronseed_trkorecal", &element_gsf_electronseed_trkorecal_);
423  t_->Branch("element_num_hits", &element_num_hits_);
424 
425  //Distance matrix between PF elements
426  t_->Branch("element_distance_i", &element_distance_i_);
427  t_->Branch("element_distance_j", &element_distance_j_);
428  t_->Branch("element_distance_d", &element_distance_d_);
429 
430  t_->Branch("pfcandidate_eta", &pfcandidate_eta_);
431  t_->Branch("pfcandidate_phi", &pfcandidate_phi_);
432  t_->Branch("pfcandidate_pt", &pfcandidate_pt_);
433  t_->Branch("pfcandidate_px", &pfcandidate_px_);
434  t_->Branch("pfcandidate_py", &pfcandidate_py_);
435  t_->Branch("pfcandidate_pz", &pfcandidate_pz_);
436  t_->Branch("pfcandidate_energy", &pfcandidate_energy_);
437  t_->Branch("pfcandidate_pdgid", &pfcandidate_pdgid_);
438 
439  //Links between reco, gen and PFCandidate objects
440  t_->Branch("trackingparticle_to_element", &trackingparticle_to_element);
441  t_->Branch("simcluster_to_element", &simcluster_to_element);
442  t_->Branch("simcluster_to_element_cmp", &simcluster_to_element_cmp);
443  t_->Branch("element_to_candidate", &element_to_candidate);
444 } // constructor
445 
447 
449  ev_run_ = 0;
450  ev_lumi_ = 0;
451  ev_event_ = 0;
452 
453  trackingparticle_to_element.clear();
454  simcluster_to_element.clear();
455  simcluster_to_element_cmp.clear();
456  element_to_candidate.clear();
457 
458  trackingparticle_eta_.clear();
459  trackingparticle_phi_.clear();
460  trackingparticle_pt_.clear();
461  trackingparticle_px_.clear();
462  trackingparticle_py_.clear();
463  trackingparticle_pz_.clear();
464  trackingparticle_energy_.clear();
465  trackingparticle_dvx_.clear();
466  trackingparticle_dvy_.clear();
467  trackingparticle_dvz_.clear();
468  trackingparticle_bx_.clear();
469  trackingparticle_ev_.clear();
470  trackingparticle_ovx_.clear();
471  trackingparticle_ovy_.clear();
472  trackingparticle_ovz_.clear();
473  trackingparticle_exx_.clear();
474  trackingparticle_exy_.clear();
475  trackingparticle_mother_.clear();
476  trackingparticle_pid_.clear();
477 
478  simcluster_eta_.clear();
479  simcluster_phi_.clear();
480  simcluster_pt_.clear();
481  simcluster_energy_.clear();
482  simcluster_pid_.clear();
483  simcluster_detids_.clear();
484  simcluster_bx_.clear();
485  simcluster_ev_.clear();
486  simcluster_px_.clear();
487  simcluster_py_.clear();
488  simcluster_pz_.clear();
489  simcluster_idx_trackingparticle_.clear();
490  simcluster_nhits_.clear();
491 
492  if (saveHits) {
493  simhit_frac_.clear();
494  simhit_x_.clear();
495  simhit_y_.clear();
496  simhit_z_.clear();
497  simhit_det_.clear();
498  simhit_subdet_.clear();
499  simhit_eta_.clear();
500  simhit_phi_.clear();
501  simhit_idx_simcluster_.clear();
502  simhit_detid_.clear();
503 
504  rechit_e_.clear();
505  rechit_x_.clear();
506  rechit_y_.clear();
507  rechit_z_.clear();
508  rechit_det_.clear();
509  rechit_subdet_.clear();
510  rechit_eta_.clear();
511  rechit_phi_.clear();
512  rechit_idx_element_.clear();
513  rechit_detid_.clear();
514  }
515 
516  simtrack_x_.clear();
517  simtrack_y_.clear();
518  simtrack_z_.clear();
519  simtrack_idx_simcluster_.clear();
520  simtrack_pid_.clear();
521 
522  gen_eta_.clear();
523  gen_phi_.clear();
524  gen_pt_.clear();
525  gen_px_.clear();
526  gen_py_.clear();
527  gen_pz_.clear();
528  gen_energy_.clear();
529  gen_charge_.clear();
530  gen_pdgid_.clear();
531  gen_status_.clear();
532  gen_daughters_.clear();
533 
534  element_pt_.clear();
535  element_px_.clear();
536  element_py_.clear();
537  element_pz_.clear();
538  element_deltap_.clear();
539  element_sigmadeltap_.clear();
540  element_eta_.clear();
541  element_phi_.clear();
542  element_energy_.clear();
543  element_corr_energy_.clear();
544  element_eta_ecal_.clear();
545  element_phi_ecal_.clear();
546  element_eta_hcal_.clear();
547  element_phi_hcal_.clear();
548  element_charge_.clear();
549  element_type_.clear();
550  element_layer_.clear();
551  element_depth_.clear();
552  element_trajpoint_.clear();
553  element_muon_dt_hits_.clear();
554  element_muon_csc_hits_.clear();
555  element_muon_type_.clear();
556  element_cluster_flags_.clear();
557  element_gsf_electronseed_trkorecal_.clear();
558  element_num_hits_.clear();
559 
560  element_distance_i_.clear();
561  element_distance_j_.clear();
562  element_distance_d_.clear();
563 
564  pfcandidate_eta_.clear();
565  pfcandidate_phi_.clear();
566  pfcandidate_pt_.clear();
567  pfcandidate_px_.clear();
568  pfcandidate_py_.clear();
569  pfcandidate_pz_.clear();
570  pfcandidate_energy_.clear();
571  pfcandidate_pdgid_.clear();
572 
573 } //clearVariables
574 
577 
578  bool present = false;
579  if (((id.det() == DetId::Ecal &&
580  (id.subdetId() == EcalBarrel || id.subdetId() == EcalEndcap || id.subdetId() == EcalPreshower)) ||
581  (id.det() == DetId::Hcal && (id.subdetId() == HcalBarrel || id.subdetId() == HcalEndcap ||
582  id.subdetId() == HcalForward || id.subdetId() == HcalOuter)))) {
583  const CaloSubdetectorGeometry* geom_sd(geom->getSubdetectorGeometry(id.det(), id.subdetId()));
584  present = geom_sd->present(id);
585  if (present) {
586  const auto& cell = geom_sd->getGeometry(id);
587  ret = GlobalPoint(cell->getPosition());
588  }
589  }
590  return ret;
591 }
592 
594  clearVariables();
595 
596  auto& pG = iSetup.getData(geometryToken_);
597  geom = (CaloGeometry*)&pG;
598  auto& pT = iSetup.getData(topologyToken_);
599  hcal_topo = (HcalTopology*)&pT;
600 
601  //Simulated tracks, cleaned up by TrackingTruthAccumulator
602  edm::Handle<edm::View<TrackingParticle>> trackingParticlesHandle;
603  iEvent.getByToken(trackingParticles_, trackingParticlesHandle);
604  const edm::View<TrackingParticle>& trackingParticles = *trackingParticlesHandle;
605 
606  edm::Handle<edm::View<CaloParticle>> caloParticlesHandle;
607  iEvent.getByToken(caloParticles_, caloParticlesHandle);
608  const edm::View<CaloParticle>& caloParticles = *caloParticlesHandle;
609 
610  //Matches reco tracks to sim tracks (TrackingParticle)
611  edm::Handle<reco::RecoToSimCollection> recotosimCollection;
612  iEvent.getByToken(tracks_recotosim_, recotosimCollection);
613  const auto recotosim = *recotosimCollection;
614 
616  iEvent.getByToken(tracks_, trackHandle);
617  const edm::View<reco::Track>& tracks = *trackHandle;
618 
619  edm::Handle<std::vector<reco::GenParticle>> genParticlesHandle;
620  iEvent.getByToken(genParticles_, genParticlesHandle);
621  for (std::vector<reco::GenParticle>::const_iterator it_p = genParticlesHandle->begin();
622  it_p != genParticlesHandle->end();
623  ++it_p) {
624  gen_eta_.push_back(it_p->eta());
625  gen_phi_.push_back(it_p->phi());
626  gen_pt_.push_back(it_p->pt());
627  gen_px_.push_back(it_p->px());
628  gen_py_.push_back(it_p->py());
629  gen_pz_.push_back(it_p->pz());
630  gen_energy_.push_back(it_p->energy());
631  gen_charge_.push_back(it_p->charge());
632  gen_pdgid_.push_back(it_p->pdgId());
633  gen_status_.push_back(it_p->status());
634  std::vector<int> daughters(it_p->daughterRefVector().size(), 0);
635  for (unsigned j = 0; j < it_p->daughterRefVector().size(); ++j) {
636  daughters[j] = static_cast<int>(it_p->daughterRefVector().at(j).key());
637  }
638  gen_daughters_.push_back(daughters);
639  }
640 
641  edm::Handle<std::vector<reco::PFCandidate>> pfCandidatesHandle;
642  iEvent.getByToken(pfCandidates_, pfCandidatesHandle);
643  std::vector<reco::PFCandidate> pfCandidates = *pfCandidatesHandle;
644 
646  iEvent.getByToken(pfBlocks_, pfBlocksHandle);
647  std::vector<reco::PFBlock> pfBlocks = *pfBlocksHandle;
648 
649  //Collect all clusters, tracks and superclusters
650  const auto& all_elements_distances = processBlocks(pfBlocks);
651  const auto& all_elements = all_elements_distances.first;
652  const auto& all_distances = all_elements_distances.second;
653  assert(!all_elements.empty());
654  //assert(all_distances.size() > 0);
655  for (const auto& d : all_distances) {
656  element_distance_i_.push_back(get<0>(d));
657  element_distance_j_.push_back(get<1>(d));
658  element_distance_d_.push_back(get<2>(d));
659  }
660 
661  //We need to use the original reco::Track collection for track association
662  for (unsigned long ntrack = 0; ntrack < tracks.size(); ntrack++) {
663  edm::RefToBase<reco::Track> trackref(trackHandle, ntrack);
664  const auto vec_idx_in_all_elements = find_element_ref(all_elements, trackref);
665 
666  //track was not used by PF, we skip as well
667  if (vec_idx_in_all_elements.empty()) {
668  continue;
669  }
670 
671  if (recotosim.find(trackref) != recotosim.end()) {
672  const auto& tps = recotosim[trackref];
673  for (const auto& tp : tps) {
675  for (auto idx_in_all_elements : vec_idx_in_all_elements) {
676  trackingparticle_to_element.emplace_back(tpr.key(), idx_in_all_elements);
677  }
678  }
679  }
680  }
681 
682  processTrackingParticles(trackingParticles, trackingParticlesHandle);
683 
684  int idx_simcluster = 0;
685  //Fill genparticles from calorimeter hits
686  for (unsigned long ncaloparticle = 0; ncaloparticle < caloParticles.size(); ncaloparticle++) {
687  const auto& cp = caloParticles.at(ncaloparticle);
688  edm::RefToBase<CaloParticle> cpref(caloParticlesHandle, ncaloparticle);
689 
690  int nhits = 0;
691  for (const auto& simcluster : cp.simClusters()) {
692  //create a map of detId->energy of all the rechits in all the clusters of this SimCluster
693  map<uint64_t, double> detid_energy;
694 
695  simcluster_nhits_.push_back(nhits);
696  simcluster_eta_.push_back(simcluster->p4().eta());
697  simcluster_phi_.push_back(simcluster->p4().phi());
698  simcluster_pt_.push_back(simcluster->p4().pt());
699  simcluster_energy_.push_back(simcluster->energy());
700  simcluster_pid_.push_back(simcluster->pdgId());
701  simcluster_bx_.push_back(simcluster->eventId().bunchCrossing());
702  simcluster_ev_.push_back(simcluster->eventId().event());
703 
704  simcluster_px_.push_back(simcluster->p4().x());
705  simcluster_py_.push_back(simcluster->p4().y());
706  simcluster_pz_.push_back(simcluster->p4().z());
707 
708  for (const auto& hf : simcluster->hits_and_fractions()) {
709  DetId id(hf.first);
710 
711  if (id.det() == DetId::Hcal || id.det() == DetId::Ecal) {
712  const auto& pos = getHitPosition(id);
713  nhits += 1;
714 
715  const float x = pos.x();
716  const float y = pos.y();
717  const float z = pos.z();
718  const float eta = pos.eta();
719  const float phi = pos.phi();
720 
721  simhit_frac_.push_back(hf.second);
722  simhit_x_.push_back(x);
723  simhit_y_.push_back(y);
724  simhit_z_.push_back(z);
725  simhit_det_.push_back(id.det());
726  simhit_subdet_.push_back(id.subdetId());
727  simhit_eta_.push_back(eta);
728  simhit_phi_.push_back(phi);
729  simhit_idx_simcluster_.push_back(idx_simcluster);
730  simhit_detid_.push_back(id.rawId());
731  detid_energy[id.rawId()] += hf.second;
732  }
733  }
734 
735  int simcluster_to_trackingparticle = -1;
736  for (const auto& simtrack : simcluster->g4Tracks()) {
737  simtrack_x_.push_back(simtrack.trackerSurfacePosition().x());
738  simtrack_y_.push_back(simtrack.trackerSurfacePosition().y());
739  simtrack_z_.push_back(simtrack.trackerSurfacePosition().z());
740  simtrack_idx_simcluster_.push_back(idx_simcluster);
741  simtrack_pid_.push_back(simtrack.type());
742 
743  for (unsigned int itp = 0; itp < trackingParticles.size(); itp++) {
744  const auto& simtrack2 = trackingParticles.at(itp).g4Tracks().at(0);
745  //compare the two tracks, taking into account that both eventId and trackId need to be compared due to pileup
746  if (simtrack.eventId() == simtrack2.eventId() && simtrack.trackId() == simtrack2.trackId()) {
747  simcluster_to_trackingparticle = itp;
748  //we are satisfied with the first match, in practice there should not be more
749  break;
750  }
751  } //trackingParticles
752  } //simcluster tracks
753 
754  simcluster_detids_.push_back(detid_energy);
755  simcluster_idx_trackingparticle_.push_back(simcluster_to_trackingparticle);
756 
757  idx_simcluster += 1;
758  } //simclusters
759  } //caloParticles
760 
761  associateClusterToSimCluster(all_elements);
762 
763  //fill elements
764  for (unsigned int ielem = 0; ielem < all_elements.size(); ielem++) {
765  const auto& elem = all_elements.at(ielem);
766  const auto& orig = elem.orig;
767  reco::PFBlockElement::Type type = orig.type();
768 
769  float pt = 0.0;
770  float deltap = 0.0;
771  float sigmadeltap = 0.0;
772  float px = 0.0;
773  float py = 0.0;
774  float pz = 0.0;
775  float eta = 0.0;
776  float phi = 0.0;
777  float energy = 0.0;
778  float corr_energy = 0.0;
779  float trajpoint = 0.0;
780  float eta_ecal = 0.0;
781  float phi_ecal = 0.0;
782  float eta_hcal = 0.0;
783  float phi_hcal = 0.0;
784  int charge = 0;
785  int layer = 0;
786  float depth = 0;
787  float muon_dt_hits = 0.0;
788  float muon_csc_hits = 0.0;
789  float muon_type = 0.0;
790  float cluster_flags = 0.0;
791  float gsf_electronseed_trkorecal = 0.0;
792  float num_hits = 0.0;
793 
795  const auto& matched_pftrack = orig.trackRefPF();
796  if (matched_pftrack.isNonnull()) {
797  const auto& atECAL = matched_pftrack->extrapolatedPoint(reco::PFTrajectoryPoint::ECALShowerMax);
798  const auto& atHCAL = matched_pftrack->extrapolatedPoint(reco::PFTrajectoryPoint::HCALEntrance);
799  if (atHCAL.isValid()) {
800  eta_hcal = atHCAL.positionREP().eta();
801  phi_hcal = atHCAL.positionREP().phi();
802  }
803  if (atECAL.isValid()) {
804  eta_ecal = atECAL.positionREP().eta();
805  phi_ecal = atECAL.positionREP().phi();
806  }
807  }
808  const auto& ref = ((const reco::PFBlockElementTrack*)&orig)->trackRef();
809  pt = ref->pt();
810  px = ref->px();
811  py = ref->py();
812  pz = ref->pz();
813  eta = ref->eta();
814  phi = ref->phi();
815  energy = ref->p();
816  charge = ref->charge();
817  num_hits = ref->recHitsSize();
818 
819  reco::MuonRef muonRef = orig.muonRef();
820  if (muonRef.isNonnull()) {
821  reco::TrackRef standAloneMu = muonRef->standAloneMuon();
822  if (standAloneMu.isNonnull()) {
823  muon_dt_hits = standAloneMu->hitPattern().numberOfValidMuonDTHits();
824  muon_csc_hits = standAloneMu->hitPattern().numberOfValidMuonCSCHits();
825  }
826  muon_type = muonRef->type();
827  }
828 
829  } else if (type == reco::PFBlockElement::BREM) {
830  const auto* orig2 = (const reco::PFBlockElementBrem*)&orig;
831  const auto& ref = orig2->GsftrackRef();
832  trajpoint = orig2->indTrajPoint();
833  if (ref.isNonnull()) {
834  deltap = orig2->DeltaP();
835  sigmadeltap = orig2->SigmaDeltaP();
836  pt = ref->pt();
837  px = ref->px();
838  py = ref->py();
839  pz = ref->pz();
840  eta = ref->eta();
841  phi = ref->phi();
842  energy = ref->p();
843  charge = ref->charge();
844  }
845 
846  const auto& gsfextraref = ref->extra();
847  if (gsfextraref.isAvailable() && gsfextraref->seedRef().isAvailable()) {
848  reco::ElectronSeedRef seedref = gsfextraref->seedRef().castTo<reco::ElectronSeedRef>();
849  if (seedref.isAvailable()) {
850  if (seedref->isEcalDriven()) {
851  gsf_electronseed_trkorecal = 1.0;
852  } else if (seedref->isTrackerDriven()) {
853  gsf_electronseed_trkorecal = 2.0;
854  }
855  }
856  }
857 
858  } else if (type == reco::PFBlockElement::GSF) {
859  //requires to keep GsfPFRecTracks
860  const auto* orig2 = (const reco::PFBlockElementGsfTrack*)&orig;
861  const auto& vec = orig2->Pin();
862  pt = vec.pt();
863  px = vec.px();
864  py = vec.py();
865  pz = vec.pz();
866  eta = vec.eta();
867  phi = vec.phi();
868  energy = vec.energy();
869 
870  const auto& vec2 = orig2->Pout();
871  eta_ecal = vec2.eta();
872  phi_ecal = vec2.phi();
873 
874  if (!orig2->GsftrackRefPF().isNull()) {
875  charge = orig2->GsftrackRefPF()->charge();
876  num_hits = orig2->GsftrackRefPF()->PFRecBrem().size();
877  }
878 
879  const auto& ref = orig2->GsftrackRef();
880 
881  const auto& gsfextraref = ref->extra();
882  if (gsfextraref.isAvailable() && gsfextraref->seedRef().isAvailable()) {
883  reco::ElectronSeedRef seedref = gsfextraref->seedRef().castTo<reco::ElectronSeedRef>();
884  if (seedref.isAvailable()) {
885  if (seedref->isEcalDriven()) {
886  gsf_electronseed_trkorecal = 1.0;
887  } else if (seedref->isTrackerDriven()) {
888  gsf_electronseed_trkorecal = 2.0;
889  }
890  }
891  };
892 
897  const auto& ref = ((const reco::PFBlockElementCluster*)&orig)->clusterRef();
898  if (ref.isNonnull()) {
899  cluster_flags = ref->flags();
900  eta = ref->eta();
901  phi = ref->phi();
902  pt = ref->pt();
903  px = ref->position().x();
904  py = ref->position().y();
905  pz = ref->position().z();
906  energy = ref->energy();
907  corr_energy = ref->correctedEnergy();
908  layer = ref->layer();
909  depth = ref->depth();
910  num_hits = ref->recHitFractions().size();
911  }
912  } else if (type == reco::PFBlockElement::SC) {
913  const auto& clref = ((const reco::PFBlockElementSuperCluster*)&orig)->superClusterRef();
914  if (clref.isNonnull()) {
915  cluster_flags = clref->flags();
916  eta = clref->eta();
917  phi = clref->phi();
918  px = clref->position().x();
919  py = clref->position().y();
920  pz = clref->position().z();
921  energy = clref->energy();
922  num_hits = clref->clustersSize();
923  }
924  }
925  vector<int> tps;
926  for (const auto& t : trackingparticle_to_element) {
927  if (t.second == (int)ielem) {
928  tps.push_back(t.first);
929  }
930  }
931  vector<int> scs;
932  for (const auto& t : simcluster_to_element) {
933  if (t.second == (int)ielem) {
934  scs.push_back(t.first);
935  }
936  }
937 
938  element_pt_.push_back(pt);
939  element_px_.push_back(px);
940  element_py_.push_back(py);
941  element_pz_.push_back(pz);
942  element_deltap_.push_back(deltap);
943  element_sigmadeltap_.push_back(sigmadeltap);
944  element_eta_.push_back(eta);
945  element_phi_.push_back(phi);
946  element_energy_.push_back(energy);
947  element_corr_energy_.push_back(corr_energy);
948  element_eta_ecal_.push_back(eta_ecal);
949  element_phi_ecal_.push_back(phi_ecal);
950  element_eta_hcal_.push_back(eta_hcal);
951  element_phi_hcal_.push_back(phi_hcal);
952  element_charge_.push_back(charge);
953  element_type_.push_back(type);
954  element_layer_.push_back(layer);
955  element_depth_.push_back(depth);
956  element_trajpoint_.push_back(trajpoint);
957  element_muon_dt_hits_.push_back(muon_dt_hits);
958  element_muon_csc_hits_.push_back(muon_csc_hits);
959  element_muon_type_.push_back(muon_type);
960  element_cluster_flags_.push_back(cluster_flags);
961  element_gsf_electronseed_trkorecal_.push_back(gsf_electronseed_trkorecal);
962  element_num_hits_.push_back(num_hits);
963  }
964 
965  //associate candidates to elements
966  int icandidate = 0;
967  for (const auto& cand : pfCandidates) {
968  pfcandidate_eta_.push_back(cand.eta());
969  pfcandidate_phi_.push_back(cand.phi());
970  pfcandidate_pt_.push_back(cand.pt());
971  pfcandidate_px_.push_back(cand.px());
972  pfcandidate_py_.push_back(cand.py());
973  pfcandidate_pz_.push_back(cand.pz());
974  pfcandidate_energy_.push_back(cand.energy());
975  pfcandidate_pdgid_.push_back(cand.pdgId());
976 
977  for (const auto& el : cand.elementsInBlocks()) {
978  const auto idx_block = el.first.index();
979  unsigned idx_element_in_block = el.second;
980 
981  int ielem = -1;
982  for (const auto& elem_with_index : all_elements) {
983  ielem += 1;
984  if (elem_with_index.idx_block == idx_block && elem_with_index.idx_elem == idx_element_in_block) {
985  break;
986  }
987  }
988  assert(ielem != -1);
989  element_to_candidate.push_back(make_pair(ielem, icandidate));
990  } //elements
991 
992  icandidate += 1;
993  } //pfCandidates
994 
995  ev_event_ = iEvent.id().event();
996  ev_lumi_ = iEvent.id().luminosityBlock();
997  ev_run_ = iEvent.id().run();
998 
999  t_->Fill();
1000 } //analyze
1001 
1003  edm::Handle<edm::View<TrackingParticle>>& trackingParticlesHandle) {
1004  for (unsigned long ntrackingparticle = 0; ntrackingparticle < trackingParticles.size(); ntrackingparticle++) {
1005  const auto& tp = trackingParticles.at(ntrackingparticle);
1006  edm::RefToBase<TrackingParticle> tpref(trackingParticlesHandle, ntrackingparticle);
1007 
1008  math::XYZTLorentzVectorD vtx(0, 0, 0, 0);
1009 
1010  if (!tp.decayVertices().empty()) {
1011  vtx = tp.decayVertices().at(0)->position();
1012  }
1013  auto orig_vtx = tp.vertex();
1014 
1015  // fill branches
1016  trackingparticle_eta_.push_back(tp.p4().eta());
1017  trackingparticle_phi_.push_back(tp.p4().phi());
1018  trackingparticle_pt_.push_back(tp.p4().pt());
1019  trackingparticle_px_.push_back(tp.p4().px());
1020  trackingparticle_py_.push_back(tp.p4().py());
1021  trackingparticle_pz_.push_back(tp.p4().pz());
1022  trackingparticle_energy_.push_back(tp.p4().energy());
1023  trackingparticle_dvx_.push_back(vtx.x());
1024  trackingparticle_dvy_.push_back(vtx.y());
1025  trackingparticle_dvz_.push_back(vtx.z());
1026  trackingparticle_bx_.push_back(tp.eventId().bunchCrossing());
1027  trackingparticle_ev_.push_back(tp.eventId().event());
1028 
1029  trackingparticle_ovx_.push_back(orig_vtx.x());
1030  trackingparticle_ovy_.push_back(orig_vtx.y());
1031  trackingparticle_ovz_.push_back(orig_vtx.z());
1032 
1033  trackingparticle_pid_.push_back(tp.pdgId());
1034  }
1035 }
1036 
1037 //https://stackoverflow.com/questions/27086195/linear-index-upper-triangular-matrix/27088560
1038 int get_index_triu_vector(int i, int j, int n) {
1039  int k = (n * (n - 1) / 2) - (n - i) * ((n - i) - 1) / 2 + j - i - 1;
1040  return k;
1041 }
1042 
1043 pair<int, int> get_triu_vector_index(int k, int n) {
1044  int i = n - 2 - floor(sqrt(-8 * k + 4 * n * (n - 1) - 7) / 2.0 - 0.5);
1045  int j = k + i + 1 - n * (n - 1) / 2 + (n - i) * ((n - i) - 1) / 2;
1046  return make_pair(i, j);
1047 }
1048 
1049 pair<vector<ElementWithIndex>, vector<tuple<int, int, float>>> PFAnalysis::processBlocks(
1050  const std::vector<reco::PFBlock>& pfBlocks) {
1051  vector<ElementWithIndex> ret;
1052  vector<tuple<int, int, float>> distances;
1053 
1054  //Collect all the elements
1055  int iblock = 0;
1056  for (const auto& block : pfBlocks) {
1057  int ielem = 0;
1058  const auto& linkdata = block.linkData();
1059 
1060  //create a list of global element indices with distances
1061  for (const auto& link : linkdata) {
1062  const auto vecidx = link.first;
1063  const auto dist = link.second.distance;
1064  const auto& ij = get_triu_vector_index(vecidx, block.elements().size());
1065  auto globalindex_i = ij.first + ret.size();
1066  auto globalindex_j = ij.second + ret.size();
1067  distances.push_back(make_tuple(globalindex_i, globalindex_j, dist));
1068  }
1069 
1070  for (const auto& elem : block.elements()) {
1071  ElementWithIndex elem_index(elem, iblock, ielem);
1072  ret.push_back(elem_index);
1073  ielem += 1;
1074  } //elements
1075  iblock += 1;
1076  } //blocks
1077  return make_pair(ret, distances);
1078 
1079 } //processBlocks
1080 
1081 void PFAnalysis::associateClusterToSimCluster(const vector<ElementWithIndex>& all_elements) {
1082  vector<map<uint64_t, double>> detids_elements;
1083  map<uint64_t, double> rechits_energy_all;
1084 
1085  int idx_element = 0;
1086  for (const auto& elem : all_elements) {
1087  map<uint64_t, double> detids;
1088  const auto& type = elem.orig.type();
1089 
1093  const auto& clref = elem.orig.clusterRef();
1094  assert(clref.isNonnull());
1095  const auto& cluster = *clref;
1096 
1097  //all rechits and the energy fractions in this cluster
1098  const vector<reco::PFRecHitFraction>& rechit_fracs = cluster.recHitFractions();
1099  for (const auto& rh : rechit_fracs) {
1100  const reco::PFRecHit pfrh = *rh.recHitRef();
1101  if (detids.find(pfrh.detId()) != detids.end()) {
1102  continue;
1103  }
1104  detids[pfrh.detId()] += pfrh.energy() * rh.fraction();
1105  const auto id = DetId(pfrh.detId());
1106  float x = 0;
1107  float y = 0;
1108  float z = 0;
1109  float eta = 0;
1110  float phi = 0;
1111 
1112  const auto& pos = getHitPosition(id);
1113  x = pos.x();
1114  y = pos.y();
1115  z = pos.z();
1116  eta = pos.eta();
1117  phi = pos.phi();
1118 
1119  rechit_x_.push_back(x);
1120  rechit_y_.push_back(y);
1121  rechit_z_.push_back(z);
1122  rechit_det_.push_back(id.det());
1123  rechit_subdet_.push_back(id.subdetId());
1124  rechit_eta_.push_back(eta);
1125  rechit_phi_.push_back(phi);
1126  rechit_e_.push_back(pfrh.energy() * rh.fraction());
1127  rechit_idx_element_.push_back(idx_element);
1128  rechit_detid_.push_back(id.rawId());
1129  rechits_energy_all[id.rawId()] += pfrh.energy() * rh.fraction();
1130  } //rechit_fracs
1131  } else if (type == reco::PFBlockElement::SC) {
1132  const auto& clref = ((const reco::PFBlockElementSuperCluster*)&(elem.orig))->superClusterRef();
1133  assert(clref.isNonnull());
1134  const auto& cluster = *clref;
1135 
1136  //all rechits and the energy fractions in this cluster
1137  const auto& rechit_fracs = cluster.hitsAndFractions();
1138  for (const auto& rh : rechit_fracs) {
1139  if (detids.find(rh.first.rawId()) != detids.end()) {
1140  continue;
1141  }
1142  detids[rh.first.rawId()] += cluster.energy() * rh.second;
1143  const auto id = rh.first;
1144  float x = 0;
1145  float y = 0;
1146  float z = 0;
1147  float eta = 0;
1148  float phi = 0;
1149 
1150  const auto& pos = getHitPosition(id);
1151  x = pos.x();
1152  y = pos.y();
1153  z = pos.z();
1154  eta = pos.eta();
1155  phi = pos.phi();
1156 
1157  rechit_x_.push_back(x);
1158  rechit_y_.push_back(y);
1159  rechit_z_.push_back(z);
1160  rechit_det_.push_back(id.det());
1161  rechit_subdet_.push_back(id.subdetId());
1162  rechit_eta_.push_back(eta);
1163  rechit_phi_.push_back(phi);
1164  rechit_e_.push_back(rh.second);
1165  rechit_idx_element_.push_back(idx_element);
1166  rechit_detid_.push_back(id.rawId());
1167  rechits_energy_all[id.rawId()] += cluster.energy() * rh.second;
1168  } //rechit_fracs
1169  }
1170  detids_elements.push_back(detids);
1171  idx_element += 1;
1172  } //all_elements
1173 
1174  //associate elements (reco clusters) to simclusters
1175  int ielement = 0;
1176  for (const auto& detids : detids_elements) {
1177  int isimcluster = 0;
1178  if (!detids.empty()) {
1179  double sum_e_tot = 0.0;
1180  for (const auto& c : detids) {
1181  sum_e_tot += c.second;
1182  }
1183 
1184  for (const auto& simcluster_detids : simcluster_detids_) {
1185  double sum_e_tot_sc = 0.0;
1186  for (const auto& c : simcluster_detids) {
1187  sum_e_tot_sc += c.second;
1188  }
1189 
1190  //get the energy of the simcluster hits that matches detids of the rechits
1191  double cmp = detid_compare(detids, simcluster_detids);
1192  if (cmp > 0) {
1193  simcluster_to_element.push_back(make_pair(isimcluster, ielement));
1194  simcluster_to_element_cmp.push_back((float)cmp);
1195  }
1196  isimcluster += 1;
1197  }
1198  } //element had rechits
1199  ielement += 1;
1200  } //rechit clusters
1201 }
1202 
1204  hcons = &es.getData(hcalDDDrecToken_);
1205  aField_ = &es.getData(magFieldToken_);
1206 }
1207 
1209 
1211 
1213 
1216  desc.setUnknown();
1217  descriptions.addDefault(desc);
1218 }
1219 
vector< int > element_charge_
static const std::string kSharedResource
Definition: TFileService.h:76
vector< uint64_t > rechit_detid_
vector< float > pfcandidate_pz_
vector< float > pfcandidate_px_
Abstract base class for a PFBlock element (track, cluster...)
vector< float > gen_phi_
vector< int > simtrack_pid_
vector< int > element_distance_j_
vector< float > element_pz_
vector< int > simcluster_ev_
vector< float > element_phi_
vector< float > gen_energy_
~PFAnalysis() override
ROOT::Math::LorentzVector< ROOT::Math::PxPyPzE4D< double > > XYZTLorentzVectorD
Lorentz vector with cylindrical internal representation using pseudorapidity.
Definition: LorentzVector.h:14
vector< float > gen_py_
vector< float > element_corr_energy_
void endRun(edm::Run const &iEvent, edm::EventSetup const &) override
vector< int > simcluster_bx_
vector< float > simhit_phi_
vector< float > element_trajpoint_
ret
prodAgent to be discontinued
vector< float > rechit_subdet_
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
vector< float > simcluster_px_
void endJob() override
vector< float > element_gsf_electronseed_trkorecal_
vector< float > rechit_e_
Global3DPoint GlobalPoint
Definition: GlobalPoint.h:10
vector< float > trackingparticle_phi_
vector< float > simcluster_eta_
vector< float > element_py_
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
unsigned long long EventNumber_t
HcalTopology * hcal_topo
vector< float > element_eta_
ElementWithIndex(const reco::PFBlockElement &_orig, size_t _idx_block, size_t _idx_elem)
bool isNonnull() const
Checks for non-null.
Definition: Ref.h:238
vector< int > gen_charge_
void beginRun(edm::Run const &iEvent, edm::EventSetup const &) override
vector< int > simhit_idx_simcluster_
vector< int > simtrack_idx_simcluster_
vector< float > trackingparticle_eta_
vector< int > element_layer_
assert(be >=bs)
vector< float > gen_pz_
unsigned int LuminosityBlockNumber_t
vector< float > rechit_det_
example_stream void analyze(const edm::Event &, const edm::EventSetup &) override
vector< float > element_sigmadeltap_
key_type key() const
Accessor for product key.
Definition: Ref.h:250
vector< float > simcluster_py_
vector< float > trackingparticle_ovz_
vector< float > rechit_y_
const reco::PFBlockElement & orig
void beginJob()
Definition: Breakpoints.cc:14
constexpr std::array< uint8_t, layerIndexSize > layer
unsigned detId() const
rechit detId
Definition: PFRecHit.h:93
T getUntrackedParameter(std::string const &, T const &) const
void analyze(const edm::Event &, const edm::EventSetup &) override
MagneticField const * aField_
vector< int > trackingparticle_bx_
vector< float > element_pt_
vector< float > element_eta_ecal_
int iEvent
Definition: GenABIO.cc:224
CaloGeometry * geom
void addDefault(ParameterSetDescription const &psetDescription)
vector< float > simhit_z_
Particle flow rechit (rechit + geometry and topology information). See clustering algorithm in PFClus...
Definition: PFRecHit.h:31
vector< int > trackingparticle_mother_
edm::ESGetToken< CaloGeometry, CaloGeometryRecord > geometryToken_
vector< float > trackingparticle_exy_
edm::EDGetTokenT< std::vector< reco::GenParticle > > genParticles_
vector< float > simtrack_x_
T sqrt(T t)
Definition: SSEVec.h:19
vector< float > trackingparticle_pt_
bool isAvailable() const
Definition: Ref.h:537
vector< float > simhit_y_
vector< float > trackingparticle_dvx_
vector< float > gen_pt_
vector< float > element_depth_
vector< float > simcluster_energy_
math::XYZPoint Point
virtual bool present(const DetId &id) const
is this detid present in the geometry?
vector< int > find_element_ref(const vector< ElementWithIndex > &vec, const edm::RefToBase< reco::Track > &r)
vector< float > pfcandidate_phi_
edm::EDGetTokenT< edm::View< reco::Track > > tracks_
edm::EDGetTokenT< std::vector< reco::PFBlock > > pfBlocks_
vector< float > trackingparticle_ovy_
bool getData(T &iHolder) const
Definition: EventSetup.h:122
vector< vector< int > > gen_daughters_
vector< pair< int, int > > element_to_candidate
vector< float > pfcandidate_eta_
vector< float > trackingparticle_energy_
vector< float > gen_px_
vector< float > trackingparticle_py_
vector< float > simcluster_phi_
vector< float > pfcandidate_pt_
edm::RunNumber_t ev_run_
d
Definition: ztail.py:151
virtual std::shared_ptr< const CaloCellGeometry > getGeometry(const DetId &id) const
Get the cell geometry of a given detector id. Should return false if not found.
vector< float > pfcandidate_py_
GlobalPoint getHitPosition(const DetId &id)
vector< float > gen_eta_
vector< int > element_distance_i_
vector< float > trackingparticle_exx_
vector< float > element_muon_csc_hits_
vector< float > element_muon_type_
vector< float > rechit_phi_
vector< float > simhit_x_
Definition: DetId.h:17
vector< int > trackingparticle_pid_
edm::EDGetTokenT< std::vector< reco::PFCandidate > > pfCandidates_
auto const & tracks
cannot be loose
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
vector< int > simcluster_pid_
vector< int > simhit_det_
vector< int > simhit_subdet_
vector< float > element_energy_
ROOT::Math::Transform3D::Point Point
edm::EventNumber_t ev_event_
double detid_compare(const map< uint64_t, double > &rechits, const map< uint64_t, double > &simhits)
edm::LuminosityBlockNumber_t ev_lumi_
vector< float > element_px_
vector< float > element_deltap_
void processTrackingParticles(const edm::View< TrackingParticle > &trackingParticles, edm::Handle< edm::View< TrackingParticle >> &trackingParticlesHandle)
const HcalDDDRecConstants * hcons
edm::EDGetTokenT< edm::View< TrackingParticle > > trackingParticles_
vector< int > gen_status_
vector< float > element_cluster_flags_
edm::EDGetTokenT< edm::View< CaloParticle > > caloParticles_
vector< int > gen_pdgid_
float energy() const
rechit energy
Definition: PFRecHit.h:99
vector< float > element_phi_hcal_
vector< float > trackingparticle_dvz_
vector< int > trackingparticle_ev_
pair< int, int > get_triu_vector_index(int k, int n)
vector< int > element_type_
vector< std::map< uint64_t, double > > simcluster_detids_
edm::ESGetToken< HcalDDDRecConstants, HcalRecNumberingRecord > hcalDDDrecToken_
float x
vector< float > simhit_frac_
vector< pair< int, int > > simcluster_to_element
vector< float > rechit_z_
vector< float > simcluster_pt_
vector< float > simcluster_pz_
vector< float > simtrack_y_
vector< int > pfcandidate_pdgid_
unsigned int RunNumber_t
vector< float > pfcandidate_energy_
vector< float > rechit_x_
vector< float > trackingparticle_dvy_
edm::ESGetToken< MagneticField, IdealMagneticFieldRecord > magFieldToken_
edm::EDGetTokenT< reco::RecoToSimCollection > tracks_recotosim_
vector< float > trackingparticle_px_
#define ntrack
vector< float > simhit_eta_
vector< float > element_muon_dt_hits_
std::vector< vec1 > vec2
Definition: HCALResponse.h:16
edm::ESGetToken< HcalTopology, HcalRecNumberingRecord > topologyToken_
void beginJob() override
vector< pair< int, int > > trackingparticle_to_element
vector< float > element_phi_ecal_
vector< float > trackingparticle_ovx_
pair< vector< ElementWithIndex >, vector< tuple< int, int, float > > > processBlocks(const std::vector< reco::PFBlock > &pfBlocks)
vector< float > simtrack_z_
vector< float > simcluster_to_element_cmp
vector< float > rechit_eta_
vector< float > trackingparticle_pz_
int get_index_triu_vector(int i, int j, int n)
vector< float > element_num_hits_
vector< int > simcluster_idx_trackingparticle_
vector< int > simcluster_nhits_
Definition: Run.h:45
vector< int > rechit_idx_element_
void associateClusterToSimCluster(const vector< ElementWithIndex > &all_elements)
vector< float > element_eta_hcal_
vector< uint64_t > simhit_detid_
vector< float > element_distance_d_