16#include "CbmStsTrack.h"
18#include "FairRootManager.h"
19#include "TClonesArray.h"
25#include <TProfile2D.h>
55 FairRootManager* rootMgr = FairRootManager::Instance();
56 if (NULL == rootMgr) {
58 cout <<
"-E- BmnStsKFTrackFitter::Init(): "
59 <<
"ROOT manager is not instantiated!" << endl;
62 fStsHitsArray =
reinterpret_cast<TClonesArray*
>(rootMgr->GetObject(
"StsHit"));
65 cout <<
"-W- BmnStsKFTrackFitter::Init: "
66 <<
"no STS hits array" << endl;
70 fMvdHitsArray =
nullptr;
91 Int_t NStsHits = (fStsHitsArray) ? track->
GetNStsHits() : 0;
92 Int_t NMvdHits = (fMvdHitsArray) ? track->
GetNMvdHits() : 0;
94 fHits.resize(NMvdHits + NStsHits);
96 for (Int_t
i = 0;
i < NMvdHits;
i++) {
98 fHits[
i].Create(
reinterpret_cast<CbmMvdHit*
>(fMvdHitsArray->At(j)));
99 T.
fHits.push_back(&(fHits[
i]));
102 if (NStsHits > 0 && fStsHitsArray) {
103 for (Int_t
i = 0;
i < NStsHits;
i++) {
105 fHits[NMvdHits +
i].Create(
reinterpret_cast<CbmStsHit*
>(fStsHitsArray->At(j)));
106 T.
fHits.push_back(&(fHits[NMvdHits +
i]));
121 for (Int_t
i = 0;
i < 6;
i++)
127 Int_t err = T.
Fit(1);
128 Bool_t ok = (!err) && CheckTrack(T);
132 ok = ok && (!err) && CheckTrack(T);
139 for (
int i = 0;
i < 6;
i++)
141 for (
int i = 0;
i < 15;
i++)
143 c[0] = c[2] = c[5] = c[9] = c[14] = 100.;
163 cout <<
"-Info- BmnStsKFTrackFitter::ReadMatBudget: "
164 <<
"reading mat. budget histograms from file " << fileName << endl;
167 delete fMatBudgetFile;
168 fMatBudgetFile = TFile::Open(fileName,
"read");
169 const TList* keys = fMatBudgetFile->GetListOfKeys();
173 while ((obj = next())) {
174 TKey* key = (TKey*)obj;
176 if (!(TString(key->GetName()).Contains(
"Station")))
178 TProfile2D* prof = (TProfile2D*)key->ReadObj();
180 TString title = prof->GetTitle();
181 int pos = title.Last(
'_');
182 TString zstr = title(pos + 1, title.Length() - pos);
183 Double_t zpos = zstr.Atof() / 10;
185 fMatHistos[zpos] = prof;
203 for (Int_t
i = 0;
i < 6;
i++)
213 Bool_t ok = (!err) && CheckTrack(T);
218 ok = ok && (!err) && CheckTrack(T);
227 for (
int i = 0;
i < 6;
i++)
229 for (
int i = 0;
i < 15;
i++)
231 c[0] = c[2] = c[5] = c[9] = c[14] = 100.;
265 const Double_t INF = 10000.;
296 err = h->
Filter(track, downstream, qp0);
298 for (Int_t
i = 1;
i < NHits;
i++) {
303 for (Int_t j = istold + 0; j < ist; j++) {
306 if (fMatHistos.size()) {
312 err = err || mat->
Pass(track, downstream, qp0);
316 err = err || h->
Filter(track, downstream, qp0);
321 err = h->
Filter(track, downstream, qp0);
323 for (Int_t
i = NHits - 2;
i >= 0;
i--) {
328 for (Int_t j = istold - 0; j > ist; j--) {
330 if (fMatHistos.size()) {
335 err = err || mat->
Pass(track, downstream, qp0);
337 err = err || h->
Filter(track, downstream, qp0);
363 T[0] = T[1] = T[2] = T[3] = T[4] = T[5] = 0;
384 T[0] = T[1] = T[2] = T[3] = T[4] = T[5] = 0;
395 if ((ihit == 0 && downstream) || (ihit == track.
GetNOfHits() - 1 && !downstream)) {
396 cout <<
"!!! BmnStsKFTrackFitter::EvalMaterial - this should not happen " << ihit <<
" " << downstream <<
" "
404 int iprev = (downstream) ? ihit - 1 : ihit + 1;
414 TProfile2D* histo = fMatHistos.lower_bound(h->
GetZ() - zOffset)->second;
415 TAxis* axis[2] = {histo->GetXaxis(), histo->GetYaxis()};
416 int ixy[2] = {axis[0]->FindBin(h->
GetX()), axis[1]->FindBin(h->
GetY())};
417 int ixyprev[2] = {axis[0]->FindBin(hprev->
GetX()), axis[1]->FindBin(hprev->
GetY())};
418 Double_t thick = histo->GetBinContent(ixyprev[0], ixyprev[1]);
420 if ((ixy[0] != ixyprev[0]) || (ixy[1] != ixyprev[1])) {
421 int idxy[2], ilong = 0, ishor = 1;
423 for (
int j = 0; j < 2; ++j)
424 idxy[j] = ixy[j] - ixyprev[j];
425 for (
int j = 0; j < 2; ++j)
426 dxy[j] = idxy[j] * axis[j]->GetBinWidth(1);
427 if (TMath::Abs(idxy[0]) < TMath::Abs(idxy[1])) {
431 Double_t slope = dxy[ishor] / dxy[ilong], xyshort = axis[ishor]->GetBinCenter(ixyprev[ishor]);
432 int istep = TMath::Sign(1, idxy[ilong]),
i = ixyprev[ilong];
437 int j = axis[ishor]->FindBin(xyshort);
439 thick += histo->GetBinContent(
i, j);
441 thick += histo->GetBinContent(j,
i);
448 thick /= (nbins * 100);
488 if (z <= fpar->GetZ()) {
491 }
else if (z < fpar->GetZ() + 0.1) {
494 }
else if (lpar->GetZ() <= z) {
497 }
else if (lpar->GetZ() - 0.1 < z) {
515 FairRootManager* fManger = FairRootManager::Instance();
516 vtx =
reinterpret_cast<CbmVertex*
>(fManger->GetObject(
"PrimaryVertex"));
518 cout <<
"-W- CbmStsKFTrackFitter::GetChiToVertex: No Primary Vertex found!" << endl;
528 Double_t Cv[3] = {tmp(0, 0), tmp(0, 1), tmp(1, 1)};
539 if (!track || !vtx || !v_track)
556Bool_t BmnStsKFTrackFitter::CheckTrack(
CbmKFTrack& T)
561 for (
int i = 0;
i < 6;
i++)
562 ok = ok && finite(t[
i]) && TMath::Abs(t[
i]) < 1.e5;
563 for (
int i = 0;
i < 15;
i++)
564 ok = ok && finite(c[
i]);
567 ok = ok && (c[0] > 0);
568 ok = ok && (c[2] > 0);
569 ok = ok && (c[5] > 0);
570 ok = ok && (c[9] > 0);
571 ok = ok && (c[14] > 0);
574 Double_t c00 = TMath::Sqrt(c[0]);
575 Double_t c11 = TMath::Sqrt(c[2]);
576 Double_t c22 = TMath::Sqrt(c[5]);
577 Double_t c33 = TMath::Sqrt(c[9]);
578 Double_t c44 = TMath::Sqrt(c[14]);
579 Double_t a = c11 * c00;
631 for (
int i = 0;
i < 6;
i++)
633 for (
int i = 0;
i < 15;
i++)
635 c[0] = c[2] = c[5] = c[9] = c[14] = 100.;
Bool_t fIsInitialised
kTRUE if Init() was called
friend F32vec4 sqrt(const F32vec4 &a)
CbmKFUMeasurement FitPoint[2]
void Extrapolate(CbmStsTrack *track, Double_t z, FairTrackParam *e_track)
Int_t FitWithMat(CbmKFTrack &track, Int_t downstream)
void EvalMaterial(CbmKFTrack &track, int ihit, Int_t downstream, CbmKFMaterial &mat)
void ReadMatBudget(TString &matBudgetFileName)
Double_t GetChiToVertex(CbmStsTrack *track, CbmVertex *vtx=0)
void SetKFHits(CbmKFTrack &T, CbmStsTrack *track)
Int_t DoFit(CbmStsTrack *track, Int_t pidHypo=211)
Int_t Fit(CbmStsTrack *track, Int_t pidHypo=211)
Double_t FitToVertex(CbmStsTrack *track, CbmVertex *vtx, FairTrackParam *v_track)
virtual Int_t Filter(CbmKFTrackInterface &track, Bool_t downstream, Double_t &QP0)=0
virtual Int_t Pass(Double_t ZCross, Double_t ZThick, CbmKFTrackInterface &track, Bool_t downstream, Double_t &QP0)
static Double_t getDeviation(Double_t x, Double_t y, Double_t C[], Double_t vx, Double_t vy, Double_t Cv[]=0)
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.
Int_t Fit(Bool_t downstream=1, Bool_t line=false)
void Fit2Vertex(CbmKFVertexInterface &vtx)
void GetStsTrack(CbmStsTrack &track, bool first=1)
std::vector< CbmKFHit * > fHits
void SetStsTrack(CbmStsTrack &track, bool first=1)
CbmKFHit * GetHit(Int_t i)
Number of hits.
void SetTrackParam(FairTrackParam &track)
void GetTrackParam(FairTrackParam &track)
Double_t * GetTrack()
Is it electron.
Double_t & GetRefChi2()
array[15] of covariance matrix
Int_t GetNOfHits()
Number of Degrees of Freedom after fit.
Int_t & GetRefNDF()
Chi^2 after fit.
Double_t * GetCovMatrix()
array[6] of track parameters(x,y,tx,ty,qp,z)
void SetPID(Int_t pidHypo)
std::vector< CbmKFMaterial * > vMaterial
static CbmKF * Instance()
FairTrackParam * GetParamLast()
Int_t GetNMvdHits() const
Int_t GetMvdHitIndex(Int_t iHit) const
Int_t GetNStsHits() const
Int_t GetStsHitIndex(Int_t iHit) const
FairTrackParam * GetParamFirst()
void SetPidHypo(Int_t pid)
void CovMatrix(TMatrixFSym &covMat) const