FairRoot/PandaRoot
RhoKinFitter.cxx
Go to the documentation of this file.
1 #include <iostream>
2 #include "RhoKinFitter.h"
4 #include "RhoBase/RhoFactory.h"
5 #include "TDecompLU.h"
6 #include "TMatrixD.h"
7 #include "TMatrixDSym.h"
9 using namespace std;
10 
12 
13 TBuffer& operator>>(TBuffer& buf, RhoKinFitter *&obj)
14 {
15  obj = (RhoKinFitter*) buf.ReadObject(RhoKinFitter::Class());
16  return buf;
17 }
18 
20  RhoFitterBase( b )
21 {
22  f4MomConstraint=-1;
23  fMomConstraint=-1;
24  fMassConstraint =-1;
26  fTotEConstraint=-1;
27 }
28 
30 {
31 }
32 
33 
34 void RhoKinFitter::Add4MomConstraint(TLorentzVector lv)
35 {
36  f4MomConstraint = 1;
37  flmm=lv;
38 }
39 
41 {
42  fMomConstraint = 1;
43  fmm=v;
44 }
45 
47 {
48  fTotEConstraint = 1;
49  fEc=energy;
50 }
51 void RhoKinFitter::AddTotMomConstraint(double momentum)
52 {
54  fMom=momentum;
55 }
57 {
58  fMassConstraint = 1;
59  fMass=mass;
60 }
61 
63 {
64  fDaughters.clear();
66  //int nd=fDaughters.size(); //unused?
67 
68  fNumCon=0;
69  if(f4MomConstraint >0) {
70  int n4Mom = 4;
71  fNumCon = fNumCon + n4Mom;
72  }
73  if(fMomConstraint >0) {
74  int nMom = 3;
75  fNumCon = fNumCon + nMom;
76  }
77  if(fTotEConstraint >0) {
78  int nE = 1;
79  fNumCon = fNumCon + nE;
80  }
81  if(fMassConstraint >0) {
82  int nMass = 1;
83  fNumCon = fNumCon + nMass;
84  }
85  if(fTotMomConstraint >0) {
86  int nTotMom = 1;
87  fNumCon = fNumCon + nTotMom;
88  }
89  SetMatrices();
90  ZeroMatrices();
91  ReadMatrix();
92  Bool_t check = Solve();
93  SetOutput();
94  return check;
95 }
96 
98 {
99  int nd=fDaughters.size();
100 
101  fNvar=7;
102  fNpar = nd*fNvar;
103  fNcon= fNumCon;
104  fNc=0;
105  fNiter=0;
106 
107 
108  fAl0.ResizeTo(7*nd,1);
109  fV_al0.ResizeTo(fNpar,fNpar);
110  fAl1.ResizeTo(7*nd,1);
111  fV_al1.ResizeTo(fNpar,fNpar);
112  fmD.ResizeTo(fNcon,fNpar);
113  fmE.ResizeTo(fNcon,3);
114  fmd.ResizeTo(fNcon,1);
115  fmPull.ResizeTo(7*nd,1);
116 }
117 
118 
120 {
121  fAl0.Zero();
122  fV_al0.Zero();
123  fAl1.Zero();
124  fV_al1.Zero();
125  fmPull.Zero();
126  fmD.Zero();
127  fmd.Zero();
128  fmE.Zero();
129 }
130 
131 
133 {
134  //int nd=fDaughters.size(); //unused?
135  double ierr; // used to check inversions
136  fAl1=fAl0;
137 // int j1Max=50;
138 // for(Int_t j1=0;j1<j1Max;++j1)
139 // {
141  if(fMomConstraint >0) { ReadMomKinMatrix();}
145 
146  TMatrixD mD_t=fmD;
147  mD_t.T();
148 // mD_t=mD_t.Transpose(mD);
149 
150 // mD_t.Print();
151  TMatrixD Vd_inv = fmD*fV_al0*mD_t;
152 
153  TMatrixD Vd = Vd_inv.Invert(&ierr);
154  //Vd.Print();
155 // TMatrixD lam=Vd*md;
156  TMatrixD lam = Vd* ( fmD*(fAl1 - fAl0) + fmd);
157  TMatrixD al_new=fAl0-fV_al0*mD_t*lam;
158 // al_new.Print();
159  TMatrixD V_al_new=fV_al0-fV_al0*mD_t*Vd*fmD*fV_al0;
160  double chi2=0.;
161  for (int i=0; i<fNcon; i++) { chi2+=lam[i][0]*fmd[i][0]; }
162  fChiSquare=chi2;
163  double covdif=(fV_al0[0][0]-V_al_new[0][0]);
164  if (covdif > 0 ) { fmPull[0][0] =(fAl0[0][0]-al_new[0][0])/sqrt(covdif);}
165  fAl0=al_new;
166  fV_al0=V_al_new;
167  fPull=fmPull[0][0];
168  return kTRUE;
169 }
170 
171 //Write output
172 //Write output
174 {
175  int nd=fDaughters.size();
176  TMatrixD m(nd,1);
177  fNDegreesOfFreedom = 0;
178  if(f4MomConstraint >0)
179  fNDegreesOfFreedom += 4;
180  else {
181  if(fMomConstraint >0)
182  fNDegreesOfFreedom += 3;
184  fNDegreesOfFreedom += 1;
185  }
186  double sumA=0;
187  double a;
188 
189  for (int k=0; k<nd; k++) {
190  Double_t bField = 0.1*RhoCalculationTools::GetBz(fDaughters[k]->Pos()); // T, assume field in z only
191  a = -0.00299792458*bField*fDaughters[k]->GetCharge();
192  sumA += a;
193  m[k][0]=fDaughters[k]->P4().M();
194  TVector3 pos(fAl0[k*7+4][0],fAl0[k*7+5][0],fAl0[k*7+6][0]);
195  TLorentzVector mom4(fAl0[k*7+0][0],fAl0[k*7+1][0],fAl0[k*7+2][0],fAl0[k*7+3][0]);
196  TLorentzVector p1;
197  p1.SetXYZM(fAl0[k*7+0][0],fAl0[k*7+1][0],fAl0[k*7+2][0],m[k][0]);
198  // fDaughters[k]->SetP4(p1);
199  //fDaughters[k]->SetP7(pos,mom4);
200  fDaughters[k]->SetP7(pos,p1);
201 
202 
203  TMatrixD p1Cov(7,7);
204  for(int i=0; i<7; i++) {
205  for (int j=0; j<7; j++) {
206 
207  p1Cov[i][j]= fV_al0[k*7+i][k*7+j];
208  fDaughters[k]->SetCov7(p1Cov); //New covariance matrix without correlations
209  }
210  }
211  }
212 
213 // For the composite particle ..............................
214 // double fpx=0,fpy=0,fpz=0,fe=0;
215 // for (int k=0; k<nd; k++) {
216 // fpx+= fAl0[k*7+0][0];
217 // fpy+= fAl0[k*7+1][0];
218 // fpz+= fAl0[k*7+2][0];
219 // fe += fAl0[k*7+3][0];
220 // // fe +=fDaughters[k]->P4().E(); // Energy from the initial daughter particles
221 // }
222 // TLorentzVector sum(fpx,fpy,fpz,fe);
223 // fHeadOfTree->SetP4(sum);
224 
225  //iteratively set the foumomenta in the tree
227  return;
228 }
229 
230 
231 
232 //Read the input vector
234 {
235  int nd =fDaughters.size();
236  for (int k=0; k<nd; k++) {
237  int kN=k*7;
238 //px,py,pz,E,x,y,z
239  TLorentzVector p1=fDaughters[k]->P4();
240  TVector3 p2=fDaughters[k]->Pos();
241  fAl0[kN+0][0]=p1.X();
242  fAl0[kN+1][0]=p1.Y();
243  fAl0[kN+2][0]=p1.Z();
244 // al0[kN+3][0]=p1.E();
245  fAl0[kN+4][0]=p2.X();
246  fAl0[kN+5][0]=p2.Y();
247  fAl0[kN+6][0]=p2.Z();
248 
249  double fm=fDaughters[k]->Mass();
250  fAl0[kN+3][0]=sqrt(fAl0[kN+0][0]*fAl0[kN+0][0]+ fAl0[kN+1][0]*fAl0[kN+1][0]+fAl0[kN+2][0]*fAl0[kN+2][0]+fm*fm);
251 
252 // Read Covariance Matrix .... Can read 6x6 matrices..................
253  TMatrixD p1Cov(7,7);
254  TMatrixD p2Cov(6,6);
255  TMatrixD p3Cov(7,7);
256  TMatrixD p4Cov(7,7);
257  p1Cov=fDaughters[k]->Cov7(); //Cov Matrix x,y,z,px,py,pz,E
258 
259  for (int ii=0; ii<6; ii++) {for(int jj=0; jj<6; jj++) {p2Cov[ii][jj]=p1Cov[ii][jj];}} //test
260 
261  //Extend matrix for energy for each candidates .....6x6 to 7x7
262 
263  TMatrixD J(7,6) ;
264  J.Zero();
265  TMatrixD J_t(6,7);
266  for (int ii=0; ii<6; ii++) {for(int jj=0; jj<6; jj++) {J[ii][jj] = 1;}}
267  for(int i=3; i<6; ++i) {J[6][i] = fAl0[kN+i-3][0]/fAl0[kN+3][0];}
268 // for (int i=3; i <6; i++) { J[6][i] = -al0[kN+i-3][0]/fm;}
269 // J[6][6] =al0[kN+6-3][0] /fm;
270 // p3Cov= J*p2Cov*(J_t.Transpose(J));
271  p3Cov=p1Cov;
272 
273 //Change to px,py,pz,E,x,y,z
274  for(int i=0; i<7; i++) {
275  for(int j=0; j<7; j++) {
276  if(i>=3) {
277  if(j>=3) {
278  p4Cov[i-3][j-3] = p3Cov[i][j];
279  } else { p4Cov[i-3][j+4] = p3Cov[i][j]; }
280  } else {
281  if(j>=3) {
282  p4Cov[i+4][j-3] = p3Cov[i][j];
283  } else { p4Cov[i+4][j+4] = p3Cov[i][j]; }
284  }
285  }
286  }
287 
288 // cout<<"p2Cov"<<endl;
289  // p2Cov.Print();
290  for(int i=0; i<7; i++) {
291  for (int j=0; j<7; j++) {
292  fV_al0[k*7+i][k*7+j] = p4Cov[i][j];
293  }
294  }
295  }
296 }
297 
298 
300 {
301  int nd=fDaughters.size();
302 
303  double Etot = 0.;
304  double Px = 0.;
305  double Py = 0.;
306  double Pz = 0.;
307 
308  TMatrixD al1p(fAl1);
309  double a;
310  TMatrixD m(nd,1);
311  for(int k=0; k<nd; ++k) {
312  int kN=k*7;
313  TLorentzVector p1=fDaughters[k]->P4();
314  m[k][0]=p1.M();
315 
316  double px = al1p[kN+0][0];
317  double py = al1p[kN+1][0];
318  double pz = al1p[kN+2][0];
319  double E = TMath::Sqrt(px*px+py*py+pz*pz+m[k][0]*m[k][0]);
320  Etot += E;
321  Px +=px;
322  Py +=py;
323 // Px += (px - a*delY);
324  // Py += (py + a*delX);
325  Pz += pz;
326  }
327 
328  fmd[fNc+0][0] = Etot*Etot - Px*Px - Py*Py - Pz*Pz - fMass*fMass ;
329 
330  for(int k=0; k<nd; ++k) {
331  int kN=k*7;
332  TLorentzVector p1=fDaughters[k]->P4();
333  m[k][0]=p1.M();
334  //double px = al1p[kN+0][0]; //[R.K. 01/2017] unused variable?
335  //double py = al1p[kN+1][0]; //[R.K. 01/2017] unused variable?
336  //double pz = al1p[kN+2][0]; //[R.K. 01/2017] unused variable?
337  //double E = TMath::Sqrt(px*px+py*py+pz*pz+m[k][0]*m[k][0]); //[R.K. 01/2017] unused variable?
338  Double_t bField = 0.1*RhoCalculationTools::GetBz(fDaughters[k]->Pos()); // T, assume field in z only
339  a = -0.00299792458*bField*fDaughters[k]->GetCharge();
340  //Double_t invE = 1./E;
341 
342 //....................................................
343 // V.J. - force head mass to constraint mass
344 fmD[fNc+0][kN+0] = -2.*Px;
345 fmD[fNc+0][kN+1] = -2.*Py;;
346 fmD[fNc+0][kN+2] = -2.*Pz;
347 fmD[fNc+0][kN+3] = 2.*Etot;
348 fmD[fNc+0][kN+4] = 2.*a*Py;
349 fmD[fNc+0][kN+5] = -2.*a*Px;
350 fmD[fNc+0][kN+6] = 0.0;
351 //....................................................
352 // fmD[fNc+0][kN+0] = 2.*(Etot*px*invE-Px);
353 // fmD[fNc+0][kN+1] = 2.*(Etot*py*invE-Py);
354 // fmD[fNc+0][kN+2] = 2.*(Etot*pz*invE-Pz);
355 // fmD[fNc+0][kN+3] = 0.0;
356 // fmD[fNc+0][kN+3] = 2* m[k][0]*Etot*invE;
357 // // mD[0][kN+4] = 2.*(Etot*py*invE-Py)*a;
358 // // mD[0][kN+5] = 2.*(Etot*px*invE-Px)*a;
359 // fmD[fNc+0][kN+4] = 2.*Py*a;
360 // fmD[fNc+0][kN+5] = -2.*Px*a;
361 // fmD[fNc+0][kN+6] = 0.0;
362 //................Simple....................
363  /*
364  mD[fNc+0][kN+0] = -2.*Px;
365  mD[fNc+0][kN+1] = -2.*Py;;
366  mD[fNc+0][kN+2] = -2.*Pz;
367  mD[fNc+0][kN+3] = 2.*Etot;
368  // mD[fNc+0][kN+3] = 2* m[k][0]*Etot*invE;
369  // mD[fNc+0][kN+4] = 2.*(Etot*py*invE-Py)*a;
370  // mD[fNc+0][kN+5] = 2.*(Etot*px*invE-Px)*a;
371  mD[fNc+0][kN+4] = 0.0;
372  mD[fNc+0][kN+5] = 0.0;
373  mD[fNc+0][kN+6] = 0.0;
374  */
375 //.....................................
376 
377  }
378  fNc += 1;
379 }
380 
382 {
383  int nd=fDaughters.size();
384  TMatrixD alp(fAl1);
385  TMatrixD m(nd,1);
386  int k,i;
387  for (k=0; k<nd; k++) {
388  TLorentzVector p1=fDaughters[k]->P4();
389  m[k][0]=p1.M();
390  double E =sqrt(alp[k*7+0][0]*alp[k*7+0][0]+
391  alp[k*7+1][0]*alp[k*7+1][0]+
392  alp[k*7+2][0]*alp[k*7+2][0]+
393  m[k][0]*m[k][0]);
394  for (i=0; i<3; i++) {
395  fmD[fNc+i][k*7+i] = 1;
396  fmD[fNc+3][k*7+i] = alp[k*7+i][0]/E;
397  }
398 // cout << "value of D" << mD[3][k*7+i] << endl;
399 
400  for (i=0; i<3; i++) {
401  fmd[fNc+i][0] += alp[k*7+i][0];
402  }
403  fmd[fNc+3][0] += E;
404  }
405  fmd[fNc+0][0] -= flmm.X();
406  fmd[fNc+1][0] -= flmm.Y();
407  fmd[fNc+2][0] -= flmm.Z();
408  fmd[fNc+3][0] -= flmm.T();
409  fNc += 4;
410 }
411 
412 
414 {
415  int nd=fDaughters.size();
416  TMatrixD alp(fAl1);
417  TMatrixD m(nd,1);
418  int k,i;
419  for (k=0; k<nd; k++) {
420  for (i=0; i<3; i++) {
421  fmD[fNc+i][k*7+i] = 1;
422  }
423  for (i=0; i<3; i++) {
424  fmd[fNc+i][0] += alp[k*7+i][0];
425  }
426  }
427  fmd[fNc+0][0]-= fmm.X();
428  fmd[fNc+1][0]-= fmm.Y();
429  fmd[fNc+2][0]-= fmm.Z();
430 
431  fNc += 3;
432 }
433 
434 
436 {
437  int nd=fDaughters.size();
438  TMatrixD alp(fAl1);
439  TMatrixD m(nd,1);
440  int k,i;
441  for (k=0; k<nd; k++) {
442  TLorentzVector p1=fDaughters[k]->P4();
443  m[k][0]=p1.M();
444  double E =sqrt(alp[k*7+0][0]*alp[k*7+0][0]+
445  alp[k*7+1][0]*alp[k*7+1][0]+
446  alp[k*7+2][0]*alp[k*7+2][0]+
447  m[k][0]*m[k][0]);
448  for (i=0; i<3; i++) {
449  fmD[fNc+0][k*7+i] = 0.;
450  // mD[0][k*7+i] = alp[k*7+i][0]/E;
451  }
452  fmD[fNc+0][k*7+3] = 1.;
453  fmd[fNc+0][0] += E;
454  }
455  fmd[fNc+0][0] -= fEc;
456  fNc +=1;
457 }
458 
460 {
461  int nd=fDaughters.size();
462  TMatrixD alp(fAl1);
463  TMatrixD m(nd,1);
464  int k,i;
465  for (k=0; k<nd; k++) {
466  double Ptot =sqrt(alp[k*7+0][0]*alp[k*7+0][0]+
467  alp[k*7+1][0]*alp[k*7+1][0]+
468  alp[k*7+2][0]*alp[k*7+2][0]);
469  for (i=0; i<3; i++) {
470  // mD[0][k*7+i] = 1.;
471  fmD[fNc+0][k*7+i] = alp[k*7+i][0]/Ptot;
472  }
473  fmd[fNc+0][0] += Ptot;
474  }
475  fmd[fNc+0][0] -= fMom;
476  fNc +=1;
477 }
478 
479 /*
480 void RhoKinFitter::ReadEqMassKinMatrix()
481 {int nd=fDaughters.size();
482  TMatrixD alp(al1);
483  TMatrixD m(nd,1);
484  int k,i,j;
485  for (k=0;k<nd;k++)
486 {
487  TLorentzVector p1=fDaughters[k]->P4();
488  double Mtot =sqrt(alp[k*7+3][0]*alp[k*7+3][0]
489  -(alp[k*7+0][0]*alp[k*7+0][0]+
490  alp[k*7+1][0]*alp[k*7+1][0]+
491  alp[k*7+2][0]*alp[k*7+2][0])
492  for (i=0;i<3;i++)
493  {
494  // mD[0][k*7+i] = 1.;
495  mD[fNc+0][k*7+i] -= 2.*alp[k*7+i][0];
496  mD[fNc+0][k*7+3] -= -2.*alp[k*7+3][0];
497  }
498  md[fNc+0][0] -= Mtot;
499  }
500  md[fNc+0][0] -= 0.0;
501  fNc +=1;
502 }
503 */
504 
void AddMomConstraint(TVector3 v)
TVector3 pos
void AddTotMomConstraint(double momentum)
TMatrixD fAl1
Definition: RhoKinFitter.h:53
void AddMassConstraint(double mass)
ClassImp(RhoKinFitter) TBuffer &operator>>(TBuffer &buf
Int_t i
Definition: run_full.C:25
__m128 m
Definition: P4_F32vec4.h:28
TTree * b
void FindAndAddFinalStateDaughters(RhoCandidate *cand)
friend F32vec4 sqrt(const F32vec4 &a)
Definition: P4_F32vec4.h:29
static T Sqrt(const T &x)
Definition: PndCAMath.h:37
int fTotEConstraint
Definition: RhoKinFitter.h:78
double fPull
Definition: RhoKinFitter.h:83
TMatrixD fAl0
Definition: RhoKinFitter.h:52
void ReadMassKinMatrix()
void SetMatrices()
RhoKinFitter(RhoCandidate *b)
TVector3 fmm
Definition: RhoKinFitter.h:72
void ReadMomKinMatrix()
TLorentzVector flmm
Definition: RhoKinFitter.h:71
int fTotMomConstraint
Definition: RhoKinFitter.h:80
void ReadTotEKinMatrix()
void Add4MomConstraint(TLorentzVector lv)
TMatrixD fmE
Definition: RhoKinFitter.h:58
__m128 v
Definition: P4_F32vec4.h:4
void AddTotEConstraint(double energy)
void SetFourMomentumByDaughters(RhoCandidate *composite)
RhoKinFitter *& obj
TMatrixD fmD
Definition: RhoKinFitter.h:57
Int_t a
Definition: anaLmdDigi.C:126
return buf
Double_t
TMatrixD fmd
Definition: RhoKinFitter.h:59
void Read4MomKinMatrix()
Bool_t Solve()
std::vector< RhoCandidate * > fDaughters
Definition: RhoFitterBase.h:69
TMatrixD fV_al0
Definition: RhoKinFitter.h:54
TPad * p2
Definition: hist-t7.C:117
double fMass
Definition: RhoKinFitter.h:70
void ZeroMatrices()
TMatrixD fV_al1
Definition: RhoKinFitter.h:55
int fMomConstraint
Definition: RhoKinFitter.h:77
RhoCandidate * fHeadOfTree
Definition: RhoFitterBase.h:62
static Double_t GetBz(const TVector3 &position)
Return the magnetic field along the z-axis in kGs
double fChiSquare
Definition: RhoFitterBase.h:74
TPad * p1
Definition: hist-t7.C:116
int fMassConstraint
Definition: RhoKinFitter.h:79
Bool_t Fit()
int f4MomConstraint
Definition: RhoKinFitter.h:76
virtual ~RhoKinFitter()
TMatrixD fmPull
Definition: RhoKinFitter.h:60
TMatrixT< double > TMatrixD
Definition: PndLmdDim.h:52
double pz[39]
Definition: pipisigmas.h:14
Double_t energy
Definition: plot_dirc.C:15
int fNDegreesOfFreedom
Definition: RhoFitterBase.h:75
void ReadTotMomKinMatrix()