19 #include "FairRootManager.h"
20 #include "TClonesArray.h"
30 #include "TLorentzVector.h"
31 #include "FairTrackParH.h"
38 #include <TPolyLine3D.h>
39 #include <Math/Vector3D.h>
49 : FairTask(
"Histogram creator")
127 cout<<
"PndLmdQATask::~PndLmdQATask().. finished"<<endl;
133 TFile *
f =
new TFile(
foutFile,
"RECREATE");
217 TCanvas *
c1 =
new TCanvas(
"pulls_before_bp");
234 TCanvas *
c2 =
new TCanvas(
"pulls_after_bp");
528 std::cout<<
"PndLmdQATask::WriteHists() Finished successfull"<<std::endl;
535 cout<<
"Number of missed tracks is "<<
mistrk<<
" and number of ghost tracks is "<<
ghosttrk<<endl;
552 FairRootManager* ioman= FairRootManager::Instance();
556 Error(
"PndLmdQATask::Init",
"RootManager not instantiated!");
564 Error(
"PndLmdQATask::Init",
"mcHit-array not found!");
571 Error(
"PndLmdQATask::Init",
"hit-array not found!");
578 Error(
"PndLmdQATask::Init",
"track-array not found!");
585 Error(
"PndLmdQATask::Init",
"mcTrk-array not found!");
592 Error(
"PndLmdQATask::Init",
"geane-array not found!");
598 Error(
"PndLmdQATask::Init",
"trk-cand--array not found!");
604 Error(
"PndLmdQATask::Init",
"cluster-array not found!");
610 Error(
"PndLmdQATask::Init",
"digi-array not found!");
619 hResMom =
new TH1F(
"hResMom",
"P_{MC}-P_{REC};#deltaP,GeV/c",1e3,-1e-1,1e-1);
622 hResTheta =
new TH1F(
"hResTheta",
"#theta_{MC}-#theta_{REC};#delta#theta,mrad",1e2,-thetam,thetam);
623 hResTheta_th =
new TH2F(
"hResTheta_th",
"#theta_{MC}-#theta_{REC};#theta_{MC}, mrad; #delta#theta,mrad",2e2,0,10,6e2,-thetam,thetam);
624 hResTheta_ph =
new TH2F(
"hResTheta_ph",
"#theta_{MC}-#theta_{REC};#phi_{MC}, rad; #delta#theta,mrad",2e2,-
TMath::Pi(),
TMath::Pi(),2e2,-thetam,thetam);
625 hErrTheta =
new TH1F(
"hErrTheta",
"#sigma(#theta_{REC});#sigma,rad",1e3,0,10*thetam);
626 hPullTheta =
new TH1F(
"hPullTheta",
"(#theta_{MC}-#theta_{REC})/#sigma_{#theta};",1e2,-10,10);
627 hResPhi =
new TH1F(
"hResPhi",
"#phi_{MC}-#phi_{REC};#delta#phi,rad",2e3,-1.,1.);
628 hErrPhi =
new TH1F(
"hErrPhi",
"#sigma(#phi_{REC});#sigma,rad",1e3,0,0.1);
629 hPullPhi =
new TH1F(
"hPullPhi",
"(#phi_{MC}-#phi_{REC})/#sigma_{#phi};",1e2,-10,10);
631 hResPointPx =
new TH1F(
"hResPointPx",
"Px_{MC}-Px_{REC};#deltaPx, GeV/c",1e2,-0.01,0.01);
632 hErrPointPx =
new TH1F(
"hErrPointPx",
"#sigma_{Px};#sigmaPx, GeV/c",1e3,0,0.001);
633 hPullPointPx =
new TH1F(
"hPullPointPx",
"(Px_{MC}-Px_{REC})/#sigma_{Px};(Px_{MC}-Px_{REC})/#sigma_{Px}",1e2,-10,10);
635 hResPointPy =
new TH1F(
"hResPointPy",
"Py_{MC}-Py_{REC};#deltaPy, GeV/c",1e2,-0.01,0.01);
636 hErrPointPy =
new TH1F(
"hErrPointPy",
"#sigma_{Py};#sigmaPy, GeV/c",1e3,0,0.001);
637 hPullPointPy =
new TH1F(
"hPullPointPy",
"(Py_{MC}-Py_{REC})/#sigma_{Py};(Py_{MC}-Py_{REC})/#sigma_{Py}",1e2,-10,10);
639 hResPointPz =
new TH1F(
"hResPointPz",
"Pz_{MC}-Pz_{REC};#deltaPz, GeV/c",1e2,-1e-4,1e-4);
640 hErrPointPz =
new TH1F(
"hErrPointPz",
"#sigma_{Pz};#sigmaPz, GeV/c",1e3,0,1e-3);
641 hPullPointPz =
new TH1F(
"hPullPointPz",
"(Pz_{MC}-Pz_{REC})/#sigma_{Pz};(Pz_{MC}-Pz_{REC})/#sigma_{Pz}",1e2,-10,10);
643 hResPointX =
new TH1F(
"hResPointX",
"X_{MC}-X_{REC};#deltaX,cm",1e2,-2.,2.);
644 hPullPointX =
new TH1F(
"hPullPointX",
"(X_{MC}-X_{REC})/#sigma_{X};(X_{MC}-X_{REC})/#sigma_{X}",1e2,-10,10);
645 hResPointY =
new TH1F(
"hResPointY",
"Y_{MC}-Y_{REC};#deltaY,cm",1e2,-2.,2.);
646 hPullPointY =
new TH1F(
"hPullPointY",
"(Y_{MC}-Y_{REC})/#sigma_{Y};(Y_{MC}-Y_{REC})/#sigma_{Y}",1e2,-10,10);
647 hResPointZ =
new TH1F(
"hResPointZ",
"Z_{MC}-Z_{REC};#deltaZ,cm",1e3,-0.15,0.15);
648 hPullPointZ =
new TH1F(
"hPullPointZ",
"(Z_{MC}-Z_{REC})/#sigma_{Z};(Z_{MC}-Z_{REC})/#sigma_{Z}",1e2,-10,10);
740 hhits =
new TH1I(
"hhits",
"number of hits in trk",7,0,7);
741 hchi2 =
new TH1F(
"hchi2",
"#chi^2 for reconstructed tracks;#chi^2;",1.5e2,-1,15.);
742 hResLumiTrkMom =
new TH1F(
"hResLumiTrkMom",
"P_{MC}-P_{REC}(near Lumi);#deltaP,GeV/c",1e3,-6e-7,6e-7);
743 hResLumiTrkTheta =
new TH1F(
"hResLumiTrkTheta",
"#theta_{MC}-#theta_{REC}(near Lumi);#delta#theta,rad",1e3,-6e-3,6e-3);
744 hResLumiTrkTheta2D =
new TH2D(
"hResLumiTrkTheta2D",
";#Delta#theta_{x}(near Lumi);#Delta#theta_{y},rad", 1e3,-0.0005, 0.0005, 1e3,-0.0005, 0.0005);
745 hMCLumiTrkTheta2D =
new TH2D(
"hMCLumiTrkTheta2D",
";#theta_{x}(MC near Lumi);#theta_{y},rad", 1e3, 0.030, 0.050, 1e3,-0.012, 0.012);
746 hRecLumiTrkTheta2D =
new TH2D(
"hRecLumiTrkTheta2D",
";#theta_{x}(Rec near Lumi);#theta_{y},rad", 1e3, 0.030, 0.050, 1e3,-0.012, 0.012);
749 hResLumiTrkPhi =
new TH1F(
"hResLumiTrkPhi",
"#phi_{MC}-#phi_{REC}(near Lumi);#delta#phi,rad",2e3,-1e-1,1e-1);
750 hResLumiTrkPointX =
new TH1F(
"hResLumiTrkPointX",
"X_{MC}-X_{REC}(near Lumi);#deltaX,cm",1e2,-0.02,0.02);
751 hResLumiTrkPointY =
new TH1F(
"hResLumiTrkPointY",
"Y_{MC}-Y_{REC}(near Lumi);#deltaY,cm",1e2,-0.02,0.02);
752 hResLumiTrkPointZ =
new TH1F(
"hResLumiTrkPointZ",
"Z_{MC}-Z_{REC}(near Lumi);#deltaZ,cm",1e2,-0.02,0.02);
754 hResLumiTrkPointPx =
new TH1F(
"hResLumiTrkPointPx",
"Px_{MC}-Px_{REC}(near Lumi);#deltaPx, GeV/c",1e2,-0.01,0.01);
755 hResLumiTrkPointPy =
new TH1F(
"hResLumiTrkPointPy",
"Py_{MC}-Py_{REC}(near Lumi);#deltaPy, GeV/c",1e2,-0.01,0.01);
756 hResLumiTrkPointPz =
new TH1F(
"hResLumiTrkPointPz",
"Pz_{MC}-Pz_{REC}(near Lumi);#deltaPz, GeV/c",1e2,-5e-4,5e-4);
758 hResLumiTrkPointXErr =
new TH1F(
"hResLumiTrkPointXErr",
"#sigma(X_{REC})(near Lumi);#sigma_{X},cm",1e2,0,0.02);
759 hResLumiTrkPointYErr =
new TH1F(
"hResLumiTrkPointYErr",
"#sigma(Y_{REC})(near Lumi);#sigma_{Y},cm",1e2,0,0.02);
760 hResLumiTrkPointZErr =
new TH1F(
"hResLumiTrkPointZErr",
"#sigma(Z_{REC})(near Lumi);#sigma_{Z},cm",1e2,0,0.02);
761 hResLumiTrkPointPxErr =
new TH1F(
"hResLumiTrkPointPxErr",
"#sigma(Px_{REC})(near Lumi);#sigma_{Px}, GeV/c",1e2,0,0.001);
762 hResLumiTrkPointPyErr =
new TH1F(
"hResLumiTrkPointPyErr",
"#sigma(Py_{REC})(near Lumi);#sigma_{Py}, GeV/c",1e2,0,0.001);
763 hResLumiTrkPointPzErr =
new TH1F(
"hResLumiTrkPointPzErr",
"#sigma(Pz_{REC})(near Lumi);#sigma_{Pz}, GeV/c",1e2,0,0.0001);
765 hResLumiTrkPointXPull =
new TH1F(
"hResLumiTrkPointXPull",
"(X_{MC}-X_{REC})/#sigma (near Lumi) ;(X_{MC}-X_{REC})/#sigma",1e2,-10.,10.);
766 hResLumiTrkPointYPull =
new TH1F(
"hResLumiTrkPointYPull",
"(Y_{MC}-Y_{REC})/#sigma (near Lumi);(Y_{MC}-Y_{REC})/#sigma",1e2,-10.,10.);
767 hResLumiTrkPointZPull =
new TH1F(
"hResLumiTrkPointZPull",
"(Z_{MC}-Z_{REC})/#sigma (near Lumi);(Z_{MC}-Z_{REC})/#sigma",1e3,-100.,100.);
769 hResLumiTrkPointPxPull =
new TH1F(
"hResLumiTrkPointPxPull",
"(Px_{MC}-Px_{REC})/#sigma (near Lumi);(Px_{MC}-Px_{REC})/#sigma",1e2,-10,10.);
770 hResLumiTrkPointPyPull =
new TH1F(
"hResLumiTrkPointPyPull",
"(Py_{MC}-Py_{REC})/#sigma (near Lumi);(Py_{MC}-Py_{REC})/#sigma",1e2,-10,10);
771 hResLumiTrkPointPzPull =
new TH1F(
"hResLumiTrkPointPzPull",
"(Pz_{MC}-Pz_{REC})/#sigma (near Lumi);(Pz_{MC}-Pz_{REC})/#sigma",1e2,-10,10);
772 hResLumiTrkThetaPull =
new TH1F(
"hResLumiTrkThetaPull",
"(#theta_{MC}-#theta_{REC})/#sigma (near Lumi);#delta#theta, rad",1e2,-10,10);
773 hResLumiTrkPhiPull =
new TH1F(
"hResLumiTrkPhiPull",
"(#phi_{MC}-#phi_{REC})/#sigma (near Lumi);#delta#phi, rad",1e2,-10,10);
777 hResHitX =
new TH1F(
"hResHitX",
"X_{MC}-X_{rec};#deltaX,cm",2e3,-0.5,0.5);
778 hResHitY =
new TH1F(
"hResHitY",
"Y_{MC}-Y_{rec};#deltaY,cm",2e3,-0.5,0.5);
779 hResHitZ =
new TH1F(
"hResHitZ",
"Z_{MC}-Z_{rec};#deltaZ,cm",2e2,-3e-2,3e-2);
782 std::cout <<
"-I- PndLmdQATask: Initialisation successfull" << std::endl;
798 bool isProblem =
true;
800 const int nRecHits =
fHitArray->GetEntriesFast();
802 for (Int_t
i=0;
i<nRecHits;
i++){
817 TVector3 recovec(hit->GetX(),hit->GetY(),hit->GetZ());
818 TVector3 mcvec(mc->GetX()+mc->
GetXOut(),mc->GetY()+mc->
GetYOut(),mc->GetZ()+mc->
GetZOut()); mcvec*=0.5;
821 TVector3 dvec(recovec-mcvec);
833 if(1e4*(mc->
GetZOut()-mc->GetZ())>0){
861 const int nGeaneTrks =
fGeaneArray->GetEntriesFast();
862 const int nParticles =
fmcTrkArray->GetEntriesFast();
864 const int nRecTrks =
fTrkArray->GetEntriesFast();
866 if(nGeaneTrks<nParticles)
867 mistrk += nParticles-nGeaneTrks;
869 if(nGeaneTrks>nParticles)
873 std::cout<<
"Hey, QA task is implemented only for 1 trk/event case. In Ev #"<<
fEvent-1<<
" you have "<<nParticles<<
" MC tracks!"<<std::endl;
877 cout<<
"# "<<
fEvent-1 <<
"\t nGeaneTrks="<<nGeaneTrks<<
" nParticles="<<nParticles<<
" nRecTrks="<<nRecTrks<<endl;
884 for (Int_t iN=0; iN<nGeaneTrks; iN++){
885 FairTrackParH *fRes = (FairTrackParH*)
fGeaneArray->At(iN);
886 Double_t lyambda = fRes->GetLambda();
888 cout<<
"GEANE didn't propagate this trk!"<<endl;
891 if(lyambda==0)
continue;
894 TVector3 MomRecPCA = fRes->GetMomentum();
896 TVector3 PosRecPCA = fRes->GetPosition();
900 TVector3 errMomRecPCA(errPx,errPy,errPz);
904 TVector3 errPosRecPCA(errX,errY,errZ);
912 double fLmPCA =
TMath::ASin(MomRecPCA.Z()/MomRecPCA.Mag());
915 Double_t fPPCA =
sqrt(MomRecPCA.X()*MomRecPCA.X()+MomRecPCA.Y()*MomRecPCA.Y()+MomRecPCA.Z()*MomRecPCA.Z());
916 Double_t fDPPCA= (2*MomRecPCA.X()*errMomRecPCA.X()+2*MomRecPCA.Y()*errMomRecPCA.Y()+2*MomRecPCA.Z()*errMomRecPCA.Z())/(2*fPPCA);
917 Double_t err_lyambda = (-((MomRecPCA.Z()*fDPPCA)/pow(fPPCA,2)) + errMomRecPCA.Z()/fPPCA)/
TMath::Sqrt(1 - pow(MomRecPCA.Z(),2)/pow(fPPCA,2));
918 Double_t err_phi = (-((MomRecPCA.Y()*fDPPCA/cLmPCA)/pow(fPPCA,2)) + (errMomRecPCA.Y()/cLmPCA)/fPPCA +(MomRecPCA.Y()*err_lyambda*
TMath::Tan(fLmPCA)/cLmPCA)/fPPCA) /
TMath::Sqrt(1 - (pow(MomRecPCA.Y(),2)*pow(1/cLmPCA,2))/pow(fPPCA,2));
935 double chi2 = trkpnd->GetChi2();
937 FairTrackParP fFittedTrkP = trkpnd->GetParamFirst();
938 TVector3 PosRecLMD(fFittedTrkP.GetX(),fFittedTrkP.GetY(),fFittedTrkP.GetZ());
939 TVector3 MomRecLMD(fFittedTrkP.GetPx(),fFittedTrkP.GetPy(),fFittedTrkP.GetPz());
941 double covMARS[6][6];
942 fFittedTrkP.GetMARSCov(covMARS);
943 TVector3 errMomRecLMD(
sqrt(covMARS[0][0]),
sqrt(covMARS[1][1]),
sqrt(covMARS[2][2]));
944 TVector3 errPosRecLMD(
sqrt(covMARS[3][3]),
sqrt(covMARS[4][4]),
sqrt(covMARS[5][5]));
947 double fLm =
TMath::ASin(MomRecLMD.Z()/MomRecLMD.Mag());
950 Double_t fP =
sqrt(MomRecLMD.X()*MomRecLMD.X()+MomRecLMD.Y()*MomRecLMD.Y()+MomRecLMD.Z()*MomRecLMD.Z());
951 Double_t fDP= (2*MomRecLMD.X()*errMomRecLMD.X()+2*MomRecLMD.Y()*errMomRecLMD.Y()+2*MomRecLMD.Z()*errMomRecLMD.Z())/(2*fP);
952 Double_t err_lyambdaLMD = (-((MomRecLMD.Z()*fDP)/pow(fP,2)) + errMomRecLMD.Z()/fP)/
TMath::Sqrt(1 - pow(MomRecLMD.Z(),2)/pow(fP,2));
953 Double_t err_phiLMD = (-((MomRecLMD.Y()*fDP/cLm)/pow(fP,2)) + (errMomRecLMD.Y()/cLm)/fP +(MomRecLMD.Y()*err_lyambdaLMD*
TMath::Tan(fLm)/cLm)/fP) /
TMath::Sqrt(1 - (pow(MomRecLMD.Y(),2)*pow(1/cLm,2))/pow(fP,2));
959 int candID = trkpnd->GetRefIndex();
961 const int Ntrkcandhits= trkcand->
GetNHits();
967 hhits->Fill(Ntrkcandhits);
968 for (Int_t iHit = 0; iHit < Ntrkcandhits; iHit++){
979 int MCidTOP = MCPoint->GetTrackID();
986 cout<<
"REC trk contains hits from different MC trks! Skip event #"<<
fEvent<<endl;
1005 MomRecPCA *= MomMCpca.Mag()/MomRecPCA.Mag();
1012 hPullPointPx->Fill((MomMCpca.X()-MomRecPCA.X())/errMomRecPCA.X());
1013 hPullPointPy->Fill((MomMCpca.Y()-MomRecPCA.Y())/errMomRecPCA.Y());
1014 hPullPointPz->Fill((MomMCpca.Z()-MomRecPCA.Z())/errMomRecPCA.Z());
1015 hResPointX->Fill(PosMCpca.X()-PosRecPCA.X());
1016 hResPointY->Fill(PosMCpca.Y()-PosRecPCA.Y());
1017 hResPointZ->Fill(PosMCpca.Z()-PosRecPCA.Z());
1018 hPullPointX->Fill((PosMCpca.X()-PosRecPCA.X())/errPosRecPCA.X());
1019 hPullPointY->Fill((PosMCpca.Y()-PosRecPCA.Y())/errPosRecPCA.Y());
1020 hPullPointZ->Fill((PosMCpca.Z()-PosRecPCA.Z())/errPosRecPCA.Z());
1113 hResTheta->Fill(1e3*(MomMCpca.Theta()-MomRecPCA.Theta()));
1114 hResTheta_th->Fill(1e3*MomMCpca.Theta(),1e3*(MomMCpca.Theta()-MomRecPCA.Theta()));
1115 hResTheta_ph->Fill(MomMCpca.Phi(),1e3*(MomMCpca.Theta()-MomRecPCA.Theta()));
1116 hResPhi->Fill(MomMCpca.Phi()-MomRecPCA.Phi());
1117 hPullTheta->Fill((MomMCpca.Theta()-MomRecPCA.Theta())/err_lyambda);
1118 hPullPhi->Fill((MomMCpca.Phi()-MomRecPCA.Phi())/err_phi);
1121 hResMom->Fill(MomMCpca.Mag()-MomRecPCA.Mag());
1125 double pxTrue = MCPointHit->GetPx();
1126 double pyTrue = MCPointHit->GetPy();
1127 double pzTrue = MCPointHit->GetPz();
1128 TVector3 MomMClmd(pxTrue,pyTrue,pzTrue);
1129 TVector3 dirMClmd = MomMClmd;
1130 dirMClmd *=1./MomMClmd.Mag();
1131 double deltaZ = -PosMClmd.Z()+PosRecLMD.Z();
1133 double xneu=PosMClmd.X()+dirMClmd.X()*deltaZ;
1134 double yneu=PosMClmd.Y()+dirMClmd.Y()*deltaZ;
1135 double zneu = PosMClmd.Z()+deltaZ;
1136 PosMClmd.SetXYZ(xneu,yneu,zneu);
1138 MomMClmd = dirMClmd*MomRecLMD.Mag();
1165 hResLumiTrkTheta2D->Fill((MomMClmd.X()/MomMClmd.Z()-MomRecLMD.X()/MomRecLMD.Z()), (MomMClmd.Y()/MomMClmd.Z()-MomRecLMD.Y()/MomRecLMD.Z()));
TH1 * hResLumiTrkPointPzErr
static T ASin(const T &x)
TH1 * hResLumiTrkPointPyErr
TH1 * hResLumiTrkPointXErr
friend F32vec4 sqrt(const F32vec4 &a)
static T Sqrt(const T &x)
TH1 * hResLumiTrkPointPyPull
Int_t GetIndex(int i=0) const
PndTrackCandHit GetSortedHit(UInt_t i)
TClonesArray * fmcHitArray
TVector3 GetMomentum() const
TH1 * hResLumiTrkPointPxPull
TH1 * hResLumiTrkPointXPull
TClonesArray * fTrkCandArray
TH1 * hResLumiTrkThetaPull
TH1 * hResLumiTrkPointYPull
TH1 * hResLumiTrkPointPzPull
Int_t GetDigiIndex(Int_t i) const
TClonesArray * fClusterArray
virtual void Exec(Option_t *opt)
PndLmdQATask(TString mcHitBranch="LMDPoint", TString mcTrkBranch="MCTrack", TString clusterBranch="LMDPixelClusterCand", TString digiBrunch="LMDPixelDigis", TString hitBranch="LmdHits", TString TrkCandBranch="LMDTrackCand", TString trackBranch="LMDTrack", TString geaneBranch="GeaneTrackFinal", TString outFile="tmpOutput/QA.root")
TH1 * hResLumiTrkPointPxErr
TVector3 GetPosition() const
TH1 * hResLumiTrkPointYErr
int hit(Int_t nEvents=0, TString inFile="sim.root", TString parFile="par.root", TString inDigi="digi.root", TString outFile="hit.root", Int_t timeBased=0)
TH1 * hResLumiTrkPointZPull
virtual InitStatus Init()
TH1 * hResLumiTrkPointZErr
Data class to store the digi output of a pixel module.
Int_t GetClusterIndex() const
TVector3 GetStartVertex() const
virtual void FinishTask()
TClonesArray * fmcTrkArray
TClonesArray * fGeaneArray
TClonesArray * fDigiArray