BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
TTrackBase.cxx
Go to the documentation of this file.
1//-----------------------------------------------------------------------------
2// $Id: TTrackBase.cxx,v 1.19 2011/09/05 17:32:47 maoh Exp $
3//-----------------------------------------------------------------------------
4// Filename : TTrackBase.h
5// Section : Tracking
6// Owner : Yoshi Iwasaki
7// Email : yoshihito.iwasaki@kek.jp
8//-----------------------------------------------------------------------------
9// Description : A virtual class for a track class in tracking.
10// See http://bsunsrv1.kek.jp/~yiwasaki/tracking/
11//-----------------------------------------------------------------------------
12
13// #define HEP_SHORT_NAMES
14#include "TrkReco/TTrackBase.h"
15#include "CLHEP/Alist/CList.h"
16#include "TrkReco/TMDCUtil.h"
17#include "TrkReco/TMDCWire.h"
18#include "TrkReco/TMDCWireHit.h"
19#include "TrkReco/TMDCWireHitMC.h"
20#include "TrkReco/TMFitter.h"
21#include "TrkReco/TMLink.h"
22#include "TrkReco/TTrackHEP.h"
23
25 : _links( a )
26 , _mc( 0 )
27 ,
28 // _superLayer(0),
29 // _nSuperLayers(0),
30 _fitter( 0 )
31 , _updated( false )
32 , _fitted( false )
33 , _time( 0. ) {
34 // _layer[0] = 0;
35 // _layer[1] = 0;
36 // _nLayers[0] = 0;
37 // _nLayers[1] = 0;
38 // update();
39}
40
42 : _mc( 0 )
43 ,
44 // _superLayer(0),
45 // _nSuperLayers(0),
46 _fitter( 0 )
47 , _updated( true )
48 , _fitted( false )
49 , _time( 0. ) {
50 // _layer[0] = 0;
51 // _layer[1] = 0;
52 // _nLayers[0] = 0;
53 // _nLayers[1] = 0;
54}
55
57
58void TTrackBase::dump( const std::string& msg, const std::string& pre ) const {
59 bool mc = ( msg.find( "mc" ) != std::string::npos );
60 bool pull = ( msg.find( "pull" ) != std::string::npos );
61 bool flag = ( msg.find( "flag" ) != std::string::npos );
62 bool detail = ( msg.find( "detail" ) != std::string::npos );
63 if ( detail ) mc = pull = flag = true;
64
65 if ( detail || ( msg.find( "layer" ) != std::string::npos ) )
66 {
67 if ( !_updated ) update();
68 }
69 if ( detail || ( msg.find( "hits" ) != std::string::npos ) ) { Dump( _links, msg, pre ); }
70}
71
72void TTrackBase::update( void ) const {
73 _cores.removeAll();
74 unsigned n = _links.length();
75 for ( unsigned i = 0; i < n; i++ )
76 {
77 TMLink* l = _links[i];
78 const TMDCWireHit& h = *l->hit();
79 if ( h.state() & WireHitInvalidForFit ) continue;
80 if ( !( h.state() & WireHitFittingValid ) ) continue;
81 _cores.append( l );
82 }
83 _updated = true;
84}
85
86double TTrackBase::distance( const TMLink& ) const {
87 std::cout << "TTrackBase::distance !!! not implemented" << std::endl;
88 return 0.;
89}
90
92 std::cout << "TTrackBase::approach !!! not implemented" << std::endl;
93 return -1;
94}
95
96void TTrackBase::appendByApproach( AList<TMLink>& list, double maxSigma ) {
97#ifdef TRKRECO_DEBUG_DETAIL
98 std::cout << " TTrackBase::appendByApproach ... sigma=" << maxSigma << std::endl;
99#endif
100
101 AList<TMLink> unused;
102 unsigned n = list.length();
103 for ( unsigned i = 0; i < n; i++ )
104 {
105 TMLink& l = *list[i];
106
107 if ( ( _links.hasMember( l ) ) || ( l.hit()->state() & WireHitUsed ) ) continue;
108
109 //...Calculate closest approach...
110 int err = approach( l );
111 if ( err < 0 )
112 {
113 unused.append( l );
114 continue;
115 }
116
117 //...Calculate sigma...
118 float distance = ( l.positionOnWire() - l.positionOnTrack() ).mag();
119 float diff = fabs( distance - l.drift() );
120 float sigma = diff / l.dDrift();
121
122 //...For debug...
123#ifdef TRKRECO_DEBUG_DETAIL
124 std::cout << " sigma=" << sigma;
125 std::cout << ",dist=" << distance;
126 std::cout << ",diff=" << diff;
127 std::cout << ",err=" << l.hit()->dDrift() << ",";
128 if ( sigma < maxSigma ) std::cout << "ok,";
129 else std::cout << "X,";
130 l.dump( "mc" );
131#endif
132
133 //...Make sigma cut...
134 if ( sigma > maxSigma )
135 {
136 unused.append( l );
137 continue;
138 }
139
140 //...OK...
141 _links.append( l );
142 _updated = false;
143 _fitted = false;
144 }
145 list.remove( unused );
146}
147
148void TTrackBase::appendByDistance( AList<TMLink>& list, double sigma ) {
149 std::cout << "TTrackBase::appendByDistance !!! not implemented" << std::endl;
150 list.removeAll();
151}
152
153AList<TMLink> TTrackBase::refineMain( double sigma ) {
154 AList<TMLink> bad;
155 unsigned n = _links.length();
156 for ( unsigned i = 0; i < n; i++ )
157 {
158 // std::cout<<" pull of link = "<<_links[i]->pull()<<std::endl;
159 if ( _links[i]->pull() > sigma ) bad.append( _links[i] );
160 }
161 return bad;
162}
163
164void TTrackBase::refine( AList<TMLink>& list, double sigma ) {
165 AList<TMLink> bad = refineMain( sigma );
166#ifdef TRKRECO_DEBUG
167 std::cout << " refine ... sigma=" << sigma << ", # of rejected hits=";
168 std::cout << bad.length() << std::endl;
169#endif
170#ifdef TRKRECO_DEBUG
171 Dump( bad, "sort pull mc", " " );
172#endif
173
174 if ( bad.length() )
175 {
176 _links.remove( bad );
177 list.append( bad );
178 _fitted = false;
179 _updated = false;
180 }
181}
182
183void TTrackBase::removeLinks( void ) { _links.removeAll(); }
184
185void TTrackBase::refine( double sigma ) {
186 AList<TMLink> bad = refineMain( sigma );
187 // for (unsigned i = 0; i < bad.length(); i++) {
188 // const TMDCWireHit * hit = bad[i]->hit();
189 // hit->state(hit->state() | WireHitInvalidForFit);
190 // }
191
192#ifdef TRKRECO_DEBUG_DETAIL
193 std::cout << " refine ... sigma=" << sigma << std::endl;
194 Dump( bad, "detail sort", " " );
195#endif
196
197 if ( bad.length() )
198 {
199 _fitted = false;
200 _updated = false;
201 }
202}
204 AList<TMLink> bad;
205 int jbad = -1;
206 double sigma = 0;
207 unsigned n = _links.length();
208 double chi2 = 0;
209 for ( unsigned i = 0; i < n; i++ )
210 {
211 // if(g_sigmalyr1)g_sigmalyr1->fill(sqrt(_links[i]->pull()),_links[i]->wire()->layerId());
212 chi2 += _links[i]->pull();
213 if ( _links[i]->pull() > sigma )
214 {
215 jbad = i;
216 sigma = _links[i]->pull();
217 }
218 }
219
220 chi2 = chi2 / n;
221 // if(sigma>9){bad.append(_links[jbad]);if(g_sigmalyr)g_sigmalyr->fill(sqrt(sigma),_links[jbad]->wire()->layerId());}
222 // if(sigma>20.25&&chi2>2.08){bad.append(_links[jbad]);}
223 if ( sigma > 9 ) { bad.append( _links[jbad] ); }
224 if ( bad.length() )
225 {
226 _links.remove( bad );
227 _fitted = false;
228 _updated = false;
229 }
230 return bad.length();
231}
232
233unsigned TTrackBase::testByApproach( const AList<TMLink>& list, double maxSigma ) const {
234#ifdef TRKRECO_DEBUG_DETAIL
235 std::cout << " TTrackBase::testByApproach ... sigma=" << maxSigma << std::endl;
236#endif
237
238 unsigned nOK = 0;
239 unsigned n = list.length();
240 for ( unsigned i = 0; i < n; i++ )
241 {
242 TMLink& l = *list[i];
243 nOK += testByApproach( l, maxSigma );
244 }
245 return nOK;
246}
247
248unsigned TTrackBase::testByApproach( const TMLink& link, double maxSigma ) const {
249#ifdef TRKRECO_DEBUG_DETAIL
250 std::cout << " TTrackBase::testByApproach ... sigma=" << maxSigma << std::endl;
251#endif
252 TMLink l = link;
253
254 //...Calculate closest approach...
255 int err = approach( l );
256 if ( err < 0 ) return 0;
257 //...Calculate sigma...
258 float distance = l.distance();
259 float diff = fabs( distance - l.hit()->drift() );
260 float sigma = diff / l.hit()->dDrift();
261 l.pull( sigma * sigma );
262
263 //...For debug...
264#ifdef TRKRECO_DEBUG_DETAIL
265 std::cout << " sigma=" << sigma;
266 std::cout << ",dist=" << distance;
267 std::cout << ",diff=" << diff << ",";
268 if ( sigma < maxSigma ) std::cout << "ok,";
269 else std::cout << "X,";
270 l.dump( "mc" );
271#endif
272
273 //...Make sigma cut...
274 if ( sigma < maxSigma ) return 1;
275
276 return 0;
277}
278
279// unsigned
280// TTrackBase::nAxialHits(void) const {
281// unsigned n = _links.length();
282// unsigned a = 0;
283// for (unsigned i = 0; i < n; i++) {
284// if (_links[i]->wire()->axial()) ++a;
285// }
286// return a;
287// }
288
289const AList<TMLink>& TTrackBase::links( unsigned mask ) const {
290 if ( mask == 0 ) return _links;
291
292 std::cout << "TTrackBase::links !!! mask is not supportted yet" << std::endl;
293 return _links;
294}
295
296unsigned TTrackBase::nLinks( unsigned mask ) const {
297 unsigned n = _links.length();
298 if ( mask == 0 ) return n;
299 unsigned nn = 0;
300 for ( unsigned i = 0; i < n; i++ )
301 {
302 const TMDCWireHit& h = *_links[i]->hit();
303 if ( h.state() & mask ) ++nn;
304 }
305 return nn;
306}
307
308const AList<TMLink>& TTrackBase::cores( unsigned mask ) const {
309 if ( mask ) std::cout << "TTrackBase::cores !!! mask is not supported" << std::endl;
310 if ( !_updated ) update();
311 return _cores;
312}
313
314unsigned TTrackBase::nCores( unsigned mask ) const {
315 if ( mask ) std::cout << "TTrackBase::nCores !!! mask is not supported" << std::endl;
316 if ( !_updated ) update();
317 return _cores.length();
318}
319
320// TMLink *
321// TTrackBase::innerMostLink(unsigned mask) const {
322// if (mask == 0) return InnerMost(_links);
323// unsigned n = _links.length();
324// AList<TMLink> tmp;
325// for (unsigned i = 0; i < n; i++) {
326// const TMDCWireHit & h = * _links[i]->hit();
327// if (h.state() & mask) tmp.append(_links[i]);
328// }
329// return InnerMost(tmp);
330// }
331
332// TMLink *
333// TTrackBase::outerMostLink(unsigned mask) const {
334// if (mask == 0) return OuterMost(_links);
335// unsigned n = _links.length();
336// AList<TMLink> tmp;
337// for (unsigned i = 0; i < n; i++) {
338// const TMDCWireHit & h = * _links[i]->hit();
339// if (h.state() & mask) tmp.append(_links[i]);
340// }
341// return OuterMost(tmp);
342// }
343
344int TTrackBase::fit( void ) { return _fitter->fit( *this ); }
345
347 if ( ( a.hit()->state() & WireHitUsed ) )
348 {
349#ifdef TRKRECO_DEBUG_DETAIL
350 std::cout << "TTrackBase::append !!! " << a.wire()->name()
351 << " this is already used by another track!" << std::endl;
352#endif
353 return;
354 }
355 if ( _links.hasMember( a ) )
356 {
357#ifdef TRKRECO_DEBUG_DETAIL
358 std::cout << "TTrackBase::append !!! " << a.wire()->name()
359 << " this is already included in this track!" << std::endl;
360#endif
361 return;
362 }
363 _links.append( a );
364 _updated = false;
365 _fitted = false;
366 _fittedWithCathode = false; // added by matsu ( 1999/05/24 )
367}
368
370 AList<TMLink> tmp;
371 for ( unsigned i = 0; i < a.length(); i++ )
372 {
373 if ( ( _links.hasMember( a[i] ) ) || ( a[i]->hit()->state() & WireHitUsed ) )
374 {
375#ifdef TRKRECO_DEBUG_DETAIL
376 std::cout << " TTrackBase::append(list) !!! ";
377 std::cout << a[i]->wire()->name();
378 std::cout << " Hey!, this is already used! Don't mess with me.";
379 std::cout << std::endl;
380#endif
381 continue;
382 }
383 else { tmp.append( a[i] ); }
384 }
385 _links.append( tmp );
386 _updated = false;
387 _fitted = false;
388 _fittedWithCathode = false; // added by matsu ( 1999/05/24 )
389}
390
391const TTrackHEP* const TTrackBase::hep( void ) const {
392 unsigned n = _links.length();
393 CAList<TTrackHEP> hepList;
394 CList<unsigned> hepCounter;
395 for ( unsigned i = 0; i < n; i++ )
396 {
397 const TTrackHEP* hep = _links[i]->hit()->mc()->hep();
398 unsigned nH = hepList.length();
399 bool found = false;
400 for ( unsigned j = 0; j < nH; j++ )
401 {
402 if ( hepList[j] == hep )
403 {
404 found = true;
405 ++( *hepCounter[j] );
406 }
407 }
408
409 if ( !found )
410 {
411 hepList.append( hep );
412 unsigned c = 0;
413 hepCounter.append( c );
414 }
415 }
416
417 _nHeps = hepList.length();
418 _hep = 0;
419 unsigned max = 0;
420 for ( unsigned i = 0; i < _nHeps; i++ )
421 {
422 if ( ( *hepCounter[i] ) > max )
423 {
424 max = ( *hepCounter[i] );
425 _hep = hepList[i];
426 }
427 }
428
429 return _hep;
430}
431
432unsigned TTrackBase::nHeps( void ) const {
433 hep();
434 return _nHeps;
435}
const Int_t n
#define max(a, b)
float dDrift(unsigned) const
returns drift distance error.
float drift(unsigned) const
returns drift distance.
std::string name(void) const
returns name.
virtual int approach(TMLink &) const
virtual double distance(const TMLink &) const
returns distance to a position of TMLink in TMLink space.
virtual int fit(void)
fits itself by a default fitter. Error was happened if return value is not zero.
virtual void dump(const std::string &message=std::string(""), const std::string &prefix=std::string("")) const
dumps debug information.
virtual void refine(AList< TMLink > &list, double maxSigma)
virtual void removeLinks(void)
void appendByDistance(AList< TMLink > &list, double maxDistance)
unsigned testByApproach(const TMLink &list, double sigma) const
returns # of good hits to be appended.
const TTrackMC *const mc(void) const
returns a pointer to TTrackMC.
virtual int DropWorst()
unsigned nHeps(void) const
returns # of contributed TTrackHEP tracks.
void append(TMLink &)
appends a TMLink.
const AList< TMLink > & links(unsigned mask=0) const
const TTrackHEP *const hep(void) const
returns TTrackHEP.
unsigned nCores(unsigned mask=0) const
returns # of masked TMLinks for fit. 'mask' will be applied if mask is not 0.
void appendByApproach(AList< TMLink > &list, double maxSigma)
virtual ~TTrackBase()
Destructor.
TTrackBase()
Constructor.
const AList< TMLink > & cores(unsigned mask=0) const
returns a list of masked TMLinks for fit. 'mask' will be applied if mask is not 0.
unsigned nLinks(unsigned mask=0) const
returns # of masked TMLinks assigned to this track object.
void update(void) const
update cache.
A class to represent a GEN_HEPEVT particle in tracking.