31 fInputTracks = (TClonesArray*)FairRootManager::Instance()->GetObject(
"StsVector");
32 if (fInputTracks == 0x0)
33 fInputTracks = (TClonesArray*)FairRootManager::Instance()->GetObject(
"StsTrack");
36 fPrimVert =
new CbmVertex(
"PrimaryVertex",
"Global");
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);
42 fHistPca =
new TH1D(
"hPca",
"PCA", 200, -10, 10);
43 fHistErr[0] =
new TH1D(
"hErrX",
"X-error", 100, 0, 1.0);
44 fHistErr[1] =
new TH1D(
"hErrY",
"Y-error", 100, 0, 1.0);
45 fHistR =
new TH1D(
"hRad",
"Radius", 50, 0, 10);
48 Double_t zmin = -141, zmax = 39;
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);
53 fHistZ->SetStats(kFALSE);
54 fHZR =
new TH2D(
"hZR",
"Z-profile", nz, zmin, zmax, 50, 0.0, 10.0);
176 int nTracks = fTracks.size();
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) {
199 Double_t z = fHist3->GetZaxis()->GetBinCenter(iz);
205 fHist3->Fill(xtr, ytr, z, 1);
206 fHistw3->Fill(xtr, ytr, z, www);
207 if (TMath::Abs(xtr) < 2.5 && TMath::Abs(ytr) < 2.5)
209 fHZR->Fill(z, TMath::Sqrt(xtr * xtr + ytr * ytr), 1);
212 TH2D* hxy = (TH2D*)fHist3->Project3D(
"yx");
213 TH2D* hzx = (TH2D*)fHist3->Project3D(
"xz");
214 TH2D* hzy = (TH2D*)fHist3->Project3D(
"yz");
216 int ibmax = fHistZ->GetMaximumBin(), nmax = 0;
217 Double_t wind = fHistZ->GetBinWidth(1) * 5;
218 Double_t zmin = fHistZ->GetBinCenter(ibmax) - wind;
219 Double_t zmax = fHistZ->GetBinCenter(ibmax) + wind;
220 if (fHistZ->GetMaximum() > 0.5) {
222 auto fitRes = fHistZ->Fit(
"gaus",
"sw0q",
"", zmin, zmax);
223 Double_t peakint = fHistZ->Integral(TMath::Max(1, ibmax - 5), TMath::Min(nz, ibmax + 5));
224 Double_t zerr = fitRes->GetParams()[2] / TMath::Sqrt(peakint);
225 Double_t zpeak = fitRes->GetParams()[1];
227 if (TMath::Abs(zpeak - ztarg) > 3 * zerr) {
229 hzy->GetXaxis()->SetRange(ibmax - 5, ibmax + 5);
230 if (hzy->GetMaximum() > 2) {
232 hzy->GetMaximumBin(ix, iy, iz);
233 zpeak = fHistZ->GetBinCenter(ix);
234 if (TMath::Abs(zpeak - ztarg) > 3 * zerr) {
239 hzy->GetXaxis()->SetRange(2, 1);
244 if (fHistZ->GetMaximum() > 2) {
246 int ib = 1, ie = ibmax, idi = 1, cmax = -1;
247 if (nz - ibmax > ie - 1) {
251 Double_t cmax2 = 0.25 * fHistZ->GetMaximum();
252 cmax2 = TMath::Max(cmax2, 2.0);
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) {
266 fPrimVert->SetUniqueID(nmax);
267 vector<Double_t> vecDist(nTracks, 999);
269 for (
int itr = 0; itr < nTracks; ++itr) {
278 fTracks[itr]->GetTrkID());
281 Double_t wx = 1 / ststr->
GetParamFirst()->GetCovariance(0, 0);
282 Double_t wy = 1 / ststr->
GetParamFirst()->GetCovariance(1, 1);
288 fHistw[0]->Fill(xtr, wx);
289 fHistw[1]->Fill(ytr, wy);
292 Double_t
dist = TMath::Sqrt(xtr * xtr + ytr * ytr);
298 int irmax = fHistR->GetMaximumBin(), nbins = 0;
299 int i1 = irmax - 2, i2 = irmax + 2;
304 if (i2 > fHistR->GetNbinsX()) {
305 i2 = fHistR->GetNbinsX();
310 Double_t wr = 0.0, wsum = 0.0, peakDist = 0.0;
312 for (
int iii = i1; iii <= i2; ++iii) {
313 Double_t w = fHistR->GetBinContent(iii);
315 wr += (w * fHistR->GetBinCenter(iii));
320 peakDist = wr / wsum;
322 peakDist = fHistR->GetBinLowEdge(irmax) + gRandom->Rndm() * fHistR->GetBinWidth(irmax);
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]);
342 fSigma[0] = fSigma[1] = -1;
344 for (
int ipass = 0; ipass < 2; ++ipass) {
348 for (
int i = 0;
i < 2; ++
i) {
349 sigmas[
i] = fHistw[
i]->GetRMS();
350 if (sigmas[
i] < 0.001) {
352 fMean[
i] = fHistw[
i]->GetBinCenter(fHistw[
i]->GetMaximumBin());
356 int sum = fHist[
i]->GetEffectiveEntries();
358 if (sum > fHist[
i]->GetMaximum()) {
360 fSigma[
i] = sigmas[
i];
363 fMean[
i] = fHistw[
i]->GetBinCenter(fHistw[
i]->GetMaximumBin());
368 for (
int i = 0;
i < 2; ++
i) {
369 if (sigmas[
i] < 0.001)
371 Double_t xpeak = fHistw[
i]->GetBinCenter(fHistw[
i]->GetMaximumBin());
372 Double_t xmin = xpeak - sigmas[
i];
373 Double_t xmax = xpeak + sigmas[
i];
374 fHistw[
i]->SetAxisRange(xmin, xmax);
375 fHist[
i]->SetAxisRange(xmin, xmax);
379 TCanvas* c1 = (TCanvas*)gROOT->FindObject(
"cv1");
381 for (
int j = 0; j < 6; ++j) {
393 TAxis* zax = fHist3->GetZaxis();
394 int nbz = zax->GetNbins();
395 int iz0 = zax->FindBin(0.0);
396 zax->SetRange(iz0, iz0);
397 TH2D* hhh = (TH2D*)fHist3->Project3D(
"yx");
399 zax->SetRange(1, nbz);
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};
435 for (Int_t
i = 0;
i < 6;
i++)
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);
457 C[0] = fSigma[0] * fSigma[0];
461 C[2] = fSigma[1] * fSigma[1];
465 if (fMean[2] < 900) {
467 C[5] = TMath::Max(fSigma[2] * fSigma[2], C[5]);
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) {
484 Double_t r0[3], C0[6];
486 for (Int_t
i = 0;
i < 3;
i++)
488 for (Int_t
i = 0;
i < 6;
i++)
504 Double_t cutChi2 = chi2acc[TMath::Min(iteration, 2)];
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];
514 cov = TMatrixD(TMatrixD::kInverted, c);
518 Int_t ibeg = 0, iend = nTracks, istep = 1;
529 for (
int itr = ibeg; itr != iend; itr += istep) {
533 cov = TMatrixD(TMatrixD::kInverted, c);
543 std::vector<Double_t> covMatr(V, V + 15);
544 if (iteration == 0) {
545 for (
unsigned int j = 0; j < covMatr.size(); ++j)
551 Double_t errx = TMath::Sqrt(covMatr[0]);
553 Double_t scale = 0.01 / errx;
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];
579 err =
ComputeAandB(xk, T, fTracks[itr]->GetTrack()[5], a, b, ck0);
584 TMatrixD tmp(g, TMatrixD::kMult, b);
585 TMatrixD w(b, TMatrixD::kTransposeMult, tmp);
590 TMatrixD tmp1(b, TMatrixD::kTransposeMult, g);
591 TMatrixD tmp2(w, TMatrixD::kMult, tmp1);
592 TMatrixD tmp3(b, TMatrixD::kMult, tmp2);
593 TMatrixD tmp4(g, TMatrixD::kMult, tmp3);
598 TMatrixD tmp5(gb, TMatrixD::kMult, a);
599 c = TMatrixD(a, TMatrixD::kTransposeMult, tmp5);
611 m.SetMatrixArray(fTracks[itr]->GetTrack());
616 TMatrixD tmp11(gb, TMatrixD::kMult,
m);
617 TMatrixD tmp12(a, TMatrixD::kTransposeMult, tmp11);
618 TMatrixD tmp13(cov, TMatrixD::kMult, xk0);
620 xk = TMatrixD(c, TMatrixD::kMult, tmp13);
625 TMatrixD tmp21(a, TMatrixD::kMult, xk);
628 TMatrixD tmp22(g, TMatrixD::kMult, tmp21);
629 TMatrixD tmp23(b, TMatrixD::kTransposeMult, tmp22);
630 TMatrixD qk(w, TMatrixD::kMult, tmp23);
633 TMatrixD res = tmp21;
634 TMatrixD tmp31(b, TMatrixD::kMult, qk);
641 TMatrixD tmp41(g, TMatrixD::kMult, res);
642 TMatrixD chi21(res, TMatrixD::kTransposeMult, tmp41);
647 TMatrixD tmp42(cov, TMatrixD::kMult, dx);
648 TMatrixD chi22(dx, TMatrixD::kTransposeMult, tmp42);
650 if (chi21(0, 0) < 0 || chi22(0, 0) < 0) {
651 cout <<
" FindVertex: chi2 < 0 " << chi21(0, 0) <<
" " << chi22(0, 0) <<
" " << iteration <<
" "
656 chi21(0, 0) = TMath::Max(chi21(0, 0), 0.);
657 chi22(0, 0) = TMath::Max(chi22(0, 0), 0.);
660 if (chi21(0, 0) > cutChi2) {
667 if (iteration == MaxIter - 1)
668 fTrkID.push_back(fTracks[itr]->GetTrkID());
680 if (iteration < MaxIter - 1) {
691 c = TMatrixD(TMatrixD::kInverted, cov);
797 for (
int i = 0;
i < 3; ++
i) {
798 for (
int j =
i; j < 3; ++j) {