1 /**************************************************************************
2 * Authors : Antonin Maire, Boris Hippolyte *
3 * Contributors are mentioned in the code where appropriate. *
5 * Permission to use, copy, modify and distribute this software and its *
6 * documentation strictly for non-commercial purposes is hereby granted *
7 * without fee, provided that the above copyright notice appears in all *
8 * copies and that both the copyright notice and this permission notice *
9 * appear in the supporting documentation. The authors make no claims *
10 * about the suitability of this software for any purpose. It is *
11 * provided "as is" without express or implied warranty. *
12 **************************************************************************/
14 //-----------------------------------------------------------------
15 // AliAnalysisTaskCheckCascadePbPb class
17 // Origin AliAnalysisTaskCheckCascade which has four roles :
18 // 1. QAing the Cascades from ESD and AOD
19 // Origin: AliAnalysisTaskESDCheckV0 by Boris Hippolyte Nov2007, hippolyt@in2p3.fr
20 // 2. Prepare the plots which stand as raw material for yield extraction (wi/wo PID)
21 // 3. Supply an AliCFContainer meant to define the optimised topological selections
22 // 4. Rough azimuthal correlation study (Eta, Phi)
23 // Adapted to Cascade : A.Maire Mar2008, antonin.maire@ires.in2p3.fr
24 // Modified : A.Maire Mar2010
26 // Adapted to PbPb analysis: M. Nicassio, maria.nicassio@ba.infn.it
28 // - Physics selection moved to the run.C macro
29 // - Centrality selection added (+ setters)
30 // - setters added (vertex range)
31 // - histo added and histo/container binning changed
32 // - protection in the destructor for CAF usage
33 // - AliWarning disabled
34 // - automatic settings for PID
36 // - proper time histos/container added (V0 and Cascades)
38 // - re-run V0's and cascade's vertexers (SetCuts instead of SetDefaultCuts!!)
40 // - AOD analysis part completed
42 // - min number of TPC clusters for track selection as a parameter
44 // - cut on min pt for daughter tracks as a parameter
45 //-----------------------------------------------------------------
56 #include <Riostream.h>
61 #include "THnSparse.h"
69 #include "AliCentrality.h"
70 #include "AliESDEvent.h"
71 #include "AliAODEvent.h"
72 #include "AliV0vertexer.h"
73 #include "AliCascadeVertexer.h"
74 #include "AliESDtrackCuts.h"
75 #include "AliPIDResponse.h"
77 #include "AliESDVZERO.h"
79 #include "AliInputEventHandler.h"
80 #include "AliAnalysisManager.h"
81 #include "AliMCEventHandler.h"
82 #include "AliESDInputHandler.h"
83 #include "AliAODInputHandler.h"
84 #include "AliCFContainer.h"
85 #include "AliMultiplicity.h"
87 #include "AliESDcascade.h"
88 #include "AliAODcascade.h"
89 #include "AliAODTrack.h"
91 #include "AliAnalysisTaskCheckCascadePbPb.h"
93 ClassImp(AliAnalysisTaskCheckCascadePbPb)
97 //________________________________________________________________________
98 AliAnalysisTaskCheckCascadePbPb::AliAnalysisTaskCheckCascadePbPb()
99 : AliAnalysisTaskSE(), fAnalysisType("ESD"), fESDtrackCuts(0),/*fPaveTextBookKeeping(0),*/
101 fkRerunV0CascVertexers (0),
102 fkQualityCutZprimVtxPos (kTRUE),
103 fkQualityCutNoTPConlyPrimVtx(kTRUE),
104 fkQualityCutTPCrefit (kTRUE),
105 fkQualityCutnTPCcls (kTRUE),
107 fkExtraSelections (0),
113 fMinPtCutOnDaughterTracks (0),
116 // - Cascade part initialisation
118 fHistEvtsInCentralityBinsvsNtracks(0),
119 fHistCascadeMultiplicityBeforeEvSel(0),
120 fHistCascadeMultiplicityForCentrEvt(0), fHistTrackMultiplicityForCentrEvt(0), fHistTPCrefitTrackMultiplicityForCentrEvt(0),
121 fHistCascadeMultiplicityForSelEvt(0),
122 fHistPosBestPrimaryVtxXForSelEvt(0), fHistPosBestPrimaryVtxYForSelEvt(0), fHistPosBestPrimaryVtxZForSelEvt(0),
123 fHistTPCrefitTrackMultiplicityForCascadeEvt(0),
124 fHistPosV0TPCClusters(0), fHistNegV0TPCClusters(0), fHistBachTPCClusters(0),
127 fHistPosTrkgPrimaryVtxXForCascadeEvt(0), fHistPosTrkgPrimaryVtxYForCascadeEvt(0), fHistPosTrkgPrimaryVtxZForCascadeEvt(0), fHistTrkgPrimaryVtxRadius(0),
128 fHistPosBestPrimaryVtxXForCascadeEvt(0), fHistPosBestPrimaryVtxYForCascadeEvt(0), fHistPosBestPrimaryVtxZForCascadeEvt(0), fHistBestPrimaryVtxRadius(0),
129 f2dHistTrkgPrimVtxVsBestPrimVtx(0),
131 fHistEffMassXi(0), fHistChi2Xi(0),
133 fHistDcaXiDaughters(0), fHistDcaBachToPrimVertex(0), fHistXiCosineOfPointingAngle(0), fHistXiRadius(0),
135 fHistMassLambdaAsCascDghter(0),
137 fHistDcaV0DaughtersXi(0),
138 fHistDcaV0ToPrimVertexXi(0),
139 fHistV0CosineOfPointingAngle(0),
141 fHistDcaPosToPrimVertexXi(0), fHistDcaNegToPrimVertexXi(0),
143 fHistMassXiMinus(0), fHistMassXiPlus(0),
144 fHistMassOmegaMinus(0), fHistMassOmegaPlus(0),
145 fHistMassWithCombPIDXiMinus(0), fHistMassWithCombPIDXiPlus(0),
146 fHistMassWithCombPIDOmegaMinus(0), fHistMassWithCombPIDOmegaPlus(0),
148 fHistXiTransvMom(0), fHistXiTotMom(0),
149 fHistBachTransvMomXi(0), fHistBachTotMomXi(0),
150 fHistPosTransvMomXi(0), fHistNegTransvMomXi(0),
153 fHistV0toXiCosineOfPointingAngle(0),
155 fHistRapXi(0), fHistRapOmega(0), fHistEtaXi(0),
156 fHistThetaXi(0), fHistPhiXi(0),
158 f2dHistArmenteros(0),
159 f2dHistEffMassLambdaVsEffMassXiMinus(0), f2dHistEffMassXiVsEffMassOmegaMinus(0),
160 f2dHistEffMassLambdaVsEffMassXiPlus(0), f2dHistEffMassXiVsEffMassOmegaPlus(0),
161 f2dHistXiRadiusVsEffMassXiMinus(0), f2dHistXiRadiusVsEffMassXiPlus(0),
162 f2dHistXiRadiusVsEffMassOmegaMinus(0), f2dHistXiRadiusVsEffMassOmegaPlus(0),
164 f2dHistTPCdEdxOfCascDghters(0),
166 // f3dHistXiPtVsEffMassVsYXiMinus(0), f3dHistXiPtVsEffMassVsYXiPlus(0),
167 // f3dHistXiPtVsEffMassVsYOmegaMinus(0), f3dHistXiPtVsEffMassVsYOmegaPlus(0),
169 fCFContCascadePIDXiMinus(0),
170 fCFContCascadePIDXiPlus(0),
171 fCFContCascadePIDOmegaMinus(0),
172 fCFContCascadePIDOmegaPlus(0),
173 fCFContCascadeCuts(0),
175 // fHnSpAngularCorrXiMinus(0), fHnSpAngularCorrXiPlus(0),
176 // fHnSpAngularCorrOmegaMinus(0), fHnSpAngularCorrOmegaPlus(0),
179 fHistDcaXiDaughtersvsInvMass(0), fHistDcaBachToPrimVertexvsInvMass(0), fHistXiCosineOfPointingAnglevsInvMass(0),
180 fHistMassLambdaAsCascDghtervsInvMass(0),fHistDcaV0DaughtersXivsInvMass(0),fHistDcaV0ToPrimVertexXivsInvMass(0)
185 for(Int_t iV0selIdx = 0; iV0selIdx < 7; iV0selIdx++ ) { fV0Sels [iV0selIdx ] = -1.; }
186 for(Int_t iCascSelIdx = 0; iCascSelIdx < 8; iCascSelIdx++ ) { fCascSels [iCascSelIdx ] = -1.; }
190 //________________________________________________________________________
191 AliAnalysisTaskCheckCascadePbPb::AliAnalysisTaskCheckCascadePbPb(const char *name)
192 : AliAnalysisTaskSE(name), fAnalysisType("ESD"), fESDtrackCuts(0), /*fPaveTextBookKeeping(0),*/
194 fkRerunV0CascVertexers (0),
195 fkQualityCutZprimVtxPos (kTRUE),
196 fkQualityCutNoTPConlyPrimVtx(kTRUE),
197 fkQualityCutTPCrefit (kTRUE),
198 fkQualityCutnTPCcls (kTRUE),
200 fkExtraSelections (0),
206 fMinPtCutOnDaughterTracks (0),
208 // - Cascade part initialisation
210 fHistEvtsInCentralityBinsvsNtracks(0),
211 fHistCascadeMultiplicityBeforeEvSel(0),
212 fHistCascadeMultiplicityForCentrEvt(0), fHistTrackMultiplicityForCentrEvt(0), fHistTPCrefitTrackMultiplicityForCentrEvt(0),
213 fHistCascadeMultiplicityForSelEvt(0),
214 fHistPosBestPrimaryVtxXForSelEvt(0), fHistPosBestPrimaryVtxYForSelEvt(0), fHistPosBestPrimaryVtxZForSelEvt(0),
215 fHistTPCrefitTrackMultiplicityForCascadeEvt(0),
216 fHistPosV0TPCClusters(0), fHistNegV0TPCClusters(0), fHistBachTPCClusters(0),
219 fHistPosTrkgPrimaryVtxXForCascadeEvt(0), fHistPosTrkgPrimaryVtxYForCascadeEvt(0), fHistPosTrkgPrimaryVtxZForCascadeEvt(0), fHistTrkgPrimaryVtxRadius(0),
220 fHistPosBestPrimaryVtxXForCascadeEvt(0), fHistPosBestPrimaryVtxYForCascadeEvt(0), fHistPosBestPrimaryVtxZForCascadeEvt(0), fHistBestPrimaryVtxRadius(0),
221 f2dHistTrkgPrimVtxVsBestPrimVtx(0),
223 fHistEffMassXi(0), fHistChi2Xi(0),
224 fHistDcaXiDaughters(0), fHistDcaBachToPrimVertex(0), fHistXiCosineOfPointingAngle(0), fHistXiRadius(0),
226 fHistMassLambdaAsCascDghter(0),
228 fHistDcaV0DaughtersXi(0),
229 fHistDcaV0ToPrimVertexXi(0),
230 fHistV0CosineOfPointingAngle(0),
232 fHistDcaPosToPrimVertexXi(0), fHistDcaNegToPrimVertexXi(0),
234 fHistMassXiMinus(0), fHistMassXiPlus(0),
235 fHistMassOmegaMinus(0), fHistMassOmegaPlus(0),
236 fHistMassWithCombPIDXiMinus(0), fHistMassWithCombPIDXiPlus(0),
237 fHistMassWithCombPIDOmegaMinus(0), fHistMassWithCombPIDOmegaPlus(0),
239 fHistXiTransvMom(0), fHistXiTotMom(0),
240 fHistBachTransvMomXi(0), fHistBachTotMomXi(0),
241 fHistPosTransvMomXi(0), fHistNegTransvMomXi(0),
244 fHistV0toXiCosineOfPointingAngle(0),
246 fHistRapXi(0), fHistRapOmega(0), fHistEtaXi(0),
247 fHistThetaXi(0), fHistPhiXi(0),
249 f2dHistArmenteros(0),
250 f2dHistEffMassLambdaVsEffMassXiMinus(0), f2dHistEffMassXiVsEffMassOmegaMinus(0),
251 f2dHistEffMassLambdaVsEffMassXiPlus(0), f2dHistEffMassXiVsEffMassOmegaPlus(0),
252 f2dHistXiRadiusVsEffMassXiMinus(0), f2dHistXiRadiusVsEffMassXiPlus(0),
253 f2dHistXiRadiusVsEffMassOmegaMinus(0), f2dHistXiRadiusVsEffMassOmegaPlus(0),
255 f2dHistTPCdEdxOfCascDghters(0),
257 // f3dHistXiPtVsEffMassVsYXiMinus(0), f3dHistXiPtVsEffMassVsYXiPlus(0),
258 // f3dHistXiPtVsEffMassVsYOmegaMinus(0), f3dHistXiPtVsEffMassVsYOmegaPlus(0),
260 fCFContCascadePIDXiMinus(0),
261 fCFContCascadePIDXiPlus(0),
262 fCFContCascadePIDOmegaMinus(0),
263 fCFContCascadePIDOmegaPlus(0),
264 fCFContCascadeCuts(0),
266 // fHnSpAngularCorrXiMinus(0), fHnSpAngularCorrXiPlus(0),
267 // fHnSpAngularCorrOmegaMinus(0), fHnSpAngularCorrOmegaPlus(0),
270 fHistDcaXiDaughtersvsInvMass(0), fHistDcaBachToPrimVertexvsInvMass(0), fHistXiCosineOfPointingAnglevsInvMass(0),
271 fHistMassLambdaAsCascDghtervsInvMass(0),fHistDcaV0DaughtersXivsInvMass(0),fHistDcaV0ToPrimVertexXivsInvMass(0)
277 // Define input and output slots here
278 // Input slot #0 works with a TChain
279 // DefineInput(0, TChain::Class());
280 // Output slot #1 writes into a TList container (cascade)
281 // default Pb-Pb values
282 fV0Sels[0] = 33. ; // max allowed chi2
283 fV0Sels[1] = 0.1; // min allowed impact parameter for the 1st daughter
284 fV0Sels[2] = 0.1; // min allowed impact parameter for the 2nd daughter
285 fV0Sels[3] = 1.; // max allowed DCA between the daughter tracks
286 fV0Sels[4] = .998 ;// min allowed cosine of V0's pointing angle
287 fV0Sels[5] = 0.9 ; // min radius of the fiducial volume
288 fV0Sels[6] = 100. ; // max radius of the fiducial volume
290 fCascSels[0] = 33. ; // max allowed chi2 (same as PDC07)
291 fCascSels[1] = 0.05; // min allowed V0 impact parameter
292 fCascSels[2] = 0.008; // "window" around the Lambda mass
293 fCascSels[3] = 0.03; // min allowed bachelor's impact parameter //check cuts
294 fCascSels[4] = 0.3 ; // max allowed DCA between the V0 and the bachelor
295 fCascSels[5] = 0.999 ;// min allowed cosine of the cascade pointing angle
296 fCascSels[6] = 0.9 ; // min radius of the fiducial volume
297 fCascSels[7] = 100. ; // max radius of the fiducial volume
299 // Output slot #0 writes into a TList container (Cascade)
300 DefineOutput(1, TList::Class());
301 DefineOutput(2, AliCFContainer::Class());
302 DefineOutput(3, AliCFContainer::Class());
303 DefineOutput(4, AliCFContainer::Class());
304 DefineOutput(5, AliCFContainer::Class());
305 DefineOutput(6, AliCFContainer::Class());
307 /*DefineOutput(2, TPaveText::Class());*/
308 AliLog::SetClassDebugLevel("AliAnalysisTaskCheckCascadePbPb",1); // MN this should (?) enable only AliFatal
312 AliAnalysisTaskCheckCascadePbPb::~AliAnalysisTaskCheckCascadePbPb() {
317 // For all TH1, 2, 3 HnSparse and CFContainer are in the fListCascade TList.
318 // They will be deleted when fListCascade is deleted by the TSelector dtor
319 // Because of TList::SetOwner() ...
321 if (fListHistCascade && !AliAnalysisManager::GetAnalysisManager()->IsProofMode()) { delete fListHistCascade; fListHistCascade = 0x0; }
322 if (fCFContCascadePIDXiMinus && !AliAnalysisManager::GetAnalysisManager()->IsProofMode()) { delete fCFContCascadePIDXiMinus; fCFContCascadePIDXiMinus = 0x0; }
323 if (fCFContCascadePIDXiPlus && !AliAnalysisManager::GetAnalysisManager()->IsProofMode()) { delete fCFContCascadePIDXiPlus; fCFContCascadePIDXiPlus = 0x0; }
324 if (fCFContCascadePIDOmegaMinus && !AliAnalysisManager::GetAnalysisManager()->IsProofMode()) { delete fCFContCascadePIDOmegaMinus; fCFContCascadePIDOmegaMinus = 0x0; }
325 if (fCFContCascadePIDOmegaPlus && !AliAnalysisManager::GetAnalysisManager()->IsProofMode()) { delete fCFContCascadePIDOmegaPlus; fCFContCascadePIDOmegaPlus = 0x0; }
326 if (fCFContCascadeCuts && !AliAnalysisManager::GetAnalysisManager()->IsProofMode()) { delete fCFContCascadePIDOmegaPlus; fCFContCascadeCuts = 0x0; }
328 if (fESDtrackCuts) { delete fESDtrackCuts; fESDtrackCuts = 0x0; }
329 //if (fPaveTextBookKeeping) { delete fPaveTextBookKeeping; fPaveTextBookKeeping = 0x0;} // fPaveTextBookKeeping is not strored in the TList
334 //________________________________________________________________________
335 void AliAnalysisTaskCheckCascadePbPb::UserCreateOutputObjects() {
341 fListHistCascade = new TList();
342 fListHistCascade->SetOwner(); // See http://root.cern.ch/root/html/TCollection.html#TCollection:SetOwner
345 AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
346 AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
347 fPIDResponse = inputHandler->GetPIDResponse();
349 // Only used to get the number of primary reconstructed tracks
350 if (fAnalysisType == "ESD"&& (! fESDtrackCuts )){
351 fESDtrackCuts = AliESDtrackCuts::GetStandardITSTPCTrackCuts2010(kTRUE); // Std definition of primary (see kTRUE argument) tracks for 2010
352 // fESDtrackCuts->SetEtaRange(-0.8,+0.8);
353 // fESDtrackCuts->SetPtRange(0.15, 1e10);
354 Printf("CheckCascade - ESDtrackCuts set up to 2010 std ITS-TPC cuts...");
357 // Initialize cuts to re-run V0 and cascade vertexers
358 fV0Sels[0] = 33. ; // max allowed chi2
359 fV0Sels[1] = 0.1 ; // min allowed impact parameter for the 1st daughter
360 fV0Sels[2] = 0.1 ; // min allowed impact parameter for the 2nd daughter
361 fV0Sels[3] = 1. ; // max allowed DCA between the daughter tracks
362 fV0Sels[4] = .998; // min allowed cosine of V0's pointing angle
363 fV0Sels[5] = 0.9 ; // min radius of the fiducial volume
364 fV0Sels[6] = 100. ; // max radius of the fiducial volume
366 fCascSels[0] = 33. ; // max allowed chi2 (not used)
367 fCascSels[1] = 0.05 ; // min allowed V0 impact parameter
368 fCascSels[2] = 0.008 ; // "window" around the Lambda mass
369 fCascSels[3] = 0.05 ; // min allowed bachelor's impact parameter
370 fCascSels[4] = 0.3 ; // max allowed DCA between the V0 and the bachelor
371 fCascSels[5] = 0.9989; // min allowed cosine of the cascade pointing angle
372 fCascSels[6] = 0.9 ; // min radius of the fiducial volume
373 fCascSels[7] = 100. ;
377 if( !fPaveTextBookKeeping){
378 // FIXME : prepare a field with the AliRoot+root distrib ...
380 fPaveTextBookKeeping = new TPaveText(0.1, 0.1, 0.9, 0.9,"NDC");
381 fPaveTextBookKeeping->SetName("fPaveTextBookKeeping");
382 fPaveTextBookKeeping->SetBorderSize(0);
383 fPaveTextBookKeeping->SetTextAlign(12);
384 fPaveTextBookKeeping->SetFillColor(kWhite);
385 fPaveTextBookKeeping->SetTextFont(42); // regular Arial or Helvetica,
386 fPaveTextBookKeeping->SetTextColor(kBlue+4);
388 fPaveTextBookKeeping->AddText( "Task CHECK CASCADE analysis" );
389 fPaveTextBookKeeping->AddText("- - - - - - - - - - - ");
390 fPaveTextBookKeeping->AddText( Form("AnalysisType : %s ", fAnalysisType.Data() ));
392 else fPaveTextBookKeeping->AddText("Colliding system : A-A collisions ");
394 fPaveTextBookKeeping->AddText("- - - - - - - - - - - ");
396 if(fkRerunV0CascVertexers){
397 fPaveTextBookKeeping->AddText("A.1. With V0 vertexer : ");
398 fPaveTextBookKeeping->AddText( Form(" - V0 #chi^{2} _________________ < %.3f ", fV0Sels[0] ));
399 fPaveTextBookKeeping->AddText( Form(" - DCA(prim. Vtx/ 1^{st} daughter) ___ > %.3f cm ", fV0Sels[1] ));
400 fPaveTextBookKeeping->AddText( Form(" - DCA(prim. Vtx/ 2^{nd} daughter) __ > %.3f cm", fV0Sels[2] ));
401 fPaveTextBookKeeping->AddText( Form(" - DCA between V0 daughters ___ < %.3f cm", fV0Sels[3] ));
402 fPaveTextBookKeeping->AddText( Form(" - cos(V0 pointing angle) _______ > %.3f ", fV0Sels[4] ));
403 fPaveTextBookKeeping->AddText( Form(" - R_{transv}(V0 decay) ________ > %.3f cm", fV0Sels[5] ));
404 fPaveTextBookKeeping->AddText( Form(" - R_{transv}(V0 decay) ________ < %.3f cm", fV0Sels[6] ));
406 fPaveTextBookKeeping->AddText(" ");
408 fPaveTextBookKeeping->AddText("A.2. With Casc. vertexer : ");
409 fPaveTextBookKeeping->AddText( Form(" - Casc. #chi^{2} ______________ < %.3f ", fCascSels[0] ));
410 fPaveTextBookKeeping->AddText( Form(" - DCA(prim. Vtx/ V0) _________ > %.3f cm", fCascSels[1] ));
411 fPaveTextBookKeeping->AddText( Form(" - | M_{#Lambda}(reco) - M_{#Lambda}(pdg) | _______ < %.3f GeV/c^{2}", fCascSels[2] ));
412 fPaveTextBookKeeping->AddText( Form(" - DCA(prim. Vtx/ Bach) _______ > %.3f cm", fCascSels[3] ));
413 fPaveTextBookKeeping->AddText( Form(" - DCA between Bach/ #Lambda ______ < %.3f cm", fCascSels[4] ));
414 fPaveTextBookKeeping->AddText( Form(" - cos(Casc. pointing angle) ____ > %.3f ", fCascSels[5] ));
415 fPaveTextBookKeeping->AddText( Form(" - R_{transv}(Casc. decay) ______ > %.3f cm", fCascSels[6] ));
416 fPaveTextBookKeeping->AddText( Form(" - R_{transv}(Casc. decay) ______ < %.3f cm", fCascSels[7] ));
418 else{ fPaveTextBookKeeping->AddText("A. No rerunning of the V0/Casc. vertexers ... See std cuts in (AliRoot+Rec.C) used for this prod. cycle");}
420 fPaveTextBookKeeping->AddText("- - - - - - - - - - - ");
422 if(fkQualityCutZprimVtxPos) fPaveTextBookKeeping->AddText("B. Quality Cut(prim. Vtx z-Pos) = ON ");
423 else fPaveTextBookKeeping->AddText("B. Quality Cut(prim. Vtx z-Pos) = Off ");
424 if(fkQualityCutNoTPConlyPrimVtx) fPaveTextBookKeeping->AddText("C. Quality Cut(No TPC prim. vtx) = ON ");
425 else fPaveTextBookKeeping->AddText("C. Quality Cut(No TPC prim. vtx) = Off ");
426 if(fkQualityCutTPCrefit) fPaveTextBookKeeping->AddText("D. Quality Cut(TPCrefit) = ON ");
427 else fPaveTextBookKeeping->AddText("D. Quality Cut(TPCrefit) = Off ");
428 if(fkQualityCutnTPCcls) fPaveTextBookKeeping->AddText("E. Quality Cut(min n TPC clusters) = ON ");
429 else fPaveTextBookKeeping->AddText("E. Quality Cut(min n TPC clusters) = Off ");
430 if(fkExtraSelections) fPaveTextBookKeeping->AddText("F. Extra Analysis Selections = ON ");
431 else fPaveTextBookKeeping->AddText("F. Extra Analysis Selections = Off ");
433 fPaveTextBookKeeping->AddText("- - - - - - - - - - - ");
440 // Events in centraity bins
441 Double_t centBinLimits[12] = {0.,5.,10.,20.,30.,40.,50.,60.,70.,80.,90.,100.};
442 fHistEvtsInCentralityBinsvsNtracks = new TH2F("fHistEvtsInCentralityBinsvsNtracks","",11,centBinLimits,100,0.,6000.);
443 fListHistCascade->Add(fHistEvtsInCentralityBinsvsNtracks);
445 if(! fHistCascadeMultiplicityBeforeEvSel) {
446 fHistCascadeMultiplicityBeforeEvSel = new TH1F("fHistCascadeMultiplicityBeforeEvSel",
447 "Cascades per event (before vertex and centrality selections);Nbr of Cascades/Evt;Events",
449 fListHistCascade->Add(fHistCascadeMultiplicityBeforeEvSel);
452 // - Histos for events passing the trigger selection
455 if(! fHistCascadeMultiplicityForCentrEvt) {
456 fHistCascadeMultiplicityForCentrEvt = new TH1F("fHistCascadeMultiplicityForCentrEvt",
457 "Cascades per event (for triggered evt);Nbr of Cascades/Evt;Events",
459 fListHistCascade->Add(fHistCascadeMultiplicityForCentrEvt);
463 if(! fHistTrackMultiplicityForCentrEvt) {
464 fHistTrackMultiplicityForCentrEvt = new TH1F("fHistTrackMultiplicityForCentrEvt",
465 "Track Multiplicity (for triggered evt);Nbr of tracks/Evt;Events",
467 fListHistCascade->Add(fHistTrackMultiplicityForCentrEvt);
470 if(! fHistTPCrefitTrackMultiplicityForCentrEvt) {
471 fHistTPCrefitTrackMultiplicityForCentrEvt = new TH1F("fHistTPCrefitTrackMultiplicityForCentrEvt",
472 "TPCrefit track Multiplicity (for triggered evt);Nbr of TPCrefit tracks/Evt;Events",
474 fListHistCascade->Add(fHistTPCrefitTrackMultiplicityForCentrEvt);
477 // - Histos for events passing the event selection at the analysis level
480 if(! fHistCascadeMultiplicityForSelEvt) {
481 fHistCascadeMultiplicityForSelEvt = new TH1F("fHistCascadeMultiplicityForSelEvt",
482 "Cascades per event;Nbr of Cascades/Evt;Events",
484 fListHistCascade->Add(fHistCascadeMultiplicityForSelEvt);
487 if(! fHistPosBestPrimaryVtxXForSelEvt ){
488 fHistPosBestPrimaryVtxXForSelEvt = new TH1F( "fHistPosBestPrimaryVtxXForSelEvt" , "Best Prim. Vertex Position in x; x (cm); Events" , 360, -0.9, 0.9 );
489 fListHistCascade->Add(fHistPosBestPrimaryVtxXForSelEvt);
492 if(! fHistPosBestPrimaryVtxYForSelEvt){
493 fHistPosBestPrimaryVtxYForSelEvt = new TH1F( "fHistPosBestPrimaryVtxYForSelEvt" , "Best Prim. Vertex Position in y; y (cm); Events" , 360, -0.9, 0.9 );
494 fListHistCascade->Add(fHistPosBestPrimaryVtxYForSelEvt);
497 if(! fHistPosBestPrimaryVtxZForSelEvt ){
498 fHistPosBestPrimaryVtxZForSelEvt = new TH1F( "fHistPosBestPrimaryVtxZForSelEvt" , "Best Prim. Vertex Position in z; z (cm); Events" , 300, -30.0, 30.0 );
499 fListHistCascade->Add(fHistPosBestPrimaryVtxZForSelEvt);
505 // - Histos for events containing at least ONE CASCADE
508 if(! fHistTPCrefitTrackMultiplicityForCascadeEvt) {
509 fHistTPCrefitTrackMultiplicityForCascadeEvt = new TH1F("fHistTPCrefitTrackMultiplicityForCascadeEvt",
510 "TPCrefit track Multiplicity (for evt with Casc.);Nbr of TPCrefit tracks/Evt with cascade(s);Events",
512 fListHistCascade->Add(fHistTPCrefitTrackMultiplicityForCascadeEvt);
515 if(! fHistPosV0TPCClusters ){
516 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);
517 fListHistCascade->Add(fHistPosV0TPCClusters);
520 if(! fHistNegV0TPCClusters ){
521 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);
522 fListHistCascade->Add(fHistNegV0TPCClusters);
525 if(! fHistBachTPCClusters ){
526 fHistBachTPCClusters = new TH1F("fHistBachTPCClusters", "TPC clusters for Bachelor track; Nbr of TPC clusters (Bach); Track counts", 165, 0.0 ,165.0);
527 fListHistCascade->Add(fHistBachTPCClusters);
532 if(! fHistVtxStatus ){
533 fHistVtxStatus = new TH1F( "fHistVtxStatus" , "Does a Trckg Prim.vtx exist ?; true=1 or false=0; Nb of Events" , 4, -1.0, 3.0 );
534 fListHistCascade->Add(fHistVtxStatus);
538 // - Vertex Positions
540 if(! fHistPosTrkgPrimaryVtxXForCascadeEvt ){
541 fHistPosTrkgPrimaryVtxXForCascadeEvt = new TH1F( "fHistPosTrkgPrimaryVtxXForCascadeEvt" , "Trkg Prim. Vertex Position in x; x (cm); Events" , 120, -0.6, 0.6 );
542 fListHistCascade->Add(fHistPosTrkgPrimaryVtxXForCascadeEvt);
546 if(! fHistPosTrkgPrimaryVtxYForCascadeEvt){
547 fHistPosTrkgPrimaryVtxYForCascadeEvt = new TH1F( "fHistPosTrkgPrimaryVtxYForCascadeEvt" , "Trkg Prim. Vertex Position in y; y (cm); Events" , 120, -0.6, 0.6 );
548 fListHistCascade->Add(fHistPosTrkgPrimaryVtxYForCascadeEvt);
551 if(! fHistPosTrkgPrimaryVtxZForCascadeEvt ){
552 fHistPosTrkgPrimaryVtxZForCascadeEvt = new TH1F( "fHistPosTrkgPrimaryVtxZForCascadeEvt" , "Trkg Prim. Vertex Position in z; z (cm); Events" , 200, -20.0, 20.0 );
553 fListHistCascade->Add(fHistPosTrkgPrimaryVtxZForCascadeEvt);
556 if(! fHistTrkgPrimaryVtxRadius ){
557 fHistTrkgPrimaryVtxRadius = new TH1F( "fHistTrkgPrimaryVtxRadius", "Trkg Prim. Vertex radius; r (cm); Events" , 150, 0., 15.0 );
558 fListHistCascade->Add(fHistTrkgPrimaryVtxRadius);
564 if(! fHistPosBestPrimaryVtxXForCascadeEvt ){
565 fHistPosBestPrimaryVtxXForCascadeEvt = new TH1F( "fHistPosBestPrimaryVtxXForCascadeEvt" , "Best Prim. Vertex Position in x; x (cm); Events" , 120, -0.6, 0.6 );
566 fListHistCascade->Add(fHistPosBestPrimaryVtxXForCascadeEvt);
569 if(! fHistPosBestPrimaryVtxYForCascadeEvt){
570 fHistPosBestPrimaryVtxYForCascadeEvt = new TH1F( "fHistPosBestPrimaryVtxYForCascadeEvt" , "Best Prim. Vertex Position in y; y (cm); Events" , 120, -0.6, 0.6 );
571 fListHistCascade->Add(fHistPosBestPrimaryVtxYForCascadeEvt);
574 if(! fHistPosBestPrimaryVtxZForCascadeEvt ){
575 fHistPosBestPrimaryVtxZForCascadeEvt = new TH1F( "fHistPosBestPrimaryVtxZForCascadeEvt" , "Best Prim. Vertex Position in z; z (cm); Events" , 200, -20.0, 20.0 );
576 fListHistCascade->Add(fHistPosBestPrimaryVtxZForCascadeEvt);
579 if(! fHistBestPrimaryVtxRadius ){
580 fHistBestPrimaryVtxRadius = new TH1F( "fHistBestPrimaryVtxRadius", "Best Prim. vertex radius; r (cm); Events" , 150, 0., 15.0 );
581 fListHistCascade->Add(fHistBestPrimaryVtxRadius);
584 if(! f2dHistTrkgPrimVtxVsBestPrimVtx) {
585 f2dHistTrkgPrimVtxVsBestPrimVtx = new TH2F( "f2dHistTrkgPrimVtxVsBestPrimVtx", "r_{Trck Prim. Vtx} Vs r_{Best Prim. Vtx}; r_{Track Vtx} (cm); r_{Best Vtx} (cm)", 150, 0., 15.0, 150, 0., 15.);
586 fListHistCascade->Add(f2dHistTrkgPrimVtxVsBestPrimVtx);
592 // - Typical histos for cascades
595 if(! fHistEffMassXi) {
596 fHistEffMassXi = new TH1F("fHistEffMassXi", "Cascade candidates ; Invariant Mass (GeV/c^{2}) ; Counts", 400, 1.2, 2.0);
597 fListHistCascade->Add(fHistEffMassXi);
601 fHistChi2Xi = new TH1F("fHistChi2Xi", "Cascade #chi^{2}; #chi^{2}; Number of Cascades", 160, 0, 40);
602 fListHistCascade->Add(fHistChi2Xi);
605 if(! fHistDcaXiDaughters ){
606 fHistDcaXiDaughters = new TH1F( "fHistDcaXiDaughters", "DCA between Xi Daughters; DCA (cm) ; Number of Cascades", 100, 0., 0.5);
607 fListHistCascade->Add(fHistDcaXiDaughters);
610 if(! fHistDcaBachToPrimVertex) {
611 fHistDcaBachToPrimVertex = new TH1F("fHistDcaBachToPrimVertex", "DCA of Bach. to Prim. Vertex;DCA (cm);Number of Cascades", 250, 0., 0.25);
612 fListHistCascade->Add(fHistDcaBachToPrimVertex);
615 if(! fHistXiCosineOfPointingAngle) {
616 fHistXiCosineOfPointingAngle = new TH1F("fHistXiCosineOfPointingAngle", "Cosine of Xi Pointing Angle; Cos (Xi Point.Angl);Number of Xis", 101, 0.99, 1.0001);
617 fListHistCascade->Add(fHistXiCosineOfPointingAngle);
620 if(! fHistXiRadius ){
621 fHistXiRadius = new TH1F( "fHistXiRadius", "Casc. decay transv. radius; r (cm); Counts" , 1050, 0., 105.0 );
622 fListHistCascade->Add(fHistXiRadius);
626 // - Histos about ~ the "V0 part" of the cascade, coming by inheritance from AliESDv0
630 if (! fHistMassLambdaAsCascDghter) {
631 fHistMassLambdaAsCascDghter = new TH1F("fHistMassLambdaAsCascDghter","#Lambda associated to Casc. candidates;Eff. Mass (GeV/c^{2});Counts", 300,1.00,1.3);
632 fListHistCascade->Add(fHistMassLambdaAsCascDghter);
635 if (! fHistV0Chi2Xi) {
636 fHistV0Chi2Xi = new TH1F("fHistV0Chi2Xi", "V0 #chi^{2}, in cascade; #chi^{2};Counts", 160, 0, 40);
637 fListHistCascade->Add(fHistV0Chi2Xi);
640 if (! fHistDcaV0DaughtersXi) {
641 fHistDcaV0DaughtersXi = new TH1F("fHistDcaV0DaughtersXi", "DCA between V0 daughters, in cascade;DCA (cm);Number of V0s", 240, 0., 1.2);
642 fListHistCascade->Add(fHistDcaV0DaughtersXi);
645 if (! fHistDcaV0ToPrimVertexXi) {
646 fHistDcaV0ToPrimVertexXi = new TH1F("fHistDcaV0ToPrimVertexXi", "DCA of V0 to Prim. Vertex, in cascade;DCA (cm);Number of Cascades", 200, 0., 1.);
647 fListHistCascade->Add(fHistDcaV0ToPrimVertexXi);
650 if (! fHistV0CosineOfPointingAngle) {
651 fHistV0CosineOfPointingAngle = new TH1F("fHistV0CosineOfPointingAngle", "Cosine of V0 Pointing Angle, in cascade;Cos(V0 Point. Angl); Counts", 200, 0.95, 1.0001);
652 fListHistCascade->Add(fHistV0CosineOfPointingAngle);
655 if (! fHistV0RadiusXi) {
656 fHistV0RadiusXi = new TH1F("fHistV0RadiusXi", "V0 decay radius, in cascade; radius (cm); Counts", 1050, 0., 105.0);
657 fListHistCascade->Add(fHistV0RadiusXi);
660 if (! fHistDcaPosToPrimVertexXi) {
661 fHistDcaPosToPrimVertexXi = new TH1F("fHistDcaPosToPrimVertexXi", "DCA of V0 pos daughter to Prim. Vertex;DCA (cm);Counts", 300, 0, 3);
662 fListHistCascade->Add(fHistDcaPosToPrimVertexXi);
665 if (! fHistDcaNegToPrimVertexXi) {
666 fHistDcaNegToPrimVertexXi = new TH1F("fHistDcaNegToPrimVertexXi", "DCA of V0 neg daughter to Prim. Vertex;DCA (cm);Counts", 300, 0, 3);
667 fListHistCascade->Add(fHistDcaNegToPrimVertexXi);
673 // - Effective mass histos for cascades.
675 if (! fHistMassXiMinus) {
676 fHistMassXiMinus = new TH1F("fHistMassXiMinus","#Xi^{-} candidates;M( #Lambda , #pi^{-} ) (GeV/c^{2});Counts", 400,1.2,2.0);
677 fListHistCascade->Add(fHistMassXiMinus);
680 if (! fHistMassXiPlus) {
681 fHistMassXiPlus = new TH1F("fHistMassXiPlus","#Xi^{+} candidates;M( #bar{#Lambda}^{0} , #pi^{+} ) (GeV/c^{2});Counts",400,1.2,2.0);
682 fListHistCascade->Add(fHistMassXiPlus);
685 if (! fHistMassOmegaMinus) {
686 fHistMassOmegaMinus = new TH1F("fHistMassOmegaMinus","#Omega^{-} candidates;M( #Lambda , K^{-} ) (GeV/c^{2});Counts", 500,1.5,2.5);
687 fListHistCascade->Add(fHistMassOmegaMinus);
690 if (! fHistMassOmegaPlus) {
691 fHistMassOmegaPlus = new TH1F("fHistMassOmegaPlus","#Omega^{+} candidates;M( #bar{#Lambda}^{0} , K^{+} ) (GeV/c^{2});Counts", 500,1.5,2.5);
692 fListHistCascade->Add(fHistMassOmegaPlus);
695 // By cascade hyp + bachelor PID
696 if (! fHistMassWithCombPIDXiMinus) {
697 fHistMassWithCombPIDXiMinus = new TH1F("fHistMassWithCombPIDXiMinus","#Xi^{-} candidates, with Bach. comb. PID;M( #Lambda , #pi^{-} ) (GeV/c^{2});Counts", 400,1.2,2.0);
698 fListHistCascade->Add(fHistMassWithCombPIDXiMinus);
701 if (! fHistMassWithCombPIDXiPlus) {
702 fHistMassWithCombPIDXiPlus = new TH1F("fHistMassWithCombPIDXiPlus","#Xi^{+} candidates, with Bach. comb. PID;M( #bar{#Lambda}^{0} , #pi^{+} ) (GeV/c^{2});Counts",400,1.2,2.0);
703 fListHistCascade->Add(fHistMassWithCombPIDXiPlus);
706 if (! fHistMassWithCombPIDOmegaMinus) {
707 fHistMassWithCombPIDOmegaMinus = new TH1F("fHistMassWithCombPIDOmegaMinus","#Omega^{-} candidates, with Bach. comb. PID;M( #Lambda , K^{-} ) (GeV/c^{2});Counts", 500,1.5,2.5);
708 fListHistCascade->Add(fHistMassWithCombPIDOmegaMinus);
711 if (! fHistMassWithCombPIDOmegaPlus) {
712 fHistMassWithCombPIDOmegaPlus = new TH1F("fHistMassWithCombPIDOmegaPlus","#Omega^{+} candidates, with Bach. comb. PID;M( #bar{#Lambda}^{0} , K^{+} ) (GeV/c^{2});Counts", 500,1.5,2.5);
713 fListHistCascade->Add(fHistMassWithCombPIDOmegaPlus);
718 // - Complements for QA
720 if(! fHistXiTransvMom ){
721 fHistXiTransvMom = new TH1F( "fHistXiTransvMom" , "#Xi transverse momentum (cand. around the mass peak) ; p_{t}(#Xi) (GeV/c); Counts", 100, 0.0, 10.0);
722 fListHistCascade->Add(fHistXiTransvMom);
725 if(! fHistXiTotMom ){
726 fHistXiTotMom = new TH1F( "fHistXiTotMom" , "#Xi momentum norm (cand. around the mass peak); p_{tot}(#Xi) (GeV/c); Counts", 150, 0.0, 15.0);
727 fListHistCascade->Add(fHistXiTotMom);
731 if(! fHistBachTransvMomXi ){
732 fHistBachTransvMomXi = new TH1F( "fHistBachTransvMomXi" , "#Xi Bach. transverse momentum (cand. around the mass peak) ; p_{t}(Bach.) (GeV/c); Counts", 100, 0.0, 5.0);
733 fListHistCascade->Add(fHistBachTransvMomXi);
736 if(! fHistBachTotMomXi ){
737 fHistBachTotMomXi = new TH1F( "fHistBachTotMomXi" , "#Xi Bach. momentum norm (cand. around the mass peak); p_{tot}(Bach.) (GeV/c); Counts", 100, 0.0, 5.0);
738 fListHistCascade->Add(fHistBachTotMomXi);
741 if(! fHistPosTransvMomXi ){
742 fHistPosTransvMomXi = new TH1F( "fHistPosTransvMomXi" , "#Xi Bach. transverse momentum (cand. around the mass peak) ; p_{t}(Bach.) (GeV/c); Counts", 100, 0.0, 5.0);
743 fListHistCascade->Add(fHistPosTransvMomXi);
746 if(! fHistNegTransvMomXi ){
747 fHistNegTransvMomXi = new TH1F( "fHistNegTransvMomXi" , "#Xi Bach. transverse momentum (cand. around the mass peak) ; p_{t}(Bach.) (GeV/c); Counts", 100, 0.0, 5.0);
748 fListHistCascade->Add(fHistNegTransvMomXi);
753 if(! fHistChargeXi ){
754 fHistChargeXi = new TH1F( "fHistChargeXi" , "Charge of casc. candidates ; Sign ; Counts", 5, -2.0, 3.0);
755 fListHistCascade->Add(fHistChargeXi);
759 if (! fHistV0toXiCosineOfPointingAngle) {
760 fHistV0toXiCosineOfPointingAngle = new TH1F("fHistV0toXiCosineOfPointingAngle", "Cos. of V0 Ptng Angl / Xi vtx ;Cos(V0 Point. Angl / Xi vtx); Counts", 200, 0.95, 1.0001);
761 fListHistCascade->Add(fHistV0toXiCosineOfPointingAngle);
766 fHistRapXi = new TH1F( "fHistRapXi" , "Rapidity of #Xi candidates (around the mass peak); y ; Counts", 20, -1.0, 1.0);
767 fListHistCascade->Add(fHistRapXi);
770 if(! fHistRapOmega ){
771 fHistRapOmega = new TH1F( "fHistRapOmega" , "Rapidity of #Omega candidates (around the mass peak); y ; Counts", 20, -1.0, 1.0);
772 fListHistCascade->Add(fHistRapOmega);
776 fHistEtaXi = new TH1F( "fHistEtaXi" , "Pseudo-rap. of #Xi candidates (around the mass peak) ; #eta ; Counts", 20, -1.0, 1.0);
777 fListHistCascade->Add(fHistEtaXi);
781 fHistThetaXi = new TH1F( "fHistThetaXi" , "#theta of #Xi candidates (around the mass peak); #theta (deg) ; Counts", 180, 0., 180.0);
782 fListHistCascade->Add(fHistThetaXi);
786 fHistPhiXi = new TH1F( "fHistPhiXi" , "#phi of #Xi candidates (around the mass peak); #phi (deg) ; Counts", 360, 0., 360.);
787 fListHistCascade->Add(fHistPhiXi);
791 if(! f2dHistArmenteros) {
792 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);
793 fListHistCascade->Add(f2dHistArmenteros);
798 if(! f2dHistEffMassLambdaVsEffMassXiMinus) {
799 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);
800 fListHistCascade->Add(f2dHistEffMassLambdaVsEffMassXiMinus);
803 if(! f2dHistEffMassXiVsEffMassOmegaMinus) {
804 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);
805 fListHistCascade->Add(f2dHistEffMassXiVsEffMassOmegaMinus);
808 if(! f2dHistEffMassLambdaVsEffMassXiPlus) {
809 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);
810 fListHistCascade->Add(f2dHistEffMassLambdaVsEffMassXiPlus);
813 if(! f2dHistEffMassXiVsEffMassOmegaPlus) {
814 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);
815 fListHistCascade->Add(f2dHistEffMassXiVsEffMassOmegaPlus);
820 if(! f2dHistXiRadiusVsEffMassXiMinus) {
821 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);
822 fListHistCascade->Add(f2dHistXiRadiusVsEffMassXiMinus);
825 if(! f2dHistXiRadiusVsEffMassXiPlus) {
826 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);
827 fListHistCascade->Add(f2dHistXiRadiusVsEffMassXiPlus);
830 if(! f2dHistXiRadiusVsEffMassOmegaMinus) {
831 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);
832 fListHistCascade->Add(f2dHistXiRadiusVsEffMassOmegaMinus);
835 if(! f2dHistXiRadiusVsEffMassOmegaPlus) {
836 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);
837 fListHistCascade->Add(f2dHistXiRadiusVsEffMassOmegaPlus);
840 if(! f2dHistTPCdEdxOfCascDghters){
841 f2dHistTPCdEdxOfCascDghters = new TH2F( "f2dHistTPCdEdxOfCascDghters", "TPC dE/dx of the cascade daughters; charge x || #vec{p}_{TPC inner wall}(Casc. daughter) || (GeV/c); TPC signal (ADC) ", 2000, -10.0, 10.0, 450, 0., 900.);
842 fListHistCascade->Add(f2dHistTPCdEdxOfCascDghters);
846 if(!fCFContCascadePIDXiMinus) {
847 const Int_t lNbSteps = 7 ;
848 const Int_t lNbVariables = 4 ;
850 //array for the number of bins in each dimension :
851 Int_t lNbBinsPerVar[4] = {0};
852 lNbBinsPerVar[0] = 100;
853 lNbBinsPerVar[1] = 800;
854 lNbBinsPerVar[2] = 22;
855 lNbBinsPerVar[3] = 11;
858 fCFContCascadePIDXiMinus = new AliCFContainer("fCFContCascadePIDXiMinus","Pt_{cascade} Vs M_{#Xi^{-} candidates} Vs Y_{#Xi}", lNbSteps, lNbVariables, lNbBinsPerVar );
860 //setting the bin limits
861 fCFContCascadePIDXiMinus->SetBinLimits(0, 0.0 , 10.0 ); // Pt(Cascade)
862 fCFContCascadePIDXiMinus->SetBinLimits(1, 1.2 , 2.0 ); // Xi Effective mass
863 fCFContCascadePIDXiMinus->SetBinLimits(2, -1.1 , 1.1 ); // Rapidity
865 Double_t *lBinLim3 = new Double_t[ lNbBinsPerVar[3]+1 ];
866 for(Int_t i=3; i< lNbBinsPerVar[3]+1;i++) lBinLim3[i] = (Double_t)(i-1)*10.;
870 fCFContCascadePIDXiMinus->SetBinLimits(3, lBinLim3 ); // Centrality
872 // Setting the step title : one per PID case
873 fCFContCascadePIDXiMinus->SetStepTitle(0, "No PID");
874 fCFContCascadePIDXiMinus->SetStepTitle(1, "TPC PID / 4-#sigma cut on Bachelor track");
875 fCFContCascadePIDXiMinus->SetStepTitle(2, "TPC PID / 4-#sigma cut on Bachelor+Baryon tracks");
876 fCFContCascadePIDXiMinus->SetStepTitle(3, "TPC PID / 4-#sigma cut on Bachelor+Baryon+Meson tracks");
877 fCFContCascadePIDXiMinus->SetStepTitle(4, "Comb. PID / Bachelor");
878 fCFContCascadePIDXiMinus->SetStepTitle(5, "Comb. PID / Bachelor+Baryon");
879 fCFContCascadePIDXiMinus->SetStepTitle(6, "Comb. PID / Bachelor+Baryon+Meson");
881 // Setting the variable title, per axis
882 fCFContCascadePIDXiMinus->SetVarTitle(0, "Pt_{cascade} (GeV/c)");
883 fCFContCascadePIDXiMinus->SetVarTitle(1, "M( #Lambda , #pi^{-} ) (GeV/c^{2})");
884 fCFContCascadePIDXiMinus->SetVarTitle(2, "Y_{#Xi}");
885 fCFContCascadePIDXiMinus->SetVarTitle(3, "Centrality");
888 if (!fCFContCascadePIDXiPlus) {
889 const Int_t lNbSteps = 7 ;
890 const Int_t lNbVariables = 4 ;
892 //array for the number of bins in each dimension :
893 Int_t lNbBinsPerVar[4] = {0};
894 lNbBinsPerVar[0] = 100;
895 lNbBinsPerVar[1] = 800;
896 lNbBinsPerVar[2] = 22;
897 lNbBinsPerVar[3] = 11;
899 fCFContCascadePIDXiPlus = new AliCFContainer("fCFContCascadePIDXiPlus","Pt_{cascade} Vs M_{#Xi^{+} candidates} Vs Y_{#Xi}", lNbSteps, lNbVariables, lNbBinsPerVar );
902 //setting the bin limits
903 fCFContCascadePIDXiPlus->SetBinLimits(0, 0.0 , 10.0 ); // Pt(Cascade)
904 fCFContCascadePIDXiPlus->SetBinLimits(1, 1.2 , 2.0 ); // Xi Effective mass
905 fCFContCascadePIDXiPlus->SetBinLimits(2, -1.1 , 1.1 ); // Rapidity
906 Double_t *lBinLim3 = new Double_t[ lNbBinsPerVar[3]+1 ];
907 for(Int_t i=3; i< lNbBinsPerVar[3]+1;i++) lBinLim3[i] = (Double_t)(i-1)*10.;
911 fCFContCascadePIDXiPlus->SetBinLimits(3,lBinLim3); // Centrality
913 // Setting the step title : one per PID case
914 fCFContCascadePIDXiPlus->SetStepTitle(0, "No PID");
915 fCFContCascadePIDXiPlus->SetStepTitle(1, "TPC PID / 4-#sigma cut on Bachelor track");
916 fCFContCascadePIDXiPlus->SetStepTitle(2, "TPC PID / 4-#sigma cut on Bachelor+Baryon tracks");
917 fCFContCascadePIDXiPlus->SetStepTitle(3, "TPC PID / 4-#sigma cut on Bachelor+Baryon+Meson tracks");
918 fCFContCascadePIDXiPlus->SetStepTitle(4, "Comb. PID / Bachelor");
919 fCFContCascadePIDXiPlus->SetStepTitle(5, "Comb. PID / Bachelor+Baryon");
920 fCFContCascadePIDXiPlus->SetStepTitle(6, "Comb. PID / Bachelor+Baryon+Meson");
922 // Setting the variable title, per axis
923 fCFContCascadePIDXiPlus->SetVarTitle(0, "Pt_{cascade} (GeV/c)");
924 fCFContCascadePIDXiPlus->SetVarTitle(1, "M( #Lambda , #pi^{+} ) (GeV/c^{2})");
925 fCFContCascadePIDXiPlus->SetVarTitle(2, "Y_{#Xi}");
926 fCFContCascadePIDXiPlus->SetVarTitle(3, "Centrality");
930 if(!fCFContCascadePIDOmegaMinus) {
931 const Int_t lNbSteps = 7 ;
932 const Int_t lNbVariables = 4 ;
934 //array for the number of bins in each dimension :
935 Int_t lNbBinsPerVar[4] = {0};
936 lNbBinsPerVar[0] = 100;
937 lNbBinsPerVar[1] = 1000;
938 lNbBinsPerVar[2] = 22;
939 lNbBinsPerVar[3] = 11;
942 fCFContCascadePIDOmegaMinus = new AliCFContainer("fCFContCascadePIDOmegaMinus","Pt_{cascade} Vs M_{#Omega^{-} candidates} Vs Y_{#Omega}", lNbSteps, lNbVariables, lNbBinsPerVar );
945 //setting the bin limits
946 fCFContCascadePIDOmegaMinus->SetBinLimits(0, 0.0 , 10.0 ); // Pt(Cascade)
947 fCFContCascadePIDOmegaMinus->SetBinLimits(1, 1.5 , 2.5 ); // Omega Effective mass
948 fCFContCascadePIDOmegaMinus->SetBinLimits(2, -1.1 , 1.1 ); // Rapidity
949 Double_t *lBinLim3 = new Double_t[ lNbBinsPerVar[3]+1 ];
950 for(Int_t i=3; i< lNbBinsPerVar[3]+1;i++) lBinLim3[i] = (Double_t)(i-1)*10.;
954 fCFContCascadePIDOmegaMinus->SetBinLimits(3,lBinLim3); // Centrality
955 // Setting the step title : one per PID case
956 fCFContCascadePIDOmegaMinus->SetStepTitle(0, "No PID");
957 fCFContCascadePIDOmegaMinus->SetStepTitle(1, "TPC PID / 4-#sigma cut on Bachelor track");
958 fCFContCascadePIDOmegaMinus->SetStepTitle(2, "TPC PID / 4-#sigma cut on Bachelor+Baryon tracks");
959 fCFContCascadePIDOmegaMinus->SetStepTitle(3, "TPC PID / 4-#sigma cut on Bachelor+Baryon+Meson tracks");
960 fCFContCascadePIDOmegaMinus->SetStepTitle(4, "Comb. PID / Bachelor");
961 fCFContCascadePIDOmegaMinus->SetStepTitle(5, "Comb. PID / Bachelor+Baryon");
962 fCFContCascadePIDOmegaMinus->SetStepTitle(6, "Comb. PID / Bachelor+Baryon+Meson");
964 // Setting the variable title, per axis
965 fCFContCascadePIDOmegaMinus->SetVarTitle(0, "Pt_{cascade} (GeV/c)");
966 fCFContCascadePIDOmegaMinus->SetVarTitle(1, "M( #Lambda , K^{-} ) (GeV/c^{2})");
967 fCFContCascadePIDOmegaMinus->SetVarTitle(2, "Y_{#Omega}");
968 fCFContCascadePIDOmegaMinus->SetVarTitle(3, "Centrality");
971 if(!fCFContCascadePIDOmegaPlus) {
972 const Int_t lNbSteps = 7 ;
973 const Int_t lNbVariables = 4 ;
975 //array for the number of bins in each dimension :
976 Int_t lNbBinsPerVar[4] = {0};
977 lNbBinsPerVar[0] = 100;
978 lNbBinsPerVar[1] = 1000;
979 lNbBinsPerVar[2] = 22;
980 lNbBinsPerVar[3] = 100;
983 fCFContCascadePIDOmegaPlus = new AliCFContainer("fCFContCascadePIDOmegaPlus","Pt_{cascade} Vs M_{#Omega^{+} candidates} Vs Y_{#Omega}", lNbSteps, lNbVariables, lNbBinsPerVar );
986 //setting the bin limits
987 fCFContCascadePIDOmegaPlus->SetBinLimits(0, 0.0 , 10.0 ); // Pt(Cascade)
988 fCFContCascadePIDOmegaPlus->SetBinLimits(1, 1.5 , 2.5 ); // Omega Effective mass
989 fCFContCascadePIDOmegaPlus->SetBinLimits(2, -1.1 , 1.1 ); // Rapidity
990 Double_t *lBinLim3 = new Double_t[ lNbBinsPerVar[3]+1 ];
991 for(Int_t i=3; i< lNbBinsPerVar[3]+1;i++) lBinLim3[i] = (Double_t)(i-1)*10.;
995 fCFContCascadePIDOmegaPlus->SetBinLimits(3,lBinLim3); // Centrality
997 // Setting the step title : one per PID case
998 fCFContCascadePIDOmegaPlus->SetStepTitle(0, "No PID");
999 fCFContCascadePIDOmegaPlus->SetStepTitle(1, "TPC PID / 4-#sigma cut on Bachelor track");
1000 fCFContCascadePIDOmegaPlus->SetStepTitle(2, "TPC PID / 4-#sigma cut on Bachelor+Baryon tracks");
1001 fCFContCascadePIDOmegaPlus->SetStepTitle(3, "TPC PID / 4-#sigma cut on Bachelor+Baryon+Meson tracks");
1002 fCFContCascadePIDOmegaPlus->SetStepTitle(4, "Comb. PID / Bachelor");
1003 fCFContCascadePIDOmegaPlus->SetStepTitle(5, "Comb. PID / Bachelor+Baryon");
1004 fCFContCascadePIDOmegaPlus->SetStepTitle(6, "Comb. PID / Bachelor+Baryon+Meson");
1006 // Setting the variable title, per axis
1007 fCFContCascadePIDOmegaPlus->SetVarTitle(0, "Pt_{cascade} (GeV/c)");
1008 fCFContCascadePIDOmegaPlus->SetVarTitle(1, "M( #Lambda , K^{+} ) (GeV/c^{2})");
1009 fCFContCascadePIDOmegaPlus->SetVarTitle(2, "Y_{#Omega}");
1010 fCFContCascadePIDOmegaPlus->SetVarTitle(3, "SPD tracklets Multiplicity");
1014 // Part 3 : Towards the optimisation of topological selections -------
1015 if(! fCFContCascadeCuts) {
1017 // Container meant to store all the relevant distributions corresponding to the cut variables.
1018 // - NB overflow/underflow of variables on which we want to cut later should be 0!!!
1019 const Int_t lNbSteps = 4 ;
1020 const Int_t lNbVariables = 22 ;
1021 //array for the number of bins in each dimension :
1022 Int_t lNbBinsPerVar[lNbVariables] = {0};
1023 lNbBinsPerVar[0] = 100;
1024 lNbBinsPerVar[1] = 126;
1025 lNbBinsPerVar[2] = 24;
1026 lNbBinsPerVar[3] = 220;
1027 lNbBinsPerVar[4] = 30;
1028 lNbBinsPerVar[5] = 50;
1030 lNbBinsPerVar[6] = 101;
1032 lNbBinsPerVar[7] = 102;
1033 lNbBinsPerVar[8] = 101;
1034 lNbBinsPerVar[9] = 26;
1035 lNbBinsPerVar[10] = 26;
1037 lNbBinsPerVar[11] = 150; // 75 2-MeV/c2 bins
1038 lNbBinsPerVar[12] = 120; // 60 2-MeV/c2 bins
1040 lNbBinsPerVar[13] = 100;
1042 lNbBinsPerVar[14] = 44; // 0.05 in rapidity units
1043 lNbBinsPerVar[15] = 44; // 0.05 in rapidity units
1045 lNbBinsPerVar[16] = 20;
1047 lNbBinsPerVar[17] = 11;
1048 lNbBinsPerVar[18] = 100;
1049 lNbBinsPerVar[19] = 112; // Proper time of cascade
1050 lNbBinsPerVar[20] = 112; // Proper time of V0
1051 lNbBinsPerVar[21] = 112; // Distance V0-Xi in transverse plane
1053 fCFContCascadeCuts = new AliCFContainer("fCFContCascadeCuts","Container for Cascade cuts", lNbSteps, lNbVariables, lNbBinsPerVar );
1056 //setting the bin limits
1059 fCFContCascadeCuts->SetBinLimits(0, 0., 2.); // DcaXiDaughters : 0.0 to 2.0
1061 Double_t *lBinLim1 = new Double_t[ lNbBinsPerVar[1]+1 ];
1064 for(Int_t i=2; i< lNbBinsPerVar[1];i++) lBinLim1[i] = (Double_t)0.03 + (5. - 0.03 )/(lNbBinsPerVar[1]-2) * (Double_t)(i-1) ;
1065 lBinLim1[ lNbBinsPerVar[1] ] = 100.0;
1066 fCFContCascadeCuts -> SetBinLimits(1, lBinLim1 );
1067 delete [] lBinLim1; // DcaBachToPrimVertexXi : 0.0 to 0.5
1069 fCFContCascadeCuts->SetBinLimits(2, .9988, 1.); // XiCosineOfPointingAngle : 0.99 to 1.0
1071 fCFContCascadeCuts -> SetBinLimits(3, 0., 110.); // XiRadius : 0.0 to 110.0
1073 fCFContCascadeCuts->SetBinLimits(4, 1.1, 1.13 ); // InvMassLambdaAsCascDghter
1075 fCFContCascadeCuts->SetBinLimits(5, 0., 2.); // DcaV0DaughtersXi : 0.0 to 2.0
1077 fCFContCascadeCuts->SetBinLimits(6, .98, 1.0002); // V0CosineOfPointingAngleXi : 0.99 to 1.0
1079 Double_t *lBinLim7 = new Double_t[ lNbBinsPerVar[7]+1 ];
1080 for(Int_t i=0; i< lNbBinsPerVar[7]-1;i++) lBinLim7[i] = (Double_t)0.0 + (100. - 0.0 )/(lNbBinsPerVar[7]-2) * (Double_t)i ;
1081 lBinLim7[ lNbBinsPerVar[7]-1] = 200.0;
1082 lBinLim7[ lNbBinsPerVar[7]] = 1000.0;
1083 fCFContCascadeCuts -> SetBinLimits(7, lBinLim7 );
1084 delete [] lBinLim7; // V0RadiusXi : 0.0 to 100.0
1086 Double_t *lBinLim8 = new Double_t[ lNbBinsPerVar[8]+1 ];
1087 for(Int_t i=0; i< lNbBinsPerVar[8];i++) lBinLim8[i] = (Double_t)0.0 + (0.4 - 0.0 )/(lNbBinsPerVar[8]-1) * (Double_t)i ;
1088 lBinLim8[ lNbBinsPerVar[8] ] = 100.0;
1089 fCFContCascadeCuts -> SetBinLimits(8, lBinLim8 );
1090 delete [] lBinLim8; // DcaV0ToPrimVertexXi : 0.0 to 0.4
1092 Double_t *lBinLim9 = new Double_t[ lNbBinsPerVar[9]+1 ];
1093 for(Int_t i=0; i< lNbBinsPerVar[9];i++) lBinLim9[i] = (Double_t)0.0 + (0.25 - 0.0 )/(lNbBinsPerVar[9]-1) * (Double_t)i ;
1094 lBinLim9[ lNbBinsPerVar[9] ] = 100.0;
1095 fCFContCascadeCuts -> SetBinLimits(9, lBinLim9 );
1096 delete [] lBinLim9; // DcaPosToPrimVertexXi : 0.0 to 0.25
1098 Double_t *lBinLim10 = new Double_t[ lNbBinsPerVar[10]+1 ];
1099 for(Int_t i=0; i< lNbBinsPerVar[10];i++) lBinLim10[i] = (Double_t)0.0 + (0.25 - 0.0 )/(lNbBinsPerVar[10]-1) * (Double_t)i ;
1100 lBinLim10[ lNbBinsPerVar[10] ] = 100.0;
1101 fCFContCascadeCuts -> SetBinLimits(10, lBinLim10 );
1102 delete [] lBinLim10; // DcaNegToPrimVertexXi : 0.0 to 0.25
1104 fCFContCascadeCuts->SetBinLimits(11, 1.25, 1.40); // InvMassXi
1105 fCFContCascadeCuts->SetBinLimits(12, 1.62, 1.74); // InvMassOmega
1106 fCFContCascadeCuts->SetBinLimits(13, 0.0, 10.0); // XiTransvMom
1107 fCFContCascadeCuts->SetBinLimits(14, -1.1, 1.1); // Y(Xi)
1108 fCFContCascadeCuts->SetBinLimits(15, -1.1, 1.1); // Y(Omega)
1109 fCFContCascadeCuts->SetBinLimits(16, -10.0, 10.0); // BestPrimaryVtxPosZ
1110 Double_t *lBinLim17 = new Double_t[ lNbBinsPerVar[17]+1 ];
1111 for(Int_t i=3; i< lNbBinsPerVar[17]+1;i++) lBinLim17[i] = (Double_t)(i-1)*10.;
1114 lBinLim17[2] = 10.0;
1115 fCFContCascadeCuts -> SetBinLimits(17, lBinLim17 ); // Centrality
1116 delete [] lBinLim17;
1117 fCFContCascadeCuts->SetBinLimits(18, 0.0, 6000.0); // ESD track multiplicity
1119 Double_t *lBinLim19 = new Double_t[ lNbBinsPerVar[19]+1 ];
1120 for(Int_t i=0; i< lNbBinsPerVar[19];i++) lBinLim19[i] = (Double_t)-1. + (110. + 1.0 )/(lNbBinsPerVar[19]-1) * (Double_t)i ;
1121 lBinLim19[ lNbBinsPerVar[19] ] = 2000.0;
1122 fCFContCascadeCuts->SetBinLimits(19, lBinLim19); // Proper time cascade
1124 fCFContCascadeCuts->SetBinLimits(20, lBinLim19); // Proper time V0
1126 fCFContCascadeCuts->SetBinLimits(21, lBinLim19); // Distance V0-Xi in tansverse plane
1127 delete [] lBinLim19;
1128 // Setting the number of steps : one for each cascade species (Xi-, Xi+ and Omega-, Omega+)
1129 fCFContCascadeCuts->SetStepTitle(0, "#Xi^{-} candidates");
1130 fCFContCascadeCuts->SetStepTitle(1, "#bar{#Xi}^{+} candidates");
1131 fCFContCascadeCuts->SetStepTitle(2, "#Omega^{-} candidates");
1132 fCFContCascadeCuts->SetStepTitle(3, "#bar{#Omega}^{+} candidates");
1134 // Setting the variable title, per axis
1135 fCFContCascadeCuts->SetVarTitle(0, "Dca(XiDaughters) (cm)");
1136 fCFContCascadeCuts->SetVarTitle(1, "Dca(Bach/PrimVertex) (cm)");
1137 fCFContCascadeCuts->SetVarTitle(2, "cos(Xi pointing angle)");
1138 fCFContCascadeCuts->SetVarTitle(3, "R_{2d}(Xi decay) (cm)");
1139 fCFContCascadeCuts->SetVarTitle(4, "M_{#Lambda}(As Casc Dghter) (GeV/c^{2})");
1140 fCFContCascadeCuts->SetVarTitle(5, "Dca(V0 Daughters) in Xi (cm)");
1142 fCFContCascadeCuts->SetVarTitle(6, "cos(V0 pointing Angle) in Casc");
1143 fCFContCascadeCuts->SetVarTitle(7, "R_{2d}(V0 decay) (cm)");
1144 fCFContCascadeCuts->SetVarTitle(8, "Dca(V0/PrimVertex) (cm)");
1145 fCFContCascadeCuts->SetVarTitle(9, "Dca(Pos/PrimVertex) (cm)");
1146 fCFContCascadeCuts->SetVarTitle(10, "Dca(Neg/PrimVertex) (cm)");
1148 fCFContCascadeCuts->SetVarTitle(11, "Inv. Mass(Xi) (GeV/c^{2})");
1149 fCFContCascadeCuts->SetVarTitle(12, "Inv. Mass(Omega) (GeV/c^{2})");
1151 fCFContCascadeCuts->SetVarTitle(13, "pt(Casc.) (GeV/c)");
1153 fCFContCascadeCuts->SetVarTitle(14, "Y(Xi)");
1154 fCFContCascadeCuts->SetVarTitle(15, "Y(Omega)");
1156 fCFContCascadeCuts->SetVarTitle(16, "Z-position(BestPrimVtx) (cm)");
1158 fCFContCascadeCuts->SetVarTitle(17, "Centrality");
1160 fCFContCascadeCuts->SetVarTitle(18, "ESD track multiplicity");
1162 fCFContCascadeCuts->SetVarTitle(19, "Proper time cascade");
1163 fCFContCascadeCuts->SetVarTitle(20, "Proper time V0");
1164 fCFContCascadeCuts->SetVarTitle(21, "Distance V0-Xi in transverse plane");
1168 fV0Ampl = new TH1F("fV0Ampl","",500,0.,30000);
1169 fListHistCascade->Add(fV0Ampl);
1172 fHistDcaXiDaughtersvsInvMass = new TH2F( "fHistDcaXiDaughtersvsInvMass", "DCA between Xi Daughters; DCA (cm) ; Number of Cascades", 100, 0., 0.5,400,1.2,2.0);
1173 fListHistCascade->Add(fHistDcaXiDaughtersvsInvMass);
1174 fHistDcaBachToPrimVertexvsInvMass = new TH2F("fHistDcaBachToPrimVertexvsInvMass", "DCA of Bach. to Prim. Vertex;DCA (cm);Number of Cascades", 250, 0., 0.25,400,1.2,2.0);
1175 fListHistCascade->Add(fHistDcaBachToPrimVertexvsInvMass);
1176 fHistXiCosineOfPointingAnglevsInvMass= new TH2F("fHistXiCosineOfPointingAnglevsInvMass", "Cosine of Xi Pointing Angle; Cos (Xi Point.Angl);Number of Xis", 200, 0.99, 1.0,400,1.2,2.0);
1177 fListHistCascade->Add(fHistXiCosineOfPointingAnglevsInvMass);
1178 fHistMassLambdaAsCascDghtervsInvMass= new TH2F("fHistMassLambdaAsCascDghtervsInvMass","#Lambda associated to Casc. candidates;Eff. Mass (GeV/c^{2});Counts", 300,1.00,1.3,400,1.2,2.0);
1179 fListHistCascade->Add(fHistMassLambdaAsCascDghtervsInvMass);
1180 fHistDcaV0DaughtersXivsInvMass = new TH2F("fHistDcaV0DaughtersXivsInvMass", "DCA between V0 daughters, in cascade;DCA (cm);Number of V0s", 120, 0., 0.6,400,1.2,2.0);
1181 fListHistCascade->Add(fHistDcaV0DaughtersXivsInvMass);
1182 fHistDcaV0ToPrimVertexXivsInvMass = new TH2F("fHistDcaV0ToPrimVertexXivsInvMass", "DCA of V0 to Prim. Vertex, in cascade;DCA (cm);Number of Cascades", 200, 0., 1.,400,1.2,2.0);
1183 fListHistCascade->Add(fHistDcaV0ToPrimVertexXivsInvMass);
1185 PostData(1, fListHistCascade);
1186 PostData(2, fCFContCascadePIDXiMinus);
1187 PostData(3, fCFContCascadePIDXiPlus);
1188 PostData(4, fCFContCascadePIDOmegaMinus);
1189 PostData(5, fCFContCascadePIDOmegaPlus);
1190 PostData(6, fCFContCascadeCuts);
1192 /* PostData(2, fPaveTextBookKeeping);*/
1193 }// end UserCreateOutputObjects
1196 //________________________________________________________________________
1197 void AliAnalysisTaskCheckCascadePbPb::UserExec(Option_t *) {
1199 // Called for each event
1201 AliESDEvent *lESDevent = 0x0;
1202 AliAODEvent *lAODevent = 0x0;
1205 AliError("Cannot get pid response");
1210 Int_t ncascades = -1;
1211 Int_t nTrackMultiplicity = -1;
1212 Int_t nTrackWithTPCrefitMultiplicity = 0;
1213 // Int_t lSPDTrackletsMultiplicity = -1;
1215 // Primary tracks from ESD/AOD
1216 Float_t lPrimaryTrackMultiplicity = -1.;
1219 Short_t lStatusTrackingPrimVtx = -2;
1220 Double_t lTrkgPrimaryVtxPos[3] = {-100.0, -100.0, -100.0};
1221 Double_t lBestPrimaryVtxPos[3] = {-100.0, -100.0, -100.0};
1222 Double_t lMagneticField = -10.;
1224 AliCentrality* centrality;
1227 Float_t multV0A = 0.;
1228 Float_t multV0C = 0.;
1230 // Connect to the InputEvent
1231 // After these lines, we should have an ESD/AOD event + the number of cascades in it.
1233 // For AOD or ESD ...
1234 nTrackMultiplicity = (InputEvent())->GetNumberOfTracks();
1236 if (fAnalysisType == "ESD") {
1237 lESDevent = dynamic_cast<AliESDEvent*>( InputEvent() );
1239 AliWarning("ERROR: lESDevent not available \n");
1243 //-------------------------------------------------
1245 // 0 - Trigger management
1246 // NOTE : Check the availability of the proper trigger --> MN Physics selection moved to runProof macro
1248 //-------------------------------------------------
1250 // 1 - Cascade vertexer (ESD)
1251 if (fkRerunV0CascVertexers) { // Relaunch V0 and Cascade vertexers
1253 lESDevent->ResetCascades();
1254 lESDevent->ResetV0s();
1256 AliV0vertexer *lV0vtxer = new AliV0vertexer();
1257 AliCascadeVertexer *lCascVtxer = new AliCascadeVertexer();
1259 //lV0vtxer->GetCuts(fV0Sels);
1260 //lCascVtxer->GetCuts(fCascSels);
1262 lV0vtxer->SetCuts(fV0Sels); // NB don't use SetDefaultCuts!! because it acts on static variables
1263 lCascVtxer->SetCuts(fCascSels);
1266 lV0vtxer->Tracks2V0vertices(lESDevent);
1267 lCascVtxer->V0sTracks2CascadeVertices(lESDevent);
1271 }// end if(RelaunchV0CascVertexers)
1273 //-------------------------------------------------
1274 ncascades = lESDevent->GetNumberOfCascades();
1275 nTrackWithTPCrefitMultiplicity = DoESDTrackWithTPCrefitMultiplicity(lESDevent);
1277 // const AliMultiplicity *lAliMult = lESDevent->GetMultiplicity();
1278 // lSPDTrackletsMultiplicity = lAliMult->GetNumberOfTracklets();
1280 centrality = lESDevent->GetCentrality();
1281 esdV0 = lESDevent->GetVZEROData();
1282 multV0A=esdV0->GetMTotV0A();
1283 multV0C=esdV0->GetMTotV0C();
1285 } else if (fAnalysisType == "AOD") {
1286 lAODevent = dynamic_cast<AliAODEvent*>( InputEvent() );
1288 AliWarning("ERROR: lAODevent not available \n");
1291 ncascades = lAODevent->GetNumberOfCascades();
1292 nTrackWithTPCrefitMultiplicity = 0;
1293 lPrimaryTrackMultiplicity = 0;
1294 for (Int_t itrack = 0; itrack<nTrackMultiplicity; itrack++) {
1295 AliAODTrack* track = lAODevent->GetTrack(itrack);
1296 if (track->TestFilterBit(AliAODTrack::kTrkGlobalNoDCA)) lPrimaryTrackMultiplicity++; // kTrkGlobal tight DCA cut --> mult is much lower than the one selectied with standard cuts in ESDs
1297 if (track->IsOn(AliAODTrack::kTPCrefit)) nTrackWithTPCrefitMultiplicity++;
1300 // lSPDTrackletsMultiplicity = lAODevent->GetTracklets()->GetNumberOfTracklets();
1302 centrality = lAODevent->GetCentrality();
1303 aodV0 = lAODevent->GetVZEROData();
1304 multV0A=aodV0->GetMTotV0A();
1305 multV0C=aodV0->GetMTotV0C();
1309 Printf("Analysis type (ESD or AOD) not specified \n");
1314 fHistCascadeMultiplicityBeforeEvSel->Fill (ncascades);
1316 // Printf("Centrality percentile V0M for this event %f)\n", centrality->GetCentralityPercentile("V0M"));
1317 Float_t lcentrality = 0.;
1319 if (fkUseCleaning) lcentrality = centrality->GetCentralityPercentile(fCentrEstimator.Data());
1321 lcentrality = centrality->GetCentralityPercentileUnchecked(fCentrEstimator.Data());
1322 if (centrality->GetQuality()>1) {
1323 PostData(1, fListHistCascade);
1324 PostData(2, fCFContCascadePIDXiMinus);
1325 PostData(3, fCFContCascadePIDXiPlus);
1326 PostData(4, fCFContCascadePIDOmegaMinus);
1327 PostData(5, fCFContCascadePIDOmegaPlus);
1328 PostData(6, fCFContCascadeCuts);
1333 if (lcentrality<fCentrLowLim||lcentrality>=fCentrUpLim) {
1334 PostData(1, fListHistCascade);
1335 PostData(2, fCFContCascadePIDXiMinus);
1336 PostData(3, fCFContCascadePIDXiPlus);
1337 PostData(4, fCFContCascadePIDOmegaMinus);
1338 PostData(5, fCFContCascadePIDOmegaPlus);
1339 PostData(6, fCFContCascadeCuts);
1344 fV0Ampl->Fill(multV0A+multV0C);
1346 //-------------------------------------------------
1348 fHistTrackMultiplicityForCentrEvt ->Fill( nTrackMultiplicity );
1349 fHistTPCrefitTrackMultiplicityForCentrEvt ->Fill( nTrackWithTPCrefitMultiplicity );
1350 fHistCascadeMultiplicityForCentrEvt ->Fill( ncascades );
1352 // ---------------------------------------------------------------
1354 // I - Global characteristics of the events + general histos (filled for any selected events and/or for the analysed events)
1356 // - I.Step 1 : Characteristics of the event : prim. Vtx + magnetic field (ESD)
1359 if (fAnalysisType == "ESD") {
1360 const AliESDVertex *lPrimaryTrackingESDVtx = lESDevent->GetPrimaryVertexTracks();
1361 // get the vtx stored in ESD found with tracks
1362 lPrimaryTrackingESDVtx->GetXYZ( lTrkgPrimaryVtxPos );
1364 const AliESDVertex *lPrimaryBestESDVtx = lESDevent->GetPrimaryVertex();
1365 // get the best primary vertex available for the event
1366 // As done in AliCascadeVertexer, we keep the one which is the best one available.
1367 // between : Tracking vertex > SPD vertex > TPC vertex > default SPD vertex
1368 // This one will be used for next calculations (DCA essentially)
1369 lPrimaryBestESDVtx->GetXYZ( lBestPrimaryVtxPos );
1370 lStatusTrackingPrimVtx = lPrimaryTrackingESDVtx->GetStatus();
1372 // FIXME : remove TPC-only primary vertex : retain only events with tracking + SPD vertex
1373 if (fkQualityCutNoTPConlyPrimVtx) {
1374 const AliESDVertex *lPrimarySPDVtx = lESDevent->GetPrimaryVertexSPD();
1375 if (!lPrimarySPDVtx->GetStatus() && !lPrimaryTrackingESDVtx->GetStatus() ){
1376 AliWarning("Pb / No SPD prim. vertex nor prim. Tracking vertex ... return !");
1377 PostData(1, fListHistCascade);
1378 PostData(2, fCFContCascadePIDXiMinus);
1379 PostData(3, fCFContCascadePIDXiPlus);
1380 PostData(4, fCFContCascadePIDOmegaMinus);
1381 PostData(5, fCFContCascadePIDOmegaPlus);
1382 PostData(6, fCFContCascadeCuts);
1388 // NOTE : For older evts
1390 // As previously done in AliCascadeVertexer, we keep, between both retrieved vertices (SPD or Tracking)
1391 // the one which is the best one available.
1392 // This one will be used for next calculations (DCA essentially)
1393 // At that time, the TPC-only primary vertex was not considered
1396 lMagneticField = lESDevent->GetMagneticField( );
1397 // FIXME if(TMath::Abs(lMagneticField ) < 10e-6) continue;
1398 lPrimaryTrackMultiplicity = fESDtrackCuts->CountAcceptedTracks(lESDevent);
1399 } else if (fAnalysisType == "AOD") {
1401 const AliAODVertex *lPrimaryBestAODVtx = lAODevent->GetPrimaryVertex();
1402 if (!lPrimaryBestAODVtx){
1403 AliWarning("No prim. vertex in AOD... return!");
1404 PostData(1, fListHistCascade);
1405 PostData(2, fCFContCascadePIDXiMinus);
1406 PostData(3, fCFContCascadePIDXiPlus);
1407 PostData(4, fCFContCascadePIDOmegaMinus);
1408 PostData(5, fCFContCascadePIDOmegaPlus);
1409 PostData(6, fCFContCascadeCuts);
1414 // get the best primary vertex available for the event GetVertex(0)
1415 // This one will be used for next calculations (DCA essentially)
1416 lPrimaryBestAODVtx->GetXYZ( lBestPrimaryVtxPos );
1418 lStatusTrackingPrimVtx = -1;
1419 lTrkgPrimaryVtxPos[0] = -100.0;
1420 lTrkgPrimaryVtxPos[1] = -100.0;
1421 lTrkgPrimaryVtxPos[2] = -100.0;
1422 lMagneticField = lAODevent->GetMagneticField();
1426 // Quality cut on the z-position of the prim vertex.
1427 if (fkQualityCutZprimVtxPos) {
1428 if (TMath::Abs(lBestPrimaryVtxPos[2]) > fVtxRange ) {
1429 AliWarning("Pb / | Z position of Best Prim Vtx | > 10.0 cm ... return !");
1430 PostData(1, fListHistCascade);
1431 PostData(2, fCFContCascadePIDXiMinus);
1432 PostData(3, fCFContCascadePIDXiPlus);
1433 PostData(4, fCFContCascadePIDOmegaMinus);
1434 PostData(5, fCFContCascadePIDOmegaPlus);
1435 PostData(6, fCFContCascadeCuts);
1441 // - I.Step 2 : Filling histos that characterize the selected event : x,y,z prim. Vtx distrib. (ESD)
1444 fHistCascadeMultiplicityForSelEvt ->Fill( ncascades );
1445 fHistPosBestPrimaryVtxXForSelEvt ->Fill( lBestPrimaryVtxPos[0] );
1446 fHistPosBestPrimaryVtxYForSelEvt ->Fill( lBestPrimaryVtxPos[1] );
1447 fHistPosBestPrimaryVtxZForSelEvt ->Fill( lBestPrimaryVtxPos[2] );
1449 // ---------------------------------------------------------------
1451 fHistEvtsInCentralityBinsvsNtracks->Fill(lcentrality,lPrimaryTrackMultiplicity);
1455 // II - Calculation Part dedicated to Xi vertices
1457 for (Int_t iXi = 0; iXi < ncascades; iXi++) {// This is the begining of the Cascade loop (ESD or AOD)
1459 // -------------------------------------
1460 // II.Init - Initialisation of the local variables that will be needed for ESD/AOD
1463 // - 0th part of initialisation : around primary vertex ...
1465 Double_t lTrkgPrimaryVtxRadius3D = -500.0;
1466 Double_t lBestPrimaryVtxRadius3D = -500.0;
1468 // - 1st part of initialisation : variables needed to store AliESDCascade data members
1469 Double_t lEffMassXi = 0. ;
1470 Double_t lChi2Xi = -1. ;
1471 Double_t lDcaXiDaughters = -1. ;
1472 Double_t lXiCosineOfPointingAngle = -1. ;
1473 Double_t lPosXi[3] = { -1000.0, -1000.0, -1000.0 };
1474 Double_t lXiRadius = -1000. ;
1476 // - 2nd part of initialisation : Nbr of clusters within TPC for the 3 daughter cascade tracks
1477 UShort_t lPosTPCClusters = -1; // For ESD only ...
1478 UShort_t lNegTPCClusters = -1; // For ESD only ...
1479 UShort_t lBachTPCClusters = -1; // For ESD only ...
1481 Double_t lInnerWallMomCascDghters[3] = {-100., -100., -100.};
1482 Double_t lTPCSignalCascDghters [3] = {-100., -100., -100.};
1485 // - 3rd part of initialisation : about V0 part in cascades
1486 Double_t lInvMassLambdaAsCascDghter = 0.;
1487 Double_t lV0Chi2Xi = -1. ;
1488 Double_t lDcaV0DaughtersXi = -1.;
1490 Double_t lDcaBachToPrimVertexXi = -1., lDcaV0ToPrimVertexXi = -1.;
1491 Double_t lDcaPosToPrimVertexXi = -1.;
1492 Double_t lDcaNegToPrimVertexXi = -1.;
1493 Double_t lV0CosineOfPointingAngle = -1. ;
1494 Double_t lV0toXiCosineOfPointingAngle = 0. ;
1496 Double_t lPosV0Xi[3] = { -1000. , -1000., -1000. }; // Position of VO coming from cascade
1497 Double_t lV0RadiusXi = -1000.0;
1498 Double_t lV0quality = 0.;
1501 // - 4th part of initialisation : Effective masses
1502 Double_t lInvMassXiMinus = 0.;
1503 Double_t lInvMassXiPlus = 0.;
1504 Double_t lInvMassOmegaMinus = 0.;
1505 Double_t lInvMassOmegaPlus = 0.;
1507 // - 5th part of initialisation : PID treatment
1508 Bool_t lIsPosInXiProton = kFALSE;
1509 Bool_t lIsPosInXiPion = kFALSE;
1510 Bool_t lIsPosInOmegaProton = kFALSE;
1511 Bool_t lIsPosInOmegaPion = kFALSE;
1513 Bool_t lIsNegInXiProton = kFALSE;
1514 Bool_t lIsNegInXiPion = kFALSE;
1515 Bool_t lIsNegInOmegaProton = kFALSE;
1516 Bool_t lIsNegInOmegaPion = kFALSE;
1518 Bool_t lIsBachelorKaon = kFALSE;
1519 Bool_t lIsBachelorPion = kFALSE;
1521 Bool_t lIsBachelorKaonForTPC = kFALSE;
1522 Bool_t lIsBachelorPionForTPC = kFALSE;
1523 Bool_t lIsNegPionForTPC = kFALSE;
1524 Bool_t lIsPosPionForTPC = kFALSE;
1525 Bool_t lIsNegProtonForTPC = kFALSE;
1526 Bool_t lIsPosProtonForTPC = kFALSE;
1528 // - 6th part of initialisation : extra info for QA
1529 Double_t lXiMomX = 0., lXiMomY = 0., lXiMomZ = 0.;
1530 Double_t lXiTransvMom = 0. ;
1531 Double_t lXiTotMom = 0. ;
1533 Double_t lV0PMomX = 0., lV0PMomY = 0., lV0PMomZ = 0.;
1534 Double_t lV0NMomX = 0., lV0NMomY = 0., lV0NMomZ = 0.;
1535 Double_t lV0TotMom = 0. ;
1538 Double_t lBachMomX = 0., lBachMomY = 0., lBachMomZ = 0.;
1539 Double_t lBachTransvMom = 0.;
1540 Double_t lBachTotMom = 0.;
1542 Double_t lpTrackTransvMom = 0.;
1543 Double_t lnTrackTransvMom = 0.;
1545 Short_t lChargeXi = -2;
1547 Double_t lRapXi = -20.0, lRapOmega = -20.0, lEta = -20.0, lTheta = 360., lPhi = 720. ;
1548 Double_t lAlphaXi = -200., lPtArmXi = -200.0;
1550 // - 7th part of initialisation : variables for the AliCFContainer dedicated to cascade cut optmisiation
1552 if (fAnalysisType == "ESD") {
1554 // -------------------------------------
1555 // II.ESD - Calculation Part dedicated to Xi vertices (ESD)
1557 AliESDcascade *xi = lESDevent->GetCascade(iXi);
1561 // - II.Step 1 : around primary vertex
1563 lTrkgPrimaryVtxRadius3D = TMath::Sqrt( lTrkgPrimaryVtxPos[0] * lTrkgPrimaryVtxPos[0] +
1564 lTrkgPrimaryVtxPos[1] * lTrkgPrimaryVtxPos[1] +
1565 lTrkgPrimaryVtxPos[2] * lTrkgPrimaryVtxPos[2] );
1567 lBestPrimaryVtxRadius3D = TMath::Sqrt( lBestPrimaryVtxPos[0] * lBestPrimaryVtxPos[0] +
1568 lBestPrimaryVtxPos[1] * lBestPrimaryVtxPos[1] +
1569 lBestPrimaryVtxPos[2] * lBestPrimaryVtxPos[2] );
1573 // - II.Step 2 : Assigning the necessary variables for specific AliESDcascade data members (ESD)
1576 xi->ChangeMassHypothesis(lV0quality , 3312); // default working hypothesis : cascade = Xi- decay
1578 lEffMassXi = xi->GetEffMassXi();
1579 lChi2Xi = xi->GetChi2Xi();
1580 lDcaXiDaughters = xi->GetDcaXiDaughters();
1581 lXiCosineOfPointingAngle = xi->GetCascadeCosineOfPointingAngle( lBestPrimaryVtxPos[0],
1582 lBestPrimaryVtxPos[1],
1583 lBestPrimaryVtxPos[2] );
1584 // Take care : the best available vertex should be used (like in AliCascadeVertexer)
1586 xi->GetXYZcascade( lPosXi[0], lPosXi[1], lPosXi[2] );
1587 lXiRadius = TMath::Sqrt( lPosXi[0]*lPosXi[0] + lPosXi[1]*lPosXi[1] );
1591 // - II.Step 3 : around the tracks : Bach + V0 (ESD)
1592 // ~ Necessary variables for ESDcascade data members coming from the ESDv0 part (inheritance)
1595 UInt_t lIdxPosXi = (UInt_t) TMath::Abs( xi->GetPindex() );
1596 UInt_t lIdxNegXi = (UInt_t) TMath::Abs( xi->GetNindex() );
1597 UInt_t lBachIdx = (UInt_t) TMath::Abs( xi->GetBindex() );
1598 // Care track label can be negative in MC production (linked with the track quality)
1599 // However = normally, not the case for track index ...
1601 // FIXME : rejection of a double use of a daughter track (nothing but just a crosscheck of what is done in the cascade vertexer)
1602 if (lBachIdx == lIdxNegXi) {
1603 AliWarning("Pb / Idx(Bach. track) = Idx(Neg. track) ... continue!"); continue;
1605 if (lBachIdx == lIdxPosXi) {
1606 AliWarning("Pb / Idx(Bach. track) = Idx(Pos. track) ... continue!"); continue;
1609 AliESDtrack *pTrackXi = lESDevent->GetTrack( lIdxPosXi );
1610 AliESDtrack *nTrackXi = lESDevent->GetTrack( lIdxNegXi );
1611 AliESDtrack *bachTrackXi = lESDevent->GetTrack( lBachIdx );
1612 if (!pTrackXi || !nTrackXi || !bachTrackXi ) {
1613 AliWarning("ERROR: Could not retrieve one of the 3 ESD daughter tracks of the cascade ...");
1617 lPosTPCClusters = pTrackXi->GetTPCNcls();
1618 lNegTPCClusters = nTrackXi->GetTPCNcls();
1619 lBachTPCClusters = bachTrackXi->GetTPCNcls();
1621 // FIXME : rejection of a poor quality tracks
1622 if (fkQualityCutTPCrefit) {
1623 // 1 - Poor quality related to TPCrefit
1624 ULong_t pStatus = pTrackXi->GetStatus();
1625 ULong_t nStatus = nTrackXi->GetStatus();
1626 ULong_t bachStatus = bachTrackXi->GetStatus();
1627 if ((pStatus&AliESDtrack::kTPCrefit) == 0) { AliWarning("Pb / V0 Pos. track has no TPCrefit ... continue!"); continue; }
1628 if ((nStatus&AliESDtrack::kTPCrefit) == 0) { AliWarning("Pb / V0 Neg. track has no TPCrefit ... continue!"); continue; }
1629 if ((bachStatus&AliESDtrack::kTPCrefit) == 0) { AliWarning("Pb / Bach. track has no TPCrefit ... continue!"); continue; }
1631 if (fkQualityCutnTPCcls) {
1632 // 2 - Poor quality related to TPC clusters
1633 if (lPosTPCClusters < fMinnTPCcls) { AliWarning("Pb / V0 Pos. track has less than minn TPC clusters ... continue!"); continue; }
1634 if (lNegTPCClusters < fMinnTPCcls) { AliWarning("Pb / V0 Neg. track has less than minn TPC clusters ... continue!"); continue; }
1635 if (lBachTPCClusters < fMinnTPCcls) { AliWarning("Pb / Bach. track has less than minn TPC clusters ... continue!"); continue; }
1638 const AliExternalTrackParam *pExtTrack = pTrackXi ->GetInnerParam();
1639 const AliExternalTrackParam *nExtTrack = nTrackXi ->GetInnerParam();
1640 const AliExternalTrackParam *bachExtTrack = bachTrackXi ->GetInnerParam();
1643 lInnerWallMomCascDghters[0] = pExtTrack ->GetP() * pExtTrack ->Charge();
1644 lTPCSignalCascDghters [0] = pTrackXi ->GetTPCsignal();
1647 lInnerWallMomCascDghters[1] = nExtTrack ->GetP() * nExtTrack ->Charge();
1648 lTPCSignalCascDghters [1] = nTrackXi ->GetTPCsignal();
1651 lInnerWallMomCascDghters[2] = bachExtTrack ->GetP() * bachExtTrack ->Charge();
1652 lTPCSignalCascDghters [2] = bachTrackXi ->GetTPCsignal();
1656 lInvMassLambdaAsCascDghter = xi->GetEffMass();
1657 // This value shouldn't change, whatever the working hyp. is : Xi-, Xi+, Omega-, Omega+
1658 lDcaV0DaughtersXi = xi->GetDcaV0Daughters();
1659 lV0Chi2Xi = xi->GetChi2V0();
1661 lV0CosineOfPointingAngle = xi->GetV0CosineOfPointingAngle(lBestPrimaryVtxPos[0],
1662 lBestPrimaryVtxPos[1],
1663 lBestPrimaryVtxPos[2] );
1665 lDcaV0ToPrimVertexXi = xi->GetD( lBestPrimaryVtxPos[0],
1666 lBestPrimaryVtxPos[1],
1667 lBestPrimaryVtxPos[2] );
1669 lDcaBachToPrimVertexXi = TMath::Abs( bachTrackXi->GetD( lBestPrimaryVtxPos[0],
1670 lBestPrimaryVtxPos[1],
1672 // Note : AliExternalTrackParam::GetD returns an algebraic value ...
1674 xi->GetXYZ( lPosV0Xi[0], lPosV0Xi[1], lPosV0Xi[2] );
1675 lV0RadiusXi = TMath::Sqrt( lPosV0Xi[0]*lPosV0Xi[0] + lPosV0Xi[1]*lPosV0Xi[1] );
1677 lDcaPosToPrimVertexXi = TMath::Abs( pTrackXi ->GetD( lBestPrimaryVtxPos[0],
1678 lBestPrimaryVtxPos[1],
1681 lDcaNegToPrimVertexXi = TMath::Abs( nTrackXi ->GetD( lBestPrimaryVtxPos[0],
1682 lBestPrimaryVtxPos[1],
1685 // - II.Step 3' : extra-selection for cascade candidates
1686 if (fkExtraSelections) {
1687 // if(lChi2Xi > 2000) continue; // in AliCascadeVertexer
1688 // if(lV0Chi2Xi > 2000) continue; // in AliV0vertexer
1690 if (lDcaXiDaughters > 0.3) continue; // in AliCascadeVertexer
1691 if (lXiCosineOfPointingAngle < 0.999 ) continue; // in AliCascadeVertexer
1692 if (lDcaV0ToPrimVertexXi < 0.05) continue; // in AliCascadeVertexer
1693 if (lDcaBachToPrimVertexXi < 0.03) continue; // in AliCascadeVertexer
1694 // if (TMath::Abs(lInvMassLambdaAsCascDghter-1.11568) > 0.006 ) continue; // in AliCascadeVertexer
1696 if (lDcaV0DaughtersXi > 1.) continue; // in AliV0vertexer
1697 if (lV0toXiCosineOfPointingAngle < 0.998) continue; // in AliV0vertexer
1698 if (lDcaPosToPrimVertexXi < 0.1) continue; // in AliV0vertexer
1699 if (lDcaNegToPrimVertexXi < 0.1) continue; // in AliV0vertexer
1702 if(lXiRadius < .9) continue; // in AliCascadeVertexer
1703 // if(lXiRadius > 100) continue; // in AliCascadeVertexer
1704 if(lV0RadiusXi < 0.9) continue; // in AliV0vertexer
1705 // if(lV0RadiusXi > 100) continue; // in AliV0vertexer
1711 // - II.Step 4 : around effective masses (ESD)
1712 // ~ change mass hypotheses to cover all the possibilities : Xi-/+, Omega -/+
1716 if ( bachTrackXi->Charge() < 0 ) {
1718 xi->ChangeMassHypothesis(lV0quality , 3312);
1719 // Calculate the effective mass of the Xi- candidate.
1720 // pdg code 3312 = Xi-
1721 lInvMassXiMinus = xi->GetEffMassXi();
1724 xi->ChangeMassHypothesis(lV0quality , 3334);
1725 // Calculate the effective mass of the Xi- candidate.
1726 // pdg code 3334 = Omega-
1727 lInvMassOmegaMinus = xi->GetEffMassXi();
1730 xi->ChangeMassHypothesis(lV0quality , 3312); // Back to default hyp.
1731 }// end if negative bachelor
1734 if ( bachTrackXi->Charge() > 0 ) {
1736 xi->ChangeMassHypothesis(lV0quality , -3312);
1737 // Calculate the effective mass of the Xi+ candidate.
1738 // pdg code -3312 = Xi+
1739 lInvMassXiPlus = xi->GetEffMassXi();
1742 xi->ChangeMassHypothesis(lV0quality , -3334);
1743 // Calculate the effective mass of the Xi+ candidate.
1744 // pdg code -3334 = Omega+
1745 lInvMassOmegaPlus = xi->GetEffMassXi();
1748 xi->ChangeMassHypothesis(lV0quality , -3312); // Back to "default" hyp.
1749 }// end if positive bachelor
1751 // - II.Step 5 : PID on the daughter tracks
1754 // A - Combined PID */ // removed, add when will be used
1756 // B - TPC PID : 3-sigma bands on Bethe-Bloch curve
1759 if (TMath::Abs(fPIDResponse->NumberOfSigmasTPC( bachTrackXi,AliPID::kKaon)) < 4) lIsBachelorKaonForTPC = kTRUE;
1760 if (TMath::Abs(fPIDResponse->NumberOfSigmasTPC( bachTrackXi,AliPID::kPion)) < 4) lIsBachelorPionForTPC = kTRUE;
1762 // Negative V0 daughter
1763 if (TMath::Abs(fPIDResponse->NumberOfSigmasTPC( nTrackXi,AliPID::kPion )) < 4) lIsNegPionForTPC = kTRUE;
1764 if (TMath::Abs(fPIDResponse->NumberOfSigmasTPC( nTrackXi,AliPID::kProton )) < 4) lIsNegProtonForTPC = kTRUE;
1766 // Positive V0 daughter
1767 if (TMath::Abs(fPIDResponse->NumberOfSigmasTPC( pTrackXi,AliPID::kPion )) < 4) lIsPosPionForTPC = kTRUE;
1768 if (TMath::Abs(fPIDResponse->NumberOfSigmasTPC( pTrackXi,AliPID::kProton )) < 4) lIsPosProtonForTPC = kTRUE;
1771 const AliExternalTrackParam *pInnerWallTrackXi = pTrackXi ->GetInnerParam();
1772 const AliExternalTrackParam *nInnerWallTrackXi = nTrackXi ->GetInnerParam();
1773 const AliExternalTrackParam *bachInnerWallTrackXi = bachTrackXi ->GetInnerParam();
1774 if (pInnerWallTrackXi && nInnerWallTrackXi && bachInnerWallTrackXi ) {
1776 Double_t pMomInnerWall = pInnerWallTrackXi ->GetP();
1777 Double_t nMomInnerWall = nInnerWallTrackXi ->GetP();
1778 Double_t bachMomInnerWall = bachInnerWallTrackXi->GetP();
1781 if (TMath::Abs(fESDpid->NumberOfSigmasTPC( bachTrackXi,AliPID::kPion)) < 3) lIsBachelorPionForTPC = kTRUE;
1782 if (bachMomInnerWall < 0.350 && TMath::Abs(fESDpid->NumberOfSigmasTPC( bachTrackXi,AliPID::kKaon)) < 5) lIsBachelorKaonForTPC = kTRUE;
1783 if (bachMomInnerWall > 0.350 && TMath::Abs(fESDpid->NumberOfSigmasTPC( bachTrackXi,AliPID::kKaon)) < 3) lIsBachelorKaonForTPC = kTRUE;
1785 // Negative V0 daughter
1786 if (TMath::Abs(fESDpid->NumberOfSigmasTPC( nTrackXi,AliPID::kPion )) < 3 ) lIsNegPionForTPC = kTRUE;
1787 if (nMomInnerWall < 0.6 && TMath::Abs(fESDpid->NumberOfSigmasTPC( nTrackXi,AliPID::kProton ) ) < 5 ) lIsNegProtonForTPC = kTRUE;
1788 if (nMomInnerWall > 0.6 && TMath::Abs(fESDpid->NumberOfSigmasTPC( nTrackXi,AliPID::kProton ) ) < 3 ) lIsNegProtonForTPC = kTRUE;
1790 // Positive V0 daughter
1791 if (TMath::Abs(fESDpid->NumberOfSigmasTPC( pTrackXi,AliPID::kPion )) < 3 ) lIsPosPionForTPC = kTRUE;
1792 if (pMomInnerWall < 0.6 && TMath::Abs(fESDpid->NumberOfSigmasTPC( pTrackXi,AliPID::kProton )) < 5) lIsPosProtonForTPC = kTRUE;
1793 if (pMomInnerWall > 0.6 && TMath::Abs(fESDpid->NumberOfSigmasTPC( pTrackXi,AliPID::kProton )) < 3) lIsPosProtonForTPC = kTRUE;
1797 // - II.Step 6 : extra info for QA (ESD)
1798 // miscellaneous pieces of info that may help regarding data quality assessment.
1801 xi->GetPxPyPz( lXiMomX, lXiMomY, lXiMomZ );
1802 lXiTransvMom = TMath::Sqrt( lXiMomX*lXiMomX + lXiMomY*lXiMomY );
1803 lXiTotMom = TMath::Sqrt( lXiMomX*lXiMomX + lXiMomY*lXiMomY + lXiMomZ*lXiMomZ );
1805 xi->GetNPxPyPz(lV0NMomX,lV0NMomY,lV0NMomZ);
1806 xi->GetPPxPyPz(lV0PMomX,lV0PMomY,lV0PMomZ);
1807 lV0TotMom = TMath::Sqrt(TMath::Power(lV0NMomX+lV0PMomX,2)+TMath::Power(lV0NMomY+lV0PMomY,2)+TMath::Power(lV0NMomZ+lV0PMomZ,2));
1809 xi->GetBPxPyPz( lBachMomX, lBachMomY, lBachMomZ );
1810 lBachTransvMom = TMath::Sqrt( lBachMomX*lBachMomX + lBachMomY*lBachMomY );
1811 lBachTotMom = TMath::Sqrt( lBachMomX*lBachMomX + lBachMomY*lBachMomY + lBachMomZ*lBachMomZ );
1813 lnTrackTransvMom = TMath::Sqrt( lV0NMomX*lV0NMomX + lV0NMomY*lV0NMomY );
1814 lpTrackTransvMom = TMath::Sqrt( lV0PMomX*lV0PMomX + lV0PMomY*lV0PMomY );
1817 lChargeXi = xi->Charge();
1819 lV0toXiCosineOfPointingAngle = xi->GetV0CosineOfPointingAngle( lPosXi[0], lPosXi[1], lPosXi[2] );
1821 lRapXi = xi->RapXi();
1822 lRapOmega = xi->RapOmega();
1824 lTheta = xi->Theta() *180.0/TMath::Pi();
1825 lPhi = xi->Phi() *180.0/TMath::Pi();
1826 lAlphaXi = xi->AlphaXi();
1827 lPtArmXi = xi->PtArmXi();
1830 //FIXME : Extra-cut = Anti-splitting cut for lambda daughters
1831 Bool_t kAntiSplittingLambda = kFALSE;
1833 if (kAntiSplittingLambda) { // not used
1834 Double_t lNMomX = 0., lNMomY = 0., lNMomZ = 0.;
1835 Double_t lPMomX = 0., lPMomY = 0., lPMomZ = 0.;
1837 xi->GetPPxPyPz(lPMomX, lPMomY, lPMomZ);
1838 xi->GetNPxPyPz(lNMomX, lNMomY, lNMomZ);
1840 if ( xi->Charge() < 0) {// Xi- or Omega-
1841 if (TMath::Abs(lBachTransvMom - TMath::Sqrt( lNMomX*lNMomX + lNMomY*lNMomY ) ) < 0.075) continue;
1842 } else { //Xi+ or Omega+
1843 if(TMath::Abs(lBachTransvMom - TMath::Sqrt( lPMomX*lPMomX + lPMomY*lPMomY ) ) < 0.075) continue;
1847 //FIXME : Just to know which file is currently open : locate the file containing Xi
1848 // cout << "Name of the file containing Xi candidate(s) :"
1849 // << CurrentFileName()
1850 // << " / entry: " << Entry()
1851 // << " / in file: " << lESDevent->GetEventNumberInFile() // <- Cvetan / From Mihaela: AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()->GetTree()->GetReadEntry();
1852 // << " : mass(Xi) = " << xi->GetEffMassXi()
1853 // << " / charge = " << lChargeXi
1854 // << " / pt(Casc) = " << lXiTransvMom
1855 // << " / Decay 2d R(Xi) = " << lXiRadius
1856 // << " / Track Index(Pos) = " << lIdxPosXi << "/ Nb(TPC clusters) = " << lPosTPCClusters
1857 // << " / Track Index(Neg) = " << lIdxNegXi << "/ Nb(TPC clusters) = " << lNegTPCClusters
1858 // << " / Track Index(Bach) = " << lBachIdx << "/ Nb(TPC clusters) = " << lBachTPCClusters
1862 } else if (fAnalysisType == "AOD") {
1864 // II.AOD - Calculation Part dedicated to Xi vertices
1866 const AliAODcascade *xi = lAODevent->GetCascade(iXi);
1869 // - II.Step 1 : Characteristics of the event : prim. Vtx + magnetic field (AOD)
1873 lTrkgPrimaryVtxRadius3D = -500. ;
1874 // We don't have the different prim. vertex at the AOD level -> nothing to do.
1876 lBestPrimaryVtxRadius3D = TMath::Sqrt( lBestPrimaryVtxPos[0] * lBestPrimaryVtxPos[0] +
1877 lBestPrimaryVtxPos[1] * lBestPrimaryVtxPos[1] +
1878 lBestPrimaryVtxPos[2] * lBestPrimaryVtxPos[2] );
1881 // - II.Step 2 : Assigning the necessary variables for specific AliAODcascade data members (AOD)
1884 lEffMassXi = xi->MassXi(); // default working hypothesis : cascade = Xi- decay
1885 lChi2Xi = xi->Chi2Xi();
1886 lDcaXiDaughters = xi->DcaXiDaughters();
1887 lXiCosineOfPointingAngle = xi->CosPointingAngleXi( lBestPrimaryVtxPos[0],
1888 lBestPrimaryVtxPos[1],
1889 lBestPrimaryVtxPos[2] );
1891 // the best available vertex should be used (like in AliCascadeVertexer)
1893 lPosXi[0] = xi->DecayVertexXiX();
1894 lPosXi[1] = xi->DecayVertexXiY();
1895 lPosXi[2] = xi->DecayVertexXiZ();
1896 lXiRadius = TMath::Sqrt( lPosXi[0]*lPosXi[0] + lPosXi[1]*lPosXi[1] );
1898 AliAODTrack *pTrackXi = dynamic_cast<AliAODTrack*>( xi->GetDaughter(0) );
1899 AliAODTrack *nTrackXi = dynamic_cast<AliAODTrack*>( xi->GetDaughter(1) );
1900 AliAODTrack *bachTrackXi = dynamic_cast<AliAODTrack*>( xi->GetDecayVertexXi()->GetDaughter(0) );
1901 if (!pTrackXi || !nTrackXi || !bachTrackXi ) {
1902 AliWarning("ERROR: Could not retrieve one of the 3 AOD daughter tracks of the cascade ...");
1906 UInt_t lIdxPosXi = (UInt_t) TMath::Abs( pTrackXi->GetID() );
1907 UInt_t lIdxNegXi = (UInt_t) TMath::Abs( nTrackXi->GetID() );
1908 UInt_t lBachIdx = (UInt_t) TMath::Abs( bachTrackXi->GetID() );
1910 // Care track label can be negative in MC production (linked with the track quality)
1911 // However = normally, not the case for track index ...
1913 // FIXME : rejection of a double use of a daughter track (nothing but just a crosscheck of what is done in the cascade vertexer)
1914 if (lBachIdx == lIdxNegXi) {
1915 AliWarning("Pb / Idx(Bach. track) = Idx(Neg. track) ... continue!"); continue;
1917 if (lBachIdx == lIdxPosXi) {
1918 AliWarning("Pb / Idx(Bach. track) = Idx(Pos. track) ... continue!"); continue;
1921 lPosTPCClusters = pTrackXi->GetTPCNcls(); // FIXME: Is this ok? or something like in LambdaK0PbPb task AOD?
1922 lNegTPCClusters = nTrackXi->GetTPCNcls();
1923 lBachTPCClusters = bachTrackXi->GetTPCNcls();
1925 // Rejection of a poor quality tracks
1926 if (fkQualityCutTPCrefit) {
1927 // 1 - Poor quality related to TPCrefit
1928 if (!(pTrackXi->IsOn(AliAODTrack::kTPCrefit))) { AliWarning("Pb / V0 Pos. track has no TPCrefit ... continue!"); continue; }
1929 if (!(nTrackXi->IsOn(AliAODTrack::kTPCrefit))) { AliWarning("Pb / V0 Neg. track has no TPCrefit ... continue!"); continue; }
1930 if (!(bachTrackXi->IsOn(AliAODTrack::kTPCrefit))) { AliWarning("Pb / Bach. track has no TPCrefit ... continue!"); continue; }
1932 if (fkQualityCutnTPCcls) {
1933 // 2 - Poor quality related to TPC clusters
1934 if (lPosTPCClusters < fMinnTPCcls) { //AliWarning("Pb / V0 Pos. track has less than minn TPC clusters ... continue!");
1936 if (lNegTPCClusters < fMinnTPCcls) { //AliWarning("Pb / V0 Neg. track has less than minn TPC clusters ... continue!");
1938 if (lBachTPCClusters < fMinnTPCcls) { //AliWarning("Pb / Bach. track has less than minn TPC clusters ... continue!");
1943 // - II.Step 3 : around the tracks : Bach + V0 (AOD)
1944 // ~ Necessary variables for AODcascade data members coming from the AODv0 part (inheritance)
1947 lChargeXi = xi->ChargeXi();
1950 lInvMassLambdaAsCascDghter = xi->MassLambda();
1952 lInvMassLambdaAsCascDghter = xi->MassAntiLambda();
1954 lDcaV0DaughtersXi = xi->DcaV0Daughters();
1955 lV0Chi2Xi = xi->Chi2V0();
1957 lDcaV0ToPrimVertexXi = xi->DcaV0ToPrimVertex();
1959 lDcaBachToPrimVertexXi = xi->DcaBachToPrimVertex();
1962 lPosV0Xi[0] = xi->DecayVertexV0X();
1963 lPosV0Xi[1] = xi->DecayVertexV0Y();
1964 lPosV0Xi[2] = xi->DecayVertexV0Z();
1965 lV0RadiusXi = TMath::Sqrt( lPosV0Xi[0]*lPosV0Xi[0] + lPosV0Xi[1]*lPosV0Xi[1] );
1967 lV0CosineOfPointingAngle = xi->CosPointingAngle( lBestPrimaryVtxPos );
1969 lDcaPosToPrimVertexXi = xi->DcaPosToPrimVertex();
1970 lDcaNegToPrimVertexXi = xi->DcaNegToPrimVertex();
1972 // - II.Step 4 : around effective masses (AOD)
1973 // ~ change mass hypotheses to cover all the possibilities : Xi-/+, Omega -/+
1976 if ( lChargeXi < 0 ) lInvMassXiMinus = xi->MassXi();
1977 if ( lChargeXi > 0 ) lInvMassXiPlus = xi->MassXi();
1978 if ( lChargeXi < 0 ) lInvMassOmegaMinus = xi->MassOmega();
1979 if ( lChargeXi > 0 ) lInvMassOmegaPlus = xi->MassOmega();
1982 // - II.Step 5 : PID on the daughters
1988 // TPC PID: 4-sigma bands on Bethe-Bloch curve
1991 if (TMath::Abs(fPIDResponse->NumberOfSigmasTPC( bachTrackXi,AliPID::kKaon)) < 4) lIsBachelorKaonForTPC = kTRUE;
1992 if (TMath::Abs(fPIDResponse->NumberOfSigmasTPC( bachTrackXi,AliPID::kPion)) < 4) lIsBachelorPionForTPC = kTRUE;
1994 // Negative V0 daughter
1995 if (TMath::Abs(fPIDResponse->NumberOfSigmasTPC( nTrackXi,AliPID::kPion )) < 4) lIsNegPionForTPC = kTRUE;
1996 if (TMath::Abs(fPIDResponse->NumberOfSigmasTPC( nTrackXi,AliPID::kProton )) < 4) lIsNegProtonForTPC = kTRUE;
1998 // Positive V0 daughter
1999 if (TMath::Abs(fPIDResponse->NumberOfSigmasTPC( pTrackXi,AliPID::kPion )) < 4) lIsPosPionForTPC = kTRUE;
2000 if (TMath::Abs(fPIDResponse->NumberOfSigmasTPC( pTrackXi,AliPID::kProton )) < 4) lIsPosProtonForTPC = kTRUE;
2003 // - II.Step 6 : extra info for QA (AOD)
2004 // miscellaneous pieces onf info that may help regarding data quality assessment.
2006 lXiMomX = xi->MomXiX();
2007 lXiMomY = xi->MomXiY();
2008 lXiMomZ = xi->MomXiZ();
2009 lXiTransvMom = TMath::Sqrt( lXiMomX*lXiMomX + lXiMomY*lXiMomY );
2010 lXiTotMom = TMath::Sqrt( lXiMomX*lXiMomX + lXiMomY*lXiMomY + lXiMomZ*lXiMomZ );
2012 Double_t lV0MomX = xi->MomV0X();
2013 Double_t lV0MomY = xi->MomV0Y();
2014 Double_t lV0MomZ = xi->MomV0Z();
2015 lV0TotMom = TMath::Sqrt(TMath::Power(lV0MomX,2)+TMath::Power(lV0MomY,2)+TMath::Power(lV0MomZ,2));
2017 lBachMomX = xi->MomBachX();
2018 lBachMomY = xi->MomBachY();
2019 lBachMomZ = xi->MomBachZ();
2020 lBachTransvMom = TMath::Sqrt( lBachMomX*lBachMomX + lBachMomY*lBachMomY );
2021 lBachTotMom = TMath::Sqrt( lBachMomX*lBachMomX + lBachMomY*lBachMomY + lBachMomZ*lBachMomZ );
2023 lV0NMomX = xi->MomNegX();
2024 lV0NMomY = xi->MomNegY();
2025 lV0PMomX = xi->MomPosX();
2026 lV0PMomY = xi->MomPosY();
2028 lnTrackTransvMom = TMath::Sqrt( lV0NMomX*lV0NMomX + lV0NMomY*lV0NMomY );
2029 lpTrackTransvMom = TMath::Sqrt( lV0PMomX*lV0PMomX + lV0PMomY*lV0PMomY );
2031 lV0toXiCosineOfPointingAngle = xi->CosPointingAngle( xi->GetDecayVertexXi() );
2033 lRapXi = xi->RapXi();
2034 lRapOmega = xi->RapOmega();
2035 lEta = xi->Eta(); // Will not work ! need a method Pz(), Py() Px()
2036 lTheta = xi->Theta() *180.0/TMath::Pi(); // in AODcascade.
2037 lPhi = xi->Phi() *180.0/TMath::Pi(); // Here, we will get eta, theta, phi for the V0 ...
2038 lAlphaXi = xi->AlphaXi();
2039 lPtArmXi = xi->PtArmXi();
2041 // II.Step 7 - Complementary info for monitoring the cascade cut variables
2044 }// end of AOD treatment
2046 // Cut on pt of the three daughter tracks
2047 if (lBachTransvMom<fMinPtCutOnDaughterTracks) continue;
2048 if (lpTrackTransvMom<fMinPtCutOnDaughterTracks) continue;
2049 if (lnTrackTransvMom<fMinPtCutOnDaughterTracks) continue;
2052 // Calculate proper time for cascade
2054 Double_t cascadeMass = 0.;
2056 if ( ( (lChargeXi<0) && lIsBachelorPionForTPC && lIsPosProtonForTPC && lIsNegPionForTPC ) ||
2057 ( (lChargeXi>0) && lIsBachelorPionForTPC && lIsNegProtonForTPC && lIsPosPionForTPC ) ) cascadeMass = 1.321;
2059 if ( ( (lChargeXi<0) && lIsBachelorKaonForTPC && lIsPosProtonForTPC && lIsNegPionForTPC ) ||
2060 ( (lChargeXi>0) && lIsBachelorKaonForTPC && lIsNegProtonForTPC && lIsPosPionForTPC ) ) cascadeMass = 1.672;
2062 Double_t lctau = TMath::Sqrt(TMath::Power((lPosXi[0]-lBestPrimaryVtxPos[0]),2)+TMath::Power((lPosXi[1]-lBestPrimaryVtxPos[1]),2)+TMath::Power(( lPosXi[2]-lBestPrimaryVtxPos[2]),2));
2063 if (lXiTotMom!=0) lctau = lctau*cascadeMass/lXiTotMom;
2067 // Calculate proper time for Lambda (reconstructed)
2068 Float_t lambdaMass = 1.115683; // PDG mass
2069 Float_t distV0Xi = TMath::Sqrt(TMath::Power((lPosV0Xi[0]-lPosXi[0]),2)+TMath::Power((lPosV0Xi[1]-lPosXi[1]),2)+TMath::Power((lPosV0Xi[2]-lPosXi[2]),2));
2070 Float_t lctauV0 = -1.;
2071 if (lV0TotMom!=0) lctauV0 = distV0Xi*lambdaMass/lV0TotMom;
2073 Float_t distTV0Xi = TMath::Sqrt(TMath::Power((lPosV0Xi[0]-lPosXi[0]),2)+TMath::Power((lPosV0Xi[1]-lPosXi[1]),2));
2076 // -------------------------------------
2077 // II.Fill - Filling the TH1,2,3Fs, HnSparses, CFContainers, FOR events with CASCADES !
2079 /* if(lChargeXi < 0&& lIsBachelorPionForTPC && lIsPosProtonForTPC && lIsNegPionForTPC ) {
2080 if (lXiTransvMom>2.&&lXiTransvMom<4.&&(lInvMassXiMinus<1.322&&lInvMassXiMinus>1.320)&&(lXiRadius<8.&&lXiRadius>3.)) {
2081 // // FIXME : Just to know which file is currently open : locate the file containing Xi
2082 cout << "Name of the file containing Xi candidate(s) :"
2083 << CurrentFileName()
2084 << " / entry: " << Entry()
2085 << " / in file: " << lESDevent->GetEventNumberInFile() // <- Cvetan / From Mihaela: AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()->GetTree()->GetReadEntry();
2086 << " AliESDcascade number " << iXi
2087 << " : mass(Xi-) = " << lInvMassXiMinus
2088 << " / charge = " << lChargeXi
2089 << " / pt(Casc) = " << lXiTransvMom
2090 << " / Decay 2d R(Xi) = " << lXiRadius
2094 if(lChargeXi < 0&& lIsBachelorKaonForTPC && lIsPosProtonForTPC && lIsNegPionForTPC ) {
2095 if (lXiTransvMom>2&&lXiTransvMom<4&&(lInvMassOmegaMinus<1.674&&lInvMassOmegaMinus>1.670)&&(lXiRadius<8.&&lXiRadius>3.)) {
2096 cout << "Name of the file containing Omega candidate(s) :"
2097 << CurrentFileName()
2098 << " / entry: " << Entry()
2099 << " / in file: " << lESDevent->GetEventNumberInFile() // <- Cvetan / From Mihaela: AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()->GetTree()->GetReadEntry();
2100 << " AliESDcascade number " << iXi
2101 << " : mass(Omega-) = " << lInvMassOmegaMinus
2102 << " / charge = " << lChargeXi
2103 << " / pt(Casc) = " << lXiTransvMom
2104 << " / Decay 2d R(Xi) = " << lXiRadius
2112 // - II.Fill.Step 1 : primary vertex
2114 fHistTPCrefitTrackMultiplicityForCascadeEvt->Fill( nTrackWithTPCrefitMultiplicity );
2116 fHistPosV0TPCClusters ->Fill( lPosTPCClusters );
2117 fHistNegV0TPCClusters ->Fill( lNegTPCClusters );
2118 fHistBachTPCClusters ->Fill( lBachTPCClusters );
2120 f2dHistTPCdEdxOfCascDghters ->Fill( lInnerWallMomCascDghters[0] , lTPCSignalCascDghters[0] );
2121 f2dHistTPCdEdxOfCascDghters ->Fill( lInnerWallMomCascDghters[1] , lTPCSignalCascDghters[1] );
2122 f2dHistTPCdEdxOfCascDghters ->Fill( lInnerWallMomCascDghters[2] , lTPCSignalCascDghters[2] );
2124 fHistVtxStatus ->Fill( lStatusTrackingPrimVtx ); // 1 if tracking vtx = ok
2126 if ( lStatusTrackingPrimVtx ) {
2127 fHistPosTrkgPrimaryVtxXForCascadeEvt ->Fill( lTrkgPrimaryVtxPos[0] );
2128 fHistPosTrkgPrimaryVtxYForCascadeEvt ->Fill( lTrkgPrimaryVtxPos[1] );
2129 fHistPosTrkgPrimaryVtxZForCascadeEvt ->Fill( lTrkgPrimaryVtxPos[2] );
2130 fHistTrkgPrimaryVtxRadius ->Fill( lTrkgPrimaryVtxRadius3D );
2133 fHistPosBestPrimaryVtxXForCascadeEvt ->Fill( lBestPrimaryVtxPos[0] );
2134 fHistPosBestPrimaryVtxYForCascadeEvt ->Fill( lBestPrimaryVtxPos[1] );
2135 fHistPosBestPrimaryVtxZForCascadeEvt ->Fill( lBestPrimaryVtxPos[2] );
2136 fHistBestPrimaryVtxRadius ->Fill( lBestPrimaryVtxRadius3D );
2138 f2dHistTrkgPrimVtxVsBestPrimVtx->Fill( lTrkgPrimaryVtxRadius3D, lBestPrimaryVtxRadius3D );
2140 // **************************** With PID on ? ... for the signal region ? ************FIXME**************************************
2141 if ( ( (lChargeXi<0) && lIsBachelorPionForTPC && lIsPosProtonForTPC && lIsNegPionForTPC ) ||
2142 ( (lChargeXi>0) && lIsBachelorPionForTPC && lIsNegProtonForTPC && lIsPosPionForTPC ) )
2144 // with this condition, it could happen that a cascade candidate satisfies the wrong requirement,
2145 // e.g. one looks at a Xi- candidate for which lIsBachelorPionForTPC && lIsPosProtonForTPC && lIsNegPionForTPC = kFALSE
2146 // Expectation: it should be excluded.
2147 // but lIsBachelorPionForTPC && lIsNegProtonForTPC && lIsPosPionForTPC = kTRUE
2148 // then this bad Xi-candidate will contribute anyway (OR condition).
2149 // Hence : the extra condition on the sign of the Cascade
2151 // if( TMath::Abs( lInvMassXiMinus-1.3217 ) < 0.010 || TMath::Abs( lInvMassXiPlus-1.3217 ) < 0.010)
2154 fHistEffMassXi ->Fill( lEffMassXi );
2155 fHistChi2Xi ->Fill( lChi2Xi ); // Flag CascadeVtxer: Cut Variable a
2156 fHistDcaXiDaughters ->Fill( lDcaXiDaughters ); // Flag CascadeVtxer: Cut Variable e
2157 fHistDcaBachToPrimVertex ->Fill( lDcaBachToPrimVertexXi ); // Flag CascadeVtxer: Cut Variable d
2158 fHistXiCosineOfPointingAngle ->Fill( lXiCosineOfPointingAngle ); // Flag CascadeVtxer: Cut Variable f
2159 fHistXiRadius ->Fill( lXiRadius ); // Flag CascadeVtxer: Cut Variable g+h
2163 fHistMassLambdaAsCascDghter ->Fill( lInvMassLambdaAsCascDghter ); // Flag CascadeVtxer: Cut Variable c
2164 fHistV0Chi2Xi ->Fill( lV0Chi2Xi );
2165 fHistDcaV0DaughtersXi ->Fill( lDcaV0DaughtersXi );
2166 fHistV0CosineOfPointingAngle ->Fill( lV0CosineOfPointingAngle );
2167 fHistV0RadiusXi ->Fill( lV0RadiusXi );
2169 fHistDcaV0ToPrimVertexXi ->Fill( lDcaV0ToPrimVertexXi ); // Flag CascadeVtxer: Cut Variable b
2170 fHistDcaPosToPrimVertexXi ->Fill( lDcaPosToPrimVertexXi );
2171 fHistDcaNegToPrimVertexXi ->Fill( lDcaNegToPrimVertexXi );
2174 // II.Fill.Step 4 : extra QA info
2176 fHistChargeXi ->Fill( lChargeXi );
2177 fHistV0toXiCosineOfPointingAngle->Fill( lV0toXiCosineOfPointingAngle );
2179 if ( TMath::Abs( lInvMassXiMinus-1.3217 ) < 0.012 || TMath::Abs( lInvMassXiPlus-1.3217 ) < 0.012) {// One InvMass should be different from 0
2180 fHistXiTransvMom ->Fill( lXiTransvMom );
2181 fHistXiTotMom ->Fill( lXiTotMom );
2183 fHistBachTransvMomXi ->Fill( lBachTransvMom );
2184 fHistPosTransvMomXi ->Fill( lpTrackTransvMom );
2185 fHistNegTransvMomXi ->Fill( lnTrackTransvMom );
2186 fHistBachTotMomXi ->Fill( lBachTotMom );
2188 fHistRapXi ->Fill( lRapXi );
2189 fHistEtaXi ->Fill( lEta );
2190 fHistThetaXi ->Fill( lTheta );
2191 fHistPhiXi ->Fill( lPhi );
2194 if ( TMath::Abs( lInvMassOmegaMinus-1.672 ) < 0.012 || TMath::Abs( lInvMassOmegaPlus-1.672 ) < 0.012 ) {// One InvMass should be different from 0
2195 fHistRapOmega ->Fill( lRapOmega );
2198 f2dHistArmenteros ->Fill( lAlphaXi, lPtArmXi );
2199 }// end with PID ...
2201 // II.Fill.Step 5 : inv mass plots 1D
2202 if ( lChargeXi < 0 ) {
2203 fHistMassXiMinus ->Fill( lInvMassXiMinus );
2204 fHistMassOmegaMinus ->Fill( lInvMassOmegaMinus );
2205 if(lIsBachelorPion) fHistMassWithCombPIDXiMinus ->Fill( lInvMassXiMinus );
2206 if(lIsBachelorKaon) fHistMassWithCombPIDOmegaMinus ->Fill( lInvMassOmegaMinus );
2208 fHistDcaXiDaughtersvsInvMass->Fill(lDcaXiDaughters,lInvMassXiMinus);
2209 fHistDcaBachToPrimVertexvsInvMass->Fill(lDcaBachToPrimVertexXi,lInvMassXiMinus);
2210 fHistXiCosineOfPointingAnglevsInvMass->Fill(lXiCosineOfPointingAngle,lInvMassXiMinus);
2211 fHistMassLambdaAsCascDghtervsInvMass->Fill(lInvMassLambdaAsCascDghter,lInvMassXiMinus);
2212 fHistDcaV0DaughtersXivsInvMass->Fill(lDcaV0DaughtersXi,lInvMassXiMinus);
2213 fHistDcaV0ToPrimVertexXivsInvMass->Fill(lDcaV0ToPrimVertexXi,lInvMassXiMinus);
2216 if ( lChargeXi > 0 ) {
2217 fHistMassXiPlus ->Fill( lInvMassXiPlus );
2218 fHistMassOmegaPlus ->Fill( lInvMassOmegaPlus );
2219 if(lIsBachelorPion) fHistMassWithCombPIDXiPlus ->Fill( lInvMassXiPlus );
2220 if(lIsBachelorKaon) fHistMassWithCombPIDOmegaPlus ->Fill( lInvMassOmegaPlus );
2224 // II.Fill.Step 6 : inv mass plots 2D, 3D
2225 if ( lChargeXi < 0 ) {
2226 f2dHistEffMassLambdaVsEffMassXiMinus->Fill( lInvMassLambdaAsCascDghter, lInvMassXiMinus );
2227 f2dHistEffMassXiVsEffMassOmegaMinus ->Fill( lInvMassXiMinus, lInvMassOmegaMinus );
2228 f2dHistXiRadiusVsEffMassXiMinus ->Fill( lXiRadius, lInvMassXiMinus );
2229 f2dHistXiRadiusVsEffMassOmegaMinus ->Fill( lXiRadius, lInvMassOmegaMinus );
2230 // f3dHistXiPtVsEffMassVsYXiMinus ->Fill( lXiTransvMom, lInvMassXiMinus, lRapXi );
2231 // f3dHistXiPtVsEffMassVsYOmegaMinus ->Fill( lXiTransvMom, lInvMassOmegaMinus, lRapOmega );
2233 f2dHistEffMassLambdaVsEffMassXiPlus ->Fill( lInvMassLambdaAsCascDghter, lInvMassXiPlus );
2234 f2dHistEffMassXiVsEffMassOmegaPlus ->Fill( lInvMassXiPlus, lInvMassOmegaPlus );
2235 f2dHistXiRadiusVsEffMassXiPlus ->Fill( lXiRadius, lInvMassXiPlus);
2236 f2dHistXiRadiusVsEffMassOmegaPlus ->Fill( lXiRadius, lInvMassOmegaPlus );
2237 // f3dHistXiPtVsEffMassVsYXiPlus ->Fill( lXiTransvMom, lInvMassXiPlus, lRapXi );
2238 // f3dHistXiPtVsEffMassVsYOmegaPlus ->Fill( lXiTransvMom, lInvMassOmegaPlus, lRapOmega );
2241 // - Filling the AliCFContainers related to PID
2243 Double_t lContainerPIDVars[4] = {0.0};
2246 if ( lChargeXi < 0 ) {
2247 lContainerPIDVars[0] = lXiTransvMom ;
2248 lContainerPIDVars[1] = lInvMassXiMinus ;
2249 lContainerPIDVars[2] = lRapXi ;
2250 lContainerPIDVars[3] = lcentrality;
2253 fCFContCascadePIDXiMinus->Fill(lContainerPIDVars, 0); // No PID
2255 if ( lIsBachelorPionForTPC )
2256 fCFContCascadePIDXiMinus->Fill(lContainerPIDVars, 1); // TPC PID / 4-#sigma cut on Bachelor track
2258 if ( lIsBachelorPionForTPC &&
2259 lIsPosProtonForTPC )
2260 fCFContCascadePIDXiMinus->Fill(lContainerPIDVars, 2); // TPC PID / 4-#sigma cut on Bachelor+Baryon tracks
2262 if ( lIsBachelorPionForTPC &&
2263 lIsPosProtonForTPC &&
2265 fCFContCascadePIDXiMinus->Fill(lContainerPIDVars, 3); // TPC PID / 4-#sigma cut on Bachelor+Baryon+Meson tracks
2268 if ( lIsBachelorPion )
2269 fCFContCascadePIDXiMinus->Fill(lContainerPIDVars, 4); // Comb. PID / Bachelor
2271 if ( lIsBachelorPion &&
2273 fCFContCascadePIDXiMinus->Fill(lContainerPIDVars, 5); // Comb. PID / Bachelor+Baryon
2275 if (lIsBachelorPion &&
2278 fCFContCascadePIDXiMinus->Fill(lContainerPIDVars, 6); // Comb. PID / Bachelor+Baryon+Meson
2281 lContainerPIDVars[0] = 0.; lContainerPIDVars[1] = 0.; lContainerPIDVars[2] = 0.; lContainerPIDVars[3] = 0.;
2284 if ( lChargeXi > 0 ) {
2285 lContainerPIDVars[0] = lXiTransvMom ;
2286 lContainerPIDVars[1] = lInvMassXiPlus ;
2287 lContainerPIDVars[2] = lRapXi ;
2288 lContainerPIDVars[3] = lcentrality;
2291 fCFContCascadePIDXiPlus->Fill(lContainerPIDVars, 0); // No PID
2293 if ( lIsBachelorPionForTPC )
2294 fCFContCascadePIDXiPlus->Fill(lContainerPIDVars, 1); // TPC PID / 4-#sigma cut on Bachelor track
2296 if ( lIsBachelorPionForTPC &&
2297 lIsNegProtonForTPC )
2298 fCFContCascadePIDXiPlus->Fill(lContainerPIDVars, 2); // TPC PID / 4-#sigma cut on Bachelor+Baryon tracks
2300 if ( lIsBachelorPionForTPC &&
2301 lIsNegProtonForTPC &&
2303 fCFContCascadePIDXiPlus->Fill(lContainerPIDVars, 3); // TPC PID / 4-#sigma cut on Bachelor+Baryon+Meson tracks
2306 if ( lIsBachelorPion )
2307 fCFContCascadePIDXiPlus->Fill(lContainerPIDVars, 4); // Comb. PID / Bachelor
2309 if ( lIsBachelorPion &&
2311 fCFContCascadePIDXiPlus->Fill(lContainerPIDVars, 5); // Comb. PID / Bachelor+Baryon
2313 if (lIsBachelorPion &&
2316 fCFContCascadePIDXiPlus->Fill(lContainerPIDVars, 6); // Comb. PID / Bachelor+Baryon+Meson
2319 lContainerPIDVars[0] = 0.; lContainerPIDVars[1] = 0.; lContainerPIDVars[2] = 0.; lContainerPIDVars[3] = 0.;
2322 if ( lChargeXi < 0 ) {
2323 lContainerPIDVars[0] = lXiTransvMom ;
2324 lContainerPIDVars[1] = lInvMassOmegaMinus ;
2325 lContainerPIDVars[2] = lRapOmega ;
2326 lContainerPIDVars[3] = lcentrality;
2329 fCFContCascadePIDOmegaMinus->Fill(lContainerPIDVars, 0); // No PID
2331 if ( lIsBachelorKaonForTPC )
2332 fCFContCascadePIDOmegaMinus->Fill(lContainerPIDVars, 1); // TPC PID / 4-#sigma cut on Bachelor track
2334 if ( lIsBachelorKaonForTPC &&
2335 lIsPosProtonForTPC )
2336 fCFContCascadePIDOmegaMinus->Fill(lContainerPIDVars, 2); // TPC PID / 4-#sigma cut on Bachelor+Baryon tracks
2338 if ( lIsBachelorKaonForTPC &&
2339 lIsPosProtonForTPC &&
2341 fCFContCascadePIDOmegaMinus->Fill(lContainerPIDVars, 3); // TPC PID / 4-#sigma cut on Bachelor+Baryon+Meson tracks
2344 if ( lIsBachelorKaon )
2345 fCFContCascadePIDOmegaMinus->Fill(lContainerPIDVars, 4); // Comb. PID / Bachelor
2347 if ( lIsBachelorKaon &&
2348 lIsPosInOmegaProton )
2349 fCFContCascadePIDOmegaMinus->Fill(lContainerPIDVars, 5); // Comb. PID / Bachelor+Baryon
2351 if (lIsBachelorKaon &&
2352 lIsPosInOmegaProton &&
2354 fCFContCascadePIDOmegaMinus->Fill(lContainerPIDVars, 6); // Comb. PID / Bachelor+Baryon+Meson
2357 lContainerPIDVars[0] = 0.; lContainerPIDVars[1] = 0.; lContainerPIDVars[2] = 0.; lContainerPIDVars[3] = 0.;
2360 if ( lChargeXi > 0 ) {
2361 lContainerPIDVars[0] = lXiTransvMom ;
2362 lContainerPIDVars[1] = lInvMassOmegaPlus ;
2363 lContainerPIDVars[2] = lRapOmega ;
2364 lContainerPIDVars[3] = lcentrality;
2367 fCFContCascadePIDOmegaPlus->Fill(lContainerPIDVars, 0); // No PID
2369 if ( lIsBachelorKaonForTPC )
2370 fCFContCascadePIDOmegaPlus->Fill(lContainerPIDVars, 1); // TPC PID / 4-#sigma cut on Bachelor track
2372 if( lIsBachelorKaonForTPC &&
2373 lIsNegProtonForTPC )
2374 fCFContCascadePIDOmegaPlus->Fill(lContainerPIDVars, 2); // TPC PID / 4-#sigma cut on Bachelor+Baryon tracks
2376 if ( lIsBachelorKaonForTPC &&
2377 lIsNegProtonForTPC &&
2379 fCFContCascadePIDOmegaPlus->Fill(lContainerPIDVars, 3); // TPC PID / 4-#sigma cut on Bachelor+Baryon+Meson tracks
2382 if ( lIsBachelorKaon )
2383 fCFContCascadePIDOmegaPlus->Fill(lContainerPIDVars, 4); // Comb. PID / Bachelor
2385 if ( lIsBachelorKaon &&
2386 lIsNegInOmegaProton )
2387 fCFContCascadePIDOmegaPlus->Fill(lContainerPIDVars, 5); // Comb. PID / Bachelor+Baryon
2389 if (lIsBachelorKaon &&
2390 lIsNegInOmegaProton &&
2392 fCFContCascadePIDOmegaPlus->Fill(lContainerPIDVars, 6); // Comb. PID / Bachelor+Baryon+Meson
2396 // II.Fill.Step 7 : filling the AliCFContainer (optimisation of topological selections)
2397 Double_t lContainerCutVars[22] = {0.0};
2399 lContainerCutVars[0] = lDcaXiDaughters;
2400 lContainerCutVars[1] = lDcaBachToPrimVertexXi;
2401 lContainerCutVars[2] = lXiCosineOfPointingAngle;
2402 lContainerCutVars[3] = lXiRadius;
2403 lContainerCutVars[4] = lInvMassLambdaAsCascDghter;
2404 lContainerCutVars[5] = lDcaV0DaughtersXi;
2405 lContainerCutVars[6] = lV0CosineOfPointingAngle;//lV0toXiCosineOfPointingAngle;
2406 lContainerCutVars[7] = lV0RadiusXi;
2407 lContainerCutVars[8] = lDcaV0ToPrimVertexXi;
2408 lContainerCutVars[9] = lDcaPosToPrimVertexXi;
2409 lContainerCutVars[10] = lDcaNegToPrimVertexXi;
2411 lContainerCutVars[13] = lXiTransvMom;
2413 lContainerCutVars[16] = lBestPrimaryVtxPos[2];
2414 lContainerCutVars[17] = lcentrality;
2415 lContainerCutVars[18] = lPrimaryTrackMultiplicity;
2416 // lContainerCutVars[19] = lBachTPCClusters;
2418 lContainerCutVars[19] = lctau;
2419 lContainerCutVars[20] = lctauV0;
2420 lContainerCutVars[21] = distTV0Xi;
2422 if ( lChargeXi < 0 ) {
2423 lContainerCutVars[11] = lInvMassXiMinus;
2424 lContainerCutVars[12] = lInvMassOmegaMinus;//1.63;
2425 lContainerCutVars[14] = lRapXi;
2426 lContainerCutVars[15] = -1.;
2427 if ( lIsBachelorPionForTPC && lIsPosProtonForTPC && lIsNegPionForTPC )
2428 fCFContCascadeCuts->Fill(lContainerCutVars,0); // for Xi-
2430 lContainerCutVars[11] = lInvMassXiMinus;
2431 lContainerCutVars[12] = lInvMassOmegaMinus;
2432 lContainerCutVars[14] = -1.;
2433 lContainerCutVars[15] = lRapOmega;
2434 if ( lIsBachelorKaonForTPC && lIsPosProtonForTPC && lIsNegPionForTPC )
2435 fCFContCascadeCuts->Fill(lContainerCutVars,2); // for Omega-
2437 lContainerCutVars[11] = lInvMassXiPlus;
2438 lContainerCutVars[12] = lInvMassOmegaPlus;//1.63;
2439 lContainerCutVars[14] = lRapXi;
2440 lContainerCutVars[15] = -1.;
2441 if ( lIsBachelorPionForTPC && lIsNegProtonForTPC && lIsPosPionForTPC )
2442 fCFContCascadeCuts->Fill(lContainerCutVars,1); // for Xi+
2444 lContainerCutVars[11] = lInvMassXiPlus;//1.26;
2445 lContainerCutVars[12] = lInvMassOmegaPlus;
2446 lContainerCutVars[14] = -1.;
2447 lContainerCutVars[15] = lRapOmega;
2448 if ( lIsBachelorKaonForTPC && lIsNegProtonForTPC && lIsPosPionForTPC )
2449 fCFContCascadeCuts->Fill(lContainerCutVars,3); // for Omega+
2452 }// end of the Cascade loop (ESD or AOD)
2455 // Post output data.
2456 PostData(1, fListHistCascade);
2457 PostData(2, fCFContCascadePIDXiMinus);
2458 PostData(3, fCFContCascadePIDXiPlus);
2459 PostData(4, fCFContCascadePIDOmegaMinus);
2460 PostData(5, fCFContCascadePIDOmegaPlus);
2461 PostData(6, fCFContCascadeCuts);
2464 //________________________________________________________________________
2465 Int_t AliAnalysisTaskCheckCascadePbPb::DoESDTrackWithTPCrefitMultiplicity(const AliESDEvent *lESDevent) {
2466 // Checking the number of tracks with TPCrefit for each event
2467 // Needed for a rough assessment of the event multiplicity
2469 Int_t nTrackWithTPCrefitMultiplicity = 0;
2470 for (Int_t iTrackIdx = 0; iTrackIdx < (InputEvent())->GetNumberOfTracks(); iTrackIdx++) {
2471 AliESDtrack *esdTrack = 0x0;
2472 esdTrack = lESDevent->GetTrack( iTrackIdx );
2473 if (!esdTrack) { AliWarning("Pb / Could not retrieve one track within the track loop for TPCrefit check ..."); continue; }
2475 ULong_t lTrackStatus = esdTrack->GetStatus();
2476 if ((lTrackStatus&AliESDtrack::kTPCrefit) == 0) continue;
2477 else nTrackWithTPCrefitMultiplicity++;
2479 // The goal here is to get a better assessment of the event multiplicity.
2480 // (InputEvent())->GetNumberOfTracks() takes into account ITS std alone tracks + global tracks
2481 // This may introduce a bias. Hence the number of TPC refit tracks.
2482 // Note : the event multiplicity = analysis on its own... See Jacek's or Jan Fiete's analysis on dN/d(eta)
2484 }// end loop over all event tracks
2485 return nTrackWithTPCrefitMultiplicity;
2488 //________________________________________________________________________
2489 void AliAnalysisTaskCheckCascadePbPb::Terminate(Option_t *)
2491 // Draw result to the screen
2492 // Called once at the end of the query
2494 TList *cRetrievedList = 0x0;
2495 cRetrievedList = (TList*)GetOutputData(1);
2496 if(!cRetrievedList){
2497 AliWarning("ERROR - AliAnalysisTaskCheckCascadePbPb: ouput data container list not available\n"); return;
2500 fHistTrackMultiplicityForCentrEvt = dynamic_cast<TH1F*> ( cRetrievedList->FindObject("fHistTrackMultiplicityForCentrEvt") );
2501 if (!fHistTrackMultiplicityForCentrEvt) {
2502 AliWarning("ERROR - AliAnalysisTaskCheckCascadePbPb: fHistTrackMultiplicityForCentrEvt not available\n"); return;
2505 fHistCascadeMultiplicityForCentrEvt = dynamic_cast<TH1F*> ( cRetrievedList->FindObject("fHistCascadeMultiplicityForCentrEvt") );
2506 if (!fHistCascadeMultiplicityForCentrEvt) {
2507 AliWarning("ERROR - AliAnalysisTaskCheckCascadePbPb: fHistCascadeMultiplicityForCentrEvt not available\n"); return;
2510 fHistMassXiMinus = dynamic_cast<TH1F*> ( cRetrievedList->FindObject("fHistMassXiMinus") );
2511 if (!fHistMassXiMinus) {
2512 AliWarning("ERROR - AliAnalysisTaskCheckCascadePbPb: fHistMassXiMinus not available\n"); return;
2514 fHistMassXiPlus = dynamic_cast<TH1F*> ( cRetrievedList->FindObject("fHistMassXiPlus") );
2515 if (!fHistMassXiPlus) {
2516 AliWarning("ERROR - AliAnalysisTaskCheckCascadePbPb: fHistMassXiPlus not available\n"); return;
2518 fHistMassOmegaMinus = dynamic_cast<TH1F*> ( cRetrievedList->FindObject("fHistMassOmegaMinus") );
2519 if (!fHistMassOmegaMinus) {
2520 AliWarning("ERROR - AliAnalysisTaskCheckCascadePbPb: fHistMassOmegaMinus not available\n"); return;
2522 fHistMassOmegaPlus = dynamic_cast<TH1F*> ( cRetrievedList->FindObject("fHistMassOmegaPlus") );
2523 if (!fHistMassOmegaPlus) {
2524 AliWarning("ERROR - AliAnalysisTaskCheckCascadePbPb: fHistMassOmegaPlus not available\n"); return;
2527 TCanvas *canCheckCascade = new TCanvas("AliAnalysisTaskCheckCascadePbPb","CheckCascade overview",10,10,1010,660);
2528 canCheckCascade->Divide(2,2);
2530 canCheckCascade->cd(1);
2531 canCheckCascade->cd(1)->SetLogy();
2532 fHistTrackMultiplicityForCentrEvt->SetMarkerStyle(kFullStar);
2533 fHistTrackMultiplicityForCentrEvt->GetXaxis()->SetLabelFont(42);
2534 fHistTrackMultiplicityForCentrEvt->GetYaxis()->SetLabelFont(42);
2535 fHistTrackMultiplicityForCentrEvt->SetTitleFont(42, "xy");
2536 fHistTrackMultiplicityForCentrEvt->GetXaxis()->SetTitleOffset(1.1);
2537 fHistTrackMultiplicityForCentrEvt->DrawCopy("H");
2539 canCheckCascade->cd(2);
2540 canCheckCascade->cd(2)->SetLogy();
2541 fHistCascadeMultiplicityForCentrEvt->SetMarkerStyle(kOpenSquare);
2542 fHistCascadeMultiplicityForCentrEvt->GetXaxis()->SetLabelFont(42);
2543 fHistCascadeMultiplicityForCentrEvt->GetYaxis()->SetLabelFont(42);
2544 fHistCascadeMultiplicityForCentrEvt->SetTitleFont(42, "xy");
2545 fHistCascadeMultiplicityForCentrEvt->GetXaxis()->SetTitleOffset(1.1);
2546 fHistCascadeMultiplicityForCentrEvt->DrawCopy("E");
2548 canCheckCascade->cd(3);
2549 fHistMassXiMinus ->SetMarkerStyle(kFullCircle);
2550 fHistMassXiMinus ->SetMarkerSize(0.5);
2551 fHistMassXiMinus ->GetXaxis()->SetLabelFont(42);
2552 fHistMassXiMinus ->GetYaxis()->SetLabelFont(42);
2553 fHistMassXiMinus ->SetTitleFont(42, "xy");
2554 fHistMassXiMinus ->GetXaxis()->SetTitleOffset(1.1);
2555 fHistMassXiMinus ->GetYaxis()->SetTitleOffset(1.3);
2556 // fHistMassXiMinus->Rebin(2);
2557 fHistMassXiMinus ->GetXaxis()->SetRangeUser(1.24, 1.42);
2558 fHistMassXiMinus ->DrawCopy("E");
2560 fHistMassXiPlus ->SetMarkerStyle(kOpenCircle);
2561 fHistMassXiPlus ->SetMarkerColor(kRed+2);
2562 fHistMassXiPlus ->SetLineColor(kRed+2);
2563 fHistMassXiPlus ->SetMarkerSize(0.5);
2564 // fHistMassXiPlus ->Rebin(2);
2565 fHistMassXiPlus ->DrawCopy("ESAME");
2568 TLegend *legendXi =new TLegend(0.67,0.34,0.97,0.54);
2569 legendXi->SetTextFont(42);
2570 legendXi->SetTextSize(0.05);
2571 legendXi->SetFillColor(kWhite);
2572 legendXi->AddEntry( fHistMassXiMinus,"#Xi^{-} candidates","lp");
2573 legendXi->AddEntry( fHistMassXiPlus,"#Xi^{+} candidates","lp");
2577 canCheckCascade->cd(4);
2578 fHistMassOmegaPlus ->SetMarkerStyle(kOpenCircle);
2579 fHistMassOmegaPlus ->SetMarkerColor(kRed+2);
2580 fHistMassOmegaPlus ->SetLineColor(kRed+2);
2581 fHistMassOmegaPlus ->SetMarkerSize(0.5);
2582 fHistMassOmegaPlus ->GetXaxis()->SetLabelFont(42);
2583 fHistMassOmegaPlus ->GetYaxis()->SetLabelFont(42);
2584 fHistMassOmegaPlus ->SetTitleFont(42, "xy");
2585 fHistMassOmegaPlus ->GetXaxis()->SetTitleOffset(1.1);
2586 fHistMassOmegaPlus ->GetYaxis()->SetTitleOffset(1.25);
2587 // fHistMassOmegaPlus ->Rebin(2);
2588 fHistMassOmegaPlus ->GetXaxis()->SetRangeUser(1.6, 1.84);
2589 fHistMassOmegaPlus ->DrawCopy("E");
2591 fHistMassOmegaMinus->SetMarkerStyle(kFullCircle);
2592 fHistMassOmegaMinus->SetMarkerSize(0.5);
2593 // fHistMassOmegaMinus->Rebin(2);
2594 fHistMassOmegaMinus->DrawCopy("ESAME");
2597 TLegend *legendOmega = new TLegend(0.67,0.34,0.97,0.54);
2598 legendOmega->SetTextFont(42);
2599 legendOmega->SetTextSize(0.05);
2600 legendOmega->SetFillColor(kWhite);
2601 legendOmega->AddEntry( fHistMassOmegaMinus,"#Omega^{-} candidates","lp");
2602 legendOmega->AddEntry( fHistMassOmegaPlus,"#Omega^{+} candidates","lp");
2603 legendOmega->Draw();