BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
FTSuperLayer.cxx
Go to the documentation of this file.
1#include "GaudiKernel/Bootstrap.h"
2#include "GaudiKernel/StatusCode.h"
3#include <iostream>
4
5#include "MdcGeomSvc/IMdcGeomSvc.h"
6#include "MdcGeomSvc/MdcGeoLayer.h"
7
8#include "FTGeom.h"
9#include "FTLayer.h"
10#include "FTSegment.h"
11#include "FTSuperLayer.h"
12#include "FTWire.h"
13
14// ############################################################# //
15
16FTSuperLayer::FTSuperLayer( const int superLayerID, const int firstLayerID,
17 const int firstWireID, const int Nlayer, const int NWire )
18 : _superLayerId( superLayerID )
19 , _complicated_segments( 0 )
20 , _wireHits( 0 )
21 , _singleHits( 0 )
22 , _segments( 0 )
23 , _firstLayerId( firstLayerID )
24 , _firstWireId( firstWireID )
25 , _Nlayer( Nlayer )
26 , _Nwire( NWire ) {}
27
28const FTList<FTWire*>& FTSuperLayer::wireHits() { return _wireHits; }
29const int FTSuperLayer::nWire() const { return _Nwire; }
30const int FTSuperLayer::nLayer() const { return _Nlayer; }
31const int FTSuperLayer::localMaxId() const { return ( _Nwire - 1 ); }
32const int FTSuperLayer::layerMaxId() const { return ( _Nlayer - 1 ); }
34const int FTSuperLayer::superLayerId() const { return _superLayerId; }
35FTList<FTSegment*>& FTSuperLayer::complecated_segments() { return _complicated_segments; }
36void FTSuperLayer::appendHit( FTWire* h ) { _wireHits.push_back( h ); }
37
38// #undef inline
39
40// ############################################################# //
41
43
44const std::array<float, 11> FTSuperLayer::_maxDphi = { 11.9, 9.72, 6.26, 4.86, 3.81, 2.37,
45 2.08, 1.76, 1.53, 2.33, 1.88 };
46
48 for ( auto w : _wireHits ) { w->state( FTWireHitInvalid ); }
49 _wireHits.clear();
50
51 _singleHits.clear();
52
53 // for ( auto s : _segments ) { delete s; }
54 _segments.clear();
55
56 for ( auto s : _complicated_segments ) { delete s; }
57 _complicated_segments.clear();
58}
59
61 clustering();
62
63 FTList<FTSegment*> inner_short;
64 FTList<FTSegment*> outer_short;
65 FTList<FTSegment*> mid_short;
66
67 for ( auto it = _segments.begin(); it != _segments.end(); )
68 {
69 FTSegment* s = *it;
70
71 switch ( s->examine() )
72 {
73
74 case 0: // long simple
75 it++;
76 break;
77
78 case 1: // inner short
79 inner_short.push_back( s );
80 it = _segments.erase( it ); // "it" updated
81 break;
82
83 case 2: // outer short
84 outer_short.push_back( s );
85 it = _segments.erase( it ); // "it" updated
86 break;
87
88 case 3: // to be divided
89 _complicated_segments.push_back( s );
90 it = _segments.erase( it ); // "it" updated
91 break;
92
93 default:
94 mid_short.push_back( s );
95 it = _segments.erase( it ); // "it" updated
96 break;
97 }
98
99 // make sure that "it" has been updated
100 }
101
102 connect_short_segments( inner_short, outer_short );
103 connect_singleHit( inner_short );
104 connect_singleHit( outer_short );
105 connect_singleHit( mid_short );
106
107 for ( auto i : _segments )
108 {
109 i->update();
110
111#ifndef OnlineMode
112 i->printout();
113#endif
114 }
115}
116
118 if ( _superLayerId > 9 ) return;
119 if ( _segments.size() > 30 ) return;
120
121 float tdc[30][4] = { 0 };
122 float r[4] = { 0 };
123 float phi[4] = { 0 };
124 int wireId[4] = { 0 };
125
126 IMdcGeomSvc* mdcGeomSvc;
127 StatusCode sc = Gaudi::svcLocator()->service( "MdcGeomSvc", mdcGeomSvc );
128
129 float T1 = 0.5 * 0.1 * ( mdcGeomSvc->Layer( 4 * _superLayerId + 0 )->PCSiz() ) / 0.004;
130 float T2 = 0.5 * 0.1 * ( mdcGeomSvc->Layer( 4 * _superLayerId + 1 )->PCSiz() ) / 0.004;
131 float T3 = 0.5 * 0.1 * ( mdcGeomSvc->Layer( 4 * _superLayerId + 2 )->PCSiz() ) / 0.004;
132 float T4 = 0.5 * 0.1 * ( mdcGeomSvc->Layer( 4 * _superLayerId + 3 )->PCSiz() ) / 0.004;
133
134 auto seg_it = _segments.begin();
135 for ( int i = 0; seg_it != _segments.end(); seg_it++, i++ )
136 {
137 float chi2 = -99;
138 float t0c = 0;
139
140 FTList<FTWire*>& hits = ( *seg_it )->wireHits();
141
142 for ( auto h : hits )
143 {
144
145 const int layerId = h->layer()->layerId();
146
147 wireId[layerId % 4] = h->localId();
148 phi[layerId % 4] = h->phi();
149
150 tdc[i][layerId % 4] = h->time();
151 r[layerId % 4] = h->layer()->r();
152 }
153
154 if ( tdc[i][0] != 0 && tdc[i][1] != 0 && tdc[i][2] != 0 && tdc[i][3] != 0 &&
155 ( wireId[0] == wireId[1] && wireId[0] == wireId[2] && wireId[0] == wireId[3] ||
156 wireId[0] == wireId[1] - 1 && wireId[0] == wireId[2] && wireId[1] == wireId[3] ) )
157 {
158 float r0 = r[0] - r[1] - ( r[2] - r[1] ) / 2;
159 float r1 = -( r[2] - r[1] ) / 2;
160 float r2 = ( r[2] - r[1] ) / 2;
161 float r3 = r[3] - r[2] + ( r[2] - r[1] ) / 2;
162
163 float t_i = tdc[i][0] + tdc[i][2];
164 float t_j = tdc[i][1] + tdc[i][3];
165 float l_j = T2 + T4;
166 float r_i = r0 + r2;
167 float r_j = r1 + r3;
168 float r_2k = r0 * r0 + r1 * r1 + r2 * r2 + r3 * r3;
169 float rt_i = r0 * tdc[i][0] + r2 * tdc[i][2];
170 float rt_j = r1 * tdc[i][1] + r3 * tdc[i][3];
171 float rl_j = r1 * T2 + r3 * T4;
172
173 float deno = 4 * r_2k - 2 * ( r_i * r_i + r_j * r_j );
174
175 if ( deno != 0 )
176 {
177 float Pa = ( 4 * ( rt_i - rt_j + rl_j ) - ( t_i + t_j - l_j ) * ( r_i - r_j ) -
178 ( t_i - t_j + l_j ) * ( r_i + r_j ) ) /
179 deno;
180 float Pb = 0.25 * ( t_i - t_j + l_j - ( r_i + r_j ) * Pa );
181 float Ang = fabs( 90. - fabs( atan( Pa ) * 180. / 3.141593 ) );
182
183 t0c = -0.25 * ( ( r_i - r_j ) * Pa - t_i - t_j + l_j );
184
185 float pa1 = ( tdc[i][0] - tdc[i][2] ) / ( r0 - r2 );
186 float pa2 = ( T4 - T2 - tdc[i][3] + tdc[i][1] ) / ( r3 - r1 );
187
188 chi2 =
189 ( tdc[i][0] - t0c - r0 * Pa - Pb ) * ( tdc[i][0] - t0c - r0 * Pa - Pb ) +
190 ( T2 - tdc[i][1] + t0c - r1 * Pa - Pb ) * ( T2 - tdc[i][1] + t0c - r1 * Pa - Pb ) +
191 ( tdc[i][2] - t0c - r2 * Pa - Pb ) * ( tdc[i][2] - t0c - r2 * Pa - Pb ) +
192 ( T4 - tdc[i][3] + t0c - r3 * Pa - Pb ) * ( T4 - tdc[i][3] + t0c - r3 * Pa - Pb );
193 }
194 }
195
196 if ( chi2 < ( param->_chi2_segfit ) && _superLayerId > 4 && chi2 > -1 )
197 { Estime[_superLayerId].push_back( t0c ); }
198
199 // continue; // FIXME
200 // _complicated_segments.push_back( _segments[i] );
201 // for ( int k = 0; k < 4; k++ ) { tdc[i][k] = 0; }
202 // n = _segments.remove( i );
203 }
204}
205
206// cluster hits to segments
207void FTSuperLayer::clustering() {
208 // +---+---+
209 // | 4 | 5 |
210 // +-+-+---+-+-+ r
211 // Neighbor ID | 2 | * | 3 | ^
212 // +-+-+---+-+-+ |
213 // | 0 | 1 | +--> -phi
214 // +---+---+
215 //
216 if ( !_wireHits.size() ) return;
217
218 for ( auto h : _wireHits ) h->chk_left_and_right();
219
220 for ( auto hptr : _wireHits )
221 {
222 if ( hptr->stateAND( FTWireHitAppendedOrInvalid ) ) continue;
223
224 FTList<FTWire*> hits;
225 hits.push_back( hptr );
226 hptr->stateOR( FTWireHitAppended );
227
228 for ( int j = 0; j < hits.size(); j++ )
229 { // loop over hits in a cluster
230 FTWire* h = hits[j];
231 const unsigned int checked = h->state();
232 // const unsigned int * mptr = _neighborsMask;
233 auto neighbors = h->getNeighbors();
234 // check 6 neighbors
235 for ( auto n : neighbors )
236 {
237 if ( n->stateAND( FTWireHitAppendedOrInvalid ) ) continue;
238 hits.push_back( n );
239 n->stateOR( FTWireHitAppended );
240 }
241 }
242
243 if ( hits.size() != 1 ) { _segments.push_back( new FTSegment( this, hits ) ); }
244 else { _singleHits.push_back( hptr ); }
245 }
246}
247
248// to match two phi-near short segments and connect them
249void FTSuperLayer::connect_short_segments( FTList<FTSegment*>& inner_short,
250 FTList<FTSegment*>& outer_short ) {
251 for ( auto inner_it = inner_short.begin();
252 inner_it != inner_short.end(); ) // no iner_it++ since we need to erase something
253 {
254 auto inner = *inner_it;
255
256 const FTWire* in_outerBoundHit = inner->outerBoundHits().front();
257 const FTLayer* in_outerBound = in_outerBoundHit->layer();
258 float in_outerPhi = inner->outgoingPhi();
259
260 auto min_dphi_iter = outer_short.end();
261 float min_dphi = 2 * M_PI;
262 int dLayer_cache = -1;
263 float out_innerPhi, D_phi;
264
265 for ( auto outer_it = outer_short.begin(); outer_it != outer_short.end(); outer_it++ )
266 {
267 const int out_innerLayerId =
268 ( *outer_it )->innerBoundHits().front()->layer()->localLayerId();
269 int dLayer_cache_tmp = out_innerLayerId - in_outerBound->localLayerId();
270
271 if ( dLayer_cache_tmp < 1 ) continue;
272
273 out_innerPhi = ( *outer_it )->incomingPhi();
274 D_phi = fabs( in_outerPhi - out_innerPhi );
275 if ( D_phi > M_PI ) D_phi = 2 * M_PI - D_phi;
276 if ( D_phi < min_dphi )
277 {
278 min_dphi = D_phi;
279 min_dphi_iter = outer_it;
280 dLayer_cache = dLayer_cache_tmp;
281 }
282 }
283
284 if ( min_dphi_iter == outer_short.end() )
285 {
286 inner_it++;
287 continue;
288 }
289
290 switch ( dLayer_cache )
291 {
292 case 1:
293 if ( min_dphi > _maxDphi[_superLayerId] * M_PI / 180. )
294 {
295 inner_it++;
296 continue;
297 }
298 break;
299 case 2:
300 if ( min_dphi > _maxDphi[_superLayerId] * M_PI / 120. )
301 {
302 inner_it++;
303 continue;
304 }
305 break;
306 case 3:
307 if ( min_dphi > _maxDphi[_superLayerId] * M_PI / 80. )
308 {
309 inner_it++;
310 continue;
311 }
312 break;
313 default: inner_it++; continue;
314 }
315
316 inner->connect_outer( ( *min_dphi_iter )->wireHits(),
317 ( *min_dphi_iter )->outerBoundHits() );
318
319 outer_short.erase( min_dphi_iter );
320 inner_it = inner_short.erase( inner_it );
321 _segments.push_back( inner );
322 }
323}
324
325void FTSuperLayer::connect_singleHit( FTList<FTSegment*>& short_sgmnts ) {
326 int minLength = 0;
327 if ( superLayerId() == 2 || superLayerId() == 3 || superLayerId() == 4 ||
328 superLayerId() == 9 || superLayerId() == 10 )
329 minLength = 1;
330
331 // for ( int i = 0; i < short_sgmnts.size(); i++ )
332 for ( FTSegment* s : short_sgmnts )
333 {
334 const FTWire* outerBoundHit = s->outerBoundHits().front();
335 const FTWire* innerBoundHit = s->innerBoundHits().front();
336 const FTLayer* outerBound = outerBoundHit->layer();
337 const FTLayer* innerBound = innerBoundHit->layer();
338 float outerPhi = s->outgoingPhi();
339 float innerPhi = s->incomingPhi();
340
341 auto min_dphi_iter = _singleHits.end();
342 float min_dphi = 2 * M_PI;
343 int dLayer_cache = -1;
344
345 bool inner_flag_cache = false;
346 bool inner_flag_cache_set = false;
347
348 for ( auto h_iter = _singleHits.begin(); h_iter != _singleHits.end(); h_iter++ )
349 {
350 const FTWire* h = *h_iter;
351 const int hLocalLayerId = h->layer()->localLayerId();
352 int dLayer_cache_tmp = -1;
353 bool inner_flag_cache_tmp;
354 float D_phi;
355
356 if ( ( dLayer_cache_tmp = innerBound->localLayerId() - hLocalLayerId ) > 0 )
357 {
358 D_phi = fabs( innerPhi - h->phi() );
359 inner_flag_cache_tmp = true;
360 }
361 else if ( ( dLayer_cache_tmp = hLocalLayerId - outerBound->localLayerId() ) > 0 )
362 {
363 D_phi = fabs( outerPhi - h->phi() );
364 inner_flag_cache_tmp = false;
365 }
366 else { continue; }
367 if ( D_phi > M_PI ) D_phi = 2 * M_PI - D_phi;
368
369 if ( D_phi < min_dphi )
370 {
371 min_dphi = D_phi;
372 min_dphi_iter = h_iter;
373 dLayer_cache = dLayer_cache_tmp;
374 inner_flag_cache = inner_flag_cache_tmp;
375 inner_flag_cache_set = true;
376 }
377 }
378
379 int not_append = 1;
380 if ( min_dphi_iter != _singleHits.end() )
381 {
382 switch ( dLayer_cache )
383 {
384 case 1:
385 if ( min_dphi < _maxDphi[_superLayerId] * M_PI / 180. ) not_append = 0;
386 break;
387 case 2:
388 if ( min_dphi < _maxDphi[_superLayerId] * M_PI / 120. ) not_append = 0;
389 break;
390 case 3:
391 if ( min_dphi < _maxDphi[_superLayerId] * M_PI / 80. ) not_append = 0;
392 break;
393 default: break;
394 }
395 }
396
397 if ( !not_append )
398 {
399 if ( !inner_flag_cache_set )
400 {
401 std::cerr << "FTSuperLayer::connect_singleHit: inner_flag_cache is not set"
402 << std::endl;
403 abort();
404 }
405
406 if ( inner_flag_cache ) { s->connect_inner( *min_dphi_iter ); }
407 else { s->connect_outer( *min_dphi_iter ); }
408 _segments.push_back( s );
409 _singleHits.erase( min_dphi_iter );
410 }
411 else
412 {
413 if ( outerBound->localLayerId() - innerBound->localLayerId() > minLength )
414 { _segments.push_back( s ); }
415 else
416 {
417 if ( !_superLayerId ) _complicated_segments.push_back( s );
418 else delete s;
419 }
420 }
421 }
422}
423
425 for ( auto it = _segments.begin(); it != _segments.end(); )
426 {
427 if ( ( *it )->track() ) it++;
428 else
429 {
430 _complicated_segments.push_back( *it );
431 it = _segments.erase( it );
432 }
433 }
434}
435
436#ifdef FZISAN_DEBUG
437void FTSuperLayer::showBinary( unsigned src ) {
438 unsigned mask = 512;
439 while ( mask >>= 1 ) { unsigned bit = ( mask & src ) ? 1 : 0; }
440}
441#endif
const Int_t n
double w
#define FTWireHitAppended
Definition FTWire.h:5
#define FTWireHitInvalid
Definition FTWire.h:4
#define FTWireHitAppendedOrInvalid
Definition FTWire.h:6
XmlRpcServer s
#define M_PI
Definition TConstant.h:4
const int localLayerId() const
returns local-layer ID
Definition FTLayer.h:23
Definition FTList.h:6
std::vector< T >::iterator erase(typename std::vector< T >::iterator it)
Definition FTList.h:10
static MdcParameter * param
const FTList< FTWire * > & wireHits()
returns wirehit list
static const std::array< float, 11 > _maxDphi
FTList< FTSegment * > & segments()
returns segement list
const int layerMaxId() const
returns layer max ID
FTList< FTSegment * > & complecated_segments()
returns complecated segments
void clear()
clear object
const int nLayer() const
returns number of layers
void reduce_noise(FTList< FTList< float > > &)
calculate t0 and Chi2 from segment-fit in every superlayer
void reAppendSalvage()
append segments which are not used for tracks to the list for salvage
FTSuperLayer(const int superLayerID, const int firstLayerID, const int firstWireID, const int Nlayer, const int NWire)
Constructors and destructor.
const int superLayerId() const
returns super-layer ID
const int localMaxId() const
returns local max ID
const int nWire() const
returns number of wires
void appendHit(FTWire *)
append wireHit to the list of hits
void mkSegmentList()
create segment lists
array< FTWire *, 6 > & getNeighbors()
returns pointer of neighbor array
Definition FTWire.h:63
FTLayer * layer() const
returns layer
Definition FTWire.h:60
unsigned state() const
returns state
Definition FTWire.h:78
float phi() const
returns phi
Definition FTWire.h:54
virtual const MdcGeoLayer *const Layer(unsigned id)=0
static MdcParameter * instance()