fastjet 2.4.3
|
00001 //******************************************************************************* 00002 // Filename : JetConeFinderTool.cc 00003 // Author : Ambreesh Gupta 00004 // Created : Nov, 2000 00005 // 00006 // Jan 2004: Use CLHEP units. Use phi = (-pi,pi]. 00007 // 00008 // File taken from SpartyJet v2.20.0 00009 // Modifications: 00010 // removed the string name in the ctor 00011 // removed the Message m_log 00012 // replaced StatusCode by an int (as defined previously) 00013 // cleaned the comments 00014 //******************************************************************************* 00015 00016 #include <iostream> 00017 00018 #include "JetConeFinderTool.hh" 00019 #include "Jet.hh" 00020 #include "JetDistances.hh" 00021 #include "CommonUtils.hh" 00022 00023 #include <vector> 00024 #include <math.h> 00025 00026 #include <fastjet/internal/base.hh> 00027 00028 FASTJET_BEGIN_NAMESPACE 00029 00030 namespace atlas { 00031 00032 // set the default energy scale 00033 double GeV = 1.0; //1000; 00034 00035 JetConeFinderTool::JetConeFinderTool() :m_coneR(0.7) 00036 , m_ptcut(0.0*GeV) 00037 , m_eps(0.05) 00038 , m_seedPt(2.0*GeV) 00039 , m_etaMax(5.0) 00040 {} 00041 00042 JetConeFinderTool::~JetConeFinderTool() 00043 {} 00044 00046 //Execution / 00048 int JetConeFinderTool::execute(jetcollection_t & theJets) 00049 { 00050 sort_jet_list<JetSorter_Et>(theJets); 00051 00052 m_pjetV = &theJets; 00053 00054 if(theJets.size()==0) return 0; 00055 00056 // Initiale ctr/dctr counter for object counting. 00057 m_ctr = 0; 00058 m_dctr = 0; 00059 00061 // Reconstruct Jets // 00063 this->reconstruct(); 00064 00066 // ReFill JetCollection // 00068 clear_list(theJets); 00069 jetcollection_t::iterator it = m_jetOV->begin(); 00070 jetcollection_t::iterator itE = m_jetOV->end(); 00071 for(; it!=itE; ++it){ 00072 theJets.push_back(*it); 00073 } 00074 00075 00076 delete m_jetOV; 00077 return 1; 00078 } 00079 00081 // Reconstruction algorithm specific methods / 00083 00084 void 00085 JetConeFinderTool::reconstruct() 00086 { 00087 m_jetOV = new jetcollection_t(); 00088 00089 jetcollection_t::iterator tItr; 00090 jetcollection_t::iterator tItr_begin = m_pjetV->begin(); 00091 jetcollection_t::iterator tItr_end = m_pjetV->end(); 00092 00093 // order towers in pt 00094 00095 for ( tItr=tItr_begin; tItr!=tItr_end; ++tItr ) { 00096 00097 // Seed Cut 00098 double tEt = (*tItr)->et(); 00099 if ( tEt < m_seedPt ) break; 00100 00101 // Tower eta, phi 00102 double etaT = (*tItr)->eta(); 00103 double phiT = (*tItr)->phi(); 00104 00105 // Iteration logic 00106 bool stable = false; 00107 bool inGeom = true; 00108 00109 Jet* preJet; 00110 00111 int count = 1; 00112 do { // Iteration Loop 00113 00114 // Make cone 00115 preJet = calc_cone(etaT,phiT); 00116 double etaC = preJet->eta(); 00117 double phiC = preJet->phi(); 00118 00119 double deta = fabs(etaT - etaC); 00120 double dphi = fabs(JetDistances::deltaPhi(phiT,phiC)); 00121 00122 // Is Stable ? 00123 if ( deta < m_eps && dphi < m_eps ) 00124 stable = true; 00125 00126 // In Geometry ? 00127 if ( fabs(etaC) > m_etaMax ) 00128 inGeom = false; 00129 00130 etaT = etaC; 00131 phiT = phiC; 00132 00133 if ( !stable && inGeom ) { 00134 delete preJet; 00135 m_dctr +=1; 00136 } 00137 ++count; 00138 00139 }while ( !stable && inGeom && count < 10 ); 00140 00141 if ( count > 9 && (!stable && inGeom) ) continue; // FIXME 9 ? 00142 00143 // If iteration was succesfull -- check if this is a new jet and 00144 // add it to OV. 00145 00146 if ( stable && inGeom ) { 00147 jetcollection_t::iterator pItr = m_jetOV->begin(); 00148 jetcollection_t::iterator pItrE = m_jetOV->end(); 00149 00150 bool newJet = true; 00151 double etaT = preJet->eta(); 00152 double phiT = preJet->phi(); 00153 00154 for ( ; pItr != pItrE ; ++pItr ) { 00155 double etaC = (*pItr)->eta(); 00156 double phiC = (*pItr)->phi(); 00157 00158 double deta = fabs(etaT - etaC); 00159 double dphi = fabs(JetDistances::deltaPhi(phiT,phiC)); 00160 00161 if ( deta < 0.05 && dphi < 0.05 ) { 00162 newJet = false; 00163 break; 00164 } 00165 } 00166 if ( newJet ) { 00167 m_jetOV->push_back( preJet ); 00168 } 00169 else { 00170 delete preJet; 00171 m_dctr +=1; 00172 } 00173 } 00174 else { 00175 delete preJet; 00176 m_dctr +=1; 00177 } 00178 } 00179 } 00180 00181 Jet* JetConeFinderTool::calc_cone(double eta, double phi) 00182 { 00183 // Create a new Jet 00184 Jet* j = new Jet(); 00185 m_ctr +=1; 00186 00187 // Add all ProtoJet within m_coneR to this Jet 00188 jetcollection_t::iterator itr = m_pjetV->begin(); 00189 jetcollection_t::iterator itrE = m_pjetV->end(); 00190 00191 for ( ; itr!=itrE; ++itr ) { 00192 double dR = JetDistances::deltaR(eta,phi,(*itr)->eta(),(*itr)->phi()); 00193 if ( dR < m_coneR ) { 00194 j->addJet( (*itr) ); 00195 } 00196 } 00197 00198 return j; 00199 } 00200 00201 00202 00203 } // namespace atlas 00204 00205 FASTJET_END_NAMESPACE