[d7d2da3] | 1 | //----------------------------------------------------------------------
|
---|
| 2 | // This file distributed with FastJet has been obtained from SpartyJet
|
---|
| 3 | // v2.20.0 by Pierre-Antoine Delsart, Kurtis L. Geerlings, Joey
|
---|
| 4 | // Huston, Brian T. Martin and Chris Vermilion
|
---|
| 5 | // For details, see http://www.pa.msu.edu/~huston/SpartyJet/
|
---|
| 6 | // http://projects.hepforge.org/spartyjet/
|
---|
| 7 | //
|
---|
| 8 | // Changes from the original file are listed below.
|
---|
| 9 | //----------------------------------------------------------------------
|
---|
| 10 |
|
---|
| 11 | //*******************************************************************************
|
---|
| 12 | // Filename : JetConeFinderTool.cc
|
---|
| 13 | // Author : Ambreesh Gupta
|
---|
| 14 | // Created : Nov, 2000
|
---|
| 15 | //
|
---|
| 16 | // Jan 2004: Use CLHEP units. Use phi = (-pi,pi].
|
---|
| 17 | //*******************************************************************************
|
---|
| 18 |
|
---|
| 19 | // History of changes from the original JetConeFinder.cc file in
|
---|
| 20 | // SpartyJet v2.20
|
---|
| 21 | //
|
---|
| 22 | // 2009-01-15 Gregory Soyez <soyez@fastjet.fr>
|
---|
| 23 | //
|
---|
| 24 | // * put the code in the fastjet::atlas namespace
|
---|
| 25 | //
|
---|
| 26 | // 2009-02-14 Gregory Soyez <soyez@fastjet.fr>
|
---|
| 27 | //
|
---|
| 28 | // * imported into FastJet
|
---|
| 29 | // * removed the string name in the ctor
|
---|
| 30 | // * removed the message logs
|
---|
| 31 | // * replaced StatusCode by int
|
---|
| 32 | // * cleaned the comments
|
---|
| 33 |
|
---|
| 34 | #include <iostream>
|
---|
| 35 |
|
---|
| 36 | #include "JetConeFinderTool.hh"
|
---|
| 37 | #include "Jet.hh"
|
---|
| 38 | #include "JetDistances.hh"
|
---|
| 39 | #include "CommonUtils.hh"
|
---|
| 40 |
|
---|
| 41 | #include <vector>
|
---|
| 42 | #include <math.h>
|
---|
| 43 |
|
---|
| 44 | #include <fastjet/internal/base.hh>
|
---|
| 45 |
|
---|
| 46 | FASTJET_BEGIN_NAMESPACE
|
---|
| 47 |
|
---|
| 48 | namespace atlas {
|
---|
| 49 |
|
---|
| 50 | // set the default energy scale
|
---|
| 51 | double GeV = 1.0; //1000;
|
---|
| 52 |
|
---|
| 53 | JetConeFinderTool::JetConeFinderTool() :m_coneR(0.7)
|
---|
| 54 | , m_ptcut(0.0*GeV)
|
---|
| 55 | , m_eps(0.05)
|
---|
| 56 | , m_seedPt(2.0*GeV)
|
---|
| 57 | , m_etaMax(5.0)
|
---|
| 58 | {}
|
---|
| 59 |
|
---|
| 60 | JetConeFinderTool::~JetConeFinderTool()
|
---|
| 61 | {}
|
---|
| 62 |
|
---|
| 63 | /////////////////////////////////////////////////////////////////////////////////
|
---|
| 64 | //Execution /
|
---|
| 65 | /////////////////////////////////////////////////////////////////////////////////
|
---|
| 66 | int JetConeFinderTool::execute(jetcollection_t & theJets)
|
---|
| 67 | {
|
---|
| 68 | sort_jet_list<JetSorter_Et>(theJets);
|
---|
| 69 |
|
---|
| 70 | m_pjetV = &theJets;
|
---|
| 71 |
|
---|
| 72 | if(theJets.size()==0) return 0;
|
---|
| 73 |
|
---|
| 74 | // Initiale ctr/dctr counter for object counting.
|
---|
| 75 | m_ctr = 0;
|
---|
| 76 | m_dctr = 0;
|
---|
| 77 |
|
---|
| 78 | //////////////////////
|
---|
| 79 | // Reconstruct Jets //
|
---|
| 80 | //////////////////////
|
---|
| 81 | this->reconstruct();
|
---|
| 82 |
|
---|
| 83 | //////////////////////////
|
---|
| 84 | // ReFill JetCollection //
|
---|
| 85 | //////////////////////////
|
---|
| 86 | clear_list(theJets);
|
---|
| 87 | jetcollection_t::iterator it = m_jetOV->begin();
|
---|
| 88 | jetcollection_t::iterator itE = m_jetOV->end();
|
---|
| 89 | for(; it!=itE; ++it){
|
---|
| 90 | theJets.push_back(*it);
|
---|
| 91 | }
|
---|
| 92 |
|
---|
| 93 |
|
---|
| 94 | delete m_jetOV;
|
---|
| 95 | return 1;
|
---|
| 96 | }
|
---|
| 97 |
|
---|
| 98 | ///////////////////////////////////////////////////////////////////////////////
|
---|
| 99 | // Reconstruction algorithm specific methods /
|
---|
| 100 | ///////////////////////////////////////////////////////////////////////////////
|
---|
| 101 |
|
---|
| 102 | void
|
---|
| 103 | JetConeFinderTool::reconstruct()
|
---|
| 104 | {
|
---|
| 105 | m_jetOV = new jetcollection_t();
|
---|
| 106 |
|
---|
| 107 | jetcollection_t::iterator tItr;
|
---|
| 108 | jetcollection_t::iterator tItr_begin = m_pjetV->begin();
|
---|
| 109 | jetcollection_t::iterator tItr_end = m_pjetV->end();
|
---|
| 110 |
|
---|
| 111 | // order towers in pt
|
---|
| 112 |
|
---|
| 113 | for ( tItr=tItr_begin; tItr!=tItr_end; ++tItr ) {
|
---|
| 114 |
|
---|
| 115 | // Seed Cut
|
---|
| 116 | double tEt = (*tItr)->et();
|
---|
| 117 | if ( tEt < m_seedPt ) break;
|
---|
| 118 |
|
---|
| 119 | // Tower eta, phi
|
---|
| 120 | double etaT = (*tItr)->eta();
|
---|
| 121 | double phiT = (*tItr)->phi();
|
---|
| 122 |
|
---|
| 123 | // Iteration logic
|
---|
| 124 | bool stable = false;
|
---|
| 125 | bool inGeom = true;
|
---|
| 126 |
|
---|
| 127 | Jet* preJet;
|
---|
| 128 |
|
---|
| 129 | int count = 1;
|
---|
| 130 | do { // Iteration Loop
|
---|
| 131 |
|
---|
| 132 | // Make cone
|
---|
| 133 | preJet = calc_cone(etaT,phiT);
|
---|
| 134 | double etaC = preJet->eta();
|
---|
| 135 | double phiC = preJet->phi();
|
---|
| 136 |
|
---|
| 137 | double deta = fabs(etaT - etaC);
|
---|
| 138 | double dphi = fabs(JetDistances::deltaPhi(phiT,phiC));
|
---|
| 139 |
|
---|
| 140 | // Is Stable ?
|
---|
| 141 | if ( deta < m_eps && dphi < m_eps )
|
---|
| 142 | stable = true;
|
---|
| 143 |
|
---|
| 144 | // In Geometry ?
|
---|
| 145 | if ( fabs(etaC) > m_etaMax )
|
---|
| 146 | inGeom = false;
|
---|
| 147 |
|
---|
| 148 | etaT = etaC;
|
---|
| 149 | phiT = phiC;
|
---|
| 150 |
|
---|
| 151 | if ( !stable && inGeom ) {
|
---|
| 152 | delete preJet;
|
---|
| 153 | m_dctr +=1;
|
---|
| 154 | }
|
---|
| 155 | ++count;
|
---|
| 156 |
|
---|
| 157 | }while ( !stable && inGeom && count < 10 );
|
---|
| 158 |
|
---|
| 159 | if ( count > 9 && (!stable && inGeom) ) continue; // FIXME 9 ?
|
---|
| 160 |
|
---|
| 161 | // If iteration was succesfull -- check if this is a new jet and
|
---|
| 162 | // add it to OV.
|
---|
| 163 |
|
---|
| 164 | if ( stable && inGeom ) {
|
---|
| 165 | jetcollection_t::iterator pItr = m_jetOV->begin();
|
---|
| 166 | jetcollection_t::iterator pItrE = m_jetOV->end();
|
---|
| 167 |
|
---|
| 168 | bool newJet = true;
|
---|
| 169 | double etaT = preJet->eta();
|
---|
| 170 | double phiT = preJet->phi();
|
---|
| 171 |
|
---|
| 172 | for ( ; pItr != pItrE ; ++pItr ) {
|
---|
| 173 | double etaC = (*pItr)->eta();
|
---|
| 174 | double phiC = (*pItr)->phi();
|
---|
| 175 |
|
---|
| 176 | double deta = fabs(etaT - etaC);
|
---|
| 177 | double dphi = fabs(JetDistances::deltaPhi(phiT,phiC));
|
---|
| 178 |
|
---|
| 179 | if ( deta < 0.05 && dphi < 0.05 ) {
|
---|
| 180 | // Debugging done by Gregory Soyez:
|
---|
| 181 | //
|
---|
| 182 | // Becase of the cut on the Et difference imposed on the
|
---|
| 183 | // ordering (line 80 of Jet.hh), the ordering of the input
|
---|
| 184 | // particles in Et is not robust agains different
|
---|
| 185 | // implementations of sort (which has an undefined behaviour
|
---|
| 186 | // if 2 particles are equal). A consequence of this is that
|
---|
| 187 | // stable cone search will consider these 2 seeds in an
|
---|
| 188 | // undefined order. If the 2 resulting stable cones are too
|
---|
| 189 | // close (deta<0.05, dphi<0.05) one will be accepted and the
|
---|
| 190 | // other rejected. Which one depends on the ordering and is
|
---|
| 191 | // thus undefined. If the 2 stable cones do not have the
|
---|
| 192 | // same number of constituents this could affect the result
|
---|
| 193 | // of the clustering.
|
---|
| 194 | //
|
---|
| 195 | // The line below helps debugging these cases by printing
|
---|
| 196 | // the rejected stable cones
|
---|
| 197 | //std::cout << "rejecting " << etaT << " " << phiT << " " << preJet->et() << (*tItr)->eta() << " " << (*tItr)->phi() << " " << (*tItr)->et() << std::endl;
|
---|
| 198 | newJet = false;
|
---|
| 199 | break;
|
---|
| 200 | }
|
---|
| 201 | }
|
---|
| 202 | if ( newJet ) {
|
---|
| 203 | m_jetOV->push_back( preJet );
|
---|
| 204 | // Debugging done by Gregory Soyez:
|
---|
| 205 | //
|
---|
| 206 | // Becase of the cut on the Et difference imposed on the
|
---|
| 207 | // ordering (line 80 of Jet.hh), the ordering of the input
|
---|
| 208 | // particles in Et is not robust agains different
|
---|
| 209 | // implementations of sort (which has an undefined behaviour
|
---|
| 210 | // if 2 particles are equal). A consequence of this is that
|
---|
| 211 | // stable cone search will consider these 2 seeds in an
|
---|
| 212 | // undefined order. If the 2 resulting stable cones are too
|
---|
| 213 | // close (deta<0.05, dphi<0.05) one will be accepted and the
|
---|
| 214 | // other rejected. Which one depends on the ordering and is
|
---|
| 215 | // thus undefined. If the 2 stable cones do not have the
|
---|
| 216 | // same number of constituents this could affect the result
|
---|
| 217 | // of the clustering.
|
---|
| 218 | //
|
---|
| 219 | // The line below helps debugging these cases by printing
|
---|
| 220 | // the accepted stable cones
|
---|
| 221 | //std::cout << "accepting " << etaT << " " << phiT << " " << preJet->et() << (*tItr)->eta() << " " << (*tItr)->phi() << " " << (*tItr)->et() << std::endl;
|
---|
| 222 | }
|
---|
| 223 | else {
|
---|
| 224 | delete preJet;
|
---|
| 225 | m_dctr +=1;
|
---|
| 226 | }
|
---|
| 227 | }
|
---|
| 228 | else {
|
---|
| 229 | delete preJet;
|
---|
| 230 | m_dctr +=1;
|
---|
| 231 | }
|
---|
| 232 | }
|
---|
| 233 | }
|
---|
| 234 |
|
---|
| 235 | Jet* JetConeFinderTool::calc_cone(double eta, double phi)
|
---|
| 236 | {
|
---|
| 237 | // Create a new Jet
|
---|
| 238 | Jet* j = new Jet();
|
---|
| 239 | m_ctr +=1;
|
---|
| 240 |
|
---|
| 241 | // Add all ProtoJet within m_coneR to this Jet
|
---|
| 242 | jetcollection_t::iterator itr = m_pjetV->begin();
|
---|
| 243 | jetcollection_t::iterator itrE = m_pjetV->end();
|
---|
| 244 |
|
---|
| 245 | for ( ; itr!=itrE; ++itr ) {
|
---|
| 246 | double dR = JetDistances::deltaR(eta,phi,(*itr)->eta(),(*itr)->phi());
|
---|
| 247 | if ( dR < m_coneR ) {
|
---|
| 248 | j->addJet( (*itr) );
|
---|
| 249 | }
|
---|
| 250 | }
|
---|
| 251 |
|
---|
| 252 | return j;
|
---|
| 253 | }
|
---|
| 254 |
|
---|
| 255 |
|
---|
| 256 |
|
---|
| 257 | } // namespace atlas
|
---|
| 258 |
|
---|
| 259 | FASTJET_END_NAMESPACE
|
---|