![]() |
![]() |
00001 #include "RecoVertex/PrimaryVertexProducer/interface/TrackFilterForPVFinding.h" 00002 #include <cmath> 00003 00004 TrackFilterForPVFinding::TrackFilterForPVFinding(const edm::ParameterSet& conf) 00005 { 00006 maxD0Sig_ = conf.getParameter<double>("maxD0Significance"); 00007 minPt_ = conf.getParameter<double>("minPt"); 00008 maxNormChi2_ = conf.getParameter<double>("maxNormalizedChi2"); 00009 minSiLayers_ = conf.getParameter<int>("minSiliconLayersWithHits"); 00010 minPxLayers_ = conf.getParameter<int>("minPixelLayersWithHits"); 00011 00012 // the next few lines are taken from RecoBTag/SecondaryVertex/interface/TrackSelector.h" 00013 std::string qualityClass = 00014 conf.getParameter<std::string>("trackQuality"); 00015 if (qualityClass == "any" || qualityClass == "Any" || 00016 qualityClass == "ANY" || qualityClass == "") { 00017 quality_ = reco::TrackBase::undefQuality; 00018 } else { 00019 quality_ = reco::TrackBase::qualityByName(qualityClass); 00020 } 00021 00022 } 00023 00024 // select a single track 00025 bool 00026 TrackFilterForPVFinding::operator() (const reco::TransientTrack & tk) const 00027 { 00028 if (!tk.stateAtBeamLine().isValid()) return false; 00029 bool IPSigCut = tk.stateAtBeamLine().transverseImpactParameter().significance()<maxD0Sig_; 00030 bool pTCut = tk.impactPointState().globalMomentum().transverse() > minPt_; 00031 bool normChi2Cut = tk.normalizedChi2() < maxNormChi2_; 00032 bool nPxLayCut = tk.hitPattern().pixelLayersWithMeasurement() >= minPxLayers_; 00033 bool nSiLayCut = tk.hitPattern().trackerLayersWithMeasurement() >= minSiLayers_; 00034 bool trackQualityCut = (quality_==reco::TrackBase::undefQuality)|| tk.track().quality(quality_); 00035 00036 return IPSigCut && pTCut && normChi2Cut && nPxLayCut && nSiLayCut && trackQualityCut; 00037 } 00038 00039 00040 00041 // select the vector of tracks that pass the filter cuts 00042 std::vector<reco::TransientTrack> TrackFilterForPVFinding::select(const std::vector<reco::TransientTrack>& tracks) const 00043 { 00044 std::vector <reco::TransientTrack> seltks; 00045 for (std::vector<reco::TransientTrack>::const_iterator itk = tracks.begin(); 00046 itk != tracks.end(); itk++) { 00047 if ( operator()(*itk) ) seltks.push_back(*itk); // calls the filter function for single tracks 00048 } 00049 return seltks; 00050 }