CMS 3D CMS Logo

TrackClusterizerInZ.cc

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

Generated on Tue Jun 9 17:46:12 2009 for CMSSW by  doxygen 1.5.4