BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
TCircleFitter.cxx
Go to the documentation of this file.
1//-----------------------------------------------------------------------------
2// $Id: TCircleFitter.cxx,v 1.8 2010/03/31 09:58:59 liucy Exp $
3//-----------------------------------------------------------------------------
4// Filename : TCircleFitter.cc
5// Section : Tracking
6// Owner : Yoshi Iwasaki
7// Email : yoshihito.iwasaki@kek.jp
8//-----------------------------------------------------------------------------
9// Description : A class to fit a TTrackBase object to a circle.
10// See http://bsunsrv1.kek.jp/~yiwasaki/tracking/
11//-----------------------------------------------------------------------------
12
13#include "TrkReco/TCircleFitter.h"
14#include "TrkReco/TCircle.h"
15#include "TrkReco/TMLink.h"
16#include "TrkReco/TTrackBase.h"
17// #include "lpav/Lpav.h"
18// #include "TrkReco/Lpav.h"
19#include "TrackUtil/Lpav.h"
20
22 : TMFitter( name ), _charge( 0. ), _radius( 0. ), _center( HepPoint3D( 0., 0., 0. ) ) {}
23
25
27
28#ifdef TRKRECO_DEBUG_DETAIL
29 std::cout << " TCircleFitter::fit ..." << std::endl;
30#endif
31
32 //...Already fitted ?...
33 if ( t.fitted() ) return TFitAlreadyFitted;
34
35 //...Check # of hits...
36 if ( t.links().length() < 3 ) return TFitErrorFewHits;
37
38 //...Hit loop...
39 Lpav circle;
40 /*
41 circle.add_point(-173.011, 94.3169);
42 circle.add_point(-187.6, 101.528);
43 circle.add_point(-202.018, 108.601);
44 circle.add_point(-216.639, 115.691);
45 circle.add_point(-231.152, 122.49);
46 circle.add_point(-246.207, 129.496);
47 circle.add_point(-261.179, 136.407);
48 circle.add_point(-275.198, 142.764);
49 circle.add_point(-290.519, 149.572);
50 circle.add_point(-304.42, 155.7);
51 circle.add_point(-319.947, 162.285);
52 circle.add_point(-335.495, 168.731);
53 circle.add_point(-608.394, 264.577);
54 circle.add_point(-612.842, 265.869);
55 circle.add_point(-627.175, 270.011);
56 circle.add_point(-643.654, 274.719);
57 circle.add_point(-657.809, 278.683);
58 circle.add_point(-674.464, 283.209);
59 circle.add_point(-690.7, 287.541);
60 circle.add_point(-704.925, 291.091);
61 */
62 unsigned n = t.links().length();
63
64 for ( unsigned i = 0; i < n; i++ )
65 {
66 TMLink* l = t.links()[i];
67 const TMDCWireHit* h = l->hit();
68
69 //...Check next hit...
70 HepPoint3D point;
71 if ( h->state() & WireHitPatternLeft ) point = h->position( WireHitLeft );
72 else if ( h->state() & WireHitPatternRight ) point = h->position( WireHitRight );
73 else point = h->xyPosition();
74 // float weight = 1. / (h->distance() * h->distance());
75 // float weight = 1. / h->distance();
76
77 // if (h->state() & WireHitPatternLeft) cout<<"h: "<<h->wire()->layerId()<<" local: "
78 // <<h->wire()->localId()<<" TCirclefitter:
79 // L"<<endl; else cout<<"h: "<<h->wire()->layerId()<<" local: "
80 // <<h->wire()->localId()<<" TCirclefitter: R"<<endl;
81
82 circle.add_point( point.x(), point.y() ); //, weight);
83 // yuany
84
85 // cout<<"TCirclefitter("<<sqrt(point.x()*point.x()+point.y()*point.y())<<","
86 // <<point.y()/point.x()<<") dis:"
87 // <<(h->drift(0))*10000/40<<" point "<<point<<" L "<<(h->state()&WireHitPatternLeft)
88 // <<" R "<<(h->state()&WireHitPatternRight)<<endl;
89
90 // cout<<"TCirclefitter "<<point.x()<<" "<<point.y()<<" L
91 //"<<(h->state()&WireHitPatternLeft)<<" R "<<(h->state()&WireHitPatternRight)<<endl;
92 }
93
94 if ( circle.fit() < 0.0 || circle.kappa() == 0.0 ) return TFitFailed;
95 // yuany
96 // cout<<"circle chi2:"<<circle.fit()<<" kappa:"<<circle.kappa()<<"
97 // center:"<<circle.center()<<" radius:"<<circle.radius()<<endl;
98
99 HepVector v( circle.center() );
100 _center.setX( v( 1 ) );
101 _center.setY( v( 2 ) );
102 _radius = circle.radius();
103
104 //...Determine charge...Better way???
105 int qSum = 0;
106 for ( unsigned i = 0; i < n; i++ )
107 {
108 TMLink* l = t.links()[i];
109 if ( l == 0 ) continue;
110
111 const TMDCWireHit* h = l->hit();
112 if ( h == 0 ) continue;
113
114 float q = ( _center.cross( h->xyPosition() ) ).z();
115 if ( q > 0. ) qSum += 1;
116 else qSum -= 1;
117 }
118 if ( qSum >= 0 ) _charge = +1.;
119 else _charge = -1.;
120 _radius *= _charge;
121
122 if ( t.objectType() == Circle ) ( (TCircle&)t ).property( _charge, _radius, _center );
123 fitDone( t );
124 return 0;
125}
HepGeom::Point3D< double > HepPoint3D
const Int_t n
****INTEGER imax DOUBLE PRECISION m_pi *DOUBLE PRECISION m_amfin DOUBLE PRECISION m_Chfin DOUBLE PRECISION m_Xenph DOUBLE PRECISION m_sinw2 DOUBLE PRECISION m_GFermi DOUBLE PRECISION m_MfinMin DOUBLE PRECISION m_ta2 INTEGER m_out INTEGER m_KeyFSR INTEGER m_KeyQCD *COMMON c_Semalib $ !copy of input $ !CMS energy $ !beam mass $ !final mass $ !beam charge $ !final charge $ !smallest final mass $ !Z mass $ !Z width $ !EW mixing angle $ !Gmu Fermi $ alphaQED at q
Definition KKsem.h:33
**********Class see also m_nmax DOUBLE PRECISION m_amel DOUBLE PRECISION m_x2 DOUBLE PRECISION m_alfinv DOUBLE PRECISION m_Xenph INTEGER m_KeyWtm INTEGER m_idyfs DOUBLE PRECISION m_zini DOUBLE PRECISION m_q2 DOUBLE PRECISION m_Wt_KF DOUBLE PRECISION m_WtCut INTEGER m_KFfin *COMMON c_KarLud $ !Input CMS energy[GeV] $ !CMS energy after beam spread beam strahlung[GeV] $ !Beam energy spread[GeV] $ !z boost due to beam spread $ !electron beam mass *ff pair spectrum $ !minimum v
Definition KarLud.h:35
HepVector center() const
void add_point(double x, double y, double w=1)
TCircleFitter(const std::string &name)
Constructor.
virtual int fit(TTrackBase &) const
virtual ~TCircleFitter()
Destructor.
A class to represent a circle in tracking.
HepPoint3D position(unsigned) const
returns left position. z is always zero.
const HepPoint3D & xyPosition(void) const
returns drift time
const std::string & name(void) const
returns name.
TMFitter(const std::string &name)
Constructor.
Definition TMFitter.cxx:17
void fitDone(TTrackBase &) const
sets the fitted flag. (Bad implementation)
Definition TMFitter.cxx:21
A virtual class for a track class in tracking.
int t()
Definition t.c:1