Cascade analysis code moved in Cascades folder
[u/mrichter/AliRoot.git] / PWGLF / STRANGENESS / Cascades / AliAnalysisTaskCheckCascade.cxx
1
2 /**************************************************************************
3  *  Authors : Antonin Maire, Boris Hippolyte                              *
4  * Contributors are mentioned in the code where appropriate.              *
5  *                                                                        *
6  * Permission to use, copy, modify and distribute this software and its   *
7  * documentation strictly for non-commercial purposes is hereby granted   *
8  * without fee, provided that the above copyright notice appears in all   *
9  * copies and that both the copyright notice and this permission notice   *
10  * appear in the supporting documentation. The authors make no claims     *
11  * about the suitability of this software for any purpose. It is          *
12  * provided "as is" without express or implied warranty.                  *
13  **************************************************************************/
14
15 //-----------------------------------------------------------------
16 //                 AliAnalysisTaskCheckCascade class
17 //            (AliAnalysisTaskCheckCascade)
18 //            This task has four roles :
19 //              1. QAing the Cascades from ESD and AOD
20 //                 Origin:  AliAnalysisTaskESDCheckV0 by B.H. Nov2007, hippolyt@in2p3.fr
21 //              2. Prepare the plots which stand as raw material for yield extraction (wi/wo PID)
22 //              3. Supply an AliCFContainer meant to define the optimised topological selections
23 //              4. Rough azimuthal correlation study (Eta, Phi)
24 //            Adapted to Cascade : A.Maire Mar2008, antonin.maire@ires.in2p3.fr
25 //            Modified :           A.Maire Nov2010, antonin.maire@ires.in2p3.fr
26 //-----------------------------------------------------------------
27
28
29
30 class TTree;
31 class TParticle;
32
33 //class AliMCEventHandler;
34 //class AliMCEvent;
35 //class AliStack;
36
37 class AliESDVertex;
38 class AliAODVertex;
39 class AliESDv0;
40 class AliAODv0;
41
42 #include <Riostream.h>
43 #include "TList.h"
44 #include "TH1.h"
45 #include "TH2.h"
46 #include "TH3.h"
47 //#include "THnSparse.h"
48 #include "TVector3.h"
49 #include "TCanvas.h"
50 #include "TMath.h"
51 #include "TLegend.h"
52
53
54 #include "AliLog.h"
55
56 #include "AliESDEvent.h"
57 #include "AliAODEvent.h"
58 //     #include "AliV0vertexer.h"
59 //     #include "AliCascadeVertexer.h"
60 #include "AliESDpid.h"
61 #include "AliESDtrackCuts.h"
62
63 #include "AliInputEventHandler.h"
64 #include "AliAnalysisManager.h"
65 #include "AliMCEventHandler.h"
66
67 #include "AliCFContainer.h"
68 #include "AliMultiplicity.h"
69
70 #include "AliESDcascade.h"
71 #include "AliAODcascade.h"
72
73 #include "AliAnalysisTaskCheckCascade.h"
74
75 ClassImp(AliAnalysisTaskCheckCascade)
76
77
78
79 //________________________________________________________________________
80 AliAnalysisTaskCheckCascade::AliAnalysisTaskCheckCascade() 
81   : AliAnalysisTaskSE(), fAnalysisType("ESD"), fTriggerMaskType("kMB"), fCollidingSystems(0), fESDpid(0), fESDtrackCuts(0), /*fPaveTextBookKeeping(0),*/
82     fkRerunV0CascVertexers         (0),
83     fkQualityCutZprimVtxPos        (kTRUE),
84     fkRejectEventPileUp            (kTRUE),
85     fkQualityCutNoTPConlyPrimVtx   (kTRUE),
86     fkQualityCutTPCrefit           (kTRUE),
87     fkQualityCut80TPCcls           (kTRUE),
88     fkIsDataRecoWith1PadTPCCluster (kTRUE),
89     fkExtraSelections              (0),
90     fAngularCorrelationType        ("TrigLeadingTrck-AssoCasc"),
91
92         // - Cascade part initialisation
93     fListHistCascade(0),
94     fHistCascadeMultiplicityBeforeTrigSel(0),
95     fHistCascadeMultiplicityForTrigEvt(0), fHistTrackMultiplicityForTrigEvt(0), fHistTPCrefitTrackMultiplicityForTrigEvt(0), fHistPrimaryTrackMultiplicityForTrigEvt(0), 
96     fHistEstimateITSTPCMultiplicityForTrigEvt(0),
97     fHistCascadeMultiplicityForTrigEvtAndZprimVtx(0), fHistCascadeMultiplicityForTrigEvtNonPiledUpAndZprimVtx(0),
98     fHistCascadeMultiplicityForSelEvt(0),
99     fHistPosBestPrimaryVtxXForSelEvt(0), fHistPosBestPrimaryVtxYForSelEvt(0), fHistPosBestPrimaryVtxZForSelEvt(0),
100     fHistTPCrefitTrackMultiplicityForCascadeEvt(0), fHistPrimaryTrackMultiplicityForCascadeEvt(0),
101     fHistPosV0TPCClusters(0), fHistNegV0TPCClusters(0), fHistBachTPCClusters(0),
102     fHistVtxStatus(0),
103
104     fHistPosTrkgPrimaryVtxXForCascadeEvt(0), fHistPosTrkgPrimaryVtxYForCascadeEvt(0), fHistPosTrkgPrimaryVtxZForCascadeEvt(0), fHistTrkgPrimaryVtxRadius(0),
105     fHistPosBestPrimaryVtxXForCascadeEvt(0), fHistPosBestPrimaryVtxYForCascadeEvt(0), fHistPosBestPrimaryVtxZForCascadeEvt(0), fHistBestPrimaryVtxRadius(0),
106     f2dHistTrkgPrimVtxVsBestPrimVtx(0),
107
108     fHistEffMassXi(0),  fHistChi2Xi(0),  
109     fHistDcaXiDaughters(0), fHistDcaBachToPrimVertex(0), fHistXiCosineOfPointingAngle(0), fHistXiRadius(0),
110
111     fHistMassLambdaAsCascDghter(0),
112     fHistV0Chi2Xi(0),
113     fHistDcaV0DaughtersXi(0),
114     fHistDcaV0ToPrimVertexXi(0), 
115     fHistV0CosineOfPointingAngleXi(0),
116     fHistV0RadiusXi(0),
117     fHistDcaPosToPrimVertexXi(0), fHistDcaNegToPrimVertexXi(0), 
118
119     fHistMassXiMinus(0), fHistMassXiPlus(0),
120     fHistMassOmegaMinus(0), fHistMassOmegaPlus(0),
121     fHistMassWithCombPIDXiMinus(0), fHistMassWithCombPIDXiPlus(0),
122     fHistMassWithCombPIDOmegaMinus(0), fHistMassWithCombPIDOmegaPlus(0),
123
124     fHistXiTransvMom(0),    fHistXiTotMom(0),
125     fHistBachTransvMomXi(0),   fHistBachTotMomXi(0),
126
127     fHistChargeXi(0),
128     fHistV0toXiCosineOfPointingAngle(0),
129
130     fHistRapXi(0), fHistRapOmega(0), fHistEtaXi(0),
131     fHistThetaXi(0), fHistPhiXi(0),
132
133     fHistcTauXiMinus(0), fHistcTauXiPlus(0), fHistcTauOmegaMinus(0), fHistcTauOmegaPlus(0),
134
135     f2dHistArmenteros(0),                       
136     f2dHistEffMassLambdaVsEffMassXiMinus(0), f2dHistEffMassXiVsEffMassOmegaMinus(0),
137     f2dHistEffMassLambdaVsEffMassXiPlus(0), f2dHistEffMassXiVsEffMassOmegaPlus(0),
138     f2dHistXiRadiusVsEffMassXiMinus(0), f2dHistXiRadiusVsEffMassXiPlus(0),
139     f2dHistXiRadiusVsEffMassOmegaMinus(0), f2dHistXiRadiusVsEffMassOmegaPlus(0),
140     
141     f2dHistTPCdEdxOfCascDghters(0),
142     
143     f3dHistXiPtVsEffMassVsYXiMinus(0), f3dHistXiPtVsEffMassVsYXiPlus(0),
144     f3dHistXiPtVsEffMassVsYOmegaMinus(0), f3dHistXiPtVsEffMassVsYOmegaPlus(0),
145     
146     fCFContCascadePIDXiMinus(0),
147     fCFContCascadePIDXiPlus(0),
148     fCFContCascadePIDOmegaMinus(0),
149     fCFContCascadePIDOmegaPlus(0),
150     fCFContCascadeCuts(0),
151     
152     fHnSpAngularCorrXiMinus(0), fHnSpAngularCorrXiPlus(0), 
153     fHnSpAngularCorrOmegaMinus(0), fHnSpAngularCorrOmegaPlus(0)
154
155 {
156   // Dummy Constructor
157         for(Int_t iAlephIdx   = 0; iAlephIdx   < 5; iAlephIdx++   ) { fAlephParameters [iAlephIdx]    = -1.; }
158         for(Int_t iV0selIdx   = 0; iV0selIdx   < 7; iV0selIdx++   ) { fV0Sels          [iV0selIdx   ] = -1.; }
159         for(Int_t iCascSelIdx = 0; iCascSelIdx < 8; iCascSelIdx++ ) { fCascSels        [iCascSelIdx ] = -1.; }
160 }
161
162
163
164
165
166
167
168
169 //________________________________________________________________________
170 AliAnalysisTaskCheckCascade::AliAnalysisTaskCheckCascade(const char *name) 
171   : AliAnalysisTaskSE(name), fAnalysisType("ESD"), fTriggerMaskType("kMB"), fCollidingSystems(0), fESDpid(0), fESDtrackCuts(0), /*fPaveTextBookKeeping(0),*/
172     fkRerunV0CascVertexers         (0),
173     fkQualityCutZprimVtxPos        (kTRUE),
174     fkRejectEventPileUp            (kTRUE),
175     fkQualityCutNoTPConlyPrimVtx   (kTRUE),
176     fkQualityCutTPCrefit           (kTRUE),
177     fkQualityCut80TPCcls           (kTRUE),
178     fkIsDataRecoWith1PadTPCCluster (kTRUE),
179     fkExtraSelections              (0),
180     fAngularCorrelationType        ("TrigLeadingTrck-AssoCasc"),
181      
182         // - Cascade part initialisation
183     fListHistCascade(0),
184     fHistCascadeMultiplicityBeforeTrigSel(0),
185     fHistCascadeMultiplicityForTrigEvt(0), fHistTrackMultiplicityForTrigEvt(0), fHistTPCrefitTrackMultiplicityForTrigEvt(0), fHistPrimaryTrackMultiplicityForTrigEvt(0),
186     fHistEstimateITSTPCMultiplicityForTrigEvt(0),
187     fHistCascadeMultiplicityForTrigEvtAndZprimVtx(0), fHistCascadeMultiplicityForTrigEvtNonPiledUpAndZprimVtx(0),
188     fHistCascadeMultiplicityForSelEvt(0),
189     fHistPosBestPrimaryVtxXForSelEvt(0), fHistPosBestPrimaryVtxYForSelEvt(0), fHistPosBestPrimaryVtxZForSelEvt(0),
190     fHistTPCrefitTrackMultiplicityForCascadeEvt(0), fHistPrimaryTrackMultiplicityForCascadeEvt(0),
191     fHistPosV0TPCClusters(0), fHistNegV0TPCClusters(0), fHistBachTPCClusters(0),
192     fHistVtxStatus(0),
193
194     fHistPosTrkgPrimaryVtxXForCascadeEvt(0), fHistPosTrkgPrimaryVtxYForCascadeEvt(0), fHistPosTrkgPrimaryVtxZForCascadeEvt(0), fHistTrkgPrimaryVtxRadius(0),
195     fHistPosBestPrimaryVtxXForCascadeEvt(0), fHistPosBestPrimaryVtxYForCascadeEvt(0), fHistPosBestPrimaryVtxZForCascadeEvt(0), fHistBestPrimaryVtxRadius(0),
196     f2dHistTrkgPrimVtxVsBestPrimVtx(0),
197
198     fHistEffMassXi(0),  fHistChi2Xi(0),  
199     fHistDcaXiDaughters(0), fHistDcaBachToPrimVertex(0), fHistXiCosineOfPointingAngle(0), fHistXiRadius(0),
200
201     fHistMassLambdaAsCascDghter(0),
202     fHistV0Chi2Xi(0),
203     fHistDcaV0DaughtersXi(0),
204     fHistDcaV0ToPrimVertexXi(0), 
205     fHistV0CosineOfPointingAngleXi(0),
206     fHistV0RadiusXi(0),
207     fHistDcaPosToPrimVertexXi(0), fHistDcaNegToPrimVertexXi(0), 
208
209     fHistMassXiMinus(0), fHistMassXiPlus(0),
210     fHistMassOmegaMinus(0), fHistMassOmegaPlus(0),
211     fHistMassWithCombPIDXiMinus(0), fHistMassWithCombPIDXiPlus(0),
212     fHistMassWithCombPIDOmegaMinus(0), fHistMassWithCombPIDOmegaPlus(0),
213
214     fHistXiTransvMom(0),    fHistXiTotMom(0),
215     fHistBachTransvMomXi(0),   fHistBachTotMomXi(0),
216
217     fHistChargeXi(0),
218     fHistV0toXiCosineOfPointingAngle(0),
219
220     fHistRapXi(0), fHistRapOmega(0), fHistEtaXi(0),
221     fHistThetaXi(0), fHistPhiXi(0),
222
223     fHistcTauXiMinus(0), fHistcTauXiPlus(0), fHistcTauOmegaMinus(0), fHistcTauOmegaPlus(0),
224
225     f2dHistArmenteros(0),                       
226     f2dHistEffMassLambdaVsEffMassXiMinus(0), f2dHistEffMassXiVsEffMassOmegaMinus(0),
227     f2dHistEffMassLambdaVsEffMassXiPlus(0), f2dHistEffMassXiVsEffMassOmegaPlus(0),
228     f2dHistXiRadiusVsEffMassXiMinus(0), f2dHistXiRadiusVsEffMassXiPlus(0),
229     f2dHistXiRadiusVsEffMassOmegaMinus(0), f2dHistXiRadiusVsEffMassOmegaPlus(0),
230     
231     f2dHistTPCdEdxOfCascDghters(0),
232     
233     f3dHistXiPtVsEffMassVsYXiMinus(0), f3dHistXiPtVsEffMassVsYXiPlus(0),
234     f3dHistXiPtVsEffMassVsYOmegaMinus(0), f3dHistXiPtVsEffMassVsYOmegaPlus(0),
235     
236     fCFContCascadePIDXiMinus(0),
237     fCFContCascadePIDXiPlus(0),
238     fCFContCascadePIDOmegaMinus(0),
239     fCFContCascadePIDOmegaPlus(0),
240     fCFContCascadeCuts(0),
241     
242     fHnSpAngularCorrXiMinus(0), fHnSpAngularCorrXiPlus(0), 
243     fHnSpAngularCorrOmegaMinus(0), fHnSpAngularCorrOmegaPlus(0)
244
245 {
246   // Constructor
247
248   // Define input and output slots here
249   // Input slot #0 works with a TChain
250   // DefineInput(0, TChain::Class());
251   // Output slot #1 writes into a TList container (cascade)
252         
253         for(Int_t iAlephIdx   = 0; iAlephIdx   < 5; iAlephIdx++   ) { fAlephParameters [iAlephIdx]    = -1.; }
254         
255         // New Loose : 1st step for the 7 TeV pp analysis
256         
257         fV0Sels[0] =  33.  ;  // max allowed chi2
258         fV0Sels[1] =   0.02;  // min allowed impact parameter for the 1st daughter (LHC09a4 : 0.05)
259         fV0Sels[2] =   0.02;  // min allowed impact parameter for the 2nd daughter (LHC09a4 : 0.05)
260         fV0Sels[3] =   2.0 ;  // max allowed DCA between the daughter tracks       (LHC09a4 : 0.5)
261         fV0Sels[4] =   0.95;  // min allowed cosine of V0's pointing angle         (LHC09a4 : 0.99)
262         fV0Sels[5] =   1.0 ;  // min radius of the fiducial volume                 (LHC09a4 : 0.2)
263         fV0Sels[6] = 100.  ;  // max radius of the fiducial volume                 (LHC09a4 : 100.0)
264         
265         fCascSels[0] =  33.   ;  // max allowed chi2 (same as PDC07)
266         fCascSels[1] =   0.05 ;  // min allowed V0 impact parameter                    (PDC07 : 0.05   / LHC09a4 : 0.025 )
267         fCascSels[2] =   0.010;  // "window" around the Lambda mass                    (PDC07 : 0.008  / LHC09a4 : 0.010 )
268         fCascSels[3] =   0.03 ;  // min allowed bachelor's impact parameter            (PDC07 : 0.035  / LHC09a4 : 0.025 )
269         fCascSels[4] =   2.0  ;  // max allowed DCA between the V0 and the bachelor    (PDC07 : 0.1    / LHC09a4 : 0.2   )
270         fCascSels[5] =   0.95 ;  // min allowed cosine of the cascade pointing angle   (PDC07 : 0.9985 / LHC09a4 : 0.998 )
271         fCascSels[6] =   0.4  ;  // min radius of the fiducial volume                  (PDC07 : 0.9    / LHC09a4 : 0.2   )
272         fCascSels[7] = 100.   ;  // max radius of the fiducial volume                  (PDC07 : 100    / LHC09a4 : 100   )
273         
274         
275         
276         // Hyper Loose "à la 900 GeV 2009 data", with lower cosine of pointing angle for Xi (0.95 down to 0.82) = 900 GeV paper
277         /*
278         fV0Sels[0] =  33.  ;  // max allowed chi2
279         fV0Sels[1] =   0.001; // min allowed impact parameter for the 1st daughter (LHC09a4 : 0.05)
280         fV0Sels[2] =   0.001; // min allowed impact parameter for the 2nd daughter (LHC09a4 : 0.05)
281         fV0Sels[3] =   5.0 ;  // max allowed DCA between the daughter tracks       (LHC09a4 : 0.5)
282         fV0Sels[4] =   0.0 ;  // min allowed cosine of V0's pointing angle         (LHC09a4 : 0.99)
283         fV0Sels[5] =   0.1 ;  // min radius of the fiducial volume                 (LHC09a4 : 0.2)
284         fV0Sels[6] = 100.  ;  // max radius of the fiducial volume                 (LHC09a4 : 100.0)
285         
286         fCascSels[0] =  33.   ;  // max allowed chi2 (same as PDC07)
287         fCascSels[1] =   0.001;  // min allowed V0 impact parameter                    (PDC07 : 0.05   / LHC09a4 : 0.025 )
288         fCascSels[2] =   0.008;  // "window" around the Lambda mass                    (PDC07 : 0.008  / LHC09a4 : 0.010 )
289         fCascSels[3] =   0.001;  // min allowed bachelor's impact parameter            (PDC07 : 0.035  / LHC09a4 : 0.025 )
290         fCascSels[4] =   5.0  ;  // max allowed DCA between the V0 and the bachelor    (PDC07 : 0.1    / LHC09a4 : 0.2   )
291         fCascSels[5] =   0.82 ;  //FIXME min allowed cosine of the cascade pointing angle   (PDC07 : 0.9985 / LHC09a4 : 0.998 )
292         fCascSels[6] =   0.1  ;  // min radius of the fiducial volume                  (PDC07 : 0.9    / LHC09a4 : 0.2   )
293         fCascSels[7] = 100.   ;  // max radius of the fiducial volume                  (PDC07 : 100    / LHC09a4 : 100   )
294         */
295         
296         //New default vtxR (http://alisoft.cern.ch/viewvc?view=rev&root=AliRoot&revision=40955, 5 May 2010)
297         /*
298         fV0Sels[0] =  33.  ;  // max allowed chi2
299         fV0Sels[1] =   0.05;  // min allowed impact parameter for the 1st daughter (LHC09a4 : 0.05)
300         fV0Sels[2] =   0.05;  // min allowed impact parameter for the 2nd daughter (LHC09a4 : 0.05)
301         fV0Sels[3] =   1.5 ;  // max allowed DCA between the daughter tracks       (LHC09a4 : 0.5)
302         fV0Sels[4] =   0.9 ;  // min allowed cosine of V0's pointing angle         (LHC09a4 : 0.99)
303         fV0Sels[5] =   0.2 ;  // min radius of the fiducial volume                 (LHC09a4 : 0.2)
304         fV0Sels[6] = 100.  ;  // max radius of the fiducial volume                 (LHC09a4 : 100.0)
305         
306         fCascSels[0] =  33.   ;  // max allowed chi2 (same as PDC07)
307         fCascSels[1] =   0.01 ;  // min allowed V0 impact parameter                    (PDC07 : 0.05   / LHC09a4 : 0.025 )
308         fCascSels[2] =   0.008;  // "window" around the Lambda mass                    (PDC07 : 0.008  / LHC09a4 : 0.010 )
309         fCascSels[3] =   0.01 ;  // min allowed bachelor's impact parameter            (PDC07 : 0.035  / LHC09a4 : 0.025 )
310         fCascSels[4] =   2.0  ;  // max allowed DCA between the V0 and the bachelor    (PDC07 : 0.1    / LHC09a4 : 0.2   )
311         fCascSels[5] =   0.98 ;  // min allowed cosine of the cascade pointing angle   (PDC07 : 0.9985 / LHC09a4 : 0.998 )
312         fCascSels[6] =   0.2  ;  // min radius of the fiducial volume                  (PDC07 : 0.9    / LHC09a4 : 0.2   )
313         fCascSels[7] = 100.   ;  // max radius of the fiducial volume                  (PDC07 : 100    / LHC09a4 : 100   )
314         */
315         
316         // Tight for Xi in p-p (http://alisoft.cern.ch/viewvc?view=rev&root=AliRoot&revision=40955, 5 May 2010)
317         /*
318         fV0Sels[0] =  33.  ;  // max allowed chi2
319         fV0Sels[1] =   0.05;  // min allowed impact parameter for the 1st daughter (LHC09a4 : 0.05)
320         fV0Sels[2] =   0.05;  // min allowed impact parameter for the 2nd daughter (LHC09a4 : 0.05)
321         fV0Sels[3] =   0.5 ;  // max allowed DCA between the daughter tracks       (LHC09a4 : 0.5)
322         fV0Sels[4] =   0.99 ; // min allowed cosine of V0's pointing angle         (LHC09a4 : 0.99)
323         fV0Sels[5] =   0.2 ;  // min radius of the fiducial volume                 (LHC09a4 : 0.2)
324         fV0Sels[6] = 100.  ;  // max radius of the fiducial volume                 (LHC09a4 : 100.0)
325         
326         fCascSels[0] =  33.   ;   // max allowed chi2 (same as PDC07)
327         fCascSels[1] =   0.05 ;   // min allowed V0 impact parameter                    (PDC07 : 0.05   / LHC09a4 : 0.025 )
328         fCascSels[2] =   0.01;    // "window" around the Lambda mass                    (PDC07 : 0.008  / LHC09a4 : 0.010 )
329         fCascSels[3] =   0.035 ;  // min allowed bachelor's impact parameter            (PDC07 : 0.035  / LHC09a4 : 0.025 )
330         fCascSels[4] =   0.10  ;  // max allowed DCA between the V0 and the bachelor    (PDC07 : 0.1    / LHC09a4 : 0.2   )
331         fCascSels[5] =   0.9985 ; // min allowed cosine of the cascade pointing angle   (PDC07 : 0.9985 / LHC09a4 : 0.998 )
332         fCascSels[6] =   0.2  ;   // min radius of the fiducial volume                  (PDC07 : 0.9    / LHC09a4 : 0.2   )
333         fCascSels[7] = 100.   ;   // max radius of the fiducial volume                  (PDC07 : 100    / LHC09a4 : 100   )
334         */
335         
336         //NOTE
337         // For PbPb coming data, take a look at Iouri's proposal
338         // https://savannah.cern.ch/bugs/index.php?69877
339
340         
341   // Output slot #0 writes into a TList container (Cascade)
342   DefineOutput(1, TList::Class());
343   /*DefineOutput(2, TPaveText::Class());*/
344 }
345
346
347 AliAnalysisTaskCheckCascade::~AliAnalysisTaskCheckCascade()
348 {
349   //
350   // Destructor
351   //
352
353   // For all TH1, 2, 3 HnSparse and CFContainer are in the fListCascade TList.
354   // They will be deleted when fListCascade is deleted by the TSelector dtor
355   // Because of TList::SetOwner() ...
356         
357   if (fListHistCascade)         { delete fListHistCascade;     fListHistCascade = 0x0;    }
358   if (fESDpid)                  { delete fESDpid;              fESDpid = 0x0;} // fESDpid is not stored into the TList
359   if (fESDtrackCuts)            { delete fESDtrackCuts;        fESDtrackCuts = 0x0; }
360   //if (fPaveTextBookKeeping)     { delete fPaveTextBookKeeping; fPaveTextBookKeeping = 0x0;} // fPaveTextBookKeeping is not strored in the TList
361 }
362
363
364
365 //________________________________________________________________________
366 void AliAnalysisTaskCheckCascade::UserCreateOutputObjects()
367 {
368   // Create histograms
369   // Called once
370
371
372
373  fListHistCascade = new TList();
374  fListHistCascade->SetOwner();  // See http://root.cern.ch/root/html/TCollection.html#TCollection:SetOwner
375  
376  
377 if(! fESDpid){
378
379   AliMCEventHandler *lmcEvtHandler  = dynamic_cast<AliMCEventHandler*>( (AliAnalysisManager::GetAnalysisManager())->GetMCtruthEventHandler() );
380   
381   if( !lmcEvtHandler ){ // !0x0 = real data or !1 = there is an MC handler available (useMC = kTRUE in AnalysisTrainNew), so = data from MC
382         
383         if(fkIsDataRecoWith1PadTPCCluster){
384                 // Parameters extracted for LHC10d Pass2 - A. Kalweit
385                 fAlephParameters[0] = 1.28949/50.; // = 0,0257898
386                 fAlephParameters[1] = 2.74095e+01;
387                 fAlephParameters[2] = TMath::Exp(-3.21763e+01);
388                 fAlephParameters[3] = 2.44026;
389                 fAlephParameters[4] = 6.58800;
390         }
391         else {
392                 // Reasonable parameters extracted for real p-p event (Dec 2009 - GSI Pass5) - A.Kalweit
393                 fAlephParameters[0] = 0.0283086;        // No extra-division to apply in SetBlochParam
394                 fAlephParameters[1] = 2.63394e+01;
395                 fAlephParameters[2] = 5.04114e-11;
396                 fAlephParameters[3] = 2.12543e+00;
397                 fAlephParameters[4] = 4.88663e+00; 
398         }
399         
400         Printf("CheckCascade -      Check Aleph Param in case of REAL Data (fAlephParameters[3] = %f)  (To be compared with : 2.44026 for 1-pad-cluster prod. / 2.12543 otherwise)\n",  fAlephParameters[3]);
401
402   }
403   else { // MC reco
404         if(fkIsDataRecoWith1PadTPCCluster){
405                 // Home made parameterization for LHC10f6a production = p+p 7 TeV
406                 fAlephParameters[0] = 0.04;
407                 fAlephParameters[1] = 17.5;
408                 fAlephParameters[2] = 3.4e-09;
409                 fAlephParameters[3] = 2.15;
410                 fAlephParameters[4] = 3.91720e+00; 
411                 
412                 // Home made parameterization for LHC10e13 production = p+p 900 GeV/c
413                 
414         }
415         else {
416                 // Reasonable parameters extracted for p-p simulation (LHC09a4) - A.Kalweit
417                 // fAlephParameters[0] = 4.23232575531564326e+00;//50*0.76176e-1; // do not forget to divide this value by 50 in SetBlochParam !
418                 // fAlephParameters[1] = 8.68482806165147636e+00;//10.632; 
419                 // fAlephParameters[2] = 1.34000000000000005e-05;//0.13279e-4;
420                 // fAlephParameters[3] = 2.30445734159456084e+00;//1.8631;
421                 // fAlephParameters[4] = 2.25624744086878559e+00;//1.9479;  
422                 
423                 // Reasonable parameters extracted for MC LHC09d10 event (Jan 2010) - A.Kalweit
424                 fAlephParameters[0] = 2.15898e+00/50.;
425                 fAlephParameters[1] = 1.75295e+01;
426                 fAlephParameters[2] = 3.40030e-09;
427                 fAlephParameters[3] = 1.96178e+00;
428                 fAlephParameters[4] = 3.91720e+00;
429         }
430         Printf("CheckCascade -      Check Aleph Param in case of MC Data (fAlephParameters[3] = %f) (To be compared with : 2.15 for 1-pad-cluster prod. / 1.96178 otherwise)\n",  fAlephParameters[3]);
431   }
432
433   fESDpid = new AliESDpid();
434   fESDpid->GetTPCResponse().SetBetheBlochParameters( fAlephParameters[0],
435                                                      fAlephParameters[1],
436                                                      fAlephParameters[2],
437                                                      fAlephParameters[3],
438                                                      fAlephParameters[4] );
439 }
440  
441 if(! fESDtrackCuts ){
442       fESDtrackCuts = AliESDtrackCuts::GetStandardITSTPCTrackCuts2010(kTRUE); // Std definition of primary (see kTRUE argument) tracks for 2010
443       fESDtrackCuts->SetEtaRange(-0.8,+0.8);
444       fESDtrackCuts->SetPtRange(0.15, 1e10);
445       Printf("CheckCascade - ESDtrackCuts set up to 2010 std ITS-TPC cuts...");
446 }
447  
448 /* 
449 if( !fPaveTextBookKeeping){
450         // FIXME : prepare a field with the AliRoot+root distrib ...
451
452         fPaveTextBookKeeping = new TPaveText(0.1, 0.1, 0.9, 0.9,"NDC");
453         fPaveTextBookKeeping->SetName("fPaveTextBookKeeping");
454         fPaveTextBookKeeping->SetBorderSize(0);
455         fPaveTextBookKeeping->SetTextAlign(12);
456         fPaveTextBookKeeping->SetFillColor(kWhite);
457         fPaveTextBookKeeping->SetTextFont(42);        // regular Arial or Helvetica,
458         fPaveTextBookKeeping->SetTextColor(kBlue+4);
459         
460         fPaveTextBookKeeping->AddText( "Task CHECK CASCADE analysis" );
461         fPaveTextBookKeeping->AddText("- - - - - - - - - - - ");
462         fPaveTextBookKeeping->AddText( Form("AnalysisType : %s ", fAnalysisType.Data() ));
463         if(!fCollidingSystems)  fPaveTextBookKeeping->AddText("Colliding system : p-p collisions ");
464         else                    fPaveTextBookKeeping->AddText("Colliding system : A-A collisions ");
465
466         fPaveTextBookKeeping->AddText("- - - - - - - - - - - ");
467     
468         if(fkRerunV0CascVertexers){
469                 fPaveTextBookKeeping->AddText("A.1. With V0 vertexer : ");
470                 fPaveTextBookKeeping->AddText( Form("  - V0 #chi^{2} _________________ <  %.3f ",               fV0Sels[0] ));
471                 fPaveTextBookKeeping->AddText( Form("  - DCA(prim. Vtx/ 1^{st} daughter) ___ >  %.3f     cm ",  fV0Sels[1] ));
472                 fPaveTextBookKeeping->AddText( Form("  - DCA(prim. Vtx/ 2^{nd} daughter) __  >  %.3f     cm",   fV0Sels[2] ));
473                 fPaveTextBookKeeping->AddText( Form("  - DCA between V0 daughters ___ <  %.3f      cm",         fV0Sels[3] ));
474                 fPaveTextBookKeeping->AddText( Form("  - cos(V0 pointing angle) _______ >  %.3f ",              fV0Sels[4] ));
475                 fPaveTextBookKeeping->AddText( Form("  - R_{transv}(V0 decay) ________ >  %.3f             cm", fV0Sels[5] ));
476                 fPaveTextBookKeeping->AddText( Form("  - R_{transv}(V0 decay) ________ <  %.3f         cm",     fV0Sels[6] ));
477                 
478                 fPaveTextBookKeeping->AddText(" "); 
479                 
480                 fPaveTextBookKeeping->AddText("A.2. With Casc. vertexer : ");
481                 fPaveTextBookKeeping->AddText( Form("  - Casc. #chi^{2} ______________  <  %.3f ",                               fCascSels[0] ));
482                 fPaveTextBookKeeping->AddText( Form("  - DCA(prim. Vtx/ V0) _________ >  %.3f    cm",                            fCascSels[1] ));
483                 fPaveTextBookKeeping->AddText( Form("  - | M_{#Lambda}(reco) - M_{#Lambda}(pdg) | _______ <  %.3f    GeV/c^{2}", fCascSels[2] ));
484                 fPaveTextBookKeeping->AddText( Form("  - DCA(prim. Vtx/ Bach) _______ >  %.3f    cm",                            fCascSels[3] ));
485                 fPaveTextBookKeeping->AddText( Form("  - DCA between Bach/ #Lambda ______ <  %.3f    cm",                        fCascSels[4] ));
486                 fPaveTextBookKeeping->AddText( Form("  - cos(Casc. pointing angle) ____ >  %.3f ",                               fCascSels[5] ));
487                 fPaveTextBookKeeping->AddText( Form("  - R_{transv}(Casc. decay) ______ >  %.3f         cm",                     fCascSels[6] ));
488                 fPaveTextBookKeeping->AddText( Form("  - R_{transv}(Casc. decay) ______ <  %.3f     cm",                         fCascSels[7] ));
489         }
490         else{   fPaveTextBookKeeping->AddText("A. No rerunning of the V0/Casc. vertexers ... See std cuts in (AliRoot+Rec.C) used for this prod. cycle");}
491
492         fPaveTextBookKeeping->AddText("- - - - - - - - - - - ");
493         
494         if(fkQualityCutZprimVtxPos)      fPaveTextBookKeeping->AddText("B. Quality Cut(prim. Vtx z-Pos)    = ON  ");
495         else                             fPaveTextBookKeeping->AddText("B. Quality Cut(prim. Vtx z-Pos)    = Off ");
496         if(fkQualityCutNoTPConlyPrimVtx) fPaveTextBookKeeping->AddText("C. Quality Cut(No TPC prim. vtx) = ON  ");
497         else                             fPaveTextBookKeeping->AddText("C. Quality Cut(No TPC prim. vtx) = Off ");
498         if(fkQualityCutTPCrefit)         fPaveTextBookKeeping->AddText("D. Quality Cut(TPCrefit)               = ON  ");
499         else                             fPaveTextBookKeeping->AddText("D. Quality Cut(TPCrefit)               = Off ");
500         if(fkQualityCut80TPCcls)         fPaveTextBookKeeping->AddText("E. Quality Cut(80 TPC clusters)   = ON  ");
501         else                             fPaveTextBookKeeping->AddText("E. Quality Cut(80 TPC clusters)   = Off ");
502         if(fkExtraSelections)            fPaveTextBookKeeping->AddText("F. Extra Analysis Selections         = ON  ");
503         else                             fPaveTextBookKeeping->AddText("F. Extra Analysis Selections         = Off ");
504
505         fPaveTextBookKeeping->AddText("- - - - - - - - - - - ");
506
507         fPaveTextBookKeeping->AddText("G. TPC Aleph Param : ");
508         fPaveTextBookKeeping->AddText( Form("   - fAlephParam [0] =  %.5g", fAlephParameters[0] ));
509         fPaveTextBookKeeping->AddText( Form("   - fAlephParam [1] =  %.5g", fAlephParameters[1] ));
510         fPaveTextBookKeeping->AddText( Form("   - fAlephParam [2] =  %.5g", fAlephParameters[2] ));
511         fPaveTextBookKeeping->AddText( Form("   - fAlephParam [3] =  %.5g", fAlephParameters[3] ));
512         fPaveTextBookKeeping->AddText( Form("   - fAlephParam [4] =  %.5g", fAlephParameters[4] ));
513 }       
514 */ 
515  
516         // - General histos
517         //--------------
518  
519 if(! fHistCascadeMultiplicityBeforeTrigSel) {
520         if(fCollidingSystems)// AA collisions
521                 fHistCascadeMultiplicityBeforeTrigSel = new TH1F("fHistCascadeMultiplicityBeforeTrigSel", 
522                         "Cascades per event (before Trig. Sel.);Nbr of Cascades/Evt;Events", 
523                         100, 0, 100);           
524         else // pp collisions
525                 fHistCascadeMultiplicityBeforeTrigSel = new TH1F("fHistCascadeMultiplicityBeforeTrigSel", 
526                         "Cascades per event (before Trig. Sel.);Nbr of Cascades/Evt;Events", 
527                         25, 0, 25);
528         fListHistCascade->Add(fHistCascadeMultiplicityBeforeTrigSel);
529 }
530
531         // - Histos for events passing the trigger selection
532         //--------------
533         
534 if(! fHistCascadeMultiplicityForTrigEvt) {
535         if(fCollidingSystems)// AA collisions
536                 fHistCascadeMultiplicityForTrigEvt = new TH1F("fHistCascadeMultiplicityForTrigEvt", 
537                         "Cascades per event (for triggered evt);Nbr of Cascades/Evt;Events", 
538                         100, 0, 100);           
539         else // pp collisions
540                 fHistCascadeMultiplicityForTrigEvt = new TH1F("fHistCascadeMultiplicityForTrigEvt", 
541                         "Cascades per event (for triggered evt);Nbr of Cascades/Evt;Events", 
542                         25, 0, 25);
543         fListHistCascade->Add(fHistCascadeMultiplicityForTrigEvt);
544 }
545
546  
547 if(! fHistTrackMultiplicityForTrigEvt) {        
548         if(fCollidingSystems)// AA collisions   
549                 fHistTrackMultiplicityForTrigEvt = new TH1F("fHistTrackMultiplicityForTrigEvt", 
550                         "Track Multiplicity (for triggered evt);Nbr of tracks/Evt;Events", 
551                         200, 0, 20000);                 
552         else // pp collisions
553                 fHistTrackMultiplicityForTrigEvt = new TH1F("fHistTrackMultiplicityForTrigEvt", 
554                         "Track Multiplicity (for triggered evt);Nbr of tracks/Evt;Events", 
555                         300, 0, 300);
556         fListHistCascade->Add(fHistTrackMultiplicityForTrigEvt);
557 }
558
559 if(! fHistTPCrefitTrackMultiplicityForTrigEvt) {        
560         if(fCollidingSystems)// AA collisions   
561                 fHistTPCrefitTrackMultiplicityForTrigEvt = new TH1F("fHistTPCrefitTrackMultiplicityForTrigEvt", 
562                         "TPCrefit track Multiplicity (for triggered evt);Nbr of TPCrefit tracks/Evt;Events", 
563                         200, 0, 20000);                 
564         else // pp collisions
565                 fHistTPCrefitTrackMultiplicityForTrigEvt = new TH1F("fHistTPCrefitTrackMultiplicityForTrigEvt", 
566                         "TPCrefit track Multiplicity (for triggered evt);Nbr of TPCrefit tracks/Evt;Events", 
567                         300, 0, 300);
568         fListHistCascade->Add(fHistTPCrefitTrackMultiplicityForTrigEvt);
569 }
570
571
572 if(! fHistPrimaryTrackMultiplicityForTrigEvt) { 
573         if(fCollidingSystems)// AA collisions   
574                 fHistPrimaryTrackMultiplicityForTrigEvt = new TH1F("fHistPrimaryTrackMultiplicityForTrigEvt", 
575                         "Primary track Multiplicity (for triggered evt);Nbr of primary tracks/Evt;Events", 
576                         100, 0, 10000);                 
577         else // pp collisions
578                 fHistPrimaryTrackMultiplicityForTrigEvt = new TH1F("fHistPrimaryTrackMultiplicityForTrigEvt", 
579                         "Primary track Multiplicity (for triggered evt);Nbr of primary tracks/Evt;Events", 
580                         200, 0, 200);
581         fListHistCascade->Add(fHistPrimaryTrackMultiplicityForTrigEvt);
582 }
583
584
585 if(! fHistEstimateITSTPCMultiplicityForTrigEvt) {       
586         if(fCollidingSystems)// AA collisions   
587                 fHistEstimateITSTPCMultiplicityForTrigEvt = new TH1F("fHistEstimateITSTPCMultiplicityForTrigEvt", 
588                         "(ITS+TPC tracks + SPD tracklets) multiplicity (for triggered evt);Nbr of (ITS+TPC tracks + SPD tracklets)/Evt;Events", 
589                         100, 0, 10000);                 
590         else // pp collisions
591                 fHistEstimateITSTPCMultiplicityForTrigEvt = new TH1F("fHistEstimateITSTPCMultiplicityForTrigEvt", 
592                         "(ITS+TPC tracks + SPD tracklets) multiplicity (for triggered evt);Nbr of (ITS+TPC tracks + SPD tracklets)/Evt;Events", 
593                         200, 0, 200);
594         fListHistCascade->Add(fHistEstimateITSTPCMultiplicityForTrigEvt);
595 }
596
597
598
599         // - Histos for events passing the trigger selection + |z(prim. vertex)| < XX cm
600         //--------------
601         
602 if(! fHistCascadeMultiplicityForTrigEvtAndZprimVtx) {
603         if(fCollidingSystems)// AA collisions
604                 fHistCascadeMultiplicityForTrigEvtAndZprimVtx = new TH1F("fHistCascadeMultiplicityForTrigEvtAndZprimVtx", 
605                         "Cascades per event;Nbr of Cascades/Evt;Events", 
606                         100, 0, 100);           
607         else // pp collisions
608                 fHistCascadeMultiplicityForTrigEvtAndZprimVtx = new TH1F("fHistCascadeMultiplicityForTrigEvtAndZprimVtx", 
609                         "Cascades per event;Nbr of Cascades/Evt;Events", 
610                         25, 0, 25);
611         fListHistCascade->Add(fHistCascadeMultiplicityForTrigEvtAndZprimVtx);
612 }
613
614
615         // - Histos for events passing the trigger selection + |z(prim. vertex)| < XX cm + after pile-up rejection
616         //--------------
617         
618 if(! fHistCascadeMultiplicityForTrigEvtNonPiledUpAndZprimVtx) {
619         if(fCollidingSystems)// AA collisions
620                 fHistCascadeMultiplicityForTrigEvtNonPiledUpAndZprimVtx = new TH1F("fHistCascadeMultiplicityForTrigEvtNonPiledUpAndZprimVtx", 
621                         "Cascades per event;Nbr of Cascades/Evt;Events", 
622                         100, 0, 100);           
623         else // pp collisions
624                 fHistCascadeMultiplicityForTrigEvtNonPiledUpAndZprimVtx = new TH1F("fHistCascadeMultiplicityForTrigEvtNonPiledUpAndZprimVtx", 
625                         "Cascades per event;Nbr of Cascades/Evt;Events", 
626                         25, 0, 25);
627         fListHistCascade->Add(fHistCascadeMultiplicityForTrigEvtNonPiledUpAndZprimVtx);
628 }
629
630
631         // - Histos for events passing the event selection at the analysis level
632         //--------------
633         
634 if(! fHistCascadeMultiplicityForSelEvt) {
635         if(fCollidingSystems)// AA collisions
636                 fHistCascadeMultiplicityForSelEvt = new TH1F("fHistCascadeMultiplicityForSelEvt", 
637                         "Cascades per event;Nbr of Cascades/Evt;Events", 
638                         100, 0, 100);           
639         else // pp collisions
640                 fHistCascadeMultiplicityForSelEvt = new TH1F("fHistCascadeMultiplicityForSelEvt", 
641                         "Cascades per event;Nbr of Cascades/Evt;Events", 
642                         25, 0, 25);
643         fListHistCascade->Add(fHistCascadeMultiplicityForSelEvt);
644 }
645
646
647 if(! fHistPosBestPrimaryVtxXForSelEvt ){
648         fHistPosBestPrimaryVtxXForSelEvt   = new TH1F( "fHistPosBestPrimaryVtxXForSelEvt" , "Best Prim. Vertex Position in x; x (cm); Events" , 360, -0.9, 0.9 );
649         fListHistCascade->Add(fHistPosBestPrimaryVtxXForSelEvt);
650 }
651
652 if(! fHistPosBestPrimaryVtxYForSelEvt){
653         fHistPosBestPrimaryVtxYForSelEvt   = new TH1F( "fHistPosBestPrimaryVtxYForSelEvt" , "Best Prim. Vertex Position in y; y (cm); Events" , 360, -0.9, 0.9 );
654         fListHistCascade->Add(fHistPosBestPrimaryVtxYForSelEvt);
655 }
656
657 if(! fHistPosBestPrimaryVtxZForSelEvt ){
658         fHistPosBestPrimaryVtxZForSelEvt   = new TH1F( "fHistPosBestPrimaryVtxZForSelEvt" , "Best Prim. Vertex Position in z; z (cm); Events" , 300, -30.0, 30.0 );
659         fListHistCascade->Add(fHistPosBestPrimaryVtxZForSelEvt);
660 }
661
662
663
664
665         // - Histos for events containing at least ONE CASCADE
666         //--------------
667         
668 if(! fHistTPCrefitTrackMultiplicityForCascadeEvt) {
669         if(fCollidingSystems)// AA collisions   
670                 fHistTPCrefitTrackMultiplicityForCascadeEvt = new TH1F("fHistTPCrefitTrackMultiplicityForCascadeEvt", 
671                         "TPCrefit track Multiplicity (for evt with Casc.);Nbr of TPCrefit tracks/Evt with cascade(s);Events", 
672                         200, 0, 20000);                 
673         else // pp collisions
674                 fHistTPCrefitTrackMultiplicityForCascadeEvt = new TH1F("fHistTPCrefitTrackMultiplicityForCascadeEvt", 
675                         "TPCrefit track Multiplicity (for evt with Casc.);Nbr of TPCrefit tracks/Evt with cascade(s);Events", 
676                         300, 0, 300);
677         fListHistCascade->Add(fHistTPCrefitTrackMultiplicityForCascadeEvt);
678 }
679
680 if(! fHistPrimaryTrackMultiplicityForCascadeEvt) {      
681         if(fCollidingSystems)// AA collisions   
682                 fHistPrimaryTrackMultiplicityForCascadeEvt = new TH1F("fHistPrimaryTrackMultiplicityForCascadeEvt", 
683                         "Primary track Multiplicity (for evt with Casc.);Nbr of primary tracks/Evt;Events", 
684                         100, 0, 10000);                 
685         else // pp collisions
686                 fHistPrimaryTrackMultiplicityForCascadeEvt = new TH1F("fHistPrimaryTrackMultiplicityForCascadeEvt", 
687                         "Primary track Multiplicity (for evt with Casc.);Nbr of primary tracks/Evt;Events", 
688                         200, 0, 200);
689         fListHistCascade->Add(fHistPrimaryTrackMultiplicityForCascadeEvt);
690 }
691
692 if(! fHistPosV0TPCClusters ){
693         fHistPosV0TPCClusters = new TH1F("fHistPosV0TPCClusters", "TPC clusters for Pos. V0 daughter track, in Casc; Nbr of TPC clusters (V0 Pos.); Track counts", 165, 0.0 ,165.0);
694         fListHistCascade->Add(fHistPosV0TPCClusters);
695 }
696
697 if(! fHistNegV0TPCClusters ){
698         fHistNegV0TPCClusters = new TH1F("fHistNegV0TPCClusters", "TPC clusters for Neg. V0 daughter track, in Casc; Nbr of TPC clusters (V0 Neg.); Track counts", 165, 0.0 ,165.0);
699         fListHistCascade->Add(fHistNegV0TPCClusters);
700 }
701
702 if(! fHistBachTPCClusters ){
703         fHistBachTPCClusters = new TH1F("fHistBachTPCClusters", "TPC clusters for Bachelor track; Nbr of TPC clusters (Bach); Track counts", 165, 0.0 ,165.0);
704         fListHistCascade->Add(fHistBachTPCClusters);
705 }
706
707
708
709
710
711
712
713 if(! fHistVtxStatus ){
714         fHistVtxStatus   = new TH1F( "fHistVtxStatus" , "Does a Trckg Prim.vtx exist ?; true=1 or false=0; Nb of Events" , 4, -1.0, 3.0 );
715         fListHistCascade->Add(fHistVtxStatus);
716 }
717
718
719         // - Vertex Positions
720   
721 if(! fHistPosTrkgPrimaryVtxXForCascadeEvt ){
722         fHistPosTrkgPrimaryVtxXForCascadeEvt   = new TH1F( "fHistPosTrkgPrimaryVtxXForCascadeEvt" , "Trkg Prim. Vertex Position in x; x (cm); Events" , 360, -0.9, 0.9 );
723         fListHistCascade->Add(fHistPosTrkgPrimaryVtxXForCascadeEvt);
724 }
725
726
727 if(! fHistPosTrkgPrimaryVtxYForCascadeEvt){
728         fHistPosTrkgPrimaryVtxYForCascadeEvt   = new TH1F( "fHistPosTrkgPrimaryVtxYForCascadeEvt" , "Trkg Prim. Vertex Position in y; y (cm); Events" , 360, -0.9, 0.9 );
729         fListHistCascade->Add(fHistPosTrkgPrimaryVtxYForCascadeEvt);
730 }
731
732 if(! fHistPosTrkgPrimaryVtxZForCascadeEvt ){
733         fHistPosTrkgPrimaryVtxZForCascadeEvt   = new TH1F( "fHistPosTrkgPrimaryVtxZForCascadeEvt" , "Trkg Prim. Vertex Position in z; z (cm); Events" , 300, -30.0, 30.0 );
734         fListHistCascade->Add(fHistPosTrkgPrimaryVtxZForCascadeEvt);
735 }
736
737 if(! fHistTrkgPrimaryVtxRadius ){
738         fHistTrkgPrimaryVtxRadius  = new TH1F( "fHistTrkgPrimaryVtxRadius",  "Trkg Prim. Vertex radius; r (cm); Events" , 150, 0., 15.0 );
739         fListHistCascade->Add(fHistTrkgPrimaryVtxRadius);
740 }
741
742
743
744
745 if(! fHistPosBestPrimaryVtxXForCascadeEvt ){
746         fHistPosBestPrimaryVtxXForCascadeEvt   = new TH1F( "fHistPosBestPrimaryVtxXForCascadeEvt" , "Best Prim. Vertex Position in x; x (cm); Events" , 360, -0.9, 0.9 );
747         fListHistCascade->Add(fHistPosBestPrimaryVtxXForCascadeEvt);
748 }
749
750 if(! fHistPosBestPrimaryVtxYForCascadeEvt){
751         fHistPosBestPrimaryVtxYForCascadeEvt   = new TH1F( "fHistPosBestPrimaryVtxYForCascadeEvt" , "Best Prim. Vertex Position in y; y (cm); Events" , 360, -0.9, 0.9 );
752         fListHistCascade->Add(fHistPosBestPrimaryVtxYForCascadeEvt);
753 }
754
755 if(! fHistPosBestPrimaryVtxZForCascadeEvt ){
756         fHistPosBestPrimaryVtxZForCascadeEvt   = new TH1F( "fHistPosBestPrimaryVtxZForCascadeEvt" , "Best Prim. Vertex Position in z; z (cm); Events" , 300, -30.0, 30.0 );
757         fListHistCascade->Add(fHistPosBestPrimaryVtxZForCascadeEvt);
758 }
759
760 if(! fHistBestPrimaryVtxRadius ){
761         fHistBestPrimaryVtxRadius  = new TH1F( "fHistBestPrimaryVtxRadius",  "Best Prim.  vertex radius; r (cm); Events" , 150, 0., 15.0 );
762         fListHistCascade->Add(fHistBestPrimaryVtxRadius);
763 }
764
765 if(! f2dHistTrkgPrimVtxVsBestPrimVtx) {
766         f2dHistTrkgPrimVtxVsBestPrimVtx = new TH2F( "f2dHistTrkgPrimVtxVsBestPrimVtx", "r_{Trck Prim. Vtx} Vs r_{Best Prim. Vtx}; r_{Track Vtx} (cm); r_{Best Vtx} (cm)", 300, 0., 15.0, 300, 0., 15.);
767         fListHistCascade->Add(f2dHistTrkgPrimVtxVsBestPrimVtx);
768 }
769
770
771
772
773 // - Typical histos for cascades
774
775
776 if(! fHistEffMassXi) {
777      fHistEffMassXi = new TH1F("fHistEffMassXi", "Cascade candidates ; Invariant Mass (GeV/c^{2}) ; Counts", 400, 1.2, 2.0);
778      fListHistCascade->Add(fHistEffMassXi);
779 }
780    
781 if(! fHistChi2Xi ){
782         fHistChi2Xi = new TH1F("fHistChi2Xi", "Cascade #chi^{2}; #chi^{2}; Number of Cascades", 160, 0, 40);
783         fListHistCascade->Add(fHistChi2Xi);
784 }
785   
786 if(! fHistDcaXiDaughters ){
787         fHistDcaXiDaughters = new TH1F( "fHistDcaXiDaughters",  "DCA between Xi Daughters; DCA (cm) ; Number of Cascades", 100, 0., 0.5);
788         fListHistCascade->Add(fHistDcaXiDaughters);
789 }
790
791 if(! fHistDcaBachToPrimVertex) {
792         fHistDcaBachToPrimVertex = new TH1F("fHistDcaBachToPrimVertex", "DCA of Bach. to Prim. Vertex;DCA (cm);Number of Cascades", 250, 0., 0.25);
793         fListHistCascade->Add(fHistDcaBachToPrimVertex);
794 }
795
796 if(! fHistXiCosineOfPointingAngle) {
797         fHistXiCosineOfPointingAngle = new TH1F("fHistXiCosineOfPointingAngle", "Cosine of Xi Pointing Angle; Cos (Xi Point.Angl);Number of Xis", 200, 0.99, 1.0);
798         fListHistCascade->Add(fHistXiCosineOfPointingAngle);
799 }
800
801 if(! fHistXiRadius ){
802         fHistXiRadius  = new TH1F( "fHistXiRadius",  "Casc. decay transv. radius; r (cm); Counts" , 1050, 0., 105.0 );
803         fListHistCascade->Add(fHistXiRadius);
804 }
805
806
807 // - Histos about ~ the "V0 part" of the cascade,  coming by inheritance from AliESDv0
808
809
810
811 if (! fHistMassLambdaAsCascDghter) {
812      fHistMassLambdaAsCascDghter = new TH1F("fHistMassLambdaAsCascDghter","#Lambda associated to Casc. candidates;Eff. Mass (GeV/c^{2});Counts", 300,1.00,1.3);
813     fListHistCascade->Add(fHistMassLambdaAsCascDghter);
814 }
815
816 if (! fHistV0Chi2Xi) {
817         fHistV0Chi2Xi = new TH1F("fHistV0Chi2Xi", "V0 #chi^{2}, in cascade; #chi^{2};Counts", 160, 0, 40);
818         fListHistCascade->Add(fHistV0Chi2Xi);
819 }
820
821 if (! fHistDcaV0DaughtersXi) {
822         fHistDcaV0DaughtersXi = new TH1F("fHistDcaV0DaughtersXi", "DCA between V0 daughters, in cascade;DCA (cm);Number of V0s", 120, 0., 0.6);
823         fListHistCascade->Add(fHistDcaV0DaughtersXi);
824 }
825
826 if (! fHistDcaV0ToPrimVertexXi) {
827         fHistDcaV0ToPrimVertexXi = new TH1F("fHistDcaV0ToPrimVertexXi", "DCA of V0 to Prim. Vertex, in cascade;DCA (cm);Number of Cascades", 200, 0., 1.);
828         fListHistCascade->Add(fHistDcaV0ToPrimVertexXi);
829 }
830
831 if (! fHistV0CosineOfPointingAngleXi) {
832         fHistV0CosineOfPointingAngleXi = new TH1F("fHistV0CosineOfPointingAngleXi", "Cosine of V0 Pointing Angle, in cascade;Cos(V0 Point. Angl); Counts", 200, 0.98, 1.0);
833         fListHistCascade->Add(fHistV0CosineOfPointingAngleXi);
834 }
835
836 if (! fHistV0RadiusXi) {
837         fHistV0RadiusXi = new TH1F("fHistV0RadiusXi", "V0 decay radius, in cascade; radius (cm); Counts", 1050, 0., 105.0);
838         fListHistCascade->Add(fHistV0RadiusXi);
839 }
840
841 if (! fHistDcaPosToPrimVertexXi) {
842         fHistDcaPosToPrimVertexXi = new TH1F("fHistDcaPosToPrimVertexXi", "DCA of V0 pos daughter to Prim. Vertex;DCA (cm);Counts", 300, 0, 3);
843         fListHistCascade->Add(fHistDcaPosToPrimVertexXi);
844 }
845
846 if (! fHistDcaNegToPrimVertexXi) {
847         fHistDcaNegToPrimVertexXi = new TH1F("fHistDcaNegToPrimVertexXi", "DCA of V0 neg daughter to Prim. Vertex;DCA (cm);Counts", 300, 0, 3);
848         fListHistCascade->Add(fHistDcaNegToPrimVertexXi);
849 }
850
851
852
853
854         // - Effective mass histos for cascades.
855 // By cascade hyp  
856 if (! fHistMassXiMinus) {
857     fHistMassXiMinus = new TH1F("fHistMassXiMinus","#Xi^{-} candidates;M( #Lambda , #pi^{-} ) (GeV/c^{2});Counts", 400,1.2,2.0);
858     fListHistCascade->Add(fHistMassXiMinus);
859 }
860   
861 if (! fHistMassXiPlus) {
862     fHistMassXiPlus = new TH1F("fHistMassXiPlus","#bar{#Xi}^{+} candidates;M( #bar{#Lambda}^{0} , #pi^{+} ) (GeV/c^{2});Counts",400,1.2,2.0);
863     fListHistCascade->Add(fHistMassXiPlus);
864 }
865
866 if (! fHistMassOmegaMinus) {
867         fHistMassOmegaMinus = new TH1F("fHistMassOmegaMinus","#Omega^{-} candidates;M( #Lambda , K^{-} ) (GeV/c^{2});Counts", 500,1.5,2.5);
868     fListHistCascade->Add(fHistMassOmegaMinus);
869 }
870  
871 if (! fHistMassOmegaPlus) {
872         fHistMassOmegaPlus = new TH1F("fHistMassOmegaPlus","#bar{#Omega}^{+} candidates;M( #bar{#Lambda}^{0} , K^{+} ) (GeV/c^{2});Counts", 500,1.5,2.5);
873     fListHistCascade->Add(fHistMassOmegaPlus);
874 }
875
876 // By cascade hyp + bachelor PID
877 if (! fHistMassWithCombPIDXiMinus) {
878     fHistMassWithCombPIDXiMinus = new TH1F("fHistMassWithCombPIDXiMinus","#Xi^{-} candidates, with Bach. comb. PID;M( #Lambda , #pi^{-} ) (GeV/c^{2});Counts", 400,1.2,2.0);
879     fListHistCascade->Add(fHistMassWithCombPIDXiMinus);
880 }
881   
882 if (! fHistMassWithCombPIDXiPlus) {
883     fHistMassWithCombPIDXiPlus = new TH1F("fHistMassWithCombPIDXiPlus","#bar{#Xi}^{+} candidates, with Bach. comb. PID;M( #bar{#Lambda}^{0} , #pi^{+} ) (GeV/c^{2});Counts",400,1.2,2.0);
884     fListHistCascade->Add(fHistMassWithCombPIDXiPlus);
885 }
886
887 if (! fHistMassWithCombPIDOmegaMinus) {
888         fHistMassWithCombPIDOmegaMinus = new TH1F("fHistMassWithCombPIDOmegaMinus","#Omega^{-} candidates, with Bach. comb. PID;M( #Lambda , K^{-} ) (GeV/c^{2});Counts", 500,1.5,2.5);
889     fListHistCascade->Add(fHistMassWithCombPIDOmegaMinus);
890 }
891  
892 if (! fHistMassWithCombPIDOmegaPlus) {
893         fHistMassWithCombPIDOmegaPlus = new TH1F("fHistMassWithCombPIDOmegaPlus","#bar{#Omega}^{+} candidates, with Bach. comb. PID;M( #bar{#Lambda}^{0} , K^{+} ) (GeV/c^{2});Counts", 500,1.5,2.5);
894     fListHistCascade->Add(fHistMassWithCombPIDOmegaPlus);
895 }
896
897
898
899         // - Complements for QA
900
901 if(! fHistXiTransvMom ){
902         fHistXiTransvMom  = new TH1F( "fHistXiTransvMom" , "#Xi transverse momentum (cand. around the mass peak) ; p_{t}(#Xi) (GeV/c); Counts", 100, 0.0, 10.0);
903         fListHistCascade->Add(fHistXiTransvMom);
904 }
905
906 if(! fHistXiTotMom ){
907         fHistXiTotMom  = new TH1F( "fHistXiTotMom" , "#Xi momentum norm (cand. around the mass peak); p_{tot}(#Xi) (GeV/c); Counts", 150, 0.0, 15.0);
908         fListHistCascade->Add(fHistXiTotMom);
909 }
910
911
912 if(! fHistBachTransvMomXi ){
913         fHistBachTransvMomXi  = new TH1F( "fHistBachTransvMomXi" , "#Xi Bach. transverse momentum (cand. around the mass peak) ; p_{t}(Bach.) (GeV/c); Counts", 100, 0.0, 5.0);
914         fListHistCascade->Add(fHistBachTransvMomXi);
915 }
916
917 if(! fHistBachTotMomXi ){
918         fHistBachTotMomXi  = new TH1F( "fHistBachTotMomXi" , "#Xi Bach. momentum norm (cand. around the mass peak); p_{tot}(Bach.) (GeV/c); Counts", 100, 0.0, 5.0);
919         fListHistCascade->Add(fHistBachTotMomXi);
920 }
921
922
923 if(! fHistChargeXi ){
924         fHistChargeXi  = new TH1F( "fHistChargeXi" , "Charge of casc. candidates ; Sign ; Counts", 5, -2.0, 3.0);
925         fListHistCascade->Add(fHistChargeXi);
926 }
927
928
929 if (! fHistV0toXiCosineOfPointingAngle) {
930         fHistV0toXiCosineOfPointingAngle = new TH1F("fHistV0toXiCosineOfPointingAngle", "Cos. of V0 Ptng Angl / Xi vtx ;Cos(V0 Point. Angl / Xi vtx); Counts", 100, 0.99, 1.0);
931         fListHistCascade->Add(fHistV0toXiCosineOfPointingAngle);
932 }
933
934
935 if(! fHistRapXi ){
936         fHistRapXi  = new TH1F( "fHistRapXi" , "Rapidity of #Xi candidates (around the mass peak); y ; Counts", 200, -5.0, 5.0);
937         fListHistCascade->Add(fHistRapXi);
938 }
939
940 if(! fHistRapOmega ){
941         fHistRapOmega  = new TH1F( "fHistRapOmega" , "Rapidity of #Omega candidates (around the mass peak); y ; Counts", 200, -5.0, 5.0);
942         fListHistCascade->Add(fHistRapOmega);
943 }
944
945 if(! fHistEtaXi ){
946         fHistEtaXi  = new TH1F( "fHistEtaXi" , "Pseudo-rap. of #Xi candidates (around the mass peak) ; #eta ; Counts", 120, -3.0, 3.0);
947         fListHistCascade->Add(fHistEtaXi);
948 }
949
950 if(! fHistThetaXi ){
951         fHistThetaXi  = new TH1F( "fHistThetaXi" , "#theta of #Xi candidates (around the mass peak); #theta (deg) ; Counts", 180, 0., 180.0);
952         fListHistCascade->Add(fHistThetaXi);
953 }
954
955 if(! fHistPhiXi ){
956         fHistPhiXi  = new TH1F( "fHistPhiXi" , "#phi of #Xi candidates (around the mass peak); #phi (deg) ; Counts", 360, 0., 360.);
957         fListHistCascade->Add(fHistPhiXi);
958 }
959
960
961 if(! fHistcTauXiMinus){
962         fHistcTauXiMinus = new TH1F("fHistcTauXiMinus", "Lifetime c.#tau for #Xi^{-}; L_{3D}.m_{PDG}(#Xi^{-}) / p_{3D} (cm); Counts", 100, 0., 50.);
963         fListHistCascade->Add(fHistcTauXiMinus);
964 }
965
966 if(! fHistcTauXiPlus){
967         fHistcTauXiPlus = new TH1F("fHistcTauXiPlus", "Lifetime c.#tau for #bar{#Xi}^{+}; L_{3D}.m_{PDG}(#bar{#Xi}^{+}) / p_{3D} (cm); Counts", 100, 0., 50.);
968         fListHistCascade->Add(fHistcTauXiPlus);
969 }
970
971 if(! fHistcTauOmegaMinus){
972         fHistcTauOmegaMinus = new TH1F("fHistcTauOmegaMinus", "Lifetime c.#tau for #Omega^{-}; L_{3D}.m_{PDG}(#Omega^{-}) / p_{3D} (cm); Counts", 100, 0., 50.);
973         fListHistCascade->Add(fHistcTauOmegaMinus);
974 }
975
976 if(! fHistcTauOmegaPlus){
977         fHistcTauOmegaPlus = new TH1F("fHistcTauOmegaPlus", "Lifetime c.#tau for #bar{#Omega}^{+}; L_{3D}.m_{PDG}(#bar{#Omega}^{+}) / p_{3D} (cm); Counts", 100, 0., 50.);
978         fListHistCascade->Add(fHistcTauOmegaPlus);
979 }
980
981
982 if(! f2dHistArmenteros) {
983         f2dHistArmenteros = new TH2F( "f2dHistArmenteros", "#alpha_{Arm}(casc. cand.) Vs Pt_{Arm}(casc. cand.); #alpha_{Arm} ; Pt_{Arm} (GeV/c)", 140, -1.2, 1.2, 300, 0., 0.3);
984         fListHistCascade->Add(f2dHistArmenteros);
985 }
986
987 //-------
988
989 if(! f2dHistEffMassLambdaVsEffMassXiMinus) {
990         f2dHistEffMassLambdaVsEffMassXiMinus = new TH2F( "f2dHistEffMassLambdaVsEffMassXiMinus", "M_{#Lambda} Vs M_{#Xi^{-} candidates} ; Inv. M_{#Lambda^{0}} (GeV/c^{2}) ; M( #Lambda , #pi^{-} ) (GeV/c^{2})", 300, 1.1,1.13, 400, 1.2, 2.0);
991         fListHistCascade->Add(f2dHistEffMassLambdaVsEffMassXiMinus);
992 }
993
994 if(! f2dHistEffMassXiVsEffMassOmegaMinus) {
995         f2dHistEffMassXiVsEffMassOmegaMinus = new TH2F( "f2dHistEffMassXiVsEffMassOmegaMinus", "M_{#Xi^{-} candidates} Vs M_{#Omega^{-} candidates} ; M( #Lambda , #pi^{-} ) (GeV/c^{2}) ; M( #Lambda , K^{-} ) (GeV/c^{2})", 400, 1.2, 2.0, 500, 1.5, 2.5);
996         fListHistCascade->Add(f2dHistEffMassXiVsEffMassOmegaMinus);
997 }
998
999 if(! f2dHistEffMassLambdaVsEffMassXiPlus) {
1000         f2dHistEffMassLambdaVsEffMassXiPlus = new TH2F( "f2dHistEffMassLambdaVsEffMassXiPlus", "M_{#Lambda} Vs M_{#bar{#Xi}^{+} candidates} ; Inv. M_{#Lambda^{0}} (GeV/c^{2}) ; M( #Lambda , #pi^{+} ) (GeV/c^{2})", 300, 1.1,1.13, 400, 1.2, 2.0);
1001         fListHistCascade->Add(f2dHistEffMassLambdaVsEffMassXiPlus);
1002 }
1003
1004 if(! f2dHistEffMassXiVsEffMassOmegaPlus) {
1005         f2dHistEffMassXiVsEffMassOmegaPlus = new TH2F( "f2dHistEffMassXiVsEffMassOmegaPlus", "M_{#bar{#Xi}^{+} candidates} Vs M_{#bar{#Omega}^{+} candidates} ; M( #Lambda , #pi^{+} ) (GeV/c^{2}) ; M( #Lambda , K^{+} ) (GeV/c^{2})", 400, 1.2, 2.0, 500, 1.5, 2.5);
1006         fListHistCascade->Add(f2dHistEffMassXiVsEffMassOmegaPlus);
1007 }
1008
1009 //-------
1010
1011 if(! f2dHistXiRadiusVsEffMassXiMinus) {
1012         f2dHistXiRadiusVsEffMassXiMinus = new TH2F( "f2dHistXiRadiusVsEffMassXiMinus", "Transv. R_{Xi Decay} Vs M_{#Xi^{-} candidates}; r_{cascade} (cm); M( #Lambda , #pi^{-} ) (GeV/c^{2}) ", 450, 0., 45.0, 400, 1.2, 2.0);
1013         fListHistCascade->Add(f2dHistXiRadiusVsEffMassXiMinus);
1014 }
1015
1016 if(! f2dHistXiRadiusVsEffMassXiPlus) {
1017         f2dHistXiRadiusVsEffMassXiPlus = new TH2F( "f2dHistXiRadiusVsEffMassXiPlus", "Transv. R_{Xi Decay} Vs M_{#bar{#Xi}^{+} candidates}; r_{cascade} (cm); M( #Lambda , #pi^{+} ) (GeV/c^{2}) ", 450, 0., 45.0, 400, 1.2, 2.0);
1018         fListHistCascade->Add(f2dHistXiRadiusVsEffMassXiPlus);
1019 }
1020
1021 if(! f2dHistXiRadiusVsEffMassOmegaMinus) {
1022         f2dHistXiRadiusVsEffMassOmegaMinus = new TH2F( "f2dHistXiRadiusVsEffMassOmegaMinus", "Transv. R_{Xi Decay} Vs M_{#Omega^{-} candidates}; r_{cascade} (cm); M( #Lambda , K^{-} ) (GeV/c^{2}) ", 450, 0., 45.0, 500, 1.5, 2.5);
1023         fListHistCascade->Add(f2dHistXiRadiusVsEffMassOmegaMinus);
1024 }
1025
1026 if(! f2dHistXiRadiusVsEffMassOmegaPlus) {
1027         f2dHistXiRadiusVsEffMassOmegaPlus = new TH2F( "f2dHistXiRadiusVsEffMassOmegaPlus", "Transv. R_{Xi Decay} Vs M_{#bar{#Omega}^{+} candidates}; r_{cascade} (cm); M( #Lambda , K^{+} ) (GeV/c^{2}) ", 450, 0., 45.0, 500, 1.5, 2.5);
1028         fListHistCascade->Add(f2dHistXiRadiusVsEffMassOmegaPlus);
1029 }
1030
1031 //------
1032
1033 if(! f2dHistTPCdEdxOfCascDghters){
1034         f2dHistTPCdEdxOfCascDghters = new TH2F( "f2dHistTPCdEdxOfCascDghters", "TPC dE/dx of the cascade daughters; charge x || #vec{p}_{TPC inner wall}(Casc. daughter) || (GeV/c); TPC signal (ADC) ", 2000, -10.0, 10.0, 450, 0., 900.);
1035         fListHistCascade->Add(f2dHistTPCdEdxOfCascDghters);
1036 }
1037
1038
1039
1040 // Part 2 : Raw material for yield extraction -------
1041
1042 if(! f3dHistXiPtVsEffMassVsYXiMinus) {
1043         f3dHistXiPtVsEffMassVsYXiMinus = new TH3F( "f3dHistXiPtVsEffMassVsYXiMinus", "Pt_{cascade} Vs M_{#Xi^{-} candidates} Vs Y_{#Xi}; Pt_{cascade} (GeV/c); M( #Lambda , #pi^{-} ) (GeV/c^{2}) ;Y_{#Xi} ", 100, 0., 10.0, 400, 1.2, 2.0, 44, -1.1,1.1);
1044         fListHistCascade->Add(f3dHistXiPtVsEffMassVsYXiMinus);
1045 }
1046
1047 if(! f3dHistXiPtVsEffMassVsYXiPlus) {
1048         f3dHistXiPtVsEffMassVsYXiPlus = new TH3F( "f3dHistXiPtVsEffMassVsYXiPlus", "Pt_{cascade} Vs M_{#bar{#Xi}^{+} candidates} Vs Y_{#Xi}; Pt_{cascade} (GeV/c); M( #Lambda , #pi^{+} ) (GeV/c^{2}); Y_{#Xi}", 100, 0., 10.0, 400, 1.2, 2.0, 44, -1.1,1.1);
1049         fListHistCascade->Add(f3dHistXiPtVsEffMassVsYXiPlus);
1050 }
1051
1052 if(! f3dHistXiPtVsEffMassVsYOmegaMinus) {
1053         f3dHistXiPtVsEffMassVsYOmegaMinus = new TH3F( "f3dHistXiPtVsEffMassVsYOmegaMinus", "Pt_{cascade} Vs M_{#Omega^{-} candidates} Vs Y_{#Omega}; Pt_{cascade} (GeV/c); M( #Lambda , K^{-} ) (GeV/c^{2}); Y_{#Omega}", 100, 0., 10.0, 500, 1.5, 2.5, 44, -1.1,1.1);
1054         fListHistCascade->Add(f3dHistXiPtVsEffMassVsYOmegaMinus);
1055 }
1056
1057 if(! f3dHistXiPtVsEffMassVsYOmegaPlus) {
1058         f3dHistXiPtVsEffMassVsYOmegaPlus = new TH3F( "f3dHistXiPtVsEffMassVsYOmegaPlus", "Pt_{cascade} Vs M_{#bar{#Omega}^{+} candidates} Vs Y_{#Omega}; Pt_{cascade} (GeV/c); M( #Lambda , K^{+} ) (GeV/c^{2}); Y_{#Omega}", 100, 0., 10.0, 500, 1.5, 2.5, 44, -1.1,1.1);
1059         fListHistCascade->Add(f3dHistXiPtVsEffMassVsYOmegaPlus);
1060 }
1061
1062 //--
1063 if(! fCFContCascadePIDXiMinus)  {
1064   const Int_t  lNbSteps      =  7 ;
1065   const Int_t  lNbVariables  =  4 ;
1066
1067   //array for the number of bins in each dimension :
1068   Int_t lNbBinsPerVar[4] = {0};
1069   lNbBinsPerVar[0] = 100;
1070   lNbBinsPerVar[1] = 75;
1071   lNbBinsPerVar[2] = 44;
1072   lNbBinsPerVar[3] = 250;
1073    
1074   
1075   fCFContCascadePIDXiMinus = new AliCFContainer("fCFContCascadePIDXiMinus","Pt_{cascade} Vs M_{#Xi^{-} candidates} Vs Y_{#Xi}", lNbSteps, lNbVariables, lNbBinsPerVar );
1076   
1077   //setting the bin limits (valid  for v4-18-10-AN)
1078   fCFContCascadePIDXiMinus->SetBinLimits(0,   0.0  ,  10.0  );          // Pt(Cascade)
1079   fCFContCascadePIDXiMinus->SetBinLimits(1,   1.25 ,   1.40 );          // Xi Effective mass
1080   fCFContCascadePIDXiMinus->SetBinLimits(2,  -1.1  ,   1.1  );          // Rapidity
1081   if(fCollidingSystems) 
1082         fCFContCascadePIDXiMinus->SetBinLimits(3, 0.0, 20000.0  );    // Primary track Multiplicity
1083   else
1084         fCFContCascadePIDXiMinus->SetBinLimits(3, 0.0, 250.0  );     // Primary track Multiplicity
1085   
1086   // Setting the step title : one per PID case
1087   fCFContCascadePIDXiMinus->SetStepTitle(0, "No PID");
1088   fCFContCascadePIDXiMinus->SetStepTitle(1, "TPC PID / 4-#sigma cut on Bachelor track");
1089   fCFContCascadePIDXiMinus->SetStepTitle(2, "TPC PID / 4-#sigma cut on Bachelor+Baryon tracks");
1090   fCFContCascadePIDXiMinus->SetStepTitle(3, "TPC PID / 4-#sigma cut on Bachelor+Baryon+Meson tracks");
1091   fCFContCascadePIDXiMinus->SetStepTitle(4, "Comb. PID / Bachelor");
1092   fCFContCascadePIDXiMinus->SetStepTitle(5, "Comb. PID / Bachelor+Baryon");
1093   fCFContCascadePIDXiMinus->SetStepTitle(6, "Comb. PID / Bachelor+Baryon+Meson");
1094   
1095   // Setting the variable title, per axis
1096   fCFContCascadePIDXiMinus->SetVarTitle(0, "Pt_{cascade} (GeV/c)");
1097   fCFContCascadePIDXiMinus->SetVarTitle(1, "M( #Lambda , #pi^{-} ) (GeV/c^{2})");
1098   fCFContCascadePIDXiMinus->SetVarTitle(2, "Y_{#Xi}");
1099   fCFContCascadePIDXiMinus->SetVarTitle(3, "Primary track Multiplicity");
1100   
1101   fListHistCascade->Add(fCFContCascadePIDXiMinus);
1102   
1103 }
1104
1105 if(! fCFContCascadePIDXiPlus)  {
1106   const Int_t  lNbSteps      =  7 ;
1107   const Int_t  lNbVariables  =  4 ;
1108
1109   //array for the number of bins in each dimension :
1110   Int_t lNbBinsPerVar[4] = {0};
1111   lNbBinsPerVar[0] = 100;
1112   lNbBinsPerVar[1] = 75;
1113   lNbBinsPerVar[2] = 44;
1114   lNbBinsPerVar[3] = 250;
1115    
1116   
1117   fCFContCascadePIDXiPlus = new AliCFContainer("fCFContCascadePIDXiPlus","Pt_{cascade} Vs M_{#bar{#Xi}^{+} candidates} Vs Y_{#Xi}", lNbSteps, lNbVariables, lNbBinsPerVar );
1118   
1119   
1120   //setting the bin limits (valid  for v4-18-10-AN)
1121   fCFContCascadePIDXiPlus->SetBinLimits(0,   0.0  ,  10.0  );           // Pt(Cascade)
1122   fCFContCascadePIDXiPlus->SetBinLimits(1,   1.25 ,   1.40 );           // Xi Effective mass
1123   fCFContCascadePIDXiPlus->SetBinLimits(2,  -1.1  ,   1.1  );           // Rapidity
1124   if(fCollidingSystems) 
1125         fCFContCascadePIDXiPlus->SetBinLimits(3, 0.0, 20000.0  );    // Primary track Multiplicity
1126   else
1127         fCFContCascadePIDXiPlus->SetBinLimits(3, 0.0, 250.0  );     // Primary track Multiplicity
1128   
1129   // Setting the step title : one per PID case
1130   fCFContCascadePIDXiPlus->SetStepTitle(0, "No PID");
1131   fCFContCascadePIDXiPlus->SetStepTitle(1, "TPC PID / 4-#sigma cut on Bachelor track");
1132   fCFContCascadePIDXiPlus->SetStepTitle(2, "TPC PID / 4-#sigma cut on Bachelor+Baryon tracks");
1133   fCFContCascadePIDXiPlus->SetStepTitle(3, "TPC PID / 4-#sigma cut on Bachelor+Baryon+Meson tracks");
1134   fCFContCascadePIDXiPlus->SetStepTitle(4, "Comb. PID / Bachelor");
1135   fCFContCascadePIDXiPlus->SetStepTitle(5, "Comb. PID / Bachelor+Baryon");
1136   fCFContCascadePIDXiPlus->SetStepTitle(6, "Comb. PID / Bachelor+Baryon+Meson");
1137   
1138   // Setting the variable title, per axis
1139   fCFContCascadePIDXiPlus->SetVarTitle(0, "Pt_{cascade} (GeV/c)");
1140   fCFContCascadePIDXiPlus->SetVarTitle(1, "M( #Lambda , #pi^{+} ) (GeV/c^{2})");
1141   fCFContCascadePIDXiPlus->SetVarTitle(2, "Y_{#Xi}");
1142   fCFContCascadePIDXiPlus->SetVarTitle(3, "Primary track Multiplicity");
1143   
1144   fListHistCascade->Add(fCFContCascadePIDXiPlus);
1145   
1146 }
1147
1148
1149 if(! fCFContCascadePIDOmegaMinus)  {
1150   const Int_t  lNbSteps      =  7 ;
1151   const Int_t  lNbVariables  =  4 ;
1152
1153   //array for the number of bins in each dimension :
1154   Int_t lNbBinsPerVar[4] = {0};
1155   lNbBinsPerVar[0] = 100;
1156   lNbBinsPerVar[1] = 60;
1157   lNbBinsPerVar[2] = 44;
1158   lNbBinsPerVar[3] = 250;
1159    
1160   
1161   fCFContCascadePIDOmegaMinus = new AliCFContainer("fCFContCascadePIDOmegaMinus","Pt_{cascade} Vs M_{#Omega^{-} candidates} Vs Y_{#Omega}", lNbSteps, lNbVariables, lNbBinsPerVar );
1162   
1163   
1164   //setting the bin limits (valid  for v4-18-10-AN)
1165   fCFContCascadePIDOmegaMinus->SetBinLimits(0,   0.0  ,  10.0  );        // Pt(Cascade)
1166   fCFContCascadePIDOmegaMinus->SetBinLimits(1,   1.62 ,   1.74 );        // Omega Effective mass
1167   fCFContCascadePIDOmegaMinus->SetBinLimits(2,  -1.1  ,   1.1  );        // Rapidity
1168   if(fCollidingSystems) 
1169         fCFContCascadePIDOmegaMinus->SetBinLimits(3, 0.0, 20000.0  );    //Primary track Multiplicity
1170   else
1171         fCFContCascadePIDOmegaMinus->SetBinLimits(3, 0.0, 250.0  );     // Primary track Multiplicity
1172   
1173   // Setting the step title : one per PID case
1174   fCFContCascadePIDOmegaMinus->SetStepTitle(0, "No PID");
1175   fCFContCascadePIDOmegaMinus->SetStepTitle(1, "TPC PID / 4-#sigma cut on Bachelor track");
1176   fCFContCascadePIDOmegaMinus->SetStepTitle(2, "TPC PID / 4-#sigma cut on Bachelor+Baryon tracks");
1177   fCFContCascadePIDOmegaMinus->SetStepTitle(3, "TPC PID / 4-#sigma cut on Bachelor+Baryon+Meson tracks");
1178   fCFContCascadePIDOmegaMinus->SetStepTitle(4, "Comb. PID / Bachelor");
1179   fCFContCascadePIDOmegaMinus->SetStepTitle(5, "Comb. PID / Bachelor+Baryon");
1180   fCFContCascadePIDOmegaMinus->SetStepTitle(6, "Comb. PID / Bachelor+Baryon+Meson");
1181   
1182   // Setting the variable title, per axis
1183   fCFContCascadePIDOmegaMinus->SetVarTitle(0, "Pt_{cascade} (GeV/c)");
1184   fCFContCascadePIDOmegaMinus->SetVarTitle(1, "M( #Lambda , K^{-} ) (GeV/c^{2})");
1185   fCFContCascadePIDOmegaMinus->SetVarTitle(2, "Y_{#Omega}");
1186   fCFContCascadePIDOmegaMinus->SetVarTitle(3, "Primary track Multiplicity");
1187   
1188   fListHistCascade->Add(fCFContCascadePIDOmegaMinus);
1189   
1190 }
1191
1192 if(! fCFContCascadePIDOmegaPlus)  {
1193   const Int_t  lNbSteps      =  7 ;
1194   const Int_t  lNbVariables  =  4 ;
1195
1196   //array for the number of bins in each dimension :
1197   Int_t lNbBinsPerVar[4] = {0};
1198   lNbBinsPerVar[0] = 100;
1199   lNbBinsPerVar[1] = 60;
1200   lNbBinsPerVar[2] = 44;
1201   lNbBinsPerVar[3] = 250;
1202    
1203   
1204   fCFContCascadePIDOmegaPlus = new AliCFContainer("fCFContCascadePIDOmegaPlus","Pt_{cascade} Vs M_{#bar{#Omega}^{+} candidates} Vs Y_{#Omega}", lNbSteps, lNbVariables, lNbBinsPerVar );
1205   
1206   
1207   //setting the bin limits (valid  for v4-18-10-AN)
1208   fCFContCascadePIDOmegaPlus->SetBinLimits(0,   0.0  ,  10.0  );        // Pt(Cascade)
1209   fCFContCascadePIDOmegaPlus->SetBinLimits(1,   1.62 ,   1.74 );        // Omega Effective mass
1210   fCFContCascadePIDOmegaPlus->SetBinLimits(2,  -1.1  ,   1.1  );        // Rapidity
1211   if(fCollidingSystems) 
1212         fCFContCascadePIDOmegaPlus->SetBinLimits(3, 0.0, 20000.0  );    // Primary track Multiplicity
1213   else
1214         fCFContCascadePIDOmegaPlus->SetBinLimits(3, 0.0, 250.0  );     // Primary track Multiplicity
1215   
1216   // Setting the step title : one per PID case
1217   fCFContCascadePIDOmegaPlus->SetStepTitle(0, "No PID");
1218   fCFContCascadePIDOmegaPlus->SetStepTitle(1, "TPC PID / 4-#sigma cut on Bachelor track");
1219   fCFContCascadePIDOmegaPlus->SetStepTitle(2, "TPC PID / 4-#sigma cut on Bachelor+Baryon tracks");
1220   fCFContCascadePIDOmegaPlus->SetStepTitle(3, "TPC PID / 4-#sigma cut on Bachelor+Baryon+Meson tracks");
1221   fCFContCascadePIDOmegaPlus->SetStepTitle(4, "Comb. PID / Bachelor");
1222   fCFContCascadePIDOmegaPlus->SetStepTitle(5, "Comb. PID / Bachelor+Baryon");
1223   fCFContCascadePIDOmegaPlus->SetStepTitle(6, "Comb. PID / Bachelor+Baryon+Meson");
1224   
1225   // Setting the variable title, per axis
1226   fCFContCascadePIDOmegaPlus->SetVarTitle(0, "Pt_{cascade} (GeV/c)");
1227   fCFContCascadePIDOmegaPlus->SetVarTitle(1, "M( #Lambda , K^{+} ) (GeV/c^{2})");
1228   fCFContCascadePIDOmegaPlus->SetVarTitle(2, "Y_{#Omega}");
1229   fCFContCascadePIDOmegaPlus->SetVarTitle(3, "Primary track Multiplicity"); 
1230   
1231   fListHistCascade->Add(fCFContCascadePIDOmegaPlus);
1232   
1233 }
1234
1235
1236
1237
1238
1239 // Part 3 : Towards the optimisation of topological selections -------
1240 if(! fCFContCascadeCuts){
1241    
1242         // Container meant to store all the relevant distributions corresponding to the cut variables.
1243         // So far, 20 variables have been identified.
1244         // The following will be done in quite a brut force way ... 
1245         // FIXME Improvement expected later (before Pb-Pb data at least)
1246         //          - Define a user binning to have less bins in each dimension
1247         //          - boolean for enabling/disbaling this CFContainer
1248   const Int_t  lNbSteps      =  4 ;
1249   const Int_t  lNbVariables  =  20 ;
1250   
1251   //array for the number of bins in each dimension :
1252   Int_t lNbBinsPerVar[20] = {0};
1253   lNbBinsPerVar[0]  = 25;
1254   lNbBinsPerVar[1]  = 25;
1255   lNbBinsPerVar[2]  = 20;
1256   lNbBinsPerVar[3]  = 40;
1257   lNbBinsPerVar[4]  = 30;
1258   lNbBinsPerVar[5]  = 25;
1259   
1260   lNbBinsPerVar[6]  = 20;
1261   lNbBinsPerVar[7]  = 40;
1262   lNbBinsPerVar[8]  = 40;
1263   lNbBinsPerVar[9]  = 25;
1264   lNbBinsPerVar[10] = 25;
1265   
1266   lNbBinsPerVar[11] = 75;  // 2-MeV/c2 bins
1267   lNbBinsPerVar[12] = 60;  // 2-MeV/c2 bins
1268   
1269   lNbBinsPerVar[13] = 100;
1270   
1271   lNbBinsPerVar[14] = 44; // 0.05 in rapidity units
1272   lNbBinsPerVar[15] = 44; // 0.05 in rapidity units
1273   
1274   lNbBinsPerVar[16] = 20;
1275  
1276   lNbBinsPerVar[17] = 50;
1277   lNbBinsPerVar[18] = 100;
1278   lNbBinsPerVar[19] = 24;
1279     
1280  fCFContCascadeCuts = new AliCFContainer("fCFContCascadeCuts","Container for Cascade cuts", lNbSteps, lNbVariables, lNbBinsPerVar );
1281   
1282   
1283   //setting the bin limits 
1284    
1285   //0
1286   Double_t *lBinLim0  = new Double_t[ lNbBinsPerVar[0]+1 ];
1287         for(Int_t i=0; i< lNbBinsPerVar[0];i++)  lBinLim0[i]  = (Double_t)0.0   + (4.8  - 0.0 )/(lNbBinsPerVar[0]-1)  * (Double_t)i ;
1288         lBinLim0[ lNbBinsPerVar[0]  ] = 20.0;
1289   fCFContCascadeCuts -> SetBinLimits(0,  lBinLim0 );            // DcaXiDaughters : 0.0 to 5.0  
1290   delete [] lBinLim0;  
1291   //1
1292   Double_t *lBinLim1  = new Double_t[ lNbBinsPerVar[1]+1 ];
1293         for(Int_t i=0; i< lNbBinsPerVar[1];i++)   lBinLim1[i]  = (Double_t)0.0   + (0.24  - 0.0 )/(lNbBinsPerVar[1]-1)  * (Double_t)i ;
1294         lBinLim1[ lNbBinsPerVar[1]  ] = 100.0;
1295   fCFContCascadeCuts -> SetBinLimits(1,  lBinLim1 );            // DcaBachToPrimVertexXi : 0.0 to 0.25  
1296   delete [] lBinLim1;  
1297   //2 
1298   Double_t *lBinLim2  = new Double_t[ lNbBinsPerVar[2]+1 ];
1299         for(Int_t i=1; i< lNbBinsPerVar[2]+1;i++)   lBinLim2[i]  = (Double_t)0.81   + (1.0  - 0.81 )/(lNbBinsPerVar[2]-1)  * (Double_t) (i-1) ;   
1300         lBinLim2[0] = 0.0;
1301   fCFContCascadeCuts -> SetBinLimits(2,  lBinLim2 );            // XiCosineOfPointingAngle : 0.80 to 1.0        
1302   delete [] lBinLim2;  
1303   //3
1304   Double_t *lBinLim3  = new Double_t[ lNbBinsPerVar[3]+1 ];
1305         for(Int_t i=0; i< lNbBinsPerVar[3];i++)   lBinLim3[i]  = (Double_t)0.0   + (3.9  - 0.0 )/(lNbBinsPerVar[3]-1)  * (Double_t)i ;
1306         lBinLim3[ lNbBinsPerVar[3]  ] = 110.0;
1307   fCFContCascadeCuts -> SetBinLimits(3,  lBinLim3 );            // XiRadius : 0.0 to 4.0        
1308   delete [] lBinLim3;  
1309   //4
1310   fCFContCascadeCuts->SetBinLimits(4,    1.1  ,  1.13 );        // InvMassLambdaAsCascDghter
1311   //5
1312   Double_t *lBinLim5  = new Double_t[ lNbBinsPerVar[5]+1 ];
1313         for(Int_t i=0; i< lNbBinsPerVar[5];i++)   lBinLim5[i]  = (Double_t)0.0   + (4.8  - 0.0 )/(lNbBinsPerVar[5]-1)  * (Double_t)i ;
1314         lBinLim5[ lNbBinsPerVar[5]  ] = 20.0;
1315   fCFContCascadeCuts -> SetBinLimits(5,  lBinLim5 );            // DcaV0DaughtersXi : 0.0 to 5.0        
1316   delete [] lBinLim5;  
1317   
1318   
1319   //6 
1320   Double_t *lBinLim6  = new Double_t[ lNbBinsPerVar[6]+1 ];
1321         for(Int_t i=1; i< lNbBinsPerVar[6]+1 ;i++)   lBinLim6[i]  = (Double_t)0.81   + (1.0  - 0.81 )/(lNbBinsPerVar[6]-1)  * (Double_t) (i-1) ;   
1322         lBinLim6[0] = 0.0;
1323   fCFContCascadeCuts -> SetBinLimits(6,  lBinLim6 );            // V0CosineOfPointingAngleXi : 0.80 to 1.0      
1324   delete [] lBinLim6;  
1325   //7
1326   Double_t *lBinLim7  = new Double_t[ lNbBinsPerVar[7]+1 ];
1327         for(Int_t i=0; i< lNbBinsPerVar[7];i++)   lBinLim7[i]  = (Double_t)0.0   + (7.8  - 0.0 )/(lNbBinsPerVar[7]-1)  * (Double_t)i ;
1328         lBinLim7[ lNbBinsPerVar[7]  ] = 100.0;
1329   fCFContCascadeCuts -> SetBinLimits(7,  lBinLim7 );            // V0RadiusXi : 0.0 to 8.0      
1330   delete [] lBinLim7;  
1331   //8
1332   Double_t *lBinLim8  = new Double_t[ lNbBinsPerVar[8]+1 ];
1333         for(Int_t i=0; i< lNbBinsPerVar[8];i++)   lBinLim8[i]  = (Double_t)0.0   + (0.39  - 0.0 )/(lNbBinsPerVar[8]-1)  * (Double_t)i ;
1334         lBinLim8[ lNbBinsPerVar[8]  ] = 100.0;
1335   fCFContCascadeCuts -> SetBinLimits(8,  lBinLim8 );            // DcaV0ToPrimVertexXi : 0.0 to 0.40    
1336   delete [] lBinLim8;  
1337   //9
1338   Double_t *lBinLim9  = new Double_t[ lNbBinsPerVar[9]+1 ];
1339         for(Int_t i=0; i< lNbBinsPerVar[9];i++)   lBinLim9[i]  = (Double_t)0.0   + (0.24  - 0.0 )/(lNbBinsPerVar[9]-1)  * (Double_t)i ;
1340         lBinLim9[ lNbBinsPerVar[9]  ] = 100.0;
1341   fCFContCascadeCuts -> SetBinLimits(9,  lBinLim9 );            // DcaPosToPrimVertexXi : 0.0 to 0.25   
1342   delete [] lBinLim9; 
1343   //10
1344   Double_t *lBinLim10  = new Double_t[ lNbBinsPerVar[10]+1 ];
1345         for(Int_t i=0; i< lNbBinsPerVar[10];i++)   lBinLim10[i]  = (Double_t)0.0   + (0.24  - 0.0 )/(lNbBinsPerVar[10]-1)  * (Double_t)i ;
1346         lBinLim10[ lNbBinsPerVar[10]  ] = 100.0;
1347   fCFContCascadeCuts -> SetBinLimits(10,  lBinLim10 );            // DcaPosToPrimVertexXi : 0.0 to 0.25 
1348   delete [] lBinLim10; 
1349   
1350   //11
1351   fCFContCascadeCuts->SetBinLimits(11,   1.25 ,  1.40 );        // InvMassXi
1352   fCFContCascadeCuts->SetBinLimits(12,   1.62  , 1.74 );        // InvMassOmega
1353   fCFContCascadeCuts->SetBinLimits(13,   0.0  , 10.0  );        // XiTransvMom 
1354   fCFContCascadeCuts->SetBinLimits(14,  -1.1  ,  1.1  );        // Y(Xi)
1355   fCFContCascadeCuts->SetBinLimits(15,  -1.1  ,  1.1  );        // Y(Omega)
1356   fCFContCascadeCuts->SetBinLimits(16, -10.0  , 10.0  );        // BestPrimaryVtxPosZ
1357   if(fCollidingSystems){
1358         fCFContCascadeCuts->SetBinLimits(17,   0.0, 10000.0  );    // nTrackPrimaryMultiplicity
1359         fCFContCascadeCuts->SetBinLimits(18,   0.0, 10000.0  );    // nITSandTPCtracksAndSPDtracklets
1360   }
1361   else{  
1362         //17
1363         //fCFContCascadeCuts->SetBinLimits(17,   0.0, 250.0  );     // nTrackPrimaryMultiplicity
1364         Double_t *lBinLim17  = new Double_t[ lNbBinsPerVar[17]+1 ];
1365                 lBinLim17[0] = 0;       lBinLim17[10] = 10;      lBinLim17[20] = 24;     lBinLim17[30] = 45;    lBinLim17[40] = 95;    lBinLim17[50] = 250;
1366                 lBinLim17[1] = 1;       lBinLim17[11] = 11;      lBinLim17[21] = 25;     lBinLim17[31] = 50;    lBinLim17[41] = 100;
1367                 lBinLim17[2] = 2;       lBinLim17[12] = 13;      lBinLim17[22] = 27;     lBinLim17[32] = 55;    lBinLim17[42] = 105;
1368                 lBinLim17[3] = 3;       lBinLim17[13] = 14;      lBinLim17[23] = 30;     lBinLim17[33] = 60;    lBinLim17[43] = 110;
1369                 lBinLim17[4] = 4;       lBinLim17[14] = 15;      lBinLim17[24] = 31;     lBinLim17[34] = 65;    lBinLim17[44] = 115;
1370                 lBinLim17[5] = 5;       lBinLim17[15] = 16;      lBinLim17[25] = 32;     lBinLim17[35] = 70;    lBinLim17[45] = 120;
1371                 lBinLim17[6] = 6;       lBinLim17[16] = 20;      lBinLim17[26] = 33;     lBinLim17[36] = 75;    lBinLim17[46] = 125;
1372                 lBinLim17[7] = 7;       lBinLim17[17] = 21;      lBinLim17[27] = 34;     lBinLim17[37] = 80;    lBinLim17[47] = 130;
1373                 lBinLim17[8] = 8;       lBinLim17[18] = 22;      lBinLim17[28] = 35;     lBinLim17[38] = 85;    lBinLim17[48] = 135;
1374                 lBinLim17[9] = 9;       lBinLim17[19] = 23;      lBinLim17[29] = 40;     lBinLim17[39] = 90;    lBinLim17[49] = 140;
1375         
1376                 fCFContCascadeCuts -> SetBinLimits(17,  lBinLim17 );            // nTrackPrimaryMultiplicity : 0 to 250 
1377         delete [] lBinLim17;   
1378         
1379         fCFContCascadeCuts->SetBinLimits(18,   0.0, 200.0  );     // nITSandTPCtracksAndSPDtracklets
1380   }
1381   fCFContCascadeCuts->SetBinLimits(19,  68.0  ,164.0  );        // BachTPCClusters
1382   
1383   
1384   // Regular binning definition (valid for v4-18-10-AN on)
1385   /*
1386   fCFContCascadeCuts->SetBinLimits(0,    0.0  ,  2.5  );        // DcaXiDaughters
1387   fCFContCascadeCuts->SetBinLimits(1,    0.0  ,  0.25 );        // DcaBachToPrimVertexXi
1388   fCFContCascadeCuts->SetBinLimits(2,    0.99 ,  1.0  );        // XiCosineOfPointingAngle
1389   fCFContCascadeCuts->SetBinLimits(3,    0.0  ,  4.0  );        // XiRadius
1390   fCFContCascadeCuts->SetBinLimits(4,    1.1  ,  1.15 );        // InvMassLambdaAsCascDghter
1391   fCFContCascadeCuts->SetBinLimits(5,    0.0  ,  1.0  );        // DcaV0DaughtersXi
1392   fCFContCascadeCuts->SetBinLimits(6,    0.98 ,  1.0  );        // V0CosineOfPointingAngleXi
1393   fCFContCascadeCuts->SetBinLimits(7,    0.0  , 20.0  );        // V0RadiusXi
1394   fCFContCascadeCuts->SetBinLimits(8,    0.0  ,  1.0  );        // DcaV0ToPrimVertexXi
1395   fCFContCascadeCuts->SetBinLimits(9,    0.0  ,  0.25 );        // DcaPosToPrimVertexXi
1396   fCFContCascadeCuts->SetBinLimits(10,   0.0  ,  0.25 );        // DcaNegToPrimVertexXi
1397   fCFContCascadeCuts->SetBinLimits(11,   1.25 ,  1.40 );        // InvMassXi
1398   fCFContCascadeCuts->SetBinLimits(12,   1.62  , 1.74 );        // InvMassOmega
1399   fCFContCascadeCuts->SetBinLimits(13,   0.0  , 10.0  );        // XiTransvMom 
1400   fCFContCascadeCuts->SetBinLimits(14,  -1.1  ,  1.1  );        // Y(Xi)
1401   fCFContCascadeCuts->SetBinLimits(15,  -1.1  ,  1.1  );        // Y(Omega)
1402   fCFContCascadeCuts->SetBinLimits(16, -10.0  , 10.0  );        // BestPrimaryVtxPosZ
1403   if(fCollidingSystems){
1404         fCFContCascadeCuts->SetBinLimits(17,   0.0, 10000.0  );    // nTrackPrimaryMultiplicity
1405         fCFContCascadeCuts->SetBinLimits(18,   0.0, 10000.0  );    // nITSandTPCtracksAndSPDtracklets
1406   }
1407   else{  
1408         fCFContCascadeCuts->SetBinLimits(17,   0.0, 250.0  );     // nTrackPrimaryMultiplicity
1409         fCFContCascadeCuts->SetBinLimits(18,   0.0, 200.0  );     // nITSandTPCtracksAndSPDtracklets
1410   }
1411   fCFContCascadeCuts->SetBinLimits(19,  25.0  ,165.0  );        // BachTPCClusters
1412   */
1413   
1414   
1415   // Setting the number of steps : one for each cascade species (Xi-, Xi+ and Omega-, Omega+)
1416   fCFContCascadeCuts->SetStepTitle(0, "#Xi^{-} candidates");
1417   fCFContCascadeCuts->SetStepTitle(1, "#bar{#Xi}^{+} candidates");
1418   fCFContCascadeCuts->SetStepTitle(2, "#Omega^{-} candidates");
1419   fCFContCascadeCuts->SetStepTitle(3, "#bar{#Omega}^{+} candidates");
1420   
1421   // Setting the variable title, per axis
1422   // fCFContCascadeCuts->SetVarTitle(40,  "Chi2Xi");
1423   fCFContCascadeCuts->SetVarTitle(0,  "Dca(XiDaughters) (cm)");
1424   fCFContCascadeCuts->SetVarTitle(1,  "Dca(Bach/PrimVertex) (cm)");
1425   fCFContCascadeCuts->SetVarTitle(2,  "cos(Xi pointing angle)");
1426   fCFContCascadeCuts->SetVarTitle(3,  "R_{2d}(Xi decay) (cm)");
1427   fCFContCascadeCuts->SetVarTitle(4,  "M_{#Lambda}(As Casc Dghter) (GeV/c^{2})");
1428    // fCFContCascadeCuts->SetVarTitle(40,  "V0Chi2Xi");
1429   fCFContCascadeCuts->SetVarTitle(5,  "Dca(V0 Daughters) in Xi (cm)");
1430   
1431   fCFContCascadeCuts->SetVarTitle(6,  "cos(V0 pointing Angle) in Casc");
1432   fCFContCascadeCuts->SetVarTitle(7,  "R_{2d}(V0 decay) (cm)");
1433   fCFContCascadeCuts->SetVarTitle(8,  "Dca(V0/PrimVertex) (cm)");
1434   fCFContCascadeCuts->SetVarTitle(9,  "Dca(Pos/PrimVertex) (cm)");
1435   fCFContCascadeCuts->SetVarTitle(10, "Dca(Neg/PrimVertex) (cm)");
1436   
1437   fCFContCascadeCuts->SetVarTitle(11, "Inv. Mass(Xi) (GeV/c^{2})");
1438   fCFContCascadeCuts->SetVarTitle(12, "Inv. Mass(Omega) (GeV/c^{2})");
1439   
1440   fCFContCascadeCuts->SetVarTitle(13, "pt(Casc.) (GeV/c)");
1441   //fCFContCascadeCuts->SetVarTitle(40, "V0toXiCosineOfPointingAngle");
1442   
1443   fCFContCascadeCuts->SetVarTitle(14, "Y(Xi)");
1444   fCFContCascadeCuts->SetVarTitle(15, "Y(Omega)");
1445   
1446   fCFContCascadeCuts->SetVarTitle(16, "Z-position(BestPrimVtx) (cm)");
1447   
1448   fCFContCascadeCuts->SetVarTitle(17, "Primary Track Multiplicity");
1449   fCFContCascadeCuts->SetVarTitle(18, "(ITS+TPC tracks + SPD tracklets) Multiplicity");
1450   fCFContCascadeCuts->SetVarTitle(19, "Bach.TPC Clusters");
1451   
1452   fListHistCascade->Add(fCFContCascadeCuts);
1453 }
1454
1455
1456
1457 // Part 4 : Angular correlation study -------
1458
1459 if(! fHnSpAngularCorrXiMinus){
1460         // Delta Phi(Casc,any trck) Vs Delta Eta(Casc,any trck) Vs Casc Pt Vs Pt of the tracks
1461         // Delta Phi  = 360 bins de -180., 180.
1462         // Delta Eta  = 120 bins de -3.0, 3.0
1463         // Pt Cascade = 100 bins de 0., 10.0,
1464         // Pt track = 150 bins de 0., 15.0
1465         
1466    Int_t    bins[5] = { 360, 120, 100, 150, 40};
1467    Double_t xmin[5] = {-50., -3.,  0.,  0., 1.30};
1468    Double_t xmax[5] = { 310., 3., 10., 15., 1.34};
1469
1470     TString strHnSparseTitle("");
1471     TString strAxisTitle[5];
1472     if(fAngularCorrelationType == "TrigAnyCasc-AssoAnyPrim" ){
1473         strHnSparseTitle = "Angular Correlation for #Xi^{-}: Trig = Casc. / Asso = all prim. tracks";
1474         strAxisTitle[0]  = " #Delta#phi(Casc,Track) (deg)";
1475         strAxisTitle[1]  = " #Delta#eta(Casc,Track)";
1476         strAxisTitle[2]  = " Pt_{Casc} (GeV/c)";
1477         strAxisTitle[3]  = " Pt_{asso. track} (GeV/c)";
1478     }
1479     else if(fAngularCorrelationType == "TrigCascLeading-AssoAnyPrim"){
1480         strHnSparseTitle = "Angular Correlation for #Xi^{-}: Trig = Casc. (leading part.) / Asso = all prim. tracks";
1481         strAxisTitle[0]  = " #Delta#phi(Casc_{LEADING},Track) (deg)";
1482         strAxisTitle[1]  = " #Delta#eta(Casc_{LEADING},Track)";
1483         strAxisTitle[2]  = " Pt(Casc_{LEADING}) (GeV/c)";
1484         strAxisTitle[3]  = " Pt_{asso. track} (GeV/c)";
1485     }
1486     else if(fAngularCorrelationType == "TrigLeadingTrck-AssoCasc"){
1487         strHnSparseTitle = "Angular Correlation for #Xi^{-}: Trig = leading track / Asso = any cascade";
1488         strAxisTitle[0]  = " #Delta#phi(Leading Track,Casc) (deg)";
1489         strAxisTitle[1]  = " #Delta#eta(Leading Track,Casc)";
1490         strAxisTitle[2]  = " Pt(asso. Casc) (GeV/c)";
1491         strAxisTitle[3]  = " Pt_{Leading track} (GeV/c)";
1492
1493     }
1494         strAxisTitle[4]  = " Eff. Inv Mass (GeV/c^{2})";
1495
1496    fHnSpAngularCorrXiMinus = new THnSparseF("fHnSpAngularCorrXiMinus", strHnSparseTitle.Data(), 5, bins, xmin, xmax);
1497         fHnSpAngularCorrXiMinus->GetAxis(0)->SetTitle( strAxisTitle[0].Data() );
1498         fHnSpAngularCorrXiMinus->GetAxis(1)->SetTitle( strAxisTitle[1].Data() );
1499         fHnSpAngularCorrXiMinus->GetAxis(2)->SetTitle( strAxisTitle[2].Data() );
1500         fHnSpAngularCorrXiMinus->GetAxis(3)->SetTitle( strAxisTitle[3].Data() );
1501         fHnSpAngularCorrXiMinus->GetAxis(4)->SetTitle( strAxisTitle[4].Data() );
1502         fHnSpAngularCorrXiMinus->Sumw2();
1503    fListHistCascade->Add(fHnSpAngularCorrXiMinus);
1504 }
1505
1506 if(! fHnSpAngularCorrXiPlus){
1507         // Delta Phi(Casc,any trck) Vs Delta Eta(Casc,any trck) Vs Casc Pt Vs Pt of the tracks
1508         // Delta Phi  = 360 bins de -180., 180.
1509         // Delta Eta  = 120 bins de -3.0, 3.0
1510         // Pt Cascade = 100 bins de 0., 10.0,
1511         // Pt track = 150 bins de 0., 15.0
1512    Int_t    bins[5] = { 360, 120, 100, 150, 40};
1513    Double_t xmin[5] = {-50., -3.,  0.,  0., 1.30};
1514    Double_t xmax[5] = { 310., 3., 10., 15., 1.34};
1515    
1516     TString strHnSparseTitle("");
1517     TString strAxisTitle[5];
1518     if(fAngularCorrelationType == "TrigAnyCasc-AssoAnyPrim" ){
1519         strHnSparseTitle = "Angular Correlation for #bar{#Xi}^{+}: Trig = Casc. / Asso = all prim. tracks";
1520         strAxisTitle[0]  = " #Delta#phi(Casc,Track) (deg)";
1521         strAxisTitle[1]  = " #Delta#eta(Casc,Track)";
1522         strAxisTitle[2]  = " Pt_{Casc} (GeV/c)";
1523         strAxisTitle[3]  = " Pt_{asso. track} (GeV/c)";
1524     }
1525     else if(fAngularCorrelationType == "TrigCascLeading-AssoAnyPrim"){
1526         strHnSparseTitle = "Angular Correlation for #bar{#Xi}^{+}: Trig = Casc. (leading part.) / Asso = all prim. tracks";
1527         strAxisTitle[0]  = " #Delta#phi(Casc_{LEADING},Track) (deg)";
1528         strAxisTitle[1]  = " #Delta#eta(Casc_{LEADING},Track)";
1529         strAxisTitle[2]  = " Pt(Casc_{LEADING}) (GeV/c)";
1530         strAxisTitle[3]  = " Pt_{asso. track} (GeV/c)";
1531     }
1532     else if(fAngularCorrelationType == "TrigLeadingTrck-AssoCasc"){
1533         strHnSparseTitle = "Angular Correlation for #bar{#Xi}^{+}: Trig = leading track / Asso = any cascade";
1534         strAxisTitle[0]  = " #Delta#phi(Leading Track,Casc) (deg)";
1535         strAxisTitle[1]  = " #Delta#eta(Leading Track,Casc)";
1536         strAxisTitle[2]  = " Pt(asso. Casc) (GeV/c)";
1537         strAxisTitle[3]  = " Pt_{Leading track} (GeV/c)";
1538
1539     }
1540         strAxisTitle[4]  = " Eff. Inv Mass (GeV/c^{2})";
1541
1542    fHnSpAngularCorrXiPlus = new THnSparseF("fHnSpAngularCorrXiPlus", strHnSparseTitle.Data(), 5, bins, xmin, xmax);
1543         fHnSpAngularCorrXiPlus->GetAxis(0)->SetTitle( strAxisTitle[0].Data() );
1544         fHnSpAngularCorrXiPlus->GetAxis(1)->SetTitle( strAxisTitle[1].Data() );
1545         fHnSpAngularCorrXiPlus->GetAxis(2)->SetTitle( strAxisTitle[2].Data() );
1546         fHnSpAngularCorrXiPlus->GetAxis(3)->SetTitle( strAxisTitle[3].Data() );
1547         fHnSpAngularCorrXiPlus->GetAxis(4)->SetTitle( strAxisTitle[4].Data() );
1548         fHnSpAngularCorrXiPlus->Sumw2();
1549    fListHistCascade->Add(fHnSpAngularCorrXiPlus);
1550 }
1551
1552 if(! fHnSpAngularCorrOmegaMinus){
1553         // Delta Phi(Casc,any trck) Vs Delta Eta(Casc,any trck) Vs Casc Pt Vs Pt of the tracks
1554         // Delta Phi  = 360 bins de -180., 180.
1555         // Delta Eta  = 120 bins de -3.0, 3.0
1556         // Pt Cascade = 100 bins de 0., 10.0,
1557         // Pt track = 150 bins de 0., 15.0
1558         
1559    Int_t    bins[5] = { 360, 120, 100, 150, 40};
1560    Double_t xmin[5] = {-50., -3.,  0.,  0., 1.65};
1561    Double_t xmax[5] = { 310., 3., 10., 15., 1.69};
1562    
1563     TString strHnSparseTitle("");
1564     TString strAxisTitle[5];
1565     if(fAngularCorrelationType == "TrigAnyCasc-AssoAnyPrim" ){
1566         strHnSparseTitle = "Angular Correlation for #Omega^{-}: Trig = Casc. / Asso = all prim. tracks";
1567         strAxisTitle[0]  = " #Delta#phi(Casc,Track) (deg)";
1568         strAxisTitle[1]  = " #Delta#eta(Casc,Track)";
1569         strAxisTitle[2]  = " Pt_{Casc} (GeV/c)";
1570         strAxisTitle[3]  = " Pt_{asso. track} (GeV/c)";
1571     }
1572     else if(fAngularCorrelationType == "TrigCascLeading-AssoAnyPrim"){
1573         strHnSparseTitle = "Angular Correlation for #Omega^{-}: Trig = Casc. (leading part.) / Asso = all prim. tracks";
1574         strAxisTitle[0]  = " #Delta#phi(Casc_{LEADING},Track) (deg)";
1575         strAxisTitle[1]  = " #Delta#eta(Casc_{LEADING},Track)";
1576         strAxisTitle[2]  = " Pt(Casc_{LEADING}) (GeV/c)";
1577         strAxisTitle[3]  = " Pt_{asso. track} (GeV/c)";
1578     }
1579     else if(fAngularCorrelationType == "TrigLeadingTrck-AssoCasc"){
1580         strHnSparseTitle = "Angular Correlation for #Omega^{-}: Trig = leading track / Asso = any cascade";
1581         strAxisTitle[0]  = " #Delta#phi(Leading Track,Casc) (deg)";
1582         strAxisTitle[1]  = " #Delta#eta(Leading Track,Casc)";
1583         strAxisTitle[2]  = " Pt(asso. Casc) (GeV/c)";
1584         strAxisTitle[3]  = " Pt_{Leading track} (GeV/c)";
1585
1586     }
1587         strAxisTitle[4]  = " Eff. Inv Mass (GeV/c^{2})";
1588     
1589    fHnSpAngularCorrOmegaMinus = new THnSparseF("fHnSpAngularCorrOmegaMinus", strHnSparseTitle.Data(), 5, bins, xmin, xmax);
1590         fHnSpAngularCorrOmegaMinus->GetAxis(0)->SetTitle( strAxisTitle[0].Data() );
1591         fHnSpAngularCorrOmegaMinus->GetAxis(1)->SetTitle( strAxisTitle[1].Data() );
1592         fHnSpAngularCorrOmegaMinus->GetAxis(2)->SetTitle( strAxisTitle[2].Data() );
1593         fHnSpAngularCorrOmegaMinus->GetAxis(3)->SetTitle( strAxisTitle[3].Data() );
1594         fHnSpAngularCorrOmegaMinus->GetAxis(4)->SetTitle( strAxisTitle[4].Data() );
1595         fHnSpAngularCorrOmegaMinus->Sumw2();
1596    fListHistCascade->Add(fHnSpAngularCorrOmegaMinus);
1597 }
1598
1599 if(! fHnSpAngularCorrOmegaPlus){
1600         // Delta Phi(Casc,any trck) Vs Delta Eta(Casc,any trck) Vs Casc Pt Vs Pt of the tracks
1601         // Delta Phi  = 360 bins de -180., 180.
1602         // Delta Eta  = 120 bins de -3.0, 3.0
1603         // Pt Cascade = 100 bins de 0., 10.0,
1604         // Pt track = 150 bins de 0., 15.0
1605    Int_t    bins[5] = { 360, 120, 100, 150, 40};
1606    Double_t xmin[5] = {-50., -3.,  0.,  0., 1.65};
1607    Double_t xmax[5] = { 310., 3., 10., 15., 1.69};
1608    
1609     TString strHnSparseTitle("");
1610     TString strAxisTitle[5];
1611         if(fAngularCorrelationType == "TrigAnyCasc-AssoAnyPrim" ){
1612         strHnSparseTitle = "Angular Correlation for #bar{#Omega}^{+}: Trig = Casc. / Asso = all prim. tracks";
1613         strAxisTitle[0]  = " #Delta#phi(Casc,Track) (deg)";
1614         strAxisTitle[1]  = " #Delta#eta(Casc,Track)";
1615         strAxisTitle[2]  = " Pt_{Casc} (GeV/c)";
1616         strAxisTitle[3]  = " Pt_{asso. track} (GeV/c)";
1617     }
1618     else if(fAngularCorrelationType == "TrigCascLeading-AssoAnyPrim"){
1619         strHnSparseTitle = "Angular Correlation for #bar{#Omega}^{+}: Trig = Casc. (leading part.) / Asso = all prim. tracks";
1620         strAxisTitle[0]  = " #Delta#phi(Casc_{LEADING},Track) (deg)";
1621         strAxisTitle[1]  = " #Delta#eta(Casc_{LEADING},Track)";
1622         strAxisTitle[2]  = " Pt(Casc_{LEADING}) (GeV/c)";
1623         strAxisTitle[3]  = " Pt_{asso. track} (GeV/c)";
1624     }
1625     else if(fAngularCorrelationType == "TrigLeadingTrck-AssoCasc"){
1626         strHnSparseTitle = "Angular Correlation for #bar{#Omega}^{+}: Trig = leading track / Asso = any cascade";
1627         strAxisTitle[0]  = " #Delta#phi(Leading Track,Casc) (deg)";
1628         strAxisTitle[1]  = " #Delta#eta(Leading Track,Casc)";
1629         strAxisTitle[2]  = " Pt(asso. Casc) (GeV/c)";
1630         strAxisTitle[3]  = " Pt_{Leading track} (GeV/c)";
1631
1632     }
1633         strAxisTitle[4]  = " Eff. Inv Mass (GeV/c^{2})";
1634    
1635    fHnSpAngularCorrOmegaPlus = new THnSparseF("fHnSpAngularCorrOmegaPlus", strHnSparseTitle.Data(), 5, bins, xmin, xmax);
1636         fHnSpAngularCorrOmegaPlus->GetAxis(0)->SetTitle( strAxisTitle[0].Data() );
1637         fHnSpAngularCorrOmegaPlus->GetAxis(1)->SetTitle( strAxisTitle[1].Data() );
1638         fHnSpAngularCorrOmegaPlus->GetAxis(2)->SetTitle( strAxisTitle[2].Data() );
1639         fHnSpAngularCorrOmegaPlus->GetAxis(3)->SetTitle( strAxisTitle[3].Data() );
1640         fHnSpAngularCorrOmegaPlus->GetAxis(4)->SetTitle( strAxisTitle[4].Data() );
1641         fHnSpAngularCorrOmegaPlus->Sumw2();
1642    fListHistCascade->Add(fHnSpAngularCorrOmegaPlus);
1643 }
1644
1645
1646 PostData(1, fListHistCascade);
1647 /* PostData(2, fPaveTextBookKeeping);*/
1648 }// end UserCreateOutputObjects
1649
1650
1651
1652
1653
1654
1655 //________________________________________________________________________
1656 void AliAnalysisTaskCheckCascade::UserExec(Option_t *) 
1657 {
1658   // Main loop
1659   // Called for each event
1660
1661         AliESDEvent *lESDevent = 0x0;
1662         AliAODEvent *lAODevent = 0x0;
1663         Int_t    ncascades                      = -1;
1664         Int_t    nTrackMultiplicity             = -1;
1665         Int_t    nTrackWithTPCrefitMultiplicity = -1;
1666         Int_t    nTrackPrimaryMultiplicity      = -1;
1667         Int_t    nSPDTracklets                   = 0; // AliESDEvent::EstimateMultiplicity will re-initialise the value to 0
1668         Int_t    nITSandTPCtracksAndSPDtracklets = 0; // AliESDEvent::EstimateMultiplicity will re-initialise the value to 0
1669         Int_t    nTracksITSSApure                = 0; // AliESDEvent::EstimateMultiplicity will re-initialise the value to 0
1670
1671         Short_t  lStatusTrackingPrimVtx         = -2;
1672         Double_t lTrkgPrimaryVtxPos[3]          = {-100.0, -100.0, -100.0};
1673         Double_t lBestPrimaryVtxPos[3]          = {-100.0, -100.0, -100.0};
1674         Double_t lMagneticField                 = -10.;
1675
1676         
1677         
1678   // Connect to the InputEvent  
1679   // After these lines, we should have an ESD/AOD event + the number of cascades in it.
1680                 
1681   if(fAnalysisType == "ESD"){
1682         lESDevent = dynamic_cast<AliESDEvent*>( InputEvent() );
1683         if (!lESDevent) {
1684                 AliWarning("ERROR: lESDevent not available \n");
1685                 return;
1686         }
1687         
1688         fHistCascadeMultiplicityBeforeTrigSel->Fill ( lESDevent->GetNumberOfCascades() );
1689         
1690         //-------------------------------------------------
1691         // 0 - Trigger managment
1692         // NOTE : Check the availability of the proper trigger 
1693         
1694         // 1st option
1695                 //AliMCEventHandler *lmcEvtHandler  = dynamic_cast<AliMCEventHandler*>( (AliAnalysisManager::GetAnalysisManager())->GetMCtruthEventHandler() );
1696                 //if( !lmcEvtHandler ){  // !0x0 = real data or !1 = there is an MC handler available (useMC = kTRUE in AnalysisTrainNew), so = data from MC
1697                 //             if ( !( lESDevent->IsTriggerClassFired("CINT1B-ABCE-NOPF-ALL")) ) return;
1698                 //}
1699
1700         // 2nd option - Presuppose the presence of AliPhysicsSelectionTask FIXME
1701         
1702         UInt_t maskIsSelected = ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected();
1703         Bool_t isSelected = 0;
1704         if(     fTriggerMaskType == "kMB")           isSelected = (maskIsSelected & AliVEvent::kMB) == AliVEvent::kMB;
1705         else if(fTriggerMaskType == "kHighMult")     isSelected = (maskIsSelected & AliVEvent::kHighMult) == AliVEvent::kHighMult;
1706         else                                         isSelected = 1; // default = select anyway (use case = run without Phys Selection task)
1707         
1708         if ( ! isSelected ) { 
1709                 PostData(1, fListHistCascade); 
1710                 return;
1711         }
1712         
1713         //else Printf("Event selected ... \n");
1714         
1715         
1716         
1717         //-------------------------------------------------
1718         // 1 - Cascade vertexer (ESD)
1719         
1720         if(fkRerunV0CascVertexers){ // FIXME : relaunch V0 and Cascade vertexers
1721                 if(fAnalysisType == "ESD" ){
1722 //                         lESDevent->ResetCascades();
1723 //                         lESDevent->ResetV0s();
1724 //                 
1725 //                         AliV0vertexer lV0vtxer;
1726 //                         AliCascadeVertexer lCascVtxer;
1727 //                 
1728 //                         lV0vtxer.SetDefaultCuts(fV0Sels);
1729 //                         lCascVtxer.SetDefaultCuts(fCascSels);
1730 //                 
1731 //                         lV0vtxer.Tracks2V0vertices(lESDevent);
1732 //                         lCascVtxer.V0sTracks2CascadeVertices(lESDevent);
1733                }
1734         }// end if(RelaunchV0CascVertexers)
1735         
1736         //-------------------------------------------------
1737         ncascades                      = lESDevent->GetNumberOfCascades();
1738         nTrackWithTPCrefitMultiplicity = DoESDTrackWithTPCrefitMultiplicity(lESDevent);
1739         nTrackPrimaryMultiplicity      = fESDtrackCuts->CountAcceptedTracks(lESDevent);
1740         //EstimateMultiplicity(Int_t &tracklets, Int_t &trITSTPC, Int_t &trITSSApure, Double_t eta, Bool_t useDCAFlag,Bool_t useV0Flag)
1741         lESDevent->EstimateMultiplicity( nSPDTracklets, nITSandTPCtracksAndSPDtracklets, nTracksITSSApure, 1.0, kTRUE, kTRUE);
1742
1743   }//if (fAnalysisType == "ESD")
1744   
1745   
1746   if(fAnalysisType == "AOD"){  
1747           lAODevent = dynamic_cast<AliAODEvent*>( InputEvent() ); 
1748         if (!lAODevent) {
1749                 AliWarning("ERROR: lAODevent not available \n");
1750                 return;
1751         }
1752         ncascades                      = lAODevent->GetNumberOfCascades();
1753         nTrackWithTPCrefitMultiplicity = -1;
1754         nTrackPrimaryMultiplicity      = -1;
1755         
1756         fHistCascadeMultiplicityBeforeTrigSel->Fill ( ncascades );
1757   }
1758
1759   // For AOD or ESD ...
1760         nTrackMultiplicity = (InputEvent())->GetNumberOfTracks();
1761
1762
1763         //-------------------------------------------------
1764         fHistTrackMultiplicityForTrigEvt         ->Fill( nTrackMultiplicity             );
1765         fHistTPCrefitTrackMultiplicityForTrigEvt ->Fill( nTrackWithTPCrefitMultiplicity );
1766         fHistPrimaryTrackMultiplicityForTrigEvt  ->Fill( nTrackPrimaryMultiplicity      );
1767         fHistEstimateITSTPCMultiplicityForTrigEvt->Fill( nITSandTPCtracksAndSPDtracklets);
1768         fHistCascadeMultiplicityForTrigEvt       ->Fill( ncascades                      );
1769
1770
1771
1772
1773   // ---------------------------------------------------------------
1774   // I - Global characteristics of the events + general histos (filled for any selected events and/or for the analysed events)
1775
1776                 // - I.Step 1 : Characteristics of the event : prim. Vtx + magnetic field (ESD)
1777                 //-------------
1778
1779    if(fAnalysisType == "ESD"){
1780         const AliESDVertex *lPrimaryTrackingESDVtx = lESDevent->GetPrimaryVertexTracks();
1781                 // get the vtx stored in ESD found with tracks
1782                 lPrimaryTrackingESDVtx->GetXYZ( lTrkgPrimaryVtxPos );
1783         
1784         
1785         const AliESDVertex *lPrimaryBestESDVtx = lESDevent->GetPrimaryVertex(); 
1786                 // get the best primary vertex available for the event
1787                 // As done in AliCascadeVertexer, we keep the one which is the best one available.
1788                 // between : Tracking vertex > SPD vertex > TPC vertex > default SPD vertex
1789                 // This one will be used for next calculations (DCA essentially)
1790                 lPrimaryBestESDVtx->GetXYZ( lBestPrimaryVtxPos );
1791                 lStatusTrackingPrimVtx  = lPrimaryTrackingESDVtx->GetStatus();
1792
1793         // FIXME : quality cut on the z-position of the prim vertex.
1794         if(fkQualityCutZprimVtxPos) {
1795                 if(TMath::Abs(lBestPrimaryVtxPos[2]) > 10.0 ) { 
1796                         AliWarning("Pb / | Z position of Best Prim Vtx | > 10.0 cm ... return !"); 
1797                         PostData(1, fListHistCascade); 
1798                         return; 
1799                 }
1800         }
1801         
1802         fHistCascadeMultiplicityForTrigEvtAndZprimVtx->Fill( ncascades  );
1803         
1804         // FIXME : quality selection regarding pile-up rejection 
1805         if(fkRejectEventPileUp) {
1806                 if(lESDevent->IsPileupFromSPDInMultBins() ){// 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
1807                         AliWarning("Pb / Event tagged as pile-up by SPD... return !"); 
1808                         PostData(1, fListHistCascade); 
1809                         return; 
1810                 }
1811         }
1812         
1813         fHistCascadeMultiplicityForTrigEvtNonPiledUpAndZprimVtx->Fill( ncascades  );
1814         
1815         // FIXME : remove TPC-only primary vertex : retain only events with tracking + SPD vertex
1816         if(fkQualityCutNoTPConlyPrimVtx) {
1817                 const AliESDVertex *lPrimarySPDVtx = lESDevent->GetPrimaryVertexSPD();
1818                 if (!lPrimarySPDVtx->GetStatus() && !lPrimaryTrackingESDVtx->GetStatus() ){
1819                         AliWarning("Pb / No SPD prim. vertex nor prim. Tracking vertex ... return !");
1820                         PostData(1, fListHistCascade); 
1821                         return;
1822                 }
1823         }
1824         
1825         // NOTE : For older evts
1826         
1827         // As previously done in AliCascadeVertexer, we keep, between both retrieved vertices (SPD or Tracking) 
1828         // the one which is the best one available.
1829         // This one will be used for next calculations (DCA essentially)
1830         // At that time, the TPC-only primary vertex was not considered
1831         
1832         
1833         lMagneticField = lESDevent->GetMagneticField( );
1834         // FIXME if(TMath::Abs(lMagneticField ) < 10e-6) continue;
1835         
1836    }// end if(ESD)
1837         
1838    if(fAnalysisType == "AOD"){
1839         // To be developed
1840         const AliAODVertex *lPrimaryBestAODVtx = lAODevent->GetPrimaryVertex(); 
1841         // get the best primary vertex available for the event
1842         // We may keep the one which is the best one available = GetVertex(0)
1843         // Pb with pile-up to expect
1844         // This one will be used for next calculations (DCA essentially)
1845         lPrimaryBestAODVtx->GetXYZ( lBestPrimaryVtxPos );
1846         
1847         lStatusTrackingPrimVtx  = -1;
1848         lTrkgPrimaryVtxPos[0]   = -100.0;
1849         lTrkgPrimaryVtxPos[1]   = -100.0;
1850         lTrkgPrimaryVtxPos[2]   = -100.0;
1851         lMagneticField = 0.;
1852    }
1853
1854
1855                 // - I.Step 2 : Filling histos that characterize the selected event : x,y,z prim. Vtx distrib. (ESD)
1856                 //-------------
1857
1858         fHistCascadeMultiplicityForSelEvt ->Fill( ncascades );
1859         fHistPosBestPrimaryVtxXForSelEvt  ->Fill( lBestPrimaryVtxPos[0] );
1860         fHistPosBestPrimaryVtxYForSelEvt  ->Fill( lBestPrimaryVtxPos[1] );
1861         fHistPosBestPrimaryVtxZForSelEvt  ->Fill( lBestPrimaryVtxPos[2] );
1862        
1863
1864   
1865   // ---------------------------------------------------------------
1866   // II - Calcultaion Part dedicated to Xi vertices
1867   
1868   for (Int_t iXi = 0; iXi < ncascades; iXi++)
1869   {// This is the begining of the Cascade loop (ESD or AOD)
1870            
1871     // -------------------------------------
1872     // II.Init - Initialisation of the local variables that will be needed for ESD/AOD
1873
1874   
1875         // - 0th part of initialisation : around primary vertex ...
1876         
1877         Double_t lTrkgPrimaryVtxRadius3D = -500.0;
1878         Double_t lBestPrimaryVtxRadius3D = -500.0;
1879
1880         // - 1st part of initialisation : variables needed to store AliESDCascade data members
1881         Double_t lEffMassXi      = 0. ;
1882         Double_t lChi2Xi         = -1. ;
1883         Double_t lDcaXiDaughters = -1. ;
1884         Double_t lXiCosineOfPointingAngle = -1. ;
1885         Double_t lPosXi[3] = { -1000.0, -1000.0, -1000.0 };
1886         Double_t lXiRadius2D = -1000. ;
1887         Double_t lXiRadius3D = -1000. ;
1888         
1889         // - 2nd part of initialisation : Nbr of clusters within TPC for the 3 daughter cascade tracks
1890         Int_t    lPosTPCClusters    = -1; // For ESD only ...//FIXME : wait for availability in AOD
1891         Int_t    lNegTPCClusters    = -1; // For ESD only ...
1892         Int_t    lBachTPCClusters   = -1; // For ESD only ...
1893         
1894         Double_t lInnerWallMomCascDghters[3] = {-100., -100., -100.};
1895         Double_t lTPCSignalCascDghters   [3] = {-100., -100., -100.};
1896         
1897         
1898         // - 3rd part of initialisation : about V0 part in cascades
1899         Double_t lInvMassLambdaAsCascDghter = 0.;
1900         Double_t lV0Chi2Xi         = -1. ;
1901         Double_t lDcaV0DaughtersXi = -1.;
1902                 
1903         Double_t lDcaBachToPrimVertexXi = -1., lDcaV0ToPrimVertexXi = -1.;
1904         Double_t lDcaPosToPrimVertexXi  = -1.;
1905         Double_t lDcaNegToPrimVertexXi  = -1.;
1906         Double_t lV0CosineOfPointingAngleXi = -1. ;
1907         Double_t lPosV0Xi[3] = { -1000. , -1000., -1000. }; // Position of VO coming from cascade
1908         Double_t lV0RadiusXi = -1000.0;
1909         Double_t lV0quality  = 0.;
1910
1911         
1912         // - 4th part of initialisation : Effective masses
1913         Double_t lInvMassXiMinus    = 0.;
1914         Double_t lInvMassXiPlus     = 0.;
1915         Double_t lInvMassOmegaMinus = 0.;
1916         Double_t lInvMassOmegaPlus  = 0.;
1917   
1918         // - 5th part of initialisation : PID treatment
1919         Bool_t   lIsPosInXiProton      = kFALSE;
1920         Bool_t   lIsPosInXiPion        = kFALSE;
1921         Bool_t   lIsPosInOmegaProton   = kFALSE;
1922         Bool_t   lIsPosInOmegaPion     = kFALSE;
1923                         
1924         Bool_t   lIsNegInXiProton      = kFALSE;
1925         Bool_t   lIsNegInXiPion        = kFALSE;
1926         Bool_t   lIsNegInOmegaProton   = kFALSE;
1927         Bool_t   lIsNegInOmegaPion     = kFALSE;
1928         
1929         Bool_t   lIsBachelorKaon       = kFALSE;
1930         Bool_t   lIsBachelorPion       = kFALSE; 
1931         
1932         Bool_t   lIsBachelorKaonForTPC = kFALSE; // For ESD only ...//FIXME : wait for availability in AOD
1933         Bool_t   lIsBachelorPionForTPC = kFALSE; // For ESD only ...
1934         Bool_t   lIsNegPionForTPC      = kFALSE; // For ESD only ...
1935         Bool_t   lIsPosPionForTPC      = kFALSE; // For ESD only ...
1936         Bool_t   lIsNegProtonForTPC    = kFALSE; // For ESD only ...
1937         Bool_t   lIsPosProtonForTPC    = kFALSE; // For ESD only ...
1938
1939         // - 6th part of initialisation : extra info for QA
1940         Double_t lXiMomX       = 0. , lXiMomY = 0., lXiMomZ = 0.;
1941         Double_t lXiTransvMom  = 0. ;
1942         Double_t lXiTotMom     = 0. ;
1943                 
1944         Double_t lBachMomX       = 0., lBachMomY  = 0., lBachMomZ   = 0.;
1945         Double_t lBachTransvMom  = 0.;
1946         Double_t lBachTotMom     = 0.;
1947         
1948         Short_t  lChargeXi = -2;
1949         Double_t lV0toXiCosineOfPointingAngle = 0. ;
1950         
1951         Double_t lRapXi   = -20.0, lRapOmega = -20.0,  lEta = -20.0, lTheta = 360., lPhi = 720. ;
1952         Double_t lAlphaXi = -200., lPtArmXi  = -200.0;
1953         
1954         // - 7th part of initialisation : variables for the AliCFContainer dedicated to cascade cut optmisiation
1955         // Int_t    lSPDTrackletsMultiplicity = -1; // now provided by AliESDEvent::EstimateMultiplicity ...
1956   
1957         // - 8th part of initialisation : variables needed for Angular correlations
1958         TVector3 lTVect3MomXi(0.,0.,0.);
1959         Int_t    lArrTrackID[3] = {-1, -1, -1};
1960
1961           
1962   if(fAnalysisType == "ESD"){ 
1963   
1964   // -------------------------------------
1965   // II.ESD - Calcultaion Part dedicated to Xi vertices (ESD)
1966   
1967         AliESDcascade *xi = lESDevent->GetCascade(iXi);
1968         if (!xi) continue;
1969         
1970         
1971                 // - II.Step 1 : around primary vertex
1972                 //-------------
1973         lTrkgPrimaryVtxRadius3D = TMath::Sqrt(  lTrkgPrimaryVtxPos[0] * lTrkgPrimaryVtxPos[0] +
1974                                                 lTrkgPrimaryVtxPos[1] * lTrkgPrimaryVtxPos[1] +
1975                                                 lTrkgPrimaryVtxPos[2] * lTrkgPrimaryVtxPos[2] );
1976
1977         lBestPrimaryVtxRadius3D = TMath::Sqrt(  lBestPrimaryVtxPos[0] * lBestPrimaryVtxPos[0] +
1978                                                 lBestPrimaryVtxPos[1] * lBestPrimaryVtxPos[1] +
1979                                                 lBestPrimaryVtxPos[2] * lBestPrimaryVtxPos[2] );
1980
1981
1982         
1983                 // - II.Step 2 : Assigning the necessary variables for specific AliESDcascade data members (ESD)        
1984                 //-------------
1985         lV0quality = 0.;
1986         xi->ChangeMassHypothesis(lV0quality , 3312); // default working hypothesis : cascade = Xi- decay
1987
1988         lEffMassXi                      = xi->GetEffMassXi();
1989         lChi2Xi                         = xi->GetChi2Xi();
1990         lDcaXiDaughters                 = xi->GetDcaXiDaughters();
1991         lXiCosineOfPointingAngle        = xi->GetCascadeCosineOfPointingAngle( lBestPrimaryVtxPos[0],
1992                                                                                lBestPrimaryVtxPos[1],
1993                                                                                lBestPrimaryVtxPos[2] );
1994                 // Take care : the best available vertex should be used (like in AliCascadeVertexer)
1995         
1996         xi->GetXYZcascade( lPosXi[0],  lPosXi[1], lPosXi[2] ); 
1997         lXiRadius2D    = TMath::Sqrt( lPosXi[0]*lPosXi[0]  +  lPosXi[1]*lPosXi[1] );
1998         lXiRadius3D    = TMath::Sqrt( lPosXi[0]*lPosXi[0]  +  lPosXi[1]*lPosXi[1] +  lPosXi[2]*lPosXi[2]);
1999                 
2000                 
2001
2002                 // - II.Step 3 : around the tracks : Bach + V0 (ESD)
2003                 // ~ Necessary variables for ESDcascade data members coming from the ESDv0 part (inheritance)
2004                 //-------------
2005                 
2006         UInt_t lIdxPosXi        = (UInt_t) TMath::Abs( xi->GetPindex() );
2007         UInt_t lIdxNegXi        = (UInt_t) TMath::Abs( xi->GetNindex() );
2008         UInt_t lBachIdx         = (UInt_t) TMath::Abs( xi->GetBindex() );
2009                 // Care track label can be negative in MC production (linked with the track quality)
2010                 // However = normally, not the case for track index ...
2011         
2012                 // FIXME : rejection of a double use of a daughter track (nothing but just a crosscheck of what is done in the cascade vertexer)
2013                 if(lBachIdx == lIdxNegXi) {
2014                         AliWarning("Pb / Idx(Bach. track) = Idx(Neg. track) ... continue!"); continue;
2015                 }
2016                 if(lBachIdx == lIdxPosXi) {
2017                         AliWarning("Pb / Idx(Bach. track) = Idx(Pos. track) ... continue!"); continue;
2018                 }
2019         
2020         AliESDtrack *pTrackXi           = lESDevent->GetTrack( lIdxPosXi );
2021         AliESDtrack *nTrackXi           = lESDevent->GetTrack( lIdxNegXi );
2022         AliESDtrack *bachTrackXi        = lESDevent->GetTrack( lBachIdx );
2023                 if (!pTrackXi || !nTrackXi || !bachTrackXi ) {
2024                         AliWarning("ERROR: Could not retrieve one of the 3 ESD daughter tracks of the cascade ...");
2025                         continue;
2026                 }
2027         
2028         
2029         lPosTPCClusters   = pTrackXi->GetTPCNcls();
2030         lNegTPCClusters   = nTrackXi->GetTPCNcls();
2031         lBachTPCClusters  = bachTrackXi->GetTPCNcls();
2032         
2033                 // FIXME : rejection of a poor quality tracks
2034         if(fkQualityCutTPCrefit){
2035                 // 1 - Poor quality related to TPCrefit
2036                 ULong_t pStatus    = pTrackXi->GetStatus();
2037                 ULong_t nStatus    = nTrackXi->GetStatus();
2038                 ULong_t bachStatus = bachTrackXi->GetStatus();
2039                 if ((pStatus&AliESDtrack::kTPCrefit)    == 0) { AliWarning("Pb / V0 Pos. track has no TPCrefit ... continue!"); continue; }
2040                 if ((nStatus&AliESDtrack::kTPCrefit)    == 0) { AliWarning("Pb / V0 Neg. track has no TPCrefit ... continue!"); continue; }
2041                 if ((bachStatus&AliESDtrack::kTPCrefit) == 0) { AliWarning("Pb / Bach.   track has no TPCrefit ... continue!"); continue; }
2042         }
2043         if(fkQualityCut80TPCcls){
2044                 // 2 - Poor quality related to TPC clusters
2045                 if(lPosTPCClusters  < 80) { AliWarning("Pb / V0 Pos. track has less than 80 TPC clusters ... continue!"); continue; }
2046                 if(lNegTPCClusters  < 80) { AliWarning("Pb / V0 Neg. track has less than 80 TPC clusters ... continue!"); continue; }
2047                 if(lBachTPCClusters < 80) { AliWarning("Pb / Bach.   track has less than 80 TPC clusters ... continue!"); continue; }
2048         }
2049         
2050         const AliExternalTrackParam *pExtTrack    = pTrackXi    ->GetInnerParam();
2051         const AliExternalTrackParam *nExtTrack    = nTrackXi    ->GetInnerParam();
2052         const AliExternalTrackParam *bachExtTrack = bachTrackXi ->GetInnerParam();
2053         
2054         if (pExtTrack) {
2055                 lInnerWallMomCascDghters[0] = pExtTrack ->GetP() * pExtTrack ->Charge();
2056                 lTPCSignalCascDghters   [0] = pTrackXi  ->GetTPCsignal();
2057         }
2058         if (nExtTrack) {
2059                 lInnerWallMomCascDghters[1] = nExtTrack ->GetP() * nExtTrack ->Charge();
2060                 lTPCSignalCascDghters   [1] = nTrackXi  ->GetTPCsignal();
2061         }
2062         if (bachExtTrack) {
2063                 lInnerWallMomCascDghters[2] = bachExtTrack ->GetP() * bachExtTrack ->Charge();
2064                 lTPCSignalCascDghters   [2] = bachTrackXi  ->GetTPCsignal();
2065         }
2066
2067
2068         lInvMassLambdaAsCascDghter      = xi->GetEffMass();
2069                 // This value shouldn't change, whatever the working hyp. is : Xi-, Xi+, Omega-, Omega+
2070         lDcaV0DaughtersXi               = xi->GetDcaV0Daughters(); 
2071         lV0Chi2Xi                       = xi->GetChi2V0();
2072         
2073         lV0CosineOfPointingAngleXi      = xi->GetV0CosineOfPointingAngle( lBestPrimaryVtxPos[0],
2074                                                                           lBestPrimaryVtxPos[1],
2075                                                                           lBestPrimaryVtxPos[2] );
2076
2077         lDcaV0ToPrimVertexXi            = xi->GetD( lBestPrimaryVtxPos[0], 
2078                                                     lBestPrimaryVtxPos[1], 
2079                                                     lBestPrimaryVtxPos[2] );
2080                 
2081         lDcaBachToPrimVertexXi = TMath::Abs( bachTrackXi->GetD( lBestPrimaryVtxPos[0], 
2082                                                                 lBestPrimaryVtxPos[1], 
2083                                                                 lMagneticField  ) ); 
2084                                         // Note : AliExternalTrackParam::GetD returns an algebraic value ...
2085                 
2086                 xi->GetXYZ( lPosV0Xi[0],  lPosV0Xi[1], lPosV0Xi[2] ); 
2087         lV0RadiusXi             = TMath::Sqrt( lPosV0Xi[0]*lPosV0Xi[0]  +  lPosV0Xi[1]*lPosV0Xi[1] );
2088         
2089         lDcaPosToPrimVertexXi   = TMath::Abs( pTrackXi  ->GetD( lBestPrimaryVtxPos[0], 
2090                                                                 lBestPrimaryVtxPos[1], 
2091                                                                 lMagneticField  )     ); 
2092         
2093         lDcaNegToPrimVertexXi   = TMath::Abs( nTrackXi  ->GetD( lBestPrimaryVtxPos[0], 
2094                                                                 lBestPrimaryVtxPos[1], 
2095                                                                 lMagneticField  )     ); 
2096                 
2097                 // - II.Step 3' : extra-selection for cascade candidates
2098                 // Towards optimisation of AA selection
2099         // FIXME
2100         if(fkExtraSelections){
2101                 // if(lChi2Xi > 2000) continue;
2102                 // if(lV0Chi2Xi > 2000) continue;
2103                 
2104                 if(lDcaXiDaughters > 0.05) continue; // > 0.1 by default
2105                 //if(lXiCosineOfPointingAngle < 0.999 ) continue;
2106                 if(lXiRadius2D < 1.0) continue;
2107                 if(lXiRadius2D > 100) continue;
2108                 if(TMath::Abs(lInvMassLambdaAsCascDghter-1.11568) > 0.008) continue;
2109                 if(lDcaV0DaughtersXi > 0.3) continue;
2110                 
2111                 if(lV0CosineOfPointingAngleXi > 0.9999) continue;
2112                 //if(lDcaV0ToPrimVertexXi < 0.09) continue;
2113                 if(lDcaBachToPrimVertexXi < 0.04) continue;
2114                 
2115                 if(lV0RadiusXi < 1.0) continue;
2116                 if(lV0RadiusXi > 100) continue;
2117                 //if(lDcaPosToPrimVertexXi < 0.6) continue;
2118                 //if(lDcaNegToPrimVertexXi < 0.6) continue;
2119         }
2120         
2121         
2122         
2123                 // - II.Step 4 : around effective masses (ESD)
2124                 // ~ change mass hypotheses to cover all the possibilities :  Xi-/+, Omega -/+
2125                 //-------------
2126
2127         
2128         if( bachTrackXi->Charge() < 0 ) {
2129                 lV0quality = 0.;
2130                 xi->ChangeMassHypothesis(lV0quality , 3312);    
2131                         // Calculate the effective mass of the Xi- candidate. 
2132                         // pdg code 3312 = Xi-
2133                 lInvMassXiMinus = xi->GetEffMassXi();
2134                 
2135                 lV0quality = 0.;
2136                 xi->ChangeMassHypothesis(lV0quality , 3334);    
2137                         // Calculate the effective mass of the Xi- candidate. 
2138                         // pdg code 3334 = Omega-
2139                 lInvMassOmegaMinus = xi->GetEffMassXi();
2140                                         
2141                 lV0quality = 0.;
2142                 xi->ChangeMassHypothesis(lV0quality , 3312);    // Back to default hyp.
2143         }// end if negative bachelor
2144         
2145         
2146         if( bachTrackXi->Charge() >  0 ){
2147                 lV0quality = 0.;
2148                 xi->ChangeMassHypothesis(lV0quality , -3312);   
2149                         // Calculate the effective mass of the Xi+ candidate. 
2150                         // pdg code -3312 = Xi+
2151                 lInvMassXiPlus = xi->GetEffMassXi();
2152                 
2153                 lV0quality = 0.;
2154                 xi->ChangeMassHypothesis(lV0quality , -3334);   
2155                         // Calculate the effective mass of the Xi+ candidate. 
2156                         // pdg code -3334  = Omega+
2157                 lInvMassOmegaPlus = xi->GetEffMassXi();
2158                 
2159                 lV0quality = 0.;
2160                 xi->ChangeMassHypothesis(lV0quality , -3312);   // Back to "default" hyp.
2161         }// end if positive bachelor
2162         
2163         
2164         
2165                 // - II.Step 5 : PID on the daughter tracks
2166                 //-------------
2167         
2168         // A - Combined PID
2169         // Reasonable guess for the priors for the cascade track sample (e-, mu, pi, K, p)
2170         Double_t lPriorsGuessXi[10]    = {0, 0, 2, 0, 1,  0,0,0,0,0};
2171         Double_t lPriorsGuessOmega[10] = {0, 0, 1, 1, 1,  0,0,0,0,0};
2172         
2173         // Combined VO-positive-daughter PID
2174         AliPID pPidXi;         pPidXi.SetPriors(    lPriorsGuessXi    , kTRUE);  // kTRUE = for charged particle PID
2175         AliPID pPidOmega;      pPidOmega.SetPriors( lPriorsGuessOmega , kTRUE);  // kTRUE = for charged particle PID
2176                 
2177         if( pTrackXi->IsOn(AliESDtrack::kESDpid) ){  // Combined PID exists
2178                 Double_t r[10] = {0.}; pTrackXi->GetESDpid(r);
2179                 pPidXi.SetProbabilities(r);
2180                 pPidOmega.SetProbabilities(r);
2181                 
2182                 // Check if the V0 positive track is a proton (case for Xi-)
2183                 Double_t pproton = pPidXi.GetProbability(AliPID::kProton);
2184                 if (pproton > pPidXi.GetProbability(AliPID::kElectron) &&
2185                     pproton > pPidXi.GetProbability(AliPID::kMuon)     &&
2186                     pproton > pPidXi.GetProbability(AliPID::kPion)     &&
2187                     pproton > pPidXi.GetProbability(AliPID::kKaon)     )     lIsPosInXiProton = kTRUE;
2188                 
2189                 // Check if the V0 positive track is a pi+ (case for Xi+)
2190                 Double_t ppion = pPidXi.GetProbability(AliPID::kPion);
2191                 if (ppion > pPidXi.GetProbability(AliPID::kElectron) &&
2192                     ppion > pPidXi.GetProbability(AliPID::kMuon)     &&
2193                     ppion > pPidXi.GetProbability(AliPID::kKaon)     &&
2194                     ppion > pPidXi.GetProbability(AliPID::kProton)   )     lIsPosInXiPion = kTRUE;
2195                 
2196                 
2197                 // Check if the V0 positive track is a proton (case for Omega-)
2198                 pproton = 0.;
2199                     pproton = pPidOmega.GetProbability(AliPID::kProton);
2200                 if (pproton > pPidOmega.GetProbability(AliPID::kElectron) &&
2201                     pproton > pPidOmega.GetProbability(AliPID::kMuon)     &&
2202                     pproton > pPidOmega.GetProbability(AliPID::kPion)     &&
2203                     pproton > pPidOmega.GetProbability(AliPID::kKaon)     )  lIsPosInOmegaProton = kTRUE;
2204                 
2205                 // Check if the V0 positive track is a pi+ (case for Omega+)
2206                 ppion = 0.;
2207                     ppion = pPidOmega.GetProbability(AliPID::kPion);
2208                 if (ppion > pPidOmega.GetProbability(AliPID::kElectron) &&
2209                     ppion > pPidOmega.GetProbability(AliPID::kMuon)     &&
2210                     ppion > pPidOmega.GetProbability(AliPID::kKaon)     &&
2211                     ppion > pPidOmega.GetProbability(AliPID::kProton)   )    lIsPosInOmegaPion = kTRUE;
2212                 
2213         }// end if V0 positive track with existing combined PID 
2214         
2215         
2216         // Combined VO-negative-daughter PID
2217         AliPID nPidXi;         nPidXi.SetPriors(    lPriorsGuessXi    , kTRUE); // kTRUE = for charged particle PID
2218         AliPID nPidOmega;      nPidOmega.SetPriors( lPriorsGuessOmega , kTRUE); // kTRUE = for charged particle PID
2219                 
2220         if( nTrackXi->IsOn(AliESDtrack::kESDpid) ){  // Combined PID exists
2221                 Double_t r[10] = {0.}; nTrackXi->GetESDpid(r);
2222                 nPidXi.SetProbabilities(r);
2223                 nPidOmega.SetProbabilities(r);
2224                 
2225                 // Check if the V0 negative track is a pi- (case for Xi-)
2226                 Double_t ppion = nPidXi.GetProbability(AliPID::kPion);
2227                 if (ppion > nPidXi.GetProbability(AliPID::kElectron) &&
2228                     ppion > nPidXi.GetProbability(AliPID::kMuon)     &&
2229                     ppion > nPidXi.GetProbability(AliPID::kKaon)     &&
2230                     ppion > nPidXi.GetProbability(AliPID::kProton)   )     lIsNegInXiPion = kTRUE;
2231
2232                 // Check if the V0 negative track is an anti-proton (case for Xi+)
2233                 Double_t pproton = nPidXi.GetProbability(AliPID::kProton);
2234                 if (pproton > nPidXi.GetProbability(AliPID::kElectron) &&
2235                     pproton > nPidXi.GetProbability(AliPID::kMuon)     &&
2236                     pproton > nPidXi.GetProbability(AliPID::kPion)     &&
2237                     pproton > nPidXi.GetProbability(AliPID::kKaon)     )     lIsNegInXiProton = kTRUE;
2238                 
2239                 // Check if the V0 negative track is a pi- (case for Omega-)
2240                 ppion = 0.;
2241                     ppion = nPidOmega.GetProbability(AliPID::kPion);
2242                 if (ppion > nPidOmega.GetProbability(AliPID::kElectron) &&
2243                     ppion > nPidOmega.GetProbability(AliPID::kMuon)     &&
2244                     ppion > nPidOmega.GetProbability(AliPID::kKaon)     &&
2245                     ppion > nPidOmega.GetProbability(AliPID::kProton)   )    lIsNegInOmegaPion = kTRUE;
2246                 
2247                 // Check if the V0 negative track is an anti-proton (case for Omega+)
2248                 pproton = 0.;
2249                          pproton = nPidOmega.GetProbability(AliPID::kProton);
2250                 if (pproton > nPidOmega.GetProbability(AliPID::kElectron) &&
2251                     pproton > nPidOmega.GetProbability(AliPID::kMuon)     &&
2252                     pproton > nPidOmega.GetProbability(AliPID::kPion)     &&
2253                     pproton > nPidOmega.GetProbability(AliPID::kKaon)     )  lIsNegInOmegaProton = kTRUE;
2254                 
2255         }// end if V0 negative track with existing combined PID 
2256         
2257                 
2258         // Combined bachelor PID
2259         AliPID bachPidXi;      bachPidXi.SetPriors(    lPriorsGuessXi   , kTRUE ); // kTRUE = for charged particle PID
2260         AliPID bachPidOmega;   bachPidOmega.SetPriors( lPriorsGuessOmega, kTRUE ); // kTRUE = for charged particle PID
2261         
2262         if( bachTrackXi->IsOn(AliESDtrack::kESDpid) ){  // Combined PID exists
2263                 Double_t r[10] = {0.}; bachTrackXi->GetESDpid(r);
2264                 bachPidXi.SetProbabilities(r);
2265                 bachPidOmega.SetProbabilities(r);
2266                 // Check if the bachelor track is a pion
2267                 Double_t ppion = bachPidXi.GetProbability(AliPID::kPion);
2268                 if (ppion > bachPidXi.GetProbability(AliPID::kElectron) &&
2269                     ppion > bachPidXi.GetProbability(AliPID::kMuon)     &&
2270                     ppion > bachPidXi.GetProbability(AliPID::kKaon)     &&
2271                     ppion > bachPidXi.GetProbability(AliPID::kProton)   )     lIsBachelorPion = kTRUE;
2272                 // Check if the bachelor track is a kaon
2273                 Double_t pkaon = bachPidOmega.GetProbability(AliPID::kKaon);
2274                 if (pkaon > bachPidOmega.GetProbability(AliPID::kElectron) &&
2275                     pkaon > bachPidOmega.GetProbability(AliPID::kMuon)     &&
2276                     pkaon > bachPidOmega.GetProbability(AliPID::kPion)     &&
2277                     pkaon > bachPidOmega.GetProbability(AliPID::kProton)   )  lIsBachelorKaon = kTRUE;  
2278         }// end if bachelor track with existing combined PID
2279         
2280         
2281         // B - TPC PID : 3-sigma bands on Bethe-Bloch curve
2282         
2283         // Bachelor
2284         if (TMath::Abs(fESDpid->NumberOfSigmasTPC( bachTrackXi,AliPID::kKaon)) < 4) lIsBachelorKaonForTPC = kTRUE;
2285         if (TMath::Abs(fESDpid->NumberOfSigmasTPC( bachTrackXi,AliPID::kPion)) < 4) lIsBachelorPionForTPC = kTRUE;
2286         
2287         // Negative V0 daughter
2288         if (TMath::Abs(fESDpid->NumberOfSigmasTPC( nTrackXi,AliPID::kPion   )) < 4) lIsNegPionForTPC   = kTRUE;
2289         if (TMath::Abs(fESDpid->NumberOfSigmasTPC( nTrackXi,AliPID::kProton )) < 4) lIsNegProtonForTPC = kTRUE;
2290         
2291         // Positive V0 daughter
2292         if (TMath::Abs(fESDpid->NumberOfSigmasTPC( pTrackXi,AliPID::kPion   )) < 4) lIsPosPionForTPC   = kTRUE;
2293         if (TMath::Abs(fESDpid->NumberOfSigmasTPC( pTrackXi,AliPID::kProton )) < 4) lIsPosProtonForTPC = kTRUE;
2294         
2295         /*
2296         const AliExternalTrackParam *pInnerWallTrackXi    = pTrackXi    ->GetInnerParam();
2297         const AliExternalTrackParam *nInnerWallTrackXi    = nTrackXi    ->GetInnerParam();
2298         const AliExternalTrackParam *bachInnerWallTrackXi = bachTrackXi ->GetInnerParam();
2299         if(pInnerWallTrackXi && nInnerWallTrackXi && bachInnerWallTrackXi ){
2300                 
2301                 Double_t pMomInnerWall    = pInnerWallTrackXi   ->GetP();
2302                 Double_t nMomInnerWall    = nInnerWallTrackXi   ->GetP();
2303                 Double_t bachMomInnerWall = bachInnerWallTrackXi->GetP();
2304                 
2305                 // Bachelor
2306                 if (TMath::Abs(fESDpid->NumberOfSigmasTPC( bachTrackXi,AliPID::kPion)) < 3)                              lIsBachelorPionForTPC = kTRUE;
2307                 if (bachMomInnerWall < 0.350  && TMath::Abs(fESDpid->NumberOfSigmasTPC( bachTrackXi,AliPID::kKaon)) < 5) lIsBachelorKaonForTPC = kTRUE;
2308                 if (bachMomInnerWall > 0.350  && TMath::Abs(fESDpid->NumberOfSigmasTPC( bachTrackXi,AliPID::kKaon)) < 3) lIsBachelorKaonForTPC = kTRUE;
2309                 
2310                 // Negative V0 daughter
2311                 if (TMath::Abs(fESDpid->NumberOfSigmasTPC( nTrackXi,AliPID::kPion   )) < 3  )                           lIsNegPionForTPC   = kTRUE;
2312                 if (nMomInnerWall < 0.6  && TMath::Abs(fESDpid->NumberOfSigmasTPC( nTrackXi,AliPID::kProton ) ) < 5 )   lIsNegProtonForTPC = kTRUE;
2313                 if (nMomInnerWall > 0.6  && TMath::Abs(fESDpid->NumberOfSigmasTPC( nTrackXi,AliPID::kProton ) ) < 3 )   lIsNegProtonForTPC = kTRUE;
2314                 
2315                 // Positive V0 daughter
2316                 if (TMath::Abs(fESDpid->NumberOfSigmasTPC( pTrackXi,AliPID::kPion   )) < 3 )                            lIsPosPionForTPC   = kTRUE;
2317                 if (pMomInnerWall < 0.6  && TMath::Abs(fESDpid->NumberOfSigmasTPC( pTrackXi,AliPID::kProton )) < 5)     lIsPosProtonForTPC = kTRUE;
2318                 if (pMomInnerWall > 0.6  && TMath::Abs(fESDpid->NumberOfSigmasTPC( pTrackXi,AliPID::kProton )) < 3)     lIsPosProtonForTPC = kTRUE;
2319         }
2320         */
2321         
2322         
2323         
2324                 
2325                 // - II.Step 6 : extra info for QA (ESD)
2326                 // miscellaneous pieces of info that may help regarding data quality assessment.
2327                 //-------------
2328
2329         xi->GetPxPyPz( lXiMomX, lXiMomY, lXiMomZ );
2330                 lXiTransvMom    = TMath::Sqrt( lXiMomX*lXiMomX   + lXiMomY*lXiMomY );
2331                 lXiTotMom       = TMath::Sqrt( lXiMomX*lXiMomX   + lXiMomY*lXiMomY   + lXiMomZ*lXiMomZ );
2332                 
2333         xi->GetBPxPyPz(  lBachMomX,  lBachMomY,  lBachMomZ );
2334                 lBachTransvMom  = TMath::Sqrt( lBachMomX*lBachMomX   + lBachMomY*lBachMomY );
2335                 lBachTotMom     = TMath::Sqrt( lBachMomX*lBachMomX   + lBachMomY*lBachMomY  +  lBachMomZ*lBachMomZ  );
2336
2337         lChargeXi = xi->Charge();
2338
2339         lV0toXiCosineOfPointingAngle = xi->GetV0CosineOfPointingAngle( lPosXi[0], lPosXi[1], lPosXi[2] );
2340         
2341         lRapXi    = xi->RapXi();
2342         lRapOmega = xi->RapOmega();
2343         lEta      = xi->Eta();
2344         lTheta    = xi->Theta() *180.0/TMath::Pi();
2345         lPhi      = xi->Phi()   *180.0/TMath::Pi();
2346         lAlphaXi  = xi->AlphaXi();
2347         lPtArmXi  = xi->PtArmXi();
2348         
2349         
2350         //FIXME : Extra-cut = Anti-splitting cut for lambda daughters
2351         Bool_t kAntiSplittingLambda = kFALSE;
2352         
2353         if(kAntiSplittingLambda){
2354                 Double_t lNMomX = 0., lNMomY = 0., lNMomZ = 0.;
2355                 Double_t lPMomX = 0., lPMomY = 0., lPMomZ = 0.;
2356                 
2357                 xi->GetPPxPyPz(lPMomX, lPMomY, lPMomZ); 
2358                 xi->GetNPxPyPz(lNMomX, lNMomY, lNMomZ); 
2359                 
2360                 if( xi->Charge() < 0){// Xi- or Omega-
2361                         if(TMath::Abs(lBachTransvMom - TMath::Sqrt( lNMomX*lNMomX + lNMomY*lNMomY )  ) < 0.075) continue;
2362                 }
2363                 else {                //Xi+ or Omega+
2364                         if(TMath::Abs(lBachTransvMom - TMath::Sqrt( lPMomX*lPMomX + lPMomY*lPMomY ) ) < 0.075) continue;
2365                 }
2366         }
2367         
2368         //FIXME : Just to know which file is currently open : locate the file containing Xi
2369         // cout << "Name of the file containing Xi candidate(s) :" 
2370         //        << CurrentFileName() 
2371         //        << " / entry: "     << Entry()
2372         //        << " / in file: "   << lESDevent->GetEventNumberInFile()   // <- Cvetan / From Mihaela: AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()->GetTree()->GetReadEntry();
2373         //        << " : mass(Xi) = " << xi->GetEffMassXi() 
2374         //        << " / charge = "   << lChargeXi
2375         //        << " / pt(Casc) = " << lXiTransvMom
2376         //        << " / Decay 2d R(Xi) = " << lXiRadius2D 
2377         //        << " / Track Index(Pos)  = " << lIdxPosXi << "/ Nb(TPC clusters) = " << lPosTPCClusters 
2378         //        << " / Track Index(Neg)  = " << lIdxNegXi << "/ Nb(TPC clusters) = " << lNegTPCClusters 
2379         //        << " / Track Index(Bach) = " << lBachIdx  << "/ Nb(TPC clusters) = " << lBachTPCClusters 
2380         //        << endl;
2381
2382         
2383                 // II.Step 7 - Complementary info for monitoring the cascade cut variables
2384         
2385         //const AliMultiplicity *lAliMult = lESDevent->GetMultiplicity();
2386         //lSPDTrackletsMultiplicity = lAliMult->GetNumberOfTracklets();
2387         // --> now provided by AliESDEvent::EstimateMultiplicity ...
2388         
2389                 // II.Step 8 - Azimuthal correlation study
2390                 //-------------
2391         
2392         lTVect3MomXi.SetXYZ( lXiMomX, lXiMomY, lXiMomZ );
2393         lArrTrackID[0] = pTrackXi   ->GetID();
2394         lArrTrackID[1] = nTrackXi   ->GetID();
2395         lArrTrackID[2] = bachTrackXi->GetID();
2396         
2397         
2398   }// end of ESD treatment
2399   
2400  
2401   if(fAnalysisType == "AOD"){
2402         
2403         // -------------------------------------
2404         // II.AOD - Calcultaion Part dedicated to Xi vertices (ESD)
2405         
2406         const AliAODcascade *xi = lAODevent->GetCascade(iXi);
2407         if (!xi) continue;
2408                 
2409         // Just to know which file is currently open : locate the file containing Xi
2410         // cout << "Name of the file containing Xi candidate(s) :" <<  fesdH->GetTree()->GetCurrentFile()->GetName() << endl;
2411         
2412         
2413                 // - II.Step 1 : Characteristics of the event : prim. Vtx + magnetic field (AOD)
2414                 //-------------
2415         
2416
2417         lTrkgPrimaryVtxRadius3D = -500. ;
2418         // FIXME : We don't have the different prim. vertex at the AOD level -> nothing to do.
2419
2420         lBestPrimaryVtxRadius3D = TMath::Sqrt(  lBestPrimaryVtxPos[0] * lBestPrimaryVtxPos[0] +
2421                                                 lBestPrimaryVtxPos[1] * lBestPrimaryVtxPos[1] +
2422                                                 lBestPrimaryVtxPos[2] * lBestPrimaryVtxPos[2] );
2423                 
2424         
2425                 // - II.Step 2 : Assigning the necessary variables for specific AliAODcascade data members (AOD)        
2426                 //-------------
2427         
2428         lEffMassXi                      = xi->MassXi(); // default working hypothesis : cascade = Xi- decay
2429         lChi2Xi                         = xi->Chi2Xi();
2430         lDcaXiDaughters                 = xi->DcaXiDaughters();
2431         lXiCosineOfPointingAngle        = xi->CosPointingAngleXi( lBestPrimaryVtxPos[0], 
2432                                                                   lBestPrimaryVtxPos[1], 
2433                                                                   lBestPrimaryVtxPos[2] );
2434                                         // Take care : 
2435                                         // the best available vertex should be used (like in AliCascadeVertexer)
2436
2437                 lPosXi[0] = xi->DecayVertexXiX();
2438                 lPosXi[1] = xi->DecayVertexXiY();
2439                 lPosXi[2] = xi->DecayVertexXiZ();
2440         lXiRadius2D = TMath::Sqrt( lPosXi[0]*lPosXi[0]  +  lPosXi[1]*lPosXi[1] );
2441         lXiRadius3D = TMath::Sqrt( lPosXi[0]*lPosXi[0]  +  lPosXi[1]*lPosXi[1] +  lPosXi[2]*lPosXi[2] );
2442                 
2443
2444                 // - II.Step 3 : around the tracks : Bach + V0 (AOD)
2445                 // ~ Necessary variables for AODcascade data members coming from the AODv0 part (inheritance)
2446                 //-------------
2447                 
2448         lChargeXi                       = xi->ChargeXi();
2449         
2450         if( lChargeXi < 0)      
2451           lInvMassLambdaAsCascDghter    = xi->MassLambda();
2452         else                    
2453           lInvMassLambdaAsCascDghter    = xi->MassAntiLambda();
2454
2455         lDcaV0DaughtersXi               = xi->DcaV0Daughters(); 
2456         lV0Chi2Xi                       = xi->Chi2V0();
2457
2458         lV0CosineOfPointingAngleXi      = xi->CosPointingAngle( lBestPrimaryVtxPos );
2459         lDcaV0ToPrimVertexXi            = xi->DcaV0ToPrimVertex();
2460         
2461         lDcaBachToPrimVertexXi          = xi->DcaBachToPrimVertex(); 
2462         
2463         
2464                 lPosV0Xi[0] = xi->DecayVertexV0X();
2465                 lPosV0Xi[1] = xi->DecayVertexV0Y();
2466                 lPosV0Xi[2] = xi->DecayVertexV0Z(); 
2467         lV0RadiusXi     = TMath::Sqrt( lPosV0Xi[0]*lPosV0Xi[0]  +  lPosV0Xi[1]*lPosV0Xi[1] );
2468
2469         lDcaPosToPrimVertexXi           = xi->DcaPosToPrimVertex(); 
2470         lDcaNegToPrimVertexXi           = xi->DcaNegToPrimVertex(); 
2471
2472
2473                 // - II.Step 4 : around effective masses (AOD)
2474                 // ~ change mass hypotheses to cover all the possibilities :  Xi-/+, Omega -/+
2475                 //-------------
2476
2477         if( lChargeXi < 0 )             lInvMassXiMinus         = xi->MassXi();
2478         if( lChargeXi > 0 )             lInvMassXiPlus          = xi->MassXi();
2479         if( lChargeXi < 0 )             lInvMassOmegaMinus      = xi->MassOmega();
2480         if( lChargeXi > 0 )             lInvMassOmegaPlus       = xi->MassOmega();
2481
2482         
2483                 // - II.Step 5 : PID on the daughters (To be developed ...)
2484                 //-------------
2485         
2486         // Combined PID
2487         
2488         /* 
2489         // Reasonable guess for the priors for the cascade track sample
2490         Double_t lPriorsGuessXi[5]    = {0.0, 0.0, 2, 0, 1, 0,0,0,0,0};
2491         Double_t lPriorsGuessOmega[5] = {0.0, 0.0, 1, 1, 1, 0,0,0,0,0};
2492         AliPID bachPidXi;      bachPidXi.SetPriors(    lPriorsGuessXi    , kTRUE); // kTRUE = for charged particle PID
2493         AliPID bachPidOmega;   bachPidOmega.SetPriors( lPriorsGuessOmega , kTRUE); // kTRUE = for charged particle PID
2494         
2495         const AliAODTrack *bachTrackXi = lAODevent->GetTrack( xi->GetBachID() ); // FIXME : GetBachID not implemented ?
2496         
2497         if( bachTrackXi->IsOn(AliESDtrack::kESDpid) ){  // Combined PID exists, the AOD flags = a copy of the ESD ones
2498                 Double_t r[10]; bachTrackXi->GetPID(r);
2499                 bachPidXi.SetProbabilities(r);
2500                 bachPidOmega.SetProbabilities(r);
2501                 // Check if the bachelor track is a pion
2502                 Double_t ppion = bachPidXi.GetProbability(AliPID::kPion);
2503                 if (ppion > bachPidXi.GetProbability(AliPID::kElectron) &&
2504                     ppion > bachPidXi.GetProbability(AliPID::kMuon)     &&
2505                     ppion > bachPidXi.GetProbability(AliPID::kKaon)     &&
2506                     ppion > bachPidXi.GetProbability(AliPID::kProton)   )     lIsBachelorPion = kTRUE;
2507                 // Check if the bachelor track is a kaon
2508                 Double_t pkaon = bachPidOmega.GetProbability(AliPID::kKaon);
2509                 if (pkaon > bachPidOmega.GetProbability(AliPID::kElectron) &&
2510                     pkaon > bachPidOmega.GetProbability(AliPID::kMuon)     &&
2511                     pkaon > bachPidOmega.GetProbability(AliPID::kPion)     &&
2512                     pkaon > bachPidOmega.GetProbability(AliPID::kProton)   )  lIsBachelorKaon = kTRUE;
2513                 
2514         }// end if bachelor track with existing combined PID
2515         */
2516         
2517         // TPC PID
2518         
2519                 // - II.Step 6 : extra info for QA (AOD)
2520                 // miscellaneous pieces onf info that may help regarding data quality assessment.
2521                 //-------------
2522
2523                 lXiMomX = xi->MomXiX();
2524                 lXiMomY = xi->MomXiY();
2525                 lXiMomZ = xi->MomXiZ();
2526         lXiTransvMom    = TMath::Sqrt( lXiMomX*lXiMomX   + lXiMomY*lXiMomY );
2527         lXiTotMom       = TMath::Sqrt( lXiMomX*lXiMomX   + lXiMomY*lXiMomY   + lXiMomZ*lXiMomZ );
2528         
2529                 lBachMomX = xi->MomBachX();
2530                 lBachMomY = xi->MomBachY();
2531                 lBachMomZ = xi->MomBachZ();             
2532         lBachTransvMom  = TMath::Sqrt( lBachMomX*lBachMomX   + lBachMomY*lBachMomY );
2533         lBachTotMom     = TMath::Sqrt( lBachMomX*lBachMomX   + lBachMomY*lBachMomY  +  lBachMomZ*lBachMomZ  );
2534
2535         
2536         lV0toXiCosineOfPointingAngle = xi->CosPointingAngle( xi->GetDecayVertexXi() );
2537         
2538         lRapXi    = xi->RapXi();
2539         lRapOmega = xi->RapOmega();
2540         lEta      = xi->Eta();                          // Will not work ! need a method Pz(), Py() Px() 
2541         lTheta    = xi->Theta() *180.0/TMath::Pi();     // in AODcascade.
2542         lPhi      = xi->Phi()   *180.0/TMath::Pi();     // Here, we will get eta, theta, phi for the V0 ...
2543         lAlphaXi  = xi->AlphaXi();
2544         lPtArmXi  = xi->PtArmXi();
2545
2546                 // II.Step 7 - Complementary info for monitoring the cascade cut variables
2547         //FIXME : missing for AOD : Tacklet Multiplicity + TPCCluster
2548         
2549                 // II.Step 8 - Azimuthal correlation study
2550                 //-------------
2551         
2552         lTVect3MomXi.SetXYZ( lXiMomX, lXiMomY, lXiMomZ );
2553         
2554         AliAODTrack *pTrackXi    = dynamic_cast<AliAODTrack*>( xi->GetDaughter(0) );
2555         AliAODTrack *nTrackXi    = dynamic_cast<AliAODTrack*>( xi->GetDaughter(1) );
2556         AliAODTrack *bachTrackXi = dynamic_cast<AliAODTrack*>( xi->GetDecayVertexXi()->GetDaughter(0) );        
2557                 if (!pTrackXi || !nTrackXi || !bachTrackXi ) {
2558                         AliWarning("ERROR: Could not retrieve one of the 3 AOD daughter tracks of the cascade ...");
2559                         continue;
2560                 }
2561                 
2562         lArrTrackID[0] = pTrackXi   ->GetID();
2563         lArrTrackID[1] = nTrackXi   ->GetID();
2564         lArrTrackID[2] = bachTrackXi->GetID();
2565         
2566   }// end of AOD treatment
2567
2568
2569     // -------------------------------------
2570     // II.Fill - Filling the TH1,2,3Fs, HnSparses, CFContainers, FOR events with CASCADES !
2571         
2572         // if( lIsBachelorKaonForTPC )
2573         //                 // FIXME : Just to know which file is currently open : locate the file containing Xi
2574         // cout << "Name of the file containing Omega candidate(s) :" 
2575         //         << CurrentFileName() 
2576         //         << " / entry: "     << Entry()
2577         //         << " / in file: "   << lESDevent->GetEventNumberInFile()   // <- Cvetan / From Mihaela: AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()->GetTree()->GetReadEntry();
2578         //         << " : mass(Omega+) = " << lInvMassOmegaPlus 
2579         //         << " : mass(Omega-) = " << lInvMassOmegaMinus
2580         //         << " / charge = "   << lChargeXi
2581         //         << " / pt(Casc) = " << lXiTransvMom
2582         //         << " / Decay 2d R(Xi) = " << lXiRadius2D 
2583         //         << endl;
2584   
2585
2586         // - II.Fill.Step 1      : primary vertex
2587   
2588         fHistTPCrefitTrackMultiplicityForCascadeEvt->Fill( nTrackWithTPCrefitMultiplicity );
2589         fHistPrimaryTrackMultiplicityForCascadeEvt ->Fill( nTrackPrimaryMultiplicity );
2590         
2591         fHistPosV0TPCClusters           ->Fill( lPosTPCClusters  );
2592         fHistNegV0TPCClusters           ->Fill( lNegTPCClusters  );
2593         fHistBachTPCClusters            ->Fill( lBachTPCClusters );
2594         
2595         f2dHistTPCdEdxOfCascDghters     ->Fill( lInnerWallMomCascDghters[0] , lTPCSignalCascDghters[0]  );
2596         f2dHistTPCdEdxOfCascDghters     ->Fill( lInnerWallMomCascDghters[1] , lTPCSignalCascDghters[1]  );
2597         f2dHistTPCdEdxOfCascDghters     ->Fill( lInnerWallMomCascDghters[2] , lTPCSignalCascDghters[2]  );
2598         
2599         fHistVtxStatus                  ->Fill( lStatusTrackingPrimVtx   );  // 1 if tracking vtx = ok
2600
2601         if( lStatusTrackingPrimVtx ){
2602                 fHistPosTrkgPrimaryVtxXForCascadeEvt  ->Fill( lTrkgPrimaryVtxPos[0]    );
2603                 fHistPosTrkgPrimaryVtxYForCascadeEvt  ->Fill( lTrkgPrimaryVtxPos[1]    );
2604                 fHistPosTrkgPrimaryVtxZForCascadeEvt  ->Fill( lTrkgPrimaryVtxPos[2]    );
2605                 fHistTrkgPrimaryVtxRadius             ->Fill( lTrkgPrimaryVtxRadius3D );
2606         }
2607
2608         fHistPosBestPrimaryVtxXForCascadeEvt   ->Fill( lBestPrimaryVtxPos[0]    );
2609         fHistPosBestPrimaryVtxYForCascadeEvt   ->Fill( lBestPrimaryVtxPos[1]    );
2610         fHistPosBestPrimaryVtxZForCascadeEvt   ->Fill( lBestPrimaryVtxPos[2]    );
2611         fHistBestPrimaryVtxRadius              ->Fill( lBestPrimaryVtxRadius3D  );
2612         
2613         f2dHistTrkgPrimVtxVsBestPrimVtx->Fill( lTrkgPrimaryVtxRadius3D, lBestPrimaryVtxRadius3D );
2614
2615         // **************************** With PID on ? ... for the signal region ? ************FIXME**************************************
2616         if( ( (lChargeXi<0) && lIsBachelorPionForTPC && lIsPosProtonForTPC && lIsNegPionForTPC ) ||
2617             ( (lChargeXi>0) && lIsBachelorPionForTPC && lIsNegProtonForTPC && lIsPosPionForTPC )  )
2618                 // NOTE : 
2619                 // with this PID condition, it could happen that a cascade candidate satisfies the wrong requirement,
2620                 // e.g. one looks at a Xi- candidate for which lIsBachelorPionForTPC && lIsPosProtonForTPC && lIsNegPionForTPC = kFALSE
2621                 //      Expectation: it should be excluded.
2622                 //      but lIsBachelorPionForTPC && lIsNegProtonForTPC && lIsPosPionForTPC = kTRUE
2623                 //      then this bad Xi-candidate will contribute anyway (OR condition).
2624                 // Hence : the extra condition on the sign of the Cascade
2625         {
2626                 //         if( TMath::Abs( lInvMassXiMinus-1.3217 ) < 0.010 || TMath::Abs( lInvMassXiPlus-1.3217 ) < 0.010){}  }
2627                         
2628                 // II.Fill.Step 2
2629                 fHistEffMassXi                  ->Fill( lEffMassXi               );
2630                 fHistChi2Xi                     ->Fill( lChi2Xi                  );     // Flag CascadeVtxer: Cut Variable a
2631                 fHistDcaXiDaughters             ->Fill( lDcaXiDaughters          );     // Flag CascadeVtxer: Cut Variable e 
2632                 fHistDcaBachToPrimVertex        ->Fill( lDcaBachToPrimVertexXi   );     // Flag CascadeVtxer: Cut Variable d
2633                 fHistXiCosineOfPointingAngle    ->Fill( lXiCosineOfPointingAngle );     // Flag CascadeVtxer: Cut Variable f
2634                 fHistXiRadius                   ->Fill( lXiRadius2D                );   // Flag CascadeVtxer: Cut Variable g+h
2635                 
2636                 
2637                 // II.Fill.Step 3
2638                 fHistMassLambdaAsCascDghter     ->Fill( lInvMassLambdaAsCascDghter );   // Flag CascadeVtxer: Cut Variable c
2639                 fHistV0Chi2Xi                   ->Fill( lV0Chi2Xi                  );   
2640                 fHistDcaV0DaughtersXi           ->Fill( lDcaV0DaughtersXi          );
2641                 fHistV0CosineOfPointingAngleXi  ->Fill( lV0CosineOfPointingAngleXi ); 
2642                 fHistV0RadiusXi                 ->Fill( lV0RadiusXi                );
2643                 
2644                 fHistDcaV0ToPrimVertexXi        ->Fill( lDcaV0ToPrimVertexXi       );   // Flag CascadeVtxer: Cut Variable b
2645                 fHistDcaPosToPrimVertexXi       ->Fill( lDcaPosToPrimVertexXi      );
2646                 fHistDcaNegToPrimVertexXi       ->Fill( lDcaNegToPrimVertexXi      );
2647                 
2648         
2649                 // II.Fill.Step 4 : extra QA info
2650                 
2651                 fHistChargeXi                   ->Fill( lChargeXi      );
2652                 fHistV0toXiCosineOfPointingAngle->Fill( lV0toXiCosineOfPointingAngle );
2653         
2654                 if( TMath::Abs( lInvMassXiMinus-1.3217 ) < 0.010 || TMath::Abs( lInvMassXiPlus-1.3217 ) < 0.010){// One InvMass should be different from 0
2655                         fHistXiTransvMom        ->Fill( lXiTransvMom   );
2656                         fHistXiTotMom           ->Fill( lXiTotMom      );
2657         
2658                         fHistBachTransvMomXi    ->Fill( lBachTransvMom );
2659                         fHistBachTotMomXi       ->Fill( lBachTotMom    );
2660         
2661                         fHistRapXi              ->Fill( lRapXi         );
2662                         fHistEtaXi              ->Fill( lEta           );
2663                         fHistThetaXi            ->Fill( lTheta         );
2664                         fHistPhiXi              ->Fill( lPhi           );
2665
2666                 }
2667                 
2668                 if( (lChargeXi < 0) && (TMath::Abs( lInvMassXiMinus-1.3217 ) < 0.010) )         fHistcTauXiMinus     ->Fill( lXiRadius3D * 1.3271/lXiTotMom );
2669                 if( (lChargeXi > 0) && (TMath::Abs( lInvMassXiPlus -1.3217 ) < 0.010) )         fHistcTauXiPlus      ->Fill( lXiRadius3D * 1.3271/lXiTotMom );
2670
2671                 if( TMath::Abs( lInvMassOmegaMinus-1.672 ) < 0.010 || TMath::Abs( lInvMassOmegaPlus-1.672 ) < 0.010 ){// One InvMass should be different from 0
2672                         fHistRapOmega           ->Fill( lRapOmega            ); 
2673
2674                 }
2675                 
2676                 if( (lChargeXi < 0) && (TMath::Abs( lInvMassOmegaMinus-1.672 ) < 0.010) )        fHistcTauOmegaMinus ->Fill( lXiRadius3D * 1.67245/lXiTotMom );
2677                 if( (lChargeXi > 0) && (TMath::Abs( lInvMassOmegaPlus- 1.672 ) < 0.010) )        fHistcTauOmegaPlus  ->Fill( lXiRadius3D * 1.67245/lXiTotMom );
2678         
2679                 f2dHistArmenteros               ->Fill( lChargeXi*lAlphaXi, lPtArmXi   );
2680         }// end with PID ...
2681         
2682         // II.Fill.Step 5 : inv mass plots 1D
2683         if( lChargeXi < 0 ){
2684                                         fHistMassXiMinus               ->Fill( lInvMassXiMinus    );
2685                                         fHistMassOmegaMinus            ->Fill( lInvMassOmegaMinus );
2686                 if(lIsBachelorPion)     fHistMassWithCombPIDXiMinus    ->Fill( lInvMassXiMinus    );
2687                 if(lIsBachelorKaon)     fHistMassWithCombPIDOmegaMinus ->Fill( lInvMassOmegaMinus );
2688         }
2689         
2690         if( lChargeXi > 0 ){
2691                                         fHistMassXiPlus                ->Fill( lInvMassXiPlus     );
2692                                         fHistMassOmegaPlus             ->Fill( lInvMassOmegaPlus  );
2693                 if(lIsBachelorPion)     fHistMassWithCombPIDXiPlus     ->Fill( lInvMassXiPlus     );
2694                 if(lIsBachelorKaon)     fHistMassWithCombPIDOmegaPlus  ->Fill( lInvMassOmegaPlus  );
2695         }
2696         
2697         
2698         // II.Fill.Step 6 : inv mass plots 2D, 3D
2699         if( lChargeXi < 0 ) {
2700                 f2dHistEffMassLambdaVsEffMassXiMinus->Fill( lInvMassLambdaAsCascDghter, lInvMassXiMinus ); 
2701                 f2dHistEffMassXiVsEffMassOmegaMinus ->Fill( lInvMassXiMinus, lInvMassOmegaMinus );
2702                 f2dHistXiRadiusVsEffMassXiMinus     ->Fill( lXiRadius2D, lInvMassXiMinus );
2703                 f2dHistXiRadiusVsEffMassOmegaMinus  ->Fill( lXiRadius2D, lInvMassOmegaMinus );
2704                 f3dHistXiPtVsEffMassVsYXiMinus      ->Fill( lXiTransvMom, lInvMassXiMinus,    lRapXi    );
2705                 f3dHistXiPtVsEffMassVsYOmegaMinus   ->Fill( lXiTransvMom, lInvMassOmegaMinus, lRapOmega );
2706         }
2707         else{
2708                 f2dHistEffMassLambdaVsEffMassXiPlus ->Fill( lInvMassLambdaAsCascDghter, lInvMassXiPlus );
2709                 f2dHistEffMassXiVsEffMassOmegaPlus  ->Fill( lInvMassXiPlus, lInvMassOmegaPlus );
2710                 f2dHistXiRadiusVsEffMassXiPlus      ->Fill( lXiRadius2D, lInvMassXiPlus);
2711                 f2dHistXiRadiusVsEffMassOmegaPlus   ->Fill( lXiRadius2D, lInvMassOmegaPlus );
2712                 f3dHistXiPtVsEffMassVsYXiPlus       ->Fill( lXiTransvMom, lInvMassXiPlus,    lRapXi    );
2713                 f3dHistXiPtVsEffMassVsYOmegaPlus    ->Fill( lXiTransvMom, lInvMassOmegaPlus, lRapOmega );
2714         }
2715         
2716         // - Filling the AliCFContainers related to PID
2717