Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2025-04-30 22:24:38

0001 // Author: Felice Pantaleo, felice.pantaleo@cern.ch 08/2024
0002 
0003 #include "FWCore/Framework/interface/global/EDProducer.h"
0004 #include "FWCore/Framework/interface/Event.h"
0005 #include "FWCore/Framework/interface/MakerMacros.h"
0006 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0007 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0008 #include "FWCore/Utilities/interface/EDGetToken.h"
0009 #include "DataFormats/HGCalReco/interface/Trackster.h"
0010 #include "DataFormats/CaloRecHit/interface/CaloCluster.h"
0011 #include "SimDataFormats/Associations/interface/TICLAssociationMap.h"
0012 #include "DataFormats/Provenance/interface/ProductID.h"
0013 
0014 class AllLayerClusterToTracksterAssociatorsProducer : public edm::global::EDProducer<> {
0015 public:
0016   explicit AllLayerClusterToTracksterAssociatorsProducer(const edm::ParameterSet&);
0017   ~AllLayerClusterToTracksterAssociatorsProducer() override = default;
0018 
0019   static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
0020 
0021 private:
0022   void produce(edm::StreamID, edm::Event&, const edm::EventSetup&) const override;
0023 
0024   edm::EDGetTokenT<std::vector<reco::CaloCluster>> layerClustersToken_;
0025   std::vector<std::pair<std::string, edm::EDGetTokenT<std::vector<ticl::Trackster>>>> tracksterCollectionTokens_;
0026 };
0027 
0028 AllLayerClusterToTracksterAssociatorsProducer::AllLayerClusterToTracksterAssociatorsProducer(
0029     const edm::ParameterSet& pset)
0030     : layerClustersToken_(
0031           consumes<std::vector<reco::CaloCluster>>(pset.getParameter<edm::InputTag>("layer_clusters"))) {
0032   const auto& tracksterCollections = pset.getParameter<std::vector<edm::InputTag>>("tracksterCollections");
0033   for (const auto& tag : tracksterCollections) {
0034     std::string label = tag.label();
0035     if (!tag.instance().empty()) {
0036       label += tag.instance();
0037     }
0038     tracksterCollectionTokens_.emplace_back(label, consumes<std::vector<ticl::Trackster>>(tag));
0039   }
0040 
0041   // Produce separate association maps for each trackster collection using the trackster label
0042   for (const auto& tracksterToken : tracksterCollectionTokens_) {
0043     produces<
0044         ticl::AssociationMap<ticl::mapWithSharedEnergy, std::vector<reco::CaloCluster>, std::vector<ticl::Trackster>>>(
0045         tracksterToken.first);
0046   }
0047 }
0048 
0049 void AllLayerClusterToTracksterAssociatorsProducer::produce(edm::StreamID,
0050                                                             edm::Event& iEvent,
0051                                                             const edm::EventSetup&) const {
0052   using namespace edm;
0053 
0054   // Retrieve layer clusters with protection
0055   const auto& layerClustersHandle = iEvent.getHandle(layerClustersToken_);
0056 
0057   // If layer clusters are missing, produce empty maps and return
0058   if (!layerClustersHandle.isValid()) {
0059     edm::LogWarning("MissingInput") << "Layer clusters collection not found. Producing empty maps.";
0060     for (const auto& tracksterToken : tracksterCollectionTokens_) {
0061       iEvent.put(std::make_unique<ticl::AssociationMap<ticl::mapWithSharedEnergy,
0062                                                        std::vector<reco::CaloCluster>,
0063                                                        std::vector<ticl::Trackster>>>(),
0064                  tracksterToken.first);
0065     }
0066     return;
0067   }
0068 
0069   for (const auto& tracksterToken : tracksterCollectionTokens_) {
0070     const auto& trackstersHandle = iEvent.getHandle(tracksterToken.second);
0071     // If tracksters collection is missing, produce empty map and continue
0072     if (!trackstersHandle.isValid()) {
0073       edm::LogWarning("MissingInput") << "Tracksters collection '" << tracksterToken.first << "' not found.";
0074       iEvent.put(std::make_unique<ticl::AssociationMap<ticl::mapWithSharedEnergy,
0075                                                        std::vector<reco::CaloCluster>,
0076                                                        std::vector<ticl::Trackster>>>(),
0077                  tracksterToken.first);
0078       continue;
0079     }
0080 
0081     // Create association map
0082     auto lcToTracksterMap = std::make_unique<
0083         ticl::AssociationMap<ticl::mapWithSharedEnergy, std::vector<reco::CaloCluster>, std::vector<ticl::Trackster>>>(
0084         layerClustersHandle, trackstersHandle, iEvent);
0085 
0086     // Loop over tracksters
0087     for (unsigned int tracksterId = 0; tracksterId < trackstersHandle->size(); ++tracksterId) {
0088       const auto& trackster = (*trackstersHandle)[tracksterId];
0089       // Loop over vertices in trackster
0090       for (unsigned int i = 0; i < trackster.vertices().size(); ++i) {
0091         // Get layerCluster
0092         const auto& lc = (*layerClustersHandle)[trackster.vertices()[i]];
0093         float sharedEnergy = lc.energy() / trackster.vertex_multiplicity()[i];
0094         edm::Ref<std::vector<reco::CaloCluster>> lcRef(layerClustersHandle, trackster.vertices()[i]);
0095         edm::Ref<std::vector<ticl::Trackster>> tracksterRef(trackstersHandle, tracksterId);
0096         lcToTracksterMap->insert(lcRef, tracksterRef, sharedEnergy);
0097       }
0098     }
0099 
0100     iEvent.put(std::move(lcToTracksterMap), tracksterToken.first);
0101   }
0102 }
0103 
0104 void AllLayerClusterToTracksterAssociatorsProducer::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0105   edm::ParameterSetDescription desc;
0106   desc.add<std::vector<edm::InputTag>>("tracksterCollections",
0107                                        {edm::InputTag("ticlTrackstersCLUE3DHigh"),
0108                                         edm::InputTag("ticlTrackstersLinks"),
0109                                         edm::InputTag("ticlCandidate")});
0110   desc.add<edm::InputTag>("layer_clusters", edm::InputTag("hgcalMergeLayerClusters"));
0111   descriptions.add("AllLayerClusterToTracksterAssociatorsProducer", desc);
0112 }
0113 
0114 // Define this as a plug-in
0115 DEFINE_FWK_MODULE(AllLayerClusterToTracksterAssociatorsProducer);