40 listStsTracksMatch(0),
50 outfileName(
"outCbmTrackError.root"),
96 TDirectory *currentDir = gDirectory;
97 gDirectory->cd(outfileName.Data());
99 ggg =
new TH1F(
"ggg",
"ggg", 6, -0.5, 5.5);
100 q_QA =
new TProfile(
"q_QA",
"q quality", 100, 0.0, 1.0, 0.0, 100.0);
101 q_QA -> GetXaxis() -> SetTitle (
"p, GeV/c");
102 q_QA -> GetYaxis() -> SetTitle (
"Q determenition efficiency, %");
104 dp_p =
new TProfile(
"dp_p",
"dp_p", 100, 0.0, 1.0, 0.0, 5.0);
105 dp_p -> GetXaxis() -> SetTitle (
"p, GeV/c");
106 dp_p -> GetYaxis() -> SetTitle (
"#Deltap/p, %");
108 res_STShit_x =
new TH1F(
"residual_STShit_x",
"residual_STShit_x", 200, -10., 10.);
109 res_STShit_x -> GetXaxis() -> SetTitle (
"dX, um");
110 res_STShit_y =
new TH1F(
"residual_STShit_y",
"residual_STShit_y", 200, -10., 10.);
111 res_STShit_y -> GetXaxis() -> SetTitle (
"dY, um");
112 pull_STShit_x =
new TH1F(
"pull_STShit_x",
"pull_STShit_x", 100, -15., 15.);
113 pull_STShit_y =
new TH1F(
"pull_STShit_y",
"pull_STShit_y", 100, -15., 15.);
115 res_MVDhit_x =
new TH1F(
"residual_MVDhit_x",
"residual_MVDhit_x", 200, -30., 30.);
116 res_MVDhit_x -> GetXaxis() -> SetTitle (
"dX, um");
117 res_MVDhit_y =
new TH1F(
"residual_MVDhit_y",
"residual_MVDhit_y", 200, -30., 30.);
118 res_MVDhit_y -> GetXaxis() -> SetTitle (
"dY, um");
119 pull_MVDhit_x =
new TH1F(
"pull_MVDhit_x",
"pull_MVDhit_x", 100, -5., 5.);
120 pull_MVDhit_y =
new TH1F(
"pull_MVDhit_y",
"pull_MVDhit_y", 100, -5., 5.);
123 res_AtPV_x =
new TH1F(
"residual_AtPV_x",
"residual_AtPV_x", 2000, -1., 1.);
124 res_AtPV_x -> GetXaxis() -> SetTitle (
"dX, cm");
125 res_AtPV_y =
new TH1F(
"residual_AtPV_y",
"residual_AtPV_y", 2000, -1., 1.);
126 res_AtPV_y -> GetXaxis() -> SetTitle (
"dY, cm");
127 res_AtPV_tx =
new TH1F(
"residual_AtPV_tx",
"residual_AtPV_tx", 200, -0.004, 0.004);
128 res_AtPV_tx -> GetXaxis() -> SetTitle (
"dtx");
129 res_AtPV_ty =
new TH1F(
"residual_AtPV_ty",
"residual_AtPV_ty", 200, -0.004, 0.004);
130 res_AtPV_ty -> GetXaxis() -> SetTitle (
"dty");
131 res_AtPV_qp =
new TH1F(
"residual_AtPV_qp",
"residual_AtPV_qp", 200, -0.05, 0.05);
132 res_AtPV_qp -> GetXaxis() -> SetTitle (
"d(Q/P), c/GeV");
134 pull_AtPV_x =
new TH1F(
"pull_AtPV_x",
"pull_AtPV_x", 100, -5., 5.);
135 pull_AtPV_y =
new TH1F(
"pull_AtPV_y",
"pull_AtPV_y", 100, -5., 5.);
136 pull_AtPV_tx =
new TH1F(
"pull_AtPV_tx",
"pull_AtPV_tx", 100, -5., 5.);
137 pull_AtPV_ty =
new TH1F(
"pull_AtPV_ty",
"pull_AtPV_ty", 100, -5., 5.);
138 pull_AtPV_qp =
new TH1F(
"pull_AtPV_qp",
"pull_AtPV_qp", 100, -5., 5.);
140 res_AtFP_x =
new TH1F(
"residual_AtFP_x",
"residual_AtFP_x", 200, -50., 50.);
141 res_AtFP_x -> GetXaxis() -> SetTitle (
"dX, cm");
142 res_AtFP_y =
new TH1F(
"residual_AtFP_y",
"residual_AtFP_y", 200, -400., 400.);
143 res_AtFP_y -> GetXaxis() -> SetTitle (
"dY, cm");
144 res_AtFP_tx =
new TH1F(
"residual_AtFP_tx",
"residual_AtFP_tx", 200, -0.004, 0.004);
145 res_AtFP_tx -> GetXaxis() -> SetTitle (
"dtx, GeV/c");
146 res_AtFP_ty =
new TH1F(
"residual_AtFP_ty",
"residual_AtFP_ty", 200, -0.004, 0.004);
147 res_AtFP_ty -> GetXaxis() -> SetTitle (
"dty, GeV/c");
148 res_AtFP_qp =
new TH1F(
"residual_AtFP_qp",
"residual_AtFP_qp", 200, -0.05, 0.05);
149 res_AtFP_qp -> GetXaxis() -> SetTitle (
"d(Q/P), c/GeV");
151 pull_AtFP_x =
new TH1F(
"pull_AtFP_x",
"pull_AtFP_x", 100, -5., 5.);
152 pull_AtFP_y =
new TH1F(
"pull_AtFP_y",
"pull_AtFP_y", 100, -5., 5.);
153 pull_AtFP_tx =
new TH1F(
"pull_AtFP_tx",
"pull_AtFP_tx", 100, -5., 5.);
154 pull_AtFP_ty =
new TH1F(
"pull_AtFP_ty",
"pull_AtFP_ty", 100, -5., 5.);
155 pull_AtFP_qp =
new TH1F(
"pull_AtFP_qp",
"pull_AtFP_qp", 100, -5., 5.);
157 gDirectory = currentDir;
236 for (Int_t iMvd=0; iMvd<listMvdPts->GetEntriesFast(); iMvd++)
240 MCTrackSortedArray[MvdPoint->GetTrackID()].
MvdArray.push_back(MvdPoint);
242 for (Int_t iSts=0; iSts<listStsPts->GetEntriesFast(); iSts++)
246 MCTrackSortedArray[StsPoint->GetTrackID()].
StsArray.push_back(StsPoint);
248 for (Int_t itrack=0; itrack<listStsTracks->GetEntriesFast(); itrack++)
252 if(StsTrackMatch -> GetNofMCTracks() == 0)
continue;
261 delete[] MCTrackSortedArray;
274 tr_help -> Extrapolate(track_mc->
GetStartZ());
276 Double_t *fT = tr_help -> GetTrack();
277 Double_t *fC = tr_help -> GetCovMatrix();
283 qtrack = TDatabasePDG::Instance()->GetParticle(track_mc->
GetPdgCode())->Charge()/3.0;
286 Double_t PointPx = track_mc->
GetPx();
287 Double_t PointPy = track_mc->
GetPy();
288 Double_t PointPz = track_mc->
GetPz();
289 Double_t P_mc =
sqrt(PointPx*PointPx+PointPy*PointPy+PointPz*PointPz);
292 Double_t ddx = fT[0] - track_mc->
GetStartX();
293 Double_t ddy = fT[1] - track_mc->
GetStartY();
294 Double_t ddtx = fT[2] - PointPx/PointPz;
295 Double_t ddty = fT[3] - PointPy/PointPz;
296 Double_t ddqp = (
fabs(1./fT[4]) - P_mc)/P_mc;
297 Double_t ddqp_p = fT[4] - (qtrack/
sqrt(PointPx*PointPx+PointPy*PointPy+PointPz*PointPz));
300 res_AtPV_x -> Fill(ddx);
301 res_AtPV_y -> Fill(ddy);
302 res_AtPV_tx -> Fill(ddtx);
303 res_AtPV_ty -> Fill(ddty);
304 if(finite(fT[4]) && (
fabs(fT[4]) > 1.e-20)) res_AtPV_qp -> Fill(ddqp);
306 if( finite(fC[0]) && fC[0]>0 ) pull_AtPV_x -> Fill(ddx/
sqrt(fC[0]));
307 if( finite(fC[2]) && fC[2]>0 ) pull_AtPV_y -> Fill(ddy/
sqrt(fC[2]));
308 if( finite(fC[5]) && fC[5]>0 ) pull_AtPV_tx -> Fill(ddtx/
sqrt(fC[5]));
309 if( finite(fC[9]) && fC[9]>0 ) pull_AtPV_ty -> Fill(ddty/
sqrt(fC[9]));
310 if( finite(fC[14]) && fC[14]>0 ) pull_AtPV_qp -> Fill(ddqp_p/
sqrt(fC[14]));
312 if(finite(fT[4]) && (
fabs(fT[4]) > 1.e-20))
314 if(qtrack == (
fabs(fT[4])/fT[4]))
315 q_QA->Fill(P_mc, 100.0);
317 q_QA->Fill(P_mc, 0.0);
319 if( finite(fC[14]) && fC[14]>0 ) dp_p-> Fill(P_mc,
fabs(1./fT[4])*
sqrt(fC[14])*100,1);
325 Double_t *fT = track_kf -> GetTrack();
326 Double_t *fC = track_kf -> GetCovMatrix();
329 Bool_t nomvdpoint = 1;
330 Bool_t nostspoint = 1;
332 FairMCPoint *MCFirstPoint;
338 if(!mc_points)
return;
339 if( (mc_points->
MvdArray.size()==0) && (mc_points->
StsArray.size()==0) )
return;
342 MCFirstPoint = *mc_points->
MvdArray.begin();
344 MCFirstPoint = *mc_points->
StsArray.begin();
346 for( vector<CbmMvdPoint*>::iterator imvd = mc_points->
MvdArray.begin(); imvd != mc_points->
MvdArray.end(); ++imvd)
348 MCFirstPoint = *imvd;
351 if (
fabs(MCFirstPoint->GetZ() - fT[5]) < 1.)
359 for( vector<CbmStsPoint*>::iterator ists = mc_points->
StsArray.begin(); ists != mc_points->
StsArray.end(); ++ists)
361 MCFirstPoint = *ists;
364 if (
fabs(MCFirstPoint->GetZ() - fT[5]) < 1.)
371 track_kf -> Extrapolate(MCFirstPoint->GetZ());
378 qtrack = TDatabasePDG::Instance()->GetParticle(track_mc->
GetPdgCode())->Charge()/3.0;
381 Double_t PointPx = MCFirstPoint->GetPx();
382 Double_t PointPy = MCFirstPoint->GetPy();
383 Double_t PointPz = MCFirstPoint->GetPz();
384 Double_t P_mc =
sqrt(PointPx*PointPx+PointPy*PointPy+PointPz*PointPz);
387 Double_t ddx = fT[0] - MCFirstPoint->GetX();
388 Double_t ddy = fT[1] - MCFirstPoint->GetY();
389 Double_t ddtx = fT[2] - PointPx/PointPz;
390 Double_t ddty = fT[3] - PointPy/PointPz;
391 Double_t ddqp = (
fabs(1./fT[4]) - P_mc)/P_mc;
392 Double_t ddqp_p = fT[4] - (qtrack/
sqrt(PointPx*PointPx+PointPy*PointPy+PointPz*PointPz));
395 res_AtFP_x -> Fill(ddx*10000.);
396 res_AtFP_y -> Fill(ddy*10000.);
397 res_AtFP_tx -> Fill(ddtx);
398 res_AtFP_ty -> Fill(ddty);
399 if(finite(fT[4]) && (
fabs(fT[4]) > 1.e-20)) res_AtFP_qp -> Fill(ddqp);
401 if( finite(fC[0]) && fC[0]>0 ) pull_AtFP_x -> Fill(ddx/
sqrt(fC[0]));
402 if( finite(fC[2]) && fC[2]>0 ) pull_AtFP_y -> Fill(ddy/
sqrt(fC[2]));
403 if( finite(fC[5]) && fC[5]>0 ) pull_AtFP_tx -> Fill(ddtx/
sqrt(fC[5]));
404 if( finite(fC[9]) && fC[9]>0 ) pull_AtFP_ty -> Fill(ddty/
sqrt(fC[9]));
405 if( finite(fC[14]) && fC[14]>0 ) pull_AtFP_qp -> Fill(ddqp_p/
sqrt(fC[14]));
407 if(finite(fT[4]) && (
fabs(fT[4]) > 1.e-20))
409 if(qtrack == (
fabs(fT[4])/fT[4]))
410 q_QA->Fill(P_mc, 100.0);
412 q_QA->Fill(P_mc, 0.0);
414 if( finite(fC[14]) && fC[14]>0 ) dp_p-> Fill(P_mc,
fabs(1./fT[4])*
sqrt(fC[14])*100,1);
478 res_AtPV_x -> GetXaxis() -> SetTitle (
"dX, cm");
479 res_AtPV_x -> SaveAs(
"res_AtPV_x.eps");
480 res_AtPV_y -> GetXaxis() -> SetTitle (
"dY, cm");
481 res_AtPV_y -> SaveAs(
"res_AtPV_y.gif");
482 res_AtPV_tx -> GetXaxis() -> SetTitle (
"dtx");
483 res_AtPV_tx -> SaveAs(
"res_AtPV_tx.gif");
484 res_AtPV_ty -> GetXaxis() -> SetTitle (
"dty");
485 res_AtPV_ty -> SaveAs(
"res_AtPV_ty.gif");
486 res_AtPV_qp -> GetXaxis() -> SetTitle (
"d(Q/P), c/GeV");
487 res_AtPV_qp -> SaveAs(
"res_AtPV_qp.gif");
490 pull_AtPV_x -> SaveAs(
"pull_AtPV_x.gif");
491 pull_AtPV_y -> SaveAs(
"pull_AtPV_y.gif");
492 pull_AtPV_tx -> SaveAs(
"pull_AtPV_tx.gif");
493 pull_AtPV_ty -> SaveAs(
"pull_AtPV_ty.gif");
494 pull_AtPV_qp -> SaveAs(
"pull_AtPV_qp.gif");
497 res_AtFP_x -> GetXaxis() -> SetTitle (
"dX, cm");
498 res_AtFP_x -> SaveAs(
"res_AtFP_x.gif");
499 res_AtFP_y -> GetXaxis() -> SetTitle (
"dY, cm");
500 res_AtFP_y -> SaveAs(
"res_AtFP_y.gif");
501 res_AtFP_tx -> GetXaxis() -> SetTitle (
"dtx, GeV/c");
502 res_AtFP_tx -> SaveAs(
"res_AtFP_tx.gif");
503 res_AtFP_ty -> GetXaxis() -> SetTitle (
"dty, GeV/c");
504 res_AtFP_ty -> SaveAs(
"res_AtFP_ty.gif");
505 res_AtFP_qp -> GetXaxis() -> SetTitle (
"d(Q/P), c/GeV");
506 res_AtFP_qp -> SaveAs(
"res_AtFP_qp.gif");
509 pull_AtFP_x -> SaveAs(
"pull_AtFP_x.gif");
510 pull_AtFP_y -> SaveAs(
"pull_AtFP_y.gif");
511 pull_AtFP_tx -> SaveAs(
"pull_AtFP_tx.gif");
512 pull_AtFP_ty -> SaveAs(
"pull_AtFP_ty.gif");
513 pull_AtFP_qp -> SaveAs(
"pull_AtFP_qp.gif");
518 vStsHitMatch.resize(listStsHits->GetEntriesFast());
520 for (Int_t iSts=0; iSts<listStsHits->GetEntriesFast(); iSts++)
523 if(vStsHitMatch[iSts] > -1)
526 Double_t dx = (StsHit->GetX() - 0.5*(StsP->
GetXIn() + StsP->
GetXOut()));
527 Double_t dy = (StsHit->GetY() - 0.5*(StsP->
GetYIn() + StsP->
GetYOut()));
528 res_STShit_x -> Fill( dx );
529 res_STShit_y -> Fill( dy );
530 pull_STShit_x -> Fill( dx/(StsHit->GetDx()) );
531 pull_STShit_y -> Fill( dy/(StsHit->GetDy()) );
536 for (Int_t iMvd=0; iMvd<listMvdHits->GetEntriesFast(); iMvd++)
545 Double_t dx = (MvdHit->GetX() - 0.5*(MvdP->GetX() + MvdP->
GetXOut()));
546 Double_t dy = (MvdHit->GetY() - 0.5*(MvdP->GetY() + MvdP->
GetYOut()));
547 res_MVDhit_x -> Fill( dx*10000. );
548 res_MVDhit_y -> Fill( dy*10000. );
549 pull_MVDhit_x -> Fill( dx/(MvdHit->GetDx()) );
550 pull_MVDhit_y -> Fill( dy/(MvdHit->GetDy()) );
558 const bool useLinks = 1;
561 for (
int iH = 0; iH < listStsHits->GetEntriesFast(); iH++){
563 vStsHitMatch[iH] = -1;
566 if (listStsClusters){
569 vector<int> stsPointIds;
570 vector<int> stsPointIds_hit;
572 FairLink link = stsHit->GetLink(iL);
574 int NLinks2 = stsCluster->GetNLinks();
575 for (
int iL2 = 0; iL2 < NLinks2; iL2++){
576 FairLink link2 = stsCluster->GetLink(iL2);
578 const int NLinks3 = stsDigi->GetNLinks();
579 for (
int iL3 = 0; iL3 < NLinks3; iL3++){
580 FairLink link3 = stsDigi->GetLink(iL3);
581 int stsPointId = link3.GetIndex();
582 stsPointIds.push_back( stsPointId );
587 link = stsHit->GetLink(iL);
588 stsCluster =
dynamic_cast<CbmStsCluster*
>( listStsClusters->At( link.GetIndex() ) );
589 NLinks2 = stsCluster->GetNLinks();
590 for (
int iL2 = 0; iL2 < NLinks2; iL2++){
591 FairLink link2 = stsCluster->GetLink(iL2);
593 const int NLinks3 = stsDigi->GetNLinks();
594 for (
int iL3 = 0; iL3 < NLinks3; iL3++){
595 FairLink link3 = stsDigi->GetLink(iL3);
596 int stsPointId = link3.GetIndex();
598 if ( !find(&(stsPointIds[0]), &(stsPointIds[stsPointIds.size()]), stsPointId) )
continue;
605 for(
unsigned int iP=0; iP < stsPointIds_hit.size(); iP ++)
if(vStsHitMatch[iH] == stsPointIds_hit[iP]) save=0;
606 stsPointIds_hit.push_back(stsPointId);
607 vStsHitMatch[iH] = stsPointId;