![]() |
![]() |
00001 #include "RecoVertex/PrimaryVertexProducer/interface/TrackClusterizerInZ.h" 00002 00003 using namespace std; 00004 00005 namespace { 00006 00007 bool recTrackLessZ(const reco::TransientTrack & tk1, 00008 const reco::TransientTrack & tk2) 00009 { 00010 return tk1.stateAtBeamLine().trackStateAtPCA().position().z() < tk2.stateAtBeamLine().trackStateAtPCA().position().z(); 00011 } 00012 00013 } 00014 00015 00016 TrackClusterizerInZ::TrackClusterizerInZ(const edm::ParameterSet& conf) 00017 { 00018 zSep = conf.getParameter<double>("zSeparation"); 00019 } 00020 00021 00022 vector< vector<reco::TransientTrack> > 00023 TrackClusterizerInZ::clusterize(const vector<reco::TransientTrack> & tracks) 00024 const 00025 { 00026 00027 vector<reco::TransientTrack> tks = tracks; // copy to be sorted 00028 00029 vector< vector<reco::TransientTrack> > clusters; 00030 if (tks.empty()) return clusters; 00031 00032 // sort in increasing order of z 00033 stable_sort(tks.begin(), tks.end(), recTrackLessZ); 00034 00035 // init first cluster 00036 vector<reco::TransientTrack>::const_iterator it = tks.begin(); 00037 vector <reco::TransientTrack> currentCluster; currentCluster.push_back(*it); 00038 00039 it++; 00040 for ( ; it != tks.end(); it++) { 00041 00042 double zPrev = currentCluster.back().stateAtBeamLine().trackStateAtPCA().position().z(); 00043 double zCurr = (*it).stateAtBeamLine().trackStateAtPCA().position().z(); 00044 if ( abs(zCurr - zPrev) < zSeparation() ) { 00045 // close enough ? cluster together 00046 currentCluster.push_back(*it); 00047 } 00048 else { 00049 // store current cluster, start new one 00050 clusters.push_back(currentCluster); 00051 currentCluster.clear(); 00052 currentCluster.push_back(*it); 00053 it++; if (it == tks.end()) break; 00054 } 00055 } 00056 00057 // store last cluster 00058 clusters.push_back(currentCluster); 00059 00060 return clusters; 00061 00062 } 00063 00064 00065 float TrackClusterizerInZ::zSeparation() const 00066 { 00067 return zSep; 00068 }