TCircleFitter Class Reference

A class to fit a TTrackBase object to a circle. More...

#include <TCircleFitter.h>

Inheritance diagram for TCircleFitter:

TMFitter List of all members.

Public Member Functions

 TCircleFitter (const std::string &name)
 Constructor.
virtual ~TCircleFitter ()
 Destructor.
void dump (const std::string &message=std::string(""), const std::string &prefix=std::string("")) const
 dumps debug information.
virtual int fit (TTrackBase &) const
const std::stringname (void) const
 returns name.

Protected Member Functions

void fitDone (TTrackBase &) const
 sets the fitted flag. (Bad implementation)

Private Attributes

double _charge
double _radius
HepPoint3D _center

Detailed Description

A class to fit a TTrackBase object to a circle.

Definition at line 32 of file TCircleFitter.h.


Constructor & Destructor Documentation

TCircleFitter::TCircleFitter ( const std::string name  ) 

Constructor.

Definition at line 21 of file TCircleFitter.cxx.

00022 : TMFitter(name), _charge(0.), _radius(0.), _center(HepPoint3D(0., 0., 0.)) {
00023 }

TCircleFitter::~TCircleFitter (  )  [virtual]

Destructor.

Definition at line 25 of file TCircleFitter.cxx.

00025                               {
00026 }


Member Function Documentation

void TCircleFitter::dump ( const std::string message = std::string(""),
const std::string prefix = std::string("") 
) const

dumps debug information.

Reimplemented from TMFitter.

int TCircleFitter::fit ( TTrackBase  )  const [virtual]

Implements TMFitter.

Definition at line 29 of file TCircleFitter.cxx.

References _center, _charge, _radius, Lpav::add_point(), Lpar::center(), Circle, Lpav::fit(), TMFitter::fitDone(), genRecEmupikp::i, Lpar::kappa(), TMDCWireHit::position(), q, Lpar::radius(), TMDCWireHit::state(), t(), TFitAlreadyFitted, TFitErrorFewHits, TFitFailed, v, WireHitLeft, WireHitPatternLeft, WireHitPatternRight, WireHitRight, and TMDCWireHit::xyPosition().

00029                                        {
00030 
00031 #ifdef TRKRECO_DEBUG_DETAIL
00032     std::cout << "    TCircleFitter::fit ..." << std::endl;
00033 #endif
00034 
00035     //...Already fitted ?...
00036     if (t.fitted()) return TFitAlreadyFitted;
00037 
00038     //...Check # of hits...
00039     if (t.links().length() < 3) return TFitErrorFewHits;
00040 
00041     //...Hit loop...
00042     Lpav circle;
00043 /*
00044     circle.add_point(-173.011, 94.3169);
00045     circle.add_point(-187.6, 101.528);
00046     circle.add_point(-202.018, 108.601);
00047     circle.add_point(-216.639, 115.691);
00048     circle.add_point(-231.152, 122.49);
00049     circle.add_point(-246.207, 129.496);
00050     circle.add_point(-261.179, 136.407);
00051     circle.add_point(-275.198, 142.764);
00052     circle.add_point(-290.519, 149.572);
00053     circle.add_point(-304.42, 155.7);
00054     circle.add_point(-319.947, 162.285);
00055     circle.add_point(-335.495, 168.731);
00056     circle.add_point(-608.394, 264.577);
00057     circle.add_point(-612.842, 265.869);
00058     circle.add_point(-627.175, 270.011);
00059     circle.add_point(-643.654, 274.719);
00060     circle.add_point(-657.809, 278.683);
00061     circle.add_point(-674.464, 283.209);
00062     circle.add_point(-690.7, 287.541);
00063     circle.add_point(-704.925, 291.091);
00064   */      
00065     unsigned n = t.links().length();
00066     
00067     for (unsigned i = 0; i < n; i++) {
00068         TMLink * l = t.links()[i];
00069         const TMDCWireHit * h = l->hit();
00070 
00071         //...Check next hit...
00072         HepPoint3D point;
00073         if (h->state() & WireHitPatternLeft)
00074             point = h->position(WireHitLeft);
00075         else if (h->state() & WireHitPatternRight)
00076             point = h->position(WireHitRight);
00077         else
00078             point = h->xyPosition();
00079         // float weight = 1. / (h->distance() * h->distance());
00080         // float weight = 1. / h->distance();
00081 
00082 //      if (h->state() & WireHitPatternLeft) cout<<"h: "<<h->wire()->layerId()<<" local: "
00083 //                                              <<h->wire()->localId()<<" TCirclefitter: L"<<endl;
00084 //      else cout<<"h: "<<h->wire()->layerId()<<" local: "
00085 //              <<h->wire()->localId()<<" TCirclefitter: R"<<endl;
00086 
00087         circle.add_point(point.x(), point.y()); //, weight);
00088         //yuany
00089         
00090 //      cout<<"TCirclefitter("<<sqrt(point.x()*point.x()+point.y()*point.y())<<","
00091 //      <<point.y()/point.x()<<") dis:"
00092 //      <<(h->drift(0))*10000/40<<" point "<<point<<" L "<<(h->state()&WireHitPatternLeft)
00093 //      <<" R "<<(h->state()&WireHitPatternRight)<<endl;
00094         
00095 //      cout<<"TCirclefitter "<<point.x()<<"    "<<point.y()<<"    L "<<(h->state()&WireHitPatternLeft)<<" R "<<(h->state()&WireHitPatternRight)<<endl;
00096     }
00097     
00098     if (circle.fit() < 0.0 || circle.kappa() == 0.0) return TFitFailed;
00099     //yuany
00100 //      cout<<"circle chi2:"<<circle.fit()<<" kappa:"<<circle.kappa()<<" center:"<<circle.center()<<" radius:"<<circle.radius()<<endl;
00101 
00102     HepVector v(circle.center());
00103     _center.setX(v(1));
00104     _center.setY(v(2));
00105     _radius = circle.radius();
00106 
00107     //...Determine charge...Better way???
00108     int qSum = 0;
00109     for (unsigned i = 0; i < n; i++) {
00110         TMLink * l = t.links()[i];
00111         if (l == 0) continue;
00112 
00113         const TMDCWireHit * h = l->hit();
00114         if (h == 0) continue;
00115 
00116         float q = (_center.cross(h->xyPosition())).z();
00117         if (q > 0.) qSum += 1;
00118         else        qSum -= 1;
00119     }
00120     if (qSum >= 0) _charge = +1.;
00121     else           _charge = -1.;
00122     _radius *= _charge;
00123 
00124     if (t.objectType() == Circle)
00125         ((TCircle &) t).property(_charge, _radius, _center);
00126     fitDone(t);
00127     return 0;    
00128 }

void TMFitter::fitDone ( TTrackBase  )  const [protected, inherited]

sets the fitted flag. (Bad implementation)

Definition at line 24 of file TMFitter.cxx.

References t().

Referenced by TRobustLineFitter::fit(), TLineFitter::fit(), and fit().

00024                                       {
00025     t._fitted = true;
00026 }

const std::string & TMFitter::name ( void   )  const [inline, inherited]

returns name.

Definition at line 73 of file TMFitter.h.

References TMFitter::_name.

00073                          {
00074     return _name;
00075 }


Member Data Documentation

HepPoint3D TCircleFitter::_center [mutable, private]

Definition at line 52 of file TCircleFitter.h.

Referenced by fit().

double TCircleFitter::_charge [mutable, private]

Definition at line 50 of file TCircleFitter.h.

Referenced by fit().

double TCircleFitter::_radius [mutable, private]

Definition at line 51 of file TCircleFitter.h.

Referenced by fit().


Generated on Tue Nov 29 23:35:57 2016 for BOSS_7.0.2 by  doxygen 1.4.7