File indexing completed on 2025-04-30 22:24:38
0001
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
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
0055 const auto& layerClustersHandle = iEvent.getHandle(layerClustersToken_);
0056
0057
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
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
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
0087 for (unsigned int tracksterId = 0; tracksterId < trackstersHandle->size(); ++tracksterId) {
0088 const auto& trackster = (*trackstersHandle)[tracksterId];
0089
0090 for (unsigned int i = 0; i < trackster.vertices().size(); ++i) {
0091
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
0115 DEFINE_FWK_MODULE(AllLayerClusterToTracksterAssociatorsProducer);