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 Mar2010, antonin.maire@ires.in2p3.fr
26 //-----------------------------------------------------------------
34 //class AliMCEventHandler;
43 #include <Riostream.h>
48 #include "THnSparse.h"
57 #include "AliESDEvent.h"
58 #include "AliAODEvent.h"
59 // #include "AliV0vertexer.h"
60 // #include "AliCascadeVertexer.h"
61 #include "AliESDpid.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"), fCollidingSystems(0), fESDpid(0), /*fPaveTextBookKeeping(0),*/
82 fkRerunV0CascVertexers (0),
83 fkQualityCutZprimVtxPos (kTRUE),
84 fkQualityCutNoTPConlyPrimVtx(kTRUE),
85 fkQualityCutTPCrefit (kTRUE),
86 fkQualityCut80TPCcls (kTRUE),
87 fkExtraSelections (0),
89 // - Cascade part initialisation
91 fHistCascadeMultiplicityBeforeTrigSel(0),
92 fHistCascadeMultiplicityForTrigEvt(0), fHistTrackMultiplicityForTrigEvt(0), fHistTPCrefitTrackMultiplicityForTrigEvt(0),
93 fHistCascadeMultiplicityForSelEvt(0),
94 fHistPosBestPrimaryVtxXForSelEvt(0), fHistPosBestPrimaryVtxYForSelEvt(0), fHistPosBestPrimaryVtxZForSelEvt(0),
95 fHistTPCrefitTrackMultiplicityForCascadeEvt(0),
96 fHistPosV0TPCClusters(0), fHistNegV0TPCClusters(0), fHistBachTPCClusters(0),
99 fHistPosTrkgPrimaryVtxXForCascadeEvt(0), fHistPosTrkgPrimaryVtxYForCascadeEvt(0), fHistPosTrkgPrimaryVtxZForCascadeEvt(0), fHistTrkgPrimaryVtxRadius(0),
100 fHistPosBestPrimaryVtxXForCascadeEvt(0), fHistPosBestPrimaryVtxYForCascadeEvt(0), fHistPosBestPrimaryVtxZForCascadeEvt(0), fHistBestPrimaryVtxRadius(0),
101 f2dHistTrkgPrimVtxVsBestPrimVtx(0),
103 fHistEffMassXi(0), fHistChi2Xi(0),
104 fHistDcaXiDaughters(0), fHistDcaBachToPrimVertex(0), fHistXiCosineOfPointingAngle(0), fHistXiRadius(0),
106 fHistMassLambdaAsCascDghter(0),
108 fHistDcaV0DaughtersXi(0),
109 fHistDcaV0ToPrimVertexXi(0),
110 fHistV0CosineOfPointingAngleXi(0),
112 fHistDcaPosToPrimVertexXi(0), fHistDcaNegToPrimVertexXi(0),
114 fHistMassXiMinus(0), fHistMassXiPlus(0),
115 fHistMassOmegaMinus(0), fHistMassOmegaPlus(0),
116 fHistMassWithCombPIDXiMinus(0), fHistMassWithCombPIDXiPlus(0),
117 fHistMassWithCombPIDOmegaMinus(0), fHistMassWithCombPIDOmegaPlus(0),
119 fHistXiTransvMom(0), fHistXiTotMom(0),
120 fHistBachTransvMomXi(0), fHistBachTotMomXi(0),
123 fHistV0toXiCosineOfPointingAngle(0),
125 fHistRapXi(0), fHistRapOmega(0), fHistEtaXi(0),
126 fHistThetaXi(0), fHistPhiXi(0),
128 f2dHistArmenteros(0),
129 f2dHistEffMassLambdaVsEffMassXiMinus(0), f2dHistEffMassXiVsEffMassOmegaMinus(0),
130 f2dHistEffMassLambdaVsEffMassXiPlus(0), f2dHistEffMassXiVsEffMassOmegaPlus(0),
131 f2dHistXiRadiusVsEffMassXiMinus(0), f2dHistXiRadiusVsEffMassXiPlus(0),
132 f2dHistXiRadiusVsEffMassOmegaMinus(0), f2dHistXiRadiusVsEffMassOmegaPlus(0),
134 f3dHistXiPtVsEffMassVsYXiMinus(0), f3dHistXiPtVsEffMassVsYXiPlus(0),
135 f3dHistXiPtVsEffMassVsYOmegaMinus(0), f3dHistXiPtVsEffMassVsYOmegaPlus(0),
137 f3dHistXiPtVsEffMassVsYWithCombPIDXiMinus(0), f3dHistXiPtVsEffMassVsYWithCombPIDXiPlus(0),
138 f3dHistXiPtVsEffMassVsYWithCombPIDOmegaMinus(0), f3dHistXiPtVsEffMassVsYWithCombPIDOmegaPlus(0),
139 f3dHistXiPtVsEffMassVsYWith2CombPIDOmegaMinus(0), f3dHistXiPtVsEffMassVsYWith2CombPIDOmegaPlus(0),
140 f3dHistXiPtVsEffMassVsYWithTpcPIDOmegaMinus(0),
142 fCFContCascadePIDXiMinus(0),
143 fCFContCascadePIDXiPlus(0),
144 fCFContCascadePIDOmegaMinus(0),
145 fCFContCascadePIDOmegaPlus(0),
146 fCFContCascadeCuts(0),
148 fHnSpAngularCorrXiMinus(0), fHnSpAngularCorrXiPlus(0),
149 fHnSpAngularCorrOmegaMinus(0), fHnSpAngularCorrOmegaPlus(0)
153 for(Int_t iAlephIdx = 0; iAlephIdx < 5; iAlephIdx++ ) { fAlephParameters [iAlephIdx] = -1.; }
154 for(Int_t iV0selIdx = 0; iV0selIdx < 7; iV0selIdx++ ) { fV0Sels [iV0selIdx ] = -1.; }
155 for(Int_t iCascSelIdx = 0; iCascSelIdx < 8; iCascSelIdx++ ) { fCascSels [iCascSelIdx ] = -1.; }
165 //________________________________________________________________________
166 AliAnalysisTaskCheckCascade::AliAnalysisTaskCheckCascade(const char *name)
167 : AliAnalysisTaskSE(name), fAnalysisType("ESD"), fCollidingSystems(0), fESDpid(0), /*fPaveTextBookKeeping(0),*/
168 fkRerunV0CascVertexers (0),
169 fkQualityCutZprimVtxPos (kTRUE),
170 fkQualityCutNoTPConlyPrimVtx(kTRUE),
171 fkQualityCutTPCrefit (kTRUE),
172 fkQualityCut80TPCcls (kTRUE),
173 fkExtraSelections (0),
175 // - Cascade part initialisation
177 fHistCascadeMultiplicityBeforeTrigSel(0),
178 fHistCascadeMultiplicityForTrigEvt(0), fHistTrackMultiplicityForTrigEvt(0), fHistTPCrefitTrackMultiplicityForTrigEvt(0),
179 fHistCascadeMultiplicityForSelEvt(0),
180 fHistPosBestPrimaryVtxXForSelEvt(0), fHistPosBestPrimaryVtxYForSelEvt(0), fHistPosBestPrimaryVtxZForSelEvt(0),
181 fHistTPCrefitTrackMultiplicityForCascadeEvt(0),
182 fHistPosV0TPCClusters(0), fHistNegV0TPCClusters(0), fHistBachTPCClusters(0),
185 fHistPosTrkgPrimaryVtxXForCascadeEvt(0), fHistPosTrkgPrimaryVtxYForCascadeEvt(0), fHistPosTrkgPrimaryVtxZForCascadeEvt(0), fHistTrkgPrimaryVtxRadius(0),
186 fHistPosBestPrimaryVtxXForCascadeEvt(0), fHistPosBestPrimaryVtxYForCascadeEvt(0), fHistPosBestPrimaryVtxZForCascadeEvt(0), fHistBestPrimaryVtxRadius(0),
187 f2dHistTrkgPrimVtxVsBestPrimVtx(0),
189 fHistEffMassXi(0), fHistChi2Xi(0),
190 fHistDcaXiDaughters(0), fHistDcaBachToPrimVertex(0), fHistXiCosineOfPointingAngle(0), fHistXiRadius(0),
192 fHistMassLambdaAsCascDghter(0),
194 fHistDcaV0DaughtersXi(0),
195 fHistDcaV0ToPrimVertexXi(0),
196 fHistV0CosineOfPointingAngleXi(0),
198 fHistDcaPosToPrimVertexXi(0), fHistDcaNegToPrimVertexXi(0),
200 fHistMassXiMinus(0), fHistMassXiPlus(0),
201 fHistMassOmegaMinus(0), fHistMassOmegaPlus(0),
202 fHistMassWithCombPIDXiMinus(0), fHistMassWithCombPIDXiPlus(0),
203 fHistMassWithCombPIDOmegaMinus(0), fHistMassWithCombPIDOmegaPlus(0),
205 fHistXiTransvMom(0), fHistXiTotMom(0),
206 fHistBachTransvMomXi(0), fHistBachTotMomXi(0),
209 fHistV0toXiCosineOfPointingAngle(0),
211 fHistRapXi(0), fHistRapOmega(0), fHistEtaXi(0),
212 fHistThetaXi(0), fHistPhiXi(0),
214 f2dHistArmenteros(0),
215 f2dHistEffMassLambdaVsEffMassXiMinus(0), f2dHistEffMassXiVsEffMassOmegaMinus(0),
216 f2dHistEffMassLambdaVsEffMassXiPlus(0), f2dHistEffMassXiVsEffMassOmegaPlus(0),
217 f2dHistXiRadiusVsEffMassXiMinus(0), f2dHistXiRadiusVsEffMassXiPlus(0),
218 f2dHistXiRadiusVsEffMassOmegaMinus(0), f2dHistXiRadiusVsEffMassOmegaPlus(0),
220 f3dHistXiPtVsEffMassVsYXiMinus(0), f3dHistXiPtVsEffMassVsYXiPlus(0),
221 f3dHistXiPtVsEffMassVsYOmegaMinus(0), f3dHistXiPtVsEffMassVsYOmegaPlus(0),
223 f3dHistXiPtVsEffMassVsYWithCombPIDXiMinus(0), f3dHistXiPtVsEffMassVsYWithCombPIDXiPlus(0),
224 f3dHistXiPtVsEffMassVsYWithCombPIDOmegaMinus(0), f3dHistXiPtVsEffMassVsYWithCombPIDOmegaPlus(0),
225 f3dHistXiPtVsEffMassVsYWith2CombPIDOmegaMinus(0), f3dHistXiPtVsEffMassVsYWith2CombPIDOmegaPlus(0),
226 f3dHistXiPtVsEffMassVsYWithTpcPIDOmegaMinus(0),
228 fCFContCascadePIDXiMinus(0),
229 fCFContCascadePIDXiPlus(0),
230 fCFContCascadePIDOmegaMinus(0),
231 fCFContCascadePIDOmegaPlus(0),
232 fCFContCascadeCuts(0),
234 fHnSpAngularCorrXiMinus(0), fHnSpAngularCorrXiPlus(0),
235 fHnSpAngularCorrOmegaMinus(0), fHnSpAngularCorrOmegaPlus(0)
240 // Define input and output slots here
241 // Input slot #0 works with a TChain
242 // DefineInput(0, TChain::Class());
243 // Output slot #1 writes into a TList container (cascade)
245 for(Int_t iAlephIdx = 0; iAlephIdx < 5; iAlephIdx++ ) { fAlephParameters [iAlephIdx] = -1.; }
247 fV0Sels[0] = 33. ; // max allowed chi2
248 fV0Sels[1] = 0.01; // min allowed impact parameter for the 1st daughter (LHC09a4 : 0.05)
249 fV0Sels[2] = 0.01; // min allowed impact parameter for the 2nd daughter (LHC09a4 : 0.05)
250 fV0Sels[3] = 2.0 ; // max allowed DCA between the daughter tracks (LHC09a4 : 0.5)
251 fV0Sels[4] = 0.0 ; // min allowed cosine of V0's pointing angle (LHC09a4 : 0.99)
252 fV0Sels[5] = 0.2 ; // min radius of the fiducial volume (LHC09a4 : 0.2)
253 fV0Sels[6] = 100. ; // max radius of the fiducial volume (LHC09a4 : 100.0)
255 fCascSels[0] = 33. ; // max allowed chi2 (same as PDC07)
256 fCascSels[1] = 0.01 ; // min allowed V0 impact parameter (PDC07 : 0.05 / LHC09a4 : 0.025 )
257 fCascSels[2] = 0.008; // "window" around the Lambda mass (PDC07 : 0.008 / LHC09a4 : 0.010 )
258 fCascSels[3] = 0.01 ; // min allowed bachelor's impact parameter (PDC07 : 0.035 / LHC09a4 : 0.025 )
259 fCascSels[4] = 2.0 ; // max allowed DCA between the V0 and the bachelor (PDC07 : 0.1 / LHC09a4 : 0.2 )
260 fCascSels[5] = 0.98 ; // min allowed cosine of the cascade pointing angle (PDC07 : 0.9985 / LHC09a4 : 0.998 )
261 fCascSels[6] = 0.2 ; // min radius of the fiducial volume (PDC07 : 0.9 / LHC09a4 : 0.2 )
262 fCascSels[7] = 100. ; // max radius of the fiducial volume (PDC07 : 100 / LHC09a4 : 100 )
264 // Output slot #0 writes into a TList container (Cascade)
265 DefineOutput(1, TList::Class());
266 /*DefineOutput(2, TPaveText::Class());*/
270 AliAnalysisTaskCheckCascade::~AliAnalysisTaskCheckCascade()
276 // For all TH1, 2, 3 HnSparse and CFContainer are in the fListCascade TList.
277 // They will be deleted when fListCascade is deleted by the TSelector dtor
278 // Because of TList::SetOwner() ...
280 if (fListHistCascade) { delete fListHistCascade; fListHistCascade = 0x0; }
281 if (fESDpid) { delete fESDpid; fESDpid = 0x0;} // fESDpid is not stored into the TList
282 //if (fPaveTextBookKeeping) { delete fPaveTextBookKeeping; fPaveTextBookKeeping = 0x0;} // fPaveTextBookKeeping is not strored in the TList
287 //________________________________________________________________________
288 void AliAnalysisTaskCheckCascade::UserCreateOutputObjects()
295 fListHistCascade = new TList();
296 fListHistCascade->SetOwner(); // See http://root.cern.ch/root/html/TCollection.html#TCollection:SetOwner
301 AliMCEventHandler *lmcEvtHandler = dynamic_cast<AliMCEventHandler*>( (AliAnalysisManager::GetAnalysisManager())->GetMCtruthEventHandler() );
303 if( !lmcEvtHandler ){ // !0x0 = real data or !1 = there is an MC handler available (useMC = kTRUE in AnalysisTrainNew), so = data from MC
305 // Reasonable parameters extracted for real p-p event (Dec 2009 - GSI Pass5) - A.Kalweit
306 fAlephParameters[0] = 0.0283086; // No extra-division to apply in SetBlochParam
307 fAlephParameters[1] = 2.63394e+01;
308 fAlephParameters[2] = 5.04114e-11;
309 fAlephParameters[3] = 2.12543e+00;
310 fAlephParameters[4] = 4.88663e+00;
311 Printf("CheckCascade - Check Aleph Param in case of REAL Data (fAlephParameters[1] = %f)\n", fAlephParameters[1]);
314 // Reasonable parameters extracted for p-p simulation (LHC09a4) - A.Kalweit
315 // fAlephParameters[0] = 4.23232575531564326e+00;//50*0.76176e-1; // do not forget to divide this value by 50 in SetBlochParam !
316 // fAlephParameters[1] = 8.68482806165147636e+00;//10.632;
317 // fAlephParameters[2] = 1.34000000000000005e-05;//0.13279e-4;
318 // fAlephParameters[3] = 2.30445734159456084e+00;//1.8631;
319 // fAlephParameters[4] = 2.25624744086878559e+00;//1.9479;
321 // Reasonable parameters extracted for MC LHC09d10 event (Jan 2010) - A.Kalweit
322 fAlephParameters[0] = 2.15898e+00/50.;
323 fAlephParameters[1] = 1.75295e+01;
324 fAlephParameters[2] = 3.40030e-09;
325 fAlephParameters[3] = 1.96178e+00;
326 fAlephParameters[4] = 3.91720e+00;
327 Printf("CheckCascade - Check Aleph Param win case MC data (fAlephParameters[1] = %f)\n", fAlephParameters[1]);
330 fESDpid = new AliESDpid();
331 fESDpid->GetTPCResponse().SetBetheBlochParameters( fAlephParameters[0],
335 fAlephParameters[4] );
340 if( !fPaveTextBookKeeping){
341 fPaveTextBookKeeping = new TPaveText(0.1, 0.1, 0.9, 0.9,"NDC");
342 fPaveTextBookKeeping->SetName("fPaveTextBookKeeping");
343 fPaveTextBookKeeping->SetBorderSize(0);
344 fPaveTextBookKeeping->SetTextAlign(12);
345 fPaveTextBookKeeping->SetFillColor(kWhite);
346 fPaveTextBookKeeping->SetTextFont(42); // regular Arial or Helvetica,
347 fPaveTextBookKeeping->SetTextColor(kBlue+4);
349 fPaveTextBookKeeping->AddText( "Task CHECK CASCADE analysis" );
350 fPaveTextBookKeeping->AddText("- - - - - - - - - - - ");
351 fPaveTextBookKeeping->AddText( Form("AnalysisType : %s ", fAnalysisType.Data() ));
352 if(!fCollidingSystems) fPaveTextBookKeeping->AddText("Colliding system : p-p collisions ");
353 else fPaveTextBookKeeping->AddText("Colliding system : A-A collisions ");
355 fPaveTextBookKeeping->AddText("- - - - - - - - - - - ");
357 if(fkRerunV0CascVertexers){
358 fPaveTextBookKeeping->AddText("A.1. With V0 vertexer : ");
359 fPaveTextBookKeeping->AddText( Form(" - V0 #chi^{2} _________________ < %.3f ", fV0Sels[0] ));
360 fPaveTextBookKeeping->AddText( Form(" - DCA(prim. Vtx/ 1^{st} daughter) ___ > %.3f cm ", fV0Sels[1] ));
361 fPaveTextBookKeeping->AddText( Form(" - DCA(prim. Vtx/ 2^{nd} daughter) __ > %.3f cm", fV0Sels[2] ));
362 fPaveTextBookKeeping->AddText( Form(" - DCA between V0 daughters ___ < %.3f cm", fV0Sels[3] ));
363 fPaveTextBookKeeping->AddText( Form(" - cos(V0 pointing angle) _______ > %.3f ", fV0Sels[4] ));
364 fPaveTextBookKeeping->AddText( Form(" - R_{transv}(V0 decay) ________ > %.3f cm", fV0Sels[5] ));
365 fPaveTextBookKeeping->AddText( Form(" - R_{transv}(V0 decay) ________ < %.3f cm", fV0Sels[6] ));
367 fPaveTextBookKeeping->AddText(" ");
369 fPaveTextBookKeeping->AddText("A.2. With Casc. vertexer : ");
370 fPaveTextBookKeeping->AddText( Form(" - Casc. #chi^{2} ______________ < %.3f ", fCascSels[0] ));
371 fPaveTextBookKeeping->AddText( Form(" - DCA(prim. Vtx/ V0) _________ > %.3f cm", fCascSels[1] ));
372 fPaveTextBookKeeping->AddText( Form(" - | M_{#Lambda}(reco) - M_{#Lambda}(pdg) | _______ < %.3f GeV/c^{2}", fCascSels[2] ));
373 fPaveTextBookKeeping->AddText( Form(" - DCA(prim. Vtx/ Bach) _______ > %.3f cm", fCascSels[3] ));
374 fPaveTextBookKeeping->AddText( Form(" - DCA between Bach/ #Lambda ______ < %.3f cm", fCascSels[4] ));
375 fPaveTextBookKeeping->AddText( Form(" - cos(Casc. pointing angle) ____ > %.3f ", fCascSels[5] ));
376 fPaveTextBookKeeping->AddText( Form(" - R_{transv}(Casc. decay) ______ > %.3f cm", fCascSels[6] ));
377 fPaveTextBookKeeping->AddText( Form(" - R_{transv}(Casc. decay) ______ < %.3f cm", fCascSels[7] ));
379 else{ fPaveTextBookKeeping->AddText("A. No rerunning of the V0/Casc. vertexers ... See std cuts in (AliRoot+Rec.C) used for this prod. cycle");}
381 fPaveTextBookKeeping->AddText("- - - - - - - - - - - ");
383 if(fkQualityCutZprimVtxPos) fPaveTextBookKeeping->AddText("B. Quality Cut(prim. Vtx z-Pos) = ON ");
384 else fPaveTextBookKeeping->AddText("B. Quality Cut(prim. Vtx z-Pos) = Off ");
385 if(fkQualityCutNoTPConlyPrimVtx) fPaveTextBookKeeping->AddText("C. Quality Cut(No TPC prim. vtx) = ON ");
386 else fPaveTextBookKeeping->AddText("C. Quality Cut(No TPC prim. vtx) = Off ");
387 if(fkQualityCutTPCrefit) fPaveTextBookKeeping->AddText("D. Quality Cut(TPCrefit) = ON ");
388 else fPaveTextBookKeeping->AddText("D. Quality Cut(TPCrefit) = Off ");
389 if(fkQualityCut80TPCcls) fPaveTextBookKeeping->AddText("E. Quality Cut(80 TPC clusters) = ON ");
390 else fPaveTextBookKeeping->AddText("E. Quality Cut(80 TPC clusters) = Off ");
391 if(fkExtraSelections) fPaveTextBookKeeping->AddText("F. Extra Analysis Selections = ON ");
392 else fPaveTextBookKeeping->AddText("F. Extra Analysis Selections = Off ");
394 fPaveTextBookKeeping->AddText("- - - - - - - - - - - ");
396 fPaveTextBookKeeping->AddText("G. TPC Aleph Param : ");
397 fPaveTextBookKeeping->AddText( Form(" - fAlephParam [0] = %.5g", fAlephParameters[0] ));
398 fPaveTextBookKeeping->AddText( Form(" - fAlephParam [1] = %.5g", fAlephParameters[1] ));
399 fPaveTextBookKeeping->AddText( Form(" - fAlephParam [2] = %.5g", fAlephParameters[2] ));
400 fPaveTextBookKeeping->AddText( Form(" - fAlephParam [3] = %.5g", fAlephParameters[3] ));
401 fPaveTextBookKeeping->AddText( Form(" - fAlephParam [4] = %.5g", fAlephParameters[4] ));
408 if(! fHistCascadeMultiplicityBeforeTrigSel) {
409 if(fCollidingSystems)// AA collisions
410 fHistCascadeMultiplicityBeforeTrigSel = new TH1F("fHistCascadeMultiplicityBeforeTrigSel",
411 "Cascades per event (before Trig. Sel.);Nbr of Cascades/Evt;Events",
413 else // pp collisions
414 fHistCascadeMultiplicityBeforeTrigSel = new TH1F("fHistCascadeMultiplicityBeforeTrigSel",
415 "Cascades per event (before Trig. Sel.);Nbr of Cascades/Evt;Events",
417 fListHistCascade->Add(fHistCascadeMultiplicityBeforeTrigSel);
420 // - Histos for events passing the trigger selection
423 if(! fHistCascadeMultiplicityForTrigEvt) {
424 if(fCollidingSystems)// AA collisions
425 fHistCascadeMultiplicityForTrigEvt = new TH1F("fHistCascadeMultiplicityForTrigEvt",
426 "Cascades per event (for triggered evt);Nbr of Cascades/Evt;Events",
428 else // pp collisions
429 fHistCascadeMultiplicityForTrigEvt = new TH1F("fHistCascadeMultiplicityForTrigEvt",
430 "Cascades per event (for triggered evt);Nbr of Cascades/Evt;Events",
432 fListHistCascade->Add(fHistCascadeMultiplicityForTrigEvt);
436 if(! fHistTrackMultiplicityForTrigEvt) {
437 if(fCollidingSystems)// AA collisions
438 fHistTrackMultiplicityForTrigEvt = new TH1F("fHistTrackMultiplicityForTrigEvt",
439 "Track Multiplicity (for triggered evt);Nbr of tracks/Evt;Events",
441 else // pp collisions
442 fHistTrackMultiplicityForTrigEvt = new TH1F("fHistTrackMultiplicityForTrigEvt",
443 "Track Multiplicity (for triggered evt);Nbr of tracks/Evt;Events",
445 fListHistCascade->Add(fHistTrackMultiplicityForTrigEvt);
448 if(! fHistTPCrefitTrackMultiplicityForTrigEvt) {
449 if(fCollidingSystems)// AA collisions
450 fHistTPCrefitTrackMultiplicityForTrigEvt = new TH1F("fHistTPCrefitTrackMultiplicityForTrigEvt",
451 "TPCrefit track Multiplicity (for triggered evt);Nbr of TPCrefit tracks/Evt;Events",
453 else // pp collisions
454 fHistTPCrefitTrackMultiplicityForTrigEvt = new TH1F("fHistTPCrefitTrackMultiplicityForTrigEvt",
455 "TPCrefit track Multiplicity (for triggered evt);Nbr of TPCrefit tracks/Evt;Events",
457 fListHistCascade->Add(fHistTPCrefitTrackMultiplicityForTrigEvt);
461 // - Histos for events passing the event selection at the analysis level
464 if(! fHistCascadeMultiplicityForSelEvt) {
465 if(fCollidingSystems)// AA collisions
466 fHistCascadeMultiplicityForSelEvt = new TH1F("fHistCascadeMultiplicityForSelEvt",
467 "Cascades per event;Nbr of Cascades/Evt;Events",
469 else // pp collisions
470 fHistCascadeMultiplicityForSelEvt = new TH1F("fHistCascadeMultiplicityForSelEvt",
471 "Cascades per event;Nbr of Cascades/Evt;Events",
473 fListHistCascade->Add(fHistCascadeMultiplicityForSelEvt);
476 if(! fHistPosBestPrimaryVtxXForSelEvt ){
477 fHistPosBestPrimaryVtxXForSelEvt = new TH1F( "fHistPosBestPrimaryVtxXForSelEvt" , "Best Prim. Vertex Position in x; x (cm); Events" , 200, -0.5, 0.5 );
478 fListHistCascade->Add(fHistPosBestPrimaryVtxXForSelEvt);
481 if(! fHistPosBestPrimaryVtxYForSelEvt){
482 fHistPosBestPrimaryVtxYForSelEvt = new TH1F( "fHistPosBestPrimaryVtxYForSelEvt" , "Best Prim. Vertex Position in y; y (cm); Events" , 200, -0.5, 0.5 );
483 fListHistCascade->Add(fHistPosBestPrimaryVtxYForSelEvt);
486 if(! fHistPosBestPrimaryVtxZForSelEvt ){
487 fHistPosBestPrimaryVtxZForSelEvt = new TH1F( "fHistPosBestPrimaryVtxZForSelEvt" , "Best Prim. Vertex Position in z; z (cm); Events" , 100, -15.0, 15.0 );
488 fListHistCascade->Add(fHistPosBestPrimaryVtxZForSelEvt);
494 // - Histos for events containing at least ONE CASCADE
497 if(! fHistTPCrefitTrackMultiplicityForCascadeEvt) {
498 if(fCollidingSystems)// AA collisions
499 fHistTPCrefitTrackMultiplicityForCascadeEvt = new TH1F("fHistTPCrefitTrackMultiplicityForCascadeEvt",
500 "TPCrefit track Multiplicity (for evt with Casc.);Nbr of TPCrefit tracks/Evt with cascade(s);Events",
502 else // pp collisions
503 fHistTPCrefitTrackMultiplicityForCascadeEvt = new TH1F("fHistTPCrefitTrackMultiplicityForCascadeEvt",
504 "TPCrefit track Multiplicity (for evt with Casc.);Nbr of TPCrefit tracks/Evt with cascade(s);Events",
506 fListHistCascade->Add(fHistTPCrefitTrackMultiplicityForCascadeEvt);
509 if(! fHistPosV0TPCClusters ){
510 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);
511 fListHistCascade->Add(fHistPosV0TPCClusters);
514 if(! fHistNegV0TPCClusters ){
515 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);
516 fListHistCascade->Add(fHistNegV0TPCClusters);
519 if(! fHistBachTPCClusters ){
520 fHistBachTPCClusters = new TH1F("fHistBachTPCClusters", "TPC clusters for Bachelor track; Nbr of TPC clusters (Bach); Track counts", 165, 0.0 ,165.0);
521 fListHistCascade->Add(fHistBachTPCClusters);
530 if(! fHistVtxStatus ){
531 fHistVtxStatus = new TH1F( "fHistVtxStatus" , "Does a Trckg Prim.vtx exist ?; true=1 or false=0; Nb of Events" , 4, -1.0, 3.0 );
532 fListHistCascade->Add(fHistVtxStatus);
536 // - Vertex Positions
538 if(! fHistPosTrkgPrimaryVtxXForCascadeEvt ){
539 fHistPosTrkgPrimaryVtxXForCascadeEvt = new TH1F( "fHistPosTrkgPrimaryVtxXForCascadeEvt" , "Trkg Prim. Vertex Position in x; x (cm); Events" , 200, -0.5, 0.5 );
540 fListHistCascade->Add(fHistPosTrkgPrimaryVtxXForCascadeEvt);
544 if(! fHistPosTrkgPrimaryVtxYForCascadeEvt){
545 fHistPosTrkgPrimaryVtxYForCascadeEvt = new TH1F( "fHistPosTrkgPrimaryVtxYForCascadeEvt" , "Trkg Prim. Vertex Position in y; y (cm); Events" , 200, -0.5, 0.5 );
546 fListHistCascade->Add(fHistPosTrkgPrimaryVtxYForCascadeEvt);
549 if(! fHistPosTrkgPrimaryVtxZForCascadeEvt ){
550 fHistPosTrkgPrimaryVtxZForCascadeEvt = new TH1F( "fHistPosTrkgPrimaryVtxZForCascadeEvt" , "Trkg Prim. Vertex Position in z; z (cm); Events" , 100, -15.0, 15.0 );
551 fListHistCascade->Add(fHistPosTrkgPrimaryVtxZForCascadeEvt);
554 if(! fHistTrkgPrimaryVtxRadius ){
555 fHistTrkgPrimaryVtxRadius = new TH1F( "fHistTrkgPrimaryVtxRadius", "Trkg Prim. Vertex radius; r (cm); Events" , 150, 0., 15.0 );
556 fListHistCascade->Add(fHistTrkgPrimaryVtxRadius);
562 if(! fHistPosBestPrimaryVtxXForCascadeEvt ){
563 fHistPosBestPrimaryVtxXForCascadeEvt = new TH1F( "fHistPosBestPrimaryVtxXForCascadeEvt" , "Best Prim. Vertex Position in x; x (cm); Events" , 200, -0.5, 0.5 );
564 fListHistCascade->Add(fHistPosBestPrimaryVtxXForCascadeEvt);
567 if(! fHistPosBestPrimaryVtxYForCascadeEvt){
568 fHistPosBestPrimaryVtxYForCascadeEvt = new TH1F( "fHistPosBestPrimaryVtxYForCascadeEvt" , "Best Prim. Vertex Position in y; y (cm); Events" , 200, -0.5, 0.5 );
569 fListHistCascade->Add(fHistPosBestPrimaryVtxYForCascadeEvt);
572 if(! fHistPosBestPrimaryVtxZForCascadeEvt ){
573 fHistPosBestPrimaryVtxZForCascadeEvt = new TH1F( "fHistPosBestPrimaryVtxZForCascadeEvt" , "Best Prim. Vertex Position in z; z (cm); Events" , 100, -15.0, 15.0 );
574 fListHistCascade->Add(fHistPosBestPrimaryVtxZForCascadeEvt);
577 if(! fHistBestPrimaryVtxRadius ){
578 fHistBestPrimaryVtxRadius = new TH1F( "fHistBestPrimaryVtxRadius", "Best Prim. vertex radius; r (cm); Events" , 150, 0., 15.0 );
579 fListHistCascade->Add(fHistBestPrimaryVtxRadius);
582 if(! f2dHistTrkgPrimVtxVsBestPrimVtx) {
583 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.);
584 fListHistCascade->Add(f2dHistTrkgPrimVtxVsBestPrimVtx);
590 // - Typical histos for cascades
593 if(! fHistEffMassXi) {
594 fHistEffMassXi = new TH1F("fHistEffMassXi", "Cascade candidates ; Invariant Mass (GeV/c^{2}) ; Counts", 400, 1.2, 2.0);
595 fListHistCascade->Add(fHistEffMassXi);
599 fHistChi2Xi = new TH1F("fHistChi2Xi", "Cascade #chi^{2}; #chi^{2}; Number of Cascades", 160, 0, 40);
600 fListHistCascade->Add(fHistChi2Xi);
603 if(! fHistDcaXiDaughters ){
604 fHistDcaXiDaughters = new TH1F( "fHistDcaXiDaughters", "DCA between Xi Daughters; DCA (cm) ; Number of Cascades", 100, 0., 0.5);
605 fListHistCascade->Add(fHistDcaXiDaughters);
608 if(! fHistDcaBachToPrimVertex) {
609 fHistDcaBachToPrimVertex = new TH1F("fHistDcaBachToPrimVertex", "DCA of Bach. to Prim. Vertex;DCA (cm);Number of Cascades", 250, 0., 0.25);
610 fListHistCascade->Add(fHistDcaBachToPrimVertex);
613 if(! fHistXiCosineOfPointingAngle) {
614 fHistXiCosineOfPointingAngle = new TH1F("fHistXiCosineOfPointingAngle", "Cosine of Xi Pointing Angle; Cos (Xi Point.Angl);Number of Xis", 200, 0.99, 1.0);
615 fListHistCascade->Add(fHistXiCosineOfPointingAngle);
618 if(! fHistXiRadius ){
619 fHistXiRadius = new TH1F( "fHistXiRadius", "Casc. decay transv. radius; r (cm); Counts" , 1050, 0., 105.0 );
620 fListHistCascade->Add(fHistXiRadius);
624 // - Histos about ~ the "V0 part" of the cascade, coming by inheritance from AliESDv0
628 if (! fHistMassLambdaAsCascDghter) {
629 fHistMassLambdaAsCascDghter = new TH1F("fHistMassLambdaAsCascDghter","#Lambda associated to Casc. candidates;Eff. Mass (GeV/c^{2});Counts", 300,1.00,1.3);
630 fListHistCascade->Add(fHistMassLambdaAsCascDghter);
633 if (! fHistV0Chi2Xi) {
634 fHistV0Chi2Xi = new TH1F("fHistV0Chi2Xi", "V0 #chi^{2}, in cascade; #chi^{2};Counts", 160, 0, 40);
635 fListHistCascade->Add(fHistV0Chi2Xi);
638 if (! fHistDcaV0DaughtersXi) {
639 fHistDcaV0DaughtersXi = new TH1F("fHistDcaV0DaughtersXi", "DCA between V0 daughters, in cascade;DCA (cm);Number of V0s", 120, 0., 0.6);
640 fListHistCascade->Add(fHistDcaV0DaughtersXi);
643 if (! fHistDcaV0ToPrimVertexXi) {
644 fHistDcaV0ToPrimVertexXi = new TH1F("fHistDcaV0ToPrimVertexXi", "DCA of V0 to Prim. Vertex, in cascade;DCA (cm);Number of Cascades", 200, 0., 1.);
645 fListHistCascade->Add(fHistDcaV0ToPrimVertexXi);
648 if (! fHistV0CosineOfPointingAngleXi) {
649 fHistV0CosineOfPointingAngleXi = new TH1F("fHistV0CosineOfPointingAngleXi", "Cosine of V0 Pointing Angle, in cascade;Cos(V0 Point. Angl); Counts", 200, 0.98, 1.0);
650 fListHistCascade->Add(fHistV0CosineOfPointingAngleXi);
653 if (! fHistV0RadiusXi) {
654 fHistV0RadiusXi = new TH1F("fHistV0RadiusXi", "V0 decay radius, in cascade; radius (cm); Counts", 1050, 0., 105.0);
655 fListHistCascade->Add(fHistV0RadiusXi);
658 if (! fHistDcaPosToPrimVertexXi) {
659 fHistDcaPosToPrimVertexXi = new TH1F("fHistDcaPosToPrimVertexXi", "DCA of V0 pos daughter to Prim. Vertex;DCA (cm);Counts", 300, 0, 3);
660 fListHistCascade->Add(fHistDcaPosToPrimVertexXi);
663 if (! fHistDcaNegToPrimVertexXi) {
664 fHistDcaNegToPrimVertexXi = new TH1F("fHistDcaNegToPrimVertexXi", "DCA of V0 neg daughter to Prim. Vertex;DCA (cm);Counts", 300, 0, 3);
665 fListHistCascade->Add(fHistDcaNegToPrimVertexXi);
671 // - Effective mass histos for cascades.
673 if (! fHistMassXiMinus) {
674 fHistMassXiMinus = new TH1F("fHistMassXiMinus","#Xi^{-} candidates;M( #Lambda , #pi^{-} ) (GeV/c^{2});Counts", 400,1.2,2.0);
675 fListHistCascade->Add(fHistMassXiMinus);
678 if (! fHistMassXiPlus) {
679 fHistMassXiPlus = new TH1F("fHistMassXiPlus","#Xi^{+} candidates;M( #bar{#Lambda}^{0} , #pi^{+} ) (GeV/c^{2});Counts",400,1.2,2.0);
680 fListHistCascade->Add(fHistMassXiPlus);
683 if (! fHistMassOmegaMinus) {
684 fHistMassOmegaMinus = new TH1F("fHistMassOmegaMinus","#Omega^{-} candidates;M( #Lambda , K^{-} ) (GeV/c^{2});Counts", 500,1.5,2.5);
685 fListHistCascade->Add(fHistMassOmegaMinus);
688 if (! fHistMassOmegaPlus) {
689 fHistMassOmegaPlus = new TH1F("fHistMassOmegaPlus","#Omega^{+} candidates;M( #bar{#Lambda}^{0} , K^{+} ) (GeV/c^{2});Counts", 500,1.5,2.5);
690 fListHistCascade->Add(fHistMassOmegaPlus);
693 // By cascade hyp + bachelor PID
694 if (! fHistMassWithCombPIDXiMinus) {
695 fHistMassWithCombPIDXiMinus = new TH1F("fHistMassWithCombPIDXiMinus","#Xi^{-} candidates, with Bach. comb. PID;M( #Lambda , #pi^{-} ) (GeV/c^{2});Counts", 400,1.2,2.0);
696 fListHistCascade->Add(fHistMassWithCombPIDXiMinus);
699 if (! fHistMassWithCombPIDXiPlus) {
700 fHistMassWithCombPIDXiPlus = new TH1F("fHistMassWithCombPIDXiPlus","#Xi^{+} candidates, with Bach. comb. PID;M( #bar{#Lambda}^{0} , #pi^{+} ) (GeV/c^{2});Counts",400,1.2,2.0);
701 fListHistCascade->Add(fHistMassWithCombPIDXiPlus);
704 if (! fHistMassWithCombPIDOmegaMinus) {
705 fHistMassWithCombPIDOmegaMinus = new TH1F("fHistMassWithCombPIDOmegaMinus","#Omega^{-} candidates, with Bach. comb. PID;M( #Lambda , K^{-} ) (GeV/c^{2});Counts", 500,1.5,2.5);
706 fListHistCascade->Add(fHistMassWithCombPIDOmegaMinus);
709 if (! fHistMassWithCombPIDOmegaPlus) {
710 fHistMassWithCombPIDOmegaPlus = new TH1F("fHistMassWithCombPIDOmegaPlus","#Omega^{+} candidates, with Bach. comb. PID;M( #bar{#Lambda}^{0} , K^{+} ) (GeV/c^{2});Counts", 500,1.5,2.5);
711 fListHistCascade->Add(fHistMassWithCombPIDOmegaPlus);
716 // - Complements for QA
718 if(! fHistXiTransvMom ){
719 fHistXiTransvMom = new TH1F( "fHistXiTransvMom" , "#Xi transverse momentum (cand. around the mass peak) ; p_{t}(#Xi) (GeV/c); Counts", 100, 0.0, 10.0);
720 fListHistCascade->Add(fHistXiTransvMom);
723 if(! fHistXiTotMom ){
724 fHistXiTotMom = new TH1F( "fHistXiTotMom" , "#Xi momentum norm (cand. around the mass peak); p_{tot}(#Xi) (GeV/c); Counts", 150, 0.0, 15.0);
725 fListHistCascade->Add(fHistXiTotMom);
729 if(! fHistBachTransvMomXi ){
730 fHistBachTransvMomXi = new TH1F( "fHistBachTransvMomXi" , "#Xi Bach. transverse momentum (cand. around the mass peak) ; p_{t}(Bach.) (GeV/c); Counts", 100, 0.0, 5.0);
731 fListHistCascade->Add(fHistBachTransvMomXi);
734 if(! fHistBachTotMomXi ){
735 fHistBachTotMomXi = new TH1F( "fHistBachTotMomXi" , "#Xi Bach. momentum norm (cand. around the mass peak); p_{tot}(Bach.) (GeV/c); Counts", 100, 0.0, 5.0);
736 fListHistCascade->Add(fHistBachTotMomXi);
740 if(! fHistChargeXi ){
741 fHistChargeXi = new TH1F( "fHistChargeXi" , "Charge of casc. candidates ; Sign ; Counts", 5, -2.0, 3.0);
742 fListHistCascade->Add(fHistChargeXi);
746 if (! fHistV0toXiCosineOfPointingAngle) {
747 fHistV0toXiCosineOfPointingAngle = new TH1F("fHistV0toXiCosineOfPointingAngle", "Cos. of V0 Ptng Angl / Xi vtx ;Cos(V0 Point. Angl / Xi vtx); Counts", 100, 0.99, 1.0);
748 fListHistCascade->Add(fHistV0toXiCosineOfPointingAngle);
753 fHistRapXi = new TH1F( "fHistRapXi" , "Rapidity of #Xi candidates (around the mass peak); y ; Counts", 200, -5.0, 5.0);
754 fListHistCascade->Add(fHistRapXi);
757 if(! fHistRapOmega ){
758 fHistRapOmega = new TH1F( "fHistRapOmega" , "Rapidity of #Omega candidates (around the mass peak); y ; Counts", 200, -5.0, 5.0);
759 fListHistCascade->Add(fHistRapOmega);
763 fHistEtaXi = new TH1F( "fHistEtaXi" , "Pseudo-rap. of #Xi candidates (around the mass peak) ; #eta ; Counts", 120, -3.0, 3.0);
764 fListHistCascade->Add(fHistEtaXi);
768 fHistThetaXi = new TH1F( "fHistThetaXi" , "#theta of #Xi candidates (around the mass peak); #theta (deg) ; Counts", 180, 0., 180.0);
769 fListHistCascade->Add(fHistThetaXi);
773 fHistPhiXi = new TH1F( "fHistPhiXi" , "#phi of #Xi candidates (around the mass peak); #phi (deg) ; Counts", 360, 0., 360.);
774 fListHistCascade->Add(fHistPhiXi);
778 if(! f2dHistArmenteros) {
779 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);
780 fListHistCascade->Add(f2dHistArmenteros);
785 if(! f2dHistEffMassLambdaVsEffMassXiMinus) {
786 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);
787 fListHistCascade->Add(f2dHistEffMassLambdaVsEffMassXiMinus);
790 if(! f2dHistEffMassXiVsEffMassOmegaMinus) {
791 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);
792 fListHistCascade->Add(f2dHistEffMassXiVsEffMassOmegaMinus);
795 if(! f2dHistEffMassLambdaVsEffMassXiPlus) {
796 f2dHistEffMassLambdaVsEffMassXiPlus = new TH2F( "f2dHistEffMassLambdaVsEffMassXiPlus", "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);
797 fListHistCascade->Add(f2dHistEffMassLambdaVsEffMassXiPlus);
800 if(! f2dHistEffMassXiVsEffMassOmegaPlus) {
801 f2dHistEffMassXiVsEffMassOmegaPlus = new TH2F( "f2dHistEffMassXiVsEffMassOmegaPlus", "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);
802 fListHistCascade->Add(f2dHistEffMassXiVsEffMassOmegaPlus);
807 if(! f2dHistXiRadiusVsEffMassXiMinus) {
808 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);
809 fListHistCascade->Add(f2dHistXiRadiusVsEffMassXiMinus);
812 if(! f2dHistXiRadiusVsEffMassXiPlus) {
813 f2dHistXiRadiusVsEffMassXiPlus = new TH2F( "f2dHistXiRadiusVsEffMassXiPlus", "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);
814 fListHistCascade->Add(f2dHistXiRadiusVsEffMassXiPlus);
817 if(! f2dHistXiRadiusVsEffMassOmegaMinus) {
818 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);
819 fListHistCascade->Add(f2dHistXiRadiusVsEffMassOmegaMinus);
822 if(! f2dHistXiRadiusVsEffMassOmegaPlus) {
823 f2dHistXiRadiusVsEffMassOmegaPlus = new TH2F( "f2dHistXiRadiusVsEffMassOmegaPlus", "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);
824 fListHistCascade->Add(f2dHistXiRadiusVsEffMassOmegaPlus);
828 // Part 2 : Raw material for yield extraction -------
830 if(! f3dHistXiPtVsEffMassVsYXiMinus) {
831 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, 48, -1.2,1.2);
832 fListHistCascade->Add(f3dHistXiPtVsEffMassVsYXiMinus);
835 if(! f3dHistXiPtVsEffMassVsYXiPlus) {
836 f3dHistXiPtVsEffMassVsYXiPlus = new TH3F( "f3dHistXiPtVsEffMassVsYXiPlus", "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, 48, -1.2,1.2);
837 fListHistCascade->Add(f3dHistXiPtVsEffMassVsYXiPlus);
840 if(! f3dHistXiPtVsEffMassVsYOmegaMinus) {
841 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, 48, -1.2,1.2);
842 fListHistCascade->Add(f3dHistXiPtVsEffMassVsYOmegaMinus);
845 if(! f3dHistXiPtVsEffMassVsYOmegaPlus) {
846 f3dHistXiPtVsEffMassVsYOmegaPlus = new TH3F( "f3dHistXiPtVsEffMassVsYOmegaPlus", "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, 48, -1.2,1.2);
847 fListHistCascade->Add(f3dHistXiPtVsEffMassVsYOmegaPlus);
851 if(! f3dHistXiPtVsEffMassVsYWithCombPIDXiMinus) {
852 f3dHistXiPtVsEffMassVsYWithCombPIDXiMinus = new TH3F( "f3dHistXiPtVsEffMassVsYWithCombPIDXiMinus", "Pt_{cascade} Vs M_{#Xi^{-} candidates, with PID} Vs Y_{#Xi}; Pt_{cascade} (GeV/c); M( #Lambda , #pi^{-} ) (GeV/c^{2}) ;Y_{#Xi} ", 100, 0., 10.0, 400, 1.2, 2.0, 48, -1.2,1.2);
853 fListHistCascade->Add(f3dHistXiPtVsEffMassVsYWithCombPIDXiMinus);
856 if(! f3dHistXiPtVsEffMassVsYWithCombPIDXiPlus) {
857 f3dHistXiPtVsEffMassVsYWithCombPIDXiPlus = new TH3F( "f3dHistXiPtVsEffMassVsYWithCombPIDXiPlus", "Pt_{cascade} Vs M_{#Xi^{+} candidates, with PID} Vs Y_{#Xi}; Pt_{cascade} (GeV/c); M( #Lambda , #pi^{+} ) (GeV/c^{2}); Y_{#Xi}", 100, 0., 10.0, 400, 1.2, 2.0, 48, -1.2,1.2);
858 fListHistCascade->Add(f3dHistXiPtVsEffMassVsYWithCombPIDXiPlus);
861 if(! f3dHistXiPtVsEffMassVsYWithCombPIDOmegaMinus) {
862 f3dHistXiPtVsEffMassVsYWithCombPIDOmegaMinus = new TH3F( "f3dHistXiPtVsEffMassVsYWithCombPIDOmegaMinus", "Pt_{cascade} Vs M_{#Omega^{-} candidates, with PID} Vs Y_{#Omega}; Pt_{cascade} (GeV/c); M( #Lambda , K^{-} ) (GeV/c^{2}); Y_{#Omega}", 100, 0., 10.0, 500, 1.5, 2.5, 48, -1.2,1.2);
863 fListHistCascade->Add(f3dHistXiPtVsEffMassVsYWithCombPIDOmegaMinus);
866 if(! f3dHistXiPtVsEffMassVsYWithCombPIDOmegaPlus) {
867 f3dHistXiPtVsEffMassVsYWithCombPIDOmegaPlus = new TH3F( "f3dHistXiPtVsEffMassVsYWithCombPIDOmegaPlus", "Pt_{cascade} Vs M_{#Omega^{+} candidates, with PID} Vs Y_{#Omega}; Pt_{cascade} (GeV/c); M( #Lambda , K^{+} ) (GeV/c^{2}); Y_{#Omega}", 100, 0., 10.0, 500, 1.5, 2.5, 48, -1.2,1.2);
868 fListHistCascade->Add(f3dHistXiPtVsEffMassVsYWithCombPIDOmegaPlus);
872 if(! f3dHistXiPtVsEffMassVsYWith2CombPIDOmegaMinus) {
873 f3dHistXiPtVsEffMassVsYWith2CombPIDOmegaMinus = new TH3F( "f3dHistXiPtVsEffMassVsYWith2CombPIDOmegaMinus", "Pt_{cascade} Vs M_{#Omega^{-} candidates, with 2 PID} Vs Y_{#Omega}; Pt_{cascade} (GeV/c); M( #Lambda , K^{-} ) (GeV/c^{2}); Y_{#Omega}", 100, 0., 10.0, 500, 1.5, 2.5, 48, -1.2,1.2);
874 fListHistCascade->Add(f3dHistXiPtVsEffMassVsYWith2CombPIDOmegaMinus);
877 if(! f3dHistXiPtVsEffMassVsYWith2CombPIDOmegaPlus) {
878 f3dHistXiPtVsEffMassVsYWith2CombPIDOmegaPlus = new TH3F( "f3dHistXiPtVsEffMassVsYWith2CombPIDOmegaPlus", "Pt_{cascade} Vs M_{#Omega^{+} candidates, with 2 PID} Vs Y_{#Omega}; Pt_{cascade} (GeV/c); M( #Lambda , K^{+} ) (GeV/c^{2}); Y_{#Omega}", 100, 0., 10.0, 500, 1.5, 2.5, 48, -1.2,1.2);
879 fListHistCascade->Add(f3dHistXiPtVsEffMassVsYWith2CombPIDOmegaPlus);
886 if(! f3dHistXiPtVsEffMassVsYWithTpcPIDOmegaMinus) {
887 f3dHistXiPtVsEffMassVsYWithTpcPIDOmegaMinus = new TH3F( "f3dHistXiPtVsEffMassVsYWithTpcPIDOmegaMinus", "Pt_{cascade} Vs M_{#Omega^{-} candidates, with TPC PID} Vs Y_{#Omega}; Pt_{cascade} (GeV/c); M( #Lambda , K^{-} ) (GeV/c^{2}); Y_{#Omega}", 100, 0., 10.0, 500, 1.5, 2.5, 48, -1.2,1.2);
888 fListHistCascade->Add(f3dHistXiPtVsEffMassVsYWithTpcPIDOmegaMinus);
893 if(! fCFContCascadePIDXiMinus) {
894 const Int_t lNbSteps = 7 ;
895 const Int_t lNbVariables = 4 ;
897 //array for the number of bins in each dimension :
898 Int_t lNbBinsPerVar[4];
899 lNbBinsPerVar[0] = 100;
900 lNbBinsPerVar[1] = 400;
901 lNbBinsPerVar[2] = 48;
902 lNbBinsPerVar[3] = 250;
905 fCFContCascadePIDXiMinus = new AliCFContainer("fCFContCascadePIDXiMinus","Pt_{cascade} Vs M_{#Xi^{-} candidates} Vs Y_{#Xi}", lNbSteps, lNbVariables, lNbBinsPerVar );
907 //setting the bin limits (valid for v4-18-10-AN)
908 fCFContCascadePIDXiMinus->SetBinLimits(0, 0.0 , 10.0 ); // Pt(Cascade)
909 fCFContCascadePIDXiMinus->SetBinLimits(1, 1.2 , 2.0 ); // Xi Effective mass
910 fCFContCascadePIDXiMinus->SetBinLimits(2, -1.2 , 1.2 ); // Rapidity
911 if(fCollidingSystems)
912 fCFContCascadePIDXiMinus->SetBinLimits(3, 0.0, 20000.0 ); // TPCrefitTrackMultiplicity
914 fCFContCascadePIDXiMinus->SetBinLimits(3, 0.0, 250.0 ); // TPCrefitTrackMultiplicity
916 // Setting the step title : one per PID case
917 fCFContCascadePIDXiMinus->SetStepTitle(0, "No PID");
918 fCFContCascadePIDXiMinus->SetStepTitle(1, "TPC PID / 3-#sigma cut on Bachelor track");
919 fCFContCascadePIDXiMinus->SetStepTitle(2, "TPC PID / 3-#sigma cut on Bachelor+Baryon tracks");
920 fCFContCascadePIDXiMinus->SetStepTitle(3, "TPC PID / 3-#sigma cut on Bachelor+Baryon+Meson tracks");
921 fCFContCascadePIDXiMinus->SetStepTitle(4, "Comb. PID / Bachelor");
922 fCFContCascadePIDXiMinus->SetStepTitle(5, "Comb. PID / Bachelor+Baryon");
923 fCFContCascadePIDXiMinus->SetStepTitle(6, "Comb. PID / Bachelor+Baryon+Meson");
925 // Setting the variable title, per axis
926 fCFContCascadePIDXiMinus->SetVarTitle(0, "Pt_{cascade} (GeV/c)");
927 fCFContCascadePIDXiMinus->SetVarTitle(1, "M( #Lambda , #pi^{-} ) (GeV/c^{2})");
928 fCFContCascadePIDXiMinus->SetVarTitle(2, "Y_{#Xi}");
929 fCFContCascadePIDXiMinus->SetVarTitle(3, "TPCrefit track Multiplicity");
931 fListHistCascade->Add(fCFContCascadePIDXiMinus);
935 if(! fCFContCascadePIDXiPlus) {
936 const Int_t lNbSteps = 7 ;
937 const Int_t lNbVariables = 4 ;
939 //array for the number of bins in each dimension :
940 Int_t lNbBinsPerVar[4];
941 lNbBinsPerVar[0] = 100;
942 lNbBinsPerVar[1] = 400;
943 lNbBinsPerVar[2] = 48;
944 lNbBinsPerVar[3] = 250;
947 fCFContCascadePIDXiPlus = new AliCFContainer("fCFContCascadePIDXiPlus","Pt_{cascade} Vs M_{#Xi^{+} candidates} Vs Y_{#Xi}", lNbSteps, lNbVariables, lNbBinsPerVar );
950 //setting the bin limits (valid for v4-18-10-AN)
951 fCFContCascadePIDXiPlus->SetBinLimits(0, 0.0 , 10.0 ); // Pt(Cascade)
952 fCFContCascadePIDXiPlus->SetBinLimits(1, 1.2 , 2.0 ); // Xi Effective mass
953 fCFContCascadePIDXiPlus->SetBinLimits(2, -1.2 , 1.2 ); // Rapidity
954 if(fCollidingSystems)
955 fCFContCascadePIDXiPlus->SetBinLimits(3, 0.0, 20000.0 ); // TPCrefitTrackMultiplicity
957 fCFContCascadePIDXiPlus->SetBinLimits(3, 0.0, 250.0 ); // TPCrefitTrackMultiplicity
959 // Setting the step title : one per PID case
960 fCFContCascadePIDXiPlus->SetStepTitle(0, "No PID");
961 fCFContCascadePIDXiPlus->SetStepTitle(1, "TPC PID / 3-#sigma cut on Bachelor track");
962 fCFContCascadePIDXiPlus->SetStepTitle(2, "TPC PID / 3-#sigma cut on Bachelor+Baryon tracks");
963 fCFContCascadePIDXiPlus->SetStepTitle(3, "TPC PID / 3-#sigma cut on Bachelor+Baryon+Meson tracks");
964 fCFContCascadePIDXiPlus->SetStepTitle(4, "Comb. PID / Bachelor");
965 fCFContCascadePIDXiPlus->SetStepTitle(5, "Comb. PID / Bachelor+Baryon");
966 fCFContCascadePIDXiPlus->SetStepTitle(6, "Comb. PID / Bachelor+Baryon+Meson");
968 // Setting the variable title, per axis
969 fCFContCascadePIDXiPlus->SetVarTitle(0, "Pt_{cascade} (GeV/c)");
970 fCFContCascadePIDXiPlus->SetVarTitle(1, "M( #Lambda , #pi^{+} ) (GeV/c^{2})");
971 fCFContCascadePIDXiPlus->SetVarTitle(2, "Y_{#Xi}");
972 fCFContCascadePIDXiPlus->SetVarTitle(3, "TPCrefit track Multiplicity");
974 fListHistCascade->Add(fCFContCascadePIDXiPlus);
979 if(! fCFContCascadePIDOmegaMinus) {
980 const Int_t lNbSteps = 7 ;
981 const Int_t lNbVariables = 4 ;
983 //array for the number of bins in each dimension :
984 Int_t lNbBinsPerVar[4];
985 lNbBinsPerVar[0] = 100;
986 lNbBinsPerVar[1] = 500;
987 lNbBinsPerVar[2] = 48;
988 lNbBinsPerVar[3] = 250;
991 fCFContCascadePIDOmegaMinus = new AliCFContainer("fCFContCascadePIDOmegaMinus","Pt_{cascade} Vs M_{#Omega^{-} candidates} Vs Y_{#Omega}", lNbSteps, lNbVariables, lNbBinsPerVar );
994 //setting the bin limits (valid for v4-18-10-AN)
995 fCFContCascadePIDOmegaMinus->SetBinLimits(0, 0.0 , 10.0 ); // Pt(Cascade)
996 fCFContCascadePIDOmegaMinus->SetBinLimits(1, 1.5 , 2.5 ); // Omega Effective mass
997 fCFContCascadePIDOmegaMinus->SetBinLimits(2, -1.2 , 1.2 ); // Rapidity
998 if(fCollidingSystems)
999 fCFContCascadePIDOmegaMinus->SetBinLimits(3, 0.0, 20000.0 ); // TPCrefitTrackMultiplicity
1001 fCFContCascadePIDOmegaMinus->SetBinLimits(3, 0.0, 250.0 ); // TPCrefitTrackMultiplicity
1003 // Setting the step title : one per PID case
1004 fCFContCascadePIDOmegaMinus->SetStepTitle(0, "No PID");
1005 fCFContCascadePIDOmegaMinus->SetStepTitle(1, "TPC PID / 3-#sigma cut on Bachelor track");
1006 fCFContCascadePIDOmegaMinus->SetStepTitle(2, "TPC PID / 3-#sigma cut on Bachelor+Baryon tracks");
1007 fCFContCascadePIDOmegaMinus->SetStepTitle(3, "TPC PID / 3-#sigma cut on Bachelor+Baryon+Meson tracks");
1008 fCFContCascadePIDOmegaMinus->SetStepTitle(4, "Comb. PID / Bachelor");
1009 fCFContCascadePIDOmegaMinus->SetStepTitle(5, "Comb. PID / Bachelor+Baryon");
1010 fCFContCascadePIDOmegaMinus->SetStepTitle(6, "Comb. PID / Bachelor+Baryon+Meson");
1012 // Setting the variable title, per axis
1013 fCFContCascadePIDOmegaMinus->SetVarTitle(0, "Pt_{cascade} (GeV/c)");
1014 fCFContCascadePIDOmegaMinus->SetVarTitle(1, "M( #Lambda , K^{-} ) (GeV/c^{2})");
1015 fCFContCascadePIDOmegaMinus->SetVarTitle(2, "Y_{#Omega}");
1016 fCFContCascadePIDOmegaMinus->SetVarTitle(3, "TPCrefit track Multiplicity");
1018 fListHistCascade->Add(fCFContCascadePIDOmegaMinus);
1022 if(! fCFContCascadePIDOmegaPlus) {
1023 const Int_t lNbSteps = 7 ;
1024 const Int_t lNbVariables = 4 ;
1026 //array for the number of bins in each dimension :
1027 Int_t lNbBinsPerVar[4];
1028 lNbBinsPerVar[0] = 100;
1029 lNbBinsPerVar[1] = 500;
1030 lNbBinsPerVar[2] = 48;
1031 lNbBinsPerVar[3] = 250;
1034 fCFContCascadePIDOmegaPlus = new AliCFContainer("fCFContCascadePIDOmegaPlus","Pt_{cascade} Vs M_{#Omega^{+} candidates} Vs Y_{#Omega}", lNbSteps, lNbVariables, lNbBinsPerVar );
1037 //setting the bin limits (valid for v4-18-10-AN)
1038 fCFContCascadePIDOmegaPlus->SetBinLimits(0, 0.0 , 10.0 ); // Pt(Cascade)
1039 fCFContCascadePIDOmegaPlus->SetBinLimits(1, 1.5 , 2.5 ); // Omega Effective mass
1040 fCFContCascadePIDOmegaPlus->SetBinLimits(2, -1.2 , 1.2 ); // Rapidity
1041 if(fCollidingSystems)
1042 fCFContCascadePIDOmegaPlus->SetBinLimits(3, 0.0, 20000.0 ); // TPCrefitTrackMultiplicity
1044 fCFContCascadePIDOmegaPlus->SetBinLimits(3, 0.0, 250.0 ); // TPCrefitTrackMultiplicity
1046 // Setting the step title : one per PID case
1047 fCFContCascadePIDOmegaPlus->SetStepTitle(0, "No PID");
1048 fCFContCascadePIDOmegaPlus->SetStepTitle(1, "TPC PID / 3-#sigma cut on Bachelor track");
1049 fCFContCascadePIDOmegaPlus->SetStepTitle(2, "TPC PID / 3-#sigma cut on Bachelor+Baryon tracks");
1050 fCFContCascadePIDOmegaPlus->SetStepTitle(3, "TPC PID / 3-#sigma cut on Bachelor+Baryon+Meson tracks");
1051 fCFContCascadePIDOmegaPlus->SetStepTitle(4, "Comb. PID / Bachelor");
1052 fCFContCascadePIDOmegaPlus->SetStepTitle(5, "Comb. PID / Bachelor+Baryon");
1053 fCFContCascadePIDOmegaPlus->SetStepTitle(6, "Comb. PID / Bachelor+Baryon+Meson");
1055 // Setting the variable title, per axis
1056 fCFContCascadePIDOmegaPlus->SetVarTitle(0, "Pt_{cascade} (GeV/c)");
1057 fCFContCascadePIDOmegaPlus->SetVarTitle(1, "M( #Lambda , K^{+} ) (GeV/c^{2})");
1058 fCFContCascadePIDOmegaPlus->SetVarTitle(2, "Y_{#Omega}");
1059 fCFContCascadePIDOmegaPlus->SetVarTitle(3, "TPCrefit track Multiplicity");
1061 fListHistCascade->Add(fCFContCascadePIDOmegaPlus);
1069 // Part 3 : Towards the optimisation of topological selections -------
1070 if(! fCFContCascadeCuts){
1072 // Container meant to store all the relevant distributions corresponding to the cut variables.
1073 // So far, 20 variables have been identified.
1074 // The following will be done in quite a brut force way ...
1075 // FIXME Improvement expected later (before Pb-Pb data at least)
1076 // - Define a user binning to have less bins in each dimension
1077 // - boolean for enabling/disbaling this CFContainer
1078 const Int_t lNbSteps = 4 ;
1079 const Int_t lNbVariables = 20 ;
1081 //array for the number of bins in each dimension :
1082 Int_t lNbBinsPerVar[20];
1083 lNbBinsPerVar[0] = 25;
1084 lNbBinsPerVar[1] = 25;
1085 lNbBinsPerVar[2] = 20;
1086 lNbBinsPerVar[3] = 40;
1087 lNbBinsPerVar[4] = 50;
1088 lNbBinsPerVar[5] = 12;
1090 lNbBinsPerVar[6] = 20;
1091 lNbBinsPerVar[7] = 40;
1092 lNbBinsPerVar[8] = 40;
1093 lNbBinsPerVar[9] = 25;
1094 lNbBinsPerVar[10] = 25;
1096 lNbBinsPerVar[11] = 100; // 2-MeV/c2 bins
1097 lNbBinsPerVar[12] = 100; // 2-MeV/c2 bins
1099 lNbBinsPerVar[13] = 20;
1101 lNbBinsPerVar[14] = 44; // 0.05 in rapidity units
1102 lNbBinsPerVar[15] = 44; // 0.05 in rapidity units
1104 lNbBinsPerVar[16] = 20;
1106 lNbBinsPerVar[17] = 50;
1107 lNbBinsPerVar[18] = 50;
1108 lNbBinsPerVar[19] = 35;
1110 fCFContCascadeCuts = new AliCFContainer("fCFContCascadeCuts","Container for Cascade cuts", lNbSteps, lNbVariables, lNbBinsPerVar );
1113 //setting the bin limits (valid for v4-18-10-AN on)
1114 fCFContCascadeCuts->SetBinLimits(0, 0.0 , 0.25 ); // DcaXiDaughters
1115 fCFContCascadeCuts->SetBinLimits(1, 0.0 , 0.25 ); // DcaBachToPrimVertexXi
1116 fCFContCascadeCuts->SetBinLimits(2, 0.995, 1.0 ); // XiCosineOfPointingAngle
1117 fCFContCascadeCuts->SetBinLimits(3, 0.0 , 4.0 ); // XiRadius
1118 fCFContCascadeCuts->SetBinLimits(4, 1.1 , 1.15 ); // InvMassLambdaAsCascDghter
1119 fCFContCascadeCuts->SetBinLimits(5, 0.0 , 0.6 ); // DcaV0DaughtersXi
1120 fCFContCascadeCuts->SetBinLimits(6, 0.98 , 1.0 ); // V0CosineOfPointingAngleXi
1121 fCFContCascadeCuts->SetBinLimits(7, 0.0 , 20.0 ); // V0RadiusXi
1122 fCFContCascadeCuts->SetBinLimits(8, 0.0 , 1.0 ); // DcaV0ToPrimVertexXi
1123 fCFContCascadeCuts->SetBinLimits(9, 0.0 , 2.5 ); // DcaPosToPrimVertexXi
1124 fCFContCascadeCuts->SetBinLimits(10, 0.0 , 2.5 ); // DcaNegToPrimVertexXi
1125 fCFContCascadeCuts->SetBinLimits(11, 1.25 , 1.45 ); // InvMassXi
1126 fCFContCascadeCuts->SetBinLimits(12, 1.6 , 1.8 ); // InvMassOmega
1127 fCFContCascadeCuts->SetBinLimits(13, 0.0 , 10.0 ); // XiTransvMom
1128 fCFContCascadeCuts->SetBinLimits(14, -1.1 , 1.1 ); // Y(Xi)
1129 fCFContCascadeCuts->SetBinLimits(15, -1.1 , 1.1 ); // Y(Omega)
1130 fCFContCascadeCuts->SetBinLimits(16, -10.0 , 10.0 ); // BestPrimaryVtxPosZ
1131 if(fCollidingSystems){
1132 fCFContCascadeCuts->SetBinLimits(17, 0.0, 10000.0 ); // TPCrefitTrackMultiplicity
1133 fCFContCascadeCuts->SetBinLimits(18, 0.0, 10000.0 ); // SPDTrackletsMultiplicity
1136 fCFContCascadeCuts->SetBinLimits(17, 0.0, 250.0 ); // TPCrefitTrackMultiplicity
1137 fCFContCascadeCuts->SetBinLimits(18, 0.0, 250.0 ); // SPDTrackletsMultiplicity
1139 fCFContCascadeCuts->SetBinLimits(19, 25.0 ,165.0 ); // BachTPCClusters
1143 // Setting the number of steps : one for each cascade species (Xi-, Xi+ and Omega-, Omega+)
1144 fCFContCascadeCuts->SetStepTitle(0, "#Xi^{-} candidates");
1145 fCFContCascadeCuts->SetStepTitle(1, "#bar{#Xi}^{+} candidates");
1146 fCFContCascadeCuts->SetStepTitle(2, "#Omega^{-} candidates");
1147 fCFContCascadeCuts->SetStepTitle(3, "#bar{#Omega}^{+} candidates");
1149 // Setting the variable title, per axis
1150 // fCFContCascadeCuts->SetVarTitle(40, "Chi2Xi");
1151 fCFContCascadeCuts->SetVarTitle(0, "Dca(XiDaughters) (cm)");
1152 fCFContCascadeCuts->SetVarTitle(1, "Dca(Bach/PrimVertex) (cm)");
1153 fCFContCascadeCuts->SetVarTitle(2, "cos(Xi pointing angle)");
1154 fCFContCascadeCuts->SetVarTitle(3, "R_{2d}(Xi decay) (cm)");
1155 fCFContCascadeCuts->SetVarTitle(4, "M_{#Lambda}(As Casc Dghter) (GeV/c^{2})");
1156 // fCFContCascadeCuts->SetVarTitle(40, "V0Chi2Xi");
1157 fCFContCascadeCuts->SetVarTitle(5, "Dca(V0 Daughters Xi) (cm)");
1159 fCFContCascadeCuts->SetVarTitle(6, "cos(V0 pointing Angle) in Casc");
1160 fCFContCascadeCuts->SetVarTitle(7, "R_{2d}(V0 decay) (cm)");
1161 fCFContCascadeCuts->SetVarTitle(8, "Dca(V0/PrimVertex) (cm)");
1162 fCFContCascadeCuts->SetVarTitle(9, "Dca(Pos/PrimVertex) (cm)");
1163 fCFContCascadeCuts->SetVarTitle(10, "Dca(Neg/PrimVertex) (cm)");
1165 fCFContCascadeCuts->SetVarTitle(11, "Inv. Mass(Xi) (GeV/c^{2})");
1166 fCFContCascadeCuts->SetVarTitle(12, "Inv. Mass(Omega) (GeV/c^{2})");
1168 fCFContCascadeCuts->SetVarTitle(13, "pt(Casc.) (GeV/c)");
1169 //fCFContCascadeCuts->SetVarTitle(40, "V0toXiCosineOfPointingAngle");
1171 fCFContCascadeCuts->SetVarTitle(14, "Y(Xi)");
1172 fCFContCascadeCuts->SetVarTitle(15, "Y(Omega)");
1174 fCFContCascadeCuts->SetVarTitle(16, "Z-position(BestPrimVtx) (cm)");
1176 fCFContCascadeCuts->SetVarTitle(17, "TPCrefit track Multiplicity");
1177 fCFContCascadeCuts->SetVarTitle(18, "SPD tracklets Multiplicity");
1178 fCFContCascadeCuts->SetVarTitle(19, "Bach.TPC Clusters");
1180 fListHistCascade->Add(fCFContCascadeCuts);
1185 // Part 4 : Angular correlation study -------
1187 if(! fHnSpAngularCorrXiMinus){
1188 // Delta Phi(Casc,any trck) Vs Delta Eta(Casc,any trck) Vs Casc Pt Vs Pt of the tracks
1189 // Delta Phi = 360 bins de -180., 180.
1190 // Delta Eta = 120 bins de -3.0, 3.0
1191 // Pt Cascade = 100 bins de 0., 10.0,
1192 // Pt track = 150 bins de 0., 15.0
1194 Int_t bins[5] = { 360, 120, 100, 150, 40};
1195 Double_t xmin[5] = {-50., -3., 0., 0., 1.30};
1196 Double_t xmax[5] = { 310., 3., 10., 15., 1.34};
1197 fHnSpAngularCorrXiMinus = new THnSparseF("fHnSpAngularCorrXiMinus", "Angular Correlation for #Xi^{-}:", 5, bins, xmin, xmax);
1198 fHnSpAngularCorrXiMinus->GetAxis(0)->SetTitle(" #Delta#phi(Casc,Track) (deg)");
1199 fHnSpAngularCorrXiMinus->GetAxis(1)->SetTitle(" #Delta#eta(Casc,Track)");
1200 fHnSpAngularCorrXiMinus->GetAxis(2)->SetTitle(" Pt_{Casc} (GeV/c)");
1201 fHnSpAngularCorrXiMinus->GetAxis(3)->SetTitle(" Pt_{any track} (GeV/c)");
1202 fHnSpAngularCorrXiMinus->GetAxis(4)->SetTitle(" Eff. Inv Mass (GeV/c^{2})");
1203 fHnSpAngularCorrXiMinus->Sumw2();
1204 fListHistCascade->Add(fHnSpAngularCorrXiMinus);
1207 if(! fHnSpAngularCorrXiPlus){
1208 // Delta Phi(Casc,any trck) Vs Delta Eta(Casc,any trck) Vs Casc Pt Vs Pt of the tracks
1209 // Delta Phi = 360 bins de -180., 180.
1210 // Delta Eta = 120 bins de -3.0, 3.0
1211 // Pt Cascade = 100 bins de 0., 10.0,
1212 // Pt track = 150 bins de 0., 15.0
1213 Int_t bins[5] = { 360, 120, 100, 150, 40};
1214 Double_t xmin[5] = {-50., -3., 0., 0., 1.30};
1215 Double_t xmax[5] = { 310., 3., 10., 15., 1.34};
1216 fHnSpAngularCorrXiPlus = new THnSparseF("fHnSpAngularCorrXiPlus", "Angular Correlation for #Xi^{+}:", 5, bins, xmin, xmax);
1217 fHnSpAngularCorrXiPlus->GetAxis(0)->SetTitle(" #Delta#phi(Casc,Track) (deg)");
1218 fHnSpAngularCorrXiPlus->GetAxis(1)->SetTitle(" #Delta#eta(Casc,Track)");
1219 fHnSpAngularCorrXiPlus->GetAxis(2)->SetTitle(" Pt_{Casc} (GeV/c)");
1220 fHnSpAngularCorrXiPlus->GetAxis(3)->SetTitle(" Pt_{any track} (GeV/c)");
1221 fHnSpAngularCorrXiPlus->GetAxis(4)->SetTitle(" Eff. Inv Mass (GeV/c^{2})");
1222 fHnSpAngularCorrXiPlus->Sumw2();
1223 fListHistCascade->Add(fHnSpAngularCorrXiPlus);
1226 if(! fHnSpAngularCorrOmegaMinus){
1227 // Delta Phi(Casc,any trck) Vs Delta Eta(Casc,any trck) Vs Casc Pt Vs Pt of the tracks
1228 // Delta Phi = 360 bins de -180., 180.
1229 // Delta Eta = 120 bins de -3.0, 3.0
1230 // Pt Cascade = 100 bins de 0., 10.0,
1231 // Pt track = 150 bins de 0., 15.0
1233 Int_t bins[5] = { 360, 120, 100, 150, 40};
1234 Double_t xmin[5] = {-50., -3., 0., 0., 1.65};
1235 Double_t xmax[5] = { 310., 3., 10., 15., 1.69};
1236 fHnSpAngularCorrOmegaMinus = new THnSparseF("fHnSpAngularCorrOmegaMinus", "Angular Correlation for #Omega^{-}:", 5, bins, xmin, xmax);
1237 fHnSpAngularCorrOmegaMinus->GetAxis(0)->SetTitle(" #Delta#phi(Casc,Track) (deg)");
1238 fHnSpAngularCorrOmegaMinus->GetAxis(1)->SetTitle(" #Delta#eta(Casc,Track)");
1239 fHnSpAngularCorrOmegaMinus->GetAxis(2)->SetTitle(" Pt_{Casc} (GeV/c)");
1240 fHnSpAngularCorrOmegaMinus->GetAxis(3)->SetTitle(" Pt_{any track} (GeV/c)");
1241 fHnSpAngularCorrOmegaMinus->GetAxis(4)->SetTitle(" Eff. Inv Mass (GeV/c^{2})");
1242 fHnSpAngularCorrOmegaMinus->Sumw2();
1243 fListHistCascade->Add(fHnSpAngularCorrOmegaMinus);
1246 if(! fHnSpAngularCorrOmegaPlus){
1247 // Delta Phi(Casc,any trck) Vs Delta Eta(Casc,any trck) Vs Casc Pt Vs Pt of the tracks
1248 // Delta Phi = 360 bins de -180., 180.
1249 // Delta Eta = 120 bins de -3.0, 3.0
1250 // Pt Cascade = 100 bins de 0., 10.0,
1251 // Pt track = 150 bins de 0., 15.0
1252 Int_t bins[5] = { 360, 120, 100, 150, 40};
1253 Double_t xmin[5] = {-50., -3., 0., 0., 1.65};
1254 Double_t xmax[5] = { 310., 3., 10., 15., 1.69};
1255 fHnSpAngularCorrOmegaPlus = new THnSparseF("fHnSpAngularCorrOmegaPlus", "Angular Correlation for #Omega^{+}:", 5, bins, xmin, xmax);
1256 fHnSpAngularCorrOmegaPlus->GetAxis(0)->SetTitle(" #Delta#phi(Casc,Track) (deg)");
1257 fHnSpAngularCorrOmegaPlus->GetAxis(1)->SetTitle(" #Delta#eta(Casc,Track)");
1258 fHnSpAngularCorrOmegaPlus->GetAxis(2)->SetTitle(" Pt_{Casc} (GeV/c)");
1259 fHnSpAngularCorrOmegaPlus->GetAxis(3)->SetTitle(" Pt_{any track} (GeV/c)");
1260 fHnSpAngularCorrOmegaPlus->GetAxis(4)->SetTitle(" Eff. Inv Mass (GeV/c^{2})");
1261 fHnSpAngularCorrOmegaPlus->Sumw2();
1262 fListHistCascade->Add(fHnSpAngularCorrOmegaPlus);
1266 PostData(1, fListHistCascade);
1267 /* PostData(2, fPaveTextBookKeeping);*/
1268 }// end UserCreateOutputObjects
1275 //________________________________________________________________________
1276 void AliAnalysisTaskCheckCascade::UserExec(Option_t *)
1279 // Called for each event
1281 AliESDEvent *lESDevent = 0x0;
1282 AliAODEvent *lAODevent = 0x0;
1283 Int_t ncascades = -1;
1284 Int_t nTrackMultiplicity = -1;
1285 Int_t nTrackWithTPCrefitMultiplicity = 0;
1287 Short_t lStatusTrackingPrimVtx = -2;
1288 Double_t lTrkgPrimaryVtxPos[3] = {-100.0, -100.0, -100.0};
1289 Double_t lBestPrimaryVtxPos[3] = {-100.0, -100.0, -100.0};
1290 Double_t lMagneticField = -10.;
1294 // Connect to the InputEvent
1295 // After these lines, we should have an ESD/AOD event + the number of cascades in it.
1297 if(fAnalysisType == "ESD"){
1298 lESDevent = dynamic_cast<AliESDEvent*>( InputEvent() );
1300 AliWarning("ERROR: lESDevent not available \n");
1304 fHistCascadeMultiplicityBeforeTrigSel->Fill ( lESDevent->GetNumberOfCascades() );
1306 //-------------------------------------------------
1307 // 0 - Trigger managment
1308 // NOTE : Check the availability of the proper trigger
1311 //if( !MCEvent() ){ // 0x0 = real data or 1 = there is MC truth available, so = data from MC
1312 // if ( !( lESDevent->IsTriggerClassFired("CINT1B-ABCE-NOPF-ALL")) ) return;
1315 // 2nd option - Presuppose the presence of AliPhysicsSelectionTask FIXME FIXME FIXME FIXME FIXME
1317 Bool_t isSelected = ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected();
1318 if ( ! isSelected ) {
1319 PostData(1, fListHistCascade);
1323 //else Printf("Event selected ... \n");
1327 //-------------------------------------------------
1328 // 1 - Cascade vertexer (ESD)
1330 if(fkRerunV0CascVertexers){ // FIXME : relaunch V0 and Cascade vertexers
1331 // if(fAnalysisType == "ESD" ){
1332 // lESDevent->ResetCascades();
1333 // lESDevent->ResetV0s();
1335 // AliV0vertexer lV0vtxer;
1336 // AliCascadeVertexer lCascVtxer;
1338 // lV0vtxer.SetDefaultCuts(fV0Sels);
1339 // lCascVtxer.SetDefaultCuts(fCascSels);
1341 // lV0vtxer.Tracks2V0vertices(lESDevent);
1342 // lCascVtxer.V0sTracks2CascadeVertices(lESDevent);
1344 }// end if(RelaunchV0CascVertexers)
1346 //-------------------------------------------------
1347 ncascades = lESDevent->GetNumberOfCascades();
1348 nTrackWithTPCrefitMultiplicity = DoESDTrackWithTPCrefitMultiplicity(lESDevent);
1350 }//if (fAnalysisType == "ESD")
1353 if(fAnalysisType == "AOD"){
1354 lAODevent = dynamic_cast<AliAODEvent*>( InputEvent() );
1356 AliWarning("ERROR: lAODevent not available \n");
1359 ncascades = lAODevent->GetNumberOfCascades();
1360 nTrackWithTPCrefitMultiplicity = -1;
1362 fHistCascadeMultiplicityBeforeTrigSel->Fill ( ncascades );
1365 // For AOD or ESD ...
1366 nTrackMultiplicity = (InputEvent())->GetNumberOfTracks();
1369 //-------------------------------------------------
1370 fHistTrackMultiplicityForTrigEvt ->Fill( nTrackMultiplicity );
1371 fHistTPCrefitTrackMultiplicityForTrigEvt ->Fill( nTrackWithTPCrefitMultiplicity );
1372 fHistCascadeMultiplicityForTrigEvt ->Fill( ncascades );
1377 // ---------------------------------------------------------------
1378 // I - Global characteristics of the events + general histos (filled for any selected events and/or for the analysed events)
1380 // - I.Step 1 : Characteristics of the event : prim. Vtx + magnetic field (ESD)
1383 if(fAnalysisType == "ESD"){
1384 const AliESDVertex *lPrimaryTrackingESDVtx = lESDevent->GetPrimaryVertexTracks();
1385 // get the vtx stored in ESD found with tracks
1386 lPrimaryTrackingESDVtx->GetXYZ( lTrkgPrimaryVtxPos );
1389 const AliESDVertex *lPrimaryBestESDVtx = lESDevent->GetPrimaryVertex();
1390 // get the best primary vertex available for the event
1391 // As done in AliCascadeVertexer, we keep the one which is the best one available.
1392 // between : Tracking vertex > SPD vertex > TPC vertex > default SPD vertex
1393 // This one will be used for next calculations (DCA essentially)
1394 lPrimaryBestESDVtx->GetXYZ( lBestPrimaryVtxPos );
1395 lStatusTrackingPrimVtx = lPrimaryTrackingESDVtx->GetStatus();
1397 // FIXME : quality cut on the z-position of the prim vertex.
1398 if(fkQualityCutZprimVtxPos) {
1399 if(TMath::Abs(lBestPrimaryVtxPos[2]) > 10.0 ) {
1400 AliWarning("Pb / | Z position of Best Prim Vtx | > 10.0 cm ... return !");
1401 PostData(1, fListHistCascade);
1405 // FIXME : remove TPC-only primary vertex : retain only events with tracking + SPD vertex
1406 if(fkQualityCutNoTPConlyPrimVtx) {
1407 const AliESDVertex *lPrimarySPDVtx = lESDevent->GetPrimaryVertexSPD();
1408 if (!lPrimarySPDVtx->GetStatus() && !lPrimaryTrackingESDVtx->GetStatus() ){
1409 AliWarning("Pb / No SPD prim. vertex nor prim. Tracking vertex ... return !");
1410 PostData(1, fListHistCascade);
1415 // NOTE : For older evts
1417 // As previously done in AliCascadeVertexer, we keep, between both retrieved vertices (SPD or Tracking)
1418 // the one which is the best one available.
1419 // This one will be used for next calculations (DCA essentially)
1420 // At that time, the TPC-only primary vertex was not considered
1423 lMagneticField = lESDevent->GetMagneticField( );
1424 // FIXME if(TMath::Abs(lMagneticField ) < 10e-6) continue;
1428 if(fAnalysisType == "AOD"){
1430 const AliAODVertex *lPrimaryBestAODVtx = lAODevent->GetPrimaryVertex();
1431 // get the best primary vertex available for the event
1432 // We may keep the one which is the best one available = GetVertex(0)
1433 // Pb with pile-up to expect
1434 // This one will be used for next calculations (DCA essentially)
1435 lPrimaryBestAODVtx->GetXYZ( lBestPrimaryVtxPos );
1437 lStatusTrackingPrimVtx = -1;
1438 lTrkgPrimaryVtxPos[0] = -100.0;
1439 lTrkgPrimaryVtxPos[1] = -100.0;
1440 lTrkgPrimaryVtxPos[2] = -100.0;
1441 lMagneticField = 0.;
1445 // - I.Step 2 : Filling histos that characterize the selected event : x,y,z prim. Vtx distrib. (ESD)
1448 fHistCascadeMultiplicityForSelEvt ->Fill( ncascades );
1449 fHistPosBestPrimaryVtxXForSelEvt ->Fill( lBestPrimaryVtxPos[0] );
1450 fHistPosBestPrimaryVtxYForSelEvt ->Fill( lBestPrimaryVtxPos[1] );
1451 fHistPosBestPrimaryVtxZForSelEvt ->Fill( lBestPrimaryVtxPos[2] );
1455 // ---------------------------------------------------------------
1456 // II - Calcultaion Part dedicated to Xi vertices
1458 for (Int_t iXi = 0; iXi < ncascades; iXi++)
1459 {// This is the begining of the Cascade loop (ESD or AOD)
1461 // -------------------------------------
1462 // II.Init - Initialisation of the local variables that will be needed for ESD/AOD
1465 // - 0th part of initialisation : around primary vertex ...
1467 Double_t lTrkgPrimaryVtxRadius3D = -500.0;
1468 Double_t lBestPrimaryVtxRadius3D = -500.0;
1470 // - 1st part of initialisation : variables needed to store AliESDCascade data members
1471 Double_t lEffMassXi = 0. ;
1472 Double_t lChi2Xi = -1. ;
1473 Double_t lDcaXiDaughters = -1. ;
1474 Double_t lXiCosineOfPointingAngle = -1. ;
1475 Double_t lPosXi[3] = { -1000.0, -1000.0, -1000.0 };
1476 Double_t lXiRadius = -1000. ;
1478 // - 2nd part of initialisation : Nbr of clusters within TPC for the 3 daughter cascade tracks
1479 Int_t lPosTPCClusters = -1; // For ESD only ...//FIXME : wait for availability in AOD
1480 Int_t lNegTPCClusters = -1; // For ESD only ...
1481 Int_t lBachTPCClusters = -1; // For ESD only ...
1483 // - 3rd part of initialisation : about V0 part in cascades
1484 Double_t lInvMassLambdaAsCascDghter = 0.;
1485 Double_t lV0Chi2Xi = -1. ;
1486 Double_t lDcaV0DaughtersXi = -1.;
1488 Double_t lDcaBachToPrimVertexXi = -1., lDcaV0ToPrimVertexXi = -1.;
1489 Double_t lDcaPosToPrimVertexXi = -1.;
1490 Double_t lDcaNegToPrimVertexXi = -1.;
1491 Double_t lV0CosineOfPointingAngleXi = -1. ;
1492 Double_t lPosV0Xi[3] = { -1000. , -1000., -1000. }; // Position of VO coming from cascade
1493 Double_t lV0RadiusXi = -1000.0;
1494 Double_t lV0quality = 0.;
1497 // - 4th part of initialisation : Effective masses
1498 Double_t lInvMassXiMinus = 0.;
1499 Double_t lInvMassXiPlus = 0.;
1500 Double_t lInvMassOmegaMinus = 0.;
1501 Double_t lInvMassOmegaPlus = 0.;
1503 // - 5th part of initialisation : PID treatment
1504 Bool_t lIsPosInXiProton = kFALSE;
1505 Bool_t lIsPosInXiPion = kFALSE;
1506 Bool_t lIsPosInOmegaProton = kFALSE;
1507 Bool_t lIsPosInOmegaPion = kFALSE;
1509 Bool_t lIsNegInXiProton = kFALSE;
1510 Bool_t lIsNegInXiPion = kFALSE;
1511 Bool_t lIsNegInOmegaProton = kFALSE;
1512 Bool_t lIsNegInOmegaPion = kFALSE;
1514 Bool_t lIsBachelorKaon = kFALSE;
1515 Bool_t lIsBachelorPion = kFALSE;
1517 Bool_t lIsBachelorKaonForTPC = kFALSE; // For ESD only ...//FIXME : wait for availability in AOD
1518 Bool_t lIsBachelorPionForTPC = kFALSE; // For ESD only ...
1519 Bool_t lIsNegPionForTPC = kFALSE; // For ESD only ...
1520 Bool_t lIsPosPionForTPC = kFALSE; // For ESD only ...
1521 Bool_t lIsNegProtonForTPC = kFALSE; // For ESD only ...
1522 Bool_t lIsPosProtonForTPC = kFALSE; // For ESD only ...
1524 // - 6th part of initialisation : extra info for QA
1525 Double_t lXiMomX = 0. , lXiMomY = 0., lXiMomZ = 0.;
1526 Double_t lXiTransvMom = 0. ;
1527 Double_t lXiTotMom = 0. ;
1529 Double_t lBachMomX = 0., lBachMomY = 0., lBachMomZ = 0.;
1530 Double_t lBachTransvMom = 0.;
1531 Double_t lBachTotMom = 0.;
1533 Short_t lChargeXi = -2;
1534 Double_t lV0toXiCosineOfPointingAngle = 0. ;
1536 Double_t lRapXi = -20.0, lRapOmega = -20.0, lEta = -20.0, lTheta = 360., lPhi = 720. ;
1537 Double_t lAlphaXi = -200., lPtArmXi = -200.0;
1539 // - 7th part of initialisation : variables for the AliCFContainer dedicated to cascade cut optmisiation
1540 Int_t lSPDTrackletsMultiplicity = -1;
1542 // - 8th part of initialisation : variables needed for Angular correlations
1543 TVector3 lTVect3MomXi(0.,0.,0.);
1544 Int_t lArrTrackID[3] = {-1, -1, -1};
1547 if(fAnalysisType == "ESD"){
1549 // -------------------------------------
1550 // II.ESD - Calcultaion Part dedicated to Xi vertices (ESD)
1552 AliESDcascade *xi = lESDevent->GetCascade(iXi);
1556 // - II.Step 1 : around primary vertex
1558 lTrkgPrimaryVtxRadius3D = TMath::Sqrt( lTrkgPrimaryVtxPos[0] * lTrkgPrimaryVtxPos[0] +
1559 lTrkgPrimaryVtxPos[1] * lTrkgPrimaryVtxPos[1] +
1560 lTrkgPrimaryVtxPos[2] * lTrkgPrimaryVtxPos[2] );
1562 lBestPrimaryVtxRadius3D = TMath::Sqrt( lBestPrimaryVtxPos[0] * lBestPrimaryVtxPos[0] +
1563 lBestPrimaryVtxPos[1] * lBestPrimaryVtxPos[1] +
1564 lBestPrimaryVtxPos[2] * lBestPrimaryVtxPos[2] );
1568 // - II.Step 2 : Assigning the necessary variables for specific AliESDcascade data members (ESD)
1571 xi->ChangeMassHypothesis(lV0quality , 3312); // default working hypothesis : cascade = Xi- decay
1573 lEffMassXi = xi->GetEffMassXi();
1574 lChi2Xi = xi->GetChi2Xi();
1575 lDcaXiDaughters = xi->GetDcaXiDaughters();
1576 lXiCosineOfPointingAngle = xi->GetCascadeCosineOfPointingAngle( lBestPrimaryVtxPos[0],
1577 lBestPrimaryVtxPos[1],
1578 lBestPrimaryVtxPos[2] );
1579 // Take care : the best available vertex should be used (like in AliCascadeVertexer)
1581 xi->GetXYZcascade( lPosXi[0], lPosXi[1], lPosXi[2] );
1582 lXiRadius = TMath::Sqrt( lPosXi[0]*lPosXi[0] + lPosXi[1]*lPosXi[1] );
1586 // - II.Step 3 : around the tracks : Bach + V0 (ESD)
1587 // ~ Necessary variables for ESDcascade data members coming from the ESDv0 part (inheritance)
1590 UInt_t lIdxPosXi = (UInt_t) TMath::Abs( xi->GetPindex() );
1591 UInt_t lIdxNegXi = (UInt_t) TMath::Abs( xi->GetNindex() );
1592 UInt_t lBachIdx = (UInt_t) TMath::Abs( xi->GetBindex() );
1593 // Care track label can be negative in MC production (linked with the track quality)
1594 // However = normally, not the case for track index ...
1596 // FIXME : rejection of a double use of a daughter track (nothing but just a crosscheck of what is done in the cascade vertexer)
1597 if(lBachIdx == lIdxNegXi) {
1598 AliWarning("Pb / Idx(Bach. track) = Idx(Neg. track) ... continue!"); continue;
1600 if(lBachIdx == lIdxPosXi) {
1601 AliWarning("Pb / Idx(Bach. track) = Idx(Pos. track) ... continue!"); continue;
1604 AliESDtrack *pTrackXi = lESDevent->GetTrack( lIdxPosXi );
1605 AliESDtrack *nTrackXi = lESDevent->GetTrack( lIdxNegXi );
1606 AliESDtrack *bachTrackXi = lESDevent->GetTrack( lBachIdx );
1607 if (!pTrackXi || !nTrackXi || !bachTrackXi ) {
1608 AliWarning("ERROR: Could not retrieve one of the 3 ESD daughter tracks of the cascade ...");
1612 lPosTPCClusters = pTrackXi->GetTPCNcls();
1613 lNegTPCClusters = nTrackXi->GetTPCNcls();
1614 lBachTPCClusters = bachTrackXi->GetTPCNcls();
1616 // FIXME : rejection of a poor quality tracks
1617 if(fkQualityCutTPCrefit){
1618 // 1 - Poor quality related to TPCrefit
1619 ULong_t pStatus = pTrackXi->GetStatus();
1620 ULong_t nStatus = nTrackXi->GetStatus();
1621 ULong_t bachStatus = bachTrackXi->GetStatus();
1622 if ((pStatus&AliESDtrack::kTPCrefit) == 0) { AliWarning("Pb / V0 Pos. track has no TPCrefit ... continue!"); continue; }
1623 if ((nStatus&AliESDtrack::kTPCrefit) == 0) { AliWarning("Pb / V0 Neg. track has no TPCrefit ... continue!"); continue; }
1624 if ((bachStatus&AliESDtrack::kTPCrefit) == 0) { AliWarning("Pb / Bach. track has no TPCrefit ... continue!"); continue; }
1626 if(fkQualityCut80TPCcls){
1627 // 2 - Poor quality related to TPC clusters
1628 if(lPosTPCClusters < 80) { AliWarning("Pb / V0 Pos. track has less than 80 TPC clusters ... continue!"); continue; }
1629 if(lNegTPCClusters < 80) { AliWarning("Pb / V0 Neg. track has less than 80 TPC clusters ... continue!"); continue; }
1630 if(lBachTPCClusters < 80) { AliWarning("Pb / Bach. track has less than 80 TPC clusters ... continue!"); continue; }
1634 lInvMassLambdaAsCascDghter = xi->GetEffMass();
1635 // This value shouldn't change, whatever the working hyp. is : Xi-, Xi+, Omega-, Omega+
1636 lDcaV0DaughtersXi = xi->GetDcaV0Daughters();
1637 lV0Chi2Xi = xi->GetChi2V0();
1639 lV0CosineOfPointingAngleXi = xi->GetV0CosineOfPointingAngle( lBestPrimaryVtxPos[0],
1640 lBestPrimaryVtxPos[1],
1641 lBestPrimaryVtxPos[2] );
1643 lDcaV0ToPrimVertexXi = xi->GetD( lBestPrimaryVtxPos[0],
1644 lBestPrimaryVtxPos[1],
1645 lBestPrimaryVtxPos[2] );
1647 lDcaBachToPrimVertexXi = TMath::Abs( bachTrackXi->GetD( lBestPrimaryVtxPos[0],
1648 lBestPrimaryVtxPos[1],
1650 // Note : AliExternalTrackParam::GetD returns an algebraic value ...
1652 xi->GetXYZ( lPosV0Xi[0], lPosV0Xi[1], lPosV0Xi[2] );
1653 lV0RadiusXi = TMath::Sqrt( lPosV0Xi[0]*lPosV0Xi[0] + lPosV0Xi[1]*lPosV0Xi[1] );
1655 lDcaPosToPrimVertexXi = TMath::Abs( pTrackXi ->GetD( lBestPrimaryVtxPos[0],
1656 lBestPrimaryVtxPos[1],
1659 lDcaNegToPrimVertexXi = TMath::Abs( nTrackXi ->GetD( lBestPrimaryVtxPos[0],
1660 lBestPrimaryVtxPos[1],
1663 // - II.Step 3' : extra-selection for cascade candidates
1664 // Towards optimisation of AA selection
1666 if(fkExtraSelections){
1667 // if(lChi2Xi > 2000) continue;
1668 // if(lV0Chi2Xi > 2000) continue;
1670 if(lDcaXiDaughters > 0.05) continue; // > 0.1 by default
1671 //if(lXiCosineOfPointingAngle < 0.999 ) continue;
1672 if(lXiRadius < 1.0) continue;
1673 if(lXiRadius > 100) continue;
1674 if(TMath::Abs(lInvMassLambdaAsCascDghter-1.11568) > 0.007) continue;
1675 if(lDcaV0DaughtersXi > 0.3) continue;
1677 if(lV0CosineOfPointingAngleXi > 0.9999) continue;
1678 //if(lDcaV0ToPrimVertexXi < 0.09) continue;
1679 if(lDcaBachToPrimVertexXi < 0.04) continue;
1681 if(lV0RadiusXi < 1.0) continue;
1682 if(lV0RadiusXi > 100) continue;
1683 //if(lDcaPosToPrimVertexXi < 0.6) continue;
1684 //if(lDcaNegToPrimVertexXi < 0.6) continue;
1689 // - II.Step 4 : around effective masses (ESD)
1690 // ~ change mass hypotheses to cover all the possibilities : Xi-/+, Omega -/+
1694 if( bachTrackXi->Charge() < 0 ) {
1696 xi->ChangeMassHypothesis(lV0quality , 3312);
1697 // Calculate the effective mass of the Xi- candidate.
1698 // pdg code 3312 = Xi-
1699 lInvMassXiMinus = xi->GetEffMassXi();
1702 xi->ChangeMassHypothesis(lV0quality , 3334);
1703 // Calculate the effective mass of the Xi- candidate.
1704 // pdg code 3334 = Omega-
1705 lInvMassOmegaMinus = xi->GetEffMassXi();
1708 xi->ChangeMassHypothesis(lV0quality , 3312); // Back to default hyp.
1709 }// end if negative bachelor
1712 if( bachTrackXi->Charge() > 0 ){
1714 xi->ChangeMassHypothesis(lV0quality , -3312);
1715 // Calculate the effective mass of the Xi+ candidate.
1716 // pdg code -3312 = Xi+
1717 lInvMassXiPlus = xi->GetEffMassXi();
1720 xi->ChangeMassHypothesis(lV0quality , -3334);
1721 // Calculate the effective mass of the Xi+ candidate.
1722 // pdg code -3334 = Omega+
1723 lInvMassOmegaPlus = xi->GetEffMassXi();
1726 xi->ChangeMassHypothesis(lV0quality , -3312); // Back to "default" hyp.
1727 }// end if positive bachelor
1731 // - II.Step 5 : PID on the daughter tracks
1735 // Reasonable guess for the priors for the cascade track sample (e-, mu, pi, K, p)
1736 Double_t lPriorsGuessXi[5] = {0, 0, 2, 0, 1};
1737 Double_t lPriorsGuessOmega[5] = {0, 0, 1, 1, 1};
1739 // Combined VO-positive-daughter PID
1740 AliPID pPidXi; pPidXi.SetPriors( lPriorsGuessXi );
1741 AliPID pPidOmega; pPidOmega.SetPriors( lPriorsGuessOmega );
1743 if( pTrackXi->IsOn(AliESDtrack::kESDpid) ){ // Combined PID exists
1744 Double_t r[10] = {0.}; pTrackXi->GetESDpid(r);
1745 pPidXi.SetProbabilities(r);
1746 pPidOmega.SetProbabilities(r);
1748 // Check if the V0 positive track is a proton (case for Xi-)
1749 Double_t pproton = pPidXi.GetProbability(AliPID::kProton);
1750 if (pproton > pPidXi.GetProbability(AliPID::kElectron) &&
1751 pproton > pPidXi.GetProbability(AliPID::kMuon) &&
1752 pproton > pPidXi.GetProbability(AliPID::kPion) &&
1753 pproton > pPidXi.GetProbability(AliPID::kKaon) ) lIsPosInXiProton = kTRUE;
1755 // Check if the V0 positive track is a pi+ (case for Xi+)
1756 Double_t ppion = pPidXi.GetProbability(AliPID::kPion);
1757 if (ppion > pPidXi.GetProbability(AliPID::kElectron) &&
1758 ppion > pPidXi.GetProbability(AliPID::kMuon) &&
1759 ppion > pPidXi.GetProbability(AliPID::kKaon) &&
1760 ppion > pPidXi.GetProbability(AliPID::kProton) ) lIsPosInXiPion = kTRUE;
1763 // Check if the V0 positive track is a proton (case for Omega-)
1765 pproton = pPidOmega.GetProbability(AliPID::kProton);
1766 if (pproton > pPidOmega.GetProbability(AliPID::kElectron) &&
1767 pproton > pPidOmega.GetProbability(AliPID::kMuon) &&
1768 pproton > pPidOmega.GetProbability(AliPID::kPion) &&
1769 pproton > pPidOmega.GetProbability(AliPID::kKaon) ) lIsPosInOmegaProton = kTRUE;
1771 // Check if the V0 positive track is a pi+ (case for Omega+)
1773 ppion = pPidOmega.GetProbability(AliPID::kPion);
1774 if (ppion > pPidOmega.GetProbability(AliPID::kElectron) &&
1775 ppion > pPidOmega.GetProbability(AliPID::kMuon) &&
1776 ppion > pPidOmega.GetProbability(AliPID::kKaon) &&
1777 ppion > pPidOmega.GetProbability(AliPID::kProton) ) lIsPosInOmegaPion = kTRUE;
1779 }// end if V0 positive track with existing combined PID
1782 // Combined VO-negative-daughter PID
1783 AliPID nPidXi; nPidXi.SetPriors( lPriorsGuessXi );
1784 AliPID nPidOmega; nPidOmega.SetPriors( lPriorsGuessOmega );
1786 if( nTrackXi->IsOn(AliESDtrack::kESDpid) ){ // Combined PID exists
1787 Double_t r[10] = {0.}; nTrackXi->GetESDpid(r);
1788 nPidXi.SetProbabilities(r);
1789 nPidOmega.SetProbabilities(r);
1791 // Check if the V0 negative track is a pi- (case for Xi-)
1792 Double_t ppion = nPidXi.GetProbability(AliPID::kPion);
1793 if (ppion > nPidXi.GetProbability(AliPID::kElectron) &&
1794 ppion > nPidXi.GetProbability(AliPID::kMuon) &&
1795 ppion > nPidXi.GetProbability(AliPID::kKaon) &&
1796 ppion > nPidXi.GetProbability(AliPID::kProton) ) lIsNegInXiPion = kTRUE;
1798 // Check if the V0 negative track is an anti-proton (case for Xi+)
1799 Double_t pproton = nPidXi.GetProbability(AliPID::kProton);
1800 if (pproton > nPidXi.GetProbability(AliPID::kElectron) &&
1801 pproton > nPidXi.GetProbability(AliPID::kMuon) &&
1802 pproton > nPidXi.GetProbability(AliPID::kPion) &&
1803 pproton > nPidXi.GetProbability(AliPID::kKaon) ) lIsNegInXiProton = kTRUE;
1805 // Check if the V0 negative track is a pi- (case for Omega-)
1807 ppion = nPidOmega.GetProbability(AliPID::kPion);
1808 if (ppion > nPidOmega.GetProbability(AliPID::kElectron) &&
1809 ppion > nPidOmega.GetProbability(AliPID::kMuon) &&
1810 ppion > nPidOmega.GetProbability(AliPID::kKaon) &&
1811 ppion > nPidOmega.GetProbability(AliPID::kProton) ) lIsNegInOmegaPion = kTRUE;
1813 // Check if the V0 negative track is an anti-proton (case for Omega+)
1815 pproton = nPidOmega.GetProbability(AliPID::kProton);
1816 if (pproton > nPidOmega.GetProbability(AliPID::kElectron) &&
1817 pproton > nPidOmega.GetProbability(AliPID::kMuon) &&
1818 pproton > nPidOmega.GetProbability(AliPID::kPion) &&
1819 pproton > nPidOmega.GetProbability(AliPID::kKaon) ) lIsNegInOmegaProton = kTRUE;
1821 }// end if V0 negative track with existing combined PID
1824 // Combined bachelor PID
1825 AliPID bachPidXi; bachPidXi.SetPriors( lPriorsGuessXi );
1826 AliPID bachPidOmega; bachPidOmega.SetPriors( lPriorsGuessOmega );
1828 if( bachTrackXi->IsOn(AliESDtrack::kESDpid) ){ // Combined PID exists
1829 Double_t r[10] = {0.}; bachTrackXi->GetESDpid(r);
1830 bachPidXi.SetProbabilities(r);
1831 bachPidOmega.SetProbabilities(r);
1832 // Check if the bachelor track is a pion
1833 Double_t ppion = bachPidXi.GetProbability(AliPID::kPion);
1834 if (ppion > bachPidXi.GetProbability(AliPID::kElectron) &&
1835 ppion > bachPidXi.GetProbability(AliPID::kMuon) &&
1836 ppion > bachPidXi.GetProbability(AliPID::kKaon) &&
1837 ppion > bachPidXi.GetProbability(AliPID::kProton) ) lIsBachelorPion = kTRUE;
1838 // Check if the bachelor track is a kaon
1839 Double_t pkaon = bachPidOmega.GetProbability(AliPID::kKaon);
1840 if (pkaon > bachPidOmega.GetProbability(AliPID::kElectron) &&
1841 pkaon > bachPidOmega.GetProbability(AliPID::kMuon) &&
1842 pkaon > bachPidOmega.GetProbability(AliPID::kPion) &&
1843 pkaon > bachPidOmega.GetProbability(AliPID::kProton) ) lIsBachelorKaon = kTRUE;
1844 }// end if bachelor track with existing combined PID
1847 // B - TPC PID : 3-sigma bands on Bethe-Bloch curve
1849 if (TMath::Abs(fESDpid->NumberOfSigmasTPC( bachTrackXi,AliPID::kKaon)) < 3) lIsBachelorKaonForTPC = kTRUE;
1850 if (TMath::Abs(fESDpid->NumberOfSigmasTPC( bachTrackXi,AliPID::kPion)) < 3) lIsBachelorPionForTPC = kTRUE;
1852 // Negative V0 daughter
1853 if (TMath::Abs(fESDpid->NumberOfSigmasTPC( nTrackXi,AliPID::kPion )) < 3) lIsNegPionForTPC = kTRUE;
1854 if (TMath::Abs(fESDpid->NumberOfSigmasTPC( nTrackXi,AliPID::kProton )) < 3) lIsNegProtonForTPC = kTRUE;
1856 // Positive V0 daughter
1857 if (TMath::Abs(fESDpid->NumberOfSigmasTPC( pTrackXi,AliPID::kPion )) < 3) lIsPosPionForTPC = kTRUE;
1858 if (TMath::Abs(fESDpid->NumberOfSigmasTPC( pTrackXi,AliPID::kProton )) < 3) lIsPosProtonForTPC = kTRUE;
1862 // - II.Step 6 : extra info for QA (ESD)
1863 // miscellaneous pieces of info that may help regarding data quality assessment.
1866 xi->GetPxPyPz( lXiMomX, lXiMomY, lXiMomZ );
1867 lXiTransvMom = TMath::Sqrt( lXiMomX*lXiMomX + lXiMomY*lXiMomY );
1868 lXiTotMom = TMath::Sqrt( lXiMomX*lXiMomX + lXiMomY*lXiMomY + lXiMomZ*lXiMomZ );
1870 xi->GetBPxPyPz( lBachMomX, lBachMomY, lBachMomZ );
1871 lBachTransvMom = TMath::Sqrt( lBachMomX*lBachMomX + lBachMomY*lBachMomY );
1872 lBachTotMom = TMath::Sqrt( lBachMomX*lBachMomX + lBachMomY*lBachMomY + lBachMomZ*lBachMomZ );
1874 lChargeXi = xi->Charge();
1876 lV0toXiCosineOfPointingAngle = xi->GetV0CosineOfPointingAngle( lPosXi[0], lPosXi[1], lPosXi[2] );
1878 lRapXi = xi->RapXi();
1879 lRapOmega = xi->RapOmega();
1881 lTheta = xi->Theta() *180.0/TMath::Pi();
1882 lPhi = xi->Phi() *180.0/TMath::Pi();
1883 lAlphaXi = xi->AlphaXi();
1884 lPtArmXi = xi->PtArmXi();
1887 //FIXME : Extra-cut = Anti-splitting cut for lambda daughters
1888 Bool_t kAntiSplittingLambda = kFALSE;
1890 if(kAntiSplittingLambda){
1891 Double_t lNMomX = 0., lNMomY = 0., lNMomZ = 0.;
1892 Double_t lPMomX = 0., lPMomY = 0., lPMomZ = 0.;
1894 xi->GetPPxPyPz(lPMomX, lPMomY, lPMomZ);
1895 xi->GetNPxPyPz(lNMomX, lNMomY, lNMomZ);
1897 if( xi->Charge() < 0){// Xi- or Omega-
1898 if(TMath::Abs(lBachTransvMom - TMath::Sqrt( lNMomX*lNMomX + lNMomY*lNMomY ) ) < 0.075) continue;
1900 else { //Xi+ or Omega+
1901 if(TMath::Abs(lBachTransvMom - TMath::Sqrt( lPMomX*lPMomX + lPMomY*lPMomY ) ) < 0.075) continue;
1905 // FIXME : Just to know which file is currently open : locate the file containing Xi
1906 // cout << "Name of the file containing Xi candidate(s) :"
1907 // << CurrentFileName()
1908 // << " / entry: " << Entry()
1909 // << " / in file: " << lESDevent->GetEventNumberInFile() // <- Cvetan / From Mihaela: AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()->GetTree()->GetReadEntry();
1910 // << " : mass(Xi) = " << xi->GetEffMassXi()
1911 // << " / charge = " << lChargeXi
1912 // << " / pt(Casc) = " << lXiTransvMom
1913 // << " / Decay 2d R(Xi) = " << lXiRadius
1917 // II.Step 7 - Complementary info for monitoring the cascade cut variables
1919 const AliMultiplicity *lAliMult = lESDevent->GetMultiplicity();
1920 lSPDTrackletsMultiplicity = lAliMult->GetNumberOfTracklets();
1922 // II.Step 8 - Azimuthal correlation study
1925 lTVect3MomXi.SetXYZ( lXiMomX, lXiMomY, lXiMomZ );
1926 lArrTrackID[0] = pTrackXi ->GetID();
1927 lArrTrackID[1] = nTrackXi ->GetID();
1928 lArrTrackID[2] = bachTrackXi->GetID();
1931 }// end of ESD treatment
1934 if(fAnalysisType == "AOD"){
1936 // -------------------------------------
1937 // II.AOD - Calcultaion Part dedicated to Xi vertices (ESD)
1939 const AliAODcascade *xi = lAODevent->GetCascade(iXi);
1942 // Just to know which file is currently open : locate the file containing Xi
1943 // cout << "Name of the file containing Xi candidate(s) :" << fesdH->GetTree()->GetCurrentFile()->GetName() << endl;
1946 // - II.Step 1 : Characteristics of the event : prim. Vtx + magnetic field (AOD)
1950 lTrkgPrimaryVtxRadius3D = -500. ;
1951 // FIXME : We don't have the different prim. vertex at the AOD level -> nothing to do.
1953 lBestPrimaryVtxRadius3D = TMath::Sqrt( lBestPrimaryVtxPos[0] * lBestPrimaryVtxPos[0] +
1954 lBestPrimaryVtxPos[1] * lBestPrimaryVtxPos[1] +
1955 lBestPrimaryVtxPos[2] * lBestPrimaryVtxPos[2] );
1958 // - II.Step 2 : Assigning the necessary variables for specific AliAODcascade data members (AOD)
1961 lEffMassXi = xi->MassXi(); // default working hypothesis : cascade = Xi- decay
1962 lChi2Xi = xi->Chi2Xi();
1963 lDcaXiDaughters = xi->DcaXiDaughters();
1964 lXiCosineOfPointingAngle = xi->CosPointingAngleXi( lBestPrimaryVtxPos[0],
1965 lBestPrimaryVtxPos[1],
1966 lBestPrimaryVtxPos[2] );
1968 // the best available vertex should be used (like in AliCascadeVertexer)
1970 lPosXi[0] = xi->DecayVertexXiX();
1971 lPosXi[1] = xi->DecayVertexXiY();
1972 lPosXi[2] = xi->DecayVertexXiZ();
1973 lXiRadius = TMath::Sqrt( lPosXi[0]*lPosXi[0] + lPosXi[1]*lPosXi[1] );
1976 // - II.Step 3 : around the tracks : Bach + V0 (AOD)
1977 // ~ Necessary variables for AODcascade data members coming from the AODv0 part (inheritance)
1980 lChargeXi = xi->ChargeXi();
1983 lInvMassLambdaAsCascDghter = xi->MassLambda();
1985 lInvMassLambdaAsCascDghter = xi->MassAntiLambda();
1987 lDcaV0DaughtersXi = xi->DcaV0Daughters();
1988 lV0Chi2Xi = xi->Chi2V0();
1990 lV0CosineOfPointingAngleXi = xi->CosPointingAngle( lBestPrimaryVtxPos );
1991 lDcaV0ToPrimVertexXi = xi->DcaV0ToPrimVertex();
1993 lDcaBachToPrimVertexXi = xi->DcaBachToPrimVertex();
1996 lPosV0Xi[0] = xi->DecayVertexV0X();
1997 lPosV0Xi[1] = xi->DecayVertexV0Y();
1998 lPosV0Xi[2] = xi->DecayVertexV0Z();
1999 lV0RadiusXi = TMath::Sqrt( lPosV0Xi[0]*lPosV0Xi[0] + lPosV0Xi[1]*lPosV0Xi[1] );
2001 lDcaPosToPrimVertexXi = xi->DcaPosToPrimVertex();
2002 lDcaNegToPrimVertexXi = xi->DcaNegToPrimVertex();
2005 // - II.Step 4 : around effective masses (AOD)
2006 // ~ change mass hypotheses to cover all the possibilities : Xi-/+, Omega -/+
2009 if( lChargeXi < 0 ) lInvMassXiMinus = xi->MassXi();
2010 if( lChargeXi > 0 ) lInvMassXiPlus = xi->MassXi();
2011 if( lChargeXi < 0 ) lInvMassOmegaMinus = xi->MassOmega();
2012 if( lChargeXi > 0 ) lInvMassOmegaPlus = xi->MassOmega();
2015 // - II.Step 5 : PID on the daughters (To be developed ...)
2021 // Reasonable guess for the priors for the cascade track sample
2022 Double_t lPriorsGuessXi[5] = {0.0, 0.0, 2, 0, 1};
2023 Double_t lPriorsGuessOmega[5] = {0.0, 0.0, 1, 1, 1};
2024 AliPID bachPidXi; bachPidXi.SetPriors( lPriorsGuessXi );
2025 AliPID bachPidOmega; bachPidOmega.SetPriors( lPriorsGuessOmega );
2027 const AliAODTrack *bachTrackXi = lAODevent->GetTrack( xi->GetBachID() ); // FIXME : GetBachID not implemented ?
2029 if( bachTrackXi->IsOn(AliESDtrack::kESDpid) ){ // Combined PID exists, the AOD flags = a copy of the ESD ones
2030 Double_t r[10]; bachTrackXi->GetPID(r);
2031 bachPidXi.SetProbabilities(r);
2032 bachPidOmega.SetProbabilities(r);
2033 // Check if the bachelor track is a pion
2034 Double_t ppion = bachPidXi.GetProbability(AliPID::kPion);
2035 if (ppion > bachPidXi.GetProbability(AliPID::kElectron) &&
2036 ppion > bachPidXi.GetProbability(AliPID::kMuon) &&
2037 ppion > bachPidXi.GetProbability(AliPID::kKaon) &&
2038 ppion > bachPidXi.GetProbability(AliPID::kProton) ) lIsBachelorPion = kTRUE;
2039 // Check if the bachelor track is a kaon
2040 Double_t pkaon = bachPidOmega.GetProbability(AliPID::kKaon);
2041 if (pkaon > bachPidOmega.GetProbability(AliPID::kElectron) &&
2042 pkaon > bachPidOmega.GetProbability(AliPID::kMuon) &&
2043 pkaon > bachPidOmega.GetProbability(AliPID::kPion) &&
2044 pkaon > bachPidOmega.GetProbability(AliPID::kProton) ) lIsBachelorKaon = kTRUE;
2046 }// end if bachelor track with existing combined PID
2051 // - II.Step 6 : extra info for QA (AOD)
2052 // miscellaneous pieces onf info that may help regarding data quality assessment.
2055 lXiMomX = xi->MomXiX();
2056 lXiMomY = xi->MomXiY();
2057 lXiMomZ = xi->MomXiZ();
2058 lXiTransvMom = TMath::Sqrt( lXiMomX*lXiMomX + lXiMomY*lXiMomY );
2059 lXiTotMom = TMath::Sqrt( lXiMomX*lXiMomX + lXiMomY*lXiMomY + lXiMomZ*lXiMomZ );
2061 lBachMomX = xi->MomBachX();
2062 lBachMomY = xi->MomBachY();
2063 lBachMomZ = xi->MomBachZ();
2064 lBachTransvMom = TMath::Sqrt( lBachMomX*lBachMomX + lBachMomY*lBachMomY );
2065 lBachTotMom = TMath::Sqrt( lBachMomX*lBachMomX + lBachMomY*lBachMomY + lBachMomZ*lBachMomZ );
2068 lV0toXiCosineOfPointingAngle = xi->CosPointingAngle( xi->GetDecayVertexXi() );
2070 lRapXi = xi->RapXi();
2071 lRapOmega = xi->RapOmega();
2072 lEta = xi->Eta(); // Will not work ! need a method Pz(), Py() Px()
2073 lTheta = xi->Theta() *180.0/TMath::Pi(); // in AODcascade.
2074 lPhi = xi->Phi() *180.0/TMath::Pi(); // Here, we will get eta, theta, phi for the V0 ...
2075 lAlphaXi = xi->AlphaXi();
2076 lPtArmXi = xi->PtArmXi();
2078 // II.Step 7 - Complementary info for monitoring the cascade cut variables
2079 //FIXME : missing for AOD : Tacklet Multiplicity + TPCCluster
2081 // II.Step 8 - Azimuthal correlation study
2084 lTVect3MomXi.SetXYZ( lXiMomX, lXiMomY, lXiMomZ );
2086 AliAODTrack *pTrackXi = dynamic_cast<AliAODTrack*>( xi->GetDaughter(0) );
2087 AliAODTrack *nTrackXi = dynamic_cast<AliAODTrack*>( xi->GetDaughter(1) );
2088 AliAODTrack *bachTrackXi = dynamic_cast<AliAODTrack*>( xi->GetDecayVertexXi()->GetDaughter(0) );
2089 if (!pTrackXi || !nTrackXi || !bachTrackXi ) {
2090 AliWarning("ERROR: Could not retrieve one of the 3 AOD daughter tracks of the cascade ...");
2094 lArrTrackID[0] = pTrackXi ->GetID();
2095 lArrTrackID[1] = nTrackXi ->GetID();
2096 lArrTrackID[2] = bachTrackXi->GetID();
2098 }// end of AOD treatment
2101 // -------------------------------------
2102 // II.Fill - Filling the TH1,2,3Fs, HnSparses, CFContainers, FOR events with CASCADES !
2105 // - II.Fill.Step 1 : primary vertex
2107 fHistTPCrefitTrackMultiplicityForCascadeEvt->Fill( nTrackWithTPCrefitMultiplicity );
2109 fHistPosV0TPCClusters ->Fill( lPosTPCClusters );
2110 fHistNegV0TPCClusters ->Fill( lNegTPCClusters );
2111 fHistBachTPCClusters ->Fill( lBachTPCClusters );
2113 fHistVtxStatus ->Fill( lStatusTrackingPrimVtx ); // 1 if tracking vtx = ok
2115 if( lStatusTrackingPrimVtx ){
2116 fHistPosTrkgPrimaryVtxXForCascadeEvt ->Fill( lTrkgPrimaryVtxPos[0] );
2117 fHistPosTrkgPrimaryVtxYForCascadeEvt ->Fill( lTrkgPrimaryVtxPos[1] );
2118 fHistPosTrkgPrimaryVtxZForCascadeEvt ->Fill( lTrkgPrimaryVtxPos[2] );
2119 fHistTrkgPrimaryVtxRadius ->Fill( lTrkgPrimaryVtxRadius3D );
2122 fHistPosBestPrimaryVtxXForCascadeEvt ->Fill( lBestPrimaryVtxPos[0] );
2123 fHistPosBestPrimaryVtxYForCascadeEvt ->Fill( lBestPrimaryVtxPos[1] );
2124 fHistPosBestPrimaryVtxZForCascadeEvt ->Fill( lBestPrimaryVtxPos[2] );
2125 fHistBestPrimaryVtxRadius ->Fill( lBestPrimaryVtxRadius3D );
2127 f2dHistTrkgPrimVtxVsBestPrimVtx->Fill( lTrkgPrimaryVtxRadius3D, lBestPrimaryVtxRadius3D );
2131 fHistEffMassXi ->Fill( lEffMassXi );
2132 fHistChi2Xi ->Fill( lChi2Xi ); // Flag CascadeVtxer: Cut Variable a
2133 fHistDcaXiDaughters ->Fill( lDcaXiDaughters ); // Flag CascadeVtxer: Cut Variable e
2134 fHistDcaBachToPrimVertex ->Fill( lDcaBachToPrimVertexXi ); // Flag CascadeVtxer: Cut Variable d
2135 fHistXiCosineOfPointingAngle ->Fill( lXiCosineOfPointingAngle ); // Flag CascadeVtxer: Cut Variable f
2136 fHistXiRadius ->Fill( lXiRadius ); // Flag CascadeVtxer: Cut Variable g+h
2140 fHistMassLambdaAsCascDghter ->Fill( lInvMassLambdaAsCascDghter ); // Flag CascadeVtxer: Cut Variable c
2141 fHistV0Chi2Xi ->Fill( lV0Chi2Xi );
2142 fHistDcaV0DaughtersXi ->Fill( lDcaV0DaughtersXi );
2143 fHistV0CosineOfPointingAngleXi ->Fill( lV0CosineOfPointingAngleXi );
2144 fHistV0RadiusXi ->Fill( lV0RadiusXi );
2146 fHistDcaV0ToPrimVertexXi ->Fill( lDcaV0ToPrimVertexXi ); // Flag CascadeVtxer: Cut Variable b
2147 fHistDcaPosToPrimVertexXi ->Fill( lDcaPosToPrimVertexXi );
2148 fHistDcaNegToPrimVertexXi ->Fill( lDcaNegToPrimVertexXi );
2151 // II.Fill.Step 4 : extra QA info
2153 fHistChargeXi ->Fill( lChargeXi );
2154 fHistV0toXiCosineOfPointingAngle->Fill( lV0toXiCosineOfPointingAngle );
2156 if( TMath::Abs( lInvMassXiMinus-1.3217 ) < 0.012 || TMath::Abs( lInvMassXiPlus-1.3217 ) < 0.012){// One InvMass should be different from 0
2157 fHistXiTransvMom ->Fill( lXiTransvMom );
2158 fHistXiTotMom ->Fill( lXiTotMom );
2160 fHistBachTransvMomXi ->Fill( lBachTransvMom );
2161 fHistBachTotMomXi ->Fill( lBachTotMom );
2163 fHistRapXi ->Fill( lRapXi );
2164 fHistEtaXi ->Fill( lEta );
2165 fHistThetaXi ->Fill( lTheta );
2166 fHistPhiXi ->Fill( lPhi );
2169 if( TMath::Abs( lInvMassOmegaMinus-1.672 ) < 0.012 || TMath::Abs( lInvMassOmegaPlus-1.672 ) < 0.012 ){// One InvMass should be different from 0
2170 fHistRapOmega ->Fill( lRapOmega );
2173 f2dHistArmenteros ->Fill( lAlphaXi, lPtArmXi );
2176 // II.Fill.Step 5 : inv mass plots 1D
2177 if( lChargeXi < 0 ){
2178 fHistMassXiMinus ->Fill( lInvMassXiMinus );
2179 fHistMassOmegaMinus ->Fill( lInvMassOmegaMinus );
2180 if(lIsBachelorPion) fHistMassWithCombPIDXiMinus ->Fill( lInvMassXiMinus );
2181 if(lIsBachelorKaon) fHistMassWithCombPIDOmegaMinus ->Fill( lInvMassOmegaMinus );
2184 if( lChargeXi > 0 ){
2185 fHistMassXiPlus ->Fill( lInvMassXiPlus );
2186 fHistMassOmegaPlus ->Fill( lInvMassOmegaPlus );
2187 if(lIsBachelorPion) fHistMassWithCombPIDXiPlus ->Fill( lInvMassXiPlus );
2188 if(lIsBachelorKaon) fHistMassWithCombPIDOmegaPlus ->Fill( lInvMassOmegaPlus );
2192 // II.Fill.Step 6 : inv mass plots 2D, 3D
2193 if( lChargeXi < 0 ) {
2194 f2dHistEffMassLambdaVsEffMassXiMinus->Fill( lInvMassLambdaAsCascDghter, lInvMassXiMinus );
2195 f2dHistEffMassXiVsEffMassOmegaMinus ->Fill( lInvMassXiMinus, lInvMassOmegaMinus );
2196 f2dHistXiRadiusVsEffMassXiMinus ->Fill( lXiRadius, lInvMassXiMinus );
2197 f2dHistXiRadiusVsEffMassOmegaMinus ->Fill( lXiRadius, lInvMassOmegaMinus );
2198 f3dHistXiPtVsEffMassVsYXiMinus ->Fill( lXiTransvMom, lInvMassXiMinus, lRapXi );
2199 f3dHistXiPtVsEffMassVsYOmegaMinus ->Fill( lXiTransvMom, lInvMassOmegaMinus, lRapOmega );
2200 if(lIsPosInXiProton) f3dHistXiPtVsEffMassVsYWithCombPIDXiMinus ->Fill( lXiTransvMom, lInvMassXiMinus, lRapXi );
2201 if(lIsBachelorKaon) f3dHistXiPtVsEffMassVsYWithCombPIDOmegaMinus ->Fill( lXiTransvMom, lInvMassOmegaMinus, lRapOmega );
2202 if(lIsBachelorKaon && lIsPosInOmegaProton) f3dHistXiPtVsEffMassVsYWith2CombPIDOmegaMinus ->Fill( lXiTransvMom, lInvMassOmegaMinus, lRapOmega );
2203 if(lIsBachelorKaonForTPC) f3dHistXiPtVsEffMassVsYWithTpcPIDOmegaMinus ->Fill( lXiTransvMom, lInvMassOmegaMinus, lRapOmega );
2206 f2dHistEffMassLambdaVsEffMassXiPlus ->Fill( lInvMassLambdaAsCascDghter, lInvMassXiPlus );
2207 f2dHistEffMassXiVsEffMassOmegaPlus ->Fill( lInvMassXiPlus, lInvMassOmegaPlus );
2208 f2dHistXiRadiusVsEffMassXiPlus ->Fill( lXiRadius, lInvMassXiPlus);
2209 f2dHistXiRadiusVsEffMassOmegaPlus ->Fill( lXiRadius, lInvMassOmegaPlus );
2210 f3dHistXiPtVsEffMassVsYXiPlus ->Fill( lXiTransvMom, lInvMassXiPlus, lRapXi );
2211 f3dHistXiPtVsEffMassVsYOmegaPlus ->Fill( lXiTransvMom, lInvMassOmegaPlus, lRapOmega );
2212 if(lIsNegInXiProton) f3dHistXiPtVsEffMassVsYWithCombPIDXiPlus ->Fill( lXiTransvMom, lInvMassXiPlus, lRapXi );
2213 if(lIsBachelorKaon ) f3dHistXiPtVsEffMassVsYWithCombPIDOmegaPlus ->Fill( lXiTransvMom, lInvMassOmegaPlus, lRapOmega );
2214 if(lIsBachelorKaon && lIsNegInOmegaProton) f3dHistXiPtVsEffMassVsYWith2CombPIDOmegaPlus ->Fill( lXiTransvMom, lInvMassOmegaPlus, lRapOmega );
2217 // - Filling the AliCFContainers related to PID
2219 Double_t lContainerPIDVars[4] = {0.0};
2222 if( lChargeXi < 0 ) {
2223 lContainerPIDVars[0] = lXiTransvMom ;
2224 lContainerPIDVars[1] = lInvMassXiMinus ;
2225 lContainerPIDVars[2] = lRapXi ;
2226 lContainerPIDVars[3] = nTrackWithTPCrefitMultiplicity ;
2229 fCFContCascadePIDXiMinus->Fill(lContainerPIDVars, 0); // No PID
2231 if( lIsBachelorPionForTPC )
2232 fCFContCascadePIDXiMinus->Fill(lContainerPIDVars, 1); // TPC PID / 3-#sigma cut on Bachelor track
2234 if( lIsBachelorPionForTPC &&
2235 lIsPosProtonForTPC )
2236 fCFContCascadePIDXiMinus->Fill(lContainerPIDVars, 2); // TPC PID / 3-#sigma cut on Bachelor+Baryon tracks
2238 if( lIsBachelorPionForTPC &&
2239 lIsPosProtonForTPC &&
2241 fCFContCascadePIDXiMinus->Fill(lContainerPIDVars, 3); // TPC PID / 3-#sigma cut on Bachelor+Baryon+Meson tracks
2244 if( lIsBachelorPion )
2245 fCFContCascadePIDXiMinus->Fill(lContainerPIDVars, 4); // Comb. PID / Bachelor
2247 if( lIsBachelorPion &&
2249 fCFContCascadePIDXiMinus->Fill(lContainerPIDVars, 5); // Comb. PID / Bachelor+Baryon
2251 if(lIsBachelorPion &&
2254 fCFContCascadePIDXiMinus->Fill(lContainerPIDVars, 6); // Comb. PID / Bachelor+Baryon+Meson
2257 lContainerPIDVars[0] = 0.; lContainerPIDVars[1] = 0.; lContainerPIDVars[2] = 0.; lContainerPIDVars[3] = 0.;
2260 if( lChargeXi > 0 ) {
2261 lContainerPIDVars[0] = lXiTransvMom ;
2262 lContainerPIDVars[1] = lInvMassXiPlus ;
2263 lContainerPIDVars[2] = lRapXi ;
2264 lContainerPIDVars[3] = nTrackWithTPCrefitMultiplicity ;
2267 fCFContCascadePIDXiPlus->Fill(lContainerPIDVars, 0); // No PID
2269 if( lIsBachelorPionForTPC )
2270 fCFContCascadePIDXiPlus->Fill(lContainerPIDVars, 1); // TPC PID / 3-#sigma cut on Bachelor track
2272 if( lIsBachelorPionForTPC &&
2273 lIsNegProtonForTPC )
2274 fCFContCascadePIDXiPlus->Fill(lContainerPIDVars, 2); // TPC PID / 3-#sigma cut on Bachelor+Baryon tracks
2276 if( lIsBachelorPionForTPC &&
2277 lIsNegProtonForTPC &&
2279 fCFContCascadePIDXiPlus->Fill(lContainerPIDVars, 3); // TPC PID / 3-#sigma cut on Bachelor+Baryon+Meson tracks
2282 if( lIsBachelorPion )
2283 fCFContCascadePIDXiPlus->Fill(lContainerPIDVars, 4); // Comb. PID / Bachelor
2285 if( lIsBachelorPion &&
2287 fCFContCascadePIDXiPlus->Fill(lContainerPIDVars, 5); // Comb. PID / Bachelor+Baryon
2289 if(lIsBachelorPion &&
2292 fCFContCascadePIDXiPlus->Fill(lContainerPIDVars, 6); // Comb. PID / Bachelor+Baryon+Meson
2295 lContainerPIDVars[0] = 0.; lContainerPIDVars[1] = 0.; lContainerPIDVars[2] = 0.; lContainerPIDVars[3] = 0.;
2298 if( lChargeXi < 0 ) {
2299 lContainerPIDVars[0] = lXiTransvMom ;
2300 lContainerPIDVars[1] = lInvMassOmegaMinus ;
2301 lContainerPIDVars[2] = lRapOmega ;
2302 lContainerPIDVars[3] = nTrackWithTPCrefitMultiplicity ;
2305 fCFContCascadePIDOmegaMinus->Fill(lContainerPIDVars, 0); // No PID
2307 if( lIsBachelorKaonForTPC )
2308 fCFContCascadePIDOmegaMinus->Fill(lContainerPIDVars, 1); // TPC PID / 3-#sigma cut on Bachelor track
2310 if( lIsBachelorKaonForTPC &&
2311 lIsPosProtonForTPC )
2312 fCFContCascadePIDOmegaMinus->Fill(lContainerPIDVars, 2); // TPC PID / 3-#sigma cut on Bachelor+Baryon tracks
2314 if( lIsBachelorKaonForTPC &&
2315 lIsPosProtonForTPC &&
2317 fCFContCascadePIDOmegaMinus->Fill(lContainerPIDVars, 3); // TPC PID / 3-#sigma cut on Bachelor+Baryon+Meson tracks
2320 if( lIsBachelorKaon )
2321 fCFContCascadePIDOmegaMinus->Fill(lContainerPIDVars, 4); // Comb. PID / Bachelor
2323 if( lIsBachelorKaon &&
2324 lIsPosInOmegaProton )
2325 fCFContCascadePIDOmegaMinus->Fill(lContainerPIDVars, 5); // Comb. PID / Bachelor+Baryon
2327 if(lIsBachelorKaon &&
2328 lIsPosInOmegaProton &&
2330 fCFContCascadePIDOmegaMinus->Fill(lContainerPIDVars, 6); // Comb. PID / Bachelor+Baryon+Meson
2333 lContainerPIDVars[0] = 0.; lContainerPIDVars[1] = 0.; lContainerPIDVars[2] = 0.; lContainerPIDVars[3] = 0.;
2336 if( lChargeXi > 0 ) {
2337 lContainerPIDVars[0] = lXiTransvMom ;
2338 lContainerPIDVars[1] = lInvMassOmegaPlus ;
2339 lContainerPIDVars[2] = lRapOmega ;
2340 lContainerPIDVars[3] = nTrackWithTPCrefitMultiplicity ;
2343 fCFContCascadePIDOmegaPlus->Fill(lContainerPIDVars, 0); // No PID
2345 if( lIsBachelorKaonForTPC )
2346 fCFContCascadePIDOmegaPlus->Fill(lContainerPIDVars, 1); // TPC PID / 3-#sigma cut on Bachelor track
2348 if( lIsBachelorKaonForTPC &&
2349 lIsNegProtonForTPC )
2350 fCFContCascadePIDOmegaPlus->Fill(lContainerPIDVars, 2); // TPC PID / 3-#sigma cut on Bachelor+Baryon tracks
2352 if( lIsBachelorKaonForTPC &&
2353 lIsNegProtonForTPC &&
2355 fCFContCascadePIDOmegaPlus->Fill(lContainerPIDVars, 3); // TPC PID / 3-#sigma cut on Bachelor+Baryon+Meson tracks
2358 if( lIsBachelorKaon )
2359 fCFContCascadePIDOmegaPlus->Fill(lContainerPIDVars, 4); // Comb. PID / Bachelor
2361 if( lIsBachelorKaon &&
2362 lIsNegInOmegaProton )
2363 fCFContCascadePIDOmegaPlus->Fill(lContainerPIDVars, 5); // Comb. PID / Bachelor+Baryon
2365 if(lIsBachelorKaon &&
2366 lIsNegInOmegaProton &&
2368 fCFContCascadePIDOmegaPlus->Fill(lContainerPIDVars, 6); // Comb. PID / Bachelor+Baryon+Meson
2375 // II.Fill.Step 7 : filling the AliCFContainer (optimisation of topological selections)
2376 Double_t lContainerCutVars[20] = {0.0};
2378 lContainerCutVars[0] = lDcaXiDaughters;
2379 lContainerCutVars[1] = lDcaBachToPrimVertexXi;
2380 lContainerCutVars[2] = lXiCosineOfPointingAngle;
2381 lContainerCutVars[3] = lXiRadius;
2382 lContainerCutVars[4] = lInvMassLambdaAsCascDghter;
2383 lContainerCutVars[5] = lDcaV0DaughtersXi;
2384 lContainerCutVars[6] = lV0CosineOfPointingAngleXi;
2385 lContainerCutVars[7] = lV0RadiusXi;
2386 lContainerCutVars[8] = lDcaV0ToPrimVertexXi;
2387 lContainerCutVars[9] = lDcaPosToPrimVertexXi;
2388 lContainerCutVars[10] = lDcaNegToPrimVertexXi;
2390 lContainerCutVars[13] = lXiTransvMom;
2392 lContainerCutVars[16] = lBestPrimaryVtxPos[2];
2393 lContainerCutVars[17] = nTrackWithTPCrefitMultiplicity; // FIXME : nTrackWithTPCrefitMultiplicity not checked for AOD ... = 0
2394 lContainerCutVars[18] = lSPDTrackletsMultiplicity; // FIXME : SPDTrackletsMultiplicity is not available for AOD ... = -1
2395 lContainerCutVars[19] = lBachTPCClusters; // FIXME : BachTPCClusters is not available for AOD ... = -1
2397 if( lChargeXi < 0 ) {
2398 lContainerCutVars[11] = lInvMassXiMinus;
2399 lContainerCutVars[12] = 1.75;
2400 lContainerCutVars[14] = lRapXi;
2401 lContainerCutVars[15] = -1.;
2402 fCFContCascadeCuts->Fill(lContainerCutVars,0); // for Xi-
2404 lContainerCutVars[11] = 1.4;
2405 lContainerCutVars[12] = lInvMassOmegaMinus;
2406 lContainerCutVars[14] = -1.;
2407 lContainerCutVars[15] = lRapOmega;
2408 fCFContCascadeCuts->Fill(lContainerCutVars,2); // for Omega-
2411 lContainerCutVars[11] = lInvMassXiPlus;
2412 lContainerCutVars[12] = 1.75;
2413 lContainerCutVars[14] = lRapXi;
2414 lContainerCutVars[15] = -1.;
2415 fCFContCascadeCuts->Fill(lContainerCutVars,1); // for Xi+
2417 lContainerCutVars[11] = 1.4;
2418 lContainerCutVars[12] = lInvMassOmegaPlus;
2419 lContainerCutVars[14] = -1.;
2420 lContainerCutVars[15] = lRapOmega;
2421 fCFContCascadeCuts->Fill(lContainerCutVars,3); // for Omega+
2425 // II.Fill.Step 8 : angular correlations
2427 if( lChargeXi < 0 ){
2428 DoAngularCorrelation("Xi-", lInvMassXiMinus, lArrTrackID, lTVect3MomXi, lEta);
2429 DoAngularCorrelation("Omega-", lInvMassOmegaMinus, lArrTrackID, lTVect3MomXi, lEta);
2432 DoAngularCorrelation("Xi+", lInvMassXiPlus, lArrTrackID, lTVect3MomXi, lEta);
2433 DoAngularCorrelation("Omega+", lInvMassOmegaPlus, lArrTrackID, lTVect3MomXi, lEta);
2437 }// end of the Cascade loop (ESD or AOD)
2440 // Post output data.
2441 PostData(1, fListHistCascade);
2445 void AliAnalysisTaskCheckCascade::DoAngularCorrelation( const Char_t *lCascType,
2446 Double_t lInvMassCascade,
2447 const Int_t *lArrTrackID,
2448 TVector3 &lTVect3MomXi,
2450 // Perform the Delta(Phi)Delta(Eta) analysis
2451 // by properly filling the THnSparseF
2453 TString lStrCascType( lCascType );
2455 Double_t lCascPdgMass = 0.0;
2456 if( lStrCascType.Contains("Xi") ) lCascPdgMass = 1.3217;
2457 if( lStrCascType.Contains("Omega") ) lCascPdgMass = 1.6724;
2459 if( lInvMassCascade > lCascPdgMass + 0.010) return;
2460 if( lInvMassCascade < lCascPdgMass - 0.010) return;
2461 // Check the Xi- candidate is within the proper mass window m0 +- 10 MeV
2464 // 1st loop: check there is no track with a higher pt ...
2465 // = The cascade is meant to be a leading particle : Pt(Casc) > any track in the event
2466 for(Int_t TrckIdx = 0; TrckIdx < (InputEvent())->GetNumberOfTracks() ; TrckIdx++ )
2467 {// Loop over all the tracks of the event
2469 AliVTrack *lCurrentTrck = dynamic_cast<AliVTrack*>( (InputEvent())->GetTrack( TrckIdx ) );
2470 if (!lCurrentTrck ) {
2471 AliWarning("ERROR Correl. Study : Could not retrieve a track while looping over the event tracks ...");
2474 if(lTVect3MomXi.Pt() < lCurrentTrck->Pt() ) return;
2475 // Room for improvement: //FIXME
2476 // 1. There is a given resolution on pt : maybe release the cut Pt(casc) < Pt(track)*90% ?
2477 // 2. Apply this cut only when DeltaPhi(casc, track) > 90 deg = when track is in the away-side ?
2478 // 3. Anti-splitting cut (like in Femto analysis) ?
2480 }// end control loop
2482 // 2nd loop: filling loop
2483 for(Int_t TrckIdx = 0; TrckIdx < (InputEvent())->GetNumberOfTracks() ; TrckIdx++ )
2484 {// Loop over all the tracks of the event
2486 AliVTrack *lCurrentTrck = dynamic_cast<AliVTrack*>( (InputEvent())->GetTrack( TrckIdx ) );
2487 if (!lCurrentTrck ) {
2488 AliWarning("ERROR Correl. Study : Could not retrieve a track while looping over the event tracks ...");
2492 // Room for improvement: //FIXME
2493 // 1. Loop only on primary tracks ?
2494 // 2. Exclude the tracks that build the condisdered cascade = the bachelor + the V0 dghters
2495 // This may bias the outcome, especially for low multplicity events.
2496 // Note : For ESD event, track ID == track index.
2497 if(lCurrentTrck->GetID() == lArrTrackID[0]) continue;
2498 if(lCurrentTrck->GetID() == lArrTrackID[1]) continue;
2499 if(lCurrentTrck->GetID() == lArrTrackID[2]) continue;
2501 TVector3 lTVect3MomTrck(lCurrentTrck->Px(), lCurrentTrck->Py(), lCurrentTrck->Pz() );
2503 // 2 hypotheses made here :
2504 // - The Xi trajectory is a straight line,
2505 // - The Xi doesn't loose any energy by crossing the first layer(s) of ITS, if ever;
2506 // So, meaning hyp: vect p(Xi) at the emission = vect p(Xi) at the decay vertex
2507 // By doing this, we introduce a systematic error on the cascade Phi ...
2508 // Room for improvement: take into account the curvature of the Xi trajectory //FIXME
2510 Double_t lHnSpFillVar[5] = {0.};
2511 lHnSpFillVar[0] = lTVect3MomXi.DeltaPhi(lTVect3MomTrck) * 180.0/TMath::Pi(); // Delta phi(Casc,Track) (deg)
2512 if(lHnSpFillVar[0] < -50.0) lHnSpFillVar[0] += 360.0;
2513 lHnSpFillVar[1] = lEtaXi - lCurrentTrck->Eta(); // Delta eta(Casc,Track)
2514 lHnSpFillVar[2] = lTVect3MomXi.Pt(); // Pt_{Casc}
2515 lHnSpFillVar[3] = lCurrentTrck->Pt(); // Pt_{any track}
2516 lHnSpFillVar[4] = lInvMassCascade; // Eff. Inv Mass (control var)
2518 if( lStrCascType.Contains("Xi-") ) fHnSpAngularCorrXiMinus ->Fill( lHnSpFillVar );
2519 else if( lStrCascType.Contains("Xi+") ) fHnSpAngularCorrXiPlus ->Fill( lHnSpFillVar );
2520 else if( lStrCascType.Contains("Omega-") ) fHnSpAngularCorrOmegaMinus ->Fill( lHnSpFillVar );
2521 else if( lStrCascType.Contains("Omega+") ) fHnSpAngularCorrOmegaPlus ->Fill( lHnSpFillVar );
2523 }// end - Loop over all the tracks in the event
2527 Int_t AliAnalysisTaskCheckCascade::DoESDTrackWithTPCrefitMultiplicity(const AliESDEvent *lESDevent)
2529 // Checking the number of tracks with TPCrefit for each event
2530 // Needed for a rough assessment of the event multiplicity
2532 Int_t nTrackWithTPCrefitMultiplicity = 0;
2533 for(Int_t iTrackIdx = 0; iTrackIdx < (InputEvent())->GetNumberOfTracks(); iTrackIdx++){
2534 AliESDtrack *esdTrack = 0x0;
2535 esdTrack = lESDevent->GetTrack( iTrackIdx );
2536 if (!esdTrack) { AliWarning("Pb / Could not retrieve one track within the track loop for TPCrefit check ..."); continue; }
2538 ULong_t lTrackStatus = esdTrack->GetStatus();
2539 if ((lTrackStatus&AliESDtrack::kTPCrefit) == 0) continue;
2540 else nTrackWithTPCrefitMultiplicity++;
2542 // The goal here is to get a better assessment of the event multiplicity.
2543 // (InputEvent())->GetNumberOfTracks() takes into account ITS std alone tracks + global tracks
2544 // This may introduce a bias. Hence the number of TPC refit tracks.
2545 // Note : the event multiplicity = analysis on its own... See Jacek's or Jan Fiete's analysis on dN/d(eta)
2547 }// end loop over all event tracks
2548 return nTrackWithTPCrefitMultiplicity;
2555 //________________________________________________________________________
2556 void AliAnalysisTaskCheckCascade::Terminate(Option_t *)
2558 // Draw result to the screen
2559 // Called once at the end of the query
2561 TList *cRetrievedList = 0x0;
2562 cRetrievedList = (TList*)GetOutputData(1);
2563 if(!cRetrievedList){
2564 AliWarning("ERROR - AliAnalysisTaskCheckCascade: ouput data container list not available\n"); return;
2567 fHistTrackMultiplicityForTrigEvt = dynamic_cast<TH1F*> ( cRetrievedList->FindObject("fHistTrackMultiplicityForTrigEvt") );
2568 if (!fHistTrackMultiplicityForTrigEvt) {
2569 AliWarning("ERROR - AliAnalysisTaskCheckCascade: fHistTrackMultiplicityForTrigEvt not available\n"); return;
2572 fHistCascadeMultiplicityForTrigEvt = dynamic_cast<TH1F*> ( cRetrievedList->FindObject("fHistCascadeMultiplicityForTrigEvt") );
2573 if (!fHistCascadeMultiplicityForTrigEvt) {
2574 AliWarning("ERROR - AliAnalysisTaskCheckCascade: fHistCascadeMultiplicityForTrigEvt not available\n"); return;
2577 fHistMassXiMinus = dynamic_cast<TH1F*> ( cRetrievedList->FindObject("fHistMassXiMinus") );
2578 if (!fHistMassXiMinus) {
2579 AliWarning("ERROR - AliAnalysisTaskCheckCascade: fHistMassXiMinus not available\n"); return;
2581 fHistMassXiPlus = dynamic_cast<TH1F*> ( cRetrievedList->FindObject("fHistMassXiPlus") );
2582 if (!fHistMassXiPlus) {
2583 AliWarning("ERROR - AliAnalysisTaskCheckCascade: fHistMassXiPlus not available\n"); return;
2585 fHistMassOmegaMinus = dynamic_cast<TH1F*> ( cRetrievedList->FindObject("fHistMassOmegaMinus") );
2586 if (!fHistMassOmegaMinus) {
2587 AliWarning("ERROR - AliAnalysisTaskCheckCascade: fHistMassOmegaMinus not available\n"); return;
2589 fHistMassOmegaPlus = dynamic_cast<TH1F*> ( cRetrievedList->FindObject("fHistMassOmegaPlus") );
2590 if (!fHistMassOmegaPlus) {
2591 AliWarning("ERROR - AliAnalysisTaskCheckCascade: fHistMassOmegaPlus not available\n"); return;
2594 TCanvas *canCheckCascade = new TCanvas("AliAnalysisTaskCheckCascade","CheckCascade overview",10,10,1010,660);
2595 canCheckCascade->Divide(2,2);
2597 canCheckCascade->cd(1);
2598 canCheckCascade->cd(1)->SetLogy();
2599 fHistTrackMultiplicityForTrigEvt->SetMarkerStyle(kFullStar);
2600 fHistTrackMultiplicityForTrigEvt->GetXaxis()->SetLabelFont(42);
2601 fHistTrackMultiplicityForTrigEvt->GetYaxis()->SetLabelFont(42);
2602 fHistTrackMultiplicityForTrigEvt->SetTitleFont(42, "xy");
2603 fHistTrackMultiplicityForTrigEvt->GetXaxis()->SetTitleOffset(1.1);
2604 fHistTrackMultiplicityForTrigEvt->DrawCopy("H");
2606 canCheckCascade->cd(2);
2607 canCheckCascade->cd(2)->SetLogy();
2608 fHistCascadeMultiplicityForTrigEvt->SetMarkerStyle(kOpenSquare);
2609 fHistCascadeMultiplicityForTrigEvt->GetXaxis()->SetLabelFont(42);
2610 fHistCascadeMultiplicityForTrigEvt->GetYaxis()->SetLabelFont(42);
2611 fHistCascadeMultiplicityForTrigEvt->SetTitleFont(42, "xy");
2612 fHistCascadeMultiplicityForTrigEvt->GetXaxis()->SetTitleOffset(1.1);
2613 fHistCascadeMultiplicityForTrigEvt->DrawCopy("E");
2615 canCheckCascade->cd(3);
2616 fHistMassXiMinus ->SetMarkerStyle(kFullCircle);
2617 fHistMassXiMinus ->SetMarkerSize(0.5);
2618 fHistMassXiMinus ->GetXaxis()->SetLabelFont(42);
2619 fHistMassXiMinus ->GetYaxis()->SetLabelFont(42);
2620 fHistMassXiMinus ->SetTitleFont(42, "xy");
2621 fHistMassXiMinus ->GetXaxis()->SetTitleOffset(1.1);
2622 fHistMassXiMinus ->GetYaxis()->SetTitleOffset(1.3);
2623 // fHistMassXiMinus->Rebin(2);
2624 fHistMassXiMinus ->GetXaxis()->SetRangeUser(1.24, 1.42);
2625 fHistMassXiMinus ->DrawCopy("E");
2627 fHistMassXiPlus ->SetMarkerStyle(kOpenCircle);
2628 fHistMassXiPlus ->SetMarkerColor(kRed+2);
2629 fHistMassXiPlus ->SetLineColor(kRed+2);
2630 fHistMassXiPlus ->SetMarkerSize(0.5);
2631 // fHistMassXiPlus ->Rebin(2);
2632 fHistMassXiPlus ->DrawCopy("ESAME");
2635 TLegend *legendeXi =new TLegend(0.67,0.34,0.97,0.54);
2636 legendeXi->SetTextFont(42);
2637 legendeXi->SetTextSize(0.05);
2638 legendeXi->SetFillColor(kWhite);
2639 legendeXi->AddEntry( fHistMassXiMinus,"#Xi^{-} candidates","lp");
2640 legendeXi->AddEntry( fHistMassXiPlus,"#Xi^{+} candidates","lp");
2644 canCheckCascade->cd(4);
2645 fHistMassOmegaPlus ->SetMarkerStyle(kOpenCircle);
2646 fHistMassOmegaPlus ->SetMarkerColor(kRed+2);
2647 fHistMassOmegaPlus ->SetLineColor(kRed+2);
2648 fHistMassOmegaPlus ->SetMarkerSize(0.5);
2649 fHistMassOmegaPlus ->GetXaxis()->SetLabelFont(42);
2650 fHistMassOmegaPlus ->GetYaxis()->SetLabelFont(42);
2651 fHistMassOmegaPlus ->SetTitleFont(42, "xy");
2652 fHistMassOmegaPlus ->GetXaxis()->SetTitleOffset(1.1);
2653 fHistMassOmegaPlus ->GetYaxis()->SetTitleOffset(1.25);
2654 // fHistMassOmegaPlus ->Rebin(2);
2655 fHistMassOmegaPlus ->GetXaxis()->SetRangeUser(1.6, 1.84);
2656 fHistMassOmegaPlus ->DrawCopy("E");
2658 fHistMassOmegaMinus->SetMarkerStyle(kFullCircle);
2659 fHistMassOmegaMinus->SetMarkerSize(0.5);
2660 // fHistMassOmegaMinus->Rebin(2);
2661 fHistMassOmegaMinus->DrawCopy("ESAME");
2664 TLegend *legendeOmega = new TLegend(0.67,0.34,0.97,0.54);
2665 legendeOmega->SetTextFont(42);
2666 legendeOmega->SetTextSize(0.05);
2667 legendeOmega->SetFillColor(kWhite);
2668 legendeOmega->AddEntry( fHistMassOmegaMinus,"#Omega^{-} candidates","lp");
2669 legendeOmega->AddEntry( fHistMassOmegaPlus,"#Omega^{+} candidates","lp");
2670 legendeOmega->Draw();