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

Go to the documentation of this file.
00001 #include "VertexFit/KinematicFit.h"
00002 #include "VertexFit/KinematicConstraints.h"
00003 #include "VertexFit/HTrackParameter.h"
00004 #include "TStopwatch.h"
00005 
00006 
00007 const int KinematicFit::NTRKPAR = 3;        //modify by yanl 2010.7.26  4---->3
00008 
00009 const int KinematicFit::Resonance = 1;
00010 const int KinematicFit::TotalEnergy = 2;
00011 const int KinematicFit::TotalMomentum = 4;
00012 const int KinematicFit::Position = 8;
00013 const int KinematicFit::ThreeMomentum = 16;
00014 const int KinematicFit::FourMomentum = 32;
00015 const int KinematicFit::EqualMass = 64;
00016 
00017 
00018 KinematicFit * KinematicFit::m_pointer = 0;
00019 
00020 KinematicFit * KinematicFit::instance() {
00021     if(m_pointer) return m_pointer;
00022     m_pointer = new KinematicFit();
00023     return m_pointer;
00024 }
00025 
00026 KinematicFit::KinematicFit(){;}
00027 
00028 KinematicFit::~KinematicFit() {
00029     //  if(m_pointer) delete m_pointer;
00030 }
00031 
00032 
00033 void KinematicFit::init() {
00034     clearWTrackOrigin();
00035     clearWTrackInfit();
00036     clearWTrackList();
00037     //For Virtual Particles
00038     //gamma shape
00039     clearGammaShape();
00040     clearGammaShapeList();  
00041     clearMapkinematic();
00042     clearMappositionA();
00043     clearMappositionB();
00044     clearone();
00045     cleartwo();
00046     setBeamPosition(HepPoint3D(0.0,0.0,0.0));
00047     setVBeamPosition(HepSymMatrix(3,0));
00048 
00049     //=============  
00050     m_kc.clear();
00051     m_chisq.clear();
00052     m_chi = 9999.;
00053     m_niter = 10;
00054     m_chicut = 200.;
00055     m_chiter = 0.005;
00056     m_espread = 0.0;
00057     m_kalman = 0;
00058     m_collideangle = 11e-3;
00059     m_flag = 0;
00060     m_dynamicerror = 0; 
00061     m_nc = 0;
00062     m_cpu = HepVector(10, 0);
00063     m_massvector = HepVector(12,0);
00064     m_virtual_wtrk.clear(); 
00065 }
00066 
00067 
00068 //
00069 //  Add Resonance
00070 //
00071 
00072 void KinematicFit::AddResonance(int number, double mres, int n1) {
00073     std::vector<int> tlis = AddList(n1);
00074     AddResonance(number, mres, tlis);
00075 }
00076 
00077 void KinematicFit::AddResonance(int number, double mres, int n1, int n2) {
00078     std::vector<int> tlis = AddList(n1, n2);
00079     AddResonance(number, mres, tlis);
00080 }
00081 
00082 void KinematicFit::AddResonance(int number, double mres, int n1, int n2, int n3) {
00083     std::vector<int> tlis = AddList(n1, n2, n3);
00084     AddResonance(number, mres, tlis);
00085 }
00086 
00087 void KinematicFit::AddResonance(int number, double mres, int n1, int n2, int n3, int n4) {
00088     std::vector<int> tlis = AddList(n1, n2, n3, n4);
00089     AddResonance(number, mres, tlis);
00090 }
00091 
00092 void KinematicFit::AddResonance(int number, double mres, int n1, int n2, int n3, int n4,
00093         int n5) {
00094     std::vector<int> tlis = AddList(n1, n2, n3, n4, n5);
00095     AddResonance(number, mres, tlis);
00096 }
00097 
00098 void KinematicFit::AddResonance(int number, double mres, int n1, int n2, int n3, int n4,
00099         int n5, int n6) {
00100     std::vector<int> tlis = AddList(n1, n2, n3, n4, n5, n6);
00101     AddResonance(number, mres, tlis);
00102 }
00103 
00104 void KinematicFit::AddResonance(int number, double mres, int n1, int n2, int n3, int n4,
00105         int n5, int n6, int n7) {
00106     std::vector<int> tlis = AddList(n1, n2, n3, n4, n5, n6, n7);
00107     AddResonance(number, mres, tlis);
00108 }
00109 
00110 void KinematicFit::AddResonance(int number, double mres, int n1, int n2, int n3, int n4,
00111         int n5, int n6, int n7, int n8) {
00112     std::vector<int> tlis = AddList(n1, n2, n3, n4, n5, n6, n7, n8);
00113     AddResonance(number, mres, tlis);
00114 }
00115 
00116 void KinematicFit::AddResonance(int number, double mres, int n1, int n2, int n3, int n4,
00117         int n5, int n6, int n7, int n8, int n9) {
00118     std::vector<int> tlis = AddList(n1, n2, n3, n4, n5, n6, n7, n8, n9);
00119     AddResonance(number, mres, tlis);
00120 }
00121 
00122 void KinematicFit::AddResonance(int number, double mres, int n1, int n2, int n3, int n4,
00123         int n5, int n6, int n7, int n8, int n9, int n10) {
00124     std::vector<int> tlis = AddList(n1, n2, n3, n4, n5, n6, n7, n8, n9, n10);
00125     AddResonance(number, mres, tlis);
00126 }
00127 
00128 
00129 void KinematicFit::AddResonance(int number, double mres, int n1, int n2, int n3, int n4,
00130         int n5, int n6, int n7, int n8, int n9,
00131         int n10, int n11) {
00132     std::vector<int> tlis = AddList(n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11);
00133     AddResonance(number, mres, tlis);
00134 }
00135 
00136 void KinematicFit::AddResonance(int number, double mres, int n1, int n2, int n3, int n4,
00137         int n5, int n6, int n7, int n8, int n9,
00138         int n10, int n11, int n12) {
00139     std::vector<int> tlis = AddList(n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11, n12);
00140     AddResonance(number, mres, tlis);
00141 }
00142 
00143 void KinematicFit::AddResonance(int number, double mres, std::vector<int> tlis) {
00144     KinematicConstraints kc;
00145     HepSymMatrix Vre = HepSymMatrix(1,0);
00146     kc.ResonanceConstraints(mres, tlis, Vre);
00147     m_kc.push_back(kc);
00148     if((unsigned int) number != m_kc.size()-1) 
00149         std::cout << "wrong kinematic constraints index" << std::endl;
00150 }
00151 
00152 
00153 //
00154 //  Add TotalMomentum
00155 //
00156 
00157 void KinematicFit::AddTotalMomentum(int number, double ptot, int n1) {
00158     std::vector<int> tlis = AddList(n1);
00159     AddTotalMomentum(number, ptot, tlis);
00160 }
00161 void KinematicFit::AddTotalMomentum(int number, double ptot, int n1, int n2) {
00162     std::vector<int> tlis = AddList(n1, n2);
00163     AddTotalMomentum(number, ptot, tlis);
00164 }
00165 
00166 void KinematicFit::AddTotalMomentum(int number, double ptot, int n1, int n2, int n3) {
00167     std::vector<int> tlis = AddList(n1, n2, n3);
00168     AddTotalMomentum(number, ptot, tlis);
00169 }
00170 
00171 void KinematicFit::AddTotalMomentum(int number, double ptot, int n1, int n2, int n3, int n4) {
00172     std::vector<int> tlis = AddList(n1, n2, n3, n4);
00173     AddTotalMomentum(number, ptot, tlis);
00174 }
00175 
00176 void KinematicFit::AddTotalMomentum(int number, double ptot, int n1, int n2, int n3, int n4,
00177         int n5) {
00178     std::vector<int> tlis = AddList(n1, n2, n3, n4, n5);
00179     AddTotalMomentum(number, ptot, tlis);
00180 }
00181 
00182 void KinematicFit::AddTotalMomentum(int number, double ptot, int n1, int n2, int n3, int n4,
00183         int n5, int n6) {
00184     std::vector<int> tlis = AddList(n1, n2, n3, n4, n5, n6);
00185     AddTotalMomentum(number, ptot, tlis);
00186 }
00187 
00188 void KinematicFit::AddTotalMomentum(int number, double ptot, int n1, int n2, int n3, int n4,
00189         int n5, int n6, int n7) {
00190     std::vector<int> tlis = AddList(n1, n2, n3, n4, n5, n6, n7);
00191     AddTotalMomentum(number, ptot, tlis);
00192 }
00193 
00194 void KinematicFit::AddTotalMomentum(int number, double ptot, int n1, int n2, int n3, int n4,
00195         int n5, int n6, int n7, int n8) {
00196     std::vector<int> tlis = AddList(n1, n2, n3, n4, n5, n6, n7, n8);
00197     AddTotalMomentum(number, ptot, tlis);
00198 }
00199 
00200 void KinematicFit::AddTotalMomentum(int number, double ptot, int n1, int n2, int n3, int n4,
00201         int n5, int n6, int n7, int n8, int n9) {
00202     std::vector<int> tlis = AddList(n1, n2, n3, n4, n5, n6, n7, n8, n9);
00203     AddTotalMomentum(number, ptot, tlis);
00204 }
00205 
00206 void KinematicFit::AddTotalMomentum(int number, double ptot, int n1, int n2, int n3, int n4,
00207         int n5, int n6, int n7, int n8, int n9,
00208         int n10) {
00209     std::vector<int> tlis = AddList(n1, n2, n3, n4, n5, n6, n7, n8, n9, n10);
00210     AddTotalMomentum(number, ptot, tlis);
00211 }
00212 
00213 
00214 void KinematicFit::AddTotalMomentum(int number, double ptot, int n1, int n2, int n3, int n4,
00215         int n5, int n6, int n7, int n8, int n9,
00216         int n10, int n11) {
00217     std::vector<int> tlis = AddList(n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11);
00218     AddTotalMomentum(number, ptot, tlis);
00219 }
00220 
00221 void KinematicFit::AddTotalMomentum(int number, double ptot, int n1, int n2, int n3, int n4,
00222         int n5, int n6, int n7, int n8, int n9,
00223         int n10, int n11, int n12) {
00224     std::vector<int> tlis = AddList(n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11, n12);
00225     AddTotalMomentum(number, ptot, tlis);
00226 }
00227 
00228 void KinematicFit::AddTotalMomentum(int number, double ptot, std::vector<int> tlis) {
00229     KinematicConstraints kc;
00230     kc.TotalMomentumConstraints(ptot, tlis);
00231     m_kc.push_back(kc);
00232     if((unsigned int) number != m_kc.size()-1) 
00233         std::cout << "wrong kinematic constraints index" << std::endl;
00234 }
00235 
00236 //
00237 //  Add TotalEnergy
00238 //
00239 
00240 void KinematicFit::AddTotalEnergy(int number, double etot, int n1) {
00241     std::vector<int> tlis = AddList(n1);
00242     AddTotalEnergy(number, etot, tlis);
00243 }
00244 void KinematicFit::AddTotalEnergy(int number, double etot, int n1, int n2) {
00245     std::vector<int> tlis = AddList(n1, n2);
00246     AddTotalEnergy(number, etot, tlis);
00247 }
00248 
00249 void KinematicFit::AddTotalEnergy(int number, double etot, int n1, int n2, int n3) {
00250     std::vector<int> tlis = AddList(n1, n2, n3);
00251     AddTotalEnergy(number, etot, tlis);
00252 }
00253 
00254 void KinematicFit::AddTotalEnergy(int number, double etot, int n1, int n2, int n3, int n4) {
00255     std::vector<int> tlis = AddList(n1, n2, n3, n4);
00256     AddTotalEnergy(number, etot, tlis);
00257 }
00258 
00259 void KinematicFit::AddTotalEnergy(int number, double etot, int n1, int n2, int n3, int n4,
00260         int n5) {
00261     std::vector<int> tlis = AddList(n1, n2, n3, n4, n5);
00262     AddTotalEnergy(number, etot, tlis);
00263 }
00264 
00265 void KinematicFit::AddTotalEnergy(int number, double etot, int n1, int n2, int n3, int n4,
00266         int n5, int n6) {
00267     std::vector<int> tlis = AddList(n1, n2, n3, n4, n5, n6);
00268     AddTotalEnergy(number, etot, tlis);
00269 }
00270 
00271 void KinematicFit::AddTotalEnergy(int number, double etot, int n1, int n2, int n3, int n4,
00272         int n5, int n6, int n7) {
00273     std::vector<int> tlis = AddList(n1, n2, n3, n4, n5, n6, n7);
00274     AddTotalEnergy(number, etot, tlis);
00275 }
00276 
00277 void KinematicFit::AddTotalEnergy(int number, double etot, int n1, int n2, int n3, int n4,
00278         int n5, int n6, int n7, int n8) {
00279     std::vector<int> tlis = AddList(n1, n2, n3, n4, n5, n6, n7, n8);
00280     AddTotalEnergy(number, etot, tlis);
00281 }
00282 
00283 void KinematicFit::AddTotalEnergy(int number, double etot, int n1, int n2, int n3, int n4,
00284         int n5, int n6, int n7, int n8, int n9) {
00285     std::vector<int> tlis = AddList(n1, n2, n3, n4, n5, n6, n7, n8, n9);
00286     AddTotalEnergy(number, etot, tlis);
00287 }
00288 
00289 void KinematicFit::AddTotalEnergy(int number, double etot, int n1, int n2, int n3, int n4,
00290         int n5, int n6, int n7, int n8, int n9,
00291         int n10) {
00292     std::vector<int> tlis = AddList(n1, n2, n3, n4, n5, n6, n7, n8, n9, n10);
00293     AddTotalEnergy(number, etot, tlis);
00294 }
00295 
00296 
00297 void KinematicFit::AddTotalEnergy(int number, double etot, int n1, int n2, int n3, int n4,
00298         int n5, int n6, int n7, int n8, int n9,
00299         int n10, int n11) {
00300     std::vector<int> tlis = AddList(n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11);
00301     AddTotalEnergy(number, etot, tlis);
00302 }
00303 
00304 void KinematicFit::AddTotalEnergy(int number, double etot, int n1, int n2, int n3, int n4,
00305         int n5, int n6, int n7, int n8, int n9,
00306         int n10, int n11, int n12) {
00307     std::vector<int> tlis = AddList(n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11, n12);
00308     AddTotalEnergy(number, etot, tlis);
00309 }
00310 
00311 void KinematicFit::AddTotalEnergy(int number, double etot, std::vector<int> tlis) {
00312     KinematicConstraints kc;
00313     kc.TotalEnergyConstraints(etot, tlis);
00314     m_kc.push_back(kc);
00315     if((unsigned int) number != m_kc.size()-1) 
00316         std::cout << "wrong kinematic constraints index" << std::endl;
00317 }
00318 //
00319 //  Equal Mass constraints
00320 //
00321 
00322 void KinematicFit::AddEqualMass(int number, std::vector<int> tlis1, std::vector<int> tlis2)  {
00323     KinematicConstraints kc;
00324     HepSymMatrix Vne = HepSymMatrix(1,0);
00325     kc.EqualMassConstraints(tlis1, tlis2, Vne);
00326     m_kc.push_back(kc);
00327     if((unsigned int) number != m_kc.size()-1) 
00328         std::cout << "wrong kinematic constraints index" << std::endl;
00329 }
00330 
00331 //
00332 //  Total 3-momentum constraints
00333 //
00334 
00335 void KinematicFit::AddThreeMomentum(int number, Hep3Vector p3) {
00336     std::vector<int>  tlis;
00337     tlis.clear();
00338     WTrackParameter wtrk;
00339     KinematicConstraints kc;
00340 
00341     for(int i = 0; i < numberWTrack(); i++) {
00342         tlis.push_back(i);
00343     }
00344     kc.ThreeMomentumConstraints(p3, tlis);
00345     m_kc.push_back(kc);
00346     if((unsigned int) number != m_kc.size()-1) 
00347         std::cout << "wrong kinematic constraints index" << std::endl;
00348 }
00349 
00350 //
00351 //  Total 4-momentum constraints
00352 //
00353 
00354 void KinematicFit::AddFourMomentum(int number, HepLorentzVector p4) {
00355 
00356     std::vector<int> tlis;
00357     tlis.clear();
00358     KinematicConstraints kc;
00359 
00360     for(int i = 0; i < numberWTrack(); i++) {
00361         tlis.push_back(i);
00362     }
00363     //  for(int i = 0; i < numberWTrack_V(); i++) {
00364     //    tlis_V.push_back(i);
00365     //  }
00366 
00367     HepSymMatrix Vme = HepSymMatrix(4,0);
00368     Vme[0][0] = 2*m_espread*m_espread*sin(m_collideangle)*sin(m_collideangle);
00369     Vme[0][3] = 2*m_espread*m_espread*sin(m_collideangle);
00370     Vme[3][3] = 2*m_espread*m_espread;
00371 
00372     //  kc.FourMomentumConstraints(p4, tlis, Vme);
00373     kc.FourMomentumConstraints(p4, tlis, Vme);
00374     m_kc.push_back(kc);
00375     if((unsigned int) number != m_kc.size()-1) 
00376         std::cout << "wrong kinematic constraints index" << std::endl;
00377 }
00378 
00379 void KinematicFit::AddFourMomentum(int number, double etot ){
00380 
00381     HepLorentzVector p4(0.0, 0.0, 0.0, etot);
00382     std::vector<int> tlis;
00383     tlis.clear();
00384     KinematicConstraints kc;
00385 
00386     for(int i = 0; i < numberWTrack(); i++) {
00387         tlis.push_back(i);
00388     }
00389     HepSymMatrix Vme = HepSymMatrix (4,0);
00390     Vme[3][3] = 2*m_espread*m_espread;
00391     // kc.FourMomentumConstraints(p4, tlis, Vme);
00392     kc.FourMomentumConstraints(p4, tlis, Vme);
00393     m_kc.push_back(kc);
00394     if((unsigned int) number != m_kc.size()-1) 
00395         std::cout << "wrong kinematic constraints index" << std::endl;
00396 }
00397 /*
00398    void KinematicFit::AddPosition(int number, HepPoint3D xorigin, std::vector<int> tlis_V){
00399    KinematicConstraints kc;
00400    HepSymMatrix Vpe = HepSymMatrix(2,0);
00401    HepSymMatrix Vclus = HepSymMatrix (3,0);
00402    Vclus[0][0] = wTrackOrigin_V(tlis_V[0]).Ew()[4][4];
00403    Vclus[0][1] = wTrackOrigin_V(tlis_V[0]).Ew()[4][5];
00404    Vclus[1][1] = wTrackOrigin_V(tlis_V[0]).Ew()[5][5];
00405    Vclus[2][2] = wTrackOrigin_V(tlis_V[0]).Ew()[6][6];
00406    HepMatrix p(2,3,0);
00407    p[0][0] = wTrackOrigin_V(tlis_V[0]).w()[1];
00408    p[0][1] = -wTrackOrigin_V(tlis_V[0]).w()[0];
00409    p[1][0] = wTrackOrigin_V(tlis_V[0]).w()[2];
00410    p[1][2] = -wTrackOrigin_V(tlis_V[0]).w()[0];
00411    Vpe = Vclus.similarity(p);   
00412 
00413    kc.PositionConstraints(xorigin, tlis_V, Vpe);
00414    m_kc.push_back(kc);
00415    if((unsigned int) number != m_kc.size()-1) 
00416    std::cout << "wrong kinematic constraints index" << std::endl;
00417    }     
00418    */
00419 
00420 
00421 
00422 void KinematicFit::fit() {
00423 
00424     KinematicConstraints kc;
00425     int nc = m_nc;
00426     int ntrk = numberWTrack();
00427 
00428     TStopwatch timer;
00429     timer.Start();
00430 
00431     m_VD = HepSymMatrix(m_nc, 0);
00432     m_VD = m_covOrigin.similarity(m_D);
00433     timer.Stop();
00434     m_cpu[1] += timer.CpuTime();
00435     timer.Start();
00436     
00437     int ifail;
00438     m_VD.invert(ifail);
00439     
00440     timer.Stop();
00441     m_cpu[2] += timer.CpuTime();
00442     timer.Start();
00443 
00444     HepVector G(m_nc, 0);
00445     G = m_D * (m_pOrigin - m_pInfit) + m_d; 
00446 
00447     m_KP = HepMatrix(NTRKPAR*m_nktrk, m_nc, 0);
00448     m_KP = m_covOrigin * m_DT * m_VD;
00449     m_chi = (m_VD.similarity(G.T()))[0][0];
00450 
00451 
00452     timer.Stop();
00453     m_cpu[3] += timer.CpuTime();
00454     timer.Start();
00455 
00456     m_pInfit = m_pOrigin - m_KP * G;
00457 
00458     //  ===== gamma dynamic adjustment====
00459 
00460     timer.Stop();
00461     m_cpu[4] += timer.CpuTime();
00462 
00463     timer.Start();
00464     if(m_dynamicerror ==1) 
00465         gda(); 
00466 
00467     timer.Stop();
00468     m_cpu[6] += timer.CpuTime();
00469 }
00470 
00471 
00472 
00473 
00474 
00475 void KinematicFit::upCovmtx() {
00476 
00477     int ntrk = numberWTrack();
00478     HepSymMatrix I(NTRKPAR*m_nktrk, 1);
00479     m_covInfit = m_covOrigin.similarity(I - m_KP*m_D);
00480     for(int i = 0; i < m_nktrk; i++) {
00481         HepSymMatrix ew3 (3, 0);          
00482         HepSymMatrix ew6 (6, 0);
00483         HepSymMatrix Ew1 (7, 0);
00484         ew3 = m_covInfit.sub(i*NTRKPAR + 1, (i+1)*NTRKPAR);
00485         for(int j = 0; j < NTRKPAR; j++) {
00486             for(int k = 0; k < NTRKPAR; k++) {
00487                 ew6[j][k] = ew3[j][k];
00488             }
00489         }
00490         for(int m = NTRKPAR; m < 6; m++) {
00491             for(int n = NTRKPAR; n < 6; n++) {
00492                 ew6[m][n] = 0;//(wTrackOrigin(i).Ew())[m+1][n+1];
00493             }
00494         }
00495         double px = p4Infit(i).px();
00496         double py = p4Infit(i).py();
00497         double pz = p4Infit(i).pz();
00498         double m =  p4Infit(i).m();
00499         double e =  p4Infit(i).e();
00500 
00501         HepMatrix J(7, 6, 0);
00502         J[0][0] = 1;
00503         J[1][1] = 1;
00504         J[2][2] = 1;
00505         J[3][0] = px/e;
00506         J[3][1] = py/e;
00507         J[3][2] = pz/e;
00508         J[4][3] = 1;
00509         J[5][4] = 1;
00510         J[6][5] = 1;
00511         Ew1 = ew6.similarity(J);
00512 
00513         HepVector W(7, 0);
00514         for(int j=0; j<4; j++) {
00515             W[j] = p4Infit(i)[j];
00516         }
00517         W[4] = wTrackOrigin(i).w()[4];
00518         W[5] = wTrackOrigin(i).w()[5];
00519         W[6] = wTrackOrigin(i).w()[6];
00520         
00521 
00522         WTrackParameter wtrk = wTrackInfit(i);
00523         wtrk.setEw(Ew1);
00524         wtrk.setW(W);
00525         setWTrackInfit(i, wtrk);
00526     }
00527 
00528 
00529 }    
00530 
00531    
00532 
00533 void KinematicFit::fit(int n) {
00534 
00535     if(m_chisq.size() == 0) {
00536         for(unsigned int i = 0; i < m_kc.size(); i++)
00537             m_chisq.push_back(9999.0);
00538     }
00539     KinematicConstraints kc;
00540     int nc = m_nc;
00541     int ntrk = numberWTrack();
00542 
00543     m_VD = HepSymMatrix(m_nc, 0);
00544     m_VD = m_covOrigin.similarity(m_D);
00545     int ifail;
00546     m_VD.invert(ifail);
00547     HepVector G(m_nc, 0);
00548     G = m_D * (m_pOrigin - m_pInfit) + m_d; 
00549     m_KP = HepMatrix(NTRKPAR*m_nktrk, m_nc, 0);
00550     m_KP = m_covOrigin * m_DT * m_VD;
00551     m_chisq[n]  = (m_VD.similarity(G.T()))[0][0];
00552     m_pInfit = m_pOrigin - m_KP * G;
00553 
00554 }
00555 
00556 
00557 
00558 void KinematicFit::covMatrix(int n) {
00559     KinematicConstraints kc = m_kc[n];
00560     int nc = kc.nc();
00561     int ntrk = (kc.Ltrk()).size();
00562     HepSymMatrix Va0(7*ntrk, 0);
00563     for (int i = 0; i < ntrk; i++) {
00564         int itk = (kc.Ltrk())[i];
00565         for(int j = 0; j < 7; j++) 
00566             for (int k = 0; k < 7; k++)
00567                 Va0[7*i+j][7*i+k] = (wTrackOrigin(itk).Ew())[j][k];
00568 
00569     }
00570     HepMatrix D(nc, 7*ntrk, 0);
00571     int ncc = 0;
00572     for(int j = 0; j < kc.nc(); j++) {
00573         for(int l = 0; l < ntrk; l++) { 
00574             for(int k = 0; k < 7; k++)
00575                 D[ncc][7*l+k] = (kc.Dc()[l])[j][k];
00576         }
00577         ncc++;
00578     }
00579 
00580 
00581     HepSymMatrix VD(nc, 0);
00582     VD = kc.VD()[0];
00583     HepSymMatrix Va(7*ntrk, 0);
00584     Va = Va0 - (VD.similarity(D.T())).similarity(Va0);
00585     for(int i = 0; i < ntrk; i++) {
00586         int itk = (kc.Ltrk())[i];
00587         HepVector w(7, 0);
00588         HepSymMatrix Ew(7, 0);
00589         for(int j = 0; j < 7; j++) {
00590             for(int k = 0; k < 7; k++) 
00591                 Ew[j][k] = Va[7*i + j] [7*i + k];
00592         }
00593         WTrackParameter wtrk = wTrackInfit(itk);
00594         wtrk.setEw(Ew);
00595         setWTrackInfit(itk, wtrk);
00596     }
00597     m_kc[n] = kc;
00598 
00599 }
00600 
00601 
00602 
00603 
00604 bool KinematicFit::Fit() {
00605     bool okfit = false;
00606     TStopwatch timer;
00607     m_nktrk = numberWTrack();
00608     m_pOrigin = HepVector(m_nktrk * NTRKPAR, 0);
00609     m_pInfit = HepVector(m_nktrk * NTRKPAR, 0);
00610     m_covOrigin = HepSymMatrix(m_nktrk * NTRKPAR, 0);
00611     m_covInfit = HepSymMatrix(m_nktrk * NTRKPAR, 0);
00612     m_massvector = HepVector(m_nktrk, 0);
00613     for(int i = 0; i < numberWTrack(); i++) {
00614         setWTrackInfit(i, wTrackOrigin(i));
00615         setPOrigin(i, (wTrackOrigin(i).w()).sub(1, NTRKPAR));
00616         setPInfit(i, (wTrackOrigin(i).w()).sub(1, NTRKPAR));
00617         setCovOrigin(i, (wTrackOrigin(i).Ew()).sub(1, NTRKPAR));
00618         setMassvector(i, wTrackOrigin(i).mass());
00619     }
00620     
00621     //
00622     // iteration
00623     //
00624     //    cout<<"m_pInfit ="<<m_pInfit<<endl;
00625     //    cout<<"m_covOrigin="<<m_covOrigin<<endl;
00626     //    cout<<"m_massvector ="<<m_massvector<<endl;
00627 
00628     std::vector<double> chisq;
00629     chisq.clear();
00630     int nc = 0;
00631     for(int i = 0; i < m_kc.size(); i++)
00632         nc += m_kc[i].nc();
00633 
00634     m_D = HepMatrix(nc, m_nktrk * NTRKPAR, 0);
00635     m_DT = HepMatrix(m_nktrk * NTRKPAR, nc, 0);
00636     m_d = HepVector(nc, 0);
00637 
00638     for(int it = 0; it < m_niter; it++) {
00639 
00640         timer.Start();
00641         m_nc = 0;
00642         for(unsigned int i = 0; i < m_kc.size(); i++) {
00643             KinematicConstraints kc = m_kc[i];
00644             //      std::vector<WTrackParameter> wlis;
00645             //      std::vector<WTrackParameter> wlis_V;
00646             //      wlis.clear();
00647             //      wlis_V.clear();
00648             //      for(unsigned int j = 0; j < (kc.Ltrk()).size(); j++) {
00649             //  int n = (kc.Ltrk())[j];
00650             //  WTrackParameter wtrk = wTrackInfit(n);
00651             //       if(m_espread!=0)    wtrk = wTrackOrigin(n);
00652             //  wlis.push_back(wtrk);
00653             //      } 
00654             //      for(unsigned int j = 0; j < (kc.Ltrk_V()).size(); j++) {
00655             //  int n = (kc.Ltrk_V())[j];
00656             //  WTrackParameter wtrk = wTrackInfit_V(n);
00657             //  wlis_V.push_back(wtrk);
00658             //      } 
00659             //      kc.UpdateConstraints(wlis, wlis_V);
00660             //      m_kc[i] = kc;
00661             //cout<<"wlis_V ="<<(wlis_V[0].w())[0]<<endl;     
00662             updateConstraints(kc);
00663             //      std::cout << "updata OK " << m_d << std::endl;
00664         }
00665         timer.Stop();
00666         m_cpu[0] += timer.CpuTime();
00667 
00668         fit();  
00669         chisq.push_back(m_chi);
00670         if(it > 0) {
00671             double delchi = chisq[it]- chisq[it-1];
00672             if(fabs(delchi) < m_chiter) 
00673                 break;
00674         }
00675     }
00676     if(m_chi >= m_chicut) {
00677 
00678         return okfit;
00679     }
00680     // update track parameter and its covariance matrix
00681     //    upTrkpar();
00682     //    covMatrix();
00683     timer.Start();
00684     //upCovmtx();
00685     timer.Stop();
00686     m_cpu[5] += timer.CpuTime();
00687 
00688     okfit = true;
00689 
00690     /*
00691        for (int i = 0; i<numberWTrack(); i++){
00692        if (wTrackOrigin(i).charge()==0) continue ;
00693        HTrackParameter horigin = HTrackParameter(wTrackOrigin(i));
00694        HTrackParameter hinfit = HTrackParameter(wTrackInfit(i));
00695 
00696        HepVector a0 = horigin.hel();
00697        HepVector a1 = hinfit.hel();
00698        HepSymMatrix v0 = horigin.eHel();
00699        HepSymMatrix v1 = hinfit.eHel(); 
00700        HepVector pull(5,0);
00701        for (int k=0; k<5; k++) {
00702        pull[k] = (a0[k]-a1[k])/sqrt(abs(v0[k][k]-v1[k][k]));
00703        }
00704 
00705        WTrackParameter wtrk2 = wTrackInfit(i);
00706        wtrk2.setPull(pull);
00707     //    for (int l=0;l<5; l++) {
00708     //(wTrackInfit(i).pull())[l]=(wtrk2.pull())[l];
00709     //   }
00710     setWTrackInfit(i, wtrk2);
00711     }
00712     */
00713     /*/
00714 
00715       for (int i = 0; i<numberWTrack_V(); i++){ 
00716     //if (wTrackOrigin(i).charge()==0) continue ;
00717     HTrackParameter horigin_V = HTrackParameter(wTrackOrigin_V(i));
00718     HTrackParameter hinfit_V = HTrackParameter(wTrackInfit_V(i));
00719 
00720     HepVector a0 = horigin.hel();
00721     HepVector a1 = hinfit.hel();
00722     HepSymMatrix v0 = horigin.eHel();
00723     HepSymMatrix v1 = hinfit.eHel();
00724     HepVector pull(5,0);
00725     for (int k=0; k<5; k++) {
00726     pull[k] = (a0[k]-a1[k])/sqrt(abs(v0[k][k]-v1[k][k]));
00727     }
00728 
00729     WTrackParameter wtrk2 = wTrackInfit(i);
00730     wtrk2.setPull(pull);
00731     //    for (int l=0;l<5; l++) {
00732     //(wTrackInfit(i).pull())[l]=(wtrk2.pull())[l];
00733     //   }
00734     setWTrackInfit(i, wtrk2);
00735     }  
00736     */
00737 
00738     return okfit;
00739 }
00740 
00741 bool KinematicFit::Fit(int n) {
00742     bool okfit = false;
00743     if(n < 0 || (unsigned int)n >= m_kc.size()) return okfit;
00744 
00745     m_nktrk = numberWTrack();
00746     m_pOrigin = HepVector(m_nktrk * NTRKPAR, 0);
00747     m_pInfit = HepVector(m_nktrk * NTRKPAR, 0);
00748     m_covOrigin = HepSymMatrix(m_nktrk * NTRKPAR, 0);
00749     m_covInfit = HepSymMatrix(m_nktrk * NTRKPAR, 0);
00750     m_massvector = HepVector(m_nktrk * NTRKPAR, 0);
00751     for(int i = 0; i < numberWTrack(); i++) {
00752         setWTrackInfit(i, wTrackOrigin(i));
00753         setPOrigin(i, (wTrackOrigin(i).w()).sub(1, NTRKPAR));
00754         setPInfit(i, (wTrackOrigin(i).w()).sub(1, NTRKPAR));
00755         setCovOrigin(i, (wTrackOrigin(i).Ew()).sub(1, NTRKPAR));
00756         setMassvector(i, wTrackOrigin(i).mass());
00757     }
00758 
00759     //
00760     // iteration loop
00761     //
00762 
00763     std::vector<double> chisq;
00764     chisq.clear();
00765 
00766     m_D = HepMatrix(m_kc[n].nc(), m_nktrk * NTRKPAR, 0);
00767     m_DT = HepMatrix(m_nktrk * NTRKPAR, m_kc[n].nc(), 0);
00768     m_d = HepVector(m_kc[n].nc(), 0);
00769 
00770     for(int it = 0; it < m_niter; it++) {
00771         m_nc = 0;
00772         KinematicConstraints kc = m_kc[n];
00773         updateConstraints(kc);
00774         //     m_kc[n] = kc;
00775         fit(n);
00776 
00777         chisq.push_back(m_chisq[n]);
00778         if(it > 0) {
00779             double delchi = chisq[it]- chisq[it-1];
00780             if(fabs(delchi) < m_chiter) 
00781                 break;
00782         }
00783     }
00784 
00785     if(m_chisq[n] >= m_chicut) return okfit;
00786     //    ====update cov====
00787     //   upCovmtx();
00788     okfit = true;
00789     return okfit;
00790 }
00791 
00792 
00793 void KinematicFit::BuildVirtualParticle( int n) {
00794 //
00795 //      q = p1 + p2 + ... + pn
00796 //
00797         upCovmtx();
00798         KinematicConstraints kc = m_kc[n];
00799         int ntrk = (kc.Ltrk()).size();
00800         int charge = 0;
00801         HepVector w(7, 0);
00802         HepSymMatrix ew(7, 0);
00803         HepMatrix dwdp(7, 7, 0);
00804         dwdp[0][0] = 1;
00805         dwdp[1][1] = 1;
00806         dwdp[2][2] = 1;
00807         dwdp[3][3] = 1;
00808         dwdp[4][4] = 1;
00809         dwdp[5][5] = 1;
00810         dwdp[6][6] = 1;
00811         for (int i = 0; i < ntrk; i++) {
00812                 int itk = (kc.Ltrk())[i];
00813                 charge += wTrackInfit(itk).charge();
00814                 w[0] = w[0] + wTrackInfit(itk).w()[0];
00815                 w[1] = w[1] + wTrackInfit(itk).w()[1];
00816                 w[2] = w[2] + wTrackInfit(itk).w()[2];
00817                 w[3] = w[3] + wTrackInfit(itk).w()[3];
00818                 w[4] = 0.0;//
00819                 w[5] = 0.0;// set virtual particle's vertex at (0,0,0)
00820                 w[6] = 0.0;//
00821                 ew = ew + (wTrackInfit(itk).Ew()).similarity(dwdp);  // the  vertex matrix  of this particles is not correct, because we do not use vertex information in kinematicfit, so ...
00822         }
00823         double m = sqrt(w[3]*w[3] - w[0]*w[0] - w[1]*w[1] - w[2]*w[2]);
00824         WTrackParameter vwtrk;
00825         vwtrk.setCharge(charge);
00826         vwtrk.setW(w);
00827         vwtrk.setEw(ew);
00828         vwtrk.setMass(m);
00829         m_virtual_wtrk.push_back(vwtrk);
00830 }
00831 
00832 
00833 
00834 void KinematicFit::gda(){
00835         for(int i = 0; i < numberWTrack(); i++) {
00836 
00837                 if ((wTrackOrigin(i)).type() == 2 ){
00838                         int n ;
00839                         for(int j = 0; j < numberGammaShape(); j++) {
00840                                 if(i==GammaShapeList(j))  n = j;
00841                         }
00842                         HepSymMatrix Ew(NTRKPAR, 0);
00843                         HepLorentzVector p1 = p4Infit(i);
00844                         double eorigin = pOrigin(i)[3];
00845                         //cout<<"p1 ="<<p1<<endl;
00846                         HepMatrix dwda1(NTRKPAR, 3, 0);
00847                         dwda1[0][0] = -p1.py();
00848                         dwda1[1][0] = p1.px();
00849                         dwda1[0][1] = p1.px()*p1.pz()/p1.perp();
00850                         dwda1[1][1] = p1.py()*p1.pz()/p1.perp();
00851                         dwda1[2][1] = -p1.perp();
00852                         dwda1[0][2] = p1.px()/p1.rho();
00853                         dwda1[1][2] = p1.py()/p1.rho();
00854                         dwda1[2][2] = p1.pz()/p1.rho();
00855                         dwda1[3][2] = p1.rho()/p1.e();
00856                         HepSymMatrix emcmea1(3, 0);
00857                         double pk = p1[3];
00858                         emcmea1[0][0] = GammaShapeValue(n).getdphi() * GammaShapeValue(n).getdphi();
00859                         emcmea1[1][1] = GammaShapeValue(n).getdthe() * GammaShapeValue(n).getdthe();
00860                         emcmea1[2][2] = GammaShapeValue(n).de(eorigin,pk) * GammaShapeValue(n).de(eorigin,pk);
00861                         Ew = emcmea1.similarity(dwda1);
00862                         //cout<<"emcmea1 ="<<emcmea1<<endl;
00863                         //cout<<"Ew ="<<Ew<<endl;
00864                         setCovOrigin(i, Ew); 
00865                 } 
00866         }
00867 }
00868 
00869 
00870 HepVector KinematicFit::pull(int n){
00871         upCovmtx();
00872 
00873         if (wTrackOrigin(n).charge()!=0){
00874                 HepVector W(6,0);
00875                 HepSymMatrix Ew(6,0);
00876                 HepVector W1(7,0);
00877                 HepSymMatrix Ew1(7,0);
00878                 WTrackParameter wtrk = wTrackOrigin(n);
00879                 //                W = wTrackOrigin(n).w();
00880                 //                Ew = wTrackOrigin(n).Ew();
00881                 //cout<<"===Origin status==="<<endl;
00882                 //cout<<"W = "<<W<<endl;
00883                 //cout<<"Ew ="<<Ew<<endl; 
00884                 for(int i=0; i<3; i++) {
00885                         W[i] = pInfit(n)[i];
00886                 }
00887                 W[3] = wTrackOrigin(n).w()[4];
00888                 W[4] = wTrackOrigin(n).w()[5];
00889                 W[5] = wTrackOrigin(n).w()[6];
00890                 for(int j=0; j<3; j++) {
00891                         for(int k=0; k<3; k++) {
00892                                 Ew[j][k] = covInfit(n)[j][k];
00893                         }
00894                 }
00895 
00896                 for(int j=3; j<6; j++) {
00897                         for(int k=3; k<6; k++) {
00898                                 Ew[j][k] = wTrackOrigin(n).Ew()[j+1][k+1];
00899                         }
00900                 }
00901                 //
00902                 // define J matrix to transfer 3 parameters to 4 parameters
00903                 // 
00904                 double px = p4Infit(n).px();
00905                 double py = p4Infit(n).py();
00906                 double pz = p4Infit(n).pz();
00907                 double e  = p4Infit(n).e(); 
00908                 HepMatrix J(7, 6, 0);
00909                 J[0][0] = 1;
00910                 J[1][1] = 1;
00911                 J[2][2] = 1;
00912                 J[3][0] = px/e;
00913                 J[3][1] = py/e;
00914                 J[3][2] = pz/e;
00915                 J[4][3] = 1;
00916                 J[5][4] = 1;
00917                 J[6][5] = 1;
00918                 W1 = J * W;
00919                 Ew1 = Ew.similarity(J) ;
00920 
00921 
00922 
00923                 // cout<<"===Infiddt status==="<<endl;
00924                 // cout<<"p4 ="<<p4Infit(n)<<endl;
00925                 // cout<<"W ="<<wTrackOrigin(n).w()<<endl;
00926                 // cout<<"W1 ="<<W1<<endl;
00927                 // cout<<"Ew ="<<wTrackOrigin(n).Ew()<<endl;
00928                 // cout<<"Ew1 ="<<Ew1<<endl;
00929 
00930                 wtrk.setW(W1);
00931                 wtrk.setEw(Ew1);
00932                 setWTrackInfit(n, wtrk); 
00933                 HTrackParameter horigin = HTrackParameter(wTrackOrigin(n));
00934                 HTrackParameter hinfit = HTrackParameter(wTrackInfit(n));
00935 
00936                 HepVector a0 = horigin.hel();
00937                 HepVector a1 = hinfit.hel();
00938                 HepSymMatrix v0 = horigin.eHel();
00939                 HepSymMatrix v1 = hinfit.eHel(); 
00940                 HepVector pull(11,0);
00941                 for (int k=0; k<5; k++) {
00942                         pull[k] = (a0[k]-a1[k])/sqrt(abs(v0[k][k]-v1[k][k]));
00943                 //      cout<<"pull ["<<k<<"] ="<<pull[k]<<endl;
00944                 }
00945                 for (int l=5; l<9; l++) {
00946                         pull[l] = (wTrackOrigin(n).w()[l-5] - wTrackInfit(n).w()[l-5])/sqrt(abs(wTrackOrigin(n).Ew()[l-5][l-5] - wTrackInfit(n).Ew()[l-5][l-5]));
00947                         //        cout<<"pull ["<<l<<"] ="<<pull[l]<<endl;
00948                 }
00949                 
00950                 //                pull[9] = wTrackOrigin(n).w()[3] - wTrackInfit(n).w()[3];
00951                 //                pull[10] =1/sqrt(abs(wTrackOrigin(n).Ew()[3][3] - wTrackInfit(n).Ew()[3][3]));  
00952                 return pull;  
00953         }else {
00954                 HepVector pull(3,0);
00955                 for (int m=0; m<3; m++) {
00956                         pull[m] = (wTrackOrigin(n).w()[m] - wTrackInfit(n).w()[m])/sqrt(abs(wTrackOrigin(n).Ew()[m][m] - wTrackInfit(n).Ew()[m][m]));
00957                 }
00958                 return pull;
00959         }
00960 }
00961 
00962 
00963 void KinematicFit::updateConstraints(KinematicConstraints k ) {
00964         KinematicConstraints kc = k;
00965 
00966         //   std::vector<HepLorentzVector> wlis;
00967         //   std::vector<WTrackParameter> wlis_V;
00968         //   wlis.clear();
00969         //   wlis_V.clear();
00970         //   for(unsigned int j = 0; j < (kc.Ltrk()).size(); j++) {
00971         //      int n = (kc.Ltrk())[j];
00972         //        HepVec wtrk = wTrackInfit(n);
00973         //       if(m_espread!=0)        wtrk = wTrackOrigin(n);
00974 
00975         //       wlis.push_back(p4Infit(n));
00976         //   }
00977         //    for(unsigned int j = 0; j < (kc.Ltrk_V()).size(); j++) {
00978         //      int n = (kc.Ltrk_V())[j];
00979         //      WTrackParameter wtrk = wTrackInfit_V(n);
00980         //       wlis_V.push_back(wtrk);
00981         //  }
00982 
00983 
00984         int type = kc.Type();
00985         switch(type) {
00986                 case  Resonance: {
00987                                          //
00988                                          //  E^2 - px^2 - py^2 - pz^2 = mres^2
00989                                          //
00990                                          double mres = kc.mres();
00991                                          HepLorentzVector pmis;
00992                                          for(unsigned int j = 0; j< (kc.Ltrk()).size(); j++){
00993                                                  int n = (kc.Ltrk())[j];
00994 
00995                                                  pmis = pmis + p4Infit(n);
00996                                          }
00997                                          //    for(unsigned int i = 0; i < wlis_V.size(); i++)
00998                                          //      pmis = pmis + wlis_V[i].p();
00999                                          for(unsigned int j = 0; j< (kc.Ltrk()).size(); j++){
01000                                                  int n = (kc.Ltrk())[j];
01001                                                  HepMatrix Dc(1, NTRKPAR, 0);
01002                                                  Dc[0][0] = -2 * pmis.px() + 2 * pmis.e() * p4Infit(n).px() / p4Infit(n).e();
01003                                                  Dc[0][1] = -2 * pmis.py() + 2 * pmis.e() * p4Infit(n).py() / p4Infit(n).e();
01004                                                  Dc[0][2] = -2 * pmis.pz() + 2 * pmis.e() * p4Infit(n).pz() / p4Infit(n).e();
01005                                                  //                                              Dc[0][3] = 2 * pmis.e();
01006                                                  setD(m_nc,n,Dc);
01007                                                  setDT(n, m_nc, Dc.T());
01008                                          }      
01009 
01010                                          // for(unsigned int i = 0; i < wlis_V.size(); i++) {
01011                                          //      HepMatrix Dc_V(1, 7, 0);
01012                                          //      Dc_V[0][0] = -2 * pmis.px();
01013                                          //      Dc_V[0][1] = -2 * pmis.py();
01014                                          //      Dc_V[0][2] = -2 * pmis.pz();
01015                                          //     Dc_V[0][3] = 2 * pmis.e();
01016                                          //      m_Dc_V.push_back(Dc_V);
01017                                          //    }
01018 
01019 
01020                                          HepVector dc(1, 0);
01021                                          dc[0] = pmis.m2() - mres * mres;
01022                                          m_d[m_nc] = dc[0];
01023                                          m_nc+=1;
01024                                          //    std::cout << "etot = " << dc[0] <<" , " << mres<< std::endl;
01025                                          //    m_dc.push_back(dc);
01026                                          //    HepVector lambda(1, 0);
01027                                          //    m_lambda.push_back(lambda);
01028                                          //    HepSymMatrix vd(1, 0);
01029                                          //    m_VD.push_back(vd);
01030                                          //    HepSymMatrix V6 = m_Vre;
01031                                          //    m_Vm.push_back(V6);
01032 
01033                                          break;
01034                                  }
01035                 case TotalEnergy: {
01036                                           //
01037                                           //  E - Etot = 0
01038                                           //
01039                                           double etot = kc.etot();
01040                                           HepLorentzVector pmis;
01041                                           for(unsigned int j = 0; j < (kc.Ltrk()).size(); j++){
01042                                                   int n = (kc.Ltrk())[j];
01043                                                   pmis = pmis + p4Infit(n);
01044                                           }
01045                                           //    for(unsigned int i = 0; i < wlis.size(); i++)
01046                                           //      pmis = pmis + wlis[i].p();
01047                                           for(unsigned int j = 0; j < (kc.Ltrk()).size(); j++) {
01048                                                   int n = (kc.Ltrk())[j];
01049                                                   HepMatrix Dc(1, NTRKPAR, 0);
01050                                                   Dc[0][0] = p4Infit(n).px()/p4Infit(n).e();
01051                                                   Dc[0][1] = p4Infit(n).py()/p4Infit(n).e();
01052                                                   Dc[0][2] = p4Infit(n).pz()/p4Infit(n).e();
01053                                                   //      Dc[0][3] = 1.0;
01054                                                   setD(m_nc,n,Dc);
01055                                                   setDT(n, m_nc, Dc.T());
01056                                           }
01057                                           HepVector dc(1, 0);
01058                                           dc[0] = pmis.e() - etot;
01059                                           m_d[m_nc] = dc[0];
01060                                           m_nc+=1;
01061                                           //    m_dc.push_back(dc);
01062                                           //    HepVector lambda(1, 0);
01063                                           //    m_lambda.push_back(lambda);
01064                                           //    HepSymMatrix vd(1, 0);
01065                                           //    m_VD.push_back(vd);
01066                                           break;
01067                                   }
01068                 case TotalMomentum: {
01069                                             //
01070                                             //  sqrt(px^2+py^2+pz^2) - ptot = 0
01071                                             //
01072                                             double ptot = kc.ptot();
01073                                             HepLorentzVector pmis;
01074                                             for(unsigned int j = 0; j< (kc.Ltrk()).size(); j++){
01075                                                     int n = (kc.Ltrk())[j];
01076                                                     pmis = pmis + p4Infit(n);
01077                                             }
01078 
01079                                             //    for(unsigned int i = 0; i < wlis.size(); i++)
01080                                             //      pmis = pmis + wlis[i].p();
01081                                             for(unsigned int j = 0; j < (kc.Ltrk()).size(); j++) {
01082                                                     int n = (kc.Ltrk())[j];
01083                                                     HepMatrix Dc(1, NTRKPAR, 0);
01084                                                     Dc[0][0] = pmis.px()/pmis.rho();
01085                                                     Dc[0][1] = pmis.py()/pmis.rho();
01086                                                     Dc[0][2] = pmis.pz()/pmis.rho();
01087                                                     setD(m_nc,n,Dc);
01088                                                     setDT(n, m_nc, Dc.T());
01089                                                     //      m_Dc.push_back(Dc);
01090                                             }
01091                                             HepVector dc(1, 0);
01092                                             dc[0] = pmis.rho() - ptot;
01093                                             m_d[m_nc] = dc[0];
01094                                             m_nc+=1;     
01095                                             //    m_dc.push_back(dc);
01096                                             //    HepVector lambda(1, 0);
01097                                             //    m_lambda.push_back(lambda);
01098                                             //    HepSymMatrix vd(1, 0);
01099                                             //    m_VD.push_back(vd);
01100                                             break;
01101                                     }
01102                                     /*
01103                                        case kc.typePoint(): {
01104                                        HepPoint3D point = kc.point();
01105                                        double flightpath;
01106                                        HepMatrix p(2,3,0);
01107 
01108                                        HepSymMatrix Vp(2,0);
01109                                        for(unsigned int i = 0; i < wlis.size(); i++) {
01110                                        HepMatrix Dc(2, 7, 0);
01111                                        m_Dc.push_back(Dc);
01112                                        }
01113                                     // wlis_V.size() should be 1
01114                                     for(unsigned int i = 0; i < wlis_V.size(); i++) {
01115                                     //      HepMatrix Dc(3, 7, 0);
01116                                     //      m_Dc.push_back(Dc);
01117                                     HepMatrix Dc_V(2, 7, 0);
01118                                     HepSymMatrix Vclus(3, 0); 
01119                                     for(unsigned int j = 0; j < 3; j++){
01120                                     for(unsigned int k = j; k < 3; k++){
01121                                     Vclus[j][k] = wlis_V[i].Ew()[j+4][k+4];
01122                                     }
01123                                     }
01124                                     cout<<"Vclus ="<<Vclus<<endl;       
01125                                     p[0][0] = wlis_V[i].w()[1];
01126                                     p[0][1] = -wlis_V[i].w()[0];
01127                                     p[1][0] = wlis_V[i].w()[2];
01128                                     p[1][2] = -wlis_V[i].w()[0];
01129                                     Vp = Vclus.similarity(p);   
01130                                     cout<<"Vp ="<<Vp<<endl;
01131                                     Dc_V[0][0] = -(wlis_V[i].w()[5] - point[1]);
01132                                     Dc_V[0][1] = wlis_V[i].w()[4] - point[0];
01133                                     Dc_V[0][4] = wlis_V[i].w()[1];
01134                                     Dc_V[0][5] = -wlis_V[i].w()[0];
01135 
01136                                     Dc_V[1][0] = -(wlis_V[i].w()[6] - point[2]);
01137                                     Dc_V[1][2] = wlis_V[i].w()[4] - point[0];
01138                                     Dc_V[1][4] = wlis_V[i].w()[2];
01139                                     Dc_V[1][6] = -wlis_V[i].w()[0];
01140 
01141                                     //      HepMatrix q_x(3,1,0) ;
01142                                     //      q_x[0][0] = 1;
01143                                     //      HepMatrix deltaX_x(3,1,0) ;
01144                                     //      deltaX_x[0][0] = 1;
01145                                     //      HepMatrix p1_x = -(q_x.T()*Vclus.inverse(iver)*deltaX)*p2 + p1*(q_x.T()*Vclus.inverse(iver)*q + q.T()*Vclus.inverse(iver)*q_x);
01146                                     //      HepMatrix p2_x = p2*p2;
01147 
01148                                     //      HepMatrix q_y(3,1,0) ;
01149                                     //      q_y[1][0] = 1;
01150                                     //      HepMatrix deltaX_y(3,1,0);
01151                                     //      deltaX_y[1][0] = 1;
01152                                     //      HepMatrix p1_y = -(q_y.T()*Vclus.inverse(iver)*deltaX)*p2 + p1*(q_y.T()*Vclus.inverse(iver)*q + q.T()*Vclus.inverse(iver)*q_y);
01153                                     //      HepMatrix p2_y = p2*p2;
01154 
01155                                     //      HepMatrix q_z(3,1,0);
01156                                     //      q_z[2][0] = 1;
01157                                     //      HepMatrix deltaX_z(3,1,0);
01158                                     //      deltaX_z[2][0] = 1;
01159                                     //      Hw()[0]<<endl;
01160                                     //cout<<"dc[0] ="<<dc[0]<<endl; 
01161                                     dc[1] = (wlis_V[i].w()[4] - point[0])*wlis_V[i].w()[2] - (wlis_V[i].w()[6] - point[2])*wlis_V[i].w()[0];
01162                                     m_dc.push_back(dc);
01163                                     }
01164                                     HepSymMatrix V3 = Vp;
01165                                     m_Vm.push_back(V3);
01166                                     break;
01167                                     } 
01168                                     */
01169 
01170                 case ThreeMomentum: {
01171                                             //
01172                                             //  px - p3x = 0
01173                                             //  py - p3y = 0
01174                                             //  pz - p3z = 0
01175                                             //
01176                                             Hep3Vector p3 = kc.p3();
01177                                             HepLorentzVector pmis;
01178                                             for(unsigned int j = 0; j< (kc.Ltrk()).size(); j++){
01179                                                     int n = (kc.Ltrk())[j];
01180                                                     pmis = pmis + p4Infit(n);
01181                                             }
01182                                             //    for(unsigned int i = 0; i < wlis.size(); i++)
01183                                             //      pmis = pmis + wlis[i].p();
01184                                             for(unsigned int j = 0; j < (kc.Ltrk()).size(); j++) {
01185                                                     int n = (kc.Ltrk())[j];
01186 
01187                                                     HepMatrix Dc(kc.nc(), NTRKPAR, 0);
01188                                                     Dc[0][0] = 1.0;
01189                                                     Dc[1][1] = 1.0;
01190                                                     Dc[2][2] = 1.0;
01191                                                     HepVector dc(kc.nc(), 0);
01192                                                     dc[0] = pmis.px() - p3.x();
01193                                                     dc[1] = pmis.py() - p3.y();
01194                                                     dc[2] = pmis.pz() - p3.z();
01195                                                     for(int i = 0; i < kc.nc(); i++) {
01196                                                             setD(m_nc+i, n, Dc.sub(i+1, i+1, 1, NTRKPAR));
01197                                                             setDT(n, m_nc+i, (Dc.sub(i+1, i+1, 1, NTRKPAR)).T());
01198                                                             m_d[m_nc+i] = dc[i];
01199                                                     }
01200                                                     //    m_Dc.push_back(Dc);
01201                                             }
01202                                             m_nc += 3; 
01203 
01204                                             //    HepVector dc(3, 0);
01205                                             //    dc[0] = pmis.px() - p3.x();
01206                                             //    dc[1] = pmis.py() - p3.y();
01207                                             //    dc[2] = pmis.pz() - p3.z();
01208                                             //    m_dc.push_back(dc);
01209                                             //    HepVector lambda(3, 0);
01210                                             //    m_lambda.push_back(lambda);
01211                                             //    HepSymMatrix vd(3, 0);
01212                                             //    m_VD.push_back(vd);
01213                                             break;
01214                                     }
01215                 case EqualMass: {
01216                                         //
01217                                         //  (E_1 ^2 - Px_1 ^2 - Py_1 ^2 - Pz_1 ^2) - (E_2 ^2 - Px_2 ^2 - Py_2 ^2 - Pz_2 ^2) = 0
01218                                         //
01219 
01220                                         int isiz = (kc.numEqual())[0];
01221                                         HepLorentzVector pmis1, pmis2;
01222                                         for(int n = 0; n < isiz; n++) {
01223                                                 int n1 = (kc.Ltrk())[n];
01224                                                 pmis1 = pmis1 + p4Infit(n1);
01225                                         }
01226                                         int jsiz = (kc.numEqual())[1];
01227                                         for(int n = 0; n < jsiz; n++){
01228                                                 int n2 = (kc.Ltrk())[n+isiz];
01229                                                 pmis2 = pmis2 + p4Infit(n2);
01230                                         }
01231                                         for(int i = 0; i < isiz; i++) {
01232                                                 int n1 = (kc.Ltrk())[i];
01233                                                 HepMatrix Dc(1, NTRKPAR, 0);
01234                                                 Dc[0][0] = -2 * pmis1.px() + 2 * pmis1.e() * p4Infit(n1).px() / p4Infit(n1).e();
01235                                                 Dc[0][1] = -2 * pmis1.py() + 2 * pmis1.e() * p4Infit(n1).py() / p4Infit(n1).e();
01236                                                 Dc[0][2] = -2 * pmis1.pz() + 2 * pmis1.e() * p4Infit(n1).pz() / p4Infit(n1).e();
01237                                                 //      Dc[0][3] = 2 * pmis1.e();
01238                                                 setD(m_nc,n1,Dc);
01239                                                 setDT(n1,m_nc,Dc.T());
01240                                         }
01241                                         for(int i = 0; i < jsiz; i++) {
01242                                                 int n2 = (kc.Ltrk())[i+isiz];
01243                                                 HepMatrix Dc(1, NTRKPAR, 0);
01244                                                 Dc[0][0] = 2 * pmis2.px() - 2 * pmis2.e() * p4Infit(n2).px() / p4Infit(n2).e();
01245                                                 Dc[0][1] = 2 * pmis2.py() - 2 * pmis2.e() * p4Infit(n2).py() / p4Infit(n2).e();
01246                                                 Dc[0][2] = 2 * pmis2.pz() - 2 * pmis2.e() * p4Infit(n2).pz() / p4Infit(n2).e();
01247                                                 Dc[0][3] = -2 * pmis2.e();
01248                                                 setD(m_nc,n2,Dc);
01249                                                 setDT(n2,m_nc,Dc.T());
01250                                         }
01251                                         //    int isiz_V = m_nequal_V[0];
01252                                         //    HepLorentzVector pmis1_V, pmis2_V;
01253                                         //    if(isiz_V > 0){
01254                                         //    for(int n = 0; n < isiz_V; n++) {
01255                                         //      pmis1_V = pmis1_V + wlis_V[n].p();
01256                                         //    } 
01257                                         //    } 
01258                                         //    int jsiz_V = m_nequal_V[1];
01259                                         //    if(jsiz_V > 0) {
01260                                         //    for(int n = 0; n < jsiz_V; n++) 
01261                                         //      pmis2_V = pmis2_V + wlis_V[isiz_V+n].p();
01262                                         //    }
01263 
01264                                         //    for(int i = 0; i < isiz_V; i++) {
01265                                         //      HepMatrix Dc_V(1, 7, 0);
01266                                         //      Dc_V[0][0] = -2 * pmis1_V.px();
01267                                         //      Dc_V[0][1] = -2 * pmis1_V.py();
01268                                         //      Dc_V[0][2] = -2 * pmis1_V.pz();
01269                                         //      Dc_V[0][3] = 2 * pmis1_V.e();
01270                                         //      m_Dc_V.push_back(Dc_V);
01271                                         //    }
01272                                         //    for(int i = isiz_V; i < isiz_V+jsiz_V; i++) {
01273                                         //      HepMatrix Dc_V(1, 7, 0);
01274                                         //      Dc_V[0][0] = 2 * pmis2_V.px();
01275                                         //      Dc_V[0][1] = 2 * pmis2_V.py();
01276                                         //      Dc_V[0][2] = 2 * pmis2_V.pz();
01277                                         //      Dc_V[0][3] = -2 * pmis2_V.e();
01278                                         //      m_Dc_V.push_back(Dc_V);
01279                                         //    }
01280                                         HepVector dc(1, 0);
01281                                         dc[0] = pmis1.m2() - pmis2.m2();// + pmis1_V.m2() - pmis2_V.m2();
01282                                         m_d[m_nc] = dc[0];
01283 
01284                                         m_nc+=1;
01285                                         //    m_dc.push_back(dc);
01286                                         //    HepVector lambda(1, 0);
01287                                         //    m_lambda.push_back(lambda);
01288                                         //    HepSymMatrix vd(1, 0);
01289                                         //    m_VD.push_back(vd);
01290                                         //    HepSymMatrix V2 = m_Vne;
01291                                         //    m_Vm.push_back(V2);
01292                                         //    std::cout <<"m_Vm[0] ="<<m_Vm[0]<<std::endl;
01293                                         break;
01294                                 }
01295                 case FourMomentum: 
01296                 default: {
01297                                  //
01298                                  //  px - p4x = 0
01299                                  //  py - p4y = 0
01300                                  //  pz - p4z = 0
01301                                  //  e  - p4e = 0
01302                                  //
01303                                  HepLorentzVector p4 = kc.p4();
01304                                  HepLorentzVector pmis;
01305                                  for(unsigned int j = 0; j< (kc.Ltrk()).size(); j++){
01306                                          int n = (kc.Ltrk())[j];
01307                                          pmis = pmis + p4Infit(n);
01308                                  }
01309                                  //    HepLorentzVector pmis_V;
01310                                  for(unsigned int j = 0; j < (kc.Ltrk()).size(); j++) {
01311                                          int n = (kc.Ltrk())[j];
01312                                          HepMatrix Dc(kc.nc(), NTRKPAR, 0);
01313                                          Dc[0][0] = 1.0;
01314                                          Dc[1][1] = 1.0;
01315                                          Dc[2][2] = 1.0;
01316                                          Dc[3][0] = p4Infit(n).px() / p4Infit(n).e();
01317                                          Dc[3][1] = p4Infit(n).py() / p4Infit(n).e();
01318                                          Dc[3][2] = p4Infit(n).pz() / p4Infit(n).e();
01319                                          //                                      Dc[3][3] = 1.0;
01320 
01321                                          //      m_Dc.push_back(Dc);
01322                                          HepVector dc(kc.nc(), 0);
01323                                          dc[0] = pmis.px()  - p4.px();
01324                                          dc[1] = pmis.py()  - p4.py();
01325                                          dc[2] = pmis.pz()  - p4.pz();
01326                                          dc[3] = pmis.e()  - p4.e();
01327                                          for(int i = 0; i < kc.nc(); i++) {
01328                                                  setD(m_nc+i, n, Dc.sub(i+1, i+1, 1, NTRKPAR));
01329                                                  setDT(n, m_nc+i, (Dc.sub(i+1, i+1, 1, NTRKPAR)).T());
01330                                                  m_d[m_nc+i] = dc[i];
01331                                          }
01332                                  }
01333                                  m_nc += 4;
01334                                  //    for(unsigned int i = 0; i < wlis_V.size(); i++)
01335                                  //     pmis_V = pmis_V + wlis_V[i].p();
01336                                  //    for(unsigned int i = 0; i < wlis_V.size(); i++) {
01337                                  //      HepMatrix Dc_V(4, 7, 0);
01338                                  //      Dc_V[0][0] = 1.0;
01339                                  //      Dc_V[1][1] = 1.0;
01340                                  //      Dc_V[2][2] = 1.0;
01341                                  //      Dc_V[3][3] = 1.0;
01342                                  //      m_Dc_V.push_back(Dc_V);
01343                                  //    }
01344 
01345                                  //    HepVector dc(4, 0);
01346                                  //   dc[0] = pmis.px() + pmis_V.px() - p4.px();
01347                                  //    dc[1] = pmis.py() + pmis_V.py() - p4.py();
01348                                  //    dc[2] = pmis.pz() + pmis_V.pz() - p4.pz();
01349                                  //    dc[3] = pmis.e() + pmis_V.e() - p4.e();
01350                                  //    m_dc.push_back(dc);
01351 
01352                                  //    HepSymMatrix V1 = m_Vme;
01353                                  //    m_Vm.push_back(V1);
01354                                  //    HepVector lambda(4, 0);
01355                                  //    m_lambda.push_back(lambda);
01356                                  //   HepSymMatrix vd(4, 0);
01357                                  //    m_VD.push_back(vd);
01358 
01359                                  break;
01360                          }
01361         }
01362 }
01363 

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