BmnRoot
Loading...
Searching...
No Matches
BmnMotherFitterPart.cxx
Go to the documentation of this file.
1
6
8// #include "MpdKalmanFilter.h"
9// #include "MpdKalmanGeoScheme.h"
10// #include "MpdKalmanTrack.h"
11// #include "MpdKalmanHit.h"
12// #include "MpdHelix.h"
13#include "CbmKF.h"
14#include "CbmKFMath.h"
15#include "CbmKFTrack.h"
16#include "CbmStsTrack.h"
17#include "CbmVertex.h"
18// #include "MpdMCTrack.h"
19
20#include "FairField.h"
21#include "FairRunAna.h"
22#include "FairTask.h"
23
24#include <TCanvas.h>
25#include <TMath.h>
26#include <TMatrixD.h>
27#include <TVector3.h>
28#include <iostream>
29using std::cout;
30using std::endl;
31
32BmnMotherFitterPart* BmnMotherFitterPart::fgMF = 0x0;
33
34//__________________________________________________________________________
35BmnMotherFitterPart::BmnMotherFitterPart()
36 : FairTask()
37{
39
40 fCovar.ResizeTo(3, 3);
41 // fKF = MpdKalmanFilter::Instance();
42 fKF = CbmKF::Instance();
43}
44
45//__________________________________________________________________________
46BmnMotherFitterPart::BmnMotherFitterPart(const char* name, const char* title)
47 : FairTask(name)
48{
50
51 fgMF = this;
52 fCovar.ResizeTo(3, 3);
53
54 // fKF = MpdKalmanFilter::Instance();
55 fKF = CbmKF::Instance();
56}
57
58//__________________________________________________________________________
60{
62 if (!fgMF) {
63 fgMF = new BmnMotherFitterPart;
64 fgMF->Init();
65 // automatic destruction is forced
66 std::atexit(DestroyInstance);
67 }
68 return fgMF;
69}
70
71//__________________________________________________________________________
72BmnMotherFitterPart* BmnMotherFitterPart::Instance(const char* name, const char* title)
73{
75 if (!fgMF) {
76 fgMF = new BmnMotherFitterPart(name, title);
77 fgMF->Init();
78 // automatic destruction is forced
79 std::atexit(DestroyInstance);
80 }
81 return fgMF;
82}
83
84//__________________________________________________________________________
86{
88 // FairRootManager *manager = FairRootManager::Instance();
89 // manager->Write();
90}
91
92//__________________________________________________________________________
94{
95
96 cout << "InitStatus MpdMotherFitterPart::Init\n\n";
97 Double_t bZ = 5.;
98 FairField* magField = FairRunAna::Instance()->GetField();
99 if (!magField || TMath::Abs(magField->GetBz(0, 0, 0)) < 0.01) {
100 cout << " -I- MpdMotherFitterPart::Init - Using the default constant magnetic field Bz = 5 kG " << endl;
101 } else
102 bZ = TMath::Abs(magField->GetBz(0, 0, 0));
103 fieldConst = 0.3 * 0.01 * bZ / 10;
104
105 // AZ-021225 - for testing
106 fTestHist = nullptr;
107 TCanvas* c1 = (TCanvas*)gROOT->FindObject("cMothFit");
108 if (c1)
109 fTestHist = new TH1D("hTestHist", " ", 110, -10, 100);
110 //
111 return kSUCCESS;
112}
113
114//__________________________________________________________________________
116{
117 // fMagField = FairRunAna::Instance()->GetField(); // !!! interim solution !!!
118 return kSUCCESS;
119}
120
121//__________________________________________________________________________
123{
125 // cout << " MpdMotherFitterPart::Reset " << endl;
126}
127
128//__________________________________________________________________________
130{
132 // FairRootManager::Instance()->
133 // Register("TpcLheKalmanTrack","TpcLheKalmanTrack", fTracks, kFALSE);
134}
135
136//__________________________________________________________________________
141
142//__________________________________________________________________________
143void BmnMotherFitterPart::Exec(Option_t* option)
144{
146}
147
148//__________________________________________________________________________
149
150Double_t BmnMotherFitterPart::BuildMother(BmnParticle* mother, vector<BmnParticle*>& vDaught)
151{
154
155 TVector3 vtx;
156 Double_t chi2 = BmnMotherFitterPart::Instance()->FindVertex(vDaught, vtx);
157 // cout << " FindVertex: " << fVtx[0] << " " << fVtx[1] << " " << fVtx[2] << " " << chi2 << endl;
158 if (chi2 < -1.0)
159 return chi2; // failed to find decay vertex (too high chi2)
160 Int_t nDaught = vDaught.size();
161
162 // Check for sanity
163 /*
164 for (Int_t id = 0; id < nDaught; ++id) {
165 Double_t theta = vDaught[id]->Theta();
166 if (theta < 0 || theta > TMath::Pi()) return -chi2; // weird track
167 }
168 */
169
170 mother->SetChi2(chi2);
171
172 TVector3 mom3;
173 Int_t charge = 0, ndf = 0;
174 Double_t energy = 0.0;
175
176 for (Int_t i = 0; i < nDaught; ++i) {
177 BmnParticle* part = vDaught[i];
178 charge += part->GetCharge();
179 mom3 += part->Momentum3();
180 part->FillJ();
181 Double_t ptot = part->Momentum3().Mag();
182 energy += TMath::Sqrt(part->GetMass() * part->GetMass() + ptot * ptot);
183 mother->AddDaughter(part->GetIndx());
184 // cout << " ---> " << i << " " << part->GetCharge() << " " << part->GetMass() << " " << ptot << " "
185 // << 1/part->GetMeas(4) << endl;
186 ndf += part->GetNDF();
187 }
188 mother->SetNDF(ndf);
189 mother->SetCharge(charge);
190 mother->SetMass(TMath::Sqrt(energy * energy - mom3.X() * mom3.X() - mom3.Y() * mom3.Y() - mom3.Z() * mom3.Z()));
191 mother->Setx(vDaught[0]->Getx());
192 mother->SetZ(mother->Getx()(2, 0));
193 TMatrixD qm(3, 1);
194 /* AZ-050725
195 qm(0, 0) = mom3.Phi();
196 qm(1, 0) = mom3.Theta();
197 if (charge == 0)
198 qm(2, 0) = mom3.Mag();
199 else
200 qm(2, 0) = -fieldConst / mom3.Pt() * TMath::Abs(charge);
201 */
202 qm(0, 0) = mom3.X() / mom3.Z();
203 qm(1, 0) = mom3.Y() / mom3.Z();
204 if (charge == 0)
205 qm(2, 0) = mom3.Mag();
206 else
207 qm(2, 0) = charge / mom3.Mag();
208
209 mother->Setq(qm);
210
211 // AZ-120725 ParamsAtDca(mother); // compute params at DCA
212 // AZ-080825 mother->ParamsAtDca(); // compute params at DCA
213 // return chi2; //
214
215 mother->FillJinv(mom3);
216
217 // Compute covariance matrix
218 TMatrixD en(3, 3);
219 TMatrixD ec(3, 3);
220 for (Int_t i = 0; i < nDaught; ++i) {
221 BmnParticle* part = vDaught[i];
222 // E += E*Jt
223 TMatrixD jt = TMatrixD(TMatrixD::kTransposed, part->GetJ());
224 TMatrixD tmp = TMatrixD(part->GetE(), TMatrixD::kMult, jt);
225 if (part->GetCharge()) {
226 // Charged track
227 ec += tmp;
228 } else {
229 // Neutral
230 en += tmp;
231 }
232 }
233
234 TMatrixD etot = ec;
235 etot += en;
236 TMatrixD c = GetCovariance();
237 TMatrixD qtot = ComputeQmatr(vDaught);
238
239 TMatrixD ck0(5, 1);
240 // ComputeAandB(mother->Getx(), *mother, fA, fB, ck0);
241 Bool_t err = ComputeAandB(mother->Getx(), *mother, mother->GetA(), mother->GetB(), ck0);
242 if (err)
243 return -9.0;
244
245 // Covar. matrix
246 TMatrixD at(TMatrixD::kTransposed, mother->GetA());
247 TMatrixD tmp11(c, TMatrixD::kMult, at);
248 TMatrixD tmp12(mother->GetA(), TMatrixD::kMult, tmp11);
249
250 TMatrixD bt(TMatrixD::kTransposed, mother->GetB());
251 TMatrixD tmp21(mother->GetJinv(), TMatrixD::kTransposeMult, bt);
252 TMatrixD tmp22(etot, TMatrixD::kMult, tmp21);
253 TMatrixD tmp23(mother->GetA(), TMatrixD::kMult, tmp22);
254
255 TMatrixD tmp31(etot, TMatrixD::kTransposeMult, at);
256 TMatrixD tmp32(mother->GetJinv(), TMatrixD::kMult, tmp31);
257 TMatrixD tmp33(mother->GetB(), TMatrixD::kMult, tmp32);
258
259 TMatrixD tmp41(mother->GetJinv(), TMatrixD::kTransposeMult, bt);
260 TMatrixD tmp42(qtot, TMatrixD::kMult, tmp41);
261 TMatrixD tmp43(mother->GetJinv(), TMatrixD::kMult, tmp42);
262 TMatrixD tmp44(mother->GetB(), TMatrixD::kMult, tmp43);
263
264 TMatrixD gm(5, 5);
265 gm = tmp12;
266 gm += tmp23;
267 gm += tmp33;
268 gm += tmp44;
269 // cout << " Mother covariance " << endl;
270 // fG.Print();
271 gm.Invert(); // mother weight
272 mother->SetG(gm);
273
274 mother->ParamsAtDca(); // AZ-080825 compute params at DCA
275
276 return chi2;
277}
278
279//__________________________________________________________________________
280/*
281
282Double_t BmnMotherFitterPart::BuildMother(BmnParticle *mother, vector<CbmStsTrack *> &vTracks,
283 vector<BmnParticle *> &vDaught)
284{
289
290 vDaught.clear();
291 vector<MpdHelix> vhel;
292
293 // Create 2 helices and cross them
294 for (Int_t itr = 0; itr < 2; ++itr) {
295 Double_t rad = vTracks[itr]->GetPosNew();
296 Double_t phi = 0.0;
297 if (rad > 1.e-6) phi = (*vTracks[itr]->GetParam())(0, 0) / rad;
298 vhel.push_back(MpdHelix(vTracks[itr]->Momentum3(),
299 TVector3(rad * TMath::Cos(phi), rad * TMath::Sin(phi), (*vTracks[itr]->GetParam())(1, 0)),
300 vTracks[itr]->Charge()));
301 }
302 pair<Double_t, Double_t> paths = vhel[0].pathLengths(vhel[1]);
303 TVector3 cross;
304 Double_t xyz[3] = {0};
305 Int_t ntr = vTracks.size();
306
307 if (paths.first < 100.0 || paths.second < 100.0) {
308 // MpdKalmanHit hit;
309 // hit.SetType(MpdKalmanHit::kFixedR);
310 cross = vhel[0].at(paths.first);
311 cross += vhel[1].at(paths.second);
312 cross *= 0.5;
313 cross.GetXYZ(xyz);
314
315 for (Int_t itr = 0; itr < ntr; ++itr) {
316 //Double_t s = vhel[itr].pathLength(cross);
317 //TVector3 pca = vhel[itr].at(s);
318 //hit.SetPos(pca.Pt());
319 //fKF->PropagateToHit(vTacks[itr],&hit,kFALSE);
320 }
321
322 }
323
324 // xyz[0] = xyz[1] = xyz[2] = 0;
325 for (Int_t itr = 0; itr < ntr; ++itr) {
326 fKF->FindPca(vTracks[itr], xyz);
327 vTracks[itr]->SetParam(*vTracks[itr]->GetParamNew());
328 vTracks[itr]->Weight2Cov(); // AZ
329 vDaught.push_back(new MpdParticle(*vTracks[itr], -1, 0.1396, xyz));
330 }
331 Double_t chi2 = BuildMother(mother, vDaught);
332 // Bring back to master frame in transverse plane
333 for (Int_t j = 0; j < 2; ++j) mother->Getx()(j, 0) += xyz[j];
334 return 0; //chi2;
335}
336*/
337
338//__________________________________________________________________________
339
340Bool_t BmnMotherFitterPart::EvalVertex(vector<BmnParticle*> vDaught)
341{
344
345 int nDaught = vDaught.size();
346 // Double_t dz = 10.0;
347 TMatrixFSym covMatr(5);
348 int niter = 2;
349 fVtx[2] = 999.0;
350
351 for (int iter = 0; iter < niter; ++iter) {
352 // Make iterations
353 vector<FairTrackParam> vParams;
354 if (iter == 0) {
355 // Propagate all tracks to Zmin
356
357 for (int ip = 0; ip < nDaught; ++ip) {
358 BmnParticle* part = vDaught[ip];
359 fVtx[2] = TMath::Min(fVtx[2], part->GetXY(0));
360 }
361 }
362
363 for (int ip = 0; ip < nDaught; ++ip) {
364 BmnParticle* part = vDaught[ip];
365 FairTrackParam par;
366 CbmKFTrack tr = part->GetKFTrack();
367 int ierr = tr.Propagate(fVtx[2]);
368 if (ierr != 0)
369 return kFALSE;
370 tr.GetTrackParam(par);
371 vParams.push_back(par);
372 }
373
374 // Pair combinations
375 Double_t zzz = 0, dxmax = 0;
376 int npairs = 0;
377
378 for (int ip = 0; ip < nDaught; ++ip) {
379 Double_t ty0 = vParams[ip].GetTy();
380
381 for (int ip1 = ip + 1; ip1 < nDaught; ++ip1) {
382 Double_t ty1 = vParams[ip1].GetTy();
383 if (TMath::Abs(ty1 - ty0) > 1.e-6) {
384 Double_t dz = vParams[ip1].GetY() - vParams[ip].GetY();
385 dz /= (vParams[ip].GetTy() - vParams[ip1].GetTy());
386 Double_t z = fVtx[2] + dz;
387 zzz += z;
388 ++npairs;
389 // Find dx
390 CbmKFTrack tr(vParams[ip]);
391 CbmKFTrack tr1(vParams[ip1]);
392 int ierr = tr.Propagate(z);
393 int ierr1 = tr1.Propagate(z);
394 if (ierr != 0 || ierr1 != 0)
395 return kFALSE;
396 dxmax = TMath::Max(dxmax, TMath::Abs(tr.GetTrack()[0] - tr1.GetTrack()[0]));
397 }
398 }
399 }
400 fVtx[2] = (npairs) ? zzz / npairs : 0.0;
401 // cout << " xxx " << iter << " " << fVtx[2] << " " << dxmax << endl;
402 if (dxmax > 50)
403 return kFALSE; // too large dX
404
405 // Find distances between 2 parabolas
406 if (fTestHist)
407 fTestHist->Reset();
408
409 if (fTestHist && iter == 0) {
410 // AZ-021225 - for test
411 TCanvas* c1 = (TCanvas*)gROOT->FindObject("cMothFit");
412 Double_t cmax = fTestHist->GetBinContent(fTestHist->GetMaximumBin());
413 fTestHist->SetMaximum(cmax * 1.1);
414 // fTestHist->Draw("hist");
415 fTestHist->Fit("pol2", "w");
416 c1->Modified();
417 c1->Update();
418 getchar();
419 }
420
421 /*
422 for (int iz = 0; iz < 3; ++iz) {
423 cout << " Dists: " << dists[iz][0].X();
424 }
425 cout << " " << fVtx[2] << endl;
426 */
427 if (TMath::Abs(fVtx[2]) > 170)
428 return kFALSE; // failed vertex
429 fVtx[0] = fVtx[1] = 0.0;
430
431 for (int ip = 0; ip < nDaught; ++ip) {
432 BmnParticle* part = vDaught[ip];
433 // FairTrackParam par (part->GetMeas(0), part->GetMeas(1), 0.0, part->GetMeas(2), part->GetMeas(3),
434 // part->GetMeas(4), covMatr);
435 FairTrackParam par;
436 CbmKFTrack tr = part->GetKFTrack();
437 // tr.Extrapolate (fVtx[2]);
438 tr.Propagate(fVtx[2]);
439 tr.GetTrackParam(par);
440 fVtx[0] += par.GetX();
441 fVtx[1] += par.GetY();
442 }
443 fVtx[0] /= nDaught;
444 fVtx[1] /= nDaught;
445 // cout << " Vertex eval: " << fVtx[0] << " " << fVtx[1] << " " << fVtx[2] << endl;
446 if (TMath::Abs(fVtx[0]) > 50.0 || TMath::Abs(fVtx[1]) > 40.0)
447 return kFALSE;
448 } // for (int iter = 0;
449 return kTRUE;
450}
451
452//__________________________________________________________________________
453
454Double_t BmnMotherFitterPart::FindVertex(vector<BmnParticle*> vDaught, TVector3& vtx)
455{
457
458 const Int_t nPass = 3; // number of iterations
459 const Double_t cutChi2 = 1000.; // chi2-cut
460
461 if (!EvalVertex(vDaught))
462 return -cutChi2;
463
464 Int_t nDaught = vDaught.size();
465 TMatrixD c(3, 3), cov(3, 3), xk0(3, 1), xk(3, 1), ck0(5, 1);
466 TMatrixD a(5, 3), b(5, 3);
467 // MpdKalmanHit hit;
468 Double_t chi2 = 0; //, chi2o = 0;
469
470 xk.SetMatrixArray(fVtx);
471 // xk += 1.0; // test
472 c(0, 0) = c(1, 1) = c(2, 2) = 1;
473
474 for (Int_t ipass = 0; ipass < nPass; ++ipass) {
475
476 // chi2o = chi2;
477 chi2 = 0.;
478 // c.Zero(); // new 05.06.17
479 c(0, 0) = c(1, 1) = c(2, 2) = 100; // new 05.06.17
480 if (ipass == 0)
481 cov = TMatrixD(TMatrixD::kInverted, c);
482
483 Int_t ibeg = 0, iend = nDaught, istep = 1;
484 if (ipass % 2 > 0) {
485 ibeg = nDaught - 1;
486 iend = -1;
487 istep = -1;
488 }
489
490 for (Int_t itr = ibeg; itr != iend; itr += istep) {
491 xk0 = xk; // xk0 stands for x(k-1)
492 cov = TMatrixD(TMatrixD::kInverted, c);
493
494 BmnParticle* part = vDaught[itr];
495
496 Bool_t err = ComputeAandB(xk0, *part, a, b, ck0); // compute matrices of derivatives
497 if (err)
498 return -9.0;
499
500 TMatrixD g = part->GetG();
501
502 // W = (Bt*G*B)'
503 TMatrixD tmp(g, TMatrixD::kMult, b);
504 TMatrixD w(b, TMatrixD::kTransposeMult, tmp);
505 w.Invert();
506
507 // Gb = G - G*B*W*Bt*G
508 TMatrixD tmp1(b, TMatrixD::kTransposeMult, g);
509 TMatrixD tmp2(w, TMatrixD::kMult, tmp1);
510 TMatrixD tmp3(b, TMatrixD::kMult, tmp2);
511 TMatrixD tmp4(g, TMatrixD::kMult, tmp3);
512 TMatrixD gb = g;
513 gb -= tmp4;
514
515 // Ck = ((Ck-1)' + At*Gb*A)'
516 TMatrixD tmp5(gb, TMatrixD::kMult, a);
517 c = TMatrixD(a, TMatrixD::kTransposeMult, tmp5);
518 c += cov;
519 c.Invert();
520
521 // xk = Ck*((Ck-1)'x(k-1)+At*Gb*(m-ck0))
522 TMatrixD m = part->GetMeas();
523 // m.Print();
524 m -= ck0; // m-ck0
525 // cout << " m-ck0: " << endl;
526 // ck0.Print();
527 // m.Print();
528 TMatrixD tmp11(gb, TMatrixD::kMult, m);
529 TMatrixD tmp12(a, TMatrixD::kTransposeMult, tmp11);
530 TMatrixD tmp13(cov, TMatrixD::kMult, xk0);
531 tmp13 += tmp12;
532 xk = TMatrixD(c, TMatrixD::kMult, tmp13);
533 // cout << " Vertex: " << itr << " " << track->GetTrackID() << " " << xk(0,0) << " " << xk(1,0) << " " <<
534 // xk(2,0) << endl;
535
536 // qk = W*Bt*G*(m-ck0-A*xk)
537 TMatrixD tmp21(a, TMatrixD::kMult, xk);
538 tmp21 *= -1;
539 tmp21 += m; // m-ck0-A*xk
540 TMatrixD tmp22(g, TMatrixD::kMult, tmp21);
541 TMatrixD tmp23(b, TMatrixD::kTransposeMult, tmp22);
542 TMatrixD qk(w, TMatrixD::kMult, tmp23);
543
544 // Residual m-ck0-A*xk-B*qk
545 TMatrixD r = tmp21;
546 TMatrixD tmp31(b, TMatrixD::kMult, qk);
547 r -= tmp31;
548 // cout << " Residual matrix: " << endl;
549 // r.Print();
550 // qk.Print();
551
552 // Chi2 = rt*G*r + (xk-x(k-1))t*(Ck-1)'*(xk-x(k-1))
553 TMatrixD tmp41(g, TMatrixD::kMult, r);
554 TMatrixD chi21(r, TMatrixD::kTransposeMult, tmp41);
555 // chi21.Print();
556 TMatrixD dx = xk;
557 dx -= xk0;
558 // Double_t dxMax = dx.Max();
559 // if (dxMax > 7*TMath::Sqrt(cov.Max())) return -cutChi2; //AZ-050121
560 TMatrixD tmp42(cov, TMatrixD::kMult, dx);
561 TMatrixD chi22(dx, TMatrixD::kTransposeMult, tmp42);
562 // chi22.Print();
563 if (chi21(0, 0) < 0 || chi22(0, 0) < 0) {
564 cout << " !!! Chi2 < 0 " << chi21(0, 0) << " " << chi22(0, 0) << " " << ipass << " " << itr << " "
565 << part->GetMeas(4) << endl;
566 // exit(0);
567 }
568 chi21 += chi22;
569 chi2 += chi21(0, 0);
570 // if (chi2 > cutChi2) {
571 if (chi2 > cutChi2 || chi21(0, 0) < 0 || chi22(0, 0) < 0) {
572 for (Int_t i = 0; i < 3; ++i)
573 vtx[i] = fVtx[i];
574 /*
575 for (Int_t i = 0; i < nDaught; ++i) {
576 MpdKalmanTrack trTmp = *vDaught[i];
577 trTmp.SetPos(trTmp.GetPosNew());
578 trTmp.SetParamNew(*trTmp.GetParam());
579 if (trTmp.GetNode() != "") trTmp.SetNode(""); // 25-jul-2012
580 fKF->FindPca(&trTmp,fVtx);
581 vDaught[i]->SetParam(*trTmp.GetParamNew());
582 vDaught[i]->SetPosNew(trTmp.GetPosNew());
583 }
584 */
585 // AZ-Debug
586 // cout << " !!! Too high chi2: " << ipass << " " << itr << " " << chi2 << " " << chi22(0,0) << " " <<
587 // chi21(0,0) << " " << vtx[0] << " " << vtx[1] << " " << vtx[2] << " " << fVtx[0] << " " << fVtx[1] <<
588 // " "
589 // << fVtx[2] << " " << tracks[0]->GetNode() << " " << tracks[1]->GetNode() << " ids: " <<
590 // tracks[0]->GetTrackID() << " " << tracks[1]->GetTrackID() << " " << xk0(0,0) << " " << xk0(1,0) << "
591 // " << xk0(2,0) << " " << xk(0,0) << " " << xk(1,0) << " " << xk(2,0) << endl;
592 return -cutChi2;
593 }
594 // cout << ipass << " " << itr << " " << chi2 << endl;
595 } // for (Int_t itr = ibeg; itr != iend;
596 } // for (Int_t ipass = 0; ipass < nPass;
597
598 for (Int_t i = 0; i < 3; ++i)
599 vtx[i] = fVtx[i] = xk(i, 0);
600 fCovar = c;
601
602 int err = Smooth(vDaught);
603 if (err)
604 chi2 = -9.0;
605 return chi2;
606}
607
608//__________________________________________________________________________
609Bool_t BmnMotherFitterPart::Smooth(vector<BmnParticle*> vDaught)
610{
612
613 TMatrixD c(3, 3), xk(3, 1), ck0(5, 1);
614 TMatrixD a(5, 3), b(5, 3);
615
616 xk.SetMatrixArray(fVtx);
617 Int_t nDaught = vDaught.size();
618 Bool_t err = kFALSE;
619
620 for (Int_t itr = 0; itr < nDaught; ++itr) {
621
622 BmnParticle* part = vDaught[itr];
623
624 TMatrixD g = part->GetG(); // track weight matrix
625 err = ComputeAandB(xk, *part, a, b, ck0); // compute matrices of derivatives
626 if (err)
627 return err;
628
629 // W = (Bt*G*B)'
630 TMatrixD tmp(g, TMatrixD::kMult, b);
631 TMatrixD w(b, TMatrixD::kTransposeMult, tmp);
632 w.Invert();
633
634 TMatrixD m = part->GetMeas();
635 m -= ck0; // m-ck0
636
637 // qk = W*Bt*G*(m-ck0-A*xk)
638 TMatrixD tmp21(a, TMatrixD::kMult, xk);
639 tmp21 *= -1;
640 tmp21 += m; // m-ck0-A*xk
641 TMatrixD tmp22(g, TMatrixD::kMult, tmp21);
642 TMatrixD tmp23(b, TMatrixD::kTransposeMult, tmp22);
643 TMatrixD qk(w, TMatrixD::kMult, tmp23);
644
645 // Update momentum and last coordinates
646 /*
647 TMatrixD par = *track->GetParam();
648 for (Int_t i = 0; i < 3; ++i) par(i+2,0) = qk(i,0);
649 par(0,0) = rad * phi;
650 par(1,0) = fVtx[2];
651 track->SetParam(par);
652 track->SetPosNew(rad);
653
654 // Update track length
655 Double_t dLeng = track1.GetLength(); // track length from DCA to last saved position
656 track1.SetParam(par);
657 track1.SetPos(rad);
658 track1.SetLength(0.);
659 if (track->GetNode() == "") fKF->PropagateParamR(&track1,&hit,kTRUE);
660 else fKF->PropagateParamP(&track1,&hit,kTRUE,kTRUE);
661
662 track->SetLength (track->GetLength() - dLeng + track1.GetLength());
663 */
664
665 // Save all matrices for further usage
666 part->Setq(qk);
667 part->Setx(xk);
668 part->SetA(a);
669 part->SetB(b);
670 part->SetC(fCovar);
671 part->SetW(w);
672
673 // E = -C*At*G*B*W
674 TMatrixD tmp31(b, TMatrixD::kMult, w);
675 TMatrixD tmp32(g, TMatrixD::kMult, tmp31);
676 TMatrixD tmp33(a, TMatrixD::kTransposeMult, tmp32);
677 TMatrixD e(fCovar, TMatrixD::kMult, tmp33);
678
679 // D = W + W*Bt*G*A*C*At*G*B*W = W + W*Bt*G*A*(-E)
680 TMatrixD tmp41(a, TMatrixD::kMult, e);
681 e *= -1.0;
682 part->SetCovE(e);
683 TMatrixD tmp42(g, TMatrixD::kMult, tmp41);
684 TMatrixD tmp43(b, TMatrixD::kTransposeMult, tmp42);
685 TMatrixD d(w, TMatrixD::kMult, tmp43);
686 d += w;
687 part->SetCovD(d);
688 } // for (Int_t itr = 0; itr < nDaught;
689
690 return err;
691}
692
693//__________________________________________________________________________
694
695Bool_t BmnMotherFitterPart::ComputeAandB(const TMatrixD& xk0,
696 const BmnParticle& part,
697 TMatrixD& a,
698 TMatrixD& b,
699 TMatrixD& ck0,
700 Bool_t flag)
701{
703
704 if (part.GetCharge() == 0) {
705 // Neutral particle
706 return ComputeAB0(xk0, part, a, b, ck0, flag);
707 }
708
709 Double_t vert0[3];
710 const Double_t* vert = xk0.GetMatrixArray();
711
712 for (Int_t i = 0; i < 3; ++i)
713 vert0[i] = vert[i];
714
715 // Put track at xk0
716 CbmKFTrack tr = part.GetKFTrack();
717 tr.Extrapolate(vert0[2]);
718 tr.GetTrack()[0] = vert0[0];
719 tr.GetTrack()[1] = vert0[1];
720 tr.GetTrack()[5] = vert0[2];
721 CbmKFTrack tr0(tr);
722
723 // Propagate track to zhit
724 // AZ-060725 Bool_t err = tr.Extrapolate(zhit);
725 // Bool_t err = tr.Extrapolate (part.GetZ());
726 Bool_t err = tr.Propagate(part.GetZ0());
727 // if (err) continue;
728 if (err)
729 return err;
730
731 // Double_t shift = 0.01; // 100 um coordinate shift
732 Double_t shift = 0.1; // 1 mm coordinate shift
733
734 for (Int_t i = 0; i < 3; ++i) {
735 CbmKFTrack tr1(tr0);
736 vert0[i] += shift;
737 if (i > 0)
738 vert0[i - 1] -= shift;
739 tr1.GetTrack()[0] = vert0[0];
740 tr1.GetTrack()[1] = vert0[1];
741 tr1.GetTrack()[5] = vert0[2];
742
743 // Propagate track to zhit
744 // AZ-060725 err = tr1.Extrapolate(zhit);
745 // err = tr1.Extrapolate (part.GetZ());
746 err = tr1.Propagate(part.GetZ0());
747 // if (err) continue;
748 if (err)
749 return err;
750
751 // Derivatives
752 for (Int_t j = 0; j < 5; ++j) {
753 // a(j, i) = (track1.GetParamNew(j) - trackk.GetParamNew(j)) / shift;
754 a(j, i) = (tr1.GetTrack()[j] - tr.GetTrack()[j]) / shift;
755 }
756 }
757
758 for (Int_t i = 0; i < 3; ++i) {
759 CbmKFTrack tr1(tr0);
760 Int_t j = i + 2;
761 // shift = (*track->GetCovariance())(j, j);
762 int indx = CbmKFMath::indexS(j, j);
763 // AZ-060725 shift = track.GetCovMatrix()[indx];
764 shift = tr0.GetCovMatrix()[indx];
765 // AZ-010126 shift = TMath::Sqrt(shift);
766 shift = TMath::Sqrt(TMath::Abs(shift)); // AZ-010126
767 if (j == 4)
768 // AZ-070725 shift *= TMath::Sign(1., -tr0.GetTrack()[j]); // 1/p
769 shift *= TMath::Sign(1., tr0.GetTrack()[j]); // 1/p
770 // track1.SetParam(j, track0.GetParamNew(j) + shift);
771 tr1.GetTrack()[j] += shift;
772
773 // Propagate track to zhit
774 // AZ-060725 err = tr1.Extrapolate(zhit);
775 // err = tr1.Extrapolate(part.GetZ());
776 err = tr1.Propagate(part.GetZ0());
777 // if (err) continue;
778 if (err)
779 return err;
780
781 // Derivatives
782 for (Int_t k = 0; k < 5; ++k) {
783 // b(k, i) = (track1.GetParamNew(k) - trackk.GetParamNew(k)) / shift;
784 b(k, i) = (tr1.GetTrack()[k] - tr.GetTrack()[k]) / shift;
785 }
786 }
787
788 if (!flag)
789 return kFALSE;
790
791 TMatrixD qk0(3, 1);
792 // for (Int_t i = 0; i < 3; ++i) qk0(i, 0) = track0.GetParamNew(i + 2);
793 for (Int_t i = 0; i < 3; ++i)
794 qk0(i, 0) = tr0.GetTrack()[i + 2];
795 // qk0.Print();
796 // ck0 = *trackk.GetParamNew();
797 for (int i = 0; i < 5; ++i)
798 ck0(i, 0) = tr.GetTrack()[i];
799 ck0 -= TMatrixD(a, TMatrixD::kMult, xk0);
800 ck0 -= TMatrixD(b, TMatrixD::kMult, qk0);
801 // cout << " Derivatives: " << endl;
802 // a.Print();
803 // b.Print();
804 // ck0.Print();
805 // TMatrixD(b,TMatrixD::kMult,qk0).Print();
806 // TMatrixD(a,TMatrixD::kMult,xk0).Print();
807 return kFALSE;
808}
809
810//__________________________________________________________________________
811
812Bool_t BmnMotherFitterPart::ComputeAB0(const TMatrixD& xk0,
813 const BmnParticle& part,
814 TMatrixD& a,
815 TMatrixD& b,
816 TMatrixD& ck0,
817 Bool_t flag)
818{
821
822 // AZ-130725 Made as for the charged particles
823
824 Double_t vert0[3];
825 const Double_t* vert = xk0.GetMatrixArray();
826
827 for (Int_t i = 0; i < 3; ++i)
828 vert0[i] = vert[i];
829
830 // Put track at xk0
831 CbmKFTrack tr = part.GetKFTrack();
832 tr.Extrapolate(vert0[2]);
833 tr.GetTrack()[0] = vert0[0];
834 tr.GetTrack()[1] = vert0[1];
835 tr.GetTrack()[5] = vert0[2];
836 CbmKFTrack tr0(tr);
837
838 // Propagate track to zhit
839 // AZ-060725 Bool_t err = tr.Extrapolate(zhit);
840 // Bool_t err = tr.Extrapolate (part.GetZ());
841 Bool_t err = tr.Propagate(part.GetZ0());
842 // if (err) continue;
843 if (err)
844 return err;
845
846 // Double_t shift = 0.01; // 100 um coordinate shift
847 Double_t shift = 0.1; // 1 mm coordinate shift
848
849 for (Int_t i = 0; i < 3; ++i) {
850 CbmKFTrack tr1(tr0);
851 vert0[i] += shift;
852 if (i > 0)
853 vert0[i - 1] -= shift;
854 tr1.GetTrack()[0] = vert0[0];
855 tr1.GetTrack()[1] = vert0[1];
856 tr1.GetTrack()[5] = vert0[2];
857
858 // Propagate track to zhit
859 // AZ-060725 err = tr1.Extrapolate(zhit);
860 // err = tr1.Extrapolate (part.GetZ());
861 err = tr1.Propagate(part.GetZ0());
862 // if (err) continue;
863 if (err)
864 return err;
865
866 // Derivatives
867 for (Int_t j = 0; j < 5; ++j) {
868 // a(j, i) = (track1.GetParamNew(j) - trackk.GetParamNew(j)) / shift;
869 a(j, i) = (tr1.GetTrack()[j] - tr.GetTrack()[j]) / shift;
870 }
871 }
872
873 b = 0.0; // AZ-150725
874
875 // AZ-150725 for (Int_t i = 0; i < 3; ++i) {
876 for (Int_t i = 0; i < 2; ++i) { // !!! AZ-150725 - d/dp can't be computed via this scheme
877 CbmKFTrack tr1(tr0);
878 Int_t j = i + 2;
879 /*
880 // shift = (*track->GetCovariance())(j, j);
881 int indx = CbmKFMath::indexS(j, j);
882 // AZ-060725 shift = track.GetCovMatrix()[indx];
883 shift = tr0.GetCovMatrix()[indx];
884 shift = TMath::Sqrt(shift);
885 */
886 // shift = TMath::Max (0.01, tr1.GetTrack()[j] * 0.05); // AZ-130725
887 // AZ-080825 shift = TMath::Max(0.05, tr1.GetTrack()[j] * 0.10); // AZ-130725
888 shift = TMath::Max(0.05, TMath::Abs(tr1.GetTrack()[j]) * 0.10); // AZ-080825
889 shift *= TMath::Sign(1.0, -tr1.GetTrack()[j]); // AZ-080825
890 tr1.GetTrack()[j] += shift;
891
892 // Propagate track to zhit
893 // AZ-060725 err = tr1.Extrapolate(zhit);
894 // err = tr1.Extrapolate(part.GetZ());
895 err = tr1.Propagate(part.GetZ0());
896 // if (err) continue;
897 if (err)
898 return err;
899
900 // Derivatives
901 for (Int_t k = 0; k < 5; ++k) {
902 // b(k, i) = (track1.GetParamNew(k) - trackk.GetParamNew(k)) / shift;
903 b(k, i) = (tr1.GetTrack()[k] - tr.GetTrack()[k]) / shift;
904 }
905 }
906 b(4, 2) = 1.0; // dp / dp
907
908 if (!flag)
909 return kFALSE;
910
911 // ck0
912 /* AZ-130725
913 ck0(0, 0) = r * sinksi;
914 // ck0(1,0) = xk0(2,0) - r * cosksi / tanth;
915 ck0(1, 0) = xk0(2, 0) - r * cosksi * coTan;
916 ck0(2, 0) = part.GetMeas(2);
917 ck0(3, 0) = part.GetMeas(3);
918 ck0(4, 0) = part.GetMeas(4);
919
920 TMatrixD qk0(3, 1);
921 qk0(0, 0) = part.GetMeas(2);
922 qk0(1, 0) = part.GetMeas(3);
923 qk0(2, 0) = part.GetMeas(4);
924 ck0 -= TMatrixD(a, TMatrixD::kMult, xk0);
925 ck0 -= TMatrixD(b, TMatrixD::kMult, qk0);
926 */
927 TMatrixD qk0(3, 1);
928 // for (Int_t i = 0; i < 3; ++i) qk0(i, 0) = track0.GetParamNew(i + 2);
929 for (Int_t i = 0; i < 3; ++i)
930 // qk0(i, 0) = tr0.GetTrack()[i + 2];
931 qk0(i, 0) = part.GetMeas(i + 2);
932 // qk0.Print();
933 // ck0 = *trackk.GetParamNew();
934 // for (int i = 0; i < 5; ++i)
935 for (int i = 2; i < 5; ++i)
936 ck0(i, 0) = part.GetMeas(i);
937 ck0(0, 0) = tr.GetTrack()[0]; // AZ-150725
938 ck0(1, 0) = tr.GetTrack()[1]; // AZ-150725
939 ck0 -= TMatrixD(a, TMatrixD::kMult, xk0);
940 ck0 -= TMatrixD(b, TMatrixD::kMult, qk0);
941 return kFALSE;
942}
943
944//__________________________________________________________________________
945
946TMatrixD BmnMotherFitterPart::ComputeQmatr(vector<BmnParticle*> vDaught)
947{
951
952 TMatrixD qc(3, 3), qn(3, 3), qnc(3, 3);
953 Int_t nDaught = vDaught.size();
954
955 // Correlation between neutral-neutral or charged-charged
956
957 for (Int_t i = 0; i < nDaught; ++i) {
958 BmnParticle* part = vDaught[i];
959
960 for (Int_t j = 0; j < nDaught; ++j) {
961 BmnParticle* part1 = vDaught[j];
962 if (part1->GetCharge() * part->GetCharge() == 0 && (part1->GetCharge() != 0 || part->GetCharge() != 0))
963 continue;
964
965 TMatrixD q(3, 3);
966 if (j == i) {
967 q = part->GetD();
968 } else {
969 TMatrixD tmp = part1->GetE();
970 tmp *= -1.0;
971 TMatrixD tmp1 = TMatrixD(part->GetA(), TMatrixD::kMult, tmp);
972 TMatrixD tmp2 = TMatrixD(part->GetG(), TMatrixD::kMult, tmp1);
973 TMatrixD tmp3 = TMatrixD(part->GetB(), TMatrixD::kTransposeMult, tmp2);
974 q = TMatrixD(part->GetW(), TMatrixD::kMult, tmp3);
975 }
976
977 TMatrixD jt = TMatrixD(TMatrixD::kTransposed, part1->GetJ());
978 TMatrixD tmp11 = TMatrixD(q, TMatrixD::kMult, jt);
979 TMatrixD tmp12 = TMatrixD(part->GetJ(), TMatrixD::kMult, tmp11);
980 if (part->GetCharge() && part1->GetCharge())
981 qc += tmp12;
982 else if (part->GetCharge() == 0 && part1->GetCharge() == 0)
983 qn += tmp12;
984 }
985 }
986
987 // Correlation between neutral and charged particles
988
989 for (Int_t i = 0; i < nDaught; ++i) {
990 BmnParticle* part = vDaught[i];
991 if (part->GetCharge() != 0)
992 continue;
993
994 for (Int_t j = 0; j < nDaught; ++j) {
995 BmnParticle* part1 = vDaught[j];
996 if (part1->GetCharge() == 0)
997 continue;
998
999 TMatrixD q(3, 3);
1000 TMatrixD tmp = part1->GetE();
1001 tmp *= -1.0;
1002 TMatrixD tmp1 = TMatrixD(part->GetA(), TMatrixD::kMult, tmp);
1003 TMatrixD tmp2 = TMatrixD(part->GetG(), TMatrixD::kMult, tmp1);
1004 TMatrixD tmp3 = TMatrixD(part->GetB(), TMatrixD::kTransposeMult, tmp2);
1005 q = TMatrixD(part->GetW(), TMatrixD::kMult, tmp3);
1006
1007 TMatrixD jt = TMatrixD(TMatrixD::kTransposed, part1->GetJ());
1008 TMatrixD tmp11 = TMatrixD(q, TMatrixD::kMult, jt);
1009 TMatrixD tmp12 = TMatrixD(part->GetJ(), TMatrixD::kMult, tmp11);
1010 qnc += tmp12;
1011
1012 TMatrixD jjt = TMatrixD(TMatrixD::kTransposed, part->GetJ());
1013 TMatrixD tmp21 = TMatrixD(q, TMatrixD::kTransposeMult, jjt);
1014 TMatrixD tmp22 = TMatrixD(part1->GetJ(), TMatrixD::kMult, tmp21);
1015 qnc += tmp22;
1016 }
1017 }
1018
1019 qc += qn;
1020 qc += qnc;
1021 return qc;
1022}
1023
1024//__________________________________________________________________________
1026{
1028
1029 Double_t vpos[3] = {vtx->GetX(), vtx->GetY(), vtx->GetZ()};
1030 TMatrixD xk(3, 1), xk0(3, 1), ck0(5, 1), a(5, 3), b(5, 3), c(3, 3);
1031 TMatrixFSym cov(3);
1032 cov.SetTol(1.e-10); // AZ-311220
1033
1034 xk0.SetMatrixArray(vpos);
1035 vtx->CovMatrix(cov);
1036 cov.Invert();
1037
1038 int err = ComputeAandB(xk0, *part, a, b, ck0, kTRUE); // compute matrices of derivatives
1039 if (err)
1040 return -9.0;
1041 TMatrixD g = part->GetG();
1042
1043 // W = (Bt*G*B)'
1044 TMatrixD tmp(g, TMatrixD::kMult, b);
1045 TMatrixD w(b, TMatrixD::kTransposeMult, tmp);
1046 w.Invert();
1047
1048 // Gb = G - G*B*W*Bt*G
1049 TMatrixD tmp1(b, TMatrixD::kTransposeMult, g);
1050 TMatrixD tmp2(w, TMatrixD::kMult, tmp1);
1051 TMatrixD tmp3(b, TMatrixD::kMult, tmp2);
1052 TMatrixD tmp4(g, TMatrixD::kMult, tmp3);
1053 TMatrixD gb = g;
1054 gb -= tmp4;
1055
1056 // Ck = ((Ck-1)' + At*Gb*A)'
1057 TMatrixD tmp5(gb, TMatrixD::kMult, a);
1058 c = TMatrixD(a, TMatrixD::kTransposeMult, tmp5);
1059 c += cov;
1060 c.Invert();
1061
1062 // xk = Ck*((Ck-1)'x(k-1)+At*Gb*(m-ck0))
1063 TMatrixD m = part->GetMeas();
1064 m -= ck0; // m-ck0
1065
1066 TMatrixD tmp11(gb, TMatrixD::kMult, m);
1067 TMatrixD tmp12(a, TMatrixD::kTransposeMult, tmp11);
1068 TMatrixD tmp13(cov, TMatrixD::kMult, xk0);
1069 tmp13 += tmp12;
1070 xk = TMatrixD(c, TMatrixD::kMult, tmp13);
1071
1072 // qk = W*Bt*G*(m-ck0-A*xk)
1073 TMatrixD tmp21(a, TMatrixD::kMult, xk);
1074 tmp21 *= -1;
1075 tmp21 += m; // m-ck0-A*xk
1076 TMatrixD tmp22(g, TMatrixD::kMult, tmp21);
1077 TMatrixD tmp23(b, TMatrixD::kTransposeMult, tmp22);
1078 TMatrixD qk(w, TMatrixD::kMult, tmp23);
1079
1080 // Residual m-ck0-A*xk-B*qk
1081 TMatrixD r = tmp21;
1082 TMatrixD tmp31(b, TMatrixD::kMult, qk);
1083 r -= tmp31;
1084
1085 // Chi2 = rt*G*r + (xk-x(k-1))t*(Ck-1)'*(xk-x(k-1))
1086 TMatrixD tmp41(g, TMatrixD::kMult, r);
1087 TMatrixD chi21(r, TMatrixD::kTransposeMult, tmp41);
1088 TMatrixD dx = xk;
1089 dx -= xk0;
1090 TMatrixD tmp42(cov, TMatrixD::kMult, dx);
1091 TMatrixD chi22(dx, TMatrixD::kTransposeMult, tmp42);
1092 chi21 += chi22;
1093
1094 return chi21(0, 0);
1095}
1096
1097//__________________________________________________________________________
1098
1099TVector3 BmnMotherFitterPart::Parabola(TVector3& pos0, TVector3& pos1, TVector3& pos2)
1100{
1101 // Get parabolic track approximation from 3 points (X vs Z)
1102 // y = a*x^2 + bx + c
1103
1104 Double_t x[3] = {pos0[2], pos1[2], pos2[2]};
1105 Double_t y[3] = {pos0[0], pos1[0], pos2[0]};
1106
1107 Double_t denom = (x[0] - x[1]) * (x[0] - x[2]) * (x[1] - x[2]);
1108 Double_t dy10 = y[1] - y[0];
1109 Double_t dy02 = y[0] - y[2];
1110 Double_t dy21 = y[2] - y[1];
1111 Double_t a = x[2] * dy10 + x[1] * dy02 + x[0] * dy21;
1112 a /= denom;
1113 Double_t b = -x[0] * x[0] * dy21 - x[2] * x[2] * dy10 - x[1] * x[1] * dy02;
1114 b /= denom;
1115 Double_t c = x[1] * x[1] * (x[2] * y[0] - x[0] * y[2]) + x[1] * (x[0] * x[0] * y[2] - x[2] * x[2] * y[0])
1116 + x[0] * x[2] * (x[2] - x[0]) * y[1];
1117 c /= denom;
1118
1119 return TVector3(c, b, a);
1120 // 𝐴=𝑥3(𝑦2−𝑦1)+𝑥2(𝑦1−𝑦3)+𝑥1(𝑦3−𝑦2) / (𝑥1−𝑥2)(𝑥1−𝑥3)(𝑥2−𝑥3)
1121 // 𝐵=𝑥21(𝑦2−𝑦3)+𝑥23(𝑦1−𝑦2)+𝑥22(𝑦3−𝑦1) / (𝑥1−𝑥2)(𝑥1−𝑥3)(𝑥2−𝑥3)
1122 // 𝐶=𝑥22(𝑥3𝑦1−𝑥1𝑦3)+𝑥2(𝑥21𝑦3−𝑥23𝑦1)+𝑥1𝑥3(𝑥3−𝑥1)𝑦2 / (𝑥1−𝑥2)(𝑥1−𝑥3)(𝑥2−𝑥3)
1123}
1124
ClassImp(BmnMotherFitterPart)
const Float_t d
Z-ccordinate of the first GEM-station.
Definition BmnMwpcHit.cxx:7
int i
Definition P4_F32vec4.h:22
__m128 m
Definition P4_F32vec4.h:27
Kalman filter mother particle fitter for the BM@N detector.
virtual ~BmnMotherFitterPart()
Destructor.
Double_t Chi2Vertex(BmnParticle *part, const CbmVertex *vtx)
compute Chi2 w.r.t. vertex
virtual void Exec(Option_t *option)
TMatrixD ComputeQmatr(vector< BmnParticle * > vDaught)
virtual InitStatus ReInit()
Bool_t ComputeAandB(const TMatrixD &xk0, const BmnParticle &part, TMatrixD &a, TMatrixD &b, TMatrixD &ck0, Bool_t flag=kTRUE)
static BmnMotherFitterPart * Instance()
get singleton instance
Double_t BuildMother(BmnParticle *mother, vector< BmnParticle * > &vDaught)
virtual InitStatus Init()
Double_t FindVertex(vector< BmnParticle * > vDaught, TVector3 &vtx)
Double_t GetMass() const
Definition BmnParticle.h:65
TMatrixD & GetW()
TMatrixD & Getx()
TMatrixD & GetJinv()
void SetCovD(TMatrixD &matr)
Double_t GetMeas(Int_t i) const
Definition BmnParticle.h:66
void SetG(TMatrixD &matr)
void SetW(TMatrixD &matr)
CbmKFTrack GetKFTrack() const
TMatrixD & GetD()
void SetCharge(Int_t charge)
Int_t GetCharge() const
Definition BmnParticle.h:64
TMatrixD & GetA()
void SetChi2(Double_t chi2)
void SetA(TMatrixD &matr)
Double_t GetZ0() const
Definition BmnParticle.h:69
int GetNDF() const
Definition BmnParticle.h:61
TVector3 Momentum3() const
Definition BmnParticle.h:85
void SetZ(Double_t z)
void SetMass(Double_t mass=-2.0)
void SetCovE(TMatrixD &matr)
void SetB(TMatrixD &matr)
TMatrixD & GetJ()
void SetNDF(int ndf)
void Setq(TMatrixD &matr)
void FillJinv(TVector3 &mom3)
void AddDaughter(Int_t indx)
TMatrixD & GetE()
TMatrixD & GetG()
Double_t GetXY(Int_t i) const
Definition BmnParticle.h:67
void Setx(TMatrixD &matr)
void ParamsAtDca()
Int_t GetIndx() const
Definition BmnParticle.h:62
TMatrixD & GetB()
void SetC(TMatrixD &matr)
static Int_t indexS(Int_t i, Int_t j)
Definition CbmKFMath.h:33
Int_t Propagate(Double_t z_out, Double_t QP0, Bool_t line=false)
Int_t Extrapolate(Double_t z, Double_t *QP0=0, Bool_t line=false)
Access to i-th hit.
void GetTrackParam(FairTrackParam &track)
Double_t * GetTrack()
Is it electron.
Definition CbmKFTrack.h:51
Double_t * GetCovMatrix()
array[6] of track parameters(x,y,tx,ty,qp,z)
Definition CbmKFTrack.h:52
static CbmKF * Instance()
Definition CbmKF.h:35
Double_t GetZ() const
Definition CbmVertex.h:60
void CovMatrix(TMatrixFSym &covMat) const
Double_t GetX() const
Definition CbmVertex.h:58
Double_t GetY() const
Definition CbmVertex.h:59
name
Definition setup.py:7