2 /**************************************************************************
3 * Authors : Antonin Maire, Boris Hippolyte *
4 * Contributors are mentioned in the code where appropriate. *
6 * Permission to use, copy, modify and distribute this software and its *
7 * documentation strictly for non-commercial purposes is hereby granted *
8 * without fee, provided that the above copyright notice appears in all *
9 * copies and that both the copyright notice and this permission notice *
10 * appear in the supporting documentation. The authors make no claims *
11 * about the suitability of this software for any purpose. It is *
12 * provided "as is" without express or implied warranty. *
13 **************************************************************************/
15 //-----------------------------------------------------------------
16 // AliAnalysisTaskCheckCascade class
17 // This task is for QAing the Cascades from ESD and AOD
18 // Origin : Antonin Maire Fev2008, antonin.maire@ires.in2p3.fr
19 // Modified : A.M Juillet 2008
20 //-----------------------------------------------------------------
29 //class AliMCEventHandler;
48 #include "AliESDEvent.h"
49 #include "AliAODEvent.h"
50 //#include "AliCascadeVertexer.h"
52 #include "AliESDcascade.h"
53 #include "AliAODcascade.h"
55 #include "AliAnalysisTaskCheckCascade.h"
57 ClassImp(AliAnalysisTaskCheckCascade)
61 //________________________________________________________________________
62 AliAnalysisTaskCheckCascade::AliAnalysisTaskCheckCascade()
63 : AliAnalysisTaskSE(), fAnalysisType("ESD"), fCollidingSystems(0),
65 // - Cascade part initialisation
67 fHistTrackMultiplicity(0), fHistCascadeMultiplicity(0),
70 fHistPosTrkgPrimaryVtxX(0), fHistPosTrkgPrimaryVtxY(0), fHistPosTrkgPrimaryVtxZ(0), fHistTrkgPrimaryVtxRadius(0),
71 fHistPosBestPrimaryVtxX(0), fHistPosBestPrimaryVtxY(0), fHistPosBestPrimaryVtxZ(0), fHistBestPrimaryVtxRadius(0),
72 f2dHistTrkgPrimVtxVsBestPrimVtx(0),
74 fHistEffMassXi(0), fHistChi2Xi(0),
75 fHistDcaXiDaughters(0), fHistDcaBachToPrimVertex(0), fHistXiCosineOfPointingAngle(0), fHistXiRadius(0),
77 fHistMassLambdaAsCascDghter(0),
79 fHistDcaV0DaughtersXi(0),
80 fHistDcaV0ToPrimVertexXi(0),
81 fHistV0CosineOfPointingAngleXi(0),
83 fHistDcaPosToPrimVertexXi(0), fHistDcaNegToPrimVertexXi(0),
85 fHistMassXiMinus(0), fHistMassXiPlus(0),
86 fHistMassOmegaMinus(0), fHistMassOmegaPlus(0),
88 fHistXiTransvMom(0), fHistXiTotMom(0),
89 fHistBachTransvMom(0), fHistBachTotMom(0),
92 fHistV0toXiCosineOfPointingAngle(0),
94 fHistRapXi(0), fHistRapOmega(0), fHistEta(0),
95 fHistTheta(0), fHistPhi(0),
98 f2dHistEffMassLambdaVsEffMassXiMinus(0), f2dHistEffMassXiVsEffMassOmegaMinus(0),
99 f2dHistEffMassLambdaVsEffMassXiPlus(0), f2dHistEffMassXiVsEffMassOmegaPlus(0),
100 f2dHistXiRadiusVsEffMassXiMinus(0), f2dHistXiRadiusVsEffMassXiPlus(0)
113 //________________________________________________________________________
114 AliAnalysisTaskCheckCascade::AliAnalysisTaskCheckCascade(const char *name)
115 : AliAnalysisTaskSE(name), fAnalysisType("ESD"), fCollidingSystems(0),
117 // - Cascade part initialisation
119 fHistTrackMultiplicity(0), fHistCascadeMultiplicity(0),
122 fHistPosTrkgPrimaryVtxX(0), fHistPosTrkgPrimaryVtxY(0), fHistPosTrkgPrimaryVtxZ(0), fHistTrkgPrimaryVtxRadius(0),
123 fHistPosBestPrimaryVtxX(0), fHistPosBestPrimaryVtxY(0), fHistPosBestPrimaryVtxZ(0), fHistBestPrimaryVtxRadius(0),
124 f2dHistTrkgPrimVtxVsBestPrimVtx(0),
126 fHistEffMassXi(0), fHistChi2Xi(0),
127 fHistDcaXiDaughters(0), fHistDcaBachToPrimVertex(0), fHistXiCosineOfPointingAngle(0), fHistXiRadius(0),
129 fHistMassLambdaAsCascDghter(0),
131 fHistDcaV0DaughtersXi(0),
132 fHistDcaV0ToPrimVertexXi(0),
133 fHistV0CosineOfPointingAngleXi(0),
135 fHistDcaPosToPrimVertexXi(0), fHistDcaNegToPrimVertexXi(0),
137 fHistMassXiMinus(0), fHistMassXiPlus(0),
138 fHistMassOmegaMinus(0), fHistMassOmegaPlus(0),
140 fHistXiTransvMom(0), fHistXiTotMom(0),
141 fHistBachTransvMom(0), fHistBachTotMom(0),
144 fHistV0toXiCosineOfPointingAngle(0),
146 fHistRapXi(0), fHistRapOmega(0), fHistEta(0),
147 fHistTheta(0), fHistPhi(0),
149 f2dHistArmenteros(0),
150 f2dHistEffMassLambdaVsEffMassXiMinus(0), f2dHistEffMassXiVsEffMassOmegaMinus(0),
151 f2dHistEffMassLambdaVsEffMassXiPlus(0), f2dHistEffMassXiVsEffMassOmegaPlus(0),
152 f2dHistXiRadiusVsEffMassXiMinus(0), f2dHistXiRadiusVsEffMassXiPlus(0)
159 // Define input and output slots here
160 // Input slot #0 works with a TChain
162 // Output slot #0 writes into a TList container (Cascade)
163 DefineOutput(1, TList::Class());
171 //________________________________________________________________________
172 void AliAnalysisTaskCheckCascade::UserCreateOutputObjects()
179 fListHistCascade = new TList();
184 if(! fHistTrackMultiplicity) {
185 if(fCollidingSystems)// AA collisions
186 fHistTrackMultiplicity = new TH1F("fHistTrackMultiplicity",
187 "Multiplicity distribution;Number of tracks;Events",
189 else // pp collisions
190 fHistTrackMultiplicity = new TH1F("fHistTrackMultiplicity",
191 "Track Multiplicity;Nbr of tracks/Evt;Events",
193 fListHistCascade->Add(fHistTrackMultiplicity);
196 if(! fHistCascadeMultiplicity) {
197 if(fCollidingSystems)// AA collisions
198 fHistCascadeMultiplicity = new TH1F("fHistCascadeMultiplicity",
199 "Multiplicity distribution;Number of Cascades;Events",
201 else // pp collisions
202 fHistCascadeMultiplicity = new TH1F("fHistCascadeMultiplicity",
203 "Cascades per event;Nbr of Cascades/Evt;Events",
205 fListHistCascade->Add(fHistCascadeMultiplicity);
210 if(! fHistVtxStatus ){
211 fHistVtxStatus = new TH1F( "fHistVtxStatus" , "Does a Trckg Prim.vtx exist ?; true=1 or false=0; Nb of Events" , 4, -1.0, 3.0 );
212 fListHistCascade->Add(fHistVtxStatus);
220 // - Vertex Positions
222 if(! fHistPosTrkgPrimaryVtxX ){
223 fHistPosTrkgPrimaryVtxX = new TH1F( "fHistPosTrkgPrimaryVtxX" , "Trkg Prim. Vertex Position in x; x (cm); Events" , 200, -0.5, 0.5 );
224 fListHistCascade->Add(fHistPosTrkgPrimaryVtxX);
228 if(! fHistPosTrkgPrimaryVtxY){
229 fHistPosTrkgPrimaryVtxY = new TH1F( "fHistPosTrkgPrimaryVtxY" , "Trkg Prim. Vertex Position in y; y (cm); Events" , 200, -0.5, 0.5 );
230 fListHistCascade->Add(fHistPosTrkgPrimaryVtxY);
233 if(! fHistPosTrkgPrimaryVtxZ ){
234 fHistPosTrkgPrimaryVtxZ = new TH1F( "fHistPosTrkgPrimaryVtxZ" , "Trkg Prim. Vertex Position in z; z (cm); Events" , 100, -15.0, 15.0 );
235 fListHistCascade->Add(fHistPosTrkgPrimaryVtxZ);
238 if(! fHistTrkgPrimaryVtxRadius ){
239 fHistTrkgPrimaryVtxRadius = new TH1F( "fHistTrkgPrimaryVtxRadius", "Trkg Prim. Vertex radius; r (cm); Events" , 150, 0., 15.0 );
240 fListHistCascade->Add(fHistTrkgPrimaryVtxRadius);
246 if(! fHistPosBestPrimaryVtxX ){
247 fHistPosBestPrimaryVtxX = new TH1F( "fHistPosBestPrimaryVtxX" , "Best Prim. Vertex Position in x; x (cm); Events" , 200, -0.5, 0.5 );
248 fListHistCascade->Add(fHistPosBestPrimaryVtxX);
251 if(! fHistPosBestPrimaryVtxY){
252 fHistPosBestPrimaryVtxY = new TH1F( "fHistPosBestPrimaryVtxY" , "Best Prim. Vertex Position in y; y (cm); Events" , 200, -0.5, 0.5 );
253 fListHistCascade->Add(fHistPosBestPrimaryVtxY);
256 if(! fHistPosBestPrimaryVtxZ ){
257 fHistPosBestPrimaryVtxZ = new TH1F( "fHistPosBestPrimaryVtxZ" , "Best Prim. Vertex Position in z; z (cm); Events" , 100, -15.0, 15.0 );
258 fListHistCascade->Add(fHistPosBestPrimaryVtxZ);
261 if(! fHistBestPrimaryVtxRadius ){
262 fHistBestPrimaryVtxRadius = new TH1F( "fHistBestPrimaryVtxRadius", "Best Prim. vertex radius; r (cm); Events" , 150, 0., 15.0 );
263 fListHistCascade->Add(fHistBestPrimaryVtxRadius);
266 if(! f2dHistTrkgPrimVtxVsBestPrimVtx) {
267 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.);
268 fListHistCascade->Add(f2dHistTrkgPrimVtxVsBestPrimVtx);
274 // - Typical histos for cascades
277 if(! fHistEffMassXi) {
278 fHistEffMassXi = new TH1F("fHistEffMassXi", "Cascade candidates ; Invariant Mass (GeV/c^{2}) ; Counts", 200, 1.2, 2.0);
279 fListHistCascade->Add(fHistEffMassXi);
283 fHistChi2Xi = new TH1F("fHistChi2Xi", "Cascade #chi^{2}; #chi^{2}; Number of Cascades", 160, 0, 40);
284 fListHistCascade->Add(fHistChi2Xi);
287 if(! fHistDcaXiDaughters ){
288 fHistDcaXiDaughters = new TH1F( "fHistDcaXiDaughters", "DCA between Xi Daughters; DCA (cm) ; Number of Cascades", 100, 0., 0.5);
289 fListHistCascade->Add(fHistDcaXiDaughters);
292 if(! fHistDcaBachToPrimVertex) {
293 fHistDcaBachToPrimVertex = new TH1F("fHistDcaBachToPrimVertex", "DCA of Bach. to Prim. Vertex;DCA (cm);Number of Cascades", 250, 0., 0.25);
294 fListHistCascade->Add(fHistDcaBachToPrimVertex);
297 if(! fHistXiCosineOfPointingAngle) {
298 fHistXiCosineOfPointingAngle = new TH1F("fHistXiCosineOfPointingAngle", "Cosine of Xi Pointing Angle; Cos (Xi Point.Angl);Number of Xis", 200, 0.98, 1.0);
299 fListHistCascade->Add(fHistXiCosineOfPointingAngle);
302 if(! fHistXiRadius ){
303 fHistXiRadius = new TH1F( "fHistXiRadius", "Casc. decay transv. radius; r (cm); Counts" , 200, 0., 20.0 );
304 fListHistCascade->Add(fHistXiRadius);
308 // - Histos about ~ the "V0 part" of the cascade, coming by inheritance from AliESDv0
312 if (! fHistMassLambdaAsCascDghter) {
313 fHistMassLambdaAsCascDghter = new TH1F("fHistMassLambdaAsCascDghter","#Lambda associated to Casc. candidates;Eff. Mass (GeV/c^{2});Counts", 160,1.00,1.8);
314 fListHistCascade->Add(fHistMassLambdaAsCascDghter);
317 if (! fHistV0Chi2Xi) {
318 fHistV0Chi2Xi = new TH1F("fHistV0Chi2Xi", "V0 #chi^{2}, in cascade; #chi^{2};Counts", 160, 0, 40);
319 fListHistCascade->Add(fHistV0Chi2Xi);
322 if (! fHistDcaV0DaughtersXi) {
323 fHistDcaV0DaughtersXi = new TH1F("fHistDcaV0DaughtersXi", "DCA between V0 daughters, in cascade;DCA (cm);Number of V0s", 120, 0., 0.6);
324 fListHistCascade->Add(fHistDcaV0DaughtersXi);
327 if (! fHistDcaV0ToPrimVertexXi) {
328 fHistDcaV0ToPrimVertexXi = new TH1F("fHistDcaV0ToPrimVertexXi", "DCA of V0 to Prim. Vertex, in cascade;DCA (cm);Number of Cascades", 200, 0., 1.);
329 fListHistCascade->Add(fHistDcaV0ToPrimVertexXi);
332 if (! fHistV0CosineOfPointingAngleXi) {
333 fHistV0CosineOfPointingAngleXi = new TH1F("fHistV0CosineOfPointingAngleXi", "Cosine of V0 Pointing Angle, in cascade;Cos(V0 Point. Angl); Counts", 200, 0.98, 1.0);
334 fListHistCascade->Add(fHistV0CosineOfPointingAngleXi);
337 if (! fHistV0RadiusXi) {
338 fHistV0RadiusXi = new TH1F("fHistV0RadiusXi", "V0 decay radius, in cascade; radius (cm); Counts", 200, 0, 20);
339 fListHistCascade->Add(fHistV0RadiusXi);
342 if (! fHistDcaPosToPrimVertexXi) {
343 fHistDcaPosToPrimVertexXi = new TH1F("fHistDcaPosToPrimVertexXi", "DCA of V0 pos daughter to Prim. Vertex;DCA (cm);Counts", 300, 0, 3);
344 fListHistCascade->Add(fHistDcaPosToPrimVertexXi);
347 if (! fHistDcaNegToPrimVertexXi) {
348 fHistDcaNegToPrimVertexXi = new TH1F("fHistDcaNegToPrimVertexXi", "DCA of V0 neg daughter to Prim. Vertex;DCA (cm);Counts", 300, 0, 3);
349 fListHistCascade->Add(fHistDcaNegToPrimVertexXi);
355 // - Effective mass histos for cascades.
357 if (! fHistMassXiMinus) {
358 fHistMassXiMinus = new TH1F("fHistMassXiMinus","#Xi^{-} candidates;M( #Lambda , #pi^{-} ) (GeV/c^{2});Counts", 200,1.2,2.0);
359 fListHistCascade->Add(fHistMassXiMinus);
362 if (! fHistMassXiPlus) {
363 fHistMassXiPlus = new TH1F("fHistMassXiPlus","#Xi^{+} candidates;M( #bar{#Lambda}^{0} , #pi^{+} ) (GeV/c^{2});Counts",200,1.2,2.0);
364 fListHistCascade->Add(fHistMassXiPlus);
367 if (! fHistMassOmegaMinus) {
368 fHistMassOmegaMinus = new TH1F("fHistMassOmegaMinus","#Omega^{-} candidates;M( #Lambda , K^{-} ) (GeV/c^{2});Counts", 250,1.5,2.5);
369 fListHistCascade->Add(fHistMassOmegaMinus);
372 if (! fHistMassOmegaPlus) {
373 fHistMassOmegaPlus = new TH1F("fHistMassOmegaPlus","#Omega^{+} candidates;M( #bar{#Lambda}^{0} , K^{+} ) (GeV/c^{2});Counts", 250,1.5,2.5);
374 fListHistCascade->Add(fHistMassOmegaPlus);
379 // - Complements for QA
381 if(! fHistXiTransvMom ){
382 fHistXiTransvMom = new TH1F( "fHistXiTransvMom" , "Xi transverse momentum ; p_{t}(#Xi) (GeV/c); Counts", 100, 0.0, 10.0);
383 fListHistCascade->Add(fHistXiTransvMom);
386 if(! fHistXiTotMom ){
387 fHistXiTotMom = new TH1F( "fHistXiTotMom" , "Xi momentum norm; p_{tot}(#Xi) (GeV/c); Counts", 150, 0.0, 15.0);
388 fListHistCascade->Add(fHistXiTotMom);
392 if(! fHistBachTransvMom ){
393 fHistBachTransvMom = new TH1F( "fHistBachTransvMom" , "Bach. transverse momentum ; p_{t}(Bach.) (GeV/c); Counts", 100, 0.0, 5.0);
394 fListHistCascade->Add(fHistBachTransvMom);
397 if(! fHistBachTotMom ){
398 fHistBachTotMom = new TH1F( "fHistBachTotMom" , "Bach. momentum norm; p_{tot}(Bach.) (GeV/c); Counts", 100, 0.0, 5.0);
399 fListHistCascade->Add(fHistBachTotMom);
403 if(! fHistChargeXi ){
404 fHistChargeXi = new TH1F( "fHistChargeXi" , "Charge of casc. candidates ; Sign ; Counts", 5, -2.0, 3.0);
405 fListHistCascade->Add(fHistChargeXi);
409 if (! fHistV0toXiCosineOfPointingAngle) {
410 fHistV0toXiCosineOfPointingAngle = new TH1F("fHistV0toXiCosineOfPointingAngle", "Cos. of V0 Ptng Angl / Xi vtx ;Cos(V0 Point. Angl / Xi vtx); Counts", 100, 0.99, 1.0);
411 fListHistCascade->Add(fHistV0toXiCosineOfPointingAngle);
416 fHistRapXi = new TH1F( "fHistRapXi" , "Rapidity of Xi candidates ; y ; Counts", 200, -5.0, 5.0);
417 fListHistCascade->Add(fHistRapXi);
420 if(! fHistRapOmega ){
421 fHistRapOmega = new TH1F( "fHistRapOmega" , "Rapidity of Omega candidates ; y ; Counts", 200, -5.0, 5.0);
422 fListHistCascade->Add(fHistRapOmega);
426 fHistEta = new TH1F( "fHistEta" , "Pseudo-rap. of casc. candidates ; #eta ; Counts", 120, -3.0, 3.0);
427 fListHistCascade->Add(fHistEta);
431 fHistTheta = new TH1F( "fHistTheta" , "#theta of casc. candidates ; #theta (deg) ; Counts", 180, 0., 180.0);
432 fListHistCascade->Add(fHistTheta);
436 fHistPhi = new TH1F( "fHistPhi" , "#phi of casc. candidates ; #phi (deg) ; Counts", 360, 0., 360.);
437 fListHistCascade->Add(fHistPhi);
441 if(! f2dHistArmenteros) {
442 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);
443 fListHistCascade->Add(f2dHistArmenteros);
446 if(! f2dHistEffMassLambdaVsEffMassXiMinus) {
447 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);
448 fListHistCascade->Add(f2dHistEffMassLambdaVsEffMassXiMinus);
451 if(! f2dHistEffMassXiVsEffMassOmegaMinus) {
452 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);
453 fListHistCascade->Add(f2dHistEffMassXiVsEffMassOmegaMinus);
456 if(! f2dHistEffMassLambdaVsEffMassXiPlus) {
457 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);
458 fListHistCascade->Add(f2dHistEffMassLambdaVsEffMassXiPlus);
461 if(! f2dHistEffMassXiVsEffMassOmegaPlus) {
462 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);
463 fListHistCascade->Add(f2dHistEffMassXiVsEffMassOmegaPlus);
466 if(! f2dHistXiRadiusVsEffMassXiMinus) {
467 f2dHistXiRadiusVsEffMassXiMinus = new TH2F( "f2dHistXiRadiusVsEffMassXiMinus", "Transv. R_{Xi Decay} Vs M_{#Xi^{-} candidates}; r_{Xi} (cm); M( #Lambda , #pi^{-} ) (GeV/c^{2}) ", 450, 0., 45.0, 200, 1.2, 2.0);
468 fListHistCascade->Add(f2dHistXiRadiusVsEffMassXiMinus);
471 if(! f2dHistXiRadiusVsEffMassXiPlus) {
472 f2dHistXiRadiusVsEffMassXiPlus = new TH2F( "f2dHistXiRadiusVsEffMassXiPlus", "Transv. R_{Xi Decay} Vs M_{#Xi^{+} candidates}; r_{Xi} (cm); M( #Lambda , #pi^{+} ) (GeV/c^{2}) ", 450, 0., 45.0, 200, 1.2, 2.0);
473 fListHistCascade->Add(f2dHistXiRadiusVsEffMassXiPlus);
479 }// end UserCreateOutputObjects
486 //________________________________________________________________________
487 void AliAnalysisTaskCheckCascade::UserExec(Option_t *)
490 // Called for each event
492 AliESDEvent *lESDevent = 0x0;
493 AliAODEvent *lAODevent = 0x0;
494 Int_t ncascades = -1;
497 // Connect to the InputEvent
498 // After these lines, we should have an ESD/AOD event + the number of cascades in it.
500 if(fAnalysisType == "ESD"){
501 lESDevent = dynamic_cast<AliESDEvent*>( InputEvent() );
503 Printf("ERROR: lESDevent not available \n");
506 ncascades = lESDevent->GetNumberOfCascades();
509 if(fAnalysisType == "AOD"){
510 lAODevent = dynamic_cast<AliAODEvent*>( InputEvent() );
512 Printf("ERROR: lAODevent not available \n");
515 ncascades = lAODevent->GetNumberOfCascades();
518 // ---------------------------------------------------------------
519 // I - Initialisation of the local variables that will be needed
522 // - 0th part of initialisation : around primary vertex ...
523 Short_t lStatusTrackingPrimVtx = -2;
524 Double_t lTrkgPrimaryVtxPos[3] = {-100.0, -100.0, -100.0};
525 Double_t lTrkgPrimaryVtxRadius3D = -500.0;
527 Double_t lBestPrimaryVtxPos[3] = {-100.0, -100.0, -100.0};
528 Double_t lBestPrimaryVtxRadius3D = -500.0;
530 // - 1st part of initialisation : variables needed to store AliESDCascade data members
531 Double_t lEffMassXi = 0. ;
532 Double_t lChi2Xi = 0. ;
533 Double_t lDcaXiDaughters = 0. ;
534 Double_t lXiCosineOfPointingAngle = 0. ;
535 Double_t lPosXi[3] = { -1000.0, -1000.0, -1000.0 };
536 Double_t lXiRadius = 0. ;
539 // - 2nd part of initialisation : about V0 part in cascades
541 Double_t lInvMassLambdaAsCascDghter = 0.;
542 Double_t lV0Chi2Xi = 0. ;
543 Double_t lDcaV0DaughtersXi = 0.;
545 Double_t lDcaBachToPrimVertexXi = 0., lDcaV0ToPrimVertexXi = 0.;
546 Double_t lDcaPosToPrimVertexXi = 0.;
547 Double_t lDcaNegToPrimVertexXi = 0.;
548 Double_t lV0CosineOfPointingAngleXi = 0. ;
549 Double_t lPosV0Xi[3] = { -1000. , -1000., -1000. }; // Position of VO coming from cascade
550 Double_t lV0RadiusXi = -1000.0;
551 Double_t lV0quality = 0.;
554 // - 3rd part of initialisation : Effective masses
556 Double_t lInvMassXiMinus = 0.;
557 Double_t lInvMassXiPlus = 0.;
558 Double_t lInvMassOmegaMinus = 0.;
559 Double_t lInvMassOmegaPlus = 0.;
562 // - 4th part of initialisation : extra info for QA
564 Double_t lXiMomX = 0., lXiMomY = 0., lXiMomZ = 0.;
565 Double_t lXiTransvMom = 0. ;
566 Double_t lXiTotMom = 0. ;
568 Double_t lBachMomX = 0., lBachMomY = 0., lBachMomZ = 0.;
569 Double_t lBachTransvMom = 0.;
570 Double_t lBachTotMom = 0.;
572 Short_t lChargeXi = -2;
573 Double_t lV0toXiCosineOfPointingAngle = 0. ;
575 Double_t lRapXi = -20.0, lRapOmega = -20.0, lEta = -20.0, lTheta = 360., lPhi = 720. ;
576 Double_t lAlphaXi = -200., lPtArmXi = -200.0;
580 //-------------------------------------------------
581 // O - Cascade vertexer (ESD)
583 // if(fAnalysisType == "ESD" ){
584 // lESDevent->ResetCascades();
585 // AliCascadeVertexer CascVtxer;
586 // CascVtxer.V0sTracks2CascadeVertices(lESDevent);
590 // ---------------------------------------------------------------
591 // I - General histos (filled for any event) - (ESD)
593 fHistTrackMultiplicity ->Fill( (InputEvent())->GetNumberOfTracks() );
594 fHistCascadeMultiplicity->Fill( ncascades );
599 for (Int_t iXi = 0; iXi < ncascades; iXi++)
600 {// This is the begining of the Cascade loop (ESD or AOD)
603 if(fAnalysisType == "ESD"){
605 // -------------------------------------
606 // II - Calcultaion Part dedicated to Xi vertices (ESD)
608 AliESDcascade *xi = lESDevent->GetCascade(iXi);
611 // Just to know which file is currently open : locate the file containing Xi
612 // cout << "Name of the file containing Xi candidate(s) :"
613 // << fInputHandler->GetTree()->GetCurrentFile()->GetName()
617 // - II.Step 1 : Characteristics of the event : prim. Vtx + magnetic field (ESD)
620 // For new code (v4-16-Release-Rev06 or trunk)
622 const AliESDVertex *lPrimaryTrackingVtx = lESDevent->GetPrimaryVertexTracks();
623 // get the vtx stored in ESD found with tracks
625 lPrimaryTrackingVtx->GetXYZ( lTrkgPrimaryVtxPos );
626 lTrkgPrimaryVtxRadius3D = TMath::Sqrt( lTrkgPrimaryVtxPos[0] * lTrkgPrimaryVtxPos[0] +
627 lTrkgPrimaryVtxPos[1] * lTrkgPrimaryVtxPos[1] +
628 lTrkgPrimaryVtxPos[2] * lTrkgPrimaryVtxPos[2] );
630 lStatusTrackingPrimVtx = lPrimaryTrackingVtx->GetStatus();
633 const AliESDVertex *lPrimaryBestVtx = lESDevent->GetPrimaryVertex();
634 // get the best primary vertex available for the event
635 // As done in AliCascadeVertexer, we keep the one which is the best one available.
636 // between : Tracking vertex > SPD vertex > TPC vertex > default SPD vertex
637 // This one will be used for next calculations (DCA essentially)
639 lPrimaryBestVtx->GetXYZ( lBestPrimaryVtxPos );
640 lBestPrimaryVtxRadius3D = TMath::Sqrt( lBestPrimaryVtxPos[0] * lBestPrimaryVtxPos[0] +
641 lBestPrimaryVtxPos[1] * lBestPrimaryVtxPos[1] +
642 lBestPrimaryVtxPos[2] * lBestPrimaryVtxPos[2] );
647 // const AliESDVertex *lPrimaryTrackingVtx = lESDevent->GetPrimaryVertexTracks();
648 // get the vtx stored in ESD found with tracks
649 // Double_t lTrkgPrimaryVtxPos[3] = {-100.0, -100.0, -100.0};
650 // lPrimaryTrackingVtx->GetXYZ( lTrkgPrimaryVtxPos );
651 // Double_t lTrkgPrimaryVtxRadius3D = TMath::Sqrt( lTrkgPrimaryVtxPos[0]*lTrkgPrimaryVtxPos[0] +
652 // lTrkgPrimaryVtxPos[1] * lTrkgPrimaryVtxPos[1] +
653 // lTrkgPrimaryVtxPos[2] * lTrkgPrimaryVtxPos[2] );
655 // const AliESDVertex *lPrimarySPDVtx = lESDevent->GetPrimaryVertexSPD();
656 // get the vtx found by exclusive use of SPD
657 // Double_t lSPDPrimaryVtxPos[3] = {-100.0, -100.0, -100.0};
658 // lPrimarySPDVtx->GetXYZ( lSPDPrimaryVtxPos );
660 // // As done in AliCascadeVertexer, we keep, between both retrieved vertices,
661 // // the one which is the best one available.
662 // // This one will be used for next calculations (DCA essentially)
664 // Double_t lBestPrimaryVtxPos[3] = {-100.0, -100.0, -100.0};
665 // if( lPrimaryTrackingVtx->GetStatus() ) { // if tracking vtx = ok
666 // lBestPrimaryVtxPos[0] = lTrkgPrimaryVtxPos[0];
667 // lBestPrimaryVtxPos[1] = lTrkgPrimaryVtxPos[1];
668 // lBestPrimaryVtxPos[2] = lTrkgPrimaryVtxPos[2];
671 // lBestPrimaryVtxPos[0] = lSPDPrimaryVtxPos[0];
672 // lBestPrimaryVtxPos[1] = lSPDPrimaryVtxPos[1];
673 // lBestPrimaryVtxPos[2] = lSPDPrimaryVtxPos[2];
676 // Double_t lBestPrimaryVtxRadius3D = TMath::Sqrt( lBestPrimaryVtxPos[0]*lBestPrimaryVtxPos[0] +
677 // lBestPrimaryVtxPos[1] * lBestPrimaryVtxPos[1] +
678 // lBestPrimaryVtxPos[2] * lBestPrimaryVtxPos[2] );
682 Double_t lMagneticField = lESDevent->GetMagneticField( );
686 // - II.Step 2 : Assigning the necessary variables for specific AliESDcascade data members (ESD)
689 xi->ChangeMassHypothesis(lV0quality , 3312); // default working hypothesis : cascade = Xi- decay
691 lEffMassXi = xi->GetEffMassXi();
692 lChi2Xi = xi->GetChi2Xi();
693 lDcaXiDaughters = xi->GetDcaXiDaughters();
694 lXiCosineOfPointingAngle = xi->GetCascadeCosineOfPointingAngle( lBestPrimaryVtxPos[0],
695 lBestPrimaryVtxPos[1],
696 lBestPrimaryVtxPos[2] );
697 // Take care : the best available vertex should be used (like in AliCascadeVertexer)
699 xi->GetXYZcascade( lPosXi[0], lPosXi[1], lPosXi[2] );
700 lXiRadius = TMath::Sqrt( lPosXi[0]*lPosXi[0] + lPosXi[1]*lPosXi[1] );
704 // - II.Step 3 : around the tracks : Bach + V0 (ESD)
705 // ~ Necessary variables for ESDcascade data members coming from the ESDv0 part (inheritance)
708 UInt_t lIdxPosXi = (UInt_t) TMath::Abs( xi->GetPindex() );
709 UInt_t lIdxNegXi = (UInt_t) TMath::Abs( xi->GetNindex() );
710 UInt_t lBachIdx = (UInt_t) TMath::Abs( xi->GetBindex() );
711 // Care track label can be negative in MC production (linked with the track quality)
712 // However = normally, not the case for track index ...
714 AliESDtrack *pTrackXi = lESDevent->GetTrack( lIdxPosXi );
715 AliESDtrack *nTrackXi = lESDevent->GetTrack( lIdxNegXi );
716 AliESDtrack *bachTrackXi = lESDevent->GetTrack( lBachIdx );
717 if (!pTrackXi || !nTrackXi || !bachTrackXi ) {
718 Printf("ERROR: Could not retrieve one of the 3 daughter tracks of the cascade ...");
722 lInvMassLambdaAsCascDghter = xi->GetEffMass();
723 // This value shouldn't change, whatever the working hyp. is : Xi-, Xi+, Omega-, Omega+
724 lDcaV0DaughtersXi = xi->GetDcaV0Daughters();
725 lV0Chi2Xi = xi->GetChi2V0();
727 lV0CosineOfPointingAngleXi = xi->GetV0CosineOfPointingAngle( lBestPrimaryVtxPos[0],
728 lBestPrimaryVtxPos[1],
729 lBestPrimaryVtxPos[2] );
731 lDcaV0ToPrimVertexXi = xi->GetD( lBestPrimaryVtxPos[0],
732 lBestPrimaryVtxPos[1],
733 lBestPrimaryVtxPos[2] );
735 lDcaBachToPrimVertexXi = TMath::Abs( bachTrackXi->GetD( lBestPrimaryVtxPos[0],
736 lBestPrimaryVtxPos[1],
738 // Note : AliExternalTrackParam::GetD returns an algebraic value ...
740 xi->GetXYZ( lPosV0Xi[0], lPosV0Xi[1], lPosV0Xi[2] );
741 lV0RadiusXi = TMath::Sqrt( lPosV0Xi[0]*lPosV0Xi[0] + lPosV0Xi[1]*lPosV0Xi[1] );
743 lDcaPosToPrimVertexXi = TMath::Abs( pTrackXi ->GetD( lBestPrimaryVtxPos[0],
744 lBestPrimaryVtxPos[1],
747 lDcaNegToPrimVertexXi = TMath::Abs( nTrackXi ->GetD( lBestPrimaryVtxPos[0],
748 lBestPrimaryVtxPos[1],
752 // - II.Step 4 : around effective masses (ESD)
753 // ~ change mass hypotheses to cover all the possibilities : Xi-/+, Omega -/+
757 xi->ChangeMassHypothesis(lV0quality , 3312); // Calculate the effective mass of the Xi- candidate.
758 // pdg code 3312 = Xi-
759 if( bachTrackXi->Charge() < 0 )
760 lInvMassXiMinus = xi->GetEffMassXi();
763 xi->ChangeMassHypothesis(lV0quality , -3312); // Calculate the effective mass of the Xi+ candidate.
764 // pdg code -3312 = Xi+
765 if( bachTrackXi->Charge() > 0 )
766 lInvMassXiPlus = xi->GetEffMassXi();
769 xi->ChangeMassHypothesis(lV0quality , 3334); // Calculate the effective mass of the Xi- candidate.
770 // pdg code 3334 = Omega-
771 if( bachTrackXi->Charge() < 0 )
772 lInvMassOmegaMinus = xi->GetEffMassXi();
775 xi->ChangeMassHypothesis(lV0quality , -3334); // Calculate the effective mass of the Xi+ candidate.
776 // pdg code -3334 = Omega+
777 if( bachTrackXi->Charge() > 0 )
778 lInvMassOmegaPlus = xi->GetEffMassXi();
781 xi->ChangeMassHypothesis(lV0quality , 3312); // Back to default hyp.
784 // - II.Step 5 : extra info for QA (ESD)
785 // miscellaneous pieces onf info that may help regarding data quality assessment.
788 xi->GetPxPyPz( lXiMomX, lXiMomY, lXiMomZ );
789 lXiTransvMom = TMath::Sqrt( lXiMomX*lXiMomX + lXiMomY*lXiMomY );
790 lXiTotMom = TMath::Sqrt( lXiMomX*lXiMomX + lXiMomY*lXiMomY + lXiMomZ*lXiMomZ );
792 xi->GetBPxPyPz( lBachMomX, lBachMomY, lBachMomZ );
793 lBachTransvMom = TMath::Sqrt( lBachMomX*lBachMomX + lBachMomY*lBachMomY );
794 lBachTotMom = TMath::Sqrt( lBachMomX*lBachMomX + lBachMomY*lBachMomY + lBachMomZ*lBachMomZ );
796 lChargeXi = xi->Charge();
798 lV0toXiCosineOfPointingAngle = xi->GetV0CosineOfPointingAngle( lPosXi[0], lPosXi[1], lPosXi[2] );
800 lRapXi = xi->RapXi();
801 lRapOmega = xi->RapOmega();
803 lTheta = xi->Theta() *180.0/TMath::Pi();
804 lPhi = xi->Phi() *180.0/TMath::Pi();
805 lAlphaXi = xi->AlphaXi();
806 lPtArmXi = xi->PtArmXi();
809 }// end of ESD treatment
812 if(fAnalysisType == "AOD"){
814 // -------------------------------------
815 // II - Calcultaion Part dedicated to Xi vertices (ESD)
817 const AliAODcascade *xi = lAODevent->GetCascade(iXi);
820 // Just to know which file is currently open : locate the file containing Xi
821 // cout << "Name of the file containing Xi candidate(s) :" << fesdH->GetTree()->GetCurrentFile()->GetName() << endl;
824 // - II.Step 1 : Characteristics of the event : prim. Vtx + magnetic field (AOD)
827 lTrkgPrimaryVtxPos[0] = -100.0;
828 lTrkgPrimaryVtxPos[1] = -100.0;
829 lTrkgPrimaryVtxPos[2] = -100.0;
830 lTrkgPrimaryVtxRadius3D = -500. ;
831 // We don't have the different prim. vertex at the AOD level -> nothing to do.
833 const AliAODVertex *lPrimaryBestVtx = lAODevent->GetPrimaryVertex();
834 // get the best primary vertex available for the event
835 // We may keep the one which is the best one available = GetVertex(0)
836 // Pb with pile-up to expect
837 // This one will be used for next calculations (DCA essentially)
839 lPrimaryBestVtx->GetXYZ( lBestPrimaryVtxPos );
840 lBestPrimaryVtxRadius3D = TMath::Sqrt( lBestPrimaryVtxPos[0] * lBestPrimaryVtxPos[0] +
841 lBestPrimaryVtxPos[1] * lBestPrimaryVtxPos[1] +
842 lBestPrimaryVtxPos[2] * lBestPrimaryVtxPos[2] );
845 // - II.Step 2 : Assigning the necessary variables for specific AliAODcascade data members (AOD)
848 lEffMassXi = xi->MassXi(); // default working hypothesis : cascade = Xi- decay
849 lChi2Xi = xi->Chi2Xi();
850 lDcaXiDaughters = xi->DcaXiDaughters();
851 lXiCosineOfPointingAngle = xi->CosPointingAngleXi( lBestPrimaryVtxPos[0],
852 lBestPrimaryVtxPos[1],
853 lBestPrimaryVtxPos[2] );
855 // the best available vertex should be used (like in AliCascadeVertexer)
857 lPosXi[0] = xi->DecayVertexXiX();
858 lPosXi[1] = xi->DecayVertexXiY();
859 lPosXi[2] = xi->DecayVertexXiZ();
860 lXiRadius = TMath::Sqrt( lPosXi[0]*lPosXi[0] + lPosXi[1]*lPosXi[1] );
863 // - II.Step 3 : around the tracks : Bach + V0 (AOD)
864 // ~ Necessary variables for AODcascade data members coming from the AODv0 part (inheritance)
867 lChargeXi = xi->ChargeXi();
870 lInvMassLambdaAsCascDghter = xi->MassLambda();
872 lInvMassLambdaAsCascDghter = xi->MassAntiLambda();
874 lDcaV0DaughtersXi = xi->DcaV0Daughters();
875 lV0Chi2Xi = xi->Chi2V0();
877 lV0CosineOfPointingAngleXi = xi->CosPointingAngle( lBestPrimaryVtxPos );
878 lDcaV0ToPrimVertexXi = xi->DcaV0ToPrimVertex();
880 lDcaBachToPrimVertexXi = xi->DcaBachToPrimVertex();
883 lPosV0Xi[0] = xi->DecayVertexV0X();
884 lPosV0Xi[1] = xi->DecayVertexV0Y();
885 lPosV0Xi[2] = xi->DecayVertexV0Z();
886 lV0RadiusXi = TMath::Sqrt( lPosV0Xi[0]*lPosV0Xi[0] + lPosV0Xi[1]*lPosV0Xi[1] );
888 lDcaPosToPrimVertexXi = xi->DcaPosToPrimVertex();
889 lDcaNegToPrimVertexXi = xi->DcaNegToPrimVertex();
892 // - II.Step 4 : around effective masses (AOD)
893 // ~ change mass hypotheses to cover all the possibilities : Xi-/+, Omega -/+
896 if( lChargeXi < 0 ) lInvMassXiMinus = xi->MassXi();
897 if( lChargeXi > 0 ) lInvMassXiPlus = xi->MassXi();
898 if( lChargeXi < 0 ) lInvMassOmegaMinus = xi->MassOmega();
899 if( lChargeXi > 0 ) lInvMassOmegaPlus = xi->MassOmega();
902 // - II.Step 5 : extra info for QA (AOD)
903 // miscellaneous pieces onf info that may help regarding data quality assessment.
906 lXiMomX = xi->MomXiX();
907 lXiMomY = xi->MomXiY();
908 lXiMomZ = xi->MomXiZ();
909 lXiTransvMom = TMath::Sqrt( lXiMomX*lXiMomX + lXiMomY*lXiMomY );
910 lXiTotMom = TMath::Sqrt( lXiMomX*lXiMomX + lXiMomY*lXiMomY + lXiMomZ*lXiMomZ );
912 lBachMomX = xi->MomBachX();
913 lBachMomY = xi->MomBachY();
914 lBachMomZ = xi->MomBachZ();
915 lBachTransvMom = TMath::Sqrt( lBachMomX*lBachMomX + lBachMomY*lBachMomY );
916 lBachTotMom = TMath::Sqrt( lBachMomX*lBachMomX + lBachMomY*lBachMomY + lBachMomZ*lBachMomZ );
919 lV0toXiCosineOfPointingAngle = xi->CosPointingAngle( xi->GetDecayVertexXi() );
921 lRapXi = xi->RapXi();
922 lRapOmega = xi->RapOmega();
923 lEta = xi->Eta(); // Will not work ! need a method Pz(), Py() Px()
924 lTheta = xi->Theta() *180.0/TMath::Pi(); // in AODcascade.
925 lPhi = xi->Phi() *180.0/TMath::Pi(); // Here, we will get eta, theta, phi for the V0 ...
926 lAlphaXi = xi->AlphaXi();
927 lPtArmXi = xi->PtArmXi();
930 }// end of AOD treatment
933 // -------------------------------------
934 // III - Filling the TH1Fs
939 fHistVtxStatus ->Fill( lStatusTrackingPrimVtx ); // 1 if tracking vtx = ok
941 if( lStatusTrackingPrimVtx ){
942 fHistPosTrkgPrimaryVtxX ->Fill( lTrkgPrimaryVtxPos[0] );
943 fHistPosTrkgPrimaryVtxY ->Fill( lTrkgPrimaryVtxPos[1] );
944 fHistPosTrkgPrimaryVtxZ ->Fill( lTrkgPrimaryVtxPos[2] );
945 fHistTrkgPrimaryVtxRadius->Fill( lTrkgPrimaryVtxRadius3D );
948 fHistPosBestPrimaryVtxX ->Fill( lBestPrimaryVtxPos[0] );
949 fHistPosBestPrimaryVtxY ->Fill( lBestPrimaryVtxPos[1] );
950 fHistPosBestPrimaryVtxZ ->Fill( lBestPrimaryVtxPos[2] );
951 fHistBestPrimaryVtxRadius ->Fill( lBestPrimaryVtxRadius3D );
953 f2dHistTrkgPrimVtxVsBestPrimVtx->Fill( lTrkgPrimaryVtxRadius3D, lBestPrimaryVtxRadius3D );
957 fHistEffMassXi ->Fill( lEffMassXi );
958 fHistChi2Xi ->Fill( lChi2Xi ); // Flag CascadeVtxer: Cut Variable a
959 fHistDcaXiDaughters ->Fill( lDcaXiDaughters ); // Flag CascadeVtxer: Cut Variable e
960 fHistDcaBachToPrimVertex ->Fill( lDcaBachToPrimVertexXi ); // Flag CascadeVtxer: Cut Variable d
961 fHistXiCosineOfPointingAngle ->Fill( lXiCosineOfPointingAngle ); // Flag CascadeVtxer: Cut Variable f
962 fHistXiRadius ->Fill( lXiRadius ); // Flag CascadeVtxer: Cut Variable g+h
966 fHistMassLambdaAsCascDghter ->Fill( lInvMassLambdaAsCascDghter ); // Flag CascadeVtxer: Cut Variable c
967 fHistV0Chi2Xi ->Fill( lV0Chi2Xi );
968 fHistDcaV0DaughtersXi ->Fill( lDcaV0DaughtersXi );
969 fHistV0CosineOfPointingAngleXi ->Fill( lV0CosineOfPointingAngleXi );
970 fHistV0RadiusXi ->Fill( lV0RadiusXi );
972 fHistDcaV0ToPrimVertexXi ->Fill( lDcaV0ToPrimVertexXi ); // Flag CascadeVtxer: Cut Variable b
973 fHistDcaPosToPrimVertexXi ->Fill( lDcaPosToPrimVertexXi );
974 fHistDcaNegToPrimVertexXi ->Fill( lDcaNegToPrimVertexXi );
978 if( lChargeXi < 0 ) fHistMassXiMinus ->Fill( lInvMassXiMinus );
979 if( lChargeXi > 0 ) fHistMassXiPlus ->Fill( lInvMassXiPlus );
980 if( lChargeXi < 0 ) fHistMassOmegaMinus ->Fill( lInvMassOmegaMinus );
981 if( lChargeXi > 0 ) fHistMassOmegaPlus ->Fill( lInvMassOmegaPlus );
983 // if( bachTrackXi->Charge() < 0 ) fHistMassXiMinus ->Fill( lInvMassXiMinus );
984 // if( bachTrackXi->Charge() > 0 ) fHistMassXiPlus ->Fill( lInvMassXiPlus );
985 // if( bachTrackXi->Charge() < 0 ) fHistMassOmegaMinus ->Fill( lInvMassOmegaMinus );
986 // if( bachTrackXi->Charge() > 0 ) fHistMassOmegaPlus ->Fill( lInvMassOmegaPlus );
990 fHistXiTransvMom ->Fill( lXiTransvMom );
991 fHistXiTotMom ->Fill( lXiTotMom );
993 fHistBachTransvMom ->Fill( lBachTransvMom );
994 fHistBachTotMom ->Fill( lBachTotMom );
996 fHistChargeXi ->Fill( lChargeXi );
997 fHistV0toXiCosineOfPointingAngle->Fill( lV0toXiCosineOfPointingAngle );
999 fHistRapXi ->Fill( lRapXi );
1000 fHistRapOmega ->Fill( lRapOmega );
1001 fHistEta ->Fill( lEta );
1002 fHistTheta ->Fill( lTheta );
1003 fHistPhi ->Fill( lPhi );
1005 f2dHistArmenteros ->Fill( lAlphaXi, lPtArmXi );
1007 if( lChargeXi < 0 ) {
1008 f2dHistEffMassLambdaVsEffMassXiMinus->Fill( lInvMassLambdaAsCascDghter, lInvMassXiMinus );
1009 f2dHistEffMassXiVsEffMassOmegaMinus ->Fill( lInvMassXiMinus, lInvMassOmegaMinus );
1010 f2dHistXiRadiusVsEffMassXiMinus ->Fill( lXiRadius, lInvMassXiMinus );
1013 f2dHistEffMassLambdaVsEffMassXiPlus ->Fill( lInvMassLambdaAsCascDghter, lInvMassXiPlus );
1014 f2dHistEffMassXiVsEffMassOmegaPlus ->Fill( lInvMassXiPlus, lInvMassOmegaPlus );
1015 f2dHistXiRadiusVsEffMassXiPlus->Fill( lXiRadius, lInvMassXiPlus);
1019 }// end of the Cascade loop (ESD or AOD)
1022 // Post output data.
1023 PostData(1, fListHistCascade);
1035 //________________________________________________________________________
1036 void AliAnalysisTaskCheckCascade::Terminate(Option_t *)
1038 // Draw result to the screen
1039 // Called once at the end of the query
1041 fHistTrackMultiplicity = dynamic_cast<TH1F*> ( ((TList*)GetOutputData(1))->FindObject("fHistTrackMultiplicity") );
1042 if (!fHistTrackMultiplicity) {
1043 Printf("ERROR: fHistTrackMultiplicity not available");
1047 fHistCascadeMultiplicity = dynamic_cast<TH1F*> ( ((TList*)GetOutputData(1))->FindObject("fHistCascadeMultiplicity"));
1048 if (!fHistCascadeMultiplicity) {
1049 Printf("ERROR: fHistCascadeMultiplicity not available");
1053 TCanvas *c2 = new TCanvas("AliAnalysisTaskCheckCascade","Multiplicity",10,10,510,510);
1054 c2->cd(1)->SetLogy();
1056 fHistTrackMultiplicity->SetMarkerStyle(22);
1057 fHistTrackMultiplicity->DrawCopy("E");
1059 fHistCascadeMultiplicity->SetMarkerStyle(26);
1060 fHistCascadeMultiplicity->DrawCopy("ESAME");