File indexing completed on 2024-04-06 12:31:02
0001 #include <memory>
0002 #include <vector>
0003 #include <utility>
0004
0005 #include "FWCore/Framework/interface/Frameworkfwd.h"
0006 #include "FWCore/Framework/interface/global/EDProducer.h"
0007 #include "FWCore/Framework/interface/Event.h"
0008 #include "FWCore/Utilities/interface/InputTag.h"
0009 #include "FWCore/Utilities/interface/EDGetToken.h"
0010 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0011 #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
0012 #include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
0013
0014 #include "DataFormats/Common/interface/Handle.h"
0015 #include "DataFormats/Common/interface/DetSetVector.h"
0016 #include "DataFormats/Common/interface/DetSetVectorNew.h"
0017 #include "DataFormats/DetId/interface/DetId.h"
0018 #include "DataFormats/SiPixelDetId/interface/PixelChannelIdentifier.h"
0019 #include "DataFormats/TrackerRecHit2D/interface/OmniClusterRef.h"
0020 #include "DataFormats/SiPixelCluster/interface/SiPixelCluster.h"
0021 #include "DataFormats/SiStripCluster/interface/SiStripCluster.h"
0022 #include "DataFormats/Phase2TrackerCluster/interface/Phase2TrackerCluster1D.h"
0023
0024 #include "SimDataFormats/Track/interface/SimTrackContainer.h"
0025 #include "SimDataFormats/TrackerDigiSimLink/interface/StripDigiSimLink.h"
0026 #include "SimDataFormats/TrackerDigiSimLink/interface/PixelDigiSimLink.h"
0027 #include "DataFormats/Phase2TrackerDigi/interface/Phase2TrackerDigi.h"
0028 #include "SimDataFormats/TrackingAnalysis/interface/TrackingParticle.h"
0029 #include "SimDataFormats/TrackingAnalysis/interface/TrackingParticleFwd.h"
0030 #include "SimDataFormats/TrackingAnalysis/interface/UniqueSimTrackId.h"
0031 #include "SimTracker/TrackerHitAssociation/interface/ClusterTPAssociation.h"
0032
0033 namespace {
0034
0035 template <typename T>
0036 void getSimTrackId(std::vector<UniqueSimTrackId>& simTrkId,
0037 const edm::Handle<edm::DetSetVector<T> >& simLinks,
0038 const DetId& detId,
0039 uint32_t channel) {
0040 auto isearch = simLinks->find(detId);
0041 if (isearch != simLinks->end()) {
0042
0043 edm::DetSet<T> link_detset = (*isearch);
0044 for (typename edm::DetSet<T>::const_iterator it = link_detset.data.begin(); it != link_detset.data.end(); ++it) {
0045 if (channel == it->channel()) {
0046 simTrkId.emplace_back(it->SimTrackId(), it->eventId());
0047 }
0048 }
0049 }
0050 }
0051
0052 }
0053
0054 class ClusterTPAssociationProducer final : public edm::global::EDProducer<> {
0055 public:
0056 using OmniClusterCollection = std::vector<OmniClusterRef>;
0057
0058 explicit ClusterTPAssociationProducer(const edm::ParameterSet&);
0059 ~ClusterTPAssociationProducer() override = default;
0060
0061 static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
0062
0063 private:
0064 void produce(edm::StreamID, edm::Event&, const edm::EventSetup&) const override;
0065
0066 edm::EDGetTokenT<edm::DetSetVector<PixelDigiSimLink> > sipixelSimLinksToken_;
0067 edm::EDGetTokenT<edm::DetSetVector<StripDigiSimLink> > sistripSimLinksToken_;
0068 edm::EDGetTokenT<edm::DetSetVector<PixelDigiSimLink> > siphase2OTSimLinksToken_;
0069 edm::EDGetTokenT<edmNew::DetSetVector<SiPixelCluster> > pixelClustersToken_;
0070 edm::EDGetTokenT<edmNew::DetSetVector<SiStripCluster> > stripClustersToken_;
0071 edm::EDGetTokenT<edmNew::DetSetVector<Phase2TrackerCluster1D> > phase2OTClustersToken_;
0072 edm::EDGetTokenT<TrackingParticleCollection> trackingParticleToken_;
0073 bool throwOnMissingCollections_;
0074 };
0075
0076 ClusterTPAssociationProducer::ClusterTPAssociationProducer(const edm::ParameterSet& cfg)
0077 : sipixelSimLinksToken_(
0078 consumes<edm::DetSetVector<PixelDigiSimLink> >(cfg.getParameter<edm::InputTag>("pixelSimLinkSrc"))),
0079 sistripSimLinksToken_(
0080 consumes<edm::DetSetVector<StripDigiSimLink> >(cfg.getParameter<edm::InputTag>("stripSimLinkSrc"))),
0081 siphase2OTSimLinksToken_(
0082 consumes<edm::DetSetVector<PixelDigiSimLink> >(cfg.getParameter<edm::InputTag>("phase2OTSimLinkSrc"))),
0083 pixelClustersToken_(
0084 consumes<edmNew::DetSetVector<SiPixelCluster> >(cfg.getParameter<edm::InputTag>("pixelClusterSrc"))),
0085 stripClustersToken_(
0086 consumes<edmNew::DetSetVector<SiStripCluster> >(cfg.getParameter<edm::InputTag>("stripClusterSrc"))),
0087 phase2OTClustersToken_(consumes<edmNew::DetSetVector<Phase2TrackerCluster1D> >(
0088 cfg.getParameter<edm::InputTag>("phase2OTClusterSrc"))),
0089 trackingParticleToken_(
0090 consumes<TrackingParticleCollection>(cfg.getParameter<edm::InputTag>("trackingParticleSrc"))),
0091 throwOnMissingCollections_(cfg.getParameter<bool>("throwOnMissingCollections")) {
0092 produces<ClusterTPAssociation>();
0093 }
0094
0095 void ClusterTPAssociationProducer::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0096 edm::ParameterSetDescription desc;
0097 desc.add<edm::InputTag>("simTrackSrc", edm::InputTag("g4SimHits"));
0098 desc.add<edm::InputTag>("pixelSimLinkSrc", edm::InputTag("simSiPixelDigis"));
0099 desc.add<edm::InputTag>("stripSimLinkSrc", edm::InputTag("simSiStripDigis"));
0100 desc.add<edm::InputTag>("phase2OTSimLinkSrc", edm::InputTag("simSiPixelDigis", "Tracker"));
0101 desc.add<edm::InputTag>("pixelClusterSrc", edm::InputTag("siPixelClusters"));
0102 desc.add<edm::InputTag>("stripClusterSrc", edm::InputTag("siStripClusters"));
0103 desc.add<edm::InputTag>("phase2OTClusterSrc", edm::InputTag("siPhase2Clusters"));
0104 desc.add<edm::InputTag>("trackingParticleSrc", edm::InputTag("mix", "MergedTrackTruth"));
0105 desc.add<bool>("throwOnMissingCollections", true);
0106 descriptions.add("tpClusterProducerDefault", desc);
0107 }
0108
0109 void ClusterTPAssociationProducer::produce(edm::StreamID, edm::Event& iEvent, const edm::EventSetup& es) const {
0110
0111 edm::Handle<edmNew::DetSetVector<SiPixelCluster> > pixelClusters;
0112 bool foundPixelClusters = iEvent.getByToken(pixelClustersToken_, pixelClusters);
0113
0114
0115 edm::Handle<edmNew::DetSetVector<SiStripCluster> > stripClusters;
0116 bool foundStripClusters = iEvent.getByToken(stripClustersToken_, stripClusters);
0117
0118
0119 edm::Handle<edmNew::DetSetVector<Phase2TrackerCluster1D> > phase2OTClusters;
0120 bool foundPhase2OTClusters = iEvent.getByToken(phase2OTClustersToken_, phase2OTClusters);
0121
0122
0123 edm::Handle<edm::DetSetVector<PixelDigiSimLink> > sipixelSimLinks;
0124 auto pixelSimLinksFound = iEvent.getByToken(sipixelSimLinksToken_, sipixelSimLinks);
0125 if (not throwOnMissingCollections_ and foundPixelClusters and not pixelSimLinksFound) {
0126 auto clusterTPList = std::make_unique<ClusterTPAssociation>();
0127 iEvent.put(std::move(clusterTPList));
0128 return;
0129 }
0130
0131
0132 edm::Handle<edm::DetSetVector<StripDigiSimLink> > sistripSimLinks;
0133 auto stripSimLinksFound = iEvent.getByToken(sistripSimLinksToken_, sistripSimLinks);
0134 if (not throwOnMissingCollections_ and foundStripClusters and not stripSimLinksFound) {
0135 auto clusterTPList = std::make_unique<ClusterTPAssociation>();
0136 iEvent.put(std::move(clusterTPList));
0137 return;
0138 }
0139
0140
0141 edm::Handle<edm::DetSetVector<PixelDigiSimLink> > siphase2OTSimLinks;
0142 auto phase2OTSimLinksFound = iEvent.getByToken(siphase2OTSimLinksToken_, siphase2OTSimLinks);
0143 if (not throwOnMissingCollections_ and foundPhase2OTClusters and not phase2OTSimLinksFound) {
0144 auto clusterTPList = std::make_unique<ClusterTPAssociation>();
0145 iEvent.put(std::move(clusterTPList));
0146 return;
0147 }
0148
0149
0150 edm::Handle<TrackingParticleCollection> TPCollectionH;
0151 auto tpFound = iEvent.getByToken(trackingParticleToken_, TPCollectionH);
0152 if (not throwOnMissingCollections_ and not tpFound) {
0153 auto clusterTPList = std::make_unique<ClusterTPAssociation>();
0154 iEvent.put(std::move(clusterTPList));
0155 return;
0156 }
0157
0158 auto clusterTPList = std::make_unique<ClusterTPAssociation>(TPCollectionH);
0159
0160
0161 std::unordered_map<UniqueSimTrackId, TrackingParticleRef, UniqueSimTrackIdHash> mapping;
0162 auto const& tpColl = *TPCollectionH.product();
0163 for (TrackingParticleCollection::size_type itp = 0; itp < tpColl.size(); ++itp) {
0164 TrackingParticleRef trackingParticleRef(TPCollectionH, itp);
0165 auto const& trackingParticle = tpColl[itp];
0166
0167 EncodedEventId eid(trackingParticle.eventId());
0168
0169 for (auto const& trk : trackingParticle.g4Tracks()) {
0170 UniqueSimTrackId trkid(trk.trackId(), eid);
0171
0172 mapping.insert(std::make_pair(trkid, trackingParticleRef));
0173 }
0174 }
0175
0176 std::unordered_set<UniqueSimTrackId, UniqueSimTrackIdHash> simTkIds;
0177 std::vector<UniqueSimTrackId> trkid;
0178 if (foundPixelClusters) {
0179
0180 clusterTPList->addKeyID(pixelClusters.id());
0181 for (edmNew::DetSetVector<SiPixelCluster>::const_iterator iter = pixelClusters->begin();
0182 iter != pixelClusters->end();
0183 ++iter) {
0184 uint32_t detid = iter->id();
0185 DetId detId(detid);
0186 edmNew::DetSet<SiPixelCluster> link_pixel = (*iter);
0187 for (edmNew::DetSet<SiPixelCluster>::const_iterator di = link_pixel.begin(); di != link_pixel.end(); ++di) {
0188 const SiPixelCluster& cluster = (*di);
0189 edm::Ref<edmNew::DetSetVector<SiPixelCluster>, SiPixelCluster> c_ref = edmNew::makeRefTo(pixelClusters, di);
0190
0191 simTkIds.clear();
0192 for (int irow = cluster.minPixelRow(); irow <= cluster.maxPixelRow(); ++irow) {
0193 for (int icol = cluster.minPixelCol(); icol <= cluster.maxPixelCol(); ++icol) {
0194 uint32_t channel = PixelChannelIdentifier::pixelToChannel(irow, icol);
0195 trkid.clear();
0196 getSimTrackId<PixelDigiSimLink>(trkid, sipixelSimLinks, detId, channel);
0197 simTkIds.insert(trkid.begin(), trkid.end());
0198 }
0199 }
0200 for (auto iset = simTkIds.begin(); iset != simTkIds.end(); iset++) {
0201 auto ipos = mapping.find(*iset);
0202 if (ipos != mapping.end()) {
0203
0204 clusterTPList->emplace_back(OmniClusterRef(c_ref), ipos->second);
0205 }
0206 }
0207 }
0208 }
0209 }
0210
0211 if (foundStripClusters) {
0212
0213 clusterTPList->addKeyID(stripClusters.id());
0214 for (edmNew::DetSetVector<SiStripCluster>::const_iterator iter = stripClusters->begin(false),
0215 eter = stripClusters->end(false);
0216 iter != eter;
0217 ++iter) {
0218 if (!(*iter).isValid())
0219 continue;
0220 uint32_t detid = iter->id();
0221 DetId detId(detid);
0222 edmNew::DetSet<SiStripCluster> link_strip = (*iter);
0223 for (edmNew::DetSet<SiStripCluster>::const_iterator di = link_strip.begin(); di != link_strip.end(); di++) {
0224 const SiStripCluster& cluster = (*di);
0225 edm::Ref<edmNew::DetSetVector<SiStripCluster>, SiStripCluster> c_ref = edmNew::makeRefTo(stripClusters, di);
0226
0227 simTkIds.clear();
0228 int first = cluster.firstStrip();
0229 int last = first + cluster.amplitudes().size();
0230
0231 for (int istr = first; istr < last; ++istr) {
0232 trkid.clear();
0233 getSimTrackId<StripDigiSimLink>(trkid, sistripSimLinks, detId, istr);
0234 simTkIds.insert(trkid.begin(), trkid.end());
0235 }
0236 for (auto iset = simTkIds.begin(); iset != simTkIds.end(); iset++) {
0237 auto ipos = mapping.find(*iset);
0238 if (ipos != mapping.end()) {
0239
0240 clusterTPList->emplace_back(OmniClusterRef(c_ref), ipos->second);
0241 }
0242 }
0243 }
0244 }
0245 }
0246
0247 if (foundPhase2OTClusters) {
0248
0249 clusterTPList->addKeyID(phase2OTClusters.id());
0250 if (phase2OTClusters.isValid()) {
0251 for (edmNew::DetSetVector<Phase2TrackerCluster1D>::const_iterator iter = phase2OTClusters->begin(false),
0252 eter = phase2OTClusters->end(false);
0253 iter != eter;
0254 ++iter) {
0255 if (!(*iter).isValid())
0256 continue;
0257 uint32_t detid = iter->id();
0258 DetId detId(detid);
0259 edmNew::DetSet<Phase2TrackerCluster1D> link_phase2 = (*iter);
0260 for (edmNew::DetSet<Phase2TrackerCluster1D>::const_iterator di = link_phase2.begin(); di != link_phase2.end();
0261 di++) {
0262 const Phase2TrackerCluster1D& cluster = (*di);
0263 edm::Ref<edmNew::DetSetVector<Phase2TrackerCluster1D>, Phase2TrackerCluster1D> c_ref =
0264 edmNew::makeRefTo(phase2OTClusters, di);
0265
0266 simTkIds.clear();
0267
0268 for (unsigned int istr(0); istr < cluster.size(); ++istr) {
0269 uint32_t channel = Phase2TrackerDigi::pixelToChannel(cluster.firstRow() + istr, cluster.column());
0270 trkid.clear();
0271 getSimTrackId<PixelDigiSimLink>(trkid, siphase2OTSimLinks, detId, channel);
0272 simTkIds.insert(trkid.begin(), trkid.end());
0273 }
0274
0275 for (auto iset = simTkIds.begin(); iset != simTkIds.end(); iset++) {
0276 auto ipos = mapping.find(*iset);
0277 if (ipos != mapping.end()) {
0278 clusterTPList->emplace_back(OmniClusterRef(c_ref), ipos->second);
0279 }
0280 }
0281 }
0282 }
0283 }
0284 }
0285 clusterTPList->sortAndUnique();
0286 iEvent.put(std::move(clusterTPList));
0287 }
0288
0289 #include "FWCore/PluginManager/interface/ModuleDef.h"
0290 #include "FWCore/Framework/interface/MakerMacros.h"
0291
0292 DEFINE_FWK_MODULE(ClusterTPAssociationProducer);