00001 #include <cassert>
00002
00003 #include "VertexFit/VertexFit.h"
00004 #include "VertexFit/VertexConstraints.h"
00005 #include "VertexFit/BField.h"
00006 #include "VertexFit/HTrackParameter.h"
00007 #include "TStopwatch.h"
00008
00009 const int VertexFit::NTRKPAR = 6;
00010 const int VertexFit::NVTXPAR = 3;
00011 const int VertexFit::NCONSTR = 2;
00012
00013 VertexFit* VertexFit::m_pointer = 0;
00014
00015 VertexFit* VertexFit::instance()
00016 {
00017 if (m_pointer) return m_pointer;
00018 m_pointer = new VertexFit();
00019 return m_pointer;
00020 }
00021
00022 VertexFit::~VertexFit()
00023 {
00024
00025 }
00026
00027 VertexFit::VertexFit() {;}
00028
00029 void VertexFit::init()
00030 {
00031
00032 clearWTrackOrigin();
00033 clearWTrackInfit();
00034 clearWTrackList();
00035 clearGammaShape();
00036 clearGammaShapeList();
00037 clearMapkinematic();
00038 clearMappositionA();
00039 clearMappositionB();
00040 clearone();
00041 cleartwo();
00042
00043 m_vpar_origin.clear();
00044 m_vpar_infit.clear();
00045 m_vc.clear();
00046 m_chisq.clear();
00047 m_chi = 9999.;
00048 m_virtual_wtrk.clear();
00049 m_niter = 10;
00050 m_chiter = 1.0e-3;
00051 m_chicut = 1000;
00052
00053 m_TRA = HepMatrix(6, 7, 0);
00054 m_TRA[0][0] = 1.0;
00055 m_TRA[1][1] = 1.0;
00056 m_TRA[2][2] = 1.0;
00057 m_TRA[3][4] = 1.0;
00058 m_TRA[4][5] = 1.0;
00059 m_TRA[5][6] = 1.0;
00060 m_TRB = HepMatrix(7, 6, 0);
00061 m_TRB[0][0] = 1.0;
00062 m_TRB[1][1] = 1.0;
00063 m_TRB[2][2] = 1.0;
00064 m_TRB[4][3] = 1.0;
00065 m_TRB[5][4] = 1.0;
00066 m_TRB[6][5] = 1.0;
00067
00068 m_factor = 1.000;
00069 }
00070
00071
00072
00073
00074 void VertexFit::AddBeamFit(int number, VertexParameter vpar, int n)
00075 {
00076 std::vector<int> tlis = AddList(n);
00077 VertexConstraints vc;
00078 vc.FixedVertexConstraints(tlis);
00079 m_vc.push_back(vc);
00080 m_vpar_origin.push_back(vpar);
00081 m_vpar_infit.push_back(vpar);
00082 if ((unsigned int)number != m_vc.size() - 1)
00083 std::cout << "wrong kinematic constraints index" << std::endl;
00084 }
00085
00086
00087
00088
00089 void VertexFit::AddVertex(int number, VertexParameter vpar, std::vector<int> tlis)
00090 {
00091 VertexConstraints vc;
00092 vc.CommonVertexConstraints(tlis);
00093 m_vc.push_back(vc);
00094 HepVector vx(3, 0);
00095 for (unsigned int i = 0; i < tlis.size(); i++)
00096 vx += wTrackOrigin(tlis[i]).X();
00097 vx = vx/tlis.size();
00098 VertexParameter n_vpar = vpar;
00099 n_vpar.setVx(vx);
00100 m_vpar_origin.push_back(n_vpar);
00101 m_vpar_infit.push_back(n_vpar);
00102 WTrackParameter vwtrk;
00103 m_virtual_wtrk.push_back(vwtrk);
00104 if ((unsigned int)number != m_vc.size() - 1)
00105 std::cout << "wrong kinematic constraints index" << std::endl;
00106 }
00107
00108 void VertexFit::AddVertex(int number, VertexParameter vpar, int n1, int n2)
00109 {
00110 std::vector<int> tlis = AddList(n1, n2);
00111 AddVertex(number, vpar, tlis);
00112 }
00113
00114
00115 void VertexFit::AddVertex(int number, VertexParameter vpar, int n1, int n2, int n3)
00116 {
00117 std::vector<int> tlis = AddList(n1, n2, n3);
00118 AddVertex(number, vpar, tlis);
00119 }
00120
00121 void VertexFit::AddVertex(int number, VertexParameter vpar, int n1, int n2, int n3, int n4)
00122 {
00123 std::vector<int> tlis = AddList(n1, n2, n3, n4);
00124 AddVertex(number, vpar, tlis);
00125 }
00126
00127 void VertexFit::AddVertex(int number, VertexParameter vpar, int n1, int n2, int n3, int n4, int n5)
00128 {
00129 std::vector<int> tlis = AddList(n1, n2, n3, n4, n5);
00130 AddVertex(number, vpar, tlis);
00131 }
00132
00133 void VertexFit::AddVertex(int number, VertexParameter vpar, int n1, int n2, int n3, int n4, int n5, int n6)
00134 {
00135 std::vector<int> tlis = AddList(n1, n2, n3, n4, n5, n6);
00136 AddVertex(number, vpar, tlis);
00137 }
00138
00139 void VertexFit::AddVertex(int number, VertexParameter vpar, int n1, int n2, int n3, int n4, int n5, int n6, int n7)
00140 {
00141 std::vector<int> tlis = AddList(n1, n2, n3, n4, n5, n6, n7);
00142 AddVertex(number, vpar, tlis);
00143 }
00144
00145 void VertexFit::AddVertex(int number, VertexParameter vpar, int n1, int n2, int n3, int n4, int n5, int n6, int n7, int n8)
00146 {
00147 std::vector<int> tlis = AddList(n1, n2, n3, n4, n5, n6, n7, n8);
00148 AddVertex(number, vpar, tlis);
00149 }
00150
00151 void VertexFit::AddVertex(int number, VertexParameter vpar, int n1, int n2, int n3, int n4, int n5, int n6, int n7, int n8, int n9)
00152 {
00153 std::vector<int> tlis = AddList(n1, n2, n3, n4, n5, n6, n7, n8, n9);
00154 AddVertex(number, vpar, tlis);
00155 }
00156
00157 void VertexFit::AddVertex(int number, VertexParameter vpar, int n1, int n2, int n3, int n4, int n5, int n6, int n7, int n8, int n9, int n10)
00158 {
00159 std::vector<int> tlis = AddList(n1, n2, n3, n4, n5, n6, n7, n8, n9, n10);
00160 AddVertex(number, vpar, tlis);
00161 }
00162
00163 void VertexFit::AddVertex(int number, VertexParameter vpar, int n1, int n2, int n3, int n4, int n5, int n6, int n7, int n8, int n9, int n10, int n11)
00164 {
00165 std::vector<int> tlis = AddList(n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11);
00166 AddVertex(number, vpar, tlis);
00167 }
00168
00169 void VertexFit::AddVertex(int number, VertexParameter vpar, int n1, int n2, int n3, int n4, int n5, int n6, int n7, int n8, int n9, int n10, int n11, int n12)
00170 {
00171 std::vector<int> tlis = AddList(n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11, n12);
00172 AddVertex(number, vpar, tlis);
00173 }
00174
00175 bool VertexFit::Fit(int n)
00176 {
00177 bool okfit = false;
00178 TStopwatch timer;
00179 m_cpu = HepVector(10, 0);
00180 if (n < 0 || (unsigned int)n >= m_vc.size()) return okfit;
00181
00182 timer.Start();
00183 int ifail;
00184 m_nvtrk = numberWTrack();
00185
00186 m_pOrigin = HepVector(m_nvtrk * NTRKPAR, 0);
00187 m_pInfit = HepVector(m_nvtrk * NTRKPAR, 0);
00188 m_pcovOrigin = HepSymMatrix(m_nvtrk * NTRKPAR, 0);
00189 m_pcovInfit = HepSymMatrix(m_nvtrk * NTRKPAR, 0);
00190
00191 int ntrk = numberWTrack();
00192 for(unsigned int itk = 0; itk < ntrk; itk++)
00193 {
00194 setWTrackInfit(itk, wTrackOrigin(itk));
00195 setPOrigin(itk, Convert76(wTrackOrigin(itk).w()));
00196 setPCovOrigin(itk, wTrackOrigin(itk).Ew().similarity(m_TRA));
00197 }
00198 m_pInfit = m_pOrigin;
00199
00200 m_xOrigin = HepVector(NVTXPAR, 0);
00201 m_xInfit = HepVector(NVTXPAR, 0);
00202 m_xcovOrigin = HepSymMatrix(NVTXPAR, 0);
00203 m_xcovInfit = HepSymMatrix(NVTXPAR, 0);
00204 m_xcovOriginInversed = HepSymMatrix(NVTXPAR, 0);
00205 m_xcovInfitInversed = HepSymMatrix(NVTXPAR, 0);
00206
00207 m_xOrigin = m_vpar_origin[n].Vx();
00208 m_xcovOrigin = m_vpar_origin[n].Evx();
00209 m_xcovOriginInversed = m_xcovOrigin.inverse(ifail);
00210 m_xInfit = m_xOrigin;
00211
00212 m_vpar_infit[n] = m_vpar_origin[n];
00213
00214 m_B = HepMatrix(NCONSTR*m_nvtrk, NVTXPAR, 0);
00215 m_A = HepMatrix(NCONSTR*m_nvtrk, NTRKPAR*m_nvtrk, 0);
00216 m_BT = HepMatrix(NVTXPAR,NCONSTR*m_nvtrk, 0);
00217 m_AT = HepMatrix(NTRKPAR*m_nvtrk, NCONSTR*m_nvtrk, 0);
00218 m_G = HepVector(NCONSTR*m_nvtrk, 0);
00219 m_W = HepSymMatrix(NCONSTR*m_nvtrk, 0);
00220 m_E = HepMatrix(NTRKPAR*m_nvtrk, NVTXPAR, 0);
00221
00222 timer.Stop();
00223 m_cpu[0] += timer.CpuTime();
00224
00225
00226 std::vector<double> chisq;
00227 chisq.clear();
00228 for (int it = 0; it < m_niter; it++)
00229 {
00230 timer.Start();
00231 UpdateConstraints(m_vc[n]);
00232 timer.Stop();
00233 m_cpu[1] += timer.CpuTime();
00234 timer.Start();
00235 fitVertex(n);
00236 timer.Stop();
00237 m_cpu[2] += timer.CpuTime();
00238 chisq.push_back(m_chisq[n]);
00239 if (it > 0)
00240 {
00241 double delchi = chisq[it] - chisq[it-1];
00242 if (fabs(delchi) < m_chiter) break;
00243 }
00244 }
00245
00246
00247
00248
00249 if (m_chisq[n] >= m_chicut) return okfit;
00250
00251
00252 m_vpar_infit[n].setVx(m_xInfit);
00253 m_vpar_infit[n].setEvx(m_xcovInfit);
00254
00255 okfit = true;
00256 return okfit;
00257 }
00258
00259 bool VertexFit::BeamFit(int n)
00260 {
00261 bool okfit = false;
00262 if (n < 0 || (unsigned int)n >= m_vc.size())
00263 return okfit;
00264 for (unsigned int i = 0; i < (m_vc[n].Ltrk()).size(); i++)
00265 {
00266 int itk = (m_vc[n].Ltrk())[i];
00267 setWTrackInfit(itk, wTrackOrigin(itk));
00268 }
00269 m_vpar_infit[n] = m_vpar_origin[n];
00270
00271
00272 std::vector<double> chisq;
00273 chisq.clear();
00274 for (int it = 0; it < m_niter; it++)
00275 {
00276 std::vector<WTrackParameter> wlis;
00277 wlis.clear();
00278 for (unsigned int i = 0; i < (m_vc[n].Ltrk()).size(); i++)
00279 {
00280 int itk = (m_vc[n].Ltrk())[i];
00281 wlis.push_back(wTrackInfit(itk));
00282 }
00283 VertexParameter vpar = m_vpar_infit[n];
00284 m_vc[n].UpdateConstraints(vpar, wlis);
00285
00286 fitBeam(n);
00287 chisq.push_back(m_chisq[n]);
00288 if (it > 0)
00289 {
00290 double delchi = chisq[it] - chisq[it-1];
00291 if(fabs(delchi) < m_chiter)
00292 break;
00293 }
00294 }
00295 if(m_chisq[n]>=m_chicut) return okfit;
00296 swimBeam(n);
00297 okfit = true;
00298 return okfit;
00299 }
00300
00301 bool VertexFit::Fit()
00302 {
00303 bool okfit = false;
00304 double mychi = 0;
00305 for (unsigned int n = 0; n<(int)(m_vc.size()); n++)
00306 {
00307 Fit(n);
00308 if (m_chisq[n] >= m_chicut) return okfit;
00309 swimVertex(n);
00310 mychi = mychi + m_chisq[n];
00311 }
00312 m_chi = mychi;
00313 okfit = true;
00314 return okfit;
00315 }
00316
00317 void VertexFit::fitVertex(int n)
00318 {
00319 if (m_chisq.size() == 0)
00320 {
00321 for (unsigned int i = 0; i < m_vc.size(); i++)
00322 m_chisq.push_back(9999.0);
00323 }
00324 TStopwatch timer;
00325 VertexConstraints vc = m_vc[n];
00326
00327 int ifail;
00328 int NSIZE = (vc.Ltrk()).size();
00329
00330
00331 timer.Start();
00332 m_xcovInfitInversed = m_xcovOriginInversed;
00333
00334 for (unsigned int i = 0; i < NSIZE; i++)
00335 {
00336 int itk = (vc.Ltrk())[i];
00337 m_xcovInfitInversed += vfW(itk).similarity(vfBT(itk));
00338 }
00339 m_xcovInfit = m_xcovInfitInversed.inverse(ifail);
00340
00341
00342 m_KQ = HepMatrix(NVTXPAR, m_nvtrk * NCONSTR, 0);
00343 m_E = HepMatrix(m_nvtrk*NTRKPAR, NVTXPAR, 0);
00344 for (unsigned int i = 0; i < NSIZE; i++)
00345 {
00346 int itk = (vc.Ltrk())[i];
00347 setKQ(itk, (m_xcovInfit * vfBT(itk) * vfW(itk)));
00348 setE(itk, (-pcovOrigin(itk) * vfAT(itk) * vfKQ(itk).T()));
00349 }
00350
00351 m_xInfit = m_xOrigin;
00352 for (unsigned int i = 0; i < NSIZE; i++)
00353 {
00354 int itk = (vc.Ltrk())[i];
00355 m_xInfit -= vfKQ(itk) * vfG(itk);
00356 }
00357
00358 HepVector dq0q(NVTXPAR, 0);
00359 dq0q = m_xcovInfitInversed * (m_xOrigin - m_xInfit);
00360 for (unsigned int i = 0; i < NSIZE; i++)
00361 {
00362 int itk = (vc.Ltrk())[i];
00363 HepVector alpha(NTRKPAR, 0);
00364 alpha = pOrigin(itk) - pcovOrigin(itk) * vfAT(itk) * (vfW(itk)*vfG(itk) - vfKQ(itk).T()*dq0q);
00365 setPInfit(itk, alpha);
00366 }
00367
00368 m_chisq[n] = (m_W.similarity(m_G.T())- m_xcovInfitInversed.similarity((m_xInfit-m_xOrigin).T()))[0][0];
00369 }
00370
00371 void VertexFit::vertexCovMatrix(int n)
00372 {
00373 TStopwatch timer;
00374 timer.Start();
00375
00376 VertexConstraints vc = m_vc[n];
00377
00378 unsigned int NSIZE = vc.Ltrk().size();
00379 int ifail;
00380 m_pcovInfit = HepSymMatrix(NTRKPAR*m_nvtrk, 0);
00381 for (unsigned int i = 0; i < NSIZE; i++)
00382 {
00383 int itk = vc.Ltrk()[i];
00384 setPCovInfit(itk, pcovOrigin(itk) - vfW(itk).similarity(pcovOrigin(itk) * vfAT(itk)));
00385 }
00386 m_pcovInfit = m_pcovInfit + m_xcovInfitInversed.similarity(m_E);
00387
00388 timer.Stop();
00389 m_cpu[3] += timer.CpuTime();
00390 }
00391
00392 void VertexFit::swimVertex(int n)
00393 {
00394 TStopwatch timer;
00395 timer.Start();
00396
00397
00398
00399
00400
00401
00402
00403
00404
00405
00406
00407
00408 VertexConstraints vc = m_vc[n];
00409 unsigned int NSIZE = vc.Ltrk().size();
00410
00411 HepMatrix A(6, 6, 0);
00412 A[0][0] = 1.0;
00413 A[1][1] = 1.0;
00414 A[2][2] = 1.0;
00415 HepMatrix B(6, 3, 0);
00416 B[3][0] = 1.0;
00417 B[4][1] = 1.0;
00418 B[5][2] = 1.0;
00419 HepVector w1(6, 0);
00420 HepVector w2(7, 0);
00421 HepSymMatrix Ew(7, 0);
00422 HepMatrix ew1(6, 6, 0);
00423 HepMatrix ew2(7, 7, 0);
00424
00425 for (unsigned int i = 0; i < NSIZE; i++)
00426 {
00427 int itk = vc.Ltrk()[i];
00428
00429 double afield = m_factor * VertexFitBField::instance()->getCBz(m_xInfit, pInfit(itk).sub(4, 6));
00430 double a = afield * wTrackInfit(itk).charge();
00431
00432 A[0][4] = a;
00433 A[1][3] = -a;
00434 B[0][1] = -a;
00435 B[1][0] = a;
00436 w1 = A * pInfit(itk) + B * m_xInfit;
00437 ew1 = pcovInfit(itk).similarity(A) + m_xcovInfit.similarity(B) + A*vfE(itk)*B.T() + B*(vfE(itk).T())*A.T();
00438
00439 WTrackParameter wtrk = wTrackOrigin(itk);
00440 w2 = Convert67(wtrk.mass(), w1);
00441 wtrk.setW(w2);
00442
00443 m_TRB[3][0] = w2[0] / w2[3];
00444 m_TRB[3][1] = w2[1] / w2[3];
00445 m_TRB[3][2] = w2[2] / w2[3];
00446
00447 ew2 = m_TRB * ew1 * m_TRB.T();
00448 Ew.assign(ew2);
00449 wtrk.setEw(Ew);
00450
00451 setWTrackInfit(itk, wtrk);
00452 }
00453 timer.Stop();
00454 m_cpu[4] += timer.CpuTime();
00455 }
00456
00457 bool VertexFit::pull(int n, int itk, HepVector& p)
00458 {
00459 assert(p.num_row() == 5);
00460 vertexCovMatrix(n);
00461
00462 WTrackParameter wtrk0, wtrk1;
00463 HepVector w1(6, 0);
00464 HepVector w2(7, 0);
00465 HepSymMatrix ew1(6, 0);
00466 HepSymMatrix ew2(7, 0);
00467 wtrk0 = wTrackOrigin(itk);
00468 w1 = pInfit(itk);
00469 ew1 = pcovInfit(itk);
00470 w2 = Convert67(wtrk0.mass(), w1);
00471 m_TRB[3][0] = w2[0] / w2[3];
00472 m_TRB[3][1] = w2[1] / w2[3];
00473 m_TRB[3][2] = w2[2] / w2[3];
00474 ew2 = ew1.similarity(m_TRB);
00475 wtrk1.setW(w2);
00476 wtrk1.setEw(ew2);
00477 wtrk1.setCharge(wtrk0.charge());
00478
00479 HTrackParameter htrk0(wtrk0);
00480 HTrackParameter htrk1(wtrk1);
00481 for (int i = 0; i < 5; i++)
00482 {
00483 double del = htrk0.eHel()[i][i] - htrk1.eHel()[i][i];
00484 if (del == 0.0)
00485 {
00486 return false;
00487 }
00488 p[i] = (htrk0.helix()[i] - htrk1.helix()[i]) / sqrt(abs(del));
00489 }
00490 return true;
00491 }
00492
00493 void VertexFit::fitBeam(int n)
00494 {
00495
00496
00497
00498
00499
00500
00501
00502
00503
00504
00505
00506
00507
00508
00509
00510
00511
00512
00513
00514
00515
00516
00517
00518
00519
00520
00521
00522
00523
00524
00525
00526
00527
00528
00529
00530
00531
00532
00533
00534
00535
00536
00537
00538
00539
00540
00541
00542
00543
00544
00545
00546
00547
00548
00549
00550
00551
00552 }
00553
00554
00555 void VertexFit::swimBeam(int n)
00556 {
00557
00558
00559
00560
00561
00562
00563
00564
00565
00566
00567
00568
00569
00570
00571
00572
00573
00574
00575
00576
00577
00578
00579
00580
00581
00582
00583
00584
00585
00586
00587
00588
00589
00590
00591
00592
00593
00594
00595
00596
00597
00598
00599
00600
00601
00602
00603
00604
00605
00606
00607
00608
00609
00610
00611
00612
00613
00614
00615
00616
00617 }
00618
00619 void VertexFit::BuildVirtualParticle(int n)
00620 {
00621
00622 vertexCovMatrix(n);
00623 TStopwatch timer;
00624 timer.Start();
00625
00626 HepMatrix A(NTRKPAR, NTRKPAR * m_nvtrk, 0);
00627 HepMatrix B(NTRKPAR, NVTXPAR, 0);
00628 VertexConstraints vc = m_vc[n];
00629 unsigned int NSIZE = vc.Ltrk().size();
00630 int charge = 0;
00631
00632 HepMatrix Ai(6, 6, 0);
00633 Ai[0][0] = 1.0;
00634 Ai[1][1] = 1.0;
00635 Ai[2][2] = 1.0;
00636 HepMatrix Bi(6, 3, 0);
00637 Bi[3][0] = 1.0;
00638 Bi[4][1] = 1.0;
00639 Bi[5][2] = 1.0;
00640 HepVector w1(6, 0);
00641 HepVector w2(7, 0);
00642 HepSymMatrix Ew(7, 0);
00643 HepMatrix ew1(6, 6, 0);
00644 HepMatrix ew2(7, 7, 0);
00645 double totalE = 0;
00646
00647 for(unsigned int i = 0; i < NSIZE; i++)
00648 {
00649 int itk = vc.Ltrk()[i];
00650 charge += wTrackInfit(itk).charge();
00651
00652 double afield = m_factor * VertexFitBField::instance()->getCBz(m_xInfit, pInfit(itk).sub(4, 6));
00653 double a = afield * wTrackInfit(itk).charge();
00654
00655 totalE += wTrackOrigin(itk).w()[3];
00656 Ai[0][4] = a;
00657 Ai[1][3] = -a;
00658 Bi[0][1] = -a;
00659 Bi[1][0] = a;
00660 A.sub(1, NTRKPAR*itk + 1, Ai);
00661 B += Bi;
00662 }
00663 B[3][0] = 1.0;
00664 B[4][1] = 1.0;
00665 B[5][2] = 1.0;
00666
00667 w1 = A * m_pInfit + B * m_xInfit;
00668 ew1 = m_pcovInfit.similarity(A) + m_xcovInfit.similarity(B) + A*m_E*B.T()+B*(m_E.T())*A.T();
00669
00670
00671 w2[0] = w1[0];
00672 w2[1] = w1[1];
00673 w2[2] = w1[2];
00674 w2[3] = totalE;
00675 w2[4] = w1[3];
00676 w2[5] = w1[4];
00677 w2[6] = w1[5];
00678
00679 m_TRB[3][0] = w1[0] / totalE;
00680 m_TRB[3][1] = w1[1] / totalE;
00681 m_TRB[3][2] = w1[2] / totalE;
00682 ew2 = m_TRB * ew1 * m_TRB.T();
00683 Ew.assign(ew2);
00684 WTrackParameter vwtrk;
00685 vwtrk.setCharge(charge);
00686 vwtrk.setW(w2);
00687 vwtrk.setEw(Ew);
00688
00689 m_virtual_wtrk[n] = vwtrk;
00690 timer.Stop();
00691 m_cpu[5] += timer.CpuTime();
00692 }
00693
00694 void VertexFit::UpdateConstraints(const VertexConstraints &vc)
00695 {
00696 int ntrk = (vc.Ltrk()).size();
00697 int type = vc.type();
00698 switch(type)
00699 {
00700 case 1:
00701 {
00702 for (unsigned int i = 0; i < ntrk; i++)
00703 {
00704 int itk = (vc.Ltrk())[i];
00705 HepVector alpha(6, 0);
00706 double mass, e;
00707 HepLorentzVector p;
00708 HepPoint3D x, vx;
00709 alpha = pInfit(itk);
00710
00711 mass = wTrackOrigin(itk).mass();
00712 e = sqrt(mass*mass + alpha[0]*alpha[0] + alpha[1]*alpha[1] + alpha[2]*alpha[2]);
00713 p = HepLorentzVector(alpha[0], alpha[1], alpha[2], e);
00714 x = HepPoint3D(alpha[3], alpha[4], alpha[5]);
00715
00716 vx = HepPoint3D(m_xInfit[0], m_xInfit[1], m_xInfit[2]);
00717 HepPoint3D delx = vx - x;
00718
00719
00720 double afield = m_factor * VertexFitBField::instance()->getCBz(m_xInfit, wTrackOrigin(itk).X());
00721 double a = afield * (0.0+wTrackOrigin(itk).charge());
00722
00723 double J = a * (delx.x()*p.px() + delx.y()*p.py()) / p.perp2();
00724 J = std::min(J, 1-1e-4);
00725 J = std::max(J, -1+1e-4);
00726 double Rx = delx.x() - 2 * p.px() * (delx.x()*p.px() + delx.y()*p.py()) / p.perp2();
00727 double Ry = delx.y() - 2 * p.py() * (delx.x()*p.px() + delx.y()*p.py()) / p.perp2();
00728 double S = 1.0 / sqrt(1-J*J) / p.perp2();
00729
00730 HepVector dc(2, 0);
00731 dc[0] = delx.y()*p.px() - delx.x()*p.py() - 0.5*a*(delx.x()*delx.x() + delx.y()*delx.y());
00732 dc[1] = delx.z() - p.pz()/a*asin(J);
00733
00734
00735 HepMatrix Ec(2, 3, 0);
00736
00737
00738 HepMatrix Dc(2, 6, 0);
00739 Dc[0][0] = delx.y();
00740 Dc[0][1] = -delx.x();
00741 Dc[0][2] = 0;
00742 Dc[0][3] = p.py() + a * delx.x();
00743 Dc[0][4] = -p.px() + a * delx.y();
00744 Dc[0][5] = 0;
00745 Dc[1][0] = -p.pz() * S * Rx;
00746 Dc[1][1] = -p.pz() * S * Ry;
00747 Dc[1][2] = - asin(J) / a;
00748 Dc[1][3] = p.px() * p.pz() * S;
00749 Dc[1][4] = p.py() * p.pz() * S;
00750 Dc[1][5] = -1.0;
00751
00752
00753
00754 HepSymMatrix vd(2, 0);
00755 int ifail;
00756 vd = pcovOrigin(itk).similarity(Dc);
00757 vd.invert(ifail);
00758
00759 }
00760 break;
00761 }
00762 case 2:
00763 default:
00764 {
00765 for (unsigned int i = 0; i < ntrk; i++)
00766 {
00767 int itk = (vc.Ltrk())[i];
00768 HepVector alpha(6, 0);
00769 double mass, e;
00770 HepLorentzVector p;
00771 HepPoint3D x, vx;
00772 alpha = pInfit(itk);
00773
00774
00775
00776 mass = wTrackOrigin(itk).mass();
00777 e = sqrt(mass*mass + alpha[0]*alpha[0] + alpha[1]*alpha[1] + alpha[2]*alpha[2]);
00778 p = HepLorentzVector(alpha[0], alpha[1], alpha[2], e);
00779 x = HepPoint3D(alpha[3], alpha[4], alpha[5]);
00780
00781 vx = HepPoint3D(m_xInfit[0], m_xInfit[1], m_xInfit[2]);
00782 HepPoint3D delx = vx - x;
00783
00784 if (wTrackOrigin(itk).charge() == 0)
00785 {
00786
00787 HepVector dc(2, 0);
00788 dc[0] = p.pz()*delx.x() - p.px()*delx.z();
00789 dc[1] = p.pz()*delx.y() - p.py()*delx.z();
00790
00791 HepMatrix Ec(2, 3, 0);
00792 Ec[0][0] = p.pz();
00793 Ec[0][1] = 0;
00794 Ec[0][2] = -p.px();
00795 Ec[1][0] = 0;
00796 Ec[1][1] = p.pz();
00797 Ec[1][2] = -p.py();
00798 setB(itk, Ec);
00799 setBT(itk, Ec.T());
00800
00801 HepMatrix Dc(2, 6, 0);
00802 Dc[0][0] = -delx.z();
00803 Dc[0][1] = 0;
00804 Dc[0][2] = delx.x();
00805 Dc[0][3] = -p.pz();
00806 Dc[0][4] = 0;
00807 Dc[0][5] = p.px();
00808 Dc[1][0] = 0;
00809 Dc[1][1] = -delx.z();
00810 Dc[1][2] = delx.y();
00811 Dc[1][3] = 0;
00812 Dc[1][4] = -p.pz();
00813 Dc[1][5] = p.py();
00814 setA(itk, Dc);
00815 setAT(itk, Dc.T());
00816
00817
00818 HepSymMatrix vd(2, 0);
00819 int ifail;
00820
00821 vd = pcovOrigin(itk).similarity(Dc);
00822 vd.invert(ifail);
00823 setW(itk,vd);
00824
00825
00826 HepVector gc(2,0);
00827 gc = Dc*(pOrigin(itk)-pInfit(itk)) + Ec*(m_xOrigin-m_xInfit) + dc;
00828 setG(itk,gc);
00829
00830 }
00831 else
00832 {
00833
00834 double afield = m_factor * VertexFitBField::instance()->getCBz(m_xInfit,wTrackOrigin(itk).X());
00835 double a = afield * (0.0+wTrackOrigin(itk).charge());
00836 double J = a * (delx.x()*p.px() + delx.y()*p.py())/p.perp2();
00837 J = std::min(J, 1-1e-4);
00838 J = std::max(J, -1+1e-4);
00839 double Rx = delx.x() - 2*p.px()*(delx.x()*p.px() + delx.y()*p.py())/p.perp2();
00840 double Ry = delx.y() - 2*p.py()*(delx.x()*p.px() + delx.y()*p.py())/p.perp2();
00841 double S = 1.0 / sqrt(1-J*J) / p.perp2();
00842
00843
00844 HepVector dc(2, 0);
00845 dc[0] = delx.y() * p.px() - delx.x() * p.py() - 0.5 * a * (delx.x() * delx.x() + delx.y() * delx.y());
00846 dc[1] = delx.z() - p.pz() / a*asin(J);
00847
00848 HepMatrix Ec(2, 3, 0);
00849 Ec[0][0] = -p.py()- a * delx.x();
00850 Ec[0][1] = p.px() - a * delx.y();
00851 Ec[0][2] = 0;
00852 Ec[1][0] = -p.px() * p.pz() * S ;
00853 Ec[1][1] = -p.py() * p.pz() * S ;
00854 Ec[1][2] = 1.0;
00855 setB(itk, Ec);
00856 setBT(itk, Ec.T());
00857
00858
00859 HepMatrix Dc(2,6,0);
00860 Dc[0][0] = delx.y();
00861 Dc[0][1] = -delx.x();
00862 Dc[0][2] = 0;
00863 Dc[0][3] = p.py() + a*delx.x();
00864 Dc[0][4] = -p.px() + a*delx.y();
00865 Dc[0][5] = 0;
00866
00867 Dc[1][0] = -p.pz()*S*Rx;
00868 Dc[1][1] = -p.pz()*S*Ry;
00869 Dc[1][2] = -asin(J)/a;
00870 Dc[1][3] = p.px()*p.pz()*S;
00871 Dc[1][4] = p.py()*p.pz()*S;
00872 Dc[1][5] = -1.0;
00873 setA(itk,Dc);
00874 setAT(itk,Dc.T());
00875
00876 HepSymMatrix vd(2, 0);
00877 int ifail;
00878 vd = pcovOrigin(itk).similarity(Dc);
00879 vd.invert(ifail);
00880 setW(itk, vd);
00881
00882 HepVector gc(2, 0);
00883 gc = Dc * (pOrigin(itk) - pInfit(itk)) + Ec *(m_xOrigin - m_xInfit) + dc;
00884 setG(itk, gc);
00885 }
00886 }
00887 break;
00888 }
00889 }
00890 }
00891
00892 HepVector VertexFit::Convert67(const double &mass, const HepVector &p)
00893 {
00894
00895 HepVector m(7, 0);
00896 m.sub(1, p.sub(1, 3));
00897 m.sub(5, p.sub(4, 6));
00898 m[3] = sqrt(mass*mass + p[0]*p[0] + p[1]*p[1] + p[2]*p[2]);
00899 return m;
00900 }
00901
00902 HepVector VertexFit::Convert76(const HepVector &p)
00903 {
00904
00905 HepVector m(6, 0);
00906 m.sub(1, p.sub(1, 3));
00907 m.sub(4, p.sub(5, 7));
00908 return m;
00909 }
00910