00001 #include "RecoTauTag/HLTProducers/interface/L2TauSimpleClustering.h" 00002 #include "Math/GenVector/VectorUtil.h" 00003 00004 00005 L2TauSimpleClustering::L2TauSimpleClustering() 00006 { 00007 m_clusterRadius=0.08; 00008 } 00009 00010 L2TauSimpleClustering::L2TauSimpleClustering(double radius) 00011 { 00012 m_clusterRadius=radius; 00013 } 00014 00015 L2TauSimpleClustering::~L2TauSimpleClustering() 00016 {} 00017 00018 00019 math::PtEtaPhiELorentzVectorCollection 00020 L2TauSimpleClustering::clusterize(const math::PtEtaPhiELorentzVectorCollection& myRecHits) 00021 { 00022 00023 math::PtEtaPhiELorentzVectorCollection m_clusters; 00024 00025 //If we have Hits do Clustering 00026 if(myRecHits.size()>0) 00027 { 00028 //Create the first Cluster by maximum Crystal 00029 m_clusters.push_back(myRecHits[0]); 00030 00031 //Loop on The Clusters if there are at least two hits 00032 if(myRecHits.size()>=2) 00033 for(math::PtEtaPhiELorentzVectorCollection::const_iterator h = myRecHits.begin()+1;h!=myRecHits.end();++h) 00034 { 00035 //These vars are used to find the nearest clusters to this hits 00036 double dR_min=100; 00037 int ptr=0; 00038 int ptr_min=-1; 00039 00040 for(math::PtEtaPhiELorentzVectorCollection::iterator j=m_clusters.begin()+1;j!=m_clusters.end();j++) 00041 { 00042 if(ROOT::Math::VectorUtil::DeltaR(*h,*j)<m_clusterRadius) 00043 { 00044 if(ROOT::Math::VectorUtil::DeltaR(*h,*j)<dR_min) 00045 { 00046 dR_min=ROOT::Math::VectorUtil::DeltaR(*h,*j); 00047 ptr_min=ptr; 00048 } 00049 } 00050 ptr++; 00051 } 00052 00053 //If it does not belong to cluster add a new one else add the Crystal to the Cluster 00054 if(ptr_min==-1) 00055 m_clusters.push_back(*h); 00056 else 00057 m_clusters[ptr_min]+=*h; 00058 } 00059 00060 } 00061 return m_clusters; 00062 } 00063