BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
KinematicFit.cxx
Go to the documentation of this file.
1#include "VertexFit/KinematicFit.h"
2#include "TStopwatch.h"
3#include "VertexFit/HTrackParameter.h"
4#include "VertexFit/KinematicConstraints.h"
5
6const int KinematicFit::NTRKPAR = 3; // modify by yanl 2010.7.26 4---->3
7
8const int KinematicFit::Resonance = 1;
9const int KinematicFit::TotalEnergy = 2;
10const int KinematicFit::TotalMomentum = 4;
11const int KinematicFit::Position = 8;
12const int KinematicFit::ThreeMomentum = 16;
13const int KinematicFit::FourMomentum = 32;
14const int KinematicFit::EqualMass = 64;
15
16KinematicFit* KinematicFit::m_pointer = 0;
17
18KinematicFit* KinematicFit::instance() {
19 if ( m_pointer ) return m_pointer;
20 m_pointer = new KinematicFit();
21 return m_pointer;
22}
23
24KinematicFit::KinematicFit() { ; }
25
27 // if(m_pointer) delete m_pointer;
28}
29
34 // For Virtual Particles
35 // gamma shape
41 clearone();
42 cleartwo();
43 setBeamPosition( HepPoint3D( 0.0, 0.0, 0.0 ) );
44 setVBeamPosition( HepSymMatrix( 3, 0 ) );
45
46 //=============
47 m_kc.clear();
48 m_chisq.clear();
49 m_chi = 9999.;
50 m_niter = 10;
51 m_chicut = 200.;
52 m_chiter = 0.005;
53 m_espread = 0.0;
54 m_kalman = 0;
55 m_collideangle = 11e-3;
56 m_flag = 0;
57 m_dynamicerror = 0;
58 m_nc = 0;
59 m_cpu = HepVector( 10, 0 );
60 m_massvector = HepVector( 12, 0 );
61 m_virtual_wtrk.clear();
62}
63
64//
65// Add Resonance
66//
67
68void KinematicFit::AddResonance( int number, double mres, int n1 ) {
69 std::vector<int> tlis = AddList( n1 );
70 AddResonance( number, mres, tlis );
71}
72
73void KinematicFit::AddResonance( int number, double mres, int n1, int n2 ) {
74 std::vector<int> tlis = AddList( n1, n2 );
75 AddResonance( number, mres, tlis );
76}
77
78void KinematicFit::AddResonance( int number, double mres, int n1, int n2, int n3 ) {
79 std::vector<int> tlis = AddList( n1, n2, n3 );
80 AddResonance( number, mres, tlis );
81}
82
83void KinematicFit::AddResonance( int number, double mres, int n1, int n2, int n3, int n4 ) {
84 std::vector<int> tlis = AddList( n1, n2, n3, n4 );
85 AddResonance( number, mres, tlis );
86}
87
88void KinematicFit::AddResonance( int number, double mres, int n1, int n2, int n3, int n4,
89 int n5 ) {
90 std::vector<int> tlis = AddList( n1, n2, n3, n4, n5 );
91 AddResonance( number, mres, tlis );
92}
93
94void KinematicFit::AddResonance( int number, double mres, int n1, int n2, int n3, int n4,
95 int n5, int n6 ) {
96 std::vector<int> tlis = AddList( n1, n2, n3, n4, n5, n6 );
97 AddResonance( number, mres, tlis );
98}
99
100void KinematicFit::AddResonance( int number, double mres, int n1, int n2, int n3, int n4,
101 int n5, int n6, int n7 ) {
102 std::vector<int> tlis = AddList( n1, n2, n3, n4, n5, n6, n7 );
103 AddResonance( number, mres, tlis );
104}
105
106void KinematicFit::AddResonance( int number, double mres, int n1, int n2, int n3, int n4,
107 int n5, int n6, int n7, int n8 ) {
108 std::vector<int> tlis = AddList( n1, n2, n3, n4, n5, n6, n7, n8 );
109 AddResonance( number, mres, tlis );
110}
111
112void KinematicFit::AddResonance( int number, double mres, int n1, int n2, int n3, int n4,
113 int n5, int n6, int n7, int n8, int n9 ) {
114 std::vector<int> tlis = AddList( n1, n2, n3, n4, n5, n6, n7, n8, n9 );
115 AddResonance( number, mres, tlis );
116}
117
118void KinematicFit::AddResonance( int number, double mres, int n1, int n2, int n3, int n4,
119 int n5, int n6, int n7, int n8, int n9, int n10 ) {
120 std::vector<int> tlis = AddList( n1, n2, n3, n4, n5, n6, n7, n8, n9, n10 );
121 AddResonance( number, mres, tlis );
122}
123
124void KinematicFit::AddResonance( int number, double mres, int n1, int n2, int n3, int n4,
125 int n5, int n6, int n7, int n8, int n9, int n10, int n11 ) {
126 std::vector<int> tlis = AddList( n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11 );
127 AddResonance( number, mres, tlis );
128}
129
130void KinematicFit::AddResonance( int number, double mres, int n1, int n2, int n3, int n4,
131 int n5, int n6, int n7, int n8, int n9, int n10, int n11,
132 int n12 ) {
133 std::vector<int> tlis = AddList( n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11, n12 );
134 AddResonance( number, mres, tlis );
135}
136
137void KinematicFit::AddResonance( int number, double mres, std::vector<int> tlis ) {
139 HepSymMatrix Vre = HepSymMatrix( 1, 0 );
140 kc.ResonanceConstraints( mres, tlis, Vre );
141 m_kc.push_back( kc );
142 if ( (unsigned int)number != m_kc.size() - 1 )
143 std::cout << "wrong kinematic constraints index" << std::endl;
144}
145
146//
147// Add TotalMomentum
148//
149
150void KinematicFit::AddTotalMomentum( int number, double ptot, int n1 ) {
151 std::vector<int> tlis = AddList( n1 );
152 AddTotalMomentum( number, ptot, tlis );
153}
154void KinematicFit::AddTotalMomentum( int number, double ptot, int n1, int n2 ) {
155 std::vector<int> tlis = AddList( n1, n2 );
156 AddTotalMomentum( number, ptot, tlis );
157}
158
159void KinematicFit::AddTotalMomentum( int number, double ptot, int n1, int n2, int n3 ) {
160 std::vector<int> tlis = AddList( n1, n2, n3 );
161 AddTotalMomentum( number, ptot, tlis );
162}
163
164void KinematicFit::AddTotalMomentum( int number, double ptot, int n1, int n2, int n3,
165 int n4 ) {
166 std::vector<int> tlis = AddList( n1, n2, n3, n4 );
167 AddTotalMomentum( number, ptot, tlis );
168}
169
170void KinematicFit::AddTotalMomentum( int number, double ptot, int n1, int n2, int n3, int n4,
171 int n5 ) {
172 std::vector<int> tlis = AddList( n1, n2, n3, n4, n5 );
173 AddTotalMomentum( number, ptot, tlis );
174}
175
176void KinematicFit::AddTotalMomentum( int number, double ptot, int n1, int n2, int n3, int n4,
177 int n5, int n6 ) {
178 std::vector<int> tlis = AddList( n1, n2, n3, n4, n5, n6 );
179 AddTotalMomentum( number, ptot, tlis );
180}
181
182void KinematicFit::AddTotalMomentum( int number, double ptot, int n1, int n2, int n3, int n4,
183 int n5, int n6, int n7 ) {
184 std::vector<int> tlis = AddList( n1, n2, n3, n4, n5, n6, n7 );
185 AddTotalMomentum( number, ptot, tlis );
186}
187
188void KinematicFit::AddTotalMomentum( int number, double ptot, int n1, int n2, int n3, int n4,
189 int n5, int n6, int n7, int n8 ) {
190 std::vector<int> tlis = AddList( n1, n2, n3, n4, n5, n6, n7, n8 );
191 AddTotalMomentum( number, ptot, tlis );
192}
193
194void KinematicFit::AddTotalMomentum( int number, double ptot, int n1, int n2, int n3, int n4,
195 int n5, int n6, int n7, int n8, int n9 ) {
196 std::vector<int> tlis = AddList( n1, n2, n3, n4, n5, n6, n7, n8, n9 );
197 AddTotalMomentum( number, ptot, tlis );
198}
199
200void KinematicFit::AddTotalMomentum( int number, double ptot, int n1, int n2, int n3, int n4,
201 int n5, int n6, int n7, int n8, int n9, int n10 ) {
202 std::vector<int> tlis = AddList( n1, n2, n3, n4, n5, n6, n7, n8, n9, n10 );
203 AddTotalMomentum( number, ptot, tlis );
204}
205
206void KinematicFit::AddTotalMomentum( int number, double ptot, int n1, int n2, int n3, int n4,
207 int n5, int n6, int n7, int n8, int n9, int n10,
208 int n11 ) {
209 std::vector<int> tlis = AddList( n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11 );
210 AddTotalMomentum( number, ptot, tlis );
211}
212
213void KinematicFit::AddTotalMomentum( int number, double ptot, int n1, int n2, int n3, int n4,
214 int n5, int n6, int n7, int n8, int n9, int n10, int n11,
215 int n12 ) {
216 std::vector<int> tlis = AddList( n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11, n12 );
217 AddTotalMomentum( number, ptot, tlis );
218}
219
220void KinematicFit::AddTotalMomentum( int number, double ptot, std::vector<int> tlis ) {
222 kc.TotalMomentumConstraints( ptot, tlis );
223 m_kc.push_back( kc );
224 if ( (unsigned int)number != m_kc.size() - 1 )
225 std::cout << "wrong kinematic constraints index" << std::endl;
226}
227
228//
229// Add TotalEnergy
230//
231
232void KinematicFit::AddTotalEnergy( int number, double etot, int n1 ) {
233 std::vector<int> tlis = AddList( n1 );
234 AddTotalEnergy( number, etot, tlis );
235}
236void KinematicFit::AddTotalEnergy( int number, double etot, int n1, int n2 ) {
237 std::vector<int> tlis = AddList( n1, n2 );
238 AddTotalEnergy( number, etot, tlis );
239}
240
241void KinematicFit::AddTotalEnergy( int number, double etot, int n1, int n2, int n3 ) {
242 std::vector<int> tlis = AddList( n1, n2, n3 );
243 AddTotalEnergy( number, etot, tlis );
244}
245
246void KinematicFit::AddTotalEnergy( int number, double etot, int n1, int n2, int n3, int n4 ) {
247 std::vector<int> tlis = AddList( n1, n2, n3, n4 );
248 AddTotalEnergy( number, etot, tlis );
249}
250
251void KinematicFit::AddTotalEnergy( int number, double etot, int n1, int n2, int n3, int n4,
252 int n5 ) {
253 std::vector<int> tlis = AddList( n1, n2, n3, n4, n5 );
254 AddTotalEnergy( number, etot, tlis );
255}
256
257void KinematicFit::AddTotalEnergy( int number, double etot, int n1, int n2, int n3, int n4,
258 int n5, int n6 ) {
259 std::vector<int> tlis = AddList( n1, n2, n3, n4, n5, n6 );
260 AddTotalEnergy( number, etot, tlis );
261}
262
263void KinematicFit::AddTotalEnergy( int number, double etot, int n1, int n2, int n3, int n4,
264 int n5, int n6, int n7 ) {
265 std::vector<int> tlis = AddList( n1, n2, n3, n4, n5, n6, n7 );
266 AddTotalEnergy( number, etot, tlis );
267}
268
269void KinematicFit::AddTotalEnergy( int number, double etot, int n1, int n2, int n3, int n4,
270 int n5, int n6, int n7, int n8 ) {
271 std::vector<int> tlis = AddList( n1, n2, n3, n4, n5, n6, n7, n8 );
272 AddTotalEnergy( number, etot, tlis );
273}
274
275void KinematicFit::AddTotalEnergy( int number, double etot, int n1, int n2, int n3, int n4,
276 int n5, int n6, int n7, int n8, int n9 ) {
277 std::vector<int> tlis = AddList( n1, n2, n3, n4, n5, n6, n7, n8, n9 );
278 AddTotalEnergy( number, etot, tlis );
279}
280
281void KinematicFit::AddTotalEnergy( int number, double etot, int n1, int n2, int n3, int n4,
282 int n5, int n6, int n7, int n8, int n9, int n10 ) {
283 std::vector<int> tlis = AddList( n1, n2, n3, n4, n5, n6, n7, n8, n9, n10 );
284 AddTotalEnergy( number, etot, tlis );
285}
286
287void KinematicFit::AddTotalEnergy( int number, double etot, int n1, int n2, int n3, int n4,
288 int n5, int n6, int n7, int n8, int n9, int n10, int n11 ) {
289 std::vector<int> tlis = AddList( n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11 );
290 AddTotalEnergy( number, etot, tlis );
291}
292
293void KinematicFit::AddTotalEnergy( int number, double etot, int n1, int n2, int n3, int n4,
294 int n5, int n6, int n7, int n8, int n9, int n10, int n11,
295 int n12 ) {
296 std::vector<int> tlis = AddList( n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11, n12 );
297 AddTotalEnergy( number, etot, tlis );
298}
299
300void KinematicFit::AddTotalEnergy( int number, double etot, std::vector<int> tlis ) {
302 kc.TotalEnergyConstraints( etot, tlis );
303 m_kc.push_back( kc );
304 if ( (unsigned int)number != m_kc.size() - 1 )
305 std::cout << "wrong kinematic constraints index" << std::endl;
306}
307//
308// Equal Mass constraints
309//
310
311void KinematicFit::AddEqualMass( int number, std::vector<int> tlis1, std::vector<int> tlis2 ) {
313 HepSymMatrix Vne = HepSymMatrix( 1, 0 );
314 kc.EqualMassConstraints( tlis1, tlis2, Vne );
315 m_kc.push_back( kc );
316 if ( (unsigned int)number != m_kc.size() - 1 )
317 std::cout << "wrong kinematic constraints index" << std::endl;
318}
319
320//
321// Total 3-momentum constraints
322//
323
324void KinematicFit::AddThreeMomentum( int number, Hep3Vector p3 ) {
325 std::vector<int> tlis;
326 tlis.clear();
327 WTrackParameter wtrk;
329
330 for ( int i = 0; i < numberWTrack(); i++ ) { tlis.push_back( i ); }
331 kc.ThreeMomentumConstraints( p3, tlis );
332 m_kc.push_back( kc );
333 if ( (unsigned int)number != m_kc.size() - 1 )
334 std::cout << "wrong kinematic constraints index" << std::endl;
335}
336
337//
338// Total 4-momentum constraints
339//
340
341void KinematicFit::AddFourMomentum( int number, HepLorentzVector p4 ) {
342
343 std::vector<int> tlis;
344 tlis.clear();
346
347 for ( int i = 0; i < numberWTrack(); i++ ) { tlis.push_back( i ); }
348 // for(int i = 0; i < numberWTrack_V(); i++) {
349 // tlis_V.push_back(i);
350 // }
351
352 HepSymMatrix Vme = HepSymMatrix( 4, 0 );
353 Vme[0][0] = 2 * m_espread * m_espread * sin( m_collideangle ) * sin( m_collideangle );
354 Vme[0][3] = 2 * m_espread * m_espread * sin( m_collideangle );
355 Vme[3][3] = 2 * m_espread * m_espread;
356
357 // kc.FourMomentumConstraints(p4, tlis, Vme);
358 kc.FourMomentumConstraints( p4, tlis, Vme );
359 m_kc.push_back( kc );
360 if ( (unsigned int)number != m_kc.size() - 1 )
361 std::cout << "wrong kinematic constraints index" << std::endl;
362}
363
364void KinematicFit::AddFourMomentum( int number, double etot ) {
365
366 HepLorentzVector p4( 0.0, 0.0, 0.0, etot );
367 std::vector<int> tlis;
368 tlis.clear();
370
371 for ( int i = 0; i < numberWTrack(); i++ ) { tlis.push_back( i ); }
372 HepSymMatrix Vme = HepSymMatrix( 4, 0 );
373 Vme[3][3] = 2 * m_espread * m_espread;
374 // kc.FourMomentumConstraints(p4, tlis, Vme);
375 kc.FourMomentumConstraints( p4, tlis, Vme );
376 m_kc.push_back( kc );
377 if ( (unsigned int)number != m_kc.size() - 1 )
378 std::cout << "wrong kinematic constraints index" << std::endl;
379}
380/*
381 void KinematicFit::AddPosition(int number, HepPoint3D xorigin, std::vector<int> tlis_V){
382 KinematicConstraints kc;
383 HepSymMatrix Vpe = HepSymMatrix(2,0);
384 HepSymMatrix Vclus = HepSymMatrix (3,0);
385 Vclus[0][0] = wTrackOrigin_V(tlis_V[0]).Ew()[4][4];
386 Vclus[0][1] = wTrackOrigin_V(tlis_V[0]).Ew()[4][5];
387 Vclus[1][1] = wTrackOrigin_V(tlis_V[0]).Ew()[5][5];
388 Vclus[2][2] = wTrackOrigin_V(tlis_V[0]).Ew()[6][6];
389 HepMatrix p(2,3,0);
390 p[0][0] = wTrackOrigin_V(tlis_V[0]).w()[1];
391 p[0][1] = -wTrackOrigin_V(tlis_V[0]).w()[0];
392 p[1][0] = wTrackOrigin_V(tlis_V[0]).w()[2];
393 p[1][2] = -wTrackOrigin_V(tlis_V[0]).w()[0];
394 Vpe = Vclus.similarity(p);
395
396 kc.PositionConstraints(xorigin, tlis_V, Vpe);
397 m_kc.push_back(kc);
398 if((unsigned int) number != m_kc.size()-1)
399 std::cout << "wrong kinematic constraints index" << std::endl;
400 }
401 */
402
403void KinematicFit::fit() {
404
406 int nc = m_nc;
407 int ntrk = numberWTrack();
408
409 TStopwatch timer;
410 timer.Start();
411
412 m_VD = HepSymMatrix( m_nc, 0 );
413 m_VD = m_covOrigin.similarity( m_D );
414 timer.Stop();
415 m_cpu[1] += timer.CpuTime();
416 timer.Start();
417
418 int ifail;
419 m_VD.invert( ifail );
420
421 timer.Stop();
422 m_cpu[2] += timer.CpuTime();
423 timer.Start();
424
425 HepVector G( m_nc, 0 );
426 G = m_D * ( m_pOrigin - m_pInfit ) + m_d;
427
428 m_KP = HepMatrix( NTRKPAR * m_nktrk, m_nc, 0 );
429 m_KP = m_covOrigin * m_DT * m_VD;
430 m_chi = ( m_VD.similarity( G.T() ) )[0][0];
431
432 timer.Stop();
433 m_cpu[3] += timer.CpuTime();
434 timer.Start();
435
436 m_pInfit = m_pOrigin - m_KP * G;
437
438 // ===== gamma dynamic adjustment====
439
440 timer.Stop();
441 m_cpu[4] += timer.CpuTime();
442
443 timer.Start();
444 if ( m_dynamicerror == 1 ) gda();
445
446 timer.Stop();
447 m_cpu[6] += timer.CpuTime();
448}
449
450void KinematicFit::upCovmtx() {
451
452 int ntrk = numberWTrack();
453 HepSymMatrix I( NTRKPAR * m_nktrk, 1 );
454 m_covInfit = m_covOrigin.similarity( I - m_KP * m_D );
455 for ( int i = 0; i < m_nktrk; i++ )
456 {
457 HepSymMatrix ew3( 3, 0 );
458 HepSymMatrix ew6( 6, 0 );
459 HepSymMatrix Ew1( 7, 0 );
460 ew3 = m_covInfit.sub( i * NTRKPAR + 1, ( i + 1 ) * NTRKPAR );
461 for ( int j = 0; j < NTRKPAR; j++ )
462 {
463 for ( int k = 0; k < NTRKPAR; k++ ) { ew6[j][k] = ew3[j][k]; }
464 }
465 for ( int m = NTRKPAR; m < 6; m++ )
466 {
467 for ( int n = NTRKPAR; n < 6; n++ )
468 {
469 ew6[m][n] = 0; //(wTrackOrigin(i).Ew())[m+1][n+1];
470 }
471 }
472 double px = p4Infit( i ).px();
473 double py = p4Infit( i ).py();
474 double pz = p4Infit( i ).pz();
475 double m = p4Infit( i ).m();
476 double e = p4Infit( i ).e();
477
478 HepMatrix J( 7, 6, 0 );
479 J[0][0] = 1;
480 J[1][1] = 1;
481 J[2][2] = 1;
482 J[3][0] = px / e;
483 J[3][1] = py / e;
484 J[3][2] = pz / e;
485 J[4][3] = 1;
486 J[5][4] = 1;
487 J[6][5] = 1;
488 Ew1 = ew6.similarity( J );
489
490 HepVector W( 7, 0 );
491 for ( int j = 0; j < 4; j++ ) { W[j] = p4Infit( i )[j]; }
492 W[4] = wTrackOrigin( i ).w()[4];
493 W[5] = wTrackOrigin( i ).w()[5];
494 W[6] = wTrackOrigin( i ).w()[6];
495
496 WTrackParameter wtrk = wTrackInfit( i );
497 wtrk.setEw( Ew1 );
498 wtrk.setW( W );
499 setWTrackInfit( i, wtrk );
500 }
501}
502
503void KinematicFit::fit( int n ) {
504
505 if ( m_chisq.size() == 0 )
506 {
507 for ( unsigned int i = 0; i < m_kc.size(); i++ ) m_chisq.push_back( 9999.0 );
508 }
509 KinematicConstraints kc;
510 int nc = m_nc;
511 int ntrk = numberWTrack();
512
513 m_VD = HepSymMatrix( m_nc, 0 );
514 m_VD = m_covOrigin.similarity( m_D );
515 int ifail;
516 m_VD.invert( ifail );
517 HepVector G( m_nc, 0 );
518 G = m_D * ( m_pOrigin - m_pInfit ) + m_d;
519 m_KP = HepMatrix( NTRKPAR * m_nktrk, m_nc, 0 );
520 m_KP = m_covOrigin * m_DT * m_VD;
521 m_chisq[n] = ( m_VD.similarity( G.T() ) )[0][0];
522 m_pInfit = m_pOrigin - m_KP * G;
523}
524
525void KinematicFit::covMatrix( int n ) {
526 KinematicConstraints kc = m_kc[n];
527 int nc = kc.nc();
528 int ntrk = ( kc.Ltrk() ).size();
529 HepSymMatrix Va0( 7 * ntrk, 0 );
530 for ( int i = 0; i < ntrk; i++ )
531 {
532 int itk = ( kc.Ltrk() )[i];
533 for ( int j = 0; j < 7; j++ )
534 for ( int k = 0; k < 7; k++ )
535 Va0[7 * i + j][7 * i + k] = ( wTrackOrigin( itk ).Ew() )[j][k];
536 }
537 HepMatrix D( nc, 7 * ntrk, 0 );
538 int ncc = 0;
539 for ( int j = 0; j < kc.nc(); j++ )
540 {
541 for ( int l = 0; l < ntrk; l++ )
542 {
543 for ( int k = 0; k < 7; k++ ) D[ncc][7 * l + k] = ( kc.Dc()[l] )[j][k];
544 }
545 ncc++;
546 }
547
548 HepSymMatrix VD( nc, 0 );
549 VD = kc.VD()[0];
550 HepSymMatrix Va( 7 * ntrk, 0 );
551 Va = Va0 - ( VD.similarity( D.T() ) ).similarity( Va0 );
552 for ( int i = 0; i < ntrk; i++ )
553 {
554 int itk = ( kc.Ltrk() )[i];
555 HepVector w( 7, 0 );
556 HepSymMatrix Ew( 7, 0 );
557 for ( int j = 0; j < 7; j++ )
558 {
559 for ( int k = 0; k < 7; k++ ) Ew[j][k] = Va[7 * i + j][7 * i + k];
560 }
561 WTrackParameter wtrk = wTrackInfit( itk );
562 wtrk.setEw( Ew );
563 setWTrackInfit( itk, wtrk );
564 }
565 m_kc[n] = kc;
566}
567
569 bool okfit = false;
570 TStopwatch timer;
571 m_nktrk = numberWTrack();
572 m_pOrigin = HepVector( m_nktrk * NTRKPAR, 0 );
573 m_pInfit = HepVector( m_nktrk * NTRKPAR, 0 );
574 m_covOrigin = HepSymMatrix( m_nktrk * NTRKPAR, 0 );
575 m_covInfit = HepSymMatrix( m_nktrk * NTRKPAR, 0 );
576 m_massvector = HepVector( m_nktrk, 0 );
577 for ( int i = 0; i < numberWTrack(); i++ )
578 {
579 setWTrackInfit( i, wTrackOrigin( i ) );
580 setPOrigin( i, ( wTrackOrigin( i ).w() ).sub( 1, NTRKPAR ) );
581 setPInfit( i, ( wTrackOrigin( i ).w() ).sub( 1, NTRKPAR ) );
582 setCovOrigin( i, ( wTrackOrigin( i ).Ew() ).sub( 1, NTRKPAR ) );
583 setMassvector( i, wTrackOrigin( i ).mass() );
584 }
585
586 //
587 // iteration
588 //
589 // cout<<"m_pInfit ="<<m_pInfit<<endl;
590 // cout<<"m_covOrigin="<<m_covOrigin<<endl;
591 // cout<<"m_massvector ="<<m_massvector<<endl;
592
593 std::vector<double> chisq;
594 chisq.clear();
595 int nc = 0;
596 for ( int i = 0; i < m_kc.size(); i++ ) nc += m_kc[i].nc();
597
598 m_D = HepMatrix( nc, m_nktrk * NTRKPAR, 0 );
599 m_DT = HepMatrix( m_nktrk * NTRKPAR, nc, 0 );
600 m_d = HepVector( nc, 0 );
601
602 for ( int it = 0; it < m_niter; it++ )
603 {
604
605 timer.Start();
606 m_nc = 0;
607 for ( unsigned int i = 0; i < m_kc.size(); i++ )
608 {
609 KinematicConstraints kc = m_kc[i];
610 // std::vector<WTrackParameter> wlis;
611 // std::vector<WTrackParameter> wlis_V;
612 // wlis.clear();
613 // wlis_V.clear();
614 // for(unsigned int j = 0; j < (kc.Ltrk()).size(); j++) {
615 // int n = (kc.Ltrk())[j];
616 // WTrackParameter wtrk = wTrackInfit(n);
617 // if(m_espread!=0) wtrk = wTrackOrigin(n);
618 // wlis.push_back(wtrk);
619 // }
620 // for(unsigned int j = 0; j < (kc.Ltrk_V()).size(); j++) {
621 // int n = (kc.Ltrk_V())[j];
622 // WTrackParameter wtrk = wTrackInfit_V(n);
623 // wlis_V.push_back(wtrk);
624 // }
625 // kc.UpdateConstraints(wlis, wlis_V);
626 // m_kc[i] = kc;
627 // cout<<"wlis_V ="<<(wlis_V[0].w())[0]<<endl;
628 updateConstraints( kc );
629 // std::cout << "updata OK " << m_d << std::endl;
630 }
631 timer.Stop();
632 m_cpu[0] += timer.CpuTime();
633
634 fit();
635 chisq.push_back( m_chi );
636 if ( it > 0 )
637 {
638 double delchi = chisq[it] - chisq[it - 1];
639 if ( fabs( delchi ) < m_chiter ) break;
640 }
641 }
642 if ( m_chi >= m_chicut ) { return okfit; }
643 // update track parameter and its covariance matrix
644 // upTrkpar();
645 // covMatrix();
646 timer.Start();
647 // upCovmtx();
648 timer.Stop();
649 m_cpu[5] += timer.CpuTime();
650
651 okfit = true;
652
653 /*
654 for (int i = 0; i<numberWTrack(); i++){
655 if (wTrackOrigin(i).charge()==0) continue ;
656 HTrackParameter horigin = HTrackParameter(wTrackOrigin(i));
657 HTrackParameter hinfit = HTrackParameter(wTrackInfit(i));
658
659 HepVector a0 = horigin.hel();
660 HepVector a1 = hinfit.hel();
661 HepSymMatrix v0 = horigin.eHel();
662 HepSymMatrix v1 = hinfit.eHel();
663 HepVector pull(5,0);
664 for (int k=0; k<5; k++) {
665 pull[k] = (a0[k]-a1[k])/sqrt(abs(v0[k][k]-v1[k][k]));
666 }
667
668 WTrackParameter wtrk2 = wTrackInfit(i);
669 wtrk2.setPull(pull);
670 // for (int l=0;l<5; l++) {
671 //(wTrackInfit(i).pull())[l]=(wtrk2.pull())[l];
672 // }
673 setWTrackInfit(i, wtrk2);
674 }
675 */
676 /*/
677
678 for (int i = 0; i<numberWTrack_V(); i++){
679 //if (wTrackOrigin(i).charge()==0) continue ;
680 HTrackParameter horigin_V = HTrackParameter(wTrackOrigin_V(i));
681 HTrackParameter hinfit_V = HTrackParameter(wTrackInfit_V(i));
682
683 HepVector a0 = horigin.hel();
684 HepVector a1 = hinfit.hel();
685 HepSymMatrix v0 = horigin.eHel();
686 HepSymMatrix v1 = hinfit.eHel();
687 HepVector pull(5,0);
688 for (int k=0; k<5; k++) {
689 pull[k] = (a0[k]-a1[k])/sqrt(abs(v0[k][k]-v1[k][k]));
690 }
691
692 WTrackParameter wtrk2 = wTrackInfit(i);
693 wtrk2.setPull(pull);
694 // for (int l=0;l<5; l++) {
695 //(wTrackInfit(i).pull())[l]=(wtrk2.pull())[l];
696 // }
697 setWTrackInfit(i, wtrk2);
698 }
699 */
700
701 return okfit;
702}
703
704bool KinematicFit::Fit( int n ) {
705 bool okfit = false;
706 if ( n < 0 || (unsigned int)n >= m_kc.size() ) return okfit;
707
708 m_nktrk = numberWTrack();
709 m_pOrigin = HepVector( m_nktrk * NTRKPAR, 0 );
710 m_pInfit = HepVector( m_nktrk * NTRKPAR, 0 );
711 m_covOrigin = HepSymMatrix( m_nktrk * NTRKPAR, 0 );
712 m_covInfit = HepSymMatrix( m_nktrk * NTRKPAR, 0 );
713 m_massvector = HepVector( m_nktrk * NTRKPAR, 0 );
714 for ( int i = 0; i < numberWTrack(); i++ )
715 {
716 setWTrackInfit( i, wTrackOrigin( i ) );
717 setPOrigin( i, ( wTrackOrigin( i ).w() ).sub( 1, NTRKPAR ) );
718 setPInfit( i, ( wTrackOrigin( i ).w() ).sub( 1, NTRKPAR ) );
719 setCovOrigin( i, ( wTrackOrigin( i ).Ew() ).sub( 1, NTRKPAR ) );
720 setMassvector( i, wTrackOrigin( i ).mass() );
721 }
722
723 //
724 // iteration loop
725 //
726
727 std::vector<double> chisq;
728 chisq.clear();
729
730 m_D = HepMatrix( m_kc[n].nc(), m_nktrk * NTRKPAR, 0 );
731 m_DT = HepMatrix( m_nktrk * NTRKPAR, m_kc[n].nc(), 0 );
732 m_d = HepVector( m_kc[n].nc(), 0 );
733
734 for ( int it = 0; it < m_niter; it++ )
735 {
736 m_nc = 0;
737 KinematicConstraints kc = m_kc[n];
738 updateConstraints( kc );
739 // m_kc[n] = kc;
740 fit( n );
741
742 chisq.push_back( m_chisq[n] );
743 if ( it > 0 )
744 {
745 double delchi = chisq[it] - chisq[it - 1];
746 if ( fabs( delchi ) < m_chiter ) break;
747 }
748 }
749
750 if ( m_chisq[n] >= m_chicut ) return okfit;
751 // ====update cov====
752 // upCovmtx();
753 okfit = true;
754 return okfit;
755}
756
758 //
759 // q = p1 + p2 + ... + pn
760 //
761 upCovmtx();
762 KinematicConstraints kc = m_kc[n];
763 int ntrk = ( kc.Ltrk() ).size();
764 int charge = 0;
765 HepVector w( 7, 0 );
766 HepSymMatrix ew( 7, 0 );
767 HepMatrix dwdp( 7, 7, 0 );
768 dwdp[0][0] = 1;
769 dwdp[1][1] = 1;
770 dwdp[2][2] = 1;
771 dwdp[3][3] = 1;
772 dwdp[4][4] = 1;
773 dwdp[5][5] = 1;
774 dwdp[6][6] = 1;
775 for ( int i = 0; i < ntrk; i++ )
776 {
777 int itk = ( kc.Ltrk() )[i];
778 charge += wTrackInfit( itk ).charge();
779 w[0] = w[0] + wTrackInfit( itk ).w()[0];
780 w[1] = w[1] + wTrackInfit( itk ).w()[1];
781 w[2] = w[2] + wTrackInfit( itk ).w()[2];
782 w[3] = w[3] + wTrackInfit( itk ).w()[3];
783 w[4] = 0.0; //
784 w[5] = 0.0; // set virtual particle's vertex at (0,0,0)
785 w[6] = 0.0; //
786 ew = ew +
787 ( wTrackInfit( itk ).Ew() ).similarity( dwdp ); // the vertex matrix of this
788 // particles is not correct, because
789 // we do not use vertex information in
790 // kinematicfit, so ...
791 }
792 double m = sqrt( w[3] * w[3] - w[0] * w[0] - w[1] * w[1] - w[2] * w[2] );
793 WTrackParameter vwtrk;
794 vwtrk.setCharge( charge );
795 vwtrk.setW( w );
796 vwtrk.setEw( ew );
797 vwtrk.setMass( m );
798 m_virtual_wtrk.push_back( vwtrk );
799}
800
801void KinematicFit::gda() {
802 for ( int i = 0; i < numberWTrack(); i++ )
803 {
804
805 if ( ( wTrackOrigin( i ) ).type() == 2 )
806 {
807 int n=0;
808 for ( int j = 0; j < numberGammaShape(); j++ )
809 {
810 if ( i == GammaShapeList( j ) ) n = j;
811 }
812 HepSymMatrix Ew( NTRKPAR, 0 );
813 HepLorentzVector p1 = p4Infit( i );
814 double eorigin = pOrigin( i )[3];
815 // cout<<"p1 ="<<p1<<endl;
816 HepMatrix dwda1( NTRKPAR, 3, 0 );
817 dwda1[0][0] = -p1.py();
818 dwda1[1][0] = p1.px();
819 dwda1[0][1] = p1.px() * p1.pz() / p1.perp();
820 dwda1[1][1] = p1.py() * p1.pz() / p1.perp();
821 dwda1[2][1] = -p1.perp();
822 dwda1[0][2] = p1.px() / p1.rho();
823 dwda1[1][2] = p1.py() / p1.rho();
824 dwda1[2][2] = p1.pz() / p1.rho();
825 dwda1[3][2] = p1.rho() / p1.e();
826 HepSymMatrix emcmea1( 3, 0 );
827 double pk = p1[3];
828 emcmea1[0][0] = GammaShapeValue( n ).getdphi() * GammaShapeValue( n ).getdphi();
829 emcmea1[1][1] = GammaShapeValue( n ).getdthe() * GammaShapeValue( n ).getdthe();
830 emcmea1[2][2] =
831 GammaShapeValue( n ).de( eorigin, pk ) * GammaShapeValue( n ).de( eorigin, pk );
832 Ew = emcmea1.similarity( dwda1 );
833 // cout<<"emcmea1 ="<<emcmea1<<endl;
834 // cout<<"Ew ="<<Ew<<endl;
835 setCovOrigin( i, Ew );
836 }
837 }
838}
839
840HepVector KinematicFit::pull( int n ) {
841 upCovmtx();
842
843 if ( wTrackOrigin( n ).charge() != 0 )
844 {
845 HepVector W( 6, 0 );
846 HepSymMatrix Ew( 6, 0 );
847 HepVector W1( 7, 0 );
848 HepSymMatrix Ew1( 7, 0 );
850 // W = wTrackOrigin(n).w();
851 // Ew = wTrackOrigin(n).Ew();
852 // cout<<"===Origin status==="<<endl;
853 // cout<<"W = "<<W<<endl;
854 // cout<<"Ew ="<<Ew<<endl;
855 for ( int i = 0; i < 3; i++ ) { W[i] = pInfit( n )[i]; }
856 W[3] = wTrackOrigin( n ).w()[4];
857 W[4] = wTrackOrigin( n ).w()[5];
858 W[5] = wTrackOrigin( n ).w()[6];
859 for ( int j = 0; j < 3; j++ )
860 {
861 for ( int k = 0; k < 3; k++ ) { Ew[j][k] = covInfit( n )[j][k]; }
862 }
863
864 for ( int j = 3; j < 6; j++ )
865 {
866 for ( int k = 3; k < 6; k++ ) { Ew[j][k] = wTrackOrigin( n ).Ew()[j + 1][k + 1]; }
867 }
868 //
869 // define J matrix to transfer 3 parameters to 4 parameters
870 //
871 double px = p4Infit( n ).px();
872 double py = p4Infit( n ).py();
873 double pz = p4Infit( n ).pz();
874 double e = p4Infit( n ).e();
875 HepMatrix J( 7, 6, 0 );
876 J[0][0] = 1;
877 J[1][1] = 1;
878 J[2][2] = 1;
879 J[3][0] = px / e;
880 J[3][1] = py / e;
881 J[3][2] = pz / e;
882 J[4][3] = 1;
883 J[5][4] = 1;
884 J[6][5] = 1;
885 W1 = J * W;
886 Ew1 = Ew.similarity( J );
887
888 // cout<<"===Infiddt status==="<<endl;
889 // cout<<"p4 ="<<p4Infit(n)<<endl;
890 // cout<<"W ="<<wTrackOrigin(n).w()<<endl;
891 // cout<<"W1 ="<<W1<<endl;
892 // cout<<"Ew ="<<wTrackOrigin(n).Ew()<<endl;
893 // cout<<"Ew1 ="<<Ew1<<endl;
894
895 wtrk.setW( W1 );
896 wtrk.setEw( Ew1 );
897 setWTrackInfit( n, wtrk );
900
901 HepVector a0 = horigin.hel();
902 HepVector a1 = hinfit.hel();
903 HepSymMatrix v0 = horigin.eHel();
904 HepSymMatrix v1 = hinfit.eHel();
905 HepVector pull( 11, 0 );
906 for ( int k = 0; k < 5; k++ )
907 {
908 pull[k] = ( a0[k] - a1[k] ) / sqrt( abs( v0[k][k] - v1[k][k] ) );
909 // cout<<"pull ["<<k<<"] ="<<pull[k]<<endl;
910 }
911 for ( int l = 5; l < 9; l++ )
912 {
913 pull[l] = ( wTrackOrigin( n ).w()[l - 5] - wTrackInfit( n ).w()[l - 5] ) /
914 sqrt( abs( wTrackOrigin( n ).Ew()[l - 5][l - 5] -
915 wTrackInfit( n ).Ew()[l - 5][l - 5] ) );
916 // cout<<"pull ["<<l<<"] ="<<pull[l]<<endl;
917 }
918
919 // pull[9] = wTrackOrigin(n).w()[3] - wTrackInfit(n).w()[3];
920 // pull[10] =1/sqrt(abs(wTrackOrigin(n).Ew()[3][3] -
921 // wTrackInfit(n).Ew()[3][3]));
922 return pull;
923 }
924 else
925 {
926 HepVector pull( 3, 0 );
927 for ( int m = 0; m < 3; m++ )
928 {
929 pull[m] = ( wTrackOrigin( n ).w()[m] - wTrackInfit( n ).w()[m] ) /
930 sqrt( abs( wTrackOrigin( n ).Ew()[m][m] - wTrackInfit( n ).Ew()[m][m] ) );
931 }
932 return pull;
933 }
934}
935
936void KinematicFit::updateConstraints( KinematicConstraints k ) {
938
939 // std::vector<HepLorentzVector> wlis;
940 // std::vector<WTrackParameter> wlis_V;
941 // wlis.clear();
942 // wlis_V.clear();
943 // for(unsigned int j = 0; j < (kc.Ltrk()).size(); j++) {
944 // int n = (kc.Ltrk())[j];
945 // HepVec wtrk = wTrackInfit(n);
946 // if(m_espread!=0) wtrk = wTrackOrigin(n);
947
948 // wlis.push_back(p4Infit(n));
949 // }
950 // for(unsigned int j = 0; j < (kc.Ltrk_V()).size(); j++) {
951 // int n = (kc.Ltrk_V())[j];
952 // WTrackParameter wtrk = wTrackInfit_V(n);
953 // wlis_V.push_back(wtrk);
954 // }
955
956 int type = kc.Type();
957 switch ( type )
958 {
959 case Resonance: {
960 //
961 // E^2 - px^2 - py^2 - pz^2 = mres^2
962 //
963 double mres = kc.mres();
964 HepLorentzVector pmis;
965 for ( unsigned int j = 0; j < ( kc.Ltrk() ).size(); j++ )
966 {
967 int n = ( kc.Ltrk() )[j];
968
969 pmis = pmis + p4Infit( n );
970 }
971 // for(unsigned int i = 0; i < wlis_V.size(); i++)
972 // pmis = pmis + wlis_V[i].p();
973 for ( unsigned int j = 0; j < ( kc.Ltrk() ).size(); j++ )
974 {
975 int n = ( kc.Ltrk() )[j];
976 HepMatrix Dc( 1, NTRKPAR, 0 );
977 Dc[0][0] = -2 * pmis.px() + 2 * pmis.e() * p4Infit( n ).px() / p4Infit( n ).e();
978 Dc[0][1] = -2 * pmis.py() + 2 * pmis.e() * p4Infit( n ).py() / p4Infit( n ).e();
979 Dc[0][2] = -2 * pmis.pz() + 2 * pmis.e() * p4Infit( n ).pz() / p4Infit( n ).e();
980 // Dc[0][3] = 2 * pmis.e();
981 setD( m_nc, n, Dc );
982 setDT( n, m_nc, Dc.T() );
983 }
984
985 // for(unsigned int i = 0; i < wlis_V.size(); i++) {
986 // HepMatrix Dc_V(1, 7, 0);
987 // Dc_V[0][0] = -2 * pmis.px();
988 // Dc_V[0][1] = -2 * pmis.py();
989 // Dc_V[0][2] = -2 * pmis.pz();
990 // Dc_V[0][3] = 2 * pmis.e();
991 // m_Dc_V.push_back(Dc_V);
992 // }
993
994 HepVector dc( 1, 0 );
995 dc[0] = pmis.m2() - mres * mres;
996 m_d[m_nc] = dc[0];
997 m_nc += 1;
998 // std::cout << "etot = " << dc[0] <<" , " << mres<< std::endl;
999 // m_dc.push_back(dc);
1000 // HepVector lambda(1, 0);
1001 // m_lambda.push_back(lambda);
1002 // HepSymMatrix vd(1, 0);
1003 // m_VD.push_back(vd);
1004 // HepSymMatrix V6 = m_Vre;
1005 // m_Vm.push_back(V6);
1006
1007 break;
1008 }
1009 case TotalEnergy: {
1010 //
1011 // E - Etot = 0
1012 //
1013 double etot = kc.etot();
1014 HepLorentzVector pmis;
1015 for ( unsigned int j = 0; j < ( kc.Ltrk() ).size(); j++ )
1016 {
1017 int n = ( kc.Ltrk() )[j];
1018 pmis = pmis + p4Infit( n );
1019 }
1020 // for(unsigned int i = 0; i < wlis.size(); i++)
1021 // pmis = pmis + wlis[i].p();
1022 for ( unsigned int j = 0; j < ( kc.Ltrk() ).size(); j++ )
1023 {
1024 int n = ( kc.Ltrk() )[j];
1025 HepMatrix Dc( 1, NTRKPAR, 0 );
1026 Dc[0][0] = p4Infit( n ).px() / p4Infit( n ).e();
1027 Dc[0][1] = p4Infit( n ).py() / p4Infit( n ).e();
1028 Dc[0][2] = p4Infit( n ).pz() / p4Infit( n ).e();
1029 // Dc[0][3] = 1.0;
1030 setD( m_nc, n, Dc );
1031 setDT( n, m_nc, Dc.T() );
1032 }
1033 HepVector dc( 1, 0 );
1034 dc[0] = pmis.e() - etot;
1035 m_d[m_nc] = dc[0];
1036 m_nc += 1;
1037 // m_dc.push_back(dc);
1038 // HepVector lambda(1, 0);
1039 // m_lambda.push_back(lambda);
1040 // HepSymMatrix vd(1, 0);
1041 // m_VD.push_back(vd);
1042 break;
1043 }
1044 case TotalMomentum: {
1045 //
1046 // sqrt(px^2+py^2+pz^2) - ptot = 0
1047 //
1048 double ptot = kc.ptot();
1049 HepLorentzVector pmis;
1050 for ( unsigned int j = 0; j < ( kc.Ltrk() ).size(); j++ )
1051 {
1052 int n = ( kc.Ltrk() )[j];
1053 pmis = pmis + p4Infit( n );
1054 }
1055
1056 // for(unsigned int i = 0; i < wlis.size(); i++)
1057 // pmis = pmis + wlis[i].p();
1058 for ( unsigned int j = 0; j < ( kc.Ltrk() ).size(); j++ )
1059 {
1060 int n = ( kc.Ltrk() )[j];
1061 HepMatrix Dc( 1, NTRKPAR, 0 );
1062 Dc[0][0] = pmis.px() / pmis.rho();
1063 Dc[0][1] = pmis.py() / pmis.rho();
1064 Dc[0][2] = pmis.pz() / pmis.rho();
1065 setD( m_nc, n, Dc );
1066 setDT( n, m_nc, Dc.T() );
1067 // m_Dc.push_back(Dc);
1068 }
1069 HepVector dc( 1, 0 );
1070 dc[0] = pmis.rho() - ptot;
1071 m_d[m_nc] = dc[0];
1072 m_nc += 1;
1073 // m_dc.push_back(dc);
1074 // HepVector lambda(1, 0);
1075 // m_lambda.push_back(lambda);
1076 // HepSymMatrix vd(1, 0);
1077 // m_VD.push_back(vd);
1078 break;
1079 }
1080 /*
1081 case kc.typePoint(): {
1082 HepPoint3D point = kc.point();
1083 double flightpath;
1084 HepMatrix p(2,3,0);
1085
1086 HepSymMatrix Vp(2,0);
1087 for(unsigned int i = 0; i < wlis.size(); i++) {
1088 HepMatrix Dc(2, 7, 0);
1089 m_Dc.push_back(Dc);
1090 }
1091 // wlis_V.size() should be 1
1092 for(unsigned int i = 0; i < wlis_V.size(); i++) {
1093 // HepMatrix Dc(3, 7, 0);
1094 // m_Dc.push_back(Dc);
1095 HepMatrix Dc_V(2, 7, 0);
1096 HepSymMatrix Vclus(3, 0);
1097 for(unsigned int j = 0; j < 3; j++){
1098 for(unsigned int k = j; k < 3; k++){
1099 Vclus[j][k] = wlis_V[i].Ew()[j+4][k+4];
1100 }
1101 }
1102 cout<<"Vclus ="<<Vclus<<endl;
1103 p[0][0] = wlis_V[i].w()[1];
1104 p[0][1] = -wlis_V[i].w()[0];
1105 p[1][0] = wlis_V[i].w()[2];
1106 p[1][2] = -wlis_V[i].w()[0];
1107 Vp = Vclus.similarity(p);
1108 cout<<"Vp ="<<Vp<<endl;
1109 Dc_V[0][0] = -(wlis_V[i].w()[5] - point[1]);
1110 Dc_V[0][1] = wlis_V[i].w()[4] - point[0];
1111 Dc_V[0][4] = wlis_V[i].w()[1];
1112 Dc_V[0][5] = -wlis_V[i].w()[0];
1113
1114 Dc_V[1][0] = -(wlis_V[i].w()[6] - point[2]);
1115 Dc_V[1][2] = wlis_V[i].w()[4] - point[0];
1116 Dc_V[1][4] = wlis_V[i].w()[2];
1117 Dc_V[1][6] = -wlis_V[i].w()[0];
1118
1119 // HepMatrix q_x(3,1,0) ;
1120 // q_x[0][0] = 1;
1121 // HepMatrix deltaX_x(3,1,0) ;
1122 // deltaX_x[0][0] = 1;
1123 // HepMatrix p1_x = -(q_x.T()*Vclus.inverse(iver)*deltaX)*p2 +
1124 p1*(q_x.T()*Vclus.inverse(iver)*q + q.T()*Vclus.inverse(iver)*q_x);
1125 // HepMatrix p2_x = p2*p2;
1126
1127 // HepMatrix q_y(3,1,0) ;
1128 // q_y[1][0] = 1;
1129 // HepMatrix deltaX_y(3,1,0);
1130 // deltaX_y[1][0] = 1;
1131 // HepMatrix p1_y = -(q_y.T()*Vclus.inverse(iver)*deltaX)*p2 +
1132 p1*(q_y.T()*Vclus.inverse(iver)*q + q.T()*Vclus.inverse(iver)*q_y);
1133 // HepMatrix p2_y = p2*p2;
1134
1135 // HepMatrix q_z(3,1,0);
1136 // q_z[2][0] = 1;
1137 // HepMatrix deltaX_z(3,1,0);
1138 // deltaX_z[2][0] = 1;
1139 // Hw()[0]<<endl;
1140 //cout<<"dc[0] ="<<dc[0]<<endl;
1141 dc[1] = (wlis_V[i].w()[4] - point[0])*wlis_V[i].w()[2] - (wlis_V[i].w()[6] -
1142 point[2])*wlis_V[i].w()[0]; m_dc.push_back(dc);
1143 }
1144 HepSymMatrix V3 = Vp;
1145 m_Vm.push_back(V3);
1146 break;
1147 }
1148 */
1149
1150 case ThreeMomentum: {
1151 //
1152 // px - p3x = 0
1153 // py - p3y = 0
1154 // pz - p3z = 0
1155 //
1156 Hep3Vector p3 = kc.p3();
1157 HepLorentzVector pmis;
1158 for ( unsigned int j = 0; j < ( kc.Ltrk() ).size(); j++ )
1159 {
1160 int n = ( kc.Ltrk() )[j];
1161 pmis = pmis + p4Infit( n );
1162 }
1163 // for(unsigned int i = 0; i < wlis.size(); i++)
1164 // pmis = pmis + wlis[i].p();
1165 for ( unsigned int j = 0; j < ( kc.Ltrk() ).size(); j++ )
1166 {
1167 int n = ( kc.Ltrk() )[j];
1168
1169 HepMatrix Dc( kc.nc(), NTRKPAR, 0 );
1170 Dc[0][0] = 1.0;
1171 Dc[1][1] = 1.0;
1172 Dc[2][2] = 1.0;
1173 HepVector dc( kc.nc(), 0 );
1174 dc[0] = pmis.px() - p3.x();
1175 dc[1] = pmis.py() - p3.y();
1176 dc[2] = pmis.pz() - p3.z();
1177 for ( int i = 0; i < kc.nc(); i++ )
1178 {
1179 setD( m_nc + i, n, Dc.sub( i + 1, i + 1, 1, NTRKPAR ) );
1180 setDT( n, m_nc + i, ( Dc.sub( i + 1, i + 1, 1, NTRKPAR ) ).T() );
1181 m_d[m_nc + i] = dc[i];
1182 }
1183 // m_Dc.push_back(Dc);
1184 }
1185 m_nc += 3;
1186
1187 // HepVector dc(3, 0);
1188 // dc[0] = pmis.px() - p3.x();
1189 // dc[1] = pmis.py() - p3.y();
1190 // dc[2] = pmis.pz() - p3.z();
1191 // m_dc.push_back(dc);
1192 // HepVector lambda(3, 0);
1193 // m_lambda.push_back(lambda);
1194 // HepSymMatrix vd(3, 0);
1195 // m_VD.push_back(vd);
1196 break;
1197 }
1198 case EqualMass: {
1199 //
1200 // (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
1201 //
1202
1203 int isiz = ( kc.numEqual() )[0];
1204 HepLorentzVector pmis1, pmis2;
1205 for ( int n = 0; n < isiz; n++ )
1206 {
1207 int n1 = ( kc.Ltrk() )[n];
1208 pmis1 = pmis1 + p4Infit( n1 );
1209 }
1210 int jsiz = ( kc.numEqual() )[1];
1211 for ( int n = 0; n < jsiz; n++ )
1212 {
1213 int n2 = ( kc.Ltrk() )[n + isiz];
1214 pmis2 = pmis2 + p4Infit( n2 );
1215 }
1216 for ( int i = 0; i < isiz; i++ )
1217 {
1218 int n1 = ( kc.Ltrk() )[i];
1219 HepMatrix Dc( 1, NTRKPAR, 0 );
1220 Dc[0][0] = -2 * pmis1.px() + 2 * pmis1.e() * p4Infit( n1 ).px() / p4Infit( n1 ).e();
1221 Dc[0][1] = -2 * pmis1.py() + 2 * pmis1.e() * p4Infit( n1 ).py() / p4Infit( n1 ).e();
1222 Dc[0][2] = -2 * pmis1.pz() + 2 * pmis1.e() * p4Infit( n1 ).pz() / p4Infit( n1 ).e();
1223 // Dc[0][3] = 2 * pmis1.e();
1224 setD( m_nc, n1, Dc );
1225 setDT( n1, m_nc, Dc.T() );
1226 }
1227 for ( int i = 0; i < jsiz; i++ )
1228 {
1229 int n2 = ( kc.Ltrk() )[i + isiz];
1230 HepMatrix Dc( 1, NTRKPAR, 0 );
1231 Dc[0][0] = 2 * pmis2.px() - 2 * pmis2.e() * p4Infit( n2 ).px() / p4Infit( n2 ).e();
1232 Dc[0][1] = 2 * pmis2.py() - 2 * pmis2.e() * p4Infit( n2 ).py() / p4Infit( n2 ).e();
1233 Dc[0][2] = 2 * pmis2.pz() - 2 * pmis2.e() * p4Infit( n2 ).pz() / p4Infit( n2 ).e();
1234 Dc[0][3] = -2 * pmis2.e();
1235 setD( m_nc, n2, Dc );
1236 setDT( n2, m_nc, Dc.T() );
1237 }
1238 // int isiz_V = m_nequal_V[0];
1239 // HepLorentzVector pmis1_V, pmis2_V;
1240 // if(isiz_V > 0){
1241 // for(int n = 0; n < isiz_V; n++) {
1242 // pmis1_V = pmis1_V + wlis_V[n].p();
1243 // }
1244 // }
1245 // int jsiz_V = m_nequal_V[1];
1246 // if(jsiz_V > 0) {
1247 // for(int n = 0; n < jsiz_V; n++)
1248 // pmis2_V = pmis2_V + wlis_V[isiz_V+n].p();
1249 // }
1250
1251 // for(int i = 0; i < isiz_V; i++) {
1252 // HepMatrix Dc_V(1, 7, 0);
1253 // Dc_V[0][0] = -2 * pmis1_V.px();
1254 // Dc_V[0][1] = -2 * pmis1_V.py();
1255 // Dc_V[0][2] = -2 * pmis1_V.pz();
1256 // Dc_V[0][3] = 2 * pmis1_V.e();
1257 // m_Dc_V.push_back(Dc_V);
1258 // }
1259 // for(int i = isiz_V; i < isiz_V+jsiz_V; i++) {
1260 // HepMatrix Dc_V(1, 7, 0);
1261 // Dc_V[0][0] = 2 * pmis2_V.px();
1262 // Dc_V[0][1] = 2 * pmis2_V.py();
1263 // Dc_V[0][2] = 2 * pmis2_V.pz();
1264 // Dc_V[0][3] = -2 * pmis2_V.e();
1265 // m_Dc_V.push_back(Dc_V);
1266 // }
1267 HepVector dc( 1, 0 );
1268 dc[0] = pmis1.m2() - pmis2.m2(); // + pmis1_V.m2() - pmis2_V.m2();
1269 m_d[m_nc] = dc[0];
1270
1271 m_nc += 1;
1272 // m_dc.push_back(dc);
1273 // HepVector lambda(1, 0);
1274 // m_lambda.push_back(lambda);
1275 // HepSymMatrix vd(1, 0);
1276 // m_VD.push_back(vd);
1277 // HepSymMatrix V2 = m_Vne;
1278 // m_Vm.push_back(V2);
1279 // std::cout <<"m_Vm[0] ="<<m_Vm[0]<<std::endl;
1280 break;
1281 }
1282 case FourMomentum:
1283 default: {
1284 //
1285 // px - p4x = 0
1286 // py - p4y = 0
1287 // pz - p4z = 0
1288 // e - p4e = 0
1289 //
1290 HepLorentzVector p4 = kc.p4();
1291 HepLorentzVector pmis;
1292 for ( unsigned int j = 0; j < ( kc.Ltrk() ).size(); j++ )
1293 {
1294 int n = ( kc.Ltrk() )[j];
1295 pmis = pmis + p4Infit( n );
1296 }
1297 // HepLorentzVector pmis_V;
1298 for ( unsigned int j = 0; j < ( kc.Ltrk() ).size(); j++ )
1299 {
1300 int n = ( kc.Ltrk() )[j];
1301 HepMatrix Dc( kc.nc(), NTRKPAR, 0 );
1302 Dc[0][0] = 1.0;
1303 Dc[1][1] = 1.0;
1304 Dc[2][2] = 1.0;
1305 Dc[3][0] = p4Infit( n ).px() / p4Infit( n ).e();
1306 Dc[3][1] = p4Infit( n ).py() / p4Infit( n ).e();
1307 Dc[3][2] = p4Infit( n ).pz() / p4Infit( n ).e();
1308 // Dc[3][3] = 1.0;
1309
1310 // m_Dc.push_back(Dc);
1311 HepVector dc( kc.nc(), 0 );
1312 dc[0] = pmis.px() - p4.px();
1313 dc[1] = pmis.py() - p4.py();
1314 dc[2] = pmis.pz() - p4.pz();
1315 dc[3] = pmis.e() - p4.e();
1316 for ( int i = 0; i < kc.nc(); i++ )
1317 {
1318 setD( m_nc + i, n, Dc.sub( i + 1, i + 1, 1, NTRKPAR ) );
1319 setDT( n, m_nc + i, ( Dc.sub( i + 1, i + 1, 1, NTRKPAR ) ).T() );
1320 m_d[m_nc + i] = dc[i];
1321 }
1322 }
1323 m_nc += 4;
1324 // for(unsigned int i = 0; i < wlis_V.size(); i++)
1325 // pmis_V = pmis_V + wlis_V[i].p();
1326 // for(unsigned int i = 0; i < wlis_V.size(); i++) {
1327 // HepMatrix Dc_V(4, 7, 0);
1328 // Dc_V[0][0] = 1.0;
1329 // Dc_V[1][1] = 1.0;
1330 // Dc_V[2][2] = 1.0;
1331 // Dc_V[3][3] = 1.0;
1332 // m_Dc_V.push_back(Dc_V);
1333 // }
1334
1335 // HepVector dc(4, 0);
1336 // dc[0] = pmis.px() + pmis_V.px() - p4.px();
1337 // dc[1] = pmis.py() + pmis_V.py() - p4.py();
1338 // dc[2] = pmis.pz() + pmis_V.pz() - p4.pz();
1339 // dc[3] = pmis.e() + pmis_V.e() - p4.e();
1340 // m_dc.push_back(dc);
1341
1342 // HepSymMatrix V1 = m_Vme;
1343 // m_Vm.push_back(V1);
1344 // HepVector lambda(4, 0);
1345 // m_lambda.push_back(lambda);
1346 // HepSymMatrix vd(4, 0);
1347 // m_VD.push_back(vd);
1348
1349 break;
1350 }
1351 }
1352}
double p1[4]
double mass
HepGeom::Point3D< double > HepPoint3D
const Int_t n
Double_t etot
character *LEPTONflag integer iresonances real zeta5 real a0
double w
int dc[18]
Definition EvtPycont.cc:63
const DifComplex I
int n2
Definition SD0Tag.cxx:59
int n1
Definition SD0Tag.cxx:58
void FourMomentumConstraints(const HepLorentzVector p4, std::vector< int > tlis, HepSymMatrix Vme)
void ResonanceConstraints(const double mres, std::vector< int > tlis, HepSymMatrix Vre)
void ThreeMomentumConstraints(const Hep3Vector p3, std::vector< int > tlis)
void TotalEnergyConstraints(const double etot, std::vector< int > tlis)
void TotalMomentumConstraints(const double ptot, std::vector< int > tlis)
void EqualMassConstraints(std::vector< int > tlis1, std::vector< int > tlis2, HepSymMatrix Vne)
static KinematicFit * instance()
void BuildVirtualParticle(int number)
void AddResonance(int number, double mres, std::vector< int > tlis)
void AddEqualMass(int number, std::vector< int > tlis1, std::vector< int > tlis2)
void AddThreeMomentum(int number, Hep3Vector p3)
void AddFourMomentum(int number, HepLorentzVector p4)
HepVector pull(int n)
void AddTotalEnergy(int number, double etot, std::vector< int > lis)
void AddTotalMomentum(int number, double ptot, std::vector< int > lis)
std::vector< int > AddList(int n1)
std::vector< WTrackParameter > wTrackInfit() const
void setVBeamPosition(const HepSymMatrix VBeamPosition)
std::vector< GammaShape > GammaShapeValue() const
std::vector< WTrackParameter > wTrackOrigin() const
std::vector< int > GammaShapeList() const
void setBeamPosition(const HepPoint3D BeamPosition)
void setWTrackInfit(const int n, const WTrackParameter wtrk)