00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "AtlfastAlgs/ClusterConeStrategy.h"
00011
00012 #include "AtlfastEvent/IKinematic.h"
00013 #include "AtlfastEvent/Cluster.h"
00014 #include "AtlfastEvent/CollectionDefs.h"
00015
00016 #include "AtlfastUtils/FunctionObjects.h"
00017
00018 #include <cmath>
00019 #include <algorithm>
00020 #include <vector>
00021
00022
00023 #include "GaudiKernel/MsgStream.h"
00024
00025
00026 #include "CLHEP/Vector/LorentzVector.h"
00027
00028
00029 namespace Atlfast {
00030 using std::sort;
00031 using std::partition;
00032
00033 void
00034 ClusterConeStrategy::makeClusters(
00035 MsgStream& log,
00036 const std::vector<IKinematic*>&storedCells,
00037 IKinematicVector& unusedCells,
00038 IClusterCollection* clusters) const {
00039 log << MSG::DEBUG << storedCells.size() << "cells to start with"<<endreq;
00040
00041
00042
00043
00044
00045
00046 localCellCollection availableCells(storedCells.begin(),
00047 storedCells.end() );
00048 localCellIterator firstAvailableCell = availableCells.begin() ;
00049 localCellIterator lastAvailableCell = availableCells.end() ;
00050
00051
00052 localCellCollection availableInitiators( storedCells.begin(),
00053 storedCells.end() ) ;
00054 localCellIterator firstAvailableInitiator = availableInitiators.begin() ;
00055 localCellIterator lastAvailableInitiator = availableInitiators.end() ;
00056
00057
00058 lastAvailableInitiator
00059 = partition( firstAvailableInitiator,
00060 lastAvailableInitiator,
00061 PartitionCondition::AboveThresholdET( m_minInitiatorET )
00062 );
00063
00064
00065
00066 sort( firstAvailableInitiator,
00067 lastAvailableInitiator,
00068 SortAttribute::DescendingET()
00069 );
00070
00071
00072
00073
00074 while( firstAvailableInitiator != lastAvailableInitiator ) {
00075
00076
00077
00078
00079
00080
00081 double rCone = this->rCone( ) ;
00082
00083 localCellIterator endCellInCone = partition
00084 (
00085 firstAvailableCell,
00086 lastAvailableCell,
00087 PartitionCondition::BelowThresholdDeltaR( *firstAvailableInitiator,
00088 rCone )
00089 );
00090
00091
00092
00093 PreCluster preclus( firstAvailableCell, endCellInCone, m_masslessJets);
00094
00095
00096 if( preclus.eT() > m_minClusterET ){
00097
00098 HepLorentzVector temp=preclus;
00099 ICluster* newclus =
00100 new Cluster( temp, firstAvailableCell, endCellInCone ) ;
00101
00102
00103 clusters->push_back( newclus ) ;
00104
00105
00106
00107
00108 localCellIterator cell= firstAvailableCell;
00109 for(; cell != endCellInCone; ++cell ){
00110 lastAvailableInitiator =
00111 std::remove( firstAvailableInitiator,
00112 lastAvailableInitiator, *cell );
00113 }
00114
00115
00116 firstAvailableCell = endCellInCone ;
00117
00118 }else{
00119
00120
00121
00122
00123
00124 ++firstAvailableInitiator ;
00125 }
00126
00127 }
00128
00129 localCellIterator cellIter = firstAvailableCell;
00130 for(; cellIter!=lastAvailableCell; ++cellIter){
00131
00132
00133
00134
00135
00136 unusedCells.push_back(*cellIter);
00137 }
00138 return;
00139 }
00140
00141
00142
00143
00144
00145
00146
00147 double ClusterConeStrategy::rCone() const {
00148
00149
00150 return m_rConeBarrel ;
00151 }
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161 ClusterConeStrategy::PreCluster::PreCluster(
00162 localCellIterator start,
00163 localCellIterator end,
00164 bool masslessJets) :
00165 m_eT_total(0),
00166 m_eta_weighted(0),
00167 m_masslessJets(masslessJets),
00168 m_momentum_sum( 0, 0, 0, 0 ){
00169
00170 for( localCellIterator cell = start; cell != end; ++cell ){
00171
00172
00173 m_eT_total += (*cell)->eT() ;
00174 m_eta_weighted += (*cell)->eta() * (*cell)->eT() ;
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186 m_momentum_sum += (*cell)->momentum() ;
00187
00188 }
00189 }
00190
00191
00192
00193 double ClusterConeStrategy::PreCluster::eT() { return m_eT_total ; }
00194
00195 double ClusterConeStrategy::PreCluster::eta() {
00196
00197 if( m_eT_total > 0 ) return m_eta_weighted / m_eT_total ;
00198 else return 0. ;
00199 }
00200
00201 double ClusterConeStrategy::PreCluster::phi() {
00202
00203 return m_momentum_sum.phi() ;
00204 }
00205
00206
00207
00208 ClusterConeStrategy::PreCluster::operator HepLorentzVector () {
00209
00210
00211
00212
00213
00214
00215 double theta = atan( exp( - this->eta() ) ) * 2.0 ;
00216
00217 double x=0.,y=0.,z=0.,t=0. ;
00218
00219 if( (0. < theta) && ( theta < M_PI ) )
00220 {
00221 if(m_masslessJets){
00222 t = this->eT() / sin( theta ) ;
00223 x = this->eT() * cos( this->phi() ) ;
00224 y = this->eT() * sin( this->phi() ) ;
00225 z = t * cos( theta ) ;
00226 }else{
00227 t = m_momentum_sum.e();
00228 x = m_momentum_sum.px();
00229 y = m_momentum_sum.py();
00230 z = m_momentum_sum.pz();
00231 }
00232 }
00233
00234 return HepLorentzVector( x, y, z, t ) ;
00235 }
00236 }
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247