]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGLF/STRANGENESS/Cascades/AliAnalysisTaskStrangenessVsMultiplicity.cxx
Residual Pileup estimation additions
[u/mrichter/AliRoot.git] / PWGLF / STRANGENESS / Cascades / AliAnalysisTaskStrangenessVsMultiplicity.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 // This task is meant to explore the possibility of using a VZERO amplitude
19 // based multiplicity estimator for proton-proton collisions. For this, two
20 // main operation methods for this task are foreseen:
21 //
22 //  1) (under development) it should act as an auxiliary task and provide a
23 //     calibrated estimator
24 //
25 //  2) "Debug mode" which will also create a ROOT TTree object with event
26 //     by event info potentially used for exploration / calibration. This
27 //     includes the following info:
28 //
29 //      --- All VZERO Amplitudes (saved as Float_t)
30 //      --- (optional) time for each channel
31 //      --- (optional) time width for each channel
32 //      --- GetReferenceMultiplicity Estimator, |eta|<0.5
33 //      --- GetReferenceMultiplicity Estimator, |eta|<0.8
34 //      --- (if MC) True Multiplicity, |eta|<0.5
35 //      --- (if MC) True Multiplicity,  2.8 < eta < 5.8 (VZEROA region)
36 //      --- (if MC) True Multiplicity, -3.7 < eta <-1.7 (VZEROC region)
37 //      --- Run Number
38 //
39 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
40
41 class TTree;
42 class TParticle;
43 class TVector3;
44
45 //class AliMCEventHandler;
46 //class AliMCEvent;
47 //class AliStack;
48
49 class AliESDVertex;
50 class AliAODVertex;
51 class AliESDv0;
52 class AliAODv0;
53
54 #include <Riostream.h>
55 #include "TList.h"
56 #include "TH1.h"
57 #include "TH2.h"
58 #include "TH3.h"
59 #include "TFile.h"
60 #include "THnSparse.h"
61 #include "TVector3.h"
62 #include "TCanvas.h"
63 #include "TMath.h"
64 #include "TLegend.h"
65 //#include "AliLog.h"
66
67 #include "AliESDEvent.h"
68 #include "AliAODEvent.h"
69 #include "AliV0vertexer.h"
70 #include "AliCascadeVertexer.h"
71 #include "AliESDpid.h"
72 #include "AliESDtrack.h"
73 #include "AliESDtrackCuts.h"
74 #include "AliInputEventHandler.h"
75 #include "AliAnalysisManager.h"
76 #include "AliMCEventHandler.h"
77 #include "AliMCEvent.h"
78 #include "AliStack.h"
79 #include "AliCentrality.h"
80 #include "AliPPVsMultUtils.h"
81
82 #include "AliCFContainer.h"
83 #include "AliMultiplicity.h"
84 #include "AliAODMCParticle.h"
85 #include "AliESDcascade.h"
86 #include "AliAODcascade.h"
87 #include "AliESDUtils.h"
88 #include "AliGenEventHeader.h"
89 #include "AliAnalysisTaskSE.h"
90 #include "AliAnalysisUtils.h"
91 #include "AliAnalysisTaskStrangenessVsMultiplicity.h"
92
93 using std::cout;
94 using std::endl;
95
96 ClassImp(AliAnalysisTaskStrangenessVsMultiplicity)
97
98 AliAnalysisTaskStrangenessVsMultiplicity::AliAnalysisTaskStrangenessVsMultiplicity()
99 : AliAnalysisTaskSE(), fListHist(0), fTreeEvent(0), fTreeV0(0), fTreeCascade(0), fPIDResponse(0), fESDtrackCuts(0), fPPVsMultUtils(0), fUtils(0),
100 fkSaveV0Tree      ( kFALSE ),
101 fkSaveCascadeTree ( kTRUE  ),
102 fkRunVertexers    ( kTRUE  ),
103 fkSkipEventSelection( kFALSE ),
104 //---> Variables for fTreeEvent
105 fAmplitude_V0A   (0),
106 fAmplitude_V0C   (0),
107 fAmplitude_V0AEq (0),
108 fAmplitude_V0CEq (0),
109 fCentrality_V0A(0),
110 fCentrality_V0C(0),
111 fCentrality_V0M(0),
112 fCentrality_V0AEq(0),
113 fCentrality_V0CEq(0),
114 fCentrality_V0MEq(0),
115 fCustomCentrality_V0M(0),
116 fCustomCentrality_V0MEq(0),
117 fRefMultEta5(0),
118 fRefMultEta8(0),
119 fRunNumber(0),
120 fEvSel_HasAtLeastSPDVertex(0),
121 fEvSel_VtxZCut(0),
122 fEvSel_IsNotPileup(0),
123 fEvSel_IsNotPileupMV(0),
124 fEvSel_IsNotPileupInMultBins(0),
125 fEvSel_HasVtxContributor(0),
126 fEvSel_Triggered(0),
127 fEvSel_nTracklets(0),
128 fEvSel_nSPDClusters(0),
129 fEvSel_VtxZ(0),
130 fEvSel_nSPDPrimVertices(0),
131 fEvSel_distZ(0),
132
133 //---> Variables for fTreeV0
134 fTreeVariableChi2V0(0),
135 fTreeVariableDcaV0Daughters(0),
136 fTreeVariableDcaV0ToPrimVertex(0),
137 fTreeVariableDcaPosToPrimVertex(0),
138 fTreeVariableDcaNegToPrimVertex(0),
139 fTreeVariableV0CosineOfPointingAngle(0),
140 fTreeVariableV0Radius(0),
141 fTreeVariablePt(0),
142 fTreeVariableRapK0Short(0),
143 fTreeVariableRapLambda(0),
144 fTreeVariableInvMassK0s(0),
145 fTreeVariableInvMassLambda(0),
146 fTreeVariableInvMassAntiLambda(0),
147 fTreeVariableAlphaV0(0),
148 fTreeVariablePtArmV0(0),
149 fTreeVariableNegEta(0),
150 fTreeVariablePosEta(0),
151
152 fTreeVariableNSigmasPosProton(0),
153 fTreeVariableNSigmasPosPion(0),
154 fTreeVariableNSigmasNegProton(0),
155 fTreeVariableNSigmasNegPion(0),
156
157 fTreeVariableDistOverTotMom(0),
158 fTreeVariableLeastNbrCrossedRows(0),
159 fTreeVariableLeastRatioCrossedRowsOverFindable(0),
160
161 fTreeVariableCentV0A(0),
162 fTreeVariableCentV0C(0),
163 fTreeVariableCentV0M(0),
164 fTreeVariableCentV0AEq(0),
165 fTreeVariableCentV0CEq(0),
166 fTreeVariableCentV0MEq(0),
167 fTreeVariableAmpV0A(0),
168 fTreeVariableAmpV0C(0),
169 fTreeVariableAmpV0AEq(0),
170 fTreeVariableAmpV0CEq(0),
171 fTreeVariableRefMultEta8(0),
172 fTreeVariableRefMultEta5(0),
173 fTreeVariableRunNumber(0),
174 //---> Variables for fTreeCascade
175 fTreeCascVarCharge(0),
176 fTreeCascVarMassAsXi(0),
177 fTreeCascVarMassAsOmega(0),
178 fTreeCascVarPt(0),
179 fTreeCascVarRapXi(0),
180 fTreeCascVarRapOmega(0),
181 fTreeCascVarNegEta(0),
182 fTreeCascVarPosEta(0),
183 fTreeCascVarBachEta(0),
184 fTreeCascVarDCACascDaughters(0),
185 fTreeCascVarDCABachToPrimVtx(0),
186 fTreeCascVarDCAV0Daughters(0),
187 fTreeCascVarDCAV0ToPrimVtx(0),
188 fTreeCascVarDCAPosToPrimVtx(0),
189 fTreeCascVarDCANegToPrimVtx(0),
190 fTreeCascVarCascCosPointingAngle(0),
191 fTreeCascVarCascRadius(0),
192 fTreeCascVarV0Mass(0),
193 fTreeCascVarV0CosPointingAngle(0),
194 fTreeCascVarV0CosPointingAngleSpecial(0),
195 fTreeCascVarV0Radius(0),
196 fTreeCascVarLeastNbrClusters(0),
197 fTreeCascVarDistOverTotMom(0),
198 fTreeCascVarNegNSigmaPion(0),
199 fTreeCascVarNegNSigmaProton(0),
200 fTreeCascVarPosNSigmaPion(0),
201 fTreeCascVarPosNSigmaProton(0),
202 fTreeCascVarBachNSigmaPion(0),
203 fTreeCascVarBachNSigmaKaon(0),
204 fTreeCascVarCentV0A(0),
205 fTreeCascVarCentV0C(0),
206 fTreeCascVarCentV0M(0),
207 fTreeCascVarCentV0AEq(0),
208 fTreeCascVarCentV0CEq(0),
209 fTreeCascVarCentV0MEq(0),
210 fTreeCascVarAmpV0A(0),
211 fTreeCascVarAmpV0C(0),
212 fTreeCascVarAmpV0AEq(0),
213 fTreeCascVarAmpV0CEq(0),
214 fTreeCascVarRefMultEta8(0),
215 fTreeCascVarRefMultEta5(0),
216 fTreeCascVarRunNumber(0),
217 //Histos
218 fHistEventCounter(0)
219 //------------------------------------------------
220 // Tree Variables
221 {
222     
223 }
224
225 AliAnalysisTaskStrangenessVsMultiplicity::AliAnalysisTaskStrangenessVsMultiplicity(const char *name)
226 : AliAnalysisTaskSE(name), fListHist(0), fTreeEvent(0), fTreeV0(0), fTreeCascade(0), fPIDResponse(0), fESDtrackCuts(0), fPPVsMultUtils(0), fUtils(0),
227 fkSaveV0Tree      ( kFALSE ),
228 fkSaveCascadeTree ( kTRUE  ),
229 fkRunVertexers    ( kTRUE  ),
230 fkSkipEventSelection( kFALSE ),
231 //---> Variables for fTreeEvent
232 fAmplitude_V0A (0),
233 fAmplitude_V0C (0),
234 fAmplitude_V0AEq (0),
235 fAmplitude_V0CEq (0),
236 fCentrality_V0A(0),
237 fCentrality_V0C(0),
238 fCentrality_V0M(0),
239 fCentrality_V0AEq(0),
240 fCentrality_V0CEq(0),
241 fCentrality_V0MEq(0),
242 fCustomCentrality_V0M(0),
243 fCustomCentrality_V0MEq(0),
244 fRefMultEta5(0),
245 fRefMultEta8(0),
246 fRunNumber(0),
247 fEvSel_HasAtLeastSPDVertex(0),
248 fEvSel_VtxZCut(0),
249 fEvSel_IsNotPileup(0),
250 fEvSel_IsNotPileupMV(0),
251 fEvSel_IsNotPileupInMultBins(0),
252 fEvSel_HasVtxContributor(0),
253 fEvSel_Triggered(0),
254 fEvSel_nTracklets(0),
255 fEvSel_nSPDClusters(0),
256 fEvSel_VtxZ(0),
257 fEvSel_nSPDPrimVertices(0),
258 fEvSel_distZ(0),
259
260
261 //---> Variables for fTreeV0
262 fTreeVariableChi2V0(0),
263 fTreeVariableDcaV0Daughters(0),
264 fTreeVariableDcaV0ToPrimVertex(0),
265 fTreeVariableDcaPosToPrimVertex(0),
266 fTreeVariableDcaNegToPrimVertex(0),
267 fTreeVariableV0CosineOfPointingAngle(0),
268 fTreeVariableV0Radius(0),
269 fTreeVariablePt(0),
270 fTreeVariableRapK0Short(0),
271 fTreeVariableRapLambda(0),
272 fTreeVariableInvMassK0s(0),
273 fTreeVariableInvMassLambda(0),
274 fTreeVariableInvMassAntiLambda(0),
275 fTreeVariableAlphaV0(0),
276 fTreeVariablePtArmV0(0),
277 fTreeVariableNegEta(0),
278 fTreeVariablePosEta(0),
279
280 fTreeVariableNSigmasPosProton(0),
281 fTreeVariableNSigmasPosPion(0),
282 fTreeVariableNSigmasNegProton(0),
283 fTreeVariableNSigmasNegPion(0),
284
285 fTreeVariableDistOverTotMom(0),
286 fTreeVariableLeastNbrCrossedRows(0),
287 fTreeVariableLeastRatioCrossedRowsOverFindable(0),
288
289 fTreeVariableCentV0A(0),
290 fTreeVariableCentV0C(0),
291 fTreeVariableCentV0M(0),
292 fTreeVariableCentV0AEq(0),
293 fTreeVariableCentV0CEq(0),
294 fTreeVariableCentV0MEq(0),
295 fTreeVariableAmpV0A(0),
296 fTreeVariableAmpV0C(0),
297 fTreeVariableAmpV0AEq(0),
298 fTreeVariableAmpV0CEq(0),
299 fTreeVariableRefMultEta8(0),
300 fTreeVariableRefMultEta5(0),
301 fTreeVariableRunNumber(0),
302 //---> Variables for fTreeCascade
303 fTreeCascVarCharge(0),
304 fTreeCascVarMassAsXi(0),
305 fTreeCascVarMassAsOmega(0),
306 fTreeCascVarPt(0),
307 fTreeCascVarRapXi(0),
308 fTreeCascVarRapOmega(0),
309 fTreeCascVarNegEta(0),
310 fTreeCascVarPosEta(0),
311 fTreeCascVarBachEta(0),
312 fTreeCascVarDCACascDaughters(0),
313 fTreeCascVarDCABachToPrimVtx(0),
314 fTreeCascVarDCAV0Daughters(0),
315 fTreeCascVarDCAV0ToPrimVtx(0),
316 fTreeCascVarDCAPosToPrimVtx(0),
317 fTreeCascVarDCANegToPrimVtx(0),
318 fTreeCascVarCascCosPointingAngle(0),
319 fTreeCascVarCascRadius(0),
320 fTreeCascVarV0Mass(0),
321 fTreeCascVarV0CosPointingAngle(0),
322 fTreeCascVarV0CosPointingAngleSpecial(0),
323 fTreeCascVarV0Radius(0),
324 fTreeCascVarLeastNbrClusters(0),
325 fTreeCascVarDistOverTotMom(0),
326 fTreeCascVarNegNSigmaPion(0),
327 fTreeCascVarNegNSigmaProton(0),
328 fTreeCascVarPosNSigmaPion(0),
329 fTreeCascVarPosNSigmaProton(0),
330 fTreeCascVarBachNSigmaPion(0),
331 fTreeCascVarBachNSigmaKaon(0),
332 fTreeCascVarCentV0A(0),
333 fTreeCascVarCentV0C(0),
334 fTreeCascVarCentV0M(0),
335 fTreeCascVarCentV0AEq(0),
336 fTreeCascVarCentV0CEq(0),
337 fTreeCascVarCentV0MEq(0),
338 fTreeCascVarAmpV0A(0),
339 fTreeCascVarAmpV0C(0),
340 fTreeCascVarAmpV0AEq(0),
341 fTreeCascVarAmpV0CEq(0),
342 fTreeCascVarRefMultEta8(0),
343 fTreeCascVarRefMultEta5(0),
344 fTreeCascVarRunNumber(0),
345 //Histos
346 fHistEventCounter(0)
347 {
348     
349     //Re-vertex: Will only apply for cascade candidates
350     
351     fV0VertexerSels[0] =  33.  ;  // max allowed chi2
352     fV0VertexerSels[1] =   0.02;  // min allowed impact parameter for the 1st daughter (LHC09a4 : 0.05)
353     fV0VertexerSels[2] =   0.02;  // min allowed impact parameter for the 2nd daughter (LHC09a4 : 0.05)
354     fV0VertexerSels[4] =   0.95;  // min allowed cosine of V0's pointing angle         (LHC09a4 : 0.99)
355     fV0VertexerSels[5] =   1.0 ;  // min radius of the fiducial volume                 (LHC09a4 : 0.2)
356     fV0VertexerSels[6] = 200.  ;  // max radius of the fiducial volume                 (LHC09a4 : 100.0)
357     
358     fCascadeVertexerSels[0] =  33.   ;  // max allowed chi2 (same as PDC07)
359     fCascadeVertexerSels[1] =   0.05 ;  // min allowed V0 impact parameter                    (PDC07 : 0.05   / LHC09a4 : 0.025 )
360     fCascadeVertexerSels[2] =   0.010;  // "window" around the Lambda mass                    (PDC07 : 0.008  / LHC09a4 : 0.010 )
361     fCascadeVertexerSels[3] =   0.03 ;  // min allowed bachelor's impact parameter            (PDC07 : 0.035  / LHC09a4 : 0.025 )
362     fCascadeVertexerSels[4] =   2.0  ;  // max allowed DCA between the V0 and the bachelor    (PDC07 : 0.1    / LHC09a4 : 0.2   )
363     fCascadeVertexerSels[5] =   0.95 ;  // min allowed cosine of the cascade pointing angle   (PDC07 : 0.9985 / LHC09a4 : 0.998 )
364     fCascadeVertexerSels[6] =   0.4  ;  // min radius of the fiducial volume                  (PDC07 : 0.9    / LHC09a4 : 0.2   )
365     fCascadeVertexerSels[7] = 100.   ;  // max radius of the fiducial volume                  (PDC07 : 100    / LHC09a4 : 100   )
366     
367     
368     DefineOutput(1, TList::Class()); // Event Counter Histo
369     DefineOutput(2, TTree::Class()); // Event Tree
370     DefineOutput(3, TTree::Class()); // V0 Tree
371     DefineOutput(4, TTree::Class()); // Cascade Tree
372 }
373
374
375 AliAnalysisTaskStrangenessVsMultiplicity::~AliAnalysisTaskStrangenessVsMultiplicity()
376 {
377     //------------------------------------------------
378     // DESTRUCTOR
379     //------------------------------------------------
380     
381     if (fListHist){
382         delete fListHist;
383         fListHist = 0x0;
384     }
385     if (fTreeEvent){
386         delete fTreeEvent;
387         fTreeEvent = 0x0;
388     }
389     if (fTreeV0){
390         delete fTreeV0;
391         fTreeV0 = 0x0;
392     }
393     if (fTreeCascade){
394         delete fTreeCascade;
395         fTreeCascade = 0x0;
396     }
397     if (fPPVsMultUtils){
398         delete fPPVsMultUtils;
399         fPPVsMultUtils = 0x0;
400     }
401     if (fUtils){
402         delete fUtils;
403         fUtils = 0x0;
404     }
405 }
406
407 //________________________________________________________________________
408 void AliAnalysisTaskStrangenessVsMultiplicity::UserCreateOutputObjects()
409 {
410     
411     OpenFile(2);
412     // Called once
413     
414     //------------------------------------------------
415     
416     fTreeEvent = new TTree("fTreeEvent","Event");
417     
418     //------------------------------------------------
419     // fTree Branch definitions - Event by Event info
420     //------------------------------------------------
421     
422     //-----------BASIC-INFO---------------------------
423     
424     //--- VZERO Data (Integrated)
425     fTreeEvent->Branch("fAmplitude_V0A",&fAmplitude_V0A,"fAmplitude_V0A/F");
426     fTreeEvent->Branch("fAmplitude_V0C",&fAmplitude_V0C,"fAmplitude_V0C/F");
427     fTreeEvent->Branch("fAmplitude_V0AEq",&fAmplitude_V0AEq,"fAmplitude_V0AEq/F");
428     fTreeEvent->Branch("fAmplitude_V0CEq",&fAmplitude_V0CEq,"fAmplitude_V0CEq/F");
429     
430     //Info from AliCentrality (not necessarily 'centrality' per se)
431     fTreeEvent->Branch("fCentrality_V0A",&fCentrality_V0A,"fCentrality_V0A/F");
432     fTreeEvent->Branch("fCentrality_V0C",&fCentrality_V0C,"fCentrality_V0C/F");
433     fTreeEvent->Branch("fCentrality_V0M",&fCentrality_V0M,"fCentrality_V0M/F");
434     fTreeEvent->Branch("fCentrality_V0AEq",&fCentrality_V0AEq,"fCentrality_V0AEq/F");
435     fTreeEvent->Branch("fCentrality_V0CEq",&fCentrality_V0CEq,"fCentrality_V0CEq/F");
436     fTreeEvent->Branch("fCentrality_V0MEq",&fCentrality_V0MEq,"fCentrality_V0MEq/F");
437     fTreeEvent->Branch("fCustomCentrality_V0M",&fCustomCentrality_V0M,"fCustomCentrality_V0M/F");
438     fTreeEvent->Branch("fCustomCentrality_V0MEq",&fCustomCentrality_V0MEq,"fCustomCentrality_V0MEq/F");
439     
440     //Official GetReferenceMultiplicity
441     fTreeEvent->Branch("fRefMultEta5",&fRefMultEta5,"fRefMultEta5/I");
442     fTreeEvent->Branch("fRefMultEta8",&fRefMultEta8,"fRefMultEta8/I");
443     
444     //Run Number
445     fTreeEvent->Branch("fRunNumber", &fRunNumber, "fRunNumber/I");
446     
447     //Booleans for Event Selection
448     fTreeEvent->Branch("fEvSel_HasAtLeastSPDVertex", &fEvSel_HasAtLeastSPDVertex, "fEvSel_HasAtLeastSPDVertex/O");
449     fTreeEvent->Branch("fEvSel_VtxZCut", &fEvSel_VtxZCut, "fEvSel_VtxZCut/O");
450     fTreeEvent->Branch("fEvSel_IsNotPileup", &fEvSel_IsNotPileup, "fEvSel_IsNotPileup/O");
451     fTreeEvent->Branch("fEvSel_IsNotPileupMV", &fEvSel_IsNotPileupMV, "fEvSel_IsNotPileupMV/O");
452     fTreeEvent->Branch("fEvSel_IsNotPileupInMultBins", &fEvSel_IsNotPileupInMultBins, "fEvSel_IsNotPileupInMultBins/O");
453     fTreeEvent->Branch("fEvSel_HasVtxContributor", &fEvSel_HasVtxContributor, "fEvSel_HasVtxContributor/O");
454     fTreeEvent->Branch("fEvSel_Triggered", &fEvSel_Triggered, "fEvSel_Triggered/O");
455     
456     //Tracklets vs clusters test
457     fTreeEvent->Branch("fEvSel_nTracklets", &fEvSel_nTracklets, "fEvSel_nTracklets/I");
458     fTreeEvent->Branch("fEvSel_nSPDClusters", &fEvSel_nSPDClusters, "fEvSel_nSPDClusters/I");
459     
460     fTreeEvent->Branch("fEvSel_VtxZ", &fEvSel_VtxZ, "fEvSel_VtxZ/F");
461     fTreeEvent->Branch("fEvSel_nSPDPrimVertices", &fEvSel_nSPDPrimVertices, "fEvSel_nSPDPrimVertices/I");
462     fTreeEvent->Branch("fEvSel_distZ", &fEvSel_distZ, "fEvSel_distZ/F");
463     
464     //Create Basic V0 Output Tree
465     fTreeV0 = new TTree( "fTreeV0", "V0 Candidates");
466     
467     //------------------------------------------------
468     // fTreeV0 Branch definitions
469     //------------------------------------------------
470     
471     //-----------BASIC-INFO---------------------------
472     fTreeV0->Branch("fTreeVariableChi2V0",&fTreeVariableChi2V0,"fTreeVariableChi2V0/F");
473     fTreeV0->Branch("fTreeVariableDcaV0Daughters",&fTreeVariableDcaV0Daughters,"fTreeVariableDcaV0Daughters/F");
474     fTreeV0->Branch("fTreeVariableDcaV0ToPrimVertex",&fTreeVariableDcaV0ToPrimVertex,"fTreeVariableDcaV0ToPrimVertex/F");
475     fTreeV0->Branch("fTreeVariableDcaPosToPrimVertex",&fTreeVariableDcaPosToPrimVertex,"fTreeVariableDcaPosToPrimVertex/F");
476     fTreeV0->Branch("fTreeVariableDcaNegToPrimVertex",&fTreeVariableDcaNegToPrimVertex,"fTreeVariableDcaNegToPrimVertex/F");
477     fTreeV0->Branch("fTreeVariableV0Radius",&fTreeVariableV0Radius,"fTreeVariableV0Radius/F");
478     fTreeV0->Branch("fTreeVariablePt",&fTreeVariablePt,"fTreeVariablePt/F");
479     fTreeV0->Branch("fTreeVariableRapK0Short",&fTreeVariableRapK0Short,"fTreeVariableRapK0Short/F");
480     fTreeV0->Branch("fTreeVariableRapLambda",&fTreeVariableRapLambda,"fTreeVariableRapLambda/F");
481     fTreeV0->Branch("fTreeVariableInvMassK0s",&fTreeVariableInvMassK0s,"fTreeVariableInvMassK0s/F");
482     fTreeV0->Branch("fTreeVariableInvMassLambda",&fTreeVariableInvMassLambda,"fTreeVariableInvMassLambda/F");
483     fTreeV0->Branch("fTreeVariableInvMassAntiLambda",&fTreeVariableInvMassAntiLambda,"fTreeVariableInvMassAntiLambda/F");
484     fTreeV0->Branch("fTreeVariableV0CosineOfPointingAngle",&fTreeVariableV0CosineOfPointingAngle,"fTreeVariableV0CosineOfPointingAngle/F");
485     fTreeV0->Branch("fTreeVariableAlphaV0",&fTreeVariableAlphaV0,"fTreeVariableAlphaV0/F");
486     fTreeV0->Branch("fTreeVariablePtArmV0",&fTreeVariablePtArmV0,"fTreeVariablePtArmV0/F");
487     fTreeV0->Branch("fTreeVariableLeastNbrCrossedRows",&fTreeVariableLeastNbrCrossedRows,"fTreeVariableLeastNbrCrossedRows/I");
488     fTreeV0->Branch("fTreeVariableLeastRatioCrossedRowsOverFindable",&fTreeVariableLeastRatioCrossedRowsOverFindable,"fTreeVariableLeastRatioCrossedRowsOverFindable/F");
489     fTreeV0->Branch("fTreeVariableDistOverTotMom",&fTreeVariableDistOverTotMom,"fTreeVariableDistOverTotMom/F");
490     fTreeV0->Branch("fTreeVariableNSigmasPosProton",&fTreeVariableNSigmasPosProton,"fTreeVariableNSigmasPosProton/F");
491     fTreeV0->Branch("fTreeVariableNSigmasPosPion",&fTreeVariableNSigmasPosPion,"fTreeVariableNSigmasPosPion/F");
492     fTreeV0->Branch("fTreeVariableNSigmasNegProton",&fTreeVariableNSigmasNegProton,"fTreeVariableNSigmasNegProton/F");
493     fTreeV0->Branch("fTreeVariableNSigmasNegPion",&fTreeVariableNSigmasNegPion,"fTreeVariableNSigmasNegPion/F");
494     fTreeV0->Branch("fTreeVariableNegEta",&fTreeVariableNegEta,"fTreeVariableNegEta/F");
495     fTreeV0->Branch("fTreeVariablePosEta",&fTreeVariablePosEta,"fTreeVariablePosEta/F");
496     //-----------MULTIPLICITY-INFO--------------------
497     fTreeV0->Branch("fTreeVariableCentV0A",&fTreeVariableCentV0A,"fTreeVariableCentV0A/F");
498     fTreeV0->Branch("fTreeVariableCentV0C",&fTreeVariableCentV0C,"fTreeVariableCentV0C/F");
499     fTreeV0->Branch("fTreeVariableCentV0M",&fTreeVariableCentV0M,"fTreeVariableCentV0M/F");
500     fTreeV0->Branch("fTreeVariableCentV0AEq",&fTreeVariableCentV0AEq,"fTreeVariableCentV0AEq/F");
501     fTreeV0->Branch("fTreeVariableCentV0CEq",&fTreeVariableCentV0CEq,"fTreeVariableCentV0CEq/F");
502     fTreeV0->Branch("fTreeVariableCentV0MEq",&fTreeVariableCentV0MEq,"fTreeVariableCentV0MEq/F");
503     fTreeV0->Branch("fTreeVariableAmpV0A",&fTreeVariableAmpV0A,"fTreeVariableAmpV0A/F");
504     fTreeV0->Branch("fTreeVariableAmpV0C",&fTreeVariableAmpV0C,"fTreeVariableAmpV0C/F");
505     fTreeV0->Branch("fTreeVariableAmpV0AEq",&fTreeVariableAmpV0AEq,"fTreeVariableAmpV0AEq/F");
506     fTreeV0->Branch("fTreeVariableAmpV0CEq",&fTreeVariableAmpV0CEq,"fTreeVariableAmpV0CEq/F");
507     fTreeV0->Branch("fTreeVariableRefMultEta8",&fTreeVariableRefMultEta8,"fTreeVariableRefMultEta8/I");
508     fTreeV0->Branch("fTreeVariableRefMultEta5",&fTreeVariableRefMultEta5,"fTreeVariableRefMultEta5/I");
509     fTreeV0->Branch("fTreeVariableRunNumber",&fTreeVariableRunNumber,"fTreeVariableRunNumber/I");
510     //------------------------------------------------
511     
512     //Create Cascade output tree
513     fTreeCascade = new TTree("fTreeCascade","CascadeCandidates");
514     
515     //------------------------------------------------
516     // fTreeCascade Branch definitions - Cascade Tree
517     //------------------------------------------------
518     
519     //-----------BASIC-INFO---------------------------
520         fTreeCascade->Branch("fTreeCascVarCharge",&fTreeCascVarCharge,"fTreeCascVarCharge/I");
521     fTreeCascade->Branch("fTreeCascVarMassAsXi",&fTreeCascVarMassAsXi,"fTreeCascVarMassAsXi/F");
522     fTreeCascade->Branch("fTreeCascVarMassAsOmega",&fTreeCascVarMassAsOmega,"fTreeCascVarMassAsOmega/F");
523     fTreeCascade->Branch("fTreeCascVarPt",&fTreeCascVarPt,"fTreeCascVarPt/F");
524     fTreeCascade->Branch("fTreeCascVarRapXi",&fTreeCascVarRapXi,"fTreeCascVarRapXi/F");
525     fTreeCascade->Branch("fTreeCascVarRapOmega",&fTreeCascVarRapOmega,"fTreeCascVarRapOmega/F");
526     fTreeCascade->Branch("fTreeCascVarNegEta",&fTreeCascVarNegEta,"fTreeCascVarNegEta/F");
527     fTreeCascade->Branch("fTreeCascVarPosEta",&fTreeCascVarPosEta,"fTreeCascVarPosEta/F");
528     fTreeCascade->Branch("fTreeCascVarBachEta",&fTreeCascVarBachEta,"fTreeCascVarBachEta/F");
529     //-----------INFO-FOR-CUTS------------------------
530     fTreeCascade->Branch("fTreeCascVarDCACascDaughters",&fTreeCascVarDCACascDaughters,"fTreeCascVarDCACascDaughters/F");
531     fTreeCascade->Branch("fTreeCascVarDCABachToPrimVtx",&fTreeCascVarDCABachToPrimVtx,"fTreeCascVarDCABachToPrimVtx/F");
532     fTreeCascade->Branch("fTreeCascVarDCAV0Daughters",&fTreeCascVarDCAV0Daughters,"fTreeCascVarDCAV0Daughters/F");
533     fTreeCascade->Branch("fTreeCascVarDCAV0ToPrimVtx",&fTreeCascVarDCAV0ToPrimVtx,"fTreeCascVarDCAV0ToPrimVtx/F");
534     fTreeCascade->Branch("fTreeCascVarDCAPosToPrimVtx",&fTreeCascVarDCAPosToPrimVtx,"fTreeCascVarDCAPosToPrimVtx/F");
535     fTreeCascade->Branch("fTreeCascVarDCANegToPrimVtx",&fTreeCascVarDCANegToPrimVtx,"fTreeCascVarDCANegToPrimVtx/F");
536     fTreeCascade->Branch("fTreeCascVarCascCosPointingAngle",&fTreeCascVarCascCosPointingAngle,"fTreeCascVarCascCosPointingAngle/F");
537     fTreeCascade->Branch("fTreeCascVarCascRadius",&fTreeCascVarCascRadius,"fTreeCascVarCascRadius/F");
538     fTreeCascade->Branch("fTreeCascVarV0Mass",&fTreeCascVarV0Mass,"fTreeCascVarV0Mass/F");
539     fTreeCascade->Branch("fTreeCascVarV0CosPointingAngle",&fTreeCascVarV0CosPointingAngle,"fTreeCascVarV0CosPointingAngle/F");
540     fTreeCascade->Branch("fTreeCascVarV0CosPointingAngleSpecial",&fTreeCascVarV0CosPointingAngleSpecial,"fTreeCascVarV0CosPointingAngleSpecial/F");
541     fTreeCascade->Branch("fTreeCascVarV0Radius",&fTreeCascVarV0Radius,"fTreeCascVarV0Radius/F");
542     fTreeCascade->Branch("fTreeCascVarLeastNbrClusters",&fTreeCascVarLeastNbrClusters,"fTreeCascVarLeastNbrClusters/I");
543     //-----------MULTIPLICITY-INFO--------------------
544     fTreeCascade->Branch("fTreeCascVarCentV0A",&fTreeCascVarCentV0A,"fTreeCascVarCentV0A/F");
545     fTreeCascade->Branch("fTreeCascVarCentV0C",&fTreeCascVarCentV0C,"fTreeCascVarCentV0C/F");
546     fTreeCascade->Branch("fTreeCascVarCentV0M",&fTreeCascVarCentV0M,"fTreeCascVarCentV0M/F");
547     fTreeCascade->Branch("fTreeCascVarCentV0AEq",&fTreeCascVarCentV0AEq,"fTreeCascVarCentV0AEq/F");
548     fTreeCascade->Branch("fTreeCascVarCentV0CEq",&fTreeCascVarCentV0CEq,"fTreeCascVarCentV0CEq/F");
549     fTreeCascade->Branch("fTreeCascVarCentV0MEq",&fTreeCascVarCentV0MEq,"fTreeCascVarCentV0MEq/F");
550     fTreeCascade->Branch("fTreeCascVarAmpV0A",&fTreeCascVarAmpV0A,"fTreeCascVarAmpV0A/F");
551     fTreeCascade->Branch("fTreeCascVarAmpV0C",&fTreeCascVarAmpV0C,"fTreeCascVarAmpV0C/F");
552     fTreeCascade->Branch("fTreeCascVarAmpV0AEq",&fTreeCascVarAmpV0AEq,"fTreeCascVarAmpV0AEq/F");
553     fTreeCascade->Branch("fTreeCascVarAmpV0CEq",&fTreeCascVarAmpV0CEq,"fTreeCascVarAmpV0CEq/F");
554     fTreeCascade->Branch("fTreeCascVarRefMultEta8",&fTreeCascVarRefMultEta8,"fTreeCascVarRefMultEta8/I");
555     fTreeCascade->Branch("fTreeCascVarRefMultEta5",&fTreeCascVarRefMultEta5,"fTreeCascVarRefMultEta5/I");
556     fTreeCascade->Branch("fTreeCascVarRunNumber",&fTreeCascVarRunNumber,"fTreeCascVarRunNumber/I");
557     //-----------DECAY-LENGTH-INFO--------------------
558     fTreeCascade->Branch("fTreeCascVarDistOverTotMom",&fTreeCascVarDistOverTotMom,"fTreeCascVarDistOverTotMom/F");
559     //------------------------------------------------
560     fTreeCascade->Branch("fTreeCascVarNegNSigmaPion",&fTreeCascVarNegNSigmaPion,"fTreeCascVarNegNSigmaPion/F");
561     fTreeCascade->Branch("fTreeCascVarNegNSigmaProton",&fTreeCascVarNegNSigmaProton,"fTreeCascVarNegNSigmaProton/F");
562     fTreeCascade->Branch("fTreeCascVarPosNSigmaPion",&fTreeCascVarPosNSigmaPion,"fTreeCascVarPosNSigmaPion/F");
563     fTreeCascade->Branch("fTreeCascVarPosNSigmaProton",&fTreeCascVarPosNSigmaProton,"fTreeCascVarPosNSigmaProton/F");
564     fTreeCascade->Branch("fTreeCascVarBachNSigmaPion",&fTreeCascVarBachNSigmaPion,"fTreeCascVarBachNSigmaPion/F");
565     fTreeCascade->Branch("fTreeCascVarBachNSigmaKaon",&fTreeCascVarBachNSigmaKaon,"fTreeCascVarBachNSigmaKaon/F");
566     
567     //------------------------------------------------
568     // Particle Identification Setup
569     //------------------------------------------------
570     
571     AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
572     AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
573     fPIDResponse = inputHandler->GetPIDResponse();
574     
575     // Multiplicity
576     if(! fESDtrackCuts ){
577         fESDtrackCuts = new AliESDtrackCuts();
578     }
579     //Helper
580     if(! fPPVsMultUtils ){
581         fPPVsMultUtils = new AliPPVsMultUtils();
582     }
583     //Analysis Utils
584     if(! fUtils ){
585         fUtils = new AliAnalysisUtils();
586     }
587     
588     //------------------------------------------------
589     // V0 Multiplicity Histograms
590     //------------------------------------------------
591     
592     // Create histograms
593     OpenFile(1);
594     fListHist = new TList();
595     fListHist->SetOwner();  // See http://root.cern.ch/root/html/TCollection.html#TCollection:SetOwner
596     
597     if(! fHistEventCounter ) {
598         //Histogram Output: Event-by-Event
599         fHistEventCounter = new TH1D( "fHistEventCounter", ";Evt. Sel. Step;Count",5,0,5);
600         fHistEventCounter->GetXaxis()->SetBinLabel(1, "Processed");
601         fHistEventCounter->GetXaxis()->SetBinLabel(2, "Phys-Sel");
602         fHistEventCounter->GetXaxis()->SetBinLabel(3, "Has Vtx");
603         fHistEventCounter->GetXaxis()->SetBinLabel(4, "Vtx |z|<10cm");
604         fHistEventCounter->GetXaxis()->SetBinLabel(5, "Isn't Pileup");
605         fListHist->Add(fHistEventCounter);
606     }
607     
608     //List of Histograms: Normal
609     PostData(1, fListHist);
610     
611     //TTree Object: Saved to base directory. Should cache to disk while saving.
612     //(Important to avoid excessive memory usage, particularly when merging)
613     PostData(2, fTreeEvent);
614     PostData(3, fTreeV0);
615     PostData(4, fTreeCascade);
616     
617 }// end UserCreateOutputObjects
618
619
620 //________________________________________________________________________
621 void AliAnalysisTaskStrangenessVsMultiplicity::UserExec(Option_t *)
622 {
623     // Main loop
624     // Called for each event
625     
626     AliESDEvent *lESDevent = 0x0;
627     
628     //Zero all booleans, etc
629     fEvSel_HasAtLeastSPDVertex    = kFALSE;
630     fEvSel_VtxZCut                = kFALSE;
631     fEvSel_IsNotPileup            = kFALSE;
632     fEvSel_IsNotPileupInMultBins  = kFALSE;
633     fEvSel_HasVtxContributor      = kFALSE;
634     fEvSel_Triggered              = kFALSE;
635     
636     fEvSel_nTracklets   = -1;
637     fEvSel_nSPDClusters = -1;
638     
639     // Connect to the InputEvent
640     // After these lines, we should have an ESD/AOD event + the number of V0s in it.
641     
642     // Appropriate for ESD analysis!
643     
644     lESDevent = dynamic_cast<AliESDEvent*>( InputEvent() );
645     if (!lESDevent) {
646         AliWarning("ERROR: lESDevent not available \n");
647         return;
648     }
649     
650     //Get VZERO Information for multiplicity later
651     AliVVZERO* esdV0 = lESDevent->GetVZEROData();
652     if (!esdV0) {
653         AliError("AliVVZERO not available");
654         return;
655     }
656     
657     fRunNumber = lESDevent->GetRunNumber();
658     
659     Double_t lMagneticField = -10;
660     lMagneticField = lESDevent->GetMagneticField( );
661     
662     //------------------------------------------------
663     // Variable Definition
664     //------------------------------------------------
665     
666     //------------------------------------------------
667     // Physics Selection
668     //------------------------------------------------
669     
670     fHistEventCounter->Fill(0.5);
671     
672     UInt_t maskIsSelected = ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected();
673     Bool_t isSelected = 0;
674     isSelected = (maskIsSelected & AliVEvent::kMB) == AliVEvent::kMB;
675     fEvSel_Triggered = isSelected;
676     
677     //Standard Min-Bias Selection - always do this!
678     if ( (! isSelected) && (! fkSkipEventSelection ) ) {
679         PostData(1, fListHist);
680         PostData(2, fTreeEvent);
681         PostData(3, fTreeV0);
682         PostData(4, fTreeCascade);
683         return;
684     }
685     
686     fHistEventCounter->Fill(1.5);
687     
688     //------------------------------------------------
689     // Primary Vertex Requirements Section:
690     //  ---> pp: has vertex, |z|<10cm
691     //------------------------------------------------
692     
693     //classical Proton-proton like selection
694     const AliESDVertex *lPrimaryBestESDVtx     = lESDevent->GetPrimaryVertex();
695     const AliESDVertex *lPrimaryTrackingESDVtx = lESDevent->GetPrimaryVertexTracks();
696     const AliESDVertex *lPrimarySPDVtx         = lESDevent->GetPrimaryVertexSPD();
697     
698     Double_t lBestPrimaryVtxPos[3]          = {-100.0, -100.0, -100.0};
699     lPrimaryBestESDVtx->GetXYZ( lBestPrimaryVtxPos );
700     
701     //Only accept if Tracking or SPD vertex is fine
702     if (!lPrimarySPDVtx->GetStatus() && !lPrimaryTrackingESDVtx->GetStatus() && !fkSkipEventSelection ){
703         AliWarning("Pb / No SPD prim. vertex nor prim. Tracking vertex ... return !");
704         PostData(1, fListHist);
705         PostData(2, fTreeEvent);
706         PostData(3, fTreeV0);
707         PostData(4, fTreeCascade);
708         return;
709     }
710     
711     if(! (!lPrimarySPDVtx->GetStatus() && !lPrimaryTrackingESDVtx->GetStatus()) ){
712         //Passed selection!
713         fEvSel_HasAtLeastSPDVertex = kTRUE;
714     }
715     
716     //Has SPD or Tracking Vertex
717     fHistEventCounter -> Fill(2.5);
718     
719     //Always do Primary Vertex Selection
720     if(TMath::Abs(lBestPrimaryVtxPos[2]) > 10.0 && !fkSkipEventSelection ) {
721         AliWarning("Pb / | Z position of Best Prim Vtx | > 10.0 cm ... return !");
722         PostData(1, fListHist);
723         PostData(2, fTreeEvent);
724         PostData(3, fTreeV0);
725         PostData(4, fTreeCascade);
726         return;
727     }
728     
729     if(TMath::Abs(lBestPrimaryVtxPos[2]) <= 10.0 ){
730         //Passed selection!
731         fEvSel_VtxZCut = kTRUE;
732     }
733     fEvSel_VtxZ = lBestPrimaryVtxPos[2] ; //Set
734     
735     //Fill Event selected counter
736     fHistEventCounter -> Fill(3.5);
737     
738     //------------------------------------------------
739     // Check if this isn't pileup
740     //------------------------------------------------
741     
742     if(lESDevent->IsPileupFromSPDInMultBins() && !fkSkipEventSelection ){
743         // minContributors=3, minZdist=0.8, nSigmaZdist=3., nSigmaDiamXY=2., nSigmaDiamZ=5.
744         //-> see http://alisoft.cern.ch/viewvc/trunk/STEER/AliESDEvent.h?root=AliRoot&r1=41914&r2=42199&pathrev=42199
745         AliWarning("Pb / Event tagged as pile-up by SPD... return !");
746         PostData(1, fListHist);
747         PostData(2, fTreeEvent);
748         PostData(3, fTreeV0);
749         PostData(4, fTreeCascade);
750         return;
751     }
752     
753     if( !lESDevent->IsPileupFromSPD()           ) fEvSel_IsNotPileup           = kTRUE;
754     if( !lESDevent->IsPileupFromSPDInMultBins() ) fEvSel_IsNotPileupInMultBins = kTRUE;
755     
756     //Acquire information to compute residual pileup
757     fEvSel_nSPDPrimVertices = lESDevent->GetNumberOfPileupVerticesSPD();
758     
759     //Long_t lNcontributorsSPDvtx = lPrimarySPDVtx -> GetNContributors();
760     Long_t lNcontributorsSecondLargest = -1;
761     Long_t lIndexSecondLargest = -1;
762     //Look for the two events with the largest numbers of contributors...
763     for(Int_t i=0; i<fEvSel_nSPDPrimVertices;i++){
764         const AliESDVertex* pv=lESDevent -> GetPileupVertexSPD(i);
765         if( pv->GetNContributors() > lNcontributorsSecondLargest ){
766             lNcontributorsSecondLargest = pv->GetNContributors();
767             lIndexSecondLargest = i;
768         }
769     }
770     const AliESDVertex* largestpv=lESDevent ->GetPileupVertexSPD(lIndexSecondLargest);
771     fEvSel_distZ = lPrimarySPDVtx->GetZ() - largestpv->GetZ();
772     
773     
774     //First implementation of pileup from multi-vertexer (simple use of analysis utils)
775     if ( !fUtils->IsPileUpMV( lESDevent ) ) fEvSel_IsNotPileupMV = kTRUE;
776     
777     //Fill Event isn't pileup counter
778     fHistEventCounter -> Fill(4.5);
779     
780     //------------------------------------------------
781     // Multiplicity Information Acquistion
782     //------------------------------------------------
783     
784     //Standard GetReferenceMultiplicity Estimator (0.5 and 0.8)
785     fRefMultEta5 = fESDtrackCuts->GetReferenceMultiplicity(lESDevent, AliESDtrackCuts::kTrackletsITSTPC,0.5);
786     fRefMultEta8 = fESDtrackCuts->GetReferenceMultiplicity(lESDevent, AliESDtrackCuts::kTrackletsITSTPC,0.8);
787     
788     // VZERO PART
789     Float_t  multV0A  = 0;            //  multiplicity from V0 reco side A
790     Float_t  multV0C  = 0;            //  multiplicity from V0 reco side C
791     Float_t  multV0AEq  = 0;          //  multiplicity from V0 reco side A
792     Float_t  multV0CEq  = 0;          //  multiplicity from V0 reco side C
793     Float_t  multV0ACorr  = 0;            //  multiplicity from V0 reco side A
794     Float_t  multV0CCorr  = 0;            //  multiplicity from V0 reco side C
795     
796     //Non-Equalized Signal: copy of multV0ACorr and multV0CCorr from AliCentralitySelectionTask
797     //Getters for uncorrected multiplicity
798     multV0A=esdV0->GetMTotV0A();
799     multV0C=esdV0->GetMTotV0C();
800     
801     //Get Z vertex position of SPD vertex (why not Tracking if available?)
802     Float_t zvtx = lPrimarySPDVtx->GetZ();
803     
804     //Acquire Corrected multV0A
805     multV0ACorr = AliESDUtils::GetCorrV0A(multV0A,zvtx);
806     multV0CCorr = AliESDUtils::GetCorrV0C(multV0C,zvtx);
807     
808     //Copy to Event Tree for extra information
809     fAmplitude_V0A = multV0ACorr;
810     fAmplitude_V0C = multV0CCorr;
811     
812     // Equalized signals // From AliCentralitySelectionTask // Updated
813     for(Int_t iCh = 32; iCh < 64; ++iCh) {
814         Double_t mult = lESDevent->GetVZEROEqMultiplicity(iCh);
815         multV0AEq += mult;
816     }
817     for(Int_t iCh = 0; iCh < 32; ++iCh) {
818         Double_t mult = lESDevent->GetVZEROEqMultiplicity(iCh);
819         multV0CEq += mult;
820     }
821     fAmplitude_V0AEq = multV0AEq;
822     fAmplitude_V0CEq = multV0CEq;
823     
824     fCentrality_V0A   = -100;
825     fCentrality_V0C   = -100;
826     fCentrality_V0M   = -100;
827     fCentrality_V0AEq = -100;
828     fCentrality_V0CEq = -100;
829     fCentrality_V0MEq = -100;
830     
831     //AliCentrality... Check if working?
832     AliCentrality* centrality;
833     centrality = lESDevent->GetCentrality();
834     if ( !(centrality->GetQuality()>1) ){
835         fCentrality_V0A   = centrality->GetCentralityPercentile( "V0A"   );
836         fCentrality_V0C   = centrality->GetCentralityPercentile( "V0C"   );
837         fCentrality_V0M   = centrality->GetCentralityPercentile( "V0M"   );
838         fCentrality_V0AEq = centrality->GetCentralityPercentile( "V0AEq" );
839         fCentrality_V0CEq = centrality->GetCentralityPercentile( "V0CEq" );
840         fCentrality_V0MEq = centrality->GetCentralityPercentile( "V0MEq" );
841     }
842     
843     //Cross-check/debug
844     fCustomCentrality_V0M   = fPPVsMultUtils->GetMultiplicityPercentile(lESDevent,"V0M");
845     fCustomCentrality_V0MEq = fPPVsMultUtils->GetMultiplicityPercentile(lESDevent,"V0MEq");
846     
847     //Tracklets vs Clusters Exploratory data
848     fEvSel_nTracklets     = lESDevent->GetMultiplicity()->GetNumberOfTracklets();
849     fEvSel_nSPDClusters   = lESDevent->GetNumberOfITSClusters(0) + lESDevent->GetNumberOfITSClusters(1);
850     
851     //Event-level fill
852     fTreeEvent->Fill() ;
853     
854     //STOP HERE if skipping event selections (no point in doing the rest...)
855     if( fkSkipEventSelection ){
856         PostData(1, fListHist);
857         PostData(2, fTreeEvent);
858         PostData(3, fTreeV0);
859         PostData(4, fTreeCascade);
860         return;
861     }
862     
863     //------------------------------------------------
864     
865     //------------------------------------------------
866     // Fill V0 Tree as needed
867     //------------------------------------------------
868     
869     //Variable definition
870     Int_t    lOnFlyStatus = 0;// nv0sOn = 0, nv0sOff = 0;
871     Double_t lChi2V0 = 0;
872     Double_t lDcaV0Daughters = 0, lDcaV0ToPrimVertex = 0;
873     Double_t lDcaPosToPrimVertex = 0, lDcaNegToPrimVertex = 0;
874     Double_t lV0CosineOfPointingAngle = 0;
875     Double_t lV0Radius = 0, lPt = 0;
876     Double_t lRapK0Short = 0, lRapLambda = 0;
877     Double_t lInvMassK0s = 0, lInvMassLambda = 0, lInvMassAntiLambda = 0;
878     Double_t lAlphaV0 = 0, lPtArmV0 = 0;
879     
880     Double_t fMinV0Pt = 0;
881     Double_t fMaxV0Pt = 100;
882     
883     Int_t nv0s = 0;
884     nv0s = lESDevent->GetNumberOfV0s();
885     
886     for (Int_t iV0 = 0; iV0 < nv0s; iV0++) //extra-crazy test
887     {// This is the begining of the V0 loop
888         AliESDv0 *v0 = ((AliESDEvent*)lESDevent)->GetV0(iV0);
889         if (!v0) continue;
890         
891         Double_t tDecayVertexV0[3]; v0->GetXYZ(tDecayVertexV0[0],tDecayVertexV0[1],tDecayVertexV0[2]);
892         
893         Double_t tV0mom[3];
894         v0->GetPxPyPz( tV0mom[0],tV0mom[1],tV0mom[2] );
895         Double_t lV0TotalMomentum = TMath::Sqrt(
896                                                 tV0mom[0]*tV0mom[0]+tV0mom[1]*tV0mom[1]+tV0mom[2]*tV0mom[2] );
897         
898         lV0Radius = TMath::Sqrt(tDecayVertexV0[0]*tDecayVertexV0[0]+tDecayVertexV0[1]*tDecayVertexV0[1]);
899         
900         lPt = v0->Pt();
901         lRapK0Short = v0->RapK0Short();
902         lRapLambda  = v0->RapLambda();
903         if ((lPt<fMinV0Pt)||(fMaxV0Pt<lPt)) continue;
904         
905         UInt_t lKeyPos = (UInt_t)TMath::Abs(v0->GetPindex());
906         UInt_t lKeyNeg = (UInt_t)TMath::Abs(v0->GetNindex());
907         
908         Double_t lMomPos[3]; v0->GetPPxPyPz(lMomPos[0],lMomPos[1],lMomPos[2]);
909         Double_t lMomNeg[3]; v0->GetNPxPyPz(lMomNeg[0],lMomNeg[1],lMomNeg[2]);
910         
911         AliESDtrack *pTrack=((AliESDEvent*)lESDevent)->GetTrack(lKeyPos);
912         AliESDtrack *nTrack=((AliESDEvent*)lESDevent)->GetTrack(lKeyNeg);
913         if (!pTrack || !nTrack) {
914             Printf("ERROR: Could not retreive one of the daughter track");
915             continue;
916         }
917         
918         //Daughter Eta for Eta selection, afterwards
919         fTreeVariableNegEta = nTrack->Eta();
920         fTreeVariablePosEta = pTrack->Eta();
921         
922         // Filter like-sign V0 (next: add counter and distribution)
923         if ( pTrack->GetSign() == nTrack->GetSign()){
924             continue;
925         }
926         
927         //________________________________________________________________________
928         // Track quality cuts
929         Float_t lPosTrackCrossedRows = pTrack->GetTPCClusterInfo(2,1);
930         Float_t lNegTrackCrossedRows = nTrack->GetTPCClusterInfo(2,1);
931         fTreeVariableLeastNbrCrossedRows = (Int_t) lPosTrackCrossedRows;
932         if( lNegTrackCrossedRows < fTreeVariableLeastNbrCrossedRows )
933             fTreeVariableLeastNbrCrossedRows = (Int_t) lNegTrackCrossedRows;
934         
935         // TPC refit condition (done during reconstruction for Offline but not for On-the-fly)
936         if( !(pTrack->GetStatus() & AliESDtrack::kTPCrefit)) continue;
937         if( !(nTrack->GetStatus() & AliESDtrack::kTPCrefit)) continue;
938         
939         
940         if ( ( ( pTrack->GetTPCClusterInfo(2,1) ) < 70 ) || ( ( nTrack->GetTPCClusterInfo(2,1) ) < 70 ) ) continue;
941         
942         //GetKinkIndex condition
943         if( pTrack->GetKinkIndex(0)>0 || nTrack->GetKinkIndex(0)>0 ) continue;
944         
945         //Findable clusters > 0 condition
946         if( pTrack->GetTPCNclsF()<=0 || nTrack->GetTPCNclsF()<=0 ) continue;
947         
948         //Compute ratio Crossed Rows / Findable clusters
949         //Note: above test avoids division by zero!
950         Float_t lPosTrackCrossedRowsOverFindable = lPosTrackCrossedRows / ((double)(pTrack->GetTPCNclsF()));
951         Float_t lNegTrackCrossedRowsOverFindable = lNegTrackCrossedRows / ((double)(nTrack->GetTPCNclsF()));
952         
953         fTreeVariableLeastRatioCrossedRowsOverFindable = lPosTrackCrossedRowsOverFindable;
954         if( lNegTrackCrossedRowsOverFindable < fTreeVariableLeastRatioCrossedRowsOverFindable )
955             fTreeVariableLeastRatioCrossedRowsOverFindable = lNegTrackCrossedRowsOverFindable;
956         
957         //Lowest Cut Level for Ratio Crossed Rows / Findable = 0.8, set here
958         if ( fTreeVariableLeastRatioCrossedRowsOverFindable < 0.8 ) continue;
959         
960         //End track Quality Cuts
961         //________________________________________________________________________
962         
963         lDcaPosToPrimVertex = TMath::Abs(pTrack->GetD(lBestPrimaryVtxPos[0],
964                                                       lBestPrimaryVtxPos[1],
965                                                       lMagneticField) );
966         
967         lDcaNegToPrimVertex = TMath::Abs(nTrack->GetD(lBestPrimaryVtxPos[0],
968                                                       lBestPrimaryVtxPos[1],
969                                                       lMagneticField) );
970         
971         lOnFlyStatus = v0->GetOnFlyStatus();
972         lChi2V0 = v0->GetChi2V0();
973         lDcaV0Daughters = v0->GetDcaV0Daughters();
974         lDcaV0ToPrimVertex = v0->GetD(lBestPrimaryVtxPos[0],lBestPrimaryVtxPos[1],lBestPrimaryVtxPos[2]);
975         lV0CosineOfPointingAngle = v0->GetV0CosineOfPointingAngle(lBestPrimaryVtxPos[0],lBestPrimaryVtxPos[1],lBestPrimaryVtxPos[2]);
976         fTreeVariableV0CosineOfPointingAngle=lV0CosineOfPointingAngle;
977         
978         // Getting invariant mass infos directly from ESD
979         v0->ChangeMassHypothesis(310);
980         lInvMassK0s = v0->GetEffMass();
981         v0->ChangeMassHypothesis(3122);
982         lInvMassLambda = v0->GetEffMass();
983         v0->ChangeMassHypothesis(-3122);
984         lInvMassAntiLambda = v0->GetEffMass();
985         lAlphaV0 = v0->AlphaV0();
986         lPtArmV0 = v0->PtArmV0();
987         
988         fTreeVariablePt = v0->Pt();
989         fTreeVariableChi2V0 = lChi2V0;
990         fTreeVariableDcaV0ToPrimVertex = lDcaV0ToPrimVertex;
991         fTreeVariableDcaV0Daughters = lDcaV0Daughters;
992         fTreeVariableV0CosineOfPointingAngle = lV0CosineOfPointingAngle;
993         fTreeVariableV0Radius = lV0Radius;
994         fTreeVariableDcaPosToPrimVertex = lDcaPosToPrimVertex;
995         fTreeVariableDcaNegToPrimVertex = lDcaNegToPrimVertex;
996         fTreeVariableInvMassK0s = lInvMassK0s;
997         fTreeVariableInvMassLambda = lInvMassLambda;
998         fTreeVariableInvMassAntiLambda = lInvMassAntiLambda;
999         fTreeVariableRapK0Short = lRapK0Short;
1000         fTreeVariableRapLambda = lRapLambda;
1001         fTreeVariableAlphaV0 = lAlphaV0;
1002         fTreeVariablePtArmV0 = lPtArmV0;
1003         
1004         //Official means of acquiring N-sigmas
1005         fTreeVariableNSigmasPosProton = fPIDResponse->NumberOfSigmasTPC( pTrack, AliPID::kProton );
1006         fTreeVariableNSigmasPosPion   = fPIDResponse->NumberOfSigmasTPC( pTrack, AliPID::kPion );
1007         fTreeVariableNSigmasNegProton = fPIDResponse->NumberOfSigmasTPC( nTrack, AliPID::kProton );
1008         fTreeVariableNSigmasNegPion   = fPIDResponse->NumberOfSigmasTPC( nTrack, AliPID::kPion );
1009         
1010         //This requires an Invariant Mass Hypothesis afterwards
1011         fTreeVariableDistOverTotMom = TMath::Sqrt(
1012                                                   TMath::Power( tDecayVertexV0[0] - lBestPrimaryVtxPos[0] , 2) +
1013                                                   TMath::Power( tDecayVertexV0[1] - lBestPrimaryVtxPos[1] , 2) +
1014                                                   TMath::Power( tDecayVertexV0[2] - lBestPrimaryVtxPos[2] , 2)
1015                                                   );
1016         fTreeVariableDistOverTotMom /= (lV0TotalMomentum+1e-10); //avoid division by zero, to be sure
1017         
1018         //Copy Multiplicity information
1019         fTreeVariableCentV0A = fCentrality_V0A;
1020         fTreeVariableCentV0C = fCentrality_V0C;
1021         fTreeVariableCentV0M = fCentrality_V0M;
1022         fTreeVariableCentV0AEq = fCentrality_V0AEq;
1023         fTreeVariableCentV0CEq = fCentrality_V0CEq;
1024         fTreeVariableCentV0MEq = fCentrality_V0MEq;
1025         fTreeVariableAmpV0A = fAmplitude_V0A;
1026         fTreeVariableAmpV0C = fAmplitude_V0C;
1027         fTreeVariableAmpV0AEq = fAmplitude_V0AEq;
1028         fTreeVariableAmpV0CEq = fAmplitude_V0CEq;
1029         fTreeVariableRefMultEta8 = fRefMultEta8;
1030         fTreeVariableRefMultEta5 = fRefMultEta5;
1031         fTreeVariableRunNumber = fRunNumber;
1032         
1033         //------------------------------------------------
1034         // Fill Tree!
1035         //------------------------------------------------
1036         
1037         // The conditionals are meant to decrease excessive
1038         // memory usage!
1039         
1040         //First Selection: Reject OnFly
1041         if( lOnFlyStatus == 0 ){
1042             //Second Selection: rough 20-sigma band, parametric.
1043             //K0Short: Enough to parametrize peak broadening with linear function.
1044             Double_t lUpperLimitK0Short = (5.63707e-01) + (1.14979e-02)*fTreeVariablePt;
1045             Double_t lLowerLimitK0Short = (4.30006e-01) - (1.10029e-02)*fTreeVariablePt;
1046             //Lambda: Linear (for higher pt) plus exponential (for low-pt broadening)
1047             //[0]+[1]*x+[2]*TMath::Exp(-[3]*x)
1048             Double_t lUpperLimitLambda = (1.13688e+00) + (5.27838e-03)*fTreeVariablePt + (8.42220e-02)*TMath::Exp(-(3.80595e+00)*fTreeVariablePt);
1049             Double_t lLowerLimitLambda = (1.09501e+00) - (5.23272e-03)*fTreeVariablePt - (7.52690e-02)*TMath::Exp(-(3.46339e+00)*fTreeVariablePt);
1050             //Do Selection
1051             if( (fTreeVariableInvMassLambda    < lUpperLimitLambda  && fTreeVariableInvMassLambda     > lLowerLimitLambda     ) ||
1052                (fTreeVariableInvMassAntiLambda < lUpperLimitLambda  && fTreeVariableInvMassAntiLambda > lLowerLimitLambda     ) ||
1053                (fTreeVariableInvMassK0s        < lUpperLimitK0Short && fTreeVariableInvMassK0s        > lLowerLimitK0Short    ) ){
1054                 //Pre-selection in case this is AA...
1055                 if ( TMath::Abs(fTreeVariableNegEta)<0.8 && TMath::Abs(fTreeVariablePosEta)<0.8 && fkSaveV0Tree ) fTreeV0->Fill();
1056             }
1057         }
1058     }// This is the end of the V0 loop
1059     
1060     //------------------------------------------------
1061     // Fill V0 tree over.
1062     //------------------------------------------------
1063     
1064     
1065     
1066     //------------------------------------------------
1067     // Rerun cascade vertexer!
1068     //------------------------------------------------
1069     
1070     if( fkRunVertexers ){
1071         lESDevent->ResetCascades();
1072         lESDevent->ResetV0s();
1073         
1074         AliV0vertexer lV0vtxer;
1075         AliCascadeVertexer lCascVtxer;
1076         
1077         lV0vtxer.SetDefaultCuts(fV0VertexerSels);
1078         lCascVtxer.SetDefaultCuts(fCascadeVertexerSels);
1079         
1080         lV0vtxer.Tracks2V0vertices(lESDevent);
1081         lCascVtxer.V0sTracks2CascadeVertices(lESDevent);
1082     }
1083     
1084     //------------------------------------------------
1085     // MAIN CASCADE LOOP STARTS HERE
1086     //------------------------------------------------
1087     // Code Credit: Antonin Maire (thanks^100)
1088     // ---> This is an adaptation
1089     
1090     Long_t ncascades = 0;
1091         ncascades = lESDevent->GetNumberOfCascades();
1092     
1093     for (Int_t iXi = 0; iXi < ncascades; iXi++){
1094         //------------------------------------------------
1095         // Initializations
1096         //------------------------------------------------
1097         //Double_t lTrkgPrimaryVtxRadius3D = -500.0;
1098         //Double_t lBestPrimaryVtxRadius3D = -500.0;
1099         
1100         // - 1st part of initialisation : variables needed to store AliESDCascade data members
1101         Double_t lEffMassXi      = 0. ;
1102         //Double_t lChi2Xi         = -1. ;
1103         Double_t lDcaXiDaughters = -1. ;
1104         Double_t lXiCosineOfPointingAngle = -1. ;
1105         Double_t lPosXi[3] = { -1000.0, -1000.0, -1000.0 };
1106         Double_t lXiRadius = -1000. ;
1107         
1108         // - 2nd part of initialisation : Nbr of clusters within TPC for the 3 daughter cascade tracks
1109         Int_t    lPosTPCClusters    = -1; // For ESD only ...//FIXME : wait for availability in AOD
1110         Int_t    lNegTPCClusters    = -1; // For ESD only ...
1111         Int_t    lBachTPCClusters   = -1; // For ESD only ...
1112         
1113         // - 3rd part of initialisation : about V0 part in cascades
1114         Double_t lInvMassLambdaAsCascDghter = 0.;
1115         //Double_t lV0Chi2Xi         = -1. ;
1116         Double_t lDcaV0DaughtersXi = -1.;
1117                 
1118         Double_t lDcaBachToPrimVertexXi = -1., lDcaV0ToPrimVertexXi = -1.;
1119         Double_t lDcaPosToPrimVertexXi  = -1.;
1120         Double_t lDcaNegToPrimVertexXi  = -1.;
1121         Double_t lV0CosineOfPointingAngleXi = -1. ;
1122         Double_t lV0CosineOfPointingAngleXiSpecial = -1. ;
1123         Double_t lPosV0Xi[3] = { -1000. , -1000., -1000. }; // Position of VO coming from cascade
1124         Double_t lV0RadiusXi = -1000.0;
1125         Double_t lV0quality  = 0.;
1126         
1127         // - 4th part of initialisation : Effective masses
1128         Double_t lInvMassXiMinus    = 0.;
1129         Double_t lInvMassXiPlus     = 0.;
1130         Double_t lInvMassOmegaMinus = 0.;
1131         Double_t lInvMassOmegaPlus  = 0.;
1132         
1133         // - 6th part of initialisation : extra info for QA
1134         Double_t lXiMomX       = 0. , lXiMomY = 0., lXiMomZ = 0.;
1135         Double_t lXiTransvMom  = 0. ;
1136         //Double_t lXiTransvMomMC= 0. ;
1137         Double_t lXiTotMom     = 0. ;
1138                 
1139         Double_t lBachMomX       = 0., lBachMomY  = 0., lBachMomZ   = 0.;
1140         //Double_t lBachTransvMom  = 0.;
1141         //Double_t lBachTotMom     = 0.;
1142         
1143         fTreeCascVarNegNSigmaPion   = -100;
1144         fTreeCascVarNegNSigmaProton = -100;
1145         fTreeCascVarPosNSigmaPion   = -100;
1146         fTreeCascVarPosNSigmaProton = -100;
1147         fTreeCascVarBachNSigmaPion  = -100;
1148         fTreeCascVarBachNSigmaKaon  = -100;
1149         
1150         Short_t  lChargeXi = -2;
1151         //Double_t lV0toXiCosineOfPointingAngle = 0. ;
1152         
1153         Double_t lRapXi   = -20.0, lRapOmega = -20.0; //  lEta = -20.0, lTheta = 360., lPhi = 720. ;
1154         //Double_t lAlphaXi = -200., lPtArmXi  = -200.0;
1155             
1156         // -------------------------------------
1157         // II.ESD - Calculation Part dedicated to Xi vertices (ESD)
1158         
1159         AliESDcascade *xi = lESDevent->GetCascade(iXi);
1160         if (!xi) continue;
1161         
1162                 // - II.Step 2 : Assigning the necessary variables for specific AliESDcascade data members (ESD)
1163                 //-------------
1164         lV0quality = 0.;
1165         xi->ChangeMassHypothesis(lV0quality , 3312); // default working hypothesis : cascade = Xi- decay
1166         
1167         lEffMassXi                      = xi->GetEffMassXi();
1168         //lChi2Xi                           = xi->GetChi2Xi();
1169         lDcaXiDaughters         = xi->GetDcaXiDaughters();
1170         lXiCosineOfPointingAngle                    = xi->GetCascadeCosineOfPointingAngle( lBestPrimaryVtxPos[0],
1171                                                                                       lBestPrimaryVtxPos[1],
1172                                                                                       lBestPrimaryVtxPos[2] );
1173         // Take care : the best available vertex should be used (like in AliCascadeVertexer)
1174         
1175         xi->GetXYZcascade( lPosXi[0],  lPosXi[1], lPosXi[2] );
1176         lXiRadius                       = TMath::Sqrt( lPosXi[0]*lPosXi[0]  +  lPosXi[1]*lPosXi[1] );
1177         
1178                 // - II.Step 3 : around the tracks : Bach + V0 (ESD)
1179                 // ~ Necessary variables for ESDcascade data members coming from the ESDv0 part (inheritance)
1180                 //-------------
1181                 
1182         UInt_t lIdxPosXi        = (UInt_t) TMath::Abs( xi->GetPindex() );
1183         UInt_t lIdxNegXi        = (UInt_t) TMath::Abs( xi->GetNindex() );
1184         UInt_t lBachIdx         = (UInt_t) TMath::Abs( xi->GetBindex() );
1185         // Care track label can be negative in MC production (linked with the track quality)
1186         // However = normally, not the case for track index ...
1187         
1188         // FIXME : rejection of a double use of a daughter track (nothing but just a crosscheck of what is done in the cascade vertexer)
1189         if(lBachIdx == lIdxNegXi) {
1190             AliWarning("Pb / Idx(Bach. track) = Idx(Neg. track) ... continue!"); continue;
1191         }
1192         if(lBachIdx == lIdxPosXi) {
1193             AliWarning("Pb / Idx(Bach. track) = Idx(Pos. track) ... continue!"); continue;
1194         }
1195         
1196         AliESDtrack *pTrackXi           = lESDevent->GetTrack( lIdxPosXi );
1197         AliESDtrack *nTrackXi           = lESDevent->GetTrack( lIdxNegXi );
1198         AliESDtrack *bachTrackXi        = lESDevent->GetTrack( lBachIdx );
1199         
1200         if (!pTrackXi || !nTrackXi || !bachTrackXi ) {
1201             AliWarning("ERROR: Could not retrieve one of the 3 ESD daughter tracks of the cascade ...");
1202             continue;
1203         }
1204         
1205         fTreeCascVarPosEta = pTrackXi->Eta();
1206         fTreeCascVarNegEta = nTrackXi->Eta();
1207         fTreeCascVarBachEta = bachTrackXi->Eta();
1208         
1209         Double_t lBMom[3], lNMom[3], lPMom[3];
1210         xi->GetBPxPyPz( lBMom[0], lBMom[1], lBMom[2] );
1211         xi->GetPPxPyPz( lPMom[0], lPMom[1], lPMom[2] );
1212         xi->GetNPxPyPz( lNMom[0], lNMom[1], lNMom[2] );
1213         
1214         //fTreeCascVarBachTransMom = TMath::Sqrt( lBMom[0]*lBMom[0] + lBMom[1]*lBMom[1] );
1215         //fTreeCascVarPosTransMom  = TMath::Sqrt( lPMom[0]*lPMom[0] + lPMom[1]*lPMom[1] );
1216         //fTreeCascVarNegTransMom  = TMath::Sqrt( lNMom[0]*lNMom[0] + lNMom[1]*lNMom[1] );
1217         
1218         //------------------------------------------------
1219         // TPC dEdx information
1220         //------------------------------------------------
1221         fTreeCascVarNegNSigmaPion   = fPIDResponse->NumberOfSigmasTPC( nTrackXi, AliPID::kPion   );
1222         fTreeCascVarNegNSigmaProton = fPIDResponse->NumberOfSigmasTPC( nTrackXi, AliPID::kProton );
1223         fTreeCascVarPosNSigmaPion   = fPIDResponse->NumberOfSigmasTPC( pTrackXi, AliPID::kPion );
1224         fTreeCascVarPosNSigmaProton = fPIDResponse->NumberOfSigmasTPC( pTrackXi, AliPID::kProton );
1225         fTreeCascVarBachNSigmaPion  = fPIDResponse->NumberOfSigmasTPC( bachTrackXi, AliPID::kPion );
1226         fTreeCascVarBachNSigmaKaon  = fPIDResponse->NumberOfSigmasTPC( bachTrackXi, AliPID::kKaon );
1227         
1228         //------------------------------------------------
1229         // TPC Number of clusters info
1230         // --- modified to save the smallest number
1231         // --- of TPC clusters for the 3 tracks
1232         //------------------------------------------------
1233         
1234         lPosTPCClusters   = pTrackXi->GetTPCNcls();
1235         lNegTPCClusters   = nTrackXi->GetTPCNcls();
1236         lBachTPCClusters  = bachTrackXi->GetTPCNcls();
1237         
1238         // 1 - Poor quality related to TPCrefit
1239         ULong_t pStatus    = pTrackXi->GetStatus();
1240         ULong_t nStatus    = nTrackXi->GetStatus();
1241         ULong_t bachStatus = bachTrackXi->GetStatus();
1242         
1243         //fTreeCascVarkITSRefitBachelor = kTRUE;
1244         //fTreeCascVarkITSRefitNegative = kTRUE;
1245         //fTreeCascVarkITSRefitPositive = kTRUE;
1246         
1247         if ((pStatus&AliESDtrack::kTPCrefit)    == 0) { AliWarning("Pb / V0 Pos. track has no TPCrefit ... continue!"); continue; }
1248         if ((nStatus&AliESDtrack::kTPCrefit)    == 0) { AliWarning("Pb / V0 Neg. track has no TPCrefit ... continue!"); continue; }
1249         if ((bachStatus&AliESDtrack::kTPCrefit) == 0) { AliWarning("Pb / Bach.   track has no TPCrefit ... continue!"); continue; }
1250         
1251         // 2 - Poor quality related to TPC clusters: lowest cut of 70 clusters
1252         if(lPosTPCClusters  < 70) { AliWarning("Pb / V0 Pos. track has less than 70 TPC clusters ... continue!"); continue; }
1253         if(lNegTPCClusters  < 70) { AliWarning("Pb / V0 Neg. track has less than 70 TPC clusters ... continue!"); continue; }
1254         if(lBachTPCClusters < 70) { AliWarning("Pb / Bach.   track has less than 70 TPC clusters ... continue!"); continue; }
1255         Int_t leastnumberofclusters = 1000;
1256         if( lPosTPCClusters < leastnumberofclusters ) leastnumberofclusters = lPosTPCClusters;
1257         if( lNegTPCClusters < leastnumberofclusters ) leastnumberofclusters = lNegTPCClusters;
1258         if( lBachTPCClusters < leastnumberofclusters ) leastnumberofclusters = lBachTPCClusters;
1259         
1260         lInvMassLambdaAsCascDghter      = xi->GetEffMass();
1261         // This value shouldn't change, whatever the working hyp. is : Xi-, Xi+, Omega-, Omega+
1262         lDcaV0DaughtersXi               = xi->GetDcaV0Daughters();
1263         //lV0Chi2Xi                     = xi->GetChi2V0();
1264         
1265         lV0CosineOfPointingAngleXi      = xi->GetV0CosineOfPointingAngle( lBestPrimaryVtxPos[0],
1266                                                                      lBestPrimaryVtxPos[1],
1267                                                                      lBestPrimaryVtxPos[2] );
1268         //Modification: V0 CosPA wrt to Cascade decay vertex
1269         lV0CosineOfPointingAngleXiSpecial       = xi->GetV0CosineOfPointingAngle( lPosXi[0],
1270                                                                              lPosXi[1],
1271                                                                              lPosXi[2] );
1272         
1273         lDcaV0ToPrimVertexXi            = xi->GetD( lBestPrimaryVtxPos[0],
1274                                                lBestPrimaryVtxPos[1],
1275                                                lBestPrimaryVtxPos[2] );
1276                 
1277         lDcaBachToPrimVertexXi = TMath::Abs( bachTrackXi->GetD( lBestPrimaryVtxPos[0],
1278                                                                lBestPrimaryVtxPos[1],
1279                                                                lMagneticField  ) );
1280         // Note : AliExternalTrackParam::GetD returns an algebraic value ...
1281                 
1282         xi->GetXYZ( lPosV0Xi[0],  lPosV0Xi[1], lPosV0Xi[2] );
1283         lV0RadiusXi             = TMath::Sqrt( lPosV0Xi[0]*lPosV0Xi[0]  +  lPosV0Xi[1]*lPosV0Xi[1] );
1284         
1285         lDcaPosToPrimVertexXi   = TMath::Abs( pTrackXi  ->GetD( lBestPrimaryVtxPos[0],
1286                                                                lBestPrimaryVtxPos[1],
1287                                                                lMagneticField  )     );
1288         
1289         lDcaNegToPrimVertexXi   = TMath::Abs( nTrackXi  ->GetD( lBestPrimaryVtxPos[0],
1290                                                                lBestPrimaryVtxPos[1],
1291                                                                lMagneticField  )     );
1292                 
1293         // - II.Step 4 : around effective masses (ESD)
1294         // ~ change mass hypotheses to cover all the possibilities :  Xi-/+, Omega -/+
1295                 
1296         if( bachTrackXi->Charge() < 0 ) {
1297             lV0quality = 0.;
1298             xi->ChangeMassHypothesis(lV0quality , 3312);
1299             // Calculate the effective mass of the Xi- candidate.
1300             // pdg code 3312 = Xi-
1301             lInvMassXiMinus = xi->GetEffMassXi();
1302             
1303             lV0quality = 0.;
1304             xi->ChangeMassHypothesis(lV0quality , 3334);
1305             // Calculate the effective mass of the Xi- candidate.
1306             // pdg code 3334 = Omega-
1307             lInvMassOmegaMinus = xi->GetEffMassXi();
1308             
1309             lV0quality = 0.;
1310             xi->ChangeMassHypothesis(lV0quality , 3312);        // Back to default hyp.
1311         }// end if negative bachelor
1312         
1313         
1314         if( bachTrackXi->Charge() >  0 ){
1315             lV0quality = 0.;
1316             xi->ChangeMassHypothesis(lV0quality , -3312);
1317             // Calculate the effective mass of the Xi+ candidate.
1318             // pdg code -3312 = Xi+
1319             lInvMassXiPlus = xi->GetEffMassXi();
1320             
1321             lV0quality = 0.;
1322             xi->ChangeMassHypothesis(lV0quality , -3334);
1323             // Calculate the effective mass of the Xi+ candidate.
1324             // pdg code -3334  = Omega+
1325             lInvMassOmegaPlus = xi->GetEffMassXi();
1326             
1327             lV0quality = 0.;
1328             xi->ChangeMassHypothesis(lV0quality , -3312);       // Back to "default" hyp.
1329         }// end if positive bachelor
1330         // - II.Step 6 : extra info for QA (ESD)
1331         // miscellaneous pieces of info that may help regarding data quality assessment.
1332         //-------------
1333         
1334         xi->GetPxPyPz( lXiMomX, lXiMomY, lXiMomZ );
1335         lXiTransvMom    = TMath::Sqrt( lXiMomX*lXiMomX   + lXiMomY*lXiMomY );
1336         lXiTotMom       = TMath::Sqrt( lXiMomX*lXiMomX   + lXiMomY*lXiMomY   + lXiMomZ*lXiMomZ );
1337                 
1338         xi->GetBPxPyPz(  lBachMomX,  lBachMomY,  lBachMomZ );
1339         //lBachTransvMom  = TMath::Sqrt( lBachMomX*lBachMomX   + lBachMomY*lBachMomY );
1340         //lBachTotMom   = TMath::Sqrt( lBachMomX*lBachMomX   + lBachMomY*lBachMomY  +  lBachMomZ*lBachMomZ  );
1341         
1342         lChargeXi = xi->Charge();
1343         
1344         //lV0toXiCosineOfPointingAngle = xi->GetV0CosineOfPointingAngle( lPosXi[0], lPosXi[1], lPosXi[2] );
1345         
1346         lRapXi    = xi->RapXi();
1347         lRapOmega = xi->RapOmega();
1348         //lEta      = xi->Eta();
1349         //lTheta    = xi->Theta() *180.0/TMath::Pi();
1350         //lPhi      = xi->Phi()   *180.0/TMath::Pi();
1351         //lAlphaXi  = xi->AlphaXi();
1352         //lPtArmXi  = xi->PtArmXi();
1353         
1354         //------------------------------------------------
1355         // Set Variables for adding to tree
1356         //------------------------------------------------
1357         
1358         fTreeCascVarCharge      = lChargeXi;
1359         if(lInvMassXiMinus!=0)    fTreeCascVarMassAsXi = lInvMassXiMinus;
1360         if(lInvMassXiPlus!=0)     fTreeCascVarMassAsXi = lInvMassXiPlus;
1361         if(lInvMassOmegaMinus!=0) fTreeCascVarMassAsOmega = lInvMassOmegaMinus;
1362         if(lInvMassOmegaPlus!=0)  fTreeCascVarMassAsOmega = lInvMassOmegaPlus;
1363         fTreeCascVarPt = lXiTransvMom;
1364         fTreeCascVarRapXi = lRapXi ;
1365         fTreeCascVarRapOmega = lRapOmega ;
1366         fTreeCascVarDCACascDaughters = lDcaXiDaughters;
1367         fTreeCascVarDCABachToPrimVtx = lDcaBachToPrimVertexXi;
1368         fTreeCascVarDCAV0Daughters = lDcaV0DaughtersXi;
1369         fTreeCascVarDCAV0ToPrimVtx = lDcaV0ToPrimVertexXi;
1370         fTreeCascVarDCAPosToPrimVtx = lDcaPosToPrimVertexXi;
1371         fTreeCascVarDCANegToPrimVtx = lDcaNegToPrimVertexXi;
1372         fTreeCascVarCascCosPointingAngle = lXiCosineOfPointingAngle;
1373         fTreeCascVarCascRadius = lXiRadius;
1374         fTreeCascVarV0Mass = lInvMassLambdaAsCascDghter;
1375         fTreeCascVarV0CosPointingAngle = lV0CosineOfPointingAngleXi;
1376         fTreeCascVarV0CosPointingAngleSpecial = lV0CosineOfPointingAngleXiSpecial;
1377         fTreeCascVarV0Radius = lV0RadiusXi;
1378         fTreeCascVarLeastNbrClusters = leastnumberofclusters;
1379         
1380         //Copy Multiplicity information 
1381         fTreeCascVarCentV0A = fCentrality_V0A; 
1382         fTreeCascVarCentV0C = fCentrality_V0C; 
1383         fTreeCascVarCentV0M = fCentrality_V0M; 
1384         fTreeCascVarCentV0AEq = fCentrality_V0AEq; 
1385         fTreeCascVarCentV0CEq = fCentrality_V0CEq; 
1386         fTreeCascVarCentV0MEq = fCentrality_V0MEq; 
1387         fTreeCascVarAmpV0A = fAmplitude_V0A; 
1388         fTreeCascVarAmpV0C = fAmplitude_V0C; 
1389         fTreeCascVarAmpV0AEq = fAmplitude_V0AEq; 
1390         fTreeCascVarAmpV0CEq = fAmplitude_V0CEq; 
1391         fTreeCascVarRefMultEta8 = fRefMultEta8;
1392         fTreeCascVarRefMultEta5 = fRefMultEta5;
1393         fTreeCascVarRunNumber = fRunNumber; 
1394         
1395         fTreeCascVarDistOverTotMom = TMath::Sqrt(
1396                                                  TMath::Power( lPosXi[0] - lBestPrimaryVtxPos[0] , 2) +
1397                                                  TMath::Power( lPosXi[1] - lBestPrimaryVtxPos[1] , 2) +
1398                                                  TMath::Power( lPosXi[2] - lBestPrimaryVtxPos[2] , 2)
1399                                                  );
1400         fTreeCascVarDistOverTotMom /= (lXiTotMom+1e-13);
1401         
1402         //All vars not specified here: specified elsewhere!
1403         
1404         //------------------------------------------------
1405         // Fill Tree! 
1406         //------------------------------------------------
1407         
1408         // The conditional is meant to decrease excessive
1409         // memory usage! Be careful when loosening the 
1410         // cut!
1411         
1412         //Xi    Mass window: 150MeV wide
1413         //Omega mass window: 150MeV wide
1414         
1415         if( fkSaveCascadeTree && ( (fTreeCascVarMassAsXi<1.32+0.075&&fTreeCascVarMassAsXi>1.32-0.075) ||
1416                                   (fTreeCascVarMassAsOmega<1.68+0.075&&fTreeCascVarMassAsOmega>1.68-0.075) ) ){
1417             fTreeCascade->Fill();
1418         }
1419         
1420         //------------------------------------------------
1421         // Fill tree over.
1422         //------------------------------------------------
1423         
1424         }// end of the Cascade loop (ESD or AOD)
1425     
1426     // Post output data.
1427     PostData(1, fListHist); 
1428     PostData(2, fTreeEvent);
1429     PostData(3, fTreeV0);
1430     PostData(4, fTreeCascade);
1431 }
1432
1433 //________________________________________________________________________
1434 void AliAnalysisTaskStrangenessVsMultiplicity::Terminate(Option_t *)
1435 {
1436     // Draw result to the screen
1437     // Called once at the end of the query
1438     
1439     TList *cRetrievedList = 0x0;
1440     cRetrievedList = (TList*)GetOutputData(1);
1441     if(!cRetrievedList){
1442         Printf("ERROR - AliAnalysisTaskStrangenessVsMultiplicity : ouput data container list not available\n");
1443         return;
1444     }   
1445         
1446     fHistEventCounter = dynamic_cast<TH1D*> (  cRetrievedList->FindObject("fHistEventCounter")  );
1447     if (!fHistEventCounter) {
1448         Printf("ERROR - AliAnalysisTaskStrangenessVsMultiplicity : fHistEventCounter not available");
1449         return;
1450     }
1451     
1452     TCanvas *canCheck = new TCanvas("AliAnalysisTaskStrangenessVsMultiplicity","V0 Multiplicity",10,10,510,510);
1453     canCheck->cd(1)->SetLogy();
1454     
1455     fHistEventCounter->SetMarkerStyle(22);
1456     fHistEventCounter->DrawCopy("E");
1457 }
1458
1459 //----------------------------------------------------------------------------
1460
1461 Double_t AliAnalysisTaskStrangenessVsMultiplicity::MyRapidity(Double_t rE, Double_t rPz) const
1462 {
1463     // Local calculation for rapidity
1464     Double_t ReturnValue = -100;
1465     if( (rE-rPz+1.e-13) != 0 && (rE+rPz) != 0 ){ 
1466         ReturnValue =  0.5*TMath::Log((rE+rPz)/(rE-rPz+1.e-13));
1467     }
1468     return ReturnValue;
1469