JetSplitMergeTool.cc
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #include <iostream>
00015
00016 #include "JetSplitMergeTool.hh"
00017 #include "Jet.hh"
00018 #include "JetDistances.hh"
00019 #include "CommonUtils.hh"
00020
00021 #include <fastjet/internal/base.hh>
00022
00023 FASTJET_BEGIN_NAMESPACE
00024
00025 namespace atlas {
00026
00027 JetSplitMergeTool::JetSplitMergeTool()
00028 : m_f( 0.5 )
00029 {}
00030
00031 JetSplitMergeTool::~JetSplitMergeTool()
00032 {}
00033
00035
00037 int JetSplitMergeTool::execute( jetcollection_t* theJets )
00038 {
00039 m_ctr = 0;
00040 m_dctr = 0;
00041
00043
00045 m_preJet.clear();
00046 m_jet.clear();
00047
00048 jetcollection_t::iterator itrB = theJets->begin();
00049 jetcollection_t::iterator itrE = theJets->end();
00050
00051 double etot =0.;
00052 for (;itrB!=itrE;itrB++) {
00053 Jet* j = new Jet(); j->addJet(*itrB);
00054 m_ctr +=1;
00055 m_preJet.push_back(j);
00056
00057 etot += j->e();
00058 }
00059
00061
00063 this->split_merge();
00064
00066
00068 clear_list(*theJets);
00069 jetcollection_t::iterator it = m_jet.begin();
00070 jetcollection_t::iterator itE = m_jet.end();
00071 for(; it!=itE; ++it){
00072 theJets->push_back(*it);
00073 }
00074
00075 return 1;
00076 }
00077
00079
00081
00082 void JetSplitMergeTool::split_merge()
00083 {
00084 if ( m_preJet.size() >= 2 ) {
00085 do {
00086 sort_list_et(m_preJet);
00087
00088 jetcollection_t::iterator itr;
00089 jetcollection_t::iterator first = m_preJet.begin();
00090 jetcollection_t::iterator last = m_preJet.end();
00091
00092 itr=first;
00093 ++itr;
00094 bool overlap = false;
00095
00096 for (;itr != last;++itr) {
00097 double etaF = (*first)->eta();
00098 double phiF = (*first)->phi();
00099 double etaS = (*itr)->eta();
00100 double phiS = (*itr)->phi();
00101
00102 Jet* oJet = jet_from_overlap( (*first),*itr);
00103 m_ctr +=1;
00104
00105 Jet::constit_vect_t::iterator itro = oJet->firstConstituent();
00106 Jet::constit_vect_t::iterator itroE = oJet->lastConstituent();
00107
00108 if ( oJet->getConstituentNum() != 0 ) {
00109 overlap = true;
00110
00111
00112 double f = sqrt(pow(oJet->px,2)+pow(oJet->py,2))/
00113 sqrt(pow((*itr)->px,2)+pow((*itr)->py,2));
00114
00115
00116 if ( f > m_f) {
00117
00118 Jet *j = (*first);
00119 for ( ;itro != itroE; ++itro ) j->removeConstituent(*itro);
00120 (*first)->addJet(*itr);
00121
00122 delete *itr;
00123 m_preJet.erase(itr);
00124 m_dctr +=1;
00125 }
00126
00127
00128 if ( f <= m_f) {
00129 for ( ;itro != itroE; ++itro ) {
00130
00131 double deta1 = etaF - (*itro)->eta();
00132 double dphi1 = fabs(JetDistances::deltaPhi(phiF,(*itro)->phi()));
00133 double dist1 = pow( deta1 , 2 ) + pow( dphi1 , 2 );
00134
00135
00136 double deta2 = etaS - (*itro)->eta();
00137 double dphi2 = fabs(JetDistances::deltaPhi(phiS,(*itro)->phi()));
00138 double dist2 = pow( deta2 , 2 ) + pow( dphi2 , 2 );
00139
00140
00141 if ( dist1 > dist2 ) (*first)->removeConstituent(*itro);
00142 if ( dist1 <= dist2 ) (*itr)->removeConstituent(*itro);
00143 }
00144 }
00145
00146 delete oJet;
00147 m_dctr +=1;
00148 break;
00149 }
00150 else {
00151
00152 delete oJet;
00153 m_dctr +=1;
00154 }
00155 }
00156
00157 if ( overlap == false ) {
00158 m_jet.push_back(*first);
00159
00160 m_preJet.erase(first);
00161 }
00162
00163 } while ( m_preJet.size() != 0 );
00164 }
00165 else if ( m_preJet.size() == 1) {
00166 m_jet.push_back( *(m_preJet.begin()) );
00167 }
00168
00169 }
00170
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181 double JetSplitMergeTool::etaTrue(Jet::constit_vect_t::iterator pj)
00182 {
00183 double s = ((*pj)->e() > 0) ? +1.0 : -1.0;
00184 double px = (*pj)->px;
00185 double py = (*pj)->py;
00186 double pz = (*pj)->pz;
00187 double theta = acos(pz*s/sqrt(px*px+py*py+pz*pz));
00188 return -log(tan(theta/2.0));
00189 }
00190
00191 double JetSplitMergeTool::phiTrue(Jet::constit_vect_t::iterator pj)
00192 {
00193 double s = ((*pj)->e() > 0) ? +1.0 : -1.0;
00194 double px = (*pj)->px;
00195 double py = (*pj)->py;
00196 return atan2(py*s,px*s);
00197 }
00198
00199 }
00200
00201 FASTJET_END_NAMESPACE