]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGCF/EBYE/NetParticle/AliAnalysisNetParticleEffCont.cxx
Merge branch 'feature-movesplit'
[u/mrichter/AliRoot.git] / PWGCF / EBYE / NetParticle / AliAnalysisNetParticleEffCont.cxx
1 //-*- Mode: C++ -*-
2
3 #include "TMath.h"
4 #include "TAxis.h"
5
6 #include "AliESDEvent.h"
7 #include "AliStack.h"
8 #include "AliMCEvent.h"
9 #include "AliESDtrackCuts.h"
10 #include "AliAODEvent.h"
11 #include "AliAODMCParticle.h"
12
13 #include "AliAnalysisNetParticleEffCont.h"
14
15 using namespace std;
16
17 /**
18  * Class for NetParticle Distributions
19  * -- Efficiency and contaminations for netParticle distributions
20  * Authors: Jochen Thaeder <jochen@thaeder.de>
21  *          Michael Weber <m.weber@cern.ch>
22  */
23
24 ClassImp(AliAnalysisNetParticleEffCont)
25
26 /*
27  * ---------------------------------------------------------------------------------
28  *                            Constructor / Destructor
29  * ---------------------------------------------------------------------------------
30  */
31
32 //________________________________________________________________________
33 AliAnalysisNetParticleEffCont::AliAnalysisNetParticleEffCont() :
34   AliAnalysisNetParticleBase("EffCont", "EffCont"),
35   fLabelsRec(NULL),
36   fHnEff(NULL),
37   fHnCont(NULL) {
38   // Constructor   
39
40   AliLog::SetClassDebugLevel("AliAnalysisNetParticleEffCont",10);
41 }
42
43 //________________________________________________________________________
44 AliAnalysisNetParticleEffCont::~AliAnalysisNetParticleEffCont() {
45   // Destructor
46
47   if (fLabelsRec) {
48     if (fLabelsRec[0])
49       delete[] (fLabelsRec[0]);
50     if (fLabelsRec[1])
51       delete[] (fLabelsRec[1]);
52     if (fLabelsRec)
53       delete[] fLabelsRec;
54   }
55 }
56
57 /*
58  * ---------------------------------------------------------------------------------
59  *                                 Public Methods
60  * ---------------------------------------------------------------------------------
61  */
62
63 //________________________________________________________________________
64 void AliAnalysisNetParticleEffCont::Process() {
65   // -- Process event
66
67   // -- Setup (clean, create and fill) MC labels
68   FillMCLabels();
69  
70   // -- Fill  MC histograms for efficiency studies
71   FillMCEffHist();
72
73   return;
74 }      
75
76 /*
77  * ---------------------------------------------------------------------------------
78  *                                Methods - private
79  * ---------------------------------------------------------------------------------
80  */
81
82 //________________________________________________________________________
83 void AliAnalysisNetParticleEffCont::Init() {
84   // -- Init eventwise
85
86   // -- MC Labels for efficiency
87   fLabelsRec        = new Int_t*[2];
88   for (Int_t ii = 0; ii < 2 ; ++ii)
89     fLabelsRec[ii] = NULL;
90 }
91
92 //________________________________________________________________________
93 void AliAnalysisNetParticleEffCont::CreateHistograms() {
94   // -- Create histograms
95
96   // ------------------------------------------------------------------
97   // -- Create THnSparse - Eff
98   // ------------------------------------------------------------------
99
100   Int_t    binHnEff[19] = {AliAnalysisNetParticleHelper::fgkfHistNBinsCent,    AliAnalysisNetParticleHelper::fgkfHistNBinsEta,       //     cent |     etaMC
101                            AliAnalysisNetParticleHelper::fgkfHistNBinsRap,     AliAnalysisNetParticleHelper::fgkfHistNBinsPhi,       //      yMC |     phiMC
102                            AliAnalysisNetParticleHelper::fgkfHistNBinsPt,      AliAnalysisNetParticleHelper::fgkfHistNBinsSign,      //     ptMC |    signMC
103                            2,      2  ,      2  ,                                                                                    // findable | recStatus  | pidStatus
104                            AliAnalysisNetParticleHelper::fgkfHistNBinsEta,     AliAnalysisNetParticleHelper::fgkfHistNBinsRap,       //   etaRec |      yRec
105                            AliAnalysisNetParticleHelper::fgkfHistNBinsPhi,     AliAnalysisNetParticleHelper::fgkfHistNBinsPt,        //   phiRec |     ptRec
106                            AliAnalysisNetParticleHelper::fgkfHistNBinsSign,                                                          //  signRec
107                            AliAnalysisNetParticleHelper::fgkfHistNBinsEta,     AliAnalysisNetParticleHelper::fgkfHistNBinsRap,       // deltaEta | deltaY
108                            2*AliAnalysisNetParticleHelper::fgkfHistNBinsPhi+1, 2*AliAnalysisNetParticleHelper::fgkfHistNBinsPt+1,    // deltaPhi | deltaPt
109                            AliAnalysisNetParticleHelper::fgkfHistNBinsSign+2};                                                       // deltaSign
110
111   
112   Double_t minHnEff[19] = {AliAnalysisNetParticleHelper::fgkfHistRangeCent[0], AliAnalysisNetParticleHelper::fgkfHistRangeEta[0], 
113                            AliAnalysisNetParticleHelper::fgkfHistRangeRap[0],  AliAnalysisNetParticleHelper::fgkfHistRangePhi[0], 
114                            AliAnalysisNetParticleHelper::fgkfHistRangePt[0],   AliAnalysisNetParticleHelper::fgkfHistRangeSign[0], 
115                            -0.5,     -0.5,     -0.5,
116                            AliAnalysisNetParticleHelper::fgkfHistRangeEta[0],  AliAnalysisNetParticleHelper::fgkfHistRangeRap[0], 
117                            AliAnalysisNetParticleHelper::fgkfHistRangePhi[0],  AliAnalysisNetParticleHelper::fgkfHistRangePt[0],
118                            AliAnalysisNetParticleHelper::fgkfHistRangeSign[0],
119                            AliAnalysisNetParticleHelper::fgkfHistRangeEta[0],  AliAnalysisNetParticleHelper::fgkfHistRangeRap[0], 
120                            -1.*AliAnalysisNetParticleHelper::fgkfHistRangePhi[1], -1.*AliAnalysisNetParticleHelper::fgkfHistRangePt[1],
121                            AliAnalysisNetParticleHelper::fgkfHistRangeSign[0]-1.};
122
123   Double_t maxHnEff[19] = {AliAnalysisNetParticleHelper::fgkfHistRangeCent[1], AliAnalysisNetParticleHelper::fgkfHistRangeEta[1], 
124                            AliAnalysisNetParticleHelper::fgkfHistRangeRap[1],  AliAnalysisNetParticleHelper::fgkfHistRangePhi[1], 
125                            AliAnalysisNetParticleHelper::fgkfHistRangePt[1],   AliAnalysisNetParticleHelper::fgkfHistRangeSign[1], 
126                            1.5,      1.5,      1.5,
127                            AliAnalysisNetParticleHelper::fgkfHistRangeEta[1],  AliAnalysisNetParticleHelper::fgkfHistRangeRap[1], 
128                            AliAnalysisNetParticleHelper::fgkfHistRangePhi[1],  AliAnalysisNetParticleHelper::fgkfHistRangePt[1],
129                            AliAnalysisNetParticleHelper::fgkfHistRangeSign[1],
130                            AliAnalysisNetParticleHelper::fgkfHistRangeEta[1],  AliAnalysisNetParticleHelper::fgkfHistRangeRap[1], 
131                            AliAnalysisNetParticleHelper::fgkfHistRangePhi[1],  AliAnalysisNetParticleHelper::fgkfHistRangePt[1],
132                            AliAnalysisNetParticleHelper::fgkfHistRangeSign[1]+1.};
133
134   fHnEff = new THnSparseF("hnEff", "cent:etaMC:yMC:phiMC:ptMC:signMC:findable:recStatus:pidStatus:etaRec:yRec:phiRec:ptRec:signRec:deltaEta:deltaY:deltaPhi:deltaPt:deltaSign", 
135                           19, binHnEff, minHnEff, maxHnEff);
136   fHnEff->Sumw2();    
137
138   fHnEff->GetAxis(0)->SetTitle("centrality");                   //  0-5|5-10|10-20|20-30|30-40|40-50|50-60|60-70|70-80|80-90 --> 10 bins
139   fHnEff->GetAxis(1)->SetTitle("#eta_{MC}");                    //  eta  [-0.9, 0.9]
140   fHnEff->GetAxis(2)->SetTitle("#it{y}_{MC}");                  //  rapidity  [-0.5, 0.5]
141   fHnEff->GetAxis(3)->SetTitle("#varphi_{MC} (rad)");           //  phi  [ 0. , 2Pi]
142   fHnEff->GetAxis(4)->SetTitle("#it{p}_{T,MC} (GeV/#it{c})");   //  pT   [ 0.2, 2.3]
143   
144   fHnEff->GetAxis(5)->SetTitle("sign");                         //  -1 | 0 | +1 
145   fHnEff->GetAxis(6)->SetTitle("findable");                     //  0 not findable      |  1 findable
146   fHnEff->GetAxis(7)->SetTitle("recStatus");                    //  0 not reconstructed |  1 reconstructed
147   fHnEff->GetAxis(8)->SetTitle("recPid");                       //  0 not accepted      |  1 accepted
148
149   fHnEff->GetAxis(9)->SetTitle("#eta_{Rec}");                   //  eta  [-0.9, 0.9]
150   fHnEff->GetAxis(10)->SetTitle("#it{y}_{Rec}");                //  rapidity  [-0.5, 0.5]
151   fHnEff->GetAxis(11)->SetTitle("#varphi_{Rec} (rad)");         //  phi  [ 0. , 2Pi]
152   fHnEff->GetAxis(12)->SetTitle("#it{p}_{T,Rec} (GeV/#it{c})"); //  pt   [ 0.2, 2.3]
153   fHnEff->GetAxis(13)->SetTitle("sign");                        //  -1 | 0 | +1 
154
155   fHnEff->GetAxis(14)->SetTitle("#eta_{MC}-#eta_{Rec}");                      //  eta  [-0.9, 0.9]
156   fHnEff->GetAxis(15)->SetTitle("#it{y}_{MC}-#it{y}_{Rec}");                  //  rapidity  [-0.5, 0.5]
157   fHnEff->GetAxis(16)->SetTitle("#varphi_{MC}-#varphi_{Rec} (rad)");          //  phi  [ -2Pi , 2Pi]
158   fHnEff->GetAxis(17)->SetTitle("#it{p}_{T,MC}-#it{p}_{T,Rec} (GeV/#it{c})"); //  pt   [ -2.3, 2.3]
159   fHnEff->GetAxis(18)->SetTitle("sign_{MC}-sign_{Rec}");                      //  -2 | 0 | +2 
160
161   fHelper->BinLogAxis(fHnEff,  4);
162   fHelper->BinLogAxis(fHnEff, 12);
163
164   /* 
165      >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
166      
167      creation -> findable -> reconstructed -> pid_TPC+TOF
168         (1)         (2)          (3)            (4)      
169                                                                       ||   findable | recStatus | recPid 
170      1) all primary probeParticles_MC                                 ||      -           -         -
171      2) all findable primary probeParticles_MC                        ||      x           -         -
172      3) all reconstructed primary probeParticles_MC                   ||      x           x         -
173      4) all reconstructed primary probeParticles_MC & recPid_TPC+TOF  ||      x           x         x
174      
175      <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
176   */ 
177
178   // ------------------------------------------------------------------
179   // -- Create THnSparse - Cont
180   // ------------------------------------------------------------------
181
182   Int_t    binHnCont[17] = {AliAnalysisNetParticleHelper::fgkfHistNBinsCent, AliAnalysisNetParticleHelper::fgkfHistNBinsEta,       //     cent |    etaMC
183                             AliAnalysisNetParticleHelper::fgkfHistNBinsRap,  AliAnalysisNetParticleHelper::fgkfHistNBinsPhi,       //      yMC |    phiMC
184                             AliAnalysisNetParticleHelper::fgkfHistNBinsPt,   AliAnalysisNetParticleHelper::fgkfHistNBinsSign,      //     ptMC |   signMC=contSign
185                             8,                                                                                                     // contPart | 
186                             AliAnalysisNetParticleHelper::fgkfHistNBinsEta,  AliAnalysisNetParticleHelper::fgkfHistNBinsRap,       //   etaRec |     yRec
187                             AliAnalysisNetParticleHelper::fgkfHistNBinsPhi,  AliAnalysisNetParticleHelper::fgkfHistNBinsPt,        //   phiRec |    ptRec
188                             AliAnalysisNetParticleHelper::fgkfHistNBinsSign,                                                       //  signRec  
189                             AliAnalysisNetParticleHelper::fgkfHistNBinsEta,     AliAnalysisNetParticleHelper::fgkfHistNBinsRap,    // deltaEta | deltaY
190                             2*AliAnalysisNetParticleHelper::fgkfHistNBinsPhi+1, 2*AliAnalysisNetParticleHelper::fgkfHistNBinsPt+1, // deltaPhi | deltaPt
191                             AliAnalysisNetParticleHelper::fgkfHistNBinsSign+2};                                                    // deltaSign
192   
193   Double_t minHnCont[17] = {AliAnalysisNetParticleHelper::fgkfHistRangeCent[0], AliAnalysisNetParticleHelper::fgkfHistRangeEta[0], 
194                             AliAnalysisNetParticleHelper::fgkfHistRangeRap[0],  AliAnalysisNetParticleHelper::fgkfHistRangePhi[0], 
195                             AliAnalysisNetParticleHelper::fgkfHistRangePt[0],   AliAnalysisNetParticleHelper::fgkfHistRangeSign[0], 
196                             0.5,                                            
197                             AliAnalysisNetParticleHelper::fgkfHistRangeEta[0],  AliAnalysisNetParticleHelper::fgkfHistRangeRap[0], 
198                             AliAnalysisNetParticleHelper::fgkfHistRangePhi[0],  AliAnalysisNetParticleHelper::fgkfHistRangePt[0],
199                             AliAnalysisNetParticleHelper::fgkfHistRangeSign[0],
200                             AliAnalysisNetParticleHelper::fgkfHistRangeEta[0],  AliAnalysisNetParticleHelper::fgkfHistRangeRap[0], 
201                             -1.*AliAnalysisNetParticleHelper::fgkfHistRangePhi[1], -1.*AliAnalysisNetParticleHelper::fgkfHistRangePt[1],
202                             AliAnalysisNetParticleHelper::fgkfHistRangeSign[0]-1.};
203
204   
205   Double_t maxHnCont[17] = {AliAnalysisNetParticleHelper::fgkfHistRangeCent[1], AliAnalysisNetParticleHelper::fgkfHistRangeEta[1], 
206                             AliAnalysisNetParticleHelper::fgkfHistRangeRap[1],  AliAnalysisNetParticleHelper::fgkfHistRangePhi[1], 
207                             AliAnalysisNetParticleHelper::fgkfHistRangePt[1],   AliAnalysisNetParticleHelper::fgkfHistRangeSign[1],
208                             8.5,                        
209                             AliAnalysisNetParticleHelper::fgkfHistRangeEta[1],  AliAnalysisNetParticleHelper::fgkfHistRangeRap[1], 
210                             AliAnalysisNetParticleHelper::fgkfHistRangePhi[1],  AliAnalysisNetParticleHelper::fgkfHistRangePt[1],
211                             AliAnalysisNetParticleHelper::fgkfHistRangeSign[1], 
212                             AliAnalysisNetParticleHelper::fgkfHistRangeEta[1],  AliAnalysisNetParticleHelper::fgkfHistRangeRap[1], 
213                             AliAnalysisNetParticleHelper::fgkfHistRangePhi[1],  AliAnalysisNetParticleHelper::fgkfHistRangePt[1],
214                             AliAnalysisNetParticleHelper::fgkfHistRangeSign[1]+1.};
215
216   fHnCont = new THnSparseF("hnCont", "cent:etaMC:yMC:phiMC:ptMC:signMC:contPart:etaRec:yRec:phiRec:ptRec:signRec:deltaEta:deltaY:deltaPhi:deltaPt:deltaSign",
217                            17, binHnCont, minHnCont, maxHnCont);
218   fHnCont->Sumw2();    
219
220   fHnCont->GetAxis(0)->SetTitle("centrality");                   //  0-5|5-10|10-20|20-30|30-40|40-50|50-60|60-70|70-80|80-90 --> 10 bins
221   fHnCont->GetAxis(1)->SetTitle("#eta_{MC}");                    //  eta  [-0.9,0.9]
222   fHnCont->GetAxis(2)->SetTitle("#it{y}_{MC}");                  //  rapidity  [-0.5, 0.5]
223   fHnCont->GetAxis(3)->SetTitle("#varphi_{MC} (rad)");           //  phi  [ 0. ,2Pi]
224   fHnCont->GetAxis(4)->SetTitle("#it{p}_{T,MC} (GeV/#it{c})");   //  pT   [ 0.2,2.3]
225   fHnCont->GetAxis(5)->SetTitle("sign");                         //  -1 | 0 | +1 
226   
227   fHnCont->GetAxis(6)->SetTitle("contPart");                     //  1 pi | 2 K | 3 p | 4 e | 5 mu | 6 other | 7 p from WeakDecay | 8 p from Material
228  
229   fHnCont->GetAxis(7)->SetTitle("#eta_{Rec}");                   //  eta  [-0.9, 0.9]
230   fHnCont->GetAxis(8)->SetTitle("#it{y}_{Rec}");                 //  rapidity  [-0.5, 0.5]
231   fHnCont->GetAxis(9)->SetTitle("#varphi_{Rec} (rad)");          //  phi  [ 0. , 2Pi]
232   fHnCont->GetAxis(10)->SetTitle("#it{p}_{T,Rec} (GeV/#it{c})"); //  pt   [ 0.2, 2.3]
233   fHnCont->GetAxis(11)->SetTitle("sign");                        //  -1 | 0 | +1 
234
235   fHnCont->GetAxis(12)->SetTitle("#eta_{MC}-#eta_{Rec}");                      //  eta  [-0.9, 0.9]
236   fHnCont->GetAxis(13)->SetTitle("#it{y}_{MC}-#it{y}_{Rec}");                  //  rapidity  [-0.5, 0.5]
237   fHnCont->GetAxis(14)->SetTitle("#varphi_{MC}-#varphi_{Rec} (rad)");          //  phi  [ -2Pi , 2Pi]
238   fHnCont->GetAxis(15)->SetTitle("#it{p}_{T,MC}-#it{p}_{T,Rec} (GeV/#it{c})"); //  pt   [ -2.3, 2.3]
239   fHnCont->GetAxis(16)->SetTitle("sign_{MC}-sign_{Rec}");                      //  -2 | 0 | +2 
240
241   fHelper->BinLogAxis(fHnCont,  4);
242   fHelper->BinLogAxis(fHnCont, 10);
243
244   return;
245 }
246
247 //________________________________________________________________________
248 Int_t AliAnalysisNetParticleEffCont::Setup() {
249   // -- Setup eventwise
250
251   // -- Create label arrays
252   fLabelsRec[0] = new Int_t[fNTracks];
253   if(!fLabelsRec[0]) {
254     AliError("Cannot create fLabelsRec[0]");
255     return -1;
256   }
257   
258   fLabelsRec[1] = new Int_t[fNTracks];
259   if(!fLabelsRec[1]) {
260     AliError("Cannot create fLabelsRec[1] for PID");
261     return -1;
262   }
263   
264   for(Int_t ii = 0; ii < fNTracks; ++ii) {
265     fLabelsRec[0][ii] = 0;
266     fLabelsRec[1][ii] = 0;
267   }
268
269   return 0;
270 }
271
272 //________________________________________________________________________
273 void AliAnalysisNetParticleEffCont::Reset() {
274   // -- Reset eventwise
275
276   for (Int_t ii = 0; ii < 2 ; ++ii) {
277     if (fLabelsRec[ii])
278       delete[] fLabelsRec[ii];
279     fLabelsRec[ii] = NULL;
280   }
281 }
282
283 /*
284  * ---------------------------------------------------------------------------------
285  *                                 Private Methods
286  * ---------------------------------------------------------------------------------
287  */
288
289 //________________________________________________________________________
290 void AliAnalysisNetParticleEffCont::FillMCLabels() {
291   // Fill MC labels
292   // Loop over ESD tracks and fill arrays with MC lables
293   //  fLabelsRec[0] : all Tracks
294   //  fLabelsRec[1] : all Tracks accepted by PID of TPC
295   // Check every accepted track if correctly identified
296   //  otherwise check for contamination
297
298   // -- Get ranges for AOD particles
299   Float_t etaRange[2];
300   fESDTrackCuts->GetEtaRange(etaRange[0],etaRange[1]);
301
302   Float_t ptRange[2];
303   fESDTrackCuts->GetPtRange(ptRange[0],ptRange[1]);
304
305   // -- Track Loop
306   for (Int_t idxTrack = 0; idxTrack < fNTracks; ++idxTrack) {
307     
308     AliVTrack *track = (fESD) ? static_cast<AliVTrack*>(fESD->GetTrack(idxTrack)) : static_cast<AliVTrack*>(fAOD->GetTrack(idxTrack)); 
309
310     // -- Check if track is accepted for basic parameters
311     if (!fHelper->IsTrackAcceptedBasicCharged(track))
312       continue;
313     
314     // -- Check if accepted - ESD
315     if (fESD && !fESDTrackCuts->AcceptTrack(dynamic_cast<AliESDtrack*>(track)))
316       continue;
317     
318     // -- Check if accepted - AOD
319     if (fAOD){
320       AliAODTrack * trackAOD = dynamic_cast<AliAODTrack*>(track);
321       
322       if (!trackAOD) {
323         AliError("Pointer to dynamic_cast<AliAODTrack*>(track) = ZERO");
324         continue;
325       }
326       if (!trackAOD->TestFilterBit(fAODtrackCutBit))
327         continue;
328
329       // -- Check if in pT and eta range (is done in ESDTrackCuts for ESDs)
330       if(!(track->Pt() > ptRange[0] && track->Pt() <= ptRange[1] && TMath::Abs(track->Eta()) <= etaRange[1]))
331         continue;
332     }
333
334     // -- Check if accepted in rapidity window -- for identified particles
335     //    for charged particles -- eta check is done in the trackcuts
336     Double_t yP;
337     if (fHelper->GetUsePID() && !fHelper->IsTrackAcceptedRapidity(track, yP))
338       continue;
339
340     // -- Check if accepted with thighter DCA cuts
341     // -- returns kTRUE for AODs for now : MW
342     if (!fHelper->IsTrackAcceptedDCA(track))
343       continue;
344
345     Int_t label  = TMath::Abs(track->GetLabel()); 
346     
347     // -- Fill Label of all reconstructed
348     fLabelsRec[0][idxTrack] = label;
349
350     // -- Check if accepted by PID from TPC or TPC+TOF
351     Double_t pid[3];
352     if (!fHelper->IsTrackAcceptedPID(track, pid))
353       continue;
354
355     // -- Fill Label of all reconstructed && recPid_TPC+TOF    
356     fLabelsRec[1][idxTrack] = label;    
357     
358     // -- Check for contamination and fill contamination THnSparse
359     CheckContTrack(track);
360
361   } // for (Int_t idxTrack = 0; idxTrack < fNTracks; ++idxTrack) {
362
363   return;
364 }
365
366 //________________________________________________________________________
367 void AliAnalysisNetParticleEffCont::CheckContTrack(AliVTrack *track) {
368   // Check if particle is contamination or correctly identified for ESDs and AODs
369   // Check for missidentified primaries and secondaries
370   // Fill contamination THnSparse
371
372   Int_t label     = TMath::Abs(track->GetLabel()); 
373   Float_t signRec = track->Charge();
374
375   
376   AliVParticle* particle = (fESD) ? fMCEvent->GetTrack(label) : static_cast<AliVParticle*>(fArrayMC->At(label));
377   if (!particle)
378     return;
379
380   Bool_t isPhysicalPrimary = (fESD) ? fStack->IsPhysicalPrimary(label): (static_cast<AliAODMCParticle*>(particle))->IsPhysicalPrimary();
381   
382   // -- Check if correctly identified 
383   //    > return if correctly identified -> all ok, no action neededin this method
384   //    > if PID required check -> for the correct (signed pdgcode) particle
385   //    > no PID just check for primary 
386   if (fHelper->GetUsePID()) {
387     if (particle->PdgCode() == (signRec*fPdgCode))
388       if (isPhysicalPrimary)
389         return;
390   }
391   else {
392     if (isPhysicalPrimary)
393       return;
394   }
395
396   // -- Check if secondaries from material or weak decay
397   Bool_t isSecondaryFromWeakDecay = (fESD) ? fStack->IsSecondaryFromWeakDecay(label) : (static_cast<AliAODMCParticle*>(particle))->IsSecondaryFromWeakDecay();
398   Bool_t isSecondaryFromMaterial  = (fESD) ? fStack->IsSecondaryFromMaterial(label)  : (static_cast<AliAODMCParticle*>(particle))->IsSecondaryFromMaterial();
399
400   // -- Get PDG Charge of contaminating particle
401   Float_t signMC = 0.;
402   if      (particle->Charge() == 0.) signMC =  0.;
403   else if (particle->Charge() <  0.) signMC = -1.;      
404   else if (particle->Charge() >  0.) signMC =  1.;      
405
406   // -- Get contaminating particle
407   Float_t contPart = 0;
408   if        (isSecondaryFromWeakDecay)                contPart = 7; // probeParticle from WeakDecay
409   else if   (isSecondaryFromMaterial)                 contPart = 8; // probeParticle from Material
410   else {
411     if      (TMath::Abs(particle->PdgCode()) ==  211) contPart = 1; // pion
412     else if (TMath::Abs(particle->PdgCode()) ==  321) contPart = 2; // kaon
413     else if (TMath::Abs(particle->PdgCode()) == 2212) contPart = 3; // proton
414     else if (TMath::Abs(particle->PdgCode()) ==   11) contPart = 4; // electron
415     else if (TMath::Abs(particle->PdgCode()) ==   13) contPart = 5; // muon
416     else                                              contPart = 6; // other
417   }
418   
419   // -- Get Reconstructed y
420   //    yRec = y for identified particles | yRec = eta for charged particles
421   Double_t yRec  = 0.;
422   fHelper->IsTrackAcceptedRapidity(track, yRec); 
423
424   Double_t deltaPhi = particle->Phi()-track->Phi();
425   if (TMath::Abs(deltaPhi) > TMath::TwoPi()) {
426     if (deltaPhi < 0)
427       deltaPhi += TMath::TwoPi();
428     else
429       deltaPhi -= TMath::TwoPi();
430   }
431
432   // -- Fill THnSparse
433   Double_t hnCont[17] = {fCentralityBin, particle->Eta(), particle->Y(), particle->Phi(), particle->Pt(), signMC, 
434                          contPart, track->Eta(), yRec, track->Phi(), track->Pt(), signRec,
435                          particle->Eta()-track->Eta(), particle->Y()-yRec, deltaPhi, particle->Pt()-track->Pt(), signMC-signRec};
436   fHnCont->Fill(hnCont);
437 }
438
439 //________________________________________________________________________
440 void AliAnalysisNetParticleEffCont::FillMCEffHist() {
441   // Fill efficiency THnSparse for ESDs
442
443   Float_t etaRange[2];
444   fESDTrackCuts->GetEtaRange(etaRange[0],etaRange[1]);
445
446   Int_t nPart  = (fESD) ? fStack->GetNprimary() : fArrayMC->GetEntriesFast();
447
448   for (Int_t idxMC = 0; idxMC < nPart; ++idxMC) {
449     AliVParticle* particle = (fESD) ? fMCEvent->GetTrack(idxMC) : static_cast<AliVParticle*>(fArrayMC->At(idxMC));
450
451     // -- Check basic MC properties -> charged physical primary
452     if (!fHelper->IsParticleAcceptedBasicCharged(particle, idxMC))
453       continue;
454
455     // -- Check if accepted in rapidity window -- for identified particles
456     Double_t yMC;
457     if (fHelper->GetUsePID() && !fHelper->IsParticleAcceptedRapidity(particle, yMC))
458       continue;
459
460     // -- Check if accepted in eta window -- for charged particles
461     if (!fHelper->GetUsePID() && TMath::Abs(particle->Eta()) > etaRange[1])
462       continue;
463
464     // -- Check if probeParticle / anti-probeParticle 
465     //    > skip check if PID is not required
466     if (fHelper->GetUsePID() && TMath::Abs(particle->PdgCode()) != fPdgCode)
467       continue;
468     
469     // -- Get sign of particle
470     Float_t signMC    = (particle->PdgCode() < 0) ? -1. : 1.;
471
472     // -- Get if particle is findable --- not availible for AODs yet
473     Float_t findable  = (fESD) ? Float_t(fHelper->IsParticleFindable(idxMC)) : 1.;
474
475     // -- Get recStatus and pidStatus
476     Float_t recStatus = 0.;
477     Float_t recPid    = 0.;
478
479     // -- Get Reconstructed values 
480     Float_t etaRec  = 0.;
481     Float_t phiRec  = 0.;
482     Float_t ptRec   = 0.;
483     Double_t yRec   = 0.;
484     Float_t signRec = 0.;
485
486     // -- Loop over all labels
487     for (Int_t idxRec=0; idxRec < fNTracks; ++idxRec) {
488       if (idxMC == fLabelsRec[0][idxRec]) {
489         recStatus = 1.;
490         
491         if (idxMC == fLabelsRec[1][idxRec])
492           recPid = 1.;
493         
494         AliVTrack *track = NULL;
495         if(fESD)
496           track = fESD->GetTrack(idxRec);
497         else if(fAOD)
498           track = fAOD->GetTrack(idxRec);
499         
500         if (track) {
501           // if no track present (which should not happen)
502           // -> pt = 0. , which is not in the looked at range
503           
504           // -- Get Reconstructed values
505           etaRec  = track->Eta();
506           phiRec  = track->Phi();         
507           ptRec   = track->Pt();
508           signRec = track->Charge();
509           fHelper->IsTrackAcceptedRapidity(track, yRec); // yRec = y for identified particles | yRec = eta for charged particles
510         }      
511         break;
512       }
513     } // for (Int_t idxRec=0; idxRec < fNTracks; ++idxRec) {  
514
515     Double_t deltaPhi = particle->Phi()-phiRec;
516     if (TMath::Abs(deltaPhi) > TMath::TwoPi()) {
517       if (deltaPhi < 0)
518         deltaPhi += TMath::TwoPi();
519       else
520         deltaPhi -= TMath::TwoPi();
521     }
522     
523     // -- Fill THnSparse
524     Double_t hnEff[19] = {fCentralityBin, particle->Eta(), particle->Y(), particle->Phi(), particle->Pt(), signMC, 
525                           findable, recStatus, recPid, etaRec, yRec, phiRec, ptRec, signRec,
526                           particle->Eta()-etaRec, particle->Y()-yRec, deltaPhi, particle->Pt()-ptRec, signMC-signRec};
527     fHnEff->Fill(hnEff);
528
529   } // for (Int_t idxMC = 0; idxMC < nPart; ++idxMC) {
530   
531   return;
532 }