BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
MdcxFittedHel.cxx
Go to the documentation of this file.
1// -------------------------------------------------------------------------
2// File and Version Information:
3// $Id: MdcxFittedHel.cxx,v 1.9 2010/09/26 00:31:13 zhangy Exp $
4//
5// Description:
6// Class Implementation for |MdcxFittedHel|
7//
8// Environment:
9// Software developed for the BaBar Detector at the SLAC B-Factory.
10//
11// Author List:
12// S. Wagner
13// Zhang Yao(zhangyao@ihep.ac.cn) Migrate to BESIII
14//
15// Copyright Information:
16// Copyright (C) 1995 BEPCII
17//
18// History:
19// Migration for BESIII MDC
20//
21//------------------------------------------------------------------------
22#include "MdcxReco/MdcxFittedHel.h"
23#include "MdcxReco/MdcxHit.h"
24#include "MdcxReco/Mdcxmatinv.h"
25#include "MdcxReco/Mdcxprobab.h"
26#include <math.h>
27
28#include "AIDA/IHistogram1D.h"
29#include "AIDA/IHistogram2D.h"
30using std::cout;
31using std::endl;
32using std::ostream;
33
34// extern AIDA::IHistogram1D* g_fitOmega;
36
37void MdcxFittedHel::basics() {
38 nhits = 0;
39 itofit = 0;
40 fittime = 0.0;
41 prob = 0.0;
42 chisq = 1000000.0;
43 fail = 1300;
44 quality = 0;
45 origin = -1;
46 usedonhel = 0;
47 bailout = 1;
48 chidofbail = 1200.0;
49 niter = 10;
50} // endof basics
51
52void MdcxFittedHel::basics( const HepAList<MdcxHit>& e ) {
53 basics();
54 nhits = e.length();
55 xHitList = e;
56 origin = OriginIncluded();
57} // endof basics
58
59// constructors
61
62// points+guess
64 basics( XHitList );
65 sfac = Sfac;
66 *this = hel;
67 fail = IterateFit();
68} // endof MdcxFittedHel
69
70// destructor
71MdcxFittedHel::~MdcxFittedHel() {} // endof ~MdcxFittedHel
72
73// operators
75 copy( rhs );
76 return *this;
77} // endof MdcxFittedHel::operator=
78
80 // FIXME
81 copy( rhs );
82 fail = rhs.Fail();
83 chisq = rhs.Chisq();
84 rcs = rhs.Rcs();
85 prob = rhs.Prob();
86 fittime = rhs.Fittime();
87 nhits = rhs.Nhits();
88 itofit = rhs.Itofit();
89 quality = rhs.Quality();
90 origin = rhs.Origin();
91 xHitList = rhs.XHitList();
92 sfac = rhs.Sfac();
93 usedonhel = rhs.GetUsedOnHel();
94 bailout = 1;
95 chidofbail = 1200.0;
96 niter = 10;
97 return *this;
98} // endof MdcxFittedHel::operator=
99
101 const HepAList<MdcxHit>& ListOAdds ) {
102 copy( rhs );
103 fail = rhs.Fail();
104 chisq = rhs.Chisq();
105 // rcs=rhs.Rcs();
106 // prob=rhs.Prob();
107 fittime = 0.0;
108 nhits = rhs.Nhits();
109 itofit = 0;
110 quality = rhs.Quality();
111 origin = rhs.Origin();
112 xHitList = rhs.XHitList();
113 sfac = rhs.Sfac();
114 usedonhel = rhs.GetUsedOnHel();
115 bailout = 1;
116 chidofbail = 1200.0;
117 niter = 10;
118 int kkk = 0;
119 while ( ListOAdds[kkk] )
120 {
121 ListOAdds[kkk]->SetUsedOnHel( 0 );
122 kkk++;
123 }
124 kkk = 0;
125 while ( xHitList[kkk] )
126 {
127 xHitList[kkk]->SetUsedOnHel( 1 );
128 kkk++;
129 }
130 double spull;
131 MdcxHel* temp = (MdcxHel*)( &rhs );
132 kkk = 0;
133 while ( ListOAdds[kkk] )
134 {
135 if ( ListOAdds[kkk]->GetUsedOnHel() == 0 )
136 {
137 spull = ListOAdds[kkk]->pull( *temp ) / sfac;
138 chisq += spull * spull;
139 xHitList.append( ListOAdds[kkk] );
140 nhits++;
141 }
142 kkk++;
143 }
144
145 int ndof = nhits - nfree;
146 prob = Mdcxprobab( ndof, chisq );
147 rcs = chisq / ndof;
148 return *this;
149} // endof MdcxFittedHel::Grow
150
151// accessors
153 // float pull=xHitList[i]->pull(*this);
154 // float E=xHitList[i]->e();
155 // return pull*E;
156 return xHitList[i]->residual( *this );
157} // endof Residual
158
159float MdcxFittedHel::Pull( int i ) { return xHitList[i]->pull( *this ); } // endof Pulls
160
161int MdcxFittedHel::Fail( float Probmin ) const {
162 if ( fail ) return fail;
163 if ( prob < Probmin ) return 1303;
164 // now done in DoFit if(fabs(omega)>omegmax) {return 1306;}
165 return 0;
166} // endof Fail
167
168// utilities&workers
169
171 int kbl = 0;
172 while ( xHitList[kbl] ) xHitList[kbl++]->SetConstErr( 0 );
173}
174
176 fail = IterateFit();
177 return fail;
178} // endof ReFit
179
181 int ftemp = 1301; // not enough hits
182 if ( nfree > nhits ) return ftemp;
183 ftemp = 0;
184
185 if ( 6 == debug ) std::cout << "IterateFit niter=" << niter << std::endl;
186 if ( niter >= 1 )
187 {
188 float prevchisq = 0.0;
189 for ( int i = 0; i < niter; i++ )
190 {
191 itofit = i + 1;
192 ftemp = DoFit();
193 if ( 6 == debug )
194 {
195 if ( nfree == 5 )
196 {
197 cout << " iteration number= " << i << " chisq= " << chisq;
198 cout << " nhits= " << nhits << " "
199 << " fail= " << ftemp << endl;
200 }
201 print();
202 }
203 if ( ftemp != 0 ) break;
204 if ( 6 == debug )
205 std::cout << "in MdcxFittedHel::IterateFit() chisq=" << chisq
206 << " prechi2=" << prevchisq << std::endl; // yzhang debug
207 if ( ( fabs( chisq - prevchisq ) < 0.01 * chisq ) || ( chisq < 0.001 ) ) break; /// FIXME
208 prevchisq = chisq;
209 } // endof iter loop
210 }
211 else
212 {
213 float prevchisq = 0.0;
214 chisq = 1000000.0;
215 int iter = 0;
216 while ( ( fabs( chisq - prevchisq ) > 0.01 ) && ( iter++ < 1000 ) )
217 {
218 prevchisq = chisq;
219 ftemp = DoFit();
220 if ( ftemp != 0 ) break;
221 } // endof (fabs(chisq-oldchisq).gt.0.01)
222 } // endof (niter>=1)
223 int ndof = nhits - nfree;
224 prob = Mdcxprobab( ndof, chisq );
225 rcs = chisq / ndof;
226 return ftemp;
227} // endof IterateFit
228
230 int ftemp = 1301;
231 // if(nfree>nhits) {return Fail;}
232 if ( nfree > nhits ) return ftemp;
233 double m_2pi = 2.0 * M_PI;
234 ftemp = 0;
235 // pointloop
236 if ( 6 == debug )
237 {
238 std::cout << "in MdcxFittedHel::DoFit() nfree = " << nfree << " nhits = " << nhits
239 << std::endl;
240 }
241
242 int norder = nfree;
243 double A[10][10] = { { 0. } }, B[10] = { 0. }, D[10] = { 0. }, det;
244 chisq = 0.0;
245
246 if ( 6 == debug )
247 {
248 std::cout << "xHitList.length " << xHitList.length() << " ";
249 for ( int ii = 0; ii < xHitList.length(); ii++ ) { xHitList[ii]->print( std::cout, ii ); }
250 std::cout << std::endl << "sfac = " << sfac << std::endl;
251 }
252
253 for ( int i = 0; i < nhits; i++ )
254 {
255 std::vector<float> derivs = xHitList[i]->derivatives( *this );
256 if ( 6 == debug )
257 {
258 cout << "derivs " << i << " ";
259 for ( unsigned int ii = 0; ii < derivs.size(); ii++ )
260 { cout << setw( 15 ) << derivs[ii]; }
261 std::cout << std::endl;
262 }
263 if ( sfac != 1.0 )
264 {
265 for ( unsigned int ipar = 0; ipar < derivs.size(); ipar++ )
266 {
267 derivs[ipar] /= sfac;
268 if ( 6 == debug ) cout << " derivs[" << ipar << "] = " << derivs[ipar];
269 }
270 if ( 6 == debug ) std::cout << std::endl;
271 }
272 chisq += derivs[0] * derivs[0];
273 // outer parameter loop
274 for ( int ipar = 0; ipar < norder; ipar++ )
275 {
276 D[ipar] += derivs[0] * derivs[ipar + 1];
277 // inner parameter loop
278 for ( int jpar = 0; jpar < norder; jpar++ )
279 { A[ipar][jpar] += derivs[ipar + 1] * derivs[jpar + 1]; } // endof inner parameter loop
280 } // endof outer parameter loop
281 } // pointloop
282 if ( 6 == debug ) cout << "chisq = " << chisq << endl;
283 if ( chisq == 0 && nhits != 3 )
284 { // zoujh: chisq is invalid??? FIXME
285 ftemp = 1310;
286 return ftemp;
287 }
288 if ( 6 == debug )
289 {
290 for ( int ii = 0; ii < norder; ii++ )
291 {
292 cout << "D[" << ii << "]: " << D[ii] << " A:";
293 for ( int jj = 0; jj < norder; jj++ ) cout << " " << A[ii][jj];
294 cout << endl;
295 }
296 }
297 // invert A
298 int ierr;
299 if ( bailout )
300 {
301 ftemp = 1308; // bailout
302 int ndof = nhits - nfree;
303 if ( ndof > 0 )
304 {
305 if ( 6 == debug )
306 {
307 cout << "chisq " << chisq << " ndof " << ndof << " chiperdof " << chisq / ndof
308 << " >?chidofbail " << chidofbail << endl;
309 }
310 float chiperdof = chisq / ndof;
311 if ( chiperdof > chidofbail ) return ftemp;
312 }
313 else
314 {
315 if ( 6 == debug )
316 {
317 cout << " ndof <=0 : chisq " << chisq << " >? chidofbail/2.5 " << chidofbail / 2.5
318 << endl;
319 }
320 if ( chisq > chidofbail / 2.5 ) return ftemp; // FIXME
321 }
322 } // (bailout)
323 ftemp = 0;
324 ierr = Mdcxmatinv( &A[0][0], &norder, &det );
325 if ( 6 == debug ) cout << "ierr = " << ierr << endl;
326 if ( ierr == 0 )
327 {
328 for ( int ii = 0; ii < norder; ii++ )
329 for ( int jj = 0; jj < norder; jj++ ) B[ii] += A[ii][jj] * D[jj];
330 if ( 6 == debug )
331 {
332 for ( int ii = 0; ii < norder; ii++ )
333 {
334 cout << "B[" << ii << "]: " << B[ii] << " A:";
335 for ( int jj = 0; jj < norder; jj++ ) cout << " " << A[ii][jj];
336 cout << endl;
337 }
338 }
339 int bump = -1;
340 if ( qd0 ) d0 -= B[++bump];
341 if ( qphi0 )
342 {
343 phi0 -= B[++bump];
344 if ( phi0 > M_PI ) phi0 -= m_2pi;
345 if ( phi0 < -M_PI ) phi0 += m_2pi;
346 cphi0 = cos( phi0 );
347 sphi0 = sin( phi0 );
348 }
349 if ( qomega )
350 {
351 omega -= B[++bump];
352 ominfl = ( fabs( omega ) < omin ) ? 0 : 1;
353 }
354 if ( qz0 ) z0 -= B[++bump];
355 if ( qtanl ) tanl -= B[++bump];
356 if ( qt0 ) t0 -= B[++bump];
357
358 x0 = X0();
359 y0 = Y0();
360 xc = Xc();
361 yc = Yc();
362 if ( fabs( d0 ) > MdcxParameters::maxMdcRadius ) ftemp = 1305;
363 // if(g_fitOmega)g_fitOmega->fill(omega);
364 if ( fabs( omega ) > 10.0 ) ftemp = 1306; // Too tight (r < 1 cm)//yzhang FIXME 2009-11-03
365 }
366 else { ftemp = ierr; }
367 return ftemp;
368} // endof DoFit
369
370// is origin included in fit ?
371int MdcxFittedHel::OriginIncluded() {
372 for ( int i = 0; xHitList[i]; i++ )
373 {
374 int type = xHitList[i]->type();
375 if ( 2 == type )
376 { // origin "hit" ?
377 // move to end, move fit point, return hit number
378 xHitList.swap( i, nhits - 1 );
379 return nhits - 1;
380 }
381 }
382 return -1;
383}
384
386 cout << " d0 " << d0;
387 cout << " phi0 " << phi0;
388 cout << " omega " << omega;
389 cout << " z0 " << z0;
390 cout << " tanl " << tanl << endl;
391 cout << " fail " << fail;
392 cout << " chisq " << chisq;
393 cout << " iter to fit " << itofit;
394 cout << " sfac " << sfac;
395 cout << " rcs " << rcs;
396 cout << " prob " << prob;
397 cout << " fittime " << fittime << endl;
398 cout << " nhits= " << nhits << " xHitList.length " << xHitList.length() << endl;
399 for ( int ii = 0; ii < xHitList.length(); ii++ ) { xHitList[ii]->print( cout, ii ); }
400 cout << endl;
401
402 return 0;
403} // endof FitPrint
404
405int MdcxFittedHel::FitPrint( MdcxHel& hel, ostream& o ) {
406 double m_2pi = 2.0 * M_PI;
407 double difphi0 = phi0 - hel.Phi0();
408 if ( difphi0 > M_PI ) difphi0 -= m_2pi;
409 if ( difphi0 < -M_PI ) difphi0 += m_2pi;
410 cout << " difphi0= " << difphi0 << endl;
411 cout << " difomega= " << omega - hel.Omega() << endl;
412 cout << " difz0= " << z0 - hel.Z0() << endl;
413 cout << " diftanl= " << tanl - hel.Tanl() << endl;
414 o << "FitPrint ";
415 o << "nhits " << nhits << " fail " << fail << " chi2 " << chisq;
416 o << "rcs " << rcs << " prob " << prob << endl;
417 return 0;
418} // endof FitPrint
419
420// Find layer number of |hitno|
421int MdcxFittedHel::Layer( int hitno ) const {
422 if ( hitno >= nhits ) return 0;
423 return xHitList[hitno]->Layer();
424} // endof Layer
425
426// Find superlayer numbber of |hitno|
427int MdcxFittedHel::SuperLayer( int hitno ) const {
428 if ( hitno >= nhits ) { return 0; }
429 if ( hitno < 0 ) { return 0; }
430 return xHitList[hitno]->SuperLayer();
431} // endof SuperLayer
EvtStreamInputIterator< typename Generator::result_type > iter(Generator gen, int N=0)
int Mdcxmatinv(double *array, int *norder, double *det)
Definition Mdcxmatinv.cxx:7
float Mdcxprobab(int &ndof, float &chisq)
Definition Mdcxprobab.cxx:4
#define M_PI
Definition TConstant.h:4
int Layer(int hitno=0) const
float Residual(int i)
int SuperLayer(int hitno=0) const
MdcxFittedHel & operator=(const MdcxHel &)
int Fail(float Probmin=0.0) const
float Pull(int i)
MdcxFittedHel & Grow(const MdcxFittedHel &, const HepAList< MdcxHit > &)
virtual ~MdcxFittedHel()
double X0() const
Definition MdcxHel.cxx:85
double Yc() const
Definition MdcxHel.cxx:76
double Xc() const
Definition MdcxHel.cxx:67
void print() const
Definition MdcxHel.cxx:403
double Y0() const
Definition MdcxHel.cxx:87
void copy(const MdcxHel &hel)
Definition MdcxHel.cxx:226
MdcxHel()
Definition MdcxHel.cxx:32