1#include "GaudiKernel/Bootstrap.h"
2#include "GaudiKernel/StatusCode.h"
5#include "MdcGeomSvc/IMdcGeomSvc.h"
6#include "MdcGeomSvc/MdcGeoLayer.h"
17 const int firstWireID,
const int Nlayer,
const int NWire )
18 : _superLayerId( superLayerID )
19 , _complicated_segments( 0 )
23 , _firstLayerId( firstLayerID )
24 , _firstWireId( firstWireID )
45 2.08, 1.76, 1.53, 2.33, 1.88 };
56 for (
auto s : _complicated_segments ) {
delete s; }
57 _complicated_segments.clear();
67 for (
auto it = _segments.begin(); it != _segments.end(); )
71 switch (
s->examine() )
79 inner_short.push_back(
s );
80 it = _segments.
erase( it );
84 outer_short.push_back(
s );
85 it = _segments.
erase( it );
89 _complicated_segments.push_back(
s );
90 it = _segments.erase( it );
94 mid_short.push_back(
s );
95 it = _segments.
erase( it );
102 connect_short_segments( inner_short, outer_short );
103 connect_singleHit( inner_short );
104 connect_singleHit( outer_short );
105 connect_singleHit( mid_short );
107 for (
auto i : _segments )
118 if ( _superLayerId > 9 )
return;
119 if ( _segments.size() > 30 )
return;
121 float tdc[30][4] = { 0 };
123 float phi[4] = { 0 };
124 int wireId[4] = { 0 };
127 StatusCode sc = Gaudi::svcLocator()->service(
"MdcGeomSvc", mdcGeomSvc );
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;
134 auto seg_it = _segments.begin();
135 for (
int i = 0; seg_it != _segments.end(); seg_it++, i++ )
142 for (
auto h : hits )
145 const int layerId = h->layer()->layerId();
147 wireId[layerId % 4] = h->localId();
148 phi[layerId % 4] = h->phi();
150 tdc[i][layerId % 4] = h->time();
151 r[layerId % 4] = h->layer()->r();
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] ) )
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;
163 float t_i = tdc[i][0] + tdc[i][2];
164 float t_j = tdc[i][1] + tdc[i][3];
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;
173 float deno = 4 * r_2k - 2 * ( r_i * r_i + r_j * r_j );
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 ) ) /
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 ) );
183 t0c = -0.25 * ( ( r_i - r_j ) * Pa - t_i - t_j + l_j );
185 float pa1 = ( tdc[i][0] - tdc[i][2] ) / ( r0 - r2 );
186 float pa2 = ( T4 - T2 - tdc[i][3] + tdc[i][1] ) / ( r3 - r1 );
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 );
196 if ( chi2 < (
param->_chi2_segfit ) && _superLayerId > 4 && chi2 > -1 )
197 { Estime[_superLayerId].push_back( t0c ); }
207void FTSuperLayer::clustering() {
216 if ( !_wireHits.size() )
return;
218 for (
auto h : _wireHits ) h->chk_left_and_right();
220 for (
auto hptr : _wireHits )
225 hits.push_back( hptr );
228 for (
int j = 0; j < hits.size(); j++ )
231 const unsigned int checked = h->
state();
235 for (
auto n : neighbors )
243 if ( hits.size() != 1 ) { _segments.push_back(
new FTSegment(
this, hits ) ); }
244 else { _singleHits.push_back( hptr ); }
251 for (
auto inner_it = inner_short.begin();
252 inner_it != inner_short.end(); )
254 auto inner = *inner_it;
256 const FTWire* in_outerBoundHit = inner->outerBoundHits().front();
257 const FTLayer* in_outerBound = in_outerBoundHit->
layer();
258 float in_outerPhi = inner->outgoingPhi();
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;
265 for (
auto outer_it = outer_short.begin(); outer_it != outer_short.end(); outer_it++ )
267 const int out_innerLayerId =
268 ( *outer_it )->innerBoundHits().front()->layer()->localLayerId();
269 int dLayer_cache_tmp = out_innerLayerId - in_outerBound->
localLayerId();
271 if ( dLayer_cache_tmp < 1 )
continue;
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 )
279 min_dphi_iter = outer_it;
280 dLayer_cache = dLayer_cache_tmp;
284 if ( min_dphi_iter == outer_short.end() )
290 switch ( dLayer_cache )
313 default: inner_it++;
continue;
316 inner->connect_outer( ( *min_dphi_iter )->wireHits(),
317 ( *min_dphi_iter )->outerBoundHits() );
319 outer_short.
erase( min_dphi_iter );
320 inner_it = inner_short.
erase( inner_it );
321 _segments.push_back( inner );
332 for ( FTSegment*
s : short_sgmnts )
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();
341 auto min_dphi_iter = _singleHits.end();
342 float min_dphi = 2 *
M_PI;
343 int dLayer_cache = -1;
345 bool inner_flag_cache =
false;
346 bool inner_flag_cache_set =
false;
348 for (
auto h_iter = _singleHits.begin(); h_iter != _singleHits.end(); h_iter++ )
350 const FTWire* h = *h_iter;
352 int dLayer_cache_tmp = -1;
353 bool inner_flag_cache_tmp;
356 if ( ( dLayer_cache_tmp = innerBound->
localLayerId() - hLocalLayerId ) > 0 )
358 D_phi = fabs( innerPhi - h->
phi() );
359 inner_flag_cache_tmp =
true;
361 else if ( ( dLayer_cache_tmp = hLocalLayerId - outerBound->
localLayerId() ) > 0 )
363 D_phi = fabs( outerPhi - h->
phi() );
364 inner_flag_cache_tmp =
false;
367 if ( D_phi >
M_PI ) D_phi = 2 *
M_PI - D_phi;
369 if ( D_phi < min_dphi )
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;
380 if ( min_dphi_iter != _singleHits.end() )
382 switch ( dLayer_cache )
385 if ( min_dphi <
_maxDphi[_superLayerId] *
M_PI / 180. ) not_append = 0;
388 if ( min_dphi <
_maxDphi[_superLayerId] *
M_PI / 120. ) not_append = 0;
391 if ( min_dphi <
_maxDphi[_superLayerId] *
M_PI / 80. ) not_append = 0;
399 if ( !inner_flag_cache_set )
401 std::cerr <<
"FTSuperLayer::connect_singleHit: inner_flag_cache is not set"
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 );
414 { _segments.push_back(
s ); }
417 if ( !_superLayerId ) _complicated_segments.push_back(
s );
425 for (
auto it = _segments.begin(); it != _segments.end(); )
427 if ( ( *it )->track() ) it++;
430 _complicated_segments.push_back( *it );
431 it = _segments.erase( it );
437void FTSuperLayer::showBinary(
unsigned src ) {
439 while ( mask >>= 1 ) {
unsigned bit = ( mask & src ) ? 1 : 0; }
#define FTWireHitAppended
#define FTWireHitAppendedOrInvalid
const int localLayerId() const
returns local-layer ID
std::vector< T >::iterator erase(typename std::vector< T >::iterator it)
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
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
FTLayer * layer() const
returns layer
unsigned state() const
returns state
float phi() const
returns phi
virtual const MdcGeoLayer *const Layer(unsigned id)=0
static MdcParameter * instance()