]> git.uio.no Git - u/mrichter/AliRoot.git/blob - HLT/global/AliHLTGlobalEsdToFlatConverterComponent.cxx
a3e8a51caeac3b6d48917aac45137018b9c7b572
[u/mrichter/AliRoot.git] / HLT / global / AliHLTGlobalEsdToFlatConverterComponent.cxx
1 //-*- Mode: C++ -*-
2 // $Id: AliHLTGlobalEsdToFlatConverterComponent.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: Steffen Weber                                         *
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    AliHLTGlobalEsdToFlatConverterComponent.cxx
19     @author  Steffen Weber
20     @brief   Component to convert ESD objects to flatESD objects
21 */
22
23 #include "TMap.h"
24 #include "TSystem.h"
25 #include "TTimeStamp.h"
26 #include "TObjString.h"
27 #include "TList.h"
28 #include "AliESDEvent.h"
29 #include "AliFlatESDEvent.h"
30 #include "AliHLTErrorGuard.h"
31 #include "AliHLTDataTypes.h"
32 #include "AliHLTGlobalEsdToFlatConverterComponent.h"
33 #include "AliHLTITSClusterDataFormat.h"
34 #include "AliHLTTPCDefinitions.h"
35 #include "TTree.h"
36 #include "AliCDBEntry.h"
37 #include "AliCDBManager.h"
38
39 using namespace std;
40
41 /** ROOT macro for the implementation of ROOT specific class methods */
42 ClassImp(AliHLTGlobalEsdToFlatConverterComponent)
43
44 /*
45  * ---------------------------------------------------------------------------------
46  *                            Constructor / Destructor
47  * ---------------------------------------------------------------------------------
48  */
49
50 // #################################################################################
51 AliHLTGlobalEsdToFlatConverterComponent::AliHLTGlobalEsdToFlatConverterComponent() :
52   AliHLTProcessor()
53   {
54   // an example component which implements the ALICE HLT processor
55   // interface and does some analysis on the input raw data
56   //
57   // see header file for class documentation
58   // or
59   // refer to README to build package
60   // or
61   // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
62   //
63   // NOTE: all helper classes should be instantiated in DoInit()
64 }
65
66 // #################################################################################
67 AliHLTGlobalEsdToFlatConverterComponent::~AliHLTGlobalEsdToFlatConverterComponent() {
68   // see header file for class documentation
69 }
70
71 /*
72  * ---------------------------------------------------------------------------------
73  * Public functions to implement AliHLTComponent's interface.
74  * These functions are required for the registration process
75  * ---------------------------------------------------------------------------------
76  */
77
78 // #################################################################################
79 const Char_t* AliHLTGlobalEsdToFlatConverterComponent::GetComponentID() { 
80   // see header file for class documentation
81   return "GlobalEsdToFlatConverster";
82 }
83
84 // #################################################################################
85 void AliHLTGlobalEsdToFlatConverterComponent::GetInputDataTypes( vector<AliHLTComponentDataType>& list) {
86   // see header file for class documentation
87   list.push_back(kAliHLTDataTypeESDObject|kAliHLTDataOriginOut);
88   list.push_back( kAliHLTDataTypeESDfriendObject|kAliHLTDataOriginOut );
89 }
90
91 // #################################################################################
92 AliHLTComponentDataType AliHLTGlobalEsdToFlatConverterComponent::GetOutputDataType() {
93   // see header file for class documentation
94   return kAliHLTDataTypeFlatESD|kAliHLTDataOriginOut;
95 }
96
97 // #################################################################################
98 void AliHLTGlobalEsdToFlatConverterComponent::GetOutputDataSize( ULong_t& constBase, Double_t& inputMultiplier ) {
99   // see header file for class documentation
100   constBase = 100000;
101   inputMultiplier = 1.0;
102 }
103
104
105 // #################################################################################
106 AliHLTComponent* AliHLTGlobalEsdToFlatConverterComponent::Spawn() {
107   // see header file for class documentation
108   return new AliHLTGlobalEsdToFlatConverterComponent;
109 }
110
111 /*
112  * ---------------------------------------------------------------------------------
113  * Protected functions to implement AliHLTComponent's interface.
114  * These functions provide initialization as well as the actual processing
115  * capabilities of the component. 
116  * ---------------------------------------------------------------------------------
117  */
118
119 // #################################################################################
120 Int_t AliHLTGlobalEsdToFlatConverterComponent::DoInit( Int_t argc, const Char_t** argv ) {
121   // see header file for class documentation
122   printf("AliHLTGlobalEsdToFlatConverterComponent::DoInit\n");
123   // see header file for class documentation
124   int iResult=0;
125   TString argument="";
126   int bMissingParam=0;
127
128   // default list of skiped ESD objects
129   TString skipObjects=
130     // "AliESDRun,"
131     // "AliESDHeader,"
132     // "AliESDZDC,"
133     "AliESDFMD,"
134     // "AliESDVZERO,"
135     // "AliESDTZERO,"
136     // "TPCVertex,"
137     // "SPDVertex,"
138     // "PrimaryVertex,"
139     // "AliMultiplicity,"
140     // "PHOSTrigger,"
141     // "EMCALTrigger,"
142     // "SPDPileupVertices,"
143     // "TrkPileupVertices,"
144     "Cascades,"
145     "Kinks,"
146     "AliRawDataErrorLogs,"
147     "AliESDACORDE";
148
149   iResult=Reconfigure(NULL, NULL);
150   TString allArgs = "";
151   for ( int i = 0; i < argc; i++ ) {
152     if ( !allArgs.IsNull() ) allArgs += " ";
153     allArgs += argv[i];
154   }
155
156   TObjArray* pTokens=allArgs.Tokenize(" ");
157   if (pTokens) {
158     for (int i=0; i<pTokens->GetEntries() && iResult>=0; i++) {
159       argument=((TObjString*)pTokens->At(i))->String(); 
160       if (argument.IsNull()) continue;
161  if (argument.Contains("-skipobject=")) {
162         argument.ReplaceAll("-skipobject=", "");
163         skipObjects=argument;
164       } else {
165         HLTError("unknown argument %s", argument.Data());
166         iResult=-EINVAL;
167         break;
168       }
169     }
170   }
171   if (bMissingParam) {
172     HLTError("missing parameter for argument %s", argument.Data());
173     iResult=-EINVAL;
174   }
175
176
177   if (iResult>=0) {
178     SetupCTPData();
179   }
180
181   return iResult;
182 }
183
184
185
186 // #################################################################################
187 Int_t AliHLTGlobalEsdToFlatConverterComponent::DoDeinit() {
188   // see header file for class documentation
189
190         
191   return 0;
192 }
193
194 // #################################################################################
195 Int_t AliHLTGlobalEsdToFlatConverterComponent::DoEvent(const AliHLTComponentEventData& /*evtData*/,
196                                                     const AliHLTComponentBlockData* /*blocks*/, 
197                                                     AliHLTComponentTriggerData& /*trigData*/,
198                                                     AliHLTUInt8_t* outputPtr, 
199                                                     AliHLTUInt32_t& size,
200                                                     AliHLTComponentBlockDataList& outputBlocks) {
201   // see header file for class documentation
202
203   printf("AliHLTGlobalEsdToFlatConverterComponent::DoEvent\n");
204   Int_t iResult=0;
205
206   // -- Only use data event
207   if (!IsDataEvent()) 
208     return 0;
209   
210   const AliESDEvent *esd;
211   
212   for ( const TObject *iter = GetFirstInputObject(kAliHLTDataTypeESDObject | kAliHLTDataOriginOut); iter != NULL; iter = GetNextInputObject() ) {
213     cout<<"Found ESD in esd test component !!!"<<endl;
214     esd = dynamic_cast<const AliESDEvent*>(iter);
215     if( esd ){
216       cout<<"N ESD tracks: "<<esd->GetNumberOfTracks()<<endl;
217                         iResult=1;
218     } else {
219       cout<<"ESD pointer is NULL "<<endl;
220     }
221   }
222
223    for ( const TObject *iter = GetFirstInputObject(kAliHLTDataTypeESDfriendObject | kAliHLTDataOriginOut); iter != NULL; iter = GetNextInputObject() ) {     
224      //fBenchmark.AddInput(pBlock->fSize);
225     cout<<"Found ESD friend in esd test component !!!"<<endl;
226     const AliESDfriend *esdFriend = dynamic_cast<const AliESDfriend*>(iter);
227     if( esdFriend ){
228       cout<<"N friend tracks: "<<esdFriend->GetNumberOfTracks()<<endl;
229     } else {
230       cout<<"ESD friend pointer is NULL "<<endl;
231     }
232   }
233   
234         
235         
236    if (iResult>=0) {            
237  
238                  
239   Bool_t useESDFriends = 0;
240  AliFlatESDEvent *flatEsd ;
241   Byte_t *mem = new Byte_t[AliFlatESDEvent::EstimateSize(const_cast<AliESDEvent*>(esd), useESDFriends)];
242
243     flatEsd = reinterpret_cast<AliFlatESDEvent*>(mem);
244     new (flatEsd) AliFlatESDEvent;
245   flatEsd->Fill(esd,useESDFriends);  
246                  
247                  
248                  
249                  
250                  
251                  
252     AliHLTComponentBlockData outBlock;
253     FillBlockData( outBlock );
254     outBlock.fOffset = size;
255     outBlock.fSize = flatEsd->GetSize();
256     outBlock.fDataType = kAliHLTDataTypeFlatESD|kAliHLTDataOriginOut;
257     outBlock.fSpecification = AliHLTTPCDefinitions::EncodeDataSpecification( 0, 35, 0, 5 );
258
259     outputBlocks.push_back( outBlock );
260       
261     size += outBlock.fSize;
262   }
263  
264  
265  
266  
267   return iResult;
268 }
269
270
271 // #################################################################################
272 Int_t AliHLTGlobalEsdToFlatConverterComponent::ReadPreprocessorValues(const Char_t* /*modules*/) {
273   // see header file for class documentation
274   ALIHLTERRORGUARD(5, "ReadPreProcessorValues not implemented for this component");
275   return 0;
276 }
277
278
279 int AliHLTGlobalEsdToFlatConverterComponent::Configure(const char* arguments)
280 {
281   // see header file for class documentation
282   int iResult=0;
283   if (!arguments) return iResult;
284
285   TString allArgs=arguments;
286   TString argument;
287   int bMissingParam=0;
288
289   TObjArray* pTokens=allArgs.Tokenize(" ");
290   if (pTokens) {
291     for (int i=0; i<pTokens->GetEntries() && iResult>=0; i++) {
292       argument=((TObjString*)pTokens->At(i))->String(); 
293       if (argument.IsNull()) continue;      
294       HLTError("unknown argument %s", argument.Data());
295       iResult=-EINVAL;
296       break;
297     }  
298     delete pTokens;
299   }
300   if (bMissingParam) {
301     HLTError("missing parameter for argument %s", argument.Data());
302     iResult=-EINVAL;
303   }
304
305   return iResult;
306 }
307
308 int AliHLTGlobalEsdToFlatConverterComponent::Reconfigure(const char* cdbEntry, const char* chainId)
309 {
310   // see header file for class documentation
311   int iResult=0;
312   const char* path=NULL;
313   const char* defaultNotify="";
314   if (cdbEntry) {
315     path=cdbEntry;
316     defaultNotify=" (default)";
317   }
318   if (path) {
319     HLTInfo("reconfigure from entry %s%s, chain id %s", path, defaultNotify,(chainId!=NULL && chainId[0]!=0)?chainId:"<none>");
320     AliCDBEntry *pEntry = AliCDBManager::Instance()->Get(path/*,GetRunNo()*/);
321     if (pEntry) {
322       TObjString* pString=dynamic_cast<TObjString*>(pEntry->GetObject());
323       if (pString) {
324         HLTInfo("received configuration object string: \'%s\'", pString->String().Data());
325         iResult=Configure(pString->String().Data());
326       } else {
327         HLTError("configuration object \"%s\" has wrong type, required TObjString", path);
328       }
329     } else {
330       HLTError("can not fetch object \"%s\" from CDB", path);
331     }
332   }
333   
334   return iResult;
335 }