50 #include "Math/Transform3D.h" 76 : orig(_orig), idx_block(_idx_block), idx_elem(_idx_elem){};
81 for (
unsigned int i = 0;
i < vec.size();
i++) {
82 const auto& elem = vec.at(
i);
84 const auto& ref = elem.orig.trackRef();
85 if (ref.isNonnull() && ref->extra().isNonnull()) {
86 if (ref.key() ==
r.key()) {
92 if (ref.isNonnull()) {
93 if (ref.key() ==
r.key()) {
99 if (ref.isNonnull()) {
100 if (ref.key() ==
r.key()) {
112 for (
const auto& rh :
rechits) {
113 for (
const auto& sh :
simhits) {
114 if (rh.first == sh.first) {
116 ret += rh.second * sh.second;
139 void endJob()
override;
144 pair<vector<ElementWithIndex>, vector<tuple<int, int, float>>> processBlocks(
145 const std::vector<reco::PFBlock>& pfBlocks);
147 void associateClusterToSimCluster(
const vector<ElementWithIndex>& all_elements);
149 void clearVariables();
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"));
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>();
320 fs->make<TH1F>(
"total",
"total", 100, 0, 5.);
322 t_ =
fs->make<TTree>(
"pftree",
"pftree");
325 t_->Branch(
"event", &ev_event_);
326 t_->Branch(
"lumi", &ev_lumi_);
327 t_->Branch(
"run", &ev_run_);
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_);
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_);
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_);
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_);
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_);
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_);
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_);
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_);
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_);
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);
453 trackingparticle_to_element.clear();
454 simcluster_to_element.clear();
455 simcluster_to_element_cmp.clear();
456 element_to_candidate.clear();
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();
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();
493 simhit_frac_.clear();
498 simhit_subdet_.clear();
501 simhit_idx_simcluster_.clear();
502 simhit_detid_.clear();
509 rechit_subdet_.clear();
512 rechit_idx_element_.clear();
513 rechit_detid_.clear();
519 simtrack_idx_simcluster_.clear();
520 simtrack_pid_.clear();
532 gen_daughters_.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();
560 element_distance_i_.clear();
561 element_distance_j_.clear();
562 element_distance_d_.clear();
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();
578 bool present =
false;
584 present = geom_sd->
present(
id);
596 auto& pG = iSetup.
getData(geometryToken_);
598 auto&
pT = iSetup.
getData(topologyToken_);
603 iEvent.getByToken(trackingParticles_, trackingParticlesHandle);
607 iEvent.getByToken(caloParticles_, caloParticlesHandle);
612 iEvent.getByToken(tracks_recotosim_, recotosimCollection);
613 const auto recotosim = *recotosimCollection;
616 iEvent.getByToken(tracks_, trackHandle);
620 iEvent.getByToken(genParticles_, genParticlesHandle);
621 for (std::vector<reco::GenParticle>::const_iterator it_p = genParticlesHandle->begin();
622 it_p != genParticlesHandle->end();
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());
642 iEvent.getByToken(pfCandidates_, pfCandidatesHandle);
643 std::vector<reco::PFCandidate>
pfCandidates = *pfCandidatesHandle;
646 iEvent.getByToken(pfBlocks_, pfBlocksHandle);
647 std::vector<reco::PFBlock> pfBlocks = *pfBlocksHandle;
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());
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));
664 const auto vec_idx_in_all_elements =
find_element_ref(all_elements, trackref);
667 if (vec_idx_in_all_elements.empty()) {
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);
684 int idx_simcluster = 0;
686 for (
unsigned long ncaloparticle = 0; ncaloparticle <
caloParticles.size(); ncaloparticle++) {
691 for (
const auto& simcluster :
cp.simClusters()) {
693 map<uint64_t, double> detid_energy;
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());
704 simcluster_px_.push_back(simcluster->p4().x());
705 simcluster_py_.push_back(simcluster->p4().y());
706 simcluster_pz_.push_back(simcluster->p4().z());
708 for (
const auto&
hf : simcluster->hits_and_fractions()) {
712 const auto&
pos = getHitPosition(
id);
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();
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;
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());
746 if (simtrack.eventId() == simtrack2.eventId() && simtrack.trackId() == simtrack2.trackId()) {
747 simcluster_to_trackingparticle = itp;
754 simcluster_detids_.push_back(detid_energy);
755 simcluster_idx_trackingparticle_.push_back(simcluster_to_trackingparticle);
761 associateClusterToSimCluster(all_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;
771 float sigmadeltap = 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;
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;
795 const auto& matched_pftrack = orig.trackRefPF();
796 if (matched_pftrack.isNonnull()) {
799 if (atHCAL.isValid()) {
800 eta_hcal = atHCAL.positionREP().eta();
801 phi_hcal = atHCAL.positionREP().phi();
803 if (atECAL.isValid()) {
804 eta_ecal = atECAL.positionREP().eta();
805 phi_ecal = atECAL.positionREP().phi();
817 num_hits = ref->recHitsSize();
823 muon_dt_hits = standAloneMu->hitPattern().numberOfValidMuonDTHits();
824 muon_csc_hits = standAloneMu->hitPattern().numberOfValidMuonCSCHits();
826 muon_type = muonRef->type();
831 const auto& ref = orig2->GsftrackRef();
832 trajpoint = orig2->indTrajPoint();
833 if (ref.isNonnull()) {
834 deltap = orig2->DeltaP();
835 sigmadeltap = orig2->SigmaDeltaP();
846 const auto& gsfextraref = ref->extra();
847 if (gsfextraref.isAvailable() && gsfextraref->seedRef().isAvailable()) {
850 if (seedref->isEcalDriven()) {
851 gsf_electronseed_trkorecal = 1.0;
852 }
else if (seedref->isTrackerDriven()) {
853 gsf_electronseed_trkorecal = 2.0;
861 const auto& vec = orig2->Pin();
870 const auto&
vec2 = orig2->Pout();
871 eta_ecal =
vec2.eta();
872 phi_ecal =
vec2.phi();
874 if (!orig2->GsftrackRefPF().isNull()) {
875 charge = orig2->GsftrackRefPF()->charge();
876 num_hits = orig2->GsftrackRefPF()->PFRecBrem().size();
879 const auto& ref = orig2->GsftrackRef();
881 const auto& gsfextraref = ref->extra();
882 if (gsfextraref.isAvailable() && gsfextraref->seedRef().isAvailable()) {
885 if (seedref->isEcalDriven()) {
886 gsf_electronseed_trkorecal = 1.0;
887 }
else if (seedref->isTrackerDriven()) {
888 gsf_electronseed_trkorecal = 2.0;
898 if (ref.isNonnull()) {
899 cluster_flags = ref->flags();
903 px = ref->position().x();
904 py = ref->position().y();
905 pz = ref->position().z();
907 corr_energy = ref->correctedEnergy();
908 layer = ref->layer();
909 depth = ref->depth();
910 num_hits = ref->recHitFractions().size();
914 if (clref.isNonnull()) {
915 cluster_flags = clref->flags();
918 px = clref->position().x();
919 py = clref->position().y();
920 pz = clref->position().z();
922 num_hits = clref->clustersSize();
926 for (
const auto&
t : trackingparticle_to_element) {
927 if (
t.second == (
int)ielem) {
928 tps.push_back(
t.first);
932 for (
const auto&
t : simcluster_to_element) {
933 if (
t.second == (
int)ielem) {
934 scs.push_back(
t.first);
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);
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());
977 for (
const auto& el :
cand.elementsInBlocks()) {
978 const auto idx_block = el.first.index();
979 unsigned idx_element_in_block = el.second;
982 for (
const auto& elem_with_index : all_elements) {
984 if (elem_with_index.idx_block == idx_block && elem_with_index.idx_elem == idx_element_in_block) {
989 element_to_candidate.push_back(make_pair(ielem, icandidate));
995 ev_event_ =
iEvent.id().event();
996 ev_lumi_ =
iEvent.id().luminosityBlock();
997 ev_run_ =
iEvent.id().run();
1004 for (
unsigned long ntrackingparticle = 0; ntrackingparticle <
trackingParticles.size(); ntrackingparticle++) {
1010 if (!
tp.decayVertices().empty()) {
1011 vtx =
tp.decayVertices().at(0)->position();
1013 auto orig_vtx =
tp.vertex();
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());
1029 trackingparticle_ovx_.push_back(orig_vtx.x());
1030 trackingparticle_ovy_.push_back(orig_vtx.y());
1031 trackingparticle_ovz_.push_back(orig_vtx.z());
1033 trackingparticle_pid_.push_back(
tp.pdgId());
1039 int k = (
n * (
n - 1) / 2) - (
n -
i) * ((
n -
i) - 1) / 2 +
j -
i - 1;
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);
1050 const std::vector<reco::PFBlock>& pfBlocks) {
1051 vector<ElementWithIndex>
ret;
1052 vector<tuple<int, int, float>> distances;
1056 for (
const auto&
block : pfBlocks) {
1058 const auto& linkdata =
block.linkData();
1061 for (
const auto& link : linkdata) {
1062 const auto vecidx = link.first;
1063 const auto dist = link.second.distance;
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));
1070 for (
const auto& elem :
block.elements()) {
1072 ret.push_back(elem_index);
1077 return make_pair(
ret, distances);
1082 vector<map<uint64_t, double>> detids_elements;
1083 map<uint64_t, double> rechits_energy_all;
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();
1093 const auto& clref = elem.orig.clusterRef();
1094 assert(clref.isNonnull());
1095 const auto& cluster = *clref;
1098 const vector<reco::PFRecHitFraction>& rechit_fracs = cluster.recHitFractions();
1099 for (
const auto& rh : rechit_fracs) {
1101 if (detids.find(pfrh.
detId()) != detids.end()) {
1104 detids[pfrh.
detId()] += pfrh.
energy() * rh.fraction();
1112 const auto&
pos = getHitPosition(
id);
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();
1133 assert(clref.isNonnull());
1134 const auto& cluster = *clref;
1137 const auto& rechit_fracs = cluster.hitsAndFractions();
1138 for (
const auto& rh : rechit_fracs) {
1139 if (detids.find(rh.first.rawId()) != detids.end()) {
1142 detids[rh.first.rawId()] += cluster.energy() * rh.second;
1143 const auto id = rh.first;
1150 const auto&
pos = getHitPosition(
id);
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;
1170 detids_elements.push_back(detids);
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;
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;
1193 simcluster_to_element.push_back(make_pair(isimcluster, ielement));
1194 simcluster_to_element_cmp.push_back((
float)
cmp);
1204 hcons = &es.
getData(hcalDDDrecToken_);
1205 aField_ = &es.
getData(magFieldToken_);
vector< int > element_charge_
static const std::string kSharedResource
vector< uint64_t > rechit_detid_
vector< float > pfcandidate_pz_
vector< float > pfcandidate_px_
Abstract base class for a PFBlock element (track, cluster...)
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_
ROOT::Math::LorentzVector< ROOT::Math::PxPyPzE4D< double > > XYZTLorentzVectorD
Lorentz vector with cylindrical internal representation using pseudorapidity.
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)
vector< float > simcluster_px_
vector< float > element_gsf_electronseed_trkorecal_
vector< float > rechit_e_
Global3DPoint GlobalPoint
vector< float > trackingparticle_phi_
vector< float > simcluster_eta_
vector< float > element_py_
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
unsigned long long EventNumber_t
vector< float > element_eta_
ElementWithIndex(const reco::PFBlockElement &_orig, size_t _idx_block, size_t _idx_elem)
bool isNonnull() const
Checks for non-null.
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_
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.
vector< float > simcluster_py_
vector< float > trackingparticle_ovz_
vector< float > rechit_y_
const reco::PFBlockElement & orig
constexpr std::array< uint8_t, layerIndexSize > layer
unsigned detId() const
rechit detId
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_
void addDefault(ParameterSetDescription const &psetDescription)
vector< float > simhit_z_
Particle flow rechit (rechit + geometry and topology information). See clustering algorithm in PFClus...
vector< int > trackingparticle_mother_
edm::ESGetToken< CaloGeometry, CaloGeometryRecord > geometryToken_
vector< float > trackingparticle_exy_
edm::EDGetTokenT< std::vector< reco::GenParticle > > genParticles_
vector< float > simtrack_x_
vector< float > trackingparticle_pt_
vector< float > simhit_y_
vector< float > trackingparticle_dvx_
vector< float > element_depth_
vector< float > simcluster_energy_
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
vector< vector< int > > gen_daughters_
vector< pair< int, int > > element_to_candidate
vector< float > pfcandidate_eta_
vector< float > trackingparticle_energy_
vector< float > trackingparticle_py_
vector< float > simcluster_phi_
vector< float > pfcandidate_pt_
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< 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_
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_
float energy() const
rechit energy
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_
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_
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_
vector< float > simhit_eta_
vector< float > element_muon_dt_hits_
edm::ESGetToken< HcalTopology, HcalRecNumberingRecord > topologyToken_
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_
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_