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