f777d11063fed5a4df213cd14533533655748374
[u/mrichter/AliRoot.git] / PWG2 / FLOW / AliAnalysisTaskScalarProduct.cxx
1 /*************************************************************************
2 * Copyright(c) 1998-2008, 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 #include "Riostream.h" //needed as include
17 #include "TChain.h"
18 #include "TTree.h"
19 #include "TFile.h" //needed as include
20 #include "TList.h"
21
22
23 class AliAnalysisTask;
24 #include "AliAnalysisManager.h"
25
26 #include "AliESDEvent.h"
27 #include "AliESDInputHandler.h"
28
29 #include "AliAODEvent.h"
30 #include "AliAODInputHandler.h"
31
32 #include "AliMCEventHandler.h"
33 #include "AliMCEvent.h"
34
35 #include "AliAnalysisTaskScalarProduct.h"
36 #include "AliFlowEventSimpleMaker.h"
37 #include "AliFlowAnalysisWithScalarProduct.h"
38
39 // AliAnalysisTaskScalarProduct:
40 //
41 // analysis task for Scalar Product Method
42 //
43 // Author: Naomi van der Kolk (kolk@nikhef.nl)
44
45 ClassImp(AliAnalysisTaskScalarProduct)
46
47 //________________________________________________________________________
48 AliAnalysisTaskScalarProduct::AliAnalysisTaskScalarProduct(const char *name) : 
49   AliAnalysisTask(name, ""), 
50   fESD(NULL),
51   fAOD(NULL),
52   fSP(NULL),
53   fEventMaker(NULL),
54   fAnalysisType("ESD"),
55   fListHistos(NULL)
56 {
57   // Constructor
58   cout<<"AliAnalysisTaskScalarProduct::AliAnalysisTaskScalarProduct(const char *name)"<<endl;
59
60   // Define input and output slots here
61   // Input slot #0 works with a TChain
62   DefineInput(0, TChain::Class());
63   // Output slot #0 writes into a TList container
64   DefineOutput(0, TList::Class());  
65
66  //event maker
67   fEventMaker = new AliFlowEventSimpleMaker();
68   //Analyser
69   fSP  = new AliFlowAnalysisWithScalarProduct() ;
70   fSP-> Init();
71 }
72
73 //________________________________________________________________________
74 void AliAnalysisTaskScalarProduct::ConnectInputData(Option_t *) 
75 {
76   // Connect ESD or AOD here
77   // Called once
78   cout<<"AliAnalysisTaskScalarProduct::ConnectInputData(Option_t *)"<<endl;
79
80   TTree* tree = dynamic_cast<TTree*> (GetInputData(0));
81   if (!tree) {
82     Printf("ERROR: Could not read chain from input slot 0");
83   } else {
84     // Disable all branches and enable only the needed ones
85     if (fAnalysisType == "MC") {
86       cout<<"!!!!!reading MC kinematics only"<<endl;
87       // we want to process only MC
88       tree->SetBranchStatus("*", kFALSE);
89
90       AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
91
92       if (!esdH) {
93         Printf("ERROR: Could not get ESDInputHandler");
94       } else {
95         fESD = esdH->GetEvent();
96       }
97     }
98     else if (fAnalysisType == "ESD") {
99       cout<<"!!!!!reading the ESD only"<<endl;
100       tree->SetBranchStatus("*", kFALSE);
101       tree->SetBranchStatus("Tracks.*", kTRUE);
102
103       AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
104
105       if (!esdH) {
106         Printf("ERROR: Could not get ESDInputHandler");
107       } else
108         fESD = esdH->GetEvent();
109     }
110     else if (fAnalysisType == "AOD") {
111       cout<<"!!!!!reading the AOD only"<<endl;
112       AliAODInputHandler *aodH = dynamic_cast<AliAODInputHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
113
114       if (!aodH) {
115         Printf("ERROR: Could not get AODInputHandler");
116       }
117       else {
118         fAOD = aodH->GetEvent();
119       }
120     }
121     else {
122       Printf("!!!!!Wrong analysis type: Only ESD, AOD and MC types are allowed!");
123       exit(1);
124       
125     }
126   }
127 }
128
129 //________________________________________________________________________
130 void AliAnalysisTaskScalarProduct::CreateOutputObjects() 
131 {
132   // Called once
133   cout<<"AliAnalysisTaskScalarProduct::CreateOutputObjects()"<<endl;
134   
135
136   if (fSP->GetHistList()) {
137         fSP->GetHistList()->Print();
138 //      *fListHistos = new TList();
139         fListHistos = fSP->GetHistList();
140   }
141   else {Printf("ERROR: Could not retrieve histogram list"); }
142 }
143
144 //________________________________________________________________________
145 void AliAnalysisTaskScalarProduct::Exec(Option_t *) 
146 {
147   // Main loop
148   // Called for each event
149
150   
151   // Process MC truth, therefore we receive the AliAnalysisManager and ask it for the AliMCEventHandler
152   // This handler can return the current MC event
153
154   AliMCEventHandler* eventHandler = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
155   if (!eventHandler) {
156     Printf("ERROR: Could not retrieve MC event handler");
157     return;
158   }
159
160   AliMCEvent* mcEvent = eventHandler->MCEvent();
161   if (!mcEvent) {
162     Printf("ERROR: Could not retrieve MC event");
163     return;
164   }
165
166   Printf("MC particles: %d", mcEvent->GetNumberOfTracks());
167       
168   if (fAnalysisType == "MC") {
169     // analysis 
170     AliFlowEventSimple* fEvent = fEventMaker->FillTracks(mcEvent);
171     fSP->Make(fEvent);
172
173     delete fEvent;
174   }
175   else if (fAnalysisType == "ESD") {
176     if (!fESD) {
177       Printf("ERROR: fESD not available");
178       return;
179     }
180     Printf("There are %d tracks in this event", fESD->GetNumberOfTracks());
181     
182     // analysis 
183     AliFlowEventSimple* fEvent = fEventMaker->FillTracks(fESD);
184     fSP->Make(fEvent);
185     delete fEvent;
186   }
187   else if (fAnalysisType == "AOD") {
188     if (!fAOD) {
189       Printf("ERROR: fAOD not available");
190       return;
191     }
192     Printf("There are %d tracks in this event", fAOD->GetNumberOfTracks());
193
194     // analysis 
195     AliFlowEventSimple* fEvent = fEventMaker->FillTracks(fAOD);
196     fSP->Make(fEvent);
197     delete fEvent;
198   }
199
200   PostData(0,fListHistos);
201 }      
202
203 //________________________________________________________________________
204 void AliAnalysisTaskScalarProduct::Terminate(Option_t *) 
205 {
206   // Called once at the end of the query
207   fSP->Finish();
208   PostData(0,fListHistos);
209
210   delete fSP;
211   delete fEventMaker;
212 }