21 static const InterfaceID IID_IVertexPointEstimator(
"InDet::VertexPointEstimator", 1, 0);
29 declareInterface<VertexPointEstimator>(
this);
84 return IID_IVertexPointEstimator;
89 return StatusCode::SUCCESS;
94 return StatusCode::SUCCESS;
103 int& errorcode)
const
120 decors[
"deltaPhiTracks"],
127 return {
"deltaPhiTracks",
"DR1R2"};
153 double minArcLength(0.);
154 double maxArcLength(0.);
171 double d0[2],
z0[2],
phi[2],
cotTheta[2],qOverPt[2],RC[2],XC[2],YC[2],RA[2],AB[2];
172 double XSVI[2],YSVI[2],ZSVI[2],RVI[2],DZSVI[2],SS1[2],SS2[2],ZZ1[2],ZZ2[2];
174 double X=0.,
Y=0.,Z=0.;
175 for (
int I=0;
I<2; ++
I) {
190 DZSVI[
I] = 2.0*DZMAX;
198 const AmgVector(5)& perParam1 = per1->parameters();
200 const AmgVector(5)& perParam2 = per2->parameters();
210 RC[0] = 10.*0.5/(qOverPt[0]*aconst); RC[1] = 10.*0.5/(qOverPt[1]*aconst);
227 RC[0] = 10.*0.5/(qOverPt[0]*aconst); RC[1] = 10.*0.5/(qOverPt[1]*aconst);
228 double U = RC[0] +
d0[0];
239 double DX = XC[1] - XC[0];
240 double DY = YC[1] - YC[0];
241 double D = DX*DX + DY*DY;
244 ATH_MSG_DEBUG(
"Concentric circles, should not happen return (0,0,0)");
248 U = D - RA[0] - RA[1];
253 double hl =
areaVar(XC[0], YC[0], RA[0], XC[1], YC[1], RA[1],
PHI);
257 double Y0 = (-1*XC[0]*YC[1] + XC[1]*YC[0])/D;
258 for (
int I=0;
I<2; ++
I) {
259 AB[
I] = COST*XC[
I] + SINT*YC[
I];
261 U = (XC[1] + XC[0])*(XC[1] - XC[0]) + (YC[1] + YC[0])*(YC[1] - YC[0]);
262 double V = (RA[1] + RA[0])*(RA[1] - RA[0]);
263 double XX = 0.5*(U - V)/D;
264 if ((XX - AB[0])*(XX - AB[0]) > 0.) {
265 U = sqrt((XX - AB[0])*(XX - AB[0]));
267 double YY2 = (RA[0] + U)*(RA[0] - U);
275 for (
int I=0;
I<2; ++
I) {
277 XSVI[
I] = COST*XX - SINT*U;
278 YSVI[
I] = SINT*XX + COST*U;
287 U = D - RA[0] - RA[1];
293 if (AB[0] < AB[1]) XX = AB[0] + RA[0];
298 V = AB[0] - RA[0] - XX;
302 V = AB[1] + RA[1] - XX;
306 XSVI[0] = COST*XX - SINT*Y0;
307 YSVI[0] = SINT*XX + COST*Y0;
311 ATH_MSG_DEBUG(
"XY distance of minimum approach is too large, return (0,0,0)");
317 for (
int J=0; J<nsol; ++J) {
318 U = (XSVI[J] - XC[0])/RC[0];
319 V = -1*(YSVI[J] - YC[0])/RC[0];
320 U = atan2(U,V) -
phi[0];
325 U = (XSVI[J] - XC[1])/RC[1];
326 V = -1*(YSVI[J] - YC[1])/RC[1];
327 U = atan2(U,V) -
phi[1];
332 RVI[J] = sqrt(XSVI[J]*XSVI[J] + YSVI[J]*YSVI[J]);
333 DZSVI[J] = ZZ2[J] - ZZ1[J];
335 ZSVI[0] = 0.5*(ZZ1[0] + ZZ2[0]);
336 ZSVI[1] = 0.5*(ZZ1[1] + ZZ2[1]);
338 if (
std::min(RVI[0],RVI[1]) > RVMAX) {
343 if (
std::min(fabs(DZSVI[0]),fabs(DZSVI[1])) > DZMAX) {
357 if ( nsol == 2 && (fabs(DZSVI[1]) < fabs(DZSVI[0])) ) J = 1;
362 intPoint(0)=
X; intPoint(1)=
Y; intPoint(2)=Z;
389 double ret = -999999;
390 double xi1, yi1, xi2, yi2;
393 double h = 0.5*(sqrt(
pow(xi1-xi2,2) +
pow(yi1-yi2,2) ));
394 double l = sqrt(
pow(xc1-xc2,2) +
pow(yc1-yc2,2) );
397 double norm1 = sqrt((xi1-xc1)*(xi1-xc1)+(yi1-yc1)*(yi1-yc1));
398 double norm2 = sqrt((xi1-xc2)*(xi1-xc2)+(yi1-yc2)*(yi1-yc2));
399 if((norm1!=0.) && (norm2!=0.)){
403 double xa = (xi1-xc1)*norm1;
404 double ya = (yi1-yc1)*norm1;
405 double xb = (xi1-xc2)*norm2;
406 double yb = (yi1-yc2)*norm2;
407 double costheta =
xa*
xb + ya*yb;
408 phi =
M_PI-std::acos(costheta);
417 if (
x < -1.)
return M_PI;
418 if (
x > 1.)
return 0;
426 double ret = -999999;
427 double xi1, yi1, xi2, yi2;
436 h = 0.5*(sqrt(
pow(xi1-xi2,2) +
pow(yi1-yi2,2) ));
438 double l = sqrt(
pow(xc1-xc2,2) +
pow(yc1-yc2,2) );
446 double norm1 = sqrt(
pow(xi1-xc1,2)+
pow(yi1-yc1,2));
447 double norm2 = sqrt(
pow(xi1-xc2,2)+
pow(yi1-yc2,2));
448 if ((norm1 != 0) && (norm2 != 0)){
450 double xa = (xi1 - xc1)/norm1;
451 double ya = (yi1 - yc1)/norm1;
452 double xb = (xi1 - xc2)/norm2;
453 double yb = (yi1 - yc2)/norm2;
454 double costheta =
xa*
xb +ya*yb;
465 double xc2,
double yc2,
double r2,
466 double& xi1,
double& yi1,
467 double& xi2,
double& yi2)
480 double A = (xc1 - xc2) / (yc2- yc1);
481 double B = (r1*r1 - r2*r2 - xc1*xc1 + xc2*xc2 - yc1*yc1 + yc2*yc2) / 2. / ( yc2 -yc1);
483 double b = 2*A*B - 2*xc1 -2*A*yc1;
484 double c = B*B - 2*B*yc1 + xc1*xc1 + yc1*yc1 - r1*r1;
493 double A = (yc1 - yc2) / (xc2- xc1);
494 double B = (r1*r1 - r2*r2 - xc1*xc1 + xc2*xc2 - yc1*yc1 + yc2*yc2) / 2. / ( xc2 -xc1);
496 double b = 2*A*B - 2*yc1 -2*A*xc1;
497 double c = B*B - 2*B*xc1 + xc1*xc1 + yc1*yc1 - r1*r1;
517 double discr =
b*
b - 4*
a*
c;
518 if (discr < 0)
return false;
519 y1 = (-
b+sqrt(discr))/2./
a;
520 y2 = (-
b-sqrt(discr))/2./
a;
528 double g,
double h) {