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;
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
00030 }
00031
00032
00033 void KinematicFit::init() {
00034 clearWTrackOrigin();
00035 clearWTrackInfit();
00036 clearWTrackList();
00037
00038
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
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
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
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
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
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
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
00364
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
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
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
00399
00400
00401
00402
00403
00404
00405
00406
00407
00408
00409
00410
00411
00412
00413
00414
00415
00416
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
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;
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
00623
00624
00625
00626
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
00645
00646
00647
00648
00649
00650
00651
00652
00653
00654
00655
00656
00657
00658
00659
00660
00661
00662 updateConstraints(kc);
00663
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
00681
00682
00683 timer.Start();
00684
00685 timer.Stop();
00686 m_cpu[5] += timer.CpuTime();
00687
00688 okfit = true;
00689
00690
00691
00692
00693
00694
00695
00696
00697
00698
00699
00700
00701
00702
00703
00704
00705
00706
00707
00708
00709
00710
00711
00712
00713
00714
00715
00716
00717
00718
00719
00720
00721
00722
00723
00724
00725
00726
00727
00728
00729
00730
00731
00732
00733
00734
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
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
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
00787
00788 okfit = true;
00789 return okfit;
00790 }
00791
00792
00793 void KinematicFit::BuildVirtualParticle( int n) {
00794
00795
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;
00820 w[6] = 0.0;
00821 ew = ew + (wTrackInfit(itk).Ew()).similarity(dwdp);
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
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
00863
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
00880
00881
00882
00883
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
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
00924
00925
00926
00927
00928
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
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
00948 }
00949
00950
00951
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
00967
00968
00969
00970
00971
00972
00973
00974
00975
00976
00977
00978
00979
00980
00981
00982
00983
00984 int type = kc.Type();
00985 switch(type) {
00986 case Resonance: {
00987
00988
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
00998
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
01006 setD(m_nc,n,Dc);
01007 setDT(n, m_nc, Dc.T());
01008 }
01009
01010
01011
01012
01013
01014
01015
01016
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
01025
01026
01027
01028
01029
01030
01031
01032
01033 break;
01034 }
01035 case TotalEnergy: {
01036
01037
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
01046
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
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
01062
01063
01064
01065
01066 break;
01067 }
01068 case TotalMomentum: {
01069
01070
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
01080
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
01090 }
01091 HepVector dc(1, 0);
01092 dc[0] = pmis.rho() - ptot;
01093 m_d[m_nc] = dc[0];
01094 m_nc+=1;
01095
01096
01097
01098
01099
01100 break;
01101 }
01102
01103
01104
01105
01106
01107
01108
01109
01110
01111
01112
01113
01114
01115
01116
01117
01118
01119
01120
01121
01122
01123
01124
01125
01126
01127
01128
01129
01130
01131
01132
01133
01134
01135
01136
01137
01138
01139
01140
01141
01142
01143
01144
01145
01146
01147
01148
01149
01150
01151
01152
01153
01154
01155
01156
01157
01158
01159
01160
01161
01162
01163
01164
01165
01166
01167
01168
01169
01170 case ThreeMomentum: {
01171
01172
01173
01174
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
01183
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
01201 }
01202 m_nc += 3;
01203
01204
01205
01206
01207
01208
01209
01210
01211
01212
01213 break;
01214 }
01215 case EqualMass: {
01216
01217
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
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
01252
01253
01254
01255
01256
01257
01258
01259
01260
01261
01262
01263
01264
01265
01266
01267
01268
01269
01270
01271
01272
01273
01274
01275
01276
01277
01278
01279
01280 HepVector dc(1, 0);
01281 dc[0] = pmis1.m2() - pmis2.m2();
01282 m_d[m_nc] = dc[0];
01283
01284 m_nc+=1;
01285
01286
01287
01288
01289
01290
01291
01292
01293 break;
01294 }
01295 case FourMomentum:
01296 default: {
01297
01298
01299
01300
01301
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
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
01320
01321
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
01335
01336
01337
01338
01339
01340
01341
01342
01343
01344
01345
01346
01347
01348
01349
01350
01351
01352
01353
01354
01355
01356
01357
01358
01359 break;
01360 }
01361 }
01362 }
01363