TRobustLineFitter Class Reference

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

#include <TRobustLineFitter.h>

Inheritance diagram for TRobustLineFitter:

TLineFitter TMFitter List of all members.

Public Member Functions

 TRobustLineFitter (const std::string &name)
 Constructor.
virtual ~TRobustLineFitter ()
 Destructor.
void dump (const std::string &message=std::string(""), const std::string &prefix=std::string("")) const
 dumps debug information.
double a (void) const
double b (void) const
double det (void) const
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 Member Functions

double rofunc (const TTrackBase &, double) const
double select (unsigned k, unsigned n, double *) const

Private Attributes

double _a
double _b
double _det
unsigned _n

Detailed Description

A class to fit a TTrackBase object to a line.

Definition at line 28 of file TRobustLineFitter.h.


Constructor & Destructor Documentation

TRobustLineFitter::TRobustLineFitter ( const std::string name  ) 

Constructor.

Definition at line 37 of file TRobustLineFitter.cxx.

00038 : TLineFitter(name), _a(0.), _b(0.), _det(0.) {
00039 }

TRobustLineFitter::~TRobustLineFitter (  )  [virtual]

Destructor.

Definition at line 41 of file TRobustLineFitter.cxx.

00041                                       {
00042 }


Member Function Documentation

double TRobustLineFitter::a ( void   )  const [inline]

Reimplemented from TLineFitter.

Definition at line 72 of file TRobustLineFitter.h.

References _a.

Referenced by select().

00072                                {
00073     return _a;
00074 }

double TRobustLineFitter::b ( void   )  const [inline]

Reimplemented from TLineFitter.

Definition at line 78 of file TRobustLineFitter.h.

References _b.

00078                                {
00079     return _b;
00080 }

double TRobustLineFitter::det ( void   )  const [inline]

Reimplemented from TLineFitter.

Definition at line 84 of file TRobustLineFitter.h.

References _det.

00084                                  {
00085     return _det;
00086 }

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

dumps debug information.

Reimplemented from TLineFitter.

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

Reimplemented from TLineFitter.

Definition at line 45 of file TRobustLineFitter.cxx.

References _a, _b, _det, _n, TLineFitter::a(), TLineFitter::b(), TLineFitter::det(), showlog::err, f1, f2, TLineFitter::fit(), TMFitter::fitDone(), genRecEmupikp::i, Line, rofunc(), and t().

Referenced by TBuilderCurl::buildStereo(), TBuilder::buildStereo(), TBuilder::initialLine2(), and TBuilder::searchLine().

00045                                            {
00046     //...Initial guess...
00047     int err = TLineFitter::fit(t);
00048     if (err) return err;
00049 
00050     //...Check # of hits...
00051     const AList<TMLink> & links = t.links();
00052     _n = links.length();
00053     if (_n < 3) return 0;
00054 
00055     //...Standard deviation...
00056     _a = TLineFitter::a();
00057     _b = TLineFitter::b();
00058     _det = TLineFitter::det();
00059     double chisq = 0.;
00060     for (unsigned i = 0; i < _n; i++) {
00061         const HepPoint3D & p = links[i]->position();
00062         double tmp = p.y() - (_a * p.x() + _b);
00063         chisq += tmp * tmp;
00064     }
00065     double siga = sqrt(chisq / _det);
00066 
00067     //...Decide iteration step...
00068     double a1 = _a;
00069     double f1 = rofunc(t, a1);
00070     double a2 = _a + copysign(3.0 * siga, f1);
00071     double f2 = rofunc(t, a2);
00072 
00073     // if initial value f2 >f1, change the search direction
00074     if( f1 * f2 > 0. && fabs(f2) > fabs(f1) ){
00075         a2 = _a - copysign(3.0 * siga, f1);
00076         f2 = rofunc(t, a2);
00077     }
00078 
00079     int backwardSearch=0;
00080     while (f1 * f2 > 0. ) {
00081       _a = 2.0 * a2 - a1;
00082       a1 = a2;
00083       f1 = f2;
00084       a2 = _a;
00085       f2 = rofunc(t, a2);
00086 
00087       if( f1 * f2 > 0. && ( fabs(f2) > fabs(f1) || fabs(f2-f1)<0.01 ) ){
00088         backwardSearch++;
00089         if(backwardSearch==2){
00090           break;
00091         }
00092 
00093         double f=f2;
00094         a2 = a1;
00095         f2 = f1;
00096         a1 = _a;
00097         f1 = f;
00098       }
00099     }
00100 
00101     if(backwardSearch==2){
00102       // for case of  no zero cross
00103       //search minimun fabs(f)
00104 
00105       double siga1 = 0.01 * siga;
00106       double a21(fabs(a2-a1));
00107       while (a21 > siga1) {
00108         _a = 0.5 * (a1 + a2);
00109         if (_a == a1 || _a == a2) break;
00110         double f = rofunc(t, _a);
00111 
00112         if( f * f1 <0 ){
00113           f1=f;
00114           a1=_a;
00115           backwardSearch--;
00116           break;
00117         }
00118 
00119         if ( fabs(f) <= fabs(f1) && fabs(f) <= fabs(f2)) {
00120           if( fabs(f-f1) > fabs(f-f2) ){
00121             f1 = f;
00122             a1 = _a;
00123           }else{
00124             f2 = f;
00125             a2 = _a;
00126           }
00127         }else if( fabs(f) <= fabs(f1) ){
00128           f1 = f;
00129           a1 = _a;
00130         }else if ( fabs(f) <= fabs(f2) ){
00131           f2 = f;
00132           a2 = _a;
00133         }else{
00134           if( fabs(f2) > fabs(f1) ){
00135             f1=f;
00136             a1 = _a;
00137           }else{
00138             f2 = f;
00139             a2 = _a;
00140           }
00141         }
00142         if (fabs(a2-a1) >= a21) break;
00143         a21 = fabs(a2-a1);
00144       }
00145     }
00146 
00147     if(backwardSearch<=1){
00148 
00149       //search zero cross
00150       siga = 0.01 * siga;
00151 
00152       double a21(fabs(a2-a1));
00153       while (a21 > siga) {
00154         _a = 0.5 * (a1 + a2);
00155         if (_a == a1 || _a == a2) break;
00156         double f = rofunc(t, _a);
00157         if (f * f1 >= 0.) {
00158           f1 = f;
00159           a1 = _a;
00160         }
00161         else {
00162           f2 = f;
00163           a2 = _a;
00164         }
00165         if (fabs(a2-a1) >= a21) break;
00166         a21 = fabs(a2-a1);
00167       }
00168     }
00169 
00170     _det = _det / double(_n);
00171 
00172     if (t.objectType() == Line)
00173         ((TMLine &) t).property(_a, _b, _det);
00174     fitDone(t);
00175     return 0;
00176 }

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 fit(), TLineFitter::fit(), and TCircleFitter::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 }

double TRobustLineFitter::rofunc ( const TTrackBase ,
double   
) const [private]

Definition at line 179 of file TRobustLineFitter.cxx.

References _b, _det, _n, genRecEmupikp::i, ganga-rec::j, select(), t(), and x.

Referenced by fit().

00179                                                               {
00180     double * arr = (double *) malloc(_n * sizeof(double));
00181     for (unsigned i = 0; i < _n; i++)
00182         arr[i] = t.links()[i]->position().y()
00183             - a * t.links()[i]->position().x();
00184     if (_n & 1) {
00185         _b = select((_n + 1) >> 1, _n, arr);
00186     }
00187     else {
00188         unsigned j = _n >> 1;
00189         _b = 0.5 * (select(j, _n, arr) + select(j + 1, _n, arr));
00190     }
00191 
00192     _det = 0.;
00193     double sum = 0.;
00194     for (unsigned i = 0; i < _n; i++) {
00195         double x = t.links()[i]->position().x();
00196         double y = t.links()[i]->position().y();
00197         double d = y - (a * x + _b);
00198         _det += fabs(d);
00199         if (y != 0.) d /= fabs(y);
00200         if (fabs(d) > 1.0e-7) sum += d > 0.0 ? x : - x;
00201     }
00202     free(arr);
00203     return sum;
00204 }

double TRobustLineFitter::select ( unsigned  k,
unsigned  n,
double *   
) const [private]

Definition at line 209 of file TRobustLineFitter.cxx.

References a(), genRecEmupikp::i, ir, ganga-rec::j, and SWAP.

Referenced by rofunc().

00209                                                                     {
00210     --k;
00211     double tmp;
00212     unsigned l = 0;
00213     unsigned ir = n - 1;
00214     while (1) {
00215         if (ir <= l + 1) {
00216             if (ir == l + 1 && arr[ir] < arr[l]) {
00217                 SWAP(arr[l],arr[ir]);
00218             }
00219 
00220 //          std::cout << "k = " << k << std::endl;
00221 //          for (unsigned i = 0; i < _n; i++)
00222 //              std::cout << i << " : " << arr[i] << std::endl;
00223 
00224             return arr[k];
00225         }
00226         else {
00227             unsigned mid = (l + ir) >> 1;
00228             SWAP(arr[mid],arr[l+1]);
00229             if (arr[l + 1] > arr[ir]) {
00230                 SWAP(arr[l+1],arr[ir]);
00231             }
00232             if (arr[l] > arr[ir]) {
00233                 SWAP(arr[l],arr[ir]);
00234             }
00235             if (arr[l + 1] > arr[l]) {
00236                 SWAP(arr[l+1],arr[l]);
00237             }
00238             unsigned i = l + 1;
00239             unsigned j = ir;
00240             double a = arr[l];
00241             while (1) {
00242 //              do i++; while (arr[i] < a);
00243 //              do j--; while (arr[j] > a);
00244 //              while (arr[i] < a) ++i;
00245 //              while (arr[j] > a) --j;
00246                 while (arr[++i] < a);
00247                 while (arr[--j] > a);
00248                 if (j < i) break;
00249                 SWAP(arr[i],arr[j]);
00250             }
00251             arr[l] = arr[j];
00252             arr[j] = a;
00253             if (j >= k) ir = j - 1;
00254             if (j <= k) l = i;
00255         }
00256     }
00257 }


Member Data Documentation

double TRobustLineFitter::_a [mutable, private]

Reimplemented from TLineFitter.

Definition at line 53 of file TRobustLineFitter.h.

Referenced by a(), and fit().

double TRobustLineFitter::_b [mutable, private]

Reimplemented from TLineFitter.

Definition at line 54 of file TRobustLineFitter.h.

Referenced by b(), fit(), and rofunc().

double TRobustLineFitter::_det [mutable, private]

Reimplemented from TLineFitter.

Definition at line 55 of file TRobustLineFitter.h.

Referenced by det(), fit(), and rofunc().

unsigned TRobustLineFitter::_n [mutable, private]

Definition at line 56 of file TRobustLineFitter.h.

Referenced by fit(), and rofunc().


Generated on Tue Nov 29 23:36:17 2016 for BOSS_7.0.2 by  doxygen 1.4.7