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
0016
0017
0018
0019
0020
0021 class HitPixelLayersTPSelector {
0022 public:
0023
0024 typedef TrackingParticleCollection collection;
0025
0026
0027 typedef TrackingParticleRefVector container;
0028
0029
0030 typedef container::const_iterator const_iterator;
0031
0032
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
0064
0065 void select(const edm::Handle<collection>& TPCH, const edm::Event& iEvent, const edm::EventSetup& iSetup) {
0066 selected_.clear();
0067
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
0076 if (signalOnly_ && !(tpr->eventId().bunchCrossing() == 0 && tpr->eventId().event() == 0))
0077 continue;
0078 if (chargedOnly_ && tpr->charge() == 0)
0079 continue;
0080 if (tpStatusBased_ && primaryOnly_ && tpr->status() != 1)
0081 continue;
0082 if ((!tpStatusBased_) && primaryOnly_ && tpr->parentVertex()->nSourceTracks() != 0)
0083 continue;
0084
0085
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
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;
0102 selected_.push_back(tpr);
0103 }
0104 }
0105 }
0106
0107
0108 std::vector<bool> pixelHitPattern(const TrackingParticleRef& simTrack, const TrackerTopology* tTopo) {
0109 std::vector<bool> hitpattern(5, false);
0110
0111
0112 return hitpattern;
0113 }
0114
0115
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
0125 const_iterator begin() const { return selected_.begin(); }
0126
0127
0128 const_iterator end() const { return selected_.end(); }
0129
0130
0131 size_t size() const { return selected_.size(); }
0132
0133
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