1 //------------------------------------------------------------------------------
\r
2 // Implementation of AliComparisonDCA class. It keeps information from
\r
3 // comparison of reconstructed and MC particle tracks. In addtion,
\r
4 // it keeps selection cuts used during comparison. The comparison
\r
5 // information is stored in the ROOT histograms. Analysis of these
\r
6 // histograms can be done by using Analyse() class function. The result of
\r
7 // the analysis (histograms) are stored in the output picture_dca.root file.
\r
9 // Author: J.Otwinowski 04/02/2008
\r
10 //------------------------------------------------------------------------------
\r
13 // after running analysis, read the file, and get component
\r
14 gSystem->Load("libPWG1.so");
\r
15 TFile f("Output.root");
\r
16 AliComparisonDCA * comp = (AliComparisonDCA*)f.Get("AliComparisonDCA");
\r
18 // analyse comparison data (output stored in pictures_dca.root)
\r
21 // TPC track length parameterisation
\r
22 TF1 fl("fl","((min(250./(abs(x+0.000001)),250)-90))",0,2); // length function
\r
23 TF1 fl2("fl2","[0]/((min(250./(abs(x+0.000001)),250)-90))^[1]",0,2);
\r
24 fl2.SetParameter(1,1);
\r
25 fl2.SetParameter(0,1);
\r
35 #include "TProfile.h"
\r
36 #include "TProfile2D.h"
\r
37 #include "TGraph2D.h"
\r
38 #include "TCanvas.h"
\r
41 #include "AliTracker.h"
\r
42 #include "AliESDEvent.h"
\r
44 #include "AliESDfriend.h"
\r
45 #include "AliESDfriendTrack.h"
\r
46 #include "AliRecInfoCuts.h"
\r
47 #include "AliMCInfoCuts.h"
\r
48 #include "AliLog.h"
\r
49 #include "AliESDVertex.h"
\r
51 #include "AliMathBase.h"
\r
52 #include "AliTreeDraw.h"
\r
54 #include "AliMCInfo.h"
\r
55 #include "AliESDRecInfo.h"
\r
56 #include "AliComparisonDCA.h"
\r
58 using namespace std;
\r
60 ClassImp(AliComparisonDCA)
\r
62 //_____________________________________________________________________________
\r
63 AliComparisonDCA::AliComparisonDCA():
\r
64 TNamed("AliComparisonDCA","AliComparisonDCA"),
\r
83 fVertex = new AliESDVertex();
\r
84 fVertex->SetXv(0.0);
\r
85 fVertex->SetYv(0.0);
\r
86 fVertex->SetZv(0.0);
\r
89 //_____________________________________________________________________________
\r
90 AliComparisonDCA::~AliComparisonDCA()
\r
93 if(fD0TanSPtB1) delete fD0TanSPtB1; fD0TanSPtB1=0;
\r
94 if(fD1TanSPtB1) delete fD1TanSPtB1; fD1TanSPtB1=0;
\r
95 if(fD0TanSPtL1) delete fD0TanSPtL1; fD0TanSPtL1=0;
\r
96 if(fD1TanSPtL1) delete fD1TanSPtL1; fD1TanSPtL1=0;
\r
97 if(fD0TanSPtInTPC) delete fD0TanSPtInTPC; fD0TanSPtInTPC=0;
\r
98 if(fD1TanSPtInTPC) delete fD1TanSPtInTPC; fD1TanSPtInTPC=0;
\r
99 if(fVertex) delete fVertex; fVertex=0;
\r
102 //_____________________________________________________________________________
\r
103 void AliComparisonDCA::InitHisto()
\r
106 fD0TanSPtB1 = new TH3F("DCAyTanSPtB1","DCAyTanSPt",40,-2,2, 10,0.3,3, 100,-1,1);
\r
107 fD0TanSPtB1->SetXTitle("tan(#theta)");
\r
108 fD0TanSPtB1->SetYTitle("#sqrt{p_{t}(GeV/c)}");
\r
109 fD0TanSPtB1->SetZTitle("DCA_{xy}");
\r
111 fD1TanSPtB1 = new TH3F("DCAzTanSPtB1","DCAzTanSPt",40,-2,2, 10,0.3,3, 100,-1,1);
\r
112 fD1TanSPtB1->SetXTitle("tan(#theta)");
\r
113 fD1TanSPtB1->SetYTitle("#sqrt(p_{t}(GeV/c))");
\r
114 fD1TanSPtB1->SetZTitle("DCA_{z}");
\r
116 fD0TanSPtL1 = new TH3F("DCAyTanSPtL1","DCAyTanSPt",40,-2,2, 10,0.3,3, 100,-1,1);
\r
117 fD0TanSPtL1->SetXTitle("tan(#theta)");
\r
118 fD0TanSPtL1->SetYTitle("#sqrt{p_{t}(GeV/c)}");
\r
119 fD0TanSPtL1->SetZTitle("DCA_{xy}");
\r
121 fD1TanSPtL1 = new TH3F("DCAzTanSPtL1","DCAzTanSPt",40,-2,2, 10,0.3,3, 100, -1,1);
\r
122 fD1TanSPtL1->SetXTitle("tan(#theta)");
\r
123 fD1TanSPtL1->SetYTitle("#sqrt{p_{t}(GeV/c)}");
\r
124 fD1TanSPtL1->SetZTitle("DCA_{z}");
\r
126 fD0TanSPtInTPC = new TH3F("DCAyTanSPtInTPC","DCAyTanSPt",40,-2,2, 10,0.3,3, 100,-1,1);
\r
127 fD0TanSPtInTPC->SetXTitle("tan(#theta)");
\r
128 fD0TanSPtInTPC->SetYTitle("#sqrt{p_{t}(GeV/c)}");
\r
129 fD0TanSPtInTPC->SetZTitle("DCA_{xy}");
\r
131 fD1TanSPtInTPC = new TH3F("DCAzTanSPtInTPC","DCAzTanSPt",40,-2,2, 10,0.3,3, 100, -1,1);
\r
132 fD1TanSPtInTPC->SetXTitle("tan(#theta)");
\r
133 fD1TanSPtInTPC->SetYTitle("#sqrt{p_{t}(GeV/c)}");
\r
134 fD1TanSPtInTPC->SetZTitle("DCA_{z}");
\r
137 //_____________________________________________________________________________
\r
138 void AliComparisonDCA::InitCuts()
\r
141 AliDebug(AliLog::kError, "ERROR: Cannot find AliMCInfoCuts object");
\r
143 AliDebug(AliLog::kError, "ERROR: Cannot find AliRecInfoCuts object");
\r
146 //_____________________________________________________________________________
\r
147 void AliComparisonDCA::Process(AliMCInfo* infoMC, AliESDRecInfo *infoRC)
\r
149 // Fill DCA comparison information
\r
150 AliExternalTrackParam *track = 0;
\r
151 Double_t kRadius = 3.0; // beam pipe radius
\r
152 Double_t kMaxStep = 5.0; // max step
\r
153 Double_t field = AliTracker::GetBz(); // nominal Bz field [kG]
\r
154 Double_t kMaxD = 123456.0; // max distance
\r
156 Int_t clusterITS[200];
\r
157 Double_t dca[2], cov[3]; // dca_xy, dca_z, sigma_xy, sigma_xy_z, sigma_z
\r
159 Float_t mcpt = infoMC->GetParticle().Pt();
\r
160 Float_t tantheta = TMath::Tan(infoMC->GetParticle().Theta()-TMath::Pi()*0.5);
\r
161 Float_t spt = TMath::Sqrt(mcpt);
\r
163 // distance to Prim. vertex
\r
164 const Double_t* dv = infoMC->GetVDist();
\r
166 Bool_t isPrim = TMath::Sqrt(dv[0]*dv[0] + dv[1]*dv[1])<fCutsMC->GetMaxR() && TMath::Abs(dv[2])<fCutsMC->GetMaxVz();
\r
168 // Check selection cuts
\r
169 if (fCutsMC->IsPdgParticle(TMath::Abs(infoMC->GetParticle().GetPdgCode())) == kFALSE) return;
\r
170 if (!isPrim) return;
\r
171 if (infoRC->GetStatus(1)!=3) return;
\r
172 if (!infoRC->GetESDtrack()) return;
\r
173 if (infoRC->GetESDtrack()->GetTPCNcls()<fCutsRC->GetMinNClustersTPC()) return;
\r
174 if (!infoRC->GetESDtrack()->GetConstrainedParam()) return;
\r
176 // calculate and set prim. vertex
\r
177 fVertex->SetXv( infoMC->GetParticle().Vx() - dv[0] );
\r
178 fVertex->SetYv( infoMC->GetParticle().Vy() - dv[1] );
\r
179 fVertex->SetZv( infoMC->GetParticle().Vz() - dv[2] );
\r
181 // calculate track parameters at vertex
\r
182 if (infoRC->GetESDtrack()->GetTPCInnerParam())
\r
184 if ((track = new AliExternalTrackParam(*infoRC->GetESDtrack()->GetTPCInnerParam())) != 0 )
\r
186 Bool_t bStatus = AliTracker::PropagateTrackTo(track,kRadius,infoMC->GetMass(),kMaxStep,kTRUE);
\r
187 Bool_t bDCAStatus = track->PropagateToDCA(fVertex,field,kMaxD,dca,cov);
\r
189 if(bStatus && bDCAStatus) {
\r
190 fD0TanSPtInTPC->Fill(tantheta,spt,dca[0]);
\r
191 fD1TanSPtInTPC->Fill(tantheta,spt,dca[1]);
\r
198 if(infoRC->GetESDtrack()->GetITSclusters(clusterITS)==0){
\r
199 fD0TanSPtB1->Fill(tantheta,spt,dca[0]);
\r
200 fD1TanSPtB1->Fill(tantheta,spt,dca[1]);
\r
202 fD0TanSPtL1->Fill(tantheta,spt,dca[0]);
\r
203 fD1TanSPtL1->Fill(tantheta,spt,dca[1]);
\r
206 //_____________________________________________________________________________
\r
207 Long64_t AliComparisonDCA::Merge(TCollection* list)
\r
209 // Merge list of objects (needed by PROOF)
\r
214 if (list->IsEmpty())
\r
217 TIterator* iter = list->MakeIterator();
\r
220 // collection of generated histograms
\r
222 while((obj = iter->Next()) != 0)
\r
224 AliComparisonDCA* entry = dynamic_cast<AliComparisonDCA*>(obj);
\r
226 Error("Add","Attempt to add object of class: %s to a %s",
\r
227 obj->ClassName(),this->ClassName());
\r
231 fD0TanSPtB1->Add(entry->fD0TanSPtB1);
\r
232 fD1TanSPtB1->Add(entry->fD1TanSPtB1);
\r
233 fD0TanSPtL1->Add(entry->fD0TanSPtL1);
\r
234 fD1TanSPtL1->Add(entry->fD1TanSPtL1);
\r
235 fD0TanSPtInTPC->Add(entry->fD0TanSPtInTPC);
\r
236 fD1TanSPtInTPC->Add(entry->fD1TanSPtInTPC);
\r
244 //_____________________________________________________________________________
\r
245 void AliComparisonDCA::Exec(AliMCInfo* infoMC, AliESDRecInfo *infoRC){
\r
246 // Process comparison information
\r
247 Process(infoMC,infoRC);
\r
250 //_____________________________________________________________________________
\r
251 void AliComparisonDCA::Analyse()
\r
253 // Analyse output histograms
\r
255 AliComparisonDCA * comp=this;
\r
259 TFile *fp = new TFile("pictures_dca.root","recreate");
\r
262 TCanvas * c = new TCanvas("DCA","DCA resloution");
\r
266 gr0 = AliMathBase::MakeStat1D(comp->fD0TanSPtB1,2,5);
\r
267 gr0->GetXaxis()->SetTitle("Tan(#theta)");
\r
268 gr0->GetYaxis()->SetTitle("#sigmaDCA (cm)");
\r
269 gr0->Write("DCAResolTan");
\r
271 gr = AliMathBase::MakeStat2D(comp->fD0TanSPtB1,4,2,5);
\r
272 gr->GetXaxis()->SetTitle("Tan(#theta)");
\r
273 gr->GetYaxis()->SetTitle("#sqrt{p_{t}(GeV/c)}");
\r
274 gr->GetYaxis()->SetTitle("#sigmaDCA (cm)");
\r
275 gr->GetHistogram()->Write("DCAResolSPTTan");
\r