Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2025-01-22 07:34:25

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