Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2025-02-05 23:51:54

0001 #ifndef Validation_RecoHI_HitPixelLayersTrackSelection_h
0002 #define Validation_RecoHI_HitPixelLayersTrackSelection_h
0003 
0004 #include "DataFormats/TrackerCommon/interface/TrackerTopology.h"
0005 #include "FWCore/Framework/interface/ConsumesCollector.h"
0006 #include "FWCore/Framework/interface/ESHandle.h"
0007 #include "FWCore/Framework/interface/Event.h"
0008 #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
0009 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0010 #include "Geometry/Records/interface/TrackerTopologyRcd.h"
0011 #include "SimDataFormats/TrackingAnalysis/interface/TrackingParticle.h"
0012 #include "SimDataFormats/TrackingAnalysis/interface/TrackingParticleFwd.h"
0013 
0014 /**
0015  Selector to select only tracking particles that leave hits in three pixel layers
0016  Additional selection done on pt, rapidity, impact parameter, min hits, pdg id, etc.
0017 
0018  Inspired by CommonTools.RecoAlgos.TrackingParticleSelector.h
0019 **/
0020 
0021 class HitPixelLayersTPSelector {
0022 public:
0023   // input collection type
0024   typedef TrackingParticleCollection collection;
0025 
0026   // output collection type
0027   typedef TrackingParticleRefVector container;
0028 
0029   // iterator over result collection type.
0030   typedef container::const_iterator const_iterator;
0031 
0032   // constructor from parameter set configurability
0033   HitPixelLayersTPSelector(const edm::ParameterSet& iConfig, edm::ConsumesCollector&& iC)
0034       : tripletSeedOnly_(iConfig.getParameter<bool>("tripletSeedOnly")),
0035         ptMin_(iConfig.getParameter<double>("ptMin")),
0036         minRapidity_(iConfig.getParameter<double>("minRapidity")),
0037         maxRapidity_(iConfig.getParameter<double>("maxRapidity")),
0038         tip_(iConfig.getParameter<double>("tip")),
0039         lip_(iConfig.getParameter<double>("lip")),
0040         minHit_(iConfig.getParameter<int>("minHit")),
0041         signalOnly_(iConfig.getParameter<bool>("signalOnly")),
0042         chargedOnly_(iConfig.getParameter<bool>("chargedOnly")),
0043         primaryOnly_(iConfig.getParameter<bool>("primaryOnly")),
0044         tpStatusBased_(iConfig.getParameter<bool>("tpStatusBased")),
0045         pdgId_(iConfig.getParameter<std::vector<int> >("pdgId")),
0046         tTopoToken_(iC.esConsumes()) {}
0047 
0048   static void fillPSetDescription(edm::ParameterSetDescription& desc) {
0049     desc.add<bool>("tripletSeedOnly", true);
0050     desc.add<double>("ptMin", 2.0);
0051     desc.add<double>("minRapidity", -2.5);
0052     desc.add<double>("maxRapidity", 2.5);
0053     desc.add<double>("tip", 3.5);
0054     desc.add<double>("lip", 30.0);
0055     desc.add<int>("minHit", 8);
0056     desc.add<bool>("signalOnly", false);
0057     desc.add<bool>("chargedOnly", true);
0058     desc.add<bool>("primaryOnly", true);
0059     desc.add<bool>("tpStatusBased", true);
0060     desc.add<std::vector<int> >("pdgId", {});
0061   }
0062 
0063   // select object from a collection and
0064   // possibly event content
0065   void select(const edm::Handle<collection>& TPCH, const edm::Event& iEvent, const edm::EventSetup& iSetup) {
0066     selected_.clear();
0067     //Retrieve tracker topology from geometry
0068     const TrackerTopology* tTopo = &iSetup.getData(tTopoToken_);
0069 
0070     const collection& tpc = *(TPCH.product());
0071 
0072     for (TrackingParticleCollection::size_type i = 0; i < tpc.size(); i++) {
0073       TrackingParticleRef tpr(TPCH, i);
0074 
0075       // quickly reject if it is from pile-up
0076       if (signalOnly_ && !(tpr->eventId().bunchCrossing() == 0 && tpr->eventId().event() == 0))
0077         continue;
0078       if (chargedOnly_ && tpr->charge() == 0)
0079         continue;  //select only if charge!=0
0080       if (tpStatusBased_ && primaryOnly_ && tpr->status() != 1)
0081         continue;  // TP status based sel primary
0082       if ((!tpStatusBased_) && primaryOnly_ && tpr->parentVertex()->nSourceTracks() != 0)
0083         continue;  // vertex based sel for primary
0084 
0085       // loop over specified PID values
0086       bool testId = false;
0087       unsigned int idSize = pdgId_.size();
0088       if (idSize == 0)
0089         testId = true;
0090       else
0091         for (unsigned int it = 0; it != idSize; ++it) {
0092           if (tpr->pdgId() == pdgId_[it])
0093             testId = true;
0094         }
0095 
0096       // selection criteria
0097       if (tpr->numberOfTrackerLayers() >= minHit_ && sqrt(tpr->momentum().perp2()) >= ptMin_ &&
0098           tpr->momentum().eta() >= minRapidity_ && tpr->momentum().eta() <= maxRapidity_ &&
0099           sqrt(tpr->vertex().perp2()) <= tip_ && fabs(tpr->vertex().z()) <= lip_ && testId) {
0100         if (tripletSeedOnly_ && !goodHitPattern(pixelHitPattern(tpr, tTopo)))
0101           continue;  //findable triplet seed
0102         selected_.push_back(tpr);
0103       }
0104     }
0105   }
0106 
0107   // return pixel layer hit pattern
0108   std::vector<bool> pixelHitPattern(const TrackingParticleRef& simTrack, const TrackerTopology* tTopo) {
0109     std::vector<bool> hitpattern(5, false);  // PXB 0,1,2  PXF 0,1
0110     // This currently will always return false, since we can no loger use the sim hits to check for triplets.  This would need to be fixed if we want to enable this feature, but it's not being used at the moment, since tripletSeedOnly is always set to False  - Matt Nguyen, 24/7/2013
0111 
0112     return hitpattern;
0113   }
0114 
0115   // test whether hit pattern would give a pixel triplet seed
0116   bool goodHitPattern(const std::vector<bool>& hitpattern) {
0117     if ((hitpattern[0] && hitpattern[1] && hitpattern[2]) || (hitpattern[0] && hitpattern[1] && hitpattern[3]) ||
0118         (hitpattern[0] && hitpattern[3] && hitpattern[4]))
0119       return true;
0120     else
0121       return false;
0122   }
0123 
0124   // iterators over selected objects: collection begin
0125   const_iterator begin() const { return selected_.begin(); }
0126 
0127   // iterators over selected objects: collection end
0128   const_iterator end() const { return selected_.end(); }
0129 
0130   // true if no object has been selected
0131   size_t size() const { return selected_.size(); }
0132 
0133   //private:
0134 
0135   container selected_;
0136   bool tripletSeedOnly_;
0137   double ptMin_;
0138   double minRapidity_;
0139   double maxRapidity_;
0140   double tip_;
0141   double lip_;
0142   int minHit_;
0143   bool signalOnly_;
0144   bool chargedOnly_;
0145   bool primaryOnly_;
0146   bool tpStatusBased_;
0147   std::vector<int> pdgId_;
0148   edm::ESGetToken<TrackerTopology, TrackerTopologyRcd> tTopoToken_;
0149 };
0150 
0151 #endif