]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWG2/SPECTRA/AliAnalysisTaskCheckCascade.cxx
Fixes for memory problems
[u/mrichter/AliRoot.git] / PWG2 / SPECTRA / AliAnalysisTaskCheckCascade.cxx
CommitLineData
45ee0bcc 1
2/**************************************************************************
3 * Authors : Antonin Maire, Boris Hippolyte *
4 * Contributors are mentioned in the code where appropriate. *
5 * *
6 * Permission to use, copy, modify and distribute this software and its *
7 * documentation strictly for non-commercial purposes is hereby granted *
8 * without fee, provided that the above copyright notice appears in all *
9 * copies and that both the copyright notice and this permission notice *
10 * appear in the supporting documentation. The authors make no claims *
11 * about the suitability of this software for any purpose. It is *
12 * provided "as is" without express or implied warranty. *
13 **************************************************************************/
14
15//-----------------------------------------------------------------
16// AliAnalysisTaskCheckCascade class
684aef2e 17// This task is for QAing the Cascades from ESD and AOD
e9c3f0b6 18// Origin : Antonin Maire Fev2008, antonin.maire@ires.in2p3.fr
19// Modified : A.Maire June 2009
45ee0bcc 20//-----------------------------------------------------------------
21
22
23
24
25class TTree;
26class TParticle;
27class TVector3;
28
29//class AliMCEventHandler;
30//class AliMCEvent;
31//class AliStack;
32
33class AliESDVertex;
34class AliAODVertex;
35class AliESDv0;
36class AliAODv0;
37
f87cd3db 38#include <Riostream.h>
45ee0bcc 39
40#include "TList.h"
6dc8b253 41#include "TH1.h"
42#include "TH2.h"
ff0753e1 43#include "TH3.h"
45ee0bcc 44#include "TCanvas.h"
45#include "TMath.h"
46
47#include "AliLog.h"
48
49#include "AliESDEvent.h"
50#include "AliAODEvent.h"
51//#include "AliCascadeVertexer.h"
52
53#include "AliESDcascade.h"
54#include "AliAODcascade.h"
55
56#include "AliAnalysisTaskCheckCascade.h"
57
58ClassImp(AliAnalysisTaskCheckCascade)
59
60
61
62//________________________________________________________________________
63AliAnalysisTaskCheckCascade::AliAnalysisTaskCheckCascade()
64 : AliAnalysisTaskSE(), fAnalysisType("ESD"), fCollidingSystems(0),
65
66 // - Cascade part initialisation
67 fListHistCascade(0),
68 fHistTrackMultiplicity(0), fHistCascadeMultiplicity(0),
69 fHistVtxStatus(0),
70
71 fHistPosTrkgPrimaryVtxX(0), fHistPosTrkgPrimaryVtxY(0), fHistPosTrkgPrimaryVtxZ(0), fHistTrkgPrimaryVtxRadius(0),
72 fHistPosBestPrimaryVtxX(0), fHistPosBestPrimaryVtxY(0), fHistPosBestPrimaryVtxZ(0), fHistBestPrimaryVtxRadius(0),
73 f2dHistTrkgPrimVtxVsBestPrimVtx(0),
74
75 fHistEffMassXi(0), fHistChi2Xi(0),
76 fHistDcaXiDaughters(0), fHistDcaBachToPrimVertex(0), fHistXiCosineOfPointingAngle(0), fHistXiRadius(0),
77
78 fHistMassLambdaAsCascDghter(0),
79 fHistV0Chi2Xi(0),
80 fHistDcaV0DaughtersXi(0),
81 fHistDcaV0ToPrimVertexXi(0),
82 fHistV0CosineOfPointingAngleXi(0),
83 fHistV0RadiusXi(0),
84 fHistDcaPosToPrimVertexXi(0), fHistDcaNegToPrimVertexXi(0),
85
86 fHistMassXiMinus(0), fHistMassXiPlus(0),
87 fHistMassOmegaMinus(0), fHistMassOmegaPlus(0),
f87cd3db 88 fHistMassWithCombPIDXiMinus(0), fHistMassWithCombPIDXiPlus(0),
89 fHistMassWithCombPIDOmegaMinus(0), fHistMassWithCombPIDOmegaPlus(0),
45ee0bcc 90
91 fHistXiTransvMom(0), fHistXiTotMom(0),
92 fHistBachTransvMom(0), fHistBachTotMom(0),
93
94 fHistChargeXi(0),
95 fHistV0toXiCosineOfPointingAngle(0),
96
97 fHistRapXi(0), fHistRapOmega(0), fHistEta(0),
98 fHistTheta(0), fHistPhi(0),
99
100 f2dHistArmenteros(0),
101 f2dHistEffMassLambdaVsEffMassXiMinus(0), f2dHistEffMassXiVsEffMassOmegaMinus(0),
102 f2dHistEffMassLambdaVsEffMassXiPlus(0), f2dHistEffMassXiVsEffMassOmegaPlus(0),
e9c3f0b6 103 f2dHistXiRadiusVsEffMassXiMinus(0), f2dHistXiRadiusVsEffMassXiPlus(0),
104 f2dHistXiRadiusVsEffMassOmegaMinus(0), f2dHistXiRadiusVsEffMassOmegaPlus(0),
105
ff0753e1 106 f3dHistXiPtVsEffMassVsYXiMinus(0), f3dHistXiPtVsEffMassVsYXiPlus(0),
107 f3dHistXiPtVsEffMassVsYOmegaMinus(0), f3dHistXiPtVsEffMassVsYOmegaPlus(0)
45ee0bcc 108
109{
110 // Dummy Constructor
111}
112
113
114
115
116
117
118
119
120//________________________________________________________________________
121AliAnalysisTaskCheckCascade::AliAnalysisTaskCheckCascade(const char *name)
122 : AliAnalysisTaskSE(name), fAnalysisType("ESD"), fCollidingSystems(0),
123
124 // - Cascade part initialisation
125 fListHistCascade(0),
126 fHistTrackMultiplicity(0), fHistCascadeMultiplicity(0),
127 fHistVtxStatus(0),
128
129 fHistPosTrkgPrimaryVtxX(0), fHistPosTrkgPrimaryVtxY(0), fHistPosTrkgPrimaryVtxZ(0), fHistTrkgPrimaryVtxRadius(0),
130 fHistPosBestPrimaryVtxX(0), fHistPosBestPrimaryVtxY(0), fHistPosBestPrimaryVtxZ(0), fHistBestPrimaryVtxRadius(0),
131 f2dHistTrkgPrimVtxVsBestPrimVtx(0),
132
133 fHistEffMassXi(0), fHistChi2Xi(0),
134 fHistDcaXiDaughters(0), fHistDcaBachToPrimVertex(0), fHistXiCosineOfPointingAngle(0), fHistXiRadius(0),
135
136 fHistMassLambdaAsCascDghter(0),
137 fHistV0Chi2Xi(0),
138 fHistDcaV0DaughtersXi(0),
139 fHistDcaV0ToPrimVertexXi(0),
140 fHistV0CosineOfPointingAngleXi(0),
141 fHistV0RadiusXi(0),
142 fHistDcaPosToPrimVertexXi(0), fHistDcaNegToPrimVertexXi(0),
143
144 fHistMassXiMinus(0), fHistMassXiPlus(0),
145 fHistMassOmegaMinus(0), fHistMassOmegaPlus(0),
f87cd3db 146 fHistMassWithCombPIDXiMinus(0), fHistMassWithCombPIDXiPlus(0),
147 fHistMassWithCombPIDOmegaMinus(0), fHistMassWithCombPIDOmegaPlus(0),
45ee0bcc 148
149 fHistXiTransvMom(0), fHistXiTotMom(0),
150 fHistBachTransvMom(0), fHistBachTotMom(0),
151
152 fHistChargeXi(0),
153 fHistV0toXiCosineOfPointingAngle(0),
154
155 fHistRapXi(0), fHistRapOmega(0), fHistEta(0),
156 fHistTheta(0), fHistPhi(0),
157
158 f2dHistArmenteros(0),
159 f2dHistEffMassLambdaVsEffMassXiMinus(0), f2dHistEffMassXiVsEffMassOmegaMinus(0),
160 f2dHistEffMassLambdaVsEffMassXiPlus(0), f2dHistEffMassXiVsEffMassOmegaPlus(0),
e9c3f0b6 161 f2dHistXiRadiusVsEffMassXiMinus(0), f2dHistXiRadiusVsEffMassXiPlus(0),
162 f2dHistXiRadiusVsEffMassOmegaMinus(0), f2dHistXiRadiusVsEffMassOmegaPlus(0),
163
ff0753e1 164 f3dHistXiPtVsEffMassVsYXiMinus(0), f3dHistXiPtVsEffMassVsYXiPlus(0),
165 f3dHistXiPtVsEffMassVsYOmegaMinus(0), f3dHistXiPtVsEffMassVsYOmegaPlus(0)
45ee0bcc 166
167{
168 // Constructor
169
170 // Define input and output slots here
171 // Input slot #0 works with a TChain
172
173 // Output slot #0 writes into a TList container (Cascade)
174 DefineOutput(1, TList::Class());
175}
176
177
178
179
180
181
182//________________________________________________________________________
183void AliAnalysisTaskCheckCascade::UserCreateOutputObjects()
184{
185 // Create histograms
186 // Called once
187
188
189
190 fListHistCascade = new TList();
191
192
193 // - General histos
194
195if(! fHistTrackMultiplicity) {
196 if(fCollidingSystems)// AA collisions
197 fHistTrackMultiplicity = new TH1F("fHistTrackMultiplicity",
198 "Multiplicity distribution;Number of tracks;Events",
199 200, 0, 40000);
200 else // pp collisions
201 fHistTrackMultiplicity = new TH1F("fHistTrackMultiplicity",
202 "Track Multiplicity;Nbr of tracks/Evt;Events",
203 200, 0, 200);
204 fListHistCascade->Add(fHistTrackMultiplicity);
205}
206
207if(! fHistCascadeMultiplicity) {
208 if(fCollidingSystems)// AA collisions
209 fHistCascadeMultiplicity = new TH1F("fHistCascadeMultiplicity",
210 "Multiplicity distribution;Number of Cascades;Events",
211 25, 0, 25);
212 else // pp collisions
213 fHistCascadeMultiplicity = new TH1F("fHistCascadeMultiplicity",
214 "Cascades per event;Nbr of Cascades/Evt;Events",
215 10, 0, 10);
216 fListHistCascade->Add(fHistCascadeMultiplicity);
217}
218
219
220
221if(! fHistVtxStatus ){
222 fHistVtxStatus = new TH1F( "fHistVtxStatus" , "Does a Trckg Prim.vtx exist ?; true=1 or false=0; Nb of Events" , 4, -1.0, 3.0 );
223 fListHistCascade->Add(fHistVtxStatus);
224}
225
226
227
228
229
230
231 // - Vertex Positions
232
233if(! fHistPosTrkgPrimaryVtxX ){
234 fHistPosTrkgPrimaryVtxX = new TH1F( "fHistPosTrkgPrimaryVtxX" , "Trkg Prim. Vertex Position in x; x (cm); Events" , 200, -0.5, 0.5 );
235 fListHistCascade->Add(fHistPosTrkgPrimaryVtxX);
236}
237
238
239if(! fHistPosTrkgPrimaryVtxY){
240 fHistPosTrkgPrimaryVtxY = new TH1F( "fHistPosTrkgPrimaryVtxY" , "Trkg Prim. Vertex Position in y; y (cm); Events" , 200, -0.5, 0.5 );
241 fListHistCascade->Add(fHistPosTrkgPrimaryVtxY);
242}
243
244if(! fHistPosTrkgPrimaryVtxZ ){
245 fHistPosTrkgPrimaryVtxZ = new TH1F( "fHistPosTrkgPrimaryVtxZ" , "Trkg Prim. Vertex Position in z; z (cm); Events" , 100, -15.0, 15.0 );
246 fListHistCascade->Add(fHistPosTrkgPrimaryVtxZ);
247}
248
249if(! fHistTrkgPrimaryVtxRadius ){
250 fHistTrkgPrimaryVtxRadius = new TH1F( "fHistTrkgPrimaryVtxRadius", "Trkg Prim. Vertex radius; r (cm); Events" , 150, 0., 15.0 );
251 fListHistCascade->Add(fHistTrkgPrimaryVtxRadius);
252}
253
254
255
256
257if(! fHistPosBestPrimaryVtxX ){
258 fHistPosBestPrimaryVtxX = new TH1F( "fHistPosBestPrimaryVtxX" , "Best Prim. Vertex Position in x; x (cm); Events" , 200, -0.5, 0.5 );
259 fListHistCascade->Add(fHistPosBestPrimaryVtxX);
260}
261
262if(! fHistPosBestPrimaryVtxY){
263 fHistPosBestPrimaryVtxY = new TH1F( "fHistPosBestPrimaryVtxY" , "Best Prim. Vertex Position in y; y (cm); Events" , 200, -0.5, 0.5 );
264 fListHistCascade->Add(fHistPosBestPrimaryVtxY);
265}
266
267if(! fHistPosBestPrimaryVtxZ ){
268 fHistPosBestPrimaryVtxZ = new TH1F( "fHistPosBestPrimaryVtxZ" , "Best Prim. Vertex Position in z; z (cm); Events" , 100, -15.0, 15.0 );
269 fListHistCascade->Add(fHistPosBestPrimaryVtxZ);
270}
271
272if(! fHistBestPrimaryVtxRadius ){
273 fHistBestPrimaryVtxRadius = new TH1F( "fHistBestPrimaryVtxRadius", "Best Prim. vertex radius; r (cm); Events" , 150, 0., 15.0 );
274 fListHistCascade->Add(fHistBestPrimaryVtxRadius);
275}
276
277if(! f2dHistTrkgPrimVtxVsBestPrimVtx) {
278 f2dHistTrkgPrimVtxVsBestPrimVtx = new TH2F( "f2dHistTrkgPrimVtxVsBestPrimVtx", "r_{Trck Prim. Vtx} Vs r_{Best Prim. Vtx}; r_{Track Vtx} (cm); r_{Best Vtx} (cm)", 300, 0., 15.0, 300, 0., 15.);
279 fListHistCascade->Add(f2dHistTrkgPrimVtxVsBestPrimVtx);
280}
281
282
283
284
285// - Typical histos for cascades
286
287
288if(! fHistEffMassXi) {
289 fHistEffMassXi = new TH1F("fHistEffMassXi", "Cascade candidates ; Invariant Mass (GeV/c^{2}) ; Counts", 200, 1.2, 2.0);
290 fListHistCascade->Add(fHistEffMassXi);
291}
292
293if(! fHistChi2Xi ){
294 fHistChi2Xi = new TH1F("fHistChi2Xi", "Cascade #chi^{2}; #chi^{2}; Number of Cascades", 160, 0, 40);
295 fListHistCascade->Add(fHistChi2Xi);
296}
297
298if(! fHistDcaXiDaughters ){
299 fHistDcaXiDaughters = new TH1F( "fHistDcaXiDaughters", "DCA between Xi Daughters; DCA (cm) ; Number of Cascades", 100, 0., 0.5);
300 fListHistCascade->Add(fHistDcaXiDaughters);
301}
302
303if(! fHistDcaBachToPrimVertex) {
304 fHistDcaBachToPrimVertex = new TH1F("fHistDcaBachToPrimVertex", "DCA of Bach. to Prim. Vertex;DCA (cm);Number of Cascades", 250, 0., 0.25);
305 fListHistCascade->Add(fHistDcaBachToPrimVertex);
306}
307
308if(! fHistXiCosineOfPointingAngle) {
309 fHistXiCosineOfPointingAngle = new TH1F("fHistXiCosineOfPointingAngle", "Cosine of Xi Pointing Angle; Cos (Xi Point.Angl);Number of Xis", 200, 0.98, 1.0);
310 fListHistCascade->Add(fHistXiCosineOfPointingAngle);
311}
312
313if(! fHistXiRadius ){
314 fHistXiRadius = new TH1F( "fHistXiRadius", "Casc. decay transv. radius; r (cm); Counts" , 200, 0., 20.0 );
315 fListHistCascade->Add(fHistXiRadius);
316}
317
318
319// - Histos about ~ the "V0 part" of the cascade, coming by inheritance from AliESDv0
320
321
322
323if (! fHistMassLambdaAsCascDghter) {
324 fHistMassLambdaAsCascDghter = new TH1F("fHistMassLambdaAsCascDghter","#Lambda associated to Casc. candidates;Eff. Mass (GeV/c^{2});Counts", 160,1.00,1.8);
325 fListHistCascade->Add(fHistMassLambdaAsCascDghter);
326}
327
328if (! fHistV0Chi2Xi) {
329 fHistV0Chi2Xi = new TH1F("fHistV0Chi2Xi", "V0 #chi^{2}, in cascade; #chi^{2};Counts", 160, 0, 40);
330 fListHistCascade->Add(fHistV0Chi2Xi);
331}
332
333if (! fHistDcaV0DaughtersXi) {
334 fHistDcaV0DaughtersXi = new TH1F("fHistDcaV0DaughtersXi", "DCA between V0 daughters, in cascade;DCA (cm);Number of V0s", 120, 0., 0.6);
335 fListHistCascade->Add(fHistDcaV0DaughtersXi);
336}
337
338if (! fHistDcaV0ToPrimVertexXi) {
339 fHistDcaV0ToPrimVertexXi = new TH1F("fHistDcaV0ToPrimVertexXi", "DCA of V0 to Prim. Vertex, in cascade;DCA (cm);Number of Cascades", 200, 0., 1.);
340 fListHistCascade->Add(fHistDcaV0ToPrimVertexXi);
341}
342
343if (! fHistV0CosineOfPointingAngleXi) {
344 fHistV0CosineOfPointingAngleXi = new TH1F("fHistV0CosineOfPointingAngleXi", "Cosine of V0 Pointing Angle, in cascade;Cos(V0 Point. Angl); Counts", 200, 0.98, 1.0);
345 fListHistCascade->Add(fHistV0CosineOfPointingAngleXi);
346}
347
348if (! fHistV0RadiusXi) {
349 fHistV0RadiusXi = new TH1F("fHistV0RadiusXi", "V0 decay radius, in cascade; radius (cm); Counts", 200, 0, 20);
350 fListHistCascade->Add(fHistV0RadiusXi);
351}
352
353if (! fHistDcaPosToPrimVertexXi) {
354 fHistDcaPosToPrimVertexXi = new TH1F("fHistDcaPosToPrimVertexXi", "DCA of V0 pos daughter to Prim. Vertex;DCA (cm);Counts", 300, 0, 3);
355 fListHistCascade->Add(fHistDcaPosToPrimVertexXi);
356}
357
358if (! fHistDcaNegToPrimVertexXi) {
359 fHistDcaNegToPrimVertexXi = new TH1F("fHistDcaNegToPrimVertexXi", "DCA of V0 neg daughter to Prim. Vertex;DCA (cm);Counts", 300, 0, 3);
360 fListHistCascade->Add(fHistDcaNegToPrimVertexXi);
361}
362
363
364
365
366 // - Effective mass histos for cascades.
f87cd3db 367// By cascade hyp
45ee0bcc 368if (! fHistMassXiMinus) {
369 fHistMassXiMinus = new TH1F("fHistMassXiMinus","#Xi^{-} candidates;M( #Lambda , #pi^{-} ) (GeV/c^{2});Counts", 200,1.2,2.0);
370 fListHistCascade->Add(fHistMassXiMinus);
371}
372
373if (! fHistMassXiPlus) {
374 fHistMassXiPlus = new TH1F("fHistMassXiPlus","#Xi^{+} candidates;M( #bar{#Lambda}^{0} , #pi^{+} ) (GeV/c^{2});Counts",200,1.2,2.0);
375 fListHistCascade->Add(fHistMassXiPlus);
376}
377
378if (! fHistMassOmegaMinus) {
379 fHistMassOmegaMinus = new TH1F("fHistMassOmegaMinus","#Omega^{-} candidates;M( #Lambda , K^{-} ) (GeV/c^{2});Counts", 250,1.5,2.5);
380 fListHistCascade->Add(fHistMassOmegaMinus);
381}
382
383if (! fHistMassOmegaPlus) {
384 fHistMassOmegaPlus = new TH1F("fHistMassOmegaPlus","#Omega^{+} candidates;M( #bar{#Lambda}^{0} , K^{+} ) (GeV/c^{2});Counts", 250,1.5,2.5);
385 fListHistCascade->Add(fHistMassOmegaPlus);
386}
387
f87cd3db 388// By cascade hyp + bachelor PID
389if (! fHistMassWithCombPIDXiMinus) {
390 fHistMassWithCombPIDXiMinus = new TH1F("fHistMassWithCombPIDXiMinus","#Xi^{-} candidates, with Bach. comb. PID;M( #Lambda , #pi^{-} ) (GeV/c^{2});Counts", 200,1.2,2.0);
391 fListHistCascade->Add(fHistMassWithCombPIDXiMinus);
392}
393
394if (! fHistMassWithCombPIDXiPlus) {
395 fHistMassWithCombPIDXiPlus = new TH1F("fHistMassWithCombPIDXiPlus","#Xi^{+} candidates, with Bach. comb. PID;M( #bar{#Lambda}^{0} , #pi^{+} ) (GeV/c^{2});Counts",200,1.2,2.0);
396 fListHistCascade->Add(fHistMassWithCombPIDXiPlus);
397}
398
399if (! fHistMassWithCombPIDOmegaMinus) {
400 fHistMassWithCombPIDOmegaMinus = new TH1F("fHistMassWithCombPIDOmegaMinus","#Omega^{-} candidates, with Bach. comb. PID;M( #Lambda , K^{-} ) (GeV/c^{2});Counts", 250,1.5,2.5);
401 fListHistCascade->Add(fHistMassWithCombPIDOmegaMinus);
402}
403
404if (! fHistMassWithCombPIDOmegaPlus) {
405 fHistMassWithCombPIDOmegaPlus = new TH1F("fHistMassWithCombPIDOmegaPlus","#Omega^{+} candidates, with Bach. comb. PID;M( #bar{#Lambda}^{0} , K^{+} ) (GeV/c^{2});Counts", 250,1.5,2.5);
406 fListHistCascade->Add(fHistMassWithCombPIDOmegaPlus);
407}
408
45ee0bcc 409
410
411 // - Complements for QA
412
413if(! fHistXiTransvMom ){
414 fHistXiTransvMom = new TH1F( "fHistXiTransvMom" , "Xi transverse momentum ; p_{t}(#Xi) (GeV/c); Counts", 100, 0.0, 10.0);
415 fListHistCascade->Add(fHistXiTransvMom);
416}
417
418if(! fHistXiTotMom ){
419 fHistXiTotMom = new TH1F( "fHistXiTotMom" , "Xi momentum norm; p_{tot}(#Xi) (GeV/c); Counts", 150, 0.0, 15.0);
420 fListHistCascade->Add(fHistXiTotMom);
421}
422
423
424if(! fHistBachTransvMom ){
425 fHistBachTransvMom = new TH1F( "fHistBachTransvMom" , "Bach. transverse momentum ; p_{t}(Bach.) (GeV/c); Counts", 100, 0.0, 5.0);
426 fListHistCascade->Add(fHistBachTransvMom);
427}
428
429if(! fHistBachTotMom ){
430 fHistBachTotMom = new TH1F( "fHistBachTotMom" , "Bach. momentum norm; p_{tot}(Bach.) (GeV/c); Counts", 100, 0.0, 5.0);
431 fListHistCascade->Add(fHistBachTotMom);
432}
433
434
435if(! fHistChargeXi ){
436 fHistChargeXi = new TH1F( "fHistChargeXi" , "Charge of casc. candidates ; Sign ; Counts", 5, -2.0, 3.0);
437 fListHistCascade->Add(fHistChargeXi);
438}
439
440
441if (! fHistV0toXiCosineOfPointingAngle) {
442 fHistV0toXiCosineOfPointingAngle = new TH1F("fHistV0toXiCosineOfPointingAngle", "Cos. of V0 Ptng Angl / Xi vtx ;Cos(V0 Point. Angl / Xi vtx); Counts", 100, 0.99, 1.0);
443 fListHistCascade->Add(fHistV0toXiCosineOfPointingAngle);
444}
445
446
447if(! fHistRapXi ){
448 fHistRapXi = new TH1F( "fHistRapXi" , "Rapidity of Xi candidates ; y ; Counts", 200, -5.0, 5.0);
449 fListHistCascade->Add(fHistRapXi);
450}
451
452if(! fHistRapOmega ){
453 fHistRapOmega = new TH1F( "fHistRapOmega" , "Rapidity of Omega candidates ; y ; Counts", 200, -5.0, 5.0);
454 fListHistCascade->Add(fHistRapOmega);
455}
456
457if(! fHistEta ){
458 fHistEta = new TH1F( "fHistEta" , "Pseudo-rap. of casc. candidates ; #eta ; Counts", 120, -3.0, 3.0);
459 fListHistCascade->Add(fHistEta);
460}
461
462if(! fHistTheta ){
463 fHistTheta = new TH1F( "fHistTheta" , "#theta of casc. candidates ; #theta (deg) ; Counts", 180, 0., 180.0);
464 fListHistCascade->Add(fHistTheta);
465}
466
467if(! fHistPhi ){
468 fHistPhi = new TH1F( "fHistPhi" , "#phi of casc. candidates ; #phi (deg) ; Counts", 360, 0., 360.);
469 fListHistCascade->Add(fHistPhi);
470}
471
472
473if(! f2dHistArmenteros) {
474 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);
475 fListHistCascade->Add(f2dHistArmenteros);
476}
477
e9c3f0b6 478//-------
479
45ee0bcc 480if(! f2dHistEffMassLambdaVsEffMassXiMinus) {
481 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, 200, 1.2, 2.0);
482 fListHistCascade->Add(f2dHistEffMassLambdaVsEffMassXiMinus);
483}
484
485if(! f2dHistEffMassXiVsEffMassOmegaMinus) {
486 f2dHistEffMassXiVsEffMassOmegaMinus = new TH2F( "f2dHistEffMassXiVsEffMassOmegaMinus", "M_{#Xi^{-} candidates} Vs M_{#Omega^{-} candidates} ; M( #Lambda , #pi^{-} ) (GeV/c^{2}) ; M( #Lambda , K^{-} ) (GeV/c^{2})", 200, 1.2, 2.0, 250, 1.5, 2.5);
487 fListHistCascade->Add(f2dHistEffMassXiVsEffMassOmegaMinus);
488}
489
490if(! f2dHistEffMassLambdaVsEffMassXiPlus) {
491 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, 200, 1.2, 2.0);
492 fListHistCascade->Add(f2dHistEffMassLambdaVsEffMassXiPlus);
493}
494
495if(! f2dHistEffMassXiVsEffMassOmegaPlus) {
496 f2dHistEffMassXiVsEffMassOmegaPlus = new TH2F( "f2dHistEffMassXiVsEffMassOmegaPlus", "M_{#Xi^{+} candidates} Vs M_{#Omega^{+} candidates} ; M( #Lambda , #pi^{+} ) (GeV/c^{2}) ; M( #Lambda , K^{+} ) (GeV/c^{2})", 200, 1.2, 2.0, 250, 1.5, 2.5);
497 fListHistCascade->Add(f2dHistEffMassXiVsEffMassOmegaPlus);
498}
499
e9c3f0b6 500//-------
501
45ee0bcc 502if(! f2dHistXiRadiusVsEffMassXiMinus) {
e9c3f0b6 503 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, 200, 1.2, 2.0);
45ee0bcc 504 fListHistCascade->Add(f2dHistXiRadiusVsEffMassXiMinus);
505}
506
507if(! f2dHistXiRadiusVsEffMassXiPlus) {
e9c3f0b6 508 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, 200, 1.2, 2.0);
45ee0bcc 509 fListHistCascade->Add(f2dHistXiRadiusVsEffMassXiPlus);
510}
511
e9c3f0b6 512if(! f2dHistXiRadiusVsEffMassOmegaMinus) {
513 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, 250, 1.5, 2.5);
514 fListHistCascade->Add(f2dHistXiRadiusVsEffMassOmegaMinus);
515}
516
517if(! f2dHistXiRadiusVsEffMassOmegaPlus) {
518 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, 250, 1.5, 2.5);
519 fListHistCascade->Add(f2dHistXiRadiusVsEffMassOmegaPlus);
520}
521
522
523//-------
45ee0bcc 524
ff0753e1 525if(! f3dHistXiPtVsEffMassVsYXiMinus) {
526 f3dHistXiPtVsEffMassVsYXiMinus = new TH3F( "f3dHistXiPtVsEffMassVsYXiMinus", "Pt_{cascade} Vs M_{#Xi^{-} candidates} Vs Y_{#Xi}; Pt_{cascade} (GeV/c); M( #Lambda , #pi^{-} ) (GeV/c^{2}) ;Y_{#Xi} ", 100, 0., 10.0, 200, 1.2, 2.0, 48, -1.2,1.2);
527 fListHistCascade->Add(f3dHistXiPtVsEffMassVsYXiMinus);
e9c3f0b6 528}
529
ff0753e1 530if(! f3dHistXiPtVsEffMassVsYXiPlus) {
531 f3dHistXiPtVsEffMassVsYXiPlus = new TH3F( "f3dHistXiPtVsEffMassVsYXiPlus", "Pt_{cascade} Vs M_{#Xi^{+} candidates} Vs Y_{#Xi}; Pt_{cascade} (GeV/c); M( #Lambda , #pi^{+} ) (GeV/c^{2}); Y_{#Xi}", 100, 0., 10.0, 200, 1.2, 2.0, 48, -1.2,1.2);
532 fListHistCascade->Add(f3dHistXiPtVsEffMassVsYXiPlus);
e9c3f0b6 533}
534
ff0753e1 535if(! f3dHistXiPtVsEffMassVsYOmegaMinus) {
536 f3dHistXiPtVsEffMassVsYOmegaMinus = new TH3F( "f3dHistXiPtVsEffMassVsYOmegaMinus", "Pt_{cascade} Vs M_{#Omega^{-} candidates} Vs Y_{#Omega}; Pt_{cascade} (GeV/c); M( #Lambda , K^{-} ) (GeV/c^{2}); Y_{#Omega}", 100, 0., 10.0, 250, 1.5, 2.5, 48, -1.2,1.2);
537 fListHistCascade->Add(f3dHistXiPtVsEffMassVsYOmegaMinus);
e9c3f0b6 538}
539
ff0753e1 540if(! f3dHistXiPtVsEffMassVsYOmegaPlus) {
541 f3dHistXiPtVsEffMassVsYOmegaPlus = new TH3F( "f3dHistXiPtVsEffMassVsYOmegaPlus", "Pt_{cascade} Vs M_{#Omega^{+} candidates} Vs Y_{#Omega}; Pt_{cascade} (GeV/c); M( #Lambda , K^{+} ) (GeV/c^{2}); Y_{#Omega}", 100, 0., 10.0, 250, 1.5, 2.5, 48, -1.2,1.2);
542 fListHistCascade->Add(f3dHistXiPtVsEffMassVsYOmegaPlus);
e9c3f0b6 543}
45ee0bcc 544
545
546}// end UserCreateOutputObjects
547
548
549
550
551
552
553//________________________________________________________________________
554void AliAnalysisTaskCheckCascade::UserExec(Option_t *)
555{
556 // Main loop
557 // Called for each event
558
559 AliESDEvent *lESDevent = 0x0;
560 AliAODEvent *lAODevent = 0x0;
561 Int_t ncascades = -1;
562
563
564 // Connect to the InputEvent
565 // After these lines, we should have an ESD/AOD event + the number of cascades in it.
566
567 if(fAnalysisType == "ESD"){
568 lESDevent = dynamic_cast<AliESDEvent*>( InputEvent() );
569 if (!lESDevent) {
570 Printf("ERROR: lESDevent not available \n");
571 return;
572 }
573 ncascades = lESDevent->GetNumberOfCascades();
574 }
575
576 if(fAnalysisType == "AOD"){
577 lAODevent = dynamic_cast<AliAODEvent*>( InputEvent() );
578 if (!lAODevent) {
579 Printf("ERROR: lAODevent not available \n");
580 return;
581 }
582 ncascades = lAODevent->GetNumberOfCascades();
ff0753e1 583 // printf("Number of cascade(s) = %d \n", ncascades);
45ee0bcc 584 }
585
586 // ---------------------------------------------------------------
587 // I - Initialisation of the local variables that will be needed
588
589
590 // - 0th part of initialisation : around primary vertex ...
591 Short_t lStatusTrackingPrimVtx = -2;
592 Double_t lTrkgPrimaryVtxPos[3] = {-100.0, -100.0, -100.0};
593 Double_t lTrkgPrimaryVtxRadius3D = -500.0;
594
595 Double_t lBestPrimaryVtxPos[3] = {-100.0, -100.0, -100.0};
596 Double_t lBestPrimaryVtxRadius3D = -500.0;
597
598 // - 1st part of initialisation : variables needed to store AliESDCascade data members
599 Double_t lEffMassXi = 0. ;
600 Double_t lChi2Xi = 0. ;
601 Double_t lDcaXiDaughters = 0. ;
602 Double_t lXiCosineOfPointingAngle = 0. ;
603 Double_t lPosXi[3] = { -1000.0, -1000.0, -1000.0 };
604 Double_t lXiRadius = 0. ;
605
606
607 // - 2nd part of initialisation : about V0 part in cascades
608
609 Double_t lInvMassLambdaAsCascDghter = 0.;
610 Double_t lV0Chi2Xi = 0. ;
611 Double_t lDcaV0DaughtersXi = 0.;
612
613 Double_t lDcaBachToPrimVertexXi = 0., lDcaV0ToPrimVertexXi = 0.;
614 Double_t lDcaPosToPrimVertexXi = 0.;
615 Double_t lDcaNegToPrimVertexXi = 0.;
616 Double_t lV0CosineOfPointingAngleXi = 0. ;
617 Double_t lPosV0Xi[3] = { -1000. , -1000., -1000. }; // Position of VO coming from cascade
618 Double_t lV0RadiusXi = -1000.0;
619 Double_t lV0quality = 0.;
620
621
622 // - 3rd part of initialisation : Effective masses
623
624 Double_t lInvMassXiMinus = 0.;
625 Double_t lInvMassXiPlus = 0.;
626 Double_t lInvMassOmegaMinus = 0.;
627 Double_t lInvMassOmegaPlus = 0.;
f87cd3db 628
629 // - 4th part of initialisation : PID treatment of the bachelor track
630 Bool_t lIsBachelorKaon = kFALSE;
631 Bool_t lIsBachelorPion = kFALSE;
45ee0bcc 632
633
f87cd3db 634 // - 5th part of initialisation : extra info for QA
45ee0bcc 635
636 Double_t lXiMomX = 0., lXiMomY = 0., lXiMomZ = 0.;
637 Double_t lXiTransvMom = 0. ;
638 Double_t lXiTotMom = 0. ;
639
640 Double_t lBachMomX = 0., lBachMomY = 0., lBachMomZ = 0.;
641 Double_t lBachTransvMom = 0.;
642 Double_t lBachTotMom = 0.;
643
644 Short_t lChargeXi = -2;
645 Double_t lV0toXiCosineOfPointingAngle = 0. ;
646
647 Double_t lRapXi = -20.0, lRapOmega = -20.0, lEta = -20.0, lTheta = 360., lPhi = 720. ;
648 Double_t lAlphaXi = -200., lPtArmXi = -200.0;
649
650
651
652 //-------------------------------------------------
653 // O - Cascade vertexer (ESD)
654
655 // if(fAnalysisType == "ESD" ){
656 // lESDevent->ResetCascades();
657 // AliCascadeVertexer CascVtxer;
658 // CascVtxer.V0sTracks2CascadeVertices(lESDevent);
659 // }
660
661
662 // ---------------------------------------------------------------
663 // I - General histos (filled for any event) - (ESD)
664
665 fHistTrackMultiplicity ->Fill( (InputEvent())->GetNumberOfTracks() );
666 fHistCascadeMultiplicity->Fill( ncascades );
667
668
45ee0bcc 669 for (Int_t iXi = 0; iXi < ncascades; iXi++)
670 {// This is the begining of the Cascade loop (ESD or AOD)
671
672
673 if(fAnalysisType == "ESD"){
674
675 // -------------------------------------
676 // II - Calcultaion Part dedicated to Xi vertices (ESD)
677
678 AliESDcascade *xi = lESDevent->GetCascade(iXi);
679 if (!xi) continue;
680
681 // Just to know which file is currently open : locate the file containing Xi
682 // cout << "Name of the file containing Xi candidate(s) :"
683 // << fInputHandler->GetTree()->GetCurrentFile()->GetName()
684 // << endl;
685
686
687 // - II.Step 1 : Characteristics of the event : prim. Vtx + magnetic field (ESD)
688 //-------------
689
690 // For new code (v4-16-Release-Rev06 or trunk)
691
692 const AliESDVertex *lPrimaryTrackingVtx = lESDevent->GetPrimaryVertexTracks();
693 // get the vtx stored in ESD found with tracks
694
695 lPrimaryTrackingVtx->GetXYZ( lTrkgPrimaryVtxPos );
696 lTrkgPrimaryVtxRadius3D = TMath::Sqrt( lTrkgPrimaryVtxPos[0] * lTrkgPrimaryVtxPos[0] +
697 lTrkgPrimaryVtxPos[1] * lTrkgPrimaryVtxPos[1] +
698 lTrkgPrimaryVtxPos[2] * lTrkgPrimaryVtxPos[2] );
699
700 lStatusTrackingPrimVtx = lPrimaryTrackingVtx->GetStatus();
701
702
703 const AliESDVertex *lPrimaryBestVtx = lESDevent->GetPrimaryVertex();
704 // get the best primary vertex available for the event
705 // As done in AliCascadeVertexer, we keep the one which is the best one available.
706 // between : Tracking vertex > SPD vertex > TPC vertex > default SPD vertex
707 // This one will be used for next calculations (DCA essentially)
708
709 lPrimaryBestVtx->GetXYZ( lBestPrimaryVtxPos );
710 lBestPrimaryVtxRadius3D = TMath::Sqrt( lBestPrimaryVtxPos[0] * lBestPrimaryVtxPos[0] +
711 lBestPrimaryVtxPos[1] * lBestPrimaryVtxPos[1] +
712 lBestPrimaryVtxPos[2] * lBestPrimaryVtxPos[2] );
713
714
715 // For older evts
716
717 // const AliESDVertex *lPrimaryTrackingVtx = lESDevent->GetPrimaryVertexTracks();
718 // get the vtx stored in ESD found with tracks
719 // Double_t lTrkgPrimaryVtxPos[3] = {-100.0, -100.0, -100.0};
720 // lPrimaryTrackingVtx->GetXYZ( lTrkgPrimaryVtxPos );
721 // Double_t lTrkgPrimaryVtxRadius3D = TMath::Sqrt( lTrkgPrimaryVtxPos[0]*lTrkgPrimaryVtxPos[0] +
722 // lTrkgPrimaryVtxPos[1] * lTrkgPrimaryVtxPos[1] +
723 // lTrkgPrimaryVtxPos[2] * lTrkgPrimaryVtxPos[2] );
724 //
725 // const AliESDVertex *lPrimarySPDVtx = lESDevent->GetPrimaryVertexSPD();
726 // get the vtx found by exclusive use of SPD
727 // Double_t lSPDPrimaryVtxPos[3] = {-100.0, -100.0, -100.0};
728 // lPrimarySPDVtx->GetXYZ( lSPDPrimaryVtxPos );
729 //
730 // // As done in AliCascadeVertexer, we keep, between both retrieved vertices,
731 // // the one which is the best one available.
732 // // This one will be used for next calculations (DCA essentially)
733 //
734 // Double_t lBestPrimaryVtxPos[3] = {-100.0, -100.0, -100.0};
735 // if( lPrimaryTrackingVtx->GetStatus() ) { // if tracking vtx = ok
736 // lBestPrimaryVtxPos[0] = lTrkgPrimaryVtxPos[0];
737 // lBestPrimaryVtxPos[1] = lTrkgPrimaryVtxPos[1];
738 // lBestPrimaryVtxPos[2] = lTrkgPrimaryVtxPos[2];
739 // }
740 // else{
741 // lBestPrimaryVtxPos[0] = lSPDPrimaryVtxPos[0];
742 // lBestPrimaryVtxPos[1] = lSPDPrimaryVtxPos[1];
743 // lBestPrimaryVtxPos[2] = lSPDPrimaryVtxPos[2];
744 // }
745 //
746 // Double_t lBestPrimaryVtxRadius3D = TMath::Sqrt( lBestPrimaryVtxPos[0]*lBestPrimaryVtxPos[0] +
747 // lBestPrimaryVtxPos[1] * lBestPrimaryVtxPos[1] +
748 // lBestPrimaryVtxPos[2] * lBestPrimaryVtxPos[2] );
749
750 // Back to normal
751
752 Double_t lMagneticField = lESDevent->GetMagneticField( );
753
754
755
756 // - II.Step 2 : Assigning the necessary variables for specific AliESDcascade data members (ESD)
757 //-------------
758 lV0quality = 0.;
759 xi->ChangeMassHypothesis(lV0quality , 3312); // default working hypothesis : cascade = Xi- decay
760
761 lEffMassXi = xi->GetEffMassXi();
762 lChi2Xi = xi->GetChi2Xi();
763 lDcaXiDaughters = xi->GetDcaXiDaughters();
764 lXiCosineOfPointingAngle = xi->GetCascadeCosineOfPointingAngle( lBestPrimaryVtxPos[0],
765 lBestPrimaryVtxPos[1],
766 lBestPrimaryVtxPos[2] );
767 // Take care : the best available vertex should be used (like in AliCascadeVertexer)
768
769 xi->GetXYZcascade( lPosXi[0], lPosXi[1], lPosXi[2] );
770 lXiRadius = TMath::Sqrt( lPosXi[0]*lPosXi[0] + lPosXi[1]*lPosXi[1] );
771
772
773
774 // - II.Step 3 : around the tracks : Bach + V0 (ESD)
775 // ~ Necessary variables for ESDcascade data members coming from the ESDv0 part (inheritance)
776 //-------------
777
778 UInt_t lIdxPosXi = (UInt_t) TMath::Abs( xi->GetPindex() );
779 UInt_t lIdxNegXi = (UInt_t) TMath::Abs( xi->GetNindex() );
780 UInt_t lBachIdx = (UInt_t) TMath::Abs( xi->GetBindex() );
781 // Care track label can be negative in MC production (linked with the track quality)
782 // However = normally, not the case for track index ...
783
784 AliESDtrack *pTrackXi = lESDevent->GetTrack( lIdxPosXi );
785 AliESDtrack *nTrackXi = lESDevent->GetTrack( lIdxNegXi );
786 AliESDtrack *bachTrackXi = lESDevent->GetTrack( lBachIdx );
787 if (!pTrackXi || !nTrackXi || !bachTrackXi ) {
788 Printf("ERROR: Could not retrieve one of the 3 daughter tracks of the cascade ...");
789 continue;
790 }
791
792 lInvMassLambdaAsCascDghter = xi->GetEffMass();
793 // This value shouldn't change, whatever the working hyp. is : Xi-, Xi+, Omega-, Omega+
794 lDcaV0DaughtersXi = xi->GetDcaV0Daughters();
795 lV0Chi2Xi = xi->GetChi2V0();
796
797 lV0CosineOfPointingAngleXi = xi->GetV0CosineOfPointingAngle( lBestPrimaryVtxPos[0],
798 lBestPrimaryVtxPos[1],
799 lBestPrimaryVtxPos[2] );
800
801 lDcaV0ToPrimVertexXi = xi->GetD( lBestPrimaryVtxPos[0],
802 lBestPrimaryVtxPos[1],
803 lBestPrimaryVtxPos[2] );
804
805 lDcaBachToPrimVertexXi = TMath::Abs( bachTrackXi->GetD( lBestPrimaryVtxPos[0],
806 lBestPrimaryVtxPos[1],
807 lMagneticField ) );
808 // Note : AliExternalTrackParam::GetD returns an algebraic value ...
809
810 xi->GetXYZ( lPosV0Xi[0], lPosV0Xi[1], lPosV0Xi[2] );
811 lV0RadiusXi = TMath::Sqrt( lPosV0Xi[0]*lPosV0Xi[0] + lPosV0Xi[1]*lPosV0Xi[1] );
812
813 lDcaPosToPrimVertexXi = TMath::Abs( pTrackXi ->GetD( lBestPrimaryVtxPos[0],
814 lBestPrimaryVtxPos[1],
815 lMagneticField ) );
816
817 lDcaNegToPrimVertexXi = TMath::Abs( nTrackXi ->GetD( lBestPrimaryVtxPos[0],
818 lBestPrimaryVtxPos[1],
819 lMagneticField ) );
820
821
822 // - II.Step 4 : around effective masses (ESD)
823 // ~ change mass hypotheses to cover all the possibilities : Xi-/+, Omega -/+
824 //-------------
825
2dd4214d 826
2dd4214d 827 if( bachTrackXi->Charge() < 0 ) {
828 lV0quality = 0.;
829 xi->ChangeMassHypothesis(lV0quality , 3312);
830 // Calculate the effective mass of the Xi- candidate.
831 // pdg code 3312 = Xi-
832 lInvMassXiMinus = xi->GetEffMassXi();
45ee0bcc 833
2dd4214d 834 lV0quality = 0.;
835 xi->ChangeMassHypothesis(lV0quality , 3334);
836 // Calculate the effective mass of the Xi- candidate.
837 // pdg code 3334 = Omega-
838 lInvMassOmegaMinus = xi->GetEffMassXi();
839
840 lV0quality = 0.;
841 xi->ChangeMassHypothesis(lV0quality , 3312); // Back to default hyp.
f87cd3db 842 }// end if negative bachelor
843
2dd4214d 844
845 if( bachTrackXi->Charge() > 0 ){
846 lV0quality = 0.;
847 xi->ChangeMassHypothesis(lV0quality , -3312);
848 // Calculate the effective mass of the Xi+ candidate.
849 // pdg code -3312 = Xi+
850 lInvMassXiPlus = xi->GetEffMassXi();
851
852 lV0quality = 0.;
853 xi->ChangeMassHypothesis(lV0quality , -3334);
854 // Calculate the effective mass of the Xi+ candidate.
855 // pdg code -3334 = Omega+
856 lInvMassOmegaPlus = xi->GetEffMassXi();
857
858 lV0quality = 0.;
859 xi->ChangeMassHypothesis(lV0quality , -3312); // Back to "default" hyp.
f87cd3db 860 }// end if positive bachelor
861
862
863
864 // - II.Step 5 : PID on the bachelor
865 //-------------
866
867 // Reasonable guess for the priors for the cascade track sample
868 Double_t lPriorsGuessXi[5] = {0.0, 0.0, 2, 0, 1};
869 Double_t lPriorsGuessOmega[5] = {0.0, 0.0, 1, 1, 1};
870 AliPID pidXi; pidXi.SetPriors( lPriorsGuessXi );
871 AliPID pidOmega; pidOmega.SetPriors( lPriorsGuessOmega );
872
873 if( bachTrackXi->IsOn(AliESDtrack::kESDpid) ){ // Combined PID exists
874 Double_t r[10]; bachTrackXi->GetESDpid(r);
875 pidXi.SetProbabilities(r);
876 pidOmega.SetProbabilities(r);
877 // Check if the bachelor track is a pion
878 Double_t ppion = pidXi.GetProbability(AliPID::kPion);
879 if (ppion > pidXi.GetProbability(AliPID::kElectron) &&
880 ppion > pidXi.GetProbability(AliPID::kMuon) &&
881 ppion > pidXi.GetProbability(AliPID::kKaon) &&
882 ppion > pidXi.GetProbability(AliPID::kProton) ) lIsBachelorPion = kTRUE;
883 // Check if the bachelor track is a kaon
884 Double_t pkaon = pidOmega.GetProbability(AliPID::kKaon);
885 if (pkaon > pidOmega.GetProbability(AliPID::kElectron) &&
886 pkaon > pidOmega.GetProbability(AliPID::kMuon) &&
887 pkaon > pidOmega.GetProbability(AliPID::kPion) &&
888 pkaon > pidOmega.GetProbability(AliPID::kProton) ) lIsBachelorKaon = kTRUE;
2dd4214d 889
f87cd3db 890 }// end if bachelor track with existing combined PID
2dd4214d 891
f87cd3db 892
893
894 // - II.Step 6 : extra info for QA (ESD)
45ee0bcc 895 // miscellaneous pieces onf info that may help regarding data quality assessment.
896 //-------------
897
898 xi->GetPxPyPz( lXiMomX, lXiMomY, lXiMomZ );
899 lXiTransvMom = TMath::Sqrt( lXiMomX*lXiMomX + lXiMomY*lXiMomY );
900 lXiTotMom = TMath::Sqrt( lXiMomX*lXiMomX + lXiMomY*lXiMomY + lXiMomZ*lXiMomZ );
901
902 xi->GetBPxPyPz( lBachMomX, lBachMomY, lBachMomZ );
903 lBachTransvMom = TMath::Sqrt( lBachMomX*lBachMomX + lBachMomY*lBachMomY );
904 lBachTotMom = TMath::Sqrt( lBachMomX*lBachMomX + lBachMomY*lBachMomY + lBachMomZ*lBachMomZ );
905
906 lChargeXi = xi->Charge();
907
908 lV0toXiCosineOfPointingAngle = xi->GetV0CosineOfPointingAngle( lPosXi[0], lPosXi[1], lPosXi[2] );
909
910 lRapXi = xi->RapXi();
911 lRapOmega = xi->RapOmega();
912 lEta = xi->Eta();
913 lTheta = xi->Theta() *180.0/TMath::Pi();
914 lPhi = xi->Phi() *180.0/TMath::Pi();
915 lAlphaXi = xi->AlphaXi();
916 lPtArmXi = xi->PtArmXi();
917
918
919 }// end of ESD treatment
920
921
922 if(fAnalysisType == "AOD"){
923
924 // -------------------------------------
925 // II - Calcultaion Part dedicated to Xi vertices (ESD)
926
927 const AliAODcascade *xi = lAODevent->GetCascade(iXi);
928 if (!xi) continue;
929
930 // Just to know which file is currently open : locate the file containing Xi
931 // cout << "Name of the file containing Xi candidate(s) :" << fesdH->GetTree()->GetCurrentFile()->GetName() << endl;
932
933
934 // - II.Step 1 : Characteristics of the event : prim. Vtx + magnetic field (AOD)
935 //-------------
936
937 lTrkgPrimaryVtxPos[0] = -100.0;
938 lTrkgPrimaryVtxPos[1] = -100.0;
939 lTrkgPrimaryVtxPos[2] = -100.0;
940 lTrkgPrimaryVtxRadius3D = -500. ;
941 // We don't have the different prim. vertex at the AOD level -> nothing to do.
942
943 const AliAODVertex *lPrimaryBestVtx = lAODevent->GetPrimaryVertex();
944 // get the best primary vertex available for the event
945 // We may keep the one which is the best one available = GetVertex(0)
946 // Pb with pile-up to expect
947 // This one will be used for next calculations (DCA essentially)
948
949 lPrimaryBestVtx->GetXYZ( lBestPrimaryVtxPos );
950 lBestPrimaryVtxRadius3D = TMath::Sqrt( lBestPrimaryVtxPos[0] * lBestPrimaryVtxPos[0] +
951 lBestPrimaryVtxPos[1] * lBestPrimaryVtxPos[1] +
952 lBestPrimaryVtxPos[2] * lBestPrimaryVtxPos[2] );
953
954
955 // - II.Step 2 : Assigning the necessary variables for specific AliAODcascade data members (AOD)
956 //-------------
957
958 lEffMassXi = xi->MassXi(); // default working hypothesis : cascade = Xi- decay
959 lChi2Xi = xi->Chi2Xi();
960 lDcaXiDaughters = xi->DcaXiDaughters();
961 lXiCosineOfPointingAngle = xi->CosPointingAngleXi( lBestPrimaryVtxPos[0],
962 lBestPrimaryVtxPos[1],
963 lBestPrimaryVtxPos[2] );
964 // Take care :
965 // the best available vertex should be used (like in AliCascadeVertexer)
966
967 lPosXi[0] = xi->DecayVertexXiX();
968 lPosXi[1] = xi->DecayVertexXiY();
969 lPosXi[2] = xi->DecayVertexXiZ();
970 lXiRadius = TMath::Sqrt( lPosXi[0]*lPosXi[0] + lPosXi[1]*lPosXi[1] );
971
972
973 // - II.Step 3 : around the tracks : Bach + V0 (AOD)
974 // ~ Necessary variables for AODcascade data members coming from the AODv0 part (inheritance)
975 //-------------
976
977 lChargeXi = xi->ChargeXi();
978
979 if( lChargeXi < 0)
980 lInvMassLambdaAsCascDghter = xi->MassLambda();
981 else
982 lInvMassLambdaAsCascDghter = xi->MassAntiLambda();
983
984 lDcaV0DaughtersXi = xi->DcaV0Daughters();
985 lV0Chi2Xi = xi->Chi2V0();
986
987 lV0CosineOfPointingAngleXi = xi->CosPointingAngle( lBestPrimaryVtxPos );
988 lDcaV0ToPrimVertexXi = xi->DcaV0ToPrimVertex();
989
990 lDcaBachToPrimVertexXi = xi->DcaBachToPrimVertex();
991
992
993 lPosV0Xi[0] = xi->DecayVertexV0X();
994 lPosV0Xi[1] = xi->DecayVertexV0Y();
995 lPosV0Xi[2] = xi->DecayVertexV0Z();
996 lV0RadiusXi = TMath::Sqrt( lPosV0Xi[0]*lPosV0Xi[0] + lPosV0Xi[1]*lPosV0Xi[1] );
997
998 lDcaPosToPrimVertexXi = xi->DcaPosToPrimVertex();
999 lDcaNegToPrimVertexXi = xi->DcaNegToPrimVertex();
1000
1001
1002 // - II.Step 4 : around effective masses (AOD)
1003 // ~ change mass hypotheses to cover all the possibilities : Xi-/+, Omega -/+
1004 //-------------
1005
1006 if( lChargeXi < 0 ) lInvMassXiMinus = xi->MassXi();
1007 if( lChargeXi > 0 ) lInvMassXiPlus = xi->MassXi();
1008 if( lChargeXi < 0 ) lInvMassOmegaMinus = xi->MassOmega();
1009 if( lChargeXi > 0 ) lInvMassOmegaPlus = xi->MassOmega();
1010
1011
f87cd3db 1012 // - II.Step 5 : PID on the bachelor
1013 //-------------
1014
ff0753e1 1015 /*
1016 // Reasonable guess for the priors for the cascade track sample
1017 Double_t lPriorsGuessXi[5] = {0.0, 0.0, 2, 0, 1};
1018 Double_t lPriorsGuessOmega[5] = {0.0, 0.0, 1, 1, 1};
1019 AliPID pidXi; pidXi.SetPriors( lPriorsGuessXi );
1020 AliPID pidOmega; pidOmega.SetPriors( lPriorsGuessOmega );
1021
1022 const AliAODTrack *bachTrackXi = lAODevent->GetTrack( xi->GetBachID() );
1023
1024 if( bachTrackXi->IsOn(AliESDtrack::kESDpid) ){ // Combined PID exists, the AOD flags = a copy of the ESD ones
1025 Double_t r[10]; bachTrackXi->GetPID(r);
1026 pidXi.SetProbabilities(r);
1027 pidOmega.SetProbabilities(r);
1028 // Check if the bachelor track is a pion
1029 Double_t ppion = pidXi.GetProbability(AliPID::kPion);
1030 if (ppion > pidXi.GetProbability(AliPID::kElectron) &&
1031 ppion > pidXi.GetProbability(AliPID::kMuon) &&
1032 ppion > pidXi.GetProbability(AliPID::kKaon) &&
1033 ppion > pidXi.GetProbability(AliPID::kProton) ) lIsBachelorPion = kTRUE;
1034 // Check if the bachelor track is a kaon
1035 Double_t pkaon = pidOmega.GetProbability(AliPID::kKaon);
1036 if (pkaon > pidOmega.GetProbability(AliPID::kElectron) &&
1037 pkaon > pidOmega.GetProbability(AliPID::kMuon) &&
1038 pkaon > pidOmega.GetProbability(AliPID::kPion) &&
1039 pkaon > pidOmega.GetProbability(AliPID::kProton) ) lIsBachelorKaon = kTRUE;
1040
1041 }// end if bachelor track with existing combined PID
1042 */
f87cd3db 1043
f87cd3db 1044
1045 // - II.Step 6 : extra info for QA (AOD)
45ee0bcc 1046 // miscellaneous pieces onf info that may help regarding data quality assessment.
1047 //-------------
1048
1049 lXiMomX = xi->MomXiX();
1050 lXiMomY = xi->MomXiY();
1051 lXiMomZ = xi->MomXiZ();
1052 lXiTransvMom = TMath::Sqrt( lXiMomX*lXiMomX + lXiMomY*lXiMomY );
1053 lXiTotMom = TMath::Sqrt( lXiMomX*lXiMomX + lXiMomY*lXiMomY + lXiMomZ*lXiMomZ );
1054
1055 lBachMomX = xi->MomBachX();
1056 lBachMomY = xi->MomBachY();
1057 lBachMomZ = xi->MomBachZ();
1058 lBachTransvMom = TMath::Sqrt( lBachMomX*lBachMomX + lBachMomY*lBachMomY );
1059 lBachTotMom = TMath::Sqrt( lBachMomX*lBachMomX + lBachMomY*lBachMomY + lBachMomZ*lBachMomZ );
1060
1061
1062 lV0toXiCosineOfPointingAngle = xi->CosPointingAngle( xi->GetDecayVertexXi() );
1063
1064 lRapXi = xi->RapXi();
1065 lRapOmega = xi->RapOmega();
1066 lEta = xi->Eta(); // Will not work ! need a method Pz(), Py() Px()
1067 lTheta = xi->Theta() *180.0/TMath::Pi(); // in AODcascade.
1068 lPhi = xi->Phi() *180.0/TMath::Pi(); // Here, we will get eta, theta, phi for the V0 ...
1069 lAlphaXi = xi->AlphaXi();
1070 lPtArmXi = xi->PtArmXi();
1071
1072
1073 }// end of AOD treatment
1074
1075
1076 // -------------------------------------
ff0753e1 1077 // III - Filling the TH1,2,3Fs
45ee0bcc 1078
1079
1080 // - III.Step 1
1081
1082 fHistVtxStatus ->Fill( lStatusTrackingPrimVtx ); // 1 if tracking vtx = ok
1083
1084 if( lStatusTrackingPrimVtx ){
1085 fHistPosTrkgPrimaryVtxX ->Fill( lTrkgPrimaryVtxPos[0] );
1086 fHistPosTrkgPrimaryVtxY ->Fill( lTrkgPrimaryVtxPos[1] );
1087 fHistPosTrkgPrimaryVtxZ ->Fill( lTrkgPrimaryVtxPos[2] );
1088 fHistTrkgPrimaryVtxRadius->Fill( lTrkgPrimaryVtxRadius3D );
1089 }
1090
1091 fHistPosBestPrimaryVtxX ->Fill( lBestPrimaryVtxPos[0] );
1092 fHistPosBestPrimaryVtxY ->Fill( lBestPrimaryVtxPos[1] );
1093 fHistPosBestPrimaryVtxZ ->Fill( lBestPrimaryVtxPos[2] );
1094 fHistBestPrimaryVtxRadius ->Fill( lBestPrimaryVtxRadius3D );
1095
1096 f2dHistTrkgPrimVtxVsBestPrimVtx->Fill( lTrkgPrimaryVtxRadius3D, lBestPrimaryVtxRadius3D );
1097
1098
1099 // - III.Step 2
1100 fHistEffMassXi ->Fill( lEffMassXi );
1101 fHistChi2Xi ->Fill( lChi2Xi ); // Flag CascadeVtxer: Cut Variable a
1102 fHistDcaXiDaughters ->Fill( lDcaXiDaughters ); // Flag CascadeVtxer: Cut Variable e
1103 fHistDcaBachToPrimVertex ->Fill( lDcaBachToPrimVertexXi ); // Flag CascadeVtxer: Cut Variable d
1104 fHistXiCosineOfPointingAngle ->Fill( lXiCosineOfPointingAngle ); // Flag CascadeVtxer: Cut Variable f
1105 fHistXiRadius ->Fill( lXiRadius ); // Flag CascadeVtxer: Cut Variable g+h
1106
1107
1108 // - III.Step 3
1109 fHistMassLambdaAsCascDghter ->Fill( lInvMassLambdaAsCascDghter ); // Flag CascadeVtxer: Cut Variable c
1110 fHistV0Chi2Xi ->Fill( lV0Chi2Xi );
1111 fHistDcaV0DaughtersXi ->Fill( lDcaV0DaughtersXi );
1112 fHistV0CosineOfPointingAngleXi ->Fill( lV0CosineOfPointingAngleXi );
1113 fHistV0RadiusXi ->Fill( lV0RadiusXi );
1114
1115 fHistDcaV0ToPrimVertexXi ->Fill( lDcaV0ToPrimVertexXi ); // Flag CascadeVtxer: Cut Variable b
1116 fHistDcaPosToPrimVertexXi ->Fill( lDcaPosToPrimVertexXi );
1117 fHistDcaNegToPrimVertexXi ->Fill( lDcaNegToPrimVertexXi );
1118
1119
f87cd3db 1120 // - III.Step 4+5
1121 if( lChargeXi < 0 ){
1122 fHistMassXiMinus ->Fill( lInvMassXiMinus );
1123 fHistMassOmegaMinus ->Fill( lInvMassOmegaMinus );
1124 if(lIsBachelorPion) fHistMassWithCombPIDXiMinus ->Fill( lInvMassXiMinus );
1125 if(lIsBachelorKaon) fHistMassWithCombPIDOmegaMinus ->Fill( lInvMassOmegaMinus );
1126 }
1127
1128 if( lChargeXi > 0 ){
1129 fHistMassXiPlus ->Fill( lInvMassXiPlus );
1130 fHistMassOmegaPlus ->Fill( lInvMassOmegaPlus );
1131 if(lIsBachelorPion) fHistMassWithCombPIDXiPlus ->Fill( lInvMassXiPlus );
1132 if(lIsBachelorKaon) fHistMassWithCombPIDOmegaPlus ->Fill( lInvMassOmegaPlus );
1133 }
1134
45ee0bcc 1135
1136// if( bachTrackXi->Charge() < 0 ) fHistMassXiMinus ->Fill( lInvMassXiMinus );
1137// if( bachTrackXi->Charge() > 0 ) fHistMassXiPlus ->Fill( lInvMassXiPlus );
1138// if( bachTrackXi->Charge() < 0 ) fHistMassOmegaMinus ->Fill( lInvMassOmegaMinus );
1139// if( bachTrackXi->Charge() > 0 ) fHistMassOmegaPlus ->Fill( lInvMassOmegaPlus );
1140
1141
1142 // - III.Step 5
1143 fHistXiTransvMom ->Fill( lXiTransvMom );
1144 fHistXiTotMom ->Fill( lXiTotMom );
1145
1146 fHistBachTransvMom ->Fill( lBachTransvMom );
1147 fHistBachTotMom ->Fill( lBachTotMom );
1148
1149 fHistChargeXi ->Fill( lChargeXi );
1150 fHistV0toXiCosineOfPointingAngle->Fill( lV0toXiCosineOfPointingAngle );
1151
1152 fHistRapXi ->Fill( lRapXi );
1153 fHistRapOmega ->Fill( lRapOmega );
1154 fHistEta ->Fill( lEta );
1155 fHistTheta ->Fill( lTheta );
1156 fHistPhi ->Fill( lPhi );
1157
1158 f2dHistArmenteros ->Fill( lAlphaXi, lPtArmXi );
1159
1160 if( lChargeXi < 0 ) {
1161 f2dHistEffMassLambdaVsEffMassXiMinus->Fill( lInvMassLambdaAsCascDghter, lInvMassXiMinus );
1162 f2dHistEffMassXiVsEffMassOmegaMinus ->Fill( lInvMassXiMinus, lInvMassOmegaMinus );
1163 f2dHistXiRadiusVsEffMassXiMinus ->Fill( lXiRadius, lInvMassXiMinus );
e9c3f0b6 1164 f2dHistXiRadiusVsEffMassOmegaMinus ->Fill( lXiRadius, lInvMassOmegaMinus );
ff0753e1 1165 f3dHistXiPtVsEffMassVsYXiMinus ->Fill( lXiTransvMom, lInvMassXiMinus, lRapXi );
1166 f3dHistXiPtVsEffMassVsYOmegaMinus ->Fill( lXiTransvMom, lInvMassOmegaMinus, lRapOmega );
45ee0bcc 1167 }
1168 else{
1169 f2dHistEffMassLambdaVsEffMassXiPlus ->Fill( lInvMassLambdaAsCascDghter, lInvMassXiPlus );
1170 f2dHistEffMassXiVsEffMassOmegaPlus ->Fill( lInvMassXiPlus, lInvMassOmegaPlus );
e9c3f0b6 1171 f2dHistXiRadiusVsEffMassXiPlus ->Fill( lXiRadius, lInvMassXiPlus);
1172 f2dHistXiRadiusVsEffMassOmegaPlus ->Fill( lXiRadius, lInvMassOmegaPlus );
ff0753e1 1173 f3dHistXiPtVsEffMassVsYXiPlus ->Fill( lXiTransvMom, lInvMassXiPlus, lRapXi );
1174 f3dHistXiPtVsEffMassVsYOmegaPlus ->Fill( lXiTransvMom, lInvMassOmegaPlus, lRapOmega );
45ee0bcc 1175 }
1176
1177
1178 }// end of the Cascade loop (ESD or AOD)
1179
1180
1181 // Post output data.
1182 PostData(1, fListHistCascade);
1183}
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194//________________________________________________________________________
1195void AliAnalysisTaskCheckCascade::Terminate(Option_t *)
1196{
1197 // Draw result to the screen
1198 // Called once at the end of the query
1199
cd9188c9 1200 TList *cRetrievedList = 0x0;
1201 cRetrievedList = (TList*)GetOutputData(1);
1202 if(!cRetrievedList){
1203 Printf("ERROR - AliAnalysisTaskCheckCascade: ouput data container list not available\n");
1204 return;
1205 }
1206
1207 fHistTrackMultiplicity = dynamic_cast<TH1F*> ( cRetrievedList->FindObject("fHistTrackMultiplicity") );
1208 if (!fHistTrackMultiplicity) {
1209 Printf("ERROR - AliAnalysisTaskCheckCascade: fHistTrackMultiplicity not available\n");
1210 return;
1211 }
45ee0bcc 1212
cd9188c9 1213 fHistCascadeMultiplicity = dynamic_cast<TH1F*> ( cRetrievedList->FindObject("fHistCascadeMultiplicity"));
1214 if (!fHistCascadeMultiplicity) {
1215 Printf("ERROR - AliAnalysisTaskCheckCascade: fHistCascadeMultiplicity not available\n");
1216 return;
1217 }
45ee0bcc 1218
cd9188c9 1219 TCanvas *canCheckCascade = new TCanvas("AliAnalysisTaskCheckCascade","Multiplicity",10,10,510,510);
1220 canCheckCascade->cd(1)->SetLogy();
45ee0bcc 1221
1222 fHistTrackMultiplicity->SetMarkerStyle(22);
1223 fHistTrackMultiplicity->DrawCopy("E");
1224
1225 fHistCascadeMultiplicity->SetMarkerStyle(26);
1226 fHistCascadeMultiplicity->DrawCopy("ESAME");
1227
1228}