15# if defined( __EXTENSIONS__ )
18# define __EXTENSIONS__
22#elif defined( __GNUC__ )
23# if defined( _XOPEN_SOURCE )
32#include "TrkReco/TMLine.h"
33#include "TrkReco/TMLink.h"
34#include "TrkReco/TRobustLineFitter.h"
35#include "TrkReco/TTrackBase.h"
45 if ( err )
return err;
50 if ( _n < 3 )
return 0;
57 for (
unsigned i = 0; i < _n; i++ )
60 double tmp = p.y() - ( _a * p.x() + _b );
63 double siga = sqrt( chisq / _det );
67 double f1 = rofunc(
t, a1 );
68 double a2 = _a + copysign( 3.0 * siga,
f1 );
69 double f2 = rofunc(
t, a2 );
72 if (
f1 * f2 > 0. && fabs( f2 ) > fabs(
f1 ) )
74 a2 = _a - copysign( 3.0 * siga,
f1 );
78 int backwardSearch = 0;
79 while (
f1 * f2 > 0. )
87 if (
f1 * f2 > 0. && ( fabs( f2 ) > fabs(
f1 ) || fabs( f2 -
f1 ) < 0.01 ) )
90 if ( backwardSearch == 2 ) {
break; }
100 if ( backwardSearch == 2 )
105 double siga1 = 0.01 * siga;
106 double a21( fabs( a2 - a1 ) );
107 while ( a21 > siga1 )
109 _a = 0.5 * ( a1 + a2 );
110 if ( _a == a1 || _a == a2 )
break;
111 double f = rofunc(
t, _a );
121 if ( fabs(
f ) <= fabs(
f1 ) && fabs(
f ) <= fabs( f2 ) )
123 if ( fabs(
f -
f1 ) > fabs(
f - f2 ) )
134 else if ( fabs(
f ) <= fabs(
f1 ) )
139 else if ( fabs(
f ) <= fabs( f2 ) )
146 if ( fabs( f2 ) > fabs(
f1 ) )
157 if ( fabs( a2 - a1 ) >= a21 )
break;
158 a21 = fabs( a2 - a1 );
162 if ( backwardSearch <= 1 )
168 double a21( fabs( a2 - a1 ) );
171 _a = 0.5 * ( a1 + a2 );
172 if ( _a == a1 || _a == a2 )
break;
173 double f = rofunc(
t, _a );
184 if ( fabs( a2 - a1 ) >= a21 )
break;
185 a21 = fabs( a2 - a1 );
189 _det = _det / double( _n );
191 if (
t.objectType() ==
Line ) ( (
TMLine&)
t ).property( _a, _b, _det );
196double TRobustLineFitter::rofunc(
const TTrackBase&
t,
double a )
const {
197 double* arr = (
double*)malloc( _n *
sizeof(
double ) );
198 for (
unsigned i = 0; i < _n; i++ )
199 arr[i] =
t.links()[i]->position().y() -
a *
t.links()[i]->position().x();
200 if ( _n & 1 ) { _b = select( ( _n + 1 ) >> 1, _n, arr ); }
203 unsigned j = _n >> 1;
204 _b = 0.5 * ( select( j, _n, arr ) + select( j + 1, _n, arr ) );
209 for (
unsigned i = 0; i < _n; i++ )
211 double x =
t.links()[i]->position().x();
212 double y =
t.links()[i]->position().y();
213 double d = y - (
a *
x + _b );
215 if ( y != 0. ) d /= fabs( y );
216 if ( fabs( d ) > 1.0e-7 ) sum += d > 0.0 ?
x : -
x;
222#define SWAP( a, b ) \
227double TRobustLineFitter::select(
unsigned k,
unsigned n,
double* arr )
const {
236 if ( ir == l + 1 && arr[ir] < arr[l] ) {
SWAP( arr[l], arr[ir] ); }
246 unsigned mid = ( l + ir ) >> 1;
247 SWAP( arr[mid], arr[l + 1] );
248 if ( arr[l + 1] > arr[ir] ) {
SWAP( arr[l + 1], arr[ir] ); }
249 if ( arr[l] > arr[ir] ) {
SWAP( arr[l], arr[ir] ); }
250 if ( arr[l + 1] > arr[l] ) {
SWAP( arr[l + 1], arr[l] ); }
260 while ( arr[++i] <
a )
262 while ( arr[--j] >
a )
265 SWAP( arr[i], arr[j] );
269 if ( j >= k ) ir = j - 1;
HepGeom::Point3D< double > HepPoint3D
TFile f("ana_bhabha660a_dqa_mcPat_zy_old.root")
virtual int fit(TTrackBase &) const
TLineFitter(const std::string &name)
Constructor.
const std::string & name(void) const
returns name.
void fitDone(TTrackBase &) const
sets the fitted flag. (Bad implementation)
A class to represent a track in tracking.
TRobustLineFitter(const std::string &name)
Constructor.
virtual int fit(TTrackBase &) const
virtual ~TRobustLineFitter()
Destructor.
A virtual class for a track class in tracking.