60c082bed280d4d7a45c6e06b36ab958a3a2ecee
[u/mrichter/AliRoot.git] / PWG4 / AliAnaMaker.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 // Steering class for particle (gamma, hadron) identification and correlation analysis
19 // It is called by the task class AliAnalysisTaskParticleCorrelation and it connects the input 
20 // (ESD/AOD/MonteCarlo) got with AliCaloTrackReader (produces TClonesArrays of AODs 
21 // (TParticles in MC case if requested)), with the 
22 // analysis classes that derive from AliAnaBaseClass
23 //
24 // -- Author: Gustavo Conesa (INFN-LNF)
25
26 // --- ROOT system ---
27 #include <TClonesArray.h>
28 #include <TString.h>
29
30 //---- AliRoot system ---- 
31 #include "AliAnaBaseClass.h" 
32 #include "AliAnaMaker.h" 
33 #include "AliCaloTrackReader.h" 
34 #include "AliLog.h"
35
36
37 ClassImp(AliAnaMaker)
38
39
40 //____________________________________________________________________________
41   AliAnaMaker::AliAnaMaker() : 
42     TObject(),
43     fOutputContainer(new TList ), fAnalysisContainer(new TList ),
44     fMakeHisto(0), fMakeAOD(0), fAnaDebug(0), 
45     fReader(0x0), fAODBranch(0x0), fAODBranchName("")
46 {
47   //Default Ctor
48   if(fAnaDebug > 1 ) printf("*** Analysis Maker  Constructor *** \n");
49   
50   //Initialize parameters, pointers and histograms
51   if(!fReader)
52     fReader = new AliCaloTrackReader();
53   
54   InitParameters();
55 }
56
57 //____________________________________________________________________________
58 AliAnaMaker::AliAnaMaker(const AliAnaMaker & g) :   
59   TObject(),
60   fOutputContainer(g. fOutputContainer), fAnalysisContainer(g.fAnalysisContainer), 
61   fMakeHisto(g.fMakeHisto), fMakeAOD(fMakeAOD), fAnaDebug(g. fAnaDebug),
62   fReader(g.fReader), fAODBranch(g.fAODBranch), 
63   fAODBranchName(g.fAODBranchName)
64 {
65   // cpy ctor
66   
67 }
68
69 //_________________________________________________________________________
70 AliAnaMaker & AliAnaMaker::operator = (const AliAnaMaker & source)
71 {
72   // assignment operator
73
74   if(this == &source)return *this;
75   ((TObject *)this)->operator=(source);
76
77   fOutputContainer = source.fOutputContainer ;
78   fAnalysisContainer = source.fAnalysisContainer ;
79   fAnaDebug = source.fAnaDebug;
80   fMakeHisto = source.fMakeHisto;
81   fMakeAOD = source.fMakeAOD;
82
83   fAODBranchName = source.fAODBranchName;
84   fAODBranch = source.fAODBranch;
85  
86   fReader = source.fReader ;
87
88   return *this;
89
90 }
91
92 //____________________________________________________________________________
93 AliAnaMaker::~AliAnaMaker() 
94 {
95   // Remove all pointers.
96
97   // Protection added in case of NULL pointers (MG)
98   if (fOutputContainer) {
99      fOutputContainer->Clear();
100      delete fOutputContainer ;
101   }   
102
103   if (fAnalysisContainer) {
104      fAnalysisContainer->Clear();
105      delete fAnalysisContainer ;
106   }   
107
108   if (fReader) delete fReader ;
109
110   if (fAODBranch) {
111     fAODBranch->Clear();
112     delete fAODBranch ;
113   }
114
115 }
116
117 //________________________________________________________________________
118 void AliAnaMaker::Init()
119 {  
120   //Init container histograms and other common variables
121
122   if(fMakeHisto){// Analysis with histograms as output on
123     
124     //Fill container with appropriate histograms
125     
126     if(!fAnalysisContainer || fAnalysisContainer->GetEntries()==0)
127       AliFatal("Analysis job list not initailized");
128
129     for(Int_t iana = 0; iana <  fAnalysisContainer->GetEntries(); iana++){
130       TList * templist =  ((AliAnaBaseClass *) fAnalysisContainer->At(iana)) -> GetCreateOutputObjects(); 
131
132       for(Int_t i = 0; i < templist->GetEntries(); i++)
133         fOutputContainer->Add(templist->At(i)) ;
134     
135     }
136   }// Analysis with histograms as output on
137 }
138
139 //____________________________________________________________________________
140 void AliAnaMaker::InitParameters()
141 {
142
143   //Init data members
144   fMakeHisto = kTRUE;
145   fMakeAOD = kTRUE; 
146   fAnaDebug = 0; // No debugging info displayed by default
147   fAODBranchName = "Photons" ;
148
149 }
150
151 //__________________________________________________________________
152 void AliAnaMaker::Print(const Option_t * opt) const
153 {
154
155   //Print some relevant parameters set for the analysis
156   if(! opt)
157     return;
158
159   printf("***** Print: %s %s ******\n", GetName(), GetTitle() ) ;
160   printf("Debug level     =     %d\n", fAnaDebug) ;
161   printf("New AOD branch  =     %s\n", fAODBranchName.Data()) ;
162   printf("Produce Histo   =     %d\n", fMakeHisto) ;
163   printf("Produce AOD     =     %d\n", fMakeAOD) ;
164
165
166
167
168 //____________________________________________________________________________
169 Bool_t AliAnaMaker::ProcessEvent(Int_t iEntry){
170   //Process analysis for this event
171   
172   if(fMakeHisto && !fOutputContainer)
173     AliFatal("Histograms not initialized");
174   
175   if(fAnaDebug >= 0 ) printf("***  Event %d   ***  \n",iEntry);
176
177   //Each event needs an empty branch
178   fAODBranch->Clear();
179   
180   //Tell the reader to fill the data in the 3 detector lists
181   fReader->FillInputEvent();
182
183   //Loop on analysis algorithms
184   if(fAnaDebug > 0 ) printf("*** Begin analysis *** \n");
185   Int_t nana = fAnalysisContainer->GetEntries() ;
186   for(Int_t iana = 0; iana <  nana; iana++){
187     
188     AliAnaBaseClass * ana =  ((AliAnaBaseClass *) fAnalysisContainer->At(iana)) ; 
189     
190     //Set reader and aod branch for each analysis
191     ana->SetReader(fReader);
192     ana->SetAODBranch(fAODBranch);
193     
194     //Make analysis, create aods in aod branch or AODCaloClusters
195     if(fMakeAOD) ana->MakeAnalysisFillAOD()  ;
196     //Make further analysis with aod branch and fill histograms
197     if(fMakeHisto) ana->MakeAnalysisFillHistograms()  ;
198     
199   }
200
201   if(fAnaDebug > 0 ) printf("*** End analysis *** \n");
202
203   fReader->ResetLists();
204   
205   return kTRUE ;
206   
207 }