]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGCF/Correlations/DPhi/AliLeadingV0Correlation.cxx
various coverity fixes
[u/mrichter/AliRoot.git] / PWGCF / Correlations / DPhi / AliLeadingV0Correlation.cxx
1 /* Leading Charged Track+V0 Correlation.(Works for Real,Monte Carlo Data)
2  *                            Sandun Jayarathna
3  *                          University of Houston
4  *                      sandun.pahula.hewage@cern.ch
5  *****************************************************************************************/
6 #include <TROOT.h>
7 #include <TList.h>
8 #include <TChain.h>
9 #include <TFile.h>
10 #include <TMath.h>
11 #include <TH1.h>
12 #include <TH2.h>
13 #include <TH3.h>
14 #include <TTree.h>
15 #include <TRandom.h>
16 #include <THnSparse.h>
17 #include <TPDGCode.h>
18 #include <TDatabasePDG.h>
19
20 #include "AliLog.h"
21 #include "AliAnalysisManager.h"
22 #include "AliAODTrack.h"
23 #include "AliAODEvent.h"
24 #include "AliAODv0.h"
25 #include "AliAODVertex.h"
26 #include "AliAODPid.h"
27 #include "AliPIDResponse.h"
28 #include "AliEventPoolManager.h"
29 #include "AliCentrality.h"
30 #include "AliAODHandler.h"
31 #include "AliAODInputHandler.h"
32 #include "AliAODMCParticle.h"
33 #include "AliInputEventHandler.h"
34 #include "AliVParticle.h"
35 #include "AliMultiplicity.h"
36 #include "AliAODMCHeader.h"
37 #include "AliPID.h"
38 #include "AliExternalTrackParam.h"
39 #include "AliAnalyseLeadingTrackUE.h"
40
41 #include "AliLeadingV0Correlation.h"
42
43 #define CorrBinsX 24
44 #define CorrBinsY 26
45
46
47 Double_t PI =TMath::Pi();
48
49 ClassImp(AliLeadingV0Correlation)
50 ClassImp(V0Correlationparticle)
51
52 //---------------------------------------------------------------------------------------
53 AliLeadingV0Correlation::AliLeadingV0Correlation()
54    : AliAnalysisTaskSE(),
55         fAODEvent                                       (0x0),
56         fPoolMgr                                        (0x0),
57         fPIDResponse                            (0x0),
58         fAnalyseUE                                      (0x0),
59         fPoolMaxNEvents                         (0), 
60         fPoolMinNTracks                         (0), 
61         fMinEventsToMix                         (0),
62         fNzVtxBins                                      (0), 
63         fNCentBins                                      (0),
64         fcollidingSys                           (""),
65         fpvzcut                                         (0),
66         fTrackEtaCut                            (0.9),
67         fFilterBit                                      (128),
68         fAnalysisMC                                     (0),
69         fCase                                           (0),
70         fRemoveAutoCorr                         (0),
71         fRapidityCut                            (0),
72         fV0radius                                       (0),
73         fV0PostoPVz                                     (0),
74         fV0NegtoPVz                                     (0),
75         fDCAV0Daughters                         (0),
76         fCPAK0                                          (0),
77         fCPALam                                         (0),
78         fRejectLamK0                            (0),
79         fRejectK0Lam                            (0),
80     fSigmaPID                                   (0),
81         fCutCTK0                                        (0),
82         fCutCTLa                                        (0),
83         fMassCutK0                                      (0),
84         fMassCutLa                                      (0),
85         fTriglow                                        (0),
86         fTrighigh                                       (0),
87         fUseChargeHadrons                       (kTRUE), 
88         fPtMin                                          (0.15),
89         fOutputList                                     (0),
90         fHist_Mult_B4_Trg_Sel           (0),
91         fHist_Mult_Af_Trg_Sel           (0),
92         fHist_Mult_PVz_Cut                      (0),
93         fHist_Mult_SPD_PVz                      (0),
94         fHist_Mult_SPD_PVz_Pileup       (0),
95         fHistPVx                                        (0),
96         fHistPVy                                        (0),
97         fHistPVz                                        (0),
98         fHistPVxAnalysis                        (0),
99         fHistPVyAnalysis                        (0),
100         fHistPVzAnalysis                        (0),
101         fHistEventViceGen                       (0),
102         fHistEventViceReconst           (0),
103         fHistMCGenK0                            (0),
104         fHistMCGenLAM                           (0),
105         fHistMCGenALAM                          (0),
106         fHistReconstK0                          (0),
107         fHistReconstLA                          (0),
108         fHistReconstALA                         (0),
109         fHistMCAssoK0                           (0),
110         fHistMCAssoLA                           (0),
111         fHistMCAssoALA                          (0),
112         fHistReconstSib                         (0),
113         fHistReconstMix                         (0),
114         fHistReconstSibGEN                      (0),
115         fHistReconstMixGEN                      (0),
116         fHistReconstSibASO                      (0),
117         fHistReconstMixASO                      (0),
118         fHistTriggerSib                         (0),
119         fHistTriggerMix                         (0),
120         fHistTriggerSibGEN                      (0),
121         fHistTriggerMixGEN                      (0),
122         fHistTriggerSibASO                      (0),
123         fHistTriggerMixASO                      (0)
124 {       
125
126   for(Int_t iBin = 0; iBin < 100; iBin++){
127     fZvtxBins[iBin] = 0.;
128     fCentBins[iBin] = 0.;
129   }
130 }
131 //---------------------------------------------------------------------------------------
132 AliLeadingV0Correlation::AliLeadingV0Correlation(const char *name)
133    : AliAnalysisTaskSE(name),
134         fAODEvent                                       (0x0),
135         fPoolMgr                                        (0x0),
136     fPIDResponse                                (0x0),
137         fAnalyseUE                                      (0x0),
138         fPoolMaxNEvents                         (0), 
139         fPoolMinNTracks                         (0), 
140         fMinEventsToMix                         (0),
141         fNzVtxBins                                      (0), 
142         fNCentBins                                      (0),
143         fcollidingSys                           (""),
144         fpvzcut                                         (0),
145     fTrackEtaCut                                (0.9),
146     fFilterBit                                  (128),
147         fAnalysisMC                                     (0),
148         fCase                                           (0),
149         fRemoveAutoCorr                         (0),
150     fRapidityCut                                (0),
151         fV0radius                                       (0),
152         fV0PostoPVz                                     (0),
153         fV0NegtoPVz                                     (0),
154         fDCAV0Daughters                         (0),
155         fCPAK0                                          (0),
156         fCPALam                                         (0),
157         fRejectLamK0                            (0),
158         fRejectK0Lam                            (0),
159     fSigmaPID                                   (0),
160         fCutCTK0                                        (0),
161         fCutCTLa                                        (0),
162         fMassCutK0                                      (0),
163         fMassCutLa                                      (0),
164         fTriglow                                        (0),
165         fTrighigh                                       (0),
166         fUseChargeHadrons                       (kTRUE), 
167         fPtMin                                          (0.15),
168         fOutputList                                     (0),
169         fHist_Mult_B4_Trg_Sel           (0),
170         fHist_Mult_Af_Trg_Sel           (0),
171         fHist_Mult_PVz_Cut                      (0),
172         fHist_Mult_SPD_PVz                      (0),
173         fHist_Mult_SPD_PVz_Pileup       (0),
174         fHistPVx                                        (0),
175         fHistPVy                                        (0),
176         fHistPVz                                        (0),
177         fHistPVxAnalysis                        (0),
178         fHistPVyAnalysis                        (0),
179         fHistPVzAnalysis                        (0),
180         fHistEventViceGen                       (0),
181         fHistEventViceReconst           (0),
182         fHistMCGenK0                            (0),
183         fHistMCGenLAM                           (0),
184         fHistMCGenALAM                          (0),
185         fHistReconstK0                          (0),
186         fHistReconstLA                          (0),
187         fHistReconstALA                         (0),
188         fHistMCAssoK0                           (0),
189         fHistMCAssoLA                           (0),
190         fHistMCAssoALA                          (0),
191         fHistReconstSib                         (0),
192         fHistReconstMix                         (0),
193         fHistReconstSibGEN                      (0),
194         fHistReconstMixGEN                      (0),
195         fHistReconstSibASO                      (0),
196         fHistReconstMixASO                      (0),
197         fHistTriggerSib                         (0),
198         fHistTriggerMix                         (0),
199         fHistTriggerSibGEN                      (0),
200         fHistTriggerMixGEN                      (0),
201         fHistTriggerSibASO                      (0),
202         fHistTriggerMixASO                      (0)
203
204 {       
205   for(Int_t iBin = 0; iBin < 100; iBin++){
206     fZvtxBins[iBin] = 0.;
207     fCentBins[iBin] = 0.;
208   }
209   DefineOutput(1, TList::Class());                                            
210 }
211
212 //---------------------------------------------------------------------------------------
213 AliLeadingV0Correlation::~AliLeadingV0Correlation()
214 {
215    if (fOutputList && !AliAnalysisManager::GetAnalysisManager()->IsProofMode()) {
216       delete fOutputList;
217    }
218 }
219 //---------------------------------------------------------------------------------------
220 void AliLeadingV0Correlation::UserCreateOutputObjects()
221 {       
222         fAnalyseUE =new AliAnalyseLeadingTrackUE();
223         if(!fAnalysisMC)
224         {
225         fAnalyseUE->SetParticleSelectionCriteria(fFilterBit,fUseChargeHadrons,fTrackEtaCut,fPtMin);
226         fAnalyseUE->DefineESDCuts(fFilterBit);
227         }
228         
229         fOutputList = new TList();
230         fOutputList->SetOwner();
231         
232         fHist_Mult_B4_Trg_Sel = new TH1F("fHist_Mult_B4_Trg_Sel","Tracks per event;Nbr of Tracks;Events", 1000, 0, 10000);              
233         fOutputList->Add(fHist_Mult_B4_Trg_Sel);
234         
235         fHist_Mult_Af_Trg_Sel = new TH1F("fHist_Mult_Af_Trg_Sel","Tracks per event;Nbr of Tracks;Events",1000, 0, 10000);               
236         fOutputList->Add(fHist_Mult_Af_Trg_Sel);
237         
238         fHist_Mult_PVz_Cut = new TH1F("fHist_Mult_PVz_Cut","Tracks per event;Nbr of Tracks;Events",1000, 0, 10000);             
239         fOutputList->Add(fHist_Mult_PVz_Cut);
240         
241         fHist_Mult_SPD_PVz = new TH1F("fHist_Mult_SPD_PVz","Tracks per event;Nbr of Tracks;Events",1000, 0, 10000);             
242         fOutputList->Add(fHist_Mult_SPD_PVz);
243         
244         fHist_Mult_SPD_PVz_Pileup = new TH1F("fHist_Mult_SPD_PVz_Pileup","Tracks per event;Nbr of Tracks;Events",1000, 0, 10000);               
245         fOutputList->Add(fHist_Mult_SPD_PVz_Pileup);
246         
247         fHistPVx = new TH1F("fHistPVx","PV x position;Nbr of Evts;x", 200, -0.5, 0.5);          
248         fOutputList->Add(fHistPVx);
249         
250         fHistPVy = new TH1F("fHistPVy","PV y position;Nbr of Evts;y",200, -0.5, 0.5);           
251         fOutputList->Add(fHistPVy);
252         
253         fHistPVz = new TH1F("fHistPVz","PV z position;Nbr of Evts;z",400, -20, 20);             
254         fOutputList->Add(fHistPVz);
255         
256         fHistPVxAnalysis = new TH1F("fHistPVxAnalysis","PV x position;Nbr of Evts;x", 200, -0.5, 0.5);          
257         fOutputList->Add(fHistPVxAnalysis);
258         
259         fHistPVyAnalysis = new TH1F("fHistPVyAnalysis","PV y position;Nbr of Evts;y",200, -0.5, 0.5);           
260         fOutputList->Add(fHistPVyAnalysis);
261         
262         fHistPVzAnalysis = new TH1F("fHistPVzAnalysis","PV z position;Nbr of Evts;z",400, -20, 20);             
263         fOutputList->Add(fHistPVzAnalysis);
264         
265         //---------------------------------------------- Events histograms -----------------------------------------------------//
266         
267         fHistEventViceGen= new TH2F("fHistEventViceGen", "fHistEventViceGen", 200, -20, 20, 100,0,300);
268         fOutputList->Add(fHistEventViceGen);
269         
270         fHistEventViceReconst= new TH2F("fHistEventViceReconst", "fHistEventViceReconst", 200, -20, 20, 100,0,300);
271         fOutputList->Add(fHistEventViceReconst);
272         
273         fHistMCGenLAM  = new TH2F("fHistMCGenLAM" , "fHistMCGenLAM" , 120, 0, 6, 140,1.06,1.2);
274         fOutputList->Add(fHistMCGenLAM);
275         
276         fHistMCGenALAM = new TH2F("fHistMCGenALAM", "fHistMCGenALAM", 120, 0, 6, 140,1.06,1.2);
277         fOutputList->Add(fHistMCGenALAM);
278         
279         fHistMCGenK0   = new TH2F("fHistMCGenK0"  , "fHistMCGenK0"  , 120, 0, 6, 200,0.4,0.6);
280         fOutputList->Add(fHistMCGenK0);
281         
282         fHistReconstK0= new TH2F("fHistReconstK0"  , "fHistReconstK0",  120, 0, 6, 200,0.4,0.6);
283         fHistReconstK0->Sumw2();
284         fOutputList->Add(fHistReconstK0);
285         
286         fHistReconstLA= new TH2F("fHistReconstLA"  , "fHistReconstLA",  120, 0, 6, 140,1.06,1.2);
287         fHistReconstLA->Sumw2();
288         fOutputList->Add(fHistReconstLA);
289         
290         fHistReconstALA= new TH2F("fHistReconstALA", "fHistReconstALA", 120, 0, 6, 140,1.06,1.2);
291         fHistReconstALA->Sumw2();
292         fOutputList->Add(fHistReconstALA);
293         
294         fHistMCAssoK0= new TH2F("fHistMCAssoK0"   , "fHistMCAssoK0"   , 120, 0, 6, 200,0.4,0.6);
295         fHistMCAssoK0->Sumw2();
296         fOutputList->Add(fHistMCAssoK0);
297         
298         fHistMCAssoLA= new TH2F("fHistMCAssoLA"   , "fHistMCAssoLA"   , 120, 0, 6, 140,1.06,1.2);
299         fHistMCAssoLA->Sumw2();
300         fOutputList->Add(fHistMCAssoLA);
301         
302         fHistMCAssoALA= new TH2F("fHistMCAssoALA" , "fHistMCAssoALA" ,  120, 0, 6, 140,1.06,1.2);
303         fHistMCAssoALA->Sumw2();
304         fOutputList->Add(fHistMCAssoALA);
305         
306         //--------------------------------------------Correlation Histos -----------------------------------------------------//
307         
308         //0-pTK0,1-PhiK0,2-EtaK0,3-DPhiK0,4-DEtaK0,5-TYPE,6-CutSet
309         const Int_t ndimsv0CORR = 8;       
310         Int_t    binsv0CORR[ndimsv0CORR] = {120, 200,          200,CorrBinsX,      CorrBinsY,4,500,500};
311         
312         Double_t xminv0CORR[ndimsv0CORR] = {  0,   0,-fTrackEtaCut,    -PI/2,-2*fTrackEtaCut,0,  0,  0};
313         
314         Double_t xmaxv0CORR[ndimsv0CORR] = {  6,2*PI, fTrackEtaCut,   3*PI/2, 2*fTrackEtaCut,4, 10, 10};
315         
316         fHistReconstSib= new THnSparseD("fHistReconstSib", "fHistReconstSib", ndimsv0CORR, binsv0CORR, xminv0CORR, xmaxv0CORR);
317         fHistReconstSib->Sumw2();
318         fOutputList->Add(fHistReconstSib);
319         
320         fHistReconstMix= new THnSparseD("fHistReconstMix", "fHistReconstMix", ndimsv0CORR, binsv0CORR, xminv0CORR, xmaxv0CORR);
321         fHistReconstMix->Sumw2();
322         fOutputList->Add(fHistReconstMix);
323         
324         fHistReconstSibGEN= new THnSparseD("fHistReconstSibGEN", "fHistReconstSibGEN", ndimsv0CORR, binsv0CORR, xminv0CORR, xmaxv0CORR);
325         fHistReconstSibGEN->Sumw2();
326         fOutputList->Add(fHistReconstSibGEN);
327         
328         fHistReconstMixGEN= new THnSparseD("fHistReconstMixGEN", "fHistReconstMixGEN", ndimsv0CORR, binsv0CORR, xminv0CORR, xmaxv0CORR);
329         fHistReconstMixGEN->Sumw2();
330         fOutputList->Add(fHistReconstMixGEN);
331         
332         fHistReconstSibASO= new THnSparseD("fHistReconstSibASO", "fHistReconstSibASO", ndimsv0CORR, binsv0CORR, xminv0CORR, xmaxv0CORR);
333         fHistReconstSibASO->Sumw2();
334         fOutputList->Add(fHistReconstSibASO);
335         
336         fHistReconstMixASO= new THnSparseD("fHistReconstMixASO", "fHistReconstMixASO", ndimsv0CORR, binsv0CORR, xminv0CORR, xmaxv0CORR);
337         fHistReconstMixASO->Sumw2();
338         fOutputList->Add(fHistReconstMixASO);
339         
340         
341         fHistTriggerSib= new TH1F("fHistTriggerSib", "fHistTriggerSib", 100, fTriglow, fTrighigh);
342         fHistTriggerSib->Sumw2();
343         fOutputList->Add(fHistTriggerSib);
344         
345         fHistTriggerMix= new TH1F("fHistTriggerMix", "fHistTriggerMix", 100, fTriglow, fTrighigh);
346         fHistTriggerMix->Sumw2();
347         fOutputList->Add(fHistTriggerMix);
348         
349         fHistTriggerSibGEN= new TH1F("fHistTriggerSibGEN", "fHistTriggerSibGEN", 100, fTriglow, fTrighigh);
350         fHistTriggerSibGEN->Sumw2();
351         fOutputList->Add(fHistTriggerSibGEN);
352         
353         fHistTriggerMixGEN= new TH1F("fHistTriggerMixGEN", "fHistTriggerMixGEN", 100, fTriglow, fTrighigh);
354         fHistTriggerMixGEN->Sumw2();
355         fOutputList->Add(fHistTriggerMixGEN);
356         
357         fHistTriggerSibASO= new TH1F("fHistTriggerSibASO", "fHistTriggerSibASO", 100, fTriglow, fTrighigh);
358         fHistTriggerSibASO->Sumw2();
359         fOutputList->Add(fHistTriggerSibASO);
360         
361         fHistTriggerMixASO= new TH1F("fHistTriggerMixASO", "fHistTriggerMixASO", 100, fTriglow, fTrighigh);
362         fHistTriggerMixASO->Sumw2();
363         fOutputList->Add(fHistTriggerMixASO);
364         
365         //----------------------------------------------Event Pool-----------------------------------------------------//
366         fPoolMgr = new AliEventPoolManager(fPoolMaxNEvents, fPoolMinNTracks, fNCentBins, fCentBins, fNzVtxBins, fZvtxBins);
367         if(!fPoolMgr) return;
368         
369         PostData(1, fOutputList);
370 }
371 //---------------------------------------------------------------------------------------
372 void AliLeadingV0Correlation::UserExec(Option_t *)
373 {
374         
375     AliAnalysisManager   *mgr      = AliAnalysisManager::GetAnalysisManager();
376     AliInputEventHandler *inEvMain = (AliInputEventHandler*)(mgr->GetInputEventHandler());
377         if (!inEvMain) return;
378         
379         // Pointers to PID Response objects.    
380         fPIDResponse = inEvMain->GetPIDResponse();
381         if(!fPIDResponse) return;
382         
383     fAODEvent = dynamic_cast<AliAODEvent*>(inEvMain->GetEvent());
384         if(!fAODEvent) return;
385         
386         Int_t multiplicity    = -1;
387         Int_t multiplicityMC  = -1;
388         Double_t MultipOrCent = -1; 
389         Double_t CentPecentMC = -1;
390         Double_t CentPecentAfterPhySel    = -1;
391         Int_t    nTrackMultiplicity       = -1;
392         Float_t lPrimaryTrackMultiplicity = 0;
393         
394         nTrackMultiplicity              = (InputEvent())->GetNumberOfTracks();
395     for (Int_t itrack = 0; itrack<nTrackMultiplicity; itrack++) {
396                 AliAODTrack* track = fAODEvent->GetTrack(itrack);
397                 if(!fAnalysisMC) if (track->TestFilterBit(fFilterBit)) lPrimaryTrackMultiplicity++;
398                 lPrimaryTrackMultiplicity++;
399     }
400
401         fHist_Mult_B4_Trg_Sel->Fill(lPrimaryTrackMultiplicity);
402         
403         if(fcollidingSys=="PbPb"){   
404         AliCentrality *centralityObjMC = fAODEvent->GetHeader()->GetCentralityP();
405                 CentPecentMC  = centralityObjMC->GetCentralityPercentileUnchecked("V0M");
406                 if ((CentPecentMC < 0.)||(CentPecentMC > 90)) return;
407         }
408         
409         Double_t * CentBins = fCentBins;
410         Double_t poolmin    = CentBins[0];
411         Double_t poolmax    = CentBins[fNCentBins];
412         
413         //----------------------------------------------------------
414         // Efficency denomenator comes before the physics selection
415         //----------------------------------------------------------
416         
417         Double_t  dimEventviceMC[3];
418         if(fAnalysisMC)    //Efficency denomenator comes before the physics selection
419         {
420                 AliAODMCHeader *aodMCheader = (AliAODMCHeader*)fAODEvent->FindListObject(AliAODMCHeader::StdBranchName());
421                 Float_t mcZv = aodMCheader->GetVtxZ();
422                 
423                 if (TMath::Abs(mcZv) >= fpvzcut) return;
424                 
425                 dimEventviceMC[0]=aodMCheader->GetVtxZ();
426                 
427                 TClonesArray *mcArray = (TClonesArray*)fAODEvent->FindListObject(AliAODMCParticle::StdBranchName());
428                 if(!mcArray)return;
429                 
430                 Int_t nMCTracks = mcArray->GetEntriesFast();
431                 
432                 if(fcollidingSys=="PbPb") multiplicityMC=CentPecentMC;
433                 if(fcollidingSys=="PP")   multiplicityMC=nMCTracks;
434                 
435                 dimEventviceMC[1]=nMCTracks;
436                 dimEventviceMC[2]=CentPecentMC;
437                 fHistEventViceGen->Fill(dimEventviceMC[0],dimEventviceMC[1]);
438                 
439                 TObjArray *selectedTracksLeadingMC=fAnalyseUE->FindLeadingObjects(mcArray);
440                 if(!selectedTracksLeadingMC) return;
441                 selectedTracksLeadingMC->SetOwner(kTRUE);
442                 
443                 TObjArray * selectedV0sMC =new TObjArray;
444                 selectedV0sMC->SetOwner(kTRUE);
445                 
446                 for (Int_t iMC = 0; iMC<nMCTracks; iMC++)
447                 {
448                         AliAODMCParticle *mcTrack = (AliAODMCParticle*)mcArray->At(iMC);
449                         if (!mcTrack) continue;
450                         // Charged track Generated level
451                         Double_t mcTrackPt  = mcTrack->Pt();
452                         if ((mcTrackPt<fPtMin)||(mcTrackPt>6.0)) continue;
453                         
454                         Double_t mcTrackEta = mcTrack->Eta();
455                         Double_t mcTrackPhi = mcTrack->Phi();
456                         Bool_t TrIsPrime    = mcTrack->IsPhysicalPrimary();
457                         Bool_t TrPtMin      = mcTrackPt>fPtMin;
458                         Bool_t TrCharge     = (mcTrack->Charge())!=0;
459                         
460                         if (!TrIsPrime  && !TrPtMin && !TrCharge) continue;  //Check Point 1
461                         
462                         // V0 Generated level
463                         Int_t mcPartPdg           = mcTrack->GetPdgCode();
464                         
465                         Double_t mcRapidity   = mcTrack->Y();
466                         Bool_t V0RapMax       = TMath::Abs(mcRapidity)<fRapidityCut;
467                         Double_t mcMass       = mcTrack->M();
468                         
469                         Double_t mcK0[3] = {mcTrackPt,mcMass,multiplicityMC};
470                         Double_t mcLa[3] = {mcTrackPt,mcMass,multiplicityMC};
471                         Double_t mcAl[3] = {mcTrackPt,mcMass,multiplicityMC};
472                         
473                         
474                         Bool_t IsK0 = mcPartPdg==310;
475                         if (IsK0 && V0RapMax && TrIsPrime) 
476                         {
477                                 fHistMCGenK0->Fill(mcK0[0],mcK0[1]);
478                                 selectedV0sMC->Add(new V0Correlationparticle(mcTrackEta,mcTrackPhi,mcTrackPt,1,0,0));
479                         } 
480                         
481                         Bool_t IsLambda = mcPartPdg==3122;
482                         if (IsLambda && V0RapMax && TrIsPrime) 
483                         {
484                                 fHistMCGenLAM->Fill(mcLa[0],mcLa[1]);
485                                 selectedV0sMC->Add(new V0Correlationparticle(mcTrackEta,mcTrackPhi,mcTrackPt,2,0,0));
486                         }
487                         
488                         Bool_t IsAntiLambda = mcPartPdg==-3122;
489                         if (IsAntiLambda && V0RapMax && TrIsPrime) 
490                         {       
491                                 fHistMCGenALAM->Fill(mcAl[0],mcAl[1]);
492                                 selectedV0sMC->Add(new V0Correlationparticle(mcTrackEta,mcTrackPhi,mcTrackPt,3,0,0));
493                         }                       
494                 }
495                 
496                 FillCorrelationSibling(multiplicityMC,selectedTracksLeadingMC,selectedV0sMC,fHistTriggerSibGEN,fHistReconstSibGEN);
497                 FillCorrelationMixing(multiplicityMC,mcZv,poolmax,poolmin,selectedTracksLeadingMC,selectedV0sMC,fHistTriggerMixGEN,fHistReconstMixGEN);
498     }
499         
500         // End Loop over MC condition
501         
502         //------------------------------------------------
503         // Physics Selection
504         //------------------------------------------------ 
505         UInt_t maskIsSelected = inEvMain->IsEventSelected();
506         Bool_t isSelected = ((maskIsSelected & AliVEvent::kMB)== AliVEvent::kMB 
507                                           || (maskIsSelected & AliVEvent::kCentral)== AliVEvent::kCentral 
508                                           || (maskIsSelected & AliVEvent::kSemiCentral)== AliVEvent::kSemiCentral);
509     if (!isSelected) return;
510         
511         //------------------------------------------------
512         // After Trigger Selection
513         //------------------------------------------------
514         
515         fHist_Mult_Af_Trg_Sel->Fill(lPrimaryTrackMultiplicity);
516         
517         //------------------------------------------------
518         // Getting: Primary Vertex + MagField Info
519         //------------------------------------------------
520         Double_t  dimEventviceReal[3];
521         Double_t  lBestPrimaryVtxPos[3];
522         Double_t  tPrimaryVtxPosition[3];
523         Double_t  lV0Position[3];
524         
525         
526         if(fcollidingSys=="PbPb"){  //
527         AliCentrality *centralityObj = fAODEvent->GetHeader()->GetCentralityP();
528                 CentPecentAfterPhySel  = centralityObj->GetCentralityPercentileUnchecked("V0M");
529                 if ((CentPecentAfterPhySel < 0.)||(CentPecentAfterPhySel > 90)) return;
530         } //
531         
532         AliAODVertex *lPrimaryBestAODVtx = fAODEvent->GetPrimaryVertex();
533         if (!lPrimaryBestAODVtx) return;
534         // get the best primary vertex available for the event
535         // As done in AliCascadeVertexer, we keep the one which is the best one available.
536         // between : Tracking vertex > SPD vertex > TPC vertex > default SPD vertex
537         // This one will be used for next calculations (DCA essentially)
538         lPrimaryBestAODVtx->GetXYZ(lBestPrimaryVtxPos);
539         
540         const AliVVertex *primaryVtx = fAODEvent->GetPrimaryVertex();
541         tPrimaryVtxPosition[0] = primaryVtx->GetX();
542         tPrimaryVtxPosition[1] = primaryVtx->GetY();
543         tPrimaryVtxPosition[2] = primaryVtx->GetZ();
544         fHistPVx->Fill( tPrimaryVtxPosition[0] );
545         fHistPVy->Fill( tPrimaryVtxPosition[1] );
546         fHistPVz->Fill( tPrimaryVtxPosition[2] );
547         
548         //------------------------------------------------
549         // Primary Vertex Z position: SKIP
550         //------------------------------------------------
551         
552         Double_t lPVx = lBestPrimaryVtxPos[0];
553         Double_t lPVy = lBestPrimaryVtxPos[1];
554         Double_t lPVz = lBestPrimaryVtxPos[2];
555         
556         if ((TMath::Abs(lPVz)) >= fpvzcut) return ;
557         if (TMath::Abs(lPVx)<10e-5 && TMath::Abs(lPVy)<10e-5 && TMath::Abs(lPVz)<10e-5) return;
558         fHist_Mult_PVz_Cut->Fill(lPrimaryTrackMultiplicity);
559         
560         //------------------------------------------------
561         // Only look at events with well-established PV
562         //------------------------------------------------
563         
564         const AliAODVertex *lPrimaryTrackingAODVtxCheck = fAODEvent->GetPrimaryVertex();
565         const AliAODVertex *lPrimarySPDVtx = fAODEvent->GetPrimaryVertexSPD();
566         if (!lPrimarySPDVtx && !lPrimaryTrackingAODVtxCheck )return;
567         
568         fHist_Mult_SPD_PVz->Fill(lPrimaryTrackMultiplicity);
569
570         
571         //------------------------------------------------
572         // Pileup Rejection
573         //------------------------------------------------
574         
575         // FIXME : quality selection regarding pile-up rejection 
576         if(fAODEvent->IsPileupFromSPD()) return;
577         fHist_Mult_SPD_PVz_Pileup->Fill(lPrimaryTrackMultiplicity);
578         
579         fHistPVxAnalysis->Fill(tPrimaryVtxPosition[0]);
580         fHistPVyAnalysis->Fill(tPrimaryVtxPosition[1]);
581         fHistPVzAnalysis->Fill(tPrimaryVtxPosition[2]);
582         
583     dimEventviceReal[0]=tPrimaryVtxPosition[2];
584         multiplicity       = fAODEvent->GetNTracks();
585         
586         dimEventviceReal[1]=multiplicity;
587         dimEventviceReal[2]=CentPecentAfterPhySel;
588         
589         fHistEventViceReconst->Fill(dimEventviceReal[0],dimEventviceReal[1]);
590         
591         if(fcollidingSys=="PP")MultipOrCent=multiplicity;
592         if(fcollidingSys=="PbPb")MultipOrCent=CentPecentAfterPhySel;
593
594         //---------------------------------------------------------------------------------------------
595         
596         Double_t lDcaPosToPrimVertex = 0;Double_t lDcaNegToPrimVertex = 0;Double_t lDcaV0Daughters     = 0;
597         Double_t lV0cosPointAngle    = 0;Double_t lV0DecayLength      = 0;Double_t lV0Radius           = 0;
598         Double_t lcTauLambda         = 0;Double_t lcTauAntiLambda     = 0;   
599         Double_t lcTauK0s            = 0;   
600         
601         Double_t lInvMassK0   = 0, lInvMassLambda    = 0, lInvMassAntiLambda = 0;
602         Double_t lPtV0s       = 0; Double_t lPhiV0s  = 0; Double_t lEtaV0s   = 0;
603         Double_t lRapK0s      = 0, lRapLambda        = 0, lRapAntiLambda     = 0;
604         Double_t lPzV0s       = 0; Double_t lAlphaV0 = 0, lPtArmV0           = 0;
605         Double_t lPV0s        = 0;
606         
607         TObjArray *selectedTracksLeading=0;
608         selectedTracksLeading=fAnalyseUE->FindLeadingObjects(fAODEvent);
609         if(!selectedTracksLeading) return;
610         selectedTracksLeading->SetOwner(kTRUE);
611         
612         TObjArray * selectedV0s = new TObjArray;
613         selectedV0s->SetOwner(kTRUE);
614         
615         TObjArray * selectedV0sAssoc = new TObjArray;
616         selectedV0sAssoc->SetOwner(kTRUE);
617         
618         Int_t nV0s = fAODEvent->GetNumberOfV0s();
619         
620         for (Int_t i = 0; i < nV0s; i++) 
621         { // start of V0 slection loop
622                 AliAODv0* aodV0 = dynamic_cast<AliAODv0 *>(fAODEvent->GetV0(i));
623                 if (!aodV0) continue;
624                 
625                 if (((aodV0->Pt())<fPtMin)||((aodV0->Pt())>6.0)) continue;
626                 
627                 // get daughters
628             AliAODTrack *myTrackPos=(AliAODTrack *)(aodV0->GetDaughter(0));
629         AliAODTrack *myTrackNeg=(AliAODTrack *)(aodV0->GetDaughter(1));
630                 
631                 if (!myTrackPos || !myTrackNeg) {Printf("ERROR: Could not retreive one of the daughter track");continue;}
632                 
633         if (!IsAcseptedV0(aodV0,myTrackPos,myTrackNeg)) continue;
634                 
635                 // VO's main characteristics to check the reconstruction cuts
636                 lDcaV0Daughters    = aodV0->DcaV0Daughters();
637                 lV0cosPointAngle   = aodV0->CosPointingAngle(lBestPrimaryVtxPos);
638                 
639                 aodV0->GetXYZ(lV0Position);
640                 
641                 lV0Radius      = TMath::Sqrt(lV0Position[0]*lV0Position[0]+lV0Position[1]*lV0Position[1]);
642                 lV0DecayLength = TMath::Sqrt(TMath::Power(lV0Position[0] - tPrimaryVtxPosition[0],2) +
643                                                                          TMath::Power(lV0Position[1] - tPrimaryVtxPosition[1],2) +
644                                                                          TMath::Power(lV0Position[2] - tPrimaryVtxPosition[2],2));
645                 
646                 // DCA between daughter and Primary Vertex:
647                 if (myTrackPos) lDcaPosToPrimVertex = aodV0->DcaPosToPrimVertex();
648                 if (myTrackNeg) lDcaNegToPrimVertex = aodV0->DcaNegToPrimVertex();      
649                 
650                 // Quality tracks cuts:
651                 if ( !(IsAcseptedDaughterTrack(myTrackPos)) || !(IsAcseptedDaughterTrack(myTrackNeg)) ) { continue;}
652                 
653                 // Armenteros variables:
654                 lAlphaV0      =  aodV0->AlphaV0();
655                 lPtArmV0      =  aodV0->PtArmV0();
656                 
657                 // Invariant mass
658                 lInvMassK0         = aodV0->MassK0Short();
659                 lInvMassLambda     = aodV0->MassLambda();
660                 lInvMassAntiLambda = aodV0->MassAntiLambda();
661                 
662                 lPtV0s = aodV0->Pt();
663                 lPhiV0s= aodV0->Phi();
664                 lEtaV0s= aodV0->Eta();
665                 lPzV0s = aodV0->Pz();
666                 
667                 // Rapidity:
668                 lRapK0s    = aodV0->RapK0Short();
669                 lRapLambda = aodV0->RapLambda();
670                 lRapAntiLambda = aodV0->Y(-3122);               
671                 
672                 if (lPtV0s==0) {continue;}
673                 
674         Float_t nSigmaPosPion   = 0.;
675         Float_t nSigmaNegPion   = 0.;
676         Float_t nSigmaPosProton = 0.;
677         Float_t nSigmaNegProton = 0.;
678                 
679         const AliAODPid *pPid = myTrackPos->GetDetPid();
680         const AliAODPid *nPid = myTrackNeg->GetDetPid();
681                 
682         if (pPid)
683         {
684             Double_t pdMom = pPid->GetTPCmomentum();
685             if (pdMom<1.0 && (fcollidingSys=="PbPb"))
686             {
687                 nSigmaPosPion   = fPIDResponse->NumberOfSigmasTPC(myTrackPos, AliPID::kPion);
688                 nSigmaPosProton = fPIDResponse->NumberOfSigmasTPC(myTrackPos, AliPID::kProton);
689             }
690                         
691                         if (fcollidingSys=="PP")
692             {
693                 nSigmaPosPion   = fPIDResponse->NumberOfSigmasTPC(myTrackPos, AliPID::kPion);
694                 nSigmaPosProton = fPIDResponse->NumberOfSigmasTPC(myTrackPos, AliPID::kProton);
695             }
696         }
697                 
698         if (nPid)
699         {
700             Double_t ndMom = nPid->GetTPCmomentum();
701             if (ndMom<1.0 && (fcollidingSys=="PbPb"))
702             {
703                 nSigmaNegPion   = fPIDResponse->NumberOfSigmasTPC(myTrackNeg, AliPID::kPion);
704                 nSigmaNegProton = fPIDResponse->NumberOfSigmasTPC(myTrackNeg, AliPID::kProton);
705             }
706                         
707                         if (fcollidingSys=="PP")
708             {
709                 nSigmaNegPion   = fPIDResponse->NumberOfSigmasTPC(myTrackNeg, AliPID::kPion);
710                 nSigmaNegProton = fPIDResponse->NumberOfSigmasTPC(myTrackNeg, AliPID::kProton);
711             }
712         }
713                 Bool_t bpPion   = TMath::Abs(nSigmaPosPion)   <= fSigmaPID;
714         Bool_t bpProton = TMath::Abs(nSigmaPosProton) <= fSigmaPID;
715         Bool_t bnPion   = TMath::Abs(nSigmaNegPion)   <= fSigmaPID;
716         Bool_t bnProton = TMath::Abs(nSigmaNegProton) <= fSigmaPID;
717                 
718         Bool_t cutK0Pid         = (bpPion   && bnPion)  ;
719         Bool_t cutLambdaPid     = (bpProton && bnPion)  ;
720         Bool_t cutAntiLambdaPid = (bpPion   && bnProton);
721         //--------------------------------------------------
722                 
723                 lPV0s = TMath::Sqrt(lPzV0s*lPzV0s + lPtV0s*lPtV0s);
724                 
725                 if(lPV0s > 0) lcTauLambda     = (lV0DecayLength*lInvMassLambda)/lPV0s;
726                 if(lPV0s > 0) lcTauAntiLambda = (lV0DecayLength*lInvMassAntiLambda)/lPV0s; 
727                 if(lPV0s > 0) lcTauK0s        = (lV0DecayLength*lInvMassK0)/lPV0s;      
728                 
729                 Bool_t k0ctcut = (lcTauK0s        < fCutCTK0);
730                 Bool_t lactcut = (lcTauLambda     < fCutCTLa);
731                 Bool_t alactcut= (lcTauAntiLambda < fCutCTLa);
732
733                 Bool_t k0APcut = (lPtArmV0>(TMath::Abs(0.2*lAlphaV0)));
734                 
735                 Bool_t k0Rapcut = (TMath::Abs(lRapK0s)        < fRapidityCut);
736                 Bool_t laRapcut = (TMath::Abs(lRapLambda)     < fRapidityCut);
737                 Bool_t alaRapcut= (TMath::Abs(lRapAntiLambda) < fRapidityCut);
738                 
739                 if(fcollidingSys=="PbPb")if(lV0Radius>=100) continue;
740                 
741                 Bool_t k0cutset = IsAcseptedK0(lV0Radius,lDcaPosToPrimVertex,lDcaNegToPrimVertex,lDcaV0Daughters,lV0cosPointAngle,lInvMassLambda,lInvMassAntiLambda);
742                 Bool_t lacutset = IsAcseptedLA(lV0Radius,lDcaPosToPrimVertex,lDcaNegToPrimVertex,lDcaV0Daughters,lV0cosPointAngle,lInvMassK0);
743                 Bool_t alacutset= IsAcseptedLA(lV0Radius,lDcaNegToPrimVertex,lDcaPosToPrimVertex,lDcaV0Daughters,lV0cosPointAngle,lInvMassK0);
744                 
745                 Double_t spK0[3] = {lPtV0s,lInvMassK0,MultipOrCent};
746                 Double_t spLa[3] = {lPtV0s,lInvMassLambda,MultipOrCent};
747                 Double_t spAl[3] = {lPtV0s,lInvMassAntiLambda,MultipOrCent};
748         
749                 switch (fCase) {
750                         case 1:
751                                 fHistReconstK0->Fill(spK0[0],spK0[1]); 
752                                 if(IsK0InvMass(lInvMassK0))selectedV0s->Add(new V0Correlationparticle(lEtaV0s,lPhiV0s,lPtV0s,1,lDcaPosToPrimVertex,lDcaNegToPrimVertex));
753                                 
754                                 fHistReconstLA->Fill(spLa[0],spLa[1]); 
755                                 if(IsLambdaInvMass(lInvMassLambda))selectedV0s->Add(new V0Correlationparticle(lEtaV0s,lPhiV0s,lPtV0s,2,lDcaPosToPrimVertex,lDcaNegToPrimVertex));
756                                 
757                                 fHistReconstALA->Fill(spAl[0],spAl[1]);
758                                 if(IsLambdaInvMass(lInvMassAntiLambda))selectedV0s->Add(new V0Correlationparticle(lEtaV0s,lPhiV0s,lPtV0s,3,lDcaPosToPrimVertex,lDcaNegToPrimVertex));
759                                 
760                                 break;
761                                 
762                         case 2:
763                                 if(k0ctcut && k0Rapcut && k0cutset && cutK0Pid)
764                                 {
765                                         fHistReconstK0->Fill(spK0[0],spK0[1]); 
766                                         if(IsK0InvMass(lInvMassK0))selectedV0s->Add(new V0Correlationparticle(lEtaV0s,lPhiV0s,lPtV0s,1,lDcaPosToPrimVertex,lDcaNegToPrimVertex));
767                                 }
768                                 
769                                 if (lactcut && laRapcut && lacutset && cutLambdaPid)
770                                 {
771                                         fHistReconstLA->Fill(spLa[0],spLa[1]); 
772                                         if(IsLambdaInvMass(lInvMassLambda))selectedV0s->Add(new V0Correlationparticle(lEtaV0s,lPhiV0s,lPtV0s,2,lDcaPosToPrimVertex,lDcaNegToPrimVertex));
773                                 }
774                                 
775                                 if (alactcut && alaRapcut && alacutset && cutAntiLambdaPid)
776                                 {
777                                         fHistReconstALA->Fill(spAl[0],spAl[1]);
778                                         if(IsLambdaInvMass(lInvMassAntiLambda))selectedV0s->Add(new V0Correlationparticle(lEtaV0s,lPhiV0s,lPtV0s,3,lDcaPosToPrimVertex,lDcaNegToPrimVertex));
779                                 }
780
781                                 break;
782                                 
783                         case 3:
784                                 if(k0ctcut && k0Rapcut && k0cutset && cutK0Pid && k0APcut)
785                                 {
786                                         fHistReconstK0->Fill(spK0[0],spK0[1]); 
787                                         if(IsK0InvMass(lInvMassK0))selectedV0s->Add(new V0Correlationparticle(lEtaV0s,lPhiV0s,lPtV0s,1,lDcaPosToPrimVertex,lDcaNegToPrimVertex));
788                                 }
789                                 
790                                 if (lactcut && laRapcut && lacutset && cutLambdaPid)
791                                 {
792                                         fHistReconstLA->Fill(spLa[0],spLa[1]); 
793                                         if(IsLambdaInvMass(lInvMassLambda))selectedV0s->Add(new V0Correlationparticle(lEtaV0s,lPhiV0s,lPtV0s,2,lDcaPosToPrimVertex,lDcaNegToPrimVertex));
794                                 }
795                                 
796                                 if (alactcut && alaRapcut && alacutset && cutAntiLambdaPid)
797                                 {
798                                         fHistReconstALA->Fill(spAl[0],spAl[1]);
799                                         if(IsLambdaInvMass(lInvMassAntiLambda))selectedV0s->Add(new V0Correlationparticle(lEtaV0s,lPhiV0s,lPtV0s,3,lDcaPosToPrimVertex,lDcaNegToPrimVertex));
800                                 }
801                                 break;
802                                 
803                         default:
804                                 AliInfo(Form("No case selected"));
805                                 break;
806                 }
807                 
808         if (fAnalysisMC)
809         {
810                 TClonesArray *mcArray = (TClonesArray*)fAODEvent->FindListObject(AliAODMCParticle::StdBranchName());
811                 if(!mcArray)return;
812                 
813                         Int_t myTrackPosLabel        = TMath::Abs(myTrackPos->GetLabel());
814                         Int_t myTrackNegLabel        = TMath::Abs(myTrackNeg->GetLabel());
815                         
816                         AliAODMCParticle *mcPosTrack = (AliAODMCParticle*)mcArray->At(myTrackPosLabel);
817                         AliAODMCParticle *mcNegTrack = (AliAODMCParticle*)mcArray->At(myTrackNegLabel);
818                         
819                         Int_t PosDaughterPdg = mcPosTrack->GetPdgCode();
820                         Int_t NegDaughterPdg = mcNegTrack->GetPdgCode();
821                         
822                         Int_t myTrackPosMotherLabel = mcPosTrack->GetMother();
823                         Int_t myTrackNegMotherLabel = mcNegTrack->GetMother();
824                         
825                         if ((myTrackPosMotherLabel==-1)||(myTrackNegMotherLabel==-1)) continue;
826                         if (myTrackPosMotherLabel!=myTrackNegMotherLabel) continue;
827                         
828                         AliAODMCParticle *mcPosMother = (AliAODMCParticle*)mcArray->At(myTrackPosMotherLabel);
829                         Int_t MotherPdg  = mcPosMother->GetPdgCode();
830                         Bool_t IsPrime   = mcPosMother->IsPhysicalPrimary();
831                         
832                         Double_t rcK0[3] = {lPtV0s,lInvMassK0,MultipOrCent};
833                         Double_t rcLa[3] = {lPtV0s,lInvMassLambda,MultipOrCent};
834                         Double_t rcAl[3] = {lPtV0s,lInvMassAntiLambda,MultipOrCent};
835                         
836                         switch (fCase) {
837                                 case 1:
838                                         fHistMCAssoK0->Fill(rcK0[0],rcK0[1]);
839                                         if(IsK0InvMass(lInvMassK0))selectedV0sAssoc->Add(new V0Correlationparticle(lEtaV0s,lPhiV0s,lPtV0s,1,0,0));
840                                         
841                                         fHistMCAssoLA->Fill(rcLa[0],rcLa[1]);
842                                         if(IsLambdaInvMass(lInvMassLambda))selectedV0sAssoc->Add(new V0Correlationparticle(lEtaV0s,lPhiV0s,lPtV0s,2,0,0));
843                                         
844                                         fHistMCAssoALA->Fill(rcAl[0],rcAl[1]);
845                                         if(IsLambdaInvMass(lInvMassAntiLambda))selectedV0sAssoc->Add(new V0Correlationparticle(lEtaV0s,lPhiV0s,lPtV0s,3,0,0));
846                                         
847                                         break;
848                                         
849                                 case 2:
850                                         if ((k0ctcut && k0Rapcut && k0cutset)&&(MotherPdg     ==  310 && 
851                                                                                                                         PosDaughterPdg==  211 && 
852                                                                                                                         NegDaughterPdg== -211 &&
853                                                                                                                         IsPrime))
854                                         {
855                                                 fHistMCAssoK0->Fill(rcK0[0],rcK0[1]);
856                                                 if(IsK0InvMass(lInvMassK0))selectedV0sAssoc->Add(new V0Correlationparticle(lEtaV0s,lPhiV0s,lPtV0s,1,0,0));
857                                         }
858                                         
859                                         if ((lactcut && laRapcut && lacutset)&&(MotherPdg     == 3122 && 
860                                                                                                                         PosDaughterPdg== 2212 && 
861                                                                                                                         NegDaughterPdg== -211 &&
862                                                                                                                         IsPrime)) 
863                                         {
864                                                 fHistMCAssoLA->Fill(rcLa[0],rcLa[1]);
865                                                 if(IsLambdaInvMass(lInvMassLambda))selectedV0sAssoc->Add(new V0Correlationparticle(lEtaV0s,lPhiV0s,lPtV0s,2,0,0));
866                                         }
867                                         
868                                         if ((alactcut && alaRapcut && alacutset)&&(MotherPdg     == -3122 && 
869                                                                                                                            PosDaughterPdg==   211 && 
870                                                                                                                            NegDaughterPdg== -2212 &&
871                                                                                                                            IsPrime))
872                                         {
873                                                 fHistMCAssoALA->Fill(rcAl[0],rcAl[1]);
874                                                 if(IsLambdaInvMass(lInvMassAntiLambda))selectedV0sAssoc->Add(new V0Correlationparticle(lEtaV0s,lPhiV0s,lPtV0s,3,0,0));
875                                         }
876                                         
877                                         break;
878                                         
879                                 case 3:
880                                         if ((k0ctcut && k0Rapcut && k0cutset && k0APcut)&&(MotherPdg     ==  310 && 
881                                                                                                                                            PosDaughterPdg==  211 && 
882                                                                                                                                            NegDaughterPdg== -211 &&
883                                                                                                                                            IsPrime))
884                                         {
885                                                 fHistMCAssoK0->Fill(rcK0[0],rcK0[1]); 
886                                                 if(IsK0InvMass(lInvMassK0))selectedV0sAssoc->Add(new V0Correlationparticle(lEtaV0s,lPhiV0s,lPtV0s,1,0,0));
887                                         }
888                                         
889                                         if ((lactcut && laRapcut && lacutset)&&(MotherPdg     == 3122 && 
890                                                                                                                         PosDaughterPdg== 2212 && 
891                                                                                                                         NegDaughterPdg== -211 &&
892                                                                                                                         IsPrime)) 
893                                         {
894                                                 fHistMCAssoLA->Fill(rcLa[0],rcLa[1]);
895                                                 if(IsLambdaInvMass(lInvMassLambda))selectedV0sAssoc->Add(new V0Correlationparticle(lEtaV0s,lPhiV0s,lPtV0s,2,0,0));
896                                         }
897                                         
898                                         if ((alactcut && alaRapcut && alacutset)&&(MotherPdg     == -3122 && 
899                                                                                                                            PosDaughterPdg==   211 && 
900                                                                                                                            NegDaughterPdg== -2212 &&
901                                                                                                                            IsPrime))
902                                         {
903                                                 fHistMCAssoALA->Fill(rcAl[0],rcAl[1]);
904                                                 if(IsLambdaInvMass(lInvMassAntiLambda))selectedV0sAssoc->Add(new V0Correlationparticle(lEtaV0s,lPhiV0s,lPtV0s,3,0,0));
905                                         }
906                                         break;
907                                         
908                                 default:
909                                         AliInfo(Form("No case selected"));
910                                         break;
911                         }       
912         }
913         }       
914         
915         FillCorrelationSibling(MultipOrCent,selectedTracksLeading,selectedV0s,fHistTriggerSib,fHistReconstSib);
916         FillCorrelationMixing(MultipOrCent,tPrimaryVtxPosition[2],poolmax,poolmin,selectedTracksLeading,selectedV0s,fHistTriggerMix,fHistReconstMix);
917         
918         FillCorrelationSibling(MultipOrCent,selectedTracksLeading,selectedV0sAssoc,fHistTriggerSibASO,fHistReconstSibASO);
919         FillCorrelationMixing(MultipOrCent,lPVz,poolmax,poolmin,selectedTracksLeading,selectedV0sAssoc,fHistTriggerMixASO,fHistReconstMixASO);
920         
921         PostData(1,fOutputList);
922 }       
923 //---------------------------------------------------------------------------------------
924 void AliLeadingV0Correlation::Terminate(Option_t *)
925 {
926         //No need in the grid
927 }
928 //---------------------------------------------------------------------------------------
929 Bool_t AliLeadingV0Correlation::IsAcseptedDaughterTrack(const AliAODTrack *itrack)
930 {
931         if(TMath::Abs(itrack->Eta())>fTrackEtaCut)return kFALSE;
932         
933         if (!itrack->IsOn(AliAODTrack::kTPCrefit)) return kFALSE;
934         
935         Float_t nCrossedRowsTPC = itrack->GetTPCClusterInfo(2,1);
936         if (nCrossedRowsTPC < 70) return kFALSE;
937         
938         Int_t findable=itrack->GetTPCNclsF();
939         if (findable <= 0) return kFALSE;
940         
941         if (nCrossedRowsTPC/findable < 0.8) return kFALSE;
942         return kTRUE;
943 }
944 //---------------------------------------------------------------------------------------
945 Bool_t AliLeadingV0Correlation::IsAcseptedV0(const AliAODv0* aodV0, const AliAODTrack* myTrackPos, const AliAODTrack* myTrackNeg)
946 {
947         if (!aodV0) return kFALSE;
948         
949         // Offline reconstructed V0 only
950     if (aodV0->GetOnFlyStatus()) return kFALSE;
951         
952     // Get daughters and check them
953         myTrackPos=(AliAODTrack *)(aodV0->GetDaughter(0));
954         myTrackNeg=(AliAODTrack *)(aodV0->GetDaughter(1));
955         
956         if (!myTrackPos||!myTrackNeg) return kFALSE;
957         // Unlike signs of daughters
958     if (myTrackPos->Charge() == myTrackNeg->Charge()) return kFALSE;
959         
960         // Track cuts for daughers
961     if ( !(IsAcseptedDaughterTrack(myTrackPos)) || !(IsAcseptedDaughterTrack(myTrackNeg)) ) return kFALSE;
962         
963         // Minimum pt of daughters
964     Double_t lPtPos = myTrackPos->Pt();
965     Double_t lPtNeg = myTrackNeg->Pt();
966         
967         if (lPtPos<fPtMin || lPtNeg<fPtMin) return kFALSE;
968         
969         return kTRUE;
970 }
971 //---------------------------------------------------------------------------------------
972 Bool_t AliLeadingV0Correlation::IsAcseptedK0(Double_t v0rad,
973                                                         Double_t dcaptp,
974                                                         Double_t dcantp,
975                                                         Double_t dcav0d,
976                                                         Double_t cpa,
977                                                         Double_t massLa,
978                                                         Double_t massALa)
979 {       
980                         if(v0rad  >=fV0radius           &&
981                            dcaptp >=fV0PostoPVz         &&
982                            dcantp >=fV0NegtoPVz         &&
983                            dcav0d <=fDCAV0Daughters     &&
984                            cpa    >=fCPAK0                      &&
985                            TMath::Abs(massLa  - 1.115683) > fRejectLamK0 &&
986                            TMath::Abs(massALa - 1.115683) > fRejectLamK0 )return kTRUE;
987         return kFALSE;
988 }
989 //---------------------------------------------------------------------------------------
990 Bool_t AliLeadingV0Correlation::IsAcseptedLA(Double_t v0rad,
991                                                         Double_t dcaptp,
992                                                         Double_t dcantp,
993                                                         Double_t dcav0d,
994                                                         Double_t cpa,
995                                                         Double_t massK0)
996 {
997         if(v0rad  >=fV0radius           &&
998            dcaptp >=fV0PostoPVz         &&
999            dcantp >=fV0NegtoPVz         &&
1000            dcav0d <=fDCAV0Daughters     &&
1001            cpa    >=fCPALam                     &&
1002            TMath::Abs(massK0  - 0.4976) > fRejectK0Lam &&
1003            TMath::Abs(massK0  - 0.4976) > fRejectK0Lam )return kTRUE;
1004         return kFALSE;
1005 }
1006 //---------------------------------------------------------------------------------------
1007 Bool_t AliLeadingV0Correlation::IsK0InvMass(const Double_t mass) const 
1008 {
1009         const Float_t massK0            = 0.497; 
1010         
1011         return ((massK0-fMassCutK0)<=mass && mass<=(massK0 + fMassCutK0))?1:0;
1012 }
1013 //---------------------------------------------------------------------------------------
1014 Bool_t AliLeadingV0Correlation::IsLambdaInvMass(const Double_t mass) const 
1015 {
1016         const Float_t massLambda        = 1.116; 
1017         
1018         return ((massLambda-fMassCutLa)<=mass && mass<=(massLambda + fMassCutLa))?1:0;
1019 }
1020 //---------------------------------------------------------------------------------------
1021 Double_t AliLeadingV0Correlation::RangePhi(Double_t DPhi)
1022 {
1023         if (DPhi < -TMath::Pi()/2)  DPhi += 2*TMath::Pi();
1024         if (DPhi > 3*TMath::Pi()/2) DPhi -= 2*TMath::Pi();      
1025         return DPhi;    
1026 }
1027 //---------------------------------------------------------------------------------------
1028 Bool_t AliLeadingV0Correlation::IsTrackFromV0(AliAODTrack* track)
1029 {
1030         Int_t atrID = track->GetID();
1031
1032         for(int i=0; i<fAODEvent->GetNumberOfV0s(); i++){ // loop over V0s
1033                 AliAODv0* aodV0 = fAODEvent->GetV0(i);
1034                 
1035                 AliAODTrack *trackPos=(AliAODTrack *)(aodV0->GetDaughter(0));
1036         AliAODTrack *trackNeg=(AliAODTrack *)(aodV0->GetDaughter(1));
1037                         
1038                 if ( !(IsAcseptedDaughterTrack(trackPos)) || !(IsAcseptedDaughterTrack(trackNeg)) ) continue;
1039                 //----------------------------------
1040                 Int_t negID = trackNeg->GetID();
1041                 Int_t posID = trackPos->GetID();
1042                 
1043                 if ((TMath::Abs(negID)+1)==(TMath::Abs(atrID))){ return kTRUE;}
1044                 if ((TMath::Abs(posID)+1)==(TMath::Abs(atrID))){ return kTRUE;}
1045                 //----------------------------------
1046         }
1047         return kFALSE;
1048 }
1049 //---------------------------------------------------------------------------------------
1050 void AliLeadingV0Correlation::FillCorrelationSibling(Double_t MultipOrCent,
1051                                                                           TObjArray*triggerArray,
1052                                                                           TObjArray*selectedV0Array,
1053                                                                           TH1F*triggerHist,
1054                                                                           THnSparse*associateHist)
1055 {
1056         Double_t  binsv0CORR[8];
1057         Double_t  binsTrigSib[2];
1058         Int_t counterSibMCA=0;
1059         
1060     for(Int_t i=0;i<triggerArray->GetEntriesFast();i++)
1061         {
1062                 AliAODTrack* trigger = (AliAODTrack*)triggerArray->At(0);
1063                 if(!trigger)continue;
1064                 
1065                 if(fRemoveAutoCorr) 
1066                 if(IsTrackFromV0(trigger))continue;
1067                         
1068                 Double_t triggerPt  = trigger->Pt();
1069                 Double_t triggerPhi = trigger->Phi();
1070                 Double_t triggerEta = trigger->Eta();
1071                 
1072                 if(triggerPt<fTriglow||triggerPt>fTrighigh)continue;
1073                 counterSibMCA++;
1074                 
1075                 if(counterSibMCA==triggerArray->GetEntriesFast()){
1076                         
1077                         binsTrigSib[0]=triggerPt;
1078                         binsTrigSib[1]=MultipOrCent;
1079                         
1080                         if(triggerHist)triggerHist->Fill(binsTrigSib[0]);
1081                         
1082                         for (Int_t j=0; j<selectedV0Array->GetEntriesFast(); j++){
1083                                 
1084                                 V0Correlationparticle* associate = (V0Correlationparticle*) selectedV0Array->At(j);
1085                                 if(!associate)continue;
1086                                 
1087                                 binsv0CORR[0]= associate->Pt();
1088                                 binsv0CORR[1]= associate->Phi();
1089                                 binsv0CORR[2]= associate->Eta();
1090                                 
1091                                 if(binsv0CORR[0]>triggerPt) continue;
1092                                 
1093                                 binsv0CORR[3]=RangePhi(triggerPhi-binsv0CORR[1]);
1094                                 binsv0CORR[4]=triggerEta-binsv0CORR[2];
1095                                 binsv0CORR[5]= associate->WhichCandidate();
1096                                 binsv0CORR[6]= associate->DCAPostoP();
1097                                 binsv0CORR[7]= associate->DCANegtoP();
1098                                 
1099                                 associateHist->Fill(binsv0CORR);
1100                         }
1101                   }
1102                 }
1103 }
1104 //---------------------------------------------------------------------------------------
1105 void AliLeadingV0Correlation::FillCorrelationMixing(Double_t MultipOrCentMix,
1106                                                                    Double_t pvxMix,
1107                                                                    Double_t poolmax,
1108                                                                    Double_t poolmin,
1109                                                                    TObjArray*triggerArray,
1110                                                                    TObjArray*selectedV0Array,
1111                                                                    TH1F*triggerHist,
1112                                                                    THnSparse*associateHist)
1113 {
1114         if(TMath::Abs(pvxMix)>=fpvzcut || MultipOrCentMix>poolmax || MultipOrCentMix < poolmin)
1115         {
1116                 if(fcollidingSys=="PP")AliInfo(Form("pp Event with Zvertex = %.2f cm and multiplicity = %.0f out of pool bounds, SKIPPING",pvxMix,MultipOrCentMix));
1117                 if(fcollidingSys=="PbPb") AliInfo(Form("PbPb Event with Zvertex = %.2f cm and centrality = %.1f  out of pool bounds, SKIPPING",pvxMix,MultipOrCentMix));
1118                 return;
1119         }
1120         
1121         Double_t  binsv0CORRMix[8];
1122         Double_t  binsTrigMix[2];
1123         Double_t  counterMix=0;
1124         
1125         AliEventPool* pool = fPoolMgr->GetEventPool(MultipOrCentMix, pvxMix);
1126         if (!pool) AliFatal(Form("No pool found for centrality = %f, zVtx = %f", MultipOrCentMix, pvxMix));
1127         
1128     if (pool->IsReady() || pool->NTracksInPool() > fPoolMinNTracks  || pool->GetCurrentNEvents() > fMinEventsToMix)
1129         {
1130                 Int_t nMix = pool->GetCurrentNEvents();
1131                 for (Int_t jMix=0; jMix<nMix; jMix++){
1132                         
1133                         TObjArray* mixEvents = pool->GetEvent(jMix);
1134                         for (Int_t i=0; i<triggerArray->GetEntriesFast(); i++){
1135                                 
1136                                 AliAODTrack* trig = (AliAODTrack*)triggerArray->At(0);
1137                                 if(!trig)continue;
1138                                 
1139                                 if(fRemoveAutoCorr) 
1140                                 if(IsTrackFromV0(trig))continue;
1141                                 
1142                                 Double_t trigPhi  = trig->Phi();
1143                                 Double_t trigEta  = trig->Eta();
1144                                 Double_t trigPt   = trig->Pt();
1145                                 
1146                                 if(trigPt<fTriglow||trigPt>fTrighigh)continue;
1147                                 counterMix++;
1148                                 
1149                                 if(counterMix==triggerArray->GetEntriesFast()){
1150                                         
1151                                         binsTrigMix[0]=trigPt;
1152                                         binsTrigMix[1]=MultipOrCentMix;
1153                                         
1154                                         if(triggerHist)triggerHist->Fill(binsTrigMix[0]);
1155                                         
1156                                         for (Int_t j=0; j<mixEvents->GetEntriesFast(); j++){
1157                                                 
1158                                                 V0Correlationparticle* associate = (V0Correlationparticle*) mixEvents->At(j);
1159                                                 if(!associate)continue;
1160                                                 
1161                                                 binsv0CORRMix[0]= associate->Pt();
1162                                                 binsv0CORRMix[1]= associate->Phi();
1163                                                 binsv0CORRMix[2]= associate->Eta();
1164                                                 
1165                                                 if(binsv0CORRMix[0]>trigPt) continue;
1166                                                 
1167                                                 binsv0CORRMix[3]=RangePhi(trigPhi-binsv0CORRMix[1]);
1168                                                 binsv0CORRMix[4]=trigEta-binsv0CORRMix[2];
1169                                                 binsv0CORRMix[5]=associate->WhichCandidate();
1170                                                 binsv0CORRMix[6]=associate->DCAPostoP();
1171                                                 binsv0CORRMix[7]=associate->DCANegtoP();
1172                                                 
1173                                                 associateHist->Fill(binsv0CORRMix);
1174                                                 }
1175                                         }
1176                                 }
1177                         }
1178                 }
1179         
1180         TObjArray* tracksClone = new TObjArray;
1181         tracksClone->SetOwner(kTRUE);
1182         
1183         for (Int_t i=0; i<selectedV0Array->GetEntriesFast(); i++)
1184         {
1185                 V0Correlationparticle* particle = (V0Correlationparticle*) selectedV0Array->At(i);
1186                 tracksClone->Add(new V0Correlationparticle(particle->Eta(), 
1187                                                                                           particle->Phi(), 
1188                                                                                           particle->Pt(),
1189                                                                                           particle->WhichCandidate(),
1190                                                                                           particle->DCAPostoP(),
1191                                                                                           particle->DCANegtoP()));
1192         };
1193         pool->UpdatePool(tracksClone);
1194 }
1195 //---------------------------------------------------------------------------------------                                                                                       
1196                                                                 
1197                                         
1198                                                                                                 
1199