11 #include "AliAnalysisTask.h"
12 #include "AliAnalysisManager.h"
13 #include "AliAnalysisTaskSE.h"
14 #include "AliCentrality.h"
16 #include "AliESDEvent.h"
17 #include "AliESDtrackCuts.h"
18 #include "AliESDInputHandler.h"
20 #include "AliAODEvent.h"
21 #include "AliAODTrack.h"
22 #include "AliAODHandler.h"
23 #include "AliAODInputHandler.h"
24 #include "AliAODMCParticle.h"
25 #include "AliAODpidUtil.h"
26 #include "AliAnalysisUtils.h"
28 #include "AliMCEvent.h"
30 #include "AliInputEventHandler.h"
32 #include "AliAnalysisTaskParticleEfficiency.h"
35 ClassImp(AliAnalysisTaskParticleEfficiency)
36 //ClassImp(AliAnalysisTaskParticleEfficiency)
41 //_______________________________________________________
43 AliAnalysisTaskParticleEfficiency::AliAnalysisTaskParticleEfficiency(const Char_t *partName) :
44 AliAnalysisTaskSE(partName), centrality(0), fHistoList(0), fHistEv(0), fpidResponse(0)
47 for(Int_t i = 0; i < MULTBINS*PARTTYPES; i++) {
48 fGeneratedMCPrimaries[i] = NULL;
49 fMCPrimariesThatAreReconstructed[i] = NULL;
50 fReconstructedAfterCuts[i] = NULL;
51 fReconstructedNotPrimaries[i] = NULL;
52 fReconstructedPrimaries[i] = NULL;
53 fContamination[i] = NULL;
55 for ( Int_t i = 0; i < 11; i++) {
57 if(i<3) fHistQA2D[i] = NULL;
61 //fTrackCuts = AliESDtrackCuts::GetStandardITSTPCTrackCuts2010();
62 /*fTrackCuts = AliESDtrackCuts::GetStandardTPCOnlyTrackCuts();
63 if( !fTrackCuts ) return;
64 fTrackCuts->SetMinNClustersTPC(70);*/
68 fHistoList = new TList();
69 fHistoList->SetOwner(kTRUE);
71 DefineInput(0, TChain::Class());
72 // DefineOutput(0, TTree::Class());
73 DefineOutput(1, TList::Class());
78 //_______________________________________________________
80 AliAnalysisTaskParticleEfficiency::~AliAnalysisTaskParticleEfficiency()
82 /* if(centrality) delete centrality;
83 s128 if(fHistoList) delete fHistoList;
84 if(vertex) delete vertex;
85 if(vtxSPD) delete vtxSPD;*/
88 //_______________________________________________________
90 void AliAnalysisTaskParticleEfficiency::UserCreateOutputObjects()
93 TString hname1, hname2, hname3, hname4, hname5;
95 TString htitle1, htitle2, htitle3, htitle4,htitle5;
97 TString hname1M, hname2M, hname3M, hname4M, hname5M, hname;
99 TString htitle1M, htitle2M, htitle3M, htitle4M, htitle5M, htitle;
101 TString parttypename = "None";
103 for(Int_t j = 0; j < PARTTYPES; j++) {
104 if (j==0) parttypename="All";
105 else if (j==1) parttypename="Pion";
106 else if (j==2) parttypename="Kaon";
107 else if (j==3) parttypename="Proton";
109 for(Int_t i = 0; i < MULTBINS; i++) {
110 hname1 = "hGeneratedMCPrimariesEffM"; hname1+=i; hname1+=parttypename;
111 htitle1 = "Kinematic level eta_pT (prim only) M"; htitle1+=i; htitle1+=parttypename;
112 fGeneratedMCPrimaries[i*PARTTYPES+j] = new TH2F(hname1.Data(),htitle1.Data(),50, -1.5, 1.5,1000,0.,10.0);
114 hname3 = "hMCPrimariesThatAreReconstructedM"; hname3+=i; hname3+=parttypename;
115 htitle3 = "Reconstructed level eta_pT (prim only) M"; htitle3+=i; htitle3+=parttypename;
116 fMCPrimariesThatAreReconstructed[i*PARTTYPES+j] = new TH2F(hname3.Data(),htitle3.Data(),50, -1.5, 1.5,1000,0.,10.0);
118 hname2 = "hHistoReconstructedAfterCutsM"; hname2+=i; hname2+=parttypename;
119 htitle2 = "Total Reconstructed tracks M "; htitle2+=i; htitle2+=parttypename;
120 fReconstructedAfterCuts[i*PARTTYPES+j] = new TH2F(hname2.Data(),htitle2.Data(),50, -1.5, 1.5,1000,0.,10.0);
122 hname4 = "hHistoReconstructedNotPrimariesM"; hname4+=i; hname4+=parttypename;
123 htitle4 = "Reconstructed level eta_pT (not primaries) M"; htitle4+=i; htitle4+=parttypename;
124 fReconstructedNotPrimaries[i*PARTTYPES+j] = new TH2F(hname4.Data(),htitle4.Data(),50, -1.5, 1.5,1000,0.,10.0);
126 hname4 = "hHistoReconstructedPrimariesM"; hname4+=i; hname4+=parttypename;
127 htitle4 = "Reconstructed level eta_pT (primaries) M"; htitle4+=i; htitle4+=parttypename;
128 fReconstructedPrimaries[i*PARTTYPES+j] = new TH2F(hname4.Data(),htitle4.Data(),50, -1.5, 1.5,1000,0.,10.0);
130 hname5 = "hContaminationM"; hname5+=i; hname5+=parttypename;
131 htitle5 = "Contamination M"; htitle5+=i; htitle5+=parttypename;
132 fContamination[i*PARTTYPES+j] = new TH2F(hname5.Data(),htitle5.Data(),6000, -3000, 3000.,1000,0.,10.0);
135 fReconstructedAfterCuts[i*PARTTYPES+j]->Sumw2();
136 fReconstructedNotPrimaries[i*PARTTYPES+j]->Sumw2();
137 fReconstructedPrimaries[i*PARTTYPES+j]->Sumw2();
139 hname = "pidTPCdEdx"; hname+=parttypename;
140 htitle = parttypename + " TPC dEdx vs. momentum";
141 fHistQAPID[0][j] = new TH2F(hname, htitle, 100, 0.0, 5.0, 250, 0.0, 500.0);
142 hname = "pidTOFTime"; hname+=parttypename;
143 htitle = parttypename + " TOF Time vs. momentum";
144 fHistQAPID[1][j] = new TH2F(hname, htitle, 100, 0.1, 5.0, 400, -4000.0, 4000.0);
145 hname = "pidTOFNSigma"; hname+=parttypename;
146 htitle = parttypename + " TOF NSigma vs. momentum";
147 fHistQAPID[2][j] = new TH2F(hname,htitle, 100, 0.0, 5.0, 100, -5.0, 5.0);
148 hname = "pidTPCNSigma"; hname+=parttypename;
149 htitle = parttypename + " TPC NSigma vs. momentum";
150 fHistQAPID[3][j] = new TH2F(hname,htitle, 100, 0.0, 5.0, 100, -5.0, 5.0);
151 hname = "pidTPCTOFNSigma"; hname+=parttypename;
152 htitle = parttypename + " TPC vs TOF NSigma";
153 fHistQAPID[4][j] = new TH2F(hname,htitle, 200, -10.0, 10.0, 200, -10.0, 10.0);
157 fHistEv = new TH1F("fHistEv", "Multiplicity", 100, 0, 100);
158 fHistoList->Add(fHistEv);
160 for(Int_t i = 0; i < MULTBINS; i++) {
161 hname = "fHistEventCutsM";
164 fHistEvCuts[i] = new TH1F(hname,Form("Event Cuts M%d",i) , 4, 0, 5);
165 fHistEvCuts[i]->GetXaxis()->SetBinLabel(1,"All");
166 fHistEvCuts[i]->GetXaxis()->SetBinLabel(2,"NoVertex");
167 fHistEvCuts[i]->GetXaxis()->SetBinLabel(3,"PileUp");
168 fHistEvCuts[i]->GetXaxis()->SetBinLabel(4,"z-vertex>10");
169 fHistoList->Add(fHistEvCuts[i]);
172 hname = "hMisidentificationM"; hname+=i;
173 htitle = "Misidentification Fraction M"; htitle+=i;
174 fMisidentification[i] = new TH2F(hname.Data(),htitle.Data(), 3, 0.5, 3.5, 4 , 0, 4);
175 fMisidentification[i]->GetXaxis()->SetBinLabel(1,"Pions, MC");
176 fMisidentification[i]->GetXaxis()->SetBinLabel(2,"Kaons, MC");
177 fMisidentification[i]->GetXaxis()->SetBinLabel(3,"Protons, MC");
178 fMisidentification[i]->GetYaxis()->SetBinLabel(1,"Pions, Data");
179 fMisidentification[i]->GetYaxis()->SetBinLabel(2,"Kaons, Data");
180 fMisidentification[i]->GetYaxis()->SetBinLabel(3,"Protons, Data");
181 fMisidentification[i]->GetYaxis()->SetBinLabel(4,"Other, Data");
182 fHistoList->Add(fMisidentification[i]);
186 fHistQA[0] = new TH1F("fHistVtx", "Z vertex distribution", 100, -15., 15.);
187 fHistQA[1] = new TH1F("fHistnTpcCluster", "n TPC Cluster", 100, 0., 200.);
188 fHistQA[2] = new TH1F("fHistnTpcClusterF", "n TPC Cluster findable", 100, 0., 200.);
189 fHistQA[3] = new TH1F("dcaHistDcaXY1D", "DCA XY", 210, -2.1, 2.1);
190 fHistQA[4] = new TH1F("dcaHistDcaZ1D", "DCA Z", 210, -2.1, 2.1);
191 fHistQA[5] = new TH1F("fHistChi2Tpc", "Chi2 TPC", 100, 0., 8.);
192 fHistQA[6] = new TH1F("fHistpT", "pT distribution",1000,0.,10.0);
193 fHistQA[7] = new TH1F("fHistPhi", "Phi distribution" , 100, -TMath::Pi(), TMath::Pi());
194 fHistQA[8] = new TH1F("fHistEta", "Eta distribution" , 100, -2, 2);
196 fHistQA[9] = new TH1F("fHistEventCuts", "Event Cuts" , 4, 0, 5);
197 fHistQA[9]->GetXaxis()->SetBinLabel(1,"All");
198 fHistQA[9]->GetXaxis()->SetBinLabel(2,"NoVertex");
199 fHistQA[9]->GetXaxis()->SetBinLabel(3,"PileUp");
200 fHistQA[9]->GetXaxis()->SetBinLabel(4,"z-vertex>10");
203 fHistQA[10] = new TH1F("fHistTrackCuts", "Track Cuts" , 7, 0.5, 7.5);
204 fHistQA[10]->GetXaxis()->SetBinLabel(1,"AllTracksInEvents");
205 fHistQA[10]->GetXaxis()->SetBinLabel(2,"GetTrack");
206 fHistQA[10]->GetXaxis()->SetBinLabel(3,"Filter bit");
207 fHistQA[10]->GetXaxis()->SetBinLabel(4,"Eta");
208 fHistQA[10]->GetXaxis()->SetBinLabel(5,"Pt");
209 fHistQA[10]->GetXaxis()->SetBinLabel(6,"DCA");
210 fHistQA[10]->GetXaxis()->SetBinLabel(7,"Electron Rejection");
212 fHistQA2D[0] = new TH2F("dcaHistDcaXY","DCA XY",50, 0, 5,210, -2.1, 2.1);
213 fHistQA2D[1] = new TH2F("dcaHistDcaZ","DCA Z", 50, 0, 5, 210, -2.1, 2.1);
214 fHistQA2D[2] = new TH2F("fPhiEta","Eta-Phi",100, -2, 2, 100, -TMath::Pi(), TMath::Pi());
218 for ( Int_t i = 0; i < 11; i++)
220 fHistoList->Add(fHistQA[i]);
221 if(i<3) fHistoList->Add(fHistQA2D[i]);
223 for(Int_t j = 0 ; j<PARTTYPES; j++)
224 fHistoList->Add(fHistQAPID[i][j]);
228 for (Int_t i = 0; i < MULTBINS*PARTTYPES; i++){
229 fHistoList->Add(fGeneratedMCPrimaries[i]);
230 fHistoList->Add(fMCPrimariesThatAreReconstructed[i]);
231 fHistoList->Add(fReconstructedAfterCuts[i]);
232 fHistoList->Add(fReconstructedNotPrimaries[i]);
233 fHistoList->Add(fReconstructedPrimaries[i]);
234 fHistoList->Add(fContamination[i]);
238 //********** PID ****************
240 AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
241 AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
242 fpidResponse = inputHandler->GetPIDResponse();
243 cout<<"*******"<< fpidResponse<<endl;
245 // ************************
247 PostData(1, fHistoList);
251 //_____________________________________________________________________
253 bool IsPionNSigma(float mom, float nsigmaTPCPi, float nsigmaTOFPi)
257 if (TMath::Hypot( nsigmaTOFPi, nsigmaTPCPi ) < 3)
261 if (TMath::Abs(nsigmaTPCPi) < 3)
267 if(nsigmaTOFPi<-999.)
269 if(mom<0.35 && TMath::Abs(nsigmaTPCPi)<3.0) return true;
270 else if(mom<0.5 && mom>=0.35 && TMath::Abs(nsigmaTPCPi)<3.0) return true;
271 else if(mom>=0.5 && TMath::Abs(nsigmaTPCPi)<2.0) return true;
274 else if(TMath::Abs(nsigmaTOFPi)<3.0 && TMath::Abs(nsigmaTPCPi)<3.0) return true;
276 else if(nsigmaTOFPi<-999.)
280 else if(mom<1.5 && TMath::Abs(nsigmaTOFPi)<3.0 && TMath::Abs(nsigmaTPCPi)<5.0) return true;
281 else if(mom>=1.5 && TMath::Abs(nsigmaTOFPi)<2.0 && TMath::Abs(nsigmaTPCPi)<5.0) return true;
286 bool IsKaonNSigma(float mom, float nsigmaTPCK, float nsigmaTOFK)
289 if (TMath::Hypot( nsigmaTOFK, nsigmaTPCK ) < 3)
293 if (TMath::Abs(nsigmaTPCK) < 3)
301 if(TMath::Abs(nsigmaTPCK)<2.0) return true;
303 else if(TMath::Abs(nsigmaTOFK)<3.0 && TMath::Abs(nsigmaTPCK)<3.0) return true;
305 else if(mom>=0.4 && mom<=0.6)
309 if(TMath::Abs(nsigmaTPCK)<2.0) return true;
311 else if(TMath::Abs(nsigmaTOFK)<3.0 && TMath::Abs(nsigmaTPCK)<3.0) return true;
313 else if(nsigmaTOFK<-999.)
317 else if(TMath::Abs(nsigmaTOFK)<3.0 && TMath::Abs(nsigmaTPCK)<3.0) return true;
322 bool IsProtonNSigma(float mom, float nsigmaTPCP, float nsigmaTOFP)
326 if (TMath::Hypot( nsigmaTOFP, nsigmaTPCP ) < 3)
330 if (TMath::Abs(nsigmaTPCP) < 3)
334 // if (mom > 0.8 && mom < 2.5) {
335 // if ( TMath::Abs(nsigmaTPCP) < 3.0 && TMath::Abs(nsigmaTOFP) < 3.0)
338 // else if (mom > 2.5) {
339 // if ( TMath::Abs(nsigmaTPCP) < 3.0 && TMath::Abs(nsigmaTOFP) < 2.0)
343 // if (TMath::Abs(nsigmaTPCP) < 3.0)
352 bool IsElectron(float nsigmaTPCE, float nsigmaTPCPi,float nsigmaTPCK, float nsigmaTPCP)
354 if(TMath::Abs(nsigmaTPCE)<3 && TMath::Abs(nsigmaTPCPi)>3 && TMath::Abs(nsigmaTPCK)>3 && TMath::Abs(nsigmaTPCP)>3)
360 //_______________________________________________________
362 void AliAnalysisTaskParticleEfficiency::UserExec(Option_t *)
366 //AliESDEvent *esdEvent = dynamic_cast<AliESDEvent *>(InputEvent());
367 AliAODEvent* aodEvent = dynamic_cast<AliAODEvent*>(InputEvent());
368 if (!aodEvent) return;
369 AliAODHeader *fAODheader = dynamic_cast<AliAODHeader*>(aodEvent->GetHeader());
370 if(!fAODheader) AliFatal("Not a standard AOD");
371 Double_t mult = fAODheader->GetRefMultiplicity();
372 // AliCentrality* alicent= aodEvent->GetCentrality(); //in PbPb and pPb
373 // Double_t mult = alicent->GetCentralityPercentile("V0A"); //in pPb
374 // Double_t mult = alicent->GetCentralityPercentile("V0A"); //in PbPb
380 // arrayMC = (TClonesArray*)aodEvent->GetList()->FindObject(AliAODMCParticle::StdBranchName());
382 // printf("AliAnalysisTaskParticleEficiency::UserExec: MC particles branch not found!\n");
387 //mcHeader = (AliAODMCHeader*)aod->GetList()->FindObject(AliAODMCHeader::StdBranchName());
389 //printf("AliAnalysisTaskSEDplusCorrelations::UserExec: MC header branch not found!\n");
392 //*********************
396 // EVENT SELECTION ********************
400 // collision candidate
401 // if (!(((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kMB)) return;
404 //****** Multiplicity selection *********
406 //if(mult >= 0 && mult <=20) fcent = 0;
407 //else if(mult >= 20 && mult <=39) fcent = 1;
408 //else if(mult >= 40 && mult <=59) fcent = 2;
409 //else if(mult >= 60 && mult <=90) fcent = 3;
410 //else if(mult >= 99990 && mult <=99936) fcent = 4;
411 //else if(mult >= 999937 && mult <=99944) fcent = 5;
412 //else if(mult >= 999945 && mult <=99957) fcent = 6;
413 //else if(mult >= 999958 && mult <=99149) fcent = 6;
415 //if (fcent == 7) return;
417 if(mult >= 2&& mult <=150) fcent = 0;
418 else if(mult >= 2 && mult <=19) fcent = 1;
419 else if(mult >= 20 && mult <=49) fcent = 2;
420 else if(mult >= 50 && mult <=150) fcent = 3;
423 if(fcent==0)fHistEvCuts[0]->Fill(1);
424 else if(fcent==1)fHistEvCuts[1]->Fill(1);
425 else if(fcent==2)fHistEvCuts[2]->Fill(1);
426 else if(fcent==3)fHistEvCuts[3]->Fill(1);
428 //"ESDs/pass2/AOD049/*AliAOD.root");
429 const AliAODVertex* vertex =(AliAODVertex*) aodEvent->GetPrimaryVertex();
430 if (!vertex || vertex->GetNContributors()<=0) return;
433 if(fcent==0)fHistEvCuts[0]->Fill(2);
434 else if(fcent==1)fHistEvCuts[1]->Fill(2);
435 else if(fcent==2)fHistEvCuts[2]->Fill(2);
436 else if(fcent==3)fHistEvCuts[3]->Fill(2);
438 AliAnalysisUtils *anaUtil=new AliAnalysisUtils();
440 Bool_t fpA2013 = kFALSE;
441 Bool_t fMVPlp = kFALSE;
442 Bool_t fisPileUp = kTRUE;
443 Int_t fMinPlpContribMV = 0;
444 Int_t fMinPlpContribSPD = 3;
447 if(anaUtil->IsVertexSelected2013pA(aodEvent)==kFALSE) return;
449 if(fMVPlp) anaUtil->SetUseMVPlpSelection(kTRUE);
450 else anaUtil->SetUseMVPlpSelection(kFALSE);
452 if(fMinPlpContribMV) anaUtil->SetMinPlpContribMV(fMinPlpContribMV);
453 if(fMinPlpContribSPD) anaUtil->SetMinPlpContribSPD(fMinPlpContribSPD);
456 if(anaUtil->IsPileUpEvent(aodEvent)) return;
461 if(fcent==0)fHistEvCuts[0]->Fill(3);
462 else if(fcent==1)fHistEvCuts[1]->Fill(3);
463 else if(fcent==2)fHistEvCuts[2]->Fill(3);
464 else if(fcent==3)fHistEvCuts[3]->Fill(3);
466 //TString vtxTtl = vertex->GetTitle();
467 //if (!vtxTtl.Contains("VertexerTracks")) return;
468 Float_t zvtx = vertex->GetZ();
469 if (TMath::Abs(zvtx) > 10) return;
470 fHistQA[0]->Fill(zvtx);
472 if(fcent==0)fHistEvCuts[0]->Fill(4);
473 else if(fcent==1)fHistEvCuts[1]->Fill(4);
474 else if(fcent==2)fHistEvCuts[2]->Fill(4);
475 else if(fcent==3)fHistEvCuts[3]->Fill(4);
477 //**** getting MC array ******
478 TClonesArray *arrayMC;
480 arrayMC = dynamic_cast<TClonesArray*>(aodEvent->FindListObject(AliAODMCParticle::StdBranchName()));
484 //AliStack *mcStack = mcEvent->Stack();
485 //if (!mcStack) return;
486 //***********************
489 // old vertex selection
490 /*const AliESDVertex *vertex = esdEvent->GetPrimaryVertex();
491 if (vertex->GetNContributors() < 1) return;
494 if (TMath::Abs(vertex->GetZ()) > 10.) return;
497 const AliESDVertex *vtxSPD = esdEvent->GetPrimaryVertexSPD();*/
498 // Double_t zVertex = vtxSPD->GetZ();
500 //cout << "Event Z vtx ==========> " << vertex->GetZ() <<endl;
501 // centrality selection
502 //AliCentrality *centrality = aodEvent->GetHeader()->GetCentralityP();
503 //if (centrality->GetQuality() != 0) return;
504 //Double_t cent = centrality->GetCentralityPercentileUnchecked("V0M");
505 //if(cent < 0 || cent > 100.) return;
508 //copying pid information for FB 128
510 for (int il=0; il<20000; il++) labels[il] = -1;
512 // looking for global tracks and saving their numbers to copy from them PID information to TPC-only tracks in the main loop over tracks
513 for (int i=0;i<aodEvent->GetNumberOfTracks();i++) {
514 const AliAODTrack *aodtrack=aodEvent->GetTrack(i);
515 if (!aodtrack->TestFilterBit(128)) {
516 if(aodtrack->GetID() < 0) continue;
517 labels[aodtrack->GetID()] = i;
521 //RECONSTRUCTED TRACKS
523 TObjArray recoParticleArray[PARTTYPES];
525 fHistQA[10]->Fill(1,aodEvent->GetNumberOfTracks());
526 //loop over AOD tracks
527 for (Int_t iTracks = 0; iTracks < aodEvent->GetNumberOfTracks(); iTracks++) {
530 //AliESDtrack* track = AliESDtrackCuts::GetTPCOnlyTrack(const_cast<AliESDEvent*>(esdEvent),iTracks);
531 AliAODTrack *track = aodEvent->GetTrack(iTracks);
533 fHistQA[10]->Fill(2);
535 //UInt_t filterBit = (1 << (0));
536 UInt_t filterBit = 96;
537 if(!track->TestFilterBit(filterBit))continue;
539 //if(!track->IsHybridGlobalConstrainedGlobal())continue;
540 //if((track->IsHybridGlobalConstrainedGlobal())==false)continue;
541 // if(!track->IsHybridTPCConstrainedGlobal())continue;
542 // if(!track->IsTPCConstrained())continue;
543 //if(!track->IsGlobalConstrained())continue;
544 //if((track->TestFilterMask(AliAODTrack::kTrkTPCOnly)==false))continue;//cut0_BIT(0)
546 // if((track->IsHybridGlobalConstrainedGlobal())==false)
547 // continue;//def_BIT(272)
549 //if((track->TestFilterMask(AliAODTrack::kTrkGlobal)==false))continue;//cut1_BIT(5)
551 fHistQA[10]->Fill(3);
553 if(track->Eta() < -0.8 || track->Eta() > 0.8)
555 fHistQA[10]->Fill(4);
557 if (track->Pt() < 0.2 || track->Pt() > 20)
559 fHistQA[10]->Fill(5);
562 // if(track->Chi2perNDF() > 4.0) continue;
563 // if(track->GetTPCNcls() < 70) continue;
569 // if(filterBit==(1 << (7))){
570 DCAXY = -TMath::Abs(track->DCA());
571 DCAZ = -TMath::Abs(track->ZAtDCA());
573 if(!(DCAXY==-999 || DCAZ==-999)){
574 //if(TMath::Abs(DCAXY) > 0.0182 + 0.035*TMath::Power(track->Pt(), -1.01)) continue; //XY, Pt dep
576 //if(TMath::Abs(DCAXY) > 1000.0) {continue;} //XY
577 //if(TMath::Abs(DCAZ) > 1000.0) {continue;} //Z
580 // code from Michael and Prabhat from AliAnalysisTaskDptDptCorrelations
581 // const AliAODVertex* vertex = (AliAODVertex*) aodEvent->GetPrimaryVertex(); (already defined above)
582 float vertexX = -999.;
583 float vertexY = -999.;
584 float vertexZ = -999.;
588 vertex->GetCovarianceMatrix(fCov);
589 if(vertex->GetNContributors() > 0) {
591 vertexX = vertex->GetX();
592 vertexY = vertex->GetY();
593 vertexZ = vertex->GetZ();
602 Double_t DCAX = pos[0] - vertexX;
603 Double_t DCAY = pos[1] - vertexY;
604 DCAZ = pos[2] - vertexZ;
605 DCAXY = TMath::Sqrt((DCAX*DCAX) + (DCAY*DCAY));
607 //if(TMath::Abs(DCAXY) > 0.0182 + 0.035*TMath::Power(track->Pt(), -1.01)) continue; //XY, Pt dep
608 //if(TMath::Abs(impactD) > 0.44 + 0.07*TMath::Power(tPt, -1.94)) continue; //XY, Pt dep
610 //if(TMath::Abs(DCAXY) > 1000.0) continue;
611 //if(TMath::Abs(DCAZ) > 1000.0) continue;
614 fHistQA[10]->Fill(6);
616 AliAODTrack* aodtrackpid;
618 //for FB 128 - tpc only tracks
619 if(filterBit==(1 << (7)))
620 aodtrackpid = aodEvent->GetTrack(labels[-1-aodEvent->GetTrack(iTracks)->GetID()]);
625 //PANOS--------------------------
627 AliMCEvent* mcEvent = MCEvent();
629 AliError("ERROR: Could not retrieve MC event");
633 Int_t nMCParticles = mcEvent->GetNumberOfTracks();
634 Int_t labelp = TMath::Abs(track->GetLabel());
635 if(labelp > nMCParticles) continue;
637 AliAODMCParticle *AODmcTrack = (AliAODMCParticle*) mcEvent->GetTrack(labelp);
640 //contamination from secondaries without electron rejection
641 if (!AODmcTrack->IsPhysicalPrimary()) {
642 fReconstructedNotPrimaries[PARTTYPES*fcent]->Fill(track->Eta(), track->Pt());
645 fReconstructedPrimaries[PARTTYPES*fcent]->Fill(track->Eta(), track->Pt());
648 //-------------------------
651 double nSigmaTPCPi = fpidResponse->NumberOfSigmasTPC(aodtrackpid,AliPID::kPion);
652 double nSigmaTPCK = fpidResponse->NumberOfSigmasTPC(aodtrackpid,AliPID::kKaon);
653 double nSigmaTPCP = fpidResponse->NumberOfSigmasTPC(aodtrackpid,AliPID::kProton);
654 double nSigmaTPCe = fpidResponse->NumberOfSigmasTPC(aodtrackpid,AliPID::kElectron);
655 if(IsElectron(nSigmaTPCe,nSigmaTPCPi,nSigmaTPCK,nSigmaTPCP))
657 fHistQA[10]->Fill(7);
659 fHistQA[1]->Fill(track->GetTPCClusterInfo(2,1));
660 //fHistQA[2]->Fill(track->GetTPCNclsF());
661 fHistQA[3]->Fill(DCAXY);
662 fHistQA[4]->Fill(DCAZ);
663 Float_t chi2Tpc = track->Chi2perNDF();
664 fHistQA[5]->Fill(chi2Tpc);
665 fHistQA[6]->Fill(track->Pt());
667 float px=track->Px(); float py=track->Py(); float ph=atan2(py,px); //track->Phi()
668 float tPt = track->Pt();
670 fHistQA[7]->Fill(ph);
671 fHistQA[8]->Fill(track->Eta());
672 fHistQA2D[2]->Fill(track->Eta(),ph);
674 fHistQA2D[0]->Fill(tPt,DCAXY);
675 fHistQA2D[1]->Fill(tPt,DCAZ);
679 //contamination from secondaries with electron rejection
680 // if (!AODmcTrack->IsPhysicalPrimary()) {
681 // fReconstructedNotPrimaries[PARTTYPES*fcent]->Fill(track->Eta(), track->Pt());
684 // fReconstructedPrimaries[PARTTYPES*fcent]->Fill(track->Eta(), track->Pt());
689 double nSigmaTOFPi = fpidResponse->NumberOfSigmasTOF(aodtrackpid,AliPID::kPion);
690 double nSigmaTOFK = fpidResponse->NumberOfSigmasTOF(aodtrackpid,AliPID::kKaon);
691 double nSigmaTOFP = fpidResponse->NumberOfSigmasTOF(aodtrackpid,AliPID::kProton);
693 float tdEdx = aodtrackpid->GetTPCsignal();
694 float tTofSig = aodtrackpid->GetTOFsignal();
695 double pidTime[5]; aodtrackpid->GetIntegratedTimes(pidTime);
698 fHistQAPID[0][0]->Fill(tPt,tdEdx);
699 fHistQAPID[1][0]->Fill(tPt,tTofSig-pidTime[2]);//pion
700 fHistQAPID[2][0]->Fill(tPt,nSigmaTOFPi);
701 fHistQAPID[3][0]->Fill(tPt,nSigmaTPCPi);
702 fHistQAPID[4][0]->Fill(nSigmaTPCPi,nSigmaTOFPi);
704 if (IsPionNSigma(track->P(),nSigmaTPCPi, nSigmaTOFPi)){
705 fHistQAPID[0][1]->Fill(tPt,tdEdx);
706 fHistQAPID[1][1]->Fill(tPt,tTofSig-pidTime[2]);//pion
707 fHistQAPID[2][1]->Fill(tPt,nSigmaTOFPi);
708 fHistQAPID[3][1]->Fill(tPt,nSigmaTPCPi);
709 fHistQAPID[4][1]->Fill(nSigmaTPCPi,nSigmaTOFPi);
711 if (IsKaonNSigma(track->P(),nSigmaTPCK, nSigmaTOFK)){
712 fHistQAPID[0][2]->Fill(tPt,tdEdx);
713 fHistQAPID[1][2]->Fill(tPt,tTofSig-pidTime[3]);//kaon
714 fHistQAPID[2][2]->Fill(tPt,nSigmaTOFK);
715 fHistQAPID[3][2]->Fill(tPt,nSigmaTPCK);
716 fHistQAPID[4][2]->Fill(nSigmaTPCK,nSigmaTOFK);
718 if (IsProtonNSigma(track->P(),nSigmaTPCP, nSigmaTOFP)){
719 fHistQAPID[0][3]->Fill(tPt,tdEdx);
720 fHistQAPID[1][3]->Fill(tPt,tTofSig-pidTime[4]);//proton
721 fHistQAPID[2][3]->Fill(tPt,nSigmaTOFP);
722 fHistQAPID[3][3]->Fill(tPt,nSigmaTPCP);
723 fHistQAPID[4][3]->Fill(nSigmaTPCP,nSigmaTOFP);
726 fReconstructedAfterCuts[fcent]->Fill(track->Eta(), track->Pt());//Fills hist. for all reconstructed particles after cuts
731 //get coresponding MC particle
732 Int_t label = TMath::Abs(track->GetLabel());
733 AliAODMCParticle *MCtrk = (AliAODMCParticle*)arrayMC->At(label);
735 //getting no. of tracks for each particle species after all the cuts:
737 //********* PID - pions ********
738 if (IsPionNSigma(track->P(),nSigmaTPCPi, nSigmaTOFPi)){
739 fReconstructedAfterCuts[PARTTYPES*fcent+1]->Fill(track->Eta(), track->Pt());
740 if (!MCtrk) continue;
741 recoParticleArray[1].Add(MCtrk);
743 //Fills for all identified pions found after cuts (reconstructed) - numerator for Efficiency
745 //********* PID - kaons ********
746 if (IsKaonNSigma(track->P(),nSigmaTPCK, nSigmaTOFK)){
747 fReconstructedAfterCuts[PARTTYPES*fcent+2]->Fill(track->Eta(), track->Pt());
748 if (!MCtrk) continue;
749 recoParticleArray[2].Add(MCtrk);
751 //Fills for all identified kaons found after cuts (reconstructed) - numerator for Efficiency
753 //********* PID - protons ********
754 if (IsProtonNSigma(track->P(),nSigmaTPCP, nSigmaTOFP)){
755 fReconstructedAfterCuts[PARTTYPES*fcent+3]->Fill(track->Eta(), track->Pt());
756 if (!MCtrk) continue;
757 recoParticleArray[3].Add(MCtrk);
760 //Fills for all identified protos found after cuts (reconstructed) - numerator for Efficiency
761 //******************************
763 //get coresponding MC particle
764 // Int_t label = TMath::Abs(track->GetLabel()); //moved up
765 // if(!label) cout<<"no label"<<endl;
766 //if(label) cout<<"label = "<<label<<endl;
768 //AliAODMCParticle *MCtrk = (AliAODMCParticle*)arrayMC->At(label); //moved up
769 if (!MCtrk) continue;
770 if(MCtrk->Charge()==0){cout<<"!!!"<<endl; continue;}
771 recoParticleArray[0].Add(MCtrk);
774 //Fills histogram for particles that are contamination from secondaries:
775 if (!AODmcTrack->IsPhysicalPrimary()) {
776 fReconstructedNotPrimaries[PARTTYPES*fcent]->Fill(track->Eta(), track->Pt());
779 fReconstructedPrimaries[PARTTYPES*fcent]->Fill(track->Eta(), track->Pt());
782 int PDGcode = MCtrk->GetPdgCode();
784 //And secondaries for different particle species:
785 if (!AODmcTrack->IsPhysicalPrimary() && (IsPionNSigma(track->P(),nSigmaTPCPi, nSigmaTOFPi) && PDGcode==211)) { //secondaries in pions
786 fReconstructedNotPrimaries[PARTTYPES*fcent+1]->Fill(track->Eta(), track->Pt());
788 else if(AODmcTrack->IsPhysicalPrimary() && (IsPionNSigma(track->P(),nSigmaTPCPi, nSigmaTOFPi) && PDGcode==211)) {
789 fReconstructedPrimaries[PARTTYPES*fcent+1]->Fill(track->Eta(), track->Pt());
792 if (!AODmcTrack->IsPhysicalPrimary() && (IsKaonNSigma(track->P(),nSigmaTPCK, nSigmaTOFK) && PDGcode==321)) { //secondaries in kaons
793 fReconstructedNotPrimaries[PARTTYPES*fcent+2]->Fill(track->Eta(), track->Pt());
795 else if(AODmcTrack->IsPhysicalPrimary() && (IsKaonNSigma(track->P(),nSigmaTPCK, nSigmaTOFK) && PDGcode==321)) {
796 fReconstructedPrimaries[PARTTYPES*fcent+2]->Fill(track->Eta(), track->Pt());
799 if (!AODmcTrack->IsPhysicalPrimary() && (IsProtonNSigma(track->P(),nSigmaTPCP, nSigmaTOFP) && PDGcode==2212)) { //secondaries in protons
800 fReconstructedNotPrimaries[PARTTYPES*fcent+3]->Fill(track->Eta(), track->Pt());
802 else if(AODmcTrack->IsPhysicalPrimary() && (IsProtonNSigma(track->P(),nSigmaTPCP, nSigmaTOFP) && PDGcode==2212)) {
803 fReconstructedPrimaries[PARTTYPES*fcent+3]->Fill(track->Eta(), track->Pt());
806 //Misidentification fraction
809 if(IsPionNSigma(track->P(),nSigmaTPCPi, nSigmaTOFPi))
810 fMisidentification[fcent]-> Fill(1,0.5);
811 if(IsKaonNSigma(track->P(),nSigmaTPCK, nSigmaTOFK))
812 fMisidentification[fcent]-> Fill(1,1.5);
813 if(IsProtonNSigma(track->P(),nSigmaTPCP, nSigmaTOFP))
814 fMisidentification[fcent]-> Fill(1,2.5);
815 if(!IsPionNSigma(track->P(),nSigmaTPCPi, nSigmaTOFPi) && !IsKaonNSigma(track->P(),nSigmaTPCK, nSigmaTOFK) && !IsProtonNSigma(track->P(),nSigmaTPCP, nSigmaTOFP))
816 fMisidentification[fcent]-> Fill(1,3.5);
820 else if(PDGcode==321)
822 if(IsPionNSigma(track->P(),nSigmaTPCPi, nSigmaTOFPi))
823 fMisidentification[fcent]-> Fill(2,0.5);
824 if(IsKaonNSigma(track->P(),nSigmaTPCK, nSigmaTOFK))
825 fMisidentification[fcent]-> Fill(2,1.5);
826 if(IsProtonNSigma(track->P(),nSigmaTPCP, nSigmaTOFP))
827 fMisidentification[fcent]-> Fill(2,2.5);
828 if(!IsPionNSigma(track->P(),nSigmaTPCPi, nSigmaTOFPi) && !IsKaonNSigma(track->P(),nSigmaTPCK, nSigmaTOFK) && !IsProtonNSigma(track->P(),nSigmaTPCP, nSigmaTOFP))
829 fMisidentification[fcent]-> Fill(2,3.5);
833 else if(PDGcode == 2212)
835 if(IsPionNSigma(track->P(),nSigmaTPCPi, nSigmaTOFPi))
836 fMisidentification[fcent]-> Fill(3,0.5);
837 if(IsKaonNSigma(track->P(),nSigmaTPCK, nSigmaTOFK))
838 fMisidentification[fcent]-> Fill(3,1.5);
839 if(IsProtonNSigma(track->P(),nSigmaTPCP, nSigmaTOFP))
841 fMisidentification[fcent]-> Fill(3,2.5);
843 if(!IsPionNSigma(track->P(),nSigmaTPCPi, nSigmaTOFPi) && !IsKaonNSigma(track->P(),nSigmaTPCK, nSigmaTOFK) && !IsProtonNSigma(track->P(),nSigmaTPCP, nSigmaTOFP))
844 fMisidentification[fcent]-> Fill(3,3.5);
848 //Contaminations: "how many pions are in the kaons sample"? etc.
849 //Do not use for corrections: using those values will be dependant on i.e. Pi/K ratio in MC
850 //Use misidentification fraction instead
851 if(IsPionNSigma(track->P(),nSigmaTPCPi, nSigmaTOFPi))
853 fContamination[PARTTYPES*fcent+1]-> Fill(PDGcode,track->Pt()); // filling contamination histogram for pions
855 if(IsKaonNSigma(track->P(),nSigmaTPCK, nSigmaTOFK))
857 fContamination[PARTTYPES*fcent+2]-> Fill(PDGcode,track->Pt()); // filling contamination histogram for kaons
859 if(IsProtonNSigma(track->P(),nSigmaTPCP, nSigmaTOFP))
861 fContamination[PARTTYPES*fcent+3]-> Fill(PDGcode,track->Pt()); // filling contamination histogram for protons
869 // MONTECARLO PARTICLES
871 AliError("Array of MC particles not found");
874 // loop over MC stack
875 for (Int_t ipart = 0; ipart < arrayMC->GetEntries(); ipart++) {
876 //cout<<"Entered MC loop"<<endl;
878 AliAODMCParticle *MCtrk = (AliAODMCParticle*)arrayMC->At(ipart);
880 if (!MCtrk) continue;
881 //cout<<"particle obtained"<<endl;
883 Int_t PDGcode = TMath::Abs(MCtrk->GetPdgCode());
886 if(MCtrk->Charge() == 0) continue;
888 //*** PID - check if pion ***
889 //if(PDGcode!=211) continue; //(PDGcode==11 || PDGcode==321 || PDGcode==2212 || PDGcode==13)
891 if(MCtrk->Eta() < -0.8 || MCtrk->Eta() > 0.8){
894 if (MCtrk->Pt() < 0.2 || MCtrk->Pt() > 20){
897 // check physical primary
898 if (MCtrk->IsPhysicalPrimary()){
900 // Filling histograms for MC truth particles
901 fGeneratedMCPrimaries[fcent*PARTTYPES]->Fill(MCtrk->Eta(), MCtrk->Pt());
903 fGeneratedMCPrimaries[fcent*PARTTYPES+1]->Fill(MCtrk->Eta(), MCtrk->Pt());
904 else if(PDGcode==321)
905 fGeneratedMCPrimaries[fcent*PARTTYPES+2]->Fill(MCtrk->Eta(), MCtrk->Pt());
906 else if(PDGcode==2212)
907 fGeneratedMCPrimaries[fcent*PARTTYPES+3]->Fill(MCtrk->Eta(), MCtrk->Pt());
909 //Filling data from MC truth particles only for particles that were reconstruced
910 if (recoParticleArray[0].Contains(MCtrk)){ //All
911 fMCPrimariesThatAreReconstructed[fcent*PARTTYPES]->Fill(MCtrk->Eta(), MCtrk->Pt());
913 if (recoParticleArray[1].Contains(MCtrk)){ //Pions
915 fMCPrimariesThatAreReconstructed[fcent*PARTTYPES+1]->Fill(MCtrk->Eta(), MCtrk->Pt());
917 if (recoParticleArray[2].Contains(MCtrk)){ //Kaons
919 fMCPrimariesThatAreReconstructed[fcent*PARTTYPES+2]->Fill(MCtrk->Eta(), MCtrk->Pt());
921 if (recoParticleArray[3].Contains(MCtrk)){ //Protons
923 fMCPrimariesThatAreReconstructed[fcent*PARTTYPES+3]->Fill(MCtrk->Eta(), MCtrk->Pt());
929 PostData(1, fHistoList);
931 //-----------------------------------------------------------------
933 //void AliAnalysisTaskParticleEfficiency::Terminate(Option_t *)