CMS 3D CMS Logo

/data/doxygen/doxygen-1.7.3/gen/CMSSW_4_2_8/src/RecoVertex/PrimaryVertexProducer/src/TrackFilterForPVFinding.cc

Go to the documentation of this file.
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 }