3bfe02325660ee8c1aaa650584fc755700782581
[u/mrichter/AliRoot.git] / PWG2 / RESONANCES / AliRsnReaderTask.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 AliRsnReaderTask
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 <Riostream.h>
29
30 #include "AliLog.h"
31
32 #include "AliAnalysisManager.h"
33 #include "AliMCEventHandler.h"
34 #include "AliMCEvent.h"
35 #include "AliESDInputHandler.h"
36 #include "AliAODInputHandler.h"
37 #include "AliAODHandler.h"
38
39 #include "AliRsnEvent.h"
40 #include "AliRsnReaderTask.h"
41
42 ClassImp(AliRsnReaderTask)
43
44 //_____________________________________________________________________________
45 AliRsnReaderTask::AliRsnReaderTask(ESource source) :
46   AliAnalysisTaskSE(),
47   fSource(source),
48   fReader(0x0),
49   fPID(0x0),
50   fRsnEvents(0x0)
51 {
52 //=========================================================
53 // Default constructor (not recommended)
54 //=========================================================
55 }
56
57 //_____________________________________________________________________________
58 AliRsnReaderTask::AliRsnReaderTask(const char *name, ESource source) : 
59   AliAnalysisTaskSE(name),
60   fSource(source),
61   fReader(0x0),
62   fPID(0x0),
63   fRsnEvents(0x0)
64 {
65 //=========================================================
66 // Working constructor (recommended)
67 //=========================================================
68 }
69
70 //_____________________________________________________________________________
71 AliRsnReaderTask::AliRsnReaderTask(const AliRsnReaderTask& obj) :
72   AliAnalysisTaskSE(obj),
73   fSource(obj.fSource),
74   fReader(obj.fReader),
75   fPID(obj.fPID),
76   fRsnEvents(0x0)
77 {
78 //=========================================================
79 // Copy constructor (not recommended)
80 //=========================================================
81 }
82
83 //_____________________________________________________________________________
84 AliRsnReaderTask& AliRsnReaderTask::operator=(const AliRsnReaderTask& /*obj*/) 
85 {
86 //=========================================================
87 // Assignment operator (not recommended)
88 //=========================================================
89
90     AliInfo("Not implemented. Avoid using the assignment operator");
91         return *this;
92 }
93
94 //_____________________________________________________________________________
95 void AliRsnReaderTask::UserCreateOutputObjects()
96 {
97 //=========================================================
98 // Create the output container
99 //=========================================================
100
101     AliDebug(1, "Creating USER output objects");
102     fRsnEvents = new TClonesArray("AliRsnEvent", 0);
103     fRsnEvents->SetName("AliRsnEvents");
104     AddAODBranch("TClonesArray", fRsnEvents);
105 }
106
107 //_____________________________________________________________________________
108 void AliRsnReaderTask::Init()
109 {
110 //=========================================================
111 // Initialization
112 //=========================================================
113
114     AliDebug(1, "Initializing");
115 }
116
117 //_____________________________________________________________________________
118 void AliRsnReaderTask::UserExec(Option_t */*option*/)
119 {
120 //=========================================================
121 // Loops on input container to store data of all tracks.
122 // Uses the AliRsnReader methods to save them in the output.
123 //=========================================================
124
125     // static counter
126     static Int_t ientry = 0;
127     AliInfo(Form("Reading event %d", ++ientry));
128     
129     // clear previous sample
130     fRsnEvents->Clear();
131     
132     // check for existence of reader, otherwise abort
133     if (!fReader) {
134         AliError("Event reader not initialized. Impossible to continue");
135         return;
136     }
137     if (!fPID) {
138         AliError("PID manager not initialized. Impossible to continue");
139         return;
140     }
141     
142
143         // get MC reference event
144         AliMCEventHandler* mcHandler = (AliMCEventHandler*)((AliAnalysisManager::GetAnalysisManager())->GetMCtruthEventHandler());
145         AliMCEvent *mcEvent = 0x0;
146         if (mcHandler) mcEvent = mcHandler->MCEvent();
147         
148         // work-flow variables
149         Bool_t successRead;
150         Int_t  nextIndex = fRsnEvents->GetEntries();
151         TClonesArray &array = *fRsnEvents;
152     AliRsnEvent *event = new(array[nextIndex]) AliRsnEvent;
153     if (!event) {
154         AliError("Problem occurred while creating new AliRsnEvent object. Aborting");
155         return;
156     }
157     event->Init();
158     AliESDInputHandler *handlerESD;
159     AliAODInputHandler *handlerAOD;
160     AliESDEvent *esd;
161     AliAODEvent *aod;
162         
163         // read source event according to reader settings
164         switch (fSource) {
165         case kESD:  // read from ESD event
166             handlerESD = dynamic_cast<AliESDInputHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
167             if (!handlerESD) {
168                 AliError("Source set to 'ESD' but ESD handler not initialized");
169                 return;
170             }
171             esd = handlerESD->GetEvent();
172             if (!esd) {
173                 AliError("Source set to 'ESD' but ESD event not found in handler");
174                 return;
175             }
176             if (!mcEvent) AliWarning("MC info not present");
177             successRead = fReader->FillFromESD(event, esd, mcEvent);
178             break;
179         case kAOD:  // read from AOD event
180             handlerAOD = dynamic_cast<AliAODInputHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
181             if (!handlerAOD) {
182                 AliError("Source set to 'AOD' but AOD handler not initialized");
183                 return;
184             }
185             aod = handlerAOD->GetEvent();
186             if (!aod) {
187                 AliError("Source set to 'AOD' but AOD event not found in handler");
188                 return;
189             }
190             if (!mcEvent) AliWarning("MC info not present");
191             successRead = fReader->FillFromAOD(event, aod, mcEvent);
192             break;
193         case kMC: // read from MC truth only
194             if (!mcEvent) {
195                 AliError("Required usage of MC event for reading. Not possible without MC info. Impossible to continue");
196                 return;
197             }
198             successRead = fReader->FillFromMC(event, mcEvent);
199             break;
200         default: // unrecognized option
201             AliError("Source flag not properly set");
202             return;
203     }
204     if (!successRead) {
205         array.RemoveAt(nextIndex);
206         return;
207     }
208     
209     // if the event reading is successful, perform particle identification
210     if (!fPID->Identify(event)) AliWarning(Form("Failed PID for event %d", ientry));
211     AliInfo(Form("Event %d: collected %d tracks", ientry, event->GetMultiplicity()));
212 }
213
214 //_____________________________________________________________________________
215 void AliRsnReaderTask::Terminate(Option_t */*option*/)
216 {
217 //=========================================================
218 // Terminate analysis
219 //=========================================================
220
221     AliDebug(1, "Terminating");
222 }