Adding analysis for Flat ESD case
[u/mrichter/AliRoot.git] / HLT / global / physics / AliHLTFlatAnaManagerComponent.cxx
1 //-*- Mode: C++ -*-
2 // $Id: AliHLTFlatAnaManagerComponent.cxx $
3 /**************************************************************************
4  * This file is property of and copyright by the ALICE HLT Project        * 
5  * ALICE Experiment at CERN, All rights reserved.                         *
6  *                                                                        *
7  * Primary Authors: David Rohr, Jens Wiechula, C. Zampolli                *
8  *                                                                        *
9  * Permission to use, copy, modify and distribute this software and its   *
10  * documentation strictly for non-commercial purposes is hereby granted   *
11  * without fee, provided that the above copyright notice appears in all   *
12  * copies and that both the copyright notice and this permission notice   *
13  * appear in the supporting documentation. The authors make no claims     *
14  * about the suitability of this software for any purpose. It is          *
15  * provided "as is" without express or implied warranty.                  *
16  **************************************************************************/
17
18 /** @file    AliHLTFlatAnaManagerComponent.cxx
19     @author  David Rohr, Jens Wiechula, C. Zampolli
20     @brief   Component for Testing Analysis Manager inside HLT component
21 */
22
23 #include "TMap.h"
24 #include "TSystem.h"
25 #include "TTimeStamp.h"
26 #include "TObjString.h"
27 #include "TH1F.h"
28 #include "TList.h"
29 #include "AliESDtrackCuts.h"
30 #include "AliFlatESDEvent.h"
31 #include "AliESDfriend.h"
32 #include "AliHLTErrorGuard.h"
33 #include "AliHLTDataTypes.h"
34 #include "AliHLTFlatAnaManagerComponent.h"
35 #include "AliHLTITSClusterDataFormat.h"
36 #include "AliAnalysisManager.h"
37 #include "AliHLTTestInputHandler.h"
38 #include "AliAnalysisTaskPt.h"
39 #include "AliAnalysisDataContainer.h"
40 #include "TTree.h"
41
42 using namespace std;
43
44 /** ROOT macro for the implementation of ROOT specific class methods */
45 ClassImp(AliHLTFlatAnaManagerComponent)
46
47 /*
48  * ---------------------------------------------------------------------------------
49  *                            Constructor / Destructor
50  * ---------------------------------------------------------------------------------
51  */
52
53 // #################################################################################
54 AliHLTFlatAnaManagerComponent::AliHLTFlatAnaManagerComponent() :
55   AliHLTProcessor(),
56   fUID(0),
57   fAnalysisManager(NULL),
58   fInputHandler(NULL){
59   // an example component which implements the ALICE HLT processor
60   // interface and does some analysis on the input raw data
61   //
62   // see header file for class documentation
63   // or
64   // refer to README to build package
65   // or
66   // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
67   //
68   // NOTE: all helper classes should be instantiated in DoInit()
69 }
70
71 // #################################################################################
72 AliHLTFlatAnaManagerComponent::~AliHLTFlatAnaManagerComponent() {
73   // see header file for class documentation
74 }
75
76 /*
77  * ---------------------------------------------------------------------------------
78  * Public functions to implement AliHLTComponent's interface.
79  * These functions are required for the registration process
80  * ---------------------------------------------------------------------------------
81  */
82
83 // #################################################################################
84 const Char_t* AliHLTFlatAnaManagerComponent::GetComponentID() { 
85   // see header file for class documentation
86   return "FlatAnaManagerComponent";
87 }
88
89 // #################################################################################
90 void AliHLTFlatAnaManagerComponent::GetInputDataTypes( vector<AliHLTComponentDataType>& list) {
91   // see header file for class documentation
92   list.push_back(kAliHLTDataTypeFlatESD|kAliHLTDataOriginAny);
93   //  list.push_back(kAliHLTDataTypeESDfriendObject|kAliHLTDataOriginAny);
94 }
95
96 // #################################################################################
97 AliHLTComponentDataType AliHLTFlatAnaManagerComponent::GetOutputDataType() {
98   // see header file for class documentation
99   return kAliHLTDataTypeTObject|kAliHLTDataOriginHLT;
100 }
101
102 // #################################################################################
103 void AliHLTFlatAnaManagerComponent::GetOutputDataSize( ULong_t& constBase, Double_t& inputMultiplier ) {
104   // see header file for class documentation
105   constBase = 100000;
106   inputMultiplier = 0.5;
107 }
108
109 // #################################################################################
110 void AliHLTFlatAnaManagerComponent::GetOCDBObjectDescription( TMap* const targetMap) {
111   // see header file for class documentation
112
113   if (!targetMap) return;
114   /*  targetMap->Add(new TObjString("HLT/ConfigGlobal/MultiplicityCorrelations"),
115                  new TObjString("configuration object"));
116   targetMap->Add(new TObjString("HLT/ConfigGlobal/MultiplicityCorrelationsCentrality"),
117                  new TObjString("centrality configuration object"));
118   */
119   return;
120 }
121
122 // #################################################################################
123 AliHLTComponent* AliHLTFlatAnaManagerComponent::Spawn() {
124   // see header file for class documentation
125   return new AliHLTFlatAnaManagerComponent;
126 }
127
128 /*
129  * ---------------------------------------------------------------------------------
130  * Protected functions to implement AliHLTComponent's interface.
131  * These functions provide initialization as well as the actual processing
132  * capabilities of the component. 
133  * ---------------------------------------------------------------------------------
134  */
135
136 // #################################################################################
137 Int_t AliHLTFlatAnaManagerComponent::DoInit( Int_t /*argc*/, const Char_t** /*argv*/ ) {
138   // see header file for class documentation
139   printf("AliHLTFlatAnaManagerComponent::DoInit\n");
140
141   Int_t iResult=0;
142
143   Printf("----> AliHLTFlatAnaManagerComponent::DoInit"); 
144   fAnalysisManager = new AliAnalysisManager;
145   fInputHandler    = new AliHLTTestInputHandler;
146   fAnalysisManager->SetInputEventHandler(fInputHandler);
147   fAnalysisManager->SetExternalLoop(kTRUE); 
148
149   AliAnalysisTaskPt *task = new AliAnalysisTaskPt("TaskPt");
150   task->SetUseFriends(kFALSE);
151   fAnalysisManager->AddTask(task);
152   AliAnalysisDataContainer *cinput  = fAnalysisManager->GetCommonInputContainer();
153   Printf("Defining output file");
154   AliAnalysisDataContainer *coutput1 = fAnalysisManager->CreateContainer("pt", TList::Class(),
155       AliAnalysisManager::kOutputContainer, "Pt.ESD.root");
156
157   //           connect containers
158   Printf("---> Connecting input...");
159   fAnalysisManager->ConnectInput  (task,  0, cinput ); 
160   Printf("---> ...connected.");
161   Printf("---> Connecting output...");
162   fAnalysisManager->ConnectOutput (task,  0, coutput1);
163   Printf("---> ...connected.");
164
165   Printf("----> Calling InitAnalysis");
166   fAnalysisManager->InitAnalysis();
167   Printf("----> Done.");
168   Printf("----> Calling StartAnalysis");
169   fAnalysisManager->StartAnalysis("local", (TTree*)new TTree);
170   //fAnalysisManager->StartAnalysis("local", (TTree*)NULL);
171   Printf("----> Done.");
172
173   return iResult;
174 }
175
176
177
178 // #################################################################################
179 Int_t AliHLTFlatAnaManagerComponent::DoDeinit() {
180   // see header file for class documentation
181
182   fUID = 0;
183   fAnalysisManager->SetSkipTerminate(kTRUE);
184   fAnalysisManager->Terminate();
185
186   delete fAnalysisManager;
187
188   return 0;
189 }
190
191 // #################################################################################
192 Int_t AliHLTFlatAnaManagerComponent::DoEvent(const AliHLTComponentEventData& evtData,
193                                         AliHLTComponentTriggerData& /*trigData*/) {
194   // see header file for class documentation
195
196   printf("AliHLTFlatAnaManagerComponent::DoEvent\n");
197   Int_t iResult=0;
198
199   // -- Only use data event
200   if (!IsDataEvent()) {
201     Printf("-------> no data event");
202     return 0;
203   }
204   
205   if( fUID == 0 ){
206     TTimeStamp t;
207     fUID = ( gSystem->GetPid() + t.GetNanoSec())*10 + evtData.fEventID;
208   }
209   
210   Bool_t isESDfound = kFALSE;
211   // -- Get ESD object
212   // -------------------
213   AliFlatESDEvent *esdEvent = NULL;
214   AliESDfriend *esdFriend = NULL;
215   Int_t dataBlockIndex = 0;
216   for ( const AliHLTComponentBlockData *iter = GetFirstInputBlock(kAliHLTDataTypeFlatESD); iter != NULL; iter = GetNextInputBlock() ) {
217     if(iter->fDataType != kAliHLTDataTypeFlatESD) {
218       Printf("Data type of block is not flatESD");
219       continue;
220     }
221     dataBlockIndex++;
222     Printf("----> dataBlockIndex = %d", dataBlockIndex);
223     //iter->Print();
224     esdEvent = (AliFlatESDEvent*)(iter->fPtr);
225     if( !esdEvent ){ 
226       HLTWarning("Wrong ESDEvent object received");
227       Printf("Current object is not ESD event");
228       iResult = -1;
229       continue;
230     }
231     else isESDfound = kTRUE;
232     //    esdEvent->GetStdContent();
233   }
234   if (!isESDfound) {
235     Printf("-------> no ESD found!!");
236     return 0;
237   }
238   printf("----> ESDEvent %p has %d tracks: \n", esdEvent, esdEvent->GetNumberOfTracks());
239
240   /* // no friends for teh time being... 
241   for ( const TObject *iter = GetFirstInputObject(kAliHLTDataTypeESDfriendObject); iter != NULL; iter = GetNextInputObject() ) {
242     esdFriend = dynamic_cast<AliESDfriend*>(const_cast<TObject*>( iter ) );
243     if( !esdFriend ){ 
244       HLTWarning("Wrong ESDFriend object received");
245       iResult = -1;
246       continue;
247     }
248   }
249   printf("----> ESDFriend %p has %d tracks: \n", esdFriend, esdFriend->GetNumberOfTracks());
250   */
251   fAnalysisManager->InitInputData(esdEvent, esdFriend);
252   //  fInputHandler->BeginEvent(0);
253   fAnalysisManager->ExecAnalysis();
254   fInputHandler->FinishEvent();
255
256
257   // -- Send histlist
258 //  PushBack(dynamic_cast<TObject*>(fCorrObj->GetHistList()),
259 //         kAliHLTDataTypeTObject|kAliHLTDataOriginHLT,fUID);
260  
261   return iResult;
262 }
263
264 // #################################################################################
265 Int_t AliHLTFlatAnaManagerComponent::Reconfigure(const Char_t* cdbEntry, const Char_t* chainId) {
266   // see header file for class documentation
267
268   Int_t iResult=0;
269   TString cdbPath;
270   if (cdbEntry) {
271     cdbPath=cdbEntry;
272   } else {
273     cdbPath="HLT/ConfigGlobal/";
274     cdbPath+=GetComponentID();
275   }
276
277   TString strcdb = "";
278   if (!cdbEntry) strcdb = "default";
279   Printf("reconfigure '%s' from entry %s%s", chainId, cdbPath.Data(), strcdb.Data());
280   //AliInfoClass(Form("reconfigure '%s' from entry %s%s", chainId, cdbPath.Data(), cdbEntry?"":" (default)"));
281   iResult=ConfigureFromCDBTObjString(cdbPath);
282
283   return iResult;
284 }
285
286 // #################################################################################
287 Int_t AliHLTFlatAnaManagerComponent::ReadPreprocessorValues(const Char_t* /*modules*/) {
288   // see header file for class documentation
289   ALIHLTERRORGUARD(5, "ReadPreProcessorValues not implemented for this component");
290   return 0;
291 }
292