2 /**************************************************************************
3 * Authors : Antonin Maire, Boris Hippolyte *
4 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
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 //-----------------------------------------------------------------
33 //class AliMCEventHandler;
42 #include <Riostream.h>
47 #include "THnSparse.h"
56 #include "AliESDEvent.h"
57 #include "AliAODEvent.h"
58 // #include "AliV0vertexer.h"
59 // #include "AliCascadeVertexer.h"
60 #include "AliESDpid.h"
61 #include "AliESDtrackCuts.h"
63 #include "AliInputEventHandler.h"
64 #include "AliAnalysisManager.h"
65 #include "AliMCEventHandler.h"
67 #include "AliCFContainer.h"
68 #include "AliMultiplicity.h"
70 #include "AliESDcascade.h"
71 #include "AliAODcascade.h"
73 #include "AliAnalysisTaskCheckCascade.h"
75 ClassImp(AliAnalysisTaskCheckCascade)
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"),
92 // - Cascade part initialisation
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),
104 fHistPosTrkgPrimaryVtxXForCascadeEvt(0), fHistPosTrkgPrimaryVtxYForCascadeEvt(0), fHistPosTrkgPrimaryVtxZForCascadeEvt(0), fHistTrkgPrimaryVtxRadius(0),
105 fHistPosBestPrimaryVtxXForCascadeEvt(0), fHistPosBestPrimaryVtxYForCascadeEvt(0), fHistPosBestPrimaryVtxZForCascadeEvt(0), fHistBestPrimaryVtxRadius(0),
106 f2dHistTrkgPrimVtxVsBestPrimVtx(0),
108 fHistEffMassXi(0), fHistChi2Xi(0),
109 fHistDcaXiDaughters(0), fHistDcaBachToPrimVertex(0), fHistXiCosineOfPointingAngle(0), fHistXiRadius(0),
111 fHistMassLambdaAsCascDghter(0),
113 fHistDcaV0DaughtersXi(0),
114 fHistDcaV0ToPrimVertexXi(0),
115 fHistV0CosineOfPointingAngleXi(0),
117 fHistDcaPosToPrimVertexXi(0), fHistDcaNegToPrimVertexXi(0),
119 fHistMassXiMinus(0), fHistMassXiPlus(0),
120 fHistMassOmegaMinus(0), fHistMassOmegaPlus(0),
121 fHistMassWithCombPIDXiMinus(0), fHistMassWithCombPIDXiPlus(0),
122 fHistMassWithCombPIDOmegaMinus(0), fHistMassWithCombPIDOmegaPlus(0),
124 fHistXiTransvMom(0), fHistXiTotMom(0),
125 fHistBachTransvMomXi(0), fHistBachTotMomXi(0),
128 fHistV0toXiCosineOfPointingAngle(0),
130 fHistRapXi(0), fHistRapOmega(0), fHistEtaXi(0),
131 fHistThetaXi(0), fHistPhiXi(0),
133 fHistcTauXiMinus(0), fHistcTauXiPlus(0), fHistcTauOmegaMinus(0), fHistcTauOmegaPlus(0),
135 f2dHistArmenteros(0),
136 f2dHistEffMassLambdaVsEffMassXiMinus(0), f2dHistEffMassXiVsEffMassOmegaMinus(0),
137 f2dHistEffMassLambdaVsEffMassXiPlus(0), f2dHistEffMassXiVsEffMassOmegaPlus(0),
138 f2dHistXiRadiusVsEffMassXiMinus(0), f2dHistXiRadiusVsEffMassXiPlus(0),
139 f2dHistXiRadiusVsEffMassOmegaMinus(0), f2dHistXiRadiusVsEffMassOmegaPlus(0),
141 f2dHistTPCdEdxOfCascDghters(0),
143 f3dHistXiPtVsEffMassVsYXiMinus(0), f3dHistXiPtVsEffMassVsYXiPlus(0),
144 f3dHistXiPtVsEffMassVsYOmegaMinus(0), f3dHistXiPtVsEffMassVsYOmegaPlus(0),
146 fCFContCascadePIDXiMinus(0),
147 fCFContCascadePIDXiPlus(0),
148 fCFContCascadePIDOmegaMinus(0),
149 fCFContCascadePIDOmegaPlus(0),
150 fCFContCascadeCuts(0),
152 fHnSpAngularCorrXiMinus(0), fHnSpAngularCorrXiPlus(0),
153 fHnSpAngularCorrOmegaMinus(0), fHnSpAngularCorrOmegaPlus(0)
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.; }
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"),
182 // - Cascade part initialisation
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),
194 fHistPosTrkgPrimaryVtxXForCascadeEvt(0), fHistPosTrkgPrimaryVtxYForCascadeEvt(0), fHistPosTrkgPrimaryVtxZForCascadeEvt(0), fHistTrkgPrimaryVtxRadius(0),
195 fHistPosBestPrimaryVtxXForCascadeEvt(0), fHistPosBestPrimaryVtxYForCascadeEvt(0), fHistPosBestPrimaryVtxZForCascadeEvt(0), fHistBestPrimaryVtxRadius(0),
196 f2dHistTrkgPrimVtxVsBestPrimVtx(0),
198 fHistEffMassXi(0), fHistChi2Xi(0),
199 fHistDcaXiDaughters(0), fHistDcaBachToPrimVertex(0), fHistXiCosineOfPointingAngle(0), fHistXiRadius(0),
201 fHistMassLambdaAsCascDghter(0),
203 fHistDcaV0DaughtersXi(0),
204 fHistDcaV0ToPrimVertexXi(0),
205 fHistV0CosineOfPointingAngleXi(0),
207 fHistDcaPosToPrimVertexXi(0), fHistDcaNegToPrimVertexXi(0),
209 fHistMassXiMinus(0), fHistMassXiPlus(0),
210 fHistMassOmegaMinus(0), fHistMassOmegaPlus(0),
211 fHistMassWithCombPIDXiMinus(0), fHistMassWithCombPIDXiPlus(0),
212 fHistMassWithCombPIDOmegaMinus(0), fHistMassWithCombPIDOmegaPlus(0),
214 fHistXiTransvMom(0), fHistXiTotMom(0),
215 fHistBachTransvMomXi(0), fHistBachTotMomXi(0),
218 fHistV0toXiCosineOfPointingAngle(0),
220 fHistRapXi(0), fHistRapOmega(0), fHistEtaXi(0),
221 fHistThetaXi(0), fHistPhiXi(0),
223 fHistcTauXiMinus(0), fHistcTauXiPlus(0), fHistcTauOmegaMinus(0), fHistcTauOmegaPlus(0),
225 f2dHistArmenteros(0),
226 f2dHistEffMassLambdaVsEffMassXiMinus(0), f2dHistEffMassXiVsEffMassOmegaMinus(0),
227 f2dHistEffMassLambdaVsEffMassXiPlus(0), f2dHistEffMassXiVsEffMassOmegaPlus(0),
228 f2dHistXiRadiusVsEffMassXiMinus(0), f2dHistXiRadiusVsEffMassXiPlus(0),
229 f2dHistXiRadiusVsEffMassOmegaMinus(0), f2dHistXiRadiusVsEffMassOmegaPlus(0),
231 f2dHistTPCdEdxOfCascDghters(0),
233 f3dHistXiPtVsEffMassVsYXiMinus(0), f3dHistXiPtVsEffMassVsYXiPlus(0),
234 f3dHistXiPtVsEffMassVsYOmegaMinus(0), f3dHistXiPtVsEffMassVsYOmegaPlus(0),
236 fCFContCascadePIDXiMinus(0),
237 fCFContCascadePIDXiPlus(0),
238 fCFContCascadePIDOmegaMinus(0),
239 fCFContCascadePIDOmegaPlus(0),
240 fCFContCascadeCuts(0),
242 fHnSpAngularCorrXiMinus(0), fHnSpAngularCorrXiPlus(0),
243 fHnSpAngularCorrOmegaMinus(0), fHnSpAngularCorrOmegaPlus(0)
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)
253 for(Int_t iAlephIdx = 0; iAlephIdx < 5; iAlephIdx++ ) { fAlephParameters [iAlephIdx] = -1.; }
255 // New Loose : 1st step for the 7 TeV pp analysis
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)
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 )
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
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)
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 )
296 //New default vtxR (http://alisoft.cern.ch/viewvc?view=rev&root=AliRoot&revision=40955, 5 May 2010)
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)
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 )
316 // Tight for Xi in p-p (http://alisoft.cern.ch/viewvc?view=rev&root=AliRoot&revision=40955, 5 May 2010)
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)
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 )
337 // For PbPb coming data, take a look at Iouri's proposal
338 // https://savannah.cern.ch/bugs/index.php?69877
341 // Output slot #0 writes into a TList container (Cascade)
342 DefineOutput(1, TList::Class());
343 /*DefineOutput(2, TPaveText::Class());*/
347 AliAnalysisTaskCheckCascade::~AliAnalysisTaskCheckCascade()
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() ...
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
365 //________________________________________________________________________
366 void AliAnalysisTaskCheckCascade::UserCreateOutputObjects()
373 fListHistCascade = new TList();
374 fListHistCascade->SetOwner(); // See http://root.cern.ch/root/html/TCollection.html#TCollection:SetOwner
379 AliMCEventHandler *lmcEvtHandler = dynamic_cast<AliMCEventHandler*>( (AliAnalysisManager::GetAnalysisManager())->GetMCtruthEventHandler() );
381 if( !lmcEvtHandler ){ // !0x0 = real data or !1 = there is an MC handler available (useMC = kTRUE in AnalysisTrainNew), so = data from MC
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;
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;
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]);
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;
412 // Home made parameterization for LHC10e13 production = p+p 900 GeV/c
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;
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;
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]);
433 fESDpid = new AliESDpid();
434 fESDpid->GetTPCResponse().SetBetheBlochParameters( fAlephParameters[0],
438 fAlephParameters[4] );
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...");
449 if( !fPaveTextBookKeeping){
450 // FIXME : prepare a field with the AliRoot+root distrib ...
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);
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 ");
466 fPaveTextBookKeeping->AddText("- - - - - - - - - - - ");
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] ));
478 fPaveTextBookKeeping->AddText(" ");
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] ));
490 else{ fPaveTextBookKeeping->AddText("A. No rerunning of the V0/Casc. vertexers ... See std cuts in (AliRoot+Rec.C) used for this prod. cycle");}
492 fPaveTextBookKeeping->AddText("- - - - - - - - - - - ");
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 ");
505 fPaveTextBookKeeping->AddText("- - - - - - - - - - - ");
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] ));
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",
524 else // pp collisions
525 fHistCascadeMultiplicityBeforeTrigSel = new TH1F("fHistCascadeMultiplicityBeforeTrigSel",
526 "Cascades per event (before Trig. Sel.);Nbr of Cascades/Evt;Events",
528 fListHistCascade->Add(fHistCascadeMultiplicityBeforeTrigSel);
531 // - Histos for events passing the trigger selection
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",
539 else // pp collisions
540 fHistCascadeMultiplicityForTrigEvt = new TH1F("fHistCascadeMultiplicityForTrigEvt",
541 "Cascades per event (for triggered evt);Nbr of Cascades/Evt;Events",
543 fListHistCascade->Add(fHistCascadeMultiplicityForTrigEvt);
547 if(! fHistTrackMultiplicityForTrigEvt) {
548 if(fCollidingSystems)// AA collisions
549 fHistTrackMultiplicityForTrigEvt = new TH1F("fHistTrackMultiplicityForTrigEvt",
550 "Track Multiplicity (for triggered evt);Nbr of tracks/Evt;Events",
552 else // pp collisions
553 fHistTrackMultiplicityForTrigEvt = new TH1F("fHistTrackMultiplicityForTrigEvt",
554 "Track Multiplicity (for triggered evt);Nbr of tracks/Evt;Events",
556 fListHistCascade->Add(fHistTrackMultiplicityForTrigEvt);
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",
564 else // pp collisions
565 fHistTPCrefitTrackMultiplicityForTrigEvt = new TH1F("fHistTPCrefitTrackMultiplicityForTrigEvt",
566 "TPCrefit track Multiplicity (for triggered evt);Nbr of TPCrefit tracks/Evt;Events",
568 fListHistCascade->Add(fHistTPCrefitTrackMultiplicityForTrigEvt);
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",
577 else // pp collisions
578 fHistPrimaryTrackMultiplicityForTrigEvt = new TH1F("fHistPrimaryTrackMultiplicityForTrigEvt",
579 "Primary track Multiplicity (for triggered evt);Nbr of primary tracks/Evt;Events",
581 fListHistCascade->Add(fHistPrimaryTrackMultiplicityForTrigEvt);
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",
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",
594 fListHistCascade->Add(fHistEstimateITSTPCMultiplicityForTrigEvt);
599 // - Histos for events passing the trigger selection + |z(prim. vertex)| < XX cm
602 if(! fHistCascadeMultiplicityForTrigEvtAndZprimVtx) {
603 if(fCollidingSystems)// AA collisions
604 fHistCascadeMultiplicityForTrigEvtAndZprimVtx = new TH1F("fHistCascadeMultiplicityForTrigEvtAndZprimVtx",
605 "Cascades per event;Nbr of Cascades/Evt;Events",
607 else // pp collisions
608 fHistCascadeMultiplicityForTrigEvtAndZprimVtx = new TH1F("fHistCascadeMultiplicityForTrigEvtAndZprimVtx",
609 "Cascades per event;Nbr of Cascades/Evt;Events",
611 fListHistCascade->Add(fHistCascadeMultiplicityForTrigEvtAndZprimVtx);
615 // - Histos for events passing the trigger selection + |z(prim. vertex)| < XX cm + after pile-up rejection
618 if(! fHistCascadeMultiplicityForTrigEvtNonPiledUpAndZprimVtx) {
619 if(fCollidingSystems)// AA collisions
620 fHistCascadeMultiplicityForTrigEvtNonPiledUpAndZprimVtx = new TH1F("fHistCascadeMultiplicityForTrigEvtNonPiledUpAndZprimVtx",
621 "Cascades per event;Nbr of Cascades/Evt;Events",
623 else // pp collisions
624 fHistCascadeMultiplicityForTrigEvtNonPiledUpAndZprimVtx = new TH1F("fHistCascadeMultiplicityForTrigEvtNonPiledUpAndZprimVtx",
625 "Cascades per event;Nbr of Cascades/Evt;Events",
627 fListHistCascade->Add(fHistCascadeMultiplicityForTrigEvtNonPiledUpAndZprimVtx);
631 // - Histos for events passing the event selection at the analysis level
634 if(! fHistCascadeMultiplicityForSelEvt) {
635 if(fCollidingSystems)// AA collisions
636 fHistCascadeMultiplicityForSelEvt = new TH1F("fHistCascadeMultiplicityForSelEvt",
637 "Cascades per event;Nbr of Cascades/Evt;Events",
639 else // pp collisions
640 fHistCascadeMultiplicityForSelEvt = new TH1F("fHistCascadeMultiplicityForSelEvt",
641 "Cascades per event;Nbr of Cascades/Evt;Events",
643 fListHistCascade->Add(fHistCascadeMultiplicityForSelEvt);
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);
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);
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);
665 // - Histos for events containing at least ONE CASCADE
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",
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",
677 fListHistCascade->Add(fHistTPCrefitTrackMultiplicityForCascadeEvt);
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",
685 else // pp collisions
686 fHistPrimaryTrackMultiplicityForCascadeEvt = new TH1F("fHistPrimaryTrackMultiplicityForCascadeEvt",
687 "Primary track Multiplicity (for evt with Casc.);Nbr of primary tracks/Evt;Events",
689 fListHistCascade->Add(fHistPrimaryTrackMultiplicityForCascadeEvt);
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);
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);
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);
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);
719 // - Vertex Positions
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);
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);
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);
737 if(! fHistTrkgPrimaryVtxRadius ){
738 fHistTrkgPrimaryVtxRadius = new TH1F( "fHistTrkgPrimaryVtxRadius", "Trkg Prim. Vertex radius; r (cm); Events" , 150, 0., 15.0 );
739 fListHistCascade->Add(fHistTrkgPrimaryVtxRadius);
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);
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);
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);
760 if(! fHistBestPrimaryVtxRadius ){
761 fHistBestPrimaryVtxRadius = new TH1F( "fHistBestPrimaryVtxRadius", "Best Prim. vertex radius; r (cm); Events" , 150, 0., 15.0 );
762 fListHistCascade->Add(fHistBestPrimaryVtxRadius);
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);
773 // - Typical histos for cascades
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);
782 fHistChi2Xi = new TH1F("fHistChi2Xi", "Cascade #chi^{2}; #chi^{2}; Number of Cascades", 160, 0, 40);
783 fListHistCascade->Add(fHistChi2Xi);
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);
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);
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);
801 if(! fHistXiRadius ){
802 fHistXiRadius = new TH1F( "fHistXiRadius", "Casc. decay transv. radius; r (cm); Counts" , 1050, 0., 105.0 );
803 fListHistCascade->Add(fHistXiRadius);
807 // - Histos about ~ the "V0 part" of the cascade, coming by inheritance from AliESDv0
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);
816 if (! fHistV0Chi2Xi) {
817 fHistV0Chi2Xi = new TH1F("fHistV0Chi2Xi", "V0 #chi^{2}, in cascade; #chi^{2};Counts", 160, 0, 40);
818 fListHistCascade->Add(fHistV0Chi2Xi);
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);
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);
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);
836 if (! fHistV0RadiusXi) {
837 fHistV0RadiusXi = new TH1F("fHistV0RadiusXi", "V0 decay radius, in cascade; radius (cm); Counts", 1050, 0., 105.0);
838 fListHistCascade->Add(fHistV0RadiusXi);
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);
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);
854 // - Effective mass histos for cascades.
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);
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);
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);
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);
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);
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);
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);
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);
899 // - Complements for QA
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);
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);
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);
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);
923 if(! fHistChargeXi ){
924 fHistChargeXi = new TH1F( "fHistChargeXi" , "Charge of casc. candidates ; Sign ; Counts", 5, -2.0, 3.0);
925 fListHistCascade->Add(fHistChargeXi);
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);
936 fHistRapXi = new TH1F( "fHistRapXi" , "Rapidity of #Xi candidates (around the mass peak); y ; Counts", 200, -5.0, 5.0);
937 fListHistCascade->Add(fHistRapXi);
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);
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);
951 fHistThetaXi = new TH1F( "fHistThetaXi" , "#theta of #Xi candidates (around the mass peak); #theta (deg) ; Counts", 180, 0., 180.0);
952 fListHistCascade->Add(fHistThetaXi);
956 fHistPhiXi = new TH1F( "fHistPhiXi" , "#phi of #Xi candidates (around the mass peak); #phi (deg) ; Counts", 360, 0., 360.);
957 fListHistCascade->Add(fHistPhiXi);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
1040 // Part 2 : Raw material for yield extraction -------
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);
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);
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);
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);
1063 if(! fCFContCascadePIDXiMinus) {
1064 const Int_t lNbSteps = 7 ;
1065 const Int_t lNbVariables = 4 ;
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;
1075 fCFContCascadePIDXiMinus = new AliCFContainer("fCFContCascadePIDXiMinus","Pt_{cascade} Vs M_{#Xi^{-} candidates} Vs Y_{#Xi}", lNbSteps, lNbVariables, lNbBinsPerVar );
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
1084 fCFContCascadePIDXiMinus->SetBinLimits(3, 0.0, 250.0 ); // Primary track Multiplicity
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");
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");
1101 fListHistCascade->Add(fCFContCascadePIDXiMinus);
1105 if(! fCFContCascadePIDXiPlus) {
1106 const Int_t lNbSteps = 7 ;
1107 const Int_t lNbVariables = 4 ;
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;
1117 fCFContCascadePIDXiPlus = new AliCFContainer("fCFContCascadePIDXiPlus","Pt_{cascade} Vs M_{#bar{#Xi}^{+} candidates} Vs Y_{#Xi}", lNbSteps, lNbVariables, lNbBinsPerVar );
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
1127 fCFContCascadePIDXiPlus->SetBinLimits(3, 0.0, 250.0 ); // Primary track Multiplicity
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");
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");
1144 fListHistCascade->Add(fCFContCascadePIDXiPlus);
1149 if(! fCFContCascadePIDOmegaMinus) {
1150 const Int_t lNbSteps = 7 ;
1151 const Int_t lNbVariables = 4 ;
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;
1161 fCFContCascadePIDOmegaMinus = new AliCFContainer("fCFContCascadePIDOmegaMinus","Pt_{cascade} Vs M_{#Omega^{-} candidates} Vs Y_{#Omega}", lNbSteps, lNbVariables, lNbBinsPerVar );
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
1171 fCFContCascadePIDOmegaMinus->SetBinLimits(3, 0.0, 250.0 ); // Primary track Multiplicity
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");
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");
1188 fListHistCascade->Add(fCFContCascadePIDOmegaMinus);
1192 if(! fCFContCascadePIDOmegaPlus) {
1193 const Int_t lNbSteps = 7 ;
1194 const Int_t lNbVariables = 4 ;
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;
1204 fCFContCascadePIDOmegaPlus = new AliCFContainer("fCFContCascadePIDOmegaPlus","Pt_{cascade} Vs M_{#bar{#Omega}^{+} candidates} Vs Y_{#Omega}", lNbSteps, lNbVariables, lNbBinsPerVar );
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
1214 fCFContCascadePIDOmegaPlus->SetBinLimits(3, 0.0, 250.0 ); // Primary track Multiplicity
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");
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");
1231 fListHistCascade->Add(fCFContCascadePIDOmegaPlus);
1239 // Part 3 : Towards the optimisation of topological selections -------
1240 if(! fCFContCascadeCuts){
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 ;
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;
1260 lNbBinsPerVar[6] = 20;
1261 lNbBinsPerVar[7] = 40;
1262 lNbBinsPerVar[8] = 40;
1263 lNbBinsPerVar[9] = 25;
1264 lNbBinsPerVar[10] = 25;
1266 lNbBinsPerVar[11] = 75; // 2-MeV/c2 bins
1267 lNbBinsPerVar[12] = 60; // 2-MeV/c2 bins
1269 lNbBinsPerVar[13] = 100;
1271 lNbBinsPerVar[14] = 44; // 0.05 in rapidity units
1272 lNbBinsPerVar[15] = 44; // 0.05 in rapidity units
1274 lNbBinsPerVar[16] = 20;
1276 lNbBinsPerVar[17] = 50;
1277 lNbBinsPerVar[18] = 100;
1278 lNbBinsPerVar[19] = 24;
1280 fCFContCascadeCuts = new AliCFContainer("fCFContCascadeCuts","Container for Cascade cuts", lNbSteps, lNbVariables, lNbBinsPerVar );
1283 //setting the bin limits
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
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
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) ;
1301 fCFContCascadeCuts -> SetBinLimits(2, lBinLim2 ); // XiCosineOfPointingAngle : 0.80 to 1.0
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
1310 fCFContCascadeCuts->SetBinLimits(4, 1.1 , 1.13 ); // InvMassLambdaAsCascDghter
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
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) ;
1323 fCFContCascadeCuts -> SetBinLimits(6, lBinLim6 ); // V0CosineOfPointingAngleXi : 0.80 to 1.0
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
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
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
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;
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
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;
1376 fCFContCascadeCuts -> SetBinLimits(17, lBinLim17 ); // nTrackPrimaryMultiplicity : 0 to 250
1377 delete [] lBinLim17;
1379 fCFContCascadeCuts->SetBinLimits(18, 0.0, 200.0 ); // nITSandTPCtracksAndSPDtracklets
1381 fCFContCascadeCuts->SetBinLimits(19, 68.0 ,164.0 ); // BachTPCClusters
1384 // Regular binning definition (valid for v4-18-10-AN on)
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
1408 fCFContCascadeCuts->SetBinLimits(17, 0.0, 250.0 ); // nTrackPrimaryMultiplicity
1409 fCFContCascadeCuts->SetBinLimits(18, 0.0, 200.0 ); // nITSandTPCtracksAndSPDtracklets
1411 fCFContCascadeCuts->SetBinLimits(19, 25.0 ,165.0 ); // BachTPCClusters
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");
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)");
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)");
1437 fCFContCascadeCuts->SetVarTitle(11, "Inv. Mass(Xi) (GeV/c^{2})");
1438 fCFContCascadeCuts->SetVarTitle(12, "Inv. Mass(Omega) (GeV/c^{2})");
1440 fCFContCascadeCuts->SetVarTitle(13, "pt(Casc.) (GeV/c)");
1441 //fCFContCascadeCuts->SetVarTitle(40, "V0toXiCosineOfPointingAngle");
1443 fCFContCascadeCuts->SetVarTitle(14, "Y(Xi)");
1444 fCFContCascadeCuts->SetVarTitle(15, "Y(Omega)");
1446 fCFContCascadeCuts->SetVarTitle(16, "Z-position(BestPrimVtx) (cm)");
1448 fCFContCascadeCuts->SetVarTitle(17, "Primary Track Multiplicity");
1449 fCFContCascadeCuts->SetVarTitle(18, "(ITS+TPC tracks + SPD tracklets) Multiplicity");
1450 fCFContCascadeCuts->SetVarTitle(19, "Bach.TPC Clusters");
1452 fListHistCascade->Add(fCFContCascadeCuts);
1457 // Part 4 : Angular correlation study -------
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
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};
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)";
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)";
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)";
1494 strAxisTitle[4] = " Eff. Inv Mass (GeV/c^{2})";
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);
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};
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)";
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)";
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)";
1540 strAxisTitle[4] = " Eff. Inv Mass (GeV/c^{2})";
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);
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
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};
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)";
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)";
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)";
1587 strAxisTitle[4] = " Eff. Inv Mass (GeV/c^{2})";
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);
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};
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)";
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)";
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)";
1633 strAxisTitle[4] = " Eff. Inv Mass (GeV/c^{2})";
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);
1646 PostData(1, fListHistCascade);
1647 /* PostData(2, fPaveTextBookKeeping);*/
1648 }// end UserCreateOutputObjects
1655 //________________________________________________________________________
1656 void AliAnalysisTaskCheckCascade::UserExec(Option_t *)
1659 // Called for each event
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
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.;
1678 // Connect to the InputEvent
1679 // After these lines, we should have an ESD/AOD event + the number of cascades in it.
1681 if(fAnalysisType == "ESD"){
1682 lESDevent = dynamic_cast<AliESDEvent*>( InputEvent() );
1684 AliWarning("ERROR: lESDevent not available \n");
1688 fHistCascadeMultiplicityBeforeTrigSel->Fill ( lESDevent->GetNumberOfCascades() );
1690 //-------------------------------------------------
1691 // 0 - Trigger managment
1692 // NOTE : Check the availability of the proper trigger
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;
1700 // 2nd option - Presuppose the presence of AliPhysicsSelectionTask FIXME
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)
1708 if ( ! isSelected ) {
1709 PostData(1, fListHistCascade);
1713 //else Printf("Event selected ... \n");
1717 //-------------------------------------------------
1718 // 1 - Cascade vertexer (ESD)
1720 if(fkRerunV0CascVertexers){ // FIXME : relaunch V0 and Cascade vertexers
1721 if(fAnalysisType == "ESD" ){
1722 // lESDevent->ResetCascades();
1723 // lESDevent->ResetV0s();
1725 // AliV0vertexer lV0vtxer;
1726 // AliCascadeVertexer lCascVtxer;
1728 // lV0vtxer.SetDefaultCuts(fV0Sels);
1729 // lCascVtxer.SetDefaultCuts(fCascSels);
1731 // lV0vtxer.Tracks2V0vertices(lESDevent);
1732 // lCascVtxer.V0sTracks2CascadeVertices(lESDevent);
1734 }// end if(RelaunchV0CascVertexers)
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);
1743 }//if (fAnalysisType == "ESD")
1746 if(fAnalysisType == "AOD"){
1747 lAODevent = dynamic_cast<AliAODEvent*>( InputEvent() );
1749 AliWarning("ERROR: lAODevent not available \n");
1752 ncascades = lAODevent->GetNumberOfCascades();
1753 nTrackWithTPCrefitMultiplicity = -1;
1754 nTrackPrimaryMultiplicity = -1;
1756 fHistCascadeMultiplicityBeforeTrigSel->Fill ( ncascades );
1759 // For AOD or ESD ...
1760 nTrackMultiplicity = (InputEvent())->GetNumberOfTracks();
1763 //-------------------------------------------------
1764 fHistTrackMultiplicityForTrigEvt ->Fill( nTrackMultiplicity );
1765 fHistTPCrefitTrackMultiplicityForTrigEvt ->Fill( nTrackWithTPCrefitMultiplicity );
1766 fHistPrimaryTrackMultiplicityForTrigEvt ->Fill( nTrackPrimaryMultiplicity );
1767 fHistEstimateITSTPCMultiplicityForTrigEvt->Fill( nITSandTPCtracksAndSPDtracklets);
1768 fHistCascadeMultiplicityForTrigEvt ->Fill( ncascades );
1773 // ---------------------------------------------------------------
1774 // I - Global characteristics of the events + general histos (filled for any selected events and/or for the analysed events)
1776 // - I.Step 1 : Characteristics of the event : prim. Vtx + magnetic field (ESD)
1779 if(fAnalysisType == "ESD"){
1780 const AliESDVertex *lPrimaryTrackingESDVtx = lESDevent->GetPrimaryVertexTracks();
1781 // get the vtx stored in ESD found with tracks
1782 lPrimaryTrackingESDVtx->GetXYZ( lTrkgPrimaryVtxPos );
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();
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);
1802 fHistCascadeMultiplicityForTrigEvtAndZprimVtx->Fill( ncascades );
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);
1813 fHistCascadeMultiplicityForTrigEvtNonPiledUpAndZprimVtx->Fill( ncascades );
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);
1825 // NOTE : For older evts
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
1833 lMagneticField = lESDevent->GetMagneticField( );
1834 // FIXME if(TMath::Abs(lMagneticField ) < 10e-6) continue;
1838 if(fAnalysisType == "AOD"){
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 );
1847 lStatusTrackingPrimVtx = -1;
1848 lTrkgPrimaryVtxPos[0] = -100.0;
1849 lTrkgPrimaryVtxPos[1] = -100.0;
1850 lTrkgPrimaryVtxPos[2] = -100.0;
1851 lMagneticField = 0.;
1855 // - I.Step 2 : Filling histos that characterize the selected event : x,y,z prim. Vtx distrib. (ESD)
1858 fHistCascadeMultiplicityForSelEvt ->Fill( ncascades );
1859 fHistPosBestPrimaryVtxXForSelEvt ->Fill( lBestPrimaryVtxPos[0] );
1860 fHistPosBestPrimaryVtxYForSelEvt ->Fill( lBestPrimaryVtxPos[1] );
1861 fHistPosBestPrimaryVtxZForSelEvt ->Fill( lBestPrimaryVtxPos[2] );
1865 // ---------------------------------------------------------------
1866 // II - Calcultaion Part dedicated to Xi vertices
1868 for (Int_t iXi = 0; iXi < ncascades; iXi++)
1869 {// This is the begining of the Cascade loop (ESD or AOD)
1871 // -------------------------------------
1872 // II.Init - Initialisation of the local variables that will be needed for ESD/AOD
1875 // - 0th part of initialisation : around primary vertex ...
1877 Double_t lTrkgPrimaryVtxRadius3D = -500.0;
1878 Double_t lBestPrimaryVtxRadius3D = -500.0;
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. ;
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 ...
1894 Double_t lInnerWallMomCascDghters[3] = {-100., -100., -100.};
1895 Double_t lTPCSignalCascDghters [3] = {-100., -100., -100.};
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.;
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.;
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.;
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;
1924 Bool_t lIsNegInXiProton = kFALSE;
1925 Bool_t lIsNegInXiPion = kFALSE;
1926 Bool_t lIsNegInOmegaProton = kFALSE;
1927 Bool_t lIsNegInOmegaPion = kFALSE;
1929 Bool_t lIsBachelorKaon = kFALSE;
1930 Bool_t lIsBachelorPion = kFALSE;
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 ...
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. ;
1944 Double_t lBachMomX = 0., lBachMomY = 0., lBachMomZ = 0.;
1945 Double_t lBachTransvMom = 0.;
1946 Double_t lBachTotMom = 0.;
1948 Short_t lChargeXi = -2;
1949 Double_t lV0toXiCosineOfPointingAngle = 0. ;
1951 Double_t lRapXi = -20.0, lRapOmega = -20.0, lEta = -20.0, lTheta = 360., lPhi = 720. ;
1952 Double_t lAlphaXi = -200., lPtArmXi = -200.0;
1954 // - 7th part of initialisation : variables for the AliCFContainer dedicated to cascade cut optmisiation
1955 // Int_t lSPDTrackletsMultiplicity = -1; // now provided by AliESDEvent::EstimateMultiplicity ...
1957 // - 8th part of initialisation : variables needed for Angular correlations
1958 TVector3 lTVect3MomXi(0.,0.,0.);
1959 Int_t lArrTrackID[3] = {-1, -1, -1};
1962 if(fAnalysisType == "ESD"){
1964 // -------------------------------------
1965 // II.ESD - Calcultaion Part dedicated to Xi vertices (ESD)
1967 AliESDcascade *xi = lESDevent->GetCascade(iXi);
1971 // - II.Step 1 : around primary vertex
1973 lTrkgPrimaryVtxRadius3D = TMath::Sqrt( lTrkgPrimaryVtxPos[0] * lTrkgPrimaryVtxPos[0] +
1974 lTrkgPrimaryVtxPos[1] * lTrkgPrimaryVtxPos[1] +
1975 lTrkgPrimaryVtxPos[2] * lTrkgPrimaryVtxPos[2] );
1977 lBestPrimaryVtxRadius3D = TMath::Sqrt( lBestPrimaryVtxPos[0] * lBestPrimaryVtxPos[0] +
1978 lBestPrimaryVtxPos[1] * lBestPrimaryVtxPos[1] +
1979 lBestPrimaryVtxPos[2] * lBestPrimaryVtxPos[2] );
1983 // - II.Step 2 : Assigning the necessary variables for specific AliESDcascade data members (ESD)
1986 xi->ChangeMassHypothesis(lV0quality , 3312); // default working hypothesis : cascade = Xi- decay
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)
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]);
2002 // - II.Step 3 : around the tracks : Bach + V0 (ESD)
2003 // ~ Necessary variables for ESDcascade data members coming from the ESDv0 part (inheritance)
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 ...
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;
2016 if(lBachIdx == lIdxPosXi) {
2017 AliWarning("Pb / Idx(Bach. track) = Idx(Pos. track) ... continue!"); continue;
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 ...");
2029 lPosTPCClusters = pTrackXi->GetTPCNcls();
2030 lNegTPCClusters = nTrackXi->GetTPCNcls();
2031 lBachTPCClusters = bachTrackXi->GetTPCNcls();
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; }
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; }
2050 const AliExternalTrackParam *pExtTrack = pTrackXi ->GetInnerParam();
2051 const AliExternalTrackParam *nExtTrack = nTrackXi ->GetInnerParam();
2052 const AliExternalTrackParam *bachExtTrack = bachTrackXi ->GetInnerParam();
2055 lInnerWallMomCascDghters[0] = pExtTrack ->GetP() * pExtTrack ->Charge();
2056 lTPCSignalCascDghters [0] = pTrackXi ->GetTPCsignal();
2059 lInnerWallMomCascDghters[1] = nExtTrack ->GetP() * nExtTrack ->Charge();
2060 lTPCSignalCascDghters [1] = nTrackXi ->GetTPCsignal();
2063 lInnerWallMomCascDghters[2] = bachExtTrack ->GetP() * bachExtTrack ->Charge();
2064 lTPCSignalCascDghters [2] = bachTrackXi ->GetTPCsignal();
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();
2073 lV0CosineOfPointingAngleXi = xi->GetV0CosineOfPointingAngle( lBestPrimaryVtxPos[0],
2074 lBestPrimaryVtxPos[1],
2075 lBestPrimaryVtxPos[2] );
2077 lDcaV0ToPrimVertexXi = xi->GetD( lBestPrimaryVtxPos[0],
2078 lBestPrimaryVtxPos[1],
2079 lBestPrimaryVtxPos[2] );
2081 lDcaBachToPrimVertexXi = TMath::Abs( bachTrackXi->GetD( lBestPrimaryVtxPos[0],
2082 lBestPrimaryVtxPos[1],
2084 // Note : AliExternalTrackParam::GetD returns an algebraic value ...
2086 xi->GetXYZ( lPosV0Xi[0], lPosV0Xi[1], lPosV0Xi[2] );
2087 lV0RadiusXi = TMath::Sqrt( lPosV0Xi[0]*lPosV0Xi[0] + lPosV0Xi[1]*lPosV0Xi[1] );
2089 lDcaPosToPrimVertexXi = TMath::Abs( pTrackXi ->GetD( lBestPrimaryVtxPos[0],
2090 lBestPrimaryVtxPos[1],
2093 lDcaNegToPrimVertexXi = TMath::Abs( nTrackXi ->GetD( lBestPrimaryVtxPos[0],
2094 lBestPrimaryVtxPos[1],
2097 // - II.Step 3' : extra-selection for cascade candidates
2098 // Towards optimisation of AA selection
2100 if(fkExtraSelections){
2101 // if(lChi2Xi > 2000) continue;
2102 // if(lV0Chi2Xi > 2000) continue;
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;
2111 if(lV0CosineOfPointingAngleXi > 0.9999) continue;
2112 //if(lDcaV0ToPrimVertexXi < 0.09) continue;
2113 if(lDcaBachToPrimVertexXi < 0.04) continue;
2115 if(lV0RadiusXi < 1.0) continue;
2116 if(lV0RadiusXi > 100) continue;
2117 //if(lDcaPosToPrimVertexXi < 0.6) continue;
2118 //if(lDcaNegToPrimVertexXi < 0.6) continue;
2123 // - II.Step 4 : around effective masses (ESD)
2124 // ~ change mass hypotheses to cover all the possibilities : Xi-/+, Omega -/+
2128 if( bachTrackXi->Charge() < 0 ) {
2130 xi->ChangeMassHypothesis(lV0quality , 3312);
2131 // Calculate the effective mass of the Xi- candidate.
2132 // pdg code 3312 = Xi-
2133 lInvMassXiMinus = xi->GetEffMassXi();
2136 xi->ChangeMassHypothesis(lV0quality , 3334);
2137 // Calculate the effective mass of the Xi- candidate.
2138 // pdg code 3334 = Omega-
2139 lInvMassOmegaMinus = xi->GetEffMassXi();
2142 xi->ChangeMassHypothesis(lV0quality , 3312); // Back to default hyp.
2143 }// end if negative bachelor
2146 if( bachTrackXi->Charge() > 0 ){
2148 xi->ChangeMassHypothesis(lV0quality , -3312);
2149 // Calculate the effective mass of the Xi+ candidate.
2150 // pdg code -3312 = Xi+
2151 lInvMassXiPlus = xi->GetEffMassXi();
2154 xi->ChangeMassHypothesis(lV0quality , -3334);
2155 // Calculate the effective mass of the Xi+ candidate.
2156 // pdg code -3334 = Omega+
2157 lInvMassOmegaPlus = xi->GetEffMassXi();
2160 xi->ChangeMassHypothesis(lV0quality , -3312); // Back to "default" hyp.
2161 }// end if positive bachelor
2165 // - II.Step 5 : PID on the daughter tracks
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};
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
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);
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;
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;
2197 // Check if the V0 positive track is a proton (case for Omega-)
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;
2205 // Check if the V0 positive track is a pi+ (case for Omega+)
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;
2213 }// end if V0 positive track with existing combined PID
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
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);
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;
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;
2239 // Check if the V0 negative track is a pi- (case for Omega-)
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;
2247 // Check if the V0 negative track is an anti-proton (case for Omega+)
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;
2255 }// end if V0 negative track with existing combined PID
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
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
2281 // B - TPC PID : 3-sigma bands on Bethe-Bloch curve
2284 if (TMath::Abs(fESDpid->NumberOfSigmasTPC( bachTrackXi,AliPID::kKaon)) < 4) lIsBachelorKaonForTPC = kTRUE;
2285 if (TMath::Abs(fESDpid->NumberOfSigmasTPC( bachTrackXi,AliPID::kPion)) < 4) lIsBachelorPionForTPC = kTRUE;
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;
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;
2296 const AliExternalTrackParam *pInnerWallTrackXi = pTrackXi ->GetInnerParam();
2297 const AliExternalTrackParam *nInnerWallTrackXi = nTrackXi ->GetInnerParam();
2298 const AliExternalTrackParam *bachInnerWallTrackXi = bachTrackXi ->GetInnerParam();
2299 if(pInnerWallTrackXi && nInnerWallTrackXi && bachInnerWallTrackXi ){
2301 Double_t pMomInnerWall = pInnerWallTrackXi ->GetP();
2302 Double_t nMomInnerWall = nInnerWallTrackXi ->GetP();
2303 Double_t bachMomInnerWall = bachInnerWallTrackXi->GetP();
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;
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;
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;
2325 // - II.Step 6 : extra info for QA (ESD)
2326 // miscellaneous pieces of info that may help regarding data quality assessment.
2329 xi->GetPxPyPz( lXiMomX, lXiMomY, lXiMomZ );
2330 lXiTransvMom = TMath::Sqrt( lXiMomX*lXiMomX + lXiMomY*lXiMomY );
2331 lXiTotMom = TMath::Sqrt( lXiMomX*lXiMomX + lXiMomY*lXiMomY + lXiMomZ*lXiMomZ );
2333 xi->GetBPxPyPz( lBachMomX, lBachMomY, lBachMomZ );
2334 lBachTransvMom = TMath::Sqrt( lBachMomX*lBachMomX + lBachMomY*lBachMomY );
2335 lBachTotMom = TMath::Sqrt( lBachMomX*lBachMomX + lBachMomY*lBachMomY + lBachMomZ*lBachMomZ );
2337 lChargeXi = xi->Charge();
2339 lV0toXiCosineOfPointingAngle = xi->GetV0CosineOfPointingAngle( lPosXi[0], lPosXi[1], lPosXi[2] );
2341 lRapXi = xi->RapXi();
2342 lRapOmega = xi->RapOmega();
2344 lTheta = xi->Theta() *180.0/TMath::Pi();
2345 lPhi = xi->Phi() *180.0/TMath::Pi();
2346 lAlphaXi = xi->AlphaXi();
2347 lPtArmXi = xi->PtArmXi();
2350 //FIXME : Extra-cut = Anti-splitting cut for lambda daughters
2351 Bool_t kAntiSplittingLambda = kFALSE;
2353 if(kAntiSplittingLambda){
2354 Double_t lNMomX = 0., lNMomY = 0., lNMomZ = 0.;
2355 Double_t lPMomX = 0., lPMomY = 0., lPMomZ = 0.;
2357 xi->GetPPxPyPz(lPMomX, lPMomY, lPMomZ);
2358 xi->GetNPxPyPz(lNMomX, lNMomY, lNMomZ);
2360 if( xi->Charge() < 0){// Xi- or Omega-
2361 if(TMath::Abs(lBachTransvMom - TMath::Sqrt( lNMomX*lNMomX + lNMomY*lNMomY ) ) < 0.075) continue;
2363 else { //Xi+ or Omega+
2364 if(TMath::Abs(lBachTransvMom - TMath::Sqrt( lPMomX*lPMomX + lPMomY*lPMomY ) ) < 0.075) continue;
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
2383 // II.Step 7 - Complementary info for monitoring the cascade cut variables
2385 //const AliMultiplicity *lAliMult = lESDevent->GetMultiplicity();
2386 //lSPDTrackletsMultiplicity = lAliMult->GetNumberOfTracklets();
2387 // --> now provided by AliESDEvent::EstimateMultiplicity ...
2389 // II.Step 8 - Azimuthal correlation study
2392 lTVect3MomXi.SetXYZ( lXiMomX, lXiMomY, lXiMomZ );
2393 lArrTrackID[0] = pTrackXi ->GetID();
2394 lArrTrackID[1] = nTrackXi ->GetID();
2395 lArrTrackID[2] = bachTrackXi->GetID();
2398 }// end of ESD treatment
2401 if(fAnalysisType == "AOD"){
2403 // -------------------------------------
2404 // II.AOD - Calcultaion Part dedicated to Xi vertices (ESD)
2406 const AliAODcascade *xi = lAODevent->GetCascade(iXi);
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;
2413 // - II.Step 1 : Characteristics of the event : prim. Vtx + magnetic field (AOD)
2417 lTrkgPrimaryVtxRadius3D = -500. ;
2418 // FIXME : We don't have the different prim. vertex at the AOD level -> nothing to do.
2420 lBestPrimaryVtxRadius3D = TMath::Sqrt( lBestPrimaryVtxPos[0] * lBestPrimaryVtxPos[0] +
2421 lBestPrimaryVtxPos[1] * lBestPrimaryVtxPos[1] +
2422 lBestPrimaryVtxPos[2] * lBestPrimaryVtxPos[2] );
2425 // - II.Step 2 : Assigning the necessary variables for specific AliAODcascade data members (AOD)
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] );
2435 // the best available vertex should be used (like in AliCascadeVertexer)
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] );
2444 // - II.Step 3 : around the tracks : Bach + V0 (AOD)
2445 // ~ Necessary variables for AODcascade data members coming from the AODv0 part (inheritance)
2448 lChargeXi = xi->ChargeXi();
2451 lInvMassLambdaAsCascDghter = xi->MassLambda();
2453 lInvMassLambdaAsCascDghter = xi->MassAntiLambda();
2455 lDcaV0DaughtersXi = xi->DcaV0Daughters();
2456 lV0Chi2Xi = xi->Chi2V0();
2458 lV0CosineOfPointingAngleXi = xi->CosPointingAngle( lBestPrimaryVtxPos );
2459 lDcaV0ToPrimVertexXi = xi->DcaV0ToPrimVertex();
2461 lDcaBachToPrimVertexXi = xi->DcaBachToPrimVertex();
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] );
2469 lDcaPosToPrimVertexXi = xi->DcaPosToPrimVertex();
2470 lDcaNegToPrimVertexXi = xi->DcaNegToPrimVertex();
2473 // - II.Step 4 : around effective masses (AOD)
2474 // ~ change mass hypotheses to cover all the possibilities : Xi-/+, Omega -/+
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();
2483 // - II.Step 5 : PID on the daughters (To be developed ...)
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
2495 const AliAODTrack *bachTrackXi = lAODevent->GetTrack( xi->GetBachID() ); // FIXME : GetBachID not implemented ?
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;
2514 }// end if bachelor track with existing combined PID
2519 // - II.Step 6 : extra info for QA (AOD)
2520 // miscellaneous pieces onf info that may help regarding data quality assessment.
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 );
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 );
2536 lV0toXiCosineOfPointingAngle = xi->CosPointingAngle( xi->GetDecayVertexXi() );
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();
2546 // II.Step 7 - Complementary info for monitoring the cascade cut variables
2547 //FIXME : missing for AOD : Tacklet Multiplicity + TPCCluster
2549 // II.Step 8 - Azimuthal correlation study
2552 lTVect3MomXi.SetXYZ( lXiMomX, lXiMomY, lXiMomZ );
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 ...");
2562 lArrTrackID[0] = pTrackXi ->GetID();
2563 lArrTrackID[1] = nTrackXi ->GetID();
2564 lArrTrackID[2] = bachTrackXi->GetID();
2566 }// end of AOD treatment
2569 // -------------------------------------
2570 // II.Fill - Filling the TH1,2,3Fs, HnSparses, CFContainers, FOR events with CASCADES !
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
2586 // - II.Fill.Step 1 : primary vertex
2588 fHistTPCrefitTrackMultiplicityForCascadeEvt->Fill( nTrackWithTPCrefitMultiplicity );
2589 fHistPrimaryTrackMultiplicityForCascadeEvt ->Fill( nTrackPrimaryMultiplicity );
2591 fHistPosV0TPCClusters ->Fill( lPosTPCClusters );
2592 fHistNegV0TPCClusters ->Fill( lNegTPCClusters );
2593 fHistBachTPCClusters ->Fill( lBachTPCClusters );
2595 f2dHistTPCdEdxOfCascDghters ->Fill( lInnerWallMomCascDghters[0] , lTPCSignalCascDghters[0] );
2596 f2dHistTPCdEdxOfCascDghters ->Fill( lInnerWallMomCascDghters[1] , lTPCSignalCascDghters[1] );
2597 f2dHistTPCdEdxOfCascDghters ->Fill( lInnerWallMomCascDghters[2] , lTPCSignalCascDghters[2] );
2599 fHistVtxStatus ->Fill( lStatusTrackingPrimVtx ); // 1 if tracking vtx = ok
2601 if( lStatusTrackingPrimVtx ){
2602 fHistPosTrkgPrimaryVtxXForCascadeEvt ->Fill( lTrkgPrimaryVtxPos[0] );
2603 fHistPosTrkgPrimaryVtxYForCascadeEvt ->Fill( lTrkgPrimaryVtxPos[1] );
2604 fHistPosTrkgPrimaryVtxZForCascadeEvt ->Fill( lTrkgPrimaryVtxPos[2] );
2605 fHistTrkgPrimaryVtxRadius ->Fill( lTrkgPrimaryVtxRadius3D );
2608 fHistPosBestPrimaryVtxXForCascadeEvt ->Fill( lBestPrimaryVtxPos[0] );
2609 fHistPosBestPrimaryVtxYForCascadeEvt ->Fill( lBestPrimaryVtxPos[1] );
2610 fHistPosBestPrimaryVtxZForCascadeEvt ->Fill( lBestPrimaryVtxPos[2] );
2611 fHistBestPrimaryVtxRadius ->Fill( lBestPrimaryVtxRadius3D );
2613 f2dHistTrkgPrimVtxVsBestPrimVtx->Fill( lTrkgPrimaryVtxRadius3D, lBestPrimaryVtxRadius3D );
2615 // **************************** With PID on ? ... for the signal region ? ************FIXME**************************************
2616 if( ( (lChargeXi<0) && lIsBachelorPionForTPC && lIsPosProtonForTPC && lIsNegPionForTPC ) ||
2617 ( (lChargeXi>0) && lIsBachelorPionForTPC && lIsNegProtonForTPC && lIsPosPionForTPC ) )
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
2626 // if( TMath::Abs( lInvMassXiMinus-1.3217 ) < 0.010 || TMath::Abs( lInvMassXiPlus-1.3217 ) < 0.010){} }
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
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 );
2644 fHistDcaV0ToPrimVertexXi ->Fill( lDcaV0ToPrimVertexXi ); // Flag CascadeVtxer: Cut Variable b
2645 fHistDcaPosToPrimVertexXi ->Fill( lDcaPosToPrimVertexXi );
2646 fHistDcaNegToPrimVertexXi ->Fill( lDcaNegToPrimVertexXi );
2649 // II.Fill.Step 4 : extra QA info
2651 fHistChargeXi ->Fill( lChargeXi );
2652 fHistV0toXiCosineOfPointingAngle->Fill( lV0toXiCosineOfPointingAngle );
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 );
2658 fHistBachTransvMomXi ->Fill( lBachTransvMom );
2659 fHistBachTotMomXi ->Fill( lBachTotMom );
2661 fHistRapXi ->Fill( lRapXi );
2662 fHistEtaXi ->Fill( lEta );
2663 fHistThetaXi ->Fill( lTheta );
2664 fHistPhiXi ->Fill( lPhi );
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 );
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 );
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 );
2679 f2dHistArmenteros ->Fill( lChargeXi*lAlphaXi, lPtArmXi );
2680 }// end with PID ...
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 );
2690 if( lChargeXi > 0 ){
2691 fHistMassXiPlus ->Fill( lInvMassXiPlus );
2692 fHistMassOmegaPlus ->Fill( lInvMassOmegaPlus );
2693 if(lIsBachelorPion) fHistMassWithCombPIDXiPlus ->Fill( lInvMassXiPlus );
2694 if(lIsBachelorKaon) fHistMassWithCombPIDOmegaPlus ->Fill( lInvMassOmegaPlus );
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 );
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 );
2716 // - Filling the AliCFContainers related to PID
2718 Double_t lContainerPIDVars[4] = {0.0};
2721 if( lChargeXi < 0 ) {
2722 lContainerPIDVars[0] = lXiTransvMom ;
2723 lContainerPIDVars[1] = lInvMassXiMinus ;
2724 lContainerPIDVars[2] = lRapXi ;
2725 lContainerPIDVars[3] = nTrackPrimaryMultiplicity; // FIXME : nTrackPrimaryMultiplicity not set for AOD ... = -1
2728 fCFContCascadePIDXiMinus->Fill(lContainerPIDVars, 0); // No PID
2730 if( lIsBachelorPionForTPC )
2731 fCFContCascadePIDXiMinus->Fill(lContainerPIDVars, 1); // TPC PID / 4-#sigma cut on Bachelor track
2733 if( lIsBachelorPionForTPC &&
2734 lIsPosProtonForTPC )
2735 fCFContCascadePIDXiMinus->Fill(lContainerPIDVars, 2); // TPC PID / 4-#sigma cut on Bachelor+Baryon tracks
2737 if( lIsBachelorPionForTPC &&
2738 lIsPosProtonForTPC &&
2740 fCFContCascadePIDXiMinus->Fill(lContainerPIDVars, 3); // TPC PID / 4-#sigma cut on Bachelor+Baryon+Meson tracks
2743 if( lIsBachelorPion )
2744 fCFContCascadePIDXiMinus->Fill(lContainerPIDVars, 4); // Comb. PID / Bachelor
2746 if( lIsBachelorPion &&
2748 fCFContCascadePIDXiMinus->Fill(lContainerPIDVars, 5); // Comb. PID / Bachelor+Baryon
2750 if(lIsBachelorPion &&
2753 fCFContCascadePIDXiMinus->Fill(lContainerPIDVars, 6); // Comb. PID / Bachelor+Baryon+Meson
2756 lContainerPIDVars[0] = 0.; lContainerPIDVars[1] = 0.; lContainerPIDVars[2] = 0.; lContainerPIDVars[3] = 0.;
2759 if( lChargeXi > 0 ) {
2760 lContainerPIDVars[0] = lXiTransvMom ;
2761 lContainerPIDVars[1] = lInvMassXiPlus ;
2762 lContainerPIDVars[2] = lRapXi ;
2763 lContainerPIDVars[3] = nTrackPrimaryMultiplicity; // FIXME : nTrackPrimaryMultiplicity not set for AOD ... = -1
2766 fCFContCascadePIDXiPlus->Fill(lContainerPIDVars, 0); // No PID
2768 if( lIsBachelorPionForTPC )
2769 fCFContCascadePIDXiPlus->Fill(lContainerPIDVars, 1); // TPC PID / 4-#sigma cut on Bachelor track
2771 if( lIsBachelorPionForTPC &&
2772 lIsNegProtonForTPC )
2773 fCFContCascadePIDXiPlus->Fill(lContainerPIDVars, 2); // TPC PID / 4-#sigma cut on Bachelor+Baryon tracks
2775 if( lIsBachelorPionForTPC &&
2776 lIsNegProtonForTPC &&
2778 fCFContCascadePIDXiPlus->Fill(lContainerPIDVars, 3); // TPC PID / 4-#sigma cut on Bachelor+Baryon+Meson tracks
2781 if( lIsBachelorPion )
2782 fCFContCascadePIDXiPlus->Fill(lContainerPIDVars, 4); // Comb. PID / Bachelor
2784 if( lIsBachelorPion &&
2786 fCFContCascadePIDXiPlus->Fill(lContainerPIDVars, 5); // Comb. PID / Bachelor+Baryon
2788 if(lIsBachelorPion &&
2791 fCFContCascadePIDXiPlus->Fill(lContainerPIDVars, 6); // Comb. PID / Bachelor+Baryon+Meson
2794 lContainerPIDVars[0] = 0.; lContainerPIDVars[1] = 0.; lContainerPIDVars[2] = 0.; lContainerPIDVars[3] = 0.;
2797 if( lChargeXi < 0 && (TMath::Abs( lInvMassXiMinus-1.3217 ) > 0.008) ) {
2798 // In order to reduce the background contribution from Xi to Omega,
2799 // --> trial to reject the neg. candidate whose mass under Xi hypothesis
2800 // falls into the Xi window (Mpdg +- 8 MeV/c2)
2801 lContainerPIDVars[0] = lXiTransvMom ;
2802 lContainerPIDVars[1] = lInvMassOmegaMinus ;
2803 lContainerPIDVars[2] = lRapOmega ;
2804 lContainerPIDVars[3] = nTrackPrimaryMultiplicity; // FIXME : nTrackPrimaryMultiplicity not set for AOD ... = -1
2807 fCFContCascadePIDOmegaMinus->Fill(lContainerPIDVars, 0); // No PID
2809 if( lIsBachelorKaonForTPC )
2810 fCFContCascadePIDOmegaMinus->Fill(lContainerPIDVars, 1); // TPC PID / 4-#sigma cut on Bachelor track
2812 if( lIsBachelorKaonForTPC &&
2813 lIsPosProtonForTPC )
2814 fCFContCascadePIDOmegaMinus->Fill(lContainerPIDVars, 2); // TPC PID / 4-#sigma cut on Bachelor+Baryon tracks
2816 if( lIsBachelorKaonForTPC &&
2817 lIsPosProtonForTPC &&
2819 fCFContCascadePIDOmegaMinus->Fill(lContainerPIDVars, 3); // TPC PID / 4-#sigma cut on Bachelor+Baryon+Meson tracks
2822 if( lIsBachelorKaon )
2823 fCFContCascadePIDOmegaMinus->Fill(lContainerPIDVars, 4); // Comb. PID / Bachelor
2825 if( lIsBachelorKaon &&
2826 lIsPosInOmegaProton )
2827 fCFContCascadePIDOmegaMinus->Fill(lContainerPIDVars, 5); // Comb. PID / Bachelor+Baryon
2829 if(lIsBachelorKaon &&
2830 lIsPosInOmegaProton &&
2832 fCFContCascadePIDOmegaMinus->Fill(lContainerPIDVars, 6); // Comb. PID / Bachelor+Baryon+Meson
2835 lContainerPIDVars[0] = 0.; lContainerPIDVars[1] = 0.; lContainerPIDVars[2] = 0.; lContainerPIDVars[3] = 0.;
2838 if( lChargeXi > 0 && (TMath::Abs( lInvMassXiPlus-1.3217 ) > 0.008) ) {
2839 // In order to reduce the background contribution from Xi to Omega,
2840 // --> trial to reject the neg. candidate whose mass under Xi hypothesis
2841 // falls into the Xi window (Mpdg +- 8 MeV/c2)
2842 lContainerPIDVars[0] = lXiTransvMom ;
2843 lContainerPIDVars[1] = lInvMassOmegaPlus ;
2844 lContainerPIDVars[2] = lRapOmega ;
2845 lContainerPIDVars[3] = nTrackPrimaryMultiplicity; // FIXME : nTrackPrimaryMultiplicity not set for AOD ... = -1
2848 fCFContCascadePIDOmegaPlus->Fill(lContainerPIDVars, 0); // No PID
2850 if( lIsBachelorKaonForTPC )
2851 fCFContCascadePIDOmegaPlus->Fill(lContainerPIDVars, 1); // TPC PID / 4-#sigma cut on Bachelor track
2853 if( lIsBachelorKaonForTPC &&
2854 lIsNegProtonForTPC )
2855 fCFContCascadePIDOmegaPlus->Fill(lContainerPIDVars, 2); // TPC PID / 4-#sigma cut on Bachelor+Baryon tracks
2857 if( lIsBachelorKaonForTPC &&
2858 lIsNegProtonForTPC &&
2860 fCFContCascadePIDOmegaPlus->Fill(lContainerPIDVars, 3); // TPC PID / 4-#sigma cut on Bachelor+Baryon+Meson tracks
2863 if( lIsBachelorKaon )
2864 fCFContCascadePIDOmegaPlus->Fill(lContainerPIDVars, 4); // Comb. PID / Bachelor
2866 if( lIsBachelorKaon &&
2867 lIsNegInOmegaProton )
2868 fCFContCascadePIDOmegaPlus->Fill(lContainerPIDVars, 5); // Comb. PID / Bachelor+Baryon
2870 if(lIsBachelorKaon &&
2871 lIsNegInOmegaProton &&
2873 fCFContCascadePIDOmegaPlus->Fill(lContainerPIDVars, 6); // Comb. PID / Bachelor+Baryon+Meson
2877 // II.Fill.Step 7 : filling the AliCFContainer (optimisation of topological selections)
2878 Double_t lContainerCutVars[20] = {0.0};
2880 lContainerCutVars[0] = lDcaXiDaughters;
2881 lContainerCutVars[1] = lDcaBachToPrimVertexXi;
2882 lContainerCutVars[2] = lXiCosineOfPointingAngle;
2883 lContainerCutVars[3] = lXiRadius2D;
2884 lContainerCutVars[4] = lInvMassLambdaAsCascDghter;
2885 lContainerCutVars[5] = lDcaV0DaughtersXi;
2886 lContainerCutVars[6] = lV0CosineOfPointingAngleXi;
2887 lContainerCutVars[7] = lV0RadiusXi;
2888 lContainerCutVars[8] = lDcaV0ToPrimVertexXi;
2889 lContainerCutVars[9] = lDcaPosToPrimVertexXi;
2890 lContainerCutVars[10] = lDcaNegToPrimVertexXi;
2892 lContainerCutVars[13] = lXiTransvMom;
2894 lContainerCutVars[16] = lBestPrimaryVtxPos[2];
2895 lContainerCutVars[17] = nTrackPrimaryMultiplicity; // FIXME : nTrackPrimaryMultiplicity not checked for AOD ... = -1
2896 lContainerCutVars[18] = nITSandTPCtracksAndSPDtracklets; // FIXME : nITSandTPCtracksAndSPDtracklets is not available for AOD ... = -1
2897 lContainerCutVars[19] = lBachTPCClusters; // FIXME : BachTPCClusters is not available for AOD ... = -1
2899 if( lChargeXi < 0 ) {
2900 lContainerCutVars[11] = lInvMassXiMinus;
2901 lContainerCutVars[12] = 1.63;
2902 lContainerCutVars[14] = lRapXi;
2903 lContainerCutVars[15] = -1.;
2904 if( lIsBachelorPionForTPC && lIsPosProtonForTPC && lIsNegPionForTPC ) fCFContCascadeCuts->Fill(lContainerCutVars,0); // for Xi-
2906 lContainerCutVars[11] = 1.26;
2907 lContainerCutVars[12] = lInvMassOmegaMinus;
2908 lContainerCutVars[14] = -1.;
2909 lContainerCutVars[15] = lRapOmega;
2910 if( lIsBachelorKaonForTPC && lIsPosProtonForTPC && lIsNegPionForTPC
2911 && (TMath::Abs( lInvMassXiMinus-1.3217 ) > 0.008) ) fCFContCascadeCuts->Fill(lContainerCutVars,2); // for Omega-
2914 lContainerCutVars[11] = lInvMassXiPlus;
2915 lContainerCutVars[12] = 1.63;
2916 lContainerCutVars[14] = lRapXi;
2917 lContainerCutVars[15] = -1.;
2918 if( lIsBachelorPionForTPC && lIsNegProtonForTPC && lIsPosPionForTPC ) fCFContCascadeCuts->Fill(lContainerCutVars,1); // for Xi+
2920 lContainerCutVars[11] = 1.26;
2921 lContainerCutVars[12] = lInvMassOmegaPlus;
2922 lContainerCutVars[14] = -1.;
2923 lContainerCutVars[15] = lRapOmega;
2924 if( lIsBachelorKaonForTPC && lIsNegProtonForTPC && lIsPosPionForTPC
2925 && (TMath::Abs( lInvMassXiPlus-1.3217 ) > 0.008) ) fCFContCascadeCuts->Fill(lContainerCutVars,3); // for Omega+
2929 // II.Fill.Step 8 : angular correlations
2931 if( lChargeXi < 0 ){
2932 if( lIsBachelorPionForTPC && lIsPosProtonForTPC && lIsNegPionForTPC ) DoAngularCorrelation("Xi-", lInvMassXiMinus, lArrTrackID, lTVect3MomXi, lEta, lRapXi);
2933 if( lIsBachelorKaonForTPC && lIsPosProtonForTPC && lIsNegPionForTPC
2934 && (TMath::Abs( lInvMassXiMinus-1.3217 ) > 0.008) ) DoAngularCorrelation("Omega-", lInvMassOmegaMinus, lArrTrackID, lTVect3MomXi, lEta, lRapOmega);
2937 if( lIsBachelorPionForTPC && lIsNegProtonForTPC && lIsPosPionForTPC ) DoAngularCorrelation("Xi+", lInvMassXiPlus, lArrTrackID, lTVect3MomXi, lEta, lRapXi);
2938 if( lIsBachelorKaonForTPC && lIsNegProtonForTPC && lIsPosPionForTPC
2939 && (TMath::Abs( lInvMassXiPlus-1.3217 ) > 0.008) ) DoAngularCorrelation("Omega+", lInvMassOmegaPlus, lArrTrackID, lTVect3MomXi, lEta, lRapOmega);
2943 }// end of the Cascade loop (ESD or AOD)
2946 // Post output data.
2947 PostData(1, fListHistCascade);
2951 void AliAnalysisTaskCheckCascade::DoAngularCorrelation( const Char_t *lCascType,
2952 Double_t lInvMassCascade,
2953 const Int_t *lArrTrackID,
2954 TVector3 &lTVect3MomXi,
2956 Double_t lRapCascade){
2957 // Perform the Delta(Phi)Delta(Eta) analysis
2958 // by properly filling the THnSparseF
2960 if( fAnalysisType == "AOD") return; // FIXME : AOD development lost, because of AliESDtrack needed by AliESDtrackCuts
2962 TString lStrCascType( lCascType );
2964 // Check the Xi- candidate is within the proper mass window m0 +- 10 MeV
2965 Double_t lCascPdgMass = 0.0;
2966 if( lStrCascType.Contains("Xi") ) lCascPdgMass = 1.3217;
2967 if( lStrCascType.Contains("Omega") ) lCascPdgMass = 1.6724;
2969 if( lInvMassCascade > lCascPdgMass + 0.010) return;
2970 if( lInvMassCascade < lCascPdgMass - 0.010) return;
2972 // Check the Xi- candidate is within the proper rapidity window (flat efficiency)
2973 if( lRapCascade > 0.5 ) return;
2974 if( lRapCascade < -0.5 ) return;
2977 // 3 options to follow for the correlations:
2978 // 1.1 - "TrigAnyCasc-AssoAnyPrim"
2979 // 1.2 - "TrigCascLeading-AssoAnyPrim"
2980 // 2. - "TrigLeadingTrck-AssoCasc"
2982 if(fAngularCorrelationType.Contains("AssoAnyPrim") ){
2983 //----------------------- Option 1 ---------------------------------------------------------------------------------------------------
2984 // Trigger = cascade,
2985 // Associated = all the primary tracks in the event.
2986 // 1.1 Cascade = trigger above a certain pt but nothing more complicated than that
2987 // 1.2 Cascade = leading particle (Ã la heavy-ion -> test for coalescence)
2989 Bool_t kRejectLowPtCascades = kTRUE;
2990 if(kRejectLowPtCascades && (lTVect3MomXi.Pt() < 1.7) ) return;
2991 // Do not even consider the cascade of low pt for the correlation ...
2993 if(fAngularCorrelationType == "TrigCascLeading-AssoAnyPrim"){// Require the Cascade to be the Leading Part. in the event
2995 // 1st loop: check there is no primary track with a higher pt ...
2996 // = The cascade is meant to be a leading particle : Pt(Casc) > any primary track in the event
2997 for(Int_t TrckIdx = 0; TrckIdx < (InputEvent())->GetNumberOfTracks() ; TrckIdx++ )
2998 {// Loop over all the tracks of the event
3000 AliESDtrack *lCurrentTrck = dynamic_cast<AliESDtrack*>( (InputEvent())->GetTrack( TrckIdx ) );
3001 if (!lCurrentTrck ) {
3002 AliWarning("ERROR Correl. Study : Could not retrieve a track while looping over the event tracks ...");
3006 if( !fESDtrackCuts->AcceptTrack(lCurrentTrck) ) continue;
3007 // Just consider primary tracks (= reject track that are not primary ones)
3008 if(lTVect3MomXi.Pt() < lCurrentTrck->Pt() ) return;
3009 // Room for improvement: //FIXME
3010 // 1. There is a given resolution on pt : maybe release the cut Pt(casc) < Pt(track)*90% ?
3011 // 2. Apply this cut only when DeltaPhi(casc, track) > 90 deg = when track is in the near-side ?
3012 // 3. Anti-splitting cut (like in Femto analysis) ? = now done via ESDtrackCuts ...
3014 }// end control loop
3015 }// end of prelim. check : Cascade = leading part in the event
3017 // 2nd loop: filling loop
3018 for(Int_t TrckIdx = 0; TrckIdx < (InputEvent())->GetNumberOfTracks() ; TrckIdx++ )
3019 {// Loop over all the tracks of the event
3021 AliESDtrack *lCurrentTrck = dynamic_cast<AliESDtrack*>( (InputEvent())->GetTrack( TrckIdx ) );
3022 if (!lCurrentTrck ) {
3023 AliWarning("ERROR Correl. Study : Could not retrieve a track while looping over the event tracks ...");
3026 // Just consider primary tracks (= reject track that are not primary ones)
3027 if( !fESDtrackCuts->AcceptTrack(lCurrentTrck) ) continue;
3029 // Room for improvement: //FIXME
3031 // 2. Exclude the tracks that build the condisdered cascade = the bachelor + the V0 dghters
3032 // This may bias the outcome, especially for low multplicity events.
3033 // Note : For ESD event, track ID == track index.
3034 if(lCurrentTrck->GetID() == lArrTrackID[0]) continue;
3035 if(lCurrentTrck->GetID() == lArrTrackID[1]) continue;
3036 if(lCurrentTrck->GetID() == lArrTrackID[2]) continue;
3038 TVector3 lTVect3MomTrck(lCurrentTrck->Px(), lCurrentTrck->Py(), lCurrentTrck->Pz() );
3040 // 2 hypotheses made here :
3041 // - The Xi trajectory is a straight line,
3042 // - The Xi doesn't loose any energy by crossing the first layer(s) of ITS, if ever;
3043 // So, meaning hyp: vect p(Xi) at the emission = vect p(Xi) at the decay vertex
3044 // By doing this, we introduce a systematic error on the cascade Phi ...
3045 // Room for improvement: take into account the curvature of the Xi trajectory ?
3046 // or rather, the resolution in space of the decay vertex ...
3049 Double_t lHnSpFillVar[5] = {0.};
3050 lHnSpFillVar[0] = lTVect3MomXi.DeltaPhi(lTVect3MomTrck) * 180.0/TMath::Pi(); // Delta phi(Casc,Track) (deg)
3051 if(lHnSpFillVar[0] < -50.0) lHnSpFillVar[0] += 360.0;
3052 lHnSpFillVar[1] = lEtaXi - lCurrentTrck->Eta(); // Delta eta(Casc,Track)
3053 lHnSpFillVar[2] = lTVect3MomXi.Pt(); // Pt_{Casc}
3054 lHnSpFillVar[3] = lCurrentTrck->Pt(); // Pt_{any track}
3055 lHnSpFillVar[4] = lInvMassCascade; // Eff. Inv Mass (control var)
3057 if( lStrCascType.Contains("Xi-") ) fHnSpAngularCorrXiMinus ->Fill( lHnSpFillVar );
3058 else if( lStrCascType.Contains("Xi+") ) fHnSpAngularCorrXiPlus ->Fill( lHnSpFillVar );
3059 else if( lStrCascType.Contains("Omega-") ) fHnSpAngularCorrOmegaMinus ->Fill( lHnSpFillVar );
3060 else if( lStrCascType.Contains("Omega+") ) fHnSpAngularCorrOmegaPlus ->Fill( lHnSpFillVar );
3062 }// end - Loop over all the tracks in the event
3064 }// end of correlation type : "Trig = Casc - Asso = AnyPrim", (cases 1.1 and 1.2)
3068 else if(fAngularCorrelationType == "TrigLeadingTrck-AssoCasc"){
3070 //----------------------- Option 2 ---------------------------------------------------------------------------------------------------
3071 // Trigger = leading track,
3072 // Associated = the cascade'S' in the event
3073 // NOTE : several good cascades could be present in the event (e.g. one leading track as trigger, 2 associated Xi) ...
3074 // The present function will then be called several times.
3075 // = issue for the normalisation ...
3078 // find the index of the (1) primary track (2) which is the leading particle in pt
3079 // NOTE : we do not take into account the Cascade pt, i.e. pt(Casc) could be greater or lower than pt(Leading) ...
3080 Int_t lLeadingPrimTrackIdx = -1;
3081 Double_t lPtMax = 0.1;
3083 for(Int_t TrckIdx = 0; TrckIdx < (InputEvent())->GetNumberOfTracks() ; TrckIdx++ )
3084 {// Loop over all the tracks of the event
3086 AliESDtrack *lCurrentTrck = dynamic_cast<AliESDtrack*>( (InputEvent())->GetTrack( TrckIdx ) );
3087 if (!lCurrentTrck ) {
3088 AliWarning("ERROR Correl. Study : Could not retrieve a track while looping over the event tracks ...");
3092 // Primary track selection
3093 if( !fESDtrackCuts->AcceptTrack(lCurrentTrck) ) continue;
3095 // Exclude the tracks that build the condisdered cascade = the bachelor + the V0 dghters
3096 // This may bias the outcome, especially for low multplicity events.
3097 // Note : For ESD event, track ID == track index.
3098 if(lCurrentTrck->GetID() == lArrTrackID[0]) continue;
3099 if(lCurrentTrck->GetID() == lArrTrackID[1]) continue;
3100 if(lCurrentTrck->GetID() == lArrTrackID[2]) continue;
3102 // Towards the leading track
3103 if( lPtMax < lCurrentTrck->Pt() ){
3104 lLeadingPrimTrackIdx = TMath::Abs( lCurrentTrck->GetID() );
3105 lPtMax = lCurrentTrck->Pt();
3107 }// end leading track finding loop
3109 if( lLeadingPrimTrackIdx < 0 ) return;
3110 if( lPtMax < 0.101 ) return;
3113 // 2nd step: filling ONCE the THnSparse
3114 AliESDtrack *lLeadingTrck = dynamic_cast<AliESDtrack*>( (InputEvent())->GetTrack( lLeadingPrimTrackIdx ) );
3116 TVector3 lTVect3MomLeadingTrck( lLeadingTrck->Px(), lLeadingTrck->Py(), lLeadingTrck->Pz() );
3118 // 2 hypotheses made here :
3119 // - The Xi trajectory is a straight line,
3120 // - The Xi doesn't loose any energy by crossing the first layer(s) of ITS, if ever;
3121 // So, meaning hyp: vect p(Xi) at the emission = vect p(Xi) at the decay vertex
3122 // By doing this, we introduce a systematic error on the cascade Phi ...
3123 // Room for improvement: take into account the curvature of the Xi trajectory ?
3124 // or rather, the resolution in space of the decay vertex ...
3127 Double_t lHnSpFillVar[5] = {0.};
3128 lHnSpFillVar[0] = lTVect3MomLeadingTrck.DeltaPhi(lTVect3MomXi) * 180.0/TMath::Pi(); // Delta phi(leading Track, Casc) (deg)
3129 if(lHnSpFillVar[0] < -50.0) lHnSpFillVar[0] += 360.0;
3130 lHnSpFillVar[1] = lLeadingTrck->Eta() - lEtaXi; // Delta eta(leading Track, Casc)
3131 lHnSpFillVar[2] = lTVect3MomXi.Pt(); // Pt_{Casc}
3132 lHnSpFillVar[3] = lLeadingTrck->Pt(); // Pt_{leading track}
3133 lHnSpFillVar[4] = lInvMassCascade; // Eff. Inv Mass (control var)
3135 if( lStrCascType.Contains("Xi-") ) fHnSpAngularCorrXiMinus ->Fill( lHnSpFillVar );
3136 else if( lStrCascType.Contains("Xi+") ) fHnSpAngularCorrXiPlus ->Fill( lHnSpFillVar );
3137 else if( lStrCascType.Contains("Omega-") ) fHnSpAngularCorrOmegaMinus ->Fill( lHnSpFillVar );
3138 else if( lStrCascType.Contains("Omega+") ) fHnSpAngularCorrOmegaPlus ->Fill( lHnSpFillVar );
3139 }// end of correlation type : "Trig = LeadingTrck -Asso = Casc"
3145 Int_t AliAnalysisTaskCheckCascade::DoESDTrackWithTPCrefitMultiplicity(const AliESDEvent *lESDevent)
3147 // Checking the number of tracks with TPCrefit for each event
3148 // Needed for a rough assessment of the event multiplicity
3150 Int_t nTrackWithTPCrefitMultiplicity = 0;
3151 for(Int_t iTrackIdx = 0; iTrackIdx < (InputEvent())->GetNumberOfTracks(); iTrackIdx++){
3152 AliESDtrack *esdTrack = 0x0;
3153 esdTrack = lESDevent->GetTrack( iTrackIdx );
3154 if (!esdTrack) { AliWarning("Pb / Could not retrieve one track within the track loop for TPCrefit check ..."); continue; }
3156 ULong_t lTrackStatus = esdTrack->GetStatus();
3157 if ((lTrackStatus&AliESDtrack::kTPCrefit) == 0) continue;
3158 else nTrackWithTPCrefitMultiplicity++;
3160 // The goal here is to get a better assessment of the event multiplicity.
3161 // (InputEvent())->GetNumberOfTracks() takes into account ITS std alone tracks + global tracks
3162 // This may introduce a bias. Hence the number of TPC refit tracks.
3163 // Note : the event multiplicity = analysis on its own... See Jacek's or Jan Fiete's analysis on dN/d(eta)
3165 }// end loop over all event tracks
3166 return nTrackWithTPCrefitMultiplicity;
3173 //________________________________________________________________________
3174 void AliAnalysisTaskCheckCascade::Terminate(Option_t *)
3176 // Draw result to the screen
3177 // Called once at the end of the query
3179 TList *cRetrievedList = 0x0;
3180 cRetrievedList = (TList*)GetOutputData(1);
3181 if(!cRetrievedList){
3182 AliWarning("ERROR - AliAnalysisTaskCheckCascade: ouput data container list not available\n"); return;
3185 fHistTrackMultiplicityForTrigEvt = dynamic_cast<TH1F*> ( cRetrievedList->FindObject("fHistTrackMultiplicityForTrigEvt") );
3186 if (!fHistTrackMultiplicityForTrigEvt) {
3187 AliWarning("ERROR - AliAnalysisTaskCheckCascade: fHistTrackMultiplicityForTrigEvt not available\n"); return;
3190 fHistCascadeMultiplicityForTrigEvt = dynamic_cast<TH1F*> ( cRetrievedList->FindObject("fHistCascadeMultiplicityForTrigEvt") );
3191 if (!fHistCascadeMultiplicityForTrigEvt) {
3192 AliWarning("ERROR - AliAnalysisTaskCheckCascade: fHistCascadeMultiplicityForTrigEvt not available\n"); return;
3195 fHistMassXiMinus = dynamic_cast<TH1F*> ( cRetrievedList->FindObject("fHistMassXiMinus") );
3196 if (!fHistMassXiMinus) {
3197 AliWarning("ERROR - AliAnalysisTaskCheckCascade: fHistMassXiMinus not available\n"); return;
3199 fHistMassXiPlus = dynamic_cast<TH1F*> ( cRetrievedList->FindObject("fHistMassXiPlus") );
3200 if (!fHistMassXiPlus) {
3201 AliWarning("ERROR - AliAnalysisTaskCheckCascade: fHistMassXiPlus not available\n"); return;
3203 fHistMassOmegaMinus = dynamic_cast<TH1F*> ( cRetrievedList->FindObject("fHistMassOmegaMinus") );
3204 if (!fHistMassOmegaMinus) {
3205 AliWarning("ERROR - AliAnalysisTaskCheckCascade: fHistMassOmegaMinus not available\n"); return;
3207 fHistMassOmegaPlus = dynamic_cast<TH1F*> ( cRetrievedList->FindObject("fHistMassOmegaPlus") );
3208 if (!fHistMassOmegaPlus) {
3209 AliWarning("ERROR - AliAnalysisTaskCheckCascade: fHistMassOmegaPlus not available\n"); return;
3212 TCanvas *canCheckCascade = new TCanvas("AliAnalysisTaskCheckCascade","CheckCascade overview",10,10,1010,660);
3213 canCheckCascade->Divide(2,2);
3215 canCheckCascade->cd(1);
3216 canCheckCascade->cd(1)->SetLogy();
3217 fHistTrackMultiplicityForTrigEvt->SetMarkerStyle(kFullStar);
3218 fHistTrackMultiplicityForTrigEvt->GetXaxis()->SetLabelFont(42);
3219 fHistTrackMultiplicityForTrigEvt->GetYaxis()->SetLabelFont(42);
3220 fHistTrackMultiplicityForTrigEvt->SetTitleFont(42, "xy");
3221 fHistTrackMultiplicityForTrigEvt->GetXaxis()->SetTitleOffset(1.1);
3222 fHistTrackMultiplicityForTrigEvt->DrawCopy("H");
3224 canCheckCascade->cd(2);
3225 canCheckCascade->cd(2)->SetLogy();
3226 fHistCascadeMultiplicityForTrigEvt->SetMarkerStyle(kOpenSquare);
3227 fHistCascadeMultiplicityForTrigEvt->GetXaxis()->SetLabelFont(42);
3228 fHistCascadeMultiplicityForTrigEvt->GetYaxis()->SetLabelFont(42);
3229 fHistCascadeMultiplicityForTrigEvt->SetTitleFont(42, "xy");
3230 fHistCascadeMultiplicityForTrigEvt->GetXaxis()->SetTitleOffset(1.1);
3231 fHistCascadeMultiplicityForTrigEvt->DrawCopy("E");
3233 canCheckCascade->cd(3);
3234 fHistMassXiMinus ->SetMarkerStyle(kFullCircle);
3235 fHistMassXiMinus ->SetMarkerSize(0.5);
3236 fHistMassXiMinus ->GetXaxis()->SetLabelFont(42);
3237 fHistMassXiMinus ->GetYaxis()->SetLabelFont(42);
3238 fHistMassXiMinus ->SetTitleFont(42, "xy");
3239 fHistMassXiMinus ->GetXaxis()->SetTitleOffset(1.1);
3240 fHistMassXiMinus ->GetYaxis()->SetTitleOffset(1.3);
3241 // fHistMassXiMinus->Rebin(2);
3242 fHistMassXiMinus ->GetXaxis()->SetRangeUser(1.24, 1.42);
3243 fHistMassXiMinus ->DrawCopy("E");
3245 fHistMassXiPlus ->SetMarkerStyle(kOpenCircle);
3246 fHistMassXiPlus ->SetMarkerColor(kRed+2);
3247 fHistMassXiPlus ->SetLineColor(kRed+2);
3248 fHistMassXiPlus ->SetMarkerSize(0.5);
3249 // fHistMassXiPlus ->Rebin(2);
3250 fHistMassXiPlus ->DrawCopy("ESAME");
3253 TLegend *legendeXi =new TLegend(0.67,0.34,0.97,0.54);
3254 legendeXi->SetTextFont(42);
3255 legendeXi->SetTextSize(0.05);
3256 legendeXi->SetFillColor(kWhite);
3257 legendeXi->AddEntry( fHistMassXiMinus,"#Xi^{-} candidates","lp");
3258 legendeXi->AddEntry( fHistMassXiPlus,"#bar{#Xi}^{+} candidates","lp");
3262 canCheckCascade->cd(4);
3263 fHistMassOmegaPlus ->SetMarkerStyle(kOpenCircle);
3264 fHistMassOmegaPlus ->SetMarkerColor(kRed+2);
3265 fHistMassOmegaPlus ->SetLineColor(kRed+2);
3266 fHistMassOmegaPlus ->SetMarkerSize(0.5);
3267 fHistMassOmegaPlus ->GetXaxis()->SetLabelFont(42);
3268 fHistMassOmegaPlus ->GetYaxis()->SetLabelFont(42);
3269 fHistMassOmegaPlus ->SetTitleFont(42, "xy");
3270 fHistMassOmegaPlus ->GetXaxis()->SetTitleOffset(1.1);
3271 fHistMassOmegaPlus ->GetYaxis()->SetTitleOffset(1.25);
3272 // fHistMassOmegaPlus ->Rebin(2);
3273 fHistMassOmegaPlus ->GetXaxis()->SetRangeUser(1.6, 1.84);
3274 fHistMassOmegaPlus ->DrawCopy("E");
3276 fHistMassOmegaMinus->SetMarkerStyle(kFullCircle);
3277 fHistMassOmegaMinus->SetMarkerSize(0.5);
3278 // fHistMassOmegaMinus->Rebin(2);
3279 fHistMassOmegaMinus->DrawCopy("ESAME");
3282 TLegend *legendeOmega = new TLegend(0.67,0.34,0.97,0.54);
3283 legendeOmega->SetTextFont(42);
3284 legendeOmega->SetTextSize(0.05);
3285 legendeOmega->SetFillColor(kWhite);
3286 legendeOmega->AddEntry( fHistMassOmegaMinus,"#Omega^{-} candidates","lp");
3287 legendeOmega->AddEntry( fHistMassOmegaPlus,"#bar{#Omega}^{+} candidates","lp");
3288 legendeOmega->Draw();