12#include "CbmKFTrack.h"
13#include "CbmKFVertex.h"
14#include "CbmStsTrack.h"
16#include "FairRootManager.h"
37 FairRootManager::Instance()->Register(
"MpdVertex.",
"Global",
fPrimVert,
kTRUE);
38 fHist[0] =
new TH1D(
"hX",
"Vertex X", 100, -5, 5);
39 fHist[1] =
new TH1D(
"hY",
"Vertex Y", 100, -5, 5);
40 fHistw[0] =
new TH1D(
"hXw",
"Vertex X", 100, -5, 5);
41 fHistw[1] =
new TH1D(
"hYw",
"Vertex Y", 100, -5, 5);
45 fHistR =
new TH1D(
"hRad",
"Radius", 50, 0, 10);
50 fHist3 =
new TH3D(
"h3",
"XYZ", 50, -10, 10, 50, -10, 10, nz, zmin, zmax);
51 fHistw3 =
new TH3D(
"hw3",
"XYZ", 50, -10, 10, 50, -10, 10, nz, zmin, zmax);
52 fHistZ =
new TH1D(
"hZ",
"Z-profile", nz, zmin, zmax);
54 fHZR =
new TH2D(
"hZR",
"Z-profile", nz, zmin, zmax, 50, 0.0, 10.0);
77 std::multimap<float, int> mQuInd;
78 for (
int i = 0;
i < nTracks; ++
i) {
84 mQuInd.insert(pair<float, int>(qual,
i));
90 for (
auto mit = mQuInd.begin(); mit != mQuInd.end(); ++mit) {
107 if (!finite(T.GetTrack()[0]) || !finite(T.GetCovMatrix()[0]))
125 int inVtx =
fTrkID.size();
127 for (
int j = 0; j < inVtx; ++j) {
141 for (
int j = 0; j < 2; ++j) {
179 Double_t ztarg = 0.0, sigmas[2] = {0};
185 for (
int i = 0;
i < 2; ++
i) {
186 fHist[
i]->SetAxisRange(10, 0);
187 fHistw[
i]->SetAxisRange(10, 0);
191 int nz =
fHist3->GetNbinsZ();
193 for (
int itr = 0; itr < nTracks; ++itr) {
198 for (
int iz = nz; iz >= 1; --iz) {
205 fHist3->Fill(xtr, ytr, z, 1);
206 fHistw3->Fill(xtr, ytr, z, www);
216 int ibmax =
fHistZ->GetMaximumBin(), nmax = 0;
220 if (
fHistZ->GetMaximum() > 0.5) {
222 auto fitRes =
fHistZ->Fit(
"gaus",
"sw0q",
"", zmin, zmax);
225 Double_t zpeak = fitRes->GetParams()[1];
233 zpeak =
fHistZ->GetBinCenter(ix);
244 if (
fHistZ->GetMaximum() > 2) {
246 int ib = 1, ie = ibmax, idi = 1, cmax = -1;
247 if (nz - ibmax > ie - 1) {
254 for (
int j = ib; j != ie; j += idi) {
255 int cont =
fHistZ->GetBinContent(j);
256 if (cont > cmax2 && cont > cmax)
258 else if (cont < cmax * 0.75) {
267 vector<Double_t> vecDist(nTracks, 999);
269 for (
int itr = 0; itr < nTracks; ++itr) {
298 int irmax =
fHistR->GetMaximumBin(), nbins = 0;
299 int i1 = irmax - 2, i2 = irmax + 2;
304 if (i2 >
fHistR->GetNbinsX()) {
310 Double_t wr = 0.0, wsum = 0.0, peakDist = 0.0;
312 for (
int iii = i1; iii <= i2; ++iii) {
315 wr += (w *
fHistR->GetBinCenter(iii));
320 peakDist = wr / wsum;
326 multimap<Double_t, int> mapDist;
328 for (
int itr = 0; itr < nTracks; ++itr)
329 mapDist.insert(pair<Double_t, int>(
TMath::Abs(vecDist[itr] - peakDist), itr));
331 vector<CbmKFTrackInterface*> vTracks;
333 for (
auto mit = mapDist.begin(); mit != mapDist.end(); ++mit) {
336 vTracks.push_back(
fTracks[mit->second]);
344 for (
int ipass = 0; ipass < 2; ++ipass) {
348 for (
int i = 0;
i < 2; ++
i) {
350 if (sigmas[
i] < 0.001) {
356 int sum =
fHist[
i]->GetEffectiveEntries();
358 if (sum >
fHist[
i]->GetMaximum()) {
368 for (
int i = 0;
i < 2; ++
i) {
369 if (sigmas[
i] < 0.001)
374 fHistw[
i]->SetAxisRange(xmin, xmax);
375 fHist[
i]->SetAxisRange(xmin, xmax);
381 for (
int j = 0; j < 6; ++j) {
403 if (getchar() ==
'e') {
408 for (
int i = 0;
i < 2; ++
i) {
425 const Int_t MaxIter = 3;
427 const Double_t chi2acc[3] = {10., 12.25, 12.25};
438 r[0] = r[1] = r[2] = 0.;
446 C[0] = C[2] = 2 * t.
RR / 3.5 / 3.5;
448 C[5] = (t.
dz / 3.5) * (t.
dz / 3.5);
465 if (
fMean[2] < 900) {
472 TMatrixD c(3, 3), cov(3, 3), xk0(3, 1), xk(3, 1), ck0(5, 1), a(5, 3), b(5, 3);
474 int ok = 1, nOK = 0, nTracks =
fTracks.size();
477 xk.SetMatrixArray(r);
480 for (
Int_t iteration = 0; iteration < MaxIter; ++iteration) {
507 if (iteration == 0) {
508 for (
int i = 0;
i < 3; ++
i) {
509 for (
int j =
i; j < 3; ++j) {
511 c(
i, j) = c(j,
i) = C0[indx];
518 Int_t ibeg = 0, iend = nTracks, istep = 1;
529 for (
int itr = ibeg; itr != iend; itr += istep) {
543 std::vector<Double_t> covMatr(V, V + 15);
544 if (iteration == 0) {
545 for (
unsigned int j = 0; j < covMatr.size(); ++j)
555 for (
unsigned int j = 0; j < covMatr.size(); ++j)
562 for (
int i = 0;
i < 5; ++
i) {
564 for (
int j =
i; j < 5; ++j) {
566 g(
i, j) = g(j,
i) = V[indx];
572 Bool_t err = T.Extrapolate(r0[2]);
611 m.SetMatrixArray(
fTracks[itr]->GetTrack());
650 if (chi21(0, 0) < 0 || chi22(0, 0) < 0) {
651 cout <<
" FindVertex: chi2 < 0 " << chi21(0, 0) <<
" " << chi22(0, 0) <<
" " << iteration <<
" "
660 if (chi21(0, 0) > cutChi2) {
667 if (iteration == MaxIter - 1)
680 if (iteration < MaxIter - 1) {
797 for (
int i = 0;
i < 3; ++
i) {
798 for (
int j =
i; j < 3; ++j) {
863 vert0[
i - 1] -= shift;
875 for (
Int_t j = 0; j < 5; ++j) {
901 for (
Int_t k = 0; k < 5; ++k) {
913 for (
int i = 0;
i < 5; ++
i)
935 for (
int i = -1;
i < 2; ++
i) {
938 Double_t dx = pars[0] - vert[0], dy = pars[1] - vert[1], dz = pars[5] - vert[2];
vector< Double_t > dist(vector< Double_t > qp, Double_t mu)
TMatrixT< Double_t > TMatrixD
R__EXTERN TRandom * gRandom
std::vector< int > fTrkID
TClonesArray * fInputTracks
void AddTrack(CbmKFTrackInterface *Track)
std::vector< CbmKFTrackInterface * > fTracks
void SetTracks(std::vector< CbmKFTrackInterface * > &vTracks)
Bool_t ComputeAandB(TMatrixD &xk0, CbmKFTrackInterface &track, Double_t zhit, TMatrixD &a, TMatrixD &b, TMatrixD &ck0)
void Exec(Option_t *option)
void FindPca(CbmKFTrackInterface &track, Double_t *vert)
void Fit(CbmKFVertexInterface &vtx)
static Int_t indexS(Int_t i, Int_t j)
virtual Double_t * GetTrack()
Is it electron.
Int_t Extrapolate(Double_t z, Double_t *QP0=0, Bool_t line=false)
Access to i-th hit.
virtual Double_t * GetCovMatrix()
array[6] of track parameters(x,y,tx,ty,qp,z)
void SetStsTrack(CbmStsTrack &track, bool first=1)
Double_t * GetTrack()
Is it electron.
Double_t * GetCovMatrix()
array[6] of track parameters(x,y,tx,ty,qp,z)
virtual Double_t & GetRefY()
virtual Double_t & GetRefX()
I/O parameters for vertex fit routines.
virtual Int_t & GetRefNTracks()
Number of Degrees of Freedom after fit.
virtual Double_t & GetRefZ()
virtual Double_t & GetRefChi2()
Array[6] of covariance matrix.
virtual Int_t & GetRefNDF()
Chi^2 after fit.
virtual Double_t * GetCovMatrix()
static CbmKF * Instance()
std::vector< CbmKFTube > vTargets
Int_t GetNStsHits() const
Accessors.
FairTrackParam * GetParamFirst()
virtual Int_t FindBin(const char *label)
virtual void SetRange(Int_t first=0, Int_t last=0)
virtual Double_t GetMinimumX(Double_t xmin=0, Double_t xmax=0, Double_t epsilon=1.E-10, Int_t maxiter=100, Bool_t logx=false) const
virtual Double_t GetMaximum(Double_t maxval=FLT_MAX) const
void Draw(Option_t *option="") override
virtual Int_t GetMaximumBin() const
const Element * GetMatrixArray() const override
TMatrixT< Element > & Invert(Double_t *det=nullptr)
void Modified(Bool_t flag=true) override
Double_t Min(Double_t a, Double_t b)
Double_t Sign(Double_t a, Double_t b)
Double_t Sqrt(Double_t x)
Double_t Max(Double_t a, Double_t b)