15#include "CbmKFTrack.h"
16#include "CbmStsTrack.h"
21#include "FairRunAna.h"
35BmnMotherFitterPart::BmnMotherFitterPart()
40 fCovar.ResizeTo(3, 3);
46BmnMotherFitterPart::BmnMotherFitterPart(
const char* name,
const char* title)
52 fCovar.ResizeTo(3, 3);
66 std::atexit(DestroyInstance);
79 std::atexit(DestroyInstance);
96 cout <<
"InitStatus MpdMotherFitterPart::Init\n\n";
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;
102 bZ = TMath::Abs(magField->GetBz(0, 0, 0));
103 fieldConst = 0.3 * 0.01 * bZ / 10;
107 TCanvas* c1 = (TCanvas*)gROOT->FindObject(
"cMothFit");
109 fTestHist =
new TH1D(
"hTestHist",
" ", 110, -10, 100);
160 Int_t nDaught = vDaught.size();
173 Int_t charge = 0, ndf = 0;
174 Double_t energy = 0.0;
176 for (Int_t
i = 0;
i < nDaught; ++
i) {
182 energy += TMath::Sqrt(part->
GetMass() * part->
GetMass() + ptot * ptot);
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());
202 qm(0, 0) = mom3.X() / mom3.Z();
203 qm(1, 0) = mom3.Y() / mom3.Z();
205 qm(2, 0) = mom3.Mag();
207 qm(2, 0) = charge / mom3.Mag();
220 for (Int_t
i = 0;
i < nDaught; ++
i) {
223 TMatrixD jt = TMatrixD(TMatrixD::kTransposed, part->
GetJ());
224 TMatrixD tmp = TMatrixD(part->
GetE(), TMatrixD::kMult, jt);
246 TMatrixD at(TMatrixD::kTransposed, mother->
GetA());
247 TMatrixD tmp11(c, TMatrixD::kMult, at);
248 TMatrixD tmp12(mother->
GetA(), TMatrixD::kMult, tmp11);
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);
255 TMatrixD tmp31(etot, TMatrixD::kTransposeMult, at);
256 TMatrixD tmp32(mother->
GetJinv(), TMatrixD::kMult, tmp31);
257 TMatrixD tmp33(mother->
GetB(), TMatrixD::kMult, tmp32);
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);
291 vector<MpdHelix> vhel;
293 // Create 2 helices and cross them
294 for (Int_t itr = 0; itr < 2; ++itr) {
295 Double_t rad = vTracks[itr]->GetPosNew();
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()));
302 pair<Double_t, Double_t> paths = vhel[0].pathLengths(vhel[1]);
304 Double_t xyz[3] = {0};
305 Int_t ntr = vTracks.size();
307 if (paths.first < 100.0 || paths.second < 100.0) {
309 // hit.SetType(MpdKalmanHit::kFixedR);
310 cross = vhel[0].at(paths.first);
311 cross += vhel[1].at(paths.second);
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);
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));
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];
340Bool_t BmnMotherFitterPart::EvalVertex(vector<BmnParticle*> vDaught)
345 int nDaught = vDaught.size();
347 TMatrixFSym covMatr(5);
351 for (
int iter = 0; iter < niter; ++iter) {
353 vector<FairTrackParam> vParams;
357 for (
int ip = 0; ip < nDaught; ++ip) {
359 fVtx[2] = TMath::Min(fVtx[2], part->
GetXY(0));
363 for (
int ip = 0; ip < nDaught; ++ip) {
371 vParams.push_back(par);
375 Double_t zzz = 0, dxmax = 0;
378 for (
int ip = 0; ip < nDaught; ++ip) {
379 Double_t ty0 = vParams[ip].GetTy();
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;
393 int ierr1 = tr1.Propagate(z);
394 if (ierr != 0 || ierr1 != 0)
396 dxmax = TMath::Max(dxmax, TMath::Abs(tr.
GetTrack()[0] - tr1.GetTrack()[0]));
400 fVtx[2] = (npairs) ? zzz / npairs : 0.0;
409 if (fTestHist && iter == 0) {
411 TCanvas* c1 = (TCanvas*)gROOT->FindObject(
"cMothFit");
412 Double_t cmax = fTestHist->GetBinContent(fTestHist->GetMaximumBin());
413 fTestHist->SetMaximum(cmax * 1.1);
415 fTestHist->Fit(
"pol2",
"w");
427 if (TMath::Abs(fVtx[2]) > 170)
429 fVtx[0] = fVtx[1] = 0.0;
431 for (
int ip = 0; ip < nDaught; ++ip) {
440 fVtx[0] += par.GetX();
441 fVtx[1] += par.GetY();
446 if (TMath::Abs(fVtx[0]) > 50.0 || TMath::Abs(fVtx[1]) > 40.0)
458 const Int_t nPass = 3;
459 const Double_t cutChi2 = 1000.;
461 if (!EvalVertex(vDaught))
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);
470 xk.SetMatrixArray(fVtx);
472 c(0, 0) = c(1, 1) = c(2, 2) = 1;
474 for (Int_t ipass = 0; ipass < nPass; ++ipass) {
479 c(0, 0) = c(1, 1) = c(2, 2) = 100;
481 cov = TMatrixD(TMatrixD::kInverted, c);
483 Int_t ibeg = 0, iend = nDaught, istep = 1;
490 for (Int_t itr = ibeg; itr != iend; itr += istep) {
492 cov = TMatrixD(TMatrixD::kInverted, c);
500 TMatrixD g = part->
GetG();
503 TMatrixD tmp(g, TMatrixD::kMult, b);
504 TMatrixD w(b, TMatrixD::kTransposeMult, tmp);
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);
516 TMatrixD tmp5(gb, TMatrixD::kMult, a);
517 c = TMatrixD(a, TMatrixD::kTransposeMult, tmp5);
528 TMatrixD tmp11(gb, TMatrixD::kMult,
m);
529 TMatrixD tmp12(a, TMatrixD::kTransposeMult, tmp11);
530 TMatrixD tmp13(cov, TMatrixD::kMult, xk0);
532 xk = TMatrixD(c, TMatrixD::kMult, tmp13);
537 TMatrixD tmp21(a, TMatrixD::kMult, xk);
540 TMatrixD tmp22(g, TMatrixD::kMult, tmp21);
541 TMatrixD tmp23(b, TMatrixD::kTransposeMult, tmp22);
542 TMatrixD qk(w, TMatrixD::kMult, tmp23);
546 TMatrixD tmp31(b, TMatrixD::kMult, qk);
553 TMatrixD tmp41(g, TMatrixD::kMult, r);
554 TMatrixD chi21(r, TMatrixD::kTransposeMult, tmp41);
560 TMatrixD tmp42(cov, TMatrixD::kMult, dx);
561 TMatrixD chi22(dx, TMatrixD::kTransposeMult, tmp42);
563 if (chi21(0, 0) < 0 || chi22(0, 0) < 0) {
564 cout <<
" !!! Chi2 < 0 " << chi21(0, 0) <<
" " << chi22(0, 0) <<
" " << ipass <<
" " << itr <<
" "
571 if (chi2 > cutChi2 || chi21(0, 0) < 0 || chi22(0, 0) < 0) {
572 for (Int_t
i = 0;
i < 3; ++
i)
598 for (Int_t
i = 0;
i < 3; ++
i)
599 vtx[
i] = fVtx[
i] = xk(
i, 0);
602 int err = Smooth(vDaught);
609Bool_t BmnMotherFitterPart::Smooth(vector<BmnParticle*> vDaught)
613 TMatrixD c(3, 3), xk(3, 1), ck0(5, 1);
614 TMatrixD a(5, 3), b(5, 3);
616 xk.SetMatrixArray(fVtx);
617 Int_t nDaught = vDaught.size();
620 for (Int_t itr = 0; itr < nDaught; ++itr) {
624 TMatrixD g = part->
GetG();
630 TMatrixD tmp(g, TMatrixD::kMult, b);
631 TMatrixD w(b, TMatrixD::kTransposeMult, tmp);
638 TMatrixD tmp21(a, TMatrixD::kMult, xk);
641 TMatrixD tmp22(g, TMatrixD::kMult, tmp21);
642 TMatrixD tmp23(b, TMatrixD::kTransposeMult, tmp22);
643 TMatrixD qk(w, TMatrixD::kMult, tmp23);
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);
680 TMatrixD tmp41(a, TMatrixD::kMult, e);
683 TMatrixD tmp42(g, TMatrixD::kMult, tmp41);
684 TMatrixD tmp43(b, TMatrixD::kTransposeMult, tmp42);
685 TMatrixD
d(w, TMatrixD::kMult, tmp43);
706 return ComputeAB0(xk0, part, a, b, ck0, flag);
710 const Double_t* vert = xk0.GetMatrixArray();
712 for (Int_t
i = 0;
i < 3; ++
i)
732 Double_t shift = 0.1;
734 for (Int_t
i = 0;
i < 3; ++
i) {
738 vert0[
i - 1] -= shift;
752 for (Int_t j = 0; j < 5; ++j) {
758 for (Int_t
i = 0;
i < 3; ++
i) {
766 shift = TMath::Sqrt(TMath::Abs(shift));
769 shift *= TMath::Sign(1., tr0.
GetTrack()[j]);
782 for (Int_t k = 0; k < 5; ++k) {
793 for (Int_t
i = 0;
i < 3; ++
i)
797 for (
int i = 0;
i < 5; ++
i)
799 ck0 -= TMatrixD(a, TMatrixD::kMult, xk0);
800 ck0 -= TMatrixD(b, TMatrixD::kMult, qk0);
812Bool_t BmnMotherFitterPart::ComputeAB0(
const TMatrixD& xk0,
825 const Double_t* vert = xk0.GetMatrixArray();
827 for (Int_t
i = 0;
i < 3; ++
i)
847 Double_t shift = 0.1;
849 for (Int_t
i = 0;
i < 3; ++
i) {
853 vert0[
i - 1] -= shift;
854 tr1.GetTrack()[0] = vert0[0];
855 tr1.GetTrack()[1] = vert0[1];
856 tr1.GetTrack()[5] = vert0[2];
861 err = tr1.Propagate(part.
GetZ0());
867 for (Int_t j = 0; j < 5; ++j) {
869 a(j,
i) = (tr1.GetTrack()[j] - tr.
GetTrack()[j]) / shift;
876 for (Int_t
i = 0;
i < 2; ++
i) {
888 shift = TMath::Max(0.05, TMath::Abs(tr1.GetTrack()[j]) * 0.10);
889 shift *= TMath::Sign(1.0, -tr1.GetTrack()[j]);
890 tr1.GetTrack()[j] += shift;
895 err = tr1.Propagate(part.
GetZ0());
901 for (Int_t k = 0; k < 5; ++k) {
903 b(k,
i) = (tr1.GetTrack()[k] - tr.
GetTrack()[k]) / shift;
929 for (Int_t
i = 0;
i < 3; ++
i)
935 for (
int i = 2;
i < 5; ++
i)
939 ck0 -= TMatrixD(a, TMatrixD::kMult, xk0);
940 ck0 -= TMatrixD(b, TMatrixD::kMult, qk0);
952 TMatrixD qc(3, 3), qn(3, 3), qnc(3, 3);
953 Int_t nDaught = vDaught.size();
957 for (Int_t
i = 0;
i < nDaught; ++
i) {
960 for (Int_t j = 0; j < nDaught; ++j) {
969 TMatrixD tmp = part1->
GetE();
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);
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);
989 for (Int_t
i = 0;
i < nDaught; ++
i) {
994 for (Int_t j = 0; j < nDaught; ++j) {
1000 TMatrixD tmp = part1->
GetE();
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);
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);
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);
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);
1034 xk0.SetMatrixArray(vpos);
1041 TMatrixD g = part->
GetG();
1044 TMatrixD tmp(g, TMatrixD::kMult, b);
1045 TMatrixD w(b, TMatrixD::kTransposeMult, tmp);
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);
1057 TMatrixD tmp5(gb, TMatrixD::kMult, a);
1058 c = TMatrixD(a, TMatrixD::kTransposeMult, tmp5);
1066 TMatrixD tmp11(gb, TMatrixD::kMult,
m);
1067 TMatrixD tmp12(a, TMatrixD::kTransposeMult, tmp11);
1068 TMatrixD tmp13(cov, TMatrixD::kMult, xk0);
1070 xk = TMatrixD(c, TMatrixD::kMult, tmp13);
1073 TMatrixD tmp21(a, TMatrixD::kMult, xk);
1076 TMatrixD tmp22(g, TMatrixD::kMult, tmp21);
1077 TMatrixD tmp23(b, TMatrixD::kTransposeMult, tmp22);
1078 TMatrixD qk(w, TMatrixD::kMult, tmp23);
1082 TMatrixD tmp31(b, TMatrixD::kMult, qk);
1086 TMatrixD tmp41(g, TMatrixD::kMult, r);
1087 TMatrixD chi21(r, TMatrixD::kTransposeMult, tmp41);
1090 TMatrixD tmp42(cov, TMatrixD::kMult, dx);
1091 TMatrixD chi22(dx, TMatrixD::kTransposeMult, tmp42);
1099TVector3 BmnMotherFitterPart::Parabola(TVector3& pos0, TVector3& pos1, TVector3& pos2)
1104 Double_t x[3] = {pos0[2], pos1[2], pos2[2]};
1105 Double_t y[3] = {pos0[0], pos1[0], pos2[0]};
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;
1113 Double_t b = -x[0] * x[0] * dy21 - x[2] * x[2] * dy10 - x[1] * x[1] * dy02;
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];
1119 return TVector3(c, b, a);
ClassImp(BmnMotherFitterPart)
const Float_t d
Z-ccordinate of the first GEM-station.
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)
TMatrixD & GetCovariance()
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)
void SetCovD(TMatrixD &matr)
Double_t GetMeas(Int_t i) const
void SetG(TMatrixD &matr)
void SetW(TMatrixD &matr)
CbmKFTrack GetKFTrack() const
void SetCharge(Int_t charge)
void SetChi2(Double_t chi2)
void SetA(TMatrixD &matr)
TVector3 Momentum3() const
void SetMass(Double_t mass=-2.0)
void SetCovE(TMatrixD &matr)
void SetB(TMatrixD &matr)
void Setq(TMatrixD &matr)
void FillJinv(TVector3 &mom3)
void AddDaughter(Int_t indx)
Double_t GetXY(Int_t i) const
void Setx(TMatrixD &matr)
void SetC(TMatrixD &matr)
static Int_t indexS(Int_t i, Int_t j)
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.
Double_t * GetCovMatrix()
array[6] of track parameters(x,y,tx,ty,qp,z)
static CbmKF * Instance()
void CovMatrix(TMatrixFSym &covMat) const