/home/bes3soft/bes3soft/Boss/7.0.2/dist/7.0.2/Analysis/VertexFit/VertexFit-00-02-78/src/VertexFit.cxx

Go to the documentation of this file.
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         //if (m_pointer) delete m_pointer;
00025 }
00026 
00027 VertexFit::VertexFit() {;} 
00028 
00029 void VertexFit::init() 
00030 {
00031         //derived from TrackPool
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 //  Add Beam Fit
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 //  Add Vertex
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         // iteration loop
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         /*REVISED
00247         if(m_chisq[n] >= m_chicut || m_chisq[n] < 0) return okfit;
00248         REVISED*/
00249         if (m_chisq[n] >= m_chicut) return okfit;
00250 
00251         // update vertex and its covariance
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         // iteration loop
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         // get new Vx
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         // calculate Kq and E
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         // update vertex position
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         // update Track parameter
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         // get chisquare value
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         // Track parameter can be expressed as:
00397         //
00398         // px = px0 + a*(y0 - yv)
00399         // py = py0 - a*(x0 - xv)
00400         // pz = pz0
00401         // e  = e
00402         // x  = xv
00403         // y  = yv
00404         // z  = zv
00405         //
00406         // thus p = A * a + B * vx
00407         // x = vx
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 //              double afield = VertexFitBField::instance()->getCBz(m_xInfit, pInfit(itk).sub(4, 6));
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                 //renew parameters of input track 
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         if(m_chisq.size() == 0) {
00497     for(unsigned int i = 0; i < m_vc.size(); i++)
00498       m_chisq.push_back(0.0);
00499   }
00500 
00501   VertexConstraints vc = m_vc[n];
00502   VertexParameter   vpar = m_vpar_origin[n];
00503 
00504   unsigned int NSIZE = vc.Ltrk().size();
00505   int ifail;
00506 
00507   // get VD, lambda
00508   for(unsigned int i = 0; i < NSIZE; i++) {
00509     int itk = vc.Ltrk()[i];
00510     HepVector dela0(7, 0);
00511     dela0 = wTrackOrigin(itk).w()-wTrackInfit(itk).w();
00512     HepSymMatrix vd(2, 0);
00513     vd = ((wTrackOrigin(itk).Ew()).similarity(vc.Dc()[i])).inverse(ifail);
00514     HepVector lambda(2, 0);
00515     lambda = vd*(vc.Dc()[i]*dela0+vc.dc()[i]);
00516     vc.setVD(i, vd);
00517     vc.setLambda(i, lambda);
00518   }
00519   // get new dela = dela0 - Va0 Dt lambda
00520   // get new Va
00521   // get chisq
00522   HepMatrix covax(7, 3, 0);
00523   m_chisq[n] = 0;
00524   for(unsigned int i = 0; i < NSIZE; i++) {
00525     HepVector DtL(7, 0);
00526     DtL = (vc.Dc()[i]).T() * vc.lambda()[i];
00527     int itk = vc.Ltrk()[i];
00528     HepVector dela(7, 0);
00529     HepVector dela0(7, 0);
00530     dela0 = wTrackOrigin(itk).w()-wTrackInfit(itk).w();
00531     WTrackParameter wtrk = wTrackOrigin(itk);
00532     dela = -wTrackOrigin(itk).Ew() * DtL; 
00533     wtrk.setW(wtrk.w()+dela);
00534     HepSymMatrix Va(7, 0);
00535     HepSymMatrix Va0(7, 0);
00536     Va0 = wTrackOrigin(itk).Ew();
00537     HepMatrix DcT(7, 2, 0);
00538     DcT = (vc.Dc()[i]).T();
00539     HepSymMatrix DVdD(7, 0);
00540     DVdD = (vc.VD()[i]).similarity(DcT);
00541     Va = Va0 - DVdD.similarity(Va0);
00542     wtrk.setEw(Va);
00543     setWTrackInfit(itk, wtrk);
00544     HepVector dc(2, 0);
00545     dc = vc.Dc()[i]*dela0 +vc.dc()[i];
00546     m_chisq[n] = m_chisq[n] + dot(vc.lambda()[i], dc);
00547   }
00548   m_vpar_infit[n] = vpar;
00549   m_vc[n] = vc;
00550 */
00551 //No needed
00552 }
00553 
00554 
00555 void VertexFit::swimBeam(int n)
00556 {
00557 /*
00558   // const double alpha = -0.00299792458;
00559   //
00560   //  Track parameter can be expressed as:
00561   // 
00562   //  px = px0 + a*(y0 - yv)
00563   //  py = py0 - a*(x0 - xv)
00564   //  pz = pz0
00565   //  e  = e
00566   //  x  = xv
00567   //  y  = yv
00568   //  z  = zv
00569   //
00570   //  thus p = A * a + B * vx
00571   //      x = vx
00572 
00573   
00574   VertexConstraints vc = m_vc[n];
00575   VertexParameter  vpar = m_vpar_infit[n];
00576   unsigned int NSIZE = vc.Ltrk().size();
00577 
00578   for(unsigned int i = 0; i < NSIZE; i++) {
00579     int itk = vc.Ltrk()[i];
00580     HepMatrix A(4, 7, 0);
00581     HepMatrix B(4, 3, 0);
00582     
00583     double afield = VertexFitBField::instance()->getCBz(vpar.Vx(), pInfit(itk).sub(4, 6));
00584     double a = afield * wTrackInfit(itk).charge();
00585     A[0][0] = 1.0;
00586     A[0][5] = a;
00587     A[1][1] = 1.0;
00588     A[1][4] = -a;
00589     A[2][2] = 1.0;
00590     A[3][3] = 1.0;
00591     B[0][1] = -a;
00592     B[1][0] = a;
00593     HepVector p(4, 0);
00594     p = A * wTrackInfit(itk).w() + B * vpar.Vx();
00595     HepVector x(3, 0);
00596     x = vpar.Vx();
00597     HepVector w(7, 0);
00598     HepSymMatrix Ew(7, 0);
00599     for(int j = 0; j < 4; j++)
00600       w[j] = p[j];
00601     for(int j = 0; j < 3; j++)
00602       w[j+4] = x[j];
00603 
00604     WTrackParameter wtrk;
00605     wtrk.setCharge(wTrackInfit(itk).charge());
00606     wtrk.setW(w);
00607     HepSymMatrix Vpv(4, 0);
00608     Vpv = (wTrackInfit(itk).Ew()).similarity(A);
00609     for(int j = 0; j < 4; j++) 
00610       for(int k= 0; k < 4; k++) 
00611         Ew[j][k] = Vpv[j][k];
00612     wtrk.setEw(Ew);
00613     setWTrackInfit(itk, wtrk);
00614   }
00615 */
00616 //No needed
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 //              double afield = VertexFitBField::instance()->getCBz(m_xInfit, pInfit(itk).sub(4, 6));
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         //convert w1(6x1) to w2(7x1)
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         //convert ew1(6x6) to ew2(7x7)
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 //                              double afield = VertexFitBField::instance()->getCBz(m_xInfit, wTrackOrigin(itk).X());
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                                 // dc
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                                 //setd(itk, dc);
00734                                 // Ec
00735                                 HepMatrix Ec(2, 3, 0);
00736                                 // m_Ec.push_back(Ec);
00737                                 // Dc
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                                 // setD(itk, Dc);
00752                                 // setDT(itk, Dc.T());
00753                                 // VD
00754                                 HepSymMatrix vd(2, 0);
00755                                 int ifail;
00756                                 vd = pcovOrigin(itk).similarity(Dc);
00757                                 vd.invert(ifail);
00758                                 // setVD(itk, vd);
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                                 //p  = HepLorentzVector(alpha[0], alpha[1], alpha[2], alpha[3]);
00774                                 //x  = HepPoint3D(alpha[4], alpha[5], alpha[6]);
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                                         // dc -->g
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                                         // Ec --> B
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                                         // Dc
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                                         // VD --> W
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                                         //G=A(p0-pe)+B(x0-xe)+d
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         //                              double afield = VertexFitBField::instance()->getCBz(m_xInfit,wTrackOrigin(itk).X());
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                                         // dc
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                                         // Ec
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                                         //Dc
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                                         // VD
00876                                         HepSymMatrix vd(2, 0);
00877                                         int ifail;
00878                                         vd = pcovOrigin(itk).similarity(Dc);
00879                                         vd.invert(ifail);
00880                                         setW(itk, vd);
00881                                         // G = A(p0-pe)+B(x0-xe)+d
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 //      assert(p.num_row() == 6);
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 //      assert(p.num_row() == 7);
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 

Generated on Tue Nov 29 22:57:40 2016 for BOSS_7.0.2 by  doxygen 1.4.7