1)Terminate() method implemented in the frame. Simple examples on what to do with...
[u/mrichter/AliRoot.git] / PWG4 / PartCorrBase / AliAnaPartCorrBaseClass.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
7  * Permission to use, copy, modify and distribute this software and its   *
8  * documentation strictly for non-commercial purposes is hereby granted   *
9  * without fee, provided that the above copyright notice appears in all   *
10  * copies and that both the copyright notice and this permission notice   *
11  * appear in the supporting documentation. The authors make no claims     *
12  * about the suitability of this software for any purpose. It is          *
13  * provided "as is" without express or implied warranty.                  *
14  **************************************************************************/
15 /* $Id: $ */
16
17 //_________________________________________________________________________
18 // Base class for analysis algorithms
19 //-- Author: Gustavo Conesa (LNF-INFN) 
20 //_________________________________________________________________________
21   
22
23 // --- ROOT system ---
24 #include <TClonesArray.h>
25
26 //---- AliRoot system ----
27 #include "AliAODPWG4Particle.h"
28 #include "AliAODCaloCluster.h"
29 #include "AliAODCaloCells.h"
30 #include "AliAODTrack.h"
31 #include "AliAnaPartCorrBaseClass.h"
32 #include "AliCaloTrackReader.h"
33 #include "AliCaloPID.h"
34 #include "AliFidutialCut.h"
35 #include "AliIsolationCut.h"
36 #include "AliMCAnalysisUtils.h"
37 #include "AliNeutralMesonSelection.h"
38 #include "AliLog.h"
39 #include "AliAODPWG4ParticleCorrelation.h"
40
41 ClassImp(AliAnaPartCorrBaseClass)
42   
43   
44 //_______________________________________________
45   AliAnaPartCorrBaseClass::AliAnaPartCorrBaseClass() : 
46     TObject(), fDataMC(0), fDebug(0), fCheckFidCut(0),
47     fCheckCaloPID(0), fRecalculateCaloPID(0), fMinPt(0), fMaxPt(0),
48     fReader(0x0),
49         fInputAODBranch(0x0), fInputAODName(""),
50         fOutputAODBranch(0x0), fNewAOD(kFALSE),
51         fOutputAODName(""), fOutputAODClassName(""),
52         fAODCaloClusters(0x0), fAODCaloCells(0x0), 
53     fCaloPID(0x0), fFidCut(0x0), fIC(0x0),fNMS(0x0),
54         fHistoNPtBins(0),  fHistoPtMax(0.),  fHistoPtMin(0.),
55         fHistoNPhiBins(0), fHistoPhiMax(0.), fHistoPhiMin(0.),
56         fHistoNEtaBins(0), fHistoEtaMax(0.), fHistoEtaMin(0.)
57 {
58   //Default Ctor
59   
60   fReader  = new AliCaloTrackReader();
61   fCaloPID = new AliCaloPID();
62   fFidCut  = new AliFidutialCut();
63   fIC      = new AliIsolationCut();
64   fMCUtils = new AliMCAnalysisUtils();
65   
66   //Initialize parameters
67   InitParameters();
68 }
69
70 //___________________________________________________________
71 AliAnaPartCorrBaseClass::AliAnaPartCorrBaseClass(const AliAnaPartCorrBaseClass & abc) :   
72   TObject(), fDataMC(abc.fDataMC), fDebug(abc.fDebug),
73   fCheckFidCut(abc.fCheckFidCut),  fCheckCaloPID(abc. fCheckCaloPID),
74   fRecalculateCaloPID(abc.fRecalculateCaloPID),
75   fMinPt(abc.fMinPt), fMaxPt(abc.fMaxPt), fReader(abc.fReader),  
76   fInputAODBranch(new TClonesArray(*abc.fInputAODBranch)), fInputAODName(abc.fInputAODName),
77   fOutputAODBranch(new TClonesArray(*abc.fOutputAODBranch)),fNewAOD(abc.fNewAOD), 
78   fOutputAODName(abc.fOutputAODName), fOutputAODClassName(abc.fOutputAODClassName),
79   fAODCaloClusters(new TClonesArray(*abc.fAODCaloClusters)),
80   fAODCaloCells(new AliAODCaloCells(*abc.fAODCaloCells)),
81   fCaloPID(abc.fCaloPID), fFidCut(abc.fFidCut), fIC(abc.fIC),fMCUtils(abc.fMCUtils), fNMS(abc.fNMS),
82   fHistoNPtBins(abc.fHistoNPtBins),   fHistoPtMax(abc.fHistoPtMax),   fHistoPtMin(abc.fHistoPtMin),
83   fHistoNPhiBins(abc.fHistoNPhiBins), fHistoPhiMax(abc.fHistoPhiMax), fHistoPhiMin(abc.fHistoPhiMin),
84   fHistoNEtaBins(abc.fHistoNEtaBins), fHistoEtaMax(abc.fHistoEtaMax), fHistoEtaMin(abc.fHistoEtaMin)
85 {
86   // cpy ctor
87   
88 }
89
90 //_________________________________________________________________________
91 AliAnaPartCorrBaseClass & AliAnaPartCorrBaseClass::operator = (const AliAnaPartCorrBaseClass & abc)
92 {
93         // assignment operator
94         
95         if(this == &abc) return *this;
96         ((TObject *)this)->operator=(abc);
97         
98         fDataMC             = abc.fDataMC;
99         fDebug              = abc.fDebug ;
100         fRecalculateCaloPID = abc.fRecalculateCaloPID ;
101         fCheckCaloPID       = abc.fCheckCaloPID ;
102         fCheckFidCut        = abc.fCheckFidCut ; 
103         
104         fReader             = abc.fReader ;
105         fAODCaloClusters   = new TClonesArray(*abc.fAODCaloClusters) ;
106         fAODCaloCells      = new AliAODCaloCells(*abc.fAODCaloCells) ;
107         
108         fMinPt   = abc.fMinPt;
109         fMaxPt   = abc.fMaxPt;
110         fCaloPID = abc.fCaloPID;  
111         fFidCut  = abc.fFidCut;
112         fIC      = abc.fIC;
113         fMCUtils = abc.fMCUtils;
114         fNMS     = abc.fNMS;
115                 
116         fInputAODBranch     = new TClonesArray(*abc.fInputAODBranch) ;
117         fInputAODName       = abc.fInputAODName;
118         fOutputAODBranch    = new TClonesArray(*abc.fOutputAODBranch) ;
119         fNewAOD             = abc.fNewAOD ; 
120         fOutputAODName      = abc.fOutputAODName; 
121         fOutputAODClassName = abc.fOutputAODClassName;
122         
123         fHistoNPtBins  = abc.fHistoNPtBins;  fHistoPtMax  = abc.fHistoPtMax;  fHistoPtMin  = abc.fHistoPtMin;
124         fHistoNPhiBins = abc.fHistoNPhiBins; fHistoPhiMax = abc.fHistoPhiMax; fHistoPhiMin = abc.fHistoPhiMin;
125         fHistoNEtaBins = abc.fHistoNEtaBins; fHistoEtaMax = abc.fHistoEtaMax; fHistoEtaMin = abc.fHistoEtaMin;
126         
127         return *this;
128         
129 }
130
131 //____________________________________________________________________________
132 AliAnaPartCorrBaseClass::~AliAnaPartCorrBaseClass() 
133 {
134   // Remove all pointers except analysis output pointers.
135         
136     if(fOutputAODBranch){
137                 fOutputAODBranch->Clear() ; 
138                 delete fOutputAODBranch ;
139         }
140         
141     if(fInputAODBranch){
142                 fInputAODBranch->Clear() ; 
143                 delete fInputAODBranch ;
144         }
145         
146         if(fAODCaloClusters){
147                 fAODCaloClusters->Clear() ; 
148                 delete fAODCaloClusters ;
149         }
150         
151         if(fAODCaloCells){
152                 fAODCaloCells->Clear() ; 
153                 delete fAODCaloCells ;
154         }
155         
156         if(fReader)  delete fReader ;
157         if(fCaloPID) delete fCaloPID ;
158         if(fFidCut)  delete fFidCut ;
159         if(fIC)      delete fIC ;
160         if(fMCUtils) delete fMCUtils ;
161         if(fNMS)     delete fNMS ;
162
163 }
164
165 //____________________________________________________________________________
166 void AliAnaPartCorrBaseClass::AddAODCaloCluster(AliAODCaloCluster calo) {
167   //Put AOD calo cluster in the CaloClusters array
168
169   Int_t i = fAODCaloClusters->GetEntriesFast();
170   new((*fAODCaloClusters)[i])  AliAODCaloCluster(calo);
171
172 }
173
174
175 //____________________________________________________________________________
176 void AliAnaPartCorrBaseClass::AddAODParticle(AliAODPWG4Particle pc) {
177   //Put AOD calo cluster in the AODParticleCorrelation array
178   
179         if(fOutputAODBranch){
180                 
181                 Int_t i = fOutputAODBranch->GetEntriesFast();
182                 //new((*fOutputAODBranch)[i])  AliAODPWG4Particle(pc);
183                 if(strcmp(fOutputAODBranch->GetClass()->GetName(),"AliAODPWG4Particle")==0)
184                         new((*fOutputAODBranch)[i])  AliAODPWG4Particle(pc);
185                 else   if(strcmp(fOutputAODBranch->GetClass()->GetName(),"AliAODPWG4ParticleCorrelation")==0)
186                         new((*fOutputAODBranch)[i])  AliAODPWG4ParticleCorrelation(pc);
187                 else 
188                         AliFatal(Form(">>> Cannot add an object of type < %s >, to the AOD TClonesArray \n", 
189                                                   fOutputAODBranch->GetClass()->GetName()));
190         }
191         else AliFatal("AddAODParticle: No AOD branch available!!!");
192         
193 }       
194
195
196 //___________________________________________________
197 void AliAnaPartCorrBaseClass::ConnectAODCaloClusters() {
198   //Recover the list of AODCaloClusters
199
200   fAODCaloClusters = fReader->GetAOD()->GetCaloClusters();
201
202 }
203
204 //___________________________________________________
205 void AliAnaPartCorrBaseClass::ConnectAODPHOSCells() {
206   //Recover the list of PHOS AODCaloCells 
207
208   fAODCaloCells = fReader->GetAOD()->GetPHOSCells();
209
210 }
211
212 //___________________________________________________
213 void AliAnaPartCorrBaseClass::ConnectAODEMCALCells() {
214   //Recover the list of EMCAL AODCaloCells 
215
216   fAODCaloCells = fReader->GetAOD()->GetEMCALCells();
217
218 }
219
220 //___________________________________________________
221 void AliAnaPartCorrBaseClass::ConnectInputOutputAODBranches() {
222         //Recover ouput and input AOD pointers for each event in the maker
223         fOutputAODBranch =  (TClonesArray *) fReader->GetAOD()->FindListObject(fOutputAODName);
224         fInputAODBranch  =  (TClonesArray *) fReader->GetAOD()->FindListObject(fInputAODName);          
225 }
226
227 //__________________________________________________
228 TClonesArray *  AliAnaPartCorrBaseClass::GetAODCTS() const {
229   //Get list of tracks from reader
230
231   return fReader->GetAODCTS(); 
232
233 }
234
235 //__________________________________________________
236 TClonesArray *  AliAnaPartCorrBaseClass::GetAODPHOS() const {
237   //Get list of PHOS calo clusters from reader
238
239   return fReader->GetAODPHOS(); 
240
241 }
242
243
244 //__________________________________________________
245 TClonesArray *  AliAnaPartCorrBaseClass::GetAODEMCAL() const {
246   //Get list of emcal caloclusters from reader
247
248   return fReader->GetAODEMCAL(); 
249
250 }
251
252 //__________________________________________________
253 TString  AliAnaPartCorrBaseClass::GetBaseParametersList()  {
254   //Put data member values in string to keep in output container
255
256         TString parList ; //this will be list of parameters used for this analysis.
257         char onePar[255] ;
258         sprintf(onePar,"--- AliAnaPartCorrBaseClass ---\n") ;
259         parList+=onePar ;       
260         sprintf(onePar,"Minimal P_t: %2.2f ; Max\n", fMinPt) ;
261         parList+=onePar ;
262         sprintf(onePar,"Minimal P_t: %2.2f ; Max\n", fMaxPt) ;
263         parList+=onePar ;
264         sprintf(onePar,"fDataMC =%d (Check MC information, on/off) \n",fDataMC) ;
265         parList+=onePar ;
266         sprintf(onePar,"fCheckFidCut=%d (Check Fidutial cut selection on/off) \n",fCheckFidCut) ;
267         parList+=onePar ;
268         sprintf(onePar,"fCheckCaloPIC =%d (Use Bayesian PID in calorimetes, on/off) \n",fCheckCaloPID) ;
269         parList+=onePar ;
270         sprintf(onePar,"fRecalculateCaloPID  =%d (Calculate PID from shower/tof/tracking parameters, on/off) \n",fRecalculateCaloPID) ;
271         parList+=onePar ;
272
273   return parList; 
274
275 }
276
277 //__________________________________________________
278  TClonesArray * AliAnaPartCorrBaseClass::GetCreateOutputAODBranch() {
279          //Create AOD branch filled in the analysis
280          
281          //if(fDebug > 0 )
282          printf("Create AOD branch of %s objects and with name < %s >\n",
283                         fOutputAODClassName.Data(),fOutputAODName.Data()) ;
284          
285          TClonesArray * aodBranch = new TClonesArray(fOutputAODClassName, 0);
286          aodBranch->SetName(fOutputAODName);
287          
288          return aodBranch ;
289          
290  }
291
292 //__________________________________________________
293 TNamed *  AliAnaPartCorrBaseClass::GetPHOSCells() const {
294   //Get list of PHOS calo cells (ESD or AOD) from reader
295   
296   return fReader->GetPHOSCells(); 
297   
298 }
299
300
301 //__________________________________________________
302 TNamed *  AliAnaPartCorrBaseClass::GetEMCALCells() const {
303   //Get list of emcal calo cells (ESD or AOD) from reader
304   
305   return fReader->GetEMCALCells(); 
306
307 }
308
309 //__________________________________________________
310 Int_t AliAnaPartCorrBaseClass::GetEventNumber() const {
311         //Get current event number
312         
313         return fReader->GetEventNumber() ; 
314 }
315         
316 //__________________________________________________
317 AliStack *  AliAnaPartCorrBaseClass::GetMCStack() const {
318   //Get stack pointer from reader
319
320   return fReader->GetStack(); 
321
322 }
323 //__________________________________________________
324 AliHeader *  AliAnaPartCorrBaseClass::GetMCHeader() const {
325   //Get header pointer from reader
326
327   return fReader->GetHeader(); 
328
329 }
330
331 //__________________________________________________
332 AliGenEventHeader *  AliAnaPartCorrBaseClass::GetMCGenEventHeader() const {
333   //Get GenEventHeader pointer from reader
334
335   return fReader->GetGenEventHeader(); 
336
337 }
338
339 //__________________________________________________
340 void AliAnaPartCorrBaseClass::InitParameters()
341
342   //Initialize the parameters of the analysis.
343   fDataMC = kFALSE;
344   fDebug = -1;
345   fCheckCaloPID = kTRUE ;
346   fCheckFidCut = kFALSE ;
347   fRecalculateCaloPID = kFALSE ;
348   fMinPt = 0.2 ; //Min pt in particle analysis
349   fMaxPt = 300. ; //Max pt in particle analysis
350
351   fCaloPID = new AliCaloPID ;  
352   fFidCut = new AliFidutialCut;
353   fIC = new AliIsolationCut;
354   fNMS = new AliNeutralMesonSelection;
355   fNewAOD = kFALSE ;
356   fOutputAODName = "PartCorr";
357   fOutputAODClassName = "AliAODPWG4Particle";
358   fInputAODName = "PartCorr";
359   
360   //Histogrammes settings
361   fHistoNPtBins = 240 ;
362   fHistoPtMax   = 120 ;
363   fHistoPtMin   = 0.  ;
364
365   fHistoNPhiBins = 120 ;
366   fHistoPhiMax   = TMath::TwoPi();
367   fHistoPhiMin   = 0.  ;
368
369   fHistoNEtaBins = 100 ;
370   fHistoEtaMax   =  1  ;
371   fHistoEtaMin   = -1  ;
372
373 }
374
375 //__________________________________________________________________
376 void AliAnaPartCorrBaseClass::Print(const Option_t * opt) const
377 {
378         //Print some relevant parameters set for the analysis
379         
380         if(! opt)
381                 return;
382         printf("New AOD:            =     %d\n",fNewAOD);
383         printf("Input AOD name:     =     %s\n",fInputAODName.Data());
384         printf("Output AOD name:    =     %s\n",fOutputAODName.Data());
385         printf("Output AOD Class name: =  %s\n",fOutputAODClassName.Data());
386         printf("Min Photon pT       =     %2.2f\n",  fMinPt) ;
387         printf("Max Photon pT       =     %3.2f\n",  fMaxPt) ;
388         printf("Check PID           =     %d\n",     fCheckCaloPID) ;
389         printf("Recalculate PID     =     %d\n",     fRecalculateCaloPID) ;
390         printf("Check Fidutial cut  =     %d\n",     fCheckFidCut) ;
391         printf("Check MC labels     =     %d\n",     fDataMC);
392         printf("Debug Level         =     %d\n",     fDebug);
393         printf("Histograms: %3.1f < pT < %3.1f,  Nbin = %d\n", fHistoPtMin,  fHistoPtMax,  fHistoNPtBins);
394         printf("Histograms: %3.1f < phi < %3.1f, Nbin = %d\n", fHistoPhiMin, fHistoPhiMax, fHistoNPhiBins);
395         printf("Histograms: %3.1f < eta < %3.1f, Nbin = %d\n", fHistoEtaMin, fHistoEtaMax, fHistoNEtaBins);
396
397         printf("    \n") ;
398         
399