New classes plus some renamed for a better user friendly interface
[u/mrichter/AliRoot.git] / PWG2 / RESONANCES / AliRsnSimpleAnalysisTaskSE.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
16 //----------------------------------------------------------------------------------
17 //  Class AliRsnSimpleAnalysisTaskSE
18 // ------------------------
19 // Reader for conversion of ESD output into the internal format
20 // used for resonance study.
21 // ---
22 // original author: A. Pulvirenti             (email: alberto.pulvirenti@ct.infn.it)
23 // ---
24 // adapted for Analysis Framework
25 // by    : R. Vernet                          (email: renaud.vernet@cern.ch)
26 //----------------------------------------------------------------------------------
27
28 #include <TH1.h>
29 #include <TH2.h>
30 #include <TChain.h>
31 #include <TROOT.h>
32 #include <TObjArray.h>
33
34 #include "AliLog.h"
35 #include "AliVEvent.h"
36 #include "AliMCEventHandler.h"
37 #include "AliInputEventHandler.h"
38 #include "AliAnalysisManager.h"
39
40 #include "AliMCEvent.h"
41
42 #include "AliRsnPairDef.h"
43 #include "AliRsnEvent.h"
44 #include "AliRsnReader.h"
45 #include "AliRsnPID.h"
46 #include "AliRsnSimpleFunction.h"
47 #include "AliRsnSimpleAnalyzer.h"
48 #include "AliRsnSimpleAnalysisTaskSE.h"
49
50 ClassImp(AliRsnSimpleAnalysisTaskSE)
51
52 //_____________________________________________________________________________
53 AliRsnSimpleAnalysisTaskSE::AliRsnSimpleAnalysisTaskSE() :
54   AliAnalysisTaskSE(),
55   fReader(0x0),
56   fPID(0x0),
57   fAnalyzer(0x0),
58   fRsnEvent(0x0),
59   fHistograms(0x0)
60 {
61 //
62 // Default constructor (not recommended)
63 //
64 }
65
66 //_____________________________________________________________________________
67 AliRsnSimpleAnalysisTaskSE::AliRsnSimpleAnalysisTaskSE(const char *name) :
68   AliAnalysisTaskSE(name),
69   fReader(0x0),
70   fPID(0x0),
71   fAnalyzer(0x0),
72   fRsnEvent(0x0),
73   fHistograms(0x0)
74 {
75 //
76 // Working constructor (recommended)
77 //
78
79     DefineOutput (1, TList::Class());
80 }
81
82 //_____________________________________________________________________________
83 void AliRsnSimpleAnalysisTaskSE::UserCreateOutputObjects()
84 {
85 //
86 // Create the output container
87 //
88
89     // check for presence of NECESSARY data-members
90     if (!fReader) {
91         AliFatal("Event reader not initialized. Impossible to continue. Aborting with fatal error.");
92         return;
93     }
94     if (!fPID) {
95         AliFatal("PID manager not initialized. Impossible to continue. Aborting with fatal error.");
96         return;
97     }
98     if (!fAnalyzer) {
99         AliFatal("Analysis manager not initialized. Impossible to continue. Aborting with fatal error.");
100         return;
101     }
102
103     // output histogram list
104     fHistograms = new TList;
105
106     // initialize analyzer
107     fAnalyzer->Init();
108
109     // store all histograms in the functions into the list
110     TObjArray *array = fAnalyzer->GetSingle();
111     AliRsnSimpleFunction *fcn;
112     TH1D *h1D;
113     TH2D *h2D;
114     if (array) {
115         TObjArrayIter iter(array);
116         while ( (fcn = (AliRsnSimpleFunction*)iter.Next()) ) {
117             h1D = fcn->GetHistogram1D();
118             h2D = fcn->GetHistogram2D();
119             if (h1D) fHistograms->AddLast(h1D);
120             if (h2D) fHistograms->AddLast(h2D);
121             
122         }
123     }
124     else {
125         AliWarning("No single-event functions in analyzer");
126     }
127     array = fAnalyzer->GetMix();
128     if (array) {
129         TObjArrayIter iter(array);
130         while ( (fcn = (AliRsnSimpleFunction*)iter.Next()) ) {
131             h1D = fcn->GetHistogram1D();
132             h2D = fcn->GetHistogram2D();
133             if (h1D) fHistograms->AddLast(h1D);
134             if (h2D) fHistograms->AddLast(h2D);
135         }
136     }
137     else {
138         AliWarning("No mixing functions in analyzer");
139     }
140 }
141
142 //_____________________________________________________________________________
143 void AliRsnSimpleAnalysisTaskSE::UserExec(Option_t */*option*/)
144 {
145 //
146 // Loops on input container to store data of all tracks.
147 // Uses the AliRsnReader methods to save them in the output.
148 //
149
150     // clear previous event
151     if (!fRsnEvent) {
152         fRsnEvent = new AliRsnEvent;
153         fRsnEvent->Init();
154     }
155     else fRsnEvent->Clear();
156
157     // read event
158     if (!fReader->Fill(fRsnEvent, fInputEvent, fMCEvent)) AliWarning("Failed reading");
159     AliInfo(Form("Collected %d tracks", fRsnEvent->GetMultiplicity()));
160     
161     // identify event if the class is available
162     if (fPID) fPID->Process(fRsnEvent);
163
164     // process event with analyzer
165     fAnalyzer->Process(fRsnEvent);
166     
167     // post histograms in slot #1
168     PostData(1, fHistograms);
169 }
170
171 //_____________________________________________________________________________
172 Bool_t AliRsnSimpleAnalysisTaskSE::Configure(const char *configFile)
173 {
174 //
175 // Configure this object using an external macro which creates
176 // all required objects and stores them in the appropriate data members
177 // Returns kFALSE if not all the required objects were created.
178 //
179
180     gROOT->LoadMacro(configFile);
181     gROOT->ProcessLine("RsnConfig()");
182     
183     fReader = (AliRsnReader*)gDirectory->Get("RsnReader");
184     fPID = (AliRsnPID*)gDirectory->Get("RsnPID");
185     fAnalyzer = (AliRsnSimpleAnalyzer*)gDirectory->Get("RsnSimpleAnalyzer");
186     
187     // check for presence of NECESSARY data-members
188     if (!fReader) {
189         AliError("Event reader not initialized. Impossible to continue. Aborting with fatal error.");
190         return kFALSE;
191     }
192     if (!fPID) {
193         AliError("PID manager not initialized. Impossible to continue. Aborting with fatal error.");
194         return kFALSE;
195     }
196     if (!fAnalyzer) {
197         AliError("Analysis manager not initialized. Impossible to continue. Aborting with fatal error.");
198         return kFALSE;
199     }
200     
201     return kTRUE;
202 }
203
204 //_____________________________________________________________________________
205 void AliRsnSimpleAnalysisTaskSE::PrintSettings()
206 {
207 //
208 // Print analysis settings
209 //
210
211     AliInfo("==== ANALYSIS TASK INFO =======================================================");
212
213     // reader
214     AliInfo(Form("Reader address, name: %x %s", fReader, fReader->GetName()));
215     switch (fReader->GetSource()) {
216         case AliRsnReader::kESD:
217             AliInfo("Reader source: kESD");
218             break;
219         case AliRsnReader::kESDTPC:
220             AliInfo("Reader source: kESDTPC");
221             break;
222         case AliRsnReader::kAOD:
223             AliInfo("Reader source: kAOD");
224             break;
225         case AliRsnReader::kMC:
226             AliInfo("Reader source: kMC");
227             break;
228         default:
229             AliInfo("Reader source not properly set");
230     }
231     AliInfo(Form("Reader->CheckSplit  = %s", (fReader->CheckSplit() ? "true" : "false")));
232     AliInfo(Form("Reader->RejectFakes = %s", (fReader->RejectFakes() ? "true" : "false")));
233     
234     // PID
235     Int_t i;
236     AliRsnPID::EType type;
237     AliInfo(Form("PID address, name: %x", fPID, fPID->GetName()));
238     for (i = 0; i < AliRsnPID::kSpecies; i++) {
239         type = (AliRsnPID::EType)i;
240         AliInfo(Form("Prior probability [%d] = %f (%s)", i, fPID->GetPriorProbability(type), AliRsnPID::ParticleName(type)));
241     }
242     AliInfo(Form("PID momentum    threshold = %f", fPID->GetMaxPt()));
243     AliInfo(Form("PID probability threshold = %f", fPID->GetMinProb()));
244     
245     // analyzer
246     AliRsnSimpleFunction *fcn;
247     AliInfo(Form("Analyzer address, name: %x", fAnalyzer, fAnalyzer->GetName()));
248     TObjArrayIter iter1(fAnalyzer->GetSingle());
249     while ( (fcn = (AliRsnSimpleFunction*)iter1.Next()) ) {
250         AliInfo(Form("Single-event function: %s [%s]", fcn->GetName(), fcn->ClassName()));
251     }
252     if (fAnalyzer->GetMix()) {
253         TObjArrayIter iter2(fAnalyzer->GetMix());
254         while ( (fcn = (AliRsnSimpleFunction*)iter2.Next()) ) {
255             AliInfo(Form("Mix function: %s [%s]", fcn->GetName(), fcn->ClassName()));
256         }
257     }
258
259     AliInfo("===============================================================================");
260 }