File indexing completed on 2024-04-06 12:26:33
0001 #include "FWCore/Framework/interface/Frameworkfwd.h"
0002 #include "FWCore/Framework/interface/stream/EDProducer.h"
0003 #include "FWCore/Framework/interface/Event.h"
0004 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0005 #include "FWCore/Utilities/interface/InputTag.h"
0006
0007 #include "DataFormats/Phase2TrackerCluster/interface/Phase2TrackerCluster1D.h"
0008 #include "DataFormats/SiPixelCluster/interface/SiPixelCluster.h"
0009
0010 #include "DataFormats/TrackerRecHit2D/interface/Phase2TrackerRecHit1D.h"
0011 #include "DataFormats/TrackerRecHit2D/interface/SiPixelRecHit.h"
0012 #include "DataFormats/TrackerRecHit2D/interface/SiPixelRecHitCollection.h"
0013 #include "DataFormats/TrackerRecHit2D/interface/VectorHit.h"
0014
0015 #include "DataFormats/Common/interface/Handle.h"
0016 #include "DataFormats/Common/interface/DetSetVector.h"
0017 #include "DataFormats/Common/interface/ValueMap.h"
0018 #include "DataFormats/Common/interface/DetSetVectorNew.h"
0019 #include "DataFormats/Provenance/interface/ProductID.h"
0020 #include "DataFormats/Common/interface/ContainerMask.h"
0021
0022 #include "TrackingTools/PatternTools/interface/Trajectory.h"
0023 #include "DataFormats/TrajectorySeed/interface/TrajectorySeedCollection.h"
0024
0025 #include "Geometry/Records/interface/TrackerDigiGeometryRecord.h"
0026 #include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h"
0027 #include "Geometry/CommonDetUnit/interface/GeomDet.h"
0028 #include "Geometry/CommonDetUnit/interface/GeomDetType.h"
0029
0030
0031
0032
0033
0034 class SeedClusterRemoverPhase2 : public edm::stream::EDProducer<> {
0035 public:
0036 SeedClusterRemoverPhase2(const edm::ParameterSet &iConfig);
0037 void produce(edm::Event &iEvent, const edm::EventSetup &iSetup) override;
0038
0039 private:
0040 edm::ESGetToken<TrackerGeometry, TrackerDigiGeometryRecord> const tTrackerGeom_;
0041 bool doOuterTracker_, doPixel_;
0042 bool mergeOld_;
0043 typedef edm::ContainerMask<edmNew::DetSetVector<SiPixelCluster> > PixelMaskContainer;
0044 typedef edm::ContainerMask<edmNew::DetSetVector<Phase2TrackerCluster1D> > Phase2OTMaskContainer;
0045 edm::EDGetTokenT<edmNew::DetSetVector<SiPixelCluster> > pixelClusters_;
0046 edm::EDGetTokenT<edmNew::DetSetVector<Phase2TrackerCluster1D> > phase2OTClusters_;
0047 edm::EDGetTokenT<PixelMaskContainer> oldPxlMaskToken_;
0048 edm::EDGetTokenT<Phase2OTMaskContainer> oldPh2OTMaskToken_;
0049 edm::EDGetTokenT<TrajectorySeedCollection> trajectories_;
0050
0051 std::vector<uint8_t> pixels, OTs;
0052 edm::ProductID pixelSourceProdID, outerTrackerSourceProdID;
0053
0054 inline void process(const TrackingRecHit *hit, float chi2, const TrackerGeometry *tg);
0055
0056 std::vector<bool> collectedOuterTrackers_;
0057 std::vector<bool> collectedPixels_;
0058 };
0059
0060 using namespace std;
0061 using namespace edm;
0062
0063 SeedClusterRemoverPhase2::SeedClusterRemoverPhase2(const ParameterSet &iConfig)
0064 : tTrackerGeom_(esConsumes<TrackerGeometry, TrackerDigiGeometryRecord>()),
0065 doOuterTracker_(iConfig.existsAs<bool>("doOuterTracker") ? iConfig.getParameter<bool>("doOuterTracker") : true),
0066 doPixel_(iConfig.existsAs<bool>("doPixel") ? iConfig.getParameter<bool>("doPixel") : true),
0067 mergeOld_(iConfig.exists("oldClusterRemovalInfo")) {
0068 produces<edm::ContainerMask<edmNew::DetSetVector<SiPixelCluster> > >();
0069 produces<edm::ContainerMask<edmNew::DetSetVector<Phase2TrackerCluster1D> > >();
0070
0071 trajectories_ = consumes<TrajectorySeedCollection>(iConfig.getParameter<InputTag>("trajectories"));
0072 if (doPixel_)
0073 pixelClusters_ = consumes<edmNew::DetSetVector<SiPixelCluster> >(iConfig.getParameter<InputTag>("pixelClusters"));
0074 if (doOuterTracker_)
0075 phase2OTClusters_ =
0076 consumes<edmNew::DetSetVector<Phase2TrackerCluster1D> >(iConfig.getParameter<InputTag>("phase2OTClusters"));
0077 if (mergeOld_) {
0078 oldPxlMaskToken_ = consumes<PixelMaskContainer>(iConfig.getParameter<InputTag>("oldClusterRemovalInfo"));
0079 oldPh2OTMaskToken_ = consumes<Phase2OTMaskContainer>(iConfig.getParameter<InputTag>("oldClusterRemovalInfo"));
0080 }
0081 }
0082
0083 void SeedClusterRemoverPhase2::process(const TrackingRecHit *hit, float chi2, const TrackerGeometry *tg) {
0084 DetId detid = hit->geographicalId();
0085 uint32_t subdet = detid.subdetId();
0086
0087 assert(subdet > 0);
0088
0089 const type_info &hitType = typeid(*hit);
0090 if (hitType == typeid(SiPixelRecHit)) {
0091 if (!doPixel_)
0092 return;
0093
0094 const SiPixelRecHit *pixelHit = static_cast<const SiPixelRecHit *>(hit);
0095 SiPixelRecHit::ClusterRef cluster = pixelHit->cluster();
0096 LogDebug("SeedClusterRemoverPhase2") << "Plain Pixel RecHit in det " << detid.rawId();
0097
0098 if (cluster.id() != pixelSourceProdID)
0099 throw cms::Exception("Inconsistent Data")
0100 << "SeedClusterRemoverPhase2: pixel cluster ref from Product ID = " << cluster.id()
0101 << " does not match with source cluster collection (ID = " << pixelSourceProdID << ")\n.";
0102
0103 assert(cluster.id() == pixelSourceProdID);
0104
0105
0106 pixels[cluster.key()] = false;
0107
0108 assert(collectedPixels_.size() > cluster.key());
0109 collectedPixels_[cluster.key()] = true;
0110
0111 } else if (hitType == typeid(Phase2TrackerRecHit1D)) {
0112 if (!doOuterTracker_)
0113 return;
0114
0115 const Phase2TrackerRecHit1D *ph2OThit = static_cast<const Phase2TrackerRecHit1D *>(hit);
0116 LogDebug("SeedClusterRemoverPhase2") << "Plain Phase2TrackerRecHit1D in det " << detid.rawId();
0117
0118 Phase2TrackerRecHit1D::ClusterRef cluster = ph2OThit->cluster();
0119 if (cluster.id() != outerTrackerSourceProdID)
0120 throw cms::Exception("Inconsistent Data")
0121 << "SeedClusterRemoverPhase2: strip cluster ref from Product ID = " << cluster.id()
0122 << " does not match with source cluster collection (ID = " << outerTrackerSourceProdID << ")\n.";
0123
0124 assert(cluster.id() == outerTrackerSourceProdID);
0125
0126 OTs[cluster.key()] = false;
0127 assert(collectedOuterTrackers_.size() > cluster.key());
0128 collectedOuterTrackers_[cluster.key()] = true;
0129
0130 } else if (hitType == typeid(VectorHit)) {
0131 if (!doOuterTracker_)
0132 return;
0133
0134 const VectorHit *vhit = static_cast<const VectorHit *>(hit);
0135 LogDebug("SeedClusterRemoverPhase2") << "Plain VectorHit in det " << detid.rawId();
0136
0137
0138 Phase2TrackerRecHit1D::ClusterRef cluster = vhit->lowerCluster();
0139 if (cluster.id() != outerTrackerSourceProdID)
0140 throw cms::Exception("Inconsistent Data")
0141 << "SeedClusterRemoverPhase2: strip cluster ref from Product ID = " << cluster.id()
0142 << " does not match with source cluster collection (ID = " << outerTrackerSourceProdID << ")\n.";
0143
0144 OTs[cluster.key()] = false;
0145 assert(collectedOuterTrackers_.size() > cluster.key());
0146 collectedOuterTrackers_[cluster.key()] = true;
0147
0148
0149 cluster = vhit->upperCluster();
0150 if (cluster.id() != outerTrackerSourceProdID)
0151 throw cms::Exception("Inconsistent Data")
0152 << "SeedClusterRemoverPhase2: strip cluster ref from Product ID = " << cluster.id()
0153 << " does not match with source cluster collection (ID = " << outerTrackerSourceProdID << ")\n.";
0154
0155 OTs[cluster.key()] = false;
0156 assert(collectedOuterTrackers_.size() > cluster.key());
0157 collectedOuterTrackers_[cluster.key()] = true;
0158 } else
0159 throw cms::Exception("NOT IMPLEMENTED")
0160 << "I received a hit that was neither SiPixelRecHit nor Phase2TrackerRecHit1D but " << hitType.name()
0161 << " on detid " << detid.rawId() << "\n";
0162 }
0163
0164 void SeedClusterRemoverPhase2::produce(Event &iEvent, const EventSetup &iSetup) {
0165 ProductID pixelOldProdID, stripOldProdID;
0166
0167 const auto &tgh = &iSetup.getData(tTrackerGeom_);
0168
0169 Handle<edmNew::DetSetVector<SiPixelCluster> > pixelClusters;
0170 if (doPixel_) {
0171 iEvent.getByToken(pixelClusters_, pixelClusters);
0172 pixelSourceProdID = pixelClusters.id();
0173 }
0174 LogDebug("SeedClusterRemoverPhase2") << "Read pixel with id " << pixelSourceProdID << std::endl;
0175
0176 Handle<edmNew::DetSetVector<Phase2TrackerCluster1D> > phase2OTClusters;
0177 if (doOuterTracker_) {
0178 iEvent.getByToken(phase2OTClusters_, phase2OTClusters);
0179 outerTrackerSourceProdID = phase2OTClusters.id();
0180 }
0181 LogDebug("SeedClusterRemoverPhase2") << "Read OT cluster with id " << outerTrackerSourceProdID << std::endl;
0182
0183 if (doOuterTracker_) {
0184 OTs.resize(phase2OTClusters->dataSize());
0185 fill(OTs.begin(), OTs.end(), true);
0186 }
0187 if (doPixel_) {
0188 pixels.resize(pixelClusters->dataSize());
0189 fill(pixels.begin(), pixels.end(), true);
0190 }
0191 if (mergeOld_) {
0192 edm::Handle<PixelMaskContainer> oldPxlMask;
0193 edm::Handle<Phase2OTMaskContainer> oldPh2OTMask;
0194 iEvent.getByToken(oldPxlMaskToken_, oldPxlMask);
0195 iEvent.getByToken(oldPh2OTMaskToken_, oldPh2OTMask);
0196 LogDebug("SeedClusterRemoverPhase2") << "to merge in, " << oldPh2OTMask->size() << " strp and "
0197 << oldPxlMask->size() << " pxl";
0198 oldPh2OTMask->copyMaskTo(collectedOuterTrackers_);
0199 oldPxlMask->copyMaskTo(collectedPixels_);
0200 assert(phase2OTClusters->dataSize() >= collectedOuterTrackers_.size());
0201 collectedOuterTrackers_.resize(phase2OTClusters->dataSize(), false);
0202 } else {
0203 collectedOuterTrackers_.resize(phase2OTClusters->dataSize(), false);
0204 collectedPixels_.resize(pixelClusters->dataSize(), false);
0205 }
0206
0207 edm::Handle<TrajectorySeedCollection> seeds;
0208 iEvent.getByToken(trajectories_, seeds);
0209
0210 for (auto const &seed : (*seeds)) {
0211 for (auto const &hit : seed.recHits()) {
0212 if (!hit.isValid())
0213 continue;
0214 process(&hit, 0., tgh);
0215 }
0216 }
0217
0218 pixels.clear();
0219 OTs.clear();
0220
0221 LogDebug("SeedClusterRemoverPhase2") << "total strip to skip: "
0222 << std::count(
0223 collectedOuterTrackers_.begin(), collectedOuterTrackers_.end(), true);
0224 iEvent.put(std::make_unique<Phase2OTMaskContainer>(
0225 edm::RefProd<edmNew::DetSetVector<Phase2TrackerCluster1D> >(phase2OTClusters), collectedOuterTrackers_));
0226
0227 LogDebug("SeedClusterRemoverPhase2") << "total pxl to skip: "
0228 << std::count(collectedPixels_.begin(), collectedPixels_.end(), true);
0229 iEvent.put(std::make_unique<PixelMaskContainer>(edm::RefProd<edmNew::DetSetVector<SiPixelCluster> >(pixelClusters),
0230 collectedPixels_));
0231
0232 collectedOuterTrackers_.clear();
0233 collectedPixels_.clear();
0234 }
0235
0236 #include "FWCore/PluginManager/interface/ModuleDef.h"
0237 #include "FWCore/Framework/interface/MakerMacros.h"
0238 DEFINE_FWK_MODULE(SeedClusterRemoverPhase2);