]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWG2/SPECTRA/AliAnalysisTaskCheckPerformanceCascade.cxx
better pt dependence simulation
[u/mrichter/AliRoot.git] / PWG2 / SPECTRA / AliAnalysisTaskCheckPerformanceCascade.cxx
1 /***************************************************************          *
2  *  Authors : Antonin Maire, Boris Hippolyte
3  * Contributors are mentioned in the code where appropriate.              *
4  *                                                                        *
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  **************************************************************************/
13
14 //-----------------------------------------------------------------
15 //                 AliAnalysisTaskCheckPerformanceCascade class
16 //            This task is for a performance study of cascade identification.
17 //            It works with MC info and ESD/AOD tree.
18 //            Origin : A.Maire Mar2009, antonin.maire@ires.in2p3.fr
19 //-----------------------------------------------------------------
20
21
22 #include <Riostream.h>
23
24 #include "TList.h"
25 #include "TFile.h"
26 #include "TH1F.h"
27 #include "TH2F.h"
28 #include "TCanvas.h"
29 #include "TParticle.h"
30 #include "TMath.h"
31
32 #include "AliLog.h"
33 #include "AliHeader.h"
34 #include "AliMCEvent.h"
35 #include "AliStack.h"
36 #include "AliInputEventHandler.h"
37
38 #include "AliESDEvent.h"
39 #include "AliESDcascade.h"
40
41 #include "AliAODEvent.h"
42
43 #include "AliAnalysisTaskCheckPerformanceCascade.h"
44
45 ClassImp(AliAnalysisTaskCheckPerformanceCascade)
46
47
48
49      //_____Dummy constructor________________________________________________________________
50 AliAnalysisTaskCheckPerformanceCascade::AliAnalysisTaskCheckPerformanceCascade() 
51 : AliAnalysisTaskSE(), // <- take care to AliAnalysisTask( empty )
52   fDebugCascade(0), fAnalysisType("ESD"), fCollidingSystems(0),
53     
54         // - Cascade part initialisation
55 fListHistCascade(0),
56     fHistMCTrackMultiplicity(0), 
57
58     fHistEtaGenProton(0),
59     fHistEtaGenAntiProton(0),
60     
61    // Xi-
62    fHistEtaGenCascXiMinus(0),
63       
64    fHistYGenCascMidRapXiMinus(0),               
65    fHistEtaGenCascMidRapXiMinus(0),
66    fHistThetaGenCascMidRapXiMinus(0),
67    fHistPtGenCascMidRapXiMinus(0),
68    
69     fHistThetaGenCascXiMinus(0),
70     fHistPtFdblGenCascXiMinus(0),
71     
72     fHistThetaLambdaXiMinus(0), 
73     fHistThetaBachXiMinus(0),
74     
75     fHistThetaMesDghterXiMinus(0), 
76     fHistThetaBarDghterXiMinus(0),
77     
78     fHistPtBachXiMinus(0),
79     fHistPtMesDghterXiMinus(0),
80     fHistPtBarDghterXiMinus(0),
81    
82    
83    // Xi+
84    fHistEtaGenCascXiPlus(0),
85       
86     fHistYGenCascMidRapXiPlus(0),
87     fHistEtaGenCascMidRapXiPlus(0),
88     fHistThetaGenCascMidRapXiPlus(0),
89     fHistPtGenCascMidRapXiPlus(0),
90    
91     fHistThetaGenCascXiPlus(0), 
92     fHistPtFdblGenCascXiPlus(0),
93     
94     fHistThetaLambdaXiPlus(0), 
95     fHistThetaBachXiPlus(0),
96     
97     fHistThetaMesDghterXiPlus(0), 
98     fHistThetaBarDghterXiPlus(0),
99     
100     fHistPtBachXiPlus(0),
101     fHistPtMesDghterXiPlus(0),
102     fHistPtBarDghterXiPlus(0),
103    
104    // Omega-
105    fHistEtaGenCascOmegaMinus(0),
106    
107     fHistYGenCascMidRapOmegaMinus(0),
108     fHistEtaGenCascMidRapOmegaMinus(0),
109     fHistThetaGenCascMidRapOmegaMinus(0),
110     fHistPtGenCascMidRapOmegaMinus(0),
111    
112     fHistThetaGenCascOmegaMinus(0),
113     fHistPtFdblGenCascOmegaMinus(0),
114     
115     fHistThetaLambdaOmegaMinus(0), 
116     fHistThetaBachOmegaMinus(0),
117     
118     fHistThetaMesDghterOmegaMinus(0), 
119     fHistThetaBarDghterOmegaMinus(0),
120     
121     fHistPtBachOmegaMinus(0),
122     fHistPtMesDghterOmegaMinus(0),
123     fHistPtBarDghterOmegaMinus(0),
124    
125    
126    // Omega+
127    fHistEtaGenCascOmegaPlus(0),
128     
129     fHistYGenCascMidRapOmegaPlus(0),
130     fHistEtaGenCascMidRapOmegaPlus(0),
131     fHistThetaGenCascMidRapOmegaPlus(0),
132     fHistPtGenCascMidRapOmegaPlus(0),
133    
134     fHistThetaGenCascOmegaPlus(0),
135     fHistPtFdblGenCascOmegaPlus(0),
136     
137     fHistThetaLambdaOmegaPlus(0), 
138     fHistThetaBachOmegaPlus(0),
139     
140     fHistThetaMesDghterOmegaPlus(0), 
141     fHistThetaBarDghterOmegaPlus(0),
142     
143     fHistPtBachOmegaPlus(0),
144     fHistPtMesDghterOmegaPlus(0),
145     fHistPtBarDghterOmegaPlus(0),
146
147 // Part 2 - Association to MC
148         
149     fHistMassXiMinus(0),
150     fHistMassXiPlus(0),
151     fHistMassOmegaMinus(0),
152     fHistMassOmegaPlus(0),
153         
154         // - Effective mass histos for the cascade candidates associated with MC
155     fHistAsMCMassXiMinus(0),            
156     fHistAsMCMassXiPlus(0),             
157     fHistAsMCMassOmegaMinus(0),
158     fHistAsMCMassOmegaPlus(0),
159         
160         // - Generated Pt of the the cascade candidates associated with MC
161     fHistAsMCGenPtXiMinus(0),           
162     fHistAsMCGenPtXiPlus(0),            
163     fHistAsMCGenPtOmegaMinus(0),
164     fHistAsMCGenPtOmegaPlus(0),
165         
166         // - Generated Y of the the cascade candidates associated with MC
167     fHistAsMCGenYXiMinus(0),            
168     fHistAsMCGenYXiPlus(0),     
169     fHistAsMCGenYOmegaMinus(0),
170     fHistAsMCGenYOmegaPlus(0),
171     
172         // - Generated Y Vs Generated Pt, for the cascade candidates associated with MC
173     f2dHistAsMCGenYVsGenPtXiMinus(0),
174     f2dHistAsMCGenYVsGenPtXiPlus(0),
175     f2dHistAsMCGenYVsGenPtOmegaMinus(0),
176     f2dHistAsMCGenYVsGenPtOmegaPlus(0),
177     
178     
179         // - Generated Eta of the the cascade candidates associated with MC
180     fHistAsMCGenEtaXiMinus(0),
181     fHistAsMCGenEtaXiPlus(0),
182     fHistAsMCGenEtaOmegaMinus(0),
183     fHistAsMCGenEtaOmegaPlus(0),
184         
185         // - Resolution in Pt as function of generated Pt
186     f2dHistAsMCResPtXiMinus(0),         
187     f2dHistAsMCResPtXiPlus(0),          
188     f2dHistAsMCResPtOmegaMinus(0),
189     f2dHistAsMCResPtOmegaPlus(0),       
190         
191         // - Resolution in R(2D) as function of generated R
192     f2dHistAsMCResRXiMinus(0),          
193     f2dHistAsMCResRXiPlus(0),           
194     f2dHistAsMCResROmegaMinus(0),
195     f2dHistAsMCResROmegaPlus(0)
196         
197     
198                     
199 {
200 // Dummy constructor
201 }
202      
203        
204      
205      
206 //_____Non-default Constructor________________________________________________________________
207 AliAnalysisTaskCheckPerformanceCascade::AliAnalysisTaskCheckPerformanceCascade(const char *name) 
208   : AliAnalysisTaskSE(name),
209     fDebugCascade(0), fAnalysisType("ESD"), fCollidingSystems(0),
210       
211         // - Cascade part initialisation
212 fListHistCascade(0),
213     fHistMCTrackMultiplicity(0), 
214
215     fHistEtaGenProton(0),
216     fHistEtaGenAntiProton(0),
217     
218    // Xi-
219     fHistEtaGenCascXiMinus(0),
220       
221     fHistYGenCascMidRapXiMinus(0),              
222     fHistEtaGenCascMidRapXiMinus(0),
223     fHistThetaGenCascMidRapXiMinus(0),
224     fHistPtGenCascMidRapXiMinus(0),
225    
226     fHistThetaGenCascXiMinus(0),
227     fHistPtFdblGenCascXiMinus(0),
228     
229     fHistThetaLambdaXiMinus(0), 
230     fHistThetaBachXiMinus(0),
231     
232     fHistThetaMesDghterXiMinus(0), 
233     fHistThetaBarDghterXiMinus(0),
234     
235     fHistPtBachXiMinus(0),
236     fHistPtMesDghterXiMinus(0),
237     fHistPtBarDghterXiMinus(0),
238    
239    
240    // Xi+
241     fHistEtaGenCascXiPlus(0),
242       
243     fHistYGenCascMidRapXiPlus(0),
244     fHistEtaGenCascMidRapXiPlus(0),
245     fHistThetaGenCascMidRapXiPlus(0),
246     fHistPtGenCascMidRapXiPlus(0),
247    
248     fHistThetaGenCascXiPlus(0), 
249     fHistPtFdblGenCascXiPlus(0),
250     
251     fHistThetaLambdaXiPlus(0), 
252     fHistThetaBachXiPlus(0),
253     
254     fHistThetaMesDghterXiPlus(0), 
255     fHistThetaBarDghterXiPlus(0),
256     
257     fHistPtBachXiPlus(0),
258     fHistPtMesDghterXiPlus(0),
259     fHistPtBarDghterXiPlus(0),
260    
261    // Omega-
262     fHistEtaGenCascOmegaMinus(0),
263    
264     fHistYGenCascMidRapOmegaMinus(0),
265     fHistEtaGenCascMidRapOmegaMinus(0),
266     fHistThetaGenCascMidRapOmegaMinus(0),
267     fHistPtGenCascMidRapOmegaMinus(0),
268    
269     fHistThetaGenCascOmegaMinus(0),
270     fHistPtFdblGenCascOmegaMinus(0),
271     
272     fHistThetaLambdaOmegaMinus(0), 
273     fHistThetaBachOmegaMinus(0),
274     
275     fHistThetaMesDghterOmegaMinus(0), 
276     fHistThetaBarDghterOmegaMinus(0),
277     
278     fHistPtBachOmegaMinus(0),
279     fHistPtMesDghterOmegaMinus(0),
280     fHistPtBarDghterOmegaMinus(0),
281    
282    
283    // Omega+
284     fHistEtaGenCascOmegaPlus(0),
285     
286     fHistYGenCascMidRapOmegaPlus(0),
287     fHistEtaGenCascMidRapOmegaPlus(0),
288     fHistThetaGenCascMidRapOmegaPlus(0),
289     fHistPtGenCascMidRapOmegaPlus(0),
290    
291     fHistThetaGenCascOmegaPlus(0),
292     fHistPtFdblGenCascOmegaPlus(0),
293     
294     fHistThetaLambdaOmegaPlus(0), 
295     fHistThetaBachOmegaPlus(0),
296     
297     fHistThetaMesDghterOmegaPlus(0), 
298     fHistThetaBarDghterOmegaPlus(0),
299     
300     fHistPtBachOmegaPlus(0),
301     fHistPtMesDghterOmegaPlus(0),
302     fHistPtBarDghterOmegaPlus(0),
303
304 // Part 2 - Association to MC
305         
306     fHistMassXiMinus(0),
307     fHistMassXiPlus(0),
308     fHistMassOmegaMinus(0),
309     fHistMassOmegaPlus(0),
310         
311         // - Effective mass histos for the cascade candidates associated with MC
312     fHistAsMCMassXiMinus(0),            
313     fHistAsMCMassXiPlus(0),             
314     fHistAsMCMassOmegaMinus(0),
315     fHistAsMCMassOmegaPlus(0),
316         
317         // - Generated Pt of the the cascade candidates associated with MC
318     fHistAsMCGenPtXiMinus(0),           
319     fHistAsMCGenPtXiPlus(0),            
320     fHistAsMCGenPtOmegaMinus(0),
321     fHistAsMCGenPtOmegaPlus(0),
322         
323         // - Generated Y of the the cascade candidates associated with MC
324     fHistAsMCGenYXiMinus(0),            
325     fHistAsMCGenYXiPlus(0),     
326     fHistAsMCGenYOmegaMinus(0),
327     fHistAsMCGenYOmegaPlus(0),
328     
329         // - Generated Y Vs Generated Pt, for the cascade candidates associated with MC
330     f2dHistAsMCGenYVsGenPtXiMinus(0),
331     f2dHistAsMCGenYVsGenPtXiPlus(0),
332     f2dHistAsMCGenYVsGenPtOmegaMinus(0),
333     f2dHistAsMCGenYVsGenPtOmegaPlus(0),
334     
335         // - Generated Eta of the the cascade candidates associated with MC
336     fHistAsMCGenEtaXiMinus(0),
337     fHistAsMCGenEtaXiPlus(0),
338     fHistAsMCGenEtaOmegaMinus(0),
339     fHistAsMCGenEtaOmegaPlus(0),
340         
341         // - Resolution in Pt as function of generated Pt
342     f2dHistAsMCResPtXiMinus(0),         
343     f2dHistAsMCResPtXiPlus(0),          
344     f2dHistAsMCResPtOmegaMinus(0),
345     f2dHistAsMCResPtOmegaPlus(0),       
346         
347         // - Resolution in R(2D) as function of generated R
348     f2dHistAsMCResRXiMinus(0),          
349     f2dHistAsMCResRXiPlus(0),           
350     f2dHistAsMCResROmegaMinus(0),
351     f2dHistAsMCResROmegaPlus(0)
352         
353     
354     
355   
356     
357    
358 {
359   // Constructor
360
361   // Define input and output slots here
362         // Input slot #0 works with a TChain
363         //DefineInput(0, TChain::Class());
364   // Output slot #0 writes into a TList container (cascade)
365   DefineOutput(1, TList::Class());
366  
367 }
368
369
370
371
372
373 //________________________________________________________________________
374 void AliAnalysisTaskCheckPerformanceCascade::UserCreateOutputObjects()
375 {
376   // Create histograms
377   // Called once
378
379         
380    // Option for AliLog
381         AliLog::SetGlobalLogLevel(AliLog::kError); 
382         // to suppress the extensive info prompted by a run with MC                     
383
384         
385         
386   // Definition of the datamembers      
387   fListHistCascade = new TList();
388
389   
390   // - General
391   
392   if (!fHistMCTrackMultiplicity) {
393      fHistMCTrackMultiplicity = new TH1F("fHistMCTrackMultiplicity", "MC Track Multiplicity;Number of MC tracks;Events", 100, 0, 500);
394    //  fHistMCTrackMultiplicity = new TH1F("fHistMCTrackMultiplicity", "Multiplicity distribution;Number of tracks;Events", 200, 0, 40000); //HERE
395   fListHistCascade->Add(fHistMCTrackMultiplicity);
396   }
397   
398   if (!fHistEtaGenProton) {
399      fHistEtaGenProton = new TH1F("fHistEtaGenProton", "#eta of any gen. p^{+};#eta;Number of prim. protons", 200, -10, 10);
400      fListHistCascade->Add(fHistEtaGenProton);
401   }
402   
403   if (!fHistEtaGenAntiProton) {
404      fHistEtaGenAntiProton = new TH1F("fHistEtaGenAntiProton", "#eta of any gen. #bar{p}^{-};#eta;Number of prim. #bar{p}", 200, -10, 10);
405      fListHistCascade->Add(fHistEtaGenAntiProton);
406   }
407   
408
409
410
411
412
413   
414   //--------
415   // I - Xi- 
416   // - Pseudo-Rapidity distribution
417   if (!fHistEtaGenCascXiMinus) {
418      fHistEtaGenCascXiMinus = new TH1F("fHistEtaGenCascXiMinus", "#eta of any gen. #Xi^{-};#eta;Number of Casc", 200, -10, 10);
419      fListHistCascade->Add(fHistEtaGenCascXiMinus);
420   }
421   
422   // - Plots for |y(MC)| < 1    
423   if (!fHistYGenCascMidRapXiMinus) {
424           fHistYGenCascMidRapXiMinus = new TH1F("fHistYGenCascMidRapXiMinus", "Y of #Xi^{-} generated at mid rapidity;Y;Number of Casc", 240, -1.2, 1.2);
425           fListHistCascade->Add(fHistYGenCascMidRapXiMinus );
426   }
427   
428   if (!fHistEtaGenCascMidRapXiMinus) {
429           fHistEtaGenCascMidRapXiMinus = new TH1F("fHistEtaGenCascMidRapXiMinus", "#eta of #Xi^{-} generated at mid rapidity;#eta;Number of Casc", 100, -5, 5);
430           fListHistCascade->Add(fHistEtaGenCascMidRapXiMinus );
431   }
432   
433   if (!fHistThetaGenCascMidRapXiMinus) {
434           fHistThetaGenCascMidRapXiMinus = new TH1F("fHistThetaGenCascMidRapXiMinus", "#theta of #Xi^{-} generated at mid rapidity;#theta (deg);Number of Casc", 200, -10, 190);
435           fListHistCascade->Add(fHistThetaGenCascMidRapXiMinus );
436   }
437   
438   if (!fHistPtGenCascMidRapXiMinus) {
439           fHistPtGenCascMidRapXiMinus = new TH1F("fHistPtGenCascMidRapXiMinus", "P_{t} of #Xi^{-} generated at mid rapidity;P_{t} (GeV/c);Number of Casc", 200, 0., 10.);
440           fListHistCascade->Add(fHistPtGenCascMidRapXiMinus );
441   }
442   
443   
444   // - Info at the generation level of multi-strange particle
445   
446   if (!fHistThetaGenCascXiMinus) {
447      fHistThetaGenCascXiMinus = new TH1F("fHistThetaGenCascXiMinus", "#theta of gen. #Xi^{-};#theta;Number of Casc.", 200, -10, 190);
448      fListHistCascade->Add(fHistThetaGenCascXiMinus);
449   }
450
451   if (!fHistPtFdblGenCascXiMinus) {
452           fHistPtFdblGenCascXiMinus = new TH1F("fHistPtFdblGenCascXiMinus","P_{t} of findable generated #Xi^{-};P_{t} (GeV/c);Number of Casc", 200, 0, 10);
453           fListHistCascade->Add(fHistPtFdblGenCascXiMinus );
454   }
455   
456                 // - Theta distribution the daughters (control plots)
457   
458   if (!fHistThetaLambdaXiMinus) {
459      fHistThetaLambdaXiMinus = new TH1F("fHistThetaLambdaXiMinus", "#theta of gen. #Lambda (Xi dghter);#theta_{#Lambda};Number of #Lambda^0", 200, -10, 190);
460      fListHistCascade->Add(fHistThetaLambdaXiMinus);
461   }
462
463   if (!fHistThetaBachXiMinus) {
464      fHistThetaBachXiMinus = new TH1F("fHistThetaBachXiMinus", "#theta of gen. Bach.;#theta_{Bach};Number of Bach.", 200, -10, 190);
465      fListHistCascade->Add(fHistThetaBachXiMinus);
466   }
467   
468   if (!fHistThetaMesDghterXiMinus) {
469      fHistThetaMesDghterXiMinus = new TH1F("fHistThetaMesDghterXiMinus", "#theta of gen. Meson #Lambda dghter;#theta_{MesDght};Number of Mes.", 200, -10, 190);
470      fListHistCascade->Add(fHistThetaMesDghterXiMinus);
471   }
472   
473   if (!fHistThetaBarDghterXiMinus) {
474      fHistThetaBarDghterXiMinus = new TH1F("fHistThetaBarDghterXiMinus", "#theta of gen. Baryon #Lambda dghter;#theta_{BarDght};Number of Bar.", 200, -10, 190);
475      fListHistCascade->Add(fHistThetaBarDghterXiMinus);
476   }
477  
478                 // - Pt distribution (control plots)
479     
480   if (!fHistPtBachXiMinus) {
481      fHistPtBachXiMinus = new TH1F("fHistPtBachXiMinus", "p_{t} of gen. Bach.;pt_{Bach};Number of Bach.", 200, 0, 10);
482      fListHistCascade->Add(fHistPtBachXiMinus);
483   }
484   
485   if (!fHistPtMesDghterXiMinus) {
486      fHistPtMesDghterXiMinus = new TH1F("fHistPtMesDghterXiMinus", "p_{t} of gen. Meson #Lambda dghter;pt_{MesDght};Number of Mes.", 200, 0, 10);
487      fListHistCascade->Add(fHistPtMesDghterXiMinus);
488   }
489     
490   if (!fHistPtBarDghterXiMinus) {
491      fHistPtBarDghterXiMinus = new TH1F("fHistPtBarDghterXiMinus", "p_{t} of gen. Baryon #Lambda dghter;pt_{BarDght};Number of Bar.", 200, 0, 10);
492      fListHistCascade->Add(fHistPtBarDghterXiMinus);
493   }
494   
495   
496   
497   //--------
498   // II - Xi+ 
499   // - Pseudo-Rapidity distribution
500   if (!fHistEtaGenCascXiPlus) {
501      fHistEtaGenCascXiPlus = new TH1F("fHistEtaGenCascXiPlus", "#eta of any gen. #Xi^{+};#eta;Number of Casc", 200, -10, 10);
502      fListHistCascade->Add(fHistEtaGenCascXiPlus);
503   }
504   
505   // - Plots for |y(MC)| < 1    
506   if (!fHistYGenCascMidRapXiPlus) {
507           fHistYGenCascMidRapXiPlus = new TH1F("fHistYGenCascMidRapXiPlus", "Y of #Xi^{+} generated at mid rapidity;Y;Number of Casc", 240, -1.2, 1.2);
508           fListHistCascade->Add(fHistYGenCascMidRapXiPlus );
509   }
510   
511   if (!fHistEtaGenCascMidRapXiPlus) {
512           fHistEtaGenCascMidRapXiPlus = new TH1F("fHistEtaGenCascMidRapXiPlus", "#eta of #Xi^{+} generated at mid rapidity;#eta;Number of Casc", 100, -5, 5);
513           fListHistCascade->Add(fHistEtaGenCascMidRapXiPlus );
514   }
515   
516   if (!fHistThetaGenCascMidRapXiPlus) {
517           fHistThetaGenCascMidRapXiPlus = new TH1F("fHistThetaGenCascMidRapXiPlus", "#theta of #Xi^{+} generated at mid rapidity;#theta (deg);Number of Casc", 200, -10, 190);
518           fListHistCascade->Add(fHistThetaGenCascMidRapXiPlus );
519   }
520   
521   if (!fHistPtGenCascMidRapXiPlus) {
522           fHistPtGenCascMidRapXiPlus = new TH1F("fHistPtGenCascMidRapXiPlus", "P_{t} of #Xi^{+} generated at mid rapidity;P_{t} (GeV/c);Number of Casc", 200, 0., 10.);
523           fListHistCascade->Add(fHistPtGenCascMidRapXiPlus );
524   }
525   
526   
527   // - Info at the generation level of multi-strange particle
528   
529   if (!fHistThetaGenCascXiPlus) {
530      fHistThetaGenCascXiPlus = new TH1F("fHistThetaGenCascXiPlus", "#theta of gen. #Xi^{+};#theta;Number of Casc.", 200, -10, 190);
531      fListHistCascade->Add(fHistThetaGenCascXiPlus);
532   }
533  
534   if (!fHistPtFdblGenCascXiPlus) {
535           fHistPtFdblGenCascXiPlus = new TH1F("fHistPtFdblGenCascXiPlus","P_{t} of findable generated #Xi^{+};P_{t} (GeV/c);Number of Casc", 200, 0, 10);
536           fListHistCascade->Add(fHistPtFdblGenCascXiPlus );
537   }
538   
539                 // - Theta distribution the daughters (control plots)
540   
541   if (!fHistThetaLambdaXiPlus) {
542      fHistThetaLambdaXiPlus = new TH1F("fHistThetaLambdaXiPlus", "#theta of gen. #Lambda (Xi dghter);#theta_{#Lambda};Number of #Lambda", 200, -10, 190);
543      fListHistCascade->Add(fHistThetaLambdaXiPlus);
544   }
545
546   if (!fHistThetaBachXiPlus) {
547      fHistThetaBachXiPlus = new TH1F("fHistThetaBachXiPlus", "#theta of gen. Bach.;#theta_{Bach};Number of Bach.", 200, -10, 190);
548      fListHistCascade->Add(fHistThetaBachXiPlus);
549   }
550   
551   if (!fHistThetaMesDghterXiPlus) {
552      fHistThetaMesDghterXiPlus = new TH1F("fHistThetaMesDghterXiPlus", "#theta of gen. Meson #Lambda dghter;#theta_{MesDght};Number of Mes.", 200, -10, 190);
553      fListHistCascade->Add(fHistThetaMesDghterXiPlus);
554   }
555   
556   if (!fHistThetaBarDghterXiPlus) {
557      fHistThetaBarDghterXiPlus = new TH1F("fHistThetaBarDghterXiPlus", "#theta of gen. Baryon #Lambda dghter;#theta_{BarDght};Number of Bar.", 200, -10, 190);
558      fListHistCascade->Add(fHistThetaBarDghterXiPlus);
559   }
560  
561                 // - Pt distribution (control plots)
562     
563   if (!fHistPtBachXiPlus) {
564      fHistPtBachXiPlus = new TH1F("fHistPtBachXiPlus", "p_{t} of gen. Bach.;pt_{Bach};Number of Bach.", 200, 0, 10);
565      fListHistCascade->Add(fHistPtBachXiPlus);
566   }
567   
568   if (!fHistPtMesDghterXiPlus) {
569      fHistPtMesDghterXiPlus = new TH1F("fHistPtMesDghterXiPlus", "p_{t} of gen. Meson #Lambda dghter);pt_{MesDght};Number of Mes.", 200, 0, 10);
570      fListHistCascade->Add(fHistPtMesDghterXiPlus);
571   }
572     
573   if (!fHistPtBarDghterXiPlus) {
574      fHistPtBarDghterXiPlus = new TH1F("fHistPtBarDghterXiPlus", "p_{t} of gen. Baryon #Lambda dghter);pt_{BarDght};Number of Bar.", 200, 0, 10);
575      fListHistCascade->Add(fHistPtBarDghterXiPlus);
576   }
577   
578   
579   //---------
580   // III - Omega- 
581   // - Pseudo-Rapidity distribution
582   if (!fHistEtaGenCascOmegaMinus) {
583      fHistEtaGenCascOmegaMinus = new TH1F("fHistEtaGenCascOmegaMinus", "#eta of any gen. #Omega^{-};#eta;Number of Casc", 200, -10, 10);
584      fListHistCascade->Add(fHistEtaGenCascOmegaMinus);
585   }
586   
587   // - Plots for |y(MC)| < 1    
588   if (!fHistYGenCascMidRapOmegaMinus) {
589           fHistYGenCascMidRapOmegaMinus = new TH1F("fHistYGenCascMidRapOmegaMinus", "Y of #Omega^{-} generated at mid rapidity;Y;Number of Casc", 240, -1.2, 1.2);
590           fListHistCascade->Add(fHistYGenCascMidRapOmegaMinus );
591   }
592   
593   if (!fHistEtaGenCascMidRapOmegaMinus) {
594           fHistEtaGenCascMidRapOmegaMinus = new TH1F("fHistEtaGenCascMidRapOmegaMinus", "#eta of #Omega^{-} generated at mid rapidity;#eta;Number of Casc", 100, -5, 5);
595           fListHistCascade->Add(fHistEtaGenCascMidRapOmegaMinus );
596   }
597   
598   if (!fHistThetaGenCascMidRapOmegaMinus) {
599           fHistThetaGenCascMidRapOmegaMinus = new TH1F("fHistThetaGenCascMidRapOmegaMinus", "#theta of #Omega^{-} generated at mid rapidity;#theta (deg);Number of Casc", 200, -10, 190);
600           fListHistCascade->Add(fHistThetaGenCascMidRapOmegaMinus );
601   }
602   
603   if (!fHistPtGenCascMidRapOmegaMinus) {
604           fHistPtGenCascMidRapOmegaMinus = new TH1F("fHistPtGenCascMidRapOmegaMinus", "P_{t} of #Omega^{-} generated at mid rapidity;P_{t} (GeV/c);Number of Casc", 200, 0., 10.);
605           fListHistCascade->Add(fHistPtGenCascMidRapOmegaMinus );
606   }
607   
608   
609   
610   // - Info at the generation level of multi-strange particle
611   
612   if (!fHistThetaGenCascOmegaMinus) {
613      fHistThetaGenCascOmegaMinus = new TH1F("fHistThetaGenCascOmegaMinus", "#theta of gen. #Omega^{-};#theta;Number of Casc.", 200, -10, 190);
614      fListHistCascade->Add(fHistThetaGenCascOmegaMinus);
615   }
616  
617   if (!fHistPtFdblGenCascOmegaMinus) {
618           fHistPtFdblGenCascOmegaMinus = new TH1F("fHistPtFdblGenCascOmegaMinus","P_{t} of findable generated #Omega^{-};P_{t} (GeV/c);Number of Casc", 200, 0, 10);
619           fListHistCascade->Add(fHistPtFdblGenCascOmegaMinus );
620   }
621   
622                 // - Theta distribution the daughters (control plots)
623   
624   if (!fHistThetaLambdaOmegaMinus) {
625      fHistThetaLambdaOmegaMinus = new TH1F("fHistThetaLambdaOmegaMinus", "#theta of gen. #Lambda (Omega dghter);#theta_{#Lambda};Number of #Lambda", 200, -10, 190);
626      fListHistCascade->Add(fHistThetaLambdaOmegaMinus);
627   }
628
629   if (!fHistThetaBachOmegaMinus) {
630      fHistThetaBachOmegaMinus = new TH1F("fHistThetaBachOmegaMinus", "#theta of gen. Bach.;#theta_{Bach};Number of Bach.", 200, -10, 190);
631      fListHistCascade->Add(fHistThetaBachOmegaMinus);
632   }
633   
634   if (!fHistThetaMesDghterOmegaMinus) {
635      fHistThetaMesDghterOmegaMinus = new TH1F("fHistThetaMesDghterOmegaMinus", "#theta of gen. Meson #Lambda dghter;#theta_{MesDght};Number of Mes.", 200, -10, 190);
636      fListHistCascade->Add(fHistThetaMesDghterOmegaMinus);
637   }
638   
639   if (!fHistThetaBarDghterOmegaMinus) {
640      fHistThetaBarDghterOmegaMinus = new TH1F("fHistThetaBarDghterOmegaMinus", "#theta of gen. Baryon #Lambda dghter;#theta_{BarDght};Number of Bar.", 200, -10, 190);
641      fListHistCascade->Add(fHistThetaBarDghterOmegaMinus);
642   }
643  
644                 // - Pt distribution (control plots)
645     
646   if (!fHistPtBachOmegaMinus) {
647      fHistPtBachOmegaMinus = new TH1F("fHistPtBachOmegaMinus", "p_{t} of gen. Bach.;pt_{Bach};Number of Bach.", 200, 0, 10);
648      fListHistCascade->Add(fHistPtBachOmegaMinus);
649   }
650   
651   if (!fHistPtMesDghterOmegaMinus) {
652      fHistPtMesDghterOmegaMinus = new TH1F("fHistPtMesDghterOmegaMinus", "p_{t} of gen. Meson #Lambda dghter);pt_{MesDght};Number of Mes.", 200, 0, 10);
653      fListHistCascade->Add(fHistPtMesDghterOmegaMinus);
654   }
655     
656   if (!fHistPtBarDghterOmegaMinus) {
657      fHistPtBarDghterOmegaMinus = new TH1F("fHistPtBarDghterOmegaMinus", "p_{t} of gen. Baryon #Lambda dghter);pt_{BarDght};Number of Bar.", 200, 0, 10);
658      fListHistCascade->Add(fHistPtBarDghterOmegaMinus);
659   }
660   
661   
662   //---------
663   // IV - Omega+ 
664   // - Pseudo-Rapidity distribution
665   if (!fHistEtaGenCascOmegaPlus) {
666      fHistEtaGenCascOmegaPlus = new TH1F("fHistEtaGenCascOmegaPlus", "#eta of any gen. #Omega^{+};#eta;Number of Casc", 200, -10, 10);
667      fListHistCascade->Add(fHistEtaGenCascOmegaPlus);
668   }
669   
670   // - Plots for |y(MC)| < 1    
671   if (!fHistYGenCascMidRapOmegaPlus) {
672           fHistYGenCascMidRapOmegaPlus = new TH1F("fHistYGenCascMidRapOmegaPlus", "Y of #Omega^{+} generated at mid rapidity;Y;Number of Casc", 240, -1.2, 1.2);
673           fListHistCascade->Add(fHistYGenCascMidRapOmegaPlus );
674   }
675   
676   if (!fHistEtaGenCascMidRapOmegaPlus) {
677           fHistEtaGenCascMidRapOmegaPlus = new TH1F("fHistEtaGenCascMidRapOmegaPlus", "#eta of #Omega^{+} generated at mid rapidity;#eta;Number of Casc", 100, -5, 5);
678           fListHistCascade->Add(fHistEtaGenCascMidRapOmegaPlus );
679   }
680   
681   if (!fHistThetaGenCascMidRapOmegaPlus) {
682           fHistThetaGenCascMidRapOmegaPlus = new TH1F("fHistThetaGenCascMidRapOmegaPlus", "#theta of #Omega^{+} generated at mid rapidity;#theta (deg);Number of Casc", 200, -10, 190);
683           fListHistCascade->Add(fHistThetaGenCascMidRapOmegaPlus );
684   }
685   
686   if (!fHistPtGenCascMidRapOmegaPlus) {
687           fHistPtGenCascMidRapOmegaPlus = new TH1F("fHistPtGenCascMidRapOmegaPlus", "P_{t} of #Omega^{+} generated at mid rapidity;P_{t} (GeV/c);Number of Casc", 200, 0., 10.);
688           fListHistCascade->Add(fHistPtGenCascMidRapOmegaPlus );
689   }
690   
691   
692   
693   // - Info at the generation level of multi-strange particle
694   
695   if (!fHistThetaGenCascOmegaPlus) {
696      fHistThetaGenCascOmegaPlus = new TH1F("fHistThetaGenCascOmegaPlus", "#theta of gen. #Omega^{+};#theta;Number of Casc.", 200, -10, 190);
697      fListHistCascade->Add(fHistThetaGenCascOmegaPlus);
698   }
699  
700   if (!fHistPtFdblGenCascOmegaPlus) {
701           fHistPtFdblGenCascOmegaPlus = new TH1F("fHistPtFdblGenCascOmegaPlus","P_{t} of findable generated #Omega^{+};P_{t} (GeV/c);Number of Casc", 200, 0, 10);
702           fListHistCascade->Add(fHistPtFdblGenCascOmegaPlus );
703   }
704   
705                 // - Theta distribution the daughters (control plots)
706   
707   if (!fHistThetaLambdaOmegaPlus) {
708      fHistThetaLambdaOmegaPlus = new TH1F("fHistThetaLambdaOmegaPlus", "#theta of gen. #Lambda (Omega dghter);#theta_{#Lambda};Number of #Lambda", 200, -10, 190);
709      fListHistCascade->Add(fHistThetaLambdaOmegaPlus);
710   }
711
712   if (!fHistThetaBachOmegaPlus) {
713      fHistThetaBachOmegaPlus = new TH1F("fHistThetaBachOmegaPlus", "#theta of gen. Bach.;#theta_{Bach};Number of Bach.", 200, -10, 190);
714      fListHistCascade->Add(fHistThetaBachOmegaPlus);
715   }
716   
717   if (!fHistThetaMesDghterOmegaPlus) {
718      fHistThetaMesDghterOmegaPlus = new TH1F("fHistThetaMesDghterOmegaPlus", "#theta of gen. Meson #Lambda dghter;#theta_{MesDght};Number of Mes.", 200, -10, 190);
719      fListHistCascade->Add(fHistThetaMesDghterOmegaPlus);
720   }
721   
722   if (!fHistThetaBarDghterOmegaPlus) {
723      fHistThetaBarDghterOmegaPlus = new TH1F("fHistThetaBarDghterOmegaPlus", "#theta of gen. Baryon #Lambda dghter;#theta_{BarDght};Number of Bar.", 200, -10, 190);
724      fListHistCascade->Add(fHistThetaBarDghterOmegaPlus);
725   }
726  
727                 // - Pt distribution (control plots)
728     
729   if (!fHistPtBachOmegaPlus) {
730      fHistPtBachOmegaPlus = new TH1F("fHistPtBachOmegaPlus", "p_{t} of gen. Bach.;pt_{Bach};Number of Bach.", 200, 0, 10);
731      fListHistCascade->Add(fHistPtBachOmegaPlus);
732   }
733   
734   if (!fHistPtMesDghterOmegaPlus) {
735      fHistPtMesDghterOmegaPlus = new TH1F("fHistPtMesDghterOmegaPlus", "p_{t} of gen. Meson #Lambda dghter);pt_{MesDght};Number of Mes.", 200, 0, 10);
736      fListHistCascade->Add(fHistPtMesDghterOmegaPlus);
737   }
738     
739   if (!fHistPtBarDghterOmegaPlus) {
740      fHistPtBarDghterOmegaPlus = new TH1F("fHistPtBarDghterOmegaPlus", "p_{t} of gen. Baryon #Lambda dghter);pt_{BarDght};Number of Bar.", 200, 0, 10);
741      fListHistCascade->Add(fHistPtBarDghterOmegaPlus);
742   }
743     
744   
745   
746 // Part 2 - Any reconstructed cascades + reconstructed cascades associated with MC
747   
748                 // - Effective mass histos for cascades candidates.
749   
750   if (! fHistMassXiMinus) {
751           fHistMassXiMinus = new TH1F("fHistMassXiMinus","#Xi^{-} candidates;M( #Lambda , #pi^{-} ) (GeV/c^{2});Counts", 200,1.2,2.0);
752           fListHistCascade->Add(fHistMassXiMinus);
753   }
754   
755   if (! fHistMassXiPlus) {
756           fHistMassXiPlus = new TH1F("fHistMassXiPlus","#Xi^{+} candidates;M( #bar{#Lambda}^{0} , #pi^{+} ) (GeV/c^{2});Counts",200,1.2,2.0);
757           fListHistCascade->Add(fHistMassXiPlus);
758   }
759
760   if (! fHistMassOmegaMinus) {
761           fHistMassOmegaMinus = new TH1F("fHistMassOmegaMinus","#Omega^{-} candidates;M( #Lambda , K^{-} ) (GeV/c^{2});Counts", 250,1.5,2.5);
762           fListHistCascade->Add(fHistMassOmegaMinus);
763   }
764  
765   if (! fHistMassOmegaPlus) {
766           fHistMassOmegaPlus = new TH1F("fHistMassOmegaPlus","#Omega^{+} candidates;M( #bar{#Lambda}^{0} , K^{+} ) (GeV/c^{2});Counts", 250,1.5,2.5);
767           fListHistCascade->Add(fHistMassOmegaPlus);
768   }
769   
770                 // - Effective mass histos for cascades candidates ASSOCIATED with MC.
771   
772   if (! fHistAsMCMassXiMinus) {
773           fHistAsMCMassXiMinus = new TH1F("fHistAsMCMassXiMinus","#Xi^{-} candidates associated to MC;M( #Lambda , #pi^{-} ) (GeV/c^{2});Counts", 200,1.2,2.0);
774           fListHistCascade->Add(fHistAsMCMassXiMinus);
775   }
776   
777   if (! fHistAsMCMassXiPlus) {
778           fHistAsMCMassXiPlus = new TH1F("fHistAsMCMassXiPlus","#Xi^{+} candidates associated to MC;M( #bar{#Lambda}^{0} , #pi^{+} ) (GeV/c^{2});Counts",200,1.2,2.0);
779           fListHistCascade->Add(fHistAsMCMassXiPlus);
780   }
781
782   if (! fHistAsMCMassOmegaMinus) {
783           fHistAsMCMassOmegaMinus = new TH1F("fHistAsMCMassOmegaMinus","#Omega^{-} candidates associated to MC;M( #Lambda , K^{-} ) (GeV/c^{2});Counts", 250,1.5,2.5);
784           fListHistCascade->Add(fHistAsMCMassOmegaMinus);
785   }
786  
787   if (! fHistAsMCMassOmegaPlus) {
788           fHistAsMCMassOmegaPlus = new TH1F("fHistAsMCMassOmegaPlus","#Omega^{+} candidates associated to MC;M( #bar{#Lambda}^{0} , K^{+} ) (GeV/c^{2});Counts", 250,1.5,2.5);
789           fListHistCascade->Add(fHistAsMCMassOmegaPlus);
790   }
791   
792   
793                 // - Generated Pt of the the cascade candidates associated with MC
794   
795   if (!fHistAsMCGenPtXiMinus) {
796           fHistAsMCGenPtXiMinus = new TH1F("fHistAsMCGenPtXiMinus", "P_{t} of gen. #Xi^{-} (associated);P_{t} (GeV/c);Number of Casc", 200, 0., 10.);
797           fListHistCascade->Add(fHistAsMCGenPtXiMinus );
798   }
799   
800   if (!fHistAsMCGenPtXiPlus) {
801           fHistAsMCGenPtXiPlus = new TH1F("fHistAsMCGenPtXiPlus", "P_{t} of gen. #Xi^{+} (associated);P_{t} (GeV/c);Number of Casc", 200, 0., 10.);
802           fListHistCascade->Add(fHistAsMCGenPtXiPlus );
803   }
804   
805   if (!fHistAsMCGenPtOmegaMinus) {
806           fHistAsMCGenPtOmegaMinus = new TH1F("fHistAsMCGenPtOmegaMinus", "P_{t} of gen. #Omega^{-} (associated);P_{t} (GeV/c);Number of Casc", 200, 0., 10.);
807           fListHistCascade->Add(fHistAsMCGenPtOmegaMinus );
808   }
809   
810   if (!fHistAsMCGenPtOmegaPlus) {
811           fHistAsMCGenPtOmegaPlus = new TH1F("fHistAsMCGenPtOmegaPlus", "P_{t} of gen. #Omega^{+} (associated);P_{t} (GeV/c);Number of Casc", 200, 0., 10.);
812           fListHistCascade->Add(fHistAsMCGenPtOmegaPlus );
813   }
814   
815   
816                 // - Generated Y of the the cascade candidates associated with MC
817   
818   if (!fHistAsMCGenYXiMinus) {
819           fHistAsMCGenYXiMinus = new TH1F("fHistAsMCGenYXiMinus", "Rapidity, Y of gen. #Xi^{-} (associated);Rapidity, Y;Number of Casc", 240, -1.2, 1.2);
820           fListHistCascade->Add(fHistAsMCGenYXiMinus );
821   }
822   
823   if (!fHistAsMCGenYXiPlus) {
824           fHistAsMCGenYXiPlus = new TH1F("fHistAsMCGenYXiPlus", "Rapidity, Y of gen. #Xi^{+} (associated);Rapidity, Y;Number of Casc", 240, -1.2, 1.2);
825           fListHistCascade->Add(fHistAsMCGenYXiPlus );
826   }
827   
828   if (!fHistAsMCGenYOmegaMinus) {
829           fHistAsMCGenYOmegaMinus = new TH1F("fHistAsMCGenYOmegaMinus", "Rapidity, Y of gen. #Omega^{-} (associated);Rapidity, Y;Number of Casc", 240, -1.2, 1.2);
830           fListHistCascade->Add(fHistAsMCGenYOmegaMinus );
831   }
832   
833   if (!fHistAsMCGenYOmegaPlus) {
834           fHistAsMCGenYOmegaPlus = new TH1F("fHistAsMCGenYOmegaPlus", "Rapidity, Y of gen. #Omega^{+} (associated);Rapidity, Y;Number of Casc", 240, -1.2, 1.2);
835           fListHistCascade->Add(fHistAsMCGenYOmegaPlus );
836   }
837   
838                 // - Generated Y Vs Generated Pt, for the cascade candidates associated with MC
839   
840   if (!f2dHistAsMCGenYVsGenPtXiMinus) {
841         f2dHistAsMCGenYVsGenPtXiMinus = new TH2F("f2dHistAsMCGenYVsGenPtXiMinus", "Y Vs P_{t} of gen. #Xi^{-} (associated);Rapidity, Y;P_{t} (GeV/c)",240, -1.2, 1.2, 200, 0., 10.);
842           fListHistCascade->Add(f2dHistAsMCGenYVsGenPtXiMinus );
843   }
844   
845   if (!f2dHistAsMCGenYVsGenPtXiPlus) {
846           f2dHistAsMCGenYVsGenPtXiPlus = new TH2F("f2dHistAsMCGenYVsGenPtXiPlus", "Y Vs P_{t} of gen. #Xi^{+} (associated);Rapidity, Y;P_{t} (GeV/c)",240, -1.2, 1.2, 200, 0., 10.);
847           fListHistCascade->Add(f2dHistAsMCGenYVsGenPtXiPlus );
848   }
849   
850   if (!f2dHistAsMCGenYVsGenPtOmegaMinus) {
851           f2dHistAsMCGenYVsGenPtOmegaMinus = new TH2F("f2dHistAsMCGenYVsGenPtOmegaMinus", "Y Vs P_{t} of gen. #Omega^{-} (associated);Rapidity, Y;P_{t} (GeV/c)",240, -1.2, 1.2, 200, 0., 10.);
852           fListHistCascade->Add(f2dHistAsMCGenYVsGenPtOmegaMinus );
853   }
854   
855   if (!f2dHistAsMCGenYVsGenPtOmegaPlus) {
856           f2dHistAsMCGenYVsGenPtOmegaPlus = new TH2F("f2dHistAsMCGenYVsGenPtOmegaPlus", "Y Vs P_{t} of gen. #Omega^{+} (associated);Rapidity, Y;P_{t} (GeV/c)",240, -1.2, 1.2, 200, 0., 10.);
857           fListHistCascade->Add(f2dHistAsMCGenYVsGenPtOmegaPlus );
858   } 
859   
860   
861                 // - Generated Eta of the the cascade candidates associated with MC
862   if (!fHistAsMCGenEtaXiMinus) {
863           fHistAsMCGenEtaXiMinus = new TH1F("fHistAsMCGenEtaXiMinus", "#eta of gen. #Xi^{-} (associated);#eta;Number of Casc", 100, -5, 5);
864           fListHistCascade->Add( fHistAsMCGenEtaXiMinus );
865   }
866   
867   if (!fHistAsMCGenEtaXiPlus) {
868           fHistAsMCGenEtaXiPlus = new TH1F("fHistAsMCGenEtaXiPlus", "#eta of gen. #Xi^{+} (associated);#eta;Number of Casc", 100, -5, 5);
869           fListHistCascade->Add( fHistAsMCGenEtaXiPlus );
870   }
871   
872   if (!fHistAsMCGenEtaOmegaMinus) {
873           fHistAsMCGenEtaOmegaMinus = new TH1F("fHistAsMCGenEtaOmegaMinus", "#eta of gen. #Omega^{-} (associated);#eta;Number of Casc", 100, -5, 5);
874           fListHistCascade->Add( fHistAsMCGenEtaOmegaMinus );
875   }
876   
877   if (!fHistAsMCGenEtaOmegaPlus) {
878           fHistAsMCGenEtaOmegaPlus = new TH1F("fHistAsMCGenEtaOmegaPlus", "#eta of gen. #Omega^{+} (associated);#eta;Number of Casc", 100, -5, 5);
879           fListHistCascade->Add( fHistAsMCGenEtaOmegaPlus );
880   }
881   
882   
883   
884                 // - Resolution in Pt as function of generated Pt
885   
886   if(! f2dHistAsMCResPtXiMinus) {
887           f2dHistAsMCResPtXiMinus = new TH2F( "f2dHistAsMCResPtXiMinus", "Resolution in Pt reconstruction for #Xi^{-}; Pt_{MC} (GeV/c); (Pt_{reco} - Pt_{MC}) / Pt_{MC} (%)", 200, 0., 10., 200, -0.1, 0.1);
888           fListHistCascade->Add(f2dHistAsMCResPtXiMinus);
889   }
890   
891   if(! f2dHistAsMCResPtXiPlus) {
892           f2dHistAsMCResPtXiPlus = new TH2F( "f2dHistAsMCResPtXiPlus", "Resolution in Pt reconstruction for #Xi^{+}; Pt_{MC} (GeV/c); (Pt_{reco} - Pt_{MC}) / Pt_{MC} (%)", 200, 0., 10., 200, -0.1, 0.1);
893           fListHistCascade->Add(f2dHistAsMCResPtXiPlus);
894   }
895   
896   if(! f2dHistAsMCResPtOmegaMinus) {
897           f2dHistAsMCResPtOmegaMinus = new TH2F( "f2dHistAsMCResPtOmegaMinus", "Resolution in Pt reconstruction for #Omega^{-}; Pt_{MC} (GeV/c); (Pt_{reco} - Pt_{MC}) / Pt_{MC} (%)", 200, 0., 10., 200, -0.1, 0.1);
898           fListHistCascade->Add(f2dHistAsMCResPtOmegaMinus);
899   }
900   
901   if(! f2dHistAsMCResPtOmegaPlus) {
902           f2dHistAsMCResPtOmegaPlus = new TH2F( "f2dHistAsMCResPtOmegaPlus", "Resolution in Pt reconstruction for #Omega^{+}; Pt_{MC} (GeV/c); (Pt_{reco} - Pt_{MC}) / Pt_{MC} (%)", 200, 0., 10., 200, -0.1, 0.1);
903           fListHistCascade->Add(f2dHistAsMCResPtOmegaPlus);
904   }
905   
906                 // - Resolution in R(2D) as function of generated R
907   
908   if(! f2dHistAsMCResRXiMinus) {
909           f2dHistAsMCResRXiMinus = new TH2F( "f2dHistAsMCResRXiMinus", "Resolution in transv. position for #Xi^{-}; R_{MC} (cm); (R_{reco} - R_{MC}) / R_{MC} (%)", 450, 0., 45.0, 240, -0.3, 0.3);
910           fListHistCascade->Add(f2dHistAsMCResRXiMinus);
911   }
912   
913   if(! f2dHistAsMCResRXiPlus) {
914           f2dHistAsMCResRXiPlus = new TH2F( "f2dHistAsMCResRXiPlus", "Resolution in transv. position for #Xi^{+}; R_{MC} (cm); (R_{reco} - R_{MC}) / R_{MC} (%)", 450, 0., 45.0, 240, -0.3, 0.3);
915           fListHistCascade->Add(f2dHistAsMCResRXiPlus);
916   }
917   
918   if(! f2dHistAsMCResROmegaMinus) {
919           f2dHistAsMCResROmegaMinus = new TH2F( "f2dHistAsMCResROmegaMinus", "Resolution in transv. position for #Omega^{-}; R_{MC} (cm); (R_{reco} - R_{MC}) / R_{MC} (%)", 450, 0., 45.0, 240, -0.3, 0.3);
920           fListHistCascade->Add(f2dHistAsMCResROmegaMinus);
921   }
922   
923   if(! f2dHistAsMCResROmegaPlus) {
924           f2dHistAsMCResROmegaPlus = new TH2F( "f2dHistAsMCResROmegaPlus", "Resolution in transv. position for #Omega^{+}; R_{MC} (cm); (R_{reco} - R_{MC}) / R_{MC} (%)", 450, 0., 45.0, 240, -0.3, 0.3);
925           fListHistCascade->Add(f2dHistAsMCResROmegaPlus);
926   }
927   
928   
929 }// end CreateOutputObjects
930
931
932
933
934
935
936 //________________________________________________________________________
937 void AliAnalysisTaskCheckPerformanceCascade::UserExec(Option_t *) 
938 {
939         
940   // Main loop
941   // Called for each event
942         
943         AliESDEvent *lESDevent = 0x0;
944         AliAODEvent *lAODevent = 0x0;
945         AliMCEvent  *lMCevent  = 0x0; 
946         AliStack    *lMCstack  = 0x0; 
947         Int_t ncascades = -1;
948         
949         
950   // Connect to the InputEvent  
951   // After these lines, we should have an ESD/AOD event + the number of cascades in it.
952                 
953         if(fAnalysisType == "ESD"){
954                 lESDevent = dynamic_cast<AliESDEvent*>( InputEvent() );
955                 if (!lESDevent) {
956                         Printf("ERROR: lESDevent not available \n");
957                         cout << "Name of the file with pb :" <<  fInputHandler->GetTree()->GetCurrentFile()->GetName() << endl;
958                         return;
959                 }
960                 ncascades = lESDevent->GetNumberOfCascades();
961         }
962   
963         else if(fAnalysisType == "AOD"){  
964                 lAODevent = dynamic_cast<AliAODEvent*>( InputEvent() ); 
965                 if (!lAODevent) {
966                         Printf("ERROR: lAODevent not available \n");
967                         cout << "Name of the file with pb :" <<  fInputHandler->GetTree()->GetCurrentFile()->GetName() << endl;
968                         return;
969                 }
970                 ncascades = lAODevent->GetNumberOfCascades();
971         }
972         
973
974         lMCevent = MCEvent();
975         if (!lMCevent) {
976                 Printf("ERROR: Could not retrieve MC event \n");
977                 cout << "Name of the file with pb :" <<  fInputHandler->GetTree()->GetCurrentFile()->GetName() << endl; 
978                 return;
979         }
980
981         lMCstack = lMCevent->Stack();
982         if (!lMCstack) {
983                 Printf("ERROR: Could not retrieve MC stack \n");
984                 cout << "Name of the file with pb :" <<  fInputHandler->GetTree()->GetCurrentFile()->GetName() << endl;
985                 return;
986                 
987         }
988         
989
990   //    cout << "Name of the accessed file :" <<  fInputHandler->GetTree()->GetCurrentFile()->GetName() << endl;
991
992   //    cout << "Tree characteristics ..." << endl;
993   //    fInputHandler->GetTree()->Print("toponly");
994   //    fInputHandler->GetTree()->GetBranch("PrimaryVertex")->Print();
995   //    fInputHandler->GetTree()->GetBranch("SPDVertex")->Print();
996
997  
998  
999  
1000  
1001
1002  
1003   // ---------------------------------------------------------------
1004   // - Initialisation of the part dedicated to cascade vertices
1005   
1006   Int_t iNumberOfPrimaries = -1;
1007   iNumberOfPrimaries = lMCstack->GetNprimary();
1008   
1009         if(iNumberOfPrimaries < 1) return;
1010     
1011        fHistMCTrackMultiplicity->Fill( lMCstack->GetNtrack() );
1012    
1013    // For proton
1014    /*
1015    for (Int_t iCurrentLabelStack = 0; iCurrentLabelStack < iNumberOfPrimaries; iCurrentLabelStack++) 
1016         {// This is the begining of the loop on primaries, for protons
1017           
1018         TParticle* lCurrentParticle = lMCstack->Particle( iCurrentLabelStack );
1019         if(!lCurrentParticle){
1020                 Printf("Proton loop %d - MC TParticle pointer to current stack particle = 0x0 ! Skip ...\n", iCurrentLabelStack );
1021                 continue;
1022                 
1023         }
1024         
1025         if( lCurrentParticle->GetPdgCode() == 2212 )
1026                 fHistEtaGenProton->Fill( lCurrentParticle->Eta() );
1027
1028         if( lCurrentParticle->GetPdgCode() == -2212 )
1029                 fHistEtaGenAntiProton->Fill( lCurrentParticle->Eta() );
1030         }// end loop over primary proton
1031    */
1032
1033       
1034        
1035 //__________________________________________________________________________    
1036 // Part 1 - Loop over the different types of generated cascades (Xi-+, Omega-+) 
1037
1038         // - Initialisation of useful local variables
1039                 
1040         Int_t lPdgCodeCasc            = 0;
1041         Int_t lPdgCodeBach            = 0;
1042         Int_t lPdgCodeLambda          = 0;
1043         Int_t lPdgCodeDghtMesV0       = 0;
1044         Int_t lPdgCodeDghtBarV0       = 0;
1045         
1046         TH1F *lHistEtaGenCasc         = 0;
1047         
1048         TH1F *lHistYGenCascMidRap     = 0;
1049         TH1F *lHistEtaGenCascMidRap   = 0;
1050         TH1F *lHistThetaGenCascMidRap = 0;
1051         TH1F *lHistPtGenCascMidRap    = 0;
1052         
1053         TH1F *lHistThetaGenCasc       = 0;
1054         TH1F *lHistPtFdblGenCasc      = 0;
1055         TH1F *lHistThetaLambda        = 0;
1056         TH1F *lHistThetaBach          = 0;
1057         TH1F *lHistThetaBarDghter     = 0;
1058         TH1F *lHistThetaMesDghter     = 0;
1059         TH1F *lHistPtBach             = 0;
1060         TH1F *lHistPtBarDghter        = 0;
1061         TH1F *lHistPtMesDghter        = 0;
1062
1063
1064 for(Int_t CascType = 1; CascType < 5; CascType++)
1065 {
1066        
1067 switch (CascType)
1068   {
1069     case 1: // Xi-
1070          lPdgCodeCasc       =   3312;  //Xi-
1071          lPdgCodeBach       =   -211;  //Pi-
1072          lPdgCodeLambda     =   3122;  //Lambda0
1073          lPdgCodeDghtMesV0  =   -211;  //Pi-
1074          lPdgCodeDghtBarV0  =   2212;  //Proton 
1075                 
1076                 // any Xi-
1077          lHistEtaGenCasc     = (TH1F*)fHistEtaGenCascXiMinus;
1078          
1079                 // cascades within |y| < 1
1080          lHistYGenCascMidRap            = fHistYGenCascMidRapXiMinus;           
1081          lHistEtaGenCascMidRap          = fHistEtaGenCascMidRapXiMinus;
1082          lHistThetaGenCascMidRap        = fHistThetaGenCascMidRapXiMinus;       
1083          lHistPtGenCascMidRap           = fHistPtGenCascMidRapXiMinus;          
1084                 
1085                 // cascades generated within acceptance (cut in pt + theta)
1086          lHistThetaGenCasc   = fHistThetaGenCascXiMinus;
1087          lHistPtFdblGenCasc  = fHistPtFdblGenCascXiMinus;
1088          lHistThetaLambda    = fHistThetaLambdaXiMinus;
1089          lHistThetaBach      = fHistThetaBachXiMinus;
1090          lHistThetaBarDghter = fHistThetaBarDghterXiMinus;
1091          lHistThetaMesDghter = fHistThetaMesDghterXiMinus;
1092          lHistPtBach         = fHistPtBachXiMinus;
1093          lHistPtBarDghter    = fHistPtBarDghterXiMinus;
1094          lHistPtMesDghter    = fHistPtMesDghterXiMinus;
1095         break; 
1096            
1097     case 2: // Xi+
1098          lPdgCodeCasc        =  -3312;  //Xi+
1099          lPdgCodeBach        =    211;  //Pi+
1100          lPdgCodeLambda      =  -3122;  //AntiLambda0
1101          lPdgCodeDghtMesV0   =    211;  //Pi+
1102          lPdgCodeDghtBarV0   =  -2212;  //AntiProton  
1103          
1104                 // any Xi+
1105          lHistEtaGenCasc                = fHistEtaGenCascXiPlus;
1106          
1107                 // cascades within |y| < 1
1108          lHistYGenCascMidRap            = fHistYGenCascMidRapXiPlus;            
1109          lHistEtaGenCascMidRap          = fHistEtaGenCascMidRapXiPlus;
1110          lHistThetaGenCascMidRap        = fHistThetaGenCascMidRapXiPlus;        
1111          lHistPtGenCascMidRap           = fHistPtGenCascMidRapXiPlus;           
1112                 
1113                 // cascades generated within acceptance (cut in pt + theta)      
1114          lHistThetaGenCasc   = fHistThetaGenCascXiPlus;
1115          lHistPtFdblGenCasc  = fHistPtFdblGenCascXiPlus;
1116          lHistThetaLambda    = fHistThetaLambdaXiPlus;
1117          lHistThetaBach      = fHistThetaBachXiPlus;
1118          lHistThetaBarDghter = fHistThetaBarDghterXiPlus;
1119          lHistThetaMesDghter = fHistThetaMesDghterXiPlus;
1120          lHistPtBach         = fHistPtBachXiPlus;
1121          lHistPtBarDghter    = fHistPtBarDghterXiPlus;
1122          lHistPtMesDghter    = fHistPtMesDghterXiPlus;  
1123         break;
1124    
1125     case 3: // Omega-
1126          lPdgCodeCasc       =   3334;  //Omega-
1127          lPdgCodeBach       =   -321;  //K-
1128          lPdgCodeLambda     =   3122;  //Lambda0
1129          lPdgCodeDghtMesV0  =   -211;  //Pi-
1130          lPdgCodeDghtBarV0  =   2212;  //Proton 
1131          
1132                 // any Omega-
1133          lHistEtaGenCasc     = fHistEtaGenCascOmegaMinus;
1134                 
1135                 // cascades within |y| < 1
1136          lHistYGenCascMidRap            = fHistYGenCascMidRapOmegaMinus;                
1137          lHistEtaGenCascMidRap          = fHistEtaGenCascMidRapOmegaMinus;
1138          lHistThetaGenCascMidRap        = fHistThetaGenCascMidRapOmegaMinus;    
1139          lHistPtGenCascMidRap           = fHistPtGenCascMidRapOmegaMinus;               
1140                 
1141                 // cascades generated within acceptance (cut in pt + theta)
1142          lHistThetaGenCasc   = fHistThetaGenCascOmegaMinus;
1143          lHistPtFdblGenCasc  = fHistPtFdblGenCascOmegaMinus;
1144          lHistThetaLambda    = fHistThetaLambdaOmegaMinus;
1145          lHistThetaBach      = fHistThetaBachOmegaMinus;
1146          lHistThetaBarDghter = fHistThetaBarDghterOmegaMinus;
1147          lHistThetaMesDghter = fHistThetaMesDghterOmegaMinus;
1148          lHistPtBach         = fHistPtBachOmegaMinus;
1149          lHistPtBarDghter    = fHistPtBarDghterOmegaMinus;
1150          lHistPtMesDghter    = fHistPtMesDghterOmegaMinus;   
1151         break;
1152     
1153     case 4:  // Omega+
1154          lPdgCodeCasc       =  -3334;  //Omega+
1155          lPdgCodeBach       =    321;  //K+
1156          lPdgCodeLambda     =  -3122;  //AntiLambda0
1157          lPdgCodeDghtMesV0  =    211;  //Pi+
1158          lPdgCodeDghtBarV0  =  -2212;  //AntiProton 
1159          
1160                 // any Omega+
1161          lHistEtaGenCasc     = fHistEtaGenCascOmegaPlus;
1162          
1163                 // cascades within |y| < 1
1164          lHistYGenCascMidRap            = fHistYGenCascMidRapOmegaPlus;         
1165          lHistEtaGenCascMidRap          = fHistEtaGenCascMidRapOmegaPlus;
1166          lHistThetaGenCascMidRap        = fHistThetaGenCascMidRapOmegaPlus;     
1167          lHistPtGenCascMidRap           = fHistPtGenCascMidRapOmegaPlus;                
1168                 
1169                 // cascades generated within acceptance (cut in pt + theta)
1170          lHistThetaGenCasc   = fHistThetaGenCascOmegaPlus;
1171          lHistPtFdblGenCasc  = fHistPtFdblGenCascOmegaPlus;
1172          lHistThetaLambda    = fHistThetaLambdaOmegaPlus;
1173          lHistThetaBach      = fHistThetaBachOmegaPlus;
1174          lHistThetaBarDghter = fHistThetaBarDghterOmegaPlus;
1175          lHistThetaMesDghter = fHistThetaMesDghterOmegaPlus;
1176          lHistPtBach         = fHistPtBachOmegaPlus;
1177          lHistPtBarDghter    = fHistPtBarDghterOmegaPlus;
1178          lHistPtMesDghter    = fHistPtMesDghterOmegaPlus;  
1179         break;
1180
1181   }// end switch cascade
1182     
1183   
1184    for (Int_t iCurrentLabelStack = 0; iCurrentLabelStack < iNumberOfPrimaries; iCurrentLabelStack++) 
1185     {// This is the begining of the loop on primaries
1186       
1187         TParticle* lCurrentParticle = 0x0; 
1188                    lCurrentParticle = lMCstack->Particle( iCurrentLabelStack );
1189         if(!lCurrentParticle){
1190                 Printf("Cascade loop %d - MC TParticle pointer to current stack particle = 0x0 ! Skip ...\n", iCurrentLabelStack );
1191                 continue;
1192                 
1193         }
1194         
1195         if( lCurrentParticle->GetPdgCode() == lPdgCodeCasc ){  // Here !
1196                 //cout << "Xi- ds boucle " << iCurrentLabelStack << "/ " << iNumberOfPrimaries << endl;
1197                 
1198                 // -  Xi level ... _____________________________________________________________
1199                 TParticle* xiMC = 0x0;
1200                            xiMC = lCurrentParticle;
1201                 if(!xiMC){
1202                         Printf("MC TParticle pointer to Cascade = 0x0 ! Skip ...");
1203                         continue;
1204                 
1205                 }
1206                 
1207                 Double_t lRadToDeg = 180.0/TMath::Pi();
1208                 
1209                 // Fill the histo in pseudo-rapidity : = any generated Xi, not necessarily within the acceptance
1210                 lHistEtaGenCasc->Fill( xiMC->Eta() );
1211                 
1212          
1213                 // cascades within |y| < 1
1214                 Double_t lRapXi = 0.5*TMath::Log((xiMC->Energy() + xiMC->Pz()) / (xiMC->Energy() - xiMC->Pz() +1.e-13));
1215                 
1216                 if( TMath::Abs(lRapXi) < 1) {
1217                         lHistYGenCascMidRap     ->Fill( lRapXi                          );      
1218                         lHistEtaGenCascMidRap   ->Fill( xiMC->Eta()                     ); 
1219                         lHistThetaGenCascMidRap ->Fill( lRadToDeg * xiMC->Theta()       );
1220                         lHistPtGenCascMidRap    ->Fill( xiMC->Pt()                      );
1221                 }
1222                 
1223                 // Check the emission of particle stays within the acceptance of the detector (cut in pt + theta)
1224                 if( xiMC->Theta() < TMath::Pi()/4.0  ||    xiMC->Theta() > 3.0*TMath::Pi()/4.0 ) continue;      
1225                 if( xiMC->GetNDaughters() != 2) continue;
1226                 if( xiMC->GetDaughter(0) < 0 )  continue;
1227                 if( xiMC->GetDaughter(1) < 0 )  continue;
1228                 
1229                         TParticle* lDght0ofXi = lMCstack->Particle(  xiMC->GetDaughter(0) );
1230                         TParticle* lDght1ofXi = lMCstack->Particle(  xiMC->GetDaughter(1) );
1231                         
1232                 TParticle* lLambda = 0;
1233                 TParticle* lBach   = 0;
1234                         
1235                 // Xi - Case 1
1236                         if(     lDght0ofXi->GetPdgCode() == lPdgCodeLambda   &&  // Here !
1237                                 lDght1ofXi->GetPdgCode() == lPdgCodeBach ){      // Here !
1238                                 
1239                                 lLambda = lDght0ofXi;
1240                                 lBach   = lDght1ofXi;
1241                         }// end if dghter 0 = Lambda and    dghter 1 = Pi-  
1242                         
1243                 // Xi - Case 2
1244                         else if( lDght0ofXi->GetPdgCode() == lPdgCodeBach  &&      // Here !
1245                                  lDght1ofXi->GetPdgCode() == lPdgCodeLambda ){     // Here !
1246                         
1247                                 lBach   = lDght0ofXi;
1248                                 lLambda = lDght1ofXi;
1249                         }//  end if dghter 0 = Pi-  and   dghter 1 = Lambda
1250                         
1251                 // V0 otherwise - Case 3        
1252                         else continue;
1253                 
1254                         // Check the emission of particle stays within the acceptance of the detector
1255                         if( lLambda->Theta() < TMath::Pi()/4.0  ||    lLambda->Theta() > 3.0*TMath::Pi()/4.0 ) continue;
1256                         if( lBach->Theta() < TMath::Pi()/4.0    ||    lBach->Theta() > 3.0*TMath::Pi()/4.0 )   continue;
1257                 
1258                         if( lBach->Pt() < 0.2 ) continue; 
1259                         
1260                 
1261                 
1262                 // -  V0 level ... _____________________________________________________________
1263                 TParticle* lDghtBarV0 = 0;
1264                 TParticle* lDghtMesV0 = 0;
1265                 
1266                 if( lLambda->GetNDaughters() != 2 )  continue;
1267                 if( lLambda->GetDaughter(0) < 0 )    continue;
1268                 if( lLambda->GetDaughter(1) < 0 )    continue;
1269                 
1270                 
1271                 TParticle* lDght0ofLambda = lMCstack->Particle(  lLambda->GetDaughter(0) );
1272                 TParticle* lDght1ofLambda = lMCstack->Particle(  lLambda->GetDaughter(1) );
1273                         
1274                 // V0 - Case 1
1275                         if(     lDght0ofLambda->GetPdgCode() == lPdgCodeDghtBarV0 &&    // Here !
1276                                 lDght1ofLambda->GetPdgCode() == lPdgCodeDghtMesV0 ){    // Here !
1277                         
1278                                 lDghtBarV0 = lDght0ofLambda;
1279                                 lDghtMesV0 = lDght1ofLambda;
1280                         }// end if dghter 0 = Proton  and   dghter 1 = Pi-  
1281                         
1282                 // V0 - Case 2
1283                         else if( lDght0ofLambda->GetPdgCode() == lPdgCodeDghtMesV0  &&     // Here !
1284                                  lDght1ofLambda->GetPdgCode() == lPdgCodeDghtBarV0 ){      // Here !
1285                         
1286                                 lDghtMesV0 = lDght0ofLambda;
1287                                 lDghtBarV0 = lDght1ofLambda;
1288                         }//  end if dghter 0 = Pi-  and   dghter 1 = proton
1289                         
1290                 // V0 otherwise - Case 3
1291                         else continue;
1292         
1293                         
1294                         // Check the emission of particle stays within the acceptance of the detector
1295                         if( lDghtBarV0->Theta() < TMath::Pi()/4.0  ||  lDghtBarV0->Theta() > 3.0*TMath::Pi()/4.0 ) continue;
1296                         if( lDghtMesV0->Theta() < TMath::Pi()/4.0  ||  lDghtMesV0->Theta() > 3.0*TMath::Pi()/4.0 ) continue;
1297                         
1298                         if( lDghtBarV0->Pt() < 0.5 ) continue;
1299                         if( lDghtMesV0->Pt() < 0.2 ) continue;
1300                         
1301                         
1302                         
1303                 // - Just to know which file is currently open : locate the file containing Xi 
1304                 //cout << "Name of the file containing generated Xi :" <<  fInputHandler->GetTree()->GetCurrentFile()->GetName() 
1305                 //                                                   <<  endl;  
1306                         
1307                 // - Filling histos ... _________________________________________________________________       
1308                         lHistThetaGenCasc       ->Fill( lRadToDeg * xiMC->Theta()  );
1309                         lHistPtFdblGenCasc      ->Fill( xiMC->Pt() );
1310                         
1311                         // - Fill theta histos for Lambda and Bach
1312                         lHistThetaLambda        ->Fill( lRadToDeg * lLambda->Theta() );
1313                         lHistThetaBach          ->Fill( lRadToDeg *   lBach->Theta() );
1314                         
1315                         // - Fill theta histos for V0 daughters
1316                         lHistThetaBarDghter     ->Fill( lRadToDeg * lDghtBarV0->Theta() );
1317                         lHistThetaMesDghter     ->Fill( lRadToDeg * lDghtMesV0->Theta() );
1318                         
1319                         // - Fill pt histos.
1320                         lHistPtBach             ->Fill(      lBach->Pt() );
1321                         lHistPtBarDghter        ->Fill( lDghtBarV0->Pt() );
1322                         lHistPtMesDghter        ->Fill( lDghtMesV0->Pt() );
1323                         
1324                         // - Re-initialisation of the local TH1F pointers
1325                         lHistEtaGenCasc         = 0x0;
1326                         
1327                         lHistYGenCascMidRap     = 0x0;
1328                         lHistEtaGenCascMidRap   = 0x0;
1329                         lHistThetaGenCascMidRap = 0x0;
1330                         lHistPtGenCascMidRap    = 0x0;
1331                         
1332                         lHistThetaGenCasc       = 0x0;
1333                         lHistPtFdblGenCasc      = 0x0;
1334                         lHistThetaLambda        = 0x0;
1335                         lHistThetaBach          = 0x0;
1336                         lHistThetaBarDghter     = 0x0;
1337                         lHistThetaMesDghter     = 0x0;
1338                         lHistPtBach             = 0x0;
1339                         lHistPtBarDghter        = 0x0;
1340                         lHistPtMesDghter        = 0x0;  
1341                         
1342                         
1343                 }// end if current particle = Xi-
1344              
1345      }// This is the end of the loop on primaries
1346
1347 } // end of loop over the different types of cascades (Xi-+, Omega-+)
1348         
1349  
1350  
1351 //__________________________________________________________________________    
1352 // Part 2 - Loop over the reconstructed candidates
1353   
1354   
1355 // Temporary way : AOD awareness of the code to be developed  
1356 if(fAnalysisType == "AOD") return;
1357
1358
1359 for (Int_t iXi = 0; iXi < ncascades; iXi++) 
1360 {// This is the begining of the Cascade loop
1361                 
1362         AliESDcascade *xiESD = lESDevent->GetCascade(iXi);
1363           
1364         if (!xiESD) continue;
1365         
1366         // -  Step 1 : Preparing the general info about of the event
1367         //-------------
1368         //const AliESDVertex *lPrimaryVtx = lESDevent->GetPrimaryVertex();  // get the best vtx available
1369         //      Double_t lPrimaryVtxPos[3] = {-100.0, -100.0, -100.0};
1370         //               lPrimaryVtx->GetXYZ( lPrimaryVtxPos );
1371         
1372         // Double_t lMagneticField = lESDevent->GetMagneticField( );
1373         
1374         
1375         // - Step 2 : Connection to daughter tracks of the current cascade
1376         //-------------
1377                         
1378                 UInt_t lIdxPosXi        = (UInt_t) TMath::Abs( xiESD->GetPindex() );
1379                 UInt_t lIdxNegXi        = (UInt_t) TMath::Abs( xiESD->GetNindex() );
1380                 UInt_t lBachIdx         = (UInt_t) TMath::Abs( xiESD->GetBindex() );
1381                 // abs value not needed ; the index should always be positive (!= label ...)
1382       
1383         AliESDtrack *pTrackXi           = lESDevent->GetTrack( lIdxPosXi );
1384         AliESDtrack *nTrackXi           = lESDevent->GetTrack( lIdxNegXi );
1385         AliESDtrack *bachTrackXi        = lESDevent->GetTrack( lBachIdx  );
1386         if (!pTrackXi || !nTrackXi || !bachTrackXi ) {
1387                 Printf("ERROR: Could not retrieve one of the 3 daughter tracks of the cascade ...");
1388                 continue;
1389         }
1390         
1391         
1392         // - Step 3 : Info over reconstructed cascades
1393         //------------- 
1394         
1395         Double_t lInvMassXiMinus    = 0.;
1396         Double_t lInvMassXiPlus     = 0.;
1397         Double_t lInvMassOmegaMinus = 0.;
1398         Double_t lInvMassOmegaPlus  = 0.;
1399         
1400         Double_t lV0quality = 0.;
1401         
1402         if( bachTrackXi->Charge() < 0 ) {
1403                 lV0quality = 0.;
1404                 xiESD->ChangeMassHypothesis(lV0quality , 3312);         
1405                         // Calculate the effective mass of the Xi- candidate. 
1406                         // pdg code 3312 = Xi-
1407                 lInvMassXiMinus = xiESD->GetEffMassXi();
1408                 
1409                 lV0quality = 0.;
1410                 xiESD->ChangeMassHypothesis(lV0quality , 3334);         
1411                         // Calculate the effective mass of the Xi- candidate. 
1412                         // pdg code 3334 = Omega-
1413                 lInvMassOmegaMinus = xiESD->GetEffMassXi();
1414                                         
1415                 lV0quality = 0.;
1416                 xiESD->ChangeMassHypothesis(lV0quality , 3312);         // Back to default hyp.
1417                 
1418         }
1419         
1420         if( bachTrackXi->Charge() >  0 ){
1421                 lV0quality = 0.;
1422                 xiESD->ChangeMassHypothesis(lV0quality , -3312);        
1423                         // Calculate the effective mass of the Xi+ candidate. 
1424                         // pdg code -3312 = Xi+
1425                 lInvMassXiPlus = xiESD->GetEffMassXi();
1426                 
1427                 lV0quality = 0.;
1428                 xiESD->ChangeMassHypothesis(lV0quality , -3334);        
1429                         // Calculate the effective mass of the Xi+ candidate. 
1430                         // pdg code -3334  = Omega+
1431                 lInvMassOmegaPlus = xiESD->GetEffMassXi();
1432                 
1433                 lV0quality = 0.;
1434                 xiESD->ChangeMassHypothesis(lV0quality , -3312);        // Back to "default" hyp.
1435         }
1436                 
1437         Double_t lChargeXi = xiESD->Charge();
1438         
1439         if( lChargeXi < 0 )     fHistMassXiMinus        ->Fill( lInvMassXiMinus );
1440         if( lChargeXi > 0 )     fHistMassXiPlus         ->Fill( lInvMassXiPlus );
1441         if( lChargeXi < 0 )     fHistMassOmegaMinus     ->Fill( lInvMassOmegaMinus );
1442         if( lChargeXi > 0 )     fHistMassOmegaPlus      ->Fill( lInvMassOmegaPlus );
1443         
1444         
1445         
1446         
1447         // - Step 4 : MC association
1448         //------------- 
1449         
1450         Bool_t lAssoXiMinus    = kFALSE;
1451         Bool_t lAssoXiPlus     = kFALSE;
1452         Bool_t lAssoOmegaMinus = kFALSE;
1453         Bool_t lAssoOmegaPlus  = kFALSE;
1454         
1455         
1456         if(fDebug > 5)
1457                 cout    << "MC EventNumber : " << lMCevent->Header()->GetEvent() 
1458                         << " / MC event Number in Run : " << lMCevent->Header()->GetEventNrInRun() << endl;
1459         
1460         // - Step 4.1 : level of the V0 daughters
1461                 
1462         Int_t lblPosV0Dghter = (Int_t) TMath::Abs( pTrackXi->GetLabel() );  
1463                 // Abs value = needed ! question of quality track association ...
1464         Int_t lblNegV0Dghter = (Int_t) TMath::Abs( nTrackXi->GetLabel() );
1465                 
1466         TParticle* mcPosV0Dghter = lMCstack->Particle( lblPosV0Dghter );
1467         TParticle* mcNegV0Dghter = lMCstack->Particle( lblNegV0Dghter );
1468         
1469
1470         // - Step 4.2 : level of the Xi daughters
1471                 
1472         Int_t lblMotherPosV0Dghter = mcPosV0Dghter->GetFirstMother() ; 
1473         Int_t lblMotherNegV0Dghter = mcNegV0Dghter->GetFirstMother();
1474         
1475                 if(lblMotherPosV0Dghter != lblMotherNegV0Dghter) continue; // same mother
1476                 if( lblMotherPosV0Dghter < 0 ) continue; // mother != primary (!= -1)
1477                 if( lblMotherNegV0Dghter < 0 ) continue;
1478                                         
1479
1480                 // mothers = Lambda candidate ... a priori
1481         
1482         TParticle* mcMotherPosV0Dghter = lMCstack->Particle( lblMotherPosV0Dghter );
1483         TParticle* mcMotherNegV0Dghter = lMCstack->Particle( lblMotherNegV0Dghter );
1484
1485         Int_t      lblBach  = (Int_t) TMath::Abs( bachTrackXi->GetLabel() );
1486         TParticle* mcBach   = lMCstack->Particle( lblBach );    
1487                                 
1488
1489         // - Step 4.3 : level of Xi candidate
1490         
1491         Int_t lblGdMotherPosV0Dghter =   mcMotherPosV0Dghter->GetFirstMother() ;
1492         Int_t lblGdMotherNegV0Dghter =   mcMotherNegV0Dghter->GetFirstMother() ;
1493                         
1494                 if( lblGdMotherPosV0Dghter != lblGdMotherNegV0Dghter ) continue;
1495                 if( lblGdMotherPosV0Dghter < 0 ) continue; // primary lambda ...
1496                 if( lblGdMotherNegV0Dghter < 0 ) continue; // primary lambda ...
1497                         
1498                 
1499                 // Gd mothers = Xi candidate ... a priori
1500         
1501         TParticle* mcGdMotherPosV0Dghter = lMCstack->Particle( lblGdMotherPosV0Dghter );
1502         TParticle* mcGdMotherNegV0Dghter = lMCstack->Particle( lblGdMotherNegV0Dghter );
1503                                         
1504         Int_t lblMotherBach = (Int_t) TMath::Abs( mcBach->GetFirstMother()  );
1505         
1506                 if( lblMotherBach != lblGdMotherPosV0Dghter ) continue; //same mother for bach and V0 daughters
1507         
1508         TParticle* mcMotherBach = lMCstack->Particle( lblMotherBach );
1509         
1510                 
1511         // - Step 4.4 : Manage boolean for association
1512         
1513         if( mcMotherBach                ->GetPdgCode() ==   3312 &&
1514             mcGdMotherPosV0Dghter       ->GetPdgCode() ==   3312 &&
1515             mcGdMotherNegV0Dghter       ->GetPdgCode() ==   3312)       lAssoXiMinus = kTRUE;
1516         
1517         else if( mcMotherBach           ->GetPdgCode() ==  -3312 &&
1518             mcGdMotherPosV0Dghter       ->GetPdgCode() ==  -3312 &&
1519             mcGdMotherNegV0Dghter       ->GetPdgCode() ==  -3312)       lAssoXiPlus = kTRUE;
1520         
1521         else if( mcMotherBach           ->GetPdgCode() ==   3334 &&
1522             mcGdMotherPosV0Dghter       ->GetPdgCode() ==   3334 &&
1523             mcGdMotherNegV0Dghter       ->GetPdgCode() ==   3334)       lAssoOmegaMinus = kTRUE;
1524                 
1525         else if( mcMotherBach           ->GetPdgCode() ==  -3334 &&
1526             mcGdMotherPosV0Dghter       ->GetPdgCode() ==  -3334 &&
1527             mcGdMotherNegV0Dghter       ->GetPdgCode() ==  -3334)       lAssoOmegaPlus = kTRUE;
1528         
1529         
1530         
1531         if(!lAssoXiMinus && !lAssoXiPlus && !lAssoOmegaMinus && !lAssoOmegaPlus) continue; // no association
1532         
1533         // If a proper association  exists ...
1534                 
1535         if(fDebug > 4){
1536                 cout << "XiMinus    = " << lAssoXiMinus    << endl;
1537                 cout << "XiPlus     = " << lAssoXiPlus     << endl;
1538                 cout << "OmegaMinus = " << lAssoOmegaMinus << endl;
1539                 cout << "OmegaPlus  = " << lAssoOmegaPlus  << endl 
1540                      << "----"          << endl;        
1541         }
1542         
1543                 
1544         if(fDebug > 5){
1545                 cout << endl;
1546                 cout << "- V0 daughters - " << endl;
1547                 cout << "     + V0 Pos. / Label : " << lblPosV0Dghter 
1548                 << " - Pdg Code : " << mcPosV0Dghter->GetTitle() << endl;
1549                 cout << "     - V0 Neg. / Label : " << lblNegV0Dghter 
1550                 << " - Pdg Code : " << mcNegV0Dghter->GetTitle() << endl;
1551                 
1552                 cout << "- Xi daughters - " << endl;
1553                 cout << "     + V0 Pos. mother / Label : " << lblMotherPosV0Dghter 
1554                 << " - Pdg Code : " << mcMotherPosV0Dghter->GetTitle() << endl;
1555                 cout << "     - V0 Neg. mother / Label : " << lblMotherNegV0Dghter 
1556                 << " - Pdg Code : " << mcMotherNegV0Dghter->GetTitle() << endl;
1557                 
1558                 cout << "     --  Bach. / Label :" << lblBach 
1559                 << " -  Pdg Code : " << mcBach->GetTitle() << endl;
1560                 
1561                 cout << "- Xi candidate -" << endl;
1562                 cout << "    +  V0 Pos. Gd Mother / Label : " << lblGdMotherPosV0Dghter 
1563                 << " - Pdg Code : " << mcGdMotherPosV0Dghter->GetTitle() << endl;
1564                 cout << "    -  V0 Neg. Gd Mother / Label : "  << lblGdMotherNegV0Dghter 
1565                 << " - Pdg Code : "<< mcGdMotherNegV0Dghter->GetTitle() << endl;
1566                 
1567                 cout << "    --  Mother Bach. / Label : " << lblMotherBach 
1568                 << " - Pdg Code    : " << mcMotherBach->GetTitle() << endl;
1569                 cout << endl;
1570         }
1571
1572         
1573         // - Step 5 : Plots around the cascade candidates associated with MC
1574         //------------- 
1575         
1576         Double_t lmcPt             = mcMotherBach->Pt();
1577         Double_t lmcRapXi          = 0.5*TMath::Log( (mcMotherBach->Energy() + mcMotherBach->Pz()) / 
1578                                                      (mcMotherBach->Energy() - mcMotherBach->Pz() +1.e-13) );
1579         Double_t lmcEta            = mcMotherBach->Eta();
1580         Double_t lmcTransvRadius   = mcBach->R(); // to get the decay point of Xi, = the production vertex of Bachelor ...
1581         
1582         Double_t lrecoPt           = xiESD->Pt();
1583         Double_t lrecoTransvRadius = TMath::Sqrt( xiESD->Xv() * xiESD->Xv() + xiESD->Yv() * xiESD->Yv() );
1584         
1585         // - Effective mass histos for the cascade candidates associated with MC
1586         
1587         if( lChargeXi < 0 && lAssoXiMinus){     
1588                 fHistAsMCMassXiMinus          ->Fill( lInvMassXiMinus  );
1589                 fHistAsMCGenPtXiMinus         ->Fill( lmcPt            );
1590                 fHistAsMCGenYXiMinus          ->Fill( lmcRapXi         );
1591                 f2dHistAsMCGenYVsGenPtXiMinus ->Fill( lmcRapXi, lmcPt  );
1592                 fHistAsMCGenEtaXiMinus        ->Fill( lmcEta           );
1593                 f2dHistAsMCResPtXiMinus       ->Fill( lmcPt,           (lrecoPt - lmcPt)/ lmcPt );
1594                 f2dHistAsMCResRXiMinus        ->Fill( lmcTransvRadius, (lrecoTransvRadius - lmcTransvRadius)/ lmcTransvRadius    );
1595         }
1596         
1597         else if( lChargeXi > 0 && lAssoXiPlus){ 
1598                 fHistAsMCMassXiPlus           ->Fill( lInvMassXiPlus   );
1599                 fHistAsMCGenPtXiPlus          ->Fill( lmcPt            );
1600                 fHistAsMCGenYXiPlus           ->Fill( lmcRapXi         );
1601                 f2dHistAsMCGenYVsGenPtXiPlus  ->Fill( lmcRapXi, lmcPt  );
1602                 fHistAsMCGenEtaXiPlus         ->Fill( lmcEta           );
1603                 f2dHistAsMCResPtXiPlus        ->Fill( lmcPt,           (lrecoPt - lmcPt)/ lmcPt );
1604                 f2dHistAsMCResRXiPlus         ->Fill( lmcTransvRadius, (lrecoTransvRadius - lmcTransvRadius)/ lmcTransvRadius    );
1605         }
1606         
1607         else if( lChargeXi < 0 && lAssoOmegaMinus){     
1608                 fHistAsMCMassOmegaMinus          ->Fill( lInvMassOmegaMinus );
1609                 fHistAsMCGenPtOmegaMinus         ->Fill( lmcPt              );
1610                 fHistAsMCGenYOmegaMinus          ->Fill( lmcRapXi           );
1611                 f2dHistAsMCGenYVsGenPtOmegaMinus ->Fill( lmcRapXi, lmcPt    );
1612                 fHistAsMCGenEtaOmegaMinus        ->Fill( lmcEta             );
1613                 f2dHistAsMCResPtOmegaMinus       ->Fill( lmcPt,           (lrecoPt - lmcPt)/ lmcPt );
1614                 f2dHistAsMCResROmegaMinus        ->Fill( lmcTransvRadius, (lrecoTransvRadius - lmcTransvRadius)/ lmcTransvRadius    );
1615         }
1616         
1617         else if( lChargeXi > 0 && lAssoOmegaPlus){      
1618                 fHistAsMCMassOmegaPlus           ->Fill( lInvMassOmegaPlus );
1619                 fHistAsMCGenPtOmegaPlus          ->Fill( lmcPt             );
1620                 fHistAsMCGenYOmegaPlus           ->Fill( lmcRapXi          );
1621                 f2dHistAsMCGenYVsGenPtOmegaPlus  ->Fill( lmcRapXi, lmcPt   );
1622                 fHistAsMCGenEtaOmegaPlus         ->Fill( lmcEta            );
1623                 f2dHistAsMCResPtOmegaPlus        ->Fill( lmcPt,           (lrecoPt - lmcPt)/ lmcPt );
1624                 f2dHistAsMCResROmegaPlus         ->Fill( lmcTransvRadius, (lrecoTransvRadius - lmcTransvRadius)/ lmcTransvRadius    );
1625         }
1626         
1627         
1628 }// End of loop over reconstructed cascades
1629  
1630  
1631  
1632  
1633   // Post output data.
1634  PostData(1, fListHistCascade);
1635 }      
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646 //________________________________________________________________________
1647 void AliAnalysisTaskCheckPerformanceCascade::Terminate(Option_t *) 
1648 {
1649   // Draw result to the screen
1650   // Called once at the end of the query
1651
1652   fHistMCTrackMultiplicity = dynamic_cast<TH1F*> (  ((TList*)GetOutputData(1))->FindObject("fHistMCTrackMultiplicity")  );
1653   if (!fHistMCTrackMultiplicity) {
1654     Printf("ERROR: fHistMCTrackMultiplicity not available");
1655     return;
1656   }
1657   
1658    
1659   TCanvas *c2 = new TCanvas("AliAnalysisTaskCheckPerformanceCascade","Multiplicity",10,10,510,510);
1660   c2->cd(1)->SetLogy();
1661
1662   fHistMCTrackMultiplicity->SetMarkerStyle(22);
1663   fHistMCTrackMultiplicity->DrawCopy("E");
1664  // fHistV0Multiplicity->SetMarkerStyle(26);
1665  // fHistV0Multiplicity->DrawCopy("ESAME");
1666
1667 }