2121#include " FWCore/Framework/interface/MakerMacros.h"
2222#include " FWCore/ParameterSet/interface/ParameterSet.h"
2323#include " FWCore/ServiceRegistry/interface/Service.h"
24+ #include " FWCore/Utilities/interface/transform.h"
2425
2526#include " DataFormats/Provenance/interface/EventID.h"
2627#include " DataFormats/CaloRecHit/interface/CaloCluster.h"
3334#include " DataFormats/Math/interface/Point3D.h"
3435#include " DataFormats/GeometrySurface/interface/BoundDisk.h"
3536#include " DataFormats/HGCalReco/interface/Common.h"
37+ #include " DataFormats/HGCRecHit/interface/HGCRecHitCollections.h"
3638#include " SimDataFormats/CaloAnalysis/interface/CaloParticle.h"
3739#include " SimDataFormats/CaloAnalysis/interface/SimCluster.h"
40+ #include " SimDataFormats/CaloHit/interface/PCaloHit.h"
3841#include " DataFormats/EgammaReco/interface/SuperClusterFwd.h"
3942#include " DataFormats/EgammaReco/interface/SuperCluster.h"
4043
@@ -631,6 +634,10 @@ class TICLDumper : public edm::one::EDAnalyzer<edm::one::WatchRuns, edm::one::Sh
631634
632635 const edm::EDGetTokenT<std::vector<SimCluster>> simclusters_token_;
633636 const edm::EDGetTokenT<std::vector<CaloParticle>> caloparticles_token_;
637+ const std::vector<edm::InputTag> label_rechits;
638+ const std::vector<edm::EDGetTokenT<HGCRecHitCollection>> rechits_tokens_;
639+ const std::vector<edm::InputTag> label_simhits;
640+ const std::vector<edm::EDGetTokenT<std::vector<PCaloHit>>> simhits_tokens_;
634641
635642 const edm::ESGetToken<CaloGeometry, CaloGeometryRecord> geometry_token_;
636643 const std::string detector_;
@@ -646,6 +653,8 @@ class TICLDumper : public edm::one::EDAnalyzer<edm::one::WatchRuns, edm::one::Sh
646653 bool saveTICLCandidate_;
647654 bool saveSimTICLCandidate_;
648655 bool saveTracks_;
656+ bool saveRecHits_;
657+ bool saveSimHits_;
649658
650659 // Output tree
651660 TTree* tree_;
@@ -723,6 +732,7 @@ class TICLDumper : public edm::one::EDAnalyzer<edm::one::WatchRuns, edm::one::Sh
723732 std::vector<float > cluster_time;
724733 std::vector<float > cluster_timeErr;
725734 std::vector<uint32_t > cluster_number_of_hits;
735+ std::vector<std::vector<uint32_t >> rechits_inLC;
726736
727737 // Tracks
728738 std::vector<unsigned int > track_id;
@@ -752,11 +762,30 @@ class TICLDumper : public edm::one::EDAnalyzer<edm::one::WatchRuns, edm::one::Sh
752762 std::vector<int > track_isMuon;
753763 std::vector<int > track_isTrackerMuon;
754764
765+ // rechits
766+ std::vector<uint32_t > rechit_ID;
767+ std::vector<float > rechit_energy;
768+ std::vector<float > rechit_x;
769+ std::vector<float > rechit_y;
770+ std::vector<float > rechit_z;
771+ std::vector<float > rechit_time;
772+
773+ std::vector<uint32_t > simhit_ID;
774+ std::vector<float > simhit_energy;
775+ std::vector<float > simhit_energyEM;
776+ std::vector<float > simhit_energyHad;
777+ std::vector<float > simhit_x;
778+ std::vector<float > simhit_y;
779+ std::vector<float > simhit_z;
780+ std::vector<float > simhit_time;
781+
755782 TTree* cluster_tree_;
756783 TTree* candidate_tree_;
757784 TTree* superclustering_tree_;
758785 TTree* tracks_tree_;
759786 TTree* simTICLCandidate_tree;
787+ TTree* rechits_tree_;
788+ TTree* simhits_tree_;
760789};
761790
762791void TICLDumper::clearVariables () {
@@ -833,6 +862,7 @@ void TICLDumper::clearVariables() {
833862 cluster_time.clear ();
834863 cluster_timeErr.clear ();
835864 cluster_number_of_hits.clear ();
865+ rechits_inLC.clear ();
836866
837867 track_id.clear ();
838868 track_hgcal_x.clear ();
@@ -860,6 +890,22 @@ void TICLDumper::clearVariables() {
860890 track_nhits.clear ();
861891 track_isMuon.clear ();
862892 track_isTrackerMuon.clear ();
893+
894+ rechit_ID.clear ();
895+ rechit_energy.clear ();
896+ rechit_x.clear ();
897+ rechit_y.clear ();
898+ rechit_z.clear ();
899+ rechit_time.clear ();
900+
901+ simhit_ID.clear ();
902+ simhit_energy.clear ();
903+ simhit_energyEM.clear ();
904+ simhit_energyHad.clear ();
905+ simhit_x.clear ();
906+ simhit_y.clear ();
907+ simhit_z.clear ();
908+ simhit_time.clear ();
863909};
864910
865911TICLDumper::TICLDumper (const edm::ParameterSet& ps)
@@ -900,6 +946,12 @@ TICLDumper::TICLDumper(const edm::ParameterSet& ps)
900946 associations_dumperHelpers_(associations_parameterSets_.size()),
901947 simclusters_token_(consumes(ps.getParameter<edm::InputTag>(" simclusters" ))),
902948 caloparticles_token_(consumes(ps.getParameter<edm::InputTag>(" caloparticles" ))),
949+ label_rechits(ps.getParameter<std::vector<edm::InputTag>>(" label_rechits" )),
950+ rechits_tokens_{edm::vector_transform (
951+ label_rechits, [this ](const edm::InputTag& lab) { return consumes<HGCRecHitCollection>(lab); })},
952+ label_simhits (ps.getParameter<std::vector<edm::InputTag>>(" label_simhits" )),
953+ simhits_tokens_{edm::vector_transform (
954+ label_simhits, [this ](const edm::InputTag& lab) { return consumes<std::vector<PCaloHit>>(lab); })},
903955 geometry_token_ (esConsumes<CaloGeometry, CaloGeometryRecord, edm::Transition::BeginRun>()),
904956 detector_(ps.getParameter<std::string>(" detector" )),
905957 propName_(ps.getParameter<std::string>(" propagator" )),
@@ -912,7 +964,9 @@ TICLDumper::TICLDumper(const edm::ParameterSet& ps)
912964 saveRecoSuperclusters_(ps.getParameter<bool >(" saveRecoSuperclusters" )),
913965 saveTICLCandidate_(ps.getParameter<bool >(" saveSimTICLCandidate" )),
914966 saveSimTICLCandidate_(ps.getParameter<bool >(" saveSimTICLCandidate" )),
915- saveTracks_(ps.getParameter<bool >(" saveTracks" )) {
967+ saveTracks_(ps.getParameter<bool >(" saveTracks" )),
968+ saveRecHits_(ps.getParameter<bool >(" saveRecHits" )),
969+ saveSimHits_(ps.getParameter<bool >(" saveSimHits" )) {
916970 if (saveSuperclustering_) {
917971 superclustering_linkedResultTracksters_token =
918972 consumes<std::vector<std::vector<unsigned int >>>(ps.getParameter <edm::InputTag>(" superclustering" ));
@@ -966,6 +1020,26 @@ void TICLDumper::beginJob() {
9661020 tracksters_trees.push_back (tree);
9671021 tracksters_dumperHelpers_[i].initTree (tree, &eventId_);
9681022 }
1023+ if (saveRecHits_) {
1024+ rechits_tree_ = fs->make <TTree>(" rechits" , " HGCAL rechits" );
1025+ rechits_tree_->Branch (" ID" , &rechit_ID);
1026+ rechits_tree_->Branch (" energy" , &rechit_energy);
1027+ rechits_tree_->Branch (" position_x" , &rechit_x);
1028+ rechits_tree_->Branch (" position_y" , &rechit_y);
1029+ rechits_tree_->Branch (" position_z" , &rechit_z);
1030+ rechits_tree_->Branch (" time" , &rechit_time);
1031+ }
1032+ if (saveSimHits_) {
1033+ simhits_tree_ = fs->make <TTree>(" simhits" , " HGCAL simhits" );
1034+ simhits_tree_->Branch (" ID" , &simhit_ID);
1035+ simhits_tree_->Branch (" energy" , &simhit_energy);
1036+ simhits_tree_->Branch (" energyEM" , &simhit_energyEM);
1037+ simhits_tree_->Branch (" energyHad" , &simhit_energyHad);
1038+ simhits_tree_->Branch (" position_x" , &simhit_x);
1039+ simhits_tree_->Branch (" position_y" , &simhit_y);
1040+ simhits_tree_->Branch (" position_z" , &simhit_z);
1041+ simhits_tree_->Branch (" time" , &simhit_time);
1042+ }
9691043 if (saveLCs_) {
9701044 cluster_tree_ = fs->make <TTree>(" clusters" , " TICL tracksters" );
9711045 cluster_tree_->Branch (" event" , &eventId_);
@@ -983,6 +1057,7 @@ void TICLDumper::beginJob() {
9831057 cluster_tree_->Branch (" cluster_time" , &cluster_time);
9841058 cluster_tree_->Branch (" cluster_timeErr" , &cluster_timeErr);
9851059 cluster_tree_->Branch (" cluster_number_of_hits" , &cluster_number_of_hits);
1060+ cluster_tree_->Branch (" rechits" , &rechits_inLC);
9861061 }
9871062 if (saveTICLCandidate_) {
9881063 candidate_tree_ = fs->make <TTree>(" candidates" , " TICL candidates" );
@@ -1202,6 +1277,45 @@ void TICLDumper::analyze(const edm::Event& event, const edm::EventSetup& setup)
12021277
12031278 nclusters_ = clusters.size ();
12041279
1280+ std::vector<std::vector<PCaloHit>> simhits_collections;
1281+ for (auto const & sh_token : simhits_tokens_) {
1282+ edm::Handle<std::vector<PCaloHit>> simhit_handle;
1283+ event.getByToken (sh_token, simhit_handle);
1284+ simhits_collections.push_back (*simhit_handle);
1285+ }
1286+
1287+ for (auto const & rh_token : rechits_tokens_) {
1288+ edm::Handle<HGCRecHitCollection> rechit_handle;
1289+ event.getByToken (rh_token, rechit_handle);
1290+ const auto & rhColl = *rechit_handle;
1291+ for (auto const & rh : rhColl) {
1292+ rechit_energy.push_back (rh.energy ());
1293+ auto const rhPosition = detectorTools_->rhtools .getPosition (rh.detid ());
1294+ rechit_x.push_back (rhPosition.x ());
1295+ rechit_y.push_back (rhPosition.y ());
1296+ rechit_z.push_back (rhPosition.z ());
1297+ rechit_ID.push_back (rh.detid ());
1298+ rechit_time.push_back (rh.time ());
1299+ }
1300+ }
1301+
1302+ for (auto const & sh_token : simhits_tokens_) {
1303+ edm::Handle<std::vector<PCaloHit>> simhit_handle;
1304+ event.getByToken (sh_token, simhit_handle);
1305+ const auto & shColl = *simhit_handle;
1306+ for (auto const & sh : shColl) {
1307+ simhit_energy.push_back (sh.energy ());
1308+ simhit_energyEM.push_back (sh.energyEM ());
1309+ simhit_energyHad.push_back (sh.energyHad ());
1310+ auto const shPosition = detectorTools_->rhtools .getPosition (sh.id ());
1311+ simhit_x.push_back (shPosition.x ());
1312+ simhit_y.push_back (shPosition.y ());
1313+ simhit_z.push_back (shPosition.z ());
1314+ simhit_ID.push_back (sh.id ());
1315+ simhit_time.push_back (sh.time ());
1316+ }
1317+ }
1318+
12051319 // Save all the trackster collections
12061320 for (unsigned int i = 0 ; i < tracksters_dumperHelpers_.size (); i++) {
12071321 edm::Handle<std::vector<ticl::Trackster>> tracksters_handle;
@@ -1304,6 +1418,11 @@ void TICLDumper::analyze(const edm::Event& event, const edm::EventSetup& setup)
13041418 cluster_timeErr.push_back (layerClustersTimes.get (c_id).second );
13051419 cluster_time.push_back (layerClustersTimes.get (c_id).first );
13061420 c_id += 1 ;
1421+ std::vector<uint32_t > hits_detid;
1422+ for (auto const & handf : cluster_iterator->hitsAndFractions ()) {
1423+ hits_detid.push_back (handf.first );
1424+ }
1425+ rechits_inLC.push_back (hits_detid);
13071426 }
13081427
13091428 tracksters_in_candidate.resize (ticlcandidates.size ());
@@ -1407,6 +1526,10 @@ void TICLDumper::analyze(const edm::Event& event, const edm::EventSetup& setup)
14071526 tracks_tree_->Fill ();
14081527 if (saveSimTICLCandidate_)
14091528 simTICLCandidate_tree->Fill ();
1529+ if (saveRecHits_)
1530+ rechits_tree_->Fill ();
1531+ if (saveSimHits_)
1532+ simhits_tree_->Fill ();
14101533}
14111534
14121535void TICLDumper::endJob () {}
@@ -1456,6 +1579,14 @@ void TICLDumper::fillDescriptions(edm::ConfigurationDescriptions& descriptions)
14561579 desc.add <edm::InputTag>(" simtrackstersSC" , edm::InputTag (" ticlSimTracksters" ))
14571580 ->setComment (" SimTrackster from CaloParticle collection to use for simTICLcandidates" );
14581581 desc.add <edm::InputTag>(" simTICLCandidates" , edm::InputTag (" ticlSimTracksters" ));
1582+ desc.add <std::vector<edm::InputTag>>(" label_rechits" ,
1583+ {edm::InputTag (" HGCalRecHit" , " HGCEERecHits" ),
1584+ edm::InputTag (" HGCalRecHit" , " HGCHEFRecHits" ),
1585+ edm::InputTag (" HGCalRecHit" , " HGCHEBRecHits" )});
1586+ desc.add <std::vector<edm::InputTag>>(" label_simhits" ,
1587+ {edm::InputTag (" g4SimHits" , " HGCHitsEE" ),
1588+ edm::InputTag (" g4SimHits" , " HGCHitsHEfront" ),
1589+ edm::InputTag (" g4SimHits" , " HGCHitsHEback" )});
14591590
14601591 // Settings for dumping trackster associators (recoToSim & simToReco)
14611592 edm::ParameterSetDescription associatorDescValidator;
@@ -1479,6 +1610,8 @@ void TICLDumper::fillDescriptions(edm::ConfigurationDescriptions& descriptions)
14791610 desc.add <bool >(" saveSuperclustering" , true );
14801611 desc.add <bool >(" saveRecoSuperclusters" , true )
14811612 ->setComment (" Save superclustering Egamma collections (as reco::SuperCluster)" );
1613+ desc.add <bool >(" saveRecHits" , false );
1614+ desc.add <bool >(" saveSimHits" , false );
14821615 descriptions.add (" ticlDumper" , desc);
14831616}
14841617
0 commit comments