17 #include "CLHEP/Vector/Sqr.h"
18 #include "trg/cdc/Lpav.h"
31 float prob_(
float*,
int*);
35 static double err_dis_inv(
double x,
double y,
double w,
double a,
double b)
37 if (a == 0 && b == 0) {
40 double f = x * b - y * a;
41 double rsq = x * x + y * y;
115 double rri(xi * xi + yi * yi);
116 double wrri(wi * rri);
121 double xxav((
m_xxsum + wi * xi * xi) * wsum_inv);
122 double yyav((
m_yysum + wi * yi * yi) * wsum_inv);
123 double xyav((
m_xysum + wi * xi * yi) * wsum_inv);
124 double xrrav((
m_xrrsum + xi * wrri) * wsum_inv);
125 double yrrav((
m_yrrsum + yi * wrri) * wsum_inv);
126 double rrrrav((
m_rrrrsum + wrri * rri) * wsum_inv);
140 double xxav(
m_xxsum * wsum_inv);
141 double yyav(
m_yysum * wsum_inv);
142 double xyav(
m_xysum * wsum_inv);
151 double xrrav,
double yrrav,
double rrrrav)
156 double rrav_p = xxav_p + yyav_p;
158 double a = std::fabs(xxav_p - yyav_p);
159 double b = 4 * xyav_p * xyav_p;
160 double asqpb = a * a + b;
161 double rasqpb = std::sqrt(asqpb);
162 double splus = 1 + a / rasqpb;
163 double sminus = b / (asqpb * splus);
164 splus = std::sqrt(0.5 * splus);
165 sminus = std::sqrt(0.5 * sminus);
169 if (xxav_p <= yyav_p) {
197 double rrav_p_inv(1 / rrav_p);
198 m_xxavp = (cos2 * xxav_p + cs2 * xyav_p + sin2 * yyav_p) * rrav_p_inv;
199 m_yyavp = (cos2 * yyav_p - cs2 * xyav_p + sin2 * xxav_p) * rrav_p_inv;
203 double xrrav_p = (xrrav - 2 * xxav *
m_xav + xav2 *
m_xav -
205 double yrrav_p = (yrrav - 2 * yyav *
m_yav + yav2 *
m_yav -
210 double rrav = xxav + yyav;
211 double rrrrav_p = rrrrav
213 + rrav * (xav2 + yav2)
214 - 2 *
m_xav * xrrav_p - xav2 * rrav_p
215 - 2 *
m_yav * yrrav_p - yav2 * rrav_p;
216 m_rrrravp = rrrrav_p * rrav_p_inv * rrav_p_inv;
225 double rri(xi * xi + yi * yi);
235 double wrri(wi * rri);
283 o <<
" nc=" << a.m_nc <<
" chisq=" << a.m_chisq <<
" " << (
TRGCDCLpar&) a;
296 double c1 = - rrrrm1 + xrrxrr + yrryrr - 4 * xxyy;
297 double c2 = 4 + rrrrm1 - 4 * xxyy;
308 double dlamax = 0.001 / chiscl;
311 double dlambda = dlamax;
312 while (itry < ntry && std::fabs(dlambda) >= dlamax) {
313 double cpoly = c0 + lambda * (c1 + lambda *
314 (c2 + lambda * lambda * c4));
315 double dcpoly = c1 + lambda * (c2d + lambda * lambda * c4d);
316 dlambda = - cpoly / dcpoly;
320 lambda = lambda < 0 ? 0 : lambda;
337 if (c >= 0 && b <= 0) {
338 return (-b - std::sqrt(b * b - 4 * a * c)) / 2 / a;
339 }
else if (c >= 0 && b > 0) {
340 std::cout <<
" returning " << -1 << std::endl;
343 return (-b + std::sqrt(b * b - 4 * a * c)) / 2 / a;
353 if (lambda < 0)
return -1;
356 if (h11 == 0.0)
return -1;
359 double h34 = 1 + 2 * lambda;
360 double rootsq = (h14 * h14 / h11 / h11) + 4 * h34;
361 if (std::fabs(h22) > std::fabs(h24)) {
362 if (h22 == 0.0)
return -1;
363 double ratio = h24 / h22;
364 rootsq += ratio * ratio ;
365 m_kappa = 1 / std::sqrt(rootsq);
368 if (h24 == 0.0)
return -1;
369 double ratio = h22 / h24;
370 rootsq = 1 + ratio * ratio * rootsq;
371 m_beta = 1 / std::sqrt(rootsq);
407 if (lambda < 0)
return -1;
414 double det = h11 * h22 - h12 * h12;
416 double r1 = (h14 * h22 - h24 * h12) / (det);
417 double r2 = (h24 * h11 - h14 * h12) / (det);
418 double kinvsq = r1 * r1 + r2 * r2;
419 m_kappa = std::sqrt(1 / kinvsq);
426 if (h11 != 0 && h22 != 0) {
427 m_beta = 1 / std::sqrt(1 + h12 * h12 / h11 / h11);
429 }
else if (h11 != 0) {
448 if (
m_nc <= 3)
return -1;
464 if (
m_nc <= 3)
return -1;
480 #ifdef BELLE_OPTIMIZED_RETURN
485 CLHEP::HepSymMatrix vret(4);
487 vret(1, 1) = m_xxsum;
488 vret(2, 1) = m_xysum;
489 vret(2, 2) = m_yysum;
493 vret(4, 1) = m_xrrsum;
494 vret(4, 2) = m_yrrsum;
495 vret(4, 3) = m_xxsum + m_yysum;
496 vret(4, 4) = m_rrrrsum;
503 std::cout <<
"TRGCDCLpav::cov:could not invert nc=" << m_nc << vret;
504 #ifdef HAVE_EXCEPTION
513 #ifdef BELLE_OPTIMIZED_RETURN
518 CLHEP::HepSymMatrix vret(3);
520 #ifdef HAVE_EXCEPTION
523 vret = cov(1).similarity(dldc());
524 #ifdef HAVE_EXCEPTION
527 throw new Singular_c();
536 std::cout <<
"TRGCDCLpav::cov_c:could not invert " << vret;
537 #ifdef HAVE_EXCEPTION
538 throw new Singular_c();
549 if (
xy(r,
x,
y) != 0)
return -1;
550 phi = std::atan2(
y,
x);
551 if (
phi < 0)
phi += (2 * M_PI);
552 CLHEP::HepVector v(4);
558 #ifdef HAVE_EXCEPTION
564 double l =
cov().similarity(v);
566 double ls = std::sqrt(l);
570 #ifdef HAVE_EXCEPTION
581 if (
m_nc <= 3)
return -1;
582 CLHEP::HepVector v(4);
586 v(4) =
x *
x +
y *
y;
588 #ifdef HAVE_EXCEPTION
591 l =
cov().similarity(v);
592 #ifdef HAVE_EXCEPTION
617 double rri = (xi * xi + yi * yi);
618 double wrri = wi * rri;
637 double rri = (xi * xi + yi * yi);
638 double wrri = wi * rri;
657 double rri = (xi * xi + yi * yi);
658 double wrri = wi * rri;
681 #ifdef BELLE_OPTIMIZED_RETURN
703 if (
m_nc <= 3)
return 0;
715 if (
m_nc <= 3)
return -1;
722 if (sim < 0)
return -1;
724 double delta = sqr(
d) * w / (1 + sim * w);