#include <TRobustLineFitter.h>
Inheritance diagram for TRobustLineFitter:
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::string & | name (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 |
Definition at line 28 of file TRobustLineFitter.h.
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] |
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 |
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 }
double TRobustLineFitter::_a [mutable, private] |
double TRobustLineFitter::_b [mutable, private] |
double TRobustLineFitter::_det [mutable, private] |
unsigned TRobustLineFitter::_n [mutable, private] |