1 #include "AliAnalysisTaskSE.h"
2 #include "AliTrackPointArray.h"
3 #include "AliAnalysisManager.h"
4 #include "AliAnalysisDataContainer.h"
5 #include "AliESDEvent.h"
6 #include "AliESDfriend.h"
9 #include "AliITSPIDResponse.h"
10 #include "AliMCEventHandler.h"
11 #include "AliMCEvent.h"
12 #include <TParticle.h>
19 #include "AliESDInputHandlerRP.h"
20 #include "AliAnalysisTaskITSsaTracks.h"
22 /**************************************************************************
23 * Copyright(c) 1998-2012, ALICE Experiment at CERN, All rights reserved. *
25 * Author: The ALICE Off-line Project. *
26 * Contributors are mentioned in the code where appropriate. *
28 * Permission to use, copy, modify and distribute this software and its *
29 * documentation strictly for non-commercial purposes is hereby granted *
30 * without fee, provided that the above copyright notice appears in all *
31 * copies and that both the copyright notice and this permission notice *
32 * appear in the supporting documentation. The authors make no claims *
33 * about the suitability of this software for any purpose. It is *
34 * provided "as is" without express or implied warranty. *
35 **************************************************************************/
37 //*************************************************************************
38 // Implementation of class AliAnalysisTaskITSsaTracks
39 // AliAnalysisTaskSE to extract QA and performance histos for ITS standalone tracks
42 // Authors: L. Milano, milano@to.infn.it
43 // F. Prino, prino@to.infn.it
45 //*************************************************************************
47 ClassImp(AliAnalysisTaskITSsaTracks)
48 //______________________________________________________________________________
49 AliAnalysisTaskITSsaTracks::AliAnalysisTaskITSsaTracks() : AliAnalysisTaskSE("ITSsa resolution"),
66 for(Int_t ilay=0; ilay<6;ilay++) fRequirePoint[ilay]=kFALSE;
67 DefineInput(0, TChain::Class());
68 DefineOutput(1, TList::Class());
69 const Int_t nbins = 29;
70 Double_t xbins[nbins+1]={0.06,0.08,0.10,0.12,0.14,0.16,0.18,0.20,0.25,0.30,
71 0.35,0.40,0.45,0.50,0.55,0.60,0.65,0.70,0.75,0.80,
72 0.85,0.90,0.95,1.00,1.20,1.40,1.60,1.80,1.90,2.00};
73 SetPtBins(nbins,xbins);
77 //___________________________________________________________________________
78 AliAnalysisTaskITSsaTracks::~AliAnalysisTaskITSsaTracks(){
80 if (AliAnalysisManager::GetAnalysisManager()->IsProofMode()) return;
81 // RS: why do we delete all histos? they are owned by the output!!!
84 for(Int_t iType=0; iType<kNtrackTypes; iType++){
85 delete fHistPt[iType];
86 delete fHistPtGood[iType];
87 delete fHistPtFake[iType];
88 delete fHistEtaPhi[iType];
89 delete fHistEtaPhiGood[iType];
90 delete fHistEtaPhiFake[iType];
91 delete fHistEtaPhiAny[iType];
92 delete fHistEtaPhi1SPD[iType];
93 delete fHistEtaPhi4Clu[iType];
94 delete fHistEtaPhi6Clu[iType];
95 delete fHistChi2[iType];
96 delete fHistChi2Good[iType];
97 delete fHistChi2Fake[iType];
98 delete fHistNclu[iType];
99 delete fHistNcluGood[iType];
100 delete fHistNcluFake[iType];
101 delete fHistdedxvsP2cls[iType];
102 delete fHistdedxvsP3cls[iType];
103 delete fHistdedxvsP4cls[iType];
105 for(Int_t iSpec=0; iSpec<kNspecies; iSpec++){
106 delete fHistPtTPCITS[iSpec];
107 delete fHistPtITSsa[iSpec];
108 delete fHistPtITSpureSA[iSpec];
109 delete fHistEtaPhiTPCITS[iSpec];
110 delete fHistEtaPhiITSsa[iSpec];
111 delete fHistEtaPhiITSpureSA[iSpec];
112 delete fHistNcluTPCITS[iSpec];
113 delete fHistNcluITSsa[iSpec];
114 delete fHistNcluITSpureSA[iSpec];
115 delete fHistd0rphiITSpureSA[iSpec];
116 delete fHistd0zITSpureSA[iSpec];
117 delete fHistCluInLayTPCITS[iSpec];
118 delete fHistCluInLayITSsa[iSpec];
119 delete fHistCluInLayITSpureSA[iSpec];
120 delete fHistOuterLayITSpureSA[iSpec];
121 delete fHistPtResid[iSpec];
122 delete fHistPtRelResid[iSpec];
123 delete fHistInvPtResid[iSpec];
124 delete fHistInvPtRelResid[iSpec];
125 delete fHistMCPtResid[iSpec];
126 delete fHistMCPtRelResid[iSpec];
127 delete fHistMCInvPtResid[iSpec];
128 delete fHistMCInvPtRelResid[iSpec];
131 delete fHistMCPhiResid;
132 delete fHistPhiResid;
133 delete fNtupleTracks;
140 //________________________________________________________________________
141 void AliAnalysisTaskITSsaTracks::SetPtBins(Int_t n, Double_t* lim){
142 // define pt bins for analysis
144 printf("Max. number of Pt bins = %d\n",kMaxPtBins);
148 for(Int_t i=0; i<fNPtBins+1; i++) fPtLimits[i]=lim[i];
149 for(Int_t i=fNPtBins+1; i<kMaxPtBins+1; i++) fPtLimits[i]=99999999.;
152 //___________________________________________________________________________
153 void AliAnalysisTaskITSsaTracks::UserCreateOutputObjects() {
154 // create output histos
156 fOutput = new TList();
158 fOutput->SetName("OutputHistos");
160 fNtupleTracks= new TNtuple("ntupleTracks","ntupleTracks","pt:px:py:pz:eta:phi:d0xy:d0z:dedx3:dedx4:dedx5:dedx6:truncmean:chi2:status:ITSrefit:TPCin:TPCrefit:ITSpureSA:nITSclu:nTPCclu:clumap:spdin:spdout:sddin:sddout:ssdin:ssdout:label:ptgen:pxgen:pygen:pzgen:etagen:phigen:ntracks");
161 // kinematics: pt, p eta,phi -> 6 variables
162 // impact parameters: d0xy, d0z -> 2 variables
163 // dE/dx: 4 Layers + trunc mean -> 5 variables
164 // chi2 and track status: -> 6 variables
165 // cluster infos: -> 9 variables
166 // MC info: -> 7 variables
167 // Multiplicity -> 1 variable
169 fOutput->Add(fNtupleTracks);
171 fHistNEvents = new TH1F("hNEvents", "Number of processed events",3,-0.5,2.5);
172 fHistNEvents->Sumw2();
173 fHistNEvents->SetMinimum(0);
174 fOutput->Add(fHistNEvents);
176 //binning for the dedx histogram
177 const Int_t hnbinsdedx=400;
178 Double_t hxmindedx = 0.01;
179 Double_t hxmaxdedx = 10;
180 Double_t hlogxmindedx = TMath::Log10(hxmindedx);
181 Double_t hlogxmaxdedx = TMath::Log10(hxmaxdedx);
182 Double_t hbinwidthdedx = (hlogxmaxdedx-hlogxmindedx)/hnbinsdedx;
183 Double_t hxbinsdedx[hnbinsdedx+1];
184 hxbinsdedx[0] = 0.01;
185 for (Int_t i=1;i<=hnbinsdedx;i++) {
186 hxbinsdedx[i] = hxmindedx + TMath::Power(10,hlogxmindedx+i*hbinwidthdedx);
189 TString tit[kNtrackTypes]={"TPCITS","ITSsa","ITSpureSA"};
190 for(Int_t iType=0; iType<kNtrackTypes; iType++){
191 fHistPt[iType]=new TH1F(Form("hPt%s",tit[iType].Data()),"",100,0.,2.);
192 fHistPt[iType]->Sumw2();
193 fOutput->Add(fHistPt[iType]);
194 fHistPtGood[iType]=new TH1F(Form("hPtGood%s",tit[iType].Data()),"",100,0.,2.);
195 fHistPtGood[iType]->Sumw2();
196 fOutput->Add(fHistPtGood[iType]);
197 fHistPtFake[iType]=new TH1F(Form("hPtFake%s",tit[iType].Data()),"",100,0.,2.);
198 fHistPtFake[iType]->Sumw2();
199 fOutput->Add(fHistPtFake[iType]);
201 fHistEtaPhi[iType] = new TH2F(Form("hEtaPhi%s",tit[iType].Data()),"",50,-1,1.,100,0.,2.*TMath::Pi());
202 fHistEtaPhi[iType]->Sumw2();
203 fOutput->Add(fHistEtaPhi[iType]);
204 fHistEtaPhiGood[iType] = new TH2F(Form("hEtaPhiGood%s",tit[iType].Data()),"",50,-1,1.,100,0.,2.*TMath::Pi());
205 fHistEtaPhiGood[iType]->Sumw2();
206 fOutput->Add(fHistEtaPhiGood[iType]);
207 fHistEtaPhiFake[iType] = new TH2F(Form("hEtaPhiFake%s",tit[iType].Data()),"",50,-1,1.,100,0.,2.*TMath::Pi());
208 fHistEtaPhiFake[iType]->Sumw2();
209 fOutput->Add(fHistEtaPhiFake[iType]);
211 fHistEtaPhiAny[iType] = new TH2F(Form("hEtaPhiAny%s",tit[iType].Data()),"",50,-1,1.,100,0.,2.*TMath::Pi());
212 fHistEtaPhiAny[iType]->Sumw2();
213 fOutput->Add(fHistEtaPhiAny[iType]);
214 fHistEtaPhi1SPD[iType] = new TH2F(Form("hEtaPhi1SPD%s",tit[iType].Data()),"",50,-1,1.,100,0.,2.*TMath::Pi());
215 fHistEtaPhi1SPD[iType]->Sumw2();
216 fOutput->Add(fHistEtaPhi1SPD[iType]);
217 fHistEtaPhi4Clu[iType] = new TH2F(Form("hEtaPhi4Clu%s",tit[iType].Data()),"",50,-1,1.,100,0.,2.*TMath::Pi());
218 fHistEtaPhi4Clu[iType]->Sumw2();
219 fOutput->Add(fHistEtaPhi4Clu[iType]);
220 fHistEtaPhi6Clu[iType] = new TH2F(Form("hEtaPhi6Clu%s",tit[iType].Data()),"",50,-1,1.,100,0.,2.*TMath::Pi());
221 fHistEtaPhi6Clu[iType]->Sumw2();
222 fOutput->Add(fHistEtaPhi6Clu[iType]);
224 fHistChi2[iType]=new TH1F(Form("hChi2%s",tit[iType].Data()),"",100,0.,10.);
225 fHistChi2[iType]->Sumw2();
226 fOutput->Add(fHistChi2[iType]);
227 fHistChi2Good[iType]=new TH1F(Form("hChi2Good%s",tit[iType].Data()),"",100,0.,10.);
228 fHistChi2Good[iType]->Sumw2();
229 fOutput->Add(fHistChi2Good[iType]);
230 fHistChi2Fake[iType]=new TH1F(Form("hChi2Fake%s",tit[iType].Data()),"",100,0.,10.);
231 fHistChi2Fake[iType]->Sumw2();
232 fOutput->Add(fHistChi2Fake[iType]);
234 fHistNclu[iType]=new TH1F(Form("hNclu%s",tit[iType].Data()),"",7,-0.5,6.5);
235 fHistNclu[iType]->Sumw2();
236 fOutput->Add(fHistNclu[iType]);
237 fHistNcluGood[iType]=new TH1F(Form("hNcluGood%s",tit[iType].Data()),"",7,-0.5,6.5);
238 fHistNcluGood[iType]->Sumw2();
239 fOutput->Add(fHistNcluGood[iType]);
240 fHistNcluFake[iType]=new TH1F(Form("hNcluFake%s",tit[iType].Data()),"",7,-0.5,6.5);
241 fHistNcluFake[iType]->Sumw2();
242 fOutput->Add(fHistNcluFake[iType]);
244 fHistdedxvsP2cls[iType] = new TH2F(Form("hdedxvsP2cls%s",tit[iType].Data()),"",hnbinsdedx,hxbinsdedx,900,0,1000);
245 fHistdedxvsP2cls[iType]->Sumw2();
246 fOutput->Add(fHistdedxvsP2cls[iType]);
248 fHistdedxvsP3cls[iType] = new TH2F(Form("hdedxvsP3cls%s",tit[iType].Data()),"",hnbinsdedx,hxbinsdedx,900,0,1000);
249 fHistdedxvsP3cls[iType]->Sumw2();
250 fOutput->Add(fHistdedxvsP3cls[iType]);
252 fHistdedxvsP4cls[iType] = new TH2F(Form("hdedxvsP4cls%s",tit[iType].Data()),"",hnbinsdedx,hxbinsdedx,900,0,1000);
253 fHistdedxvsP4cls[iType]->Sumw2();
254 fOutput->Add(fHistdedxvsP4cls[iType]);
257 //-----------------------------------------------------------
259 TString spname[3]={"Pion","Kaon","Proton"};
261 const Int_t nbins = fNPtBins;
262 Double_t xbins[nbins+1];
263 for(Int_t ibin=0; ibin<=nbins; ibin++) xbins[ibin]=fPtLimits[ibin];
265 for(Int_t iSpec=0; iSpec<kNspecies; iSpec++){
267 hisname.Form("hPtTPCITS%s",spname[iSpec].Data());
268 fHistPtTPCITS[iSpec] = new TH1F(hisname.Data(),"",100,0.,2.);
269 fHistPtTPCITS[iSpec]->Sumw2();
270 fOutput->Add(fHistPtTPCITS[iSpec]);
272 hisname.Form("hPtITSsa%s",spname[iSpec].Data());
273 fHistPtITSsa[iSpec] = new TH1F(hisname.Data(),"",100,0.,2.);
274 fHistPtITSsa[iSpec]->Sumw2();
275 fOutput->Add(fHistPtITSsa[iSpec]);
277 hisname.Form("hPtITSpureSA%s",spname[iSpec].Data());
278 fHistPtITSpureSA[iSpec] = new TH1F(hisname.Data(),"",100,0.,2.);
279 fHistPtITSpureSA[iSpec]->Sumw2();
280 fOutput->Add(fHistPtITSpureSA[iSpec]);
284 hisname.Form("hEtaPhiTPCITS%s",spname[iSpec].Data());
285 fHistEtaPhiTPCITS[iSpec] = new TH2F(hisname.Data(),"",50,-1,1.,50,0.,2.*TMath::Pi());
286 fHistEtaPhiTPCITS[iSpec]->Sumw2();
287 fOutput->Add(fHistEtaPhiTPCITS[iSpec]);
289 hisname.Form("hEtaPhiITSsa%s",spname[iSpec].Data());
290 fHistEtaPhiITSsa[iSpec] = new TH2F(hisname.Data(),"",50,-1,1.,50,0.,2.*TMath::Pi());
291 fHistEtaPhiITSsa[iSpec]->Sumw2();
292 fOutput->Add(fHistEtaPhiITSsa[iSpec]);
294 hisname.Form("hEtaPhiITSpureSA%s",spname[iSpec].Data());
295 fHistEtaPhiITSpureSA[iSpec] = new TH2F(hisname.Data(),"",50,-1,1.,50,0.,2.*TMath::Pi());
296 fHistEtaPhiITSpureSA[iSpec]->Sumw2();
297 fOutput->Add(fHistEtaPhiITSpureSA[iSpec]);
301 hisname.Form("hNcluTPCITS%s",spname[iSpec].Data());
302 fHistNcluTPCITS[iSpec] = new TH2F(hisname.Data(),"",100,0.,2.,7,-0.5,6.5);
303 fHistNcluTPCITS[iSpec]->Sumw2();
304 fOutput->Add(fHistNcluTPCITS[iSpec]);
306 hisname.Form("hNcluITSsa%s",spname[iSpec].Data());
307 fHistNcluITSsa[iSpec] = new TH2F(hisname.Data(),"",100,0.,2.,7,-0.5,6.5);
308 fHistNcluITSsa[iSpec]->Sumw2();
309 fOutput->Add(fHistNcluITSsa[iSpec]);
311 hisname.Form("hNcluITSpureSA%s",spname[iSpec].Data());
312 fHistNcluITSpureSA[iSpec] = new TH2F(hisname.Data(),"",100,0.,2.,7,-0.5,6.5);
313 fHistNcluITSpureSA[iSpec]->Sumw2();
314 fOutput->Add(fHistNcluITSpureSA[iSpec]);
318 hisname.Form("hd0rphiITSpureSA%s",spname[iSpec].Data());
319 fHistd0rphiITSpureSA[iSpec] = new TH2F(hisname.Data(),"",nbins,xbins,2000,-1,1);
320 fHistd0rphiITSpureSA[iSpec]->Sumw2();
321 fOutput->Add(fHistd0rphiITSpureSA[iSpec]);
323 hisname.Form("hd0zITSpureSA%s",spname[iSpec].Data());
324 fHistd0zITSpureSA[iSpec] = new TH2F(hisname.Data(),"",nbins,xbins,2000,-1,1);
325 fHistd0zITSpureSA[iSpec]->Sumw2();
326 fOutput->Add(fHistd0zITSpureSA[iSpec]);
330 hisname.Form("hCluInLayTPCITS%s",spname[iSpec].Data());
331 fHistCluInLayTPCITS[iSpec] = new TH2F(hisname.Data(),"",100,0.,2.,7,-1.5,5.5);
332 fHistCluInLayTPCITS[iSpec]->Sumw2();
333 fOutput->Add(fHistCluInLayTPCITS[iSpec]);
335 hisname.Form("hCluInLayITSsa%s",spname[iSpec].Data());
336 fHistCluInLayITSsa[iSpec] = new TH2F(hisname.Data(),"",100,0.,2.,7,-1.5,5.5);
337 fHistCluInLayITSsa[iSpec]->Sumw2();
338 fOutput->Add(fHistCluInLayITSsa[iSpec]);
340 hisname.Form("hCluInLayITSpureSA%s",spname[iSpec].Data());
341 fHistCluInLayITSpureSA[iSpec] = new TH2F(hisname.Data(),"",100,0.,2.,7,-1.5,5.5);
342 fHistCluInLayITSpureSA[iSpec]->Sumw2();
343 fOutput->Add(fHistCluInLayITSpureSA[iSpec]);
345 hisname.Form("hOuterLayITSpureSA%s",spname[iSpec].Data());
346 fHistOuterLayITSpureSA[iSpec] = new TH2F(hisname.Data(),"",100,0.,2.,7,-1.5,5.5);
347 fHistOuterLayITSpureSA[iSpec]->Sumw2();
348 fOutput->Add(fHistOuterLayITSpureSA[iSpec]);
352 hisname.Form("hPtResid%s",spname[iSpec].Data());
353 fHistPtResid[iSpec]=new TH2F(hisname.Data(),hisname.Data(),nbins,xbins,100,-1.,1.);
354 fHistPtResid[iSpec]->Sumw2();
355 fOutput->Add(fHistPtResid[iSpec]);
356 hisname.Form("hPtRelResid%s",spname[iSpec].Data());
357 fHistPtRelResid[iSpec]=new TH2F(hisname.Data(),hisname.Data(),nbins,xbins,100,-0.5,0.5);
358 fHistPtRelResid[iSpec]->Sumw2();
359 fOutput->Add(fHistPtRelResid[iSpec]);
361 hisname.Form("hInvPtResid%s",spname[iSpec].Data());
362 fHistInvPtResid[iSpec]=new TH2F(hisname.Data(),hisname.Data(),nbins,xbins,100,-1.,1.);
363 fHistInvPtResid[iSpec]->Sumw2();
364 fOutput->Add(fHistInvPtResid[iSpec]);
365 hisname.Form("hInvPtRelResid%s",spname[iSpec].Data());
366 fHistInvPtRelResid[iSpec]=new TH2F(hisname.Data(),hisname.Data(),nbins,xbins,100,-0.5,0.5);
367 fHistInvPtRelResid[iSpec]->Sumw2();
368 fOutput->Add(fHistInvPtRelResid[iSpec]);
370 hisname.Form("hMCPtResid%s",spname[iSpec].Data());
371 fHistMCPtResid[iSpec]=new TH2F(hisname.Data(),hisname.Data(),nbins,xbins,100,-1.,1.);
372 fHistMCPtResid[iSpec]->Sumw2();
373 fOutput->Add(fHistMCPtResid[iSpec]);
374 hisname.Form("hMCPtRelResid%s",spname[iSpec].Data());
375 fHistMCPtRelResid[iSpec]=new TH2F(hisname.Data(),hisname.Data(),nbins,xbins,100,-0.5,0.5);
376 fHistMCPtRelResid[iSpec]->Sumw2();
377 fOutput->Add(fHistMCPtRelResid[iSpec]);
379 hisname.Form("hMCInvPtResid%s",spname[iSpec].Data());
380 fHistMCInvPtResid[iSpec]=new TH2F(hisname.Data(),hisname.Data(),nbins,xbins,100,-1.,1.);
381 fHistMCInvPtResid[iSpec]->Sumw2();
382 fOutput->Add(fHistMCInvPtResid[iSpec]);
383 hisname.Form("hMCInvPtRelResid%s",spname[iSpec].Data());
384 fHistMCInvPtRelResid[iSpec]=new TH2F(hisname.Data(),hisname.Data(),nbins,xbins,100,-0.5,0.5);
385 fHistMCInvPtRelResid[iSpec]->Sumw2();
386 fOutput->Add(fHistMCInvPtRelResid[iSpec]);
390 fHistMCPhiResid=new TH2F("hMCPhiResid","",nbins,xbins,100,-0.5,0.5);
391 fHistMCPhiResid->Sumw2();
392 fOutput->Add(fHistMCPhiResid);
393 fHistPhiResid=new TH2F("hPhiResid","",nbins,xbins,100,-0.5,0.5);
394 fHistPhiResid->Sumw2();
395 fOutput->Add(fHistPhiResid);
400 //______________________________________________________________________________
401 void AliAnalysisTaskITSsaTracks::UserExec(Option_t *)
405 AliESDEvent *esd = (AliESDEvent*) (InputEvent());
409 printf("AliAnalysisTaskSDDRP::Exec(): bad ESD\n");
415 printf("AliAnalysisTaskSDDRP::Exec(): bad ESDfriend\n");
422 AliMCEventHandler* eventHandler = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
424 Printf("ERROR: Could not retrieve MC event handler");
427 AliMCEvent* mcEvent = eventHandler->MCEvent();
429 Printf("ERROR: Could not retrieve MC event");
432 stack = mcEvent->Stack();
434 Printf("ERROR: stack not available");
440 fHistNEvents->Fill(0);
441 const AliESDVertex *spdv=esd->GetPrimaryVertexSPD();
442 if(spdv->GetNContributors()<=0) return;
443 fHistNEvents->Fill(1);
445 const Int_t ntSize=36;
448 Int_t ntracks = esd->GetNumberOfTracks();
449 for (Int_t iTrack=0; iTrack < ntracks; iTrack++) {
450 AliESDtrack * track = esd->GetTrack(iTrack);
451 if (!track) continue;
452 Float_t pttrack=track->Pt();
453 Float_t ptrack=track->P();
454 Float_t pxtrack=track->Px();
455 Float_t pytrack=track->Py();
456 Float_t pztrack=track->Pz();
457 Float_t impactXY=-999, impactZ=-999;
458 track->GetImpactParameters(impactXY, impactZ);
460 track->GetITSdEdxSamples(dedxlay);
461 Float_t dedx=track->GetITSsignal();
462 Float_t chi2=track->GetITSchi2();
463 Int_t status=track->GetStatus();
464 Bool_t isITSrefit=kFALSE;
465 Bool_t isTPCin=kFALSE;
466 Bool_t isTPCrefit=kFALSE;
467 Bool_t isPureSA=kFALSE;
468 if(status&AliESDtrack::kITSrefit) isITSrefit=kTRUE;
469 if(status&AliESDtrack::kTPCin) isTPCin=kTRUE;
470 if(status&AliESDtrack::kTPCrefit) isTPCrefit=kTRUE;
471 if(status&AliESDtrack::kITSpureSA) isPureSA=kTRUE;
473 if(status&AliESDtrack::kTPCin) isSA=kFALSE;
474 Int_t nTPCclus=track->GetNcls(1);
475 Int_t nITSclus=track->GetNcls(0);
476 UChar_t clumap=track->GetITSClusterMap();
480 for(Int_t iLay=0; iLay<6;iLay++) track->GetITSModuleIndexInfo(iLay,idet,statusLay[iLay],xloc,zloc);
481 Int_t trlabel=track->GetLabel();
487 Float_t etagen=-999.;
488 Float_t phigen=-999.;
490 TParticle* part = stack->Particle(TMath::Abs(trlabel));
501 xnt[indexn++]=pttrack;
502 xnt[indexn++]=pxtrack;
503 xnt[indexn++]=pytrack;
504 xnt[indexn++]=pztrack;
505 xnt[indexn++]=track->Eta();
506 xnt[indexn++]=track->Phi();
507 xnt[indexn++]=impactXY;
508 xnt[indexn++]=impactZ;
509 for(Int_t iLay=0; iLay<4; iLay++) xnt[indexn++]=dedxlay[iLay];
512 xnt[indexn++]=status;
513 xnt[indexn++]=isITSrefit;
514 xnt[indexn++]=isTPCin;
515 xnt[indexn++]=isTPCrefit;
516 xnt[indexn++]=isPureSA;
517 xnt[indexn++]=nITSclus;
518 xnt[indexn++]=nTPCclus;
519 xnt[indexn++]=clumap;
520 for(Int_t iLay=0; iLay<6; iLay++) xnt[indexn++]=(Float_t)statusLay[iLay];
521 xnt[indexn++]=trlabel;
526 xnt[indexn++]=etagen;
527 xnt[indexn++]=phigen;
528 xnt[indexn++]=ntracks;
530 if(indexn>ntSize) printf("AliAnalysisTaskITSsaTracks: ERROR ntuple insexout of range\n");
531 if(fFillNtuple) fNtupleTracks->Fill(xnt);
533 if(!(status&AliESDtrack::kITSrefit)) continue;
536 if(status&AliESDtrack::kTPCin){
537 iTrackType=kTypeTPCITS;
539 if(status&AliESDtrack::kITSpureSA) iTrackType=kTypeITSpureSA;
540 else iTrackType=kTypeITSsa;
542 if(iTrackType<0 || iTrackType>=kNtrackTypes) continue;
545 for(Int_t i=0; i<2; i++){
546 if(clumap&(1<<i)) ++nSPDPoints;
548 Int_t nPointsForPid=0;
549 for(Int_t i=2; i<6; i++){
550 if(clumap&(1<<i)) ++nPointsForPid;
553 fHistEtaPhiAny[iTrackType]->Fill(track->Eta(),track->Phi());
554 if(nSPDPoints>=1) fHistEtaPhi1SPD[iTrackType]->Fill(track->Eta(),track->Phi());
555 if(nSPDPoints>=1 && nPointsForPid>=3) fHistEtaPhi4Clu[iTrackType]->Fill(track->Eta(),track->Phi());
556 if(nITSclus==6) fHistEtaPhi6Clu[iTrackType]->Fill(track->Eta(),track->Phi());
559 if(nITSclus<fMinITSpts)continue;
560 if((chi2/nITSclus) > fMaxITSChi2Clu) continue;
561 if(nSPDPoints<fMinSPDpts) continue;
563 fHistPt[iTrackType]->Fill(pttrack);
564 fHistEtaPhi[iTrackType]->Fill(track->Eta(),track->Phi());
566 fHistChi2[iTrackType]->Fill(chi2/nITSclus);
567 fHistNclu[iTrackType]->Fill(nITSclus);
568 if(nPointsForPid==2){
569 fHistdedxvsP2cls[iTrackType]->Fill(ptrack,dedx);
571 else if(nPointsForPid==3){
572 fHistdedxvsP3cls[iTrackType]->Fill(ptrack,dedx);
574 else if(nPointsForPid==4){
575 fHistdedxvsP4cls[iTrackType]->Fill(ptrack,dedx);
579 fHistPtFake[iTrackType]->Fill(pttrack);
580 fHistEtaPhiFake[iTrackType]->Fill(track->Eta(),track->Phi());
581 fHistChi2Fake[iTrackType]->Fill(chi2/nITSclus);
582 fHistNcluFake[iTrackType]->Fill(nITSclus);
584 fHistPtGood[iTrackType]->Fill(pttrack);
585 fHistEtaPhiGood[iTrackType]->Fill(track->Eta(),track->Phi());
586 fHistChi2Good[iTrackType]->Fill(chi2/nITSclus);
587 fHistNcluGood[iTrackType]->Fill(nITSclus);
591 Int_t hadronSpecie=-1;
592 if(fReadMC && fUseMCId){
594 TParticle* part = stack->Particle(trlabel);
595 Int_t pdg=TMath::Abs(part->GetPdgCode());
596 if(pdg==211) hadronSpecie=kPion;
597 else if(pdg==321) hadronSpecie=kKaon;
598 else if(pdg==2212) hadronSpecie=kProton;
601 if(nPointsForPid<fMinPtsforPid)continue;
602 AliITSPIDResponse pidits(fReadMC);
603 Float_t nSigmaPion=pidits.GetNumberOfSigmas(ptrack,dedx,AliPID::kPion,nPointsForPid,isSA);
604 if(nSigmaPion>-2. && nSigmaPion<2.){
607 Float_t nSigmaKaon=pidits.GetNumberOfSigmas(ptrack,dedx,AliPID::kKaon,nPointsForPid,isSA);
608 if(nSigmaKaon>-2. && nSigmaKaon<2.){
611 Float_t nSigmaProton=pidits.GetNumberOfSigmas(ptrack,dedx,AliPID::kProton,nPointsForPid,isSA);
612 if(nSigmaProton>-2. && nSigmaProton<2.){
613 hadronSpecie=kProton;
618 if(hadronSpecie<0) continue;
619 if(iTrackType==kTypeTPCITS){ // TPC+ITS tracks
620 fHistPtTPCITS[hadronSpecie]->Fill(pttrack);
621 fHistEtaPhiTPCITS[hadronSpecie]->Fill(track->Eta(),track->Phi());
622 fHistNcluTPCITS[hadronSpecie]->Fill(pttrack,nITSclus);
623 fHistCluInLayTPCITS[hadronSpecie]->Fill(-1.);
624 for(Int_t iBit=0; iBit<6; iBit++){
625 if(clumap&(1<<iBit)) fHistCluInLayTPCITS[hadronSpecie]->Fill(pttrack,iBit);
627 }else if(iTrackType==kTypeITSpureSA){ // TPC+ITS tracks
628 fHistPtITSpureSA[hadronSpecie]->Fill(pttrack);
629 fHistEtaPhiITSpureSA[hadronSpecie]->Fill(track->Eta(),track->Phi());
630 fHistNcluITSpureSA[hadronSpecie]->Fill(pttrack,nITSclus);
631 fHistd0rphiITSpureSA[hadronSpecie]->Fill(pttrack,impactXY);
632 fHistd0zITSpureSA[hadronSpecie]->Fill(pttrack,impactZ);
633 fHistCluInLayITSpureSA[hadronSpecie]->Fill(-1.);
635 for(Int_t iBit=0; iBit<6; iBit++){
636 if(clumap&(1<<iBit)){
637 fHistCluInLayITSpureSA[hadronSpecie]->Fill(pttrack,iBit);
638 if(iBit>outerLay) outerLay=iBit;
641 fHistOuterLayITSpureSA[hadronSpecie]->Fill(pttrack,outerLay);
646 TParticle* part = stack->Particle(trlabel);
648 Float_t invpttrack=track->OneOverPt();
650 if(ptgen>0.) invptgen=1./ptgen;
651 fHistMCPtResid[hadronSpecie]->Fill(pttrack,pttrack-ptgen);
652 fHistMCPtRelResid[hadronSpecie]->Fill(pttrack,(pttrack-ptgen)/ptgen);
653 fHistMCInvPtResid[hadronSpecie]->Fill(pttrack,invpttrack-invptgen);
654 fHistMCInvPtRelResid[hadronSpecie]->Fill(pttrack,(invpttrack-invptgen)/invptgen);
655 Float_t deltaphi=track->Phi()-part->Phi();
656 if(deltaphi<-TMath::Pi()) deltaphi+=2*TMath::Pi();
657 if(deltaphi>TMath::Pi()) deltaphi-=2*TMath::Pi();
658 fHistMCPhiResid->Fill(pttrack,deltaphi);
661 }else if(iTrackType==kTypeITSsa){ // TPC+ITS tracks
662 fHistPtITSsa[hadronSpecie]->Fill(pttrack);
663 fHistEtaPhiITSsa[hadronSpecie]->Fill(track->Eta(),track->Phi());
664 fHistNcluITSsa[hadronSpecie]->Fill(pttrack,nITSclus);
665 fHistCluInLayITSsa[hadronSpecie]->Fill(-1.);
666 for(Int_t iBit=0; iBit<6; iBit++){
667 if(clumap&(1<<iBit)) fHistCluInLayITSsa[hadronSpecie]->Fill(pttrack,iBit);
671 // match TPCITS with ITSpureSA
672 if(nITSclus<fMinITSpts || nTPCclus<fMinTPCpts) continue;
673 Int_t idxMI[12],idxSA[12];
674 for(Int_t icl=0; icl<12; icl++){
678 Int_t ncls=track->GetClusters(0,idxMI);
681 for(Int_t ilay=0; ilay<6; ilay++){
682 if(fRequirePoint[ilay]){
683 Int_t mask = 1<<ilay;
684 if(!(clumap & mask)){
690 if(!accept) continue;
693 for(Int_t i=0;i<12;i++){
694 for(Int_t j=i+1;j<12;j++){
695 if(idxMI[j]>idxMI[i]){
702 // for(Int_t i=0; i<12; i++) printf("%d ",idxMI[i]);
704 if(idxMI[0]<0 && idxMI[0]==idxMI[1]) continue;
705 Bool_t matched=kFALSE;
706 for (Int_t iTrack2 = 0; iTrack2 < ntracks; iTrack2++) {
708 if(iTrack2==iTrack) continue;
709 AliESDtrack* track2 = esd->GetTrack(iTrack2);
710 Int_t status2=track2->GetStatus();
711 if(!(status2&AliESDtrack::kITSrefit)) continue;
712 if(!(status2&AliESDtrack::kITSpureSA)) continue;
713 Int_t clumap2=track2->GetITSClusterMap();
714 Int_t nITSclus2=track2->GetNcls(0);
715 Int_t nTPCclus2=track2->GetNcls(1);
716 if(nITSclus2<fMinITSpts || nTPCclus2>0) continue;
717 Int_t ncls2=track2->GetClusters(0,idxSA);
718 if(ncls2!=ncls) continue;
721 for(Int_t ilay=0; ilay<6; ilay++){
722 if(fRequirePoint[ilay]){
723 Int_t mask = 1<<ilay;
724 if(!(clumap2 & mask)){
730 if(!accept) continue;
733 for(Int_t i=0;i<12;i++){
734 for(Int_t j=i+1;j<12;j++){
735 if(idxSA[j]>idxSA[i]){
743 for(Int_t icl=0; icl<ncls; icl++){
744 if(idxSA[icl]!=idxMI[icl]){
750 if(match==ncls && match>0){
752 Float_t pt1=track->Pt();
753 Float_t pt2=track2->Pt();
754 Float_t ptm1=track->OneOverPt();
755 Float_t ptm2=track2->OneOverPt();
756 fHistPtResid[hadronSpecie]->Fill(pt1,pt2-pt1);
757 fHistPtRelResid[hadronSpecie]->Fill(pt1,(pt2-pt1)/pt1);
758 fHistInvPtResid[hadronSpecie]->Fill(pt1,ptm2-ptm1);
759 fHistInvPtRelResid[hadronSpecie]->Fill(pt1,(ptm2-ptm1)/ptm1);
760 Float_t deltaphi=track->Phi()-track2->Phi();
761 if(deltaphi<-TMath::Pi()) deltaphi+=2*TMath::Pi();
762 if(deltaphi>TMath::Pi()) deltaphi-=2*TMath::Pi();
763 fHistPhiResid->Fill(pt1,deltaphi);
771 //______________________________________________________________________________
772 void AliAnalysisTaskITSsaTracks::Terminate(Option_t */*option*/)
774 // Terminate analysis
775 fOutput = dynamic_cast<TList*> (GetOutputData(1));
777 printf("ERROR: fOutput not available\n");
780 fNtupleTracks = dynamic_cast<TNtuple*>(fOutput->FindObject("ntupleTracks"));
781 fHistNEvents= dynamic_cast<TH1F*>(fOutput->FindObject("hNEvents"));
783 TString spname[3]={"Pion","Kaon","Proton"};
785 for(Int_t iSpec=0; iSpec<kNspecies; iSpec++){
786 fHistPtTPCITS[iSpec]= dynamic_cast<TH1F*>(fOutput->FindObject(Form("hPtTPCITS%s",spname[iSpec].Data())));
787 fHistPtITSsa[iSpec]= dynamic_cast<TH1F*>(fOutput->FindObject(Form("hPtITSsa%s",spname[iSpec].Data())));
788 fHistPtITSpureSA[iSpec]= dynamic_cast<TH1F*>(fOutput->FindObject(Form("hPtITSpureSA%s",spname[iSpec].Data())));
790 fHistEtaPhiTPCITS[iSpec]= dynamic_cast<TH2F*>(fOutput->FindObject(Form("hEtaPhiTPCITS%s",spname[iSpec].Data())));
791 fHistEtaPhiITSsa[iSpec]= dynamic_cast<TH2F*>(fOutput->FindObject(Form("hEtaPhiITSsa%s",spname[iSpec].Data())));
792 fHistEtaPhiITSpureSA[iSpec]= dynamic_cast<TH2F*>(fOutput->FindObject(Form("hEtaPhiITSpureSA%s",spname[iSpec].Data())));
794 fHistNcluTPCITS[iSpec]= dynamic_cast<TH2F*>(fOutput->FindObject(Form("hNcluTPCITS%s",spname[iSpec].Data())));
795 fHistNcluITSsa[iSpec]= dynamic_cast<TH2F*>(fOutput->FindObject(Form("hNcluITSsa%s",spname[iSpec].Data())));
796 fHistNcluITSpureSA[iSpec]= dynamic_cast<TH2F*>(fOutput->FindObject(Form("hNcluITSpureSA%s",spname[iSpec].Data())));
798 fHistd0rphiITSpureSA[iSpec]= dynamic_cast<TH2F*>(fOutput->FindObject(Form("hd0rphiITSpureSA%s",spname[iSpec].Data())));
799 fHistd0zITSpureSA[iSpec]= dynamic_cast<TH2F*>(fOutput->FindObject(Form("hd0zITSpureSA%s",spname[iSpec].Data())));
801 fHistCluInLayTPCITS[iSpec]= dynamic_cast<TH2F*>(fOutput->FindObject(Form("hCluInLayTPCITS%s",spname[iSpec].Data())));
802 fHistCluInLayITSsa[iSpec]= dynamic_cast<TH2F*>(fOutput->FindObject(Form("hCluInLayITSsa%s",spname[iSpec].Data())));
803 fHistCluInLayITSpureSA[iSpec]= dynamic_cast<TH2F*>(fOutput->FindObject(Form("hCluInLayITSpureSA%s",spname[iSpec].Data())));
805 fHistOuterLayITSpureSA[iSpec]= dynamic_cast<TH2F*>(fOutput->FindObject(Form("hOuterLayITSpureSA%s",spname[iSpec].Data())));
807 fHistPtResid[iSpec]= dynamic_cast<TH2F*>(fOutput->FindObject(Form("hPtResid%s",spname[iSpec].Data())));
808 fHistPtRelResid[iSpec]= dynamic_cast<TH2F*>(fOutput->FindObject(Form("hPtRelResid%s",spname[iSpec].Data())));
809 fHistInvPtResid[iSpec]= dynamic_cast<TH2F*>(fOutput->FindObject(Form("hInvPtResid%s",spname[iSpec].Data())));
810 fHistInvPtRelResid[iSpec]= dynamic_cast<TH2F*>(fOutput->FindObject(Form("hInvPtRelResid%s",spname[iSpec].Data())));
811 fHistMCPtResid[iSpec]= dynamic_cast<TH2F*>(fOutput->FindObject(Form("hMCPtResid%s",spname[iSpec].Data())));
812 fHistMCPtRelResid[iSpec]= dynamic_cast<TH2F*>(fOutput->FindObject(Form("hMCPtRelResid%s",spname[iSpec].Data())));
813 fHistMCInvPtResid[iSpec]= dynamic_cast<TH2F*>(fOutput->FindObject(Form("hMCInvPtResid%s",spname[iSpec].Data())));
814 fHistMCInvPtRelResid[iSpec]= dynamic_cast<TH2F*>(fOutput->FindObject(Form("hMCInvPtRelResid%s",spname[iSpec].Data())));
817 fHistMCPhiResid= dynamic_cast<TH2F*>(fOutput->FindObject("hMCPhiResid"));
818 fHistPhiResid= dynamic_cast<TH2F*>(fOutput->FindObject("hPhiResid"));