00001
00002
00003
00004 #include "KalFitAlg/helix/Helix.h"
00005 #include "KalFitAlg/KalFitHitMdc.h"
00006 #include "KalFitAlg/KalFitWire.h"
00007
00008
00009
00010 using namespace KalmanFit;
00011
00012
00013
00014
00015 double
00016 Helix::approach(KalFitHitMdc& hit, bool doSagCorrection) const {
00017
00018
00019 HepPoint3D positionOnWire, positionOnTrack;
00020 HepPoint3D pv = pivot();
00021
00022 HepVector Va = a();
00023
00024 HepSymMatrix Ma = Ea();
00025
00026
00027 Helix _helix(pv, Va ,Ma);
00028
00029 const KalFitWire& w = hit.wire();
00030 Hep3Vector Wire = w.fwd() - w.bck();
00031
00032
00033 double wp[3];
00034 wp[0] = 0.5*(w.fwd() + w.bck()).x();
00035 wp[1] = 0.5*(w.fwd() + w.bck()).y();
00036 wp[2] = 0.;
00037 double wb[3];
00038
00039 wb[0] = w.bck().x();
00040 wb[1] = w.bck().y();
00041 wb[2] = w.bck().z();
00042 double v[3];
00043 v[0] = Wire.unit().x();
00044 v[1] = Wire.unit().y();
00045 v[2] = Wire.unit().z();
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069 const HepPoint3D & xc = _helix.center();
00070
00071
00072
00073 double xt[3]; _helix.x(0., xt);
00074 double x0 = - xc.x();
00075 double y0 = - xc.y();
00076 double x1 = wp[0] + x0;
00077 double y1 = wp[1] + y0;
00078 x0 += xt[0];
00079 y0 += xt[1];
00080 double dPhi = atan2(x0 * y1 - y0 * x1, x0 * x1 + y0 * y1);
00081
00082
00083
00084
00085 double kappa = _helix.kappa();
00086 double phi0 = _helix.phi0();
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100 double firstdfdphi = 0.;
00101 static bool first = true;
00102 if (first) {
00103
00104
00105
00106 }
00107
00108
00109
00110 double rho = Helix::ConstantAlpha / kappa;
00111 double tanLambda = _helix.tanl();
00112 static HepPoint3D x;
00113 double t_x[3];
00114 double t_dXdPhi[3];
00115 const double convergence = 1.0e-5;
00116 double l;
00117 unsigned nTrial = 0;
00118 while (nTrial < 100) {
00119
00120
00121 positionOnTrack = _helix.x(dPhi);
00122 x = _helix.x(dPhi);
00123 t_x[0] = x[0];
00124 t_x[1] = x[1];
00125 t_x[2] = x[2];
00126
00127 l = v[0] * t_x[0] + v[1] * t_x[1] + v[2] * t_x[2]
00128 - v[0] * wb[0] - v[1] * wb[1] - v[2] * wb[2];
00129
00130 double rcosPhi = rho * cos(phi0 + dPhi);
00131 double rsinPhi = rho * sin(phi0 + dPhi);
00132 t_dXdPhi[0] = rsinPhi;
00133 t_dXdPhi[1] = - rcosPhi;
00134 t_dXdPhi[2] = - rho * tanLambda;
00135
00136
00137 double t_d2Xd2Phi[2];
00138 t_d2Xd2Phi[0] = rcosPhi;
00139 t_d2Xd2Phi[1] = rsinPhi;
00140
00141
00142 double n[3];
00143 n[0] = t_x[0] - wb[0];
00144 n[1] = t_x[1] - wb[1];
00145 n[2] = t_x[2] - wb[2];
00146
00147 double a[3];
00148 a[0] = n[0] - l * v[0];
00149 a[1] = n[1] - l * v[1];
00150 a[2] = n[2] - l * v[2];
00151 double dfdphi = a[0] * t_dXdPhi[0]
00152 + a[1] * t_dXdPhi[1]
00153 + a[2] * t_dXdPhi[2];
00154
00155
00156 if (nTrial == 0) {
00157
00158 firstdfdphi = dfdphi;
00159 }
00160
00161
00162 if (nTrial > 3) {
00163 std::cout<<" bad case, calculate approach ntrial = "<<nTrial<< std::endl;
00164 }
00165
00166
00167
00168 if (fabs(dfdphi) < convergence)
00169 break;
00170
00171 double dv = v[0] * t_dXdPhi[0]
00172 + v[1] * t_dXdPhi[1]
00173 + v[2] * t_dXdPhi[2];
00174 double t0 = t_dXdPhi[0] * t_dXdPhi[0]
00175 + t_dXdPhi[1] * t_dXdPhi[1]
00176 + t_dXdPhi[2] * t_dXdPhi[2];
00177 double d2fd2phi = t0 - dv * dv
00178 + a[0] * t_d2Xd2Phi[0]
00179 + a[1] * t_d2Xd2Phi[1];
00180
00181
00182 dPhi -= dfdphi / d2fd2phi;
00183
00184
00185
00186
00187 ++nTrial;
00188 }
00189
00190 positionOnWire[0] = wb[0] + l * v[0];
00191 positionOnWire[1] = wb[1] + l * v[1];
00192 positionOnWire[2] = wb[2] + l * v[2];
00193
00194
00195
00196 return (positionOnTrack - positionOnWire).mag();
00197
00198
00199
00200
00201
00202
00203
00204 }
00205
00206
00207 double
00208 Helix::approach(HepPoint3D pfwd, HepPoint3D pbwd, bool doSagCorrection) const
00209 {
00210
00211
00212 HepPoint3D positionOnWire, positionOnTrack;
00213 HepPoint3D pv = pivot();
00214 HepVector Va = a();
00215 HepSymMatrix Ma = Ea();
00216
00217 Helix _helix(pv, Va ,Ma);
00218 Hep3Vector Wire;
00219 Wire[0] = (pfwd - pbwd).x();
00220 Wire[1] = (pfwd - pbwd).y();
00221 Wire[2] = (pfwd - pbwd).z();
00222
00223
00224 double wp[3];
00225 wp[0] = 0.5*(pfwd + pbwd).x();
00226 wp[1] = 0.5*(pfwd + pbwd).y();
00227 wp[2] = 0.;
00228 double wb[3];
00229
00230 wb[0] = pbwd.x();
00231 wb[1] = pbwd.y();
00232 wb[2] = pbwd.z();
00233 double v[3];
00234 v[0] = Wire.unit().x();
00235 v[1] = Wire.unit().y();
00236 v[2] = Wire.unit().z();
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260 const HepPoint3D & xc = _helix.center();
00261 double xt[3];
00262 _helix.x(0., xt);
00263 double x0 = - xc.x();
00264 double y0 = - xc.y();
00265 double x1 = wp[0] + x0;
00266 double y1 = wp[1] + y0;
00267 x0 += xt[0];
00268 y0 += xt[1];
00269
00270
00271
00272
00273 double dPhi = atan2(x0 * y1 - y0 * x1, x0 * x1 + y0 * y1);
00274
00275
00276
00277
00278 double kappa = _helix.kappa();
00279 double phi0 = _helix.phi0();
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293 double firstdfdphi = 0.;
00294 static bool first = true;
00295 if (first) {
00296
00297
00298
00299 }
00300
00301
00302
00303 double rho = Helix::ConstantAlpha / kappa;
00304 double tanLambda = _helix.tanl();
00305 static HepPoint3D x;
00306 double t_x[3];
00307 double t_dXdPhi[3];
00308 const double convergence = 1.0e-5;
00309 double l;
00310 unsigned nTrial = 0;
00311 while (nTrial < 100) {
00312
00313
00314 positionOnTrack = _helix.x(dPhi);
00315 x = _helix.x(dPhi);
00316 t_x[0] = x[0];
00317 t_x[1] = x[1];
00318 t_x[2] = x[2];
00319
00320 l = v[0] * t_x[0] + v[1] * t_x[1] + v[2] * t_x[2]
00321 - v[0] * wb[0] - v[1] * wb[1] - v[2] * wb[2];
00322
00323 double rcosPhi = rho * cos(phi0 + dPhi);
00324 double rsinPhi = rho * sin(phi0 + dPhi);
00325 t_dXdPhi[0] = rsinPhi;
00326 t_dXdPhi[1] = - rcosPhi;
00327 t_dXdPhi[2] = - rho * tanLambda;
00328
00329
00330 double t_d2Xd2Phi[2];
00331 t_d2Xd2Phi[0] = rcosPhi;
00332 t_d2Xd2Phi[1] = rsinPhi;
00333
00334
00335 double n[3];
00336 n[0] = t_x[0] - wb[0];
00337 n[1] = t_x[1] - wb[1];
00338 n[2] = t_x[2] - wb[2];
00339
00340 double a[3];
00341 a[0] = n[0] - l * v[0];
00342 a[1] = n[1] - l * v[1];
00343 a[2] = n[2] - l * v[2];
00344 double dfdphi = a[0] * t_dXdPhi[0]
00345 + a[1] * t_dXdPhi[1]
00346 + a[2] * t_dXdPhi[2];
00347
00348 if (nTrial == 0) {
00349
00350 firstdfdphi = dfdphi;
00351 }
00352
00353
00354 if (nTrial > 3) {
00355
00356 }
00357
00358 if (fabs(dfdphi) < convergence)
00359 break;
00360
00361 double dv = v[0] * t_dXdPhi[0]
00362 + v[1] * t_dXdPhi[1]
00363 + v[2] * t_dXdPhi[2];
00364 double t0 = t_dXdPhi[0] * t_dXdPhi[0]
00365 + t_dXdPhi[1] * t_dXdPhi[1]
00366 + t_dXdPhi[2] * t_dXdPhi[2];
00367 double d2fd2phi = t0 - dv * dv
00368 + a[0] * t_d2Xd2Phi[0]
00369 + a[1] * t_d2Xd2Phi[1];
00370
00371
00372 dPhi -= dfdphi / d2fd2phi;
00373 ++nTrial;
00374 }
00375
00376
00377 positionOnWire[0] = wb[0] + l * v[0];
00378 positionOnWire[1] = wb[1] + l * v[1];
00379 positionOnWire[2] = wb[2] + l * v[2];
00380
00381
00382
00383
00384
00385
00386
00387
00388 return (positionOnTrack - positionOnWire).mag();
00389
00390
00391 }