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>
18 #include "AliESDInputHandlerRP.h"
19 #include "AliAnalysisTaskITSsaTracks.h"
21 /**************************************************************************
22 * Copyright(c) 1998-2012, ALICE Experiment at CERN, All rights reserved. *
24 * Author: The ALICE Off-line Project. *
25 * Contributors are mentioned in the code where appropriate. *
27 * Permission to use, copy, modify and distribute this software and its *
28 * documentation strictly for non-commercial purposes is hereby granted *
29 * without fee, provided that the above copyright notice appears in all *
30 * copies and that both the copyright notice and this permission notice *
31 * appear in the supporting documentation. The authors make no claims *
32 * about the suitability of this software for any purpose. It is *
33 * provided "as is" without express or implied warranty. *
34 **************************************************************************/
36 //*************************************************************************
37 // Implementation of class AliAnalysisTaskITSsaTracks
38 // AliAnalysisTaskSE to extract QA and performance histos for ITS standalone tracks
41 // Authors: L. Milano, milano@to.infn.it
42 // F. Prino, prino@to.infn.it
44 //*************************************************************************
46 ClassImp(AliAnalysisTaskITSsaTracks)
47 //______________________________________________________________________________
48 AliAnalysisTaskITSsaTracks::AliAnalysisTaskITSsaTracks() : AliAnalysisTaskSE("ITSsa resolution"),
57 fHistPtITSpureSAAll(0),
58 fHistPtITSpureSAGood(0),
59 fHistPtITSpureSAFake(0),
60 fHistdedxvsPtITSpureSA3cls(0),
61 fHistdedxvsPITSpureSA3cls(0),
62 fHistdedxvsPtITSpureSA4cls(0),
63 fHistdedxvsPITSpureSA4cls(0),
68 fMinITSptsForMatch(6),
74 for(Int_t ilay=0; ilay<6;ilay++) fRequirePoint[ilay]=kFALSE;
75 DefineInput(0, TChain::Class());
76 DefineOutput(1, TList::Class());
77 const Int_t nbins = 29;
78 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,
79 0.35,0.40,0.45,0.50,0.55,0.60,0.65,0.70,0.75,0.80,
80 0.85,0.90,0.95,1.00,1.20,1.40,1.60,1.80,1.90,2.00};
81 SetPtBins(nbins,xbins);
85 //___________________________________________________________________________
86 AliAnalysisTaskITSsaTracks::~AliAnalysisTaskITSsaTracks(){
94 //________________________________________________________________________
95 void AliAnalysisTaskITSsaTracks::SetPtBins(Int_t n, Double_t* lim){
96 // define pt bins for analysis
98 printf("Max. number of Pt bins = %d\n",kMaxPtBins);
102 for(Int_t i=0; i<fNPtBins+1; i++) fPtLimits[i]=lim[i];
103 for(Int_t i=fNPtBins+1; i<kMaxPtBins+1; i++) fPtLimits[i]=99999999.;
106 //___________________________________________________________________________
107 void AliAnalysisTaskITSsaTracks::UserCreateOutputObjects() {
108 // create output histos
110 fOutput = new TList();
112 fOutput->SetName("OutputHistos");
114 fHistNEvents = new TH1F("hNEvents", "Number of processed events",3,-0.5,2.5);
115 fHistNEvents->Sumw2();
116 fHistNEvents->SetMinimum(0);
117 fOutput->Add(fHistNEvents);
119 //binning for the dedx histogram
120 const Int_t hnbinsdedx=400;
121 Double_t hxmindedx = 0.01;
122 Double_t hxmaxdedx = 10;
123 Double_t hlogxmindedx = TMath::Log10(hxmindedx);
124 Double_t hlogxmaxdedx = TMath::Log10(hxmaxdedx);
125 Double_t hbinwidthdedx = (hlogxmaxdedx-hlogxmindedx)/hnbinsdedx;
126 Double_t hxbinsdedx[hnbinsdedx+1];
127 hxbinsdedx[0] = 0.01;
128 for (Int_t i=1;i<=hnbinsdedx;i++) {
129 hxbinsdedx[i] = hxmindedx + TMath::Power(10,hlogxmindedx+i*hbinwidthdedx);
132 fHistdedxvsPtITSpureSA3cls = new TH2F("hdedxvsPtITSpureSA3cls","",hnbinsdedx,hxbinsdedx,900,0,1000);
133 fHistdedxvsPtITSpureSA3cls->Sumw2();
134 fOutput->Add(fHistdedxvsPtITSpureSA3cls);
136 fHistdedxvsPITSpureSA3cls = new TH2F("hdedxvsPITSpureSA3cls","",hnbinsdedx,hxbinsdedx,900,0,1000);
137 fHistdedxvsPITSpureSA3cls->Sumw2();
138 fOutput->Add(fHistdedxvsPITSpureSA3cls);
140 fHistdedxvsPtITSpureSA4cls = new TH2F("hdedxvsPtITSpureSA4cls","",hnbinsdedx,hxbinsdedx,900,0,1000);
141 fHistdedxvsPtITSpureSA4cls->Sumw2();
142 fOutput->Add(fHistdedxvsPtITSpureSA4cls);
144 fHistdedxvsPITSpureSA4cls = new TH2F("hdedxvsPITSpureSA4cls","",hnbinsdedx,hxbinsdedx,900,0,1000);
145 fHistdedxvsPITSpureSA4cls->Sumw2();
146 fOutput->Add(fHistdedxvsPITSpureSA4cls);
148 TString spname[3]={"Pion","Kaon","Proton"};
150 const Int_t nbins = fNPtBins;
151 Double_t xbins[nbins+1];
152 for(Int_t ibin=0; ibin<=nbins; ibin++) xbins[ibin]=fPtLimits[ibin];
155 fHistPtTPCITSAll = new TH1F("hPtTPCITSAll","",100,0.,2.);
156 fHistPtTPCITSAll->Sumw2();
157 fOutput->Add(fHistPtTPCITSAll);
158 fHistPtTPCITSGood = new TH1F("hPtTPCITSGood","",100,0.,2.);
159 fHistPtTPCITSGood->Sumw2();
160 fOutput->Add(fHistPtTPCITSGood);
161 fHistPtTPCITSFake = new TH1F("hPtTPCITSFake","",100,0.,2.);
162 fHistPtTPCITSFake->Sumw2();
163 fOutput->Add(fHistPtTPCITSFake);
165 fHistPtITSsaAll = new TH1F("hPtITSsaAll","",100,0.,2.);
166 fHistPtITSsaAll->Sumw2();
167 fOutput->Add(fHistPtITSsaAll);
168 fHistPtITSsaGood = new TH1F("hPtITSsaGood","",100,0.,2.);
169 fHistPtITSsaGood->Sumw2();
170 fOutput->Add(fHistPtITSsaGood);
171 fHistPtITSsaFake = new TH1F("hPtITSsaFake","",100,0.,2.);
172 fHistPtITSsaFake->Sumw2();
173 fOutput->Add(fHistPtITSsaFake);
175 fHistPtITSpureSAAll = new TH1F("hPtITSpureSAAll","",100,0.,2.);
176 fHistPtITSpureSAAll->Sumw2();
177 fOutput->Add(fHistPtITSpureSAAll);
178 fHistPtITSpureSAGood = new TH1F("hPtITSpureSAGood","",100,0.,2.);
179 fHistPtITSpureSAGood->Sumw2();
180 fOutput->Add(fHistPtITSpureSAGood);
181 fHistPtITSpureSAFake = new TH1F("hPtITSpureSAFake","",100,0.,2.);
182 fHistPtITSpureSAFake->Sumw2();
183 fOutput->Add(fHistPtITSpureSAFake);
185 for(Int_t iSpec=0; iSpec<kNspecies; iSpec++){
187 hisname.Form("hPtTPCITS%s",spname[iSpec].Data());
188 fHistPtTPCITS[iSpec] = new TH1F(hisname.Data(),"",100,0.,2.);
189 fHistPtTPCITS[iSpec]->Sumw2();
190 fOutput->Add(fHistPtTPCITS[iSpec]);
192 hisname.Form("hPtITSsa%s",spname[iSpec].Data());
193 fHistPtITSsa[iSpec] = new TH1F(hisname.Data(),"",100,0.,2.);
194 fHistPtITSsa[iSpec]->Sumw2();
195 fOutput->Add(fHistPtITSsa[iSpec]);
197 hisname.Form("hPtITSpureSA%s",spname[iSpec].Data());
198 fHistPtITSpureSA[iSpec] = new TH1F(hisname.Data(),"",100,0.,2.);
199 fHistPtITSpureSA[iSpec]->Sumw2();
200 fOutput->Add(fHistPtITSpureSA[iSpec]);
204 hisname.Form("hEtaPhiTPCITS%s",spname[iSpec].Data());
205 fHistEtaPhiTPCITS[iSpec] = new TH2F(hisname.Data(),"",50,-1,1.,50,0.,2.*TMath::Pi());
206 fHistEtaPhiTPCITS[iSpec]->Sumw2();
207 fOutput->Add(fHistEtaPhiTPCITS[iSpec]);
209 hisname.Form("hEtaPhiITSsa%s",spname[iSpec].Data());
210 fHistEtaPhiITSsa[iSpec] = new TH2F(hisname.Data(),"",50,-1,1.,50,0.,2.*TMath::Pi());
211 fHistEtaPhiITSsa[iSpec]->Sumw2();
212 fOutput->Add(fHistEtaPhiITSsa[iSpec]);
214 hisname.Form("hEtaPhiITSpureSA%s",spname[iSpec].Data());
215 fHistEtaPhiITSpureSA[iSpec] = new TH2F(hisname.Data(),"",50,-1,1.,50,0.,2.*TMath::Pi());
216 fHistEtaPhiITSpureSA[iSpec]->Sumw2();
217 fOutput->Add(fHistEtaPhiITSpureSA[iSpec]);
221 hisname.Form("hNcluTPCITS%s",spname[iSpec].Data());
222 fHistNcluTPCITS[iSpec] = new TH2F(hisname.Data(),"",100,0.,2.,7,-0.5,6.5);
223 fHistNcluTPCITS[iSpec]->Sumw2();
224 fOutput->Add(fHistNcluTPCITS[iSpec]);
226 hisname.Form("hNcluITSsa%s",spname[iSpec].Data());
227 fHistNcluITSsa[iSpec] = new TH2F(hisname.Data(),"",100,0.,2.,7,-0.5,6.5);
228 fHistNcluITSsa[iSpec]->Sumw2();
229 fOutput->Add(fHistNcluITSsa[iSpec]);
231 hisname.Form("hNcluITSpureSA%s",spname[iSpec].Data());
232 fHistNcluITSpureSA[iSpec] = new TH2F(hisname.Data(),"",100,0.,2.,7,-0.5,6.5);
233 fHistNcluITSpureSA[iSpec]->Sumw2();
234 fOutput->Add(fHistNcluITSpureSA[iSpec]);
238 hisname.Form("hd0rphiITSpureSA%s",spname[iSpec].Data());
239 fHistd0rphiITSpureSA[iSpec] = new TH2F(hisname.Data(),"",nbins,xbins,2000,-1,1);
240 fHistd0rphiITSpureSA[iSpec]->Sumw2();
241 fOutput->Add(fHistd0rphiITSpureSA[iSpec]);
243 hisname.Form("hd0zITSpureSA%s",spname[iSpec].Data());
244 fHistd0zITSpureSA[iSpec] = new TH2F(hisname.Data(),"",nbins,xbins,2000,-1,1);
245 fHistd0zITSpureSA[iSpec]->Sumw2();
246 fOutput->Add(fHistd0zITSpureSA[iSpec]);
250 hisname.Form("hCluInLayTPCITS%s",spname[iSpec].Data());
251 fHistCluInLayTPCITS[iSpec] = new TH2F(hisname.Data(),"",100,0.,2.,7,-1.5,5.5);
252 fHistCluInLayTPCITS[iSpec]->Sumw2();
253 fOutput->Add(fHistCluInLayTPCITS[iSpec]);
255 hisname.Form("hCluInLayITSsa%s",spname[iSpec].Data());
256 fHistCluInLayITSsa[iSpec] = new TH2F(hisname.Data(),"",100,0.,2.,7,-1.5,5.5);
257 fHistCluInLayITSsa[iSpec]->Sumw2();
258 fOutput->Add(fHistCluInLayITSsa[iSpec]);
260 hisname.Form("hCluInLayITSpureSA%s",spname[iSpec].Data());
261 fHistCluInLayITSpureSA[iSpec] = new TH2F(hisname.Data(),"",100,0.,2.,7,-1.5,5.5);
262 fHistCluInLayITSpureSA[iSpec]->Sumw2();
263 fOutput->Add(fHistCluInLayITSpureSA[iSpec]);
265 hisname.Form("hOuterLayITSpureSA%s",spname[iSpec].Data());
266 fHistOuterLayITSpureSA[iSpec] = new TH2F(hisname.Data(),"",100,0.,2.,7,-1.5,5.5);
267 fHistOuterLayITSpureSA[iSpec]->Sumw2();
268 fOutput->Add(fHistOuterLayITSpureSA[iSpec]);
272 hisname.Form("hPtResid%s",spname[iSpec].Data());
273 fHistPtResid[iSpec]=new TH2F(hisname.Data(),hisname.Data(),nbins,xbins,100,-1.,1.);
274 fHistPtResid[iSpec]->Sumw2();
275 fOutput->Add(fHistPtResid[iSpec]);
276 hisname.Form("hPtRelResid%s",spname[iSpec].Data());
277 fHistPtRelResid[iSpec]=new TH2F(hisname.Data(),hisname.Data(),nbins,xbins,100,-0.5,0.5);
278 fHistPtRelResid[iSpec]->Sumw2();
279 fOutput->Add(fHistPtRelResid[iSpec]);
281 hisname.Form("hInvPtResid%s",spname[iSpec].Data());
282 fHistInvPtResid[iSpec]=new TH2F(hisname.Data(),hisname.Data(),nbins,xbins,100,-1.,1.);
283 fHistInvPtResid[iSpec]->Sumw2();
284 fOutput->Add(fHistInvPtResid[iSpec]);
285 hisname.Form("hInvPtRelResid%s",spname[iSpec].Data());
286 fHistInvPtRelResid[iSpec]=new TH2F(hisname.Data(),hisname.Data(),nbins,xbins,100,-0.5,0.5);
287 fHistInvPtRelResid[iSpec]->Sumw2();
288 fOutput->Add(fHistInvPtRelResid[iSpec]);
290 hisname.Form("hMCPtResid%s",spname[iSpec].Data());
291 fHistMCPtResid[iSpec]=new TH2F(hisname.Data(),hisname.Data(),nbins,xbins,100,-1.,1.);
292 fHistMCPtResid[iSpec]->Sumw2();
293 fOutput->Add(fHistMCPtResid[iSpec]);
294 hisname.Form("hMCPtRelResid%s",spname[iSpec].Data());
295 fHistMCPtRelResid[iSpec]=new TH2F(hisname.Data(),hisname.Data(),nbins,xbins,100,-0.5,0.5);
296 fHistMCPtRelResid[iSpec]->Sumw2();
297 fOutput->Add(fHistMCPtRelResid[iSpec]);
299 hisname.Form("hMCInvPtResid%s",spname[iSpec].Data());
300 fHistMCInvPtResid[iSpec]=new TH2F(hisname.Data(),hisname.Data(),nbins,xbins,100,-1.,1.);
301 fHistMCInvPtResid[iSpec]->Sumw2();
302 fOutput->Add(fHistMCInvPtResid[iSpec]);
303 hisname.Form("hMCInvPtRelResid%s",spname[iSpec].Data());
304 fHistMCInvPtRelResid[iSpec]=new TH2F(hisname.Data(),hisname.Data(),nbins,xbins,100,-0.5,0.5);
305 fHistMCInvPtRelResid[iSpec]->Sumw2();
306 fOutput->Add(fHistMCInvPtRelResid[iSpec]);
311 //______________________________________________________________________________
312 void AliAnalysisTaskITSsaTracks::UserExec(Option_t *)
316 AliESDEvent *esd = (AliESDEvent*) (InputEvent());
320 printf("AliAnalysisTaskSDDRP::Exec(): bad ESD\n");
326 printf("AliAnalysisTaskSDDRP::Exec(): bad ESDfriend\n");
333 AliMCEventHandler* eventHandler = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
335 Printf("ERROR: Could not retrieve MC event handler");
338 AliMCEvent* mcEvent = eventHandler->MCEvent();
340 Printf("ERROR: Could not retrieve MC event");
343 stack = mcEvent->Stack();
345 Printf("ERROR: stack not available");
350 PostData(1, fOutput);
352 fHistNEvents->Fill(0);
353 const AliESDVertex *spdv=esd->GetPrimaryVertexSPD();
354 if(spdv->GetNContributors()<=0) return;
355 fHistNEvents->Fill(1);
357 Int_t ntracks = esd->GetNumberOfTracks();
358 for (Int_t iTrack=0; iTrack < ntracks; iTrack++) {
359 AliESDtrack * track = esd->GetTrack(iTrack);
360 if (!track) continue;
361 Int_t status=track->GetStatus();
362 if(!(status&AliESDtrack::kITSrefit)) continue;
364 if(status&AliESDtrack::kTPCin) isSA=kFALSE;
365 Int_t nTPCclus=track->GetNcls(1);
366 Int_t nITSclus=track->GetNcls(0);
367 if(nITSclus<fMinITSpts)continue;
369 UChar_t clumap=track->GetITSClusterMap();
371 for(Int_t i=0; i<2; i++){
372 if(clumap&(1<<i)) ++nSPDPoints;
374 if(nSPDPoints<fMinSPDpts) continue;
376 Int_t nPointsForPid=0;
377 for(Int_t i=2; i<6; i++){
378 if(clumap&(1<<i)) ++nPointsForPid;
381 Float_t pttrack=track->Pt();
382 Float_t ptrack=track->P();
383 Float_t dedx=track->GetITSsignal();
384 Int_t hadronSpecie=-1;
385 if(status&AliESDtrack::kTPCin){
386 fHistPtTPCITSAll->Fill(pttrack);
388 if(status&AliESDtrack::kITSpureSA){
389 fHistPtITSpureSAAll->Fill(pttrack);
391 fHistPtITSsaAll->Fill(pttrack);
395 if(fReadMC && fUseMCId){
396 Int_t trlabel=track->GetLabel();
398 if(status&AliESDtrack::kTPCin){
399 fHistPtTPCITSGood->Fill(pttrack);
401 if(status&AliESDtrack::kITSpureSA){
402 fHistPtITSpureSAGood->Fill(pttrack);
404 fHistPtITSsaGood->Fill(pttrack);
408 if(status&AliESDtrack::kTPCin){
409 fHistPtTPCITSFake->Fill(pttrack);
411 if(status&AliESDtrack::kITSpureSA){
412 fHistPtITSpureSAFake->Fill(pttrack);
414 fHistPtITSsaFake->Fill(pttrack);
417 continue; // fake track
419 TParticle* part = stack->Particle(trlabel);
420 Int_t pdg=TMath::Abs(part->GetPdgCode());
421 if(pdg==211) hadronSpecie=kPion;
422 else if(pdg==321) hadronSpecie=kKaon;
423 else if(pdg==2212) hadronSpecie=kProton;
425 if(nPointsForPid<fMinITSptsForPid)continue;
426 AliITSPIDResponse pidits(fReadMC);
427 Float_t nSigmaPion=pidits.GetNumberOfSigmas(ptrack,dedx,AliPID::kPion,nPointsForPid,isSA);
428 if(nSigmaPion>-2. && nSigmaPion<2.){
431 Float_t nSigmaKaon=pidits.GetNumberOfSigmas(ptrack,dedx,AliPID::kKaon,nPointsForPid,isSA);
432 if(nSigmaKaon>-2. && nSigmaKaon<2.){
435 Float_t nSigmaProton=pidits.GetNumberOfSigmas(ptrack,dedx,AliPID::kProton,nPointsForPid,isSA);
436 if(nSigmaProton>-2. && nSigmaProton<2.){
437 hadronSpecie=kProton;
442 if(hadronSpecie<0) continue;
443 if(status&AliESDtrack::kTPCin){ // TPC+ITS tracks
444 fHistPtTPCITS[hadronSpecie]->Fill(pttrack);
445 fHistEtaPhiTPCITS[hadronSpecie]->Fill(track->Eta(),track->Phi());
446 fHistNcluTPCITS[hadronSpecie]->Fill(pttrack,nITSclus);
447 fHistCluInLayTPCITS[hadronSpecie]->Fill(-1.);
448 for(Int_t iBit=0; iBit<6; iBit++){
449 if(clumap&(1<<iBit)) fHistCluInLayTPCITS[hadronSpecie]->Fill(pttrack,iBit);
451 }else{ // ITS standalone and pureSA tracks
452 if(status&AliESDtrack::kITSpureSA){
453 Float_t impactXY=-999, impactZ=-999;
454 track->GetImpactParameters(impactXY, impactZ);
455 fHistPtITSpureSA[hadronSpecie]->Fill(pttrack);
456 fHistEtaPhiITSpureSA[hadronSpecie]->Fill(track->Eta(),track->Phi());
457 fHistNcluITSpureSA[hadronSpecie]->Fill(pttrack,nITSclus);
458 fHistd0rphiITSpureSA[hadronSpecie]->Fill(pttrack,impactXY);
459 fHistd0zITSpureSA[hadronSpecie]->Fill(pttrack,impactZ);
460 if(nPointsForPid==3){
461 fHistdedxvsPtITSpureSA3cls->Fill(pttrack,dedx);
462 fHistdedxvsPITSpureSA3cls->Fill(ptrack,dedx);
464 if(nPointsForPid==4){
465 fHistdedxvsPtITSpureSA4cls->Fill(pttrack,dedx);
466 fHistdedxvsPITSpureSA4cls->Fill(ptrack,dedx);
468 fHistCluInLayITSpureSA[hadronSpecie]->Fill(-1.);
470 for(Int_t iBit=0; iBit<6; iBit++){
471 if(clumap&(1<<iBit)){
472 fHistCluInLayITSpureSA[hadronSpecie]->Fill(pttrack,iBit);
473 if(iBit>outerLay) outerLay=iBit;
476 fHistOuterLayITSpureSA[hadronSpecie]->Fill(pttrack,outerLay);
480 Int_t trlabel=track->GetLabel();
481 if(trlabel<0)continue; // fake track
482 TParticle* part = stack->Particle(trlabel);
483 Float_t ptgen=part->Pt();
484 Float_t invpttrack=track->OneOverPt();
486 if(ptgen>0.) invptgen=1./ptgen;
487 fHistMCPtResid[hadronSpecie]->Fill(pttrack,pttrack-ptgen);
488 fHistMCPtRelResid[hadronSpecie]->Fill(pttrack,(pttrack-ptgen)/ptgen);
489 fHistMCInvPtResid[hadronSpecie]->Fill(pttrack,invpttrack-invptgen);
490 fHistMCInvPtRelResid[hadronSpecie]->Fill(pttrack,(invpttrack-invptgen)/invptgen);
493 fHistPtITSsa[hadronSpecie]->Fill(pttrack);
494 fHistEtaPhiITSsa[hadronSpecie]->Fill(track->Eta(),track->Phi());
495 fHistNcluITSsa[hadronSpecie]->Fill(pttrack,nITSclus);
496 fHistCluInLayITSsa[hadronSpecie]->Fill(-1.);
497 for(Int_t iBit=0; iBit<6; iBit++){
498 if(clumap&(1<<iBit)) fHistCluInLayITSsa[hadronSpecie]->Fill(pttrack,iBit);
503 if(nITSclus<fMinITSptsForMatch || nTPCclus<fMinTPCpts) continue;
504 Int_t idxMI[12],idxSA[12];
505 for(Int_t icl=0; icl<12; icl++){
509 Int_t ncls=track->GetClusters(0,idxMI);
512 for(Int_t ilay=0; ilay<6; ilay++){
513 if(fRequirePoint[ilay]){
514 Int_t mask = 1<<ilay;
515 if(!(clumap & mask)){
521 if(!accept) continue;
524 for(Int_t i=0;i<12;i++){
525 for(Int_t j=i+1;j<12;j++){
526 if(idxMI[j]>idxMI[i]){
533 // for(Int_t i=0; i<12; i++) printf("%d ",idxMI[i]);
535 if(idxMI[0]<0 && idxMI[0]==idxMI[1]) continue;
536 Bool_t matched=kFALSE;
537 for (Int_t iTrack2 = 0; iTrack2 < ntracks; iTrack2++) {
539 if(iTrack2==iTrack) continue;
540 AliESDtrack* track2 = esd->GetTrack(iTrack2);
541 Int_t status2=track2->GetStatus();
542 if(!(status2&AliESDtrack::kITSrefit)) continue;
543 if(!(status2&AliESDtrack::kITSpureSA)) continue;
544 Int_t clumap2=track2->GetITSClusterMap();
545 Int_t nITSclus2=track2->GetNcls(0);
546 Int_t nTPCclus2=track2->GetNcls(1);
547 if(nITSclus2<fMinITSpts || nTPCclus2>0) continue;
548 Int_t ncls2=track2->GetClusters(0,idxSA);
549 if(ncls2!=ncls) continue;
552 for(Int_t ilay=0; ilay<6; ilay++){
553 if(fRequirePoint[ilay]){
554 Int_t mask = 1<<ilay;
555 if(!(clumap2 & mask)){
561 if(!accept) continue;
564 for(Int_t i=0;i<12;i++){
565 for(Int_t j=i+1;j<12;j++){
566 if(idxSA[j]>idxSA[i]){
574 for(Int_t icl=0; icl<ncls; icl++){
575 if(idxSA[icl]!=idxMI[icl]){
581 if(match==ncls && match>0){
583 Float_t pt1=track->Pt();
584 Float_t pt2=track2->Pt();
585 Float_t ptm1=track->OneOverPt();
586 Float_t ptm2=track2->OneOverPt();
587 fHistPtResid[hadronSpecie]->Fill(pt1,pt2-pt1);
588 fHistPtRelResid[hadronSpecie]->Fill(pt1,(pt2-pt1)/pt1);
589 fHistInvPtResid[hadronSpecie]->Fill(pt1,ptm2-ptm1);
590 fHistInvPtRelResid[hadronSpecie]->Fill(pt1,(ptm2-ptm1)/ptm1);
598 //______________________________________________________________________________
599 void AliAnalysisTaskITSsaTracks::Terminate(Option_t */*option*/)
601 // Terminate analysis
602 fOutput = dynamic_cast<TList*> (GetOutputData(1));
604 printf("ERROR: fOutput not available\n");
607 fHistNEvents= dynamic_cast<TH1F*>(fOutput->FindObject("hNEvents"));
608 fHistdedxvsPtITSpureSA3cls= dynamic_cast<TH2F*>(fOutput->FindObject("hdedxvsPtITSpureSA3cls%s"));
609 fHistdedxvsPITSpureSA3cls= dynamic_cast<TH2F*>(fOutput->FindObject("hdedxvsPITSpureSA3cls%s"));
610 fHistdedxvsPtITSpureSA4cls= dynamic_cast<TH2F*>(fOutput->FindObject("hdedxvsPtITSpureSA4cls%s"));
611 fHistdedxvsPITSpureSA4cls= dynamic_cast<TH2F*>(fOutput->FindObject("hdedxvsPITSpureSA4cls%s"));
613 TString spname[3]={"Pion","Kaon","Proton"};
615 fHistPtTPCITSAll =dynamic_cast<TH1F*>(fOutput->FindObject("hPtTPCITSAll"));
616 fHistPtTPCITSGood =dynamic_cast<TH1F*>(fOutput->FindObject("hPtTPCITSGood"));
617 fHistPtTPCITSFake =dynamic_cast<TH1F*>(fOutput->FindObject("hPtTPCITSFake"));
619 fHistPtITSsaAll =dynamic_cast<TH1F*>(fOutput->FindObject("hPtITSsaAll"));
620 fHistPtITSsaGood =dynamic_cast<TH1F*>(fOutput->FindObject("hPtITSsaGood"));
621 fHistPtITSsaFake =dynamic_cast<TH1F*>(fOutput->FindObject("hPtITSsaFake"));
623 fHistPtITSpureSAAll =dynamic_cast<TH1F*>(fOutput->FindObject("hPtITSpureSAAll"));
624 fHistPtITSpureSAGood =dynamic_cast<TH1F*>(fOutput->FindObject("hPtITSpureSAGood"));
625 fHistPtITSpureSAFake =dynamic_cast<TH1F*>(fOutput->FindObject("hPtITSpureSAFake"));
627 for(Int_t iSpec=0; iSpec<kNspecies; iSpec++){
628 fHistPtTPCITS[iSpec]= dynamic_cast<TH1F*>(fOutput->FindObject(Form("hPtTPCITS%s",spname[iSpec].Data())));
629 fHistPtITSsa[iSpec]= dynamic_cast<TH1F*>(fOutput->FindObject(Form("hPtITSsa%s",spname[iSpec].Data())));
630 fHistPtITSpureSA[iSpec]= dynamic_cast<TH1F*>(fOutput->FindObject(Form("hPtITSpureSA%s",spname[iSpec].Data())));
632 fHistEtaPhiTPCITS[iSpec]= dynamic_cast<TH2F*>(fOutput->FindObject(Form("hEtaPhiTPCITS%s",spname[iSpec].Data())));
633 fHistEtaPhiITSsa[iSpec]= dynamic_cast<TH2F*>(fOutput->FindObject(Form("hEtaPhiITSsa%s",spname[iSpec].Data())));
634 fHistEtaPhiITSpureSA[iSpec]= dynamic_cast<TH2F*>(fOutput->FindObject(Form("hEtaPhiITSpureSA%s",spname[iSpec].Data())));
636 fHistNcluTPCITS[iSpec]= dynamic_cast<TH2F*>(fOutput->FindObject(Form("hNcluTPCITS%s",spname[iSpec].Data())));
637 fHistNcluITSsa[iSpec]= dynamic_cast<TH2F*>(fOutput->FindObject(Form("hNcluITSsa%s",spname[iSpec].Data())));
638 fHistNcluITSpureSA[iSpec]= dynamic_cast<TH2F*>(fOutput->FindObject(Form("hNcluITSpureSA%s",spname[iSpec].Data())));
640 fHistd0rphiITSpureSA[iSpec]= dynamic_cast<TH2F*>(fOutput->FindObject(Form("hd0rphiITSpureSA%s",spname[iSpec].Data())));
641 fHistd0zITSpureSA[iSpec]= dynamic_cast<TH2F*>(fOutput->FindObject(Form("hd0zITSpureSA%s",spname[iSpec].Data())));
643 fHistCluInLayTPCITS[iSpec]= dynamic_cast<TH2F*>(fOutput->FindObject(Form("hCluInLayTPCITS%s",spname[iSpec].Data())));
644 fHistCluInLayITSsa[iSpec]= dynamic_cast<TH2F*>(fOutput->FindObject(Form("hCluInLayITSsa%s",spname[iSpec].Data())));
645 fHistCluInLayITSpureSA[iSpec]= dynamic_cast<TH2F*>(fOutput->FindObject(Form("hCluInLayITSpureSA%s",spname[iSpec].Data())));
647 fHistOuterLayITSpureSA[iSpec]= dynamic_cast<TH2F*>(fOutput->FindObject(Form("hOuterLayITSpureSA%s",spname[iSpec].Data())));
649 fHistPtResid[iSpec]= dynamic_cast<TH2F*>(fOutput->FindObject(Form("hPtResid%s",spname[iSpec].Data())));
650 fHistPtRelResid[iSpec]= dynamic_cast<TH2F*>(fOutput->FindObject(Form("hPtRelResid%s",spname[iSpec].Data())));
651 fHistInvPtResid[iSpec]= dynamic_cast<TH2F*>(fOutput->FindObject(Form("hInvPtResid%s",spname[iSpec].Data())));
652 fHistInvPtRelResid[iSpec]= dynamic_cast<TH2F*>(fOutput->FindObject(Form("hInvPtRelResid%s",spname[iSpec].Data())));
653 fHistMCPtResid[iSpec]= dynamic_cast<TH2F*>(fOutput->FindObject(Form("hMCPtResid%s",spname[iSpec].Data())));
654 fHistMCPtRelResid[iSpec]= dynamic_cast<TH2F*>(fOutput->FindObject(Form("hMCPtRelResid%s",spname[iSpec].Data())));
655 fHistMCInvPtResid[iSpec]= dynamic_cast<TH2F*>(fOutput->FindObject(Form("hMCInvPtResid%s",spname[iSpec].Data())));
656 fHistMCInvPtRelResid[iSpec]= dynamic_cast<TH2F*>(fOutput->FindObject(Form("hMCInvPtRelResid%s",spname[iSpec].Data())));