001
002
003
004
005
006
007
008
009
010 #include "AtlfastAlgs/ClusterConeStrategy.h"
011
012 #include "AtlfastEvent/IKinematic.h"
013 #include "AtlfastEvent/Cluster.h"
014 #include "AtlfastEvent/CollectionDefs.h"
015
016 #include "AtlfastUtils/FunctionObjects.h"
017
018 #include <cmath>
019 #include <algorithm>
020 #include <vector>
021
022
023 #include "GaudiKernel/MsgStream.h"
024
025
026 #include "CLHEP/Vector/LorentzVector.h"
027
028
029 namespace Atlfast {
030 using std::sort;
031 using std::partition;
032
033
034
035
036
037
038
039
040
041 void
042 ClusterConeStrategy::makeClusters(
043 MsgStream& log,
044 const std::vector<IKinematic*>&storedCells,
045 IKinematicVector& unusedCells,
046 IClusterCollection* clusters) const {
047 log << MSG::DEBUG << storedCells.size() << "cells to start with"<<endreq;
048
049
050
051
052
053
054 localCellCollection availableCells(storedCells.begin(),
055 storedCells.end() );
056 localCellIterator firstAvailableCell = availableCells.begin() ;
057 localCellIterator lastAvailableCell = availableCells.end() ;
058
059
060 localCellCollection availableInitiators( storedCells.begin(),
061 storedCells.end() ) ;
062 localCellIterator firstAvailableInitiator = availableInitiators.begin() ;
063 localCellIterator lastAvailableInitiator = availableInitiators.end() ;
064
065
066 lastAvailableInitiator
067 = partition( firstAvailableInitiator,
068 lastAvailableInitiator,
069 PartitionCondition::AboveThresholdET( m_minInitiatorET )
070 );
071
072
073
074 sort( firstAvailableInitiator,
075 lastAvailableInitiator,
076 SortAttribute::DescendingET()
077 );
078
079
080
081
082 while( firstAvailableInitiator != lastAvailableInitiator ) {
083
084
085
086
087
088
089 double rCone = this->rCone( ) ;
090
091 localCellIterator endCellInCone = partition
092 (
093 firstAvailableCell,
094 lastAvailableCell,
095 PartitionCondition::BelowThresholdDeltaR( *firstAvailableInitiator,
096 rCone )
097 );
098
099
100
101 PreCluster preclus( firstAvailableCell, endCellInCone, m_masslessJets);
102
103
104 if( preclus.eT() > m_minClusterET ){
105
106 HepLorentzVector temp=preclus;
107 ICluster* newclus =
108 new Cluster( temp, firstAvailableCell, endCellInCone ) ;
109
110
111 clusters->push_back( newclus ) ;
112
113
114
115
116 localCellIterator cell= firstAvailableCell;
117 for(; cell != endCellInCone; ++cell ){
118 lastAvailableInitiator =
119 std::remove( firstAvailableInitiator,
120 lastAvailableInitiator, *cell );
121 }
122
123
124 firstAvailableCell = endCellInCone ;
125
126 }else{
127
128
129
130
131
132 ++firstAvailableInitiator ;
133 }
134
135 }
136
137 localCellIterator cellIter = firstAvailableCell;
138 for(; cellIter!=lastAvailableCell; ++cellIter){
139
140
141
142
143
144 unusedCells.push_back(*cellIter);
145 }
146 return;
147 }
148
149
150
151
152
153
154
155 double ClusterConeStrategy::rCone() const {
156
157
158 return m_rConeBarrel ;
159 }
160
161
162
163
164
165
166
167
168
169 ClusterConeStrategy::PreCluster::PreCluster(
170 localCellIterator start,
171 localCellIterator end,
172 bool masslessJets) :
173 m_eT_total(0),
174 m_eta_weighted(0),
175 m_masslessJets(masslessJets),
176 m_momentum_sum( 0, 0, 0, 0 ){
177
178 for( localCellIterator cell = start; cell != end; ++cell ){
179
180
181 m_eT_total += (*cell)->eT() ;
182 m_eta_weighted += (*cell)->eta() * (*cell)->eT() ;
183
184
185
186
187
188
189
190
191
192
193
194 m_momentum_sum += (*cell)->momentum() ;
195
196 }
197 }
198
199
200
201 double ClusterConeStrategy::PreCluster::eT() { return m_eT_total ; }
202
203 double ClusterConeStrategy::PreCluster::eta() {
204
205 if( m_eT_total > 0 ) return m_eta_weighted / m_eT_total ;
206 else return 0. ;
207 }
208
209 double ClusterConeStrategy::PreCluster::phi() {
210
211 return m_momentum_sum.phi() ;
212 }
213
214
215
216 ClusterConeStrategy::PreCluster::operator HepLorentzVector () {
217
218
219
220
221
222
223 double theta = atan( exp( - this->eta() ) ) * 2.0 ;
224
225 double x=0.,y=0.,z=0.,t=0. ;
226
227 if( (0. < theta) && ( theta < M_PI ) )
228 {
229 if(m_masslessJets){
230 t = this->eT() / sin( theta ) ;
231 x = this->eT() * cos( this->phi() ) ;
232 y = this->eT() * sin( this->phi() ) ;
233 z = t * cos( theta ) ;
234 }else{
235 t = m_momentum_sum.e();
236 x = m_momentum_sum.px();
237 y = m_momentum_sum.py();
238 z = m_momentum_sum.pz();
239 }
240 }
241
242 return HepLorentzVector( x, y, z, t ) ;
243 }
244 }
245
246
247
248
249
250
251
252
253
254
255
| Due to the LXR bug, the updates fail sometimes to remove references to deleted files. The Saturday's full rebuilds fix these problems |
|
This page was automatically generated by the
LXR engine.
|
|