BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
TrackUtil/src/Lpav.cxx
Go to the documentation of this file.
1// -*- C++ -*-
2//
3// Package: <package>
4// Module: Lpav
5//
6// Description: <one line class summary>
7//
8// Implimentation:
9// <Notes on implimentation>
10//
11// Author: KATAYAMA Nobuhiko
12// Created: Fri Feb 6 10:21:46 JST 1998
13// $Id: Lpav.cxx,v 1.1.1.1 2008/06/16 02:10:31 max Exp $
14
15// system include files
16
17#include <cmath>
18#include <iostream>
19
20// user include files
21#include "TrackUtil/Lpav.h"
22
23//
24// constants, enums and typedefs
25//
26
27extern "C" {
28float prob_( float*, int* );
29}
30
31static double err_dis_inv( double x, double y, double w, double a, double b ) {
32 if ( a == 0 && b == 0 ) { return w; }
33 else
34 {
35 double f = x * b - y * a;
36 double rsq = x * x + y * y;
37 f *= f;
38 return w * rsq / f;
39 }
40}
41
42//
43// static data member definitions
44//
45
46//
47// constructors and destructor
48//
50
51// Lpav::Lpav( const Lpav& )
52// {
53// }
54
56
57//
58// assignment operators
59//
60// const Lpav& Lpav::operator=( const Lpav& )
61// {
62// }
63
64//
65// comparison operators
66//
67// bool Lpav::operator==( const Lpav& ) const
68// {
69// }
70
71// bool Lpav::operator!=( const Lpav& ) const
72// {
73// }
74
75//
76// member functions
77//
78void Lpav::calculate_average( double xi, double yi, double wi ) {
79 if ( m_wsum <= 0 ) return;
80 m_wsum_temp = m_wsum + wi;
81 double rri( xi * xi + yi * yi );
82 double wrri( wi * rri );
83 double wsum_inv( 1 / m_wsum_temp );
84 m_xav = ( m_xsum + wi * xi ) * wsum_inv;
85 m_yav = ( m_ysum + wi * yi ) * wsum_inv;
86
87 double xxav( ( m_xxsum + wi * xi * xi ) * wsum_inv );
88 double yyav( ( m_yysum + wi * yi * yi ) * wsum_inv );
89 double xyav( ( m_xysum + wi * xi * yi ) * wsum_inv );
90 double xrrav( ( m_xrrsum + xi * wrri ) * wsum_inv );
91 double yrrav( ( m_yrrsum + yi * wrri ) * wsum_inv );
92 double rrrrav( ( m_rrrrsum + wrri * rri ) * wsum_inv );
93
94 calculate_average_n( xxav, yyav, xyav, xrrav, yrrav, rrrrav );
95}
96
98 if ( m_wsum <= 0 ) return;
99 m_wsum_temp = m_wsum;
100 double wsum_inv( 1 / m_wsum_temp );
101 m_xav = m_xsum * wsum_inv;
102 m_yav = m_ysum * wsum_inv;
103
104 double xxav( m_xxsum * wsum_inv );
105 double yyav( m_yysum * wsum_inv );
106 double xyav( m_xysum * wsum_inv );
107 double xrrav( m_xrrsum * wsum_inv );
108 double yrrav( m_yrrsum * wsum_inv );
109 double rrrrav( m_rrrrsum * wsum_inv );
110
111 calculate_average_n( xxav, yyav, xyav, xrrav, yrrav, rrrrav );
112}
113
114void Lpav::calculate_average_n( double xxav, double yyav, double xyav, double xrrav,
115 double yrrav, double rrrrav ) {
116 double xxav_p = xxav - m_xav * m_xav;
117 double yyav_p = yyav - m_yav * m_yav;
118 double xyav_p = xyav - m_xav * m_yav;
119 double rrav_p = xxav_p + yyav_p;
120
121 double a = std::fabs( xxav_p - yyav_p );
122 double b = 4 * xyav_p * xyav_p;
123 double asqpb = a * a + b;
124 double rasqpb = std::sqrt( asqpb );
125 double splus = 1 + a / rasqpb;
126 double sminus = b / ( asqpb * splus );
127 splus = std::sqrt( 0.5 * splus );
128 sminus = std::sqrt( 0.5 * sminus );
129 // C
130 // C== First require : SIGN(C**2 - S**2) = SIGN(XXAV - YYAV)
131 // C
132 if ( xxav_p <= yyav_p )
133 {
134 m_cosrot = sminus;
135 m_sinrot = splus;
136 }
137 else
138 {
139 m_cosrot = splus;
140 m_sinrot = sminus;
141 }
142 // C
143 // C== Require : SIGN(S) = SIGN(XYAV)*SIGN(C) (Assuming SIGN(C) > 0)
144 // C
145 if ( xyav_p < 0 ) m_sinrot = -m_sinrot;
146 //*
147 //* We now have the smallest angle that guarantees <X**2> > <Y**2>
148 //*
149 //* To get the SIGN of the charge right, the new X-AXIS must point
150 //* outward from the orgin. We are free to change signs of both
151 //* COSROT and SINROT simultaneously to accomplish this.
152 //*
153 //* Choose SIGN of C wisely to be able to get the sign of the charge
154 //*
155 if ( m_cosrot * m_xav + m_sinrot * m_yav <= 0 )
156 {
157 m_cosrot = -m_cosrot;
158 m_sinrot = -m_sinrot;
159 }
160 m_rscale = std::sqrt( rrav_p );
161 double cos2 = m_cosrot * m_cosrot;
162 double sin2 = m_sinrot * m_sinrot;
163 double cs2 = 2 * m_sinrot * m_cosrot;
164 double rrav_p_inv( 1 / rrav_p );
165 m_xxavp = ( cos2 * xxav_p + cs2 * xyav_p + sin2 * yyav_p ) * rrav_p_inv;
166 m_yyavp = ( cos2 * yyav_p - cs2 * xyav_p + sin2 * xxav_p ) * rrav_p_inv;
167
168 double xav2 = m_xav * m_xav;
169 double yav2 = m_yav * m_yav;
170 double xrrav_p =
171 ( xrrav - 2 * xxav * m_xav + xav2 * m_xav - 2 * xyav * m_yav + m_xav * yav2 ) -
172 m_xav * rrav_p;
173 double yrrav_p =
174 ( yrrav - 2 * yyav * m_yav + yav2 * m_yav - 2 * xyav * m_xav + m_yav * xav2 ) -
175 m_yav * rrav_p;
176 m_xrravp = ( m_cosrot * xrrav_p + m_sinrot * yrrav_p ) * rrav_p_inv / m_rscale;
177 m_yrravp = ( -m_sinrot * xrrav_p + m_cosrot * yrrav_p ) * rrav_p_inv / m_rscale;
178
179 double rrav = xxav + yyav;
180 double rrrrav_p = rrrrav - 2 * m_yav * yrrav - 2 * m_xav * xrrav + rrav * ( xav2 + yav2 ) -
181 2 * m_xav * xrrav_p - xav2 * rrav_p - 2 * m_yav * yrrav_p - yav2 * rrav_p;
182 m_rrrravp = rrrrav_p * rrav_p_inv * rrav_p_inv;
183 m_xyavp = 0;
184}
185
186void Lpav::calculate_average3( double xi, double yi, double wi ) {
187 if ( m_wsum <= 0 ) return;
188 m_wsum_temp = m_wsum + wi;
189 double wsum_inv( 1 / m_wsum_temp );
190 double rri( xi * xi + yi * yi );
191 m_xav = ( m_xsum + wi * xi ) * wsum_inv;
192 m_yav = ( m_ysum + wi * yi ) * wsum_inv;
193
194 m_rscale = 1;
195 m_cosrot = 1;
196 m_sinrot = 0;
197 m_xxavp = ( m_xxsum + wi * xi * xi ) * wsum_inv;
198 m_xyavp = ( m_xysum + wi * xi * yi ) * wsum_inv;
199 m_yyavp = ( m_yysum + wi * yi * yi ) * wsum_inv;
200 double wrri( wi * rri );
201 m_xrravp = ( m_xrrsum + xi * wrri ) * wsum_inv;
202 m_yrravp = ( m_yrrsum + yi * wrri ) * wsum_inv;
203 m_rrrravp = ( m_rrrrsum + rri * wrri ) * wsum_inv;
204}
205
207 if ( m_wsum <= 0 ) return;
208 m_wsum_temp = m_wsum;
209 double wsum_inv( 1 / m_wsum_temp );
210 m_xav = m_xsum * wsum_inv;
211 m_yav = m_ysum * wsum_inv;
212
213 m_rscale = 1;
214 m_cosrot = 1;
215 m_sinrot = 0;
216 m_xxavp = m_xxsum * wsum_inv;
217 m_xyavp = m_xysum * wsum_inv;
218 m_yyavp = m_yysum * wsum_inv;
219 m_xrravp = m_xrrsum * wsum_inv;
220 m_yrravp = m_yrrsum * wsum_inv;
221 m_rrrravp = m_rrrrsum * wsum_inv;
222}
223
224//
225// const member functions
226//
227
228//
229// static member functions
230//
231
232std::ostream& operator<<( std::ostream& o, const Lpav& a ) {
233 // o << "wsum=" << a.m_wsum << " xsum=" << a.m_xsum << " ysum=" << a.m_ysum
234 // << " xxsum=" << a.m_xxsum << " xysum=" << a.m_xysum
235 // << " yysum=" << a.m_yysum
236 // << " xrrsum=" << a.m_xrrsum << " yrrsum=" << a.m_yrrsum
237 // << " rrrrsum=" << a.m_rrrrsum;
238 // o << " rscale=" << a.m_rscale
239 // << " xxavp=" << a.m_xxavp << " yyavp=" << a.m_yyavp
240 // << " xrravp=" << a.m_xrravp << " yrravp=" << a.m_yrravp
241 // << " rrrravp=" << a.m_rrrravp << " cosrot=" << a.m_cosrot
242 // << " sinrot=" << a.m_sinrot
243 // << endl;
244 o << " nc=" << a.m_nc << " chisq=" << a.m_chisq << " " << (Lpar&)a;
245 return o;
246}
247
248double Lpav::solve_lambda( void ) {
249 if ( m_rscale <= 0 ) return -1;
250 double xrrxrr = m_xrravp * m_xrravp;
251 double yrryrr = m_yrravp * m_yrravp;
252 double rrrrm1 = m_rrrravp - 1;
253 double xxyy = m_xxavp * m_yyavp;
254
255 double c0 = rrrrm1 * xxyy - xrrxrr * m_yyavp - yrryrr * m_xxavp;
256 double c1 = -rrrrm1 + xrrxrr + yrryrr - 4 * xxyy;
257 double c2 = 4 + rrrrm1 - 4 * xxyy;
258 double c4 = -4;
259 //
260 // C COEFFICIENTS OF THE DERIVATIVE - USED IN NEWTON-RAPHSON ITERATIONS
261 //
262 double c2d = 2 * c2;
263 double c4d = 4 * c4;
264 //
265 double lambda = 0;
266
267 double chiscl = m_wsum_temp * m_rscale * m_rscale;
268 double dlamax = 0.001 / chiscl;
269 const int ntry = 5;
270 int itry = 0;
271 double dlambda = dlamax;
272 while ( itry < ntry && std::fabs( dlambda ) >= dlamax )
273 {
274 double cpoly = c0 + lambda * ( c1 + lambda * ( c2 + lambda * lambda * c4 ) );
275 double dcpoly = c1 + lambda * ( c2d + lambda * lambda * c4d );
276 dlambda = -cpoly / dcpoly;
277 lambda += dlambda;
278 itry++;
279 }
280 lambda = lambda < 0 ? 0 : lambda;
281 return lambda;
282}
283
284double Lpav::solve_lambda3( void ) {
285 if ( m_rscale <= 0 ) return -1;
286 double xrrxrr = m_xrravp * m_xrravp;
287 double yrryrr = m_yrravp * m_yrravp;
288 double rrrrm1 = m_rrrravp - 1;
289 double xxyy = m_xxavp * m_yyavp;
290
291 double a = m_rrrravp;
292 double b = xrrxrr + yrryrr - m_rrrravp * ( m_xxavp + m_yyavp );
293 double c = m_rrrravp * m_xxavp * m_yyavp - m_yyavp * xrrxrr - m_xxavp * yrryrr +
294 2 * m_xyavp * m_xrravp * m_yrravp - m_rrrravp * m_xyavp * m_xyavp;
295 if ( c >= 0 && b <= 0 ) { return ( -b - std::sqrt( b * b - 4 * a * c ) ) / 2 / a; }
296 else if ( c >= 0 && b > 0 )
297 {
298 std::cerr << " returning " << -1 << std::endl;
299 return -1;
300 }
301 else if ( c < 0 ) { return ( -b + std::sqrt( b * b - 4 * a * c ) ) / 2 / a; }
302 return -1;
303}
304
305double Lpav::calculate_lpar( void ) {
306 double lambda = solve_lambda();
307 // changed on Oct-13-93
308 // if (lambda<=0) return -1;
309 if ( lambda < 0 ) return -1;
310 double h11 = m_xxavp - lambda;
311 double h22 = m_yyavp - lambda;
312 if ( h11 == 0.0 ) return -1;
313 double h14 = m_xrravp;
314 double h24 = m_yrravp;
315 double h34 = 1 + 2 * lambda;
316 double rootsq = ( h14 * h14 / h11 / h11 ) + 4 * h34;
317 if ( std::fabs( h22 ) > std::fabs( h24 ) )
318 {
319 if ( h22 == 0.0 ) return -1;
320 double ratio = h24 / h22;
321 rootsq += ratio * ratio;
322 m_kappa = 1 / std::sqrt( rootsq );
323 m_beta = -ratio * m_kappa;
324 }
325 else
326 {
327 if ( h24 == 0.0 ) return -1;
328 double ratio = h22 / h24;
329 rootsq = 1 + ratio * ratio * rootsq;
330 m_beta = 1 / std::sqrt( rootsq );
331 m_beta = h24 > 0 ? -m_beta : m_beta;
332 m_kappa = -ratio * m_beta;
333 }
334 m_alpha = -( h14 / h11 ) * m_kappa;
335 m_gamma = -h34 * m_kappa;
336 // if (lambda<0.0001) {
337 // cout << " lambda=" << lambda << " h34=" << h34
338 // << " rootsq=" << rootsq << " h22=" << h22
339 // << " h11=" << h11 << " h14=" << h14 << " h24=" << h24 <<
340 // " " << *this << endl;
341 // }
342 //
343 // C TRANSFORM THESE INTO THE LAB COORDINATE SYSTEM
344 //
345 // C FIRST GET KAPPA AND GAMMA BACK TO REAL DIMENSIONS
346 //
347 scale( m_rscale );
348 //
349 // C NEXT ROTATE ALPHA AND BETA
350 //
351 rotate( m_cosrot, -m_sinrot );
352 //
353 // C THEN TRANSLATE BY (XAV,YAV)
354 //
355 move( -m_xav, -m_yav );
356 if ( m_yrravp < 0 ) neg();
357 if ( lambda >= 0 ) m_chisq = lambda * m_wsum_temp * m_rscale * m_rscale;
358 return lambda;
359}
360
361double Lpav::calculate_lpar3( void ) {
362 double lambda = solve_lambda3();
363 // changed on Oct-13-93
364 // if (lambda<=0) return -1;
365 if ( lambda < 0 ) return -1;
366 double h11 = m_xxavp - lambda;
367 double h22 = m_yyavp - lambda;
368 double h14 = m_xrravp;
369 double h24 = m_yrravp;
370 m_gamma = 0;
371 double h12 = m_xyavp;
372 double det = h11 * h22 - h12 * h12;
373 if ( det != 0 )
374 {
375 double r1 = ( h14 * h22 - h24 * h12 ) / ( det );
376 double r2 = ( h24 * h11 - h14 * h12 ) / ( det );
377 double kinvsq = r1 * r1 + r2 * r2;
378 m_kappa = std::sqrt( 1 / kinvsq );
379 if ( h11 != 0 ) m_alpha = -m_kappa * r1;
380 else m_alpha = 1;
381 if ( h22 != 0 ) m_beta = -m_kappa * r2;
382 else m_beta = 1;
383 }
384 else
385 {
386 m_kappa = 0;
387 if ( h11 != 0 && h22 != 0 )
388 {
389 m_beta = 1 / std::sqrt( 1 + h12 * h12 / h11 / h11 );
390 m_alpha = std::sqrt( 1 - m_beta * m_beta );
391 }
392 else if ( h11 != 0 )
393 {
394 m_beta = 1;
395 m_alpha = 0;
396 }
397 else
398 {
399 m_beta = 0;
400 m_alpha = 1;
401 }
402 }
403 if ( ( m_alpha * m_xav + m_beta * m_yav ) * ( m_beta * m_xav - m_alpha * m_yav ) < 0 ) neg();
404 // if (std::fabs(m_alpha)<0.01 && std::fabs(m_beta)<0.01) {
405 // cout << " lambda=" << lambda << " " << *this << endl;
406 // }
407 if ( lambda >= 0 ) m_chisq = lambda * m_wsum_temp * m_rscale * m_rscale;
408 return lambda;
409}
410
411double Lpav::fit( double x, double y, double w ) {
412 if ( m_nc <= 3 ) return -1;
413 m_chisq = -1;
414 double q;
415 if ( m_nc < 4 )
416 {
417 calculate_average3( x, y, w );
418 double q = calculate_lpar3();
419 if ( q > 0 ) m_chisq = q * m_wsum_temp * m_rscale * m_rscale;
420 }
421 else
422 {
423 calculate_average( x, y, w );
424 q = calculate_lpar();
425 if ( q > 0 ) m_chisq = q * m_wsum_temp * m_rscale * m_rscale;
426 }
427 return m_chisq;
428}
429
430double Lpav::fit( void ) {
431 if ( m_nc <= 3 ) return -1;
432 m_chisq = -1;
433 double q;
434 if ( m_nc < 4 )
435 {
437 q = calculate_lpar3();
438 if ( q > 0 ) m_chisq = q * m_wsum_temp * m_rscale * m_rscale;
439 }
440 else
441 {
443 q = calculate_lpar();
444 if ( q > 0 ) m_chisq = q * m_wsum_temp * m_rscale * m_rscale;
445 }
446 return m_chisq;
447}
448
449HepSymMatrix Lpav::cov( int inv ) const
450#ifdef BELLE_OPTIMIZED_RETURN
451 return vret( 4 );
452{
453#else
454{
455 HepSymMatrix vret( 4 );
456#endif
457 vret( 1, 1 ) = m_xxsum;
458 vret( 2, 1 ) = m_xysum;
459 vret( 2, 2 ) = m_yysum;
460 vret( 3, 1 ) = m_xsum;
461 vret( 3, 2 ) = m_ysum;
462 vret( 3, 3 ) = m_wsum;
463 vret( 4, 1 ) = m_xrrsum;
464 vret( 4, 2 ) = m_yrrsum;
465 vret( 4, 3 ) = m_xxsum + m_yysum;
466 vret( 4, 4 ) = m_rrrrsum;
467 if ( inv == 0 )
468 {
469 // int i=vret.Inv();
470 int i;
471 vret.invert( i );
472 if ( i != 0 )
473 {
474 std::cerr << "Lpav::cov:could not invert nc=" << m_nc << vret;
475#ifdef HAVE_EXCEPTION
476 THROW( Lpav::cov, Singular );
477#endif
478 }
479 }
480 return vret;
481}
482
483HepSymMatrix Lpav::cov_c( int inv ) const
484#ifdef BELLE_OPTIMIZED_RETURN
485 return vret( 3 );
486{
487#else
488{
489 HepSymMatrix vret( 3 );
490#endif
491#ifdef HAVE_EXCEPTION
492 try
493 {
494#endif
495 vret = cov( 1 ).similarity( dldc() );
496#ifdef HAVE_EXCEPTION
497 } catch ( Lpav::Singular )
498 { THROW( Lpav::cov_c1, Singular_c ); }
499#endif
500 if ( inv == 0 )
501 {
502 // int i = vret.Inv();
503 int i;
504 vret.invert( i );
505 if ( i != 0 )
506 {
507 std::cerr << "Lpav::cov_c:could not invert " << vret;
508#ifdef HAVE_EXCEPTION
509 THROW( Lpav::cov_c2, Singular_c );
510#endif
511 }
512 }
513 return vret;
514}
515
516int Lpav::extrapolate( double r, double& phi, double& dphi ) const {
517 double x, y;
518 if ( m_chisq < 0 ) return -1;
519 if ( xy( r, x, y ) != 0 ) return -1;
520 phi = std::atan2( y, x );
521 if ( phi < 0 ) phi += ( 2 * M_PI );
522 HepVector v( 4 );
523 v( 1 ) = x;
524 v( 2 ) = y;
525 v( 3 ) = 1;
526 v( 4 ) = r * r;
527// HepSymMatrix l = cov().similarityT(v);
528#ifdef HAVE_EXCEPTION
529 try
530 {
531#endif
532 // HepSymMatrix l = cov().similarity(v.T());
533 // // cout << "delta d^2=" << l(1,1);
534 // if (l(1,1)>0) {
535 double l = cov().similarity( v );
536 if ( l > 0 )
537 {
538 double ls = std::sqrt( l );
539 dphi = ls / r;
540 // cout << " delta d=" << ls << " dphi=" << dphi;
541 }
542#ifdef HAVE_EXCEPTION
543 } catch ( Lpav::Singular )
544 { return -1; }
545#endif
546 // cout << endl;
547 return 0;
548}
549
550double Lpav::similarity( double x, double y ) const {
551 if ( m_nc <= 3 ) return -1;
552 HepVector v( 4 );
553 v( 1 ) = x;
554 v( 2 ) = y;
555 v( 3 ) = 1;
556 v( 4 ) = x * x + y * y;
557 double l;
558#ifdef HAVE_EXCEPTION
559 try
560 {
561#endif
562 l = cov().similarity( v );
563#ifdef HAVE_EXCEPTION
564 } catch ( Lpav::Singular )
565 { return -1; }
566#endif
567 return l;
568}
569
570void Lpav::add( double xi, double yi, double w, double a, double b ) {
571 register double wi = err_dis_inv( xi, yi, w, a, b );
572 add( xi, yi, wi );
573}
574
575void Lpav::add_point( register double xi, register double yi, register double wi ) {
576 m_wsum += wi;
577 m_xsum += wi * xi;
578 m_ysum += wi * yi;
579 m_xxsum += wi * xi * xi;
580 m_yysum += wi * yi * yi;
581 m_xysum += wi * xi * yi;
582 register double rri = ( xi * xi + yi * yi );
583 register double wrri = wi * rri;
584 m_xrrsum += wrri * xi;
585 m_yrrsum += wrri * yi;
586 m_rrrrsum += wrri * rri;
587 m_nc += 1;
588}
589
590void Lpav::add_point_frac( double xi, double yi, double w, double a ) {
591 register double wi = w * a;
592 m_wsum += wi;
593 m_xsum += wi * xi;
594 m_ysum += wi * yi;
595 m_xxsum += wi * xi * xi;
596 m_yysum += wi * yi * yi;
597 m_xysum += wi * xi * yi;
598 register double rri = ( xi * xi + yi * yi );
599 register double wrri = wi * rri;
600 m_xrrsum += wrri * xi;
601 m_yrrsum += wrri * yi;
602 m_rrrrsum += wrri * rri;
603 m_nc += a;
604}
605
606void Lpav::sub( double xi, double yi, double w, double a, double b ) {
607 register double wi = err_dis_inv( xi, yi, w, a, b );
608 m_wsum -= wi;
609 m_xsum -= wi * xi;
610 m_ysum -= wi * yi;
611 m_xxsum -= wi * xi * xi;
612 m_yysum -= wi * yi * yi;
613 m_xysum -= wi * xi * yi;
614 register double rri = ( xi * xi + yi * yi );
615 register double wrri = wi * rri;
616 m_xrrsum -= wrri * xi;
617 m_yrrsum -= wrri * yi;
618 m_rrrrsum -= wrri * rri;
619 m_nc -= 1;
620}
621
622const Lpav& Lpav::operator+=( const Lpav& la1 ) {
623 m_wsum += la1.m_wsum;
624 m_xsum += la1.m_xsum;
625 m_ysum += la1.m_ysum;
626 m_xxsum += la1.m_xxsum;
627 m_yysum += la1.m_yysum;
628 m_xysum += la1.m_xysum;
629 m_xrrsum += la1.m_xrrsum;
630 m_yrrsum += la1.m_yrrsum;
631 m_rrrrsum += la1.m_rrrrsum;
632 m_nc += la1.m_nc;
633 return *this;
634}
635
636Lpav operator+( const Lpav& la1, const Lpav& la2 )
637#ifdef BELLE_OPTIMIZED_RETURN
638 return la;
639{
640#else
641{
642 Lpav la;
643#endif
644 la.m_wsum = la1.m_wsum + la2.m_wsum;
645 la.m_xsum = la1.m_xsum + la2.m_xsum;
646 la.m_ysum = la1.m_ysum + la2.m_ysum;
647 la.m_xxsum = la1.m_xxsum + la2.m_xxsum;
648 la.m_yysum = la1.m_yysum + la2.m_yysum;
649 la.m_xysum = la1.m_xysum + la2.m_xysum;
650 la.m_xrrsum = la1.m_xrrsum + la2.m_xrrsum;
651 la.m_yrrsum = la1.m_yrrsum + la2.m_yrrsum;
652 la.m_rrrrsum = la1.m_rrrrsum + la2.m_rrrrsum;
653 la.m_nc = la1.m_nc + la2.m_nc;
654 return la;
655}
656
657double Lpav::prob() const {
658 if ( m_nc <= 3 ) return 0;
659 if ( m_chisq < 0 ) return 0;
660 float c = m_chisq;
661 int nci = (int)m_nc - 3;
662 double p = (double)prob_( &c, &nci );
663 return p;
664}
665
666double Lpav::chi_deg() const {
667 if ( m_nc <= 3 ) return -1;
668 else return m_chisq / ( m_nc - 3 );
669}
670
671double Lpav::delta_chisq( double x, double y, double w ) const {
672 double sim = similarity( x, y );
673 if ( sim < 0 ) return -1;
674 double d = d0( x, y );
675 double delta = std::sqrt( d ) * w / ( 1 + sim * w );
676 return delta;
677}
TFile f("ana_bhabha660a_dqa_mcPat_zy_old.root")
float prob_(float *, int *)
double w
****INTEGER imax DOUBLE PRECISION m_pi *DOUBLE PRECISION m_amfin DOUBLE PRECISION m_Chfin DOUBLE PRECISION m_Xenph DOUBLE PRECISION m_sinw2 DOUBLE PRECISION m_GFermi DOUBLE PRECISION m_MfinMin DOUBLE PRECISION m_ta2 INTEGER m_out INTEGER m_KeyFSR INTEGER m_KeyQCD *COMMON c_Semalib $ !copy of input $ !CMS energy $ !beam mass $ !final mass $ !beam charge $ !final charge $ !smallest final mass $ !Z mass $ !Z width $ !EW mixing angle $ !Gmu Fermi $ alphaQED at q
Definition KKsem.h:33
**********Class see also m_nmax DOUBLE PRECISION m_amel DOUBLE PRECISION m_x2 DOUBLE PRECISION m_alfinv DOUBLE PRECISION m_Xenph INTEGER m_KeyWtm INTEGER m_idyfs DOUBLE PRECISION m_zini DOUBLE PRECISION m_q2 DOUBLE PRECISION m_Wt_KF DOUBLE PRECISION m_WtCut INTEGER m_KFfin *COMMON c_KarLud $ !Input CMS energy[GeV] $ !CMS energy after beam spread beam strahlung[GeV] $ !Beam energy spread[GeV] $ !z boost due to beam spread $ !electron beam mass *ff pair spectrum $ !minimum v
Definition KarLud.h:35
#define M_PI
Definition TConstant.h:4
std::ostream & operator<<(std::ostream &o, const Lpav &a)
Lpav operator+(const Lpav &la1, const Lpav &la2)
float prob_(float *, int *)
double phi(double r, int dir=0) const
double calculate_lpar3(void)
void add_point(double x, double y, double w=1)
HepSymMatrix cov_c(int=0) const
void calculate_average3(void)
void calculate_average(void)
double calculate_lpar(void)
void add_point_frac(double x, double y, double w, double f)
double delta_chisq(double x, double y, double w=1) const
int extrapolate(double, double &, double &) const
virtual ~Lpav()
double chi_deg() const
const Lpav & operator+=(const Lpav &)
double prob() const
double similarity(double, double) const
HepSymMatrix cov(int=0) const