]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGCF/FEMTOSCOPY/AliFemtoUser/AliAnalysisTaskParticleEfficiency.cxx
AliAODEvent::GetHeader() returns AliVHeader
[u/mrichter/AliRoot.git] / PWGCF / FEMTOSCOPY / AliFemtoUser / AliAnalysisTaskParticleEfficiency.cxx
1 #include "TChain.h"
2 #include "TTree.h"
3 #include "TH1F.h"
4 #include "TH2F.h"
5 #include "TCanvas.h"
6 #include "TList.h"
7 #include "TObjArray.h"
8 #include "TString.h"
9 #include "TParticle.h"
10
11 #include "AliAnalysisTask.h"
12 #include "AliAnalysisManager.h"
13 #include "AliAnalysisTaskSE.h"
14 #include "AliCentrality.h"
15
16 #include "AliESDEvent.h"
17 #include "AliESDtrackCuts.h"
18 #include "AliESDInputHandler.h"
19
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"
27
28 #include "AliMCEvent.h"
29 #include "AliStack.h"
30 #include "AliInputEventHandler.h"
31
32 #include "AliAnalysisTaskParticleEfficiency.h"
33
34
35 ClassImp(AliAnalysisTaskParticleEfficiency)
36 //ClassImp(AliAnalysisTaskParticleEfficiency)
37
38 using std::cout;
39 using std::endl;
40
41 //_______________________________________________________
42
43 AliAnalysisTaskParticleEfficiency::AliAnalysisTaskParticleEfficiency(const Char_t *partName) :
44 AliAnalysisTaskSE(partName), centrality(0), fHistoList(0),  fHistEv(0), fpidResponse(0)
45 {
46
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;
54   }
55   for ( Int_t i = 0; i < 11; i++) { 
56     fHistQA[i] = NULL;
57     if(i<3) fHistQA2D[i] = NULL;
58   }
59   
60   /* init track cuts */
61   //fTrackCuts = AliESDtrackCuts::GetStandardITSTPCTrackCuts2010();
62   /*fTrackCuts =  AliESDtrackCuts::GetStandardTPCOnlyTrackCuts();
63     if( !fTrackCuts ) return;
64     fTrackCuts->SetMinNClustersTPC(70);*/
65   
66   
67   /* create output */
68   fHistoList = new TList();
69   fHistoList->SetOwner(kTRUE);
70
71   DefineInput(0, TChain::Class());
72   // DefineOutput(0, TTree::Class()); 
73   DefineOutput(1, TList::Class());
74
75  
76 }
77
78 //_______________________________________________________
79
80 AliAnalysisTaskParticleEfficiency::~AliAnalysisTaskParticleEfficiency()
81 {
82   /* if(centrality) delete centrality;
83 s128     if(fHistoList) delete fHistoList;
84      if(vertex) delete vertex;
85      if(vtxSPD) delete vtxSPD;*/
86 }
87
88 //_______________________________________________________
89
90 void AliAnalysisTaskParticleEfficiency::UserCreateOutputObjects()
91 {
92    
93   TString hname1, hname2, hname3, hname4, hname5;
94   
95   TString htitle1, htitle2, htitle3, htitle4,htitle5;
96   
97   TString hname1M, hname2M, hname3M, hname4M, hname5M, hname;
98   
99   TString htitle1M, htitle2M, htitle3M, htitle4M, htitle5M, htitle;
100
101   TString parttypename = "None";
102
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";
108
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);
113     
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);
117     
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);
121
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);
125
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);
129
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);
133  
134
135       fReconstructedAfterCuts[i*PARTTYPES+j]->Sumw2();
136       fReconstructedNotPrimaries[i*PARTTYPES+j]->Sumw2();
137       fReconstructedPrimaries[i*PARTTYPES+j]->Sumw2();
138     }
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);
154
155   }
156
157   fHistEv = new TH1F("fHistEv", "Multiplicity", 100, 0, 100);
158   fHistoList->Add(fHistEv);
159
160   for(Int_t i = 0; i < MULTBINS; i++)  {
161     hname = "fHistEventCutsM";
162     hname+= i;
163     
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]);
170
171
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]);
183
184   }
185
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);
195  
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");
201
202
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");
211
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());
215
216
217
218   for ( Int_t i = 0; i < 11; i++)
219     {
220       fHistoList->Add(fHistQA[i]);
221       if(i<3) fHistoList->Add(fHistQA2D[i]);
222       if(i<5) {
223         for(Int_t j = 0 ; j<PARTTYPES; j++)
224           fHistoList->Add(fHistQAPID[i][j]);
225       }
226     }
227     
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]);
235
236   }
237  
238   //********** PID ****************
239
240   AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
241   AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
242   fpidResponse = inputHandler->GetPIDResponse();
243   cout<<"*******"<< fpidResponse<<endl;
244
245   // ************************
246
247   PostData(1, fHistoList);
248 }
249
250
251 //_____________________________________________________________________
252
253 bool IsPionNSigma(float mom, float nsigmaTPCPi, float nsigmaTOFPi)
254 {
255
256     if (mom > 0.5) {
257         if (TMath::Hypot( nsigmaTOFPi, nsigmaTPCPi ) < 3)
258             return true;
259         }
260     else {
261         if (TMath::Abs(nsigmaTPCPi) < 3)
262             return true;
263     }
264 /*
265   if(mom<0.65)
266     {
267       if(nsigmaTOFPi<-999.)
268         {
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;
272           else return false;
273         }
274       else if(TMath::Abs(nsigmaTOFPi)<3.0 && TMath::Abs(nsigmaTPCPi)<3.0) return true;
275     }
276   else if(nsigmaTOFPi<-999.)
277     {
278       return false;
279     }
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;
282 */
283   return false;
284 }
285
286 bool IsKaonNSigma(float mom, float nsigmaTPCK, float nsigmaTOFK)
287 {
288     if (mom > 0.5) {
289         if (TMath::Hypot( nsigmaTOFK, nsigmaTPCK ) < 3)
290             return true;
291         }
292     else {
293         if (TMath::Abs(nsigmaTPCK) < 3)
294             return true;
295     }
296
297  /* if(mom<0.4)
298     {
299       if(nsigmaTOFK<-999.)
300         {
301           if(TMath::Abs(nsigmaTPCK)<2.0) return true;
302         }
303       else if(TMath::Abs(nsigmaTOFK)<3.0 && TMath::Abs(nsigmaTPCK)<3.0) return true;
304     }
305   else if(mom>=0.4 && mom<=0.6)
306     {
307       if(nsigmaTOFK<-999.)
308         {
309           if(TMath::Abs(nsigmaTPCK)<2.0) return true;
310         }
311       else if(TMath::Abs(nsigmaTOFK)<3.0 && TMath::Abs(nsigmaTPCK)<3.0) return true;
312     }
313   else if(nsigmaTOFK<-999.)
314     {
315       return false;
316     }
317   else if(TMath::Abs(nsigmaTOFK)<3.0 && TMath::Abs(nsigmaTPCK)<3.0) return true;
318 */
319   return false;
320 }
321
322 bool IsProtonNSigma(float mom, float nsigmaTPCP, float nsigmaTOFP)
323 {
324
325     if (mom > 0.5) {
326         if (TMath::Hypot( nsigmaTOFP, nsigmaTPCP ) < 3)
327             return true;
328         }
329     else {
330         if (TMath::Abs(nsigmaTPCP) < 3)
331             return true;
332     }
333
334   // if (mom > 0.8 && mom < 2.5) {
335   //   if ( TMath::Abs(nsigmaTPCP) < 3.0 && TMath::Abs(nsigmaTOFP) < 3.0)
336   //     return true;
337   // }
338   // else if (mom > 2.5) {
339   //   if ( TMath::Abs(nsigmaTPCP) < 3.0 && TMath::Abs(nsigmaTOFP) < 2.0)
340   //     return true;
341   // }
342   // else {
343   //   if (TMath::Abs(nsigmaTPCP) < 3.0)
344   //     return true;
345   // }
346   
347
348   return false;
349 }
350
351
352 bool IsElectron(float nsigmaTPCE, float nsigmaTPCPi,float nsigmaTPCK, float nsigmaTPCP)
353 {
354   if(TMath::Abs(nsigmaTPCE)<3 && TMath::Abs(nsigmaTPCPi)>3 && TMath::Abs(nsigmaTPCK)>3 && TMath::Abs(nsigmaTPCP)>3)
355       return true;
356    else
357      return false;
358 }
359
360 //_______________________________________________________
361
362 void AliAnalysisTaskParticleEfficiency::UserExec(Option_t *)
363 {
364
365   /***Get Event****/
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
375   fHistEv->Fill(mult); 
376  
377
378   //******************
379   // load MC array
380   // arrayMC =  (TClonesArray*)aodEvent->GetList()->FindObject(AliAODMCParticle::StdBranchName());
381   //  if(!arrayMC) {
382   //  printf("AliAnalysisTaskParticleEficiency::UserExec: MC particles branch not found!\n");
383   //return;
384   //}
385     
386   // load MC header
387   //mcHeader =  (AliAODMCHeader*)aod->GetList()->FindObject(AliAODMCHeader::StdBranchName());
388   //if(!mcHeader) {
389   //printf("AliAnalysisTaskSEDplusCorrelations::UserExec: MC header branch not found!\n");
390   //return;
391   // }
392   //*********************   
393  
394
395
396   // EVENT SELECTION ********************
397
398   fHistQA[9]->Fill(1);
399
400   // collision candidate 
401   // if (!(((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kMB)) return;
402
403
404   //****** Multiplicity selection *********
405   Int_t fcent = -999;  
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;
414   //else fcent = 7;
415   //if (fcent == 7) return;
416
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;
421   else return;
422  
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);
427
428   //"ESDs/pass2/AOD049/*AliAOD.root");
429   const AliAODVertex* vertex =(AliAODVertex*) aodEvent->GetPrimaryVertex();
430   if (!vertex || vertex->GetNContributors()<=0) return;
431
432   fHistQA[9]->Fill(2);
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);
437
438   AliAnalysisUtils *anaUtil=new AliAnalysisUtils();
439     
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;
445
446   if(fpA2013)
447     if(anaUtil->IsVertexSelected2013pA(aodEvent)==kFALSE) return;
448  
449   if(fMVPlp) anaUtil->SetUseMVPlpSelection(kTRUE);
450   else anaUtil->SetUseMVPlpSelection(kFALSE);
451  
452   if(fMinPlpContribMV) anaUtil->SetMinPlpContribMV(fMinPlpContribMV);
453   if(fMinPlpContribSPD) anaUtil->SetMinPlpContribSPD(fMinPlpContribSPD);
454
455   if(fisPileUp)
456     if(anaUtil->IsPileUpEvent(aodEvent)) return;
457
458   delete anaUtil;   
459
460  fHistQA[9]->Fill(3);
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);
465
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);
471   fHistQA[9]->Fill(4);
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);
476
477  //**** getting MC array ******
478   TClonesArray  *arrayMC;
479
480   arrayMC = dynamic_cast<TClonesArray*>(aodEvent->FindListObject(AliAODMCParticle::StdBranchName()));
481
482
483   //get stack 
484   //AliStack *mcStack = mcEvent->Stack();
485   //if (!mcStack) return;
486   //***********************
487
488
489   // old vertex selection 
490   /*const AliESDVertex *vertex = esdEvent->GetPrimaryVertex();
491     if (vertex->GetNContributors() < 1) return;
492
493     //z-vertex cut
494     if (TMath::Abs(vertex->GetZ()) > 10.) return;
495   
496
497     const AliESDVertex *vtxSPD = esdEvent->GetPrimaryVertexSPD();*/
498   // Double_t zVertex = vtxSPD->GetZ();
499
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;
506
507
508 //copying pid information for FB 128
509   int labels[20000];
510   for (int il=0; il<20000; il++) labels[il] = -1;
511
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;
518     }
519   }
520
521   //RECONSTRUCTED TRACKS 
522
523   TObjArray recoParticleArray[PARTTYPES];
524
525   fHistQA[10]->Fill(1,aodEvent->GetNumberOfTracks());
526   //loop over AOD tracks 
527   for (Int_t iTracks = 0; iTracks < aodEvent->GetNumberOfTracks(); iTracks++) {
528     //get track 
529     
530     //AliESDtrack* track = AliESDtrackCuts::GetTPCOnlyTrack(const_cast<AliESDEvent*>(esdEvent),iTracks);
531     AliAODTrack *track = aodEvent->GetTrack(iTracks); 
532     if (!track)continue;
533     fHistQA[10]->Fill(2);
534
535     //UInt_t filterBit = (1 << (0));
536     UInt_t filterBit = 96;
537     if(!track->TestFilterBit(filterBit))continue;       
538
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)
545   
546     //   if((track->IsHybridGlobalConstrainedGlobal())==false)
547     //  continue;//def_BIT(272)
548
549     //if((track->TestFilterMask(AliAODTrack::kTrkGlobal)==false))continue;//cut1_BIT(5)
550
551     fHistQA[10]->Fill(3);
552      
553     if(track->Eta() < -0.8 || track->Eta() > 0.8)
554       continue; 
555     fHistQA[10]->Fill(4);
556
557     if (track->Pt() < 0.2 || track->Pt() > 20)
558       continue;
559     fHistQA[10]->Fill(5);
560
561     //single track cuts
562     // if(track->Chi2perNDF() > 4.0) continue;
563     // if(track->GetTPCNcls() < 70) continue;
564
565     //DCA
566     
567     Double_t DCAXY;
568     Double_t DCAZ;
569     //  if(filterBit==(1 << (7))){
570     DCAXY = -TMath::Abs(track->DCA());
571     DCAZ = -TMath::Abs(track->ZAtDCA());
572  
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
575         //no DCA cut
576         //if(TMath::Abs(DCAXY) > 1000.0) {continue;} //XY
577         //if(TMath::Abs(DCAZ) > 1000.0) {continue;} //Z
578       }
579     else {
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.;
585
586       if(vertex) {
587         Double32_t fCov[6];
588         vertex->GetCovarianceMatrix(fCov);
589         if(vertex->GetNContributors() > 0) {
590           if(fCov[5] != 0) {
591             vertexX = vertex->GetX();
592             vertexY = vertex->GetY();
593             vertexZ = vertex->GetZ();
594
595           }
596         }
597       }
598
599       Double_t pos[3];
600       track->GetXYZ(pos);
601
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));
606
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
609       //no DCA cut
610       //if(TMath::Abs(DCAXY) > 1000.0) continue;
611       //if(TMath::Abs(DCAZ) > 1000.0) continue;
612     }
613
614     fHistQA[10]->Fill(6);
615
616     AliAODTrack* aodtrackpid;
617
618     //for FB 128 - tpc only tracks
619     if(filterBit==(1 << (7)))
620       aodtrackpid = aodEvent->GetTrack(labels[-1-aodEvent->GetTrack(iTracks)->GetID()]);
621     else
622       aodtrackpid = track;
623
624
625  //PANOS--------------------------
626     
627     AliMCEvent* mcEvent = MCEvent();
628     if (!mcEvent) {
629       AliError("ERROR: Could not retrieve MC event");
630       return;
631     }
632
633     Int_t nMCParticles = mcEvent->GetNumberOfTracks();
634     Int_t labelp = TMath::Abs(track->GetLabel());
635     if(labelp > nMCParticles) continue;
636
637     AliAODMCParticle *AODmcTrack = (AliAODMCParticle*) mcEvent->GetTrack(labelp);
638
639     /*
640     //contamination from secondaries without electron rejection
641     if (!AODmcTrack->IsPhysicalPrimary()) {
642       fReconstructedNotPrimaries[PARTTYPES*fcent]->Fill(track->Eta(), track->Pt());
643     }
644     else{
645       fReconstructedPrimaries[PARTTYPES*fcent]->Fill(track->Eta(), track->Pt());
646     }
647     */
648     //-------------------------
649    
650     //Electron rejection
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))
656       continue;
657     fHistQA[10]->Fill(7);
658     
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());
666
667     float px=track->Px(); float py=track->Py();  float ph=atan2(py,px); //track->Phi()
668     float tPt = track->Pt();
669
670     fHistQA[7]->Fill(ph);
671     fHistQA[8]->Fill(track->Eta());
672     fHistQA2D[2]->Fill(track->Eta(),ph);
673
674     fHistQA2D[0]->Fill(tPt,DCAXY);
675     fHistQA2D[1]->Fill(tPt,DCAZ);
676
677
678  //PANOS
679     //contamination from secondaries with electron rejection
680     // if (!AODmcTrack->IsPhysicalPrimary()) {
681     //   fReconstructedNotPrimaries[PARTTYPES*fcent]->Fill(track->Eta(), track->Pt());
682     // }
683     // else{
684     //   fReconstructedPrimaries[PARTTYPES*fcent]->Fill(track->Eta(), track->Pt());
685     // }
686     
687
688     //PID monitors
689     double nSigmaTOFPi = fpidResponse->NumberOfSigmasTOF(aodtrackpid,AliPID::kPion);
690     double nSigmaTOFK = fpidResponse->NumberOfSigmasTOF(aodtrackpid,AliPID::kKaon);
691     double nSigmaTOFP = fpidResponse->NumberOfSigmasTOF(aodtrackpid,AliPID::kProton);
692
693     float tdEdx = aodtrackpid->GetTPCsignal();
694     float tTofSig = aodtrackpid->GetTOFsignal();
695     double pidTime[5]; aodtrackpid->GetIntegratedTimes(pidTime);
696
697
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);
703
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);
710     }
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);
717     }
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);
724     }
725
726     fReconstructedAfterCuts[fcent]->Fill(track->Eta(), track->Pt());//Fills hist. for all reconstructed particles after cuts
727
728     if(!arrayMC){
729       continue;
730     }
731     //get coresponding MC particle 
732     Int_t label = TMath::Abs(track->GetLabel());
733     AliAODMCParticle *MCtrk = (AliAODMCParticle*)arrayMC->At(label);
734
735    //getting no. of tracks for each particle species after all the cuts:
736
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);
742        }
743        //Fills for all identified pions found after cuts (reconstructed) - numerator for Efficiency
744
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);
750        }
751        //Fills for all identified kaons found after cuts (reconstructed) - numerator for Efficiency
752
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);
758        }
759
760       //Fills for all identified protos found after cuts (reconstructed) - numerator for Efficiency
761    //******************************
762
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;
767        
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);
772
773
774     //Fills histogram for particles that are contamination from secondaries:
775     if (!AODmcTrack->IsPhysicalPrimary()) {
776       fReconstructedNotPrimaries[PARTTYPES*fcent]->Fill(track->Eta(), track->Pt());
777     }
778     else{
779       fReconstructedPrimaries[PARTTYPES*fcent]->Fill(track->Eta(), track->Pt());
780     }
781  
782     int PDGcode = MCtrk->GetPdgCode();
783
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());
787     }
788     else if(AODmcTrack->IsPhysicalPrimary() && (IsPionNSigma(track->P(),nSigmaTPCPi, nSigmaTOFPi) && PDGcode==211)) {
789       fReconstructedPrimaries[PARTTYPES*fcent+1]->Fill(track->Eta(), track->Pt());
790     }
791     
792     if (!AODmcTrack->IsPhysicalPrimary() && (IsKaonNSigma(track->P(),nSigmaTPCK, nSigmaTOFK) && PDGcode==321)) { //secondaries in kaons
793       fReconstructedNotPrimaries[PARTTYPES*fcent+2]->Fill(track->Eta(), track->Pt());
794     }
795     else if(AODmcTrack->IsPhysicalPrimary() && (IsKaonNSigma(track->P(),nSigmaTPCK, nSigmaTOFK) && PDGcode==321)) {
796       fReconstructedPrimaries[PARTTYPES*fcent+2]->Fill(track->Eta(), track->Pt());
797       }
798
799     if (!AODmcTrack->IsPhysicalPrimary() && (IsProtonNSigma(track->P(),nSigmaTPCP, nSigmaTOFP) && PDGcode==2212)) { //secondaries in protons
800       fReconstructedNotPrimaries[PARTTYPES*fcent+3]->Fill(track->Eta(), track->Pt());
801     } 
802     else if(AODmcTrack->IsPhysicalPrimary() && (IsProtonNSigma(track->P(),nSigmaTPCP, nSigmaTOFP) && PDGcode==2212)) {
803       fReconstructedPrimaries[PARTTYPES*fcent+3]->Fill(track->Eta(), track->Pt());
804     } 
805
806     //Misidentification fraction
807     if(PDGcode==211)
808       {
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);
817
818
819       }
820     else if(PDGcode==321)
821       {
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);
830
831
832       }
833     else if(PDGcode == 2212)
834       {
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))
840           {
841           fMisidentification[fcent]-> Fill(3,2.5);
842           }
843         if(!IsPionNSigma(track->P(),nSigmaTPCPi, nSigmaTOFPi) && !IsKaonNSigma(track->P(),nSigmaTPCK, nSigmaTOFK) && !IsProtonNSigma(track->P(),nSigmaTPCP, nSigmaTOFP))
844           fMisidentification[fcent]-> Fill(3,3.5);
845       }
846
847
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))
852       {
853         fContamination[PARTTYPES*fcent+1]-> Fill(PDGcode,track->Pt()); // filling contamination histogram for pions
854       }
855     if(IsKaonNSigma(track->P(),nSigmaTPCK, nSigmaTOFK))
856       {
857         fContamination[PARTTYPES*fcent+2]-> Fill(PDGcode,track->Pt()); // filling contamination histogram for kaons
858       }
859     if(IsProtonNSigma(track->P(),nSigmaTPCP, nSigmaTOFP))
860       {
861         fContamination[PARTTYPES*fcent+3]-> Fill(PDGcode,track->Pt()); // filling contamination histogram for protons
862       }
863     
864
865
866   } 
867
868
869   // MONTECARLO PARTICLES 
870   if(!arrayMC){
871     AliError("Array of MC particles not found");
872     return;
873   }
874   // loop over MC stack 
875   for (Int_t ipart = 0; ipart < arrayMC->GetEntries(); ipart++) {
876     //cout<<"Entered MC loop"<<endl;
877     
878     AliAODMCParticle *MCtrk = (AliAODMCParticle*)arrayMC->At(ipart);
879
880     if (!MCtrk) continue;
881     //cout<<"particle obtained"<<endl;
882     
883     Int_t PDGcode = TMath::Abs(MCtrk->GetPdgCode()); 
884
885     
886     if(MCtrk->Charge() == 0) continue;
887      
888     //*** PID - check if pion ***
889     //if(PDGcode!=211) continue; //(PDGcode==11 || PDGcode==321 || PDGcode==2212 || PDGcode==13)
890
891       if(MCtrk->Eta() < -0.8 || MCtrk->Eta() > 0.8){
892         continue; }
893         
894       if (MCtrk->Pt() < 0.2 || MCtrk->Pt() > 20){
895         continue;}
896         
897       // check physical primary 
898       if (MCtrk->IsPhysicalPrimary()){
899
900         // Filling histograms for MC truth particles
901         fGeneratedMCPrimaries[fcent*PARTTYPES]->Fill(MCtrk->Eta(), MCtrk->Pt());
902         if(PDGcode==211)
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());
908
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());
912         }
913         if (recoParticleArray[1].Contains(MCtrk)){ //Pions
914           if(PDGcode==211)
915             fMCPrimariesThatAreReconstructed[fcent*PARTTYPES+1]->Fill(MCtrk->Eta(), MCtrk->Pt());
916         }
917         if (recoParticleArray[2].Contains(MCtrk)){ //Kaons
918           if(PDGcode==321)
919             fMCPrimariesThatAreReconstructed[fcent*PARTTYPES+2]->Fill(MCtrk->Eta(), MCtrk->Pt());
920         }
921         if (recoParticleArray[3].Contains(MCtrk)){ //Protons
922           if(PDGcode==2212)
923             fMCPrimariesThatAreReconstructed[fcent*PARTTYPES+3]->Fill(MCtrk->Eta(), MCtrk->Pt());
924         }
925
926       }
927     
928   }
929   PostData(1, fHistoList);
930 }
931 //-----------------------------------------------------------------
932
933 //void AliAnalysisTaskParticleEfficiency::Terminate(Option_t *) 
934 //{}