14#include "CbmKFTrack.h"
15#include "CbmStsTrack.h"
17#include <TDatabasePDG.h>
18#include <TMatrixDSym.h>
25 , fMass(TDatabasePDG::Instance()->GetParticle(
"pi+")->Mass())
51 fDaughtersInds.clear();
57 fXY0[0] = fXY0[1] = 0.0;
58 fG(0, 0) = fG(1, 1) = fG(2, 2) = fG(3, 3) = fG(4, 4) = 0.001;
78 fDaughtersInds.clear();
98 fDaughtersInds.clear();
109 , fCharge(part.fCharge)
111 , fieldConst(part.fieldConst)
125 , fChi2ver(part.fChi2ver)
127 , fPoint00(part.fPoint00)
133 fXY0[0] = part.fXY0[0];
134 fXY0[1] = part.fXY0[1];
135 fDaughtersInds = part.fDaughtersInds;
150 TObject::operator=(part);
154 fCharge = part.fCharge;
156 fieldConst = part.fieldConst;
170 fChi2ver = part.fChi2ver;
176 fXY0[0] = part.fXY0[0];
177 fXY0[1] = part.fXY0[1];
178 fDaughtersInds = part.fDaughtersInds;
195 MpdKalmanTrack *trackKF = (MpdKalmanTrack*) track;
196 Double_t pt = 1. / TMath::Abs(trackKF->GetParam(4));
197 Double_t ptthis = 1. / TMath::Abs((*fParam)(4,0));
198 if (ptthis < pt) return 1;
199 else if (ptthis > pt) return -1;
208 fMass = (mass > -1.0) ? mass : TDatabasePDG::Instance()->GetParticle(fPdg)->Mass();
218 fCharge = TMath::Sign(1.5, track.
GetTrack()[4]);
219 fMeas.ResizeTo(5, 1);
223 fJinv.ResizeTo(3, 3);
238 fXY0[0] = fXY0[1] = 0.0;
242 Double_t vert[3] = {0};
250 FairTrackParam param;
252 fMeas(0, 0) = param.GetX();
253 fMeas(1, 0) = param.GetY();
254 fMeas(2, 0) = param.GetTx();
255 fMeas(3, 0) = param.GetTy();
256 fMeas(4, 0) = param.GetQp();
262 fq(0, 0) = fMeas(2, 0);
263 fq(1, 0) = fMeas(3, 0);
264 fq(2, 0) = fMeas(4, 0);
266 TMatrixDSym covar(5);
268 for (
int i = 0;
i < 5; ++
i) {
269 covar(
i,
i) = param.GetCovariance(
i,
i);
271 for (
int j =
i + 1; j < 5; ++j)
272 covar(
i, j) = covar(j,
i) = param.GetCovariance(
i, j);
275 TMatrixD weight(5, 5);
276 weight.SetMatrixArray(covar.GetMatrixArray());
284void BmnParticle::FindPca(
CbmKFTrack& tr, Double_t* vert)
289 Double_t zpca = vert[2], dz = 5.0;
291 for (
int iter = 0; iter < 2; ++iter) {
296 for (
int i = -1;
i < 2; ++
i) {
297 Double_t z = zpca + dz *
i;
300 Double_t dx = pars[0] - vert[0], dy = pars[1] - vert[1];
302 Double_t
dist = TMath::Sqrt(dx * dx + dy * dy);
303 pos[
i + 1].SetX(
dist);
306 TVector3 cba = Parabola(pos[0], pos[1], pos[2]);
307 zpca = -cba[1] / cba[2] / 2;
314TVector3 BmnParticle::Parabola(TVector3& pos0, TVector3& pos1, TVector3& pos2)
319 Double_t x[3] = {pos0[2], pos1[2], pos2[2]};
320 Double_t y[3] = {pos0[0], pos1[0], pos2[0]};
322 Double_t denom = (x[0] - x[1]) * (x[0] - x[2]) * (x[1] - x[2]);
323 Double_t dy10 = y[1] - y[0];
324 Double_t dy02 = y[0] - y[2];
325 Double_t dy21 = y[2] - y[1];
326 Double_t a = x[2] * dy10 + x[1] * dy02 + x[0] * dy21;
328 Double_t b = -x[0] * x[0] * dy21 - x[2] * x[2] * dy10 - x[1] * x[1] * dy02;
330 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])
331 + x[0] * x[2] * (x[2] - x[0]) * y[1];
334 return TVector3(c, b, a);
343void BmnParticle::WeightAtDca(
CbmKFTrack& tr, Double_t* vert)
436 Double_t tx = fq(0, 0);
437 Double_t ty = fq(1, 0);
438 Double_t denom = TMath::Sqrt(tx * tx + ty * ty + 1);
439 Double_t denom2 = denom * denom;
440 Double_t pz = p0 / denom;
446 fJ(0, 0) = pz - pz * tx * tx / denom2;
447 fJ(1, 0) = -pz * tx * ty / denom2;
448 fJ(2, 0) = -pz * tx / denom2;
450 fJ(0, 1) = -pz * tx * ty / denom2;
451 fJ(1, 1) = pz - pz * ty * ty / denom2;
452 fJ(2, 1) = -pz * ty / denom2;
458 fJ(0, 2) = -tx * pz / fq(2, 0);
459 fJ(1, 2) = -ty * pz / fq(2, 0);
460 fJ(2, 2) = -pz / fq(2, 0);
464 fJ(0, 0) = pz - pz * tx * tx / denom2;
465 fJ(1, 0) = -pz * tx * ty / denom2;
466 fJ(2, 0) = -pz * tx / denom2;
468 fJ(0, 1) = -pz * tx * ty / denom2;
469 fJ(1, 1) = pz - pz * ty * ty / denom2;
470 fJ(2, 1) = -pz * ty / denom2;
472 fJ(0, 2) = tx / denom;
473 fJ(1, 2) = ty / denom;
474 fJ(2, 2) = 1 / denom;
486 Double_t px0 = mom3.X();
487 Double_t py0 = mom3.Y();
488 Double_t pz0 = mom3.Z();
489 Double_t p0 = mom3.Mag();
490 Double_t p03 = p0 * p0 * p0;
491 Double_t pz02 = pz0 * pz0;
497 fJinv(0, 0) = 1 / pz0;
499 fJinv(2, 0) = -fCharge * px0 / p03;
502 fJinv(1, 1) = 1 / pz0;
503 fJinv(2, 1) = -fCharge * py0 / p03;
505 fJinv(0, 2) = -px0 / pz02;
506 fJinv(1, 2) = -py0 / pz02;
507 fJinv(2, 2) = -fCharge * pz0 / p03;
511 fJinv(0, 0) = 1 / pz0;
513 fJinv(2, 0) = px0 / p0;
516 fJinv(1, 1) = 1 / pz0;
517 fJinv(2, 1) = py0 / p0;
519 fJinv(0, 2) = -px0 / pz02;
520 fJinv(1, 2) = -py0 / pz02;
521 fJinv(2, 2) = pz0 / p0;
543 return TMath::Sqrt(mom * mom + fMass * fMass);
553 Double_t e = TMath::Sqrt(mom * mom + fMass * fMass);
554 Double_t pz = mom3.Z();
555 Double_t y = 0.5 * TMath::Log((e + pz) / (e - pz));
573 meas(0, 0) =
Getx()(0, 0);
574 meas(1, 0) =
Getx()(1, 0);
575 meas(2, 0) =
Getq()(0, 0);
576 meas(3, 0) =
Getq()(1, 0);
577 meas(4, 0) =
Getq()(2, 0);
587 meas(0, 0) = par.GetX();
588 meas(1, 0) = par.GetY();
589 meas(2, 0) = par.GetTx();
590 meas(3, 0) = par.GetTy();
598 TMatrixDSym covar(5);
600 for (
int i = 0;
i < 5; ++
i) {
601 covar(
i,
i) = par.GetCovariance(
i,
i);
603 for (
int j =
i + 1; j < 5; ++j)
604 covar(
i, j) = covar(j,
i) = par.GetCovariance(
i, j);
607 TMatrixD weight(5, 5);
608 weight.SetMatrixArray(covar.GetMatrixArray());
619 TMatrixFSym covMatr(5);
621 for (
int i = 0;
i < 5; ++
i) {
622 covMatr(
i,
i) = fG(
i,
i);
624 for (
int j =
i + 1; j < 5; ++j) {
625 covMatr(
i, j) = covMatr(j,
i) = fG(
i, j);
vector< Double_t > dist(vector< Double_t > qp, Double_t mu)
Double_t Chi2Vertex(BmnParticle *part, const CbmVertex *vtx)
compute Chi2 w.r.t. vertex
static BmnMotherFitterPart * Instance()
get singleton instance
Double_t BuildMother(BmnParticle *mother, vector< BmnParticle * > &vDaught)
void SetG(TMatrixD &matr)
Double_t BuildMother(vector< BmnParticle * > &vDaught)
CbmKFTrack GetKFTrack() const
Double_t Rapidity() const
BmnParticle()
Default ctor.
const Double_t Chi2Vertex()
return Chi2 w.r.t. vertex
void Track2Part(CbmKFTrack &track, Bool_t setWeight, Double_t *orig)
TVector3 Momentum3() const
void SetMass(Double_t mass=-2.0)
void SetMeas(TMatrixD &matr)
void FillJinv(TVector3 &mom3)
void AddDaughter(Int_t indx)
Double_t Momentum() const
BmnParticle & operator=(const BmnParticle &part)
assignment operator
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.
static CbmKF * Instance()