]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGLF/STRANGENESS/LambdaK0/AliAnalysisTaskExtractPerformanceV0.cxx
Added trigger skipping (for ::SetCollisionCandidates operation), added some extra...
[u/mrichter/AliRoot.git] / PWGLF / STRANGENESS / LambdaK0 / AliAnalysisTaskExtractPerformanceV0.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
7  * Permission to use, copy, modify and distribute this software and its   *
8  * documentation strictly for non-commercial purposes is hereby granted   *
9  * without fee, provided that the above copyright notice appears in all   *
10  * copies and that both the copyright notice and this permission notice   *
11  * appear in the supporting documentation. The authors make no claims     *
12  * about the suitability of this software for any purpose. It is          *
13  * provided "as is" without express or implied warranty.                  *
14  **************************************************************************/
15
16 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
17 //
18 // Modified version of AliAnalysisTaskCheckCascade.cxx.
19 // This is a 'hybrid' output version, in that it uses a classic TTree
20 // ROOT object to store the candidates, plus a couple of histograms filled on
21 // a per-event basis for storing variables too numerous to put in a tree. 
22 //
23 // --- Adapted to look for lambdas as well, using code from 
24 //        AliAnalysisTaskCheckPerformanceStrange.cxx
25 //
26 //  --- Algorithm Description 
27 //   1. Loop over primaries in stack to acquire generated charged Xi
28 //   2. Loop over stack to find V0s, fill TH3Fs "PrimRawPt"s for Efficiency
29 //   3. Perform Physics Selection
30 //   4. Perform Primary Vertex |z|<10cm selection
31 //   5. Perform Primary Vertex NoTPCOnly vertexing selection (>0 contrib.)
32 //   6. Perform Pileup Rejection
33 //   7. Analysis Loops: 
34 //    7a. Fill TH3Fs "PrimAnalysisPt" for control purposes only
35 //    7b. Fill TTree object with V0 information, candidates
36 //
37 //  Please Report Any Bugs! 
38 //
39 //   --- David Dobrigkeit Chinellato
40 //        (david.chinellato@gmail.com)
41 //
42 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
43
44 class TTree;
45 class TParticle;
46 class TVector3;
47
48 //class AliMCEventHandler;
49 //class AliMCEvent;
50 //class AliStack;
51
52 class AliESDVertex;
53 class AliAODVertex;
54 class AliESDv0;
55 class AliAODv0;
56
57 #include <Riostream.h>
58 #include "TList.h"
59 #include "TH1.h"
60 #include "TH2.h"
61 #include "TH3.h"
62 #include "TFile.h"
63 #include "THnSparse.h"
64 #include "TVector3.h"
65 #include "TCanvas.h"
66 #include "TMath.h"
67 #include "TLegend.h"
68 #include "AliLog.h"
69
70 #include "AliESDEvent.h"
71 #include "AliAODEvent.h"
72 #include "AliV0vertexer.h"
73 #include "AliCascadeVertexer.h"
74 #include "AliESDpid.h"
75 #include "AliESDtrack.h"
76 #include "AliESDtrackCuts.h"
77 #include "AliInputEventHandler.h"
78 #include "AliAnalysisManager.h"
79 #include "AliMCEventHandler.h"
80 #include "AliMCEvent.h"
81 #include "AliStack.h"
82
83 #include "AliCFContainer.h"
84 #include "AliMultiplicity.h"
85 #include "AliAODMCParticle.h"
86 #include "AliESDcascade.h"
87 #include "AliAODcascade.h"
88 #include "AliESDUtils.h"
89 #include "AliGenEventHeader.h"
90 #include "AliAnalysisTaskSE.h"
91 #include "AliAnalysisUtils.h"
92 #include "AliAnalysisTaskExtractPerformanceV0.h"
93
94 using std::cout;
95 using std::endl;
96
97 ClassImp(AliAnalysisTaskExtractPerformanceV0)
98
99 AliAnalysisTaskExtractPerformanceV0::AliAnalysisTaskExtractPerformanceV0()
100   : AliAnalysisTaskSE(), fListHistV0(0), fTree(0), fPIDResponse(0), fESDtrackCuts(0), fUtils(0),
101    fkIsNuclear   ( kFALSE ), 
102    fkSwitchINT7  ( kFALSE ),
103    fkUseOnTheFly ( kFALSE ),
104    fkTakeAllTracks ( kFALSE ),
105    fpArapidityShift ( 0.465 ),
106   fCentralityEstimator("V0M"),
107   fkLightWeight  ( kFALSE ),
108   fkFastOnly     ( "" ),
109   fkpAVertexSelection( kFALSE ),
110   fkRunV0Vertexer( kFALSE ),
111   fkRejectPileup ( kTRUE ),
112   fkSpecialExecution ( kFALSE),
113   fkSkipTrigger(kFALSE),
114   fkSaveAssociatedOnly (kFALSE),
115   fkDoNotCallTPCdEdx( kFALSE ),
116 //------------------------------------------------
117 // Tree Variables 
118
119   fTreeVariablePrimaryStatus(0),
120   fTreeVariablePrimaryStatusMother(0),
121   fTreeVariableChi2V0(0),
122         fTreeVariableDcaV0Daughters(0),
123         fTreeVariableDcaV0ToPrimVertex(0),
124         fTreeVariableDcaPosToPrimVertex(0),
125         fTreeVariableDcaNegToPrimVertex(0),
126         fTreeVariableV0CosineOfPointingAngle(0),
127         fTreeVariableV0Radius(0),
128         fTreeVariablePt(0),
129         fTreeVariablePtMC(0),
130         fTreeVariableRapK0Short(0),
131         fTreeVariableRapLambda(0),
132         fTreeVariableRapMC(0),
133         fTreeVariableInvMassK0s(0),
134         fTreeVariableInvMassLambda(0),
135         fTreeVariableInvMassAntiLambda(0),
136         fTreeVariableAlphaV0(0),
137         fTreeVariablePtArmV0(0),
138         fTreeVariableNegTotMomentum(0),
139         fTreeVariablePosTotMomentum(0),
140         fTreeVariableNegTransvMomentum(0),
141         fTreeVariablePosTransvMomentum(0),
142         fTreeVariableNegTransvMomentumMC(0),
143         fTreeVariablePosTransvMomentumMC(0),
144    
145         fTreeVariableNSigmasPosProton(0),
146         fTreeVariableNSigmasPosPion(0),
147         fTreeVariableNSigmasNegProton(0),
148         fTreeVariableNSigmasNegPion(0),
149
150         fTreeVariablePtMother(0),
151         fTreeVariableV0CreationRadius(0),
152   fTreeVariablePID(0),
153   fTreeVariablePIDPositive(0),
154   fTreeVariablePIDNegative(0),
155   fTreeVariablePIDMother(0),
156   fTreeVariableIndexStatus(0),
157   fTreeVariableIndexStatusMother(0),
158
159   fTreeVariableRunNumber(0),
160   fTreeVariableEventNumber(0),
161
162         fTreeVariableDistOverTotMom(0),
163
164         fTreeVariablePosEta(0),
165         fTreeVariableNegEta(0),
166
167         fTreeVariableVertexZ(0),
168
169   fTreeVariableLeastNbrCrossedRows(0),
170   fTreeVariableLeastRatioCrossedRowsOverFindable(0),
171
172   fTreeVariableMultiplicity(0),
173   fTreeVariableMultiplicityV0A(0),
174   fTreeVariableMultiplicityZNA(0),
175   fTreeVariableMultiplicityTRK(0),
176   fTreeVariableMultiplicitySPD(0),
177   fTreeVariableMultiplicityMC(0),
178
179   fTreeVariableV0x(0),
180   fTreeVariableV0y(0),
181   fTreeVariableV0z(0),
182
183   fTreeVariableV0Px(0),
184   fTreeVariableV0Py(0),
185   fTreeVariableV0Pz(0),
186
187   fTreeVariableMCV0x(0),
188   fTreeVariableMCV0y(0),
189   fTreeVariableMCV0z(0),
190
191   fTreeVariableMCV0Px(0),
192   fTreeVariableMCV0Py(0),
193   fTreeVariableMCV0Pz(0),
194
195   fTreeVariablePVx(0),
196   fTreeVariablePVy(0),
197   fTreeVariablePVz(0),
198
199   fTreeVariableMCPVx(0),
200   fTreeVariableMCPVy(0),
201   fTreeVariableMCPVz(0),
202
203   fTreeVariableIsNonInjected(0),
204
205   fTreeVariableNegTrackStatus(0),
206   fTreeVariablePosTrackStatus(0),
207
208   fTreeVariableNegPhysicalStatus(0),
209   fTreeVariablePosPhysicalStatus(0),
210
211 //------------------------------------------------
212 // HISTOGRAMS
213 // --- Filled on an Event-by-event basis
214 //------------------------------------------------
215    fHistV0MultiplicityBeforeTrigSel(0),
216    fHistV0MultiplicityForTrigEvt(0), 
217    fHistV0MultiplicityForSelEvt(0),
218    fHistV0MultiplicityForSelEvtNoTPCOnly(0),
219    fHistV0MultiplicityForSelEvtNoTPCOnlyNoPileup(0),
220    fHistMultiplicityBeforeTrigSel(0),
221    fHistMultiplicityForTrigEvt(0),
222    fHistMultiplicity(0),
223    fHistMultiplicityNoTPCOnly(0),
224    fHistMultiplicityNoTPCOnlyNoPileup(0),
225
226 //V0A Centrality
227 fHistMultiplicityV0ABeforeTrigSel(0),
228 fHistMultiplicityV0AForTrigEvt(0),
229 fHistMultiplicityV0A(0),
230 fHistMultiplicityV0ANoTPCOnly(0),
231 fHistMultiplicityV0ANoTPCOnlyNoPileup(0),
232
233 //ZNA Centrality
234 fHistMultiplicityZNABeforeTrigSel(0),
235 fHistMultiplicityZNAForTrigEvt(0),
236 fHistMultiplicityZNA(0),
237 fHistMultiplicityZNANoTPCOnly(0),
238 fHistMultiplicityZNANoTPCOnlyNoPileup(0),
239
240 //TRK Centrality
241 fHistMultiplicityTRKBeforeTrigSel(0),
242 fHistMultiplicityTRKForTrigEvt(0),
243 fHistMultiplicityTRK(0),
244 fHistMultiplicityTRKNoTPCOnly(0),
245 fHistMultiplicityTRKNoTPCOnlyNoPileup(0),
246
247 //SPD Centrality
248 fHistMultiplicitySPDBeforeTrigSel(0),
249 fHistMultiplicitySPDForTrigEvt(0),
250 fHistMultiplicitySPD(0),
251 fHistMultiplicitySPDNoTPCOnly(0),
252 fHistMultiplicitySPDNoTPCOnlyNoPileup(0),
253
254         f2dHistMultiplicityVsTrueBeforeTrigSel(0),
255         f2dHistMultiplicityVsTrueForTrigEvt(0),
256         f2dHistMultiplicityVsTrue(0),
257         f2dHistMultiplicityVsTrueNoTPCOnly(0),
258         f2dHistMultiplicityVsTrueNoTPCOnlyNoPileup(0),
259
260   //Raw Data for Vertex Z position estimator change
261         f2dHistMultiplicityVsVertexZBeforeTrigSel(0),
262         f2dHistMultiplicityVsVertexZForTrigEvt(0),
263         f2dHistMultiplicityVsVertexZ(0),
264         f2dHistMultiplicityVsVertexZNoTPCOnly(0),
265         f2dHistMultiplicityVsVertexZNoTPCOnlyNoPileup(0),
266
267   fHistGenVertexZBeforeTrigSel(0),     
268   fHistGenVertexZForTrigEvt(0),
269   fHistGenVertexZ(0),
270   fHistGenVertexZNoTPCOnly(0),
271   fHistGenVertexZNoTPCOnlyNoPileup(0),
272
273 //------------------------------------------------
274 // PARTICLE HISTOGRAMS
275 // --- Filled on a Particle-by-Particle basis
276 //------------------------------------------------
277
278 //Standard V0M / multiplicity
279   f3dHistPrimAnalysisPtVsYVsMultLambda(0),
280   f3dHistPrimAnalysisPtVsYVsMultAntiLambda(0),
281   f3dHistPrimAnalysisPtVsYVsMultK0Short(0),
282   f3dHistPrimAnalysisPtVsYCMSVsMultLambda(0),
283   f3dHistPrimAnalysisPtVsYCMSVsMultAntiLambda(0),
284   f3dHistPrimAnalysisPtVsYCMSVsMultK0Short(0),
285
286   //True Multiplicity
287   f3dHistPrimAnalysisPtVsYVsMultMCLambda(0),
288   f3dHistPrimAnalysisPtVsYVsMultMCAntiLambda(0),
289   f3dHistPrimAnalysisPtVsYVsMultMCK0Short(0),
290   f3dHistPrimAnalysisPtVsYCMSVsMultMCLambda(0),
291   f3dHistPrimAnalysisPtVsYCMSVsMultMCAntiLambda(0),
292   f3dHistPrimAnalysisPtVsYCMSVsMultMCK0Short(0),
293
294 //V0A
295   f3dHistPrimAnalysisPtVsYVsMultV0ALambda(0),
296   f3dHistPrimAnalysisPtVsYVsMultV0AAntiLambda(0),
297   f3dHistPrimAnalysisPtVsYVsMultV0AK0Short(0),
298   f3dHistPrimAnalysisPtVsYCMSVsMultV0ALambda(0),
299   f3dHistPrimAnalysisPtVsYCMSVsMultV0AAntiLambda(0),
300   f3dHistPrimAnalysisPtVsYCMSVsMultV0AK0Short(0),
301
302 //ZNA
303   f3dHistPrimAnalysisPtVsYVsMultZNALambda(0),
304   f3dHistPrimAnalysisPtVsYVsMultZNAAntiLambda(0),
305   f3dHistPrimAnalysisPtVsYVsMultZNAK0Short(0),
306   f3dHistPrimAnalysisPtVsYCMSVsMultZNALambda(0),
307   f3dHistPrimAnalysisPtVsYCMSVsMultZNAAntiLambda(0),
308   f3dHistPrimAnalysisPtVsYCMSVsMultZNAK0Short(0),
309
310 //TRK
311   f3dHistPrimAnalysisPtVsYVsMultTRKLambda(0),
312   f3dHistPrimAnalysisPtVsYVsMultTRKAntiLambda(0),
313   f3dHistPrimAnalysisPtVsYVsMultTRKK0Short(0),
314   f3dHistPrimAnalysisPtVsYCMSVsMultTRKLambda(0),
315   f3dHistPrimAnalysisPtVsYCMSVsMultTRKAntiLambda(0),
316   f3dHistPrimAnalysisPtVsYCMSVsMultTRKK0Short(0),
317
318 //SPD
319   f3dHistPrimAnalysisPtVsYVsMultSPDLambda(0),
320   f3dHistPrimAnalysisPtVsYVsMultSPDAntiLambda(0),
321   f3dHistPrimAnalysisPtVsYVsMultSPDK0Short(0),
322   f3dHistPrimAnalysisPtVsYCMSVsMultSPDLambda(0),
323   f3dHistPrimAnalysisPtVsYCMSVsMultSPDAntiLambda(0),
324   f3dHistPrimAnalysisPtVsYCMSVsMultSPDK0Short(0),
325
326 //Standard V0M again
327   f3dHistPrimRawPtVsYVsMultLambda(0),
328   f3dHistPrimRawPtVsYVsMultAntiLambda(0),
329   f3dHistPrimRawPtVsYVsMultK0Short(0),
330   f3dHistPrimRawPtVsYCMSVsMultLambda(0),
331   f3dHistPrimRawPtVsYCMSVsMultAntiLambda(0),
332   f3dHistPrimRawPtVsYCMSVsMultK0Short(0),
333
334 //V0A again
335   f3dHistPrimRawPtVsYVsMultV0ALambda(0),
336   f3dHistPrimRawPtVsYVsMultV0AAntiLambda(0),
337   f3dHistPrimRawPtVsYVsMultV0AK0Short(0),
338   f3dHistPrimRawPtVsYCMSVsMultV0ALambda(0),
339   f3dHistPrimRawPtVsYCMSVsMultV0AAntiLambda(0),
340   f3dHistPrimRawPtVsYCMSVsMultV0AK0Short(0),
341
342 //ZNA
343   f3dHistPrimRawPtVsYVsMultZNALambda(0),
344   f3dHistPrimRawPtVsYVsMultZNAAntiLambda(0),
345   f3dHistPrimRawPtVsYVsMultZNAK0Short(0),
346   f3dHistPrimRawPtVsYCMSVsMultZNALambda(0),
347   f3dHistPrimRawPtVsYCMSVsMultZNAAntiLambda(0),
348   f3dHistPrimRawPtVsYCMSVsMultZNAK0Short(0),
349
350 //TRK
351   f3dHistPrimRawPtVsYVsMultTRKLambda(0),
352   f3dHistPrimRawPtVsYVsMultTRKAntiLambda(0),
353   f3dHistPrimRawPtVsYVsMultTRKK0Short(0),
354   f3dHistPrimRawPtVsYCMSVsMultTRKLambda(0),
355   f3dHistPrimRawPtVsYCMSVsMultTRKAntiLambda(0),
356   f3dHistPrimRawPtVsYCMSVsMultTRKK0Short(0),
357
358 //SPD
359   f3dHistPrimRawPtVsYVsMultSPDLambda(0),
360   f3dHistPrimRawPtVsYVsMultSPDAntiLambda(0),
361   f3dHistPrimRawPtVsYVsMultSPDK0Short(0),
362   f3dHistPrimRawPtVsYCMSVsMultSPDLambda(0),
363   f3dHistPrimRawPtVsYCMSVsMultSPDAntiLambda(0),
364   f3dHistPrimRawPtVsYCMSVsMultSPDK0Short(0),
365
366   f3dHistPrimRawPtVsYVsMultNonInjLambda(0),
367   f3dHistPrimRawPtVsYVsMultNonInjAntiLambda(0),
368   f3dHistPrimRawPtVsYVsMultNonInjK0Short(0),
369   f3dHistPrimRawPtVsYVsMultMCLambda(0),
370   f3dHistPrimRawPtVsYVsMultMCAntiLambda(0),
371   f3dHistPrimRawPtVsYVsMultMCK0Short(0),
372   f3dHistPrimRawPtVsYVsVertexZLambda(0),
373   f3dHistPrimRawPtVsYVsVertexZAntiLambda(0),
374   f3dHistPrimRawPtVsYVsVertexZK0Short(0),
375   f3dHistPrimCloseToPVPtVsYVsMultLambda(0),
376   f3dHistPrimCloseToPVPtVsYVsMultAntiLambda(0),
377   f3dHistPrimCloseToPVPtVsYVsMultK0Short(0),
378   f3dHistPrimRawPtVsYVsDecayLengthLambda(0),
379   f3dHistPrimRawPtVsYVsDecayLengthAntiLambda(0),
380   f3dHistPrimRawPtVsYVsDecayLengthK0Short(0),
381
382 //V0M
383   f3dHistGenPtVsYVsMultXiMinus(0),
384   f3dHistGenPtVsYVsMultXiPlus(0),
385   f3dHistGenSelectedPtVsYVsMultXiMinus(0),
386   f3dHistGenSelectedPtVsYVsMultXiPlus(0),
387   f3dHistGenPtVsYCMSVsMultXiMinus(0),
388   f3dHistGenPtVsYCMSVsMultXiPlus(0),
389   f3dHistGenSelectedPtVsYCMSVsMultXiMinus(0),
390   f3dHistGenSelectedPtVsYCMSVsMultXiPlus(0),
391
392 //V0A
393   f3dHistGenPtVsYVsMultV0AXiMinus(0),
394   f3dHistGenPtVsYVsMultV0AXiPlus(0),
395   f3dHistGenSelectedPtVsYVsMultV0AXiMinus(0),
396   f3dHistGenSelectedPtVsYVsMultV0AXiPlus(0),
397   f3dHistGenPtVsYCMSVsMultV0AXiMinus(0),
398   f3dHistGenPtVsYCMSVsMultV0AXiPlus(0),
399   f3dHistGenSelectedPtVsYCMSVsMultV0AXiMinus(0),
400   f3dHistGenSelectedPtVsYCMSVsMultV0AXiPlus(0),
401
402 //ZNA
403   f3dHistGenPtVsYVsMultZNAXiMinus(0),
404   f3dHistGenPtVsYVsMultZNAXiPlus(0),
405   f3dHistGenSelectedPtVsYVsMultZNAXiMinus(0),
406   f3dHistGenSelectedPtVsYVsMultZNAXiPlus(0),
407   f3dHistGenPtVsYCMSVsMultZNAXiMinus(0),
408   f3dHistGenPtVsYCMSVsMultZNAXiPlus(0),
409   f3dHistGenSelectedPtVsYCMSVsMultZNAXiMinus(0),
410   f3dHistGenSelectedPtVsYCMSVsMultZNAXiPlus(0),
411
412 //TRK
413   f3dHistGenPtVsYVsMultTRKXiMinus(0),
414   f3dHistGenPtVsYVsMultTRKXiPlus(0),
415   f3dHistGenSelectedPtVsYVsMultTRKXiMinus(0),
416   f3dHistGenSelectedPtVsYVsMultTRKXiPlus(0),
417   f3dHistGenPtVsYCMSVsMultTRKXiMinus(0),
418   f3dHistGenPtVsYCMSVsMultTRKXiPlus(0),
419   f3dHistGenSelectedPtVsYCMSVsMultTRKXiMinus(0),
420   f3dHistGenSelectedPtVsYCMSVsMultTRKXiPlus(0),
421
422 //SPD
423   f3dHistGenPtVsYVsMultSPDXiMinus(0),
424   f3dHistGenPtVsYVsMultSPDXiPlus(0),
425   f3dHistGenSelectedPtVsYVsMultSPDXiMinus(0),
426   f3dHistGenSelectedPtVsYVsMultSPDXiPlus(0),
427   f3dHistGenPtVsYCMSVsMultSPDXiMinus(0),
428   f3dHistGenPtVsYCMSVsMultSPDXiPlus(0),
429   f3dHistGenSelectedPtVsYCMSVsMultSPDXiMinus(0),
430   f3dHistGenSelectedPtVsYCMSVsMultSPDXiPlus(0),
431
432   fHistPVx(0),
433   fHistPVy(0),
434   fHistPVz(0),
435   fHistPVxAnalysis(0),
436   fHistPVyAnalysis(0),
437   fHistPVzAnalysis(0),
438   fHistPVxAnalysisHasHighPtLambda(0),
439   fHistPVyAnalysisHasHighPtLambda(0),
440   fHistPVzAnalysisHasHighPtLambda(0),
441   fHistSwappedV0Counter(0)
442 {
443   // Dummy Constructor
444   for(Int_t iV0selIdx   = 0; iV0selIdx   < 7; iV0selIdx++   ) { fV0Sels          [iV0selIdx   ] = -1.; }  
445 }
446
447 AliAnalysisTaskExtractPerformanceV0::AliAnalysisTaskExtractPerformanceV0(const char *name) 
448   : AliAnalysisTaskSE(name), fListHistV0(0), fTree(0), fPIDResponse(0), fESDtrackCuts(0), fUtils(0),
449    fkIsNuclear   ( kFALSE ), 
450    fkSwitchINT7  ( kFALSE ),
451    fkUseOnTheFly ( kFALSE ),
452    fkTakeAllTracks ( kFALSE ),
453    fpArapidityShift ( 0.465 ),
454   fCentralityEstimator("V0M"),
455   fkLightWeight  ( kFALSE ),
456   fkFastOnly     ( "" ),
457   fkpAVertexSelection( kFALSE ),
458   fkRunV0Vertexer( kFALSE ),
459   fkRejectPileup ( kTRUE ),
460   fkSpecialExecution ( kFALSE),
461   fkSkipTrigger(kFALSE),
462   fkSaveAssociatedOnly (kFALSE),
463   fkDoNotCallTPCdEdx( kFALSE ),
464 //------------------------------------------------
465 // Tree Variables 
466
467   fTreeVariablePrimaryStatus(0),
468   fTreeVariablePrimaryStatusMother(0),
469   fTreeVariableChi2V0(0),
470         fTreeVariableDcaV0Daughters(0),
471         fTreeVariableDcaV0ToPrimVertex(0),
472         fTreeVariableDcaPosToPrimVertex(0),
473         fTreeVariableDcaNegToPrimVertex(0),
474         fTreeVariableV0CosineOfPointingAngle(0),
475         fTreeVariableV0Radius(0),
476         fTreeVariablePt(0),
477         fTreeVariablePtMC(0),
478         fTreeVariableRapK0Short(0),
479         fTreeVariableRapLambda(0),
480         fTreeVariableRapMC(0),
481         fTreeVariableInvMassK0s(0),
482         fTreeVariableInvMassLambda(0),
483         fTreeVariableInvMassAntiLambda(0),
484         fTreeVariableAlphaV0(0),
485         fTreeVariablePtArmV0(0),
486         fTreeVariableNegTotMomentum(0),
487         fTreeVariablePosTotMomentum(0),
488         fTreeVariableNegTransvMomentum(0),
489         fTreeVariablePosTransvMomentum(0),
490         fTreeVariableNegTransvMomentumMC(0),
491         fTreeVariablePosTransvMomentumMC(0),
492    
493         fTreeVariableNSigmasPosProton(0),
494         fTreeVariableNSigmasPosPion(0),
495         fTreeVariableNSigmasNegProton(0),
496         fTreeVariableNSigmasNegPion(0),
497
498         fTreeVariablePtMother(0),
499         fTreeVariableV0CreationRadius(0),
500   fTreeVariablePID(0),
501   fTreeVariablePIDPositive(0),
502   fTreeVariablePIDNegative(0),
503   fTreeVariablePIDMother(0),
504   fTreeVariableIndexStatus(0),
505   fTreeVariableIndexStatusMother(0),
506
507   fTreeVariableRunNumber(0),
508   fTreeVariableEventNumber(0),
509
510         fTreeVariableDistOverTotMom(0),
511
512         fTreeVariablePosEta(0),
513         fTreeVariableNegEta(0),
514
515         fTreeVariableVertexZ(0),
516
517   fTreeVariableLeastNbrCrossedRows(0),
518   fTreeVariableLeastRatioCrossedRowsOverFindable(0),
519   fTreeVariableMultiplicity(0),
520   fTreeVariableMultiplicityV0A(0),
521   fTreeVariableMultiplicityZNA(0),
522   fTreeVariableMultiplicityTRK(0),
523   fTreeVariableMultiplicitySPD(0),
524   fTreeVariableMultiplicityMC(0),
525
526   fTreeVariableV0x(0),
527   fTreeVariableV0y(0),
528   fTreeVariableV0z(0),
529
530   fTreeVariableV0Px(0),
531   fTreeVariableV0Py(0),
532   fTreeVariableV0Pz(0),
533
534   fTreeVariableMCV0x(0),
535   fTreeVariableMCV0y(0),
536   fTreeVariableMCV0z(0),
537
538   fTreeVariableMCV0Px(0),
539   fTreeVariableMCV0Py(0),
540   fTreeVariableMCV0Pz(0),
541
542   fTreeVariablePVx(0),
543   fTreeVariablePVy(0),
544   fTreeVariablePVz(0),
545
546   fTreeVariableMCPVx(0),
547   fTreeVariableMCPVy(0),
548   fTreeVariableMCPVz(0),
549
550   fTreeVariableIsNonInjected(0),
551
552   fTreeVariableNegTrackStatus(0),
553   fTreeVariablePosTrackStatus(0),
554
555   fTreeVariableNegPhysicalStatus(0),
556   fTreeVariablePosPhysicalStatus(0),
557
558 //------------------------------------------------
559 // HISTOGRAMS
560 // --- Filled on an Event-by-event basis
561 //------------------------------------------------
562    fHistV0MultiplicityBeforeTrigSel(0),
563    fHistV0MultiplicityForTrigEvt(0), 
564    fHistV0MultiplicityForSelEvt(0),
565    fHistV0MultiplicityForSelEvtNoTPCOnly(0),
566    fHistV0MultiplicityForSelEvtNoTPCOnlyNoPileup(0),
567    fHistMultiplicityBeforeTrigSel(0),
568    fHistMultiplicityForTrigEvt(0),
569    fHistMultiplicity(0),
570    fHistMultiplicityNoTPCOnly(0),
571    fHistMultiplicityNoTPCOnlyNoPileup(0),
572
573 //V0A Centrality
574 fHistMultiplicityV0ABeforeTrigSel(0),
575 fHistMultiplicityV0AForTrigEvt(0),
576 fHistMultiplicityV0A(0),
577 fHistMultiplicityV0ANoTPCOnly(0),
578 fHistMultiplicityV0ANoTPCOnlyNoPileup(0),
579
580 //ZNA Centrality
581 fHistMultiplicityZNABeforeTrigSel(0),
582 fHistMultiplicityZNAForTrigEvt(0),
583 fHistMultiplicityZNA(0),
584 fHistMultiplicityZNANoTPCOnly(0),
585 fHistMultiplicityZNANoTPCOnlyNoPileup(0),
586
587 //TRK Centrality
588 fHistMultiplicityTRKBeforeTrigSel(0),
589 fHistMultiplicityTRKForTrigEvt(0),
590 fHistMultiplicityTRK(0),
591 fHistMultiplicityTRKNoTPCOnly(0),
592 fHistMultiplicityTRKNoTPCOnlyNoPileup(0),
593
594 //SPD Centrality
595 fHistMultiplicitySPDBeforeTrigSel(0),
596 fHistMultiplicitySPDForTrigEvt(0),
597 fHistMultiplicitySPD(0),
598 fHistMultiplicitySPDNoTPCOnly(0),
599 fHistMultiplicitySPDNoTPCOnlyNoPileup(0),
600
601         f2dHistMultiplicityVsTrueBeforeTrigSel(0),
602         f2dHistMultiplicityVsTrueForTrigEvt(0),
603         f2dHistMultiplicityVsTrue(0),
604         f2dHistMultiplicityVsTrueNoTPCOnly(0),
605         f2dHistMultiplicityVsTrueNoTPCOnlyNoPileup(0),
606
607   //Raw Data for Vertex Z position estimator change
608         f2dHistMultiplicityVsVertexZBeforeTrigSel(0),
609         f2dHistMultiplicityVsVertexZForTrigEvt(0),
610         f2dHistMultiplicityVsVertexZ(0),
611         f2dHistMultiplicityVsVertexZNoTPCOnly(0),
612         f2dHistMultiplicityVsVertexZNoTPCOnlyNoPileup(0),
613
614   fHistGenVertexZBeforeTrigSel(0),     
615   fHistGenVertexZForTrigEvt(0),
616   fHistGenVertexZ(0),
617   fHistGenVertexZNoTPCOnly(0),
618   fHistGenVertexZNoTPCOnlyNoPileup(0),
619
620 //------------------------------------------------
621 // PARTICLE HISTOGRAMS
622 // --- Filled on a Particle-by-Particle basis
623 //------------------------------------------------
624
625 //Standard V0M
626 f3dHistPrimAnalysisPtVsYVsMultLambda(0),
627 f3dHistPrimAnalysisPtVsYVsMultAntiLambda(0),
628 f3dHistPrimAnalysisPtVsYVsMultK0Short(0),
629 f3dHistPrimAnalysisPtVsYCMSVsMultLambda(0),
630 f3dHistPrimAnalysisPtVsYCMSVsMultAntiLambda(0),
631 f3dHistPrimAnalysisPtVsYCMSVsMultK0Short(0),
632
633 //True Multiplicity
634 f3dHistPrimAnalysisPtVsYVsMultMCLambda(0),
635 f3dHistPrimAnalysisPtVsYVsMultMCAntiLambda(0),
636 f3dHistPrimAnalysisPtVsYVsMultMCK0Short(0),
637 f3dHistPrimAnalysisPtVsYCMSVsMultMCLambda(0),
638 f3dHistPrimAnalysisPtVsYCMSVsMultMCAntiLambda(0),
639 f3dHistPrimAnalysisPtVsYCMSVsMultMCK0Short(0),
640
641 //V0A
642 f3dHistPrimAnalysisPtVsYVsMultV0ALambda(0),
643 f3dHistPrimAnalysisPtVsYVsMultV0AAntiLambda(0),
644 f3dHistPrimAnalysisPtVsYVsMultV0AK0Short(0),
645 f3dHistPrimAnalysisPtVsYCMSVsMultV0ALambda(0),
646 f3dHistPrimAnalysisPtVsYCMSVsMultV0AAntiLambda(0),
647 f3dHistPrimAnalysisPtVsYCMSVsMultV0AK0Short(0),
648
649 //ZNA
650 f3dHistPrimAnalysisPtVsYVsMultZNALambda(0),
651 f3dHistPrimAnalysisPtVsYVsMultZNAAntiLambda(0),
652 f3dHistPrimAnalysisPtVsYVsMultZNAK0Short(0),
653 f3dHistPrimAnalysisPtVsYCMSVsMultZNALambda(0),
654 f3dHistPrimAnalysisPtVsYCMSVsMultZNAAntiLambda(0),
655 f3dHistPrimAnalysisPtVsYCMSVsMultZNAK0Short(0),
656
657 //TRK
658 f3dHistPrimAnalysisPtVsYVsMultTRKLambda(0),
659 f3dHistPrimAnalysisPtVsYVsMultTRKAntiLambda(0),
660 f3dHistPrimAnalysisPtVsYVsMultTRKK0Short(0),
661 f3dHistPrimAnalysisPtVsYCMSVsMultTRKLambda(0),
662 f3dHistPrimAnalysisPtVsYCMSVsMultTRKAntiLambda(0),
663 f3dHistPrimAnalysisPtVsYCMSVsMultTRKK0Short(0),
664
665 //SPD
666 f3dHistPrimAnalysisPtVsYVsMultSPDLambda(0),
667 f3dHistPrimAnalysisPtVsYVsMultSPDAntiLambda(0),
668 f3dHistPrimAnalysisPtVsYVsMultSPDK0Short(0),
669 f3dHistPrimAnalysisPtVsYCMSVsMultSPDLambda(0),
670 f3dHistPrimAnalysisPtVsYCMSVsMultSPDAntiLambda(0),
671 f3dHistPrimAnalysisPtVsYCMSVsMultSPDK0Short(0),
672
673 //Standard V0M again
674 f3dHistPrimRawPtVsYVsMultLambda(0),
675 f3dHistPrimRawPtVsYVsMultAntiLambda(0),
676 f3dHistPrimRawPtVsYVsMultK0Short(0),
677 f3dHistPrimRawPtVsYCMSVsMultLambda(0),
678 f3dHistPrimRawPtVsYCMSVsMultAntiLambda(0),
679 f3dHistPrimRawPtVsYCMSVsMultK0Short(0),
680
681 //V0A again
682 f3dHistPrimRawPtVsYVsMultV0ALambda(0),
683 f3dHistPrimRawPtVsYVsMultV0AAntiLambda(0),
684 f3dHistPrimRawPtVsYVsMultV0AK0Short(0),
685 f3dHistPrimRawPtVsYCMSVsMultV0ALambda(0),
686 f3dHistPrimRawPtVsYCMSVsMultV0AAntiLambda(0),
687 f3dHistPrimRawPtVsYCMSVsMultV0AK0Short(0),
688
689 //ZNA
690 f3dHistPrimRawPtVsYVsMultZNALambda(0),
691 f3dHistPrimRawPtVsYVsMultZNAAntiLambda(0),
692 f3dHistPrimRawPtVsYVsMultZNAK0Short(0),
693 f3dHistPrimRawPtVsYCMSVsMultZNALambda(0),
694 f3dHistPrimRawPtVsYCMSVsMultZNAAntiLambda(0),
695 f3dHistPrimRawPtVsYCMSVsMultZNAK0Short(0),
696
697 //TRK
698 f3dHistPrimRawPtVsYVsMultTRKLambda(0),
699 f3dHistPrimRawPtVsYVsMultTRKAntiLambda(0),
700 f3dHistPrimRawPtVsYVsMultTRKK0Short(0),
701 f3dHistPrimRawPtVsYCMSVsMultTRKLambda(0),
702 f3dHistPrimRawPtVsYCMSVsMultTRKAntiLambda(0),
703 f3dHistPrimRawPtVsYCMSVsMultTRKK0Short(0),
704
705 //SPD
706 f3dHistPrimRawPtVsYVsMultSPDLambda(0),
707 f3dHistPrimRawPtVsYVsMultSPDAntiLambda(0),
708 f3dHistPrimRawPtVsYVsMultSPDK0Short(0),
709 f3dHistPrimRawPtVsYCMSVsMultSPDLambda(0),
710 f3dHistPrimRawPtVsYCMSVsMultSPDAntiLambda(0),
711 f3dHistPrimRawPtVsYCMSVsMultSPDK0Short(0),
712
713    f3dHistPrimRawPtVsYVsMultNonInjLambda(0),
714    f3dHistPrimRawPtVsYVsMultNonInjAntiLambda(0),
715    f3dHistPrimRawPtVsYVsMultNonInjK0Short(0),
716    f3dHistPrimRawPtVsYVsMultMCLambda(0),
717    f3dHistPrimRawPtVsYVsMultMCAntiLambda(0),
718    f3dHistPrimRawPtVsYVsMultMCK0Short(0),
719    f3dHistPrimRawPtVsYVsVertexZLambda(0),
720    f3dHistPrimRawPtVsYVsVertexZAntiLambda(0),
721    f3dHistPrimRawPtVsYVsVertexZK0Short(0),
722    f3dHistPrimCloseToPVPtVsYVsMultLambda(0),
723    f3dHistPrimCloseToPVPtVsYVsMultAntiLambda(0),
724    f3dHistPrimCloseToPVPtVsYVsMultK0Short(0),
725    f3dHistPrimRawPtVsYVsDecayLengthLambda(0),
726    f3dHistPrimRawPtVsYVsDecayLengthAntiLambda(0),
727    f3dHistPrimRawPtVsYVsDecayLengthK0Short(0),
728
729 //V0M
730 f3dHistGenPtVsYVsMultXiMinus(0),
731 f3dHistGenPtVsYVsMultXiPlus(0),
732 f3dHistGenSelectedPtVsYVsMultXiMinus(0),
733 f3dHistGenSelectedPtVsYVsMultXiPlus(0),
734 f3dHistGenPtVsYCMSVsMultXiMinus(0),
735 f3dHistGenPtVsYCMSVsMultXiPlus(0),
736 f3dHistGenSelectedPtVsYCMSVsMultXiMinus(0),
737 f3dHistGenSelectedPtVsYCMSVsMultXiPlus(0),
738
739 //V0A
740 f3dHistGenPtVsYVsMultV0AXiMinus(0),
741 f3dHistGenPtVsYVsMultV0AXiPlus(0),
742 f3dHistGenSelectedPtVsYVsMultV0AXiMinus(0),
743 f3dHistGenSelectedPtVsYVsMultV0AXiPlus(0),
744 f3dHistGenPtVsYCMSVsMultV0AXiMinus(0),
745 f3dHistGenPtVsYCMSVsMultV0AXiPlus(0),
746 f3dHistGenSelectedPtVsYCMSVsMultV0AXiMinus(0),
747 f3dHistGenSelectedPtVsYCMSVsMultV0AXiPlus(0),
748
749 //ZNA
750 f3dHistGenPtVsYVsMultZNAXiMinus(0),
751 f3dHistGenPtVsYVsMultZNAXiPlus(0),
752 f3dHistGenSelectedPtVsYVsMultZNAXiMinus(0),
753 f3dHistGenSelectedPtVsYVsMultZNAXiPlus(0),
754 f3dHistGenPtVsYCMSVsMultZNAXiMinus(0),
755 f3dHistGenPtVsYCMSVsMultZNAXiPlus(0),
756 f3dHistGenSelectedPtVsYCMSVsMultZNAXiMinus(0),
757 f3dHistGenSelectedPtVsYCMSVsMultZNAXiPlus(0),
758
759 //TRK
760 f3dHistGenPtVsYVsMultTRKXiMinus(0),
761 f3dHistGenPtVsYVsMultTRKXiPlus(0),
762 f3dHistGenSelectedPtVsYVsMultTRKXiMinus(0),
763 f3dHistGenSelectedPtVsYVsMultTRKXiPlus(0),
764 f3dHistGenPtVsYCMSVsMultTRKXiMinus(0),
765 f3dHistGenPtVsYCMSVsMultTRKXiPlus(0),
766 f3dHistGenSelectedPtVsYCMSVsMultTRKXiMinus(0),
767 f3dHistGenSelectedPtVsYCMSVsMultTRKXiPlus(0),
768
769 //SPD
770 f3dHistGenPtVsYVsMultSPDXiMinus(0),
771 f3dHistGenPtVsYVsMultSPDXiPlus(0),
772 f3dHistGenSelectedPtVsYVsMultSPDXiMinus(0),
773 f3dHistGenSelectedPtVsYVsMultSPDXiPlus(0),
774 f3dHistGenPtVsYCMSVsMultSPDXiMinus(0),
775 f3dHistGenPtVsYCMSVsMultSPDXiPlus(0),
776 f3dHistGenSelectedPtVsYCMSVsMultSPDXiMinus(0),
777 f3dHistGenSelectedPtVsYCMSVsMultSPDXiPlus(0),
778
779    fHistPVx(0),
780    fHistPVy(0),
781    fHistPVz(0),
782    fHistPVxAnalysis(0),
783    fHistPVyAnalysis(0),
784    fHistPVzAnalysis(0),
785    fHistPVxAnalysisHasHighPtLambda(0),
786    fHistPVyAnalysisHasHighPtLambda(0),
787    fHistPVzAnalysisHasHighPtLambda(0),
788    fHistSwappedV0Counter(0)
789 {
790    // Constructor
791   // Set Loose cuts or not here...
792   // REALLY LOOSE? Be careful when attempting to run over PbPb if fkRunV0Vertexer is set!
793   fV0Sels[0] =  33.  ;  // max allowed chi2
794   fV0Sels[1] =   0.02;  // min allowed impact parameter for the 1st daughter (LHC09a4 : 0.05)
795   fV0Sels[2] =   0.02;  // min allowed impact parameter for the 2nd daughter (LHC09a4 : 0.05)
796   fV0Sels[3] =   2.0 ;  // max allowed DCA between the daughter tracks       (LHC09a4 : 0.5)
797   fV0Sels[4] =   0.95;  // min allowed cosine of V0's pointing angle         (LHC09a4 : 0.99)
798   fV0Sels[5] =   0.5 ;  // min radius of the fiducial volume                 (LHC09a4 : 0.2)
799   fV0Sels[6] = 200.  ;  // max radius of the fiducial volume                 (LHC09a4 : 100.0)
800   // Output slot #0 writes into a TList container (Cascade)
801   DefineOutput(1, TList::Class());
802   DefineOutput(2, TTree::Class());
803 }
804
805
806 AliAnalysisTaskExtractPerformanceV0::~AliAnalysisTaskExtractPerformanceV0()
807 {
808 //------------------------------------------------
809 // DESTRUCTOR
810 //------------------------------------------------
811
812    if (fListHistV0){
813       delete fListHistV0;
814       fListHistV0 = 0x0;
815    }
816    if (fTree){
817       delete fTree;
818       fTree = 0x0;
819    }
820     //cleanup esd track cuts object too...
821    if (fESDtrackCuts){
822     delete fESDtrackCuts;
823     fESDtrackCuts = 0x0; 
824   }
825   
826   if (fUtils){
827     delete fUtils;
828     fUtils = 0x0;
829   }
830 }
831
832 //________________________________________________________________________
833 void AliAnalysisTaskExtractPerformanceV0::UserCreateOutputObjects()
834 {
835
836    OpenFile(2); 
837    // Called once
838
839 //------------------------------------------------
840
841    fTree = new TTree("fTree","V0Candidates");
842
843 //------------------------------------------------
844 // fTree Branch definitions - V0 Tree
845 //------------------------------------------------
846
847 //-----------BASIC-INFO---------------------------
848 /* 1*/   fTree->Branch("fTreeVariablePrimaryStatus",&fTreeVariablePrimaryStatus,"fTreeVariablePrimaryStatus/I");        
849 /* 2*/   fTree->Branch("fTreeVariablePrimaryStatusMother",&fTreeVariablePrimaryStatusMother,"fTreeVariablePrimaryStatusMother/I");      
850 /* 2*/   fTree->Branch("fTreeVariableChi2V0",&fTreeVariableChi2V0,"Chi2V0/F");
851 /* 3*/   fTree->Branch("fTreeVariableDcaV0Daughters",&fTreeVariableDcaV0Daughters,"fTreeVariableDcaV0Daughters/F");
852 /* 4*/   fTree->Branch("fTreeVariableDcaPosToPrimVertex",&fTreeVariableDcaPosToPrimVertex,"fTreeVariableDcaPosToPrimVertex/F");
853 /* 5*/   fTree->Branch("fTreeVariableDcaNegToPrimVertex",&fTreeVariableDcaNegToPrimVertex,"fTreeVariableDcaNegToPrimVertex/F");
854 /* 6*/   fTree->Branch("fTreeVariableV0Radius",&fTreeVariableV0Radius,"fTreeVariableV0Radius/F");
855 /* 7*/   fTree->Branch("fTreeVariablePt",&fTreeVariablePt,"fTreeVariablePt/F");
856 /* 7*/   fTree->Branch("fTreeVariablePtMC",&fTreeVariablePtMC,"fTreeVariablePtMC/F");
857 /* 8*/   fTree->Branch("fTreeVariableRapK0Short",&fTreeVariableRapK0Short,"fTreeVariableRapK0Short/F");
858 /* 9*/   fTree->Branch("fTreeVariableRapLambda",&fTreeVariableRapLambda,"fTreeVariableRapLambda/F");
859 /*10*/   fTree->Branch("fTreeVariableRapMC",&fTreeVariableRapMC,"fTreeVariableRapMC/F");
860 /*11*/   fTree->Branch("fTreeVariableInvMassK0s",&fTreeVariableInvMassK0s,"fTreeVariableInvMassK0s/F");
861 /*12*/   fTree->Branch("fTreeVariableInvMassLambda",&fTreeVariableInvMassLambda,"fTreeVariableInvMassLambda/F");
862 /*13*/   fTree->Branch("fTreeVariableInvMassAntiLambda",&fTreeVariableInvMassAntiLambda,"fTreeVariableInvMassAntiLambda/F");
863 /*14*/   fTree->Branch("fTreeVariableAlphaV0",&fTreeVariableAlphaV0,"fTreeVariableAlphaV0/F");
864 /*15*/   fTree->Branch("fTreeVariablePtArmV0",&fTreeVariablePtArmV0,"fTreeVariablePtArmV0/F");
865 /*16*/   fTree->Branch("fTreeVariableNegTransvMomentum",&fTreeVariableNegTransvMomentum,"fTreeVariableNegTransvMomentum/F");
866 /*17*/   fTree->Branch("fTreeVariablePosTransvMomentum",&fTreeVariablePosTransvMomentum,"fTreeVariablePosTransvMomentum/F");
867 /*18*/   fTree->Branch("fTreeVariableNegTransvMomentumMC",&fTreeVariableNegTransvMomentumMC,"fTreeVariableNegTransvMomentumMC/F");
868 /*19*/   fTree->Branch("fTreeVariablePosTransvMomentumMC",&fTreeVariablePosTransvMomentumMC,"fTreeVariablePosTransvMomentumMC/F");
869 /*20*/   fTree->Branch("fTreeVariableLeastNbrCrossedRows",&fTreeVariableLeastNbrCrossedRows,"fTreeVariableLeastNbrCrossedRows/I");
870 /*21*/   fTree->Branch("fTreeVariableLeastRatioCrossedRowsOverFindable",&fTreeVariableLeastRatioCrossedRowsOverFindable,"fTreeVariableLeastRatioCrossedRowsOverFindable/F");
871 /*22*/   fTree->Branch("fTreeVariablePID",&fTreeVariablePID,"fTreeVariablePID/I");
872 /*23*/   fTree->Branch("fTreeVariablePIDPositive",&fTreeVariablePIDPositive,"fTreeVariablePIDPositive/I");
873 /*24*/   fTree->Branch("fTreeVariablePIDNegative",&fTreeVariablePIDNegative,"fTreeVariablePIDNegative/I");
874 /*25*/   fTree->Branch("fTreeVariablePIDMother",&fTreeVariablePIDMother,"fTreeVariablePIDMother/I");
875 /*26*/   fTree->Branch("fTreeVariablePtXiMother",&fTreeVariablePtMother,"fTreeVariablePtMother/F");
876 /*27*/   fTree->Branch("fTreeVariableV0CosineOfPointingAngle",&fTreeVariableV0CosineOfPointingAngle,"fTreeVariableV0CosineOfPointingAngle/F");
877 //-----------MULTIPLICITY-INFO--------------------
878 /*28*/   fTree->Branch("fTreeVariableMultiplicity",&fTreeVariableMultiplicity,"fTreeVariableMultiplicity/I");
879 /*28*/   fTree->Branch("fTreeVariableMultiplicityMC",&fTreeVariableMultiplicityMC,"fTreeVariableMultiplicityMC/I");
880   /*17*/        fTree->Branch("fTreeVariableMultiplicityV0A",&fTreeVariableMultiplicityV0A,"fTreeVariableMultiplicityV0A/I");
881   /*17*/        fTree->Branch("fTreeVariableMultiplicityZNA",&fTreeVariableMultiplicityZNA,"fTreeVariableMultiplicityZNA/I");
882   /*17*/        fTree->Branch("fTreeVariableMultiplicityTRK",&fTreeVariableMultiplicityTRK,"fTreeVariableMultiplicityTRK/I");
883   /*17*/        fTree->Branch("fTreeVariableMultiplicitySPD",&fTreeVariableMultiplicitySPD,"fTreeVariableMultiplicitySPD/I");
884 //------------------------------------------------
885 /*29*/   fTree->Branch("fTreeVariableDistOverTotMom",&fTreeVariableDistOverTotMom,"fTreeVariableDistOverTotMom/F");
886 /*30*/   fTree->Branch("fTreeVariableNSigmasPosProton",&fTreeVariableNSigmasPosProton,"fTreeVariableNSigmasPosProton/F");
887 /*31*/   fTree->Branch("fTreeVariableNSigmasPosPion",&fTreeVariableNSigmasPosPion,"fTreeVariableNSigmasPosPion/F");
888 /*32*/   fTree->Branch("fTreeVariableNSigmasNegProton",&fTreeVariableNSigmasNegProton,"fTreeVariableNSigmasNegProton/F");
889 /*33*/   fTree->Branch("fTreeVariableNSigmasNegPion",&fTreeVariableNSigmasNegPion,"fTreeVariableNSigmasNegPion/F");
890 //------------------------------------------------
891 /*34*/   fTree->Branch("fTreeVariableNegEta",&fTreeVariableNegEta,"fTreeVariableNegEta/F");
892 /*35*/   fTree->Branch("fTreeVariablePosEta",&fTreeVariablePosEta,"fTreeVariablePosEta/F");
893 /*36*/   fTree->Branch("fTreeVariableV0CreationRadius",&fTreeVariableV0CreationRadius,"fTreeVariableV0CreationRadius/F");
894   
895     if ( fkLightWeight == kFALSE ){ // these are debugging branches!
896 /*37*/   fTree->Branch("fTreeVariableIndexStatus",&fTreeVariableIndexStatus,"fTreeVariableIndexStatus/I");
897 /*38*/   fTree->Branch("fTreeVariableIndexStatusMother",&fTreeVariableIndexStatusMother,"fTreeVariableIndexStatusMother/I");
898     }
899
900 /*39*/   fTree->Branch("fTreeVariableRunNumber",&fTreeVariableRunNumber,"fTreeVariableRunNumber/I");
901 /*40*/   fTree->Branch("fTreeVariableEventNumber",&fTreeVariableEventNumber,"fTreeVariableEventNumber/l");
902
903     if ( fkLightWeight == kFALSE ){ // these are debugging branches!
904 /*34*/   fTree->Branch("fTreeVariableVertexZ",&fTreeVariableVertexZ,"fTreeVariableVertexZ/F");
905     }
906       
907     if ( fkLightWeight == kFALSE ){ // these are debugging branches!
908 //-----------FOR CTAU DEBUGGING: Full Phase Space + Decay Position Info 
909         fTree->Branch("fTreeVariableV0x",&fTreeVariableV0x,"fTreeVariableV0x/F");
910         fTree->Branch("fTreeVariableV0y",&fTreeVariableV0y,"fTreeVariableV0y/F");
911         fTree->Branch("fTreeVariableV0z",&fTreeVariableV0z,"fTreeVariableV0z/F");
912
913         fTree->Branch("fTreeVariableV0Px",&fTreeVariableV0Px,"fTreeVariableV0Px/F");
914         fTree->Branch("fTreeVariableV0Py",&fTreeVariableV0Py,"fTreeVariableV0Py/F");
915         fTree->Branch("fTreeVariableV0Pz",&fTreeVariableV0Pz,"fTreeVariableV0Pz/F");
916
917 //-----------FOR CTAU DEBUGGING: Full Phase Space + Decay Position Info, perfect info from MC
918         fTree->Branch("fTreeVariableMCV0x",&fTreeVariableMCV0x,"fTreeVariableMCV0x/F");
919         fTree->Branch("fTreeVariableMCV0y",&fTreeVariableMCV0y,"fTreeVariableMCV0y/F");
920         fTree->Branch("fTreeVariableMCV0z",&fTreeVariableMCV0z,"fTreeVariableMCV0z/F");
921
922         fTree->Branch("fTreeVariableMCV0Px",&fTreeVariableMCV0Px,"fTreeVariableMCV0Px/F");
923         fTree->Branch("fTreeVariableMCV0Py",&fTreeVariableMCV0Py,"fTreeVariableMCV0Py/F");
924         fTree->Branch("fTreeVariableMCV0Pz",&fTreeVariableMCV0Pz,"fTreeVariableMCV0Pz/F");
925
926 //-----------FOR CTAU DEBUGGING: Primary vertex info 
927         fTree->Branch("fTreeVariablePVx",&fTreeVariablePVx,"fTreeVariablePVx/F");
928         fTree->Branch("fTreeVariablePVy",&fTreeVariablePVy,"fTreeVariablePVy/F");
929         fTree->Branch("fTreeVariablePVz",&fTreeVariablePVz,"fTreeVariablePVz/F");
930
931         fTree->Branch("fTreeVariableMCPVx",&fTreeVariableMCPVx,"fTreeVariableMCPVx/F");
932         fTree->Branch("fTreeVariableMCPVy",&fTreeVariableMCPVy,"fTreeVariableMCPVy/F");
933         fTree->Branch("fTreeVariableMCPVz",&fTreeVariableMCPVz,"fTreeVariableMCPVz/F");
934     }
935
936         fTree->Branch("fTreeVariableIsNonInjected",&fTreeVariableIsNonInjected,"fTreeVariableIsNonInjected/O"); //O for bOOlean...
937   
938   if ( fkLightWeight == kFALSE ){ // these are debugging branches!
939     fTree->Branch("fTreeVariableNegTrackStatus",&fTreeVariableNegTrackStatus,"fTreeVariableNegTrackStatus/l");
940     fTree->Branch("fTreeVariablePosTrackStatus",&fTreeVariablePosTrackStatus,"fTreeVariablePosTrackStatus/l");
941     fTree->Branch("fTreeVariableNegPhysicalStatus",&fTreeVariableNegPhysicalStatus,"fTreeVariableNegPhysicalStatus/I");
942     fTree->Branch("fTreeVariablePosPhysicalStatus",&fTreeVariablePosPhysicalStatus,"fTreeVariablePosPhysicalStatus/I");
943   }
944   
945 //------------------------------------------------
946 // Particle Identification Setup
947 //------------------------------------------------
948   
949   AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
950   AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
951   fPIDResponse = inputHandler->GetPIDResponse();
952   
953   // Multiplicity
954   
955   if(! fESDtrackCuts ){
956     fESDtrackCuts = new AliESDtrackCuts();
957   }
958   if(! fUtils ){
959     fUtils = new AliAnalysisUtils();
960   }
961
962 //------------------------------------------------
963 // V0 Multiplicity Histograms
964 //------------------------------------------------
965
966    // Create histograms
967    OpenFile(1);
968    fListHistV0 = new TList();
969    fListHistV0->SetOwner();  // See http://root.cern.ch/root/html/TCollection.html#TCollection:SetOwner
970
971
972    if(! fHistV0MultiplicityBeforeTrigSel) {
973       fHistV0MultiplicityBeforeTrigSel = new TH1F("fHistV0MultiplicityBeforeTrigSel", 
974          "V0s per event (before Trig. Sel.);Nbr of V0s/Evt;Events", 
975          25, 0, 25);
976       fListHistV0->Add(fHistV0MultiplicityBeforeTrigSel);
977    }
978            
979    if(! fHistV0MultiplicityForTrigEvt) {
980       fHistV0MultiplicityForTrigEvt = new TH1F("fHistV0MultiplicityForTrigEvt", 
981          "V0s per event (for triggered evt);Nbr of V0s/Evt;Events", 
982          25, 0, 25);
983       fListHistV0->Add(fHistV0MultiplicityForTrigEvt);
984    }
985
986    if(! fHistV0MultiplicityForSelEvt) {
987       fHistV0MultiplicityForSelEvt = new TH1F("fHistV0MultiplicityForSelEvt", 
988          "V0s per event;Nbr of V0s/Evt;Events", 
989          25, 0, 25);
990       fListHistV0->Add(fHistV0MultiplicityForSelEvt);
991    }
992
993    if(! fHistV0MultiplicityForSelEvtNoTPCOnly) {
994       fHistV0MultiplicityForSelEvtNoTPCOnly = new TH1F("fHistV0MultiplicityForSelEvtNoTPCOnly", 
995          "V0s per event;Nbr of V0s/Evt;Events", 
996          25, 0, 25);
997       fListHistV0->Add(fHistV0MultiplicityForSelEvtNoTPCOnly);
998    }
999    if(! fHistV0MultiplicityForSelEvtNoTPCOnlyNoPileup) {
1000       fHistV0MultiplicityForSelEvtNoTPCOnlyNoPileup = new TH1F("fHistV0MultiplicityForSelEvtNoTPCOnlyNoPileup", 
1001          "V0s per event;Nbr of V0s/Evt;Events", 
1002          25, 0, 25);
1003       fListHistV0->Add(fHistV0MultiplicityForSelEvtNoTPCOnlyNoPileup);
1004    }
1005
1006 //------------------------------------------------
1007 // Track Multiplicity Histograms
1008 //------------------------------------------------
1009
1010    if(! fHistMultiplicityBeforeTrigSel) {
1011       fHistMultiplicityBeforeTrigSel = new TH1F("fHistMultiplicityBeforeTrigSel", 
1012          "Tracks per event;Nbr of Tracks;Events", 
1013          200, 0, 200);          
1014       fListHistV0->Add(fHistMultiplicityBeforeTrigSel);
1015    }
1016    if(! fHistMultiplicityForTrigEvt) {
1017       fHistMultiplicityForTrigEvt = new TH1F("fHistMultiplicityForTrigEvt", 
1018          "Tracks per event;Nbr of Tracks;Events", 
1019          200, 0, 200);          
1020       fListHistV0->Add(fHistMultiplicityForTrigEvt);
1021    }
1022    if(! fHistMultiplicity) {
1023       fHistMultiplicity = new TH1F("fHistMultiplicity", 
1024          "Tracks per event;Nbr of Tracks;Events", 
1025          200, 0, 200);          
1026       fListHistV0->Add(fHistMultiplicity);
1027    }
1028    if(! fHistMultiplicityNoTPCOnly) {
1029       fHistMultiplicityNoTPCOnly = new TH1F("fHistMultiplicityNoTPCOnly", 
1030          "Tracks per event;Nbr of Tracks;Events", 
1031          200, 0, 200);          
1032       fListHistV0->Add(fHistMultiplicityNoTPCOnly);
1033    }
1034    if(! fHistMultiplicityNoTPCOnlyNoPileup) {
1035       fHistMultiplicityNoTPCOnlyNoPileup = new TH1F("fHistMultiplicityNoTPCOnlyNoPileup", 
1036          "Tracks per event;Nbr of Tracks;Events", 
1037          200, 0, 200);          
1038       fListHistV0->Add(fHistMultiplicityNoTPCOnlyNoPileup);
1039    }
1040   
1041   //V0A Centrality (if PbPb / pPb)
1042   if(! fHistMultiplicityV0ABeforeTrigSel) {
1043     fHistMultiplicityV0ABeforeTrigSel = new TH1F("fHistMultiplicityV0ABeforeTrigSel",
1044                                                  "Centrality Distribution: V0A;V0A Centrality;Events",
1045                                                  200, 0, 200);
1046     fListHistV0->Add(fHistMultiplicityV0ABeforeTrigSel);
1047   }
1048   if(! fHistMultiplicityV0AForTrigEvt) {
1049     fHistMultiplicityV0AForTrigEvt = new TH1F("fHistMultiplicityV0AForTrigEvt",
1050                                               "Centrality Distribution: V0A;V0A Centrality;Events",
1051                                               200, 0, 200);
1052     fListHistV0->Add(fHistMultiplicityV0AForTrigEvt);
1053   }
1054   if(! fHistMultiplicityV0A) {
1055     fHistMultiplicityV0A = new TH1F("fHistMultiplicityV0A",
1056                                     "Centrality Distribution: V0A;V0A Centrality;Events",
1057                                     200, 0, 200);
1058     fListHistV0->Add(fHistMultiplicityV0A);
1059   }
1060   if(! fHistMultiplicityV0ANoTPCOnly) {
1061     fHistMultiplicityV0ANoTPCOnly = new TH1F("fHistMultiplicityV0ANoTPCOnly",
1062                                              "Centrality Distribution: V0A;V0A Centrality;Events",
1063                                              200, 0, 200);
1064     fListHistV0->Add(fHistMultiplicityV0ANoTPCOnly);
1065   }
1066   if(! fHistMultiplicityV0ANoTPCOnlyNoPileup) {
1067     fHistMultiplicityV0ANoTPCOnlyNoPileup = new TH1F("fHistMultiplicityV0ANoTPCOnlyNoPileup",
1068                                                      "Centrality Distribution: V0A;V0A Centrality;Events",
1069                                                      200, 0, 200);
1070     fListHistV0->Add(fHistMultiplicityV0ANoTPCOnlyNoPileup);
1071   }
1072   
1073   //ZNA Centrality (if PbPb / pPb)
1074   if(! fHistMultiplicityZNABeforeTrigSel) {
1075     fHistMultiplicityZNABeforeTrigSel = new TH1F("fHistMultiplicityZNABeforeTrigSel",
1076                                                  "Centrality Distribution: ZNA;ZNA Centrality;Events",
1077                                                  200, 0, 200);
1078     fListHistV0->Add(fHistMultiplicityZNABeforeTrigSel);
1079   }
1080   if(! fHistMultiplicityZNAForTrigEvt) {
1081     fHistMultiplicityZNAForTrigEvt = new TH1F("fHistMultiplicityZNAForTrigEvt",
1082                                               "Centrality Distribution: ZNA;ZNA Centrality;Events",
1083                                               200, 0, 200);
1084     fListHistV0->Add(fHistMultiplicityZNAForTrigEvt);
1085   }
1086   if(! fHistMultiplicityZNA) {
1087     fHistMultiplicityZNA = new TH1F("fHistMultiplicityZNA",
1088                                     "Centrality Distribution: ZNA;ZNA Centrality;Events",
1089                                     200, 0, 200);
1090     fListHistV0->Add(fHistMultiplicityZNA);
1091   }
1092   if(! fHistMultiplicityZNANoTPCOnly) {
1093     fHistMultiplicityZNANoTPCOnly = new TH1F("fHistMultiplicityZNANoTPCOnly",
1094                                              "Centrality Distribution: ZNA;ZNA Centrality;Events",
1095                                              200, 0, 200);
1096     fListHistV0->Add(fHistMultiplicityZNANoTPCOnly);
1097   }
1098   if(! fHistMultiplicityZNANoTPCOnlyNoPileup) {
1099     fHistMultiplicityZNANoTPCOnlyNoPileup = new TH1F("fHistMultiplicityZNANoTPCOnlyNoPileup",
1100                                                      "Centrality Distribution: ZNA;ZNA Centrality;Events",
1101                                                      200, 0, 200);
1102     fListHistV0->Add(fHistMultiplicityZNANoTPCOnlyNoPileup);
1103   }
1104   
1105   //TRK Centrality (if PbPb / pPb)
1106   if(! fHistMultiplicityTRKBeforeTrigSel) {
1107     fHistMultiplicityTRKBeforeTrigSel = new TH1F("fHistMultiplicityTRKBeforeTrigSel",
1108                                                  "Centrality Distribution: TRK;TRK Centrality;Events",
1109                                                  200, 0, 200);
1110     fListHistV0->Add(fHistMultiplicityTRKBeforeTrigSel);
1111   }
1112   if(! fHistMultiplicityTRKForTrigEvt) {
1113     fHistMultiplicityTRKForTrigEvt = new TH1F("fHistMultiplicityTRKForTrigEvt",
1114                                               "Centrality Distribution: TRK;TRK Centrality;Events",
1115                                               200, 0, 200);
1116     fListHistV0->Add(fHistMultiplicityTRKForTrigEvt);
1117   }
1118   if(! fHistMultiplicityTRK) {
1119     fHistMultiplicityTRK = new TH1F("fHistMultiplicityTRK",
1120                                     "Centrality Distribution: TRK;TRK Centrality;Events",
1121                                     200, 0, 200);
1122     fListHistV0->Add(fHistMultiplicityTRK);
1123   }
1124   if(! fHistMultiplicityTRKNoTPCOnly) {
1125     fHistMultiplicityTRKNoTPCOnly = new TH1F("fHistMultiplicityTRKNoTPCOnly",
1126                                              "Centrality Distribution: TRK;TRK Centrality;Events",
1127                                              200, 0, 200);
1128     fListHistV0->Add(fHistMultiplicityTRKNoTPCOnly);
1129   }
1130   if(! fHistMultiplicityTRKNoTPCOnlyNoPileup) {
1131     fHistMultiplicityTRKNoTPCOnlyNoPileup = new TH1F("fHistMultiplicityTRKNoTPCOnlyNoPileup",
1132                                                      "Centrality Distribution: TRK;TRK Centrality;Events",
1133                                                      200, 0, 200);
1134     fListHistV0->Add(fHistMultiplicityTRKNoTPCOnlyNoPileup);
1135   }
1136   
1137   //SPD Centrality (if PbPb / pPb)
1138   if(! fHistMultiplicitySPDBeforeTrigSel) {
1139     fHistMultiplicitySPDBeforeTrigSel = new TH1F("fHistMultiplicitySPDBeforeTrigSel",
1140                                                  "Centrality Distribution: SPD;SPD Centrality;Events",
1141                                                  200, 0, 200);
1142     fListHistV0->Add(fHistMultiplicitySPDBeforeTrigSel);
1143   }
1144   if(! fHistMultiplicitySPDForTrigEvt) {
1145     fHistMultiplicitySPDForTrigEvt = new TH1F("fHistMultiplicitySPDForTrigEvt",
1146                                               "Centrality Distribution: SPD;SPD Centrality;Events",
1147                                               200, 0, 200);
1148     fListHistV0->Add(fHistMultiplicitySPDForTrigEvt);
1149   }
1150   if(! fHistMultiplicitySPD) {
1151     fHistMultiplicitySPD = new TH1F("fHistMultiplicitySPD",
1152                                     "Centrality Distribution: SPD;SPD Centrality;Events",
1153                                     200, 0, 200);
1154     fListHistV0->Add(fHistMultiplicitySPD);
1155   }
1156   if(! fHistMultiplicitySPDNoTPCOnly) {
1157     fHistMultiplicitySPDNoTPCOnly = new TH1F("fHistMultiplicitySPDNoTPCOnly",
1158                                              "Centrality Distribution: SPD;SPD Centrality;Events",
1159                                              200, 0, 200);
1160     fListHistV0->Add(fHistMultiplicitySPDNoTPCOnly);
1161   }
1162   if(! fHistMultiplicitySPDNoTPCOnlyNoPileup) {
1163     fHistMultiplicitySPDNoTPCOnlyNoPileup = new TH1F("fHistMultiplicitySPDNoTPCOnlyNoPileup",
1164                                                      "Centrality Distribution: SPD;SPD Centrality;Events",
1165                                                      200, 0, 200);
1166     fListHistV0->Add(fHistMultiplicitySPDNoTPCOnlyNoPileup);
1167   }
1168   
1169
1170   
1171
1172   //Raw Data for J/Psi paper Technique
1173         //TH2F    *f2dHistMultiplicityVsTrueBeforeTrigSel;              //! multiplicity distribution    
1174         //TH2F    *f2dHistMultiplicityVsTrueForTrigEvt;                         //! multiplicity distribution
1175         //TH2F    *f2dHistMultiplicityVsTrue;                                                   //! multiplicity distribution
1176         //TH2F    *f2dHistMultiplicityVsTrueNoTPCOnly;                          //! multiplicity distribution
1177         //TH2F    *f2dHistMultiplicityVsTrueNoTPCOnlyNoPileup;                  //! multiplicity distribution
1178
1179    if(! f2dHistMultiplicityVsTrueBeforeTrigSel) {
1180       f2dHistMultiplicityVsTrueBeforeTrigSel = new TH2F("f2dHistMultiplicityVsTrueBeforeTrigSel", 
1181          "Tracks per event", 200, 0, 200, 200, 0, 200);                 
1182       fListHistV0->Add(f2dHistMultiplicityVsTrueBeforeTrigSel);
1183    }
1184    if(! f2dHistMultiplicityVsTrueForTrigEvt) {
1185       f2dHistMultiplicityVsTrueForTrigEvt = new TH2F("f2dHistMultiplicityVsTrueForTrigEvt", 
1186          "Tracks per event", 200, 0, 200, 200, 0, 200);                 
1187       fListHistV0->Add(f2dHistMultiplicityVsTrueForTrigEvt);
1188    }
1189    if(! f2dHistMultiplicityVsTrue) {
1190       f2dHistMultiplicityVsTrue = new TH2F("f2dHistMultiplicityVsTrue", 
1191          "Tracks per event", 200, 0, 200, 200, 0, 200);                 
1192       fListHistV0->Add(f2dHistMultiplicityVsTrue);
1193    }
1194    if(! f2dHistMultiplicityVsTrueNoTPCOnly) {
1195       f2dHistMultiplicityVsTrueNoTPCOnly = new TH2F("f2dHistMultiplicityVsTrueNoTPCOnly", 
1196          "Tracks per event", 200, 0, 200, 200, 0, 200);                 
1197       fListHistV0->Add(f2dHistMultiplicityVsTrueNoTPCOnly);
1198    }
1199    if(! f2dHistMultiplicityVsTrueNoTPCOnlyNoPileup) {
1200       f2dHistMultiplicityVsTrueNoTPCOnlyNoPileup = new TH2F("f2dHistMultiplicityVsTrueNoTPCOnlyNoPileup", 
1201          "Tracks per event", 200, 0, 200, 200, 0, 200);                 
1202       fListHistV0->Add(f2dHistMultiplicityVsTrueNoTPCOnlyNoPileup);
1203    }
1204
1205
1206   //Raw Data for Vertex Z position estimator change
1207         //TH2F    *f2dHistMultiplicityVsVertexZBeforeTrigSel;           //! multiplicity distribution    
1208         //TH2F    *f2dHistMultiplicityVsVertexZForTrigEvt;                      //! multiplicity distribution
1209         //TH2F    *f2dHistMultiplicityVsVertexZ;                                                //! multiplicity distribution
1210         //TH2F    *f2dHistMultiplicityVsVertexZNoTPCOnly;                               //! multiplicity distribution
1211         //TH2F    *f2dHistMultiplicityVsVertexZNoTPCOnlyNoPileup;                       //! multiplicity distribution
1212
1213    if(! f2dHistMultiplicityVsVertexZBeforeTrigSel) {
1214       f2dHistMultiplicityVsVertexZBeforeTrigSel = new TH2F("f2dHistMultiplicityVsVertexZBeforeTrigSel", 
1215          "Tracks per event", 200, 0, 200,400, -20, 20);                 
1216       fListHistV0->Add(f2dHistMultiplicityVsVertexZBeforeTrigSel);
1217    }
1218    if(! f2dHistMultiplicityVsVertexZForTrigEvt) {
1219       f2dHistMultiplicityVsVertexZForTrigEvt = new TH2F("f2dHistMultiplicityVsVertexZForTrigEvt", 
1220          "Tracks per event", 200, 0, 200, 400, -20, 20);                
1221       fListHistV0->Add(f2dHistMultiplicityVsVertexZForTrigEvt);
1222    }
1223    if(! f2dHistMultiplicityVsVertexZ) {
1224       f2dHistMultiplicityVsVertexZ = new TH2F("f2dHistMultiplicityVsVertexZ", 
1225          "Tracks per event", 200, 0, 200, 400, -20, 20);                
1226       fListHistV0->Add(f2dHistMultiplicityVsVertexZ);
1227    }
1228    if(! f2dHistMultiplicityVsVertexZNoTPCOnly) {
1229       f2dHistMultiplicityVsVertexZNoTPCOnly = new TH2F("f2dHistMultiplicityVsVertexZNoTPCOnly", 
1230          "Tracks per event", 200, 0, 200, 400, -20, 20);                
1231       fListHistV0->Add(f2dHistMultiplicityVsVertexZNoTPCOnly);
1232    }
1233    if(! f2dHistMultiplicityVsVertexZNoTPCOnlyNoPileup) {
1234       f2dHistMultiplicityVsVertexZNoTPCOnlyNoPileup = new TH2F("f2dHistMultiplicityVsVertexZNoTPCOnlyNoPileup", 
1235          "Tracks per event", 200, 0, 200, 400, -20, 20);                
1236       fListHistV0->Add(f2dHistMultiplicityVsVertexZNoTPCOnlyNoPileup);
1237    }
1238
1239 //Generated PVz test
1240
1241 //   TH1F      *fHistGenVertexZBeforeTrigSel;     //! multiplicity distribution      
1242 //   TH1F      *fHistGenVertexZForTrigEvt;        //! multiplicity distribution
1243 //   TH1F      *fHistGenVertexZ;                  //! multiplicity distribution
1244 //   TH1F      *fHistGenVertexZNoTPCOnly;         //! multiplicity distribution
1245 //   TH1F      *fHistGenVertexZNoTPCOnlyNoPileup; //! multiplicity distribution
1246
1247    if(! fHistGenVertexZBeforeTrigSel) {
1248          fHistGenVertexZBeforeTrigSel = new TH1F("fHistGenVertexZBeforeTrigSel", 
1249             "PV z position;Nbr of Evts;z", 
1250             400, -20, 20);       
1251       fListHistV0->Add(fHistGenVertexZBeforeTrigSel);
1252    }
1253    if(! fHistGenVertexZForTrigEvt) {
1254          fHistGenVertexZForTrigEvt = new TH1F("fHistGenVertexZForTrigEvt", 
1255             "PV z position;Nbr of Evts;z", 
1256             400, -20, 20);       
1257       fListHistV0->Add(fHistGenVertexZForTrigEvt);
1258    }
1259    if(! fHistGenVertexZ) {
1260          fHistGenVertexZ = new TH1F("fHistGenVertexZ", 
1261             "PV z position;Nbr of Evts;z", 
1262             400, -20, 20);       
1263       fListHistV0->Add(fHistGenVertexZ);
1264    }
1265    if(! fHistGenVertexZNoTPCOnly) {
1266          fHistGenVertexZNoTPCOnly = new TH1F("fHistGenVertexZNoTPCOnly", 
1267             "PV z position;Nbr of Evts;z", 
1268             400, -20, 20);       
1269       fListHistV0->Add(fHistGenVertexZNoTPCOnly);
1270    }
1271    if(! fHistGenVertexZNoTPCOnlyNoPileup) {
1272          fHistGenVertexZNoTPCOnlyNoPileup = new TH1F("fHistGenVertexZNoTPCOnlyNoPileup", 
1273             "PV z position;Nbr of Evts;z", 
1274             400, -20, 20);       
1275       fListHistV0->Add(fHistGenVertexZNoTPCOnlyNoPileup);
1276    }
1277
1278
1279 //------------------------------------------------
1280 // Generated Particle Histograms
1281 //------------------------------------------------
1282
1283    Int_t lCustomNBins = 200; 
1284    Double_t lCustomPtUpperLimit = 20; 
1285    Int_t lCustomNBinsMultiplicity = 100;
1286
1287 //----------------------------------
1288 // Raw Generated (Pre-physics-selection)
1289 //----------------------------------
1290
1291 //--- 3D Histo (Pt, Y, Multiplicity), V0M Version (default) 
1292
1293    if(! f3dHistPrimRawPtVsYVsMultLambda) {
1294       f3dHistPrimRawPtVsYVsMultLambda = new TH3F( "f3dHistPrimRawPtVsYVsMultLambda", "Pt_{lambda} Vs Y_{#Lambda} Vs Multiplicity; Pt_{lambda} (GeV/c); Y_{#Lambda} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1295       fListHistV0->Add(f3dHistPrimRawPtVsYVsMultLambda);
1296    }
1297    if(! f3dHistPrimRawPtVsYVsMultAntiLambda) {
1298       f3dHistPrimRawPtVsYVsMultAntiLambda = new TH3F( "f3dHistPrimRawPtVsYVsMultAntiLambda", "Pt_{antilambda} Vs Y_{#Lambda} Vs Multiplicity; Pt_{antilambda} (GeV/c); Y_{#Lambda} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1299       fListHistV0->Add(f3dHistPrimRawPtVsYVsMultAntiLambda);
1300    }
1301    if(! f3dHistPrimRawPtVsYVsMultK0Short) {
1302       f3dHistPrimRawPtVsYVsMultK0Short = new TH3F( "f3dHistPrimRawPtVsYVsMultK0Short", "Pt_{K0S} Vs Y_{K0S} Vs Multiplicity; Pt_{K0S} (GeV/c); Y_{K0S} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1303       fListHistV0->Add(f3dHistPrimRawPtVsYVsMultK0Short);
1304    }
1305
1306    if(! f3dHistPrimRawPtVsYCMSVsMultLambda) {
1307       f3dHistPrimRawPtVsYCMSVsMultLambda = new TH3F( "f3dHistPrimRawPtVsYCMSVsMultLambda", "Pt_{lambda} Vs Y_{#Lambda} Vs Multiplicity; Pt_{lambda} (GeV/c); Y_{#Lambda} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1308       fListHistV0->Add(f3dHistPrimRawPtVsYCMSVsMultLambda);
1309    }
1310    if(! f3dHistPrimRawPtVsYCMSVsMultAntiLambda) {
1311       f3dHistPrimRawPtVsYCMSVsMultAntiLambda = new TH3F( "f3dHistPrimRawPtVsYCMSVsMultAntiLambda", "Pt_{antilambda} Vs Y_{#Lambda} Vs Multiplicity; Pt_{antilambda} (GeV/c); Y_{#Lambda} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1312       fListHistV0->Add(f3dHistPrimRawPtVsYCMSVsMultAntiLambda);
1313    }
1314    if(! f3dHistPrimRawPtVsYCMSVsMultK0Short) {
1315       f3dHistPrimRawPtVsYCMSVsMultK0Short = new TH3F( "f3dHistPrimRawPtVsYCMSVsMultK0Short", "Pt_{K0S} Vs Y_{K0S} Vs Multiplicity; Pt_{K0S} (GeV/c); Y_{K0S} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1316       fListHistV0->Add(f3dHistPrimRawPtVsYCMSVsMultK0Short);
1317    }
1318   
1319 //--- 3D Histo (Pt, Y, Multiplicity), V0A Version
1320   
1321   if(! f3dHistPrimRawPtVsYVsMultV0ALambda) {
1322     f3dHistPrimRawPtVsYVsMultV0ALambda = new TH3F( "f3dHistPrimRawPtVsYVsMultV0ALambda", "Pt_{lambda} Vs Y_{#Lambda} Vs Multiplicity; Pt_{lambda} (GeV/c); Y_{#Lambda} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1323     if( fkIsNuclear ) fListHistV0->Add(f3dHistPrimRawPtVsYVsMultV0ALambda);
1324   }
1325   if(! f3dHistPrimRawPtVsYVsMultV0AAntiLambda) {
1326     f3dHistPrimRawPtVsYVsMultV0AAntiLambda = new TH3F( "f3dHistPrimRawPtVsYVsMultV0AAntiLambda", "Pt_{antilambda} Vs Y_{#Lambda} Vs Multiplicity; Pt_{antilambda} (GeV/c); Y_{#Lambda} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1327     if( fkIsNuclear ) fListHistV0->Add(f3dHistPrimRawPtVsYVsMultV0AAntiLambda);
1328   }
1329   if(! f3dHistPrimRawPtVsYVsMultV0AK0Short) {
1330     f3dHistPrimRawPtVsYVsMultV0AK0Short = new TH3F( "f3dHistPrimRawPtVsYVsMultV0AK0Short", "Pt_{K0S} Vs Y_{K0S} Vs Multiplicity; Pt_{K0S} (GeV/c); Y_{K0S} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1331     if( fkIsNuclear ) fListHistV0->Add(f3dHistPrimRawPtVsYVsMultV0AK0Short);
1332   }
1333   
1334   if(! f3dHistPrimRawPtVsYCMSVsMultV0ALambda) {
1335     f3dHistPrimRawPtVsYCMSVsMultV0ALambda = new TH3F( "f3dHistPrimRawPtVsYCMSVsMultV0ALambda", "Pt_{lambda} Vs Y_{#Lambda} Vs Multiplicity; Pt_{lambda} (GeV/c); Y_{#Lambda} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1336     if( fkIsNuclear ) fListHistV0->Add(f3dHistPrimRawPtVsYCMSVsMultV0ALambda);
1337   }
1338   if(! f3dHistPrimRawPtVsYCMSVsMultV0AAntiLambda) {
1339     f3dHistPrimRawPtVsYCMSVsMultV0AAntiLambda = new TH3F( "f3dHistPrimRawPtVsYCMSVsMultV0AAntiLambda", "Pt_{antilambda} Vs Y_{#Lambda} Vs Multiplicity; Pt_{antilambda} (GeV/c); Y_{#Lambda} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1340     if( fkIsNuclear ) fListHistV0->Add(f3dHistPrimRawPtVsYCMSVsMultV0AAntiLambda);
1341   }
1342   if(! f3dHistPrimRawPtVsYCMSVsMultV0AK0Short) {
1343     f3dHistPrimRawPtVsYCMSVsMultV0AK0Short = new TH3F( "f3dHistPrimRawPtVsYCMSVsMultV0AK0Short", "Pt_{K0S} Vs Y_{K0S} Vs Multiplicity; Pt_{K0S} (GeV/c); Y_{K0S} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1344     if( fkIsNuclear ) fListHistV0->Add(f3dHistPrimRawPtVsYCMSVsMultV0AK0Short);
1345   }
1346   
1347   //--- 3D Histo (Pt, Y, Multiplicity), ZNA Version
1348   
1349   if(! f3dHistPrimRawPtVsYVsMultZNALambda) {
1350     f3dHistPrimRawPtVsYVsMultZNALambda = new TH3F( "f3dHistPrimRawPtVsYVsMultZNALambda", "Pt_{lambda} Vs Y_{#Lambda} Vs Multiplicity; Pt_{lambda} (GeV/c); Y_{#Lambda} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1351     if( fkIsNuclear ) fListHistV0->Add(f3dHistPrimRawPtVsYVsMultZNALambda);
1352   }
1353   if(! f3dHistPrimRawPtVsYVsMultZNAAntiLambda) {
1354     f3dHistPrimRawPtVsYVsMultZNAAntiLambda = new TH3F( "f3dHistPrimRawPtVsYVsMultZNAAntiLambda", "Pt_{antilambda} Vs Y_{#Lambda} Vs Multiplicity; Pt_{antilambda} (GeV/c); Y_{#Lambda} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1355     if( fkIsNuclear ) fListHistV0->Add(f3dHistPrimRawPtVsYVsMultZNAAntiLambda);
1356   }
1357   if(! f3dHistPrimRawPtVsYVsMultZNAK0Short) {
1358     f3dHistPrimRawPtVsYVsMultZNAK0Short = new TH3F( "f3dHistPrimRawPtVsYVsMultZNAK0Short", "Pt_{K0S} Vs Y_{K0S} Vs Multiplicity; Pt_{K0S} (GeV/c); Y_{K0S} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1359     if( fkIsNuclear ) fListHistV0->Add(f3dHistPrimRawPtVsYVsMultZNAK0Short);
1360   }
1361   
1362   if(! f3dHistPrimRawPtVsYCMSVsMultZNALambda) {
1363     f3dHistPrimRawPtVsYCMSVsMultZNALambda = new TH3F( "f3dHistPrimRawPtVsYCMSVsMultZNALambda", "Pt_{lambda} Vs Y_{#Lambda} Vs Multiplicity; Pt_{lambda} (GeV/c); Y_{#Lambda} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1364     if( fkIsNuclear ) fListHistV0->Add(f3dHistPrimRawPtVsYCMSVsMultZNALambda);
1365   }
1366   if(! f3dHistPrimRawPtVsYCMSVsMultZNAAntiLambda) {
1367     f3dHistPrimRawPtVsYCMSVsMultZNAAntiLambda = new TH3F( "f3dHistPrimRawPtVsYCMSVsMultZNAAntiLambda", "Pt_{antilambda} Vs Y_{#Lambda} Vs Multiplicity; Pt_{antilambda} (GeV/c); Y_{#Lambda} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1368     if( fkIsNuclear ) fListHistV0->Add(f3dHistPrimRawPtVsYCMSVsMultZNAAntiLambda);
1369   }
1370   if(! f3dHistPrimRawPtVsYCMSVsMultZNAK0Short) {
1371     f3dHistPrimRawPtVsYCMSVsMultZNAK0Short = new TH3F( "f3dHistPrimRawPtVsYCMSVsMultZNAK0Short", "Pt_{K0S} Vs Y_{K0S} Vs Multiplicity; Pt_{K0S} (GeV/c); Y_{K0S} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1372     if( fkIsNuclear ) fListHistV0->Add(f3dHistPrimRawPtVsYCMSVsMultZNAK0Short);
1373   }
1374   
1375   //--- 3D Histo (Pt, Y, Multiplicity), TRK Version
1376   
1377   if(! f3dHistPrimRawPtVsYVsMultTRKLambda) {
1378     f3dHistPrimRawPtVsYVsMultTRKLambda = new TH3F( "f3dHistPrimRawPtVsYVsMultTRKLambda", "Pt_{lambda} Vs Y_{#Lambda} Vs Multiplicity; Pt_{lambda} (GeV/c); Y_{#Lambda} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1379     if( fkIsNuclear ) fListHistV0->Add(f3dHistPrimRawPtVsYVsMultTRKLambda);
1380   }
1381   if(! f3dHistPrimRawPtVsYVsMultTRKAntiLambda) {
1382     f3dHistPrimRawPtVsYVsMultTRKAntiLambda = new TH3F( "f3dHistPrimRawPtVsYVsMultTRKAntiLambda", "Pt_{antilambda} Vs Y_{#Lambda} Vs Multiplicity; Pt_{antilambda} (GeV/c); Y_{#Lambda} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1383     if( fkIsNuclear ) fListHistV0->Add(f3dHistPrimRawPtVsYVsMultTRKAntiLambda);
1384   }
1385   if(! f3dHistPrimRawPtVsYVsMultTRKK0Short) {
1386     f3dHistPrimRawPtVsYVsMultTRKK0Short = new TH3F( "f3dHistPrimRawPtVsYVsMultTRKK0Short", "Pt_{K0S} Vs Y_{K0S} Vs Multiplicity; Pt_{K0S} (GeV/c); Y_{K0S} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1387     if( fkIsNuclear ) fListHistV0->Add(f3dHistPrimRawPtVsYVsMultTRKK0Short);
1388   }
1389   
1390   if(! f3dHistPrimRawPtVsYCMSVsMultTRKLambda) {
1391     f3dHistPrimRawPtVsYCMSVsMultTRKLambda = new TH3F( "f3dHistPrimRawPtVsYCMSVsMultTRKLambda", "Pt_{lambda} Vs Y_{#Lambda} Vs Multiplicity; Pt_{lambda} (GeV/c); Y_{#Lambda} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1392     if( fkIsNuclear ) fListHistV0->Add(f3dHistPrimRawPtVsYCMSVsMultTRKLambda);
1393   }
1394   if(! f3dHistPrimRawPtVsYCMSVsMultTRKAntiLambda) {
1395     f3dHistPrimRawPtVsYCMSVsMultTRKAntiLambda = new TH3F( "f3dHistPrimRawPtVsYCMSVsMultTRKAntiLambda", "Pt_{antilambda} Vs Y_{#Lambda} Vs Multiplicity; Pt_{antilambda} (GeV/c); Y_{#Lambda} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1396     if( fkIsNuclear ) fListHistV0->Add(f3dHistPrimRawPtVsYCMSVsMultTRKAntiLambda);
1397   }
1398   if(! f3dHistPrimRawPtVsYCMSVsMultTRKK0Short) {
1399     f3dHistPrimRawPtVsYCMSVsMultTRKK0Short = new TH3F( "f3dHistPrimRawPtVsYCMSVsMultTRKK0Short", "Pt_{K0S} Vs Y_{K0S} Vs Multiplicity; Pt_{K0S} (GeV/c); Y_{K0S} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1400     if( fkIsNuclear ) fListHistV0->Add(f3dHistPrimRawPtVsYCMSVsMultTRKK0Short);
1401   }
1402   
1403   //--- 3D Histo (Pt, Y, Multiplicity), SPD Version
1404   
1405   if(! f3dHistPrimRawPtVsYVsMultSPDLambda) {
1406     f3dHistPrimRawPtVsYVsMultSPDLambda = new TH3F( "f3dHistPrimRawPtVsYVsMultSPDLambda", "Pt_{lambda} Vs Y_{#Lambda} Vs Multiplicity; Pt_{lambda} (GeV/c); Y_{#Lambda} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1407     if( fkIsNuclear ) fListHistV0->Add(f3dHistPrimRawPtVsYVsMultSPDLambda);
1408   }
1409   if(! f3dHistPrimRawPtVsYVsMultSPDAntiLambda) {
1410     f3dHistPrimRawPtVsYVsMultSPDAntiLambda = new TH3F( "f3dHistPrimRawPtVsYVsMultSPDAntiLambda", "Pt_{antilambda} Vs Y_{#Lambda} Vs Multiplicity; Pt_{antilambda} (GeV/c); Y_{#Lambda} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1411     if( fkIsNuclear ) fListHistV0->Add(f3dHistPrimRawPtVsYVsMultSPDAntiLambda);
1412   }
1413   if(! f3dHistPrimRawPtVsYVsMultSPDK0Short) {
1414     f3dHistPrimRawPtVsYVsMultSPDK0Short = new TH3F( "f3dHistPrimRawPtVsYVsMultSPDK0Short", "Pt_{K0S} Vs Y_{K0S} Vs Multiplicity; Pt_{K0S} (GeV/c); Y_{K0S} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1415     if( fkIsNuclear ) fListHistV0->Add(f3dHistPrimRawPtVsYVsMultSPDK0Short);
1416   }
1417   
1418   if(! f3dHistPrimRawPtVsYCMSVsMultSPDLambda) {
1419     f3dHistPrimRawPtVsYCMSVsMultSPDLambda = new TH3F( "f3dHistPrimRawPtVsYCMSVsMultSPDLambda", "Pt_{lambda} Vs Y_{#Lambda} Vs Multiplicity; Pt_{lambda} (GeV/c); Y_{#Lambda} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1420     if( fkIsNuclear ) fListHistV0->Add(f3dHistPrimRawPtVsYCMSVsMultSPDLambda);
1421   }
1422   if(! f3dHistPrimRawPtVsYCMSVsMultSPDAntiLambda) {
1423     f3dHistPrimRawPtVsYCMSVsMultSPDAntiLambda = new TH3F( "f3dHistPrimRawPtVsYCMSVsMultSPDAntiLambda", "Pt_{antilambda} Vs Y_{#Lambda} Vs Multiplicity; Pt_{antilambda} (GeV/c); Y_{#Lambda} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1424     if( fkIsNuclear ) fListHistV0->Add(f3dHistPrimRawPtVsYCMSVsMultSPDAntiLambda);
1425   }
1426   if(! f3dHistPrimRawPtVsYCMSVsMultSPDK0Short) {
1427     f3dHistPrimRawPtVsYCMSVsMultSPDK0Short = new TH3F( "f3dHistPrimRawPtVsYCMSVsMultSPDK0Short", "Pt_{K0S} Vs Y_{K0S} Vs Multiplicity; Pt_{K0S} (GeV/c); Y_{K0S} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1428     if( fkIsNuclear ) fListHistV0->Add(f3dHistPrimRawPtVsYCMSVsMultSPDK0Short);
1429   }
1430   
1431   
1432
1433 //---> Non-injected particles
1434
1435    if(! f3dHistPrimRawPtVsYVsMultNonInjLambda) {
1436       f3dHistPrimRawPtVsYVsMultNonInjLambda = new TH3F( "f3dHistPrimRawPtVsYVsMultNonInjLambda", "Pt_{lambda} Vs Y_{#Lambda} Vs Multiplicity; Pt_{lambda} (GeV/c); Y_{#Lambda} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1437       fListHistV0->Add(f3dHistPrimRawPtVsYVsMultNonInjLambda);
1438    }
1439    if(! f3dHistPrimRawPtVsYVsMultNonInjAntiLambda) {
1440       f3dHistPrimRawPtVsYVsMultNonInjAntiLambda = new TH3F( "f3dHistPrimRawPtVsYVsMultNonInjAntiLambda", "Pt_{antilambda} Vs Y_{#Lambda} Vs Multiplicity; Pt_{antilambda} (GeV/c); Y_{#Lambda} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1441       fListHistV0->Add(f3dHistPrimRawPtVsYVsMultNonInjAntiLambda);
1442    }
1443    if(! f3dHistPrimRawPtVsYVsMultNonInjK0Short) {
1444       f3dHistPrimRawPtVsYVsMultNonInjK0Short = new TH3F( "f3dHistPrimRawPtVsYVsMultNonInjK0Short", "Pt_{K0S} Vs Y_{K0S} Vs Multiplicity; Pt_{K0S} (GeV/c); Y_{K0S} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1445       fListHistV0->Add(f3dHistPrimRawPtVsYVsMultNonInjK0Short);
1446    }
1447
1448 //--- 3D Histo (Pt, Y, MultiplicityMC)  
1449
1450    if(! f3dHistPrimRawPtVsYVsMultMCLambda) {
1451       f3dHistPrimRawPtVsYVsMultMCLambda = new TH3F( "f3dHistPrimRawPtVsYVsMultMCLambda", "Pt_{lambda} Vs Y_{#Lambda} Vs Multiplicity; Pt_{lambda} (GeV/c); Y_{#Lambda} ; MultMC", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1452       fListHistV0->Add(f3dHistPrimRawPtVsYVsMultMCLambda);
1453    }
1454    if(! f3dHistPrimRawPtVsYVsMultMCAntiLambda) {
1455       f3dHistPrimRawPtVsYVsMultMCAntiLambda = new TH3F( "f3dHistPrimRawPtVsYVsMultMCAntiLambda", "Pt_{antilambda} Vs Y_{#Lambda} Vs Multiplicity; Pt_{antilambda} (GeV/c); Y_{#Lambda} ; MultMC", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1456       fListHistV0->Add(f3dHistPrimRawPtVsYVsMultMCAntiLambda);
1457    }
1458    if(! f3dHistPrimRawPtVsYVsMultMCK0Short) {
1459       f3dHistPrimRawPtVsYVsMultMCK0Short = new TH3F( "f3dHistPrimRawPtVsYVsMultMCK0Short", "Pt_{K0S} Vs Y_{K0S} Vs Multiplicity; Pt_{K0S} (GeV/c); Y_{K0S} ; MultMC", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1460       fListHistV0->Add(f3dHistPrimRawPtVsYVsMultMCK0Short);
1461    }
1462
1463 //--- 3D Histo (Pt, Y, VertexZ)  
1464
1465    if(! f3dHistPrimRawPtVsYVsVertexZLambda) {
1466       f3dHistPrimRawPtVsYVsVertexZLambda = new TH3F( "f3dHistPrimRawPtVsYVsVertexZLambda", "Pt_{lambda} Vs Y_{#Lambda} Vs VertexZiplicity; Pt_{lambda} (GeV/c); Y_{#Lambda} ; VertexZ", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,40,-10,10);
1467       fListHistV0->Add(f3dHistPrimRawPtVsYVsVertexZLambda);
1468    }
1469    if(! f3dHistPrimRawPtVsYVsVertexZAntiLambda) {
1470       f3dHistPrimRawPtVsYVsVertexZAntiLambda = new TH3F( "f3dHistPrimRawPtVsYVsVertexZAntiLambda", "Pt_{antilambda} Vs Y_{#Lambda} Vs VertexZiplicity; Pt_{antilambda} (GeV/c); Y_{#Lambda} ; VertexZ", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,40,-10,10);
1471       fListHistV0->Add(f3dHistPrimRawPtVsYVsVertexZAntiLambda);
1472    }
1473    if(! f3dHistPrimRawPtVsYVsVertexZK0Short) {
1474       f3dHistPrimRawPtVsYVsVertexZK0Short = new TH3F( "f3dHistPrimRawPtVsYVsVertexZK0Short", "Pt_{K0S} Vs Y_{K0S} Vs VertexZiplicity; Pt_{K0S} (GeV/c); Y_{K0S} ; VertexZ", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,40,-10,10);
1475       fListHistV0->Add(f3dHistPrimRawPtVsYVsVertexZK0Short);
1476    }
1477
1478 //--- 3D Histo (Pt, Y, Multiplicity), close to PV criterion
1479
1480    if(! f3dHistPrimCloseToPVPtVsYVsMultLambda) {
1481       f3dHistPrimCloseToPVPtVsYVsMultLambda = new TH3F( "f3dHistPrimCloseToPVPtVsYVsMultLambda", "Pt_{lambda} Vs Y_{#Lambda} Vs Multiplicity; Pt_{lambda} (GeV/c); Y_{#Lambda} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1482       fListHistV0->Add(f3dHistPrimCloseToPVPtVsYVsMultLambda);
1483    }
1484    if(! f3dHistPrimCloseToPVPtVsYVsMultAntiLambda) {
1485       f3dHistPrimCloseToPVPtVsYVsMultAntiLambda = new TH3F( "f3dHistPrimCloseToPVPtVsYVsMultAntiLambda", "Pt_{antilambda} Vs Y_{#Lambda} Vs Multiplicity; Pt_{antilambda} (GeV/c); Y_{#Lambda} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1486       fListHistV0->Add(f3dHistPrimCloseToPVPtVsYVsMultAntiLambda);
1487    }
1488    if(! f3dHistPrimCloseToPVPtVsYVsMultK0Short) {
1489       f3dHistPrimCloseToPVPtVsYVsMultK0Short = new TH3F( "f3dHistPrimCloseToPVPtVsYVsMultK0Short", "Pt_{K0S} Vs Y_{K0S} Vs Multiplicity; Pt_{K0S} (GeV/c); Y_{K0S} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1490       fListHistV0->Add(f3dHistPrimCloseToPVPtVsYVsMultK0Short);
1491    }
1492
1493
1494 //--- 3D Histo (Pt, Y, Proper Decay Length)
1495
1496    if(! f3dHistPrimRawPtVsYVsDecayLengthLambda) {
1497       f3dHistPrimRawPtVsYVsDecayLengthLambda = new TH3F( "f3dHistPrimRawPtVsYVsDecayLengthLambda", "Pt_{lambda} Vs Y_{#Lambda} Vs DecayLength; Pt_{lambda} (GeV/c); Y_{#Lambda} ; DecayLength", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,200,0,50);
1498       fListHistV0->Add(f3dHistPrimRawPtVsYVsDecayLengthLambda);
1499    }
1500    if(! f3dHistPrimRawPtVsYVsDecayLengthAntiLambda) {
1501       f3dHistPrimRawPtVsYVsDecayLengthAntiLambda = new TH3F( "f3dHistPrimRawPtVsYVsDecayLengthAntiLambda", "Pt_{antilambda} Vs Y_{#Lambda} Vs DecayLength; Pt_{antilambda} (GeV/c); Y_{#Lambda} ; DecayLength", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,200,0,50);
1502       fListHistV0->Add(f3dHistPrimRawPtVsYVsDecayLengthAntiLambda);
1503    }
1504    if(! f3dHistPrimRawPtVsYVsDecayLengthK0Short) {
1505       f3dHistPrimRawPtVsYVsDecayLengthK0Short = new TH3F( "f3dHistPrimRawPtVsYVsDecayLengthK0Short", "Pt_{K0S} Vs Y_{K0S} Vs DecayLength; Pt_{K0S} (GeV/c); Y_{K0S} ; DecayLength", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,200,0,50);
1506       fListHistV0->Add(f3dHistPrimRawPtVsYVsDecayLengthK0Short);
1507    }
1508
1509 //--------------------------------------------------------------------------------------
1510 // V0M for Cascades
1511 //--------------------------------------------------------------------------------------
1512 //--- 3D Histo (Pt, Y, Multiplicity) for generated XiMinus/Plus, all generated
1513
1514    if(! f3dHistGenPtVsYVsMultXiMinus) {
1515       f3dHistGenPtVsYVsMultXiMinus = new TH3F( "f3dHistGenPtVsYVsMultXiMinus", "Pt_{#Xi} Vs Y_{#Xi} Vs Multiplicity; Pt_{cascade} (GeV/c); Y_{#Xi} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1516       fListHistV0->Add(f3dHistGenPtVsYVsMultXiMinus);
1517    }
1518    if(! f3dHistGenPtVsYVsMultXiPlus) {
1519       f3dHistGenPtVsYVsMultXiPlus = new TH3F( "f3dHistGenPtVsYVsMultXiPlus", "Pt_{#Xi} Vs Y_{#Xi} Vs Multiplicity; Pt_{cascade} (GeV/c); Y_{#Xi} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1520       fListHistV0->Add(f3dHistGenPtVsYVsMultXiPlus);
1521    }
1522 //CASCADEs, Y CMS
1523    if(! f3dHistGenPtVsYCMSVsMultXiMinus) {
1524       f3dHistGenPtVsYCMSVsMultXiMinus = new TH3F( "f3dHistGenPtVsYCMSVsMultXiMinus", "Pt_{#Xi} Vs Y_{#Xi} Vs Multiplicity; Pt_{cascade} (GeV/c); Y_{#Xi} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1525       fListHistV0->Add(f3dHistGenPtVsYCMSVsMultXiMinus);
1526    }
1527    if(! f3dHistGenPtVsYCMSVsMultXiPlus) {
1528       f3dHistGenPtVsYCMSVsMultXiPlus = new TH3F( "f3dHistGenPtVsYCMSVsMultXiPlus", "Pt_{#Xi} Vs Y_{#Xi} Vs Multiplicity; Pt_{cascade} (GeV/c); Y_{#Xi} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1529       fListHistV0->Add(f3dHistGenPtVsYCMSVsMultXiPlus);
1530    }
1531
1532 //--------------------------------------------------------------------------------------
1533 //--- 3D Histo (Pt, Y, Multiplicity) for generated XiMinus/Plus, at selected analysis evts
1534
1535    if(! f3dHistGenSelectedPtVsYVsMultXiMinus) {
1536       f3dHistGenSelectedPtVsYVsMultXiMinus = new TH3F( "f3dHistGenSelectedPtVsYVsMultXiMinus", "Pt_{#Xi} Vs Y_{#Xi} Vs Multiplicity; Pt_{cascade} (GeV/c); Y_{#Xi} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1537       fListHistV0->Add(f3dHistGenSelectedPtVsYVsMultXiMinus);
1538    }
1539    if(! f3dHistGenSelectedPtVsYVsMultXiPlus) {
1540       f3dHistGenSelectedPtVsYVsMultXiPlus = new TH3F( "f3dHistGenSelectedPtVsYVsMultXiPlus", "Pt_{#Xi} Vs Y_{#Xi} Vs Multiplicity; Pt_{cascade} (GeV/c); Y_{#Xi} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1541       fListHistV0->Add(f3dHistGenSelectedPtVsYVsMultXiPlus);
1542    }
1543
1544 //CASCADES, analysis level, y CMS
1545 //--------------------------------------------------------------------------------------
1546 //--- 3D Histo (Pt, Y, Multiplicity) for generated XiMinus/Plus, at selected analysis evts
1547
1548    if(! f3dHistGenSelectedPtVsYCMSVsMultXiMinus) {
1549       f3dHistGenSelectedPtVsYCMSVsMultXiMinus = new TH3F( "f3dHistGenSelectedPtVsYCMSVsMultXiMinus", "Pt_{#Xi} Vs Y_{#Xi} Vs Multiplicity; Pt_{cascade} (GeV/c); Y_{#Xi} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1550       fListHistV0->Add(f3dHistGenSelectedPtVsYCMSVsMultXiMinus);
1551    }
1552    if(! f3dHistGenSelectedPtVsYCMSVsMultXiPlus) {
1553       f3dHistGenSelectedPtVsYCMSVsMultXiPlus = new TH3F( "f3dHistGenSelectedPtVsYCMSVsMultXiPlus", "Pt_{#Xi} Vs Y_{#Xi} Vs Multiplicity; Pt_{cascade} (GeV/c); Y_{#Xi} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1554       fListHistV0->Add(f3dHistGenSelectedPtVsYCMSVsMultXiPlus);
1555    }
1556   
1557   //--------------------------------------------------------------------------------------
1558   // V0A for Cascades
1559   //--------------------------------------------------------------------------------------
1560   //--- 3D Histo (Pt, Y, Multiplicity) for generated XiMinus/Plus, all generated
1561   
1562   if(! f3dHistGenPtVsYVsMultV0AXiMinus) {
1563     f3dHistGenPtVsYVsMultV0AXiMinus = new TH3F( "f3dHistGenPtVsYVsMultV0AXiMinus", "Pt_{#Xi} Vs Y_{#Xi} Vs Multiplicity; Pt_{cascade} (GeV/c); Y_{#Xi} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1564     if( fkIsNuclear ) fListHistV0->Add(f3dHistGenPtVsYVsMultV0AXiMinus);
1565   }
1566   if(! f3dHistGenPtVsYVsMultV0AXiPlus) {
1567     f3dHistGenPtVsYVsMultV0AXiPlus = new TH3F( "f3dHistGenPtVsYVsMultV0AXiPlus", "Pt_{#Xi} Vs Y_{#Xi} Vs Multiplicity; Pt_{cascade} (GeV/c); Y_{#Xi} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1568     if( fkIsNuclear ) fListHistV0->Add(f3dHistGenPtVsYVsMultV0AXiPlus);
1569   }
1570   //CASCADEs, Y CMS
1571   if(! f3dHistGenPtVsYCMSVsMultV0AXiMinus) {
1572     f3dHistGenPtVsYCMSVsMultV0AXiMinus = new TH3F( "f3dHistGenPtVsYCMSVsMultV0AXiMinus", "Pt_{#Xi} Vs Y_{#Xi} Vs Multiplicity; Pt_{cascade} (GeV/c); Y_{#Xi} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1573     if( fkIsNuclear ) fListHistV0->Add(f3dHistGenPtVsYCMSVsMultV0AXiMinus);
1574   }
1575   if(! f3dHistGenPtVsYCMSVsMultV0AXiPlus) {
1576     f3dHistGenPtVsYCMSVsMultV0AXiPlus = new TH3F( "f3dHistGenPtVsYCMSVsMultV0AXiPlus", "Pt_{#Xi} Vs Y_{#Xi} Vs Multiplicity; Pt_{cascade} (GeV/c); Y_{#Xi} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1577     if( fkIsNuclear ) fListHistV0->Add(f3dHistGenPtVsYCMSVsMultV0AXiPlus);
1578   }
1579   
1580   //--------------------------------------------------------------------------------------
1581   //--- 3D Histo (Pt, Y, Multiplicity) for generated XiMinus/Plus, at selected analysis evts
1582   
1583   if(! f3dHistGenSelectedPtVsYVsMultV0AXiMinus) {
1584     f3dHistGenSelectedPtVsYVsMultV0AXiMinus = new TH3F( "f3dHistGenSelectedPtVsYVsMultV0AXiMinus", "Pt_{#Xi} Vs Y_{#Xi} Vs Multiplicity; Pt_{cascade} (GeV/c); Y_{#Xi} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1585     if( fkIsNuclear ) fListHistV0->Add(f3dHistGenSelectedPtVsYVsMultV0AXiMinus);
1586   }
1587   if(! f3dHistGenSelectedPtVsYVsMultV0AXiPlus) {
1588     f3dHistGenSelectedPtVsYVsMultV0AXiPlus = new TH3F( "f3dHistGenSelectedPtVsYVsMultV0AXiPlus", "Pt_{#Xi} Vs Y_{#Xi} Vs Multiplicity; Pt_{cascade} (GeV/c); Y_{#Xi} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1589     if( fkIsNuclear ) fListHistV0->Add(f3dHistGenSelectedPtVsYVsMultV0AXiPlus);
1590   }
1591   
1592   //CASCADES, analysis level, y CMS
1593   //--------------------------------------------------------------------------------------
1594   //--- 3D Histo (Pt, Y, Multiplicity) for generated XiMinus/Plus, at selected analysis evts
1595   
1596   if(! f3dHistGenSelectedPtVsYCMSVsMultV0AXiMinus) {
1597     f3dHistGenSelectedPtVsYCMSVsMultV0AXiMinus = new TH3F( "f3dHistGenSelectedPtVsYCMSVsMultV0AXiMinus", "Pt_{#Xi} Vs Y_{#Xi} Vs Multiplicity; Pt_{cascade} (GeV/c); Y_{#Xi} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1598     if( fkIsNuclear ) fListHistV0->Add(f3dHistGenSelectedPtVsYCMSVsMultV0AXiMinus);
1599   }
1600   if(! f3dHistGenSelectedPtVsYCMSVsMultV0AXiPlus) {
1601     f3dHistGenSelectedPtVsYCMSVsMultV0AXiPlus = new TH3F( "f3dHistGenSelectedPtVsYCMSVsMultV0AXiPlus", "Pt_{#Xi} Vs Y_{#Xi} Vs Multiplicity; Pt_{cascade} (GeV/c); Y_{#Xi} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1602     if( fkIsNuclear ) fListHistV0->Add(f3dHistGenSelectedPtVsYCMSVsMultV0AXiPlus);
1603   }
1604   
1605   //--------------------------------------------------------------------------------------
1606   // ZNA for Cascades
1607   //--------------------------------------------------------------------------------------
1608   //--- 3D Histo (Pt, Y, Multiplicity) for generated XiMinus/Plus, all generated
1609   
1610   if(! f3dHistGenPtVsYVsMultZNAXiMinus) {
1611     f3dHistGenPtVsYVsMultZNAXiMinus = new TH3F( "f3dHistGenPtVsYVsMultZNAXiMinus", "Pt_{#Xi} Vs Y_{#Xi} Vs Multiplicity; Pt_{cascade} (GeV/c); Y_{#Xi} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1612     if( fkIsNuclear ) fListHistV0->Add(f3dHistGenPtVsYVsMultZNAXiMinus);
1613   }
1614   if(! f3dHistGenPtVsYVsMultZNAXiPlus) {
1615     f3dHistGenPtVsYVsMultZNAXiPlus = new TH3F( "f3dHistGenPtVsYVsMultZNAXiPlus", "Pt_{#Xi} Vs Y_{#Xi} Vs Multiplicity; Pt_{cascade} (GeV/c); Y_{#Xi} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1616     if( fkIsNuclear ) fListHistV0->Add(f3dHistGenPtVsYVsMultZNAXiPlus);
1617   }
1618   //CASCADEs, Y CMS
1619   if(! f3dHistGenPtVsYCMSVsMultZNAXiMinus) {
1620     f3dHistGenPtVsYCMSVsMultZNAXiMinus = new TH3F( "f3dHistGenPtVsYCMSVsMultZNAXiMinus", "Pt_{#Xi} Vs Y_{#Xi} Vs Multiplicity; Pt_{cascade} (GeV/c); Y_{#Xi} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1621     if( fkIsNuclear ) fListHistV0->Add(f3dHistGenPtVsYCMSVsMultZNAXiMinus);
1622   }
1623   if(! f3dHistGenPtVsYCMSVsMultZNAXiPlus) {
1624     f3dHistGenPtVsYCMSVsMultZNAXiPlus = new TH3F( "f3dHistGenPtVsYCMSVsMultZNAXiPlus", "Pt_{#Xi} Vs Y_{#Xi} Vs Multiplicity; Pt_{cascade} (GeV/c); Y_{#Xi} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1625     if( fkIsNuclear ) fListHistV0->Add(f3dHistGenPtVsYCMSVsMultZNAXiPlus);
1626   }
1627   
1628   //--------------------------------------------------------------------------------------
1629   //--- 3D Histo (Pt, Y, Multiplicity) for generated XiMinus/Plus, at selected analysis evts
1630   
1631   if(! f3dHistGenSelectedPtVsYVsMultZNAXiMinus) {
1632     f3dHistGenSelectedPtVsYVsMultZNAXiMinus = new TH3F( "f3dHistGenSelectedPtVsYVsMultZNAXiMinus", "Pt_{#Xi} Vs Y_{#Xi} Vs Multiplicity; Pt_{cascade} (GeV/c); Y_{#Xi} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1633     if( fkIsNuclear ) fListHistV0->Add(f3dHistGenSelectedPtVsYVsMultZNAXiMinus);
1634   }
1635   if(! f3dHistGenSelectedPtVsYVsMultZNAXiPlus) {
1636     f3dHistGenSelectedPtVsYVsMultZNAXiPlus = new TH3F( "f3dHistGenSelectedPtVsYVsMultZNAXiPlus", "Pt_{#Xi} Vs Y_{#Xi} Vs Multiplicity; Pt_{cascade} (GeV/c); Y_{#Xi} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1637     if( fkIsNuclear ) fListHistV0->Add(f3dHistGenSelectedPtVsYVsMultZNAXiPlus);
1638   }
1639   
1640   //CASCADES, analysis level, y CMS
1641   //--------------------------------------------------------------------------------------
1642   //--- 3D Histo (Pt, Y, Multiplicity) for generated XiMinus/Plus, at selected analysis evts
1643   
1644   if(! f3dHistGenSelectedPtVsYCMSVsMultZNAXiMinus) {
1645     f3dHistGenSelectedPtVsYCMSVsMultZNAXiMinus = new TH3F( "f3dHistGenSelectedPtVsYCMSVsMultZNAXiMinus", "Pt_{#Xi} Vs Y_{#Xi} Vs Multiplicity; Pt_{cascade} (GeV/c); Y_{#Xi} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1646     if( fkIsNuclear ) fListHistV0->Add(f3dHistGenSelectedPtVsYCMSVsMultZNAXiMinus);
1647   }
1648   if(! f3dHistGenSelectedPtVsYCMSVsMultZNAXiPlus) {
1649     f3dHistGenSelectedPtVsYCMSVsMultZNAXiPlus = new TH3F( "f3dHistGenSelectedPtVsYCMSVsMultZNAXiPlus", "Pt_{#Xi} Vs Y_{#Xi} Vs Multiplicity; Pt_{cascade} (GeV/c); Y_{#Xi} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1650     if( fkIsNuclear ) fListHistV0->Add(f3dHistGenSelectedPtVsYCMSVsMultZNAXiPlus);
1651   }
1652   
1653   //--------------------------------------------------------------------------------------
1654   // TRK for Cascades
1655   //--------------------------------------------------------------------------------------
1656   //--- 3D Histo (Pt, Y, Multiplicity) for generated XiMinus/Plus, all generated
1657   
1658   if(! f3dHistGenPtVsYVsMultTRKXiMinus) {
1659     f3dHistGenPtVsYVsMultTRKXiMinus = new TH3F( "f3dHistGenPtVsYVsMultTRKXiMinus", "Pt_{#Xi} Vs Y_{#Xi} Vs Multiplicity; Pt_{cascade} (GeV/c); Y_{#Xi} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1660     if( fkIsNuclear ) fListHistV0->Add(f3dHistGenPtVsYVsMultTRKXiMinus);
1661   }
1662   if(! f3dHistGenPtVsYVsMultTRKXiPlus) {
1663     f3dHistGenPtVsYVsMultTRKXiPlus = new TH3F( "f3dHistGenPtVsYVsMultTRKXiPlus", "Pt_{#Xi} Vs Y_{#Xi} Vs Multiplicity; Pt_{cascade} (GeV/c); Y_{#Xi} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1664     if( fkIsNuclear ) fListHistV0->Add(f3dHistGenPtVsYVsMultTRKXiPlus);
1665   }
1666   //CASCADEs, Y CMS
1667   if(! f3dHistGenPtVsYCMSVsMultTRKXiMinus) {
1668     f3dHistGenPtVsYCMSVsMultTRKXiMinus = new TH3F( "f3dHistGenPtVsYCMSVsMultTRKXiMinus", "Pt_{#Xi} Vs Y_{#Xi} Vs Multiplicity; Pt_{cascade} (GeV/c); Y_{#Xi} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1669     if( fkIsNuclear ) fListHistV0->Add(f3dHistGenPtVsYCMSVsMultTRKXiMinus);
1670   }
1671   if(! f3dHistGenPtVsYCMSVsMultTRKXiPlus) {
1672     f3dHistGenPtVsYCMSVsMultTRKXiPlus = new TH3F( "f3dHistGenPtVsYCMSVsMultTRKXiPlus", "Pt_{#Xi} Vs Y_{#Xi} Vs Multiplicity; Pt_{cascade} (GeV/c); Y_{#Xi} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1673     if( fkIsNuclear ) fListHistV0->Add(f3dHistGenPtVsYCMSVsMultTRKXiPlus);
1674   }
1675   
1676   //--------------------------------------------------------------------------------------
1677   //--- 3D Histo (Pt, Y, Multiplicity) for generated XiMinus/Plus, at selected analysis evts
1678   
1679   if(! f3dHistGenSelectedPtVsYVsMultTRKXiMinus) {
1680     f3dHistGenSelectedPtVsYVsMultTRKXiMinus = new TH3F( "f3dHistGenSelectedPtVsYVsMultTRKXiMinus", "Pt_{#Xi} Vs Y_{#Xi} Vs Multiplicity; Pt_{cascade} (GeV/c); Y_{#Xi} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1681     if( fkIsNuclear ) fListHistV0->Add(f3dHistGenSelectedPtVsYVsMultTRKXiMinus);
1682   }
1683   if(! f3dHistGenSelectedPtVsYVsMultTRKXiPlus) {
1684     f3dHistGenSelectedPtVsYVsMultTRKXiPlus = new TH3F( "f3dHistGenSelectedPtVsYVsMultTRKXiPlus", "Pt_{#Xi} Vs Y_{#Xi} Vs Multiplicity; Pt_{cascade} (GeV/c); Y_{#Xi} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1685     if( fkIsNuclear ) fListHistV0->Add(f3dHistGenSelectedPtVsYVsMultTRKXiPlus);
1686   }
1687   
1688   //CASCADES, analysis level, y CMS
1689   //--------------------------------------------------------------------------------------
1690   //--- 3D Histo (Pt, Y, Multiplicity) for generated XiMinus/Plus, at selected analysis evts
1691   
1692   if(! f3dHistGenSelectedPtVsYCMSVsMultTRKXiMinus) {
1693     f3dHistGenSelectedPtVsYCMSVsMultTRKXiMinus = new TH3F( "f3dHistGenSelectedPtVsYCMSVsMultTRKXiMinus", "Pt_{#Xi} Vs Y_{#Xi} Vs Multiplicity; Pt_{cascade} (GeV/c); Y_{#Xi} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1694     if( fkIsNuclear ) fListHistV0->Add(f3dHistGenSelectedPtVsYCMSVsMultTRKXiMinus);
1695   }
1696   if(! f3dHistGenSelectedPtVsYCMSVsMultTRKXiPlus) {
1697     f3dHistGenSelectedPtVsYCMSVsMultTRKXiPlus = new TH3F( "f3dHistGenSelectedPtVsYCMSVsMultTRKXiPlus", "Pt_{#Xi} Vs Y_{#Xi} Vs Multiplicity; Pt_{cascade} (GeV/c); Y_{#Xi} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1698     if( fkIsNuclear ) fListHistV0->Add(f3dHistGenSelectedPtVsYCMSVsMultTRKXiPlus);
1699   }
1700   
1701   
1702   //--------------------------------------------------------------------------------------
1703   // SPD for Cascades
1704   //--------------------------------------------------------------------------------------
1705   //--- 3D Histo (Pt, Y, Multiplicity) for generated XiMinus/Plus, all generated
1706   
1707   if(! f3dHistGenPtVsYVsMultSPDXiMinus) {
1708     f3dHistGenPtVsYVsMultSPDXiMinus = new TH3F( "f3dHistGenPtVsYVsMultSPDXiMinus", "Pt_{#Xi} Vs Y_{#Xi} Vs Multiplicity; Pt_{cascade} (GeV/c); Y_{#Xi} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1709     if( fkIsNuclear ) fListHistV0->Add(f3dHistGenPtVsYVsMultSPDXiMinus);
1710   }
1711   if(! f3dHistGenPtVsYVsMultSPDXiPlus) {
1712     f3dHistGenPtVsYVsMultSPDXiPlus = new TH3F( "f3dHistGenPtVsYVsMultSPDXiPlus", "Pt_{#Xi} Vs Y_{#Xi} Vs Multiplicity; Pt_{cascade} (GeV/c); Y_{#Xi} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1713     if( fkIsNuclear ) fListHistV0->Add(f3dHistGenPtVsYVsMultSPDXiPlus);
1714   }
1715   //CASCADEs, Y CMS
1716   if(! f3dHistGenPtVsYCMSVsMultSPDXiMinus) {
1717     f3dHistGenPtVsYCMSVsMultSPDXiMinus = new TH3F( "f3dHistGenPtVsYCMSVsMultSPDXiMinus", "Pt_{#Xi} Vs Y_{#Xi} Vs Multiplicity; Pt_{cascade} (GeV/c); Y_{#Xi} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1718     if( fkIsNuclear ) fListHistV0->Add(f3dHistGenPtVsYCMSVsMultSPDXiMinus);
1719   }
1720   if(! f3dHistGenPtVsYCMSVsMultSPDXiPlus) {
1721     f3dHistGenPtVsYCMSVsMultSPDXiPlus = new TH3F( "f3dHistGenPtVsYCMSVsMultSPDXiPlus", "Pt_{#Xi} Vs Y_{#Xi} Vs Multiplicity; Pt_{cascade} (GeV/c); Y_{#Xi} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1722     if( fkIsNuclear ) fListHistV0->Add(f3dHistGenPtVsYCMSVsMultSPDXiPlus);
1723   }
1724   
1725   //--------------------------------------------------------------------------------------
1726   //--- 3D Histo (Pt, Y, Multiplicity) for generated XiMinus/Plus, at selected analysis evts
1727   
1728   if(! f3dHistGenSelectedPtVsYVsMultSPDXiMinus) {
1729     f3dHistGenSelectedPtVsYVsMultSPDXiMinus = new TH3F( "f3dHistGenSelectedPtVsYVsMultSPDXiMinus", "Pt_{#Xi} Vs Y_{#Xi} Vs Multiplicity; Pt_{cascade} (GeV/c); Y_{#Xi} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1730     if( fkIsNuclear ) fListHistV0->Add(f3dHistGenSelectedPtVsYVsMultSPDXiMinus);
1731   }
1732   if(! f3dHistGenSelectedPtVsYVsMultSPDXiPlus) {
1733     f3dHistGenSelectedPtVsYVsMultSPDXiPlus = new TH3F( "f3dHistGenSelectedPtVsYVsMultSPDXiPlus", "Pt_{#Xi} Vs Y_{#Xi} Vs Multiplicity; Pt_{cascade} (GeV/c); Y_{#Xi} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1734     if( fkIsNuclear ) fListHistV0->Add(f3dHistGenSelectedPtVsYVsMultSPDXiPlus);
1735   }
1736   
1737   //CASCADES, analysis level, y CMS
1738   //--------------------------------------------------------------------------------------
1739   //--- 3D Histo (Pt, Y, Multiplicity) for generated XiMinus/Plus, at selected analysis evts
1740   
1741   if(! f3dHistGenSelectedPtVsYCMSVsMultSPDXiMinus) {
1742     f3dHistGenSelectedPtVsYCMSVsMultSPDXiMinus = new TH3F( "f3dHistGenSelectedPtVsYCMSVsMultSPDXiMinus", "Pt_{#Xi} Vs Y_{#Xi} Vs Multiplicity; Pt_{cascade} (GeV/c); Y_{#Xi} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1743     if( fkIsNuclear ) fListHistV0->Add(f3dHistGenSelectedPtVsYCMSVsMultSPDXiMinus);
1744   }
1745   if(! f3dHistGenSelectedPtVsYCMSVsMultSPDXiPlus) {
1746     f3dHistGenSelectedPtVsYCMSVsMultSPDXiPlus = new TH3F( "f3dHistGenSelectedPtVsYCMSVsMultSPDXiPlus", "Pt_{#Xi} Vs Y_{#Xi} Vs Multiplicity; Pt_{cascade} (GeV/c); Y_{#Xi} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1747     if( fkIsNuclear ) fListHistV0->Add(f3dHistGenSelectedPtVsYCMSVsMultSPDXiPlus);
1748   }
1749   
1750
1751
1752 //----------------------------------
1753 // Histos at analysis level 
1754 //----------------------------------
1755
1756 //The usual V0M business...
1757   
1758    if(! f3dHistPrimAnalysisPtVsYVsMultLambda) {
1759       f3dHistPrimAnalysisPtVsYVsMultLambda = new TH3F( "f3dHistPrimAnalysisPtVsYVsMultLambda", "Pt_{lambda} Vs Y_{#Lambda} Vs Multiplicity; Pt_{lambda} (GeV/c); Y_{#Lambda} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1760       fListHistV0->Add(f3dHistPrimAnalysisPtVsYVsMultLambda);
1761    }
1762    if(! f3dHistPrimAnalysisPtVsYVsMultAntiLambda) {
1763       f3dHistPrimAnalysisPtVsYVsMultAntiLambda = new TH3F( "f3dHistPrimAnalysisPtVsYVsMultAntiLambda", "Pt_{antilambda} Vs Y_{#Lambda} Vs Multiplicity; Pt_{antilambda} (GeV/c); Y_{#Lambda} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1764       fListHistV0->Add(f3dHistPrimAnalysisPtVsYVsMultAntiLambda);
1765    }
1766    if(! f3dHistPrimAnalysisPtVsYVsMultK0Short) {
1767       f3dHistPrimAnalysisPtVsYVsMultK0Short = new TH3F( "f3dHistPrimAnalysisPtVsYVsMultK0Short", "Pt_{K0S} Vs Y_{K0S} Vs Multiplicity; Pt_{K0S} (GeV/c); Y_{K0S} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1768       fListHistV0->Add(f3dHistPrimAnalysisPtVsYVsMultK0Short);
1769    }
1770
1771    if(! f3dHistPrimAnalysisPtVsYCMSVsMultLambda) {
1772       f3dHistPrimAnalysisPtVsYCMSVsMultLambda = new TH3F( "f3dHistPrimAnalysisPtVsYCMSVsMultLambda", "Pt_{lambda} Vs Y_{#Lambda} Vs Multiplicity; Pt_{lambda} (GeV/c); Y_{#Lambda} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1773       fListHistV0->Add(f3dHistPrimAnalysisPtVsYCMSVsMultLambda);
1774    }
1775    if(! f3dHistPrimAnalysisPtVsYCMSVsMultAntiLambda) {
1776       f3dHistPrimAnalysisPtVsYCMSVsMultAntiLambda = new TH3F( "f3dHistPrimAnalysisPtVsYCMSVsMultAntiLambda", "Pt_{antilambda} Vs Y_{#Lambda} Vs Multiplicity; Pt_{antilambda} (GeV/c); Y_{#Lambda} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1777       fListHistV0->Add(f3dHistPrimAnalysisPtVsYCMSVsMultAntiLambda);
1778    }
1779    if(! f3dHistPrimAnalysisPtVsYCMSVsMultK0Short) {
1780       f3dHistPrimAnalysisPtVsYCMSVsMultK0Short = new TH3F( "f3dHistPrimAnalysisPtVsYCMSVsMultK0Short", "Pt_{K0S} Vs Y_{K0S} Vs Multiplicity; Pt_{K0S} (GeV/c); Y_{K0S} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1781       fListHistV0->Add(f3dHistPrimAnalysisPtVsYCMSVsMultK0Short);
1782    }
1783   
1784   //TRUE Multiplicity Business
1785   
1786   if(! f3dHistPrimAnalysisPtVsYVsMultMCLambda) {
1787     f3dHistPrimAnalysisPtVsYVsMultMCLambda = new TH3F( "f3dHistPrimAnalysisPtVsYVsMultMCLambda", "Pt_{lambda} Vs Y_{#Lambda} Vs Multiplicity; Pt_{lambda} (GeV/c); Y_{#Lambda} ; MultMC", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1788     fListHistV0->Add(f3dHistPrimAnalysisPtVsYVsMultMCLambda);
1789   }
1790   if(! f3dHistPrimAnalysisPtVsYVsMultMCAntiLambda) {
1791     f3dHistPrimAnalysisPtVsYVsMultMCAntiLambda = new TH3F( "f3dHistPrimAnalysisPtVsYVsMultMCAntiLambda", "Pt_{antilambda} Vs Y_{#Lambda} Vs Multiplicity; Pt_{antilambda} (GeV/c); Y_{#Lambda} ; MultMC", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1792     fListHistV0->Add(f3dHistPrimAnalysisPtVsYVsMultMCAntiLambda);
1793   }
1794   if(! f3dHistPrimAnalysisPtVsYVsMultMCK0Short) {
1795     f3dHistPrimAnalysisPtVsYVsMultMCK0Short = new TH3F( "f3dHistPrimAnalysisPtVsYVsMultMCK0Short", "Pt_{K0S} Vs Y_{K0S} Vs Multiplicity; Pt_{K0S} (GeV/c); Y_{K0S} ; MultMC", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1796     fListHistV0->Add(f3dHistPrimAnalysisPtVsYVsMultMCK0Short);
1797   }
1798   
1799   if(! f3dHistPrimAnalysisPtVsYCMSVsMultMCLambda) {
1800     f3dHistPrimAnalysisPtVsYCMSVsMultMCLambda = new TH3F( "f3dHistPrimAnalysisPtVsYCMSVsMultMCLambda", "Pt_{lambda} Vs Y_{#Lambda} Vs Multiplicity; Pt_{lambda} (GeV/c); Y_{#Lambda} ; MultMC", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1801     fListHistV0->Add(f3dHistPrimAnalysisPtVsYCMSVsMultMCLambda);
1802   }
1803   if(! f3dHistPrimAnalysisPtVsYCMSVsMultMCAntiLambda) {
1804     f3dHistPrimAnalysisPtVsYCMSVsMultMCAntiLambda = new TH3F( "f3dHistPrimAnalysisPtVsYCMSVsMultMCAntiLambda", "Pt_{antilambda} Vs Y_{#Lambda} Vs Multiplicity; Pt_{antilambda} (GeV/c); Y_{#Lambda} ; MultMC", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1805     fListHistV0->Add(f3dHistPrimAnalysisPtVsYCMSVsMultMCAntiLambda);
1806   }
1807   if(! f3dHistPrimAnalysisPtVsYCMSVsMultMCK0Short) {
1808     f3dHistPrimAnalysisPtVsYCMSVsMultMCK0Short = new TH3F( "f3dHistPrimAnalysisPtVsYCMSVsMultMCK0Short", "Pt_{K0S} Vs Y_{K0S} Vs Multiplicity; Pt_{K0S} (GeV/c); Y_{K0S} ; MultMC", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1809     fListHistV0->Add(f3dHistPrimAnalysisPtVsYCMSVsMultMCK0Short);
1810   }
1811   
1812   //V0A
1813   
1814   if(! f3dHistPrimAnalysisPtVsYVsMultV0ALambda) {
1815     f3dHistPrimAnalysisPtVsYVsMultV0ALambda = new TH3F( "f3dHistPrimAnalysisPtVsYVsMultV0ALambda", "Pt_{lambda} Vs Y_{#Lambda} Vs Multiplicity; Pt_{lambda} (GeV/c); Y_{#Lambda} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1816     if( fkIsNuclear ) fListHistV0->Add(f3dHistPrimAnalysisPtVsYVsMultV0ALambda);
1817   }
1818   if(! f3dHistPrimAnalysisPtVsYVsMultV0AAntiLambda) {
1819     f3dHistPrimAnalysisPtVsYVsMultV0AAntiLambda = new TH3F( "f3dHistPrimAnalysisPtVsYVsMultV0AAntiLambda", "Pt_{antilambda} Vs Y_{#Lambda} Vs Multiplicity; Pt_{antilambda} (GeV/c); Y_{#Lambda} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1820     if( fkIsNuclear ) fListHistV0->Add(f3dHistPrimAnalysisPtVsYVsMultV0AAntiLambda);
1821   }
1822   if(! f3dHistPrimAnalysisPtVsYVsMultV0AK0Short) {
1823     f3dHistPrimAnalysisPtVsYVsMultV0AK0Short = new TH3F( "f3dHistPrimAnalysisPtVsYVsMultV0AK0Short", "Pt_{K0S} Vs Y_{K0S} Vs Multiplicity; Pt_{K0S} (GeV/c); Y_{K0S} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1824     if( fkIsNuclear ) fListHistV0->Add(f3dHistPrimAnalysisPtVsYVsMultV0AK0Short);
1825   }
1826   
1827   if(! f3dHistPrimAnalysisPtVsYCMSVsMultV0ALambda) {
1828     f3dHistPrimAnalysisPtVsYCMSVsMultV0ALambda = new TH3F( "f3dHistPrimAnalysisPtVsYCMSVsMultV0ALambda", "Pt_{lambda} Vs Y_{#Lambda} Vs Multiplicity; Pt_{lambda} (GeV/c); Y_{#Lambda} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1829     if( fkIsNuclear ) fListHistV0->Add(f3dHistPrimAnalysisPtVsYCMSVsMultV0ALambda);
1830   }
1831   if(! f3dHistPrimAnalysisPtVsYCMSVsMultV0AAntiLambda) {
1832     f3dHistPrimAnalysisPtVsYCMSVsMultV0AAntiLambda = new TH3F( "f3dHistPrimAnalysisPtVsYCMSVsMultV0AAntiLambda", "Pt_{antilambda} Vs Y_{#Lambda} Vs Multiplicity; Pt_{antilambda} (GeV/c); Y_{#Lambda} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1833     if( fkIsNuclear ) fListHistV0->Add(f3dHistPrimAnalysisPtVsYCMSVsMultV0AAntiLambda);
1834   }
1835   if(! f3dHistPrimAnalysisPtVsYCMSVsMultV0AK0Short) {
1836     f3dHistPrimAnalysisPtVsYCMSVsMultV0AK0Short = new TH3F( "f3dHistPrimAnalysisPtVsYCMSVsMultV0AK0Short", "Pt_{K0S} Vs Y_{K0S} Vs Multiplicity; Pt_{K0S} (GeV/c); Y_{K0S} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1837     if( fkIsNuclear ) fListHistV0->Add(f3dHistPrimAnalysisPtVsYCMSVsMultV0AK0Short);
1838   }
1839   
1840   //ZNA
1841   
1842   if(! f3dHistPrimAnalysisPtVsYVsMultZNALambda) {
1843     f3dHistPrimAnalysisPtVsYVsMultZNALambda = new TH3F( "f3dHistPrimAnalysisPtVsYVsMultZNALambda", "Pt_{lambda} Vs Y_{#Lambda} Vs Multiplicity; Pt_{lambda} (GeV/c); Y_{#Lambda} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1844     if( fkIsNuclear ) fListHistV0->Add(f3dHistPrimAnalysisPtVsYVsMultZNALambda);
1845   }
1846   if(! f3dHistPrimAnalysisPtVsYVsMultZNAAntiLambda) {
1847     f3dHistPrimAnalysisPtVsYVsMultZNAAntiLambda = new TH3F( "f3dHistPrimAnalysisPtVsYVsMultZNAAntiLambda", "Pt_{antilambda} Vs Y_{#Lambda} Vs Multiplicity; Pt_{antilambda} (GeV/c); Y_{#Lambda} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1848     if( fkIsNuclear ) fListHistV0->Add(f3dHistPrimAnalysisPtVsYVsMultZNAAntiLambda);
1849   }
1850   if(! f3dHistPrimAnalysisPtVsYVsMultZNAK0Short) {
1851     f3dHistPrimAnalysisPtVsYVsMultZNAK0Short = new TH3F( "f3dHistPrimAnalysisPtVsYVsMultZNAK0Short", "Pt_{K0S} Vs Y_{K0S} Vs Multiplicity; Pt_{K0S} (GeV/c); Y_{K0S} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1852     if( fkIsNuclear ) fListHistV0->Add(f3dHistPrimAnalysisPtVsYVsMultZNAK0Short);
1853   }
1854   
1855   if(! f3dHistPrimAnalysisPtVsYCMSVsMultZNALambda) {
1856     f3dHistPrimAnalysisPtVsYCMSVsMultZNALambda = new TH3F( "f3dHistPrimAnalysisPtVsYCMSVsMultZNALambda", "Pt_{lambda} Vs Y_{#Lambda} Vs Multiplicity; Pt_{lambda} (GeV/c); Y_{#Lambda} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1857     if( fkIsNuclear ) fListHistV0->Add(f3dHistPrimAnalysisPtVsYCMSVsMultZNALambda);
1858   }
1859   if(! f3dHistPrimAnalysisPtVsYCMSVsMultZNAAntiLambda) {
1860     f3dHistPrimAnalysisPtVsYCMSVsMultZNAAntiLambda = new TH3F( "f3dHistPrimAnalysisPtVsYCMSVsMultZNAAntiLambda", "Pt_{antilambda} Vs Y_{#Lambda} Vs Multiplicity; Pt_{antilambda} (GeV/c); Y_{#Lambda} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1861     if( fkIsNuclear ) fListHistV0->Add(f3dHistPrimAnalysisPtVsYCMSVsMultZNAAntiLambda);
1862   }
1863   if(! f3dHistPrimAnalysisPtVsYCMSVsMultZNAK0Short) {
1864     f3dHistPrimAnalysisPtVsYCMSVsMultZNAK0Short = new TH3F( "f3dHistPrimAnalysisPtVsYCMSVsMultZNAK0Short", "Pt_{K0S} Vs Y_{K0S} Vs Multiplicity; Pt_{K0S} (GeV/c); Y_{K0S} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1865     if( fkIsNuclear ) fListHistV0->Add(f3dHistPrimAnalysisPtVsYCMSVsMultZNAK0Short);
1866   }
1867   
1868   //TRK
1869   
1870   if(! f3dHistPrimAnalysisPtVsYVsMultTRKLambda) {
1871     f3dHistPrimAnalysisPtVsYVsMultTRKLambda = new TH3F( "f3dHistPrimAnalysisPtVsYVsMultTRKLambda", "Pt_{lambda} Vs Y_{#Lambda} Vs Multiplicity; Pt_{lambda} (GeV/c); Y_{#Lambda} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1872     if( fkIsNuclear ) fListHistV0->Add(f3dHistPrimAnalysisPtVsYVsMultTRKLambda);
1873   }
1874   if(! f3dHistPrimAnalysisPtVsYVsMultTRKAntiLambda) {
1875     f3dHistPrimAnalysisPtVsYVsMultTRKAntiLambda = new TH3F( "f3dHistPrimAnalysisPtVsYVsMultTRKAntiLambda", "Pt_{antilambda} Vs Y_{#Lambda} Vs Multiplicity; Pt_{antilambda} (GeV/c); Y_{#Lambda} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1876     if( fkIsNuclear ) fListHistV0->Add(f3dHistPrimAnalysisPtVsYVsMultTRKAntiLambda);
1877   }
1878   if(! f3dHistPrimAnalysisPtVsYVsMultTRKK0Short) {
1879     f3dHistPrimAnalysisPtVsYVsMultTRKK0Short = new TH3F( "f3dHistPrimAnalysisPtVsYVsMultTRKK0Short", "Pt_{K0S} Vs Y_{K0S} Vs Multiplicity; Pt_{K0S} (GeV/c); Y_{K0S} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1880     if( fkIsNuclear ) fListHistV0->Add(f3dHistPrimAnalysisPtVsYVsMultTRKK0Short);
1881   }
1882   
1883   if(! f3dHistPrimAnalysisPtVsYCMSVsMultTRKLambda) {
1884     f3dHistPrimAnalysisPtVsYCMSVsMultTRKLambda = new TH3F( "f3dHistPrimAnalysisPtVsYCMSVsMultTRKLambda", "Pt_{lambda} Vs Y_{#Lambda} Vs Multiplicity; Pt_{lambda} (GeV/c); Y_{#Lambda} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1885     if( fkIsNuclear ) fListHistV0->Add(f3dHistPrimAnalysisPtVsYCMSVsMultTRKLambda);
1886   }
1887   if(! f3dHistPrimAnalysisPtVsYCMSVsMultTRKAntiLambda) {
1888     f3dHistPrimAnalysisPtVsYCMSVsMultTRKAntiLambda = new TH3F( "f3dHistPrimAnalysisPtVsYCMSVsMultTRKAntiLambda", "Pt_{antilambda} Vs Y_{#Lambda} Vs Multiplicity; Pt_{antilambda} (GeV/c); Y_{#Lambda} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1889     if( fkIsNuclear ) fListHistV0->Add(f3dHistPrimAnalysisPtVsYCMSVsMultTRKAntiLambda);
1890   }
1891   if(! f3dHistPrimAnalysisPtVsYCMSVsMultTRKK0Short) {
1892     f3dHistPrimAnalysisPtVsYCMSVsMultTRKK0Short = new TH3F( "f3dHistPrimAnalysisPtVsYCMSVsMultTRKK0Short", "Pt_{K0S} Vs Y_{K0S} Vs Multiplicity; Pt_{K0S} (GeV/c); Y_{K0S} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1893     if( fkIsNuclear ) fListHistV0->Add(f3dHistPrimAnalysisPtVsYCMSVsMultTRKK0Short);
1894   }
1895   
1896   //SPD
1897   
1898   if(! f3dHistPrimAnalysisPtVsYVsMultSPDLambda) {
1899     f3dHistPrimAnalysisPtVsYVsMultSPDLambda = new TH3F( "f3dHistPrimAnalysisPtVsYVsMultSPDLambda", "Pt_{lambda} Vs Y_{#Lambda} Vs Multiplicity; Pt_{lambda} (GeV/c); Y_{#Lambda} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1900     if( fkIsNuclear ) fListHistV0->Add(f3dHistPrimAnalysisPtVsYVsMultSPDLambda);
1901   }
1902   if(! f3dHistPrimAnalysisPtVsYVsMultSPDAntiLambda) {
1903     f3dHistPrimAnalysisPtVsYVsMultSPDAntiLambda = new TH3F( "f3dHistPrimAnalysisPtVsYVsMultSPDAntiLambda", "Pt_{antilambda} Vs Y_{#Lambda} Vs Multiplicity; Pt_{antilambda} (GeV/c); Y_{#Lambda} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1904     if( fkIsNuclear ) fListHistV0->Add(f3dHistPrimAnalysisPtVsYVsMultSPDAntiLambda);
1905   }
1906   if(! f3dHistPrimAnalysisPtVsYVsMultSPDK0Short) {
1907     f3dHistPrimAnalysisPtVsYVsMultSPDK0Short = new TH3F( "f3dHistPrimAnalysisPtVsYVsMultSPDK0Short", "Pt_{K0S} Vs Y_{K0S} Vs Multiplicity; Pt_{K0S} (GeV/c); Y_{K0S} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1908     if( fkIsNuclear ) fListHistV0->Add(f3dHistPrimAnalysisPtVsYVsMultSPDK0Short);
1909   }
1910   
1911   if(! f3dHistPrimAnalysisPtVsYCMSVsMultSPDLambda) {
1912     f3dHistPrimAnalysisPtVsYCMSVsMultSPDLambda = new TH3F( "f3dHistPrimAnalysisPtVsYCMSVsMultSPDLambda", "Pt_{lambda} Vs Y_{#Lambda} Vs Multiplicity; Pt_{lambda} (GeV/c); Y_{#Lambda} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1913     if( fkIsNuclear ) fListHistV0->Add(f3dHistPrimAnalysisPtVsYCMSVsMultSPDLambda);
1914   }
1915   if(! f3dHistPrimAnalysisPtVsYCMSVsMultSPDAntiLambda) {
1916     f3dHistPrimAnalysisPtVsYCMSVsMultSPDAntiLambda = new TH3F( "f3dHistPrimAnalysisPtVsYCMSVsMultSPDAntiLambda", "Pt_{antilambda} Vs Y_{#Lambda} Vs Multiplicity; Pt_{antilambda} (GeV/c); Y_{#Lambda} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1917     if( fkIsNuclear ) fListHistV0->Add(f3dHistPrimAnalysisPtVsYCMSVsMultSPDAntiLambda);
1918   }
1919   if(! f3dHistPrimAnalysisPtVsYCMSVsMultSPDK0Short) {
1920     f3dHistPrimAnalysisPtVsYCMSVsMultSPDK0Short = new TH3F( "f3dHistPrimAnalysisPtVsYCMSVsMultSPDK0Short", "Pt_{K0S} Vs Y_{K0S} Vs Multiplicity; Pt_{K0S} (GeV/c); Y_{K0S} ; Mult", lCustomNBins, 0., lCustomPtUpperLimit, 48, -1.2,1.2,lCustomNBinsMultiplicity,0,lCustomNBinsMultiplicity);
1921     if( fkIsNuclear ) fListHistV0->Add(f3dHistPrimAnalysisPtVsYCMSVsMultSPDK0Short);
1922   }
1923
1924 //----------------------------------
1925 // Primary Vertex Position Histos
1926 //----------------------------------
1927
1928    if(! fHistPVx) {
1929          fHistPVx = new TH1F("fHistPVx", 
1930             "PV x position;Nbr of Evts;x", 
1931             2000, -0.5, 0.5);       
1932       fListHistV0->Add(fHistPVx);
1933    }
1934    if(! fHistPVy) {
1935          fHistPVy = new TH1F("fHistPVy", 
1936             "PV y position;Nbr of Evts;y", 
1937             2000, -0.5, 0.5);       
1938       fListHistV0->Add(fHistPVy);
1939    }
1940    if(! fHistPVz) {
1941          fHistPVz = new TH1F("fHistPVz", 
1942             "PV z position;Nbr of Evts;z", 
1943             400, -20, 20);       
1944       fListHistV0->Add(fHistPVz);
1945    }
1946
1947    if(! fHistPVxAnalysis) {
1948          fHistPVxAnalysis = new TH1F("fHistPVxAnalysis", 
1949             "PV x position;Nbr of Evts;x", 
1950             2000, -0.5, 0.5);       
1951       fListHistV0->Add(fHistPVxAnalysis);
1952    }
1953    if(! fHistPVyAnalysis) {
1954          fHistPVyAnalysis = new TH1F("fHistPVyAnalysis", 
1955             "PV y position;Nbr of Evts;y", 
1956             2000, -0.5, 0.5);       
1957       fListHistV0->Add(fHistPVyAnalysis);
1958    }
1959    if(! fHistPVzAnalysis) {
1960          fHistPVzAnalysis = new TH1F("fHistPVzAnalysis", 
1961             "PV z position;Nbr of Evts;z", 
1962             400, -20, 20);       
1963       fListHistV0->Add(fHistPVzAnalysis);
1964    }
1965
1966    if(! fHistPVxAnalysisHasHighPtLambda) {
1967          fHistPVxAnalysisHasHighPtLambda = new TH1F("fHistPVxAnalysisHasHighPtLambda", 
1968             "PV x position;Nbr of Evts;x", 
1969             2000, -0.5, 0.5);       
1970       fListHistV0->Add(fHistPVxAnalysisHasHighPtLambda);
1971    }
1972    if(! fHistPVyAnalysisHasHighPtLambda) {
1973          fHistPVyAnalysisHasHighPtLambda = new TH1F("fHistPVyAnalysisHasHighPtLambda", 
1974             "PV y position;Nbr of Evts;y", 
1975             2000, -0.5, 0.5);       
1976       fListHistV0->Add(fHistPVyAnalysisHasHighPtLambda);
1977    }
1978    if(! fHistPVzAnalysisHasHighPtLambda) {
1979          fHistPVzAnalysisHasHighPtLambda = new TH1F("fHistPVzAnalysisHasHighPtLambda", 
1980             "PV z position;Nbr of Evts;z", 
1981             400, -20, 20);       
1982       fListHistV0->Add(fHistPVzAnalysisHasHighPtLambda);
1983    }
1984    if(! fHistSwappedV0Counter) {
1985       fHistSwappedV0Counter = new TH1F("fHistSwappedV0Counter", 
1986          "Swap or not histo;Swapped (1) or not (0); count", 
1987          2, 0, 2);              
1988       fListHistV0->Add(fHistSwappedV0Counter);
1989    }
1990
1991    //List of Histograms: Normal
1992    PostData(1, fListHistV0);
1993
1994    //TTree Object: Saved to base directory. Should cache to disk while saving. 
1995    //(Important to avoid excessive memory usage, particularly when merging)
1996    PostData(2, fTree);
1997
1998 }// end UserCreateOutputObjects
1999
2000
2001 //________________________________________________________________________
2002 void AliAnalysisTaskExtractPerformanceV0::UserExec(Option_t *) 
2003 {
2004   // Main loop
2005   // Called for each event
2006
2007    AliESDEvent *lESDevent = 0x0;
2008    AliMCEvent  *lMCevent  = 0x0; 
2009    AliStack    *lMCstack  = 0x0; 
2010
2011    Int_t    lNumberOfV0s                      = -1;
2012    Double_t lTrkgPrimaryVtxPos[3]          = {-100.0, -100.0, -100.0};
2013    Double_t lBestPrimaryVtxPos[3]          = {-100.0, -100.0, -100.0};
2014    Double_t lMagneticField                 = -10.;
2015    
2016   // Connect to the InputEvent   
2017   // After these lines, we should have an ESD/AOD event + the number of V0s in it.
2018
2019    // Appropriate for ESD analysis! 
2020       
2021    lESDevent = dynamic_cast<AliESDEvent*>( InputEvent() );
2022    if (!lESDevent) {
2023       AliWarning("ERROR: lESDevent not available \n");
2024       return;
2025    }
2026         
2027    fTreeVariableRunNumber = lESDevent->GetRunNumber();
2028    fTreeVariableEventNumber =  
2029     ( ( ((ULong64_t)lESDevent->GetPeriodNumber() ) << 36 ) |
2030       ( ((ULong64_t)lESDevent->GetOrbitNumber () ) << 12 ) |
2031         ((ULong64_t)lESDevent->GetBunchCrossNumber() )  );
2032
2033    lMCevent = MCEvent();
2034    if (!lMCevent) {
2035       Printf("ERROR: Could not retrieve MC event \n");
2036       cout << "Name of the file with pb :" <<  fInputHandler->GetTree()->GetCurrentFile()->GetName() << endl;   
2037       return;
2038    }
2039
2040    lMCstack = lMCevent->Stack();
2041    if (!lMCstack) {
2042       Printf("ERROR: Could not retrieve MC stack \n");
2043       cout << "Name of the file with pb :" <<  fInputHandler->GetTree()->GetCurrentFile()->GetName() << endl;
2044       return;
2045    }
2046   
2047   //------------------------------------------------
2048   // Rerun V0 vertexer, if asked for
2049   // --- WARNING: Be careful when using in PbPb
2050   //------------------------------------------------
2051   if( fkRunV0Vertexer ){
2052     lESDevent->ResetV0s();
2053     AliV0vertexer lV0vtxer;
2054     lV0vtxer.SetDefaultCuts(fV0Sels);
2055     lV0vtxer.Tracks2V0vertices(lESDevent);
2056   }
2057   
2058    TArrayF mcPrimaryVtx;
2059    AliGenEventHeader* mcHeader=lMCevent->GenEventHeader();
2060    if(!mcHeader) return;
2061    mcHeader->PrimaryVertex(mcPrimaryVtx);
2062         
2063 //------------------------------------------------
2064 // Multiplicity Information Acquistion
2065 //------------------------------------------------
2066
2067    //REVISED multiplicity estimator after 'multiplicity day' (2011)
2068     Int_t lMultiplicity = -100;
2069     Int_t lMultiplicityV0A = -100;
2070     Int_t lMultiplicityZNA = -100;
2071     Int_t lMultiplicityTRK = -100;
2072     Int_t lMultiplicitySPD = -100;
2073   
2074    //testing purposes
2075    if(fkIsNuclear == kFALSE) lMultiplicity = fESDtrackCuts->GetReferenceMultiplicity(lESDevent, AliESDtrackCuts::kTrackletsITSTPC,0.5);
2076
2077    //---> If this is a nuclear collision, then go nuclear on "multiplicity" variable...
2078    //---> Warning: Experimental
2079    if(fkIsNuclear == kTRUE){ 
2080       AliCentrality* centrality;
2081       centrality = lESDevent->GetCentrality();
2082       lMultiplicity = ( ( Int_t ) ( centrality->GetCentralityPercentile(   fCentralityEstimator.Data() ) ) );
2083       lMultiplicityV0A = ( ( Int_t ) ( centrality->GetCentralityPercentile(   "V0A" ) ) );
2084       lMultiplicityZNA = ( ( Int_t ) ( centrality->GetCentralityPercentile(   "ZNA" ) ) );
2085       lMultiplicityTRK = ( ( Int_t ) ( centrality->GetCentralityPercentile(   "TRK" ) ) );
2086       lMultiplicitySPD = ( ( Int_t ) ( centrality->GetCentralityPercentile(   "CL1" ) ) );
2087       if (centrality->GetQuality()>1) {
2088         PostData(1, fListHistV0);
2089         PostData(2, fTree);
2090         return;
2091       }
2092    }
2093   
2094    //Set variable for filling tree afterwards!
2095    //---> pp case......: GetReferenceMultiplicity
2096    //---> Pb-Pb case...: Centrality by V0M
2097   fTreeVariableMultiplicity = lMultiplicity;
2098   fTreeVariableMultiplicityV0A = lMultiplicityV0A;
2099   fTreeVariableMultiplicityZNA = lMultiplicityZNA;
2100   fTreeVariableMultiplicityTRK = lMultiplicityTRK;
2101   fTreeVariableMultiplicitySPD = lMultiplicitySPD;
2102
2103    fHistV0MultiplicityBeforeTrigSel->Fill ( lESDevent->GetNumberOfV0s() );
2104   
2105   fHistMultiplicityBeforeTrigSel->Fill ( lMultiplicity );
2106   fHistMultiplicityV0ABeforeTrigSel->Fill ( lMultiplicityV0A );
2107   fHistMultiplicityZNABeforeTrigSel->Fill ( lMultiplicityZNA );
2108   fHistMultiplicityTRKBeforeTrigSel->Fill ( lMultiplicityTRK );
2109   fHistMultiplicitySPDBeforeTrigSel->Fill ( lMultiplicitySPD );
2110   
2111 //------------------------------------------------
2112 // MC Information Acquistion
2113 //------------------------------------------------
2114
2115    Int_t iNumberOfPrimaries = -1;
2116    iNumberOfPrimaries = lMCstack->GetNprimary();
2117    if(iNumberOfPrimaries < 1) return; 
2118    Bool_t lHasHighPtLambda = kFALSE;
2119
2120 //------------------------------------------------
2121 // Variable Definition
2122 //------------------------------------------------
2123
2124    Int_t lNbMCPrimary        = 0;
2125
2126    Int_t lPdgcodeCurrentPart = 0;
2127    Double_t lRapCurrentPart  = 0;
2128    Double_t lPtCurrentPart   = 0;
2129   
2130    //Int_t lComeFromSigma      = 0;
2131
2132    // current mc particle 's mother
2133    //Int_t iCurrentMother  = 0;
2134    lNbMCPrimary = lMCstack->GetNprimary();
2135
2136 //------------------------------------------------
2137 // Pre-Physics Selection
2138 //------------------------------------------------
2139
2140 //----- Loop on primary Xi, Omega --------------------------------------------------------------
2141    for (Int_t iCurrentLabelStack = 0; iCurrentLabelStack < lNbMCPrimary; iCurrentLabelStack++) 
2142    {// This is the begining of the loop on primaries
2143       
2144       TParticle* lCurrentParticlePrimary = 0x0; 
2145       lCurrentParticlePrimary = lMCstack->Particle( iCurrentLabelStack );
2146       if(!lCurrentParticlePrimary){
2147          Printf("Cascade loop %d - MC TParticle pointer to current stack particle = 0x0 ! Skip ...\n", iCurrentLabelStack );
2148          continue;
2149       }
2150       if ( TMath::Abs(lCurrentParticlePrimary->GetPdgCode()) == 3312 || TMath::Abs(lCurrentParticlePrimary->GetPdgCode()) == 3334 ) { 
2151          Double_t lRapXiMCPrimary = -100;
2152          if( (lCurrentParticlePrimary->Energy() - lCurrentParticlePrimary->Pz() +1.e-13) != 0 ) { 
2153            if ( (lCurrentParticlePrimary->Energy() + lCurrentParticlePrimary->Pz()) / (lCurrentParticlePrimary->Energy() - lCurrentParticlePrimary->Pz() +1.e-13) !=0 ){
2154              lRapXiMCPrimary = 0.5*TMath::Log( (lCurrentParticlePrimary->Energy() + lCurrentParticlePrimary->Pz()) / (lCurrentParticlePrimary->Energy() - lCurrentParticlePrimary->Pz() +1.e-13) );
2155            }
2156          }
2157
2158          //=================================================================================
2159          // Xi Histograms
2160          if( lCurrentParticlePrimary->GetPdgCode() == 3312 ){ 
2161             lPtCurrentPart    = lCurrentParticlePrimary->Pt();
2162             f3dHistGenPtVsYVsMultXiMinus->Fill(lPtCurrentPart, lRapXiMCPrimary, lMultiplicity);
2163             f3dHistGenPtVsYCMSVsMultXiMinus->Fill(lPtCurrentPart, lRapXiMCPrimary+fpArapidityShift, lMultiplicity);
2164            
2165            f3dHistGenPtVsYVsMultV0AXiMinus->Fill(lPtCurrentPart, lRapXiMCPrimary, lMultiplicityV0A);
2166            f3dHistGenPtVsYCMSVsMultV0AXiMinus->Fill(lPtCurrentPart, lRapXiMCPrimary+fpArapidityShift, lMultiplicityV0A);
2167            f3dHistGenPtVsYVsMultZNAXiMinus->Fill(lPtCurrentPart, lRapXiMCPrimary, lMultiplicityZNA);
2168            f3dHistGenPtVsYCMSVsMultZNAXiMinus->Fill(lPtCurrentPart, lRapXiMCPrimary+fpArapidityShift, lMultiplicityZNA);
2169            f3dHistGenPtVsYVsMultTRKXiMinus->Fill(lPtCurrentPart, lRapXiMCPrimary, lMultiplicityTRK);
2170            f3dHistGenPtVsYCMSVsMultTRKXiMinus->Fill(lPtCurrentPart, lRapXiMCPrimary+fpArapidityShift, lMultiplicityTRK);
2171            f3dHistGenPtVsYVsMultSPDXiMinus->Fill(lPtCurrentPart, lRapXiMCPrimary, lMultiplicitySPD);
2172            f3dHistGenPtVsYCMSVsMultSPDXiMinus->Fill(lPtCurrentPart, lRapXiMCPrimary+fpArapidityShift, lMultiplicitySPD);
2173          }
2174          if( lCurrentParticlePrimary->GetPdgCode() == -3312 ){
2175             lPtCurrentPart    = lCurrentParticlePrimary->Pt();
2176             f3dHistGenPtVsYVsMultXiPlus->Fill(lPtCurrentPart, lRapXiMCPrimary, lMultiplicity);
2177             f3dHistGenPtVsYCMSVsMultXiPlus->Fill(lPtCurrentPart, lRapXiMCPrimary+fpArapidityShift, lMultiplicity);
2178            
2179            f3dHistGenPtVsYVsMultV0AXiPlus->Fill(lPtCurrentPart, lRapXiMCPrimary, lMultiplicityV0A);
2180            f3dHistGenPtVsYCMSVsMultV0AXiPlus->Fill(lPtCurrentPart, lRapXiMCPrimary+fpArapidityShift, lMultiplicityV0A);
2181            f3dHistGenPtVsYVsMultZNAXiPlus->Fill(lPtCurrentPart, lRapXiMCPrimary, lMultiplicityZNA);
2182            f3dHistGenPtVsYCMSVsMultZNAXiPlus->Fill(lPtCurrentPart, lRapXiMCPrimary+fpArapidityShift, lMultiplicityZNA);
2183            f3dHistGenPtVsYVsMultTRKXiPlus->Fill(lPtCurrentPart, lRapXiMCPrimary, lMultiplicityTRK);
2184            f3dHistGenPtVsYCMSVsMultTRKXiPlus->Fill(lPtCurrentPart, lRapXiMCPrimary+fpArapidityShift, lMultiplicityTRK);
2185            f3dHistGenPtVsYVsMultSPDXiPlus->Fill(lPtCurrentPart, lRapXiMCPrimary, lMultiplicitySPD);
2186            f3dHistGenPtVsYCMSVsMultSPDXiPlus->Fill(lPtCurrentPart, lRapXiMCPrimary+fpArapidityShift, lMultiplicitySPD);
2187          }
2188       } 
2189    }
2190 //----- End Loop on primary Xi, Omega ----------------------------------------------------------
2191
2192 //--------- GENERATED NUMBER OF CHARGED PARTICLES
2193 // ---> Set Variables to Zero again
2194 // ---> Variable Definition
2195
2196   Long_t lNumberOfCharged = 0; 
2197
2198 //----- Loop on Stack ----------------------------------------------------------------
2199    for (Int_t iCurrentLabelStack = 0;  iCurrentLabelStack < (lMCstack->GetNtrack()); iCurrentLabelStack++) 
2200    {// This is the begining of the loop on tracks
2201       TParticle* particleOne = lMCstack->Particle(iCurrentLabelStack);
2202       if(!particleOne) continue;
2203       if(!particleOne->GetPDG()) continue;
2204       Double_t lThisCharge = particleOne->GetPDG()->Charge()/3.;
2205       if(TMath::Abs(lThisCharge)<0.001) continue;
2206       if(! (lMCstack->IsPhysicalPrimary(iCurrentLabelStack)) ) continue;
2207      
2208       //Double_t gpt = particleOne -> Pt();
2209       Double_t geta = particleOne -> Eta(); 
2210
2211       if( TMath::Abs(geta) < 0.5) lNumberOfCharged++; 
2212    }//End of loop on tracks
2213 //----- End Loop on Stack ------------------------------------------------------------
2214
2215    //Double_t lpArapidityShift = 0.465;
2216    Bool_t lStackNatural = kTRUE;
2217 //----- Loop on Lambda, K0Short ----------------------------------------------------------------
2218    for (Int_t iCurrentLabelStack = 0;  iCurrentLabelStack < (lMCstack->GetNtrack()); iCurrentLabelStack++) 
2219    {// This is the begining of the loop on tracks
2220       
2221       TParticle* lCurrentParticleForLambdaCheck = 0x0; 
2222       lCurrentParticleForLambdaCheck = lMCstack->Particle( iCurrentLabelStack );
2223       if(!lCurrentParticleForLambdaCheck){
2224          Printf("V0s loop %d - MC TParticle pointer to current stack particle = 0x0 ! Skip ...\n", iCurrentLabelStack );
2225          continue;
2226       }
2227
2228       //=================================================================================
2229       //Single-Strange checks
2230       // Keep only K0s, Lambda and AntiLambda:
2231       lPdgcodeCurrentPart = lCurrentParticleForLambdaCheck->GetPdgCode();             
2232
2233       if ( (lCurrentParticleForLambdaCheck->GetPdgCode() == 310   ) ||
2234            (lCurrentParticleForLambdaCheck->GetPdgCode() == 3122  ) ||
2235            (lCurrentParticleForLambdaCheck->GetPdgCode() == -3122 ) )
2236            {
2237          lRapCurrentPart   = MyRapidity(lCurrentParticleForLambdaCheck->Energy(),lCurrentParticleForLambdaCheck->Pz());
2238          lPtCurrentPart    = lCurrentParticleForLambdaCheck->Pt();
2239
2240           //Use Close to PV for filling CloseToPV histograms!
2241          Double_t dx, dy, dz; 
2242
2243          dx = ( (mcPrimaryVtx.At(0)) - (lCurrentParticleForLambdaCheck->Vx()) ); 
2244          dy = ( (mcPrimaryVtx.At(1)) - (lCurrentParticleForLambdaCheck->Vy()) );
2245          dz = ( (mcPrimaryVtx.At(2)) - (lCurrentParticleForLambdaCheck->Vz()) );
2246          Double_t lDistToPV = TMath::Sqrt(dx*dx + dy*dy + dz*dz);
2247          if( lDistToPV <= 0.001){ 
2248            if( lPdgcodeCurrentPart == 3122 ){
2249               f3dHistPrimCloseToPVPtVsYVsMultLambda->Fill(lPtCurrentPart, lRapCurrentPart, lMultiplicity);
2250            }
2251            if( lPdgcodeCurrentPart == -3122 ){
2252               f3dHistPrimCloseToPVPtVsYVsMultAntiLambda->Fill(lPtCurrentPart, lRapCurrentPart, lMultiplicity);
2253            }
2254            if( lPdgcodeCurrentPart == 310 ){
2255               f3dHistPrimCloseToPVPtVsYVsMultK0Short->Fill(lPtCurrentPart, lRapCurrentPart, lMultiplicity);
2256            }
2257          }
2258
2259          //Use Physical Primaries only for filling PrimRaw Histograms!
2260          if ( lMCstack->IsPhysicalPrimary(iCurrentLabelStack)!=kTRUE ) continue;
2261
2262           lStackNatural = lMCevent->IsFromBGEvent(iCurrentLabelStack); //Is it? 
2263           if (!lStackNatural){
2264             if (!(lCurrentParticleForLambdaCheck->GetFirstMother()<0)) 
2265               {lStackNatural = kTRUE;} // because there are primaries (ALICE definition) not produced in the collision
2266           }
2267
2268          if( lPdgcodeCurrentPart == 3122 ){
2269             f3dHistPrimRawPtVsYVsMultLambda->Fill(lPtCurrentPart, lRapCurrentPart, lMultiplicity);
2270             f3dHistPrimRawPtVsYCMSVsMultLambda->Fill(lPtCurrentPart, lRapCurrentPart+fpArapidityShift, lMultiplicity);
2271
2272            f3dHistPrimRawPtVsYVsMultV0ALambda->Fill(lPtCurrentPart, lRapCurrentPart, lMultiplicityV0A);
2273            f3dHistPrimRawPtVsYCMSVsMultV0ALambda->Fill(lPtCurrentPart, lRapCurrentPart+fpArapidityShift, lMultiplicityV0A);
2274            f3dHistPrimRawPtVsYVsMultZNALambda->Fill(lPtCurrentPart, lRapCurrentPart, lMultiplicityZNA);
2275            f3dHistPrimRawPtVsYCMSVsMultZNALambda->Fill(lPtCurrentPart, lRapCurrentPart+fpArapidityShift, lMultiplicityZNA);
2276            f3dHistPrimRawPtVsYVsMultTRKLambda->Fill(lPtCurrentPart, lRapCurrentPart, lMultiplicityTRK);
2277            f3dHistPrimRawPtVsYCMSVsMultTRKLambda->Fill(lPtCurrentPart, lRapCurrentPart+fpArapidityShift, lMultiplicityTRK);
2278            f3dHistPrimRawPtVsYVsMultSPDLambda->Fill(lPtCurrentPart, lRapCurrentPart, lMultiplicitySPD);
2279            f3dHistPrimRawPtVsYCMSVsMultSPDLambda->Fill(lPtCurrentPart, lRapCurrentPart+fpArapidityShift, lMultiplicitySPD);
2280
2281             if(lStackNatural){f3dHistPrimRawPtVsYVsMultNonInjLambda->Fill(lPtCurrentPart, lRapCurrentPart, lMultiplicity);}
2282             f3dHistPrimRawPtVsYVsMultMCLambda->Fill(lPtCurrentPart, lRapCurrentPart, lNumberOfCharged);
2283             f3dHistPrimRawPtVsYVsVertexZLambda->Fill(lPtCurrentPart, lRapCurrentPart, mcPrimaryVtx.At(2));
2284             if( TMath::Abs( lCurrentParticleForLambdaCheck->Eta() )<1.2 && lPtCurrentPart>2 ){
2285                lHasHighPtLambda = kTRUE; //Keep track of events with Lambda within |eta|<1.2 and pt>2
2286             }
2287          }
2288          if( lPdgcodeCurrentPart == -3122 ){
2289             f3dHistPrimRawPtVsYVsMultAntiLambda->Fill(lPtCurrentPart, lRapCurrentPart, lMultiplicity);
2290             f3dHistPrimRawPtVsYCMSVsMultAntiLambda->Fill(lPtCurrentPart, lRapCurrentPart+fpArapidityShift, lMultiplicity);
2291            
2292            f3dHistPrimRawPtVsYVsMultV0AAntiLambda->Fill(lPtCurrentPart, lRapCurrentPart, lMultiplicityV0A);
2293            f3dHistPrimRawPtVsYCMSVsMultV0AAntiLambda->Fill(lPtCurrentPart, lRapCurrentPart+fpArapidityShift, lMultiplicityV0A);
2294            f3dHistPrimRawPtVsYVsMultZNAAntiLambda->Fill(lPtCurrentPart, lRapCurrentPart, lMultiplicityZNA);
2295            f3dHistPrimRawPtVsYCMSVsMultZNAAntiLambda->Fill(lPtCurrentPart, lRapCurrentPart+fpArapidityShift, lMultiplicityZNA);
2296            f3dHistPrimRawPtVsYVsMultTRKAntiLambda->Fill(lPtCurrentPart, lRapCurrentPart, lMultiplicityTRK);
2297            f3dHistPrimRawPtVsYCMSVsMultTRKAntiLambda->Fill(lPtCurrentPart, lRapCurrentPart+fpArapidityShift, lMultiplicityTRK);
2298            f3dHistPrimRawPtVsYVsMultSPDAntiLambda->Fill(lPtCurrentPart, lRapCurrentPart, lMultiplicitySPD);
2299            f3dHistPrimRawPtVsYCMSVsMultSPDAntiLambda->Fill(lPtCurrentPart, lRapCurrentPart+fpArapidityShift, lMultiplicitySPD);
2300            
2301             if(lStackNatural){f3dHistPrimRawPtVsYVsMultNonInjAntiLambda->Fill(lPtCurrentPart, lRapCurrentPart, lMultiplicity);}
2302             f3dHistPrimRawPtVsYVsMultMCAntiLambda->Fill(lPtCurrentPart, lRapCurrentPart, lNumberOfCharged);
2303             f3dHistPrimRawPtVsYVsVertexZAntiLambda->Fill(lPtCurrentPart, lRapCurrentPart, mcPrimaryVtx.At(2));
2304          }
2305          if( lPdgcodeCurrentPart == 310 ){
2306             f3dHistPrimRawPtVsYVsMultK0Short->Fill(lPtCurrentPart, lRapCurrentPart, lMultiplicity);
2307             f3dHistPrimRawPtVsYCMSVsMultK0Short->Fill(lPtCurrentPart, lRapCurrentPart+fpArapidityShift, lMultiplicity);
2308            
2309            f3dHistPrimRawPtVsYVsMultV0AK0Short->Fill(lPtCurrentPart, lRapCurrentPart, lMultiplicityV0A);
2310            f3dHistPrimRawPtVsYCMSVsMultV0AK0Short->Fill(lPtCurrentPart, lRapCurrentPart+fpArapidityShift, lMultiplicityV0A);
2311            f3dHistPrimRawPtVsYVsMultZNAK0Short->Fill(lPtCurrentPart, lRapCurrentPart, lMultiplicityZNA);
2312            f3dHistPrimRawPtVsYCMSVsMultZNAK0Short->Fill(lPtCurrentPart, lRapCurrentPart+fpArapidityShift, lMultiplicityZNA);
2313            f3dHistPrimRawPtVsYVsMultTRKK0Short->Fill(lPtCurrentPart, lRapCurrentPart, lMultiplicityTRK);
2314            f3dHistPrimRawPtVsYCMSVsMultTRKK0Short->Fill(lPtCurrentPart, lRapCurrentPart+fpArapidityShift, lMultiplicityTRK);
2315            f3dHistPrimRawPtVsYVsMultSPDK0Short->Fill(lPtCurrentPart, lRapCurrentPart, lMultiplicitySPD);
2316            f3dHistPrimRawPtVsYCMSVsMultSPDK0Short->Fill(lPtCurrentPart, lRapCurrentPart+fpArapidityShift, lMultiplicitySPD);
2317            
2318             if(lStackNatural){f3dHistPrimRawPtVsYVsMultNonInjK0Short->Fill(lPtCurrentPart, lRapCurrentPart, lMultiplicity);}
2319             f3dHistPrimRawPtVsYVsMultMCK0Short->Fill(lPtCurrentPart, lRapCurrentPart, lNumberOfCharged);
2320             f3dHistPrimRawPtVsYVsVertexZK0Short->Fill(lPtCurrentPart, lRapCurrentPart, mcPrimaryVtx.At(2));
2321          }
2322          //Decay Length Acquisition=====================================================
2323          Double_t decaylength = -1; 
2324          Double_t lV0Mass = -1; 
2325           
2326          if( !(lCurrentParticleForLambdaCheck->GetDaughter(0) < 0) ) {
2327             TParticle* lDght0ofV0 = lMCstack->Particle(  lCurrentParticleForLambdaCheck->GetDaughter(0) ); //get first daughter
2328             if(lDght0ofV0){ // skip if not defined. 
2329                decaylength = TMath::Sqrt(
2330                                         TMath::Power( lCurrentParticleForLambdaCheck->Vx() - lDght0ofV0->Vx() , 2) + 
2331                                         TMath::Power( lCurrentParticleForLambdaCheck->Vy() - lDght0ofV0->Vy() , 2) + 
2332                                         TMath::Power( lCurrentParticleForLambdaCheck->Vz() - lDght0ofV0->Vz() , 2)
2333                );
2334                //Need to correct for relativitity! Involves multiplying by mass and dividing by momentum. 
2335                if(TMath::Abs( lPdgcodeCurrentPart ) == 3122 ) { lV0Mass = 1.115683; }
2336                if(TMath::Abs( lPdgcodeCurrentPart ) == 310 ) { lV0Mass = 0.497614; }
2337                if( lCurrentParticleForLambdaCheck->P() + 1e-10 != 0 ) decaylength = ( lV0Mass * decaylength ) / ( lCurrentParticleForLambdaCheck->P() + 1e-10 );
2338                if( lCurrentParticleForLambdaCheck->P() + 1e-10 == 0 ) decaylength = 1e+5;
2339             }
2340          }
2341          if( lPdgcodeCurrentPart == 3122) f3dHistPrimRawPtVsYVsDecayLengthLambda ->Fill( lPtCurrentPart, lRapCurrentPart , decaylength ); 
2342          if( lPdgcodeCurrentPart == -3122) f3dHistPrimRawPtVsYVsDecayLengthAntiLambda ->Fill( lPtCurrentPart, lRapCurrentPart , decaylength ); 
2343          if( lPdgcodeCurrentPart == 310) f3dHistPrimRawPtVsYVsDecayLengthK0Short ->Fill( lPtCurrentPart, lRapCurrentPart , decaylength ); 
2344       }
2345    }//End of loop on tracks
2346 //----- End Loop on Lambda, K0Short ------------------------------------------------------------
2347
2348
2349    f2dHistMultiplicityVsTrueBeforeTrigSel->Fill ( lMultiplicity , lNumberOfCharged );
2350
2351     fTreeVariableMultiplicityMC = lNumberOfCharged;
2352
2353    fHistGenVertexZBeforeTrigSel->Fill( (mcPrimaryVtx.At(2)) );
2354
2355    lPdgcodeCurrentPart = 0;
2356    lRapCurrentPart  = 0;
2357    lPtCurrentPart   = 0;
2358
2359 //------------------------------------------------
2360 // Physics Selection
2361 //------------------------------------------------
2362   
2363   UInt_t maskIsSelected = ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected();
2364   Bool_t isSelected = 0;
2365   Bool_t isSelectedExtra = kTRUE; //extra sel, default YES
2366   isSelected = (maskIsSelected & AliVEvent::kMB) == AliVEvent::kMB;
2367   
2368   //pA triggering: CINT7
2369   if( fkSwitchINT7 ) isSelected = (maskIsSelected & AliVEvent::kINT7) == AliVEvent::kINT7;
2370   
2371   if(fkSkipTrigger==kFALSE){
2372     //Extra selection applies if with/without SDD is to be dealth with
2373     if( fkFastOnly == "kFastOnly"){
2374       //If not kFastOnly, isSelectedExtra will be kFALSE; procedure will reject it
2375       isSelectedExtra = (maskIsSelected & AliVEvent::kFastOnly) == AliVEvent::kFastOnly;
2376     }
2377     if( fkFastOnly == "NotkFastOnly"){
2378       //If not kFastOnly, isSelectedExtra will be kTRUE; procedure will accept it
2379       isSelectedExtra = !( (maskIsSelected & AliVEvent::kFastOnly) == AliVEvent::kFastOnly );
2380     }
2381     
2382     //Standard Min-Bias Selection
2383     if ( ! isSelected ) {
2384       PostData(1, fListHistV0);
2385       PostData(2, fTree);
2386       return;
2387     }
2388     //Check if goes through extra selections
2389     //isSelectedExtra will be true in case -> fkFastOnly==""
2390     //isSelectedExtra will be true in case -> fkFastOnly=="kFastOnly"    && bit kFastOnly ON
2391     //isSelectedExtra will be true in case -> fkFastOnly=="NotkFastOnly" && bit kFastOnly OFF
2392     if ( !isSelectedExtra ) {
2393       PostData(1, fListHistV0);
2394       PostData(2, fTree);
2395       return;
2396     }
2397   }
2398   
2399   f2dHistMultiplicityVsTrueForTrigEvt->Fill ( lMultiplicity , lNumberOfCharged );
2400   fHistGenVertexZForTrigEvt->Fill( mcPrimaryVtx.At(2) );
2401   
2402 //------------------------------------------------
2403 // After Trigger Selection
2404 //------------------------------------------------
2405
2406    lNumberOfV0s          = lESDevent->GetNumberOfV0s();
2407   
2408    //Set variable for filling tree afterwards!
2409    fHistV0MultiplicityForTrigEvt->Fill(lNumberOfV0s);
2410    fHistMultiplicityForTrigEvt->Fill ( lMultiplicity );
2411   fHistMultiplicityV0AForTrigEvt       ->Fill( lMultiplicityV0A  );
2412   fHistMultiplicityZNAForTrigEvt       ->Fill( lMultiplicityZNA  );
2413   fHistMultiplicityTRKForTrigEvt       ->Fill( lMultiplicityTRK  );
2414   fHistMultiplicitySPDForTrigEvt       ->Fill( lMultiplicitySPD  );
2415
2416 //------------------------------------------------
2417 // Getting: Primary Vertex + MagField Info
2418 //------------------------------------------------
2419
2420    const AliESDVertex *lPrimaryTrackingESDVtx = lESDevent->GetPrimaryVertexTracks();
2421    // get the vtx stored in ESD found with tracks
2422    lPrimaryTrackingESDVtx->GetXYZ( lTrkgPrimaryVtxPos );
2423         
2424    const AliESDVertex *lPrimaryBestESDVtx = lESDevent->GetPrimaryVertex();      
2425    // get the best primary vertex available for the event
2426    // As done in AliCascadeVertexer, we keep the one which is the best one available.
2427    // between : Tracking vertex > SPD vertex > TPC vertex > default SPD vertex
2428    // This one will be used for next calculations (DCA essentially)
2429    lPrimaryBestESDVtx->GetXYZ( lBestPrimaryVtxPos );
2430
2431    Double_t lPrimaryVtxPosition[3];
2432    const AliVVertex *primaryVtx = lESDevent->GetPrimaryVertex();
2433    lPrimaryVtxPosition[0] = primaryVtx->GetX();
2434    lPrimaryVtxPosition[1] = primaryVtx->GetY();
2435    lPrimaryVtxPosition[2] = primaryVtx->GetZ();
2436    fHistPVx->Fill( lPrimaryVtxPosition[0] );
2437    fHistPVy->Fill( lPrimaryVtxPosition[1] );
2438    fHistPVz->Fill( lPrimaryVtxPosition[2] );
2439
2440    f2dHistMultiplicityVsVertexZForTrigEvt->Fill( lMultiplicity, lPrimaryVtxPosition[2] );
2441
2442   //------------------------------------------------
2443   // Primary Vertex Z position: SKIP
2444   //------------------------------------------------
2445   
2446   if(TMath::Abs(lBestPrimaryVtxPos[2]) > 10.0 && fkpAVertexSelection == kFALSE) {
2447     AliWarning("Pb / | Z position of Best Prim Vtx | > 10.0 cm ... return !");
2448     PostData(1, fListHistV0);
2449     PostData(2, fTree);
2450     return;
2451   }
2452   if(fkpAVertexSelection==kTRUE && fUtils->IsFirstEventInChunk(lESDevent)) {
2453     AliWarning("Pb / | This is the first event in the chunk!");
2454     PostData(1, fListHistV0);
2455     PostData(2, fTree);
2456     return;
2457   }
2458   if(fkpAVertexSelection==kTRUE && !fUtils->IsVertexSelected2013pA(lESDevent)) {
2459     AliWarning("Pb / | Vertex not selected by 2013 pA criteria!");
2460     PostData(1, fListHistV0);
2461     PostData(2, fTree);
2462     return;
2463   }
2464   
2465   f2dHistMultiplicityVsVertexZ->Fill( lMultiplicity, lPrimaryVtxPosition[2] );
2466   
2467   lMagneticField = lESDevent->GetMagneticField( );
2468   fHistV0MultiplicityForSelEvt ->Fill( lNumberOfV0s );
2469   fHistMultiplicity->Fill(lMultiplicity);
2470   fHistMultiplicityV0A->Fill(lMultiplicityV0A);
2471   fHistMultiplicityZNA->Fill(lMultiplicityZNA);
2472   fHistMultiplicityTRK->Fill(lMultiplicityTRK);
2473   fHistMultiplicitySPD->Fill(lMultiplicitySPD);
2474   f2dHistMultiplicityVsTrue->Fill ( lMultiplicity , lNumberOfCharged );
2475   fHistGenVertexZ->Fill( (mcPrimaryVtx.At(2)) );
2476   //------------------------------------------------
2477 // SKIP: Events with well-established PVtx
2478 //------------------------------------------------
2479         
2480    const AliESDVertex *lPrimaryTrackingESDVtxCheck = lESDevent->GetPrimaryVertexTracks();
2481    const AliESDVertex *lPrimarySPDVtx = lESDevent->GetPrimaryVertexSPD();
2482    if (!lPrimarySPDVtx->GetStatus() && !lPrimaryTrackingESDVtxCheck->GetStatus() && fkpAVertexSelection == kFALSE){
2483       AliWarning("Pb / No SPD prim. vertex nor prim. Tracking vertex ... return !");
2484       PostData(1, fListHistV0);
2485       PostData(2, fTree);
2486       return;
2487    }
2488
2489    f2dHistMultiplicityVsVertexZNoTPCOnly->Fill( lMultiplicity, lPrimaryVtxPosition[2] );
2490    fHistV0MultiplicityForSelEvtNoTPCOnly ->Fill( lNumberOfV0s );
2491    fHistMultiplicityNoTPCOnly->Fill(lMultiplicity);
2492    fHistMultiplicityV0ANoTPCOnly->Fill(lMultiplicityV0A);
2493    fHistMultiplicityZNANoTPCOnly->Fill(lMultiplicityZNA);
2494    fHistMultiplicityTRKNoTPCOnly->Fill(lMultiplicityTRK);
2495    fHistMultiplicitySPDNoTPCOnly->Fill(lMultiplicitySPD);
2496    f2dHistMultiplicityVsTrueNoTPCOnly->Fill ( lMultiplicity , lNumberOfCharged );
2497    fHistGenVertexZNoTPCOnly->Fill( (mcPrimaryVtx.At(2)) );
2498 //------------------------------------------------
2499 // Pileup Rejection Studies
2500 //------------------------------------------------
2501
2502    // FIXME : quality selection regarding pile-up rejection 
2503    if(lESDevent->IsPileupFromSPD() && !fkIsNuclear && fkRejectPileup ){// minContributors=3, minZdist=0.8, nSigmaZdist=3., nSigmaDiamXY=2., nSigmaDiamZ=5.  -> see http://alisoft.cern.ch/viewvc/trunk/STEER/AliESDEvent.h?root=AliRoot&r1=41914&r2=42199&pathrev=42199
2504       AliWarning("Pb / This is tagged as Pileup from SPD... return !");
2505       PostData(1, fListHistV0);
2506       PostData(2, fTree);
2507       return;
2508    }
2509    f2dHistMultiplicityVsVertexZNoTPCOnlyNoPileup->Fill( lMultiplicity, lPrimaryVtxPosition[2] );
2510    fHistV0MultiplicityForSelEvtNoTPCOnlyNoPileup ->Fill( lNumberOfV0s );
2511  
2512    fHistMultiplicityNoTPCOnlyNoPileup->Fill(lMultiplicity);
2513    fHistMultiplicityV0ANoTPCOnlyNoPileup->Fill(lMultiplicityV0A);
2514    fHistMultiplicityZNANoTPCOnlyNoPileup->Fill(lMultiplicityZNA);
2515    fHistMultiplicityTRKNoTPCOnlyNoPileup->Fill(lMultiplicityTRK);
2516    fHistMultiplicitySPDNoTPCOnlyNoPileup->Fill(lMultiplicitySPD);
2517   
2518    f2dHistMultiplicityVsTrueNoTPCOnlyNoPileup->Fill ( lMultiplicity , lNumberOfCharged );
2519    fHistGenVertexZNoTPCOnlyNoPileup->Fill( (mcPrimaryVtx.At(2)) );
2520    //Do control histograms without the IsFromVertexerZ events, but consider them in analysis...
2521    if( ! (lESDevent->GetPrimaryVertex()->IsFromVertexerZ() )     ){ 
2522       fHistPVxAnalysis->Fill( lPrimaryVtxPosition[0] );
2523       fHistPVyAnalysis->Fill( lPrimaryVtxPosition[1] );
2524       fHistPVzAnalysis->Fill( lPrimaryVtxPosition[2] );
2525       if ( lHasHighPtLambda == kTRUE ){ 
2526          fHistPVxAnalysisHasHighPtLambda->Fill( lPrimaryVtxPosition[0] );
2527          fHistPVyAnalysisHasHighPtLambda->Fill( lPrimaryVtxPosition[1] );
2528          fHistPVzAnalysisHasHighPtLambda->Fill( lPrimaryVtxPosition[2] );
2529       }
2530    }
2531
2532   fTreeVariableVertexZ = lPrimaryVtxPosition[2];
2533
2534   fTreeVariablePVx = lPrimaryVtxPosition[0];
2535   fTreeVariablePVy = lPrimaryVtxPosition[1];
2536   fTreeVariablePVz = lPrimaryVtxPosition[2];
2537
2538   fTreeVariableMCPVx = (mcPrimaryVtx.At(0));
2539   fTreeVariableMCPVy = (mcPrimaryVtx.At(1));
2540   fTreeVariableMCPVz = (mcPrimaryVtx.At(2));
2541
2542 //------------------------------------------------
2543 // stack loop starts here
2544 //------------------------------------------------
2545
2546 //---> Loop over ALL PARTICLES
2547  
2548    for (Int_t iMc = 0; iMc < (lMCstack->GetNtrack()); iMc++) {  
2549       TParticle *p0 = lMCstack->Particle(iMc); 
2550       if (!p0) {
2551          //Printf("ERROR: particle with label %d not found in lMCstack (mc loop)", iMc);
2552          continue;
2553       }
2554       lPdgcodeCurrentPart = p0->GetPdgCode();
2555
2556       // Keep only K0s, Lambda and AntiLambda:
2557       if ( (lPdgcodeCurrentPart != 310 ) && (lPdgcodeCurrentPart != 3122 ) && (lPdgcodeCurrentPart != -3122 ) ) continue;
2558         
2559       lRapCurrentPart   = MyRapidity(p0->Energy(),p0->Pz());
2560       lPtCurrentPart    = p0->Pt();
2561
2562         //Use Physical Primaries only for filling PrimRaw Histograms!
2563       if ( lMCstack->IsPhysicalPrimary(iMc)!=kTRUE ) continue;
2564
2565       if( lPdgcodeCurrentPart == 3122 ){
2566         //NRaw
2567         f3dHistPrimAnalysisPtVsYVsMultLambda->Fill(lPtCurrentPart, lRapCurrentPart, lMultiplicity);
2568         f3dHistPrimAnalysisPtVsYCMSVsMultLambda->Fill(lPtCurrentPart, lRapCurrentPart+fpArapidityShift, lMultiplicity);
2569         //NTrue
2570         f3dHistPrimAnalysisPtVsYVsMultMCLambda->Fill(lPtCurrentPart, lRapCurrentPart, lNumberOfCharged);
2571         f3dHistPrimAnalysisPtVsYCMSVsMultMCLambda->Fill(lPtCurrentPart, lRapCurrentPart+fpArapidityShift, lNumberOfCharged);
2572         //Other stuff
2573         f3dHistPrimAnalysisPtVsYVsMultV0ALambda->Fill(lPtCurrentPart, lRapCurrentPart, lMultiplicityV0A);
2574         f3dHistPrimAnalysisPtVsYCMSVsMultV0ALambda->Fill(lPtCurrentPart, lRapCurrentPart+fpArapidityShift, lMultiplicityV0A);
2575         f3dHistPrimAnalysisPtVsYVsMultZNALambda->Fill(lPtCurrentPart, lRapCurrentPart, lMultiplicityZNA);
2576         f3dHistPrimAnalysisPtVsYCMSVsMultZNALambda->Fill(lPtCurrentPart, lRapCurrentPart+fpArapidityShift, lMultiplicityZNA);
2577         f3dHistPrimAnalysisPtVsYVsMultTRKLambda->Fill(lPtCurrentPart, lRapCurrentPart, lMultiplicityTRK);
2578         f3dHistPrimAnalysisPtVsYCMSVsMultTRKLambda->Fill(lPtCurrentPart, lRapCurrentPart+fpArapidityShift, lMultiplicityTRK);
2579         f3dHistPrimAnalysisPtVsYVsMultSPDLambda->Fill(lPtCurrentPart, lRapCurrentPart, lMultiplicitySPD);
2580         f3dHistPrimAnalysisPtVsYCMSVsMultSPDLambda->Fill(lPtCurrentPart, lRapCurrentPart+fpArapidityShift, lMultiplicitySPD);
2581       }
2582       if( lPdgcodeCurrentPart == -3122 ){
2583         //NRaw
2584         f3dHistPrimAnalysisPtVsYVsMultAntiLambda->Fill(lPtCurrentPart, lRapCurrentPart, lMultiplicity);
2585         f3dHistPrimAnalysisPtVsYCMSVsMultAntiLambda->Fill(lPtCurrentPart, lRapCurrentPart+fpArapidityShift, lMultiplicity);
2586         //NTrue
2587         f3dHistPrimAnalysisPtVsYVsMultMCAntiLambda->Fill(lPtCurrentPart, lRapCurrentPart, lNumberOfCharged);
2588         f3dHistPrimAnalysisPtVsYCMSVsMultMCAntiLambda->Fill(lPtCurrentPart, lRapCurrentPart+fpArapidityShift, lNumberOfCharged);
2589         //Other stuff
2590         f3dHistPrimAnalysisPtVsYVsMultV0AAntiLambda->Fill(lPtCurrentPart, lRapCurrentPart, lMultiplicityV0A);
2591         f3dHistPrimAnalysisPtVsYCMSVsMultV0AAntiLambda->Fill(lPtCurrentPart, lRapCurrentPart+fpArapidityShift, lMultiplicityV0A);
2592         f3dHistPrimAnalysisPtVsYVsMultZNAAntiLambda->Fill(lPtCurrentPart, lRapCurrentPart, lMultiplicityZNA);
2593         f3dHistPrimAnalysisPtVsYCMSVsMultZNAAntiLambda->Fill(lPtCurrentPart, lRapCurrentPart+fpArapidityShift, lMultiplicityZNA);
2594         f3dHistPrimAnalysisPtVsYVsMultTRKAntiLambda->Fill(lPtCurrentPart, lRapCurrentPart, lMultiplicityTRK);
2595         f3dHistPrimAnalysisPtVsYCMSVsMultTRKAntiLambda->Fill(lPtCurrentPart, lRapCurrentPart+fpArapidityShift, lMultiplicityTRK);
2596         f3dHistPrimAnalysisPtVsYVsMultSPDAntiLambda->Fill(lPtCurrentPart, lRapCurrentPart, lMultiplicitySPD);
2597         f3dHistPrimAnalysisPtVsYCMSVsMultSPDAntiLambda->Fill(lPtCurrentPart, lRapCurrentPart+fpArapidityShift, lMultiplicitySPD);
2598         
2599       }
2600       if( lPdgcodeCurrentPart == 310 ){
2601         //NRaw
2602         f3dHistPrimAnalysisPtVsYVsMultK0Short->Fill(lPtCurrentPart, lRapCurrentPart, lMultiplicity);
2603         f3dHistPrimAnalysisPtVsYCMSVsMultK0Short->Fill(lPtCurrentPart, lRapCurrentPart+fpArapidityShift, lMultiplicity);
2604         //NTrue
2605         f3dHistPrimAnalysisPtVsYVsMultMCK0Short->Fill(lPtCurrentPart, lRapCurrentPart, lNumberOfCharged);
2606         f3dHistPrimAnalysisPtVsYCMSVsMultMCK0Short->Fill(lPtCurrentPart, lRapCurrentPart+fpArapidityShift, lNumberOfCharged);
2607         //Other Stuff
2608         f3dHistPrimAnalysisPtVsYVsMultV0AK0Short->Fill(lPtCurrentPart, lRapCurrentPart, lMultiplicityV0A);
2609         f3dHistPrimAnalysisPtVsYCMSVsMultV0AK0Short->Fill(lPtCurrentPart, lRapCurrentPart+fpArapidityShift, lMultiplicityV0A);
2610         f3dHistPrimAnalysisPtVsYVsMultZNAK0Short->Fill(lPtCurrentPart, lRapCurrentPart, lMultiplicityZNA);
2611         f3dHistPrimAnalysisPtVsYCMSVsMultZNAK0Short->Fill(lPtCurrentPart, lRapCurrentPart+fpArapidityShift, lMultiplicityZNA);
2612         f3dHistPrimAnalysisPtVsYVsMultTRKK0Short->Fill(lPtCurrentPart, lRapCurrentPart, lMultiplicityTRK);
2613         f3dHistPrimAnalysisPtVsYCMSVsMultTRKK0Short->Fill(lPtCurrentPart, lRapCurrentPart+fpArapidityShift, lMultiplicityTRK);
2614         f3dHistPrimAnalysisPtVsYVsMultSPDK0Short->Fill(lPtCurrentPart, lRapCurrentPart, lMultiplicitySPD);
2615         f3dHistPrimAnalysisPtVsYCMSVsMultSPDK0Short->Fill(lPtCurrentPart, lRapCurrentPart+fpArapidityShift, lMultiplicitySPD);
2616       }
2617    }
2618
2619 //----- Loop on primary Xi, Omega --------------------------------------------------------------
2620    for (Int_t iCurrentLabelStack = 0; iCurrentLabelStack < lNbMCPrimary; iCurrentLabelStack++) 
2621    {// This is the begining of the loop on primaries
2622       
2623       TParticle* lCurrentParticlePrimary = 0x0; 
2624       lCurrentParticlePrimary = lMCstack->Particle( iCurrentLabelStack );
2625       if(!lCurrentParticlePrimary){
2626          Printf("Cascade loop %d - MC TParticle pointer to current stack particle = 0x0 ! Skip ...\n", iCurrentLabelStack );
2627          continue;
2628       }
2629       if ( TMath::Abs(lCurrentParticlePrimary->GetPdgCode()) == 3312 || TMath::Abs(lCurrentParticlePrimary->GetPdgCode()) == 3334 ) { 
2630          Double_t lRapXiMCPrimary = -100;
2631          if( (lCurrentParticlePrimary->Energy() - lCurrentParticlePrimary->Pz() +1.e-13) != 0 ) { 
2632            if ( (lCurrentParticlePrimary->Energy() + lCurrentParticlePrimary->Pz()) / (lCurrentParticlePrimary->Energy() - lCurrentParticlePrimary->Pz() +1.e-13) !=0 ){
2633              lRapXiMCPrimary = 0.5*TMath::Log( (lCurrentParticlePrimary->Energy() + lCurrentParticlePrimary->Pz()) / (lCurrentParticlePrimary->Energy() - lCurrentParticlePrimary->Pz() +1.e-13) );
2634            }
2635          }
2636
2637          //=================================================================================
2638          // Xi Histograms
2639          if( lCurrentParticlePrimary->GetPdgCode() == 3312 ){ 
2640             lPtCurrentPart    = lCurrentParticlePrimary->Pt();
2641             f3dHistGenSelectedPtVsYVsMultXiMinus->Fill(lPtCurrentPart, lRapXiMCPrimary, lMultiplicity);
2642             f3dHistGenSelectedPtVsYCMSVsMultXiMinus->Fill(lPtCurrentPart, lRapXiMCPrimary+fpArapidityShift, lMultiplicity);
2643            f3dHistGenSelectedPtVsYVsMultV0AXiMinus->Fill(lPtCurrentPart, lRapXiMCPrimary, lMultiplicityV0A);
2644            f3dHistGenSelectedPtVsYCMSVsMultV0AXiMinus->Fill(lPtCurrentPart, lRapXiMCPrimary+fpArapidityShift, lMultiplicityV0A);
2645            f3dHistGenSelectedPtVsYVsMultZNAXiMinus->Fill(lPtCurrentPart, lRapXiMCPrimary, lMultiplicityZNA);
2646            f3dHistGenSelectedPtVsYCMSVsMultZNAXiMinus->Fill(lPtCurrentPart, lRapXiMCPrimary+fpArapidityShift, lMultiplicityZNA);
2647            f3dHistGenSelectedPtVsYVsMultTRKXiMinus->Fill(lPtCurrentPart, lRapXiMCPrimary, lMultiplicityTRK);
2648            f3dHistGenSelectedPtVsYCMSVsMultTRKXiMinus->Fill(lPtCurrentPart, lRapXiMCPrimary+fpArapidityShift, lMultiplicityTRK);
2649            f3dHistGenSelectedPtVsYVsMultSPDXiMinus->Fill(lPtCurrentPart, lRapXiMCPrimary, lMultiplicitySPD);
2650            f3dHistGenSelectedPtVsYCMSVsMultSPDXiMinus->Fill(lPtCurrentPart, lRapXiMCPrimary+fpArapidityShift, lMultiplicitySPD);
2651          }
2652          if( lCurrentParticlePrimary->GetPdgCode() == -3312 ){
2653             lPtCurrentPart    = lCurrentParticlePrimary->Pt();
2654             f3dHistGenSelectedPtVsYVsMultXiPlus->Fill(lPtCurrentPart, lRapXiMCPrimary, lMultiplicity);
2655             f3dHistGenSelectedPtVsYCMSVsMultXiPlus->Fill(lPtCurrentPart, lRapXiMCPrimary+fpArapidityShift, lMultiplicity);
2656            f3dHistGenSelectedPtVsYVsMultV0AXiPlus->Fill(lPtCurrentPart, lRapXiMCPrimary, lMultiplicityV0A);
2657            f3dHistGenSelectedPtVsYCMSVsMultV0AXiPlus->Fill(lPtCurrentPart, lRapXiMCPrimary+fpArapidityShift, lMultiplicityV0A);
2658            f3dHistGenSelectedPtVsYVsMultZNAXiPlus->Fill(lPtCurrentPart, lRapXiMCPrimary, lMultiplicityZNA);
2659            f3dHistGenSelectedPtVsYCMSVsMultZNAXiPlus->Fill(lPtCurrentPart, lRapXiMCPrimary+fpArapidityShift, lMultiplicityZNA);
2660            f3dHistGenSelectedPtVsYVsMultTRKXiPlus->Fill(lPtCurrentPart, lRapXiMCPrimary, lMultiplicityTRK);
2661            f3dHistGenSelectedPtVsYCMSVsMultTRKXiPlus->Fill(lPtCurrentPart, lRapXiMCPrimary+fpArapidityShift, lMultiplicityTRK);
2662            f3dHistGenSelectedPtVsYVsMultSPDXiPlus->Fill(lPtCurrentPart, lRapXiMCPrimary, lMultiplicitySPD);
2663            f3dHistGenSelectedPtVsYCMSVsMultSPDXiPlus->Fill(lPtCurrentPart, lRapXiMCPrimary+fpArapidityShift, lMultiplicitySPD);
2664          }
2665       }
2666    }
2667 //----- End Loop on primary Xi, Omega ----------------------------------------------------------
2668
2669 //------------------------------------------------
2670 // MAIN LAMBDA LOOP STARTS HERE
2671 //------------------------------------------------
2672
2673    //Variable definition
2674    Int_t    lOnFlyStatus = 0;
2675    Double_t lChi2V0 = 0;
2676    Double_t lDcaV0Daughters = 0, lDcaV0ToPrimVertex = 0;
2677    Double_t lDcaPosToPrimVertex = 0, lDcaNegToPrimVertex = 0;
2678    Double_t lV0CosineOfPointingAngle = 0;
2679    Double_t lV0Radius = 0, lPt = 0;
2680    Double_t lRapK0Short = 0, lRapLambda = 0;
2681    Double_t lInvMassK0s = 0, lInvMassLambda = 0, lInvMassAntiLambda = 0;
2682    Double_t lAlphaV0 = 0, lPtArmV0 = 0;
2683    Double_t fMinV0Pt = 0; 
2684    Double_t fMaxV0Pt = 100; 
2685
2686    Int_t nv0s = 0;
2687    nv0s = lESDevent->GetNumberOfV0s();
2688    
2689    for (Int_t iV0 = 0; iV0 < nv0s; iV0++) 
2690         {// This is the begining of the V0 loop
2691       AliESDv0 *v0 = ((AliESDEvent*)lESDevent)->GetV0(iV0);
2692       if (!v0) continue;
2693
2694       //---> Fix On-the-Fly candidates
2695       if( v0->GetParamN()->Charge() > 0 && v0->GetParamP()->Charge() < 0 ){
2696         fHistSwappedV0Counter -> Fill( 1 );
2697       }else{
2698         fHistSwappedV0Counter -> Fill( 0 ); 
2699       }
2700       if ( fkUseOnTheFly ) CheckChargeV0(v0); 
2701
2702
2703       Double_t tV0mom[3];
2704       v0->GetPxPyPz( tV0mom[0],tV0mom[1],tV0mom[2] ); 
2705       Double_t lV0TotalMomentum = TMath::Sqrt(
2706          tV0mom[0]*tV0mom[0]+tV0mom[1]*tV0mom[1]+tV0mom[2]*tV0mom[2] );
2707
2708       Double_t tDecayVertexV0[3]; v0->GetXYZ(tDecayVertexV0[0],tDecayVertexV0[1],tDecayVertexV0[2]); 
2709       lV0Radius = TMath::Sqrt(tDecayVertexV0[0]*tDecayVertexV0[0]+tDecayVertexV0[1]*tDecayVertexV0[1]);
2710       lPt = v0->Pt();
2711       lRapK0Short = v0->RapK0Short();
2712       lRapLambda  = v0->RapLambda();
2713
2714       //Set Variables for later filling
2715       fTreeVariableV0x = tDecayVertexV0[0];
2716       fTreeVariableV0y = tDecayVertexV0[1];
2717       fTreeVariableV0z = tDecayVertexV0[2];
2718
2719       //Set Variables for later filling
2720       fTreeVariableV0Px = tV0mom[0];
2721       fTreeVariableV0Py = tV0mom[1];
2722       fTreeVariableV0Pz = tV0mom[2];
2723
2724       if ((lPt<fMinV0Pt)||(fMaxV0Pt<lPt)) continue;
2725
2726       UInt_t lKeyPos = (UInt_t)TMath::Abs(v0->GetPindex());
2727       UInt_t lKeyNeg = (UInt_t)TMath::Abs(v0->GetNindex());
2728
2729       Double_t lMomPos[3]; v0->GetPPxPyPz(lMomPos[0],lMomPos[1],lMomPos[2]);
2730       Double_t lMomNeg[3]; v0->GetNPxPyPz(lMomNeg[0],lMomNeg[1],lMomNeg[2]);
2731
2732       AliESDtrack *pTrack=((AliESDEvent*)lESDevent)->GetTrack(lKeyPos);
2733       AliESDtrack *nTrack=((AliESDEvent*)lESDevent)->GetTrack(lKeyNeg);
2734       if (!pTrack || !nTrack) {
2735          Printf("ERROR: Could not retreive one of the daughter track");
2736          continue;
2737       }
2738
2739       fTreeVariableNegEta = nTrack->Eta();
2740       fTreeVariablePosEta = pTrack->Eta();
2741
2742       // Filter like-sign V0 (next: add counter and distribution)
2743       if ( pTrack->GetSign() == nTrack->GetSign()){
2744          continue;
2745       } 
2746
2747       //________________________________________________________________________
2748       // Track quality cuts 
2749       Float_t lPosTrackCrossedRows = pTrack->GetTPCClusterInfo(2,1);
2750       Float_t lNegTrackCrossedRows = nTrack->GetTPCClusterInfo(2,1);
2751       fTreeVariableLeastNbrCrossedRows = (Int_t) lPosTrackCrossedRows;
2752       if( lNegTrackCrossedRows < fTreeVariableLeastNbrCrossedRows )
2753          fTreeVariableLeastNbrCrossedRows = (Int_t) lNegTrackCrossedRows;
2754
2755       // TPC refit condition (done during reconstruction for Offline but not for On-the-fly)
2756       if( !(pTrack->GetStatus() & AliESDtrack::kTPCrefit)) continue;      
2757       if( !(nTrack->GetStatus() & AliESDtrack::kTPCrefit)) continue;
2758
2759       //Get status flags
2760       fTreeVariablePosTrackStatus = pTrack->GetStatus();
2761       fTreeVariableNegTrackStatus = nTrack->GetStatus();
2762     
2763       if ( ( ( ( pTrack->GetTPCClusterInfo(2,1) ) < 70 ) || ( ( nTrack->GetTPCClusterInfo(2,1) ) < 70 ) )&&(fkTakeAllTracks==kFALSE) ) continue;
2764         
2765       //GetKinkIndex condition
2766       if( pTrack->GetKinkIndex(0)>0 || nTrack->GetKinkIndex(0)>0 ) continue;
2767
2768       //Findable clusters > 0 condition
2769       if( pTrack->GetTPCNclsF()<=0 || nTrack->GetTPCNclsF()<=0 ) continue;
2770
2771       //Compute ratio Crossed Rows / Findable clusters
2772       //Note: above test avoids division by zero! 
2773       Float_t lPosTrackCrossedRowsOverFindable = -1;
2774       Float_t lNegTrackCrossedRowsOverFindable = -1;
2775       if ( ((double)(pTrack->GetTPCNclsF()) ) != 0 ) lPosTrackCrossedRowsOverFindable = lPosTrackCrossedRows / ((double)(pTrack->GetTPCNclsF())); 
2776       if ( ((double)(nTrack->GetTPCNclsF()) ) != 0 ) lNegTrackCrossedRowsOverFindable = lNegTrackCrossedRows / ((double)(nTrack->GetTPCNclsF())); 
2777
2778       fTreeVariableLeastRatioCrossedRowsOverFindable = lPosTrackCrossedRowsOverFindable;
2779       if( lNegTrackCrossedRowsOverFindable < fTreeVariableLeastRatioCrossedRowsOverFindable )
2780          fTreeVariableLeastRatioCrossedRowsOverFindable = lNegTrackCrossedRowsOverFindable;
2781
2782       //Lowest Cut Level for Ratio Crossed Rows / Findable = 0.8, set here
2783       if ( (fTreeVariableLeastRatioCrossedRowsOverFindable < 0.8)&&(fkTakeAllTracks==kFALSE) ) continue;
2784
2785       //End track Quality Cuts
2786       //________________________________________________________________________
2787
2788       lDcaPosToPrimVertex = TMath::Abs(pTrack->GetD(lPrimaryVtxPosition[0],
2789                                                         lPrimaryVtxPosition[1],
2790                                                         lMagneticField) );
2791
2792       lDcaNegToPrimVertex = TMath::Abs(nTrack->GetD(lPrimaryVtxPosition[0],
2793                                                         lPrimaryVtxPosition[1],
2794                                                         lMagneticField) );
2795
2796       lOnFlyStatus = v0->GetOnFlyStatus();
2797       lChi2V0 = v0->GetChi2V0();
2798       lDcaV0Daughters = v0->GetDcaV0Daughters();
2799       lDcaV0ToPrimVertex = v0->GetD(lPrimaryVtxPosition[0],lPrimaryVtxPosition[1],lPrimaryVtxPosition[2]);
2800       lV0CosineOfPointingAngle = v0->GetV0CosineOfPointingAngle(lPrimaryVtxPosition[0],lPrimaryVtxPosition[1],lPrimaryVtxPosition[2]);
2801       fTreeVariableV0CosineOfPointingAngle=lV0CosineOfPointingAngle;
2802
2803       // Getting invariant mass infos directly from ESD
2804       v0->ChangeMassHypothesis(310);
2805       lInvMassK0s = v0->GetEffMass();
2806       v0->ChangeMassHypothesis(3122);
2807       lInvMassLambda = v0->GetEffMass();
2808       v0->ChangeMassHypothesis(-3122);
2809       lInvMassAntiLambda = v0->GetEffMass();
2810       lAlphaV0 = v0->AlphaV0();
2811       lPtArmV0 = v0->PtArmV0();
2812
2813       //fTreeVariableOnFlyStatus = lOnFlyStatus;
2814       //fHistV0OnFlyStatus->Fill(lOnFlyStatus);
2815
2816 //===============================================
2817 // Monte Carlo Association starts here
2818 //===============================================
2819
2820       //---> Set Everything to "I don't know" before starting
2821
2822       fTreeVariablePIDPositive = 0;
2823       fTreeVariablePIDNegative = 0;
2824
2825       fTreeVariableIndexStatus = 0;
2826       fTreeVariableIndexStatusMother = 0;
2827
2828       fTreeVariablePtMother = -1;
2829       fTreeVariablePtMC = -1;
2830       fTreeVariableRapMC = -100;
2831
2832       fTreeVariablePID = -1; 
2833       fTreeVariablePIDMother = -1;
2834
2835       fTreeVariablePrimaryStatus = 0; 
2836       fTreeVariablePrimaryStatusMother = 0; 
2837       fTreeVariableV0CreationRadius = -1;
2838     
2839       fTreeVariableNegPhysicalStatus = 0;
2840       fTreeVariablePosPhysicalStatus = 0;
2841     
2842       Int_t lblPosV0Dghter = (Int_t) TMath::Abs( pTrack->GetLabel() );
2843       Int_t lblNegV0Dghter = (Int_t) TMath::Abs( nTrack->GetLabel() );
2844                 
2845       TParticle* mcPosV0Dghter = lMCstack->Particle( lblPosV0Dghter );
2846       TParticle* mcNegV0Dghter = lMCstack->Particle( lblNegV0Dghter );
2847             
2848       fTreeVariablePosTransvMomentumMC = mcPosV0Dghter->Pt();
2849       fTreeVariableNegTransvMomentumMC = mcNegV0Dghter->Pt();
2850
2851       Int_t lPIDPositive = mcPosV0Dghter -> GetPdgCode();
2852       Int_t lPIDNegative = mcNegV0Dghter -> GetPdgCode();
2853
2854       fTreeVariablePIDPositive = lPIDPositive;
2855       fTreeVariablePIDNegative = lPIDNegative;
2856
2857       Int_t lblMotherPosV0Dghter = mcPosV0Dghter->GetFirstMother() ; 
2858       Int_t lblMotherNegV0Dghter = mcNegV0Dghter->GetFirstMother();
2859     
2860       if( lMCstack->IsPhysicalPrimary       (lblNegV0Dghter) ) fTreeVariableNegPhysicalStatus = 1; //Is Primary!
2861       if( lMCstack->IsSecondaryFromWeakDecay(lblNegV0Dghter) ) fTreeVariableNegPhysicalStatus = 2; //Weak Decay!
2862       if( lMCstack->IsSecondaryFromMaterial (lblNegV0Dghter) ) fTreeVariableNegPhysicalStatus = 3; //Material Int!
2863
2864       if( lMCstack->IsPhysicalPrimary       (lblPosV0Dghter) ) fTreeVariablePosPhysicalStatus = 1; //Is Primary!
2865       if( lMCstack->IsSecondaryFromWeakDecay(lblPosV0Dghter) ) fTreeVariablePosPhysicalStatus = 2; //Weak Decay!
2866       if( lMCstack->IsSecondaryFromMaterial (lblPosV0Dghter) ) fTreeVariablePosPhysicalStatus = 3; //Material Int!
2867     
2868       if( lblMotherPosV0Dghter == lblMotherNegV0Dghter && lblMotherPosV0Dghter > -1 ){
2869          //either label is fine, they're equal at this stage
2870          TParticle* pThisV0 = lMCstack->Particle( lblMotherPosV0Dghter ); 
2871          //Set tree variables
2872          fTreeVariablePID   = pThisV0->GetPdgCode(); //PDG Code
2873          fTreeVariablePtMC  = pThisV0->Pt(); //Perfect Pt
2874
2875           fTreeVariableIsNonInjected = lMCevent->IsFromBGEvent(lblMotherPosV0Dghter); //Is it? 
2876           if (!fTreeVariableIsNonInjected){
2877             if (!(pThisV0->GetFirstMother()<0)) 
2878               {fTreeVariableIsNonInjected = kTRUE;} // because there are primaries (ALICE definition) not produced in the collision
2879           }
2880
2881          //Set Variables for later filling
2882          //Be careful: Vx, Vy, Vz: Creation vertex. So decay position is the 
2883          //Creation vertex of any one of the daughters!
2884          fTreeVariableMCV0x = mcPosV0Dghter->Vx();
2885          fTreeVariableMCV0y = mcPosV0Dghter->Vy();
2886          fTreeVariableMCV0z = mcPosV0Dghter->Vz();
2887
2888          //Set Variables for later filling
2889          fTreeVariableMCV0Px = pThisV0->Px();
2890          fTreeVariableMCV0Py = pThisV0->Py();
2891          fTreeVariableMCV0Pz = pThisV0->Pz();
2892
2893          //Only Interested if it's a Lambda, AntiLambda or K0s 
2894          //Avoid the Junction Bug! PYTHIA has particles with Px=Py=Pz=E=0 occasionally, 
2895          //having particle code 88 (unrecognized by PDG), for documentation purposes.
2896          //Even ROOT's TParticle::Y() is not prepared to deal with that exception!
2897          //Note that TParticle::Pt() is immune (that would just return 0)...
2898          //Though granted that that should be extremely rare in this precise condition...
2899          if( TMath::Abs(fTreeVariablePID) == 3122 || fTreeVariablePID==310 ){
2900             fTreeVariableRapMC = pThisV0->Y(); //Perfect Y
2901          }
2902          fTreeVariableV0CreationRadius = TMath::Sqrt(
2903           TMath::Power(  ( (mcPrimaryVtx.At(0)) - (pThisV0->Vx()) ) , 2) + 
2904           TMath::Power(  ( (mcPrimaryVtx.At(1)) - (pThisV0->Vy()) ) , 2) + 
2905           TMath::Power(  ( (mcPrimaryVtx.At(2)) - (pThisV0->Vz()) ) , 2) 
2906          );
2907          if( lblMotherPosV0Dghter  < lNbMCPrimary ) fTreeVariableIndexStatus = 1; //looks primary
2908          if( lblMotherPosV0Dghter >= lNbMCPrimary ) fTreeVariableIndexStatus = 2; //looks secondary
2909          if( lMCstack->IsPhysicalPrimary       (lblMotherPosV0Dghter) ) fTreeVariablePrimaryStatus = 1; //Is Primary!
2910          if( lMCstack->IsSecondaryFromWeakDecay(lblMotherPosV0Dghter) ) fTreeVariablePrimaryStatus = 2; //Weak Decay!
2911          if( lMCstack->IsSecondaryFromMaterial (lblMotherPosV0Dghter) ) fTreeVariablePrimaryStatus = 3; //Material Int!
2912          
2913          //Now we try to acquire the V0 parent particle, if possible
2914          Int_t lblThisV0Parent = pThisV0->GetFirstMother();
2915          if ( lblThisV0Parent > -1 ){ //if it has a parent, get it and store specs
2916             TParticle* pThisV0Parent = lMCstack->Particle( lblThisV0Parent );
2917             fTreeVariablePIDMother   = pThisV0Parent->GetPdgCode(); //V0 Mother PDG
2918             fTreeVariablePtMother    = pThisV0Parent->Pt();         //V0 Mother Pt
2919             //Primary Status for the V0 Mother particle 
2920             if( lblThisV0Parent  < lNbMCPrimary ) fTreeVariableIndexStatusMother = 1; //looks primary
2921             if( lblThisV0Parent >= lNbMCPrimary ) fTreeVariableIndexStatusMother = 2; //looks secondary
2922             if( lMCstack->IsPhysicalPrimary       (lblThisV0Parent) ) fTreeVariablePrimaryStatusMother = 1; //Is Primary!
2923             if( lMCstack->IsSecondaryFromWeakDecay(lblThisV0Parent) ) fTreeVariablePrimaryStatusMother = 2; //Weak Decay!
2924             if( lMCstack->IsSecondaryFromMaterial (lblThisV0Parent) ) fTreeVariablePrimaryStatusMother = 3; //Material Int!
2925          }
2926       }
2927
2928       fTreeVariablePt = v0->Pt();
2929       fTreeVariableChi2V0 = lChi2V0; 
2930       fTreeVariableDcaV0ToPrimVertex = lDcaV0ToPrimVertex;
2931       fTreeVariableDcaV0Daughters = lDcaV0Daughters;
2932       fTreeVariableV0CosineOfPointingAngle = lV0CosineOfPointingAngle; 
2933       fTreeVariableV0Radius = lV0Radius;
2934       fTreeVariableDcaPosToPrimVertex = lDcaPosToPrimVertex;
2935       fTreeVariableDcaNegToPrimVertex = lDcaNegToPrimVertex;
2936       fTreeVariableInvMassK0s = lInvMassK0s;
2937       fTreeVariableInvMassLambda = lInvMassLambda;
2938       fTreeVariableInvMassAntiLambda = lInvMassAntiLambda;
2939       fTreeVariableRapK0Short = lRapK0Short;
2940
2941       fTreeVariableRapLambda = lRapLambda;
2942       fTreeVariableAlphaV0 = lAlphaV0;
2943       fTreeVariablePtArmV0 = lPtArmV0;
2944
2945     if(   fkDoNotCallTPCdEdx == kFALSE ){
2946       //Official means of acquiring N-sigmas
2947       fTreeVariableNSigmasPosProton = fPIDResponse->NumberOfSigmasTPC( pTrack, AliPID::kProton );
2948       fTreeVariableNSigmasPosPion   = fPIDResponse->NumberOfSigmasTPC( pTrack, AliPID::kPion );
2949       fTreeVariableNSigmasNegProton = fPIDResponse->NumberOfSigmasTPC( nTrack, AliPID::kProton );
2950       fTreeVariableNSigmasNegPion   = fPIDResponse->NumberOfSigmasTPC( nTrack, AliPID::kPion );
2951     }else{
2952       fTreeVariableNSigmasPosProton = 0;
2953       fTreeVariableNSigmasPosPion   = 0;
2954       fTreeVariableNSigmasNegProton = 0;
2955       fTreeVariableNSigmasNegPion   = 0;
2956     }
2957     
2958 //tDecayVertexV0[0],tDecayVertexV0[1],tDecayVertexV0[2]
2959       Double_t lDistanceTravelled = TMath::Sqrt(
2960                                                 TMath::Power( tDecayVertexV0[0] - lBestPrimaryVtxPos[0] , 2) +
2961                                                 TMath::Power( tDecayVertexV0[1] - lBestPrimaryVtxPos[1] , 2) +
2962                                                 TMath::Power( tDecayVertexV0[2] - lBestPrimaryVtxPos[2] , 2)
2963                                         );
2964       fTreeVariableDistOverTotMom = 1e+5;
2965       if( lV0TotalMomentum + 1e-10 != 0 ) fTreeVariableDistOverTotMom = lDistanceTravelled / (lV0TotalMomentum + 1e-10); //avoid division by zero, to be sure
2966
2967       Double_t lMomentumPosTemp[3];
2968       pTrack->GetPxPyPz(lMomentumPosTemp);
2969       Double_t lPtPosTemporary = sqrt(pow(lMomentumPosTemp[0],2) + pow(lMomentumPosTemp[1],2));
2970
2971       Double_t lMomentumNegTemp[3];
2972       nTrack->GetPxPyPz(lMomentumNegTemp);
2973       Double_t lPtNegTemporary = sqrt(pow(lMomentumNegTemp[0],2) + pow(lMomentumNegTemp[1],2));
2974
2975       fTreeVariablePosTransvMomentum = lPtPosTemporary;
2976       fTreeVariableNegTransvMomentum = lPtNegTemporary;
2977
2978
2979 //------------------------------------------------
2980 // Fill Tree! 
2981 //------------------------------------------------
2982
2983       // The conditionals are meant to decrease excessive
2984       // memory usage! 
2985
2986       //Modified version: Keep only OnFlyStatus == 0
2987       //Keep only if included in a parametric InvMass Region 20 sigmas away from peak
2988
2989       //First Selection: Reject OnFly
2990       if( (lOnFlyStatus == 0 && fkUseOnTheFly == kFALSE) || (lOnFlyStatus != 0 && fkUseOnTheFly == kTRUE ) ){
2991          //Second Selection: rough 20-sigma band, parametric. 
2992          //K0Short: Enough to parametrize peak broadening with linear function.    
2993          Double_t lUpperLimitK0Short = (5.63707e-01) + (1.14979e-02)*fTreeVariablePt; 
2994          Double_t lLowerLimitK0Short = (4.30006e-01) - (1.10029e-02)*fTreeVariablePt;
2995          //Lambda: Linear (for higher pt) plus exponential (for low-pt broadening)
2996          //[0]+[1]*x+[2]*TMath::Exp(-[3]*x)
2997          Double_t lUpperLimitLambda = (1.13688e+00) + (5.27838e-03)*fTreeVariablePt + (8.42220e-02)*TMath::Exp(-(3.80595e+00)*fTreeVariablePt); 
2998          Double_t lLowerLimitLambda = (1.09501e+00) - (5.23272e-03)*fTreeVariablePt - (7.52690e-02)*TMath::Exp(-(3.46339e+00)*fTreeVariablePt);
2999          //Do Selection      
3000          if( (fTreeVariableInvMassLambda     < lUpperLimitLambda  && fTreeVariableInvMassLambda     > lLowerLimitLambda     ) || 
3001              (fTreeVariableInvMassAntiLambda < lUpperLimitLambda  && fTreeVariableInvMassAntiLambda > lLowerLimitLambda     ) || 
3002              (fTreeVariableInvMassK0s        < lUpperLimitK0Short && fTreeVariableInvMassK0s        > lLowerLimitK0Short    ) ){
3003              //Pre-selection in case this is AA...
3004              if( fkIsNuclear == kFALSE && fkSpecialExecution == kFALSE ) fTree->Fill();
3005              if( fkIsNuclear == kTRUE){ 
3006              //If this is a nuclear collision___________________
3007              // ... pre-filter with daughter eta selection only (not TPC)
3008                if ( TMath::Abs(fTreeVariableNegEta)<0.8 && TMath::Abs(fTreeVariablePosEta)<0.8 && fkSpecialExecution == kFALSE ){
3009                  if( !fkSaveAssociatedOnly || (fkSaveAssociatedOnly &&( TMath::Abs(fTreeVariablePID) == 3122 || fTreeVariablePID==310 ) ))fTree->Fill();
3010                }
3011              }//end nuclear_____________________________________
3012          }
3013       }
3014     //Special Execution: hypertriton exploration
3015     if( lOnFlyStatus == 0 && fkSpecialExecution == kTRUE){
3016       if ( TMath::Abs(fTreeVariableNegEta)<0.8 && TMath::Abs(fTreeVariablePosEta)<0.8 ){
3017         if( !fkSaveAssociatedOnly || (fkSaveAssociatedOnly &&( TMath::Abs(fTreeVariablePID) == 1010010030 ) ) ) fTree->Fill();
3018       }
3019     }
3020
3021 //------------------------------------------------
3022 // Fill tree over.
3023 //------------------------------------------------
3024
3025
3026    }// This is the end of the V0 loop
3027
3028 //------------------------------------------------
3029
3030    // Post output data.
3031    PostData(1, fListHistV0);
3032    PostData(2, fTree);
3033 }
3034
3035 //________________________________________________________________________
3036 void AliAnalysisTaskExtractPerformanceV0::Terminate(Option_t *)
3037 {
3038    // Draw result to the screen
3039    // Called once at the end of the query
3040
3041    TList *cRetrievedList = 0x0;
3042    cRetrievedList = (TList*)GetOutputData(1);
3043    if(!cRetrievedList){
3044       Printf("ERROR - AliAnalysisTaskExtractV0 : ouput data container list not available\n");
3045       return;
3046    }    
3047         
3048    fHistV0MultiplicityForTrigEvt = dynamic_cast<TH1F*> (  cRetrievedList->FindObject("fHistV0MultiplicityForTrigEvt")  );
3049    if (!fHistV0MultiplicityForTrigEvt) {
3050       Printf("ERROR - AliAnalysisTaskExtractV0 : fHistV0MultiplicityForTrigEvt not available");
3051       return;
3052    }
3053   
3054    TCanvas *canCheck = new TCanvas("AliAnalysisTaskExtractV0","V0 Multiplicity",10,10,510,510);
3055    canCheck->cd(1)->SetLogy();
3056
3057    fHistV0MultiplicityForTrigEvt->SetMarkerStyle(22);
3058    fHistV0MultiplicityForTrigEvt->DrawCopy("E");
3059 }
3060
3061 //----------------------------------------------------------------------------
3062
3063 Double_t AliAnalysisTaskExtractPerformanceV0::MyRapidity(Double_t rE, Double_t rPz) const
3064 {
3065    // Local calculation for rapidity
3066    Double_t ReturnValue = -100;
3067    if( (rE-rPz+1.e-13) != 0 && (rE+rPz) != 0 ){ 
3068       ReturnValue =  0.5*TMath::Log((rE+rPz)/(rE-rPz+1.e-13));
3069    }
3070    return ReturnValue;
3071
3072
3073 //________________________________________________________________________
3074 void AliAnalysisTaskExtractPerformanceV0::CheckChargeV0(AliESDv0 *v0)
3075 {
3076    // This function checks charge of negative and positive daughter tracks. 
3077    // If incorrectly defined (onfly vertexer), swaps out. 
3078    if( v0->GetParamN()->Charge() > 0 && v0->GetParamP()->Charge() < 0 ){
3079       //V0 daughter track swapping is required! Note: everything is swapped here... P->N, N->P
3080       Long_t lCorrectNidx = v0->GetPindex();
3081       Long_t lCorrectPidx = v0->GetNindex();
3082       Double32_t        lCorrectNmom[3];
3083       Double32_t        lCorrectPmom[3];
3084       v0->GetPPxPyPz( lCorrectNmom[0], lCorrectNmom[1], lCorrectNmom[2] );
3085       v0->GetNPxPyPz( lCorrectPmom[0], lCorrectPmom[1], lCorrectPmom[2] );
3086
3087       AliExternalTrackParam     lCorrectParamN(
3088         v0->GetParamP()->GetX() , 
3089         v0->GetParamP()->GetAlpha() , 
3090         v0->GetParamP()->GetParameter() , 
3091         v0->GetParamP()->GetCovariance() 
3092       );
3093       AliExternalTrackParam     lCorrectParamP(
3094         v0->GetParamN()->GetX() , 
3095         v0->GetParamN()->GetAlpha() , 
3096         v0->GetParamN()->GetParameter() , 
3097         v0->GetParamN()->GetCovariance() 
3098       );
3099       lCorrectParamN.SetMostProbablePt( v0->GetParamP()->GetMostProbablePt() );
3100       lCorrectParamP.SetMostProbablePt( v0->GetParamN()->GetMostProbablePt() );
3101
3102       //Get Variables___________________________________________________
3103       Double_t lDcaV0Daughters = v0 -> GetDcaV0Daughters();
3104       Double_t lCosPALocal     = v0 -> GetV0CosineOfPointingAngle(); 
3105       Bool_t lOnFlyStatusLocal = v0 -> GetOnFlyStatus();
3106
3107       //Create Replacement Object_______________________________________
3108       AliESDv0 *v0correct = new AliESDv0(lCorrectParamN,lCorrectNidx,lCorrectParamP,lCorrectPidx);
3109       v0correct->SetDcaV0Daughters          ( lDcaV0Daughters   );
3110       v0correct->SetV0CosineOfPointingAngle ( lCosPALocal       );
3111       v0correct->ChangeMassHypothesis       ( kK0Short          );
3112       v0correct->SetOnFlyStatus             ( lOnFlyStatusLocal );
3113
3114       //Reverse Cluster info..._________________________________________
3115       v0correct->SetClusters( v0->GetClusters( 1 ), v0->GetClusters ( 0 ) );
3116
3117       *v0 = *v0correct;
3118       //Proper cleanup..._______________________________________________
3119       v0correct->Delete();
3120       v0correct = 0x0;
3121
3122       //Just another cross-check and output_____________________________
3123       if( v0->GetParamN()->Charge() > 0 && v0->GetParamP()->Charge() < 0 ) {
3124         AliWarning("Found Swapped Charges, tried to correct but something FAILED!");
3125       }else{
3126         //AliWarning("Found Swapped Charges and fixed.");
3127       }
3128       //________________________________________________________________
3129    }else{
3130       //Don't touch it! ---
3131       //Printf("Ah, nice. Charges are already ordered...");
3132    }
3133    return;
3134
3135